[artifactory] 04/08: New upstream jfrog-artifactory-oss-5.2.1.zip

Alastair McKinstry mckinstry at moszumanska.debian.org
Tue Aug 29 11:22:00 UTC 2017


This is an automated email from the git hooks/post-receive script.

mckinstry pushed a commit to branch debian/master
in repository artifactory.

commit 98552b22030a6bba54a2c37246a17e21ecf3d5ae
Author: Alastair McKinstry <mckinstry at debian.org>
Date:   Tue May 9 17:07:30 2017 +0100

    New upstream jfrog-artifactory-oss-5.2.1.zip
---
 COPYING.AFFERO                                     |  112 +
 .../src/main/install/README.txt => README.txt      |    0
 Third-Parties-Usage-About-Box.html                 | 1043 +++++
 backend/core/pom.xml                               |  251 --
 backend/core/src/main/images/artifactory.odg       |  Bin 16396 -> 0 bytes
 backend/core/src/main/images/artifactory.png       |  Bin 576698 -> 0 bytes
 .../java/org/artifactory/addon/CoreAddonsImpl.java | 1324 ------
 .../main/java/org/artifactory/addon/HaAddon.java   |   49 -
 .../org/artifactory/addon/LayoutsCoreAddon.java    |   54 -
 .../java/org/artifactory/addon/LdapGroupAddon.java |   71 -
 .../java/org/artifactory/addon/NuGetAddon.java     |  128 -
 .../org/artifactory/addon/PropertiesAddon.java     |   91 -
 .../java/org/artifactory/addon/RestCoreAddon.java  |   62 -
 .../java/org/artifactory/addon/VagrantAddon.java   |   25 -
 .../java/org/artifactory/addon/WebstartAddon.java  |   53 -
 .../artifactory/addon/nuget/NuGetProperties.java   |   55 -
 .../addon/plugin/PluginsAddonDefaultImpl.java      |  103 -
 .../addon/plugin/build/AfterBuildSaveAction.java   |   29 -
 .../addon/plugin/build/BeforeBuildSaveAction.java  |   29 -
 .../addon/plugin/download/AfterDownloadAction.java |   30 -
 .../plugin/download/AfterDownloadErrorAction.java  |   29 -
 .../plugin/download/AfterRemoteDownloadAction.java |   30 -
 .../plugin/download/AltRemoteContentAction.java    |   29 -
 .../addon/plugin/download/AltRemotePathAction.java |   29 -
 .../addon/plugin/download/AltResponseAction.java   |   30 -
 .../plugin/download/BeforeDownloadAction.java      |   30 -
 .../download/BeforeDownloadRequestAction.java      |   16 -
 .../download/BeforeRemoteDownloadAction.java       |   30 -
 .../addon/plugin/download/DownloadCtx.java         |   51 -
 .../artifactory/addon/plugin/download/PathCtx.java |   32 -
 .../addon/plugin/execution/ExecuteAction.java      |   29 -
 .../replication/BeforeDeleteReplicationAction.java |   30 -
 .../BeforeDirectoryReplicationAction.java          |   30 -
 .../replication/BeforeFileReplicationAction.java   |   30 -
 .../BeforePropertyReplicationAction.java           |   30 -
 .../addon/plugin/replication/ReplicationCtx.java   |   35 -
 .../addon/plugin/storage/AfterCopyAction.java      |   31 -
 .../addon/plugin/storage/AfterCreateAction.java    |   29 -
 .../addon/plugin/storage/AfterDeleteAction.java    |   29 -
 .../addon/plugin/storage/AfterMoveAction.java      |   31 -
 .../plugin/storage/AfterPropertyCreateAction.java  |   29 -
 .../plugin/storage/AfterPropertyDeleteAction.java  |   29 -
 .../addon/plugin/storage/BeforeCopyAction.java     |   31 -
 .../addon/plugin/storage/BeforeCreateAction.java   |   29 -
 .../addon/plugin/storage/BeforeDeleteAction.java   |   29 -
 .../addon/plugin/storage/BeforeMoveAction.java     |   31 -
 .../plugin/storage/BeforePropertyCreateAction.java |   29 -
 .../plugin/storage/BeforePropertyDeleteAction.java |   29 -
 .../ArtifactoryAuthenticationProviderBase.java     |  106 -
 .../java/org/artifactory/backup/BackupJob.java     |  116 -
 .../org/artifactory/backup/BackupServiceImpl.java  |  431 --
 .../artifactory/backup/InternalBackupService.java  |   66 -
 .../backup/SystemBackupPauseCallback.java          |   75 -
 .../artifactory/bintray/BintrayServiceImpl.java    | 1490 -------
 .../artifactory/bintray/BintrayTokenResponse.java  |   39 -
 .../distribution/DistributionServiceImpl.java      |  524 ---
 .../token/BintrayOAuthTokenRefresher.java          |  101 -
 .../distribution/util/DistributionUtils.java       |  290 --
 .../org/artifactory/build/BaseBuildPromoter.java   |  197 -
 .../artifactory/build/BuildPromotionHelper.java    |  183 -
 .../org/artifactory/build/BuildServiceImpl.java    | 1113 -----
 .../org/artifactory/build/BuildServiceUtils.java   |  190 -
 .../artifactory/build/DetailedBuildRunImpl.java    |  169 -
 .../artifactory/build/InternalBuildService.java    |  126 -
 .../config/CentralConfigServiceImpl.java           |  451 --
 .../config/ConfigurationChangesInterceptor.java    |   31 -
 .../config/ConfigurationChangesInterceptors.java   |   28 -
 .../ConfigurationChangesInterceptorsImpl.java      |   43 -
 .../config/InternalCentralConfigService.java       |   29 -
 .../download/FolderArchiveStreamer.java            |  159 -
 .../download/FolderDownloadServiceImpl.java        |  229 -
 .../download/InternalFolderDownloadService.java    |   28 -
 .../artifactory/engine/DownloadServiceImpl.java    |  626 ---
 .../engine/InternalDownloadService.java            |   30 -
 .../artifactory/engine/InternalUploadService.java  |   50 -
 .../engine/SuccessfulDeploymentResponseHelper.java |  149 -
 .../org/artifactory/engine/UploadServiceImpl.java  |  742 ----
 .../main/java/org/artifactory/ivy/IvyParser.java   |   57 -
 .../java/org/artifactory/ivy/IvyServiceImpl.java   |   85 -
 .../layout/EncryptConfigurationInterceptor.java    |  180 -
 .../LayoutConfigurationChangesInterceptor.java     |   40 -
 ...epositoriesConfigurationChangesInterceptor.java |   64 -
 .../UserLockPolicyConfigurationInterceptor.java    |   47 -
 .../artifactory/logging/LoggingServiceImpl.java    |   90 -
 .../java/org/artifactory/mail/MailServiceImpl.java |  235 -
 .../maven/AbstractMetadataCalculator.java          |   64 -
 .../artifactory/maven/MavenMetadataCalculator.java |  468 --
 .../maven/MavenMetadataServiceImpl.java            |  141 -
 .../maven/MavenPluginsMetadataCalculator.java      |  168 -
 .../TransferProgressReportingInputStream.java      |   71 -
 .../main/java/org/artifactory/maven/WorkQueue.java |   95 -
 .../index/ArtifactoryArtifactContextProducer.java  |  161 -
 .../maven/index/ArtifactoryContentScanner.java     |  135 -
 .../maven/index/InternalMavenIndexerService.java   |   37 -
 .../artifactory/maven/index/MavenIndexManager.java |  306 --
 .../artifactory/maven/index/MavenIndexerJob.java   |   59 -
 .../maven/index/MavenIndexerRunSettings.java       |   64 -
 .../maven/index/MavenIndexerServiceImpl.java       |  392 --
 .../org/artifactory/maven/index/RepoIndexer.java   |  268 --
 .../maven/index/SimpleArtifactPackagingMapper.java |   73 -
 .../creator/VfsJarFileContentsIndexCreator.java    |   69 -
 .../VfsMavenArchetypeArtifactInfoIndexCreator.java |   76 -
 .../VfsMavenPluginArtifactInfoIndexCreator.java    |   92 -
 .../VfsMinimalArtifactInfoIndexCreator.java        |  152 -
 .../maven/index/locator/ArtifactoryLocator.java    |   22 -
 .../maven/index/locator/ExtensionBasedLocator.java |   53 -
 .../maven/index/locator/MainArtifactLocator.java   |   93 -
 .../maven/index/locator/MetadataLocator.java       |   34 -
 .../maven/index/locator/PomLocator.java            |   34 -
 .../snapshot/BuildNumberSnapshotComparator.java    |   54 -
 .../maven/snapshot/SnapshotComparator.java         |   20 -
 .../snapshot/TimestampSnapshotComparator.java      |   69 -
 ...CreationDateMavenMetadataVersionComparator.java |   36 -
 .../versioning/MavenMetadataVersionComparator.java |   32 -
 .../maven/versioning/MavenVersionComparator.java   |   42 -
 .../VersionNameMavenMetadataVersionComparator.java |   46 -
 .../message/ArtifactoryUpdatesServiceImpl.java     |  132 -
 .../java/org/artifactory/post/TimeRandomizer.java  |   40 -
 .../org/artifactory/post/jobs/CallHomeJob.java     |   79 -
 .../post/providers/features/CallHomeFeature.java   |   15 -
 .../providers/features/RepositoriesFeature.java    |  159 -
 .../post/providers/features/SecurityFeature.java   |  195 -
 .../artifactory/post/services/CallHomeService.java |  187 -
 .../properties/PropertiesServiceImpl.java          |  393 --
 .../repo/ArtifactoryStandardUrlResolver.java       |   56 -
 .../org/artifactory/repo/DistributionRepo.java     |  619 ---
 .../artifactory/repo/EagerResourcesDownloader.java |   57 -
 .../main/java/org/artifactory/repo/HttpRepo.java   | 1174 -----
 .../java/org/artifactory/repo/LocalCacheRepo.java  |   41 -
 .../main/java/org/artifactory/repo/LocalRepo.java  |   49 -
 .../main/java/org/artifactory/repo/RealRepo.java   |   52 -
 .../java/org/artifactory/repo/RealRepoBase.java    |  122 -
 .../main/java/org/artifactory/repo/RemoteRepo.java |  118 -
 .../java/org/artifactory/repo/RemoteRepoBase.java  | 1338 ------
 .../src/main/java/org/artifactory/repo/Repo.java   |   89 -
 .../main/java/org/artifactory/repo/RepoBase.java   |  221 -
 .../java/org/artifactory/repo/RepoRepoPath.java    |   61 -
 .../java/org/artifactory/repo/StoringRepo.java     |   54 -
 .../repo/cache/expirable/CacheExpirable.java       |   41 -
 .../repo/cache/expirable/CacheExpiry.java          |   27 -
 .../repo/cache/expirable/CacheExpiryImpl.java      |  100 -
 .../repo/cache/expirable/CacheExpiryStrategy.java  |   31 -
 .../cache/expirable/CacheExpiryStrategyImpl.java   |   20 -
 .../cache/expirable/MavenIndexCacheExpirable.java  |   35 -
 .../expirable/MavenMetadataCacheExpirable.java     |   35 -
 ...iqueSnapshotArtifactExpirableOrOverridable.java |   46 -
 .../repo/cache/expirable/ZapItemVisitor.java       |  102 -
 .../cache/expirable/vcs/GitRefsCacheExpirable.java |   16 -
 .../repo/cache/trashable/MavenNonTrashable.java    |   38 -
 .../repo/cleanup/ArtifactCleanupJob.java           |   56 -
 .../repo/cleanup/ArtifactCleanupServiceImpl.java   |  256 --
 .../artifactory/repo/cleanup/FolderPruningJob.java |   48 -
 .../repo/cleanup/FolderPruningService.java         |   38 -
 .../repo/cleanup/FolderPruningServiceImpl.java     |  166 -
 .../repo/cleanup/IntegrationCleanupCandidate.java  |   67 -
 .../repo/cleanup/IntegrationCleanupJob.java        |   48 -
 .../cleanup/IntegrationCleanupServiceImpl.java     |  211 -
 .../cleanup/InternalArtifactCleanupService.java    |   35 -
 .../repo/cleanup/InternalFolderPruningService.java |   29 -
 .../cleanup/InternalIntegrationCleanupService.java |   43 -
 .../InternalVirtualCacheCleanupService.java        |   32 -
 .../repo/cleanup/VirtualCacheCleanupJob.java       |   53 -
 .../cleanup/VirtualCacheCleanupServiceImpl.java    |  202 -
 .../repo/count/ArtifactCountRetriever.java         |   94 -
 .../java/org/artifactory/repo/db/DbCacheRepo.java  |  202 -
 .../java/org/artifactory/repo/db/DbLocalRepo.java  |  256 --
 .../artifactory/repo/db/DbStoringRepoMixin.java    |  804 ----
 .../repo/db/importexport/DbExportBase.java         |  313 --
 .../repo/db/importexport/DbRepoExportHandler.java  |  354 --
 .../db/importexport/DbRepoExportSearchHandler.java |  126 -
 .../db/importexport/DbRepoImportExportBase.java    |   67 -
 .../repo/db/importexport/DbRepoImportHandler.java  |  655 ---
 .../db/importexport/ImportExportAccumulator.java   |  145 -
 .../AddPropertyAfterMoveOrCopyInterceptor.java     |   73 -
 .../interceptor/ArchiveIndexingInterceptor.java    |   86 -
 .../repo/interceptor/ImportInterceptorsImpl.java   |   41 -
 .../interceptor/IntegrationCleanerInterceptor.java |   70 -
 .../artifactory/repo/interceptor/Interceptors.java |  100 -
 .../MavenMetadataCalculationInterceptor.java       |  143 -
 .../repo/interceptor/MavenPomInterceptor.java      |  103 -
 .../repo/interceptor/NpmMetadataInterceptor.java   |  100 -
 .../interceptor/NuGetCalculationInterceptor.java   |  141 -
 .../repo/interceptor/PluginsInterceptor.java       |  153 -
 .../StorageAggregationInterceptorsImpl.java        |   42 -
 .../repo/interceptor/TrashInterceptor.java         |   64 -
 .../storage/StorageInterceptorAdapter.java         |   85 -
 .../storage/StorageInterceptorsImpl.java           |  187 -
 .../repo/local/LocalNonCacheOverridable.java       |   38 -
 .../repo/local/LocalNonCacheOverridables.java      |    9 -
 .../repo/local/LocalNonCacheOverridablesImpl.java  |   86 -
 .../repo/local/PathDeletionContext.java            |   94 -
 .../repo/local/ValidDeployPathContext.java         |   93 -
 .../artifactory/repo/mbean/ManagedRepository.java  |   54 -
 .../repo/mbean/ManagedRepositoryMBean.java         |   35 -
 .../repo/remote/browse/HtmlRepositoryBrowser.java  |  163 -
 .../repo/remote/browse/HttpExecutor.java           |   34 -
 .../remote/browse/RemoteRepositoryBrowser.java     |   85 -
 .../repo/remote/browse/S3RepositoryBrowser.java    |  269 --
 .../remote/browse/S3RepositorySecuredHelper.java   |  163 -
 .../remote/interceptor/RemoteRepoInterceptor.java  |   67 -
 .../repo/replication/LocalReplicationJob.java      |  104 -
 .../repo/replication/RemoteReplicationJob.java     |  123 -
 .../repo/service/ArchiveContentRetriever.java      |  230 -
 .../repo/service/ArtifactoryDeployRequest.java     |   77 -
 .../service/ArtifactoryDeployRequestBuilder.java   |  105 -
 .../service/CaseSensitivityRepairServiceImpl.java  |  269 --
 .../repo/service/DeployServiceImpl.java            |  327 --
 .../org/artifactory/repo/service/ExportJob.java    |   83 -
 .../artifactory/repo/service/FolderCompactor.java  |   94 -
 .../service/ImportHandlerCallablesFactory.java     |   73 -
 .../org/artifactory/repo/service/ImportJob.java    |  253 --
 .../repo/service/InternalRepositoryService.java    |  218 -
 .../service/RepositoryBrowsingServiceImpl.java     |  779 ----
 .../repo/service/RepositoryServiceImpl.java        | 2365 ----------
 .../repo/service/mover/BaseRepoPathMover.java      |  697 ---
 .../repo/service/mover/CopyRepoPathService.java    |   36 -
 .../repo/service/mover/DefaultRepoPathCopier.java  |   49 -
 .../repo/service/mover/DefaultRepoPathMover.java   |   84 -
 .../repo/service/mover/LockableMover.java          |   25 -
 .../repo/service/mover/MoveRepoPathService.java    |   36 -
 .../repo/service/mover/MoverConfig.java            |  165 -
 .../repo/service/mover/MoverConfigBuilder.java     |  156 -
 .../artifactory/repo/service/mover/MoverProxy.java |   78 -
 .../repo/service/mover/RepoPathIterator.java       |   66 -
 .../repo/service/mover/RepoPathMover.java          |  109 -
 .../repo/service/mover/VfsFolderRepo.java          |   36 -
 .../repo/service/trash/NonTrashableItem.java       |   38 -
 .../repo/service/trash/NonTrashableItems.java      |    9 -
 .../repo/service/trash/NonTrashableItemsImpl.java  |   80 -
 .../repo/service/trash/TrashServiceImpl.java       |  176 -
 .../repo/service/trash/prune/TrashcanPruner.java   |  108 -
 .../snapshot/DeployerSnapshotVersionAdapter.java   |   32 -
 .../repo/snapshot/LatestVersionResolver.java       |  120 -
 .../repo/snapshot/LocalLatestVersionResolver.java  |  278 --
 .../snapshot/NonUniqueSnapshotVersionAdapter.java  |   57 -
 .../repo/snapshot/ReleaseVersionsRetriever.java    |   90 -
 .../snapshot/RemoteLatestMavenVersionResolver.java |  146 -
 .../repo/snapshot/SnapshotVersionAdapterBase.java  |   89 -
 .../repo/snapshot/SnapshotVersionsRetriever.java   |  133 -
 .../snapshot/UniqueSnapshotVersionAdapter.java     |  318 --
 .../repo/snapshot/VersionsRetriever.java           |  112 -
 .../org/artifactory/repo/vcs/git/ref/GitRef.java   |   21 -
 .../org/artifactory/repo/vcs/git/ref/GitRefs.java  |   69 -
 .../repo/vcs/git/ref/GitRefsParser.java            |   44 -
 .../org/artifactory/repo/virtual/VirtualRepo.java  |  426 --
 .../repo/virtual/VirtualRepoDownloadStrategy.java  |  485 --
 .../repo/virtual/VirtualResolverRequestFilter.java |   87 -
 .../interceptor/MavenMetadataInterceptor.java      |  194 -
 .../interceptor/MergeableMavenMetadata.java        |  168 -
 .../repo/virtual/interceptor/PomInterceptor.java   |  150 -
 .../interceptor/VirtualRepoInterceptor.java        |   64 -
 .../interceptor/VirtualRepoInterceptorBase.java    |   61 -
 .../interceptor/transformer/PomTransformer.java    |  132 -
 .../repo/webdav/LockableWebdavMethod.java          |   35 -
 .../org/artifactory/repo/webdav/WebdavMethod.java  |   48 -
 .../artifactory/repo/webdav/WebdavServiceImpl.java |   78 -
 .../org/artifactory/repo/webdav/WebdavStatus.java  |  244 --
 .../org/artifactory/repo/webdav/XmlWriter.java     |  301 --
 .../repo/webdav/methods/AbstractWebdavMethod.java  |   99 -
 .../repo/webdav/methods/DeleteMethod.java          |  128 -
 .../repo/webdav/methods/LockMethod.java            |  172 -
 .../repo/webdav/methods/MkcolMethod.java           |  102 -
 .../repo/webdav/methods/MoveMethod.java            |  114 -
 .../repo/webdav/methods/OptionsMethod.java         |   62 -
 .../repo/webdav/methods/PostMethod.java            |   74 -
 .../repo/webdav/methods/PropfindMethod.java        |  433 --
 .../repo/webdav/methods/ProppatchMethod.java       |   69 -
 .../repo/webdav/methods/UnlockMethod.java          |   48 -
 .../artifactory/request/BaseRequestContext.java    |   95 -
 .../request/DownloadRequestContext.java            |   65 -
 .../request/InternalArtifactoryResponse.java       |  146 -
 .../request/InternalCapturingResponse.java         |   73 -
 .../request/InternalRequestContext.java            |   43 -
 .../artifactory/request/NullRequestContext.java    |   62 -
 .../artifactory/request/RequestResponseHelper.java |  330 --
 .../org/artifactory/request/aop/RequestAdvice.java |  169 -
 .../artifactory/request/aop/RequestAdvisor.java    |   38 -
 .../artifactory/request/range/IfRangeSelector.java |   76 -
 .../java/org/artifactory/request/range/Range.java  |  204 -
 .../request/range/RangeAwareContext.java           |   65 -
 .../range/ResponseWithRangeSupportHelper.java      |  108 -
 .../range/stream/MultiRangeInputStream.java        |   99 -
 .../range/stream/SingleRangeInputStream.java       |   66 -
 .../range/stream/SingleRangeSkipInputStream.java   |   30 -
 .../org/artifactory/resource/ChecksumResource.java |   66 -
 .../artifactory/resource/ExpiredRepoResource.java  |  127 -
 .../org/artifactory/resource/FileResource.java     |  165 -
 .../org/artifactory/resource/MetadataResource.java |  128 -
 .../artifactory/resource/RemoteRepoResource.java   |  144 -
 .../org/artifactory/resource/ResolvedResource.java |  155 -
 .../artifactory/resource/UnfoundRepoResource.java  |  141 -
 .../resource/UnfoundRepoResourceReason.java        |   48 -
 .../org/artifactory/resource/ZipEntryResource.java |  125 -
 .../schedule/ArtifactorySchedulerFactoryBean.java  |   28 -
 .../schedule/BaseTaskServiceDescriptorHandler.java |   76 -
 .../schedule/TaskServiceDescriptorHandler.java     |   46 -
 .../org/artifactory/schedule/TaskServiceImpl.java  |  593 ---
 .../artifactory/schedule/TaskTypePredicate.java    |   70 -
 .../java/org/artifactory/schedule/TaskUtils.java   |  219 -
 .../org/artifactory/schedule/aop/AsyncAdvice.java  |  376 --
 .../org/artifactory/schedule/aop/AsyncAdvisor.java |   33 -
 .../schedule/aop/CompoundInvocation.java           |  100 -
 .../schedule/aop/test/AsyncComponent.java          |   41 -
 .../schedule/aop/test/AsyncComponentImpl.java      |   78 -
 .../artifactory/schedule/quartz/ExecuteAction.java |   28 -
 .../artifactory/schedule/quartz/PluginCommand.java |   56 -
 .../artifactory/schedule/quartz/QuartzTask.java    |  119 -
 .../org/artifactory/search/ArtifactSearcher.java   |  117 -
 .../artifactory/search/InternalSearchService.java  |   38 -
 .../org/artifactory/search/SearchServiceImpl.java  |  509 ---
 .../java/org/artifactory/search/SearcherBase.java  |  143 -
 .../search/archive/ArchiveIndexerImpl.java         |  326 --
 .../search/archive/ArchiveSearcher.java            |  147 -
 .../search/archive/ArchiveSearcherAql.java         |  157 -
 .../search/archive/InternalArchiveIndexer.java     |   42 -
 .../artifactory/search/build/BuildSearcher.java    |  105 -
 .../search/deployable/VersionUnitSearcher.java     |  109 -
 .../search/fields/FieldNameConverter.java          |   45 -
 .../org/artifactory/search/gavc/GavcSearcher.java  |  113 -
 .../search/property/PropertySearcher.java          |  164 -
 .../search/property/PropertySearcherAql.java       |  138 -
 .../search/stats/LastDownloadedSearcher.java       |  103 -
 .../security/AnonymousAuthenticationToken.java     |   54 -
 .../org/artifactory/security/ArtifactorySid.java   |   85 -
 .../security/HaSystemAuthenticationToken.java      |   69 -
 .../security/InternalRealmAwareAuthentication.java |   44 -
 .../security/InternalSecurityService.java          |   32 -
 .../security/MasterEncryptionServiceImpl.java      |   73 -
 .../security/PasswordDecryptingManager.java        |  186 -
 .../security/PasswordEncryptionException.java      |   36 -
 .../security/RealmAwareAuthentication.java         |   34 -
 .../security/RealmAwareAuthenticationManager.java  |  108 -
 .../security/RealmAwareAuthenticationProvider.java |   51 -
 .../RealmAwareUserPassAuthenticationToken.java     |   24 -
 .../artifactory/security/SecurityServiceImpl.java  | 2442 -----------
 .../java/org/artifactory/security/SimpleUser.java  |  157 -
 .../security/SystemAuthenticationToken.java        |   60 -
 .../crowd/CrowdAuthenticationProviderAdapter.java  |   75 -
 .../security/db/DbAuthenticationProvider.java      |   67 -
 .../security/db/DbUserDetailsService.java          |   55 -
 .../db/apikey/PropsAuthenticationProvider.java     |  118 -
 .../MissionControlEncryptInterceptor.java          |   62 -
 .../SecurityConfigurationChangesAdapter.java       |   71 -
 .../SecurityConfigurationChangesInterceptor.java   |   98 -
 .../SecurityConfigurationChangesInterceptors.java  |   28 -
 ...curityConfigurationChangesInterceptorsImpl.java |  106 -
 .../StoragePropertiesEncryptInterceptor.java       |   69 -
 .../security/jobs/CredentialsWatchJob.java         |   63 -
 .../jobs/PasswordExpireNotificationJob.java        |  223 -
 .../security/ldap/AbstractLdapService.java         |   85 -
 .../ldap/ArtifactoryBindAuthenticator.java         |  204 -
 .../ArtifactoryLdapAuthenticationProvider.java     |  293 --
 .../ldap/ArtifactoryLdapAuthenticator.java         |  230 -
 .../security/ldap/DaoLdapAuthoritiesPopulator.java |   48 -
 .../security/ldap/InternalLdapAuthenticator.java   |   32 -
 .../ldap/LdapRealmAwareAuthentication.java         |   47 -
 .../artifactory/security/ldap/LdapServiceImpl.java |  168 -
 .../security/ldap/UserContextMapper.java           |   44 -
 .../MissionControlAuthenticationProviderImpl.java  |   62 -
 .../control/MissionControlAuthenticationToken.java |   31 -
 .../security/props/auth/BadPropsAuthException.java |   12 -
 .../props/auth/PropsAuthNotFoundException.java     |   12 -
 .../security/ssh/ArtifactoryCommandFactory.java    |   44 -
 .../security/ssh/InternalSshAuthService.java       |   12 -
 .../security/ssh/PublicKeyAuthenticator.java       |   95 -
 .../security/ssh/SshAuthServiceImpl.java           |  212 -
 .../security/ssh/UsernameAttributeKey.java         |   22 -
 .../ssh/command/AbstractAuthenticateCommand.java   |  203 -
 .../ssh/command/CliAuthenticateCommand.java        |   70 -
 .../org/artifactory/service/SmartRepoService.java  |   60 -
 .../artifactory/service/SmartRepoServiceImpl.java  |  585 ---
 .../spring/ArtifactoryApplicationContext.java      |  818 ----
 .../spring/InternalArtifactoryContext.java         |   34 -
 .../artifactory/spring/InternalContextHelper.java  |   34 -
 .../state/ArtifactoryStateManagerImpl.java         |  208 -
 .../storage/binary/BinaryStoreManagerService.java  |    9 -
 .../binary/BinaryStoreManagerServiceImpl.java      |   82 -
 .../ArtifactoryCommonDbPropertiesServiceImpl.java  |   47 -
 .../service/ArtifactoryHeartbeatServiceImpl.java   |  107 -
 .../ArtifactoryServersCommonServiceImpl.java       |  106 -
 .../jobs/StatsDelegatingServiceFlushJob.java       |   52 -
 .../jobs/StatsPersistingServiceFlushJob.java       |   52 -
 .../artifactory/storage/mbean/ManagedStorage.java  |   43 -
 .../storage/mbean/ManagedStorageMBean.java         |   30 -
 .../storage/service/InternalStorageService.java    |   28 -
 .../storage/service/StatsDelegatingService.java    |   28 -
 .../service/StatsDelegatingServiceImpl.java        |  536 ---
 .../storage/service/StatsServiceImpl.java          |  131 -
 .../storage/service/StorageServiceImpl.java        |  364 --
 .../storage/service/constraints/Criteria.java      |   39 -
 .../service/constraints/NotSystemUserCriteria.java |   49 -
 .../traffic/InternalTrafficService.java            |   28 -
 .../traffic/TrafficCollectionEvent.java            |   40 -
 .../org/artifactory/traffic/TrafficCollector.java  |   51 -
 .../artifactory/traffic/TrafficCollectorImpl.java  |  135 -
 .../traffic/TrafficCollectorListener.java          |   27 -
 .../traffic/TrafficCollectorResolution.java        |   52 -
 .../artifactory/traffic/TrafficServiceImpl.java    |  241 -
 .../org/artifactory/traffic/mbean/Traffic.java     |   76 -
 .../artifactory/traffic/mbean/TrafficMBean.java    |   29 -
 .../artifactory/util/ArtifactoryServerHelper.java  |   38 -
 .../version/VersionInfoServiceImpl.java            |  199 -
 .../org/artifactory/version/VersionParser.java     |   75 -
 .../main/resources/META-INF/ehcache/ehcache.xml    |  288 --
 .../src/main/resources/META-INF/spring/addons.xml  |   25 -
 .../META-INF/spring/applicationContext.xml         |   62 -
 .../resources/META-INF/spring/interceptors.xml     |   36 -
 .../main/resources/META-INF/spring/restContext.xml |   38 -
 .../main/resources/META-INF/spring/scheduling.xml  |   34 -
 .../main/resources/META-INF/spring/security.xml    |  109 -
 .../email/messages/backupError.properties          |   28 -
 .../email/messages/bintrayPushBuild.properties     |   26 -
 .../email/messages/resetPassword.properties        |   32 -
 .../core/src/main/resources/plugin-template.grv    |  299 --
 .../RemoteReplicationSettingsBuilderTest.java      |   74 -
 .../replication/RemoteReplicationSettingsTest.java |   53 -
 .../api/maven/MavenArtifactInfoTest.java           |  227 -
 .../artifactory/api/module/VersionUnitTest.java    |   70 -
 .../api/request/ArtifactoryRequestTest.java        |  193 -
 .../request/TranslatedArtifactoryRequestTest.java  |  266 --
 .../api/search/SavedSearchResultsTest.java         |  113 -
 .../api/security/UserInfoBuilderTest.java          |   84 -
 .../bintray/BintrayServiceImplTest.java            |   45 -
 .../artifactory/build/DetailedBuildRunTests.java   |   67 -
 .../config/CentralConfigServiceImplTest.java       |  104 -
 .../org/artifactory/config/DefaultConfigTest.java  |   54 -
 .../org/artifactory/io/checksum/ChecksumsTest.java |   79 -
 .../io/checksum/policy/ChecksumPolicyBaseTest.java |   91 -
 .../io/checksum/policy/ChecksumPolicyFailTest.java |   72 -
 .../policy/ChecksumPolicyGenerateIfAbsentTest.java |   71 -
 .../ChecksumPolicyIgnoreAndGenerateTest.java       |   71 -
 .../policy/ChecksumPolicyPassThruTest.java         |   71 -
 .../policy/LocalRepoChecksumPolicyTest.java        |  104 -
 .../java/org/artifactory/maven/WorkQueueTest.java  |   65 -
 ...tionDateMavenMetadataVersionComparatorTest.java |   54 -
 .../MavenMetadataVersionComparatorTest.java        |   96 -
 .../versioning/MavenVersionComparatorTest.java     |   98 -
 .../test/java/org/artifactory/repo/DbRepoTest.java |   65 -
 .../java/org/artifactory/repo/HttpRepoTest.java    |  123 -
 .../org/artifactory/repo/RemoteRepoBaseTest.java   |  225 -
 .../org/artifactory/repo/RepoPathFactoryTest.java  |   68 -
 .../expirable/vcs/GitRefsCacheExpirableTest.java   |   32 -
 .../repo/cahce/expirable/CacheExpiryImplTest.java  |  118 -
 .../expirable/MavenIndexCacheExpirableTest.java    |   76 -
 .../expirable/MavenMetadataCacheExpirableTest.java |   71 -
 ...SnapshotArtifactExpirableOrOverridableTest.java |   85 -
 .../org/artifactory/repo/db/DbRepoBaseTest.java    |   98 -
 .../artifactory/repo/db/StoringRepoMixinTest.java  |  230 -
 .../db/importexport/DbRepoImportHandlerSpec.groovy |  298 --
 .../NuGetCalculationInterceptorTest.java           |  199 -
 .../remote/browse/HtmlRepositoryBrowserTest.java   |  133 -
 .../remote/browse/S3RepositoryBrowserTest.java     |  267 --
 .../browse/S3RepositorySecuredHelperTest.java      |   62 -
 .../repo/replication/LocalReplicationJobTest.java  |  173 -
 .../repo/replication/RemoteReplicationJobTest.java |  165 -
 .../repo/replication/ReplicationJobTestBase.java   |   64 -
 .../artifactory/repo/service/ImportJobSpec.groovy  |  101 -
 .../repo/service/mover/RepoPathIteratorTest.java   |   59 -
 .../service/trash/TrashSkipInterceptorsTest.java   |  100 -
 .../repo/snapshot/BaseSnapshotAdapterTest.java     |   64 -
 .../NonUniqueSnapshotVersionAdapterTest.java       |   93 -
 .../snapshot/UniqueSnapshotVersionAdapterTest.java |  101 -
 .../virtual/interceptor/PomTransformerTest.java    |  201 -
 .../ResponseWithHttpRangeSupportHelperTest.java    |  209 -
 .../artifactory/resource/ChecksumResourceTest.java |   50 -
 .../artifactory/resource/ResolvedResourceTest.java |  103 -
 .../schedule/ArtifactoryHomeTaskTestStub.java      |   99 -
 .../artifactory/schedule/DummyQuartzCommand.java   |   88 -
 .../artifactory/schedule/DummyQuartzCommandA.java  |   23 -
 .../artifactory/schedule/DummyQuartzCommandB.java  |   29 -
 .../artifactory/schedule/DummyQuartzCommandC.java  |   36 -
 .../artifactory/schedule/DummyQuartzCommandD.java  |   36 -
 .../schedule/DummyStopCancelQuartzCommand.java     |   57 -
 .../org/artifactory/schedule/JobCommandTest.java   |  317 --
 .../schedule/SharedTaskServiceTest.java            |   78 -
 .../org/artifactory/schedule/TaskServiceTest.java  |  294 --
 .../artifactory/schedule/TaskServiceTestBase.java  |  145 -
 .../org/artifactory/schedule/TaskUtilsTest.java    |   67 -
 .../artifactory/security/ArtifactorySidTest.java   |   95 -
 .../java/org/artifactory/security/SaltTest.java    |   92 -
 .../security/SecurityServiceImplTest.java          | 1030 -----
 .../StoragePropertiesEncryptInterceptorTest.java   |  115 -
 .../ssh/ArtifactoryCommandFactorySpec.groovy       |   38 -
 .../security/ssh/PublicKeyAuthenticatorSpec.groovy |   50 -
 .../security/ssh/SshAuthServiceImplTest.java       |  221 -
 .../java/org/artifactory/test/mock/MockUtils.java  |   41 -
 .../artifactory/test/mock/SimpleMockServer.java    |   98 -
 .../org/artifactory/util/FilePathMatcherTest.java  |   34 -
 .../util/HttpClientConfiguratorTest.java           |  257 --
 .../java/org/artifactory/util/PathMatcherTest.java |  255 --
 .../org/artifactory/util/VersionParserTest.java    |   49 -
 .../org/artifactory/bintray/packagesToDeploy.json  |   14 -
 .../repo/PropertyLoaderTest1.properties            |  163 -
 .../repo/PropertyLoaderTest2.properties            |   39 -
 .../repo/PropertyLoaderTest3.properties            |   46 -
 .../repo/PropertyLoaderTest4.properties            |   47 -
 .../artifactory/repo/artifactory.test.config.xml   |   40 -
 .../repo/remote/browse/html/artifactory-list.html  |   18 -
 .../remote/browse/html/artifactory-simple.html     |  387 --
 .../repo/remote/browse/html/bintray.html           |   14 -
 .../repo/remote/browse/html/hrefExample.html       |   15 -
 .../repo/remote/browse/html/invalidHtml.html       |    1 -
 .../repo/remote/browse/html/noHrefs.html           |    6 -
 .../repo/remote/browse/html/simple.html            |    1 -
 .../repo/remote/browse/s3/s3-nosuchkey.xml         |    8 -
 .../browse/s3/s3-prefix-org.springframework.xml    |  130 -
 .../repo/remote/browse/s3/s3-terracotta.xml        |   60 -
 .../org/artifactory/repo/test-comment.md5          |    3 -
 .../resources/org/artifactory/repo/test-desc.md5   |    1 -
 .../resources/org/artifactory/repo/test-empty.md5  |    0
 .../resources/org/artifactory/repo/test-valid.md5  |    1 -
 .../virtual/interceptor/activeByDefault-test.pom   |  172 -
 .../artifactory/repo/virtual/interceptor/bad.pom   |   44 -
 .../repo/virtual/interceptor/clean-test.pom        |   59 -
 .../resources/org/artifactory/security/ssh/id_rsa  |   27 -
 .../org/artifactory/security/ssh/id_rsa.pub        |    1 -
 .../org/artifactory/security/storage.properties    |    6 -
 .../resources/org/artifactory/util/versioning.xml  |   34 -
 backend/pom.xml                                    |   36 -
 backend/traffic/pom.xml                            |   63 -
 .../org/artifactory/traffic/RequestLogger.java     |   69 -
 .../org/artifactory/traffic/TrafficAction.java     |   49 -
 .../org/artifactory/traffic/TrafficLogger.java     |   45 -
 .../org/artifactory/traffic/TrafficService.java    |   61 -
 .../java/org/artifactory/traffic/TrafficUtils.java |   54 -
 .../org/artifactory/traffic/TransferUsage.java     |   44 -
 .../artifactory/traffic/entry/DownloadEntry.java   |   53 -
 .../artifactory/traffic/entry/RequestEntry.java    |  164 -
 .../traffic/entry/TokenizedTrafficEntry.java       |  137 -
 .../entry/TokenizedTrafficEntryFactory.java        |   62 -
 .../artifactory/traffic/entry/TrafficEntry.java    |   50 -
 .../traffic/entry/TrafficEntryBase.java            |   87 -
 .../artifactory/traffic/entry/TransferEntry.java   |  120 -
 .../org/artifactory/traffic/entry/UploadEntry.java |   53 -
 .../policy/TrafficTimeBasedRollingPolicy.java      |  185 -
 .../artifactory/traffic/read/TrafficReader.java    |  297 --
 .../traffic/read/TrafficStreamParser.java          |  100 -
 .../org/artifactory/traffic/TrafficActionTest.java |   70 -
 .../java/org/artifactory/traffic/TrafficTest.java  |   65 -
 .../traffic/entry/BaseEntryBehaviorTest.java       |   86 -
 .../traffic/entry/RequestEntryTest.java            |  104 -
 .../traffic/entry/TrafficEntryBuilderTest.java     |   66 -
 .../traffic/entry/TransferEntryTest.java           |   85 -
 .../traffic/read/TrafficReaderTest.java            |  193 -
 .../traffic/read/TrafficStreamParserTest.java      |  121 -
 .../resources/org/artifactory/traffic/logback.xml  |   43 -
 .../logs/traffic.1238313294196-1238313394196.log   |   10 -
 .../logs/traffic.1238313394196-1238313494196.log   |   14 -
 .../logs/traffic.1238313453672-1238313494196.log   |    5 -
 .../logs/traffic.1238313494196-1238313542120.log   |    4 -
 .../traffic/logs/traffic.1238313542120.log         |    4 -
 base/api/pom.xml                                   |  118 -
 .../translate/ChecksumTranslatorFilter.java        |   55 -
 .../translate/MetadataTranslatorFilter.java        |   49 -
 .../layouts/translate/PathTranslationHelper.java   |  124 -
 .../addon/layouts/translate/TranslatorFilter.java  |   36 -
 .../org/artifactory/api/archive/ArchiveType.java   |   48 -
 .../org/artifactory/api/artifact/ArtifactInfo.java |   79 -
 .../api/artifact/DebianArtifactInfo.java           |   48 -
 .../org/artifactory/api/artifact/UnitInfo.java     |   68 -
 .../api/artifact/VagrantArtifactInfo.java          |   45 -
 .../artifactory/api/bintray/BintrayItemInfo.java   |  122 -
 .../api/bintray/BintrayPackageInfo.java            |  105 -
 .../org/artifactory/api/bintray/BintrayParams.java |  111 -
 .../artifactory/api/bintray/BintrayService.java    |  252 --
 .../artifactory/api/bintray/BintrayUploadInfo.java |  202 -
 .../org/artifactory/api/bintray/BintrayUser.java   |   73 -
 .../java/org/artifactory/api/bintray/Repo.java     |   48 -
 .../org/artifactory/api/bintray/RepoPackage.java   |   77 -
 .../api/bintray/distribution/Distribution.java     |   93 -
 .../bintray/distribution/DistributionService.java  |   76 -
 .../model/DistributionRepoCreationDetails.java     |   21 -
 .../resolver/DistributionCoordinatesResolver.java  |  385 --
 .../resolver/DistributionRuleFilterType.java       |   47 -
 .../rule/DistributionRuleLayoutToken.java          |   40 -
 .../rule/DistributionRulePathToken.java            |   56 -
 .../rule/DistributionRulePropertyToken.java        |   52 -
 .../distribution/rule/DistributionRuleToken.java   |   23 -
 .../rule/DistributionRuleTokenFactory.java         |   12 -
 .../distribution/rule/DistributionRuleTokens.java  |  191 -
 .../bintray/docker/BintrayDockerPushRequest.java   |   15 -
 .../api/bintray/docker/DockerBintrayImageInfo.java |   17 -
 .../api/bintray/docker/DockerV1BintrayInfo.java    |   17 -
 .../api/bintray/docker/DockerV2BintrayInfo.java    |   19 -
 .../api/bintray/exception/BintrayException.java    |   38 -
 .../java/org/artifactory/api/build/BuildProps.java |   49 -
 .../artifactory/api/build/BuildRunComparators.java |   91 -
 .../org/artifactory/api/build/BuildService.java    |  237 -
 .../org/artifactory/api/build/GeneralBuild.java    |  159 -
 .../api/build/ImportableExportableBuild.java       |  176 -
 .../org/artifactory/api/build/ModuleArtifact.java  |   81 -
 .../artifactory/api/build/ModuleDependency.java    |   91 -
 .../org/artifactory/api/build/PublishedModule.java |   37 -
 .../artifactory/api/build/diff/BuildParams.java    |  161 -
 .../api/build/diff/BuildsDiffArtifactModel.java    |   47 -
 .../api/build/diff/BuildsDiffBaseFileModel.java    |  111 -
 .../api/build/diff/BuildsDiffDependencyModel.java  |   75 -
 .../api/build/diff/BuildsDiffPropertyModel.java    |   87 -
 .../api/build/diff/BuildsDiffStatus.java           |   44 -
 .../java/org/artifactory/api/cache/CacheType.java  |   27 -
 .../api/cache/ElementReferenceType.java            |   27 -
 .../artifactory/api/callhome/CallHomeRequest.java  |   99 -
 .../org/artifactory/api/callhome/FeatureGroup.java |   58 -
 .../artifactory/api/common/BasicStatusHolder.java  |  406 --
 .../api/common/ImportExportStatusHolder.java       |   27 -
 .../api/common/MoveMultiStatusHolder.java          |  107 -
 .../api/config/CentralConfigService.java           |   68 -
 .../artifactory/api/config/ExportSettingsImpl.java |  197 -
 .../api/config/ImportExportSettingsImpl.java       |  151 -
 .../artifactory/api/config/ImportSettingsImpl.java |  107 -
 .../api/config/ImportableExportable.java           |   31 -
 .../api/config/RepositoryImportSettingsImpl.java   |   67 -
 .../org/artifactory/api/config/VersionInfo.java    |  136 -
 .../api/context/ArtifactoryContext.java            |   72 -
 .../context/ArtifactoryContextThreadBinder.java    |   44 -
 .../org/artifactory/api/context/ContextHelper.java |   28 -
 .../api/download/FolderDownloadInfo.java           |   25 -
 .../api/download/FolderDownloadService.java        |   82 -
 .../org/artifactory/api/governance/BaseAction.java |   23 -
 .../api/governance/BlackDuckApplicationInfo.java   |  100 -
 .../artifactory/api/governance/BlackDuckUtils.java |   42 -
 .../api/governance/ExtComponentCoordinates.java    |  197 -
 .../api/governance/ExternalVulnerability.java      |   76 -
 .../api/governance/GovernanceRequestInfo.java      |  196 -
 .../api/governance/GovernanceUpdateResult.java     |   80 -
 .../api/license/ArtifactLicenseModel.java          |  105 -
 .../org/artifactory/api/license/LicenseInfo.java   |  210 -
 .../org/artifactory/api/license/LicensesInfo.java  |   31 -
 .../api/license/ModuleLicenseModel.java            |  333 --
 .../api/mail/MailServerConfiguration.java          |   92 -
 .../java/org/artifactory/api/mail/MailService.java |   49 -
 .../artifactory/api/maven/MavenArtifactInfo.java   |  346 --
 .../api/maven/MavenMetadataService.java            |   45 -
 .../org/artifactory/api/maven/MavenService.java    |   86 -
 .../org/artifactory/api/maven/MavenSetting.java    |   39 -
 .../artifactory/api/maven/MavenSettingUnit.java    |   63 -
 .../org/artifactory/api/maven/MavenSettings.java   |  149 -
 .../artifactory/api/maven/MavenSettingsMirror.java |   59 -
 .../api/maven/MavenSettingsRepository.java         |   55 -
 .../artifactory/api/maven/MavenSettingsServer.java |   79 -
 .../api/message/ArtifactoryUpdatesService.java     |   37 -
 .../java/org/artifactory/api/message/Message.java  |   67 -
 .../java/org/artifactory/api/mime/MimeEntry.java   |  114 -
 .../org/artifactory/api/module/ModuleInfo.java     |  219 -
 .../artifactory/api/module/ModuleInfoBuilder.java  |  113 -
 .../artifactory/api/module/ModuleInfoUtils.java    |  397 --
 .../org/artifactory/api/module/VersionUnit.java    |   92 -
 .../api/module/regex/NamedMatchResult.java         |   43 -
 .../artifactory/api/module/regex/NamedMatcher.java |  260 --
 .../artifactory/api/module/regex/NamedPattern.java |  104 -
 .../api/properties/LockableAddProperties.java      |   35 -
 .../api/properties/PropertiesService.java          |  154 -
 .../api/repo/AggregatingRequestListener.java       |   27 -
 .../artifactory/api/repo/ArchiveFileContent.java   |   80 -
 .../main/java/org/artifactory/api/repo/Async.java  |   64 -
 .../org/artifactory/api/repo/BackupService.java    |   39 -
 .../artifactory/api/repo/BaseBrowsableItem.java    |  145 -
 .../org/artifactory/api/repo/BrowsableItem.java    |  138 -
 .../api/repo/BrowsableItemCriteria.java            |  104 -
 .../api/repo/CaseSensitivityRepairService.java     |   30 -
 .../org/artifactory/api/repo/DeployService.java    |   53 -
 .../api/repo/DirectRequestListener.java            |   27 -
 .../api/repo/DockerRepositoryAction.java           |    8 -
 .../org/artifactory/api/repo/ItemInfoAware.java    |   30 -
 .../artifactory/api/repo/RemoteBrowsableItem.java  |   83 -
 .../api/repo/RepositoryBrowsingService.java        |  137 -
 .../artifactory/api/repo/RepositoryService.java    |  532 ---
 .../java/org/artifactory/api/repo/Request.java     |   46 -
 .../org/artifactory/api/repo/RequestListener.java  |   48 -
 .../api/repo/RootNodesFilterResult.java            |   16 -
 .../artifactory/api/repo/VirtualBrowsableItem.java |  129 -
 .../org/artifactory/api/repo/VirtualRepoItem.java  |   88 -
 .../api/repo/cleanup/ArtifactCleanupService.java   |   41 -
 .../repo/cleanup/VirtualCacheCleanupService.java   |   41 -
 .../api/repo/exception/BlackedOutException.java    |   46 -
 .../api/repo/exception/FileExpectedException.java  |   38 -
 .../repo/exception/FolderExpectedException.java    |   35 -
 .../repo/exception/IncludeExcludeException.java    |   47 -
 .../exception/ItemNotFoundRuntimeException.java    |   44 -
 .../repo/exception/RejectedArtifactException.java  |   50 -
 .../api/repo/exception/RepoAccessException.java    |   46 -
 .../api/repo/exception/RepoRejectException.java    |   82 -
 .../repo/exception/SnapshotPolicyException.java    |   57 -
 .../api/repo/exception/maven/BadPomException.java  |   31 -
 .../api/repo/index/MavenIndexerService.java        |   43 -
 .../api/repo/storage/RepoStorageSummaryInfo.java   |  150 -
 .../api/request/ArtifactoryRequestBase.java        |  337 --
 .../api/request/ArtifactoryResponse.java           |   84 -
 .../artifactory/api/request/DownloadService.java   |   34 -
 .../api/request/InternalArtifactoryRequest.java    |  284 --
 .../api/request/TranslatedArtifactoryRequest.java  |  211 -
 .../org/artifactory/api/request/UploadService.java |   30 -
 .../main/java/org/artifactory/api/rest/Link.java   |   73 -
 .../artifactory/api/rest/artifact/FileList.java    |  109 -
 .../api/rest/artifact/FileListElement.java         |  193 -
 .../api/rest/artifact/ItemLastModified.java        |   56 -
 .../api/rest/artifact/ItemPermissions.java         |   86 -
 .../api/rest/artifact/ItemProperties.java          |   40 -
 .../api/rest/artifact/ItemStatsInfo.java           |  107 -
 .../api/rest/artifact/PromotionResult.java         |   62 -
 .../rest/artifact/RepairPathConflictsResult.java   |   74 -
 .../api/rest/artifact/RestBaseStorageInfo.java     |   39 -
 .../api/rest/artifact/RestFileInfo.java            |   55 -
 .../api/rest/artifact/RestFolderInfo.java          |   75 -
 .../org/artifactory/api/rest/build/BuildInfo.java  |   33 -
 .../org/artifactory/api/rest/build/Builds.java     |   51 -
 .../artifactory/api/rest/build/BuildsByName.java   |   46 -
 .../build/artifacts/BuildArtifactsMapping.java     |   56 -
 .../build/artifacts/BuildArtifactsRequest.java     |  123 -
 .../api/rest/build/diff/BuildsDiff.java            |   64 -
 .../api/rest/compliance/FileComplianceInfo.java    |   50 -
 .../rest/constant/ArchiveIndexRestConstants.java   |   26 -
 .../api/rest/constant/ArchiveRestConstants.java    |   33 -
 .../api/rest/constant/ArtifactRestConstants.java   |   62 -
 .../api/rest/constant/BintrayRestConstants.java    |   29 -
 .../api/rest/constant/BuildRestConstants.java      |   48 -
 .../api/rest/constant/ComplianceConstants.java     |   28 -
 .../api/rest/constant/ConfigRestConstants.java     |   28 -
 .../api/rest/constant/GitLfsResourceConstants.java |   19 -
 .../api/rest/constant/HaRestConstants.java         |   40 -
 .../api/rest/constant/ImportRestConstants.java     |   28 -
 .../api/rest/constant/MavenRestConstants.java      |   32 -
 .../api/rest/constant/NuGetResourceConstants.java  |   10 -
 .../api/rest/constant/PluginRestConstants.java     |   35 -
 .../rest/constant/RepairRepositoryConstants.java   |   26 -
 .../rest/constant/ReplicationRestConstants.java    |   28 -
 .../rest/constant/ReplicationsRestConstants.java   |   29 -
 .../rest/constant/RepositoriesRestConstants.java   |   44 -
 .../api/rest/constant/RestConstants.java           |   29 -
 .../api/rest/constant/SearchRestConstants.java     |  119 -
 .../api/rest/constant/SecurityRestConstants.java   |   33 -
 .../api/rest/constant/SystemRestConstants.java     |   42 -
 .../api/rest/constant/TestRestConstants.java       |   32 -
 .../api/rest/constant/TrafficRestConstants.java    |   33 -
 .../api/rest/constant/TrashcanRestConstants.java   |   26 -
 .../api/rest/constant/YumRestConstants.java        |   27 -
 .../MultipleReplicationConfigRequest.java          |   41 -
 .../rest/replication/ReplicationConfigRequest.java |  114 -
 .../ReplicationEnableDisableRequest.java           |   40 -
 .../api/rest/replication/ReplicationRequest.java   |   99 -
 .../api/rest/replication/ReplicationStatus.java    |   88 -
 .../rest/replication/ReplicationStatusType.java    |   62 -
 .../org/artifactory/api/rest/restmodel/IModel.java |    7 -
 .../artifactory/api/rest/restmodel/JsonUtil.java   |   52 -
 .../api/rest/search/common/RestDateFieldName.java  |   53 -
 .../api/rest/search/query/BaseRestQuery.java       |   67 -
 .../api/rest/search/query/RestArchiveQuery.java    |   72 -
 .../api/rest/search/query/RestArtifactQuery.java   |   53 -
 .../api/rest/search/query/RestGavcQuery.java       |  110 -
 .../api/rest/search/query/RestMetadataQuery.java   |  129 -
 .../search/result/ArchiveRestSearchResult.java     |   44 -
 .../rest/search/result/ArtifactVersionsResult.java |   66 -
 .../search/result/BadChecksumRestSearchResult.java |  126 -
 .../result/CreatedInRangeRestSearchResult.java     |   45 -
 .../api/rest/search/result/DependencyBuilds.java   |   63 -
 .../search/result/DownloadRestSearchResult.java    |   42 -
 .../search/result/DynamicItemSearchResult.java     |   38 -
 .../rest/search/result/InfoRestSearchResult.java   |   34 -
 .../rest/search/result/LastDownloadRestResult.java |   62 -
 .../rest/search/result/LicensesSearchResult.java   |   40 -
 .../rest/search/result/PatternResultFileSet.java   |   81 -
 .../api/rest/search/result/VersionEntry.java       |   94 -
 .../api/rest/search/result/VersionRestResult.java  |   76 -
 .../api/rest/versions/VersionsSearchResult.java    |   32 -
 .../org/artifactory/api/search/ArchiveIndexer.java |   69 -
 .../api/search/BintrayItemSearchResults.java       |   31 -
 .../artifactory/api/search/ItemSearchResult.java   |   34 -
 .../artifactory/api/search/ItemSearchResults.java  |  108 -
 .../artifactory/api/search/SavedSearchResults.java |  152 -
 .../org/artifactory/api/search/SearchControls.java |   58 -
 .../artifactory/api/search/SearchControlsBase.java |   96 -
 .../artifactory/api/search/SearchResultBase.java   |   83 -
 .../org/artifactory/api/search/SearchService.java  |  117 -
 .../java/org/artifactory/api/search/Searcher.java  |   26 -
 .../api/search/VersionSearchResults.java           |   54 -
 .../api/search/archive/ArchiveSearchControls.java  |  114 -
 .../api/search/archive/ArchiveSearchResult.java    |   64 -
 .../search/artifact/ArtifactSearchControls.java    |   78 -
 .../api/search/artifact/ArtifactSearchResult.java  |   51 -
 .../search/artifact/ChecksumSearchControls.java    |   74 -
 .../deployable/VersionUnitSearchControls.java      |   63 -
 .../search/deployable/VersionUnitSearchResult.java |   79 -
 .../api/search/gavc/GavcSearchControls.java        |  125 -
 .../api/search/gavc/GavcSearchResult.java          |   61 -
 .../search/property/PropertySearchControls.java    |  178 -
 .../api/search/property/PropertySearchResult.java  |   50 -
 .../api/search/stats/StatsSearchControls.java      |   70 -
 .../api/search/stats/StatsSearchResult.java        |   59 -
 .../org/artifactory/api/security/AclManager.java   |   32 -
 .../org/artifactory/api/security/AclService.java   |  131 -
 .../api/security/AuthorizationException.java       |   30 -
 .../api/security/AuthorizationService.java         |  203 -
 .../api/security/GroupNotFoundException.java       |   29 -
 .../api/security/MasterEncryptionService.java      |   40 -
 .../api/security/PasswordExpiryUser.java           |   38 -
 .../artifactory/api/security/SecurityListener.java |   49 -
 .../artifactory/api/security/SecurityService.java  |  294 --
 .../artifactory/api/security/SshAuthService.java   |   24 -
 .../security/UserAwareAuthenticationProvider.java  |   57 -
 .../artifactory/api/security/UserGroupService.java |  261 --
 .../artifactory/api/security/UserInfoBuilder.java  |  144 -
 .../artifactory/api/security/ldap/LdapService.java |   54 -
 .../artifactory/api/security/ldap/LdapUser.java    |   84 -
 .../org/artifactory/api/storage/BinariesInfo.java  |   50 -
 .../artifactory/api/storage/StorageQuotaInfo.java  |   89 -
 .../org/artifactory/api/storage/StorageUnit.java   |  220 -
 .../java/org/artifactory/api/util/Builder.java     |   31 -
 .../api/version/ArtifactoryVersioning.java         |   64 -
 .../org/artifactory/api/version/VersionHolder.java |  101 -
 .../api/version/VersionInfoService.java            |   59 -
 .../org/artifactory/api/web/WebappService.java     |   38 -
 .../org/artifactory/api/webdav/WebdavService.java  |   54 -
 .../main/java/org/artifactory/aql/AqlConverts.java |   61 -
 .../java/org/artifactory/aql/AqlException.java     |   14 -
 .../java/org/artifactory/aql/AqlFieldResolver.java |   36 -
 .../org/artifactory/aql/AqlParserException.java    |   14 -
 .../main/java/org/artifactory/aql/AqlService.java  |   39 -
 .../org/artifactory/aql/api/AqlApiElement.java     |   15 -
 .../aql/api/domain/sensitive/AqlApiArchive.java    |   34 -
 .../aql/api/domain/sensitive/AqlApiArtifact.java   |   54 -
 .../aql/api/domain/sensitive/AqlApiBuild.java      |   69 -
 .../api/domain/sensitive/AqlApiBuildPromotion.java |   59 -
 .../api/domain/sensitive/AqlApiBuildProperty.java  |   45 -
 .../aql/api/domain/sensitive/AqlApiDependency.java |   59 -
 .../aql/api/domain/sensitive/AqlApiEntry.java      |   42 -
 .../aql/api/domain/sensitive/AqlApiItem.java       |  119 -
 .../aql/api/domain/sensitive/AqlApiModule.java     |   44 -
 .../aql/api/domain/sensitive/AqlApiProperty.java   |   46 -
 .../aql/api/domain/sensitive/AqlApiStatistic.java  |   45 -
 .../api/internal/AqlApiDynamicFieldsDomains.java   |  562 ---
 .../org/artifactory/aql/api/internal/AqlBase.java  |  681 ---
 .../artifactory/aql/model/AqlComparatorEnum.java   |   38 -
 .../org/artifactory/aql/model/AqlDomainEnum.java   |   54 -
 .../java/org/artifactory/aql/model/AqlField.java   |   16 -
 .../org/artifactory/aql/model/AqlFieldEnum.java    |  213 -
 .../org/artifactory/aql/model/AqlItemTypeEnum.java |   33 -
 .../org/artifactory/aql/model/AqlOperatorEnum.java |   25 -
 .../aql/model/AqlPermissionProvider.java           |   14 -
 .../aql/model/AqlRelativeDateComparatorEnum.java   |   60 -
 .../org/artifactory/aql/model/AqlSortTypeEnum.java |   32 -
 .../artifactory/aql/model/AqlTableFieldsEnum.java  |   56 -
 .../java/org/artifactory/aql/model/AqlValue.java   |   67 -
 .../org/artifactory/aql/model/AqlVariable.java     |    7 -
 .../artifactory/aql/model/AqlVariableTypeEnum.java |    8 -
 .../aql/model/DomainSensitiveField.java            |   60 -
 .../org/artifactory/aql/result/AqlEagerResult.java |   16 -
 .../artifactory/aql/result/AqlJsonStreamer.java    |  229 -
 .../org/artifactory/aql/result/AqlLazyResult.java  |   30 -
 .../org/artifactory/aql/result/AqlRestResult.java  |  419 --
 .../aql/result/rows/AqlArchiveEntryItem.java       |   14 -
 .../aql/result/rows/AqlBaseFullRowImpl.java        |  288 --
 .../artifactory/aql/result/rows/AqlBaseItem.java   |   20 -
 .../org/artifactory/aql/result/rows/AqlBuild.java  |   25 -
 .../aql/result/rows/AqlBuildArtifact.java          |   13 -
 .../aql/result/rows/AqlBuildDependency.java        |   16 -
 .../aql/result/rows/AqlBuildModule.java            |   11 -
 .../aql/result/rows/AqlBuildPromotion.java         |   23 -
 .../aql/result/rows/AqlBuildProperty.java          |   13 -
 .../org/artifactory/aql/result/rows/AqlItem.java   |   49 -
 .../artifactory/aql/result/rows/AqlProperty.java   |   13 -
 .../artifactory/aql/result/rows/AqlRowResult.java  |   10 -
 .../aql/result/rows/AqlStatisticItem.java          |   20 -
 .../artifactory/aql/result/rows/AqlStatistics.java |   17 -
 .../org/artifactory/aql/result/rows/FullRow.java   |   96 -
 .../artifactory/aql/result/rows/InflatableRow.java |  132 -
 .../artifactory/aql/result/rows/QueryTypes.java    |   21 -
 .../artifactory/aql/util/AqlSearchablePath.java    |  130 -
 .../java/org/artifactory/aql/util/AqlUtils.java    |  172 -
 .../main/java/org/artifactory/ivy/IvyService.java  |   34 -
 .../log/logback/LogbackContextHelper.java          |   59 -
 .../log/logback/LogbackContextSelector.java        |  149 -
 .../artifactory/log/logback/LoggerConfigInfo.java  |   54 -
 .../artifactory/repo/remote/browse/RemoteItem.java |  150 -
 .../artifactory/request/ArtifactoryRequest.java    |  114 -
 .../translate/ChecksumTranslatorFilterTest.java    |   67 -
 .../translate/MetadataTranslatorFilterTest.java    |   58 -
 .../translate/PathTranslationHelperTest.java       |  209 -
 .../api/common/MultiStatusHolderTest.java          |  116 -
 .../artifactory/api/config/ExportSettingsTest.java |   63 -
 .../api/mail/MailServerConfigurationTest.java      |   59 -
 .../org/artifactory/api/mime/NamingUtilsTest.java  |   77 -
 .../api/module/BaseModuleInfoUtilsTest.java        |   64 -
 .../api/module/CustomModuleInfoUtilsTest.java      |  139 -
 .../api/module/GradleModuleInfoUtilsTest.java      |  199 -
 .../api/module/IvyModuleInfoUtilsTest.java         |  293 --
 .../api/module/Maven23ModuleInfoUtilsTest.java     |  278 --
 .../api/module/ModuleInfoBuilderTest.java          |  123 -
 .../org/artifactory/api/module/ModuleInfoTest.java |  127 -
 .../api/module/ModuleInfoUtilsTest.java            |   97 -
 .../api/module/SpringIvyModuleInfoUtilsTest.java   |  129 -
 .../module/SpringMaven23ModuleInfoUtilsTest.java   |  118 -
 .../repo/storage/RepoStorageSummaryInfoTest.java   |   44 -
 .../api/rest/artifact/FileListElementTest.java     |   83 -
 .../api/rest/artifact/FileListTest.java            |   90 -
 .../search/result/PatternResultFileSetTest.java    |  107 -
 .../api/search/SearchControlsBaseTest.java         |   44 -
 .../search/archive/ArchiveSearchControlsTest.java  |   42 -
 .../artifact/ArtifactSearchControlsTest.java       |   57 -
 .../artifact/ChecksumSearchControlsTest.java       |   44 -
 .../api/search/gavc/GavcSearchControlsTest.java    |   44 -
 .../property/PropertySearchControlsTest.java       |   44 -
 .../org/artifactory/checksum/ChecksumInfoTest.java |  136 -
 .../artifactory/checksum/ChecksumsInfoTest.java    |   73 -
 .../artifactory/checksum/ChecksumsTypeTest.java    |   77 -
 .../repo/remote/browse/RemoteItemTest.java         |   44 -
 base/capi/pom.xml                                  |   69 -
 .../artifactory/common/MutableStatusHolder.java    |   60 -
 .../java/org/artifactory/factory/BasicFactory.java |   26 -
 .../java/org/artifactory/factory/InfoFactory.java  |  144 -
 .../org/artifactory/factory/InfoFactoryHolder.java |   38 -
 .../java/org/artifactory/fs/MetadataEntryInfo.java |   33 -
 .../java/org/artifactory/fs/MutableFileInfo.java   |   34 -
 .../java/org/artifactory/fs/MutableFolderInfo.java |   28 -
 .../java/org/artifactory/fs/MutableItemInfo.java   |   37 -
 .../java/org/artifactory/fs/MutableStatsInfo.java  |   42 -
 .../org/artifactory/fs/MutableWatcherInfo.java     |   32 -
 .../org/artifactory/fs/MutableWatchersInfo.java    |   33 -
 .../main/java/org/artifactory/fs/RepoResource.java |   80 -
 .../main/java/org/artifactory/fs/WatcherInfo.java  |   39 -
 .../main/java/org/artifactory/fs/WatchersInfo.java |   41 -
 .../main/java/org/artifactory/fs/ZipEntryInfo.java |   49 -
 .../org/artifactory/fs/ZipEntryRepoResource.java   |   11 -
 .../org/artifactory/fs/ZipEntryResourceInfo.java   |   33 -
 .../org/artifactory/interceptor/Interceptor.java   |   30 -
 .../org/artifactory/md/MutableMetadataInfo.java    |   33 -
 .../artifactory/repo/InternalRepoPathFactory.java  |  113 -
 .../resource/MutableRepoResourceInfo.java          |   37 -
 .../sapi/common/ArtifactorySession.java            |   17 -
 .../org/artifactory/sapi/common/BaseSettings.java  |   75 -
 .../artifactory/sapi/common/ExportSettings.java    |   71 -
 .../sapi/common/FileExportCallback.java            |   48 -
 .../artifactory/sapi/common/FileExportEvent.java   |   31 -
 .../artifactory/sapi/common/FileExportInfo.java    |   44 -
 .../artifactory/sapi/common/ImportSettings.java    |   38 -
 .../java/org/artifactory/sapi/common/Lock.java     |   39 -
 .../org/artifactory/sapi/common/PathBuilder.java   |   29 -
 .../org/artifactory/sapi/common/PathFactory.java   |   41 -
 .../sapi/common/RepositoryRuntimeException.java    |   37 -
 .../org/artifactory/sapi/common/TxPropagation.java |   11 -
 .../org/artifactory/sapi/data/BinaryContent.java   |   49 -
 .../sapi/data/MutableBinaryContent.java            |   11 -
 .../org/artifactory/sapi/data/VfsProperty.java     |   51 -
 .../org/artifactory/sapi/fs/MetadataReader.java    |   35 -
 .../org/artifactory/sapi/fs/MutableVfsFile.java    |   84 -
 .../org/artifactory/sapi/fs/MutableVfsFolder.java  |   49 -
 .../org/artifactory/sapi/fs/MutableVfsItem.java    |   85 -
 .../main/java/org/artifactory/sapi/fs/VfsFile.java |   63 -
 .../java/org/artifactory/sapi/fs/VfsFolder.java    |   37 -
 .../main/java/org/artifactory/sapi/fs/VfsItem.java |   59 -
 .../org/artifactory/sapi/fs/VfsItemVisitor.java    |   32 -
 .../main/java/org/artifactory/sapi/fs/Visitor.java |   28 -
 .../sapi/interceptor/DeleteContext.java            |   48 -
 .../sapi/interceptor/ImportInterceptor.java        |   31 -
 .../interceptor/StorageAggregationInterceptor.java |   31 -
 .../sapi/interceptor/StorageInterceptor.java       |   58 -
 .../artifactory/sapi/search/ArchiveEntryRow.java   |   31 -
 .../sapi/search/InvalidQueryRuntimeException.java  |   23 -
 .../org/artifactory/sapi/search/VfsBoolType.java   |   17 -
 .../artifactory/sapi/search/VfsComparatorType.java |   29 -
 .../artifactory/sapi/search/VfsDateFieldName.java  |   79 -
 .../artifactory/sapi/search/VfsFunctionType.java   |   35 -
 .../artifactory/sapi/search/VfsItemFieldName.java  |   27 -
 .../java/org/artifactory/sapi/search/VfsQuery.java |   59 -
 .../artifactory/sapi/search/VfsQueryFieldType.java |   52 -
 .../artifactory/sapi/search/VfsQueryProperty.java  |   31 -
 .../artifactory/sapi/search/VfsQueryResult.java    |   13 -
 .../sapi/search/VfsQueryResultType.java            |   34 -
 .../org/artifactory/sapi/search/VfsQueryRow.java   |   15 -
 .../artifactory/sapi/search/VfsQueryService.java   |   29 -
 .../sapi/security/SecurityConstants.java           |   29 -
 .../java/org/artifactory/security/AceInfo.java     |   31 -
 .../java/org/artifactory/security/AclInfo.java     |   19 -
 .../security/ArtifactoryPermission.java            |   42 -
 .../java/org/artifactory/security/GroupInfo.java   |   41 -
 .../org/artifactory/security/MutableAceInfo.java   |   48 -
 .../org/artifactory/security/MutableAclInfo.java   |   38 -
 .../org/artifactory/security/MutableGroupInfo.java |   38 -
 .../security/MutablePermissionTargetInfo.java      |   42 -
 .../org/artifactory/security/MutableUserInfo.java  |   92 -
 .../artifactory/security/PermissionTargetInfo.java |   50 -
 .../org/artifactory/security/SaltedPassword.java   |   75 -
 .../org/artifactory/security/SecurityInfo.java     |   41 -
 .../org/artifactory/security/UserGroupInfo.java    |   35 -
 .../java/org/artifactory/security/UserInfo.java    |   99 -
 .../org/artifactory/security/UserPropertyInfo.java |   14 -
 .../src/main/java/org/artifactory/util/Pair.java   |   85 -
 .../org/artifactory/util/SerializablePair.java     |   35 -
 .../src/main/java/org/artifactory/util/Tree.java   |   30 -
 .../main/java/org/artifactory/util/TreeNode.java   |   37 -
 base/common/pom.xml                                |  151 -
 .../org/artifactory/UiAuthenticationDetails.java   |   47 -
 .../src/main/java/org/artifactory/addon/Addon.java |   34 -
 .../main/java/org/artifactory/addon/AddonType.java |  118 -
 .../java/org/artifactory/addon/AddonsManager.java  |  134 -
 .../org/artifactory/addon/AddonsWebManager.java    |   37 -
 .../artifactory/addon/ArtifactoryRunningMode.java  |   28 -
 .../java/org/artifactory/addon/CoreAddons.java     |   92 -
 .../java/org/artifactory/addon/FooterMessage.java  |   66 -
 .../addon/NoInstalledLicenseAction.java            |   32 -
 .../org/artifactory/addon/OssAddonsManager.java    |  207 -
 .../addon/blackduck/BlackDuckAddon.java            |   84 -
 .../addon/blackduck/BlackDuckVulnerabilities.java  |   51 -
 .../artifactory/addon/blackduck/BlackduckInfo.java |  122 -
 .../addon/blackduck/ExternalComponentInfo.java     |   37 -
 .../artifactory/addon/blackduck/LicensePair.java   |   31 -
 .../org/artifactory/addon/bower/BowerAddon.java    |   78 -
 .../artifactory/addon/bower/BowerDependencies.java |   31 -
 .../artifactory/addon/bower/BowerMetadataInfo.java |   46 -
 .../org/artifactory/addon/bower/BowerPkgInfo.java  |   62 -
 .../addon/build/ArtifactBuildAddon.java            |   99 -
 .../org/artifactory/addon/build/BuildAddon.java    |  155 -
 .../addon/cocoapods/CocoaPodsAddon.java            |   53 -
 .../org/artifactory/addon/debian/DebianAddon.java  |   53 -
 .../addon/debian/DebianCalculationEvent.java       |  145 -
 .../artifactory/addon/debian/HaDebianMessage.java  |   38 -
 .../org/artifactory/addon/docker/DockerAddon.java  |   47 -
 .../addon/docker/DockerBlobInfoModel.java          |   27 -
 .../org/artifactory/addon/docker/DockerLabel.java  |   30 -
 .../addon/docker/DockerTagInfoModel.java           |   20 -
 .../addon/docker/DockerV2InfoModel.java            |   14 -
 .../docker/rest/DockerRemoteTokenProvider.java     |  116 -
 .../addon/docker/rest/DockerTokenCacheKey.java     |   71 -
 .../addon/dpkgcommon/DpkgCalculationEvent.java     |   58 -
 .../filteredresources/FilteredResourcesAddon.java  |  107 -
 .../artifactory/addon/gems/ArtifactGemsInfo.java   |   91 -
 .../java/org/artifactory/addon/gems/GemsAddon.java |   18 -
 .../org/artifactory/addon/gems/GemsDependInfo.java |   30 -
 .../artifactory/addon/gems/GemsDependsInfo.java    |   35 -
 .../org/artifactory/addon/gitlfs/GitLfsAddon.java  |   17 -
 .../org/artifactory/addon/ha/HaCommonAddon.java    |   94 -
 .../artifactory/addon/ha/message/HaMessage.java    |    9 -
 .../addon/ha/message/HaMessageTopic.java           |   25 -
 .../addon/ha/message/NuPkgHaMessage.java           |   32 -
 .../addon/ha/message/WatchesHaMessage.java         |   46 -
 .../addon/ha/semaphore/JVMSemaphoreWrapper.java    |   30 -
 .../addon/ha/semaphore/SemaphoreWrapper.java       |   12 -
 .../artifactory/addon/ldapgroup/LdapUserGroup.java |   87 -
 .../addon/ldapgroup/LdapUserGroupAddon.java        |   37 -
 .../addon/license/LicenseInstaller.java            |   76 -
 .../artifactory/addon/license/LicenseStatus.java   |   68 -
 .../artifactory/addon/license/LicensesAddon.java   |  108 -
 .../addon/license/VerificationResult.java          |   81 -
 .../java/org/artifactory/addon/npm/NpmAddon.java   |   42 -
 .../org/artifactory/addon/npm/NpmDependency.java   |   31 -
 .../java/org/artifactory/addon/npm/NpmInfo.java    |   74 -
 .../org/artifactory/addon/npm/NpmMetadataInfo.java |   33 -
 .../org/artifactory/addon/nuget/NuGetAuthUtil.java |   73 -
 .../org/artifactory/addon/nuget/UiNuGetAddon.java  |   15 -
 .../org/artifactory/addon/oauth/OAuthHandler.java  |   45 -
 .../org/artifactory/addon/oauth/OAuthLoginUrl.java |   34 -
 .../addon/oauth/OAuthProvidersTypeEnum.java        |    8 -
 .../org/artifactory/addon/oauth/OAuthSsoAddon.java |   10 -
 .../org/artifactory/addon/opkg/HaOpkgMessage.java  |   37 -
 .../java/org/artifactory/addon/opkg/OpkgAddon.java |   18 -
 .../addon/opkg/OpkgCalculationEvent.java           |  103 -
 .../java/org/artifactory/addon/p2/P2Addon.java     |   47 -
 .../main/java/org/artifactory/addon/p2/P2Repo.java |   77 -
 .../org/artifactory/addon/plugin/PluginAction.java |   26 -
 .../org/artifactory/addon/plugin/PluginsAddon.java |   71 -
 .../artifactory/addon/plugin/RemoteRequestCtx.java |   18 -
 .../addon/plugin/ResourceStreamCtx.java            |   47 -
 .../org/artifactory/addon/plugin/ResponseCtx.java  |   56 -
 .../addon/properties/ArtifactPropertiesAddon.java  |   22 -
 .../java/org/artifactory/addon/pypi/PypiAddon.java |   41 -
 .../org/artifactory/addon/pypi/PypiPkgInfo.java    |  126 -
 .../artifactory/addon/pypi/PypiPkgMetadata.java    |   64 -
 .../replication/LocalReplicationSettings.java      |   99 -
 .../LocalReplicationSettingsBuilder.java           |   77 -
 .../replication/RemoteReplicationSettings.java     |  117 -
 .../RemoteReplicationSettingsBuilder.java          |  109 -
 .../addon/replication/ReplicationAddon.java        |   87 -
 .../addon/replication/ReplicationBaseSettings.java |  102 -
 .../addon/search/ArtifactSearchAddon.java          |   15 -
 .../addon/smartrepo/SmartRepoAddon.java            |   25 -
 .../org/artifactory/addon/sso/HttpSsoAddon.java    |   32 -
 .../artifactory/addon/sso/crowd/CrowdAddon.java    |   94 -
 .../artifactory/addon/sso/crowd/CrowdExtGroup.java |   82 -
 .../artifactory/addon/sso/saml/SamlException.java  |   34 -
 .../artifactory/addon/sso/saml/SamlHandler.java    |   33 -
 .../artifactory/addon/sso/saml/SamlSsoAddon.java   |   22 -
 .../artifactory/addon/support/SupportAddon.java    |   54 -
 .../addon/watch/ArtifactWatchAddon.java            |   72 -
 .../addon/webstart/ArtifactWebstartAddon.java      |   51 -
 .../artifactory/addon/yum/ArtifactRpmMetadata.java |   93 -
 .../artifactory/addon/yum/GeneralRpmMetadata.java  |   72 -
 .../artifactory/addon/yum/MetadataChangeLog.java   |   40 -
 .../org/artifactory/addon/yum/MetadataEntry.java   |   71 -
 .../org/artifactory/addon/yum/MiscRpmMetadata.java |   53 -
 .../java/org/artifactory/addon/yum/YumAddon.java   |   66 -
 .../artifactory/api/jackson/JacksonFactory.java    |  203 -
 .../org/artifactory/api/jackson/JacksonReader.java |  111 -
 .../org/artifactory/api/jackson/JacksonWriter.java |   54 -
 .../build/ArtifactoryBuildArtifact.java            |   55 -
 .../java/org/artifactory/build/BuildInfoUtils.java |   31 -
 .../artifactory/concurrent/ExpiringDelayed.java    |   76 -
 .../artifactory/concurrent/LockingException.java   |   35 -
 .../java/org/artifactory/concurrent/State.java     |   27 -
 .../org/artifactory/concurrent/StateAware.java     |   26 -
 .../artifactory/config/ConfigurationException.java |   30 -
 .../config/CronConfigurationException.java         |   34 -
 .../config/xml/ArtifactoryXmlFactory.java          |   56 -
 .../config/xml/EntityResolvingContentHandler.java  |  129 -
 .../converters/ConvertersManagerImpl.java          |  287 --
 .../converters/VersionProviderImpl.java            |  243 --
 .../main/java/org/artifactory/cron/CronUtils.java  |  106 -
 .../exception/InvalidNameException.java            |   33 -
 .../artifactory/exception/ValidationException.java |   35 -
 .../org/artifactory/features/VersionFeature.java   |   85 -
 .../org/artifactory/features/VersionFeatures.java  |  188 -
 .../features/matrix/SmartRepoVersionFeatures.java  |   49 -
 .../artifactory/file/lock/ArtifactoryLockFile.java |  102 -
 .../java/org/artifactory/file/lock/LockFile.java   |   30 -
 .../lock/LockFileForNoneLockingFileSystem.java     |   86 -
 .../main/java/org/artifactory/io/FileUtils.java    |   94 -
 .../main/java/org/artifactory/ivy/IvyNaming.java   |   39 -
 .../org/artifactory/logging/LoggingService.java    |   29 -
 .../org/artifactory/maven/MavenModelUtils.java     |  532 ---
 .../org/artifactory/maven/MavenPomBuilder.java     |   66 -
 .../org/artifactory/maven/MavenServiceImpl.java    |  259 --
 .../artifactory/maven/PomTargetPathValidator.java  |  161 -
 .../mbean/MBeanRegistrationService.java            |  212 -
 .../java/org/artifactory/mbean/ThreadDumper.java   |  202 -
 .../java/org/artifactory/nuget/NuDependency.java   |   44 -
 .../java/org/artifactory/nuget/NuMetaData.java     |  197 -
 .../artifactory/nuget/NuSpecFrameworkAssembly.java |   61 -
 .../artifactory/observers/CloseableObserver.java   |   33 -
 .../repo/HttpRepositoryConfigurationImpl.java      |  542 ---
 .../repo/LocalRepositoryConfigurationImpl.java     |  199 -
 .../java/org/artifactory/repo/RepoDetails.java     |  158 -
 .../java/org/artifactory/repo/RepoDetailsType.java |   48 -
 .../repo/RepositoryConfigurationBase.java          |  373 --
 .../repo/VirtualRepositoryConfigurationImpl.java   |  154 -
 .../distribution/auth/BintrayTokenProvider.java    |   70 -
 .../repo/http/CloseableHttpClientDecorator.java    |  159 -
 .../repo/http/IdleConnectionMonitorService.java    |   65 -
 .../http/IdleConnectionMonitorServiceImpl.java     |  188 -
 .../repo/http/kerberos/KerberosAuthProvider.java   |  255 --
 .../repo/interceptor/ImportInterceptors.java       |   28 -
 .../StorageAggregationInterceptors.java            |   28 -
 .../repo/interceptor/StorageInterceptors.java      |   28 -
 .../repo/reverseProxy/ApacheTemplateProvider.java  |   93 -
 .../repo/reverseProxy/NginxTemplateProvider.java   |   64 -
 .../repo/reverseProxy/ReverseProxyPorts.java       |   44 -
 .../reverseProxy/ReverseProxyTemplateProvider.java |  426 --
 .../org/artifactory/repo/trash/TrashService.java   |   42 -
 .../request/ArtifactoryResponseBase.java           |  195 -
 .../request/RemoteRequestException.java            |   53 -
 .../artifactory/request/RepoRequestContext.java    |  104 -
 .../java/org/artifactory/request/RepoRequests.java |   83 -
 .../artifactory/request/RequestThreadLocal.java    |   45 -
 .../request/RequestThreadLocalContext.java         |   25 -
 .../org/artifactory/request/RequestWrapper.java    |   24 -
 .../request/ResponseStatusCodesMapper.java         |   49 -
 .../request/ResponseWithStatusHolderMapper.java    |   46 -
 .../request/TraceLoggingRepoRequestContext.java    |   49 -
 .../java/org/artifactory/rest/ErrorResponse.java   |   63 -
 .../org/artifactory/search/SearchTreeBuilder.java  |   98 -
 .../org/artifactory/security/AccessLogger.java     |  177 -
 .../artifactory/security/AuthenticationHelper.java |   57 -
 .../security/GroupConfigurationImpl.java           |  110 -
 .../security/HttpAuthenticationDetails.java        |   48 -
 .../security/HttpAuthenticationDetailsSource.java  |   41 -
 ...nternalUsernamePasswordAuthenticationToken.java |   31 -
 .../org/artifactory/security/LoginHandler.java     |   41 -
 .../org/artifactory/security/LoginHandlerImpl.java |  101 -
 .../PermissionTargetConfigurationImpl.java         |  116 -
 .../security/PrincipalConfigurationImpl.java       |   75 -
 .../security/SecurityEntityListItem.java           |   80 -
 .../security/UserConfigurationImpl.java            |  181 -
 .../security/crypto/ArtifactoryBase58.java         |  322 --
 .../security/crypto/ArtifactoryBase64.java         |  121 -
 .../artifactory/security/crypto/CryptoHelper.java  |  375 --
 .../exceptions/LoginDisabledException.java         |  162 -
 .../exceptions/PasswordChangeException.java        |   16 -
 .../exceptions/PasswordExpireException.java        |   16 -
 .../UserCredentialsExpiredException.java           |   30 -
 .../security/exceptions/UserLockedException.java   |   72 -
 .../MissionControlAuthenticationProvider.java      |   36 -
 .../mission/control/MissionControlProperties.java  |  112 -
 .../security/props/auth/ApiKeyManager.java         |   21 -
 .../security/props/auth/CacheWrapper.java          |   65 -
 .../security/props/auth/DockerTokenManager.java    |   21 -
 .../security/props/auth/OauthManager.java          |   21 -
 .../props/auth/PropsAuthenticationToken.java       |   67 -
 .../security/props/auth/PropsTokenCache.java       |   17 -
 .../security/props/auth/PropsTokenCacheImpl.java   |   62 -
 .../security/props/auth/PropsTokenManager.java     |  139 -
 .../security/props/auth/SimpleCacheWrapper.java    |   36 -
 .../security/props/auth/SshTokenManager.java       |   21 -
 .../security/props/auth/TokenManager.java          |   76 -
 .../props/auth/model/AuthenticationModel.java      |   49 -
 .../props/auth/model/OauthDockerErrorModel.java    |   34 -
 .../security/props/auth/model/OauthErrorEnum.java  |   21 -
 .../security/props/auth/model/OauthErrorModel.java |   55 -
 .../security/props/auth/model/OauthModel.java      |    7 -
 .../security/props/auth/model/TokenKeyValue.java   |   59 -
 .../security/providermgr/ArtifactoryCacheKey.java  |   81 -
 .../providermgr/ArtifactoryTokenProvider.java      |   83 -
 .../security/providermgr/DockerCacheKey.java       |   21 -
 .../security/providermgr/DockerProviderMgr.java    |   78 -
 .../security/providermgr/ProviderMgr.java          |   11 -
 .../spring/ContextReadinessListener.java           |   38 -
 .../artifactory/spring/LicenseEventListener.java   |   37 -
 .../java/org/artifactory/spring/Reloadable.java    |   51 -
 .../org/artifactory/spring/ReloadableBean.java     |   49 -
 .../artifactory/state/ArtifactoryServerState.java  |   25 -
 .../state/model/ArtifactoryStateManager.java       |   22 -
 .../org/artifactory/storage/BinariesSummary.java   |   71 -
 .../storage/FileStoreStorageSummary.java           |  126 -
 .../org/artifactory/storage/FileStoreSummary.java  |   54 -
 .../org/artifactory/storage/LinkedProperties.java  |  209 -
 .../org/artifactory/storage/RepositorySummary.java |  112 -
 .../org/artifactory/storage/StorageProperties.java |  383 --
 .../org/artifactory/storage/StorageService.java    |   76 -
 .../org/artifactory/storage/StorageSummary.java    |   40 -
 .../artifactory/storage/StorageSummaryImpl.java    |  173 -
 .../artifactory/storage/StorageSummaryInfo.java    |   94 -
 .../java/org/artifactory/storage/db/DbType.java    |   44 -
 .../storage/db/properties/model/DbProperties.java  |   48 -
 .../ArtifactoryCommonDbPropertiesService.java      |   34 -
 .../db/servers/model/ArtifactoryServer.java        |  157 -
 .../db/servers/model/ArtifactoryServerRole.java    |   26 -
 .../service/ArtifactoryHeartbeatService.java       |   10 -
 .../service/ArtifactoryServersCommonService.java   |  134 -
 .../java/org/artifactory/util/ArchiveUtils.java    |  170 -
 .../util/AutoTimeoutRegexCharSequence.java         |   48 -
 .../java/org/artifactory/util/CollectionUtils.java |   55 -
 .../java/org/artifactory/util/FileWatchDog.java    |  106 -
 .../java/org/artifactory/util/GlobalExcludes.java  |  115 -
 .../artifactory/util/HttpClientConfigurator.java   |  589 ---
 .../java/org/artifactory/util/HttpClientUtils.java |  116 -
 .../main/java/org/artifactory/util/HttpUtils.java  |  484 --
 .../java/org/artifactory/util/NameValidator.java   |   40 -
 .../java/org/artifactory/util/NumberFormatter.java |   65 -
 .../java/org/artifactory/util/PathMatcher.java     |   79 -
 .../java/org/artifactory/util/PathValidator.java   |  115 -
 .../main/java/org/artifactory/util/PerfTimer.java  |   82 -
 .../util/PreemptiveAuthInterceptor.java            |   64 -
 .../util/ProxyPreemptiveAuthInterceptor.java       |   76 -
 .../java/org/artifactory/util/RepoPathUtils.java   |   55 -
 .../java/org/artifactory/util/SessionUtils.java    |   32 -
 .../java/org/artifactory/util/StringUtils.java     |   59 -
 .../java/org/artifactory/util/TimeUnitFormat.java  |   68 -
 .../java/org/artifactory/util/UiRequestUtils.java  |  263 --
 .../java/org/artifactory/util/UrlValidator.java    |  113 -
 .../main/java/org/artifactory/util/ZipUtils.java   |  543 ---
 .../org/artifactory/util/bearer/BearerScheme.java  |   88 -
 .../util/bearer/BearerSchemeFactory.java           |   24 -
 .../BintrayBearerPreemptiveAuthInterceptor.java    |   45 -
 .../org/artifactory/util/bearer/TokenProvider.java |   13 -
 .../org/artifactory/util/dateUtils/DateUtils.java  |   27 -
 .../java/org/artifactory/util/encodeing/URI.java   | 1203 -----
 .../org/artifactory/util/encodeing/URIUtil.java    |  160 -
 .../webapp/servlet/DelayedHttpResponse.java        |  192 -
 .../artifactory/webapp/servlet/DelayedInit.java    |   32 -
 .../webapp/servlet/HttpArtifactoryResponse.java    |  196 -
 .../webapp/servlet/TraceLoggingResponse.java       |  224 -
 .../common/src/main/resources/templates/apache.ftl |   79 -
 base/common/src/main/resources/templates/nginx.ftl |   61 -
 .../java/org/artifactory/addon/AddonTypeTest.java  |   51 -
 .../org/artifactory/build/BuildInfoIOTest.java     |   52 -
 .../java/org/artifactory/common/IvyNamingTest.java |   46 -
 .../converters/ConvertersManagerTest.java          |  145 -
 .../ConvertersManagerWithRevertBackupTest.java     |  123 -
 .../helpers/ConvertersManagerTestHelper.java       |  173 -
 .../converters/helpers/MockArtifactoryContext.java |  170 -
 .../converters/helpers/MockArtifactoryHome.java    |   58 -
 .../MockArtifactoryServersCommonService.java       |  109 -
 .../helpers/MockArtifactoryStateManager.java       |   38 -
 .../helpers/MockDbPropertiesService.java           |   44 -
 .../converters/helpers/MockHomeConverter.java      |   65 -
 .../org/artifactory/maven/MavenModelUtilsTest.java |  257 --
 .../org/artifactory/maven/MavenNamingTest.java     |  305 --
 .../org/artifactory/maven/MavenPomBuilderTest.java |   43 -
 .../artifactory/maven/MavenServiceImplTest.java    |   52 -
 .../maven/PomTargetPathValidatorTest.java          |   84 -
 .../java/org/artifactory/repo/RepoDetailsTest.java |  106 -
 .../org/artifactory/repo/RepoDetailsTypeTest.java  |   41 -
 .../request/ArtifactoryResponseTest.java           |  113 -
 .../CustomizedEncryptedPasswordPrefixTest.java     |   85 -
 .../security/GroupConfigurationImplTest.java       |   52 -
 .../PermissionTargetConfigurationImplTest.java     |   63 -
 .../security/PrincipalConfigurationImplTest.java   |   58 -
 .../security/SecurityEntityListItemTest.java       |   46 -
 .../security/UserConfigurationImplTest.java        |   73 -
 .../security/crypto/ArtifactoryBase58Test.java     |   66 -
 .../security/crypto/CryptoHelperTest.java          |  350 --
 .../artifactory/storage/LinkedPropertiesTest.java  |   38 -
 .../org/artifactory/storage/StorageUnitTest.java   |  101 -
 .../java/org/artifactory/util/HttpUtilsTest.java   |  120 -
 .../org/artifactory/util/NumberFormatterTest.java  |   58 -
 .../org/artifactory/util/PathValidatorTest.java    |  138 -
 .../artifactory/util/StringInputStreamTest.java    |   53 -
 .../org/artifactory/util/TimeUnitFormatTest.java   |   61 -
 .../org/artifactory/util/UrlValidatorTest.java     |   69 -
 .../java/org/artifactory/util/ZipUtilsTest.java    |  156 -
 .../templates/cluster/3.1.0/artifactory.properties |   21 -
 .../converters/templates/cluster/3.1.0/logback.xml |  173 -
 .../templates/cluster/3.1.0/mimetypes.xml          |   74 -
 .../templates/home/3.0.1/artifactory.properties    |   21 -
 .../converters/templates/home/3.0.1/logback.xml    |  163 -
 .../converters/templates/home/3.0.1/mimetypes.xml  |   78 -
 .../templates/home/3.0.4/artifactory.properties    |   21 -
 .../converters/templates/home/3.0.4/logback.xml    |  163 -
 .../converters/templates/home/3.0.4/mimetypes.xml  |   80 -
 .../templates/home/3.1.0/artifactory.properties    |   21 -
 .../converters/templates/home/3.1.0/logback.xml    |  163 -
 .../converters/templates/home/3.1.0/mimetypes.xml  |   80 -
 base/common/src/test/resources/gziptest.tar.gz     |  Bin 164 -> 0 bytes
 .../org/artifactory/maven/maven-metadata.xml       |   37 -
 .../org/artifactory/maven/maven-null-plugin.pom    |    8 -
 .../org/artifactory/maven/maven3-metadata.xml      |   34 -
 .../org/artifactory/maven/testng-5.11-jdk15.jar    |    8 -
 .../org/artifactory/maven/yourpit-1.0.0-alpha2.pom |   26 -
 base/common/src/test/resources/tartest.tar         |  Bin 3584 -> 0 bytes
 base/common/src/test/resources/tgztest.tgz         |  Bin 198 -> 0 bytes
 base/common/src/test/resources/unsupported.ar      |    0
 .../src/test/resources/zip-with-symlinks.tar.gz    |  Bin 6586 -> 0 bytes
 base/common/src/test/resources/ziptest.zip         |  Bin 334 -> 0 bytes
 base/config/pom.xml                                |  117 -
 .../META-INF/artifactory.properties                |   21 -
 .../main/java/org/artifactory/addon/AddonInfo.java |  171 -
 .../java/org/artifactory/addon/AddonState.java     |   52 -
 .../org/artifactory/common/ArtifactoryHome.java    |  559 ---
 .../org/artifactory/common/ConstantValues.java     |  266 --
 .../artifactory/common/ha/ClusterProperties.java   |   60 -
 .../artifactory/common/ha/HaNodeProperties.java    |  112 -
 .../common/property/ArtifactoryConverter.java      |   15 -
 .../property/ArtifactorySystemProperties.java      |  317 --
 .../common/property/FatalConversionException.java  |   33 -
 .../property/MinutesToSecondsPropertyMapper.java   |   46 -
 .../property/MovedToConfigPropertyMapper.java      |   17 -
 .../common/property/NoopPropertyMapper.java        |   34 -
 .../common/property/NullPropertyMapper.java        |   34 -
 .../common/property/PropertyMapper.java            |   34 -
 .../common/property/PropertyMapperBase.java        |   35 -
 .../converters/ArtifactoryConverterAdapter.java    |   18 -
 .../artifactory/converters/ConverterManager.java   |   19 -
 .../artifactory/converters/LoggingConverter.java   |  115 -
 .../artifactory/converters/MimeTypeConverter.java  |  118 -
 .../artifactory/converters/VersionProvider.java    |   37 -
 .../org/artifactory/descriptor/Descriptor.java     |   29 -
 .../artifactory/descriptor/DescriptorAware.java    |   29 -
 .../org/artifactory/descriptor/TaskDescriptor.java |   28 -
 .../descriptor/addon/AddonSettings.java            |   55 -
 .../artifactory/descriptor/addon/package-info.java |   28 -
 .../descriptor/backup/BackupDescriptor.java        |  222 -
 .../descriptor/backup/package-info.java            |   28 -
 .../bintray/BintrayConfigDescriptor.java           |   59 -
 .../descriptor/bintray/package-info.java           |   27 -
 .../cleanup/CleanupConfigDescriptor.java           |   79 -
 .../descriptor/cleanup/package-info.java           |   29 -
 .../descriptor/config/CentralConfigDescriptor.java |  171 -
 .../config/CentralConfigDescriptorImpl.java        | 1348 ------
 .../config/MutableCentralConfigDescriptor.java     |  317 --
 .../descriptor/config/package-info.java            |   29 -
 .../delegation/ContentSynchronisation.java         |  137 -
 .../descriptor/delegation/PropertiesContent.java   |   88 -
 .../descriptor/delegation/SourceContent.java       |   83 -
 .../descriptor/delegation/StatisticsContent.java   |   89 -
 .../descriptor/delegation/package-info.java        |   27 -
 .../download/FolderDownloadConfigDescriptor.java   |  111 -
 .../descriptor/download/package-info.java          |   27 -
 .../external/BlackDuckSettingsDescriptor.java      |  146 -
 .../external/ExternalProvidersDescriptor.java      |   42 -
 .../descriptor/external/package-info.java          |   29 -
 .../descriptor/gc/GcConfigDescriptor.java          |   77 -
 .../artifactory/descriptor/gc/package-info.java    |   29 -
 .../descriptor/index/IndexerDescriptor.java        |  128 -
 .../artifactory/descriptor/index/package-info.java |   28 -
 .../descriptor/mail/MailServerDescriptor.java      |  131 -
 .../artifactory/descriptor/mail/package-info.java  |   28 -
 .../message/SystemMessageDescriptor.java           |  126 -
 .../descriptor/message/package-info.java           |   27 -
 .../descriptor/property/PredefinedValue.java       |   84 -
 .../artifactory/descriptor/property/Property.java  |  203 -
 .../descriptor/property/PropertySet.java           |  137 -
 .../descriptor/property/PropertyType.java          |   44 -
 .../descriptor/property/package-info.java          |   27 -
 .../descriptor/quota/QuotaConfigDescriptor.java    |   95 -
 .../artifactory/descriptor/quota/package-info.java |   27 -
 .../descriptor/reader/CentralConfigReader.java     |  101 -
 .../GlobalReplicationsConfigDescriptor.java        |   32 -
 .../replication/LocalReplicationDescriptor.java    |  149 -
 .../replication/RemoteReplicationDescriptor.java   |   31 -
 .../replication/ReplicationBaseDescriptor.java     |  162 -
 .../descriptor/replication/package-info.java       |   28 -
 .../descriptor/repo/BintrayApplicationConfig.java  |  126 -
 .../descriptor/repo/BowerConfiguration.java        |   24 -
 .../descriptor/repo/ChecksumPolicyType.java        |   45 -
 .../descriptor/repo/CocoaPodsConfiguration.java    |   36 -
 .../descriptor/repo/DockerApiVersion.java          |   41 -
 .../repo/EmptyVirtualResolverFilter.java           |   34 -
 .../repo/ExternalDependenciesConfig.java           |   70 -
 .../descriptor/repo/HttpRepoDescriptor.java        |  136 -
 .../descriptor/repo/LocalCacheRepoDescriptor.java  |  174 -
 .../descriptor/repo/LocalRepoAlphaComparator.java  |   42 -
 .../repo/LocalRepoChecksumPolicyType.java          |   43 -
 .../descriptor/repo/LocalRepoDescriptor.java       |  103 -
 .../descriptor/repo/NuGetConfiguration.java        |   57 -
 .../descriptor/repo/P2Configuration.java           |   49 -
 .../descriptor/repo/PomCleanupPolicy.java          |   42 -
 .../descriptor/repo/ProxyDescriptor.java           |  152 -
 .../descriptor/repo/PypiConfiguration.java         |   36 -
 .../descriptor/repo/RealRepoDescriptor.java        |  172 -
 .../descriptor/repo/RemoteRepoDescriptor.java      |  323 --
 .../descriptor/repo/RepoBaseDescriptor.java        |  189 -
 .../descriptor/repo/RepoDescriptor.java            |   61 -
 .../artifactory/descriptor/repo/RepoLayout.java    |  139 -
 .../descriptor/repo/RepoLayoutBuilder.java         |   81 -
 .../org/artifactory/descriptor/repo/RepoType.java  |   73 -
 .../descriptor/repo/ReverseProxyDescriptor.java    |  243 --
 .../descriptor/repo/ReverseProxyMethod.java        |   44 -
 .../descriptor/repo/ReverseProxyRepoConfig.java    |   55 -
 .../descriptor/repo/SnapshotVersionBehavior.java   |   53 -
 .../org/artifactory/descriptor/repo/SslType.java   |   44 -
 .../descriptor/repo/TrashRepoDescriptor.java       |   41 -
 .../descriptor/repo/VcsConfiguration.java          |   39 -
 .../descriptor/repo/VcsGitConfiguration.java       |   83 -
 .../descriptor/repo/VirtualRepoDescriptor.java     |  131 -
 .../descriptor/repo/VirtualRepoResolver.java       |  151 -
 .../descriptor/repo/VirtualResolverFilter.java     |   34 -
 .../artifactory/descriptor/repo/WebServerType.java |   44 -
 .../repo/distribution/DistributionCoordinates.java |  103 -
 .../distribution/DistributionRepoDescriptor.java   |  162 -
 .../descriptor/repo/distribution/package-info.java |   27 -
 .../rule/DefaultDistributionRules.java             |  118 -
 .../repo/distribution/rule/DistributionRule.java   |  125 -
 .../distribution/rule/DistributionRuleFactory.java |   10 -
 .../repo/distribution/rule/package-info.java       |   27 -
 .../jaxb/BintrayApplicationConfigsMapAdapter.java  |   60 -
 .../jaxb/DistributionRepositoriesMapAdapter.java   |   60 -
 .../repo/jaxb/LocalRepositoriesMapAdapter.java     |   77 -
 .../repo/jaxb/RemoteRepositoriesMapAdapter.java    |   84 -
 .../repo/jaxb/RepositoriesListAdapter.java         |   72 -
 .../repo/jaxb/VirtualRepositoriesMapAdapter.java   |   80 -
 .../artifactory/descriptor/repo/package-info.java  |   28 -
 .../repo/vcs/AbstractVcsProviderConfiguration.java |   93 -
 .../vcs/VcsArtifactoryProviderConfiguration.java   |   35 -
 .../vcs/VcsBitbucketProviderConfiguration.java     |   33 -
 .../repo/vcs/VcsCustomProviderConfiguration.java   |   29 -
 .../descriptor/repo/vcs/VcsGitProvider.java        |   76 -
 .../repo/vcs/VcsGitProviderConfiguration.java      |   38 -
 .../repo/vcs/VcsProviderConfiguration.java         |   38 -
 .../repo/vcs/VcsStashProviderConfiguration.java    |   33 -
 .../artifactory/descriptor/repo/vcs/VcsType.java   |   43 -
 .../descriptor/repo/vcs/VcsUrlBuilder.java         |   88 -
 .../descriptor/security/EncryptionPolicy.java      |   32 -
 .../security/PasswordExpirationPolicy.java         |  118 -
 .../descriptor/security/PasswordSettings.java      |  107 -
 .../descriptor/security/SecurityDescriptor.java    |  459 --
 .../descriptor/security/UserLockPolicy.java        |   87 -
 .../descriptor/security/debian/DebianSettings.java |   66 -
 .../descriptor/security/debian/package-info.java   |   28 -
 .../descriptor/security/ldap/LdapSetting.java      |  220 -
 .../descriptor/security/ldap/SearchPattern.java    |  142 -
 .../ldap/group/LdapGroupPopulatorStrategies.java   |   44 -
 .../security/ldap/group/LdapGroupSetting.java      |  200 -
 .../security/ldap/group/package-info.java          |   28 -
 .../descriptor/security/ldap/package-info.java     |   28 -
 .../security/oauth/OAuthProviderSettings.java      |  139 -
 .../descriptor/security/oauth/OAuthSettings.java   |  110 -
 .../descriptor/security/oauth/package-info.java    |   29 -
 .../descriptor/security/package-info.java          |   28 -
 .../security/sshserver/SshServerSettings.java      |   81 -
 .../security/sshserver/package-info.java           |   28 -
 .../descriptor/security/sso/CrowdSettings.java     |  192 -
 .../descriptor/security/sso/HttpSsoSettings.java   |  111 -
 .../descriptor/security/sso/SamlSettings.java      |  168 -
 .../descriptor/security/sso/package-info.java      |   28 -
 .../trashcan/TrashcanConfigDescriptor.java         |   90 -
 .../descriptor/trashcan/package-info.java          |   27 -
 .../org/artifactory/info/ArtifactoryPropInfo.java  |   69 -
 .../org/artifactory/info/BasePropInfoGroup.java    |   57 -
 .../org/artifactory/info/ClassPathPropInfo.java    |   35 -
 .../main/java/org/artifactory/info/HaPropInfo.java |   37 -
 .../java/org/artifactory/info/HostPropInfo.java    |  101 -
 .../main/java/org/artifactory/info/InfoObject.java |   65 -
 .../main/java/org/artifactory/info/InfoWriter.java |  148 -
 .../java/org/artifactory/info/JavaSysPropInfo.java |   88 -
 .../java/org/artifactory/info/PropInfoGroup.java   |   34 -
 .../org/artifactory/info/SystemPropInfoGroup.java  |   76 -
 .../java/org/artifactory/info/UserPropInfo.java    |   36 -
 .../main/java/org/artifactory/jaxb/JaxbHelper.java |  166 -
 .../logging/version/LoggingVersion.java            |  137 -
 .../logging/version/v1/LogbackConfigSwapper.java   |   58 -
 .../version/v3/LogbackJFrogInfoConverter.java      |   56 -
 .../java/org/artifactory/mime/DebianNaming.java    |   94 -
 .../java/org/artifactory/mime/MavenNaming.java     |  256 --
 .../main/java/org/artifactory/mime/MimeType.java   |  145 -
 .../java/org/artifactory/mime/MimeTypeBuilder.java |   88 -
 .../main/java/org/artifactory/mime/MimeTypes.java  |   89 -
 .../java/org/artifactory/mime/MimeTypesReader.java |  117 -
 .../java/org/artifactory/mime/NamingUtils.java     |  308 --
 .../artifactory/mime/version/MimeTypesVersion.java |  150 -
 .../version/converter/LatestVersionConverter.java  |   39 -
 .../version/converter/MimeTypeConverterBase.java   |   89 -
 .../version/converter/v1/XmlIndexedConverter.java  |   58 -
 .../version/converter/v2/AscMimeTypeConverter.java |   62 -
 .../converter/v3/ArchivesIndexConverter.java       |   49 -
 .../converter/v3/NuPkgMimeTypeConverter.java       |   47 -
 .../version/converter/v4/GemMimeTypeConverter.java |   45 -
 .../converter/v5/JsonMimeTypeConverter.java        |   41 -
 .../converter/v6/DebianMimeTypeConverter.java      |   41 -
 .../converter/v7/ArchiveMimeTypeConverter.java     |   58 -
 .../org/artifactory/spring/SpringConfigPaths.java  |   69 -
 .../spring/SpringConfigResourceLoader.java         |  183 -
 .../artifactory/util/AlreadyExistsException.java   |   34 -
 .../artifactory/util/DoesNotExistException.java    |   34 -
 .../java/org/artifactory/util/EmailException.java  |   35 -
 .../java/org/artifactory/util/ExceptionUtils.java  |  101 -
 .../org/artifactory/util/ExistenceException.java   |   35 -
 .../src/main/java/org/artifactory/util/Files.java  |  326 --
 .../org/artifactory/util/InvalidNameException.java |   34 -
 .../org/artifactory/util/PrettyStaxDriver.java     |   52 -
 .../artifactory/util/RemoteCommandException.java   |   41 -
 .../java/org/artifactory/util/RepoLayoutUtils.java |  583 ---
 .../java/org/artifactory/util/ResourceUtils.java   |  134 -
 .../main/java/org/artifactory/util/Strings.java    |   98 -
 .../main/java/org/artifactory/util/XmlUtils.java   |   87 -
 .../util/distribution/DistributionConstants.java   |   42 -
 .../util/layouts/token/BaseTokenFilter.java        |   35 -
 .../util/layouts/token/ModuleInfoTokenFilter.java  |   31 -
 .../layouts/token/OrganizationPathTokenFilter.java |   46 -
 .../org/artifactory/util/stream/BiOptional.java    |   48 -
 .../version/ArtifactoryConfigVersion.java          |  400 --
 .../artifactory/version/ArtifactoryVersion.java    |  224 -
 .../version/ArtifactoryVersionReader.java          |  140 -
 .../version/CompoundVersionDetails.java            |  111 -
 .../org/artifactory/version/ConfigVersion.java     |   82 -
 .../version/SubConfigElementVersion.java           |   28 -
 .../org/artifactory/version/VersionComparator.java |   61 -
 .../org/artifactory/version/XmlConverterUtils.java |   50 -
 .../version/converter/ConfigurationConverter.java  |   28 -
 .../version/converter/NamespaceConverter.java      |   66 -
 .../converter/SnapshotUniqueVersionConverter.java  |   77 -
 .../version/converter/XmlConverter.java            |   31 -
 .../converter/v100/BackupToElementConverter.java   |   78 -
 .../converter/v100/RepositoriesKeysConverter.java  |   75 -
 .../v110/SnapshotNonUniqueValueConverter.java      |   62 -
 .../converter/v120/AnonAccessNameConverter.java    |   50 -
 .../v130/AnnonAccessUnderSecurityConverter.java    |   83 -
 .../converter/v130/BackupListConverter.java        |   55 -
 .../converter/v130/LdapSettings130Converter.java   |   56 -
 .../v131/LdapAuthenticationPatternsConverter.java  |   73 -
 .../version/converter/v132/BackupKeyConverter.java |   73 -
 .../version/converter/v132/LdapListConverter.java  |  160 -
 .../v134/BackupExcludedVirtualRepoConverter.java   |   74 -
 .../converter/v135/ProxyNTHostConverter.java       |   69 -
 .../v136/IndexerCronRemoverConverter.java          |   60 -
 .../converter/v136/RepositoryTypeConverter.java    |   74 -
 .../converter/v141/ProxyDefaultConverter.java      |   84 -
 .../converter/v1410/GcSystemPropertyConverter.java |   54 -
 .../v1412/IndexerCronExpPropertyConverter.java     |   61 -
 .../converter/v1414/ArchiveBrowsingConverter.java  |   45 -
 .../converter/v1414/AssumedOfflineConverter.java   |   63 -
 .../converter/v1414/CleanupConfigConverter.java    |   58 -
 .../v142/RepoIncludeExcludePatternsConverter.java  |   92 -
 .../v143/RemoteChecksumPolicyConverter.java        |   55 -
 .../converter/v144/MultiLdapXmlConverter.java      |   86 -
 .../converter/v144/ServerIdXmlConverter.java       |   46 -
 .../converter/v147/DefaultRepoLayoutConverter.java |  223 -
 .../v147/JfrogRemoteRepoUrlConverter.java          |   64 -
 .../v147/UnusedArtifactCleanupSwitchConverter.java |   63 -
 .../v149/ReplicationElementNameConverter.java      |   57 -
 .../converter/v152/BlackDuckProxyConverter.java    |   72 -
 .../v153/VirtualCacheCleanupConverter.java         |   49 -
 .../v160/AddonsDefaultLayoutConverter.java         |  159 -
 .../converter/v160/MavenIndexerConverter.java      |  117 -
 .../converter/v160/SingleRepoTypeConverter.java    |  248 --
 .../v160/SuppressConsitencyConverter.java          |  105 -
 .../v162/FolderDownloadConfigConverter.java        |   69 -
 .../v166/SourceDeletedDetectionConverter.java      |  102 -
 .../converter/v167/TrashcanConfigConverter.java    |   64 -
 .../converter/v167/UserLockConfigConverter.java    |   79 -
 .../converter/v168/PasswordPolicyConverter.java    |   78 -
 .../converter/v169/PasswordMaxAgeConverter.java    |   63 -
 .../converter/v171/SimpleLayoutConverter.java      |   59 -
 .../v172/BlockMismatchingMimeTypesConverter.java   |   79 -
 .../META-INF/default/artifactory.config.xml        |  300 --
 .../META-INF/default/artifactory.system.properties |  275 --
 .../resources/META-INF/default/db/derby.properties |   14 -
 .../main/resources/META-INF/default/logback.xml    |  170 -
 .../main/resources/META-INF/default/mimetypes.xml  |   83 -
 base/config/src/main/resources/artifactory.xsd     | 3500 ---------------
 .../main/resources/features/smartrepo-features.xml |   29 -
 .../org/artifactory/DefaultConfigLayoutTest.java   |   55 -
 .../common/ArtifactoryPropertiesTest.java          |  112 -
 .../org/artifactory/convert/XmlConverterTest.java  |   49 -
 .../descriptor/backup/BackupDescriptorTest.java    |   92 -
 .../config/CentralConfigDescriptorImplTest.java    |  423 --
 .../config/CentralConfigReadWriteTest.java         |  277 --
 .../descriptor/property/PredefinedValueTest.java   |   37 -
 .../descriptor/property/PropertySetTest.java       |   63 -
 .../descriptor/property/PropertyTest.java          |   40 -
 .../descriptor/reader/CentralConfigReaderTest.java |  113 -
 .../LocalReplicationDescriptorTest.java            |   69 -
 .../RemoteReplicationDescriptorTest.java           |   33 -
 .../replication/ReplicationBaseDescriptorTest.java |   61 -
 .../descriptor/repo/LocalRepoDescriptorTest.java   |   52 -
 .../descriptor/repo/ProxyDescriptorTest.java       |   56 -
 .../descriptor/repo/RemoteRepoDescriptorTest.java  |   64 -
 .../descriptor/repo/RepoLayoutTest.java            |  140 -
 .../descriptor/repo/VirtualRepoDescriptorTest.java |   42 -
 .../descriptor/repo/VirtualRepoResolverTest.java   |  165 -
 .../rule/DefaultDistributionRulesTest.java         |   50 -
 .../descriptor/security/PasswordSettingsTest.java  |   47 -
 .../security/SecurityDescriptorTest.java           |  155 -
 .../descriptor/security/ldap/LdapSettingTest.java  |   75 -
 .../security/sso/HttpSsoSettingsTest.java          |   44 -
 .../logging/version/LoggingVersionTest.java        |   34 -
 .../version/v1/LogbackConfigSwapperTest.java       |   81 -
 .../version/v3/LogbackJFrogInfoConverterTest.java  |   52 -
 .../mapper/MinutesToSecondsPropertyMapperTest.java |   42 -
 .../org/artifactory/mime/MimeTypesReaderTest.java  |   97 -
 .../java/org/artifactory/mime/MimeTypesTest.java   |   71 -
 .../mime/version/MimeTypesVersionTest.java         |   96 -
 .../converter/LatestVersionConverterTest.java      |   47 -
 .../version/converter/MimeTypeConverterTest.java   |   46 -
 .../converter/v1/XmlIndexedConverterTest.java      |   64 -
 .../converter/v2/AscMimeTypeConverterTest.java     |   48 -
 .../converter/v3/ArchivesIndexConverterTest.java   |   57 -
 .../converter/v3/NuPkgMimeTypeConverterTest.java   |   55 -
 .../converter/v4/GemMimeTypeConverterTest.java     |   56 -
 .../converter/v5/JsonMimeTypeConverterTest.java    |   52 -
 .../converter/v7/ArchiveMimeTypeConverterTest.java |   60 -
 .../artifactory/test/ArtifactoryHomeBoundTest.java |   79 -
 .../org/artifactory/test/ArtifactoryHomeStub.java  |   71 -
 .../test/java/org/artifactory/test/TestUtils.java  |  145 -
 .../org/artifactory/util/ExceptionUtilsTest.java   |   66 -
 .../test/java/org/artifactory/util/FilesTest.java  |  101 -
 .../java/org/artifactory/util/PathUtilsTest.java   |  226 -
 .../org/artifactory/util/RepoLayoutUtilsTest.java  |  423 --
 .../java/org/artifactory/util/StringsTest.java     |   59 -
 .../version/ArtifactoryConfigVersionTest.java      |   31 -
 .../version/ArtifactoryVersionReaderTest.java      |  115 -
 .../org/artifactory/version/ConfigVersionTest.java |   34 -
 .../version/ConfigXmlConversionTest.java           |  454 --
 .../java/org/artifactory/version/VersionTest.java  |   57 -
 .../converter/v135/ProxyNTHostConverterTest.java   |   57 -
 .../converter/v141/ProxyDefaultConverterTest.java  |   49 -
 .../v1410/GcSystemPropertyConverterTest.java       |   47 -
 .../v1412/IndexerCronExpPropertyConverterTest.java |   54 -
 .../v1414/ArchiveBrowsingConverterTest.java        |   56 -
 .../v1414/AssumedOfflineConverterTest.java         |   70 -
 .../v1414/CleanupConfigConverterTest.java          |   50 -
 .../v143/RemoteChecksumPolicyConverterTest.java    |   59 -
 .../converter/v144/MultiLdapXmlConverterTest.java  |   49 -
 .../converter/v144/ServerIdXmlConverterTest.java   |   54 -
 .../v147/DefaultRepoLayoutConverterTest.java       |  214 -
 .../v147/JfrogRemoteRepoUrlConverterTest.java      |   57 -
 .../UnusedArtifactCleanupSwitchConverterTest.java  |   57 -
 .../v149/ReplicationElementNameConverterTest.java  |   59 -
 .../converter/v152/BlackduckConverterTest.java     |   69 -
 .../v160/AddonsDefaultLayoutConverterTest.java     |  180 -
 .../converter/v160/MavenIndexerConverterTest.java  |   47 -
 .../v160/SingleRepoTypeConverterTest.java          |  107 -
 .../v162/FolderDownloadConfigConverterTest.java    |   36 -
 .../v167/TrashcanConfigConverterTest.java          |   33 -
 .../v169/PasswordMaxAgeConverterTest.java          |   27 -
 .../converter/v171/SimpleLayoutConverterTest.java  |   37 -
 .../BlockMismatchingMimeTypesConverterTest.java    |   27 -
 .../test/resources/META-INF/default/logback.xml    |  145 -
 .../test/resources/config/install/config.1.0.0.xml |  121 -
 .../test/resources/config/install/config.1.1.0.xml |  237 -
 .../test/resources/config/install/config.1.2.0.xml |  243 --
 .../test/resources/config/install/config.1.3.0.xml |  305 --
 .../test/resources/config/install/config.1.3.1.xml |  305 --
 .../test/resources/config/install/config.1.3.2.xml |  311 --
 .../test/resources/config/install/config.1.3.4.xml |  304 --
 .../test/resources/config/install/config.1.3.5.xml |  304 --
 .../test/resources/config/install/config.1.4.0.xml |  171 -
 .../test/resources/config/install/config.1.4.1.xml |  421 --
 .../resources/config/install/config.1.4.12.xml     |  439 --
 .../test/resources/config/install/config.1.4.2.xml |  351 --
 .../test/resources/config/install/config.1.4.3.xml |  352 --
 .../test/resources/config/install/config.1.4.7.xml |  411 --
 .../resources/config/system/artifactory.properties |   20 -
 .../config/system/artifactory.system.1.properties  |   22 -
 .../test/config-1.5.13-existing_addon_layout.xml   |  107 -
 .../test/config-1.5.13-maven_indexer_enabled.xml   |  150 -
 .../config-1.5.13-maven_indexer_no_excluded.xml    |  138 -
 .../config/test/config-1.5.13-multi_repo_type.xml  |  191 -
 .../test/config-1.5.13-no_addons_layouts.xml       |  100 -
 .../test/config-1.5.13-random_addon_layout.xml     |  114 -
 .../test/config-1.5.2-blackduck_default_proxy.xml  | 1089 -----
 .../config-1.5.2-blackduck_no_default_proxy.xml    | 1089 -----
 .../test/config-1.5.2-blackduck_no_settings.xml    | 1082 -----
 .../config/test/config-1.6.8-expires_in.xml        |  822 ----
 .../test/resources/config/test/config.1.0.0.xml    |  167 -
 .../config/test/config.1.0.0_no-backup-cron.xml    |   37 -
 .../test/resources/config/test/config.1.1.0.xml    |  178 -
 .../test/resources/config/test/config.1.2.0.xml    |  188 -
 .../test/resources/config/test/config.1.3.0.xml    |  180 -
 .../test/resources/config/test/config.1.3.1.xml    |  161 -
 .../test/resources/config/test/config.1.3.2.xml    |  311 --
 .../config/test/config.1.3.2_no-location.xml       |  180 -
 .../config/test/config.1.3.5_proxy-with-domain.xml |  311 --
 .../config/test/config.1.4.0_default-proxy.xml     |  195 -
 .../test/config.1.4.12_failed_retrieval_cache.xml  |  107 -
 .../test/config.1.4.13_with_archive_browsing.xml   |  439 --
 .../config/test/config.1.4.1_with_type.xml         |  238 -
 .../test/config.1.4.2_with_checksum_policy.xml     |   69 -
 .../config/test/config.1.4.3_with_serverId.xml     |  348 --
 .../config/test/config.1.4.3_without_multildap.xml |  288 --
 .../config/test/config.1.4.6_wrong_url.xml         |  363 --
 .../config/test/config.1.4.8_old_replication.xml   |  165 -
 .../resources/config/test/config.1.4.9.no.gc.xml   |  411 --
 .../config/test/config.1.5.0_indexing.xml          |   87 -
 base/config/src/test/resources/logback-test.xml    |   44 -
 .../org/artifactory/logging/version/v1/logback.xml |   74 -
 .../org/artifactory/logging/version/v2/logback.xml |  140 -
 .../org/artifactory/logging/version/v4/logback.xml |  140 -
 .../org/artifactory/logging/version/v5/logback.xml |  153 -
 .../org/artifactory/mime/mimetypes-test.xml        |   33 -
 .../org/artifactory/mime/version/mimetypes-v1.xml  |   72 -
 .../org/artifactory/mime/version/mimetypes-v2.xml  |   73 -
 .../org/artifactory/mime/version/mimetypes-v4.xml  |   78 -
 .../org/artifactory/mime/version/mimetypes-v5.xml  |   80 -
 .../org/artifactory/mime/version/mimetypes-v7.xml  |   83 -
 .../resources/version/artifactory1.2.5.properties  |   21 -
 base/log/pom.xml                                   |   53 -
 .../java/org/artifactory/log/BootstrapLogger.java  |   46 -
 .../converter/BackTraceLineOfCallerConverter.java  |   56 -
 .../logging/layout/BackTracePatternLayout.java     |   47 -
 base/log/src/main/resources/logback.xml            |   42 -
 base/papi/pom.xml                                  |   62 -
 .../addon/plugin/InfoEnabledPlugin.java            |   34 -
 .../java/org/artifactory/addon/plugin/Plugin.java  |   29 -
 .../org/artifactory/addon/plugin/PluginInfo.java   |  158 -
 .../main/java/org/artifactory/build/Artifact.java  |   53 -
 .../java/org/artifactory/build/ArtifactList.java   |  275 --
 .../main/java/org/artifactory/build/BuildFile.java |   49 -
 .../main/java/org/artifactory/build/BuildRun.java  |   45 -
 .../main/java/org/artifactory/build/Builds.java    |   81 -
 .../java/org/artifactory/build/Dependency.java     |   62 -
 .../java/org/artifactory/build/DependencyList.java |  275 --
 .../org/artifactory/build/DetailedBuildRun.java    |   70 -
 .../main/java/org/artifactory/build/Module.java    |   68 -
 .../java/org/artifactory/build/ReleaseStatus.java  |   85 -
 .../org/artifactory/build/ReleaseStatusList.java   |  278 --
 .../build/promotion/PromotionConfig.java           |   67 -
 .../build/staging/BuildStagingStrategy.java        |   72 -
 .../artifactory/build/staging/ModuleVersion.java   |   69 -
 .../org/artifactory/build/staging/VcsConfig.java   |   87 -
 .../org/artifactory/checksum/ChecksumInfo.java     |  155 -
 .../org/artifactory/checksum/ChecksumType.java     |  105 -
 .../org/artifactory/checksum/ChecksumsInfo.java    |  190 -
 .../src/main/java/org/artifactory/common/Info.java |   27 -
 .../java/org/artifactory/common/StatusEntry.java   |   93 -
 .../org/artifactory/common/StatusEntryLevel.java   |   43 -
 .../java/org/artifactory/common/StatusHolder.java  |   45 -
 .../org/artifactory/exception/CancelException.java |   50 -
 .../src/main/java/org/artifactory/fs/FileInfo.java |   39 -
 .../java/org/artifactory/fs/FileLayoutInfo.java    |   57 -
 .../main/java/org/artifactory/fs/FolderInfo.java   |   26 -
 .../src/main/java/org/artifactory/fs/ItemInfo.java |   56 -
 .../main/java/org/artifactory/fs/StatsInfo.java    |   42 -
 .../main/java/org/artifactory/md/MetadataInfo.java |   34 -
 .../org/artifactory/md/MutablePropertiesInfo.java  |   43 -
 .../main/java/org/artifactory/md/Properties.java   |   53 -
 .../java/org/artifactory/md/PropertiesFactory.java |   59 -
 .../java/org/artifactory/md/PropertiesInfo.java    |   61 -
 .../repo/HttpRepositoryConfiguration.java          |  106 -
 .../repo/LocalRepositoryConfiguration.java         |   53 -
 .../java/org/artifactory/repo/RemoteRepoPath.java  |   35 -
 .../main/java/org/artifactory/repo/RepoPath.java   |  100 -
 .../java/org/artifactory/repo/RepoPathFactory.java |   89 -
 .../java/org/artifactory/repo/Repositories.java    |  298 --
 .../artifactory/repo/RepositoryConfiguration.java  |   73 -
 .../repo/VirtualRepositoryConfiguration.java       |   44 -
 .../main/java/org/artifactory/request/Request.java |  116 -
 .../org/artifactory/request/RequestContext.java    |   47 -
 .../artifactory/request/RequestResponseInfo.java   |   72 -
 .../org/artifactory/resource/RepoResourceInfo.java |   61 -
 .../artifactory/resource/ResourceStreamHandle.java |   48 -
 .../main/java/org/artifactory/search/Searches.java |  116 -
 .../java/org/artifactory/security/RealmPolicy.java |   21 -
 .../java/org/artifactory/security/Security.java    |  175 -
 .../main/java/org/artifactory/security/User.java   |   79 -
 .../security/groups/CrowdGroupsSettings.java       |    7 -
 .../security/groups/LdapGroupsSettings.java        |    9 -
 .../security/groups/RealmAwareGroupsSettings.java  |    7 -
 .../main/java/org/artifactory/util/PathUtils.java  |  570 ---
 .../org/artifactory/util/StringInputStream.java    |   50 -
 .../artifactory/addon/plugin/PluginInfoTest.java   |   74 -
 .../java/org/artifactory/util/PathUtilTest.java    |   51 -
 base/pom.xml                                       |   40 -
 .../install/bin => bin}/artifactory-service.exe    |  Bin
 .../src/main/install/bin => bin}/artifactory.bat   |    0
 bin/artifactory.default                            |   15 +
 bin/artifactory.sh                                 |  190 +
 .../src/main/install/bin => bin}/artifactoryctl    |    0
 .../main/install/bin => bin}/configure.mysql.sh    |    0
 .../main/install/bin => bin}/installService.bat    |    0
 bin/installService.sh                              |  245 ++
 .../main/install/bin => bin}/uninstallService.bat  |    0
 bin/uninstallService.sh                            |  150 +
 distribution/deb/CHANGES.txt                       |    2 -
 distribution/deb/pom.xml                           |  311 --
 distribution/deb/src/deb/control/control           |   10 -
 distribution/deb/src/deb/control/postinst          |   16 -
 distribution/deb/src/deb/control/postrm            |   36 -
 distribution/deb/src/deb/control/preinst           |   72 -
 distribution/deb/src/deb/control/prerm             |   63 -
 distribution/pom.xml                               |   43 -
 distribution/rpm/artifactory-oss.spec              |  339 --
 distribution/rpm/build.rpm.sh                      |   37 -
 distribution/rpm/pom.xml                           |  152 -
 distribution/standalone/pom.xml                    |  164 -
 distribution/standalone/src/assemble/assembly.xml  |  221 -
 distribution/standalone/src/main/install/COPYING   |  674 ---
 .../standalone/src/main/install/COPYING.LESSER     |  165 -
 .../install/Third-Parties-Usage-About-Box.html     | 1041 -----
 .../src/main/install/bin/artifactory.default       |   15 -
 .../standalone/src/main/install/bin/artifactory.sh |  190 -
 .../src/main/install/bin/installService.sh         |  245 --
 .../src/main/install/bin/recover.backup.sh         |  219 -
 .../src/main/install/bin/uninstallService.sh       |  150 -
 .../src/main/install/misc/db/mssql.properties      |   16 -
 .../src/main/install/misc/db/mysql.properties      |   16 -
 .../src/main/install/misc/db/oracle.properties     |   16 -
 .../src/main/install/misc/db/postgresql.properties |   17 -
 .../install/misc/ha/ha-node.properties.template    |   17 -
 .../src/main/install/misc/service/artifactory      |  316 --
 .../src/main/install/misc/tomcat/web.xml           | 4612 --------------------
 distribution/standalone/src/site/site.xml          |   45 -
 .../standalone/src/test/etc/artifactory.config.xml |  184 -
 .../src/test/etc/artifactory.system.properties     |   21 -
 distribution/standalone/src/test/etc/jetty.xml     |  164 -
 distribution/standalone/src/test/etc/logback.xml   |  153 -
 .../standalone/src/test/etc/webdefault.xml         |  517 ---
 .../standalone/src/test/ha-etc/cluster.properties  |    2 -
 .../standalone/src/test/ha-etc/storage.properties  |    3 -
 .../webapp/main/StartArtifactoryDev.java           |  156 -
 .../webapp/main/StartArtifactoryTomcatDev.java     |  168 -
 etc/artifactory.config.xml                         |  203 +
 etc/artifactory.system.properties                  |  279 ++
 etc/binarystore.xml                                |   30 +
 etc/logback.xml                                    |  210 +
 etc/mimetypes.xml                                  |   84 +
 misc/artifactory.config.template.yml               |   85 +
 .../misc => misc}/db/createdb/createdb_mssql.sql   |    0
 .../db/createdb/createdb_mssqlBlob.sql             |    0
 .../db/createdb/createdb_mssqlRecreateBlob.sql     |    0
 .../misc => misc}/db/createdb/createdb_mysql.sql   |    0
 misc/db/mssql.properties                           |   25 +
 misc/db/mysql.properties                           |   25 +
 misc/db/oracle.properties                          |   25 +
 misc/db/postgresql.properties                      |   25 +
 misc/ha/ha-node.properties.template                |   20 +
 misc/service/artifactory                           |  316 ++
 .../main/install/misc => misc}/service/setenv.sh   |    0
 .../main/install/misc => misc}/tomcat/NGNIX.txt    |    0
 .../misc => misc}/tomcat/artifactory.httpd.conf    |    0
 .../install/misc => misc}/tomcat/artifactory.xml   |    0
 .../main/install/misc => misc}/tomcat/index.html   |    0
 .../misc => misc}/tomcat/logging.properties        |    0
 .../main/install/misc => misc}/tomcat/server.xml   |    0
 misc/tomcat/web.xml                                | 4612 ++++++++++++++++++++
 pom.xml                                            | 2149 ---------
 storage/common/pom.xml                             |   87 -
 .../org/artifactory/backup/FileExportInfoImpl.java |   70 -
 .../factory/common/AbstractInfoFactory.java        |  113 -
 .../factory/xstream/ChecksumsInfoConverter.java    |   51 -
 .../factory/xstream/PropertiesConverter.java       |   84 -
 .../factory/xstream/RepoPathConverter.java         |   89 -
 .../factory/xstream/UserGroupInfoConverter.java    |   41 -
 .../factory/xstream/XStreamFactory.java            |  136 -
 .../factory/xstream/XStreamInfoFactory.java        |  296 --
 .../artifactory/io/ClasspathResourceLoader.java    |   66 -
 .../org/artifactory/io/NonClosingInputStream.java  |   54 -
 .../artifactory/io/NullResourceStreamHandle.java   |   43 -
 .../artifactory/io/RemoteResourceStreamHandle.java |   37 -
 .../artifactory/io/SimpleResourceStreamHandle.java |   56 -
 .../artifactory/io/StringResourceStreamHandle.java |   50 -
 .../org/artifactory/io/TempFileStreamHandle.java   |   64 -
 .../artifactory/io/ZipResourceStreamHandle.java    |   95 -
 .../artifactory/io/checksum/ChecksumPathInfo.java  |  106 -
 .../org/artifactory/io/checksum/ChecksumPaths.java |  100 -
 .../org/artifactory/io/checksum/ChecksumUtil.java  |  174 -
 .../io/checksum/CleanedChecksumPathsInfo.java      |   43 -
 .../io/checksum/policy/ChecksumPolicy.java         |   60 -
 .../io/checksum/policy/ChecksumPolicyBase.java     |  108 -
 .../checksum/policy/ChecksumPolicyException.java   |   40 -
 .../io/checksum/policy/ChecksumPolicyFail.java     |   57 -
 .../policy/ChecksumPolicyGenerateIfAbsent.java     |   50 -
 .../policy/ChecksumPolicyIgnoreAndGenerate.java    |   47 -
 .../io/checksum/policy/ChecksumPolicyPassThru.java |   45 -
 .../checksum/policy/LocalRepoChecksumPolicy.java   |  143 -
 .../md/AbstractMetadataPersistenceHandler.java     |   30 -
 .../artifactory/md/AbstractPersistenceHandler.java |   46 -
 .../md/AbstractXmlContentPersistenceHandler.java   |   30 -
 .../artifactory/md/FileInfoPersistenceHandler.java |   38 -
 .../org/artifactory/md/FileInfoXmlProvider.java    |   42 -
 .../md/FolderInfoPersistenceHandler.java           |   39 -
 .../org/artifactory/md/FolderInfoXmlProvider.java  |   42 -
 .../artifactory/md/GenericPersistenceHandler.java  |   34 -
 .../org/artifactory/md/GenericXmlProvider.java     |   46 -
 .../org/artifactory/md/MetadataDefinition.java     |   90 -
 .../artifactory/md/MetadataDefinitionFactory.java  |   41 -
 .../artifactory/md/MetadataDefinitionService.java  |   28 -
 .../md/MetadataDefinitionServiceImpl.java          |  170 -
 .../artifactory/md/MetadataPersistenceHandler.java |   29 -
 .../md/PropertiesPersistenceHandler.java           |   41 -
 .../org/artifactory/md/PropertiesXmlProvider.java  |   39 -
 .../md/StatsInfoPersistenceHandler.java            |   38 -
 .../org/artifactory/md/StatsInfoXmlProvider.java   |   42 -
 .../artifactory/md/WatchersPersistenceHandler.java |   39 -
 .../org/artifactory/md/WatchersXmlProvider.java    |   42 -
 .../artifactory/md/XStreamMetadataProvider.java    |   48 -
 .../org/artifactory/md/XmlMetadataProvider.java    |   33 -
 .../org/artifactory/model/WatcherRepoPathInfo.java |   47 -
 .../model/common/RemoteRepoPathImpl.java           |  141 -
 .../org/artifactory/model/common/RepoPathImpl.java |  148 -
 .../model/xstream/fs/ArchiveEntryImpl.java         |  158 -
 .../model/xstream/fs/FileAdditionalInfo.java       |  138 -
 .../artifactory/model/xstream/fs/FileInfoImpl.java |  201 -
 .../model/xstream/fs/FolderAdditionalInfo.java     |   48 -
 .../model/xstream/fs/FolderInfoImpl.java           |   87 -
 .../model/xstream/fs/InternalFileInfo.java         |   32 -
 .../model/xstream/fs/InternalFolderInfo.java       |   31 -
 .../model/xstream/fs/InternalItemInfo.java         |   35 -
 .../model/xstream/fs/ItemAdditionalInfo.java       |  106 -
 .../artifactory/model/xstream/fs/ItemInfoImpl.java |  193 -
 .../model/xstream/fs/MetadataEntry.java            |   48 -
 .../model/xstream/fs/MetadataInfoImpl.java         |  165 -
 .../model/xstream/fs/PropertiesImpl.java           |  262 --
 .../artifactory/model/xstream/fs/StatsImpl.java    |  211 -
 .../artifactory/model/xstream/fs/WatcherImpl.java  |  146 -
 .../artifactory/model/xstream/fs/WatchersImpl.java |  170 -
 .../model/xstream/fs/ZipEntriesTree.java           |   67 -
 .../artifactory/model/xstream/fs/ZipEntryImpl.java |  161 -
 .../model/xstream/fs/ZipEntryResourceImpl.java     |  138 -
 .../artifactory/model/xstream/fs/ZipTreeNode.java  |  142 -
 .../model/xstream/security/AceImpl.java            |  191 -
 .../model/xstream/security/AclImpl.java            |  131 -
 .../model/xstream/security/GroupImpl.java          |  173 -
 .../model/xstream/security/ImmutableAclInfo.java   |   77 -
 .../xstream/security/PermissionTargetImpl.java     |  155 -
 .../model/xstream/security/SecurityDataImpl.java   |   97 -
 .../model/xstream/security/UserGroupImpl.java      |   84 -
 .../model/xstream/security/UserImpl.java           |  501 ---
 .../model/xstream/security/UserProperty.java       |   45 -
 .../org/artifactory/repo/SaveResourceContext.java  |  155 -
 .../repo/snapshot/MavenSnapshotVersionAdapter.java |   30 -
 .../MavenSnapshotVersionAdapterContext.java        |   65 -
 .../schedule/ArtifactoryConcurrentExecutor.java    |  146 -
 .../schedule/ArtifactorySingleThreadExecutor.java  |  115 -
 .../schedule/CachedThreadPoolTaskExecutor.java     |   46 -
 .../artifactory/schedule/DummyExecutorService.java |  109 -
 .../java/org/artifactory/schedule/DummyJob.java    |   34 -
 .../java/org/artifactory/schedule/JobCommand.java  |   56 -
 .../org/artifactory/schedule/ScheduleJobEnum.java  |   16 -
 .../java/org/artifactory/schedule/StopCommand.java |   40 -
 .../org/artifactory/schedule/StopStrategy.java     |   26 -
 .../main/java/org/artifactory/schedule/Task.java   |   52 -
 .../java/org/artifactory/schedule/TaskBase.java    |  671 ---
 .../org/artifactory/schedule/TaskCallback.java     |  146 -
 .../schedule/TaskImpossibleToStartException.java   |   31 -
 .../schedule/TaskInterruptedException.java         |   39 -
 .../java/org/artifactory/schedule/TaskService.java |  151 -
 .../java/org/artifactory/schedule/TaskUser.java    |   26 -
 .../schedule/mbean/ManagedExecutor.java            |   47 -
 .../schedule/mbean/ManagedExecutorMBean.java       |   21 -
 .../artifactory/schedule/quartz/QuartzCommand.java |   75 -
 .../storage/BinaryInsertRetryException.java        |   39 -
 .../storage/DBEntityNotFoundException.java         |   19 -
 .../org/artifactory/storage/StorageException.java  |   39 -
 .../storage/binstore/service/BinaryInfo.java       |   35 -
 .../storage/binstore/service/BinaryService.java    |  124 -
 .../service/BinaryStoreGarbageCollectorJob.java    |   60 -
 .../binstore/service/GarbageCollectorInfo.java     |   80 -
 .../binstore/service/GarbageCollectorListener.java |   26 -
 .../binstore/service/InternalBinaryService.java    |  176 -
 .../storage/build/service/BuildSearchCriteria.java |   37 -
 .../storage/build/service/BuildStoreService.java   |  117 -
 .../java/org/artifactory/storage/db/DbService.java |   66 -
 .../service/ArtifactoryDbPropertiesService.java    |   37 -
 .../servers/service/ArtifactoryServersService.java |   48 -
 .../java/org/artifactory/storage/fs/StorageTx.java |   35 -
 .../org/artifactory/storage/fs/VfsArchiveFile.java |  114 -
 .../org/artifactory/storage/fs/VfsException.java   |   40 -
 .../artifactory/storage/fs/VfsFileProvider.java    |   41 -
 .../artifactory/storage/fs/VfsFolderProvider.java  |   41 -
 .../org/artifactory/storage/fs/VfsItemFactory.java |   79 -
 .../storage/fs/VfsItemNotFoundException.java       |   30 -
 .../artifactory/storage/fs/VfsItemProvider.java    |   41 -
 .../storage/fs/VfsItemProviderFactory.java         |   36 -
 .../storage/fs/lock/FsItemLockEntry.java           |   35 -
 .../artifactory/storage/fs/lock/FsItemsVault.java  |   13 -
 .../storage/fs/lock/FsItemsVaultCacheImpl.java     |   73 -
 .../artifactory/storage/fs/lock/LockEntryId.java   |   59 -
 .../storage/fs/lock/LockingDebugUtils.java         |   45 -
 .../artifactory/storage/fs/lock/LockingHelper.java |   90 -
 .../storage/fs/lock/MonitoringReentrantLock.java   |   41 -
 .../storage/fs/lock/SessionLockEntry.java          |  136 -
 .../storage/fs/lock/ThreadDumpUtils.java           |   41 -
 .../storage/fs/lock/aop/LockingAdvice.java         |  111 -
 .../storage/fs/lock/aop/LockingAdvisor.java        |   32 -
 .../storage/fs/lock/aop/LockingMethodMatcher.java  |   33 -
 .../storage/fs/lock/map/JVMLockingMap.java         |   58 -
 .../storage/fs/lock/map/LockingMap.java            |   47 -
 .../storage/fs/lock/provider/JVMLockProvider.java  |   33 -
 .../storage/fs/lock/provider/JVMLockWrapper.java   |   66 -
 .../storage/fs/lock/provider/LockProvider.java     |   29 -
 .../storage/fs/lock/provider/LockWrapper.java      |   40 -
 .../storage/fs/repo/RepoStorageSummary.java        |  111 -
 .../artifactory/storage/fs/repo/StoringRepo.java   |   59 -
 .../storage/fs/service/ArchiveEntriesService.java  |   71 -
 .../storage/fs/service/ConfigsService.java         |   81 -
 .../storage/fs/service/FileService.java            |  122 -
 .../storage/fs/service/InternalWatchesService.java |   18 -
 .../storage/fs/service/ItemMetaInfo.java           |   45 -
 .../storage/fs/service/NodeMetaInfoService.java    |   60 -
 .../storage/fs/service/PropertiesService.java      |   62 -
 .../storage/fs/service/StatsService.java           |   90 -
 .../storage/fs/service/TasksService.java           |   65 -
 .../storage/fs/service/WatchesService.java         |   83 -
 .../storage/fs/session/StorageSession.java         |   76 -
 .../storage/fs/session/StorageSessionFactory.java  |   26 -
 .../storage/fs/session/StorageSessionHolder.java   |   41 -
 .../org/artifactory/storage/fs/tree/FileNode.java  |   63 -
 .../storage/fs/tree/FilterAccepted.java            |   10 -
 .../artifactory/storage/fs/tree/FolderNode.java    |  198 -
 .../org/artifactory/storage/fs/tree/ItemNode.java  |   81 -
 .../storage/fs/tree/ItemNodeFilter.java            |   43 -
 .../org/artifactory/storage/fs/tree/ItemTree.java  |  123 -
 .../storage/fs/tree/TreeBrowsingCriteria.java      |   59 -
 .../fs/tree/TreeBrowsingCriteriaBuilder.java       |  136 -
 .../storage/fs/tree/file/JavaIOFileAdapter.java    |  378 --
 .../storage/fs/tree/file/NodeItemFilterHolder.java |   29 -
 .../storage/model/FileBinaryProviderInfo.java      |   30 -
 .../storage/security/service/AclStoreService.java  |   69 -
 .../security/service/UserGroupStoreService.java    |  386 --
 .../storage/spring/ArtifactoryStorageContext.java  |   18 -
 .../storage/spring/StorageContextHelper.java       |   18 -
 .../artifactory/storage/tx/SessionResource.java    |   35 -
 .../storage/tx/SessionResourceManager.java         |   40 -
 .../storage/tx/SessionResourceManagerImpl.java     |  103 -
 .../artifactory/api/fs/FileAdditionalInfoTest.java |   96 -
 .../org/artifactory/api/fs/FileInfoImplTest.java   |   54 -
 .../org/artifactory/api/fs/ZipEntriesTreeTest.java |   65 -
 .../org/artifactory/api/security/AceInfoTest.java  |  172 -
 .../artifactory/api/security/GroupInfoTest.java    |   53 -
 .../api/security/PermissionTargetInfoTest.java     |   97 -
 .../org/artifactory/api/security/UserInfoTest.java |   65 -
 .../xstream/ChecksumsInfoConverterTest.java        |   47 -
 .../factory/xstream/PropertiesConverterTest.java   |   46 -
 .../org/artifactory/model/common/RepoPathTest.java |  109 -
 .../model/xstream/fs/PropertiesImplTest.java       |   46 -
 .../model/xstream/security/UserImplTest.java       |   56 -
 .../repo/InternalRepoPathFactoryTest.java          |   49 -
 .../StoragePropertiesEncryptDecryptTest.java       |  130 -
 .../artifactory/storage/StoragePropertiesTest.java |   96 -
 .../org/artifactory/storage/db/DbTypeTest.java     |   55 -
 .../fs/tree/file/JavaIOFileAdapterTest.java        |   63 -
 .../org/artifactory/util/RepoPathUtilsTest.java    |   56 -
 .../resources/storage/gigscachesize.properties     |    5 -
 .../resources/storage/minimalstorage.properties    |    3 -
 .../resources/storage/storagepostgres.properties   |   20 -
 .../src/test/resources/storage/trim.properties     |   12 -
 .../test/resources/storage/unsupported.properties  |    3 -
 storage/config/pom.xml                             |   37 -
 storage/db/pom.xml                                 |  157 -
 .../org/artifactory/storage/db/DbServiceImpl.java  |  258 --
 .../org/artifactory/storage/db/DerbyUtils.java     |  111 -
 .../org/artifactory/storage/db/aql/dao/AqlDao.java |   82 -
 .../storage/db/aql/parser/AqlParser.java           |  163 -
 .../storage/db/aql/parser/AqlParserContext.java    |   39 -
 .../aql/parser/ParserElementResultContainer.java   |   51 -
 .../db/aql/parser/elements/ParserElement.java      |   39 -
 .../basic/language/ArchiveDomainsElement.java      |   51 -
 .../language/ArchiveEntriesDomainsElement.java     |   47 -
 .../basic/language/ArchiveEntriesStarElement.java  |   41 -
 .../language/ArchiveEntriesValuesElement.java      |   41 -
 .../basic/language/ArchiveEntryFieldsElement.java  |   50 -
 .../level/basic/language/ArchiveFieldsElement.java |   48 -
 .../level/basic/language/ArchiveStarElement.java   |   44 -
 .../level/basic/language/ArchiveValuesElement.java |   42 -
 .../language/BuildArtifactDomainsElement.java      |   46 -
 .../basic/language/BuildArtifactFieldsElement.java |   49 -
 .../basic/language/BuildArtifactStarElement.java   |   39 -
 .../basic/language/BuildArtifactValuesElement.java |   39 -
 .../language/BuildDependenciesDomainsElement.java  |   46 -
 .../language/BuildDependenciesFieldsElement.java   |   49 -
 .../language/BuildDependenciesStarElement.java     |   39 -
 .../language/BuildDependenciesValuesElement.java   |   39 -
 .../level/basic/language/BuildDomainsElement.java  |   48 -
 .../level/basic/language/BuildFieldsElement.java   |   50 -
 .../basic/language/BuildModuleDomainsElement.java  |   50 -
 .../basic/language/BuildModuleFieldsElement.java   |   51 -
 .../BuildModulePropertyDomainsElement.java         |   45 -
 .../language/BuildModulePropertyFieldsElement.java |   48 -
 .../language/BuildModulePropertyStarElement.java   |   46 -
 .../language/BuildModulePropertyValuesElement.java |   46 -
 .../basic/language/BuildModuleStarElement.java     |   42 -
 .../basic/language/BuildModuleValuesElement.java   |   42 -
 .../language/BuildPromotionsDomainsElement.java    |   46 -
 .../language/BuildPromotionsFieldsElement.java     |   49 -
 .../basic/language/BuildPromotionsStarElement.java |   45 -
 .../language/BuildPromotionsValuesElement.java     |   45 -
 .../language/BuildPropertyDomainsElement.java      |   46 -
 .../basic/language/BuildPropertyFieldsElement.java |   50 -
 .../basic/language/BuildPropertyStarElement.java   |   47 -
 .../basic/language/BuildPropertyValuesElement.java |   47 -
 .../level/basic/language/BuildStarElement.java     |   41 -
 .../level/basic/language/BuildValuesElement.java   |   41 -
 .../level/basic/language/CloseBracketsElement.java |   15 -
 .../basic/language/CloseCurlyBracketsElement.java  |   15 -
 .../basic/language/CloseParenthesisElement.java    |   20 -
 .../high/level/basic/language/ColonElement.java    |   15 -
 .../high/level/basic/language/CommaElement.java    |   15 -
 .../level/basic/language/ComparatorElement.java    |   31 -
 .../basic/language/DomainProviderElement.java      |   10 -
 .../level/basic/language/DomainSubPathElement.java |   26 -
 .../high/level/basic/language/DotElement.java      |   15 -
 .../basic/language/EmptyIncludeDomainElement.java  |   36 -
 .../high/level/basic/language/FieldElement.java    |   20 -
 .../level/basic/language/IncludeDomainElement.java |   35 -
 .../level/basic/language/IncludeTypeElement.java   |   26 -
 .../level/basic/language/ItemDomainsElement.java   |   52 -
 .../level/basic/language/ItemFieldsElement.java    |   52 -
 .../high/level/basic/language/ItemStarElement.java |   43 -
 .../level/basic/language/ItemValuesElement.java    |   43 -
 .../high/level/basic/language/LimitElement.java    |   22 -
 .../level/basic/language/LimitValueElement.java    |   20 -
 .../high/level/basic/language/NullElement.java     |   20 -
 .../high/level/basic/language/NumberElement.java   |   20 -
 .../high/level/basic/language/OffsetElement.java   |   22 -
 .../level/basic/language/OffsetValueElement.java   |   20 -
 .../level/basic/language/OpenBracketsElement.java  |   15 -
 .../basic/language/OpenCurlyBracketsElement.java   |   15 -
 .../basic/language/OpenParenthesisElement.java     |   20 -
 .../basic/language/PropertyDomainsElement.java     |   46 -
 .../basic/language/PropertyFieldsElement.java      |   50 -
 .../level/basic/language/PropertyStarElement.java  |   46 -
 .../basic/language/PropertyValuesElement.java      |   46 -
 .../level/basic/language/QuotedComparator.java     |   17 -
 .../language/QuotedRelativeDateComparator.java     |   17 -
 .../high/level/basic/language/QuotesElement.java   |   15 -
 .../level/basic/language/RealFieldElement.java     |   37 -
 .../language/RelativeDateComparatorElement.java    |   30 -
 .../high/level/basic/language/RootElement.java     |   35 -
 .../level/basic/language/SectionEndElement.java    |   22 -
 .../high/level/basic/language/SortTypeElement.java |   26 -
 .../high/level/basic/language/StarElement.java     |   21 -
 .../basic/language/StatisticsDomainsElement.java   |   46 -
 .../basic/language/StatisticsFieldsElement.java    |   50 -
 .../basic/language/StatisticsStarElement.java      |   40 -
 .../basic/language/StatisticsValuesElement.java    |   40 -
 .../high/level/basic/language/ValueElement.java    |   20 -
 .../basic/language/ValueNumberNullElement.java     |   16 -
 .../sensitive/CriteriaDefaultPropertyElement.java  |   21 -
 .../CriteriaEqualsKeyPropertyElement.java          |   21 -
 .../sensitive/CriteriaEqualsPropertyElement.java   |   21 -
 .../CriteriaEqualsValuePropertyElement.java        |   21 -
 .../sensitive/CriteriaKeyPropertyElement.java      |   21 -
 .../sensitive/CriteriaRelativeDateElement.java     |   21 -
 .../sensitive/CriteriaValuePropertyElement.java    |   21 -
 .../domain/sensitive/DefaultCriteriaElement.java   |   22 -
 .../high/level/domain/sensitive/DomainElement.java |   42 -
 .../sensitive/DomainSensitiveParserElement.java    |   24 -
 .../high/level/domain/sensitive/DynamicDomain.java |   53 -
 .../high/level/domain/sensitive/DynamicField.java  |   52 -
 .../level/domain/sensitive/DynamicFieldTrail.java  |   17 -
 .../high/level/domain/sensitive/DynamicStar.java   |   53 -
 .../high/level/domain/sensitive/DynamicValue.java  |   53 -
 .../domain/sensitive/EqualsCriteriaElement.java    |   21 -
 .../domain/sensitive/FilterComplexElement.java     |   19 -
 .../domain/sensitive/FilterComplexTailElement.java |   17 -
 .../high/level/domain/sensitive/FilterElement.java |   19 -
 .../level/domain/sensitive/FilterTailElement.java  |   16 -
 .../high/level/domain/sensitive/FindElement.java   |   25 -
 .../level/domain/sensitive/FunctionElement.java    |   25 -
 .../domain/sensitive/FunctionExtensionElement.java |   19 -
 .../domain/sensitive/IncludeExtensionElement.java  |   25 -
 .../high/level/domain/sensitive/IncludeField.java  |   18 -
 .../level/domain/sensitive/IncludeFieldTrail.java  |   16 -
 .../domain/sensitive/ParserElementsProvider.java   |   36 -
 .../domain/sensitive/SortExtensionElement.java     |   22 -
 .../elements/low/level/ForkParserElement.java      |   63 -
 .../parser/elements/low/level/ForwardElement.java  |   86 -
 .../elements/low/level/InternalEmptyElement.java   |   25 -
 .../elements/low/level/InternalFieldElement.java   |   51 -
 .../elements/low/level/InternalNameElement.java    |   75 -
 .../elements/low/level/InternalNumberElement.java  |   62 -
 .../elements/low/level/InternalParserElement.java  |   19 -
 .../elements/low/level/InternalRelativeDate.java   |   63 -
 .../elements/low/level/InternalSignElement.java    |   44 -
 .../elements/low/level/InternalValueElement.java   |   35 -
 .../elements/low/level/LazyParserElement.java      |   51 -
 .../db/aql/service/AqlPermissionProviderImpl.java  |   46 -
 .../storage/db/aql/service/AqlQueryDecorator.java  |   22 -
 .../storage/db/aql/service/AqlQueryOptimizer.java  |   59 -
 .../storage/db/aql/service/AqlQueryValidator.java  |  122 -
 .../storage/db/aql/service/AqlServiceImpl.java     |  160 -
 .../storage/db/aql/service/QueryOptimizer.java     |   21 -
 .../aql/service/decorator/DecorationStrategy.java  |   11 -
 .../service/decorator/DefaultSortDecorator.java    |  104 -
 .../aql/service/decorator/TrashcanDecorator.java   |   89 -
 .../service/optimizer/FileTypeOptimization.java    |  298 --
 .../service/optimizer/OptimizationStrategy.java    |   94 -
 .../optimizer/PropertyCriteriaRelatedWithOr.java   |   87 -
 .../db/aql/sql/builder/links/TableLink.java        |   77 -
 .../db/aql/sql/builder/links/TableLinkBrowser.java |   60 -
 .../aql/sql/builder/links/TableLinkRelation.java   |   83 -
 .../aql/sql/builder/query/aql/AdapterContext.java  |   81 -
 .../db/aql/sql/builder/query/aql/AqlAdapter.java   |  249 --
 .../sql/builder/query/aql/AqlApiToAqlAdapter.java  |  221 -
 .../db/aql/sql/builder/query/aql/AqlQuery.java     |   61 -
 .../aql/sql/builder/query/aql/AqlQueryElement.java |   10 -
 .../query/aql/CloseParenthesisAqlElement.java      |   11 -
 .../builder/query/aql/ComplexPropertyCriteria.java |  112 -
 .../db/aql/sql/builder/query/aql/Criteria.java     |  254 --
 .../aql/sql/builder/query/aql/MspAqlElement.java   |   24 -
 .../query/aql/OpenParenthesisAqlElement.java       |   11 -
 .../builder/query/aql/OperatorQueryElement.java    |   24 -
 .../sql/builder/query/aql/ParserToAqlAdapter.java  |  586 ---
 .../query/aql/ParserToAqlAdapterContext.java       |   40 -
 .../builder/query/aql/ResultFilterAqlElement.java  |   12 -
 .../aql/sql/builder/query/aql/SimpleCriteria.java  |   41 -
 .../builder/query/aql/SimplePropertyCriteria.java  |   84 -
 .../db/aql/sql/builder/query/aql/SortDetails.java  |   33 -
 .../query/sql/AqlToSqlQueryBuilderException.java   |   14 -
 .../db/aql/sql/builder/query/sql/SqlQuery.java     |   78 -
 .../aql/sql/builder/query/sql/SqlQueryBuilder.java |   89 -
 .../db/aql/sql/builder/query/sql/SqlTable.java     |   87 -
 .../builder/query/sql/type/AqlJoinTypeEnum.java    |   15 -
 .../sql/builder/query/sql/type/AqlTableGraph.java  |   75 -
 .../query/sql/type/ArchiveEntrySqlGenerator.java   |   74 -
 .../query/sql/type/ArchiveSqlGenerator.java        |   34 -
 .../query/sql/type/ArtifactsSqlGenerator.java      |   29 -
 .../builder/query/sql/type/BasicSqlGenerator.java  |  367 --
 .../query/sql/type/BuildArtifactSqlGenerator.java  |   26 -
 .../sql/type/BuildDependenciesSqlGenerator.java    |   27 -
 .../sql/type/BuildModulePropertySqlGenerator.java  |   24 -
 .../query/sql/type/BuildModuleSqlGenerator.java    |   25 -
 .../query/sql/type/BuildPropertySqlGenerator.java  |   26 -
 .../builder/query/sql/type/BuildSqlGenerator.java  |   24 -
 .../sql/type/BuildsPromotionsSqlGeneratot.java     |   22 -
 .../query/sql/type/DomainSensitiveTable.java       |   55 -
 .../query/sql/type/PropertiesSqlGenerator.java     |   26 -
 .../query/sql/type/StatisticsSqlGenerator.java     |   27 -
 .../db/aql/sql/model/AqlFieldExtensionEnum.java    |  110 -
 .../storage/db/aql/sql/model/SqlTableEnum.java     |   32 -
 .../db/aql/sql/result/AqlEagerResultImpl.java      |   89 -
 .../db/aql/sql/result/AqlLazyResultImpl.java       |   76 -
 .../storage/db/binstore/dao/BinariesDao.java       |  170 -
 .../storage/db/binstore/entity/BinaryEntity.java   |   56 -
 .../db/binstore/exceptions/PruneException.java     |   10 -
 .../service/BinaryEntityWithValidation.java        |   34 -
 .../db/binstore/service/BinaryInfoImpl.java        |   63 -
 .../db/binstore/service/BinaryServiceImpl.java     |  775 ----
 .../binstore/service/BinaryServiceInputStream.java |   38 -
 .../db/binstore/service/BlobBinaryProvider.java    |  215 -
 .../service/ExternalBinaryProviderHelper.java      |   83 -
 .../visitors/BinaryTreeElementHandler.java         |   10 -
 .../visitors/BinaryTreeElementScanner.java         |   34 -
 .../EssentialBinaryTreeElementHandler.java         |   56 -
 .../storage/db/build/dao/BuildArtifactsDao.java    |  128 -
 .../storage/db/build/dao/BuildDependenciesDao.java |  127 -
 .../storage/db/build/dao/BuildModulesDao.java      |  142 -
 .../storage/db/build/dao/BuildQueries.java         |  199 -
 .../storage/db/build/dao/BuildsDao.java            | 1328 ------
 .../storage/db/build/entity/BuildArtifact.java     |   88 -
 .../storage/db/build/entity/BuildDependency.java   |  111 -
 .../storage/db/build/entity/BuildEntity.java       |  173 -
 .../storage/db/build/entity/BuildModule.java       |   82 -
 .../db/build/entity/BuildPromotionStatus.java      |  135 -
 .../storage/db/build/entity/BuildProperty.java     |   98 -
 .../storage/db/build/entity/ModuleProperty.java    |  108 -
 .../storage/db/build/service/BuildRunImpl.java     |  199 -
 .../db/build/service/BuildStoreServiceImpl.java    |  710 ---
 .../storage/db/fs/dao/ArchiveEntriesDao.java       |  198 -
 .../artifactory/storage/db/fs/dao/ConfigsDao.java  |  122 -
 .../storage/db/fs/dao/NodeMetaInfoDao.java         |   88 -
 .../artifactory/storage/db/fs/dao/NodesDao.java    |  497 ---
 .../storage/db/fs/dao/PropertiesDao.java           |  113 -
 .../artifactory/storage/db/fs/dao/StatsDao.java    |  374 --
 .../artifactory/storage/db/fs/dao/TasksDao.java    |   90 -
 .../artifactory/storage/db/fs/dao/WatchesDao.java  |  115 -
 .../storage/db/fs/entity/ArchiveEntry.java         |  121 -
 .../org/artifactory/storage/db/fs/entity/Node.java |  180 -
 .../storage/db/fs/entity/NodeBuilder.java          |  174 -
 .../storage/db/fs/entity/NodeMetaInfo.java         |   75 -
 .../artifactory/storage/db/fs/entity/NodePath.java |  162 -
 .../storage/db/fs/entity/NodeProperty.java         |   54 -
 .../org/artifactory/storage/db/fs/entity/Stat.java |  174 -
 .../storage/db/fs/entity/TaskRecord.java           |   52 -
 .../artifactory/storage/db/fs/entity/Watch.java    |   55 -
 .../storage/db/fs/model/DbFileProvider.java        |   86 -
 .../storage/db/fs/model/DbFolderProvider.java      |   86 -
 .../artifactory/storage/db/fs/model/DbFsFile.java  |   68 -
 .../storage/db/fs/model/DbFsFolder.java            |   58 -
 .../artifactory/storage/db/fs/model/DbFsItem.java  |  128 -
 .../storage/db/fs/model/DbFsItemProvider.java      |  319 --
 .../storage/db/fs/model/DbMutableFile.java         |  246 --
 .../storage/db/fs/model/DbMutableFolder.java       |  123 -
 .../storage/db/fs/model/DbMutableItem.java         |  294 --
 .../db/fs/model/DbVfsItemProviderFactory.java      |   52 -
 .../db/fs/service/AbstractStatsService.java        |  517 ---
 .../db/fs/service/ArchiveEntriesServiceImpl.java   |  151 -
 .../storage/db/fs/service/ConfigsServiceImpl.java  |  154 -
 .../db/fs/service/DbPropertiesServiceImpl.java     |  139 -
 .../storage/db/fs/service/FileServiceImpl.java     |  484 --
 .../db/fs/service/NodeMetaInfoServiceImpl.java     |  110 -
 .../db/fs/service/StatsPersistingService.java      |   30 -
 .../db/fs/service/StatsPersistingServiceImpl.java  |  297 --
 .../storage/db/fs/service/TasksServiceImpl.java    |   96 -
 .../storage/db/fs/service/WatchesServiceImpl.java  |  294 --
 .../storage/db/fs/session/SqlStorageSession.java   |  147 -
 .../db/fs/session/SqlStorageSessionFactory.java    |   34 -
 .../artifactory/storage/db/fs/util/NodeUtils.java  |   79 -
 .../storage/db/mbean/ManagedDataSource.java        |   65 -
 .../storage/db/mbean/ManagedDataSourceMBean.java   |   28 -
 .../storage/db/properties/dao/DbPropertiesDao.java |   64 -
 .../ArtifactoryDbPropertiesServiceImpl.java        |   91 -
 .../properties/utils/VersionPropertiesUtils.java   |   94 -
 .../db/search/model/ArchiveSearchEntry.java        |   79 -
 .../db/search/model/BaseGroupCriterion.java        |   88 -
 .../db/search/model/BaseVfsQueryCriterion.java     |   25 -
 .../storage/db/search/model/DbFileInfoProxy.java   |   78 -
 .../storage/db/search/model/DbFolderInfoProxy.java |   34 -
 .../storage/db/search/model/DbItemInfoProxy.java   |  145 -
 .../storage/db/search/model/DbQueryHelper.java     |   89 -
 .../storage/db/search/model/DbSqlQueryBuilder.java |   98 -
 .../db/search/model/VfsQueryCriterionDbImpl.java   |  229 -
 .../storage/db/search/model/VfsQueryDbImpl.java    |  610 ---
 .../search/model/VfsQueryPathCriterionDbImpl.java  |   50 -
 .../db/search/model/VfsQueryResultDbImpl.java      |   48 -
 .../storage/db/search/model/VfsQueryRowDbImpl.java |   71 -
 .../db/search/service/QueryServiceImpl.java        |   38 -
 .../storage/db/security/dao/AclsDao.java           |  216 -
 .../db/security/dao/PermissionTargetsDao.java      |  194 -
 .../storage/db/security/dao/UserGroupsDao.java     |  947 ----
 .../storage/db/security/dao/UserPropertiesDao.java |  189 -
 .../storage/db/security/entity/Ace.java            |  117 -
 .../storage/db/security/entity/Acl.java            |  118 -
 .../storage/db/security/entity/Group.java          |  122 -
 .../db/security/entity/PermissionTarget.java       |  145 -
 .../storage/db/security/entity/User.java           |  271 --
 .../storage/db/security/entity/UserGroup.java      |   93 -
 .../db/security/service/AclServiceImpl.java        |  466 --
 .../db/security/service/UserGroupServiceImpl.java  | 1097 -----
 .../db/servers/dao/ArtifactoryServersDao.java      |  145 -
 .../service/ArtifactoryServersServiceImpl.java     |  113 -
 .../spring/AnnotationStorageTxAttributeSource.java |   32 -
 .../storage/db/spring/ArtifactoryDataSource.java   |   50 -
 .../db/spring/ArtifactoryTomcatDataSource.java     |  193 -
 .../storage/db/spring/DbConfigFactory.java         |  195 -
 .../storage/db/spring/DbTransactionManager.java    |   67 -
 .../storage/db/spring/SessionSynchronization.java  |   97 -
 .../db/spring/StorageTxAnnotationParser.java       |   46 -
 .../org/artifactory/storage/db/util/BaseDao.java   |   89 -
 .../org/artifactory/storage/db/util/DbUtils.java   |  243 --
 .../artifactory/storage/db/util/IdGenerator.java   |   82 -
 .../artifactory/storage/db/util/JdbcHelper.java    |  313 --
 .../storage/db/util/ResultSetWrapper.java          |   76 -
 .../storage/db/util/SimpleIdGenerator.java         |  112 -
 .../org/artifactory/storage/db/util/TxHelper.java  |   48 -
 .../storage/db/util/blob/BlobWrapper.java          |   95 -
 .../storage/db/util/blob/BlobWrapperFactory.java   |   83 -
 .../storage/db/util/blob/JsonBlobWrapper.java      |   44 -
 .../storage/db/util/blob/PostgresBlobWrapper.java  |   79 -
 .../db/util/querybuilder/BaseQueryBuilder.java     |   70 -
 .../db/util/querybuilder/DerbyQueryBuilder.java    |   24 -
 .../db/util/querybuilder/IQueryBuilder.java        |   11 -
 .../db/util/querybuilder/MysqlQueryBuilder.java    |   23 -
 .../db/util/querybuilder/OracleQueryBuilder.java   |   24 -
 .../util/querybuilder/PostgresqlQueryBuilder.java  |   25 -
 .../storage/db/util/querybuilder/QueryWriter.java  |   87 -
 .../util/querybuilder/SqlServerQueryBuilder.java   |   44 -
 .../storage/db/version/ArtifactoryDBVersion.java   |   73 -
 .../storage/db/version/converter/DBConverter.java  |   11 -
 .../db/version/converter/DBSqlConverter.java       |   50 -
 .../resources/META-INF/binarystore-default.xml     |   15 -
 .../main/resources/META-INF/binarystore.properties |    1 -
 .../main/resources/conversion/derby/derby_v310.sql |   23 -
 .../main/resources/conversion/derby/derby_v311.sql |    1 -
 .../main/resources/conversion/derby/derby_v410.sql |   16 -
 .../main/resources/conversion/derby/derby_v420.sql |   11 -
 .../main/resources/conversion/derby/derby_v440.sql |    1 -
 .../main/resources/conversion/derby/derby_v441.sql |    1 -
 .../main/resources/conversion/mssql/mssql_v310.sql |   23 -
 .../main/resources/conversion/mssql/mssql_v311.sql |    1 -
 .../main/resources/conversion/mssql/mssql_v410.sql |   16 -
 .../main/resources/conversion/mssql/mssql_v420.sql |   11 -
 .../main/resources/conversion/mssql/mssql_v440.sql |    1 -
 .../main/resources/conversion/mssql/mssql_v441.sql |    1 -
 .../main/resources/conversion/mysql/mysql_v310.sql |   23 -
 .../main/resources/conversion/mysql/mysql_v311.sql |    1 -
 .../main/resources/conversion/mysql/mysql_v410.sql |   16 -
 .../main/resources/conversion/mysql/mysql_v420.sql |   11 -
 .../main/resources/conversion/mysql/mysql_v440.sql |    1 -
 .../main/resources/conversion/mysql/mysql_v441.sql |    1 -
 .../resources/conversion/oracle/oracle_v310.sql    |   23 -
 .../resources/conversion/oracle/oracle_v311.sql    |    1 -
 .../resources/conversion/oracle/oracle_v410.sql    |   16 -
 .../resources/conversion/oracle/oracle_v420.sql    |   11 -
 .../resources/conversion/oracle/oracle_v440.sql    |    1 -
 .../resources/conversion/oracle/oracle_v441.sql    |    1 -
 .../conversion/postgresql/postgresql_v310.sql      |   33 -
 .../conversion/postgresql/postgresql_v311.sql      |    3 -
 .../conversion/postgresql/postgresql_v410.sql      |   16 -
 .../conversion/postgresql/postgresql_v420.sql      |   11 -
 .../conversion/postgresql/postgresql_v440.sql      |    1 -
 .../conversion/postgresql/postgresql_v441.sql      |    1 -
 storage/db/src/main/resources/derby/derby.sql      |  352 --
 storage/db/src/main/resources/mssql/mssql.sql      |  351 --
 storage/db/src/main/resources/mysql/mysql.sql      |  351 --
 storage/db/src/main/resources/oracle/oracle.sql    |  351 --
 .../src/main/resources/postgresql/postgresql.sql   |  351 --
 .../db/aql/api/AqlApiDomainSensitiveTest.java      |  746 ----
 .../storage/db/aql/parser/AqlParserTest.java       |  139 -
 .../db/aql/service/AqlAbstractServiceTest.java     |  158 -
 .../storage/db/aql/service/AqlArchiveTest.java     |   40 -
 .../aql/service/AqlBuildPromotionOrientedTest.java |  100 -
 .../storage/db/aql/service/AqlComparatorTest.java  |   94 -
 .../db/aql/service/AqlExcludeFilesTest.java        |   25 -
 .../storage/db/aql/service/AqlExclusionTest.java   |   80 -
 .../db/aql/service/AqlIncludeServiceTest.java      |  170 -
 .../storage/db/aql/service/AqlItemTypeTest.java    |   83 -
 .../storage/db/aql/service/AqlJSonResultTest.java  |  202 -
 .../storage/db/aql/service/AqlMspOrientedTest.java |   60 -
 .../storage/db/aql/service/AqlNullUsageTest.java   |   38 -
 .../storage/db/aql/service/AqlOffsetLimitTest.java |   76 -
 .../AqlOrAndPropertiesOptimizationTest.java        |  151 -
 .../storage/db/aql/service/AqlPermissionsTest.java |  215 -
 .../service/AqlPropertyOrientedSearchesTest.java   |  194 -
 .../storage/db/aql/service/AqlRestrictionTest.java |  105 -
 .../storage/db/aql/service/AqlServiceTest.java     | 1012 -----
 .../storage/db/aql/service/AqlSortTest.java        |  116 -
 .../aql/service/AqlStatsOrientedSearchesTest.java  |   21 -
 .../storage/db/aql/service/AqlValueTypesTest.java  |   85 -
 .../storage/db/base/entity/DbPropertiesTest.java   |   63 -
 ...DBPropertiesWithRealArtifactoryVersionTest.java |   93 -
 .../db/base/itest/dao/DbPropertiesDaoTest.java     |   81 -
 .../db/binstore/entity/BinaryEntityTest.java       |  128 -
 .../db/binstore/itest/dao/BinariesDaoTest.java     |  227 -
 .../itest/service/BinaryServiceBaseTest.java       |  431 --
 .../service/BinaryServiceCachedFSProviderTest.java |   94 -
 .../service/BinaryServiceFileProviderTest.java     |   77 -
 .../service/BinaryServiceFullDbProviderTest.java   |   83 -
 .../BinaryServiceFullPathFileProviderTest.java     |   81 -
 .../BinaryStoreExternalProviderBaseTest.java       |   84 -
 .../BinaryStoreExternalProviderCopyFirstTest.java  |   82 -
 .../BinaryStoreExternalProviderCopyOnReadTest.java |   94 -
 .../BinaryStoreExternalProviderMoveTest.java       |   87 -
 ...BinaryStoreExternalProviderPassThroughTest.java |  104 -
 .../ConfigurableBinaryProviderManagerTest.java     |  170 -
 .../storage/db/build/entity/BuildArtifactTest.java |   84 -
 .../db/build/entity/BuildDependencyTest.java       |  112 -
 .../storage/db/build/entity/BuildEntityTest.java   |  217 -
 .../storage/db/build/entity/BuildModuleTest.java   |  168 -
 .../db/build/entity/BuildPromotionStatusTest.java  |  141 -
 .../storage/db/build/entity/BuildPropertyTest.java |  105 -
 .../db/build/itest/dao/BuildArtifactsDaoTest.java  |  153 -
 .../build/itest/dao/BuildDependenciesDaoTest.java  |  167 -
 .../db/build/itest/dao/BuildModulesDaoTest.java    |  198 -
 .../db/build/itest/dao/BuildsDaoBaseTest.java      |  164 -
 .../storage/db/build/itest/dao/BuildsDaoTest.java  |  393 --
 .../itest/service/BuildStoreServiceImplTest.java   |  132 -
 .../db/build/service/BuildRunComparatorsTest.java  |   58 -
 .../db/ds/ArtifactoryTomcatDataSourceTest.java     |   68 -
 .../storage/db/fs/entity/NodeBuilderTest.java      |   90 -
 .../storage/db/fs/entity/NodePathTest.java         |  115 -
 .../artifactory/storage/db/fs/entity/NodeTest.java |   86 -
 .../db/fs/entity/RepoStorageSummaryTest.java       |   41 -
 .../storage/db/fs/itest/ItemTreeTest.java          |   82 -
 .../db/fs/itest/dao/ArchiveEntriesDaoTest.java     |  149 -
 .../storage/db/fs/itest/dao/ConfigsDaoTest.java    |  129 -
 .../db/fs/itest/dao/NodeMetaInfosDaoTest.java      |  114 -
 .../itest/dao/NodesDaoRepoStorageSummaryTest.java  |   84 -
 .../storage/db/fs/itest/dao/NodesDaoTest.java      |  431 --
 .../storage/db/fs/itest/dao/PropertiesDaoTest.java |  156 -
 .../storage/db/fs/itest/dao/StatsDaoTest.java      |  125 -
 .../storage/db/fs/itest/dao/TasksDaoTest.java      |   84 -
 .../storage/db/fs/itest/dao/WatchesDaoTest.java    |  146 -
 .../service/ArchiveEntriesServiceImplTest.java     |  163 -
 .../fs/itest/service/ConfigsServiceImplTest.java   |   92 -
 .../itest/service/DbPropertiesServiceImplTest.java |  101 -
 .../db/fs/itest/service/FileServiceImplTest.java   |  240 -
 .../service/FileServiceRepoStorageSummaryTest.java |   56 -
 .../itest/service/FileServiceSpecialCharsTest.java |  191 -
 .../itest/service/NodeMetaInfoServiceImplTest.java |  108 -
 .../db/fs/itest/service/StatsServiceImplTest.java  |  212 -
 .../db/fs/itest/service/TasksServiceImplTest.java  |   85 -
 .../fs/itest/service/WatchesServiceImplTest.java   |  150 -
 .../storage/db/fs/util/NodeUtilsTest.java          |   57 -
 .../db/ha/entity/ArtifactoryServerTest.java        |  131 -
 .../db/ha/itest/dao/ArtifactoryServersDaoTest.java |  103 -
 .../service/ArtifactoryServersServiceImplTest.java |   68 -
 .../storage/db/itest/CleanDatabase.java            |   36 -
 .../artifactory/storage/db/itest/DbBaseTest.java   |  169 -
 .../artifactory/storage/db/itest/DbTestUtils.java  |  146 -
 .../storage/db/itest/DummyArtifactoryContext.java  |  291 --
 .../db/itest/spring/DbTestConfigFactory.java       |  152 -
 .../itest/spring/DbUpgradeTestConfigFactory.java   |   92 -
 .../storage/db/security/acl/AclsCacheTest.java     |  106 -
 .../storage/db/security/entity/AclTest.java        |  167 -
 .../storage/db/security/entity/GroupTest.java      |   63 -
 .../db/security/entity/PermissionTargetTest.java   |   70 -
 .../storage/db/security/entity/UserGroupTest.java  |   75 -
 .../storage/db/security/entity/UserTest.java       |  118 -
 .../storage/db/security/itest/dao/AclsDaoTest.java |  276 --
 .../security/itest/dao/FullDeleteAclsDaoTest.java  |   84 -
 .../itest/dao/FullDeleteUserGroupsDaoTest.java     |   58 -
 .../db/security/itest/dao/SecurityBaseDaoTest.java |  207 -
 .../db/security/itest/dao/UserGroupsDaoTest.java   |  624 ---
 .../security/itest/dao/UserPropertiesDaoTest.java  |   72 -
 .../itest/service/UserGroupServiceImplTest.java    |  426 --
 .../db/upgrades/common/UpgradeBaseTest.java        |  142 -
 .../storage/db/upgrades/v310/UpgradeTo310.java     |   47 -
 .../versions/ArtifactoryDBVersionTest.java         |   55 -
 .../storage/db/util/BlobWrapperTest.java           |   57 -
 .../storage/db/util/ConcurrentIdGeneratorTest.java |  194 -
 .../storage/db/util/IdGeneratorBaseTest.java       |   58 -
 .../storage/db/util/SimpleIdGeneratorTest.java     |   77 -
 .../resources/aql/stream/buildsWithArtifacts.json  |   91 -
 .../resources/aql/stream/buildsWithDependency.json |   91 -
 .../test/resources/aql/stream/buildsWithItems.json |  150 -
 .../resources/aql/stream/buildsWithModules.json    |   49 -
 .../resources/aql/stream/buildsWithProperties.json |   59 -
 .../aql/stream/dependenciesWithStats.json          |   74 -
 .../itemWithPropertiesStatisticsAndArchive.json    |   77 -
 .../db/src/test/resources/aql/stream/items.json    |  130 -
 .../resources/aql/stream/itemsWithProperties.json  |  138 -
 .../aql/stream/modulesWithProperties.json          |   38 -
 .../resources/aql/stream/propertiesWithItems.json  |   96 -
 .../config/binarystore-filesystem-template.xml     |    3 -
 .../binarystore/config/binarystore-s3-template.xml |    7 -
 .../config/binarystore-sharding-template.xml       |   11 -
 .../config/binarystoreWithExistingProviders.xml    |    3 -
 .../config/binarystoreWithOverideProviders.xml     |    6 -
 .../binarystore/config/binarystoreWithTemplate.xml |    3 -
 .../config/binarystoreWithTemplateAndProvider.xml  |    6 -
 .../config/binarystoreWithUserChain.xml            |   16 -
 storage/db/src/test/resources/binstore/100c.bin    |  Bin 100 -> 0 bytes
 storage/db/src/test/resources/binstore/256w.bin    |    1 -
 storage/db/src/test/resources/binstore/2k.bin      |  Bin 2048 -> 0 bytes
 storage/db/src/test/resources/binstore/300c.bin    |  Bin 300 -> 0 bytes
 storage/db/src/test/resources/db/derby.properties  |   23 -
 .../src/test/resources/db/mssql-win2012.properties |    5 -
 storage/db/src/test/resources/db/mssql.properties  |   14 -
 storage/db/src/test/resources/db/mysql.properties  |    9 -
 .../src/test/resources/db/oracle-agent.properties  |    5 -
 storage/db/src/test/resources/db/oracle.properties |   13 -
 .../db/src/test/resources/db/postgresql.properties |    9 -
 storage/db/src/test/resources/jsons/build.json     |   52 -
 storage/db/src/test/resources/logback-dbtest.xml   |   32 -
 .../src/test/resources/spring/db-test-context.xml  |   21 -
 .../resources/spring/db-upgrade-test-context.xml   |   25 -
 storage/db/src/test/resources/sql/acls.sql         |   26 -
 .../db/src/test/resources/sql/aql_exclusion.sql    |   39 -
 storage/db/src/test/resources/sql/aql_msp.sql      |   37 -
 .../db/src/test/resources/sql/aql_properties.sql   |   36 -
 storage/db/src/test/resources/sql/aql_test.sql     |  161 -
 storage/db/src/test/resources/sql/binaries.sql     |   16 -
 .../db/src/test/resources/sql/build-modules.sql    |   25 -
 storage/db/src/test/resources/sql/builds.sql       |   46 -
 .../sql/db-props-with-artifactory-version.sql      |    4 -
 storage/db/src/test/resources/sql/db-props.sql     |    4 -
 storage/db/src/test/resources/sql/ha.sql           |    4 -
 .../src/test/resources/sql/nodes-for-service.sql   |   86 -
 .../db/src/test/resources/sql/nodes-summary.sql    |   32 -
 storage/db/src/test/resources/sql/nodes.sql        |  108 -
 storage/db/src/test/resources/sql/user-group.sql   |   29 -
 .../db/src/test/resources/sql/user_properties.sql  |    6 -
 storage/db/src/test/resources/testng-db.xml        |  211 -
 .../src/test/resources/upgrades/v300/data/acls.sql |   26 -
 .../test/resources/upgrades/v300/data/binaries.sql |   16 -
 .../resources/upgrades/v300/data/build-modules.sql |   29 -
 .../test/resources/upgrades/v300/data/builds.sql   |   26 -
 .../upgrades/v300/data/nodes-for-service.sql       |   83 -
 .../test/resources/upgrades/v300/data/nodes.sql    |   87 -
 .../resources/upgrades/v300/data/user-group.sql    |   22 -
 .../resources/upgrades/v300/ddl/derby/derby.sql    |  306 --
 .../resources/upgrades/v300/ddl/mssql/mssql.sql    |  306 --
 .../resources/upgrades/v300/ddl/mysql/mysql.sql    |  306 --
 .../resources/upgrades/v300/ddl/oracle/oracle.sql  |  306 --
 .../upgrades/v300/ddl/postgresql/postgresql.sql    |  306 --
 storage/pom.xml                                    |   38 -
 storage/update/pom.xml                             |   50 -
 .../artifactory/update/md/MetadataConverter.java   |   34 -
 .../update/md/MetadataConverterUtils.java          |   89 -
 .../org/artifactory/update/md/MetadataType.java    |   28 -
 .../org/artifactory/update/md/MetadataVersion.java |  222 -
 .../md/current/ConverterMetadataReaderImpl.java    |   57 -
 .../md/current/PassThroughMetadataReaderImpl.java  |  111 -
 .../update/md/v125rc0/MdFileConverter.java         |   57 -
 .../update/md/v125rc0/MdFolderConverter.java       |   63 -
 .../update/md/v125rc0/MdStatsConverter.java        |   59 -
 .../update/md/v125rc0/MetadataReader125.java       |   97 -
 .../md/v130beta3/ArtifactoryFileConverter.java     |   65 -
 .../md/v130beta3/ArtifactoryFolderConverter.java   |   55 -
 .../md/v130beta3/MetadataReader130beta3.java       |   49 -
 .../update/md/v130beta6/ChecksumsConverter.java    |  102 -
 .../FolderAdditionalInfoNameConverter.java         |   59 -
 .../md/v130beta6/MetadataReader130beta6.java       |   49 -
 .../update/md/v230/BaseRepoPathClassConverter.java |   84 -
 .../update/md/v230/MetadataReader230.java          |   49 -
 .../update/security/SecurityInfoReader.java        |   78 -
 .../update/security/SecurityVersion.java           |  146 -
 .../update/security/v1/AclsConverter.java          |  137 -
 .../security/v1/UserPermissionsConverter.java      |   64 -
 .../update/security/v2/RepoPathAclConverter.java   |  122 -
 .../update/security/v2/SimpleUserConverter.java    |   51 -
 .../update/security/v3/AclRepoKeysConverter.java   |   49 -
 .../update/security/v3/AnyRemoteConverter.java     |  117 -
 .../v4/AnnotatePermissionXmlConverter.java         |   76 -
 .../security/v6/LdapGroupSettingXmlConverter.java  |   63 -
 .../security/v6/LowercaseUsernameXmlConverter.java |  240 -
 .../org/artifactory/update/utils/BackupUtils.java  |   49 -
 .../update/md/MetadataConverterTest.java           |   39 -
 .../update/md/MetadataReaderBaseTest.java          |   53 -
 .../artifactory/update/md/MetadataVersionTest.java |   67 -
 .../update/md/v125rc0/MdFileConverterTest.java     |   57 -
 .../update/md/v125rc0/MdFolderConverterTest.java   |   58 -
 .../update/md/v125rc0/MdStatsConverterTest.java    |   54 -
 .../update/md/v125rc0/MetadataReader125Test.java   |   95 -
 .../md/v130beta3/ArtifactoryFileConverterTest.java |   58 -
 .../v130beta3/ArtifactoryFolderConverterTest.java  |   59 -
 .../md/v130beta3/MetadataReader130beta3Test.java   |   97 -
 .../md/v130beta6/ChecksumsConverterTest.java       |   64 -
 .../FolderAdditionalInfoNameConverterTest.java     |   56 -
 .../md/v130beta6/MetadataReader130beta6Test.java   |   92 -
 .../md/v230/RepoPathClassConverterTests.java       |   56 -
 .../update/security/SecurityConverterTest.java     |   29 -
 .../update/security/SecurityInfoReaderTest.java    |   66 -
 .../update/security/SecurityVersionTest.java       |  202 -
 .../update/security/v1/AclsConverterTest.java      |   87 -
 .../security/v1/UserPermissionsConverterTest.java  |   64 -
 .../security/v2/RepoPathAclConverterTest.java      |   99 -
 .../security/v2/SimpleUserConverterTest.java       |   65 -
 .../security/v3/AclRepoKeysConverterTest.java      |   70 -
 .../update/security/v3/AnyRemoteConverterTest.java |   78 -
 .../security/v6/LdapGroupSettingConverterTest.java |   57 -
 .../v6/LowercaseUsernameXmlConverterTest.java      |  112 -
 .../update/test/ArtifactoryVersionTest.java        |   70 -
 .../org/artifactory/update/test/FileIOTest.java    |   45 -
 .../update/test/ReadOldBackupsTest.java            |   91 -
 .../resources/backups/v122/artifactory.properties  |   20 -
 .../backups/v122rc0/artifactory.properties         |   20 -
 .../backups/v122rc1/artifactory.properties         |   20 -
 .../backups/v122rc2/artifactory.properties         |   20 -
 .../resources/backups/v125/artifactory.properties  |   20 -
 .../backups/v125rc0/artifactory.properties         |   20 -
 .../backups/v125rc1/artifactory.properties         |   20 -
 .../backups/v125rc2/artifactory.properties         |   20 -
 .../backups/v125rc3/artifactory.properties         |   20 -
 .../backups/v125rc4/artifactory.properties         |   20 -
 .../backups/v125rc5/artifactory.properties         |   20 -
 .../backups/v125rc6/artifactory.properties         |   20 -
 .../backups/v125u1/artifactory.properties          |   20 -
 .../backups/v130beta2/artifactory.config.xml       |  305 --
 .../backups/v130beta2/artifactory.properties       |   21 -
 .../test/resources/backups/v130beta2/security.xml  |  235 -
 .../backups/v130beta3/artifactory.config.xml       |  159 -
 .../backups/v130beta3/artifactory.properties       |   21 -
 .../test/resources/backups/v130beta3/security.xml  |  210 -
 .../backups/v130beta5/artifactory.config.xml       |  146 -
 .../backups/v130beta5/artifactory.properties       |   21 -
 .../test/resources/backups/v130beta5/security.xml  |   65 -
 .../resources/config/artifactory.config.136.xml    |  223 -
 .../resources/config/v6/artifactory.config.xml     |  175 -
 .../v125rc0/commons-cli-1.0.pom-expected.xml       |   33 -
 .../commons-cli-1.0.pom.artifactory-metadata       |   11 -
 .../metadata/v125rc0/commons-cli-expected.xml      |   30 -
 .../v125rc0/commons-cli.artifactory-metadata       |    6 -
 .../artifactory.folder.xml                         |   24 -
 .../v130beta3/artifactory.file-expected.xml        |   36 -
 .../metadata/v130beta3/artifactory.file.xml        |   30 -
 .../v130beta3/artifactory.folder-expected.xml      |   30 -
 .../metadata/v130beta3/artifactory.folder.xml      |   24 -
 .../artifactory.file.xml                           |   30 -
 .../artifactory.stats.xml                          |   21 -
 .../artifactory-folder.xml                         |   32 -
 .../v130beta6/artifactory-file-expected.xml        |   48 -
 .../metadata/v130beta6/artifactory-file.xml        |   36 -
 .../v130beta6/artifactory-folder-expected.xml      |   32 -
 .../metadata/v130beta6/artifactory-folder.xml      |   32 -
 .../artifactory-file.xml                           |   36 -
 .../artifactory.stats.xml                          |   21 -
 .../metadata/v230/artifactory-file-expected.xml    |   29 -
 .../resources/metadata/v230/artifactory-file.xml   |   29 -
 .../metadata/v230/artifactory-folder-expected.xml  |   15 -
 .../resources/metadata/v230/artifactory-folder.xml |   15 -
 .../artifactory-file.xml                           |   29 -
 .../test/resources/security/v1/security-big.xml    |  345 --
 .../resources/security/v1/security-expected.xml    |  107 -
 .../src/test/resources/security/v1/security.xml    |  137 -
 .../resources/security/v2/security-expected.xml    |  106 -
 .../src/test/resources/security/v2/security.xml    |  128 -
 .../v3/security-no-anything-permissions.xml        |   58 -
 .../security/v3/security-repokey-convert.xml       |  178 -
 .../src/test/resources/security/v3/security.xml    |  176 -
 .../security/v6/security.upperlowercase.xml        |  226 -
 .../src/test/resources/security/v6/security.xml    |  176 -
 .../src/test/resources/xsd/artifactory-v1_0_0.xsd  |  344 --
 .../src/test/resources/xsd/artifactory-v1_1_0.xsd  |  475 --
 .../src/test/resources/xsd/artifactory-v1_2_0.xsd  |  571 ---
 .../src/test/resources/xsd/artifactory-v1_2_6.xsd  |  597 ---
 .../src/test/resources/xsd/artifactory-v1_3_0.xsd  |  659 ---
 support/core/pom.xml                               |   47 -
 .../support/config/CollectConfiguration.java       |   53 -
 .../artifactory/support/config/Configuration.java  |   28 -
 .../config/analysis/ThreadDumpConfiguration.java   |   82 -
 .../support/config/bundle/BundleConfiguration.java |  124 -
 .../config/bundle/BundleConfigurationBuilder.java  |  181 -
 .../config/bundle/BundleConfigurationImpl.java     |  237 -
 .../configfiles/ConfigFilesConfiguration.java      |   39 -
 .../descriptor/ConfigDescriptorConfiguration.java  |   49 -
 .../config/security/SecurityInfoConfiguration.java |   49 -
 .../storage/StorageSummaryConfiguration.java       |   39 -
 .../config/system/SystemInfoConfiguration.java     |   40 -
 .../config/systemlogs/SystemLogsConfiguration.java |   93 -
 .../support/core/annotations/CollectService.java   |   65 -
 .../core/bundle/AbstractSupportBundleService.java  |  843 ----
 .../support/core/bundle/SupportBundleService.java  |   77 -
 .../core/bundle/SupportBundleServiceImpl.java      |  155 -
 .../core/collectors/AbstractContentCollector.java  |  149 -
 .../AbstractGenericContentCollector.java           |  107 -
 .../AbstractSpecificContentCollector.java          |   91 -
 .../support/core/collectors/ContentCollector.java  |   43 -
 .../collectors/analysis/ThreadDumpCollector.java   |  206 -
 .../config/ConfigDescriptorCollector.java          |  110 -
 .../configfiles/ConfigFilesCollector.java          |  116 -
 .../core/collectors/logs/LogsCollector.java        |  322 --
 .../collectors/security/SecurityInfoCollector.java |  118 -
 .../storage/StorageSummaryCollector.java           |  100 -
 .../collectors/system/SystemInfoCollector.java     |   95 -
 .../core/compression/CompressionService.java       |   40 -
 .../core/compression/CompressionServiceImpl.java   |   97 -
 .../exceptions/BundleConfigurationException.java   |   34 -
 .../ContentCollectionExceptionException.java       |   34 -
 .../core/exceptions/IllegalConditionException.java |   34 -
 .../core/exceptions/TaskInvocationException.java   |   34 -
 .../core/exceptions/TempDirAccessException.java    |   34 -
 .../support/utils/DatePatternsHolder.java          |  125 -
 .../org/artifactory/support/utils/FileUtils.java   |   48 -
 .../support/utils/StringBuilderWrapper.java        |  118 -
 .../config/bundle/BundleConfigurationTest.java     |   87 -
 .../artifactory/support/utils/FileUtilsTest.java   |   63 -
 .../support/utils/StringBuilderWrapperTest.java    |   51 -
 support/pom.xml                                    |   35 -
 tomcat/LICENSE                                     | 1057 +++++
 tomcat/NOTICE                                      |   45 +
 tomcat/RELEASE-NOTES                               |  172 +
 tomcat/RUNNING.txt                                 |  476 ++
 tomcat/bin/bootstrap.jar                           |  Bin 0 -> 32278 bytes
 tomcat/bin/catalina-tasks.xml                      |   39 +
 tomcat/bin/catalina.bat                            |  353 ++
 tomcat/bin/catalina.sh                             |  614 +++
 tomcat/bin/commons-daemon-native.tar.gz            |  Bin 0 -> 204944 bytes
 tomcat/bin/commons-daemon.jar                      |  Bin 0 -> 24283 bytes
 tomcat/bin/configtest.bat                          |   58 +
 tomcat/bin/configtest.sh                           |   60 +
 tomcat/bin/daemon.sh                               |  252 ++
 tomcat/bin/digest.bat                              |   58 +
 tomcat/bin/digest.sh                               |   60 +
 tomcat/bin/setclasspath.bat                        |   93 +
 tomcat/bin/setclasspath.sh                         |   94 +
 tomcat/bin/shutdown.bat                            |   58 +
 tomcat/bin/shutdown.sh                             |   60 +
 tomcat/bin/startup.bat                             |   58 +
 tomcat/bin/startup.sh                              |   60 +
 tomcat/bin/tomcat-juli.jar                         |  Bin 0 -> 40852 bytes
 tomcat/bin/tomcat-native.tar.gz                    |  Bin 0 -> 391853 bytes
 tomcat/bin/tool-wrapper.bat                        |   96 +
 tomcat/bin/tool-wrapper.sh                         |  139 +
 tomcat/bin/version.bat                             |   58 +
 tomcat/bin/version.sh                              |   60 +
 .../conf/Catalina/localhost}/artifactory.xml       |    0
 tomcat/conf/catalina.policy                        |  260 ++
 tomcat/conf/catalina.properties                    |  146 +
 .../misc/tomcat => tomcat/conf}/logging.properties |    0
 .../install/misc/tomcat => tomcat/conf}/server.xml |    0
 tomcat/conf/web.xml                                | 4612 ++++++++++++++++++++
 tomcat/lib/annotations-api.jar                     |  Bin 0 -> 18109 bytes
 tomcat/lib/catalina.jar                            |  Bin 0 -> 1573532 bytes
 tomcat/lib/el-api.jar                              |  Bin 0 -> 81492 bytes
 tomcat/lib/servlet-api.jar                         |  Bin 0 -> 244212 bytes
 tomcat/lib/tomcat-api.jar                          |  Bin 0 -> 9841 bytes
 tomcat/lib/tomcat-coyote.jar                       |  Bin 0 -> 713754 bytes
 tomcat/lib/tomcat-jni.jar                          |  Bin 0 -> 31474 bytes
 tomcat/lib/tomcat-util-scan.jar                    |  Bin 0 -> 202267 bytes
 tomcat/lib/tomcat-util.jar                         |  Bin 0 -> 112858 bytes
 .../misc/tomcat => tomcat/webapps/ROOT}/index.html |    0
 web/angular-web/pom.xml                            |   92 -
 web/angular-web/src/main/resources/DUMMY.TXT       |    1 -
 web/angular-web/src/main/webapp/.bowerrc           |    1 -
 web/angular-web/src/main/webapp/.gitignore         |    5 -
 web/angular-web/src/main/webapp/.npmrc             |    0
 web/angular-web/src/main/webapp/Gulpfile.js        |  298 --
 web/angular-web/src/main/webapp/app/app.html       |   42 -
 web/angular-web/src/main/webapp/app/app.js         |  241 -
 .../main/webapp/app/assets/fonts/artifactory.eot   |  Bin 30772 -> 0 bytes
 .../main/webapp/app/assets/fonts/artifactory.svg   |  128 -
 .../main/webapp/app/assets/fonts/artifactory.ttf   |  Bin 30592 -> 0 bytes
 .../main/webapp/app/assets/fonts/artifactory.woff  |  Bin 30668 -> 0 bytes
 .../main/webapp/app/assets/fonts/artifactory.woff2 |  Bin 15284 -> 0 bytes
 .../assets/fonts/glyphicons-halflings-regular.eot  |  Bin 20127 -> 0 bytes
 .../assets/fonts/glyphicons-halflings-regular.svg  |  288 --
 .../assets/fonts/glyphicons-halflings-regular.ttf  |  Bin 45404 -> 0 bytes
 .../assets/fonts/glyphicons-halflings-regular.woff |  Bin 23424 -> 0 bytes
 .../fonts/glyphicons-halflings-regular.woff2       |  Bin 18028 -> 0 bytes
 .../src/main/webapp/app/assets/images/32px.png     |  Bin 18724 -> 0 bytes
 .../main/webapp/app/assets/images/32px_trash.png   |  Bin 3765 -> 0 bytes
 .../main/webapp/app/assets/images/403_image.svg    |  931 ----
 .../main/webapp/app/assets/images/404_image.svg    |  823 ----
 .../src/main/webapp/app/assets/images/40px.png     |  Bin 1880 -> 0 bytes
 .../src/main/webapp/app/assets/images/actions.png  |  Bin 35909 -> 0 bytes
 .../src/main/webapp/app/assets/images/admin.png    |  Bin 570 -> 0 bytes
 .../main/webapp/app/assets/images/arrow_left.png   |  Bin 1270 -> 0 bytes
 .../main/webapp/app/assets/images/arrow_right.png  |  Bin 1270 -> 0 bytes
 .../webapp/app/assets/images/artifactory_logo.png  |  Bin 4698 -> 0 bytes
 .../webapp/app/assets/images/artifactory_logo.svg  |  297 --
 .../webapp/app/assets/images/blackduck_logo.png    |  Bin 4327 -> 0 bytes
 .../src/main/webapp/app/assets/images/build.png    |  Bin 636 -> 0 bytes
 .../src/main/webapp/app/assets/images/checkbox.png |  Bin 35760 -> 0 bytes
 .../webapp/app/assets/images/checkbox_checked.png  |  Bin 35906 -> 0 bytes
 .../webapp/app/assets/images/delete-recursive.png  |  Bin 1541 -> 0 bytes
 .../src/main/webapp/app/assets/images/delete.png   |  Bin 1608 -> 0 bytes
 .../src/main/webapp/app/assets/images/deploy.png   |  Bin 1707 -> 0 bytes
 .../src/main/webapp/app/assets/images/download.png |  Bin 35878 -> 0 bytes
 .../main/webapp/app/assets/images/downloaded.png   |  Bin 1951 -> 0 bytes
 .../main/webapp/app/assets/images/favicon-old.ico  |  Bin 428 -> 0 bytes
 .../src/main/webapp/app/assets/images/favicon.ico  |  Bin 15086 -> 0 bytes
 .../src/main/webapp/app/assets/images/file.png     |  Bin 263 -> 0 bytes
 .../webapp/app/assets/images/folder-closed.png     |  Bin 281 -> 0 bytes
 .../src/main/webapp/app/assets/images/folder.png   |  Bin 289 -> 0 bytes
 .../main/webapp/app/assets/images/footer-icon.png  |  Bin 3082 -> 0 bytes
 .../assets/images/grid-row-not-selected-hover.png  |  Bin 1574 -> 0 bytes
 .../app/assets/images/grid-row-not-selected.png    |  Bin 1537 -> 0 bytes
 .../webapp/app/assets/images/grid-row-selected.png |  Bin 1561 -> 0 bytes
 .../webapp/app/assets/images/grid_checkbox.png     |  Bin 36451 -> 0 bytes
 .../src/main/webapp/app/assets/images/home.png     |  Bin 424 -> 0 bytes
 .../assets/images/jqueryui/animated-overlay.gif    |  Bin 1738 -> 0 bytes
 .../images/jqueryui/ui-bg_flat_0_aaaaaa_40x100.png |  Bin 212 -> 0 bytes
 .../jqueryui/ui-bg_flat_75_ffffff_40x100.png       |  Bin 208 -> 0 bytes
 .../jqueryui/ui-bg_glass_55_fbf9ee_1x400.png       |  Bin 335 -> 0 bytes
 .../jqueryui/ui-bg_glass_65_ffffff_1x400.png       |  Bin 207 -> 0 bytes
 .../jqueryui/ui-bg_glass_75_dadada_1x400.png       |  Bin 262 -> 0 bytes
 .../jqueryui/ui-bg_glass_75_e6e6e6_1x400.png       |  Bin 262 -> 0 bytes
 .../jqueryui/ui-bg_glass_95_fef1ec_1x400.png       |  Bin 332 -> 0 bytes
 .../ui-bg_highlight-soft_75_cccccc_1x100.png       |  Bin 280 -> 0 bytes
 .../images/jqueryui/ui-icons_222222_256x240.png    |  Bin 6922 -> 0 bytes
 .../images/jqueryui/ui-icons_2e83ff_256x240.png    |  Bin 4549 -> 0 bytes
 .../images/jqueryui/ui-icons_454545_256x240.png    |  Bin 6992 -> 0 bytes
 .../images/jqueryui/ui-icons_888888_256x240.png    |  Bin 6999 -> 0 bytes
 .../images/jqueryui/ui-icons_cd0a0a_256x240.png    |  Bin 4549 -> 0 bytes
 .../webapp/app/assets/images/more-tabs-arrow.png   |  Bin 1393 -> 0 bytes
 .../webapp/app/assets/images/node-closed-2.png     |  Bin 2866 -> 0 bytes
 .../webapp/app/assets/images/node-closed-light.png |  Bin 2863 -> 0 bytes
 .../main/webapp/app/assets/images/node-closed.png  |  Bin 2868 -> 0 bytes
 .../webapp/app/assets/images/node-opened-2.png     |  Bin 2864 -> 0 bytes
 .../webapp/app/assets/images/node-opened-light.png |  Bin 2856 -> 0 bytes
 .../main/webapp/app/assets/images/node-opened.png  |  Bin 2864 -> 0 bytes
 .../src/main/webapp/app/assets/images/sample.png   |  Bin 73892 -> 0 bytes
 .../src/main/webapp/app/assets/images/search.png   |  Bin 395 -> 0 bytes
 .../main/webapp/app/assets/images/set-me-up.png    |  Bin 1786 -> 0 bytes
 .../src/main/webapp/app/assets/images/throbber.gif |  Bin 1720 -> 0 bytes
 .../src/main/webapp/app/assets/images/tooltip.png  |  Bin 28151 -> 0 bytes
 .../webapp/app/assets/images/tooltips-icon.png     |  Bin 538 -> 0 bytes
 .../main/webapp/app/assets/images/tree-spinner.gif |  Bin 3982 -> 0 bytes
 .../main/webapp/app/assets/images/tree_cache.png   |  Bin 394 -> 0 bytes
 .../main/webapp/app/assets/images/tree_file.png    |  Bin 239 -> 0 bytes
 .../main/webapp/app/assets/images/tree_folder.png  |  Bin 366 -> 0 bytes
 .../main/webapp/app/assets/images/tree_repo.png    |  Bin 319 -> 0 bytes
 .../main/webapp/app/assets/images/tree_virtual.png |  Bin 489 -> 0 bytes
 .../src/main/webapp/app/assets/images/view.png     |  Bin 36063 -> 0 bytes
 .../main/webapp/app/assets/stylesheets/admin.less  | 1051 -----
 .../app/assets/stylesheets/artifact_modals.less    |   45 -
 .../app/assets/stylesheets/artifactory-icons.less  |  446 --
 .../app/assets/stylesheets/artifactory_grid.less   |  634 ---
 .../webapp/app/assets/stylesheets/artifacts.less   | 1204 -----
 .../main/webapp/app/assets/stylesheets/build.less  |  196 -
 .../main/webapp/app/assets/stylesheets/common.less | 2005 ---------
 .../webapp/app/assets/stylesheets/error_pages.less |   39 -
 .../webapp/app/assets/stylesheets/features.less    |   43 -
 .../main/webapp/app/assets/stylesheets/home.less   |  273 --
 .../webapp/app/assets/stylesheets/jf_switch.less   |   42 -
 .../main/webapp/app/assets/stylesheets/layout.less |  373 --
 .../main/webapp/app/assets/stylesheets/login.less  |  107 -
 .../main/webapp/app/assets/stylesheets/main.less   |   28 -
 .../main/webapp/app/assets/stylesheets/mixins.less |   29 -
 .../main/webapp/app/assets/stylesheets/modal.less  |  133 -
 .../main/webapp/app/assets/stylesheets/repos.less  |  359 --
 .../main/webapp/app/assets/stylesheets/search.less |  473 --
 .../webapp/app/assets/stylesheets/selectbox.less   |  323 --
 .../webapp/app/assets/stylesheets/sidebar.less     |  484 --
 .../app/assets/stylesheets/storage_viewer.less     |  303 --
 .../main/webapp/app/assets/stylesheets/tabs.less   |   95 -
 .../assets/stylesheets/tree-control-attribute.less |  109 -
 .../app/assets/stylesheets/tree-control.less       |  109 -
 .../app/assets/stylesheets/user_profile.less       |   79 -
 .../webapp/app/assets/stylesheets/variables.less   |   91 -
 .../src/main/webapp/app/assets/svgicons/admin.svg  |   37 -
 .../main/webapp/app/assets/svgicons/artifacts.svg  |   16 -
 .../src/main/webapp/app/assets/svgicons/build.svg  |   20 -
 .../src/main/webapp/app/assets/svgicons/home.svg   |   17 -
 .../src/main/webapp/app/constants/api.constants.js |  102 -
 .../app/constants/artifact_tooltip.constant.js     |  588 ---
 .../app/constants/artifactory_help.constants.js    |  560 ---
 .../app/constants/artifacts_actions.constants.js   |   31 -
 .../app/constants/artifacts_events.constants.js    |   56 -
 .../app/constants/common_events.constants.js       |   10 -
 .../webapp/app/constants/field_options.constats.js |  202 -
 .../main/webapp/app/constants/keys.constants.js    |   15 -
 .../main/webapp/app/constants/roles.constants.js   |    5 -
 .../app/constants/setmeup_snippets.constants.js    |  352 --
 .../webapp/app/constants/user_actions.constants.js |    7 -
 .../webapp/app/constants/validation.constants.js   |   89 -
 .../src/main/webapp/app/data/artifactory_dao.js    |  138 -
 .../main/webapp/app/data/artifactory_dao_module.js |  165 -
 .../data/artifactory_notifications_interceptor.js  |   47 -
 .../app/data/dao/admin_security_general_dao.js     |   24 -
 .../app/data/dao/artifact/artifact_actions_dao.js  |   32 -
 .../app/data/dao/artifact/artifact_builds_dao.js   |   21 -
 .../app/data/dao/artifact/artifact_deploy_dao.js   |   29 -
 .../app/data/dao/artifact/artifact_general_dao.js  |   17 -
 .../app/data/dao/artifact/artifact_licenses_dao.js |   39 -
 .../dao/artifact/artifact_package_search_dao.js    |   23 -
 .../data/dao/artifact/artifact_permissions_dao.js  |   15 -
 .../app/data/dao/artifact/artifact_property_dao.js |   29 -
 .../app/data/dao/artifact/artifact_search_dao.js   |   27 -
 .../app/data/dao/artifact/artifact_views_dao.js    |   19 -
 .../data/dao/artifact/artifact_viewsource_dao.js   |   10 -
 .../app/data/dao/artifact/artifact_watches_dao.js  |   17 -
 .../src/main/webapp/app/data/dao/backup_dao.js     |   21 -
 .../app/data/dao/binary_providers_info_dao.js      |   11 -
 .../src/main/webapp/app/data/dao/bintray_dao.js    |   19 -
 .../src/main/webapp/app/data/dao/black_duck_dao.js |   10 -
 .../main/webapp/app/data/dao/browse_files_dao.js   |   16 -
 .../main/webapp/app/data/dao/builds/builds_dao.js  |   46 -
 .../src/main/webapp/app/data/dao/checksums_dao.js  |   15 -
 .../webapp/app/data/dao/config_descriptor_dao.js   |   21 -
 .../src/main/webapp/app/data/dao/cron_time_dao.js  |   18 -
 .../webapp/app/data/dao/crowd_integration_dao.js   |   24 -
 .../main/webapp/app/data/dao/date_format_dao.js    |   17 -
 .../app/data/dao/dependency_declaration_dao.js     |    8 -
 .../main/webapp/app/data/dao/distribution_dao.js   |   22 -
 .../main/webapp/app/data/dao/docker_status_dao.js  |   11 -
 .../src/main/webapp/app/data/dao/export_dao.js     |   17 -
 .../webapp/app/data/dao/filtered_resource_dao.js   |   13 -
 .../src/main/webapp/app/data/dao/footer_dao.js     |   43 -
 .../main/webapp/app/data/dao/general_config_dao.js |   18 -
 .../app/data/dao/global_replications_config_dao.js |   12 -
 .../src/main/webapp/app/data/dao/governance_dao.js |    8 -
 .../webapp/app/data/dao/group_permissions_dao.js   |   17 -
 .../src/main/webapp/app/data/dao/groups_dao.js     |   35 -
 .../src/main/webapp/app/data/dao/ha_dao.js         |   10 -
 .../src/main/webapp/app/data/dao/home_page_dao.js  |    6 -
 .../src/main/webapp/app/data/dao/http_sso_dao.js   |   10 -
 .../src/main/webapp/app/data/dao/import_dao.js     |   17 -
 .../src/main/webapp/app/data/dao/indexer_dao.js    |   21 -
 .../src/main/webapp/app/data/dao/keystore_dao.js   |   32 -
 .../src/main/webapp/app/data/dao/ldap_dao.js       |   33 -
 .../main/webapp/app/data/dao/ldap_groups_dao.js    |   33 -
 .../src/main/webapp/app/data/dao/licenses_dao.js   |   36 -
 .../src/main/webapp/app/data/dao/mail_dao.js       |   10 -
 .../main/webapp/app/data/dao/maintenance_dao.js    |   13 -
 .../main/webapp/app/data/dao/name_validator_dao.js |   17 -
 .../src/main/webapp/app/data/dao/oauth_dao.js      |   40 -
 .../app/data/dao/passwords_encryption_dao.js       |   24 -
 .../main/webapp/app/data/dao/permissions_dao.js    |   40 -
 .../webapp/app/data/dao/predefine_values_dao.js    |   15 -
 .../main/webapp/app/data/dao/property_sets_dao.js  |   83 -
 .../src/main/webapp/app/data/dao/proxies_dao.js    |   24 -
 .../webapp/app/data/dao/push_to_bintray_dao.js     |   39 -
 .../main/webapp/app/data/dao/register_pro_dao.js   |   11 -
 .../src/main/webapp/app/data/dao/repo_data_dao.js  |   27 -
 .../webapp/app/data/dao/repo_property_set_dao.js   |   10 -
 .../main/webapp/app/data/dao/repositories_dao.js   |  134 -
 .../app/data/dao/repositories_layouts_dao.js       |   30 -
 .../webapp/app/data/dao/reverse_proxies_dao.js     |   23 -
 .../src/main/webapp/app/data/dao/saml_dao.js       |   18 -
 .../webapp/app/data/dao/security_descriptor_dao.js |   21 -
 .../main/webapp/app/data/dao/server_time_dao.js    |   10 -
 .../src/main/webapp/app/data/dao/set_me_up_dao.js  |   41 -
 .../main/webapp/app/data/dao/signing_keys_dao.js   |   29 -
 .../src/main/webapp/app/data/dao/ssh_client_dao.js |   12 -
 .../src/main/webapp/app/data/dao/ssh_server_dao.js |   10 -
 .../main/webapp/app/data/dao/stash_results_dao.js  |   62 -
 .../webapp/app/data/dao/storage_summary_dao.js     |   10 -
 .../main/webapp/app/data/dao/support_page_dao.js   |   21 -
 .../main/webapp/app/data/dao/system_info_dao.js    |   13 -
 .../main/webapp/app/data/dao/system_logs_dao.js    |   20 -
 .../main/webapp/app/data/dao/tree_browser_dao.js   |   80 -
 .../src/main/webapp/app/data/dao/tree_node.js      |  265 --
 .../webapp/app/data/dao/unique_id_validator_dao.js |   17 -
 .../src/main/webapp/app/data/dao/user_dao.js       |   73 -
 .../main/webapp/app/data/dao/user_profile_dao.js   |   31 -
 .../src/main/webapp/app/data/dao/xml_name_dao.js   |   17 -
 .../directives/artifactory.directives.module.js    |  142 -
 .../accordion-remember-item-in-category.js         |   82 -
 .../app/directives/jf_accordion/jf_accordion.html  |   30 -
 .../app/directives/jf_accordion/jf_accordion.js    |   56 -
 .../app/directives/jf_actions/jf_actions.html      |   36 -
 .../webapp/app/directives/jf_actions/jf_actions.js |  151 -
 .../jf_auto_complete/jf_auto_complete.js           |   45 -
 .../app/directives/jf_autofocus/jf_autofocus.js    |   10 -
 .../app/directives/jf_body_class/jf_body_class.js  |   36 -
 .../directives/jf_breadcrumb/jf_breadcrumb.html    |    5 -
 .../app/directives/jf_breadcrumb/jf_breadcrumb.js  |   70 -
 .../jf_browse_files/jf_browse_files.html           |    3 -
 .../directives/jf_browse_files/jf_browse_files.js  |  287 --
 .../app/directives/jf_checkbox/jf_checkbox.html    |    3 -
 .../app/directives/jf_checkbox/jf_checkbox.js      |   22 -
 .../directives/jf_clear_errors/jf_clear_errors.js  |   25 -
 .../app/directives/jf_clip_copy/jf_clip_copy.html  |   12 -
 .../app/directives/jf_clip_copy/jf_clip_copy.js    |   82 -
 .../main/webapp/app/directives/jf_code/jf_code.js  |   20 -
 .../app/directives/jf_codemirror/jf_codemirror.js  |   74 -
 .../app/directives/jf_codemirror/search/search.js  |  213 -
 .../jf_cron_formatter/jf_cron_formatter.js         |   31 -
 .../jf_deploy/artifactory_deploy_modal.js          |  143 -
 .../app/directives/jf_deploy/jf_multi_deploy.html  |   51 -
 .../app/directives/jf_deploy/jf_multi_deploy.js    |  281 --
 .../app/directives/jf_deploy/jf_single_deploy.html |  342 --
 .../app/directives/jf_deploy/jf_single_deploy.js   |  600 ---
 .../jf_disable_feature/jf_disable_feature.js       |   43 -
 .../jf_disable_ng_animate/jf_disable_ng_animate.js |   13 -
 .../directives/jf_docker_v2_layer/cmd_color_map.js |   19 -
 .../jf_docker_v2_layer/jf_docker_v2_layer.html     |   25 -
 .../jf_docker_v2_layer/jf_docker_v2_layer.js       |   55 -
 .../jf_docker_v2_layers/details_key_dictionary.js  |    8 -
 .../jf_docker_v2_layers/jf_docker_v2_layers.html   |   13 -
 .../jf_docker_v2_layers/jf_docker_v2_layers.js     |   40 -
 .../app/directives/jf_drag_drop/jf_drag_drop.html  |  102 -
 .../app/directives/jf_drag_drop/jf_drag_drop.js    |  695 ---
 .../jf_dynamic_directive/jf_dynamic_directive.js   |   14 -
 .../directives/jf_enter_press/jf_enter_press.js    |   26 -
 .../webapp/app/directives/jf_field/jf_field.html   |    9 -
 .../webapp/app/directives/jf_field/jf_field.js     |  146 -
 .../app/directives/jf_file_drop/jf_file_drop.html  |   32 -
 .../app/directives/jf_file_drop/jf_file_drop.js    |   18 -
 .../webapp/app/directives/jf_footer/jf_footer.html |    1 -
 .../webapp/app/directives/jf_footer/jf_footer.js   |   14 -
 .../webapp/app/directives/jf_grid/jf_grid.html     |   34 -
 .../main/webapp/app/directives/jf_grid/jf_grid.js  |  114 -
 .../jf_grid_batch_actions.html                     |   12 -
 .../jf_grid_batch_actions/jf_grid_batch_actions.js |   23 -
 .../directives/jf_grid_filter/jf_grid_filter.html  |   24 -
 .../directives/jf_grid_filter/jf_grid_filter.js    |  139 -
 .../jf_grid_pagination/jf_grid_pagination.html     |   17 -
 .../jf_grid_pagination/jf_grid_pagination.js       |   61 -
 .../webapp/app/directives/jf_header/jf_header.html |   36 -
 .../webapp/app/directives/jf_header/jf_header.js   |  129 -
 .../jf_header_search/jf_header_search.html         |   13 -
 .../jf_header_search/jf_header_search.js           |   83 -
 .../jf_help_tooltip/jf_help_tooltip.html           |    5 -
 .../directives/jf_help_tooltip/jf_help_tooltip.js  |   36 -
 .../directives/jf_hide_for_aol/jf_hide_for_aol.js  |   10 -
 .../jf_input_text_v2/jf_input_text_v2.html         |   19 -
 .../jf_input_text_v2/jf_input_text_v2.js           |   52 -
 .../webapp/app/directives/jf_list/jf_list.html     |    9 -
 .../main/webapp/app/directives/jf_list/jf_list.js  |   44 -
 .../directives/jf_list_maker/jf_list_maker.html    |   38 -
 .../app/directives/jf_list_maker/jf_list_maker.js  |   58 -
 .../app/directives/jf_messages/jf_messages.html    |   21 -
 .../app/directives/jf_messages/jf_messages.js      |   80 -
 .../webapp/app/directives/jf_panel/jf_panel.html   |    8 -
 .../webapp/app/directives/jf_panel/jf_panel.js     |   10 -
 .../webapp/app/directives/jf_print/jf_print.html   |    5 -
 .../webapp/app/directives/jf_print/jf_print.js     |   47 -
 .../jf_repokey_validator/jf_repokey_validtaor.js   |   35 -
 .../directives/jf_reveal_input/jf_reveal_input.js  |   44 -
 .../webapp/app/directives/jf_search/jf_search.html |   12 -
 .../webapp/app/directives/jf_search/jf_search.js   |   83 -
 .../jf_search/search_tabs/jf_checksum.html         |   23 -
 .../jf_search/search_tabs/jf_checksum.js           |   36 -
 .../directives/jf_search/search_tabs/jf_class.html |   52 -
 .../directives/jf_search/search_tabs/jf_class.js   |   37 -
 .../directives/jf_search/search_tabs/jf_gavc.html  |   59 -
 .../directives/jf_search/search_tabs/jf_gavc.js    |   40 -
 .../jf_search/search_tabs/jf_package.html          |   66 -
 .../directives/jf_search/search_tabs/jf_package.js |  222 -
 .../jf_search/search_tabs/jf_property.html         |   99 -
 .../jf_search/search_tabs/jf_property.js           |  204 -
 .../directives/jf_search/search_tabs/jf_quick.html |   26 -
 .../directives/jf_search/search_tabs/jf_quick.js   |   36 -
 .../jf_search/search_tabs/jf_remote.html           |   39 -
 .../directives/jf_search/search_tabs/jf_remote.js  |   62 -
 .../directives/jf_search/search_tabs/jf_trash.html |   25 -
 .../directives/jf_search/search_tabs/jf_trash.js   |   38 -
 .../jf_search/search_tabs/search_tabs.module.js    |   24 -
 .../app/directives/jf_sidebar/jf_sidebar.html      |   58 -
 .../webapp/app/directives/jf_sidebar/jf_sidebar.js |  158 -
 .../webapp/app/directives/jf_sidebar/mlpushmenu.js |  239 -
 .../jf_special_chars/jf_special_chars.js           |   28 -
 .../app/directives/jf_spinner/jf_spinner.html      |    8 -
 .../webapp/app/directives/jf_spinner/jf_spinner.js |   57 -
 .../webapp/app/directives/jf_switch/jf_switch.html |   13 -
 .../webapp/app/directives/jf_switch/jf_switch.js   |   56 -
 .../jf_switch_toggle/jf_switch_toggle.html         |    5 -
 .../jf_switch_toggle/jf_switch_toggle.js           |   23 -
 .../main/webapp/app/directives/jf_tabs/jf_tab.html |    4 -
 .../main/webapp/app/directives/jf_tabs/jf_tab.js   |   13 -
 .../webapp/app/directives/jf_tabs/jf_tabs.html     |   20 -
 .../main/webapp/app/directives/jf_tabs/jf_tabs.js  |  118 -
 .../webapp/app/directives/jf_tooltip/jf_tooltip.js |   23 -
 .../jf_tooltip_on_overflow.js                      |   54 -
 .../app/directives/jf_ui_select/jf_ui_select.html  |    9 -
 .../app/directives/jf_ui_select/jf_ui_select.js    |   37 -
 .../directives/jf_validation/jf_validation.html    |    5 -
 .../app/directives/jf_validation/jf_validation.js  |   21 -
 .../rtfact_storage_element.html                    |   92 -
 .../rtfact_storage_element.js                      |  199 -
 .../rtfact_storage_usage.html                      |   14 -
 .../rtfact_storage_viewer/rtfact_storage_usage.js  |   27 -
 .../rtfact_storage_viewer.html                     |    5 -
 .../rtfact_storage_viewer/rtfact_storage_viewer.js |  185 -
 .../rtfact_storage_viewer/special_values.js        |    7 -
 .../storage_types_dictionary.js                    |   16 -
 .../app/directives/validators/jf_validator_cron.js |   72 -
 .../validators/jf_validator_date_format.js         |   27 -
 .../validators/jf_validator_int_value.js           |   18 -
 .../directives/validators/jf_validator_ldap_url.js |   20 -
 .../validators/jf_validator_max_text_length.js     |   21 -
 .../app/directives/validators/jf_validator_name.js |   30 -
 .../validators/jf_validator_path_pattern.js        |   33 -
 .../validators/jf_validator_reverse_proxy_port.js  |   32 -
 .../validators/jf_validator_unique_id.js           |   31 -
 .../directives/validators/jf_validator_xml_name.js |   30 -
 .../app/filters/artifactory.filters.module.js      |   12 -
 .../src/main/webapp/app/filters/filesize.js        |   11 -
 .../src/main/webapp/app/filters/parse_links.js     |   12 -
 .../main/webapp/app/filters/replace_character.js   |   11 -
 .../webapp/app/filters/replace_string_for_aol.js   |   17 -
 .../src/main/webapp/app/filters/split_words.js     |   20 -
 .../src/main/webapp/app/layouts/application.html   |   25 -
 .../src/main/webapp/app/layouts/login.html         |   16 -
 .../src/main/webapp/app/models/admin_menu_items.js |   85 -
 .../src/main/webapp/app/models/models.module.js    |    4 -
 .../webapp/app/services/advanced_string_match.js   |  159 -
 .../main/webapp/app/services/artifact_actions.js   |  402 --
 .../app/services/artifactory.services.module.js    |   50 -
 .../webapp/app/services/artifactory_cookies.js     |   11 -
 .../app/services/artifactory_debug_interceptor.js  |   51 -
 .../webapp/app/services/artifactory_download.js    |    5 -
 .../webapp/app/services/artifactory_eventBus.js    |  104 -
 .../webapp/app/services/artifactory_features.js    |  325 --
 .../webapp/app/services/artifactory_http_client.js |   26 -
 .../app/services/artifactory_iframe_download.js    |   29 -
 .../services/artifactory_message_interceptor.js    |   32 -
 .../webapp/app/services/artifactory_model_saver.js |  116 -
 .../app/services/artifactory_notifications.js      |   94 -
 .../artifactory_server_error_interceptor.js        |   22 -
 .../services/artifactory_session_interceptor.js    |  122 -
 .../services/artifactory_spinner_interceptor.js    |  104 -
 .../main/webapp/app/services/artifactory_state.js  |   22 -
 .../webapp/app/services/artifactory_storage.js     |   54 -
 .../webapp/app/services/artifactory_xml_parser.js  |   11 -
 .../src/main/webapp/app/services/native_browser.js |   11 -
 .../src/main/webapp/app/services/parse_url.js      |    7 -
 .../webapp/app/services/recursive_directive.js     |   17 -
 .../main/webapp/app/services/set_me_up_modal.js    |  915 ----
 .../src/main/webapp/app/services/user.js           |  243 --
 .../webapp/app/states/admin/admin.controller.js    |   38 -
 .../src/main/webapp/app/states/admin/admin.html    |    3 -
 .../main/webapp/app/states/admin/admin.module.js   |   31 -
 .../states/admin/advanced/advanced.controller.js   |    9 -
 .../app/states/admin/advanced/advanced.module.js   |   32 -
 .../config_descriptor.controller.js                |   45 -
 .../config_descriptor/config_descriptor.html       |   38 -
 .../config_descriptor/config_descriptor.module.js  |   16 -
 .../advanced/maintenance/maintenance.controller.js |   77 -
 .../admin/advanced/maintenance/maintenance.html    |  205 -
 .../advanced/maintenance/maintenance.module.js     |   16 -
 .../security_descriptor.controller.js              |   43 -
 .../security_descriptor/security_descriptor.html   |   37 -
 .../security_descriptor.module.js                  |   16 -
 .../storage_summary/storage_summary.controller.js  |  225 -
 .../advanced/storage_summary/storage_summary.html  |   33 -
 .../storage_summary/storage_summary.module.js      |   15 -
 .../support_page/support_page.controller.js        |  299 --
 .../admin/advanced/support_page/support_page.html  |  184 -
 .../advanced/support_page/support_page.module.js   |   16 -
 .../advanced/system_info/system_info.controller.js |   22 -
 .../admin/advanced/system_info/system_info.html    |   22 -
 .../advanced/system_info/system_info.module.js     |   16 -
 .../advanced/system_logs/system_logs.controller.js |   92 -
 .../admin/advanced/system_logs/system_logs.html    |   34 -
 .../advanced/system_logs/system_logs.module.js     |   15 -
 .../configuration/bintray/bintray.controller.js    |   35 -
 .../admin/configuration/bintray/bintray.html       |   96 -
 .../admin/configuration/bintray/bintray.module.js  |   14 -
 .../black_duck/black_duck.controller.js            |   47 -
 .../admin/configuration/black_duck/black_duck.html |  107 -
 .../configuration/black_duck/black_duck.module.js  |   16 -
 .../configuration/configuration.controller.js      |    9 -
 .../admin/configuration/configuration.module.js    |   46 -
 .../configuration/general/general.controller.js    |  236 -
 .../admin/configuration/general/general.html       |  359 --
 .../admin/configuration/general/general.module.js  |   16 -
 .../states/admin/configuration/ha/ha.controller.js |  123 -
 .../app/states/admin/configuration/ha/ha.html      |   17 -
 .../app/states/admin/configuration/ha/ha.module.js |   15 -
 .../licenses/license_form.controller.js            |   51 -
 .../admin/configuration/licenses/license_form.html |  109 -
 .../configuration/licenses/licenses.controller.js  |  145 -
 .../admin/configuration/licenses/licenses.html     |   21 -
 .../configuration/licenses/licenses.module.js      |   32 -
 .../admin/configuration/mail/mail.controller.js    |   46 -
 .../app/states/admin/configuration/mail/mail.html  |  167 -
 .../states/admin/configuration/mail/mail.module.js |   15 -
 .../property_sets/property_form_modal.js           |   92 -
 .../property_sets/property_set_form.controller.js  |  171 -
 .../property_sets/property_set_form.html           |   56 -
 .../property_sets/property_sets.controller.js      |   95 -
 .../configuration/property_sets/property_sets.html |   17 -
 .../property_sets/property_sets.module.js          |   32 -
 .../configuration/proxies/proxies.controller.js    |  117 -
 .../admin/configuration/proxies/proxies.html       |   19 -
 .../admin/configuration/proxies/proxies.module.js  |   31 -
 .../configuration/proxies/proxy_form.controller.js |   57 -
 .../admin/configuration/proxies/proxy_form.html    |  159 -
 .../register_pro/register_pro.controller.js        |   42 -
 .../configuration/register_pro/register_pro.html   |   53 -
 .../register_pro/register_pro.module.js            |   15 -
 .../reverse_proxies/reverse_proxies.controller.js  |  100 -
 .../reverse_proxies/reverse_proxies.html           |   19 -
 .../reverse_proxies/reverse_proxies.module.js      |   40 -
 .../reverse_proxy_form.controller.js               |  139 -
 .../reverse_proxies/reverse_proxy_form.html        |  307 --
 .../app/states/admin/dashboard/dashboard.html      |    1 -
 .../app/states/admin/dashboard/dashboard.module.js |   10 -
 .../import_export/import_export.controller.js      |    7 -
 .../admin/import_export/import_export.module.js    |   21 -
 .../repositories/repositories.controller.js        |  160 -
 .../import_export/repositories/repositories.html   |  189 -
 .../repositories/repositories.module.js            |   17 -
 .../import_export/system/system.controller.js      |  110 -
 .../states/admin/import_export/system/system.html  |  176 -
 .../admin/import_export/system/system.module.js    |   14 -
 .../repositories/distribution_repository_form.html |  282 --
 .../admin/repositories/local_repository_form.html  |  490 ---
 .../admin/repositories/remote_repository_form.html |  908 ----
 .../admin/repositories/repositories.controller.js  |  321 --
 .../states/admin/repositories/repositories.html    |   22 -
 .../admin/repositories/repositories.module.js      |   66 -
 .../repositories_layouts.controller.js             |   86 -
 .../admin/repositories/repositories_layouts.html   |   18 -
 .../repositories/repository_form.controller.js     | 1419 ------
 .../states/admin/repositories/repository_form.html |   82 -
 .../repository_layout_form.controller.js           |  117 -
 .../admin/repositories/repository_layout_form.html |  211 -
 .../states/admin/repositories/reverse_proxy.html   |   37 -
 .../virtual_repository_form.controller.js          |  233 -
 .../repositories/virtual_repository_form.html      |  414 --
 .../crowd_integration.controller.js                |  193 -
 .../crowd_integration/crowd_integration.html       |  166 -
 .../crowd_integration/crowd_integration.module.js  |   16 -
 .../admin/security/general/general.controller.js   |  103 -
 .../app/states/admin/security/general/general.html |  190 -
 .../admin/security/general/general.module.js       |   15 -
 .../admin/security/groups/group.controller.js      |  107 -
 .../admin/security/groups/group_form.controller.js |  215 -
 .../states/admin/security/groups/group_form.html   |   78 -
 .../app/states/admin/security/groups/groups.html   |   18 -
 .../states/admin/security/groups/groups.module.js  |   30 -
 .../admin/security/http_sso/http_sso.controller.js |   33 -
 .../states/admin/security/http_sso/http_sso.html   |   71 -
 .../admin/security/http_sso/http_sso.module.js     |   16 -
 .../ldap_settings/ldap_group_form.controller.js    |  227 -
 .../security/ldap_settings/ldap_group_form.html    |  158 -
 .../ldap_settings/ldap_setting_form.controller.js  |   85 -
 .../security/ldap_settings/ldap_setting_form.html  |  215 -
 .../ldap_settings/ldap_settings.controller.js      |  295 --
 .../security/ldap_settings/ldap_settings.html      |   35 -
 .../security/ldap_settings/ldap_settings.module.js |   43 -
 .../admin/security/oauth/oauth.controller.js       |  130 -
 .../app/states/admin/security/oauth/oauth.html     |   73 -
 .../states/admin/security/oauth/oauth.module.js    |   33 -
 .../oauth/oauth_provider_form.controller.js        |   99 -
 .../admin/security/oauth/oauth_provider_form.html  |  165 -
 .../security/permissions/permission_form.html      |  177 -
 .../security/permissions/permissions.controller.js |  131 -
 .../admin/security/permissions/permissions.html    |   20 -
 .../security/permissions/permissions.module.js     |   29 -
 .../permissions/permissons_form.controller.js      |  521 ---
 .../saml_integration.controller.js                 |   39 -
 .../saml_integration/saml_integration.html         |  125 -
 .../saml_integration/saml_integration.module.js    |   16 -
 .../states/admin/security/security.controller.js   |   22 -
 .../app/states/admin/security/security.module.js   |   39 -
 .../signing_keys/signing_keys.controller.js        |  212 -
 .../admin/security/signing_keys/signing_keys.html  |  246 --
 .../security/signing_keys/signing_keys.module.js   |   16 -
 .../security/ssh_server/ssh_server.controller.js   |  133 -
 .../admin/security/ssh_server/ssh_server.html      |  123 -
 .../admin/security/ssh_server/ssh_server.module.js |   16 -
 .../admin/security/users/user_form.controller.js   |  418 --
 .../app/states/admin/security/users/user_form.html |  194 -
 .../admin/security/users/users.controller.js       |  188 -
 .../app/states/admin/security/users/users.html     |   22 -
 .../states/admin/security/users/users.module.js    |   30 -
 .../states/admin/services/admin.services.module.js |   20 -
 .../services/backups/backup_form.controller.js     |   90 -
 .../states/admin/services/backups/backup_form.html |  182 -
 .../admin/services/backups/backups.controller.js   |  121 -
 .../app/states/admin/services/backups/backups.html |   22 -
 .../admin/services/backups/backups.module.js       |   32 -
 .../admin/services/indexer/indexer.controller.js   |   46 -
 .../app/states/admin/services/indexer/indexer.html |   86 -
 .../admin/services/indexer/indexer.module.js       |   15 -
 .../states/admin/services/services.controller.js   |    7 -
 .../webapp/app/states/artifactory.states.module.js |  189 -
 .../webapp/app/states/artifacts/artifacts.html     |   57 -
 .../app/states/artifacts/artifacts.module.js       |   97 -
 .../artifacts/artifacts/artifacts.controller.js    |   99 -
 .../artifacts/browsers/browsers.controller.js      |   77 -
 .../app/states/artifacts/browsers/browsers.html    |   42 -
 .../artifact_browser_icons.constant-old.js         |   56 -
 .../constants/artifact_browser_icons.constant.js   |  113 -
 .../constants/artifact_general.constant.js         |  200 -
 .../jf_artifact_info/info_tabs/info_tabs.module.js |   46 -
 .../jf_artifact_info/info_tabs/jf_bower.html       |   37 -
 .../jf_artifact_info/info_tabs/jf_bower.js         |   87 -
 .../jf_artifact_info/info_tabs/jf_builds.html      |   20 -
 .../jf_artifact_info/info_tabs/jf_builds.js        |  175 -
 .../jf_artifact_info/info_tabs/jf_cocoapods.html   |   23 -
 .../jf_artifact_info/info_tabs/jf_cocoapods.js     |   86 -
 .../jf_artifact_info/info_tabs/jf_docker.html      |   29 -
 .../jf_artifact_info/info_tabs/jf_docker.js        |   68 -
 .../info_tabs/jf_docker_ancestry.html              |   12 -
 .../info_tabs/jf_docker_ancestry.js                |   98 -
 .../jf_artifact_info/info_tabs/jf_docker_v2.html   |   30 -
 .../jf_artifact_info/info_tabs/jf_docker_v2.js     |   96 -
 .../info_tabs/jf_effective_permissions.html        |    4 -
 .../info_tabs/jf_effective_permissions.js          |  108 -
 .../jf_artifact_info/info_tabs/jf_general.html     |  242 -
 .../jf_artifact_info/info_tabs/jf_general.js       |  328 --
 .../jf_artifact_info/info_tabs/jf_governance.html  |   72 -
 .../jf_artifact_info/info_tabs/jf_governance.js    |  133 -
 .../jf_artifact_info/info_tabs/jf_ivy_view.html    |   11 -
 .../jf_artifact_info/info_tabs/jf_ivy_view.js      |   54 -
 .../jf_artifact_info/info_tabs/jf_npm_info.html    |   21 -
 .../jf_artifact_info/info_tabs/jf_npm_info.js      |   87 -
 .../jf_artifact_info/info_tabs/jf_nuget.html       |   39 -
 .../jf_artifact_info/info_tabs/jf_nuget.js         |  121 -
 .../jf_artifact_info/info_tabs/jf_pom_view.html    |   12 -
 .../jf_artifact_info/info_tabs/jf_pom_view.js      |   55 -
 .../jf_artifact_info/info_tabs/jf_properties.html  |  101 -
 .../jf_artifact_info/info_tabs/jf_properties.js    |  452 --
 .../jf_artifact_info/info_tabs/jf_pypi.html        |   21 -
 .../jf_artifact_info/info_tabs/jf_pypi.js          |   86 -
 .../jf_artifact_info/info_tabs/jf_rpm_info.html    |   88 -
 .../jf_artifact_info/info_tabs/jf_rpm_info.js      |  150 -
 .../jf_artifact_info/info_tabs/jf_ruby_gems.html   |   28 -
 .../jf_artifact_info/info_tabs/jf_ruby_gems.js     |   93 -
 .../jf_artifact_info/info_tabs/jf_stash_info.html  |   97 -
 .../jf_artifact_info/info_tabs/jf_stash_info.js    |   68 -
 .../jf_artifact_info/info_tabs/jf_view_source.html |    7 -
 .../jf_artifact_info/info_tabs/jf_view_source.js   |   57 -
 .../jf_artifact_info/info_tabs/jf_watchers.html    |    5 -
 .../jf_artifact_info/info_tabs/jf_watchers.js      |  137 -
 .../jf_artifact_info/info_tabs/jf_xml_view.html    |   15 -
 .../jf_artifact_info/info_tabs/jf_xml_view.js      |   54 -
 .../jf_artifact_info/jf_artifact_info.html         |   75 -
 .../artifacts/jf_artifact_info/jf_artifact_info.js |   66 -
 .../jf_common_browser/jf_common_browser.config.js  |   21 -
 .../jf_common_browser/jf_common_browser.js         |  735 ----
 .../jf_simple_browser/jf_simple_browser.html       |   18 -
 .../jf_simple_browser/jf_simple_browser.js         |  290 --
 .../jf_simple_browser/jf_simple_tree.config.js     |    2 -
 .../jf_stash_browser/jf_stash_browser.config.js    |    4 -
 .../jf_stash_browser/jf_stash_browser.html         |    2 -
 .../artifacts/jf_stash_browser/jf_stash_browser.js |  422 --
 .../jf_tree_browser/jf_tree_browser.config.js      |    2 -
 .../artifacts/jf_tree_browser/jf_tree_browser.html |    2 -
 .../artifacts/jf_tree_browser/jf_tree_browser.js   |  600 ---
 .../artifacts/jf_tree_search/jf_tree_search.html   |   14 -
 .../artifacts/jf_tree_search/jf_tree_search.js     |   92 -
 .../states/artifacts/search/search.controller.js   | 1218 ------
 .../webapp/app/states/artifacts/search/search.html |  127 -
 .../artifacts/services/common_grid_columns.js      |   44 -
 .../artifacts/services/select_delete_versions.js   |   60 -
 .../artifacts/services/select_target_path.js       |  101 -
 .../main/webapp/app/states/base/base.controller.js |    6 -
 .../src/main/webapp/app/states/base/base.module.js |   23 -
 .../app/states/builds/all_builds.controller.js     |  151 -
 .../main/webapp/app/states/builds/all_builds.html  |    8 -
 .../src/main/webapp/app/states/builds/builds.html  |   12 -
 .../main/webapp/app/states/builds/builds.module.js |   42 -
 .../builds_history/builds_history.controller.js    |  180 -
 .../builds/builds_history/builds_history.html      |   10 -
 .../builds_info/build_tabs/build_tabs.module.js    |   22 -
 .../builds_info/build_tabs/jf_build_info_json.html |   11 -
 .../builds_info/build_tabs/jf_build_info_json.js   |   40 -
 .../build_tabs/jf_builds_governance.html           |   83 -
 .../builds_info/build_tabs/jf_builds_governance.js |  317 --
 .../builds/builds_info/build_tabs/jf_diff.html     |   40 -
 .../builds/builds_info/build_tabs/jf_diff.js       |  277 --
 .../builds_info/build_tabs/jf_environment.html     |   11 -
 .../builds_info/build_tabs/jf_environment.js       |   95 -
 .../builds_info/build_tabs/jf_general_info.html    |   19 -
 .../builds_info/build_tabs/jf_general_info.js      |   88 -
 .../builds/builds_info/build_tabs/jf_issues.html   |    7 -
 .../builds/builds_info/build_tabs/jf_issues.js     |   92 -
 .../builds/builds_info/build_tabs/jf_licenses.html |   75 -
 .../builds/builds_info/build_tabs/jf_licenses.js   |  416 --
 .../build_tabs/jf_published_modules.html           |   49 -
 .../builds_info/build_tabs/jf_published_modules.js |  423 --
 .../builds_info/build_tabs/jf_release_history.html |   22 -
 .../builds_info/build_tabs/jf_release_history.js   |   36 -
 .../builds/builds_info/builds_info.controller.js   |   35 -
 .../app/states/builds/builds_info/builds_info.html |   38 -
 .../builds_locate/builds_locate.controller.js      |   23 -
 .../states/builds/builds_locate/builds_locate.html |    8 -
 .../states/builds/constants/builds.constants.js    |   39 -
 .../change_password/change_password.controller.js  |   27 -
 .../states/change_password/change_password.html    |   55 -
 .../change_password/change_password.module.js      |   16 -
 .../app/states/forbidden_403/forbidden_403.html    |    6 -
 .../states/forbidden_403/forbidden_403.module.js   |   12 -
 .../forgot_password/forgot_password.controller.js  |   39 -
 .../states/forgot_password/forgot_password.html    |   35 -
 .../forgot_password/forgot_password.module.js      |   25 -
 .../forgot_password/reset_password.controller.js   |   52 -
 .../app/states/forgot_password/reset_password.html |   60 -
 .../main/webapp/app/states/home/home.controller.js |  104 -
 .../src/main/webapp/app/states/home/home.html      |   63 -
 .../src/main/webapp/app/states/home/home.module.js |   16 -
 .../webapp/app/states/login/login.controller.js    |  115 -
 .../src/main/webapp/app/states/login/login.html    |   74 -
 .../main/webapp/app/states/login/login.module.js   |   17 -
 .../app/states/not_found_404/not_found_404.html    |    6 -
 .../states/not_found_404/not_found_404.module.js   |   12 -
 .../app/states/oauth_error/oauth_error.module.js   |   11 -
 .../app/states/server_error/server_error.html      |   12 -
 .../app/states/server_error/server_error.module.js |   10 -
 .../states/user_profile/user_profile.controller.js |  162 -
 .../app/states/user_profile/user_profile.html      |  330 --
 .../app/states/user_profile/user_profile.module.js |   16 -
 .../src/main/webapp/app/styleguide.html            |  924 ----
 .../artifactory_grid/artifactory_grid.js           |  756 ----
 .../artifactory_grid/artifactory_grid.module.js    |   14 -
 .../artifactory_grid/artifactory_grid_constants.js |    9 -
 .../artifactory_grid/show_all_modal.html           |   31 -
 .../artifactory_grid/templates/default.html        |   38 -
 .../artifactory_grid/templates/drag_rows.html      |   42 -
 .../templates/headerCellDefaultTemplate.html       |   16 -
 .../templates/headerCellTemplate.html              |   26 -
 .../artifactory_modal/artifactory_modal.js         |  106 -
 .../artifactory_modal/artifactory_modal.module.js  |    6 -
 .../artifactory_modal/push_to_bintray_modal.js     |  262 --
 .../templates/add_license_modal.html               |   31 -
 .../templates/add_rule_modal.html                  |  186 -
 .../templates/base_url_alert_modal.html            |   23 -
 .../templates/bintray_oauth_modal.html             |   30 -
 .../templates/browse_files_modal.html              |   78 -
 .../artifactory_modal/templates/code_modal.html    |   23 -
 .../artifactory_modal/templates/confirm_modal.html |   18 -
 .../artifactory_modal/templates/deploy_modal.html  |   58 -
 .../templates/distribute_modal.html                |   60 -
 .../templates/download_folder_modal.html           |   27 -
 .../artifactory_modal/templates/group_modal.html   |   49 -
 .../templates/new_docker_modal.html                |   53 -
 .../templates/property_form_modal.html             |   87 -
 .../templates/property_modal.html                  |   42 -
 .../templates/push_to_bintray.html                 |  133 -
 .../templates/replication_modal.html               |  137 -
 .../templates/repository_type_modal.html           |   29 -
 .../templates/reverse_proxy_modal.html             |  109 -
 .../templates/select_delete_versions.html          |   18 -
 .../templates/select_target_path.html              |   53 -
 .../templates/set_me_up_modal.html                 |  477 --
 .../templates/smart_remote_repository.html         |   58 -
 .../artifactory_modal/templates/user_modal.html    |   74 -
 .../artifactory_modal/templates/warning_modal.html |   10 -
 .../artifactory_uploader/artifactory_uploader.js   |  185 -
 .../artifactory_uploader.module.js                 |    7 -
 .../app/ui_components/ui_components.module.js      |    8 -
 web/angular-web/src/main/webapp/app/vendor.js      |   86 -
 .../src/main/webapp/artifactory.config.js          |   30 -
 web/angular-web/src/main/webapp/bower.json         |   63 -
 .../src/main/webapp/browser_stack.config.js        |   34 -
 web/angular-web/src/main/webapp/karma.conf.js      |   62 -
 .../mocks/artifactory_storage_mock.browserify.js   |   18 -
 .../main/webapp/mocks/footer_mock.browserify.js    |   32 -
 .../main/webapp/mocks/grid_api_mock.browserify.js  |   43 -
 .../src/main/webapp/mocks/ha_mock.browserify.js    |   36 -
 .../webapp/mocks/property_sets_mocks.browserify.js |   25 -
 .../webapp/mocks/state_params_mock.browserify.js   |   10 -
 .../main/webapp/mocks/tree_node_mock.browserify.js |   89 -
 .../src/main/webapp/mocks/user_mock.browserify.js  |   48 -
 web/angular-web/src/main/webapp/package.json       |   69 -
 .../webapp/specs/dao/Config_descriptor_dao.spec.js |   26 -
 .../specs/dao/admin_security_general_dao.spec.js   |   53 -
 .../dao/artifact/artifact_actions_dao.spec.js      |   35 -
 .../specs/dao/artifact/artifact_builds_dao.spec.js |   30 -
 .../dao/artifact/artifact_general_dao.spec.js      |   30 -
 .../dao/artifact/artifact_permissions_dao.spec.js  |   27 -
 .../dao/artifact/artifact_property_dao.spec.js     |   39 -
 .../specs/dao/artifact/artifact_views_dao.spec.js  |   29 -
 .../dao/artifact/artifact_viewsource_dao.spec.js   |   23 -
 .../dao/artifact/artifact_watches_dao.spec.js      |   32 -
 .../artifact/tree_browser_dao.spec.browserify.js   |  130 -
 .../dao/artifact/tree_node.spec.browserify.js      |  147 -
 .../main/webapp/specs/dao/artifactory_dao.spec.js  |  110 -
 .../src/main/webapp/specs/dao/backup_dao.spec.js   |   46 -
 .../src/main/webapp/specs/dao/bintray_dao.spec.js  |   46 -
 .../main/webapp/specs/dao/black_duck_dao.spec.js   |   44 -
 .../src/main/webapp/specs/dao/builds_dao.spec.js   |   40 -
 .../main/webapp/specs/dao/checksums_dao.spec.js    |   31 -
 .../main/webapp/specs/dao/cron_time_dao.spec.js    |   30 -
 .../webapp/specs/dao/crowd_integration_dao.spec.js |   48 -
 .../src/main/webapp/specs/dao/export_dao.spec.js   |   39 -
 .../webapp/specs/dao/filtered_resource_dao.spec.js |   31 -
 .../webapp/specs/dao/footer_dao.spec.browserify.js |   38 -
 .../webapp/specs/dao/general_config_dao.spec.js    |   23 -
 .../main/webapp/specs/dao/governance_dao.spec.js   |   44 -
 .../src/main/webapp/specs/dao/group_dao.spec.js    |   49 -
 .../webapp/specs/dao/ha_dao.spec.browserify.js     |   33 -
 .../src/main/webapp/specs/dao/http_sso_dao.spec.js |   39 -
 .../src/main/webapp/specs/dao/import_dao.spec.js   |   36 -
 .../src/main/webapp/specs/dao/indexer_dao.spec.js  |   43 -
 .../src/main/webapp/specs/dao/ldap_dao.spec.js     |   70 -
 .../main/webapp/specs/dao/ldap_groups_dao.spec.js  |   75 -
 .../src/main/webapp/specs/dao/licenses_dao.spec.js |   44 -
 .../src/main/webapp/specs/dao/mail_dao.spec.js     |   27 -
 .../main/webapp/specs/dao/maintenance_dao.spec.js  |   77 -
 .../src/main/webapp/specs/dao/oauth_dao_spec.js    |   65 -
 .../specs/dao/passwords_encryption_dao.spec.js     |   41 -
 .../main/webapp/specs/dao/permissions_dao.spec.js  |   29 -
 .../specs/dao/property_sets.spec.browserify.js     |  194 -
 .../src/main/webapp/specs/dao/proxies_dao.spec.js  |   59 -
 .../webapp/specs/dao/push_to_bintray_dao.spec.js   |   57 -
 .../main/webapp/specs/dao/register_pro_dao.spec.js |   40 -
 .../src/main/webapp/specs/dao/saml_dao.spec.js     |   36 -
 .../specs/dao/security_descriptor_dao.spec.js      |   26 -
 .../main/webapp/specs/dao/ssh_client_dao.spec.js   |   38 -
 .../webapp/specs/dao/storage_summary_dao.spec.js   |   27 -
 .../src/main/webapp/specs/dao/user_dao.spec.js     |   51 -
 .../main/webapp/specs/dao/user_profile_dao.spec.js |   42 -
 .../jf_disable_feature.spec.browserify.js          |  110 -
 .../specs/directives/jf_field.spec.browserify.js   |   45 -
 .../specs/directives/jf_grid.spec.browserify.js    |   94 -
 .../directives/jf_hide_for_aol.spec.browserify.js  |   49 -
 .../jf_simple_browser.spec.browserify.js           |  327 --
 .../specs/directives/jf_switch.spec.browserify.js  |   51 -
 .../directives/jf_tree_browser.spec.browserify.js  |   84 -
 .../directives/jf_ui_select.spec.browserify.js     |   49 -
 .../page_objects/jf_grid_element.browserify.js     |   32 -
 .../page_objects/jf_switch_element.browserify.js   |   13 -
 .../jf_ui_select_element.browserify.js             |   35 -
 .../page_objects/js_tree_object.browserify.js      |   27 -
 .../artifactory notifications.spec.browserify.js   |  101 -
 .../specs/services/artifactory_eventBus.spec.js    |   85 -
 .../artifactory_features.spec.browserify.js        |  111 -
 .../artifactory_http_client.spec.browserify.js     |   47 -
 .../services/artifactory_modal.spec.browserify.js  |   33 -
 ...ifactory_session_interceptor.spec.browserify.js |  154 -
 .../services/artifactory_state.spec.browserify.js  |   38 -
 .../specs/services/artifactory_storage.spec.js     |   39 -
 .../services/native_browser.spec.browserify.js     |   39 -
 .../specs/services/parse_url.spec.browserify.js    |   18 -
 .../webapp/specs/services/user.spec.browserify.js  |  219 -
 .../src/main/webapp/specs/spec_helper.js           |   23 -
 .../artifactory_grid.spec.browserify.js            |  238 -
 .../src/main/webapp/vendor/draggable-rows.js       |  203 -
 .../src/main/webapp/vendor/jquery.highlight.js     |  108 -
 web/angular-web/src/main/webapp/webpack.config.js  |   51 -
 web/application/pom.xml                            |  137 -
 .../org/artifactory/addon/web/WebAddonsImpl.java   |  277 --
 .../org/artifactory/webapp/WebappServiceImpl.java  |   47 -
 .../artifactory/webapp/servlet/AccessFilter.java   |  479 --
 .../servlet/ArtifactoryContextConfigListener.java  |  311 --
 .../webapp/servlet/ArtifactoryEdition.java         |   58 -
 .../webapp/servlet/ArtifactoryFilter.java          |  174 -
 .../servlet/ArtifactoryHomeConfigListener.java     |   80 -
 .../webapp/servlet/DelayedFilterBase.java          |   50 -
 .../webapp/servlet/HttpArtifactoryRequest.java     |  172 -
 .../org/artifactory/webapp/servlet/RepoFilter.java |  397 --
 .../artifactory/webapp/servlet/RequestFilter.java  |  227 -
 .../artifactory/webapp/servlet/RequestUtils.java   |  349 --
 .../ArtifactoryAuthenticationFilter.java           |   65 -
 .../ArtifactoryAuthenticationFilterChain.java      |  218 -
 .../ArtifactoryBasicAuthenticationEntryPoint.java  |  165 -
 .../ArtifactoryBasicAuthenticationFilter.java      |  138 -
 .../ArtifactoryRememberMeFilter.java               |  110 -
 .../MissionControlAuthenticationFilter.java        |  140 -
 .../authentication/PropsAuthenticationFilter.java  |  177 -
 .../authentication/PropsAuthenticationHelper.java  |  101 -
 .../AnonymousAuthenticationInterceptor.java        |   17 -
 .../AnonymousAuthenticationInterceptors.java       |   31 -
 .../anonymous/AnonymousLoginInterceptor.java       |   16 -
 .../anonymous/AnonymousPingInterceptor.java        |   39 -
 .../servlet/logback/LogbackConfigListener.java     |  155 -
 .../redirection/OldBuildsRedirectionHandler.java   |   45 -
 .../redirection/OldHomeRedirectionHandler.java     |   42 -
 .../redirection/OldLoginRedirectionHandler.java    |   42 -
 .../servlet/redirection/RedirectionHandler.java    |   14 -
 .../redirection/SamlRedirectionHandler.java        |   41 -
 .../src/main/resources/artifactory-splash.gif      |  Bin 1390002 -> 0 bytes
 .../src/main/resources/ascii-editions.txt          |   54 -
 .../src/main/resources/build.gradle.creds.template |    3 -
 .../resources/build.gradle.ivy.publisher.template  |    5 -
 .../main/resources/build.gradle.ivy.repo.template  |    4 -
 .../resources/build.gradle.ivy.resolver.template   |    5 -
 .../resources/build.gradle.maven.repo.template     |    4 -
 .../resources/build.gradle.publish.creds.template  |    1 -
 .../resources/build.gradle.resolve.creds.template  |    1 -
 .../src/main/resources/build.gradle.template       |   32 -
 .../src/main/resources/gradle.properties.template  |    3 -
 web/application/src/main/resources/startup.html    |   50 -
 .../webapp/servlet/AccessFilterTest.java           |   69 -
 web/pom.xml                                        |   51 -
 web/rest-common/pom.xml                            |   53 -
 .../rest/common/dataholder/PasswordContainer.java  |   89 -
 .../rest/common/exception/BadRequestException.java |   33 -
 .../exception/BadRequestExceptionMapper.java       |   45 -
 .../rest/common/exception/ForbiddenException.java  |   55 -
 .../common/exception/UnauthorizedException.java    |   54 -
 .../rest/common/handler/RestLogoutHandler.java     |   24 -
 .../artifactory/rest/common/model/BaseModel.java   |   24 -
 .../artifactory/rest/common/model/FeedbackMsg.java |   85 -
 .../artifactory/rest/common/model/FileData.java    |    7 -
 .../artifactory/rest/common/model/FileModel.java   |    9 -
 .../artifactory/rest/common/model/RestModel.java   |    9 -
 .../artifactory/rest/common/model/RestPaging.java  |    7 -
 .../rest/common/model/RestSpecialFields.java       |   15 -
 .../rest/common/model/artifact/BaseArtifact.java   |   63 -
 .../rest/common/model/artifact/IAction.java        |    7 -
 .../rest/common/model/proxies/ProxiesModel.java    |   35 -
 .../rest/common/model/reverseproxy/CommonFile.java |   25 -
 .../reverseproxy/ReverseProxyDescriptorModel.java  |  208 -
 .../reverseproxy/ReverseProxyRepoConfigs.java      |   47 -
 .../reverseproxy/ReverseProxyRepositories.java     |   34 -
 .../model/storagesummary/StorageSummaryModel.java  |   63 -
 .../rest/common/model/trash/RestoreArtifact.java   |   54 -
 .../common/model/userprofile/UserProfileModel.java |   41 -
 .../rest/common/resource/BaseResource.java         |  119 -
 .../common/service/AbstractResearchService.java    |   53 -
 .../common/service/ArtifactoryRestRequest.java     |  175 -
 .../common/service/ArtifactoryRestResponse.java    |  247 --
 .../rest/common/service/IgnoreSpecialFields.java   |   24 -
 .../rest/common/service/PagingData.java            |   55 -
 .../rest/common/service/ResearchService.java       |  566 ---
 .../rest/common/service/RestResponse.java          |   95 -
 .../rest/common/service/RestService.java           |   16 -
 .../rest/common/service/ServiceExecutor.java       |   23 -
 .../rest/common/service/StreamResponse.java        |   13 -
 .../rest/common/service/StreamRestResponse.java    |   74 -
 .../admin/advance/GetStorageSummaryService.java    |   31 -
 .../CheckReverseProxyPortAvailabilityService.java  |   47 -
 .../reverseProxies/CreateReverseProxyService.java  |  156 -
 .../reverseProxies/DockerProxyTemplateInfo.java    |   21 -
 .../reverseProxies/GetReverseProxiesService.java   |  152 -
 .../reverseProxies/ReverseProxySnippetService.java |  168 -
 .../reverseProxies/UpdateReverseProxyService.java  |   69 -
 .../admin/userprofile/CreateApiKeyService.java     |   61 -
 .../admin/userprofile/GetApiKeyService.java        |   50 -
 .../admin/userprofile/GetUsersAndApiKeys.java      |   51 -
 .../admin/userprofile/RevokeApiKeyService.java     |   92 -
 .../admin/userprofile/SyncUsersAndApiKeys.java     |   48 -
 .../admin/userprofile/UpdateApiKeyService.java     |   56 -
 .../artifact/AddSha256ToArtifactService.java       |   72 -
 .../common/service/trash/EmptyTrashService.java    |   51 -
 .../service/trash/RestoreArtifactService.java      |   63 -
 .../org/artifactory/rest/common/util/AolUtils.java |   32 -
 .../rest/common/util/BintrayRestHelper.java        |  141 -
 .../rest/common/util/BuildResourceHelper.java      |  126 -
 .../org/artifactory/rest/common/util/JsonUtil.java |   87 -
 .../rest/common/util/PermissionHelper.java         |   75 -
 .../rest/common/util/ResponseHandler.java          |   75 -
 .../artifactory/rest/common/util/RestUtils.java    |  204 -
 web/rest-ui/pom.xml                                |  101 -
 .../ui/exception/BadRequestException.java          |   33 -
 .../ui/rest/common/ConfigModelPopulator.java       |   77 -
 .../ui/rest/common/SecurityModelPopulator.java     |  159 -
 .../ui/rest/common/ServiceModelPopulator.java      |   28 -
 .../configdescriptor/ConfigDescriptorModel.java    |   32 -
 .../admin/advanced/maintenance/Maintenance.java    |  130 -
 .../SecurityDescriptorModel.java                   |   33 -
 .../admin/advanced/systeminfo/SystemInfo.java      |   22 -
 .../admin/advanced/systemlogs/SystemLogData.java   |   47 -
 .../admin/advanced/systemlogs/SystemLogFile.java   |   26 -
 .../advanced/systemlogs/SystemLogsInitialize.java  |   25 -
 .../configuration/bintray/BintrayUIModel.java      |   47 -
 .../admin/configuration/blackduck/BlackDuck.java   |   28 -
 .../configuration/docker/repo/DockerRepo.java      |   34 -
 .../configuration/generalconfig/GeneralConfig.java |  283 --
 .../generalconfig/LogoFileUpload.java              |   12 -
 .../generalconfig/LookAndFeelSettings.java         |   29 -
 .../admin/configuration/ha/ConfigureHaModel.java   |   27 -
 .../rest/model/admin/configuration/ha/HaModel.java |  127 -
 .../configuration/layouts/LayoutActionsModel.java  |   42 -
 .../layouts/LayoutConfigViewModel.java             |   31 -
 .../configuration/layouts/LayoutGridModel.java     |   42 -
 .../configuration/layouts/RegExResolverModel.java  |   32 -
 .../layouts/RepositoryAssociationsModel.java       |   38 -
 .../layouts/RepositoryLayoutModel.java             |   31 -
 .../licenses/DeleteLicensesModel.java              |   21 -
 .../configuration/licenses/ExportLicense.java      |   25 -
 .../admin/configuration/licenses/License.java      |   32 -
 .../model/admin/configuration/mail/MailServer.java |   43 -
 .../propertysets/AdminPropertiesModel.java         |   34 -
 .../propertysets/AdminPropertySetModel.java        |  100 -
 .../propertysets/DeletePropertySetModel.java       |   20 -
 .../propertysets/PropertySetNameModel.java         |   43 -
 .../model/admin/configuration/proxy/Proxy.java     |   34 -
 .../configuration/registerpro/ProLicense.java      |   58 -
 .../repository/AdvancedRepositoryConfigModel.java  |   31 -
 .../repository/BasicRepositoryConfigModel.java     |   29 -
 .../repository/GeneralRepositoryConfigModel.java   |   26 -
 .../repository/RepoConfigDefaultValues.java        |  111 -
 .../repository/RepositoryConfigModel.java          |   80 -
 .../repository/RepositoryNetworkConfigModel.java   |   74 -
 .../DistributionAdvancedRepositoryConfigModel.java |   69 -
 .../DistributionBasicRepositoryConfigModel.java    |   77 -
 .../DistributionRepositoryConfigModel.java         |  122 -
 .../rule/DistributionCoordinatesModel.java         |   72 -
 .../distribution/rule/DistributionRuleModel.java   |  103 -
 .../rule/DistributionRuleTokenModel.java           |   45 -
 .../repository/info/AvailableRepositories.java     |   43 -
 .../info/DistributionRepositoryInfo.java           |   25 -
 .../repository/info/LocalRepositoryInfo.java       |   34 -
 .../repository/info/RemoteRepositoryInfo.java      |   63 -
 .../info/RepositoryDefaultValuesModel.java         |   60 -
 .../info/RepositoryFieldsValuesModel.java          |  156 -
 .../repository/info/RepositoryInfo.java            |   45 -
 .../repository/info/RepositoryInfoListFactory.java |   51 -
 .../repository/info/VirtualRepositoryInfo.java     |   46 -
 .../local/LocalAdvancedRepositoryConfigModel.java  |   68 -
 .../local/LocalBasicRepositoryConfigModel.java     |   74 -
 .../local/LocalRepositoryConfigModel.java          |  127 -
 .../RemoteAdvancedRepositoryConfigModel.java       |  119 -
 .../remote/RemoteBasicRepositoryConfigModel.java   |   58 -
 .../remote/RemoteCacheRepositoryConfigModel.java   |   55 -
 .../remote/RemoteNetworkRepositoryConfigModel.java |   47 -
 .../remote/RemoteRepositoryConfigModel.java        |  132 -
 .../RepositoryReplicationConfigModel.java          |   35 -
 .../local/LocalReplicationConfigModel.java         |   75 -
 .../remote/RemoteReplicationConfigModel.java       |   74 -
 .../typespecific/BowerTypeSpecificConfigModel.java |   71 -
 .../CocoaPodsTypeSpecificConfigModel.java          |   80 -
 .../typespecific/DebTypeSpecificConfigModel.java   |   51 -
 .../DistRepoTypeSpecificConfigModel.java           |  147 -
 .../DockerTypeSpecificConfigModel.java             |   71 -
 .../typespecific/GemsTypeSpecificConfigModel.java  |   39 -
 .../GenericTypeSpecificConfigModel.java            |   39 -
 .../GitLfsTypeSpecificConfigModel.java             |   39 -
 .../GradleTypeSpecificConfigModel.java             |   35 -
 .../typespecific/IvyTypeSpecificConfigModel.java   |   35 -
 .../typespecific/MavenTypeSpecificConfigModel.java |  155 -
 .../typespecific/NpmTypeSpecificConfigModel.java   |   70 -
 .../typespecific/NugetTypeSpecificConfigModel.java |   78 -
 .../typespecific/OpkgTypeSpecificConfigModel.java  |   39 -
 .../typespecific/P2TypeSpecificConfigModel.java    |   54 -
 .../typespecific/PypiTypeSpecificConfigModel.java  |   39 -
 .../typespecific/SbtTypeSpecificConfigModel.java   |   35 -
 .../typespecific/TypeSpecificConfigModel.java      |   45 -
 .../VagrantTypeSpecificConfigModel.java            |   26 -
 .../typespecific/VcsTypeSpecificConfigModel.java   |   80 -
 .../typespecific/YumTypeSpecificConfigModel.java   |   66 -
 .../VirtualAdvancedRepositoryConfigModel.java      |   79 -
 .../virtual/VirtualBasicRepositoryConfigModel.java |   48 -
 .../virtual/VirtualRepositoryConfigModel.java      |  119 -
 .../virtual/VirtualSelectedRepository.java         |   44 -
 .../reverseProxy/ReverseProxyRepoModel.java        |   39 -
 .../admin/configuration/ssh/SshClientUIModel.java  |   28 -
 .../admin/importexport/ImportExportSettings.java   |   98 -
 .../admin/security/crowdsso/CrowdGroupModel.java   |   31 -
 .../admin/security/crowdsso/CrowdGroupsModel.java  |   18 -
 .../admin/security/crowdsso/CrowdIntegration.java  |   32 -
 .../model/admin/security/general/MasterKey.java    |   19 -
 .../admin/security/general/SecurityConfig.java     |   68 -
 .../rest/model/admin/security/group/BaseGroup.java |   28 -
 .../admin/security/group/DeleteGroupsModel.java    |   21 -
 .../ui/rest/model/admin/security/group/Group.java  |   88 -
 .../rest/model/admin/security/group/UserGroup.java |   20 -
 .../rest/model/admin/security/httpsso/HttpSso.java |   28 -
 .../admin/security/ldap/GroupMappingStrategy.java  |   53 -
 .../model/admin/security/ldap/LdapGroupModel.java  |   65 -
 .../model/admin/security/ldap/LdapImportModel.java |   31 -
 .../admin/security/ldap/LdapSettingModel.java      |   67 -
 .../admin/security/ldap/LdapUserGroupModel.java    |   25 -
 .../rest/model/admin/security/login/UserLogin.java |   62 -
 .../admin/security/oauth/OAuthProviderInfo.java    |   56 -
 .../admin/security/oauth/OAuthProviderUIModel.java |  100 -
 .../model/admin/security/oauth/OAuthUIModel.java   |   65 -
 .../security/oauth/OAuthUIProvidersTypeEnum.java   |   83 -
 .../model/admin/security/oauth/OAuthUserToken.java |   24 -
 .../permissions/AllUsersAndGroupsModel.java        |   31 -
 .../permissions/DeletePermissionTargetModel.java   |   21 -
 .../permissions/PermissionTargetModel.java         |  244 --
 .../ui/rest/model/admin/security/saml/Saml.java    |   32 -
 .../model/admin/security/signingkey/KeyStore.java  |   95 -
 .../model/admin/security/signingkey/SignKey.java   |   53 -
 .../model/admin/security/sshserver/SshServer.java  |   43 -
 .../rest/model/admin/security/user/BaseUser.java   |  147 -
 .../admin/security/user/DeleteUsersModel.java      |   23 -
 .../ui/rest/model/admin/security/user/User.java    |   38 -
 .../model/admin/security/user/UserPermissions.java |   66 -
 .../model/admin/security/user/UserProfile.java     |   39 -
 .../rest/model/admin/services/backups/Backup.java  |  155 -
 .../services/filesystem/FileSystemBrowser.java     |   40 -
 .../admin/services/filesystem/FileSystemItem.java  |   34 -
 .../rest/model/admin/services/indexer/Indexer.java |  132 -
 .../browse/simplebrowser/SimpleBrowser.java        |    7 -
 .../browse/treebrowser/action/CopyArtifact.java    |   81 -
 .../browse/treebrowser/action/DeleteArtifact.java  |   45 -
 .../treebrowser/action/DeleteArtifactVersion.java  |  104 -
 .../treebrowser/action/DeleteArtifactVersions.java |   56 -
 .../treebrowser/action/DownloadArtifact.java       |   46 -
 .../browse/treebrowser/action/DownloadFolder.java  |   86 -
 .../browse/treebrowser/action/MoveArtifact.java    |   33 -
 .../browse/treebrowser/action/RefreshArtifact.java |   33 -
 .../treebrowser/action/ShowInBintrayArtifact.java  |   33 -
 .../treebrowser/action/ShowInTreeArtifact.java     |   32 -
 .../browse/treebrowser/action/ViewArtifact.java    |   46 -
 .../treebrowser/action/ViewSourceArtifact.java     |   34 -
 .../treebrowser/action/ViewTextFileArtifact.java   |   34 -
 .../browse/treebrowser/action/WatchArtifact.java   |   36 -
 .../browse/treebrowser/action/ZapArtifact.java     |   34 -
 .../recalculateindex/BaseIndexCalculator.java      |   38 -
 .../recalculateindex/BowerIndexCalculator.java     |   19 -
 .../recalculateindex/DebianIndexCalculator.java    |   25 -
 .../recalculateindex/GemsIndexCalculator.java      |   19 -
 .../recalculateindex/NpmIndexCalculator.java       |   19 -
 .../recalculateindex/NuGetIndexCalculator.java     |   19 -
 .../recalculateindex/OpkgIndexCalculator.java      |   19 -
 .../recalculateindex/PodsIndexCalculator.java      |   19 -
 .../recalculateindex/PypiIndexCalculator.java      |   25 -
 .../recalculateindex/YumIndexCalculator.java       |   25 -
 .../browse/treebrowser/nodes/BaseNode.java         |  454 --
 .../nodes/DistributionRepositoryNode.java          |  112 -
 .../browse/treebrowser/nodes/FileNode.java         |  412 --
 .../browse/treebrowser/nodes/FolderNode.java       |  318 --
 .../artifacts/browse/treebrowser/nodes/INode.java  |   48 -
 .../browse/treebrowser/nodes/JunctionNode.java     |  390 --
 .../browse/treebrowser/nodes/RepositoryNode.java   |  331 --
 .../browse/treebrowser/nodes/RestTreeNode.java     |   41 -
 .../browse/treebrowser/nodes/RootNode.java         |  228 -
 .../treebrowser/nodes/VirtualRemoteFileNode.java   |  165 -
 .../treebrowser/nodes/VirtualRemoteFolderNode.java |  181 -
 .../nodes/VirtualRemoteRepositoryNode.java         |  205 -
 .../browse/treebrowser/nodes/ZipFileNode.java      |   38 -
 .../nodes/archive/ArchiveEntriesTree.java          |   69 -
 .../treebrowser/nodes/archive/ArchiveTreeNode.java |  239 -
 .../browse/treebrowser/tabs/BaseArtifactInfo.java  |   48 -
 .../treebrowser/tabs/GeneralXmlArtifactInfo.java   |   11 -
 .../browse/treebrowser/tabs/IArtifactInfo.java     |    7 -
 .../treebrowser/tabs/IvyXmlArtifactInfo.java       |   11 -
 .../browse/treebrowser/tabs/JNLPArtifactInfo.java  |   11 -
 .../tabs/blackduck/BlackDuckArtifactInfo.java      |   68 -
 .../treebrowser/tabs/bower/BowerArtifactInfo.java  |   60 -
 .../treebrowser/tabs/builds/BuildJsonInfo.java     |   21 -
 .../tabs/builds/BuildsArtifactInfo.java            |   47 -
 .../browse/treebrowser/tabs/builds/ProduceBy.java  |   89 -
 .../browse/treebrowser/tabs/builds/UsedBy.java     |   88 -
 .../tabs/docker/DockerArtifactInfo.java            |   29 -
 .../treebrowser/tabs/docker/DockerConfig.java      |  217 -
 .../treebrowser/tabs/docker/DockerInfoModel.java   |  108 -
 .../treebrowser/tabs/docker/DockerMetadata.java    |   83 -
 .../ancestry/DockerAncestryArtifactInfo.java       |   17 -
 .../tabs/docker/ancestry/DockerLinkedImage.java    |   54 -
 .../treebrowser/tabs/gems/GemsArtifactInfo.java    |   40 -
 .../treebrowser/tabs/gems/GemsDependency.java      |   40 -
 .../browse/treebrowser/tabs/gems/GemsInfo.java     |   93 -
 .../tabs/general/ArchiveGeneralArtifactInfo.java   |   14 -
 .../tabs/general/FileGeneralArtifactInfo.java      |  219 -
 .../tabs/general/FolderGeneralArtifactInfo.java    |   69 -
 .../tabs/general/GeneralArtifactInfo.java          |  143 -
 .../general/RepositoryGeneralArtifactInfo.java     |  104 -
 .../treebrowser/tabs/general/RestGeneralTab.java   |   26 -
 .../VirtualRemoteFileGeneralArtifactInfo.java      |   62 -
 .../VirtualRemoteFolderGeneralArtifactInfo.java    |   69 -
 .../VirtualRemoteRepoGeneralArtifactInfo.java      |  148 -
 .../tabs/general/bintray/BintrayInfoModel.java     |   73 -
 .../tabs/general/checksums/Checksums.java          |  218 -
 .../DependencyDeclaration.java                     |  241 -
 .../distributionmngt/DistributionManagement.java   |  131 -
 .../includedRepositories/IncludedRepositories.java |   36 -
 .../general/includedRepositories/Repository.java   |   56 -
 .../treebrowser/tabs/general/info/ArchiveInfo.java |  114 -
 .../treebrowser/tabs/general/info/BaseInfo.java    |  180 -
 .../treebrowser/tabs/general/info/FileInfo.java    |  401 --
 .../treebrowser/tabs/general/info/FolderInfo.java  |  168 -
 .../tabs/general/info/RepositoryInfo.java          |  238 -
 .../general/licenses/GeneralTabLicenseModel.java   |  116 -
 .../relatedrepositories/RelatedRepositories.java   |   42 -
 .../tabs/general/trash/TrashItemDetails.java       |   73 -
 .../virtualrepositories/VirtualRepositories.java   |   35 -
 .../virtualrepositories/VirtualRepository.java     |   35 -
 .../treebrowser/tabs/npm/NpmArtifactInfo.java      |   32 -
 .../tabs/nugetinfo/NugetArtifactInfo.java          |   73 -
 .../tabs/nugetinfo/NugetDescription.java           |   23 -
 .../tabs/nugetinfo/NugetGeneralInfo.java           |  163 -
 .../tabs/permission/EffectivePermission.java       |  105 -
 .../EffectivePermissionsArtifactInfo.java          |   51 -
 .../treebrowser/tabs/permission/PagingModel.java   |   43 -
 .../tabs/properties/ArtifactProperty.java          |   34 -
 .../tabs/properties/DeletePropertyModel.java       |   17 -
 .../tabs/properties/PropertiesArtifactInfo.java    |  111 -
 .../tabs/properties/PropertyWithPath.java          |   45 -
 .../treebrowser/tabs/properties/RepoProperty.java  |   18 -
 .../tabs/properties/RepoPropertySet.java           |   17 -
 .../treebrowser/tabs/pypi/PypiArtifactInfo.java    |   84 -
 .../treebrowser/tabs/rpm/RpmArtifactInfo.java      |  118 -
 .../tabs/viewsource/ViewArtifactSource.java        |   53 -
 .../treebrowser/tabs/watchers/DeleteWatcher.java   |   36 -
 .../tabs/watchers/DeleteWatchersModel.java         |   21 -
 .../tabs/watchers/WatchersArtifactInfo.java        |   82 -
 .../model/artifacts/deploy/UploadArtifactInfo.java |   82 -
 .../artifacts/deploy/UploadedArtifactInfo.java     |   48 -
 .../distribute/DistributeArtifactStatusModel.java  |   11 -
 .../ui/rest/model/artifacts/search/BaseSearch.java |   22 -
 .../model/artifacts/search/BaseSearchResult.java   |  129 -
 .../artifacts/search/DeleteArtifactsModel.java     |   21 -
 .../rest/model/artifacts/search/SearchResult.java  |   60 -
 .../rest/model/artifacts/search/StashResult.java   |   68 -
 .../search/checksumsearch/ChecksumSearch.java      |   19 -
 .../artifacts/search/classsearch/ClassSearch.java  |   46 -
 .../search/classsearch/ClassSearchResult.java      |   77 -
 .../artifacts/search/gavcsearch/GavcResult.java    |  100 -
 .../artifacts/search/gavcsearch/GavcSearch.java    |   46 -
 .../criteria/FieldSearchCriteria.java              |   51 -
 .../criteria/PackageSearchCriteria.java            |  454 --
 .../packagesearch/result/AqlUISearchResult.java    |   30 -
 .../packagesearch/result/PackageSearchResult.java  |  196 -
 .../search/AqlUIDockerSearchModel.java             |   38 -
 .../packagesearch/search/AqlUISearchModel.java     |   83 -
 .../search/AqlUISearchPackageTypeModel.java        |   35 -
 .../search/propertysearch/PropertyKeyValues.java   |   63 -
 .../search/propertysearch/PropertyResult.java      |  103 -
 .../search/propertysearch/PropertySearch.java      |   36 -
 .../artifacts/search/quicksearch/QuickSearch.java  |   43 -
 .../search/quicksearch/QuickSearchResult.java      |   74 -
 .../search/remotesearch/RemoteResult.java          |  118 -
 .../search/remotesearch/RemoteSearch.java          |   19 -
 .../artifacts/search/trashsearch/TrashSearch.java  |   29 -
 .../search/trashsearch/TrashSearchResult.java      |   98 -
 .../ui/rest/model/builds/BintrayModel.java         |   50 -
 .../ui/rest/model/builds/BuildCoordinate.java      |   38 -
 .../ui/rest/model/builds/BuildDiffModel.java       |   39 -
 .../ui/rest/model/builds/BuildGovernanceInfo.java  |   66 -
 .../ui/rest/model/builds/BuildLicenseModel.java    |   51 -
 .../ui/rest/model/builds/BuildModule.java          |   45 -
 .../ui/rest/model/builds/BuildPropsModel.java      |  108 -
 .../ui/rest/model/builds/DeleteBuildsModel.java    |   25 -
 .../model/builds/DistributeBuildStatusModel.java   |   11 -
 .../ui/rest/model/builds/GeneralBuildInfo.java     |  240 -
 .../ui/rest/model/builds/IssueModel.java           |   96 -
 .../ui/rest/model/builds/LicenseBuildSummary.java  |   64 -
 .../ui/rest/model/builds/ModuleArtifactModel.java  |  210 -
 .../rest/model/builds/ModuleDependencyModel.java   |  233 -
 .../ui/rest/model/builds/PromotionStatusModel.java |  104 -
 .../ui/rest/model/common/RepoKeyPath.java          |   34 -
 .../ui/rest/model/empty/EmptyModel.java            |   18 -
 .../artifactory/ui/rest/model/general/Footer.java  |  195 -
 .../artifactory/ui/rest/model/home/AddonModel.java |  133 -
 .../artifactory/ui/rest/model/home/HomeModel.java  |   87 -
 .../model/replication/GlobalReplicationConfig.java |   28 -
 .../ui/rest/model/setmeup/GradleSettingModel.java  |  211 -
 .../ui/rest/model/setmeup/IvySettingModel.java     |  124 -
 .../ui/rest/model/setmeup/MavenSettingModel.java   |  157 -
 .../setmeup/ReverseProxySetMeUpDataModel.java      |   59 -
 .../ui/rest/model/setmeup/ScriptDownload.java      |   24 -
 .../ui/rest/model/setmeup/SetMeUpModel.java        |   52 -
 .../ui/rest/model/utils/FileUpload.java            |   51 -
 .../ui/rest/model/utils/cron/CronTime.java         |   23 -
 .../model/utils/licenses/ArtifactLicenses.java     |   28 -
 .../utils/predefinevalues/PreDefineValues.java     |   30 -
 .../rest/model/utils/repositories/RepoKeyType.java |  135 -
 .../model/utils/repositories/RepositoriesData.java |   37 -
 .../configdescriptor/ConfigDescriptorResource.java |   42 -
 .../advanced/maintenance/MaintenanceResource.java  |   83 -
 .../replication/GlobalReplicationsUIResource.java  |   39 -
 .../SecurityDescriptorResource.java                |   42 -
 .../admin/advanced/storage/StorageResource.java    |   36 -
 .../storagesummary/StorageSummaryResource.java     |   36 -
 .../advanced/support/UserSupportResource.java      |   86 -
 .../advanced/systeminfo/SystemInfoResource.java    |   36 -
 .../advanced/systemlogs/SystemLogsResource.java    |   58 -
 .../configuration/bintray/BintrayUIResource.java   |   52 -
 .../configuration/blackduck/BlackDuckResource.java |   51 -
 .../GeneralConfigurationResource.java              |   85 -
 .../configuration/ha/HighAvailabilityResource.java |   47 -
 .../configuration/layouts/RepoLayoutsResource.java |   77 -
 .../licenses/ArtifactLicenseResource.java          |   68 -
 .../licenses/LicenseExportResource.java            |   44 -
 .../admin/configuration/mail/MailResource.java     |   51 -
 .../propertysets/PropertySetsResource.java         |   68 -
 .../admin/configuration/proxies/ProxyResource.java |   64 -
 .../registerpro/ProLicenseResource.java            |   44 -
 .../repositories/RepoConfigResource.java           |  196 -
 .../repositories/RepoResourceConstants.java        |   10 -
 .../reverseProxy/ReverseProxyResource.java         |   59 -
 .../admin/importexport/ExportArtifactResource.java |   47 -
 .../admin/importexport/ImportArtifactResource.java |   72 -
 .../admin/security/apikey/UserApiKeyResource.java  |   56 -
 .../resource/admin/security/auth/AuthResource.java |  114 -
 .../admin/security/crowdsso/CrowdSsoResource.java  |   67 -
 .../general/CryptoSecurityDescriptorResource.java  |   43 -
 .../general/GeneralSecurityConfigResource.java     |   94 -
 .../admin/security/group/GroupResource.java        |   60 -
 .../admin/security/httpsso/HttpSsoResource.java    |   45 -
 .../admin/security/ldap/LdapGroupResource.java     |   81 -
 .../admin/security/ldap/LdapSettingResource.java   |   85 -
 .../admin/security/oauth/OAuthUIResource.java      |   99 -
 .../security/permissions/PermissionsResource.java  |   74 -
 .../security/saml/SamLoginLogoutResource.java      |   49 -
 .../resource/admin/security/saml/SamlResource.java |   47 -
 .../signingkeys/DebianSigningKeyResource.java      |   78 -
 .../security/signingkeys/KeyStoreResource.java     |   88 -
 .../security/sshserver/SshServerResource.java      |   65 -
 .../admin/security/user/UserProfileResource.java   |   45 -
 .../resource/admin/security/user/UserResource.java |  114 -
 .../admin/services/backups/BackupResource.java     |   67 -
 .../filesystem/FileSystemBrowserResource.java      |   36 -
 .../services/indexer/MavenIndexerResource.java     |   57 -
 .../browse/generic/NativeBrowserResource.java      |   35 -
 .../actions/ArtifactActionsResource.java           |  161 -
 .../deleteversions/DeleteVersionsResource.java     |   46 -
 .../tabs/ArtifactBlackDuckResource.java            |   44 -
 .../treebrowser/tabs/ArtifactBuildsResource.java   |   52 -
 .../tabs/ArtifactsPropertiesResource.java          |   55 -
 .../treebrowser/tabs/DeletePropertiesResource.java |   40 -
 .../tabs/EffectivePermissionResource.java          |   36 -
 .../treebrowser/tabs/ViewSourceResource.java       |   39 -
 .../tabs/checksums/ChecksumsResource.java          |   39 -
 .../generalinfo/DependencyDeclarationResource.java |   36 -
 .../tabs/generalinfo/FilteredResourceResource.java |   38 -
 .../tabs/generalinfo/GeneralArtifactResource.java  |   53 -
 .../licenses/GeneralInfoTabLicensesResource.java   |   63 -
 .../treebrowser/tabs/views/ViewsResource.java      |  144 -
 .../treebrowser/tabs/watches/WatchersResource.java |   52 -
 .../treebrowser/tree/TreeBrowserResource.java      |   39 -
 .../artifacts/deploy/DeployArtifactResource.java   |   79 -
 .../artifacts/search/ArtifactSearchResource.java   |  150 -
 .../artifacts/search/PropertySearchResource.java   |   45 -
 .../artifacts/search/SearchResultsResource.java    |   39 -
 .../search/StashSearchResultsResource.java         |  114 -
 .../artifacts/setmeup/SetMeUpResource.java         |  151 -
 .../rest/resource/builds/BuildBintrayResource.java |   94 -
 .../ui/rest/resource/builds/BuildsResource.java    |  258 --
 .../distribution/UIDistributionResource.java       |   65 -
 .../resource/general/GeneralScreenResource.java    |   53 -
 .../ui/rest/resource/home/HomeResource.java        |   38 -
 .../rest/resource/utils/cron/CronTimeResource.java |   34 -
 .../utils/group/GroupPermissionResource.java       |   37 -
 .../predefinevalues/PreDefineValuesResource.java   |   37 -
 .../utils/propertyset/RepoPropertySet.java         |   36 -
 .../repositories/RepositoriesDataResource.java     |   36 -
 .../utils/validation/UiValidationsResource.java    |   59 -
 .../admin/advanced/AdvancedServiceFactory.java     |   95 -
 .../GetConfigDescriptorService.java                |   42 -
 .../UpdateConfigDescriptorService.java             |   60 -
 .../maintenance/CleanUnusedCachedService.java      |   45 -
 .../maintenance/CleanupVirtualRepoService.java     |   46 -
 .../maintenance/CompressInternalDataService.java   |   53 -
 .../maintenance/GarbageCollectionService.java      |   44 -
 .../maintenance/GetMaintenanceService.java         |   32 -
 .../maintenance/PruneUnReferenceDataService.java   |   46 -
 .../maintenance/SaveMaintenanceService.java        |  104 -
 .../GetGlobalReplicationsConfigService.java        |   31 -
 .../UpdateGlobalReplicationsConfigService.java     |   34 -
 .../GetSecurityDescriptorService.java              |   46 -
 .../UpdateSecurityDescriptorService.java           |   55 -
 .../storage/GetBinaryProvidersInfoService.java     |   49 -
 .../support/BundleConfigurationWrapper.java        |   48 -
 .../support/SupportServiceDeleteBundle.java        |   40 -
 .../support/SupportServiceDownloadBundle.java      |   45 -
 .../support/SupportServiceGenerateBundle.java      |   71 -
 .../support/SupportServiceListBundles.java         |   47 -
 .../advanced/systeminfo/GetSystemInfoService.java  |  175 -
 .../advanced/systemlogs/GetSysLogDataService.java  |   99 -
 .../systemlogs/GetSysLogDownloadLinkService.java   |   68 -
 .../systemlogs/GetSysLogsInitializeService.java    |   23 -
 .../admin/configuration/ConfigServiceFactory.java  |  261 --
 .../configuration/bintray/GetBintrayUIService.java |   34 -
 .../bintray/TestBintrayUIService.java              |   80 -
 .../bintray/UpdateBintrayUIService.java            |   42 -
 .../blackduck/GetBlackDuckService.java             |   57 -
 .../blackduck/TestBlackDuckService.java            |   74 -
 .../blackduck/UpdateBlackDuckService.java          |   60 -
 .../general/DeleteUploadedLogoService.java         |   31 -
 .../general/GetGeneralConfigDataService.java       |   34 -
 .../general/GetGeneralConfigService.java           |   51 -
 .../general/GetUploadLogoService.java              |   51 -
 .../general/UpdateGeneralConfigService.java        |  128 -
 .../configuration/general/UploadLogoService.java   |  104 -
 .../ha/GetHighAvailabilityMembersService.java      |   50 -
 .../configuration/ha/RemoveServerService.java      |   56 -
 .../configuration/layouts/CreateLayoutService.java |   57 -
 .../configuration/layouts/DeleteLayoutService.java |   34 -
 .../layouts/GetLayoutInfoService.java              |  112 -
 .../configuration/layouts/GetLayoutsService.java   |   59 -
 .../configuration/layouts/ResolveRegexService.java |   43 -
 .../configuration/layouts/TestArtPathService.java  |   62 -
 .../configuration/layouts/UpdateLayoutService.java |   60 -
 .../LayoutFieldRequiredTokenValidator.java         |   45 -
 .../validation/ReservedLayoutNameValidator.java    |   20 -
 .../licenses/CreateArtifactLicenseService.java     |   33 -
 .../licenses/DeleteArtifactLicenseService.java     |   38 -
 .../licenses/ExportLicenseFileService.java         |   50 -
 .../licenses/GetArtifactLicenseService.java        |  107 -
 .../licenses/UpdateArtifactLicenseService.java     |   29 -
 .../admin/configuration/mail/GetMailService.java   |   51 -
 .../admin/configuration/mail/TestMailService.java  |  139 -
 .../configuration/mail/UpdateMailService.java      |   45 -
 .../propertysets/CreatePropertySetService.java     |   54 -
 .../propertysets/DeletePropertySetService.java     |   49 -
 .../GetConfigPropertySetNamesService.java          |   51 -
 .../propertysets/GetConfigPropertySetService.java  |   37 -
 .../propertysets/UpdatePropertySetService.java     |   54 -
 .../configuration/proxies/CreateProxyService.java  |   60 -
 .../configuration/proxies/DeleteProxyService.java  |   51 -
 .../configuration/proxies/GetProxiesService.java   |  109 -
 .../configuration/proxies/UpdateProxyService.java  |   68 -
 .../registerpro/GetLicenseKeyService.java          |   52 -
 .../registerpro/UpdateLicenseKeyService.java       |   88 -
 .../CreateRepositoryConfigService.java             |   63 -
 .../DeleteRepositoryConfigService.java             |   53 -
 .../repositories/GetRepositoryConfigService.java   |  110 -
 .../UpdateRepositoryConfigService.java             |   53 -
 .../SaveBintrayOauthConfigService.java             |  107 -
 .../ExecuteAllLocalReplicationsService.java        |  122 -
 .../ExecuteLocalReplicationService.java            |  137 -
 .../ExecuteRemoteReplicationService.java           |   88 -
 .../replication/ReplicationConfigService.java      |  134 -
 .../replication/TestLocalReplicationService.java   |  175 -
 .../replication/TestRemoteReplicationService.java  |  122 -
 .../ValidateLocalReplicationService.java           |   42 -
 .../util/CreateDefaultJcenterRepoService.java      |  111 -
 .../repositories/util/CreateRepoConfigHelper.java  |  187 -
 .../util/GetAvailableRepositories.java             |  108 -
 .../util/GetAvailableRepositoryFields.java         |   33 -
 .../util/GetDefaultRepositoryValues.java           |   43 -
 .../repositories/util/GetDockerRepoService.java    |   51 -
 .../util/GetIndexerAvailableRepositories.java      |   38 -
 .../util/GetRemoteRepoUrlMappingService.java       |   38 -
 .../util/GetRepositoryInfoService.java             |   36 -
 .../repositories/util/GetResolvedRepositories.java |   93 -
 .../util/IsJcenterConfiguredService.java           |   36 -
 .../util/RemoteRepositoryProvider.java             |   41 -
 .../repositories/util/RemoteRepositoryTestUrl.java |  134 -
 .../util/ReorderRepositoriesService.java           |  134 -
 .../SmartRepoCapabilitiesDiscoveringService.java   |   95 -
 .../repositories/util/TestMethodFactory.java       |  102 -
 .../repositories/util/UpdateRepoConfigHelper.java  |  145 -
 .../ReplicationConfigDescriptorBuilder.java        |   66 -
 .../util/builder/RepoConfigDescriptorBuilder.java  |  494 ---
 .../util/builder/RepoConfigModelBuilder.java       |  724 ---
 .../util/exception/RepoConfigException.java        |   25 -
 .../util/validator/ReplicationConfigValidator.java |  180 -
 .../util/validator/RepoConfigValidator.java        |  549 ---
 .../util/validator/ValidateRepoNameService.java    |   42 -
 .../importexport/ImportExportServiceFactory.java   |   35 -
 .../exportdata/ExportRepositoryService.java        |  130 -
 .../exportdata/ExportSystemService.java            |  128 -
 .../importdata/ImportRepositoryService.java        |  189 -
 .../importdata/ImportSystemService.java            |  184 -
 .../importdata/UploadExtractedZipService.java      |   49 -
 .../UploadSystemExtractedZipService.java           |   69 -
 .../BlockGlobalPullReplicationService.java         |    7 -
 .../BlockGlobalPushReplicationService.java         |    7 -
 .../admin/security/SecurityServiceFactory.java     |  260 --
 .../auth/annotate/GetCanAnnotateService.java       |   30 -
 .../auth/currentuser/GetCurrentUserService.java    |   78 -
 .../auth/forgotpassword/ForgotPasswordService.java |   86 -
 .../forgotpassword/LoginRelatedDataService.java    |   80 -
 .../auth/forgotpassword/ResetPasswordService.java  |   80 -
 .../forgotpassword/ValidateResetTokenService.java  |   62 -
 .../security/auth/login/AbstractLoginService.java  |  116 -
 .../CredentialsExpiredFailedLoginResponse.java     |   41 -
 .../auth/login/HttpLoginArtifactoryRequest.java    |  172 -
 .../admin/security/auth/login/LoginService.java    |  295 --
 .../admin/security/auth/logout/LogoutService.java  |   56 -
 .../crowdsso/GetCrowdIntegrationService.java       |   46 -
 .../crowdsso/ImportCrowdGroupsService.java         |   68 -
 .../crowdsso/RefreshCrowdGroupsService.java        |  108 -
 .../crowdsso/TestCrowdConnectionService.java       |   58 -
 .../security/crowdsso/UpdateCrowdIntegration.java  |   56 -
 .../security/general/EncryptDecryptService.java    |   49 -
 .../security/general/GetAllLockedUsersService.java |   31 -
 .../security/general/GetMasterKeyService.java      |   25 -
 .../security/general/GetSecurityConfigService.java |   52 -
 .../security/general/GetUserLockPolicyService.java |   26 -
 .../security/general/UnlockAllUsersService.java    |   30 -
 .../admin/security/general/UnlockUserService.java  |   31 -
 .../admin/security/general/UnlockUsersService.java |   41 -
 .../general/UpdateSecurityConfigService.java       |   49 -
 .../admin/security/group/BaseGroupService.java     |   31 -
 .../admin/security/group/CreateGroupService.java   |   58 -
 .../admin/security/group/DeleteGroupService.java   |   42 -
 .../admin/security/group/GetGroupService.java      |  136 -
 .../admin/security/group/UpdateGroupService.java   |   85 -
 .../admin/security/httpsso/GetHttpSsoService.java  |   75 -
 .../security/httpsso/UpdateHttpSsoService.java     |   61 -
 .../ldap/groups/CreateLdapGroupService.java        |   51 -
 .../ldap/groups/DeleteLdapGroupService.java        |   41 -
 .../security/ldap/groups/GetLdapGroupService.java  |   83 -
 .../ldap/groups/GroupMappingStrategyService.java   |   73 -
 .../ldap/groups/ImportLdapGroupService.java        |   60 -
 .../ldap/groups/RefreshLdapGroupService.java       |  155 -
 .../ldap/groups/UpdateLdapGroupService.java        |   51 -
 .../ldapsettings/CreateLdapSettingsService.java    |   43 -
 .../ldapsettings/DeleteLdapSettingsService.java    |   35 -
 .../ldap/ldapsettings/GetLdapSettingsService.java  |   67 -
 .../ldapsettings/ReorderLdapSettingsService.java   |   56 -
 .../ldap/ldapsettings/TestLdapSettingsService.java |   71 -
 .../ldapsettings/UpdateLdapSettingsService.java    |   56 -
 .../security/oauth/AddOAuthProviderSettings.java   |   77 -
 .../oauth/DeleteOAuthProviderSettings.java         |   61 -
 .../admin/security/oauth/DeleteOAuthUserToken.java |   35 -
 .../admin/security/oauth/GetOAuthSettings.java     |   98 -
 .../security/oauth/GetOAuthTokensForUser.java      |   49 -
 .../oauth/UpdateOAuthProviderSettings.java         |   81 -
 .../oauth/UpdateOrCreateOAuthSettings.java         |   86 -
 .../permissions/BasePermissionsTargetService.java  |   48 -
 .../CreatePermissionsTargetService.java            |  145 -
 .../DeletePermissionsTargetService.java            |   44 -
 .../permissions/GetAllUsersAndGroupsService.java   |   45 -
 .../permissions/GetPermissionsTargetService.java   |  238 -
 .../UpdatePermissionsTargetService.java            |  169 -
 .../security/saml/GetSamlLoginRequestService.java  |   34 -
 .../security/saml/GetSamlLoginResponseService.java |   41 -
 .../security/saml/GetSamlLogoutRequestService.java |   35 -
 .../admin/security/saml/GetSamlService.java        |   44 -
 .../admin/security/saml/IsSamlAuthentication.java  |   38 -
 .../admin/security/saml/UpdateSamlService.java     |   57 -
 .../debiankeys/GetDebianSigningKeyService.java     |   57 -
 .../debiankeys/InstallDebianKeyService.java        |  106 -
 .../debiankeys/RemoveDebianKeyService.java         |   28 -
 .../debiankeys/UpdateDebianKeyService.java         |   35 -
 .../debiankeys/VerifyDebianKeyService.java         |   65 -
 .../signingkeys/keystore/AddKeyStoreService.java   |  104 -
 .../signingkeys/keystore/CancelKeyPairService.java |   32 -
 .../keystore/ChangeKeyStorePasswordService.java    |   50 -
 .../signingkeys/keystore/GetKeyStoreService.java   |   51 -
 .../keystore/RemoveKeyStorePasswordService.java    |   31 -
 .../keystore/RemoveKeyStoreService.java            |   47 -
 .../signingkeys/keystore/SaveKeyStoreService.java  |   89 -
 .../security/sshserver/GetSshServerKeyService.java |   29 -
 .../security/sshserver/GetSshServerService.java    |   86 -
 .../sshserver/InstallSshServerKeyService.java      |   93 -
 .../sshserver/RemoveSshServerKeyService.java       |   42 -
 .../security/sshserver/UpdateSshServerService.java |   41 -
 .../admin/security/user/ChangePasswordService.java |   48 -
 .../security/user/CheckExternalStatusService.java  |   47 -
 .../admin/security/user/CreateUserService.java     |   79 -
 .../admin/security/user/DeleteUserService.java     |   91 -
 .../user/ExpirePasswordForAllUsersService.java     |   38 -
 .../security/user/ExpireUserPasswordService.java   |   39 -
 .../security/user/GetUserPermissionsService.java   |   64 -
 .../admin/security/user/GetUsersService.java       |  137 -
 .../user/RevalidatePasswordForAllUsersService.java |   38 -
 .../security/user/RevalidatePasswordService.java   |   39 -
 .../security/user/UpdateUserLockPolicyService.java |   45 -
 .../admin/security/user/UpdateUserService.java     |  135 -
 .../user/userprofile/UnlockUserProfileService.java |  198 -
 .../user/userprofile/UpdateUserProfileService.java |  120 -
 .../admin/services/ServicesServiceFactory.java     |   43 -
 .../services/backups/CreateBackupService.java      |   58 -
 .../services/backups/DeleteBackupService.java      |   44 -
 .../admin/services/backups/GetBackupService.java   |  109 -
 .../services/backups/RunNowBackupService.java      |   57 -
 .../services/backups/UpdateBackupService.java      |   45 -
 .../filesystem/BrowseFileSystemService.java        |  121 -
 .../admin/services/indexer/GetIndexerService.java  |   42 -
 .../admin/services/indexer/RunIndexNowService.java |   67 -
 .../services/indexer/UpdateIndexerService.java     |   45 -
 .../artifacts/browse/BrowseServiceFactory.java     |  218 -
 .../browse/generic/BrowseNativeService.java        |  361 --
 .../treebrowser/actions/CopyArtifactService.java   |  111 -
 .../treebrowser/actions/DeleteArtifactService.java |   61 -
 .../actions/DownloadArtifactService.java           |   45 -
 .../actions/DownloadFolderArchiveService.java      |   89 -
 .../actions/GetDownloadFolderInfoService.java      |   77 -
 .../treebrowser/actions/MoveArtifactService.java   |  107 -
 .../actions/RecalculateIndexService.java           |   48 -
 .../treebrowser/actions/ViewArtifactService.java   |   73 -
 .../treebrowser/actions/WatchArtifactService.java  |  123 -
 .../treebrowser/actions/ZapArtifactService.java    |   44 -
 .../actions/ZapCachesVirtualService.java           |   54 -
 .../actions/bintray/DistributeArtifactService.java |   73 -
 .../GetAvailableDistributionReposService.java      |   38 -
 .../deleteversions/DeleteVersionService.java       |   73 -
 .../deleteversions/GetVersionUnitsService.java     |  110 -
 .../blackduck/GetBlackDuckArtifactService.java     |  229 -
 .../UpdateBlackDuckComponentIdService.java         |   61 -
 .../treebrowser/tabs/bower/BowerViewService.java   |   59 -
 .../tabs/builds/GetArtifactBuildJsonService.java   |   51 -
 .../tabs/builds/GetArtifactBuildsService.java      |  258 --
 .../tabs/checksums/FixChecksumsService.java        |   51 -
 .../tabs/docker/DockerAncestryViewService.java     |  159 -
 .../tabs/docker/DockerV2ViewService.java           |   62 -
 .../treebrowser/tabs/docker/DockerViewService.java |  155 -
 .../treebrowser/tabs/gemsview/GemsViewService.java |   58 -
 .../tabs/general/GetArtifactsCount.java            |   41 -
 .../general/GetDependencyDeclarationService.java   |   49 -
 .../tabs/general/GetGeneralArtifactsService.java   |   38 -
 .../tabs/general/SetFilteredResourceService.java   |   53 -
 .../general/bintray/GetGeneralBintrayService.java  |   90 -
 .../licenses/GetAllAvailableLicensesService.java   |   34 -
 .../licenses/GetArchiveLicenseFileService.java     |  107 -
 .../general/licenses/QueryCodeCenterService.java   |   49 -
 .../licenses/ScanArtifactForLicensesService.java   |   53 -
 .../general/licenses/SetLicensesOnPathService.java |   89 -
 .../treebrowser/tabs/npmview/NpmViewService.java   |   63 -
 .../tabs/nugetview/NugetViewService.java           |   52 -
 .../permission/GetEffectivePermissionService.java  |  108 -
 .../treebrowser/tabs/pomview/PomViewService.java   |   27 -
 .../tabs/properties/CreatePropertyService.java     |   68 -
 .../tabs/properties/DeletePropertyService.java     |   69 -
 .../tabs/properties/GetPropertyService.java        |  181 -
 .../tabs/properties/UpdatePropertyService.java     |   41 -
 .../treebrowser/tabs/pypi/PypiViewService.java     |   56 -
 .../treebrowser/tabs/rpm/RpmViewService.java       |   56 -
 .../tabs/viewsource/ArchiveViewSourceService.java  |   85 -
 .../tabs/watchers/GetWatchersService.java          |   65 -
 .../tabs/watchers/RemoveWatchersService.java       |   51 -
 .../tabs/watchers/WatchStatusService.java          |  103 -
 .../treebrowser/tree/BrowseTreeNodesService.java   |   60 -
 .../deploy/ArtifactDeployBundleService.java        |   98 -
 .../artifacts/deploy/ArtifactDeployService.java    |  155 -
 .../deploy/ArtifactMultiDeployService.java         |  133 -
 .../artifacts/deploy/ArtifactUploadService.java    |   54 -
 .../artifacts/deploy/CancelArtifactUpload.java     |   41 -
 .../artifacts/deploy/DeployServiceFactory.java     |   29 -
 .../rest/service/artifacts/deploy/DeployUtil.java  |   26 -
 .../artifacts/search/DeleteArtifactsService.java   |   69 -
 .../artifacts/search/SearchServiceFactory.java     |   89 -
 .../checksumsearch/ChecksumSearchService.java      |  119 -
 .../search/classsearch/ClassSearchService.java     |  115 -
 .../search/gavcsearch/GavcSearchService.java       |  101 -
 .../GetPackageSearchOptionsService.java            |   70 -
 .../PackageSearchCriteriaToNativeAqlService.java   |   39 -
 .../search/packagesearch/PackageSearchService.java |  136 -
 .../AqlUISearchDockerV1ResultManipulator.java      |   33 -
 .../result/AqlUISearchDummyResultManipulator.java  |   16 -
 .../result/AqlUISearchNpmResultManipulator.java    |   31 -
 .../result/AqlUISearchResultManipulator.java       |   11 -
 .../strategy/AqlUIDockerV1ImageSearchStrategy.java |   69 -
 .../AqlUIDockerV2ImageDigestSearchStrategy.java    |   39 -
 .../strategy/AqlUIDockerV2ImageSearchStrategy.java |   41 -
 .../strategy/AqlUIFieldSearchStrategy.java         |   84 -
 .../strategy/AqlUINpmNameSearchStrategy.java       |   34 -
 .../strategy/AqlUINpmScopeSearchStrategy.java      |   36 -
 .../strategy/AqlUIPropertySearchStrategy.java      |   85 -
 .../strategy/AqlUISearchStrategy.java              |   45 -
 .../packagesearch/util/PackageSearchHelper.java    |  130 -
 .../propertysearch/GetPropertySetsService.java     |   57 -
 .../propertysearch/PropertySearchService.java      |  105 -
 .../search/quicksearch/QuickSearchService.java     |  107 -
 .../search/remotesearch/RemoteSearchService.java   |  118 -
 .../searchresults/AddSearchResultsService.java     |   76 -
 .../searchresults/BaseSearchResultService.java     |   70 -
 .../searchresults/CopySearchResultsService.java    |   45 -
 .../searchresults/DiscardFromResultsService.java   |   85 -
 .../searchresults/ExportSearchResultsService.java  |  121 -
 .../searchresults/GetSearchResultsService.java     |   62 -
 .../IntersectSearchResultsService.java             |   75 -
 .../searchresults/MoveSearchResultsService.java    |   46 -
 .../searchresults/RemoveSearchResultsService.java  |   33 -
 .../searchresults/SaveSearchResultsService.java    |   42 -
 .../SubtractSearchResultsService.java              |   75 -
 .../search/trashsearch/TrashSearchService.java     |  122 -
 .../rest/service/builds/BuildsServiceFactory.java  |  131 -
 .../builds/bintray/DistributeBuildService.java     |   70 -
 .../builds/bintray/GetBintrayArtifactService.java  |  120 -
 .../builds/bintray/GetBintrayPackagesService.java  |   66 -
 .../bintray/GetBintrayRepositoriesService.java     |   83 -
 .../builds/bintray/GetBintrayVersionsService.java  |   79 -
 .../bintray/PushArtifactToBintrayService.java      |   94 -
 .../builds/bintray/PushBuildToBintrayService.java  |  111 -
 .../bintray/PushDockerTagToBintrayService.java     |   73 -
 .../builds/buildsinfo/DeleteAllBuildsService.java  |   73 -
 .../builds/buildsinfo/DeleteBuildService.java      |   81 -
 .../builds/buildsinfo/GetAllBuildsService.java     |   73 -
 .../builds/buildsinfo/GetBuildHistoryService.java  |   85 -
 .../builds/buildsinfo/GetPrevBuildListService.java |   60 -
 .../buildsinfo/GetPreviouseBuildsService.java      |   27 -
 .../builds/buildsinfo/tabs/BuildIssuesService.java |  133 -
 .../tabs/BuildReleaseHistoryService.java           |  135 -
 .../tabs/GetBuildGeneralInfoService.java           |  136 -
 .../buildsinfo/tabs/GetBuildJsonService.java       |   45 -
 .../tabs/builddiff/BuildDiffService.java           |  182 -
 .../tabs/builddiff/DiffBuildArtifactService.java   |   76 -
 .../builddiff/DiffBuildDependenciesService.java    |   88 -
 .../builddiff/DiffBuildModuleArtifactService.java  |   59 -
 .../DiffBuildModuleDependencyService.java          |   56 -
 .../tabs/builddiff/DiffBuildPropsService.java      |   69 -
 .../tabs/env/GetEnvBuildPropsService.java          |   51 -
 .../tabs/env/GetSystemBuildPropsService.java       |   49 -
 .../tabs/governance/AbstractBuildService.java      |   84 -
 .../tabs/governance/GetBuildGovernanceService.java |  227 -
 .../governance/UpdateGovernanceRequestService.java |   65 -
 .../tabs/licenses/BuildLicensesService.java        |  202 -
 .../tabs/licenses/ChangeBuildLicenseService.java   |  237 -
 .../tabs/licenses/ExportLicenseToCsvService.java   |   48 -
 .../licenses/OverrideSelectedLicensesService.java  |  201 -
 .../GetModuleArtifactsService.java                 |   63 -
 .../GetModuleDependencyService.java                |   64 -
 .../GetPublishedModulesService.java                |   59 -
 .../service/general/GeneralServiceFactory.java     |   51 -
 .../ui/rest/service/general/GetFooterService.java  |  224 -
 .../ui/rest/service/home/GetHomePageService.java   |  302 --
 .../setmeup/GetGradleSettingSnippetService.java    |  317 --
 .../setmeup/GetIvySettingSnippetService.java       |  205 -
 .../setmeup/GetMavenDistributionMgntService.java   |   44 -
 .../setmeup/GetMavenSettingSnippetService.java     |  172 -
 .../setmeup/GetReverseProxySetMeUpDataService.java |   56 -
 .../ui/rest/service/setmeup/GetSetMeUpService.java |  176 -
 .../setmeup/GradleSettingGeneratorService.java     |   77 -
 .../setmeup/IvySettingGeneratorService.java        |   49 -
 .../setmeup/MavenSettingGeneratorService.java      |   54 -
 .../ui/rest/service/utils/UtilsServiceFactory.java |   29 -
 .../service/utils/cron/GetCronNextTimeService.java |   83 -
 .../distribution/DistributionUIResponseUtils.java  |   45 -
 .../utils/groups/GetGroupPermissionsService.java   |   68 -
 .../service/utils/licenses/AddArtifactLicense.java |   32 -
 .../utils/licenses/ScanArtifactLicense.java        |   15 -
 .../predefinevalues/GetPreDefineValuesService.java |   76 -
 .../repoPropertySet/GetRepoPropertySetService.java |   67 -
 .../repositories/GetAllRepositoriesService.java    |  336 --
 .../rest/service/utils/setMeUp/SettingsHelper.java |  155 -
 .../utils/validation/GetNameValidatorService.java  |   30 -
 .../validation/GetTimeFormatValidatorService.java  |   36 -
 .../validation/GetUniqueXmlIdValidatorService.java |   36 -
 .../validation/GetXsdNCNameValidatorService.java   |   31 -
 .../service/utils/validation/NameValidator.java    |   40 -
 .../utils/validation/UniqueXmlIdValidator.java     |   45 -
 .../validation/ValidationsServiceFactory.java      |   24 -
 .../java/org/artifactory/ui/utils/ActionUtils.java |   16 -
 .../java/org/artifactory/ui/utils/BrowseUtils.java |   24 -
 .../java/org/artifactory/ui/utils/DateUtils.java   |   61 -
 .../java/org/artifactory/ui/utils/ModelDbMap.java  |   34 -
 .../org/artifactory/ui/utils/MultiPartUtils.java   |  188 -
 .../java/org/artifactory/ui/utils/RegExUtils.java  |   16 -
 .../org/artifactory/ui/utils/RequestUtils.java     |   88 -
 .../java/org/artifactory/ui/utils/TreeUtils.java   |   33 -
 .../java/org/artifactory/ui/utils/UnitUtils.java   |  133 -
 .../java/org/artifactory/ui/rest/common/DUMMY.TXT  |    1 -
 .../artifacts/deploy/UploadArtifactInfoTest.java   |   33 -
 web/rest/pom.xml                                   |   80 -
 .../addon/rest/AuthorizationRestException.java     |   42 -
 .../addon/rest/MissingRestAddonException.java      |   47 -
 .../java/org/artifactory/addon/rest/RestAddon.java |  404 --
 .../addon/rest/RestAddonDefaultImpl.java           |  310 --
 .../rest/common/GlobalMessageProvider.java         |   98 -
 .../org/artifactory/rest/common/JaxbProvider.java  |   74 -
 .../org/artifactory/rest/common/JsonProvider.java  |  175 -
 .../rest/common/RestAuthenticationFilter.java      |  186 -
 .../rest/common/RestResponseFilter.java            |  102 -
 .../rest/common/XStreamAliasProvider.java          |  109 -
 .../exception/ArtifactoryRestExceptionMapper.java  |  123 -
 .../exception/ConfigurationExceptionMapper.java    |   48 -
 .../common/exception/GlobalExceptionMapper.java    |   54 -
 .../exception/HaNodePropagationException.java      |   43 -
 .../exception/InvalidNameExceptionMapper.java      |   46 -
 .../exception/ItemNotFoundExceptionMapper.java     |   46 -
 .../common/exception/JsonParseExceptionMapper.java |   45 -
 .../common/exception/LockedExceptionMapper.java    |   49 -
 .../rest/common/exception/NotFoundException.java   |   33 -
 .../common/exception/NotFoundExceptionMapper.java  |   45 -
 .../rest/common/exception/RestException.java       |   43 -
 .../rest/common/exception/RestExceptionMapper.java |   43 -
 .../artifactory/rest/common/list/KeyValueList.java |  111 -
 .../artifactory/rest/common/list/StringList.java   |   52 -
 .../org/artifactory/rest/filter/HaRestFilter.java  |   29 -
 .../artifactory/rest/filter/LicenseRestFilter.java |   44 -
 .../artifactory/rest/filter/OfflineRestFilter.java |   29 -
 .../org/artifactory/rest/http/ResponseHandler.java |   82 -
 .../rest/http/request/ArtifactoryRestRequest.java  |  155 -
 .../http/response/ArtifactoryRestApiResponse.java  |   99 -
 .../artifactory/rest/http/response/IResponse.java  |   52 -
 .../artifactory/rest/resource/BaseResource.java    |  127 -
 .../rest/resource/ChecksumResource.java            |   36 -
 .../artifactory/rest/resource/ServiceExecutor.java |   23 -
 .../artifactory/rest/resource/aql/AqlResource.java |  113 -
 .../resource/archive/ArchiveIndexResource.java     |   72 -
 .../rest/resource/archive/ArchiveResource.java     |  198 -
 .../rest/resource/artifact/ArtifactResource.java   |  634 ---
 .../artifact/ArtifactStatisticsResource.java       |  198 -
 .../rest/resource/artifact/CopyResource.java       |   77 -
 .../rest/resource/artifact/MoveResource.java       |   77 -
 .../resource/artifact/legacy/DownloadResource.java |   80 -
 .../rest/resource/bintray/BintrayResource.java     |  124 -
 .../rest/resource/ci/BuildResource.java            |  536 ---
 .../distribution/DistributionResource.java         |   93 -
 .../DistributionResourceConstants.java             |   12 -
 .../rest/resource/license/ComplianceResource.java  |   82 -
 .../rest/resource/license/LicenseResource.java     |  143 -
 .../rest/resource/maven/MavenResource.java         |   94 -
 .../mission/control/MissionControlResource.java    |   81 -
 .../control/model/MissionControlSetupRequest.java  |   40 -
 .../rest/resource/plugin/PluginsResource.java      |  226 -
 .../ReplicationConfigRequestHelper.java            |  105 -
 .../resource/replication/ReplicationResource.java  |  136 -
 .../resource/replication/ReplicationsResource.java |  127 -
 .../repositories/RepairRepositoryResource.java     |  112 -
 .../repositories/RepoConfigurationResource.java    |  107 -
 .../repositories/RepositoriesResource.java         |  271 --
 .../rest/resource/repositories/YumResource.java    |   70 -
 .../reverseproxies/ReverseProxiesResource.java     |   50 -
 .../ReverseProxiesSnippetResource.java             |   35 -
 .../rest/resource/search/SearchResource.java       |  185 -
 .../resource/search/fields/FieldNameHelper.java    |   27 -
 .../search/types/AnyDateInRangeResource.java       |  142 -
 .../search/types/ArchiveSearchResource.java        |  143 -
 .../types/ArtifactLatestVersionSearchResource.java |  127 -
 .../search/types/ArtifactSearchResource.java       |  147 -
 .../types/ArtifactVersionsSearchResource.java      |   89 -
 .../search/types/BadChecksumSearchResource.java    |   62 -
 .../search/types/BuildArtifactsSearchResource.java |  116 -
 .../search/types/ChecksumSearchResource.java       |  164 -
 .../search/types/CreatedInRangeResource.java       |  106 -
 .../search/types/DependencySearchResource.java     |   63 -
 .../resource/search/types/GavcSearchResource.java  |  151 -
 .../search/types/GenericSearchResource.java        |  113 -
 .../search/types/PatternSearchResource.java        |  119 -
 .../search/types/PropertySearchResource.java       |  128 -
 .../resource/search/types/UsageSinceResource.java  |  117 -
 .../security/SecurityConfigurationResource.java    |   93 -
 .../rest/resource/security/SecurityResource.java   |  245 --
 .../resource/security/SecurityUserResource.java    |  157 -
 .../artifactory/rest/resource/ssh/SshResource.java |  105 -
 .../storagesummary/StorageSummaryInfoResource.java |   36 -
 .../resource/support/SupportRequestContent.java    |   41 -
 .../rest/resource/support/SupportResource.java     |  171 -
 .../system/ArtifactoryLicenseResource.java         |  125 -
 .../rest/resource/system/ConfigResource.java       |  162 -
 .../rest/resource/system/ExportResource.java       |  132 -
 .../system/ExportSettingsConfigurationImpl.java    |  128 -
 .../resource/system/GlobalReplicationResource.java |  127 -
 .../system/ImportExportStreamStatusHolder.java     |  112 -
 .../rest/resource/system/ImportResource.java       |  167 -
 .../system/ImportSettingsConfigurationImpl.java    |   33 -
 .../rest/resource/system/LicenseConfiguration.java |   26 -
 .../rest/resource/system/LicenseDetails.java       |   39 -
 .../rest/resource/system/PingResource.java         |   90 -
 .../rest/resource/system/SecurityResource.java     |   99 -
 .../rest/resource/system/StorageResource.java      |  177 -
 .../rest/resource/system/SystemInfo.java           |  165 -
 .../rest/resource/system/SystemResource.java       |  191 -
 .../rest/resource/system/VersionResource.java      |   80 -
 .../rest/resource/task/BackgroundTask.java         |   84 -
 .../rest/resource/task/BackgroundTasks.java        |   33 -
 .../rest/resource/task/TasksResource.java          |  108 -
 .../rest/resource/traffic/TrafficResource.java     |  116 -
 .../rest/resource/trash/TrashcanResource.java      |   90 -
 .../rest/resource/userprofile/ApiKeyResource.java  |   55 -
 .../resource/userprofile/UsersApiKeyResource.java  |   44 -
 .../rest/resource/versions/VersionsResources.java  |  108 -
 .../rest/response/JerseyArtifactoryResponse.java   |  172 -
 .../rest/services/ConfigServiceFactory.java        |   76 -
 .../org/artifactory/rest/services/IService.java    |   19 -
 .../rest/services/RepoServiceFactory.java          |   17 -
 .../services/config/RestServiceConfiguration.java  |   27 -
 .../replication/BaseReplicationService.java        |   82 -
 .../CreateMultipleReplicationService.java          |  117 -
 .../replication/CreateReplicationService.java      |   83 -
 .../replication/DeleteReplicationsService.java     |  116 -
 .../EnableDisableReplicationsService.java          |   54 -
 .../replication/GetReplicationService.java         |  119 -
 .../UpdateMultipleReplicationsService.java         |   71 -
 .../replication/UpdateReplicationService.java      |   81 -
 .../rest/servlet/ArtifactoryRestServlet.java       |  106 -
 .../java/org/artifactory/rest/util/AuthUtils.java  |   77 -
 .../artifactory/rest/util/StorageInfoHelper.java   |  201 -
 .../rest/common/list/KeyValueListTest.java         |   32 -
 .../rest/resource/task/BackgroundTaskTest.java     |   27 -
 web/war/pom.xml                                    |   44 -
 web/war/src/main/resources/DUMMY.TXT               |    1 -
 web/war/src/main/webapp/META-INF/context.xml       |   25 -
 web/war/src/main/webapp/WEB-INF/web.xml            |  166 -
 webapps/artifactory.war                            |  Bin 0 -> 42072464 bytes
 4574 files changed, 16732 insertions(+), 437955 deletions(-)

diff --git a/COPYING.AFFERO b/COPYING.AFFERO
new file mode 100644
index 0000000..1b59dfe
--- /dev/null
+++ b/COPYING.AFFERO
@@ -0,0 +1,112 @@
+                                    GNU AFFERO GENERAL PUBLIC LICENSE
+                                        Version 3, 19 November 2007
+                        Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/>
+
+Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
+Preamble
+The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software.
+The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users.
+When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.
+Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software.
+A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate. Many developers of free software are heartened and encouraged by the resulting cooperation. However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a s [...]
+The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community. It requires the operator of a network server to provide the source code of the modified version running there to the users of that server. Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version.
+An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals. This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license.
+The precise terms and conditions for copying, distribution and modification follow.
+
+TERMS AND CONDITIONS
+0. Definitions.
+"This License" refers to version 3 of the GNU Affero General Public License.
+"Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.
+"The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations.
+To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work.
+A "covered work" means either the unmodified Program or a work based on the Program.
+To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.
+To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.
+An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominen [...]
+1. Source Code.
+The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work.
+A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.
+The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window syst [...]
+The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes int [...]
+The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.
+The Corresponding Source for a work in source code form is that same work.
+2. Basic Permissions.
+All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.
+You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you mus [...]
+Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
+3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.
+When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.
+4. Conveying Verbatim Copies.
+You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.
+You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.
+5. Conveying Modified Source Versions.
+You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:
+    a) The work must carry prominent notices stating that you modified it, and giving a relevant date.
+    b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices".
+    c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
+    d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.
+A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregat [...]
+6. Conveying Non-Source Forms.
+You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:
+    a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
+    b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interc [...]
+    c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
+    d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying fac [...]
+    e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.
+A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.
+A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the [...]
+"Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.
+If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neithe [...]
+The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.
+Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.
+7. Additional Terms.
+"Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License [...]
+When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.
+Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:
+    a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
+    b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
+    c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
+    d) Limiting the use for publicity purposes of names of licensors or authors of the material; or
+    e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
+    f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.
+All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license  [...]
+If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.
+Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.
+8. Termination.
+You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).
+However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.
+Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.
+Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.
+9. Acceptance Not Required for Having Copies.
+You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you in [...]
+10. Automatic Licensing of Downstream Recipients.
+Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.
+An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source o [...]
+You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.
+11. Patents.
+A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version".
+A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a  [...]
+Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.
+In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.
+If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent w [...]
+If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.
+A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and un [...]
+Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.
+12. No Surrender of Others' Freedom.
+If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to [...]
+13. Remote Network Interaction; Use with the GNU General Public License.
+Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source sh [...]
+Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the work with which it is combined will remain governed by version 3 of the GNU General Public License.
+14. Revised Versions of this License.
+The Free Software Foundation may publish revised and/or new versions of the GNU Affero General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
+Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU Affero General Public License, you may choose any version ever published by the Free [...]
+If the Program specifies that a proxy can decide which future versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.
+Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.
+15. Disclaimer of Warranty.
+THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE C [...]
+16. Limitation of Liability.
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WIT [...]
+17. Interpretation of Sections 15 and 16.
+If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.
+*   *   *
\ No newline at end of file
diff --git a/distribution/standalone/src/main/install/README.txt b/README.txt
similarity index 100%
rename from distribution/standalone/src/main/install/README.txt
rename to README.txt
diff --git a/Third-Parties-Usage-About-Box.html b/Third-Parties-Usage-About-Box.html
new file mode 100644
index 0000000..171a23f
--- /dev/null
+++ b/Third-Parties-Usage-About-Box.html
@@ -0,0 +1,1043 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    <base target="_top">
+    <title>3rd party licenses</title></head>
+<body>
+<div>
+    <div align="center"><b>Artifactory - Third Parties - Usage - About Box</b></div>
+    <p/>
+    <b>This software includes the following UNMODIFIED third party software:</b>
+
+    <p/>
+    <table border="1">
+        <tr>
+            <td width="33%"><b>Third party software</b></td>
+            <td width="33%"><b>Third party URL</b></td>
+            <td width="33%"><b>Licensed under</b></td>
+        </tr>
+        <tr>
+            <td>Apache Tomcat 8<br/> Apache Tomcat is an open source software implementation of the Java Servlet and
+                JavaServer
+                Pages technologies
+            </td>
+            <td><p><a href="https://tomcat.apache.org/index.html">https://tomcat.apache.org/index.html</a></p></td>
+            <td>Apache License, Version 2.0 <p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>PrettyTime<br/> Elapsed Timestamp Formatting and Conversion for Java</td>
+            <td><p><a href="http://ocpsoft.com/prettytime">http://ocpsoft.com/prettytime</a></p></td>
+            <td>Apache License, Version 2.0 <p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>AOP alliance</td>
+            <td><p><a href="http://aopalliance.sourceforge.net">http://aopalliance.sourceforge.net</a></p></td>
+            <td>Public Domain</td>
+        </tr>
+        <tr>
+            <td>Apache Santuario</td>
+            <td><p><a href="http://santuario.apache.org/index.html">http://santuario.apache.org/index.html</a></p></td>
+            <td>Apache License, Version 2.0 <p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+        </tr>
+        <tr>
+            <td>JSR-250 - Common Annotations for the JavaTM Platform</td>
+            <td><p><a href="http://jcp.org/aboutJava/communityprocess/pfd/jsr250/index.html">http://jcp.org/aboutJava/communityprocess/pfd/jsr250/index.html</a>
+            </p></td>
+            <td><p>CDDL Version 1.0 1.
+
+                <p><a href="https://glassfish.dev.java.net/public/CDDLv1.0.html">https://glassfish.dev.java.net/public/CDDLv1.0.html</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>Streaming API for XML</td>
+            <td><p><a href=https://sjsxp.java.net/>https://sjsxp.java.net/ </a></p></td>
+            <td>CDDL v1.0 <p><a href=https://glassfish.java.net/public/CDDL+GPL.html>https://glassfish.java.net/public/CDDL.html</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>Ssh Server</td>
+            <td><p><a href=http://mina.apache.org/sshd-project/>http://mina.apache.org/sshd-project/</a></p></td>
+            <td>Apache License, Version 2.0<p><a
+                    href=http://www.apache.org/licenses/>http://www.apache.org/licenses/</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>JSR-311 - Java API for RESTful Web Services</td>
+            <td><p><a href=https://jsr311.dev.java.net/>https://jsr311.dev.java.net/</a></p></td>
+            <td>CDDL Version 1.0 1. <p><a href=https://glassfish.dev.java.net/public/CDDLv1.0.html>https://glassfish.dev.java.net/public/CDDLv1.0.html</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>Logback Logging framework</td>
+            <td><p><a href=http://logback.qos.ch/>http://logback.qos.ch/</a></p></td>
+            <td>Dual-licensed under EPL v1.0 and the LGPL 2.1 <p><a href=http://logback.qos.ch/license.html>http://logback.qos.ch/license.html</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>Stax2 API</td>
+            <td><p><a href=https://github.com/FasterXML/stax2-api>https://github.com/FasterXML/stax2-api</a></p></td>
+            <td>BSD License <p><a href=http://www.opensource.org/licenses/bsd-license.php>http://www.opensource.org/licenses/bsd-license.php</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>Stax Utils</td>
+            <td><p><a href=https://stax-utils.dev.java.net/>https://stax-utils.dev.java.net/</a></p></td>
+            <td>BSD License <p><a href=http://www.opensource.org/licenses/bsd-license.php>http://www.opensource.org/licenses/bsd-license.php</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>XStream Core</td>
+            <td><p><a href=https://github.com/codehaus/xstream>https://github.com/codehaus/xstream</a></p></td>
+            <td>BSD License <p><a href=http://www.opensource.org/licenses/bsd-license.php>http://www.opensource.org/licenses/bsd-license.php</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>Ivy</td>
+            <td><p><a href=http://ant.apache.org/ivy/>http://ant.apache.org/ivy/</a></p></td>
+            <td>Apache License, Version 2.0<p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p>
+            </td>
+        </tr>
+        <tr>
+            <td>Jersey</td>
+            <td><p><a href=https://jersey.dev.java.net/>https://jersey.dev.java.net/</a></p></td>
+            <td>CDDL Version 1.1 <p><a href="http://glassfish.java.net/public/CDDL+GPL_1_1.html">http://glassfish.java.net/public/CDDL.html</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>Plexus</td>
+            <td><p><a href=https://github.com/codehaus/plexus>https://github.com/codehaus/plexus</a></p></td>
+            <td>Apache License, Version 2.0 <p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>Joda time</td>
+            <td><p><a href=http://joda-time.sourceforge.net/>http://joda-time.sourceforge.net/</a></p></td>
+            <td>Apache License, Version 2.0 <p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>Commons BeanUtils</td>
+            <td><p><a href=http://commons.apache.org/beanutils/>http://commons.apache.org/beanutils/</a></p></td>
+            <td>Apache License, Version 2.0 <p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>Commons Codec</td>
+            <td><p><a href=http://commons.apache.org/codec/>http://commons.apache.org/codec/</a></p></td>
+            <td>Apache License, Version 2.0 <p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>Commons Collections</td>
+            <td><p><a href=http://commons.apache.org/collections/>http://commons.apache.org/collections/</a></p></td>
+            <td>Apache License, Version 2.0 <p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>Commons HttpClient</td>
+            <td><p><a href=http://hc.apache.org/index.html>http://hc.apache.org/index.html</a>
+            </p></td>
+            <td>Apache License, Version 2.0
+
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>Commons IO</td>
+            <td><p><a href=http://commons.apache.org/io/>http://commons.apache.org/io/</a></p></td>
+            <td>Apache License, Version 2.0
+
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>Commons Lang</td>
+            <td><p><a href=http://commons.apache.org/lang/>http://commons.apache.org/lang/</a></p>
+            </td>
+            <td>Apache License, Version 2.0
+
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p></td>
+        </tr>
+        <td>Commons DButils</td>
+        <td><p><a href=http://commons.apache.org/dbutils/>http://commons.apache.org/dbutils/</a></p>
+        </td>
+        <td>Apache License, Version 2.0
+
+            <p>
+                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>Google Guava Library</td>
+            <td><p><a href=http://code.google.com/p/guava-libraries/>http://code.google.com/p/guava-libraries/</a>
+            </p></td>
+            <td>Apache License, Version 2.0
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>Jackson</td>
+            <td><p><a href=https://github.com/codehaus/jackson>https://github.com/codehaus/jackson</a></p></td>
+            <td>Apache License, Version 2.0
+
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>Maven</td>
+            <td><p><a href=http://maven.apache.org/>http://maven.apache.org/</a></p></td>
+            <td>Apache License, Version 2.0
+
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>Wagon Provider API</td>
+            <td><p><a href=http://maven.apache.org/wagon/wagon-provider-api/index.html>http://maven.apache.org/wagon/wagon-provider-api/index.html</a>
+            </p></td>
+            <td>Apache License, Version 2.0
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>Plexus</td>
+            <td><p><a href=https://github.com/codehaus/plexus>https://github.com/codehaus/plexus</a></p></td>
+            <td>Apache License, Version 2.0
+
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>Spring</td>
+            <td><p><a href="0">http://www.springsource.org/</a></p></td>
+            <td>Apache License, Version 2.0
+
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>Spring Security</td>
+            <td><p><a
+                    href=http://static.springsource.org/spring-security/>http://static.springsource.org/spring-security/</a>
+            </p></td>
+            <td>Apache License, Version 2.0
+
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>Spring Session</td>
+            <td><p><a
+                    href=http://static.springsource.org/spring-session/>http://static.springsource.org/spring-session/</a>
+            </p></td>
+            <td>Apache License, Version 2.0
+
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>Spring LDAP</td>
+            <td><p><a href=http://www.springsource.org/ldap>http://www.springsource.org/ldap</a></p></td>
+            <td>Apache License, Version 2.0
+
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>Apache derby</td>
+            <td><p><a href=http://db.apache.org/derby/>http://db.apache.org/derby/</a></p></td>
+            <td>Apache License, Version 2.0
+
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>Quartz</td>
+            <td><p><a href=http://www.quartz-scheduler.org/>http://www.quartz-scheduler.org/</a></p>
+            </td>
+            <td>Apache License, Version 2.0
+
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>Xml Pull Parser 3rd Edition (XPP3)</td>
+            <td><p><a
+                    href=http://www.extreme.indiana.edu/xgws/xsoap/xpp/>http://www.extreme.indiana.edu/xgws/xsoap/xpp/</a>
+            </p></td>
+            <td>LICENSE FOR THE Extreme! Lab PullParser
+
+                <p><a href=http://www.extreme.indiana.edu/xgws/xsoap/xpp/download/PullParser2/LICENSE.txt>http://www.extreme.indiana.edu/xgws/xsoap/xpp/download/PullParser2/LICENSE.txt</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>slf4j</td>
+            <td><p><a href=http://www.slf4j.org/>http://www.slf4j.org/</a></p></td>
+            <td>MIT License
+
+                <p>
+                    <a href=http://opensource.org/licenses/MIT>http://opensource.org/licenses/MIT</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>Woodstox
+
+                high-performance validating namespace-aware StAX-compliant (JSR-173) Open Source XML-processor written
+                in Java
+            </td>
+            <td><p><a href=https://github.com/codehaus/woodstox>https://github.com/codehaus/woodstox</a></p></td>
+            <td>Apache License, Version 2.0
+
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p></td>
+        </tr>
+
+        <tr>
+            <td>JDom</td>
+            <td><p><a href=http://www.jdom.org/>http://www.jdom.org/</a></p></td>
+            <td>JDOM is available under an Apache-style open source license
+
+                <p>
+                    <a href=http://www.jdom.org/docs/faq.html#a0030>http://www.jdom.org/docs/faq.html#a0030</a>
+                </p>
+
+                Copyright (C) 2000-2012 Jason Hunter & Brett McLaughlin.<br> <a
+                        href="https://github.com/hunterhacker/jdom/blob/JDOM-2.0.5/LICENSE.txt">https://github.com/hunterhacker/jdom/blob/JDOM-2.0.5/LICENSE.txt</a>
+            </td>
+        </tr>
+        <tr>
+            <td>Classworlds</td>
+            <td><p><a href=https://github.com/codehaus/classworlds/tree/master/classworlds>https://github.com/codehaus/classworlds/tree/master/classworlds</a>
+            </p>
+            </td>
+            <td>Copyright 2002 (C) The Codehaus.
+
+                <p>
+                    <a href=https://github.com/codehaus/classworlds/blob/master/classworlds/LICENSE.txt>https://github.com/codehaus/classworlds/blob/master/classworlds/LICENSE.txt</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>JavaMail</td>
+            <td><p><a href=https://glassfish.dev.java.net/javaee5/mail/>https://glassfish.dev.java.net/javaee5/mail/</a>
+            </p></td>
+            <td>CDDL Version 1.0 1.
+                <p><a href=https://glassfish.dev.java.net/public/CDDLv1.0.html>https://glassfish.dev.java.net/public/CDDLv1.0.html</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>Lucene Core</td>
+            <td><p><a href=http://lucene.apache.org/>http://lucene.apache.org/</a>
+            </p></td>
+            <td>Apache License, Version 2.0
+
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>Dojo Toolkit</td>
+            <td><p><a href="http://www.dojotoolkit.org">http://www.dojotoolkit.org</a>
+            </p></td>
+            <td>Modified BSD
+                <p>
+                    <a href="http://o.dojotoolkit.org/license">http://o.dojotoolkit.org/license</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>Syntax Highlighter</td>
+            <td><p><a
+                    href="http://alexgorbatchev.com/SyntaxHighlighter/">http://alexgorbatchev.com/SyntaxHighlighter/</a>
+            </p></td>
+            <td>MIT
+                <p>
+                    <a href="http://alexgorbatchev.com/SyntaxHighlighter/about.html">http://alexgorbatchev.com/SyntaxHighlighter/about.html</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>Versions Maven Plugin</td>
+            <td><p><a href="http://www.mojohaus.org/">http://www.mojohaus.org/</a>
+            </p></td>
+            <td>Apache License, Version 2.0<p><a
+                    href="https://github.com/mojohaus/versions-maven-plugin/blob/master/LICENSE.txt">https://github.com/mojohaus/versions-maven-plugin/blob/master/LICENSE.txt</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>Atlassian Crowd REST Client</td>
+            <td><p><a href="https://bitbucket.org/atlassian/crowd-rest-client/overview">https://bitbucket.org/atlassian/crowd-rest-client/overview</a>
+            </p></td>
+            <td>Apache License, Version 2.0<p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>atinject - JSR-330: Dependency Injection for Java</td>
+            <td><p><a href="http://code.google.com/p/atinject/">http://code.google.com/p/atinject/</a>
+            </p></td>
+            <td>Apache License, Version 2.0<p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>Groovy - An agile dynamic language for the Java Platform</td>
+            <td><p><a href="http://www.groovy-lang.org/">http://www.groovy-lang.org/</a>
+            </p></td>
+            <td>Apache License, Version 2.0<p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>Maven Indexer</td>
+            <td><p><a href="http://maven.apache.org/maven-indexer">http://maven.apache.org/maven-indexer</a>
+            </p></td>
+            <td>Apache License, Version 2.0
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>Aether API</td>
+            <td><p><a href="http://www.sonatype.org/aether/">http://maven.apache.org/maven-indexer</a>
+            </p></td>
+            <td>Eclipse Public License version 1.0
+                <p>
+                    <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>Aether Util</td>
+            <td><p><a href="http://www.sonatype.org/aether/">http://maven.apache.org/maven-indexer</a>
+            </p></td>
+            <td>Eclipse Public License version 1.0
+                <p>
+                    <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>JSR 330 - atinject</td>
+            <td><p><a href="https://code.google.com/p/atinject/">https://code.google.com/p/atinject/</a>
+            </p></td>
+            <td>Apache License, Version 2.0
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>Redline</td>
+            <td><p><a href="http://code.google.com/p/redline-rpm">http://code.google.com/p/redline-rpm</a>
+            </p></td>
+            <td>MIT License
+                <p>
+                    <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>Mimepull</td>
+            <td><p><a href="http://java.net/projects/mimepull">http://java.net/projects/mimepull</a>
+            </p></td>
+            <td>CDDL Version 1.1
+                <p>
+                    <a href="http://glassfish.java.net/public/CDDL+GPL_1_1.html">http://glassfish.java.net/public/CDDL.html</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>Bouncy Castle</td>
+            <td><p><a href="http://www.bouncycastle.org">http://www.bouncycastle.org</a>
+            </p></td>
+            <td>Bouncy Castle (adaptation of the MIT X11 License)
+                <p>
+                    <a href="http://www.bouncycastle.org/licence.html">http://www.bouncycastle.org/licence.html</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>Commons Compress</td>
+            <td><p><a href=http://commons.apache.org/compress/>http://commons.apache.org/compress/</a></p></td>
+            <td>Apache License, Version 2.0
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p></td>
+        </tr>
+
+        <tr>
+            <td>Opensaml</td>
+            <td><p><a href="https://shibboleth.net/products/opensaml-java.html">https://shibboleth.net/products/opensaml-java.html</a>
+            </p></td>
+            <td>Apache License, Version 2.0
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p></td>
+        </tr>
+
+        <tr>
+            <td>Xmltooling</td>
+            <td><p><a href="https://shibboleth.net/products/opensaml-java.html">https://shibboleth.net/products/opensaml-java.html</a>
+            </p></td>
+            <td>Apache License, Version 2.0
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p></td>
+        </tr>
+
+        <tr>
+            <td>Openws</td>
+            <td><p><a href="https://shibboleth.net/products/opensaml-java.html">https://shibboleth.net/products/opensaml-java.html</a>
+            </p></td>
+            <td>Apache License, Version 2.0
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td>Not Yet Commons SSL</td>
+            <td><p><a href="http://juliusdavies.ca/commons-ssl">http://juliusdavies.ca/commons-ssl/</a></p></td>
+            <td>Apache License, Version 2.0
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p></td>
+        </tr>
+
+        <tr>
+            <td>Apache Velocity</td>
+            <td><p><a href=http://velocity.apache.org>http://velocity.apache.org/</a></p></td>
+            <td>Apache License, Version 2.0
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p></td>
+        </tr>
+
+        <tr>
+            <td>Owasp Esapi</td>
+            <td><p><a href="http://code.google.com/p/owasp-esapi-java/">http://code.google.com/p/owasp-esapi-java/</a>
+            </p></td>
+            <td>BSD-3-Clause
+                <p>
+                    <a href=http://opensource.org/licenses/BSD-3-Clause>http://opensource.org/licenses/BSD-3-Clause</a>
+                </p></td>
+        </tr>
+
+        <tr>
+            <td>jnr-posix</td>
+            <td><p><a href=http://github.com/jnr>http://github.com/jnr</a></p></td>
+            <td>Common Public License 1.0<p><a href="http://www.opensource.org/licenses/cpl1.0.php">http://www.opensource.org/licenses/cpl1.0.php</a>
+        </tr>
+
+        <tr>
+            <td>jnr-ffi</td>
+            <td><p><a href=http://github.com/jnr-ffi>http://github.com/jnr-ffi</a></p></td>
+            <td>Apache License, Version 2.0 <p>
+                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>jnr-constants</td>
+            <td><p><a href=http://github.com/jnr-constants>http://github.com/jnr-constants</a></p></td>
+            <td>Apache License, Version 2.0 <p>
+                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>JZlib</td>
+            <td><p><a href="http://www.jcraft.com/jzlib"/>http://www.jcraft.com/jzlib/</a></p></td>
+            <td>BSD Style License<p>
+                <a href="http://www.jcraft.com/jzlib/LICENSE.txt">http://www.jcraft.com/jzlib/LICENSE.txt</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>SnakeYaml</td>
+            <td><p><a href=https://code.google.com/p/snakeyaml/>https://code.google.com/p/snakeyaml/</a></p></td>
+            <td>Apache License, Version 2.0 <p>
+                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>ioStreams</td>
+            <td><p><a href="https://github.com/yoshaul/iostreams">https://github.com/yoshaul/iostreams</a></p></td>
+            <td>Apache License, Version 2.0 <p>
+                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>Hazelcast</td>
+            <td><p><a href="http://www.hazelcast.com">http://www.hazelcast.com</a></p></td>
+            <td>Apache License, Version 2.0 <p>
+                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>Tomcat JDBC Connection Pool</td>
+            <td><p><a href="https://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html">https://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html</a>
+            </p></td>
+            <td>Apache License, Version 2.0 <p>
+                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>Java SemVer</td>
+            <td><p><a href="https://github.com/zafarkhaja/java-semver">https://github.com/zafarkhaja/java-semver</a></p>
+            </td>
+            <td>MIT License <p>
+                <a href=http://opensource.org/licenses/MIT>http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>Apache jclouds</td>
+            <td><p><a href="https://jclouds.apache.org/">https://jclouds.apache.org/</a></p></td>
+            <td>Apache License, Version 2.0 <p>
+                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>JetS3t</td>
+            <td><p><a href="http://www.jets3t.org/">http://www.jets3t.org/</a></p></td>
+            <td>Apache License, Version 2.0 <p>
+                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>Java-xmlbuilder</td>
+            <td><p><a href="https://github.com/jmurty/java-xmlbuilder/">https://github.com/jmurty/java-xmlbuilder</a></p></td>
+            <td>Apache License, Version 2.0 <p>
+                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>iHarder.net Base64</td>
+            <td><p><a href="http://iharder.sourceforge.net/current/java/base64/">http://iharder.sourceforge.net/current/java/base64/</a></p></td>
+            <td>Public Domain</td>
+        </tr>
+
+        <tr>
+            <td>Google Guice</td>
+            <td><p><a href="https://github.com/google/guice">https://github.com/google/guice</a></p></td>
+            <td>Apache License, Version 2.0 <p>
+                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>Gson</td>
+            <td><p><a href="https://github.com/google-gson/google-gson">https://github.com/google-gson/google-gson</a>
+            </p>
+            </td>
+            <td>Apache License, Version 2.0 <p>
+                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>Rocoto</td>
+            <td><p><a href="http://99soft.github.io/rocoto/">http://99soft.github.io/rocoto/</a></p></td>
+            <td>Apache License, Version 2.0 <p>
+                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td colspan="3"><b>FRONTEND LIBRARIES</b></td>
+        </tr>
+
+        <tr>
+            <td>AngularJS</td>
+            <td><p><a href="https://angularjs.org/"/>https://angularjs.org/</a></p></td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>AngularUI Router</td>
+            <td><p><a href="https://github.com/angular-ui/ui-router"/>https://github.com/angular-ui/ui-router</a></p>
+            </td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>Bootstrap</td>
+            <td><p><a href="http://getbootstrap.com"/>http://getbootstrap.com</a></p></td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>Angular Bootstrap</td>
+            <td><p><a href="https://github.com/angular-ui/bootstrap-bower"/>https://github.com/angular-ui/bootstrap-bower</a>
+            </p></td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>Animate.css</td>
+            <td><p><a href=github.com/daneden/animate.css/>github.com/daneden/animate.css</a></p></td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>AngularJS-Toaster</td>
+            <td><p><a href="https://github.com/jirikavi/AngularJS-Toaster"/>https://github.com/jirikavi/AngularJS-Toaster</a>
+            </p></td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>jQuery</td>
+            <td><p><a href="https://jquery.com/"/>https://jquery.com/</a></p></td>
+            <td>MIT License <p>
+                <a href="https://jquery.org/license/">https://jquery.org/license/</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>jQuery UI</td>
+            <td><p><a href="http://jqueryui.com/"/>http://jqueryui.com/</a></p></td>
+            <td>MIT License <p>
+                <a href="https://jquery.org/license/">https://jquery.org/license/</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>lodash</td>
+            <td><p><a href="https://lodash.com/"/>https://lodash.com/</a></p></td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>x2js</td>
+            <td><p><a href="https://code.google.com/p/x2js/"/>https://code.google.com/p/x2js/</a></p></td>
+            <td>Apache License, Version 2.0<p>
+                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>CodeMirror</td>
+            <td><p><a href="https://codemirror.net/"/>https://codemirror.net/</a></p></td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>UI.Codemirror</td>
+            <td><p><a
+                    href="https://github.com/angular-ui/ui-codemirror"/>https://github.com/angular-ui/ui-codemirror</a>
+            </p></td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>AngularJS hotkeys</td>
+            <td><p><a href="https://github.com/drahak/angular-hotkeys"/>https://github.com/drahak/angular-hotkeys</a>
+            </p></td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>AngularJS ui-select</td>
+            <td><p><a href="https://github.com/angular-ui/ui-select"/>https://github.com/angular-ui/ui-select</a></p>
+            </td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>LessFonts: Open Sans</td>
+            <td><p><a href="https://github.com/sethlilly/lessfonts-open-sans"/>https://github.com/sethlilly/lessfonts-open-sans</a>
+            </p></td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>selectize.js</td>
+            <td><p><a
+                    href="https://github.com/brianreavis/selectize.js"/>https://github.com/brianreavis/selectize.js</a>
+            </p></td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>ZeroClipboard</td>
+            <td><p><a href="http://zeroclipboard.org/"/>http://zeroclipboard.org/</a></p></td>
+            <td>MIT License <p>
+                <a href="https://github.com/zeroclipboard/zeroclipboard/blob/master/LICENSE">https://github.com/zeroclipboard/zeroclipboard/blob/master/LICENSE</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>ngClip</td>
+            <td><p><a href="https://github.com/asafdav/ng-clip"/>https://github.com/asafdav/ng-clip</a></p></td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>Angular File Upload</td>
+            <td><p><a href="https://github.com/nervgh/angular-file-upload"/>https://github.com/nervgh/angular-file-upload</a>
+            </p></td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>UI.Utils</td>
+            <td><p><a href="https://github.com/angular-ui/ui-utils"/>https://github.com/angular-ui/ui-utils</a></p></td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>Later</td>
+            <td><p><a href="http://bunkat.github.io/later/"/>http://bunkat.github.io/later/</a></p></td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>Font Awesome</td>
+            <td><p><a href="http://fontawesome.io/"/>http://fontawesome.io/</a></p></td>
+            <td>Font Awesome licensed under SIL OFL 1.1 · Code licensed under MIT License <p>
+                <a href="http://fontawesome.io/license/">http://fontawesome.io/license/</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>Tooltipster</td>
+            <td><p><a href="https://github.com/iamceege/tooltipster"/>https://github.com/iamceege/tooltipster</a></p>
+            </td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>ui-grid-draggable-rows</td>
+            <td><p><a href=https://github.com/cdwv/ui-grid-draggable-rows/>https://github.com/cdwv/ui-grid-draggable-rows</a>
+            </p></td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>angular-color-picker</td>
+            <td><p><a href=https://github.com/ruhley/angular-color-picker/>https://github.com/ruhley/angular-color-picker</a>
+            </p></td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>jQuery-contextMenu</td>
+            <td><p><a href=https://github.com/swisnl/jQuery-contextMenu>https://github.com/swisnl/jQuery-contextMenu</a>
+            </p></td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>deep-diff</td>
+            <td><p><a href=https://github.com/flitbit/diff>https://github.com/flitbit/diff</a>
+            </p></td>
+            <td>MIT License<p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>clipboard.js</td>
+            <td><p><a href="https://github.com/lgarron/clipboard.js">https://github.com/lgarron/clipboard.js</a>
+            </p></td>
+            <td>MIT License<p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>Commons Httpc Client</td>
+            <td><p><a href=http://hc.apache.org/httpclient-3.x/>http://hc.apache.org/httpclient-3.x/</a></p></td>
+            <td>Apache License, Version 2.0 <p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>CreateJS</td>
+            <td><p><a href="https://github.com/CreateJS">https://github.com/CreateJS</a>
+            </p></td>
+            <td>MIT License<p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>Nimbus JOSE + JWT</td>
+            <td><p><a href="https://connect2id.com/products/nimbus-jose-jwt">https://connect2id.com/products/nimbus-jose-jwt</a>
+            </p></td>
+            <td>Apache License, Version 2.0
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p>
+            </td>
+        </tr>
+        <tr>
+            <td>Json-smart</td>
+            <td><p><a href="https://netplex.github.io/json-smart/">https://netplex.github.io/json-smart/</a>
+            </p></td>
+            <td>Apache License, Version 2.0
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p>
+            </td>
+        </tr>
+        <tr>
+            <td>azure-storage-java</td>
+            <td><p><a href="https://github.com/Azure/azure-storage-java">https://github.com/Azure/azure-storage-java</a>
+            </p></td>
+            <td>Apache License, Version 2.0
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p>
+            </td>
+        </tr>
+        <tr>
+            <td>commons-cli</td>
+            <td><p><a href="http://commons.apache.org/proper/commons-cli/">http://commons.apache.org/proper/commons-cli/</a>
+            </p></td>
+            <td>Apache License, Version 2.0
+                <p>
+                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+                </p>
+            </td>
+        </tr>
+    </table>
+    <br/>
+
+    <b>This software includes the following MODIFIED third party software:</b><br>
+
+    <p/>
+    <table border="1" width="100%">
+        <tr>
+            <td width="33%"><b>Third party software</b></td>
+            <td width="33%"><b>Third party URL</b></td>
+            <td width="33%"><b>Licensed under</b></td>
+        </tr>
+        <tr>
+            <td>odata4j<br/> An OData framework for Java</td>
+            <td><p><a href="http://odata4j.org"/>http://odata4j.org</a></p></td>
+            <td>Apache License, Version 2.0 <p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>JRuby</td>
+            <td><p><a href=http://jruby.org/>http://jruby.org/</a></p></td>
+            <td>Eclipse Public License version 1.0
+                <p>
+                    <a href=http://www.eclipse.org/legal/epl-v10.html>http://www.eclipse.org/legal/epl-v10.html</a>
+                </p></td>
+        </tr>
+        <tr>
+            <td colspan="3"><b>FRONTEND LIBRARIES</b></td>
+        </tr>
+
+        <tr>
+            <td>UI.Layout</td>
+            <td><p><a href="http://angular-ui.github.io/ui-layout/"/>http://angular-ui.github.io/ui-layout/</a></p></td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>Angula UI-Grid</td>
+            <td><p><a href="https://github.com/angular-ui/ui-grid.git"/>https://github.com/angular-ui/ui-grid</a></p>
+            </td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>jsTree</td>
+            <td><p><a href="http://www.jstree.com/"/>http://www.jstree.com/</a></p></td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+
+        <tr>
+            <td>angular-selectize</td>
+            <td><p><a href="https://github.com/machineboy2045/angular-selectize"/>https://github.com/machineboy2045/angular-selectize</a>
+            </p></td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>angular-mousewheel</td>
+            <td><p><a href="https://github.com/monospaced/angular-mousewheel"/>https://github.com/monospaced/angular-mousewheel</a>
+            </p></td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+        <tr>
+            <td>Hamster.js</td>
+            <td><p><a href="https://github.com/monospaced/hamster.js"/>https://github.com/monospaced/hamster.js</a>
+            </p></td>
+            <td>MIT License <p>
+                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
+            </p></td>
+        </tr>
+    </table>
+
+
+
+    <p><br> <br> You can contact us via <b><i><a href="mailto:info at jfrog.com">info at jfrog.com</a></i></b> for any further
+        information. </p></div>
+<br></body>
+</html>
diff --git a/backend/core/pom.xml b/backend/core/pom.xml
deleted file mode 100644
index 95aefbf..0000000
--- a/backend/core/pom.xml
+++ /dev/null
@@ -1,251 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0          http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>artifactory-core</artifactId>
-    <packaging>jar</packaging>
-    <name>Artifactory Core</name>
-
-    <parent>
-        <artifactId>artifactory-backend-parent</artifactId>
-        <groupId>org.artifactory</groupId>
-        <version>4.8.0</version>
-    </parent>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-log</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-capi</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-api</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-common</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-traffic</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-storage-common</artifactId>
-            <!-- TODO: Check what can be runtime -->
-            <scope>compile</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-update</artifactId>
-            <!-- TODO: Will be moved to runtime soon -->
-            <scope>compile</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-storage-db</artifactId>
-            <scope>compile</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-support-core</artifactId>
-            <scope>compile</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-config</artifactId>
-            <type>test-jar</type>
-        </dependency>
-
-        <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>javax.mail</groupId>
-            <artifactId>mail</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.maven</groupId>
-            <artifactId>maven-artifact</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.maven</groupId>
-            <artifactId>maven-plugin-descriptor</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.maven</groupId>
-            <artifactId>maven-project</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.derby</groupId>
-            <artifactId>derby</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-beanutils</groupId>
-            <artifactId>commons-beanutils</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-tx</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>aopalliance</groupId>
-            <artifactId>aopalliance</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-aop</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-expression</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-aspects</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-context-support</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.security</groupId>
-            <artifactId>spring-security-acl</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.security</groupId>
-            <artifactId>spring-security-ldap</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.quartz-scheduler</groupId>
-            <artifactId>quartz</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.google.code.atinject</groupId>
-            <artifactId>atinject</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.maven.indexer</groupId>
-            <artifactId>indexer-core</artifactId>
-        </dependency>
-        <!-- for some reason the java 5 compiler doesn't work without this dependency -->
-        <dependency>
-            <groupId>org.codehaus.plexus</groupId>
-            <artifactId>plexus-component-annotations</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.codehaus.plexus</groupId>
-            <artifactId>plexus-utils</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.ivy</groupId>
-            <artifactId>ivy</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.iostreams</groupId>
-            <artifactId>iostreams</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.codehaus.mojo</groupId>
-            <artifactId>versions-maven-plugin</artifactId>
-        </dependency>
-
-        <!-- test dependencies -->
-        <dependency>
-            <groupId>org.easymock</groupId>
-            <artifactId>easymock</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-test</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-webapp</artifactId>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.easytesting</groupId>
-            <artifactId>fest-assert</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.codehaus.groovy</groupId>
-            <artifactId>groovy-all</artifactId>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.spockframework</groupId>
-            <artifactId>spock-core</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.sshd</groupId>
-            <artifactId>sshd-core</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.bouncycastle</groupId>
-            <artifactId>bcpkix-jdk15on</artifactId>
-        </dependency>
-    </dependencies>
-</project>
diff --git a/backend/core/src/main/images/artifactory.odg b/backend/core/src/main/images/artifactory.odg
deleted file mode 100644
index 1e31997..0000000
Binary files a/backend/core/src/main/images/artifactory.odg and /dev/null differ
diff --git a/backend/core/src/main/images/artifactory.png b/backend/core/src/main/images/artifactory.png
deleted file mode 100644
index fa72d75..0000000
Binary files a/backend/core/src/main/images/artifactory.png and /dev/null differ
diff --git a/backend/core/src/main/java/org/artifactory/addon/CoreAddonsImpl.java b/backend/core/src/main/java/org/artifactory/addon/CoreAddonsImpl.java
deleted file mode 100644
index 8ae7031..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/CoreAddonsImpl.java
+++ /dev/null
@@ -1,1324 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon;
-
-import com.google.common.collect.HashMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Multimap;
-import com.google.common.collect.Sets;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.apache.http.HttpStatus;
-import org.apache.sshd.server.Command;
-import org.artifactory.addon.blackduck.BlackDuckAddon;
-import org.artifactory.addon.blackduck.ExternalComponentInfo;
-import org.artifactory.addon.bower.BowerAddon;
-import org.artifactory.addon.bower.BowerMetadataInfo;
-import org.artifactory.addon.build.ArtifactBuildAddon;
-import org.artifactory.addon.cocoapods.CocoaPodsAddon;
-import org.artifactory.addon.debian.DebianAddon;
-import org.artifactory.addon.debian.DebianCalculationEvent;
-import org.artifactory.addon.docker.DockerAddon;
-import org.artifactory.addon.docker.DockerV2InfoModel;
-import org.artifactory.addon.docker.rest.DockerTokenCacheKey;
-import org.artifactory.addon.filteredresources.FilteredResourcesAddon;
-import org.artifactory.addon.gems.ArtifactGemsInfo;
-import org.artifactory.addon.gems.GemsAddon;
-import org.artifactory.addon.gitlfs.GitLfsAddon;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.addon.ha.message.HaMessage;
-import org.artifactory.addon.ha.message.HaMessageTopic;
-import org.artifactory.addon.ha.semaphore.JVMSemaphoreWrapper;
-import org.artifactory.addon.ha.semaphore.SemaphoreWrapper;
-import org.artifactory.addon.ldapgroup.LdapUserGroupAddon;
-import org.artifactory.addon.license.LicenseStatus;
-import org.artifactory.addon.license.LicensesAddon;
-import org.artifactory.addon.npm.NpmAddon;
-import org.artifactory.addon.npm.NpmMetadataInfo;
-import org.artifactory.addon.nuget.UiNuGetAddon;
-import org.artifactory.addon.oauth.OAuthSsoAddon;
-import org.artifactory.addon.opkg.OpkgAddon;
-import org.artifactory.addon.opkg.OpkgCalculationEvent;
-import org.artifactory.addon.properties.ArtifactPropertiesAddon;
-import org.artifactory.addon.pypi.PypiAddon;
-import org.artifactory.addon.pypi.PypiPkgMetadata;
-import org.artifactory.addon.replication.LocalReplicationSettings;
-import org.artifactory.addon.replication.RemoteReplicationSettings;
-import org.artifactory.addon.replication.ReplicationAddon;
-import org.artifactory.addon.smartrepo.SmartRepoAddon;
-import org.artifactory.addon.sso.HttpSsoAddon;
-import org.artifactory.addon.sso.crowd.CrowdAddon;
-import org.artifactory.addon.sso.crowd.CrowdExtGroup;
-import org.artifactory.addon.sso.saml.SamlSsoAddon;
-import org.artifactory.addon.support.SupportAddon;
-import org.artifactory.addon.watch.ArtifactWatchAddon;
-import org.artifactory.addon.webstart.ArtifactWebstartAddon;
-import org.artifactory.addon.yum.ArtifactRpmMetadata;
-import org.artifactory.addon.yum.YumAddon;
-import org.artifactory.api.bintray.docker.BintrayDockerPushRequest;
-import org.artifactory.api.build.GeneralBuild;
-import org.artifactory.api.build.ModuleArtifact;
-import org.artifactory.api.build.ModuleDependency;
-import org.artifactory.api.build.PublishedModule;
-import org.artifactory.api.build.diff.BuildsDiffBaseFileModel;
-import org.artifactory.api.build.diff.BuildsDiffPropertyModel;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.common.MoveMultiStatusHolder;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.governance.BlackDuckApplicationInfo;
-import org.artifactory.api.governance.GovernanceRequestInfo;
-import org.artifactory.api.license.LicenseInfo;
-import org.artifactory.api.license.LicensesInfo;
-import org.artifactory.api.license.ModuleLicenseModel;
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.api.rest.build.diff.BuildsDiff;
-import org.artifactory.api.rest.compliance.FileComplianceInfo;
-import org.artifactory.api.rest.replication.ReplicationStatus;
-import org.artifactory.api.search.property.PropertySearchControls;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.build.ArtifactoryBuildArtifact;
-import org.artifactory.build.BuildRun;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.config.ConfigurationException;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.external.BlackDuckSettingsDescriptor;
-import org.artifactory.descriptor.property.Property;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.replication.RemoteReplicationDescriptor;
-import org.artifactory.descriptor.replication.ReplicationBaseDescriptor;
-import org.artifactory.descriptor.repo.HttpRepoDescriptor;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RealRepoDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-import org.artifactory.descriptor.security.ldap.LdapSetting;
-import org.artifactory.descriptor.security.ldap.SearchPattern;
-import org.artifactory.descriptor.security.ldap.group.LdapGroupPopulatorStrategies;
-import org.artifactory.descriptor.security.ldap.group.LdapGroupSetting;
-import org.artifactory.descriptor.security.sso.CrowdSettings;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.fs.StatsInfo;
-import org.artifactory.fs.WatchersInfo;
-import org.artifactory.fs.ZipEntryRepoResource;
-import org.artifactory.md.Properties;
-import org.artifactory.nuget.NuMetaData;
-import org.artifactory.repo.HttpRepo;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RemoteRepo;
-import org.artifactory.repo.Repo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.cache.expirable.CacheExpiryStrategyImpl;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.repo.service.mover.MoverConfig;
-import org.artifactory.repo.virtual.VirtualRepo;
-import org.artifactory.request.ArtifactoryRequest;
-import org.artifactory.request.InternalRequestContext;
-import org.artifactory.request.Request;
-import org.artifactory.resource.FileResource;
-import org.artifactory.resource.ResourceStreamHandle;
-import org.artifactory.resource.UnfoundRepoResource;
-import org.artifactory.sapi.common.ExportSettings;
-import org.artifactory.sapi.common.ImportSettings;
-import org.artifactory.sapi.fs.VfsItem;
-import org.artifactory.schedule.Task;
-import org.artifactory.security.MutableUserInfo;
-import org.artifactory.security.UserGroupInfo;
-import org.artifactory.security.props.auth.CacheWrapper;
-import org.artifactory.security.props.auth.SimpleCacheWrapper;
-import org.artifactory.security.props.auth.SshTokenManager;
-import org.artifactory.storage.db.servers.model.ArtifactoryServer;
-import org.artifactory.storage.fs.lock.FsItemsVault;
-import org.artifactory.storage.fs.lock.FsItemsVaultCacheImpl;
-import org.artifactory.storage.fs.lock.map.JVMLockingMap;
-import org.artifactory.storage.fs.lock.map.LockingMap;
-import org.artifactory.storage.fs.lock.provider.JVMLockProvider;
-import org.artifactory.storage.fs.lock.provider.LockProvider;
-import org.artifactory.util.HttpUtils;
-import org.artifactory.util.Pair;
-import org.artifactory.util.RepoLayoutUtils;
-import org.jfrog.build.api.Build;
-import org.jfrog.build.api.Dependency;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.ldap.core.ContextSource;
-import org.springframework.ldap.core.DirContextOperations;
-import org.springframework.ldap.core.support.BaseLdapPathContextSource;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.ldap.search.FilterBasedLdapUserSearch;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-import java.security.Key;
-import java.security.KeyStore;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.Semaphore;
-import java.util.regex.Pattern;
-
-/**
- * Default implementation of the core-related addon factories.
- *
- * @author Yossi Shaul
- */
- at Component
-public class CoreAddonsImpl implements WebstartAddon, LdapGroupAddon, LicensesAddon, PropertiesAddon, LayoutsCoreAddon,
-        FilteredResourcesAddon, ReplicationAddon, YumAddon, NuGetAddon, RestCoreAddon, CrowdAddon, BlackDuckAddon,
-        GemsAddon, HaAddon, NpmAddon, BowerAddon, DebianAddon, OpkgAddon, PypiAddon, DockerAddon, VagrantAddon,
-        ArtifactWatchAddon, ArtifactBuildAddon, UiNuGetAddon, LdapUserGroupAddon, GitLfsAddon, CocoaPodsAddon,
-        ArtifactWebstartAddon, SamlSsoAddon, OAuthSsoAddon, HttpSsoAddon, SmartRepoAddon, ArtifactPropertiesAddon, SupportAddon, Addon {
-
-    private static final Logger log = LoggerFactory.getLogger(CoreAddonsImpl.class);
-
-    @Override
-    public boolean isDefault() {
-        return true;
-    }
-
-    @Override
-    public VirtualRepo createVirtualRepo(InternalRepositoryService repoService, VirtualRepoDescriptor descriptor) {
-        return new VirtualRepo(descriptor, repoService);
-    }
-
-    @Override
-    public void importKeyStore(ImportSettings settings) {
-        // do nothing
-    }
-
-    @Override
-    public void exportKeyStore(ExportSettings exportSettings) {
-        // do nothing
-    }
-
-    @Override
-    public void addExternalGroups(String userName, Set<UserGroupInfo> groups) {
-        // nop
-    }
-
-    @Override
-    public Set<CrowdExtGroup> findCrowdExtGroups(String username, CrowdSettings currentCrowdSettings) {
-        return null;
-    }
-
-    @Override
-    public void testCrowdConnection(CrowdSettings crowdSettings) throws Exception {
-    }
-
-    @Override
-    public void logOffCrowd(HttpServletRequest request, HttpServletResponse response) {
-    }
-
-    @Override
-    public void populateGroups(DirContextOperations dirContextOperations, MutableUserInfo userInfo) {
-        // do nothing
-    }
-
-    @Override
-    public void populateGroups(String dn, MutableUserInfo info) {
-        // do nothing
-    }
-
-    @Override
-    public List<LdapSetting> getEnabledLdapSettings() {
-        CentralConfigDescriptor descriptor = ContextHelper.get().beanForType(
-                CentralConfigService.class).getDescriptor();
-        List<LdapSetting> enabledLdapSettings = descriptor.getSecurity().getEnabledLdapSettings();
-        if (enabledLdapSettings != null && !enabledLdapSettings.isEmpty()) {
-            return Lists.newArrayList(enabledLdapSettings.get(0));
-        }
-        return Lists.newArrayList();
-    }
-
-    @Override
-    public List<FilterBasedLdapUserSearch> getLdapUserSearches(ContextSource ctx, LdapSetting settings) {
-        SearchPattern searchPattern = settings.getSearch();
-        String[] searchBases;
-        if (searchPattern.getSearchBase() == null) {
-            searchBases = new String[]{""};
-        } else {
-            searchBases = searchPattern.getSearchBase().split(Pattern.quote("|"));
-        }
-        ArrayList<FilterBasedLdapUserSearch> result = new ArrayList<>();
-        for (String base : searchBases) {
-            FilterBasedLdapUserSearch userSearch = new FilterBasedLdapUserSearch(base,
-                    searchPattern.getSearchFilter(), (BaseLdapPathContextSource) ctx);
-            userSearch.setSearchSubtree(searchPattern.isSearchSubTree());
-            result.add(userSearch);
-        }
-        return result;
-    }
-
-    @Override
-    public void performOnBuildArtifacts(Build build) {
-        // NOP
-    }
-
-    @Override
-    public void addPropertySetToRepository(RealRepoDescriptor descriptor) {
-        // NOP
-    }
-
-    @Override
-    public void importLicenses(ImportSettings settings) {
-        // NOP
-    }
-
-    @Override
-    public void exportLicenses(ExportSettings exportSettings) {
-        // nop
-    }
-
-    @Override
-    public List<ModuleLicenseModel> findLicensesInRepos(Set<String> repoKeys, LicenseStatus status) {
-        return Lists.newArrayList();
-    }
-
-    @Override
-    public LicensesInfo getArtifactsLicensesInfo() {
-        return null;
-    }
-
-    @Override
-    public String writeLicenseXML(LicensesInfo licensesInfo) {
-        return null;
-    }
-
-    @Override
-    public void addLicenseInfo(LicenseInfo licensesInfo) {
-
-    }
-
-    @Override
-    public void updateLicenseInfo(LicenseInfo licensesInfo) {
-    }
-
-    @Override
-    public void deleteLicenseInfo(LicenseInfo licensesInfo) {
-
-    }
-
-    @Override
-    public LicenseInfo getLicenseByName(String licenseName) {
-        return new LicenseInfo();
-    }
-
-    @Override
-    public void reloadLicensesCache() {
-    }
-
-    @Override
-    public Multimap<RepoPath, ModuleLicenseModel> populateLicenseInfoSynchronously(Build build, boolean autoDiscover) {
-        return HashMultimap.create();
-    }
-
-    @Override
-    public String generateLicenseCsv(Collection<ModuleLicenseModel> models) {
-        return null;
-    }
-
-    @Override
-    public boolean setLicensePropsOnPath(RepoPath path, Set<LicenseInfo> licenses) {
-        return false;
-    }
-
-    @Override
-    public void setLicensePropsOnPath(RepoPath path, String... licenseNames) {
-    }
-
-    @Override
-    public Set<LicenseInfo> scanPathForLicenses(RepoPath path) {
-        return Sets.newHashSet();
-    }
-
-    @Override
-    public Set<LicenseInfo> getPathLicensesByProps(RepoPath path) {
-        return null;
-    }
-
-    @Override
-    public Properties getProperties(RepoPath repoPath) {
-        return (Properties) InfoFactoryHolder.get().createProperties();
-    }
-
-    @Override
-    public Map<RepoPath, Properties> getProperties(Set<RepoPath> repoPaths) {
-        return Maps.newHashMap();
-    }
-
-    @Override
-    public void deleteProperty(RepoPath repoPath, String property) {
-        // nop
-    }
-
-    @Override
-    public void addProperty(RepoPath repoPath, PropertySet propertySet, Property property, String... values) {
-        //nop
-    }
-
-    @Override
-    public void setProperties(RepoPath repoPath, Properties properties) {
-        //nop
-    }
-
-    @Override
-    public RepoResource assembleDynamicMetadata(InternalRequestContext context, RepoPath metadataRepoPath) {
-        return new FileResource(ContextHelper.get().getRepositoryService().getFileInfo(metadataRepoPath));
-    }
-
-    @Override
-    public void updateRemoteProperties(Repo repo, RepoPath repoPath) {
-        // nop
-    }
-
-    @Override
-    public boolean isFilteredResourceFile(RepoPath repoPath) {
-        return false;
-    }
-
-    @Override
-    public boolean isFilteredResourceFile(RepoPath repoPath, Properties props) {
-        return false;
-    }
-
-    @Override
-    public RepoResource getFilteredResource(Request request, FileInfo fileInfo, InputStream fileInputStream) {
-        return new UnfoundRepoResource(fileInfo.getRepoPath(),
-                "Creation of a filtered resource requires the Properties add-on.", HttpStatus.SC_FORBIDDEN);
-    }
-
-    @Override
-    public RepoResource getZipResource(Request request, FileInfo fileInfo, InputStream stream) {
-        return new UnfoundRepoResource(fileInfo.getRepoPath(),
-                "Direct resource download from zip requires the Filtered resources add-on.", HttpStatus.SC_FORBIDDEN);
-    }
-
-    @Override
-    public ResourceStreamHandle getZipResourceHandle(ZipEntryRepoResource resource, InputStream stream) {
-        throw new UnsupportedOperationException(
-                "Direct resource download from zip requires the Filtered resources add-on.");
-    }
-
-    @Override
-    public String getGeneratedSettingsUsernameTemplate() {
-        return "${security.getCurrentUsername()}";
-    }
-
-    @Override
-    public String getGeneratedSettingsUserCredentialsTemplate(boolean escape) {
-        AuthorizationService authorizationService = ContextHelper.get().getAuthorizationService();
-
-        if (authorizationService.isAnonymous() || authorizationService.isTransientUser()) {
-            return "";
-        }
-
-        StringBuilder credentialsTemplateBuilder = new StringBuilder("${security.getE");
-        if (escape) {
-            credentialsTemplateBuilder.append("scapedE");
-        }
-        return credentialsTemplateBuilder.append(
-                "ncryptedPassword()!\"*** Insert encrypted password here ***\"}").toString();
-    }
-
-    @Override
-    public String filterResource(Request request, Properties contextProperties, Reader reader) throws Exception {
-        try {
-            return IOUtils.toString(reader);
-        } finally {
-            IOUtils.closeQuietly(reader);
-        }
-    }
-
-    @Override
-    public String filterResource(Reader reader, Object model) throws Exception {
-        try {
-            return IOUtils.toString(reader);
-        } finally {
-            IOUtils.closeQuietly(reader);
-        }
-    }
-
-    @Override
-    public void toggleResourceFilterState(RepoPath repoPath, boolean filtered) {
-    }
-
-    @Override
-    public void assertLayoutConfigurationsBeforeSave(CentralConfigDescriptor newDescriptor) {
-        List<RepoLayout> repoLayouts = newDescriptor.getRepoLayouts();
-        if ((repoLayouts == null) || repoLayouts.isEmpty()) {
-            throw new ConfigurationException("Could not find any repository layouts.");
-        }
-
-        if (repoLayouts.size() != 10) {
-            throw new ConfigurationException("There should be 10 default repository layouts.");
-        }
-
-        assertLayoutsExistsAndEqual(repoLayouts, RepoLayoutUtils.MAVEN_2_DEFAULT, RepoLayoutUtils.IVY_DEFAULT,
-                RepoLayoutUtils.GRADLE_DEFAULT, RepoLayoutUtils.MAVEN_1_DEFAULT);
-    }
-
-    @Override
-    public boolean canCrossLayouts(RepoLayout source, RepoLayout target) {
-        return false;
-    }
-
-    @Override
-    public void performCrossLayoutMoveOrCopy(MoveMultiStatusHolder status, MoverConfig moverConfig,
-                                             LocalRepo sourceRepo, LocalRepo targetLocalRepo, VfsItem sourceItem) {
-        throw new UnsupportedOperationException(
-                "Cross layout move or copy operations require the Repository Layouts addon.");
-    }
-
-    @Override
-    public String translateArtifactPath(RepoLayout sourceRepoLayout, RepoLayout targetRepoLayout, String path) {
-        return translateArtifactPath(sourceRepoLayout, targetRepoLayout, path, null);
-    }
-
-    @Override
-    public String translateArtifactPath(RepoLayout sourceRepoLayout, RepoLayout targetRepoLayout, String path,
-                                        @Nullable BasicStatusHolder multiStatusHolder) {
-        return path;
-    }
-
-    private void assertLayoutsExistsAndEqual(List<RepoLayout> repoLayouts, RepoLayout... expectedLayouts) {
-        for (RepoLayout expectedLayout : expectedLayouts) {
-            assertLayoutExistsAndEqual(repoLayouts, expectedLayout);
-        }
-    }
-
-    private void assertLayoutExistsAndEqual(List<RepoLayout> repoLayouts, RepoLayout expectedLayout) {
-
-        if (!repoLayouts.contains(expectedLayout)) {
-            throw new ConfigurationException("Could not find the default repository layout: " +
-                    expectedLayout.getName());
-        }
-
-        RepoLayout existingLayoutConfig = repoLayouts.get(repoLayouts.indexOf(expectedLayout));
-        if (!EqualsBuilder.reflectionEquals(existingLayoutConfig, expectedLayout)) {
-            throw new ConfigurationException("The configured repository layout '" + expectedLayout.getName() +
-                    "' is different from the default configuration.");
-        }
-    }
-
-    @Override
-    public BasicStatusHolder performRemoteReplication(RemoteReplicationSettings settings) {
-        return getReplicationRequiredStatusHolder();
-    }
-
-    @Override
-    public BasicStatusHolder performLocalReplication(LocalReplicationSettings settings) {
-        return getReplicationRequiredStatusHolder();
-    }
-
-    @Override
-    public void scheduleImmediateLocalReplicationTask(LocalReplicationDescriptor replicationDescriptor,
-                                                      BasicStatusHolder statusHolder) {
-        statusHolder.error("Error: the replication addon is required for this operation.", HttpStatus.SC_BAD_REQUEST,
-                log);
-    }
-
-    @Override
-    public void scheduleImmediateRemoteReplicationTask(RemoteReplicationDescriptor replicationDescriptor,
-                                                       BasicStatusHolder statusHolder) {
-        statusHolder.error("Error: the replication addon is required for this operation.", HttpStatus.SC_BAD_REQUEST,
-                log);
-    }
-
-    @Override
-    public ReplicationStatus getReplicationStatus(RepoPath repoPath) {
-        return null;
-    }
-
-    @Override
-    public void offerLocalReplicationDeploymentEvent(RepoPath repoPath) {
-    }
-
-    @Override
-    public void offerLocalReplicationMkDirEvent(RepoPath repoPath) {
-    }
-
-    @Override
-    public void offerLocalReplicationDeleteEvent(RepoPath repoPath) {
-    }
-
-    @Override
-    public void offerLocalReplicationPropertiesChangeEvent(RepoPath repoPath) {
-    }
-
-    @Override
-    public void validateTargetIsDifferentInstance(ReplicationBaseDescriptor descriptor,
-                                                  RealRepoDescriptor repoDescriptor) throws IOException {
-    }
-
-    @Override
-    public void validateTargetLicense(ReplicationBaseDescriptor descriptor, RealRepoDescriptor repoDescriptor,
-                                      int numOfReplicationConfigured) {
-    }
-
-    @Override
-    public BasicStatusHolder filterIfMultiPushIsNotAllowed(List<LocalReplicationDescriptor> pushReplications) {
-        BasicStatusHolder multiStatusHolder = new BasicStatusHolder();
-        multiStatusHolder.error("Error: an HA license and the replication addon are required for this operation.",
-                HttpStatus.SC_BAD_REQUEST, log);
-        return multiStatusHolder;
-    }
-
-    @Override
-    public void cleanupLocalReplicationProperties(LocalReplicationDescriptor replication) {
-
-    }
-
-    private BasicStatusHolder getReplicationRequiredStatusHolder() {
-        BasicStatusHolder multiStatusHolder = new BasicStatusHolder();
-        multiStatusHolder.error("Error: the replication addon is required for this operation.",
-                HttpStatus.SC_BAD_REQUEST, log);
-        return multiStatusHolder;
-    }
-
-    @Override
-    public void requestAsyncRepositoryYumMetadataCalculation(RepoPath... repoPaths) {
-    }
-
-    @Override
-    public void requestAsyncRepositoryYumMetadataCalculation(LocalRepoDescriptor repo) {
-    }
-
-    @Override
-    public void requestYumMetadataCalculation(LocalRepoDescriptor repo) {
-    }
-
-    @Override
-    public ArtifactRpmMetadata getRpmMetadata(FileInfo fileInfo) {
-        return null;
-    }
-
-    @Override
-    public void recalculateAll(LocalRepoDescriptor localRepoDescriptor, String password, boolean delayed, boolean writeProps) {
-    }
-
-    @Override
-    public void calculateMetaData(Set<DebianCalculationEvent> calculationRequests,
-            @Nullable Collection<RepoPath> propertyWriterEntries, boolean delayed) {
-    }
-
-    @Override
-    public void onInstallKey(String key, boolean isPublic) throws Exception {
-
-    }
-
-    @Override
-    public void removeKey(boolean isPublic) {
-    }
-
-    @Override
-    public boolean hasPrivateKey() {
-        return false;
-    }
-
-    @Override
-    public boolean hasPublicKey() {
-        return false;
-    }
-
-    @Override
-    public boolean verifyPassPhrase(String phrase) {
-        return false;
-    }
-
-    @Override
-    public void savePassPhrase(String password) {
-
-    }
-
-    @Override
-    public void extractNuPkgInfo(FileInfo fileInfo, MutableStatusHolder statusHolder, boolean addToCache) {
-    }
-
-    @Override
-    public void extractNuPkgInfoSynchronously(FileInfo file, MutableStatusHolder statusHolder) {
-    }
-
-    @Override
-    public void addNuPkgToRepoCache(RepoPath repoPath, Properties properties) {
-    }
-
-    @Override
-    public void addNuPkgToRepoCacheAsync(RepoPath repoPath, Properties properties) {
-
-    }
-
-    @Override
-    public void removeNuPkgFromRepoCache(String repoKey, String packageId, String packageVersion) {
-    }
-
-    @Override
-    public void internalAddNuPkgToRepoCache(RepoPath repoPath, Properties properties) {
-    }
-
-    @Override
-    public void internalRemoveNuPkgFromRepoCache(String repoKey, String packageId, String packageVersion) {
-    }
-
-    @Nonnull
-    @Override
-    public RemoteRepo createRemoteRepo(InternalRepositoryService repoService, RemoteRepoDescriptor repoDescriptor,
-                                       boolean offlineMode, RemoteRepo oldRemoteRepo) {
-        return new HttpRepo((HttpRepoDescriptor) repoDescriptor, repoService, offlineMode, oldRemoteRepo);
-    }
-
-    @Override
-    public void deployArchiveBundle(ArtifactoryRequest request, ArtifactoryResponse response, LocalRepo repo)
-            throws IOException {
-        response.sendError(HttpStatus.SC_BAD_REQUEST, "This REST API is available only in Artifactory Pro.", log);
-    }
-
-    @Override
-    public InternalRequestContext getDynamicVersionContext(Repo repo, InternalRequestContext originalRequestContext,
-                                                           boolean isRemote) {
-        return originalRequestContext;
-    }
-
-    @Override
-    public boolean isCrowdAuthenticationSupported(Class<?> authentication) {
-        return false;
-    }
-
-    @Override
-    public Authentication authenticateCrowd(Authentication authentication) {
-        throw new UnsupportedOperationException("This feature requires the Crowd SSO addon.");
-    }
-
-    @Override
-    public boolean findUser(String userName) {
-        return false;
-    }
-
-    @Override
-    public FileComplianceInfo getExternalInfoFromMetadata(RepoPath repoPath) {
-        throw new UnsupportedOperationException("This feature requires the Black Duck addon.");
-    }
-
-    @Override
-    public void performBlackDuckOnBuildArtifacts(Build build) {
-        // NOP
-    }
-
-    @Override
-    public void testConnection(BlackDuckSettingsDescriptor blackDuckSettingsDescriptor) throws Exception {
-
-    }
-
-    @Override
-    public ExternalComponentInfo getBlackduckInfo(RepoPath repoPath) {
-        return null;
-    }
-
-    @Override
-    public boolean queryCodeCenterForPath(RepoPath path) {
-        return false;
-    }
-
-    @Override
-    public String getComponentExternalIdFromProperty(RepoPath repoPath) {
-        return null;
-    }
-
-    @Override
-    public String getComponentIdFromProperty(RepoPath repoPath) {
-        return null;
-    }
-
-    @Override
-    public void clearComponentIdProperty(RepoPath repoPath) {
-
-    }
-
-    @Override
-    public void setComponentExternalIdProperty(RepoPath repoPath, String updatedComponentId) {
-
-    }
-
-    @Override
-    public boolean isEnableIntegration() {
-        return false;
-    }
-
-    @Override
-    public Collection<GovernanceRequestInfo> getGovernanceRequestInfos(Build build, String appName, String appVersion, Set<String> scopes) {
-        return null;
-    }
-
-    @Override
-    public BlackDuckApplicationInfo blackDuckApplicationInfo(String appInfo, String versionInfo) {
-        return null;
-    }
-
-    @Override
-    public String updateRequest(Build build, GovernanceRequestInfo requestInfo) {
-        return null;
-    }
-
-    @Override
-    public boolean isSupportedPackageType(RepoPath path) {
-        return false;
-    }
-
-    @Override
-    public Set<String> getPathLicensesFromProperties(RepoPath path) {
-        return null;
-    }
-
-    @Override
-    public String getLicenseUrl(String license) {
-        return "";
-    }
-
-    @Override
-    public void addPod(FileInfo info) {
-
-    }
-
-    @Override
-    public void addPodAfterCommit(FileInfo info) {
-
-    }
-
-    @Override
-    public void cachePodProperties(FileInfo info) {
-
-    }
-
-    @Override
-    public void removePod(FileInfo info, Properties properties) {
-
-    }
-
-    @Override
-    public void reindexAsync(String repoKey) {
-
-    }
-
-    @Override
-    public NpmMetadataInfo getNpmMetaDataInfo(RepoPath repoPath) {
-        return null;
-    }
-
-    @Override
-    public void afterRepoInit(String repoKey) {
-    }
-
-    @Override
-    public ArtifactGemsInfo getGemsInfo(String repoKey, String path) {
-        return null;
-    }
-
-    @Override
-    public void requestAsyncReindexNuPkgs(String repoKey) {
-    }
-
-    @Override
-    public boolean isHaEnabled() {
-        return false;
-    }
-
-    @Override
-    public boolean isPrimary() {
-        return true;
-    }
-
-    @Override
-    public boolean isHaConfigured() {
-        try {
-            return ArtifactoryHome.get().isHaConfigured();
-        } catch (Exception e) {
-            return false;
-        }
-    }
-
-    @Override
-    public void notify(HaMessageTopic haMessageTopic, HaMessage haMessage) {
-    }
-
-    @Override
-    public String getHostId() {
-        return HttpUtils.getHostId();
-    }
-
-    @Override
-    public void updateArtifactoryServerRole() {
-    }
-
-    @Override
-    public boolean deleteArtifactoryServer(String serverId) {
-        return false;
-    }
-
-    @Override
-    public boolean artifactoryServerHasHeartbeat(ArtifactoryServer artifactoryServer) {
-        return false;
-    }
-
-    @Override
-    public void propagateTaskToPrimary(Task Task) {
-    }
-
-    @Override
-    public LockingMap getLockingMap() {
-        return new JVMLockingMap();
-    }
-
-    @Override
-    public LockingMap getLockingMap(String mapName) {
-        return new JVMLockingMap();
-    }
-
-    @Override
-    public void init() {
-    }
-
-    @Override
-    public FsItemsVault getFsItemVault() {
-        LockProvider lockProvider = new JVMLockProvider();
-        return new FsItemsVaultCacheImpl(lockProvider);
-    }
-
-    @Override
-    public boolean isHaAuthentication() {
-        return false;
-    }
-
-    @Override
-    public String getCurrentMemberServerId() {
-        return null;
-    }
-
-    @Override
-    public void propagateDebianReindexAll(ArtifactoryServer server, String repoKey, boolean async, boolean writeProps) {}
-
-    @Override
-    public void propagateOpkgReindexAll(ArtifactoryServer server, String repoKey, boolean async, boolean writeProps) {
-
-    }
-
-    @Override
-    public List propagateTrafficCollector(long startLong, long endLong, List<String> ipsToFilter,
-            List<ArtifactoryServer> servers, Class clazz){
-        return null;
-    }
-
-    @Override
-    public <T> List<T> propagateTasksList(List<ArtifactoryServer> servers, Class<T> clazz) {
-        return null;
-    }
-
-    @Override
-    public void forceOptimizationOnce() {
-    }
-
-    @Override
-    public SemaphoreWrapper getSemaphore(String semaphoreName) {
-        Semaphore semaphore = new Semaphore(HaCommonAddon.DEFAULT_SEMAPHORE_PERMITS);
-        return new JVMSemaphoreWrapper(semaphore);
-    }
-
-    @Override
-    public <K, V> CacheWrapper<K, V> getCache(String cacheName, CacheWrapper.CacheConfig cacheConfig) {
-        return new SimpleCacheWrapper<>(cacheConfig);
-    }
-
-    @Override
-    public void shutdown() {
-    }
-
-    @Override
-    public List<ArtifactoryServer> getAllArtifactoryServers() {
-        return new ArrayList<>();
-    }
-
-    @Override
-    public void addNpmPackage(FileInfo info) {
-
-    }
-
-    @Override
-    public void handleAddAfterCommit(FileInfo info) {
-
-    }
-
-    @Override
-    public void removeNpmPackage(FileInfo info) {
-
-    }
-
-    @Override
-    public void reindex(LocalRepoDescriptor descriptor, boolean async) {
-
-    }
-
-    @Override
-    public PypiPkgMetadata getPypiMetadata(RepoPath packagePath) {
-        return null;
-    }
-
-    @Override
-    public boolean isPypiFile(FileInfo fileInfo) {
-        return false;
-    }
-
-    @Override
-    public void addBowerPackage(FileInfo info) {
-
-    }
-
-    @Override
-    public void removeBowerPackage(FileInfo info) {
-
-    }
-
-    @Override
-    public boolean isBowerFile(String filePath) {
-        return false;
-    }
-
-    @Override
-    public void requestAsyncReindexBowerPackages(String repoKey) {
-
-    }
-
-    @Override
-    public BowerMetadataInfo getBowerMetadata(RepoPath repoPath) {
-        return null;
-    }
-
-    @Override
-    public void pushTagToBintray(String repoKey, BintrayDockerPushRequest request, @Nullable String distRepoKey) {
-
-    }
-
-    @Override
-    public DockerV2InfoModel getDockerV2Model(RepoPath manifestPath) throws IOException {
-        return null;
-    }
-
-    @Override
-    public String fetchDockerAuthToken(DockerTokenCacheKey tokenCacheKey) {
-        return null;
-    }
-
-    @Override
-    public Map<RepoPath, WatchersInfo> getAllWatchers(RepoPath repoPath) {
-        return null;
-    }
-
-    @Override
-    public void removeWatcher(RepoPath repoPath, String watchUser) {
-
-    }
-
-    @Override
-    public void addWatcher(RepoPath repoPath, String watcherUsername) {
-
-    }
-
-    @Override
-    public boolean isUserWatchingRepo(RepoPath repoPath, String userName) {
-        return false;
-    }
-
-    @Override
-    public Pair<RepoPath, WatchersInfo> getNearestWatchDefinition(RepoPath repoPath, String userName) {
-        return null;
-    }
-
-    @Override
-    public WatchersInfo getWatchers(RepoPath repoPath) {
-        return null;
-    }
-
-    @Override
-    public Set<ArtifactoryBuildArtifact> getBuildArtifactsFileInfos(Build build) {
-        return null;
-    }
-
-    @Override
-    public Map<Dependency, FileInfo> getBuildDependenciesFileInfos(Build build) {
-        return null;
-    }
-
-    @Override
-    public Set<BuildRun> getLatestBuildsPaging(String offset, String orderBy, String direction, String limit) {
-        return null;
-    }
-
-    @Override
-    public List<GeneralBuild> getBuildForNamePaging(String buildName, String orderBy, String direction, String offset, String limit) throws SQLException {
-        return null;
-    }
-
-    @Override
-    public int getBuildForNameTotalCount(String buildName) throws SQLException {
-        return 0;
-    }
-
-    @Override
-    public Build getBuild(BuildRun buildRun) {
-        return null;
-    }
-
-    @Override
-    public BuildRun getBuildRun(String buildName, String buildNumber, String buildStarted) {
-        return null;
-    }
-
-    @Override
-    public Build getLatestBuildByNameAndNumber(String buildName, String BuildNumber) {
-        return null;
-    }
-
-    @Override
-    public List<PublishedModule> getPublishedModules(String buildName, String date, String orderBy, String direction, String offset, String limit) {
-        return null;
-    }
-
-    @Override
-    public int getPublishedModulesCounts(String buildName, String date) {
-        return 0;
-    }
-
-    @Override
-    public List<ModuleArtifact> getModuleArtifact(String buildName ,String buildNumber, String moduleId, String date, String orderBy, String direction, String offset, String limit) {
-        return new ArrayList<>();
-    }
-
-    @Override
-    public int getModuleArtifactCount(String buildNumber, String moduleId, String date) {
-        return 0;
-    }
-
-    @Override
-    public List<ModuleDependency> getModuleDependency(String buildNumber, String moduleId, String date, String orderBy, String direction, String offset, String limit) {
-        return null;
-    }
-
-    @Override
-    public int getModuleDependencyCount(String buildNumber, String moduleId, String date) {
-        return 0;
-    }
-
-    @Override
-    public void deleteAllBuilds(String name) {
-
-    }
-
-    @Override
-    public BuildsDiff getBuildsDiff(Build firstBuild, Build secondBuild, String baseStorageInfoUri) {
-        return null;
-    }
-
-    @Override
-    public List<BuildsDiffBaseFileModel> compareArtifacts(Build build, Build secondBuild) {
-        return null;
-    }
-
-    @Override
-    public List<BuildsDiffBaseFileModel> compareDependencies(Build build, Build secondBuild) {
-        return null;
-    }
-
-    @Override
-    public List<BuildsDiffPropertyModel> compareProperties(Build build, Build secondBuild) {
-        return null;
-    }
-
-    @Override
-    public NuMetaData getNutSpecMetaData(RepoPath nuGetRepoPath) {
-        return null;
-    }
-
-    @Override
-    public Set refreshLdapGroups(String userName, LdapGroupSetting ldapGroupSetting, BasicStatusHolder statusHolder) {
-        return null;
-    }
-
-    @Override
-    public int importLdapGroupsToArtifactory(List ldapGroups, LdapGroupPopulatorStrategies strategy) {
-        return 0;
-    }
-
-    @Override
-    public String[] retrieveUserLdapGroups(String userName, LdapGroupSetting ldapGroupSetting) {
-        return null;
-    }
-
-    @Override
-    public KeyStore loadKeyStore(File keyStoreFile, String password) {
-        return null;
-    }
-
-    @Override
-    public Key getAliasKey(KeyStore keyStore, String alias, String password) {
-        return null;
-    }
-
-    @Override
-    public void addKeyPair(File file, String pairName, String keyStorePassword, String alias, String privateKeyPassword) throws IOException {
-
-    }
-
-    @Override
-    public boolean keyStoreExist() {
-        return false;
-    }
-
-    @Override
-    public List<String> getKeyPairNames() {
-        return null;
-    }
-
-    @Override
-    public boolean removeKeyPair(String keyPairName) {
-        return false;
-    }
-
-    @Override
-    public void setKeyStorePassword(String password) {
-
-    }
-
-    @Override
-    public void removeKeyStorePassword() {
-    }
-
-    @Override
-    public String getSamlLoginIdentityProviderUrl(HttpServletRequest request) {
-        return null;
-    }
-
-    @Override
-    public void createCertificate(String certificate) throws Exception {
-
-    }
-
-    @Override
-    public Boolean isSamlAuthentication(HttpServletRequest servletRequest, HttpServletResponse servletResponse) {
-        return false;
-    }
-
-    @Override
-    public boolean isSamlAuthentication() {
-        return false;
-    }
-
-    @Override
-    public boolean supportRemoteStats() {
-        return false;
-    }
-
-    @Override
-    public void fileDownloadedRemotely(StatsInfo statsInfo, String origin, RepoPath repoPath) {
-
-    }
-
-    @Override
-    public boolean isActive() {
-        return true;
-    }
-
-    @Override
-    public void addPropertySha256RecursivelyMultiple(RepoPath repoPath) {
-    }
-
-    @Override
-    public PropertySearchControls getSha256PropertyControlSearch(String sha256, ArrayList<String> reposToSearch) {
-        return null;
-    }
-
-    @Override
-    public boolean isSupportAddonEnabled() {
-        return false;
-    }
-
-    @Override
-    public List<String> generate(Object bundleConfiguration) {
-        return Lists.newArrayList();
-    }
-
-    @Override
-    public List<String> list() {
-        return Lists.newArrayList();
-    }
-
-    @Override
-    public InputStream download(String bundleName) throws FileNotFoundException {
-        return null;
-    }
-
-    @Override
-    public boolean delete(String bundleName, boolean async) throws FileNotFoundException {
-        return false;
-    }
-
-    @Override
-    public boolean isGitLfsCommand(String command) {
-        return false;
-    }
-
-    @Override
-    public Command createGitLfsCommand(String command, SshTokenManager sshTokenManager) {
-        return null;
-    }
-
-    @Override
-    public void recalculateEntireRepo(String repoKey, String password, boolean delayed, boolean writeProps) {
-
-    }
-
-    @Override
-    public void calculateMetadata(Set<OpkgCalculationEvent> calculationRequests,
-            @Nullable Collection<RepoPath> propertyWriterEntries, boolean delayed) {
-
-    }
-
-    @Override
-    public boolean isHttpSsoAuthentication() {
-        return false;
-    }
-
-    @Override
-    public boolean foundExpiredAndRemoteIsNewer(RepoResource remoteResource, RepoResource cachedResource) {
-        return new CacheExpiryStrategyImpl().foundExpiredAndRemoteIsNewer(remoteResource, cachedResource);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/addon/HaAddon.java b/backend/core/src/main/java/org/artifactory/addon/HaAddon.java
deleted file mode 100644
index 9c7f21d..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/HaAddon.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon;
-
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.schedule.Task;
-import org.artifactory.storage.fs.lock.FsItemsVault;
-import org.artifactory.storage.fs.lock.map.LockingMap;
-
-/**
- * @author mamo
- */
-public interface HaAddon extends HaCommonAddon {
-
-    void updateArtifactoryServerRole();
-
-    boolean deleteArtifactoryServer(String serverId);
-
-    void propagateTaskToPrimary(Task task);
-
-    LockingMap getLockingMap();
-
-    LockingMap getLockingMap(String mapName);
-
-    void init();
-
-    FsItemsVault getFsItemVault();
-
-    /**
-     * @return True if the current authenticated user is another HA node in the cluster
-     */
-    boolean isHaAuthentication();
-}
diff --git a/backend/core/src/main/java/org/artifactory/addon/LayoutsCoreAddon.java b/backend/core/src/main/java/org/artifactory/addon/LayoutsCoreAddon.java
deleted file mode 100644
index 2c31c21..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/LayoutsCoreAddon.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.common.MoveMultiStatusHolder;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.service.mover.MoverConfig;
-import org.artifactory.sapi.fs.VfsItem;
-
-import javax.annotation.Nullable;
-
-/**
- * The core interface of the repository layouts
- *
- * @author Noam Y. Tenne
- */
-public interface LayoutsCoreAddon extends Addon {
-
-    /**
-     * Asserts that central config to be saved adheres to the limitations
-     *
-     * @param newDescriptor Descriptor to check
-     */
-    void assertLayoutConfigurationsBeforeSave(CentralConfigDescriptor newDescriptor);
-
-    boolean canCrossLayouts(RepoLayout source, RepoLayout target);
-
-    void performCrossLayoutMoveOrCopy(MoveMultiStatusHolder status, MoverConfig moverConfig, LocalRepo sourceRepo,
-            LocalRepo targetLocalRepo, VfsItem fsItemToMove);
-
-    String translateArtifactPath(RepoLayout sourceRepoLayout, RepoLayout targetRepoLayout, String path);
-
-    String translateArtifactPath(RepoLayout sourceRepoLayout, RepoLayout targetRepoLayout, String path,
-            @Nullable BasicStatusHolder multiStatusHolder);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/addon/LdapGroupAddon.java b/backend/core/src/main/java/org/artifactory/addon/LdapGroupAddon.java
deleted file mode 100644
index 60bdc00..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/LdapGroupAddon.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon;
-
-import org.artifactory.descriptor.security.ldap.LdapSetting;
-import org.artifactory.security.MutableUserInfo;
-import org.artifactory.security.UserGroupInfo;
-import org.springframework.ldap.core.ContextSource;
-import org.springframework.ldap.core.DirContextOperations;
-import org.springframework.security.ldap.search.FilterBasedLdapUserSearch;
-
-import java.util.List;
-import java.util.Set;
-
-/**
- * Used to populate the user with the groups that he belongs to.
- *
- * @author Tomer Cohen
- */
-public interface LdapGroupAddon extends Addon {
-
-    /**
-     * Add external groups to an existing set of groups.
-     *
-     * @param userName The user name for which to find the external groups for.
-     * @param groups   The set of groups for which to add the external groups for.
-     */
-    void addExternalGroups(String userName, Set<UserGroupInfo> groups);
-
-    /**
-     * Populate the group for a certain user by his Distinguished Name (dn)
-     *
-     * @param dirContextOperations The user context in LDAP
-     * @param userInfo             User information about the current user.
-     */
-    void populateGroups(DirContextOperations dirContextOperations, MutableUserInfo userInfo);
-
-    /**
-     * Populate the group for a certain user by his Distinguished Name (dn).
-     *
-     * @param userDn   The user's distinguished name.
-     * @param userInfo User information about the user for which to populate the group for.
-     */
-    void populateGroups(String userDn, MutableUserInfo userInfo);
-
-    /**
-     * Get the enabled {@link LdapSetting} in the system, in the pro version of Artifactory this will return more
-     * than one enabled LDAP setting configuration.
-     *
-     * @return The enabled LDAP setting(s)
-     */
-    List<LdapSetting> getEnabledLdapSettings();
-
-    List<FilterBasedLdapUserSearch> getLdapUserSearches(ContextSource ctx, LdapSetting settings);
-}
diff --git a/backend/core/src/main/java/org/artifactory/addon/NuGetAddon.java b/backend/core/src/main/java/org/artifactory/addon/NuGetAddon.java
deleted file mode 100644
index 4a8d0a8..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/NuGetAddon.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon;
-
-import org.artifactory.api.repo.Async;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RemoteRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.sapi.common.Lock;
-
-import javax.annotation.Nonnull;
-
-/**
- * Core NuGet functionality interface
- *
- * @author Noam Y. Tenne
- */
-public interface NuGetAddon extends Addon {
-
-    String API_KEY_HEADER = "X-NuGet-ApiKey";
-    String NUGET_USER_AGENT = "nuget";
-    String API_KEY_SEPARATOR = ":";
-    String REPO_KEY_PARAM = "repoKey";
-    String PATH_PARAM = "path";
-    String PACKAGE_ID_PARAM = "packageId";
-    String PACKAGE_VERSION_PARAM = "packageVersion";
-    String PARTIAL_ID_PARAM = "partialId";
-    String INCLUDE_PRERELEASE_PARAM = "includePrerelease";
-
-    /**
-     * Asynchronously extracts the spec from the nupkg and saves it as a binary property (along with ID, version and digest)
-     * for easier availability when searching
-     *
-     * @param fileInfo     NuGet package
-     * @param statusHolder Status holder for logging
-     * @param addToCache   Whether to add the package into the memory cache
-     */
-    @Async(transactional = true, delayUntilAfterCommit = true, authenticateAsSystem = true)
-    void extractNuPkgInfo(FileInfo fileInfo, MutableStatusHolder statusHolder, boolean addToCache);
-
-    /**
-     * Synchronously extracts the spec from the nupkg and saves it as a binary property (along with ID, version and digest)
-     * for easier availability when searching. Used mainly in batch extractions of multiple packages.
-     *
-     * <p><b>NOTE!</b> This method does NOT add the package into the memory cache, it is assumed
-     * that the cache is getting populated in one go after extracting all of the repository packages.
-     *
-     * @param fileInfo     NuGet package
-     * @param statusHolder Status holder for logging
-     */
-    @Lock
-    void extractNuPkgInfoSynchronously(FileInfo file, MutableStatusHolder statusHolder);
-
-    /**
-     * Adds a NuGet package to the NuGet packages memory cache (for local repositories only!).
-     * <p><b>NOTE!</b> This method assumes the repository itself is already in the cache, see {@link #afterRepoInit(String)}
-     *
-     * @param repoPath   The repo path of the NuGet package
-     * @param properties The properties on the repo path, those with "nuget." prefix will get extracted
-     */
-    void addNuPkgToRepoCache(RepoPath repoPath, Properties properties);
-
-    @Async(delayUntilAfterCommit = true)
-    void addNuPkgToRepoCacheAsync(RepoPath repoPath, Properties properties);
-
-    /**
-     * Removes a NuGet package from the local NuGet packages memory cache
-     *
-     * @param repoKey        The repository key
-     * @param packageId      The NuGet package id
-     * @param packageVersion The NuGet package version
-     */
-    void removeNuPkgFromRepoCache(String repoKey, String packageId, String packageVersion);
-
-    /**
-     * Instantiate the remote repository instance
-     *
-     * @param repoService    Repo service
-     * @param repoDescriptor Descriptor of repository to init
-     * @param offlineMode    True if Artifactory is in offline mode
-     * @param oldRemoteRepo  Old remote repo descriptor if the current one is an update
-     * @return Initialized remote repository
-     */
-    @Nonnull
-    RemoteRepo createRemoteRepo(InternalRepositoryService repoService, RemoteRepoDescriptor repoDescriptor,
-            boolean offlineMode, RemoteRepo oldRemoteRepo);
-
-    /**
-     * Asynchronously adds a local NuGet repository into the NuGet packages memory cache if it's not there already
-     *
-     * @param repoKey The repository key to insert into the NuGet packages memory cache
-     */
-    @Async(authenticateAsSystem = true)
-    void afterRepoInit(String repoKey);
-
-    /**
-     * Activate the NuGet packages indexing (re-extract packages nuspec and set as properties)
-     * for the given local/cache/virtual repository. Each reindexing will be queued and processed asynchronously.
-     *
-     * @param repoKey The local/cache/virtual repository to activate NuGet packages reindex on
-     */
-    void requestAsyncReindexNuPkgs(String repoKey);
-
-    //todo consider moving into another common interface of both ha-addon and nuget-addon
-    void internalAddNuPkgToRepoCache(RepoPath repoPath, Properties properties);
-
-    void internalRemoveNuPkgFromRepoCache(String repoKey, String packageId, String packageVersion);
-}
diff --git a/backend/core/src/main/java/org/artifactory/addon/PropertiesAddon.java b/backend/core/src/main/java/org/artifactory/addon/PropertiesAddon.java
deleted file mode 100644
index 3b9f1b0..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/PropertiesAddon.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon;
-
-import org.artifactory.descriptor.property.Property;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.Repo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.request.InternalRequestContext;
-
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Tomer Cohen
- */
-public interface PropertiesAddon extends Addon {
-    /**
-     * Returns properties for the given repo path.
-     *
-     * @param repoPath Path to extract properties for
-     * @return Properties of the repo path
-     * @deprecated Moved from Addons to repo service
-     */
-    @Deprecated
-    Properties getProperties(RepoPath repoPath);
-
-    /**
-     * Returns map of properties for the given repo paths.
-     *
-     * @param repoPaths Paths to extract properties for
-     * @return Map of repo paths with their corresponding properties
-     */
-    Map<RepoPath, Properties> getProperties(Set<RepoPath> repoPaths);
-
-    /**
-     * Deletes the property from the item.
-     *
-     * @param repoPath The item repo path
-     * @param property Property name to delete
-     */
-    void deleteProperty(RepoPath repoPath, String property);
-
-    /**
-     * Adds (and stores) a property to the item at the repo path.
-     *
-     * @param repoPath    The item repo path
-     * @param propertySet Property set to add - can be null
-     * @param property    Property to add
-     * @param values      Property values (if null, will not add the property)
-     */
-    void addProperty(RepoPath repoPath, PropertySet propertySet, Property property, String... values);
-
-    /**
-     * set properties
-     * @param repoPath - node repo path
-     * @param properties - node properties
-     */
-    void setProperties(RepoPath repoPath, Properties properties);
-
-    /**
-     * Assemble a custom maven-metadata.xml according to the metadata definitions and matrix params in conjunction with
-     * the existing properties already on the node.
-     */
-    RepoResource assembleDynamicMetadata(InternalRequestContext context, RepoPath metadataRepoPath);
-
-    /**
-     * update remote file properties
-     *
-     * @param repo - repo descriptor interface
-     */
-    void updateRemoteProperties(Repo repo, RepoPath repoPath);
-}
diff --git a/backend/core/src/main/java/org/artifactory/addon/RestCoreAddon.java b/backend/core/src/main/java/org/artifactory/addon/RestCoreAddon.java
deleted file mode 100644
index 9dda6ee..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/RestCoreAddon.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon;
-
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.Repo;
-import org.artifactory.request.ArtifactoryRequest;
-import org.artifactory.request.InternalRequestContext;
-
-import java.io.IOException;
-
-/**
- * Exposed REST addon features to the core package.
- *
- * @author Shay Yaakov
- */
-public interface RestCoreAddon extends Addon {
-
-    /**
-     * Deploy an archive containing multiple artifacts and explodes it at the specified destination (taken from the request path)
-     * while maintaining the archive's file structure.
-     *
-     * @param request  The original request
-     * @param response The response to send back
-     * @param repo     A local repo to explode the archive to
-     */
-    void deployArchiveBundle(ArtifactoryRequest request, ArtifactoryResponse response, LocalRepo repo)
-            throws IOException;
-
-    /**
-     * Retrieves a transformed request context with the actual latest release/integration version.
-     * Request with the [RELEASE] token will be transformed to the actual release version.
-     * For maven a SNAPSHOT request will be transformed to a unique snapshot version while for non-maven
-     * the [INTEGRATION] token will be transformed to the actual integration version according the the underlying repo layout.
-     *
-     * @param repo                   The repo from the request, it is queried for it's layout etc.
-     * @param originalRequestContext The original request context which will be returned in case we couldn't perform the transformation.
-     *                               (for example if the snapshot policy for maven repo is non-unique).
-     * @param isRemote               A flag which indicates if we are dealing with a remote (false = local/cache/virtual).
-     * @return A transformed request context which points to the actual latest version (wheater it's release or integration),
-     *         the original request context param in case the transformation couldn't happen.
-     */
-    InternalRequestContext getDynamicVersionContext(Repo repo, InternalRequestContext originalRequestContext,
-            boolean isRemote);
-}
diff --git a/backend/core/src/main/java/org/artifactory/addon/VagrantAddon.java b/backend/core/src/main/java/org/artifactory/addon/VagrantAddon.java
deleted file mode 100644
index 647f30b..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/VagrantAddon.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon;
-
-/**
- * @author Shay Yaakov
- */
-public interface VagrantAddon extends Addon {
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/addon/WebstartAddon.java b/backend/core/src/main/java/org/artifactory/addon/WebstartAddon.java
deleted file mode 100644
index 2b81274..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/WebstartAddon.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon;
-
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.repo.virtual.VirtualRepo;
-import org.artifactory.sapi.common.ExportSettings;
-import org.artifactory.sapi.common.ImportSettings;
-
-/**
- * Webstart addon factory.
- *
- * @author Yossi Shaul
- */
-public interface WebstartAddon extends Addon {
-    /**
-     * Creates new VirtualRepo instance. The actual type of the virtual repo is determined by the addon impl.
-     *
-     * @param repoService Repository service
-     * @param descriptor  The repository descriptor
-     * @return New virtual repository
-     */
-    public VirtualRepo createVirtualRepo(InternalRepositoryService repoService, VirtualRepoDescriptor descriptor);
-
-    /**
-     * Import key store as part of the full system import.
-     */
-    void importKeyStore(ImportSettings settings);
-
-    /**
-     * Export key store as part of the full system export.
-     */
-    void exportKeyStore(ExportSettings exportSettings);
-
-
-}
diff --git a/backend/core/src/main/java/org/artifactory/addon/nuget/NuGetProperties.java b/backend/core/src/main/java/org/artifactory/addon/nuget/NuGetProperties.java
deleted file mode 100644
index 76cac16..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/nuget/NuGetProperties.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.nuget;
-
-import org.artifactory.descriptor.property.Property;
-import org.artifactory.md.PropertiesInfo;
-import org.codehaus.plexus.util.StringUtils;
-
-/**
- * Date: 12/6/12
- * Time: 6:21 PM
- *
- * @author freds
- */
-public enum NuGetProperties {
-    Id, Version, Digest,
-    Title, Authors, Owners, Summary, Description,
-    Copyright, RequireLicenseAcceptance, ReleaseNotes,
-    ProjectUrl, LicenseUrl, IconUrl, Tags,
-    Dependency;
-
-    public static final String NUGET_PREFIX = "nuget";
-
-    public String nodePropertyName() {
-        return NUGET_PREFIX + "." + nuspecXmlTagName();
-    }
-
-    public String nuspecXmlTagName() {
-        return StringUtils.lowercaseFirstLetter(name());
-    }
-
-    public Property getProperty() {
-        return new Property(nodePropertyName());
-    }
-
-    public String extract(PropertiesInfo props) {
-        return props.getFirst(nodePropertyName());
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/PluginsAddonDefaultImpl.java b/backend/core/src/main/java/org/artifactory/addon/plugin/PluginsAddonDefaultImpl.java
deleted file mode 100644
index 21414fc..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/PluginsAddonDefaultImpl.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin;
-
-import com.google.common.collect.Maps;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.build.staging.BuildStagingStrategy;
-import org.artifactory.request.Request;
-import org.artifactory.resource.ResourceStreamHandle;
-import org.artifactory.sapi.common.ExportSettings;
-import org.artifactory.sapi.common.ImportSettings;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Nullable;
-import java.io.Reader;
-import java.util.List;
-import java.util.Map;
-
- at Component
-public class PluginsAddonDefaultImpl implements PluginsAddon {
-
-    @Override
-    public <C> void execPluginActions(Class<? extends PluginAction> type, C context, Object... args) {
-        //Nothing to do in the default impl
-    }
-
-    @Override
-    public ResponseCtx execute(String executionName, String method, Map params, ResourceStreamHandle body,
-            boolean async) {
-        throw new UnsupportedOperationException("Executing plugin actions requires Artifactory Pro.");
-    }
-
-    @Override
-    public BuildStagingStrategy getStagingStrategy(String strategyName, String buildName, Map params) {
-        throw new UnsupportedOperationException("Build staging strategy actions require Artifactory Pro.");
-    }
-
-    @Override
-    public Map<String, List<PluginInfo>> getPluginInfo(@Nullable String pluginType) {
-        return Maps.newHashMap();
-    }
-
-    @Override
-    public ResponseCtx promote(String promotionName, String buildName, String buildNumber, Map params) {
-        throw new UnsupportedOperationException("Build promotion actions require Artifactory Pro.");
-    }
-
-    @Override
-    public ResponseCtx deployPlugin(Reader pluginContent, String scriptName) {
-        throw new UnsupportedOperationException("Deploying User Plugins require Artifactory Pro.");
-    }
-
-    @Override
-    public ResponseCtx reloadPlugins() {
-        throw new UnsupportedOperationException("Reloading User Plugins require Artifactory Pro.");
-    }
-
-    @Override
-    public void executeAdditiveRealmPlugins(Request servletRequest) {
-
-    }
-
-    @Override
-    public Map<String, String> getPluginsStatus() {
-        return Maps.newHashMap();
-    }
-
-    @Override
-    public String getPluginsInfoSupportBundleDump() {
-        return StringUtils.EMPTY;
-    }
-
-    @Override
-    public boolean isDefault() {
-        return true;
-    }
-
-    @Override
-    public void exportTo(ExportSettings settings) {
-
-    }
-
-    @Override
-    public void importFrom(ImportSettings settings) {
-
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/build/AfterBuildSaveAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/build/AfterBuildSaveAction.java
deleted file mode 100644
index 4e43b5e..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/build/AfterBuildSaveAction.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.build;
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.build.DetailedBuildRun;
-
-/**
- * @author Noam Y. Tenne
- */
-public interface AfterBuildSaveAction extends PluginAction {
-    void afterSave(DetailedBuildRun buildRun);
-}
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/build/BeforeBuildSaveAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/build/BeforeBuildSaveAction.java
deleted file mode 100644
index 73b22e1..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/build/BeforeBuildSaveAction.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.build;
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.build.DetailedBuildRun;
-
-/**
- * @author Noam Y. Tenne
- */
-public interface BeforeBuildSaveAction extends PluginAction {
-    void beforeSave(DetailedBuildRun buildRun);
-}
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/download/AfterDownloadAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/download/AfterDownloadAction.java
deleted file mode 100644
index 65d1495..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/download/AfterDownloadAction.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2015 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.download;
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.request.Request;
-
-/**
- * @author Noam Y. Tenne
- */
-public interface AfterDownloadAction extends PluginAction {
-    void afterDownload(Request request, ArtifactoryResponse response);
-}
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/download/AfterDownloadErrorAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/download/AfterDownloadErrorAction.java
deleted file mode 100644
index 37f18d2..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/download/AfterDownloadErrorAction.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.download;
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.request.Request;
-
-/**
- * @author Noam Y. Tenne
- */
-public interface AfterDownloadErrorAction extends PluginAction {
-    void afterDownloadError(Request request);
-}
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/download/AfterRemoteDownloadAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/download/AfterRemoteDownloadAction.java
deleted file mode 100644
index ca40646..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/download/AfterRemoteDownloadAction.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.download;
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.request.Request;
-
-/**
- * @author Yoav Landman
- */
-public interface AfterRemoteDownloadAction extends PluginAction {
-    void afterRemoteDownload(Request request, RepoPath repoPath);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/download/AltRemoteContentAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/download/AltRemoteContentAction.java
deleted file mode 100644
index e5fcabb..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/download/AltRemoteContentAction.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.download;
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author Yoav Landman
- */
-public interface AltRemoteContentAction extends PluginAction {
-    void altRemoteContent(RepoPath repoPath);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/download/AltRemotePathAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/download/AltRemotePathAction.java
deleted file mode 100644
index d70f354..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/download/AltRemotePathAction.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.download;
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author Yoav Landman
- */
-public interface AltRemotePathAction extends PluginAction {
-    void altRemotePath(RepoPath originalRepoPath);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/download/AltResponseAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/download/AltResponseAction.java
deleted file mode 100644
index ba61346..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/download/AltResponseAction.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.download;
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.request.Request;
-
-/**
- * @author Yoav Landman
- */
-public interface AltResponseAction extends PluginAction {
-    void altResponse(Request request, RepoPath responseRepoPath);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/download/BeforeDownloadAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/download/BeforeDownloadAction.java
deleted file mode 100644
index e91c2dd..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/download/BeforeDownloadAction.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.download;
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.request.Request;
-
-/**
- * @author Noam Y. Tenne
- */
-public interface BeforeDownloadAction extends PluginAction {
-    void beforeDownload(Request request, RepoPath responseRepoPath);
-}
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/download/BeforeDownloadRequestAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/download/BeforeDownloadRequestAction.java
deleted file mode 100644
index ecf6f73..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/download/BeforeDownloadRequestAction.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.artifactory.addon.plugin.download;
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.request.Request;
-
-/**
- * Intercept any before download request (from any repo), the user is given a {@link DownloadCtx} to set
- * custom properties on it to be used as part of the download action.
- *
- * @author Shay Yaakov
- * @see DownloadCtx
- */
-public interface BeforeDownloadRequestAction extends PluginAction {
-    void beforeDownloadRequest(Request request, RepoPath repoPath);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/download/BeforeRemoteDownloadAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/download/BeforeRemoteDownloadAction.java
deleted file mode 100644
index 62a7971..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/download/BeforeRemoteDownloadAction.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.download;
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.request.Request;
-
-/**
- * @author Yoav Landman
- */
-public interface BeforeRemoteDownloadAction extends PluginAction {
-    void beforeRemoteDownload(Request request, RepoPath repoPath);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/download/DownloadCtx.java b/backend/core/src/main/java/org/artifactory/addon/plugin/download/DownloadCtx.java
deleted file mode 100644
index 319ad9e..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/download/DownloadCtx.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.addon.plugin.download;
-
-import org.artifactory.repo.RepoPath;
-
-/**
- * Download context filled up by a {@link BeforeDownloadRequestAction} plugin extension
- *
- * @author Shay Yaakov
- */
-public class DownloadCtx {
-
-    private boolean expired;
-
-    private RepoPath modifiedRepoPath;
-
-    /**
-     * @return true if the resource being downloaded is marked as an expired resource,
-     * see {@link #setExpired(boolean)} for full details about expired resources.
-     */
-    public boolean isExpired() {
-        return expired;
-    }
-
-    /**
-     * Whether the resource being downloaded is marked as expired by a user plugin.
-     * When true, the cache expiry mechanism will treat this resource as expired regardless of it's last updated time.
-     * This should be treated with caution, as it means both another database hit (for updating the last updated time)
-     * as well as network overhead since if the resource is expired, a remote download will occur to re-download it to the cache.
-     *
-     * @param expired True if the resource being downloaded should be treated as expired
-     */
-    public void setExpired(boolean expired) {
-        this.expired = expired;
-    }
-
-    /**
-     * The modified repo path provided by the user plugin for a given query
-     * @return a modified repo path used inside Artifactory to answer the given request
-     */
-    public RepoPath getModifiedRepoPath() {
-        return modifiedRepoPath;
-    }
-
-    /**
-     * Override the actual repo path used inside the Artifactory download process to answer the given download request.
-     * @param modifiedRepoPath The new repo path to use
-     */
-    public void setModifiedRepoPath(RepoPath modifiedRepoPath) {
-        this.modifiedRepoPath = modifiedRepoPath;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/download/PathCtx.java b/backend/core/src/main/java/org/artifactory/addon/plugin/download/PathCtx.java
deleted file mode 100644
index d10c594..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/download/PathCtx.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.download;
-
-public class PathCtx {
-
-    private String path;
-
-    public PathCtx(String path) {
-        this.path = path;
-    }
-
-    public String getPath() {
-        return path;
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/execution/ExecuteAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/execution/ExecuteAction.java
deleted file mode 100644
index 0ddd696..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/execution/ExecuteAction.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.execution;
-
-import com.google.common.collect.SetMultimap;
-import org.artifactory.addon.plugin.PluginAction;
-
-/**
- * @author Yoav Landman
- */
-public interface ExecuteAction extends PluginAction {
-    void execute(SetMultimap<String, String> params);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/replication/BeforeDeleteReplicationAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/replication/BeforeDeleteReplicationAction.java
deleted file mode 100644
index d20b138..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/replication/BeforeDeleteReplicationAction.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.replication;
-
-/**
- * @author Yoav Landman
- */
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.repo.RepoPath;
-
-public interface BeforeDeleteReplicationAction extends PluginAction {
-    void beforeDeleteReplication(RepoPath localRepoPath);
-}
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/replication/BeforeDirectoryReplicationAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/replication/BeforeDirectoryReplicationAction.java
deleted file mode 100644
index da8fcad..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/replication/BeforeDirectoryReplicationAction.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.replication;
-
-/**
- * @author Yoav Landman
- */
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.repo.RepoPath;
-
-public interface BeforeDirectoryReplicationAction extends PluginAction {
-    void beforeDirectoryReplication(RepoPath localRepoPath);
-}
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/replication/BeforeFileReplicationAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/replication/BeforeFileReplicationAction.java
deleted file mode 100644
index a4cf120..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/replication/BeforeFileReplicationAction.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.replication;
-
-/**
- * @author Yoav Landman
- */
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.repo.RepoPath;
-
-public interface BeforeFileReplicationAction extends PluginAction {
-    void beforeFileReplication(RepoPath localRepoPath);
-}
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/replication/BeforePropertyReplicationAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/replication/BeforePropertyReplicationAction.java
deleted file mode 100644
index cd44ce3..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/replication/BeforePropertyReplicationAction.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.replication;
-
-/**
- * @author Yoav Landman
- */
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.repo.RepoPath;
-
-public interface BeforePropertyReplicationAction extends PluginAction {
-    void beforePropertyReplication(RepoPath localRepoPath);
-}
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/replication/ReplicationCtx.java b/backend/core/src/main/java/org/artifactory/addon/plugin/replication/ReplicationCtx.java
deleted file mode 100644
index cf80ff3..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/replication/ReplicationCtx.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.replication;
-
-/**
- * @author Yoav Landman
- */
-public class ReplicationCtx {
-
-    private boolean skip;
-
-    public boolean isSkip() {
-        return skip;
-    }
-
-    public void setSkip(boolean skip) {
-        this.skip = skip;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/storage/AfterCopyAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/storage/AfterCopyAction.java
deleted file mode 100644
index 3dd1700..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/storage/AfterCopyAction.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.storage;
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author Yoav Landman
- */
-public interface AfterCopyAction extends PluginAction {
-    void afterCopy(ItemInfo source, RepoPath targetRepoPath, Properties properties);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/storage/AfterCreateAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/storage/AfterCreateAction.java
deleted file mode 100644
index de3cd0d..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/storage/AfterCreateAction.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.storage;
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.fs.ItemInfo;
-
-/**
- * @author Yoav Landman
- */
-public interface AfterCreateAction extends PluginAction {
-    void afterCreate(ItemInfo item);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/storage/AfterDeleteAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/storage/AfterDeleteAction.java
deleted file mode 100644
index f381823..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/storage/AfterDeleteAction.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.storage;
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.fs.ItemInfo;
-
-/**
- * @author Yoav Landman
- */
-public interface AfterDeleteAction extends PluginAction {
-    void afterDelete(ItemInfo item);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/storage/AfterMoveAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/storage/AfterMoveAction.java
deleted file mode 100644
index ba14a63..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/storage/AfterMoveAction.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.storage;
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author Yoav Landman
- */
-public interface AfterMoveAction extends PluginAction {
-    void afterMove(ItemInfo source, RepoPath targetRepoPath, Properties properties);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/storage/AfterPropertyCreateAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/storage/AfterPropertyCreateAction.java
deleted file mode 100644
index bc4dbd1..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/storage/AfterPropertyCreateAction.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.storage;
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.fs.ItemInfo;
-
-/**
- * @author Yoav Landman
- */
-public interface AfterPropertyCreateAction extends PluginAction {
-    void afterCreate(ItemInfo item, String name, String... values);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/storage/AfterPropertyDeleteAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/storage/AfterPropertyDeleteAction.java
deleted file mode 100644
index 7ea55e8..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/storage/AfterPropertyDeleteAction.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.storage;
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.fs.ItemInfo;
-
-/**
- * @author Yoav Landman
- */
-public interface AfterPropertyDeleteAction extends PluginAction {
-    void afterDelete(ItemInfo item, String name);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/storage/BeforeCopyAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/storage/BeforeCopyAction.java
deleted file mode 100644
index 8f2dbad..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/storage/BeforeCopyAction.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.storage;
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author Yoav Landman
- */
-public interface BeforeCopyAction extends PluginAction {
-    void beforeCopy(ItemInfo source, RepoPath targetRepoPath, Properties properties);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/storage/BeforeCreateAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/storage/BeforeCreateAction.java
deleted file mode 100644
index e8d9b11..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/storage/BeforeCreateAction.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.storage;
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.fs.ItemInfo;
-
-/**
- * @author Yoav Landman
- */
-public interface BeforeCreateAction extends PluginAction {
-    void beforeCreate(ItemInfo item);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/storage/BeforeDeleteAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/storage/BeforeDeleteAction.java
deleted file mode 100644
index f742a3c..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/storage/BeforeDeleteAction.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.storage;
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.fs.ItemInfo;
-
-/**
- * @author Yoav Landman
- */
-public interface BeforeDeleteAction extends PluginAction {
-    void beforeDelete(ItemInfo item);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/storage/BeforeMoveAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/storage/BeforeMoveAction.java
deleted file mode 100644
index d55e526..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/storage/BeforeMoveAction.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.storage;
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author Yoav Landman
- */
-public interface BeforeMoveAction extends PluginAction {
-    void beforeMove(ItemInfo source, RepoPath targetRepoPath, Properties properties);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/storage/BeforePropertyCreateAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/storage/BeforePropertyCreateAction.java
deleted file mode 100644
index 6e7438d..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/storage/BeforePropertyCreateAction.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.storage;
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.fs.ItemInfo;
-
-/**
- * @author Yoav Landman
- */
-public interface BeforePropertyCreateAction extends PluginAction {
-    void beforeCreate(ItemInfo item, String name, String... values);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/addon/plugin/storage/BeforePropertyDeleteAction.java b/backend/core/src/main/java/org/artifactory/addon/plugin/storage/BeforePropertyDeleteAction.java
deleted file mode 100644
index d44f8c6..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/plugin/storage/BeforePropertyDeleteAction.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin.storage;
-
-import org.artifactory.addon.plugin.PluginAction;
-import org.artifactory.fs.ItemInfo;
-
-/**
- * @author Yoav Landman
- */
-public interface BeforePropertyDeleteAction extends PluginAction {
-    void beforeDelete(ItemInfo item, String name);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/addon/security/ArtifactoryAuthenticationProviderBase.java b/backend/core/src/main/java/org/artifactory/addon/security/ArtifactoryAuthenticationProviderBase.java
deleted file mode 100644
index 3fee1a7..0000000
--- a/backend/core/src/main/java/org/artifactory/addon/security/ArtifactoryAuthenticationProviderBase.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.security;
-
-import org.artifactory.api.security.UserInfoBuilder;
-import org.artifactory.security.RealmAwareAuthenticationProvider;
-import org.artifactory.security.SimpleUser;
-import org.artifactory.security.UserInfo;
-import org.artifactory.storage.security.service.UserGroupStoreService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.authentication.AuthenticationServiceException;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.AuthenticationException;
-
-import java.util.Set;
-
-/**
- * Base class for custom authentication provider just for creating local users for newly authenticated users.
- *
- * @author Fred Simon
- */
-public abstract class ArtifactoryAuthenticationProviderBase implements RealmAwareAuthenticationProvider {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryAuthenticationProviderBase.class);
-
-    @Autowired
-    private UserGroupStoreService userGroupStore;
-
-    @Override
-    public boolean supports(Class authentication) {
-        return (UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication));
-    }
-
-    protected abstract String getProviderName();
-
-    @Override
-    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
-        String userName = authentication.getName();
-        log.debug("Trying to authenticate user '{}' via {}", userName, getProviderName());
-        try {
-            authentication = doInternalAuthenticate(authentication);
-        } catch (AuthenticationException e) {
-            log.debug("Failed to authenticate user {} via {}: {}",
-                    userName, getProviderName(), e.getMessage());
-            throw e;
-        } catch (Exception e) {
-            String message = "Unexpected exception in " + getProviderName() + " authentication:";
-            log.error(message, e);
-            throw new AuthenticationServiceException(message, e);
-        }
-        if (!authentication.isAuthenticated()) {
-            return authentication;
-        }
-
-        // user authenticated via ldap
-        log.debug("'{}' authenticated successfully by {}.", userName, getProviderName());
-
-        SimpleUser user = findOrCreateUser(userName);
-
-        // create new authentication response containing the user and it's authorities
-        UsernamePasswordAuthenticationToken simpleUserAuthentication =
-                new UsernamePasswordAuthenticationToken(user, authentication.getCredentials(), user.getAuthorities());
-        return simpleUserAuthentication;
-    }
-
-    protected abstract Authentication doInternalAuthenticate(Authentication authentication);
-
-    /**
-     * Find or create a default user and save to the database. This method is called when a user successfully
-     * authenticated via LDAP. If the user doesn't exist in the internal user database it will create it.
-     *
-     * @param userName The user name to find or create
-     * @return A new or found SimpleUser (never null)
-     */
-    protected SimpleUser findOrCreateUser(String userName) {
-        UserInfo userInfo = userGroupStore.findUser(userName);
-        if (userInfo == null) {
-            log.debug(String.format("Creating new user '%s' for %s...", userName, getProviderName()));
-            // Creates a new user with invalid password, and user permissions.
-            // The created user cannot update its profile.
-            UserInfoBuilder builder = new UserInfoBuilder(userName);
-            Set<String> defaultGroups = userGroupStore.getNewUserDefaultGroupsNames();
-            userInfo = builder.internalGroups(defaultGroups).build();
-            userGroupStore.createUser(userInfo);
-        }
-        return new SimpleUser(userInfo);
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/backup/BackupJob.java b/backend/core/src/main/java/org/artifactory/backup/BackupJob.java
deleted file mode 100644
index 9f29eb4..0000000
--- a/backend/core/src/main/java/org/artifactory/backup/BackupJob.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.backup;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.descriptor.backup.BackupDescriptor;
-import org.artifactory.maven.index.MavenIndexerJob;
-import org.artifactory.repo.service.ImportJob;
-import org.artifactory.schedule.JobCommand;
-import org.artifactory.schedule.StopCommand;
-import org.artifactory.schedule.StopStrategy;
-import org.artifactory.schedule.TaskUser;
-import org.artifactory.schedule.quartz.QuartzCommand;
-import org.artifactory.spring.InternalArtifactoryContext;
-import org.artifactory.spring.InternalContextHelper;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * @author Yoav Landman
- */
- at JobCommand(schedulerUser = TaskUser.SYSTEM, manualUser = TaskUser.CURRENT,
-        keyAttributes = {BackupJob.BACKUP_KEY},
-        commandsToStop = {
-                @StopCommand(command = MavenIndexerJob.class, strategy = StopStrategy.PAUSE),
-                @StopCommand(command = ImportJob.class, strategy = StopStrategy.IMPOSSIBLE)})
-public class BackupJob extends QuartzCommand {
-
-    private static final Logger log = LoggerFactory.getLogger(BackupJob.class);
-    public static final String BACKUP_KEY = "backupKey";
-    public static final String MANUAL_BACKUP = "manualBackup";
-
-    @Override
-    protected void onExecute(JobExecutionContext jobContext) throws JobExecutionException {
-        InternalArtifactoryContext context = InternalContextHelper.get();
-        if (!context.isReady()) {
-            log.debug("Skipping execution of '{}', sever is not ready yet", BackupJob.class.getName());
-            return;
-        }
-
-        Object manualBackupDescriptor = jobContext.getJobDetail().getJobDataMap().get(MANUAL_BACKUP);
-        String backupKey = jobContext.getJobDetail().getJobDataMap().getString(BACKUP_KEY);
-        BasicStatusHolder jobStatus = new BasicStatusHolder();
-        if (manualBackupDescriptor instanceof BackupDescriptor) {
-            runBackup(context, getBackupService(), jobStatus, ((BackupDescriptor) manualBackupDescriptor));
-        } else {
-            runAutomaticBackup(context, jobStatus, backupKey);
-        }
-
-        //If backup was successful continue with old backups cleanup
-        if (!jobStatus.hasErrors() && StringUtils.isNotBlank(backupKey)) {
-            getBackupService().cleanupOldBackups(jobContext.getFireTime(), backupKey);
-        }
-    }
-
-    private void runAutomaticBackup(InternalArtifactoryContext context,
-            BasicStatusHolder jobStatus, String backupKey) {
-        InternalBackupService backupService = getBackupService();
-        BackupDescriptor backup = backupService.getBackup(backupKey);
-        if (backup == null) {
-            jobStatus.error("Backup: '" + backupKey + "' not found or disabled. Backup was not performed.", log);
-        } else {
-            runBackup(context, backupService, jobStatus, backup);
-        }
-        //If backup failed, warn and do not clean up
-        boolean backupKeyNotBlank = StringUtils.isNotBlank(backupKey);
-        if (jobStatus.hasErrors()) {
-            jobStatus.warn("Backup completed with some errors (see the log messages above for details). " +
-                    "Old backups will not be auto-removed.", log);
-
-            if (backupKeyNotBlank) {
-                BackupDescriptor backupDescriptor = backupService.getBackup(backupKey);
-                if (backupDescriptor != null && backupDescriptor.isEnabled() && backupDescriptor.isSendMailOnError()) {
-                    try {
-                        backupService.sendBackupErrorNotification(backupDescriptor.getKey(), jobStatus);
-                    } catch (Exception e) {
-                        jobStatus.error("An error occurred while sending backup error notification", e, log);
-                    }
-                }
-            }
-        }
-    }
-
-    private InternalBackupService getBackupService() {
-        return InternalContextHelper.get().beanForType(InternalBackupService.class);
-    }
-
-    private void runBackup(InternalArtifactoryContext context, InternalBackupService backupService,
-            BasicStatusHolder jobStatus, BackupDescriptor backup) {
-        try {
-            BasicStatusHolder backupStatus = backupService.backupSystem(context, backup);
-            jobStatus.merge(backupStatus);
-        } catch (Exception e) {
-            jobStatus.error("An error occurred while performing a backup", e, log);
-        }
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/backup/BackupServiceImpl.java b/backend/core/src/main/java/org/artifactory/backup/BackupServiceImpl.java
deleted file mode 100644
index 59ac4c5..0000000
--- a/backend/core/src/main/java/org/artifactory/backup/BackupServiceImpl.java
+++ /dev/null
@@ -1,431 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.backup;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.CoreAddons;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.common.ImportExportStatusHolder;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.config.ExportSettingsImpl;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.mail.MailService;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.StatusEntry;
-import org.artifactory.descriptor.backup.BackupDescriptor;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.repo.LocalCacheRepoDescriptor;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RealRepoDescriptor;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.schedule.*;
-import org.artifactory.spring.InternalArtifactoryContext;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.util.CollectionUtils;
-import org.artifactory.util.EmailException;
-import org.artifactory.version.CompoundVersionDetails;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.text.MessageFormat;
-import java.util.*;
-import java.util.function.Predicate;
-
-/**
- * @author Yoav Landman
- */
- at Service
- at Reloadable(beanClass = InternalBackupService.class, initAfter = {InternalRepositoryService.class, TaskService.class})
-public class BackupServiceImpl implements InternalBackupService {
-    private static final Logger log = LoggerFactory.getLogger(BackupServiceImpl.class);
-
-    @Autowired
-    private CentralConfigService centralConfig;
-
-    @Autowired
-    private InternalRepositoryService repositoryService;
-
-    @Autowired
-    private MailService mailService;
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Override
-    public void init() {
-        reload(null);
-    }
-
-    @Override
-    public void reload(@Nullable CentralConfigDescriptor oldDescriptor) {
-        List<BackupDescriptor> backupDescriptors = centralConfig.getDescriptor().getBackups();
-        BackupDescriptorHandler backupDescriptorHandler = new BackupDescriptorHandler(backupDescriptors,
-                (oldDescriptor != null) ? oldDescriptor.getBackups() : null);
-        backupDescriptorHandler.reschedule();
-    }
-
-    static class BackupDescriptorHandler extends BaseTaskServiceDescriptorHandler<BackupDescriptor> {
-        final List<BackupDescriptor> newBackupDescriptors;
-        final List<BackupDescriptor> oldBackupDescriptors;
-
-        @Override
-        public String jobName() {
-            return "Backup";
-        }
-
-        BackupDescriptorHandler(List<BackupDescriptor> newBackupDescriptors,
-                List<BackupDescriptor> oldBackupDescriptors) {
-            this.newBackupDescriptors = newBackupDescriptors;
-            if (oldBackupDescriptors != null) {
-                this.oldBackupDescriptors = oldBackupDescriptors;
-            } else {
-                this.oldBackupDescriptors = Lists.newArrayList();
-            }
-        }
-
-        @Override
-        public List<BackupDescriptor> getNewDescriptors() {
-            return this.newBackupDescriptors;
-        }
-
-        @Override
-        public List<BackupDescriptor> getOldDescriptors() {
-            return this.oldBackupDescriptors;
-        }
-
-        @Override
-        public Predicate<Task> getAllPredicate() {
-            return input -> BackupJob.class.isAssignableFrom(input.getType());
-        }
-
-        @Override
-        public Predicate<Task> getPredicate(@Nonnull final BackupDescriptor descriptor) {
-            return input -> BackupJob.class.isAssignableFrom(input.getType()) &&
-                    descriptor.getKey().equals(input.getAttribute(BackupJob.BACKUP_KEY));
-        }
-
-        @Override
-        public void activate(BackupDescriptor descriptor, boolean manual) {
-            //Schedule the cron'd backup
-            String key = descriptor.getKey();
-            String cronExp = descriptor.getCronExp();
-            if (descriptor.isEnabled()) {
-                if (cronExp == null) {
-                    log.warn("No backup cron expression is configured. Backup " + key + " will be disabled.");
-                    return;
-                }
-                try {
-                    TaskBase task = TaskUtils.createCronTask(BackupJob.class, cronExp,
-                            "Backup - " + key);
-                    task.addAttribute(BackupJob.BACKUP_KEY, key);
-                    InternalContextHelper.get().getBean(TaskService.class).startTask(task, false, manual);
-                    log.debug("Backup '{}' activated with cron expression '{}'.", key, cronExp);
-                } catch (Exception e) {
-                    log.warn("Activation of backup " + key + ":" + descriptor + " failed:" + e.getMessage(), e);
-                }
-            }
-        }
-
-        @Override
-        public BackupDescriptor findOldFromNew(@Nonnull BackupDescriptor newDescriptor) {
-            for (BackupDescriptor oldBackupDescriptor : oldBackupDescriptors) {
-                if (oldBackupDescriptor.getKey().equals(newDescriptor.getKey())) {
-                    return oldBackupDescriptor;
-                }
-            }
-            return null;
-        }
-    }
-
-    @Override
-    public void destroy() {
-        new BackupDescriptorHandler(null, null).unschedule();
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-    }
-
-    @Override
-    public void backupRepos(File backupDir, ExportSettingsImpl exportSettings) {
-        backupRepos(backupDir, Collections.<RealRepoDescriptor>emptyList(), exportSettings);
-    }
-
-    @Override
-    public void backupRepos(File backupDir, List<RealRepoDescriptor> excludeRepositories,
-            ExportSettingsImpl exportSettings) {
-        List<String> backedupRepos = getBackedupRepos(excludeRepositories);
-        ExportSettingsImpl settings = new ExportSettingsImpl(backupDir, exportSettings);
-        settings.setRepositories(backedupRepos);
-        repositoryService.exportTo(settings);
-    }
-
-    @Override
-    public void scheduleImmediateSystemBackup(BackupDescriptor backupDescriptor, BasicStatusHolder statusHolder) {
-        TaskService taskService = InternalContextHelper.get().getTaskService();
-        String backupKey = backupDescriptor.getKey();
-        taskService.checkCanStartManualTask(BackupJob.class, statusHolder, backupKey);
-        if (!statusHolder.isError()) {
-            try {
-                statusHolder.status("Activating manual system backup '" + backupKey + "'", log);
-                TaskBase task = TaskUtils.createManualTask(BackupJob.class, 0L, "Backup - " + backupKey);
-                task.addAttribute(BackupJob.MANUAL_BACKUP, backupDescriptor);
-                task.addAttribute(BackupJob.BACKUP_KEY, backupKey);
-                String taskToken = taskService.startTask(task, true, true);
-                statusHolder.status("Started " + taskToken + " successfully", log);
-            } catch (Exception e) {
-                statusHolder.error("Error scheduling manual system backup '" + backupKey + "'", e, log);
-            }
-        }
-    }
-
-    @Override
-    public BasicStatusHolder backupSystem(InternalArtifactoryContext context, @Nonnull BackupDescriptor backup) {
-        ImportExportStatusHolder status = new ImportExportStatusHolder();
-        if (!backup.isEnabled()) {
-            status.error("Backup: '" + backup.getKey() + "' is disabled. Backup was not performed.", log);
-            return status;
-        }
-        List<RealRepoDescriptor> excludeRepositories = backup.getExcludedRepositories();
-        List<String> backedupRepos = getBackedupRepos(excludeRepositories);
-        File backupDir = getBackupDir(backup);
-        boolean createArchive = backup.isCreateArchive();
-        boolean incremental = backup.isIncremental();
-        boolean excludeBuilds = backup.isExcludeBuilds();
-        if (incremental && createArchive) {
-            status.warn("An incremental backup cannot be archived!\n" +
-                    "Please change the configuration of backup " + backup.getKey() + ".", log);
-            createArchive = false;
-        }
-        ExportSettingsImpl settings = new ExportSettingsImpl(backupDir, status);
-        settings.setRepositories(backedupRepos);
-        settings.setCreateArchive(createArchive);
-        settings.setIncremental(incremental);
-        settings.addCallback(new SystemBackupPauseCallback());
-        settings.setExcludeBuilds(excludeBuilds);
-
-        context.exportTo(settings);
-
-        return status;
-    }
-
-    @Override
-    public void cleanupOldBackups(Date now, String backupKey) {
-        BackupDescriptor descriptor = getBackup(backupKey);
-        if (descriptor == null) {
-            return;
-        }
-        int retentionPeriodHours = descriptor.getRetentionPeriodHours();
-        //No action if retention is 0 (or less)
-        if (retentionPeriodHours <= 0) {
-            return;
-        }
-        File backupDir = getBackupDir(descriptor);
-        File[] children = backupDir.listFiles();
-        if (children == null || CollectionUtils.isNullOrEmpty(children)) {
-            log.debug("No old backup files to remove.");
-            return;
-        }
-
-        //Calculate last valid time
-        Calendar calendar = Calendar.getInstance();
-        calendar.setTime(now);
-        calendar.add(Calendar.HOUR, -retentionPeriodHours);
-        Date validFrom = calendar.getTime();
-        log.debug("Removing backups older than {}.", validFrom);
-        //Delete anything not newer than the last valid time
-        for (File child : children) {
-            if (!FileUtils.isFileNewer(child, validFrom)) {
-                try {
-                    log.debug("Removing old backup file '{}'.", child.getPath());
-                    FileUtils.forceDelete(child);
-                } catch (IOException e) {
-                    log.warn("Failed to remove old backup file or folder '" + child.getPath() + "'.", e);
-                }
-            } else {
-                log.debug("Skipping new backup file '{}'.", child.getPath());
-            }
-        }
-    }
-
-    @Override
-    public File getBackupDir(BackupDescriptor descriptor) {
-        File dir = descriptor.getDir();
-        File backupDir;
-        if (dir == null) {
-            ArtifactoryHome artifactoryHome = ContextHelper.get().getArtifactoryHome();
-            backupDir = new File(artifactoryHome.getHaAwareBackupDir(), descriptor.getKey());
-        } else {
-            backupDir = dir;
-            try {
-                FileUtils.forceMkdir(backupDir);
-            } catch (IOException e) {
-                throw new IllegalArgumentException("Backup directory provided in configuration: '" +
-                        backupDir.getAbsolutePath() + "' cannot be created or is not a directory.");
-            }
-        }
-        return backupDir;
-    }
-
-    @Override
-    public void sendBackupErrorNotification(String backupName, BasicStatusHolder statusHolder) throws Exception {
-        InputStream stream = null;
-        try {
-            //Get message body from properties and substitute variables
-            stream = getClass().getResourceAsStream("/org/artifactory/email/messages/backupError.properties");
-            ResourceBundle resourceBundle = new PropertyResourceBundle(stream);
-            String body = resourceBundle.getString("body");
-            String errorListBlock = getErrorListBlock(statusHolder);
-
-            CoreAddons coreAddons = addonsManager.addonByType(CoreAddons.class);
-            List<String> adminEmails = coreAddons.getUsersForBackupNotifications();
-            if (CollectionUtils.isNullOrEmpty(adminEmails)) {
-                log.warn("Couldn't find admin account with valid email address. " +
-                        "Skipping backup failure email notification");
-            }
-            for (String adminEmail : adminEmails) {
-                if (StringUtils.isNotBlank(adminEmail)) {
-                    log.debug("Sending backup error notification to '{}'.", adminEmail);
-                    StringBuilder artifactoryUrlMessage = new StringBuilder();
-                    String artifactoryUrl = centralConfig.getDescriptor().getServerUrlForEmail();
-                    if (StringUtils.isNotBlank(artifactoryUrl)) {
-                        String artifactoryLink = createArtifactoryLinkFromUrl(artifactoryUrl);
-                        artifactoryUrlMessage.append("Your Artifactory base URL is: ").append(artifactoryLink);
-                    } else {
-                        artifactoryUrlMessage.append("No Artifactory base URL is configured");
-                    }
-                    String message = MessageFormat.format(body, backupName, artifactoryUrlMessage, errorListBlock);
-                    mailService.sendMail(new String[]{adminEmail}, "Backup Error Notification", message);
-                }
-            }
-        } catch (EmailException e) {
-            log.error("Error while notification of: '" + backupName + "' errors.", e);
-            throw e;
-        } finally {
-            IOUtils.closeQuietly(stream);
-        }
-        log.info("Error notification for backup '{}' was sent by mail.", backupName);
-    }
-
-    private String createArtifactoryLinkFromUrl(String artifactoryUrl) {
-        StringBuilder builder = new StringBuilder();
-        builder.append("<a href=").append(artifactoryUrl).append(" target=\"blank\"").append(">")
-                .append(artifactoryUrl).append("<a/>");
-        return builder.toString();
-    }
-
-    private List<String> getBackedupRepos(List<RealRepoDescriptor> excludeRepositories) {
-        List<String> localRepoKeys = new ArrayList<>();
-        List<LocalRepoDescriptor> localRepos = repositoryService.getLocalAndCachedRepoDescriptors();
-        for (LocalRepoDescriptor localRepoDescriptor : localRepos) {
-            localRepoKeys.add(localRepoDescriptor.getKey());
-        }
-        repositoryService.getDistributionRepoDescriptors().forEach(descriptor -> {
-            localRepos.add(descriptor);
-            localRepoKeys.add(descriptor.getKey());
-        });
-
-        if (CollectionUtils.isNullOrEmpty(excludeRepositories)) {
-            return localRepoKeys; // nothing is excluded return all local repositories
-        }
-        List<String> backedupRepos = new ArrayList<>();
-        for (LocalRepoDescriptor repo : localRepos) {
-            //Skip excluded repositories
-            RealRepoDescriptor checkForExclusionRepo;
-            if (repo.isCache()) {
-                checkForExclusionRepo = ((LocalCacheRepoDescriptor) repo).getRemoteRepo();
-            } else {
-                checkForExclusionRepo = repo;
-            }
-            //Skip excluded repositories
-            boolean excluded = false;
-            for (RealRepoDescriptor excludedRepo : excludeRepositories) {
-                if (excludedRepo.getKey().equals(checkForExclusionRepo.getKey())) {
-                    excluded = true;
-                    break;
-                }
-            }
-            if (!excluded) {
-                backedupRepos.add(repo.getKey());
-            }
-        }
-        return backedupRepos;
-    }
-
-    @Override
-    public BackupDescriptor getBackup(String backupKey) {
-        final List<BackupDescriptor> list = centralConfig.getDescriptor().getBackups();
-        for (BackupDescriptor backupDescriptor : list) {
-            if (backupKey.equals(backupDescriptor.getKey())) {
-                return backupDescriptor;
-            }
-        }
-        //This might happen after the first time a backup has been turned off if the scheduler
-        //wakes up before old jobs were cleaned up
-        log.warn("Skipping empty backup config " + backupKey + "!\n" +
-                "Probably a leftover from an old to-be-deleted backup job.");
-        return null;
-    }
-
-    /**
-     * Returns an HTML list block of errors extracted from the status holder
-     *
-     * @param statusHolder Status holder containing errors that should be included in the notification
-     * @return HTML list block
-     */
-    private String getErrorListBlock(BasicStatusHolder statusHolder) {
-        StringBuilder builder = new StringBuilder();
-        List<StatusEntry> errors = statusHolder.getErrors();
-        if (errors.size() > 0) {
-            for (StatusEntry errorEntry : errors) {
-                convertErrorEntryToString(builder, errorEntry);
-            }
-        } else {
-            convertErrorEntryToString(builder, statusHolder.getLastError());
-        }
-        builder.append("<p>");
-        return builder.toString();
-    }
-
-    private void convertErrorEntryToString(StringBuilder builder, StatusEntry errorEntry) {
-        //Make one error per row
-        builder.append(errorEntry.getMessage());
-        Throwable throwable = errorEntry.getException();
-        if (throwable != null) {
-            String throwableMessage = throwable.getMessage();
-            if (StringUtils.isNotBlank(throwableMessage)) {
-                builder.append(": ");
-                builder.append(throwableMessage);
-            }
-        }
-        builder.append("<br>");
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/backup/InternalBackupService.java b/backend/core/src/main/java/org/artifactory/backup/InternalBackupService.java
deleted file mode 100644
index b55b21c..0000000
--- a/backend/core/src/main/java/org/artifactory/backup/InternalBackupService.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.backup;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.repo.Async;
-import org.artifactory.api.repo.BackupService;
-import org.artifactory.descriptor.backup.BackupDescriptor;
-import org.artifactory.spring.InternalArtifactoryContext;
-import org.artifactory.spring.ReloadableBean;
-
-import javax.annotation.Nonnull;
-import java.io.File;
-import java.util.Date;
-
-/**
- * @author freds
- * @date Oct 27, 2008
- */
-public interface InternalBackupService extends ReloadableBean, BackupService {
-    /**
-     * @param context The internal artifactory context
-     * @param backup  Descriptor of backup to run
-     * @return MultiStatusHolder containing messages
-     */
-    BasicStatusHolder backupSystem(InternalArtifactoryContext context, @Nonnull BackupDescriptor backup);
-
-    /**
-     * Iterate (non-recursively) on all folders/files in the backup dir and delete them if they are older than "now"
-     * minus the retention period of the beckup.
-     *
-     * @param now       The base time to use for the cleanup
-     * @param backupKey
-     */
-    void cleanupOldBackups(Date now, String backupKey);
-
-    /**
-     * Sends an email notification to the admins about errors that have occurred during backups
-     *
-     * @param backupName   Name of backup that failed
-     * @param statusHolder Status holder containing errors
-     * @throws Exception
-     */
-    @Async
-    void sendBackupErrorNotification(String backupName, BasicStatusHolder statusHolder) throws Exception;
-
-    BackupDescriptor getBackup(String backupKey);
-
-    File getBackupDir(BackupDescriptor descriptor);
-}
diff --git a/backend/core/src/main/java/org/artifactory/backup/SystemBackupPauseCallback.java b/backend/core/src/main/java/org/artifactory/backup/SystemBackupPauseCallback.java
deleted file mode 100644
index 8fb5f2b..0000000
--- a/backend/core/src/main/java/org/artifactory/backup/SystemBackupPauseCallback.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.backup;
-
-import com.google.common.collect.Sets;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.sapi.common.ExportSettings;
-import org.artifactory.sapi.common.FileExportCallback;
-import org.artifactory.sapi.common.FileExportEvent;
-import org.artifactory.sapi.common.FileExportInfo;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Date;
-import java.util.Set;
-
-/**
- * Should be used for system backups only.<br>
- * Sleeps every certain interval of time if the backup is working for a long time.
- *
- * @author Noam Y. Tenne
- */
-public class SystemBackupPauseCallback implements FileExportCallback {
-    private static final Logger log = LoggerFactory.getLogger(SystemBackupPauseCallback.class);
-
-    private static final long jobTimeThreshold = ConstantValues.gcScanStartSleepingThresholdMillis.getLong();
-    private static final long sleepIterationMillis = ConstantValues.backupFileExportSleepIterationMillis.getLong();
-    private static final long sleepMillis = ConstantValues.backupFileExportSleepMillis.getLong();
-    private boolean jobTimeThresholdReached = false;
-    private long lastPauseTimeMillis = 0;
-
-    public void callback(ExportSettings currentSettings, FileExportInfo info) {
-        if (!jobTimeThresholdReached &&
-                (System.currentTimeMillis() - currentSettings.getTime().getTime() > jobTimeThreshold)) {
-            jobTimeThresholdReached = true;
-            log.debug("Slowing down system backup.");
-        }
-        if (jobTimeThresholdReached && ((lastPauseTimeMillis == 0) ||
-                (System.currentTimeMillis() - lastPauseTimeMillis > sleepIterationMillis))) {
-            lastPauseTimeMillis = System.currentTimeMillis();
-            try {
-                log.trace("Slowing down system backup at: '{}' for '{}' millis.",
-                        new Date(lastPauseTimeMillis).toString(), sleepMillis);
-                Thread.sleep(sleepMillis);
-            } catch (InterruptedException e) {
-                log.warn("Scheduled system backup pause callback was interrupted: " + e.getMessage());
-            }
-        }
-    }
-
-    @Override
-    public void cleanup() {
-    }
-
-    @Override
-    public Set<FileExportEvent> triggeringEvents() {
-        return Sets.newHashSet(FileExportEvent.BEFORE_FILE_EXPORT);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/bintray/BintrayServiceImpl.java b/backend/core/src/main/java/org/artifactory/bintray/BintrayServiceImpl.java
deleted file mode 100644
index 338ea65..0000000
--- a/backend/core/src/main/java/org/artifactory/bintray/BintrayServiceImpl.java
+++ /dev/null
@@ -1,1490 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.bintray;
-
-import com.google.common.cache.CacheBuilder;
-import com.google.common.collect.HashMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Multimap;
-import com.jfrog.bintray.client.api.BintrayCallException;
-import com.jfrog.bintray.client.api.MultipleBintrayCallException;
-import com.jfrog.bintray.client.api.details.PackageDetails;
-import com.jfrog.bintray.client.api.details.RepositoryDetails;
-import com.jfrog.bintray.client.api.details.VersionDetails;
-import com.jfrog.bintray.client.api.handle.*;
-import com.jfrog.bintray.client.impl.BintrayClient;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.io.input.AutoCloseInputStream;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpHeaders;
-import org.apache.http.HttpStatus;
-import org.apache.http.auth.UsernamePasswordCredentials;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPut;
-import org.apache.http.client.methods.HttpRequestBase;
-import org.apache.http.client.utils.URIBuilder;
-import org.apache.http.entity.InputStreamEntity;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.api.bintray.*;
-import org.artifactory.api.bintray.exception.BintrayException;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.jackson.JacksonReader;
-import org.artifactory.api.mail.MailService;
-import org.artifactory.api.search.BintrayItemSearchResults;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.aql.AqlService;
-import org.artifactory.aql.api.domain.sensitive.AqlApiItem;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.model.AqlComparatorEnum;
-import org.artifactory.aql.result.AqlEagerResult;
-import org.artifactory.aql.result.rows.AqlItem;
-import org.artifactory.aql.util.AqlSearchablePath;
-import org.artifactory.aql.util.AqlUtils;
-import org.artifactory.bintray.distribution.util.DistributionUtils;
-import org.artifactory.build.InternalBuildService;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.common.StatusEntry;
-import org.artifactory.descriptor.bintray.BintrayConfigDescriptor;
-import org.artifactory.descriptor.repo.LocalCacheRepoDescriptor;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.md.PropertiesFactory;
-import org.artifactory.repo.DistributionRepo;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.resource.ResourceStreamHandle;
-import org.artifactory.sapi.search.VfsQueryResult;
-import org.artifactory.sapi.search.VfsQueryRow;
-import org.artifactory.sapi.search.VfsQueryService;
-import org.artifactory.security.UserInfo;
-import org.artifactory.storage.binstore.service.BinaryService;
-import org.artifactory.util.*;
-import org.artifactory.util.distribution.DistributionConstants;
-import org.codehaus.jackson.JsonFactory;
-import org.codehaus.jackson.JsonNode;
-import org.codehaus.jackson.map.DeserializationConfig;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.type.TypeReference;
-import org.jfrog.build.api.Build;
-import org.jfrog.build.api.release.BintrayUploadInfoOverride;
-import org.joda.time.format.ISODateTimeFormat;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.text.MessageFormat;
-import java.text.SimpleDateFormat;
-import java.util.*;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-
-import static com.google.common.collect.Lists.newArrayList;
-import static org.apache.http.HttpStatus.SC_BAD_REQUEST;
-import static org.apache.http.HttpStatus.SC_NOT_FOUND;
-import static org.artifactory.aql.api.internal.AqlBase.and;
-
-/**
- * @author Shay Yaakov
- */
- at Service
-public class BintrayServiceImpl implements BintrayService {
-    private static final Logger log = LoggerFactory.getLogger(BintrayServiceImpl.class);
-    private static final String RANGE_LIMIT_TOTAL = "X-RangeLimit-Total";
-    @Autowired
-    protected CentralConfigService centralConfig;
-    @Autowired
-    private UserGroupService userGroupService;
-    @Autowired
-    private AuthorizationService authorizationService;
-    @Autowired
-    private InternalRepositoryService repoService;
-    @Autowired
-    private BinaryService binaryService;
-    @Autowired
-    private InternalBuildService buildService;
-    @Autowired
-    private MailService mailService;
-    @Autowired
-    private AddonsManager addonsManager;
-    @Autowired
-    private VfsQueryService vfsQueryService;
-    @Autowired
-    private AqlService aqlService;
-
-    /**
-     * Bintray Rest API request Cache
-     */
-    private Map<String, BintrayPackageInfo> bintrayPackageCache;
-
-    public BintrayServiceImpl() {
-        bintrayPackageCache = initCache(500, TimeUnit.HOURS.toSeconds(1), false);
-    }
-
-    @Override
-    public BasicStatusHolder pushArtifact(ItemInfo itemInfo, BintrayParams bintrayParams,
-            @Nullable Map<String, String> headersMap) throws IOException {
-        BasicStatusHolder status = new BasicStatusHolder();
-
-        try (CloseableHttpClient client = createHTTPClient(getCurrentUserBintrayCreds())) {
-            if (itemInfo.isFolder()) {
-                List<ItemInfo> children = repoService.getChildrenDeeply(itemInfo.getRepoPath());
-                for (ItemInfo child : children) {
-                    if (!child.isFolder()) {
-                        performPush(client, (FileInfo) itemInfo, bintrayParams, status, headersMap);
-                    }
-                }
-            } else {
-                performPush(client, (FileInfo) itemInfo, bintrayParams, status, headersMap);
-            }
-        }
-
-        return status;
-    }
-
-    @Override
-    public BasicStatusHolder pushBuild(Build build, BintrayParams bintrayParams,
-            @Nullable Map<String, String> headersMap) throws IOException {
-        BasicStatusHolder status = new BasicStatusHolder();
-        String buildNameAndNumber = build.getName() + ":" + build.getNumber();
-        status.status("Starting pushing build '" + buildNameAndNumber + "' to Bintray.", log);
-        List<FileInfo> artifactsToPush = buildService.collectBuildArtifacts(build, null, null, null);
-        try (CloseableHttpClient client = createHTTPClient(getCurrentUserBintrayCreds())) {
-            status.status("Found " + artifactsToPush.size() + " artifacts to push.", log);
-            for (FileInfo fileInfo : artifactsToPush) {
-                bintrayParams.setPath(fileInfo.getRelPath());
-                if (bintrayParams.isUseExistingProps()) {
-                    BintrayParams paramsFromProperties = createParamsFromProperties(fileInfo.getRepoPath());
-                    bintrayParams.setRepo(paramsFromProperties.getRepo());
-                    bintrayParams.setPackageId(paramsFromProperties.getPackageId());
-                    bintrayParams.setVersion(paramsFromProperties.getVersion());
-                    bintrayParams.setPath(paramsFromProperties.getPath());
-                }
-                try {
-                    performPush(client, fileInfo, bintrayParams, status, headersMap);
-                } catch (IOException e) {
-                    sendBuildPushNotification(status, buildNameAndNumber);
-                    throw e;
-                }
-            }
-        }
-
-        String message = String.format("Finished pushing build '%s' to Bintray with %s errors and %s warnings.",
-                buildNameAndNumber, status.getErrors().size(), status.getWarnings().size());
-        status.status(message, log);
-
-        if (bintrayParams.isNotify()) {
-            sendBuildPushNotification(status, buildNameAndNumber);
-        }
-
-        return status;
-    }
-
-    private <V> Map<String, V> initCache(int initialCapacity, long expirationSeconds, boolean softValues) {
-        CacheBuilder mapMaker = CacheBuilder.newBuilder().initialCapacity(initialCapacity);
-        if (expirationSeconds >= 0) {
-            mapMaker.expireAfterWrite(expirationSeconds, TimeUnit.SECONDS);
-        }
-        if (softValues) {
-            mapMaker.softValues();
-        }
-
-        //noinspection unchecked
-        return mapMaker.build().asMap();
-    }
-
-    @Override
-    public void executeAsyncPushBuild(Build build, BintrayParams bintrayParams,
-            @Nullable Map<String, String> headersMap) {
-        try {
-            pushBuild(build, bintrayParams, headersMap);
-        } catch (IOException e) {
-            log.error("Push failed with exception: " + e.getMessage());
-        }
-    }
-
-    private void sendBuildPushNotification(BasicStatusHolder statusHolder, String buildNameAndNumber)
-            throws IOException {
-        log.info("Sending logs for push build '{}' by mail.", buildNameAndNumber);
-        InputStream stream = null;
-        try {
-            //Get message body from properties and substitute variables
-            stream = getClass().getResourceAsStream("/org/artifactory/email/messages/bintrayPushBuild.properties");
-            ResourceBundle resourceBundle = new PropertyResourceBundle(stream);
-            String body = resourceBundle.getString("body");
-            String logBlock = getLogBlock(statusHolder);
-            UserInfo currentUser = getCurrentUser();
-            if (currentUser != null) {
-                String userEmail = currentUser.getEmail();
-                if (StringUtils.isBlank(userEmail)) {
-                    log.warn("Couldn't find valid email address. Skipping push build to bintray email notification");
-                } else {
-                    log.debug("Sending push build to Bintray notification to '{}'.", userEmail);
-                    String message = MessageFormat.format(body, logBlock);
-                    mailService.sendMail(new String[]{userEmail}, "Push Build to Bintray Report", message);
-                }
-            }
-        } catch (EmailException e) {
-            log.error("Error while notification of: '" + buildNameAndNumber + "' messages.", e);
-            throw e;
-        } finally {
-            IOUtils.closeQuietly(stream);
-        }
-    }
-
-    private UserInfo getCurrentUser() {
-        // currentUser() is not enough since the user might have changed his details from the profile page so the
-        // database has the real details while currentUser() is the authenticated user which was not updated.
-        try {
-            String username = userGroupService.currentUser().getUsername();
-            return userGroupService.findUser(username);
-        } catch (UsernameNotFoundException e) {
-            return null;
-        }
-    }
-
-    /**
-     * Returns an HTML list block of messages extracted from the status holder
-     *
-     * @param statusHolder Status holder containing messages that should be included in the notification
-     * @return HTML list block
-     */
-    private String getLogBlock(BasicStatusHolder statusHolder) {
-        StringBuilder builder = new StringBuilder();
-
-        for (StatusEntry entry : statusHolder.getEntries()) {
-
-            //Make one line per row
-            String message = entry.getMessage();
-            Throwable throwable = entry.getException();
-            if (throwable != null) {
-                String throwableMessage = throwable.getMessage();
-                if (StringUtils.isNotBlank(throwableMessage)) {
-                    message += ": " + throwableMessage;
-                }
-            }
-            builder.append(message).append("<br>");
-        }
-
-        builder.append("<p>");
-
-        return builder.toString();
-    }
-
-    @Nonnull
-    @Override
-    public BintrayParams createParamsFromProperties(RepoPath repoPath) {
-        BintrayParams bintrayParams = new BintrayParams();
-        Properties properties = repoService.getProperties(repoPath);
-        if (properties != null) {
-            bintrayParams.setRepo(properties.getFirst(BINTRAY_REPO));
-            bintrayParams.setPackageId(properties.getFirst(BINTRAY_PACKAGE));
-            bintrayParams.setVersion(properties.getFirst(BINTRAY_VERSION));
-            bintrayParams.setPath(properties.getFirst(BINTRAY_PATH));
-        }
-
-        return bintrayParams;
-    }
-
-    /**
-     * Sets file properties with the bintray details after push is successful
-     */
-    private void createUpdatePropsForPushedArtifacts(List<FileInfo> pushedFiles, BintrayUploadInfo uploadInfo,
-            BasicStatusHolder status) {
-
-        boolean canAnnotateAll = true;
-        log.debug("Setting properties on pushed artifacts");
-        BintrayParams bintrayParams = new BintrayParams();
-        String repo = uploadInfo.getPackageDetails().getRepo();
-        String pkg = uploadInfo.getPackageDetails().getName();
-        String ver = uploadInfo.getVersionDetails().getName();
-        String path = uploadInfo.getPackageDetails().getSubject() + "/" + repo + "/" + pkg + "/" + ver + "/";
-        bintrayParams.setRepo(repo);
-        bintrayParams.setPackageId(pkg);
-        bintrayParams.setVersion(ver);
-        for (FileInfo info : pushedFiles) {
-            bintrayParams.setPath(path + info.getRepoPath().getPath());
-            if (authorizationService.canAnnotate(info.getRepoPath())) {
-                savePropertiesOnRepoPath(info.getRepoPath(), bintrayParams);
-            } else {
-                canAnnotateAll = false;
-            }
-        }
-        if (!canAnnotateAll) {
-            String message = "You do not have annotate permissions on some or all of the published files in " +
-                    "Artifactory. Bintray package and version properties will not be recorded for these files.";
-            status.warn(message, HttpStatus.SC_FORBIDDEN, log);
-        }
-    }
-
-    @Override
-    public void savePropertiesOnRepoPath(RepoPath repoPath, BintrayParams bintrayParams) {
-        Properties properties = repoService.getProperties(repoPath);
-        if (properties == null) {
-            properties = PropertiesFactory.create();
-        }
-        if (StringUtils.isNotBlank(bintrayParams.getRepo())) {
-            properties.replaceValues(BINTRAY_REPO, newArrayList(bintrayParams.getRepo()));
-        }
-        if (StringUtils.isNotBlank(bintrayParams.getPackageId())) {
-            properties.replaceValues(BINTRAY_PACKAGE, newArrayList(bintrayParams.getPackageId()));
-        }
-        if (StringUtils.isNotBlank(bintrayParams.getVersion())) {
-            properties.replaceValues(BINTRAY_VERSION, newArrayList(bintrayParams.getVersion()));
-        }
-        if (StringUtils.isNotBlank(bintrayParams.getPath())) {
-            properties.replaceValues(BINTRAY_PATH, newArrayList(bintrayParams.getPath()));
-        }
-        if (StringUtils.isNotBlank(bintrayParams.getPackageType())) {
-            properties.replaceValues(DistributionConstants.ARTIFACT_TYPE_OVERRIDE_PROP,
-                    newArrayList(bintrayParams.getPackageType()));
-        }
-        properties.replaceValues(BINTRAY_UPLOAD_TIME, newArrayList(Long.toString(System.currentTimeMillis())));
-        repoService.setProperties(repoPath, properties);
-    }
-
-    private void performPush(CloseableHttpClient client, FileInfo fileInfo, BintrayParams bintrayParams,
-            BasicStatusHolder status, @Nullable Map<String, String> headersMap) throws IOException {
-        if (!bintrayParams.isValid()) {
-            String message = String.format("Skipping push for '%s' since one of the Bintray properties is missing.",
-                    fileInfo.getRelPath());
-            status.warn(message, log);
-            return;
-        }
-
-        if (!authorizationService.canAnnotate(fileInfo.getRepoPath())) {
-            String message = "You do not have annotate permissions on the published files in Artifactory. " +
-                    "Bintray package and version properties will not be recorded.";
-            status.warn(message, log);
-        }
-
-        String path = bintrayParams.getPath();
-        status.status("Pushing artifact " + path + " to Bintray.", log);
-        String requestUrl = getBaseBintrayApiUrl() + PATH_CONTENT + "/" + bintrayParams.getRepo() + "/"
-                + bintrayParams.getPackageId() + "/" + bintrayParams.getVersion() + "/" + path;
-
-        CloseableHttpResponse response = null;
-        try {
-            InputStream elementInputStream = binaryService.getBinary(fileInfo.getSha1());
-            HttpEntity requestEntity = new InputStreamEntity(elementInputStream, fileInfo.getSize());
-            HttpPut putMethod = createPutMethod(requestUrl, headersMap, requestEntity);
-            response = client.execute(putMethod);
-            int statusCode = response.getStatusLine().getStatusCode();
-            String message;
-            if (statusCode != HttpStatus.SC_CREATED) {
-                message = String.format("Push failed for '%s' with status: %s %s", path, statusCode,
-                        response.getStatusLine().getReasonPhrase());
-                status.error(message, statusCode, log);
-            } else {
-                message = String.format(
-                        "Successfully pushed '%s' to repo: '%s', package: '%s', version: '%s' in Bintray.",
-                        path, bintrayParams.getRepo(), bintrayParams.getPackageId(), bintrayParams.getVersion());
-                status.status(message, log);
-                if (!bintrayParams.isUseExistingProps()) {
-                    savePropertiesOnRepoPath(fileInfo.getRepoPath(), bintrayParams);
-                }
-            }
-        } finally {
-            IOUtils.closeQuietly(response);
-        }
-    }
-
-    @Override
-    // TODO: [by dan] this is the newer version, based on the bintray-java-client and should replace pushBuild in a later version
-    public BasicStatusHolder pushPromotedBuild(Build build, String gpgPassphrase, Boolean gpgSignOverride,
-            BintrayUploadInfoOverride override) {
-        BasicStatusHolder status = new BasicStatusHolder();
-        if (!validCredentialsExist(status)) {
-            return status;
-        }
-        log.info("Gathering information for build: " + build.getName() + " Number: " + build.getNumber());
-        BintrayUploadInfo uploadInfo = getUplaodInfoForBuild(build, override, status);
-        if (status.hasErrors()) {
-            return status;
-        }
-        //Get artifacts from build and filter out descriptor
-        List<FileInfo> artifactsToPush = buildService.collectBuildArtifacts(build, null, null, status);
-        filterOutJsonFileFromArtifactsToPush(artifactsToPush, null, status);
-
-        //No artifacts in build
-        if (CollectionUtils.isNullOrEmpty(artifactsToPush)) {
-            status.error("No artifacts found to push to Bintray, aborting operation", SC_NOT_FOUND, log);
-            return status;
-        }
-
-        //Filter artifacts by properties (if exist) in descriptor
-        filterBuildArtifactsByDescriptor(uploadInfo, artifactsToPush, status);
-        if (status.hasErrors()) {
-            return status;
-        }
-
-        status.merge(pushVersion(uploadInfo, artifactsToPush, gpgSignOverride, gpgPassphrase));
-        return status;
-    }
-
-    @Override
-    // TODO: [by dan] this is the newer version, based on the bintray-java-client and should replace (or accommodate) pushArtifact in a later version
-    public BasicStatusHolder pushVersionFilesAccordingToSpec(FileInfo jsonFile, Boolean gpgSignOverride,
-            String gpgPassphrase) {
-        BasicStatusHolder status = new BasicStatusHolder();
-
-        if (!validCredentialsExist(status)) {
-            return status;
-        }
-        BintrayUploadInfo uploadInfo = validateUploadInfoFile(jsonFile, status);
-        if (status.hasErrors()) {
-            return status;
-        }
-
-        List<FileInfo> artifactsToPush = collectArtifactsToPushBasedOnDescriptor(jsonFile, uploadInfo, status);
-        if (status.hasErrors()) {
-            return status;
-        }
-
-        status.merge(pushVersion(uploadInfo, artifactsToPush, gpgSignOverride, gpgPassphrase));
-        return status;
-    }
-
-    /**
-     * Pushes all given files as a version in Bintray, if the version \ package don't exist they are created
-     *
-     * @param uploadInfo      Info about the package \ version to push
-     * @param artifactsToPush All artifacts to be pushed under the version
-     * @param gpgSignOverride Indicates if to override the version sign
-     * @param gpgPassphrase   The key that is used with the subject's Bintray-stored gpg key to sign the version
-     * @return StatusHolder containing all push results.
-     */
-    private BasicStatusHolder pushVersion(BintrayUploadInfo uploadInfo, List<FileInfo> artifactsToPush,
-            Boolean gpgSignOverride, String gpgPassphrase) {
-
-        BasicStatusHolder status = new BasicStatusHolder();
-        String subject = uploadInfo.getPackageDetails().getSubject();
-        VersionHandle bintrayVersionHandle;
-
-        try (Bintray client = createBasicAuthBintrayClient()) {
-            validatePushRequestParams(subject, artifactsToPush, status);
-
-            RepositoryHandle bintrayRepoHandle = validateRepoAndCreateIfNeeded(uploadInfo, client, status);
-            PackageHandle bintrayPackageHandle = createOrUpdatePackage(uploadInfo.getPackageDetails(), bintrayRepoHandle, status);
-            bintrayVersionHandle = createOrUpdateVersion(uploadInfo, bintrayPackageHandle, status);
-            pushArtifactsToVersion(uploadInfo, artifactsToPush, status, bintrayVersionHandle);
-            signVersion(bintrayVersionHandle, uploadInfo.getVersionDetails().isGpgSign(), gpgSignOverride,
-                    gpgPassphrase, artifactsToPush.size(), status);
-
-            //Publish comes last so that gpg signed files will get published too
-            if (uploadInfo.isPublish() != null && uploadInfo.isPublish()) {
-                publishFiles(uploadInfo, bintrayVersionHandle, status);
-            }
-        } catch (Exception e) {
-            if (!(e instanceof BintrayCallException) && !(e instanceof MultipleBintrayCallException)) {
-                status.error("Operation failed: " + e.getMessage(), HttpStatus.SC_CONFLICT, e, log);
-            }
-            return status;
-        }
-        createUpdatePropsForPushedArtifacts(artifactsToPush, uploadInfo, status);
-        String end;
-        if (status.hasErrors()) {
-            end = "with errors";
-        } else if (status.hasWarnings()) {
-            end = "with warnings";
-        } else {
-            end = "successfully";
-        }
-        status.status(String.format("Push to bintray completed %s", end), log);
-        return status;
-    }
-
-    private void pushArtifactsToVersion(BintrayUploadInfo uploadInfo, List<FileInfo> artifactsToPush,
-            BasicStatusHolder status, VersionHandle bintrayVersionHandle) throws MultipleBintrayCallException {
-        List<RepoPath> artifactPaths = Lists.newArrayList();
-        Map<String, InputStream> streamMap = Maps.newHashMap();
-        try {
-            for (FileInfo fileInfo : artifactsToPush) {
-                artifactPaths.add(fileInfo.getRepoPath());
-                ResourceStreamHandle handle = repoService.getResourceStreamHandle(fileInfo.getRepoPath());
-                streamMap.put(fileInfo.getRelPath(), new AutoCloseInputStream(handle.getInputStream()));
-            }
-            status.status("Starting to push the requested files to " + String.format("into %s/%s/%s/%s: ",
-                    uploadInfo.getPackageDetails().getSubject(), uploadInfo.getPackageDetails().getRepo(),
-                    uploadInfo.getPackageDetails().getName(), uploadInfo.getVersionDetails().getName()), log);
-
-            log.info("Pushing {} files...", streamMap.keySet().size());
-            log.debug("Pushing the following files into Bintray: {}", Arrays.toString(artifactPaths.toArray()));
-            bintrayVersionHandle.upload(streamMap);
-        } catch (MultipleBintrayCallException mbce) {
-            for (BintrayCallException bce : mbce.getExceptions()) {
-                status.error(bce.toString(), bce.getStatusCode(), log);
-            }
-            throw mbce;
-        } finally {
-            for (InputStream stream : streamMap.values()) {
-                IOUtils.closeQuietly(stream);
-            }
-        }
-    }
-
-    private void validatePushRequestParams(String subject, List<FileInfo> artifactsToPush, BasicStatusHolder status)
-            throws BintrayCallException {
-
-        int fileUploadLimit = getFileUploadLimit();
-        if (fileUploadLimit != 0 && artifactsToPush.size() > fileUploadLimit) { //0 is unlimited
-            status.error(String.format("The amount of artifacts that are about to be pushed(%s) exceeds the maximum" +
-                    " amount set by the administrator(%s), aborting operation", artifactsToPush.size(), fileUploadLimit)
-                    , SC_BAD_REQUEST, log);
-            throw new BintrayCallException(SC_BAD_REQUEST, status.getLastError().getMessage(), "");
-        }
-
-        //Subject must be specified in json
-        if (StringUtils.isBlank(subject)) {
-            status.error("Bintray subject must be defined in the spec or given as an override param - aborting",
-                    SC_BAD_REQUEST, log);
-            throw new BintrayCallException(SC_BAD_REQUEST, status.getLastError().getMessage(), "");
-        }
-    }
-
-    private void publishFiles(BintrayUploadInfo uploadInfo, VersionHandle bintrayVersionHandle, BasicStatusHolder status) {
-        if (uploadInfo.isPublish() != null && uploadInfo.isPublish()) {
-            log.info("Publishing files...");
-            try {
-                bintrayVersionHandle.publish();
-            } catch (BintrayCallException bce) {
-                status.error(bce.toString(), bce.getStatusCode(), log);
-            }
-        }
-    }
-
-    private RepositoryHandle validateRepoAndCreateIfNeeded(BintrayUploadInfo uploadInfo, Bintray client,
-            BasicStatusHolder status) throws Exception {
-
-        String subjectName = uploadInfo.getPackageDetails().getSubject();
-        String bintrayRepo = uploadInfo.getPackageDetails().getRepo();
-        SubjectHandle subject = client.subject(subjectName);
-        //No 'repo' clause --> return RepositoryHandle matching the 'repo' field in the 'package' clause
-        if (!hasRepoClause(uploadInfo)) {
-            RepositoryHandle bintrayRepoHandle = subject.repository(bintrayRepo);
-            if (!DistributionUtils.bintrayRepoExists(bintrayRepoHandle, status)) {
-                //Doesn't matter what the exception holds, only the status is returned by the calling method
-                status.error("No such Repository " + bintrayRepo + " for subject " + subjectName, SC_NOT_FOUND, log);
-                throw new BintrayCallException(SC_BAD_REQUEST, "no such repo ", bintrayRepo);
-            } else {
-                return bintrayRepoHandle;
-            }
-            //'repo' clause exists -> verify name consistency with 'repo' field in the 'package' clause if exists
-        } else if (!repoNamesMatch(uploadInfo, bintrayRepo)) {
-            status.error("Mismatch between the 'name' field in the 'repo' clause and the 'repo' field in the " +
-                    "'package' clause, aborting operation", SC_BAD_REQUEST, log);
-            //Doesn't matter what the exception holds, only the status is returned by the calling method
-            throw new BintrayCallException(SC_BAD_REQUEST, "mismatch between repo name fields", bintrayRepo);
-        }
-        //Create or update the repo
-        return createOrUpdateRepo(uploadInfo.getRepositoryDetails(), subject, status);
-    }
-
-    private boolean hasRepoClause(BintrayUploadInfo uploadInfo) {
-        return uploadInfo.getRepositoryDetails() != null
-                && StringUtils.isNotBlank(uploadInfo.getRepositoryDetails().getName());
-    }
-
-    private boolean repoNamesMatch(BintrayUploadInfo uploadInfo, String bintrayRepo) {
-        return StringUtils.isBlank(bintrayRepo)
-                || uploadInfo.getRepositoryDetails().getName().equalsIgnoreCase(bintrayRepo);
-    }
-
-    @Override
-    public Bintray createBasicAuthBintrayClient() throws IllegalArgumentException {
-        return getBintrayClient(createHTTPClient(getCurrentUserBintrayCreds()));
-    }
-
-    @Override
-    public Bintray createBasicAuthBintrayClient(String userName, String password, @Nullable ProxyDescriptor proxy,
-            boolean useDefaultProxy) throws IllegalArgumentException {
-        return getBintrayClient(createHTTPClient(new UsernamePasswordCredentials(userName, password), proxy,
-                useDefaultProxy));
-    }
-
-    @Override
-    public Bintray createBlankBintrayClient() throws IllegalArgumentException {
-        return getBintrayClient(createHTTPClient(null));
-    }
-
-    private Bintray getBintrayClient(CloseableHttpClient httpClient) {
-        return BintrayClient.create(httpClient, PathUtils.trimTrailingSlashes(getBaseBintrayApiUrl()),
-                ConstantValues.bintrayClientThreadPoolSize.getInt(),
-                ConstantValues.bintrayClientSignRequestTimeout.getInt());
-    }
-
-    private CloseableHttpClient getUserOrSystemApiKeyHttpClient() {
-        CloseableHttpClient client;
-        if (isUserHasBintrayAuth()) {
-            client = createHTTPClient(getCurrentUserBintrayCreds());
-        } else if (hasBintraySystemUser()) {
-            client = createHTTPClient(getGlobalBintrayCreds());
-        } else {
-            throw new IllegalStateException("User doesn't have bintray credentials");
-        }
-        return client;
-    }
-
-    private CloseableHttpClient createHTTPClient(@Nullable UsernamePasswordCredentials creds) {
-        return createHTTPClient(creds, null, true);
-    }
-
-
-    private CloseableHttpClient createHTTPClient(@Nullable UsernamePasswordCredentials creds,
-            @Nullable ProxyDescriptor proxy, boolean useDefaultProxy) {
-        if (useDefaultProxy && proxy == null) {
-            proxy = ContextHelper.get().getCentralConfig().getDescriptor().getDefaultProxy();
-        }
-        return new HttpClientConfigurator()
-                .hostFromUrl(getBaseBintrayApiUrl())
-                .soTimeout(ConstantValues.bintrayClientRequestTimeout.getInt())
-                .connectionTimeout(ConstantValues.bintrayClientRequestTimeout.getInt())
-                .noRetry()
-                .proxy(proxy)
-                .authentication(creds)
-                .maxTotalConnections(30)
-                .defaultMaxConnectionsPerHost(30)
-                .getClient();
-    }
-
-    @Override
-    public List<Repo> getReposToDeploy(@Nullable Map<String, String> headersMap) throws IOException, BintrayException {
-        UsernamePasswordCredentials creds = getCurrentUserBintrayCreds();
-        String requestUrl = getBaseBintrayApiUrl() + PATH_REPOS + "/" + creds.getUserName();
-        InputStream responseStream = null;
-        try {
-            responseStream = executeGet(requestUrl, creds, headersMap);
-            if (responseStream != null) {
-                return JacksonReader.streamAsValueTypeReference(responseStream, new TypeReference<List<Repo>>() {
-                });
-            }
-        } finally {
-            IOUtils.closeQuietly(responseStream);
-        }
-        return null;
-    }
-
-    @Override
-    public List<String> getPackagesToDeploy(String repoKey, @Nullable Map<String, String> headersMap)
-            throws IOException, BintrayException {
-        UsernamePasswordCredentials creds = getCurrentUserBintrayCreds();
-        String requestUrl = getBaseBintrayApiUrl() + PATH_REPOS + "/" + repoKey + "/packages";
-        InputStream responseStream = null;
-        try {
-            responseStream = executeGet(requestUrl, creds, headersMap);
-            if (responseStream != null) {
-                return getPackagesList(responseStream);
-            }
-        } finally {
-            IOUtils.closeQuietly(responseStream);
-        }
-        return null;
-    }
-
-    private List<String> getPackagesList(InputStream responseStream) throws IOException {
-        List<String> packages = newArrayList();
-        JsonNode packagesTree = JacksonReader.streamAsTree(responseStream);
-        Iterator<JsonNode> elements = packagesTree.getElements();
-        while (elements.hasNext()) {
-            JsonNode packageElement = elements.next();
-            String packageName = packageElement.get("name").asText();
-            boolean linked = packageElement.get("linked").asBoolean();
-            if (!linked) {
-                packages.add(packageName);
-            }
-        }
-        return packages;
-    }
-
-    @Override
-    public List<String> getVersions(String repoKey, String packageId, @Nullable Map<String, String> headersMap)
-            throws IOException, BintrayException {
-        UsernamePasswordCredentials creds = getCurrentUserBintrayCreds();
-        String requestUrl = getBaseBintrayApiUrl() + PATH_PACKAGES + "/" + repoKey + "/" + packageId;
-        InputStream responseStream = null;
-        try {
-            responseStream = executeGet(requestUrl, creds, headersMap);
-            if (responseStream != null) {
-
-                RepoPackage repoPackage = JacksonReader.streamAsClass(responseStream, RepoPackage.class);
-                return repoPackage.getVersions();
-            }
-        } finally {
-            IOUtils.closeQuietly(responseStream);
-        }
-        return null;
-    }
-
-    @Override
-    public String getVersionFilesUrl(BintrayParams bintrayParams) {
-        return getBaseBintrayUrl() + bintrayParams.getRepo() + "/"
-                + bintrayParams.getPackageId() + "/" + bintrayParams.getVersion() + "/view/files";
-    }
-
-    @Override
-    public BintrayUser getBintrayUser(String username, String apiKey, @Nullable Map<String, String> headersMap)
-            throws IOException, BintrayException {
-        String requestUrl = getBaseBintrayApiUrl() + PATH_USERS + "/" + username;
-        InputStream responseStream = null;
-        try {
-            responseStream = executeGet(requestUrl, new UsernamePasswordCredentials(username, apiKey), headersMap);
-            if (responseStream != null) {
-                return JacksonReader.streamAsValueTypeReference(responseStream, new TypeReference<BintrayUser>() {
-                });
-            }
-        } finally {
-            IOUtils.closeQuietly(responseStream);
-        }
-        return null;
-    }
-
-    @Override
-    public BintrayUser getBintrayUser(String username, String apiKey) throws IOException, BintrayException {
-        return getBintrayUser(username, apiKey, null);
-    }
-
-    private boolean validCredentialsExist(BasicStatusHolder status) {
-        if (!isUserHasBintrayAuth()) {
-            status.error("No Bintray Authentication defined for user", HttpStatus.SC_UNAUTHORIZED, log);
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public boolean hasBintraySystemUser() {
-        return StringUtils.isNotBlank(ConstantValues.bintraySystemUser.getString())
-                || getBintrayGlobalConfig().globalCredentialsExist();
-    }
-
-    @Override
-    public boolean isUserHasBintrayAuth() {
-        UserInfo userInfo = getCurrentUser();
-        if (userInfo != null) {
-            String bintrayAuth = userInfo.getBintrayAuth();
-            if (StringUtils.isNotBlank(bintrayAuth)) {
-                String[] bintrayAuthTokens = StringUtils.split(bintrayAuth, ":");
-                if (bintrayAuthTokens.length == 2) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public String getBintrayRegistrationUrl() {
-        String licenseKeyHash = addonsManager.getLicenseKeyHash();
-        StringBuilder builder = new StringBuilder(ConstantValues.bintrayUrl.getString()).append("?source=artifactory");
-        if (StringUtils.isNotBlank(licenseKeyHash)) {
-            builder.append(":").append(licenseKeyHash);
-        }
-        return builder.toString();
-    }
-
-    @Override
-    public BintrayItemSearchResults<BintrayItemInfo> searchByName(String query,
-            @Nullable Map<String, String> headersMap) throws IOException, BintrayException {
-        String requestUrl = getBaseBintrayApiUrl() + "search/file/?subject=bintray&repo=jcenter&name=" + query;
-        log.debug("requestUrl=\"" + requestUrl + "\"");
-        try (CloseableHttpClient client = createHTTPClient(new UsernamePasswordCredentials("", ""))) {
-            HttpGet getMethod = createGetMethod(requestUrl, headersMap);
-            CloseableHttpResponse response = client.execute(getMethod);
-            int statusCode = response.getStatusLine().getStatusCode();
-            if (statusCode != HttpStatus.SC_OK) {
-                throw new BintrayException(response.getStatusLine().getReasonPhrase(), statusCode);
-            } else {
-                try {
-                    int rangeLimitTotal = Integer.parseInt(response.getFirstHeader(RANGE_LIMIT_TOTAL).getValue());
-                    InputStream responseStream = response.getEntity().getContent();
-                    List<BintrayItemInfo> listResult = JacksonReader.streamAsValueTypeReference(
-                            responseStream, new TypeReference<List<BintrayItemInfo>>() {
-                            }
-                    );
-                    List<BintrayItemInfo> distinctResults = listResult.stream().distinct().collect(Collectors.toList());
-                    BintrayItemSearchResults<BintrayItemInfo> results = new BintrayItemSearchResults<>(distinctResults,
-                            rangeLimitTotal);
-                    fillLocalRepoPaths(distinctResults);
-                    fixDateFormat(distinctResults);
-                    return results;
-                } finally {
-                    IOUtils.closeQuietly(response);
-                }
-            }
-        }
-    }
-
-    private void fixDateFormat(List<BintrayItemInfo> listResult) {
-        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(Build.STARTED_FORMAT);
-        for (BintrayItemInfo bintrayItemInfo : listResult) {
-            String createdDateFromBintray = bintrayItemInfo.getCreated();
-            long createdDate = ISODateTimeFormat.dateTime().parseMillis(createdDateFromBintray);
-            bintrayItemInfo.setCreated(simpleDateFormat.format(new Date(createdDate)));
-        }
-    }
-
-    private void fillLocalRepoPaths(List<BintrayItemInfo> listResult) {
-        for (BintrayItemInfo row : listResult) {
-            RepoPath repo = getRepoPath(row);
-            row.setCached(repo != null);
-            row.setLocalRepoPath(repo);
-        }
-    }
-
-    private RepoPath getRepoPath(BintrayItemInfo row) {
-        RemoteRepoDescriptor jCenterRepo = getJCenterRepo();
-        VfsQueryResult result = vfsQueryService.createQuery().addPathFilter(
-                row.getPath().replace(row.getName(), "")).name(
-                row.getName()).execute(100);
-        RepoPath repoPath = null;
-        for (VfsQueryRow vfsQueryRow : result.getAllRows()) {
-            RepoPath tempRepoPath = vfsQueryRow.getItem().getRepoPath();
-            LocalRepoDescriptor localRepoDescriptor = repoService.localOrCachedRepoDescriptorByKey(
-                    tempRepoPath.getRepoKey());
-            // If The the descriptor is "jcenter-cached" then return it immediately
-            if (localRepoDescriptor != null && tempRepoPath.getRepoKey().equals(
-                    jCenterRepo.getKey() + LocalCacheRepoDescriptor.PATH_SUFFIX)) {
-                return tempRepoPath;
-            }
-            // Keep the first repoPath we encounter
-            if (repoPath == null && localRepoDescriptor != null) {
-                repoPath = tempRepoPath;
-            }
-        }
-        return repoPath;
-    }
-
-    @Override
-    public RemoteRepoDescriptor getJCenterRepo() {
-        String jcenterHost = "jcenter.bintray.com";
-        String url = ConstantValues.jCenterUrl.getString();
-        try {
-            URI uri = new URIBuilder(url).build();
-            jcenterHost = uri.getHost();
-        } catch (URISyntaxException e) {
-            log.warn("Unable to construct a valid URI from '{}': {}", url);
-        }
-
-        List<RemoteRepoDescriptor> remoteRepoDescriptors = repoService.getRemoteRepoDescriptors();
-        for (RemoteRepoDescriptor remoteRepoDescriptor : remoteRepoDescriptors) {
-            if (remoteRepoDescriptor.getUrl().contains(jcenterHost)) {
-                return remoteRepoDescriptor;
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public BintrayPackageInfo getBintrayPackageInfo(String sha1, @Nullable Map<String, String> headersMap) {
-        return getPackageInfoFromCache(sha1, headersMap);
-    }
-
-    private BintrayPackageInfo getPackageInfoFromCache(String sha1, @Nullable Map<String, String> headersMap) {
-        BintrayPackageInfo bintrayPackageInfo = bintrayPackageCache.get(sha1);
-        // Try to get info from bintray if cache is empty
-        if (bintrayPackageInfo == null) {
-            populatePackageCacheFromBintray(sha1, headersMap);
-        }
-        return bintrayPackageCache.get(sha1);
-    }
-
-    private BintrayItemInfo getBintrayItemInfoByChecksum(final String sha1, @Nullable Map<String, String> headersMap) {
-        String itemInfoRequest = String.format("%ssearch/file/?sha1=%s&subject=bintray&repo=jcenter",
-                getBaseBintrayApiUrl(), sha1);
-        BintrayItemInfo result = null;
-        CloseableHttpClient client = getUserOrSystemApiKeyHttpClient();
-        CloseableHttpResponse response = null;
-        try {
-            log.debug("Bintray item request:{}", itemInfoRequest);
-            HttpGet getMethod = createGetMethod(itemInfoRequest, headersMap);
-            response = client.execute(getMethod);
-            int statusCode = response.getStatusLine().getStatusCode();
-            if (statusCode != HttpStatus.SC_OK) {
-                if (statusCode == HttpStatus.SC_UNAUTHORIZED) {
-                    String userName = getCurrentUserName();
-                    log.info("Bintray authentication failure: item {}, user {}", sha1, userName);
-                } else {
-                    log.info("Bintray request info failure for item {}", sha1);
-                }
-            } else {
-                int rangeLimitTotal = Integer.parseInt(response.getFirstHeader(RANGE_LIMIT_TOTAL).getValue());
-                InputStream responseStream = response.getEntity().getContent();
-                List<BintrayItemInfo> listResult = JacksonReader.streamAsValueTypeReference(
-                        responseStream, new TypeReference<List<BintrayItemInfo>>() {
-                        }
-                );
-                BintrayItemSearchResults<BintrayItemInfo> results = new BintrayItemSearchResults<>(
-                        listResult,
-                        rangeLimitTotal);
-                if (results.getResults().size() > 0) {
-                    result = results.getResults().get(0);
-                } else {
-                    log.debug("No item found for request: {}", itemInfoRequest);
-                }
-            }
-
-        } catch (Exception e) {
-            log.warn("Failure during Bintray fetching package {}: {}", sha1, e.getMessage());
-            log.debug("Failure during Bintray fetching package {}: {}", sha1, e);
-        } finally {
-            IOUtils.closeQuietly(response);
-            IOUtils.closeQuietly(client);
-        }
-        return result;
-    }
-
-    private String getCurrentUserName() {
-        UserInfo user = getCurrentUser();
-        return user == null ? "No user specified" : user.getUsername();
-    }
-
-    private void populatePackageCacheFromBintray(final String sha1, final @Nullable Map<String, String> headersMap) {
-        CloseableHttpClient client = null;
-        CloseableHttpResponse response = null;
-        try {
-            BintrayPackageInfo result = null;
-            // Try to get Bintray info for item by sha1
-            BintrayItemInfo bintrayItemInfo = getBintrayItemInfoByChecksum(sha1, headersMap);
-            // If item found update cache
-            if (bintrayItemInfo == null) {
-                return;
-            }
-
-            // Item exists in Bintray therefore try to get package info from Bintray
-            final String url = getBaseBintrayApiUrl() +
-                    "packages" + "/" +
-                    bintrayItemInfo.getOwner() + "/" +
-                    bintrayItemInfo.getRepo() + "/" +
-                    bintrayItemInfo.getPackage();
-            log.debug("Bintray package request:{}", url);
-            HttpGet getMethod = createGetMethod(url, headersMap);
-            client = getUserOrSystemApiKeyHttpClient();
-            response = client.execute(getMethod);
-            int statusCode = response.getStatusLine().getStatusCode();
-            if (statusCode != HttpStatus.SC_OK) {
-                if (statusCode == HttpStatus.SC_UNAUTHORIZED) {
-                    String userName = getCurrentUserName();
-                    log.info("Bintray authentication failure: user {}", userName);
-                }
-            } else {
-                InputStream responseStream = response.getEntity().getContent();
-                result = JacksonReader.streamAsValueTypeReference(
-                        responseStream, new TypeReference<BintrayPackageInfo>() {
-                        }
-                );
-            }
-
-            if (result != null) {
-                bintrayPackageCache.put(sha1, result);
-            }
-        } catch (Exception e) {
-            log.warn("Failure during Bintray fetching package {}: {}", sha1, e.getMessage());
-            log.debug("Failure during Bintray fetching package {}: {}", sha1, e);
-        } finally {
-            IOUtils.closeQuietly(response);
-            IOUtils.closeQuietly(client);
-        }
-    }
-
-    private InputStream executeGet(String requestUrl, UsernamePasswordCredentials creds,
-            @Nullable Map<String, String> headersMap)
-            throws IOException, BintrayException {
-        HttpGet getMethod = createGetMethod(requestUrl, headersMap);
-        CloseableHttpClient client = createHTTPClient(creds);
-        CloseableHttpResponse response = client.execute(getMethod);
-        if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
-            throw new BintrayException(response.getStatusLine().getReasonPhrase(),
-                    response.getStatusLine().getStatusCode());
-        } else {
-            return response.getEntity().getContent();
-        }
-    }
-
-    private String getBaseBintrayUrl() {
-        return PathUtils.addTrailingSlash(ConstantValues.bintrayUrl.getString());
-    }
-
-    private String getBaseBintrayApiUrl() {
-        return PathUtils.addTrailingSlash(ConstantValues.bintrayApiUrl.getString());
-    }
-
-    private HttpPut createPutMethod(String requestUrl, @Nullable Map<String, String> headersMap,
-            HttpEntity requestEntity) {
-        HttpPut putMethod = new HttpPut(HttpUtils.encodeQuery(requestUrl));
-        putMethod.setEntity(requestEntity);
-        updateHeaders(headersMap, putMethod);
-        return putMethod;
-    }
-
-    private HttpGet createGetMethod(String requestUrl, @Nullable Map<String, String> headersMap) {
-        HttpGet getMethod = new HttpGet(HttpUtils.encodeQuery(requestUrl));
-        updateHeaders(headersMap, getMethod);
-        return getMethod;
-    }
-
-    private void updateHeaders(Map<String, String> headersMap, HttpRequestBase method) {
-        method.setHeader(HttpHeaders.USER_AGENT, HttpUtils.getArtifactoryUserAgent());
-        if (headersMap != null) {
-            String headerVal = HttpUtils.adjustRefererValue(headersMap, headersMap.get("Referer".toUpperCase()));
-            method.setHeader("Referer", headerVal);
-        }
-    }
-
-    private UsernamePasswordCredentials getCurrentUserBintrayCreds() {
-        UserInfo userInfo = getCurrentUser();
-        String bintrayAuth = userInfo == null ? "" : userInfo.getBintrayAuth();
-        if (StringUtils.isNotBlank(bintrayAuth)) {
-            String[] bintrayAuthTokens = StringUtils.split(bintrayAuth, ":");
-            if (bintrayAuthTokens.length != 2) {
-                throw new IllegalArgumentException("Found invalid Bintray credentials");
-            }
-            return new UsernamePasswordCredentials(bintrayAuthTokens[0], bintrayAuthTokens[1]);
-        }
-        throw new IllegalArgumentException(
-                "Bintray credentials are missing, please configure your Bintray credential in the user profile page");
-    }
-
-    private UsernamePasswordCredentials getGlobalBintrayCreds() {
-        if (hasBintraySystemUser()) {
-            String userName =
-                    (StringUtils.isNotEmpty(centralConfig.getDescriptor().getBintrayConfig().getUserName())) ?
-                            getBintrayGlobalConfig().getUserName() : ConstantValues.bintraySystemUser.getString();
-
-            String apiKey =
-                    (StringUtils.isNotEmpty(centralConfig.getDescriptor().getBintrayConfig().getApiKey())) ?
-                            getBintrayGlobalConfig().getApiKey() : ConstantValues.bintraySystemUserApiKey.getString();
-
-            return new UsernamePasswordCredentials(userName, apiKey);
-        }
-        throw new IllegalArgumentException(
-                "Couldn't find Global Bintray credentials, please configure them from the admin page.");
-    }
-
-    private BintrayUploadInfo getUplaodInfoForBuild(Build build, BintrayUploadInfoOverride override,
-            BasicStatusHolder status) {
-
-        //Override given
-        if (override != null) {
-            if (override.isValid()) {
-                return new BintrayUploadInfo(override);
-            } else if (!override.isEmpty()) {
-                status.error("Invalid override parameters given, aborting operation.", SC_BAD_REQUEST, log);
-                return null;
-            }
-        }
-        //No override - find descriptor and validate
-        FileInfo descriptorFile = getDescriptorFromBuild(build, status);
-        if (status.hasErrors()) {
-            return null;
-        }
-        return validateUploadInfoFile(descriptorFile, status);
-    }
-
-    /**
-     * Uses an aql query to get the json descriptor that's included in the build artifacts.
-     */
-    private FileInfo getDescriptorFromBuild(Build build, BasicStatusHolder status) {
-        AqlApiItem aql = AqlApiItem.create().
-                filter(
-                        and(
-                                AqlApiItem.name().matches("*bintray-info*.json"),
-                                AqlApiItem.property().property("build.name", AqlComparatorEnum.equals, build.getName()),
-                                AqlApiItem.property().property("build.number", AqlComparatorEnum.equals,
-                                        build.getNumber())
-                        )
-                );
-        AqlEagerResult<AqlItem> results = aqlService.executeQueryEager(aql);
-
-        if (results.getSize() == 0) {
-            status.error("Descriptor not found in build artifacts, aborting operation", SC_NOT_FOUND, log);
-            return null;
-        }
-
-        int matchedFilesCounter = 0;
-        RepoPath path = null;
-        //Aql searches don't support regex - and other files might contain similar names - filter by regex now
-        for (AqlItem result : results.getResults()) {
-            path = InternalRepoPathFactory.create(result.getRepo(), result.getPath() + "/" + result.getName());
-            if (isBintrayJsonInfoFile(path.getPath())) {
-                log.debug("Found descriptor for build {} : {} in path {}", build.getName(), build.getNumber(), path);
-                matchedFilesCounter++;
-            }
-        }
-        if (matchedFilesCounter > 1) {
-            status.error("Found More than one Descriptor in build artifacts, aborting operation", SC_BAD_REQUEST, log);
-            return null;
-        }
-        return repoService.getFileInfo(path);
-    }
-
-    private BintrayUploadInfo validateUploadInfoFile(FileInfo descriptorJson, BasicStatusHolder status) {
-        if (!isBintrayJsonInfoFile(descriptorJson.getRepoPath().getName())) {
-            status.error("The path specified: " + descriptorJson.getRepoPath() + ", does not point to a descriptor. " +
-                    "The file name must contain 'bintray-info' and have a .json extension", SC_NOT_FOUND, log);
-            return null;
-        }
-        BintrayUploadInfo uploadInfo = null;
-        InputStream jsonContentStream = binaryService.getBinary(descriptorJson.getSha1());
-        ObjectMapper mapper = new ObjectMapper(new JsonFactory());
-        mapper.configure(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
-        try {
-            uploadInfo = mapper.readValue(jsonContentStream, BintrayUploadInfo.class);
-        } catch (IOException e) {
-            log.debug("{}", e);
-            status.error("Can't process the json file: " + e.getMessage(), SC_BAD_REQUEST, log);
-        } finally {
-            IOUtils.closeQuietly(jsonContentStream);
-        }
-        return uploadInfo;
-    }
-
-    private void filterBuildArtifactsByDescriptor(BintrayUploadInfo uploadInfo, List<FileInfo> artifactsToPush,
-            BasicStatusHolder status) {
-
-        List<String> descriptorArtifactPaths = uploadInfo.getArtifactPaths();
-        //null - applyToFiles field doesn't exist
-        if (descriptorArtifactPaths != null && !descriptorArtifactPaths.isEmpty()) {
-            //size == 1 && get(0) == "" --> field looks like "applyToFiles": ""  (jackson deserialization edge case)
-            if (!(descriptorArtifactPaths.size() == 1 && StringUtils.isBlank(descriptorArtifactPaths.get(0)))) {
-                status.error("Json file contains paths to artifacts, this command pushes whole builds only, aborting " +
-                        "operation", SC_BAD_REQUEST, log);
-                return;
-            }
-        }
-
-        //applyToProps has values - prepare a file list and send it and the props list to the aql search to be filtered
-        if (uploadInfo.getFilterProps() != null) {
-            List<AqlSearchablePath> artifactPaths = Lists.newArrayList();
-            for (FileInfo file : artifactsToPush) {
-                artifactPaths.add(new AqlSearchablePath(file.getRepoPath()));
-            }
-            artifactsToPush = collectArtifactItemInfos(artifactPaths,
-                    getMapFromUploadInfoMultiSet(uploadInfo.getFilterProps()));
-        }
-
-        //applyToProps filtered out all files
-        if (CollectionUtils.isNullOrEmpty(artifactsToPush)) {
-            status.error("The 'applyToProps' field in the json descriptor contains one or more properties that " +
-                    "caused all artifacts to be filtered out, aborting operation", SC_BAD_REQUEST, log);
-        }
-    }
-
-    /**
-     * Remove json file\s from file list that's being pushed to Bintray, handles cases where more than one file was
-     * found.
-     * In case no json file was specified (as in pushing a build) and more than one was found in the artifact
-     * list the most recent file will be used
-     *
-     * @param artifactsToPush   List of artifacts that are about to be pushed to Bintray
-     * @param specifiedJsonPath Path to specific json file to use - if the user has specified one (can be null)
-     * @param status            status holder of entire operation
-     * @return the most recent bintray upload info json file found
-     */
-    private FileInfo filterOutJsonFileFromArtifactsToPush(List<FileInfo> artifactsToPush, RepoPath specifiedJsonPath,
-            BasicStatusHolder status) {
-        List<FileInfo> uploadInfoFiles = Lists.newArrayList();
-        List<String> uploadInfoFileNames = Lists.newArrayList();
-        //Find all matches for the descriptor json file
-        for (FileInfo file : artifactsToPush) {
-            if (isBintrayJsonInfoFile(file.getName())) {
-                uploadInfoFiles.add(file);
-                uploadInfoFileNames.add(file.getRepoPath().toString());
-            }
-        }
-        if (uploadInfoFiles.isEmpty()) { //no json - special case for build-oriented operation only (when using override)
-            return null;
-        }
-        FileInfo mostRecentJson = uploadInfoFiles.get(0);
-
-        //More than one json matched the pattern - but a specific upload info file was specified
-        if (specifiedJsonPath != null) {
-            if (uploadInfoFiles.size() > 1) {
-                status.warn("Found more than one descriptor, using the one specified by user: " + specifiedJsonPath,
-                        log);
-                log.debug("Found bintray-info.json files: {}", Arrays.toString(uploadInfoFileNames.toArray()));
-            }
-            mostRecentJson = repoService.getFileInfo(specifiedJsonPath);
-        }
-
-        //Else, find latest modified (newest) json
-        else if (uploadInfoFiles.size() > 1) {
-            status.warn("Found more than one descriptor, using the most recent one", log);
-            for (int i = 1; i < uploadInfoFiles.size(); i++) {
-                if (uploadInfoFiles.get(i).getLastModified() > mostRecentJson.getLastModified()) {
-                    mostRecentJson = uploadInfoFiles.get(i);
-                }
-            }
-            log.debug("Most recent descriptor found: {}, with last modified value: {}",
-                    mostRecentJson.getRepoPath().toString(), mostRecentJson.getLastModified());
-        }
-        artifactsToPush.removeAll(uploadInfoFiles);
-        return mostRecentJson;
-    }
-
-
-    /**
-     * Create or update an existing Bintray Repository with the specified info
-     *
-     * @param repositoryDetails BintrayUploadInfo representing the supplied json file
-     * @param subjectHandle     SubjectHandle retrieved by the Bintray Java Client
-     * @param status            status holder of entire operation
-     * @return a RepositoryHandle   pointing to the created/updated repository
-     * @throws Exception on any error occurred
-     */
-    @Deprecated /** In favor of {@link DistributionRepo#getOrCreateRepo */
-    private RepositoryHandle createOrUpdateRepo(RepositoryDetails repositoryDetails, SubjectHandle subjectHandle,
-            BasicStatusHolder status) throws Exception {
-        return DistributionRepo.getOrCreateRepo(repositoryDetails, subjectHandle, status);
-    }
-
-    /**
-     * Create or update an existing Bintray Package with the specified info
-     *
-     * @param packageDetails   PackageDetails representing the supplied json file
-     * @param repositoryHandle RepositoryHandle retrieved by the Bintray Java Client
-     * @param status           status holder of entire operation
-     * @return a PackageHandle pointing to the created/updated package
-     * @throws Exception on any error occurred
-     */
-    @Deprecated /** In favor of {@link DistributionRepo#getOrCreatePackage}   */
-    private PackageHandle createOrUpdatePackage(PackageDetails packageDetails, RepositoryHandle repositoryHandle,
-            BasicStatusHolder status) throws Exception {
-        return DistributionRepo.getOrCreatePackage(packageDetails, repositoryHandle, status, true);
-    }
-
-    /**
-     * Create or update an existing Bintray Package with the specified info
-     *
-     * @param info          BintrayUploadInfo representing the supplied json file
-     * @param packageHandle PackageHandle retrieved by the Bintray Java Client or by {@link #createOrUpdatePackage}
-     * @param status        status holder of entire operation
-     * @return a VersionHandle pointing to the created/updated version
-     * @throws Exception on any error occurred
-     */
-    private VersionHandle createOrUpdateVersion(BintrayUploadInfo info, PackageHandle packageHandle,
-            BasicStatusHolder status) throws Exception {
-
-        VersionDetails versionDetails = info.getVersionDetails();
-        VersionHandle versionHandle = packageHandle.version(versionDetails.getName());
-        try {
-            if (!versionHandle.exists()) {
-                status.status("Version " + versionDetails.getName() + " doesn't exist, creating it", log);
-                versionHandle = packageHandle.createVersion(versionDetails);
-            } else {
-                versionHandle.update(versionDetails);
-            }
-            log.debug("Version {} created", versionHandle.get().name());
-        } catch (BintrayCallException bce) {
-            status.error(bce.toString(), bce.getStatusCode(), bce, log);
-            throw bce;
-        } catch (IOException ioe) {
-            log.debug("{}", ioe);
-            throw ioe;
-        }
-        return versionHandle;
-    }
-
-    private Multimap<String, String> getMapFromUploadInfoMultiSet(Set<Map<String, Collection<String>>> elements) {
-        Multimap<String, String> elementsMap = HashMultimap.create();
-        if (CollectionUtils.isNullOrEmpty(elements)) {
-            return elementsMap;
-        }
-        for (Map<String, Collection<String>> element : elements) {
-            String key = element.keySet().iterator().next();
-            Collection<String> values = element.get(key);
-            elementsMap.putAll(key, values);
-        }
-        return elementsMap;
-    }
-
-    //Collects a list of artifacts to push using an aql query, based on the descriptor's content or location
-    private List<FileInfo> collectArtifactsToPushBasedOnDescriptor(FileInfo jsonFile, BintrayUploadInfo uploadInfo,
-            BasicStatusHolder status) {
-
-        List<AqlSearchablePath> artifactPaths = Lists.newArrayList();
-        Multimap<String, String> propsToFilterBy = getMapFromUploadInfoMultiSet(uploadInfo.getFilterProps());
-        boolean descriptorHasPaths = CollectionUtils.notNullOrEmpty(uploadInfo.getArtifactPaths());
-        boolean descriptorHasRelPaths = CollectionUtils.notNullOrEmpty(uploadInfo.getArtifactRelativePaths());
-
-        if (!descriptorHasPaths && !descriptorHasRelPaths) {
-            if (propsToFilterBy.isEmpty()) {
-                status.status("The descriptor doesn't contain file paths and no properties to filter by were " +
-                        "specified , pushing everything under " + jsonFile.getRepoPath().getParent(), log);
-            } else {
-                status.status("The descriptor doesn't contain file paths, pushing everything under "
-                        + jsonFile.getRepoPath().getParent() + " , filtered by the properties specified.", log);
-            }
-            artifactPaths = AqlUtils.getSearchablePathForCurrentFolderAndSubfolders(jsonFile.getRepoPath().getParent());
-        } else {
-            try {
-                if (descriptorHasPaths) {
-                    artifactPaths = AqlSearchablePath.fullPathToSearchablePathList(uploadInfo.getArtifactPaths());
-                }
-                if (descriptorHasRelPaths) {
-                    artifactPaths.addAll(AqlSearchablePath.relativePathToSearchablePathList(
-                            uploadInfo.getArtifactRelativePaths(), jsonFile.getRepoPath().getParent()));
-                }
-            } catch (IllegalArgumentException iae) {
-                status.error("Paths in the descriptor must point to a file or use a valid wildcard that denotes " +
-                        "several files (i.e. /*.*)", SC_BAD_REQUEST, iae, log);
-                return null;
-            }
-        }
-        List<FileInfo> artifactsToPush = collectArtifactItemInfos(artifactPaths, propsToFilterBy);
-        filterOutJsonFileFromArtifactsToPush(artifactsToPush, jsonFile.getRepoPath(), status);
-
-        //aql search returned no artifacts for query
-        if (CollectionUtils.isNullOrEmpty(artifactsToPush)) {
-            status.error("No artifacts found to push to Bintray, aborting operation", SC_NOT_FOUND, log);
-        }
-        return artifactsToPush;
-    }
-
-    /**
-     * Searches for all Files defined in the supplied params.
-     * The relation between each path is OR, and between each parameter is AND
-     * The relation between parameters and paths is AND
-     *
-     * @param aqlSearchablePaths   Paths (repository paths) in the AqlSearchablePath form
-     * @param propertiesFilterList List of property name and values to filter the file list by
-     * @return A list of file infos that represents the results aql returned
-     */
-    private List<FileInfo> collectArtifactItemInfos(List<AqlSearchablePath> aqlSearchablePaths,
-            Multimap<String, String> propertiesFilterList) {
-        //Searching without any path at all is performance-risky...
-        if (CollectionUtils.isNullOrEmpty(aqlSearchablePaths)) {
-            return null;
-        }
-        AqlApiItem.AndClause rootFilterClause = AqlApiItem.and();
-        AqlApiItem.AndClause propertiesAndClause = AqlApiItem.and();
-        //Resolve patterned path or patterned file names, as well as direct paths
-        AqlBase.OrClause artifactsPathOrClause = AqlUtils.getSearchClauseForPaths(aqlSearchablePaths);
-
-        //Filter results by property key and value
-        for (String key : propertiesFilterList.keySet()) {
-            for (String value : propertiesFilterList.get(key)) {
-                log.debug("Adding property {}, with value {} to artifact search query", key, value);
-                propertiesAndClause.append(AqlApiItem.property().property(key, AqlComparatorEnum.equals, value));
-            }
-        }
-        rootFilterClause.append(artifactsPathOrClause);
-        rootFilterClause.append(propertiesAndClause);
-        rootFilterClause.append(AqlApiItem.type().equal("file"));
-        AqlApiItem artifactQuery = AqlApiItem.create().filter(rootFilterClause);
-
-        List<FileInfo> itemInfoList = Lists.newArrayList();
-        List<RepoPath> itemInfoPaths = Lists.newArrayList();
-        AqlEagerResult<AqlItem> results = aqlService.executeQueryEager(artifactQuery);
-        for (AqlItem result : results.getResults()) {
-            RepoPath path = InternalRepoPathFactory.create(result.getRepo(), result.getPath() + "/" + result.getName());
-            itemInfoList.add(repoService.getFileInfo(path));
-            itemInfoPaths.add(path);
-        }
-        log.debug("BintaryService Artifact search returned the following artifacts: {}",
-                Arrays.toString(itemInfoPaths.toArray()));
-        return itemInfoList;
-    }
-
-    private BintrayConfigDescriptor getBintrayGlobalConfig() {
-        BintrayConfigDescriptor bintrayDescriptor = centralConfig.getDescriptor().getBintrayConfig();
-        return bintrayDescriptor != null ? bintrayDescriptor : new BintrayConfigDescriptor();
-    }
-
-    //Match anything as long as it has bintray-info in the name (case insensitive) and .json extension
-    private boolean isBintrayJsonInfoFile(String fileName) {
-        return fileName.matches("(?i)[\\s\\S]*bintray-info[\\s\\S]*.json");
-    }
-
-    //0 is unlimited
-    private int getFileUploadLimit() {
-        return getBintrayGlobalConfig().getFileUploadLimit();
-    }
-
-    /**
-     * Handles signing the version according to the descriptor, override flag and passphrase (if given)
-     */
-    public void signVersion(VersionHandle versionHandle, boolean descriptorGpgSign, @Nullable Boolean gpgSignOverride,
-            @Nullable String gpgPassphrase, int fileCount, BasicStatusHolder status) throws BintrayCallException {
-
-        String signed = " - the version will be signed";
-        String notSigned = " - the version will not be signed";
-        String passphraseSent = "A passphrase was sent as a parameter to the command";
-        // TODO: [by dan] I know this is ugly, but there are so many edge cases :(
-        try {
-            if (StringUtils.isNotBlank(gpgPassphrase)) {
-                if (gpgSignOverride != null) {
-                    if (gpgSignOverride) {
-                        status.status(passphraseSent + ", and the gpgSign override flag was set to true" + signed, log);
-                        versionHandle.sign(gpgPassphrase, fileCount);
-                    } else {
-                        status.warn(passphraseSent + ", but the gpgSign override flag was set to false" + notSigned,
-                                HttpStatus.SC_BAD_REQUEST, log);
-                    }
-                } else {
-                    if (descriptorGpgSign) {
-                        status.status(passphraseSent + " without an override, and the gpgSign flag in the descriptor" +
-                                " was set to true" + signed, log);
-                        versionHandle.sign(gpgPassphrase, fileCount);
-                    } else {
-                        status.warn(
-                                passphraseSent + "without an override, and the gpgSign flag in the descriptor was" +
-                                        " set to false" + notSigned, HttpStatus.SC_BAD_REQUEST, log);
-                    }
-                }
-            } else if (gpgSignOverride != null) {
-                if (gpgSignOverride) {
-                    status.status("The gpgSign override flag is set to true and no passphrase was given, attempting" +
-                            " to sign the version without a passphrase", log);
-                    versionHandle.sign(fileCount);
-                } else {
-                    status.status("The gpgSign override flag is set to false" + notSigned, log);
-                }
-            } else {
-                //no override - default to descriptor
-                if (descriptorGpgSign) {
-                    status.status("The gpgSign flag in the descriptor is set to true, attempting to sign the " +
-                            "version without a passphrase", log);
-                    versionHandle.sign(fileCount);
-                }
-            }
-        } catch (BintrayCallException bce) {
-            status.error("Error while signing the version: " + bce.toString(), bce.getStatusCode(), log);
-            throw bce;
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/bintray/BintrayTokenResponse.java b/backend/core/src/main/java/org/artifactory/bintray/BintrayTokenResponse.java
deleted file mode 100644
index 00e7e23..0000000
--- a/backend/core/src/main/java/org/artifactory/bintray/BintrayTokenResponse.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.bintray;
-
-import org.codehaus.jackson.annotate.*;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.codehaus.plexus.util.StringUtils;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author Dan Feldman
- */
- at JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
- at JsonIgnoreProperties(ignoreUnknown = true)
-public class BintrayTokenResponse {
-
-    @JsonProperty(value = "access_token")
-    public String token;
-    @JsonProperty(value = "refresh_token")
-    public String refreshToken;
-
-    //Everything else we might care about but currently don't
-    private Map<String, Object> other = new HashMap<>();
-
-    @JsonAnyGetter
-    public Map<String, Object> any() {
-        return other;
-    }
-
-    @JsonAnySetter
-    public void set(String name, Object value) {
-        other.put(name, value);
-    }
-
-    @JsonIgnore
-    public boolean isValid() {
-        return StringUtils.isNotBlank(token) && StringUtils.isNotBlank(refreshToken);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/bintray/distribution/DistributionServiceImpl.java b/backend/core/src/main/java/org/artifactory/bintray/distribution/DistributionServiceImpl.java
deleted file mode 100644
index 0249c57..0000000
--- a/backend/core/src/main/java/org/artifactory/bintray/distribution/DistributionServiceImpl.java
+++ /dev/null
@@ -1,524 +0,0 @@
-package org.artifactory.bintray.distribution;
-
-import com.google.common.collect.HashMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Multimap;
-import com.jfrog.bintray.client.api.BintrayCallException;
-import com.jfrog.bintray.client.api.handle.Bintray;
-import org.apache.commons.codec.binary.Base64;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpHeaders;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.utils.URLEncodedUtils;
-import org.apache.http.message.BasicNameValuePair;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.api.bintray.BintrayService;
-import org.artifactory.api.bintray.BintrayUploadInfo;
-import org.artifactory.api.bintray.distribution.Distribution;
-import org.artifactory.api.bintray.distribution.DistributionService;
-import org.artifactory.api.bintray.distribution.model.DistributionRepoCreationDetails;
-import org.artifactory.api.bintray.distribution.resolver.DistributionCoordinatesResolver;
-import org.artifactory.api.bintray.distribution.resolver.DistributionRuleFilterType;
-import org.artifactory.api.bintray.distribution.rule.DistributionRuleLayoutToken;
-import org.artifactory.api.bintray.distribution.rule.DistributionRuleTokens;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.jackson.JacksonReader;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.module.ModuleInfoUtils;
-import org.artifactory.api.repo.exception.ItemNotFoundRuntimeException;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.aql.AqlService;
-import org.artifactory.bintray.BintrayTokenResponse;
-import org.artifactory.bintray.distribution.token.BintrayOAuthTokenRefresher;
-import org.artifactory.bintray.distribution.util.DistributionUtils;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.repo.*;
-import org.artifactory.descriptor.repo.distribution.DistributionCoordinates;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.descriptor.repo.distribution.rule.DistributionRule;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.DistributionRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.util.AlreadyExistsException;
-import org.artifactory.util.RepoLayoutUtils;
-import org.artifactory.util.distribution.DistributionConstants;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nullable;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-
-import static org.artifactory.bintray.distribution.util.DistributionUtils.*;
-import static org.artifactory.util.distribution.DistributionConstants.MANIFEST_FILENAME;
-
-/**
- * @author Dan Feldman
- */
- at Service
-public class DistributionServiceImpl implements DistributionService {
-    private static final Logger log = LoggerFactory.getLogger(DistributionServiceImpl.class);
-
-    @Autowired
-    private BintrayService bintrayService;
-
-    @Autowired
-    private InternalRepositoryService repoService;
-
-    @Autowired
-    private CentralConfigService configService;
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Autowired
-    private AqlService aqlService;
-
-    @Autowired
-    private BintrayOAuthTokenRefresher bintrayOAuthTokenRefresher;
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    private static final String OSS_LICENSES_ENDPOINT = "licenses/oss_licenses";
-    // private static final String PROPRIETARY_LICENSES_ENDPOINT = "orgs/%s/licenses"; //TODO [by dan]: RTFACT-10217
-    private static final String PLAN_ENDPOINT = "orgs/%s/plan";
-    private static final String DUMMY_EXISTING_COORDINATES_RULE_NAME = "Existing Coordinates on path";
-
-    @Override
-    public DistributionRepoCreationDetails createBintrayAppConfig(String clientId, String secret, String code,
-            String scope, String redirectUrl) throws IOException {
-        String org = scope.split(":")[1];
-        //In order to persist the oauth app before the repo is created we have to randomly generate some ID to be
-        //used as the oauth config's key appended to the org. timestamp seems like a good bet.
-        String appConfigKey = org + "-" + System.currentTimeMillis();
-        BintrayApplicationConfig config = new BintrayApplicationConfig(appConfigKey, clientId, secret, org, scope);
-        try (Bintray client = bintrayService.createBlankBintrayClient()) {
-            BintrayTokenResponse tokenResponse = getBintrayTokenResponse(code, redirectUrl, client, config);
-            log.debug("Adding Bintray Application OAuth config: {}", config.getKey());
-            saveNewBintrayAppConfig(config);
-            Map<String, String> headers = new HashMap<>();
-            headers.put(HttpHeaders.AUTHORIZATION, "Bearer " + new String(Base64.encodeBase64(tokenResponse.token.getBytes())));
-            DistributionRepoCreationDetails details = getRepoCreationDetails(client, org, headers);
-            details.oauthAppConfigKey = config.getKey();
-            details.oauthToken = tokenResponse.token;
-            details.org = org;
-            details.clientId = clientId;
-            return details;
-        }
-    }
-
-    private BintrayTokenResponse getBintrayTokenResponse(String code, String redirectUrl, Bintray client,
-            BintrayApplicationConfig appConfig) throws IOException {
-        BintrayTokenResponse tokenResponse;
-        try {
-            Map<String, String> requestHeaders = getFormEncodedHeader();
-            String basicAuth = Base64.encodeBase64String((appConfig.getClientId() + ":" + appConfig.getSecret()).getBytes());
-            requestHeaders.put(HttpHeaders.AUTHORIZATION, "Basic " + basicAuth);
-            log.debug("Executing OAuth token request for org {}", appConfig.getOrg());
-            InputStream tokenEntity = getTokenRequestFormParams(appConfig, code, redirectUrl);
-            HttpResponse response = client.post("oauth/token", requestHeaders, tokenEntity);
-            tokenResponse = JacksonReader.streamAsClass(response.getEntity().getContent(), BintrayTokenResponse.class);
-            appConfig.setRefreshToken(tokenResponse.refreshToken);
-        } catch (Exception e) {
-            //IO can either be problem with streams or failure http return code
-            log.error("Error executing get token request: {}", e.getMessage());
-            log.debug("Error executing get token request: ", e);
-            throw e;
-        }
-        return tokenResponse;
-    }
-
-    //params -> grant_type = authorization_code / code / redirect_uri / client_id / scope / artifactory_hash
-    private InputStream getTokenRequestFormParams(BintrayApplicationConfig config, String code,
-            String redirectUrl) {
-        List<BasicNameValuePair> params = Lists.newArrayList(new BasicNameValuePair("grant_type", "authorization_code"),
-                new BasicNameValuePair("code", code),
-                new BasicNameValuePair("redirect_uri", redirectUrl),
-                new BasicNameValuePair("client_id", config.getClientId()),
-                new BasicNameValuePair("scope", config.getScope()),
-                new BasicNameValuePair("artifactory_hash", addonsManager.getLicenseKeyHash()));
-        return IOUtils.toInputStream(URLEncodedUtils.format(params, "UTF-8"));
-    }
-
-    @Override
-    public DistributionRepoCreationDetails getRepoCreationDetails(String repoKey) throws IOException {
-        DistributionRepo repo = repoService.distributionRepoByKey(repoKey);
-        if (repo == null) {
-            throw new IOException("No such repo " + repoKey);
-        }
-        BintrayApplicationConfig appConfig = repo.getDescriptor().getBintrayApplication();
-        if (appConfig == null) {
-            throw new IOException("Repo " + repoKey + " does not have an OAuth app config, can't retrieve org-specific details.");
-        }
-        return getRepoCreationDetails(repo.getClient(), appConfig.getOrg(), null);
-    }
-
-    @Override
-    public BasicStatusHolder distribute(Distribution distribution) {
-        if (distribution.isAsync()) {
-            ContextHelper.get().beanForType(DistributionService.class).distributeInternal(distribution);
-            return new BasicStatusHolder();
-        } else {
-            return distributeInternal(distribution);
-        }
-    }
-
-    @Override
-    public BasicStatusHolder distributeInternal(Distribution distribution) {
-        BasicStatusHolder status = new BasicStatusHolder();
-        if (StringUtils.isBlank(distribution.getTargetRepo())) {
-            status.error("No distribution repo specified to use for distributing the requested artifact(s).",
-                    HttpStatus.SC_BAD_REQUEST, log);
-            return status;
-        }
-        DistributionRepo repo = repoService.distributionRepoByKey(distribution.getTargetRepo());
-        if (repo == null) {
-            status.error("No such distribution repo " + distribution.getTargetRepo(), HttpStatus.SC_NOT_FOUND, log);
-            return status;
-        }
-        //Distribute permission == deploy to root of dist repo
-        if (!authorizationService.canDeploy(repo.getRepoPath("."))) {
-            status.error("User does not have the required permissions to distribute to repo " + repo.getKey(),
-                    HttpStatus.SC_FORBIDDEN, log);
-            return status;
-        }
-        return repo.distribute(distribution);
-    }
-
-    /**
-     * Populates {@param details} with this {@param org}'s available licenses - which are Bintray's OSS license list
-     * and optionally any other custom license this org has defined (retrieved with a different REST call).
-     * Also populates the 'isPremium' field in {@param details}.
-     */
-    private DistributionRepoCreationDetails getRepoCreationDetails(Bintray client, String org, Map<String, String> headers) throws IOException {
-        DistributionRepoCreationDetails details = new DistributionRepoCreationDetails();
-        log.debug("Executing plan details request for org {}", org);
-        HttpResponse response = client.get(String.format(PLAN_ENDPOINT, org), headers);
-        details.isOrgPremium = getIsPremiumFromResponse(response);
-        log.debug("Executing OSS Licenses request");
-        response = client.get(OSS_LICENSES_ENDPOINT, headers);
-        details.orgLicenses.addAll(getLicensesFromResponse(response));
-        //TODO [by dan]: find solution for this crap in 4.8.1 RTFACT-10217
-        /*if(details.isOrgPremium) {
-            log.debug("Executing Proprietary Licenses request for org {}", org);
-            response = client.get(String.format(PROPRIETARY_LICENSES_ENDPOINT, org), headers);
-            details.orgLicenses.addAll(getLicensesFromResponse(response));
-        }*/
-        return details;
-    }
-
-    @Override
-    public String refreshBintrayOAuthAppToken(String repoKey) throws BintrayCallException {
-        DistributionRepoDescriptor distRepoDescriptor = repoService.distributionRepoDescriptorByKey(repoKey);
-        if (distRepoDescriptor == null || distRepoDescriptor.getBintrayApplication() == null) {
-            String err = "Repository " + repoKey + " does not have a Bintray OAuth Application config attached to it.";
-            log.debug(err);
-            throw new BintrayCallException(HttpStatus.SC_BAD_REQUEST, "", err);
-        }
-        return bintrayOAuthTokenRefresher.refresh(distRepoDescriptor);
-    }
-
-    private void saveNewBintrayAppConfig(BintrayApplicationConfig config) throws IOException,
-            AlreadyExistsException {
-        MutableCentralConfigDescriptor configDescriptor = configService.getMutableDescriptor();
-        try {
-            configDescriptor.addBintrayApplication(config);
-        } catch (AlreadyExistsException aee) {
-            String newAppConfigKey = config.getKey() + "-new";
-            log.warn(aee.getMessage() + " trying to create a new one: '{}'", newAppConfigKey);
-            config.setKey(newAppConfigKey);
-            try {
-                configDescriptor.addBintrayApplication(config);
-            } catch (AlreadyExistsException aee2) {
-                log.error(aee2.getMessage() + " To avoid further confusion in your config the save will fail to give" +
-                        " you a chance to sort it out.");
-                throw aee2;
-            }
-        }
-        configService.saveEditedDescriptorAndReload(configDescriptor);
-    }
-
-    public Multimap<BintrayUploadInfo, DistributionCoordinatesResolver> coordinatesForPaths(List<RepoPath> paths,
-            List<DistributionRule> repoRules, DistributionRepoDescriptor descriptor, BasicStatusHolder status) {
-        paths = adjustSpecialPaths(paths, status);
-        Map<RepoPath, Properties> pathProperties = getPathProperties(paths, aqlService);
-        if (pathProperties.isEmpty()) {
-            //If any paths were found they will have entries in the map with empty Properties as values
-            status.error("No Artifacts found for any of the paths you specified, nothing to distribute.",
-                    HttpStatus.SC_NOT_FOUND, log);
-            return HashMultimap.create();
-        }
-        String productName = descriptor.getProductName();
-        DistributionUtils.insertProductNameDummyProp(productName, pathProperties);
-        Map<String, List<String>> layoutTokensByRepoKey = addLayoutTokens(pathProperties, status);
-        log.debug("Populating coordinate tokens with artifact coordinates and layout data.");
-        List<DistributionCoordinatesResolver> resolvers =
-                getCoordinatesForPaths(pathProperties, repoRules, productName, status, layoutTokensByRepoKey).stream()
-                        .map(coordinate -> coordinate.resolve(status))
-                        .filter(Objects::nonNull)
-                        .map(coordinate -> coordinate.populateUploadInfo(descriptor))
-                        .collect(Collectors.toList());
-
-        return mergeVersions(resolvers);
-    }
-
-    /**
-     * Merges the {@link BintrayUploadInfo} of resolvers that point to the same repo/package/version from
-     * {@param resolvers} and aggregates all attributes into the same version so that we only create it once when
-     * distributing.
-     */
-    private Multimap<BintrayUploadInfo, DistributionCoordinatesResolver> mergeVersions(
-            List<DistributionCoordinatesResolver> resolvers) {
-        Multimap<BintrayUploadInfo, DistributionCoordinatesResolver> mergedResolvers = HashMultimap.create();
-
-        for (DistributionCoordinatesResolver resolver : resolvers) {
-            if (!mergedResolvers.containsKey(resolver.uploadInfo)) {
-                List<DistributionCoordinatesResolver> sameCoordinates = getResolversWithSameUploadInfo(resolvers, resolver);
-                BintrayUploadInfo mergedUploadInfo = getMergedUploadInfo(sameCoordinates);
-                if (mergedUploadInfo != null) {
-                    mergedResolvers.putAll(mergedUploadInfo, sameCoordinates);
-                } else {
-                    //If something went wrong fall back to upload info per coordinate
-                    sameCoordinates.forEach(coordinate -> mergedResolvers.put(coordinate.uploadInfo, coordinate));
-                }
-            }
-        }
-        //If something went wrong fall back to upload info per coordinate
-        if (mergedResolvers.isEmpty()) {
-            resolvers.forEach(coordinate -> mergedResolvers.put(coordinate.uploadInfo, coordinate));
-        }
-        return mergedResolvers;
-    }
-
-    /**
-     * Adds layout tokens and values as {@param pathProperties} according to each path
-     */
-    private Map<String, List<String>> addLayoutTokens(Map<RepoPath, Properties> pathProperties, BasicStatusHolder status) {
-        Map<String, List<String>> layoutTokensByRepoKey = Maps.newHashMap();
-        for (Map.Entry<RepoPath, Properties> entry : pathProperties.entrySet()) {
-            RepoPath path = entry.getKey();
-            String repoKey = path.getRepoKey();
-            List<String> layoutTokens;
-            if (layoutTokensByRepoKey.containsKey(repoKey)) {
-                layoutTokens = layoutTokensByRepoKey.get(repoKey);
-            } else {
-                LocalRepoDescriptor descriptor = repoService.localOrCachedRepoDescriptorByKey(repoKey);
-                if (descriptor == null) {
-                    status.warn("No such repo " + repoKey + " , Distribution coordinates will not be resolved for " +
-                            "artifact " + path.toPath() + " .", HttpStatus.SC_NOT_FOUND, log);
-                    continue;
-                }
-                layoutTokens = RepoLayoutUtils.getLayoutTokens(descriptor.getRepoLayout());
-                log.trace("Adding layout tokens {} retrieved from repo {} layout {}.", layoutTokens, repoKey,
-                        descriptor.getRepoLayout().getName());
-                layoutTokensByRepoKey.put(repoKey, layoutTokens);
-            }
-            try {
-                ModuleInfo moduleInfo = repoService.getItemModuleInfo(path);
-                for (String token : layoutTokens) {
-                    String strippedToken = DistributionUtils.stripTokenBrackets(token);
-                    String value = ModuleInfoUtils.getTokenValue(moduleInfo, strippedToken);
-                    log.trace("Layout token matched value {} for layout token {} on path {}", value, token, path.toPath());
-                    pathProperties.get(path).put(DistributionConstants.wrapToken(strippedToken), value);
-                }
-            } catch (Exception e) {
-                status.warn("Failed to get layout information for artifact '" + path.toPath() + "', layout tokens will "
-                        + "not be resolved for it.", HttpStatus.SC_BAD_REQUEST, log);
-            }
-        }
-        return layoutTokensByRepoKey;
-    }
-
-    /**
-     * Constructs A {@link DistributionCoordinatesResolver} for each path given in {@param pathProperties} based on
-     * the path's type and if it matched any {@link DistributionRule} from the given list {@param rules}
-     */
-    private List<DistributionCoordinatesResolver> getCoordinatesForPaths(Map<RepoPath, Properties> pathProperties,
-                                                                         List<DistributionRule> rules, @Nullable String productName,
-                                                                         BasicStatusHolder status, Map<String, List<String>> layoutTokensByRepoKey) {
-        List<DistributionCoordinatesResolver> coordinates = Lists.newArrayList();
-        Map<String, RepoType> repoTypes = Maps.newHashMap();
-        for (Map.Entry<RepoPath, Properties> pathProps : pathProperties.entrySet()) {
-            RepoPath path = pathProps.getKey();
-            if (!repoExists(repoTypes, path, status)) {
-                //Repo doesn't exist, skip it.
-                continue;
-            }
-            Properties properties = pathProps.getValue();
-            DistributionCoordinatesResolver resolver =
-                    getResolverByPathAndProperties(rules, repoTypes.get(path.getRepoKey()), path, properties, status);
-            if (resolver != null) {
-                //Add product name token if this repo distributes a product, only for new rules, not existing coordinates.
-                if (StringUtils.isNotBlank(productName) && !DUMMY_EXISTING_COORDINATES_RULE_NAME.equals(resolver.ruleName)) {
-                    resolver.tokens.add(DistributionRuleTokens.getProductNameToken());
-                }
-                //Add layout tokens according to the layout defined for the repo
-                layoutTokensByRepoKey.get(path.getRepoKey()).stream().forEach(layoutToken -> {
-                    String strippedToken = DistributionUtils.stripTokenBrackets(layoutToken);
-                    String wrappedToken = DistributionConstants.wrapToken(strippedToken);
-                    resolver.tokens.add(new DistributionRuleLayoutToken(wrappedToken));
-                });
-                coordinates.add(resolver);
-            }
-        }
-        return coordinates;
-    }
-
-    private DistributionCoordinatesResolver getResolverByPathAndProperties(List<DistributionRule> rules, RepoType type,
-            RepoPath path, Properties properties, BasicStatusHolder status) {
-        DistributionCoordinatesResolver resolver;
-        if (DistributionCoordinatesResolver.pathHasDistributionCoordinates(properties)) {
-            log.debug("Found existing Bintray Properties on path {}, returning dummy rule which will populate " +
-                    "coordinates with values later on.", path);
-            DistributionCoordinates dummyCoordinates = new DistributionCoordinates("", "", "", "");
-            DistributionRule dummyRule = new DistributionRule(DUMMY_EXISTING_COORDINATES_RULE_NAME, type, "", "", dummyCoordinates);
-            resolver = new DistributionCoordinatesResolver(dummyRule, path, properties);
-        } else {
-            resolver = matchRuleToArtifact(rules, type, properties, path, status);
-        }
-        return resolver;
-    }
-
-    private DistributionCoordinatesResolver matchRuleToArtifact(List<DistributionRule> rules, RepoType repoType,
-            Properties pathProps, RepoPath path, BasicStatusHolder status) {
-        DistributionCoordinatesResolver resolver = null;
-        RepoType artifactType = getArtifactType(pathProps, repoType, path, status);
-        if (artifactType != null) {
-            resolver = matchPathToRule(rules, path, artifactType, pathProps, status);
-        } else {
-            status.error("Can't match any rule to artifact '" + path.toPath() + "'.", HttpStatus.SC_BAD_REQUEST, log);
-        }
-        return resolver;
-    }
-
-    /**
-     * Matches the first rule from the ordered rules list {@param rules} to the give {@param path} based on it's
-     * {@param artifactType} and the rule's {@link DistributionRule#pathFilter} if specified.
-     */
-    private DistributionCoordinatesResolver matchPathToRule(List<DistributionRule> rules, RepoPath path,
-            RepoType artifactType, Properties pathProps, BasicStatusHolder status) {
-        for (DistributionRule rule : rules) {
-            //First rule that matches, either of same type or generic
-            if (rule.getType().equals(artifactType) || rule.getType().equals(RepoType.Generic)) {
-                DistributionCoordinatesResolver resolver = new DistributionCoordinatesResolver(rule, path, pathProps);
-                boolean repoMatches = addCaptureGroupsToRuleResolverIfMatches(rule, DistributionRuleFilterType.repo, rule.getRepoFilter(), path.getRepoKey(), resolver);
-                if (!repoMatches) {
-                    continue;
-                }
-                boolean pathMatches = addCaptureGroupsToRuleResolverIfMatches(rule, DistributionRuleFilterType.path, rule.getPathFilter(), path.getPath(), resolver);
-                if (pathMatches) {
-                    return resolver;
-                }
-            }
-        }
-        status.error("Failed to match any rule for artifact " + path.toPath() + " with type " + artifactType + ". It " +
-                "will not be distributed.", HttpStatus.SC_BAD_REQUEST, log);
-        return null;
-    }
-
-    /**
-     * Adds capture groups to the resolver if there is a filter to use and the given text matches it.
-     *
-     * @return <code>true</code> if the given text matches the filter, or <code>false</code> otherwise.
-     * Blank filter always returns <code>true</code>.
-     */
-    private boolean addCaptureGroupsToRuleResolverIfMatches(DistributionRule rule, DistributionRuleFilterType filterType,
-            String filterRegex, String textToMatch, DistributionCoordinatesResolver resolver) {
-        if (StringUtils.isNotBlank(filterRegex)) {
-            Pattern filterPattern = Pattern.compile(filterRegex);
-            Matcher filterMatcher = createTimingOutMatcher(textToMatch, filterPattern);
-            if (filterMatcher.matches()) {
-                addCaptureGroupsToRuleResolver(filterType, filterMatcher, resolver);
-            } else {
-                log.debug("Failed to match rule {} with {} filter {} to value {}", rule.getName(),
-                        filterType.getQualifier(), filterRegex, textToMatch);
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Identifies folders in Docker repos that were given in {@param paths} and adjust the path to point to the
-     * manifest file.
-     */
-    private List<RepoPath> adjustSpecialPaths(List<RepoPath> paths, BasicStatusHolder status) {
-        return paths.stream()
-                .map(path -> adjustDirToManifest(path, status))
-                .collect(Collectors.toList());
-    }
-
-    /**
-     * @return the path to the manifest.json file if this {@param path} points to a docker tag directory.
-     */
-    private RepoPath adjustDirToManifest(RepoPath path, BasicStatusHolder status) {
-        RepoPath adjustedPath = path;
-        if (!isDockerRepo(path)) {
-            return adjustedPath;
-        }
-        String fullPath = path.toPath();
-        try {
-            if (repoService.getItemInfo(path).isFolder()) {
-                status.status("Path " + fullPath + " is a folder in a Docker repo, checking for tag manifests.", log);
-                List<ItemInfo> children = repoService.getChildren(path);
-                List<ItemInfo> manifestChildren = children.stream()
-                        .filter(item -> !item.isFolder())
-                        .filter(item -> MANIFEST_FILENAME.equals(item.getName()))
-                        .collect(Collectors.toList());
-                if (manifestChildren.size() < 1) {
-                    status.status("Directory " + fullPath + " has no manifest.json files under it, skipping.", log);
-                } else if (manifestChildren.size() > 1) {
-                    status.status("Directory " + fullPath + " has many manifest.json files under it, skipping.", log);
-                } else {
-                    adjustedPath = manifestChildren.get(0).getRepoPath();
-                    log.debug("Adjusting path {} to its underlying manifest.json in {}", fullPath, adjustedPath);
-                    status.status("Found manifest under " + fullPath, log);
-                }
-            }
-        } catch (ItemNotFoundRuntimeException nfe) {
-            status.error("Path " + fullPath + " not found.", HttpStatus.SC_NOT_FOUND, log);
-        }
-        return adjustedPath;
-    }
-
-    /**
-     * @return true if {@param path}'s repo exists. Also populates the repo->type cache with that repo's type.
-     */
-    private boolean repoExists(Map<String, RepoType> repoTypes, RepoPath path, BasicStatusHolder status) {
-        String repoKey = path.getRepoKey();
-        if (repoTypes.get(repoKey) == null) {
-            RepoBaseDescriptor descriptor = repoService.localOrCachedRepoDescriptorByKey(repoKey);
-            if (descriptor == null) {
-                status.error("Received path " + path.toPath() + " to distribute, but no such repo " + repoKey + ".", log);
-                return false;
-            }
-            repoTypes.putIfAbsent(repoKey, descriptor.getType());
-        }
-        return true;
-    }
-
-    /**
-     * @return true if {@param path} is in a Docker repo.
-     */
-    private boolean isDockerRepo(RepoPath path) {
-        RepoDescriptor descriptor = repoService.repoDescriptorByKey(path.getRepoKey());
-        return descriptor != null && RepoType.Docker.equals(descriptor.getType());
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/bintray/distribution/token/BintrayOAuthTokenRefresher.java b/backend/core/src/main/java/org/artifactory/bintray/distribution/token/BintrayOAuthTokenRefresher.java
deleted file mode 100644
index a4835da..0000000
--- a/backend/core/src/main/java/org/artifactory/bintray/distribution/token/BintrayOAuthTokenRefresher.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package org.artifactory.bintray.distribution.token;
-
-import com.google.common.collect.Lists;
-import com.jfrog.bintray.client.api.BintrayCallException;
-import com.jfrog.bintray.client.api.handle.Bintray;
-import org.apache.commons.codec.binary.Base64;
-import org.apache.commons.io.IOUtils;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.utils.URLEncodedUtils;
-import org.apache.http.message.BasicNameValuePair;
-import org.artifactory.api.bintray.BintrayService;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.jackson.JacksonReader;
-import org.artifactory.bintray.BintrayTokenResponse;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.repo.BintrayApplicationConfig;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.List;
-
-import static org.artifactory.bintray.distribution.util.DistributionUtils.getFormEncodedHeader;
-
-/**
- * Queries Bintray for an OAuth token and saves the response refreshToken into the config descriptor if required.
- *
- * @author Shay Yaakov
- */
- at Component
-public class BintrayOAuthTokenRefresher {
-
-    @Autowired
-    CentralConfigService configService;
-
-    @Autowired
-    BintrayService bintrayService;
-
-    public String refresh(DistributionRepoDescriptor descriptor) throws BintrayCallException {
-        MutableCentralConfigDescriptor configDescriptor = configService.getMutableDescriptor();
-        BintrayApplicationConfig config = getBintrayApplicationConfig(descriptor, configDescriptor);
-        BintrayTokenResponse tokenResponse = executeRefreshTokenRequest(config, descriptor.getProxy());
-        if (tokenResponse == null || !tokenResponse.isValid()) {
-            String response = tokenResponse == null ? "empty" : tokenResponse.toString();
-            throw new BintrayCallException(HttpStatus.SC_CONFLICT, "Failed to refresh and acquire token from Bintray",
-                    "response is invalid: " + response);
-        } else if (!config.getRefreshToken().equalsIgnoreCase(tokenResponse.refreshToken)) {
-            config.setRefreshToken(tokenResponse.refreshToken);
-            //Save descriptor with new Bintray app config only if refresh token has changed
-            configService.saveEditedDescriptorAndReload(configDescriptor);
-        }
-        return Base64.encodeBase64String(tokenResponse.token.getBytes());
-    }
-
-    private BintrayTokenResponse executeRefreshTokenRequest(final BintrayApplicationConfig config,
-            final ProxyDescriptor proxy) throws BintrayCallException {
-        try (Bintray client = bintrayService.createBasicAuthBintrayClient(config.getClientId(), config.getSecret(), proxy, false)) {
-            HttpResponse response = client.post("oauth/token", getFormEncodedHeader(), getTokenRefreshRequestFormParams(config));
-            return JacksonReader.streamAsClass(response.getEntity().getContent(), BintrayTokenResponse.class);
-        } catch (IOException ioe) {
-            //IO can either be problem with streams or failure http return code
-            if (ioe instanceof BintrayCallException) {
-                throw (BintrayCallException) ioe;
-            } else {
-                throw new BintrayCallException(HttpStatus.SC_BAD_REQUEST, "Error executing refresh token request",
-                        ioe.getMessage());
-            }
-        }
-    }
-
-    //params -> grant_type = refresh_token / client_id / refresh_token / scope
-    private InputStream getTokenRefreshRequestFormParams(BintrayApplicationConfig config) {
-        List<BasicNameValuePair> params = Lists.newArrayList(new BasicNameValuePair("grant_type", "refresh_token"),
-                new BasicNameValuePair("client_id", config.getClientId()),
-                new BasicNameValuePair("refresh_token", config.getRefreshToken()),
-                new BasicNameValuePair("scope", config.getScope()));
-        return IOUtils.toInputStream(URLEncodedUtils.format(params, "UTF-8"));
-    }
-
-    private BintrayApplicationConfig getBintrayApplicationConfig(DistributionRepoDescriptor descriptor,
-            MutableCentralConfigDescriptor configDescriptor) throws BintrayCallException {
-        String bintrayAppKey = descriptor.getBintrayApplication().getKey();
-        BintrayApplicationConfig config = configDescriptor.getBintrayApplication(bintrayAppKey);
-        if (config == null) {
-            throw new BintrayCallException(HttpStatus.SC_NOT_FOUND, "Bintray Application config " + bintrayAppKey + " not found.", "");
-        }
-        decryptConfigIfNeeded(config);
-        return config;
-    }
-
-    private void decryptConfigIfNeeded(BintrayApplicationConfig config) {
-        config.setClientId(CryptoHelper.decryptIfNeeded(config.getClientId()));
-        config.setSecret(CryptoHelper.decryptIfNeeded(config.getSecret()));
-        config.setRefreshToken(CryptoHelper.decryptIfNeeded(config.getRefreshToken()));
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/bintray/distribution/util/DistributionUtils.java b/backend/core/src/main/java/org/artifactory/bintray/distribution/util/DistributionUtils.java
deleted file mode 100644
index 28e5a66..0000000
--- a/backend/core/src/main/java/org/artifactory/bintray/distribution/util/DistributionUtils.java
+++ /dev/null
@@ -1,290 +0,0 @@
-package org.artifactory.bintray.distribution.util;
-
-import com.google.common.collect.HashMultimap;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Multimap;
-import com.jfrog.bintray.client.api.BintrayCallException;
-import com.jfrog.bintray.client.api.handle.RepositoryHandle;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpHeaders;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.artifactory.api.bintray.BintrayUploadInfo;
-import org.artifactory.api.bintray.distribution.resolver.DistributionCoordinatesResolver;
-import org.artifactory.api.bintray.distribution.resolver.DistributionRuleFilterType;
-import org.artifactory.api.bintray.distribution.rule.DistributionRulePropertyToken;
-import org.artifactory.api.bintray.distribution.rule.DistributionRuleToken;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.jackson.JacksonReader;
-import org.artifactory.api.repo.exception.ItemNotFoundRuntimeException;
-import org.artifactory.aql.AqlService;
-import org.artifactory.aql.api.domain.sensitive.AqlApiItem;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.result.AqlEagerResult;
-import org.artifactory.aql.result.rows.AqlBaseFullRowImpl;
-import org.artifactory.aql.util.AqlSearchablePath;
-import org.artifactory.aql.util.AqlUtils;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.md.Properties;
-import org.artifactory.model.xstream.fs.PropertiesImpl;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.util.AutoTimeoutRegexCharSequence;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nullable;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import static org.apache.http.HttpStatus.SC_BAD_REQUEST;
-import static org.artifactory.util.distribution.DistributionConstants.ARTIFACT_TYPE_OVERRIDE_PROP;
-import static org.artifactory.util.distribution.DistributionConstants.PRODUCT_NAME_DUMMY_PROP;
-
-/**
- * @author Dan Feldman
- */
-public class DistributionUtils {
-    private static final Logger log = LoggerFactory.getLogger(DistributionUtils.class);
-
-    /**
-     * Adds application/x-www-form-urlencoded header required by the spec
-     * https://tools.ietf.org/html/rfc6749#section-4.1.3
-     */
-    public static Map<String, String> getFormEncodedHeader() {
-        Map<String, String> headers = Maps.newHashMap();
-        headers.put(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded");
-        return headers;
-    }
-
-    /**
-     * @return a mapping of {@param paths} and the properties set on them, returns an empty (not null)
-     * {@link Properties} object for paths that had no properties
-     */
-    public static Map<RepoPath, Properties> getPathProperties(Collection<RepoPath> paths, AqlService aqlService) {
-        AqlBase pathProperties = getAqlSearchClauseForPaths(paths);
-        log.trace("Built aql query {} to search path properties on paths: {}", pathProperties.toNative(0), paths.toString());
-        AqlEagerResult<AqlBaseFullRowImpl> results = aqlService.executeQueryEager(pathProperties);
-        HashMultimap<RepoPath, AqlBaseFullRowImpl> pathRows = getPathRows(results);
-        return pathsWithPropsFromAql(pathRows);
-    }
-
-    private static AqlBase getAqlSearchClauseForPaths(Collection<RepoPath> paths) {
-        AqlBase.OrClause aqlPaths = AqlUtils.getSearchClauseForPaths(paths
-                .stream()
-                .map(AqlSearchablePath::new)
-                .collect(Collectors.toList()));
-        return AqlApiItem.create().filter(aqlPaths).include(AqlApiItem.property().key(), AqlApiItem.property().value());
-    }
-
-    private static HashMultimap<RepoPath, AqlBaseFullRowImpl> getPathRows(AqlEagerResult<AqlBaseFullRowImpl> results) {
-        return AqlUtils.aggregateResultsByPath(results.getResults(), ContextHelper.get().getAuthorizationService());
-    }
-
-    /**
-     * @return each of the paths (the keyset of {@param resultsByPath}) with all properties the AQL search returned
-     * for it.
-     */
-    private static Map<RepoPath, Properties> pathsWithPropsFromAql(Multimap<RepoPath, AqlBaseFullRowImpl> pathRows) {
-        Map<RepoPath, Properties> pathProps = Maps.newHashMap();
-        for (RepoPath path : pathRows.keySet()) {
-            Properties props = new PropertiesImpl();
-            pathRows.get(path).stream().forEach(row -> props.put(row.getKey(), row.getValue()));
-            pathProps.put(path, props);
-        }
-        log.trace("Returning path->properties mapping: {}", pathProps.toString());
-        return pathProps;
-    }
-
-    /**
-     * Populate a {@link DistributionCoordinatesResolver} with any matching groups that were resolved from the regex
-     * match, if any.
-     * @param filterType
-     * @param filterMatcher
-     * @param resolver
-     */
-    public static void addCaptureGroupsToRuleResolver(DistributionRuleFilterType filterType, Matcher filterMatcher,
-                                                          DistributionCoordinatesResolver resolver) {
-        int groupCount = filterMatcher.groupCount();
-        //Group 0 (the entire pattern) is not included in the count
-        if (groupCount > 0) {
-            for (int i = 1; i <= groupCount; i++) {
-                resolver.addCaptureGroup(filterType, filterMatcher.group(i));
-            }
-        }
-    }
-
-    /**
-     * Creates a matcher that times out after the time specified in {@link org.artifactory.common.ConstantValues} has
-     * passed to protect Artifactory from freezing a Thread over a user's regex causing catastrophic backtracking
-     *
-     * @param stringToMatch String that the regex will match.
-     * @param regexPattern  Pattern to match against input string.
-     */
-    public static Matcher createTimingOutMatcher(String stringToMatch, Pattern regexPattern) {
-        CharSequence charSequence = new AutoTimeoutRegexCharSequence(stringToMatch, stringToMatch,
-                regexPattern.pattern(), ConstantValues.bintrayDistributionRegexTimeoutMillis.getInt());
-        return regexPattern.matcher(charSequence);
-    }
-
-    public static String getValueFromToken(DistributionCoordinatesResolver coordinates, String tokenKey) {
-        return coordinates.tokens.stream()
-                .filter(token -> tokenKey.equals(token.getToken()))
-                .findAny()
-                .orElseThrow(() -> new IllegalArgumentException("Could not resolve the value of token '" + tokenKey +
-                        "' for artifact '" + coordinates.artifactPath + "' Artifactory cannot distribute without it."))
-                .getValue();
-    }
-
-    public static boolean bintrayRepoExists(RepositoryHandle bintrayRepoHandle, BasicStatusHolder status) {
-        try {
-            if (!bintrayRepoHandle.exists()) {  //Repo exists?
-                return false;
-            }
-        } catch (BintrayCallException bce) {
-            status.error(bce.toString(), bce.getStatusCode(), log);
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * The product name token piggy-backs on the property token, it's inserted as a path property here to be evaluated
-     * by the token regex mechanism later on.
-     */
-    public static void insertProductNameDummyProp(@Nullable String productName, Map<RepoPath, Properties> pathProperties) {
-        if (StringUtils.isNotBlank(productName)) {
-            pathProperties.values().stream().forEach(props -> props.put(PRODUCT_NAME_DUMMY_PROP, productName));
-        }
-    }
-
-    public static boolean getIsPremiumFromResponse(HttpResponse bintrayPlanResponse) throws IOException {
-        return JacksonReader.streamAsTree(bintrayPlanResponse.getEntity().getContent()).get("premium").asBoolean();
-    }
-
-    public static List<String> getLicensesFromResponse(HttpResponse bintrayLicensesResponse) throws IOException {
-        return JacksonReader.streamAsTree(bintrayLicensesResponse.getEntity().getContent()).findValuesAsText("name");
-    }
-
-    /**
-     * {@param distPaths} are required to be a list of full repo paths in the form "repoKey/path"
-     */
-    public static List<RepoPath> getPathsFromDistPathList(List<String> distPaths, BasicStatusHolder status) {
-        InternalRepositoryService repoService = ContextHelper.get().beanForType(InternalRepositoryService.class);
-        List<RepoPath> paths = distPaths.stream()
-                .map(path -> pathToRepoPath(status, path))
-                .filter(Objects::nonNull)
-                .filter(repoPath -> !isCacheRepoPath(repoPath, repoService, status))
-                .distinct()
-                .collect(Collectors.toList());
-
-        if (paths == null || paths.isEmpty()) {
-            status.error("No paths were given to distribute", SC_BAD_REQUEST, log);
-        }
-
-        return paths;
-    }
-
-    private static boolean isCacheRepoPath(RepoPath repoPath, InternalRepositoryService repoService, BasicStatusHolder status) {
-        LocalRepo localRepo = repoService.localOrCachedRepositoryByKey(repoPath.getRepoKey());
-        boolean isCacheRepoPath = localRepo != null && localRepo.isCache();
-        if (isCacheRepoPath) {
-            status.warn("Skipping distribution from the remote repository " + repoPath, SC_BAD_REQUEST, log);
-        }
-        return isCacheRepoPath;
-    }
-
-    private static RepoPath pathToRepoPath(BasicStatusHolder status, String path) {
-        try {
-            return RepoPathFactory.create(path);
-        } catch (Exception e) {
-            String err = "Invalid path given: '" + path + "': ";
-            status.warn(err + e.getMessage(), HttpStatus.SC_NOT_FOUND, log);
-            log.debug(err, e);
-        }
-        return null;
-    }
-
-    /**
-     * @return the path's {@link RepoType} either from the cached list of repo->type, given as
-     * {@param containingRepoType} or by the type override property
-     * {@link org.artifactory.util.distribution.DistributionConstants#ARTIFACT_TYPE_OVERRIDE_PROP} if it was set on the path.
-     */
-    public static RepoType getArtifactType(Properties pathProperties, RepoType containingRepoType, RepoPath path, BasicStatusHolder status) {
-        RepoType artifactType = null;
-        String typeFromProp = pathProperties.getFirst(ARTIFACT_TYPE_OVERRIDE_PROP);
-        if (StringUtils.isNotBlank(typeFromProp)) {
-            try {
-                artifactType = RepoType.fromType(typeFromProp);
-                log.debug("Found artifact type override property on path {}, overridden to type: {}", path.toPath(), artifactType);
-            } catch (Exception e) {
-                status.error("Invalid artifact type override property set on path " + path.toPath() + ": " + typeFromProp, log);
-            }
-        } else {
-            artifactType = containingRepoType != null ? containingRepoType : null;
-        }
-        return artifactType;
-    }
-
-    public static String getTokenValueByPropKey(DistributionCoordinatesResolver resolver, String propKey) throws ItemNotFoundRuntimeException {
-        //TODO [by dan]: test parallel performance?
-        return resolver.tokens.stream()
-                .filter(token -> token instanceof DistributionRulePropertyToken)
-                .filter(token -> propKey.equals(((DistributionRulePropertyToken) token).getPropertyKey()))
-                .map(DistributionRuleToken::getValue)
-                .filter(Objects::nonNull)
-                .findAny()
-                .orElseThrow(() -> new ItemNotFoundRuntimeException("Can't find property value for " + propKey +
-                        " on path: " + resolver.artifactPath.toPath() + " which is required for resolving its " +
-                        "distribution coordinates"));
-    }
-
-    /**
-     * @return the token without the enclosing brackets.
-     */
-    public static String stripTokenBrackets(String token) {
-        return token.replaceFirst("\\[", "").replaceFirst("\\]", "");
-    }
-
-    public static List<DistributionCoordinatesResolver> getResolversWithSameUploadInfo(
-            List<DistributionCoordinatesResolver> resolvers, DistributionCoordinatesResolver resolver) {
-        return resolvers.stream()
-                .filter(current -> current.getRepo().equals(resolver.getRepo()))
-                .filter(current -> current.getPkg().equals(resolver.getPkg()))
-                .filter(current -> current.getVersion().equals(resolver.getVersion()))
-                .collect(Collectors.toList());
-    }
-
-    public static BintrayUploadInfo getMergedUploadInfo(List<DistributionCoordinatesResolver> sameCoordinates) {
-        return sameCoordinates.stream()
-                .map(DistributionCoordinatesResolver::getBintrayUploadInfo)
-                .reduce(DistributionUtils::mergeUploadInfo)
-                .orElse(null);
-    }
-
-    private static BintrayUploadInfo mergeUploadInfo(BintrayUploadInfo left, BintrayUploadInfo right) {
-        //None of this is supposed to be null, there's a fallback if something goes wrong
-        try {
-            left.getVersionDetails().setAttributes(
-                    Stream.concat(left.getVersionDetails().getAttributes().stream(),
-                            right.getVersionDetails().getAttributes().stream())
-                            .distinct()
-                            .collect(Collectors.toList()));
-        } catch (Exception e) {
-            log.debug("Failed to merge upload info: {}<->{}", left != null ? left.toString() : "null",
-                    right != null ? right.toString() : "null");
-        }
-        return left;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/build/BaseBuildPromoter.java b/backend/core/src/main/java/org/artifactory/build/BaseBuildPromoter.java
deleted file mode 100644
index 662eccc..0000000
--- a/backend/core/src/main/java/org/artifactory/build/BaseBuildPromoter.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.build;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Multiset;
-import com.google.common.collect.Sets;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.PropertiesAddon;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.common.MoveMultiStatusHolder;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.repo.exception.ItemNotFoundRuntimeException;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.property.Property;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.util.DoesNotExistException;
-import org.jfrog.build.api.Build;
-import org.jfrog.build.api.Dependency;
-import org.jfrog.build.api.release.Promotion;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.util.CollectionUtils;
-
-import java.util.Map;
-import java.util.Set;
-
-import static org.artifactory.build.BuildServiceUtils.*;
-
-/**
- * @author Noam Y. Tenne
- */
-public class BaseBuildPromoter {
-
-    private static final Logger log = LoggerFactory.getLogger(BaseBuildPromoter.class);
-
-    protected AuthorizationService authorizationService;
-    protected InternalBuildService buildService;
-    private RepositoryService repositoryService;
-
-    public BaseBuildPromoter() {
-        ArtifactoryContext context = ContextHelper.get();
-        authorizationService = context.getAuthorizationService();
-        buildService = context.beanForType(InternalBuildService.class);
-        repositoryService = context.getRepositoryService();
-    }
-
-    protected Build getBuild(BuildRun buildRun) {
-        return buildService.getBuild(buildRun);
-    }
-
-    protected void assertRepoExists(String targetRepoKey) {
-        LocalRepoDescriptor targetRepo = repositoryService.localOrCachedRepoDescriptorByKey(targetRepoKey);
-        if (targetRepo == null) {
-            throw new DoesNotExistException("Cannot find target repository by the key '" + targetRepoKey + "'.");
-        }
-    }
-
-    /**
-     * Collect items to move
-     *
-     * @param build             Build info to collect from
-     * @param promotion
-     * @param multiStatusHolder Status holder
-     * @return Item repo paths
-     */
-    protected Set<RepoPath> collectItems(Build build, Promotion promotion, BasicStatusHolder multiStatusHolder) {
-        Set<RepoPath> itemsToMove = Sets.newHashSet();
-        if (noModules(build)) {
-            return itemsToMove;
-        }
-        //Artifacts should be collected
-        if (promotion.isArtifacts()) {
-            //TODO [by dan]: can now support include/exclude multiple repos
-            Set<ArtifactoryBuildArtifact> buildArtifactsInfo = buildService.getBuildArtifactsFileInfos(build, false,
-                    Lists.newArrayList(promotion.getSourceRepo()), null);
-            String errorMessage = "Unable to find artifacts of build '" + build.getName() + "' #" + build.getNumber();
-            verifyAllArtifactInfosExistInSet(build, true, multiStatusHolder, buildArtifactsInfo, VerifierLogLevel.err);
-
-            if (!multiStatusHolder.getErrors().isEmpty()) {
-                if (promotion.isFailFast()) {
-                    throw new ItemNotFoundRuntimeException(errorMessage + ": aborting promotion.");
-                }
-            }
-            for (ArtifactoryBuildArtifact artifact : buildArtifactsInfo) {
-                itemsToMove.add(artifact.getFileInfo().getRepoPath());
-            }
-        }
-
-        //Build dependencies should be collected
-        if (promotion.isDependencies()) {
-            Map<Dependency, FileInfo> buildDependenciesInfo = buildService.getBuildDependenciesFileInfos(build);
-            verifyAllDependencyInfosExistInMap(build, true, multiStatusHolder, buildDependenciesInfo,
-                    VerifierLogLevel.err);
-            for (Map.Entry<Dependency, FileInfo> entry : buildDependenciesInfo.entrySet()) {
-                Dependency dependency = entry.getKey();
-                if (dependency != null) {
-                    Set<String> dependencyScopes = dependency.getScopes();
-                    //Scopes of dependencies to collect
-                    if (org.artifactory.util.CollectionUtils.isNullOrEmpty(
-                            promotion.getScopes()) || (dependencyScopes != null &&
-                            CollectionUtils.containsAny(dependencyScopes, promotion.getScopes()))) {
-                        itemsToMove.add(entry.getValue().getRepoPath());
-                    }
-                }
-            }
-        }
-        return itemsToMove;
-    }
-
-    private boolean noModules(Build build) {
-        if (build == null) {
-            return true;
-        }
-
-        return build.getModules() == null;
-    }
-
-    /**
-     * Move items
-     *
-     * @param itemsToMove   Collection of items to move
-     * @param targetRepoKey Key of target repository to move to
-     * @param dryRun        True if the action should run dry (simulate)
-     * @param failFast      True if the operation should abort upon the first occurring warning or error
-     * @return Result status holder
-     */
-    protected MoveMultiStatusHolder move(Set<RepoPath> itemsToMove, String targetRepoKey, boolean dryRun,
-            boolean failFast) {
-        return repositoryService.move(itemsToMove, targetRepoKey,
-                (Properties) InfoFactoryHolder.get().createProperties(), dryRun, failFast);
-    }
-
-    /**
-     * Copy items
-     *
-     * @param itemsToCopy   Collection of items to copy
-     * @param targetRepoKey Key of target repository to copy to
-     * @param dryRun        True if the action should run dry (simulate)
-     * @param failFast      True if the operation should abort upon the first occurring warning or error
-     * @return Result status holder
-     */
-    protected MoveMultiStatusHolder copy(Set<RepoPath> itemsToCopy, String targetRepoKey, boolean dryRun,
-            boolean failFast) {
-        return repositoryService.copy(itemsToCopy, targetRepoKey,
-                (Properties) InfoFactoryHolder.get().createProperties(), dryRun, failFast);
-    }
-
-    protected void tagBuildItemsWithProperties(Set<RepoPath> itemsToTag, Properties properties, boolean failFast,
-            boolean dryRun, BasicStatusHolder multiStatusHolder) {
-        for (RepoPath itemToTag : itemsToTag) {
-            if (!authorizationService.canAnnotate(itemToTag)) {
-                multiStatusHolder.warn("User doesn't have permissions to annotate '" + itemToTag + "'", log);
-                if (failFast) {
-                    return;
-                } else {
-                    continue;
-                }
-            }
-            if (!dryRun) {
-                PropertiesAddon propertiesAddon =
-                        ContextHelper.get().beanForType(AddonsManager.class).addonByType(PropertiesAddon.class);
-                Multiset<String> keys = properties.keys();
-                for (String key : keys) {
-                    Set<String> valuesForKey = properties.get(key);
-                    Property property = new Property();
-                    property.setName(key);
-                    String[] values = new String[valuesForKey.size()];
-                    valuesForKey.toArray(values);
-                    propertiesAddon.addProperty(itemToTag, null, property, values);
-                }
-            }
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/build/BuildPromotionHelper.java b/backend/core/src/main/java/org/artifactory/build/BuildPromotionHelper.java
deleted file mode 100644
index 27e569d..0000000
--- a/backend/core/src/main/java/org/artifactory/build/BuildPromotionHelper.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.build;
-
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.rest.artifact.PromotionResult;
-import org.artifactory.common.StatusEntry;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.md.Properties;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.util.DoesNotExistException;
-import org.jfrog.build.api.Build;
-import org.jfrog.build.api.builder.PromotionStatusBuilder;
-import org.jfrog.build.api.release.Promotion;
-import org.joda.time.format.ISODateTimeFormat;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Collection;
-import java.util.Date;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Noam Y. Tenne
- */
-public class BuildPromotionHelper extends BaseBuildPromoter {
-    private static final Logger log = LoggerFactory.getLogger(BuildPromotionHelper.class);
-
-    public PromotionResult promoteBuild(BuildRun buildRun, Promotion promotion) {
-        Build build = getBuild(buildRun);
-
-        if (build == null) {
-            throw new DoesNotExistException("Unable to find build '" + buildRun.getName() + "' #" +
-                    buildRun.getNumber() + ".");
-        }
-
-        PromotionResult promotionResult = new PromotionResult();
-
-        String targetRepo = promotion.getTargetRepo();
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-
-        Set<RepoPath> itemsToMove = null;
-        if (StringUtils.isBlank(targetRepo)) {
-            statusHolder.status("Skipping build item relocation: no target repository selected.", log);
-        } else {
-            assertRepoExists(targetRepo);
-            itemsToMove = collectItems(build, promotion, statusHolder);
-
-            promoteBuildItems(promotion, statusHolder, itemsToMove);
-        }
-
-        /*
-        *  A list of properties to attach to the build's artifacts (regardless if "targetRepo" is used).
-        * */
-        Properties properties = (Properties) InfoFactoryHolder.get().createProperties();
-        Map<String, Collection<String>> promotionProperties = promotion.getProperties();
-        if ((promotionProperties != null) && !promotionProperties.isEmpty()) {
-            for (Map.Entry<String, Collection<String>> entry : promotionProperties.entrySet()) {
-                properties.putAll(entry.getKey(), entry.getValue());
-            }
-        }
-        if (!properties.isEmpty()) {
-            Set<RepoPath> modifiedItems = collectTheRightItems(promotion, build, targetRepo, statusHolder,
-                    itemsToMove);
-
-            if (!modifiedItems.isEmpty()) {
-                tagBuildItemsWithProperties(modifiedItems, properties, promotion.isFailFast(), promotion.isDryRun(),
-                        statusHolder);
-            }
-        }
-
-        performPromotionIfNeeded(statusHolder, build, promotion);
-        appendMessages(promotionResult, statusHolder);
-
-        return promotionResult;
-    }
-
-    private Set<RepoPath> collectTheRightItems(Promotion promotion, Build build, String targetRepo,
-            BasicStatusHolder statusHolder, Set<RepoPath> itemsToMove) {
-        //Collect artifacts only from the target repository
-        Set<RepoPath> modifiedItems = Sets.newHashSet();
-        if (!StringUtils.isBlank(targetRepo)) {
-            if (itemsToMove != null) {
-                for (RepoPath item : itemsToMove) {
-                    modifiedItems.add(new RepoPathImpl(targetRepo, item.getPath()));
-                }
-            }
-        } else {
-            //In case the target repository is not defined, collect the items form the source.
-            modifiedItems = collectItems(build, promotion, statusHolder);
-        }
-        return modifiedItems;
-    }
-
-    private void performPromotionIfNeeded(BasicStatusHolder statusHolder, Build build, Promotion promotion) {
-        String status = promotion.getStatus();
-
-        if (statusHolder.hasErrors() || statusHolder.hasWarnings()) {
-            statusHolder.status("Skipping promotion status update: item promotion was completed with errors " +
-                    "and warnings.", log);
-            return;
-        }
-
-        if (StringUtils.isBlank(status)) {
-            statusHolder.status("Skipping promotion status update: no status received.", log);
-            return;
-        }
-
-        PromotionStatusBuilder statusBuilder = new PromotionStatusBuilder(status).
-                user(authorizationService.currentUsername()).repository(promotion.getTargetRepo()).
-                comment(promotion.getComment()).ciUser(promotion.getCiUser());
-
-        String timestamp = promotion.getTimestamp();
-
-        if (StringUtils.isNotBlank(timestamp)) {
-            try {
-                ISODateTimeFormat.dateTime().parseMillis(timestamp);
-            } catch (Exception e) {
-                statusHolder.error("Skipping promotion status update: invalid\\unparsable timestamp " + timestamp +
-                        ".", log);
-                return;
-            }
-            statusBuilder.timestamp(timestamp);
-        } else {
-            statusBuilder.timestampDate(new Date());
-        }
-
-        if (promotion.isDryRun()) {
-            return;
-        }
-
-        buildService.addPromotionStatus(build, statusBuilder.build());
-        log.info("Promotion completed successfully for build name '{}' and number '{}' with status of '{}'",
-                build.getName(), build.getNumber(), status);
-    }
-
-    private void promoteBuildItems(Promotion promotion, BasicStatusHolder status, Set<RepoPath> itemsToMove) {
-        String targetRepo = promotion.getTargetRepo();
-        boolean dryRun = promotion.isDryRun();
-        if (!itemsToMove.isEmpty()) {
-            if (promotion.isCopy()) {
-                try {
-                    status.merge(copy(itemsToMove, targetRepo, dryRun, promotion.isFailFast()));
-                } catch (Exception e) {
-                    log.error(e.getMessage(), e);
-                    status.error("Error occurred while copying: " + e.getMessage(), e, log);
-                }
-            } else {
-                try {
-                    status.merge(move(itemsToMove, targetRepo, dryRun, promotion.isFailFast()));
-                } catch (Exception e) {
-                    status.error("Error occurred while moving: " + e.getMessage(), e, log);
-                }
-            }
-        }
-    }
-
-    private void appendMessages(PromotionResult promotionResult, BasicStatusHolder statusHolder) {
-        for (StatusEntry statusEntry : statusHolder.getEntries()) {
-            promotionResult.messages.add(new PromotionResult.PromotionResultMessages(statusEntry));
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/build/BuildServiceImpl.java b/backend/core/src/main/java/org/artifactory/build/BuildServiceImpl.java
deleted file mode 100644
index af83542..0000000
--- a/backend/core/src/main/java/org/artifactory/build/BuildServiceImpl.java
+++ /dev/null
@@ -1,1113 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.build;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.*;
-import com.thoughtworks.xstream.XStream;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.io.filefilter.AbstractFileFilter;
-import org.apache.commons.io.filefilter.DirectoryFileFilter;
-import org.apache.commons.io.filefilter.IOFileFilter;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.blackduck.BlackDuckAddon;
-import org.artifactory.addon.license.LicensesAddon;
-import org.artifactory.addon.plugin.PluginsAddon;
-import org.artifactory.addon.plugin.build.AfterBuildSaveAction;
-import org.artifactory.addon.plugin.build.BeforeBuildSaveAction;
-import org.artifactory.api.build.*;
-import org.artifactory.api.build.diff.BuildParams;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.rest.artifact.PromotionResult;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.aql.AqlConverts;
-import org.artifactory.aql.AqlService;
-import org.artifactory.aql.api.domain.sensitive.AqlApiBuild;
-import org.artifactory.aql.api.domain.sensitive.AqlApiItem;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.model.AqlComparatorEnum;
-import org.artifactory.aql.result.AqlEagerResult;
-import org.artifactory.aql.result.rows.AqlBaseFullRowImpl;
-import org.artifactory.aql.util.AqlUtils;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.factory.xstream.XStreamFactory;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.common.ExportSettings;
-import org.artifactory.sapi.common.ImportSettings;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.storage.StorageException;
-import org.artifactory.storage.build.service.BuildStoreService;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.util.CollectionUtils;
-import org.artifactory.version.CompoundVersionDetails;
-import org.jfrog.build.api.Artifact;
-import org.jfrog.build.api.*;
-import org.jfrog.build.api.Dependency;
-import org.jfrog.build.api.Module;
-import org.jfrog.build.api.release.Promotion;
-import org.jfrog.build.api.release.PromotionStatus;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.io.*;
-import java.sql.SQLException;
-import java.util.*;
-import java.util.concurrent.Callable;
-import java.util.stream.Collectors;
-
-import static com.google.common.collect.Iterables.filter;
-import static com.google.common.collect.Iterables.getLast;
-import static com.google.common.collect.Lists.newArrayList;
-import static org.artifactory.aql.api.internal.AqlBase.and;
-
-/**
- * Build service main implementation
- *
- * @author Noam Y. Tenne
- */
- at Service
- at Reloadable(beanClass = InternalBuildService.class, initAfter = {DbService.class})
-public class BuildServiceImpl implements InternalBuildService {
-    public static final String BUILDS_EXPORT_DIR = "builds";
-    private static final Logger log = LoggerFactory.getLogger(BuildServiceImpl.class);
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Autowired
-    private AuthorizationService authorizationService;
-
-    @Autowired
-    private RepositoryService repositoryService;
-
-    @Autowired
-    private BuildStoreService buildStoreService;
-
-    @Autowired
-    private DbService dbService;
-
-    @Autowired(required = false)
-    private Builds builds;
-
-    @Autowired
-    private AqlService aqlService;
-
-    private XStream buildXStream;
-
-    @Override
-    public void init() {
-        buildXStream = XStreamFactory.create(ImportableExportableBuild.class);
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-        buildXStream = XStreamFactory.create(ImportableExportableBuild.class);
-    }
-
-    @Override
-    public void destroy() {
-        //Nothing to destroy
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-    }
-
-    @Override
-    public void addBuild(@Nonnull DetailedBuildRun detailedBuildRun) {
-        getTransactionalMe().addBuild(((DetailedBuildRunImpl) detailedBuildRun).build, false);
-    }
-
-    @Override
-    public void addBuild(final Build build) {
-        getTransactionalMe().addBuild(build, true);
-    }
-
-    @Override
-    public void addBuild(final Build build, boolean activateCallbacks) {
-        String buildName = build.getName();
-        String buildNumber = build.getNumber();
-        String buildStarted = build.getStarted();
-        String currentUser = authorizationService.currentUsername();
-
-        log.debug("Adding info for build '{}' #{} d{}", buildName, buildNumber, buildStarted);
-
-        build.setArtifactoryPrincipal(currentUser);
-        buildStoreService.populateMissingChecksums(build);
-
-        aggregatePreviousBuildIssues(build);
-
-        DetailedBuildRun detailedBuildRun = new DetailedBuildRunImpl(build);
-        PluginsAddon pluginsAddon = addonsManager.addonByType(PluginsAddon.class);
-        pluginsAddon.execPluginActions(BeforeBuildSaveAction.class, builds, detailedBuildRun);
-
-        buildStoreService.addBuild(build);
-
-        log.debug("Added info for build '{}' #{}", buildName, buildNumber);
-
-        log.debug("Running License check on build '{}' #{}", buildName, buildNumber);
-        LicensesAddon licensesAddon = addonsManager.addonByType(LicensesAddon.class);
-        licensesAddon.performOnBuildArtifacts(build);
-
-        log.debug("Governance check will attempt to run (if enabled) on build '{}' #{}", buildName, buildNumber);
-        BlackDuckAddon blackDuckAddon = addonsManager.addonByType(BlackDuckAddon.class);
-        blackDuckAddon.performBlackDuckOnBuildArtifacts(build);
-
-        //Abort calling plugin actions if called from papi to avoid accidental endless loops
-        if (activateCallbacks) {
-            pluginsAddon.execPluginActions(AfterBuildSaveAction.class, builds, detailedBuildRun);
-        }
-    }
-
-    /**
-     * Check if the latest build available has issues, add them all the our newly created build
-     * only if the previous build status is not in "Released" status (configurable status from our plugins).
-     * This way we collect all previous issues related to the same version which is not released yet.
-     *
-     * @param newBuild the newly created build to add previous issues to
-     */
-    private void aggregatePreviousBuildIssues(Build newBuild) {
-        Issues newBuildIssues = newBuild.getIssues();
-        if (newBuildIssues == null) {
-            return;
-        }
-
-        if (!newBuildIssues.isAggregateBuildIssues()) {
-            return;
-        }
-
-        Build latestBuild = getLatestBuildByNameAndStatus(newBuild.getName(), LATEST_BUILD);
-        if (latestBuild == null) {
-            return;
-        }
-
-        // Only aggregate if the previous build does not equal to the user requested status (e.g: "Released")
-        // this way we only aggregate the issues related to the current release
-        List<PromotionStatus> statuses = latestBuild.getStatuses();
-        if (statuses != null) {
-            String aggregationBuildStatus = newBuildIssues.getAggregationBuildStatus();
-            for (PromotionStatus status : statuses) {
-                if (status.getStatus().equalsIgnoreCase(aggregationBuildStatus)) {
-                    return;
-                }
-            }
-        }
-
-        // It is important to create new Issue instance so we won't mess up previous ones
-        Issues previousIssues = latestBuild.getIssues();
-        if (previousIssues != null) {
-            Set<Issue> affectedIssues = previousIssues.getAffectedIssues();
-            if (affectedIssues != null) {
-                for (Issue issue : affectedIssues) {
-                    Issue issueToAdd = new Issue(issue.getKey(), issue.getUrl(), issue.getSummary());
-                    issueToAdd.setAggregated(true);
-                    newBuildIssues.addIssue(issueToAdd);
-                }
-            }
-        }
-    }
-
-    @Override
-    public BuildRun getBuildRun(String buildName, String buildNumber, String buildStarted) {
-        return buildStoreService.getBuildRun(buildName, buildNumber, buildStarted);
-    }
-
-    @Override
-    public Build getBuild(BuildRun buildRun) {
-        return buildStoreService.getBuildJson(buildRun);
-    }
-
-    @Override
-    public String getBuildAsJson(BuildRun buildRun) {
-        return buildStoreService.getBuildAsJson(buildRun);
-    }
-
-    @Override
-    public void deleteBuild(String buildName, boolean deleteArtifacts, BasicStatusHolder multiStatusHolder) {
-        if (deleteArtifacts) {
-            Set<BuildRun> existingBuilds = searchBuildsByName(buildName);
-            for (BuildRun existingBuild : existingBuilds) {
-                removeBuildArtifacts(existingBuild, multiStatusHolder);
-            }
-        }
-        buildStoreService.deleteAllBuilds(buildName);
-    }
-
-    @Override
-    public void deleteBuild(BuildRun buildRun, boolean deleteArtifacts, BasicStatusHolder multiStatusHolder) {
-        multiStatusHolder.debug("Starting to remove build '" + buildRun.getName() +
-                "' #" + buildRun.getNumber(), log);
-        String buildName = buildRun.getName();
-        if (deleteArtifacts) {
-            removeBuildArtifacts(buildRun, multiStatusHolder);
-        }
-        buildStoreService.deleteBuild(buildName, buildRun.getNumber(), buildRun.getStarted());
-        Set<BuildRun> remainingBuilds = searchBuildsByName(buildName);
-        if (remainingBuilds.isEmpty()) {
-            deleteBuild(buildName, false, multiStatusHolder);
-        }
-        multiStatusHolder.debug("Finished removing build '" + buildRun.getName() +
-                "' #" + buildRun.getNumber(), log);
-    }
-
-    private void removeBuildArtifacts(BuildRun buildRun, BasicStatusHolder status) {
-        String buildName = buildRun.getName();
-        String buildNumber = buildRun.getNumber();
-        Build build = getBuild(buildRun);
-        status.debug("Starting to remove the artifacts of build '" + buildName + "' #" + buildNumber, log);
-        Set<ArtifactoryBuildArtifact> buildArtifactsInfos = getBuildArtifactsFileInfos(build, false, null, null);
-        for (ArtifactoryBuildArtifact artifact : buildArtifactsInfos) {
-            if (artifact.getFileInfo() != null) {
-                RepoPath repoPath = artifact.getFileInfo().getRepoPath();
-                BasicStatusHolder undeployStatus = repositoryService.undeploy(repoPath, true, true);
-                status.merge(undeployStatus);
-            }
-        }
-        status.debug("Finished removing the artifacts of build '" + buildName + "' #" + buildNumber, log);
-    }
-
-    @Override
-    public Build getLatestBuildByNameAndStatus(String buildName, final String buildStatus) {
-        if (StringUtils.isBlank(buildName)) {
-            return null;
-        }
-        if (StringUtils.isBlank(buildStatus)) {
-            return null;
-        }
-        //let's find all builds
-        Set<BuildRun> buildsByName = searchBuildsByName(buildName);
-        if (buildsByName == null || buildsByName.isEmpty()) { //no builds - no glory
-            return null;
-        }
-        List<BuildRun> buildRuns = newArrayList(buildsByName);
-        Collections.sort(buildRuns, BuildRunComparators.getComparatorFor(buildRuns));
-        BuildRun latestBuildRun;
-
-        if (buildStatus.equals(LATEST_BUILD)) {
-            latestBuildRun = getLast(buildRuns, null);
-        } else {
-            latestBuildRun = getLast(filter(buildRuns, new Predicate<BuildRun>() {
-                @Override
-                public boolean apply(BuildRun buildRun) {
-                    // Search for the latest build by the given status
-                    return buildStatus.equals(buildRun.getReleaseStatus());
-                }
-            }), null);
-
-        }
-        return latestBuildRun == null ? null :
-                getBuild(latestBuildRun);
-    }
-
-    @Override
-    public
-    @Nullable
-    Build getLatestBuildByNameAndNumber(String buildName, String buildNumber) {
-        if (StringUtils.isBlank(buildName)) {
-            return null;
-        }
-        return buildStoreService.getLatestBuild(buildName, buildNumber);
-    }
-
-    @Override
-    public Set<BuildRun> searchBuildsByName(String buildName) {
-        return buildStoreService.findBuildsByName(buildName);
-    }
-
-    @Override
-    public List<String> getBuildNames() {
-        List<String> allBuildNames = buildStoreService.getAllBuildNames();
-        Collections.sort(allBuildNames, null);
-        return allBuildNames;
-    }
-
-    @Override
-    public List<BuildRun> getAllPreviousBuilds(String buildName, String buildNumber, String buildStarted) {
-        final BuildRun currentBuildRun = getTransactionalMe().getBuildRun(buildName, buildNumber, buildStarted);
-        Set<BuildRun> buildRuns = searchBuildsByName(buildName);
-        final Comparator<BuildRun> buildNumberComparator = BuildRunComparators.getBuildStartDateComparator();
-        Iterables.removeIf(buildRuns, new Predicate<BuildRun>() {
-            @Override
-            public boolean apply(@Nullable BuildRun input) {
-                // Remove all builds equals or after the current one
-                return buildNumberComparator.compare(currentBuildRun, input) <= 0;
-            }
-        });
-
-        List<BuildRun> buildRunsList = Lists.newArrayList(buildRuns);
-        Comparator<BuildRun> reverseComparator = Collections.reverseOrder(buildNumberComparator);
-        Collections.sort(buildRunsList, reverseComparator);
-
-        return buildRunsList;
-    }
-
-    @Override
-    public Set<BuildRun> searchBuildsByNameAndNumber(String buildName, String buildNumber) {
-        return buildStoreService.findBuildsByNameAndNumber(buildName, buildNumber);
-    }
-
-    @Override
-    public Set<ArtifactoryBuildArtifact> getBuildArtifactsFileInfos(Build build, boolean useFallBack,
-            List<String> sourceRepos, List<String> excludedRepos) {
-        AqlBase.AndClause and = and();
-        log.debug("Executing Artifacts search for build {}:{}", build.getName(), build.getNumber());
-        addIncludeExcludeRepos(sourceRepos, excludedRepos, and, true);
-        and.append(AqlApiItem.property().property("build.name", AqlComparatorEnum.equals, build.getName()));
-        and.append(AqlApiItem.property().property("build.number", AqlComparatorEnum.equals, build.getNumber()));
-        AqlBase buildArtifactsQuery = AqlApiItem.create().filter(and);
-
-        AqlEagerResult<AqlBaseFullRowImpl> aqlResult = aqlService.executeQueryEager(buildArtifactsQuery);
-        log.debug("Search returned {} artifacts", aqlResult.getSize());
-        Multimap<String, Artifact> buildArtifacts = BuildServiceUtils.getBuildArtifacts(build);
-        log.debug("This build contains {} artifacts (taken from build info)", buildArtifacts.size());
-        List<String> virtualRepoKeys = getVirtualRepoKeys();
-        Set<ArtifactoryBuildArtifact> matchedArtifacts = matchArtifactsToFileInfos(aqlResult.getResults(),
-                buildArtifacts, virtualRepoKeys);
-        log.debug("Matched {} build artifacts to actual paths returned by search", matchedArtifacts.size());
-
-        //buildArtifacts contains all remaining artifacts that weren't matched - match them with the weak search
-        //only if indicated and if such remaining unmatched artifacts still exist in the map.
-        if (useFallBack && !buildArtifacts.isEmpty()) {
-            log.debug("Unmatched artifacts exist and 'use weak match fallback' flag is lit - executing weak match");
-            Set<ArtifactoryBuildArtifact> weaklyMatchedArtifacts = matchUnmatchedArtifactsNonStrict(build, sourceRepos,
-                    excludedRepos, buildArtifacts, virtualRepoKeys);
-            log.debug("Weak match has matched {} additional artifacts", weaklyMatchedArtifacts);
-            matchedArtifacts.addAll(weaklyMatchedArtifacts);
-        }
-        //Lastly, populate matchedArtifacts with all remaining unmatched artifacts with null values to help users of
-        //this function know if all build artifacts were found.
-        log.debug("{} artifacts were not matched to actual paths", buildArtifacts.size());
-        matchedArtifacts.addAll(buildArtifacts.values().stream()
-                .map(artifact -> new ArtifactoryBuildArtifact(artifact, null))
-                .collect(Collectors.toList()));
-        return matchedArtifacts;
-    }
-
-    private void addIncludeExcludeRepos(List<String> sourceRepos, List<String> excludedRepos, AqlBase.AndClause and,
-            boolean isStrict) {
-        if (CollectionUtils.notNullOrEmpty(sourceRepos)) {
-            log.debug("Search limited to repos: {}", sourceRepos.toString());
-            sourceRepos.stream()
-                    .filter(StringUtils::isNotBlank)
-                    .forEach(sourceRepo -> {
-                        if (isStrict) {
-                            and.append(AqlApiItem.repo().equal(sourceRepo));
-                        } else {
-                            and.append(AqlApiBuild.module().artifact().item().repo().equal(sourceRepo));
-                        }
-                    });
-        }
-        if (CollectionUtils.notNullOrEmpty(excludedRepos)) {
-            log.debug("Search excludes repos: {}", excludedRepos.toString());
-            excludedRepos.stream()
-                    .filter(StringUtils::isNotBlank)
-                    .forEach(excludedRepo -> {
-                        if (sourceRepos != null && sourceRepos.contains(excludedRepo)) {
-                            log.warn("Cannot exclude results from repo {} that is already in the source repo list",
-                                    excludedRepo, log);
-                        } else {
-                            if (isStrict) {
-                                and.append(AqlApiItem.repo().notEquals(excludedRepo));
-                            } else {
-                                and.append(AqlApiBuild.module().artifact().item().repo().equal(excludedRepo));
-                            }
-                        }
-                    });
-        }
-    }
-
-    /**
-     * Matches FileInfos to build artifacts(created from an aql query's result) by checksum and by artifact name.
-     * If indicated by {@param matchAnyChecksum} matches only by checksum if no exact match by name was found
-     */
-    /* This matching logic is kinda partial as we still can't match exactly sha1 to RepoPath because there's
-    * not enough information from the BuildInfo (just sha1 and artifact id). It will not harm promotion \ push to
-    * bintray etc. as ALL sha1's are still returned so nothing is skipped, this more of a UI issue that we are
-    * currently reluctant to resolve (i.e. by introducing a unique id in the BuildInfo and put it as a property)
-    */
-    private Set<ArtifactoryBuildArtifact> matchArtifactsToFileInfos(List<AqlBaseFullRowImpl> queryResults,
-            Multimap<String, Artifact> checksumToArtifactsMap, List<String> virtualRepoKeys) {
-        //Map<Artifact, FileInfo> foundResults = Maps.newHashMap();
-        Set<ArtifactoryBuildArtifact> results = Sets.newHashSet();
-        for (final AqlBaseFullRowImpl result : queryResults) {
-            //Don't include results from virtual repos
-            if (!virtualRepoKeys.contains(result.getRepo())) {
-                Collection<Artifact> artifacts = checksumToArtifactsMap.get(result.getActualSha1());
-                if (CollectionUtils.notNullOrEmpty(artifacts)) {
-                    //Try to match exactly by artifact name
-                    try {
-                        tryExactArtifactToFileInfoMatch(results, result, artifacts);
-                    } catch (Exception e) {
-                        //If no match just take the first artifact (it did match the checksum)
-                        matchAnyArtifactToFileInfo(results, result, artifacts);
-                    }
-                }
-            }
-        }
-        return results;
-    }
-
-    /**
-     * Tries to match an artifact to a path based on it's name. If a match is found it is added to the result set
-     * and removed from the liist
-     */
-    private void tryExactArtifactToFileInfoMatch(Set<ArtifactoryBuildArtifact> results, final AqlBaseFullRowImpl result,
-            Collection<Artifact> artifacts) {
-        Artifact idMatch = Iterables.find(artifacts, new Predicate<Artifact>() {
-            @Override
-            public boolean apply(Artifact input) {
-                return input.getName() != null && input.getName().equals(result.getName());
-            }
-        });
-        results.add(new ArtifactoryBuildArtifact(idMatch, (FileInfo) AqlConverts.toFileInfo.apply(result)));
-        log.debug("Matched artifact {} to path {}", idMatch.getName(), AqlUtils.fromAql(result));
-        artifacts.remove(idMatch);
-    }
-
-    private void matchAnyArtifactToFileInfo(Set<ArtifactoryBuildArtifact> results, AqlBaseFullRowImpl result,
-            Collection<Artifact> artifacts) {
-        Iterator<Artifact> artifactsIter = artifacts.iterator();
-        Artifact matchedArtifact = artifactsIter.next();
-        results.add(new ArtifactoryBuildArtifact(matchedArtifact, (FileInfo) AqlConverts.toFileInfo.apply(result)));
-        log.debug("Matched artifact {} to path {}", matchedArtifact.getName(), AqlUtils.fromAql(result));
-        //Remove artifact from list to ensure that we match everything
-        artifactsIter.remove();
-    }
-
-    /**
-     * The 'non-strict' variant of the artifact search is used as a fallback for artifacts that couldn't be matched by
-     * the regular property based search.
-     * AqlApiBuid.name() and AqlApiBuid.number() are considered 'weak' constraints as the linkage between aql domains is
-     * performed by sha1 - so we might end up 'finding' the wrong artifact (meaning the wrong repoPath that has a
-     * correct checksum - see todos above)
-     */
-    private Set<ArtifactoryBuildArtifact> matchUnmatchedArtifactsNonStrict(Build build, List<String> sourceRepos,
-            List<String> excludedRepos, Multimap<String, Artifact> unmatchedArtifacts, List<String> virtualRepoKeys) {
-        AqlBase.AndClause<AqlApiBuild> and = AqlApiBuild.and(
-                AqlApiBuild.name().equal(build.getName()),
-                AqlApiBuild.number().equal(build.getNumber())
-        );
-        log.debug("Executing 'non-strict' Artifacts search for build {}:{}", build.getName(), build.getNumber());
-        addIncludeExcludeRepos(sourceRepos, excludedRepos, and, false);
-        AqlBase nonStrictQuery = AqlApiBuild.create().filter(and);
-        nonStrictQuery.include(
-                AqlApiBuild.module().artifact().item().sha1Actual(),
-                AqlApiBuild.module().artifact().item().md5Actual(),
-                AqlApiBuild.module().artifact().item().sha1Original(),
-                AqlApiBuild.module().artifact().item().md5Orginal(),
-                AqlApiBuild.module().artifact().item().created(),
-                AqlApiBuild.module().artifact().item().modifiedBy(),
-                AqlApiBuild.module().artifact().item().createdBy(),
-                AqlApiBuild.module().artifact().item().updated(),
-                AqlApiBuild.module().artifact().item().repo(),
-                AqlApiBuild.module().artifact().item().path(),
-                AqlApiBuild.module().artifact().item().size(),
-                AqlApiBuild.module().artifact().item().name()
-                //Ordering by the last updated field, in case of duplicates with the same checksum
-                //Since this is match any checksum mode
-        ).addSortElement(AqlApiBuild.module().artifact().item().updated()).desc();
-
-
-        AqlEagerResult<AqlBaseFullRowImpl> aqlResult = aqlService.executeQueryEager(nonStrictQuery);
-        log.debug("Search returned {} artifacts", aqlResult.getSize());
-        return matchArtifactsToFileInfos(aqlResult.getResults(), unmatchedArtifacts, virtualRepoKeys);
-    }
-
-    @Override
-    public Map<Dependency, FileInfo> getBuildDependenciesFileInfos(Build build) {
-        AqlBase.AndClause<AqlApiBuild> and = AqlApiBuild.and(
-                AqlApiBuild.name().equal(build.getName()),
-                AqlApiBuild.number().equal(build.getNumber())
-        );
-        log.debug("Executing dependencies search for build {}:{}", build.getName(), build.getNumber());
-
-        AqlBase buildDependenciesQuery = AqlApiBuild.create().filter(and);
-        buildDependenciesQuery.include(
-                AqlApiBuild.module().dependecy().name(),
-                AqlApiBuild.module().dependecy().item().sha1Actual(),
-                AqlApiBuild.module().dependecy().item().md5Actual(),
-                AqlApiBuild.module().dependecy().item().sha1Original(),
-                AqlApiBuild.module().dependecy().item().md5Orginal(),
-                AqlApiBuild.module().dependecy().item().created(),
-                AqlApiBuild.module().dependecy().item().modifiedBy(),
-                AqlApiBuild.module().dependecy().item().createdBy(),
-                AqlApiBuild.module().dependecy().item().updated(),
-                AqlApiBuild.module().dependecy().item().repo(),
-                AqlApiBuild.module().dependecy().item().path(),
-                AqlApiBuild.module().dependecy().item().name(),
-                AqlApiBuild.module().dependecy().item().size()
-                //Ordering by the last updated field, in case of duplicates with the same checksum.
-        ).addSortElement(AqlApiBuild.module().dependecy().item().updated()).asc();
-
-        AqlEagerResult<AqlBaseFullRowImpl> results = aqlService.executeQueryEager(buildDependenciesQuery);
-        log.debug("Search returned {} dependencies", results.getSize());
-        Multimap<String, Dependency> buildDependencies = BuildServiceUtils.getBuildDependencies(build);
-        log.debug("This build contains {} dependencies (taken from build info)", buildDependencies.size());
-        Map<Dependency, FileInfo> matchedDependencies = matchDependenciesToFileInfos(results.getResults(),
-                buildDependencies);
-        log.debug("Matched {} build dependencies to actual paths returned by search", matchedDependencies.size());
-
-        //Lastly, populate matchedDependencies with all remaining unmatched dependencies with null values to help users
-        //of this function know if all build artifacts were found.
-        log.debug("{} dependencies were not matched to actual paths", buildDependencies.size());
-        for (Dependency dependency : buildDependencies.values()) {
-            if (!matchedDependencies.containsKey(dependency)) {
-                matchedDependencies.put(dependency, null);
-            }
-        }
-        return matchedDependencies;
-    }
-
-    /**
-     * We're making a best effort to guess the relevant dependency according to the id given by the BuildInfo,
-     * if indeed more than one dependency is a match for the checksum. if not - the one found is used.
-     * Unlike matching the build's artifacts above, a weak match is enough and maybe even recommended here as
-     * dependencies might move around or get deleted and we will still find a correct one from another repo.
-     */
-    private Map<Dependency, FileInfo> matchDependenciesToFileInfos(List<AqlBaseFullRowImpl> queryResults,
-            Multimap<String, Dependency> checksumToDependencyMap) {
-
-        List<String> virtualRepoKeys = getVirtualRepoKeys();
-        Map<Dependency, FileInfo> foundResults = Maps.newHashMap();
-        for (final AqlBaseFullRowImpl result : queryResults) {
-            //Don't include results from virtual repos
-            if (!virtualRepoKeys.contains(result.getRepo())) {
-                Collection<Dependency> dependencies = checksumToDependencyMap.get(result.getActualSha1());
-                if (!CollectionUtils.isNullOrEmpty(dependencies)) {
-                    FileInfo dependencyFileInfo;
-                    try {
-                        dependencyFileInfo = (FileInfo) AqlConverts.toFileInfo.apply(result);
-                        //Try matching dependencies exactly by id and add them to the results, overwriting previously
-                        //found (maybe not exactly matched) dependencies
-                        tryExactDependencyMatch(foundResults, result, dependencies, dependencyFileInfo);
-                        //Add all dependencies that weren't matched yet to make sure we don't leave false unmatched ones
-                        matchAnyDependencyToFileInfo(foundResults, dependencies, dependencyFileInfo);
-                    } catch (Exception e) {
-                        log.debug("Error creating path from aql result: {} :\n {}", result.toString(), e.getMessage());
-                    }
-                }
-            }
-        }
-        return foundResults;
-    }
-
-
-    /**
-     * Tries to match dependencies exactly to a path (file info) based on the dependency's name, and adds matched
-     * dependencies to the result map.
-     */
-    private void tryExactDependencyMatch(Map<Dependency, FileInfo> foundResults, final AqlBaseFullRowImpl result,
-            Collection<Dependency> dependencies, FileInfo dependencyFileInfo) {
-
-        Iterable<Dependency> exactMatches = Iterables.filter(dependencies, new Predicate<Dependency>() {
-            @Override
-            public boolean apply(Dependency input) {
-                return input.getId() != null && input.getId().contains(result.getBuildDependencyName());
-            }
-        });
-        for (Dependency exactMatch : exactMatches) {
-            log.debug("Exactly matched dependency {} to path {}", exactMatch.getId(),
-                    dependencyFileInfo.getRepoPath().toString());
-            foundResults.put(exactMatch, dependencyFileInfo);
-        }
-    }
-
-    /**
-     * Adds each dependency in the collection to the result map, if it was not already matched before.
-     */
-    private void matchAnyDependencyToFileInfo(Map<Dependency, FileInfo> foundResults,
-            Collection<Dependency> dependencies, FileInfo dependencyFileInfo) {
-        for (Dependency dependency : dependencies) {
-            if (!foundResults.containsKey(dependency)) {
-                log.debug("Matched dependency {} to path {}", dependency.getId(),
-                        dependencyFileInfo.getRepoPath().toString());
-                foundResults.put(dependency, dependencyFileInfo);
-            }
-        }
-    }
-
-
-    @Override
-    public void exportTo(ExportSettings settings) {
-        MutableStatusHolder multiStatusHolder = settings.getStatusHolder();
-        multiStatusHolder.debug("Starting build info export", log);
-
-        File buildsFolder = new File(settings.getBaseDir(), BUILDS_EXPORT_DIR);
-        prepareBuildsFolder(settings, multiStatusHolder, buildsFolder);
-        if (multiStatusHolder.isError()) {
-            return;
-        }
-
-        try {
-            long exportedBuildCount = 1;
-            List<String> buildNames = buildStoreService.getAllBuildNames();
-            for (String buildName : buildNames) {
-                Set<BuildRun> buildsByName = buildStoreService.findBuildsByName(buildName);
-                for (BuildRun buildRun : buildsByName) {
-                    String buildNumber = buildRun.getNumber();
-                    try {
-                        exportBuild(settings, buildRun, exportedBuildCount, buildsFolder);
-                        exportedBuildCount++;
-                    } catch (Exception e) {
-                        String errorMessage = String.format("Failed to export build info: %s:%s", buildName,
-                                buildNumber);
-                        if (settings.isFailFast()) {
-                            throw new Exception(errorMessage, e);
-                        }
-                        multiStatusHolder.error(errorMessage, e, log);
-                    }
-                }
-            }
-        } catch (Exception e) {
-            multiStatusHolder.error("Error occurred during build info export.", e, log);
-        }
-
-        if (settings.isIncremental() && !multiStatusHolder.isError()) {
-            try {
-                log.debug("Cleaning previous builds backup folder.");
-
-                File[] backupDirsToRemove = settings.getBaseDir().listFiles(new FilenameFilter() {
-
-                    @Override
-                    public boolean accept(File dir, String name) {
-                        return name.startsWith(BACKUP_BUILDS_FOLDER);
-                    }
-                });
-                if (backupDirsToRemove != null) {
-                    for (File backupDirToRemove : backupDirsToRemove) {
-                        log.debug("Cleaning previous build backup folder: {}", backupDirToRemove.getAbsolutePath());
-                        FileUtils.forceDelete(backupDirToRemove);
-                    }
-                }
-            } catch (IOException e) {
-                multiStatusHolder.error("Failed to clean previous builds backup folder.", e, log);
-            }
-        }
-
-        multiStatusHolder.debug("Finished build info export", log);
-    }
-
-    /**
-     * Makes sure that all the correct build/backup dirs are prepared for backup
-     *
-     * @param settings          Export settings
-     * @param multiStatusHolder Process status holder
-     * @param buildsFolder      Builds folder within the backup
-     */
-    private void prepareBuildsFolder(ExportSettings settings, MutableStatusHolder multiStatusHolder,
-            File buildsFolder) {
-        if (buildsFolder.exists()) {
-            // Backup previous builds folder if incremental
-            if (settings.isIncremental()) {
-                File tempBuildBackupDir = new File(settings.getBaseDir(),
-                        BACKUP_BUILDS_FOLDER + "." + System.currentTimeMillis());
-                try {
-                    FileUtils.moveDirectory(buildsFolder, tempBuildBackupDir);
-                    FileUtils.forceMkdir(buildsFolder);
-                } catch (IOException e) {
-                    multiStatusHolder.error(
-                            "Failed to create incremental builds temp backup dir: " + tempBuildBackupDir, e, log);
-                }
-            }
-        } else {
-            try {
-                FileUtils.forceMkdir(buildsFolder);
-            } catch (IOException e) {
-                multiStatusHolder.error("Failed to create builds backup dir: " + buildsFolder, e, log);
-            }
-        }
-    }
-
-    @Override
-    public void importFrom(ImportSettings settings) {
-        final MutableStatusHolder multiStatusHolder = settings.getStatusHolder();
-        multiStatusHolder.status("Starting build info import", log);
-
-        dbService.invokeInTransaction("BuildImport-deleteAllBuilds", new Callable<Object>() {
-            @Override
-            public Object call() throws Exception {
-                try {
-                    // delete all existing builds
-                    buildStoreService.deleteAllBuilds();
-                } catch (Exception e) {
-                    multiStatusHolder.error("Failed to delete builds root node", e, log);
-                }
-                return null;
-            }
-        });
-
-        File buildsFolder = new File(settings.getBaseDir(), BUILDS_EXPORT_DIR);
-        String buildsFolderPath = buildsFolder.getPath();
-        if (!buildsFolder.exists()) {
-            multiStatusHolder.status("'" + buildsFolderPath + "' folder is either non-existent or not a " +
-                    "directory. Build info import was not performed", log);
-            return;
-        }
-
-        IOFileFilter buildExportFileFilter = new AbstractFileFilter() {
-            @Override
-            public boolean accept(File file) {
-                String fileName = file.getName();
-                return fileName.startsWith("build") && fileName.endsWith(".xml");
-            }
-        };
-
-        Collection<File> buildExportFiles =
-                FileUtils.listFiles(buildsFolder, buildExportFileFilter, DirectoryFileFilter.DIRECTORY);
-
-        if (buildExportFiles.isEmpty()) {
-            multiStatusHolder.status("'" + buildsFolderPath + "' folder does not contain build export files. " +
-                    "Build info import was not performed", log);
-            return;
-        }
-
-        importBuildFiles(settings, buildExportFiles);
-        multiStatusHolder.status("Finished build info import", log);
-    }
-
-    @Override
-    public void importBuild(ImportSettings settings, ImportableExportableBuild build) throws Exception {
-        String buildName = build.getBuildName();
-        MutableStatusHolder multiStatusHolder = settings.getStatusHolder();
-        String buildNumber = build.getBuildNumber();
-        String buildStarted = build.getBuildStarted();
-        try {
-            multiStatusHolder.debug(
-                    String.format("Beginning import of build: %s:%s:%s", buildName, buildNumber, buildStarted), log);
-            buildStoreService.addBuild(build.getJson());
-        } catch (Exception e) {
-            String msg = "Could not import build " + buildName + ":" + buildNumber + ":" + buildStarted;
-            // Print stack trace in debug
-            log.debug(msg, e);
-            multiStatusHolder.error(msg, e, log);
-        }
-        multiStatusHolder.debug(
-                String.format("Finished import of build: %s:%s:%s", buildName, buildNumber, buildStarted), log);
-    }
-
-    @Override
-    public Set<String> findScopes(Build build) {
-        final Set<String> scopes = Sets.newHashSet();
-        if (build.getModules() != null) {
-            for (Module module : build.getModules()) {
-                if (module.getDependencies() != null) {
-                    for (Dependency dependency : module.getDependencies()) {
-                        Set<String> dependencyScopes = dependency.getScopes();
-                        if (dependencyScopes != null) {
-                            for (String dependencyScope : dependencyScopes) {
-                                if (StringUtils.isBlank(dependencyScope)) {
-                                    scopes.add(UNSPECIFIED_SCOPE);
-                                } else {
-                                    scopes.add(dependencyScope);
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        return scopes;
-    }
-
-    @Override
-    public boolean isGenericBuild(Build build) {
-        BuildAgent buildAgent = build.getBuildAgent();
-        if (buildAgent != null) {
-            String buildAgentName = buildAgent.getName();
-            return !"ivy".equalsIgnoreCase(buildAgentName) && !"maven".equalsIgnoreCase(buildAgentName) &&
-                    !"gradle".equalsIgnoreCase(buildAgentName) && !"MSBuild".equalsIgnoreCase(buildAgentName);
-        }
-
-        BuildType type = build.getType();
-        return BuildType.ANT.equals(type) || BuildType.GENERIC.equals(type);
-    }
-
-    @Override
-    public PromotionResult promoteBuild(BuildRun buildRun, Promotion promotion) {
-        BuildPromotionHelper buildPromotionHelper = new BuildPromotionHelper();
-        return buildPromotionHelper.promoteBuild(buildRun, promotion);
-    }
-
-    @Override
-    public void renameBuilds(String from, String to) {
-        Set<BuildRun> buildsToRename = searchBuildsByName(from);
-        if (buildsToRename.isEmpty()) {
-            log.error("Could not find builds by the name '{}'. No builds were renamed.", from);
-            return;
-        }
-
-        for (BuildRun buildToRename : buildsToRename) {
-            try {
-                getTransactionalMe().renameBuild(buildToRename, to);
-                log.info("Renamed build number '{}' that started at '{}' from '{}' to '{}'.", new String[]{
-                        buildToRename.getNumber(), buildToRename.getStarted(), buildToRename.getName(), to});
-            } catch (Exception e) {
-                log.error("Failed to rename build: '{}' #{} that started at {}.", new String[]{buildToRename.getName(),
-                        buildToRename.getNumber(), buildToRename.getStarted()});
-            }
-        }
-    }
-
-    @Override
-    public void renameBuild(BuildRun buildRun, String to) {
-        Build build = buildStoreService.getBuildJson(buildRun);
-        if (build == null) {
-            throw new StorageException("Cannot rename non existent build " + buildRun);
-        }
-        boolean changed = false;
-        if (!StringUtils.equals(build.getName(), to)) {
-            build.setName(to);
-            changed = true;
-        }
-        if (!StringUtils.equals(buildRun.getName(), to)) {
-            changed = true;
-        }
-        if (!changed) {
-            log.info("Build " + buildRun + " already named " + to + " nothing to do!");
-        }
-        buildStoreService.renameBuild(buildRun, build, authorizationService.currentUsername());
-    }
-
-    @Override
-    //Deletes the existing build (which has the same name, number and started) and adds the new one instead.
-    public void updateBuild(@Nonnull DetailedBuildRun detailedBuildRun) {
-        //getTransactionalMe().updateBuild(((DetailedBuildRunImpl) detailedBuildRun).build, true);
-        BasicStatusHolder status = new BasicStatusHolder();
-
-        //Reaching update implies the same build (name, number and started) already exists
-        log.info("Updating build {} Number {} that started at {}", detailedBuildRun.getName(),
-                detailedBuildRun.getNumber(), detailedBuildRun.getStarted(), log);
-        log.debug("Deleting build {} : {} : {}", detailedBuildRun.getName(), detailedBuildRun.getNumber(),
-                detailedBuildRun.getStarted(), log);
-        getTransactionalMe().deleteBuild(detailedBuildRun, false, status);
-        if (status.hasErrors()) {
-            log.error(status.getLastError().toString(), log);
-        }
-        log.debug("Adding new build {} : {} : {}", detailedBuildRun.getName(), detailedBuildRun.getNumber(),
-                detailedBuildRun.getStarted(), log);
-        getTransactionalMe().addBuild(detailedBuildRun);
-
-        log.info("Update of build {} Number {} that started at {} completed successfully", detailedBuildRun.getName(),
-                detailedBuildRun.getNumber(), detailedBuildRun.getStarted(), log);
-    }
-
-    @Override
-    public void updateBuild(final Build build, boolean updateChecksumProperties) {
-    }
-
-    @Override
-    public void addPromotionStatus(Build build, PromotionStatus promotion) {
-        buildStoreService.addPromotionStatus(build, promotion, authorizationService.currentUsername());
-    }
-
-    @Nullable
-    @Override
-    public List<PublishedModule> getPublishedModules(String buildName, String date, String orderBy, String direction, String offset, String limit) {
-        return buildStoreService.getPublishedModules(buildName, date, orderBy, direction, offset, limit);
-    }
-
-    @Nullable
-    @Override
-    public List<ModuleArtifact> getModuleArtifact(String buildName, String buildNumber, String moduleId, String date, String orderBy, String direction, String offset, String limit) {
-        return buildStoreService.getModuleArtifact(buildName, buildNumber, moduleId, date, orderBy, direction, offset,
-                limit);
-    }
-
-    @Nullable
-    @Override
-    public List<ModuleDependency> getModuleDependency(String buildNumber, String moduleId, String date, String orderBy, String direction, String offset, String limit) {
-        return buildStoreService.getModuleDependency(buildNumber, moduleId, date, orderBy, direction, offset, limit);
-    }
-
-
-    @Nullable
-    @Override
-    public int getModuleArtifactCount(String buildNumber, String moduleId, String date) {
-        return buildStoreService.getModuleArtifactCount(buildNumber, moduleId, date);
-    }
-
-    @Nullable
-    @Override
-    public int getModuleDependencyCount(String buildNumber, String moduleId, String date) {
-        return buildStoreService.getModuleDependenciesCount(buildNumber, moduleId, date);
-    }
-
-
-    @Override
-    public int getPublishedModulesCounts(String buildName, String date) {
-        return buildStoreService.getPublishedModulesCounts(buildName, date);
-    }
-
-    private void exportBuild(ExportSettings settings, BuildRun buildRun,
-            long exportedBuildCount, File buildsFolder) throws Exception {
-        MutableStatusHolder multiStatusHolder = settings.getStatusHolder();
-
-        String buildName = buildRun.getName();
-        String buildNumber = buildRun.getNumber();
-        String buildStarted = buildRun.getStarted();
-        multiStatusHolder.debug(
-                String.format("Beginning export of build: %s:%s:%s", buildName, buildNumber, buildStarted), log);
-
-        ImportableExportableBuild exportedBuild = buildStoreService.getExportableBuild(buildRun);
-
-        File buildFile = new File(buildsFolder, "build" + Long.toString(exportedBuildCount) + ".xml");
-        exportBuildToFile(exportedBuild, buildFile);
-
-        multiStatusHolder.debug(
-                String.format("Finished export of build: %s:%s:%s", buildName, buildNumber, buildStarted), log);
-    }
-
-    private void importBuildFiles(ImportSettings settings, Collection<File> buildExportFiles) {
-        for (File buildExportFile : buildExportFiles) {
-            FileInputStream inputStream = null;
-            try {
-                inputStream = new FileInputStream(buildExportFile);
-                ImportableExportableBuild importableBuild = (ImportableExportableBuild) buildXStream
-                        .fromXML(inputStream);
-                // import each build in a separate transaction
-                getTransactionalMe().importBuild(settings, importableBuild);
-            } catch (Exception e) {
-                settings.getStatusHolder().error("Error occurred during build info import", e, log);
-                if (settings.isFailFast()) {
-                    break;
-                }
-            } finally {
-                IOUtils.closeQuietly(inputStream);
-            }
-        }
-    }
-
-    private void exportBuildToFile(ImportableExportableBuild exportedBuild, File buildFile) throws Exception {
-        FileOutputStream buildFileOutputStream = null;
-        try {
-            buildFileOutputStream = new FileOutputStream(buildFile);
-            buildXStream.toXML(exportedBuild, buildFileOutputStream);
-        } finally {
-            IOUtils.closeQuietly(buildFileOutputStream);
-        }
-    }
-
-    /**
-     * Returns an internal instance of the service
-     *
-     * @return InternalBuildService
-     */
-    private InternalBuildService getTransactionalMe() {
-        return ContextHelper.get().beanForType(InternalBuildService.class);
-    }
-
-    private List<String> getVirtualRepoKeys() {
-        List<String> virtualKeys = Lists.newArrayList();
-        for (RepoDescriptor virtualDescriptor : repositoryService.getVirtualRepoDescriptors()) {
-            virtualKeys.add(virtualDescriptor.getKey());
-        }
-        return virtualKeys;
-    }
-
-    @Override
-    public void deleteAllBuilds(String buildName) {
-        if (authorizationService.isAdmin()) {
-            buildStoreService.deleteAllBuilds(buildName);
-        }
-    }
-
-    @Override
-    public List<ModuleArtifact> getModuleArtifactsForDiffWithPaging(BuildParams buildParams, String offset, String limit) {
-        return buildStoreService.getModuleArtifactsForDiffWithPaging(buildParams, offset, limit);
-    }
-
-    @Override
-    public int getModuleArtifactsForDiffCount(BuildParams buildParams, String offset, String limit) {
-        return buildStoreService.getModuleArtifactsForDiffCount(buildParams, offset, limit);
-    }
-
-    @Override
-    public List<ModuleDependency> getModuleDependencyForDiffWithPaging(BuildParams buildParams, String offset, String limit) {
-        return buildStoreService.getModuleDependencyForDiffWithPaging(buildParams, offset, limit);
-    }
-
-    @Override
-    public int getModuleDependencyForDiffCount(BuildParams buildParams, String offset, String limit) {
-        return buildStoreService.getModuleDependencyForDiffCount(buildParams, offset, limit);
-    }
-
-    @Override
-    public List<GeneralBuild> getPrevBuildsList(String buildName, String buildDate) {
-        return buildStoreService.getPrevBuildsList(buildName, buildDate);
-    }
-
-    @Override
-    public List<BuildProps> getBuildProps(BuildParams buildParams, String offset, String limit) {
-        return buildStoreService.getBuildProps(buildParams, offset, limit);
-    }
-
-    @Override
-    public int getPropsDiffCount(BuildParams buildParams) {
-        return buildStoreService.getPropsDiffCount(buildParams);
-    }
-
-    @Override
-    public List<BuildProps> getBuildPropsData(BuildParams buildParams, String offset, String limit, String orderBy) {
-        return buildStoreService.getBuildPropsData(buildParams, offset, limit, orderBy);
-    }
-
-    @Override
-    public long getBuildPropsCounts(BuildParams buildParams) {
-        return buildStoreService.getBuildPropsCounts(buildParams);
-    }
-
-    @Override
-    public Map<String, ModuleArtifact> getAllModuleArtifacts(String buildNumber, String moduleId, String date, String orderBy, String direction, String offset, String limit) {
-        return null;
-    }
-
-    @Override
-    public Set<BuildRun> getLatestBuildsPaging(String offset, String orderBy, String direction, String limit) {
-        BuildStoreService buildStoreService = ContextHelper.get().beanForType(BuildStoreService.class);
-        return buildStoreService.getLatestBuildsPaging(offset, orderBy, direction, limit);
-    }
-
-    @Override
-    public List<GeneralBuild> getBuildForNamePaging(String buildName, String orderBy, String direction, String offset,
-            String limit) throws
-            SQLException {
-        BuildStoreService buildStoreService = ContextHelper.get().beanForType(BuildStoreService.class);
-        return buildStoreService.getBuildForNamePaging(buildName, orderBy, direction, offset, limit);
-    }
-
-    public List<FileInfo> collectBuildArtifacts(Build build, @Nullable List<String> sourceRepos,
-            @Nullable List<String> excludedRepos, @Nullable BasicStatusHolder status) {
-        status = status == null ? new BasicStatusHolder() : status;
-        log.info("Collecting Build artifacts for build {}:{}", build.getName(), build.getNumber());
-        Set<ArtifactoryBuildArtifact> infos = getBuildArtifactsFileInfos(build, false, sourceRepos, excludedRepos);
-        BuildServiceUtils.verifyAllArtifactInfosExistInSet(build, true, status, infos,
-                BuildServiceUtils.VerifierLogLevel.warn);
-        return Lists.newArrayList(BuildServiceUtils.toFileInfoList(infos));
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/build/BuildServiceUtils.java b/backend/core/src/main/java/org/artifactory/build/BuildServiceUtils.java
deleted file mode 100644
index 1a128ff..0000000
--- a/backend/core/src/main/java/org/artifactory/build/BuildServiceUtils.java
+++ /dev/null
@@ -1,190 +0,0 @@
-package org.artifactory.build;
-
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.HashMultimap;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Multimap;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.fs.FileInfo;
-import org.jfrog.build.api.Artifact;
-import org.jfrog.build.api.Build;
-import org.jfrog.build.api.BuildFileBean;
-import org.jfrog.build.api.Dependency;
-import org.jfrog.build.api.Module;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nullable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Dan Feldman
- */
-public class BuildServiceUtils {
-    private static final Logger log = LoggerFactory.getLogger(BuildServiceUtils.class);
-
-    public static Iterable<FileInfo> filterOutNullFileInfos(Iterable<FileInfo> rawInfos) {
-        return Iterables.filter(rawInfos, filterNullFileInfos);
-    }
-
-    private static Predicate<FileInfo> filterNullFileInfos = new Predicate<FileInfo>() {
-        @Override
-        public boolean apply(@Nullable FileInfo input) {
-            return input != null;
-        }
-    };
-
-    public static Iterable<FileInfo> toFileInfoList(Set<ArtifactoryBuildArtifact> artifacts) {
-        return Iterables.transform(artifacts, new Function<ArtifactoryBuildArtifact, FileInfo>() {
-            @Nullable
-            @Override
-            public FileInfo apply(@Nullable ArtifactoryBuildArtifact input) {
-                return input != null ? input.getFileInfo() : null;
-            }
-        });
-    }
-
-    /**
-     * Makes a best effort to match an artifact exactly by name and also by the path's filename.
-     * If not exact use artifact name match as next best bet.
-     * Optionally removes matched artifacts from the map to help next searches.
-     */
-    public static FileInfo findArtifactFileInfoInSet(Set<ArtifactoryBuildArtifact> artifactsToSearch,
-            final Artifact artifactToFind, boolean eliminateMatches) {
-
-        ArtifactoryBuildArtifact match = Iterables.find(artifactsToSearch,
-                new Predicate<ArtifactoryBuildArtifact>() {
-                    @Override
-                    public boolean apply(@Nullable ArtifactoryBuildArtifact input) {
-                        return artifactToFind != null && input != null
-                                && artifactToFind.getName().equals(input.getArtifact().getName())
-                                && artifactToFind.getSha1().equals(input.getArtifact().getSha1());
-                    }
-                }, null);
-        if (eliminateMatches && match != null) {
-            artifactsToSearch.remove(match);
-        }
-        return match != null ? match.getFileInfo() : null;
-    }
-
-    /**
-     * Map all build dependencies to checksum, held in a multimap for occurrences of duplicate checksum for different
-     * dependencies --> although we cannot be 100% positive which dependency took part in the build with the current
-     * BuildInfo implementation.
-     */
-    public static Multimap<String, org.jfrog.build.api.Dependency> getBuildDependencies(Build build) {
-        Multimap<String, org.jfrog.build.api.Dependency> beansMap = HashMultimap.create();
-        List<org.jfrog.build.api.Module> modules = build.getModules();
-        if (modules == null) {
-            return beansMap;
-        }
-        for (org.jfrog.build.api.Module module : modules) {
-            if (module.getDependencies() != null) {
-                for (org.jfrog.build.api.Dependency dependency : module.getDependencies()) {
-                    if (dependency.getSha1() != null) {
-                        beansMap.put(dependency.getSha1(), dependency);
-                    } else {
-                        log.warn("Dependency: " + dependency.getId() + " is missing SHA1," + " under build: "
-                                + build.getName());
-                    }
-                }
-            }
-        }
-        return beansMap;
-    }
-
-    /**
-     * Map all build artifacts to checksum, held in a multimap for occurrences of duplicate checksum for different
-     * artifacts so that the search results return all
-     */
-    public static Multimap<String, org.jfrog.build.api.Artifact> getBuildArtifacts(Build build) {
-        //ListMultiMap to hold possible duplicate artifacts coming from BuildInfo
-        Multimap<String, org.jfrog.build.api.Artifact> beansMap = ArrayListMultimap.create();
-
-        List<org.jfrog.build.api.Module> modules = build.getModules();
-        if (modules == null) {
-            return beansMap;
-        }
-        for (Module module : modules) {
-            if (module.getArtifacts() != null) {
-                for (Artifact artifact : module.getArtifacts()) {
-                    if (artifact.getSha1() != null) {
-                        beansMap.put(artifact.getSha1(), artifact);
-                    } else {
-                        log.warn("Artifact: " + artifact.getName() + " is missing SHA1," + " under build: "
-                                + build.getName());
-                    }
-                }
-            }
-        }
-        return beansMap;
-    }
-
-    public static void verifyAllArtifactInfosExistInSet(Build build, boolean cleanNullEntries,
-            BasicStatusHolder statusHolder, Set<ArtifactoryBuildArtifact> buildArtifactsInfos,
-            VerifierLogLevel logLevel) {
-        for (Iterator<ArtifactoryBuildArtifact> iter = buildArtifactsInfos.iterator(); iter.hasNext(); ) {
-            ArtifactoryBuildArtifact artifact = iter.next();
-            if (artifact.getFileInfo() == null) {
-                String errorMsg = "Unable to find artifact '" + artifact.getArtifact().getName() + "' of build '" + build.getName()
-                        + "' #" + build.getNumber();
-                logToStatus(statusHolder, errorMsg, logLevel);
-                if (cleanNullEntries) {
-                    iter.remove();
-                }
-            }
-        }
-    }
-
-    /**
-     * Verifies all dependencies from the build exist in the map and writes appropriate entries to the StatusHolder
-     * based on the chosen log level.
-     * NOTE: Relies on missing dependency to have a null mapping (as returned by {@link getBuildDependenciesFileInfos}
-     *
-     * @param build                 Build to verify
-     * @param statusHolder          StatusHolder that entries will be written into
-     * @param buildDependenciesInfo Mapping of Dependencies to FileInfos
-     */
-    public static void verifyAllDependencyInfosExistInMap(Build build, boolean cleanNullEntries,
-            BasicStatusHolder statusHolder, Map<org.jfrog.build.api.Dependency, FileInfo> buildDependenciesInfo,
-            VerifierLogLevel logLevel) {
-
-        List<BuildFileBean> keysToRemove = Lists.newArrayList();
-        for (Map.Entry<Dependency, FileInfo> entry : buildDependenciesInfo.entrySet()) {
-            if (entry.getValue() == null) {
-                String errorMsg = "Unable to find dependency '" + entry.getKey().getId() + "' of build '"
-                        + build.getName() + "' #" + build.getNumber();
-                keysToRemove.add(entry.getKey());
-                logToStatus(statusHolder, errorMsg, logLevel);
-            }
-        }
-        if (cleanNullEntries) {
-            for (BuildFileBean keyToRemove : keysToRemove) {
-                buildDependenciesInfo.remove(keyToRemove);
-            }
-        }
-    }
-
-    private static void logToStatus(BasicStatusHolder statusHolder, String errorMsg, VerifierLogLevel logLevel) {
-        switch (logLevel) {
-            case err:
-                statusHolder.error(errorMsg, log);
-                break;
-            case warn:
-                statusHolder.warn(errorMsg, log);
-                break;
-            case debug:
-                statusHolder.debug(errorMsg, log);
-        }
-    }
-
-    public enum VerifierLogLevel {
-        err, warn, debug
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/build/DetailedBuildRunImpl.java b/backend/core/src/main/java/org/artifactory/build/DetailedBuildRunImpl.java
deleted file mode 100644
index 898bc37..0000000
--- a/backend/core/src/main/java/org/artifactory/build/DetailedBuildRunImpl.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.build;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.SerializationUtils;
-import org.apache.commons.lang.StringUtils;
-import org.jfrog.build.api.Build;
-import org.jfrog.build.api.release.PromotionStatus;
-
-import javax.annotation.Nonnull;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.List;
-
-/**
- * A detailed build run info holder
- *
- * @author Noam Y. Tenne
- */
-public class DetailedBuildRunImpl implements DetailedBuildRun {
-
-    final Build build;
-
-    public DetailedBuildRunImpl(@Nonnull Build build) {
-        this.build = build;
-    }
-
-    @Override
-    public String getName() {
-        return build.getName();
-    }
-
-    @Override
-    public String getNumber() {
-        return build.getNumber();
-    }
-
-    @Override
-    public String getStarted() {
-        return build.getStarted();
-    }
-
-    @Override
-    public Date getStartedDate() {
-        return new Date(BuildInfoUtils.parseBuildTime(getStarted()));
-    }
-
-    @Override
-    public String getBuildAgent() {
-        return build.getBuildAgent().toString();
-    }
-
-    @Override
-    public String getAgent() {
-        return build.getAgent().toString();
-    }
-
-    @Override
-    public long getDurationMillis() {
-        return build.getDurationMillis();
-    }
-
-    @Override
-    public String getPrincipal() {
-        return build.getPrincipal();
-    }
-
-    @Override
-    public String getArtifactoryPrincipal() {
-        return build.getArtifactoryPrincipal();
-    }
-
-    @Override
-    public String getUrl() {
-        return build.getUrl();
-    }
-
-    @Override
-    public String getParentName() {
-        return build.getParentName();
-    }
-
-    @Override
-    public String getParentNumber() {
-        return build.getParentNumber();
-    }
-
-    @Override
-    public String getVcsRevision() {
-        return build.getVcsRevision();
-    }
-
-    @Override
-    @Nonnull
-    public List<Module> getModules() {
-        List<Module> modulesToReturn = Lists.newArrayList();
-        List<org.jfrog.build.api.Module> buildModules = build.getModules();
-        if (buildModules != null) {
-            for (org.jfrog.build.api.Module buildModule : buildModules) {
-                modulesToReturn.add(new Module(buildModule));
-            }
-        }
-        return modulesToReturn;
-    }
-
-    @Override
-    @Nonnull
-    public DetailedBuildRun copy() {
-        return copy(null);
-    }
-
-    @Override
-    @Nonnull
-    public DetailedBuildRun copy(String buildNumber) {
-        Build copy = (Build) SerializationUtils.clone(build);
-        copy.setStartedDate(new Date());
-        if (StringUtils.isNotBlank(buildNumber)) {
-            copy.setNumber(buildNumber);
-        }
-        return new DetailedBuildRunImpl(copy);
-    }
-
-    @Override
-    public List<ReleaseStatus> getReleaseStatuses() {
-        List<PromotionStatus> promotionStatuses = build.getStatuses();
-        if (promotionStatuses == null) {
-            promotionStatuses = Lists.newArrayList();
-            build.setStatuses(promotionStatuses);
-        }
-        return new ReleaseStatusList(promotionStatuses);
-    }
-
-    @Override
-    public String getCiUrl() {
-        return build.getUrl();
-    }
-
-    @Override
-    public String getReleaseStatus() {
-        List<PromotionStatus> statuses = build.getStatuses();
-        if (statuses == null) {
-            return null;
-        }
-        return Collections.max(statuses, new Comparator<PromotionStatus>() {
-            @Override
-            public int compare(PromotionStatus o1, PromotionStatus o2) {
-                return o1.getTimestampDate().compareTo(o2.getTimestampDate());
-            }
-        }).getStatus();
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/build/InternalBuildService.java b/backend/core/src/main/java/org/artifactory/build/InternalBuildService.java
deleted file mode 100644
index 9af9661..0000000
--- a/backend/core/src/main/java/org/artifactory/build/InternalBuildService.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.build;
-
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.build.ImportableExportableBuild;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.sapi.common.ImportSettings;
-import org.artifactory.sapi.common.Lock;
-import org.artifactory.spring.ReloadableBean;
-import org.jfrog.build.api.Artifact;
-import org.jfrog.build.api.Build;
-import org.jfrog.build.api.Dependency;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * The system-internal interface of the build service
- *
- * @author Noam Y. Tenne
- */
-public interface InternalBuildService extends ReloadableBean, BuildService {
-
-    /**
-     * Name of folder to temporarily store previous build backups during an incremental
-     */
-    String BACKUP_BUILDS_FOLDER = "builds.previous";
-
-    /**
-     * Returns a Mapping of {@link Artifact} to {@link FileInfo} that was  matched to it.
-     * This method tries to search by build name and number properties first and if it can't match all Artifacts to
-     * FileInfo objects it will fallback to a weaker search that's based on the build DB entries to fill in the missing
-     * artifacts, if indicated by {@param useFallBack}
-     * <p/>
-     * **NOTE:**
-     *
-     * @param build                The searched build (searching within it's artifacts)
-     * @param useFallBack          Indicates whether to fallback to the weaker search if not all artifacts were matched
-     *                             against FileInfo objects
-     * @param sourceRepositories   only include results from these repositories, not mandatory
-     * @param excludedRepositories exclude results from these repositories, not mandatory
-     */
-    Set<ArtifactoryBuildArtifact> getBuildArtifactsFileInfos(Build build, boolean useFallBack,
-            @Nullable List<String> sourceRepositories, @Nullable List<String> excludedRepositories);
-
-    /**
-     * Returns a map of build dependency and it's matching FileInfo
-     *
-     * @param build            The searched build (searching within it's dependencies)
-     */
-    Map<Dependency, FileInfo> getBuildDependenciesFileInfos(Build build);
-
-    /**
-     * Imports an exportable build info into the database. This is an internal method and should be used to import a
-     * single build within a transaction.
-     *
-     * @param settings Import settings
-     * @param build    The build to import
-     */
-    @Lock
-    void importBuild(ImportSettings settings, ImportableExportableBuild build) throws Exception;
-
-    /**
-     * Renames the JSON content within a build
-     *
-     * @param buildRun Build to rename
-     * @param to       Replacement build name
-     */
-    @Lock
-    void renameBuild(BuildRun buildRun, String to);
-
-    /**
-     * Returns latest build by name and status (which can be {@link BuildService.LATEST_BUILD} or a status value (e.g: "Released")
-     *
-     * @param buildName   the name of the build
-     * @param buildStatus the desired status (which can be {@link BuildService.LATEST_BUILD} or a status value (e.g: "Released")
-     * @return the build (if found)
-     */
-    @Nullable
-    Build getLatestBuildByNameAndStatus(String buildName, String buildStatus);
-
-    /**
-     * Adds the given build configuration to Artifactory
-     *
-     * @param detailedBuildRun Build to add
-     */
-    void addBuild(@Nonnull DetailedBuildRun detailedBuildRun);
-
-    /**
-     * Adds the given build to the DB, with a flag that indicates if the call is internal or not - for cases
-     * where the call is made from the papi, this is to avoid accidental endless loops of plugin actions calling
-     * one another indefinitely.
-     *
-     * @param build                   Build to add
-     * @param activatePluginCallbacks flag that indicates if the call is internal
-     */
-    @Lock
-    void addBuild(Build build, boolean activatePluginCallbacks);
-
-    /**
-     * Persists the changes made to the given existing build configuration
-     *
-     * @param detailedBuildRun Existing build configuration
-     */
-    void updateBuild(@Nonnull DetailedBuildRun detailedBuildRun);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/config/CentralConfigServiceImpl.java b/backend/core/src/main/java/org/artifactory/config/CentralConfigServiceImpl.java
deleted file mode 100644
index 1e85ee7..0000000
--- a/backend/core/src/main/java/org/artifactory/config/CentralConfigServiceImpl.java
+++ /dev/null
@@ -1,451 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.config;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.SerializationUtils;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.HaAddon;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.api.config.VersionInfo;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.AuthorizationException;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.converters.ConverterManager;
-import org.artifactory.converters.VersionProvider;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.reader.CentralConfigReader;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.jaxb.JaxbHelper;
-import org.artifactory.sapi.common.ExportSettings;
-import org.artifactory.sapi.common.ImportSettings;
-import org.artifactory.security.AccessLogger;
-import org.artifactory.spring.InternalArtifactoryContext;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.state.ArtifactoryServerState;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.db.servers.model.ArtifactoryServer;
-import org.artifactory.storage.db.servers.service.ArtifactoryServersCommonService;
-import org.artifactory.storage.fs.service.ConfigsService;
-import org.artifactory.util.Files;
-import org.artifactory.util.SerializablePair;
-import org.artifactory.version.ArtifactoryConfigVersion;
-import org.artifactory.version.CompoundVersionDetails;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Repository;
-
-import javax.annotation.Nullable;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static org.artifactory.addon.ha.message.HaMessageTopic.CONFIG_CHANGE_TOPIC;
-
-/**
- * This class wraps the JAXB config descriptor.
- */
- at Repository("centralConfig")
- at Reloadable(beanClass = InternalCentralConfigService.class,
-        initAfter = {DbService.class, ConfigurationChangesInterceptors.class})
-public class CentralConfigServiceImpl implements InternalCentralConfigService {
-    private static final Logger log = LoggerFactory.getLogger(CentralConfigServiceImpl.class);
-
-    private CentralConfigDescriptor descriptor;
-    private DateTimeFormatter dateFormatter;
-    private String serverName;
-
-    @Autowired
-    private AuthorizationService authService;
-
-    @Autowired
-    private ConfigsService configsService;
-
-    @Autowired
-    private ConfigurationChangesInterceptors interceptors;
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Autowired
-    private ArtifactoryServersCommonService serversService;
-
-    public CentralConfigServiceImpl() {
-    }
-
-    @Override
-    public void init() {
-        SerializablePair<CentralConfigDescriptor, Boolean> result = getCurrentConfig();
-        CentralConfigDescriptor currentConfig = result.getFirst();
-        boolean updateDescriptor = result.getSecond();
-        setDescriptor(currentConfig, updateDescriptor);
-    }
-
-    private SerializablePair<CentralConfigDescriptor, Boolean> getCurrentConfig() {
-        ArtifactoryHome artifactoryHome = ContextHelper.get().getArtifactoryHome();
-
-        //First try to see if there is an import config file to load
-        String currentConfigXml = artifactoryHome.getImportConfigXml();
-
-        boolean updateDescriptor = true;
-
-        //If no import config file exists, or is empty, load from storage
-        if (StringUtils.isBlank(currentConfigXml)) {
-            currentConfigXml = loadConfigFromStorage();
-            if (!StringUtils.isBlank(currentConfigXml)) {
-                // TODO: Check the version is good, because if converted means update = true
-                updateDescriptor = false;
-            }
-        }
-        //Otherwise, load bootstrap config
-        if (StringUtils.isBlank(currentConfigXml)) {
-            log.info("Loading bootstrap configuration (artifactory home dir is {}).", artifactoryHome.getHomeDir());
-            currentConfigXml = artifactoryHome.getBootstrapConfigXml();
-        }
-        artifactoryHome.renameInitialConfigFileIfExists();
-        log.trace("Current config xml is:\n{}", currentConfigXml);
-        return new SerializablePair<>(new CentralConfigReader().read(currentConfigXml), updateDescriptor);
-    }
-
-    @Nullable
-    private String loadConfigFromStorage() {
-        //Check in DB
-        String dbConfigName = ArtifactoryHome.ARTIFACTORY_CONFIG_FILE;
-        if (configsService.hasConfig(dbConfigName)) {
-            log.debug("Loading existing configuration from storage.");
-            return configsService.getConfig(dbConfigName);
-        }
-        return null;
-    }
-
-    @Override
-    public void setDescriptor(CentralConfigDescriptor descriptor) {
-        setDescriptor(descriptor, true);
-    }
-
-    @Override
-    public CentralConfigDescriptor getDescriptor() {
-        return descriptor;
-    }
-
-    @Override
-    public DateTimeFormatter getDateFormatter() {
-        return dateFormatter;
-    }
-
-    @Override
-    public String getServerName() {
-        return serverName;
-    }
-
-    @Override
-    public String format(long date) {
-        return dateFormatter.print(date);
-    }
-
-    @Override
-    public VersionInfo getVersionInfo() {
-        return new VersionInfo(ConstantValues.artifactoryVersion.getString(),
-                ConstantValues.artifactoryRevision.getString());
-    }
-
-    @Override
-    public String getConfigXml() {
-        return JaxbHelper.toXml(descriptor);
-    }
-
-    @Override
-    public void setConfigXml(String xmlConfig, boolean saveConfiguration) {
-        CentralConfigDescriptor newDescriptor = new CentralConfigReader().read(xmlConfig);
-        reloadConfiguration(newDescriptor, saveConfiguration);
-        storeLatestConfigToFile(getConfigXml());
-        addonsManager.addonByType(HaAddon.class).notify(CONFIG_CHANGE_TOPIC, null);
-    }
-
-    @Override
-    public void setLogo(File logo) throws IOException {
-        ArtifactoryHome artifactoryHome = ContextHelper.get().getArtifactoryHome();
-        final File targetFile = new File(artifactoryHome.getLogoDir(), "logo");
-        if (logo == null) {
-            FileUtils.deleteQuietly(targetFile);
-        } else {
-            FileUtils.copyFile(logo, targetFile);
-        }
-    }
-
-    @Override
-    public boolean defaultProxyDefined() {
-        List<ProxyDescriptor> proxyDescriptors = descriptor.getProxies();
-        for (ProxyDescriptor proxyDescriptor : proxyDescriptors) {
-            if (proxyDescriptor.isDefaultProxy()) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public MutableCentralConfigDescriptor getMutableDescriptor() {
-        return (MutableCentralConfigDescriptor) SerializationUtils.clone(descriptor);
-    }
-
-    @Override
-    public void saveEditedDescriptorAndReload(CentralConfigDescriptor descriptor) {
-        if (descriptor == null) {
-            throw new IllegalStateException("Currently edited descriptor is null.");
-        }
-
-        if (!authService.isAdmin()) {
-            throw new AuthorizationException("Only an admin user can save the artifactory configuration.");
-        }
-
-        // before doing anything do a sanity check that the edited descriptor is valid
-        // will fail if not valid without affecting the current configuration
-        // in any case we will use this newly loaded config as the descriptor
-        String configXml = JaxbHelper.toXml(descriptor);
-        setConfigXml(configXml, true);
-    }
-
-    @Override
-    public boolean reloadConfiguration(boolean saveConfiguration) {
-        String currentConfigXml = loadConfigFromStorage();
-        if (!StringUtils.isBlank(currentConfigXml)) {
-            CentralConfigDescriptor newDescriptor = new CentralConfigReader().read(currentConfigXml);
-            reloadConfiguration(newDescriptor, saveConfiguration);
-            return true;
-        } else {
-            log.warn("Could not reload configuration.");
-            return false;
-        }
-    }
-
-    @Override
-    public void importFrom(ImportSettings settings) {
-        MutableStatusHolder status = settings.getStatusHolder();
-        File dirToImport = settings.getBaseDir();
-        //noinspection ConstantConditions
-        if (dirToImport != null && dirToImport.isDirectory() && dirToImport.listFiles().length > 0) {
-            status.status("Importing config...", log);
-            File newConfigFile = new File(settings.getBaseDir(), ArtifactoryHome.ARTIFACTORY_CONFIG_FILE);
-            if (newConfigFile.exists()) {
-                status.status("Reloading configuration from " + newConfigFile, log);
-                String xmlConfig = Files.readFileToString(newConfigFile);
-                setConfigXml(xmlConfig, true);
-                status.status("Configuration reloaded from " + newConfigFile, log);
-            }
-        } else if (settings.isFailIfEmpty()) {
-            String error = "The given base directory is either empty, or non-existent";
-            throw new IllegalArgumentException(error);
-        }
-    }
-
-    @Override
-    public void exportTo(ExportSettings settings) {
-        MutableStatusHolder status = settings.getStatusHolder();
-        status.status("Exporting config...", log);
-        File destFile = new File(settings.getBaseDir(), ArtifactoryHome.ARTIFACTORY_CONFIG_FILE);
-        JaxbHelper.writeConfig(descriptor, destFile);
-    }
-
-    private void reloadConfiguration(CentralConfigDescriptor newDescriptor, boolean saveConfiguration) {
-        //Reload only if all single artifactory or unique schema version in Artifactory HA cluster
-        log.info("Reloading configuration...");
-        try {
-            CentralConfigDescriptor oldDescriptor = getDescriptor();
-            if (oldDescriptor == null) {
-                throw new IllegalStateException("The system was not loaded, and a reload was called");
-            }
-
-            InternalArtifactoryContext ctx = InternalContextHelper.get();
-
-            //setDescriptor() will set the new date formatter and server name
-            setDescriptor(newDescriptor, saveConfiguration);
-
-            // TODO: [by FSI] If reload fails, we have the new descriptor in memory but not used
-            // Need to find ways to revert or be very robust on reload.
-            ctx.reload(oldDescriptor);
-            log.info("Configuration reloaded.");
-            AccessLogger.configurationChanged();
-            log.debug("Old configuration:\n{}", JaxbHelper.toXml(oldDescriptor));
-            log.debug("New configuration:\n{}", JaxbHelper.toXml(newDescriptor));
-        } catch (ConfigurationException e) {
-            log.warn("Failed to reload configuration: " + e.getMessage());
-            throw e;
-        } catch (Exception e) {
-            String msg = "Failed to reload configuration: " + e.getMessage();
-            log.error(msg, e);
-            throw new RuntimeException(msg, e);
-        }
-    }
-
-    private void setDescriptor(CentralConfigDescriptor descriptor, boolean save) {
-        log.trace("Setting central config descriptor for config #{}.", System.identityHashCode(this));
-
-        if (save) {
-            assertSaveDescriptorAllowd();
-            // call the interceptors before saving the new descriptor
-            interceptors.onBeforeSave(descriptor);
-        }
-
-        this.descriptor = descriptor;
-        checkUniqueProxies();
-        //Create the date formatter
-        String dateFormat = descriptor.getDateFormat();
-        dateFormatter = DateTimeFormat.forPattern(dateFormat);
-        //Get the server name
-        serverName = descriptor.getServerName();
-        if (serverName == null) {
-            log.debug("No custom server name in configuration. Using hostname instead.");
-            try {
-                serverName = InetAddress.getLocalHost().getHostName();
-            } catch (UnknownHostException e) {
-                log.warn("Could not use local hostname as the server instance id: {}", e.getMessage());
-                serverName = "localhost";
-            }
-        }
-        if (save) {
-            log.info("Saving new configuration in storage...");
-            String configString = JaxbHelper.toXml(descriptor);
-            configsService.addOrUpdateConfig(ArtifactoryHome.ARTIFACTORY_CONFIG_FILE, configString);
-            log.info("New configuration saved.");
-        }
-    }
-
-    private void assertSaveDescriptorAllowd() {
-        // Approved if not HA
-        HaCommonAddon haAddon = addonsManager.addonByType(HaCommonAddon.class);
-        if (haAddon.isHaEnabled()) {
-            // Approved if primary and converting
-            ArtifactoryServer currentMember = serversService.getCurrentMember();
-            ArtifactoryServerState serverState =
-                    currentMember == null ? ArtifactoryServerState.STARTING : currentMember.getServerState();
-            // Get the context
-            ArtifactoryContext artifactoryContext = ContextHelper.get();
-            // Get the converter manager
-            ConverterManager converterManager = artifactoryContext.getConverterManager();
-
-            if (haAddon.isPrimary() && converterManager != null && converterManager.isConverting()) {
-                return;
-            }
-            // Denied if found two nodes with different versions
-            List<ArtifactoryServer> otherRunningHaMembers = serversService.getOtherRunningHaMembers();
-            VersionProvider versionProvider = artifactoryContext.getVersionProvider();
-            CompoundVersionDetails runningVersion = versionProvider.getRunning();
-            for (ArtifactoryServer otherRunningHaMember : otherRunningHaMembers) {
-                String otherArtifactoryVersion = otherRunningHaMember.getArtifactoryVersion();
-                if (!runningVersion.getVersionName().equals(otherArtifactoryVersion)) {
-                    throw new RuntimeException(
-                            "unstable environment: Found one or more servers with different version Config Reload denied.");
-                }
-            }
-        }
-    }
-
-    private void storeLatestConfigToFile(String configXml) {
-        try {
-            Files.writeContentToRollingFile(configXml, ArtifactoryHome.get().getArtifactoryConfigLatestFile());
-        } catch (IOException e) {
-            log.error("Error occurred while performing a backup of the latest configuration.", e);
-        }
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-        // Nothing to do
-    }
-
-    @Override
-    public void destroy() {
-        // Nothing to do
-    }
-
-    /**
-     * Convert and save the artifactory config descriptor
-     */
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-        //Initialize the enum registration
-        ArtifactoryConfigVersion.values();
-
-        // getCurrentConfig() will always return the latest version (ie will do the conversion)
-        CentralConfigDescriptor artifactoryConfig = getCurrentConfig().getFirst();
-        // Save result in DB
-        setDescriptor(artifactoryConfig);
-
-        String artifactoryConfigXml = JaxbHelper.toXml(artifactoryConfig);
-
-        // Save new bootstrap config file
-        File bootstrapConfigFile = ArtifactoryHome.get().getArtifactoryConfigBootstrapFile();
-        File parentFile = bootstrapConfigFile.getParentFile();
-        if (parentFile.canWrite()) {
-            try {
-                log.info("Automatically converting the config file, original will be saved in " +
-                        parentFile.getAbsolutePath());
-                File newConfigFile;
-                if (bootstrapConfigFile.exists()) {
-                    newConfigFile = ArtifactoryHome.get().getArtifactoryConfigNewBootstrapFile();
-                } else {
-                    newConfigFile = bootstrapConfigFile;
-                }
-                FileOutputStream fos = new FileOutputStream(newConfigFile);
-                IOUtils.write(artifactoryConfigXml, fos);
-                fos.close();
-                if (newConfigFile != bootstrapConfigFile) {
-                    Files.switchFiles(newConfigFile, bootstrapConfigFile);
-                }
-            } catch (Exception e) {
-                log.warn("The converted config xml is:\n" + artifactoryConfigXml +
-                        "\nThe new configuration is saved in DB but it failed to be saved automatically to '" +
-                        parentFile.getAbsolutePath() + "' due to :" + e.getMessage() + ".\n", e);
-            }
-        } else {
-            log.warn("The converted config xml is:\n" + artifactoryConfigXml +
-                    "\nThe new configuration is saved in DB but it failed to be saved automatically to '" +
-                    parentFile.getAbsolutePath() + "' since the folder is not writable.\n");
-        }
-    }
-
-    private void checkUniqueProxies() {
-        List<ProxyDescriptor> proxies = getDescriptor().getProxies();
-        Map<String, ProxyDescriptor> map = new HashMap<>(proxies.size());
-        for (ProxyDescriptor proxy : proxies) {
-            String key = proxy.getKey();
-            ProxyDescriptor oldProxy = map.put(key, proxy);
-            if (oldProxy != null) {
-                throw new RuntimeException("Duplicate proxy key in configuration: " + key + ".");
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/config/ConfigurationChangesInterceptor.java b/backend/core/src/main/java/org/artifactory/config/ConfigurationChangesInterceptor.java
deleted file mode 100644
index 8be3f10..0000000
--- a/backend/core/src/main/java/org/artifactory/config/ConfigurationChangesInterceptor.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.config;
-
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.interceptor.Interceptor;
-
-/**
- * Central config events interceptor.
- *
- * @author Yossi Shaul
- */
-public interface ConfigurationChangesInterceptor extends Interceptor {
-    void onBeforeSave(CentralConfigDescriptor newDescriptor);
-}
diff --git a/backend/core/src/main/java/org/artifactory/config/ConfigurationChangesInterceptors.java b/backend/core/src/main/java/org/artifactory/config/ConfigurationChangesInterceptors.java
deleted file mode 100644
index 88e36b5..0000000
--- a/backend/core/src/main/java/org/artifactory/config/ConfigurationChangesInterceptors.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.config;
-
-import org.artifactory.spring.ReloadableBean;
-
-/**
- * @author Yossi Shaul
- */
-public interface ConfigurationChangesInterceptors extends ReloadableBean, ConfigurationChangesInterceptor {
-
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/config/ConfigurationChangesInterceptorsImpl.java b/backend/core/src/main/java/org/artifactory/config/ConfigurationChangesInterceptorsImpl.java
deleted file mode 100644
index 68693be..0000000
--- a/backend/core/src/main/java/org/artifactory/config/ConfigurationChangesInterceptorsImpl.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.config;
-
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.repo.interceptor.Interceptors;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.storage.db.DbService;
-import org.springframework.stereotype.Service;
-
-/**
- * Central config interceptors chain manager.
- *
- * @author Yossi Shaul
- */
- at Service
- at Reloadable(beanClass = ConfigurationChangesInterceptors.class, initAfter = DbService.class)
-public class ConfigurationChangesInterceptorsImpl extends Interceptors<ConfigurationChangesInterceptor>
-        implements ConfigurationChangesInterceptors {
-
-    @Override
-    public void onBeforeSave(CentralConfigDescriptor newDescriptor) {
-        for (ConfigurationChangesInterceptor interceptor : this) {
-            interceptor.onBeforeSave(newDescriptor);
-        }
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/config/InternalCentralConfigService.java b/backend/core/src/main/java/org/artifactory/config/InternalCentralConfigService.java
deleted file mode 100644
index 7ebb3c7..0000000
--- a/backend/core/src/main/java/org/artifactory/config/InternalCentralConfigService.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.config;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.spring.ReloadableBean;
-
-/**
- * @author freds
- * @date Oct 27, 2008
- */
-public interface InternalCentralConfigService extends CentralConfigService, ReloadableBean {
-}
diff --git a/backend/core/src/main/java/org/artifactory/download/FolderArchiveStreamer.java b/backend/core/src/main/java/org/artifactory/download/FolderArchiveStreamer.java
deleted file mode 100644
index 0adfebe..0000000
--- a/backend/core/src/main/java/org/artifactory/download/FolderArchiveStreamer.java
+++ /dev/null
@@ -1,159 +0,0 @@
-package org.artifactory.download;
-
-import org.apache.commons.compress.archivers.ArchiveEntry;
-import org.apache.commons.compress.archivers.ArchiveOutputStream;
-import org.apache.commons.io.IOUtils;
-import org.artifactory.api.archive.ArchiveType;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.download.FolderDownloadService;
-import org.artifactory.api.storage.StorageUnit;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.resource.ResourceStreamHandle;
-import org.artifactory.schedule.CachedThreadPoolTaskExecutor;
-import org.artifactory.schedule.DummyExecutorService;
-import org.artifactory.security.AccessLogger;
-import org.artifactory.storage.fs.service.StatsService;
-import org.artifactory.storage.fs.tree.ItemNode;
-import org.artifactory.storage.fs.tree.ItemTree;
-import org.artifactory.storage.fs.tree.TreeBrowsingCriteriaBuilder;
-import org.artifactory.traffic.TrafficService;
-import org.artifactory.traffic.entry.DownloadEntry;
-import org.artifactory.util.ArchiveUtils;
-import org.artifactory.util.HttpUtils;
-import org.artifactory.util.PathUtils;
-import org.iostreams.streams.in.OutputToInputStream;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.core.context.SecurityContextHolder;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * Traverses the tree under the requested path recursively and writes each file into the stream serially.
- * The stream itself is an {@link ArchiveOutputStream} based on the selected {@link ArchiveType}
- *
- * @author Dan Feldman
- * @author Yossi Shaul
- */
-public class FolderArchiveStreamer {
-    private static final Logger log = LoggerFactory.getLogger(FolderArchiveStreamer.class);
-
-    private final ArchiveType archiveType;
-    private final BasicStatusHolder status;
-    private long maxDownloadSizeInMB;
-    private long maxDownloadSizeInBytes;
-    private long maxFiles;
-    private RepoPath rootFolder;
-    private ArchiveOutputStream archiveOutputStream = null;
-    private long filesCount;
-    private long totalSizeInBytes;
-
-    public FolderArchiveStreamer(RepoPath pathToDownload, ArchiveType archiveType, int maxDownloadSizeMb,
-            long maxFiles, BasicStatusHolder status) {
-        this.rootFolder = pathToDownload;
-        this.archiveType = archiveType;
-        this.status = status;
-        //rounds towards zero but the overflow is negligible
-        this.maxDownloadSizeInBytes = (long) StorageUnit.MB.toBytes(maxDownloadSizeMb);
-        this.maxFiles = maxFiles;
-        this.maxDownloadSizeInMB = maxDownloadSizeMb;
-    }
-
-    public InputStream go() {
-        CachedThreadPoolTaskExecutor executor = ContextHelper.get().beanForType(CachedThreadPoolTaskExecutor.class);
-        return new OutputToInputStream(new DummyExecutorService(executor)) {
-            @Override
-            protected void write(OutputStream sink) throws IOException {
-                try {
-                    long start = System.currentTimeMillis();
-                    archiveOutputStream = ArchiveUtils.createArchiveOutputStream(sink, archiveType);
-                    ItemTree tree = new ItemTree(rootFolder, new TreeBrowsingCriteriaBuilder()
-                            .applyRepoIncludeExclude().applySecurity().cacheChildren(false).build());
-                    ItemNode rootNode = tree.getRootNode();
-                    writeRecursive(rootNode);
-                    archiveOutputStream.finish();
-                    log.trace("folder download finished successfully, took {} ms", System.currentTimeMillis() - start);
-                } catch (Exception e) {
-                    status.error("Error executing folder download: " + e.getMessage(), log);
-                    log.debug("Caught exception while executing folder download: ", e);
-                } finally {
-                    archiveOutputStream.flush();
-                    IOUtils.closeQuietly(archiveOutputStream);
-                    IOUtils.closeQuietly(sink);
-                    ContextHelper.get().beanForType(FolderDownloadService.class).releaseDownloadSlot();
-                }
-            }
-        };
-    }
-
-    private void writeRecursive(ItemNode currentNode) throws IOException {
-        if (limitsReached()) {
-            return;
-        }
-        if (currentNode.isFolder()) {
-            for (ItemNode child : currentNode.getChildren()) {
-                if (!limitsReached()) {
-                    writeRecursive(child);
-                }
-            }
-        } else {
-            FileInfo fileInfo = (FileInfo) currentNode.getItemInfo();
-            totalSizeInBytes += fileInfo.getSize();
-            filesCount++;
-            if (!limitsReached()) {
-                writeArtifactToStream(fileInfo.getRepoPath(), fileInfo.getSize());
-            }
-        }
-    }
-
-    //0 means no limit
-    private boolean limitsReached() {
-        if((0 > maxFiles) && filesCount > maxFiles) {
-            status.debug("Stopping folder download tree traversal, max file limit reached. current file count: " +
-                    filesCount + " limit is: " + maxFiles, log);
-            return true;
-        } else if((0 > maxDownloadSizeInBytes) && totalSizeInBytes > maxDownloadSizeInBytes) {
-            status.debug("Stopping folder download tree traversal, max size limit reached. current size count: " +
-                    StorageUnit.toReadableString(totalSizeInBytes) + " limit is: " + maxDownloadSizeInMB, log);
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Returns the size of downloaded file for the loop stop calculation
-     */
-    private void writeArtifactToStream(RepoPath fileRepoPath, long size) throws IOException {
-        long start = System.currentTimeMillis();
-        String relativePath = PathUtils.getRelativePath(rootFolder.getPath(), fileRepoPath.getPath());
-        ArchiveEntry archiveEntry = ArchiveUtils.createArchiveEntry(relativePath, archiveType, size);
-        ResourceStreamHandle handle = ContextHelper.get().getRepositoryService().getResourceStreamHandle(fileRepoPath);
-        try {
-            InputStream artifactStream = handle.getInputStream();
-            archiveOutputStream.putArchiveEntry(archiveEntry);
-            log.debug("Writing path {} to output stream", fileRepoPath.toPath());
-            IOUtils.copy(artifactStream, archiveOutputStream);
-        } finally {
-            IOUtils.closeQuietly(handle);
-            archiveOutputStream.closeArchiveEntry();
-            archiveOutputStream.flush();
-        }
-        logAccessTrafficAndStatsForSinglePath(fileRepoPath, size, start);
-    }
-
-    private void logAccessTrafficAndStatsForSinglePath(RepoPath path, long size, long start) {
-        AccessLogger.downloaded(path);
-        DownloadEntry downloadEntry = new DownloadEntry(path.getId(), size, System.currentTimeMillis() - start,
-                HttpUtils.getRemoteClientAddress());
-        ContextHelper.get().beanForType(TrafficService.class).handleTrafficEntry(downloadEntry);
-        if (ConstantValues.downloadStatsEnabled.getBoolean()) {
-            ContextHelper.get().beanForType(StatsService.class).fileDownloaded(path,
-                    SecurityContextHolder.getContext().getAuthentication().getName(), System.currentTimeMillis(), false);
-        }
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/download/FolderDownloadServiceImpl.java b/backend/core/src/main/java/org/artifactory/download/FolderDownloadServiceImpl.java
deleted file mode 100644
index e3cf3d0..0000000
--- a/backend/core/src/main/java/org/artifactory/download/FolderDownloadServiceImpl.java
+++ /dev/null
@@ -1,229 +0,0 @@
-package org.artifactory.download;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.api.archive.ArchiveType;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.download.FolderDownloadInfo;
-import org.artifactory.api.repo.exception.ItemNotFoundRuntimeException;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.api.storage.StorageUnit;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.download.FolderDownloadConfigDescriptor;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.Repo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.storage.fs.service.FileService;
-import org.artifactory.version.CompoundVersionDetails;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.io.InputStream;
-import java.util.concurrent.Semaphore;
-
-import static org.apache.http.HttpStatus.*;
-
-/**
- * Serves requests for download of folders as archive
- *
- * @author Dan Feldman
- */
- at Service
- at Reloadable(beanClass = InternalFolderDownloadService.class, initAfter = {InternalRepositoryService.class})
-public class FolderDownloadServiceImpl implements InternalFolderDownloadService {
-    private static final Logger log = LoggerFactory.getLogger(FolderDownloadServiceImpl.class);
-
-    @Autowired
-    private InternalRepositoryService repoService;
-
-    @Autowired
-    private FileService fileService;
-
-    @Autowired
-    private AuthorizationService authService;
-
-    private int maxDownloadSizeMb;
-    private long maxFiles;
-    private boolean serviceEnabled;
-    private ConcurrentDownloadCounter concurrentDownloadCounter;
-
-    @Override
-    public void init() {
-        FolderDownloadConfigDescriptor config = getFolderDownloadConfig();
-        this.maxDownloadSizeMb = config.getMaxDownloadSizeMb();
-        this.maxFiles = config.getMaxFiles();
-        this.serviceEnabled = config.isEnabled();
-        this.concurrentDownloadCounter = new ConcurrentDownloadCounter(config.getMaxConcurrentRequests(), true);
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-        FolderDownloadConfigDescriptor newConfig = getFolderDownloadConfig();
-        FolderDownloadConfigDescriptor oldConfig = oldDescriptor.getFolderDownloadConfig();
-        if (!newConfig.equals(oldConfig)) {
-            this.maxDownloadSizeMb = newConfig.getMaxDownloadSizeMb();
-            this.maxFiles = newConfig.getMaxFiles();
-            this.serviceEnabled = newConfig.isEnabled();
-            //Take the extra effort to compare old and new because resize is a synchronized method
-            if (newConfig.getMaxConcurrentRequests() != oldConfig.getMaxConcurrentRequests()) {
-                concurrentDownloadCounter.resize(newConfig.getMaxConcurrentRequests());
-            }
-        }
-    }
-
-    @Override
-    public boolean getAvailableDownloadSlot() {
-        if (!concurrentDownloadCounter.tryAcquire()) {
-            log.debug("No available download slots, current available count in semaphore: {}",
-                    concurrentDownloadCounter.availablePermits());
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public void releaseDownloadSlot() {
-        concurrentDownloadCounter.release();
-    }
-
-    @Override
-    public InputStream process(RepoPath pathToDownload, ArchiveType archiveType, BasicStatusHolder status) {
-        if (!serviceEnabled) {
-            status.error("Downloading folders as archive was disabled by your system admin.", SC_FORBIDDEN, log);
-            return null;
-        }
-        FolderDownloadInfo info = collectFolderInfo(pathToDownload);
-        if (pathExceedsLimits(info, status, pathToDownload.toPath())) {
-            return null;
-        }
-        try {
-            if (!getAvailableDownloadSlot()) {
-                status.error("There are too many folder download requests currently running, try again later.",
-                        HttpStatus.SC_BAD_REQUEST, log);
-                return null;
-            }
-            return process(pathToDownload, archiveType, maxDownloadSizeMb, maxFiles, status);
-        } catch (Exception e) {
-            status.error("Error executing folder download: " + e.getMessage(), log);
-            log.debug("Caught exception while creating output stream for folder download: ", e);
-        }
-        return null;
-    }
-
-    @Override
-    public InputStream processNoLimit(RepoPath pathToDownload, ArchiveType archiveType, BasicStatusHolder status) {
-        if (!assertPath(pathToDownload, status)) {
-            return null;
-        }
-        return process(pathToDownload, archiveType, 0, 0, status);
-    }
-
-    private InputStream process(RepoPath pathToDownload, ArchiveType archiveType, int maxDownloadSizeMb, long maxFiles,
-            BasicStatusHolder status) {
-        if (!assertPath(pathToDownload, status)) {
-            return null;
-        }
-        FolderArchiveStreamer streamer = new FolderArchiveStreamer(pathToDownload, archiveType, maxDownloadSizeMb,
-                maxFiles, status);
-        return streamer.go();
-    }
-
-    @Override
-    public FolderDownloadInfo collectFolderInfo(RepoPath folder) {
-        return new FolderDownloadInfo(StorageUnit.MB.fromBytes(fileService.getFilesTotalSize(folder)),
-                repoService.getArtifactCount(folder));
-    }
-
-    @Override
-    public FolderDownloadConfigDescriptor getFolderDownloadConfig() {
-        return ContextHelper.get().beanForType(CentralConfigService.class).getDescriptor().getFolderDownloadConfig();
-    }
-
-    private boolean assertPath(RepoPath pathToDownload, BasicStatusHolder status) {
-        String folderPath = pathToDownload.toPath();
-        ItemInfo itemInfo;
-        Repo repo = repoService.repositoryByKey(pathToDownload.getRepoKey());
-        if (repo == null) {
-            status.error(pathToDownload.getRepoKey() + " is not a repository.", SC_NOT_FOUND, log);
-            return false;
-        } else if (!repo.isLocal() && !repo.isCache()) {
-            status.error("Downloading a folder or a repository's root is only available for local (or cache) " +
-                    "repositories", SC_NOT_FOUND, log);
-            return false;
-        }
-        if (!pathToDownload.isRoot()) {
-            //Not root, check folder status
-            try {
-                itemInfo = repoService.getItemInfo(pathToDownload);
-            } catch (ItemNotFoundRuntimeException inf) {
-                status.error("Path '" + folderPath + "' does not exist, aborting folder download", SC_NOT_FOUND, log);
-                return false;
-            }
-            if (!itemInfo.isFolder()) {
-                status.error("Path '" + folderPath + "' is not a folder, aborting folder download", SC_BAD_REQUEST, log);
-                return false;
-            }
-        }
-        if (!authService.canRead(pathToDownload)) {
-            status.error("You don't have the required permissions to download " + folderPath + ".", SC_FORBIDDEN, log);
-            return false;
-        }
-        return true;
-    }
-
-    private boolean pathExceedsLimits(FolderDownloadInfo info, BasicStatusHolder status, String folderPath) {
-        if (info.getSizeMb() > maxDownloadSizeMb) {
-            status.error("Size of path '" + folderPath + "' (" + String.format("%.2f", info.getSizeMb()) + "MB) exceeds"
-                    + " the max allowed " + "folder download size (" + maxDownloadSizeMb + "MB).", SC_BAD_REQUEST, log);
-            return true;
-        } else if (info.getTotalFiles() > maxFiles) {
-            status.error("Number of files under the path '" + folderPath + "' (" + info.getTotalFiles() + ") exceeds " +
-                    "the max allowed file count for folder download (" + maxFiles + ").", SC_BAD_REQUEST, log);
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    public void destroy() {
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-    }
-
-    /**
-     * A resizable semaphore to act as the concurrent downloads counter for the service.
-     */
-    private static class ConcurrentDownloadCounter extends Semaphore {
-
-        private int permits;
-
-        public ConcurrentDownloadCounter(int permits, boolean fair) {
-            super(permits, fair);
-            this.permits = permits;
-        }
-
-        public synchronized void resize(int newSize) {
-            log.debug("Resizing download counter, old size: {}, new size: {}", permits, newSize);
-            int delta = newSize - permits;
-            if (delta == 0) {
-                log.trace("Same size chosen - no need to resize");
-                return;
-            } else if (delta > 0) {
-                log.trace("Adding {} permits", delta);
-                this.release(delta);
-            } else if (delta < 0) {
-                log.trace("Reducing {} permits", Math.abs(delta));
-                this.reducePermits(Math.abs(delta));
-            }
-            this.permits = newSize;
-            log.debug("Current available permits in counter: {}", this.availablePermits());
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/download/InternalFolderDownloadService.java b/backend/core/src/main/java/org/artifactory/download/InternalFolderDownloadService.java
deleted file mode 100644
index 8474a06..0000000
--- a/backend/core/src/main/java/org/artifactory/download/InternalFolderDownloadService.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.download;
-
-import org.artifactory.api.download.FolderDownloadService;
-import org.artifactory.spring.ReloadableBean;
-
-/**
- * @author Dan Feldman
- */
-public interface InternalFolderDownloadService extends FolderDownloadService, ReloadableBean {
-}
diff --git a/backend/core/src/main/java/org/artifactory/engine/DownloadServiceImpl.java b/backend/core/src/main/java/org/artifactory/engine/DownloadServiceImpl.java
deleted file mode 100644
index 85e00b3..0000000
--- a/backend/core/src/main/java/org/artifactory/engine/DownloadServiceImpl.java
+++ /dev/null
@@ -1,626 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.engine;
-
-import com.google.common.collect.Iterables;
-import org.apache.http.HttpStatus;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.plugin.PluginsAddon;
-import org.artifactory.addon.plugin.ResponseCtx;
-import org.artifactory.addon.plugin.download.*;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.jackson.JacksonFactory;
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.api.repo.exception.maven.BadPomException;
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.api.request.TranslatedArtifactoryRequest;
-import org.artifactory.api.rest.artifact.ItemProperties;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.io.SimpleResourceStreamHandle;
-import org.artifactory.io.StringResourceStreamHandle;
-import org.artifactory.md.MetadataDefinitionService;
-import org.artifactory.md.Properties;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.Repo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.request.*;
-import org.artifactory.resource.ChecksumResource;
-import org.artifactory.resource.ResourceStreamHandle;
-import org.artifactory.resource.UnfoundRepoResource;
-import org.artifactory.resource.UnfoundRepoResourceReason;
-import org.artifactory.service.SmartRepoService;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.storage.StorageException;
-import org.artifactory.traffic.TrafficService;
-import org.artifactory.util.HttpUtils;
-import org.artifactory.version.CompoundVersionDetails;
-import org.codehaus.jackson.JsonGenerator;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.MediaType;
-import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint;
-import org.springframework.stereotype.Service;
-
-import java.io.*;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Yoav Landman
- */
-
- at Service
- at Reloadable(beanClass = InternalDownloadService.class,
-        initAfter = {InternalRepositoryService.class})
-public class DownloadServiceImpl implements InternalDownloadService {
-
-    private static final Logger log = LoggerFactory.getLogger(DownloadServiceImpl.class);
-
-    @Autowired
-    private AuthorizationService authorizationService;
-
-    @Autowired
-    private BasicAuthenticationEntryPoint authenticationEntryPoint;
-
-    @Autowired
-    private InternalRepositoryService repositoryService;
-
-    @Autowired
-    private CentralConfigService centralConfig;
-
-    @Autowired
-    private TrafficService trafficService;
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Autowired
-    SmartRepoService smartRepoService;
-
-    private RequestResponseHelper requestResponseHelper;
-
-    @Override
-    public void init() {
-        requestResponseHelper = new RequestResponseHelper(trafficService);
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-    }
-
-    @Override
-    public void destroy() {
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-    }
-
-    /**
-     * Expects requests that starts with the repo url prefix and contains an optional target local repository. E.g.:
-     * <pre>http://localhost:8080/artifactory/repo/ant/ant-antlr/1.6.5/ant-antlr-1.6.5.jar</pre>
-     * <pre>http://localhost:8080/artifactory/repo/org/codehaus/xdoclet/xdoclet/2.0.5-SNAPSHOT/xdoclet-2.0.5-SNAPSHOT.jar</pre>
-     * or with a target local repo:
-     * <pre>http://localhost:8080/artifactory/local-repo/ant/ant-antlr/1.6.5/ant-antlr-1.6.5.jar</pre>
-     */
-    @Override
-    public void process(ArtifactoryRequest request, ArtifactoryResponse response) throws IOException {
-        RepoRequests.logToContext("Request source = %s, Last modified = %s, If modified since = %s, Thread name = %s",
-                request.getClientAddress(), centralConfig.format(request.getLastModified()),
-                request.getIfModifiedSince(), Thread.currentThread().getName());
-        if (response.isPropertiesQuery()) {
-            RepoRequests.logToContext("Requesting properties only with format " + response.getPropertiesMediaType());
-        }
-
-        //Check that this is not a recursive call
-        if (request.isRecursive()) {
-            RepoRequests.logToContext("Exiting download process - recursive call detected");
-            String msg = "Recursive call detected for '" + request + "'. Returning nothing.";
-            response.sendError(HttpStatus.SC_NOT_FOUND, msg, log);
-            return;
-        }
-
-        PluginsAddon pluginAddon = addonsManager.addonByType(PluginsAddon.class);
-        DownloadCtx downloadCtx = new DownloadCtx();
-        RepoRequests.logToContext("Executing any BeforeDownloadRequest user plugins that may exist");
-        pluginAddon.execPluginActions(BeforeDownloadRequestAction.class, downloadCtx, request, request.getRepoPath());
-
-        if (downloadCtx.getModifiedRepoPath() != null) {
-            RepoRequests.logToContext("BeforeDownloadRequest user plugins provided a modified repo path: " +
-                    downloadCtx.getModifiedRepoPath().getId());
-            request = new TranslatedArtifactoryRequest(downloadCtx.getModifiedRepoPath(), request);
-        }
-
-        if (NamingUtils.isMetadata(request.getPath())) {
-            // the repo filter redirects for the ":properties" paths. This is here to protect direct calls to this
-            // method (mainly from
-            response.sendError(HttpStatus.SC_CONFLICT, "Old metadata notation is not supported anymore: " +
-                    request.getRepoPath(), log);
-        }
-
-        String repoKey = request.getRepoKey();
-        if (VirtualRepoDescriptor.GLOBAL_VIRTUAL_REPO_KEY.equals(repoKey)
-                && ConstantValues.disableGlobalRepoAccess.getBoolean()) {
-            // The global /repo is disabled. Cannot be used here, returning 403!
-            response.sendError(HttpStatus.SC_FORBIDDEN, "Accessing the global virtual repository /repo is disabled!",
-                    log);
-        }
-
-        addonsManager.interceptResponse(response);
-        if (responseWasIntercepted(response)) {
-            RepoRequests.logToContext("Exiting download process - intercepted by addon manager");
-            return;
-        }
-
-        try {
-            Repo repository = repositoryService.repositoryByKey(repoKey);
-
-            DownloadRequestContext requestContext = new DownloadRequestContext(request, downloadCtx.isExpired());
-
-            RepoResource resource;
-            if (repository == null) {
-                RepoRequests.logToContext("Exiting download process - failed to find the repository '{}'", repoKey);
-                resource = new UnfoundRepoResource(request.getRepoPath(), "Failed to find the repository '" + repoKey +
-                        "' specified in the request.");
-            } else {
-                RepoRequests.logToContext("Retrieving info from {} repository '{}' type ",
-                        repository.isReal() ? ( repository.isCache() ? "cache" :
-                                ( repository.isLocal() ? "local" : "remote" ) ) : "virtual",
-                        repository.getKey(), repository.getDescriptor().getType().name());
-                resource = repository.getInfo(requestContext);
-            }
-
-            if (!request.isHeadOnly() && resource.isFound()) {
-                smartRepoService.onFileDownload(resource);
-            }
-            respond(requestContext, response, resource);
-
-        } catch (IOException e) {
-            RepoRequests.logToContext("Request failed: %s", e.getMessage());
-            //We can get here when sending a response while the client hangs up the connection.
-            //In this case the response will be committed so there is no point in sending an error.
-            if (!response.isCommitted()) {
-                response.sendInternalError(e, log);
-            }
-            throw e;
-        } finally {
-            if (response.isSuccessful()) {
-                RepoRequests.logToContext("Request succeeded");
-            }
-            try {
-                pluginAddon.execPluginActions(AfterDownloadAction.class, new Object(), request, response);
-            } catch (Exception e) {
-                RepoRequests.logToContext("Failed to execute After Download plugin: %s", e.getMessage());
-                throw e;
-            }
-        }
-    }
-
-    private boolean responseWasIntercepted(ArtifactoryResponse response) {
-        return response.isError();
-    }
-
-    private void respond(InternalRequestContext requestContext, ArtifactoryResponse response, RepoResource resource)
-            throws IOException {
-        try {
-            Request request = requestContext.getRequest();
-
-            boolean resourceFound = resource.isFound();
-            boolean headRequest = request.isHeadOnly();
-            boolean checksumRequest = request.isChecksum();
-            boolean targetRepoIsNotRemoteOrDoesntStore = isRepoNotRemoteOrDoesntStoreLocally(resource);
-
-            RepoRequests.logToContext("Requested resource is found = %s", resourceFound);
-            RepoRequests.logToContext("Request is HEAD = %s", headRequest);
-            RepoRequests.logToContext("Request is for a checksum = %s", checksumRequest);
-            RepoRequests.logToContext("Target repository is not remote or doesn't store locally = %s",
-                    targetRepoIsNotRemoteOrDoesntStore);
-            boolean notModified = isNotModified(request, resource);
-            RepoRequests.logToContext("Requested resource was not modified = %s", notModified);
-
-            if (!resourceFound) {
-                RepoRequests.logToContext("Responding with unfound resource");
-                respondResourceNotFound(requestContext, response, resource);
-            } else if (headRequest && !checksumRequest && targetRepoIsNotRemoteOrDoesntStore) {
-                /**
-                 * Send head response only if the file isn't a checksum. Also, if the repo is a remote, only respond
-                 * like this if we don't store artifacts locally (so that the whole artifact won't be requested twice),
-                 * otherwise download the artifact normally and return the full info for the head request
-                 */
-                RepoRequests.logToContext("Responding to HEAD request with status %s", response.getStatus());
-                if (notModified) {
-                    requestResponseHelper.sendNotModifiedResponse(response, resource);
-                } else {
-                    requestResponseHelper.sendHeadResponse(response, resource);
-                }
-            } else if (notModified) {
-                requestResponseHelper.sendNotModifiedResponse(response, resource);
-            } else if (checksumRequest) {
-                RepoRequests.logToContext("Responding to checksum request");
-                respondForChecksumRequest(request, response, resource);
-            } else {
-                RepoRequests.logToContext("Responding with found resource");
-                respondFoundResource(requestContext, response, resource);
-            }
-        } catch (FileNotFoundException e) {
-            RepoRequests.logToContext("File deleted while sending request response: %s", e.getMessage());
-            respondResourceNotFound(requestContext, response, resource);
-        } catch (IOException e) {
-            RepoRequests.logToContext("Error occurred while sending request response: %s", e.getMessage());
-            handleGenericIoException(response, resource, e);
-        }
-    }
-
-    private boolean isNotModified(Request request, RepoResource resource) {
-        boolean hasIfModifiedSince = request.hasIfModifiedSince();
-        boolean notModified = request.isNewerThan(resource.getLastModified());
-        boolean hasIfNoneMatch = request.hasIfNoneMatch();
-        boolean nonMatch = resource.getInfo() == null || request.isNoneMatch(resource.getInfo().getSha1());
-
-        if (notModified && !(hasIfNoneMatch && nonMatch)) {
-            RepoRequests.logToContext("Local resource isn't newer - sending a not modified response");
-            return true;
-        } else if (!nonMatch && hasIfNoneMatch && !hasIfModifiedSince) {
-            RepoRequests.logToContext("Local resource's entity exists - sending a not modified response");
-            return true;
-        }
-        return false;
-    }
-
-    private boolean isRepoNotRemoteOrDoesntStoreLocally(RepoResource resource) {
-        RemoteRepoDescriptor remoteRepoDescriptor = repositoryService.remoteRepoDescriptorByKey(
-                resource.getRepoPath().getRepoKey());
-        return (remoteRepoDescriptor == null) || !remoteRepoDescriptor.isStoreArtifactsLocally();
-    }
-
-    private void respondFoundResource(InternalRequestContext requestContext, ArtifactoryResponse response,
-            RepoResource resource) throws IOException {
-        //Get the actual repository the resource is in
-        RepoPath responseRepoPath = resource.getResponseRepoPath();
-        String repoKey = responseRepoPath.getRepoKey();
-
-        //Send the resource file back (will update the cache for remote repositories)
-        ResourceStreamHandle handle = getAlternateHandle(requestContext, response, responseRepoPath);
-        boolean alternateRedirect = HttpUtils.isRedirectionResponseCode(response.getStatus()) && handle != null;
-        // Error is every value that is not between 200-207, in case of alternateRedirect the status is 30x therefore we have to exclude this case
-        if (response.isError() && !alternateRedirect) {
-            RepoRequests.logToContext("Alternative response reset status as error - returning");
-            return;
-        }
-
-        Repo responseRepo = repositoryService.repositoryByKey(repoKey);
-
-        try {
-            if (handle == null) {
-                RepoRequests.logToContext("Retrieving a content handle from target repo");
-                //Only if we didn't already set an alternate response
-                handle = repositoryService.getResourceStreamHandle(requestContext, responseRepo, resource);
-            }
-            AddonsManager addonsManager = InternalContextHelper.get().beanForType(AddonsManager.class);
-            PluginsAddon pluginAddon = addonsManager.addonByType(PluginsAddon.class);
-            RepoRequests.logToContext("Executing any BeforeDownload user plugins that may exist");
-            pluginAddon.execPluginActions(BeforeDownloadAction.class, null, requestContext.getRequest(),
-                    responseRepoPath);
-
-            if (requestContext.getRequest().isHeadOnly()) {
-                /**
-                 * If we should response to a head, make sure repo is a remote and that stores locally (to save the
-                 * double artifact downloads)
-                 */
-                RepoRequests.logToContext("Request was of type HEAD - responding with no content");
-                requestResponseHelper.sendHeadResponse(response, resource);
-            } else if (response.isPropertiesQuery()) {
-                RepoRequests.logToContext("Request was of type Properties - responding with properties format "
-                        + response.getPropertiesMediaType());
-                Properties properties = repositoryService.getProperties(resource.getRepoPath());
-                if (properties != null && !properties.isEmpty()) {
-                    MediaType mediaType = MediaType.valueOf(response.getPropertiesMediaType());
-                    String content;
-                    if (mediaType.equals(MediaType.APPLICATION_XML)) {
-                        content = InternalContextHelper.get().beanForType(
-                                MetadataDefinitionService.class).getMetadataDefinition(
-                                Properties.class).getXmlProvider().toXml(properties);
-                    } else if (mediaType.equals(MediaType.APPLICATION_JSON)) {
-                        content = jsonProperties(responseRepoPath, properties);
-                    } else {
-                        response.sendError(HttpStatus.SC_BAD_REQUEST,
-                                "Media Type " + mediaType + " not supported!", log);
-                        return;
-                    }
-                    requestResponseHelper.updateResponseForProperties(response, resource, content, mediaType,
-                            requestContext);
-                } else {
-                    RepoRequests.logToContext("No properties found. Responding with 404");
-                    response.sendError(HttpStatus.SC_NOT_FOUND, "No properties could be found.", log);
-                }
-            } else {
-                RepoRequests.logToContext("Responding with selected content handle");
-                //Streaming the file is done outside a tx, so there is a chance that the content will change!
-                requestResponseHelper.sendBodyResponse(response, resource, handle, requestContext);
-            }
-        } catch (RepoRejectException rre) {
-            int status = rre.getErrorCode();
-            log.debug("Repo rejection while downloading: " + rre.getMessage(), rre);
-            if (status == HttpStatus.SC_FORBIDDEN && authorizationService.isAnonymous()) {
-                RepoRequests.logToContext("Response status is '%s' and authenticated as anonymous - sending challenge",
-                        status);
-
-                // Transform a forbidden to unauthorized if received for an anonymous user
-                response.sendAuthorizationRequired(rre.getMessage(), authenticationEntryPoint.getRealmName());
-            } else {
-                RepoRequests.logToContext("Error occurred while sending response - sending error instead: %s",
-                        rre.getMessage());
-                String msg = "Rejected artifact download request: " + rre.getMessage();
-                sendError(requestContext, response, status, msg, log);
-            }
-        } catch (RemoteRequestException rre) {
-            log.debug("Remote exception while downloading: " + rre.getMessage(), rre);
-            RepoRequests.logToContext("Error occurred while sending response - sending error instead: %s",
-                    rre.getMessage());
-            sendError(requestContext, response, rre.getRemoteReturnCode(), rre.getMessage(), log);
-        } catch (BadPomException bpe) {
-            log.debug("Bad pom while downloading: " + bpe.getMessage(), bpe);
-            RepoRequests.logToContext("Error occurred while sending response - sending error instead: %s",
-                    bpe.getMessage());
-            sendError(requestContext, response, HttpStatus.SC_CONFLICT, bpe.getMessage(), log);
-        } catch (StorageException se) {
-            log.debug("Exception while downloading: " + se.getMessage(), se);
-            RepoRequests.logToContext("Error occurred while sending response - sending error instead: %s",
-                    se.getMessage());
-            sendError(requestContext, response, HttpStatus.SC_INTERNAL_SERVER_ERROR, se.getMessage(), log);
-        } finally {
-            response.close(handle);
-        }
-    }
-
-    private String jsonProperties(RepoPath repoPath, Properties properties) throws IOException {
-        ItemProperties itemProperties = new ItemProperties();
-        for (String propertyName : properties.keySet()) {
-            Set<String> propertySet = properties.get(propertyName);
-            if ((propertySet != null) && !propertySet.isEmpty()) {
-                itemProperties.properties.put(propertyName, Iterables.toArray(propertySet, String.class));
-            }
-        }
-        itemProperties.slf = repoPath.getRepoKey() + "/" + repoPath.getPath();
-        StringWriter out = new StringWriter();
-        JsonGenerator generator = JacksonFactory.createJsonGenerator(out);
-        generator.writeObject(itemProperties);
-        return out.getBuffer().toString();
-    }
-
-    private void sendError(InternalRequestContext requestContext, ArtifactoryResponse response, int status,
-            String reason, Logger log) throws IOException {
-        RepoRequests.logToContext("Sending error with status %s and message '%s'", status, reason);
-        PluginsAddon pluginAddon = addonsManager.addonByType(PluginsAddon.class);
-        ResponseCtx responseCtx = new ResponseCtx();
-        responseCtx.setMessage(reason);
-        responseCtx.setStatus(status);
-        pluginAddon.execPluginActions(AfterDownloadErrorAction.class, responseCtx, requestContext.getRequest());
-        RepoRequests.logToContext("Executing any AfterDownloadErrorAction user plugins that may exist");
-
-        status = responseCtx.getStatus();
-        String message = responseCtx.getMessage();
-
-        if (HttpUtils.isSuccessfulResponseCode(status)) {//plugin changed the status, it's not error anymore
-            RepoRequests.logToContext("Response code was modified to %s by the user plugins", status);
-            response.setStatus(status);
-            if (responseCtx.getInputStream() == null) {// no content, so only message (if set) and status
-                RepoRequests.logToContext("Received no response content from the user plugins");
-                //message changed in the plugin, need to write it as response
-                if (reason != null && !reason.equals(message)) {
-                    RepoRequests.logToContext("Response message was modified to '%s' by the user plugins", message);
-                    response.getWriter().write(message);
-                }
-                RepoRequests.logToContext("Sending successful response");
-                response.sendSuccess();
-            } else {//yay, content from plugin!
-                RepoRequests.logToContext("Received a response content stream from the user plugins - sending");
-                if (responseCtx.hasSize()) {
-                    response.setContentLength(responseCtx.getSize());
-                }
-                response.sendStream(responseCtx.getInputStream());
-            }
-        } else { //still error, proceed as usual
-            RepoRequests.logToContext("Response code wasn't modified by the user plugins");
-            if (!message.equals(reason)) {
-                RepoRequests.logToContext("Response message was modified to '%s' by the user plugins", message);
-            }
-            reason = message; // in case user changed the reason in the plugin
-            if (status == HttpStatus.SC_FORBIDDEN && authorizationService.isAnonymous()) {
-                RepoRequests.logToContext("Response status is '%s' and authenticated as anonymous - sending challenge",
-                        status);
-                // Transform a forbidden to unauthorized if received for an anonymous user
-                String realmName = authenticationEntryPoint.getRealmName();
-                response.sendAuthorizationRequired(reason, realmName);
-            } else {
-                RepoRequests.logToContext("Sending response with the status '%s' and the message '%s'", status,
-                        message);
-                response.sendError(status, reason, log);
-            }
-        }
-    }
-
-
-    /**
-     * Executes any subscribing user plugin routines and returns an alternate resource handle if given
-     *
-     * @param requestContext   Context
-     * @param response         Response to return
-     * @param responseRepoPath Actual repo path of the requested artifact
-     * @return Stream handle if return by plugins. Null if not.
-     */
-    private ResourceStreamHandle getAlternateHandle(RequestContext requestContext, ArtifactoryResponse response,
-            RepoPath responseRepoPath) throws IOException {
-        //See if we need to return an alternate response
-
-        RepoRequests.logToContext("Executing any AltResponse user plugins that may exist");
-        AddonsManager addonsManager = InternalContextHelper.get().beanForType(AddonsManager.class);
-        PluginsAddon pluginAddon = addonsManager.addonByType(PluginsAddon.class);
-        ResponseCtx responseCtx = new ResponseCtx();
-        pluginAddon.execPluginActions(AltResponseAction.class, responseCtx, requestContext.getRequest(),
-                responseRepoPath);
-        int status = responseCtx.getStatus();
-        String message = responseCtx.getMessage();
-        RepoRequests.logToContext("Alternative response status is set to %s and message to '%s'", status, message);
-        if (status != ResponseCtx.UNSET_STATUS) {
-            Map<String, String> headers = responseCtx.getHeaders();
-            if (headers != null) {
-                RepoRequests.logToContext("Found non-null alternative response headers");
-                for (Map.Entry<String, String> headerEntry : headers.entrySet()) {
-                    response.setHeader(headerEntry.getKey(), headerEntry.getValue());
-                }
-            }
-            if (HttpUtils.isSuccessfulResponseCode(status) || HttpUtils.isRedirectionResponseCode(status)) {
-                RepoRequests.logToContext("Setting response status to %s", status);
-                response.setStatus(status);
-                if (message != null) {
-                    RepoRequests.logToContext("Found non-null alternative response message - " +
-                            "returning as content handle");
-                    return new StringResourceStreamHandle(message);
-                }
-            } else {
-                RepoRequests.logToContext("Sending error response with alternative status and message");
-                response.sendError(status, message, log);
-                return null;
-            }
-        }
-        InputStream is = responseCtx.getInputStream();
-        if (is != null) {
-            RepoRequests.logToContext("Found non-null alternative response content stream - " +
-                    "returning as content handle");
-            return new SimpleResourceStreamHandle(is, responseCtx.getSize());
-        }
-        RepoRequests.logToContext("Found no alternative content handles");
-        return null;
-    }
-
-    private void respondResourceNotFound(InternalRequestContext requestContext, ArtifactoryResponse response,
-            RepoResource resource) throws IOException {
-        String detail = "Resource not found";
-        int status = HttpStatus.SC_NOT_FOUND;
-        RepoRequests.logToContext("Setting default response status to '%s' reason to '%s'", status, detail);
-        if (resource instanceof UnfoundRepoResourceReason) {
-            RepoRequests.logToContext("Response is an instance of UnfoundRepoResourceReason");
-            UnfoundRepoResourceReason unfound = (UnfoundRepoResourceReason) resource;
-            // use the reason and status from the resource unless it's authorization response and the
-            // settings prohibit revealing this information
-            boolean hideUnauthorizedResources =
-                    centralConfig.getDescriptor().getSecurity().isHideUnauthorizedResources();
-            boolean originalStatusNotAuthorization = notAuthorizationStatus(unfound.getStatusCode());
-            RepoRequests.logToContext("Configured to hide un-authorized resources = %s",
-                    Boolean.toString(hideUnauthorizedResources));
-            RepoRequests.logToContext("Original response status is auth related = %s",
-                    Boolean.toString(!originalStatusNotAuthorization));
-            if (!hideUnauthorizedResources || originalStatusNotAuthorization) {
-                detail = unfound.getDetail();
-                status = unfound.getStatusCode();
-                RepoRequests.logToContext("Using original response status of '%s' and message '%s'", status, detail);
-            }
-        }
-        if (status == HttpStatus.SC_FORBIDDEN && authorizationService.isAnonymous()) {
-            RepoRequests.logToContext("Response status is '%s' and authenticated as anonymous - sending challenge",
-                    status);
-            // Transform a forbidden to unauthorized if received for an anonymous user
-            String realmName = authenticationEntryPoint.getRealmName();
-            response.sendAuthorizationRequired(detail, realmName);
-        } else {
-            sendError(requestContext, response, status, detail, log);
-        }
-    }
-
-    private boolean notAuthorizationStatus(int status) {
-        return status != HttpStatus.SC_UNAUTHORIZED && status != HttpStatus.SC_FORBIDDEN;
-    }
-
-    /**
-     * This method handles the response to checksum requests (HEAD and GET). Even though this method is called only for
-     * files that exist, some checksum policies might return null values, or even fail if the checksum algorithm is not
-     * found. If for any reason we don't have the checksum we return http 404 to the client and let the client decide
-     * how to proceed.
-     */
-    private void respondForChecksumRequest(Request request, ArtifactoryResponse response,
-            RepoResource resource) throws IOException {
-
-        RepoPath requestRepoPath = request.getRepoPath();
-        if (request.isZipResourceRequest()) {
-            RepoRequests.logToContext("Requested resource is located within an archive");
-            requestRepoPath = InternalRepoPathFactory
-                    .archiveResourceRepoPath(requestRepoPath, request.getZipResourcePath());
-        }
-        String requestChecksumFilePath = requestRepoPath.getPath();
-        ChecksumType checksumType = ChecksumType.forFilePath(requestChecksumFilePath);
-        if (checksumType == null) {
-            RepoRequests.logToContext("Unable to detect the type of the requested checksum - responding with status %s",
-                    HttpStatus.SC_NOT_FOUND);
-            response.sendError(HttpStatus.SC_NOT_FOUND, "Checksum not found: " + requestChecksumFilePath, log);
-            return;
-        }
-
-        RepoPath responseRepoPath = resource.getResponseRepoPath();
-        String repoKey = responseRepoPath.getRepoKey();
-        String responsePath = responseRepoPath.getPath();
-        Repo repository = repositoryService.repositoryByKey(repoKey);
-        String checksum = repository.getChecksum(responsePath + checksumType.ext(), resource);
-        if (checksum == null) {
-            RepoRequests.logToContext("Unable to find the the requested checksum - responding with status %s",
-                    HttpStatus.SC_NOT_FOUND);
-            response.sendError(HttpStatus.SC_NOT_FOUND, "Checksum not found for " + responsePath, log);
-            return;
-        }
-
-        if (request.isHeadOnly()) {
-            RepoRequests.logToContext("Sending checksum HEAD response");
-            // send head response using the checksum data
-            ChecksumResource checksumResource = new ChecksumResource(resource, checksumType, checksum);
-            requestResponseHelper.sendHeadResponse(response, checksumResource);
-        } else {
-            AddonsManager addonsManager = InternalContextHelper.get().beanForType(AddonsManager.class);
-            PluginsAddon pluginAddon = addonsManager.addonByType(PluginsAddon.class);
-            RepoRequests.logToContext("Executing any BeforeDownloadAction user plugins that may exist");
-            pluginAddon.execPluginActions(BeforeDownloadAction.class, null, request, responseRepoPath);
-            // send the checksum as the response body, use the original repo path (the checksum path,
-            // not the file) from the request
-            RepoRequests.logToContext("Sending checksum response with status %s", response.getStatus());
-
-            requestResponseHelper.sendBodyResponse(response, requestRepoPath, checksum, request);
-        }
-    }
-
-    private void handleGenericIoException(ArtifactoryResponse response, RepoResource res, IOException e)
-            throws IOException {
-        if (e instanceof InterruptedIOException) {
-            String msg = this + ": Timed out when retrieving data for " + res.getRepoPath()
-                    + " (" + e.getMessage() + ").";
-            RepoRequests.logToContext("Setting response status to %s - %s", HttpStatus.SC_NOT_FOUND, msg);
-            response.sendError(HttpStatus.SC_NOT_FOUND, msg, log);
-        } else {
-            throw e;
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/engine/InternalDownloadService.java b/backend/core/src/main/java/org/artifactory/engine/InternalDownloadService.java
deleted file mode 100644
index e2feffd..0000000
--- a/backend/core/src/main/java/org/artifactory/engine/InternalDownloadService.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.engine;
-
-import org.artifactory.api.request.DownloadService;
-import org.artifactory.spring.ReloadableBean;
-
-/**
- * @author freds
- * @date Oct 28, 2008
- */
-public interface InternalDownloadService extends DownloadService, ReloadableBean {
-
-}
diff --git a/backend/core/src/main/java/org/artifactory/engine/InternalUploadService.java b/backend/core/src/main/java/org/artifactory/engine/InternalUploadService.java
deleted file mode 100644
index dc108fa..0000000
--- a/backend/core/src/main/java/org/artifactory/engine/InternalUploadService.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.engine;
-
-import org.artifactory.api.repo.Request;
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.api.request.UploadService;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.request.ArtifactoryRequest;
-import org.artifactory.sapi.common.Lock;
-
-import java.io.IOException;
-
-/**
- * The internal implementation of the upload service
- *
- * @author Noam Y. Tenne
- */
-public interface InternalUploadService extends UploadService {
-
-    /**
-     * Performs the upload within a new transaction.
-     *
-     * @param request  Originating request
-     * @param response Response to send
-     * @param repo     Target local non-cache repo
-     */
-    @Lock
-    @Request(aggregateEventsByTimeWindow = true)
-    void uploadWithinTransaction(ArtifactoryRequest request, ArtifactoryResponse response, LocalRepo repo)
-            throws IOException,
-            RepoRejectException;
-}
diff --git a/backend/core/src/main/java/org/artifactory/engine/SuccessfulDeploymentResponseHelper.java b/backend/core/src/main/java/org/artifactory/engine/SuccessfulDeploymentResponseHelper.java
deleted file mode 100644
index adb4222..0000000
--- a/backend/core/src/main/java/org/artifactory/engine/SuccessfulDeploymentResponseHelper.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.engine;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpHeaders;
-import org.apache.http.HttpStatus;
-import org.artifactory.api.jackson.JacksonFactory;
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.api.rest.artifact.RestBaseStorageInfo;
-import org.artifactory.api.rest.artifact.RestFileInfo;
-import org.artifactory.api.rest.artifact.RestFolderInfo;
-import org.artifactory.api.rest.constant.ArtifactRestConstants;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.checksum.ChecksumsInfo;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.util.PathUtils;
-import org.codehaus.jackson.JsonGenerator;
-import org.joda.time.format.ISODateTimeFormat;
-
-import java.io.IOException;
-import java.io.Writer;
-
-/**
- * Implements the spec of the HTTP 201 (Created) response by adding the final file URI to the Location header and
- * including general file information in the response body.
- */
-public class SuccessfulDeploymentResponseHelper {
-
-    /**
-     * Writes the spec implementation response
-     *
-     * @param repoService Instance of repo service
-     * @param response    Response object
-     * @param repoPath    Repo path of deployed artifact
-     * @param url         Final reachable URI of deployed file
-     */
-    public void writeSuccessfulDeploymentResponse(InternalRepositoryService repoService, ArtifactoryResponse response,
-            RepoPath repoPath, String url, boolean isDirectory) throws IOException {
-
-        Writer writer = response.getWriter();
-        response.setHeader(HttpHeaders.LOCATION, url);
-        response.setStatus(HttpStatus.SC_CREATED);
-        response.setContentType(ArtifactRestConstants.MT_ITEM_CREATED);
-        RestBaseStorageInfo storageInfo;
-        if (isDirectory) {
-            storageInfo = getFolderInfo(repoService, repoPath, url);
-        } else {
-            storageInfo = getFileInfo(repoService, repoPath, url);
-        }
-
-        JsonGenerator jsonGenerator = JacksonFactory.createJsonGenerator(writer);
-        jsonGenerator.writeObject(storageInfo);
-        jsonGenerator.close();
-        writer.flush();
-    }
-
-    private RestFolderInfo getFolderInfo(InternalRepositoryService repoService, RepoPath repoPath, String url) {
-        RestFolderInfo folderInfo = new RestFolderInfo();
-        FolderInfo createdFolder = repoService.getFolderInfo(repoPath);
-        folderInfo.created = ISODateTimeFormat.dateTime().print(createdFolder.getCreated());
-        folderInfo.createdBy = createdFolder.getCreatedBy();
-        folderInfo.path = PathUtils.addTrailingSlash("/" + repoPath.getPath());
-        folderInfo.repo = repoPath.getRepoKey();
-        folderInfo.slf = PathUtils.addTrailingSlash(url);
-        return folderInfo;
-    }
-
-    private RestFileInfo getFileInfo(InternalRepositoryService repoService, RepoPath repoPath, String url) {
-        RestFileInfo fileInfo = new RestFileInfo();
-        FileInfo deployedInfo = repoService.getFileInfo(repoPath);
-        ChecksumsInfo checksumsInfo = deployedInfo.getChecksumsInfo();
-        fileInfo.checksums = getActualChecksums(checksumsInfo);
-        fileInfo.created = ISODateTimeFormat.dateTime().print(deployedInfo.getCreated());
-        fileInfo.createdBy = deployedInfo.getCreatedBy();
-        fileInfo.downloadUri = url;
-        fileInfo.mimeType = deployedInfo.getMimeType();
-        fileInfo.originalChecksums = getOriginalChecksums(checksumsInfo);
-        fileInfo.path = "/" + repoPath.getPath();
-        fileInfo.repo = repoPath.getRepoKey();
-        fileInfo.size = String.valueOf(deployedInfo.getSize());
-        fileInfo.slf = url;
-        return fileInfo;
-    }
-
-    private RestFileInfo.Checksums getActualChecksums(ChecksumsInfo checksumsInfo) {
-        String md5 = null;
-        String sha1 = null;
-
-        ChecksumInfo md5Checksums = checksumsInfo.getChecksumInfo(ChecksumType.md5);
-        if (md5Checksums != null) {
-            String actualMd5 = md5Checksums.getActual();
-            if (StringUtils.isNotBlank(actualMd5)) {
-                md5 = actualMd5;
-            }
-        }
-        ChecksumInfo sha1Checksums = checksumsInfo.getChecksumInfo(ChecksumType.sha1);
-        if (sha1Checksums != null) {
-            String actualSha1 = sha1Checksums.getActual();
-            if (StringUtils.isNotBlank(actualSha1)) {
-                sha1 = actualSha1;
-            }
-        }
-
-        return new RestFileInfo.Checksums(sha1, md5);
-    }
-
-    private RestFileInfo.Checksums getOriginalChecksums(ChecksumsInfo checksumsInfo) {
-        String md5 = null;
-        String sha1 = null;
-
-        ChecksumInfo md5Checksums = checksumsInfo.getChecksumInfo(ChecksumType.md5);
-        if (md5Checksums != null) {
-            String originalMd5 = md5Checksums.getOriginal();
-            if (StringUtils.isNotBlank(originalMd5)) {
-                md5 = originalMd5;
-            }
-        }
-        ChecksumInfo sha1Checksums = checksumsInfo.getChecksumInfo(ChecksumType.sha1);
-        if (sha1Checksums != null) {
-            String originalSha1 = sha1Checksums.getOriginal();
-            if (StringUtils.isNotBlank(originalSha1)) {
-                sha1 = originalSha1;
-            }
-        }
-
-        return new RestFileInfo.Checksums(sha1, md5);
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/engine/UploadServiceImpl.java b/backend/core/src/main/java/org/artifactory/engine/UploadServiceImpl.java
deleted file mode 100644
index df86af9..0000000
--- a/backend/core/src/main/java/org/artifactory/engine/UploadServiceImpl.java
+++ /dev/null
@@ -1,742 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.engine;
-
-import com.google.common.collect.Sets;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.io.output.NullOutputStream;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpHeaders;
-import org.apache.http.HttpStatus;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.RestCoreAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.repo.exception.FileExpectedException;
-import org.artifactory.api.repo.exception.ItemNotFoundRuntimeException;
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.api.repo.exception.maven.BadPomException;
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.api.request.InternalArtifactoryRequest;
-import org.artifactory.api.request.UploadService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.SnapshotVersionBehavior;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.MutableFileInfo;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.io.checksum.ChecksumUtil;
-import org.artifactory.io.checksum.policy.ChecksumPolicy;
-import org.artifactory.io.checksum.policy.LocalRepoChecksumPolicy;
-import org.artifactory.md.MutablePropertiesInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.md.PropertiesXmlProvider;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.model.xstream.fs.PropertiesImpl;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.SaveResourceContext;
-import org.artifactory.repo.local.ValidDeployPathContext;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.repo.snapshot.MavenSnapshotVersionAdapter;
-import org.artifactory.repo.snapshot.MavenSnapshotVersionAdapterContext;
-import org.artifactory.request.ArtifactoryRequest;
-import org.artifactory.resource.FileResource;
-import org.artifactory.resource.MutableRepoResourceInfo;
-import org.artifactory.resource.UnfoundRepoResource;
-import org.artifactory.storage.binstore.service.BinaryInfo;
-import org.artifactory.storage.binstore.service.BinaryService;
-import org.artifactory.storage.db.binstore.service.BinaryServiceInputStream;
-import org.artifactory.traffic.TrafficService;
-import org.artifactory.traffic.entry.UploadEntry;
-import org.artifactory.util.HttpUtils;
-import org.artifactory.util.PathUtils;
-import org.artifactory.webapp.servlet.DelayedHttpResponse;
-import org.artifactory.webapp.servlet.HttpArtifactoryResponse;
-import org.jfrog.storage.binstore.exceptions.BinaryNotFoundException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint;
-import org.springframework.stereotype.Service;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Set;
-
-import static org.apache.http.HttpStatus.*;
-import static org.artifactory.descriptor.repo.LocalRepoChecksumPolicyType.SERVER;
-import static org.artifactory.descriptor.repo.SnapshotVersionBehavior.DEPLOYER;
-
-/**
- * Handles upload of a single item. The item can be file, directory, properties, checksum data etc.
- * This service validates the request and delegates the actual upload to the repo and repo service.
- *
- * @author Yoav Landman
- */
- at Service
-public class UploadServiceImpl implements UploadService {
-    private static final Logger log = LoggerFactory.getLogger(UploadServiceImpl.class);
-
-    @Autowired
-    private AuthorizationService authService;
-
-    @Autowired
-    private InternalRepositoryService repoService;
-
-    @Autowired
-    private BinaryService binaryService;
-
-    @Autowired
-    private BasicAuthenticationEntryPoint authenticationEntryPoint;
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Autowired
-    private TrafficService trafficService;
-
-    private SuccessfulDeploymentResponseHelper successfulDeploymentResponseHelper =
-            new SuccessfulDeploymentResponseHelper();
-
-    @Override
-    public void upload(ArtifactoryRequest request, ArtifactoryResponse response) throws IOException,
-            RepoRejectException {
-        log.debug("Request: {}", request);
-
-        addonsManager.interceptResponse(response);
-        if (responseWasIntercepted(response)) {
-            return;
-        }
-
-        validateRequestAndUpload(request, response);
-    }
-
-    private boolean responseWasIntercepted(ArtifactoryResponse response) {
-        return response.isError();
-    }
-
-    private void validateRequestAndUpload(ArtifactoryRequest request, ArtifactoryResponse response) throws IOException {
-        if (isRequestedRepoKeyInvalid(request)) {
-            response.sendError(SC_NOT_FOUND, "No target local repository specified in deploy request.", log);
-            return;
-        }
-
-        LocalRepo targetRepository = getTargetRepository(request);
-        if (isTargetRepositoryInvalid(targetRepository)) {
-            sendInvalidTargetRepositoryError(request, response);
-            return;
-        }
-
-        if (NamingUtils.isProperties(request.getPath())) {
-            validateAndUploadProperties(request, response, targetRepository);
-            return;
-        }
-
-        try {
-            long contentLength = request.getContentLength();
-            RepoPath repoPath = InternalRepoPathFactory.create(targetRepository.getKey(), request.getPath(),
-                    request.isDirectoryRequest());
-            String requestSha1 = HttpUtils.getSha1Checksum(request);
-            repoService.assertValidDeployPath(new ValidDeployPathContext.Builder(targetRepository, repoPath)
-                    .contentLength(contentLength).requestSha1(requestSha1).build());
-        } catch (RepoRejectException e) {
-            handleInvalidDeployPathError(request, response, e);
-            return;
-        }
-
-        adjustResponseAndUpload(request, response, targetRepository);
-    }
-
-    private boolean isRequestedRepoKeyInvalid(ArtifactoryRequest request) {
-        return StringUtils.isBlank(request.getRepoKey());
-    }
-
-    private LocalRepo getTargetRepository(ArtifactoryRequest request) {
-        String repoKey = request.getRepoKey();
-        VirtualRepoDescriptor virtualRepoDescriptor = repoService.virtualRepoDescriptorByKey(repoKey);
-        if (virtualRepoDescriptor == null) {
-            return repoService.localRepositoryByKey(repoKey);
-        }
-
-        LocalRepoDescriptor defaultDeploymentRepo = virtualRepoDescriptor.getDefaultDeploymentRepo();
-        return defaultDeploymentRepo != null ? repoService.localRepositoryByKey(defaultDeploymentRepo.getKey()) : null;
-    }
-
-    private boolean isTargetRepositoryInvalid(LocalRepo targetRepository) {
-        return targetRepository == null;
-    }
-
-    private void sendInvalidTargetRepositoryError(ArtifactoryRequest request, ArtifactoryResponse response)
-            throws IOException {
-        int responseStatus;
-        String responseMessage;
-        String repoKey = request.getRepoKey();
-
-        if (isKeyOfVirtualRepository(repoKey)) {
-
-            response.setHeader("Allow", "GET");
-            responseStatus = HttpStatus.SC_METHOD_NOT_ALLOWED;
-            responseMessage = "No local repository was configured as local deployment " +
-                    "repository for the (" + repoKey + ") virtual repository.";
-        } else {
-
-            responseStatus = SC_NOT_FOUND;
-            responseMessage = "Could not find a local repository named " + repoKey + " to deploy to.";
-        }
-        response.sendError(responseStatus, responseMessage, log);
-    }
-
-    private boolean isKeyOfVirtualRepository(String repoKey) {
-        return repoService.virtualRepoDescriptorByKey(repoKey) != null;
-    }
-
-    private void adjustResponseAndUpload(ArtifactoryRequest request, ArtifactoryResponse response,
-            LocalRepo targetRepository) throws IOException {
-        if (processOriginatedExternally(response)) {
-            response = new DelayedHttpResponse((HttpArtifactoryResponse) response);
-        }
-        try {
-            if (request.isDirectoryRequest()) {
-                createDirectory(request, response);
-            } else if (request.isChecksum()) {
-                validateAndUploadChecksum(request, response, targetRepository);
-            } else if (NamingUtils.isMetadata(request.getPath())) {
-                response.sendError(SC_CONFLICT, "Old metadata notation is not supported anymore: " +
-                        request.getRepoPath(), log);
-            } else {
-                uploadArtifact(request, response, targetRepository);
-            }
-        } catch (RepoRejectException e) {
-            //Catch rejections on save
-            response.sendError(e.getErrorCode(), e.getMessage(), log);
-            return;
-        }
-        commitResponseIfDelayed(response);
-    }
-
-    private void handleInvalidDeployPathError(ArtifactoryRequest request, ArtifactoryResponse response,
-            RepoRejectException rejectionException)
-            throws IOException {
-        if (rejectionSignifiesRequiredAuthorization(rejectionException)) {
-            consumeRequestBody(request);
-            String realmName = authenticationEntryPoint.getRealmName();
-            response.sendAuthorizationRequired(rejectionException.getMessage(), realmName);
-        } else {
-            response.sendError(rejectionException.getErrorCode(), rejectionException.getMessage(), log);
-        }
-    }
-
-    private void consumeRequestBody(ArtifactoryRequest request) throws IOException {
-        IOUtils.copy(request.getInputStream(), new NullOutputStream());
-    }
-
-    private boolean rejectionSignifiesRequiredAuthorization(RepoRejectException rejectionException) {
-        return (rejectionException.getErrorCode() == HttpStatus.SC_FORBIDDEN) && authService.isAnonymous();
-    }
-
-    private boolean processOriginatedExternally(ArtifactoryResponse response) {
-        //Must check the type of the response instead of the request since the HTTP request object isn't accessible here
-        return response instanceof HttpArtifactoryResponse;
-    }
-
-    private void commitResponseIfDelayed(ArtifactoryResponse response) throws IOException {
-        if (response instanceof DelayedHttpResponse) {
-            ((DelayedHttpResponse) response).commitResponseCode();
-        }
-    }
-
-    private void createDirectory(ArtifactoryRequest request, ArtifactoryResponse response) throws IOException {
-        RepoPath repoPath = request.getRepoPath();
-        log.info("MKDir request to '{}'", request.getRepoPath());
-
-        repoService.mkdirs(repoPath);
-        annotateWithRequestPropertiesIfPermitted(request, repoPath);
-
-        sendSuccessfulResponse(request, response, repoPath, true);
-        log.info("Successfully created directory '{}'", request.getRepoPath());
-    }
-
-    private void annotateWithRequestPropertiesIfPermitted(ArtifactoryRequest request, RepoPath repoPath) {
-        if (authService.canAnnotate(repoPath)) {
-            Properties properties = request.getProperties();
-            repoService.setProperties(repoPath, properties);
-        }
-    }
-
-    private void validateAndUploadChecksum(ArtifactoryRequest request, ArtifactoryResponse response, LocalRepo repo)
-            throws IOException {
-        long length = request.getContentLength();
-        if (isAbnormalChecksumContentLength(length)) {
-            // something is fishy, checksum file should not be so big...
-            response.sendError(SC_CONFLICT, "Suspicious checksum file, content length of " + length +
-                    " bytes is bigger than allowed.", log);
-            return;
-        }
-
-        log.info("Deploy to '{}' Content-Length: {}", request.getRepoPath(), length < 0 ? "unspecified" : length);
-
-        String checksumPath = request.getPath();
-        if (NamingUtils.isMetadataChecksum(checksumPath) || MavenNaming.isMavenMetadataChecksum(checksumPath)) {
-            //Ignore request - we maintain our self-calculated checksums for metadata
-            consumeContentAndRespondWithSuccess(request, response);
-            return;
-        }
-
-        validatePathAndUploadChecksum(request, response, repo);
-    }
-
-    /**
-     * @see <a href="http://wiki.jfrog.org/confluence/display/RTF30/Artifactory%27s+REST+API#Artifactory'sRESTAPI-SetItemProperties">Set Item Properties REST API</a>
-     * @deprecated can use the set item properties REST API instead, see
-     */
-    private void validateAndUploadProperties(ArtifactoryRequest request, ArtifactoryResponse response, LocalRepo repo)
-            throws IOException {
-        //TORE: [by YS] this doesn't belong here
-        long length = request.getContentLength();
-        if (isAbnormalPropertiesContentLength(length)) {
-            // something is fishy, checksum file should not be so big...
-            response.sendError(SC_CONFLICT, "Properties content length of " + length +
-                    " bytes is bigger than allowed.", log);
-            return;
-        }
-
-        log.info("Deploy properties to '{}' Content-Length: {}", request.getRepoPath(),
-                length < 0 ? "unspecified" : length);
-
-        String path = request.getPath();
-        if (isMavenRepo(repo)) {
-            path = adjustMavenSnapshotPath(repo, request);
-        }
-
-        RepoPathImpl itemRepoPath = new RepoPathImpl(request.getRepoKey(),
-                NamingUtils.stripMetadataFromPath(path));
-
-        try {
-            String propertiesStr = IOUtils.toString(request.getInputStream());
-            PropertiesXmlProvider propertiesXmlProvider = new PropertiesXmlProvider();
-            MutablePropertiesInfo propertiesInfo = propertiesXmlProvider.fromXml(propertiesStr);
-            Properties properties = new PropertiesImpl(propertiesInfo);
-            boolean success = repoService.setProperties(itemRepoPath, properties);
-            if (success) {
-                response.setStatus(SC_CREATED);
-            } else {
-                response.sendError(SC_NOT_FOUND, "Failed to set properties on " + itemRepoPath, log);
-            }
-        } catch (Exception e) {
-            log.debug("Failed to deploy properties to '" + itemRepoPath + "'", e);
-            response.sendError(SC_CONFLICT, "Failed to deploy properties : " + e.getMessage() +
-                    " on path " + request.getRepoPath(), log);
-        }
-    }
-
-    private boolean isAbnormalChecksumContentLength(long length) {
-        return length > 1024;
-    }
-
-    private boolean isAbnormalPropertiesContentLength(long length) {
-        int maxLength = ConstantValues.replicationPropertiesMaxLength.getInt();
-        return length > maxLength;
-    }
-
-    private void consumeContentAndRespondWithSuccess(ArtifactoryRequest request, ArtifactoryResponse response)
-            throws IOException {
-        consumeRequestBody(request);
-        response.sendSuccess();
-    }
-
-    private void validatePathAndUploadChecksum(ArtifactoryRequest request, ArtifactoryResponse response,
-            LocalRepo repo) throws IOException {
-
-        String uploadedChecksum;
-        try {
-            uploadedChecksum = getChecksumContentAsString(request);
-        } catch (IOException e) {
-            response.sendError(SC_CONFLICT, "Failed to read checksum from file: " + e.getMessage() +
-                    " for path " + request.getRepoPath(), log);
-            return;
-        }
-
-        ChecksumType checksumType = ChecksumType.forFilePath(request.getPath());
-        RepoPath targetFileRepoPath = adjustAndGetChecksumTargetRepoPath(request, repo);
-        try {
-            ChecksumInfo checksumInfo = repoService.setClientChecksum(repo, checksumType, targetFileRepoPath,
-                    uploadedChecksum);
-            if (isChecksumValidAccordingToPolicy(uploadedChecksum, checksumInfo)) {
-                sendUploadedChecksumResponse(request, response, targetFileRepoPath);
-            } else {
-                String message = String.format("Checksum error for '%s': received '%s' but actual is '%s'",
-                        request.getPath(), uploadedChecksum, checksumInfo.getActual());
-                sendInvalidUploadedChecksumResponse(request, response, repo, targetFileRepoPath, message);
-            }
-        } catch (ItemNotFoundRuntimeException e) {
-            response.sendError(SC_NOT_FOUND, "Target file to set checksum on doesn't exist: " + targetFileRepoPath,
-                    log);
-        } catch (FileExpectedException e) {
-            response.sendError(SC_CONFLICT, "Checksum only supported for files (but found folder): " +
-                    targetFileRepoPath, log);
-        }
-    }
-
-    private RepoPath adjustAndGetChecksumTargetRepoPath(ArtifactoryRequest request, LocalRepo repo) {
-        String checksumTargetFile = request.getPath();
-        if (isMavenRepo(repo)) {
-            checksumTargetFile = adjustMavenSnapshotPath(repo, request);
-        }
-        return repo.getRepoPath(PathUtils.stripExtension(checksumTargetFile));
-    }
-
-    private String getChecksumContentAsString(ArtifactoryRequest request)
-            throws IOException {
-        InputStream inputStream = null;
-        try {
-            inputStream = request.getInputStream();
-            return ChecksumUtil.checksumStringFromStream(inputStream);
-        } finally {
-            IOUtils.closeQuietly(inputStream);
-        }
-    }
-
-    private boolean isChecksumValidAccordingToPolicy(String checksum, ChecksumInfo checksumInfo) {
-        return checksum.equalsIgnoreCase(checksumInfo.getActual());
-    }
-
-    private void sendInvalidUploadedChecksumResponse(ArtifactoryRequest request, ArtifactoryResponse response,
-            LocalRepo targetRepo, RepoPath repoPath, String errorMessage) throws IOException {
-        ChecksumPolicy checksumPolicy = targetRepo.getChecksumPolicy();
-        if (checksumPolicy instanceof LocalRepoChecksumPolicy &&
-                ((LocalRepoChecksumPolicy) checksumPolicy).getPolicyType().equals(SERVER)) {
-            log.debug(errorMessage);
-            sendUploadedChecksumResponse(request, response, repoPath);
-        } else {
-            response.sendError(SC_CONFLICT, errorMessage, log);
-        }
-    }
-
-    private void sendUploadedChecksumResponse(ArtifactoryRequest request, ArtifactoryResponse response,
-            RepoPath targetFileRepoPath) {
-        response.setHeader("Location", buildArtifactUrl(request, targetFileRepoPath));
-        response.setStatus(SC_CREATED);
-        response.sendSuccess();
-    }
-
-    private void uploadArtifact(ArtifactoryRequest request, ArtifactoryResponse response, LocalRepo repo)
-            throws IOException, RepoRejectException {
-        if (isDeployArchiveBundle(request)) {
-            RestCoreAddon restCoreAddon = addonsManager.addonByType(RestCoreAddon.class);
-            restCoreAddon.deployArchiveBundle(request, response, repo);
-            return;
-        }
-
-        long length = request.getContentLength();
-        log.info("Deploy to '{}' Content-Length: {}", request.getRepoPath(), length < 0 ? "unspecified" : length);
-        uploadFile(request, response, repo);
-    }
-
-    private void uploadFile(ArtifactoryRequest request, ArtifactoryResponse response, LocalRepo repo)
-            throws RepoRejectException, IOException {
-        String path = request.getPath();
-        if (isMavenRepo(repo)) {
-            if (isRepoSnapshotPolicyNotDeployer(repo) && MavenNaming.isSnapshotMavenMetadata(path)) {
-                // Skip the maven metadata deployment - use the metadata calculated after the pom is deployed
-                consumeContentAndRespondAccepted(request, response);
-                return;
-            }
-            path = adjustMavenSnapshotPath(repo, request);
-        }
-
-        RepoPath fileRepoPath = repo.getRepoPath(path);
-        MutableFileInfo fileInfo = InfoFactoryHolder.get().createFileInfo(fileRepoPath);
-        boolean isChecksumDeploy = isChecksumDeploy(request);
-        setFileInfoChecksums(request, fileInfo, isChecksumDeploy);
-        FileResource fileResource = new FileResource(fileInfo);
-
-        uploadItem(request, response, repo, fileResource);
-    }
-
-    private boolean isMavenRepo(LocalRepo repo) {
-        return repo.getDescriptor().isMavenRepoLayout();
-    }
-
-    private boolean isRepoSnapshotPolicyNotDeployer(LocalRepo repo) {
-        SnapshotVersionBehavior mavenSnapshotVersionBehavior = repo.getMavenSnapshotVersionBehavior();
-        return !mavenSnapshotVersionBehavior.equals(DEPLOYER);
-    }
-
-    private void consumeContentAndRespondAccepted(ArtifactoryRequest request, ArtifactoryResponse response)
-            throws IOException {
-        log.trace("Skipping deployment of maven metadata file {}", request.getPath());
-        consumeRequestBody(request);
-        response.setStatus(HttpStatus.SC_ACCEPTED);
-    }
-
-    private void uploadItem(ArtifactoryRequest request, ArtifactoryResponse response, LocalRepo repo, RepoResource res)
-            throws IOException, RepoRejectException {
-
-        if (isChecksumDeploy(request)) {
-            uploadItemWithReusedContent(request, response, repo, res);
-        } else if (ConstantValues.httpUseExpectContinue.getBoolean() && HttpUtils.isExpectedContinue(request)) {
-            uploadItemWithReusedOrProvidedContent(request, response, repo, res);
-        } else {
-            uploadItemWithProvidedContent(request, response, repo, res);
-        }
-    }
-
-    private boolean isChecksumDeploy(ArtifactoryRequest request) {
-        return Boolean.parseBoolean(request.getHeader(ArtifactoryRequest.CHECKSUM_DEPLOY));
-    }
-
-    private boolean isDeployArchiveBundle(ArtifactoryRequest request) {
-        return Boolean.parseBoolean(request.getHeader(ArtifactoryRequest.EXPLODE_ARCHIVE));
-    }
-
-    private void uploadItemWithReusedContent(ArtifactoryRequest request, ArtifactoryResponse response,
-            LocalRepo repo, RepoResource res) throws IOException, RepoRejectException {
-        String sha1 = HttpUtils.getSha1Checksum(request);
-        String sha256Checksum = null;
-        if (StringUtils.isBlank(sha1)) {
-            sha256Checksum = HttpUtils.getSha256Checksum(request);
-            if (StringUtils.isBlank(sha256Checksum)){
-                response.sendError(SC_NOT_FOUND, "Checksum deploy failed. SHA1 / SHA256 header '" +
-                        ArtifactoryRequest.CHECKSUM_SHA1 +"/"+ ArtifactoryRequest.CHECKSUM_SHA256 + "' doesn't exist", log);
-                return;
-            }
-
-            sha1 = ContextHelper.get().getRepositoryService().getSha1BySha2Property(sha256Checksum);
-        }
-        log.debug("Checksum deploy to '{}' with SHA1: {}", res.getRepoPath(), sha1);
-        if (!ChecksumType.sha1.isValid(sha1) || (sha256Checksum != null && !ChecksumType.sha256.isValid(sha256Checksum))) {
-            if (sha256Checksum != null){
-                response.sendError(SC_NOT_FOUND, "Checksum deploy failed. Invalid SHA256: " + sha256Checksum, log);
-            }else {
-                response.sendError(SC_NOT_FOUND, "Checksum deploy failed. Invalid SHA1: " + sha1, log);
-            }
-            return;
-        }
-        InputStream inputStream = null;
-        try {
-            BinaryInfo binaryInfo = binaryService.findBinary(sha1);
-            if (binaryInfo != null) {
-                inputStream = binaryService.getBinary(binaryInfo);
-            }
-            if (inputStream == null) {
-                response.sendError(SC_NOT_FOUND, "Checksum deploy failed. No existing file with SHA1: " + sha1, log);
-            } else {
-                uploadItemWithContent(request, response, repo, res, inputStream);
-            }
-        } catch (BinaryNotFoundException e) {
-            response.sendError(SC_NOT_FOUND, "Checksum deploy failed. No existing file with SHA1: " + sha1, log);
-        } finally {
-            IOUtils.closeQuietly(inputStream);
-        }
-    }
-
-    private void uploadItemWithReusedOrProvidedContent(ArtifactoryRequest request, ArtifactoryResponse response,
-            LocalRepo repo, RepoResource res) throws IOException, RepoRejectException {
-
-        log.debug("Client '{}' supports Expect 100/continue", request.getHeader(HttpHeaders.USER_AGENT));
-        String sha1 = HttpUtils.getSha1Checksum(request);
-        if (ChecksumType.sha1.isValid(sha1)) {
-            log.debug("Expect continue deploy to '{}' with SHA1: {}", res.getRepoPath(), sha1);
-            InputStream inputStream = null;
-            try {
-                inputStream = binaryService.getBinary(sha1);
-                uploadItemWithContent(request, response, repo, res, inputStream);
-                return;
-            } catch (BinaryNotFoundException e) {
-                log.warn("Could not get original stream from with SHA1 '{}': {}", sha1, e.getMessage());
-            } finally {
-                IOUtils.closeQuietly(inputStream);
-            }
-        }
-        uploadItemWithProvidedContent(request, response, repo, res);
-    }
-
-    private void uploadItemWithProvidedContent(ArtifactoryRequest request, ArtifactoryResponse response,
-            LocalRepo repo, RepoResource res) throws IOException, RepoRejectException {
-        InputStream inputStream = null;
-        try {
-            long remoteUploadStartTime = System.currentTimeMillis();
-            inputStream = request.getInputStream();
-            uploadItemWithContent(request, response, repo, res, inputStream);
-            fireUploadTrafficEvent(res, remoteUploadStartTime);
-        } finally {
-            IOUtils.closeQuietly(inputStream);
-        }
-    }
-
-    private void uploadItemWithContent(ArtifactoryRequest request, ArtifactoryResponse response, LocalRepo repo,
-            RepoResource res, InputStream inputStream) throws RepoRejectException, IOException {
-        //Update the last modified
-        long lastModified = request.getLastModified() > 0 ? request.getLastModified() : System.currentTimeMillis();
-        ((MutableRepoResourceInfo) res.getInfo()).setLastModified(lastModified);
-        Properties properties = null;
-        RepoPath repoPath = res.getRepoPath();
-        if (authService.canAnnotate(repoPath)) {
-            properties = request.getProperties();
-            // If the deploy is checksum deploy with SHA-256 then we should add the SHA_256 checksum as property
-            if (isChecksumDeploy(request)){
-                String sha256Checksum = HttpUtils.getSha256Checksum(request);
-                // Make sure that we found the file using checksum deploy
-                if(StringUtils.isNotBlank(sha256Checksum) && inputStream !=null &&
-                        inputStream instanceof BinaryServiceInputStream) {
-                    // Make sure that the properties is not null
-                    if(properties==null){
-                        properties=(Properties) InfoFactoryHolder.get().createProperties();
-                    }
-                    properties.put("sha256",sha256Checksum);
-                }
-            }
-        }
-        SaveResourceContext.Builder contextBuilder = new SaveResourceContext.Builder(res, inputStream)
-                .properties(properties);
-        populateItemInfoFromHeaders(request, res, contextBuilder);
-        try {
-            RepoResource resource = repoService.saveResource(repo, contextBuilder.build());
-            if (!resource.isFound()) {
-                response.sendError(SC_NOT_FOUND, ((UnfoundRepoResource) resource).getDetail(), log);
-                return;
-            }
-            sendSuccessfulResponse(request, response, repoPath, false);
-        } catch (BadPomException bpe) {
-            response.sendError(SC_CONFLICT, bpe.getMessage(), log);
-        }
-    }
-
-    private void sendSuccessfulResponse(ArtifactoryRequest request, ArtifactoryResponse response, RepoPath repoPath,
-            boolean isDirectory) throws IOException {
-        String url = buildArtifactUrl(request, repoPath);
-        successfulDeploymentResponseHelper.writeSuccessfulDeploymentResponse(repoService, response, repoPath,
-                url, isDirectory);
-    }
-
-    private void fireUploadTrafficEvent(RepoResource resource, long remoteUploadStartTime) {
-        if (remoteUploadStartTime > 0) {
-            String remoteAddress = HttpUtils.getRemoteClientAddress();
-            // fire upload event only if the resource is really uploaded from the remote client
-            UploadEntry uploadEntry = new UploadEntry(resource.getRepoPath().getId(),
-                    resource.getSize(), System.currentTimeMillis() - remoteUploadStartTime, remoteAddress);
-            trafficService.handleTrafficEntry(uploadEntry);
-        }
-    }
-
-    private String buildArtifactUrl(ArtifactoryRequest request, RepoPath repoPath) {
-        return request.getServletContextUrl() + "/" + repoPath.getRepoKey() + "/" + repoPath.getPath();
-    }
-
-    private void populateItemInfoFromHeaders(ArtifactoryRequest request, RepoResource res,
-            SaveResourceContext.Builder contextBuilder) {
-        if (authService.isAdmin()) {
-
-            setItemLastModifiedInfoFromHeaders(request, res);
-            setItemCreatedInfoFromHeaders(request, contextBuilder);
-            setItemCreatedByInfoFromHeaders(request, contextBuilder);
-            setItemModifiedInfoFromHeaders(request, contextBuilder);
-        }
-    }
-
-    private void setItemLastModifiedInfoFromHeaders(ArtifactoryRequest request, RepoResource res) {
-        String lastModifiedString = request.getHeader(ArtifactoryRequest.LAST_MODIFIED);
-        if (StringUtils.isNotBlank(lastModifiedString)) {
-            long lastModified = Long.parseLong(lastModifiedString);
-            if (lastModified > 0) {
-                ((MutableRepoResourceInfo) res.getInfo()).setLastModified(lastModified);
-            }
-        }
-    }
-
-    private void setItemCreatedInfoFromHeaders(ArtifactoryRequest request, SaveResourceContext.Builder contextBuilder) {
-        String createdString = request.getHeader(ArtifactoryRequest.CREATED);
-        if (StringUtils.isNotBlank(createdString)) {
-            long created = Long.parseLong(createdString);
-            if (created > 0) {
-                contextBuilder.created(created);
-            }
-        }
-    }
-
-    private void setItemCreatedByInfoFromHeaders(ArtifactoryRequest request,
-            SaveResourceContext.Builder contextBuilder) {
-        String createBy = request.getHeader(ArtifactoryRequest.CREATED_BY);
-        if (StringUtils.isNotBlank(createBy)) {
-            contextBuilder.createdBy(createBy);
-        }
-    }
-
-    private void setItemModifiedInfoFromHeaders(ArtifactoryRequest request,
-            SaveResourceContext.Builder contextBuilder) {
-        String modifiedBy = request.getHeader(ArtifactoryRequest.MODIFIED_BY);
-        if (StringUtils.isNotBlank(modifiedBy)) {
-            contextBuilder.modifiedBy(modifiedBy);
-        }
-    }
-
-    private void setFileInfoChecksums(ArtifactoryRequest request, MutableFileInfo fileInfo, boolean checksumDeploy) {
-        if (checksumDeploy || (request instanceof InternalArtifactoryRequest &&
-                ((InternalArtifactoryRequest) request).isTrustServerChecksums())) {
-            fileInfo.createTrustedChecksums();
-            return;
-        }
-
-        // set checksums if attached to the request headers
-        String sha1 = HttpUtils.getSha1Checksum(request);
-        String md5 = HttpUtils.getMd5Checksum(request);
-        if (StringUtils.isNotBlank(sha1) || StringUtils.isNotBlank(md5)) {
-            Set<ChecksumInfo> checksums = Sets.newHashSet();
-            if (StringUtils.isNotBlank(sha1)) {
-                log.debug("Found sha1 '{}' for file '{}", sha1, fileInfo.getRepoPath());
-                checksums.add(new ChecksumInfo(ChecksumType.sha1, sha1, null));
-            }
-            if (StringUtils.isNotBlank(md5)) {
-                log.debug("Found md5 '{}' for file '{}", md5, fileInfo.getRepoPath());
-                checksums.add(new ChecksumInfo(ChecksumType.md5, md5, null));
-            }
-            fileInfo.setChecksums(checksums);
-        }
-    }
-
-    private String adjustMavenSnapshotPath(LocalRepo repo, ArtifactoryRequest request) {
-        String path = request.getPath();
-        ModuleInfo itemModuleInfo = repo.getItemModuleInfo(path);
-        MavenSnapshotVersionAdapter adapter = repo.getMavenSnapshotVersionAdapter();
-        MavenSnapshotVersionAdapterContext context = new MavenSnapshotVersionAdapterContext(
-                repo.getRepoPath(path), itemModuleInfo);
-
-        Properties properties = request.getProperties();
-        if (properties != null) {
-            String timestamp = properties.getFirst("build.timestamp");
-            if (StringUtils.isNotBlank(timestamp)) {
-                context.setTimestamp(timestamp);
-            }
-        }
-        String adjustedPath = adapter.adaptSnapshotPath(context);
-        if (!adjustedPath.equals(path)) {
-            log.debug("Snapshot file path '{}' adjusted to: '{}'", path, adjustedPath);
-        }
-        return adjustedPath;
-    }
-
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/ivy/IvyParser.java b/backend/core/src/main/java/org/artifactory/ivy/IvyParser.java
deleted file mode 100644
index 11e6f0f..0000000
--- a/backend/core/src/main/java/org/artifactory/ivy/IvyParser.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ivy;
-
-import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
-import org.apache.ivy.core.settings.IvySettings;
-import org.apache.ivy.plugins.parser.ParserSettings;
-import org.apache.ivy.plugins.parser.xml.XmlModuleDescriptorParser;
-import org.apache.ivy.plugins.repository.BasicResource;
-import org.apache.ivy.plugins.repository.Resource;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.text.ParseException;
-import java.util.Date;
-
-/**
- * Ivy parser. validates the descriptor and parses it into an object.
- *
- * @author Tomer Cohen
- */
-public class IvyParser extends XmlModuleDescriptorParser {
-    private final ParserSettings settings = new IvySettings();
-
-    public ModuleDescriptor getModuleDescriptorForStringContent(InputStream input, long contentLength)
-            throws IOException, ParseException {
-        Resource resource = new BasicResource("ivyBasicResource", true, contentLength, new Date().getTime(), true);
-        return getModuleDescriptor(settings, input, resource, true);
-    }
-
-    public ModuleDescriptor getModuleDescriptor(ParserSettings settings, InputStream input,
-            Resource res, boolean validate) throws ParseException, IOException {
-        Parser parser = newParser(settings);
-        parser.setValidate(validate);
-        parser.setResource(res);
-        parser.setInput(input);
-        parser.parse();
-        return parser.getModuleDescriptor();
-    }
-}
-
diff --git a/backend/core/src/main/java/org/artifactory/ivy/IvyServiceImpl.java b/backend/core/src/main/java/org/artifactory/ivy/IvyServiceImpl.java
deleted file mode 100644
index 41e94db..0000000
--- a/backend/core/src/main/java/org/artifactory/ivy/IvyServiceImpl.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ivy;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.util.StringInputStream;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-
- at Service
-public class IvyServiceImpl implements IvyService {
-
-    private static final Logger log = LoggerFactory.getLogger(IvyServiceImpl.class);
-
-    @Autowired
-    private InternalRepositoryService repositoryService;
-
-    @Override
-    public ModuleDescriptor parseIvyFile(File file) {
-        FileInputStream input = null;
-        try {
-            input = new FileInputStream(file);
-            return parseIvy(input, file.length());
-        } catch (FileNotFoundException e) {
-            throw new IllegalArgumentException("Could not parse Ivy file.", e);
-        } finally {
-            IOUtils.closeQuietly(input);
-        }
-    }
-
-    @Override
-    public ModuleDescriptor parseIvyFile(RepoPath repoPath) {
-        LocalRepo localRepo = repositoryService.localOrCachedRepositoryByKey(repoPath.getRepoKey());
-        String content = localRepo.getTextFileContent(repoPath);
-        StringInputStream input = null;
-        try {
-            input = new StringInputStream(content);
-            return parseIvy(input, content.length());
-        } catch (UnsupportedEncodingException e) {
-            throw new IllegalArgumentException("Could not parse Ivy file.", e);
-        } finally {
-            IOUtils.closeQuietly(input);
-        }
-    }
-
-    private ModuleDescriptor parseIvy(InputStream input, long contentLength) {
-        IvyParser ivyParser = new IvyParser();
-        try {
-            ModuleDescriptor md = ivyParser.getModuleDescriptorForStringContent(input, contentLength);
-            return md;
-        } catch (Exception e) {
-            log.warn("Could not parse the item at {} as a valid Ivy file.", e);
-            return null;
-        }
-    }
-}
-
diff --git a/backend/core/src/main/java/org/artifactory/layout/EncryptConfigurationInterceptor.java b/backend/core/src/main/java/org/artifactory/layout/EncryptConfigurationInterceptor.java
deleted file mode 100644
index d38d4f2..0000000
--- a/backend/core/src/main/java/org/artifactory/layout/EncryptConfigurationInterceptor.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.layout;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.config.ConfigurationChangesInterceptor;
-import org.artifactory.descriptor.bintray.BintrayConfigDescriptor;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.external.BlackDuckSettingsDescriptor;
-import org.artifactory.descriptor.external.ExternalProvidersDescriptor;
-import org.artifactory.descriptor.mail.MailServerDescriptor;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.repo.BintrayApplicationConfig;
-import org.artifactory.descriptor.repo.HttpRepoDescriptor;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.descriptor.security.SecurityDescriptor;
-import org.artifactory.descriptor.security.debian.DebianSettings;
-import org.artifactory.descriptor.security.ldap.LdapSetting;
-import org.artifactory.descriptor.security.ldap.SearchPattern;
-import org.artifactory.descriptor.security.oauth.OAuthProviderSettings;
-import org.artifactory.descriptor.security.oauth.OAuthSettings;
-import org.artifactory.descriptor.security.sso.CrowdSettings;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Fred Simon
- */
- at Component
-public class EncryptConfigurationInterceptor implements ConfigurationChangesInterceptor {
-
-    public static void decrypt(MutableCentralConfigDescriptor descriptor) {
-        encryptOrDecrypt(descriptor, false);
-    }
-
-    private static void encryptOrDecrypt(MutableCentralConfigDescriptor descriptor, boolean encrypt) {
-        for (RemoteRepoDescriptor remoteRepoDescriptor : descriptor.getRemoteRepositoriesMap().values()) {
-            if (remoteRepoDescriptor instanceof HttpRepoDescriptor) {
-                HttpRepoDescriptor httpRepoDescriptor = (HttpRepoDescriptor) remoteRepoDescriptor;
-                String newPassword = getNewPassword(encrypt, httpRepoDescriptor.getPassword());
-                if (StringUtils.isNotBlank(newPassword)) {
-                    httpRepoDescriptor.setPassword(newPassword);
-                }
-            }
-        }
-        for (LocalReplicationDescriptor localReplicationDescriptor : descriptor.getLocalReplications()) {
-            String newPassword = getNewPassword(encrypt, localReplicationDescriptor.getPassword());
-            if (StringUtils.isNotBlank(newPassword)) {
-                localReplicationDescriptor.setPassword(newPassword);
-            }
-        }
-        SecurityDescriptor security = descriptor.getSecurity();
-        for (LdapSetting ldapSetting : security.getLdapSettings()) {
-            SearchPattern search = ldapSetting.getSearch();
-            if (search != null) {
-                String newPassword = getNewPassword(encrypt, search.getManagerPassword());
-                if (StringUtils.isNotBlank(newPassword)) {
-                    search.setManagerPassword(newPassword);
-                }
-            }
-        }
-        DebianSettings debianSettings = security.getDebianSettings();
-        if (debianSettings != null) {
-            String newPassword = getNewPassword(encrypt, debianSettings.getPassphrase());
-            if (StringUtils.isNotBlank(newPassword)) {
-                debianSettings.setPassphrase(newPassword);
-            }
-        }
-        CrowdSettings crowdSettings = security.getCrowdSettings();
-        if (crowdSettings != null) {
-            String newPassword = getNewPassword(encrypt, crowdSettings.getPassword());
-            if (StringUtils.isNotBlank(newPassword)) {
-                crowdSettings.setPassword(newPassword);
-            }
-        }
-        List<ProxyDescriptor> proxies = descriptor.getProxies();
-        if (proxies != null) {
-            for (ProxyDescriptor proxy : proxies) {
-                String newPassword = getNewPassword(encrypt, proxy.getPassword());
-                if (StringUtils.isNotBlank(newPassword)) {
-                    proxy.setPassword(newPassword);
-                }
-            }
-        }
-        MailServerDescriptor mailServer = descriptor.getMailServer();
-        if (mailServer != null) {
-            String newPassword = getNewPassword(encrypt, mailServer.getPassword());
-            if (StringUtils.isNotBlank(newPassword)) {
-                mailServer.setPassword(newPassword);
-            }
-        }
-        ExternalProvidersDescriptor externalProviders = descriptor.getExternalProvidersDescriptor();
-        if (externalProviders != null) {
-            BlackDuckSettingsDescriptor bdSettings = externalProviders.getBlackDuckSettingsDescriptor();
-            if (bdSettings != null) {
-                String newPassword = getNewPassword(encrypt, bdSettings.getPassword());
-                if (StringUtils.isNotBlank(newPassword)) {
-                    bdSettings.setPassword(newPassword);
-                }
-            }
-        }
-        BintrayConfigDescriptor bintraySettings = descriptor.getBintrayConfig();
-        if (bintraySettings != null) {
-            String newApiKey = getNewPassword(encrypt, bintraySettings.getApiKey());
-            if (StringUtils.isNotBlank(newApiKey)) {
-                bintraySettings.setApiKey(newApiKey);
-            }
-        }
-        OAuthSettings oauthSettings = descriptor.getSecurity().getOauthSettings();
-        if (oauthSettings != null) {
-            List<OAuthProviderSettings> oauthProvidersSettings = oauthSettings.getOauthProvidersSettings();
-            if (oauthProvidersSettings != null) {
-                for (OAuthProviderSettings oauthProvidersSetting : oauthProvidersSettings) {
-                    String secret = getNewPassword(encrypt, oauthProvidersSetting.getSecret());
-                    if (StringUtils.isNotBlank(secret)) {
-                        oauthProvidersSetting.setSecret(secret);
-                    }
-                }
-            }
-        }
-
-        Map<String, BintrayApplicationConfig> bintrayApplicationConfigs = descriptor.getBintrayApplications();
-        if (bintrayApplicationConfigs != null) {
-            bintrayApplicationConfigs.values().stream()
-                    .forEach(appConfig -> {
-                        String encryptedClientId = getNewPassword(encrypt, appConfig.getClientId());
-                        String encryptedSecret = getNewPassword(encrypt, appConfig.getSecret());
-                        String encryptedRefreshToken = getNewPassword(encrypt, appConfig.getRefreshToken());
-                        appConfig.setClientId(encryptedClientId);
-                        appConfig.setSecret(encryptedSecret);
-                        appConfig.setRefreshToken(encryptedRefreshToken);
-                    });
-        }
-    }
-
-    private static String getNewPassword(boolean encrypt, String password) {
-        if (StringUtils.isNotBlank(password)) {
-            if (encrypt) {
-                return CryptoHelper.encryptIfNeeded(password);
-            } else {
-                return CryptoHelper.decryptIfNeeded(password);
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public void onBeforeSave(CentralConfigDescriptor newDescriptor) {
-        if (newDescriptor instanceof MutableCentralConfigDescriptor && CryptoHelper.hasMasterKey()) {
-            // Find all sensitive data and encrypt them
-            encrypt((MutableCentralConfigDescriptor) newDescriptor);
-        }
-    }
-
-    private void encrypt(MutableCentralConfigDescriptor descriptor) {
-        encryptOrDecrypt(descriptor, true);
-    }
-
-}
diff --git a/backend/core/src/main/java/org/artifactory/layout/LayoutConfigurationChangesInterceptor.java b/backend/core/src/main/java/org/artifactory/layout/LayoutConfigurationChangesInterceptor.java
deleted file mode 100644
index c6fd440..0000000
--- a/backend/core/src/main/java/org/artifactory/layout/LayoutConfigurationChangesInterceptor.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.layout;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.LayoutsCoreAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.config.ConfigurationChangesInterceptor;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Noam Y. Tenne
- */
- at Component
-public class LayoutConfigurationChangesInterceptor implements ConfigurationChangesInterceptor {
-
-    @Override
-    public void onBeforeSave(CentralConfigDescriptor newDescriptor) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        LayoutsCoreAddon layoutsCoreAddon = addonsManager.addonByType(LayoutsCoreAddon.class);
-        layoutsCoreAddon.assertLayoutConfigurationsBeforeSave(newDescriptor);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/layout/OrderedRepositoriesConfigurationChangesInterceptor.java b/backend/core/src/main/java/org/artifactory/layout/OrderedRepositoriesConfigurationChangesInterceptor.java
deleted file mode 100644
index 96d1c2b..0000000
--- a/backend/core/src/main/java/org/artifactory/layout/OrderedRepositoriesConfigurationChangesInterceptor.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.layout;
-
-import org.artifactory.common.ConstantValues;
-import org.artifactory.config.ConfigurationChangesInterceptor;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.springframework.stereotype.Component;
-
-import java.util.Arrays;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-/**
- * @author Fred Simon
- */
- at Component
-public class OrderedRepositoriesConfigurationChangesInterceptor implements ConfigurationChangesInterceptor {
-
-    @Override
-    public void onBeforeSave(CentralConfigDescriptor newDescriptor) {
-        if (newDescriptor instanceof MutableCentralConfigDescriptor && ConstantValues.disableGlobalRepoAccess.getBoolean()) {
-            // If global repo is disabled, all repository key names are ordered
-            MutableCentralConfigDescriptor mutableCentralConfigDescriptor = (MutableCentralConfigDescriptor) newDescriptor;
-            mutableCentralConfigDescriptor.setRemoteRepositoriesMap(sortMap(newDescriptor.getRemoteRepositoriesMap()));
-            mutableCentralConfigDescriptor.setLocalRepositoriesMap(sortMap(newDescriptor.getLocalRepositoriesMap()));
-            mutableCentralConfigDescriptor.setVirtualRepositoriesMap(
-                    sortMap(newDescriptor.getVirtualRepositoriesMap()));
-        }
-    }
-
-    private <T extends RepoDescriptor> Map<String, T> sortMap(Map<String, T> map) {
-        String[] origKeys = map.keySet().toArray(new String[map.size()]);
-        String[] orderedKeys = map.keySet().toArray(new String[map.size()]);
-        Arrays.sort(orderedKeys);
-        if (Arrays.equals(origKeys, orderedKeys)) {
-            return map;
-        } else {
-            Map<String, T> result = new LinkedHashMap<>(map.size());
-            for (String orderedKey : orderedKeys) {
-                result.put(orderedKey, map.get(orderedKey));
-            }
-            return result;
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/layout/UserLockPolicyConfigurationInterceptor.java b/backend/core/src/main/java/org/artifactory/layout/UserLockPolicyConfigurationInterceptor.java
deleted file mode 100644
index f3eac85..0000000
--- a/backend/core/src/main/java/org/artifactory/layout/UserLockPolicyConfigurationInterceptor.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.layout;
-
-import org.artifactory.config.ConfigurationChangesInterceptor;
-import org.artifactory.config.ConfigurationException;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.security.UserLockPolicy;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-/**
- * This interceptor ensure that UserLockPolicy has correct configuration
- *
- * @author Michael Pasternak
- */
- at Component
-public class UserLockPolicyConfigurationInterceptor implements ConfigurationChangesInterceptor {
-
-    private static final Logger log = LoggerFactory.getLogger(UserLockPolicyConfigurationInterceptor.class);
-
-    @Override
-    public void onBeforeSave(CentralConfigDescriptor newDescriptor) {
-        UserLockPolicy newUserLockPolicy = newDescriptor.getSecurity().getUserLockPolicy();
-        if (newUserLockPolicy.getLoginAttempts() > 100 || newUserLockPolicy.getLoginAttempts() < 1)  {
-            log.debug("UserLockPolicy 'loginAttempts' value is illegal, valid range is 1 - 100, while specified {}", newUserLockPolicy.getLoginAttempts());
-            throw new ConfigurationException("UserLockPolicy 'loginAttempts' value is illegal, valid range is 1 - 100");
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/logging/LoggingServiceImpl.java b/backend/core/src/main/java/org/artifactory/logging/LoggingServiceImpl.java
deleted file mode 100644
index 2bdb0b5..0000000
--- a/backend/core/src/main/java/org/artifactory/logging/LoggingServiceImpl.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.logging;
-
-import org.apache.commons.io.FileUtils;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.property.ArtifactorySystemProperties;
-import org.artifactory.logging.version.LoggingVersion;
-import org.artifactory.sapi.common.ExportSettings;
-import org.artifactory.sapi.common.ImportSettings;
-import org.artifactory.update.utils.BackupUtils;
-import org.artifactory.version.ArtifactoryVersion;
-import org.artifactory.version.CompoundVersionDetails;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import java.io.File;
-import java.io.IOException;
-
-/**
- * Logging service main implementation
- *
- * @author Noam Y. Tenne
- */
- at Service
-public class LoggingServiceImpl implements LoggingService {
-    private static final Logger log = LoggerFactory.getLogger(LoggingServiceImpl.class);
-
-    @Override
-    public void exportTo(ExportSettings settings) {
-        // export is handled by the application context (all the etc directory is copied)
-    }
-
-    @Override
-    public void importFrom(ImportSettings settings) {
-        File logFileToImport = new File(settings.getBaseDir(), "etc/logback.xml");
-        if (logFileToImport.exists()) {
-            try {
-                // Backup the target logback file
-                File targetEtcDir = ArtifactoryHome.get().getEtcDir();
-                File existingLogbackFile = new File(targetEtcDir, "logback.xml");
-                if (existingLogbackFile.exists()) {
-                    FileUtils.copyFile(existingLogbackFile, new File(targetEtcDir, "logback.original.xml"));
-                }
-                // Copy file into a temporary working directory
-                File workFile = new File(FileUtils.getTempDirectory(), logFileToImport.getName());
-                FileUtils.copyFile(logFileToImport, workFile);
-                convertAndSave(workFile, settings);
-                // Copy the converted file to the target dir
-                FileUtils.copyFileToDirectory(workFile, targetEtcDir);
-                FileUtils.deleteQuietly(workFile);
-            } catch (IOException e) {
-                settings.getStatusHolder().error("Failed to import and convert logback file", e, log);
-            }
-        }
-    }
-
-    private void convertAndSave(File from, ImportSettings settings) throws IOException {
-        ArtifactoryHome artifactoryHome = ArtifactoryHome.get();
-        CompoundVersionDetails source = ContextHelper.get().getVersionProvider().getOriginalHome();
-
-        ArtifactorySystemProperties properties = artifactoryHome.getArtifactoryProperties();
-
-        //Might be first run, protect
-        if (source != null) {
-            LoggingVersion.values();
-            ArtifactoryVersion importedVersion = BackupUtils.findVersion(settings.getBaseDir());
-            LoggingVersion originalVersion = importedVersion.getSubConfigElementVersion(LoggingVersion.class);
-            originalVersion.convert(from.getParentFile(), from.getParentFile());
-        }
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/mail/MailServiceImpl.java b/backend/core/src/main/java/org/artifactory/mail/MailServiceImpl.java
deleted file mode 100644
index a65964d..0000000
--- a/backend/core/src/main/java/org/artifactory/mail/MailServiceImpl.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mail;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.mail.MailServerConfiguration;
-import org.artifactory.api.mail.MailService;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.mail.MailServerDescriptor;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.util.EmailException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.mail.Authenticator;
-import javax.mail.BodyPart;
-import javax.mail.Message;
-import javax.mail.MessagingException;
-import javax.mail.Multipart;
-import javax.mail.PasswordAuthentication;
-import javax.mail.Session;
-import javax.mail.Transport;
-import javax.mail.internet.InternetAddress;
-import javax.mail.internet.MimeBodyPart;
-import javax.mail.internet.MimeMessage;
-import javax.mail.internet.MimeMultipart;
-import java.util.Properties;
-
-/**
- * The mail service's main implementation
- *
- * @author Noam Tenne
- */
- at Service
-public class MailServiceImpl implements MailService {
-
-    private static final Logger log = LoggerFactory.getLogger(MailServiceImpl.class);
-
-    @Autowired
-    private CentralConfigService centralConfig;
-
-    /**
-     * Send an e-mail message based on the parameters in the mail server configuration descriptor
-     *
-     * @param recipients Recipients of the message that will be sent
-     * @param subject    The subject of the message
-     * @param body       The body of the message
-     * @throws Exception
-     */
-    @Override
-    public void sendMail(String[] recipients, String subject, String body) throws EmailException {
-        MailServerConfiguration mailServerConfiguration = getMailServerConfig();
-        if (mailServerConfiguration == null) {
-            log.warn("Unable to send E-mail: No mail server configuration found.");
-            return;
-        }
-        sendMail(recipients, subject, body, mailServerConfiguration);
-    }
-
-
-    /**
-     * Send an e-mail message
-     *
-     * @param recipients Recipients of the message that will be sent
-     * @param subject    The subject of the message
-     * @param body       The body of the message
-     * @param config     A mail server configuration to use
-     * @param recipientType {@link Message.RecipientType}
-     *
-     * @throws EmailException
-     */
-    @Override
-    public void sendMail(String[] recipients, String subject, String body, MailServerConfiguration config,
-            Message.RecipientType recipientType) throws EmailException {
-        verifyParameters(recipients, config);
-
-        if (!config.isEnabled()) {
-            log.debug("Ignoring requested mail delivery. The given configuration is disabled.");
-            return;
-        }
-
-        if (recipients.length == 0) {
-            log.debug("No recipients specified.");
-            return;
-        }
-
-        boolean debugEnabled = log.isDebugEnabled();
-
-        Properties properties = new Properties();
-
-        properties.put("mail.smtp.host", config.getHost());
-        properties.put("mail.smtp.port", Integer.toString(config.getPort()));
-
-        properties.put("mail.smtp.quitwait", "false");
-
-        //Default protocol
-        String protocol = "smtp";
-
-        //Enable TLS if set
-        if (config.isUseTls()) {
-            properties.put("mail.smtp.starttls.enable", "true");
-        }
-
-        //Enable SSL if set
-        boolean useSsl = config.isUseSsl();
-        if (useSsl) {
-            properties.put("mail.smtp.socketFactory.port", Integer.toString(config.getPort()));
-            properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
-            properties.put("mail.smtp.socketFactory.fallback", "false");
-            //Requires special protocol
-            protocol = "smtps";
-        }
-
-        //Set debug property if enabled by the logger
-        properties.put("mail.debug", debugEnabled);
-
-        Authenticator authenticator = null;
-        if (!StringUtils.isEmpty(config.getUsername())) {
-            properties.put("mail.smtp.auth", "true");
-            authenticator = new Authenticator() {
-                @Override
-                protected PasswordAuthentication getPasswordAuthentication() {
-                    return new PasswordAuthentication(config.getUsername(), config.getPassword());
-                }
-            };
-        }
-
-        Session session = Session.getInstance(properties, authenticator);
-        Message message = new MimeMessage(session);
-
-        String subjectPrefix = config.getSubjectPrefix();
-        String fullSubject = (!StringUtils.isEmpty(subjectPrefix)) ? (subjectPrefix + " " + subject) : subject;
-        try {
-            message.setSubject(fullSubject);
-
-            if (!StringUtils.isEmpty(config.getFrom())) {
-                InternetAddress addressFrom = new InternetAddress(config.getFrom());
-                message.setFrom(addressFrom);
-            }
-
-            InternetAddress[] addressTo = new InternetAddress[recipients.length];
-            for (int i = 0; i < recipients.length; i++) {
-                addressTo[i] = new InternetAddress(recipients[i]);
-            }
-            message.addRecipients(recipientType, addressTo);
-
-            //Create multi-part message in case we want to add html support
-            Multipart multipart = new MimeMultipart("related");
-
-            BodyPart htmlPart = new MimeBodyPart();
-            htmlPart.setContent(body, "text/html");
-            multipart.addBodyPart(htmlPart);
-            message.setContent(multipart);
-
-            //Set debug property if enabled by the logger
-            session.setDebug(debugEnabled);
-
-            //Connect and send
-            Transport transport = session.getTransport(protocol);
-            if (useSsl) {
-                transport.connect(config.getHost(), config.getPort(), config.getUsername(), config.getPassword());
-            } else {
-                transport.connect();
-            }
-            transport.sendMessage(message, message.getAllRecipients());
-            transport.close();
-        } catch (MessagingException e) {
-            String em = e.getMessage();
-            throw new EmailException(
-                    "An error has occurred while sending an e-mail" + (em != null ? ": " + em.trim() : "") + ".\n", e);
-        }
-    }
-
-
-    /**
-     * Send an e-mail message to users using Message.RecipientType.TO RecipientType
-     *
-     * @param recipients Recipients of the message that will be sent
-     * @param subject    The subject of the message
-     * @param body       The body of the message
-     * @param config     A mail server configuration to use
-     * @throws Exception
-     */
-    @Override
-    public void sendMail(String[] recipients, String subject, String body, final MailServerConfiguration config)
-            throws EmailException {
-        sendMail(recipients, subject, body, config, Message.RecipientType.TO);
-    }
-
-    /**
-     * Return the mail configuration object based on the params from the descriptor
-     *
-     * @return MailServerConfiguration - Configuration object. Null if no descriptor exists
-     */
-    private MailServerConfiguration getMailServerConfig() {
-        CentralConfigDescriptor descriptor = centralConfig.getDescriptor();
-        MailServerDescriptor m = descriptor.getMailServer();
-        if (m == null) {
-            return null;
-        }
-
-        return new MailServerConfiguration(m.isEnabled(), m.getHost(), m.getPort(), m.getUsername(),
-                CryptoHelper.decryptIfNeeded(m.getPassword()), m.getFrom(), m.getSubjectPrefix(),
-                m.isTls(), m.isSsl(), m.getArtifactoryUrl());
-    }
-
-    private void verifyParameters(String[] recipients, MailServerConfiguration config) {
-        if (recipients == null) {
-            throw new EmailException("Recipient list cannot be null.");
-        }
-
-        if (config == null) {
-            throw new EmailException("Mail server configuration cannot be null.");
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/maven/AbstractMetadataCalculator.java b/backend/core/src/main/java/org/artifactory/maven/AbstractMetadataCalculator.java
deleted file mode 100644
index a437ee5..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/AbstractMetadataCalculator.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven;
-
-import org.apache.maven.artifact.repository.metadata.Metadata;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.util.StringInputStream;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * @author freds
- */
-public class AbstractMetadataCalculator {
-    private static final Logger log = LoggerFactory.getLogger(AbstractMetadataCalculator.class);
-
-    protected final BasicStatusHolder status;
-
-    private InternalRepositoryService repositoryService;
-
-    public AbstractMetadataCalculator() {
-        status = new BasicStatusHolder();
-        status.setVerbose(log.isDebugEnabled());
-    }
-
-    protected InternalRepositoryService getRepositoryService() {
-        if (repositoryService == null) {
-            repositoryService = (InternalRepositoryService) InternalContextHelper.get().getRepositoryService();
-        }
-        return repositoryService;
-    }
-
-    protected void saveMetadata(RepoPath repoPath, Metadata metadata) {
-        String metadataStr;
-        try {
-            metadataStr = MavenModelUtils.mavenMetadataToString(metadata);
-            RepoPathImpl mavenMetadataRepoPath = new RepoPathImpl(repoPath, MavenNaming.MAVEN_METADATA_NAME);
-            getRepositoryService().saveFileInternal(mavenMetadataRepoPath, new StringInputStream(metadataStr));
-        } catch (Exception e) {
-            status.error("Error while writing metadata for " + repoPath + ".", e, log);
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/maven/MavenMetadataCalculator.java b/backend/core/src/main/java/org/artifactory/maven/MavenMetadataCalculator.java
deleted file mode 100644
index f4f37fe..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/MavenMetadataCalculator.java
+++ /dev/null
@@ -1,468 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.apache.maven.artifact.repository.metadata.Metadata;
-import org.apache.maven.artifact.repository.metadata.Snapshot;
-import org.apache.maven.artifact.repository.metadata.SnapshotVersion;
-import org.apache.maven.artifact.repository.metadata.Versioning;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.maven.MavenArtifactInfo;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.module.ModuleInfoUtils;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.SnapshotVersionBehavior;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.maven.snapshot.BuildNumberSnapshotComparator;
-import org.artifactory.maven.snapshot.SnapshotComparator;
-import org.artifactory.maven.versioning.MavenMetadataVersionComparator;
-import org.artifactory.maven.versioning.VersionNameMavenMetadataVersionComparator;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.storage.fs.service.FileService;
-import org.artifactory.storage.fs.tree.ItemNode;
-import org.artifactory.storage.fs.tree.ItemTree;
-import org.artifactory.util.RepoLayoutUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nullable;
-import java.io.IOException;
-import java.lang.reflect.Method;
-import java.util.*;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-
-/**
- * Calculates maven metadata recursively for folder in a local non-cache repository. Plugins metadata is calculated for
- * the whole repository.
- *
- * @author Yossi Shaul
- */
-public class MavenMetadataCalculator extends AbstractMetadataCalculator {
-    private static final Logger log = LoggerFactory.getLogger(MavenMetadataCalculator.class);
-    private static Predicate<? super ItemNode> uniqueSnapshotFileOnly = new Predicate<ItemNode>() {
-        @Override
-        public boolean apply(@Nullable ItemNode pom) {
-            if (pom != null) {
-                return MavenNaming.isUniqueSnapshotFileName(pom.getName());
-            }
-            return false;
-        }
-    };
-    private final RepoPath baseFolder;
-    private final boolean recursive;
-
-    /**
-     * Creates new instance of maven metadata calculator.
-     *
-     * @param baseFolder Folder to calculate metadata for
-     * @param recursive  True if the calculator should recursively calculate maven metadata for all sub folders
-     */
-    public MavenMetadataCalculator(RepoPath baseFolder, boolean recursive) {
-        this.baseFolder = baseFolder;
-        this.recursive = recursive;
-    }
-
-    public static MavenMetadataVersionComparator createVersionComparator() {
-        String comparatorFqn = ConstantValues.mvnMetadataVersionsComparator.getString();
-        if (StringUtils.isBlank(comparatorFqn)) {
-            // return the default comparator
-            return VersionNameMavenMetadataVersionComparator.get();
-        }
-
-        try {
-            Class<?> comparatorClass = Class.forName(comparatorFqn);
-            return (MavenMetadataVersionComparator) comparatorClass.newInstance();
-        } catch (Exception e) {
-            log.warn("Failed to create custom maven metadata version comparator '{}': {}", comparatorFqn,
-                    e.getMessage());
-            return VersionNameMavenMetadataVersionComparator.get();
-        }
-    }
-
-    public static SnapshotComparator createSnapshotComparator() {
-        SnapshotComparator comparator = BuildNumberSnapshotComparator.get();
-        // Try to load custom comparator
-        String comparatorFqn = ConstantValues.mvnMetadataSnapshotComparator.getString();
-        if (!StringUtils.isBlank(comparatorFqn)) {
-            try {
-                Class comparatorClass = Class.forName(comparatorFqn);
-                Method get = comparatorClass.getMethod("get");
-                comparator = (SnapshotComparator) get.invoke(null);
-                log.debug("Using custom snapshot comparator '{}' to calculate the latest snapshot", comparatorFqn);
-            } catch (NoSuchMethodException e1) {
-                log.warn(
-                        "Failed to create custom maven metadata snapshot comparator, the comparator should contain" +
-                                " static get method to avoid unnecessary object creation '{}': {}", comparatorFqn,
-                        e1.getMessage());
-            } catch (Exception e) {
-                log.warn("Failed to create custom maven metadata snapshot comparator '{}': {}", comparatorFqn,
-                        e.getMessage());
-            }
-        }
-        return comparator;
-    }
-
-    /**
-     * Starts calculation of the maven metadata from the base repo path
-     *
-     * @return Status of the metadata calculation
-     */
-    public BasicStatusHolder calculate() {
-        long start = System.nanoTime();
-        log.debug("Started {} maven metadata calculation on '{}'",
-                (recursive ? "recursive" : "non recursive"), baseFolder);
-
-        ItemTree itemTree = new ItemTree(baseFolder, item -> {
-            if (item.isFolder()) {
-                return true;
-            }
-            String path = item.getRepoPath().getPath();
-            return MavenNaming.isPom(path) || MavenNaming.isUniqueSnapshot(path);
-        });
-        ItemNode rootNode = itemTree.getRootNode();
-        if (rootNode != null) {
-            calculateAndSet(rootNode);
-            long duration = System.nanoTime() - start;
-            log.debug("Finished {} maven metadata calculation on '{}' in {} ms",
-                    (recursive ? "recursive" : "non recursive"), baseFolder, TimeUnit.NANOSECONDS.toMillis(duration));
-        } else {
-            log.debug("Root path for metadata calculation not found: '{}'", baseFolder);
-        }
-        return status;
-    }
-
-    private void calculateAndSet(ItemNode treeNode) {
-        ItemInfo itemInfo = treeNode.getItemInfo();
-        if (!itemInfo.isFolder()) {
-            // Nothing to do here for non folder tree node
-            return;
-        }
-
-        RepoPath repoPath = itemInfo.getRepoPath();
-
-        String nodePath = repoPath.getPath();
-        boolean containsMetadataInfo;
-        if (MavenNaming.isSnapshot(nodePath)) {
-            // if this folder contains snapshots create snapshots maven.metadata
-            log.trace("Detected snapshots container: {}", nodePath);
-            containsMetadataInfo = createSnapshotsMetadata(repoPath, treeNode);
-        } else {
-            // if this folder contains "version folders" create versions maven metadata
-            Map<ItemNode, RepoPath> versionFolderWithPom = getSubFoldersContainingPoms(treeNode);
-            if (!versionFolderWithPom.isEmpty()) {
-                log.trace("Detected versions container: {} with {} child versions",
-                        repoPath.toPath(), versionFolderWithPom.size());
-                createVersionsMetadata(repoPath, versionFolderWithPom);
-                containsMetadataInfo = true;
-            } else {
-                containsMetadataInfo = false;
-            }
-        }
-
-        if (!containsMetadataInfo) {
-            // note: this will also remove plugins metadata. not sure it should
-            removeMetadataIfExist(repoPath);
-        }
-
-        // Recursive call to calculate and set if recursive calc is on
-        if (recursive && itemInfo.isFolder()) {
-            List<ItemNode> children = treeNode.getChildren();
-            if (children != null) {
-                for (ItemNode child : children) {
-                    calculateAndSet(child);
-                }
-            }
-        }
-    }
-
-    private boolean createSnapshotsMetadata(RepoPath repoPath, ItemNode treeNode) {
-        if (!folderContainsPoms(treeNode)) {
-            return false;
-        }
-        List<ItemNode> folderItems = treeNode.getChildren();
-        Iterable<ItemNode> poms = Iterables.filter(folderItems, new Predicate<ItemNode>() {
-            @Override
-            public boolean apply(@Nullable ItemNode input) {
-                return (input != null) && MavenNaming.isPom(input.getItemInfo().getName());
-            }
-        });
-
-        RepoPath firstPom = poms.iterator().next().getRepoPath();
-        MavenArtifactInfo artifactInfo = MavenArtifactInfo.fromRepoPath(firstPom);
-        if (!artifactInfo.isValid()) {
-            return true;
-        }
-        Metadata metadata = new Metadata();
-        metadata.setGroupId(artifactInfo.getGroupId());
-        metadata.setArtifactId(artifactInfo.getArtifactId());
-        String baseVersion = StringUtils.substringBefore(artifactInfo.getVersion(), "-");
-        metadata.setVersion(baseVersion + MavenNaming.SNAPSHOT_SUFFIX);
-        Versioning versioning = new Versioning();
-        metadata.setVersioning(versioning);
-        versioning.setLastUpdatedTimestamp(new Date());
-        Snapshot snapshot = new Snapshot();
-        versioning.setSnapshot(snapshot);
-
-        LocalRepoDescriptor localRepoDescriptor =
-                getRepositoryService().localOrCachedRepoDescriptorByKey(repoPath.getRepoKey());
-        SnapshotVersionBehavior snapshotBehavior = localRepoDescriptor.getSnapshotVersionBehavior();
-        String latestUniquePom = getLatestUniqueSnapshotPomName(poms);
-        if (snapshotBehavior.equals(SnapshotVersionBehavior.NONUNIQUE) ||
-                (snapshotBehavior.equals(SnapshotVersionBehavior.DEPLOYER) && latestUniquePom == null)) {
-            snapshot.setBuildNumber(1);
-        } else if (snapshotBehavior.equals(SnapshotVersionBehavior.UNIQUE)) {
-            // take the latest unique snapshot file file
-            if (latestUniquePom != null) {
-                snapshot.setBuildNumber(MavenNaming.getUniqueSnapshotVersionBuildNumber(latestUniquePom));
-                snapshot.setTimestamp(MavenNaming.getUniqueSnapshotVersionTimestamp(latestUniquePom));
-            }
-
-            if (ConstantValues.mvnMetadataVersion3Enabled.getBoolean()) {
-                List<SnapshotVersion> snapshotVersions = Lists.newArrayList(getFolderItemSnapshotVersions(folderItems));
-                if (!snapshotVersions.isEmpty()) {
-                    versioning.setSnapshotVersions(snapshotVersions);
-                }
-            }
-        }
-        saveMetadata(repoPath, metadata);
-        return true;
-    }
-
-    private Collection<SnapshotVersion> getFolderItemSnapshotVersions(Collection<ItemNode> folderItems) {
-        List<SnapshotVersion> snapshotVersionsToReturn = Lists.newArrayList();
-
-        Map<SnapshotVersionType, ModuleInfo> latestSnapshotVersions = Maps.newHashMap();
-
-        for (ItemNode folderItem : folderItems) {
-            String folderItemPath = folderItem.getItemInfo().getRelPath();
-            if (MavenNaming.isUniqueSnapshot(folderItemPath)) {
-                ModuleInfo folderItemModuleInfo;
-                if (MavenNaming.isPom(folderItemPath)) {
-                    folderItemModuleInfo = ModuleInfoUtils.moduleInfoFromDescriptorPath(folderItemPath,
-                            RepoLayoutUtils.MAVEN_2_DEFAULT);
-                } else {
-                    folderItemModuleInfo = ModuleInfoUtils.moduleInfoFromArtifactPath(folderItemPath,
-                            RepoLayoutUtils.MAVEN_2_DEFAULT);
-                }
-                if (!folderItemModuleInfo.isValid() || !folderItemModuleInfo.isIntegration()) {
-                    continue;
-                }
-                SnapshotVersionType folderItemSnapshotVersionType = new SnapshotVersionType(
-                        folderItemModuleInfo.getExt(), folderItemModuleInfo.getClassifier());
-                if (latestSnapshotVersions.containsKey(folderItemSnapshotVersionType)) {
-                    SnapshotComparator snapshotComparator = createSnapshotComparator();
-                    ModuleInfo latestSnapshotVersion = latestSnapshotVersions.get(folderItemSnapshotVersionType);
-                    if (snapshotComparator.compare(folderItemModuleInfo, latestSnapshotVersion) > 0) {
-                        latestSnapshotVersions.put(folderItemSnapshotVersionType, folderItemModuleInfo);
-                    }
-                } else {
-                    latestSnapshotVersions.put(folderItemSnapshotVersionType, folderItemModuleInfo);
-                }
-            }
-        }
-
-        for (ModuleInfo latestSnapshotVersion : latestSnapshotVersions.values()) {
-            SnapshotVersion snapshotVersion = new SnapshotVersion();
-            snapshotVersion.setClassifier(latestSnapshotVersion.getClassifier());
-            snapshotVersion.setExtension(latestSnapshotVersion.getExt());
-
-            String fileItegRev = latestSnapshotVersion.getFileIntegrationRevision();
-            snapshotVersion.setVersion(latestSnapshotVersion.getBaseRevision() + "-" + fileItegRev);
-            snapshotVersion.setUpdated(StringUtils.remove(StringUtils.substringBefore(fileItegRev, "-"), '.'));
-            snapshotVersionsToReturn.add(snapshotVersion);
-        }
-
-        return snapshotVersionsToReturn;
-    }
-
-    private void createVersionsMetadata(RepoPath repoPath, Map<ItemNode, RepoPath> versionFoldersWithPom) {
-
-        // get artifact info from the first pom
-        RepoPath samplePomRepoPath = versionFoldersWithPom.values().iterator().next();
-        MavenArtifactInfo artifactInfo = MavenArtifactInfo.fromRepoPath(samplePomRepoPath);
-        if (!artifactInfo.isValid()) {
-            return;
-        }
-        Metadata metadata = new Metadata();
-        metadata.setGroupId(artifactInfo.getGroupId());
-        metadata.setArtifactId(artifactInfo.getArtifactId());
-        metadata.setVersion(artifactInfo.getVersion());
-        Versioning versioning = new Versioning();
-        metadata.setVersioning(versioning);
-        versioning.setLastUpdatedTimestamp(new Date());
-
-        MavenMetadataVersionComparator comparator = createVersionComparator();
-        TreeSet<ItemNode> sortedVersions = Sets.newTreeSet(comparator);
-        sortedVersions.addAll(versionFoldersWithPom.keySet());
-
-        // add the versions to the versioning section
-        for (ItemNode sortedVersion : sortedVersions) {
-            versioning.addVersion(sortedVersion.getName());
-        }
-
-        // latest is simply the last (be it snapshot or release version)
-        String latestVersion = sortedVersions.last().getName();
-        versioning.setLatest(latestVersion);
-
-        // release is the latest non snapshot version
-        for (ItemNode sortedVersion : sortedVersions) {
-            String versionNodeName = sortedVersion.getName();
-            if (!MavenNaming.isSnapshot(versionNodeName)) {
-                versioning.setRelease(versionNodeName);
-            }
-        }
-
-        saveMetadata(repoPath, metadata);
-    }
-
-    private String getLatestUniqueSnapshotPomName(Iterable<ItemNode> poms) {
-        // Get Default Comparator
-        Comparator<ItemNode> comparator = createSnapshotComparator();
-        ArrayList<ItemNode> list = Lists.newArrayList(poms);
-        list = Lists.newArrayList(Iterables.filter(list, uniqueSnapshotFileOnly));
-        Collections.sort(list, comparator);
-        String name = list.size() > 0 ? list.get(list.size() - 1).getName() : null;
-        return name;
-    }
-
-    private Map<ItemNode, RepoPath> getSubFoldersContainingPoms(ItemNode treeNode) {
-        // version metadata is only applicable for folders that contain other folders
-        // (child folder is checked to prevent the costly query below)
-        if (!treeNode.isFolder() || !hasChildFolder(treeNode)) {
-            log.trace("Item is not a folder or has no child folders: {}", treeNode.getRepoPath());
-            return Collections.emptyMap();
-        }
-        FileService fileService = ContextHelper.get().beanForType(FileService.class);
-        List<FileInfo> fileInfos = fileService.searchGrandchildPoms(treeNode.getRepoPath());
-
-        Map<String, RepoPath> pomByFolder = fileInfos.stream()
-                .collect(Collectors.toMap(t -> t.getRepoPath().getParent().getPath(), ItemInfo::getRepoPath, (u1, u2) -> u1));
-
-        List<ItemNode> versionNodes = treeNode.getChildren();
-
-        // return only version nodes that contain pom
-        return versionNodes.stream()
-                .filter(item -> pomByFolder.containsKey(item.getRepoPath().getPath()))
-                .collect(Collectors.toMap(item -> item, item -> pomByFolder.get(item.getRepoPath().getPath())));
-    }
-
-    private boolean hasChildFolder(ItemNode treeNode) {
-        return treeNode.getChildren().stream().anyMatch(ItemNode::isFolder);
-    }
-
-    private boolean folderContainsPoms(ItemNode treeNode) {
-        if (!treeNode.isFolder()) {
-            return false;
-        }
-
-        List<ItemNode> children = treeNode.getChildren();
-        for (ItemNode child : children) {
-            if (!child.isFolder() && MavenNaming.isPom(child.getName())) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    private void removeMetadataIfExist(RepoPath repoPath) {
-        try {
-            RepoPathImpl mavenMetadataPath = new RepoPathImpl(repoPath, MavenNaming.MAVEN_METADATA_NAME);
-            if (getRepositoryService().exists(mavenMetadataPath)) {
-                boolean delete = true;
-                String metadataStr = getRepositoryService().getStringContent(mavenMetadataPath);
-                try {
-                    Metadata metadata = MavenModelUtils.toMavenMetadata(metadataStr);
-                    if (isSnapshotMavenMetadata(metadata) && !MavenNaming.isSnapshot(repoPath.getPath())) {
-                        // RTFACT-6242 - don't delete user deployed maven-metadata (maven 2 bug)
-                        delete = false;
-                    }
-                } catch (IOException e) {
-                    // ignore -> delete
-                }
-                if (delete) {
-                    log.debug("Deleting {}", mavenMetadataPath);
-                    getRepositoryService().undeploy(mavenMetadataPath, false, false);
-                }
-            }
-        } catch (Exception e) {
-            status.error("Error while removing maven metadata from " + repoPath + ".", e, log);
-        }
-    }
-
-    private boolean isSnapshotMavenMetadata(Metadata metadata) {
-        Versioning versioning = metadata.getVersioning();
-        if (versioning == null) {
-            return false;
-        }
-        List<SnapshotVersion> snapshots = versioning.getSnapshotVersions();
-        return snapshots != null && !snapshots.isEmpty();
-    }
-
-    private static class SnapshotVersionType {
-
-        private String extension;
-        private String classifier;
-
-        private SnapshotVersionType(String extension, String classifier) {
-            this.extension = extension;
-            this.classifier = classifier;
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (this == o) {
-                return true;
-            }
-            if (!(o instanceof SnapshotVersionType)) {
-                return false;
-            }
-
-            SnapshotVersionType that = (SnapshotVersionType) o;
-
-            if (classifier != null ? !classifier.equals(that.classifier) : that.classifier != null) {
-                return false;
-            }
-            if (extension != null ? !extension.equals(that.extension) : that.extension != null) {
-                return false;
-            }
-
-            return true;
-        }
-
-        @Override
-        public int hashCode() {
-            int result = extension != null ? extension.hashCode() : 0;
-            result = 31 * result + (classifier != null ? classifier.hashCode() : 0);
-            return result;
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/maven/MavenMetadataServiceImpl.java b/backend/core/src/main/java/org/artifactory/maven/MavenMetadataServiceImpl.java
deleted file mode 100644
index 002a5e0..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/MavenMetadataServiceImpl.java
+++ /dev/null
@@ -1,141 +0,0 @@
-package org.artifactory.maven;
-
-import org.artifactory.api.maven.MavenMetadataService;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.util.RepoLayoutUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.PostConstruct;
-import java.util.function.Consumer;
-
-/**
- * A service for calculating maven metadata.
- *
- * @author Yossi Shaul
- */
- at Service
-public class MavenMetadataServiceImpl implements MavenMetadataService {
-    private static final Logger log = LoggerFactory.getLogger(MavenMetadataServiceImpl.class);
-    // work queue by repo path that requires maven metadata calculation
-    private WorkQueue<MavenMetadataWorkItem> mavenMetadataWorkQueue;
-    // work queue by repository keys that requires maven metadata plugins calculation
-    private final WorkQueue<String> pluginsMDWorkQueue =
-            new WorkQueue<>("Maven Plugin Metadata", new MavenPluginMetadataWorkExecutor());
-    @Autowired
-    private InternalRepositoryService repoService;
-
-    @PostConstruct
-    public void init() {
-        int workers = ConstantValues.mvnMetadataCalculationWorkers.getInt();
-        mavenMetadataWorkQueue = new WorkQueue<>(
-                "Maven Metadata", workers, (w) -> calculateMavenMetadata(w.repoPath, w.recursive));
-    }
-
-    @Override
-    public void calculateMavenMetadataAsync(RepoPath folderPath, boolean recursive) {
-        mavenMetadataWorkQueue.offerWork(new MavenMetadataWorkItem(folderPath, recursive));
-    }
-
-    @Override
-    public void calculateMavenMetadata(RepoPath baseFolderPath, boolean recursive) {
-        if (baseFolderPath == null) {
-            log.debug("Couldn't find repo for null repo path.");
-            return;
-        }
-        LocalRepo localRepo = repoService.localRepositoryByKey(baseFolderPath.getRepoKey());
-        if (localRepo == null) {
-            log.debug("Couldn't find local non-cache repository for path '{}'.", baseFolderPath);
-            return;
-        }
-        log.debug("Calculate maven metadata on {}", baseFolderPath);
-        RepoLayout repoLayout = localRepo.getDescriptor().getRepoLayout();
-        RepoType type = localRepo.getDescriptor().getType();
-        // Do not calculate maven metadata if type == null or type doesn't belong to the maven group (Maven, Ivy, Gradle) or repoLayout not equals MAVEN_2_DEFAULT
-        if (type != null && !(type.isMavenGroup() || RepoLayoutUtils.MAVEN_2_DEFAULT.equals(repoLayout))) {
-            log.debug("Skipping maven metadata calculation since repoType '{}' doesn't belong to " +
-                    "neither Maven, Ivy, Gradle repositories types.", baseFolderPath.getRepoKey());
-            return;
-        }
-
-        new MavenMetadataCalculator(baseFolderPath, recursive).calculate();
-        // Calculate maven plugins metadata asynchronously
-        getTransactionalMe().calculateMavenPluginsMetadataAsync(localRepo.getKey());
-    }
-
-    // get all folders marked for maven metadata calculation and execute the metadata calculation
-    @Override
-    public void calculateMavenPluginsMetadataAsync(String repoKey) {
-        pluginsMDWorkQueue.offerWork(repoKey);
-    }
-
-    private LocalRepo localRepositoryByKeyFailIfNull(RepoPath localRepoPath) {
-        LocalRepo localRepo = repoService.localRepositoryByKey(localRepoPath.getRepoKey());
-        if (localRepo == null) {
-            throw new IllegalArgumentException("Couldn't find local non-cache repository for path " + localRepoPath);
-        }
-        return localRepo;
-    }
-
-    private static MavenMetadataService getTransactionalMe() {
-        return InternalContextHelper.get().beanForType(MavenMetadataService.class);
-    }
-
-    private class MavenPluginMetadataWorkExecutor implements Consumer<String> {
-        @Override
-        public void accept(String repoToCalculate) {
-            try {
-                LocalRepo localRepo = localRepositoryByKeyFailIfNull(
-                        InternalRepoPathFactory.repoRootPath(repoToCalculate));
-                new MavenPluginsMetadataCalculator().calculate(localRepo);
-            } catch (Exception e) {
-                log.error("Failed to calculate plugin maven metadata on repo '{}'", repoToCalculate, e);
-            }
-        }
-    }
-
-    private static class MavenMetadataWorkItem {
-        private final RepoPath repoPath;
-        private final boolean recursive;
-
-        public MavenMetadataWorkItem(RepoPath repoPath, boolean recursive) {
-            this.repoPath = repoPath;
-            this.recursive = recursive;
-        }
-
-        @Override
-        public String toString() {
-            return "MavenMetadataWorkItem{" +
-                    "repoPath=" + repoPath +
-                    ", recursive=" + recursive +
-                    '}';
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (this == o) return true;
-            if (o == null || getClass() != o.getClass()) return false;
-
-            MavenMetadataWorkItem that = (MavenMetadataWorkItem) o;
-            if (recursive != that.recursive) return false;
-            return repoPath.equals(that.repoPath);
-
-        }
-
-        @Override
-        public int hashCode() {
-            int result = repoPath.hashCode();
-            result = 31 * result + (recursive ? 1 : 0);
-            return result;
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/maven/MavenPluginsMetadataCalculator.java b/backend/core/src/main/java/org/artifactory/maven/MavenPluginsMetadataCalculator.java
deleted file mode 100644
index 5f97968..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/MavenPluginsMetadataCalculator.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven;
-
-import com.google.common.collect.HashMultimap;
-import org.apache.commons.lang.StringUtils;
-import org.apache.maven.artifact.repository.metadata.Metadata;
-import org.apache.maven.artifact.repository.metadata.Plugin;
-import org.apache.maven.model.Model;
-import org.apache.maven.plugin.descriptor.PluginDescriptor;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.properties.PropertiesService;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.storage.fs.service.FileService;
-import org.artifactory.util.RepoPathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Plugins metadata is calculated for the whole repository.
- *
- * @author Yossi Shaul
- */
-public class MavenPluginsMetadataCalculator extends AbstractMetadataCalculator {
-    private static final Logger log = LoggerFactory.getLogger(MavenPluginsMetadataCalculator.class);
-
-    /**
-     * Calculate maven metadata using folder as the base.
-     *
-     * @param localRepo Base folder to start calculating from.
-     */
-    public void calculate(LocalRepo localRepo) {
-        if (!localRepo.isLocal() || localRepo.isCache()) {
-            log.warn("Maven metadata calculation is allowed only on local non-cache repositories");
-            return;
-        }
-
-        log.debug("Calculating maven plugins metadata on repo '{}'", localRepo.getKey());
-        FileService fileService = ContextHelper.get().beanForType(FileService.class);
-        List<FileInfo> pluginPoms = fileService.searchFilesByProperty(localRepo.getKey(),
-                PropertiesService.MAVEN_PLUGIN_PROPERTY_NAME, Boolean.TRUE.toString());
-        log.debug("{} plugin poms found", pluginPoms.size());
-
-        // aggregate one pom for each plugin under the plugins metadata container
-        HashMultimap<RepoPath, RepoPath> pluginsMetadataContainers = HashMultimap.create();
-        for (FileInfo pom : pluginPoms) {
-            // great-grandparent is the plugins metadata container
-            // eg, if the plugin pom is org/jfrog/maven/plugins/maven-test-plugin/1.0/maven-test-plugin-1.0.pom
-            // the node that contains the plugins metadata is org/jfrog/maven/plugins
-            RepoPath pluginsMetadataContainer = RepoPathUtils.getAncestor(pom.getRepoPath(), 3);
-            if (pluginsMetadataContainer != null) {
-                pluginsMetadataContainers.put(pluginsMetadataContainer, pom.getRepoPath());
-            } else {
-                log.info("Found plugin pom without maven GAV path: '{}'. Ignoring...", pom.getRepoPath());
-            }
-        }
-
-        // for each plugins folder container, create plugins metadata on the parent
-        Set<RepoPath> folders = pluginsMetadataContainers.keySet();
-        for (RepoPath pluginsMetadataContainer : folders) {
-            //Metadata metadata = getOrCreatePluginMetadata(pluginsMetadataContainer);
-            Metadata metadata = new Metadata();
-            for (RepoPath pomFile : pluginsMetadataContainers.get(pluginsMetadataContainer)) {
-                String artifactId = RepoPathUtils.getAncestor(pomFile, 2).getName();
-                if (hasPlugin(metadata, artifactId)) {
-                    continue;
-                }
-
-                // extract the plugin details and add to the metadata
-                String pomStr = getRepositoryService().getStringContent(pomFile);
-                Model pomModel = MavenModelUtils.stringToMavenModel(pomStr);
-                artifactId = pomModel.getArtifactId();
-                Plugin plugin = new Plugin();
-                plugin.setArtifactId(artifactId);
-                plugin.setPrefix(PluginDescriptor.getGoalPrefixFromArtifactId(pomModel.getArtifactId()));
-                String pluginName = pomModel.getName();
-                if (StringUtils.isBlank(pluginName)) {
-                    pluginName = "Unnamed - " + pomModel.getId();
-                }
-                plugin.setName(pluginName);
-                metadata.addPlugin(plugin);
-            }
-
-            // save only if something changed
-            if (modified(getPluginMetadata(pluginsMetadataContainer), metadata)) {
-                saveMetadata(pluginsMetadataContainer, metadata);
-            }
-        }
-        log.debug("Finished maven plugins metadata calculation on '{}'", localRepo.getKey());
-    }
-
-    /**
-     * Minimal checks for modified metadata.
-     *
-     * @param originalMetadata from
-     * @param newMetadata      to
-     * @return true if modified false if identical
-     */
-    private boolean modified(Metadata originalMetadata, Metadata newMetadata) {
-        if (originalMetadata == null) {
-            return true;
-        }
-
-        List originalPlugins = originalMetadata.getPlugins();
-        if (originalPlugins.size() != newMetadata.getPlugins().size()) {
-            return true;
-        }
-
-        for (Object pluginObj : newMetadata.getPlugins()) {
-            if (!hasPlugin(originalMetadata, ((Plugin) pluginObj).getArtifactId())) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * @param metadata   the plugin pom metadata
-     * @param artifactId the plugin id to find
-     * @return true if the input plugin is listed in the metadata plugins
-     */
-    private boolean hasPlugin(Metadata metadata, String artifactId) {
-        for (Object pluginObj : metadata.getPlugins()) {
-            if (((Plugin) pluginObj).getArtifactId().equals(artifactId)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private Metadata getPluginMetadata(RepoPath folder) {
-        String xmlMavenMetadata = getRepositoryService().getStringContent(
-                new RepoPathImpl(folder, MavenNaming.MAVEN_METADATA_NAME));
-        if (StringUtils.isNotBlank(xmlMavenMetadata)) {
-            try {
-                return MavenModelUtils.toMavenMetadata(xmlMavenMetadata);
-            } catch (IOException e) {
-                throw new RuntimeException("Failed to convert maven metadata into string", e);
-            }
-        } else {
-            return null;
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/maven/TransferProgressReportingInputStream.java b/backend/core/src/main/java/org/artifactory/maven/TransferProgressReportingInputStream.java
deleted file mode 100644
index 6b260aa..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/TransferProgressReportingInputStream.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven;
-
-import org.apache.maven.wagon.events.TransferEvent;
-import org.apache.maven.wagon.events.TransferEventSupport;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-
-/**
- * @author Yoav Landman
- */
-public class TransferProgressReportingInputStream extends FileInputStream {
-
-    private TransferEventSupport eventSupport;
-    private TransferEvent event;
-
-    public TransferProgressReportingInputStream(File file, TransferEventSupport eventSupport,
-            TransferEvent event)
-            throws FileNotFoundException {
-        super(file);
-        this.eventSupport = eventSupport;
-        this.event = event;
-    }
-
-    @Override
-    public int read(byte b[]) throws IOException {
-        return read(b, 0, b.length);
-    }
-
-    @Override
-    public int read() throws IOException {
-        byte b[] = new byte[1];
-        return read(b);
-    }
-
-    @Override
-    public int read(byte b[], int off, int len) throws IOException {
-        int retValue = super.read(b, off, len);
-        if (retValue > 0) {
-            event.setTimestamp(System.currentTimeMillis());
-            eventSupport.fireTransferProgress(event, b, retValue);
-        }
-        return retValue;
-    }
-
-    @Override
-    public synchronized void reset() throws IOException {
-        super.reset();
-        eventSupport.fireTransferStarted(event);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/maven/WorkQueue.java b/backend/core/src/main/java/org/artifactory/maven/WorkQueue.java
deleted file mode 100644
index bc40ef2..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/WorkQueue.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package org.artifactory.maven;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Queue;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.Semaphore;
-import java.util.function.Consumer;
-
-/**
- * A work queue that eliminates jobs based on a passed criteria.<p>
- * The thread offering work for this queue might start working on the queue, and may work on all the queued items.
- *
- * @author Yossi Shaul
- */
-public class WorkQueue<T> {
-    private static final Logger log = LoggerFactory.getLogger(WorkQueue.class);
-
-    private final Queue<T> queue = new ConcurrentLinkedQueue<>();
-    private final String name;
-    private final int workers;
-    private final Consumer<T> workExecutor;
-    private final Semaphore semaphore;
-
-    /**
-     * Creates a new work queue that allow single worker.
-     *
-     * @param name         Symbolic name for the work queue
-     * @param workExecutor The work to perform for each element in the queue
-     */
-    public WorkQueue(String name, Consumer<T> workExecutor) {
-        this(name, 1, workExecutor);
-    }
-
-    /**
-     * Creates a new work queue with the given max workers.<p>
-     * If the max workers is greater than one, the provider work executor must be thread safe.
-     *
-     * @param name         Symbolic name for the work queue
-     * @param workers      Maximum workers allowed to work on this queue
-     * @param workExecutor The work to perform for each element in the queue
-     */
-    public WorkQueue(String name, int workers, Consumer<T> workExecutor) {
-        this.name = name;
-        this.workers = workers;
-        this.workExecutor = workExecutor;
-        this.semaphore = new Semaphore(workers);
-    }
-
-    /**
-     * Offer a new work to the queue. If the work is accepted and there's no other worker thread, the offering thread
-     * continues as the worker.
-     *
-     * @param w The work to perform
-     * @return True if the work was accepted
-     */
-    public void offerWork(T w) {
-        //TODO: [by YS] do it atomic
-        if (queue.contains(w)) {
-            log.trace("{}: contains '{}'", name, w);
-            return;
-        } else {
-            log.trace("{}: adding '{}'", name, w);
-            queue.add(w);
-        }
-
-        if (!semaphore.tryAcquire()) {
-            log.debug("{}: max workers already processing ({})", name, workers);
-            return;
-        }
-        try {
-            if (log.isDebugEnabled()) {
-                // queue size is expensive
-                log.debug("{}: start processing. Queue size: {}", name, queue.size());
-            }
-            T workItem;
-            while ((workItem = queue.poll()) != null) {
-                if (log.isTraceEnabled()) {
-                    log.trace("{}: started working on {}. Queue size: {}", name, workItem, queue.size());
-                }
-                try {
-                    workExecutor.accept(workItem);
-                    if (log.isTraceEnabled()) {
-                        log.trace("{}: finished working on {}. Queue size: {}", name, workItem, queue.size());
-                    }
-                } catch (Exception e) {
-                    log.error("{}: failed to process {}", name, workItem, e);
-                }
-            }
-        } finally {
-            semaphore.release();
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/maven/index/ArtifactoryArtifactContextProducer.java b/backend/core/src/main/java/org/artifactory/maven/index/ArtifactoryArtifactContextProducer.java
deleted file mode 100644
index 9e9f76d..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/index/ArtifactoryArtifactContextProducer.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven.index;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.maven.index.ArtifactContext;
-import org.apache.maven.index.ArtifactContextProducer;
-import org.apache.maven.index.ArtifactInfo;
-import org.apache.maven.index.artifact.ArtifactPackagingMapper;
-import org.apache.maven.index.artifact.Gav;
-import org.apache.maven.index.context.IndexingContext;
-import org.apache.maven.index.locator.GavHelpedLocator;
-import org.apache.maven.index.locator.Locator;
-import org.apache.maven.model.Model;
-import org.artifactory.maven.index.locator.MainArtifactLocator;
-import org.artifactory.maven.index.locator.MetadataLocator;
-import org.artifactory.maven.index.locator.PomLocator;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-import org.artifactory.storage.fs.tree.file.JavaIOFileAdapter;
-import org.codehaus.plexus.util.StringUtils;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.InputStream;
-
-/**
- * @author Yossi Shaul
- */
-public class ArtifactoryArtifactContextProducer implements ArtifactContextProducer {
-
-    private final ArtifactPackagingMapper mapper = new SimpleArtifactPackagingMapper();
-    private GavHelpedLocator pl = new PomLocator();
-    private Locator ml = new MetadataLocator();
-
-    /**
-     * Get ArtifactContext for given pom or artifact (jar, war, etc). A file can be
-     */
-    @Override
-    public ArtifactContext getArtifactContext(IndexingContext context, File file) {
-        String repositoryPath = context.getRepository().getAbsolutePath();
-        String artifactPath = file.getAbsolutePath();
-
-        // protection from IndexOutOfBounds
-        if (artifactPath.length() <= repositoryPath.length()) {
-            return null; // not an artifact
-        }
-
-        if (!isIndexable(file)) {
-            return null; // skipped
-        }
-
-        Gav gav = getGavFromPath(context, repositoryPath, artifactPath);
-
-        if (gav == null) {
-            return null; // not an artifact
-        }
-
-        File pom;
-        File artifact;
-
-        if (file.getName().endsWith(".pom")) {
-            MainArtifactLocator al = new MainArtifactLocator(mapper);
-            artifact = al.locate(file, context.getGavCalculator(), gav);
-
-            // If we found the matching artifact, switch over to indexing that, instead of the pom
-            if (artifact != null) {
-                gav = getGavFromPath(context, repositoryPath, artifact.getAbsolutePath());
-            }
-
-            pom = file;
-        } else {
-            artifact = file;
-            pom = pl.locate(file, context.getGavCalculator(), gav);
-        }
-
-        String groupId = gav.getGroupId();
-
-        String artifactId = gav.getArtifactId();
-
-        String version = gav.getBaseVersion();
-
-        String classifier = gav.getClassifier();
-
-        ArtifactInfo ai = new ArtifactInfo(context.getRepositoryId(), groupId, artifactId, version, classifier);
-
-        // store extension if classifier is not empty
-        if (!StringUtils.isEmpty(ai.classifier)) {
-            ai.packaging = gav.getExtension();
-        }
-
-        // TODO: do it only for main package
-        if (pom != null && pom.exists() && ai.classifier == null) {
-            InputStream pomInputStream = null;
-            try {
-                // need to read the pom model to get packaging
-                pomInputStream = new BufferedInputStream(((JavaIOFileAdapter) pom).getStream());
-                Model model = new ArtifactContext.ModelReader().readModel(pomInputStream);
-                if (model != null) {
-                    if (model.getPackaging() != null) {
-                        // only when this is not a classified artifact
-                        ai.packaging = model.getPackaging();
-                    }
-                }
-            } catch (RepositoryRuntimeException e) {
-                // ignore
-            } finally {
-                IOUtils.closeQuietly(pomInputStream);
-            }
-        }
-
-        ai.fname = file.getName();
-        ai.fextension = gav.getExtension();
-
-        File metadata = ml.locate(pom);
-
-        return new ArtifactContext(pom, artifact, metadata, ai, gav);
-    }
-
-    private boolean isIndexable(File file) {
-        if (file == null) {
-            return false;
-        }
-
-        String filename = file.getName();
-
-        if (filename.equals("maven-metadata.xml")
-                // || filename.endsWith( "-javadoc.jar" )
-                // || filename.endsWith( "-javadocs.jar" )
-                // || filename.endsWith( "-sources.jar" )
-                || filename.endsWith(".properties")
-                // || filename.endsWith( ".xml" ) // NEXUS-3029
-                || filename.endsWith(".asc") || filename.endsWith(".md5") || filename.endsWith(".sha1")) {
-            return false;
-        }
-
-        return true;
-    }
-
-    private Gav getGavFromPath(IndexingContext context, String repositoryPath, String artifactPath) {
-        String path = artifactPath.substring(repositoryPath.length() + 1).replace('\\', '/');
-
-        return context.getGavCalculator().pathToGav(path);
-    }
-
-}
diff --git a/backend/core/src/main/java/org/artifactory/maven/index/ArtifactoryContentScanner.java b/backend/core/src/main/java/org/artifactory/maven/index/ArtifactoryContentScanner.java
deleted file mode 100644
index bd2691d..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/index/ArtifactoryContentScanner.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * This class is based on: org.apache.maven.index.DefaultScanner
- */
-package org.artifactory.maven.index;
-
-import org.apache.maven.index.ArtifactContext;
-import org.apache.maven.index.ArtifactContextProducer;
-import org.apache.maven.index.Scanner;
-import org.apache.maven.index.ScanningRequest;
-import org.apache.maven.index.ScanningResult;
-import org.apache.maven.index.context.IndexingContext;
-import org.artifactory.util.Files;
-import org.codehaus.plexus.logging.AbstractLogEnabled;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.Set;
-import java.util.TreeSet;
-
-/**
- * A repository scanner to scan the content of a single repository.
- *
- * @author Yossi Shaul
- */
-public class ArtifactoryContentScanner extends AbstractLogEnabled implements Scanner {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryContentScanner.class);
-
-    private ArtifactContextProducer artifactContextProducer;
-
-    public ArtifactoryContentScanner(ArtifactoryArtifactContextProducer artifactContextProducer) {
-        this.artifactContextProducer = artifactContextProducer;
-    }
-
-    @Override
-    public ScanningResult scan(ScanningRequest request) {
-        request.getArtifactScanningListener().scanningStarted(request.getIndexingContext());
-
-        ScanningResult result = new ScanningResult(request);
-
-        scanDirectory(request.getStartingDirectory(), request);
-
-        request.getArtifactScanningListener().scanningFinished(request.getIndexingContext(), result);
-
-        return result;
-    }
-
-    private void scanDirectory(File dir, ScanningRequest request) {
-        if (dir == null) {
-            return;
-        }
-
-        File[] fileArray = dir.listFiles();
-
-        if (fileArray == null) {
-            log.debug("Unexpected null file list returned from {}: {}", dir.getAbsolutePath(),
-                    Files.readFailReason(dir));
-            return;
-        }
-
-        Set<File> files = new TreeSet<>(new ScannerFileComparator());
-
-        files.addAll(Arrays.asList(fileArray));
-
-        for (File file : files) {
-            if (file.isDirectory()) {
-                scanDirectory(file, request);
-            } else {
-                processFile(file, request);
-            }
-        }
-    }
-
-    private void processFile(File file, ScanningRequest request) {
-        try {
-            if (!file.getName().startsWith(".")) {
-                IndexingContext context = request.getIndexingContext();
-                ArtifactContext ac = artifactContextProducer.getArtifactContext(context, file);
-
-                if (ac != null) {
-                    request.getArtifactScanningListener().artifactDiscovered(ac);
-                }
-            }
-        } catch (Throwable t) {
-            log.info("Failed to add {} to the maven index: {}", file.getAbsolutePath(), t.getMessage());
-            log.debug("Failed to add file to the maven index", t);
-        }
-    }
-
-    /**
-     * A special comparator to overcome some very bad limitations of nexus-indexer during scanning: using this
-     * comparator, we force to "discover" POMs last, before the actual artifact file. The reason for this, is to
-     * guarantee that scanner will provide only "best" informations 1st about same artifact, since the POM->artifact
-     * direction of discovery is not trivial at all (pom read -> packaging -> extension -> artifact file). The artifact
-     * -> POM direction is trivial.
-     */
-    private static class ScannerFileComparator
-            implements Comparator<File> {
-        @Override
-        public int compare(File o1, File o2) {
-            if (o1.getName().endsWith(".pom") && !o2.getName().endsWith(".pom")) {
-                // 1st is pom, 2nd is not
-                return 1;
-            } else if (!o1.getName().endsWith(".pom") && o2.getName().endsWith(".pom")) {
-                // 2nd is pom, 1st is not
-                return -1;
-            } else {
-                // both are "same" (pom or not pom)
-                // Use reverse order so that timestamped snapshots
-                // use latest - not first
-                return o2.getName().compareTo(o1.getName());
-
-            }
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/maven/index/InternalMavenIndexerService.java b/backend/core/src/main/java/org/artifactory/maven/index/InternalMavenIndexerService.java
deleted file mode 100644
index 9313af5..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/index/InternalMavenIndexerService.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven.index;
-
-import org.artifactory.api.repo.index.MavenIndexerService;
-import org.artifactory.spring.ReloadableBean;
-
-/**
- * Internal service for Maven indexing.
- *
- * @author yoavl
- */
-public interface InternalMavenIndexerService extends MavenIndexerService, ReloadableBean {
-    /**
-     * Start the Maven indexer using the attached settings.
-     * This method is intended to run from withing a job.
-     *
-     * @param indexerSettings The Maven indexer settings to use.
-     */
-    void index(MavenIndexerRunSettings indexerSettings);
-}
diff --git a/backend/core/src/main/java/org/artifactory/maven/index/MavenIndexManager.java b/backend/core/src/main/java/org/artifactory/maven/index/MavenIndexManager.java
deleted file mode 100644
index b46da8d..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/index/MavenIndexManager.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven.index;
-
-
-import com.google.common.io.Closeables;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.apache.http.HttpStatus;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.io.NullResourceStreamHandle;
-import org.artifactory.io.TempFileStreamHandle;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.repo.LocalCacheRepo;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RealRepo;
-import org.artifactory.repo.RemoteRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.StoringRepo;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.request.RemoteRequestException;
-import org.artifactory.resource.ResourceStreamHandle;
-import org.artifactory.schedule.TaskInterruptedException;
-import org.artifactory.schedule.TaskUtils;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.util.ExceptionUtils;
-import org.artifactory.util.Pair;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Date;
-
-/**
- * @author freds
- * @author yoavl
- */
-public class MavenIndexManager {
-    private static final Logger log = LoggerFactory.getLogger(MavenIndexManager.class);
-
-    private final RealRepo indexedRepo;
-    private StoringRepo indexStorageRepo;
-    private ResourceStreamHandle indexHandle;
-    private ResourceStreamHandle propertiesHandle;
-    private IndexStatus indexStatus = IndexStatus.NOT_CREATED;
-
-    private enum IndexStatus {
-        NOT_CREATED, NEEDS_SAVING, SKIP, ABORTED
-    }
-
-    public MavenIndexManager(RealRepo indexedRepo) {
-        if (indexedRepo == null) {
-            throw new IllegalArgumentException("Repository for indexing cannot be null.");
-        }
-        this.indexedRepo = indexedRepo;
-        if (indexedRepo.isLocal()) {
-            indexStorageRepo = (LocalRepo) indexedRepo;
-        }
-        indexStatus = IndexStatus.NOT_CREATED;
-    }
-
-    /**
-     * Used for virtual repo merged index, where there's no need to compute the index (scan)
-     */
-    public MavenIndexManager(
-            StoringRepo indexStorageRepo, ResourceStreamHandle indexHandle, ResourceStreamHandle propertiesHandle) {
-        this.indexStorageRepo = indexStorageRepo;
-        this.indexHandle = indexHandle;
-        this.propertiesHandle = propertiesHandle;
-        indexedRepo = null;
-        indexStatus = IndexStatus.NEEDS_SAVING;
-    }
-
-    boolean fetchRemoteIndex(boolean forceRemoteDownload) {
-        if (indexedRepo.isLocal()) {
-            return false;
-        } else {
-            //For remote repositories, try to download the remote cache. If fails - index locally
-            RemoteRepo remoteRepo = (RemoteRepo) indexedRepo;
-            if (remoteRepo.isStoreArtifactsLocally()) {
-                indexStorageRepo = remoteRepo.getLocalCacheRepo();
-            }
-            if (remoteRepo.isOffline()) {
-                log.debug("Not retrieving index for remote repository '{}'.", indexedRepo.getKey());
-                if (!isIndexFilesDontExistInCache(remoteRepo)) {
-                    log.debug("Skipping indexing for remote offline repository '{}', Index exists in cache.",
-                            indexedRepo.getKey());
-                    indexStatus = IndexStatus.SKIP;
-                }
-                unExpireIndexIfExists(remoteRepo);
-                return false;
-            }
-
-            File tempIndex = null;
-            File tempProperties = null;
-            ResourceStreamHandle remoteIndexHandle = null;
-            ResourceStreamHandle remotePropertiesHandle = null;
-            try {
-                //Never auto-fetch the index from central if it cannot be stored locally unless force flag is enabled
-                if (!forceRemoteDownload && !shouldFetchRemoteIndex(remoteRepo)) {
-                    //Return true so that we don't attempt to index locally as a fallback
-                    return true;
-                }
-
-                //If we receive a non-modified response (with a null handle) - don't re-download the index
-                log.debug("Fetching remote index files for {}", indexedRepo);
-                FileOutputStream fos = null;
-                try {
-                    remoteIndexHandle = remoteRepo.conditionalRetrieveResource(MavenNaming.NEXUS_INDEX_GZ_PATH,
-                            forceRemoteDownload);
-                    if (remoteIndexHandle instanceof NullResourceStreamHandle) {
-                        log.debug("No need to fetch unmodified index for remote repository '{}'.",
-                                indexedRepo.getKey());
-                        indexStatus = IndexStatus.SKIP;
-                        return true;
-                    }
-                    //Save into temp files
-                    tempIndex = File.createTempFile(MavenNaming.NEXUS_INDEX_GZ, null);
-                    fos = new FileOutputStream(tempIndex);
-                    TaskUtils.copyLarge(remoteIndexHandle.getInputStream(), fos);
-                } finally {
-                    IOUtils.closeQuietly(fos);
-                    /**
-                     * Close the handle directly after reading stream and before we start to download the properties
-                     * in case the target repo does not allow multiple simultaneous connections
-                     */
-                    Closeables.close(remoteIndexHandle, false);
-                }
-
-                fos = null;
-                try {
-                    remotePropertiesHandle = remoteRepo.downloadResource(MavenNaming.NEXUS_INDEX_PROPERTIES_PATH);
-                    tempProperties = File.createTempFile(MavenNaming.NEXUS_INDEX_PROPERTIES, null);
-                    fos = new FileOutputStream(tempProperties);
-                    TaskUtils.copyLarge(remotePropertiesHandle.getInputStream(), fos);
-                } finally {
-                    IOUtils.closeQuietly(fos);
-                    Closeables.close(remotePropertiesHandle, false);
-                }
-
-                //Return the handle to the zip file (will be removed when the handle is closed)
-                indexHandle = new TempFileStreamHandle(tempIndex);
-                propertiesHandle = new TempFileStreamHandle(tempProperties);
-                indexStatus = IndexStatus.NEEDS_SAVING;
-                log.debug("Fetched remote index files for {}", indexedRepo);
-                return true;
-            } catch (IOException e) {
-                closeHandles();
-                FileUtils.deleteQuietly(tempIndex);
-                FileUtils.deleteQuietly(tempProperties);
-                log.warn("Could not retrieve remote maven index '" + MavenNaming.NEXUS_INDEX_GZ +
-                        "' for repo '" + indexedRepo + "': " + e.getMessage());
-                abort();
-                if (isNotFoundInRemoteRepo(e) || isIndexFilesDontExistInCache(remoteRepo)) {
-                    indexStatus = IndexStatus.NOT_CREATED;
-                }
-                unExpireIndexIfExists(remoteRepo);
-                return false;
-            }
-        }
-    }
-
-    private void unExpireIndexIfExists(RemoteRepo remoteRepo) {
-        if (!isIndexFilesDontExistInCache(remoteRepo)) {
-            InternalRepositoryService repoService = InternalContextHelper.get().beanForType(
-                    InternalRepositoryService.class);
-            repoService.unexpireIfExists(remoteRepo.getLocalCacheRepo(), MavenNaming.NEXUS_INDEX_GZ_PATH);
-            repoService.unexpireIfExists(remoteRepo.getLocalCacheRepo(), MavenNaming.NEXUS_INDEX_PROPERTIES_PATH);
-        }
-    }
-
-    private boolean isNotFoundInRemoteRepo(IOException e) {
-        Throwable remoteRequestException = ExceptionUtils.getCauseOfTypes(e, RemoteRequestException.class);
-        return remoteRequestException != null
-                && HttpStatus.SC_NOT_FOUND == ((RemoteRequestException) e).getRemoteReturnCode();
-    }
-
-    private boolean isIndexFilesDontExistInCache(RemoteRepo remoteRepo) {
-        LocalCacheRepo localCacheRepo = remoteRepo.getLocalCacheRepo();
-        if (localCacheRepo == null) {
-            return true;
-        }
-        boolean indexGzDoesntExist = !localCacheRepo.itemExists(MavenNaming.NEXUS_INDEX_GZ_PATH);
-        boolean indexPropertiesDontExist = !localCacheRepo.itemExists(MavenNaming.NEXUS_INDEX_PROPERTIES_PATH);
-        return indexGzDoesntExist || indexPropertiesDontExist;
-    }
-
-    private void abort() {
-        indexHandle = null;
-        propertiesHandle = null;
-        indexStatus = IndexStatus.ABORTED;
-    }
-
-    void createLocalIndex(Date fireTime, boolean remoteIndexExists) {
-        if (indexStatus != IndexStatus.NOT_CREATED) {
-            return;
-        }
-        //For remote repositories, only index locally if not already fetched remotely before and if has local
-        //storage
-        if (!indexedRepo.isLocal() && remoteIndexExists) {
-            return;
-        }
-
-        if (!indexedRepo.isLocal() && !((RemoteRepo) indexedRepo).isStoreArtifactsLocally()) {
-            log.debug("Skipping local index creation for remote repo '{}': repo does not store artifacts locally",
-                    indexedRepo.getKey());
-            return;
-        }
-
-        log.debug("Creating index files for {}", indexedRepo);
-        RepoIndexer repoIndexer = new RepoIndexer(indexStorageRepo);
-        try {
-            Pair<TempFileStreamHandle, TempFileStreamHandle> tempFileStreamHandlesPair = repoIndexer.index(fireTime);
-            indexHandle = tempFileStreamHandlesPair.getFirst();
-            propertiesHandle = tempFileStreamHandlesPair.getSecond();
-            indexStatus = IndexStatus.NEEDS_SAVING;
-            log.debug("Created index files for {}", indexedRepo);
-        } catch (Exception e) {
-            closeHandles();
-            abort();
-            String message = "Failed to index repository '" + indexedRepo + "': " + e.getMessage();
-            if (e instanceof TaskInterruptedException) {
-                throw new TaskInterruptedException(message, e);
-            }
-            throw new RuntimeException(message, e);
-        }
-    }
-
-    boolean saveIndexFiles() {
-        log.debug("Saving index file for {}", indexStorageRepo);
-        try {
-            //indexStorageRepo might be a virtual repo
-            if (indexedRepo != null && !indexedRepo.isLocal()) {
-                if (!((RemoteRepo) indexedRepo).isStoreArtifactsLocally()) {
-                    log.debug("Skipping index saving for remote repo '{}': repo does not store artifacts locally",
-                            indexedRepo.getKey());
-                    return false;
-                }
-            }
-
-            if (indexStatus != IndexStatus.NEEDS_SAVING) {
-                return false;
-            }
-
-            InternalRepositoryService repoService = InternalContextHelper.get().beanForType(
-                    InternalRepositoryService.class);
-            RepoPath indexFolderRepoPath = indexStorageRepo.getRepoPath(MavenNaming.NEXUS_INDEX_DIR);
-
-            // save the index gz file
-            RepoPath indexGzRepoPath = new RepoPathImpl(indexFolderRepoPath, MavenNaming.NEXUS_INDEX_GZ);
-            InputStream indexInputStream = indexHandle.getInputStream();
-            repoService.saveFileInternal(indexGzRepoPath, indexInputStream);
-
-            // save the index properties file
-            RepoPath indexPropsRepoPath = new RepoPathImpl(indexFolderRepoPath, MavenNaming.NEXUS_INDEX_PROPERTIES);
-            InputStream propertiesInputStream = propertiesHandle.getInputStream();
-            repoService.saveFileInternal(indexPropsRepoPath, propertiesInputStream);
-
-            log.info("Successfully saved index file '{}' and index info '{}'.",
-                    indexGzRepoPath, indexPropsRepoPath);
-            log.debug("Saved index file for {}", indexStorageRepo);
-            return true;
-        } catch (Exception e) {
-            closeHandles();
-            abort();
-            throw new RuntimeException("Failed to save index file for repo '" + indexStorageRepo + "'.", e);
-        } finally {
-            closeHandles();
-        }
-    }
-
-    private void closeHandles() {
-        IOUtils.closeQuietly(indexHandle);
-        IOUtils.closeQuietly(propertiesHandle);
-    }
-
-    private boolean shouldFetchRemoteIndex(RemoteRepo remoteRepo) {
-        if (!remoteRepo.isStoreArtifactsLocally() &&
-                remoteRepo.getUrl().contains(ConstantValues.mvnCentralHostPattern.getString())) {
-            log.debug("Central index cannot be periodically fetched.Remote repository '{}' does not support " +
-                    "local index storage.", remoteRepo.getUrl());
-            return false;
-        }
-        return true;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/maven/index/MavenIndexerJob.java b/backend/core/src/main/java/org/artifactory/maven/index/MavenIndexerJob.java
deleted file mode 100644
index 4bf0d0f..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/index/MavenIndexerJob.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven.index;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.repo.service.ImportJob;
-import org.artifactory.schedule.JobCommand;
-import org.artifactory.schedule.StopCommand;
-import org.artifactory.schedule.StopStrategy;
-import org.artifactory.schedule.TaskUser;
-import org.artifactory.schedule.quartz.QuartzCommand;
-import org.quartz.JobDataMap;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * @author yoavl
- */
- at JobCommand(
-        singleton = true,
-        schedulerUser = TaskUser.SYSTEM,
-        manualUser = TaskUser.SYSTEM,
-        description = "Maven Indexer",
-        commandsToStop = @StopCommand(command = ImportJob.class, strategy = StopStrategy.IMPOSSIBLE)
-)
-public class MavenIndexerJob extends QuartzCommand {
-    private static final Logger log = LoggerFactory.getLogger(MavenIndexerJob.class);
-
-    public static final String SETTINGS = "settings";
-
-    @Override
-    protected void onExecute(JobExecutionContext context) throws JobExecutionException {
-        log.debug("Triggered MavenIndexerJob started");
-        InternalMavenIndexerService indexer = ContextHelper.get().beanForType(InternalMavenIndexerService.class);
-        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
-        MavenIndexerRunSettings settings = (MavenIndexerRunSettings) jobDataMap.get(SETTINGS);
-        settings.setFireTime(context.getFireTime());
-        indexer.index(settings);
-        log.debug("Triggered MavenIndexerJob finished");
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/maven/index/MavenIndexerRunSettings.java b/backend/core/src/main/java/org/artifactory/maven/index/MavenIndexerRunSettings.java
deleted file mode 100644
index dce13e6..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/index/MavenIndexerRunSettings.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven.index;
-
-import java.util.Date;
-import java.util.List;
-
-/**
- * Settings param for indexer task
- *
- * @author Shay Yaakov
- */
-public class MavenIndexerRunSettings {
-
-    private Date fireTime;
-    private final boolean manualRun;
-    private final boolean forceRemoteDownload;
-    /**
-     * If not null will index each repo inside the list.
-     */
-    private List<String> repoKeys;
-
-    public MavenIndexerRunSettings(boolean manualRun, boolean forceRemoteDownload, List<String> repoKeys) {
-        this.manualRun = manualRun;
-        this.forceRemoteDownload = forceRemoteDownload;
-        this.repoKeys = repoKeys;
-    }
-
-    public Date getFireTime() {
-        return fireTime;
-    }
-
-    public boolean isManualRun() {
-        return manualRun;
-    }
-
-    public boolean isForceRemoteDownload() {
-        return forceRemoteDownload;
-    }
-
-    public List<String> getRepoKeys() {
-        return repoKeys;
-    }
-
-    public void setFireTime(Date fireTime) {
-        this.fireTime = fireTime;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/maven/index/MavenIndexerServiceImpl.java b/backend/core/src/main/java/org/artifactory/maven/index/MavenIndexerServiceImpl.java
deleted file mode 100644
index 94560b6..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/index/MavenIndexerServiceImpl.java
+++ /dev/null
@@ -1,392 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven.index;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import org.apache.lucene.store.FSDirectory;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.index.IndexerDescriptor;
-import org.artifactory.descriptor.repo.RepoBaseDescriptor;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-import org.artifactory.io.TempFileStreamHandle;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RealRepo;
-import org.artifactory.repo.RemoteRepo;
-import org.artifactory.repo.StoringRepo;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.repo.virtual.VirtualRepo;
-import org.artifactory.resource.ResourceStreamHandle;
-import org.artifactory.schedule.BaseTaskServiceDescriptorHandler;
-import org.artifactory.schedule.Task;
-import org.artifactory.schedule.TaskBase;
-import org.artifactory.schedule.TaskService;
-import org.artifactory.schedule.TaskUtils;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.util.ExceptionUtils;
-import org.artifactory.util.Files;
-import org.artifactory.util.Pair;
-import org.artifactory.version.CompoundVersionDetails;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.io.File;
-import java.net.SocketTimeoutException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.Predicate;
-import java.util.stream.Collectors;
-
-/**
- * @author Yoav Landman
- */
- at Service
- at Reloadable(beanClass = InternalMavenIndexerService.class,
-        initAfter = {TaskService.class, InternalRepositoryService.class})
-public class MavenIndexerServiceImpl implements InternalMavenIndexerService {
-    private static final Logger log = LoggerFactory.getLogger(MavenIndexerServiceImpl.class);
-
-    @Autowired
-    private TaskService taskService;
-
-    @Autowired
-    private CentralConfigService centralConfig;
-
-    @Autowired
-    private InternalRepositoryService repositoryService;
-
-    @Override
-    public void init() {
-        new IndexerSchedulerHandler(getDescriptor(), null).reschedule();
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-        new IndexerSchedulerHandler(getDescriptor(), oldDescriptor.getIndexer()).reschedule();
-    }
-
-    private IndexerDescriptor getDescriptor() {
-        return centralConfig.getDescriptor().getIndexer();
-    }
-
-    @Override
-    public void scheduleImmediateIndexing(MutableStatusHolder statusHolder) {
-        scheduleIndexer(statusHolder, new MavenIndexerRunSettings(true, false, null));
-    }
-
-    @Override
-    public void runSpecificIndexer(MutableStatusHolder statusHolder, List<String> repoKeys,
-            boolean forceRemoteDownload) {
-        scheduleIndexer(statusHolder, new MavenIndexerRunSettings(true, forceRemoteDownload, repoKeys));
-    }
-
-    private void scheduleIndexer(MutableStatusHolder statusHolder, MavenIndexerRunSettings settings) {
-        taskService.checkCanStartManualTask(MavenIndexerJob.class, statusHolder);
-        if (!statusHolder.isError()) {
-            try {
-                StringBuilder logMessageBuilder = new StringBuilder("Activating indexer ");
-                List<String> repoKeys = settings.getRepoKeys();
-                if ((repoKeys != null) && !repoKeys.isEmpty()) {
-                    logMessageBuilder.append("for repo '").append(Arrays.toString(repoKeys.toArray())).append("' ");
-                }
-                logMessageBuilder.append("manually");
-                log.info(logMessageBuilder.toString());
-                TaskBase task = TaskUtils.createManualTask(MavenIndexerJob.class, 0L);
-                task.addAttribute(MavenIndexerJob.SETTINGS, settings);
-                taskService.startTask(task, true, true);
-            } catch (Exception e) {
-                log.error("Error scheduling the indexer.", e);
-            }
-        }
-    }
-
-    @Override
-    public void destroy() {
-        new IndexerSchedulerHandler(null, null).unschedule();
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-    }
-
-    @Override
-    public void index(MavenIndexerRunSettings settings) {
-        log.info("Starting Maven indexing");
-        IndexerDescriptor descriptor = getDescriptor();
-        if (!settings.isForceRemoteDownload() && !descriptor.isEnabled() && !settings.isManualRun()) {
-            log.debug("Indexer is disabled - doing nothing.");
-            return;
-        }
-
-        Set<? extends RepoDescriptor> includedRepositories;
-        List<String> repoKeys = settings.getRepoKeys();
-        if ((repoKeys == null) || repoKeys.isEmpty()) {
-            includedRepositories = descriptor.getIncludedRepositories();
-            if (includedRepositories == null) {
-                // Nothing to index
-                log.info("Indexer activated but has no repository declared to index - doing nothing.");
-                return;
-            }
-        } else {
-            // only calculate the requested repositories
-            includedRepositories = calcSpecificReposForIndexing(repoKeys);
-        }
-
-        log.info("Starting non virtual repositories indexing...");
-        List<RealRepo> indexedRepos = getNonVirtualRepositoriesToIndex(includedRepositories);
-        log.info("Non virtual repositories to index: {}", indexedRepos);
-        //Do the indexing work
-        for (RealRepo indexedRepo : indexedRepos) {
-            //Check if we need to stop/suspend
-            if (taskService.pauseOrBreak()) {
-                log.info("Stopped indexing on demand");
-                return;
-            }
-            MavenIndexManager mavenIndexManager = new MavenIndexManager(indexedRepo);
-            try {
-                boolean remoteIndexExists = mavenIndexManager.fetchRemoteIndex(settings.isForceRemoteDownload());
-                mavenIndexManager.createLocalIndex(settings.getFireTime(), remoteIndexExists);
-
-                //Check again if we need to stop/suspend
-                if (taskService.pauseOrBreak()) {
-                    log.info("Stopped indexing on demand");
-                    return;
-                }
-                mavenIndexManager.saveIndexFiles();
-            } catch (Exception e) {
-                //If we failed to index because of a socket timeout, issue a terse warning instead of a complete stack
-                //trace
-                Throwable cause = ExceptionUtils.getCauseOfTypes(e, SocketTimeoutException.class);
-                if (cause != null) {
-                    log.warn("Indexing for repo '" + indexedRepo.getKey() + "' failed: " + e.getMessage() + ".");
-                } else {
-                    //Just report - don't stop indexing of other repos
-                    log.error("Indexing for repo '" + indexedRepo.getKey() + "' failed.", e);
-                }
-            }
-        }
-        mergeVirtualRepoIndexes(includedRepositories, indexedRepos);
-        log.info("Finished Maven indexing...");
-    }
-
-    private Set<? extends RepoDescriptor> calcSpecificReposForIndexing(List<String> repoKeys) {
-        Set<RepoBaseDescriptor> repos = Sets.newHashSet();
-        repos.addAll(repositoryService.getLocalRepoDescriptors());
-        repos.addAll(repositoryService.getRemoteRepoDescriptors());
-        repos.addAll(getAllVirtualReposExceptGlobal());
-        repos.removeIf(descriptor -> !repoKeys.contains(descriptor.getKey()));
-        return repos;
-    }
-
-    private List<RealRepo> getNonVirtualRepositoriesToIndex(
-            @Nullable Set<? extends RepoDescriptor> includedRepositories) {
-        List<RealRepo> indexedRepos = repositoryService.getLocalAndRemoteRepositories();
-        if (includedRepositories != null) {
-            indexedRepos.removeIf(realRepo -> !includedRepositories.contains(realRepo.getDescriptor()));
-        }
-        return indexedRepos;
-    }
-
-    public void mergeVirtualRepoIndexes(@Nonnull Set<? extends RepoDescriptor> includedRepositories,
-            List<RealRepo> indexedRepos) {
-        List<VirtualRepo> virtualRepos = getVirtualRepos(includedRepositories);
-        log.info("Virtual repositories to index: {}", virtualRepos);
-        //Keep a list of extracted index dirs for all the local repo indexes for merging
-        Map<StoringRepo, FSDirectory> extractedLocalRepoIndexes = new HashMap<>();
-        try {
-            //Merge virtual repo indexes
-            for (VirtualRepo virtualRepo : virtualRepos) {
-                //Check if we need to stop/suspend
-                if (taskService.pauseOrBreak()) {
-                    log.info("Stopped indexing on demand");
-                    return;
-                }
-                Set<LocalRepo> localRepos = new HashSet<>();
-                localRepos.addAll(virtualRepo.getResolvedLocalRepos());
-                localRepos.addAll(virtualRepo.getResolvedLocalCachedRepos());
-                //Create a temp lucene dir and merge each local into it
-                ArtifactoryHome artifactoryHome = ContextHelper.get().getArtifactoryHome();
-                File dir = Files.createRandomDir(artifactoryHome.getTempWorkDir(), "artifactory.merged-index");
-                RepoIndexer indexer = null;
-                try {
-                    indexer = new RepoIndexer(virtualRepo);
-                    indexer.createContext(dir);
-
-                    log.info("Creating virtual repository index '{}'", virtualRepo);
-                    //Take the local index from each relevant indexed repo (for remote take local cache)
-                    for (RealRepo indexedRepo : indexedRepos) {
-                        //Check if we need to stop/suspend
-                        if (taskService.pauseOrBreak()) {
-                            log.info("Stopped indexing on demand");
-                            return;
-                        }
-                        LocalRepo localRepo = indexedRepo.isLocal() ? (LocalRepo) indexedRepo :
-                                ((RemoteRepo) indexedRepo).getLocalCacheRepo();
-                        try {
-                            //Extract aside the index from the local repo
-                            if (localRepos.contains(localRepo)) {
-                                log.debug("Merging index of '{}' to index of virtual repo '{}'", localRepo,
-                                        virtualRepo);
-                                indexer.mergeInto(localRepo, extractedLocalRepoIndexes);
-                            }
-                        } catch (Exception e) {
-                            log.warn("Could not merge index of local repo '{}' into virtual repo '{}'",
-                                    localRepo.getKey(), virtualRepo.getKey());
-                        }
-                    }
-                    //Store the index into the virtual repo
-                    //Get the last gz and props and store them - we need to return them or create them from the dir
-                    Pair<TempFileStreamHandle, TempFileStreamHandle> tempFileStreamHandlesPair =
-                            indexer.createIndex(dir, false);
-                    ResourceStreamHandle indexHandle = tempFileStreamHandlesPair.getFirst();
-                    ResourceStreamHandle properties = tempFileStreamHandlesPair.getSecond();
-                    MavenIndexManager mavenIndexManager =
-                            new MavenIndexManager(indexer.getRepo(), indexHandle, properties);
-                    mavenIndexManager.saveIndexFiles();
-                } finally {
-                    if (indexer != null) {
-                        indexer.removeTempIndexFiles(dir);
-                    }
-                    org.apache.commons.io.FileUtils.deleteQuietly(dir);
-                }
-            }
-        } catch (Exception e) {
-            log.error("Could not merge virtual repository indexes.", e);
-        } finally {
-            //Delete temp extracted dirs
-            for (FSDirectory directory : extractedLocalRepoIndexes.values()) {
-                org.apache.commons.io.FileUtils.deleteQuietly(directory.getFile());
-            }
-        }
-    }
-
-    /**
-     * Returns a filtered list of virtual repositories based on the excluded repository list
-     *
-     * @param includedRepositories List of repositories to index
-     * @return List of virtual repositories to index
-     */
-    private List<VirtualRepo> getVirtualRepos(@Nonnull Set<? extends RepoDescriptor> includedRepositories) {
-        List<VirtualRepo> virtualRepositories = repositoryService.getVirtualRepositories();
-        List<VirtualRepo> virtualRepositoriesCopy = new ArrayList<>(virtualRepositories);
-        virtualRepositoriesCopy.removeIf(virtualRepo -> {
-            boolean isFilterGlobalRepo = VirtualRepoDescriptor.GLOBAL_VIRTUAL_REPO_KEY.equals(virtualRepo.getKey())
-                    && ConstantValues.disableGlobalRepoAccess.getBoolean();
-
-            boolean isIncluded = includedRepositories
-                    .stream()
-                    .map(RepoDescriptor::getKey)
-                    .collect(Collectors.toList())
-                    .contains(virtualRepo.getKey());
-
-            return isFilterGlobalRepo || !isIncluded;
-        });
-
-        return virtualRepositoriesCopy;
-    }
-
-    /**
-     * Returns the complete list of virtual repository descriptors, apart from the global one (repo)
-     *
-     * @return List of all virtual repository descriptors apart from the global one
-     */
-    private List<VirtualRepoDescriptor> getAllVirtualReposExceptGlobal() {
-        List<VirtualRepoDescriptor> virtualRepositoriesCopy =
-                new ArrayList<>(repositoryService.getVirtualRepoDescriptors());
-        VirtualRepoDescriptor dummyGlobal = new VirtualRepoDescriptor();
-        dummyGlobal.setKey(VirtualRepoDescriptor.GLOBAL_VIRTUAL_REPO_KEY);
-        virtualRepositoriesCopy.remove(dummyGlobal);
-        return virtualRepositoriesCopy;
-    }
-
-    static class IndexerSchedulerHandler extends BaseTaskServiceDescriptorHandler<IndexerDescriptor> {
-        final List<IndexerDescriptor> oldDescriptorHolder = Lists.newArrayList();
-        final List<IndexerDescriptor> newDescriptorHolder = Lists.newArrayList();
-
-        IndexerSchedulerHandler(IndexerDescriptor newDesc, IndexerDescriptor oldDesc) {
-            if (newDesc != null) {
-                newDescriptorHolder.add(newDesc);
-            }
-            if (oldDesc != null) {
-                oldDescriptorHolder.add(oldDesc);
-            }
-        }
-
-        @Override
-        public String jobName() {
-            return "Indexer";
-        }
-
-        @Override
-        public List<IndexerDescriptor> getNewDescriptors() {
-            return newDescriptorHolder;
-        }
-
-        @Override
-        public List<IndexerDescriptor> getOldDescriptors() {
-            return oldDescriptorHolder;
-        }
-
-        @Override
-        public Predicate<Task> getAllPredicate() {
-            return input -> MavenIndexerJob.class.isAssignableFrom(input.getType());
-        }
-
-        @Override
-        public Predicate<Task> getPredicate(@Nonnull IndexerDescriptor descriptor) {
-            return getAllPredicate();
-        }
-
-        @Override
-        public void activate(@Nonnull IndexerDescriptor descriptor, boolean manual) {
-            String cronExp = descriptor.getCronExp();
-            if (descriptor.isEnabled() && cronExp != null) {
-                TaskBase task = TaskUtils.createCronTask(MavenIndexerJob.class, cronExp);
-                // Passing null for repo keys because they are taken from the indexer descriptor
-                MavenIndexerRunSettings settings = new MavenIndexerRunSettings(false, false, null);
-                task.addAttribute(MavenIndexerJob.SETTINGS, settings);
-                InternalContextHelper.get().getBean(TaskService.class).startTask(task, false, manual);
-                log.info("Indexer activated with cron expression '{}'.", cronExp);
-            } else {
-                log.debug("No indexer cron expression is configured. Indexer will be disabled.");
-            }
-        }
-
-        @Override
-        public IndexerDescriptor findOldFromNew(@Nonnull IndexerDescriptor newDescriptor) {
-            return oldDescriptorHolder.isEmpty() ? null : oldDescriptorHolder.get(0);
-        }
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/maven/index/RepoIndexer.java b/backend/core/src/main/java/org/artifactory/maven/index/RepoIndexer.java
deleted file mode 100644
index 3219c32..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/index/RepoIndexer.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/**
- * Copyright (c) 2007-2008 Sonatype, Inc. All rights reserved.
- *
- * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0,
- * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html.
- */
-/*
- * Additional contributors:
- *    JFrog Ltd.
- */
-
-package org.artifactory.maven.index;
-
-import org.apache.lucene.store.FSDirectory;
-import org.apache.maven.index.ArtifactContext;
-import org.apache.maven.index.ArtifactScanningListener;
-import org.apache.maven.index.DefaultIndexer;
-import org.apache.maven.index.DefaultIndexerEngine;
-import org.apache.maven.index.DefaultQueryCreator;
-import org.apache.maven.index.DefaultScannerListener;
-import org.apache.maven.index.DefaultSearchEngine;
-import org.apache.maven.index.ScanningRequest;
-import org.apache.maven.index.ScanningResult;
-import org.apache.maven.index.context.IndexCreator;
-import org.apache.maven.index.context.IndexingContext;
-import org.apache.maven.index.incremental.DefaultIncrementalHandler;
-import org.apache.maven.index.incremental.IncrementalHandler;
-import org.apache.maven.index.packer.DefaultIndexPacker;
-import org.apache.maven.index.packer.IndexPacker;
-import org.apache.maven.index.packer.IndexPackingRequest;
-import org.apache.maven.index.updater.DefaultIndexUpdater;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.io.TempFileStreamHandle;
-import org.artifactory.maven.index.creator.VfsJarFileContentsIndexCreator;
-import org.artifactory.maven.index.creator.VfsMavenArchetypeArtifactInfoIndexCreator;
-import org.artifactory.maven.index.creator.VfsMavenPluginArtifactInfoIndexCreator;
-import org.artifactory.maven.index.creator.VfsMinimalArtifactInfoIndexCreator;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.repo.StoringRepo;
-import org.artifactory.request.NullRequestContext;
-import org.artifactory.resource.ResourceStreamHandle;
-import org.artifactory.schedule.TaskInterruptedException;
-import org.artifactory.schedule.TaskUtils;
-import org.artifactory.storage.fs.tree.ItemTree;
-import org.artifactory.storage.fs.tree.file.JavaIOFileAdapter;
-import org.artifactory.util.Files;
-import org.artifactory.util.Pair;
-import org.codehaus.plexus.logging.console.ConsoleLogger;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.util.FieldUtils;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author yoavl
- * @author yossis
- */
-public class RepoIndexer extends DefaultIndexer implements ArtifactScanningListener {
-    private static final Logger log = LoggerFactory.getLogger(RepoIndexer.class);
-
-    private final StoringRepo repo;
-    private IndexingContext context;
-    private IndexPacker packer;
-    private final DefaultIndexerEngine defaultIndexerEngine;
-    private final ArtifactoryContentScanner scanner;
-
-    public RepoIndexer(StoringRepo repo) {
-        if (repo == null) {
-            throw new IllegalArgumentException("Repo cannot be null");
-        }
-        this.repo = repo;
-        //Unplexus
-        defaultIndexerEngine = new DefaultIndexerEngine();
-        FieldUtils.setProtectedFieldValue("indexerEngine", this, defaultIndexerEngine);
-        DefaultQueryCreator queryCreator = new DefaultQueryCreator();
-        FieldUtils.setProtectedFieldValue("logger", queryCreator,
-                new ConsoleLogger(org.codehaus.plexus.logging.Logger.LEVEL_INFO, "console"));
-        FieldUtils.setProtectedFieldValue("queryCreator", this, queryCreator);
-        FieldUtils.setProtectedFieldValue("searcher", this, new DefaultSearchEngine());
-        //packer
-        IncrementalHandler incrementalHandler = new DefaultIncrementalHandler();
-        FieldUtils.setProtectedFieldValue("logger", incrementalHandler,
-                new ConsoleLogger(org.codehaus.plexus.logging.Logger.LEVEL_INFO, "console"));
-        packer = new DefaultIndexPacker();
-        FieldUtils.setProtectedFieldValue("incrementalHandler", packer, incrementalHandler);
-        FieldUtils.setProtectedFieldValue("logger", packer,
-                new ConsoleLogger(org.codehaus.plexus.logging.Logger.LEVEL_WARN, "console"));
-
-        ArtifactoryArtifactContextProducer artifactContextProducer = new ArtifactoryArtifactContextProducer();
-        scanner = new ArtifactoryContentScanner(artifactContextProducer);
-    }
-
-    @Override
-    public void scanningStarted(IndexingContext ctx) {
-    }
-
-    @Override
-    public void scanningFinished(IndexingContext ctx, ScanningResult result) {
-    }
-
-    @Override
-    public void artifactError(ArtifactContext ac, Exception e) {
-    }
-
-    @Override
-    public void artifactDiscovered(ArtifactContext ac) {
-        if (log.isTraceEnabled()) {
-            log.trace("Artifact discovered: '{}'", ac.getArtifactInfo().getUinfo());
-        }
-        if (TaskUtils.pauseOrBreak()) {
-            throw new TaskInterruptedException();
-        }
-        //Be nice with other threads
-        Thread.yield();
-    }
-
-    @SuppressWarnings({"UnusedDeclaration"})
-    Pair<TempFileStreamHandle, TempFileStreamHandle> index(Date fireTime) throws Exception {
-        //Use a file based dir with a temp file to conserve memory
-        ArtifactoryHome artifactoryHome = ContextHelper.get().getArtifactoryHome();
-        // TODO: Should use the temp file of the repo
-        File dir = Files.createRandomDir(artifactoryHome.getTempWorkDir(), "artifactory.index." + repo.getKey());
-        try {
-            createContext(dir);
-            return createIndex(dir, true);
-        } catch (Exception e) {
-            throw new RuntimeException("Indexing failed.", e);
-        } finally {
-            //Remove the temp index dir and files
-            removeTempIndexFiles(dir);
-        }
-    }
-
-    Pair<TempFileStreamHandle, TempFileStreamHandle> createIndex(File indexDir, boolean scan) throws IOException {
-        try {
-            context.updateTimestamp();
-            if (scan) {
-                //Update the dir content by scanning the repo
-                scanner.scan(new ScanningRequest(context,
-                        new DefaultScannerListener(context, defaultIndexerEngine, true, this), null));
-            }
-
-            ArtifactoryHome artifactoryHome = ContextHelper.get().getArtifactoryHome();
-            File outputFolder = Files.createRandomDir(artifactoryHome.getTempWorkDir(),
-                    "artifactory.index." + repo.getKey());
-            outputFolder.deleteOnExit();
-            IndexPackingRequest request = newIndexPackingRequest(outputFolder);
-            //Pack - will create the index files inside the folder
-            packer.packIndex(request);
-            //Return the handle to the zip file (will be remove when the handle is closed)
-            File tmpGz = new File(outputFolder, MavenNaming.NEXUS_INDEX_GZ);
-            if (!tmpGz.exists()) {
-                throw new RuntimeException("Temp index file '" + tmpGz.getAbsolutePath() + "' does not exist.");
-            }
-            File propertiesFile = new File(outputFolder, MavenNaming.NEXUS_INDEX_PROPERTIES);
-            if (!propertiesFile.exists()) {
-                throw new RuntimeException("Temp properties file '" + tmpGz.getAbsolutePath() + "' does not exist.");
-            }
-            TempFileStreamHandle zipIndexHandle = new TempFileStreamHandle(tmpGz);
-            TempFileStreamHandle propertiesHandle = new TempFileStreamHandle(propertiesFile);
-            return new Pair<>(zipIndexHandle, propertiesHandle);
-        } catch (Exception e) {
-            throw new RuntimeException("Index creation failed.", e);
-        }
-    }
-
-    void mergeInto(StoringRepo localRepo, Map<StoringRepo, FSDirectory> extractedRepoIndexes) throws Exception {
-        FSDirectory repoToMergeIndexDir = getIndexDir(localRepo, extractedRepoIndexes);
-        if (repoToMergeIndexDir == null) {
-            //No local index exists
-            return;
-        }
-        //Merge the provided index into the repo-specific temp index dir
-        try {
-            log.debug("Merging local index of {} into {}.", localRepo, repo);
-            context.merge(repoToMergeIndexDir);
-            /*IndexWriter indexWriter = context.getIndexWriter();
-            indexWriter.addIndexes(new Directory[]{indexDir});
-            indexWriter.close();*/
-        } catch (FileNotFoundException e) {
-            //Merged-into directory is new - just copy instead of merging
-            log.debug("Target index directory is new: merging is skipped.");
-        }
-    }
-
-    StoringRepo getRepo() {
-        return repo;
-    }
-
-    void removeTempIndexFiles(File dir) {
-        if (dir != null) {
-            /**
-             * Remove indexing context and delete the created files in a proper manner
-             */
-            try {
-                closeIndexingContext(context, true);
-            } catch (Exception e) {
-                log.warn("Could not remove temporary index context '{}'.", context);
-            }
-            /**
-             * We have to delete the index dir ourselves because the nexus removal
-             *  tool deletes the files, but leaves the dir.
-             */
-            org.apache.commons.io.FileUtils.deleteQuietly(dir);
-        }
-    }
-
-    void createContext(File indexDir) throws IOException {
-        String repoKey = repo.getKey();
-        List<IndexCreator> indexCreators = new ArrayList<>(4);
-        indexCreators.add(new VfsMinimalArtifactInfoIndexCreator());
-        indexCreators.add(new VfsJarFileContentsIndexCreator());
-        indexCreators.add(new VfsMavenPluginArtifactInfoIndexCreator());
-        indexCreators.add(new VfsMavenArchetypeArtifactInfoIndexCreator());
-        ItemTree itemTree = new ItemTree(repo.getRepoPath(""));
-        JavaIOFileAdapter rootFile = new JavaIOFileAdapter(itemTree.getRootNode());
-        context = createIndexingContext(repoKey, repoKey, rootFile, indexDir, null, null, true, true, indexCreators);
-    }
-
-    private IndexPackingRequest newIndexPackingRequest(File outputFolder) {
-        IndexPackingRequest request = new IndexPackingRequest(context, outputFolder);
-        request.setCreateChecksumFiles(false);
-        request.setCreateIncrementalChunks(false);
-        //create new index format
-        request.setFormats(Arrays.asList(/*IndexPackingRequest.IndexFormat.FORMAT_LEGACY,*/
-                IndexPackingRequest.IndexFormat.FORMAT_V1));
-        return request;
-    }
-
-    private FSDirectory getIndexDir(StoringRepo repo, Map<StoringRepo, FSDirectory> extractedRepoIndexes)
-            throws Exception {
-        //Check if need to extract the local index first
-        FSDirectory indexDir = extractedRepoIndexes.get(repo);
-        if (indexDir == null) {
-            //Extraction required
-            NullRequestContext requestContext =
-                    new NullRequestContext(repo.getRepoPath(MavenNaming.NEXUS_INDEX_GZ_PATH));
-            RepoResource indexRes = repo.getInfo(requestContext);
-            if (!indexRes.isFound()) {
-                log.debug("Cannot find index resource for repository {}", repo);
-                return null;
-            }
-            //Copy the index file
-            try (ResourceStreamHandle handle = repo.getResourceStreamHandle(requestContext, indexRes)) {
-                ArtifactoryHome artifactoryHome = ContextHelper.get().getArtifactoryHome();
-                File indexUnzippedDir = Files.createRandomDir(artifactoryHome.getTempWorkDir(),
-                        "artifactory.merged-index." + repo.getKey());
-                indexUnzippedDir.deleteOnExit();
-                indexDir = FSDirectory.open(indexUnzippedDir);
-                //Get the extracted lucene dir
-                DefaultIndexUpdater.unpackIndexData(handle.getInputStream(), indexDir, context);
-            }
-            //Remember the extracted index
-            extractedRepoIndexes.put(repo, indexDir);
-        }
-        return indexDir;
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/maven/index/SimpleArtifactPackagingMapper.java b/backend/core/src/main/java/org/artifactory/maven/index/SimpleArtifactPackagingMapper.java
deleted file mode 100644
index 5d57bc6..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/index/SimpleArtifactPackagingMapper.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven.index;
-
-import org.apache.maven.index.artifact.ArtifactPackagingMapper;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Mapper from maven packaging type to file extension.
- * <p/>
- * Based on org.apache.maven.index.artifact.DefaultArtifactPackagingMapper
- *
- * @author Yossi Shaul
- */
-public class SimpleArtifactPackagingMapper implements ArtifactPackagingMapper {
-
-    private static final Map<String, String> defaults;
-
-    static {
-        defaults = new HashMap<>();
-        defaults.put("ejb-client", "jar");
-        defaults.put("ejb", "jar");
-        defaults.put("rar", "jar");
-        defaults.put("par", "jar");
-        defaults.put("maven-plugin", "jar");
-        defaults.put("maven-archetype", "jar");
-        defaults.put("plexus-application", "jar");
-        defaults.put("eclipse-plugin", "jar");
-        defaults.put("eclipse-feature", "jar");
-        defaults.put("eclipse-application", "zip");
-        defaults.put("java-source", "jar");
-        defaults.put("javadoc", "jar");
-        defaults.put("test-jar", "jar");
-    }
-
-    @Override
-    public String getExtensionForPackaging(String packaging) {
-        if (packaging == null) {
-            return "jar";
-        }
-
-        if (defaults.containsKey(packaging)) {
-            return defaults.get(packaging);
-        } else {
-            // default's to packaging name, ie. "jar", "war", "pom", etc.
-            return packaging;
-        }
-    }
-
-    @Override
-    public void setPropertiesFile(File propertiesFile) {
-        // support for  external configuration not implemented
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/maven/index/creator/VfsJarFileContentsIndexCreator.java b/backend/core/src/main/java/org/artifactory/maven/index/creator/VfsJarFileContentsIndexCreator.java
deleted file mode 100644
index ba5cce9..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/index/creator/VfsJarFileContentsIndexCreator.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * Copyright (c) 2007-2008 Sonatype, Inc. All rights reserved. This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License Version 1.0, which accompanies this distribution and is
- * available at http://www.eclipse.org/legal/epl-v10.html.
- */
-/*
- * Additional contributors:
- *    JFrog Ltd.
- */
-
-package org.artifactory.maven.index.creator;
-
-import org.apache.maven.index.ArtifactContext;
-import org.apache.maven.index.ArtifactInfo;
-import org.apache.maven.index.creator.JarFileContentsIndexCreator;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.fs.ZipEntryInfo;
-import org.artifactory.storage.fs.service.ArchiveEntriesService;
-import org.artifactory.storage.fs.tree.file.JavaIOFileAdapter;
-
-import java.io.IOException;
-import java.util.Set;
-
-/**
- * @author yoavl
- */
-public class VfsJarFileContentsIndexCreator extends JarFileContentsIndexCreator {
-
-    @Override
-    public void populateArtifactInfo(ArtifactContext artifactContext) throws IOException {
-        ArtifactInfo ai = artifactContext.getArtifactInfo();
-        JavaIOFileAdapter artifactFile = (JavaIOFileAdapter) artifactContext.getArtifact();
-
-        if (artifactFile != null && artifactFile.getName().endsWith(".jar")) {
-            updateArtifactInfo(ai, artifactFile);
-        }
-    }
-
-    private void updateArtifactInfo(ArtifactInfo ai, JavaIOFileAdapter file)
-            throws IOException {
-        ArchiveEntriesService entriesService = ContextHelper.get().beanForType(ArchiveEntriesService.class);
-        Set<ZipEntryInfo> archiveEntries = entriesService.getArchiveEntries(file.getFileInfo().getSha1());
-        StringBuilder sb = new StringBuilder();
-        for (ZipEntryInfo e : archiveEntries) {
-            String name = e.getName();
-            if (name.endsWith(".class")) {
-                // TODO verify if class is public or protected
-                // TODO skip all inner classes for now
-
-                int i = name.indexOf('$');
-
-                if (i == -1) {
-                    if (name.charAt(0) != '/') {
-                        sb.append('/');
-                    }
-
-                    // class name without ".class"
-                    sb.append(name.substring(0, name.length() - 6)).append('\n');
-                }
-            }
-        }
-
-        if (sb.toString().trim().length() != 0) {
-            ai.classNames = sb.toString();
-        } else {
-            ai.classNames = null;
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/maven/index/creator/VfsMavenArchetypeArtifactInfoIndexCreator.java b/backend/core/src/main/java/org/artifactory/maven/index/creator/VfsMavenArchetypeArtifactInfoIndexCreator.java
deleted file mode 100644
index cdb4910..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/index/creator/VfsMavenArchetypeArtifactInfoIndexCreator.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * Copyright (c) 2007-2008 Sonatype, Inc. All rights reserved. This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License Version 1.0, which accompanies this distribution and is
- * available at http://www.eclipse.org/legal/epl-v10.html.
- */
-/*
- * Additional contributors:
- *    JFrog Ltd.
- */
-
-package org.artifactory.maven.index.creator;
-
-import org.apache.maven.index.ArtifactContext;
-import org.apache.maven.index.ArtifactInfo;
-import org.apache.maven.index.creator.MavenArchetypeArtifactInfoIndexCreator;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.fs.ZipEntryInfo;
-import org.artifactory.storage.fs.service.ArchiveEntriesService;
-import org.artifactory.storage.fs.tree.file.JavaIOFileAdapter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Set;
-
-/**
- * @author yoavl
- */
-public class VfsMavenArchetypeArtifactInfoIndexCreator extends MavenArchetypeArtifactInfoIndexCreator {
-    private static final Logger log = LoggerFactory.getLogger(VfsMavenArchetypeArtifactInfoIndexCreator.class);
-
-    private static final String MAVEN_ARCHETYPE_PACKAGING = "maven-archetype";
-
-    private static final String[] ARCHETYPE_XML_LOCATIONS =
-            {"META-INF/maven/archetype.xml", "META-INF/archetype.xml", "META-INF/maven/archetype-metadata.xml"};
-
-    @Override
-    public void populateArtifactInfo(ArtifactContext ac) {
-        JavaIOFileAdapter artifact = (JavaIOFileAdapter) ac.getArtifact();
-
-        ArtifactInfo ai = ac.getArtifactInfo();
-
-        // we need the file to perform these checks, and those may be only JARs
-        if (artifact != null && !MAVEN_ARCHETYPE_PACKAGING.equals(ai.packaging)
-                && artifact.getName().endsWith(".jar")) {
-            // TODO: recheck, is the following true? "Maven plugins and Maven Archetypes can be only JARs?"
-
-            // check for maven archetype, since Archetypes seems to not have consistent packaging,
-            // and depending on the contents of the JAR, this call will override the packaging to "maven-archetype"!
-            checkMavenArchetype(ai, artifact);
-        }
-    }
-
-    /**
-     * Archetypes that are added will have their packaging types set correctly (to maven-archetype)
-     *
-     * @param ai
-     * @param artifact
-     */
-    private void checkMavenArchetype(ArtifactInfo ai, JavaIOFileAdapter artifact) {
-        try {
-            ArchiveEntriesService entriesService = ContextHelper.get().beanForType(ArchiveEntriesService.class);
-            Set<ZipEntryInfo> archiveEntries = entriesService.getArchiveEntries(artifact.getFileInfo().getSha1());
-            for (ZipEntryInfo archiveEntry : archiveEntries) {
-                for (String location : ARCHETYPE_XML_LOCATIONS) {
-                    if (location.equals(archiveEntry.getName())) {
-                        ai.packaging = MAVEN_ARCHETYPE_PACKAGING;
-                        return;
-                    }
-                }
-            }
-        } catch (Exception e) {
-            log.info("Failed to parse Maven artifact " + artifact.getAbsolutePath(), e.getMessage());
-            log.debug("Failed to parse Maven artifact " + artifact.getAbsolutePath(), e);
-        }
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/maven/index/creator/VfsMavenPluginArtifactInfoIndexCreator.java b/backend/core/src/main/java/org/artifactory/maven/index/creator/VfsMavenPluginArtifactInfoIndexCreator.java
deleted file mode 100644
index 8b404ff..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/index/creator/VfsMavenPluginArtifactInfoIndexCreator.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/**
- * Copyright (c) 2007-2008 Sonatype, Inc. All rights reserved. This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License Version 1.0, which accompanies this distribution and is
- * available at http://www.eclipse.org/legal/epl-v10.html.
- */
-/*
- * Additional contributors:
- *    JFrog Ltd.
- */
-
-package org.artifactory.maven.index.creator;
-
-import com.google.common.base.Charsets;
-import org.apache.commons.io.IOUtils;
-import org.apache.maven.index.ArtifactContext;
-import org.apache.maven.index.ArtifactInfo;
-import org.apache.maven.index.creator.MavenPluginArtifactInfoIndexCreator;
-import org.artifactory.storage.fs.tree.file.JavaIOFileAdapter;
-import org.codehaus.plexus.configuration.PlexusConfiguration;
-import org.codehaus.plexus.configuration.PlexusConfigurationException;
-import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration;
-import org.codehaus.plexus.util.xml.Xpp3DomBuilder;
-import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-
-/**
- * @author yoavl
- */
-public class VfsMavenPluginArtifactInfoIndexCreator extends MavenPluginArtifactInfoIndexCreator {
-    private static final Logger log = LoggerFactory.getLogger(VfsMavenPluginArtifactInfoIndexCreator.class);
-
-    private static final String MAVEN_PLUGIN_PACKAGING = "maven-plugin";
-
-    @Override
-    public void populateArtifactInfo(ArtifactContext ac) {
-        File artifact = ac.getArtifact();
-
-        ArtifactInfo ai = ac.getArtifactInfo();
-
-        // we need the file to perform these checks, and those may be only JARs
-        if (artifact != null && MAVEN_PLUGIN_PACKAGING.equals(ai.packaging) && artifact.getName().endsWith(".jar")) {
-            // TODO: recheck, is the following true? "Maven plugins and Maven Archetypes can be only JARs?"
-
-            // 1st, check for maven plugin
-            checkMavenPlugin(ai, (JavaIOFileAdapter) artifact);
-        }
-    }
-
-    private void checkMavenPlugin(ArtifactInfo ai, JavaIOFileAdapter artifact) {
-        ZipInputStream zis = null;
-        InputStream is = null;
-        try {
-            is = artifact.getStream();
-            zis = new ZipInputStream(is);
-            ZipEntry currentEntry;
-            while ((currentEntry = zis.getNextEntry()) != null) {
-                if (currentEntry.getName().equals("META-INF/maven/plugin.xml")) {
-                    parsePluginDetails(ai, zis);
-                    break;
-                }
-            }
-        } catch (Exception e) {
-            log.info("Failed to parsing Maven plugin " + artifact.getAbsolutePath(), e.getMessage());
-            log.debug("Failed to parsing Maven plugin " + artifact.getAbsolutePath(), e);
-        } finally {
-            IOUtils.closeQuietly(is);
-            IOUtils.closeQuietly(zis);
-        }
-    }
-
-    private void parsePluginDetails(ArtifactInfo ai, ZipInputStream zis)
-            throws XmlPullParserException, IOException, PlexusConfigurationException {
-        PlexusConfiguration plexusConfig =
-                new XmlPlexusConfiguration(Xpp3DomBuilder.build(new InputStreamReader(zis, Charsets.UTF_8)));
-
-        ai.prefix = plexusConfig.getChild("goalPrefix").getValue();
-        ai.goals = new ArrayList<>();
-        PlexusConfiguration[] mojoConfigs = plexusConfig.getChild("mojos").getChildren("mojo");
-        for (PlexusConfiguration mojoConfig : mojoConfigs) {
-            ai.goals.add(mojoConfig.getChild("goal").getValue());
-        }
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/maven/index/creator/VfsMinimalArtifactInfoIndexCreator.java b/backend/core/src/main/java/org/artifactory/maven/index/creator/VfsMinimalArtifactInfoIndexCreator.java
deleted file mode 100644
index 1f7dcd1..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/index/creator/VfsMinimalArtifactInfoIndexCreator.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/**
- * Copyright (c) 2007-2008 Sonatype, Inc. All rights reserved. This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License Version 1.0, which accompanies this distribution and is
- * available at http://www.eclipse.org/legal/epl-v10.html.
- */
-/*
- * Additional contributors:
- *    JFrog Ltd.
- */
-
-package org.artifactory.maven.index.creator;
-
-import org.apache.maven.index.ArtifactAvailablility;
-import org.apache.maven.index.ArtifactContext;
-import org.apache.maven.index.ArtifactInfo;
-import org.apache.maven.index.artifact.Gav;
-import org.apache.maven.index.creator.MinimalArtifactInfoIndexCreator;
-import org.apache.maven.index.locator.Locator;
-import org.apache.maven.model.Model;
-import org.artifactory.maven.index.locator.ExtensionBasedLocator;
-import org.artifactory.schedule.TaskService;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.storage.fs.tree.file.JavaIOFileAdapter;
-import org.codehaus.plexus.util.FileUtils;
-import org.codehaus.plexus.util.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-
-public class VfsMinimalArtifactInfoIndexCreator extends MinimalArtifactInfoIndexCreator {
-    private static final Logger log = LoggerFactory.getLogger(VfsMinimalArtifactInfoIndexCreator.class);
-
-    private final Locator jl;
-    private final Locator sl;
-    private final Locator sigl;
-
-    public VfsMinimalArtifactInfoIndexCreator() {
-        this.jl = new ExtensionBasedLocator("-javadoc.jar");
-        this.sl = new ExtensionBasedLocator("-sources.jar");
-        this.sigl = new ExtensionBasedLocator(".jar.asc");
-    }
-
-    @SuppressWarnings({"OverlyComplexMethod"})
-    @Override
-    public void populateArtifactInfo(ArtifactContext ac) {
-        //Test whether the indexer needs to be stopped or paused
-        //Check if we need to stop/suspend
-        TaskService taskService = InternalContextHelper.get().getTaskService();
-        boolean stop = taskService.pauseOrBreak();
-        if (stop) {
-            return;
-        }
-        //Populating the artifact info
-        File artifact = ac.getArtifact();
-        File pom = ac.getPom();
-        ArtifactInfo ai = ac.getArtifactInfo();
-
-        if (pom != null) {
-            ai.lastModified = pom.lastModified();
-
-            ai.fextension = "pom";
-        }
-
-        // TODO handle artifacts without poms
-        if (pom != null) {
-            if (ai.classifier != null) {
-                ai.sourcesExists = ArtifactAvailablility.NOT_AVAILABLE;
-
-                ai.javadocExists = ArtifactAvailablility.NOT_AVAILABLE;
-            } else {
-                File sources = sl.locate(pom);
-                if (!sources.exists()) {
-                    ai.sourcesExists = ArtifactAvailablility.NOT_PRESENT;
-                } else {
-                    ai.sourcesExists = ArtifactAvailablility.PRESENT;
-                }
-
-                File javadoc = jl.locate(pom);
-                if (!javadoc.exists()) {
-                    ai.javadocExists = ArtifactAvailablility.NOT_PRESENT;
-                } else {
-                    ai.javadocExists = ArtifactAvailablility.PRESENT;
-                }
-            }
-        }
-
-        if (artifact != null) {
-            File signature = sigl.locate(artifact);
-
-            ai.signatureExists = signature.exists() ? ArtifactAvailablility.PRESENT : ArtifactAvailablility.NOT_PRESENT;
-
-            try {
-                String sha1 = ((JavaIOFileAdapter) artifact).getFileInfo().getSha1();
-                if (sha1 != null) {
-                    ai.sha1 = StringUtils.chomp(sha1).trim().split(" ")[0];
-                }
-            } catch (Exception e) {
-                ac.addError(e);
-                if (log.isDebugEnabled()) {
-                    log.debug("Could not retrieve artifact checksum.", e);
-                } else {
-                    String msg = e.getCause() != null ? e.getCause().getMessage() : e.getMessage();
-                    log.warn("Could not retrieve artifact checksum" + (msg != null ? ": " + msg : "") + ".");
-                }
-            }
-
-            ai.lastModified = artifact.lastModified();
-
-            ai.size = artifact.length();
-
-            ai.fextension = getExtension(artifact, ac.getGav());
-
-            if (ai.packaging == null) {
-                ai.packaging = ai.fextension;
-            }
-        }
-
-        Model model = ac.getPomModel();
-
-        if (model != null) {
-            ai.name = model.getName();
-
-            ai.description = model.getDescription();
-
-            if (model.getPackaging() != null && ai.classifier == null) {
-                // only when this is not a classified artifact
-                ai.packaging = model.getPackaging();
-            }
-        }
-    }
-
-    private String getExtension(File artifact, Gav gav) {
-        if (gav != null && StringUtils.isNotBlank(gav.getExtension())) {
-            return gav.getExtension();
-        }
-
-        // last resort, the extension of the file
-        String artifactFileName = artifact.getName().toLowerCase();
-
-        // tar.gz? and other "special" combinations
-        if (artifactFileName.endsWith("tar.gz")) {
-            return "tar.gz";
-        } else if (artifactFileName.equals("tar.bz2")) {
-            return "tar.bz2";
-        }
-
-        // get the part after the last dot
-        return FileUtils.getExtension(artifactFileName);
-    }
-
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/maven/index/locator/ArtifactoryLocator.java b/backend/core/src/main/java/org/artifactory/maven/index/locator/ArtifactoryLocator.java
deleted file mode 100644
index af93a46..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/index/locator/ArtifactoryLocator.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * Copyright (c) 2007-2008 Sonatype, Inc. All rights reserved.
- *
- * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0,
- * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html.
- */
-/*
- * Additional contributors:
- *    JFrog Ltd.
- */
-
-package org.artifactory.maven.index.locator;
-
-import org.apache.maven.index.locator.Locator;
-
-/**
- * @author freds
- * @date Oct 24, 2008
- */
-public abstract class ArtifactoryLocator implements Locator {
-
-}
diff --git a/backend/core/src/main/java/org/artifactory/maven/index/locator/ExtensionBasedLocator.java b/backend/core/src/main/java/org/artifactory/maven/index/locator/ExtensionBasedLocator.java
deleted file mode 100644
index 876b9ec..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/index/locator/ExtensionBasedLocator.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven.index.locator;
-
-import org.artifactory.storage.fs.tree.file.JavaIOFileAdapter;
-import org.artifactory.util.PathUtils;
-
-import java.io.File;
-
-/**
- * @author freds
- * @date Oct 24, 2008
- */
-public final class ExtensionBasedLocator extends ArtifactoryLocator {
-    private final String expectedExtension;
-
-    public ExtensionBasedLocator(String expectedExtension) {
-        this.expectedExtension = expectedExtension;
-    }
-
-    @Override
-    public File locate(File source) {
-        String sourcePath = source.getAbsolutePath();
-        String targetPath = PathUtils.stripExtension(sourcePath) + expectedExtension;
-        File target = ((JavaIOFileAdapter) source).getSibling(targetPath);
-        if (target == null) {
-            //Cannot return null - return non existing file
-            target = new File(targetPath) {
-                @Override
-                public boolean exists() {
-                    return false;
-                }
-            };
-        }
-        return target;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/maven/index/locator/MainArtifactLocator.java b/backend/core/src/main/java/org/artifactory/maven/index/locator/MainArtifactLocator.java
deleted file mode 100644
index bf71f32..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/index/locator/MainArtifactLocator.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven.index.locator;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.maven.index.ArtifactContext;
-import org.apache.maven.index.artifact.ArtifactPackagingMapper;
-import org.apache.maven.index.artifact.Gav;
-import org.apache.maven.index.artifact.GavCalculator;
-import org.apache.maven.index.locator.GavHelpedLocator;
-import org.apache.maven.model.Model;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-import org.artifactory.storage.fs.tree.ItemNode;
-import org.artifactory.storage.fs.tree.ItemTree;
-import org.artifactory.storage.fs.tree.file.JavaIOFileAdapter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.InputStream;
-
-/**
- * Locates the main artifact based on the data from the pom file.
- *
- * @author Yossi Shaul
- */
-public class MainArtifactLocator implements GavHelpedLocator {
-    private static final Logger log = LoggerFactory.getLogger(MainArtifactLocator.class);
-
-    private final ArtifactPackagingMapper mapper;
-
-    public MainArtifactLocator(ArtifactPackagingMapper mapper) {
-        this.mapper = mapper;
-    }
-
-    @Override
-    public File locate(File source, GavCalculator gavCalculator, Gav gav) {
-        // if we don't have this data, nothing we can do
-        if (source == null || !source.exists() || gav == null || gav.getArtifactId() == null
-                || gav.getVersion() == null) {
-            return null;
-        }
-
-        InputStream pomInputStream = null;
-        try {
-            // need to read the pom model to get packaging
-            JavaIOFileAdapter sourceAdapter = (JavaIOFileAdapter) source;
-            pomInputStream = new BufferedInputStream(sourceAdapter.getStream());
-            Model model = new ArtifactContext.ModelReader().readModel(pomInputStream);
-
-            if (model == null) {
-                return null;
-            }
-
-            // now generate the artifact name
-            String artifactName = gav.getArtifactId() + "-" + gav.getVersion() + "."
-                    + mapper.getExtensionForPackaging(model.getPackaging());
-
-            RepoPathImpl artifactRepoPath = new RepoPathImpl(sourceAdapter.getRepoPath().getParent(), artifactName);
-            ItemTree itemTree = new ItemTree(artifactRepoPath);
-            ItemNode mainArtifactNode = itemTree.getRootNode();
-            if (mainArtifactNode == null) {
-                return null;
-            } else {
-                return new JavaIOFileAdapter(mainArtifactNode);
-            }
-        } catch (RepositoryRuntimeException e) {
-            log.debug("Failed to read locate main artifact", e);
-            return null;
-        } finally {
-            IOUtils.closeQuietly(pomInputStream);
-        }
-    }
-
-}
diff --git a/backend/core/src/main/java/org/artifactory/maven/index/locator/MetadataLocator.java b/backend/core/src/main/java/org/artifactory/maven/index/locator/MetadataLocator.java
deleted file mode 100644
index e094549..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/index/locator/MetadataLocator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * Copyright (c) 2007-2008 Sonatype, Inc. All rights reserved.
- *
- * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0,
- * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html.
- */
-/*
- * Additional contributors:
- *    JFrog Ltd.
- */
-
-package org.artifactory.maven.index.locator;
-
-import org.apache.maven.index.locator.Locator;
-
-import java.io.File;
-
-/**
- * @author yoavl
- */
-public class MetadataLocator implements Locator {
-
-    @Override
-    public File locate(File source) {
-        //We never locate metadata
-        //return new File(source.getParentFile().getParentFile() - may throw NPE, "maven-metadata.xml") {
-        return new File("", "maven-metadata.xml") {
-            @Override
-            public boolean exists() {
-                return false;
-            }
-        };
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/maven/index/locator/PomLocator.java b/backend/core/src/main/java/org/artifactory/maven/index/locator/PomLocator.java
deleted file mode 100644
index 394c9f5..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/index/locator/PomLocator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * Copyright (c) 2007-2008 Sonatype, Inc. All rights reserved.
- *
- * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0,
- * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html.
- */
-/*
- * Additional contributors:
- *    JFrog Ltd.
- */
-
-package org.artifactory.maven.index.locator;
-
-import org.apache.maven.index.artifact.Gav;
-import org.apache.maven.index.artifact.GavCalculator;
-import org.apache.maven.index.locator.GavHelpedLocator;
-import org.artifactory.storage.fs.tree.file.JavaIOFileAdapter;
-
-import java.io.File;
-
-/**
- * @author yoavl
- */
-public class PomLocator implements GavHelpedLocator {
-
-    @Override
-    public File locate(File source, GavCalculator gavCalculator, Gav gav) {
-        // build the pom name
-        String artifactName = gav.getArtifactId() + "-" + gav.getVersion() + ".pom";
-        // search sibling pom
-        JavaIOFileAdapter file = (JavaIOFileAdapter) source;
-        return file.getSibling(artifactName);
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/maven/snapshot/BuildNumberSnapshotComparator.java b/backend/core/src/main/java/org/artifactory/maven/snapshot/BuildNumberSnapshotComparator.java
deleted file mode 100644
index 44c7ba2..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/snapshot/BuildNumberSnapshotComparator.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.artifactory.maven.snapshot;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.maven.artifact.repository.metadata.Snapshot;
-import org.apache.maven.artifact.repository.metadata.SnapshotVersion;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.storage.fs.tree.ItemNode;
-
-/**
- * @author Gidi Shabat
- */
-public class BuildNumberSnapshotComparator implements SnapshotComparator {
-
-    private static final BuildNumberSnapshotComparator instance = new BuildNumberSnapshotComparator();
-
-    /**
-     * The more specific, strings only version comparator
-     */
-
-    public static BuildNumberSnapshotComparator get() {
-        return instance;
-    }
-
-    @Override
-    public int compare(ItemNode o1, ItemNode o2) {
-        int buildNumber1 = MavenNaming.getUniqueSnapshotVersionBuildNumber(o1.getName());
-        int buildNumber2 = MavenNaming.getUniqueSnapshotVersionBuildNumber(o2.getName());
-        return buildNumber1 - buildNumber2;
-    }
-
-    @Override
-    public int compare(Snapshot o1, Snapshot o2) {
-        int buildNumber1 = o1.getBuildNumber();
-        int buildNumber2 = o2.getBuildNumber();
-        return buildNumber1 - buildNumber2;
-    }
-
-    @Override
-    public int compare(SnapshotVersion o1, SnapshotVersion o2) {
-        int buildNumber1 = Integer.valueOf(StringUtils.substringAfterLast(o1.getVersion(), "-"));
-        int buildNumber2 = Integer.valueOf(StringUtils.substringAfterLast(o2.getVersion(), "-"));
-        return buildNumber1 - buildNumber2;
-    }
-
-    @Override
-    public int compare(ModuleInfo folderItemModuleInfo, ModuleInfo latestSnapshotVersion) {
-        int folderItemBuildNumber = Integer.parseInt(StringUtils.substringAfter(
-                folderItemModuleInfo.getFileIntegrationRevision(), "-"));
-        int latestSnapshotVersionBuildNumber = Integer.parseInt(StringUtils.substringAfter(
-                latestSnapshotVersion.getFileIntegrationRevision(), "-"));
-        return folderItemBuildNumber - latestSnapshotVersionBuildNumber;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/maven/snapshot/SnapshotComparator.java b/backend/core/src/main/java/org/artifactory/maven/snapshot/SnapshotComparator.java
deleted file mode 100644
index fa921cb..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/snapshot/SnapshotComparator.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.artifactory.maven.snapshot;
-
-import org.apache.maven.artifact.repository.metadata.Snapshot;
-import org.apache.maven.artifact.repository.metadata.SnapshotVersion;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.storage.fs.tree.ItemNode;
-
-import java.util.Comparator;
-
-/**
- * @author Gidi Shabat
- */
-public interface SnapshotComparator extends Comparator<ItemNode> {
-
-    int compare(Snapshot o1, Snapshot o2);
-
-    int compare(SnapshotVersion o1, SnapshotVersion o2);
-
-    int compare(ModuleInfo folderItemModuleInfo, ModuleInfo latestSnapshotVersion);
-}
diff --git a/backend/core/src/main/java/org/artifactory/maven/snapshot/TimestampSnapshotComparator.java b/backend/core/src/main/java/org/artifactory/maven/snapshot/TimestampSnapshotComparator.java
deleted file mode 100644
index 0a039fc..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/snapshot/TimestampSnapshotComparator.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.artifactory.maven.snapshot;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.maven.artifact.repository.metadata.Snapshot;
-import org.apache.maven.artifact.repository.metadata.SnapshotVersion;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.maven.MavenModelUtils;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.storage.fs.tree.ItemNode;
-
-/**
- * @author Gidi Shabat
- */
- at SuppressWarnings("UnusedDeclaration")
-public class TimestampSnapshotComparator implements SnapshotComparator {
-
-    private static final TimestampSnapshotComparator instance = new TimestampSnapshotComparator();
-
-    /**
-     * The more specific, strings only version comparator
-     */
-
-    public static TimestampSnapshotComparator get() {
-        return instance;
-    }
-
-    @Override
-    public int compare(ItemNode o1, ItemNode o2) {
-        String snapshot1 = MavenNaming.getUniqueSnapshotVersionTimestamp(o1.getName());
-        String snapshot2 = MavenNaming.getUniqueSnapshotVersionTimestamp(o2.getName());
-        long time1 = MavenModelUtils.uniqueSnapshotTimestampToDate(snapshot1).getTime();
-        long time2 = MavenModelUtils.uniqueSnapshotTimestampToDate(snapshot2).getTime();
-        long dif = time1 - time2;
-        return dif > 0 ? 1 : dif < 0 ? -1 : 0;
-    }
-
-    @Override
-    public int compare(Snapshot o1, Snapshot o2) {
-        long time1 = MavenModelUtils.uniqueSnapshotTimestampToDate(o1.getTimestamp()).getTime();
-        long time2 = MavenModelUtils.uniqueSnapshotTimestampToDate(o2.getTimestamp()).getTime();
-        long dif = time1 - time2;
-        return dif > 0 ? 1 : dif < 0 ? -1 : 0;
-    }
-
-    @Override
-    public int compare(SnapshotVersion o1, SnapshotVersion o2) {
-        String version1 = o1.getVersion();
-        String timestamp1 = version1.substring(version1.indexOf('-') + 1, version1.lastIndexOf('-'));
-        String version2 = o2.getVersion();
-        String timestamp2 = version2.substring(version2.indexOf('-') + 1, version2.lastIndexOf('-'));
-        long time1 = MavenModelUtils.uniqueSnapshotTimestampToDate(timestamp1).getTime();
-        long time2 = MavenModelUtils.uniqueSnapshotTimestampToDate(timestamp2).getTime();
-        long dif = time1 - time2;
-        return dif > 0 ? 1 : dif < 0 ? -1 : 0;
-    }
-
-    @Override
-    public int compare(ModuleInfo o1, ModuleInfo o2) {
-        String version1 = o1.getFileIntegrationRevision();
-        String timestamp1 = version1.substring(0, version1.lastIndexOf('-'));
-        String version2 = o2.getFileIntegrationRevision();
-        String timestamp2 = version2.substring(0, version2.lastIndexOf('-'));
-        long time1 = MavenModelUtils.uniqueSnapshotTimestampToDate(timestamp1).getTime();
-        long time2 = MavenModelUtils.uniqueSnapshotTimestampToDate(timestamp2).getTime();
-        long dif = time1 - time2;
-        return dif > 0 ? 1 : dif < 0 ? -1 : 0;
-
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/maven/versioning/CreationDateMavenMetadataVersionComparator.java b/backend/core/src/main/java/org/artifactory/maven/versioning/CreationDateMavenMetadataVersionComparator.java
deleted file mode 100644
index 9a524e3..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/versioning/CreationDateMavenMetadataVersionComparator.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven.versioning;
-
-import org.artifactory.storage.fs.tree.ItemNode;
-
-/**
- * A {@link MavenMetadataVersionComparator} that determines the latest and release versions based on the directory
- * creation date.
- *
- * @author Yossi Shaul
- */
-public class CreationDateMavenMetadataVersionComparator implements MavenMetadataVersionComparator {
-    @Override
-    public int compare(ItemNode o1, ItemNode o2) {
-        long o1Created = o1.getItemInfo().getCreated();
-        long o2Created = o2.getItemInfo().getCreated();
-        return (o1Created < o2Created ? -1 : (o1Created == o2Created ? 0 : 1));
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/maven/versioning/MavenMetadataVersionComparator.java b/backend/core/src/main/java/org/artifactory/maven/versioning/MavenMetadataVersionComparator.java
deleted file mode 100644
index 6925ccf..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/versioning/MavenMetadataVersionComparator.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven.versioning;
-
-import org.artifactory.storage.fs.tree.ItemNode;
-
-import java.io.Serializable;
-import java.util.Comparator;
-
-/**
- * A comparator for maven metadata version sorting. Implementers must have an empty constructor.
- *
- * @author Yossi Shaul
- */
-public interface MavenMetadataVersionComparator extends Comparator<ItemNode>, Serializable {
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/maven/versioning/MavenVersionComparator.java b/backend/core/src/main/java/org/artifactory/maven/versioning/MavenVersionComparator.java
deleted file mode 100644
index 0aecc3d..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/versioning/MavenVersionComparator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven.versioning;
-
-import org.codehaus.mojo.versions.ordering.VersionComparators;
-
-import java.util.Comparator;
-
-/**
- * Compares two version strings.
- *
- * @author Yossi Shaul
- */
-public class MavenVersionComparator implements Comparator<String> {
-    /**
-     * The actual comparator
-     */
-    private final org.codehaus.mojo.versions.ordering.VersionComparator comparator =
-            VersionComparators.getVersionComparator("mercury");
-
-    @Override
-    @SuppressWarnings({"unchecked"})
-    public int compare(String v1, String v2) {
-        return comparator.compare(v1, v2);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/maven/versioning/VersionNameMavenMetadataVersionComparator.java b/backend/core/src/main/java/org/artifactory/maven/versioning/VersionNameMavenMetadataVersionComparator.java
deleted file mode 100644
index 7d8a173..0000000
--- a/backend/core/src/main/java/org/artifactory/maven/versioning/VersionNameMavenMetadataVersionComparator.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven.versioning;
-
-import org.artifactory.storage.fs.tree.ItemNode;
-
-/**
- * A {@link MavenMetadataVersionComparator} that determines the latest and release versions based on a versions comparator.
- *
- * @author Yossi Shaul
- */
-public class VersionNameMavenMetadataVersionComparator implements MavenMetadataVersionComparator {
-
-    private static final VersionNameMavenMetadataVersionComparator instance =
-            new VersionNameMavenMetadataVersionComparator();
-
-    /**
-     * The more specific, strings only version comparator
-     */
-    private final MavenVersionComparator comparator = new MavenVersionComparator();
-
-    @Override
-    public int compare(ItemNode o1, ItemNode o2) {
-        return comparator.compare(o1.getName(), o2.getName());
-    }
-
-    public static VersionNameMavenMetadataVersionComparator get() {
-        return instance;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/message/ArtifactoryUpdatesServiceImpl.java b/backend/core/src/main/java/org/artifactory/message/ArtifactoryUpdatesServiceImpl.java
deleted file mode 100644
index 6ab002b..0000000
--- a/backend/core/src/main/java/org/artifactory/message/ArtifactoryUpdatesServiceImpl.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.message;
-
-import com.google.common.base.Charsets;
-import com.google.common.cache.CacheBuilder;
-import org.apache.commons.codec.binary.Base64;
-import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.util.EntityUtils;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.message.ArtifactoryUpdatesService;
-import org.artifactory.api.message.Message;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.util.HttpClientConfigurator;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.io.IOException;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-/**
- * @author Yoav Aharoni
- */
- at Service
-public class ArtifactoryUpdatesServiceImpl implements ArtifactoryUpdatesService {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryUpdatesServiceImpl.class);
-    private static final String MESSAGE_CACHE_KEY = "message";
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    private Map<String, Message> cache =
-            CacheBuilder.newBuilder().initialCapacity(1).
-                    expireAfterWrite(ConstantValues.artifactoryUpdatesRefreshIntervalSecs.getLong(),
-                            TimeUnit.SECONDS).<String, Message>build().asMap();
-
-    @Override
-    public void fetchMessage() {
-        if (ConstantValues.versionQueryEnabled.getBoolean() && !centralConfigService.getDescriptor().isOfflineMode()) {
-            final Message message = getRemoteMessage();
-            cache.put(MESSAGE_CACHE_KEY, message);
-        }
-    }
-
-    @Override
-    public Message getCachedMessage() {
-        return cache.get(MESSAGE_CACHE_KEY);
-    }
-
-    @Override
-    public Message getMessage() {
-        Message message = getCachedMessage();
-        if (ConstantValues.versionQueryEnabled.getBoolean() && !cache.containsKey(MESSAGE_CACHE_KEY)) {
-            cache.put(MESSAGE_CACHE_KEY, PROCESSING_MESSAGE);
-            ContextHelper.get().beanForType(ArtifactoryUpdatesService.class).fetchMessage();
-        }
-        return message;
-    }
-
-    private Message getRemoteMessage() {
-        final String url = ConstantValues.artifactoryUpdatesUrl.getString();
-        HttpGet getMethod = new HttpGet(url);
-        try (CloseableHttpClient client = createHTTPClient();
-             CloseableHttpResponse response = client.execute(getMethod)) {
-            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
-                final String body = messageBody(response);
-                final String id = messageId(body);
-                return new Message(id, body);
-            }
-            log.debug("Tried fetching message from '{}' and got status {}", url,
-                    response.getStatusLine().getStatusCode());
-        } catch (IOException e) {
-            log.debug(String.format("Exception while fetching message from '%s' ", url), e);
-        }
-        return ERROR_MESSAGE;
-    }
-
-    /**
-     * Generate unique message id.
-     *
-     * @param body message body
-     * @return unique message id
-     */
-    private String messageId(String body) {
-        return new String(Base64.encodeBase64(DigestUtils.md5(body)), Charsets.UTF_8)
-                .replaceAll("=", "").replaceAll("\\+", "-").replaceAll("/", "_");
-    }
-
-    private String messageBody(HttpResponse response) throws IOException {
-        String body = EntityUtils.toString(response.getEntity());
-        return StringUtils.defaultString(body);
-    }
-
-    private CloseableHttpClient createHTTPClient() {
-        ProxyDescriptor proxy = InternalContextHelper.get().getCentralConfig().getDescriptor().getDefaultProxy();
-
-        return new HttpClientConfigurator()
-                .soTimeout(5000)
-                .connectionTimeout(2000)
-                .retry(0, false)
-                .proxy(proxy)
-                .getClient();
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/post/TimeRandomizer.java b/backend/core/src/main/java/org/artifactory/post/TimeRandomizer.java
deleted file mode 100644
index a6aa322..0000000
--- a/backend/core/src/main/java/org/artifactory/post/TimeRandomizer.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.post;
-
-import java.util.concurrent.ThreadLocalRandom;
-
-/**
- * @author Michael Pasternak
- */
-public class TimeRandomizer {
-    /**
-     * @return random minute of day (0-59)
-     */
-    public static int randomMinute() {
-        return ThreadLocalRandom.current().nextInt(0, 60);
-    }
-
-    /**
-     * @return random hour of day (0-23)
-     */
-    public static int randomHour() {
-        return ThreadLocalRandom.current().nextInt(0, 24);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/post/jobs/CallHomeJob.java b/backend/core/src/main/java/org/artifactory/post/jobs/CallHomeJob.java
deleted file mode 100644
index f90891f..0000000
--- a/backend/core/src/main/java/org/artifactory/post/jobs/CallHomeJob.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.post.jobs;
-
-import com.google.common.base.Strings;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.cron.CronUtils;
-import org.artifactory.post.TimeRandomizer;
-import org.artifactory.post.services.CallHomeService;
-import org.artifactory.schedule.JobCommand;
-import org.artifactory.schedule.TaskUser;
-import org.artifactory.schedule.quartz.QuartzCommand;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-
-/**
- * A job to trigger CallHome request.
- *
- * @author Michael Pasternak
- */
- at JobCommand(description = "Artifactory Version Checker",
-        singleton = true, runOnlyOnPrimary = false, schedulerUser = TaskUser.SYSTEM, manualUser = TaskUser.SYSTEM)
-public class CallHomeJob extends QuartzCommand {
-    private static final Logger log = LoggerFactory.getLogger(CallHomeJob.class);
-
-    @Override
-    protected void onExecute(JobExecutionContext callbackContext) throws JobExecutionException {
-        log.debug("CallHome job started");
-        ArtifactoryContext artifactoryContext = ContextHelper.get();
-        CallHomeService callHomeService = artifactoryContext.beanForType(CallHomeService.class);
-        callHomeService.callHome();
-        log.debug("CallHome job finished");
-    }
-
-    /**
-     * To lower load on bintray we produce random execution time
-     * (every Sunday at random time)
-     *
-     * @return Quartz scheduling expression
-     */
-    public static String buildRandomQuartzExp() {
-        String predefinedExp = ConstantValues.callHomeCron.getString();
-        if(!Strings.isNullOrEmpty(predefinedExp)) {
-            if(CronUtils.isValid(predefinedExp))
-                return predefinedExp;
-            log.warn(
-                    "Specified CallHomeJob quartz expression '" + predefinedExp +
-                        "' is not valid, using default ..."
-            );
-        }
-        return String.format(
-                "0 %d %d ? * SUN",
-                TimeRandomizer.randomMinute(),
-                TimeRandomizer.randomHour()
-        );
-    }
-}
-
diff --git a/backend/core/src/main/java/org/artifactory/post/providers/features/CallHomeFeature.java b/backend/core/src/main/java/org/artifactory/post/providers/features/CallHomeFeature.java
deleted file mode 100644
index eaf4b2a..0000000
--- a/backend/core/src/main/java/org/artifactory/post/providers/features/CallHomeFeature.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.artifactory.post.providers.features;
-
-import org.artifactory.api.callhome.FeatureGroup;
-
-/**
- * This is an interface that should be implemented by any class that represent a feature
- * (e.g. repositories feature, security feature etc..)
- * <p>
- *
- * @author Shay Bagants
- */
-public interface CallHomeFeature {
-
-    FeatureGroup getFeature();
-}
diff --git a/backend/core/src/main/java/org/artifactory/post/providers/features/RepositoriesFeature.java b/backend/core/src/main/java/org/artifactory/post/providers/features/RepositoriesFeature.java
deleted file mode 100644
index a96b013..0000000
--- a/backend/core/src/main/java/org/artifactory/post/providers/features/RepositoriesFeature.java
+++ /dev/null
@@ -1,159 +0,0 @@
-package org.artifactory.post.providers.features;
-
-import org.artifactory.api.callhome.FeatureGroup;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.replication.RemoteReplicationDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.repo.RealRepo;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.repo.virtual.VirtualRepo;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * This class represent the repositories feature group of the CallHome feature
- *
- * @author Shay Bagants
- */
- at Component
-public class RepositoriesFeature implements CallHomeFeature {
-
-    @Autowired
-    private CentralConfigService configService;
-
-    @Autowired
-    private InternalRepositoryService repoService;
-
-    @Override
-    public FeatureGroup getFeature() {
-
-        FeatureGroup repositoriesFeature = new FeatureGroup("repositories");
-        FeatureGroup localRepositoriesFeature = new FeatureGroup("local repositories");
-        FeatureGroup remoteRepositoriesFeature = new FeatureGroup("remote repositories");
-        List<RealRepo> localAndRemoteRepositories = repoService.getLocalAndRemoteRepositories();
-        localAndRemoteRepositories.stream().forEach(rr -> {
-            if(rr.isLocal()) {
-                addLocalRepoFeatures(localRepositoriesFeature, rr);
-
-            } else {
-                addRemoteRepoFeatures(remoteRepositoriesFeature, rr);
-
-            }
-        });
-
-        long localCount = localAndRemoteRepositories.parallelStream().filter(r -> r.isLocal()).count();
-        localRepositoriesFeature.addFeatureAttribute("number_of_repositories", localCount);
-        remoteRepositoriesFeature.addFeatureAttribute("number_of_repositories", localAndRemoteRepositories.size()-localCount);
-
-        repositoriesFeature.addFeature(localRepositoriesFeature);
-        repositoriesFeature.addFeature(remoteRepositoriesFeature);
-
-        // virtual repos
-        FeatureGroup virtualRepositoriesFeature = new FeatureGroup("virtual repositories");
-        List<VirtualRepo> virtualRepositories = repoService.getVirtualRepositories();
-        virtualRepositoriesFeature.addFeatureAttribute("number_of_repositories", getVirtualReposSize(virtualRepositories));
-        addVirtualRepoFeatures(virtualRepositoriesFeature, virtualRepositories);
-        repositoriesFeature.addFeature(virtualRepositoriesFeature);
-
-        return repositoriesFeature;
-    }
-
-    /**
-     * Collects virtual repo metadata  {@see RTFACT-8412}
-     *
-     * @param localRepositoriesFeature
-     * @param localRepo
-     */
-    private void addLocalRepoFeatures(FeatureGroup localRepositoriesFeature, final RealRepo localRepo) {
-        // local repos
-        localRepositoriesFeature.addFeature(new FeatureGroup(localRepo.getKey()) {{
-            addFeatureAttribute("package_type", localRepo.getDescriptor().getType().name());
-            addFeatureAttribute("repository_layout",
-                    localRepo.getDescriptor().getRepoLayout().getName());
-
-            LocalReplicationDescriptor localReplication =
-                    configService.getDescriptor().getEnabledLocalReplication(localRepo.getKey());
-
-            if (localReplication != null && localReplication.isEnabled()) {
-                List<LocalReplicationDescriptor> repls =
-                        configService.getDescriptor().getMultiLocalReplications(localRepo.getKey());
-                addFeatureAttribute("push_replication", (repls == null || repls.size() == 0 ? false :
-                        repls.size() > 1 ? "multi" : "true"));
-                addFeatureAttribute("event_replication", localReplication.isEnableEventReplication());
-                addFeatureAttribute("sync_properties", localReplication.isSyncProperties());
-                addFeatureAttribute("sync_deleted", localReplication.isSyncDeletes());
-            } else if (localReplication == null) {
-                addFeatureAttribute("push_replication", false);
-                addFeatureAttribute("event_replication", false);
-                addFeatureAttribute("sync_deleted", false);
-            }
-        }});
-    }
-
-    /**
-     * Collects virtual repo metadata  {@see RTFACT-8412}
-     *
-     * @param remoteRepositoriesFeature
-     * @param remoteRepo
-     */
-    private void addRemoteRepoFeatures(FeatureGroup remoteRepositoriesFeature, final RealRepo remoteRepo) {
-        // remote repos
-        remoteRepositoriesFeature.addFeature(new FeatureGroup(remoteRepo.getKey()) {{
-            addFeatureAttribute("package_type", remoteRepo.getDescriptor().getType().name());
-            addFeatureAttribute("repository_layout",
-                    remoteRepo.getDescriptor().getRepoLayout().getName());
-
-            RemoteReplicationDescriptor remoteReplicationDescriptor =
-                    configService.getDescriptor().getRemoteReplication(remoteRepo.getKey());
-
-            if (remoteReplicationDescriptor != null) {
-                addFeatureAttribute("pull_replication", remoteReplicationDescriptor.isEnabled());
-                if(remoteReplicationDescriptor.isEnabled()) {
-                    addFeatureAttribute("pull_replication_url",
-                            ((RemoteRepoDescriptor)remoteRepo.getDescriptor()).getUrl());
-                }
-            } else {
-                addFeatureAttribute("pull_replication", false);
-            }
-        }});
-    }
-
-    /**
-     * Collects virtual repo metadata  {@see RTFACT-8412}
-     *
-     * @param virtualRepositoriesFeature
-     * @param virtualRepositories
-     */
-    private void addVirtualRepoFeatures(FeatureGroup virtualRepositoriesFeature,
-                                        List<VirtualRepo> virtualRepositories) {
-        virtualRepositories.stream()
-                .filter(vr -> !vr.getKey().equals("repo"))
-                .forEach(vr -> {
-                    virtualRepositoriesFeature.addFeature(new FeatureGroup(vr.getKey()) {{
-                        addFeatureAttribute("number_of_included_repositories",
-                                vr.getResolvedLocalRepos().size() + vr.getResolvedRemoteRepos().size());
-                        addFeatureAttribute("package_type", vr.getDescriptor().getType().name());
-                        if (vr.getDescriptor().getRepoLayout() != null) {
-                            addFeatureAttribute("repository_layout", vr.getDescriptor().getRepoLayout().getName());
-                        }
-                        if (vr.getDescriptor().getDefaultDeploymentRepo() != null)
-                            addFeatureAttribute("configured_local_deployment",
-                                    vr.getDescriptor().getDefaultDeploymentRepo().getKey());
-                    }});
-                });
-    }
-
-    /**
-     * Calculates sizeof List<VirtualRepo>
-     *
-     * @param virtualRepositories
-     * @return size
-     */
-    private int getVirtualReposSize(List<VirtualRepo> virtualRepositories) {
-        return virtualRepositories.stream().filter(vr -> vr.getKey().equals("repo")).count() == 1 ?
-                virtualRepositories.size() -1 : virtualRepositories.size();
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/post/providers/features/SecurityFeature.java b/backend/core/src/main/java/org/artifactory/post/providers/features/SecurityFeature.java
deleted file mode 100644
index 4485b6b..0000000
--- a/backend/core/src/main/java/org/artifactory/post/providers/features/SecurityFeature.java
+++ /dev/null
@@ -1,195 +0,0 @@
-package org.artifactory.post.providers.features;
-
-import org.artifactory.api.callhome.FeatureGroup;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.security.AclService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.descriptor.security.SecurityDescriptor;
-import org.artifactory.security.GroupInfo;
-import org.artifactory.security.UserInfo;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * This class represent the security feature group of the CallHome feature
- *
- * @author Shay Bagants
- */
- at Component
-public class SecurityFeature implements CallHomeFeature {
-
-    @Autowired
-    private CentralConfigService configService;
-
-    @Autowired
-    private UserGroupService userGroupService;
-
-    @Autowired
-    private AclService aclService;
-
-    @Override
-    public FeatureGroup getFeature() {
-        SecurityDescriptor security = configService.getDescriptor().getSecurity();
-
-        //Holds the entire security information, this is what the method returns
-        FeatureGroup securityFeature = new FeatureGroup("security");
-
-        //General security configurations
-        addGeneralSecurityInformation(securityFeature, security);
-
-        //Users
-        addUsers(securityFeature);
-
-        //Groups
-        addGroups(securityFeature);
-
-        //Permissions
-        FeatureGroup permissionsFeature = new FeatureGroup("permissions");
-        permissionsFeature.addFeatureAttribute("number_of_permission_targets", aclService.getAllAcls().size());
-        securityFeature.addFeature(permissionsFeature);
-
-        //LDAP
-        boolean isLdapEnabled = security.isLdapEnabled();
-        if (isLdapEnabled){
-            FeatureGroup ldapFeature = new FeatureGroup("ldap");
-            ldapFeature.addFeatureAttribute("enabled", true);
-            securityFeature.addFeature(ldapFeature);
-        }
-
-        //Crowd
-        if (security.getCrowdSettings() != null) {
-            boolean isCrowdEnabled = security.getCrowdSettings().isEnableIntegration();
-            if (isCrowdEnabled){
-                FeatureGroup crowdFeature = new FeatureGroup("crowd");
-                crowdFeature.addFeatureAttribute("enabled", true);
-                securityFeature.addFeature(crowdFeature);
-            }
-        }
-
-        //SAML
-        if (security.getSamlSettings() != null) {
-            boolean isSamlEnabled = security.getSamlSettings().isEnableIntegration();
-            if (isSamlEnabled){
-                FeatureGroup samlFeature = new FeatureGroup("saml");
-                samlFeature.addFeatureAttribute("enabled", true);
-                securityFeature.addFeature(samlFeature);
-            }
-        }
-
-        //SSO
-        if (security.getHttpSsoSettings() != null) {
-            boolean isSsoEnabled = security.getHttpSsoSettings().isHttpSsoProxied();
-            if (isSsoEnabled){
-                FeatureGroup ssoFeature = new FeatureGroup("sso");
-                ssoFeature.addFeatureAttribute("enabled", true);
-                securityFeature.addFeature(ssoFeature);
-            }
-        }
-
-        //OAuth
-        if (security.getOauthSettings() != null) {
-            boolean isOauthEnabled = security.getOauthSettings().getEnableIntegration();
-            if (isOauthEnabled){
-                FeatureGroup oauthFeature = new FeatureGroup("oauth");
-                oauthFeature.addFeatureAttribute("enabled", true);
-                securityFeature.addFeature(oauthFeature);
-            }
-        }
-
-        //SSH Server
-        if (security.getSshServerSettings() != null) {
-            boolean isSshServerEnabled = security.getSshServerSettings().isEnableSshServer();
-            if (isSshServerEnabled){
-                FeatureGroup sshServerFeature = new FeatureGroup("ssh_server");
-                sshServerFeature.addFeatureAttribute("enabled", true);
-                securityFeature.addFeature(sshServerFeature);
-            }
-        }
-
-        return securityFeature;
-    }
-
-    /**
-     * Adds users information to the security feature group
-     *
-     * @param securityFeature that holds the entire security features
-     */
-    private void addUsers(FeatureGroup securityFeature) {
-        List<UserInfo> users = userGroupService.getAllUsers(true);
-        FeatureGroup usersFeature = new FeatureGroup("users");
-        usersFeature.addFeatureAttribute("number_of_users", users.size());
-        Map<String, Integer> realms = new HashMap<>();
-        users.forEach(userInfo -> incrementRealmCount(realms, userInfo.getRealm(), "internal"));
-        //add the count of each realm
-        realms.forEach((realm, count) -> usersFeature.addFeatureAttribute(realm + "_users", count));
-        securityFeature.addFeature(usersFeature);
-    }
-
-    /**
-     * Adds groups information to the security feature group
-     *
-     * @param securityFeature that holds the entire security features
-     */
-    private void addGroups(FeatureGroup securityFeature) {
-        List<GroupInfo> groups = userGroupService.getAllGroups();
-        FeatureGroup groupsFeature = new FeatureGroup("groups");
-        groupsFeature.addFeatureAttribute("number_of_groups", groups.size());
-        Map<String, Integer> realms = new HashMap<>();
-        groups.forEach(groupInfo -> incrementRealmCount(realms, groupInfo.getRealm(), "internal"));
-        realms.forEach((realm, count) -> {
-            //groups internal realm is 'artifactory', but we want that the resulted json will be consistent in both
-            //users and groups, therefore, translating 'artifactory' realm to 'internal'
-            if (realm.equalsIgnoreCase("artifactory")) {
-                realm = "internal";
-            }
-            groupsFeature.addFeatureAttribute(realm + "_groups", count);
-        });
-        securityFeature.addFeature(groupsFeature);
-    }
-
-    /**
-     * This method used when counting the number of users/groups realms
-     *
-     * @param realms            which stores the realm name and count
-     * @param currentRealm      the name of the realm which we should increment it's count
-     * @param internalRealmName since group internal realm is called 'artifactory' and users internal realm called
-     *                          'internal', we are using this value when adding the user/group realm to the map in case
-     *                          of a null realm name.
-     */
-    private void incrementRealmCount(Map<String, Integer> realms, String currentRealm, String internalRealmName) {
-        if (currentRealm != null) {
-            currentRealm = currentRealm.toLowerCase();
-            realms.compute(currentRealm, (key, value) -> value == null ? 1 : value + 1);
-        } //null = anonymous user or users which have yet logged it into Artifactory
-        else {
-            //When used by users, the internal realm is 'internal'
-            //when using artifactory, the internal realm is artifactory
-            currentRealm = internalRealmName;
-            realms.compute(currentRealm, (key, value) -> value == null ? 1 : value + 1);
-        }
-    }
-
-    /**
-     * Add general security information to the security feature group
-     *
-     * @param securityFeature that holds the entire security features
-     * @param security SecurityDescriptor that used to access the security data
-     */
-    private void addGeneralSecurityInformation(FeatureGroup securityFeature, SecurityDescriptor security) {
-        FeatureGroup securityConfigurationsFeature = new FeatureGroup("configurations");
-        securityConfigurationsFeature.addFeatureAttribute
-                ("allow_anonymous_access", security.isAnonAccessEnabled());
-        securityConfigurationsFeature.addFeatureAttribute
-                ("prevent_anonymous_access_builds", security.isAnonAccessToBuildInfosDisabled());
-        securityConfigurationsFeature.addFeatureAttribute
-                ("password_encryption_policy", security.getPasswordSettings().getEncryptionPolicy()
-                        .toString().toLowerCase());
-        securityConfigurationsFeature.addFeatureAttribute
-                ("lock_users", security.getUserLockPolicy().isEnabled());
-        securityFeature.addFeature(securityConfigurationsFeature);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/post/services/CallHomeService.java b/backend/core/src/main/java/org/artifactory/post/services/CallHomeService.java
deleted file mode 100644
index 81490ae..0000000
--- a/backend/core/src/main/java/org/artifactory/post/services/CallHomeService.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.post.services;
-
-import com.google.common.collect.Lists;
-import org.apache.http.HttpEntity;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.ContentType;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.CoreAddons;
-import org.artifactory.addon.OssAddonsManager;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.api.callhome.CallHomeRequest;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.jackson.JacksonWriter;
-import org.artifactory.api.repo.Async;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.post.providers.features.CallHomeFeature;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.util.HttpClientConfigurator;
-import org.joda.time.DateTime;
-import org.joda.time.format.ISODateTimeFormat;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import java.io.IOException;
-import java.util.Date;
-import java.util.List;
-
-import static org.artifactory.common.ConstantValues.artifactoryVersion;
-
-/**
- * @author Michael Pasternak
- */
- at Service
-public class CallHomeService {
-
-    private static final Logger log = LoggerFactory.getLogger(CallHomeService.class);
-    private static final String PARAM_OS_ARCH = "os.arch";
-    private static final String PARAM_OS_NAME = "os.name";
-    private static final String PARAM_JAVA_VERSION = "java.version";
-
-    @Autowired
-    private CentralConfigService configService;
-
-    @Autowired
-    private List<CallHomeFeature> callHomeFeatures = Lists.newArrayList();
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    /**
-     * Sends post message with usage info to bintray
-     */
-    @Async
-    public void callHome() {
-        if (ConstantValues.versionQueryEnabled.getBoolean() && !configService.getDescriptor().isOfflineMode()) {
-            try (CloseableHttpClient client = createHttpClient()) {
-                String url = ConstantValues.bintrayApiUrl.getString() + "/products/jfrog/artifactory/stats/usage";
-                HttpPost postMethod = new HttpPost(url);
-                postMethod.setEntity(callHomeEntity());
-                log.debug("Calling home...");
-                client.execute(postMethod);
-            } catch (Exception e) {
-                log.debug("Failed calling home: " + e.getMessage(), e);
-            }
-        }
-    }
-
-    /**
-     * @return {@link CloseableHttpClient}
-     */
-    private CloseableHttpClient createHttpClient() {
-        ProxyDescriptor proxy = InternalContextHelper.get().getCentralConfig().getDescriptor().getDefaultProxy();
-        return new HttpClientConfigurator()
-                .soTimeout(15000)
-                .connectionTimeout(1500)
-                .retry(0, false)
-                .proxy(proxy)
-                .getClient();
-    }
-
-    /**
-     * Produces callHomeEntity
-     *
-     * @return {@link HttpEntity}
-     *
-     * @throws IOException on serialization errors
-     */
-    private HttpEntity callHomeEntity() throws IOException {
-        CallHomeRequest request = new CallHomeRequest();
-
-        addInstanceAndEnvInfo(request);
-        addFeatures(request);
-        return serializeToStringEntity(request);
-    }
-
-    /**
-     * Serializes {@link CallHomeRequest} to {@link org.apache.http.entity.StringEntity}
-     *
-     * @param request {@link CallHomeRequest}
-     *
-     * @return {@link org.apache.http.entity.StringEntity}
-     * @throws IOException happens if serialization fails
-     */
-    private StringEntity serializeToStringEntity(CallHomeRequest request) throws IOException {
-        String serialized = JacksonWriter.serialize(request, true);
-        return new StringEntity(serialized, ContentType.APPLICATION_JSON);
-    }
-
-    /**
-     * Collects features metadata  {@see RTFACT-8412}
-     *
-     * @param request that holds the entire callhome content
-     */
-    private void addFeatures(CallHomeRequest request) {
-        callHomeFeatures.stream()
-                .map(CallHomeFeature::getFeature)
-                .forEach(request::addCallHomeFeature);
-    }
-
-    /**
-     * Collect environment and instance information
-     * @param request that should the entire call home information
-     */
-    private void addInstanceAndEnvInfo(CallHomeRequest request){
-        request.version = artifactoryVersion.getString();
-
-        String license = getLicenseType();
-        if (license != null && license.equals("aol")){
-            boolean isDedicated = ArtifactoryHome.get().getArtifactoryProperties()
-                    .getBooleanProperty(ConstantValues.aolDedicatedServer);
-            license = isDedicated ? license + " dedicated" : license;
-        }
-        request.licenseType = license;
-
-        request.licenseOEM = addonsManager.isPartnerLicense() ? "VMware" : null;
-        Date licenseValidUntil = addonsManager.getLicenseValidUntil();
-        if (licenseValidUntil != null) {
-            request.licenseExpiration = ISODateTimeFormat.dateTime().print(new DateTime(licenseValidUntil));
-        }
-        request.setDist(System.getProperty("artdist"));
-        request.environment.hostId = addonsManager.addonByType(HaCommonAddon.class).getHostId();
-        request.environment.licenseHash = addonsManager.getLicenseKeyHash();
-        request.environment.attributes.osName = System.getProperty(PARAM_OS_NAME);
-        request.environment.attributes.osArch = System.getProperty(PARAM_OS_ARCH);
-        request.environment.attributes.javaVersion = System.getProperty(PARAM_JAVA_VERSION);
-    }
-
-
-    private String getLicenseType() {
-        if (addonsManager instanceof OssAddonsManager) {
-            return "oss";
-        }
-        if (addonsManager.addonByType(CoreAddons.class).isAol()) {
-            return "aol";
-        } else if (addonsManager.getLicenseDetails()[2].equals("Trial")) {
-            return "trial";
-        } else if (addonsManager.getLicenseDetails()[2].equals("Commercial")) {
-            return "pro";
-        } else if (addonsManager.isHaLicensed()) {
-            return "ent";
-        }
-        return null;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/properties/PropertiesServiceImpl.java b/backend/core/src/main/java/org/artifactory/properties/PropertiesServiceImpl.java
deleted file mode 100644
index 60716f1..0000000
--- a/backend/core/src/main/java/org/artifactory/properties/PropertiesServiceImpl.java
+++ /dev/null
@@ -1,393 +0,0 @@
-/*
- * Copyright 2012 JFrog Ltd. All rights reserved.
- * JFROG PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
- */
-
-package org.artifactory.properties;
-
-import com.google.common.collect.Maps;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.properties.LockableAddProperties;
-import org.artifactory.api.properties.PropertiesService;
-import org.artifactory.api.repo.exception.ItemNotFoundRuntimeException;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.descriptor.property.Property;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.exception.CancelException;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.io.checksum.ChecksumUtil;
-import org.artifactory.md.Properties;
-import org.artifactory.model.xstream.fs.PropertiesImpl;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.StoringRepo;
-import org.artifactory.repo.interceptor.StorageInterceptors;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.sapi.fs.MutableVfsFile;
-import org.artifactory.sapi.fs.MutableVfsFolder;
-import org.artifactory.sapi.fs.MutableVfsItem;
-import org.artifactory.security.AccessLogger;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.storage.fs.lock.LockingHelper;
-import org.artifactory.storage.fs.service.FileService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Implementation of the properties service.
- *
- * @author Yossi Shaul
- */
- at Service
-public class PropertiesServiceImpl implements PropertiesService, LockableAddProperties {
-    private static final Logger log = LoggerFactory.getLogger(PropertiesServiceImpl.class);
-
-    @Autowired
-    private InternalRepositoryService repoService;
-
-    @Autowired
-    private StorageInterceptors interceptors;
-
-    @Override
-    @Nonnull
-    public Properties getProperties(RepoPath repoPath) {
-        Properties properties = repoService.getProperties(repoPath);
-        if (properties == null) {
-            properties = new PropertiesImpl();
-        }
-        return properties;
-    }
-
-    @Override
-    public Map<RepoPath, Properties> getProperties(Set<RepoPath> repoPaths, String... mandatoryKeys) {
-        Map<RepoPath, Properties> map = Maps.newHashMap();
-
-        for (RepoPath path : repoPaths) {
-            Properties properties = getProperties(path);
-
-            boolean containsAllKeys = true;
-
-            for (String mandatoryKey : mandatoryKeys) {
-                if (!properties.containsKey(mandatoryKey)) {
-                    containsAllKeys = false;
-                    break;
-                }
-            }
-
-            if (containsAllKeys) {
-                map.put(path, properties);
-            }
-        }
-
-        return map;
-    }
-
-    @Override
-    public void setProperties(RepoPath repoPath, Properties newProperties) {
-        MutableVfsItem mutableItem;
-        try {
-            mutableItem = repoService.getMutableItem(repoPath);
-            mutableItem.setProperties(newProperties);
-        } catch (ItemNotFoundRuntimeException e) {
-            log.error("Cannot add properties for {}: Item not found.", repoPath);
-            return;
-        }
-    }
-
-    @Override
-    public void addProperty(RepoPath repoPath, @Nullable PropertySet propertySet, Property property, String... values) {
-        addProperty(repoPath, propertySet, property, false, values);
-    }
-
-    @Override
-    public void addProperty(RepoPath repoPath, @Nullable PropertySet propertySet, Property property,
-                            boolean updateAccessLogger, String... values) {
-        if (values == null || values.length == 0) {
-            return;
-        }
-
-        MutableVfsItem mutableItem;
-        try {
-            mutableItem = repoService.getMutableItem(repoPath);
-        } catch (ItemNotFoundRuntimeException e) {
-            log.error("Cannot add properties for {}: Item not found.", repoPath);
-            AccessLogger.propertyAddedDenied(repoPath, "Property key " + property + " Item not found");
-            return;
-        }
-
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-        interceptors.beforePropertyCreate(mutableItem, statusHolder, property.getName(), values);
-        CancelException cancelException = statusHolder.getCancelException();
-        if (cancelException != null) {
-            LockingHelper.removeLockEntry(mutableItem.getRepoPath());
-            AccessLogger.propertyAddedDenied(repoPath, "Property key " + property + " Canceled");
-            throw cancelException;
-        }
-
-        Properties properties = mutableItem.getProperties();
-
-        //Build the xml name of the property
-        String xmlPropertyName = getXmlPropertyName(propertySet, property);
-        boolean exist = properties.containsKey(xmlPropertyName);
-        if (!property.isMultipleChoice()) {
-            // If the added property is a single selection, remove any existing values belonging to it, before adding
-            // the new one that will replace it
-            properties.removeAll(xmlPropertyName);
-        }
-
-        properties.putAll(xmlPropertyName, Arrays.asList(values));
-        mutableItem.setProperties(properties);
-        if (updateAccessLogger) {
-            if (exist) {
-                AccessLogger.propertyUpdated(repoPath, "Property key " + xmlPropertyName);
-            } else {
-                AccessLogger.propertyAdded(repoPath, "Property key " + xmlPropertyName);
-            }
-        }
-        interceptors.afterPropertyCreate(mutableItem, statusHolder, property.getName(), values);
-
-    }
-
-    @Override
-    public void editProperty(RepoPath repoPath, @Nullable PropertySet propertySet, Property property,
-                             boolean updateAccessLogger, String... values) {
-        String propertyName = property.getName();
-        if (propertySet != null && StringUtils.isNotBlank(propertySet.getName())) {
-            propertyName = propertySet.getName() + "." + propertyName;
-        }
-        deleteProperty(repoPath, propertyName, false);
-        addProperty(repoPath, propertySet, property, false, values);
-        if (updateAccessLogger) {
-            AccessLogger.propertyUpdated(repoPath, "Property key " + propertyName);
-        }
-    }
-
-    @Override
-    public void addPropertyRecursively(RepoPath repoPath, @Nullable PropertySet propertySet, Property property,
-                                       boolean updateAccessLogger, String... values) {
-        StoringRepo storingRepo = repoService.storingRepositoryByKey(repoPath.getRepoKey());
-        MutableVfsItem fsItem = storingRepo.getMutableFsItem(repoPath);
-        if (fsItem == null) {
-            log.warn("No item found at {}. Property not added.", repoPath);
-            return;
-        }
-        addPropertyRecursivelyInternal(fsItem, propertySet, property, updateAccessLogger, values);
-    }
-
-    @Override
-    public void addPropertyRecursively(RepoPath repoPath, @Nullable PropertySet propertySet, Property property,
-                                       String... values) {
-        addPropertyRecursively(repoPath, propertySet, property, false, values);
-    }
-
-    @Override
-    public void addPropertyRecursivelyMultiple(RepoPath repoPath, @Nullable PropertySet propertySet,
-                                               Map<Property, List<String>> propertyMapFromRequests, boolean updateAccessLogger) {
-        ItemInfo itemInfo = repoService.getItemInfo(repoPath);
-        // add property in multi transaction
-        addPropertyMultiTransaction(itemInfo, propertySet, propertyMapFromRequests, updateAccessLogger);
-    }
-
-    @Override
-    public void addPropertySha256RecursivelyMultiple(RepoPath repoPath) {
-        ItemInfo itemInfo = repoService.getItemInfo(repoPath);
-        // add property in multi transaction
-        addSha256PropertyMultiTransaction(itemInfo);
-    }
-
-
-    /**
-     * add property in multi transaction mode
-     *
-     * @param itemInfo                - repo path
-     * @param propertySet             - property set
-     * @param propertyMapFromRequests - properties map from request
-     */
-    private void addPropertyMultiTransaction(ItemInfo itemInfo, @Nullable PropertySet propertySet,
-                                             Map<Property, List<String>> propertyMapFromRequests, boolean updateAccessLogger) {
-        // add current property
-        log.debug("start tx and add property to artifact:{}", itemInfo.getRepoPath());
-        transactionalMe().addPropertyInternalMultiple(itemInfo.getRepoPath(), propertySet, propertyMapFromRequests
-                , updateAccessLogger);
-        if (itemInfo.isFolder()) {
-            // add to children recursively
-            FileService fileService = ContextHelper.get().beanForType(FileService.class);
-            List<ItemInfo> children = fileService.loadChildren(itemInfo.getRepoPath());
-            for (ItemInfo child : children) {
-                addPropertyMultiTransaction(child, propertySet, propertyMapFromRequests, updateAccessLogger);
-            }
-        }
-    }
-
-    /**
-     * add property in multi transaction mode
-     *
-     * @param itemInfo - repo path
-     */
-    private void addSha256PropertyMultiTransaction(ItemInfo itemInfo) {
-        if (itemInfo.isFolder()) {
-            // add to children recursively
-            FileService fileService = ContextHelper.get().beanForType(FileService.class);
-            List<ItemInfo> children = fileService.loadChildren(itemInfo.getRepoPath());
-            for (ItemInfo child : children) {
-                addSha256PropertyMultiTransaction(child);
-            }
-        } else {
-            // add current property
-            log.debug("start tx and add property to artifact:{}", itemInfo.getRepoPath());
-            transactionalMe().addSha256PropertyInternalMultiple(itemInfo.getRepoPath());
-        }
-    }
-
-    @Override
-    public void addSha256PropertyInternalMultiple(RepoPath repoPath) {
-        MutableVfsFile mutableVfsItem = (MutableVfsFile) repoService.getMutableItem(repoPath);
-        // add single property
-        String value = ChecksumUtil.getChecksum(mutableVfsItem.getStream(), ChecksumType.sha256);
-        if (!StringUtils.isEmpty(value)) {
-            log.debug("adding sha256 property with value {}", value);
-            Property property = new Property("sha256");
-            addProperty(mutableVfsItem.getRepoPath(), null, property, false, value);
-            BasicStatusHolder statusHolder = new BasicStatusHolder();
-            interceptors.afterPropertyDelete(mutableVfsItem, statusHolder, property.getName());
-        }
-    }
-
-    @Override
-    public void addPropertyInternalMultiple(RepoPath repoPath, @Nullable PropertySet propertySet,
-                                            Map<Property, List<String>> propertyMapFromRequest, boolean updateAccessLogger) {
-        MutableVfsItem mutableVfsItem = repoService.getMutableItem(repoPath);
-        // add single property
-        for (Map.Entry<Property, List<String>> propertyStringEntry : propertyMapFromRequest.entrySet()) {
-            List<String> value = propertyStringEntry.getValue();
-            String[] values = new String[value.size()];
-            value.toArray(values);
-            Property property = propertyStringEntry.getKey();
-            addProperty(mutableVfsItem.getRepoPath(), propertySet, property, updateAccessLogger, values);
-            BasicStatusHolder statusHolder = new BasicStatusHolder();
-            interceptors.afterPropertyDelete(mutableVfsItem, statusHolder, property.getName());
-        }
-    }
-
-    private void addPropertyRecursivelyInternal(MutableVfsItem fsItem, PropertySet propertySet, Property property,
-                                                boolean updateAccessLogger, String[] values) {
-        // add property to the current path
-        // TODO use addProperty internal and pass to it MutableVfsItem not repoPath.
-        addProperty(fsItem.getRepoPath(), propertySet, property, updateAccessLogger, values);
-
-        if (fsItem.isFolder()) {
-            // add to children recursively
-            List<MutableVfsItem> children = ((MutableVfsFolder) fsItem).getMutableChildren();
-            for (MutableVfsItem child : children) {
-                addPropertyRecursivelyInternal(child, propertySet, property, updateAccessLogger, values);
-            }
-        }
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-        interceptors.afterPropertyDelete(fsItem, statusHolder, property.getName());
-    }
-
-
-    private LockableAddProperties transactionalMe() {
-        return InternalContextHelper.get().beanForType(LockableAddProperties.class);
-    }
-
-    @Override
-    public boolean deleteProperty(RepoPath repoPath, String property) {
-        return deleteProperty(repoPath, property, false);
-    }
-
-    @Override
-    public void addPropertyRecursivelyMultiple(RepoPath repoPath, @Nullable PropertySet propertySet,
-                                               Map<Property, List<String>> propertyMapFromRequest) {
-        addPropertyRecursivelyMultiple(repoPath, propertySet, propertyMapFromRequest, false);
-    }
-
-    @Override
-    public boolean deleteProperty(RepoPath repoPath, String property, boolean updateAccessLogger) {
-        MutableVfsItem mutableItem = repoService.getMutableItem(repoPath);
-        if (mutableItem == null) {
-            log.error("Cannot change properties for {}: Item not found.", repoPath);
-            AccessLogger.propertyDeletedDenied(repoPath, "Property key " + property + " Item not found");
-            return false;
-        }
-
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-        interceptors.beforePropertyDelete(mutableItem, statusHolder, property);
-        CancelException cancelException = statusHolder.getCancelException();
-        if (cancelException != null) {
-            LockingHelper.removeLockEntry(mutableItem.getRepoPath());
-            AccessLogger.propertyDeletedDenied(repoPath, "Property key " + property + " Cancelled");
-            throw cancelException;
-        }
-
-        Properties properties = mutableItem.getProperties();
-        boolean exist = properties.containsKey(property);
-        properties.removeAll(property);
-        mutableItem.setProperties(properties);
-        if (updateAccessLogger) {
-            if (exist) {
-                AccessLogger.propertyDeleted(repoPath, "Property key " + property);
-            }
-        }
-        interceptors.afterPropertyDelete(mutableItem, statusHolder, property);
-        return exist;
-    }
-
-    @Override
-    public void deletePropertyRecursively(RepoPath repoPath, String property, boolean updateAccessLogger) {
-        StoringRepo storingRepo = repoService.storingRepositoryByKey(repoPath.getRepoKey());
-        MutableVfsItem fsItem = storingRepo.getMutableFsItem(repoPath);
-        if (fsItem == null) {
-            log.warn("No item found at {}. Property not added.", repoPath);
-            return;
-        }
-        deletePropertyRecursivelyInternal(fsItem, property, updateAccessLogger);
-    }
-
-    @Override
-    public void deletePropertyRecursively(RepoPath repoPath, String property) {
-        deletePropertyRecursively(repoPath, property, false);
-    }
-
-    private void deletePropertyRecursivelyInternal(MutableVfsItem fsItem, String property, boolean updateAccessLogger) {
-        // add property to the current path
-        deleteProperty(fsItem.getRepoPath(), property, updateAccessLogger);
-
-        if (fsItem.isFolder()) {
-            // delete from children recursively
-            // TODO use deleteProperty internal and pass to it MutableVfsItem not repoPath.
-            List<MutableVfsItem> children = ((MutableVfsFolder) fsItem).getMutableChildren();
-            for (MutableVfsItem child : children) {
-                deletePropertyRecursivelyInternal(child, property, updateAccessLogger);
-            }
-        }
-    }
-
-    /**
-     * Builds an xml name of the property set and the property in the pattern of PropertSetName.PropertyName
-     *
-     * @param propertySet Property set to use - can be null
-     * @param property    Property to use
-     * @return Xml property name
-     */
-    private String getXmlPropertyName(@Nullable PropertySet propertySet, Property property) {
-        String xmlPropertyName = "";
-        if (propertySet != null) {
-            String setName = propertySet.getName();
-            if (StringUtils.isNotBlank(setName)) {
-                xmlPropertyName += setName + ".";
-            }
-        }
-        return xmlPropertyName + property.getName();
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/ArtifactoryStandardUrlResolver.java b/backend/core/src/main/java/org/artifactory/repo/ArtifactoryStandardUrlResolver.java
deleted file mode 100644
index 3381cb3..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/ArtifactoryStandardUrlResolver.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.artifactory.repo;
-
-import org.apache.commons.lang.StringUtils;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * @author Gidi Shabat
- */
-public class ArtifactoryStandardUrlResolver {
-
-    private static final String[] templates = {"nuget", "yum", "npm", "gems", "deb", "pypi", "docker", "vcs", "bower", "pods"};
-    private final Matcher remoteRepoUrlMatcher;
-
-    private String url;
-
-    public ArtifactoryStandardUrlResolver(String url) {
-        this.url = url;
-        Pattern remoteRepoUrlPattern = Pattern.compile("(.+)/([^/]+)");
-        remoteRepoUrlMatcher = remoteRepoUrlPattern.matcher(url);
-        if (!remoteRepoUrlMatcher.find()) {
-            throwInvalidUrlForm(url);
-        }
-    }
-
-    public String getBaseUrl() {
-        String baseUrl = remoteRepoUrlMatcher.group(1);
-        baseUrl = peelRestApi(baseUrl);
-        if (StringUtils.isBlank(baseUrl)) {
-            throwInvalidUrlForm(url);
-        }
-        return baseUrl;
-    }
-
-    public String getRepoKey() {
-        String repoKey = remoteRepoUrlMatcher.group(2);
-        if (StringUtils.isBlank(repoKey)) {
-            throwInvalidUrlForm(url);
-        }
-        return repoKey;
-    }
-
-    private static String peelRestApi(String url) {
-        for (String template : templates) {
-            if (url.endsWith("/api/" + template)) {
-                url = StringUtils.removeEnd(url, "/api/" + template);
-            }
-        }
-        return url;
-    }
-
-    private void throwInvalidUrlForm(String remoteUrl) {
-        throw new IllegalArgumentException("The URL form of '" + remoteUrl + "' is unsupported.");
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/DistributionRepo.java b/backend/core/src/main/java/org/artifactory/repo/DistributionRepo.java
deleted file mode 100644
index ec4b7b7..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/DistributionRepo.java
+++ /dev/null
@@ -1,619 +0,0 @@
-package org.artifactory.repo;
-
-import com.google.common.base.Joiner;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Multimap;
-import com.jfrog.bintray.client.api.BintrayCallException;
-import com.jfrog.bintray.client.api.details.PackageDetails;
-import com.jfrog.bintray.client.api.details.ProductDetails;
-import com.jfrog.bintray.client.api.details.RepositoryDetails;
-import com.jfrog.bintray.client.api.details.VersionDetails;
-import com.jfrog.bintray.client.api.handle.*;
-import com.jfrog.bintray.client.api.model.Product;
-import com.jfrog.bintray.client.impl.BintrayClient;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.docker.DockerAddon;
-import org.artifactory.api.bintray.BintrayParams;
-import org.artifactory.api.bintray.BintrayService;
-import org.artifactory.api.bintray.BintrayUploadInfo;
-import org.artifactory.api.bintray.distribution.Distribution;
-import org.artifactory.api.bintray.distribution.DistributionService;
-import org.artifactory.api.bintray.distribution.resolver.DistributionCoordinatesResolver;
-import org.artifactory.api.bintray.distribution.rule.DistributionRuleTokens;
-import org.artifactory.api.bintray.docker.BintrayDockerPushRequest;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.exception.ItemNotFoundRuntimeException;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.bintray.distribution.util.DistributionUtils;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.md.Properties;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.model.xstream.fs.PropertiesImpl;
-import org.artifactory.repo.db.DbLocalRepo;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.util.ExceptionUtils;
-import org.artifactory.util.HttpClientConfigurator;
-import org.artifactory.util.PathUtils;
-import org.artifactory.util.bearer.BintrayBearerPreemptiveAuthInterceptor;
-import org.artifactory.util.distribution.DistributionConstants;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nullable;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Collection;
-import java.util.List;
-
-import static org.artifactory.bintray.distribution.util.DistributionUtils.bintrayRepoExists;
-import static org.artifactory.bintray.distribution.util.DistributionUtils.getValueFromToken;
-import static org.artifactory.util.distribution.DistributionConstants.MANIFEST_FILENAME;
-
-/**
- * @author Dan Feldman
- */
-public class DistributionRepo extends DbLocalRepo<DistributionRepoDescriptor> {
-    private static final Logger log = LoggerFactory.getLogger(DistributionRepo.class);
-
-    private Bintray client;
-
-    public DistributionRepo(DistributionRepoDescriptor descriptor, InternalRepositoryService repositoryService,
-            DistributionRepo oldLocalRepo) {
-        super(descriptor, repositoryService, oldLocalRepo);
-    }
-
-    @Override
-    public void init() {
-        super.init();
-        this.client = createClient();
-    }
-
-    public BasicStatusHolder distribute(Distribution distribution) {
-        BasicStatusHolder status = new BasicStatusHolder();
-        verifyCanDistribute(status);
-        List<RepoPath> paths = DistributionUtils.getPathsFromDistPathList(distribution.getPackagesRepoPaths(), status);
-        if (status.isError()) {
-            return status;
-        }
-        log.debug("Requested paths: {}", paths.toString());
-        status.status("Starting distribution for requested paths using repo: " + distribution.getTargetRepo(), log);
-        Multimap<BintrayUploadInfo, DistributionCoordinatesResolver> distCoordinates = getCoordinatesForPaths(paths, status);
-        status.debug("Paths resolved to coordinates: " + distCoordinates.toString(), log);
-        SubjectHandle subjectHandle = null;
-        if (distCoordinates.size() > 0) {
-            status.status("Distributing artifacts to Bintray...", log);
-            subjectHandle = client.subject(getDescriptor().getBintrayApplication().getOrg());
-        } else {
-            status.error("No valid paths to distribute to Bintray, aborting.", HttpStatus.SC_BAD_REQUEST, log);
-        }
-        for (BintrayUploadInfo uploadInfo : distCoordinates.keySet()) {
-            VersionHandle btVer;
-            try {
-                if (RepoType.Docker.getType().equalsIgnoreCase(uploadInfo.getRepositoryDetails().getType())) {
-                    btVer = getDockerVersion(uploadInfo, subjectHandle, status);
-                } else {
-                    btVer = getOrCreateVersionForCoordinates(distribution.isOverrideExistingFiles(), uploadInfo, subjectHandle, status);
-                }
-            } catch (Exception e) {
-                handleGeneralException(e, "Error creating version " + uploadInfo.toString() + ":", status);
-                continue;
-            }
-            Collection<DistributionCoordinatesResolver> versionResolvers = distCoordinates.get(uploadInfo);
-            if (versionDistributesAllArtifactsToSamePath(versionResolvers)) {
-                //Dummy just to get log info from
-                DistributionCoordinatesResolver dummyResolver = versionResolvers.iterator().next();
-                status.error("All of the artifacts that were mapped to version " + btVer.pkg().name() + "/"
-                        + btVer.name() + " by rule " + dummyResolver.ruleName + " are being mapped to the same path '" +
-                        dummyResolver.getPath() + "'.  This version will not be distributed to Bintray to allow" +
-                        "you to recover.", HttpStatus.SC_BAD_REQUEST, log);
-                continue;
-            }
-            performDistribution(distribution, subjectHandle, btVer, versionResolvers, status);
-        }
-        return status;
-    }
-
-    private void performDistribution(Distribution distribution, SubjectHandle subjectHandle, VersionHandle btVer,
-            Collection<DistributionCoordinatesResolver> versionCoordinates, BasicStatusHolder status) {
-        boolean atLeastOneArtifactPushed = false;
-        for (DistributionCoordinatesResolver coordinates : versionCoordinates) {
-            try {
-                log.debug("Deploying artifact to Bintray: {}", coordinates.toString());
-                pushArtifactToBintrayCoordinates(subjectHandle, btVer, coordinates,
-                        distribution.isOverrideExistingFiles());
-                status.status("Successfully deployed artifact to Bintray: " + coordinates.toString(), log);
-                atLeastOneArtifactPushed = true;
-                copyArtifactsToDistributionRepo(coordinates, status);
-            } catch (Exception e) {
-                handleException(e, "Error distributing " + coordinates + ": ", status);
-            }
-        }
-        if (atLeastOneArtifactPushed) {
-            handleProductOperations(subjectHandle, btVer, status);
-            String verName = btVer.pkg().name() + "/" + btVer.name();
-            String gpgPassphrase = getGpgPassphrase(distribution, verName, status);
-            signVersionIfNeeded(btVer, gpgPassphrase, versionCoordinates.size(), status);
-            //Default publish is true
-            if (distribution.isPublish() == null || (distribution.isPublish() != null && distribution.isPublish())) {
-                publishFiles(btVer, gpgPassphrase, status);
-            }
-        }
-    }
-
-    private void verifyCanDistribute(BasicStatusHolder status) {
-        AuthorizationService authService = ContextHelper.get().beanForType(AuthorizationService.class);
-        if (getDescriptor().getBintrayApplication() == null) {
-            status.error("Repo " + getKey() + " does not have any Bintray OAuth application defined, aborting.",
-                    HttpStatus.SC_BAD_REQUEST, log);
-        } else if (!authService.canDeploy(getRepoPath("."))) {
-            status.error("User " + authService.currentUsername() + " Is missing the required permission to distribute" +
-                    " to repo " + getKey() + ", aborting.", HttpStatus.SC_FORBIDDEN, log);
-        }
-    }
-
-    private Multimap<BintrayUploadInfo, DistributionCoordinatesResolver> getCoordinatesForPaths(List<RepoPath> paths,
-            BasicStatusHolder status) {
-        return getDistService().coordinatesForPaths(paths, getDescriptor().getRules(), getDescriptor(), status);
-    }
-
-    private void pushArtifactToBintrayCoordinates(SubjectHandle subject, VersionHandle btVer,
-            DistributionCoordinatesResolver coordinates, boolean overrideExisting) throws BintrayCallException, UnsupportedOperationException {
-        switch (coordinates.type) {
-            case Docker:
-                //Docker push always overrides existing.
-                distributeDocker(subject, coordinates);
-                break;
-            case Debian:
-                distributeDebian(coordinates, btVer, overrideExisting);
-                break;
-            case Vagrant:
-                distributeVagrant(coordinates, btVer, overrideExisting);
-                break;
-            case GitLfs:
-            case Gems:
-            case Pypi:
-                throw new UnsupportedOperationException("Distributing packages of type " + coordinates.type +
-                        " is unsupported.");
-            default:
-                distributeGeneric(coordinates, btVer, overrideExisting);
-        }
-    }
-
-    /**
-     * Create or update an existing Bintray Repository with the specified info
-     *
-     * @param repositoryDetails BintrayUploadInfo representing the supplied json file
-     * @param subjectHandle     SubjectHandle retrieved by the Bintray Java Client
-     * @param status            status holder of entire operation
-     * @return a RepositoryHandle   pointing to the created/updated repository
-     * @throws Exception on any unexpected error thrown by the Bintray client
-     */
-    public static RepositoryHandle getOrCreateRepo(RepositoryDetails repositoryDetails, SubjectHandle subjectHandle,
-            BasicStatusHolder status) throws Exception {
-
-        String repoName = repositoryDetails.getName();
-        RepositoryHandle bintrayRepoHandle = subjectHandle.repository(repoName);
-        try {
-            if (!bintrayRepoExists(bintrayRepoHandle, status)) {
-                //Repo doesn't exist - create it using the RepoDetails
-                status.status("Creating repo " + repoName + " for subject " + bintrayRepoHandle.owner().name(), log);
-                bintrayRepoHandle = subjectHandle.createRepo(repositoryDetails);
-            } else if (repositoryDetails.getUpdateExisting() != null && repositoryDetails.getUpdateExisting()) {
-                //Repo exists - update only if indicated
-                status.status("Updating repo " + repoName + " with values taken from descriptor", log);
-                bintrayRepoHandle.update(repositoryDetails);
-            }
-        } catch (BintrayCallException bce) {
-            status.error(bce.getMessage() + ":" + bce.getReason(), bce.getStatusCode(), log);
-            throw bce;
-        } catch (IOException ioe) {
-            log.debug("{}", ioe);
-            throw ioe;
-        }
-        //Repo exists and should not be updated
-        return bintrayRepoHandle;
-    }
-
-    /**
-     * Create or update an existing Bintray Package with the specified info
-     *
-     * @param pkgDetails       PackageDetails for creating the package
-     * @param repositoryHandle RepositoryHandle retrieved by the Bintray Java Client
-     * @param status           status holder of entire operation
-     * @return a PackageHandle pointing to the created/updated package
-     * @throws Exception on any unexpected error thrown by the Bintray client
-     */
-    public static PackageHandle getOrCreatePackage(PackageDetails pkgDetails, RepositoryHandle repositoryHandle,
-            BasicStatusHolder status, boolean updateExisting) throws Exception {
-        PackageHandle packageHandle;
-        packageHandle = repositoryHandle.pkg(pkgDetails.getName());
-        try {
-            if (!packageHandle.exists()) {
-                status.status("Package " + pkgDetails.getName() + " doesn't exist, creating it", log);
-                packageHandle = repositoryHandle.createPkg(pkgDetails);
-            } else if (updateExisting) {
-                packageHandle.update(pkgDetails);
-            }
-            log.debug("Package {} created", packageHandle.get().name());
-        } catch (BintrayCallException bce) {
-            status.error(bce.toString(), bce.getStatusCode(), bce, log);
-            throw bce;
-        } catch (IOException ioe) {
-            log.debug("{}", ioe);
-            throw ioe;
-        }
-        return packageHandle;
-    }
-
-    /**
-     * Create or update an existing Bintray Package with the specified info
-     *
-     * @param versionDetails VersionDetails for creating the version
-     * @param packageHandle  PackageHandle retrieved by the Bintray Java Client or by {@link #getOrCreatePackage}
-     * @param status         status holder of entire operation
-     * @return a VersionHandle pointing to the created/updated version
-     * @throws Exception on any unexpected error thrown by the Bintray client
-     */
-    private VersionHandle getOrCreateVersion(VersionDetails versionDetails, PackageHandle packageHandle,
-            BasicStatusHolder status, boolean updateExisting) throws Exception {
-        VersionHandle versionHandle = packageHandle.version(versionDetails.getName());
-        log.debug("Override existing version is set to {}", updateExisting);
-        try {
-            if (!versionHandle.exists()) {
-                status.status("Version " + versionDetails.getName() + " doesn't exist, creating it", log);
-                versionHandle = packageHandle.createVersion(versionDetails);
-                log.debug("Version {} created", versionHandle.get().name());
-            } else if (updateExisting) {
-                //Override only version Attributes
-                versionHandle.updateAttributes(versionDetails.getAttributes());
-                log.debug("Version {} attributes updated", versionHandle.get().name());
-            }
-        } catch (BintrayCallException bce) {
-            status.error(bce.toString(), bce.getStatusCode(), bce, log);
-            throw bce;
-        } catch (IOException ioe) {
-            log.debug("{}", ioe);
-            throw ioe;
-        }
-        return versionHandle;
-    }
-
-    private ProductHandle getOrCreateProduct(ProductDetails productDetails, SubjectHandle subjectHandle,
-            BasicStatusHolder status) throws IOException {
-        ProductHandle product = subjectHandle.product(productDetails.getName());
-        if (!product.exists()) {
-            status.status("Product " + productDetails.getName() + " doesn't exist, creating it", log);
-            product = subjectHandle.createProduct(productDetails);
-        }
-        log.debug("Product {} created", product.name());
-        return product;
-    }
-
-    private void distributeDocker(SubjectHandle subject, DistributionCoordinatesResolver coordinates) throws ItemNotFoundRuntimeException {
-        BintrayDockerPushRequest dockerRequest = new BintrayDockerPushRequest();
-        dockerRequest.bintrayRepo = coordinates.getRepo();
-        dockerRequest.async = false;
-        dockerRequest.bintraySubject = subject.name();
-        dockerRequest.dockerRepository = DistributionUtils.getTokenValueByPropKey(coordinates, "docker.repoName");
-        dockerRequest.dockerTagName = DistributionUtils.getTokenValueByPropKey(coordinates, "docker.manifest");
-        dockerRequest.bintrayPackage = coordinates.getPkg();
-        dockerRequest.bintrayTag = coordinates.getVersion();
-        ContextHelper.get().beanForType(AddonsManager.class).addonByType(DockerAddon.class)
-                .pushTagToBintray(coordinates.artifactPath.getRepoKey(), dockerRequest, getKey());
-    }
-
-    private void distributeDebian(DistributionCoordinatesResolver coordinates, VersionHandle btVer,
-            boolean overrideExisting) throws BintrayCallException {
-        String dist = getValueFromToken(coordinates, DistributionRuleTokens.Keys.debDist.key);
-        String comp = getValueFromToken(coordinates, DistributionRuleTokens.Keys.debComp.key);
-        String arch = getValueFromToken(coordinates, DistributionRuleTokens.Keys.architecture.key);
-        btVer.uploadDebian(coordinates.getPath(), dist, comp, arch, getArtifactInputStream(coordinates), overrideExisting);
-    }
-
-    private void distributeVagrant(DistributionCoordinatesResolver coordinates, VersionHandle btVer,
-            boolean overrideExisting) throws BintrayCallException {
-        String boxProvider = getValueFromToken(coordinates, DistributionRuleTokens.Keys.vagrantProvider.key);
-        btVer.uploadVagrant(coordinates.getPath(), boxProvider, getArtifactInputStream(coordinates), overrideExisting);
-    }
-
-    private void distributeGeneric(DistributionCoordinatesResolver coordinates, VersionHandle btVer,
-            boolean overrideExisting) throws BintrayCallException {
-        btVer.upload(coordinates.getPath(), getArtifactInputStream(coordinates), overrideExisting);
-    }
-
-    /**
-     * Creates the product if required and tests if the package is already contained in it (if it existed) - will add
-     * new packages to the product as needed
-     */
-    private void handleProductOperations(SubjectHandle subject, VersionHandle btVer, BasicStatusHolder status) {
-        String productName = getDescriptor().getProductName();
-        if (StringUtils.isBlank(productName)) {
-            return;
-        }
-        ProductDetails productDetails = new ProductDetails();
-        productDetails.setName(productName);
-        ProductHandle productHandle;
-        try {
-            productHandle = getOrCreateProduct(productDetails, subject, status);
-        } catch (Exception e) {
-            handleException(e, "Error getting (or creating) product " + productName, status);
-            return;
-        }
-        attachPackagesToProduct(btVer, productHandle, status);
-    }
-
-    private void attachPackagesToProduct(VersionHandle btVer, ProductHandle productHandle, BasicStatusHolder status) {
-        try {
-            Product product = productHandle.get();
-            String pkgForProduct = btVer.pkg().repository().name() + "/" + btVer.pkg().name();
-            if (!product.getPackages().contains(pkgForProduct)) {
-                status.status("Package" + pkgForProduct + " not contained in product " + product.getName() +
-                        ", adding it.", log);
-                productHandle.addPackages(Lists.newArrayList(pkgForProduct));
-            } else {
-                status.status("Package" + pkgForProduct + " already contained in product " + product.getName(), log);
-            }
-        } catch (Exception e) {
-            handleException(e, "Error attaching distributed packages to product " + productHandle.name(), status);
-        }
-    }
-
-    /**
-     * Signs all files in {@param version} except for maybe metadata - see doc of {@link DistributionRepo#publishFiles}
-     */
-    private void signVersionIfNeeded(VersionHandle version, String gpgPassphrase, int versionFileCount, BasicStatusHolder status) {
-        try {
-            //BLank string means gpg sign without password
-            if (gpgPassphrase != null && gpgPassphrase.equals("")) {
-                version.sign(versionFileCount);
-            } else if (gpgPassphrase != null){
-                version.sign(gpgPassphrase, versionFileCount);
-            }
-        } catch (Exception e) {
-            handleException(e, "Error signing version " + version.pkg().name() + "/" + version.name(), status);
-        }
-    }
-
-    /**
-     * Publishes all files in {@param version}, Also signs metadata if required.
-     * The way this flow works in Bintray forces us to publish + sign (with the header) if we want metadata files
-     * (i.e. debian metadata) signed and the sign AGAIN if we want the actual artifacts signed.
-     */
-    private void publishFiles(VersionHandle version, String gpgPassphrase, BasicStatusHolder status) {
-       String verName = version.pkg().name() + "/" + version.name();
-       status.status("Publishing files in version: " + verName, log);
-       try {
-           if (gpgPassphrase != null) {
-               version.publish(gpgPassphrase);
-           } else {
-               version.publish();
-           }
-       } catch (BintrayCallException bce) {
-           status.error(bce.toString(), bce.getStatusCode(), log);
-       }
-    }
-
-    /**
-     * Outputs the status of this request's signing info - whether the user passed it or the descriptor demands it
-     * and returns the passphrase itself if signing is required for this version
-     * NOTE: If the descriptor requires signing but no passphrase is present this method returns an empty string to
-     * signify that and allow the publish and sign operations to attempt to sign without a passphrase.
-     */
-    private
-    @Nullable
-    String getGpgPassphrase(Distribution distribution, String verName, BasicStatusHolder status) {
-        String passphrase = null;
-        if (StringUtils.isNotBlank(distribution.getGpgPassphrase())) {
-            //passing the passphrase from api overrides anything
-            status.status("GPG Passphrase was passed to the command - version " + verName + " will be signed", log);
-            passphrase = distribution.getGpgPassphrase();
-        } else if (getDescriptor().isGpgSign()) {
-            if (StringUtils.isNotBlank(getDescriptor().getGpgPassPhrase())) {
-                //descriptor says sign and has passphrase
-                status.status("Repository " + getDescriptor().getKey() + " is configured to automatically sign versions"
-                        + " - version " + verName + " will be signed", log);
-                passphrase = getDescriptor().getGpgPassPhrase();
-            } else {
-                //descriptor says sign and no passphrase - attempt to sign anyway the private key might not be required
-                status.status("Repository " + getDescriptor().getKey() + " is configured to automatically sign versions"
-                        + " and no passphrase was given - attempting to sign version " + verName + " without " +
-                        "a passphrase", log);
-                passphrase = "";
-            }
-        }
-        return passphrase;
-    }
-
-    /**
-     * Moves or Copies the artifacts that were distributed using {@param coordinates} to this repo under the appropriate
-     * tree structure.
-     * Also writes the coordinates as properties on the artifacts.
-     */
-    private void copyArtifactsToDistributionRepo(DistributionCoordinatesResolver coordinates, BasicStatusHolder status) {
-        RepoPath pathToMove = coordinates.artifactPath;
-        RepoPath artifactoryDistributionPath;
-        RepoPath propertyWritePath;
-        if (coordinates.type.equals(RepoType.Docker)) {
-            //Path should point to the manifest - so move the parent (only docker v2 is supported)
-            pathToMove = pathToMove.getParent();
-            artifactoryDistributionPath = RepoPathFactory.create(getKey(), Joiner.on("/").join(coordinates.getRepo(),
-                    coordinates.getPkg(), coordinates.getVersion()));
-            propertyWritePath = new RepoPathImpl(artifactoryDistributionPath, MANIFEST_FILENAME);
-            //If parent path exists the copy will put it under existingPath/existingPath instead of overriding so adjust
-            //the target path to the parent so we override the existing artifact.
-            if (getRepositoryService().exists(artifactoryDistributionPath) && !artifactoryDistributionPath.isRoot()) {
-                artifactoryDistributionPath = artifactoryDistributionPath.getParent();
-            }
-        } else {
-            artifactoryDistributionPath = RepoPathFactory.create(getKey(), Joiner.on("/").join(coordinates.getRepo(),
-                    coordinates.getPkg(), coordinates.getVersion(), coordinates.getPath()));
-            propertyWritePath = artifactoryDistributionPath;
-        }
-        status.status("Copying artifact " + pathToMove + " to distribution repository under path "
-                + artifactoryDistributionPath, log);
-        if (pathToMove != null && artifactoryDistributionPath != null) {
-            String sourcePath = pathToMove.toPath();
-            String targetPath = artifactoryDistributionPath.toPath();
-            if (sourcePath.equals(targetPath)) {
-                log.debug("Artifact was re-distributed (same source '{}' and target '{}' paths given to copy operation),"
-                        + "skipping copy of distributed artifact.", sourcePath, targetPath);
-            } else {
-                status.merge(getRepositoryService().copy(pathToMove, artifactoryDistributionPath, false, true, false));
-            }
-        }
-        status.status("Setting target distribution coordinates as properties on path " + propertyWritePath, log);
-        if (ContextHelper.get().beanForType(AuthorizationService.class).canAnnotate(propertyWritePath)) {
-            writeBintrayCoordinatesProps(propertyWritePath, coordinates, status);
-            //TODO [by dan]: need to support showing package type on folder node that represents Bintray repo in phase 2
-            // setPackageTypePropOnBtRepoFolder(propertyWritePath, coordinates);
-        } else {
-            status.warn("Can't write Bintray coordinates on artifact " + propertyWritePath + ": user lacks annotation "
-                    + "permission on path.", HttpStatus.SC_FORBIDDEN, log);
-        }
-    }
-
-    /**
-     * Create a path for the artifact's grandparent - it represents the Bintray repo the artifact was pushed to and
-     * we set the package type there as well for the ui info tab.
-     *
-     * @param propertyWritePath Path of where the artifact was copied to.
-     */
-    private void setPackageTypePropOnBtRepoFolder(RepoPath propertyWritePath, DistributionCoordinatesResolver coordinates) {
-        try {
-            RepoPath bintrayRepoAncestor = RepoPathFactory.create(propertyWritePath.getRepoKey(),
-                    PathUtils.getAncesstor(propertyWritePath.getPath(), 3));
-            Properties typeProps = new PropertiesImpl();
-            typeProps.put(DistributionConstants.ARTIFACT_TYPE_OVERRIDE_PROP, coordinates.type.name());
-            getRepositoryService().setProperties(bintrayRepoAncestor, typeProps);
-        } catch (Exception e) {
-            //User doesn't care about our meta props
-            log.debug("Error setting properties on path {}", propertyWritePath);
-        }
-    }
-
-    private void writeBintrayCoordinatesProps(RepoPath pathToWrite, DistributionCoordinatesResolver coordinates,
-            BasicStatusHolder status) {
-        BintrayParams btParams = new BintrayParams();
-        btParams.setRepo(coordinates.getRepo());
-        btParams.setPackageId(coordinates.getPkg());
-        btParams.setVersion(coordinates.getVersion());
-        btParams.setPath(coordinates.getPath());
-        btParams.setPackageType(coordinates.type.name());
-        try {
-            getBintrayService().savePropertiesOnRepoPath(pathToWrite, btParams);
-        } catch (Exception e) {
-            status.warn("Error setting Bintray coordinates as properties on path " + pathToWrite,
-                    HttpStatus.SC_BAD_REQUEST, log);
-        }
-    }
-
-    public Bintray getClient() {
-        return client;
-    }
-
-    /**
-     * @return A VersionHandle for the version that will be created in Bintray for these {@param coordinates}, will
-     * get or create the repo, package and version if needed.
-     */
-    private VersionHandle getOrCreateVersionForCoordinates(boolean overrideExistingVersions, BintrayUploadInfo uploadInfo,
-            SubjectHandle subject, BasicStatusHolder status) throws Exception {
-        RepositoryHandle btRepo = getOrCreateRepo(uploadInfo.getRepositoryDetails(), subject, status);
-        //pkg defaults are only for creation, we don't override
-        PackageHandle btPkg = getOrCreatePackage(uploadInfo.getPackageDetails(), btRepo, status, false);
-        return getOrCreateVersion(uploadInfo.getVersionDetails(), btPkg, status, overrideExistingVersions);
-    }
-
-    /**
-     * @return A VersionHandle for the version that will be created in Bintray for these {@param coordinates}, will
-     * only get or create the repo as the package and version are created by the Bintray Docker Pusher.
-     */
-    private VersionHandle getDockerVersion(BintrayUploadInfo uploadInfo, SubjectHandle subject, BasicStatusHolder status) throws Exception {
-        //For Docker, only need to create repo, package and version are created by the docker pusher later.
-        RepositoryHandle btRepo = getOrCreateRepo(uploadInfo.getRepositoryDetails(), subject, status);
-        return btRepo.pkg(uploadInfo.getPackageDetails().getName()).version(uploadInfo.getVersionDetails().getName());
-    }
-
-    private Bintray createClient() {
-        return createBintrayClient(new HttpClientConfigurator()
-                .hostFromUrl(getBaseBintrayApiUrl())
-                .soTimeout(ConstantValues.bintrayClientDistributionRequestTimeout.getInt())
-                .connectionTimeout(ConstantValues.bintrayClientDistributionRequestTimeout.getInt())
-                .noRetry()
-                .proxy(getProxy())
-                .maxTotalConnections(30)
-                .defaultMaxConnectionsPerHost(30)
-                .enableTokenAuthentication(true, getKey(), new BintrayBearerPreemptiveAuthInterceptor(getKey()))
-                .getClient());
-    }
-
-    private Bintray createBintrayClient(CloseableHttpClient httpClient) {
-        return BintrayClient.create(httpClient, PathUtils.trimTrailingSlashes(getBaseBintrayApiUrl()),
-                ConstantValues.bintrayClientThreadPoolSize.getInt(),
-                ConstantValues.bintrayClientSignRequestTimeout.getInt());
-    }
-
-    private String getBaseBintrayApiUrl() {
-        return PathUtils.addTrailingSlash(ConstantValues.bintrayApiUrl.getString());
-    }
-
-    private ProxyDescriptor getProxy() {
-        return getDescriptor().getProxy();
-    }
-
-    private DistributionService getDistService() {
-        return ContextHelper.get().beanForType(DistributionService.class);
-    }
-
-    private BintrayService getBintrayService() {
-        return ContextHelper.get().beanForType(BintrayService.class);
-    }
-
-    private InputStream getArtifactInputStream(DistributionCoordinatesResolver coordinates) {
-        return getRepositoryService().getResourceStreamHandle(coordinates.artifactPath).getInputStream();
-    }
-
-    private void handleException(Exception e, String errMsg, BasicStatusHolder status) {
-        if (e instanceof BintrayCallException) {
-            handleBintrayException((BintrayCallException) e, errMsg, status);
-        } else {
-            handleGeneralException(e, errMsg, status);
-        }
-    }
-
-    private void handleGeneralException(Exception e, String err, BasicStatusHolder status) {
-        log.debug(err, e);
-        //Might be a wrapped Bintray Exception thrown by the token provider
-        Throwable btCause = ExceptionUtils.getCauseOfTypes(e, BintrayCallException.class);
-        if (btCause != null) {
-            BintrayCallException bce = (BintrayCallException) btCause;
-            status.error(err + e.getMessage() + " - " + bce.toString(), bce.getStatusCode(), log);
-        } else {
-            status.error(err + e.getMessage(), log);
-        }
-    }
-
-    private void handleBintrayException(BintrayCallException bce, String err, BasicStatusHolder status) {
-        log.debug(err, bce);
-        status.error(err + bce.toString(), bce.getStatusCode(), log);
-    }
-
-    /**
-     * Identifies a user error that will cause all artifacts that are distributed to a version {@param versionResolvers}
-     * to be deployed to the exact same path.
-     */
-    private boolean versionDistributesAllArtifactsToSamePath(Collection<DistributionCoordinatesResolver> versionResolvers) {
-        long distinctPaths = versionResolvers.stream()
-                .map(DistributionCoordinatesResolver::getPath)
-                .distinct()
-                .count();
-        //Less distinct paths then all paths --> there were duplicate paths
-        return (distinctPaths < versionResolvers.size()) && versionResolvers.size() > 1;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/EagerResourcesDownloader.java b/backend/core/src/main/java/org/artifactory/repo/EagerResourcesDownloader.java
deleted file mode 100644
index 927b6cb..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/EagerResourcesDownloader.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.Async;
-import org.artifactory.api.request.DownloadService;
-import org.artifactory.api.request.InternalArtifactoryRequest;
-import org.artifactory.request.InternalArtifactoryResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-
-/**
- * This job creates an internal request asking Artifactory to download certain resource(s).
- *
- * @author Yossi Shaul
- */
- at Component
-public class EagerResourcesDownloader {
-    private static final Logger log = LoggerFactory.getLogger(EagerResourcesDownloader.class);
-
-    @Async
-    public void downloadAsync(RepoPath eagerRepoPath) {
-        InternalArtifactoryRequest internalRequest = new InternalArtifactoryRequest(eagerRepoPath);
-        downloadNow(eagerRepoPath, internalRequest);
-    }
-
-    public void downloadNow(RepoPath repoPath, InternalArtifactoryRequest internalRequest) {
-        InternalArtifactoryResponse internalResponse = new InternalArtifactoryResponse();
-        DownloadService downloadService = ContextHelper.get().beanForType(DownloadService.class);
-        log.debug("Eager fetching path {}", repoPath);
-        try {
-            downloadService.process(internalRequest, internalResponse);
-        } catch (IOException e) {
-            // ignore - will be logged by the download service
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/HttpRepo.java b/backend/core/src/main/java/org/artifactory/repo/HttpRepo.java
deleted file mode 100644
index bbdec3c..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/HttpRepo.java
+++ /dev/null
@@ -1,1174 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.*;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpHead;
-import org.apache.http.client.methods.HttpRequestBase;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.client.utils.DateUtils;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.protocol.HttpContext;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.LayoutsCoreAddon;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.addon.plugin.PluginsAddon;
-import org.artifactory.addon.plugin.RemoteRequestCtx;
-import org.artifactory.addon.plugin.download.AfterRemoteDownloadAction;
-import org.artifactory.addon.plugin.download.BeforeRemoteDownloadAction;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.exception.FileExpectedException;
-import org.artifactory.api.request.InternalArtifactoryRequest;
-import org.artifactory.api.storage.StorageUnit;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.repo.HttpRepoDescriptor;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.io.NullResourceStreamHandle;
-import org.artifactory.io.RemoteResourceStreamHandle;
-import org.artifactory.md.Properties;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.repo.remote.browse.*;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.request.*;
-import org.artifactory.resource.RemoteRepoResource;
-import org.artifactory.resource.ResourceStreamHandle;
-import org.artifactory.resource.UnfoundRepoResource;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.traffic.TrafficService;
-import org.artifactory.util.*;
-import org.iostreams.streams.in.BandwidthMonitorInputStream;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nullable;
-import javax.annotation.concurrent.GuardedBy;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-import java.net.URLDecoder;
-import java.net.URLEncoder;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import static org.apache.http.HttpHeaders.ACCEPT_ENCODING;
-import static org.artifactory.request.ArtifactoryRequest.ARTIFACTORY_ORIGINATED;
-import static org.artifactory.request.ArtifactoryRequest.ORIGIN_ARTIFACTORY;
-
-public class HttpRepo extends RemoteRepoBase<HttpRepoDescriptor> {
-    private static final Logger log = LoggerFactory.getLogger(HttpRepo.class);
-
-    private static final boolean REQUEST_SENT_RETRY_ENABLED = false;
-    private static final int RETRY_COUNT = 1;
-
-    protected RemoteRepositoryBrowser remoteBrowser;
-    @Nullable
-    private CloseableHttpClient client;
-    private boolean handleGzipResponse;
-    private LayoutsCoreAddon layoutsCoreAddon;
-
-    @GuardedBy("offlineCheckerSync")
-    private Thread onlineMonitorThread;
-    private Object onlineMonitorSync = new Object();
-    private Boolean s3Repository;
-
-    public HttpRepo(HttpRepoDescriptor descriptor, InternalRepositoryService repositoryService,
-            boolean globalOfflineMode, RemoteRepo oldRemoteRepo) {
-        super(descriptor, repositoryService, globalOfflineMode, oldRemoteRepo);
-        AddonsManager addonsManager = InternalContextHelper.get().beanForType(AddonsManager.class);
-        layoutsCoreAddon = addonsManager.addonByType(LayoutsCoreAddon.class);
-    }
-
-    private static long getLastModified(HttpResponse response) {
-        Header lastModifiedHeader = response.getFirstHeader(HttpHeaders.LAST_MODIFIED);
-        if (lastModifiedHeader == null) {
-            return -1;
-        }
-        String lastModifiedString = lastModifiedHeader.getValue();
-        //try {
-        Date lastModifiedDate = DateUtils.parseDate(lastModifiedString);
-        if (lastModifiedDate != null) {
-            return lastModifiedDate.getTime();
-        } else {
-            log.warn("Unable to parse Last-Modified header : " + lastModifiedString);
-            return System.currentTimeMillis();
-        }
-    }
-
-    private static String getEtag(HttpResponse response) {
-        Header etagHeader = response.getFirstHeader(HttpHeaders.ETAG);
-        if (etagHeader == null) {
-            return "";
-        }
-        return etagHeader.getValue();
-    }
-
-    private static Set<ChecksumInfo> getChecksums(HttpResponse response) {
-        Set<ChecksumInfo> remoteChecksums = Sets.newHashSet();
-
-        ChecksumInfo md5ChecksumInfo = getChecksumInfoObject(ChecksumType.md5,
-                response.getFirstHeader(ArtifactoryRequest.CHECKSUM_MD5));
-        if (md5ChecksumInfo != null) {
-            remoteChecksums.add(md5ChecksumInfo);
-        }
-
-        ChecksumInfo sha1ChecksumInfo = getChecksumInfoObject(ChecksumType.sha1,
-                response.getFirstHeader(ArtifactoryRequest.CHECKSUM_SHA1));
-        if (sha1ChecksumInfo != null) {
-            remoteChecksums.add(sha1ChecksumInfo);
-        }
-
-        return remoteChecksums;
-    }
-
-    private static ChecksumInfo getChecksumInfoObject(ChecksumType type, Header checksumHeader) {
-        if (checksumHeader == null) {
-            return null;
-        }
-
-        return new ChecksumInfo(type, checksumHeader.getValue(), null);
-    }
-
-    @Override
-    public void init() {
-        super.init();
-        // TODO: This flag should be in the remote repo descriptor
-        handleGzipResponse = ConstantValues.httpAcceptEncodingGzip.getBoolean();
-        if (!isOffline()) {
-            this.client = createHttpClient();
-        }
-    }
-
-    private synchronized void initRemoteRepositoryBrowser() {
-        if (remoteBrowser != null) {
-            return; // already initialized
-        }
-        HttpExecutor clientExec = new HttpExecutor() {
-            @Override
-            public CloseableHttpResponse executeMethod(HttpRequestBase method) throws IOException {
-                return HttpRepo.this.executeMethod(method);
-            }
-        };
-        s3Repository = S3RepositoryBrowser.isS3Repository(getUrl(), getHttpClient());
-        if (s3Repository) {
-            log.debug("Repository {} caches S3 repository", getKey());
-            remoteBrowser = new S3RepositoryBrowser(clientExec, this);
-        } else {
-            remoteBrowser = new HtmlRepositoryBrowser(clientExec);
-        }
-    }
-
-    @Override
-    public void destroy() {
-        cleanupResources();
-        super.destroy();
-        if (client != null) {
-            IOUtils.closeQuietly(client);
-        }
-    }
-
-    @Override
-    public void cleanupResources() {
-        stopOfflineCheckThread();
-    }
-
-    public String getUsername() {
-        return getDescriptor().getUsername();
-    }
-
-    public String getPassword() {
-        return getDescriptor().getPassword();
-    }
-
-    public boolean isAllowAnyHostAuth() {
-        return getDescriptor().isAllowAnyHostAuth();
-    }
-
-    public boolean isEnableTokenAuthentication() {
-        return getDescriptor().isEnableTokenAuthentication();
-    }
-
-    public boolean isEnableCookieManagement() {
-        return getDescriptor().isEnableCookieManagement();
-    }
-
-    public int getSocketTimeoutMillis() {
-        return getDescriptor().getSocketTimeoutMillis();
-    }
-
-    public String getLocalAddress() {
-        return getDescriptor().getLocalAddress();
-    }
-
-    public ProxyDescriptor getProxy() {
-        return getDescriptor().getProxy();
-    }
-
-    @Override
-    public ResourceStreamHandle conditionalRetrieveResource(String relPath, boolean forceRemoteDownload)
-            throws IOException {
-        //repo1 does not respect conditional get so the following is irrelevant for now.
-        /*
-        Date modifiedSince;
-        if (modifiedSince != null) {
-            //Add the if modified since
-            String formattedDate = DateUtil.formatDate(modifiedSince);
-            method.setRequestHeader("If-Modified-Since", formattedDate);
-        }
-        if (statusCode == HttpStatus.SC_NOT_MODIFIED) {
-            return new NullResourceStreamHandle();
-        }
-        */
-        //Need to do a conditional get by hand - testing a head result last modified date against the current file
-        if (!forceRemoteDownload && isStoreArtifactsLocally()) {
-            RepoResource cachedResource = getCachedResource(relPath);
-            if (cachedResource.isFound()) {
-                if (cachedResource.isExpired()) {
-                    //Send HEAD
-                    RepoResource resource = retrieveInfo(relPath, false/*The relPath refers to files (.gz)*/, null);
-                    if (resource.isFound()) {
-                        if (cachedResource.getLastModified() > resource.getLastModified()) {
-                            return new NullResourceStreamHandle();
-                        }
-                    }
-                } else {
-                    return new NullResourceStreamHandle();
-                }
-            }
-        }
-        //Do GET
-        return downloadResource(relPath);
-    }
-
-    @Override
-    public ResourceStreamHandle downloadResource(String relPath) throws IOException {
-        return downloadResource(relPath, new NullRequestContext(getRepoPath(relPath)));
-    }
-
-    @Override
-    public ResourceStreamHandle downloadResource(final String relPath, final RequestContext requestContext)
-            throws IOException {
-        assert !isOffline() : "Should never be called in offline mode";
-        String pathForUrl = convertRequestPathIfNeeded(relPath);
-        if (!relPath.equals(pathForUrl)) {
-            RepoRequests.logToContext("Remote resource path was translated (%s) due to repository " +
-                    "layout differences", pathForUrl);
-        }
-        Request request = requestContext.getRequest();
-        if (request != null) {
-            String alternativeRemoteDownloadUrl =
-                    request.getParameter(ArtifactoryRequest.PARAM_ALTERNATIVE_REMOTE_DOWNLOAD_URL);
-            if (StringUtils.isNotBlank(alternativeRemoteDownloadUrl)) {
-                RepoRequests.logToContext("Request contains alternative remote resource path ({}=%s)",
-                        ArtifactoryRequest.PARAM_ALTERNATIVE_REMOTE_DOWNLOAD_URL, alternativeRemoteDownloadUrl);
-                pathForUrl = alternativeRemoteDownloadUrl;
-            }
-        }
-
-        RepoRequests.logToContext("Appending matrix params to remote request URL");
-        pathForUrl += buildRequestMatrixParams(requestContext.getProperties());
-        final String fullUrl = appendAndGetUrl(convertRequestPathIfNeeded(pathForUrl));
-        String encodedUrl = encodeIfNeeded(fullUrl, requestContext);
-        String urlWithParams = addQueryParams(encodedUrl, requestContext);
-
-        RepoRequests.logToContext("Using remote request URL - %s", urlWithParams);
-        AddonsManager addonsManager = InternalContextHelper.get().beanForType(AddonsManager.class);
-        final PluginsAddon pluginAddon = addonsManager.addonByType(PluginsAddon.class);
-
-        final RepoPath repoPath = InternalRepoPathFactory.create(getKey(), pathForUrl);
-        final Request requestForPlugins = requestContext.getRequest();
-        RepoRequests.logToContext("Executing any BeforeRemoteDownload user plugins that may exist");
-        RemoteRequestCtx remoteRequestCtx = new RemoteRequestCtx();
-        pluginAddon.execPluginActions(BeforeRemoteDownloadAction.class, remoteRequestCtx, requestForPlugins, repoPath);
-        HttpGet method = new HttpGet(urlWithParams);
-        Map<String, String> headers = Maps.newHashMap(whiteListHeaders(requestContext));
-        headers.putAll(remoteRequestCtx.getHeaders());
-        notifyInterceptorsOnBeforeRemoteHttpMethodExecution(method, headers);
-        RepoRequests.logToContext("Executing GET request to %s", urlWithParams);
-        final CloseableHttpResponse response = executeMethod(method, headers);
-
-        StatusLine statusLine = response.getStatusLine();
-        int statusCode = statusLine.getStatusCode();
-        if (statusCode == HttpStatus.SC_NOT_FOUND) {
-            //Not found
-            IOUtils.closeQuietly(response);
-            RepoRequests.logToContext("Received response status %s - throwing exception", statusLine);
-            throw new RemoteRequestException("Unable to find " + urlWithParams, statusCode, statusLine.getReasonPhrase());
-        }
-        if (statusCode != HttpStatus.SC_OK) {
-            IOUtils.closeQuietly(response);
-            RepoRequests.logToContext("Received response status %s - throwing exception", statusLine);
-            throw new RemoteRequestException("Error fetching " + urlWithParams, statusCode, statusLine.getReasonPhrase());
-        }
-        blockMismatchingMimeTypes(requestContext.getRequest(), response, fullUrl);
-        //Found
-        long contentLength = HttpUtils.getContentLength(response);
-        logDownloading(urlWithParams, contentLength);
-        RepoRequests.logToContext("Downloading content");
-
-        final InputStream is = response.getEntity().getContent();
-        verifyContentEncoding(response);
-        return new TrafficAwareRemoteResourceStreamHandle(response, urlWithParams, requestForPlugins, pluginAddon,
-                repoPath, is);
-    }
-
-    private String encodeIfNeeded(String fullUrl, RequestContext requestContext) {
-        boolean skipEncoding = false;
-        if (requestContext != null) {
-            String skipEncodingParam = requestContext.getRequest().getParameter(ArtifactoryRequest.PARAM_SKIP_ENCODING);
-            skipEncoding = StringUtils.isNotBlank(skipEncodingParam) && Boolean.valueOf(skipEncodingParam);
-        }
-
-        String url = skipEncoding ? fullUrl : HttpUtils.encodeQuery(fullUrl);
-        if (StringUtils.contains(url, "+")) {
-            if (s3Repository == null) {
-                initRemoteRepositoryBrowser();
-            }
-            if (s3Repository) {
-                url = url.replace("+", "%2B");
-            }
-        }
-        return url;
-    }
-
-    /**
-     * Collects InternalArtifactoryRequest headers (explicitly allowed for delegation) to the remote server,
-     *
-     * @param requestContext
-     * @return Map<String, String>
-     * @see {@link org.artifactory.api.request.InternalArtifactoryRequest#getDelegationAllowedHeaders()}
-     */
-    private Map<String, String> whiteListHeaders(RequestContext requestContext) {
-        Map<String, String> whiteListedHeaders = Maps.newHashMap();
-        Request request = requestContext.getRequest();
-        if (request instanceof InternalArtifactoryRequest) {
-            Set<String> set = ((InternalArtifactoryRequest) request).getDelegationAllowedHeaders();
-            for (Map.Entry<String, String> header :
-                    requestContext.getRequest().getHeaders().entrySet()) {
-                if (set.contains(header.getKey())) {
-                    whiteListedHeaders.put(header.getKey(), header.getValue());
-                }
-            }
-        }
-        return whiteListedHeaders;
-    }
-
-    private void verifyContentEncoding(HttpResponse response) throws IOException {
-        if (!ConstantValues.httpAcceptEncodingGzip.getBoolean() && response.getEntity() != null) {
-            Header[] contentEncodings = response.getHeaders(HttpHeaders.CONTENT_ENCODING);
-            for (Header contentEncoding : contentEncodings) {
-                if ("gzip".equalsIgnoreCase(contentEncoding.getValue())) {
-                    throw new IOException("Received gzip encoded stream while gzip compressions is disabled");
-                }
-            }
-        }
-    }
-
-    private void logDownloading(String fullUrl, long contentLength) {
-        if (NamingUtils.isChecksum(fullUrl)) {
-            log.debug("{} downloading {} {} ", this, fullUrl,
-                    contentLength >= 0 ? StorageUnit.toReadableString(contentLength) : "Unknown content length");
-        } else {
-            log.info("{} downloading {} {} ", this, fullUrl,
-                    contentLength >= 0 ? StorageUnit.toReadableString(contentLength) : "Unknown content length");
-        }
-    }
-
-    private void logDownloaded(String fullUrl, int status, BandwidthMonitorInputStream bmis) {
-        String statusMsg = status == 200 ? "" : "status='" + (status > 0 ? status : "unknown") + "' ";
-        String summary =
-                statusMsg + StorageUnit.toReadableString(bmis.getTotalBytesRead()) + " at " +
-                        StorageUnit.format(StorageUnit.KB.fromBytes(bmis.getBytesPerSec())) + " KB/sec";
-        if (NamingUtils.isChecksum(fullUrl)) {
-            log.debug("{} downloaded  {} {}", this, fullUrl, summary);
-        } else {
-            log.info("{} downloaded  {} {}", this, fullUrl, summary);
-        }
-    }
-
-    /**
-     * Executes an HTTP method using the repository client and returns the http response. This method allows to override
-     * some of the default headers, note that the ARTIFACTORY_ORIGINATED, the ORIGIN_ARTIFACTORY and the ACCEPT_ENCODING
-     * can't be overridden The caller to this class is responsible to close the response.
-     *
-     * @param method       Method to execute
-     * @param extraHeaders Extra headers to add to the remote server request
-     * @return The http response.
-     * @throws IOException If the repository is offline or if any error occurs during the execution
-     */
-    public CloseableHttpResponse executeMethod(HttpRequestBase method, Map<String, String> extraHeaders)
-            throws IOException {
-        return this.executeMethod(method, null, extraHeaders);
-    }
-
-    /**
-     * Executes an HTTP method using the repository client and returns the http response. The caller to this class is
-     * responsible to close the response.
-     *
-     * @param method Method to execute
-     * @return The http response.
-     * @throws IOException If the repository is offline or if any error occurs during the execution
-     */
-    public CloseableHttpResponse executeMethod(HttpRequestBase method) throws IOException {
-        return executeMethod(method, null, null);
-    }
-
-    /**
-     * Executes an HTTP method using the repository client and returns the http response. The caller to this class is
-     * responsible to close the response.
-     *
-     * @param method  Method to execute
-     * @param context The request context for execution state
-     * @return The http response.
-     * @throws IOException If the repository is offline or if any error occurs during the execution
-     */
-    public CloseableHttpResponse executeMethod(HttpRequestBase method, @Nullable HttpContext context)
-            throws IOException {
-        return executeMethod(method, context, null);
-    }
-
-    /**
-     * Executes an HTTP method using the repository client and returns the http response. This method allows to override
-     * some of the default headers, note that the ARTIFACTORY_ORIGINATED, the ORIGIN_ARTIFACTORY and the ACCEPT_ENCODING
-     * can't be overridden The caller to this class is responsible to close the response.
-     *
-     * @param method       Method to execute
-     * @param context      The request context for execution state
-     * @param extraHeaders Extra headers to add to the remote server request
-     * @return The http response.
-     * @throws IOException If the repository is offline or if any error occurs during the execution
-     */
-    private CloseableHttpResponse doExecuteMethod(HttpRequestBase method, @Nullable HttpContext context,
-            Map<String, String> extraHeaders)
-            throws IOException {
-        addDefaultHeadersAndQueryParams(method, extraHeaders);
-        return getHttpClient().execute(method, context);
-    }
-
-    /**
-     * Executes an HTTP method using the repository client and returns the http response. This method allows to override
-     * some of the default headers, note that the ARTIFACTORY_ORIGINATED, the ORIGIN_ARTIFACTORY and the ACCEPT_ENCODING
-     * can't be overridden The caller to this class is responsible to close the response.
-     *
-     * @param method       Method to execute
-     * @param context      The request context for execution state
-     * @param extraHeaders Extra headers to add to the remote server request
-     * @return The http response.
-     * @throws IOException If the repository is offline or if any error occurs during the execution
-     */
-    public final CloseableHttpResponse executeMethod(HttpRequestBase method, @Nullable HttpContext context,
-            Map<String, String> extraHeaders)
-            throws IOException {
-        return interceptResponse(doExecuteMethod(method, context, extraHeaders));
-    }
-
-    @Override
-    protected RepoResource retrieveInfo(String path, boolean folder, @Nullable RequestContext requestContext) {
-        assert !isOffline() : "Should never be called in offline mode";
-        RepoPath repoPath = InternalRepoPathFactory.create(this.getKey(), path, folder);
-
-        String fullUrl = assembleRetrieveInfoUrl(path, requestContext);
-        String encodedUrl = encodeIfNeeded(fullUrl, requestContext);
-        //TODO: [by yl] Ideally do this in #assembleRetrieveInfoUrl, but encodedUrl full URL brute force encoding
-        //breaks pre-encoded query params
-        String urlWithParams = addQueryParams(encodedUrl, requestContext);
-
-        // TODO: [by sy] check if we can append the whiteList headers here too
-        Map<String, String> headers = Maps.newHashMap();
-        HttpRequestBase method;
-        boolean replaceHeadWithGet = false;
-        String methodType = "HEAD";
-        if (requestContext != null && StringUtils.isNotBlank(requestContext.getRequest().getParameter(
-                ArtifactoryRequest.PARAM_REPLACE_HEAD_IN_RETRIEVE_INFO_WITH_GET))) {
-            replaceHeadWithGet = Boolean.valueOf(requestContext.getRequest().getParameter(
-                    ArtifactoryRequest.PARAM_REPLACE_HEAD_IN_RETRIEVE_INFO_WITH_GET));
-        }
-        if (replaceHeadWithGet) {
-            log.debug("Param " + ArtifactoryRequest.PARAM_REPLACE_HEAD_IN_RETRIEVE_INFO_WITH_GET + " found in request" +
-                    " context, switching HEAD with GET request");
-            methodType = "GET";
-            method = new HttpGet(urlWithParams);
-        } else {
-            method = new HttpHead(urlWithParams);
-        }
-        RepoRequests.logToContext("Executing %s request to %s", methodType, urlWithParams);
-        CloseableHttpResponse response = null;
-        try {
-            HttpClientContext httpClientContext = new HttpClientContext();
-            notifyInterceptorsOnBeforeRemoteHttpMethodExecution(method, headers);
-            response = executeMethod(method, httpClientContext, headers);
-            return handleGetInfoResponse(repoPath, method, fullUrl, response, httpClientContext, requestContext);
-        } catch (IOException e) {
-            String exceptionMessage = HttpClientUtils.getErrorMessage(e);
-            RepoRequests.logToContext("Failed to execute %s request: %s", methodType, exceptionMessage);
-            throw new RuntimeException("Failed retrieving resource from " + urlWithParams + ": " + exceptionMessage, e);
-        } finally {
-            IOUtils.closeQuietly(response);
-        }
-    }
-
-    private String addQueryParams(String fullUrl, @Nullable RequestContext context) {
-        if (context == null) {
-            return fullUrl;
-        }
-        if (getDescriptor().isPropagateQueryParams()) {
-            RepoRequests.logToContext("Appending query params to remote request URL");
-            //TODO: [by YL] support multival params
-            Map<String, String[]> params = context.getRequest().getParameters();
-            String queryParamsString = params.entrySet().stream()
-                    .map(e -> e.getKey() + "=" + (e.getValue() != null ? urlEncode(e.getValue()[0]) : ""))
-                    .collect(Collectors.joining("&", "?", ""));
-            fullUrl += queryParamsString;
-        }
-        return fullUrl;
-    }
-
-    protected String assembleRetrieveInfoUrl(String path, RequestContext context) {
-        String pathForUrl = convertRequestPathIfNeeded(path);
-        if (!path.equals(pathForUrl)) {
-            RepoRequests.logToContext("Remote resource path was translated (%s) due to repository " +
-                    "layout differences", pathForUrl);
-        }
-        boolean validContext = context != null;
-        if (validContext) {
-            Request request = context.getRequest();
-            if (request != null) {
-                String alternativeRemoteDownloadUrl =
-                        request.getParameter(ArtifactoryRequest.PARAM_ALTERNATIVE_REMOTE_DOWNLOAD_URL);
-                if (StringUtils.isNotBlank(alternativeRemoteDownloadUrl)) {
-                    RepoRequests.logToContext("Request contains alternative remote resource path ({}=%s)",
-                            ArtifactoryRequest.PARAM_ALTERNATIVE_REMOTE_DOWNLOAD_URL, alternativeRemoteDownloadUrl);
-                    pathForUrl = alternativeRemoteDownloadUrl;
-                }
-            }
-        }
-
-        String fullUrl = appendAndGetUrl(pathForUrl);
-        if (validContext) {
-            RepoRequests.logToContext("Appending matrix params to remote request URL");
-            Properties properties = context.getProperties();
-            fullUrl += buildRequestMatrixParams(properties);
-        }
-        RepoRequests.logToContext("Using remote request URL - %s", fullUrl);
-        return fullUrl;
-    }
-
-    /**
-     * Notice: for use with HEAD method, no content is expected in the response. Process the remote repository's
-     * response and construct a repository resource.
-     *
-     * @param repoPath       of requested resource
-     * @param method         executed {@link org.apache.http.client.methods.HttpHead} from which to process the
-     *                       response.
-     * @param downloadUrl    Original download url (not encoded, without url params) for mime type verification
-     * @param response       The response to the get info request
-     * @param context
-     * @param requestContext
-     * @return
-     */
-    protected RepoResource handleGetInfoResponse(RepoPath repoPath, HttpRequestBase method, String downloadUrl,
-            CloseableHttpResponse response, @Nullable HttpClientContext context, RequestContext requestContext) {
-        int statusCode = response.getStatusLine().getStatusCode();
-        if (statusCode == HttpStatus.SC_NOT_FOUND) {
-            RepoRequests.logToContext("Received status 404 (message: %s) on remote info request - returning unfound " +
-                    "resource", response.getStatusLine().getReasonPhrase());
-            return new UnfoundRepoResource(repoPath, response.getStatusLine().getReasonPhrase());
-        }
-
-        if (!isDisableFolderRedirectAssertion(requestContext)) {
-            assertNoRedirectToFolder(repoPath, context);
-        }
-
-        // Some servers may return 204 instead of 200
-        if (statusCode != HttpStatus.SC_OK && statusCode != HttpStatus.SC_NO_CONTENT) {
-            RepoRequests.logToContext("Received status {} (message: %s) on remote info request - returning unfound " +
-                    "resource", statusCode, response.getStatusLine().getReasonPhrase());
-            // send back unfound resource with 404 status
-            return new UnfoundRepoResource(repoPath, response.getStatusLine().getReasonPhrase());
-        }
-
-        long lastModified = getLastModified(response);
-        RepoRequests.logToContext("Found remote resource with last modified time - %s",
-                new Date(lastModified).toString());
-
-        String etag = getEtag(response);
-        RepoRequests.logToContext("Found remote resource with ETag - %s", etag);
-
-        long contentLength = HttpUtils.getContentLength(response);
-        if (contentLength != -1) {
-            RepoRequests.logToContext("Found remote resource with content length - %s", contentLength);
-        }
-
-        // if status is 204 and length is not 0 then the remote server is doing something wrong
-        if (statusCode == HttpStatus.SC_NO_CONTENT && contentLength > 0) {
-            // send back unfound resource with 404 status
-            RepoRequests.logToContext("Received status {} (message: %s) on remote info request - returning unfound " +
-                    "resource", statusCode, response.getStatusLine().getReasonPhrase());
-            return new UnfoundRepoResource(repoPath, response.getStatusLine().getReasonPhrase());
-        }
-        try {
-            blockMismatchingMimeTypes(requestContext != null ? requestContext.getRequest() : null, response, downloadUrl);
-        } catch (RemoteRequestException rre) {
-            //Mismatching mime types detected and blocked
-            return addRejectedResourceToMissedCache(repoPath, rre.getMessage(), rre.getRemoteReturnCode());
-        }
-        Set<ChecksumInfo> checksums = getChecksums(response);
-        if (!checksums.isEmpty()) {
-            RepoRequests.logToContext("Found remote resource with checksums - %s", checksums);
-        }
-
-        String originalPath = repoPath.getPath();
-        String filename = getFilename(method, originalPath);
-        if (StringUtils.isNotBlank(filename)) {
-            RepoRequests.logToContext("Found remote resource with filename header - %s", filename);
-            if (NamingUtils.isMetadata(originalPath)) {
-                String originalPathStrippedOfMetadata = NamingUtils.getMetadataParentPath(originalPath);
-                String originalPathWithMetadataNameFromHeader =
-                        NamingUtils.getMetadataPath(originalPathStrippedOfMetadata, filename);
-                repoPath = InternalRepoPathFactory.create(repoPath.getRepoKey(),
-                        originalPathWithMetadataNameFromHeader);
-            } else {
-                repoPath = InternalRepoPathFactory.create(repoPath.getParent(), filename);
-            }
-        }
-
-        RepoRequests.logToContext("Returning found remote resource info");
-        return new RemoteRepoResource(repoPath, lastModified, etag, contentLength, checksums, response.getAllHeaders());
-    }
-
-    private boolean isDisableFolderRedirectAssertion(RequestContext context) {
-        if (context != null) {
-            String disableFolderRedirectAssertion = context.getRequest().getParameter(
-                    ArtifactoryRequest.PARAM_FOLDER_REDIRECT_ASSERTION);
-            if (StringUtils.isNotBlank(disableFolderRedirectAssertion) && Boolean.valueOf(
-                    disableFolderRedirectAssertion)) {
-                // Do not perform in case of parameter provided
-                RepoRequests.logToContext("Folder redirect assertion is disabled for internal download request");
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    private void assertNoRedirectToFolder(RepoPath repoPath, HttpClientContext context) {
-        if (context != null) {
-            // if redirected, check that the last redirect URL doesn't end with '/' (we assume those are directory paths)
-            List<URI> redirects = context.getRedirectLocations();
-            if (CollectionUtils.notNullOrEmpty(redirects)) {
-                URI lastDestination = redirects.get(redirects.size() - 1);
-                if (lastDestination != null && lastDestination.getPath().endsWith("/")) {
-                    RepoRequests.logToContext(
-                            "Remote info request was redirected to a directory - returning unfound resource");
-                    throw new FileExpectedException(new RepoPathImpl(repoPath.getRepoKey(), repoPath.getPath(), true));
-                }
-            }
-        }
-    }
-
-    protected CloseableHttpClient createHttpClient() {
-        String password = CryptoHelper.decryptIfNeeded(getPassword());
-        return new HttpClientConfigurator()
-                .hostFromUrl(getUrl())
-                .connectionTimeout(getSocketTimeoutMillis())
-                .soTimeout(getSocketTimeoutMillis())
-                .handleGzipResponse(handleGzipResponse)
-                .retry(RETRY_COUNT, REQUEST_SENT_RETRY_ENABLED)
-                .localAddress(getLocalAddress())
-                .proxy(getProxy())
-                .authentication(getUsername(), password, isAllowAnyHostAuth())
-                .enableCookieManagement(isEnableCookieManagement())
-                .enableTokenAuthentication(isEnableTokenAuthentication(), getKey(), null)
-                .getClient();
-    }
-
-    private RepoResource getCachedResource(String relPath) {
-        LocalCacheRepo cache = getLocalCacheRepo();
-        final NullRequestContext context = new NullRequestContext(getRepoPath(relPath));
-        RepoResource cachedResource = cache.getInfo(context);
-        return cachedResource;
-    }
-
-    /**
-     * Adds default headers and extra headers to the HttpRequest method The extra headers are unique headers that should
-     * be added to the remote server request according to special requirement example : user adds extra headers through
-     * the User Plugin (BeforeRemoteDownloadAction)
-     *
-     * @param method       Method to execute
-     * @param extraHeaders Extra headers to add to the remote server request
-     */
-    @SuppressWarnings({"deprecation"})
-    private void addDefaultHeadersAndQueryParams(HttpRequestBase method, Map<String, String> extraHeaders) {
-        //Explicitly force keep alive
-        method.setHeader(HttpHeaders.CONNECTION, "Keep-Alive");
-
-        //Add the current requester host id
-        Set<String> originatedHeaders = RepoRequests.getOriginatedHeaders();
-        for (String originatedHeader : originatedHeaders) {
-            method.addHeader(ARTIFACTORY_ORIGINATED, originatedHeader);
-        }
-        String hostId = ContextHelper.get().beanForType(AddonsManager.class).addonByType(
-                HaCommonAddon.class).getHostId();
-        // Add the extra headers to the remote request
-        if (extraHeaders != null) {
-            for (Map.Entry<String, String> entry : extraHeaders.entrySet()) {
-                boolean isReservedKey = ARTIFACTORY_ORIGINATED.equals(entry.getKey()) ||
-                        ORIGIN_ARTIFACTORY.equals(entry.getKey()) ||
-                        ACCEPT_ENCODING.equals(entry.getKey());
-                if (!isReservedKey) {
-                    method.addHeader(entry.getKey(), entry.getValue());
-                }
-            }
-        }
-        // Add the default artifactory headers, those headers will always override the existing headers if they already exist
-        method.addHeader(ARTIFACTORY_ORIGINATED, hostId);
-
-        //For backwards compatibility
-        method.setHeader(ORIGIN_ARTIFACTORY, hostId);
-
-        //Set gzip encoding
-        if (handleGzipResponse) {
-            method.addHeader(ACCEPT_ENCODING, "gzip");
-        }
-
-        // Set custom query params
-        String queryParams = getDescriptor().getQueryParams();
-        if (StringUtils.isNotBlank(queryParams)) {
-            String url = method.getURI().toString();
-            if (url.contains("?")) {
-                url += "&";
-            } else {
-                url += "?";
-            }
-            url += HttpUtils.encodeQuery(queryParams);
-            method.setURI(URI.create(url));
-        }
-    }
-
-    private String getFilename(HttpRequestBase method, String originalPath) {
-        // Skip filename parsing if we are not dealing with latest maven non-unique snapshot request
-        if (!isRequestForLatestMavenSnapshot(originalPath)) {
-            return null;
-        }
-
-        // Try our custom X-Artifactory-Filename header
-        Header filenameHeader = method.getFirstHeader(ArtifactoryRequest.FILE_NAME);
-        if (filenameHeader != null) {
-            String filenameString = filenameHeader.getValue();
-            try {
-                return URLDecoder.decode(filenameString, "UTF-8");
-            } catch (UnsupportedEncodingException e) {
-                log.warn("Unable to decode '{}' header '{}', returning un-encoded value.",
-                        ArtifactoryRequest.FILE_NAME, filenameString);
-                return filenameString;
-            }
-        }
-
-        // Didn't find any filename, return null
-        return null;
-    }
-
-    private boolean isRequestForLatestMavenSnapshot(String originalPath) {
-        if (ConstantValues.requestDisableVersionTokens.getBoolean()) {
-            return false;
-        }
-
-        if (!getDescriptor().isMavenRepoLayout()) {
-            return false;
-        }
-
-        if (!MavenNaming.isNonUniqueSnapshot(originalPath)) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    protected List<RemoteItem> getChildUrls(String dirUrl) throws IOException {
-        if (remoteBrowser == null) {
-            initRemoteRepositoryBrowser();
-        }
-        return remoteBrowser.listContent(dirUrl);
-    }
-
-    /**
-     * Converts the given path to the remote repo's layout if defined
-     *
-     * @param path Path to convert
-     * @return Converted path if required and conversion was successful, given path if not
-     */
-    public String convertRequestPathIfNeeded(String path) {
-        HttpRepoDescriptor descriptor = getDescriptor();
-        return layoutsCoreAddon.translateArtifactPath(descriptor.getRepoLayout(), descriptor.getRemoteRepoLayout(),
-                path);
-    }
-
-    @Override
-    protected void putOffline() {
-        long assumedOfflinePeriodSecs = getDescriptor().getAssumedOfflinePeriodSecs();
-        if (assumedOfflinePeriodSecs <= 0) {
-            return;
-        }
-        // schedule the offline thread to run immediately
-        //scheduler.schedule(new OfflineCheckCallable(), 0, TimeUnit.MILLISECONDS);
-        synchronized (onlineMonitorSync) {
-            if (onlineMonitorThread != null) {
-                if (onlineMonitorThread.isAlive()) {
-                    return;
-                }
-                log.debug("Online monitor thread exists but not alive");
-            }
-            onlineMonitorThread = new Thread(new OnlineMonitorRunnable(), "online-monitor-" + getKey());
-            onlineMonitorThread.setDaemon(true);
-            log.debug("Online monitor starting {}", onlineMonitorThread.getName());
-            onlineMonitorThread.start();
-        }
-    }
-
-    @Override
-    public void resetAssumedOffline() {
-        synchronized (onlineMonitorSync) {
-            log.info("Resetting assumed offline status");
-            stopOfflineCheckThread();
-            assumedOffline.getAndSet(false);
-        }
-    }
-
-    private void stopOfflineCheckThread() {
-        synchronized (onlineMonitorSync) {
-            if (onlineMonitorThread != null) {
-                log.debug("Online monitor stopping {}", onlineMonitorThread.getName());
-                onlineMonitorThread.interrupt();
-                onlineMonitorThread = null;
-            }
-        }
-    }
-
-    protected CloseableHttpClient getHttpClient() {
-        if (client == null) {
-            throw new IllegalStateException("Repo is offline. Cannot use the HTTP client.");
-        }
-        return client;
-    }
-
-    private String urlEncode(String s) {
-        try {
-            return URLEncoder.encode(s, "UTF-8");
-        } catch (UnsupportedEncodingException e) {
-            log.error("Failed to url encode: " + s, e);
-            return s;
-        }
-    }
-
-    private class OnlineMonitorRunnable implements Runnable {
-        /**
-         * max attempts until reaching the maximum wait time
-         */
-        private static final int MAX_FAILED_ATTEMPTS = 10;
-
-        /**
-         * Failed requests counter
-         */
-        private int failedAttempts = 0;
-
-        @Override
-        public void run() {
-            log.debug("Online monitor started for {}", getKey());
-            while (true) {
-                try {
-                    if (Thread.currentThread().isInterrupted()) {
-                        throw new InterruptedException();
-                    }
-                    if (checkOnline()) {
-                        if (assumedOffline.get()) {
-                            log.info("{} is back online!", getKey());
-                        }
-                        assumedOffline.getAndSet(false);
-                        onlineMonitorThread = null;
-                        return;
-                    }
-                    if (!assumedOffline.get()) {
-                        log.info("{} is inaccessible. Setting as offline!", getKey());
-                        assumedOffline.getAndSet(true);
-                    }
-                    long nextOnlineCheckDelay = calculateNextOnlineCheckDelay();
-                    nextOnlineCheckMillis = System.currentTimeMillis() + nextOnlineCheckDelay;
-                    log.debug("Online monitor sleeping for {} millis", nextOnlineCheckDelay);
-                    Thread.sleep(nextOnlineCheckDelay);
-                } catch (InterruptedException e) {
-                    log.debug("Online monitor interrupted");
-                    Thread.interrupted();
-                    return;
-                }
-            }
-        }
-
-        private long calculateNextOnlineCheckDelay() {
-            long maxFailureCacheSecs = getDescriptor().getAssumedOfflinePeriodSecs();
-            long maxFailureCacheMillis = TimeUnit.SECONDS.toMillis(maxFailureCacheSecs);    // always >= 1000
-
-            long nextOnlineCheckDelayMillis;
-            failedAttempts++;
-            if (failedAttempts < MAX_FAILED_ATTEMPTS) {
-                if (maxFailureCacheSecs / MAX_FAILED_ATTEMPTS < 2) {
-                    long failurePenaltyMillis = maxFailureCacheMillis / MAX_FAILED_ATTEMPTS;
-                    nextOnlineCheckDelayMillis = failedAttempts * failurePenaltyMillis;
-                } else {
-                    // exponential delay
-                    // calculate the base of the exponential equation based on the MAX_FAILED_ATTEMPTS and max offline period
-                    // BASE pow MAX_FAILED_ATTEMPTS = MAX_DELAY ==> BASE = MAX_DELAY pow 1/MAX_FAILED_ATTEMPTS
-                    double base = Math.pow(maxFailureCacheMillis, 1.0 / (double) MAX_FAILED_ATTEMPTS);
-                    nextOnlineCheckDelayMillis = (long) Math.pow(base, failedAttempts);
-                    // in any case don't attempt too rapidly
-                    nextOnlineCheckDelayMillis = Math.max(100, nextOnlineCheckDelayMillis);
-                }
-            } else {
-                nextOnlineCheckDelayMillis = maxFailureCacheMillis;
-            }
-            return nextOnlineCheckDelayMillis;
-        }
-
-        private boolean checkOnline() {
-            // always test with url trailing slash
-            String url = PathUtils.addTrailingSlash(getDescriptor().getUrl());
-            HttpGet getMethod = new HttpGet(HttpUtils.encodeQuery(url));
-            try (CloseableHttpResponse response = getHttpClient().execute(getMethod)) {
-                log.debug("Online monitor checking URL: {}", url);
-                StatusLine status = response.getStatusLine();
-                log.debug("Online monitor http method completed with no exception: {}: {}",
-                        status.getStatusCode(), status.getReasonPhrase());
-
-                if (isResourceUnavailable(status)) { //RTFACT-6528
-                    log.debug("Considering as offline due to the return code '{}'", status.getStatusCode());
-                } else {
-                    return true;
-                }
-            } catch (IllegalStateException | IOException e) {
-                // IllegalStateException can be thrown while this tread in race with destroy()
-                // i.e. closed client is accesses before interrupt() takes effect
-                log.debug("Online monitor http method failed: {}: {}", e.getClass().getName(), e.getMessage());
-            }
-            return false;
-        }
-    }
-
-    /**
-     * If this repo has the 'block mismatching mimetypes' flag lit and the request passed along the expected mime type,
-     * verify that the returned mime type matches the expected one.  If no header was passed an attempt is made
-     * to match both types by the requested resource's extension instead.
-     *
-     * If there's a mismatch and the response's mime type is in the repo's block list (either default
-     * {@link ConstantValues#blockedMismatchingMimeTypes} in the system properties or the repo's
-     * {@link org.artifactory.descriptor.repo.RemoteRepoDescriptor#mismatchingMimeTypesOverrideList})
-     * this method will fail the download with Exception.
-     *
-     * @param request      Request to fetch remote resource (whether it came internally or from a client)
-     * @param response     Response from remote resource to match mime type against
-     * @param downloadUrl  For logging
-     *  @throws RemoteRequestException
-     */
-    private void blockMismatchingMimeTypes(@Nullable Request request, CloseableHttpResponse response, String downloadUrl)
-            throws RemoteRequestException {
-        //Found -> check if received mime type matches the requested one
-        if (!shouldVerifyMimeType(response)) {
-            return;
-        }
-        String responseContentType = getMimeTypeFromHeader(response.getFirstHeader(HttpHeaders.CONTENT_TYPE).getValue())
-                .toLowerCase();
-        if(responseContentType.equals("*/*") || responseContentType.equals("application/octet-stream")) {
-            log.trace("Response content type is {}: skipping mime type checks", responseContentType);
-            return;
-        }
-        Set<String> acceptableMimeTypes = getAcceptableMimeTypes(request, downloadUrl);
-        if (acceptableMimeTypes.contains("*/*") || acceptableMimeTypes.contains("application/octet-stream")) {
-            log.trace("Accepts header allows everything, skipping mime type checks");
-            return;
-        }
-        if(shouldBlockMimeType(responseContentType, acceptableMimeTypes)) {
-            IOUtils.closeQuietly(response);
-            String err = "Error fetching " + downloadUrl + ": Mismatching mime types found in request: "
-                    + acceptableMimeTypes + " and response: " + responseContentType + ", and this repo blocks "
-                    + responseContentType + " on mismatch";
-            RepoRequests.logToContext(err);
-            throw new RemoteRequestException(err, HttpStatus.SC_CONFLICT, null);
-        }
-    }
-
-    /**
-     * @param request      the request that goes to the resource
-     * @param downloadUrl  actual download url (if it was modified, / translated etc.), without query params
-     *
-     * @return a unique list of acceptable mime types for this request either by the request's 'Accepts' header
-     * or based on the requested file
-     */
-    private Set<String> getAcceptableMimeTypes(@Nullable Request request, String downloadUrl) {
-        Set<String> acceptableHeaderList = Sets.newHashSet();
-        String requestAcceptsHeader = null;
-        if(request != null) {
-            requestAcceptsHeader = request.getHeader(HttpHeaders.ACCEPT);
-        }
-        if(StringUtils.isNotBlank(requestAcceptsHeader)) {
-            log.trace("Found Accepts header in request: {}", requestAcceptsHeader);
-            acceptableHeaderList = getUniqueMimeTypeList(requestAcceptsHeader);
-        } else {
-            acceptableHeaderList.add(NamingUtils.getMimeType(downloadUrl).getType());
-        }
-        return acceptableHeaderList;
-    }
-
-    /**
-     * Mime type mismatch should be verified only if the repo requires it and the response's header is present.
-     */
-    private boolean shouldVerifyMimeType(CloseableHttpResponse response) {
-        return getDescriptor().isBlockMismatchingMimeTypes() && response.containsHeader(HttpHeaders.CONTENT_TYPE);
-    }
-
-    /**
-     *  Should block if there's a mismatch between the response's Content-Type header and the acceptable mime types list
-     *  (which was derived from the request's Accepts header or the requested file's extension) and the response's
-     *  returned type is in this repo's block list.
-     */
-    private boolean shouldBlockMimeType(String responseContentType, Set<String> acceptableMimeTypes) {
-        return !acceptableMimeTypes.contains(responseContentType)
-                && getRepoMismatchingMimeTypeBlockList().contains(responseContentType);
-    }
-
-    private Set<String> getRepoMismatchingMimeTypeBlockList() {
-        String mimeTypeBlockList =  getDescriptor().getMismatchingMimeTypesOverrideList();
-        String repoKey = getDescriptor().getKey();
-        if (StringUtils.isNotBlank(mimeTypeBlockList)) {
-            log.trace("Repo {} defines an overriding mismatching mime type block list: {}", repoKey, mimeTypeBlockList);
-        } else {
-            mimeTypeBlockList = ConstantValues.blockedMismatchingMimeTypes.getString();
-            log.trace("Repo {} does not define an overriding mismatching mime type block list, using default: {}",
-                    repoKey, mimeTypeBlockList);
-        }
-        return getUniqueMimeTypeList(mimeTypeBlockList);
-    }
-
-    /**
-     * Accepts header can have multiple entries https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
-     */
-    private Set<String> getUniqueMimeTypeList(String acceptsHeader) {
-        return Stream.of(acceptsHeader.split(","))                       //if multivalued - values are delimited by ','
-                .map(mimeType -> mimeType.replaceFirst(";(?:.*)", ""))   //each value can have options with ;
-                .map(String::trim)
-                .map(String::toLowerCase)
-                .collect(Collectors.toSet());
-    }
-
-    /**
-     * Content-Type header can be 'X/Y; [some encoding info]'
-     * @param header    Content-Type header value
-     * @return          Just the mime type
-     */
-    private String getMimeTypeFromHeader(String header) {
-        if(header.contains(";")) {
-            return header.split(";")[0];
-        } else {
-            return header;
-        }
-    }
-
-    public class TrafficAwareRemoteResourceStreamHandle extends RemoteResourceStreamHandle {
-        private final BandwidthMonitorInputStream bmis;
-        private final String remoteIp;
-        private CloseableHttpResponse response;
-        private String fullUrl;
-        private Request requestForPlugins;
-        private PluginsAddon pluginAddon;
-        private RepoPath repoPath;
-
-        public TrafficAwareRemoteResourceStreamHandle(
-                CloseableHttpResponse response, String fullUrl, Request requestForPlugins, PluginsAddon pluginAddon,
-                RepoPath repoPath, InputStream is) {
-            this.response = response;
-            this.fullUrl = fullUrl;
-            this.requestForPlugins = requestForPlugins;
-            this.pluginAddon = pluginAddon;
-            this.repoPath = repoPath;
-            this.bmis = new BandwidthMonitorInputStream(is);
-            TrafficService trafficService = ContextHelper.get().beanForType(TrafficService.class);
-            if (trafficService.isActive()) {
-                this.remoteIp = HttpUtils.resolveResponseRemoteAddress(response);
-            } else {
-                this.remoteIp = StringUtils.EMPTY;
-            }
-        }
-
-        @Override
-        public InputStream getInputStream() {
-            return bmis;
-        }
-
-        @Override
-        public long getSize() {
-            return -1;
-        }
-
-        @Override
-        public void close() {
-            IOUtils.closeQuietly(bmis);
-            IOUtils.closeQuietly(response);
-            StatusLine statusLine = response.getStatusLine();
-
-            Throwable throwable = getThrowable();
-            if (throwable != null) {
-                String exceptionMessage = HttpClientUtils.getErrorMessage(throwable);
-                log.error("{}: Failed to download '{}'. Received status code {} and caught exception: {}",
-                        HttpRepo.this, fullUrl, statusLine != null ? statusLine.getStatusCode() : "unknown",
-                        exceptionMessage);
-                String downLoadSummary =
-                        StorageUnit.toReadableString(bmis.getTotalBytesRead()) + " at " +
-                                StorageUnit.format(StorageUnit.KB.fromBytes(bmis.getBytesPerSec())) + " KB/sec";
-                log.debug("Failed to download '{}'. Download summary: {}", fullUrl, downLoadSummary, throwable);
-                RepoRequests.logToContext("Failed to download: %s", exceptionMessage);
-            } else {
-                int status = statusLine != null ? statusLine.getStatusCode() : 0;
-                logDownloaded(fullUrl, status, bmis);
-                RepoRequests.logToContext("Downloaded content");
-            }
-            RepoRequests.logToContext("Executing any AfterRemoteDownload user plugins that may exist");
-            pluginAddon.execPluginActions(AfterRemoteDownloadAction.class, null, requestForPlugins, repoPath);
-            RepoRequests.logToContext("Executed all AfterRemoteDownload user plugins");
-        }
-
-        public String getRemoteIp() {
-            return remoteIp;
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/LocalCacheRepo.java b/backend/core/src/main/java/org/artifactory/repo/LocalCacheRepo.java
deleted file mode 100644
index e550710..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/LocalCacheRepo.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import org.artifactory.descriptor.repo.LocalCacheRepoDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-
-/**
- * Interface for the local cache repositories.
- *
- * @author Noam Tenne
- */
-public interface LocalCacheRepo extends LocalRepo<LocalCacheRepoDescriptor> {
-
-    RemoteRepo<? extends RemoteRepoDescriptor> getRemoteRepo();
-
-    RemoteRepoDescriptor getRemoteRepoDescriptor();
-
-    void unexpire(String path);
-
-    /**
-     * @see org.artifactory.api.repo.RepositoryService#zap(org.artifactory.api.repo.RepoPath)
-     */
-    int zap(RepoPath repoPath);
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/LocalRepo.java b/backend/core/src/main/java/org/artifactory/repo/LocalRepo.java
deleted file mode 100644
index 56510fb..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/LocalRepo.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import org.artifactory.api.config.ImportableExportable;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.SnapshotVersionBehavior;
-import org.artifactory.repo.snapshot.MavenSnapshotVersionAdapter;
-import org.artifactory.resource.ResourceStreamHandle;
-
-public interface LocalRepo<T extends LocalRepoDescriptor> extends RealRepo<T>, StoringRepo<T>, ImportableExportable {
-
-    SnapshotVersionBehavior getMavenSnapshotVersionBehavior();
-
-    MavenSnapshotVersionAdapter getMavenSnapshotVersionAdapter();
-
-    /**
-     * Internal - get the raw content directly
-     *
-     * @param repoPath
-     * @return
-     */
-    String getTextFileContent(RepoPath repoPath);
-
-    /**
-     * Internal - get the raw content directly
-     *
-     * @param repoPath
-     * @return The ResourceStreamHandle for an existing file or a NullResourceStreamHandle for a non-exiting file Note:
-     *         Handle is to be closed by clients to avoid stream leaks!
-     */
-    ResourceStreamHandle getFileContent(RepoPath repoPath);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/repo/RealRepo.java b/backend/core/src/main/java/org/artifactory/repo/RealRepo.java
deleted file mode 100644
index 1dd9697..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/RealRepo.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.common.StatusHolder;
-import org.artifactory.descriptor.repo.RealRepoDescriptor;
-
-/**
- * @author Yoav Landman
- */
-public interface RealRepo<T extends RealRepoDescriptor> extends Repo<T> {
-
-    boolean isHandleReleases();
-
-    boolean isHandleSnapshots();
-
-    boolean isBlackedOut();
-
-    StatusHolder checkDownloadIsAllowed(RepoPath repoPath);
-
-    boolean handlesReleaseSnapshot(String path);
-
-    int getMaxUniqueSnapshots();
-
-    /**
-     * Checks that the actionable path is valid in the current context
-     *
-     * @param path            Path to test
-     * @param downloadRequest True if the originating request is for download, false for upload
-     * @return Test result
-     */
-    BasicStatusHolder assertValidPath(RepoPath path, boolean downloadRequest);
-
-    boolean accepts(RepoPath repoPath);
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/RealRepoBase.java b/backend/core/src/main/java/org/artifactory/repo/RealRepoBase.java
deleted file mode 100644
index 4dc35d3..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/RealRepoBase.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.repo.exception.BlackedOutException;
-import org.artifactory.api.repo.exception.IncludeExcludeException;
-import org.artifactory.api.repo.exception.SnapshotPolicyException;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.descriptor.repo.RealRepoDescriptor;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.security.AccessLogger;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-
-public abstract class RealRepoBase<T extends RealRepoDescriptor> extends RepoBase<T> implements RealRepo<T> {
-    private static final Logger log = LoggerFactory.getLogger(RealRepoBase.class);
-
-    public RealRepoBase(T descriptor, InternalRepositoryService repositoryService) {
-        super(descriptor, repositoryService);
-    }
-
-    @Override
-    public boolean isHandleReleases() {
-        return getDescriptor().isHandleReleases();
-    }
-
-    @Override
-    public boolean isHandleSnapshots() {
-        return getDescriptor().isHandleSnapshots();
-    }
-
-    @Override
-    public boolean isBlackedOut() {
-        return getDescriptor().isBlackedOut();
-    }
-
-    @Override
-    public int getMaxUniqueSnapshots() {
-        return getDescriptor().getMaxUniqueSnapshots();
-    }
-
-    @Override
-    public boolean handlesReleaseSnapshot(String path) {
-        if (NamingUtils.isMetadata(path) || NamingUtils.isChecksum(path) || NamingUtils.isSystem(path)) {
-            return true;
-        }
-        ModuleInfo moduleInfo = getItemModuleInfo(path);
-        if (!moduleInfo.isValid()) {
-            log.debug("{} is not a valid module info -  '{}': not enforcing snapshot/release policy.", this, path);
-            return true;
-        }
-        boolean snapshot = moduleInfo.isIntegration() || StringUtils.contains(path, "[INTEGRATION]");
-        if (snapshot && !isHandleSnapshots()) {
-            log.debug("{} rejected '{}': not handling snapshots.", this, path);
-            return false;
-        } else if (!snapshot && !isHandleReleases()) {
-            log.debug("{} rejected '{}': not handling releases.", this, path);
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public boolean isLocal() {
-        return getDescriptor().isLocal();
-    }
-
-    @Override
-    @SuppressWarnings({"ThrowableInstanceNeverThrown"})
-    public BasicStatusHolder assertValidPath(RepoPath repoPath, boolean downloadRequest) {
-        String path = repoPath.getPath();
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-        statusHolder.setActivateLogging(log.isDebugEnabled());
-        if (isBlackedOut()) {
-            BlackedOutException exception = new BlackedOutException(this.getDescriptor(), getRepoPath(path));
-            statusHolder.error(exception.getMessage(), exception.getErrorCode(), exception, log);
-        } else if (!handlesReleaseSnapshot(path)) {
-            SnapshotPolicyException exception = new SnapshotPolicyException(this.getDescriptor(), getRepoPath(path));
-            statusHolder.error(exception.getMessage(), exception.getErrorCode(), exception, log);
-        } else if (!accepts(repoPath)) {
-            IncludeExcludeException exception = new IncludeExcludeException(
-                    downloadRequest ? HttpStatus.SC_NOT_FOUND : HttpStatus.SC_CONFLICT, this.getDescriptor(),
-                    getRepoPath(path));
-            statusHolder.error(exception.getMessage(), exception.getErrorCode(), exception, log);
-        }
-        return statusHolder;
-    }
-
-    protected void assertReadPermissions(RepoPath repoPath, MutableStatusHolder status) {
-        AuthorizationService authService = getAuthorizationService();
-        boolean canRead = authService.canRead(repoPath);
-        if (!canRead) {
-            status.error("Download request for repo:path '" + repoPath + "' is forbidden for user '" +
-                    authService.currentUsername() + "'.", HttpStatus.SC_FORBIDDEN, log);
-            AccessLogger.downloadDenied(repoPath);
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/repo/RemoteRepo.java b/backend/core/src/main/java/org/artifactory/repo/RemoteRepo.java
deleted file mode 100644
index 07fad8c..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/RemoteRepo.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.repo.remote.browse.RemoteItem;
-import org.artifactory.request.InternalRequestContext;
-import org.artifactory.request.RequestContext;
-import org.artifactory.resource.ResourceStreamHandle;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.io.IOException;
-import java.util.List;
-
-public interface RemoteRepo<T extends RemoteRepoDescriptor> extends RealRepo<T> {
-    long getRetrievalCachePeriodSecs();
-
-    boolean isStoreArtifactsLocally();
-
-    String getUrl();
-
-    @Nullable
-    LocalCacheRepo getLocalCacheRepo();
-
-    /**
-     * Downloads a resource from the remote repository
-     *
-     * @return A handle for the remote resource
-     */
-    ResourceStreamHandle downloadResource(String relPath) throws IOException;
-
-    ResourceStreamHandle downloadResource(String relPath, RequestContext requestContext) throws IOException;
-
-    /**
-     * Retrieves a resource remotely if the remote resource was found and is newer or if forced
-     */
-    ResourceStreamHandle conditionalRetrieveResource(String relPath, boolean forceRemoteDownload) throws IOException;
-
-    void clearCaches();
-
-    /**
-     * Removes a path from the repository caches (missed and failed)
-     *
-     * @param path           The path to remove from the cache. The path is relative path from the repository root.
-     * @param removeSubPaths If true will also remove any sub paths from the caches.
-     */
-    void removeFromCaches(String path, boolean removeSubPaths);
-
-    boolean isOffline();
-
-    /**
-     * Performs the actual remote download of the artifact.
-     * This method might creates new nodes and hence must be called within a transaction.
-     *
-     * @param requestContext The download request context
-     * @param remoteResource A remote resource that has been returned by getInfo()
-     * @return
-     * @throws IOException         On remote download failure
-     * @throws RepoRejectException If the current repo is configured not to accept the artifact
-     */
-    ResourceStreamHandle downloadAndSave(InternalRequestContext requestContext, RepoResource remoteResource)
-            throws IOException, RepoRejectException;
-
-    /**
-     * List remote resources from a remote path.
-     *
-     * @param directoryPath The path of the remote repository listing
-     * @return A list of URLs that represent the remote hrefs of the remote resources. Empty if not found of failed to parse the response.
-     */
-    @Nonnull
-    List<RemoteItem> listRemoteResources(String directoryPath);
-
-    /**
-     * @return True if this repo supports listing remote directories AND it's not offline AND it's not blacklisted.
-     */
-    boolean isListRemoteFolderItems();
-
-    /**
-     * @return True if this repository is assumed to be offline due to download requests exceptions
-     */
-    boolean isAssumedOffline();
-
-    /**
-     * @return The next date (in milliseconds) the online monitor will check for online status of an assumed offline
-     * repository. 0 if the repository is not assumed offline.
-     * @see RemoteRepo#isAssumedOffline()
-     */
-    long getNextOnlineCheckMillis();
-
-    /**
-     * Manually reset the assumed offline flag to false (i.e., the repository is considered back online)
-     */
-    void resetAssumedOffline();
-
-    /**
-     * Cleanup any resources/threads this repository holds in order to be eligible for garbage collection
-     */
-    void cleanupResources();
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/repo/RemoteRepoBase.java b/backend/core/src/main/java/org/artifactory/repo/RemoteRepoBase.java
deleted file mode 100644
index 3f2b204..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/RemoteRepoBase.java
+++ /dev/null
@@ -1,1338 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import com.google.common.cache.CacheBuilder;
-import com.google.common.collect.Lists;
-import com.google.common.io.Closeables;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.apache.http.StatusLine;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpRequestBase;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.HaAddon;
-import org.artifactory.addon.RestCoreAddon;
-import org.artifactory.addon.debian.DebianAddon;
-import org.artifactory.addon.plugin.PluginsAddon;
-import org.artifactory.addon.plugin.ResourceStreamCtx;
-import org.artifactory.addon.plugin.download.AltRemoteContentAction;
-import org.artifactory.addon.plugin.download.AltRemotePathAction;
-import org.artifactory.addon.plugin.download.PathCtx;
-import org.artifactory.addon.replication.ReplicationAddon;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.maven.MavenArtifactInfo;
-import org.artifactory.api.repo.exception.FileExpectedException;
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.api.request.InternalArtifactoryRequest;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.checksum.ChecksumsInfo;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.common.StatusHolder;
-import org.artifactory.descriptor.delegation.ContentSynchronisation;
-import org.artifactory.descriptor.repo.ChecksumPolicyType;
-import org.artifactory.descriptor.repo.LocalCacheRepoDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.io.RemoteResourceStreamHandle;
-import org.artifactory.io.SimpleResourceStreamHandle;
-import org.artifactory.io.checksum.ChecksumUtil;
-import org.artifactory.io.checksum.policy.ChecksumPolicy;
-import org.artifactory.io.checksum.policy.ChecksumPolicyBase;
-import org.artifactory.md.Properties;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.db.DbCacheRepo;
-import org.artifactory.repo.db.DbStoringRepoMixin;
-import org.artifactory.repo.local.ValidDeployPathContext;
-import org.artifactory.repo.remote.browse.RemoteItem;
-import org.artifactory.repo.remote.interceptor.RemoteRepoInterceptor;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.request.*;
-import org.artifactory.resource.*;
-import org.artifactory.resource.UnfoundRepoResourceReason.Reason;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.storage.binstore.service.BinaryService;
-import org.artifactory.storage.fs.lock.map.LockingMap;
-import org.artifactory.traffic.TrafficService;
-import org.artifactory.traffic.entry.UploadEntry;
-import org.artifactory.util.*;
-import org.jfrog.storage.binstore.exceptions.BinaryNotFoundException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.*;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-/**
- * @author yoavl
- */
-public abstract class RemoteRepoBase<T extends RemoteRepoDescriptor> extends RealRepoBase<T> implements RemoteRepo<T> {
-    //RTFACT-6528
-    protected final static List<Integer> offlineStatusCodes = Lists.newArrayList(502, 503, 504, 505);
-    private static final Logger log = LoggerFactory.getLogger(RemoteRepoBase.class);
-    private static final Logger debLog = LoggerFactory.getLogger("DEBLOG");
-    private final ChecksumPolicy checksumPolicy;
-    private final LockingMap lockingMap;
-    /**
-     * Flags this repository as assumed offline. The repository enters this state when a download request fails with
-     * exception.
-     */
-    protected volatile AtomicBoolean assumedOffline = new AtomicBoolean(false);
-    /**
-     * The next time, in milliseconds, to check online status of this repository
-     */
-    protected long nextOnlineCheckMillis;
-    private LocalCacheRepo localCacheRepo;
-    private RemoteRepoBase oldRemoteRepo;
-
-    /**
-     * Cache of resources not found on the remote machine. Keyed by resource path.
-     */
-    private Map<String, RepoResource> missedRetrievalsCache;
-
-    /**
-     * Cache of remote directories listing.
-     */
-
-    private Map<String, List<RemoteItem>> remoteResourceCache;
-    private boolean globalOfflineMode;
-    // List of interceptors for various download resolution points
-    private Collection<RemoteRepoInterceptor> interceptors;
-
-    protected RemoteRepoBase(T descriptor, InternalRepositoryService repositoryService,
-            boolean globalOfflineMode,RemoteRepo oldRemoteRepo) {
-        super(descriptor, repositoryService);
-        ChecksumPolicyType checksumPolicyType = descriptor.getChecksumPolicyType();
-        checksumPolicy = ChecksumPolicyBase.getByType(checksumPolicyType);
-        this.globalOfflineMode = globalOfflineMode;
-        if (oldRemoteRepo != null && oldRemoteRepo instanceof RemoteRepoBase) {
-            this.oldRemoteRepo = (RemoteRepoBase) oldRemoteRepo;
-            // Always keep the in transit download map
-            this.lockingMap = this.oldRemoteRepo.lockingMap;
-        } else {
-            this.oldRemoteRepo = null;
-            HaAddon haAddon = ContextHelper.get().beanForType(AddonsManager.class).addonByType(HaAddon.class);
-            this.lockingMap = haAddon.getLockingMap();
-        }
-        if (isNonMavenRepo()) {
-            excludes.addAll(Lists.newArrayList("**/*.pom", "**/*.jar", "**/maven-metadata.xml"));
-        }
-    }
-
-    @Override
-    public void init() {
-        if (isStoreArtifactsLocally()) {
-            DbCacheRepo oldCacheRepo = null;
-            if (oldRemoteRepo != null) {
-                oldCacheRepo = (DbCacheRepo) oldRemoteRepo.localCacheRepo;
-            }
-            //Initialize the local cache
-            localCacheRepo = new DbCacheRepo(this, oldCacheRepo);
-            localCacheRepo.init();
-        }
-        initCaches();
-        logCacheInfo();
-        // Clean the old repo not needed anymore
-        oldRemoteRepo = null;
-        interceptors = ContextHelper.get().beansForType(RemoteRepoInterceptor.class).values();
-    }
-
-    @Override
-    public void destroy() {
-        super.destroy();
-        if (isStoreArtifactsLocally()) {
-            localCacheRepo.destroy();
-        }
-    }
-
-    protected void initCaches() {
-        missedRetrievalsCache = initCache(500, getDescriptor().getMissedRetrievalCachePeriodSecs(), false);
-        remoteResourceCache = initCache(1000, getDescriptor().getRetrievalCachePeriodSecs(), true);
-    }
-
-    private <V> Map<String, V> initCache(int initialCapacity, long expirationSeconds, boolean softValues) {
-        CacheBuilder cacheBuilder = CacheBuilder.newBuilder().initialCapacity(initialCapacity);
-        if (expirationSeconds >= 0) {
-            cacheBuilder.expireAfterWrite(expirationSeconds, TimeUnit.SECONDS);
-        }
-        if (softValues) {
-            cacheBuilder.softValues();
-        }
-        //noinspection unchecked
-        return cacheBuilder.build().asMap();
-    }
-
-    private void logCacheInfo() {
-        long retrievalCachePeriodSecs = getDescriptor().getRetrievalCachePeriodSecs();
-        if (retrievalCachePeriodSecs > 0) {
-            log.debug("{}: Retrieval cache will be enabled with period of {} seconds",
-                    this, retrievalCachePeriodSecs);
-        } else {
-            log.debug("{}: Retrieval cache will be disabled.", this);
-        }
-        long missedRetrievalCachePeriodSecs = getDescriptor().getMissedRetrievalCachePeriodSecs();
-        if (missedRetrievalCachePeriodSecs > 0) {
-            log.debug("{}: Enabling misses retrieval cache with period of {} seconds",
-                    this, missedRetrievalCachePeriodSecs);
-        } else {
-            log.debug("{}: Disabling misses retrieval cache", this);
-        }
-    }
-
-    @Override
-    public boolean isStoreArtifactsLocally() {
-        return getDescriptor().isStoreArtifactsLocally();
-    }
-
-    @Override
-    public String getUrl() {
-        return getDescriptor().getUrl();
-    }
-
-    @Override
-    public boolean isOffline() {
-        return getDescriptor().isOffline() || globalOfflineMode || isAssumedOffline();
-    }
-
-    @Override
-    public boolean isAssumedOffline() {
-        return assumedOffline.get();
-    }
-
-    @Override
-    public long getNextOnlineCheckMillis() {
-        return isAssumedOffline() ? nextOnlineCheckMillis : 0;
-    }
-
-    @Override
-    public boolean isListRemoteFolderItems() {
-        return getDescriptor().isListRemoteFolderItems() && !getDescriptor().isBlackedOut() && !isOffline();
-    }
-
-    @Override
-    public long getRetrievalCachePeriodSecs() {
-        return getDescriptor().getRetrievalCachePeriodSecs();
-    }
-
-    @Override
-    public ChecksumPolicy getChecksumPolicy() {
-        return checksumPolicy;
-    }
-
-    /**
-     * Retrieve the (metadata) information about the artifact, unless still cached as failure or miss. Reach this point
-     * only if local and cached repo did not find resource or expired.
-     *
-     * @param context The request context holding additional parameters
-     * @return A repository resource updated with the uptodate metadata
-     */
-    @Override
-    public final RepoResource getInfo(InternalRequestContext context) throws FileExpectedException {
-        AddonsManager addonsManager = InternalContextHelper.get().beanForType(AddonsManager.class);
-        RestCoreAddon restCoreAddon = addonsManager.addonByType(RestCoreAddon.class);
-        context = restCoreAddon.getDynamicVersionContext(this, context, true);
-
-        String path = context.getResourcePath();
-        // make sure the repo key is of this repository
-        RepoPath repoPath = InternalRepoPathFactory.create(getKey(), path);
-        debLog.debug("IP '{}' requesting file '{}'", HttpUtils.getRemoteClientAddress(), repoPath);
-
-        //Skip if in blackout or not accepting/handling or cannot download
-        StatusHolder statusHolder = checkDownloadIsAllowed(repoPath);
-        if (statusHolder.isError()) {
-            RepoRequests.logToContext("Download denied (%s) - returning unfound resource", statusHolder.getStatusMsg());
-            return new UnfoundRepoResource(repoPath, statusHolder.getStatusMsg(), statusHolder.getStatusCode());
-        }
-        //Never query remote checksums
-        if (NamingUtils.isChecksum(path)) {
-            RepoRequests.logToContext("Download denied - checksums are not downloadable");
-            return new UnfoundRepoResource(repoPath, "Checksums are not downloadable.");
-        }
-
-        //Try to get it from the caches
-        RepoResource res = getMissedResource(path);
-        if (res == null) {
-            res = internalGetInfo(repoPath, context);
-        }
-
-        //If we cannot get the resource remotely and an expired (otherwise we would not be
-        //attempting the remote repo at all) cache entry exists use it by unexpiring it
-        if (res.isExpired() && isStoreArtifactsLocally()) {
-            RepoRequests.logToContext("Hosting repository stores locally and the resource is expired - " +
-                    "un-expiring if still exists");
-            res = getRepositoryService().unexpireIfExists(localCacheRepo, path);
-        }
-        checkAndMarkExpirableResource(res);
-        return res;
-    }
-
-    private RepoResource internalGetInfo(RepoPath repoPath, InternalRequestContext context) {
-        String path = repoPath.getPath();
-        RepoResource cachedResource = null;
-        // first try to get it from the local cache repository
-        if (isStoreArtifactsLocally() && localCacheRepo != null) {
-            try {
-                cachedResource = localCacheRepo.getInfo(context);
-            } catch (FileExpectedException e) {
-                // rethrow using the remote repo path
-                throw new FileExpectedException(repoPath);
-            }
-        }
-
-        if (cachedResource != null) {
-            if (cachedResource.isFound()) {
-                RepoRequests.logToContext("Found resource in local cache - returning cached resource");
-                // found in local cache
-                return returnCachedResource(repoPath, cachedResource);
-            } else if (cachedResource instanceof UnfoundRepoResourceReason &&
-                    ((UnfoundRepoResourceReason)cachedResource).getReason() == Reason.PROPERTY_MISMATCH) {
-                RepoRequests.logToContext("Found resource in local cache, but property doesn't match.");
-                return returnCachedResource(repoPath, cachedResource);
-            }
-        }
-
-        boolean foundExpiredInCache = ((cachedResource != null) && cachedResource.isExpired());
-
-        //not found in local cache - try to get it from the remote repository
-        if (!isOffline()) {
-            boolean remoteDownloadAllowed = isRemoteDownloadAllowed(repoPath);
-            if (!remoteDownloadAllowed) {
-                RepoRequests.logToContext("Remote resource not allowed based on one of the interceptors");
-                return new UnfoundRepoResource(repoPath,
-                        "Remote download of " + repoPath + " is not allowed by this repo");
-            }
-
-            RepoResource remoteResource = getRemoteResource(context, repoPath, foundExpiredInCache);
-            if (!remoteResource.isFound() && foundExpiredInCache) {
-                RepoRequests.logToContext("Resource doesn't exist remotely but is expired in the caches - " +
-                        "returning expired cached resource");
-                remoteResource = returnCachedResource(repoPath, cachedResource);
-            }
-            if (remoteResource.isFound() && context.getRequest().isZipResourceRequest()) {
-                // there's a newer remote resource that should be downloaded for zip resources
-                return getRemoteZipRepoResource(repoPath, context);
-            }
-            return remoteResource;
-        } else if (foundExpiredInCache) {
-            RepoRequests.logToContext("Repository is offline but the resource exists in the local cache - " +
-                    "returning cached resource");
-            //Return the cached resource if remote fetch failed
-            return returnCachedResource(repoPath, cachedResource);
-        } else {
-            String offlineMessage = isAssumedOffline() ? "assumed offline" : "offline";
-            RepoRequests.logToContext("Repository is " + offlineMessage + " and the resource doesn't exist in the " +
-                    "local cache - returning unfound resource");
-            return new UnfoundRepoResource(repoPath,
-                    String.format("%s: is %s, '%s' is not found at '%s'.", this, offlineMessage, repoPath, path));
-        }
-    }
-
-    private RepoResource getRemoteZipRepoResource(RepoPath repoPath, InternalRequestContext context) {
-        try {
-            RepoRequests.logToContext(
-                    "Main ZIP resource {} exist remotely but is expired or is not present in the caches - " +
-                            "doing eager download.", repoPath
-            );
-            EagerResourcesDownloader eagerResourcesDownloader = InternalContextHelper.get().beanForType(
-                    EagerResourcesDownloader.class);
-            InternalArtifactoryRequest internalRequest = new InternalArtifactoryRequest(repoPath);
-            String alternativeDownloadUrl = context.getRequest().getParameter(
-                    ArtifactoryRequest.PARAM_ALTERNATIVE_REMOTE_DOWNLOAD_URL);
-            if (StringUtils.isNotBlank(alternativeDownloadUrl)) {
-                internalRequest.setAlternativeRemoteDownloadUrl(alternativeDownloadUrl);
-            }
-            eagerResourcesDownloader.downloadNow(repoPath, internalRequest);
-            RepoResource cachedResource = localCacheRepo.getInfo(context);
-            if (cachedResource != null && cachedResource.isFound()) {
-                RepoRequests.logToContext(
-                        "Found resource after eager download in local cache - returning cached resource");
-                return returnCachedResource(repoPath, cachedResource);
-            }
-            String zipResourcePath = context.getRequest().getZipResourcePath();
-            return new UnfoundRepoResource(repoPath, "Could not download '" + zipResourcePath + "' from main zip resource");
-        } catch (Exception e) {
-            RepoRequests.logToContext(
-                    "Main ZIP resource exists remotely but could not be downloaded due to: {}", e.getMessage());
-            log.warn("Main ZIP resource {} exists remotely but could not be downloaded due to: {}",
-                    repoPath, e.getMessage());
-            if (log.isDebugEnabled()) {
-                log.warn(e.getMessage(), e);
-            }
-            return new UnfoundRepoResource(repoPath, "Zip resources download failed due to: " + e.getMessage());
-        }
-    }
-
-    /**
-     * Returns a resource from a remote repository
-     *
-     * @param context             Download request context
-     * @param repoPath            Item repo path
-     * @param foundExpiredInCache True if the an expired item was found in the cache    @return Repo resource object
-     */
-    private RepoResource getRemoteResource(RequestContext context, RepoPath repoPath, boolean foundExpiredInCache) {
-        String path = repoPath.getPath();
-        boolean folder = repoPath.isFolder();
-        if (!isSynchronizeProperties() && context.getProperties().hasMandatoryProperty()) {
-            RepoRequests.logToContext("Repository doesn't sync properties and the request contains " +
-                    "mandatory properties - returning unfound resource");
-            return new UnfoundRepoResource(repoPath, this + ": does not synchronize remote properties and request " +
-                    "contains mandatory property, '" + repoPath + "' will not be downloaded from '" + path + "'.");
-        }
-
-        RepoResource remoteResource;
-        path = getAltRemotePath(repoPath);
-        if (!repoPath.getPath().equals(path)) {
-            RepoRequests.logToContext("Remote resource path was altered by the user plugins to - %s", path);
-        }
-        try {
-            remoteResource = retrieveInfo(path, folder, context);
-            if (!remoteResource.isFound() && !foundExpiredInCache) {
-                //Update the non-found cache for a miss
-                RepoRequests.logToContext("Unable to find resource remotely - adding to the missed retrieval cache.");
-                missedRetrievalsCache.put(path, remoteResource);
-            }
-        } catch (FileExpectedException e) {
-            RepoRequests.logToContext("Expected file but got directory, requesting a redirect");
-            throw e;
-        } catch (Exception e) {
-            RepoRequests.logToContext("Failed to retrieve information: %s", e.getMessage());
-            String reason = this + ": Error in getting information for '" + path + "' (" + e.getMessage() + ").";
-            if (log.isDebugEnabled()) {
-                log.warn(reason, e);
-            } else {
-                log.warn(reason);
-            }
-            putOffline();
-            remoteResource = new UnfoundRepoResource(repoPath, reason);
-            if (!foundExpiredInCache && getDescriptor().isHardFail()) {
-                throw new RuntimeException(this + ": Error in getting information for '" + path + "'.", e);
-            }
-        }
-
-        return remoteResource;
-    }
-
-    /**
-     * Sets the response repo path on a cached resource
-     *
-     * @param repoPath       Path item to resource
-     * @param cachedResource Cached resource
-     * @return Repo resource object
-     */
-    private RepoResource returnCachedResource(RepoPath repoPath, RepoResource cachedResource) {
-        cachedResource.setResponseRepoPath(InternalRepoPathFactory.create(localCacheRepo.getKey(), repoPath.getPath()));
-        return cachedResource;
-    }
-
-    /**
-     * Temporarily puts the repository in an assumed offline mode.
-     */
-    protected abstract void putOffline();
-
-    protected abstract RepoResource retrieveInfo(String path, boolean folder, @Nullable RequestContext context);
-
-    @Override
-    public StatusHolder checkDownloadIsAllowed(RepoPath repoPath) {
-        String path = repoPath.getPath();
-        BasicStatusHolder status = assertValidPath(repoPath, true);
-        if (status.isError()) {
-            return status;
-        }
-
-        // permissions are always on the cache repo key
-        RepoPath cacheRepoPath = InternalRepoPathFactory.create(getKey() + LocalCacheRepoDescriptor.PATH_SUFFIX, path);
-        if (localCacheRepo != null) {
-            return localCacheRepo.checkDownloadIsAllowed(cacheRepoPath);
-        } else {
-            // cache repo doesn't exist so remote has to check the permissions
-            assertReadPermissions(cacheRepoPath, status);
-            return status;
-        }
-    }
-
-    @Override
-    public ResourceStreamHandle getResourceStreamHandle(InternalRequestContext requestContext, RepoResource res)
-            throws IOException, RepoRejectException {
-        // We also change the context here, otherwise if there is something in the cache
-        // we will receive it instead of trying to download the latest from the remote
-        AddonsManager addonsManager = InternalContextHelper.get().beanForType(AddonsManager.class);
-        RestCoreAddon restCoreAddon = addonsManager.addonByType(RestCoreAddon.class);
-        requestContext = restCoreAddon.getDynamicVersionContext(this, requestContext, true);
-        RepoRequests.logToContext("Creating a resource handle from '%s'", res.getResponseRepoPath().getRepoKey());
-        String path = res.getRepoPath().getPath();
-        if (isStoreArtifactsLocally()) {
-            RepoRequests.logToContext("Target repository is configured to retain artifacts locally - " +
-                    "resource will be stored and the streamed to the user");
-            try {
-                //Reflect the fact that we return a locally cached resource
-                res.setResponseRepoPath(InternalRepoPathFactory.create(localCacheRepo.getKey(), path));
-                ResourceStreamHandle handle = getRepositoryService().downloadAndSave(requestContext, this, res);
-                return handle;
-            } catch (IOException e) {
-                RepoRequests.logToContext("Error occurred while downloading artifact: %s", e.getMessage());
-                //If we fail on remote fetching and we can get the resource from an expired entry in
-                //the local cache - fallback to using it, else rethrow the exception
-                if (res.isExpired()) {
-                    ResourceStreamHandle result =
-                            getRepositoryService().unexpireAndRetrieveIfExists(requestContext, localCacheRepo, path);
-                    if (result != null) {
-                        RepoRequests.logToContext("Requested artifact is expired and exists in the cache - " +
-                                "un-expiring cached and returning it instead");
-                        return result;
-                    }
-                }
-                throw e;
-            }
-        } else {
-            RepoRequests.logToContext("Target repository is configured to not retain artifacts locally - " +
-                    "resource will be stream directly to the user");
-            ResourceStreamHandle handle = downloadResource(path, requestContext);
-            return handle;
-        }
-    }
-
-    @Override
-    public ResourceStreamHandle downloadAndSave(InternalRequestContext requestContext, RepoResource remoteResource)
-            throws IOException, RepoRejectException {
-        assert getLocalCacheRepo() != null;
-
-        boolean offline = isOffline();
-        RepoRequests.logToContext("Remote repository is %s", (offline ? "offline" : "online"));
-
-        RepoResource cachedResource = getLocalCacheRepo().getInfo(requestContext);
-        boolean foundExpiredResourceAndNewerRemote = foundExpiredAndRemoteIsNewer(remoteResource, cachedResource);
-
-        boolean forceExpiryCheck = requestContext.isForceExpiryCheck();
-        RepoRequests.logToContext("Force expiration on the cached resource = %s", forceExpiryCheck);
-
-        boolean cachedNotFoundAndNotExpired = notFoundAndNotExpired(cachedResource);
-        RepoRequests.logToContext("Resource isn't cached and isn't expired = %s", cachedNotFoundAndNotExpired);
-
-        RepoPath remoteRepoPath = remoteResource.getRepoPath();
-        boolean remoteDownloadAllowed = isRemoteDownloadAllowed(remoteRepoPath);
-        if (!remoteDownloadAllowed) {
-            RepoRequests.logToContext("Remote resource not allowed based on one of the interceptors");
-        }
-
-        // Retrieve remote artifact conditionally
-        if (!offline && remoteDownloadAllowed &&
-                (forceExpiryCheck || foundExpiredResourceAndNewerRemote || cachedNotFoundAndNotExpired)) {
-            // Check for security deploy rights
-            RepoRequests.logToContext("Asserting valid deployment path");
-            ValidDeployPathContext validDeployPathContext = new ValidDeployPathContext
-                    .Builder(localCacheRepo, remoteRepoPath)
-                    .contentLength(remoteResource.getInfo().getSize())
-                    .forceExpiryCheck(requestContext.isForceExpiryCheck()).build();
-            getRepositoryService().assertValidDeployPath(validDeployPathContext);
-
-            // Only 1 remote downloader is allowed
-            String pathToLock = cachedResource.getRepoPath().toPath();
-
-            boolean lockAcquired = false;
-            try {
-                try {
-                    lockAcquired = lockingMap.tryAddAndLock(pathToLock,
-                            ConstantValues.repoConcurrentDownloadSyncTimeoutSecs.getLong(), TimeUnit.SECONDS);
-                } catch (InterruptedException e) {
-                    log.info("Interrupted on concurrent download lock of '{}'", pathToLock);
-                    RepoRequests.logToContext("Interrupted on concurrent download lock of '" + pathToLock + "'");
-                }
-                if (lockAcquired) {
-                    try {
-                        if (!cachedResource.isExpired()) {
-                            String message = "Found completed concurrent download - using prepared handle";
-                            return getHandleFromCache(requestContext, remoteResource, cachedResource, message);
-                        }
-                    } catch (FileNotFoundException e) {
-                        String msg = "Unable to find cached resource stream handle, continuing with actual remote download.";
-                        log.debug(msg);
-                        RepoRequests.logToContext(msg);
-                    }
-                } else {
-                    //We exited because of a timeout, return timeout error
-                    log.info("Timed-out waiting on concurrent download of '{}' in '{}'.", pathToLock, this);
-                    RepoRequests.logToContext("Timed-out waiting on concurrent download.");
-                    return null;
-                }
-                RepoRequests.logToContext("Found no cached resource - starting download");
-                cachedResource = doDownloadAndSave(requestContext, remoteResource);
-                if (foundExpiredResourceAndNewerRemote) {
-                    debLog.debug("IP '{}' refreshed expired file '{}'", HttpUtils.getRemoteClientAddress(), pathToLock);
-                }
-            } finally {
-                if (lockAcquired) {
-                    lockingMap.removeAndUnlock(pathToLock);
-                }
-            }
-            notifyInterceptorsOnAfterRemoteDownload(remoteResource);
-        }
-
-        boolean cachedExpiredAndNewerThanRemote = cachedExpiredAndNewerThanRemote(remoteResource, cachedResource);
-        RepoRequests.logToContext("Found expired cached resource and is newer than remote = %s",
-                cachedExpiredAndNewerThanRemote);
-        if (cachedExpiredAndNewerThanRemote) {
-            synchronizeExpiredResourceProperties(remoteResource.getRepoPath());
-            unexpire(cachedResource);
-        }
-
-        RepoRequests.logToContext("Returning the cached resource");
-        //Return the cached result (the newly downloaded or already cached resource)
-        return localCacheRepo.getResourceStreamHandle(requestContext, cachedResource);
-    }
-
-    private ResourceStreamHandle getHandleFromCache(InternalRequestContext requestContext, RepoResource remoteResource,
-            RepoResource cachedResource, String message) throws IOException, RepoRejectException {
-        ResourceStreamHandle cacheHandle = localCacheRepo.getResourceStreamHandle(requestContext, cachedResource);
-        if (cacheHandle != null) {
-            RepoRequests.logToContext(message);
-            ChecksumsInfo checksumsInfo = localCacheRepo.getInfo(requestContext).getInfo().getChecksumsInfo();
-            remoteResource.getInfo().getChecksumsInfo().setChecksums(checksumsInfo.getChecksums());
-            return cacheHandle;
-        }
-
-        return null;
-    }
-
-    private boolean isRemoteDownloadAllowed(RepoPath remoteRepoPath) {
-        for (RemoteRepoInterceptor interceptor : interceptors) {
-            RemoteRepoDescriptor descriptor = getDescriptor();
-            if (!interceptor.isRemoteDownloadAllowed(descriptor, remoteRepoPath)) {
-                // one veto is enough to prevent the download
-                return false;
-            }
-        }
-        return true;
-    }
-
-    private boolean isRemoteRepoListingAllowed(String remoteDirectoryPath) {
-        for (RemoteRepoInterceptor interceptor : interceptors) {
-            RemoteRepoDescriptor descriptor = getDescriptor();
-            if (!interceptor.isRemoteRepoListingAllowed(descriptor, remoteDirectoryPath)) {
-                // one veto is enough to prevent the download
-                return false;
-            }
-        }
-        return true;
-    }
-
-    protected void notifyInterceptorsOnAfterRemoteDownload(RepoResource remoteResource) {
-        for (RemoteRepoInterceptor interceptor : interceptors) {
-            interceptor.afterRemoteDownload(remoteResource);
-        }
-    }
-
-    protected void notifyInterceptorsOnBeforeRemoteHttpMethodExecution(HttpRequestBase request,
-            Map<String, String> headers) {
-        for (RemoteRepoInterceptor interceptor : interceptors) {
-            interceptor.beforeRemoteHttpMethodExecution(request, headers);
-        }
-    }
-
-    // this is the actual download of the resource
-    private RepoResource doDownloadAndSave(InternalRequestContext requestContext, RepoResource remoteResource)
-            throws RepoRejectException, IOException {
-        RepoRequests.logToContext("Downloading and saving");
-        RepoPath remoteRepoPath = remoteResource.getRepoPath();
-        ResourceStreamHandle handle = null;
-        try {
-            beforeResourceDownload(remoteResource, requestContext.getProperties(), requestContext.getRequest());
-
-            boolean synchronizeProperties = isSynchronizeProperties();
-
-            RepoRequests.logToContext("Remote property synchronization enabled = %s", synchronizeProperties);
-
-            Properties properties = null;
-            if (synchronizeProperties) {
-                // No check for annotate permissions, since sync props is a configuration flag
-                // and file will be deployed here
-                RepoRequests.logToContext("Trying to find remote properties");
-                properties = getRemoteProperties(remoteRepoPath.getPath());
-            }
-
-            RepoResourceInfo remoteInfo = remoteResource.getInfo();
-            Set<ChecksumInfo> remoteChecksums = remoteInfo.getChecksumsInfo().getChecksums();
-            boolean receivedRemoteChecksums = CollectionUtils.notNullOrEmpty(remoteChecksums);
-            if (receivedRemoteChecksums) {
-                RepoRequests.logToContext("Received remote checksums headers - %s", remoteChecksums);
-            } else {
-                RepoRequests.logToContext("Received no remote checksums headers");
-            }
-            //Allow plugins to provide an alternate content
-            handle = getAltContent(remoteRepoPath);
-            if (handle == null && receivedRemoteChecksums &&
-                    shouldSearchForExistingResource(requestContext.getRequest())) {
-                RepoRequests.logToContext("Received no alternative content, received remote checksums headers" +
-                        " and searching for existing resources on download is enabled");
-                handle = getExistingResourceByChecksum(remoteChecksums, remoteResource.getSize());
-            }
-            long remoteRequestStartTime = 0;
-            if (!receivedRemoteChecksums) {
-                RepoRequests.logToContext("Trying to find remote checksums");
-                remoteChecksums = getRemoteChecksums(remoteRepoPath.getPath(),remoteResource);
-                if (remoteResource instanceof RemoteRepoResource) {
-                    ((RemoteRepoResource) remoteResource).getInfo().setChecksums(remoteChecksums);
-                } else {
-                    // Cannot set the checksums on non remote repo resource
-                    RepoRequests.logToContext("No checksums found on %s and it's not a remote resource!",
-                            remoteResource);
-                }
-            }
-
-            if (handle == null) {
-
-                RepoRequests.logToContext("Received no alternative content or existing resource - " +
-                        "downloading resource");
-                //If we didn't get an alternate handle do the actual download
-                remoteRequestStartTime = System.currentTimeMillis();
-                handle = downloadResource(remoteRepoPath.getPath(), requestContext);
-            }
-
-            String etag = remoteResource.getEtag();
-            if (StringUtils.isNotBlank(etag)) {
-                if (properties == null) {
-                    properties = (Properties) InfoFactoryHolder.get().createProperties();
-                }
-                properties.put(DbStoringRepoMixin.ETAG_PROP_KEY, etag);
-            }
-
-            //Create/override the resource in the storage cache
-            RepoRequests.logToContext("Saving resource to " + localCacheRepo);
-            SaveResourceContext saveResourceContext = new SaveResourceContext.Builder(remoteResource, handle)
-                    .properties(properties).build();
-            RepoResource cachedResource = getRepositoryService().saveResource(localCacheRepo, saveResourceContext);
-            if (remoteRequestStartTime > 0) {
-                String remoteAddress;
-                if (handle instanceof HttpRepo.TrafficAwareRemoteResourceStreamHandle) {
-                    remoteAddress = ((HttpRepo.TrafficAwareRemoteResourceStreamHandle) handle).getRemoteIp();
-                } else {
-                    remoteAddress = StringUtils.EMPTY;
-                }
-                // fire upload event only if the resource was downloaded from the remote repository
-                UploadEntry uploadEntry = new UploadEntry(remoteResource.getRepoPath().getId(),
-                        cachedResource.getSize(), System.currentTimeMillis() - remoteRequestStartTime, remoteAddress);
-                TrafficService trafficService = ContextHelper.get().beanForType(TrafficService.class);
-                trafficService.handleTrafficEntry(uploadEntry);
-            }
-
-            unexpire(cachedResource);
-            return cachedResource;
-        } catch (Exception e) {
-            // set exception here before the remote stream is closed to signal an error
-            Throwable ioCause = ExceptionUtils.getCauseOfTypes(e, IOException.class);
-            if (ioCause != null) {
-                log.error("IO error while trying to download resource '{}': {}: {}", remoteRepoPath,
-                        ioCause.getClass().getName(), HttpClientUtils.getErrorMessage(ioCause));
-                log.debug("IO error while trying to download resource '{}': {}",
-                        remoteResource.getRepoPath(), ioCause.getMessage(), ioCause);
-                setExceptionOnHandle(handle, e);
-                throw (IOException) ioCause;
-            }
-            //Repo rejected artifact - add to missed retrieval cache
-            if(e instanceof RepoRejectException) {
-                addRejectedResourceToMissedCache(remoteRepoPath, e.getMessage(), ((RepoRejectException) e).getErrorCode());
-            }
-            setExceptionOnHandle(handle, e);
-            throw e;
-        } finally {
-            Closeables.close(handle, false);
-        }
-    }
-
-    UnfoundRepoResource addRejectedResourceToMissedCache(RepoPath remoteRepoPath, String message, int errorCode) {
-        UnfoundRepoResource rejected = new UnfoundRepoResource(remoteRepoPath, Reason.REJECTED, message, errorCode);
-        missedRetrievalsCache.put(remoteRepoPath.getPath(), rejected);
-        return rejected;
-    }
-
-    private boolean isSynchronizeProperties() {
-        boolean synchronizeProperties = getDescriptor().isSynchronizeProperties();
-        ContentSynchronisation contentSynchronisation = getDescriptor().getContentSynchronisation();
-        if(contentSynchronisation!=null){
-            synchronizeProperties = synchronizeProperties || contentSynchronisation.getProperties().isEnabled();
-        }
-        return synchronizeProperties;
-    }
-
-    private void setExceptionOnHandle(ResourceStreamHandle handle, Exception e) {
-        if (handle instanceof RemoteResourceStreamHandle) {
-            ((RemoteResourceStreamHandle) handle).setThrowable(e);
-        }
-    }
-
-    private boolean shouldSearchForExistingResource(Request request) {
-        String searchForExistingResource = request.getParameter(
-                ArtifactoryRequest.PARAM_SEARCH_FOR_EXISTING_RESOURCE_ON_REMOTE_REQUEST);
-        if (StringUtils.isNotBlank(searchForExistingResource)) {
-            return Boolean.valueOf(searchForExistingResource);
-        }
-
-        return ConstantValues.searchForExistingResourceOnRemoteRequest.getBoolean();
-    }
-
-    private ResourceStreamHandle getExistingResourceByChecksum(Set<ChecksumInfo> remoteChecksums, long size) {
-        String remoteSha1 = getRemoteSha1(remoteChecksums);
-        if (!ChecksumType.sha1.isValid(remoteSha1)) {
-            RepoRequests.logToContext("Remote sha1 doesn't exist or is invalid: " + remoteSha1);
-            return null;
-        }
-        try {
-            RepoRequests.logToContext("Searching for existing resource with SHA-1 '%s'", remoteSha1);
-            BinaryService binaryService = ContextHelper.get().beanForType(BinaryService.class);
-            InputStream data = binaryService.getBinary(remoteSha1);
-            RepoRequests.logToContext("Found existing resource with the same checksum - " +
-                    "returning as normal content handle");
-            return new SimpleResourceStreamHandle(data, size);
-        } catch (BinaryNotFoundException e) {
-            // not found - resume
-            return null;
-        }
-    }
-
-    private String getRemoteSha1(Set<ChecksumInfo> remoteChecksums) {
-        for (ChecksumInfo remoteChecksum : remoteChecksums) {
-            if (ChecksumType.sha1.equals(remoteChecksum.getType())) {
-                return remoteChecksum.getOriginal();
-            }
-        }
-        return null;
-    }
-
-    private void unexpire(RepoResource cachedResource) {
-        RepoRequests.logToContext("Un-expiring cached resource if needed");
-        String relativePath = cachedResource.getRepoPath().getPath();
-        boolean isMetadata = cachedResource.isMetadata();
-
-        RepoRequests.logToContext("Is resource metadata = %s", isMetadata);
-
-        if (!isMetadata) {
-            // unexpire the file
-            RepoRequests.logToContext("Un-expiring the resource");
-            getRepositoryService().unexpireIfExists(localCacheRepo, relativePath);
-            // remove it from bad retrieval caches
-            RepoRequests.logToContext("Removing the resource from all failed caches");
-            removeFromCaches(relativePath, false);
-        }
-    }
-
-    private boolean foundExpiredAndRemoteIsNewer(RepoResource remoteResource, RepoResource cachedResource) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        DebianAddon debianAddon = addonsManager.addonByType(DebianAddon.class);
-        return debianAddon.foundExpiredAndRemoteIsNewer(remoteResource, cachedResource);
-    }
-
-    private boolean cachedExpiredAndNewerThanRemote(RepoResource remoteResource, RepoResource cachedResource) {
-        return cachedResource.isExpired() && remoteResource.getLastModified() <= cachedResource.getLastModified();
-    }
-
-    private boolean notFoundAndNotExpired(RepoResource cachedResource) {
-        return !cachedResource.isFound() && !cachedResource.isExpired();
-    }
-
-    private Set<ChecksumInfo> getRemoteChecksums(String path,RepoResource remoteResource) {
-        Set<ChecksumInfo> checksums = new HashSet<>();
-        for (ChecksumType checksumType : ChecksumType.BASE_CHECKSUM_TYPES) {
-            String checksum = null;
-            try {
-                RepoRequests.logToContext("Trying to find remote checksum - %s", checksumType.ext());
-                checksum = getRemoteChecksum(path + checksumType.ext(),remoteResource);
-            } catch (FileNotFoundException e) {
-                RepoRequests.logToContext("Remote checksum file doesn't exist");
-            } catch (Exception e) {
-                RepoRequests.logToContext("Error occurred while retrieving remote checksum: %s", e.getMessage());
-            }
-            ChecksumInfo info = new ChecksumInfo(checksumType, null, null);
-            if (StringUtils.isNotBlank(checksum)) {
-                RepoRequests.logToContext("Found remote checksum with the value - %s", checksum);
-                // set the remote checksum only if it is a valid string for that checksum
-                if (checksumType.isValid(checksum)) {
-                    info = new ChecksumInfo(checksumType, checksum, null);
-                } else {
-                    RepoRequests.logToContext("Remote checksum is invalid");
-                }
-            }
-            checksums.add(info);
-        }
-        return checksums;
-    }
-
-    @Override
-    public String getChecksum(String path, RepoResource res) throws IOException {
-        String value = null;
-        if (isStoreArtifactsLocally()) {
-            //We assume the resource is already contained in the repo-cache
-            value = localCacheRepo.getChecksum(path, res);
-        } else {
-            try {
-                value = getRemoteChecksum(path,res);
-            } catch (RemoteRequestException e) {
-                // ok to fail with 404, just return null (which translates to not exist in higher levels)
-                if (e.getRemoteReturnCode() != HttpStatus.SC_NOT_FOUND) {
-                    throw e;
-                }
-            }
-        }
-        return value;
-    }
-
-    @Override
-    @Nullable
-    public LocalCacheRepo getLocalCacheRepo() {
-        return localCacheRepo;
-    }
-
-    @Override
-    @Nonnull
-    public List<RemoteItem> listRemoteResources(String directoryPath) {
-        assert !isOffline() : "Should never be called in offline mode";
-        if (!isRemoteRepoListingAllowed(directoryPath)) {
-            return Collections.emptyList();
-        }
-        List<RemoteItem> cachedUrls = remoteResourceCache.get(directoryPath);
-        if (CollectionUtils.notNullOrEmpty(cachedUrls)) {
-            return cachedUrls;
-        }
-
-        UnfoundRepoResource unfoundRepoResource = ((UnfoundRepoResource) missedRetrievalsCache.get(directoryPath));
-        if (unfoundRepoResource != null) {
-            return Collections.emptyList();
-        }
-
-        List<RemoteItem> urls = null;
-        String fullDirectoryUrl = directoryPath;
-        if (!HttpUtils.isAbsolute(directoryPath)) {
-            fullDirectoryUrl = removeApiFromUrlAndAppend(directoryPath);
-        }
-
-        try {
-            urls = getChildUrls(fullDirectoryUrl);
-        } catch (IOException e) {
-            log.debug("Error while listing remote resources", e);
-            addRemoteListingEntryToMissedCache(directoryPath, e);
-            RemoteRequestException remoteError =
-                    (RemoteRequestException) ExceptionUtils.getCauseOfTypes(e, RemoteRequestException.class);
-            if (remoteError == null || remoteError.getRemoteReturnCode() != HttpStatus.SC_NOT_FOUND) {
-                log.info("Error listing remote resources {}: {}", fullDirectoryUrl, e.getMessage());
-            }
-        }
-
-        if (CollectionUtils.isNullOrEmpty(urls)) {
-            log.debug("No remote URLS where found for: {}", fullDirectoryUrl);
-            return Lists.newArrayList();
-        }
-        remoteResourceCache.put(directoryPath, urls);
-        return urls;
-    }
-
-    protected String appendAndGetUrl(String pathToAppend) {
-        boolean isPropertiesRequest = pathToAppend.endsWith(":properties");
-        if (HttpUtils.isAbsolute(pathToAppend) && !isPropertiesRequest) {
-            return pathToAppend;
-        }
-
-        if (isPropertiesRequest) {
-            return removeApiFromUrlAndAppend(pathToAppend);
-        }
-
-        String remoteUrl = getUrl();
-        StringBuilder baseUrlBuilder = new StringBuilder(remoteUrl);
-        if (!remoteUrl.endsWith("/")) {
-            baseUrlBuilder.append("/");
-        }
-        baseUrlBuilder.append(pathToAppend);
-        return baseUrlBuilder.toString();
-    }
-
-    private String removeApiFromUrlAndAppend(String pathToAppend) {
-        //If remote url ends with / it messes up the path builder, since we already add it below it's safe to remove
-        String remoteUrl = PathUtils.trimTrailingSlashes(getUrl());
-        ArtifactoryStandardUrlResolver artifactoryStandardUrlResolver = new ArtifactoryStandardUrlResolver(remoteUrl);
-        StringBuilder baseUrlBuilder = new StringBuilder(artifactoryStandardUrlResolver.getBaseUrl())
-                .append("/").append(artifactoryStandardUrlResolver.getRepoKey());
-        if (!remoteUrl.endsWith("/")) {
-            baseUrlBuilder.append("/");
-        }
-        baseUrlBuilder.append(pathToAppend);
-        return baseUrlBuilder.toString();
-    }
-
-    private void addRemoteListingEntryToMissedCache(String directoryPath, IOException e) {
-        if (!missedRetrievalsCache.containsKey(directoryPath)) {
-            String message = e.getMessage();
-            missedRetrievalsCache.put(directoryPath, new UnfoundRepoResource(getRepoPath(directoryPath), message));
-        }
-    }
-
-    protected abstract List<RemoteItem> getChildUrls(String dirUrl) throws IOException;
-
-    @Override
-    public void clearCaches() {
-        clearCaches(missedRetrievalsCache, remoteResourceCache);
-    }
-
-    @Override
-    public void removeFromCaches(String path, boolean removeSubPaths) {
-        removeFromCaches(path, removeSubPaths, missedRetrievalsCache, remoteResourceCache);
-    }
-
-    /**
-     * Executed before actual download. May return an alternate handle with its own input stream to circumvent download
-     */
-    private void beforeResourceDownload(RepoResource resource, Properties properties, Request request) {
-        boolean fetchSourcesEagerly = getDescriptor().isFetchSourcesEagerly();
-        boolean fetchJarsEagerly = getDescriptor().isFetchJarsEagerly();
-
-        RepoRequests.logToContext("Eager source JAR fetching enabled = %s", fetchSourcesEagerly);
-        RepoRequests.logToContext("Eager JAR fetching enabled = %s", fetchJarsEagerly);
-
-        if (!fetchSourcesEagerly && !fetchJarsEagerly) {
-            // eager fetching is disabled
-            RepoRequests.logToContext("Eager JAR and source JAR fetching is disabled");
-            return;
-        }
-        String replicationDownload = request.getParameter(ArtifactoryRequest.PARAM_REPLICATION_DOWNLOAD_REQUESET);
-        if (StringUtils.isNotBlank(replicationDownload) && Boolean.valueOf(replicationDownload)) {
-            // Do not perform eager fetching in case of replication download
-            RepoRequests.logToContext("Eager JAR and source JAR fetching is disabled for replication download request");
-            return;
-        }
-        RepoPath repoPath = resource.getRepoPath();
-        MavenArtifactInfo artifactInfo = MavenArtifactInfo.fromRepoPath(repoPath);
-        boolean validMavenArtifactInfo = artifactInfo.isValid();
-        boolean artifactHasClassifier = artifactInfo.hasClassifier();
-
-        RepoRequests.logToContext("Valid Maven artifact info = %s", validMavenArtifactInfo);
-        RepoRequests.logToContext("Artifact has classifier = %s", artifactHasClassifier);
-
-        if (!validMavenArtifactInfo || artifactHasClassifier) {
-            RepoRequests.logToContext("Eager JAR and source JAR fetching is not attempted");
-            return;
-        }
-
-        String eagerPath;
-
-        boolean artifactIsPom = "pom".equals(artifactInfo.getType());
-        boolean artifactIsJar = "jar".equals(artifactInfo.getType());
-
-        MavenArtifactInfo eagerFetchArtifactInfo = new MavenArtifactInfo(artifactInfo);
-        if (fetchJarsEagerly && artifactIsPom) {
-            eagerFetchArtifactInfo.setType(MavenArtifactInfo.JAR);
-            eagerPath = eagerFetchArtifactInfo.getPath();
-            RepoRequests.logToContext("Eagerly fetching JAR '%s'", eagerPath);
-        } else if (fetchSourcesEagerly && artifactIsJar) {
-            eagerFetchArtifactInfo.setClassifier("sources");
-            eagerPath = eagerFetchArtifactInfo.getPath();
-            RepoRequests.logToContext("Eagerly fetching source JAR '%s'", eagerPath);
-        } else {
-            RepoRequests.logToContext("Eager JAR and source JAR fetching is not attempted");
-            return;
-        }
-
-        // Attach matrix params is exist
-        eagerPath += buildRequestMatrixParams(properties);
-
-        // pass the repo path to download eagerly
-        EagerResourcesDownloader resourcesDownloader =
-                InternalContextHelper.get().beanForType(EagerResourcesDownloader.class);
-        RepoPath eagerRepoPath = InternalRepoPathFactory.create(getDescriptor().getKey(), eagerPath);
-        resourcesDownloader.downloadAsync(eagerRepoPath);
-    }
-
-    /**
-     * Returns the checksum value from the given path of a remote checksum file
-     *
-     * @param path Path to remote checksum
-     * @return Checksum value from the remote source
-     * @throws IOException If remote checksum is not found or there was a problem retrieving it
-     */
-    private String getRemoteChecksum(String path,RepoResource remoteResource) throws IOException {
-         if (!isMavenFamilyRepo(remoteResource)){
-             return null;
-         }
-        try (ResourceStreamHandle handle = downloadResource(path)) {
-            InputStream is = handle.getInputStream();
-            return ChecksumUtil.checksumStringFromStream(is);
-        }
-    }
-
-    /**
-     * check if it is maven repo
-     * @param remoteResource - remote resource
-     * @return if true it maven repo
-     */
-    private boolean isMavenFamilyRepo(RepoResource remoteResource) {
-        RemoteRepoDescriptor remoteRepoDescriptor = getRepositoryService().
-                remoteRepoDescriptorByKey(remoteResource.getRepoPath().getRepoKey());
-        return (remoteRepoDescriptor.getType().equals(RepoType.Maven) || remoteRepoDescriptor.getType().equals(RepoType.Ivy) ||
-                remoteRepoDescriptor.getType().equals(RepoType.Gradle) || remoteRepoDescriptor.getType().equals(RepoType.SBT));
-    }
-
-    private boolean isNonMavenRepo() {
-        return StringUtils.contains(getUrl(), "registry.npmjs.org") || StringUtils.contains(getUrl(), "docker.io");
-    }
-
-    /**
-     * Returns the remote properties of the given path
-     *
-     * @param relPath Relative path of artifact properties to synchronize
-     * @return Properties if found in remote. Empty if not
-     */
-    private Properties getRemoteProperties(String relPath) {
-        Properties properties = (Properties) InfoFactoryHolder.get().createProperties();
-        ResourceStreamHandle handle = null;
-        try {
-            RepoRequests.logToContext("Trying to download remote properties");
-            handle = downloadResource(relPath + ":" + Properties.ROOT);
-            InputStream is = handle.getInputStream();
-            if (is != null) {
-                RepoRequests.logToContext("Received remote property content");
-                Properties remoteProperties = (Properties) InfoFactoryHolder.get().getFileSystemXStream().fromXML(is);
-                for (String remotePropertyKey : remoteProperties.keySet()) {
-                    Set<String> values = remoteProperties.get(remotePropertyKey);
-                    RepoRequests.logToContext("Found remote property key '{}' with values '%s'", remotePropertyKey,
-                            values);
-                    if (!remotePropertyKey.startsWith(ReplicationAddon.PROP_REPLICATION_PREFIX)) {
-                        properties.putAll(remotePropertyKey, values);
-                    }
-                }
-            }
-        } catch (Exception e) {
-            properties = null;
-            RepoRequests.logToContext("Error occurred while retrieving remote properties: %s", e.getMessage());
-        } finally {
-            IOUtils.closeQuietly(handle);
-        }
-        return properties;
-    }
-
-    /**
-     * To be called when retrieving an artifact which was found expired and it's remote was not newer. Synchronizes the
-     * properties of the remote artifact with the local cached one
-     *
-     * @param repoPath Repo path to synchronize
-     */
-    private void synchronizeExpiredResourceProperties(RepoPath repoPath) {
-        if (!getDescriptor().isSynchronizeProperties()) {
-            RepoRequests.logToContext("Remote property synchronization is disabled - " +
-                    "expired resource property synchronization not attempted");
-            return;
-        }
-
-        try {
-            String artifactRelativePath = repoPath.getPath();
-            String propertiesRelativePath = artifactRelativePath + ":" + Properties.ROOT;
-            RepoPath propertiesRepoPath = InternalRepoPathFactory.create(repoPath.getRepoKey(), propertiesRelativePath,
-                    repoPath.isFolder());
-            String remotePropertiesRelativePath = getAltRemotePath(propertiesRepoPath);
-            if (!propertiesRepoPath.getPath().equals(remotePropertiesRelativePath)) {
-                RepoRequests.logToContext("Remote resource path was altered by the user plugins to - %s",
-                        remotePropertiesRelativePath);
-            }
-
-            LocalCacheRepo cache = getLocalCacheRepo();
-            RepoResource cachedPropertiesResource;
-            if (cache != null) {
-                cachedPropertiesResource = cache.getInfo(new NullRequestContext(propertiesRepoPath));
-            } else {
-                RepoRequests.logToContext("Local cache repo was not initialized");
-                return;
-            }
-
-            Properties properties = (Properties) InfoFactoryHolder.get().createProperties();
-
-            //Send HEAD
-            RepoResource remoteResource = retrieveInfo(remotePropertiesRelativePath, propertiesRepoPath.isFolder(),
-                    null);
-            if (remoteResource.isFound()) {
-                RepoRequests.logToContext("Found remote properties");
-                if (cachedPropertiesResource.isFound() &&
-                        (cachedPropertiesResource.getLastModified() > remoteResource.getLastModified())) {
-                    RepoRequests.logToContext("Remote properties were not modified - no changes will be applied");
-                    // remote properties are not newer
-                    return;
-                }
-
-                ResourceStreamHandle resourceStreamHandle = downloadResource(remotePropertiesRelativePath);
-                InputStream inputStream = null;
-                try {
-                    inputStream = resourceStreamHandle.getInputStream();
-                    Properties remoteProperties = (Properties) InfoFactoryHolder.get().getFileSystemXStream().fromXML(
-                            inputStream);
-                    for (String remotePropertyKey : remoteProperties.keySet()) {
-                        Set<String> values = remoteProperties.get(remotePropertyKey);
-                        RepoRequests.logToContext("Found remote property key '{}' with values '%s'", remotePropertyKey,
-                                values);
-                        if (!remotePropertyKey.startsWith(ReplicationAddon.PROP_REPLICATION_PREFIX)) {
-                            properties.putAll(remotePropertyKey, values);
-                        }
-                    }
-                } finally {
-                    IOUtils.closeQuietly(inputStream);
-                }
-            } else {
-                RepoRequests.logToContext("Found no remote properties");
-            }
-
-            RepoPath localCacheRepoPath = InternalRepoPathFactory.create(cache.getKey(), artifactRelativePath);
-            getRepositoryService().setProperties(localCacheRepoPath, properties);
-        } catch (Exception e) {
-            String repoPathId = repoPath.getId();
-            log.error("Unable to synchronize the properties of the item '{}' with the remote resource: {}",
-                    repoPathId, e.getMessage());
-            RepoRequests.logToContext("Error occurred while synchronizing the properties: %s", e.getMessage());
-        }
-    }
-
-    private RepoResource getMissedResource(String path) {
-        return missedRetrievalsCache.get(path);
-    }
-
-    /**
-     * Allow plugins to override the path
-     *
-     * @param repoPath The original repo path
-     * @return Alternative path from the plugin or the same if no plugin changes it
-     */
-    private String getAltRemotePath(RepoPath repoPath) {
-        RepoRequests.logToContext("Executing any AltRemotePath user plugins that may exist");
-        AddonsManager addonsManager = InternalContextHelper.get().beanForType(AddonsManager.class);
-        PluginsAddon pluginAddon = addonsManager.addonByType(PluginsAddon.class);
-        PathCtx pathCtx = new PathCtx(repoPath.getPath());
-        pluginAddon.execPluginActions(AltRemotePathAction.class, pathCtx, repoPath);
-        String path = pathCtx.getPath();
-        return path;
-    }
-
-    /**
-     * Allow plugins to override the path
-     *
-     * @param repoPath
-     * @return
-     */
-    private ResourceStreamHandle getAltContent(RepoPath repoPath) {
-        RepoRequests.logToContext("Executing any AltRemoteContent user plugins that may exist");
-        AddonsManager addonsManager = InternalContextHelper.get().beanForType(AddonsManager.class);
-        PluginsAddon pluginAddon = addonsManager.addonByType(PluginsAddon.class);
-        ResourceStreamCtx rsCtx = new ResourceStreamCtx();
-        pluginAddon.execPluginActions(AltRemoteContentAction.class, rsCtx, repoPath);
-        InputStream is = rsCtx.getInputStream();
-        if (is != null) {
-            RepoRequests.logToContext("Received alternative content from a user plugin - " +
-                    "using as a normal content handle");
-            return new SimpleResourceStreamHandle(is, rsCtx.getSize());
-        }
-
-        RepoRequests.logToContext("Received no alternative content handle from a user plugin");
-        return null;
-    }
-
-    private void clearCaches(Map<String, ?>... caches) {
-        for (Map<String, ?> cache : caches) {
-            if (cache != null) {
-                cache.clear();
-            }
-        }
-    }
-
-    private void removeFromCaches(String path, boolean removeSubPaths, Map<String, ?>... caches) {
-        for (Map<String, ?> cache : caches) {
-            if (cache != null && !cache.isEmpty()) {
-                cache.remove(path);
-                if (removeSubPaths) {
-                    removeSubPathsFromCache(path, cache);
-                }
-            }
-        }
-    }
-
-    private void removeSubPathsFromCache(String basePath, Map<String, ?> cache) {
-        Iterator<String> cachedPaths = cache.keySet().iterator();
-        while (cachedPaths.hasNext()) {
-            String key = cachedPaths.next();
-            if (key.startsWith(basePath)) {
-                cachedPaths.remove();
-            }
-        }
-    }
-
-    /**
-     * Constructs a matrix params string from the given properties ready to attach to an HTTP request
-     *
-     * @param requestProperties Properties to construct. Can be null
-     * @return HTTP request ready property chain
-     */
-    protected String buildRequestMatrixParams(Properties requestProperties) {
-        StringBuilder requestPropertyBuilder = new StringBuilder();
-        if (requestProperties != null) {
-            for (Map.Entry<String, String> requestPropertyEntry : requestProperties.entries()) {
-                requestPropertyBuilder.append(Properties.MATRIX_PARAMS_SEP);
-
-                String key = requestPropertyEntry.getKey();
-                boolean isMandatory = false;
-                if (key.endsWith(Properties.MANDATORY_SUFFIX)) {
-                    key = key.substring(0, key.length() - 1);
-                    isMandatory = true;
-                }
-                requestPropertyBuilder.append(key);
-                if (isMandatory) {
-                    requestPropertyBuilder.append("+");
-                }
-                String value = requestPropertyEntry.getValue();
-                if (StringUtils.isNotBlank(value)) {
-                    requestPropertyBuilder.append("=").append(value);
-                }
-            }
-        }
-        return requestPropertyBuilder.toString();
-    }
-
-    /**
-     * Intercepts response to apply RemoteRepo business logic
-     *
-     * @param response {@link org.apache.http.client.methods.CloseableHttpResponse}
-     */
-    protected final CloseableHttpResponse interceptResponse(CloseableHttpResponse response) {
-        if(isResourceUnavailable(response.getStatusLine())) {
-            putOffline();
-        }
-        return response;
-    }
-
-    /**
-     * Checks whether response code falls into ResourceUnavailable marked status codes
-     *
-     * @param status {@link org.apache.http.StatusLine}
-     *
-     * @return true if response.status is one of HttpRepo#offlineStatusCodes
-     *         members or false
-     */
-    protected final boolean isResourceUnavailable(StatusLine status) {
-        return offlineStatusCodes.contains(Integer.valueOf(status.getStatusCode()));
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/Repo.java b/backend/core/src/main/java/org/artifactory/repo/Repo.java
deleted file mode 100644
index 78d5544..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/Repo.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.repo.exception.FileExpectedException;
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.io.checksum.policy.ChecksumPolicy;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.request.InternalRequestContext;
-import org.artifactory.resource.ResourceStreamHandle;
-
-import java.io.IOException;
-
-/**
- * @author Yoav Landman
- */
-public interface Repo<T extends RepoDescriptor> {
-    String getKey();
-
-    String getDescription();
-
-    void init();
-
-    void destroy();
-
-    /**
-     * @see org.artifactory.descriptor.repo.RepoDescriptor#isReal()
-     */
-    boolean isReal();
-
-    boolean isLocal();
-
-    boolean isCache();
-
-    InternalRepositoryService getRepositoryService();
-
-    /**
-     * Returns the resource info (not the resource content but the metadata)
-     *
-     * @param context Additional parameters to pass to the repository.
-     * @return RepoResource. UnfoundRepoResource will be returned if the resource not found in this repo.
-     */
-    RepoResource getInfo(InternalRequestContext context) throws FileExpectedException;
-
-    /**
-     * Get the checksum of the resource based on the repository checksum policy (if there is one).
-     *
-     * @param checksumPath The url to the checksum file
-     * @param res          The repo resource of the file the checksum is requested on
-     * @return The checksum value. Might be null
-     * @throws IOException If tried and failed to retrieve the checksum from db/remote source.
-     */
-    String getChecksum(String checksumPath, RepoResource res) throws IOException;
-
-    ResourceStreamHandle getResourceStreamHandle(InternalRequestContext requestContext, RepoResource res)
-            throws IOException, FileExpectedException, RepoRejectException;
-
-    ModuleInfo getItemModuleInfo(String itemPath);
-
-    ModuleInfo getDescriptorModuleInfo(String descriptorPath);
-
-    ModuleInfo getArtifactModuleInfo(String artifactPath);
-
-    RepoPath getRepoPath(String path);
-
-    T getDescriptor();
-
-    ChecksumPolicy getChecksumPolicy();
-
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/repo/RepoBase.java b/backend/core/src/main/java/org/artifactory/repo/RepoBase.java
deleted file mode 100644
index bc227f2..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/RepoBase.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import org.apache.commons.io.FilenameUtils;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.filteredresources.FilteredResourcesAddon ;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.module.ModuleInfoUtils;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.util.GlobalExcludes;
-import org.artifactory.util.PathMatcher;
-import org.artifactory.util.PathUtils;
-
-import java.io.IOException;
-import java.util.List;
-
-public abstract class RepoBase<T extends RepoDescriptor> implements Repo<T> {
-    private final T descriptor;
-    private final InternalRepositoryService repositoryService;
-    protected List<String> excludes;
-    private List<String> includes;
-
-    protected RepoBase(T descriptor, InternalRepositoryService repositoryService) {
-        this.repositoryService = repositoryService;
-        this.descriptor = descriptor;
-        this.includes = PathUtils.includesExcludesPatternToStringList(descriptor.getIncludesPattern());
-        this.excludes = PathUtils.includesExcludesPatternToStringList(descriptor.getExcludesPattern());
-        excludes.addAll(GlobalExcludes.getGlobalExcludes());
-    }
-
-    @Override
-    public T getDescriptor() {
-        return descriptor;
-    }
-
-    @Override
-    public RepoPath getRepoPath(String path) {
-        return InternalRepoPathFactory.create(getKey(), path);
-    }
-
-    @Override
-    public InternalRepositoryService getRepositoryService() {
-        return repositoryService;
-    }
-
-    @Override
-    public ModuleInfo getItemModuleInfo(String itemPath) {
-        ModuleInfo moduleInfo = getDescriptorModuleInfo(itemPath);
-
-        if (!moduleInfo.isValid()) {
-            moduleInfo = getArtifactModuleInfo(itemPath);
-        }
-
-        return moduleInfo;
-    }
-
-    @Override
-    public ModuleInfo getArtifactModuleInfo(String artifactPath) {
-        RepoLayout repoLayout = getDescriptor().getRepoLayout();
-        if (org.apache.commons.lang.StringUtils.isBlank(artifactPath) || (repoLayout == null)) {
-            return new ModuleInfo();
-        }
-        return ModuleInfoUtils.moduleInfoFromArtifactPath(artifactPath, getDescriptor().getRepoLayout());
-    }
-
-    @Override
-    public ModuleInfo getDescriptorModuleInfo(String descriptorPath) {
-        RepoLayout repoLayout = getDescriptor().getRepoLayout();
-        if (org.apache.commons.lang.StringUtils.isBlank(descriptorPath) || (repoLayout == null)) {
-            return new ModuleInfo();
-        }
-        return ModuleInfoUtils.moduleInfoFromDescriptorPath(descriptorPath, repoLayout);
-    }
-
-    @Override
-    public String getKey() {
-        return descriptor.getKey();
-    }
-
-    @Override
-    public String getDescription() {
-        return descriptor.getDescription();
-    }
-
-    @Override
-    public boolean isReal() {
-        return getDescriptor().isReal();
-    }
-
-    @Override
-    public boolean isCache() {
-        return false;
-    }
-
-    public boolean accepts(RepoPath repoPath) {
-        if (repoPath.isRoot()) {
-            return true;    // always accepts the root path
-        }
-        String path = repoPath.getPath();
-        if (NamingUtils.isSystem(path)) {
-            // includes/excludes should not affect system paths
-            return true;
-        }
-
-        String toCheck = path;
-        //For artifactory metadata the pattern apply to the object it represents
-        if (NamingUtils.isProperties(path)) {
-            toCheck = NamingUtils.getMetadataParentPath(path);
-        } else if (NamingUtils.isChecksum(path)) {
-            toCheck = FilenameUtils.removeExtension(path);
-        }
-        return isPathPatternValid(repoPath, toCheck);
-    }
-
-    /**
-     * @param repoPath repo path to validate
-     * @param path       folder path
-     * @return True if the path pattern is valid according to include / exclude policy
-     */
-    public boolean isPathPatternValid(RepoPath repoPath, String path) {
-        return StringUtils.isBlank(path) || PathMatcher.matches(path, includes, excludes, repoPath.isFolder());
-    }
-
-    @Override
-    public String getChecksum(String checksumPath, RepoResource resource) throws IOException {
-        if (resource == null || !resource.isFound()) {
-            throw new IOException("Could not get resource stream. Path not found: " + checksumPath + ".");
-        }
-        ChecksumType checksumType = ChecksumType.forFilePath(checksumPath);
-        if (checksumType == null) {
-            throw new IllegalArgumentException("Checksum type not found for path " + checksumPath);
-        }
-        return getChecksumPolicy().getChecksum(checksumType, resource.getInfo().getChecksums(), resource.getRepoPath());
-    }
-
-    @Override
-    public String toString() {
-        return getKey();
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof RepoBase)) {
-            return false;
-        }
-        RepoBase base = (RepoBase) o;
-        return descriptor.equals(base.descriptor);
-    }
-
-    @Override
-    public int hashCode() {
-        return descriptor.hashCode();
-    }
-
-    @Override
-    public void destroy() {
-    }
-
-    protected final AuthorizationService getAuthorizationService() {
-        return InternalContextHelper.get().getAuthorizationService();
-    }
-
-    /**
-     * Checks if the resource should not be cached by the requesting end, and marks it expirable if so.
-     *
-     * @param res resource to be checked
-     */
-    protected void checkAndMarkExpirableResource(RepoResource res) {
-        boolean markAsExpired = false;
-        if (res.isFound() && !res.isExpirable()) {
-            //Maven metadata
-            if (MavenNaming.isMavenMetadata(res.getRepoPath().getPath())) {
-                markAsExpired = true;
-            }
-            //Maven non-unique snapshot
-            if (MavenNaming.isNonUniqueSnapshot(res.getRepoPath().getPath())) {
-                markAsExpired = true;
-            }
-            //Filtered Resource
-            FilteredResourcesAddon filteredResourcesAddon = ContextHelper.get().beanForType(AddonsManager.class)
-                    .addonByType(FilteredResourcesAddon.class);
-            if (filteredResourcesAddon.isFilteredResourceFile(res.getRepoPath())) {
-                markAsExpired = true;
-            }
-
-            if (markAsExpired) {
-                res.expirable();
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/repo/RepoRepoPath.java b/backend/core/src/main/java/org/artifactory/repo/RepoRepoPath.java
deleted file mode 100644
index 16b07c5..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/RepoRepoPath.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-/**
- * An utility object that caches a repoPath with its repository
- * <p/>
- *
- * @author yoavl
- */
-public final class RepoRepoPath<R extends Repo> {
-
-    private final R repo;
-    private final RepoPath repoPath;
-
-    public RepoRepoPath(R repo, RepoPath repoPath) {
-        this.repo = repo;
-        this.repoPath = repoPath;
-    }
-
-    public R getRepo() {
-        return repo;
-    }
-
-    public RepoPath getRepoPath() {
-        return repoPath;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        RepoRepoPath that = (RepoRepoPath) o;
-        return repoPath.equals(that.repoPath);
-    }
-
-    @Override
-    public int hashCode() {
-        return repoPath.hashCode();
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/repo/StoringRepo.java b/backend/core/src/main/java/org/artifactory/repo/StoringRepo.java
deleted file mode 100644
index 97db442..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/StoringRepo.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.io.checksum.policy.ChecksumPolicy;
-import org.artifactory.repo.local.PathDeletionContext;
-import org.artifactory.sapi.interceptor.DeleteContext;
-import org.artifactory.storage.fs.VfsItemFactory;
-
-import java.io.IOException;
-
-public interface StoringRepo<T extends RepoDescriptor> extends Repo<T>, VfsItemFactory {
-
-    @Override
-    boolean itemExists(String relPath);
-
-    /**
-     * Save the resource in the repository.
-     */
-    RepoResource saveResource(SaveResourceContext context) throws IOException, RepoRejectException;
-
-    /**
-     * Undeploy (delete) the path specified in the context
-     *
-     * @param ctx Context for deletion see {@link DeleteContext}
-     */
-    void undeploy(DeleteContext ctx);
-
-    boolean shouldProtectPathDeletion(PathDeletionContext pathDeletionContext);
-
-    @Override
-    ChecksumPolicy getChecksumPolicy();
-
-    boolean isWriteLocked(RepoPath repoPath);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/repo/cache/expirable/CacheExpirable.java b/backend/core/src/main/java/org/artifactory/repo/cache/expirable/CacheExpirable.java
deleted file mode 100644
index 0e448dd..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/cache/expirable/CacheExpirable.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cache.expirable;
-
-import org.artifactory.repo.LocalCacheRepo;
-
-import java.io.Serializable;
-
-/**
- * Interface for classes that determine whether an artifact can expire.
- * Examples of expirable artifacts are calculated metadata, non-unique snapshots, filtered resources etc.
- *
- * @author Noam Y. Tenne
- */
-public interface CacheExpirable extends Serializable {
-
-    /**
-     * Indicates whether the specified path can ever expire
-     *
-     * @param localCacheRepo Holding cache
-     * @param path           Path to check
-     * @return True if the path can ever expire
-     */
-    boolean isExpirable(LocalCacheRepo localCacheRepo, String path);
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/cache/expirable/CacheExpiry.java b/backend/core/src/main/java/org/artifactory/repo/cache/expirable/CacheExpiry.java
deleted file mode 100644
index 6dab779..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/cache/expirable/CacheExpiry.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cache.expirable;
-
-import org.artifactory.spring.ReloadableBean;
-
-/**
- * @author Noam Y. Tenne
- */
-public interface CacheExpiry extends ReloadableBean, CacheExpirable {
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/cache/expirable/CacheExpiryImpl.java b/backend/core/src/main/java/org/artifactory/repo/cache/expirable/CacheExpiryImpl.java
deleted file mode 100644
index 63abef0..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/cache/expirable/CacheExpiryImpl.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cache.expirable;
-
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.repo.LocalCacheRepo;
-import org.artifactory.spring.ArtifactoryApplicationContext;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.version.CompoundVersionDetails;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.BeanNameAware;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
-import org.springframework.stereotype.Service;
-
-import java.util.Collection;
-import java.util.Set;
-
-/**
- * Aggregates and polls all the cache expirable components when needing to determine if a path can expire
- *
- * @author Noam Y. Tenne
- */
- at Service
- at Reloadable(beanClass = CacheExpiry.class, initAfter = DbService.class)
-public class CacheExpiryImpl implements CacheExpiry, BeanNameAware, ApplicationContextAware {
-    private static final Logger log = LoggerFactory.getLogger(CacheExpiryImpl.class);
-
-    private ArtifactoryApplicationContext context;
-    private Set<CacheExpirable> expirable = Sets.newHashSet();
-    private String beanName;
-
-    @Override
-    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
-        context = ((ArtifactoryApplicationContext) applicationContext);
-    }
-
-    @Override
-    public void setBeanName(String name) {
-        beanName = name;
-    }
-
-    @Override
-    public void init() {
-        Collection<CacheExpirable> allExpirableIncludingMe = context.beansForType(CacheExpirable.class).values();
-        Object thisAsBean = context.getBean(beanName);
-        for (CacheExpirable t : allExpirableIncludingMe) {
-            if (t != thisAsBean) {
-                expirable.add(t);
-            }
-        }
-        log.debug("Loaded expirable: {}", expirable);
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-    }
-
-    @Override
-    public void destroy() {
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-    }
-
-    @Override
-    public boolean isExpirable(LocalCacheRepo localCacheRepo, String path) {
-        if (StringUtils.isNotBlank(path)) {
-            for (CacheExpirable cacheExpirable : expirable) {
-                if (cacheExpirable.isExpirable(localCacheRepo, path)) {
-                    return true;
-                }
-            }
-        }
-
-        return false;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/cache/expirable/CacheExpiryStrategy.java b/backend/core/src/main/java/org/artifactory/repo/cache/expirable/CacheExpiryStrategy.java
deleted file mode 100644
index 92caa08..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/cache/expirable/CacheExpiryStrategy.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cache.expirable;
-
-import org.artifactory.fs.RepoResource;
-
-/**
- * Strategy object to determine whether an artifact is expired
- *
- * @author Shay Yaakov
- */
-public interface CacheExpiryStrategy {
-
-    boolean foundExpiredAndRemoteIsNewer(RepoResource remoteResource, RepoResource cachedResource);
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/cache/expirable/CacheExpiryStrategyImpl.java b/backend/core/src/main/java/org/artifactory/repo/cache/expirable/CacheExpiryStrategyImpl.java
deleted file mode 100644
index bf4451d..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/cache/expirable/CacheExpiryStrategyImpl.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.artifactory.repo.cache.expirable;
-
-import org.artifactory.fs.RepoResource;
-import org.artifactory.request.RepoRequests;
-
-/**
- * Default implementation of expiry strategy which checks the file last modified date
- *
- * @author Shay Yaakov
- */
-public class CacheExpiryStrategyImpl implements CacheExpiryStrategy {
-
-    @Override
-    public boolean foundExpiredAndRemoteIsNewer(RepoResource remoteResource, RepoResource cachedResource) {
-        boolean remoteIsNewer = cachedResource.isExpired() && remoteResource.getLastModified() > cachedResource.getLastModified();
-        RepoRequests.logToContext("Found expired cached resource but remote is newer = %s. Cached resource: %s, Remote resource: %s",
-                remoteIsNewer, cachedResource.getLastModified(), remoteResource.getLastModified());
-        return remoteIsNewer;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/cache/expirable/MavenIndexCacheExpirable.java b/backend/core/src/main/java/org/artifactory/repo/cache/expirable/MavenIndexCacheExpirable.java
deleted file mode 100644
index afb1780..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/cache/expirable/MavenIndexCacheExpirable.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cache.expirable;
-
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.repo.LocalCacheRepo;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Noam Y. Tenne
- */
- at Component
-public class MavenIndexCacheExpirable implements CacheExpirable {
-
-    @Override
-    public boolean isExpirable(LocalCacheRepo localCacheRepo, String path) {
-        return MavenNaming.isIndex(path);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/cache/expirable/MavenMetadataCacheExpirable.java b/backend/core/src/main/java/org/artifactory/repo/cache/expirable/MavenMetadataCacheExpirable.java
deleted file mode 100644
index c52d8dd..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/cache/expirable/MavenMetadataCacheExpirable.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cache.expirable;
-
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.repo.LocalCacheRepo;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Noam Y. Tenne
- */
- at Component
-public class MavenMetadataCacheExpirable implements CacheExpirable {
-
-    @Override
-    public boolean isExpirable(LocalCacheRepo localCacheRepo, String path) {
-        return MavenNaming.isMavenMetadata(path);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/cache/expirable/NonUniqueSnapshotArtifactExpirableOrOverridable.java b/backend/core/src/main/java/org/artifactory/repo/cache/expirable/NonUniqueSnapshotArtifactExpirableOrOverridable.java
deleted file mode 100644
index 9b94538..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/cache/expirable/NonUniqueSnapshotArtifactExpirableOrOverridable.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cache.expirable;
-
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.repo.LocalCacheRepo;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.local.LocalNonCacheOverridable;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Noam Y. Tenne
- */
- at Component
-public class NonUniqueSnapshotArtifactExpirableOrOverridable implements CacheExpirable, LocalNonCacheOverridable {
-
-    @Override
-    public boolean isExpirable(LocalCacheRepo localCacheRepo, String path) {
-        return isIntegrationAndNonUnique(localCacheRepo, path);
-    }
-
-    @Override
-    public boolean isOverridable(LocalRepo repo, String path) {
-        return isIntegrationAndNonUnique(repo, path);
-    }
-
-    private boolean isIntegrationAndNonUnique(LocalRepo repo, String path) {
-        return repo.getItemModuleInfo(path).isIntegration() && !MavenNaming.isUniqueSnapshot(path);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/cache/expirable/ZapItemVisitor.java b/backend/core/src/main/java/org/artifactory/repo/cache/expirable/ZapItemVisitor.java
deleted file mode 100644
index 29c6200..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/cache/expirable/ZapItemVisitor.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cache.expirable;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.descriptor.repo.LocalCacheRepoDescriptor;
-import org.artifactory.repo.db.DbCacheRepo;
-import org.artifactory.sapi.fs.MutableVfsFile;
-import org.artifactory.sapi.fs.MutableVfsFolder;
-import org.artifactory.sapi.fs.VfsFile;
-import org.artifactory.sapi.fs.VfsFolder;
-import org.artifactory.sapi.fs.VfsItem;
-import org.artifactory.sapi.fs.VfsItemVisitor;
-
-import java.util.List;
-
-/**
- * Zap expired cache items. Sets the last updated value of expirable files and folders to a value that will make them
- * expired.
- *
- * @author Yossi Shaul
- */
-public class ZapItemVisitor implements VfsItemVisitor {
-
-    private final DbCacheRepo cacheRepo;
-    private long expiredLastUpdated;
-    private int updatedItemsCount;
-
-    /**
-     * @param cacheRepo The cache repo containing the files to visit
-     */
-    public ZapItemVisitor(DbCacheRepo cacheRepo) {
-        this.cacheRepo = cacheRepo;
-        LocalCacheRepoDescriptor descriptor = cacheRepo.getDescriptor();
-        long retrievalCachePeriodMillis = descriptor.getRetrievalCachePeriodMillis();
-        expiredLastUpdated = System.currentTimeMillis() - retrievalCachePeriodMillis;
-    }
-
-    /**
-     * @param file File to visit. Must reside inside the cache repo.
-     */
-    @Override
-    public void visit(VfsFile file) {
-        CacheExpiry cacheExpiry = ContextHelper.get().beanForType(CacheExpiry.class);
-        if (cacheExpiry.isExpirable(cacheRepo, file.getPath())) {
-            // zap has a meaning only on non unique snapshot files
-            MutableVfsFile mutableFile = cacheRepo.getMutableFile(file.getRepoPath());
-            mutableFile.setUpdated(expiredLastUpdated);
-            updatedItemsCount++;
-        }
-    }
-
-    /**
-     * @param folder Folder to visit. Must reside inside the cache repo.
-     */
-    @Override
-    public void visit(VfsFolder folder) {
-        // folders are always expirable
-        MutableVfsFolder mutableFolder = cacheRepo.getMutableFolder(folder.getRepoPath());
-        mutableFolder.setUpdated(expiredLastUpdated);
-        updatedItemsCount++;
-
-        // zap children
-        List<VfsItem> children = folder.getImmutableChildren();
-        for (VfsItem child : children) {
-            visit(child);
-        }
-    }
-
-    /**
-     * @return Number of files and folders affected
-     */
-    public int getUpdatedItemsCount() {
-        return updatedItemsCount;
-    }
-
-    @Override
-    public void visit(VfsItem visitable) {
-        if (visitable.isFile()) {
-            visit((VfsFile) visitable);
-        } else {
-            visit((VfsFolder) visitable);
-        }
-    }
-
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/cache/expirable/vcs/GitRefsCacheExpirable.java b/backend/core/src/main/java/org/artifactory/repo/cache/expirable/vcs/GitRefsCacheExpirable.java
deleted file mode 100644
index c891cee..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/cache/expirable/vcs/GitRefsCacheExpirable.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.artifactory.repo.cache.expirable.vcs;
-
-import org.artifactory.repo.LocalCacheRepo;
-import org.artifactory.repo.cache.expirable.CacheExpirable;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Shay Yaakov
- */
- at Component
-public class GitRefsCacheExpirable implements CacheExpirable {
-    @Override
-    public boolean isExpirable(LocalCacheRepo localCacheRepo, String path) {
-        return path.endsWith("gitrefs");
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/cache/trashable/MavenNonTrashable.java b/backend/core/src/main/java/org/artifactory/repo/cache/trashable/MavenNonTrashable.java
deleted file mode 100644
index 2c4caad..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/cache/trashable/MavenNonTrashable.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cache.trashable;
-
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.repo.service.trash.NonTrashableItem;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Shay Yaakov
- */
- at Component
-public class MavenNonTrashable implements NonTrashableItem {
-
-    @Override
-    public boolean skipTrash(LocalRepoDescriptor descriptor, String path) {
-        boolean mavenSupport = RepoType.Maven.equals(descriptor.getType());
-        return mavenSupport && (MavenNaming.isMavenMetadata(path) || MavenNaming.isIndex(path));
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/cleanup/ArtifactCleanupJob.java b/backend/core/src/main/java/org/artifactory/repo/cleanup/ArtifactCleanupJob.java
deleted file mode 100644
index 4da7309..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/cleanup/ArtifactCleanupJob.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cleanup;
-
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.repo.replication.RemoteReplicationJob;
-import org.artifactory.repo.service.ExportJob;
-import org.artifactory.repo.service.ImportJob;
-import org.artifactory.schedule.JobCommand;
-import org.artifactory.schedule.StopCommand;
-import org.artifactory.schedule.StopStrategy;
-import org.artifactory.schedule.TaskUser;
-import org.artifactory.schedule.quartz.QuartzCommand;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-
-/**
- * A quartz command job that periodically cleans remote-repository caches from unused artifacts
- *
- * @author Noam Tenne
- */
- at JobCommand(singleton = true,
-        schedulerUser = TaskUser.SYSTEM,
-        manualUser = TaskUser.SYSTEM,
-        description = "Remote Repositories Cached Artifacts Cleanup",
-        commandsToStop = {
-                @StopCommand(command = ImportJob.class, strategy = StopStrategy.IMPOSSIBLE),
-                @StopCommand(command = ExportJob.class, strategy = StopStrategy.IMPOSSIBLE),
-                @StopCommand(command = RemoteReplicationJob.class, strategy = StopStrategy.IMPOSSIBLE)}
-)
-public class ArtifactCleanupJob extends QuartzCommand {
-
-    @Override
-    protected void onExecute(JobExecutionContext callbackContext) throws JobExecutionException {
-        ArtifactoryContext artifactoryContext = ContextHelper.get();
-        InternalArtifactCleanupService cleaner = artifactoryContext.beanForType(InternalArtifactCleanupService.class);
-        cleaner.clean();
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/cleanup/ArtifactCleanupServiceImpl.java b/backend/core/src/main/java/org/artifactory/repo/cleanup/ArtifactCleanupServiceImpl.java
deleted file mode 100644
index a8aa32e..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/cleanup/ArtifactCleanupServiceImpl.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cleanup;
-
-import com.google.common.collect.Lists;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.SearchService;
-import org.artifactory.api.search.stats.StatsSearchControls;
-import org.artifactory.api.search.stats.StatsSearchResult;
-import org.artifactory.descriptor.cleanup.CleanupConfigDescriptor;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.repo.LocalCacheRepoDescriptor;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.schedule.BaseTaskServiceDescriptorHandler;
-import org.artifactory.schedule.Task;
-import org.artifactory.schedule.TaskBase;
-import org.artifactory.schedule.TaskInterruptedException;
-import org.artifactory.schedule.TaskService;
-import org.artifactory.schedule.TaskUtils;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.storage.service.StatsServiceImpl;
-import org.artifactory.version.CompoundVersionDetails;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.Calendar;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-import java.util.function.Predicate;
-
-/**
- * The main implementation of the clean-up service
- *
- * @author Noam Tenne
- */
- at Service
- at Reloadable(beanClass = InternalArtifactCleanupService.class,
-        initAfter = {TaskService.class, InternalRepositoryService.class})
-public class ArtifactCleanupServiceImpl implements InternalArtifactCleanupService {
-
-    private static final Logger log = LoggerFactory.getLogger(ArtifactCleanupServiceImpl.class);
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Autowired
-    private StatsServiceImpl statsService;
-
-    @Autowired
-    private InternalRepositoryService repositoryService;
-
-    @Autowired
-    private SearchService searchService;
-
-    @Override
-    public void init() {
-        reload(null);
-    }
-
-    @Override
-    public void reload(@Nullable CentralConfigDescriptor oldDescriptor) {
-        CentralConfigDescriptor descriptor = centralConfigService.getDescriptor();
-        CleanupConfigDescriptor oldCleanupConfig = null;
-        if (oldDescriptor != null) {
-            oldCleanupConfig = oldDescriptor.getCleanupConfig();
-        }
-        new CleanupConfigDescriptorHandler(descriptor.getCleanupConfig(), oldCleanupConfig).reschedule();
-    }
-
-    @Override
-    public void destroy() {
-        new CleanupConfigDescriptorHandler(null, null).unschedule();
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-        //nop
-    }
-
-    @Override
-    public String callManualArtifactCleanup(BasicStatusHolder statusHolder) {
-        TaskService taskService = InternalContextHelper.get().getTaskService();
-        taskService.checkCanStartManualTask(ArtifactCleanupJob.class, statusHolder);
-        if (!statusHolder.isError()) {
-            try {
-                TaskBase task = TaskUtils.createManualTask(ArtifactCleanupJob.class, 0L);
-                return taskService.startTask(task, true, true);
-            } catch (Exception e) {
-                statusHolder.error("Error scheduling manual artifact cleanup", e, log);
-            }
-        }
-        return null;
-    }
-
-    static class CleanupConfigDescriptorHandler extends BaseTaskServiceDescriptorHandler<CleanupConfigDescriptor> {
-
-        final List<CleanupConfigDescriptor> oldDescriptorHolder = Lists.newArrayList();
-        final List<CleanupConfigDescriptor> newDescriptorHolder = Lists.newArrayList();
-
-        CleanupConfigDescriptorHandler(CleanupConfigDescriptor newDesc, CleanupConfigDescriptor oldDesc) {
-            if (newDesc != null) {
-                newDescriptorHolder.add(newDesc);
-            }
-            if (oldDesc != null) {
-                oldDescriptorHolder.add(oldDesc);
-            }
-        }
-
-        @Override
-        public String jobName() {
-            return "Artifact Cleanup";
-        }
-
-        @Override
-        public List<CleanupConfigDescriptor> getNewDescriptors() {
-            return newDescriptorHolder;
-        }
-
-        @Override
-        public List<CleanupConfigDescriptor> getOldDescriptors() {
-            return oldDescriptorHolder;
-        }
-
-        @Override
-        public Predicate<Task> getAllPredicate() {
-            return input -> input == null || ArtifactCleanupJob.class.isAssignableFrom(input.getType());
-        }
-
-        @Override
-        public Predicate<Task> getPredicate(@Nonnull CleanupConfigDescriptor descriptor) {
-            return getAllPredicate();
-        }
-
-        @Override
-        public void activate(@Nonnull CleanupConfigDescriptor descriptor, boolean manual) {
-            TaskBase cleanupTask = TaskUtils.createCronTask(ArtifactCleanupJob.class, descriptor.getCronExp());
-            InternalContextHelper.get().getTaskService().startTask(cleanupTask, manual, manual);
-        }
-
-        @Override
-        public CleanupConfigDescriptor findOldFromNew(@Nonnull CleanupConfigDescriptor newDescriptor) {
-            return oldDescriptorHolder.isEmpty() ? null : oldDescriptorHolder.get(0);
-        }
-    }
-
-    @Override
-    public void clean() {
-        // flush the download statistics before starting the cleanup
-        statsService.flushStats();
-        List<LocalCacheRepoDescriptor> cachedRepoDescriptors = repositoryService.getCachedRepoDescriptors();
-        for (LocalCacheRepoDescriptor cachedRepoDescriptor : cachedRepoDescriptors) {
-            performCleanOnRepo(cachedRepoDescriptor);
-        }
-    }
-
-    private void performCleanOnRepo(LocalCacheRepoDescriptor cachedRepoDescriptor) {
-        String repoKey = cachedRepoDescriptor.getKey();
-        long periodMillis = getHoursInMillis(
-                cachedRepoDescriptor.getRemoteRepo().getUnusedArtifactsCleanupPeriodHours());
-        if (periodMillis <= 0) {
-            log.debug("Skipping auto-clean on repository '{}': period value is {}.", repoKey, periodMillis);
-            return;
-        }
-
-        LocalRepo storingRepo = repositoryService.localOrCachedRepositoryByKey(repoKey);
-        //Perform sanity checks
-        if (storingRepo == null) {
-            log.warn("Could not find the storing repository '{}' - auto-clean was not performed.", repoKey);
-            return;
-        }
-        if (!storingRepo.isCache()) {
-            log.warn("Cannot cleanup non-cache repository '{}'.", repoKey);
-            return;
-        }
-
-        doClean(repoKey, periodMillis);
-    }
-
-    private void doClean(String repoKey, long periodMillis) {
-        log.info("Auto-clean has begun on the repository '{}' with period of {} millis.", repoKey, periodMillis);
-
-        //Calculate unused artifact expiry
-        long expiryMillis = (System.currentTimeMillis() - periodMillis);
-
-        //Perform a metadata search on the given repo. Look for artifacts that have lastDownloaded stats
-        StatsSearchControls searchControls = new StatsSearchControls();
-        searchControls.setLimitSearchResults(false);
-        searchControls.addRepoToSearch(repoKey);
-        Calendar calendar = Calendar.getInstance();
-        calendar.setTimeInMillis(expiryMillis);
-        searchControls.setDownloadedSince(calendar);
-        ItemSearchResults<StatsSearchResult> metadataSearchResults =
-                searchService.searchArtifactsNotDownloadedSince(searchControls);
-
-        int iterationCount = 0;
-        int cleanedArtifactsCount = 0;
-        for (StatsSearchResult searchResult : metadataSearchResults.getResults()) {
-            if ((++iterationCount % 10 == 0) && TaskUtils.pauseOrBreak()) {
-                throw new TaskInterruptedException();
-            }
-            RepoPath repoPath = searchResult.getItemInfo().getRepoPath();
-            long lastDownloaded = searchResult.getLastDownloaded();
-
-            //If the artifact wasn't downloaded within the expiry window, remove it
-            if (expiryMillis > lastDownloaded) {
-                try {
-                    repositoryService.undeploy(repoPath,
-                            false);  // no need for maven metadata calculation on cache repos
-                    cleanedArtifactsCount++;
-                } catch (Exception e) {
-                    log.error(String.format("Could not auto-clean artifact '%s'.", repoPath.getId()), e);
-                }
-            } else {
-                log.warn("Querying for unused artifacts returned a used one " + repoPath);
-            }
-        }
-
-        log.info("Auto-clean on the repository '{}' has ended. {} artifact(s) were cleaned",
-                repoKey, cleanedArtifactsCount);
-    }
-
-    /**
-     * Returns the given number of hours, in milliseconds
-     *
-     * @param hours Number of hours to convert
-     * @return Number of hours - In milliseconds
-     */
-    private long getHoursInMillis(int hours) {
-        return TimeUnit.HOURS.toMillis(hours);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/cleanup/FolderPruningJob.java b/backend/core/src/main/java/org/artifactory/repo/cleanup/FolderPruningJob.java
deleted file mode 100644
index 93e67f1..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/cleanup/FolderPruningJob.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cleanup;
-
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.schedule.JobCommand;
-import org.artifactory.schedule.TaskUser;
-import org.artifactory.schedule.quartz.QuartzCommand;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-
-/**
- * A quartz command job that periodically prune empty folders
- *
- * @author Shay Yaakov with kind help from Fred Simon
- */
- at JobCommand(singleton = true,
-        schedulerUser = TaskUser.SYSTEM,
-        manualUser = TaskUser.SYSTEM,
-        description = "Empty Folders Pruning Job",
-        runOnlyOnPrimary = false)
-public class FolderPruningJob extends QuartzCommand {
-
-    @Override
-    protected void onExecute(JobExecutionContext callbackContext) throws JobExecutionException {
-        ArtifactoryContext artifactoryContext = ContextHelper.get();
-        InternalFolderPruningService integrationCleaner = artifactoryContext.beanForType(
-                InternalFolderPruningService.class);
-        integrationCleaner.doPrune();
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/cleanup/FolderPruningService.java b/backend/core/src/main/java/org/artifactory/repo/cleanup/FolderPruningService.java
deleted file mode 100644
index 54adfd0..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/cleanup/FolderPruningService.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cleanup;
-
-import org.artifactory.repo.RepoPath;
-import org.artifactory.spring.ReloadableBean;
-
-/**
- * Service to support folders pruning in a separate transaction asynchronously.
- *
- * @author Yossi Shaul
- */
-public interface FolderPruningService extends ReloadableBean {
-
-    /**
-     * Adds the repo path to the prune queue and prunes all the folders in the queue.
-     *
-     * @param folderRepoPath Repo path of a folder to prune (to add to the queue)
-     */
-    void prune(RepoPath folderRepoPath);
-
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/cleanup/FolderPruningServiceImpl.java b/backend/core/src/main/java/org/artifactory/repo/cleanup/FolderPruningServiceImpl.java
deleted file mode 100644
index 27be29f..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/cleanup/FolderPruningServiceImpl.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cleanup;
-
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.repo.exception.ItemNotFoundRuntimeException;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.schedule.TaskBase;
-import org.artifactory.schedule.TaskService;
-import org.artifactory.schedule.TaskUtils;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.version.CompoundVersionDetails;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Asynchronous implementation of folder pruning.
- * This implementation allows only one thread to perform actual pruning.
- *
- * @author Shay Yaakov
- */
- at Service
- at Reloadable(beanClass = InternalFolderPruningService.class,
-        initAfter = {TaskService.class, InternalRepositoryService.class})
-public class FolderPruningServiceImpl implements InternalFolderPruningService {
-    private static final Logger log = LoggerFactory.getLogger(FolderPruningServiceImpl.class);
-
-    @Autowired
-    private RepositoryService repoService;
-
-    @Autowired
-    private TaskService taskService;
-
-    private ConcurrentLinkedQueue<CandidatePruningFolder> foldersToPrune = new ConcurrentLinkedQueue<>();
-    private Semaphore pruneSemaphore = new Semaphore(1);
-
-    static class CandidatePruningFolder {
-        final RepoPath folderPath;
-        final Long insertTime;
-
-        CandidatePruningFolder(RepoPath folderPath, Long insertTime) {
-            this.folderPath = folderPath;
-            this.insertTime = insertTime;
-        }
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-    }
-
-    @Override
-    public void init() {
-        TaskBase folderPruningTask = TaskUtils.createRepeatingTask(FolderPruningJob.class,
-                TimeUnit.SECONDS.toMillis(ConstantValues.folderPruningIntervalSecs.getLong()),
-                TimeUnit.SECONDS.toMillis(ConstantValues.folderPruningIntervalSecs.getLong()));
-        taskService.startTask(folderPruningTask, false);
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-    }
-
-    @Override
-    public void destroy() {
-    }
-
-    @Override
-    public void doPrune() {
-        if (!pruneSemaphore.tryAcquire()) {
-            log.debug("Received prune empty folders request, but a pruning process is already running.");
-            return;
-        }
-
-        try {
-            CandidatePruningFolder queuedFolderRepoPath;
-            while ((queuedFolderRepoPath = foldersToPrune.peek()) != null) {
-                long timeSinceRequest = System.currentTimeMillis() - queuedFolderRepoPath.insertTime;
-                long quietPeriod = TimeUnit.SECONDS.toMillis(ConstantValues.folderPruningQuietPeriodSecs.getLong());
-                long delta = quietPeriod - timeSinceRequest;
-                if (delta > 0) {
-                    // In the quiet period let's wait for better time
-                    if (delta < quietPeriod / 2L) {
-                        // Let's just wait here
-                        Thread.sleep(delta);
-                        continue;
-                    }
-                    // Wait for next execution
-                    break;
-                }
-                queuedFolderRepoPath = foldersToPrune.poll();
-                if (queuedFolderRepoPath == null) {
-                    break;
-                }
-                doPruneSingleRepoPath(queuedFolderRepoPath.folderPath);
-            }
-        } catch (InterruptedException e) {
-            log.error("Got interrupted waiting for quiet period", e);
-        } finally {
-            pruneSemaphore.release();
-        }
-    }
-
-    @Override
-    public void prune(RepoPath folderRepoPath) {
-        log.trace("Prune called for {}", folderRepoPath);
-        if (folderRepoPath.isRoot()) {
-            return;
-        }
-
-        if (foldersToPrune.offer(new CandidatePruningFolder(folderRepoPath, System.currentTimeMillis()))) {
-            log.debug("Added folder repo path '{}' to pruning queue.", folderRepoPath);
-        }
-    }
-
-    private void doPruneSingleRepoPath(RepoPath repoPathToPrune) {
-        try {
-            ItemInfo unlockedItemInfo = repoService.getItemInfo(repoPathToPrune);
-            if (!unlockedItemInfo.isFolder()) {
-                log.warn("Cannot prune the file '{}', can only prune folders.", repoPathToPrune);
-                return;
-            }
-
-            List<String> childrenNames = repoService.getChildrenNames(repoPathToPrune);
-            if (childrenNames.isEmpty() || hasOnlyMavenMetadataChild(childrenNames)) {
-                log.debug("Pruning empty folder '{}'", repoPathToPrune);
-                repoService.undeploy(repoPathToPrune, false, true);
-            } else {
-                log.debug("Skipping pruning of folder '{}' since it has children.", repoPathToPrune);
-            }
-        } catch (ItemNotFoundRuntimeException e) {
-            log.debug("Could not find repo path {}: {}", repoPathToPrune, e.getMessage());
-        }
-    }
-
-    private boolean hasOnlyMavenMetadataChild(List<String> childrenNames) {
-        return childrenNames.size() == 1 && MavenNaming.MAVEN_METADATA_NAME.equals(childrenNames.get(0));
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/cleanup/IntegrationCleanupCandidate.java b/backend/core/src/main/java/org/artifactory/repo/cleanup/IntegrationCleanupCandidate.java
deleted file mode 100644
index 3da6e4c..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/cleanup/IntegrationCleanupCandidate.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cleanup;
-
-import org.artifactory.repo.RepoPath;
-
-/**
- * Represents an integration file candidate to be deleted, the actual comparison (equals and hashCode)
- * are done on the parent folder since this is the unique key we would like to save.
- * The file repo path is saved because we calculate the module info from it.
- *
- * @author Shay Yaakov
- */
-public class IntegrationCleanupCandidate {
-    private RepoPath fileRepoPath;
-
-    public IntegrationCleanupCandidate(RepoPath fileRepoPath) {
-        this.fileRepoPath = fileRepoPath;
-    }
-
-    public RepoPath getFileRepoPath() {
-        return fileRepoPath;
-    }
-
-    public RepoPath getParentRepoPath() {
-        return fileRepoPath.getParent();
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof IntegrationCleanupCandidate)) {
-            return false;
-        }
-
-        IntegrationCleanupCandidate that = (IntegrationCleanupCandidate) o;
-
-        if (!getParentRepoPath().equals(that.getParentRepoPath())) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return getParentRepoPath().hashCode();
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/cleanup/IntegrationCleanupJob.java b/backend/core/src/main/java/org/artifactory/repo/cleanup/IntegrationCleanupJob.java
deleted file mode 100644
index 404469f..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/cleanup/IntegrationCleanupJob.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cleanup;
-
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.schedule.JobCommand;
-import org.artifactory.schedule.TaskUser;
-import org.artifactory.schedule.quartz.QuartzCommand;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-
-/**
- * A quartz command job that periodically cleans unique maven snapshots
- *
- * @author Shay Yaakov
- */
- at JobCommand(singleton = true,
-        schedulerUser = TaskUser.SYSTEM,
-        manualUser = TaskUser.SYSTEM,
-        runOnlyOnPrimary = false,
-        description = "Integration/Snapshot Versions Cleanup")
-public class IntegrationCleanupJob extends QuartzCommand {
-
-    @Override
-    protected void onExecute(JobExecutionContext callbackContext) throws JobExecutionException {
-        ArtifactoryContext artifactoryContext = ContextHelper.get();
-        InternalIntegrationCleanupService integrationCleaner = artifactoryContext.beanForType(
-                InternalIntegrationCleanupService.class);
-        integrationCleaner.clean();
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/cleanup/IntegrationCleanupServiceImpl.java b/backend/core/src/main/java/org/artifactory/repo/cleanup/IntegrationCleanupServiceImpl.java
deleted file mode 100644
index 6539f32..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/cleanup/IntegrationCleanupServiceImpl.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cleanup;
-
-import com.google.common.collect.Maps;
-import com.google.common.collect.Ordering;
-import com.google.common.collect.Sets;
-import com.google.common.collect.TreeMultimap;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.module.ModuleInfoBuilder;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.repo.snapshot.SnapshotVersionsRetriever;
-import org.artifactory.schedule.TaskBase;
-import org.artifactory.schedule.TaskService;
-import org.artifactory.schedule.TaskUtils;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.version.CompoundVersionDetails;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.Calendar;
-import java.util.Map;
-import java.util.NavigableSet;
-import java.util.Set;
-import java.util.SortedSet;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-/**
- * The main implementation of the maven unique snapshots clean-up service
- *
- * @author Shay Yaakov
- */
- at Service
- at Reloadable(beanClass = InternalIntegrationCleanupService.class,
-        initAfter = {TaskService.class, InternalRepositoryService.class})
-public class IntegrationCleanupServiceImpl implements InternalIntegrationCleanupService {
-    private static final Logger log = LoggerFactory.getLogger(IntegrationCleanupServiceImpl.class);
-
-    /**
-     * Holds all the snapshot folders to be cleaned up by the job worker (1.0-SNAPSHOT, 1.1-SNAPSHOT etc)
-     * Each folder is getting cleaned only if it's time (the time it was putted inside the map) exceeds the global time window
-     */
-    private ConcurrentMap<IntegrationCleanupCandidate, Long> foldersInTransit = new ConcurrentHashMap<>();
-    private Semaphore cleanupSemaphore = new Semaphore(1);
-    private final long quietPeriodSecs = ConstantValues.integrationCleanupQuietPeriodSecs.getLong();
-
-    @Autowired
-    private InternalRepositoryService repositoryService;
-
-    @Autowired
-    private FolderPruningService pruningService;
-
-    @Autowired
-    private TaskService taskService;
-
-    @Override
-    public void clean() {
-        if (!cleanupSemaphore.tryAcquire()) {
-            log.debug("Received integration cleanup request, but a cleanup process is already running.");
-            return;
-        }
-
-        try {
-            if (!foldersInTransit.isEmpty()) {
-                for (Map.Entry<IntegrationCleanupCandidate, Long> current : foldersInTransit.entrySet()) {
-                    //Make sure to wait the defined amount of time before cleaning
-                    log.debug("Checking if integration cleanup can be scheduled for {}",
-                            current.getKey().getParentRepoPath());
-                    long secondsSinceLastAdded = TimeUnit.MILLISECONDS.toSeconds(
-                            System.currentTimeMillis() - current.getValue());
-
-                    if (secondsSinceLastAdded >= quietPeriodSecs) {
-                        IntegrationCleanupCandidate queuedCandidate = current.getKey();
-                        foldersInTransit.remove(queuedCandidate);
-                        conditionalCleanup(queuedCandidate.getFileRepoPath());
-                    }
-                }
-            }
-        } finally {
-            cleanupSemaphore.release();
-        }
-    }
-
-    @Override
-    public void addItemToCache(RepoPath fileRepoPath) {
-        IntegrationCleanupCandidate candidate = new IntegrationCleanupCandidate(fileRepoPath);
-        Long previousValue = foldersInTransit.putIfAbsent(candidate, System.currentTimeMillis());
-        if (previousValue == null) {
-            log.debug("Added integration folder '{}' to folders in transit map.", fileRepoPath.getParent());
-        }
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-    }
-
-    @Override
-    public void init() {
-        TaskBase integrationCleanupTask = TaskUtils.createRepeatingTask(IntegrationCleanupJob.class,
-                TimeUnit.SECONDS.toMillis(ConstantValues.integrationCleanupIntervalSecs.getLong()),
-                TimeUnit.SECONDS.toMillis(ConstantValues.integrationCleanupIntervalSecs.getLong()));
-        taskService.startTask(integrationCleanupTask, false);
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-    }
-
-    @Override
-    public void destroy() {
-    }
-
-    /**
-     * The integration cleanup deletes artifacts according to the snapshot and the classifier,
-     * unlike the previous approach that was to deletes artifacts according to the snapshot only,
-     * See issue RTFACT-6675
-     */
-    private void conditionalCleanup(RepoPath repoPath) {
-        LocalRepo repo = repositoryService.localRepositoryByKey(repoPath.getRepoKey());
-        if (repo == null) {
-            return;
-        }
-
-        SnapshotVersionsRetriever retriever = new SnapshotVersionsRetriever(false);
-        ModuleInfo deployedModuleInfo = repositoryService.getItemModuleInfo(repoPath);
-        ModuleInfo baseRevisionModule = getBaseRevisionModuleInfo(deployedModuleInfo);
-        TreeMultimap<Calendar, ItemInfo> cleanupCandidates = retriever.collectVersionsItems(repo, baseRevisionModule,
-                false);
-        Map<String,TreeMultimap<Calendar, ItemInfo>> cleanupCandidatesByClassifier=forkByClassifier(cleanupCandidates);
-        for (TreeMultimap<Calendar, ItemInfo> calendarItemInfoTreeMultimap : cleanupCandidatesByClassifier.values()) {
-            while (calendarItemInfoTreeMultimap.keySet().size() > repo.getMaxUniqueSnapshots()) {
-                performCleanup(calendarItemInfoTreeMultimap);
-            }
-        }
-
-    }
-
-
-
-    private Map<String, TreeMultimap<Calendar, ItemInfo>> forkByClassifier(
-            TreeMultimap<Calendar, ItemInfo> cleanupCandidates) {
-        Map<String, TreeMultimap<Calendar, ItemInfo>> result= Maps.newHashMap();
-        for (Calendar calendar : cleanupCandidates.keySet()) {
-            NavigableSet<ItemInfo> itemInfos = cleanupCandidates.get(calendar);
-            for (ItemInfo itemInfo : itemInfos) {
-                String classifier=resolveClassifier(itemInfo);
-                TreeMultimap<Calendar, ItemInfo> classifierMap = result.get(classifier);
-                if(classifierMap==null){
-                    //classifierMap= TreeMultimap.create(Ordering.natural().reverse(), Ordering.natural().reverse());
-                    classifierMap= TreeMultimap.create(Ordering.natural(), Ordering.natural());;
-                    result.put(classifier,classifierMap);
-                }
-                classifierMap.put(calendar,itemInfo);
-            }
-        }
-        return result;
-    }
-
-    private String resolveClassifier(ItemInfo itemInfo) {
-        String classifier = repositoryService.getItemModuleInfo(itemInfo.getRepoPath()).getClassifier();
-        return classifier!=null?classifier:"";
-    }
-
-    private ModuleInfo getBaseRevisionModuleInfo(ModuleInfo deployedModuleInfo) {
-        return new ModuleInfoBuilder().organization(deployedModuleInfo.getOrganization()).
-                module(deployedModuleInfo.getModule()).baseRevision(deployedModuleInfo.getBaseRevision()).build();
-    }
-
-    private void performCleanup(TreeMultimap<Calendar, ItemInfo> cleanupCandidates) {
-        Calendar first = cleanupCandidates.keySet().first();
-
-        Set<RepoPath> parents = Sets.newHashSet();
-        SortedSet<ItemInfo> itemsToRemove = cleanupCandidates.removeAll(first);
-        for (ItemInfo itemToRemove : itemsToRemove) {
-            RepoPath repoPath = itemToRemove.getRepoPath();
-            repositoryService.undeploy(repoPath, false, false);
-            parents.add(repoPath.getParent());
-            log.info("Removed old unique snapshot '{}'.", itemToRemove.getRelPath());
-        }
-        // May need to prune the parents of deleted files
-        for (RepoPath parent : parents) {
-            pruningService.prune(parent);
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/cleanup/InternalArtifactCleanupService.java b/backend/core/src/main/java/org/artifactory/repo/cleanup/InternalArtifactCleanupService.java
deleted file mode 100644
index 90b5edf..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/cleanup/InternalArtifactCleanupService.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cleanup;
-
-import org.artifactory.api.repo.cleanup.ArtifactCleanupService;
-import org.artifactory.spring.ReloadableBean;
-
-/**
- * The main internal interface of the clean-up service
- *
- * @author Noam Tenne
- */
-public interface InternalArtifactCleanupService extends ArtifactCleanupService, ReloadableBean {
-
-    /**
-     * Cleans the remote repository's cache from artifacts that hasn't been used in the configured time period
-     */
-    void clean();
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/cleanup/InternalFolderPruningService.java b/backend/core/src/main/java/org/artifactory/repo/cleanup/InternalFolderPruningService.java
deleted file mode 100644
index 5ddcd23..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/cleanup/InternalFolderPruningService.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cleanup;
-
-/**
- * Date: 2/13/13
- * Time: 12:42 PM
- *
- * @author freds
- */
-public interface InternalFolderPruningService extends FolderPruningService {
-    void doPrune();
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/cleanup/InternalIntegrationCleanupService.java b/backend/core/src/main/java/org/artifactory/repo/cleanup/InternalIntegrationCleanupService.java
deleted file mode 100644
index 42f52a4..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/cleanup/InternalIntegrationCleanupService.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cleanup;
-
-import org.artifactory.repo.RepoPath;
-import org.artifactory.spring.ReloadableBean;
-
-/**
- * The main internal maven unique snapshots cleanup service
- *
- * @author Shay Yaakov
- */
-public interface InternalIntegrationCleanupService extends ReloadableBean {
-
-    /**
-     * Performs the actual clean.
-     * This method is protected by a semaphore as only one thread is allowed entering here.
-     */
-    void clean();
-
-    /**
-     * Adds the given {@link RepoPath} parent to the cache so that the job reading this queue will perform the clean on it.
-     *
-     * @param fileRepoPath The file repo path which is later used to calculate module info from
-     */
-    void addItemToCache(RepoPath fileRepoPath);
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/cleanup/InternalVirtualCacheCleanupService.java b/backend/core/src/main/java/org/artifactory/repo/cleanup/InternalVirtualCacheCleanupService.java
deleted file mode 100644
index 9c8ac7a..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/cleanup/InternalVirtualCacheCleanupService.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cleanup;
-
-import org.artifactory.api.repo.cleanup.VirtualCacheCleanupService;
-import org.artifactory.spring.ReloadableBean;
-
-/**
- * @author Yoav Luft
- */
-public interface InternalVirtualCacheCleanupService extends VirtualCacheCleanupService, ReloadableBean {
-    /**
-     * Start cleanup of artifacts and metadata cached by virtual repositories
-     */
-    void clean();
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/cleanup/VirtualCacheCleanupJob.java b/backend/core/src/main/java/org/artifactory/repo/cleanup/VirtualCacheCleanupJob.java
deleted file mode 100644
index e3c66fa..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/cleanup/VirtualCacheCleanupJob.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cleanup;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.repo.replication.RemoteReplicationJob;
-import org.artifactory.repo.service.ExportJob;
-import org.artifactory.repo.service.ImportJob;
-import org.artifactory.schedule.JobCommand;
-import org.artifactory.schedule.StopCommand;
-import org.artifactory.schedule.StopStrategy;
-import org.artifactory.schedule.TaskUser;
-import org.artifactory.schedule.quartz.QuartzCommand;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-
-/**
- * Quartz job that cleans up the caches of virtual repositories.
- *
- * @author Yoav Luft
- */
- at JobCommand(description = "Virtual Repositories Cache Cleanup",
-        singleton = true, schedulerUser = TaskUser.SYSTEM, manualUser = TaskUser.SYSTEM,
-            commandsToStop = {
-                @StopCommand(command = ImportJob.class, strategy = StopStrategy.IMPOSSIBLE),
-                @StopCommand(command = ExportJob.class, strategy = StopStrategy.IMPOSSIBLE),
-                @StopCommand(command = RemoteReplicationJob.class, strategy = StopStrategy.IMPOSSIBLE)}
-)
-public class VirtualCacheCleanupJob extends QuartzCommand {
-
-    @Override
-    protected void onExecute(JobExecutionContext callbackContext) throws JobExecutionException {
-        InternalVirtualCacheCleanupService cleanupService = ContextHelper.get().beanForType(
-                InternalVirtualCacheCleanupService.class);
-        cleanupService.clean();
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/cleanup/VirtualCacheCleanupServiceImpl.java b/backend/core/src/main/java/org/artifactory/repo/cleanup/VirtualCacheCleanupServiceImpl.java
deleted file mode 100644
index 2944d26..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/cleanup/VirtualCacheCleanupServiceImpl.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cleanup;
-
-import com.google.common.collect.Lists;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.cleanup.CleanupConfigDescriptor;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.repo.virtual.VirtualRepo;
-import org.artifactory.sapi.search.VfsComparatorType;
-import org.artifactory.sapi.search.VfsQuery;
-import org.artifactory.sapi.search.VfsQueryResult;
-import org.artifactory.sapi.search.VfsQueryResultType;
-import org.artifactory.sapi.search.VfsQueryRow;
-import org.artifactory.sapi.search.VfsQueryService;
-import org.artifactory.schedule.BaseTaskServiceDescriptorHandler;
-import org.artifactory.schedule.Task;
-import org.artifactory.schedule.TaskBase;
-import org.artifactory.schedule.TaskService;
-import org.artifactory.schedule.TaskUtils;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.version.CompoundVersionDetails;
-import org.joda.time.DateTime;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.List;
-import java.util.function.Predicate;
-
-/**
- * @author Yoav Luft
- */
- at Service
- at Reloadable(beanClass = InternalVirtualCacheCleanupService.class,
-            initAfter = {TaskService.class, InternalRepositoryService.class})
-public class VirtualCacheCleanupServiceImpl implements InternalVirtualCacheCleanupService {
-
-    private static final Logger log = LoggerFactory.getLogger(VirtualCacheCleanupServiceImpl.class);
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Autowired
-    private InternalRepositoryService repositoryService;
-
-    @Autowired
-    private TaskService taskService;
-
-    @Autowired
-    private VfsQueryService vfsQueryService;
-
-    @Override
-    public void init() {
-        reload(null);
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-        CentralConfigDescriptor descriptor = centralConfigService.getDescriptor();
-        CleanupConfigDescriptor oldCleanupConfig = null;
-        if (oldDescriptor != null) {
-            oldCleanupConfig = oldDescriptor.getVirtualCacheCleanupConfig();
-        }
-        CleanupConfigDescriptor virtualCacheCleanupConfig = descriptor.getVirtualCacheCleanupConfig();
-        new VirtualCacheCleanupConfigHandler(virtualCacheCleanupConfig, oldCleanupConfig).reschedule();
-    }
-
-    @Override
-    public void destroy() {
-
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-
-    }
-
-    @Nullable
-    @Override
-    public String callVirtualCacheCleanup(BasicStatusHolder statusHolder) {
-        taskService.checkCanStartManualTask(VirtualCacheCleanupJob.class, statusHolder);
-        log.info("Virtual repositories cleanup was scheduled to run.");
-        if (!statusHolder.isError()) {
-            try {
-                TaskBase task = TaskUtils.createManualTask(VirtualCacheCleanupJob.class, 0L);
-                return taskService.startTask(task, true, true);
-            } catch (Exception e) {
-                statusHolder.error("Failed to run virtual cache cleanup", e, log);
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public void clean() {
-        long totalRemovedFiles = 0;
-        int maxAgeMinutes = ConstantValues.virtualCleanupMaxAgeHours.getInt();
-        if (maxAgeMinutes < 0) {
-            log.debug("Cleanup of virtual caches is disabled");
-            return;
-        }
-        log.info("Starting cleanup of virtual repositories");
-        for (VirtualRepo virtualRepo : repositoryService.getVirtualRepositories()) {
-            totalRemovedFiles += cleanRepo(virtualRepo);
-        }
-        log.info("Completed virtual repositories cleanup: removed {} cached files.", totalRemovedFiles);
-    }
-
-    private long cleanRepo(final VirtualRepo repo) {
-        int maxAgeMinutes = ConstantValues.virtualCleanupMaxAgeHours.getInt();
-        long expiryTime = new DateTime().minusMinutes(maxAgeMinutes).getMillis();
-        VfsQuery query = vfsQueryService.createQuery().expectedResult(VfsQueryResultType.FILE)
-                .name(ConstantValues.virtualCleanupNamePattern.getString()).comp(VfsComparatorType.CONTAINS)
-                .setSingleRepoKey(repo.getKey())
-                .prop("created").comp(VfsComparatorType.LOWER_THAN_EQUAL).val(expiryTime);
-        VfsQueryResult queryResult = query.execute(Integer.MAX_VALUE);
-        if (queryResult.getCount() > 0) {
-            log.info("Found {} cached files in {}", queryResult.getCount(), repo.getKey());
-        }
-        for (VfsQueryRow result : queryResult.getAllRows()) {
-            log.trace("Undeploying old cached file {}", result.getItem().getName());
-            repositoryService.undeploy(result.getItem().getRepoPath());
-        }
-        return queryResult.getCount();
-    }
-
-    static class VirtualCacheCleanupConfigHandler
-            extends BaseTaskServiceDescriptorHandler<CleanupConfigDescriptor> {
-
-        final List<CleanupConfigDescriptor> oldDescriptorHolder = Lists.newArrayList();
-        final List<CleanupConfigDescriptor> newDescriptorHolder = Lists.newArrayList();
-
-        VirtualCacheCleanupConfigHandler(CleanupConfigDescriptor newDesc, CleanupConfigDescriptor oldDesc) {
-            if (newDesc != null) {
-                newDescriptorHolder.add(newDesc);
-            }
-            if (oldDesc != null) {
-                oldDescriptorHolder.add(oldDesc);
-            }
-        }
-
-        @Override
-        public String jobName() {
-            return "Virtual Cache Cleanup";
-        }
-
-        @Override
-        public List<CleanupConfigDescriptor> getNewDescriptors() {
-            return newDescriptorHolder;
-        }
-
-        @Override
-        public List<CleanupConfigDescriptor> getOldDescriptors() {
-            return oldDescriptorHolder;
-        }
-
-        @Override
-        public Predicate<Task> getAllPredicate() {
-            return input -> input == null || VirtualCacheCleanupJob.class.isAssignableFrom(input.getType());
-        }
-
-        @Override
-        public Predicate<Task> getPredicate(@Nonnull CleanupConfigDescriptor descriptor) {
-            return getAllPredicate();
-        }
-
-        @Override
-        public void activate(@Nonnull CleanupConfigDescriptor descriptor, boolean manual) {
-            TaskBase cleanupTask = TaskUtils.createCronTask(VirtualCacheCleanupJob.class, descriptor.getCronExp());
-            InternalContextHelper.get().getTaskService().startTask(cleanupTask, manual, manual);
-        }
-
-        @Override
-        public CleanupConfigDescriptor findOldFromNew(@Nonnull CleanupConfigDescriptor newDescriptor) {
-            return oldDescriptorHolder.isEmpty() ? null : oldDescriptorHolder.get(0);
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/count/ArtifactCountRetriever.java b/backend/core/src/main/java/org/artifactory/repo/count/ArtifactCountRetriever.java
deleted file mode 100644
index 9b316d7..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/count/ArtifactCountRetriever.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.count;
-
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-import org.artifactory.schedule.CachedThreadPoolTaskExecutor;
-import org.artifactory.storage.fs.service.FileService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.concurrent.Semaphore;
-
-/**
- * Retrieves the total artifact (file) count and caching the result if the action takes too long.
- *
- * @author Shay Yaakov
- */
-public class ArtifactCountRetriever {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactCountRetriever.class);
-
-    private FileService fileService;
-    private CachedThreadPoolTaskExecutor executor;
-    private volatile int artifactCount = -1;
-    private Semaphore dbFetchSemaphore = new Semaphore(1);
-
-    public ArtifactCountRetriever() {
-        ArtifactoryContext context = ContextHelper.get();
-        this.fileService = context.beanForType(FileService.class);
-        this.executor = context.beanForType(CachedThreadPoolTaskExecutor.class);
-    }
-
-    public int getCount() {
-        if (artifactCount > -1) {
-            submitAsyncFetch();
-        } else {
-            submitSyncFetch();
-        }
-        return artifactCount;
-    }
-
-    private void submitAsyncFetch() {
-        if (!dbFetchSemaphore.tryAcquire()) {
-            log.debug("Skipping artifact count from DB since the process is already running.");
-            return;
-        }
-
-        try {
-            executor.submit(new Runnable() {
-                @Override
-                public void run() {
-                    try {
-                        artifactCount = fileService.getFilesCount();
-                    } finally {
-                        dbFetchSemaphore.release();
-                    }
-                }
-            });
-        } catch (Exception e) {
-            dbFetchSemaphore.release();
-            throw new RepositoryRuntimeException("Exception while async fetching total artifact count", e);
-        }
-    }
-
-    private void submitSyncFetch() {
-        try {
-            dbFetchSemaphore.acquire();
-            if (artifactCount < 0) {
-                artifactCount = fileService.getFilesCount();
-            }
-        } catch (InterruptedException e) {
-            log.debug("Caught interrupted exception from sync submit: {}", e);
-        } finally {
-            dbFetchSemaphore.release();
-        }
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/repo/db/DbCacheRepo.java b/backend/core/src/main/java/org/artifactory/repo/db/DbCacheRepo.java
deleted file mode 100644
index f8f79e6..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/db/DbCacheRepo.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.db;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.exception.FileExpectedException;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.repo.LocalCacheRepoDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.descriptor.repo.SnapshotVersionBehavior;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.io.checksum.policy.ChecksumPolicy;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.repo.LocalCacheRepo;
-import org.artifactory.repo.RemoteRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.cache.expirable.CacheExpiry;
-import org.artifactory.repo.cache.expirable.ZapItemVisitor;
-import org.artifactory.repo.snapshot.MavenSnapshotVersionAdapter;
-import org.artifactory.request.ArtifactoryRequest;
-import org.artifactory.request.InternalRequestContext;
-import org.artifactory.request.RepoRequests;
-import org.artifactory.request.Request;
-import org.artifactory.resource.ExpiredRepoResource;
-import org.artifactory.sapi.fs.MutableVfsItem;
-import org.artifactory.sapi.fs.VfsItem;
-import org.artifactory.sapi.interceptor.DeleteContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * A remote cache repository implementation backed by db.
- *
- * @author Yossi Shaul
- */
-public class DbCacheRepo extends DbLocalRepo<LocalCacheRepoDescriptor> implements LocalCacheRepo {
-    private static final Logger log = LoggerFactory.getLogger(DbCacheRepo.class);
-
-    private final RemoteRepo<? extends RemoteRepoDescriptor> remoteRepo;
-
-    public DbCacheRepo(RemoteRepo<? extends RemoteRepoDescriptor> remoteRepo, DbCacheRepo oldCacheRepo) {
-        super(createCacheDescriptorFromRemote(remoteRepo.getDescriptor()), remoteRepo.getRepositoryService(),
-                oldCacheRepo);
-        this.remoteRepo = remoteRepo;
-    }
-
-    private static LocalCacheRepoDescriptor createCacheDescriptorFromRemote(RemoteRepoDescriptor remoteDescriptor) {
-        // create descriptor on-the-fly since this repo is created by a remote repo
-        LocalCacheRepoDescriptor descriptor = new LocalCacheRepoDescriptor();
-        descriptor.setDescription(remoteDescriptor.getDescription() + " (local file cache)");
-        descriptor.setKey(remoteDescriptor.getKey() + LocalCacheRepoDescriptor.PATH_SUFFIX);
-        descriptor.setRemoteRepo(remoteDescriptor);
-        descriptor.setRepoLayout(remoteDescriptor.getRepoLayout());
-        return descriptor;
-    }
-
-    @Override
-    public boolean isCache() {
-        return true;
-    }
-
-    @Override
-    public RepoResource getInfo(InternalRequestContext context) throws FileExpectedException {
-        RepoResource repoResource = super.getInfo(context);
-        if (repoResource.isFound()) {
-            //Check for expiry
-            RepoRequests.logToContext("Found the resource in the cache - checking for expiry");
-            boolean forceDownloadIfNewer = false;
-            Request request = context.getRequest();
-            if (request != null) {
-                String forcePropValue = request.getParameter(ArtifactoryRequest.PARAM_FORCE_DOWNLOAD_IF_NEWER);
-                if (StringUtils.isNotBlank(forcePropValue)) {
-                    forceDownloadIfNewer = Boolean.valueOf(forcePropValue);
-                    RepoRequests.logToContext("Found request parameter {}=%s",
-                            ArtifactoryRequest.PARAM_FORCE_DOWNLOAD_IF_NEWER, forceDownloadIfNewer);
-                }
-            }
-
-            if (forceDownloadIfNewer || context.isForceExpiryCheck() || isExpired(repoResource)) {
-                RepoRequests.logToContext("Returning resource as expired");
-                repoResource = new ExpiredRepoResource(repoResource);
-            } else {
-                RepoRequests.logToContext("Returning cached resource");
-            }
-        }
-        return repoResource;
-    }
-
-    @Override
-    public void undeploy(DeleteContext ctx) {
-        // change from remote key to cache key and never calculate maven metadata on cache
-        RepoPath cacheRepoPath = new RepoPathImpl(this.getKey(), ctx.getRepoPath().getPath());
-        mixin.undeploy(new DeleteContext(cacheRepoPath).calculateMavenMetadata(ctx.isCalculateMavenMetadata()));
-    }
-
-    @Override
-    public RemoteRepo<? extends RemoteRepoDescriptor> getRemoteRepo() {
-        return remoteRepo;
-    }
-
-    @Override
-    public ChecksumPolicy getChecksumPolicy() {
-        return remoteRepo.getChecksumPolicy();
-    }
-
-    @Override
-    public RemoteRepoDescriptor getRemoteRepoDescriptor() {
-        return remoteRepo.getDescriptor();
-    }
-
-    @Override
-    public void unexpire(String path) {
-        //Reset the resource age so it is kept being cached
-        MutableVfsItem mutableItem = getMutableFsItem(getRepoPath(path));
-        if (mutableItem != null) {
-            mutableItem.setUpdated(System.currentTimeMillis());
-        } else {
-            log.error("Attempt to unexpire non existent resource: {}", path);
-        }
-    }
-
-    @Override
-    public int zap(RepoPath repoPath) {
-        int itemsZapped = 0;
-        //Zap all nodes recursively from all retrieval caches
-        VfsItem fsItem = getImmutableFsItem(repoPath);
-        if (fsItem != null) {
-            // Exists and not deleted... Let's roll
-            ZapItemVisitor zapVisitor = new ZapItemVisitor(this);
-            zapVisitor.visit(fsItem);
-            itemsZapped = zapVisitor.getUpdatedItemsCount();
-            // now remove all the caches related to this path and any sub paths
-            remoteRepo.removeFromCaches(fsItem.getPath(), true);
-            log.info("Zapped '{}' from local cache: {} items zapped.", repoPath, itemsZapped);
-        }
-        return itemsZapped;
-    }
-
-    @Override
-    public SnapshotVersionBehavior getMavenSnapshotVersionBehavior() {
-        return getDescriptor().getSnapshotVersionBehavior();
-    }
-
-    @Override
-    public boolean isSuppressPomConsistencyChecks() {
-        return remoteRepo.getDescriptor().isSuppressPomConsistencyChecks();
-    }
-
-    @Override
-    public MavenSnapshotVersionAdapter getMavenSnapshotVersionAdapter() {
-        throw new UnsupportedOperationException("Local cache repositories doesn't have snapshot version adapter");
-    }
-
-    /**
-     * Check that the item has not expired yet, unless it's a release which never expires or a unique snapshot.
-     *
-     * @param repoResource The resource to check for expiry
-     * @return boolean - True if resource is expired. False if not
-     */
-    protected boolean isExpired(RepoResource repoResource) {
-        String path = repoResource.getRepoPath().getPath();
-        CacheExpiry cacheExpiry = ContextHelper.get().beanForType(CacheExpiry.class);
-        if (cacheExpiry.isExpirable(this, path)) {
-            long retrievalCachePeriodMillis = getRetrievalCachePeriodMillis(path);
-            long cacheAge = repoResource.getCacheAge();
-            return cacheAge > retrievalCachePeriodMillis || cacheAge == -1;
-        }
-        return false;
-    }
-
-    private long getRetrievalCachePeriodMillis(String path) {
-        long retrievalCachePeriodMillis;
-        if (MavenNaming.isIndex(path) &&
-                remoteRepo.getUrl().contains(ConstantValues.mvnCentralHostPattern.getString())) {
-            //If it is a central maven index use the hardcoded cache value
-            long centralMaxQueryIntervalSecs = ConstantValues.mvnCentralIndexerMaxQueryIntervalSecs.getLong();
-            retrievalCachePeriodMillis = centralMaxQueryIntervalSecs * 1000L;
-        } else {
-            //It is a non-unique snapshot or snapshot metadata
-            retrievalCachePeriodMillis = remoteRepo.getRetrievalCachePeriodSecs() * 1000L;
-        }
-        return retrievalCachePeriodMillis;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/db/DbLocalRepo.java b/backend/core/src/main/java/org/artifactory/repo/db/DbLocalRepo.java
deleted file mode 100644
index 1f7aed3..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/db/DbLocalRepo.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.db;
-
-import com.google.common.base.Charsets;
-import org.apache.commons.io.IOUtils;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.repo.exception.FileExpectedException;
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.common.StatusHolder;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.SnapshotVersionBehavior;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.io.NullResourceStreamHandle;
-import org.artifactory.io.SimpleResourceStreamHandle;
-import org.artifactory.io.checksum.policy.ChecksumPolicy;
-import org.artifactory.io.checksum.policy.LocalRepoChecksumPolicy;
-import org.artifactory.repo.*;
-import org.artifactory.repo.db.importexport.DbRepoExportHandler;
-import org.artifactory.repo.db.importexport.DbRepoImportHandler;
-import org.artifactory.repo.local.PathDeletionContext;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.repo.snapshot.MavenSnapshotVersionAdapter;
-import org.artifactory.repo.snapshot.SnapshotVersionAdapterBase;
-import org.artifactory.request.InternalRequestContext;
-import org.artifactory.request.RepoRequests;
-import org.artifactory.resource.ResourceStreamHandle;
-import org.artifactory.resource.UnfoundRepoResource;
-import org.artifactory.sapi.common.ExportSettings;
-import org.artifactory.sapi.common.ImportSettings;
-import org.artifactory.sapi.fs.*;
-import org.artifactory.sapi.interceptor.DeleteContext;
-import org.artifactory.schedule.TaskCallback;
-import org.artifactory.storage.StorageException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * A local repository implementation backed by db.
- *
- * @author Yossi Shaul
- */
-public class DbLocalRepo<T extends LocalRepoDescriptor> extends RealRepoBase<T> implements LocalRepo<T> {
-    private static final Logger log = LoggerFactory.getLogger(DbLocalRepo.class);
-
-    protected final DbStoringRepoMixin<LocalRepoDescriptor> mixin;
-
-    // For local non-cache repositories use the special local repo checksum policy
-    private final LocalRepoChecksumPolicy checksumPolicy = new LocalRepoChecksumPolicy();
-
-    private final MavenSnapshotVersionAdapter mavenSnapshotVersionAdapter;
-
-    public DbLocalRepo(T descriptor, InternalRepositoryService repositoryService, DbLocalRepo<T> oldLocalRepo) {
-        super(descriptor, repositoryService);
-        DbStoringRepoMixin<LocalRepoDescriptor> oldMixin = oldLocalRepo != null ? oldLocalRepo.mixin : null;
-        mixin = new DbStoringRepoMixin<LocalRepoDescriptor>(descriptor, oldMixin);
-        checksumPolicy.setPolicyType(descriptor.getChecksumPolicyType());
-        SnapshotVersionBehavior snapshotVersionBehavior = descriptor.getSnapshotVersionBehavior();
-        mavenSnapshotVersionAdapter = SnapshotVersionAdapterBase.getByType(snapshotVersionBehavior);
-    }
-
-    @Override
-    public void init() throws StorageException {
-        mixin.init();
-    }
-
-    @Override
-    public RepoResource getInfo(InternalRequestContext context) throws FileExpectedException {
-        final String path = context.getResourcePath();
-        RepoPath repoPath = InternalRepoPathFactory.create(getKey(), path);
-        StatusHolder statusHolder = checkDownloadIsAllowed(repoPath);
-        if (statusHolder.isError()) {
-            RepoRequests.logToContext("Download denied (%s) - returning unfound resource", statusHolder.getStatusMsg());
-            return new UnfoundRepoResource(repoPath, statusHolder.getStatusMsg(), statusHolder.getStatusCode());
-        }
-        RepoResource res = mixin.getInfo(context);
-        checkAndMarkExpirableResource(res);
-        return res;
-    }
-
-    @Override
-    public ResourceStreamHandle getResourceStreamHandle(InternalRequestContext requestContext, RepoResource res)
-            throws IOException {
-        return mixin.getResourceStreamHandle(requestContext, res);
-    }
-
-    @Override
-    public boolean itemExists(String relativePath) {
-        return mixin.itemExists(relativePath);
-    }
-
-    @Override
-    public String getKey() {
-        return mixin.getKey();
-    }
-
-    @Override
-    public boolean isWriteLocked(RepoPath repoPath) {
-        return mixin.isWriteLocked(getRepoPath(repoPath.getPath()));
-    }
-
-    @Override
-    public StatusHolder checkDownloadIsAllowed(RepoPath repoPath) {
-        BasicStatusHolder status = assertValidPath(repoPath, true);
-        if (status.isError()) {
-            return status;
-        }
-        assertReadPermissions(repoPath, status);
-        return status;
-    }
-
-    @Override
-    public RepoResource saveResource(SaveResourceContext context) throws RepoRejectException, IOException {
-        return mixin.saveResource(context);
-    }
-
-    @Override
-    public boolean shouldProtectPathDeletion(PathDeletionContext pathDeletionContext) {
-        return mixin.shouldProtectPathDeletion(pathDeletionContext);
-    }
-
-    @Override
-    public void importFrom(ImportSettings settings) {
-        DbRepoImportHandler importHandler = new DbRepoImportHandler(this, settings, TaskCallback.currentTaskToken());
-        importHandler.executeImport();
-        importHandler.finalizeImport();
-    }
-
-
-    @Override
-    public void exportTo(ExportSettings settings) {
-        new DbRepoExportHandler(this, settings).export();
-    }
-
-    @Override
-    public String getTextFileContent(RepoPath repoPath) {
-        VfsFile file = mixin.getImmutableFile(repoPath);
-        if (file != null) {
-            InputStream is = null;
-            try {
-                is = file.getStream();
-                return IOUtils.toString(is, Charsets.UTF_8.name());
-            } catch (IOException e) {
-                throw new RuntimeException("Could not read text file content from '" + repoPath + "'.", e);
-            } finally {
-                IOUtils.closeQuietly(is);
-            }
-        }
-        return "";
-    }
-
-    @Override
-    public ResourceStreamHandle getFileContent(RepoPath repoPath) {
-        VfsFile file = mixin.getImmutableFile(repoPath);
-        if (file != null) {
-            InputStream is = file.getStream();
-            return new SimpleResourceStreamHandle(is, file.length());
-        } else {
-            return new NullResourceStreamHandle();
-        }
-    }
-
-    @Override
-    public void undeploy(DeleteContext ctx) {
-        mixin.undeploy(ctx);
-    }
-
-    @Override
-    public SnapshotVersionBehavior getMavenSnapshotVersionBehavior() {
-        return getDescriptor().getSnapshotVersionBehavior();
-    }
-
-    @Override
-    public MavenSnapshotVersionAdapter getMavenSnapshotVersionAdapter() {
-        return mavenSnapshotVersionAdapter;
-    }
-
-    @Override
-    public boolean isSuppressPomConsistencyChecks() {
-        return getDescriptor().isSuppressPomConsistencyChecks();
-    }
-
-    @Override
-    public ChecksumPolicy getChecksumPolicy() {
-        return checksumPolicy;
-    }
-
-
-    @Override
-    @Nullable
-    public MutableVfsItem getMutableFsItem(RepoPath repoPath) {
-        return mixin.getMutableItem(repoPath);
-    }
-
-    @Override
-    @Nullable
-    public MutableVfsFile getMutableFile(RepoPath repoPath) {
-        return mixin.getMutableFile(repoPath);
-    }
-
-    @Override
-    @Nonnull
-    public MutableVfsFile createOrGetFile(RepoPath repoPath) {
-        return mixin.createOrGetFile(repoPath);
-    }
-
-    @Override
-    @Nullable
-    public MutableVfsFolder getMutableFolder(RepoPath repoPath) {
-        return mixin.getMutableFolder(repoPath);
-    }
-
-    @Override
-    @Nonnull
-    public MutableVfsFolder createOrGetFolder(RepoPath repoPath) {
-        return mixin.createOrGetFolder(repoPath);
-    }
-
-    @Override
-    @Nullable
-    public VfsItem getImmutableFsItem(RepoPath repoPath) {
-        return mixin.getImmutableItem(repoPath);
-    }
-
-    @Override
-    @Nullable
-    public VfsFile getImmutableFile(RepoPath repoPath) {
-        return mixin.getImmutableFile(repoPath);
-    }
-
-    @Override
-    public VfsFolder getImmutableFolder(RepoPath repoPath) {
-        return mixin.getImmutableFolder(repoPath);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/db/DbStoringRepoMixin.java b/backend/core/src/main/java/org/artifactory/repo/db/DbStoringRepoMixin.java
deleted file mode 100644
index c1ffa56..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/db/DbStoringRepoMixin.java
+++ /dev/null
@@ -1,804 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.db;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.apache.maven.artifact.repository.metadata.Metadata;
-import org.apache.maven.artifact.repository.metadata.SnapshotVersion;
-import org.apache.maven.artifact.repository.metadata.Versioning;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.HaAddon;
-import org.artifactory.addon.PropertiesAddon;
-import org.artifactory.addon.RestCoreAddon;
-import org.artifactory.addon.filteredresources.FilteredResourcesAddon;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.properties.PropertiesService;
-import org.artifactory.api.repo.exception.FileExpectedException;
-import org.artifactory.api.repo.exception.ItemNotFoundRuntimeException;
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.api.request.InternalArtifactoryRequest;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.checksum.ChecksumsInfo;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.common.StatusHolder;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.descriptor.repo.LocalCacheRepoDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoBaseDescriptor;
-import org.artifactory.exception.CancelException;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.fs.ZipEntryRepoResource;
-import org.artifactory.io.SimpleResourceStreamHandle;
-import org.artifactory.io.checksum.policy.ChecksumPolicy;
-import org.artifactory.io.checksum.policy.ChecksumPolicyException;
-import org.artifactory.maven.MavenModelUtils;
-import org.artifactory.md.Properties;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.model.xstream.fs.PropertiesImpl;
-import org.artifactory.model.xstream.fs.StatsImpl;
-import org.artifactory.repo.*;
-import org.artifactory.repo.cache.expirable.CacheExpiry;
-import org.artifactory.repo.interceptor.StorageInterceptors;
-import org.artifactory.repo.local.LocalNonCacheOverridables;
-import org.artifactory.repo.local.PathDeletionContext;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.request.*;
-import org.artifactory.resource.*;
-import org.artifactory.sapi.fs.*;
-import org.artifactory.sapi.interceptor.DeleteContext;
-import org.artifactory.security.AccessLogger;
-import org.artifactory.storage.StorageException;
-import org.artifactory.storage.binstore.service.BinaryInfo;
-import org.artifactory.storage.fs.VfsFileProvider;
-import org.artifactory.storage.fs.VfsFolderProvider;
-import org.artifactory.storage.fs.VfsItemProvider;
-import org.artifactory.storage.fs.VfsItemProviderFactory;
-import org.artifactory.storage.fs.lock.FsItemsVault;
-import org.artifactory.storage.fs.lock.LockEntryId;
-import org.artifactory.storage.fs.lock.LockingHelper;
-import org.artifactory.storage.fs.repo.StoringRepo;
-import org.artifactory.storage.fs.service.FileService;
-import org.artifactory.storage.fs.service.StatsService;
-import org.artifactory.storage.fs.session.StorageSession;
-import org.artifactory.storage.fs.session.StorageSessionHolder;
-import org.artifactory.storage.service.StatsServiceImpl;
-import org.artifactory.util.ExceptionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.transaction.NoTransactionException;
-import org.springframework.transaction.interceptor.TransactionAspectSupport;
-
-import javax.annotation.Nullable;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Set;
-import java.util.jar.JarEntry;
-import java.util.jar.JarInputStream;
-
-public class DbStoringRepoMixin<T extends RepoBaseDescriptor> /*implements StoringRepo<T> */ implements StoringRepo {
-    private static final Logger log = LoggerFactory.getLogger(DbStoringRepoMixin.class);
-
-    public static final String ETAG_PROP_KEY = PropertySet.ARTIFACTORY_RESERVED_PROP_SET + ".internal.etag";
-
-    private static final String CONTENT_TYPE_PROP_KEY = PropertySet.ARTIFACTORY_RESERVED_PROP_SET + "." +
-            PropertiesService.CONTENT_TYPE_PROPERTY_NAME;
-
-    private final T descriptor;
-
-    private AuthorizationService authorizationService;
-    private StorageInterceptors interceptors;
-    private AddonsManager addonsManager;
-    private FileService fileService;
-    private StatsService statsService;
-
-    private DbStoringRepoMixin oldStoringRepo;
-    private FsItemsVault fsItemsVault;
-    private InternalRepositoryService repositoryService;
-    private VfsItemProviderFactory vfsItemProviderFactory;
-
-    public DbStoringRepoMixin(T descriptor, DbStoringRepoMixin oldStoringRepo) {
-        this.descriptor = descriptor;
-        this.oldStoringRepo = oldStoringRepo;
-    }
-
-    public void init() throws StorageException {
-        ArtifactoryContext context = ContextHelper.get();
-
-        authorizationService = context.beanForType(AuthorizationService.class);
-
-        interceptors = context.beanForType(StorageInterceptors.class);
-        addonsManager = context.beanForType(AddonsManager.class);
-        fileService = context.beanForType(FileService.class);
-        statsService = context.beanForType(StatsServiceImpl.class);
-        repositoryService = context.beanForType(InternalRepositoryService.class);
-        vfsItemProviderFactory = context.beanForType(VfsItemProviderFactory.class);
-
-        if (oldStoringRepo != null) {
-            fsItemsVault = oldStoringRepo.fsItemsVault;
-        } else {
-            fsItemsVault = addonsManager.addonByType(HaAddon.class).getFsItemVault();
-        }
-        // Throw away after usage
-        oldStoringRepo = null;
-
-        //Create the repo node if it doesn't exist
-        RepoPath rootRP = InternalRepoPathFactory.create(getKey(), "");
-        if (!fileService.exists(rootRP)) {
-            createOrGetFolder(rootRP);
-        }
-    }
-
-    /**
-     * Create the resource in the local repository
-     */
-    @SuppressWarnings("unchecked")
-    public RepoResource saveResource(SaveResourceContext context) throws IOException, RepoRejectException {
-        RepoResource res = context.getRepoResource();
-        RepoPath repoPath = InternalRepoPathFactory.create(getKey(), res.getRepoPath().getPath());
-        MutableVfsFile mutableFile = null;
-        try {
-            //Create the parent folder if it does not exist
-            RepoPath parentPath = repoPath.getParent();
-            if (parentPath == null) {
-                throw new StorageException("Cannot save resource, no parent repo path exists");
-            }
-
-            // get or create the file. also creates any ancestors on the path to this item
-            mutableFile = createOrGetFile(repoPath);
-
-            invokeBeforeCreateInterceptors(mutableFile);
-
-            setClientChecksums(res, mutableFile);
-
-            /**
-             * If the file isn't a non-unique snapshot and it already exists, create a defensive of the checksums
-             * info for later comparison
-             */
-            boolean isNonUniqueSnapshot = MavenNaming.isNonUniqueSnapshot(repoPath.getId());
-            String overriddenFileSha1 = null;
-            if (!isNonUniqueSnapshot && !mutableFile.isNew()) {
-                overriddenFileSha1 = mutableFile.getSha1();
-                log.debug("Overriding {} with sha1: {}", mutableFile.getRepoPath(), overriddenFileSha1);
-            }
-
-            fillBinaryData(context, mutableFile);
-
-            verifyChecksum(mutableFile);
-
-            if (jarValidationRequired(repoPath)) {
-                validateJar(mutableFile, repoPath);
-            }
-
-            long lastModified = res.getInfo().getLastModified();
-            mutableFile.setModified(lastModified);
-            mutableFile.setUpdated(lastModified);
-
-            String userId = authorizationService.currentUsername();
-            mutableFile.setModifiedBy(userId);
-            if (mutableFile.isNew()) {
-                mutableFile.setCreatedBy(userId);
-            }
-
-            // allow admin override of selected file details (i.e., override when replicating)
-            overrideFileDetailsFromRequest(context, mutableFile);
-
-            updateResourceWithActualBinaryData(res, mutableFile);
-
-            clearOldFileData(mutableFile, isNonUniqueSnapshot, overriddenFileSha1);
-
-            Properties properties = context.getProperties();
-            if (properties != null) {
-                saveProperties(context, mutableFile);
-            }
-
-            invokeAfterCreateInterceptors(mutableFile);
-            AccessLogger.deployed(repoPath);
-            return res;
-        } catch (Exception e) {
-            try {
-                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-            } catch (NoTransactionException e1) {
-                log.error("Cannot rollback!", e1);
-            }
-            if (mutableFile != null) {
-                mutableFile.markError();
-            }
-            // throw back any CancelException
-            if (e instanceof CancelException) {
-                if (mutableFile != null) {
-                    LockingHelper.removeLockEntry(mutableFile.getRepoPath());
-                }
-                RepoRejectException repoRejectException = new RepoRejectException(e);
-                context.setException(repoRejectException);
-                throw repoRejectException;
-            }
-
-            // throw back any RepoRejectException (ChecksumPolicyException etc)
-            Throwable rejectException = ExceptionUtils.getCauseOfTypes(e, RepoRejectException.class);
-            if (rejectException != null) {
-                context.setException(rejectException);
-                throw (RepoRejectException) rejectException;
-            }
-            //Unwrap any IOException and throw it
-            Throwable ioCause = ExceptionUtils.getCauseOfTypes(e, IOException.class);
-            if (ioCause != null) {
-                log.error("IO error while trying to save resource {}'': {}: {}", res.getRepoPath(),
-                        ioCause.getClass().getName(), ioCause.getMessage());
-                log.debug("IO error while trying to save resource {}'': {}",
-                        res.getRepoPath(), ioCause.getMessage(), ioCause);
-                context.setException(ioCause);
-                throw (IOException) ioCause;
-            }
-            log.error("Couldn't save resource, reason:", e);
-
-            // Throw any RuntimeException instances
-            if (e instanceof RuntimeException) {
-                context.setException(e);
-                throw e;
-            }
-
-            context.setException(e);
-            throw new RuntimeException("Failed to save resource '" + res.getRepoPath() + "'.", e);
-        }
-    }
-
-    private void fillBinaryData(SaveResourceContext context, MutableVfsFile mutableFile) {
-        BinaryInfo binaryInfo = context.getBinaryInfo();
-        boolean usedExistingBinary = false;
-        if (binaryInfo != null) {
-            usedExistingBinary = mutableFile.tryUsingExistingBinary(
-                    binaryInfo.getSha1(), binaryInfo.getMd5(), binaryInfo.getLength());
-            if (!usedExistingBinary) {
-                log.debug("Tried to save with existing binary info but failed: '{}': {}",
-                        mutableFile.getRepoPath().toPath(), binaryInfo);
-            }
-        }
-        if (!usedExistingBinary) {
-            InputStream in = context.getInputStream();
-            mutableFile.fillBinaryData(in);
-        } else {
-            log.trace("Using existing binary info for '{}': {}", mutableFile.getRepoPath().toPath(), binaryInfo);
-        }
-    }
-
-    private boolean jarValidationRequired(RepoPath repoPath) {
-        if (!NamingUtils.isJarVariant(repoPath.getPath())) {
-            return false;
-        }
-
-        RemoteRepoDescriptor remoteRepoDescriptor;
-
-        T repoDescriptor = getDescriptor();
-        if (repoDescriptor instanceof RemoteRepoDescriptor) {
-            remoteRepoDescriptor = ((RemoteRepoDescriptor) repoDescriptor);
-        } else if (repoDescriptor instanceof LocalCacheRepoDescriptor) {
-            remoteRepoDescriptor = ((LocalCacheRepoDescriptor) repoDescriptor).getRemoteRepo();
-        } else {
-            return false;
-        }
-
-        if (!remoteRepoDescriptor.isRejectInvalidJars()) {
-            return false;
-        }
-        return true;
-    }
-
-    private void validateJar(MutableVfsFile mutableFile, RepoPath repoPath) throws RepoRejectException {
-        String pathId = repoPath.getId();
-        InputStream jarStream = mutableFile.getStream();
-        try {
-            log.trace("Validating the content of '{}'.", pathId);
-            JarInputStream jarInputStream = new JarInputStream(jarStream, true);
-            JarEntry entry = jarInputStream.getNextJarEntry();
-
-            if (entry == null) {
-                if (jarInputStream.getManifest() != null) {
-                    log.trace("Found manifest validating the content of '{}'.", pathId);
-                    return;
-                }
-                throw new IllegalStateException("Could not find entries within the archive.");
-            }
-            log.trace("Finished validating the content of '{}'.", pathId);
-        } catch (Exception e) {
-            String message = String.format("Failed to validate the content of '%s': %s", pathId, e.getMessage());
-            log.debug(message, e);
-            throw new RepoRejectException(message, HttpStatus.SC_CONFLICT);
-        } finally {
-            IOUtils.closeQuietly(jarStream);
-        }
-    }
-
-    private void saveProperties(SaveResourceContext context, MutableVfsFile mutableFile) throws RepoRejectException {
-        Properties properties = context.getProperties();
-        if ((properties != null) && !properties.isEmpty()) {
-            BasicStatusHolder statusHolder = new BasicStatusHolder();
-            for (String key : properties.keys()) {
-                Set<String> values = properties.get(key);
-                String[] vals = (values != null) ? values.toArray(new String[values.size()]) : new String[]{};
-                interceptors.beforePropertyCreate(mutableFile, statusHolder, key, vals);
-            }
-            checkForCancelException(statusHolder);
-            mutableFile.setProperties(properties);
-            for (String key : properties.keys()) {
-                Set<String> values = properties.get(key);
-                String[] vals = (values != null) ? values.toArray(new String[values.size()]) : new String[]{};
-                interceptors.afterPropertyCreate(mutableFile, statusHolder, key, vals);
-            }
-        }
-    }
-
-    private void verifyChecksum(MutableVfsFile mutableFile) throws ChecksumPolicyException {
-        ChecksumPolicy policy = getOwningRepo().getChecksumPolicy();
-        ChecksumsInfo checksumsInfo = mutableFile.getInfo().getChecksumsInfo();
-        boolean passes = policy.verify(checksumsInfo.getChecksums());
-        if (!passes) {
-            throw new ChecksumPolicyException(policy, checksumsInfo, mutableFile.getRepoPath());
-        }
-    }
-
-    private void invokeBeforeCreateInterceptors(MutableVfsFile mutableFile) throws RepoRejectException {
-        if (mutableFile.getInfo().getRepoPath().isRoot()) {
-            return;
-        }
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-        StorageInterceptors interceptors = ContextHelper.get().beanForType(StorageInterceptors.class);
-        interceptors.beforeCreate(mutableFile, statusHolder);
-        checkForCancelException(statusHolder);
-    }
-
-    private void invokeAfterCreateInterceptors(MutableVfsFile mutableFile) throws RepoRejectException {
-        //TODO: [by YS] leave it here until we decide how to implement events
-        if (mutableFile.isNew()) {
-            StorageSession storageSession = StorageSessionHolder.getSession();
-            if (storageSession != null) {
-                storageSession.save();
-            }
-        }
-
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-        interceptors.afterCreate(mutableFile, statusHolder);
-        checkForCancelException(statusHolder);
-    }
-
-    private void checkForCancelException(StatusHolder status) throws RepoRejectException {
-        if (status.getCancelException() != null) {
-            throw status.getCancelException();
-        }
-    }
-
-    /**
-     * Return <b>locally</b> stored file resource. Unfound resource will be returned if the requested resource doesn't
-     * exist locally.
-     */
-    public RepoResource getInfo(InternalRequestContext context) throws FileExpectedException {
-        RestCoreAddon restCoreAddon = addonsManager.addonByType(RestCoreAddon.class);
-        org.artifactory.repo.StoringRepo storingRepo = getOwningRepo();
-        context = restCoreAddon.getDynamicVersionContext(storingRepo, context, false);
-
-        String path = context.getResourcePath();
-        RepoPath repoPath = InternalRepoPathFactory.create(getKey(), path);
-        if (!itemExists(path)) {
-            RepoRequests.logToContext("Unable to find resource in %s", repoPath);
-            return new UnfoundRepoResource(repoPath, "File not found.");
-        }
-
-        PropertiesAddon propertiesAddon = addonsManager.addonByType(PropertiesAddon.class);
-        if (MavenNaming.isMavenMetadata(path)) {
-            RepoResource mdResource = propertiesAddon.assembleDynamicMetadata(context, repoPath);
-            if ((mdResource instanceof FileResource) && MavenNaming.isSnapshotMavenMetadata(path)) {
-                mdResource = resolveMavenMetadataForCompatibility(((FileResource) mdResource), context);
-            }
-            return mdResource;
-        }
-
-        //Handle query-aware get
-        Properties properties = repositoryService.getProperties(repoPath);
-        Properties queryProperties = context.getProperties();
-        boolean exactMatch = true;
-        if (!queryProperties.isEmpty()) {
-            RepoRequests.logToContext("Request includes query properties");
-            Properties.MatchResult matchResult;
-            if (properties != null) {
-                matchResult = properties.matchQuery(queryProperties);
-            } else {
-                matchResult = Properties.MatchResult.NO_MATCH;
-            }
-
-            if (matchResult == Properties.MatchResult.NO_MATCH) {
-                exactMatch = false;
-                RepoRequests.logToContext("Request query properties don't match those that annotate the artifact");
-            } else if (matchResult == Properties.MatchResult.CONFLICT) {
-                RepoRequests.logToContext("Request query properties conflict with those that annotate the " +
-                        "artifact - returning unfound resource");
-                return new UnfoundRepoResource(repoPath, "File '" + repoPath +
-                        "' was found, but mandatory properties do not match.",
-                        UnfoundRepoResourceReason.Reason.PROPERTY_MISMATCH);
-            }
-        }
-
-        RepoResource localResource = getFilteredOrFileResource(repoPath, context, properties, exactMatch);
-        setMimeType(localResource, properties);
-        setETag(localResource, properties);
-        return localResource;
-    }
-
-    private void setMimeType(RepoResource localResource, Properties properties) {
-        if (!localResource.isFound() || !(localResource instanceof FileResource) || (properties == null)) {
-            return;
-        }
-        String customMimeType = properties.getFirst(CONTENT_TYPE_PROP_KEY);
-        if (StringUtils.isNotBlank(customMimeType)) {
-            ((FileResource) localResource).setMimeType(customMimeType);
-        }
-    }
-
-    private void setETag(RepoResource localResource, Properties properties) {
-        if (!localResource.isFound() || !(localResource instanceof FileResource) || (properties == null)) {
-            return;
-        }
-        String etag = properties.getFirst(ETAG_PROP_KEY);
-        if (StringUtils.isNotBlank(etag)) {
-            ((FileResource) localResource).setETag(etag);
-        }
-    }
-
-    private org.artifactory.repo.StoringRepo getOwningRepo() {
-        return repositoryService.storingRepositoryByKey(descriptor.getKey());
-    }
-
-    private RepoResource resolveMavenMetadataForCompatibility(FileResource metadataResource,
-            InternalRequestContext context) {
-        if (ConstantValues.mvnMetadataVersion3Enabled.getBoolean() && !context.clientSupportsM3SnapshotVersions()) {
-            RepoRequests.logToContext("Use of v3 Maven metadata is enabled, but the requesting client doesn't " +
-                    "support it - checking if the response should be modified for compatibility");
-            FileInfo info = metadataResource.getInfo();
-            try {
-                Metadata metadata = MavenModelUtils.toMavenMetadata(repositoryService.getStringContent(info));
-                Versioning versioning = metadata.getVersioning();
-                if (versioning != null) {
-                    List<SnapshotVersion> snapshotVersions = versioning.getSnapshotVersions();
-                    if ((snapshotVersions != null) && !snapshotVersions.isEmpty()) {
-                        RepoRequests.logToContext("Found snapshot versions - modifying the response for compatibility");
-                        versioning.setSnapshotVersions(null);
-                        return new ResolvedResource(metadataResource, MavenModelUtils.mavenMetadataToString(metadata));
-                    }
-                }
-            } catch (IOException e) {
-                RepoPath repoPath = info.getRepoPath();
-                log.error("An error occurred while filtering Maven metadata '{}' for compatibility: " +
-                        "{}\nReturning original content.", repoPath, e.getMessage());
-                RepoRequests.logToContext("An error occurred while filtering for compatibility. Returning the " +
-                        "original content: %s", e.getMessage());
-            }
-        }
-        //In case none of the above apply, or if we encountered an error, return the original resource
-        return metadataResource;
-    }
-
-    @Override
-    public boolean hasChildren(VfsFolder vfsFolder) {
-        return fileService.hasChildren(vfsFolder.getRepoPath());
-    }
-
-    @Override
-    public List<VfsItem> getImmutableChildren(VfsFolder folder) {
-        List<ItemInfo> childrenInfo = fileService.loadChildren(folder.getRepoPath());
-        List<VfsItem> mutableChildren = Lists.newArrayListWithCapacity(childrenInfo.size());
-        for (ItemInfo childInfo : childrenInfo) {
-            mutableChildren.add(getImmutableItem(childInfo.getRepoPath()));
-        }
-        return mutableChildren;
-    }
-
-    @Override
-    public List<MutableVfsItem> getMutableChildren(MutableVfsFolder folder) {
-        List<ItemInfo> childrenInfo = fileService.loadChildren(folder.getRepoPath());
-        List<MutableVfsItem> mutableChildren = Lists.newArrayListWithCapacity(childrenInfo.size());
-        for (ItemInfo childInfo : childrenInfo) {
-            MutableVfsItem mutableItem = getMutableItem(childInfo.getRepoPath());
-            if (mutableItem != null) {
-                mutableChildren.add(mutableItem);
-            } else {
-                log.debug("Item deleted between first item loading and write lock: {}", childInfo.getRepoPath());
-            }
-        }
-        return mutableChildren;
-    }
-
-    @Override
-    public boolean itemExists(String relativePath) {
-        return fileService.exists(new RepoPathImpl(getKey(), relativePath));
-    }
-
-    private RepoResource getFilteredOrFileResource(RepoPath repoPath, RequestContext context,
-            Properties properties, boolean exactMatch) {
-        VfsFile vfsFile = getImmutableFile(repoPath);
-        if (vfsFile == null) {
-            return new UnfoundRepoResource(repoPath, "File " + repoPath + " was deleting during download!");
-        }
-        Request request = context.getRequest();
-        if (request != null && descriptor.isReal()) {
-            FilteredResourcesAddon filteredResourcesAddon = addonsManager.addonByType(FilteredResourcesAddon.class);
-            if (filteredResourcesAddon.isFilteredResourceFile(repoPath, properties)) {
-                RepoRequests.logToContext("Resource is marked as filtered - sending it through the engine");
-                InputStream stream = vfsFile.getStream();
-                try {
-                    return filteredResourcesAddon.getFilteredResource(request, vfsFile.getInfo(), stream);
-                } finally {
-                    IOUtils.closeQuietly(stream);
-                }
-            }
-        }
-
-        if (request != null && request.isZipResourceRequest()) {
-            RepoRequests.logToContext("Resource is contained within an archiving - retrieving");
-            InputStream stream = vfsFile.getStream();
-            try {
-                return addonsManager.addonByType(FilteredResourcesAddon.class).getZipResource(
-                        request, vfsFile.getInfo(), stream);
-            } finally {
-                IOUtils.closeQuietly(stream);
-            }
-        }
-
-        return new FileResource(vfsFile.getInfo(), exactMatch);
-    }
-
-    public T getDescriptor() {
-        return descriptor;
-    }
-
-    private void overrideFileDetailsFromRequest(SaveResourceContext context, MutableVfsFile mutableFile) {
-        // Only administrators can override the core attributed of a file. This is mainly used during replication
-        // This is not open to non-admin to prevent faked data (e.g., createdBy)
-        if (!authorizationService.isAdmin()) {
-            return;
-        }
-        if (context.getCreated() > 0) {
-            mutableFile.setCreated(context.getCreated());
-        }
-
-        if (StringUtils.isNotBlank(context.getCreateBy())) {
-            mutableFile.setCreatedBy(context.getCreateBy());
-        }
-
-        if (StringUtils.isNotBlank(context.getModifiedBy())) {
-            mutableFile.setModifiedBy(context.getModifiedBy());
-        }
-    }
-
-    private void setClientChecksums(RepoResource res, MutableVfsFile mutableFile) {
-        // set the file extension checksums (only needed if the file is currently being downloaded)
-        ChecksumsInfo resourceChecksums = res.getInfo().getChecksumsInfo();
-        ChecksumInfo sha1Info = resourceChecksums.getChecksumInfo(ChecksumType.sha1);
-        mutableFile.setClientSha1(sha1Info != null ? sha1Info.getOriginalOrNoOrig() : null);
-        ChecksumInfo md5Info = resourceChecksums.getChecksumInfo(ChecksumType.md5);
-        mutableFile.setClientMd5(md5Info != null ? md5Info.getOriginalOrNoOrig() : null);
-    }
-
-    private void updateResourceWithActualBinaryData(RepoResource res, VfsFile vfsFile) {
-        // update the resource with actual checksums and size (calculated in fillBinaryData) - RTFACT-3112
-        if (res.getInfo() instanceof MutableRepoResourceInfo) {
-            ChecksumsInfo newlyCalculatedChecksums = vfsFile.getInfo().getChecksumsInfo();
-            MutableRepoResourceInfo info = (MutableRepoResourceInfo) res.getInfo();
-            info.setChecksums(newlyCalculatedChecksums.getChecksums());
-            info.setSize(vfsFile.length());
-        }
-    }
-
-    private void clearOldFileData(MutableVfsFile mutableFile, boolean isNonUniqueSnapshot, String oldFileSha1) {
-        // If the artifact is not a non-unique snapshot and already exists but with a different checksum, remove
-        // all the existing metadata
-        if (!isNonUniqueSnapshot && oldFileSha1 != null) {
-            if (!oldFileSha1.equals(mutableFile.getSha1())) {
-                mutableFile.setStats(new StatsImpl());
-                mutableFile.setProperties(new PropertiesImpl());
-            }
-        }
-    }
-
-    MutableVfsItem getMutableItem(RepoPath repoPath) {
-        VfsItemProvider provider = vfsItemProviderFactory.createItemProvider(this, repoPath, fsItemsVault);
-        return provider.getMutableFsItem();
-    }
-
-    VfsItem getImmutableItem(RepoPath repoPath) {
-        VfsItemProvider provider = vfsItemProviderFactory.createItemProvider(this, repoPath, fsItemsVault);
-        return provider.getImmutableFsItem();
-    }
-
-    public VfsFile getImmutableFile(RepoPath repoPath) {
-        VfsFileProvider provider = vfsItemProviderFactory.createFileProvider(this, repoPath, fsItemsVault);
-        return provider.getImmutableFile();
-    }
-
-    public MutableVfsFile getMutableFile(RepoPath repoPath) {
-        VfsFileProvider provider = vfsItemProviderFactory.createFileProvider(this, repoPath, fsItemsVault);
-        return provider.getMutableFile();
-    }
-
-    public MutableVfsFile createOrGetFile(RepoPath repoPath) {
-        VfsFileProvider provider = vfsItemProviderFactory.createFileProvider(this, repoPath, fsItemsVault);
-        return provider.getOrCreMutableFile();
-    }
-
-    @Override
-    public VfsFolder getImmutableFolder(RepoPath repoPath) {
-        VfsFolderProvider provider = vfsItemProviderFactory.createFolderProvider(this, repoPath, fsItemsVault);
-        return provider.getImmutableFolder();
-    }
-
-    public MutableVfsFolder getMutableFolder(RepoPath repoPath) {
-        VfsFolderProvider provider = vfsItemProviderFactory.createFolderProvider(this, repoPath, fsItemsVault);
-        return provider.getMutableFolder();
-    }
-
-    public MutableVfsFolder createOrGetFolder(RepoPath repoPath) {
-        VfsFolderProvider provider = vfsItemProviderFactory.createFolderProvider(this, repoPath, fsItemsVault);
-        return provider.getOrCreMutableFolder();
-    }
-
-    @Override
-    public String getKey() {
-        return descriptor.getKey();
-    }
-
-    @Override
-    public boolean isWriteLocked(RepoPath repoPath) {
-        // TODO: [by FSI] Invalid argument if not me repo key
-        LockEntryId lock = fsItemsVault.getLock(repoPath);
-        return lock.getLock().isLocked();
-    }
-
-    public void undeploy(DeleteContext ctx) {
-        MutableVfsItem item = getMutableItem(ctx.getRepoPath());
-        if (item == null || item.isMarkedForDeletion()) {
-            return;
-        }
-        item.delete(ctx);
-    }
-
-    public ResourceStreamHandle getResourceStreamHandle(RequestContext requestContext, RepoResource res)
-            throws IOException {
-
-        RepoPathImpl repoPath = new RepoPathImpl(getKey(), res.getRepoPath().getPath());
-        RepoRequests.logToContext("Creating a resource handle from '%s'", repoPath);
-        VfsFile file = getImmutableFile(repoPath);
-
-        // If resource does not exist throw an IOException
-        if (file == null) {
-            RepoRequests.logToContext("Unable to find the resource - throwing exception");
-            throw new FileNotFoundException(
-                    "Could not get resource stream. Path '" + repoPath.getPath() + "' not found in " + this);
-        }
-
-        RepoRequests.logToContext("Identified requested resource as a file");
-        ResourceStreamHandle handle;
-        Request request = requestContext.getRequest();
-        if (request != null && request.isZipResourceRequest() && (res instanceof ZipEntryRepoResource)) {
-            RepoRequests.logToContext("Requested resource is contained within an archive - " +
-                    "using specialized handle");
-            handle = addonsManager.addonByType(FilteredResourcesAddon.class).getZipResourceHandle((ZipEntryRepoResource) res,
-                    file.getStream());
-        } else {
-            RepoRequests.logToContext("Requested resource is an ordinary artifact - " +
-                    "using normal content handle with length '%s'", file.length());
-            handle = new SimpleResourceStreamHandle(file.getStream(), file.length());
-        }
-
-        if(!request.isHeadOnly())
-            updateDownloadStats(file, isFromAnotherArtifactory(request));
-
-        return handle;
-    }
-
-    /**
-     * Checks if original request came from another origin
-     *
-     * @param request
-     *
-     * @return boolean
-     */
-    private final boolean isFromAnotherArtifactory(Request request) {
-        if(request.isFromAnotherArtifactory()) return true;
-        if(request instanceof InternalArtifactoryRequest) {
-            Enumeration origins = request.getHeaders(ArtifactoryRequest.ARTIFACTORY_ORIGINATED);
-            if (origins == null) {
-                 origins = request.getHeaders(ArtifactoryRequest.ORIGIN_ARTIFACTORY);
-            }
-            return origins != null && origins.hasMoreElements();
-        }
-        return false;
-    }
-
-    private void updateDownloadStats(VfsFile file, boolean fromAnotherArtifactory) {
-        if (descriptor.isReal() && ConstantValues.downloadStatsEnabled.getBoolean()) {  // stats only for real repos, if enabled
-            statsService.fileDownloaded(file.getRepoPath(), authorizationService.currentUsername(),
-                    System.currentTimeMillis(), fromAnotherArtifactory);
-        }
-    }
-
-    public boolean shouldProtectPathDeletion(PathDeletionContext pathDeletionContext) {
-        String path = pathDeletionContext.getPath();
-        if (NamingUtils.isChecksum(path)) {
-            //Never protect checksums
-            return false;
-        }
-
-        if (pathDeletionContext.isAssertOverwrite()) {
-            if (MavenNaming.isMavenMetadata(path)) {
-                return false;
-            }
-
-            org.artifactory.repo.StoringRepo owningRepo = getOwningRepo();
-            if (owningRepo.isCache()) {
-                if (pathDeletionContext.isForceExpiryCheck()) {
-                    return false;
-                }
-                if ((ContextHelper.get().beanForType(CacheExpiry.class).isExpirable(
-                        ((LocalCacheRepo) owningRepo), path))) {
-                    return false;
-                }
-            } else {
-                if (ContextHelper.get().beanForType(LocalNonCacheOverridables.class)
-                        .isOverridable(((LocalRepo) owningRepo), path)) {
-                    return false;
-                }
-            }
-
-            return shouldProtectPathDeletion(path, pathDeletionContext.getRequestSha1());
-        }
-
-        return true;
-    }
-
-    /**
-     * Should protect path deletion for these conditions:
-     * - If the item is a file (means that is also exists), protect.
-     * - If this is a deploy with checksum, and the request checksum matches the repoPath one, don't protect.
-     * - If the item is not a file (it's either a folder or doesn't exist), don't protect.
-     */
-    protected boolean shouldProtectPathDeletion(String path, @Nullable String requestSha1) {
-        RepoPath repoPath = InternalRepoPathFactory.create(getKey(), path);
-        if (requestSha1 == null) {
-            return repositoryService.exists(repoPath);
-        } else {
-            try {
-                String existingSha1 = repositoryService.getFileInfo(repoPath).getSha1();
-                return !existingSha1.equals(requestSha1); //protect if requestSha1 not equal to existing one
-            } catch (ItemNotFoundRuntimeException e) {
-                return false;
-            }
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/db/importexport/DbExportBase.java b/backend/core/src/main/java/org/artifactory/repo/db/importexport/DbExportBase.java
deleted file mode 100644
index 4e1f205..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/db/importexport/DbExportBase.java
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.db.importexport;
-
-import com.google.common.base.Charsets;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.backup.FileExportInfoImpl;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.common.Info;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.fs.StatsInfo;
-import org.artifactory.fs.WatcherInfo;
-import org.artifactory.fs.WatchersInfo;
-import org.artifactory.md.MetadataDefinition;
-import org.artifactory.md.Properties;
-import org.artifactory.md.PropertiesInfo;
-import org.artifactory.md.XmlMetadataProvider;
-import org.artifactory.sapi.common.ExportSettings;
-import org.artifactory.sapi.common.FileExportEvent;
-import org.artifactory.sapi.common.FileExportInfo;
-import org.artifactory.storage.fs.VfsItemNotFoundException;
-import org.artifactory.storage.fs.service.ItemMetaInfo;
-import org.artifactory.storage.fs.service.NodeMetaInfoService;
-import org.artifactory.storage.fs.service.PropertiesService;
-import org.artifactory.storage.fs.service.StatsService;
-import org.artifactory.storage.service.StatsServiceImpl;
-import org.artifactory.storage.spring.StorageContextHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Base class for exporting repository content.
- *
- * @author Yossi Shaul
- */
- at SuppressWarnings("ResultOfMethodCallIgnored")
-public abstract class DbExportBase extends DbRepoImportExportBase {
-    private static final Logger log = LoggerFactory.getLogger(DbExportBase.class);
-
-    protected ExportSettings settings;
-    protected MutableStatusHolder status;
-    protected final ImportExportAccumulator accumulator;
-
-    protected DbExportBase(ImportExportAccumulator accumulator) {
-        this.accumulator = accumulator;
-    }
-
-
-    protected void setExportSettings(ExportSettings settings) {
-        this.settings = settings;
-        this.status = settings.getStatusHolder();
-    }
-
-    protected void exportFile(FileInfo sourceFile) {
-        status.debug("Exporting file '" + sourceFile.getRepoPath() + "'...", log);
-
-        File targetBase;
-        if (settings.isCreateArchive()) {
-            targetBase = settings.getBaseDir();
-        } else {
-            targetBase = settings.getBaseDir();
-        }
-        File targetFile = new File(targetBase, sourceFile.getRelPath());
-        try {
-            // Insure that the source file still exists.
-            boolean sourceFileExists = getFileService().exists(sourceFile.getRepoPath());
-            if (!sourceFileExists) {
-                log.info("Skipping file export : '{}', the source file doesn't exists.", sourceFile.getRepoPath());
-                return;
-            }
-            //Invoke the callback if exists
-            settings.executeCallbacks(
-                    new FileExportInfoImpl(sourceFile, targetFile, FileExportInfo.FileExportStatus.PENDING),
-                    FileExportEvent.BEFORE_FILE_EXPORT);
-
-            File parentFile = targetFile.getParentFile();
-            if (!parentFile.exists()) {
-                FileUtils.forceMkdir(parentFile);
-            }
-
-            boolean fileContentExported = false;
-            // Export file only if not "incremental export" and the file to export is newer than the target file.
-            boolean skipFileContentExport = isSkipFileContentExport(sourceFile, targetFile);
-            if (!skipFileContentExport) {
-                fileContentExported = exportFileContent(sourceFile, targetFile);
-            }
-
-            settings.executeCallbacks(new FileExportInfoImpl(sourceFile, targetFile,
-                    fileContentExported ? FileExportInfo.FileExportStatus.ADDED :
-                            FileExportInfo.FileExportStatus.SKIPPED),
-                    FileExportEvent.AFTER_FILE_EXPORT);
-
-            if (settings.isIncludeMetadata()) {
-                exportMetadata(targetFile, sourceFile);
-            }
-            if (settings.isM2Compatible()) {
-                writeChecksums(targetFile, sourceFile);
-            }
-            accumulator.accumulateSuccessfulFile();
-            //If a file export fails, we collect the error but not fail the whole export
-        } catch (FileNotFoundException e) {
-            status.error("Failed to export '" + targetFile.getAbsolutePath() + "' since it is non-accessible.",
-                    e, log);
-            accumulator.accumulateSkippedFile();
-        } catch (Exception e) {
-            status.error("Failed to export '" + targetFile.getAbsolutePath() + "' due to:" + e.getMessage(),
-                    e, log);
-            accumulator.accumulateSkippedFile();
-        }
-    }
-
-    private boolean isSkipFileContentExport(FileInfo sourceFile, File targetFile) {
-        if (settings.isExcludeContent()) {
-            return true;
-        }
-        if (settings.isIncremental() && targetFile.exists()) {
-            // incremental export - only export the file if it is newer
-            log.trace("Source file last modified {} vs target file last modified {}", sourceFile.getLastModified(),
-                    targetFile.lastModified());
-            if (sourceFile.getLastModified() - targetFile.lastModified() < TimeUnit.MILLISECONDS.toMicros(1)) {
-                log.debug("Skipping not modified file {}", sourceFile.getRepoPath());
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private boolean exportFileContent(FileInfo sourceFile, File targetFile) throws IOException {
-
-        log.debug("Exporting file content to {}", targetFile.getAbsolutePath());
-        OutputStream os = null;
-        InputStream is = null;
-        try {
-            // get the stream directly from the datastore (no fs item locks)
-            is = getBinaryStore().getBinary(sourceFile.getSha1());
-            os = new BufferedOutputStream(new FileOutputStream(targetFile));
-            IOUtils.copy(is, os);
-        } catch (VfsItemNotFoundException e) {
-            // since we work with an unlocked items there's a small chance the binary doesn't exist anymore
-            status.warn("Binary not found for item '" + sourceFile.getRepoPath() + "'"
-                    + " with sha1 '" + sourceFile.getSha1() + "'", log);
-            return false;
-        } finally {
-            IOUtils.closeQuietly(os);
-            IOUtils.closeQuietly(is);
-        }
-
-        targetFile.setLastModified(sourceFile.getLastModified());
-        return true;
-    }
-
-    private void writeChecksums(File targetFile, FileInfo sourceFile) throws IOException {
-        // Write the checksum files next to the file which they belong to.
-        for (ChecksumInfo checksumInfo : sourceFile.getChecksumsInfo().getChecksums()) {
-            File checksumFile = new File(targetFile + checksumInfo.getType().ext());
-            FileUtils.writeStringToFile(checksumFile, checksumInfo.getActual(), "utf-8");
-            checksumFile.setLastModified(sourceFile.getLastModified());
-        }
-    }
-
-    protected void exportMetadata(File targetFile, ItemInfo sourceItem) {
-        try {
-            File metadataFolder = getMetadataContainerFolder(targetFile);
-            FileUtils.forceMkdir(metadataFolder);
-
-            exportItemInfo(sourceItem, metadataFolder);
-
-            exportProperties(sourceItem, metadataFolder);
-
-            exportWatches(sourceItem, metadataFolder);
-
-            if (!sourceItem.isFolder()) {
-                exportStats(((FileInfo) sourceItem), metadataFolder);
-            }
-
-        } catch (Exception e) {
-            status.error("Failed to export metadata for '" + sourceItem.getRepoPath() + "'.", e, log);
-        }
-    }
-
-
-    private void exportItemInfo(ItemInfo itemInfo, File metadataFolder) {
-        String metadataName = itemInfo.isFolder() ? FolderInfo.ROOT : FileInfo.ROOT;
-        MetadataDefinition definition = getMetadataDefinitionService()
-                .getMetadataDefinition(metadataName, false);
-        File targetMetadataFile = new File(metadataFolder, definition.getMetadataName() + ".xml");
-        long lastModified = itemInfo.getLastModified();
-        writeMetadataToFile(definition, targetMetadataFile, itemInfo, lastModified);
-    }
-
-    private void exportProperties(ItemInfo itemInfo, File metadataFolder) {
-        MetadataDefinition definition = getMetadataDefinitionService()
-                .getMetadataDefinition(PropertiesInfo.ROOT, false);
-        File targetMetadataFile = new File(metadataFolder, definition.getMetadataName() + ".xml");
-        Properties properties = getPropertiesService().getProperties(itemInfo.getRepoPath());
-        if (properties.isEmpty()) {
-            // remove existing properties if incremental
-            if (settings.isIncremental()) {
-                FileUtils.deleteQuietly(targetMetadataFile);
-            }
-        } else {
-            ItemMetaInfo nodeMetaInfo = ContextHelper.get().beanForType(NodeMetaInfoService.class).getNodeMetaInfo(
-                    itemInfo.getRepoPath());
-            long lastModified = nodeMetaInfo != null ? nodeMetaInfo.getPropsModified() : itemInfo.getLastModified();
-            writeMetadataToFile(definition, targetMetadataFile, properties, lastModified);
-        }
-    }
-
-    private void exportWatches(ItemInfo itemInfo, File metadataFolder) {
-        MetadataDefinition definition = getMetadataDefinitionService()
-                .getMetadataDefinition(WatchersInfo.ROOT, false);
-        File targetMetadataFile = new File(metadataFolder, definition.getMetadataName() + ".xml");
-        WatchersInfo watches = getWatchesService().getWatches(itemInfo.getRepoPath());
-        if (watches.isEmpty()) {
-            // remove existing watches if incremental
-            if (settings.isIncremental()) {
-                FileUtils.deleteQuietly(targetMetadataFile);
-            }
-        } else {
-            long lastModified = itemInfo.getLastModified();
-            for (WatcherInfo watcherInfo : watches.getWatchers()) {
-                lastModified = Math.max(lastModified, watcherInfo.getWatchingSinceTime());
-            }
-            writeMetadataToFile(definition, targetMetadataFile, watches, lastModified);
-        }
-    }
-
-    private void exportStats(FileInfo fileInfo, File metadataFolder) {
-        MetadataDefinition definition = getMetadataDefinitionService()
-                .getMetadataDefinition(StatsInfo.ROOT, false);
-        File targetMetadataFile = new File(metadataFolder, definition.getMetadataName() + ".xml");
-        StatsInfo stats = getStatsService().getStats(fileInfo.getRepoPath());
-        if (stats == null) {
-            // remove existing stats if incremental
-            if (settings.isIncremental()) {
-                FileUtils.deleteQuietly(targetMetadataFile);
-            }
-        } else {
-            long lastModified = stats.getLastDownloaded();
-            writeMetadataToFile(definition, targetMetadataFile, stats, lastModified);
-        }
-    }
-
-    private void writeMetadataToFile(MetadataDefinition definition, File targetMetadataFile, Info metadata,
-            long lastModified) {
-        if (shouldExportMetadata(targetMetadataFile, lastModified)) {
-            XmlMetadataProvider xmlProvider = definition.getXmlProvider();
-            String xmlData = xmlProvider.toXml(metadata);
-            writeFile(targetMetadataFile, xmlData, lastModified);
-        }
-    }
-
-    private boolean shouldExportMetadata(File targetMetadataFile, long lastModified) {
-        if (!settings.isIncremental()) {
-            return true;
-        } else {
-            return !targetMetadataFile.exists() || lastModified > targetMetadataFile.lastModified();
-        }
-    }
-
-    protected void writeFile(File metadataFile, String xmlData, long lastModified) {
-        if (StringUtils.isBlank(xmlData)) {
-            return;
-        }
-        try {
-            FileUtils.writeStringToFile(metadataFile, xmlData, Charsets.UTF_8.name());
-            metadataFile.setLastModified(lastModified);
-        } catch (Exception e) {
-            status.error("Failed to export metadata of '" +
-                    metadataFile.getPath() + "' + to '" + metadataFile.getAbsolutePath(), e, log);
-            FileUtils.deleteQuietly(metadataFile);
-        }
-    }
-
-    protected PropertiesService getPropertiesService() {
-        return ContextHelper.get().beanForType(PropertiesService.class);
-    }
-
-    protected StatsService getStatsService() {
-        return StorageContextHelper.get().beanForType(StatsServiceImpl.class);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/db/importexport/DbRepoExportHandler.java b/backend/core/src/main/java/org/artifactory/repo/db/importexport/DbRepoExportHandler.java
deleted file mode 100644
index 6828389..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/db/importexport/DbRepoExportHandler.java
+++ /dev/null
@@ -1,354 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.db.importexport;
-
-import com.google.common.collect.Sets;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.filefilter.AbstractFileFilter;
-import org.apache.commons.io.filefilter.DirectoryFileFilter;
-import org.apache.commons.io.filefilter.IOFileFilter;
-import org.apache.commons.io.filefilter.NotFileFilter;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.fs.StatsInfo;
-import org.artifactory.fs.WatcherInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.StoringRepo;
-import org.artifactory.sapi.common.ExportSettings;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-import org.artifactory.schedule.TaskService;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.storage.spring.StorageContextHelper;
-import org.artifactory.util.PathUtils;
-import org.artifactory.util.RepoPathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.FileFilter;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import static org.artifactory.repo.db.importexport.ImportExportAccumulator.ProgressAccumulatorType.EXPORT;
-
-/**
- * Controls the exporting of entire db repository.
- *
- * @author Yossi Shaul
- */
- at SuppressWarnings("ResultOfMethodCallIgnored")
-public class DbRepoExportHandler extends DbExportBase {
-    private static final Logger log = LoggerFactory.getLogger(DbRepoExportHandler.class);
-
-    private final StoringRepo repo;
-
-    public DbRepoExportHandler(StoringRepo repo, ExportSettings settings) {
-        super(new ImportExportAccumulator(repo.getKey(), EXPORT));
-        this.repo = repo;
-        setExportSettings(settings);
-    }
-
-    public void export() {
-        File fileSystemBaseDir = settings.getBaseDir();
-        long nodeCount = repo.getRepositoryService().getNodesCount(RepoPathUtils.repoRootPath(repo.getKey()));
-        String targetExportFolder = fileSystemBaseDir.getAbsolutePath();
-        status.status(String.format("%s export started with %d nodes to: '%s'",
-                repo.getKey(), nodeCount, targetExportFolder), log);
-        try {
-            FileUtils.forceMkdir(fileSystemBaseDir);
-        } catch (IOException e) {
-            throw new RuntimeException("Failed to create export directory '" + targetExportFolder + "'.", e);
-        }
-        ItemInfo rootFolder = getFileService().loadItem(new RepoPathImpl(repo.getKey(), ""));
-        exportRecursive(rootFolder);
-        accumulator.finished();
-        status.status(String.format("%s export finished with: %s Items exported (%s files and %s folders), " +
-                "%s Item skipped: (%s files and %s folders).Duration: %s IPS: %s Target: '%s'",
-                repo.getKey(), accumulator.getSuccessfulItemsCount(), accumulator.getSuccessfulFilesCount(),
-                accumulator.getSuccessfulFoldersCount(), accumulator.getSkippedItemsCount(),
-                accumulator.getSkippedFilesCount(), accumulator.getSkippedFoldersCount(),
-                accumulator.getDurationString(), accumulator.getItemsPerSecond(), targetExportFolder), log);
-    }
-
-    private void exportRecursive(ItemInfo sourceItem) {
-        TaskService taskService = InternalContextHelper.get().getTaskService();
-        //Check if we need to break/pause
-        boolean stop = taskService.pauseOrBreak();
-        if (stop) {
-            status.error("Export of " + repo.getKey() + " was stopped.", log);
-            return;
-        }
-
-        try {
-            if (sourceItem.isFolder()) {
-                if (isStorableFolder(sourceItem.getName())) {
-                    exportFolder((FolderInfo) sourceItem);
-                }
-            } else {
-                if (isStorableFile(sourceItem.getName())) {
-                    exportFile((FileInfo) sourceItem);
-                }
-            }
-        } catch (Exception e) {
-            //If a child export fails, we collect the error but not fail the whole export
-            File exportDir = settings.getBaseDir();
-            String msg = String.format("Export error: from: %s to: %s reason: %s", sourceItem.getRepoPath(),
-                    exportDir != null ? exportDir.getPath() : "null", e.getMessage());
-            if (sourceItem.isFolder()) {
-                accumulator.accumulateSkippedFolder();
-            } else {
-                accumulator.accumulateSkippedFile();
-            }
-            status.error(msg, e, log);
-        }
-    }
-
-    private void exportFolder(FolderInfo sourceFolder) throws IOException {
-        File targetDir = new File(settings.getBaseDir(), sourceFolder.getRelPath());
-        status.debug("Exporting directory '" + sourceFolder.getRepoPath() + "'...", log);
-        // Insure that the source folder still exists.
-        boolean sourceFolderExists = getFileService().exists(sourceFolder.getRepoPath());
-        if (!sourceFolderExists) {
-            log.info("Skipping folder export : '{}', the source folder doesn't exists.", sourceFolder.getRepoPath());
-            return;
-        }
-        FileUtils.forceMkdir(targetDir);
-
-        targetDir.setLastModified(sourceFolder.getLastModified());
-
-        if (settings.isIncludeMetadata()) {
-            exportMetadata(targetDir, sourceFolder);
-        }
-
-        accumulator.accumulateSuccessfulFolder();
-
-        List<ItemInfo> children = getRepositoryService().getChildren(sourceFolder.getRepoPath());
-        for (ItemInfo child : children) {
-            exportRecursive(child);
-        }
-
-        if (settings.isIncremental()) {
-            cleanupIncrementalBackupDirectory(sourceFolder, children, targetDir);
-        }
-    }
-
-    //TORE: [by YS] this requires a nice refactoring
-    private void cleanupIncrementalBackupDirectory(FolderInfo sourceFolder, List<ItemInfo> currentFolderChildren,
-            File targetDir) {
-
-        //Metadata File filter
-        IOFileFilter metadataFilter = new MetadataFileFilter();
-
-        //List all artifacts
-        Collection<File> artifacts = Sets.newHashSet(
-                targetDir.listFiles((FileFilter) new NotFileFilter(metadataFilter)));
-        cleanArtifacts(currentFolderChildren, artifacts);
-
-        //List all sub-target metadata
-        Collection<File> subTargetMetadataFiles = FileUtils.listFiles(targetDir, metadataFilter,
-                DirectoryFileFilter.INSTANCE);
-        cleanMetadata(currentFolderChildren, subTargetMetadataFiles);
-
-        //List all target metadata
-        File targetDirMetadataContainerFolder = getMetadataContainerFolder(targetDir);
-        Collection<File> targetMetadataFiles = FileUtils.listFiles(targetDirMetadataContainerFolder, metadataFilter,
-                DirectoryFileFilter.INSTANCE);
-        cleanTargetMetadata(sourceFolder, targetMetadataFiles);
-    }
-
-    /**
-     * Locates the artifacts that were removed from the repo since last backup, but still remain in the backup folder
-     * and clean them out.
-     *
-     * @param currentVfsFolderItems List of vfs items in the current vfs folder
-     * @param artifacts             List of artifact files in the current target folder
-     */
-    private void cleanArtifacts(List<ItemInfo> currentVfsFolderItems, Collection<File> artifacts) {
-        for (File artifact : artifacts) {
-            if (artifact != null) {
-                String ileName = artifact.getName();
-                ItemInfo itemInfo = getItemByName(currentVfsFolderItems, ileName);
-                if (itemInfo == null) {
-                    if (artifact.isDirectory()) {
-                        // If a directory does not exist in data store - we need to recursively handle all of his children as well
-                        Collection<File> childArtifacts = Sets.newHashSet(
-                                artifact.listFiles((FileFilter) new NotFileFilter(new MetadataFileFilter())));
-                        cleanArtifacts(Collections.<ItemInfo>emptyList(), childArtifacts);
-                    }
-                    log.debug("Deleting {} from the incremental backup dir since it was " +
-                            "deleted from the repository", artifact.getAbsolutePath());
-                    boolean deleted = FileUtils.deleteQuietly(artifact);
-                    if (!deleted) {
-                        log.warn("Failed to delete {}", artifact.getAbsolutePath());
-                    }
-                    // now delete the metadata folder of the file/folder is it exists
-                    File metadataFolder = getMetadataContainerFolder(artifact);
-                    if (metadataFolder.exists()) {
-                        deleted = FileUtils.deleteQuietly(metadataFolder);
-                        if (!deleted) {
-                            log.warn("Failed to delete metadata folder {}", metadataFolder.getAbsolutePath());
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Locates metadata that was removed from different artifacts since last backup, but still remain in the backup
-     * folder and clean them out.
-     *
-     * @param currentVfsFolderItems List of vfs items in the current vfs folder
-     * @param metadataFiles         List of metadata files in the current target's metadata folder
-     */
-    private void cleanMetadata(List<ItemInfo> currentVfsFolderItems, Collection<File> metadataFiles) {
-        for (File metadataFile : metadataFiles) {
-            if ((metadataFile != null) && (metadataFile.isFile())) {
-                String metadataFolderPath = metadataFile.getParent();
-                //Extract the metadata container name from the parent path
-                String metadataContainerName = getMetadataContainerName(metadataFolderPath);
-                //Extract the metadata name from the metadata file name
-                String metadataName = PathUtils.stripExtension(metadataFile.getName());
-
-                //If metadata and container names returned valid
-                if ((metadataName != null) && (metadataContainerName != null)) {
-                    ItemInfo itemInfo = getItemByName(currentVfsFolderItems, metadataContainerName);
-                    if (itemInfo != null) {
-                        //If the metadata container does not contain this metadata anymore
-                        boolean hasMetadata = false;
-                        try {
-                            hasMetadata = hasMetadata(itemInfo.getRepoPath(), metadataName);
-                        } catch (RepositoryRuntimeException e) {
-                            String message = String.format("Unable to determine whether %s is annotated by metadata " +
-                                    "of type %s. Metadata was not cleaned.", itemInfo.getRepoPath(), metadataName);
-                            status.error(message, e, log);
-                        }
-                        if (!hasMetadata) {
-                            boolean deleted = FileUtils.deleteQuietly(metadataFile);
-                            if (!deleted) {
-                                log.warn("Failed to delete {}", metadataFile.getAbsolutePath());
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    private boolean hasMetadata(RepoPath repoPath, String metadataName) {
-        if (metadataName.equals(StatsInfo.ROOT)) {
-            return getStatsService().hasStats(repoPath);
-        } else if (metadataName.equals(Properties.ROOT)) {
-            return getPropertiesService().hasProperties(repoPath);
-        } else if (metadataName.equals(WatcherInfo.ROOT)) {
-            return getWatchesService().hasWatches(repoPath);
-        } else {
-            // old generic metadata or unknown -> don't delete from the incremental backup
-            return true;
-        }
-    }
-
-    /**
-     * Locates metadata that was removed from the current target since last backup, but still remain in the backup
-     * folder and clean them out.
-     *
-     * @param currentFolderInfo   The folder info the cleanup is working with
-     * @param targetMetadataFiles List of metadata files in the current target's metadata folder
-     */
-    private void cleanTargetMetadata(FolderInfo currentFolderInfo, Collection<File> targetMetadataFiles) {
-        for (File metadataFile : targetMetadataFiles) {
-            if ((metadataFile != null) && metadataFile.isFile()) {
-                //Extract the metadata name from the metadata file name
-                String metadataName = PathUtils.stripExtension(metadataFile.getName());
-                boolean hasMetadata = false;
-                try {
-                    hasMetadata = hasMetadata(currentFolderInfo.getRepoPath(), metadataName);
-                } catch (RepositoryRuntimeException e) {
-                    // File may be deleted in the meantime, so this is just a warning
-                    String message = String.format("Unable to determine whether %s is annotated by metadata of type " +
-                            "%s. Metadata entry not present!", currentFolderInfo.getRepoPath(), metadataName);
-                    status.warn(message, e, log);
-                }
-                //If the metadata container does not contain this metadata anymore
-                if (!hasMetadata) {
-                    boolean deleted = FileUtils.deleteQuietly(metadataFile);
-                    if (!deleted) {
-                        log.warn("Failed to delete {}", metadataFile.getAbsolutePath());
-                    }
-                }
-            }
-        }
-    }
-
-    private ItemInfo getItemByName(List<ItemInfo> currentVfsFolderItems, String vfsFileName) {
-        for (ItemInfo itemInfo : currentVfsFolderItems) {
-            if (vfsFileName.equals(itemInfo.getName())) {
-                return itemInfo;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Extracts the metadata container name from the metadata folder path
-     *
-     * @param metadataFolderPath Metadata folder path
-     * @return Metadata container name extracted from metadata folder path
-     */
-    private String getMetadataContainerName(String metadataFolderPath) {
-        //Get last index of slash
-        int indexOfLastSlash = metadataFolderPath.lastIndexOf('/') + 1;
-        //Get index of metadata folder suffix
-        int indexOfFolderName = metadataFolderPath.indexOf(METADATA_FOLDER);
-        if ((indexOfLastSlash == -1) || (indexOfFolderName == -1)) {
-            return null;
-        }
-        return metadataFolderPath.substring(indexOfLastSlash, indexOfFolderName);
-    }
-
-    private class MetadataFileFilter extends AbstractFileFilter {
-        @Override
-        public boolean accept(File file) {
-            //Accept only files within the metadata folder which are not part of the file info system
-            boolean isArtifactoryFile = file.getName().contains(FileInfo.ROOT);
-            boolean isArtifactoryFolder = file.getName().contains(FolderInfo.ROOT);
-            return isFileInMetadataFolder(file) && !isArtifactoryFile && !isArtifactoryFolder;
-        }
-
-        /**
-         * Indicates if the given file is located inside a metadata folder
-         *
-         * @param file File to query
-         * @return True if the file is located in a metadata folder. False if not
-         */
-        private boolean isFileInMetadataFolder(File file) {
-            return file.getAbsolutePath().contains(METADATA_FOLDER);
-        }
-    }
-
-    private RepositoryService getRepositoryService() {
-        return StorageContextHelper.get().getRepositoryService();
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/db/importexport/DbRepoExportSearchHandler.java b/backend/core/src/main/java/org/artifactory/repo/db/importexport/DbRepoExportSearchHandler.java
deleted file mode 100644
index 9e031e7..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/db/importexport/DbRepoExportSearchHandler.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.db.importexport;
-
-import org.apache.commons.io.FileUtils;
-import org.artifactory.api.config.ExportSettingsImpl;
-import org.artifactory.api.search.SavedSearchResults;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.sapi.common.ExportSettings;
-import org.artifactory.util.ZipUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.IOException;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-
-import static org.artifactory.repo.db.importexport.ImportExportAccumulator.ProgressAccumulatorType.EXPORT;
-
-/**
- * Handles export of search results.
- *
- * @author Yossi Shaul
- */
-public class DbRepoExportSearchHandler extends DbExportBase {
-    private static final Logger log = LoggerFactory.getLogger(DbRepoExportSearchHandler.class);
-
-    private final SavedSearchResults searchResults;
-    private final ExportSettingsImpl baseSettings;
-
-    public DbRepoExportSearchHandler(SavedSearchResults searchResults, ExportSettingsImpl baseSettings) {
-        super(new ImportExportAccumulator("export-search-result", EXPORT));
-        this.searchResults = searchResults;
-        this.baseSettings = baseSettings;
-        setExportSettings(createSettingsWithTimestampedBase());
-    }
-
-    public MutableStatusHolder export() {
-        status.status("Started exporting search result '" + searchResults.getName() + "'.", log);
-
-        createExportDirectory();
-        if (status.isError()) {
-            return status;
-        }
-
-        for (org.artifactory.fs.FileInfo searchResult : searchResults.getResults()) {
-            exportFile(searchResult);
-        }
-
-        if (settings.isCreateArchive()) {
-            createExportZip(status, settings);
-        }
-
-        status.status("Finished exporting search result '" + searchResults.getName() + "'.", log);
-        return status;
-    }
-
-    private void createExportZip(MutableStatusHolder statusHolder, ExportSettings settings) {
-        try {
-            statusHolder.status("Archiving exported search result '" + searchResults.getName() + "'.", log);
-            File tempDir = settings.getBaseDir();
-            File tempArchive = new File(tempDir.getParentFile(), settings.getBaseDir().getName() + ".zip");
-            // Create the archive
-            ZipUtils.archive(tempDir, tempArchive, true);
-            //Delete the exploded directory
-            FileUtils.deleteDirectory(tempDir);
-            //Copy the zip back into the final destination
-            if (!tempArchive.getParentFile().equals(baseSettings.getBaseDir())) {
-                FileUtils.copyFile(tempArchive, baseSettings.getBaseDir());
-                //Delete the temporary zip
-                FileUtils.deleteQuietly(tempArchive);
-            }
-        } catch (IOException e) {
-            statusHolder.error("Unable to create zip archive", -1, e, log);
-        }
-    }
-
-    private ExportSettings createSettingsWithTimestampedBase() {
-        File baseDir = baseSettings.getBaseDir();
-        DateFormat formatter = new SimpleDateFormat("yyyyMMdd.HHmmss");
-        String timestamp = formatter.format(baseSettings.getTime());
-        String baseExportName = searchResults.getName() + "-" + timestamp;
-        File tmpExportDir = new File(baseDir, baseExportName);
-        return new ExportSettingsImpl(tmpExportDir, baseSettings);
-    }
-
-    private void createExportDirectory() {
-        //Make sure the directory does not already exist
-        File exportDir;
-        if (settings.isCreateArchive()) {
-            exportDir = settings.getBaseDir();
-        } else {
-            exportDir = settings.getBaseDir();
-        }
-        try {
-            FileUtils.deleteDirectory(exportDir);
-        } catch (IOException e) {
-            status.error("Failed to delete old temp export directory: " + exportDir.getAbsolutePath(), e,
-                    log);
-        }
-        status.status("Creating temp export directory: " + exportDir.getAbsolutePath(), log);
-        try {
-            FileUtils.forceMkdir(exportDir);
-        } catch (IOException e) {
-            status.error("Failed to create temp export dir: " + exportDir.getAbsolutePath(), e, log);
-        }
-        status.status("Using temp export directory: '" + exportDir.getAbsolutePath() + "'.", log);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/db/importexport/DbRepoImportExportBase.java b/backend/core/src/main/java/org/artifactory/repo/db/importexport/DbRepoImportExportBase.java
deleted file mode 100644
index 4396ab2..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/db/importexport/DbRepoImportExportBase.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.db.importexport;
-
-import org.artifactory.md.MetadataDefinitionService;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.storage.binstore.service.BinaryService;
-import org.artifactory.storage.fs.service.FileService;
-import org.artifactory.storage.fs.service.WatchesService;
-import org.artifactory.storage.spring.StorageContextHelper;
-
-import java.io.File;
-
-/**
- * Base class for the db real repositories import/export handlers.
- *
- * @author Yossi Shaul
- */
-abstract class DbRepoImportExportBase {
-    String METADATA_FOLDER = ".artifactory-metadata";
-
-    protected boolean isStorableFolder(String name) {
-        return !name.endsWith(METADATA_FOLDER) && !name.startsWith(".svn") &&
-                !MavenNaming.NEXUS_INDEX_DIR.equals(name);
-    }
-
-    protected boolean isStorableFile(String name) {
-        return !name.endsWith(METADATA_FOLDER) && !NamingUtils.isChecksum(name);
-    }
-
-    protected BinaryService getBinaryStore() {
-        return StorageContextHelper.get().beanForType(BinaryService.class);
-    }
-
-    protected FileService getFileService() {
-        return StorageContextHelper.get().beanForType(FileService.class);
-    }
-
-    protected WatchesService getWatchesService() {
-        return StorageContextHelper.get().beanForType(WatchesService.class);
-    }
-
-    protected File getMetadataContainerFolder(File file) {
-        return new File(file.getParentFile(), file.getName() + METADATA_FOLDER);
-    }
-
-    protected MetadataDefinitionService getMetadataDefinitionService() {
-        return StorageContextHelper.get().beanForType(MetadataDefinitionService.class);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/db/importexport/DbRepoImportHandler.java b/backend/core/src/main/java/org/artifactory/repo/db/importexport/DbRepoImportHandler.java
deleted file mode 100644
index da6bee8..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/db/importexport/DbRepoImportHandler.java
+++ /dev/null
@@ -1,655 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.db.importexport;
-
-import com.google.common.collect.Sets;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.yum.YumAddon;
-import org.artifactory.api.config.ImportSettingsImpl;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.maven.MavenMetadataService;
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.fs.*;
-import org.artifactory.io.checksum.ChecksumUtil;
-import org.artifactory.md.MetadataDefinition;
-import org.artifactory.md.MetadataDefinitionService;
-import org.artifactory.md.PropertiesInfo;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.model.xstream.fs.PropertiesImpl;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.interceptor.ImportInterceptors;
-import org.artifactory.repo.interceptor.StorageAggregationInterceptors;
-import org.artifactory.repo.local.ValidDeployPathContext;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.sapi.common.ImportSettings;
-import org.artifactory.sapi.fs.MetadataReader;
-import org.artifactory.sapi.fs.MutableVfsFile;
-import org.artifactory.sapi.fs.MutableVfsFolder;
-import org.artifactory.sapi.fs.MutableVfsItem;
-import org.artifactory.schedule.TaskBase;
-import org.artifactory.schedule.TaskService;
-import org.artifactory.security.AccessLogger;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.storage.BinaryInsertRetryException;
-import org.artifactory.storage.StorageProperties;
-import org.artifactory.storage.spring.ArtifactoryStorageContext;
-import org.artifactory.storage.spring.StorageContextHelper;
-import org.artifactory.update.md.MetadataVersion;
-import org.artifactory.util.CollectionUtils;
-import org.artifactory.util.GlobalExcludes;
-import org.artifactory.util.PathUtils;
-import org.joda.time.DateTime;
-import org.joda.time.Duration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.transaction.TransactionDefinition;
-import org.springframework.transaction.TransactionStatus;
-import org.springframework.transaction.support.AbstractPlatformTransactionManager;
-import org.springframework.transaction.support.DefaultTransactionDefinition;
-
-import java.io.*;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.StandardCopyOption;
-import java.util.List;
-import java.util.Set;
-
-import static org.artifactory.repo.db.importexport.ImportExportAccumulator.ProgressAccumulatorType.IMPORT;
-
-/**
- * Imports a single repository from the file system while managing transactions.
- * This handler is used in two phases: import and finalize. Import does the actual import, after which there might be
- * recoverable failures that can be retried. This breakdown allows the import to be externally synchronized.
- *
- * @author Yossi Shaul
- */
-public class DbRepoImportHandler extends DbRepoImportExportBase {
-    private static final Logger log = LoggerFactory.getLogger(DbRepoImportHandler.class);
-    private static final int MAX_ITEMS_PER_TRANSACTION = 1000;
-    private static final Duration MAX_TIME_PER_TRANSACTION = Duration.standardMinutes(3);
-    private final LocalRepo<? extends LocalRepoDescriptor> repo;
-    private final ImportSettings settings;
-    private final String parentTaskToken;
-    private ImportExportAccumulator progressAccumulator;
-    private MutableStatusHolder status;
-    private TransactionStatus transactionStatus;
-    private Set<ImportItem> itemsToRetry = Sets.newHashSet();
-    private DateTime transactionStartTime;
-    private File fileSystemBaseDir;
-
-    public DbRepoImportHandler(LocalRepo<? extends LocalRepoDescriptor> repo, ImportSettings settings,
-            String parentTaskToken) {
-        this.repo = repo;
-        this.settings = settings;
-        status = settings.getStatusHolder();
-        this.parentTaskToken = parentTaskToken;
-    }
-
-    public void executeImport() {
-        try {
-            fileSystemBaseDir = settings.getBaseDir();
-            status.status(String.format("%s import started %s", repo.getKey(), fileSystemBaseDir), log);
-            if (fileSystemBaseDir == null || !fileSystemBaseDir.isDirectory()) {
-                status.error("Error Import: Cannot import null, non existent folder or non directory file '"
-                        + fileSystemBaseDir + "'.", log);
-                return;
-            }
-
-            progressAccumulator = new ImportExportAccumulator(repo.getKey(), IMPORT);
-            executeRecursiveImport(fileSystemBaseDir);
-            if (hasRetries()) {
-                importFromRetryList();
-            }
-        } finally {
-            if (!hasRetries()) {
-                internalFinalizeImport();
-            }
-        }
-    }
-
-    public void finalizeImport() {
-        if (hasRetries()) {
-            importFromRetryList();
-            internalFinalizeImport();
-        } else {
-            log.debug("Import was already finalized");
-        }
-    }
-
-    private boolean hasRetries() {
-        return !itemsToRetry.isEmpty();
-    }
-
-    private void internalFinalizeImport() {
-        progressAccumulator.finished();
-        RepoPath rootRepoPath = InternalRepoPathFactory.repoRootPath(repo.getKey());
-        runPostImportCalculations(rootRepoPath);
-        reportEndOfImport(fileSystemBaseDir);
-    }
-
-    private void executeRecursiveImport(File fileSystemBaseDir) {
-        RepoPath rootRepoPath = InternalRepoPathFactory.repoRootPath(repo.getKey());
-        startTransaction();
-        try {
-            importRecursive(fileSystemBaseDir, rootRepoPath);
-        } finally {
-            commitTransaction(transactionStatus);
-        }
-    }
-
-    private void reportEndOfImport(File fileSystemBaseDir) {
-        status.status(String.format("%s import finished with: %s Items imported: (%s files %s folders). " +
-                                "Duration: %s IPS: %s Target: '%s'",
-                        repo.getKey(), progressAccumulator.getSuccessfulItemsCount(),
-                        progressAccumulator.getSuccessfulFilesCount(),
-                        progressAccumulator.getSuccessfulFoldersCount(),
-                        progressAccumulator.getDurationString(), progressAccumulator.getItemsPerSecond(),
-                        fileSystemBaseDir
-                ),
-                log
-        );
-    }
-
-    private void runPostImportCalculations(RepoPath rootRepoPath) {
-        if (!repo.isCache()) {
-            ContextHelper.get().beanForType(MavenMetadataService.class).calculateMavenMetadataAsync(rootRepoPath, true);
-            ContextHelper.get().beanForType(StorageAggregationInterceptors.class).afterRepoImport(
-                    rootRepoPath, progressAccumulator.getSuccessfulItemsCount(), status);
-
-            LocalRepoDescriptor descriptor = repo.getDescriptor();
-            if (descriptor.getType().equals(RepoType.YUM) && descriptor.isCalculateYumMetadata()) {
-                AddonsManager addonsManager = StorageContextHelper.get().beanForType(AddonsManager.class);
-                addonsManager.addonByType(YumAddon.class).requestAsyncRepositoryYumMetadataCalculation(descriptor);
-            }
-        }
-    }
-
-    private void importFromRetryList() {
-        log.info("{}: Retrying import of {} items", repo.getKey(), itemsToRetry.size());
-        for (ImportItem toRetry : itemsToRetry) {
-            itemsToRetry.remove(toRetry);
-            startTransaction();
-            try {
-                importFile(toRetry.getSource(), toRetry.getDestination());
-            } finally {
-                commitTransaction(transactionStatus);
-            }
-        }
-    }
-
-    private void importRecursive(final File fileToImport, final RepoPath target) {
-        if (shouldPauseOrBreak()) {
-            status.error("Import of " + repo.getKey() + " was stopped", log);
-            return;
-        }
-
-        if (shouldStartNewTransaction()) {
-            commitTransaction(transactionStatus);
-            startTransaction();
-        }
-
-        if (!fileToImport.exists()) {
-            // skeleton import? looks for file metadata
-            File fileInfoMetadata = new File(
-                    fileToImport.getAbsolutePath() + METADATA_FOLDER + "/" + FileInfo.ROOT + ".xml");
-            if (fileInfoMetadata.exists() && isStorableFile(fileToImport.getName())) {
-                importFile(fileToImport, target);
-            } else {
-                status.warn("File/metadata not found: " + fileToImport.getAbsolutePath(), log);
-            }
-        } else if (fileToImport.isFile() && isStorableFile(fileToImport.getName())) {
-            importFile(fileToImport, target);
-        } else if (isStorableFolder(fileToImport.getName())) {
-            boolean folderExistAfterImport = importFolder(fileToImport, target);
-            if (!folderExistAfterImport) {
-                log.debug("Folder '{}' doesn't exist after import. Skipping import children of '{}'",
-                        target, fileToImport);
-                return;
-            }
-            File[] filesToImport = fileToImport.listFiles();
-            if (filesToImport != null && filesToImport.length > 0) {
-                Set<String> fileNames = collectFileNamesForImport(filesToImport);
-                for (String fileName : fileNames) {
-                    RepoPathImpl targetChild = new RepoPathImpl(target, fileName);
-                    importRecursive(new File(fileToImport, fileName), targetChild);
-                }
-            }
-        }
-    }
-
-    private boolean shouldPauseOrBreak() {
-        if (StringUtils.isBlank(parentTaskToken)) {
-            return false;
-        }
-        TaskService taskService = InternalContextHelper.get().getTaskService();
-        TaskBase activeTask = taskService.getInternalActiveTask(parentTaskToken, false);
-        if (activeTask != null) {
-            return activeTask.blockIfPausedAndShouldBreak();
-        } else {
-            return taskService.pauseOrBreak();
-        }
-    }
-
-    private boolean shouldStartNewTransaction() {
-        boolean reachedMaxFiles = progressAccumulator.getSuccessfulItemsCount() > 0 &&
-                progressAccumulator.getSuccessfulItemsCount() % MAX_ITEMS_PER_TRANSACTION == 0;
-        boolean transactionTimeMaxed = transactionStartTime.plus(MAX_TIME_PER_TRANSACTION).isBeforeNow();
-        return reachedMaxFiles || transactionTimeMaxed;
-    }
-
-    private Set<String> collectFileNamesForImport(File[] filesToImport) {
-        Set<String> fileNames = Sets.newHashSetWithExpectedSize(filesToImport.length / 2);
-        for (File childFile : filesToImport) {
-            String name = childFile.getName();
-            if (settings.isIncludeMetadata() && name.endsWith(METADATA_FOLDER)) {
-                fileNames.add(name.substring(0, name.length() - METADATA_FOLDER.length()));
-            } else if (isStorableFolder(name) && isStorableFile(name)
-                    && !GlobalExcludes.isInGlobalExcludes(childFile)) {
-                fileNames.add(name);
-            }
-        }
-        return fileNames;
-    }
-
-    private void importFile(final File fileToImport, final RepoPath target) {
-        log.debug("Importing '{}'.", target);
-        if (!settings.isIncludeMetadata() && !fileToImport.exists()) {
-            addErrorMessage(fileToImport, target, "Cannot import non existent file (metadata is excluded): " +
-                    fileToImport.getAbsolutePath());
-            return;
-        }
-        if (isDeployPathValid(fileToImport, target)) {
-            deployImportedFile(fileToImport, target);
-        }
-    }
-
-    private boolean isDeployPathValid(File fileToImport, RepoPath target) {
-        try {
-            long length = -1L;
-            if (fileToImport.exists()) {
-                length = fileToImport.length();
-            }
-            InternalRepositoryService repositoryService = StorageContextHelper.get().beanForType(
-                    InternalRepositoryService.class);
-            repositoryService.assertValidDeployPath(
-                    new ValidDeployPathContext.Builder(repo, target).contentLength(length).build());
-        } catch (Exception e) {
-            addErrorMessage(fileToImport, target, "Artifact rejected: " + e.getMessage());
-            log.debug("Import of {} as {} rejected, reason: {}", fileToImport, target, e.getMessage(), e);
-            progressAccumulator.accumulateSkippedFile();
-            return false;
-        }
-        return true;
-    }
-
-    private void deployImportedFile(File fileToImport, RepoPath target) {
-        ArtifactoryStorageContext context = StorageContextHelper.get();
-        MutableVfsFile mutableFile = null;
-        try {
-            mutableFile = repo.createOrGetFile(target);
-            importFileFrom(fileToImport, mutableFile);
-
-            context.beanForType(ImportInterceptors.class).afterImport(mutableFile, status);
-            log.debug("Imported '{}'.", target);
-            AccessLogger.deployed(target);
-            progressAccumulator.accumulateSuccessfulFile();
-        } catch (BinaryInsertRetryException e) {
-            log.info("Import of {} will be retried", target);
-            log.debug("Import of " + target + " will be retried", e);
-            itemsToRetry.add(new ImportItem(fileToImport, target));
-        } catch (Exception e) {
-            addErrorMessage(fileToImport, target, "Could not import file '" + fileToImport.getAbsolutePath() +
-                    " into " + target + ".", e);
-            // mark the mutable item in error and let the session manager handle it
-            if (mutableFile != null) {
-                mutableFile.markError();
-            }
-            progressAccumulator.accumulateSkippedFile();
-        }
-    }
-
-    private void addErrorMessage(File from, RepoPath to, String message) {
-        addErrorMessage(from, to, message, null);
-    }
-
-    private void addErrorMessage(File from, RepoPath to, String message, Exception e) {
-        String msg = String.format("Import error: from: %s to %s reason: %s", from, to, message);
-        if (e == null) {
-            status.error(msg, log);
-        } else {
-            status.error(msg, e, log);
-        }
-    }
-
-    private void importFileFrom(File sourceFile, MutableVfsFile mutableFile) throws IOException, RepoRejectException {
-        updateMutableFileBasicData(sourceFile, mutableFile);
-        FileInfo importedFileInfo = null;
-        RepoPath targetRepoPath = mutableFile.getRepoPath();
-        if (settings.isIncludeMetadata()) {
-            importedFileInfo = importMetadataFromExportedMetadataFolder(sourceFile, mutableFile, targetRepoPath);
-        }
-        if (importedFileInfo == null && !sourceFile.exists()) {
-            throw new FileNotFoundException("Cannot import non existent file " + sourceFile.getAbsolutePath()
-                    + " since metadata information was not found!");
-        }
-        if (importedFileInfo == null) {
-            importMetadataFromSourceFile(sourceFile, mutableFile);
-        }
-        boolean binaryInfoExists = false;
-        String expectedSha1 = getExpectedSha1(importedFileInfo, mutableFile);
-        String expectedMd5 = getExpectedMd5(importedFileInfo, mutableFile);
-        if (ChecksumType.sha1.isValid(expectedSha1)) {
-            if (sourceFile.exists() && settings.isExcludeContent()) {
-                moveFileToExternalFileStore(sourceFile, expectedSha1);
-            }
-            binaryInfoExists = tryUsingExistingBinary(sourceFile, mutableFile, importedFileInfo);
-        }
-        if (!binaryInfoExists) {
-            fillBinaryDataFromFile(sourceFile, mutableFile);
-        }
-
-        if (PathUtils.hasText(expectedSha1) && !mutableFile.getSha1().equals(expectedSha1)) {
-            status.warn("Received file " + targetRepoPath + " with Checksum error on SHA1 " +
-                    "actual=" + mutableFile.getSha1() + " expected=" + expectedSha1, log);
-        }
-        if (PathUtils.hasText(expectedMd5) && !mutableFile.getMd5().equals(expectedMd5)) {
-            status.warn("Received file " + targetRepoPath + " with Checksum error on MD5 " +
-                    "actual=" + mutableFile.getMd5() + " expected=" + expectedMd5, log);
-        }
-    }
-
-    private FileInfo importMetadataFromExportedMetadataFolder(File sourceFile, MutableVfsFile mutableFile,
-            RepoPath targetRepoPath) {
-        FileInfo importedFileInfo;
-        List<MetadataEntryInfo> metadataEntries = getMetadataEntryInfos(sourceFile);
-        importedFileInfo = (FileInfo) readItemInfoMetadata(
-                FileInfo.ROOT, sourceFile, targetRepoPath, metadataEntries);
-        if (importedFileInfo != null) {
-            mutableFile.fillInfo(importedFileInfo);
-        }
-        importProperties(sourceFile, mutableFile, metadataEntries);
-        importWatches(sourceFile, mutableFile, metadataEntries);
-        importStats(sourceFile, mutableFile, metadataEntries);
-        return importedFileInfo;
-    }
-
-    private void importMetadataFromSourceFile(File sourceFile, MutableVfsFile mutableFile) throws IOException {
-        String sha1FileValue = getOriginalChecksumFromFile(sourceFile, ChecksumType.sha1);
-        if (StringUtils.isNotBlank(sha1FileValue)) {
-            mutableFile.setClientSha1(sha1FileValue);
-        }
-        String md5FileValue = getOriginalChecksumFromFile(sourceFile, ChecksumType.md5);
-        if (StringUtils.isNotBlank(md5FileValue)) {
-            mutableFile.setClientMd5(md5FileValue);
-        }
-    }
-
-    private void moveFileToExternalFileStore(File sourceFile, String expectedSha1) throws IOException {
-        // If exclude content and file exists use it for the external filestore if it exists
-        StorageProperties storageProperties = StorageContextHelper.get().beanForType(StorageProperties.class);
-        String extFilestoreDir = storageProperties.getBinaryProviderExternalDir();
-        if (StringUtils.isNotBlank(extFilestoreDir)) {
-            Path filePath = Paths.get(extFilestoreDir, expectedSha1.substring(0, 2), expectedSha1);
-            if (!Files.exists(filePath)) {
-                Files.move(sourceFile.toPath(), filePath, StandardCopyOption.ATOMIC_MOVE);
-            }
-        }
-    }
-
-    private boolean tryUsingExistingBinary(File sourceFile, MutableVfsFile mutableFile, FileInfo importedFileInfo)
-            throws IOException {
-        // Found file info in metadata : Try deploy by checksum
-        status.debug("Using metadata import for " + sourceFile, log);
-        String expectedSha1 = getExpectedSha1(importedFileInfo, mutableFile);
-        boolean binaryInfoExists = mutableFile.tryUsingExistingBinary(expectedSha1,
-                getExpectedMd5(importedFileInfo, mutableFile), getExpectedLength(importedFileInfo, mutableFile));
-        if (binaryInfoExists) {
-            status.debug("Found existing binary in the filestore for " + expectedSha1, log);
-        }
-        return binaryInfoExists;
-    }
-
-    private void fillBinaryDataFromFile(File sourceFile, MutableVfsFile mutableFile) throws IOException {
-        if (!sourceFile.exists()) {
-            throw new FileNotFoundException(sourceFile.getAbsolutePath() + ": File doesn't exist and matching " +
-                    "binary either doesn't exist of settings are not configured to use it");
-        }
-        try (InputStream is = new BufferedInputStream(new FileInputStream(sourceFile))) {
-            mutableFile.fillBinaryData(is);
-        }
-    }
-
-    private String getExpectedSha1(FileInfo fileInfo, MutableVfsFile mutableFile) {
-        if (fileInfo != null) {
-            return fileInfo.getSha1();
-        } else {
-            return mutableFile.getSha1();
-        }
-    }
-
-    private String getExpectedMd5(FileInfo importedFileInfo, MutableVfsFile mutableFile) {
-        if (importedFileInfo != null) {
-            return importedFileInfo.getMd5();
-        } else {
-            return mutableFile.getMd5();
-        }
-    }
-
-    private long getExpectedLength(FileInfo importedFileInfo, MutableVfsFile mutableFile) {
-        if (importedFileInfo != null) {
-            return importedFileInfo.getSize();
-        } else {
-            return mutableFile.length();
-        }
-    }
-
-    private List<MetadataEntryInfo> getMetadataEntryInfos(File sourceFile) {
-        File metadataFolder = getMetadataContainerFolder(sourceFile);
-        if (!metadataFolder.exists()) {
-            return null;
-        }
-
-        MetadataReader metadataReader = findBestMatchMetadataReader(settings, metadataFolder);
-        return metadataReader.getMetadataEntries(metadataFolder, status);
-    }
-
-    //TORE: [by YS] requires refactoring
-    private Object readItemInfoMetadata(String metadataName, File source, RepoPath target,
-            List<MetadataEntryInfo> metadataEntries) {
-        if (CollectionUtils.isNullOrEmpty(metadataEntries)) {
-            if (!target.isRoot()) {
-                status.debug("No Metadata entries found for " + source.getAbsolutePath(), log);
-            }
-            return null;
-        }
-        try {
-            for (MetadataEntryInfo entry : metadataEntries) {
-                if (metadataName.equals(entry.getMetadataName())) {
-                    MetadataDefinitionService metadataDefinitionService = getMetadataDefinitionService();
-                    MetadataDefinition definition = metadataDefinitionService.getMetadataDefinition(metadataName, true);
-                    return definition.getXmlProvider().fromXml(entry.getXmlContent());
-                }
-            }
-        } catch (Exception e) {
-            String msg = "Failed to import metadata of " + source.getAbsolutePath() + " into '" + target + "'.";
-            status.error(msg, e, log);
-        }
-
-        return null;
-    }
-
-    private void updateMutableFileBasicData(File sourceFile, MutableVfsFile mutableFile) {
-        String currentUser = getCurrentUsername();
-        mutableFile.setCreatedBy(currentUser);
-        mutableFile.setModifiedBy(currentUser);
-        if (sourceFile.exists()) {
-            mutableFile.setModified(sourceFile.lastModified());
-        }
-        mutableFile.setUpdated(System.currentTimeMillis());
-    }
-
-    private String getOriginalChecksumFromFile(File artifactFile, ChecksumType checksumType) throws IOException {
-        //TORE: [by YS] check for file size and use a util method
-        File checksumFile = new File(artifactFile.getParent(), artifactFile.getName() + checksumType.ext());
-        InputStream is = null;
-        try {
-            is = new BufferedInputStream(new FileInputStream(checksumFile));
-            return ChecksumUtil.checksumStringFromStream(is);
-        } catch (FileNotFoundException e) {
-            log.debug("Couldn't find '{}' checksum file and Artifactory metadata doesn't exist.",
-                    checksumFile.getName());
-        } finally {
-            IOUtils.closeQuietly(is);
-        }
-
-        return null;
-    }
-
-    private boolean importFolder(File sourceFolder, RepoPath target) {
-        boolean folderExistAfterImport = false;
-        if (!GlobalExcludes.isInGlobalExcludes(sourceFolder)) {
-            // Create the folder and import its the metadata
-            MutableVfsFolder mutableFolder = null;
-            try {
-                // First create the folder
-                mutableFolder = repo.createOrGetFolder(target);
-                //Read metadata into the node
-                if (settings.isIncludeMetadata()) {
-                    List<MetadataEntryInfo> metadataEntries = getMetadataEntryInfos(sourceFolder);
-                    FolderInfo folderInfoToImport = (FolderInfo) readItemInfoMetadata(
-                            FileInfo.ROOT, sourceFolder, target, metadataEntries);
-                    if (folderInfoToImport != null) {
-                        mutableFolder.fillInfo(folderInfoToImport);
-                    }
-
-                    importProperties(sourceFolder, mutableFolder, metadataEntries);
-                    importWatches(sourceFolder, mutableFolder, metadataEntries);
-                }
-                folderExistAfterImport = true;
-                progressAccumulator.accumulateSuccessfulFolder();
-            } catch (Exception e) {
-                // Just log an error and continue - will not import children
-                String msg = "Failed to import folder " + sourceFolder.getAbsolutePath() + " into '" + target + "'.";
-                status.error(msg, e, log);
-                if (mutableFolder != null) {
-                    mutableFolder.markError();
-                }
-                progressAccumulator.accumulateSkippedFolder();
-            }
-        } else {
-            progressAccumulator.accumulateSkippedFolder();
-        }
-        return folderExistAfterImport;
-    }
-
-    private void importProperties(File sourceFile, MutableVfsItem mutableItem,
-            List<MetadataEntryInfo> metadataEntries) {
-        PropertiesInfo propertiesInfo = (PropertiesInfo) readItemInfoMetadata(
-                PropertiesInfo.ROOT, sourceFile, mutableItem.getRepoPath(), metadataEntries);
-        if (propertiesInfo != null) {
-            mutableItem.setProperties(new PropertiesImpl(propertiesInfo));
-        }
-    }
-
-    private void importWatches(File sourceFile, MutableVfsItem mutableItem, List<MetadataEntryInfo> metadataEntries) {
-        WatchersInfo watchersInfo = (WatchersInfo) readItemInfoMetadata(
-                WatchersInfo.ROOT, sourceFile, mutableItem.getRepoPath(), metadataEntries);
-        if (watchersInfo != null) {
-            for (WatcherInfo watcherInfo : watchersInfo.getWatchers()) {
-                mutableItem.addWatch(watcherInfo);
-            }
-        }
-    }
-
-    private void importStats(File sourceFile, MutableVfsFile mutableFile, List<MetadataEntryInfo> metadataEntries) {
-        StatsInfo statsInfo = (StatsInfo) readItemInfoMetadata(
-                StatsInfo.ROOT, sourceFile, mutableFile.getRepoPath(), metadataEntries);
-        if (statsInfo != null) {
-            mutableFile.setStats(statsInfo);
-        }
-    }
-
-    private MetadataReader findBestMatchMetadataReader(ImportSettings importSettings, File metadataFolder) {
-        ImportSettingsImpl settings = (ImportSettingsImpl) importSettings;
-        MetadataReader metadataReader = settings.getMetadataReader();
-        if (metadataReader == null) {
-            if (settings.getExportVersion() != null) {
-                metadataReader = MetadataVersion.findVersion(settings.getExportVersion());
-            } else {
-                //try to find the version from the format of the metadata folder
-                metadataReader = MetadataVersion.findVersion(metadataFolder);
-            }
-            settings.setMetadataReader(metadataReader);
-        }
-        return metadataReader;
-    }
-
-    private String getCurrentUsername() {
-        return InternalContextHelper.get().getAuthorizationService().currentUsername();
-    }
-
-    private void startTransaction() {
-        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
-        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
-        AbstractPlatformTransactionManager txManager = getTransactionManager();
-        transactionStartTime = DateTime.now();
-        this.transactionStatus = txManager.getTransaction(def);
-    }
-
-    private void commitTransaction(TransactionStatus status) {
-        log.debug("{}: Committing transaction artifacts count: {} after {} seconds", repo.getKey(),
-                progressAccumulator.getSuccessfulItemsCount(),
-                new Duration(transactionStartTime, DateTime.now()).getStandardSeconds());
-        getTransactionManager().commit(status);
-    }
-
-    private AbstractPlatformTransactionManager getTransactionManager() {
-        return (AbstractPlatformTransactionManager) ContextHelper.get().getBean("artifactoryTransactionManager");
-    }
-
-    /**
-     * Represents an importable item of source (file) and destination (repo path)
-     */
-    public static class ImportItem {
-        private final File source;
-        private final RepoPath destination;
-
-        public ImportItem(File source, RepoPath destination) {
-            this.source = source;
-            this.destination = destination;
-        }
-
-        public File getSource() {
-            return source;
-        }
-
-        public RepoPath getDestination() {
-            return destination;
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/db/importexport/ImportExportAccumulator.java b/backend/core/src/main/java/org/artifactory/repo/db/importexport/ImportExportAccumulator.java
deleted file mode 100644
index 588c2ba..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/db/importexport/ImportExportAccumulator.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.db.importexport;
-
-import org.artifactory.util.TimeUnitFormat;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nonnull;
-import java.text.DecimalFormat;
-import java.text.NumberFormat;
-
-/**
- * Progress notifier, logs out import export progress.
- *
- * @author Gidi Shabat
- */
-public class ImportExportAccumulator {
-    private static final Logger log = LoggerFactory.getLogger(ImportExportAccumulator.class);
-    private final int emitMessageValueEvery;
-
-    public static enum ProgressAccumulatorType {
-        IMPORT, EXPORT
-    }
-
-    private final NumberFormat numberFormat = new DecimalFormat("###.##");
-    private final String repositoryKey;
-    private final ProgressAccumulatorType type;
-    private final long startTime;
-    private long endTime;
-
-    private int skippedFilesCount = 0;
-    private int skippedFoldersCount = 0;
-    private int successfulFilesCount = 0;
-    private int successfulFoldersCount = 0;
-
-    public ImportExportAccumulator(String repositoryKey, @Nonnull ProgressAccumulatorType type) {
-        this.emitMessageValueEvery = ProgressAccumulatorType.EXPORT.equals(type) ? 3000 : 1000;
-        this.repositoryKey = repositoryKey;
-        this.type = type;
-        this.startTime = System.nanoTime();
-    }
-
-    public void accumulateSuccessfulFile() {
-        successfulFilesCount++;
-        printProgress();
-    }
-
-    public void accumulateSkippedFile() {
-        skippedFilesCount++;
-        printProgress();
-    }
-
-
-    public void accumulateSuccessfulFolder() {
-        successfulFoldersCount++;
-        printProgress();
-    }
-
-    public void accumulateSkippedFolder() {
-        skippedFoldersCount++;
-        printProgress();
-    }
-
-    public void finished() {
-        this.endTime = System.nanoTime();
-    }
-
-    private void printProgress() {
-        int totalSuccessfulItemsCount = successfulFilesCount + successfulFoldersCount;
-        int totalSkippedItemsCount = skippedFilesCount + skippedFoldersCount;
-        if (totalSuccessfulItemsCount % emitMessageValueEvery == 0) {
-            boolean exportProcess = ProgressAccumulatorType.EXPORT.equals(type);
-            if (exportProcess) {
-                log.info("{} exported {} items ({} files {} folders {} ips) " +
-                        "{} skipped items ({} files {} folders)...", repositoryKey, totalSuccessfulItemsCount,
-                        successfulFilesCount, successfulFoldersCount, getItemsPerSecond(), totalSkippedItemsCount,
-                        skippedFilesCount, skippedFoldersCount);
-            } else {
-                log.info("{} imported {} items ({} files {} folders {} ips) " +
-                        "{} skipped items ({} files {} folders)...", repositoryKey, totalSuccessfulItemsCount,
-                        successfulFilesCount, successfulFoldersCount, getItemsPerSecond(), totalSkippedItemsCount,
-                        skippedFilesCount, skippedFoldersCount);
-            }
-        }
-    }
-
-    public int getSuccessfulItemsCount() {
-        return getSuccessfulFilesCount() + getSuccessfulFoldersCount();
-    }
-
-    public int getSkippedItemsCount() {
-        return getSkippedFilesCount() + getSkippedFoldersCount();
-    }
-
-    public int getSkippedFilesCount() {
-        return skippedFilesCount;
-    }
-
-    public int getSkippedFoldersCount() {
-        return skippedFoldersCount;
-    }
-
-    public int getSuccessfulFilesCount() {
-        return successfulFilesCount;
-    }
-
-    public int getSuccessfulFoldersCount() {
-        return successfulFoldersCount;
-    }
-
-    public String getDurationString() {
-        return TimeUnitFormat.getTimeString(getDurationNanos());
-    }
-
-    /**
-     * @return A string with the number of items imported per second
-     */
-    public String getItemsPerSecond() {
-        long duration = getDurationNanos();
-        double durationSecs = duration / 1_000_000_000.0;
-        double itemsPerSecond = (successfulFilesCount + successfulFoldersCount) / durationSecs;
-        return numberFormat.format(itemsPerSecond);
-    }
-
-    private long getDurationNanos() {
-        return endTime > 0 ? endTime - startTime : System.nanoTime() - startTime;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/interceptor/AddPropertyAfterMoveOrCopyInterceptor.java b/backend/core/src/main/java/org/artifactory/repo/interceptor/AddPropertyAfterMoveOrCopyInterceptor.java
deleted file mode 100644
index 1c27c82..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/interceptor/AddPropertyAfterMoveOrCopyInterceptor.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.interceptor;
-
-import com.google.common.collect.Multiset;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.PropertiesAddon;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.descriptor.property.Property;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.interceptor.storage.StorageInterceptorAdapter;
-import org.artifactory.sapi.fs.VfsItem;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import java.util.Set;
-
-/**
- * Interceptor for adding properties as a post copy or post move operations.
- *
- * @author Tomer Cohen
- */
-public class AddPropertyAfterMoveOrCopyInterceptor extends StorageInterceptorAdapter {
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Override
-    public void afterCopy(VfsItem sourceItem, VfsItem targetItem, MutableStatusHolder statusHolder,
-            Properties properties) {
-        super.afterCopy(sourceItem, targetItem, statusHolder, properties);
-        PropertiesAddon propertiesAddon = addonsManager.addonByType(PropertiesAddon.class);
-        Multiset<String> keys = properties.keys();
-        for (String key : keys) {
-            Set<String> valuesForKey = properties.get(key);
-            Property property = new Property();
-            property.setName(key);
-            String[] values = new String[valuesForKey.size()];
-            valuesForKey.toArray(values);
-            propertiesAddon.addProperty(targetItem.getRepoPath(), null, property, values);
-        }
-    }
-
-    @Override
-    public void afterMove(VfsItem sourceItem, VfsItem targetItem, MutableStatusHolder statusHolder,
-            Properties properties) {
-        super.afterMove(sourceItem, targetItem, statusHolder, properties);
-        PropertiesAddon propertiesAddon = addonsManager.addonByType(PropertiesAddon.class);
-        Multiset<String> keys = properties.keys();
-        for (String key : keys) {
-            Set<String> valuesForKey = properties.get(key);
-            Property property = new Property();
-            property.setName(key);
-            String[] values = new String[valuesForKey.size()];
-            valuesForKey.toArray(values);
-            propertiesAddon.addProperty(targetItem.getRepoPath(), null, property, values);
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/interceptor/ArchiveIndexingInterceptor.java b/backend/core/src/main/java/org/artifactory/repo/interceptor/ArchiveIndexingInterceptor.java
deleted file mode 100644
index 36445d2..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/interceptor/ArchiveIndexingInterceptor.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.interceptor;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.search.ArchiveIndexer;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.mime.MimeType;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.interceptor.storage.StorageInterceptorAdapter;
-import org.artifactory.repo.trash.TrashService;
-import org.artifactory.sapi.fs.VfsItem;
-import org.artifactory.sapi.interceptor.ImportInterceptor;
-
-/**
- * Interceptor which handles archive indexing calculation upon creation
- *
- * @author Noam Tenne
- */
-public class ArchiveIndexingInterceptor extends StorageInterceptorAdapter implements ImportInterceptor {
-
-    /**
-     * If the newly created item is a file, this method will mark it up for content indexing.
-     *
-     * @param fsItem       Newly created item
-     * @param statusHolder StatusHolder
-     */
-    @Override
-    public void afterCreate(VfsItem fsItem, MutableStatusHolder statusHolder) {
-        markArchiveForIndexing(fsItem);
-    }
-
-    @Override
-    public void afterImport(VfsItem fsItem, MutableStatusHolder statusHolder) {
-        markArchiveForIndexing(fsItem);
-    }
-
-    private void markArchiveForIndexing(VfsItem fsItem) {
-        if (shouldIndexItem(fsItem)) {
-            ArchiveIndexer archiveIndexer = ContextHelper.get().beanForType(ArchiveIndexer.class);
-            archiveIndexer.markArchiveForIndexing(fsItem.getRepoPath());
-        }
-    }
-
-    private boolean shouldIndexItem(VfsItem fsItem) {
-        if (!fsItem.isFile()) {
-            return false;
-        }
-
-        if (TrashService.TRASH_KEY.equals(fsItem.getRepoKey())) {
-            return false;
-        }
-
-        MimeType mimeType = NamingUtils.getMimeType(fsItem.getName());
-        boolean supportsIndexing = mimeType.isArchive() && mimeType.isIndex();
-
-        if (!supportsIndexing) {
-            return false;
-        }
-
-        // Skip indexing on virtual repo
-        RepositoryService repositoryService = ContextHelper.get().getRepositoryService();
-        if (repositoryService.virtualRepoDescriptorByKey(fsItem.getRepoKey()) != null) {
-            return false;
-        }
-
-        return true;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/interceptor/ImportInterceptorsImpl.java b/backend/core/src/main/java/org/artifactory/repo/interceptor/ImportInterceptorsImpl.java
deleted file mode 100644
index c2b3ba5..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/interceptor/ImportInterceptorsImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.interceptor;
-
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.sapi.fs.VfsItem;
-import org.artifactory.sapi.interceptor.ImportInterceptor;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.storage.db.DbService;
-import org.springframework.stereotype.Service;
-
-/**
- * @author Noam Y. Tenne
- */
- at Service
- at Reloadable(beanClass = ImportInterceptors.class, initAfter = DbService.class)
-public class ImportInterceptorsImpl extends Interceptors<ImportInterceptor> implements ImportInterceptors {
-
-    @Override
-    public void afterImport(VfsItem fsItem, MutableStatusHolder statusHolder) {
-        for (ImportInterceptor importInterceptor : this) {
-            importInterceptor.afterImport(fsItem, statusHolder);
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/interceptor/IntegrationCleanerInterceptor.java b/backend/core/src/main/java/org/artifactory/repo/interceptor/IntegrationCleanerInterceptor.java
deleted file mode 100644
index 1753d8d..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/interceptor/IntegrationCleanerInterceptor.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.interceptor;
-
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.cleanup.InternalIntegrationCleanupService;
-import org.artifactory.repo.interceptor.storage.StorageInterceptorAdapter;
-import org.artifactory.sapi.fs.VfsItem;
-import org.springframework.beans.factory.annotation.Autowired;
-
-/**
- * @author yoav
- */
-public class IntegrationCleanerInterceptor extends StorageInterceptorAdapter {
-
-    @Autowired
-    private InternalIntegrationCleanupService cleanupService;
-
-    @Autowired
-    private RepositoryService repositoryService;
-
-    /**
-     * Cleanup old snapshots etc.
-     *
-     * @param fsItem
-     * @param statusHolder
-     */
-    @Override
-    public void afterCreate(VfsItem fsItem, MutableStatusHolder statusHolder) {
-        if (fsItem.isFolder()) {
-            return;
-        }
-
-        LocalRepoDescriptor repoDescriptor = repositoryService.localRepoDescriptorByKey(fsItem.getRepoKey());
-        if (repoDescriptor == null) {
-            return;
-        }
-
-        int maxUniqueSnapshots = repoDescriptor.getMaxUniqueSnapshots();
-        if (maxUniqueSnapshots > 0) {
-            RepoPath fsItemRepoPath = fsItem.getRepoPath();
-            ModuleInfo itemModuleInfo = repositoryService.getItemModuleInfo(fsItemRepoPath);
-            if (!itemModuleInfo.isValid() || !itemModuleInfo.isIntegration()) {
-                return;
-            }
-
-            cleanupService.addItemToCache(fsItemRepoPath);
-        }
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/repo/interceptor/Interceptors.java b/backend/core/src/main/java/org/artifactory/repo/interceptor/Interceptors.java
deleted file mode 100644
index ea3d0c6..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/interceptor/Interceptors.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.interceptor;
-
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.interceptor.Interceptor;
-import org.artifactory.spring.ArtifactoryApplicationContext;
-import org.artifactory.spring.ReloadableBean;
-import org.artifactory.version.CompoundVersionDetails;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.BeanNameAware;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
-
-import java.io.Serializable;
-import java.lang.reflect.ParameterizedType;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * @author yoav
- */
-public abstract class Interceptors<T extends Interceptor> implements Iterable<T>, Serializable, ReloadableBean,
-        BeanNameAware, ApplicationContextAware {
-    private static final Logger log = LoggerFactory.getLogger(Interceptors.class);
-
-    private final List<T> interceptors = new LinkedList<>();
-    private Class<T> interceptorInterface;
-
-    protected ArtifactoryApplicationContext context;
-    private String beanName;
-
-    @SuppressWarnings({"unchecked"})
-    protected Interceptors() {
-        //Get all the interceptors that match the parametrized type of this chain
-        this.interceptorInterface =
-                (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
-    }
-
-    @Override
-    public Iterator<T> iterator() {
-        return interceptors.iterator();
-    }
-
-    @Override
-    public void init() {
-        Collection<T> allInterceptorsIncludingMe = context.beansForType(interceptorInterface).values();
-        Object thisAsBean = context.getBean(beanName);
-        for (T t : allInterceptorsIncludingMe) {
-            if (t != thisAsBean) {
-                interceptors.add(t);
-            }
-        }
-        log.debug("Loaded interceptors of type {}: {}", interceptorInterface.getSimpleName(), interceptors);
-    }
-
-    @Override
-    public void setApplicationContext(ApplicationContext context) {
-        this.context = (ArtifactoryApplicationContext) context;
-    }
-
-    @Override
-    public void setBeanName(String beanName) {
-        this.beanName = beanName;
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-        // nothing here
-    }
-
-    @Override
-    public void destroy() {
-        // nothing here
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-        // nothing here
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/repo/interceptor/MavenMetadataCalculationInterceptor.java b/backend/core/src/main/java/org/artifactory/repo/interceptor/MavenMetadataCalculationInterceptor.java
deleted file mode 100644
index 724b709..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/interceptor/MavenMetadataCalculationInterceptor.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.interceptor;
-
-import org.artifactory.api.maven.MavenArtifactInfo;
-import org.artifactory.api.maven.MavenMetadataService;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.descriptor.repo.SnapshotVersionBehavior;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.interceptor.storage.StorageInterceptorAdapter;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.sapi.fs.VfsItem;
-import org.artifactory.sapi.interceptor.DeleteContext;
-import org.artifactory.util.RepoLayoutUtils;
-import org.artifactory.util.RepoPathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-
-/**
- * Interceptor which handles maven metadata calculation upon creation and removal
- *
- * @author Noam Tenne
- */
-public class MavenMetadataCalculationInterceptor extends StorageInterceptorAdapter {
-    private static final Logger log = LoggerFactory.getLogger(MavenMetadataCalculationInterceptor.class);
-
-    @Autowired
-    private MavenMetadataService mmService;
-    @Autowired
-    private InternalRepositoryService repoService;
-
-    /**
-     * If the newly created item is a pom file, this method will calculate the maven metadata of it's parent folder
-     *
-     * @param fsItem       Newly created item
-     * @param statusHolder StatusHolder
-     */
-    @Override
-    public void afterCreate(VfsItem fsItem, MutableStatusHolder statusHolder) {
-        if (shouldRecalculateOnCreate(fsItem)) {
-            if (MavenNaming.isUniqueSnapshot(fsItem.getPath()) ||
-                    (isPomFile(fsItem) && MavenNaming.isSnapshot(fsItem.getPath()))) {
-                // unique snapshots require instant metadata calculation since it is used to calculate future snapshots
-                // this is also done for any kind of file to support classifier snapshot version introduced in Maven 3
-                // we also instantly calculate if non-unique pom is deployed for simplicity
-                RepoPath parentFolder = fsItem.getRepoPath().getParent();
-                mmService.calculateMavenMetadata(parentFolder, false);
-            }
-
-            if (isPomFile(fsItem)) {
-                // for pom files we need to trigger metadata calculation on the grandparent non-recursively -
-                // potential new version and snapshot.
-                // this can be done asynchronously since it doesn't require instant update
-                RepoPath grandparentFolder = RepoPathUtils.getAncestor(fsItem.getRepoPath(), 2);
-                mmService.calculateMavenMetadataAsync(grandparentFolder, false);
-            }
-        }
-    }
-
-    @Override
-    public void afterDelete(VfsItem fsItem, MutableStatusHolder statusHolder, DeleteContext ctx) {
-        if (ctx.isCalculateMavenMetadata() && isMavenSupportingRepo(getLocalRepo(fsItem))) {
-            // calculate maven metadata on the parent path
-            RepoPath parent = ctx.getRepoPath().getParent();
-            if (parent != null && !parent.isRoot()) {
-                mmService.calculateMavenMetadataAsync(parent, false);
-                if (isPomFile(fsItem)) {
-                    // also calculate maven metadata on the artifactId node (grandparent of the file)
-                    RepoPath grandParent = parent.getParent();
-                    mmService.calculateMavenMetadataAsync(grandParent, false);
-                }
-            }
-        }
-    }
-
-    private boolean shouldRecalculateOnCreate(VfsItem fsItem) {
-        if (!fsItem.isFile()) {
-            return false;
-        }
-
-        LocalRepo localRepo = getLocalRepo(fsItem);
-        if (!isMavenSupportingRepo(localRepo)) {
-            return false;
-        }
-
-        // it's a local non-cache repository, check the snapshot behavior
-        MavenArtifactInfo moduleInfo = MavenArtifactInfo.fromRepoPath(fsItem.getRepoPath());
-        if (!moduleInfo.isValid()) {
-            return false;
-        }
-
-        if (MavenNaming.isSnapshot(fsItem.getPath()) &&
-                SnapshotVersionBehavior.DEPLOYER.equals(localRepo.getMavenSnapshotVersionBehavior())) {
-            return false;
-        }
-        return true;
-    }
-
-    private LocalRepo getLocalRepo(VfsItem fsItem) {
-        return repoService.localRepositoryByKey(fsItem.getRepoKey());
-    }
-
-    private boolean isMavenSupportingRepo(LocalRepo localRepo) {
-        if (localRepo == null) {
-            return false;
-        }
-        RepoLayout repoLayout = localRepo.getDescriptor().getRepoLayout();
-        RepoType type = localRepo.getDescriptor().getType();
-        // Do not calculate maven metadata if type == null or type doesn't belong to the maven group (Maven, Ivy, Gradle) or repoLayout not equals MAVEN_2_DEFAULT
-        if (type != null && !(type.isMavenGroup() || RepoLayoutUtils.MAVEN_2_DEFAULT.equals(repoLayout))) {
-            log.debug("Skipping maven metadata calculation since repoType '{}' doesn't belong to neither Maven, Ivy, Gradle" +
-                    " repositories types.", localRepo.getKey());
-            return false;
-        }
-        return true;
-    }
-
-    private boolean isPomFile(VfsItem fsItem) {
-        return MavenNaming.isPom(fsItem.getRepoPath().getPath());
-    }
-
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/interceptor/MavenPomInterceptor.java b/backend/core/src/main/java/org/artifactory/repo/interceptor/MavenPomInterceptor.java
deleted file mode 100644
index 5db5de5..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/interceptor/MavenPomInterceptor.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.interceptor;
-
-import org.apache.commons.io.IOUtils;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.properties.PropertiesService;
-import org.artifactory.api.repo.exception.maven.BadPomException;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.maven.PomTargetPathValidator;
-import org.artifactory.md.Properties;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.repo.StoringRepo;
-import org.artifactory.repo.interceptor.storage.StorageInterceptorAdapter;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.sapi.fs.MutableVfsFile;
-import org.artifactory.sapi.fs.VfsFile;
-import org.artifactory.sapi.fs.VfsItem;
-import org.artifactory.sapi.interceptor.ImportInterceptor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * An interceptor that checks the validity of POM files and if it represents a maven plugin.
- *
- * @author Yossi Shaul
- */
-public class MavenPomInterceptor extends StorageInterceptorAdapter implements ImportInterceptor {
-    private static final Logger log = LoggerFactory.getLogger(MavenPomInterceptor.class);
-
-    @Override
-    public void afterCreate(VfsItem fsItem, MutableStatusHolder statusHolder) {
-        if (!fsItem.isFile()) {
-            return;
-        }
-
-        VfsFile fsFile = (VfsFile) fsItem;
-        if (MavenNaming.isPom(fsItem.getName())) {
-            InternalRepositoryService repoService = ContextHelper.get().beanForType(InternalRepositoryService.class);
-            String repoKey = fsItem.getRepoKey();
-            StoringRepo storingRepo = repoService.storingRepositoryByKey(repoKey);
-            LocalRepoDescriptor descriptor = repoService.localCachedOrDistributionRepoDescriptorByKey(repoKey);
-            if (!isStoringRepoReal(storingRepo) || !repoIsMaven(descriptor)) {
-                return;
-            }
-            boolean suppressPomConsistencyChecks = storingRepo.isSuppressPomConsistencyChecks();
-            ModuleInfo moduleInfo = storingRepo.getItemModuleInfo(fsItem.getPath());
-            PomTargetPathValidator pomValidator = new PomTargetPathValidator(fsItem.getPath(), moduleInfo);
-            InputStream is = fsFile.getStream();
-            try {
-                pomValidator.validate(is, suppressPomConsistencyChecks);
-            } catch (BadPomException e) {
-                throw new RuntimeException("Failed to validate pom file: " + e.getMessage(), e);
-            } catch (IOException e) {
-                throw new RuntimeException("Failed to parse pom file: " + e.getMessage(), e);
-            } finally {
-                IOUtils.closeQuietly(is);
-            }
-
-            if (pomValidator.isMavenPlugin()) {
-                log.debug("Marking {} as maven plugin", fsItem.getRepoPath());
-                MutableVfsFile mutableFile = storingRepo.getMutableFile(fsItem.getRepoPath());
-                Properties properties = mutableFile.getProperties();
-                properties.put(PropertiesService.MAVEN_PLUGIN_PROPERTY_NAME, Boolean.toString(true));
-                mutableFile.setProperties(properties);
-            }
-        }
-    }
-
-    @Override
-    public void afterImport(VfsItem fsItem, MutableStatusHolder statusHolder) {
-        afterCreate(fsItem, statusHolder);
-    }
-
-    private boolean isStoringRepoReal(StoringRepo storingRepo) {
-        return storingRepo != null && storingRepo.isReal();
-    }
-
-    private boolean repoIsMaven(LocalRepoDescriptor descriptor) {
-        return descriptor != null && descriptor.getType().isMavenGroup();
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/interceptor/NpmMetadataInterceptor.java b/backend/core/src/main/java/org/artifactory/repo/interceptor/NpmMetadataInterceptor.java
deleted file mode 100644
index 610fc5d..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/interceptor/NpmMetadataInterceptor.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.interceptor;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.npm.NpmAddon;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.interceptor.storage.StorageInterceptorAdapter;
-import org.artifactory.sapi.fs.VfsItem;
-import org.artifactory.sapi.interceptor.DeleteContext;
-import org.artifactory.sapi.interceptor.StorageAggregationInterceptor;
-import org.springframework.beans.factory.annotation.Autowired;
-
-/**
- * @author Shay Yaakov
- */
-public class NpmMetadataInterceptor extends StorageInterceptorAdapter implements StorageAggregationInterceptor {
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Autowired
-    private RepositoryService repositoryService;
-
-    @Override
-    public void afterCreate(VfsItem fsItem, MutableStatusHolder statusHolder) {
-        if (shouldTakeAction(fsItem)) {
-            addonsManager.addonByType(NpmAddon.class).addNpmPackage(((FileInfo) fsItem.getInfo()));
-        }
-    }
-
-    @Override
-    public void afterDelete(VfsItem fsItem, MutableStatusHolder statusHolder, DeleteContext ctx) {
-        if (shouldTakeAction(fsItem)) {
-            addonsManager.addonByType(NpmAddon.class).removeNpmPackage(((FileInfo) fsItem.getInfo()));
-        }
-    }
-
-    @Override
-    public void afterMove(VfsItem sourceItem, VfsItem targetItem, MutableStatusHolder statusHolder,
-            Properties properties) {
-        if (shouldTakeAction(sourceItem)) {
-            addonsManager.addonByType(NpmAddon.class).removeNpmPackage(((FileInfo) sourceItem.getInfo()));
-        }
-
-        if (shouldTakeAction(targetItem)) {
-            addonsManager.addonByType(NpmAddon.class).handleAddAfterCommit(((FileInfo) targetItem.getInfo()));
-        }
-    }
-
-    @Override
-    public void afterCopy(VfsItem sourceItem, VfsItem targetItem, MutableStatusHolder statusHolder,
-            Properties properties) {
-        if (shouldTakeAction(targetItem)) {
-            addonsManager.addonByType(NpmAddon.class).handleAddAfterCommit(((FileInfo) targetItem.getInfo()));
-        }
-    }
-
-    @Override
-    public void afterRepoImport(RepoPath rootRepoPath, int itemsCount, MutableStatusHolder status) {
-        if (repositoryService.localRepoDescriptorByKey(rootRepoPath.getRepoKey()) != null) {
-            addonsManager.addonByType(NpmAddon.class).reindexAsync(rootRepoPath.getRepoKey());
-        }
-    }
-
-    private boolean shouldTakeAction(VfsItem item) {
-        if (item.isFile()) {
-            RepoPath repoPath = item.getRepoPath();
-            if (repoPath.getPath().endsWith(".tgz")) {
-                String repoKey = repoPath.getRepoKey();
-                RepoDescriptor repoDescriptor = repositoryService.localRepoDescriptorByKey(repoKey);
-                return ((repoDescriptor != null) && repoDescriptor.getType().equals(RepoType.Npm));
-            }
-        }
-
-        return false;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/interceptor/NuGetCalculationInterceptor.java b/backend/core/src/main/java/org/artifactory/repo/interceptor/NuGetCalculationInterceptor.java
deleted file mode 100644
index 3002cdc..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/interceptor/NuGetCalculationInterceptor.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.interceptor;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.NuGetAddon;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.interceptor.storage.StorageInterceptorAdapter;
-import org.artifactory.sapi.fs.VfsItem;
-import org.artifactory.sapi.interceptor.DeleteContext;
-import org.artifactory.sapi.interceptor.ImportInterceptor;
-
-import javax.inject.Inject;
-
-import static org.artifactory.addon.nuget.NuGetProperties.Id;
-import static org.artifactory.addon.nuget.NuGetProperties.Version;
-
-/**
- * Triggers NuGet package related storage events
- *
- * @author Noam Y. Tenne
- */
-public class NuGetCalculationInterceptor extends StorageInterceptorAdapter implements ImportInterceptor {
-
-    @Inject
-    AddonsManager addonsManager;
-
-    @Inject
-    RepositoryService repositoryService;
-
-    @Override
-    public void afterDelete(VfsItem fsItem, MutableStatusHolder statusHolder, DeleteContext ctx) {
-        removeNuPkgFromRepositoryIfNeeded(fsItem);
-    }
-
-    @Override
-    public void afterCreate(VfsItem fsItem, MutableStatusHolder statusHolder) {
-        extractNuPkgInfoIfNeeded(fsItem, new BasicStatusHolder());
-    }
-
-    @Override
-    public void afterMove(VfsItem sourceItem, VfsItem targetItem, MutableStatusHolder statusHolder,
-            Properties properties) {
-        handleOnAfterMoveOrCopy(sourceItem, targetItem, statusHolder);
-    }
-
-    @Override
-    public void afterCopy(VfsItem sourceItem, VfsItem targetItem, MutableStatusHolder statusHolder,
-            Properties properties) {
-        handleOnAfterMoveOrCopy(null, targetItem, statusHolder);
-    }
-
-    @Override
-    public void afterImport(VfsItem fsItem, MutableStatusHolder statusHolder) {
-        extractNuPkgInfoIfNeeded(fsItem, statusHolder);
-    }
-
-    /**
-     * Extracts the info of the given item if it's a nupkg and is stored within a nupkg enabled repo
-     */
-    private void extractNuPkgInfoIfNeeded(VfsItem createdItem, MutableStatusHolder statusHolder) {
-        if (shouldTakeAction(createdItem)) {
-            addonsManager.addonByType(NuGetAddon.class).extractNuPkgInfo(((FileInfo) createdItem.getInfo()),
-                    statusHolder, true);
-        }
-    }
-
-    /**
-     * If it's a nupkg recalculate the IDs latest version state for the repository
-     */
-    private void handleOnAfterMoveOrCopy(VfsItem sourceItem, VfsItem targetItem, MutableStatusHolder statusHolder) {
-        if ((sourceItem != null) && shouldTakeAction(sourceItem)) {
-            removeNuPkgFromRepositoryIfNeeded(sourceItem);
-        }
-
-        if (shouldTakeAction(targetItem)) {
-            Properties nuPkgProperties = targetItem.getProperties();
-            String nuPkgId = Id.extract(nuPkgProperties);
-            if (StringUtils.isBlank(nuPkgId)) {
-                /**
-                 * Package might have come from a repo with no NuGet support, so extract the info and the request
-                 * calculation
-                 */
-                addonsManager.addonByType(NuGetAddon.class).extractNuPkgInfo((FileInfo) targetItem.getInfo(),
-                        statusHolder, true);
-            } else {
-                addonsManager.addonByType(NuGetAddon.class).addNuPkgToRepoCacheAsync(targetItem.getRepoPath(),
-                        nuPkgProperties);
-            }
-        }
-    }
-
-    private void removeNuPkgFromRepositoryIfNeeded(VfsItem affectedItem) {
-        if (shouldTakeAction(affectedItem)) {
-            Properties nuPkgProperties = affectedItem.getProperties();
-            String nuPkgId = Id.extract(nuPkgProperties);
-            String nuPkgVersion = Version.extract(nuPkgProperties);
-            if (StringUtils.isNotBlank(nuPkgId) && StringUtils.isNotBlank(nuPkgVersion)) {
-                addonsManager.addonByType(NuGetAddon.class).removeNuPkgFromRepoCache(affectedItem.getRepoKey(),
-                        nuPkgId, nuPkgVersion);
-            }
-        }
-    }
-
-    private boolean shouldTakeAction(VfsItem item) {
-        if (item.isFile()) {
-            RepoPath repoPath = item.getRepoPath();
-            if (repoPath.getPath().endsWith(".nupkg")) {
-                String repoKey = repoPath.getRepoKey();
-                RepoDescriptor repoDescriptor = repositoryService.repoDescriptorByKey(repoKey);
-                return ((repoDescriptor != null) && repoDescriptor.getType().equals(RepoType.NuGet));
-            }
-        }
-
-        return false;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/interceptor/PluginsInterceptor.java b/backend/core/src/main/java/org/artifactory/repo/interceptor/PluginsInterceptor.java
deleted file mode 100644
index ae49563..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/interceptor/PluginsInterceptor.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.interceptor;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.plugin.PluginsAddon;
-import org.artifactory.addon.plugin.storage.*;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.interceptor.storage.StorageInterceptorAdapter;
-import org.artifactory.sapi.fs.VfsItem;
-import org.artifactory.sapi.interceptor.DeleteContext;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import javax.inject.Inject;
-
-/**
- * An interceptor that executes plugin scripts
- *
- * @author Yoav Landman
- */
-public class PluginsInterceptor extends StorageInterceptorAdapter {
-
-    @Inject
-    AddonsManager addonsManager;
-
-    @Autowired
-    RepositoryService repoService;
-
-    @Override
-    public void beforeCreate(VfsItem fsItem, MutableStatusHolder statusHolder) {
-        if (isContainingRepoLocal(fsItem)) {
-            getPluginsAddon().execPluginActions(BeforeCreateAction.class, null, fsItem.getInfo());
-        }
-    }
-
-    @Override
-    public void afterCreate(VfsItem fsItem, MutableStatusHolder statusHolder) {
-        if (isContainingRepoLocal(fsItem)) {
-            getPluginsAddon().execPluginActions(AfterCreateAction.class, null, fsItem.getInfo());
-        }
-    }
-
-    @Override
-    public void beforeDelete(VfsItem fsItem, MutableStatusHolder statusHolder, boolean moved) {
-        if (isContainingRepoLocal(fsItem)) {
-            getPluginsAddon().execPluginActions(BeforeDeleteAction.class, null, fsItem.getInfo());
-        }
-    }
-
-    @Override
-    public void afterDelete(VfsItem fsItem, MutableStatusHolder statusHolder, DeleteContext ctx) {
-        if (isContainingRepoLocal(fsItem)) {
-            getPluginsAddon().execPluginActions(AfterDeleteAction.class, null, fsItem.getInfo());
-        }
-    }
-
-    @Override
-    public void beforeMove(VfsItem sourceItem, RepoPath targetRepoPath, MutableStatusHolder statusHolder,
-            Properties properties) {
-        if (isContainingRepoLocal(sourceItem)) {
-            getPluginsAddon().execPluginActions(BeforeMoveAction.class, null, sourceItem.getInfo(), targetRepoPath,
-                    properties);
-        }
-    }
-
-
-    @Override
-    public void afterMove(VfsItem sourceItem, VfsItem targetItem, MutableStatusHolder statusHolder,
-            Properties properties) {
-        if (isContainingRepoLocal(sourceItem) && isContainingRepoLocal(targetItem)) {
-            getPluginsAddon().execPluginActions(AfterMoveAction.class, null, sourceItem.getInfo(),
-                    nullOrRepoPath(targetItem), properties);
-        }
-    }
-
-    @Override
-    public void beforeCopy(VfsItem sourceItem, RepoPath targetRepoPath, MutableStatusHolder statusHolder,
-            Properties properties) {
-        if (isContainingRepoLocal(sourceItem)) {
-            getPluginsAddon().execPluginActions(BeforeCopyAction.class, null, sourceItem.getInfo(), targetRepoPath,
-                    properties);
-        }
-    }
-
-    @Override
-    public void afterCopy(VfsItem sourceItem, VfsItem targetItem, MutableStatusHolder statusHolder,
-            Properties properties) {
-        if (isContainingRepoLocal(sourceItem) && isContainingRepoLocal(targetItem)) {
-            getPluginsAddon().execPluginActions(AfterCopyAction.class, null, sourceItem.getInfo(),
-                    nullOrRepoPath(targetItem), properties);
-        }
-    }
-
-    @Override
-    public void beforePropertyCreate(VfsItem fsItem, MutableStatusHolder statusHolder, String name, String... values) {
-        if (isContainingRepoLocal(fsItem)) {
-            getPluginsAddon().execPluginActions(BeforePropertyCreateAction.class, null, fsItem.getInfo(), name, values);
-        }
-    }
-
-    @Override
-    public void afterPropertyCreate(VfsItem fsItem, MutableStatusHolder statusHolder, String name,
-            String... values) {
-        if (isContainingRepoLocal(fsItem)) {
-            getPluginsAddon().execPluginActions(AfterPropertyCreateAction.class, null, fsItem.getInfo(), name, values);
-        }
-    }
-
-    @Override
-    public void beforePropertyDelete(VfsItem fsItem, MutableStatusHolder statusHolder, String name) {
-        if (isContainingRepoLocal(fsItem)) {
-            getPluginsAddon().execPluginActions(BeforePropertyDeleteAction.class, null, fsItem.getInfo(), name);
-        }
-    }
-
-    @Override
-    public void afterPropertyDelete(VfsItem fsItem, MutableStatusHolder statusHolder, String name) {
-        if (isContainingRepoLocal(fsItem)) {
-            getPluginsAddon().execPluginActions(AfterPropertyDeleteAction.class, null, fsItem.getInfo(), name);
-        }
-    }
-
-    private RepoPath nullOrRepoPath(VfsItem targetItem) {
-        return targetItem != null ? targetItem.getRepoPath() : null;
-    }
-
-    private PluginsAddon getPluginsAddon() {
-        return addonsManager.addonByType(PluginsAddon.class);
-    }
-
-    private boolean isContainingRepoLocal(VfsItem fsItem) {
-        return fsItem != null && repoService.localOrCachedRepoDescriptorByKey(fsItem.getRepoKey()) != null;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/interceptor/StorageAggregationInterceptorsImpl.java b/backend/core/src/main/java/org/artifactory/repo/interceptor/StorageAggregationInterceptorsImpl.java
deleted file mode 100644
index 04be06b..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/interceptor/StorageAggregationInterceptorsImpl.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.interceptor;
-
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.interceptor.StorageAggregationInterceptor;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.storage.db.DbService;
-import org.springframework.stereotype.Service;
-
-/**
- * @author Noam Y. Tenne
- */
- at Service
- at Reloadable(beanClass = StorageAggregationInterceptors.class, initAfter = DbService.class)
-public class StorageAggregationInterceptorsImpl extends Interceptors<StorageAggregationInterceptor>
-        implements StorageAggregationInterceptors {
-
-    @Override
-    public void afterRepoImport(RepoPath rootRepoPath, int itemsCount, MutableStatusHolder status) {
-        for (StorageAggregationInterceptor interceptor : this) {
-            interceptor.afterRepoImport(rootRepoPath, itemsCount, status);
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/interceptor/TrashInterceptor.java b/backend/core/src/main/java/org/artifactory/repo/interceptor/TrashInterceptor.java
deleted file mode 100644
index c403185..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/interceptor/TrashInterceptor.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.interceptor;
-
-import com.google.common.collect.Lists;
-import org.artifactory.api.properties.PropertiesService;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.descriptor.property.Property;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.interceptor.storage.StorageInterceptorAdapter;
-import org.artifactory.repo.trash.TrashService;
-import org.artifactory.sapi.fs.VfsItem;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * An interceptor that copies items into the global trashcan
- *
- * @author Shay Yaakov
- */
-public class TrashInterceptor extends StorageInterceptorAdapter {
-
-    @Autowired
-    private TrashService trashService;
-
-    @Autowired
-    private PropertiesService propertiesService;
-
-    @Override
-    public void beforeDelete(VfsItem fsItem, MutableStatusHolder statusHolder, boolean moved) {
-        if (!moved) {
-            trashService.copyToTrash(fsItem.getRepoPath());
-        }
-    }
-
-    @Override
-    public void afterMove(VfsItem sourceItem, VfsItem targetItem, MutableStatusHolder statusHolder, Properties properties) {
-        if (!TrashService.TRASH_KEY.equals(sourceItem.getRepoKey())) {
-            return;
-        }
-        Map<Property, List<String>> propertiesMap = new HashMap<>();
-        propertiesMap.put(new Property(TrashService.PROP_RESTORED_TIME), Lists.newArrayList(String.valueOf(System.currentTimeMillis())));
-        propertiesService.addPropertyRecursivelyMultiple(targetItem.getRepoPath(), null, propertiesMap, false);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/interceptor/storage/StorageInterceptorAdapter.java b/backend/core/src/main/java/org/artifactory/repo/interceptor/storage/StorageInterceptorAdapter.java
deleted file mode 100644
index d40c6d3..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/interceptor/storage/StorageInterceptorAdapter.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.interceptor.storage;
-
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.fs.VfsItem;
-import org.artifactory.sapi.interceptor.DeleteContext;
-import org.artifactory.sapi.interceptor.StorageInterceptor;
-
-/**
- * @author yoav
- */
-public abstract class StorageInterceptorAdapter implements StorageInterceptor {
-
-    @Override
-    public void beforeCreate(VfsItem fsItem, MutableStatusHolder statusHolder) {
-    }
-
-    @Override
-    public void afterCreate(VfsItem fsItem, MutableStatusHolder statusHolder) {
-    }
-
-    @Override
-    public void beforeDelete(VfsItem fsItem, MutableStatusHolder statusHolder, boolean moved) {
-    }
-
-    @Override
-    public void afterDelete(VfsItem fsItem, MutableStatusHolder statusHolder, DeleteContext ctx) {
-    }
-
-    @Override
-    public void afterMove(VfsItem sourceItem, VfsItem targetItem, MutableStatusHolder statusHolder,
-            Properties properties) {
-    }
-
-    @Override
-    public void beforeCopy(VfsItem sourceItem, RepoPath targetRepoPath, MutableStatusHolder statusHolder,
-            Properties properties) {
-    }
-
-    @Override
-    public void afterCopy(VfsItem sourceItem, VfsItem targetItem, MutableStatusHolder statusHolder,
-            Properties properties) {
-    }
-
-    @Override
-    public void beforeMove(VfsItem sourceItem, RepoPath targetRepoPath, MutableStatusHolder statusHolder,
-            Properties properties) {
-    }
-
-    @Override
-    public void beforePropertyCreate(VfsItem fsItem, MutableStatusHolder statusHolder, String name, String... values) {
-    }
-
-    @Override
-    public void afterPropertyCreate(VfsItem fsItem, MutableStatusHolder statusHolder, String name,
-            String... values) {
-    }
-
-    @Override
-    public void beforePropertyDelete(VfsItem fsItem, MutableStatusHolder statusHolder, String name) {
-    }
-
-    @Override
-    public void afterPropertyDelete(VfsItem fsItem, MutableStatusHolder statusHolder, String name) {
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/repo/interceptor/storage/StorageInterceptorsImpl.java b/backend/core/src/main/java/org/artifactory/repo/interceptor/storage/StorageInterceptorsImpl.java
deleted file mode 100644
index 0701856..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/interceptor/storage/StorageInterceptorsImpl.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.interceptor.storage;
-
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.exception.CancelException;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.interceptor.Interceptors;
-import org.artifactory.repo.interceptor.StorageInterceptors;
-import org.artifactory.repo.trash.TrashService;
-import org.artifactory.sapi.fs.VfsItem;
-import org.artifactory.sapi.interceptor.DeleteContext;
-import org.artifactory.sapi.interceptor.StorageInterceptor;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.storage.db.DbService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-/**
- * @author yoav
- */
- at Service
- at Reloadable(beanClass = StorageInterceptors.class, initAfter = DbService.class)
-public class StorageInterceptorsImpl extends Interceptors<StorageInterceptor> implements StorageInterceptors {
-    private static final Logger log = LoggerFactory.getLogger(StorageInterceptorsImpl.class);
-
-    @Override
-    public void beforeCreate(VfsItem fsItem, MutableStatusHolder statusHolder) {
-        try {
-            if (!isTrash(fsItem.getRepoPath())) {
-                for (StorageInterceptor storageInterceptor : this) {
-                    storageInterceptor.beforeCreate(fsItem, statusHolder);
-                }
-            }
-        } catch (CancelException e) {
-            statusHolder.error("Before create rejected: " + e.getMessage(), e.getErrorCode(), e, log);
-        }
-    }
-
-    @Override
-    public void afterCreate(VfsItem fsItem, MutableStatusHolder statusHolder) {
-        try {
-            if (!isTrash(fsItem.getRepoPath())) {
-                for (StorageInterceptor storageInterceptor : this) {
-                    storageInterceptor.afterCreate(fsItem, statusHolder);
-                }
-            }
-        } catch (CancelException e) {
-            statusHolder.error("After create rejected: " + e.getMessage(), e.getErrorCode(), e, log);
-        }
-    }
-
-    @Override
-    public void beforeDelete(VfsItem fsItem, MutableStatusHolder statusHolder, boolean moved) {
-        try {
-            if (!isTrash(fsItem.getRepoPath())) {
-                for (StorageInterceptor storageInterceptor : this) {
-                    storageInterceptor.beforeDelete(fsItem, statusHolder, moved);
-                }
-            }
-        } catch (CancelException e) {
-            statusHolder.error("Delete rejected: " + e.getMessage(), e.getErrorCode(), e, log);
-        }
-    }
-
-    @Override
-    public void afterDelete(VfsItem fsItem, MutableStatusHolder statusHolder, DeleteContext ctx) {
-        if (!isTrash(fsItem.getRepoPath())) {
-            for (StorageInterceptor storageInterceptor : this) {
-                storageInterceptor.afterDelete(fsItem, statusHolder, ctx);
-            }
-        }
-    }
-
-    @Override
-    public void beforePropertyCreate(VfsItem fsItem, MutableStatusHolder statusHolder, String name, String... values) {
-        try {
-            if (!isTrash(fsItem.getRepoPath())) {
-                for (StorageInterceptor storageInterceptor : this) {
-                    storageInterceptor.beforePropertyCreate(fsItem, statusHolder, name, values);
-                }
-            }
-        } catch (CancelException e) {
-            statusHolder.error("Property create rejected: " + e.getMessage(), e.getErrorCode(), e, log);
-        }
-    }
-
-    @Override
-    public void afterPropertyCreate(VfsItem fsItem, MutableStatusHolder statusHolder, String name,
-            String... values) {
-        if (!isTrash(fsItem.getRepoPath())) {
-            for (StorageInterceptor storageInterceptor : this) {
-                storageInterceptor.afterPropertyCreate(fsItem, statusHolder, name, values);
-            }
-        }
-    }
-
-    @Override
-    public void beforePropertyDelete(VfsItem fsItem, MutableStatusHolder statusHolder, String name) {
-        try {
-            if (!isTrash(fsItem.getRepoPath())) {
-                for (StorageInterceptor storageInterceptor : this) {
-                    storageInterceptor.beforePropertyDelete(fsItem, statusHolder, name);
-                }
-            }
-        } catch (CancelException e) {
-            statusHolder.error("Property delete rejected: " + e.getMessage(), e.getErrorCode(), e, log);
-        }
-    }
-
-    @Override
-    public void afterPropertyDelete(VfsItem fsItem, MutableStatusHolder statusHolder, String name) {
-        if (!isTrash(fsItem.getRepoPath())) {
-            for (StorageInterceptor storageInterceptor : this) {
-                storageInterceptor.afterPropertyDelete(fsItem, statusHolder, name);
-            }
-        }
-    }
-
-    @Override
-    public void beforeMove(VfsItem sourceItem, RepoPath targetRepoPath, MutableStatusHolder statusHolder,
-            Properties properties) {
-        try {
-            if (!isTrash(sourceItem.getRepoPath())) {
-                for (StorageInterceptor storageInterceptor : this) {
-                    storageInterceptor.beforeMove(sourceItem, targetRepoPath, statusHolder, properties);
-                }
-            }
-        } catch (CancelException e) {
-            statusHolder.error("Move rejected: " + e.getMessage(), e.getErrorCode(), e, log);
-        }
-    }
-
-    @Override
-    public void afterMove(VfsItem sourceItem, VfsItem targetItem, MutableStatusHolder statusHolder,
-            Properties properties) {
-        for (StorageInterceptor storageInterceptor : this) {
-                storageInterceptor.afterMove(sourceItem, targetItem, statusHolder, properties);
-        }
-    }
-
-    @Override
-    public void beforeCopy(VfsItem sourceItem, RepoPath targetRepoPath, MutableStatusHolder statusHolder,
-            Properties properties) {
-        try {
-            if (!isTrash(targetRepoPath)) {
-                for (StorageInterceptor storageInterceptor : this) {
-                    storageInterceptor.beforeCopy(sourceItem, targetRepoPath, statusHolder, properties);
-                }
-            }
-        } catch (CancelException e) {
-            statusHolder.error("Copy rejected: " + e.getMessage(), e.getErrorCode(), e, log);
-        }
-    }
-
-    @Override
-    public void afterCopy(VfsItem sourceItem, VfsItem targetItem, MutableStatusHolder statusHolder,
-            Properties properties) {
-        if (!isTrash(targetItem.getRepoPath())) {
-            for (StorageInterceptor storageInterceptor : this) {
-                storageInterceptor.afterCopy(sourceItem, targetItem, statusHolder, properties);
-            }
-        }
-    }
-
-    private boolean isTrash(RepoPath repoPath) {
-        return TrashService.TRASH_KEY.equals(repoPath.getRepoKey());
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/repo/local/LocalNonCacheOverridable.java b/backend/core/src/main/java/org/artifactory/repo/local/LocalNonCacheOverridable.java
deleted file mode 100644
index b15cf22..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/local/LocalNonCacheOverridable.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.local;
-
-import org.artifactory.repo.LocalRepo;
-
-/**
- * Interface for classes that determine whether an artifact can be overridden from a local non-cache with no delete permissions
- *
- * @author Noam Y. Tenne
- */
-public interface LocalNonCacheOverridable {
-
-    /**
-     * Indicates whether an artifact can be overridden from a local non-cache repo without delete permissions
-     *
-     * @param repo Local non-cache repo
-     * @param path Path to check
-     * @return True if the path can be overridden with no delete permissions
-     */
-    boolean isOverridable(LocalRepo repo, String path);
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/local/LocalNonCacheOverridables.java b/backend/core/src/main/java/org/artifactory/repo/local/LocalNonCacheOverridables.java
deleted file mode 100644
index de12754..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/local/LocalNonCacheOverridables.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.artifactory.repo.local;
-
-import org.artifactory.spring.ReloadableBean;
-
-/**
- * @author Shay Yaakov
- */
-public interface LocalNonCacheOverridables extends ReloadableBean, LocalNonCacheOverridable {
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/local/LocalNonCacheOverridablesImpl.java b/backend/core/src/main/java/org/artifactory/repo/local/LocalNonCacheOverridablesImpl.java
deleted file mode 100644
index c464603..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/local/LocalNonCacheOverridablesImpl.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package org.artifactory.repo.local;
-
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.spring.ArtifactoryApplicationContext;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.version.CompoundVersionDetails;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.BeanNameAware;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
-import org.springframework.stereotype.Service;
-
-import java.util.Collection;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * Aggregates and polls all the overridable components when needing to determine
- * if a path can be deleted without explicit delete permissions
- *
- * @author Shay Yaakov
- */
- at Service
- at Reloadable(beanClass = LocalNonCacheOverridables.class, initAfter = DbService.class)
-public class LocalNonCacheOverridablesImpl implements LocalNonCacheOverridables, BeanNameAware,
-        ApplicationContextAware {
-    private static final Logger log = LoggerFactory.getLogger(LocalNonCacheOverridablesImpl.class);
-
-    private ArtifactoryApplicationContext context;
-    private Set<LocalNonCacheOverridable> overridable = Sets.newHashSet();
-    private String beanName;
-
-    @Override
-    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
-        context = ((ArtifactoryApplicationContext) applicationContext);
-    }
-
-    @Override
-    public void setBeanName(String name) {
-        beanName = name;
-    }
-
-    @Override
-    public void init() {
-        Collection<LocalNonCacheOverridable> allOverridableIncludingMe = context.beansForType(
-                LocalNonCacheOverridable.class).values();
-        Object thisAsBean = context.getBean(beanName);
-        overridable.addAll(allOverridableIncludingMe.stream().filter(
-                localNonCacheOverridable -> localNonCacheOverridable != thisAsBean).collect(Collectors.toList()));
-        log.debug("Loaded overridable: {}", overridable);
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-
-    }
-
-    @Override
-    public void destroy() {
-
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-
-    }
-
-    @Override
-    public boolean isOverridable(LocalRepo repo, String path) {
-        if (StringUtils.isNotBlank(path)) {
-            for (LocalNonCacheOverridable localOverridable : overridable) {
-                if (localOverridable.isOverridable(repo, path)) {
-                    return true;
-                }
-            }
-        }
-
-        return false;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/local/PathDeletionContext.java b/backend/core/src/main/java/org/artifactory/repo/local/PathDeletionContext.java
deleted file mode 100644
index f21f565..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/local/PathDeletionContext.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package org.artifactory.repo.local;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.repo.StoringRepo;
-
-/**
- * Object containing method params to use in {@link org.artifactory.repo.StoringRepo#shouldProtectPathDeletion(PathDeletionContext)}
- *
- * @author Shay Yaakov
- */
-public class PathDeletionContext {
-
-    private StoringRepo repo;
-    private String path;
-    private BasicStatusHolder status;
-    private boolean assertOverwrite;
-    private String requestSha1;
-    private boolean forceExpiryCheck;
-
-    public PathDeletionContext(StoringRepo repo, String path, BasicStatusHolder status, boolean assertOverwrite,
-            String requestSha1, boolean forceExpiryCheck) {
-        this.repo = repo;
-        this.path = path;
-        this.status = status;
-        this.assertOverwrite = assertOverwrite;
-        this.requestSha1 = requestSha1;
-        this.forceExpiryCheck = forceExpiryCheck;
-    }
-
-    public StoringRepo getRepo() {
-        return repo;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public BasicStatusHolder getStatus() {
-        return status;
-    }
-
-    public boolean isAssertOverwrite() {
-        return assertOverwrite;
-    }
-
-    public String getRequestSha1() {
-        return requestSha1;
-    }
-
-    public boolean isForceExpiryCheck() {
-        return forceExpiryCheck;
-    }
-
-    public static class Builder {
-
-        private StoringRepo repo;
-        private String path;
-        private boolean assertOverwrite;
-        private String requestSha1;
-        private BasicStatusHolder status;
-        private boolean forceExpiryCheck;
-
-        public Builder(StoringRepo repo, String path, BasicStatusHolder status) {
-            this.repo = repo;
-            this.path = path;
-            this.status = status;
-        }
-
-        public Builder(StoringRepo repo, String path) {
-            this.repo = repo;
-            this.path = path;
-            this.status = new BasicStatusHolder();
-        }
-
-        public Builder assertOverwrite(boolean assertOverwrite) {
-            this.assertOverwrite = assertOverwrite;
-            return this;
-        }
-
-        public Builder requestSha1(String requestSha1) {
-            this.requestSha1 = requestSha1;
-            return this;
-        }
-
-        public Builder forceExpiryCheck(boolean forceExpiryCheck) {
-            this.forceExpiryCheck = forceExpiryCheck;
-            return this;
-        }
-
-        public PathDeletionContext build() {
-            return new PathDeletionContext(repo, path, status, assertOverwrite, requestSha1, forceExpiryCheck);
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/local/ValidDeployPathContext.java b/backend/core/src/main/java/org/artifactory/repo/local/ValidDeployPathContext.java
deleted file mode 100644
index 1fbcf9d..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/local/ValidDeployPathContext.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.artifactory.repo.local;
-
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RepoPath;
-
-/**
- * Object containing method params to use in {@link org.artifactory.repo.service.InternalRepositoryService#assertValidDeployPath(ValidDeployPathContext)}
- *
- * @author Shay Yaakov
- */
-public class ValidDeployPathContext {
-
-    private LocalRepo repo;
-    private RepoPath repoPath;
-    private long contentLength;
-    private String requestSha1;
-    private boolean forceExpiryCheck;
-
-    private ValidDeployPathContext(LocalRepo repo, RepoPath repoPath, long contentLength, String requestSha1,
-            boolean forceExpiryCheck) {
-        this.repo = repo;
-        this.repoPath = repoPath;
-        this.contentLength = contentLength;
-        this.requestSha1 = requestSha1;
-        this.forceExpiryCheck = forceExpiryCheck;
-    }
-
-    public LocalRepo getRepo() {
-        return repo;
-    }
-
-    public RepoPath getRepoPath() {
-        return repoPath;
-    }
-
-    public long getContentLength() {
-        return contentLength;
-    }
-
-    public String getRequestSha1() {
-        return requestSha1;
-    }
-
-    public boolean isForceExpiryCheck() {
-        return forceExpiryCheck;
-    }
-
-    public static class Builder {
-
-        private LocalRepo repo;
-        private RepoPath repoPath;
-        private long contentLength;
-        private String requestSha1;
-        private boolean forceExpiryCheck;
-
-        /**
-         * @param repo     The storing repository (cache or local) to deploy to
-         * @param repoPath The repo path for deployment (the repo key is always taken from the repo parameter)
-         */
-        public Builder(LocalRepo repo, RepoPath repoPath) {
-            this.repo = repo;
-            this.repoPath = repoPath;
-        }
-
-        /**
-         * @param contentLength The length in bytes of the resource to deploy
-         */
-        public Builder contentLength(long contentLength) {
-            this.contentLength = contentLength;
-            return this;
-        }
-
-        /**
-         * @param requestSha1 sha1 checksum of the deployed file
-         */
-        public Builder requestSha1(String requestSha1) {
-            this.requestSha1 = requestSha1;
-            return this;
-        }
-
-        /**
-         * @param forceExpiryCheck Force expiry on existed cached resources
-         */
-        public Builder forceExpiryCheck(boolean forceExpiryCheck) {
-            this.forceExpiryCheck = forceExpiryCheck;
-            return this;
-        }
-
-        public ValidDeployPathContext build() {
-            return new ValidDeployPathContext(repo, repoPath, contentLength, requestSha1, forceExpiryCheck);
-        }
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/repo/mbean/ManagedRepository.java b/backend/core/src/main/java/org/artifactory/repo/mbean/ManagedRepository.java
deleted file mode 100644
index d03a70b..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/mbean/ManagedRepository.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.mbean;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.storage.fs.service.FileService;
-
-/**
- * An MBean to expose repository data.
- *
- * @author Yossi Shaul
- */
-public class ManagedRepository implements ManagedRepositoryMBean {
-    private final LocalRepoDescriptor descriptor;
-    private final FileService fileService;
-
-    public ManagedRepository(LocalRepoDescriptor descriptor) {
-        this.descriptor = descriptor;
-        fileService = ContextHelper.get().beanForType(FileService.class);
-    }
-
-    @Override
-    public String getRepositoryKey() {
-        return descriptor.getKey();
-    }
-
-    @Override
-    public long getArtifactsCount() {
-        return fileService.getFilesCount(new RepoPathImpl(descriptor.getKey(), ""));
-    }
-
-    @Override
-    public long getArtifactsTotalSize() {
-        return fileService.getFilesTotalSize(new RepoPathImpl(descriptor.getKey(), ""));
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/mbean/ManagedRepositoryMBean.java b/backend/core/src/main/java/org/artifactory/repo/mbean/ManagedRepositoryMBean.java
deleted file mode 100644
index ef498f4..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/mbean/ManagedRepositoryMBean.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.mbean;
-
-/**
- * An MBean to expose repository data.
- *
- * @author Yossi Shaul
- */
- at SuppressWarnings("UnusedDeclaration")  // mbean
-public interface ManagedRepositoryMBean {
-
-    public String getRepositoryKey();
-
-    public long getArtifactsCount();
-
-    public long getArtifactsTotalSize();
-
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/remote/browse/HtmlRepositoryBrowser.java b/backend/core/src/main/java/org/artifactory/repo/remote/browse/HtmlRepositoryBrowser.java
deleted file mode 100644
index a840ec0..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/remote/browse/HtmlRepositoryBrowser.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- * Based on: /org/apache/ivy/ivy/2.2.0/ivy-2.2.0-sources.jar!/org/apache/ivy/util/url/ApacheURLLister.java
- */
-package org.artifactory.repo.remote.browse;
-
-import com.google.common.collect.Lists;
-import com.google.common.net.InternetDomainName;
-import org.artifactory.common.ConstantValues;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Utility class which helps to list urls under a given url. This has been tested with Apache 1.3.33 server listing, as
- * the one used at ibiblio, and with Apache 2.0.53 server listing, as the one on mirrors.sunsite.dk.
- */
-public class HtmlRepositoryBrowser extends RemoteRepositoryBrowser {
-    private final InternetDomainName bintrayDomain;
-    private static final Logger log = LoggerFactory.getLogger(HtmlRepositoryBrowser.class);
-
-    private static final Pattern PATTERN = Pattern.compile(
-            "<a[^>]*href=[\"|']([^\"']*)[\"|'][^>]*>(?:<[^>]+>)*?([^<>]+?)(?:<[^>]+>)*?</a>",
-            Pattern.CASE_INSENSITIVE);
-
-    public HtmlRepositoryBrowser(HttpExecutor client) {
-        super(client);
-        bintrayDomain = getBintrayDomain();
-    }
-
-    @Override
-    public List<RemoteItem> listContent(String url) throws IOException {
-        String result = getFileListContent(url);
-        return parseHtml(result, url);
-    }
-
-    List<RemoteItem> parseHtml(String htmlText, String url) throws MalformedURLException {
-        List<RemoteItem> items = Lists.newArrayList();
-        Matcher matcher = PATTERN.matcher(htmlText);
-        URL baseUrl = new URL(url);
-        while (matcher.find()) {
-            // get the href text and the displayed text
-            String href = matcher.group(1);
-            String text = matcher.group(2);
-
-            if ((href == null) || (text == null)) {
-                // the groups were not found (shouldn't happen, really)
-                continue;
-            }
-
-            text = text.trim();
-
-            // handle complete URL listings
-            if (href.startsWith("http:") || href.startsWith("https:")) {
-                try {
-                    href = new URL(href).getPath();
-                    if (!href.startsWith(baseUrl.getPath())) {
-                        // ignore URLs which aren't children of the base URL
-                        continue;
-                    }
-                    href = href.substring(baseUrl.getPath().length());
-                } catch (Exception ignore) {
-                    // incorrect URL, ignore
-                    continue;
-                }
-            }
-
-            if (href.startsWith("../")) {
-                // we are only interested in sub-URLs, not parent URLs, so skip this one
-                continue;
-            }
-
-            // absolute href: convert to relative one
-            if (href.startsWith("/")) {
-                int slashIndex = href.substring(0, href.length() - 1).lastIndexOf('/');
-                href = href.substring(slashIndex + 1);
-            }
-
-            // relative to current href: convert to simple relative one
-            if (href.startsWith("./")) {
-                href = href.substring("./".length());
-            }
-
-            if (isBintray(baseUrl.getHost())) {
-                href = new String(text);
-            }
-
-            // exclude those where they do not match
-            // href will never be truncated, text may be truncated by apache
-            if (text.endsWith("..>")) {
-                // text is probably truncated, we can only check if the href starts with text
-                if (!href.startsWith(text.substring(0, text.length() - 3))) {
-                    continue;
-                }
-            } else if (text.endsWith("..>")) {
-                // text is probably truncated, we can only check if the href starts with text
-                if (!href.startsWith(text.substring(0, text.length() - 6))) {
-                    continue;
-                }
-            } else {
-                // text is not truncated, so it must match the url after stripping optional
-                // trailing slashes
-                String strippedHref = href.endsWith("/") ? href.substring(0, href.length() - 1) : href;
-                String strippedText = text.endsWith("/") ? text.substring(0, text.length() - 1) : text;
-                if (!strippedHref.equalsIgnoreCase(strippedText)) {
-                    continue;
-                }
-            }
-
-            boolean directory = href.endsWith("/");
-            String childUrl = baseUrl.toExternalForm();
-            if (!childUrl.endsWith("/")) {
-                childUrl += "/";
-            }
-            childUrl += href;
-            items.add(new RemoteItem(childUrl, directory));
-            log.debug("Found remote item: {}", childUrl);
-        }
-
-        return items;
-    }
-
-    private boolean isBintray(String url) {
-        try {
-            return bintrayDomain.equals(InternetDomainName.from(url).topPrivateDomain());
-        } catch (Exception e) {
-            log.debug("url : " + url + " is not under public domain");
-        }
-        return false;
-    }
-
-    private InternetDomainName getBintrayDomain() {
-        String bintrayHost;
-        try {
-            bintrayHost = new URL(ConstantValues.bintrayUrl.getString()).getHost();
-        } catch (MalformedURLException e) {
-            log.error(String.format("Failed to parse bintray URL '%s' falling back to bintray.com",
-                    ConstantValues.bintrayUrl.getString()));
-            bintrayHost = "bintray.com";
-        }
-        return InternetDomainName.from(bintrayHost);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/remote/browse/HttpExecutor.java b/backend/core/src/main/java/org/artifactory/repo/remote/browse/HttpExecutor.java
deleted file mode 100644
index f0af3f1..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/remote/browse/HttpExecutor.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.remote.browse;
-
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpRequestBase;
-
-import java.io.IOException;
-
-/**
- * Basic single method interface for controlling HttpMethod execution. Needed by HttpRepo to add all used headers for
- * Artifactory communication.
- *
- * @author Fred Simon
- */
-public interface HttpExecutor {
-    CloseableHttpResponse executeMethod(HttpRequestBase method) throws IOException;
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/remote/browse/RemoteRepositoryBrowser.java b/backend/core/src/main/java/org/artifactory/repo/remote/browse/RemoteRepositoryBrowser.java
deleted file mode 100644
index d78f2c0..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/remote/browse/RemoteRepositoryBrowser.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.remote.browse;
-
-import com.google.common.base.Charsets;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.StatusLine;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.util.EntityUtils;
-import org.artifactory.api.storage.StorageUnit;
-import org.artifactory.request.RemoteRequestException;
-import org.artifactory.util.HttpUtils;
-import org.artifactory.util.PathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.List;
-
-/**
- * Abstract class for remote repository browsing.
- *
- * @author Yossi Shaul
- */
-public abstract class RemoteRepositoryBrowser {
-    private static final Logger log = LoggerFactory.getLogger(RemoteRepositoryBrowser.class);
-
-    protected final HttpExecutor client;
-
-    public RemoteRepositoryBrowser(HttpExecutor client) {
-        this.client = client;
-    }
-
-    public abstract List<RemoteItem> listContent(String url) throws IOException;
-
-    protected String getFileListContent(String url) throws IOException {
-        // add trailing slash for relative urls
-        url = forceDirectoryUrl(url);
-        log.debug("Listing remote items: {}", url);
-        HttpGet method = new HttpGet(url);
-        try (CloseableHttpResponse response = client.executeMethod(method)) {
-            assertSizeLimit(url, response);
-
-            StatusLine status = response.getStatusLine();
-            if (status.getStatusCode() != HttpStatus.SC_OK) {
-                String message = "Unable to retrieve " + url + ": "
-                        + status.getStatusCode() + ": " + status.getReasonPhrase();
-                throw new RemoteRequestException(message, status.getStatusCode(), status.getReasonPhrase());
-            }
-            return EntityUtils.toString(response.getEntity(), Charsets.UTF_8);
-        }
-    }
-
-    protected void assertSizeLimit(String urlStr, HttpResponse response) throws IOException {
-        long contentLength = HttpUtils.getContentLength(response);
-        if (contentLength > StorageUnit.MB.toBytes(1)) {
-            throw new IOException("Failed to retrieve directory listing from " + urlStr
-                    + ". Response Content-Length of " + contentLength
-                    + " exceeds max of " + StorageUnit.MB.toBytes(1) + " bytes.");
-        }
-    }
-
-    protected String forceDirectoryUrl(String url) {
-        // add trailing slash we are dealing with directories
-        return PathUtils.addTrailingSlash(url);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/remote/browse/S3RepositoryBrowser.java b/backend/core/src/main/java/org/artifactory/repo/remote/browse/S3RepositoryBrowser.java
deleted file mode 100644
index 3d069a3..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/remote/browse/S3RepositoryBrowser.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.remote.browse;
-
-import com.google.common.base.Charsets;
-import com.google.common.collect.Lists;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.RandomStringUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.Header;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpHead;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.RestCoreAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.repo.HttpRepo;
-import org.artifactory.util.HttpUtils;
-import org.artifactory.util.XmlUtils;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.joda.time.DateTime;
-import org.joda.time.format.ISODateTimeFormat;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.List;
-
-import static org.artifactory.repo.remote.browse.S3RepositorySecuredHelper.getPrefix;
-
-/**
- * Support browsing Amazon S3 repositories.<p/>
- * For more details see: <a href="http://docs.amazonwebservices.com/AmazonS3/latest/API/APIRest.html">Amazon S3 API</a>.
- * <p/>
- * Bucket list API: <a href="http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketGET.html">Bucket List API</a>
- *
- * @author Yossi Shaul
- */
-public class S3RepositoryBrowser extends RemoteRepositoryBrowser {
-    private static final Logger log = LoggerFactory.getLogger(S3RepositoryBrowser.class);
-
-    private static final String ERROR_CODE_NOSUCHKEY = "NoSuchKey";
-    private static final String HEADER_S3_REQUEST_ID = "x-amz-request-id";
-    private static final String INVALID_ARGUMENT = "InvalidArgument";
-    private static final String UNSUPPORTED_AUTHORIZATION_TYPE = "Unsupported Authorization Type";
-
-    private HttpRepo httpRepo;
-
-    /**
-     * The root URL of the S3 repository. This is the bucket url on which list requests should be done.
-     */
-    private String rootUrl;
-
-    /**
-     * Indicates this URL is S3 secured
-     */
-    private boolean secured;
-
-    public S3RepositoryBrowser(HttpExecutor client) {
-        super(client);
-    }
-
-    public S3RepositoryBrowser(HttpExecutor client, HttpRepo httpRepo) {
-        super(client);
-        this.httpRepo = httpRepo;
-    }
-
-    @Override
-    public List<RemoteItem> listContent(String url) throws IOException {
-        if (rootUrl == null) {
-            detectRootUrl(url);
-        }
-        String s3Url = buildS3RequestUrl(url);
-        log.debug("Request url: {} S3 url: {}", url, s3Url);
-        String result = getFileListContent(s3Url);
-        log.debug("S3 result: {}", result);
-        return parseResponse(result);
-    }
-
-    private String buildS3RequestUrl(String url) {
-        url = forceDirectoryUrl(url);
-        if (secured) {
-            String pfx = getPrefix(url);
-            return buildSecuredS3RequestUrl(url, httpRepo, "") + "&prefix=" + pfx + "&delimiter=/";
-        }
-        // the s3 request should always go to the root and add the rest of the path as the prefix parameter.
-        String prefixPath = StringUtils.removeStart(url, rootUrl);
-        StringBuilder sb = new StringBuilder(rootUrl).append("?prefix=").append(prefixPath);
-
-        // we assume a file system structure with '/' as the delimiter
-        sb.append("&").append("delimiter=/");
-        return HttpUtils.encodeQuery(sb.toString());
-    }
-
-    /**
-     * Detects the bucket url (i.e., root url). The given url is assumed to either point to the root or to "directory"
-     * under the root. The most reliable way to get the root is to request non-existing resource and analyze the response.
-     *
-     * @param url URL to S3 repository
-     * @return The root url of the repository (the bucket)
-     */
-    String detectRootUrl(String url) throws IOException {
-        //noinspection RedundantStringConstructorCall
-        String copyUrl = new String(url); //defense
-
-        // force non-directory copyUrl. S3 returns 200 for directory paths
-        url = url.endsWith("/") ? StringUtils.removeEnd(url, "/") : url;
-        // generate a random string to force 404
-        String randomString = RandomStringUtils.randomAlphanumeric(16);
-        url = url + "/" + randomString;
-        HttpGet method = new HttpGet(url);
-        try (CloseableHttpResponse response = client.executeMethod(method)) {
-            // most likely to get 404 if the repository exists
-            assertSizeLimit(url, response);
-            String responseString = IOUtils.toString(
-                    HttpUtils.getResponseBody(response), Charsets.UTF_8.name());
-            log.debug("Detect S3 root url got response code {} with content: {}",
-                    response.getStatusLine().getStatusCode(), responseString);
-            Document doc = XmlUtils.parse(responseString);
-            Element root = doc.getRootElement();
-            String errorCode = root.getChildText("Code", root.getNamespace());
-            if (ERROR_CODE_NOSUCHKEY.equals(errorCode)) {
-                String relativePath = root.getChildText("Key", root.getNamespace());
-                rootUrl = StringUtils.removeEnd(url, relativePath);
-            } else if (INVALID_ARGUMENT.equals(errorCode)) {
-                if (isPro()) {
-                    String message = root.getChildText("Message");
-                    if (UNSUPPORTED_AUTHORIZATION_TYPE.equals(message)) {
-                        rootUrl = detectRootUrlSecured(copyUrl);
-                    }
-                } else {
-                    log.warn("Browsing secured S3 requires Artifactory Pro"); //TODO [mamo] should inform otherwise?
-                }
-            } else {
-                throw new IOException("Couldn't detect S3 root URL. Unknown error code: " + errorCode);
-            }
-        }
-        log.debug("Detected S3 root URL: {}", rootUrl);
-        return rootUrl;
-    }
-
-    private String detectRootUrlSecured(String url) throws IOException {
-        String securedUrl = buildSecuredS3RequestUrl(url, httpRepo, "") +
-                "&prefix=" + getPrefix(url) + "&delimiter=/&max-keys=1";
-        HttpGet method = new HttpGet(securedUrl);
-        try (CloseableHttpResponse response = client.executeMethod(method)) {
-            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
-                String rootUrl = StringUtils.removeEnd(httpRepo.getUrl(), getPrefix(httpRepo.getUrl()));
-                if (!rootUrl.endsWith("/")) {
-                    rootUrl += "/";
-                }
-                secured = true;
-                return rootUrl;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @param url    The URL to check
-     * @param client Http client to use
-     * @return True if the url points to an S3 repository.
-     */
-    public static boolean isS3Repository(String url, CloseableHttpClient client) {
-        HttpHead headMethod = new HttpHead(HttpUtils.encodeQuery(url));
-        try (CloseableHttpResponse response = client.execute(headMethod)) {
-            Header s3RequestId = response.getFirstHeader(HEADER_S3_REQUEST_ID);
-            return s3RequestId != null;
-        } catch (IOException e) {
-            log.debug("Failed detecting S3 repository: " + e.getMessage(), e);
-        }
-        return false;
-    }
-
-    @SuppressWarnings({"unchecked"})
-    private List<RemoteItem> parseResponse(String content) {
-        List<RemoteItem> items = Lists.newArrayList();
-        Document document = XmlUtils.parse(content);
-        Element root = document.getRootElement();
-        Namespace ns = root.getNamespace();
-        String prefix = root.getChildText("Prefix", ns);
-
-        // retrieve folders
-        List<Element> folders = root.getChildren("CommonPrefixes", ns);
-        for (Element folder : folders) {
-            String directoryPath = folder.getChildText("Prefix", ns);
-            String folderName = StringUtils.removeStart(directoryPath, prefix);
-            if (StringUtils.isNotBlank(folderName)) {
-                if (secured) {
-                    directoryPath = StringUtils.removeStart(directoryPath, getPrefix(rootUrl));
-                }
-                items.add(new RemoteItem(rootUrl + directoryPath, true));
-            }
-        }
-
-        // retrieve files
-        List<Element> files = root.getChildren("Contents", ns);
-        for (Element element : files) {
-            String filePath = element.getChildText("Key", ns);
-            String fileName = StringUtils.removeStart(filePath, prefix);
-            if (StringUtils.isNotBlank(fileName) && !folderDirectoryWithSameNameExists(fileName, items)) {
-                // the date format is of the form yyyy-mm-ddThh:mm:ss.timezone, e.g., 2009-02-03T16:45:09.000Z
-                String sizeStr = element.getChildText("Size", ns);
-                long size = sizeStr == null ? 0 : Long.parseLong(sizeStr);
-                String lastModifiedStr = element.getChildText("LastModified", ns);
-                long lastModified =
-                        lastModifiedStr == null ? 0 : ISODateTimeFormat.dateTime().parseMillis(lastModifiedStr);
-                if (secured) {
-                    RemoteItem remoteItem = new RemoteItem(rootUrl + filePath, false, size, lastModified);
-                    String filePath2 = StringUtils.removeStart(filePath, getPrefix(rootUrl));
-                    String url = rootUrl + filePath2;
-                    String securedPath = buildSecuredS3RequestUrl(url, httpRepo, getPrefix(url));
-                    remoteItem.setEffectiveUrl(securedPath);
-                    items.add(remoteItem);
-                } else {
-                    items.add(new RemoteItem(rootUrl + filePath, false, size, lastModified));
-                }
-            }
-        }
-
-        return items;
-    }
-
-    /**
-     * some s3 repositories (e.g., terracotta http://repo.terracotta.org/?delimiter=/&prefix=maven2/) has files and
-     * folders with the same name (for instance file named 'org' and directory named 'org/' under the same directory)
-     * in such a case we prefer the directory and don't return the file
-     */
-    private boolean folderDirectoryWithSameNameExists(String fileName, List<RemoteItem> items) {
-        for (RemoteItem item : items) {
-            if (item.getName().equals(fileName)) {
-                log.debug("Found file with the same name of a directory: {}", item.getUrl());
-                return true;
-            }
-        }
-        return false;
-    }
-
-    protected boolean isPro() {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        RestCoreAddon restCoreAddon = addonsManager.addonByType(RestCoreAddon.class);
-        return !restCoreAddon.isDefault();
-    }
-
-    private String buildSecuredS3RequestUrl(String url, HttpRepo httpRepo, String prefix) {
-        long expiration = new DateTime().plusSeconds((int) httpRepo.getRetrievalCachePeriodSecs()).getMillis();
-        return S3RepositorySecuredHelper.buildSecuredS3RequestUrl(url, prefix, httpRepo, expiration);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/remote/browse/S3RepositorySecuredHelper.java b/backend/core/src/main/java/org/artifactory/repo/remote/browse/S3RepositorySecuredHelper.java
deleted file mode 100644
index f779318..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/remote/browse/S3RepositorySecuredHelper.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.remote.browse;
-
-import org.apache.commons.codec.binary.Base64;
-import org.apache.commons.compress.utils.CharsetNames;
-import org.artifactory.repo.HttpRepo;
-import org.artifactory.security.crypto.CryptoHelper;
-
-import javax.crypto.Mac;
-import javax.crypto.spec.SecretKeySpec;
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-
-/**
- * @author mamo
- */
-public class S3RepositorySecuredHelper {
-
-    public static final String S3_ENDPOINT = "s3.amazonaws.com";
-    private static final String HMAC_SHA1 = "HmacSHA1";
-
-    /**
-     * Builds a secured rest url request for Amazon S3
-     *
-     * @param url        The path to the item, for example https://s3.amazonaws.com/bucket/folder/file.ext
-     * @param prefix     The prefix to the item, for example folder/file.ext
-     * @param httpRepo   The repository assuming to contain the access key/secret key in username/password, respectively
-     * @param expiration The time of expiration for the generated request in millis
-     * @return A secured rest url request
-     * @throws Exception
-     */
-    public static String buildSecuredS3RequestUrl(String url, String prefix, HttpRepo httpRepo,
-            long expiration) {
-        String awsAccessKey = httpRepo.getUsername();
-        String awsSecretKey = CryptoHelper.decryptIfNeeded(httpRepo.getPassword());
-
-        try {
-            String endpoint = S3_ENDPOINT;
-
-            String protocol = url.startsWith("https:") ? "https://" : "http://";
-            String bucketName = getBucketName(url);
-            String hostname = buildBucketHostname(bucketName, endpoint);
-            long expires = expiration / 1000;
-
-            String bucketPath = buildBucketPath(endpoint, hostname);
-            String prefixPath = buildPrefixPath(hostname, bucketName, prefix);
-            String signature = encodeUrl(signWithHmacSha1(awsSecretKey,
-                    "GET\n" +
-                            "\n\n" + //content-type,content-md5
-                            String.valueOf(expires) + "\n" +
-                            "/" + bucketPath + prefixPath
-            ));
-
-            String uriPath = prefixPath +
-                    "?AWSAccessKeyId=" + awsAccessKey +
-                    "&Expires=" + expires +
-                    "&Signature=" + signature;
-
-            return protocol + hostname + "/" + uriPath;
-
-        } catch (Exception e) {
-            throw new RuntimeException("Could not get signed url for " + url + " and bucket " + getBucketName(url), e);
-        }
-    }
-
-    public static String getPrefix(String url) {
-        if (!url.endsWith("/")) {
-            url += "/";
-        }
-        String str = S3_ENDPOINT + "/";
-        int i = url.indexOf(str);
-        String substring = url.substring(i + str.length());
-        int i1 = substring.indexOf("/");
-        if (i1 != -1) {
-            return substring.substring(i1 + 1);
-        } else {
-            return "";
-        }
-    }
-
-    private static String getBucketName(String url) {
-        String endpoint = S3_ENDPOINT;
-        String substring = url.substring(url.indexOf(endpoint) + endpoint.length());
-        if (substring.startsWith("/")) {
-            substring = substring.substring(1);
-        }
-        int i = substring.indexOf("/");
-        return i != -1 ? substring.substring(0, i) : "";
-    }
-
-    private static String buildPrefixPath(String hostname, String bucketName, String prefix) throws Exception {
-        String uriPath = "";
-        String encodedPrefix = encodePath(prefix, "/");
-        if (!S3_ENDPOINT.equals(hostname)) {
-            uriPath = prefix != null ? encodedPrefix : "";
-        } else {
-            uriPath = bucketName + (prefix != null ? "/" + encodedPrefix : "");
-        }
-        return uriPath;
-    }
-
-    private static String buildBucketPath(String endpoint, String hostname) {
-        String path = "";
-        if (!endpoint.equals(hostname)) {
-            int i = hostname.lastIndexOf("." + endpoint);
-            path = i > 0 ? hostname.substring(0, i) + "/" : hostname + "/";
-        }
-        return path;
-    }
-
-    private static String buildBucketHostname(String bucketName, String s3Endpoint) {
-        return bucketName + "." + s3Endpoint;
-    }
-
-    private static String signWithHmacSha1(String awsSecretKey, String canonicalString) throws Exception {
-        try {
-            SecretKeySpec signingKey = new SecretKeySpec(awsSecretKey.getBytes(CharsetNames.UTF_8), HMAC_SHA1);
-            Mac mac = Mac.getInstance(HMAC_SHA1);
-            mac.init(signingKey);
-            byte[] b64 = Base64.encodeBase64(mac.doFinal(canonicalString.getBytes(CharsetNames.UTF_8)));
-            return new String(b64, CharsetNames.UTF_8);
-        } catch (Exception e) {
-            throw new RuntimeException("Could not sign with " + HMAC_SHA1, e);
-        }
-    }
-
-    private static String encodeUrl(String string) {
-        try {
-            return URLEncoder.encode(string, CharsetNames.UTF_8).replace("+", "%20").replace("%40", "@");
-        } catch (UnsupportedEncodingException e) {
-            throw new RuntimeException("Could not encode string " + string, e);
-        }
-    }
-
-    private static String encodePath(String path, String delimiter) throws Exception {
-        StringBuilder sb = new StringBuilder();
-        String split[] = path.split(delimiter);
-        for (int i = 0; i < split.length; i++) {
-            sb.append(encodeUrl(split[i]));
-            if (i < split.length - 1) {
-                sb.append(delimiter);
-            }
-        }
-        return sb.toString();
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/remote/interceptor/RemoteRepoInterceptor.java b/backend/core/src/main/java/org/artifactory/repo/remote/interceptor/RemoteRepoInterceptor.java
deleted file mode 100644
index c26d3ba..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/remote/interceptor/RemoteRepoInterceptor.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.remote.interceptor;
-
-import org.apache.http.client.methods.HttpRequestBase;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.repo.RepoPath;
-
-import java.util.Map;
-
-/**
- * @author Gidi Shabat
- */
-public interface RemoteRepoInterceptor {
-
-    /**
-     * Called just before an attempt to download a resource from remote repository. All the interceptors must return
-     * true in order for the download to proceed.
-     *
-     * @param descriptor     The remote repository descriptor
-     * @param remoteRepoPath Repo path of the remote resource
-     * @return True if downloading the specified resource is allowed
-     */
-    boolean isRemoteDownloadAllowed(RemoteRepoDescriptor descriptor, RepoPath remoteRepoPath);
-
-    /**
-     * Called just before an attempt to list remote repository content. All the interceptors must return
-     * true in order list remote items.
-     *
-     * @param descriptor          The remote repository descriptor
-     * @param remoteDirectoryPath Path of the remote directory
-     * @return True if listing the remote repo is allowed
-     */
-    boolean isRemoteRepoListingAllowed(RemoteRepoDescriptor descriptor, String remoteDirectoryPath);
-
-    /**
-     * Called at the end of a successful remote download
-     */
-    void afterRemoteDownload(RepoResource remoteResource);
-
-    /**
-     * Provides a chance to modify a remote request and it's headers before the execution in
-     * {@link org.artifactory.repo.HttpRepo.retrieveInfo} and
-     * {@link org.artifactory.repo.HttpRepo.downloadResource}
-     *
-     * @param request The request about to be executed
-     * @param headers The request headers
-     */
-    void beforeRemoteHttpMethodExecution(HttpRequestBase request, Map<String, String> headers);
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/replication/LocalReplicationJob.java b/backend/core/src/main/java/org/artifactory/repo/replication/LocalReplicationJob.java
deleted file mode 100644
index 625278c..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/replication/LocalReplicationJob.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.replication;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.replication.LocalReplicationSettings;
-import org.artifactory.addon.replication.ReplicationAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.replication.GlobalReplicationsConfigDescriptor;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.repo.service.ImportJob;
-import org.artifactory.schedule.*;
-import org.artifactory.schedule.quartz.QuartzCommand;
-import org.artifactory.spring.InternalArtifactoryContext;
-import org.artifactory.spring.InternalContextHelper;
-import org.quartz.JobDataMap;
-import org.quartz.JobDetail;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * @author Noam Y. Tenne
- */
- at JobCommand(schedulerUser = TaskUser.SYSTEM, manualUser = TaskUser.CURRENT,
-        keyAttributes = {Task.REPO_KEY, Task.PUSH_REPLICATION_URL},
-        commandsToStop = {
-                @StopCommand(command = ImportJob.class, strategy = StopStrategy.IMPOSSIBLE)
-        }
-)
-public class LocalReplicationJob extends QuartzCommand {
-    private static final Logger log = LoggerFactory.getLogger(LocalReplicationJob.class);
-
-    @Override
-    protected void onExecute(JobExecutionContext callbackContext) throws JobExecutionException {
-        InternalArtifactoryContext context = InternalContextHelper.get();
-        if (!context.isReady()) {
-            log.debug("Skipping execution of '{}', server is not ready yet", LocalReplicationJob.class.getName());
-            return;
-        }
-
-        LocalReplicationDescriptor replication = replicationDescriptorFromJobOrConfig(context, callbackContext);
-        if (replication == null) {
-            log.warn("Unable to execute replication for repo: cannot find replication descriptor.");
-            return;
-        }
-
-        GlobalReplicationsConfigDescriptor replications = context.getCentralConfig().getDescriptor().getReplicationsConfig();
-        if (replications.isBlockPushReplications()) {
-            log.warn("Skipping execution of '{}', push replications are disabled globally", LocalReplicationJob.class.getName());
-            return;
-        }
-
-        LocalReplicationSettings settings = new LocalReplicationSettings(replication);
-
-        SecurityService securityService = context.beanForType(SecurityService.class);
-        try {
-            securityService.authenticateAsSystem();
-            AddonsManager addonsManager = context.beanForType(AddonsManager.class);
-            ReplicationAddon replicationAddon = addonsManager.addonByType(ReplicationAddon.class);
-            replicationAddon.performLocalReplication(settings);
-        } catch (Exception e) {
-            log.error("An error occurred while performing replication for repository '{}': {}",
-                    replication.getRepoKey(), e.getMessage());
-            log.debug("An error occurred while performing replication for repository '{}'.", e);
-        } finally {
-            securityService.nullifyContext();
-        }
-    }
-
-    private LocalReplicationDescriptor replicationDescriptorFromJobOrConfig(InternalArtifactoryContext context,
-            JobExecutionContext callbackContext) {
-        JobDetail jobDetail = callbackContext.getJobDetail();
-        JobDataMap jobDataMap = jobDetail.getJobDataMap();
-        Object manualInvocationDescriptor = jobDataMap.get(ReplicationAddon.TASK_MANUAL_DESCRIPTOR);
-        if (manualInvocationDescriptor != null) {
-            return ((LocalReplicationDescriptor) manualInvocationDescriptor);
-        } else {
-            CentralConfigService centralConfig = context.getCentralConfig();
-            CentralConfigDescriptor centralConfigDescriptor = centralConfig.getDescriptor();
-            return centralConfigDescriptor.getLocalReplication(jobDataMap.getString(Task.REPO_KEY),
-                    jobDataMap.getString(Task.PUSH_REPLICATION_URL));
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/replication/RemoteReplicationJob.java b/backend/core/src/main/java/org/artifactory/repo/replication/RemoteReplicationJob.java
deleted file mode 100644
index 3617a74..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/replication/RemoteReplicationJob.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.replication;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.replication.RemoteReplicationSettingsBuilder;
-import org.artifactory.addon.replication.ReplicationAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.replication.GlobalReplicationsConfigDescriptor;
-import org.artifactory.descriptor.replication.RemoteReplicationDescriptor;
-import org.artifactory.descriptor.repo.HttpRepoDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.cleanup.ArtifactCleanupJob;
-import org.artifactory.repo.service.ImportJob;
-import org.artifactory.schedule.*;
-import org.artifactory.schedule.quartz.QuartzCommand;
-import org.artifactory.spring.InternalArtifactoryContext;
-import org.artifactory.spring.InternalContextHelper;
-import org.quartz.JobDataMap;
-import org.quartz.JobDetail;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * @author Noam Y. Tenne
- */
- at JobCommand(schedulerUser = TaskUser.SYSTEM, manualUser = TaskUser.CURRENT,
-        keyAttributes = {Task.REPO_KEY},
-        commandsToStop = {
-                @StopCommand(command = ImportJob.class, strategy = StopStrategy.IMPOSSIBLE),
-                @StopCommand(command = ArtifactCleanupJob.class, strategy = StopStrategy.STOP)
-        }
-)
-public class RemoteReplicationJob extends QuartzCommand {
-    private static final Logger log = LoggerFactory.getLogger(RemoteReplicationJob.class);
-
-    @Override
-    protected void onExecute(JobExecutionContext callbackContext) throws JobExecutionException {
-        InternalArtifactoryContext context = InternalContextHelper.get();
-        if (!context.isReady()) {
-            log.debug("Skipping execution of '{}', server is not ready yet", RemoteReplicationJob.class.getName());
-            return;
-        }
-
-        RemoteReplicationDescriptor replication = replicationDescriptorFromJobOrConfig(context, callbackContext);
-        if (replication == null) {
-            log.warn("Unable to execute replication for repo: cannot find replication descriptor.");
-            return;
-        }
-
-        GlobalReplicationsConfigDescriptor replications = context.getCentralConfig().getDescriptor().getReplicationsConfig();
-        if (replications.isBlockPullReplications()) {
-            log.warn("Skipping execution of '{}', pull replications are disabled globally", RemoteReplicationJob.class.getName());
-            return;
-        }
-
-        RepoPath repoPath = replication.getRepoPath();
-
-        RemoteReplicationSettingsBuilder settingsBuilder = new RemoteReplicationSettingsBuilder(repoPath)
-                .deleteExisting(replication.isSyncDeletes())
-                .includeProperties(replication.isSyncProperties());
-
-        RemoteRepoDescriptor remoteRepoDescriptor = context.getRepositoryService().remoteRepoDescriptorByKey(
-                repoPath.getRepoKey());
-        if (remoteRepoDescriptor instanceof HttpRepoDescriptor) {
-            HttpRepoDescriptor httpRepoDescriptor = (HttpRepoDescriptor) remoteRepoDescriptor;
-            settingsBuilder.url(httpRepoDescriptor.getUrl()).timeout(httpRepoDescriptor.getSocketTimeoutMillis());
-        } else {
-            log.warn("Unable to execute replication for repo: cannot find remote repo: '{}'.", repoPath.getRepoKey());
-            return;
-        }
-
-        SecurityService securityService = context.beanForType(SecurityService.class);
-        try {
-            securityService.authenticateAsSystem();
-            AddonsManager addonsManager = context.beanForType(AddonsManager.class);
-            ReplicationAddon replicationAddon = addonsManager.addonByType(ReplicationAddon.class);
-            replicationAddon.performRemoteReplication(settingsBuilder.build());
-        } catch (Exception e) {
-            log.error("An error occurred while performing replication for repository '{}': {}",
-                    replication.getRepoKey(), e.getMessage());
-            log.debug("An error occurred while performing replication for repository '{}'.", e);
-        } finally {
-            securityService.nullifyContext();
-        }
-    }
-
-    private RemoteReplicationDescriptor replicationDescriptorFromJobOrConfig(InternalArtifactoryContext context,
-            JobExecutionContext callbackContext) {
-        JobDetail jobDetail = callbackContext.getJobDetail();
-        JobDataMap jobDataMap = jobDetail.getJobDataMap();
-
-        Object manualInvocationDescriptor = jobDataMap.get(ReplicationAddon.TASK_MANUAL_DESCRIPTOR);
-        if (manualInvocationDescriptor != null) {
-            return ((RemoteReplicationDescriptor) manualInvocationDescriptor);
-        } else {
-            CentralConfigService centralConfig = context.getCentralConfig();
-            CentralConfigDescriptor centralConfigDescriptor = centralConfig.getDescriptor();
-            return centralConfigDescriptor.getRemoteReplication(jobDataMap.getString(Task.REPO_KEY));
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/ArchiveContentRetriever.java b/backend/core/src/main/java/org/artifactory/repo/service/ArchiveContentRetriever.java
deleted file mode 100644
index 4a1ee37..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/ArchiveContentRetriever.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.service;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import org.apache.commons.compress.archivers.ArchiveEntry;
-import org.apache.commons.compress.archivers.ArchiveInputStream;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.ArchiveFileContent;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.fs.VfsFile;
-import org.artifactory.util.PathUtils;
-import org.artifactory.util.ZipUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nullable;
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-
-/**
- * Retrieves a text content from an archive.
- *
- * @author Yossi Shaul
- */
-public class ArchiveContentRetriever {
-    private static final Logger log = LoggerFactory.getLogger(ArchiveContentRetriever.class);
-
-    public ArchiveFileContent getArchiveFileContent(LocalRepo repo, RepoPath archivePath, String archiveEntryPath)
-            throws IOException {
-        String content = null;
-        String sourceJarPath = null;
-        List<String> searchList = null;
-        String failureReason = null;
-        ZipInputStream jis = null;
-        String sourceEntryPath = null;
-        try {
-            if (archiveEntryPath.endsWith(".class")) {
-                sourceEntryPath = NamingUtils.javaSourceNameFromClassName(archiveEntryPath);
-                // locate the sources jar and find the source file in it
-                String sourceJarName = PathUtils.stripExtension(archivePath.getName()) + "-sources." +
-                        PathUtils.getExtension(archivePath.getName());
-                String sourcesJarPath = archivePath.getParent().getPath() + "/" + sourceJarName;
-                // search in the sources file first
-                searchList = Lists.newArrayList(sourcesJarPath, archivePath.getPath());
-            } else if (isTextFile(archiveEntryPath)) {
-                // read directly from this archive
-                searchList = Lists.newArrayList(archivePath.getPath());
-                sourceEntryPath = archiveEntryPath;
-            } else {
-                failureReason = "View source for " + archiveEntryPath + " is not supported";
-            }
-
-            if (searchList != null) {
-                boolean found = false;
-                for (int i = 0; i < searchList.size() && !found; i++) {
-                    String sourcesJarPath = searchList.get(i);
-                    log.debug("Looking for {} source in {}", sourceEntryPath, sourceJarPath);
-                    VfsFile sourceFile = repo.getImmutableFile(new RepoPathImpl(repo.getKey(), sourcesJarPath));
-                    if (sourceFile == null) {
-                        failureReason = "Source jar not found.";
-                    } else if (!ContextHelper.get().getAuthorizationService()
-                            .canRead(InternalRepoPathFactory.create(repo.getKey(), sourcesJarPath))) {
-                        failureReason = "No read permissions for the source jar.";
-                    } else {
-                        List<String> alternativeExtensions = null;
-                        if ("java".equalsIgnoreCase(PathUtils.getExtension(sourceEntryPath))) {
-                            alternativeExtensions = Lists.newArrayList("groovy", "fx");
-                        }
-
-                        jis = new ZipInputStream(sourceFile.getStream());
-                        ZipEntry zipEntry = ZipUtils.locateEntry(jis, sourceEntryPath, alternativeExtensions);
-                        if (zipEntry == null) {
-                            failureReason = "Source file not found.";
-                        } else {
-                            found = true;   // source entry was found in the jar
-                            int maxAllowedSize = 1024 * 1024;
-                            if (zipEntry.getSize() > maxAllowedSize) {
-                                failureReason = String.format(
-                                        "Source file is too big to render: file size: %s, max size: %s.",
-                                        zipEntry.getSize(), maxAllowedSize);
-
-                            } else {
-                                // read the current entry (the source entry path)
-                                content = IOUtils.toString(jis, "UTF-8");
-                                sourceEntryPath = zipEntry.getName();
-                                sourceJarPath = sourcesJarPath;
-                            }
-                        }
-                    }
-                }
-            }
-        } finally {
-            IOUtils.closeQuietly(jis);
-        }
-
-        if (content != null) {
-            return new ArchiveFileContent(content, InternalRepoPathFactory.create(repo.getKey(), sourceJarPath),
-                    sourceEntryPath);
-        } else {
-            return ArchiveFileContent.contentNotFound(failureReason);
-        }
-    }
-
-    public ArchiveFileContent getGenericArchiveFileContent(LocalRepo repo, RepoPath archivePath,
-            String archiveEntryPath)
-            throws IOException {
-        String content = null;
-        String sourceJarPath = null;
-        List<String> searchList = null;
-        String failureReason = null;
-        ArchiveInputStream jis = null;
-        String sourceEntryPath = null;
-        try {
-            if (archiveEntryPath.endsWith(".class")) {
-                sourceEntryPath = NamingUtils.javaSourceNameFromClassName(archiveEntryPath);
-                // locate the sources jar and find the source file in it
-                String sourceJarName = PathUtils.stripExtension(archivePath.getName()) + "-sources." +
-                        PathUtils.getExtension(archivePath.getName());
-                String sourcesJarPath = archivePath.getParent().getPath() + "/" + sourceJarName;
-                // search in the sources file first
-                searchList = Lists.newArrayList(sourcesJarPath, archivePath.getPath());
-            } else if (isTextFile(archiveEntryPath)) {
-                // read directly from this archive
-                searchList = Lists.newArrayList(archivePath.getPath());
-                sourceEntryPath = archiveEntryPath;
-            } else {
-                failureReason = "View source for " + archiveEntryPath + " is not supported";
-            }
-
-            if (searchList != null) {
-                boolean found = false;
-                for (int i = 0; i < searchList.size() && !found; i++) {
-                    String sourcesJarPath = searchList.get(i);
-                    log.debug("Looking for {} source in {}", sourceEntryPath, sourceJarPath);
-                    VfsFile sourceFile = repo.getImmutableFile(new RepoPathImpl(repo.getKey(), sourcesJarPath));
-                    if (sourceFile == null) {
-                        failureReason = "Source jar not found.";
-                    } else if (!ContextHelper.get().getAuthorizationService()
-                            .canRead(InternalRepoPathFactory.create(repo.getKey(), sourcesJarPath))) {
-                        failureReason = "No read permissions for the source jar.";
-                    } else {
-                        List<String> alternativeExtensions = null;
-                        if ("java".equalsIgnoreCase(PathUtils.getExtension(sourceEntryPath))) {
-                            alternativeExtensions = Lists.newArrayList("groovy", "fx");
-                        }
-
-                        jis = ZipUtils.getArchiveInputStream(sourceFile);
-                        ArchiveEntry zipEntry = ZipUtils.locateArchiveEntry(jis, sourceEntryPath,
-                                alternativeExtensions);
-                        if (zipEntry == null) {
-                            failureReason = "Source file not found.";
-                        } else {
-                            found = true;   // source entry was found in the jar
-                            int maxAllowedSize = 1024 * 1024;
-                            if (zipEntry.getSize() > maxAllowedSize) {
-                                failureReason = String.format(
-                                        "Source file is too big to render: file size: %s, max size: %s.",
-                                        zipEntry.getSize(), maxAllowedSize);
-
-                            } else {
-                                // read the current entry (the source entry path)
-                                content = IOUtils.toString(jis, "UTF-8");
-                                sourceEntryPath = zipEntry.getName();
-                                sourceJarPath = sourcesJarPath;
-                            }
-                        }
-                    }
-                }
-            }
-        } finally {
-            IOUtils.closeQuietly(jis);
-        }
-
-        if (content != null) {
-            return new ArchiveFileContent(content, InternalRepoPathFactory.create(repo.getKey(), sourceJarPath),
-                    sourceEntryPath);
-        } else {
-            return ArchiveFileContent.contentNotFound(failureReason);
-        }
-    }
-
-    private boolean isTextFile(String fileName) {
-        return NamingUtils.isViewable(fileName) || isLicenseFile(fileName);
-    }
-
-    private boolean isLicenseFile(String fileName) {
-        String licenseFileNames = ConstantValues.archiveLicenseFileNames.getString();
-        Set<String> possibleLicenseFileNames = Sets.newHashSet(
-                Iterables.transform(Sets.newHashSet(StringUtils.split(licenseFileNames, ",")),
-                        new Function<String, String>() {
-                            @Override
-                            public String apply(@Nullable String input) {
-                                return StringUtils.isBlank(input) ? input : StringUtils.trim(input);
-                            }
-                        }
-                )
-        );
-        return possibleLicenseFileNames.contains(PathUtils.getFileName(fileName));
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/ArtifactoryDeployRequest.java b/backend/core/src/main/java/org/artifactory/repo/service/ArtifactoryDeployRequest.java
deleted file mode 100644
index 7c8dc52..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/ArtifactoryDeployRequest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.service;
-
-import org.artifactory.api.request.InternalArtifactoryRequest;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-
-import java.io.InputStream;
-
-/**
- * @author Tomer Cohen
- */
-public class ArtifactoryDeployRequest extends InternalArtifactoryRequest {
-
-    private InputStream inputStream;
-    private int contentLength;
-    private long lastModified;
-    private Properties properties;
-
-    /**
-     * Use {@link ArtifactoryDeployRequestBuilder} to instantiate this object
-     */
-    ArtifactoryDeployRequest(RepoPath pathToUpload, InputStream inputStream, long contentLength,
-            long lastModified, Properties properties) {
-        super(pathToUpload);
-        this.inputStream = inputStream;
-        this.contentLength = (int) contentLength;
-        this.lastModified = lastModified;
-        this.properties = properties != null ? properties : (Properties) InfoFactoryHolder.get().createProperties();
-
-        // When uploading from the UI/REST, trust the server checksums
-        setTrustServerChecksums(true);
-    }
-
-    @Override
-    public InputStream getInputStream() {
-        return inputStream;
-    }
-
-    @Override
-    public long getLastModified() {
-        return lastModified;
-    }
-
-    @Override
-    public long getContentLength() {
-        return contentLength;
-    }
-
-    @Override
-    public Properties getProperties() {
-        return properties;
-    }
-
-    @Override
-    public boolean hasProperties() {
-        return !properties.isEmpty();
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/ArtifactoryDeployRequestBuilder.java b/backend/core/src/main/java/org/artifactory/repo/service/ArtifactoryDeployRequestBuilder.java
deleted file mode 100644
index c65f751..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/ArtifactoryDeployRequestBuilder.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.service;
-
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-
-/**
- * A builder for {@link ArtifactoryDeployRequest}
- *
- * @author Shay Yaakov
- */
-public class ArtifactoryDeployRequestBuilder {
-
-    private RepoPath repoPath;
-    private InputStream inputStream;
-    private int contentLength = -1;
-    private long lastModified = System.currentTimeMillis();
-    private Properties properties;
-
-    public ArtifactoryDeployRequestBuilder(RepoPath repoPath) {
-        this.repoPath = repoPath;
-    }
-
-    /**
-     * The file to be deployed. InputStream, contentLength and lastModified values will get extracted
-     * from the given file and hence shouldn't set separately.
-     */
-    public ArtifactoryDeployRequestBuilder fileToDeploy(File fileToDeploy) throws FileNotFoundException {
-        this.inputStream = new FileInputStream(fileToDeploy);
-        this.contentLength = (int) fileToDeploy.length();
-        this.lastModified = fileToDeploy.lastModified();
-        return this;
-    }
-
-    /**
-     * An input stream to deploy, this field is mandatory.
-     */
-    public ArtifactoryDeployRequestBuilder inputStream(InputStream inputStream) {
-        this.inputStream = inputStream;
-        return this;
-    }
-
-    /**
-     * Optional content length of the deployed artifact, defaults to -1.
-     */
-    public ArtifactoryDeployRequestBuilder contentLength(int contentLength) {
-        this.contentLength = contentLength;
-        return this;
-    }
-
-    /**
-     * Optional last modified value of the deployed artifact, default to system current millis.
-     */
-    public ArtifactoryDeployRequestBuilder lastModified(long lastModified) {
-        this.lastModified = lastModified;
-        return this;
-    }
-
-    /**
-     * Optional properties (usually extracted from matrix params) to attach the deployed artifact.
-     */
-    public ArtifactoryDeployRequestBuilder properties(Properties properties) {
-        this.properties = properties;
-        return this;
-    }
-
-    public ArtifactoryDeployRequest build() {
-        if (repoPath == null) {
-            throw new IllegalArgumentException("Repo path cannot be null");
-        }
-
-        if (inputStream == null) {
-            throw new IllegalArgumentException("Input stream cannot be null");
-        }
-
-        if (properties == null) {
-            properties = (Properties) InfoFactoryHolder.get().createProperties();
-        }
-
-        return new ArtifactoryDeployRequest(repoPath, inputStream, contentLength, lastModified, properties);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/CaseSensitivityRepairServiceImpl.java b/backend/core/src/main/java/org/artifactory/repo/service/CaseSensitivityRepairServiceImpl.java
deleted file mode 100644
index 91e2481..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/CaseSensitivityRepairServiceImpl.java
+++ /dev/null
@@ -1,269 +0,0 @@
-package org.artifactory.repo.service;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Multimap;
-import com.google.common.collect.Multimaps;
-import org.artifactory.api.common.MoveMultiStatusHolder;
-import org.artifactory.api.maven.MavenMetadataService;
-import org.artifactory.api.repo.CaseSensitivityRepairService;
-import org.artifactory.api.rest.artifact.RepairPathConflictsResult;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.Repo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.util.PathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nonnull;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Stack;
-
-import static org.artifactory.api.rest.artifact.RepairPathConflictsResult.PathConflict;
-
-/**
- * @author Yoav Luft
- */
- at Service
-public class CaseSensitivityRepairServiceImpl implements CaseSensitivityRepairService {
-
-    private static final Logger log = LoggerFactory.getLogger(CaseSensitivityRepairServiceImpl.class);
-
-    @Autowired
-    private InternalRepositoryService repositoryService;
-
-    @Autowired
-    private MavenMetadataService mavenMetadataService;
-
-    @Override
-    public RepairPathConflictsResult findPathConflicts(String path) {
-        RepoPath basePath;
-        Repo repo;
-        try {
-            basePath = InternalRepoPathFactory.create(path);
-            repo = repositoryService.getRepoRepoPath(basePath).getRepo();
-        } catch (Exception e) {
-            return new RepairPathConflictsResult("Invalid path: " + path);
-        }
-        if (!repo.isLocal()) {
-            return new RepairPathConflictsResult("Error: Can only repair paths of local repositories");
-        }
-        Stack<ItemInfo> parents = new Stack<>();
-        List<PathConflict> conflictingPaths = Lists.newArrayList();
-        log.info("Looking for path conflicts in {}", basePath);
-        if (repositoryService.exists(basePath)) {
-            findPathConflictsInternal(repositoryService.getItemInfo(basePath), parents, conflictingPaths);
-            return new RepairPathConflictsResult(conflictingPaths, "Completed");
-        } else {
-            log.warn("{} is not a valid path", basePath);
-            return new RepairPathConflictsResult("Invalid path: " + path);
-        }
-    }
-
-    /**
-     * Recursive method for iterating depth first the whole node tree, adding any conflicts to conflictingPaths.
-     * The parents stack is used to identify the real path for each node.
-     * @param currentItem
-     * @param parents
-     * @param conflictingPaths
-     */
-    private void findPathConflictsInternal(ItemInfo currentItem, Stack<ItemInfo> parents,
-            List<PathConflict> conflictingPaths) {
-        log.trace("Recursing into {}", currentItem.getRepoPath());
-        addConflicts(currentItem, parents, conflictingPaths);
-        if (currentItem.isFolder()) {
-            parents.push(currentItem);
-            List<ItemInfo> children = repositoryService.getChildren(currentItem.getRepoPath());
-            findConflictInSiblings(children, conflictingPaths);
-            for (ItemInfo child : children) {
-                findPathConflictsInternal(child, parents, conflictingPaths);
-            }
-            parents.pop();
-        }
-    }
-
-    /**
-     * Determines whether an item is in conflict with the parents stack.
-     * @param itemInfo
-     * @param parents
-     * @return
-     */
-    private void addConflicts(ItemInfo itemInfo, Stack<ItemInfo> parents, List<PathConflict> pathConflicts) {
-        PathConflict conflict = null;
-        for (ItemInfo parent : parents) {
-            if (!itemInfo.getRelPath().startsWith(parent.getRelPath())) {
-                log.debug("Found conflict in {} with it's parent {}", itemInfo.getRepoPath(), parent.getRepoPath());
-                if (conflict == null) {
-                    conflict = new PathConflict(itemInfo.getRepoPath().toPath());
-                    pathConflicts.add(conflict);
-                }
-                conflict.add(parent.getRepoPath().toPath());
-            }
-        }
-    }
-
-    /**
-     * Finds sibling nodes which only differ from each other by their letters case.
-     *
-     * Search is done by ordering the siblings by name in a case insensitive way,
-     * and then scanning for sequences of case insensitive equivalent names.
-     * @param siblings
-     * @param pathConflicts
-     */
-    private void findConflictInSiblings(List<ItemInfo> siblings, List<PathConflict> pathConflicts) {
-        // We are aggregating all itemInfos with a lowercase representative,
-        // creating sets of case-insensitive equivalent names.
-        Multimap<String, ItemInfo> multiMap = Multimaps.index(siblings, new Function<ItemInfo, String>() {
-            @Override
-            public String apply(ItemInfo item) {
-                return item.getName().toLowerCase();
-            }
-        });
-        // For every set which is larger than 1 (Thus has a conflict) we use the first name for the conflict path and
-        // append the other names as conflicting paths
-        for (String key : multiMap.keySet()) {
-            Collection<ItemInfo> itemInfos = multiMap.get(key);
-            if (itemInfos.size() > 1) {
-                PathConflict conflict = null;
-                for (ItemInfo item : itemInfos) {
-                    if (conflict == null) {
-                        conflict = new PathConflict(item.getRepoPath().toPath());
-                    } else {
-                        conflict.add(item.getRepoPath().toPath());
-                    }
-                }
-                pathConflicts.add(conflict);
-            }
-        }
-    }
-
-    @Override
-    public RepairPathConflictsResult fixCaseConflicts(List<PathConflict> conflicts) {
-        RepairPathConflictsResult result = new RepairPathConflictsResult(conflicts, "Successfully repaired paths");
-        if (!canFixOnRepo(conflicts, result)) {
-            return result;
-        }
-        if (conflicts.isEmpty()) {
-            return new RepairPathConflictsResult("No conflicts to repair");
-        }
-        MoveMultiStatusHolder aggregatedStatus = new MoveMultiStatusHolder();
-        // Sorting the list of files repair will put shorter path (that is, higher in hierarchy first. When fixing a
-        // path conflict all the same conflict will be fix in the whole hierarchy, possible saving operations.
-        Collections.sort(conflicts, new Comparator<PathConflict>() {
-            @Override
-            public int compare(PathConflict p1, PathConflict p2) {
-                return p1.getPath().compareToIgnoreCase(p2.getPath());
-            }
-        });
-        for (PathConflict conflict : conflicts) {
-            MoveMultiStatusHolder statusHolder;
-            try {
-                statusHolder = fixParentFileCaseConflict(conflict.getPath());
-            } catch (Exception e) {
-                result.message = "Unexpected exception caught while repairing " + conflict.getPath() + ", aborting.\n" +
-                        "Message: " + e.getMessage();
-                return result;
-            }
-            if (statusHolder.isError()) {
-                log.error("Error repairing path for {}: {}", conflict, statusHolder.getLastError());
-                log.debug("Error repairing path for" + conflict, statusHolder.getException());
-                result.message = "Encountered errors while repairing paths. Please see logs for details";
-            }
-            aggregatedStatus.merge(statusHolder);
-            result.numRepaired++;
-        }
-        // We avoid calculation of maven metadata while fixing the path, so we call for calculation now.
-        for (RepoPath candidate : aggregatedStatus.getCandidatesForMavenMetadataCalculation()) {
-            mavenMetadataService.calculateMavenMetadataAsync(candidate, true);
-        }
-        return result;
-    }
-
-    @Override
-    public List<ItemInfo> getOrphanItems(String path) {
-        RepoPath basePath;
-        Repo repo;
-        try {
-            basePath = InternalRepoPathFactory.create(path);
-            repo = repositoryService.getRepoRepoPath(basePath).getRepo();
-        } catch (Exception e) {
-            log.error("Invalid path: " + path);
-            return Lists.newArrayList();
-        }
-        if (!repo.isLocal()) {
-            log.error("Error: Can only repair paths of local repositories");
-            return Lists.newArrayList();
-        }
-
-        return repositoryService.getOrphanItems(basePath);
-    }
-
-    /**
-     * Returns whether the repository can be repaired. If not, a proper message will be set in the supplied result
-     * @param conflicts
-     * @return
-     */
-    private boolean canFixOnRepo(List<PathConflict> conflicts, @Nonnull RepairPathConflictsResult result) {
-        if (conflicts.isEmpty()) {
-            return true;
-        }
-        RepoPath firstPath = InternalRepoPathFactory.create(conflicts.get(0).getPath());
-        Repo repo = repositoryService.getRepoRepoPath(firstPath).getRepo();
-        if (repo.isCache()) {
-            log.error("Cannot repair paths on cache repositories, please repair the source repository");
-            result.message = "Error: Cannot repair paths on cache repositories, please repair the source repository";
-            return false;
-        }
-        if (repo.isLocal() && !((LocalRepoDescriptor) repo.getDescriptor()).isSuppressPomConsistencyChecks()) {
-            log.error("\"Suppress POM Consistency Checks\" must be checked for repairing paths. " +
-                    "It can be unchecked after paths have been repaired");
-            result.message = "Error: \"Suppress POM Consistency Checks\" must be checked for repairing paths. " +
-                    "It can be unchecked after paths have been repaired";
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * Repairing is done by iterating over the paths parents starting from the nearest ancestors and going to root,
-     * and for each parent we replace the target path's prefix with the parent's true path.
-     * Since every parent has at the least it's correct name (it's last path element) the process will leave us with the
-     * correct path.
-     * @param path
-     * @return
-     */
-    private MoveMultiStatusHolder fixParentFileCaseConflict(String path) {
-        RepoPath repoPath = InternalRepoPathFactory.create(path);
-        RepoPath parent = repoPath;
-        StringBuilder repairedPathBuilder = new StringBuilder(parent.getPath());
-        while ((parent = parent.getParent()) != null) {
-            RepoPath realParent = repositoryService.getItemInfo(parent).getRepoPath();
-            String realParentPath = realParent.getPath();
-            if (!repairedPathBuilder.toString().startsWith(realParentPath)) {
-                log.debug("Fixing path for {} to match parent's path {}", path, realParentPath);
-                repairedPathBuilder.replace(0, realParentPath.length() + 1, realParentPath + "/");
-            }
-        }
-        String repairedPath = PathUtils.formatPath(repairedPathBuilder.toString());
-        String tempSuffix = "_conflictFixTemporaryMarker";
-        // If a parent path has been repaired, this path might have also been repaired and no operation is required
-        if (repairedPath.equals(repositoryService.getItemInfo(repoPath).getRelPath())) {
-            return new MoveMultiStatusHolder();
-        }
-        // Move works by copy & delete process, so we need to move to a temporary location and then move back.
-        repositoryService.moveWithoutMavenMetadata(repoPath, new RepoPathImpl(repoPath.getRepoKey(), repairedPath + tempSuffix),
-                false, true, true);
-        MoveMultiStatusHolder move = repositoryService.moveWithoutMavenMetadata(
-                new RepoPathImpl(repoPath.getRepoKey(), repairedPath + tempSuffix),
-                new RepoPathImpl(repoPath.getRepoKey(), repairedPath), false, true, true);
-        return move;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/DeployServiceImpl.java b/backend/core/src/main/java/org/artifactory/repo/service/DeployServiceImpl.java
deleted file mode 100644
index 2ad446b..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/DeployServiceImpl.java
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.service;
-
-import com.google.common.base.Charsets;
-import com.google.common.collect.Lists;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.io.filefilter.AbstractFileFilter;
-import org.apache.commons.io.filefilter.DirectoryFileFilter;
-import org.apache.commons.io.filefilter.IOFileFilter;
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.time.DurationFormatUtils;
-import org.artifactory.api.artifact.ArtifactInfo;
-import org.artifactory.api.artifact.UnitInfo;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.maven.MavenArtifactInfo;
-import org.artifactory.api.maven.MavenService;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.repo.DeployService;
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.api.request.UploadService;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RealRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-import org.artifactory.md.Properties;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.Repo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.virtual.VirtualRepo;
-import org.artifactory.request.InternalArtifactoryResponse;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.util.GlobalExcludes;
-import org.artifactory.util.PathUtils;
-import org.artifactory.util.ZipUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Provides artifacts deploy services from the UI.
- *
- * @author Yossi Shaul
- */
- at Service
-public class DeployServiceImpl implements DeployService {
-    private static final Logger log = LoggerFactory.getLogger(DeployServiceImpl.class);
-
-    @Autowired
-    private InternalRepositoryService repositoryService;
-
-    @Autowired
-    private UploadService uploadService;
-
-    @Autowired
-    private MavenService mavenService;
-
-    @Override
-    public void deploy(RepoDescriptor targetRepo, UnitInfo artifactInfo, File file, Properties properties)
-            throws RepoRejectException {
-        String pomString = mavenService.getPomModelString(file);
-        deploy(targetRepo, artifactInfo, file, pomString, false, false, properties);
-    }
-
-    @Override
-    public void deploy(RepoDescriptor targetRepo, UnitInfo artifactInfo, File fileToDeploy, String pomString,
-            boolean forceDeployPom, boolean partOfBundleDeploy, Properties properties) throws RepoRejectException {
-        String path = artifactInfo.getPath();
-        if (!artifactInfo.isValid()) {
-            throw new IllegalArgumentException("Invalid unit info for '" + path + "'.");
-        }
-
-        //Sanity check
-        if (targetRepo == null) {
-            throw new IllegalArgumentException("No target repository selected for deployment.");
-        }
-
-        if (targetRepo instanceof VirtualRepoDescriptor) {
-            final VirtualRepo virtualRepo = repositoryService.virtualRepositoryByKey(targetRepo.getKey());
-            if (virtualRepo == null || virtualRepo.getDescriptor().getDefaultDeploymentRepo() == null) {
-                throw new IllegalArgumentException("No target repository found for deployment.");
-            }
-        }
-        else {
-            final LocalRepo localRepo = repositoryService.localRepositoryByKey(targetRepo.getKey());
-            if (localRepo == null) {
-                throw new IllegalArgumentException("No target repository found for deployment.");
-            }
-        }
-
-        RepoPath repoPath = InternalRepoPathFactory.create(targetRepo.getKey(), path);
-
-        // upload the main file
-        try {
-            ArtifactoryDeployRequest request = new ArtifactoryDeployRequestBuilder(repoPath)
-                    .fileToDeploy(fileToDeploy).properties(properties).build();
-            request.setSkipJarIndexing(partOfBundleDeploy);
-            InternalArtifactoryResponse response = new InternalArtifactoryResponse();
-            uploadService.upload(request, response);
-            assertNotFailedRequest(fileToDeploy.getName(), response);
-        } catch (IOException e) {
-            String msg = "Cannot deploy file " + fileToDeploy.getName() + ". Cause: " + e.getMessage();
-            log.debug(msg, e);
-            throw new RepositoryRuntimeException(msg, e);
-        }
-
-        //Handle extra pom deployment - add the metadata with the generated pom file to the artifact
-        if (forceDeployPom && artifactInfo.isMavenArtifact() && StringUtils.isNotBlank(pomString)) {
-            MavenArtifactInfo mavenArtifactInfo = (MavenArtifactInfo) artifactInfo;
-            RepoPath pomPath = InternalRepoPathFactory.create(repoPath.getParent(),
-                    mavenArtifactInfo.getArtifactId() + "-" + mavenArtifactInfo.getVersion() + ".pom");
-            RepoPath uploadPomPath = InternalRepoPathFactory.create(targetRepo.getKey(), pomPath.getPath());
-            try {
-                ArtifactoryDeployRequest pomRequest = new ArtifactoryDeployRequestBuilder(uploadPomPath)
-                        .inputStream(IOUtils.toInputStream(pomString, Charsets.UTF_8.name()))
-                        .contentLength(pomString.getBytes().length)
-                        .lastModified(fileToDeploy.lastModified())
-                        .properties(properties)
-                        .build();
-                InternalArtifactoryResponse pomResponse = new InternalArtifactoryResponse();
-                // upload the POM if needed
-                uploadService.upload(pomRequest, pomResponse);
-                assertNotFailedRequest(fileToDeploy.getName(), pomResponse);
-            } catch (IOException e) {
-                String msg = "Cannot deploy file " + pomPath.getName() + ". Cause: " + e.getMessage();
-                log.debug(msg, e);
-                throw new RepositoryRuntimeException(msg, e);
-            }
-        }
-    }
-
-    private void assertNotFailedRequest(String deployedFileName, InternalArtifactoryResponse response)
-            throws RepoRejectException {
-        if (!response.isSuccessful()) {
-            StringBuilder errorMessageBuilder = new StringBuilder("Cannot deploy file '").append(deployedFileName).
-                    append("'. ");
-            String statusMessage = response.getStatusMessage();
-            if (StringUtils.isNotBlank(statusMessage)) {
-                errorMessageBuilder.append(statusMessage);
-                if (!StringUtils.endsWith(statusMessage, ".")) {
-                    errorMessageBuilder.append(".");
-                }
-            } else {
-                errorMessageBuilder.append("Please view the logs for further information.");
-            }
-            throw new RepoRejectException(errorMessageBuilder.toString());
-        }
-    }
-
-    @Override
-    public void deployBundle(File bundle, RealRepoDescriptor targetRepo, BasicStatusHolder status, boolean failFast) {
-        deployBundle(bundle, targetRepo, status, failFast, "", null);
-    }
-
-    @Override
-    public void deployBundle(File bundle, RealRepoDescriptor targetRepo, final BasicStatusHolder status,
-            boolean failFast, String prefix, Properties properties) {
-        long start = System.currentTimeMillis();
-        if (!bundle.exists()) {
-            String message =
-                    "Specified location '" + bundle + "' does not exist. Deployment aborted.";
-            status.error(message, log);
-            return;
-        }
-        File extractFolder;
-        try {
-            extractFolder = extractArchive(status, bundle);
-        } catch (Exception e) {
-            status.error(e.getLocalizedMessage(), e, log);
-            return;
-        }
-        if (extractFolder == null) {
-            //We have errors
-            return;
-        }
-        try {
-            IOFileFilter deployableFilesFilter = new AbstractFileFilter() {
-                @Override
-                public boolean accept(File file) {
-                    if (NamingUtils.isSystem(file.getAbsolutePath()) || GlobalExcludes.isInGlobalExcludes(file) ||
-                            file.getName().contains(MavenNaming.MAVEN_METADATA_NAME)) {
-                        status.debug("Excluding '" + file.getAbsolutePath() + "' from bundle deployment.", log);
-                        return false;
-                    }
-
-                    return true;
-                }
-            };
-            List<File> archiveContent = Lists.newArrayList(FileUtils.listFiles(
-                    extractFolder, deployableFilesFilter, DirectoryFileFilter.DIRECTORY));
-            Collections.sort(archiveContent);
-
-            Repo repo = repositoryService.repositoryByKey(targetRepo.getKey());
-            for (File file : archiveContent) {
-                String parentPath = extractFolder.getAbsolutePath();
-                String filePath = file.getAbsolutePath();
-                String relPath = PathUtils.trimSlashes(
-                        prefix + "/" + PathUtils.getRelativePath(parentPath, filePath)).toString();
-
-                ModuleInfo moduleInfo = repo.getItemModuleInfo(relPath);
-                if (MavenNaming.isPom(file.getName())) {
-                    try {
-                        mavenService.validatePomFile(file, relPath, moduleInfo,
-                                targetRepo.isSuppressPomConsistencyChecks());
-                    } catch (Exception e) {
-                        String msg = "The pom: " + file.getName() +
-                                " could not be validated, and thus was not deployed.";
-                        status.error(msg, e, log);
-                        if (failFast) {
-                            return;
-                        }
-                        continue;
-                    }
-                }
-
-                try {
-                    getTransactionalMe().deploy(targetRepo, new ArtifactInfo(relPath), file, null, false, true,
-                            properties);
-                } catch (IllegalArgumentException iae) {
-                    status.error(iae.getMessage(), iae, log);
-                    if (failFast) {
-                        return;
-                    }
-                } catch (Exception e) {
-                    // Fail fast
-                    status.error("Error during deployment: " + e.getMessage(), e, log);
-                    if (failFast) {
-                        return;
-                    }
-                }
-            }
-
-            String bundleName = bundle.getName();
-            String timeTaken = DurationFormatUtils.formatPeriod(start, System.currentTimeMillis(), "s");
-            int archiveContentSize = archiveContent.size();
-
-            status.status("Successfully deployed " + archiveContentSize + " artifacts from archive: " + bundleName
-                    + " (" + timeTaken + " seconds).", log);
-        } catch (Exception e) {
-            status.error(e.getMessage(), e, log);
-        } finally {
-            FileUtils.deleteQuietly(extractFolder);
-        }
-    }
-
-    private File extractArchive(BasicStatusHolder status, File archive) throws Exception {
-        String archiveName = archive.getName();
-        String fixedArchiveName = new String(archiveName.getBytes(Charsets.UTF_8.name()), Charsets.UTF_8);
-        File fixedArchive = new File(archive.getParentFile(), fixedArchiveName);
-        try {
-            if (!fixedArchive.exists()) {
-                FileUtils.moveFile(archive, fixedArchive);
-            }
-        } catch (IOException e) {
-            throw new Exception("Could not encode archive name to UTF-8.", e);
-        }
-        File extractFolder = new File(ContextHelper.get().getArtifactoryHome().getTempUploadDir(),
-                fixedArchive.getName() + "_extracted_" + System.currentTimeMillis());
-        if (extractFolder.exists()) {
-            //Clean up any existing folder
-            try {
-                FileUtils.deleteDirectory(extractFolder);
-            } catch (IOException e) {
-                status.error("Could not delete existing extracted archive folder: " +
-                        extractFolder.getAbsolutePath() + ".", e, log);
-                return null;
-            }
-        }
-        try {
-            FileUtils.forceMkdir(extractFolder);
-        } catch (IOException e) {
-            log.error("Could not created the extracted archive folder: " +
-                    extractFolder.getAbsolutePath() + ".", log);
-            return null;
-        }
-
-        try {
-            ZipUtils.extract(fixedArchive, extractFolder);
-        } catch (Exception e) {
-            FileUtils.deleteQuietly(extractFolder);
-            if (e.getMessage() == null) {
-                String errorMessage;
-                if (e instanceof IllegalArgumentException) {
-                    errorMessage =
-                            "Please make sure the textual values in the archive are encoded in UTF-8.";
-                } else {
-                    errorMessage = "Please ensure the integrity of the selected archive";
-                }
-                throw new Exception(errorMessage, e);
-            }
-            throw e;
-        }
-        return extractFolder;
-    }
-
-    private static DeployService getTransactionalMe() {
-        return InternalContextHelper.get().beanForType(DeployService.class);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/ExportJob.java b/backend/core/src/main/java/org/artifactory/repo/service/ExportJob.java
deleted file mode 100644
index 4a9d9f1..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/ExportJob.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.service;
-
-import org.artifactory.api.config.ExportSettingsImpl;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.repo.cleanup.ArtifactCleanupJob;
-import org.artifactory.repo.cleanup.IntegrationCleanupJob;
-import org.artifactory.sapi.common.BaseSettings;
-import org.artifactory.schedule.JobCommand;
-import org.artifactory.schedule.StopCommand;
-import org.artifactory.schedule.StopStrategy;
-import org.artifactory.schedule.Task;
-import org.artifactory.schedule.TaskUser;
-import org.artifactory.schedule.quartz.QuartzCommand;
-import org.artifactory.spring.InternalContextHelper;
-import org.quartz.JobDataMap;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * This job can run on HA-slave machine, so it should only be started manually
- *
- * @author freds
- * @date Nov 6, 2008
- */
- at JobCommand(manualUser = TaskUser.CURRENT,
-        keyAttributes = {Task.REPO_KEY},
-        commandsToStop = {
-                @StopCommand(command = ArtifactCleanupJob.class, strategy = StopStrategy.STOP),
-                @StopCommand(command = IntegrationCleanupJob.class, strategy = StopStrategy.STOP),
-                @StopCommand(command = ImportJob.class, strategy = StopStrategy.IMPOSSIBLE)
-        },
-        runOnlyOnPrimary = false
-)
-public class ExportJob extends QuartzCommand {
-    private static final Logger log = LoggerFactory.getLogger(ExportJob.class);
-
-    @Override
-    protected void onExecute(JobExecutionContext callbackContext) throws JobExecutionException {
-        MutableStatusHolder status = null;
-        try {
-            JobDataMap jobDataMap = callbackContext.getJobDetail().getJobDataMap();
-            String repoKey = (String) jobDataMap.get(Task.REPO_KEY);
-            if (repoKey == null) {
-                throw new IllegalStateException("Cannot export unknown source for " + this);
-            }
-            ExportSettingsImpl settings = (ExportSettingsImpl) jobDataMap.get(ExportSettingsImpl.class.getName());
-            status = settings.getStatusHolder();
-            InternalRepositoryService service =
-                    InternalContextHelper.get().beanForType(InternalRepositoryService.class);
-            if (BaseSettings.FULL_SYSTEM.equals(repoKey)) {
-                service.exportTo(settings);
-            } else {
-                service.exportRepo(repoKey, settings);
-            }
-        } catch (Exception e) {
-            if (status != null) {
-                status.error("Error occurred during export: " + e.getMessage(), e, log);
-            } else {
-                log.error("Error occurred during export", e);
-            }
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/FolderCompactor.java b/backend/core/src/main/java/org/artifactory/repo/service/FolderCompactor.java
deleted file mode 100644
index 7ccbef9..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/FolderCompactor.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.service;
-
-import com.google.common.collect.Lists;
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.storage.fs.service.PropertiesService;
-import org.artifactory.storage.fs.service.WatchesService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * Builds a chain of compactable folders beyond a given one
- *
- * @author Noam Tenne
- */
- at Component
-public class FolderCompactor {
-
-    @Autowired
-    private InternalRepositoryService repositoryService;
-
-    @Autowired
-    private PropertiesService propertiesService;
-
-    @Autowired
-    private WatchesService watchesService;
-
-    /**
-     * Returns A list containing the given folder, and any folder beyond it that can be compacted with it.
-     *
-     * @param folder Folder to check beyond.
-     * @return List of the of folders that can be compacted
-     */
-    public List<FolderInfo> getFolderWithCompactedChildren(FolderInfo folder) {
-        List<FolderInfo> result = Lists.newArrayList();
-        FolderInfo current = folder;
-        while (current != null) {
-            result.add(current);
-            current = getNextCompactedFolder(current);
-        }
-        return result;
-    }
-
-    /**
-     * Returns the next folder that can be compacted after the given one.
-     *
-     * @param folder Folder to check beyond.
-     * @return FolderInfo if another folder to compact is found. Null if no folder is found.
-     */
-    private FolderInfo getNextCompactedFolder(FolderInfo folder) {
-        RepoPath repoPath = folder.getRepoPath();
-
-        // don't compact if folder has properties or watches to allow users to view them
-        if (propertiesService.hasProperties(repoPath) || watchesService.hasWatches(repoPath)) {
-            return null;
-        }
-
-        List<ItemInfo> children = repositoryService.getChildren(repoPath);
-
-        //If we have no children or more than 1 children stop here
-        if (children.size() != 1) {
-            return null;
-        }
-
-        //If we have 1 child stop at it if it's a folder
-        ItemInfo theOneChild = children.get(0);
-        if (theOneChild.isFolder()) {
-            return (FolderInfo) theOneChild;
-        }
-
-        return null;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/ImportHandlerCallablesFactory.java b/backend/core/src/main/java/org/artifactory/repo/service/ImportHandlerCallablesFactory.java
deleted file mode 100644
index a3a482d..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/ImportHandlerCallablesFactory.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.service;
-
-import org.artifactory.api.config.ImportSettingsImpl;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.db.importexport.DbRepoImportHandler;
-import org.artifactory.sapi.common.ImportSettings;
-
-import javax.annotation.Nonnull;
-import java.io.File;
-import java.util.concurrent.Callable;
-import java.util.concurrent.Semaphore;
-
-/**
- * @author Yoav Luft
- */
-public class ImportHandlerCallablesFactory {
-
-    private final Semaphore externalSynchronization;
-    private InternalRepositoryService repositoryService;
-    private ImportSettings baseImportSettings;
-    private String parentTaskToken;
-
-    public ImportHandlerCallablesFactory(Semaphore importsParallelGate, String parentTaskToken) {
-        repositoryService = ContextHelper.get().beanForType(InternalRepositoryService.class);
-        this.externalSynchronization = importsParallelGate;
-        this.parentTaskToken = parentTaskToken;
-    }
-
-    @Nonnull
-    public Callable<DbRepoImportHandler> create(@Nonnull String repoKey, @Nonnull File repoRoot) {
-        final ImportSettingsImpl repoSettings = new ImportSettingsImpl(repoRoot, this.baseImportSettings);
-        final LocalRepo localRepo = repositoryService.getLocalRepository(InternalRepoPathFactory.repoRootPath(repoKey));
-        return new Callable<DbRepoImportHandler>() {
-            @Override
-            public DbRepoImportHandler call() throws Exception {
-                try {
-                    DbRepoImportHandler importHandler = new DbRepoImportHandler(localRepo, repoSettings,
-                            parentTaskToken);
-                    importHandler.executeImport();
-                    return importHandler;
-                } finally {
-                    if (externalSynchronization != null) {
-                        externalSynchronization.release();
-                    }
-                }
-            }
-        };
-    }
-
-    public void setBaseImportSettings(ImportSettings baseImportSettings) {
-        this.baseImportSettings = baseImportSettings;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/ImportJob.java b/backend/core/src/main/java/org/artifactory/repo/service/ImportJob.java
deleted file mode 100644
index b7f48a9..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/ImportJob.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.service;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Collections2;
-import org.apache.commons.io.filefilter.DirectoryFileFilter;
-import org.artifactory.api.config.RepositoryImportSettingsImpl;
-import org.artifactory.backup.BackupJob;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.maven.index.MavenIndexerJob;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.cleanup.ArtifactCleanupJob;
-import org.artifactory.repo.cleanup.IntegrationCleanupJob;
-import org.artifactory.repo.db.importexport.DbRepoImportHandler;
-import org.artifactory.repo.replication.LocalReplicationJob;
-import org.artifactory.repo.replication.RemoteReplicationJob;
-import org.artifactory.schedule.*;
-import org.artifactory.schedule.quartz.QuartzCommand;
-import org.artifactory.search.archive.ArchiveIndexerImpl;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.storage.binstore.service.BinaryStoreGarbageCollectorJob;
-import org.quartz.JobDataMap;
-import org.quartz.JobExecutionContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.core.task.AsyncTaskExecutor;
-
-import javax.annotation.Nullable;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.util.*;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.Semaphore;
-
-import static org.artifactory.schedule.StopStrategy.STOP;
-
-/**
- * This job triggers the actual import process of either single or multiple repositories.
- *
- * @author freds
- * @author Yoav Luft
- */
- at JobCommand(
-        description = "Import Repositories",
-        manualUser = TaskUser.CURRENT,
-        keyAttributes = {Task.REPO_KEY},
-        commandsToStop = {
-                @StopCommand(command = BinaryStoreGarbageCollectorJob.class, strategy = StopStrategy.IMPOSSIBLE),
-                @StopCommand(command = ExportJob.class, strategy = StopStrategy.IMPOSSIBLE),
-                @StopCommand(command = BackupJob.class, strategy = StopStrategy.IMPOSSIBLE),
-                @StopCommand(command = MavenIndexerJob.class, strategy = StopStrategy.STOP),
-                @StopCommand(command = ArtifactCleanupJob.class, strategy = StopStrategy.STOP),
-                @StopCommand(command = IntegrationCleanupJob.class, strategy = StopStrategy.STOP),
-                @StopCommand(command = LocalReplicationJob.class, strategy = StopStrategy.STOP),
-                @StopCommand(command = RemoteReplicationJob.class, strategy = StopStrategy.STOP),
-                @StopCommand(command = ArchiveIndexerImpl.ArchiveIndexJob.class, strategy = STOP)},
-        runOnlyOnPrimary = false)
-public class ImportJob extends QuartzCommand {
-    private static final Logger log = LoggerFactory.getLogger(ImportJob.class);
-
-    private RepositoryImportSettingsImpl importSettings;
-    private MutableStatusHolder statusHolder;
-    private InternalRepositoryService repositoryService;
-    private ImportHandlerCallablesFactory callablesFactory;
-    private final Semaphore parallelImportsGate;
-    private AsyncTaskExecutor taskExecutor;
-
-    public ImportJob() {
-        int maxParallelImports = Math.max(ConstantValues.importMaxParallelRepos.getInt(), 1);
-        parallelImportsGate = new Semaphore(maxParallelImports);
-        callablesFactory = new ImportHandlerCallablesFactory(parallelImportsGate, TaskCallback.currentTaskToken());
-        taskExecutor = new CachedThreadPoolTaskExecutor();
-        repositoryService = InternalContextHelper.get().beanForType(InternalRepositoryService.class);
-    }
-
-    /**
-     * Constructor for use by tests
-     */
-    ImportJob(AsyncTaskExecutor executor, ImportHandlerCallablesFactory callablesFactory, Semaphore gate,
-            InternalRepositoryService repositoryService) {
-        parallelImportsGate = gate;
-        this.callablesFactory = callablesFactory;
-        this.taskExecutor = executor;
-        this.repositoryService = repositoryService;
-    }
-
-    @Override
-    protected void onExecute(JobExecutionContext callbackContext) {
-        try {
-            initializeFromContext(callbackContext);
-            deleteRepositories();
-            List<Callable<DbRepoImportHandler>> importers = prepareImportHandlerCallables();
-            List<Future<DbRepoImportHandler>> handlerFutures = new ArrayList<>(importers.size());
-            for (Callable<DbRepoImportHandler> importer : importers) {
-                // we acquire an import permit here and each importer is responsible to release it when it ends
-                parallelImportsGate.acquire();
-                handlerFutures.add(taskExecutor.submit(importer));
-            }
-            log.debug("All import threads were submitted");
-            for (Future<DbRepoImportHandler> handlerFuture : handlerFutures) {
-                // serially call finalize for each repo which will trigger another retry phase if required
-                // this has to be serial to avoid further concurrent import conflicts
-                finalizeImport(handlerFuture);
-            }
-            log.info("Import of {} repositories completed", importSettings.getRepositories().size());
-            checkForUnusedSubdirectories();
-        } catch (Exception e) {
-            if (statusHolder != null) {
-                statusHolder.error("Error occurred during import: " + e.getMessage(), e, log);
-            } else {
-                log.error("Error occurred during import", e);
-            }
-        }
-    }
-
-    private void finalizeImport(Future<DbRepoImportHandler> handlerFuture) {
-        try {
-            DbRepoImportHandler importHandler = handlerFuture.get();
-            importHandler.finalizeImport();
-        } catch (InterruptedException e) {
-            log.info("Import was interrupted");
-        } catch (ExecutionException e) {
-            Throwable cause = e.getCause();
-            log.error("Import had failed due to {}: {}", cause.getClass().getName(), cause.getMessage());
-            log.debug("Import had failed due to {}: {}",
-                    cause.getClass().getName(), cause.getMessage(), cause);
-            if (statusHolder != null) {
-                statusHolder.error("Error occurred during import: " + cause.getMessage(), cause, log);
-            }
-        } catch (RuntimeException e) {
-            // Extract cause
-            if (statusHolder != null) {
-                statusHolder.error("Error occurred during import: " + e.getMessage(), e, log);
-            } else {
-                log.error("Error occurred during import", e);
-            }
-        }
-    }
-
-    private List<Callable<DbRepoImportHandler>> prepareImportHandlerCallables() {
-        List<String> repoKeysToImport = importSettings.getRepositories();
-        List<Callable<DbRepoImportHandler>> importers = new ArrayList<>(repoKeysToImport.size());
-        for (String repoKey : repoKeysToImport) {
-            try {
-                Callable<DbRepoImportHandler> handlerCallable = createHandlerCallable(repoKey);
-                importers.add(handlerCallable);
-            } catch (FileNotFoundException e) {
-                if (importSettings.isFailIfEmpty()) {
-                    throw new RuntimeException(e);
-                } else {
-                    statusHolder.warn(e.getMessage(), log);
-                }
-            }
-        }
-        return importers;
-    }
-
-    private Callable<DbRepoImportHandler> createHandlerCallable(String repoKey) throws FileNotFoundException {
-        File repoRoot;
-        if (importSettings.isSingleRepoImport()) {
-            repoRoot = importSettings.getBaseDir();
-        } else {
-            // base dir is the root repositories dir (e.g., the specific repo is under 'repositories/repoKey')
-            repoRoot = getRepoRootDir(repoKey, importSettings.getBaseDir());
-        }
-        return callablesFactory.create(repoKey, repoRoot);
-    }
-
-    private void deleteRepositories() {
-        for (String repoKey : importSettings.getRepositoriesToDelete()) {
-            deleteExistingRepository(repoKey);
-        }
-    }
-
-    private void deleteExistingRepository(String repoKey) {
-        statusHolder.status("Fully removing repository '" + repoKey + "'.", log);
-        RepoPath deleteRepoPath = InternalRepoPathFactory.repoRootPath(repoKey);
-        try {
-            repositoryService.undeploy(deleteRepoPath);
-        } catch (Exception e) {
-            log.error(e.getMessage(), e);
-        }
-        statusHolder.status("Repository '" + repoKey + "' fully deleted.", log);
-    }
-
-    private void initializeFromContext(JobExecutionContext callbackContext) {
-        JobDataMap jobDataMap = callbackContext.getJobDetail().getJobDataMap();
-        importSettings = (RepositoryImportSettingsImpl) jobDataMap.get(RepositoryImportSettingsImpl.class.getName());
-        callablesFactory.setBaseImportSettings(importSettings);
-        statusHolder = importSettings.getStatusHolder();
-    }
-
-    private void checkForUnusedSubdirectories() {
-        if (importSettings.isSingleRepoImport()) {
-            return;
-        }
-        Collection<String> directoryNames = collectSubdirectoriesNames();
-        if (importSettings.isFailIfEmpty()
-                && Collections.disjoint(importSettings.getRepositories(), directoryNames)) {
-            statusHolder.error("The selected directory did not contain any repositories.", log);
-        } else {
-            for (String subDir : directoryNames) {
-                boolean isMetadata = subDir.contains("metadata");
-                boolean isIndex = subDir.contains("index");
-                if (!isMetadata && !isIndex && !importSettings.getRepositories().contains(subDir)) {
-                    statusHolder.warn("The directory " + subDir + " does not match any repository key.", log);
-                }
-            }
-        }
-    }
-
-    private Collection<String> collectSubdirectoriesNames() {
-        File[] subDirectories = importSettings.getBaseDir().listFiles(
-                (java.io.FileFilter) DirectoryFileFilter.DIRECTORY);
-        return Collections2.transform(Arrays.asList(subDirectories), new Function<File, String>() {
-            @Nullable
-            @Override
-            public String apply(File file) {
-                return file.getName();
-            }
-        });
-    }
-
-    private File getRepoRootDir(String repoKey, File baseDir) throws FileNotFoundException {
-        File repoBaseDir = new File(baseDir, repoKey);
-        if (repoBaseDir.canRead() && repoBaseDir.isDirectory()) {
-            return repoBaseDir;
-        }
-        throw new FileNotFoundException("No directory for repository " + repoKey + " found at " + baseDir);
-    }
-
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/InternalRepositoryService.java b/backend/core/src/main/java/org/artifactory/repo/service/InternalRepositoryService.java
deleted file mode 100644
index cf328d9..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/InternalRepositoryService.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.service;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.common.MoveMultiStatusHolder;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.repo.*;
-import org.artifactory.repo.local.ValidDeployPathContext;
-import org.artifactory.repo.virtual.VirtualRepo;
-import org.artifactory.request.InternalRequestContext;
-import org.artifactory.resource.ResourceStreamHandle;
-import org.artifactory.sapi.common.ExportSettings;
-import org.artifactory.sapi.common.Lock;
-import org.artifactory.spring.ContextReadinessListener;
-import org.artifactory.spring.ReloadableBean;
-import org.artifactory.storage.fs.service.ItemMetaInfo;
-import org.springframework.transaction.annotation.Transactional;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.List;
-
-/**
- * A repository service to be used by the core
- * <p/>
- * User: freds Date: Jul 31, 2008 Time: 5:50:18 PM
- */
-public interface InternalRepositoryService extends RepositoryService, ReloadableBean, ContextReadinessListener {
-
-    boolean isAnonAccessEnabled();
-
-    /**
-     * @param key The repository key
-     * @return Repository with the exact given key (no special meaning for remote/cache repo keys). Null if not found.
-     */
-    @Nullable
-    Repo repositoryByKey(String key);
-
-    @Nullable
-    VirtualRepo virtualRepositoryByKey(String key);
-
-    @Nullable
-    LocalRepo localOrCachedRepositoryByKey(String key);
-
-    /**
-     * Get the holder object that holds the actual repository as well as the path.
-     *
-     * @param repoPath The repo path
-     * @param <R>      The type of repository.
-     * @return The holder object that holds the actual repository as well as the path.
-     */
-    <R extends Repo> RepoRepoPath<R> getRepoRepoPath(RepoPath repoPath);
-
-    /**
-     * Get a repository that can store artifacts. Will get either a local repo (regular or cache) or a virtual repo. If
-     * remote repository key is given, the cache repository is returned.
-     */
-    StoringRepo storingRepositoryByKey(String key);
-
-    List<RealRepo> getLocalAndRemoteRepositories();
-
-    List<VirtualRepo> getVirtualRepositories();
-
-    List<LocalRepo> getLocalAndCachedRepositories();
-
-    /**
-     * Returns a local non-cache repository by key
-     *
-     * @param key The repository key
-     * @return Local non-cache repository or null if not found
-     */
-    LocalRepo localRepositoryByKey(String key);
-
-    RemoteRepo remoteRepositoryByKey(String key);
-
-    DistributionRepo distributionRepoByKey(String key);
-
-    /**
-     * This will verify the permission to deploy to the path
-     *
-     * @param validDeployPathContext Context for encapsulating all the methods parameters
-     * @return A status holder with info on error
-     */
-    void assertValidDeployPath(ValidDeployPathContext validDeployPathContext) throws RepoRejectException;
-
-    <T extends RemoteRepoDescriptor> ResourceStreamHandle downloadAndSave(InternalRequestContext requestContext,
-            RemoteRepo<T> remoteRepo, RepoResource res) throws IOException, RepoRejectException;
-
-    @Lock
-    RepoResource unexpireIfExists(LocalRepo localCacheRepo, String path);
-
-    @Lock
-    ResourceStreamHandle unexpireAndRetrieveIfExists(InternalRequestContext requestContext, LocalRepo localCacheRepo,
-            String path) throws IOException, RepoRejectException;
-
-    ResourceStreamHandle getResourceStreamHandle(InternalRequestContext requestContext, Repo repo, RepoResource res)
-            throws IOException, RepoRejectException;
-
-    /**
-     * Saves the given resource in the input repository.
-     *
-     * @param repo        The repo to save the resource in. Must be a storage repo (local/local cache/virtual cache)
-     * @param saveContext Resource details
-     * @return Repository resource with details of the saved resource
-     * @throws IOException         On any IO related exception
-     * @throws RepoRejectException If the target repository rejected the resource
-     */
-    RepoResource saveResource(StoringRepo repo, SaveResourceContext saveContext)
-            throws IOException, RepoRejectException;
-
-    /**
-     * Internal, transactional method to save a resource. Don't use directly.
-     *
-     * @see InternalRepositoryService#saveResource(org.artifactory.repo.StoringRepo, org.artifactory.repo.SaveResourceContext)
-     */
-    @Transactional
-    RepoResource saveResourceInTransaction(StoringRepo repo, SaveResourceContext saveContext)
-            throws IOException, RepoRejectException;
-
-    @Override
-    void exportTo(ExportSettings settings);
-
-    boolean isRepoExistInCache(RepoPath repoPath);
-
-    /**
-     * Returns a local or local cache repository. Throws an exception if not found
-     *
-     * @param repoPath A repo path in the repository
-     * @return Local/cache repository matching the repo path repo key
-     * @throws IllegalArgumentException if repository not found
-     */
-    @Nonnull
-    LocalRepo getLocalRepository(RepoPath repoPath);
-
-    @Override
-    @Lock
-    void reload(CentralConfigDescriptor oldDescriptor);
-
-    /**
-     * A convenient method for saving internally generated files to the repositories.
-     *
-     * @param fileRepoPath Repository path to store the input stream
-     * @param is           The input stream to store. Will be closed before returning from this method
-     * @see InternalRepositoryService#saveResource(org.artifactory.repo.StoringRepo, org.artifactory.repo.SaveResourceContext)
-     */
-    void saveFileInternal(RepoPath fileRepoPath, InputStream is) throws RepoRejectException, IOException;
-
-    /**
-     * @param repoPath The repo path of an item.
-     * @return The meta info of the given repo path. Null if not found.
-     */
-    @Nullable
-    ItemMetaInfo getItemMetaInfo(RepoPath repoPath);
-
-    /**
-     * Moves repository path (pointing to a folder) to another absolute target. The move will only move paths the user
-     * has permissions to move and paths that are accepted by the target repository.
-     *
-     * @param from            The source path to move.
-     * @param to              The target path to move to.
-     * @param dryRun          If true the method will just report the expected result but will not move any file
-     * @param suppressLayouts If true, path translation across different layouts should be suppressed.
-     * @param failFast        If true, the operation should fail upon encountering an error.
-     * @return MoveMultiStatusHolder holding the errors and warnings
-     */
-    @Lock
-    MoveMultiStatusHolder moveWithoutMavenMetadata(RepoPath from, RepoPath to, boolean dryRun, boolean suppressLayouts,
-            boolean failFast);
-
-    /**
-     * Sets the client checksum on the target file. Fails if the target doesn't exist or not a file.
-     *
-     * @param repo               The repository holding the file
-     * @param checksumType       The {@link org.artifactory.checksum.ChecksumType}
-     * @param targetFileRepoPath Target file
-     * @param checksum           Checksum value
-     * @return Checksum info for the given type
-     */
-    @Lock
-    ChecksumInfo setClientChecksum(LocalRepo repo, ChecksumType checksumType, RepoPath targetFileRepoPath,
-            String checksum);
-
-    /**
-     * Undeploy (deletes) the given path in a transaction.
-     *
-     * @param repoPath          The path to delete
-     * @param calcMavenMetadata
-     * @param statusHolder
-     * @return
-     */
-    @Lock
-    BasicStatusHolder undeployInTx(RepoPath repoPath, boolean calcMavenMetadata, BasicStatusHolder statusHolder);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/RepositoryBrowsingServiceImpl.java b/backend/core/src/main/java/org/artifactory/repo/service/RepositoryBrowsingServiceImpl.java
deleted file mode 100644
index 19f865f..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/RepositoryBrowsingServiceImpl.java
+++ /dev/null
@@ -1,779 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.service;
-
-import com.google.common.base.Charsets;
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.collect.*;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.repo.*;
-import org.artifactory.api.repo.exception.FolderExpectedException;
-import org.artifactory.api.repo.exception.ItemNotFoundRuntimeException;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.checksum.ChecksumsInfo;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.repo.*;
-import org.artifactory.repo.remote.browse.RemoteItem;
-import org.artifactory.repo.virtual.VirtualRepo;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-import org.artifactory.storage.fs.service.PropertiesService;
-import org.artifactory.storage.fs.tree.ItemNode;
-import org.artifactory.storage.fs.tree.ItemTree;
-import org.artifactory.storage.fs.tree.TreeBrowsingCriteriaBuilder;
-import org.artifactory.util.PathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.*;
-
-/**
- * @author Tomer Cohen
- */
- at Service
-public class RepositoryBrowsingServiceImpl implements RepositoryBrowsingService {
-    private static final Logger log = LoggerFactory.getLogger(RepositoryBrowsingServiceImpl.class);
-
-    @Autowired
-    private AuthorizationService authService;
-
-    @Autowired
-    private InternalRepositoryService repoService;
-
-    @Autowired
-    private PropertiesService propertiesService;
-
-    @Override
-    public BrowsableItem getLocalRepoBrowsableItem(RepoPath repoPath) {
-        ItemInfo itemInfo = getItemInfo(repoPath);
-        return (itemInfo != null) ? BrowsableItem.getItem(itemInfo) : null;
-    }
-
-    @Override
-    public VirtualBrowsableItem getVirtualRepoBrowsableItem(RepoPath repoPath) {
-        log.debug("getting new Virtual Repo '{}' Browsable Item", repoPath.getRepoKey());
-
-        VirtualRepoItem virtualRepoItem = getVirtualRepoItem(repoPath);
-        if (virtualRepoItem != null) {
-            ItemInfo itemInfo = virtualRepoItem.getItemInfo();
-
-            log.debug("new Virtual Repo Browsable Item ,name:'{}',created:'{}',lastModified:'{}',size:'{}', ",
-                    itemInfo.getName(), itemInfo.getCreated(),
-                    itemInfo.getLastModified(), itemInfo.isFolder() ? -1 : ((FileInfo) itemInfo).getSize());
-
-            return new VirtualBrowsableItem(itemInfo.getName(), itemInfo.isFolder(), itemInfo.getCreated(),
-                    itemInfo.getLastModified(), itemInfo.isFolder() ? -1 : ((FileInfo) itemInfo).getSize(),
-                    repoPath, virtualRepoItem.getRepoKeys());
-        } else {
-            return null;
-        }
-    }
-
-    private ItemInfo getItemInfo(RepoPath repoPath) {
-        LocalRepo repo = repoService.localOrCachedRepositoryByKey(repoPath.getRepoKey());
-        if (repo == null) {
-            log.trace("No local or cache repo found:'{}'", repoPath.getRepoKey());
-            throw new IllegalArgumentException("No local or cache repo found: " + repoPath.getRepoKey());
-        }
-
-        if (repo.isBlackedOut()) {
-            return null;
-        }
-
-        return repoService.getItemInfo(repoPath);
-    }
-
-    @Override
-    @Nonnull
-    public List<BaseBrowsableItem> getLocalRepoBrowsableChildren(BrowsableItemCriteria criteria) {
-        return getLocalRepoBrowsableChildrenData(criteria, false, null);
-    }
-
-    @Nullable
-    @Override
-    public List<BaseBrowsableItem> getLocalRepoBrowsableChildren(@Nonnull BrowsableItemCriteria criteria,
-            boolean updateRootNodesFilterFlag, RootNodesFilterResult browsableItemAccept) {
-        return getLocalRepoBrowsableChildrenData(criteria, updateRootNodesFilterFlag, browsableItemAccept);
-    }
-
-    private List<BaseBrowsableItem> getLocalRepoBrowsableChildrenData(BrowsableItemCriteria criteria,
-            boolean updateRootNodesFilterFlag,RootNodesFilterResult browsableItemAccept) {
-        RepoPath repoPath = criteria.getRepoPath();
-        LocalRepo repo = repoService.localOrCachedRepositoryByKey(repoPath.getRepoKey());
-        if (repo == null) {
-            log.trace("No local or cache repo found:'{}'", repoPath.getRepoKey());
-            throw new IllegalArgumentException("No local or cache repo found: " + repoPath.getRepoKey());
-        }
-
-        if (repo.isBlackedOut() || !repo.accepts(repoPath)) {
-            return Lists.newArrayListWithCapacity(0);
-        }
-
-        ItemTree tree = new ItemTree(criteria.getRepoPath(), new TreeBrowsingCriteriaBuilder()
-                .applyRepoIncludeExclude().applySecurity().cacheChildren(false).build());
-        ItemNode rootNode = tree.getRootNode();
-        if (rootNode == null) {
-            log.trace("No local or cache repo found:'{}'", repoPath.getRepoKey());
-            throw new ItemNotFoundRuntimeException(repoPath);
-        }
-        if (!rootNode.isFolder()) {
-            log.trace("repo '{}' root node is not folder", repoPath.getRepoKey());
-            throw new FolderExpectedException(repoPath);
-        }
-        List<ItemNode> children = getRootNodeChildren(updateRootNodesFilterFlag,browsableItemAccept,rootNode);
-        if (children.isEmpty()) {
-            return Lists.newArrayListWithCapacity(0);
-        }
-
-        List<BaseBrowsableItem> repoPathChildren = Lists.newArrayList();
-        for (ItemNode child : children) {
-            //Check if we should return the child
-            ItemInfo childItemInfo = child.getItemInfo();
-            BrowsableItem browsableItem = BrowsableItem.getItem(childItemInfo);
-            if (child.isFolder()) {
-                repoPathChildren.add(browsableItem);
-            } else if (isPropertiesMatch(childItemInfo, criteria.getRequestProperties())) {   // match props for files
-                repoPathChildren.add(browsableItem);
-                if (criteria.isIncludeChecksums()) {
-                    repoPathChildren.addAll(getBrowsableItemChecksumItems(repo,
-                            ((FileInfo) childItemInfo).getChecksumsInfo(), browsableItem));
-                }
-            }
-        }
-
-        Collections.sort(repoPathChildren);
-        return repoPathChildren;
-    }
-
-    /**
-     * call get children with monitor Filter Acceptance if flag is active or base get children
-     * @param updateRootNodesFilterFlag - if true keep flag from empty list due to
-     *                                      no access (canRead = false) return
-     * @param rootNodesFilterResult -
-     * @param rootNode
-     * @return children nodes List or empty list with updated browsableItemAccept canRead flag when
-     * updateRootNodesFilterFlag is active
-     */
-    private List<ItemNode> getRootNodeChildren(boolean updateRootNodesFilterFlag,
-            RootNodesFilterResult rootNodesFilterResult, ItemNode rootNode) {
-        List<ItemNode> children;
-        if (updateRootNodesFilterFlag) {
-           children = rootNode.getChildren(updateRootNodesFilterFlag,rootNodesFilterResult);
-        }
-        else{
-            children = rootNode.getChildren();
-        }
-        return children;
-    }
-
-    private boolean canRead(RealRepo repo, RepoPath childRepoPath) {
-        return authService.canRead(childRepoPath) && repo.accepts(childRepoPath);
-    }
-
-    private boolean isPropertiesMatch(ItemInfo itemInfo, Properties requestProps) {
-        if (requestProps == null || requestProps.isEmpty()) {
-            return true;
-        }
-        Properties nodeProps = propertiesService.getProperties(itemInfo.getRepoPath());
-        Properties.MatchResult result = nodeProps.matchQuery(requestProps);
-        return !Properties.MatchResult.CONFLICT.equals(result);
-    }
-
-    @Override
-    @Nonnull
-    public List<BaseBrowsableItem> getRemoteRepoBrowsableChildren(BrowsableItemCriteria criteria) {
-        return getRemoteRepoBrowsableChildrenData(criteria,false,null);
-    }
-
-    @Override
-    @Nonnull
-    public List<BaseBrowsableItem> getRemoteRepoBrowsableChildren(BrowsableItemCriteria criteria,
-            boolean updateRootNodesFilterFlag, RootNodesFilterResult rootNodesFilterResult) {
-        return getRemoteRepoBrowsableChildrenData(criteria, updateRootNodesFilterFlag,rootNodesFilterResult);
-    }
-
-    private List<BaseBrowsableItem> getRemoteRepoBrowsableChildrenData(BrowsableItemCriteria criteria,
-            boolean updateRootNodesFilterFlag, RootNodesFilterResult rootNodesFilterResult) {
-        RepoPath repoPath = criteria.getRepoPath();
-        String repoKey = repoPath.getRepoKey();
-        String relativePath = repoPath.getPath();
-        RemoteRepo repo = repoService.remoteRepositoryByKey(repoKey);
-        if (repo == null) {
-            log.trace("Remote repo not found:'{}'", repoKey);
-            throw new IllegalArgumentException("Remote repo not found: " + repoKey);
-        }
-        log.debug("Getting Remote Repo '{}' Browsable Children", repoKey);
-        // include remote resources based on the flag and the offline mode
-        boolean includeRemoteResources = criteria.isIncludeRemoteResources() &&
-                repo.isListRemoteFolderItems() && repo.accepts(repoPath);
-
-        // first get all the cached items
-        List<BaseBrowsableItem> children = Lists.newArrayList();
-        boolean pathExistsInCache = false;
-        if (repo.isStoreArtifactsLocally()) {
-            try {
-                BrowsableItemCriteria cacheCriteria = new BrowsableItemCriteria.Builder(criteria).
-                        repoPath(InternalRepoPathFactory.create(repo.getLocalCacheRepo().getKey(),
-                                relativePath)).build();
-                if (updateRootNodesFilterFlag){
-                    children = getLocalRepoBrowsableChildren(cacheCriteria, updateRootNodesFilterFlag,rootNodesFilterResult);
-                }else {
-                    children = getLocalRepoBrowsableChildren(cacheCriteria);
-                }
-                pathExistsInCache = true;
-            } catch (ItemNotFoundRuntimeException e) {
-                // this is legit only if we also want to add remote items
-                if (!includeRemoteResources) {
-                    throw e;
-                }
-                log.trace("Local Repository Item Not Found", e);
-            }
-        }
-        if (includeRemoteResources) {
-            listRemoteBrowsableChildren(children, repo, relativePath, pathExistsInCache,updateRootNodesFilterFlag, rootNodesFilterResult);
-        }
-        Collections.sort(children);
-        return children;
-    }
-
-    private void listRemoteBrowsableChildren(List<BaseBrowsableItem> children, RemoteRepo repo, String relativePath,
-            boolean pathExistsInCache,boolean updateRootNodesFilterFlag, RootNodesFilterResult rootNodesFilterResult) {
-        RepoPath repoPath = repo.getRepoPath(relativePath);
-        List<RemoteItem> remoteItems = repo.listRemoteResources(relativePath);
-        // probably remote not found - return 404 only if current folder doesn't exist in the cache
-        if (remoteItems.isEmpty() && !pathExistsInCache) {
-            // no cache and remote failed - signal 404
-            log.trace("Couldn't find item:'{}'", repoPath);
-            throw new ItemNotFoundRuntimeException("Couldn't find item: " + repoPath);
-        }
-        log.debug("Listing Remote Repo '{}' Browsable Items", repoPath.getRepoKey());
-
-        // filter already existing local items
-        remoteItems = Lists.newArrayList(
-                Iterables.filter(remoteItems, new RemoteOnlyBrowsableItemPredicate(children)));
-        for (RemoteItem remoteItem : remoteItems) {
-            // remove the remote repository base url
-            String path = StringUtils.removeStart(remoteItem.getUrl(), removeBaseUrl(repo.getUrl()));
-            RepoPath remoteRepoPath = InternalRepoPathFactory.create(repoPath.getRepoKey(), path,
-                    remoteItem.isDirectory());
-            RepoPath cacheRepoPath = InternalRepoPathFactory.cacheRepoPath(remoteRepoPath);
-            if (canRead(repo, cacheRepoPath)) {
-                RemoteBrowsableItem browsableItem = new RemoteBrowsableItem(remoteItem, remoteRepoPath);
-                if (remoteItem.getEffectiveUrl() != null) {
-                    log.debug("Remote Browsable item effective URL", remoteItem.getEffectiveUrl());
-                    browsableItem.setEffectiveUrl(remoteItem.getEffectiveUrl());
-                }
-                children.add(browsableItem);
-            }
-            else if (updateRootNodesFilterFlag && !authService.canRead(cacheRepoPath) ){
-                rootNodesFilterResult.setAllItemNodesCanRead(false);
-            }
-        }
-        if (updateRootNodesFilterFlag && !children.isEmpty()){
-            rootNodesFilterResult.setAllItemNodesCanRead(true);
-        }
-    }
-
-    private String removeBaseUrl(String originalUrl) {
-        //If remote url ends with / it messes up the path builder, since we already add it below it's safe to remove
-        String remoteUrl = PathUtils.trimTrailingSlashes(originalUrl);
-        ArtifactoryStandardUrlResolver artifactoryStandardUrlResolver = new ArtifactoryStandardUrlResolver(remoteUrl);
-        StringBuilder baseUrlBuilder = new StringBuilder(artifactoryStandardUrlResolver.getBaseUrl())
-                .append("/").append(artifactoryStandardUrlResolver.getRepoKey());
-        if (!remoteUrl.endsWith("/")) {
-            baseUrlBuilder.append("/");
-        }
-        return baseUrlBuilder.toString();
-    }
-
-    @Override
-    @Nonnull
-    public List<BaseBrowsableItem> getVirtualRepoBrowsableChildren(BrowsableItemCriteria criteria) {
-        return getVirtualRepoBrowsableChildrenData(criteria,false,null);
-    }
-
-    @Override
-    @Nonnull
-    public List<BaseBrowsableItem> getVirtualRepoBrowsableChildren(BrowsableItemCriteria criteria,
-            boolean updateRootNodesFilterFlag,RootNodesFilterResult rootNodesFilterResult) {
-        return getVirtualRepoBrowsableChildrenData(criteria, updateRootNodesFilterFlag,rootNodesFilterResult);
-    }
-
-
-    private List<BaseBrowsableItem> getVirtualRepoBrowsableChildrenData(BrowsableItemCriteria criteria,
-            boolean updateRootNodesFilterFlag,RootNodesFilterResult rootNodesFilterResult) {
-        RepoPath repoPath = criteria.getRepoPath();
-        String virtualRepoKey = repoPath.getRepoKey();
-        VirtualRepo virtualRepo = repoService.virtualRepositoryByKey(virtualRepoKey);
-        if (virtualRepo == null) {
-            log.trace("No virtual repo found:'{}'", virtualRepoKey);
-            throw new IllegalArgumentException("No virtual repo found: " + virtualRepoKey);
-        }
-        log.debug("getting Virtual Repo '{}' Browsable Item ", virtualRepoKey);
-        List<BaseBrowsableItem> candidateChildren = Lists.newArrayList();
-        List<VirtualRepo> searchableRepos = getSearchableRepos(virtualRepo, repoPath);
-        Multimap<String, VirtualRepo> pathToVirtualRepos = HashMultimap.create();
-        // add children from all local repos
-
-        getVirtualBrowsableItemFromLocalAndRemote(criteria, updateRootNodesFilterFlag,rootNodesFilterResult,
-                candidateChildren, searchableRepos, pathToVirtualRepos);
-        // only add the candidate that this virtual repository accepts via its include/exclude rules
-        Map<String, BaseBrowsableItem> childrenToReturn = Maps.newHashMap();
-        for (BaseBrowsableItem child : candidateChildren) {
-            String childRelativePath = child.getRelativePath();
-            if (virtualRepoAccepts(virtualRepo, child.getRepoPath())) {
-                log.debug("Virtual Repo '{}' accepts child repo path '{}' ", virtualRepoKey, child.getRepoPath());
-                VirtualBrowsableItem virtualItem;
-                if (childrenToReturn.containsKey(childRelativePath)) {
-                    virtualItem = (VirtualBrowsableItem) childrenToReturn.get(childRelativePath);
-                    if (!child.isRemote() && virtualItem.isRemote()) {
-                        virtualItem.setCreated(child.getCreated());
-                        virtualItem.setLastModified(child.getLastModified());
-                        virtualItem.setSize(child.getSize());
-                        log.debug("Updating virtual Item '{}' created '{}' ,lastModified '{}' and size '{}'",
-                                virtualItem.getName(),
-                                child.getCreated(),
-                                child.getLastModified(),
-                                child.getSize());
-                    }
-                } else {
-                    // New
-                    Collection<VirtualRepo> virtualRepos = pathToVirtualRepos.get(childRelativePath);
-                    virtualItem = new VirtualBrowsableItem(child.getName(), child.isFolder(), child.getCreated(),
-                            child.getLastModified(), child.getSize(), InternalRepoPathFactory.create(virtualRepoKey,
-                            childRelativePath, child.isFolder()),
-                            Lists.newArrayList(getSearchableRepoKeys(virtualRepos))
-                    );
-                    log.debug("New virtual Item '{}' created '{}' ,lastModified '{}' and size '{}'",
-                            virtualItem.getName(),
-                            child.getCreated(),
-                            child.getLastModified(),
-                            child.getSize());
-
-                    virtualItem.setRemote(true);    // default to true
-                    childrenToReturn.put(childRelativePath, virtualItem);
-                }
-                virtualItem.setRemote(virtualItem.isRemote() && child.isRemote());   // remote if all are remote
-                virtualItem.addRepoKey(child.getRepoKey());
-            }
-        }
-        return Lists.newArrayList(childrenToReturn.values());
-    }
-
-    /**
-     * get browsable children items from local repository and remote repository , if list return is empty due to no
-     * permission to access nodes then BrowsableItemAccept will be update so a challenge could be send to UI
-     * @param criteria browsing criteria
-     * @param updateRootNodesFilterFlag - is require to update item list with permission to access flag
-     * @param rootNodesFilterResult - object that hold list permission to access flag
-     * @param candidateChildren - list of brows children
-     * @param searchableRepos - repose to search
-     * @param pathToVirtualRepos - path to virtual repo
-     */
-    private void getVirtualBrowsableItemFromLocalAndRemote(BrowsableItemCriteria criteria,
-            boolean updateRootNodesFilterFlag, RootNodesFilterResult rootNodesFilterResult,
-            List<BaseBrowsableItem> candidateChildren, List<VirtualRepo> searchableRepos,
-            Multimap<String, VirtualRepo> pathToVirtualRepos) {
-        StringBuilder canReadReposFlags = new StringBuilder();
-        List<ItemNotFoundRuntimeException> itemNotFoundOnLocalList = new ArrayList<>();
-        List<ItemNotFoundRuntimeException> itemNotFoundOnRemoteList = new ArrayList<>();
-        int localIndex = 0;
-        int remoteIndex = 0;
-        if (updateRootNodesFilterFlag) {
-            for (VirtualRepo repo : searchableRepos) {
-                RootNodesFilterResult localBrowsableItemAccept = new RootNodesFilterResult();
-                RootNodesFilterResult remoteBrowsableItemAccept = new RootNodesFilterResult();
-                try {
-                    addVirtualBrowsableItemsFromLocal(criteria, repo, candidateChildren, pathToVirtualRepos,
-                            updateRootNodesFilterFlag, localBrowsableItemAccept);
-                    if (!repo.getLocalRepositories().isEmpty()) {
-                        localIndex++;
-                    }
-                } catch (ItemNotFoundRuntimeException e) {
-                    localIndex++;
-                    itemNotFoundOnLocalList.add(e);
-                }
-                try {
-                addVirtualBrowsableItemsFromRemote(criteria, repo, candidateChildren, pathToVirtualRepos,
-                        updateRootNodesFilterFlag,remoteBrowsableItemAccept);
-                    if (!repo.getRemoteRepositories().isEmpty()) {
-                        remoteIndex++;
-                    }
-                } catch (ItemNotFoundRuntimeException e) {
-                    remoteIndex++;
-                    itemNotFoundOnRemoteList.add(e);
-                }
-                updatefolderCanRead(canReadReposFlags, localBrowsableItemAccept, remoteBrowsableItemAccept);
-            }
-            if (canReadReposFlags.toString().indexOf("false") != -1 && candidateChildren.isEmpty() ){
-                rootNodesFilterResult.setAllItemNodesCanRead(false);
-            }
-        }else {
-            for (VirtualRepo repo : searchableRepos) {
-                RootNodesFilterResult localBrowsableItemAccept = new RootNodesFilterResult();
-                RootNodesFilterResult remoteBrowsableItemAccept = new RootNodesFilterResult();
-                try {
-                    addVirtualBrowsableItemsFromLocal(criteria, repo, candidateChildren, pathToVirtualRepos,
-                            updateRootNodesFilterFlag, localBrowsableItemAccept);
-                    if (!repo.getLocalRepositories().isEmpty()) {
-                        localIndex++;
-                    }
-                } catch (ItemNotFoundRuntimeException e) {
-                    localIndex++;
-                    itemNotFoundOnLocalList.add(e);
-                }
-                try {
-                    addVirtualBrowsableItemsFromRemote(criteria, repo, candidateChildren, pathToVirtualRepos,
-                            updateRootNodesFilterFlag, remoteBrowsableItemAccept);
-                    if (!repo.getRemoteRepositories().isEmpty()) {
-                        remoteIndex++;
-                    }
-                } catch (ItemNotFoundRuntimeException e) {
-                    remoteIndex++;
-                    itemNotFoundOnRemoteList.add(e);
-                }
-            }
-        }
-        if (isItemNotFoundOnVirtualRepo(candidateChildren, itemNotFoundOnLocalList, itemNotFoundOnRemoteList, remoteIndex + localIndex)) {
-            throw new ItemNotFoundRuntimeException("children items not found on all virtual repos");
-        }
-    }
-
-    private boolean isItemNotFoundOnVirtualRepo(List<BaseBrowsableItem> candidateChildren, List<ItemNotFoundRuntimeException> itemNotFoundOnLocalList,
-                                                List<ItemNotFoundRuntimeException> itemNotFoundOnRemoteList, int totalVirtualIndex) {
-        return candidateChildren.isEmpty() && ((itemNotFoundOnLocalList.size() + itemNotFoundOnRemoteList.size()) == totalVirtualIndex);
-    }
-
-    /**
-     * update repo folder can read
-     * @param canReadReposFlags - update true / false flag for each repo that can or can not read
-     * @param localBrowsableItemAccept - hold can read flag for local
-     * @param remoteBrowsableItemAccept - hold can read flag for remote
-     */
-    private void updatefolderCanRead(StringBuilder canReadReposFlags, RootNodesFilterResult localBrowsableItemAccept,
-            RootNodesFilterResult remoteBrowsableItemAccept) {
-        if (hasAtLeastOneItemWithReadPermission(localBrowsableItemAccept, remoteBrowsableItemAccept)) {
-            canReadReposFlags.append("true");
-        }
-        else{
-            canReadReposFlags.append("false");
-        }
-    }
-
-    private boolean hasAtLeastOneItemWithReadPermission(RootNodesFilterResult localBrowsableItemAccept,
-            RootNodesFilterResult remoteBrowsableItemAccept) {
-        return (localBrowsableItemAccept.isAllItemNodesCanRead() && remoteBrowsableItemAccept.isAllItemNodesCanRead());
-    }
-
-    private void addVirtualBrowsableItemsFromLocal(BrowsableItemCriteria criteria, VirtualRepo repo,
-            List<BaseBrowsableItem> candidateChildren, Multimap<String, VirtualRepo> pathToVirtualRepos,
-            boolean updateRootNodesFilterFlag ,RootNodesFilterResult rootNodesFilterResult) {
-        String relativePath = criteria.getRepoPath().getPath();
-        List<LocalRepo> localRepositories = repo.getLocalRepositories();
-        List<ItemNotFoundRuntimeException> itemNotFoundRuntimeExceptionList = new ArrayList<>();
-        log.debug("adding  Virtual Browsable Items From Local to virtual Repo:'{}'", repo);
-        for (LocalRepo localRepo : localRepositories) {
-            RepoPath path = InternalRepoPathFactory.create(localRepo.getKey(),
-                            relativePath, criteria.getRepoPath().isFolder());
-            try {
-                BrowsableItemCriteria localCriteria = new BrowsableItemCriteria.Builder(criteria).repoPath(path).
-                        build();
-                log.trace("Iterating Browsable childrens of Local Repo :'{}' and check Virtual Repo Accepts it",
-                        localRepo.getKey());
-                List<BaseBrowsableItem> localRepoBrowsableChildren = getLocalBaseBrowsableItems(
-                        updateRootNodesFilterFlag, rootNodesFilterResult, localCriteria);
-                // go over all local repo browsable children, these have already been filtered according
-                // to each local repo's rules, now all that is left is to check that the virtual repo that
-                // the local repo belongs to accepts as well.
-                for (BaseBrowsableItem localRepoBrowsableChild : localRepoBrowsableChildren) {
-                    if (virtualRepoAccepts(repo, localRepoBrowsableChild.getRepoPath())) {
-                        log.debug("virtual repo accept Local Repo browsable child '{}':'{}'", localRepo.getKey(),
-                                localRepoBrowsableChild.getName());
-                        pathToVirtualRepos.put(localRepoBrowsableChild.getRelativePath(), repo);
-                        candidateChildren.add(localRepoBrowsableChild);
-                    }
-                }
-            } catch (ItemNotFoundRuntimeException e) {
-                log.trace("Could not find local browsable children at '{}'", criteria + " " + e.getMessage());
-                // add item not found exception to list
-                updateItemNotFoundRuntimeExceptionsList(itemNotFoundRuntimeExceptionList, e);
-            }
-        }
-        if (isAllLocalRepoReturnItemNotFoundException(localRepositories, itemNotFoundRuntimeExceptionList)) {
-            throw new ItemNotFoundRuntimeException("Could not find local browsable children");
-        }
-    }
-
-    /**
-     * update item not foound exception list for local and remote
-     * @param itemNotFoundRuntimeExceptionList - item not found excception list referance
-     * @param e - item not found exception
-     */
-    private void updateItemNotFoundRuntimeExceptionsList(List<ItemNotFoundRuntimeException> itemNotFoundRuntimeExceptionList, ItemNotFoundRuntimeException e) {
-        itemNotFoundRuntimeExceptionList.add(e);
-    }
-
-    /**
-     * check weather all local repositories return item not found exception
-     *
-     * @param localRepositories                - local repositories list
-     * @param itemNotFoundRuntimeExceptionList - item not found exception list
-     * @return - true if all local repositories return item not found exception
-     */
-    private boolean isAllLocalRepoReturnItemNotFoundException(List<LocalRepo> localRepositories, List<ItemNotFoundRuntimeException> itemNotFoundRuntimeExceptionList) {
-        return !itemNotFoundRuntimeExceptionList.isEmpty() && itemNotFoundRuntimeExceptionList.size() == localRepositories.size();
-    }
-
-    /**
-     * call getLocalRepoBrowsableChildren with monitor emptyList acceptance Flag if true or
-     * base getLocalRepoBrowsableChildren if not
-     * @param updateRootNodesFilterFlag - monitor BaseBrowsableItem empty list due to missing read permission to Node
-     * @param rootNodesFilterResult - Hold the missing read permission to Node flag if BaseBrowsableItem list is empty
-     * @param localCriteria - criteria to find nodes
-     * @return list of BaseBrowsableItem
-     */
-    private List<BaseBrowsableItem> getLocalBaseBrowsableItems(boolean updateRootNodesFilterFlag,
-            RootNodesFilterResult rootNodesFilterResult, BrowsableItemCriteria localCriteria) {
-        List<BaseBrowsableItem> localRepoBrowsableChildren;
-        if (updateRootNodesFilterFlag) {
-            localRepoBrowsableChildren = getLocalRepoBrowsableChildren(localCriteria,
-                    true, rootNodesFilterResult);
-        }else{
-            localRepoBrowsableChildren = getLocalRepoBrowsableChildren(localCriteria);
-        }
-        return localRepoBrowsableChildren;
-    }
-
-    private void addVirtualBrowsableItemsFromRemote(BrowsableItemCriteria criteria, VirtualRepo repo,
-            List<BaseBrowsableItem> candidateChildren, Multimap<String, VirtualRepo> pathToVirtualRepos,
-            boolean isBrowsableItemsAccepted,RootNodesFilterResult browsableItemAccept) {
-        List<RemoteRepo> remoteRepositories = repo.getRemoteRepositories();
-        // add children from all remote repos (and their caches)
-        log.debug("adding  Virtual Browsable Items From Remote to virtual Repo:'{}'", repo);
-        List<ItemNotFoundRuntimeException> itemNotFoundRuntimeExceptionList = new ArrayList<>();
-        for (RemoteRepo remoteRepo : remoteRepositories) {
-            RepoPath remoteRepoPath = InternalRepoPathFactory.create(remoteRepo.getKey(),
-                    criteria.getRepoPath().getPath(), criteria.getRepoPath().isFolder());
-            try {
-                BrowsableItemCriteria remoteCriteria = new BrowsableItemCriteria.Builder(criteria).
-                        repoPath(remoteRepoPath).build();
-                List<BaseBrowsableItem> remoteRepoBrowsableChildren;
-                if (isBrowsableItemsAccepted) {
-                     remoteRepoBrowsableChildren =
-                            getRemoteRepoBrowsableChildren(remoteCriteria,true,browsableItemAccept);
-                }else{
-                    remoteRepoBrowsableChildren =
-                            getRemoteRepoBrowsableChildren(remoteCriteria);
-                }
-                log.trace("Iterating Browsable childrens of Remote Repo :'{}' and check Virtual Repo Accepts it",
-                        remoteRepo.getKey());
-                for (BaseBrowsableItem remoteRepoBrowsableChild : remoteRepoBrowsableChildren) {
-                    if (virtualRepoAccepts(repo, remoteRepoBrowsableChild.getRepoPath())) {
-                        log.debug("virtual repo accept Remote Repo browsable child '{}':'{}'", remoteRepo.getKey(),
-                                remoteRepoBrowsableChild.getName());
-                        pathToVirtualRepos.put(remoteRepoBrowsableChild.getRelativePath(), repo);
-                        candidateChildren.add(remoteRepoBrowsableChild);
-                    }
-                }
-            } catch (ItemNotFoundRuntimeException e) {
-                log.trace("Could not find local browsable children at '{}'",
-                        criteria + " " + e.getMessage());
-                // add item not found exception to list
-                updateItemNotFoundRuntimeExceptionsList(itemNotFoundRuntimeExceptionList, e);
-            }
-        }
-        if (isAllRemoteRepoReturnItemNotFoundException(remoteRepositories, itemNotFoundRuntimeExceptionList)) {
-            throw new ItemNotFoundRuntimeException("Could not find remote browsable children");
-        }
-    }
-
-    /**
-     * check weather all local repositories return item not found exception
-     *
-     * @param localRepositories                - local repositories list
-     * @param itemNotFoundRuntimeExceptionList - item not found exception list
-     * @return - true if all local repositories return item not found exception
-     */
-    private boolean isAllRemoteRepoReturnItemNotFoundException(List<RemoteRepo> localRepositories, List<ItemNotFoundRuntimeException> itemNotFoundRuntimeExceptionList) {
-        return !itemNotFoundRuntimeExceptionList.isEmpty() && itemNotFoundRuntimeExceptionList.size() == localRepositories.size();
-    }
-
-    private List<VirtualRepo> getSearchableRepos(VirtualRepo virtualRepo, RepoPath pathToCheck) {
-        log.debug("getting searchable repositories of virtual repo '{}'", virtualRepo.getKey());
-        List<VirtualRepo> repos = Lists.newArrayList();
-        List<VirtualRepo> allVirtualRepos = virtualRepo.getResolvedVirtualRepos();
-        for (VirtualRepo repo : allVirtualRepos) {
-            if (repo.accepts(pathToCheck)) {
-                log.debug("repo '{}' accepts path '{}'", repo.getKey(), pathToCheck.getPath());
-                repos.add(repo);
-            }
-        }
-        return repos;
-    }
-
-    private Collection<String> getSearchableRepoKeys(Collection<VirtualRepo> virtualRepos) {
-        log.debug("getting searchable repositories of virtual repo keys ");
-        return Collections2.transform(virtualRepos, new Function<VirtualRepo, String>() {
-            @Override
-            public String apply(@Nonnull VirtualRepo input) {
-                log.trace("searchable repo key '{}'", input.getKey());
-                return input.getKey();
-            }
-        });
-    }
-
-    private boolean virtualRepoAccepts(VirtualRepo virtualRepo, RepoPath repoPath) {
-        String path = repoPath.getPath();
-        if (repoPath.isFolder()) {
-            path += "/";
-        }
-
-        //If the path is not accepted, return immediately
-        if (!virtualRepo.accepts(repoPath)) {
-            log.debug("Virtual repo '{}' did not accept path '{}'", virtualRepo, repoPath);
-            return false;
-        }
-
-        if (path.contains(MavenNaming.NEXUS_INDEX_DIR) || MavenNaming.isIndex(path)) {
-            log.debug("Path '{}' is not an index", path);
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public VirtualRepoItem getVirtualRepoItem(RepoPath repoPath) {
-        VirtualRepo virtualRepo = repoService.virtualRepositoryByKey(repoPath.getRepoKey());
-        if (virtualRepo == null) {
-            log.trace("Repository '{}' does not exists!", repoPath.getRepoKey());
-            throw new IllegalArgumentException("Repository " + repoPath.getRepoKey() + " does not exists!");
-        }
-        log.debug("getting virtual Repo '{}' item", repoPath.getRepoKey());
-        VirtualRepoItem repoItem = virtualRepo.getVirtualRepoItem(repoPath);
-        if (repoItem == null) {
-            return null;
-        }
-
-        //Security - check that we can return the child
-        Iterator<String> repoKeysIterator = repoItem.getRepoKeys().iterator();
-        while (repoKeysIterator.hasNext()) {
-            String realRepoKey = repoKeysIterator.next();
-            RepoPath realRepoPath = InternalRepoPathFactory.create(realRepoKey, repoPath.getPath());
-            boolean canRead = authService.canRead(realRepoPath);
-            if (!canRead) {
-                log.trace("removing repo '{}' item, not have read access permission", realRepoKey);
-                //Don't bother with stuff that we do not have read access to
-                repoKeysIterator.remove();
-            }
-        }
-
-        // return null if user doesn't have permissions for any of the real repo paths
-        if (repoItem.getRepoKeys().isEmpty()) {
-            log.trace("user doesn't have permissions for any of the real repo paths");
-            return null;
-        } else {
-            return repoItem;
-        }
-    }
-
-    @Override
-    public List<VirtualRepoItem> getVirtualRepoItems(RepoPath folderPath) {
-        log.debug("getting Virtual Repo Items '{}'", folderPath.getRepoKey());
-        VirtualRepo virtualRepo = repoService.virtualRepositoryByKey(folderPath.getRepoKey());
-        if (virtualRepo == null) {
-            log.trace("Repository '{}' does not exists!", folderPath.getRepoKey());
-            throw new RepositoryRuntimeException(
-                    "Repository " + folderPath.getRepoKey() + " does not exists!");
-        }
-        //Get a deep children view of the virtual repository (including contained virtual repos)
-        Set<String> children = virtualRepo.getChildrenNamesDeeply(folderPath);
-        List<VirtualRepoItem> result = new ArrayList<>(children.size());
-        for (String childName : children) {
-            //Do not add or check hidden items
-            RepoPath childPath = InternalRepoPathFactory.create(folderPath, childName);
-            VirtualRepoItem virtualRepoItem = getVirtualRepoItem(childPath);
-            log.debug("getting Virtual Repo Item for folder path '{}' and child '{}'", folderPath.getRepoKey(),
-                    childName);
-            if (virtualRepoItem != null) {
-                result.add(virtualRepoItem);
-            }
-        }
-        return result;
-    }
-
-    /**
-     * Returns local-repo browsable items of checksums for the given browsable item
-     *
-     * @param repo          Browsed repo
-     * @param checksumsInfo Item's checksum info
-     * @param browsableItem Browsable item to create checksum items for    @return Checksum browsable items
-     */
-    private List<BrowsableItem> getBrowsableItemChecksumItems(LocalRepo repo,
-            ChecksumsInfo checksumsInfo, BrowsableItem browsableItem) {
-        log.debug("getting Local repo Browsable Checksum Items for LocalRepo '{}'", repo.getKey());
-        List<BrowsableItem> browsableChecksumItems = Lists.newArrayList();
-        Set<ChecksumInfo> checksums = checksumsInfo.getChecksums();
-        for (ChecksumType checksumType : ChecksumType.BASE_CHECKSUM_TYPES) {
-            String checksumValue = repo.getChecksumPolicy().getChecksum(checksumType, checksums);
-            if (org.apache.commons.lang.StringUtils.isNotBlank(checksumValue)) {
-                BrowsableItem checksumItem = BrowsableItem.getChecksumItem(browsableItem, checksumType,
-                        checksumValue.getBytes(Charsets.UTF_8).length);
-                log.debug("getting Local repo Browsable Checksum Item '{}':'{}'", repo.getKey(),
-                        checksumItem.getName());
-
-                RepoPath checksumItemRepoPath = checksumItem.getRepoPath();
-                if (authService.canRead(checksumItemRepoPath) && repo.accepts(checksumItemRepoPath)) {
-                    browsableChecksumItems.add(checksumItem);
-                }
-            }
-        }
-
-        return browsableChecksumItems;
-    }
-
-    /**
-     * This predicate returns true if a given item, represented by URL, doesn't already exists in the local items.
-     */
-    private static class RemoteOnlyBrowsableItemPredicate implements Predicate<RemoteItem> {
-        private List<BaseBrowsableItem> localItems;
-
-        private RemoteOnlyBrowsableItemPredicate(List<BaseBrowsableItem> localItems) {
-            this.localItems = localItems;
-        }
-
-        @Override
-        public boolean apply(@Nonnull RemoteItem input) {
-            for (BaseBrowsableItem localItem : localItems) {
-                if (localItem.getName().equals(input.getName())) {
-                    return false;
-                }
-            }
-            return true;
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/RepositoryServiceImpl.java b/backend/core/src/main/java/org/artifactory/repo/service/RepositoryServiceImpl.java
deleted file mode 100644
index 612f876..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/RepositoryServiceImpl.java
+++ /dev/null
@@ -1,2365 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.service;
-
-import com.google.common.collect.*;
-import org.apache.commons.compress.archivers.ArchiveInputStream;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.apache.http.HttpHeaders;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.NuGetAddon;
-import org.artifactory.addon.WebstartAddon;
-import org.artifactory.addon.gems.GemsAddon;
-import org.artifactory.addon.replication.ReplicationAddon;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.common.MoveMultiStatusHolder;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.config.ExportSettingsImpl;
-import org.artifactory.api.config.ImportSettingsImpl;
-import org.artifactory.api.config.RepositoryImportSettingsImpl;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.jackson.JacksonReader;
-import org.artifactory.api.maven.MavenMetadataService;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.module.VersionUnit;
-import org.artifactory.api.repo.ArchiveFileContent;
-import org.artifactory.api.repo.Async;
-import org.artifactory.api.repo.exception.FileExpectedException;
-import org.artifactory.api.repo.exception.FolderExpectedException;
-import org.artifactory.api.repo.exception.ItemNotFoundRuntimeException;
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.api.request.UploadService;
-import org.artifactory.api.rest.constant.RepositoriesRestConstants;
-import org.artifactory.api.rest.constant.RestConstants;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.SavedSearchResults;
-import org.artifactory.api.search.VersionSearchResults;
-import org.artifactory.api.search.deployable.VersionUnitSearchControls;
-import org.artifactory.api.search.property.PropertySearchControls;
-import org.artifactory.api.search.property.PropertySearchResult;
-import org.artifactory.api.security.AclService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.api.storage.StorageQuotaInfo;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.checksum.ChecksumsInfo;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.common.StatusHolder;
-import org.artifactory.config.InternalCentralConfigService;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.repo.*;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.exception.CancelException;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.*;
-import org.artifactory.info.InfoWriter;
-import org.artifactory.io.StringResourceStreamHandle;
-import org.artifactory.mbean.MBeanRegistrationService;
-import org.artifactory.md.Properties;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.model.xstream.fs.PropertiesImpl;
-import org.artifactory.repo.*;
-import org.artifactory.repo.cleanup.FolderPruningService;
-import org.artifactory.repo.count.ArtifactCountRetriever;
-import org.artifactory.repo.db.DbLocalRepo;
-import org.artifactory.repo.db.importexport.DbRepoExportSearchHandler;
-import org.artifactory.repo.interceptor.StorageInterceptors;
-import org.artifactory.repo.local.PathDeletionContext;
-import org.artifactory.repo.local.ValidDeployPathContext;
-import org.artifactory.repo.mbean.ManagedRepository;
-import org.artifactory.repo.service.mover.*;
-import org.artifactory.repo.trash.TrashService;
-import org.artifactory.repo.virtual.VirtualRepo;
-import org.artifactory.request.InternalArtifactoryResponse;
-import org.artifactory.request.InternalRequestContext;
-import org.artifactory.request.NullRequestContext;
-import org.artifactory.request.RepoRequests;
-import org.artifactory.resource.FileResource;
-import org.artifactory.resource.ResolvedResource;
-import org.artifactory.resource.ResourceStreamHandle;
-import org.artifactory.resource.UnfoundRepoResource;
-import org.artifactory.sapi.common.BaseSettings;
-import org.artifactory.sapi.common.ExportSettings;
-import org.artifactory.sapi.common.ImportSettings;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-import org.artifactory.sapi.fs.*;
-import org.artifactory.sapi.interceptor.DeleteContext;
-import org.artifactory.schedule.*;
-import org.artifactory.search.InternalSearchService;
-import org.artifactory.security.*;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.storage.DBEntityNotFoundException;
-import org.artifactory.storage.StorageService;
-import org.artifactory.storage.binstore.service.BinaryInfo;
-import org.artifactory.storage.binstore.service.BinaryService;
-import org.artifactory.storage.db.binstore.service.BinaryServiceInputStream;
-import org.artifactory.storage.fs.lock.LockingHelper;
-import org.artifactory.storage.fs.service.FileService;
-import org.artifactory.storage.fs.service.ItemMetaInfo;
-import org.artifactory.storage.fs.service.NodeMetaInfoService;
-import org.artifactory.storage.fs.service.PropertiesService;
-import org.artifactory.storage.fs.tree.ItemNode;
-import org.artifactory.storage.fs.tree.ItemTree;
-import org.artifactory.storage.fs.tree.TreeBrowsingCriteria;
-import org.artifactory.storage.fs.tree.TreeBrowsingCriteriaBuilder;
-import org.artifactory.storage.jobs.StatsDelegatingServiceFlushJob;
-import org.artifactory.storage.jobs.StatsPersistingServiceFlushJob;
-import org.artifactory.storage.service.StatsServiceImpl;
-import org.artifactory.util.*;
-import org.artifactory.version.CompoundVersionDetails;
-import org.codehaus.jackson.type.TypeReference;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.*;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-
- at Service
- at Reloadable(beanClass = InternalRepositoryService.class,
-        initAfter = {StorageInterceptors.class, InternalCentralConfigService.class, TaskService.class})
-public class RepositoryServiceImpl implements InternalRepositoryService {
-    private static final Logger log = LoggerFactory.getLogger(RepositoryServiceImpl.class);
-
-    private static final String REPOSITORIES_MBEAN_TYPE = "Repositories";
-
-    @Autowired
-    private AclService aclService;
-
-    @Autowired
-    private AuthorizationService authService;
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Autowired
-    private TaskService taskService;
-
-    @Autowired
-    private MavenMetadataService mavenMetadataService;
-
-    @Autowired
-    private InternalSearchService searchService;
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Autowired
-    private UploadService uploadService;
-
-    @Autowired
-    private StorageService storageService;
-
-    @Autowired
-    private StatsServiceImpl statsService;
-
-    @Autowired
-    private FileService fileService;
-
-    @Autowired
-    private BinaryService binaryService;
-
-    @Autowired
-    private FolderPruningService pruneService;
-
-    private ArtifactCountRetriever artifactCountRetriever;
-
-    private LocalRepo trashcan;
-    private Map<String, LocalRepo> localRepositoriesMap = Maps.newLinkedHashMap();
-    private Map<String, RemoteRepo> remoteRepositoriesMap = Maps.newLinkedHashMap();
-    private Map<String, LocalCacheRepo> localCacheRepositoriesMap = Maps.newLinkedHashMap();
-    private Map<String, VirtualRepo> virtualRepositoriesMap = Maps.newLinkedHashMap();
-    private Map<String, DistributionRepo> distributionRepositoriesMap = Maps.newLinkedHashMap();
-
-    // a cache of all the repository keys
-    private Set<String> allRepoKeysCache;
-
-    private static InternalRepositoryService getTransactionalMe() {
-        return InternalContextHelper.get().beanForType(InternalRepositoryService.class);
-    }
-
-    @Override
-    public void init() {
-        rebuildRepositories();
-        HttpUtils.resetArtifactoryUserAgent();
-
-        try {
-            //Dump info to the log
-            InfoWriter.writeInfo();
-        } catch (Exception e) {
-            log.warn("Failed dumping system info", e);
-        }
-
-        // register internal statistics flushing job
-        TaskBase localStatsFlushTask = TaskUtils.createRepeatingTask(StatsPersistingServiceFlushJob.class,
-                TimeUnit.SECONDS.toMillis(ConstantValues.statsFlushIntervalSecs.getLong()),
-                TimeUnit.SECONDS.toMillis(ConstantValues.statsFlushIntervalSecs.getLong()));
-
-        // register remote statistics flushing job
-        TaskBase remoteFlushTask = TaskUtils.createRepeatingTask(StatsDelegatingServiceFlushJob.class,
-                TimeUnit.SECONDS.toMillis(ConstantValues.statsRemoteFlushIntervalSecs.getLong()),
-                TimeUnit.SECONDS.toMillis(ConstantValues.statsRemoteFlushIntervalSecs.getLong()));
-
-        taskService.startTask(localStatsFlushTask, false);
-        taskService.startTask(remoteFlushTask, false);
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-        HttpUtils.resetArtifactoryUserAgent();
-        deleteOrphanRepos(oldDescriptor);
-        rebuildRepositories();
-        checkAndCleanChangedVirtualPomCleanupPolicy(oldDescriptor);
-    }
-
-    @Override
-    @Async(authenticateAsSystem = true)
-    public void onContextReady() {
-        //
-        registerRepositoriesMBeans();
-
-        //
-        GemsAddon gemsAddon = addonsManager.addonByType(GemsAddon.class);
-        if (!gemsAddon.isDefault()) {
-            for (LocalRepo localRepo : localRepositoriesMap.values()) {
-                if (!localRepo.isBlackedOut()) {
-                    if (localRepo.getDescriptor().getType().equals(RepoType.Gems)) {
-                        gemsAddon.afterRepoInit(localRepo.getKey());
-                    }
-                }
-            }
-            for (VirtualRepo virtualRepo : getVirtualRepositories()) {
-                if (virtualRepo.getDescriptor().getType().equals(RepoType.Gems)) {
-                    gemsAddon.afterRepoInit(virtualRepo.getKey());
-                }
-            }
-        }
-
-        //
-        NuGetAddon nuGetAddon = addonsManager.addonByType(NuGetAddon.class);
-        if (!nuGetAddon.isDefault()) {
-            for (LocalRepo localRepo : localRepositoriesMap.values()) {
-                if (!localRepo.isBlackedOut()) {
-                    if (localRepo.getDescriptor().getType().equals(RepoType.NuGet)) { //feature
-                        nuGetAddon.afterRepoInit(localRepo.getKey());
-                    }
-                }
-            }
-        }
-    }
-
-    @Override
-    public void onContextCreated() {
-    }
-
-    @Override
-    public void onContextUnready() {
-    }
-
-    private void checkAndCleanChangedVirtualPomCleanupPolicy(CentralConfigDescriptor oldDescriptor) {
-        Map<String, VirtualRepoDescriptor> oldVirtualDescriptors = oldDescriptor.getVirtualRepositoriesMap();
-        List<VirtualRepoDescriptor> newVirtualDescriptors = getVirtualRepoDescriptors();
-        for (VirtualRepoDescriptor newDescriptor : newVirtualDescriptors) {
-            String repoKey = newDescriptor.getKey();
-            VirtualRepoDescriptor oldVirtualDescriptor = oldVirtualDescriptors.get(repoKey);
-            if (oldVirtualDescriptor != null && pomCleanUpPolicyChanged(newDescriptor, oldVirtualDescriptor)) {
-                VirtualRepo virtualRepo = virtualRepositoryByKey(repoKey);
-                if (virtualRepo != null) {
-                    log.info("Pom Repository Reference Cleanup Policy changed in '{}', cleaning repository cache. ", repoKey);
-                    RepoPath rootPath = InternalRepoPathFactory.repoRootPath(repoKey);
-                    virtualRepo.undeploy(new DeleteContext(rootPath));
-                } else {
-                    log.warn("Unable to cleanup poms from the non-existing virtual repository '{}'", repoKey);
-                }
-            }
-        }
-    }
-
-    private boolean pomCleanUpPolicyChanged(VirtualRepoDescriptor newDescriptor, VirtualRepoDescriptor oldDescriptor) {
-        PomCleanupPolicy newPolicy = newDescriptor.getPomRepositoryReferencesCleanupPolicy();
-        PomCleanupPolicy oldPolicy = oldDescriptor.getPomRepositoryReferencesCleanupPolicy();
-        return !newPolicy.equals(oldPolicy);
-    }
-
-    private void deleteOrphanRepos(CentralConfigDescriptor oldDescriptor) {
-        CentralConfigDescriptor currentDescriptor = centralConfigService.getDescriptor();
-        Set<String> newRepoKeys = getConfigRepoKeys(currentDescriptor);
-        Set<String> oldRepoKeys = getConfigRepoKeys(oldDescriptor);
-        for (String key : oldRepoKeys) {
-            if (!newRepoKeys.contains(key)) {
-                log.warn("Removing the no-longer-referenced repository " + key);
-                StatusHolder statusHolder = deleteOrphanRepo(key);
-                if (statusHolder.isError()) {
-                    log.warn("Error occurred during repo '{}' removal: {}", key, statusHolder.getStatusMsg());
-                }
-            }
-        }
-    }
-
-    //TORE: [by YS] delete from the db directly - there's no need for permissions checks, events etc.
-    private StatusHolder deleteOrphanRepo(String repoKey) {
-        BasicStatusHolder status = new BasicStatusHolder();
-        StoringRepo storingRepo = storingRepositoryByKey(repoKey);
-        if (storingRepo == null) {
-            status.warn("Repo not found for deletion: " + repoKey, log);
-            return status;
-        }
-
-        //Delete all acl references to the repository being deleted
-        List<AclInfo> acls = aclService.getAllAcls();
-        for (AclInfo aclInfo : acls) {
-            MutablePermissionTargetInfo permissionTarget = InfoFactoryHolder.get().copyPermissionTarget
-                    (aclInfo.getPermissionTarget());
-            String cachedRepoKey = repoKey.concat(LocalCacheRepoDescriptor.PATH_SUFFIX); //for remote repos
-            List<String> repoKeys = permissionTarget.getRepoKeys();
-            if (repoKeys.remove(repoKey) || repoKeys.remove(cachedRepoKey)) {
-                MutableAclInfo mutableAclInfo = InfoFactoryHolder.get().copyAcl(aclInfo);
-                permissionTarget.setRepoKeys(repoKeys);
-                mutableAclInfo.setPermissionTarget(permissionTarget);
-
-                //In case that the DB returns null (e.g. permission target not found - already deleted by another thread),
-                //the repository deletion process will not be aborted
-                try {
-                    aclService.updateAcl(mutableAclInfo);
-                } catch (DBEntityNotFoundException e) {
-                    log.warn(e.getMessage());
-                    log.debug("Permission target or ACL was not found in the database", e);
-                }
-            }
-        }
-
-        MutableVfsFolder rootFolder = storingRepo.getMutableFolder(storingRepo.getRepoPath(""));
-        if (rootFolder == null) {
-            status.warn("Root folder not found for deletion: " + repoKey, log);
-            return status;
-        }
-
-        rootFolder.deleteIncludingRoot();
-        return status;
-    }
-
-    private Set<String> getConfigRepoKeys(CentralConfigDescriptor descriptor) {
-        Set<String> repoKeys = new HashSet<>();
-        repoKeys.addAll(descriptor.getLocalRepositoriesMap().keySet());
-        repoKeys.addAll(descriptor.getRemoteRepositoriesMap().keySet());
-        repoKeys.addAll(descriptor.getVirtualRepositoriesMap().keySet());
-        repoKeys.addAll(descriptor.getDistributionRepositoriesMap().keySet());
-        return repoKeys;
-    }
-
-    @Override
-    public void destroy() {
-        List<Repo> repos = Lists.newArrayList();
-        repos.addAll(getVirtualRepositories());
-        repos.addAll(getLocalAndRemoteRepositories());
-        for (Repo repo : repos) {
-            try {
-                repo.destroy();
-            } catch (Exception e) {
-                log.error("Error while destroying the repository '{}'.", repo, e);
-            }
-        }
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-    }
-
-    private void rebuildRepositories() {
-        //Create the repository objects from the descriptor
-        CentralConfigDescriptor centralConfig = centralConfigService.getDescriptor();
-        InternalRepositoryService transactionalMe = getTransactionalMe();
-
-        //Trashcan
-        rebuildTrashcan(centralConfig, transactionalMe);
-
-        //Locals
-        Map<String, LocalRepoDescriptor> localRepoDescriptorMap =
-                rebuildLocalRepositories(centralConfig, transactionalMe);
-
-        // Remotes and caches
-        Map<String, RemoteRepoDescriptor> remoteRepoDescriptorMap =
-                rebuildRemoteAndCacheRepositories(centralConfig, transactionalMe);
-
-        // Virtuals
-        rebuildVirtualRepositories(centralConfig, transactionalMe, localRepoDescriptorMap, remoteRepoDescriptorMap);
-
-        //Distribution
-        rebuildDistributionRepositories(centralConfig, transactionalMe);
-
-        initAllRepoKeysCache();
-    }
-
-    private void rebuildTrashcan(CentralConfigDescriptor centralConfig, InternalRepositoryService transactionalMe) {
-        DbLocalRepo oldTrashcanRepo = null;
-        if (trashcan != null) {
-            oldTrashcanRepo = (DbLocalRepo<TrashRepoDescriptor>) trashcan;
-        }
-        TrashRepoDescriptor trashRepoDescriptor = new TrashRepoDescriptor(TrashService.TRASH_KEY, getSimpleLayout(centralConfig));
-        trashcan = new DbLocalRepo<>(trashRepoDescriptor, transactionalMe, oldTrashcanRepo);
-        trashcan.init();
-    }
-
-    private Map<String, LocalRepoDescriptor> rebuildLocalRepositories(CentralConfigDescriptor centralConfig, InternalRepositoryService transactionalMe) {
-        Map<String, LocalRepoDescriptor> localRepoDescriptorMap = centralConfig.getLocalRepositoriesMap();
-        Map<String, LocalRepo> newLocalRepositoriesMap = Maps.newLinkedHashMap();
-        for (LocalRepoDescriptor repoDescriptor : localRepoDescriptorMap.values()) {
-            DbLocalRepo<LocalRepoDescriptor> oldLocalRepo = null;
-            String key = repoDescriptor.getKey();
-            if (!localRepositoriesMap.isEmpty()) {
-                LocalRepo oldRepo = localRepositoriesMap.get(key);
-                if (oldRepo != null) {
-                    if (!(oldRepo instanceof DbLocalRepo)) {
-                        log.error("Reloading configuration did not find local repository " + key);
-                    } else {
-                        //noinspection unchecked
-                        oldLocalRepo = (DbLocalRepo<LocalRepoDescriptor>) oldRepo;
-                    }
-                } else {
-                    // This could be a new repo that is in the newly saved config but not in the global map yet.
-                    // Only if we do not find it there as well then it is an error
-                    LocalRepoDescriptor newLocalRepo = centralConfig.getLocalRepositoriesMap().get(key);
-                    if (newLocalRepo == null) {
-                        log.error("Reloading configuration did not find local repository " + key);
-                    }
-                }
-            }
-            LocalRepo repo = new DbLocalRepo<>(repoDescriptor, transactionalMe, oldLocalRepo);
-            try {
-                repo.init();
-            } catch (Exception e) {
-                log.error("Failed to initialize local repository '{}'. Repository will be blacked-out", repo.getKey(),
-                        e);
-                ((LocalRepoDescriptor) repo.getDescriptor()).setBlackedOut(true);
-            }
-            newLocalRepositoriesMap.put(repo.getKey(), repo);
-        }
-        localRepositoriesMap = newLocalRepositoriesMap;
-        return localRepoDescriptorMap;
-    }
-
-    private Map<String, RemoteRepoDescriptor> rebuildRemoteAndCacheRepositories(CentralConfigDescriptor centralConfig, InternalRepositoryService transactionalMe) {
-        // stop remote repo online monitors
-        remoteRepositoriesMap.values().forEach(RemoteRepo::cleanupResources);
-
-        Map<String, LocalCacheRepo> newMap =  Maps.newLinkedHashMap();
-        Map<String, RemoteRepoDescriptor> remoteRepoDescriptorMap = centralConfig.getRemoteRepositoriesMap();
-        Map<String, RemoteRepo> newRemoteRepositoriesMap = Maps.newLinkedHashMap();
-        NuGetAddon nuGetAddon = addonsManager.addonByType(NuGetAddon.class);
-        for (RemoteRepoDescriptor repoDescriptor : remoteRepoDescriptorMap.values()) {
-            RemoteRepo remoteRepo = nuGetAddon.createRemoteRepo(transactionalMe, repoDescriptor,
-                    centralConfig.isOfflineMode(), remoteRepositoriesMap.get(repoDescriptor.getKey()));
-            try {
-                remoteRepo.init();
-            } catch (Exception e) {
-                log.error("Failed to initialize remote repository '" + remoteRepo.getKey() + "'. " +
-                        "Repository will be blacked-out!", e);
-                ((HttpRepoDescriptor) remoteRepo.getDescriptor()).setBlackedOut(true);
-            }
-            newRemoteRepositoriesMap.put(remoteRepo.getKey(), remoteRepo);
-            if (remoteRepo.isStoreArtifactsLocally()) {
-                LocalCacheRepo localCacheRepo = remoteRepo.getLocalCacheRepo();
-                if (localCacheRepo != null) {
-                    newMap.put(localCacheRepo.getKey(), localCacheRepo);
-                }
-            }
-        }
-        localCacheRepositoriesMap=newMap;
-        remoteRepositoriesMap=newRemoteRepositoriesMap;
-        return remoteRepoDescriptorMap;
-    }
-
-    private void rebuildVirtualRepositories(CentralConfigDescriptor centralConfig, InternalRepositoryService transactionalMe, Map<String, LocalRepoDescriptor> localRepoDescriptorMap, Map<String, RemoteRepoDescriptor> remoteRepoDescriptorMap) {
-        // Build the virtual repo cache in new map and once the map is read, replace it atomically
-        Map<String, VirtualRepo> newMap = Maps.newLinkedHashMap();
-        rebuildGlobalVirtualRepoIfNeeded(localRepoDescriptorMap, remoteRepoDescriptorMap, transactionalMe,newMap);
-
-        Map<String, VirtualRepoDescriptor> virtualRepoDescriptorMap = centralConfig.getVirtualRepositoriesMap();
-        WebstartAddon webstartAddon = addonsManager.addonByType(WebstartAddon.class);
-        for (VirtualRepoDescriptor repoDescriptor : virtualRepoDescriptorMap.values()) {
-            VirtualRepo repo = webstartAddon.createVirtualRepo(transactionalMe, repoDescriptor);
-            newMap.put(repo.getKey(), repo);
-        }
-        for (VirtualRepo virtualRepo : newMap.values()) {
-            virtualRepo.updateRepos(newMap);
-        }
-
-        // 2. call the init method only after all virtual repos exist
-        for (VirtualRepo virtualRepo : newMap.values()) {
-            virtualRepo.init();
-        }
-        virtualRepositoriesMap=newMap;
-    }
-
-    private void rebuildDistributionRepositories(CentralConfigDescriptor centralConfig,
-            InternalRepositoryService transactionalMe) {
-        Map<String, DistributionRepoDescriptor> distRepoDescriptorMap = centralConfig.getDistributionRepositoriesMap();
-        Map<String, DistributionRepo> newDistRepositoriesMap = Maps.newLinkedHashMap();
-        for (DistributionRepoDescriptor repoDescriptor : distRepoDescriptorMap.values()) {
-            DistributionRepo oldDistRepo = null;
-            String key = repoDescriptor.getKey();
-            if (!distributionRepositoriesMap.isEmpty()) {
-                DistributionRepo oldRepo = distributionRepositoriesMap.get(key);
-                if (oldRepo != null) {
-                    //noinspection unchecked
-                    oldDistRepo = oldRepo;
-                } else {
-                    // This could be a new repo that is in the newly saved config but not in the global map yet.
-                    // Only if we do not find it there as well then it is an error
-                    DistributionRepoDescriptor newDistRepo = centralConfig.getDistributionRepositoriesMap().get(key);
-                    if (newDistRepo == null) {
-                        log.error("Reloading configuration did not find local repository " + key);
-                    }
-                }
-            }
-            DistributionRepo repo = new DistributionRepo(repoDescriptor, transactionalMe, oldDistRepo);
-            try {
-                repo.init();
-            } catch (Exception e) {
-                log.error("Failed to initialize local repository '{}'. Repository will be blacked-out", repo.getKey(),
-                        e);
-                repo.getDescriptor().setBlackedOut(true);
-            }
-            newDistRepositoriesMap.put(repo.getKey(), repo);
-        }
-        distributionRepositoriesMap.clear();
-        distributionRepositoriesMap.putAll(newDistRepositoriesMap);
-    }
-
-    private RepoLayout getSimpleLayout(CentralConfigDescriptor configDescriptor) {
-        return configDescriptor.getRepoLayouts().stream()
-                .filter(repoLayout -> "simple-default".equals(repoLayout.getName()))
-                .findFirst().orElse(null);
-    }
-
-    private void rebuildGlobalVirtualRepoIfNeeded(Map<String, LocalRepoDescriptor> localRepos,
-                                                  Map<String, RemoteRepoDescriptor> remoteRepos, InternalRepositoryService transactionalMe, Map<String, VirtualRepo> newMap) {
-        List<RepoDescriptor> localAndRemoteRepoDescriptors = new ArrayList<>();
-        localAndRemoteRepoDescriptors.addAll(localRepos.values());
-        localAndRemoteRepoDescriptors.addAll(remoteRepos.values());
-        VirtualRepoDescriptor vrd = new VirtualRepoDescriptor();
-        vrd.setRepositories(localAndRemoteRepoDescriptors);
-        vrd.setArtifactoryRequestsCanRetrieveRemoteArtifacts(
-                ConstantValues.artifactoryRequestsToGlobalCanRetrieveRemoteArtifacts.getBoolean());
-        vrd.setKey(VirtualRepoDescriptor.GLOBAL_VIRTUAL_REPO_KEY);
-        // create and init the global virtual repo
-        VirtualRepo globalVirtualRepo = new VirtualRepo(vrd, transactionalMe);
-        // no need to call globalVirtualRepo.init()
-        globalVirtualRepo.initStorage();
-
-        newMap.put(globalVirtualRepo.getKey(), globalVirtualRepo);
-    }
-
-    @Override
-    public List<ItemInfo> getChildrenDeeply(RepoPath path) {
-        List<ItemInfo> result = Lists.newArrayList();
-        if (path == null) {
-            return result;
-        }
-        if (!hasChildren(path)) {
-            return result;
-        }
-        List<ItemInfo> children = getChildren(path);
-        for (ItemInfo child : children) {
-            result.add(child);
-            result.addAll(getChildrenDeeply(child.getRepoPath()));
-        }
-        return result;
-    }
-
-    @Override
-    public ModuleInfo getItemModuleInfo(RepoPath repoPath) {
-        Repo repo = assertRepoKey(repoPath);
-        return repo.getItemModuleInfo(repoPath.getPath());
-    }
-
-    private Repo assertRepoKey(RepoPath repoPath) {
-        String repoKey = repoPath.getRepoKey();
-        Repo repo = repositoryByKey(repoKey);
-        if (repo == null) {
-            throw new IllegalArgumentException("Repository '" + repoKey + "' not found!");
-        }
-        return repo;
-    }
-
-    @Override
-    public boolean mkdirs(RepoPath folderRepoPath) {
-        StoringRepo storingRepo = storingRepositoryByKey(folderRepoPath.getRepoKey());
-        if (!storingRepo.itemExists(folderRepoPath.getPath())) {
-            MutableVfsFolder folder = storingRepo.createOrGetFolder(folderRepoPath);
-            return folder.isNew();
-        }
-        return false;
-    }
-
-    @Override
-    public boolean virtualItemExists(RepoPath repoPath) {
-        VirtualRepo virtualRepo = virtualRepositoryByKey(repoPath.getRepoKey());
-        if (virtualRepo == null) {
-            throw new RepositoryRuntimeException("Repository " + repoPath.getRepoKey() + " does not exists!");
-        }
-        return virtualRepo.virtualItemExists(repoPath.getPath());
-    }
-
-    @Override
-    @Nonnull
-    public MutableVfsItem getMutableItem(RepoPath repoPath) {
-        //TORE: [by YS] should be storing repo once interfaces refactoring is done
-        LocalRepo localRepo = localOrCachedRepositoryByKey(repoPath.getRepoKey());
-        if (localRepo != null) {
-            MutableVfsItem mutableFsItem = localRepo.getMutableFsItem(repoPath);
-            if (mutableFsItem != null) {
-                return mutableFsItem;
-            }
-        }
-        throw new ItemNotFoundRuntimeException(repoPath);
-    }
-
-    private MutableVfsFile getMutableFile(RepoPath repoPath) {
-        MutableVfsItem mutableItem = getMutableItem(repoPath);
-        if (!(mutableItem instanceof MutableVfsFile)) {
-            throw new FileExpectedException(repoPath);
-        }
-        return (MutableVfsFile) mutableItem;
-    }
-
-    @Override
-    @Nullable
-    public StatsInfo getStatsInfo(RepoPath repoPath) {
-        if (!authService.canRead(repoPath)) {
-            AccessLogger.downloadDenied(repoPath);
-            return null;
-        }
-        return statsService.getStats(repoPath);
-    }
-
-    @Override
-    public long getArtifactCount(RepoPath repoPath) {
-        return fileService.getFilesCount(repoPath);
-    }
-
-    @Override
-    public long getNodesCount(RepoPath repoPath) {
-        return fileService.getNodesCount(repoPath);
-    }
-
-    @Override
-    public List<FileInfo> searchFilesWithBadChecksum(ChecksumType type) {
-        return fileService.searchFilesWithBadChecksum(type);
-    }
-
-    @Override
-    @Nonnull
-    public List<ItemInfo> getChildren(RepoPath repoPath) {
-        TreeBrowsingCriteria criteria = new TreeBrowsingCriteriaBuilder()
-                .sortAlphabetically().applySecurity().cacheChildren(false).build();
-        ItemNode rootNode = new ItemTree(repoPath, criteria).getRootNode();
-        if (rootNode != null) {
-            return rootNode.getChildrenInfo();
-        } else {
-            return Collections.emptyList();
-        }
-    }
-
-    @Override
-    public List<String> getChildrenNames(RepoPath repoPath) {
-        List<ItemInfo> childrenInfo = getChildren(repoPath);
-        List<String> childrenNames = Lists.newArrayListWithCapacity(childrenInfo.size());
-        for (ItemInfo itemInfo : childrenInfo) {
-            childrenNames.add(itemInfo.getName());
-        }
-        return childrenNames;
-    }
-
-    @Override
-    public boolean hasChildren(RepoPath repoPath) {
-        return fileService.hasChildren(repoPath);
-    }
-
-    @Override
-    public void saveFileInternal(RepoPath fileRepoPath, InputStream is) throws RepoRejectException, IOException {
-        try {
-            MutableFileInfo fileInfo = InfoFactoryHolder.get().createFileInfo(fileRepoPath);
-            fileInfo.createTrustedChecksums();
-            SaveResourceContext saveContext = new SaveResourceContext.Builder(new FileResource(fileInfo), is).build();
-            StoringRepo storingRepo = storingRepositoryByKey(fileRepoPath.getRepoKey());
-            if (storingRepo == null) {
-                throw new IllegalArgumentException("Storing repo for '" + fileRepoPath + "' not found");
-            }
-            saveResource(storingRepo, saveContext);
-        } finally {
-            IOUtils.closeQuietly(is);
-        }
-    }
-
-    @Override
-    public List<VirtualRepo> getVirtualRepositories() {
-        return new ArrayList<>(virtualRepositoriesMap.values());
-    }
-
-    @Override
-    public List<LocalRepo> getLocalAndCachedRepositories() {
-        Collection<LocalRepo> localRepos = localRepositoriesMap.values();
-        Collection<LocalCacheRepo> cacheRepos = localCacheRepositoriesMap.values();
-        List<LocalRepo> repos = new ArrayList<>(localRepos);
-        repos.addAll(cacheRepos);
-        return repos;
-    }
-
-    @Override
-    public List<RealRepo> getLocalAndRemoteRepositories() {
-        List<RealRepo> repos = new ArrayList<>();
-        repos.addAll(localRepositoriesMap.values());
-        repos.addAll(remoteRepositoriesMap.values());
-        return repos;
-    }
-
-    @Override
-    public List<LocalRepoDescriptor> getLocalAndCachedRepoDescriptors() {
-        return getLocalAndCachedRepositories().stream()
-                .map(localRepo -> (LocalRepoDescriptor) localRepo.getDescriptor()).collect(Collectors.toList());
-    }
-
-    @Override
-    public List<RemoteRepoDescriptor> getRemoteRepoDescriptors() {
-        return remoteRepositoriesMap.values().stream()
-                .map(remoteRepo -> (RemoteRepoDescriptor) remoteRepo.getDescriptor()).collect(Collectors.toList());
-    }
-
-    @Override
-    public VirtualRepoDescriptor virtualRepoDescriptorByKey(String repoKey) {
-        if (repoKey == null || repoKey.length() == 0) {
-            return null;
-        }
-        VirtualRepo virtualRepo = virtualRepositoriesMap.get(repoKey);
-        return virtualRepo != null ? virtualRepo.getDescriptor() : null;
-    }
-
-    @Override
-    public DistributionRepoDescriptor distributionRepoDescriptorByKey(String key) {
-        if (key == null || key.length() == 0) {
-            return null;
-        }
-        DistributionRepo distRepo = distributionRepositoriesMap.get(key);
-        return distRepo != null ? distRepo.getDescriptor() : null;
-    }
-
-    @Override
-    @Nonnull
-    public String getStringContent(FileInfo fileInfo) {
-        return getStringContent(fileInfo.getRepoPath());
-    }
-
-    @Override
-    @Nonnull
-    public String getStringContent(RepoPath repoPath) {
-        LocalRepo repo = localOrCachedRepositoryByKey(repoPath.getRepoKey());
-        if (repo == null) {
-            throw new IllegalArgumentException("Local repository for '" + repoPath + "' doesn't exist");
-        }
-        return repo.getTextFileContent(repoPath);
-    }
-
-    @Override
-    public ResourceStreamHandle getResourceStreamHandle(RepoPath repoPath) {
-        LocalRepo repo = localOrCachedRepositoryByKey(repoPath.getRepoKey());
-        if (repo == null) {
-            throw new IllegalArgumentException("Local repository for '" + repoPath + "' doesn't exist");
-        }
-        // Recreate the repo path for remote stream handle request
-        if (repo.isCache() && !repo.getKey().equals(repoPath.getRepoKey())) {
-            repoPath = InternalRepoPathFactory.cacheRepoPath(repoPath);
-        }
-        return repo.getFileContent(repoPath);
-    }
-
-    @Override
-    public ArchiveFileContent getArchiveFileContent(RepoPath archivePath, String sourceEntryPath) throws IOException {
-        LocalRepo repo = localOrCachedRepositoryByKey(archivePath.getRepoKey());
-        return new ArchiveContentRetriever().getArchiveFileContent(repo, archivePath, sourceEntryPath);
-    }
-
-    @Override
-    public ArchiveFileContent getGenericArchiveFileContent(RepoPath archivePath, String sourceEntryPath)
-            throws IOException {
-        LocalRepo repo = localOrCachedRepositoryByKey(archivePath.getRepoKey());
-        return new ArchiveContentRetriever().getGenericArchiveFileContent(repo, archivePath, sourceEntryPath);
-    }
-
-    /**
-     * Import all the repositories under the passed folder which matches local or cached repository declared in the
-     * configuration. Having empty directory for each repository is allowed and not an error. Nothing will be imported
-     * for those.
-     */
-    @Override
-    public void importAll(ImportSettingsImpl settings) {
-        RepositoryImportSettingsImpl repositoriesImportSettings =
-                new RepositoryImportSettingsImpl(settings.getBaseDir(), settings);
-        repositoriesImportSettings.setRepositories(getLocalAndCacheRepoKeys());
-        repositoriesImportSettings.setRepositoriesToDelete(Collections.<String>emptyList());
-        repositoriesImportSettings.setFailIfEmpty(false);
-        importRepositoriesFromSettings(repositoriesImportSettings);
-    }
-
-    /**
-     * Import the artifacts under the folder passed directly in the repository named "repoKey". If no repository with
-     * this repo key exists or if the folder passed is empty, the status will be set to error.
-     */
-    @Override
-    @SuppressWarnings({"ThrowableInstanceNeverThrown"})
-    public void importRepo(String repoKey, ImportSettingsImpl settings) {
-        RepositoryImportSettingsImpl singleRepoImportSettings =
-                new RepositoryImportSettingsImpl(settings.getBaseDir(), settings);
-        singleRepoImportSettings.setRepositories(Lists.newArrayList(repoKey));
-        singleRepoImportSettings.setSingleRepoImport(true);
-        importRepositoriesFromSettings(singleRepoImportSettings);
-    }
-
-    /**
-     * This method will delete and import all the local and cached repositories listed in the (newly loaded) config
-     * file. This action is resource intensive and is done in multiple transactions to avoid out of memory exceptions.
-     */
-    @Override
-    public void importFrom(ImportSettings settings) {
-        MutableStatusHolder status = settings.getStatusHolder();
-        File repoRootPath = getRepositoriesExportDir(settings.getBaseDir());
-        if (!repoRootPath.exists() || !repoRootPath.isDirectory()) {
-            if (settings.isFailIfEmpty()) {
-                throw new IllegalArgumentException(
-                        "Import root " + repoRootPath + " does not exist or not a directory");
-            } else {
-                status.status("No repositories root to import at " + repoRootPath, log);
-                return;
-            }
-        }
-        List<String> repositoryKeysForDeletion = getLocalAndCacheRepoKeys();
-        List<String> localRepoKeysForImport = settings.getRepositories();
-        if (localRepoKeysForImport.isEmpty()) {
-            localRepoKeysForImport = new ArrayList<>(repositoryKeysForDeletion);
-        }
-        RepositoryImportSettingsImpl repositoriesImportSettings = new RepositoryImportSettingsImpl(repoRootPath,
-                settings);
-        repositoriesImportSettings.setRepositories(localRepoKeysForImport);
-        repositoriesImportSettings.setRepositoriesToDelete(repositoryKeysForDeletion);
-        repositoriesImportSettings.setFailIfEmpty(false);
-        importRepositoriesFromSettings(repositoriesImportSettings);
-    }
-
-    private void importRepositoriesFromSettings(ImportSettingsImpl settings) {
-        String jobToken = "No Job";
-        boolean taskCompletion = false;
-        MutableStatusHolder status = settings.getStatusHolder();
-        try {
-            jobToken = createAndStartImportJob(settings);
-            taskCompletion = taskService.waitForTaskCompletion(jobToken);
-        } finally {
-            if (!taskCompletion && !status.isError()) {
-                // Add error of no completion
-                status.error("The task " + jobToken + " did not complete correctly.", log);
-            }
-        }
-    }
-
-    private String createAndStartImportJob(ImportSettingsImpl settings) {
-        TaskBase task = TaskUtils.createManualTask(ImportJob.class, 0L);
-        task.addAttribute(RepositoryImportSettingsImpl.class.getName(), settings);
-        return taskService.startTask(task, true);
-    }
-
-    @Override
-    public void exportTo(ExportSettings settings) {
-        MutableStatusHolder status = settings.getStatusHolder();
-        status.status("Exporting repositories...", log);
-        if (TaskCallback.currentTaskToken() == null) {
-            exportAsync(BaseSettings.FULL_SYSTEM, settings);
-        } else {
-            List<String> repoKeys = settings.getRepositories();
-            for (String repoKey : repoKeys) {
-                boolean stop = taskService.pauseOrBreak();
-                if (stop) {
-                    status.error("Export was stopped", log);
-                    return;
-                }
-                exportRepo(repoKey, settings);
-                if (status.isError() && settings.isFailFast()) {
-                    return;
-                }
-            }
-
-            if (settings.isIncremental()) {
-                File repositoriesDir = getRepositoriesExportDir(settings.getBaseDir());
-                cleanupIncrementalBackupDirectory(repositoriesDir, repoKeys);
-            }
-        }
-    }
-
-    @Override
-    public void exportRepo(String repoKey, ExportSettings settings) {
-        MutableStatusHolder status = settings.getStatusHolder();
-        if (TaskCallback.currentTaskToken() == null) {
-            exportAsync(repoKey, settings);
-        } else {
-            //Check if we need to break/pause
-            boolean stop = taskService.pauseOrBreak();
-            if (stop) {
-                status.error("Export was stopped on " + repoKey, log);
-                return;
-            }
-            LocalRepo sourceRepo = localOrCachedRepositoryByKey(repoKey);
-            if (sourceRepo == null) {
-                status.error("Export cannot be done on non existing repository " + repoKey, log);
-                return;
-            }
-            File targetDir = getRepoExportDir(settings.getBaseDir(), repoKey);
-            ExportSettingsImpl repoSettings = new ExportSettingsImpl(targetDir, settings);
-            sourceRepo.exportTo(repoSettings);
-        }
-    }
-
-    private File getRepoExportDir(File exportDir, String repoKey) {
-        return new File(getRepositoriesExportDir(exportDir), repoKey);
-    }
-
-    private File getRepositoriesExportDir(File exportDir) {
-        // the directory under the base export dir that contains the exported repositories
-        return new File(exportDir, "repositories");
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public MutableStatusHolder exportSearchResults(SavedSearchResults searchResults, ExportSettingsImpl baseSettings) {
-        return new DbRepoExportSearchHandler(searchResults, baseSettings).export();
-    }
-
-    @Override
-    @Nonnull
-    public ItemInfo getItemInfo(RepoPath repoPath) {
-        LocalRepo localRepo = getLocalRepository(repoPath);
-        VfsItem item = localRepo.getImmutableFsItem(repoPath);
-        if (item != null) {
-            return item.getInfo();
-        }
-        throw new ItemNotFoundRuntimeException("Item " + repoPath + " does not exist");
-    }
-
-    @Override
-    @Nonnull
-    public FileInfo getFileInfo(RepoPath repoPath) {
-        ItemInfo itemInfo = getItemInfo(repoPath);
-        if (itemInfo instanceof FileInfo) {
-            return (FileInfo) itemInfo;
-        } else {
-            throw new FileExpectedException(repoPath);
-        }
-    }
-
-    @Override
-    @Nonnull
-    public FolderInfo getFolderInfo(RepoPath repoPath) {
-        ItemInfo itemInfo = getItemInfo(repoPath);
-        if (itemInfo instanceof FolderInfo) {
-            return (FolderInfo) itemInfo;
-        } else {
-            throw new FolderExpectedException(repoPath);
-        }
-    }
-
-    @Override
-    public boolean exists(RepoPath repoPath) {
-        String repoKey = repoPath.getRepoKey();
-        LocalRepo localRepo = localOrCachedRepositoryByKey(repoKey);
-        return localRepo != null && localRepo.itemExists(repoPath.getPath());
-    }
-
-    @Override
-    public ItemMetaInfo getItemMetaInfo(RepoPath repoPath) {
-        return ContextHelper.get().beanForType(NodeMetaInfoService.class).getNodeMetaInfo(repoPath);
-    }
-
-    @Override
-    public boolean hasProperties(RepoPath repoPath) {
-        MutableVfsItem mutableSessionItem = LockingHelper.getIfWriteLockedByMe(repoPath);
-        if (mutableSessionItem != null) {
-            return mutableSessionItem.getProperties().isEmpty();
-        } else {
-            return ContextHelper.get().beanForType(PropertiesService.class).hasProperties(repoPath);
-        }
-    }
-
-    @Override
-    @Nullable
-    public Properties getProperties(RepoPath repoPath) {
-        if (!authService.canRead(repoPath)) {
-            AccessLogger.downloadDenied(repoPath);
-            return null;
-        }
-
-        MutableVfsItem mutableItem = LockingHelper.getIfWriteLockedByMe(repoPath);
-        if (mutableItem != null) {
-            return mutableItem.getProperties();
-        } else {
-            return ContextHelper.get().beanForType(PropertiesService.class).getProperties(repoPath);
-        }
-    }
-
-    @Override
-    public boolean setProperties(RepoPath repoPath, Properties properties) {
-        if (!assertCanAnnotate(repoPath, "Properties")) {
-            return false;
-        }
-        LocalRepo repository = getLocalRepository(repoPath);
-        MutableVfsItem mutableItem = repository.getMutableFsItem(repoPath);
-        if (mutableItem == null) {
-            log.warn("Cannot set properties on '{}': Item not found.", repoPath);
-            return false;
-        }
-
-        mutableItem.setProperties(properties);
-
-        ReplicationAddon replicationAddon = addonsManager.addonByType(ReplicationAddon.class);
-        replicationAddon.offerLocalReplicationPropertiesChangeEvent(repoPath);
-        return true;
-    }
-
-    @Override
-    public boolean removeProperties(RepoPath repoPath) {
-        return setProperties(repoPath, new PropertiesImpl());
-    }
-
-    private boolean assertCanAnnotate(RepoPath repoPath, String metadataName) {
-        if (!authService.canAnnotate(repoPath)) {
-            AccessLogger.annotateDenied(repoPath);
-            log.error("Cannot set '{}' on '{}': lacking annotate permissions.", metadataName, repoPath.getId());
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public MoveMultiStatusHolder moveWithoutMavenMetadata(RepoPath from, RepoPath to, boolean dryRun,
-                                                          boolean suppressLayouts,
-                                                          boolean failFast) {
-        MoverConfigBuilder configBuilder = new MoverConfigBuilder(from, to).copy(false).dryRun(dryRun).
-                executeMavenMetadataCalculation(false).atomic(true).suppressLayouts(suppressLayouts).failFast(failFast);
-        return moveOrCopy(configBuilder.build());
-    }
-
-    @Override
-    public ChecksumInfo setClientChecksum(LocalRepo repo, ChecksumType checksumType, RepoPath targetFileRepoPath,
-                                          String checksum) {
-        MutableVfsItem fsItem = repo.getMutableFsItem(targetFileRepoPath);
-        if (fsItem == null) {
-            throw new ItemNotFoundRuntimeException(targetFileRepoPath);
-        }
-        if (!fsItem.isFile()) {
-            throw new FileExpectedException(targetFileRepoPath);
-        }
-
-        if (!checksumType.isValid(checksum)) {
-            log.warn("Uploading non valid original checksum for {}", fsItem.getRepoPath());
-        }
-        MutableVfsFile vfsFile = (MutableVfsFile) fsItem;
-        vfsFile.setClientChecksum(checksumType, checksum);
-
-        // fire replication event for the client checksum
-        RepoPath checksumRepoPath = InternalRepoPathFactory.create(targetFileRepoPath.getRepoKey(),
-                targetFileRepoPath.getPath() + checksumType.ext());
-        addonsManager.addonByType(ReplicationAddon.class).offerLocalReplicationDeploymentEvent(checksumRepoPath);
-
-        return vfsFile.getInfo().getChecksumsInfo().getChecksumInfo(checksumType);
-    }
-
-    @Override
-    public MoveMultiStatusHolder move(RepoPath from, RepoPath to, boolean dryRun, boolean suppressLayouts,
-                                      boolean failFast) {
-        MoverConfigBuilder configBuilder = new MoverConfigBuilder(from, to).copy(false).dryRun(dryRun).
-                executeMavenMetadataCalculation(false).suppressLayouts(suppressLayouts).failFast(failFast).atomic(true);
-        MoveMultiStatusHolder status = moveOrCopy(configBuilder.build());
-        for (RepoPath folderPath : status.getCandidatesForMavenMetadataCalculation()) {
-            mavenMetadataService.calculateMavenMetadataAsync(folderPath, false);
-        }
-        return status;
-    }
-
-    @Override
-    public MoveMultiStatusHolder move(Set<RepoPath> pathsToMove, String targetLocalRepoKey,
-                                      Properties properties, boolean dryRun, boolean failFast) {
-        Set<RepoPath> pathsToMoveIncludingParents = aggregatePathsToMove(pathsToMove, targetLocalRepoKey, false);
-
-        log.debug("The following paths will be moved: {}", pathsToMoveIncludingParents);
-        // start moving each path separately, marking each folder or file's parent folder for metadata recalculation
-        MoveMultiStatusHolder status = new MoveMultiStatusHolder();
-        RepoPathMover mover = getMoveRepoPathService();
-        for (RepoPath pathToMove : pathsToMoveIncludingParents) {
-            RepoPath targetRepoPath = InternalRepoPathFactory.create(targetLocalRepoKey, pathToMove.getPath());
-            log.debug("Moving path: {} to {}", pathToMove, targetRepoPath);
-            mover.executeOperation(status, new MoverConfigBuilder(pathToMove, targetRepoPath).copy(false).dryRun(dryRun)
-                    .executeMavenMetadataCalculation(false).pruneEmptyFolders(true).properties(properties)
-                    .unixStyleBehavior(false).failFast(failFast).atomic(true).build());
-        }
-
-        for (RepoPath folderPath : status.getCandidatesForMavenMetadataCalculation()) {
-            mavenMetadataService.calculateMavenMetadataAsync(folderPath, false);
-        }
-
-        return status;
-    }
-
-    @Override
-    public MoveMultiStatusHolder copyMultiTx(RepoPath fromRepoPath, RepoPath targetRepoPath,
-                                             boolean dryRun, boolean suppressLayouts, boolean failFast) {
-        MoverConfigBuilder configBuilder = new MoverConfigBuilder(fromRepoPath, targetRepoPath).copy(true).
-                dryRun(dryRun).executeMavenMetadataCalculation(false).suppressLayouts(suppressLayouts).
-                failFast(failFast);
-        MoveMultiStatusHolder status = moveOrCopy(configBuilder.build());
-        for (RepoPath folderPath : status.getCandidatesForMavenMetadataCalculation()) {
-            mavenMetadataService.calculateMavenMetadataAsync(folderPath, false);
-        }
-        return status;
-    }
-
-    @Override
-    public MoveMultiStatusHolder moveMultiTx(RepoPath from, RepoPath to, boolean dryRun, boolean suppressLayouts,
-                                             boolean failFast) {
-        MoverConfigBuilder configBuilder = new MoverConfigBuilder(from, to).copy(false).dryRun(dryRun).
-                executeMavenMetadataCalculation(false).suppressLayouts(suppressLayouts).failFast(failFast);
-        MoveMultiStatusHolder status = moveOrCopy(configBuilder.build());
-        for (RepoPath folderPath : status.getCandidatesForMavenMetadataCalculation()) {
-            mavenMetadataService.calculateMavenMetadataAsync(folderPath, false);
-        }
-        return status;
-    }
-
-
-    @Override
-    public MoveMultiStatusHolder copy(RepoPath fromRepoPath, RepoPath targetRepoPath, boolean dryRun,
-                                      boolean suppressLayouts, boolean failFast) {
-        MoverConfigBuilder configBuilder = new MoverConfigBuilder(fromRepoPath, targetRepoPath).copy(true).
-                dryRun(dryRun).executeMavenMetadataCalculation(false).suppressLayouts(suppressLayouts).
-                failFast(failFast);
-        MoveMultiStatusHolder status = moveOrCopy(configBuilder.atomic(true).build());
-        for (RepoPath folderPath : status.getCandidatesForMavenMetadataCalculation()) {
-            mavenMetadataService.calculateMavenMetadataAsync(folderPath, false);
-        }
-        return status;
-    }
-
-    @Override
-    public MoveMultiStatusHolder copy(Set<RepoPath> pathsToCopy, String targetLocalRepoKey,
-                                      Properties properties, boolean dryRun, boolean failFast) {
-        Set<RepoPath> pathsToCopyIncludingParents = aggregatePathsToMove(pathsToCopy, targetLocalRepoKey, true);
-
-        log.debug("The following paths will be copied: {}", pathsToCopyIncludingParents);
-        //Start copying each path separately, marking each folder or file's parent folder for metadata recalculation
-        MoveMultiStatusHolder status = new MoveMultiStatusHolder();
-        RepoPathMover mover = getCopyRepoPathService();
-        for (RepoPath pathToCopy : pathsToCopyIncludingParents) {
-            RepoPath targetRepoPath = InternalRepoPathFactory.create(targetLocalRepoKey, pathToCopy.getPath());
-            log.debug("Copying path: {} to {}", pathToCopy, targetRepoPath);
-            mover.executeOperation(status, new MoverConfigBuilder(pathToCopy, targetRepoPath).copy(true).dryRun(dryRun)
-                    .executeMavenMetadataCalculation(false).pruneEmptyFolders(false).properties(properties)
-                    .unixStyleBehavior(false).failFast(failFast).atomic(true).build());
-        }
-
-        for (RepoPath folderPath : status.getCandidatesForMavenMetadataCalculation()) {
-            mavenMetadataService.calculateMavenMetadataAsync(folderPath, false);
-        }
-
-        return status;
-    }
-
-    private MoveMultiStatusHolder moveOrCopy(MoverConfig config) {
-        MoveMultiStatusHolder status = new MoveMultiStatusHolder();
-        // copy or move service
-        if (config.isCopy()) {
-            getCopyRepoPathService().executeOperation(status, config);
-        } else {
-            getMoveRepoPathService().executeOperation(status, config);
-        }
-        return status;
-    }
-
-
-    /**
-     * Returns an instance of the Repo Path Mover
-     *
-     * @return RepoPathMover
-     */
-    private RepoPathMover getMoveRepoPathService() {
-        return ContextHelper.get().beanForType(MoveRepoPathService.class);
-    }
-
-    /**
-     * Returns an instance of the Repo Path Mover
-     *
-     * @return RepoPathMover
-     */
-    private RepoPathMover getCopyRepoPathService() {
-        return ContextHelper.get().beanForType(CopyRepoPathService.class);
-    }
-
-    @Override
-    public StatusHolder deploy(RepoPath repoPath, InputStream inputStream) {
-        try {
-            ArtifactoryDeployRequest request = new ArtifactoryDeployRequestBuilder(repoPath)
-                    .inputStream(inputStream).build();
-            InternalArtifactoryResponse response = new InternalArtifactoryResponse();
-            uploadService.upload(request, response);
-            return response.getStatusHolder();
-        } catch (Exception e) {
-            String msg = String.format("Cannot deploy to '{%s}'.", repoPath);
-            log.debug(msg, e);
-            throw new RepositoryRuntimeException(msg, e);
-        }
-    }
-
-    @Override
-    public FileInfo getVirtualFileInfo(RepoPath virtualRepoPath) {
-        VirtualRepo virtualRepo = virtualRepositoryByKey(virtualRepoPath.getRepoKey());
-        if (virtualRepo == null) {
-            throw new IllegalArgumentException(virtualRepoPath.getRepoKey() + " is not a virtual repository.");
-        }
-        Set<LocalRepo> resolvedLocalRepos = virtualRepo.getResolvedLocalAndCachedRepos();
-        for (LocalRepo resolvedLocalRepo : resolvedLocalRepos) {
-            if (resolvedLocalRepo.itemExists(virtualRepoPath.getPath())) {
-                return getFileInfo(resolvedLocalRepo.getRepoPath(virtualRepoPath.getPath()));
-            }
-        }
-
-        throw new ItemNotFoundRuntimeException("Item " + virtualRepoPath + " does not exists");
-    }
-
-    @Override
-    public ItemInfo getVirtualItemInfo(RepoPath virtualRepoPath) {
-        VirtualRepo virtualRepo = virtualRepositoryByKey(virtualRepoPath.getRepoKey());
-        if (virtualRepo == null) {
-            throw new IllegalArgumentException(virtualRepoPath.getRepoKey() + " is not a virtual repository.");
-        }
-        Set<LocalRepo> resolvedLocalRepos = virtualRepo.getResolvedLocalAndCachedRepos();
-        for (LocalRepo resolvedLocalRepo : resolvedLocalRepos) {
-            if (resolvedLocalRepo.itemExists(virtualRepoPath.getPath())) {
-                return getItemInfo(resolvedLocalRepo.getRepoPath(virtualRepoPath.getPath()));
-            }
-        }
-
-        throw new ItemNotFoundRuntimeException("Item " + virtualRepoPath + " does not exists");
-    }
-
-    @Override
-    public List<RepoDescriptor> getVirtualResolvedLocalAndCacheDescriptors(String virtualRepoKey) {
-        VirtualRepo virtualRepo = virtualRepositoryByKey(virtualRepoKey);
-        if (virtualRepo != null) {
-            return virtualRepo.getResolvedLocalAndCachedRepos().stream()
-                    .map(Repo::getDescriptor).collect(Collectors.toList());
-        }
-        return Lists.newArrayList();
-    }
-
-    @Override
-    public BasicStatusHolder undeploy(RepoPath repoPath, boolean calcMavenMetadata) {
-        return undeploy(repoPath, calcMavenMetadata, false);
-    }
-
-    @Override
-    public BasicStatusHolder undeploy(RepoPath repoPath, boolean calcMavenMetadata, boolean pruneEmptyFolders) {
-        String repoKey = repoPath.getRepoKey();
-        StoringRepo storingRepo = storingRepositoryByKey(repoKey);
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-        if (storingRepo == null) {
-            statusHolder.error("Could find storing repository by key '" + repoKey + "'", log);
-            return statusHolder;
-        }
-        PathDeletionContext pathDeletionContext = new PathDeletionContext.Builder(storingRepo, repoPath.getPath(),
-                statusHolder).assertOverwrite(false).build();
-        assertDelete(pathDeletionContext);
-        if (!statusHolder.isError()) {
-            try {
-                storingRepo.undeploy(new DeleteContext(repoPath).calculateMavenMetadata(calcMavenMetadata));
-            } catch (CancelException e) {
-                statusHolder.error("Undeploy was canceled by user plugin", e.getErrorCode(), e, log);
-            }
-        }
-
-        if (pruneEmptyFolders && !repoPath.isRoot()) {
-            pruneService.prune(repoPath.getParent());
-        }
-
-        return statusHolder;
-    }
-
-    @Override
-    public BasicStatusHolder undeployMultiTransaction(RepoPath repoPath) {
-        String repoKey = repoPath.getRepoKey();
-        StoringRepo storingRepo = storingRepositoryByKey(repoKey);
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-        if (storingRepo == null) {
-            statusHolder.error("Could find storing repository by key '" + repoKey + "'", log);
-            return statusHolder;
-        }
-        PathDeletionContext pathDeletionContext = new PathDeletionContext.Builder(storingRepo, repoPath.getPath(),
-                statusHolder).assertOverwrite(false).build();
-        assertDelete(pathDeletionContext);
-        if (!statusHolder.isError()) {
-            ItemInfo itemInfo = getItemInfo(repoPath);
-            return undeploySingleItemTransactions(itemInfo.getRepoPath(), true, statusHolder);
-        }
-
-        return statusHolder;
-    }
-
-    /**
-     * delete single items leaf only by single trx for each item
-     *
-     * @param repoPath          - repo path
-     * @param calcMavenMetadata - if true calculate meta data
-     * @return
-     */
-    private BasicStatusHolder undeploySingleItemTransactions(RepoPath repoPath, boolean calcMavenMetadata, BasicStatusHolder statusHolder) {
-        BasicStatusHolder deleteItemStatusHolder;
-        if (repoPath.isFile()) {
-            deleteItemStatusHolder = deleteSingleLeaf(repoPath, calcMavenMetadata, statusHolder);
-        } else {// folder
-            deleteItemStatusHolder = deleteFoldersLeafsBySingleTrx(repoPath, calcMavenMetadata, statusHolder);
-        }
-        return deleteItemStatusHolder;
-    }
-
-    /**
-     * iterate folder leaf and delete is as single trx
-     *
-     * @param repoPath - folder repo path
-     */
-    private BasicStatusHolder deleteFoldersLeafsBySingleTrx(RepoPath repoPath, boolean calcMavenMetadata, BasicStatusHolder statusHolder) {
-        FileService fileService = ContextHelper.get().beanForType(FileService.class);
-        List<ItemInfo> children = fileService.loadChildren(repoPath);
-        //delete folder children
-        for (ItemInfo child : children) {
-            RepoPath childRepoPath = child.getRepoPath();
-            undeploySingleItemTransactions(childRepoPath, false, statusHolder);
-        }
-        // delete empty folder
-        return deleteSingleLeaf(repoPath, calcMavenMetadata, statusHolder);
-    }
-
-    /**
-     * delete leaf as single trx
-     *
-     * @param repoPath          - file ((leaf) repo path
-     * @param calcMavenMetadata
-     */
-    private BasicStatusHolder deleteSingleLeaf(RepoPath repoPath, boolean calcMavenMetadata, BasicStatusHolder statusHolder) {
-        return getTransactionalMe().undeployInTx(repoPath, calcMavenMetadata, statusHolder);
-    }
-
-    @Override
-    public BasicStatusHolder undeployInTx(RepoPath repoPath, boolean calcMavenMetadata,
-            BasicStatusHolder statusHolder) {
-        StoringRepo storingRepo = storingRepositoryByKey(repoPath.getRepoKey());
-        try {
-            storingRepo.undeploy(new DeleteContext(repoPath).calculateMavenMetadata(calcMavenMetadata));
-        } catch (CancelException e) {
-            statusHolder.error("Undeploy was canceled by user plugin", e.getErrorCode(), e, log);
-        }
-        return statusHolder;
-    }
-
-    @Override
-    public BasicStatusHolder undeploy(RepoPath repoPath) {
-        return undeploy(repoPath, true);
-    }
-
-    @Override
-    public StatusHolder undeployVersionUnits(Set<VersionUnit> versionUnits) {
-        BasicStatusHolder status = new BasicStatusHolder();
-        InternalRepositoryService transactionalMe = getTransactionalMe();
-
-        Set<RepoPath> pathsForMavenMetadataCalculation = Sets.newHashSet();
-
-        for (VersionUnit versionUnit : versionUnits) {
-            Set<RepoPath> repoPaths = versionUnit.getRepoPaths();
-            if (repoPaths.stream().filter(authService::canDelete).count() != repoPaths.size()) {
-                status.warn("User " + authService.currentUsername() + " doesn't have permission to delete one or more "
-                        + "the paths associated with module '" + versionUnit.getModuleInfo().getPrettyModuleId()
-                        + "', it will not be removed.", log);
-                continue;
-            }
-            for (RepoPath repoPath : repoPaths) {
-                BasicStatusHolder holder = transactionalMe.undeploy(repoPath, false, true);
-                status.merge(holder);
-                if (NamingUtils.isPom(repoPath.getPath())) {
-                    // We need to re-calculate the artifact id folder (which is the grandparent of the pom file)
-                    RepoPath grandparentFolder = RepoPathUtils.getAncestor(repoPath, 2);
-                    if (grandparentFolder != null) {
-                        pathsForMavenMetadataCalculation.add(grandparentFolder);
-                    }
-                }
-            }
-        }
-        // Check to make sure of existence, might have been removed through the iterations of the version units
-        pathsForMavenMetadataCalculation.stream()
-                .filter(this::exists)
-                .forEach(path -> mavenMetadataService.calculateMavenMetadataAsync(path, true));
-        return status;
-    }
-
-    @Override
-    public int zap(RepoPath repoPath) {
-        int zappedItems = 0;
-        LocalRepo localRepo = getLocalRepository(repoPath);
-        if (localRepo.isCache()) {
-            LocalCacheRepo cache = (LocalCacheRepo) localRepo;
-            zappedItems = cache.zap(repoPath);
-        } else {
-            log.warn("Got a zap request on a non-local-cache node '" + repoPath + "'.");
-        }
-        return zappedItems;
-    }
-
-    @Override
-    public List<FolderInfo> getWithEmptyChildren(FolderInfo folderInfo) {
-        FolderCompactor compactor = ContextHelper.get().beanForType(FolderCompactor.class);
-        return compactor.getFolderWithCompactedChildren(folderInfo);
-    }
-
-    @Override
-    public Set<String> getAllRepoKeys() {
-        return allRepoKeysCache;
-    }
-
-    @Override
-    public List<RepoDescriptor> getLocalAndRemoteRepoDescriptors() {
-        return getLocalAndRemoteRepositories().stream().map(Repo::getDescriptor).collect(Collectors.toList());
-    }
-
-    @Override
-    public boolean isAnonAccessEnabled() {
-        return authService.isAnonAccessEnabled();
-    }
-
-    @Override
-    public Repo repositoryByKey(String key) {
-        Repo repo = null;
-        if (localRepositoriesMap.containsKey(key)) {
-            repo = localRepositoriesMap.get(key);
-        } else if (localCacheRepositoriesMap.containsKey(key)) {
-            repo = localCacheRepositoriesMap.get(key);
-        } else if (remoteRepositoriesMap.containsKey(key)) {
-            repo = remoteRepositoriesMap.get(key);
-        } else if (virtualRepositoriesMap.containsKey(key)) {
-            repo = virtualRepositoriesMap.get(key);
-        } else if (distributionRepositoriesMap.containsKey(key)) {
-            repo = distributionRepositoriesMap.get(key);
-        } else if (trashcan != null && key.equals(trashcan.getKey())) {
-            repo = trashcan;
-        }
-        return repo;
-    }
-
-    @Override
-    public LocalRepo localRepositoryByKey(String key) {
-        if (key.equals(TrashService.TRASH_KEY)) {
-            return trashcan;
-        }
-        return localRepositoriesMap.get(key);
-    }
-
-    @Override
-    public RemoteRepo remoteRepositoryByKey(String key) {
-        return remoteRepositoriesMap.get(key);
-    }
-
-    @Override
-    public VirtualRepo virtualRepositoryByKey(String key) {
-        return virtualRepositoriesMap.get(key);
-    }
-
-    @Override
-    public DistributionRepo distributionRepoByKey(String key) {
-        return distributionRepositoriesMap.get(key);
-    }
-
-    @Override
-    @Nullable
-    public LocalRepo localOrCachedRepositoryByKey(String key) {
-        LocalRepo localRepo = localRepositoryByKey(key);
-        if (localRepo == null) {
-            RemoteRepo remoteRepo = remoteRepositoryByRemoteOrCacheKey(key);
-            if (remoteRepo != null && remoteRepo.isStoreArtifactsLocally()) {
-                localRepo = remoteRepo.getLocalCacheRepo();
-            }
-        }
-        if (localRepo == null) {
-            localRepo = distributionRepoByKey(key);
-        }
-        return localRepo;
-    }
-
-    private RemoteRepo remoteRepositoryByRemoteOrCacheKey(String key) {
-        RemoteRepo remoteRepo = remoteRepositoryByKey(key);
-        if (remoteRepo == null) {
-            //Try to get cached repositories
-            int idx = key.lastIndexOf(RepoPath.REMOTE_CACHE_SUFFIX);
-            //Get the cache either by <remote-repo-name> or by <remote-repo-name>-cache
-            if (idx > 1 && idx + RepoPath.REMOTE_CACHE_SUFFIX.length() == key.length()) {
-                remoteRepo = remoteRepositoryByKey(key.substring(0, idx));
-            }
-        }
-
-        return remoteRepo;
-    }
-
-    @Override
-    @SuppressWarnings({"unchecked"})
-    public <R extends Repo> RepoRepoPath<R> getRepoRepoPath(RepoPath repoPath) {
-        String repoKey = repoPath.getRepoKey();
-        if (repoKey.equals(TrashService.TRASH_KEY)) {
-            return new RepoRepoPath<>((R) trashcan, repoPath);
-        }
-        R repo = (R) repositoryByKey(repoKey);
-        if (repo == null) {
-            throw new IllegalArgumentException("Repository '" + repoKey + "' not found!");
-        }
-        return new RepoRepoPath<>(repo, repoPath);
-    }
-
-    @Override
-    public StoringRepo storingRepositoryByKey(String key) {
-        LocalRepo localRepo = localOrCachedRepositoryByKey(key);
-        if (localRepo != null) {
-            return localRepo;
-        } else {
-            return virtualRepositoryByKey(key);
-        }
-    }
-
-    @Override
-    public boolean isWriteLocked(RepoPath repoPath) {
-        StoringRepo storingRepo = storingRepositoryByKey(repoPath.getRepoKey());
-        return storingRepo != null && storingRepo.isWriteLocked(repoPath);
-    }
-
-    @Override
-    public List<ItemInfo> getOrphanItems(RepoPath repoPath) {
-        return fileService.getOrphanItems(repoPath);
-    }
-
-    @Override
-    public List<LocalRepoDescriptor> getLocalRepoDescriptors() {
-        return localRepositoriesMap.values().stream()
-                .map(localRepo -> (LocalRepoDescriptor) localRepo.getDescriptor()).collect(Collectors.toList());
-    }
-
-    @Override
-    public List<LocalCacheRepoDescriptor> getCachedRepoDescriptors() {
-        return localCacheRepositoriesMap.values().stream().map(Repo::getDescriptor).collect(Collectors.toList());
-    }
-
-    @Override
-    public List<DistributionRepoDescriptor> getDistributionRepoDescriptors() {
-        return distributionRepositoriesMap.values().stream().map(Repo::getDescriptor).collect(Collectors.toList());
-    }
-
-    @Override
-    public RepoDescriptor repoDescriptorByKey(String key) {
-        Repo repo = repositoryByKey(key);
-        return repo != null ? repo.getDescriptor() : null;
-    }
-
-    @Override
-    public LocalRepoDescriptor localRepoDescriptorByKey(String key) {
-        LocalRepo localRepo = localRepositoryByKey(key);
-        return localRepo != null ? (LocalRepoDescriptor) localRepo.getDescriptor() : null;
-    }
-
-    @Override
-    public LocalRepoDescriptor localOrCachedRepoDescriptorByKey(String key) {
-        LocalRepo localRepo = localOrCachedRepositoryByKey(key);
-        return localRepo != null ? (LocalRepoDescriptor) localRepo.getDescriptor() : null;
-    }
-
-    @Override
-    public LocalRepoDescriptor localCachedOrDistributionRepoDescriptorByKey(String repoKey) {
-        return Optional.ofNullable(localOrCachedRepoDescriptorByKey(repoKey))
-                .orElse(distributionRepoDescriptorByKey(repoKey));
-    }
-
-    @Override
-    public RemoteRepoDescriptor remoteRepoDescriptorByKey(String key) {
-        RemoteRepo remoteRepo = remoteRepositoryByKey(key);
-        return remoteRepo != null ? (RemoteRepoDescriptor) remoteRepo.getDescriptor() : null;
-    }
-
-    @Override
-    public List<VirtualRepoDescriptor> getVirtualRepoDescriptors() {
-        ArrayList<VirtualRepoDescriptor> list = new ArrayList<>();
-        list.addAll(getVirtualRepositories().stream().map(RepoBase::getDescriptor).collect(Collectors.toList()));
-        list.removeIf(virtualRepo -> {
-            boolean globalRepoDisabled = ConstantValues.disableGlobalRepoAccess.getBoolean();
-            boolean repoIsGlobal = VirtualRepoDescriptor.GLOBAL_VIRTUAL_REPO_KEY.equals(virtualRepo.getKey());
-            return globalRepoDisabled && repoIsGlobal;
-        });
-        return list;
-    }
-
-    @Override
-    public void assertValidDeployPath(ValidDeployPathContext validDeployPathContext) throws RepoRejectException {
-        LocalRepo repo = validDeployPathContext.getRepo();
-        RepoPath repoPath = validDeployPathContext.getRepoPath();
-        String path = repoPath.getPath();
-        if (!repo.getKey().equals(repoPath.getRepoKey())) {
-            // the repo path should point to the given repo (e.g, in case the repo path points to the remote repo)
-            repoPath = InternalRepoPathFactory.create(repo.getKey(), path, repoPath.isFolder());
-        }
-        BasicStatusHolder status = repo.assertValidPath(repoPath, false);
-        if (!status.isError()) {
-            // if it is metadata, assert annotate privileges. Maven metadata is treated as regular file
-            // (needs deploy permissions).
-            if (NamingUtils.isMetadata(path)) {
-                if (!authService.canAnnotate(repoPath)) {
-                    String msg = "User " + authService.currentUsername() + " is not permitted to annotate '" +
-                            path + "' on '" + repoPath + "'.";
-                    status.error(msg, HttpStatus.SC_FORBIDDEN, log);
-                    AccessLogger.annotateDenied(repoPath);
-                }
-            } else {
-                //Assert deploy privileges
-                boolean canDeploy = authService.canDeploy(repoPath);
-                if (!canDeploy) {
-                    String msg = "User " + authService.currentUsername() + " is not permitted to deploy '" +
-                            path + "' into '" + repoPath + "'.";
-                    status.error(msg, HttpStatus.SC_FORBIDDEN, log);
-                    AccessLogger.deployDenied(repoPath);
-                }
-            }
-            if (!status.isError()) {
-                PathDeletionContext pathDeletionContext = new PathDeletionContext.Builder(repo, path, status)
-                        .assertOverwrite(true).requestSha1(validDeployPathContext.getRequestSha1())
-                        .forceExpiryCheck(validDeployPathContext.isForceExpiryCheck()).build();
-                assertDelete(pathDeletionContext);
-            }
-
-            if (!status.isError()) {
-                // Assert that we don't exceed the user configured maximum storage size
-                assertStorageQuota(status, validDeployPathContext.getContentLength());
-            }
-        }
-        if (status.isError()) {
-            if (status.getException() != null) {
-                Throwable throwable = status.getException();
-                if (throwable instanceof RepoRejectException) {
-                    throw (RepoRejectException) throwable;
-                }
-                throw new RepoRejectException(throwable);
-            }
-            throw new RepoRejectException(status.getStatusMsg(), status.getStatusCode());
-        }
-    }
-
-    private void assertStorageQuota(MutableStatusHolder statusHolder, long contentLength) {
-        StorageQuotaInfo info = storageService.getStorageQuotaInfo(contentLength);
-        if (info == null) {
-            return;
-        }
-
-        if (info.isLimitReached()) {
-            // Note: don't display the disk usage in the status holder - this message is written back to the user
-            statusHolder.error(
-                    "Datastore disk usage is too high. Contact your Artifactory administrator to add additional " +
-                            "storage space or change the disk quota limits.", HttpStatus.SC_REQUEST_TOO_LONG, log
-            );
-
-            log.error(info.getErrorMessage());
-        } else if (info.isWarningLimitReached()) {
-            log.warn(info.getWarningMessage());
-        }
-    }
-
-    @Override
-    public <T extends RemoteRepoDescriptor> ResourceStreamHandle downloadAndSave(InternalRequestContext requestContext,
-                                                                                 RemoteRepo<T> remoteRepo, RepoResource res) throws IOException, RepoRejectException {
-        return remoteRepo.downloadAndSave(requestContext, res);
-    }
-
-    @Override
-    public RepoResource unexpireIfExists(LocalRepo localCacheRepo, String path) {
-        RepoResource resource = internalUnexpireIfExists(localCacheRepo, path);
-        if (resource == null) {
-            return new UnfoundRepoResource(InternalRepoPathFactory.create(localCacheRepo.getKey(), path),
-                    "Object is not in cache");
-        }
-        return resource;
-    }
-
-    @Override
-    public ResourceStreamHandle unexpireAndRetrieveIfExists(InternalRequestContext requestContext,
-                                                            LocalRepo localCacheRepo, String path) throws IOException, RepoRejectException {
-        RepoResource resource = internalUnexpireIfExists(localCacheRepo, path);
-        if (resource != null && resource.isFound()) {
-            return localCacheRepo.getResourceStreamHandle(requestContext, resource);
-        }
-        return null;
-    }
-
-    @Override
-    public ResourceStreamHandle getResourceStreamHandle(InternalRequestContext requestContext, Repo repo,
-                                                        RepoResource res) throws IOException, RepoRejectException {
-        if (res instanceof ResolvedResource) {
-            RepoRequests.logToContext("The requested resource is already resolved - using a string resource handle");
-            // resource already contains the content - just extract it and return a string resource handle
-            String content = ((ResolvedResource) res).getContent();
-            return new StringResourceStreamHandle(content);
-        } else {
-            RepoRequests.logToContext("The requested resource isn't pre-resolved");
-            RepoPath repoPath = res.getRepoPath();
-            if (repo.isReal()) {
-                RepoRequests.logToContext("Target repository isn't virtual - verifying that downloading is allowed");
-                //Permissions apply only to real repos
-                StatusHolder holder = ((RealRepo) repo).checkDownloadIsAllowed(repoPath);
-                if (holder.isError()) {
-                    RepoRequests.logToContext("Download isn't allowed - received status {} and message '%s'",
-                            holder.getStatusCode(), holder.getStatusMsg());
-                    throw new RepoRejectException(holder.getStatusMsg(), holder.getStatusCode());
-                }
-            }
-            return repo.getResourceStreamHandle(requestContext, res);
-        }
-    }
-
-    @Override
-    public RepoResource saveResource(StoringRepo repo, SaveResourceContext saveContext)
-            throws IOException, RepoRejectException {
-        // save binary early without opening DB transaction (except in full db mode)
-        SaveResourceContext newSaveContext;
-        try {
-            BinaryInfo binaryInfo;
-            InputStream in = saveContext.getInputStream();
-            if (in instanceof BinaryServiceInputStream) {
-                // input stream is from existing binary
-                binaryInfo = ((BinaryServiceInputStream) in).getBinaryInfo();
-            } else {
-                binaryInfo = binaryService.addBinary(in);
-            }
-            newSaveContext = new SaveResourceContext.Builder(saveContext)
-                    .binaryInfo(binaryInfo).build();
-        } catch (IOException e) {
-            saveContext.setException(e);    // signal error
-            throw e;
-        }
-
-        return getTransactionalMe().saveResourceInTransaction(repo, newSaveContext);
-    }
-
-    public String getSha1BySha2Property(String value) {
-        PropertySearchControls propertyControlSearch = getPropertyControlSearch("sha256", value);
-        ItemSearchResults<PropertySearchResult> searchResults = searchService.searchPropertyAql(propertyControlSearch);
-        if (!searchResults.getResults().isEmpty()) {
-            PropertySearchResult propertySearchResult = searchResults.getResults().get(0);
-            FileInfo itemInfo = (FileInfo) propertySearchResult.getItemInfo();
-            if (itemInfo != null) {
-                return itemInfo.getSha1();
-            }
-        }
-        return null;
-    }
-
-    /**
-     * update property control search
-     *
-     * @return property control search
-     */
-    private PropertySearchControls getPropertyControlSearch(String key, String value) {
-        PropertySearchControls propertySearchControls = new PropertySearchControls();
-        propertySearchControls.setSelectedRepoForSearch(new ArrayList<>());
-        propertySearchControls.setLimitSearchResults(true);
-        propertySearchControls.put(key, value, true);
-        return propertySearchControls;
-    }
-
-    @Override
-    public RepoResource saveResourceInTransaction(StoringRepo repo, SaveResourceContext saveContext)
-            throws IOException, RepoRejectException {
-        return repo.saveResource(saveContext);
-    }
-
-    @Override
-    public VersionSearchResults getVersionUnitsUnder(RepoPath repoPath) {
-        VersionUnitSearchControls controls = new VersionUnitSearchControls(repoPath);
-        return searchService.searchVersionUnits(controls);
-    }
-
-    @Override
-    public long getArtifactCount() throws RepositoryRuntimeException {
-        if (artifactCountRetriever == null) {
-            artifactCountRetriever = new ArtifactCountRetriever();
-        }
-        return artifactCountRetriever.getCount();
-    }
-
-    @Override
-    public List<VirtualRepoDescriptor> getVirtualReposContainingRepo(RepoDescriptor repoDescriptor) {
-        RepoDescriptor descriptor = repoDescriptor;
-        if (repoDescriptor instanceof LocalCacheRepoDescriptor) {
-            //VirtualRepoResolver does not directly support local cache repos, so if the items descriptor is a cache,
-            //We extract the caches remote repo, and use it instead
-            descriptor = ((LocalCacheRepoDescriptor) repoDescriptor).getRemoteRepo();
-        }
-
-        List<VirtualRepoDescriptor> reposToDisplay = new ArrayList<>();
-        List<VirtualRepoDescriptor> virtualRepos = getVirtualRepoDescriptors();
-        for (VirtualRepoDescriptor virtualRepo : virtualRepos) {
-            VirtualRepoResolver resolver = new VirtualRepoResolver(virtualRepo);
-            if (resolver.contains(descriptor)) {
-                reposToDisplay.add(virtualRepo);
-            }
-        }
-        return reposToDisplay;
-    }
-
-    /**
-     * Returns a list of local (non-cache) repo descriptors that the current user is permitted to deploy to.
-     *
-     * @return List of deploy-permitted local repos
-     */
-    @Override
-    public List<LocalRepoDescriptor> getDeployableRepoDescriptors() {
-        // if the user is an admin user, simply return all the deployable descriptors without checking specific
-        // permission targets.
-        if (authService.isAdmin()) {
-            return getLocalRepoDescriptors();
-        }
-        List<PermissionTargetInfo> permissionTargetInfos =
-                aclService.getPermissionTargets(ArtifactoryPermission.DEPLOY);
-        Set<LocalRepoDescriptor> permittedDescriptors = Sets.newHashSet();
-        Map<String, LocalRepoDescriptor> descriptorMap = centralConfigService.getDescriptor().getLocalRepositoriesMap();
-        for (PermissionTargetInfo permissionTargetInfo : permissionTargetInfos) {
-            List<String> repoKeys = permissionTargetInfo.getRepoKeys();
-            if (repoKeys.contains(PermissionTargetInfo.ANY_REPO) ||
-                    repoKeys.contains(PermissionTargetInfo.ANY_LOCAL_REPO)) {
-                // return the list of all local repositories
-                return getLocalRepoDescriptors();
-            }
-            for (String repoKey : repoKeys) {
-                LocalRepoDescriptor permittedDescriptor = descriptorMap.get(repoKey);
-                if (permittedDescriptor != null) {
-                    permittedDescriptors.add(permittedDescriptor);
-                }
-            }
-        }
-        return Lists.newArrayList(permittedDescriptors);
-    }
-
-    @Override
-    public boolean isRepoPathAccepted(RepoPath repoPath) {
-        LocalRepo repo = getLocalOrCachedRepository(repoPath);
-        return repo == null || repo.accepts(repoPath);
-    }
-
-    @Override
-    public boolean isRepoPathVisible(RepoPath repoPath) {
-        return (repoPath != null) && authService.canRead(repoPath) &&
-                (isRepoPathAccepted(repoPath) || authService.canAnnotate(repoPath));
-    }
-
-    @Override
-    public boolean isRepoPathHandled(RepoPath repoPath) {
-        String path = repoPath.getPath();
-        if (repoPath.isRoot()) {
-            return true;
-        }
-        LocalRepo repo = getLocalOrCachedRepository(repoPath);
-        return repo.handlesReleaseSnapshot(path);
-    }
-
-    @Override
-    public List<RemoteRepoDescriptor> getSharedRemoteRepoConfigs(String remoteUrl, Map<String, String> headersMap) {
-
-        List<RemoteRepoDescriptor> remoteRepos = Lists.newArrayList();
-        List<RepoDetails> remoteReposDetails = getSharedRemoteRepoDetails(remoteUrl, headersMap);
-        boolean hasDefaultProxy = centralConfigService.defaultProxyDefined();
-        ProxyDescriptor defaultProxy = centralConfigService.getMutableDescriptor().getDefaultProxy();
-        for (RepoDetails remoteRepoDetails : remoteReposDetails) {
-            String configurationUrl = remoteRepoDetails.getConfiguration();
-            if (org.apache.commons.lang.StringUtils.isNotBlank(configurationUrl)) {
-                RemoteRepoDescriptor remoteRepoConfig = getSharedRemoteRepoConfig(configurationUrl, headersMap);
-                if (remoteRepoConfig != null) {
-                    if (hasDefaultProxy && defaultProxy != null) {
-                        ((HttpRepoDescriptor) remoteRepoConfig).setProxy(defaultProxy);
-                    }
-                    RepoLayout repoLayout = remoteRepoConfig.getRepoLayout();
-
-                    //If there is no contained layout or if it doesn't exist locally, just add the default
-                    if ((repoLayout == null) ||
-                            centralConfigService.getDescriptor().getRepoLayout(repoLayout.getName()) == null) {
-                        remoteRepoConfig.setRepoLayout(RepoLayoutUtils.MAVEN_2_DEFAULT);
-                    }
-
-                    RepoLayout remoteRepoLayout = remoteRepoConfig.getRemoteRepoLayout();
-                    //If there is contained layout doesn't exist locally, remove it
-                    if ((remoteRepoLayout != null) &&
-                            centralConfigService.getDescriptor().getRepoLayout(remoteRepoLayout.getName()) == null) {
-                        remoteRepoConfig.setRemoteRepoLayout(null);
-                    }
-
-                    remoteRepos.add(remoteRepoConfig);
-                }
-            }
-        }
-
-        return remoteRepos;
-    }
-
-    @Override
-    public Tree<ZipEntryInfo> zipEntriesToTree(RepoPath zipPath) throws IOException {
-        LocalRepo localRepo = getLocalOrCachedRepository(zipPath);
-        VfsFile file = localRepo.getImmutableFile(zipPath);
-        ZipInputStream zin = null;
-        try {
-            Tree<ZipEntryInfo> tree;
-            zin = new ZipInputStream(file.getStream());
-            ZipEntry zipEntry;
-            tree = InfoFactoryHolder.get().createZipEntriesTree();
-            try {
-                while ((zipEntry = zin.getNextEntry()) != null) {
-                    tree.insert(InfoFactoryHolder.get().createZipEntry(zipEntry));
-                }
-                // IllegalArgumentException is being thrown from: java.util.zip.ZipInputStream.getUTF8String on a
-                // bad archive
-            } catch (IllegalArgumentException e) {
-                throw new IOException(
-                        "An error occurred while reading entries from zip file: " + file.getRepoPath());
-            }
-            return tree;
-        } finally {
-            IOUtils.closeQuietly(zin);
-        }
-    }
-
-    @Override
-    public ZipInputStream zipInputStream(RepoPath zipPath) throws IOException {
-        LocalRepo localRepo = getLocalOrCachedRepository(zipPath);
-        VfsFile file = localRepo.getImmutableFile(zipPath);
-        return new ZipInputStream(file.getStream());
-    }
-
-    @Override
-    public ArchiveInputStream archiveInputStream(RepoPath zipPath) throws IOException {
-        LocalRepo localRepo = getLocalOrCachedRepository(zipPath);
-        VfsFile file = localRepo.getImmutableFile(zipPath);
-        String zipSuffix = zipPath.getPath().toLowerCase();
-        return ZipUtils.returnArchiveInputStream(file.getStream(), zipSuffix);
-    }
-
-    @Override
-    public ItemInfo getLastModified(RepoPath pathToSearch) {
-        if (pathToSearch == null) {
-            throw new IllegalArgumentException("Repo path cannot be null.");
-        }
-        if (!exists(pathToSearch)) {
-            throw new ItemNotFoundRuntimeException("Could not find item: " + pathToSearch.getId());
-        }
-
-        return collectLastModified(pathToSearch);
-    }
-
-    private ItemInfo collectLastModified(RepoPath pathToSearch) {
-        TreeBrowsingCriteria criteria = new TreeBrowsingCriteriaBuilder().applySecurity().build();
-        ItemTree itemTree = new ItemTree(pathToSearch, criteria);
-        LinkedList<ItemNode> fringe = Lists.newLinkedList();
-        fringe.add(itemTree.getRootNode());
-        ItemInfo lastModified = null;
-        while (!fringe.isEmpty()) {
-            ItemNode last = fringe.removeLast();
-            if (last.hasChildren()) {
-                fringe.addAll(last.getChildren());
-            }
-            if (!last.isFolder()) {
-                if (lastModified == null || last.getItemInfo().getLastModified() > lastModified.getLastModified()) {
-                    lastModified = last.getItemInfo();
-                }
-            }
-        }
-        return lastModified;
-    }
-
-    @Override
-    public void touch(RepoPath repoPath) {
-        if (repoPath == null) {
-            throw new IllegalArgumentException("Repo path cannot be null.");
-        }
-        LocalRepo localOrCachedRepository = getLocalOrCachedRepository(repoPath);
-        if (localOrCachedRepository == null) {
-            throw new IllegalArgumentException(repoPath + " is not local or cache repository path");
-        }
-        MutableVfsItem mutableFsItem = localOrCachedRepository.getMutableFsItem(repoPath);
-        if (mutableFsItem == null) {
-            throw new ItemNotFoundRuntimeException("Could not find item: " + repoPath.getId());
-        }
-        mutableFsItem.setModified(System.currentTimeMillis());
-    }
-
-    @Override
-    public void fixChecksums(RepoPath fileRepoPath) {
-        MutableVfsFile mutableFile = getMutableFile(fileRepoPath);
-        FileInfo fileInfo = mutableFile.getInfo();
-        ChecksumsInfo checksumsInfo = fileInfo.getChecksumsInfo();
-        for (ChecksumInfo checksumInfo : checksumsInfo.getChecksums()) {
-            if (!checksumInfo.checksumsMatch()) {
-                mutableFile.setClientChecksum(checksumInfo.getType(), ChecksumInfo.TRUSTED_FILE_MARKER);
-            }
-        }
-    }
-
-    private void exportAsync(@Nonnull String repoKey, ExportSettings settings) {
-        MutableStatusHolder status = settings.getStatusHolder();
-        TaskBase task = TaskUtils.createManualTask(ExportJob.class, 0L, "Export Repository - " + repoKey);
-        task.addAttribute(Task.REPO_KEY, repoKey);
-        task.addAttribute(ExportSettingsImpl.class.getName(), settings);
-        taskService.startTask(task, true);
-        boolean completed = taskService.waitForTaskCompletion(task.getToken());
-        if (!completed) {
-            if (!status.isError()) {
-                // Add Error of no completion
-                status.error("The task " + task + " did not complete correctly", log);
-            }
-        }
-    }
-
-    @Override
-    @Nonnull
-    public LocalRepo getLocalRepository(RepoPath repoPath) {
-        String repoKey = repoPath.getRepoKey();
-        if (repoKey.equals(TrashService.TRASH_KEY)) {
-            return trashcan;
-        }
-        LocalRepo localRepo = Optional.ofNullable(localOrCachedRepositoryByKey(repoKey))
-                .orElse(distributionRepoByKey(repoKey));
-        if (localRepo == null) {
-            throw new IllegalArgumentException("Repository '" + repoKey + "' is not a local repository");
-        }
-        return localRepo;
-    }
-
-    private List<String> getLocalAndCacheRepoKeys() {
-        List<String> result = new ArrayList<>();
-        for (LocalRepoDescriptor localRepoDescriptor : getLocalAndCachedRepoDescriptors()) {
-            result.add(localRepoDescriptor.getKey());
-        }
-        for (String key : distributionRepositoriesMap.keySet()) {
-            result.add(key);
-        }
-        return result;
-    }
-
-    private void initAllRepoKeysCache() {
-        Set<String> newKeys = new HashSet<>();
-        newKeys.addAll(localRepositoriesMap.keySet());
-        newKeys.addAll(remoteRepositoriesMap.keySet());
-        newKeys.addAll(localCacheRepositoriesMap.keySet());
-        newKeys.addAll(virtualRepositoriesMap.keySet());
-        newKeys.addAll(distributionRepositoriesMap.keySet());
-        allRepoKeysCache = newKeys;
-    }
-
-    private RepoResource internalUnexpireIfExists(LocalRepo repo, String path) {
-        // Need to release the read lock first
-        RepoPath repoPath = InternalRepoPathFactory.create(repo.getKey(), path);
-        RepoPath fsItemRepoPath = NamingUtils.getLockingTargetRepoPath(repoPath);
-        // Write lock auto upgrade supported LockingHelper.releaseReadLock(fsItemRepoPath);
-        MutableVfsItem fsItem = repo.getMutableFsItem(fsItemRepoPath);
-        if (fsItem != null) {
-            log.debug("{}: falling back to using cache entry for resource info at '{}'.", this, path);
-            //Reset the resource age so it is kept being cached
-            fsItem.setUpdated(System.currentTimeMillis());
-            return repo.getInfo(new NullRequestContext(repoPath));
-        }
-        return null;
-    }
-
-    private void assertDelete(PathDeletionContext pathDeletionContext) {
-        StoringRepo repo = pathDeletionContext.getRepo();
-        String path = pathDeletionContext.getPath();
-        BasicStatusHolder status = pathDeletionContext.getStatus();
-        RepoPath repoPath = InternalRepoPathFactory.create(repo.getKey(), path);
-        //Check that has delete rights to replace an exiting item
-        if (repo.shouldProtectPathDeletion(pathDeletionContext)) {
-            if (!authService.canDelete(repoPath)) {
-                AccessLogger.deleteDenied(repoPath);
-                if (centralConfigService.getDescriptor().getSecurity().isHideUnauthorizedResources()) {
-                    status.error("Could not locate artifact '" + repoPath + "'.", HttpStatus.SC_NOT_FOUND, log);
-                } else {
-                    status.error("Not enough permissions to overwrite artifact '" + repoPath + "' (user '" +
-                                    authService.currentUsername() + "' needs DELETE permission).",
-                            HttpStatus.SC_FORBIDDEN,
-                            log
-                    );
-                }
-            }
-        }
-
-        //For deletion (as opposed to overwrite), check that path actually exists
-        if (!pathDeletionContext.isAssertOverwrite() && !repo.itemExists(repoPath.getPath())) {
-            status.error("Could not locate artifact '" + repoPath + "' (Nothing to delete).",
-                    HttpStatus.SC_NOT_FOUND, log);
-        }
-    }
-
-    // remove export folders of repositories that are not part of the current backup included repositories
-    // this cleanup is needed in incremental backup when a repository is excluded from the backup or removed
-
-    private void cleanupIncrementalBackupDirectory(File targetDir,
-                                                   List<String> reposToBackup) {
-        if (!targetDir.exists()) {
-            log.debug("Repositories backup directory doesn't exist: {}", targetDir.getAbsolutePath());
-            return; // nothing to clean
-        }
-        File[] childFiles = targetDir.listFiles();
-        for (File childFile : childFiles) {
-            String fileName = childFile.getName();
-            if (fileName.endsWith(METADATA_FOLDER)) {
-                continue;  // skip metadata folders, will delete them with the actual folder if needed
-            }
-            boolean includedInBackup = false;
-            for (String repoKey : reposToBackup) {
-                if (fileName.equals(repoKey)) {
-                    includedInBackup = true;
-                    break;
-                }
-            }
-            if (!includedInBackup) {
-                log.info("Deleting {} from the incremental backup dir since it is not part " +
-                        "of the backup included repositories", childFile.getAbsolutePath());
-                boolean deleted = FileUtils.deleteQuietly(childFile);
-                if (!deleted) {
-                    log.warn("Failed to delete {}", childFile.getAbsolutePath());
-                }
-                // now delete the metadata folder of the repository is it exists
-                File metadataFolder = new File(childFile.getParentFile(), childFile.getName() +
-                        METADATA_FOLDER);
-                if (metadataFolder.exists()) {
-                    deleted = FileUtils.deleteQuietly(metadataFolder);
-                    if (!deleted) {
-                        log.warn("Failed to delete metadata folder {}", metadataFolder.getAbsolutePath());
-                    }
-                }
-            }
-        }
-    }
-
-    private LocalRepo getLocalOrCachedRepository(RepoPath repoPath) {
-        return localOrCachedRepositoryByKey(repoPath.getRepoKey());
-    }
-
-    /**
-     * check if repo exist already in case a new repo is created
-     *
-     * @param repoPath
-     * @return true if exist in cache
-     */
-    @Override
-    public boolean isRepoExistInCache(RepoPath repoPath) {
-        return getLocalOrCachedRepository(repoPath) != null;
-    }
-
-    /**
-     * Aggregates and unifies the given paths by parent
-     *
-     * @param pathsToMove        Paths to be moved\copied
-     * @param targetLocalRepoKey Key of target local repo
-     * @return Set of aggregated paths to move
-     */
-    private Set<RepoPath> aggregatePathsToMove(Set<RepoPath> pathsToMove, String targetLocalRepoKey, boolean copy) {
-        // aggregate paths by parent repo path
-        Multimap<RepoPath, RepoPath> pathsByParent = HashMultimap.create();
-        for (RepoPath pathToMove : pathsToMove) {
-            if (!pathToMove.getRepoKey().equals(targetLocalRepoKey)) {
-                pathsByParent.put(pathToMove.getParent(), pathToMove);
-            }
-        }
-
-        // now for each parent check if all its files are moved, and if they do, we will move
-        // the parent folder and its children instead of just the children
-        Set<RepoPath> pathsToMoveIncludingParents = new HashSet<>();
-        for (RepoPath parentPath : pathsByParent.keySet()) {
-            Collection<RepoPath> children = pathsByParent.get(parentPath);
-            if (parentPath.isRoot()) {
-                // parent is the repository itself and cannot be moved, just add the children
-                pathsToMoveIncludingParents.addAll(children);
-            } else {
-                // if the parent children count equals to the number of files to be moved, move the folder instead
-                LocalRepo repository = getLocalRepository(parentPath);
-                VfsFolder folder =
-                        copy ? repository.getImmutableFolder(parentPath) : repository.getMutableFolder(parentPath);
-                // get all the folder children using write lock
-                List<VfsItem> folderChildren = folder.getImmutableChildren();
-                if (folder != null && folderChildren.size() == children.size()) {
-                    pathsToMoveIncludingParents.add(parentPath);
-                } else {
-                    pathsToMoveIncludingParents.addAll(children);
-                }
-            }
-        }
-        return pathsToMoveIncludingParents;
-    }
-
-    private String adjustRefererValue(Map<String, String> headersMap, String headerVal) {
-        //Append the artifactory uagent to the referer
-        if (headerVal == null) {
-            //Fallback to host
-            headerVal = headersMap.get("HOST");
-            if (headerVal == null) {
-                //Fallback to unknown
-                headerVal = "UNKNOWN";
-            }
-        }
-        if (!headerVal.startsWith("http")) {
-            headerVal = "http://" + headerVal;
-        }
-        try {
-            URL uri = new URL(headerVal);
-            //Only use the uri up to the path part
-            headerVal = uri.getProtocol() + "://" + uri.getAuthority();
-        } catch (MalformedURLException e) {
-            //Nothing
-        }
-        headerVal += "/" + HttpUtils.getArtifactoryUserAgent();
-        return headerVal;
-    }
-
-    /**
-     * Returns a list of shared repository details
-     *
-     * @param remoteUrl  URL of remote Artifactory instance
-     * @param headersMap Map of headers to set for client
-     * @return List of shared repository details
-     */
-    private List<RepoDetails> getSharedRemoteRepoDetails(String remoteUrl, Map<String, String> headersMap) {
-        StringBuilder urlBuilder = new StringBuilder();
-        urlBuilder.append(remoteUrl);
-        if (!remoteUrl.endsWith("/")) {
-            urlBuilder.append("/");
-        }
-        urlBuilder.append(RestConstants.PATH_API).append("/").append(RepositoriesRestConstants.PATH_ROOT).
-                append("?").append(RepositoriesRestConstants.PARAM_REPO_TYPE).append("=").
-                append(RepoDetailsType.REMOTE.name());
-
-        try (CloseableHttpResponse response = executeGetMethod(urlBuilder.toString(), headersMap)) {
-            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
-                return JacksonReader.streamAsValueTypeReference(response.getEntity().getContent(),
-                        new TypeReference<List<RepoDetails>>() {
-                        }
-                );
-            } else {
-                return Lists.newArrayList();
-            }
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    /**
-     * Returns the shared remote repository descriptor from the given configuration URL
-     *
-     * @param configUrl  URL of repository configuration
-     * @param headersMap Map of headers to set for client
-     * @return RemoteRepoDescriptor
-     */
-    private RemoteRepoDescriptor getSharedRemoteRepoConfig(String configUrl, Map<String, String> headersMap) {
-        try (CloseableHttpResponse response = executeGetMethod(configUrl, headersMap)) {
-            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
-                return JacksonReader.streamAsValueTypeReference(response.getEntity().getContent(),
-                        new TypeReference<HttpRepoDescriptor>() {
-                        }
-                );
-            } else {
-                return null;
-            }
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    /**
-     * Executes an HTTP GET method
-     *
-     * @param url        URL to query
-     * @param headersMap Map of headers to set for client
-     * @return The http response
-     */
-    private CloseableHttpResponse executeGetMethod(String url, Map<String, String> headersMap) throws IOException {
-        HttpGet getMethod = new HttpGet(url);
-        setHeader(getMethod, headersMap, HttpHeaders.USER_AGENT);
-        setHeader(getMethod, headersMap, HttpHeaders.REFERER);
-
-        ProxyDescriptor proxy = InternalContextHelper.get().getCentralConfig().getDescriptor().getDefaultProxy();
-
-        CloseableHttpClient client = new HttpClientConfigurator()
-                .soTimeout(15000)
-                .connectionTimeout(15000)
-                .retry(0, false)
-                .proxy(proxy).getClient();
-
-        return client.execute(getMethod);
-    }
-
-    /**
-     * Sets the HTTP headers for the given method
-     *
-     * @param getMethod  Get method that should be set with the headers
-     * @param headersMap Map of headers to set
-     * @param headerKey  Key of header to set
-     */
-    private void setHeader(HttpGet getMethod, Map<String, String> headersMap, String headerKey) {
-        String headerVal = headersMap.get(headerKey.toUpperCase());
-        if (HttpHeaders.REFERER.equalsIgnoreCase(headerKey)) {
-            headerVal = adjustRefererValue(headersMap, headerVal);
-        }
-        if (headerVal != null) {
-            getMethod.setHeader(headerKey, headerVal);
-        }
-    }
-
-    private void registerRepositoriesMBeans() {
-        MBeanRegistrationService registrationService = ContextHelper.get().beanForType(MBeanRegistrationService.class);
-        registrationService.unregisterAll(REPOSITORIES_MBEAN_TYPE);
-        for (LocalRepoDescriptor descriptor : getLocalAndCachedRepoDescriptors()) {
-            registrationService.register(new ManagedRepository(descriptor), REPOSITORIES_MBEAN_TYPE,
-                    descriptor.getKey());
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/mover/BaseRepoPathMover.java b/backend/core/src/main/java/org/artifactory/repo/service/mover/BaseRepoPathMover.java
deleted file mode 100644
index d4710c3..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/mover/BaseRepoPathMover.java
+++ /dev/null
@@ -1,697 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.service.mover;
-
-import com.google.common.collect.Maps;
-import org.apache.commons.io.IOUtils;
-import org.apache.http.HttpStatus;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.replication.ReplicationAddon;
-import org.artifactory.api.common.MoveMultiStatusHolder;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.maven.MavenMetadataService;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.common.StatusEntry;
-import org.artifactory.descriptor.repo.RealRepoDescriptor;
-import org.artifactory.descriptor.repo.TrashRepoDescriptor;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.maven.PomTargetPathValidator;
-import org.artifactory.md.Properties;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.*;
-import org.artifactory.repo.cleanup.FolderPruningService;
-import org.artifactory.repo.db.DbLocalRepo;
-import org.artifactory.repo.interceptor.StorageInterceptors;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.repo.trash.TrashService;
-import org.artifactory.sapi.fs.*;
-import org.artifactory.sapi.interceptor.DeleteContext;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.storage.fs.lock.LockingHelper;
-import org.artifactory.storage.fs.session.StorageSessionHolder;
-import org.artifactory.util.RepoPathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.InputStream;
-import java.util.List;
-import java.util.Map;
-
-/**
- * The abstract repo path mover implementation
- *
- * @author Noam Y. Tenne
- */
-public abstract class BaseRepoPathMover {
-    private static final Logger log = LoggerFactory.getLogger(BaseRepoPathMover.class);
-    protected final boolean copy;
-    protected final boolean dryRun;
-    protected final boolean executeMavenMetadataCalculation;
-    protected final boolean failFast;
-    protected final boolean unixStyleBehavior;
-    protected final Properties properties;
-    protected final MoveMultiStatusHolder status;
-    private final boolean pruneEmptyFolders;
-    protected AuthorizationService authorizationService;
-    protected StorageInterceptors storageInterceptors;
-    protected ArtifactoryContext artifactoryContext;
-    protected InternalRepositoryService repositoryService;
-    private MavenMetadataService mavenMetadataService;
-    protected final ReplicationAddon replicationAddon;
-
-
-    protected BaseRepoPathMover(MoveMultiStatusHolder status, MoverConfig moverConfig) {
-        this.status = status;
-        artifactoryContext = ContextHelper.get();
-        authorizationService = artifactoryContext.getAuthorizationService();
-        repositoryService = artifactoryContext.beanForType(InternalRepositoryService.class);
-        storageInterceptors = artifactoryContext.beanForType(StorageInterceptors.class);
-        mavenMetadataService = artifactoryContext.beanForType(MavenMetadataService.class);
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        replicationAddon = addonsManager.addonByType(ReplicationAddon.class);
-        copy = moverConfig.isCopy();
-        dryRun = moverConfig.isDryRun();
-        executeMavenMetadataCalculation = moverConfig.isExecuteMavenMetadataCalculation();
-        failFast = moverConfig.isFailFast();
-        unixStyleBehavior = moverConfig.isUnixStyleBehavior();
-        pruneEmptyFolders = moverConfig.isPruneEmptyFolders();
-        properties = initProperties(moverConfig);
-
-        // don't output to the logger if executing in dry run
-        this.status.setActivateLogging(!dryRun);
-    }
-
-    protected Properties initProperties(MoverConfig moverConfig) {
-        Properties properties = moverConfig.getProperties();
-        if (properties == null) {
-            properties = (Properties) InfoFactoryHolder.get().createProperties();
-        }
-        return properties;
-    }
-
-    protected MoveMultiStatusHolder moveOrCopy(VfsItem sourceItem, RepoRepoPath<LocalRepo> targetRrp) {
-        // See org.artifactory.repo.service.mover.MoverConfig,
-        // copy(Set<RepoPath> pathsToCopy, String targetLocalRepoKey, ...)
-        // move(Set<RepoPath> pathsToCopy, String targetLocalRepoKey, ...)
-        if (unixStyleBehavior) {
-            // if the target is a directory and it exists we move/copy the source UNDER the target directory (ie, we
-            // don't replace it - this is the default unix filesystem behavior).
-            VfsItem targetFsItem = targetRrp.getRepo().getMutableFsItem(targetRrp.getRepoPath());
-            if (targetFsItem != null && targetFsItem.isFolder()) {
-                String adjustedPath = targetRrp.getRepoPath().getPath() + "/" + sourceItem.getName();
-                targetRrp = new RepoRepoPath<>(targetRrp.getRepo(),
-                        InternalRepoPathFactory.create(targetRrp.getRepoPath().getRepoKey(), adjustedPath));
-            }
-        }
-        // ok start moving
-        moveCopyRecursive(sourceItem, targetRrp);
-
-        // recalculate maven metadata on affected repositories
-        if (!dryRun) {
-            clearEmptySourceDirs(sourceItem);
-            RepoPath folderRepoPath = getFolderRepoPath(sourceItem);
-            if (folderRepoPath != null) {
-                calculateMavenMetadata(targetRrp, folderRepoPath);
-            }
-        }
-        return status;
-    }
-
-    /**
-     * move / copy in multi tx mode
-     *
-     * @param sourceItem source item to be copy or move
-     * @param targetRrp  - target repo
-     * @return - move/copy status holder
-     */
-    protected MoveMultiStatusHolder moveOrCopyMultiTx(VfsItem sourceItem, RepoRepoPath<LocalRepo> targetRrp) {
-        // See org.artifactory.repo.service.mover.MoverConfig,
-        // copy(Set<RepoPath> pathsToCopy, String targetLocalRepoKey, ...)
-        // move(Set<RepoPath> pathsToCopy, String targetLocalRepoKey, ...)
-        if (unixStyleBehavior) {
-            // if the target is a directory and it exists we move/copy the source UNDER the target directory (ie, we
-            // don't replace it - this is the default unix filesystem behavior).
-            VfsItem targetFsItem = targetRrp.getRepo().getImmutableFsItem(targetRrp.getRepoPath());
-            if (targetFsItem != null && targetFsItem.isFolder()) {
-                String adjustedPath = targetRrp.getRepoPath().getPath() + "/" + sourceItem.getName();
-                targetRrp = new RepoRepoPath<>(targetRrp.getRepo(),
-                        InternalRepoPathFactory.create(targetRrp.getRepoPath().getRepoKey(), adjustedPath));
-            }
-        }
-        Map<String, String> folderMoverMap = Maps.newHashMap();
-        // ok start moving
-        moveCopyRecursiveMultiTx(sourceItem, targetRrp, folderMoverMap);
-        // recalculate maven metadata on affected repositories
-        if (!dryRun) {
-            clearEmptySourceDirs(sourceItem);
-            RepoPath folderRepoPath = getFolderRepoPath(sourceItem);
-            if (folderRepoPath != null) {
-                calculateMavenMetadata(targetRrp, folderRepoPath);
-            }
-        }
-        return status;
-    }
-
-
-    /**
-     * move / copy recursive procedure in atomic tx
-     * @param source - source of copy move
-     * @param targetRrp - target path
-     */
-    protected void moveCopyRecursive(VfsItem source, RepoRepoPath<LocalRepo> targetRrp) {
-        if (errorsOrWarningsOccurredAndFailFast()) {
-            return;
-        }
-        if (source.isFolder()) {
-            handleDir((VfsFolder) source, targetRrp);
-        } else {
-            // the source is a file
-            handleFile(source, targetRrp);
-        }
-    }
-
-    /**
-     * move / copy recursive procedure in multi tx
-     *
-     * @param source    - source of copy move
-     * @param targetRrp - target path
-     */
-    protected void moveCopyRecursiveMultiTx(VfsItem source, RepoRepoPath<LocalRepo> targetRrp, Map<String, String> folderMoverMap) {
-        if (errorsOrWarningsOccurredAndFailFast()) {
-            return;
-        }
-        if (source.isFolder()) {
-            handleDirMultiTx((VfsFolder) source, targetRrp,folderMoverMap);
-        } else {
-            // the source is a file
-            handleFileMultiTx(source, targetRrp);
-        }
-    }
-
-    /**
-     * This method copies the source folder to the target folder including the folder metadata, excluding children
-     *
-     * @param sourceFolder src
-     * @param targetRrp    dest
-     * @return the new folder dest created
-     */
-    public MutableVfsFolder shallowCopyDirectory(VfsFolder sourceFolder, RepoRepoPath<LocalRepo> targetRrp) {
-        assertNotDryRun();
-        LocalRepo targetRepo = targetRrp.getRepo();
-        RepoPath targetRepoPath = InternalRepoPathFactory.create(targetRepo.getKey(),
-                targetRrp.getRepoPath().getPath());
-        MutableVfsFolder targetFolder = targetRepo.getMutableFolder(targetRepoPath);
-        if (targetFolder == null) {
-            log.debug("Creating target folder {}", targetRepoPath);
-            targetFolder = targetRepo.createOrGetFolder(targetRepoPath);
-        } else {
-            log.debug("Target folder {} already exist", targetRepoPath);
-        }
-        status.folderMoved();
-        targetFolder.fillInfo(sourceFolder.getInfo());
-        // copy relevant metadata from source to target
-        log.debug("Copying folder metadata to {}", targetRepoPath);
-        targetFolder.setProperties(sourceFolder.getProperties());
-        replicationAddon.offerLocalReplicationPropertiesChangeEvent(targetRepoPath);
-        return targetFolder;
-    }
-
-    protected abstract void beforeOperationOnFolder(VfsItem sourceItem, RepoPath targetRepoPath);
-
-    protected abstract void afterOperationOnFolder(VfsItem sourceItem, RepoRepoPath<LocalRepo> targetRrp, VfsFolder targetFolder);
-
-    protected abstract void beforeOperationOnFile(VfsItem sourceItem, RepoPath targetRepoPath);
-
-    protected abstract void operationOnFile(VfsFile sourceItem, RepoRepoPath<LocalRepo> targetRrp);
-
-    protected abstract VfsItem getSourceItem(VfsItem sourceItem);
-
-
-    @SuppressWarnings({"ThrowableResultOfMethodCallIgnored"})
-    protected void handleDir(VfsFolder source, RepoRepoPath<LocalRepo> targetRrp) {
-        MutableVfsFolder targetFolder = null;
-        RepoPath targetRepoPath = targetRrp.getRepoPath();
-        if (canMove(source, targetRrp)) {
-            if (!dryRun) {
-                StatusEntry lastError = status.getLastError();
-                //call interceptors before move or copy operation
-                beforeOperationOnFolder(source, targetRepoPath);
-                if (status.getCancelException(lastError) != null) {
-                    return;
-                }
-                targetFolder = shallowCopyDirectory(source, targetRrp);
-            }
-        } else if (!contains(targetRrp) ||
-                targetRrp.getRepo().getImmutableFsItem(targetRrp.getRepoPath()).isFile()) {
-            // target repo doesn't accept this path and it doesn't already contain it OR the target is a file
-            // so there is no point to continue to the children
-            status.error("Cannot create/override the path '" + targetRrp.getRepoPath() + "'. " +
-                    "Skipping this path and all its children.", log);
-            return;
-        }
-        List<VfsItem> children = source.getImmutableChildren();
-        RepoPath originalRepoPath = targetRrp.getRepoPath();
-        for (VfsItem child : children) {
-            // update the cached object with the child's repo path.
-            targetRrp = new RepoRepoPath<>(targetRrp.getRepo(),
-                    InternalRepoPathFactory.create(originalRepoPath, child.getName()));
-            // recursive call with the child
-            moveCopyRecursive(child, targetRrp);
-        }
-        saveSession();  // save the session before checking if the folder is empty
-        //call interceptors after move or copy operation
-        afterOperationOnFolder(source, targetRrp, targetFolder);
-        deleteAndReplicateAfterMoveEvent(targetFolder, children.size());
-    }
-
-    /***
-     * delete folder and send replication event
-     *
-     * @param targetFolder  - target folder
-     * @param numOfChildren - folder children number
-     */
-    protected void deleteAndReplicateAfterMoveEvent(MutableVfsFolder targetFolder, int numOfChildren) {
-        if (shouldRemoveTargetFolder(targetFolder, numOfChildren)) {
-            deleteAndReplicateEvent(targetFolder); // target folder is empty remove it immediately
-        }
-    }
-
-    @SuppressWarnings({"ThrowableResultOfMethodCallIgnored"})
-    protected void handleDirMultiTx(VfsFolder source, RepoRepoPath<LocalRepo> targetRrp, Map<String, String> folderMoverMap) {
-        LockableMover lockableMover = InternalContextHelper.get().beanForType(LockableMover.class);
-        VfsFolderRepo vfsFolderRepo = lockableMover.moveCopyFolder(source, targetRrp, this, status);
-        if (vfsFolderRepo == null || vfsFolderRepo.getVfsItem() == null) {
-            return;
-        }
-        MutableVfsFolder targetFolder = (MutableVfsFolder) vfsFolderRepo.getVfsItem();
-        targetRrp = vfsFolderRepo.getRepoRepoPath();
-        if (targetFolder == null) {
-            return;
-        }
-        RepoPath originalRepoPath = targetRrp.getRepoPath();
-        // add folder repo path to folder creation map
-        folderMoverMap.put(targetRrp.getRepoPath().toString(), originalRepoPath.toString());
-        List<VfsItem> children = source.getImmutableChildren();
-        for (VfsItem child : children) {
-            if (isFolderCreatedAlready(folderMoverMap, child)) {
-                // update the cached object with the child's repo path.
-                targetRrp = new RepoRepoPath<>(targetRrp.getRepo(),
-                        InternalRepoPathFactory.create(originalRepoPath, child.getName()));
-                // recursive call with the child
-                moveCopyRecursiveMultiTx(child, targetRrp, folderMoverMap);
-            }
-        }
-        //call interceptors after move or copy operation
-        lockableMover = InternalContextHelper.get().beanForType(LockableMover.class);
-        lockableMover.postFolderProcessing(source, targetFolder, targetRrp, this, properties, children.size());
-    }
-
-    /**
-     * check weather folder was created already to prevent recursive folder creation
-     *
-     * @param folderMoverMap - hold folder created Path
-     * @param child          - child to be created
-     * @return - if true folder was not created already
-     */
-    private boolean isFolderCreatedAlready(Map<String, String> folderMoverMap, VfsItem child) {
-        return folderMoverMap.get(child.getRepoPath().toString()) == null;
-    }
-
-    protected boolean validateDryRun(RepoRepoPath<LocalRepo> targetRrp) {
-        if (dryRun && (!contains(targetRrp) ||
-                targetRrp.getRepo().getImmutableFsItem(targetRrp.getRepoPath()).isFile())) {
-            // target repo doesn't accept this path and it doesn't already contain it OR the target is a file
-            // so there is no point to continue to the children
-            status.error("Cannot create/override the path '" + targetRrp.getRepoPath() + "'. " +
-                    "Skipping this path and all its children.", log);
-            return true;
-
-        }
-        return false;
-    }
-
-    protected RepoRepoPath<LocalRepo> processUnixStyle(VfsItem source, RepoRepoPath<LocalRepo> targetRrp) {
-        if (unixStyleBehavior) {
-            // if the target is a directory and it exists we move/copy the source UNDER the target directory (ie, we
-            // don't replace it - this is the default unix filesystem behavior).
-            VfsItem targetFsItem = targetRrp.getRepo().getMutableFsItem(targetRrp.getRepoPath());
-            if (targetFsItem != null && targetFsItem.isFolder()) {
-                String adjustedPath = targetRrp.getRepoPath().getPath() + "/" + source.getName();
-                targetRrp = new RepoRepoPath<>(targetRrp.getRepo(),
-                        InternalRepoPathFactory.create(targetRrp.getRepoPath().getRepoKey(), adjustedPath));
-            }
-        }
-        return targetRrp;
-    }
-
-    /**
-     * If not in a dry run, If not pruning empty folders (if true it will happen at a later stage),
-     * If not copying (no source removal when copying), If not on the root item (a repo),
-     * If not containing any children and folders or artifacts were moved.
-     */
-    protected boolean shouldRemoveSourceFolder(VfsFolder sourceFolder) {
-        return !dryRun && !copy && !sourceFolder.getRepoPath().isRoot() && !sourceFolder.hasChildren()
-                && !pruneEmptyFolders && (status.getMovedFoldersCount() != 0 || status.getMovedArtifactsCount() != 0);
-    }
-
-    //If not containing any children and items have been moved (children have actually been moved)
-    protected boolean shouldRemoveTargetFolder(MutableVfsFolder targetFolder, int childrenSize) {
-        return !dryRun && targetFolder != null && !targetFolder.getRepoPath().isRoot() && !targetFolder.hasChildren()
-                && childrenSize != 0;
-    }
-
-    protected void handleFile(VfsItem source, RepoRepoPath<LocalRepo> targetRrp) {
-        if (canMove(source, targetRrp)) {
-            if (!dryRun) {
-                moveFile((VfsFile) source, targetRrp);
-            } else {
-                status.artifactMoved();
-            }
-        }
-    }
-
-    protected void handleFileMultiTx(VfsItem source, RepoRepoPath<LocalRepo> targetRrp) {
-        if (canMove(source, targetRrp)) {
-            if (!dryRun) {
-                moveFileMultiTx((VfsFile) source, targetRrp);
-            } else {
-                status.artifactMoved();
-            }
-        }
-    }
-
-    protected void afterFolderCopy(VfsItem sourceItem, RepoRepoPath<LocalRepo> targetRrp, VfsFolder targetFolder, Properties properties) {
-        RepoPath repoPath = targetRrp.getRepoPath();
-        DbLocalRepo targetRepo = (DbLocalRepo) targetRrp.getRepo();
-        if (!dryRun && copy && targetRepo.isPathPatternValid(repoPath, repoPath.getPath())) {
-            storageInterceptors.afterCopy(sourceItem, targetFolder, status, properties);
-        }
-    }
-
-    protected void copyFile(VfsFile sourceItem, RepoRepoPath<LocalRepo> targetRrp, Properties properties) {
-        MutableVfsFile targetFile = getMutableVfsTargetFile(targetRrp, targetRrp.getRepo());
-        log.debug("Copying file {} to {}", sourceItem, targetFile);
-        // copy file
-        copyVfsFile(sourceItem, targetFile);
-        // call after copy interceptors
-        storageInterceptors.afterCopy(sourceItem, targetFile, status, properties);
-    }
-
-
-    protected void afterMoveFolder(VfsItem sourceItem, VfsFolder targetFolder, Properties properties) {
-        if (shouldRemoveSourceFolder((VfsFolder) sourceItem)) {
-            storageInterceptors.afterMove(sourceItem, targetFolder, status, properties);
-            deleteAndReplicateEvent((VfsFolder) sourceItem);
-        }
-    }
-
-    protected void moveFile(VfsFile sourceItem, RepoRepoPath<LocalRepo> targetRrp, Properties properties) {
-        MutableVfsFile targetFile = getMutableVfsTargetFile(targetRrp, targetRrp.getRepo());
-        log.debug("Moving file from {} to {}", sourceItem, targetFile);
-        moveVfsFile(sourceItem, targetFile);
-        storageInterceptors.afterMove(sourceItem, targetFile, status, properties);
-    }
-
-    private void moveVfsFile(VfsFile sourceFile, MutableVfsFile targetFile) {
-        copyVfsFile(sourceFile, targetFile);
-        LocalRepo localRepo = repositoryService.localOrCachedRepositoryByKey(sourceFile.getRepoKey());
-        MutableVfsFile mutableSourceFile =
-                localRepo != null ? localRepo.getMutableFile(sourceFile.getRepoPath()) : null;
-        if (mutableSourceFile != null) {
-            mutableSourceFile.delete(new DeleteContext(mutableSourceFile.getRepoPath()).triggeredByMove());
-        } else {
-            log.error("About to delete {} but it is null", sourceFile.getRepoPath());
-        }
-    }
-    protected boolean canMove(VfsItem source, RepoRepoPath<LocalRepo> targetRrp) {
-        RepoPath sourceRepoPath = source.getRepoPath();
-
-        LocalRepo targetRepo = targetRrp.getRepo();
-        RepoPath targetRepoPath = targetRrp.getRepoPath();
-        String targetPath = targetRepoPath.getPath();
-
-        // snapshot/release policy is enforced only on files since it only has a meaning on files
-        if (source.isFile() && !targetRepo.handlesReleaseSnapshot(targetPath)) {
-            status.error("The repository '" + targetRepo.getKey() + "' rejected the resolution of artifact in path '" + targetPath
-                    + "' due to conflict in the snapshot release handling policy.", HttpStatus.SC_BAD_REQUEST, log);
-            return false;
-        }
-
-        if (!targetRepo.accepts(targetRepoPath)) {
-            status.error("The repository '" + targetRepo.getKey() + "' rejected the resolution of artifact in path '" + targetPath
-                    + "' due to conflict in the snapshot release handling policy.", HttpStatus.SC_FORBIDDEN, log);
-            return false;
-        }
-
-        // permission checks
-        if (!copy && !authorizationService.canDelete(sourceRepoPath)) {
-            status.error("User doesn't have permissions to move '" + sourceRepoPath + "'. " +
-                    "Needs delete permissions.", HttpStatus.SC_FORBIDDEN, log);
-            return false;
-        }
-
-        if (contains(targetRrp)) {
-            if (!authorizationService.canDelete(targetRepoPath)) {
-                status.error("User doesn't have permissions to override '" + targetRepoPath + "'. " +
-                        "Needs delete permissions.", HttpStatus.SC_UNAUTHORIZED, log);
-                return false;
-            }
-
-            // don't allow moving/copying folder to file
-            if (source.isFolder()) {
-                VfsItem targetFsItem = targetRepo.getMutableFsItem(targetRepoPath);
-                if (targetFsItem != null && targetFsItem.isFile()) {
-                    status.error("Can't move folder under file '" + targetRepoPath + "'. ", HttpStatus.SC_BAD_REQUEST,
-                            log);
-                    return false;
-                }
-            }
-        } else if (!authorizationService.canDeploy(targetRepoPath)) {
-            status.error("User doesn't have permissions to create '" + targetRepoPath + "'. " +
-                    "Needs write permissions.", HttpStatus.SC_FORBIDDEN, log);
-            return false;
-        }
-
-        if (source.isFile() && NamingUtils.isPom(sourceRepoPath.getPath()) && NamingUtils.isPom(targetPath) &&
-                !((RealRepoDescriptor) targetRepo.getDescriptor()).isSuppressPomConsistencyChecks()) {
-            ModuleInfo moduleInfo = targetRepo.getItemModuleInfo(targetPath);
-            InputStream resourceStream = null;
-            try {
-                resourceStream = ((VfsFile) source).getStream();
-                new PomTargetPathValidator(targetPath, moduleInfo).validate(resourceStream, false);
-            } catch (Exception e) {
-                status.error("Failed to validate target path of pom: " + targetPath, HttpStatus.SC_BAD_REQUEST, e, log);
-                return false;
-            } finally {
-                IOUtils.closeQuietly(resourceStream);
-            }
-        }
-
-        // all tests passed
-        return true;
-    }
-
-    protected void moveFile(VfsFile sourceFile, RepoRepoPath<LocalRepo> targetRrp) {
-        assertNotDryRun();
-        LocalRepo targetRepo = targetRrp.getRepo();
-        RepoPath targetRepoPath = targetRrp.getRepoPath();
-        StatusEntry lastError = status.getLastError();
-        // call interceptors before operation
-        beforeOperationOnFile(sourceFile, targetRepoPath);
-        if (status.getCancelException(lastError) != null) {
-            return;
-        }
-        if (!(targetRepo.getDescriptor() instanceof TrashRepoDescriptor)) {
-            overrideTargetFileIfExist(targetRrp, targetRepo);
-        }
-
-        // copy or move file
-        operationOnFile(sourceFile, targetRrp);
-        if (!(targetRepo.getDescriptor() instanceof TrashRepoDescriptor)) {
-            saveSession();
-            LockingHelper.removeLockEntry(sourceFile.getRepoPath());
-        }
-        status.artifactMoved();
-    }
-
-    protected void moveFileMultiTx(VfsFile sourceFile, RepoRepoPath<LocalRepo> targetRrp) {
-        assertNotDryRun();
-        LockableMover lockableMover = InternalContextHelper.get().beanForType(LockableMover.class);
-        lockableMover.moveCopyFile(sourceFile, targetRrp, this, status);
-        status.artifactMoved();
-    }
-
-    protected void overrideTargetFileIfExist(RepoRepoPath<LocalRepo> targetRrp, LocalRepo targetRepo) {
-        MutableVfsItem targetItem = targetRepo.getMutableFsItem(targetRrp.getRepoPath());
-        if (targetItem != null) {
-            // target repository already contains file or folder with the same name, delete it
-            log.debug("File {} already exists in target repository. Overriding.", targetRrp.getRepoPath());
-            targetItem.delete(new DeleteContext(targetItem.getRepoPath()).triggeredByMove());
-            saveSession();
-        }
-    }
-
-    protected MutableVfsFile getMutableVfsTargetFile(RepoRepoPath<LocalRepo> targetRrp, LocalRepo targetRepo) {
-        return targetRepo.createOrGetFile(targetRrp.getRepoPath());
-    }
-
-    protected void copyVfsFile(VfsFile sourceFile, MutableVfsFile targetFile) {
-        // copy the info and the properties only (stats and watches are not required)
-        targetFile.tryUsingExistingBinary(sourceFile.getSha1(), sourceFile.getMd5(), sourceFile.length());
-        targetFile.fillInfo(sourceFile.getInfo());
-        targetFile.setProperties(sourceFile.getProperties());
-    }
-
-    protected void assertNotDryRun() {
-        if (dryRun) {
-            throw new IllegalStateException("Method call is not allowed in dry run");
-        }
-    }
-
-    protected boolean contains(RepoRepoPath<LocalRepo> rrp) {
-        return rrp.getRepo().itemExists(rrp.getRepoPath().getPath());
-    }
-
-    protected void clearEmptyDirsAndCalcMetadata(RepoRepoPath<LocalRepo> targetRrp, VfsItem sourceItem) {
-        if (!dryRun) {
-            clearEmptySourceDirs(sourceItem);
-            if (calcMetadata()) {
-                RepoPath folderRepoPath = getFolderRepoPath(sourceItem);
-                if (folderRepoPath != null) {
-                    calculateMavenMetadata(targetRrp, folderRepoPath);
-                }
-            }
-        }
-    }
-
-    /**
-     * Marks the current folder for pruning, works only if the config set prune to true.
-     */
-    protected void clearEmptySourceDirs(VfsItem sourceItem) {
-        RepoPath sourceRepoPath = getFolderRepoPath(sourceItem);
-
-        // cleanup only in search results or promotion after move
-        if (sourceRepoPath == null || !pruneEmptyFolders || copy) {
-            return;
-        }
-        FolderPruningService pruningService = ContextHelper.get().beanForType(FolderPruningService.class);
-        pruningService.prune(sourceRepoPath);
-    }
-
-    protected RepoPath getFolderRepoPath(VfsItem sourceItem) {
-        RepoPath sourceRepoPath = sourceItem.getRepoPath();
-        if (sourceItem.isFile()) {
-            //If the item is a file, just calculate the parent folder
-            sourceRepoPath = sourceRepoPath.getParent();
-        }
-
-        if (sourceRepoPath == null || sourceRepoPath.isRoot()) {
-            // cleanup only for non root folders
-            return null;
-        }
-        return sourceRepoPath;
-    }
-
-    protected boolean calcMetadata() {
-        return true;
-    }
-
-    protected boolean calcMetadataOnSource() {
-        return true;
-    }
-
-    protected boolean calcMetadataOnTarget() {
-        return true;
-    }
-
-    protected void calculateMavenMetadata(RepoRepoPath<LocalRepo> targetRrp, RepoPath sourceFolderRepoPath) {
-        assertNotDryRun();
-
-        if (calcMetadataOnTarget()) {
-            LocalRepo targetLocalRepo = targetRrp.getRepo();
-            VfsItem fsItem = targetLocalRepo.getImmutableFsItem(targetRrp.getRepoPath());
-            if (fsItem == null) {
-                log.debug("Target item doesn't exist. Skipping maven metadata recalculation.");
-                return;
-            }
-
-            // start calculation from the parent folder of the target path (unless it's the root)
-            RepoPath folderForMetadataCalculation =
-                    fsItem.getRepoPath().isRoot() ? fsItem.getRepoPath() : fsItem.getRepoPath().getParent();
-            if (executeMavenMetadataCalculation) {
-                mavenMetadataService.calculateMavenMetadataAsync(folderForMetadataCalculation, true);
-                if (MavenNaming.isPom(fsItem.getRepoPath().getPath())) {
-                    // for pom files we need to trigger metadata calculation on the grandparent non-recursively -
-                    // potential new version and snapshot.
-                    RepoPath grandparentFolder = RepoPathUtils.getAncestor(fsItem.getRepoPath(), 2);
-                    mavenMetadataService.calculateMavenMetadataAsync(grandparentFolder, false);
-                }
-            } else {
-                status.addToMavenMetadataCandidates(folderForMetadataCalculation);
-                if (MavenNaming.isPom(fsItem.getRepoPath().getPath())) {
-                    // for pom files we need to trigger metadata calculation on the grandparent non-recursively -
-                    // potential new version and snapshot.
-                    RepoPath grandparentFolder = RepoPathUtils.getAncestor(fsItem.getRepoPath(), 2);
-                    status.addToMavenMetadataCandidates(grandparentFolder);
-                }
-            }
-        }
-
-        if (calcMetadataOnSource() && !isTrash(sourceFolderRepoPath)) {
-            // recalculate the source repository only if it's not a cache repo and not copy
-            RepoPath sourceForMetadataCalculation = sourceFolderRepoPath.getParent();
-            Repo sourceRepo = repositoryService.repositoryByKey(sourceFolderRepoPath.getRepoKey());
-            if (!copy && sourceRepo != null && !sourceRepo.isCache() && sourceForMetadataCalculation != null) {
-                if (executeMavenMetadataCalculation) {
-                    mavenMetadataService.calculateMavenMetadataAsync(sourceForMetadataCalculation, true);
-                } else {
-                    status.addToMavenMetadataCandidates(sourceForMetadataCalculation);
-                }
-            }
-        }
-    }
-
-    private boolean isTrash(RepoPath repoPath) {
-        return TrashService.TRASH_KEY.equals(repoPath.getRepoKey());
-    }
-
-    protected boolean errorsOrWarningsOccurredAndFailFast() {
-        return (status.hasWarnings() || status.hasErrors()) && failFast;
-    }
-
-    protected void deleteAndReplicateEvent(VfsFolder folder) {
-        LocalRepo localRepo = repositoryService.localOrCachedRepositoryByKey(folder.getRepoKey());
-        if (localRepo != null) {
-            MutableVfsFolder mutableFolder = localRepo.getMutableFolder(folder.getRepoPath());
-            if (mutableFolder != null) {
-                mutableFolder.delete(new DeleteContext(mutableFolder.getRepoPath()).triggeredByMove());
-                artifactoryContext.beanForType(AddonsManager.class).addonByType(ReplicationAddon.class)
-                        .offerLocalReplicationDeleteEvent(folder.getRepoPath());
-            }
-        }
-    }
-
-    protected void saveSession() {
-        StorageSessionHolder.getSession().save();
-    }
-
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/mover/CopyRepoPathService.java b/backend/core/src/main/java/org/artifactory/repo/service/mover/CopyRepoPathService.java
deleted file mode 100644
index 47c8230..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/mover/CopyRepoPathService.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.repo.service.mover;
-
-
-import org.artifactory.api.common.MoveMultiStatusHolder;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RepoRepoPath;
-import org.artifactory.sapi.fs.VfsItem;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
-public class CopyRepoPathService extends RepoPathMover {
-
-    @Override
-    public void executeOperation(MoveMultiStatusHolder status, MoverConfig moverConfig) {
-        moveOrCopy(status, moverConfig);
-    }
-
-    @Override
-    public void handleMoveOrCopy(MoveMultiStatusHolder status, MoverConfig moverConfig,
-                                 VfsItem sourceItem, RepoRepoPath<LocalRepo> targetRrp) {
-        DefaultRepoPathCopier defaultRepoPathCopier = new DefaultRepoPathCopier(status, moverConfig);
-        if (moverConfig.isAtomic()) {
-            defaultRepoPathCopier.moveOrCopy(sourceItem, targetRrp);
-        } else {
-            defaultRepoPathCopier.moveOrCopyMultiTx(sourceItem, targetRrp);
-        }
-    }
-
-    @Override
-    protected String operationType() {
-        return "copy";
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/mover/DefaultRepoPathCopier.java b/backend/core/src/main/java/org/artifactory/repo/service/mover/DefaultRepoPathCopier.java
deleted file mode 100644
index 5905c95..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/mover/DefaultRepoPathCopier.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.artifactory.repo.service.mover;
-
-import org.artifactory.api.common.MoveMultiStatusHolder;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoRepoPath;
-import org.artifactory.sapi.fs.VfsFile;
-import org.artifactory.sapi.fs.VfsFolder;
-import org.artifactory.sapi.fs.VfsItem;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * @author Chen Keinan
- */
-public class DefaultRepoPathCopier extends BaseRepoPathMover {
-    private static final Logger log = LoggerFactory.getLogger(DefaultRepoPathCopier.class);
-
-
-    protected DefaultRepoPathCopier(MoveMultiStatusHolder status, MoverConfig moverConfig) {
-        super(status, moverConfig);
-    }
-
-    @Override
-    protected void beforeOperationOnFolder(VfsItem sourceItem, RepoPath targetRepoPath) {
-        storageInterceptors.beforeCopy(sourceItem, targetRepoPath, status, properties);
-    }
-
-    @Override
-    public void beforeOperationOnFile(VfsItem sourceItem, RepoPath targetRepoPath) {
-        storageInterceptors.beforeCopy(sourceItem, targetRepoPath, status, properties);
-    }
-
-    @Override
-    protected void afterOperationOnFolder(VfsItem sourceItem, RepoRepoPath<LocalRepo> targetRrp,
-                                          VfsFolder targetFolder) {
-        afterFolderCopy(sourceItem, targetRrp, targetFolder, properties);
-    }
-
-    @Override
-    public void operationOnFile(VfsFile sourceItem, RepoRepoPath<LocalRepo> targetRrp) {
-        copyFile(sourceItem, targetRrp, properties);
-    }
-
-    @Override
-    public VfsItem getSourceItem(VfsItem sourceItem) {
-        return sourceItem;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/mover/DefaultRepoPathMover.java b/backend/core/src/main/java/org/artifactory/repo/service/mover/DefaultRepoPathMover.java
deleted file mode 100644
index d49dd56..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/mover/DefaultRepoPathMover.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.service.mover;
-
-import org.artifactory.api.common.MoveMultiStatusHolder;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoRepoPath;
-import org.artifactory.sapi.fs.VfsFile;
-import org.artifactory.sapi.fs.VfsFolder;
-import org.artifactory.sapi.fs.VfsItem;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * The ordinary repo-path move/copy implementation
- *
- * @author Noam Y. Tenne
- */
-class DefaultRepoPathMover extends BaseRepoPathMover {
-
-    private static final Logger log = LoggerFactory.getLogger(DefaultRepoPathMover.class);
-
-
-    DefaultRepoPathMover(MoveMultiStatusHolder status, MoverConfig moverConfig) {
-        super(status, moverConfig);
-    }
-
-    @Override
-    protected void beforeOperationOnFolder(VfsItem sourceItem, RepoPath targetRepoPath) {
-        storageInterceptors.beforeMove(sourceItem, targetRepoPath, status, properties);
-    }
-
-    @Override
-    public void beforeOperationOnFile(VfsItem sourceItem, RepoPath targetRepoPath) {
-        storageInterceptors.beforeMove(sourceItem, targetRepoPath, status, properties);
-    }
-
-    @Override
-    protected void afterOperationOnFolder(VfsItem sourceItem, RepoRepoPath<LocalRepo> targetRrp,
-                                          VfsFolder targetFolder) {
-        afterMoveFolder(sourceItem, targetFolder, properties);
-    }
-
-    @Override
-    public void operationOnFile(VfsFile sourceItem, RepoRepoPath<LocalRepo> targetRrp) {
-        moveFile(sourceItem, targetRrp, properties);
-    }
-
-    @Override
-    public VfsItem getSourceItem(VfsItem sourceItem) {
-        return getLocalRepo(sourceItem.getRepoKey()).getMutableFsItem(sourceItem.getRepoPath());
-    }
-
-    /**
-     * return local repo
-     * @param repoKey - repo key
-     * @return
-     */
-    private LocalRepo getLocalRepo(String repoKey) {
-        LocalRepo targetLocalRepo = repositoryService.localOrCachedRepositoryByKey(repoKey);
-        if (targetLocalRepo == null) {
-            throw new IllegalArgumentException("Local repository " + repoKey +
-                    " not found (repository is not local or doesn't exist)");
-        }
-        return targetLocalRepo;
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/mover/LockableMover.java b/backend/core/src/main/java/org/artifactory/repo/service/mover/LockableMover.java
deleted file mode 100644
index 881db4c..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/mover/LockableMover.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.repo.service.mover;
-
-import org.artifactory.api.common.MoveMultiStatusHolder;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RepoRepoPath;
-import org.artifactory.sapi.common.Lock;
-import org.artifactory.sapi.fs.VfsFolder;
-import org.artifactory.sapi.fs.VfsItem;
-
-/**
- * @author Chen Keinan
- */
-public interface LockableMover {
-
-    @Lock
-    void moveCopyFile(VfsItem source, RepoRepoPath<LocalRepo> targetRrp, BaseRepoPathMover repoPathMover, MoveMultiStatusHolder status);
-
-    @Lock
-    VfsFolderRepo moveCopyFolder(VfsItem source, RepoRepoPath<LocalRepo> targetRrp, BaseRepoPathMover repoPathMove, MoveMultiStatusHolder status);
-
-    @Lock
-    void postFolderProcessing(VfsItem sourceItem, VfsFolder targetFolder, RepoRepoPath<LocalRepo> targetRrp, BaseRepoPathMover repoPathMover,
-                              Properties properties, int numOfChildren);
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/mover/MoveRepoPathService.java b/backend/core/src/main/java/org/artifactory/repo/service/mover/MoveRepoPathService.java
deleted file mode 100644
index a4aebcd..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/mover/MoveRepoPathService.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.repo.service.mover;
-
-import org.artifactory.api.common.MoveMultiStatusHolder;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RepoRepoPath;
-import org.artifactory.sapi.fs.MutableVfsItem;
-import org.artifactory.sapi.fs.VfsItem;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
-public class MoveRepoPathService extends RepoPathMover {
-    @Override
-    public void executeOperation(MoveMultiStatusHolder status, MoverConfig moverConfig) {
-        moveOrCopy(status, moverConfig);
-    }
-
-    @Override
-    public void handleMoveOrCopy(MoveMultiStatusHolder status, MoverConfig moverConfig,
-                                 VfsItem sourceItem, RepoRepoPath<LocalRepo> targetRrp) {
-        DefaultRepoPathMover defaultRepoPathMover = new DefaultRepoPathMover(status, moverConfig);
-        if (moverConfig.isAtomic()) {
-            MutableVfsItem mutableFsItem = getLocalRepo(sourceItem.getRepoKey()).getMutableFsItem(sourceItem.getRepoPath());
-            defaultRepoPathMover.moveOrCopy(mutableFsItem, targetRrp);
-        } else {
-            defaultRepoPathMover.moveOrCopyMultiTx(sourceItem, targetRrp);
-        }
-    }
-
-    @Override
-    protected String operationType() {
-        return "move";
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/mover/MoverConfig.java b/backend/core/src/main/java/org/artifactory/repo/service/mover/MoverConfig.java
deleted file mode 100644
index 168503c..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/mover/MoverConfig.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-/*
- * Copyright 2012 JFrog Ltd. All rights reserved.
- * JFROG PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
- */
-
-package org.artifactory.repo.service.mover;
-
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-
-/**
- * Repo path mover configuration object
- *
- * @author Noam Y. Tenne
- */
-public class MoverConfig {
-    private final RepoPath fromRepoPath;
-    private final RepoPath targetLocalRepoPath;
-    private final boolean copy;
-    private final boolean dryRun;
-    private final boolean executeMavenMetadataCalculation;
-    private final boolean pruneEmptyFolders;
-    private final Properties properties;
-    private final boolean suppressLayouts;
-    private final boolean failFast;
-    private final boolean unixStyleBehavior;
-    private final boolean atomic;
-
-    /**
-     * Main constructor
-     *
-     * @param fromRepoPath       Source repo path
-     * @param copy               Is a copy being performed
-     * @param dryRun             Is the current run a dry one (no items actually moved)
-     * @param executeMavenMetadataCalculation
-     *                           Should immediately execute metadata calculation, or schedule
-     * @param pruneEmptyFolders  If should prune empty folders after move
-     * @param suppressLayouts    True if path translation across different layouts should be suppressed.
-     * @param failFast           Flag to indicate whether the operation should fail upon encountering an error.
-     * @param unixStyleBehavior  Use Unix-style behavior when dealing with existing nested folders
-     */
-    public MoverConfig(RepoPath fromRepoPath, RepoPath targetLocalRepoPath, boolean copy,
-            boolean dryRun, boolean executeMavenMetadataCalculation, boolean pruneEmptyFolders, Properties properties,
-                       boolean suppressLayouts, boolean failFast, boolean unixStyleBehavior, boolean atomic) {
-        this.fromRepoPath = fromRepoPath;
-        this.targetLocalRepoPath = targetLocalRepoPath;
-        this.copy = copy;
-        this.dryRun = dryRun;
-        this.executeMavenMetadataCalculation = executeMavenMetadataCalculation;
-        this.pruneEmptyFolders = pruneEmptyFolders;
-        this.properties = properties;
-        this.suppressLayouts = suppressLayouts;
-        this.failFast = failFast;
-        this.unixStyleBehavior = unixStyleBehavior;
-        this.atomic = atomic;
-    }
-
-    public Properties getProperties() {
-        return properties;
-    }
-
-    /**
-     * Returns the repo path of the source
-     *
-     * @return Source repo path
-     */
-    public RepoPath getFromRepoPath() {
-        return fromRepoPath;
-    }
-
-    /**
-     * @return Returns the target repo path (if null, the target path should be in targetLocalRepoKey)
-     */
-    public RepoPath getTargetLocalRepoPath() {
-        return targetLocalRepoPath;
-    }
-
-    /**
-     * Indicates if a copy is being performed
-     *
-     * @return True if performing a copy, false if not
-     */
-    public boolean isCopy() {
-        return copy;
-    }
-
-    /**
-     * Indicates if the current run is a dry one (no items actually moved)
-     *
-     * @return True if run is dry, false if not
-     */
-    public boolean isDryRun() {
-        return dryRun;
-    }
-
-    /**
-     * Indicates if the metadata should be calculated immediately or scheduled
-     *
-     * @return True if metadata should be calculated immediately, false if not
-     */
-    public boolean isExecuteMavenMetadataCalculation() {
-        return executeMavenMetadataCalculation;
-    }
-
-    /**
-     * Indicates if search results are being moved (will perform empty dir cleanup)
-     *
-     * @return True if search results are being moved, false if not
-     */
-    public boolean isPruneEmptyFolders() {
-        return pruneEmptyFolders;
-    }
-
-    /**
-     * Indicates whether path translation across different layouts should be suppressed.
-     *
-     * @return True if path translation should be suppressed
-     */
-    public boolean isSuppressLayouts() {
-        return suppressLayouts;
-    }
-
-    /**
-     * Indicates whether the operation should fail upon encountering an error.
-     *
-     * @return True if the operation should fail on the first error
-     */
-    public boolean isFailFast() {
-        return failFast;
-    }
-
-    /**
-     * Indicates whether to deal with existing nested folders like unix when copying or moving:
-     * if a source folder being copied already exists in the target, another folder with the same name
-     * will be created under the target to avoid overwriting the target.
-     * i.e. when copying source path org/jfrog/1 to target path org/jfrog/1 , the result will be org/jfrog/1/1
-     *
-     * @return True if Unix-style behavior should be used when dealing with existing nested folders.
-     */
-    public boolean isUnixStyleBehavior() {
-        return unixStyleBehavior;
-    }
-
-    public boolean isAtomic() {
-        return atomic;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/mover/MoverConfigBuilder.java b/backend/core/src/main/java/org/artifactory/repo/service/mover/MoverConfigBuilder.java
deleted file mode 100644
index 5462301..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/mover/MoverConfigBuilder.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.service.mover;
-
-import org.artifactory.api.util.Builder;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-
-/**
- * Repo path mover configuration object builder
- *
- * @author Noam Y. Tenne
- */
-public class MoverConfigBuilder implements Builder<MoverConfig> {
-    private RepoPath fromRepoPath;
-    private RepoPath targetLocalRepoPath;
-    private boolean copy = false;
-    private boolean dryRun = false;
-    private boolean executeMavenMetadataCalculation = false;
-    private boolean pruneEmptyFolders = false;
-    private Properties properties;
-    private boolean suppressLayouts = false;
-    private boolean failFast = false;
-    private boolean unixStyleBehavior = true;
-    private boolean atomic = false;
-
-    public MoverConfigBuilder(RepoPath fromRepoPath, RepoPath targetLocalRepoPath) {
-        this.fromRepoPath = fromRepoPath;
-        this.targetLocalRepoPath = targetLocalRepoPath;
-    }
-
-    /**
-     * Indicate if a copy is being performed
-     *
-     * @param copy True if performing a copy, false if not
-     * @return MoverConfigBuilder
-     */
-    public MoverConfigBuilder copy(boolean copy) {
-        this.copy = copy;
-        return this;
-    }
-
-    /**
-     * Indicate if a copy is being performed
-     *
-     * @param atomic True if performing a copy, false if not
-     * @return MoverConfigBuilder
-     */
-    public MoverConfigBuilder atomic(boolean atomic) {
-        this.atomic = atomic;
-        return this;
-    }
-
-    /**
-     * Indicate if the current run is a dry one (no items actually moved)
-     *
-     * @param run True if run is dry, false if not
-     * @return MoverConfigBuilder
-     */
-    public MoverConfigBuilder dryRun(boolean run) {
-        this.dryRun = run;
-        return this;
-    }
-
-    /**
-     * Indicates if Unix-style behavior should be used when dealing with existing nested folders
-     * @see org.artifactory.repo.service.mover.MoverConfig
-     *
-     * @param unixStyleBehavior True if Unix-style behavior should be used
-     * @return MoverConfigBuilder
-     */
-    public MoverConfigBuilder unixStyleBehavior(boolean unixStyleBehavior) {
-        this.unixStyleBehavior = unixStyleBehavior;
-        return this;
-    }
-
-    /**
-     * @param properties
-     * @return MoverConfigBuilder
-     */
-    public MoverConfigBuilder properties(Properties properties) {
-        this.properties = properties;
-        return this;
-    }
-
-    /**
-     * Indicate if the metadata should be calculated immediately or scheduled
-     *
-     * @param calculation True if metadata should be calculated immediately, false if not
-     * @return MoverConfigBuilder
-     */
-    public MoverConfigBuilder executeMavenMetadataCalculation(boolean calculation) {
-        this.executeMavenMetadataCalculation = calculation;
-        return this;
-    }
-
-    /**
-     * Indicate if search results are being moved (will perform empty dir cleanup)
-     *
-     * @param pruneEmptyFolders True if should prune empty folders after move (usually when moving search results or during a build promotion)
-     * @return MoverConfigBuilder
-     */
-    public MoverConfigBuilder pruneEmptyFolders(boolean pruneEmptyFolders) {
-        this.pruneEmptyFolders = pruneEmptyFolders;
-        return this;
-    }
-
-    /**
-     * Indicate whether path translation across different layouts should be suppressed.
-     *
-     * @param suppressLayouts True if path translation should be suppressed
-     * @return MoverConfigBuilder
-     */
-    public MoverConfigBuilder suppressLayouts(boolean suppressLayouts) {
-        this.suppressLayouts = suppressLayouts;
-        return this;
-    }
-
-    /**
-     * Indicate whether the operation should fail upon encountering an error.
-     *
-     * @param failFast True if the operation should fail upon encountering an error.
-     * @return MoverConfigBuilder
-     */
-    public MoverConfigBuilder failFast(boolean failFast) {
-        this.failFast = failFast;
-        return this;
-    }
-
-    /**
-     * Builds a mover configuration object with the given parameters
-     *
-     * @return MoverConfig
-     */
-    @Override
-    public MoverConfig build() {
-        return new MoverConfig(fromRepoPath, targetLocalRepoPath, copy, dryRun,executeMavenMetadataCalculation,
-                pruneEmptyFolders, properties, suppressLayouts, failFast, unixStyleBehavior, atomic);
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/mover/MoverProxy.java b/backend/core/src/main/java/org/artifactory/repo/service/mover/MoverProxy.java
deleted file mode 100644
index df2070b..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/mover/MoverProxy.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package org.artifactory.repo.service.mover;
-
-import org.artifactory.api.common.MoveMultiStatusHolder;
-import org.artifactory.common.StatusEntry;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoRepoPath;
-import org.artifactory.sapi.fs.MutableVfsFolder;
-import org.artifactory.sapi.fs.VfsFile;
-import org.artifactory.sapi.fs.VfsFolder;
-import org.artifactory.sapi.fs.VfsItem;
-import org.artifactory.storage.fs.lock.LockingHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-/**
- * @author Chen Keinan
- */
- at Service
-public class MoverProxy implements LockableMover {
-    private static final Logger log = LoggerFactory.getLogger(BaseRepoPathMover.class);
-
-    @Override
-    public void moveCopyFile(VfsItem source, RepoRepoPath<LocalRepo> targetRrp, BaseRepoPathMover repoPathMover, MoveMultiStatusHolder status) {
-
-        RepoPath targetRepoPath = targetRrp.getRepoPath();
-        StatusEntry lastError = status.getLastError();
-        // call interceptors before operation
-        repoPathMover.beforeOperationOnFile(source, targetRepoPath);
-        if (status.getCancelException(lastError) != null) {
-            return;
-        }
-        repoPathMover.overrideTargetFileIfExist(targetRrp, targetRrp.getRepo());
-        // copy or move file
-        repoPathMover.operationOnFile((VfsFile) source, targetRrp);
-        repoPathMover.saveSession();
-        LockingHelper.removeLockEntry(source.getRepoPath());
-    }
-
-    @Override
-    public VfsFolderRepo moveCopyFolder(VfsItem source, RepoRepoPath<LocalRepo> targetRrp, BaseRepoPathMover repoPathMove,
-                                           MoveMultiStatusHolder status) {
-        MutableVfsFolder mutableVfsFolder = null;
-        if (repoPathMove.canMove(source, targetRrp)) {
-            if (!repoPathMove.dryRun) {
-                source = repoPathMove.getSourceItem(source);
-                log.debug("start move/copy single tx on source {} and target {} ", source.getName(), targetRrp.getRepoPath().getPath());
-                RepoPath targetRepoPath = targetRrp.getRepoPath();
-                if (repoPathMove.validateDryRun(targetRrp)) return null;
-                StatusEntry lastError = status.getLastError();
-                //call interceptors before move or copy operation
-                repoPathMove.beforeOperationOnFolder(source, targetRepoPath);
-                if (status.getCancelException(lastError) != null) {
-                    return null;
-                }
-                mutableVfsFolder = repoPathMove.shallowCopyDirectory((VfsFolder) source, targetRrp);
-            }
-            } else if (!repoPathMove.contains(targetRrp) ||
-                    targetRrp.getRepo().getImmutableFsItem(targetRrp.getRepoPath()).isFile()) {
-                // target repo doesn't accept this path and it doesn't already contain it OR the target is a file
-                // so there is no point to continue to the children
-                status.error("Cannot create/override the path '" + targetRrp.getRepoPath() + "'. " +
-                        "Skipping this path and all its children.", log);
-                return null;
-
-            }
-            repoPathMove.saveSession();
-        return new VfsFolderRepo(mutableVfsFolder,targetRrp);
-    }
-
-    @Override
-    public void postFolderProcessing(VfsItem sourceItem, VfsFolder targetFolder,RepoRepoPath<LocalRepo> targetRrp, BaseRepoPathMover repoPathMover, Properties properties,int numOfChildren) {
-        repoPathMover.afterOperationOnFolder(sourceItem,targetRrp,targetFolder);
-        repoPathMover.deleteAndReplicateAfterMoveEvent((MutableVfsFolder)targetFolder,numOfChildren);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/mover/RepoPathIterator.java b/backend/core/src/main/java/org/artifactory/repo/service/mover/RepoPathIterator.java
deleted file mode 100644
index 17fcc9b..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/mover/RepoPathIterator.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.service.mover;
-
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.repo.RepoPath;
-
-import java.util.Iterator;
-
-/**
- * An iterator of {@link org.artifactory.repo.RepoPath}. Allows iteration from the root repo path up to the input repo
- * path.
- * This iterator doesn't support java.util.Iterator#remove()
- *
- * @author Yossi Shaul
- */
-class RepoPathIterator implements Iterator<RepoPath> {
-    private final String[] pathElements;
-
-    private RepoPath current;
-    private int index;
-
-    public RepoPathIterator(RepoPath repoPath) {
-        pathElements = repoPath.toPath().split("/");
-    }
-
-    @Override
-    public boolean hasNext() {
-        return index < pathElements.length;
-    }
-
-    @Override
-    public RepoPath next() {
-        if (current == null) {
-            current = new RepoPathImpl(pathElements[0], "");
-        } else {
-            current = new RepoPathImpl(current, pathElements[index]);
-        }
-        index++;
-        return current;
-    }
-
-    /**
-     * Repo path removal is not supported
-     */
-    @Override
-    public void remove() {
-        throw new UnsupportedOperationException("Remove is not implemented");
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/mover/RepoPathMover.java b/backend/core/src/main/java/org/artifactory/repo/service/mover/RepoPathMover.java
deleted file mode 100644
index ec274b0..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/mover/RepoPathMover.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.service.mover;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.LayoutsCoreAddon;
-import org.artifactory.api.common.MoveMultiStatusHolder;
-import org.artifactory.api.repo.Request;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoRepoPath;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.sapi.fs.VfsItem;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-/**
- * Moves a folder repo path from one local repository to another non-cache local repository. Only files and folders that
- * are accepted by the target repository will be moved. This class is stateless.
- *
- * @author Yossi Shaul
- */
- at Component
-public abstract class RepoPathMover {
-    private static final Logger log = LoggerFactory.getLogger(RepoPathMover.class);
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Autowired
-    private InternalRepositoryService repositoryService;
-
-    @Request(aggregateEventsByTimeWindow = true)
-    public abstract void executeOperation(MoveMultiStatusHolder status, MoverConfig moverConfig);
-
-    protected abstract void handleMoveOrCopy(MoveMultiStatusHolder status, MoverConfig moverConfig,
-                                             VfsItem sourceItem, RepoRepoPath<LocalRepo> targetRrp);
-
-
-    @Request(aggregateEventsByTimeWindow = true)
-    public void moveOrCopy(MoveMultiStatusHolder status, MoverConfig moverConfig) {
-        boolean isDryRun = moverConfig.isDryRun();
-        RepoPath fromRepoPath = moverConfig.getFromRepoPath();
-
-        // don't output to the logger if executing in dry run
-        status.setActivateLogging(!isDryRun);
-
-        LocalRepo sourceRepo = getLocalRepo(fromRepoPath.getRepoKey());
-        VfsItem sourceItem = sourceRepo.getImmutableFsItem(fromRepoPath);
-        if (sourceItem == null) {
-            throw new IllegalArgumentException("Could not find item at " + fromRepoPath);
-        }
-
-        RepoPath targetLocalRepoPath = moverConfig.getTargetLocalRepoPath();
-        // String opType = (moverConfig.isCopy()) ? "copy" : "move";
-        if (fromRepoPath.equals(targetLocalRepoPath)) {
-            status.error(String.format("Skipping %s %s: Destination and source are the same", operationType(), fromRepoPath),
-                    log);
-            return;
-        }
-
-        RepoRepoPath<LocalRepo> targetRrp = repositoryService.getRepoRepoPath(targetLocalRepoPath);
-        if (targetRrp.getRepo().isCache()) {
-            throw new IllegalArgumentException(String.format("Target repository %s is a cache repository. %s to cache" +
-                    " repositories is not allowed.", targetLocalRepoPath.getRepoKey(), operationType()));
-        }
-
-        LayoutsCoreAddon layoutsCoreAddon = addonsManager.addonByType(LayoutsCoreAddon.class);
-        boolean canCrossLayouts = !moverConfig.isSuppressLayouts() &&
-                layoutsCoreAddon.canCrossLayouts(sourceRepo.getDescriptor().getRepoLayout(),
-                        targetRrp.getRepo().getDescriptor().getRepoLayout());
-
-        if (canCrossLayouts) {
-            layoutsCoreAddon.performCrossLayoutMoveOrCopy(status, moverConfig,
-                    sourceRepo, targetRrp.getRepo(), sourceItem);
-        } else {
-            handleMoveOrCopy(status, moverConfig, sourceItem, targetRrp);
-        }
-    }
-
-    protected abstract String operationType();
-
-    protected LocalRepo getLocalRepo(String repoKey) {
-        LocalRepo targetLocalRepo = repositoryService.localOrCachedRepositoryByKey(repoKey);
-        if (targetLocalRepo == null) {
-            throw new IllegalArgumentException("Local repository " + repoKey +
-                    " not found (repository is not local or doesn't exist)");
-        }
-        return targetLocalRepo;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/mover/VfsFolderRepo.java b/backend/core/src/main/java/org/artifactory/repo/service/mover/VfsFolderRepo.java
deleted file mode 100644
index 6ad5462..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/mover/VfsFolderRepo.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.repo.service.mover;
-
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RepoRepoPath;
-import org.artifactory.sapi.fs.MutableVfsFolder;
-import org.artifactory.sapi.fs.VfsItem;
-
-/**
- * @author Chen Keinan
- */
-public class VfsFolderRepo {
-
-    private RepoRepoPath repoRepoPath;
-    private VfsItem vfsItem;
-
-    public VfsFolderRepo(MutableVfsFolder mutableVfsFolder, RepoRepoPath<LocalRepo> targetRrp) {
-        this.repoRepoPath = targetRrp;
-        this.vfsItem = mutableVfsFolder;
-    }
-
-    public RepoRepoPath getRepoRepoPath() {
-        return repoRepoPath;
-    }
-
-    public void setRepoRepoPath(RepoRepoPath repoRepoPath) {
-        this.repoRepoPath = repoRepoPath;
-    }
-
-    public VfsItem getVfsItem() {
-        return vfsItem;
-    }
-
-    public void setVfsItem(VfsItem vfsItem) {
-        this.vfsItem = vfsItem;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/trash/NonTrashableItem.java b/backend/core/src/main/java/org/artifactory/repo/service/trash/NonTrashableItem.java
deleted file mode 100644
index da02fd9..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/trash/NonTrashableItem.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.service.trash;
-
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-
-/**
- * Interface for classes that determine whether an artifact should not be trashed upon deletion
- *
- * @author Shay Yaakov
- */
-public interface NonTrashableItem {
-
-    /**
-     * Indicates whether an artifact can permanently deleted without being sent to trash
-     *
-     * @param descriptor Local non-cache repo descriptor
-     * @param path       Path to check
-     * @return True if the path should be permanently deleted without trashing it
-     */
-    boolean skipTrash(LocalRepoDescriptor descriptor, String path);
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/trash/NonTrashableItems.java b/backend/core/src/main/java/org/artifactory/repo/service/trash/NonTrashableItems.java
deleted file mode 100644
index 4e81916..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/trash/NonTrashableItems.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.artifactory.repo.service.trash;
-
-import org.artifactory.spring.ReloadableBean;
-
-/**
- * @author Shay Yaakov
- */
-public interface NonTrashableItems extends ReloadableBean, NonTrashableItem {
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/trash/NonTrashableItemsImpl.java b/backend/core/src/main/java/org/artifactory/repo/service/trash/NonTrashableItemsImpl.java
deleted file mode 100644
index d0f4bf4..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/trash/NonTrashableItemsImpl.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package org.artifactory.repo.service.trash;
-
-import com.google.common.collect.Sets;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.spring.ArtifactoryApplicationContext;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.version.CompoundVersionDetails;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.BeanNameAware;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
-import org.springframework.stereotype.Service;
-
-import java.util.Collection;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * Aggregates and polls all the items when needing to determine if a path can be sent to trash
- *
- * @author Shay Yaakov
- */
- at Service
- at Reloadable(beanClass = NonTrashableItems.class, initAfter = DbService.class)
-public class NonTrashableItemsImpl implements NonTrashableItems, BeanNameAware, ApplicationContextAware {
-    private static final Logger log = LoggerFactory.getLogger(NonTrashableItemsImpl.class);
-
-    private ArtifactoryApplicationContext context;
-    private Set<NonTrashableItem> trashables = Sets.newHashSet();
-    private String beanName;
-
-    @Override
-    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
-        context = ((ArtifactoryApplicationContext) applicationContext);
-    }
-
-    @Override
-    public void setBeanName(String name) {
-        beanName = name;
-    }
-
-    @Override
-    public void init() {
-        Collection<NonTrashableItem> allTrashablesIncludingMe = context.beansForType(NonTrashableItem.class).values();
-        Object thisAsBean = context.getBean(beanName);
-        trashables.addAll(allTrashablesIncludingMe.stream()
-                .filter(nonTrashableItem -> nonTrashableItem != thisAsBean).collect(Collectors.toList()));
-        log.debug("Loaded trashables: {}", trashables);
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-
-    }
-
-    @Override
-    public void destroy() {
-
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-
-    }
-
-    @Override
-    public boolean skipTrash(LocalRepoDescriptor descriptor, String path) {
-        for (NonTrashableItem nonTrashableItem : trashables) {
-            if (nonTrashableItem.skipTrash(descriptor, path)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/trash/TrashServiceImpl.java b/backend/core/src/main/java/org/artifactory/repo/service/trash/TrashServiceImpl.java
deleted file mode 100644
index 1488722..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/trash/TrashServiceImpl.java
+++ /dev/null
@@ -1,176 +0,0 @@
-package org.artifactory.repo.service.trash;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.common.MoveMultiStatusHolder;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.properties.PropertiesService;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.common.StatusHolder;
-import org.artifactory.config.InternalCentralConfigService;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.md.PropertiesFactory;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.repo.service.trash.prune.TrashcanPruner;
-import org.artifactory.repo.trash.TrashService;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.storage.binstore.service.InternalBinaryService;
-import org.artifactory.version.CompoundVersionDetails;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContext;
-import org.springframework.security.core.context.SecurityContextHolder;
-
-/**
- * @author Shay Yaakov
- */
- at Reloadable(beanClass = TrashService.class, initAfter = {InternalCentralConfigService.class})
-public class TrashServiceImpl implements TrashService {
-    private static final Logger log = LoggerFactory.getLogger(TrashServiceImpl.class);
-
-    @Autowired
-    private InternalRepositoryService repoService;
-
-    @Autowired
-    private SecurityService securityService;
-
-    @Autowired
-    private InternalBinaryService binaryStore;
-
-    @Autowired
-    private CentralConfigService configService;
-
-    @Autowired
-    private PropertiesService propertiesService;
-
-    @Autowired
-    private NonTrashableItems nonTrashableItems;
-
-    public void init() {
-        binaryStore.addGCListener(new TrashcanPruner());
-    }
-
-    @Override
-    public void copyToTrash(RepoPath repoPath) {
-        String repoKey = repoPath.getRepoKey();
-        if (TRASH_KEY.equals(repoKey)) {
-            return;
-        }
-
-        LocalRepoDescriptor localRepoDescriptor = repoService.localOrCachedRepoDescriptorByKey(repoKey);
-        if (localRepoDescriptor == null || localRepoDescriptor.isCache()) {
-            return;
-        }
-
-        if (!configService.getDescriptor().getTrashcanConfig().isEnabled()) {
-            return;
-        }
-
-        if (nonTrashableItems.skipTrash(localRepoDescriptor, repoPath.getPath())) {
-            return;
-        }
-
-        SecurityContext securityContext = SecurityContextHolder.getContext();
-        Authentication originalAuthentication = securityContext.getAuthentication();
-        try {
-            trashAsSystem(repoPath, originalAuthentication.getName());
-        } finally {
-            securityContext.setAuthentication(originalAuthentication);
-        }
-    }
-
-    private void trashAsSystem(RepoPath repoPath, String deletedBy) {
-        securityService.authenticateAsSystem();
-        RepoPath trashPath = RepoPathFactory.create(TRASH_KEY, repoPath.getRepoKey() + "/" + repoPath.getPath());
-        if (repoPath.isFile()) {
-            log.debug("Trashing item '{}'", repoPath);
-            Properties properties = buildDeletedItemProperties(repoPath, deletedBy);
-            repoService.copy(repoPath, trashPath, false, true, true);
-            repoService.setProperties(trashPath, properties);
-        } else {
-            log.debug("Overriding folder properties on trashed item '{}'", trashPath);
-            if (repoService.exists(trashPath)) {
-                repoService.setProperties(trashPath, buildDeletedItemProperties(repoPath, deletedBy));
-            }
-        }
-    }
-
-    @Override
-    public MoveMultiStatusHolder restore(RepoPath repoPath, String restoreRepo, String restorePath) {
-        MoveMultiStatusHolder status = new MoveMultiStatusHolder();
-        if (repoService.localRepositoryByKey(restoreRepo) == null) {
-            status.warn("Restore repo '" + restoreRepo + "' doesn't exist", log);
-            return status;
-        }
-
-        // First delete the unnecessary properties from the items in the trash
-        propertiesService.deletePropertyRecursively(repoPath, PROP_TRASH_TIME, false);
-        propertiesService.deletePropertyRecursively(repoPath, PROP_DELETED_BY, false);
-
-        RepoPath restoreRepoPath = RepoPathFactory.create(restoreRepo, restorePath);
-        final MoveMultiStatusHolder finalStatus = new MoveMultiStatusHolder();
-        if (rootRepoRestore(repoPath)) {
-            repoService.getChildren(repoPath).stream()
-                    .map(ItemInfo::getRepoPath)
-                    .forEach(child -> {
-                        MoveMultiStatusHolder moveMultiStatusHolder = restorePath(child, restoreRepoPath);
-                        finalStatus.merge(moveMultiStatusHolder);
-                    });
-        } else {
-            finalStatus.merge(restorePath(repoPath, restoreRepoPath));
-        }
-
-        return finalStatus;
-    }
-
-    private MoveMultiStatusHolder restorePath(RepoPath repoPath, RepoPath restoreRepoPath) {
-        return repoService.moveMultiTx(repoPath, restoreRepoPath, false, true, true);
-    }
-
-    private boolean rootRepoRestore(RepoPath repoPath) {
-        RepoPath parent = repoPath.getParent();
-        return parent != null && StringUtils.isBlank(parent.getPath());
-    }
-
-    @Override
-    public StatusHolder empty() {
-        return repoService.undeployMultiTransaction(InternalRepoPathFactory.repoRootPath(TRASH_KEY));
-    }
-
-    private Properties buildDeletedItemProperties(RepoPath repoPath, String deletedBy) {
-        Properties properties = repoService.getProperties(repoPath);
-        if (properties == null) {
-            properties = PropertiesFactory.create();
-        }
-        String repoKey = repoPath.getRepoKey();
-        properties.replaceValues(PROP_TRASH_TIME, Lists.newArrayList(String.valueOf(System.currentTimeMillis())));
-        properties.replaceValues(PROP_DELETED_BY, Lists.newArrayList(deletedBy));
-        properties.replaceValues(PROP_ORIGIN_REPO, Lists.newArrayList(repoKey));
-        properties.replaceValues(PROP_ORIGIN_REPO_TYPE, Lists.newArrayList(repoService.repoDescriptorByKey(repoKey).getType().getType()));
-        properties.replaceValues(PROP_ORIGIN_PATH, Lists.newArrayList(repoPath.getPath()));
-        return properties;
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-
-    }
-
-    @Override
-    public void destroy() {
-
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/service/trash/prune/TrashcanPruner.java b/backend/core/src/main/java/org/artifactory/repo/service/trash/prune/TrashcanPruner.java
deleted file mode 100644
index 8f86b2d..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/service/trash/prune/TrashcanPruner.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package org.artifactory.repo.service.trash.prune;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.aql.AqlService;
-import org.artifactory.aql.api.domain.sensitive.AqlApiItem;
-import org.artifactory.aql.result.AqlEagerResult;
-import org.artifactory.aql.result.rows.AqlBaseFullRowImpl;
-import org.artifactory.aql.result.rows.AqlItem;
-import org.artifactory.aql.util.AqlUtils;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.trash.TrashService;
-import org.artifactory.storage.binstore.service.GarbageCollectorListener;
-import org.artifactory.util.TimeUnitFormat;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.concurrent.TimeUnit;
-
-import static org.artifactory.aql.api.internal.AqlBase.and;
-
-/**
- * @author Shay Yaakov
- */
-public class TrashcanPruner implements GarbageCollectorListener {
-    private static final Logger log = LoggerFactory.getLogger(TrashcanPruner.class);
-
-    private final AqlService aqlService;
-    private final RepositoryService repoService;
-    private final CentralConfigService centralConfigService;
-
-    public TrashcanPruner() {
-        this.aqlService = ContextHelper.get().beanForType(AqlService.class);
-        this.repoService = ContextHelper.get().beanForType(RepositoryService.class);
-        this.centralConfigService = ContextHelper.get().getCentralConfig();
-    }
-
-    @Override
-    public void start() {
-        pruneTrashItems();
-    }
-
-    @Override
-    public void finished() {
-
-    }
-
-    @Override
-    public void destroy() {
-
-    }
-
-    private void pruneTrashItems() {
-        // No action if retention is 0 (or less)
-        int retentionPeriodDays = centralConfigService.getDescriptor().getTrashcanConfig().getRetentionPeriodDays();
-        if (retentionPeriodDays <= 0) {
-            return;
-        }
-
-        long start = System.currentTimeMillis();
-        long validFrom = start - TimeUnit.MILLISECONDS.convert(retentionPeriodDays, TimeUnit.DAYS);
-        log.debug("Starting trashcan pruning with valid from date: '{}'", validFrom);
-
-        AqlEagerResult<AqlItem> trashItems = findTrashItems();
-        trashItems.getResults().forEach(item -> deleteItemIfOld(item, validFrom));
-
-        long end = System.currentTimeMillis();
-        String duration = TimeUnitFormat.getTimeString((end - start), TimeUnit.MILLISECONDS);
-        log.info("Trashcan pruning total execution time: '{}'", duration);
-    }
-
-    private AqlEagerResult<AqlItem> findTrashItems() {
-        AqlApiItem query = AqlApiItem.create().filter(and(
-                AqlApiItem.repo().equal(TrashService.TRASH_KEY),
-                AqlApiItem.property().key().equal(TrashService.PROP_TRASH_TIME)));
-
-        return aqlService.executeQueryEager(query);
-    }
-
-    private void deleteItemIfOld(AqlItem item, long validFrom) {
-        RepoPath repoPath = AqlUtils.fromAql((AqlBaseFullRowImpl) item);
-        Properties itemProperties = repoService.getProperties(repoPath);
-        if (itemProperties == null) {
-            log.debug("Unable to find properties for '{}'", repoPath);
-            return;
-        }
-
-        String trashTimeProperty = itemProperties.getFirst(TrashService.PROP_TRASH_TIME);
-        if (StringUtils.isBlank(trashTimeProperty)) {
-            log.warn("Unable to find trash.time property for '{}'", repoPath);
-            return;
-        }
-
-        try {
-            long trashTime = Long.parseLong(trashTimeProperty);
-            if (trashTime < validFrom) {
-                log.debug("Removing old trash item '{}' with trash time of '{}'", repoPath, trashTime);
-                repoService.undeploy(repoPath, false, false);
-            }
-        } catch (Exception e) {
-            log.error("Error during deletion of the old trash item '{}': '{}'", repoPath, e.getMessage());
-            log.debug("Error during deletion old trash item: " + e.getMessage(), e);
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/snapshot/DeployerSnapshotVersionAdapter.java b/backend/core/src/main/java/org/artifactory/repo/snapshot/DeployerSnapshotVersionAdapter.java
deleted file mode 100644
index 4e83dbb..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/snapshot/DeployerSnapshotVersionAdapter.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.snapshot;
-
-/**
- * This adapter doesn't modify in any way the input path.
- *
- * @author Yossi Shaul
- */
-public class DeployerSnapshotVersionAdapter extends SnapshotVersionAdapterBase {
-
-    @Override
-    protected boolean isApplicableOn(MavenSnapshotVersionAdapterContext context) {
-        return false;
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/repo/snapshot/LatestVersionResolver.java b/backend/core/src/main/java/org/artifactory/repo/snapshot/LatestVersionResolver.java
deleted file mode 100644
index 5a4d862..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/snapshot/LatestVersionResolver.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.snapshot;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.module.ModuleInfoUtils;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.request.TranslatedArtifactoryRequest;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.Repo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.request.ArtifactoryRequest;
-import org.artifactory.request.DownloadRequestContext;
-import org.artifactory.request.InternalRequestContext;
-import org.artifactory.request.NullRequestContext;
-
-/**
- * Resolves the latest unique snapshot version given a non-unique Maven snapshot artifact request or a request with
- * [RELEASE]/[INTEGRATION] place holders for non-maven.
- *
- * @author Shay Yaakov
- */
-public abstract class LatestVersionResolver {
-
-    /**
-     * Retrieves a transformed request context with the actual latest release/integration version.
-     * Request with the [RELEASE] token will be transformed to the actual release version.
-     * For maven a SNAPSHOT request will be transformed to a unique snapshot version while for non-maven
-     * the [INTEGRATION] token will be transformed to the actual integration version according the the underlying repo layout.
-     */
-    public InternalRequestContext getDynamicVersionContext(Repo repo, InternalRequestContext originalRequestContext) {
-        String path = originalRequestContext.getResourcePath();
-        RepoLayout repoLayout = repo.getDescriptor().getRepoLayout();
-        if (!ConstantValues.requestDisableVersionTokens.getBoolean() && StringUtils.isNotBlank(
-                path) && repoLayout != null) {
-
-            if (repo.getDescriptor().isMavenRepoLayout() && shouldSkipMavenRequest(path)) {
-                return originalRequestContext;
-            }
-
-            ModuleInfo originalModuleInfo = ModuleInfoUtils.moduleInfoFromArtifactPath(path, repoLayout, true);
-            if (!originalModuleInfo.isValid()) {
-                return originalRequestContext;
-            }
-
-            return getRequestContext(originalRequestContext, repo, originalModuleInfo);
-        }
-
-        return originalRequestContext;
-    }
-
-    /**
-     * For maven, only process non unique snapshot requests or path with release tokens
-     */
-    private boolean shouldSkipMavenRequest(String path) {
-        return !MavenNaming.isNonUniqueSnapshot(path) && !StringUtils.contains(path, "[RELEASE]");
-    }
-
-    /**
-     * Derived classes should implement their logic and return the transformed {@link InternalRequestContext}
-     *
-     * @param requestContext     the original request context to transform
-     * @param repo
-     * @param path
-     * @param originalModuleInfo
-     * @return
-     */
-    protected abstract InternalRequestContext getRequestContext(InternalRequestContext requestContext, Repo repo,
-            ModuleInfo originalModuleInfo);
-
-    protected RepositoryService getRepositoryService() {
-        return ContextHelper.get().getRepositoryService();
-    }
-
-    /**
-     * Returns a new request context if the translated path is different from the original request path
-     *
-     * @param repo    Target repository
-     * @param context Request context to translate
-     * @return Translated context if needed, original if not needed or if there is insufficient info
-     */
-    protected InternalRequestContext translateRepoRequestContext(InternalRequestContext context, Repo repo,
-            String translatedPath) {
-        String originalPath = context.getResourcePath();
-        if (originalPath.equals(translatedPath)) {
-            return context;
-        }
-
-        if (context instanceof NullRequestContext) {
-            return new NullRequestContext(repo.getRepoPath(translatedPath));
-        }
-
-        ArtifactoryRequest artifactoryRequest = ((DownloadRequestContext) context).getRequest();
-        RepoPath translatedRepoPath = InternalRepoPathFactory.create(artifactoryRequest.getRepoKey(), translatedPath);
-        TranslatedArtifactoryRequest translatedRequest = new TranslatedArtifactoryRequest(translatedRepoPath,
-                artifactoryRequest);
-        return new DownloadRequestContext(translatedRequest);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/snapshot/LocalLatestVersionResolver.java b/backend/core/src/main/java/org/artifactory/repo/snapshot/LocalLatestVersionResolver.java
deleted file mode 100644
index 52c6f4d..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/snapshot/LocalLatestVersionResolver.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.snapshot;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.TreeMultimap;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.module.ModuleInfoBuilder;
-import org.artifactory.api.repo.BaseBrowsableItem;
-import org.artifactory.api.repo.BrowsableItemCriteria;
-import org.artifactory.api.repo.RepositoryBrowsingService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.repo.exception.ItemNotFoundRuntimeException;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.SnapshotVersionBehavior;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.maven.versioning.MavenVersionComparator;
-import org.artifactory.md.Properties;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.repo.Repo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.repo.StoringRepo;
-import org.artifactory.request.InternalRequestContext;
-import org.artifactory.util.PathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Resolves the latest unique snapshot version given a non-unique Maven snapshot artifact request
- * or a request with [RELEASE]/[INTEGRATION] place holders for latest release or latest integration version respectively
- * from local and cache repositories (from remotes only works for maven repos by analyzing the remote maven-metadata).
- *
- * @author Shay Yaakov
- */
-public class LocalLatestVersionResolver extends LatestVersionResolver {
-    private static final Logger log = LoggerFactory.getLogger(LocalLatestVersionResolver.class);
-
-    private final MavenVersionComparator mavenVersionComparator = new MavenVersionComparator();
-
-    @Override
-    protected InternalRequestContext getRequestContext(InternalRequestContext requestContext, Repo repo,
-            ModuleInfo originalModuleInfo) {
-        if (!(repo.isLocal())) {
-            return requestContext;
-        }
-
-        String path = requestContext.getResourcePath();
-        if (repo.getDescriptor().isMavenRepoLayout() && MavenNaming.isNonUniqueSnapshot(path)) {
-            requestContext = getMavenLatestSnapshotRequestContext(requestContext, repo, originalModuleInfo);
-        } else {
-            boolean searchForReleaseVersion = StringUtils.contains(path, "[RELEASE]");
-            boolean searchForIntegrationVersion = StringUtils.contains(path, "[INTEGRATION]");
-            if (searchForReleaseVersion || searchForIntegrationVersion) {
-                requestContext = getLatestVersionRequestContext(requestContext, (StoringRepo) repo,
-                        originalModuleInfo, searchForReleaseVersion);
-            }
-        }
-
-        return requestContext;
-    }
-
-    private InternalRequestContext getLatestVersionRequestContext(InternalRequestContext requestContext,
-            StoringRepo repo, ModuleInfo originalModuleInfo, boolean searchForReleaseVersion) {
-        VersionsRetriever retriever =
-                searchForReleaseVersion ? new ReleaseVersionsRetriever(true) : new SnapshotVersionsRetriever(true);
-        ModuleInfo baseRevisionModule = getBaseRevisionModuleInfo(originalModuleInfo);
-        TreeMultimap<Calendar, ItemInfo> versionsItems = retriever.collectVersionsItems(repo, baseRevisionModule, true);
-        if (versionsItems != null) {
-            if (searchForReleaseVersion && !ConstantValues.requestSearchLatestReleaseByDateCreated.getBoolean()) {
-                return getRequestContentForReleaseByVersion(versionsItems.values(), repo, requestContext,
-                        originalModuleInfo);
-            } else {
-                return getRequestContextFromMap(versionsItems, repo, requestContext, originalModuleInfo,
-                        searchForReleaseVersion);
-            }
-        } else {
-            return requestContext;
-        }
-    }
-
-    private InternalRequestContext getRequestContentForReleaseByVersion(Collection<ItemInfo> itemInfos,
-            StoringRepo repo, InternalRequestContext requestContext, ModuleInfo originalModuleInfo) {
-        List<ItemInfo> itemsList = Lists.newArrayList(itemInfos);
-        String originalPath = requestContext.getResourcePath();
-        RepositoryService repositoryService = getRepositoryService();
-        ModuleInfo latestModuleInfo = null;
-        String latestArtifactPath = originalPath;
-        for (ItemInfo item : itemsList) {
-            if (!item.isFolder()) {
-                ModuleInfo itemModuleInfo = repositoryService.getItemModuleInfo(item.getRepoPath());
-                if (itemModuleInfo.isValid()) {
-                    if (areModuleInfosTheSame(originalModuleInfo, itemModuleInfo) && isPropertiesMatch(item,
-                            requestContext.getProperties())) {
-                        ModuleInfo resultModuleInfo = getLatestModuleInfo(itemModuleInfo, latestModuleInfo);
-                        if (!resultModuleInfo.equals(latestModuleInfo)) {
-                            latestModuleInfo = resultModuleInfo;
-                            latestArtifactPath = item.getRepoPath().getPath();
-                        }
-                    }
-                }
-            }
-        }
-
-        return translateRepoRequestContext(requestContext, repo, latestArtifactPath);
-    }
-
-    private InternalRequestContext getRequestContextFromMap(TreeMultimap<Calendar, ItemInfo> versionsItems,
-            StoringRepo repo, InternalRequestContext requestContext, ModuleInfo originalModuleInfo,
-            boolean searchForReleaseVersion) {
-        RepositoryService repositoryService = ContextHelper.get().getRepositoryService();
-        for (Map.Entry<Calendar, ItemInfo> entry : versionsItems.entries()) {
-            ItemInfo item = entry.getValue();
-            if (!item.isFolder()) {
-                ModuleInfo itemModuleInfo = repositoryService.getItemModuleInfo(item.getRepoPath());
-                boolean isIntegration = itemModuleInfo.isIntegration();
-                boolean matchReleaseSearch = searchForReleaseVersion && !isIntegration;
-                boolean matchIntegrationSearch = !searchForReleaseVersion && isIntegration;
-                if (itemModuleInfo.isValid() && (matchReleaseSearch || matchIntegrationSearch)) {
-                    if (areModuleInfosTheSame(originalModuleInfo, itemModuleInfo) && isPropertiesMatch(item,
-                            requestContext.getProperties())) {
-                        return translateRepoRequestContext(requestContext, repo, item.getRelPath());
-                    }
-                }
-            }
-        }
-
-        return requestContext;
-    }
-
-    private boolean isPropertiesMatch(ItemInfo itemInfo, Properties requestProps) {
-        if (requestProps == null || requestProps.isEmpty()) {
-            return true;
-        }
-        Properties nodeProps = getRepositoryService().getProperties(itemInfo.getRepoPath());
-        Properties.MatchResult result = nodeProps != null ? nodeProps.matchQuery(requestProps) : null;
-        return !Properties.MatchResult.CONFLICT.equals(result);
-    }
-
-    private ModuleInfo getBaseRevisionModuleInfo(ModuleInfo deployedModuleInfo) {
-        return new ModuleInfoBuilder().organization(deployedModuleInfo.getOrganization()).
-                module(deployedModuleInfo.getModule()).baseRevision(deployedModuleInfo.getBaseRevision()).build();
-    }
-
-    private InternalRequestContext getMavenLatestSnapshotRequestContext(InternalRequestContext requestContext,
-            Repo repo, ModuleInfo originalModuleInfo) {
-        LocalRepoDescriptor repoDescriptor = (LocalRepoDescriptor) repo.getDescriptor();
-        if (repoDescriptor.getSnapshotVersionBehavior().equals(SnapshotVersionBehavior.NONUNIQUE)) {
-            return requestContext;
-        }
-
-        String path = requestContext.getResourcePath();
-        String parentPath = PathUtils.getParent(path);
-        RepoPath parentRepoPath = RepoPathFactory.create(repo.getKey(), parentPath);
-        boolean isDeployerBehavior = SnapshotVersionBehavior.DEPLOYER.equals(
-                repoDescriptor.getSnapshotVersionBehavior());
-        String artifactPath = getLatestArtifactPath(parentRepoPath, originalModuleInfo, isDeployerBehavior,
-                requestContext.getProperties());
-
-        return artifactPath != null ? translateRepoRequestContext(requestContext, repo, artifactPath) : requestContext;
-    }
-
-    /**
-     * Retrieves the path to the latest unique artifact (null if not found)
-     *
-     * @param parentRepoPath     the parent folder to search within
-     * @param originalModuleInfo the user request module info to compare with
-     * @param isDeployerBehavior on deployer behaviour compares by last modified, otherwise by version string
-     * @param properties         the original request properties (can be null)
-     * @return a path to the latest unique artifact (null if not found)
-     */
-    private String getLatestArtifactPath(RepoPath parentRepoPath, ModuleInfo originalModuleInfo,
-            boolean isDeployerBehavior, Properties requestProperties) {
-        RepositoryService repositoryService = getRepositoryService();
-        ModuleInfo latestModuleInfo = null;
-        long latestLastModified = 0;
-        String latestArtifactPath = null;
-        BrowsableItemCriteria criteria = new BrowsableItemCriteria.Builder(parentRepoPath)
-                .requestProperties(requestProperties)
-                .includeChecksums(false)
-                .includeRemoteResources(false)
-                .build();
-        RepositoryBrowsingService repositoryBrowsingService = ContextHelper.get().beanForType(
-                RepositoryBrowsingService.class);
-
-        List<BaseBrowsableItem> children;
-        try {
-            children = repositoryBrowsingService.getLocalRepoBrowsableChildren(criteria);
-        } catch (ItemNotFoundRuntimeException e) {
-            // Simply log the message and return null
-            log.debug(e.getMessage());
-            return null;
-        }
-
-        for (BaseBrowsableItem child : children) {
-            if (!child.isFolder()) {
-                ModuleInfo itemModuleInfo = repositoryService.getItemModuleInfo(child.getRepoPath());
-                if (itemModuleInfo.isValid()) {
-                    if (areModuleInfosTheSame(originalModuleInfo, itemModuleInfo)) {
-                        if (isDeployerBehavior) {
-                            long childLastModified = child.getLastModified();
-                            if (childLastModified > latestLastModified) {
-                                latestLastModified = childLastModified;
-                                latestArtifactPath = child.getRepoPath().getPath();
-                            }
-                        } else {
-                            ModuleInfo resultModuleInfo = getLatestModuleInfo(itemModuleInfo, latestModuleInfo);
-                            if (!resultModuleInfo.equals(latestModuleInfo)) {
-                                latestModuleInfo = resultModuleInfo;
-                                latestArtifactPath = child.getRepoPath().getPath();
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        return latestArtifactPath;
-    }
-
-    /**
-     * Compares 2 given module infos and returns the latest one
-     */
-    private ModuleInfo getLatestModuleInfo(@Nonnull ModuleInfo moduleInfo1, @Nullable ModuleInfo moduleInfo2) {
-        if (moduleInfo2 == null) {
-            return moduleInfo1;
-        }
-
-        String version1 = moduleInfo1.getBaseRevision() + "-" + moduleInfo1.getFileIntegrationRevision();
-        String version2 = moduleInfo2.getBaseRevision() + "-" + moduleInfo2.getFileIntegrationRevision();
-
-        if (moduleInfo1.getFileIntegrationRevision() == null && moduleInfo2.getFileIntegrationRevision() == null) {
-            version1 = moduleInfo1.getBaseRevision();
-            version2 = moduleInfo2.getBaseRevision();
-        }
-
-        return (mavenVersionComparator.compare(version1, version2) >= 0) ? moduleInfo1 : moduleInfo2;
-    }
-
-    private boolean areModuleInfosTheSame(ModuleInfo originalModuleInfo, ModuleInfo moduleInfo) {
-        boolean releaseCondition = StringUtils.equals(originalModuleInfo.getOrganization(),
-                moduleInfo.getOrganization())
-                && StringUtils.equals(originalModuleInfo.getModule(), moduleInfo.getModule())
-                && StringUtils.equals(originalModuleInfo.getClassifier(), moduleInfo.getClassifier())
-                && StringUtils.equals(originalModuleInfo.getExt(), moduleInfo.getExt());
-
-        boolean integrationCondition = releaseCondition
-                && StringUtils.equals(originalModuleInfo.getBaseRevision(), moduleInfo.getBaseRevision());
-
-        return originalModuleInfo.isIntegration() ? integrationCondition : releaseCondition;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/snapshot/NonUniqueSnapshotVersionAdapter.java b/backend/core/src/main/java/org/artifactory/repo/snapshot/NonUniqueSnapshotVersionAdapter.java
deleted file mode 100644
index 4b05d6f..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/snapshot/NonUniqueSnapshotVersionAdapter.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.snapshot;
-
-import org.apache.commons.io.FilenameUtils;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.util.PathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * This snapshot version adapter changes unique snapshot versions to non-unique.
- *
- * @author Yossi Shaul
- */
-public class NonUniqueSnapshotVersionAdapter extends SnapshotVersionAdapterBase {
-    private static final Logger log = LoggerFactory.getLogger(NonUniqueSnapshotVersionAdapter.class);
-
-    @Override
-    protected String adapt(MavenSnapshotVersionAdapterContext context) {
-        String path = context.getRepoPath().getPath();
-
-        String fileName = PathUtils.getFileName(path);
-        if (!MavenNaming.isUniqueSnapshotFileName(fileName)) {
-            log.debug("File '{}' is not a unique snapshot version. Returning the original path.", fileName);
-            return path;
-        }
-
-        String pathBaseVersion = context.getModuleInfo().getBaseRevision();
-        String timestampAndBuildNumber = MavenNaming.getUniqueSnapshotVersionTimestampAndBuildNumber(fileName);
-        if (!fileName.contains(pathBaseVersion + "-" + timestampAndBuildNumber)) {
-            log.debug("File '{}' version is not equals to the path base version '{}'. " +
-                    "Returning the original path.", fileName, pathBaseVersion);
-            return path;
-        }
-
-        // replace the timestamp and build number part with 'SNAPSHOT' string
-        String adaptedFileName = fileName.replace(timestampAndBuildNumber, MavenNaming.SNAPSHOT);
-        return FilenameUtils.getPath(path) + adaptedFileName;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/snapshot/ReleaseVersionsRetriever.java b/backend/core/src/main/java/org/artifactory/repo/snapshot/ReleaseVersionsRetriever.java
deleted file mode 100644
index fd3623f..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/snapshot/ReleaseVersionsRetriever.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.snapshot;
-
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.module.regex.NamedPattern;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.StoringRepo;
-import org.artifactory.storage.fs.tree.ItemNode;
-import org.artifactory.storage.fs.tree.ItemNodeFilter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nonnull;
-import java.util.Calendar;
-import java.util.List;
-
-/**
- * Collects release versions items under a given root node.
- *
- * @author Shay Yaakov
- */
-public class ReleaseVersionsRetriever extends VersionsRetriever {
-    private static final Logger log = LoggerFactory.getLogger(ReleaseVersionsRetriever.class);
-
-    public ReleaseVersionsRetriever(boolean reverseOrderResults) {
-        super(reverseOrderResults);
-    }
-
-    @Override
-    protected void internalCollectVersionsItems(StoringRepo repo, ItemNode node) {
-        if (node.isFolder()) {
-            List<ItemNode> children = node.getChildren();
-            for (ItemNode child : children) {
-                internalCollectVersionsItems(repo, child);
-            }
-        } else {
-            Calendar cal = Calendar.getInstance();
-            cal.setTimeInMillis(node.getItemInfo().getCreated());
-            versionsItems.put(cal, node.getItemInfo());
-        }
-    }
-
-    @Override
-    public ItemNodeFilter getFileFilter(StoringRepo repo, NamedPattern pattern) {
-        return new ReleaseFileFilter(repo, pattern);
-    }
-
-    private static class ReleaseFileFilter implements ItemNodeFilter {
-        private final StoringRepo repo;
-
-        private final NamedPattern pattern;
-
-        public ReleaseFileFilter(StoringRepo repo, NamedPattern pattern) {
-            this.repo = repo;
-            this.pattern = pattern;
-        }
-
-        @Override
-        public boolean accepts(@Nonnull ItemInfo itemInfo) {
-            if (itemInfo.isFolder()) {
-                return true;
-            }
-            String path = itemInfo.getRelPath();
-            if (!pattern.matcher(path).matches()) {
-                return false;
-            }
-
-            //Make sure this file's module info is valid and is actually a release version
-            ModuleInfo itemModuleInfo = repo.getItemModuleInfo(path);
-            return itemModuleInfo.isValid() && !itemModuleInfo.isIntegration();
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/snapshot/RemoteLatestMavenVersionResolver.java b/backend/core/src/main/java/org/artifactory/repo/snapshot/RemoteLatestMavenVersionResolver.java
deleted file mode 100644
index 1ae73dd..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/snapshot/RemoteLatestMavenVersionResolver.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.snapshot;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.apache.maven.artifact.repository.metadata.Metadata;
-import org.apache.maven.artifact.repository.metadata.Snapshot;
-import org.apache.maven.artifact.repository.metadata.Versioning;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.request.DownloadService;
-import org.artifactory.api.request.InternalArtifactoryRequest;
-import org.artifactory.maven.MavenModelUtils;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RemoteRepo;
-import org.artifactory.repo.Repo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.request.InternalCapturingResponse;
-import org.artifactory.request.InternalRequestContext;
-import org.artifactory.util.PathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Resolves the latest unique snapshot version given a non-unique Maven snapshot artifact request for remote
- * repositories.
- *
- * @author Shay Yaakov
- */
-public class RemoteLatestMavenVersionResolver extends LatestVersionResolver {
-    private static final Logger log = LoggerFactory.getLogger(RemoteLatestMavenVersionResolver.class);
-
-    /**
-     * Downloads maven-metadata.xml from the remote and analyzes the latest version from it. If it does not exist, we
-     * return the original request context.
-     */
-    @Override
-    protected InternalRequestContext getRequestContext(InternalRequestContext requestContext, Repo repo,
-            ModuleInfo originalModuleInfo) {
-        if (!(repo instanceof RemoteRepo)) {
-            return requestContext;
-        }
-        RemoteRepo remoteRepo = (RemoteRepo) repo;
-        if (!remoteRepo.getDescriptor().isMavenRepoLayout()) {
-            // Latest from remote is supported only for maven2 layout
-            return requestContext;
-        }
-        if (remoteRepo.isOffline()) {
-            // will fallback to local cache search
-            return requestContext;
-        }
-
-        String path = requestContext.getResourcePath();
-        if (MavenNaming.isMavenMetadata(path)) {
-            // Recursive request for maven metadata, simply return the original request context
-            return requestContext;
-        }
-        boolean searchForReleaseVersion = StringUtils.contains(path, "[RELEASE]");
-        RepoPath repoPath;
-        if (searchForReleaseVersion) {
-            repoPath = InternalRepoPathFactory.create(repo.getKey(), path).getParent();
-        } else {
-            repoPath = InternalRepoPathFactory.create(repo.getKey(), path);
-        }
-        Metadata metadata = tryDownloadingMavenMetadata(repoPath);
-        if (metadata != null) {
-            try {
-                Versioning versioning = metadata.getVersioning();
-                if (versioning != null) {
-                    if (searchForReleaseVersion) {
-                        String release = versioning.getRelease();
-                        if (StringUtils.isNotBlank(release)) {
-                            String releaseRepoPath = path.replace("[RELEASE]", release);
-                            requestContext = translateRepoRequestContext(requestContext, repo, releaseRepoPath);
-                        }
-                    } else {
-                        Snapshot snapshot = versioning.getSnapshot();
-                        if (snapshot != null) {
-                            String timestamp = snapshot.getTimestamp();
-                            int buildNumber = snapshot.getBuildNumber();
-                            if (StringUtils.isNotBlank(timestamp) && buildNumber > 0) {
-                                String originalFileName = PathUtils.getFileName(path);
-                                String fileName = originalFileName.replaceFirst("SNAPSHOT",
-                                        timestamp + "-" + buildNumber);
-                                RepoPath parentRepoPath = repoPath.getParent();
-                                String uniqueRepoPath = PathUtils.addTrailingSlash(parentRepoPath.getPath()) + fileName;
-                                requestContext = translateRepoRequestContext(requestContext, repo, uniqueRepoPath);
-                            }
-                        }
-                    }
-                }
-            } catch (Exception e) {
-                log.warn("Failed parsing maven metadata from remote repo '{}' for repoPath '{}'",
-                        repoPath.getRepoKey(), repoPath.getPath());
-            }
-        }
-
-        return requestContext;
-    }
-
-    private Metadata tryDownloadingMavenMetadata(RepoPath repoPath) {
-        if (repoPath == null) {
-            log.debug("Could not download remote maven metadata for null repo path");
-            return null;
-        }
-
-        String parentFolder = PathUtils.getParent(repoPath.getPath());
-        RepoPath parentRepoPath = RepoPathFactory.create(repoPath.getRepoKey(), parentFolder);
-        RepoPath metadataRepoPath = new RepoPathImpl(parentRepoPath, MavenNaming.MAVEN_METADATA_NAME);
-        InternalArtifactoryRequest req = new InternalArtifactoryRequest(metadataRepoPath);
-        InternalCapturingResponse res = new InternalCapturingResponse();
-        try {
-            DownloadService downloadService = ContextHelper.get().beanForType(DownloadService.class);
-            downloadService.process(req, res);
-            if (res.getStatus() == HttpStatus.SC_OK) {
-                String metadataStr = res.getResultAsString();
-                return MavenModelUtils.toMavenMetadata(metadataStr);
-            }
-        } catch (Exception e) {
-            log.info("Could not download remote maven metadata for repo '{}' and path '{}'",
-                    new Object[]{metadataRepoPath.getRepoKey(), metadataRepoPath.getPath()}, e);
-        }
-        return null;
-    }
-
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/snapshot/SnapshotVersionAdapterBase.java b/backend/core/src/main/java/org/artifactory/repo/snapshot/SnapshotVersionAdapterBase.java
deleted file mode 100644
index ea0f718..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/snapshot/SnapshotVersionAdapterBase.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.snapshot;
-
-import org.artifactory.descriptor.repo.SnapshotVersionBehavior;
-import org.artifactory.mime.NamingUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Base abstract class for {@link MavenSnapshotVersionAdapter}s.
- *
- * @author Yossi Shaul
- */
-public abstract class SnapshotVersionAdapterBase implements MavenSnapshotVersionAdapter {
-    private static final Logger log = LoggerFactory.getLogger(SnapshotVersionAdapterBase.class);
-
-    public static MavenSnapshotVersionAdapter getByType(SnapshotVersionBehavior type) {
-        switch (type) {
-            case DEPLOYER:
-                return new DeployerSnapshotVersionAdapter();
-            case UNIQUE:
-                return new UniqueSnapshotVersionAdapter();
-            case NONUNIQUE:
-                return new NonUniqueSnapshotVersionAdapter();
-            default:
-                throw new IllegalArgumentException("No snapshot version adapter found for type " + type);
-        }
-    }
-
-    @Override
-    public final String adaptSnapshotPath(MavenSnapshotVersionAdapterContext context) {
-        String path = context.getRepoPath().getPath();
-        if (!isApplicableOn(context)) {
-            return path;
-        }
-
-        return adapt(context);
-    }
-
-    protected String adapt(MavenSnapshotVersionAdapterContext context) {
-        return context.getRepoPath().getPath();
-    }
-
-    /**
-     * Shared method for inheriting adapters to determine if a certain path is eligible for path adapters.
-     *
-     * @param context
-     */
-    protected boolean isApplicableOn(MavenSnapshotVersionAdapterContext context) {
-        // don't modify metadata paths
-        String path = context.getRepoPath().getPath();
-        boolean metadataArtifact = NamingUtils.isMetadata(path) || NamingUtils.isMetadataChecksum(path);
-
-        if (metadataArtifact) {
-            log.debug("Not applying snapshot policy on metadata path: {}", path);
-            return false;
-        }
-
-        // don't modify files that are not snapshots according to the file name (RTFACT-3049)
-        if (!context.getModuleInfo().isIntegration()) {
-            log.debug("Not applying snapshot policy on non snapshot file: {}", path);
-            return false;
-        }
-
-        if (!context.getModuleInfo().isValid()) {
-            log.debug("{} is not a valid maven GAV path. Not applying snapshot policy.", path);
-            return false;
-        }
-
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/repo/snapshot/SnapshotVersionsRetriever.java b/backend/core/src/main/java/org/artifactory/repo/snapshot/SnapshotVersionsRetriever.java
deleted file mode 100644
index 6379f91..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/snapshot/SnapshotVersionsRetriever.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.snapshot;
-
-import com.google.common.collect.Maps;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.module.regex.NamedPattern;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.StoringRepo;
-import org.artifactory.storage.fs.tree.ItemNode;
-import org.artifactory.storage.fs.tree.ItemNodeFilter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Collects integration versions items under a given root node.
- *
- * @author Shay Yaakov
- */
-public class SnapshotVersionsRetriever extends VersionsRetriever {
-    private static final Logger log = LoggerFactory.getLogger(SnapshotVersionsRetriever.class);
-
-    private Map<String, Calendar> integrationCreationMap = Maps.newHashMap();
-
-    public SnapshotVersionsRetriever(boolean reverseOrderResults) {
-        super(reverseOrderResults);
-    }
-
-    @Override
-    protected void internalCollectVersionsItems(StoringRepo repo, ItemNode node) {
-        if (node.isFolder()) {
-            List<ItemNode> children = node.getChildren();
-            for (ItemNode child : children) {
-                internalCollectVersionsItems(repo, child);
-            }
-        } else {
-            RepoPath itemRepoPath = node.getRepoPath();
-            ModuleInfo itemModuleInfo = repo.getItemModuleInfo(itemRepoPath.getPath());
-
-            Calendar itemCreated = Calendar.getInstance();
-            ItemInfo itemInfo = node.getItemInfo();
-            itemCreated.setTimeInMillis(itemInfo.getCreated());
-
-            String uniqueRevision = itemModuleInfo.getFileIntegrationRevision();
-
-            //If we already keep a creation date for this child's unique revision
-            if (integrationCreationMap.containsKey(uniqueRevision)) {
-
-                //If the current child's creation date precedes the existing one
-                Calendar existingIntegrationCreation = integrationCreationMap.get(uniqueRevision);
-                if (itemCreated.before(existingIntegrationCreation)) {
-
-                    //Update the reference of all the children with the same unique integration
-                    integrationCreationMap.put(uniqueRevision, itemCreated);
-                    Collection<ItemInfo> itemsToRelocate = versionsItems.removeAll(existingIntegrationCreation);
-                    versionsItems.putAll(itemCreated, itemsToRelocate);
-                    versionsItems.put(itemCreated, itemInfo);
-                } else {
-
-                    //Child's creation date isn't newer, just add it
-                    versionsItems.put(existingIntegrationCreation, itemInfo);
-                }
-            } else {
-                //No reference exists yet, create one
-                integrationCreationMap.put(uniqueRevision, itemCreated);
-                versionsItems.put(itemCreated, itemInfo);
-            }
-        }
-    }
-
-    @Override
-    public ItemNodeFilter getFileFilter(StoringRepo repo, NamedPattern pattern) {
-        return new IntegrationFileFilter(repo, pattern);
-    }
-
-    private static class IntegrationFileFilter implements ItemNodeFilter {
-        private final StoringRepo repo;
-
-        private final NamedPattern pattern;
-
-        public IntegrationFileFilter(StoringRepo repo, NamedPattern pattern) {
-            this.repo = repo;
-            this.pattern = pattern;
-        }
-
-        @Override
-        public boolean accepts(ItemInfo itemInfo) {
-            if (itemInfo.isFolder()) {
-                return true;
-            }
-            String path = itemInfo.getRelPath();
-            if (!pattern.matcher(path).matches()) {
-                return false;
-            }
-            ModuleInfo itemModuleInfo = repo.getItemModuleInfo(path);
-            RepoLayout repoLayout = repo.getDescriptor().getRepoLayout();
-
-            boolean integrationCondition = itemModuleInfo.isIntegration() &&
-                    //Checks to make sure it is not a non-unique integration mixed with unique integrations
-                    (StringUtils.equals(repoLayout.getFolderIntegrationRevisionRegExp(),
-                            repoLayout.getFileIntegrationRevisionRegExp()) ||
-                            !StringUtils.equals(itemModuleInfo.getFolderIntegrationRevision(),
-                                    itemModuleInfo.getFileIntegrationRevision()));
-
-            //Make sure this file's module info is valid and is actually an integration version
-            return itemModuleInfo.isValid() && integrationCondition;
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/snapshot/UniqueSnapshotVersionAdapter.java b/backend/core/src/main/java/org/artifactory/repo/snapshot/UniqueSnapshotVersionAdapter.java
deleted file mode 100644
index 7fc874d..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/snapshot/UniqueSnapshotVersionAdapter.java
+++ /dev/null
@@ -1,318 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.snapshot;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.maven.artifact.repository.metadata.Metadata;
-import org.apache.maven.artifact.repository.metadata.Snapshot;
-import org.apache.maven.artifact.repository.metadata.Versioning;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.module.ModuleInfoBuilder;
-import org.artifactory.api.module.ModuleInfoUtils;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.maven.MavenModelUtils;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.util.PathUtils;
-import org.artifactory.util.RepoLayoutUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- * This snapshot version adapter changes non-unique snapshot versions to unique.
- *
- * @author Yossi Shaul
- */
-public class UniqueSnapshotVersionAdapter extends SnapshotVersionAdapterBase {
-    private static final Logger log = LoggerFactory.getLogger(UniqueSnapshotVersionAdapter.class);
-
-    @Override
-    protected String adapt(MavenSnapshotVersionAdapterContext context) {
-        String path = context.getRepoPath().getPath();
-
-        String fileName = PathUtils.getFileName(path);
-        if (MavenNaming.isUniqueSnapshotFileName(fileName)) {
-            log.debug("File '{}' has already a unique snapshot version. Returning the original path.", fileName);
-            return path;
-        }
-
-        String pathBaseVersion = context.getModuleInfo().getBaseRevision();
-        if (!fileName.contains(pathBaseVersion + "-" + MavenNaming.SNAPSHOT)) {
-            log.debug("File '{}' doesn't contain the non-unique snapshot version {}. " +
-                    "Returning the original path.", fileName, pathBaseVersion);
-            return path;
-        }
-
-        // Replace 'SNAPSHOT' with version timestamp for unique snapshot repo
-        return adjustNonUniqueSnapshotToUnique(context);
-    }
-
-    private String adjustNonUniqueSnapshotToUnique(MavenSnapshotVersionAdapterContext context) {
-        long timestamp = context.getTimestamp();
-        if (timestamp > 0) {
-            return adjustUsingClientTimestamp(context);
-        } else if (MavenNaming.isChecksum(context.getRepoPath().getPath())) {
-            return adjustChecksum(context);
-        } else {
-            return adjustUsingServerData(context);
-        }
-    }
-
-    private String adjustChecksum(MavenSnapshotVersionAdapterContext context) {
-        // find latest unique file matching the checksum coordinates
-        RepositoryService repoService = ContextHelper.get().getRepositoryService();
-        RepoPath repoPath = context.getRepoPath();
-        RepoPath parentRepoPath = repoPath.getParent();
-        RepoDescriptor repoDescriptor = repoService.repoDescriptorByKey(parentRepoPath.getRepoKey());
-        RepoLayout repoLayout = repoDescriptor.getRepoLayout();
-
-        String latestMatching = null;
-
-        String originalChecksumRequestPath = repoPath.getPath();
-        String originalRequestPathWithNoChecksum = PathUtils.stripExtension(originalChecksumRequestPath);
-
-        if (repoService.exists(parentRepoPath)) {
-            List<String> children = repoService.getChildrenNames(parentRepoPath);
-            for (String child : children) {
-                if (MavenNaming.isUniqueSnapshotFileName(child)) {
-
-                    ModuleInfo childModule =
-                            repoService.getItemModuleInfo(InternalRepoPathFactory.create(parentRepoPath, child));
-                    String fileRevisionIntegration = childModule.getFileIntegrationRevision();
-
-                    //Try to construct a new non-unique path as a descriptor
-                    String nonUniquePath = replaceIntegration(
-                            ModuleInfoUtils.constructDescriptorPath(childModule, repoLayout, true),
-                            fileRevisionIntegration);
-
-                    //If the path as a descriptor doesn't match, perhaps it's an artifact path
-                    if (!nonUniquePath.equals(originalRequestPathWithNoChecksum)) {
-                        //Try to construct a new non-unique path as an artifact
-                        nonUniquePath = replaceIntegration(
-                                ModuleInfoUtils.constructArtifactPath(childModule, repoLayout),
-                                fileRevisionIntegration);
-                    }
-
-                    if (nonUniquePath.equals(originalRequestPathWithNoChecksum)) {
-                        if (latestMatching == null ||
-                                MavenNaming.getUniqueSnapshotVersionBuildNumber(latestMatching) <
-                                        MavenNaming.getUniqueSnapshotVersionBuildNumber(child)) {
-                            latestMatching = child;
-                        }
-                    }
-                }
-            }
-        }
-
-        // if latest not found, return invalid path which will fail and return a message to the client
-        String timestamp = latestMatching != null ?
-                MavenNaming.getUniqueSnapshotVersionTimestamp(latestMatching) : System.currentTimeMillis() + "";
-        int buildNumber = latestMatching != null ?
-                MavenNaming.getUniqueSnapshotVersionBuildNumber(latestMatching) : 0;
-
-        // use the timestamp and build number from it. if not found return something that will fail?
-        return buildUniqueSnapshotFileName(buildNumber, timestamp, context.getModuleInfo());
-    }
-
-    private String replaceIntegration(String constructedPath, String artifactRevision) {
-        return constructedPath.replace(artifactRevision, "SNAPSHOT");
-    }
-
-    private String adjustUsingServerData(MavenSnapshotVersionAdapterContext context) {
-        //Get the latest build number from the metadata
-        RepoPath repoPath = context.getRepoPath();
-        String filePath = repoPath.getPath();
-        int metadataBuildNumber = getLastBuildNumber(repoPath);
-        int nextBuildNumber = metadataBuildNumber + 1;
-
-        RepoPath parentPath = repoPath.getParent();
-
-        // determine if the next build number should be the one read from the metadata
-        ModuleInfo moduleInfo = context.getModuleInfo();
-        String classifier = moduleInfo.getClassifier();
-        boolean isPomChecksum = MavenNaming.isChecksum(filePath) && MavenNaming.isPom(
-                PathUtils.stripExtension(filePath));
-        if (metadataBuildNumber > 0 && (StringUtils.isNotBlank(classifier) || isPomChecksum)) {
-            // pom checksums and artifacts with classifier are always deployed after the pom (which triggers the
-            // maven-metadata.xml calculation) so use the metadata build number
-            nextBuildNumber = metadataBuildNumber;
-        }
-        if (metadataBuildNumber > 0 && MavenNaming.isPom(filePath)) {
-            // the metadata might already represent an existing main artifact (in case the
-            // maven-metadata.xml was deployed after the main artifact and before the pom/classifier)
-            // so first check if there's already a file with the next build number
-            if (findSnapshotFileByBuildNumber(parentPath, metadataBuildNumber + 1) == null) {
-                // no files deployed with the next build number so either this is a pom deployment (parent pom)
-                // or this is a pom of a main artifact for which the maven-metadata.xml was deployed before this pom
-                if (findSnapshotPomFile(parentPath, metadataBuildNumber) == null) {
-                    // this is a pom attached to a main artifact deployed after maven-metadata.xml
-                    nextBuildNumber = metadataBuildNumber;
-                }
-            }
-        }
-
-        String timestamp = getSnapshotTimestamp(parentPath, nextBuildNumber);
-        if (timestamp == null) {
-            // probably the first deployed file for this build, use now for the timestamp
-            timestamp = MavenModelUtils.dateToUniqueSnapshotTimestamp(System.currentTimeMillis());
-        }
-        return buildUniqueSnapshotFileName(nextBuildNumber, timestamp, moduleInfo);
-    }
-
-    private String adjustUsingClientTimestamp(MavenSnapshotVersionAdapterContext context) {
-        // artifact was uploaded with a timestamp, we use it for the unique snapshot timestamp and to locate build number
-        long timestamp = context.getTimestamp();
-        String uniqueTimestamp = MavenModelUtils.dateToUniqueSnapshotTimestamp(timestamp);
-        RepoPath repoPath = context.getRepoPath();
-        String existingArtifact = findSnapshotFileByTimestamp(repoPath.getParent(), uniqueTimestamp);
-        int buildNumber;
-        if (existingArtifact != null) {
-            buildNumber = MavenNaming.getUniqueSnapshotVersionBuildNumber(existingArtifact);
-        } else {
-            buildNumber = getLastBuildNumber(repoPath) + 1;
-        }
-
-        return buildUniqueSnapshotFileName(buildNumber, uniqueTimestamp, context.getModuleInfo());
-    }
-
-    private String buildUniqueSnapshotFileName(int nextBuildNumber, String timestamp, ModuleInfo moduleInfo) {
-        // replace the SNAPSHOT string with timestamp-buildNumber
-        ModuleInfo transformedModuleInfo = new ModuleInfoBuilder(moduleInfo).fileIntegrationRevision(
-                timestamp + "-" + nextBuildNumber).build();
-        return ModuleInfoUtils.constructArtifactPath(transformedModuleInfo, RepoLayoutUtils.MAVEN_2_DEFAULT);
-    }
-
-    /**
-     * @return The last build number for snapshot version. 0 if maven-metadata not found for the path.
-     */
-    private int getLastBuildNumber(RepoPath repoPath) {
-        int buildNumber = 0;
-        try {
-            // get the parent path which should contains the maven-metadata
-            RepoPath parentRepoPath = repoPath.getParent();
-            RepositoryService repoService = ContextHelper.get().getRepositoryService();
-            RepoPathImpl mavenMetadataPath = new RepoPathImpl(parentRepoPath, MavenNaming.MAVEN_METADATA_NAME);
-            if (repoService.exists(mavenMetadataPath)) {
-                String mavenMetadataStr = repoService.getStringContent(mavenMetadataPath);
-                Metadata metadata = MavenModelUtils.toMavenMetadata(mavenMetadataStr);
-                Versioning versioning = metadata.getVersioning();
-                if (versioning != null) {
-                    Snapshot snapshot = versioning.getSnapshot();
-                    if (snapshot != null) {
-                        buildNumber = snapshot.getBuildNumber();
-                    }
-                }
-            } else {
-                // ok probably not found. just log
-                log.debug("No maven metadata found for {}.", repoPath);
-            }
-        } catch (Exception e) {
-            log.error("Cannot obtain build number from metadata.", e);
-        }
-        return buildNumber;
-    }
-
-    /**
-     * @param snapshotDirectoryPath Path to a repository snapshot directory (eg, /a/path/1.0-SNAPSHOT)
-     * @param buildNumber           The file with build number to search for
-     * @return The path of the first unique snapshot file with the input build number.
-     */
-    private String findSnapshotFileByBuildNumber(RepoPath snapshotDirectoryPath, int buildNumber) {
-        return findSnapshotFile(snapshotDirectoryPath, buildNumber, null, null);
-    }
-
-    /**
-     * @param snapshotDirectoryPath Path to a repository snapshot directory (eg, /a/path/1.0-SNAPSHOT)
-     * @param timestamp             The file with timestamp to search for
-     * @return The path of the first unique snapshot file with the input timestamp.
-     */
-    private String findSnapshotFileByTimestamp(RepoPath snapshotDirectoryPath, String timestamp) {
-        return findSnapshotFile(snapshotDirectoryPath, 0, timestamp, null);
-    }
-
-    /**
-     * @param snapshotDirectoryPath Path to a repository snapshot directory (eg, /a/path/1.0-SNAPSHOT)
-     * @param buildNumber           The file with build number to search for
-     * @return The path of the unique snapshot pom file with the input build number.
-     */
-    private String findSnapshotPomFile(RepoPath snapshotDirectoryPath, int buildNumber) {
-        return findSnapshotFile(snapshotDirectoryPath, buildNumber, null, "pom");
-    }
-
-    /**
-     * @param snapshotDirectoryPath Path to a repository snapshot directory (eg, /a/path/1.0-SNAPSHOT)
-     * @param buildNumber           The file with build number to search for or 0 if doesn't matter
-     * @param timestamp             The file with timestamp to search for or null if doesn't matter
-     * @param fileExtension         The file type to search for. Use null for any type
-     * @return The path of the first unique snapshot file with the input build number.
-     */
-    private String findSnapshotFile(RepoPath snapshotDirectoryPath, int buildNumber, String timestamp,
-            String fileExtension) {
-        log.debug("Searching for unique snapshot file in {} with build number {} and timestamp {}",
-                snapshotDirectoryPath, buildNumber, timestamp);
-        RepositoryService repoService = ContextHelper.get().getRepositoryService();
-        if (repoService.exists(snapshotDirectoryPath)) {
-            List<String> children = repoService.getChildrenNames(snapshotDirectoryPath);
-            for (String child : children) {
-                if (MavenNaming.isUniqueSnapshotFileName(child)) {
-                    // now match against all the conditions
-                    boolean buildNumberMatches = buildNumber == 0 || buildNumber == MavenNaming
-                            .getUniqueSnapshotVersionBuildNumber(child);
-                    boolean timestampMatches = timestamp == null || timestamp
-                            .equals(MavenNaming.getUniqueSnapshotVersionTimestamp(child));
-                    boolean typeMatches = fileExtension == null || fileExtension.equals(PathUtils.getExtension(child));
-                    if (buildNumberMatches && timestampMatches && typeMatches) {
-                        // passed all the search requirements...
-                        log.debug("Found unique snapshot: {}", child);
-                        return child;
-                    }
-                }
-            }
-        }
-        log.debug("Unique snapshot file not found in {} for build number {}", snapshotDirectoryPath, buildNumber);
-        return null;
-    }
-
-    /**
-     * @param snapshotDirectoryPath Path to a repository snapshot directory (eg, /a/path/1.0-SNAPSHOT)
-     * @param buildNumber           The file with build number to search for
-     * @return The timestamp of the unique snapshot file with the input build number.
-     */
-    private String getSnapshotTimestamp(RepoPath snapshotDirectoryPath, int buildNumber) {
-        String snapshotFile = findSnapshotFileByBuildNumber(snapshotDirectoryPath, buildNumber);
-        if (snapshotFile != null) {
-            int childBuildNumber = MavenNaming.getUniqueSnapshotVersionBuildNumber(snapshotFile);
-            if (childBuildNumber == buildNumber) {
-                String timestamp = MavenNaming.getUniqueSnapshotVersionTimestamp(snapshotFile);
-                log.debug("Extracted timestamp {} from {}", timestamp, snapshotFile);
-                return timestamp;
-            }
-        }
-        log.debug("Snapshot timestamp not found in {} for build number {}", snapshotDirectoryPath, buildNumber);
-        return null;
-    }
-
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/snapshot/VersionsRetriever.java b/backend/core/src/main/java/org/artifactory/repo/snapshot/VersionsRetriever.java
deleted file mode 100644
index 452e05c..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/snapshot/VersionsRetriever.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.snapshot;
-
-import com.google.common.collect.Ordering;
-import com.google.common.collect.TreeMultimap;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.module.ModuleInfoUtils;
-import org.artifactory.api.module.regex.NamedPattern;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.StoringRepo;
-import org.artifactory.storage.fs.tree.ItemNode;
-import org.artifactory.storage.fs.tree.ItemNodeFilter;
-import org.artifactory.storage.fs.tree.ItemTree;
-import org.artifactory.util.RepoLayoutUtils;
-
-import java.util.Calendar;
-
-/**
- * Base class for collecting versions items under a given root node.
- *
- * @author Shay Yaakov
- */
-public abstract class VersionsRetriever {
-
-    protected TreeMultimap<Calendar, ItemInfo> versionsItems;
-
-    public VersionsRetriever(boolean reverseOrderResults) {
-        if (reverseOrderResults) {
-            versionsItems = TreeMultimap.create(Ordering.natural().reverse(), Ordering.natural().reverse());
-        } else {
-            versionsItems = TreeMultimap.create(Ordering.natural(), Ordering.natural());
-        }
-    }
-
-    /**
-     * Collects versions items under the given node for the given repo
-     *
-     * @param repo                 The repo to search in
-     * @param baseRevisionModule   Base module info to search under, we try both artifact and desriptor path if it's distinctive
-     * @param pathHasVersionTokens If we should search with version tokens, this applies for release artifacts as the user
-     *                             may provide release/integration tokens to search for latest version
-     */
-    public TreeMultimap<Calendar, ItemInfo> collectVersionsItems(StoringRepo repo, ModuleInfo baseRevisionModule,
-            boolean pathHasVersionTokens) {
-        RepoLayout repoLayout = repo.getDescriptor().getRepoLayout();
-        String baseArtifactPath = ModuleInfoUtils.constructArtifactPath(baseRevisionModule, repoLayout, false);
-        ItemNode artifactSearchNode = getTreeNode(repo, repoLayout, baseArtifactPath, pathHasVersionTokens);
-        if (artifactSearchNode != null) {
-            internalCollectVersionsItems(repo, artifactSearchNode);
-        }
-
-        if (repoLayout.isDistinctiveDescriptorPathPattern()) {
-            String baseDescriptorPath = ModuleInfoUtils.constructDescriptorPath(baseRevisionModule, repoLayout, false);
-            if (!baseDescriptorPath.equals(baseArtifactPath)) {
-                ItemNode descriptorSearchNode = getTreeNode(repo, repoLayout, baseDescriptorPath, pathHasVersionTokens);
-                if (descriptorSearchNode != null) {
-                    internalCollectVersionsItems(repo, descriptorSearchNode);
-                }
-            }
-        }
-
-        return versionsItems;
-    }
-
-    private ItemNode getTreeNode(StoringRepo repo, RepoLayout repoLayout, String itemPath,
-            boolean pathHasVersionTokens) {
-        RepoPath searchBasePath = getBaseRepoPathFromPartialItemPath(repo.getKey(), itemPath);
-        String regEx = RepoLayoutUtils.generateRegExpFromPattern(repoLayout, itemPath, false, pathHasVersionTokens);
-        NamedPattern pattern = NamedPattern.compile(regEx);
-        ItemNodeFilter fileFilter = getFileFilter(repo, pattern);
-
-        ItemTree itemTree = new ItemTree(searchBasePath, fileFilter);
-        return itemTree.buildTree();
-    }
-
-    private RepoPath getBaseRepoPathFromPartialItemPath(String repoKey, String itemPath) {
-        StringBuilder searchBasePathBuilder = new StringBuilder();
-        String[] pathTokens = itemPath.split("/");
-        for (String pathToken : pathTokens) {
-            if (!pathToken.contains("[") && !pathToken.contains("(") && !pathToken.contains("{")) {
-                searchBasePathBuilder.append(pathToken).append("/");
-            } else {
-                break;
-            }
-        }
-        return InternalRepoPathFactory.create(repoKey, searchBasePathBuilder.toString());
-    }
-
-    protected abstract void internalCollectVersionsItems(StoringRepo repo, ItemNode node);
-
-    protected abstract ItemNodeFilter getFileFilter(StoringRepo repo, NamedPattern pattern);
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/vcs/git/ref/GitRef.java b/backend/core/src/main/java/org/artifactory/repo/vcs/git/ref/GitRef.java
deleted file mode 100644
index f50972d..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/vcs/git/ref/GitRef.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.repo.vcs.git.ref;
-
-/**
- * @author Shay Yaakov
- */
-public class GitRef {
-    public String name;
-    public String commitId;
-    public boolean isBranch;
-
-    public GitRef(String name, String commitId, boolean isBranch) {
-        this.name = name;
-        this.commitId = commitId;
-        this.isBranch = isBranch;
-    }
-
-    public String filename(String gitRepo, String ext) {
-        String branchTag = isBranch ? this.name  + "-" + commitId : this.name;
-        return gitRepo + "-" + branchTag + "." + ext;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/vcs/git/ref/GitRefs.java b/backend/core/src/main/java/org/artifactory/repo/vcs/git/ref/GitRefs.java
deleted file mode 100644
index b336dc0..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/vcs/git/ref/GitRefs.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.artifactory.repo.vcs.git.ref;
-
-import com.google.common.collect.Sets;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-
-import java.io.InputStream;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * Represents a git repository tags and branches.
- * Follows the get command 'curl https://github.com/twbs/bootstrap.git/info/refs?service=git-upload-pack'
- *
- * @author Shay Yaakov
- */
-public class GitRefs {
-
-    public static final String REFS_FILENAME = "gitrefs";
-    public Set<GitRef> tags = Sets.newLinkedHashSet();
-    public Set<GitRef> branches = Sets.newLinkedHashSet();
-
-    public boolean isEmpty() {
-        return tags.isEmpty() && branches.isEmpty();
-    }
-
-    public boolean contains(String tagOrBrnach) {
-        for (GitRef tagRef : tags) {
-            if (StringUtils.equalsIgnoreCase(tagRef.name, tagOrBrnach)) {
-                return true;
-            }
-        }
-        for (GitRef branchRef : branches) {
-            if (StringUtils.equalsIgnoreCase(branchRef.name, tagOrBrnach)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public void addTags(Set<String> tagStrings) {
-        this.tags.addAll(tagStrings.stream()
-                        .map(tagString -> new GitRef(tagString, null, false))
-                        .collect(Collectors.toList()));
-    }
-
-    public void merge(GitRefs other) {
-        if (other == null) {
-            return;
-        }
-
-        tags.addAll(other.tags);
-        branches.addAll(other.branches);
-    }
-
-    public InputStream constructOriginalRefsStream() {
-        final StringBuilder sb = new StringBuilder();
-        for (GitRef tag : tags) {
-            String commit = StringUtils.isNotBlank(tag.commitId) ? tag.commitId : "0000000000000000000000000000000000000000";
-            sb.append("0000").append(commit).append(" refs/tags/").append(tag.name).append("\n");
-        }
-        for (GitRef branch : branches) {
-            String commit = StringUtils.isNotBlank(branch.commitId) ? branch.commitId : "0000000000000000000000000000000000000000";
-            sb.append("0000").append(commit).append(" refs/heads/").append(branch.name).append("\n");
-        }
-
-        return IOUtils.toInputStream(sb.toString());
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/vcs/git/ref/GitRefsParser.java b/backend/core/src/main/java/org/artifactory/repo/vcs/git/ref/GitRefsParser.java
deleted file mode 100644
index bf88cbf..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/vcs/git/ref/GitRefsParser.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.artifactory.repo.vcs.git.ref;
-
-import org.apache.commons.lang.StringUtils;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Parses the response of <a href="https://github.com/jquery/jquery.git/info/refs?service=git-upload-pack">git refs GET command</a>
- * And creates a list of tags and branches.
- *
- * @author Shay Yaakov
- */
-public abstract class GitRefsParser {
-    private static final Pattern TAGS_PATTERN = Pattern.compile("^(?:[a-f0-9]{4})([a-f0-9]+)\\s+refs\\/tags\\/(\\S+)");
-    private static final Pattern HEADS_PATTERN = Pattern.compile("^(?:[a-f0-9]{4})([a-f0-9]+)\\s+refs\\/heads\\/(\\S+)");
-
-    public static GitRefs parse(InputStream stream) throws IOException {
-        GitRefs refs = new GitRefs();
-
-        BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
-        String line;
-        while ((line = reader.readLine()) != null) {
-            Matcher tagsMather = TAGS_PATTERN.matcher(line);
-            if (tagsMather.matches()) {
-                String tagName = tagsMather.group(2);
-                if (!StringUtils.endsWith(tagName, "^{}")) {
-                    refs.tags.add(new GitRef(tagName, tagsMather.group(1), false));
-                }
-            } else {
-                Matcher headsMather = HEADS_PATTERN.matcher(line);
-                if (headsMather.matches()) {
-                    refs.branches.add(new GitRef(headsMather.group(2), headsMather.group(1), true));
-                }
-            }
-        }
-
-        return refs;
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/repo/virtual/VirtualRepo.java b/backend/core/src/main/java/org/artifactory/repo/virtual/VirtualRepo.java
deleted file mode 100644
index 48e1743..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/virtual/VirtualRepo.java
+++ /dev/null
@@ -1,426 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.virtual;
-
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.VirtualRepoItem;
-import org.artifactory.api.repo.exception.FileExpectedException;
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.descriptor.repo.PomCleanupPolicy;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.io.checksum.policy.ChecksumPolicy;
-import org.artifactory.io.checksum.policy.ChecksumPolicyIgnoreAndGenerate;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.repo.*;
-import org.artifactory.repo.db.DbStoringRepoMixin;
-import org.artifactory.repo.local.PathDeletionContext;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.repo.virtual.interceptor.VirtualRepoInterceptor;
-import org.artifactory.request.InternalRequestContext;
-import org.artifactory.request.RepoRequests;
-import org.artifactory.resource.ResourceStreamHandle;
-import org.artifactory.sapi.fs.*;
-import org.artifactory.sapi.interceptor.DeleteContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.io.IOException;
-import java.util.*;
-
-public class VirtualRepo extends RepoBase<VirtualRepoDescriptor> implements StoringRepo<VirtualRepoDescriptor> {
-    private static final Logger log = LoggerFactory.getLogger(VirtualRepo.class);
-
-    private Map<String, LocalRepo> localRepositoriesMap = Maps.newLinkedHashMap();
-    private Map<String, RemoteRepo> remoteRepositoriesMap = Maps.newLinkedHashMap();
-    private Map<String, LocalCacheRepo> localCacheRepositoriesMap = Maps.newLinkedHashMap();
-    private Map<String, VirtualRepo> virtualRepositoriesMap = Maps.newLinkedHashMap();
-
-    DbStoringRepoMixin<VirtualRepoDescriptor> dbStorageMixin;
-
-    //Use a final policy that always generates checksums
-    private final ChecksumPolicy defaultChecksumPolicy = new ChecksumPolicyIgnoreAndGenerate();
-    protected VirtualRepoDownloadStrategy downloadStrategy = new VirtualRepoDownloadStrategy(this);
-
-    // List of interceptors for various download resolution points
-    private Collection<VirtualRepoInterceptor> interceptors;
-
-    public VirtualRepo(VirtualRepoDescriptor descriptor, InternalRepositoryService repositoryService) {
-        super(descriptor, repositoryService);
-        dbStorageMixin = new DbStoringRepoMixin<>(descriptor, null);
-    }
-
-    /**
-     * In order to create virtual repo we need to provide the list of the repositories in Artifactory.
-     * The problem with that is that the virtual repositories are not ready at this stage therefore we need to pass
-     * the list of new virtual (non initialized list)repositories by this method
-     */
-    public void updateRepos(Map<String, VirtualRepo> newVirtualMap){
-        //Split the repositories into local, remote and virtual
-        List<RepoDescriptor> repositories = getDescriptor().getRepositories();
-        for (RepoDescriptor repoDescriptor : repositories) {
-            String key = repoDescriptor.getKey();
-            if (repoDescriptor.isReal()) {
-                Repo repo = getRepositoryService().repositoryByKey(key);
-                if (repo != null) {
-                    if (repo instanceof LocalRepo) {
-                        localRepositoriesMap.put(key, (LocalRepo) repo);
-                    } else if (repo instanceof RemoteRepo) {
-                        RemoteRepo remoteRepo = (RemoteRepo) repo;
-                        remoteRepositoriesMap.put(key, remoteRepo);
-                        if (remoteRepo.isStoreArtifactsLocally()) {
-                            LocalCacheRepo localCacheRepo = remoteRepo.getLocalCacheRepo();
-                            localCacheRepositoriesMap.put(localCacheRepo.getKey(), localCacheRepo);
-                        }
-                    }
-                }
-            } else {
-                VirtualRepo repo = newVirtualMap.get(key);
-                if(repo!=null) {
-                    // it is a virtual repository
-                    virtualRepositoriesMap.put(key,repo);
-                }
-            }
-        }
-    }
-
-    /**
-     * Must be called after all repositories were built because we save references to other repositories.
-     */
-    @Override
-    public void init() {
-        interceptors = ContextHelper.get().beansForType(VirtualRepoInterceptor.class).values();
-        initStorage();
-    }
-
-    @Override
-    public boolean isSuppressPomConsistencyChecks() {
-        return true;
-    }
-
-    @Override
-    public boolean isWriteLocked(RepoPath repoPath) {
-        return dbStorageMixin.isWriteLocked(repoPath);
-    }
-
-    public void initStorage() {
-        dbStorageMixin.init();
-    }
-
-    public List<VirtualRepo> getVirtualRepositories() {
-        return new ArrayList<>(virtualRepositoriesMap.values());
-    }
-
-    public List<RemoteRepo> getRemoteRepositories() {
-        return new ArrayList<>(remoteRepositoriesMap.values());
-    }
-
-    public List<LocalCacheRepo> getLocalCaches() {
-        return new ArrayList<>(localCacheRepositoriesMap.values());
-    }
-
-    public List<LocalRepo> getLocalRepositories() {
-        return new ArrayList<>(localRepositoriesMap.values());
-    }
-
-    public boolean isArtifactoryRequestsCanRetrieveRemoteArtifacts() {
-        return getDescriptor().isArtifactoryRequestsCanRetrieveRemoteArtifacts();
-    }
-
-    public VirtualRepoDownloadStrategy getDownloadStrategy() {
-        return downloadStrategy;
-    }
-
-    @Nullable
-    public VirtualRepoItem getVirtualRepoItem(RepoPath repoPath) {
-        Set<LocalRepo> localAndCachedRepos = getResolvedLocalAndCachedRepos();
-        //Add paths from all children virtual repositories
-        VirtualRepoItem item = null;
-        for (LocalRepo repo : localAndCachedRepos) {
-            RepoPathImpl localRepoPath = new RepoPathImpl(repo.getKey(), repoPath.getPath());
-            if (getRepositoryService().exists(localRepoPath)) {
-                ItemInfo itemInfo = getRepositoryService().getItemInfo(localRepoPath);
-                if (item == null) {
-                    // use the item info of the first found item
-                    item = new VirtualRepoItem(itemInfo);
-                }
-                item.addRepoKey(repo.getKey());
-            }
-        }
-        return item;
-    }
-
-    public Set<String> getChildrenNamesDeeply(RepoPath folderPath) {
-        String path = folderPath.getPath();
-        Set<LocalRepo> localAndCachedRepos = getResolvedLocalAndCachedRepos();
-        Set<String> children = Sets.newHashSet();
-        for (LocalRepo repo : localAndCachedRepos) {
-            if (!repo.itemExists(path)) {
-                continue;
-            }
-            ItemInfo itemInfo = getRepositoryService().getItemInfo(new RepoPathImpl(repo.getKey(), path));
-            if (!itemInfo.isFolder()) {
-                log.warn("Expected folder but got file: {}", InternalRepoPathFactory.create(repo.getKey(), path));
-                continue;
-            }
-            List<ItemInfo> items = getRepositoryService().getChildren(itemInfo.getRepoPath());
-            for (ItemInfo item : items) {
-                if (!MavenNaming.NEXUS_INDEX_DIR.equals(item.getName()) ||
-                        MavenNaming.isIndex(item.getRelPath())) {  // don't include the index dir in the listing
-                    children.add(item.getName());
-                }
-            }
-        }
-        return children;
-    }
-
-    public List<VirtualRepo> getResolvedVirtualRepos() {
-        //Add items from contained virtual repositories
-        List<VirtualRepo> virtualRepos = new ArrayList<>();
-        //Assemble the virtual repo deep search lists
-        resolveVirtualRepos(virtualRepos);
-        return virtualRepos;
-    }
-
-    private void resolveVirtualRepos(List<VirtualRepo> repos) {
-        if (repos.contains(this)) {
-            return;
-        }
-        repos.add(this);
-        List<VirtualRepo> childrenVirtualRepos = getVirtualRepositories();
-        for (VirtualRepo childVirtualRepo : childrenVirtualRepos) {
-            if (!repos.contains(childVirtualRepo)) {
-                childVirtualRepo.resolveVirtualRepos(repos);
-            }
-        }
-    }
-
-    public Set<RemoteRepo> getResolvedRemoteRepos() {
-        Set<RemoteRepo> resolvedRemoteRepos = Sets.newLinkedHashSet();
-        for (VirtualRepo vrepo : getResolvedVirtualRepos()) {
-            for (RemoteRepo rrepo : vrepo.getRemoteRepositories()) {
-                resolvedRemoteRepos.add(rrepo);
-            }
-        }
-        return resolvedRemoteRepos;
-    }
-
-    /**
-     * @return Recursively resolved list of all the local non-cache repos of this virtual repo and nested virtual
-     * repos.
-     */
-    public Set<LocalRepo> getResolvedLocalRepos() {
-        Set<LocalRepo> resolvedLocalRepos = Sets.newLinkedHashSet();
-        for (VirtualRepo repo : getResolvedVirtualRepos()) {
-            for (LocalRepo localRepo : repo.getLocalRepositories()) {
-                resolvedLocalRepos.add(localRepo);
-            }
-        }
-        return resolvedLocalRepos;
-    }
-
-    /**
-     * @return Recursively resolved list of all the cache repos of this virtual repo and nested virtual repos.
-     */
-    public Set<LocalCacheRepo> getResolvedLocalCachedRepos() {
-        Set<LocalCacheRepo> resolvedLocalRepos = Sets.newLinkedHashSet();
-        for (VirtualRepo repo : getResolvedVirtualRepos()) {
-            for (LocalCacheRepo localRepo : repo.getLocalCaches()) {
-                resolvedLocalRepos.add(localRepo);
-            }
-        }
-        return resolvedLocalRepos;
-    }
-
-    /**
-     * @return Recursively resolved list of all the local and cache repos of this virtual repo and nested virtual
-     * repos.
-     */
-    public Set<LocalRepo> getResolvedLocalAndCachedRepos() {
-        Set<LocalRepo> localAndCahcedRepos = Sets.newLinkedHashSet();
-        localAndCahcedRepos.addAll(getResolvedLocalRepos());
-        localAndCahcedRepos.addAll(getResolvedLocalCachedRepos());
-        return localAndCahcedRepos;
-    }
-
-    /**
-     * Inidicates if the given path exists
-     *
-     * @param relPath Relative path to item
-     * @return True if repo path exists, false if not
-     */
-    public boolean virtualItemExists(String relPath) {
-        //Check if item exists in each repo
-        List<LocalRepo> repoList = getLocalAndCachedRepositories();
-        for (LocalRepo localRepo : repoList) {
-            if (localRepo.itemExists(relPath)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    private List<LocalRepo> getLocalAndCachedRepositories() {
-        List<LocalRepo> localRepos = getLocalRepositories();
-        List<LocalCacheRepo> localCaches = getLocalCaches();
-        List<LocalRepo> repos = new ArrayList<>(localRepos);
-        repos.addAll(localCaches);
-        return repos;
-    }
-
-    @Override
-    public boolean isLocal() {
-        return false;
-    }
-
-    /**
-     * This method is called when a resource was found in the searchable repositories, before returning it to the
-     * client. This method will call a list of interceptors that might alter the returned resource and cache it
-     * locally.
-     *
-     * @param context       The request context
-     * @param foundResource The resource that was found in the searchable repositories.
-     * @return Original or transformed resource
-     */
-    protected RepoResource interceptBeforeReturn(InternalRequestContext context, RepoResource foundResource) {
-        for (VirtualRepoInterceptor interceptor : interceptors) {
-            RepoRequests.logToContext("Intercepting found resource with '%s'", interceptor.getClass().getSimpleName());
-            foundResource = interceptor.onBeforeReturn(this, context, foundResource);
-        }
-        return foundResource;
-    }
-
-    public RepoResource interceptGetInfo(InternalRequestContext context, RepoPath repoPath,
-            List<RealRepo> repositories) {
-        for (VirtualRepoInterceptor interceptor : interceptors) {
-            RepoRequests.logToContext("Intercepting info request with '%s'", interceptor.getClass().getSimpleName());
-            RepoResource repoResource = interceptor.interceptGetInfo(this, context, repoPath, repositories);
-            if (repoResource != null) {
-                RepoRequests.logToContext("Info request was intercepted by '%s'",
-                        interceptor.getClass().getSimpleName());
-                return repoResource;
-            }
-        }
-        return null;
-    }
-
-    public PomCleanupPolicy getPomRepositoryReferencesCleanupPolicy() {
-        return getDescriptor().getPomRepositoryReferencesCleanupPolicy();
-    }
-
-    /**
-     * Returns the repo resource cached in the virtual repository cache.
-     */
-    public RepoResource getInfoFromVirtualCache(InternalRequestContext context) {
-        return dbStorageMixin.getInfo(context);
-    }
-
-    //STORING REPO MIXIN
-
-    @Override
-    public ChecksumPolicy getChecksumPolicy() {
-        return defaultChecksumPolicy;
-    }
-
-    @Override
-    public void undeploy(DeleteContext ctx) {
-        dbStorageMixin.undeploy(ctx);
-    }
-
-    @Override
-    public RepoResource saveResource(SaveResourceContext context) throws IOException, RepoRejectException {
-        return dbStorageMixin.saveResource(context);
-    }
-
-    @Override
-    public boolean shouldProtectPathDeletion(PathDeletionContext pathDeletionContext) {
-        // permissions only apply for real repositories. other methods (i.e., webdav delete) shouldn't allow virtual
-        // repo deletion from the outside.
-        return false;
-    }
-
-    @Override
-    public boolean itemExists(String relPath) {
-        return dbStorageMixin.itemExists(relPath);
-    }
-
-    @Override
-    public RepoResource getInfo(InternalRequestContext context) throws FileExpectedException {
-        RepoResource res = downloadStrategy.getInfo(context);
-        checkAndMarkExpirableResource(res);
-        return res;
-    }
-
-    @Override
-    public ResourceStreamHandle getResourceStreamHandle(InternalRequestContext requestContext, RepoResource res)
-            throws IOException, RepoRejectException {
-        return dbStorageMixin.getResourceStreamHandle(requestContext, res);
-    }
-
-    @Override
-    public MutableVfsFile getMutableFile(RepoPath repoPath) {
-        return dbStorageMixin.getMutableFile(repoPath);
-    }
-
-    @Override
-    @Nonnull
-    public MutableVfsFile createOrGetFile(RepoPath repoPath) {
-        return dbStorageMixin.createOrGetFile(repoPath);
-    }
-
-    @Override
-    public MutableVfsFolder getMutableFolder(RepoPath repoPath) {
-        return dbStorageMixin.getMutableFolder(repoPath);
-    }
-
-    @Override
-    @Nonnull
-    public MutableVfsFolder createOrGetFolder(RepoPath repoPath) {
-        return dbStorageMixin.createOrGetFolder(repoPath);
-    }
-
-    @Override
-    public VfsItem getImmutableFsItem(RepoPath repoPath) {
-        return dbStorageMixin.getImmutableFile(repoPath);
-    }
-
-    @Override
-    public MutableVfsItem getMutableFsItem(RepoPath repoPath) {
-        throw new UnsupportedOperationException("NOT IMPLEMENTED");
-    }
-
-    @Override
-    public VfsFile getImmutableFile(RepoPath repoPath) {
-        return dbStorageMixin.getImmutableFile(repoPath);
-    }
-
-    @Override
-    public VfsFolder getImmutableFolder(RepoPath repoPath) {
-        return dbStorageMixin.getImmutableFolder(repoPath);
-    }
-
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/virtual/VirtualRepoDownloadStrategy.java b/backend/core/src/main/java/org/artifactory/repo/virtual/VirtualRepoDownloadStrategy.java
deleted file mode 100644
index 145c836..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/virtual/VirtualRepoDownloadStrategy.java
+++ /dev/null
@@ -1,485 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.virtual;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.io.IOUtils;
-import org.apache.http.HttpStatus;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.LayoutsCoreAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.repo.exception.FileExpectedException;
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.api.request.TranslatedArtifactoryRequest;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.descriptor.repo.VirtualRepoResolver;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.mime.DebianNaming;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.*;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.request.*;
-import org.artifactory.resource.*;
-import org.artifactory.util.PathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.List;
-
-/**
- * Default download strategy of a virtual repository.
- *
- * @author Yossi Shaul
- */
-public class VirtualRepoDownloadStrategy {
-    private static final Logger log = LoggerFactory.getLogger(VirtualRepoDownloadStrategy.class);
-
-    private InternalRepositoryService repositoryService;
-
-    private CentralConfigService centralConfig;
-
-    private final VirtualRepo virtualRepo;
-    private LayoutsCoreAddon layoutsCoreAddon;
-
-    public VirtualRepoDownloadStrategy(VirtualRepo virtualRepo) {
-        this.virtualRepo = virtualRepo;
-        ArtifactoryContext artifactoryContext = ContextHelper.get();
-        centralConfig = artifactoryContext.getCentralConfig();
-        repositoryService = artifactoryContext.beanForType(InternalRepositoryService.class);
-        AddonsManager addonsManager = artifactoryContext.beanForType(AddonsManager.class);
-        layoutsCoreAddon = addonsManager.addonByType(LayoutsCoreAddon.class);
-    }
-
-    public RepoResource getInfo(InternalRequestContext context) {
-        RepoRequests.logToContext("Consulting the virtual repo download strategy");
-        // first look in local storage
-        RepoResource cachedResource = getInfoFromLocalStorage(context);
-        String path = context.getResourcePath();
-        if (MavenNaming.isIndex(path)) {
-            // for index files just return the result from the cache (we don't want to process it or to return index
-            // from other repositories)
-            RepoRequests.logToContext("Requested resource is a Maven index - returning the cached resource");
-            return cachedResource;
-        }
-        String fileName = PathUtils.getFileName(path);
-        if (cachedResource.isFound() && DebianNaming.isSupportedIndex(fileName)) {
-            // for index files just return the result from the cache (we don't want to process it or to return index
-            // from other repositories)
-            RepoRequests.logToContext("Requested resource is a Debian index - returning the cached resource");
-            return cachedResource;
-        }
-
-        // release the read lock on the virtual repo local cache to prevent deadlock in any of the interceptors
-        // (in case one of them needs to write back to the virtual repo cache)
-        RepoPath localCacheRepoPath = InternalRepoPathFactory.create(virtualRepo.getKey(), context.getResourcePath());
-
-        // not found in local virtual repository storage, look in configured repositories
-        RepoResource searchableResource = getInfoFromSearchableRepositories(context);
-        if (!cachedResource.isFound() && !searchableResource.isFound()) {
-            // not found
-            return searchableResource;
-        } else if (cachedResource.isFound() && !searchableResource.isFound()) {
-            // delete the local cached artifact and return the not found resource
-            RepoRequests.logToContext("Resource was not found but is still cached - removing from the cache");
-            repositoryService.undeploy(localCacheRepoPath, false);
-            return searchableResource;
-        } else if (cachedResource.isFound() && searchableResource.isFound()) {
-            String sourceRepoKey = searchableResource.getResponseRepoPath().getRepoKey();
-            // if the searchable resource is a remote repo - it is not downloaded yet, so we shouldn't
-            // return the cached artifact
-            if (repositoryService.remoteRepositoryByKey(sourceRepoKey) == null &&
-                    cachedResource.getLastModified() >= searchableResource.getLastModified()) {
-                RepoRequests.logToContext("Resource was found locally and the cached instance is the latest - " +
-                        "updating the stats and returning the cached instance");
-                // locally stored resource is latest, update the stats of the original resource and return our cached file
-                ResourceStreamHandle searchableHandle = null;
-                try {
-                    // strangely enough, to update the stats we must get the resource stream handle which will also
-                    // call update stats (see RTFACT-2958)
-                    LocalRepo repo = repositoryService.localOrCachedRepositoryByKey(sourceRepoKey);
-                    searchableHandle = repositoryService.getResourceStreamHandle(context, repo, searchableResource);
-                } catch (IOException | RepoRejectException ioe) {
-                    RepoRequests.logToContext("Error while updating download stats: %s", ioe.getMessage());
-                    log.error("Could not update download stats", ioe);
-                } finally {
-                    IOUtils.closeQuietly(searchableHandle);
-                }
-                return cachedResource;
-            }
-        }
-
-        // found newer resource in the searchable repositories
-        RepoRequests.logToContext("Returning resource as found in the aggregated repositories");
-        return virtualRepo.interceptBeforeReturn(context, searchableResource);
-    }
-
-    private RepoResource getInfoFromLocalStorage(InternalRequestContext context) {
-        try {
-            RepoRequests.logToContext("Trying to retrieve resource info from the local storage");
-            return virtualRepo.getInfoFromVirtualCache(context);
-        } catch (FileExpectedException e) {
-            RepoRequests.logToContext("Unable to find resource info in the local storage - " +
-                    "already exists as a directory: %s", e.getMessage());
-            // see RTFACT-3721
-            return new UnfoundRepoResource(
-                    InternalRepoPathFactory.create(virtualRepo.getKey(), context.getResourcePath()),
-                    "File expected but the cache already points to directory");
-        }
-    }
-
-    private RepoResource getInfoFromSearchableRepositories(InternalRequestContext context) {
-        RepoRequests.logToContext("Searching for info in aggregated repositories");
-        String path = context.getResourcePath();
-        RepoPath repoPath = InternalRepoPathFactory.create(virtualRepo.getKey(), path);
-        RepoResource result;
-        try {
-            List<RealRepo> repositories = assembleSearchRepositoriesList(repoPath, context);
-            if (repositories.isEmpty()) {
-                RepoRequests.logToContext("Unable to find aggregated repositories to search within - returning " +
-                        "unfound resource");
-                return new UnfoundRepoResource(repoPath, "No repository found to serve the request for " + repoPath);
-            }
-
-            ModuleInfo artifactModuleInfo = virtualRepo.getItemModuleInfo(path);
-
-            result = virtualRepo.interceptGetInfo(context, repoPath, repositories);
-            if (result != null) {
-                RepoRequests.logToContext("Received resource from an interceptor - returning");
-                return result;
-            }
-
-            /**
-             * The repo might not define a layout, so also check specifically for a Maven snapshot if the resulting
-             * module info is invalid
-             */
-            boolean mavenSnapshotPath = MavenNaming.isSnapshot(path);
-            boolean isSnapshotPath = mavenSnapshotPath || path.contains("[INTEGRATION]");
-            if (artifactModuleInfo.isIntegration() || (!artifactModuleInfo.isValid() && isSnapshotPath)) {
-                RepoRequests.logToContext("Processing request as a snapshot resource (Module info validity = %s, " +
-                                "Module info identified as integration = %s, Path identified as Maven snapshot = %s)",
-                        artifactModuleInfo.isValid(), artifactModuleInfo.isIntegration(), mavenSnapshotPath
-                );
-                result = processSnapshot(context, repoPath, repositories);
-            } else {
-                RepoRequests.logToContext("Processing request as a release resource");
-                result = processStandard(context, repoPath, repositories, artifactModuleInfo.isValid());
-            }
-        } catch (IOException e) {
-            RepoRequests.logToContext("Processing to get resource info: %s", e.getMessage());
-            log.error("Failed to get resource info", e);
-            result = new UnfoundRepoResource(repoPath, "IOException: " + e.getMessage());
-        }
-        return result;
-    }
-
-    /**
-     * @return A list of local and remote repositories to search the resource in, ordered first by type (local non-cache
-     * first) and secondly by order of appearance. We don't simply add all the lists since some of the real
-     * repos are resolved transitively and we might have to remove them in case the path is excluded in the
-     * virtual repo they belong to.
-     */
-    private List<RealRepo> assembleSearchRepositoriesList(RepoPath repoPath, RequestContext context) {
-        RepoRequests.logToContext("Preparing list of aggregated repositories to search in");
-        VirtualResolverRequestFilter filter = new VirtualResolverRequestFilter(virtualRepo, repoPath,
-                repositoryService, layoutsCoreAddon);
-        VirtualRepoResolver resolver = new VirtualRepoResolver(virtualRepo.getDescriptor(), filter);
-
-        //Add all local repositories
-        List<RealRepo> repositories = Lists.newArrayList();
-        RepoRequests.logToContext("Appending collective local repositories");
-        for (LocalRepoDescriptor localRepoDescriptor : resolver.getLocalRepos()) {
-            String key = localRepoDescriptor.getKey();
-            LocalRepo localRepo = repositoryService.localRepositoryByKey(key);
-            if (localRepo != null) {
-                repositories.add(localRepo);
-            }
-        }
-
-        //Add all caches
-        RepoRequests.logToContext("Appending collective local cache repositories");
-        for (RemoteRepoDescriptor remoteRepoDescriptor : resolver.getRemoteRepos()) {
-            LocalRepo localCacheRepo = repositoryService.localOrCachedRepositoryByKey(remoteRepoDescriptor.getKey());
-            if (localCacheRepo != null) {
-                repositories.add(localCacheRepo);
-            }
-        }
-
-        //Add all remote repositories conditionally
-        boolean fromAnotherArtifactory = context.isFromAnotherArtifactory();
-        boolean artifactoryRequestsCanRetrieveRemoteArtifacts =
-                virtualRepo.isArtifactoryRequestsCanRetrieveRemoteArtifacts();
-        if (fromAnotherArtifactory && !artifactoryRequestsCanRetrieveRemoteArtifacts) {
-            //If the request comes from another artifactory don't bother checking any remote repos
-            RepoRequests.logToContext("Collective remote repositories aren't appended - Download request was " +
-                    "received from another Artifactory instance but is forbidden to search in remote repositories.");
-        } else {
-            RepoRequests.logToContext("Appending collective remote repositories");
-            for (RemoteRepoDescriptor remoteRepoDescriptor : resolver.getRemoteRepos()) {
-                RemoteRepo remoteRepo = repositoryService.remoteRepositoryByKey(remoteRepoDescriptor.getKey());
-                if (remoteRepo != null) {
-                    repositories.add(remoteRepo);
-                }
-            }
-        }
-        return repositories;
-    }
-
-    /**
-     * Iterate over a list of repos until a resource is found in one of them, and return that resource. The first
-     * resource that is found is returned. The order of searching is: local repos, cache repos and remote repos (unless
-     * request originated from another Artifactory).
-     *
-     * @param context         Original download request context
-     * @param repoPath        The repository path of the resource to find
-     * @param repositories    List of repositories to look in (doesn't include virtual repos)
-     * @param validModuleInfo Whether the module info is valid, if not we will pass the request to the aggregated
-     *                        repos even if they do not handle releases
-     */
-    private RepoResource processStandard(InternalRequestContext context, RepoPath repoPath, List<RealRepo> repositories,
-            boolean validModuleInfo) throws IOException {
-        // save forbidden unfound response
-        UnfoundRepoResource forbidden = null;
-        //Locate the resource matching the request
-        RepoResource closestMatch = null;
-
-        for (RealRepo repo : repositories) {
-            RepoRequests.logToContext("Searching for the resource within %s", repo.getKey());
-            // Since we are in process standard, repositories that does not process releases should be skipped.
-            // Now, checksums are always considered standard, even if executed against a snapshot repository.
-            // So, we should not skip snapshots repositories for checksums.
-            String path = repoPath.getPath();
-            if (validModuleInfo && !repo.isHandleReleases() && !NamingUtils.isChecksum(path)) {
-                RepoRequests.logToContext("Skipping %s - doesn't handle releases", repo.getKey());
-                continue;
-            }
-
-            if (closestMatch != null && isNotSynchronizeProperties(repo)) {
-                continue;
-            }
-
-            InternalRequestContext translatedContext = translateRepoRequestContext(virtualRepo, repo, context);
-            if (translatedContext instanceof TranslatedArtifactoryRequest) {
-                RepoRequests.logToContext("Request path was translated to %s due to repository layout differences",
-                        translatedContext.getResourcePath());
-            }
-            RepoResource res = repo.getInfo(translatedContext);
-
-            //Retry the original path if the path was translated and failed (RTFACT-4329)
-            if (!res.isFound() && !translatedContext.getResourcePath().equals(context.getResourcePath())) {
-                RepoRequests.logToContext("Unable to find the resource in the translated path - " +
-                        "retrying with the original");
-                res = repo.getInfo(context);
-            }
-
-            if (res.isFound()) {
-                RepoRequests.logToContext("Resource was found in %s", repo.getKey());
-                updateResponseRepoPath(repo, res);
-                if (res.isExactQueryMatch()) {
-                    //return the exact match
-                    RepoRequests.logToContext("Resource is an exact match - returning");
-                    return res;
-                } else {
-                    RepoRequests.logToContext("Resource is not an exact match - keeping as closest match");
-                    closestMatch = res;
-                }
-            } else if (forbidden == null) {
-                forbidden = checkIfForbidden(res);
-                if (forbidden != null) {
-                    RepoRequests.logToContext("Request is forbidden by %s", repo.getKey());
-                }
-            }
-        }
-
-        //If we didn't find an exact match return the first found resource (closest match)
-        if (closestMatch != null) {
-            RepoRequests.logToContext("Unable to find an exact matching resource - returning closest match");
-            return closestMatch;
-        }
-        // not found in any repo
-        if (forbidden != null) {
-            RepoRequests.logToContext("Returning a forbidden-unfound resource");
-            return new UnfoundRepoResource(repoPath, forbidden.getDetail(), forbidden.getStatusCode());
-        } else {
-            RepoRequests.logToContext("Returning an unfound resource");
-            return new UnfoundRepoResource(repoPath, "Could not find resource");
-        }
-    }
-
-    /**
-     * Iterate over the repos and return the latest resource found (content or just head information) on the response.
-     */
-    private RepoResource processSnapshot(InternalRequestContext context, RepoPath repoPath, List<RealRepo> repositories)
-            throws IOException {
-
-        //Find the latest in all repositories
-        RepoResource latestRes = null;
-        // save forbidden unfound response
-        UnfoundRepoResource forbidden = null;
-        //Traverse the local, caches and remote repositories and search for the newest snapshot
-        //Make sure local repos are always searched first
-
-        for (RealRepo repo : repositories) {
-            RepoRequests.logToContext("Searching for the resource within %s", repo.getKey());
-            if (shouldSkipSnapshotRepo(repo)) {
-                RepoRequests.logToContext("Skipping %s", repo.getKey());
-                continue;
-            }
-            InternalRequestContext translatedContext = translateRepoRequestContext(virtualRepo, repo, context);
-            String translatedPath = translatedContext.getResourcePath();
-            if (translatedContext instanceof TranslatedArtifactoryRequest) {
-                RepoRequests.logToContext("Request path was translated to %s due to repository layout differences",
-                        translatedPath);
-            }
-
-            final RepoResource res = repo.getInfo(translatedContext);
-            if (res.isFound()) {
-                RepoRequests.logToContext("Resource last modified time - %s",
-                        centralConfig.format(res.getLastModified()));
-
-                boolean firstFoundResource = latestRes == null;
-                boolean currentResourceIsAnExactMatchAndLatterFoundIsNot = !firstFoundResource &&
-                        !latestRes.isExactQueryMatch() && res.isExactQueryMatch();
-                boolean currentResourceWasModifiedLater = !firstFoundResource &&
-                        (res.getLastModified() > latestRes.getLastModified());
-
-                RepoRequests.logToContext("Current found resource is the first candidate = %s, is an exact match " +
-                                "query while the former candidate isn't = %s, has later modified time than former = %s",
-                        firstFoundResource, currentResourceIsAnExactMatchAndLatterFoundIsNot,
-                        currentResourceWasModifiedLater
-                );
-
-                //If we haven't found one yet
-                if (firstFoundResource ||
-                        //or this one is a better match
-                        currentResourceIsAnExactMatchAndLatterFoundIsNot
-                        //or newer than the one found
-                        || currentResourceWasModifiedLater) {
-                    RepoRequests.logToContext("Selecting current found resource as best candidate");
-                    //take it
-                    updateResponseRepoPath(repo, res);
-                    latestRes = res;
-                }
-            } else if (forbidden == null) {
-                forbidden = checkIfForbidden(res);
-                if (forbidden != null) {
-                    RepoRequests.logToContext("Request is forbidden by %s", repo.getKey());
-                }
-            }
-        }
-
-        String resourcePath = repoPath.getPath();
-        boolean nonFoundRetrievalCacheHit = latestRes != null && !latestRes.isFound();
-        if (latestRes == null || nonFoundRetrievalCacheHit) {
-            if (forbidden != null) {
-                RepoRequests.logToContext("Returning a forbidden-unfound resource");
-                return new UnfoundRepoResource(repoPath, forbidden.getDetail(), forbidden.getStatusCode());
-            } else {
-                RepoRequests.logToContext("Returning an unfound resource");
-                String msg = "Artifact not found: " + resourcePath +
-                        (nonFoundRetrievalCacheHit ? " (cached on " +
-                                centralConfig.format(latestRes.getLastModified()) + ")" : "");
-                return new UnfoundRepoResource(repoPath, msg);
-            }
-        }
-
-        RepoRequests.logToContext("Returning found resource from %s", latestRes.getResponseRepoPath().getId());
-        return latestRes;
-    }
-
-    //Skip repos that don't handle snapshots and cache repos to allow their remotes' logic to discover newer versions
-    //see RTFACT-7095
-    private boolean shouldSkipSnapshotRepo(RealRepo repo) {
-        //Skip if not handling
-        if (!repo.isHandleSnapshots()) {
-            RepoRequests.logToContext("%s doesn't handle snapshot resources", repo.getKey());
-            return true;
-        } else if (repo.isCache()) {
-            return true;
-        } else {
-            return false;
-        }
-    }
-
-    private UnfoundRepoResource checkIfForbidden(RepoResource resource) {
-        if (resource instanceof UnfoundRepoResource) {
-            if (((UnfoundRepoResource) resource).getStatusCode() == HttpStatus.SC_FORBIDDEN) {
-                return (UnfoundRepoResource) resource;
-            }
-        }
-        return null;
-    }
-
-    private void updateResponseRepoPath(Repo foundInRepo, RepoResource resource) {
-        resource.setResponseRepoPath(
-                InternalRepoPathFactory.create(foundInRepo.getKey(), resource.getRepoPath().getPath()));
-    }
-
-    /**
-     * Translates the artifact request context if the layout of the target repository is different from the source
-     *
-     * @param source  Source repository
-     * @param target  Target repository
-     * @param context Request context to translate
-     * @return Translated context if needed, original if not needed or if there is insufficient info
-     */
-    public <S extends Repo, T extends Repo> InternalRequestContext translateRepoRequestContext(S source,
-            T target, InternalRequestContext context) {
-        String originalPath = context.getResourcePath();
-        String translatedPath = translateRepoPath(source, target, originalPath);
-        if (originalPath.equals(translatedPath)) {
-            return context;
-        }
-
-        if (context instanceof NullRequestContext) {
-            return new NullRequestContext(target.getRepoPath(translatedPath));
-        }
-
-        ArtifactoryRequest artifactoryRequest = ((DownloadRequestContext) context).getRequest();
-        RepoPath translatedRepoPath = InternalRepoPathFactory.create(artifactoryRequest.getRepoKey(), translatedPath);
-        TranslatedArtifactoryRequest translatedRequest = new TranslatedArtifactoryRequest(translatedRepoPath,
-                artifactoryRequest);
-        return new DownloadRequestContext(translatedRequest);
-    }
-
-    /**
-     * Translates the artifact path if the layout of the target repository is different from the source
-     *
-     * @param source Source repository
-     * @param target Target repository
-     * @param path   Path to translate
-     * @return Translated path if needed, original if not needed of if there is insufficient info
-     */
-    private <S extends Repo, T extends Repo> String translateRepoPath(S source, T target, String path) {
-        RepoLayout sourceRepoLayout = source.getDescriptor().getRepoLayout();
-        RepoLayout targetRepoLayout = target.getDescriptor().getRepoLayout();
-
-        return layoutsCoreAddon.translateArtifactPath(sourceRepoLayout, targetRepoLayout, path);
-    }
-
-    private boolean isNotSynchronizeProperties(RealRepo repo) {
-        return !repo.isLocal() && !((RemoteRepoDescriptor) repo.getDescriptor()).isSynchronizeProperties();
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/virtual/VirtualResolverRequestFilter.java b/backend/core/src/main/java/org/artifactory/repo/virtual/VirtualResolverRequestFilter.java
deleted file mode 100644
index 70f249f..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/virtual/VirtualResolverRequestFilter.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.virtual;
-
-import org.artifactory.addon.LayoutsCoreAddon;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-import org.artifactory.descriptor.repo.VirtualResolverFilter;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.request.RepoRequests;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Virtual resolver filter which filters virtual repo according to a request path and include/exclude pattern.
- *
- * @author Shay Yaakov
- */
-public class VirtualResolverRequestFilter implements VirtualResolverFilter {
-    private static final Logger log = LoggerFactory.getLogger(VirtualResolverRequestFilter.class);
-
-    private VirtualRepo virtualRepo;
-    private RepoPath repoPath;
-    private InternalRepositoryService repositoryService;
-    private LayoutsCoreAddon layoutsCoreAddon;
-
-    public VirtualResolverRequestFilter(VirtualRepo virtualRepo, RepoPath repoPath,
-            InternalRepositoryService repositoryService, LayoutsCoreAddon layoutsCoreAddon) {
-        this.virtualRepo = virtualRepo;
-        this.repoPath = repoPath;
-        this.repositoryService = repositoryService;
-        this.layoutsCoreAddon = layoutsCoreAddon;
-    }
-
-    @Override
-    public boolean accepts(VirtualRepoDescriptor childDescriptor) {
-        String childVirtualRepoKey = childDescriptor.getKey();
-        VirtualRepo childVirtualRepo = repositoryService.virtualRepositoryByKey(childVirtualRepoKey);
-        if (childVirtualRepo == null) {
-            log.error("Could not find nested virtual repository with key '{}'", childVirtualRepoKey);
-            return false;
-        }
-
-        String path = repoPath.getPath();
-        String translatedPath = translateRepoPath(virtualRepo.getDescriptor(), childDescriptor, path);
-        if (!translatedPath.equals(path)) {
-            RepoRequests.logToContext("Resource was translated to '%s' in order to search within nested virtual '%s'",
-                    translatedPath, childVirtualRepoKey);
-        }
-        RepoPath translatedRepoPath = InternalRepoPathFactory.create(childVirtualRepoKey, translatedPath,
-                repoPath.isFolder());
-        if (!childVirtualRepo.accepts(translatedRepoPath)) {
-            // includes/excludes should not affect system paths
-            RepoRequests.logToContext("Adding no aggregated repositories - requested artifact is rejected by the " +
-                    "include exclude patterns of nested virtual '%s'", childVirtualRepoKey);
-            return false;
-        }
-
-        RepoRequests.logToContext("Appending the nested virtual repository '%s'", childVirtualRepo.getKey());
-        return true;
-    }
-
-    private String translateRepoPath(VirtualRepoDescriptor source, VirtualRepoDescriptor target, String path) {
-        RepoLayout sourceRepoLayout = source.getRepoLayout();
-        RepoLayout targetRepoLayout = target.getRepoLayout();
-
-        return layoutsCoreAddon.translateArtifactPath(sourceRepoLayout, targetRepoLayout, path);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/virtual/interceptor/MavenMetadataInterceptor.java b/backend/core/src/main/java/org/artifactory/repo/virtual/interceptor/MavenMetadataInterceptor.java
deleted file mode 100644
index ababa3b..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/virtual/interceptor/MavenMetadataInterceptor.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.virtual.interceptor;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.http.HttpStatus;
-import org.apache.maven.artifact.repository.metadata.Metadata;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.maven.MavenModelUtils;
-import org.artifactory.md.MutableMetadataInfo;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.repo.RealRepo;
-import org.artifactory.repo.Repo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.repo.virtual.VirtualRepo;
-import org.artifactory.request.InternalRequestContext;
-import org.artifactory.resource.MetadataResource;
-import org.artifactory.resource.ResolvedResource;
-import org.artifactory.resource.ResourceStreamHandle;
-import org.artifactory.resource.UnfoundRepoResource;
-import org.artifactory.storage.StorageException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.List;
-
-/**
- * Merges maven metadata from all the repositories that are part of this virtual repository.
- *
- * @author Yossi Shaul
- */
- at Component
-public class MavenMetadataInterceptor extends VirtualRepoInterceptorBase {
-    private static final Logger log = LoggerFactory.getLogger(MavenMetadataInterceptor.class);
-
-    @Autowired
-    private InternalRepositoryService repoService;
-
-    @Autowired
-    private CentralConfigService centralConfig;
-
-    @Autowired
-    private AuthorizationService authorizationService;
-
-    @Override
-    public RepoResource interceptGetInfo(VirtualRepo virtualRepo, InternalRequestContext context, RepoPath repoPath,
-            List<RealRepo> repositories) {
-
-        if (!MavenNaming.isMavenMetadata(repoPath.getPath())) {
-            return null;
-        }
-
-        return processMavenMetadata(virtualRepo, context, repoPath, repositories);
-    }
-
-    private RepoResource processMavenMetadata(VirtualRepo virtualRepo, InternalRequestContext context,
-            RepoPath repoPath, List<RealRepo> repositories) {
-
-        boolean isSnapshotMavenMetadata = MavenNaming.isSnapshotMavenMetadata(context.getResourcePath());
-        MergeableMavenMetadata mergedMavenMetadata = new MergeableMavenMetadata(context);
-        // save forbidden unfound response
-        UnfoundRepoResource forbidden = null;
-
-        for (RealRepo repo : repositories) {
-            if (repo.isCache()) {
-                //  Skip cache repos - we search in remote repos directly which will handle the cache retrieval
-                // and expiry
-                continue;
-            }
-            if (isSnapshotMavenMetadata && !repo.isHandleSnapshots()) {
-                // request for snapshot maven metadata but repo doesn't support snapshots - just skip it
-                continue;
-            }
-            InternalRequestContext translatedContext = virtualRepo.getDownloadStrategy().translateRepoRequestContext(
-                    virtualRepo, repo, context);
-
-            RepoResource res = repo.getInfo(translatedContext);
-            if (!res.isFound()) {
-                if (forbidden == null) {
-                    forbidden = checkIfForbidden(res);
-                }
-                continue;
-            }
-            try {
-                findAndMergeMavenMetadata(mergedMavenMetadata, repo, translatedContext, res);
-            } catch (RepoRejectException rre) {
-                int status = rre.getErrorCode();
-                if (status == HttpStatus.SC_FORBIDDEN && authorizationService.isAnonymous()) {
-                    // Create forbidden repo resource to allow 401 challenge in case it is required
-                    forbidden = new UnfoundRepoResource(res.getRepoPath(), rre.getMessage(), HttpStatus.SC_FORBIDDEN);
-                } else {
-                    log.info("Metadata retrieval failed on repo '{}': {}", repo, rre.getMessage());
-                }
-            }
-        }   // end repositories iteration
-
-        String path = repoPath.getPath();
-        if (mergedMavenMetadata.getMetadata() == null) {
-            if (forbidden != null) {
-                return new UnfoundRepoResource(repoPath, forbidden.getDetail(), forbidden.getStatusCode());
-            } else {
-                return new UnfoundRepoResource(repoPath, "Maven metadata not found for '" + path + "'.");
-            }
-        } else {
-            log.debug("Maven artifact metadata found for '{}'.", path);
-            try {
-                return createMavenMetadataFoundResource(repoPath, mergedMavenMetadata);
-            } catch (IOException e) {
-                log.error("Failed creating merged maven metadata", e);
-                return new UnfoundRepoResource(repoPath, "IOException: " + e.getMessage());
-            }
-        }
-    }
-
-
-    /**
-     * Check for maven metadata on the given resource and merge it
-     *
-     * @param mergedMavenMetadata Collected maven metadata
-     * @param repo                Repo to check for metadata
-     * @param context             Request context
-     * @param res                 Resource info
-     */
-    private void findAndMergeMavenMetadata(MergeableMavenMetadata mergedMavenMetadata, RealRepo repo,
-            InternalRequestContext context, RepoResource res) throws RepoRejectException {
-        String resourcePath = context.getResourcePath();
-        Metadata metadata = getMavenMetadataContent(context, repo, res);
-        if (metadata != null) {
-            if (log.isDebugEnabled()) {
-                log.debug("{}: found maven metadata res: {}", repo, resourcePath);
-                log.debug("{}: last modified {}", res.getRepoPath(), centralConfig.format(res.getLastModified()));
-            }
-            mergedMavenMetadata.merge(metadata, res);
-        }
-    }
-
-    private Metadata getMavenMetadataContent(InternalRequestContext requestContext, Repo repo, RepoResource res)
-            throws RepoRejectException {
-        ResourceStreamHandle handle = null;
-        try {
-            handle = repoService.getResourceStreamHandle(requestContext, repo, res);
-            //Create metadata
-            InputStream metadataInputStream;
-            //Hold on to the original metadata string since regenerating it could result in
-            //minor differences from the original, which will cause checksum errors
-            metadataInputStream = handle.getInputStream();
-            String metadataContent = IOUtils.toString(metadataInputStream, "utf-8");
-            return MavenModelUtils.toMavenMetadata(metadataContent);
-        } catch (IOException ioe) {
-            log.error("IO exception retrieving maven metadata content from repo '{}': {}.", repo, ioe.getMessage());
-        } catch (StorageException se) {
-            log.error("Metadata retrieval failed on repo '{}': {}", repo, se.getMessage());
-        } finally {
-            IOUtils.closeQuietly(handle);
-        }
-        return null;
-    }
-
-    private RepoResource createMavenMetadataFoundResource(RepoPath mavenMetadataRepoPath,
-            MergeableMavenMetadata mergedMavenMetadata) throws IOException {
-        String metadataContent = MavenModelUtils.mavenMetadataToString(mergedMavenMetadata.getMetadata());
-        MutableMetadataInfo metadataInfo = InfoFactoryHolder.get().createMetadata(mavenMetadataRepoPath);
-        metadataInfo.setLastModified(mergedMavenMetadata.getLastModified());
-        metadataInfo.setSize(metadataContent.length());
-        MetadataResource wrappedResource = new MetadataResource(metadataInfo);
-        ResolvedResource resolvedResource = new ResolvedResource(wrappedResource, metadataContent);
-        return resolvedResource;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/virtual/interceptor/MergeableMavenMetadata.java b/backend/core/src/main/java/org/artifactory/repo/virtual/interceptor/MergeableMavenMetadata.java
deleted file mode 100644
index df25f3b..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/virtual/interceptor/MergeableMavenMetadata.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.virtual.interceptor;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.maven.artifact.repository.metadata.Metadata;
-import org.apache.maven.artifact.repository.metadata.Snapshot;
-import org.apache.maven.artifact.repository.metadata.SnapshotVersion;
-import org.apache.maven.artifact.repository.metadata.Versioning;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.maven.MavenMetadataCalculator;
-import org.artifactory.maven.snapshot.SnapshotComparator;
-import org.artifactory.maven.versioning.MavenVersionComparator;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.request.InternalRequestContext;
-import org.artifactory.util.CollectionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * @author Noam Y. Tenne
- */
-class MergeableMavenMetadata {
-    private static final Logger log = LoggerFactory.getLogger(MergeableMavenMetadata.class);
-
-    private Metadata metadata;
-    private long lastModified;
-    private boolean mergeSnapshotVersions;
-
-    public MergeableMavenMetadata(InternalRequestContext context) {
-        boolean v3MetadataEnabled = ConstantValues.mvnMetadataVersion3Enabled.getBoolean();
-        mergeSnapshotVersions = v3MetadataEnabled && MavenNaming.isSnapshotMavenMetadata(context.getResourcePath()) &&
-                context.clientSupportsM3SnapshotVersions();
-    }
-
-    public Metadata getMetadata() {
-        return metadata;
-    }
-
-    public long getLastModified() {
-        return lastModified;
-    }
-
-    public void merge(Metadata otherMetadata, RepoResource foundResource) {
-        long otherLastModified = foundResource.getLastModified();
-        if (metadata == null) {
-            metadata = otherMetadata;
-            lastModified = otherLastModified;
-            if (!mergeSnapshotVersions) {
-                Versioning versioning = metadata.getVersioning();
-                if (versioning != null) {
-                    versioning.setSnapshotVersions(null);
-                }
-            }
-        } else {
-            metadata.merge(otherMetadata);
-            lastModified = Math.max(otherLastModified, lastModified);
-
-            Versioning existingVersioning = metadata.getVersioning();
-            if (existingVersioning != null) {
-                List<String> versions = existingVersioning.getVersions();
-                if (!CollectionUtils.isNullOrEmpty(versions)) {
-                    try {
-                        Collections.sort(versions, new MavenVersionComparator());
-                    } catch (IllegalArgumentException e) {
-                        // New Java 7 TimSort is pointing out the non transitive behavior
-                        // of the Mercury version comparator => Doing fallback to natural string order
-                        log.info(
-                                "Hitting Mercury version comparator non transitive behavior message='" + e.getMessage() + "'");
-                        if (log.isDebugEnabled()) {
-                            log.debug("The lists of versions is: " + versions);
-                        }
-                        Collections.sort(versions);
-                    }
-                    // latest is simply the last (be it snapshot or release version)
-                    String latestVersion = versions.get(versions.size() - 1);
-                    existingVersioning.setLatest(latestVersion);
-
-                    // release is the latest non snapshot version
-                    for (String version : versions) {
-                        if (!MavenNaming.isSnapshot(version)) {
-                            existingVersioning.setRelease(version);
-                        }
-                    }
-                }
-                SnapshotComparator comparator = MavenMetadataCalculator.createSnapshotComparator();
-                // if there's a unique snapshot version prefer the one with the bigger build number
-                Snapshot snapshot = existingVersioning.getSnapshot();
-                Versioning otherMetadataVersioning = otherMetadata.getVersioning();
-                if (otherMetadataVersioning != null) {
-                    Snapshot otherSnapshot = otherMetadataVersioning.getSnapshot();
-                    if (snapshot != null && otherSnapshot != null) {
-                        if (comparator.compare(otherSnapshot, snapshot) > 0) {
-                            snapshot.setBuildNumber(otherSnapshot.getBuildNumber());
-                            snapshot.setTimestamp(otherSnapshot.getTimestamp());
-                        }
-                    }
-                    if (mergeSnapshotVersions) {
-                        addSnapshotVersions(existingVersioning, otherMetadataVersioning);
-                    }
-                }
-            }
-        }
-    }
-
-    private void addSnapshotVersions(Versioning existingVersioning, Versioning otherMetadataVersioning) {
-        //Maven metadata merge function does not include snapshot version (https://jira.codehaus.org/browse/MNG-5180)
-        SnapshotComparator comparator = MavenMetadataCalculator.createSnapshotComparator();
-        List<SnapshotVersion> otherSnapshotVersions = otherMetadataVersioning.getSnapshotVersions();
-        if ((otherSnapshotVersions != null) && !otherSnapshotVersions.isEmpty()) {
-
-            List<SnapshotVersion> existingSnapshotVersions = existingVersioning.getSnapshotVersions();
-            if ((existingSnapshotVersions == null) || existingSnapshotVersions.isEmpty()) {
-                existingVersioning.setSnapshotVersions(otherSnapshotVersions);
-            } else {
-                for (SnapshotVersion otherSnapshotVersion : otherSnapshotVersions) {
-                    for (SnapshotVersion existingSnapshotVersion : existingSnapshotVersions) {
-                        if (snapshotVersionClassifiersEqual(otherSnapshotVersion, existingSnapshotVersion) &&
-                                snapshotVersionExtensionEqual(otherSnapshotVersion, existingSnapshotVersion)) {
-                            if (comparator.compare(otherSnapshotVersion, existingSnapshotVersion) > 0) {
-                                existingSnapshotVersion.setUpdated(otherSnapshotVersion.getUpdated());
-                                existingSnapshotVersion.setVersion(otherSnapshotVersion.getVersion());
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    private boolean snapshotVersionClassifiersEqual(SnapshotVersion otherSnapshotVersion,
-            SnapshotVersion existingSnapshotVersion) {
-        String existingSnapshotClassifier = existingSnapshotVersion.getClassifier();
-        String otherSnapshotClassifier = otherSnapshotVersion.getClassifier();
-        return ((StringUtils.isBlank(otherSnapshotClassifier) && StringUtils.isBlank(existingSnapshotClassifier)) ||
-                (StringUtils.isNotBlank(otherSnapshotClassifier) &&
-                        otherSnapshotClassifier.equals(existingSnapshotClassifier)));
-    }
-
-    private boolean snapshotVersionExtensionEqual(SnapshotVersion otherSnapshotVersion,
-            SnapshotVersion existingSnapshotVersion) {
-        String existingSnapshotExtension = existingSnapshotVersion.getExtension();
-        String otherSnapshotExtension = otherSnapshotVersion.getExtension();
-        return ((StringUtils.isBlank(otherSnapshotExtension) && StringUtils.isBlank(existingSnapshotExtension)) ||
-                (StringUtils.isNotBlank(otherSnapshotExtension) &&
-                        otherSnapshotExtension.equals(existingSnapshotExtension)));
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/virtual/interceptor/PomInterceptor.java b/backend/core/src/main/java/org/artifactory/repo/virtual/interceptor/PomInterceptor.java
deleted file mode 100644
index 4dc1b44..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/virtual/interceptor/PomInterceptor.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.virtual.interceptor;
-
-import org.apache.commons.io.IOUtils;
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.api.repo.exception.maven.BadPomException;
-import org.artifactory.descriptor.repo.PomCleanupPolicy;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.MutableFileInfo;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.Repo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.SaveResourceContext;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.repo.virtual.VirtualRepo;
-import org.artifactory.repo.virtual.interceptor.transformer.PomTransformer;
-import org.artifactory.request.InternalRequestContext;
-import org.artifactory.resource.FileResource;
-import org.artifactory.resource.ResourceStreamHandle;
-import org.artifactory.resource.UnfoundRepoResource;
-import org.artifactory.storage.StorageException;
-import org.artifactory.util.ExceptionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Nonnull;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Intercepts pom resources, transforms the pom according to the policy and saves it to the local storage.
- *
- * @author Eli Givoni
- */
- at Component
-public class PomInterceptor extends VirtualRepoInterceptorBase {
-    private static final Logger log = LoggerFactory.getLogger(PomInterceptor.class);
-
-    @Autowired
-    private InternalRepositoryService repoService;
-
-    @Override
-    @Nonnull
-    public RepoResource onBeforeReturn(VirtualRepo virtualRepo, InternalRequestContext context, RepoResource resource) {
-        String resourcePath = resource.getResponseRepoPath().getPath();
-        // intercept only poms and not if it is the global virtual repo
-        if (VirtualRepoDescriptor.GLOBAL_VIRTUAL_REPO_KEY.equals(virtualRepo.getKey())
-                || !MavenNaming.isPom(context.getResourcePath())) {
-            return resource;
-        }
-
-        PomCleanupPolicy cleanupPolicy = virtualRepo.getPomRepositoryReferencesCleanupPolicy();
-        if (cleanupPolicy.equals(PomCleanupPolicy.nothing)) {
-            return resource;
-        }
-
-        String pomContent;
-        try {
-            pomContent = transformPomResource(context, resource, virtualRepo);
-        } catch (RepoRejectException rre) {
-            String message = "Failed to transform pom file";
-            log.debug(message, rre);
-            return new UnfoundRepoResource(resource.getRepoPath(), message + ": " + rre.getMessage(),
-                    rre.getErrorCode());
-        } catch (IOException e) {
-            String message = "Failed to transform pom file";
-            if (ExceptionUtils.getRootCause(e) instanceof BadPomException) {
-                log.error(message + ":" + e.getMessage());
-            } else {
-                log.debug(message, e);
-                log.error(e.getMessage());
-            }
-            return new UnfoundRepoResource(resource.getRepoPath(), message + ": " + e.getMessage());
-        } catch (StorageException e) {
-            String message = "Failed to transform pom file";
-            log.debug(message, e);
-            log.error(message + ":" + e.getMessage());
-            return new UnfoundRepoResource(resource.getRepoPath(), message + ": " + e.getMessage());
-        }
-
-        RepoPath localStoragePath = InternalRepoPathFactory.create(virtualRepo.getKey(), resourcePath);
-        MutableFileInfo fileInfo = InfoFactoryHolder.get().createFileInfo(localStoragePath);
-        long now = System.currentTimeMillis();
-        fileInfo.setCreated(now);
-        fileInfo.setLastModified(now);
-        fileInfo.createTrustedChecksums();
-        fileInfo.setSize(pomContent.length());
-        RepoResource transformedResource = new FileResource(fileInfo);
-
-        try {
-            SaveResourceContext saveResourceContext = new SaveResourceContext.Builder(transformedResource,
-                    IOUtils.toInputStream(pomContent, "utf-8")).build();
-            transformedResource = repoService.saveResource(virtualRepo, saveResourceContext);
-        } catch (IOException e) {
-            String message = "Failed to import file to local storage";
-            log.error(message, e);
-            return new UnfoundRepoResource(resource.getRepoPath(), message + ": " + e.getMessage());
-        } catch (RepoRejectException rre) {
-            String message = "Failed to import file to local storage";
-            log.debug(message, rre);
-            return new UnfoundRepoResource(resource.getRepoPath(), message + ": " + rre.getMessage(),
-                    rre.getErrorCode());
-        }
-
-        return transformedResource;
-    }
-
-    private String transformPomResource(InternalRequestContext context, RepoResource resource, VirtualRepo virtualRepo)
-            throws IOException, RepoRejectException {
-        String repoKey = resource.getResponseRepoPath().getRepoKey();
-        Repo repository = repoService.repositoryByKey(repoKey);
-        ResourceStreamHandle handle;
-        handle = repoService.getResourceStreamHandle(context, repository, resource);
-
-        InputStream inputStream = handle.getInputStream();
-        String pomAsString = "";
-        if (inputStream != null) {
-            try {
-                pomAsString = IOUtils.toString(inputStream, "utf-8");
-            } finally {
-                IOUtils.closeQuietly(inputStream);
-            }
-        }
-        PomCleanupPolicy cleanupPolicy = virtualRepo.getPomRepositoryReferencesCleanupPolicy();
-        PomTransformer transformer = new PomTransformer(pomAsString, cleanupPolicy);
-        return transformer.transform();
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/repo/virtual/interceptor/VirtualRepoInterceptor.java b/backend/core/src/main/java/org/artifactory/repo/virtual/interceptor/VirtualRepoInterceptor.java
deleted file mode 100644
index ba10802..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/virtual/interceptor/VirtualRepoInterceptor.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.virtual.interceptor;
-
-import org.artifactory.fs.RepoResource;
-import org.artifactory.repo.RealRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.virtual.VirtualRepo;
-import org.artifactory.request.InternalRequestContext;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.List;
-
-/**
- * Interface for interceptors participating in the virtual repository download process.
- *
- * @author Yossi Shaul
- */
-public interface VirtualRepoInterceptor {
-
-    /**
-     * Called before the main virtual repo downloading strategy is handling get info requests. Interceptors that do not
-     * handle requests for this resource should return null. A returned non-null repo resource will be the result sent
-     * to the client.
-     *
-     * @param virtualRepo  The virtual repository handling this request
-     * @param context      The request context
-     * @param repoPath     The request repo path
-     * @param repositories List of resolution repositories
-     * @return
-     */
-    @Nullable
-    RepoResource interceptGetInfo(VirtualRepo virtualRepo, InternalRequestContext context, RepoPath repoPath,
-            List<RealRepo> repositories);
-
-    /**
-     * Called after a resource is resolved and before it is returned to the client. Implementation should never
-     * return null, if this kind of resource is not handled by the interceptor it should return the original.
-     *
-     * @param virtualRepo The virtual repository handling this request
-     * @param context     The request context
-     * @param resource    The <b>found</b> resource
-     * @return Modified resource or original if not handled by this interceptor
-     */
-    @Nonnull
-    RepoResource onBeforeReturn(VirtualRepo virtualRepo, InternalRequestContext context, RepoResource resource);
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/virtual/interceptor/VirtualRepoInterceptorBase.java b/backend/core/src/main/java/org/artifactory/repo/virtual/interceptor/VirtualRepoInterceptorBase.java
deleted file mode 100644
index b882131..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/virtual/interceptor/VirtualRepoInterceptorBase.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.virtual.interceptor;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.repo.RealRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.virtual.VirtualRepo;
-import org.artifactory.request.InternalRequestContext;
-import org.artifactory.resource.UnfoundRepoResource;
-
-import java.util.List;
-
-/**
- * Base/Adapter implementation for {@link VirtualRepoInterceptor} implementations.
- *
- * @author Yossi Shaul
- */
-public abstract class VirtualRepoInterceptorBase implements VirtualRepoInterceptor {
-
-    @Override
-    public RepoResource onBeforeReturn(VirtualRepo virtualRepo, InternalRequestContext context, RepoResource resource) {
-        return resource;
-    }
-
-    @Override
-    public RepoResource interceptGetInfo(VirtualRepo virtualRepo, InternalRequestContext context, RepoPath repoPath,
-            List<RealRepo> repositories) {
-        return null;
-    }
-
-    /**
-     * @param resource Resource to check
-     * @return Returns the given resource iff the status code is forbidden (403). Otherwise returns null
-     */
-    public static UnfoundRepoResource checkIfForbidden(RepoResource resource) {
-        if (resource instanceof UnfoundRepoResource) {
-            if (((UnfoundRepoResource) resource).getStatusCode() == HttpStatus.SC_FORBIDDEN) {
-                return (UnfoundRepoResource) resource;
-            }
-        }
-        return null;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/virtual/interceptor/transformer/PomTransformer.java b/backend/core/src/main/java/org/artifactory/repo/virtual/interceptor/transformer/PomTransformer.java
deleted file mode 100644
index 7d43e44..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/virtual/interceptor/transformer/PomTransformer.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.virtual.interceptor.transformer;
-
-import org.artifactory.descriptor.repo.PomCleanupPolicy;
-import org.artifactory.util.XmlUtils;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- * POM transformer which removes all not needed tags from both the POM itself and the profile tags. Used to strip the
- * repository deceleration from the POM itself.
- * <p/>
- * IMPORTANT FOR FUTURE EDITORS: WHEN ADDING A SEGMENT REMOVAL MAKE SURE TO USE removeChild(org.jdom2.Element, java.lang.String, org.jdom2.Namespace)
- * SO ALL POM MODIFICATIONS WILL BE TRACKED
- *
- * @author Eli Givoni
- * @author Tomer Cohen
- */
-public class PomTransformer {
-    private static final Logger log = LoggerFactory.getLogger(PomTransformer.class);
-
-    private final String pomAsString;
-    private final PomCleanupPolicy pomCleanupPolicy;
-
-    /**
-     * POM modification indicator
-     */
-    private boolean pomChanged = false;
-
-    public PomTransformer(String pomAsString, PomCleanupPolicy pomCleanupPolicy) {
-        if (pomAsString == null) {
-            throw new IllegalArgumentException("Null pom content is not allowed");
-        }
-        this.pomCleanupPolicy = pomCleanupPolicy;
-        this.pomAsString = pomAsString;
-    }
-
-    public String transform() {
-        if (pomCleanupPolicy.equals(PomCleanupPolicy.nothing)) {
-            return pomAsString;
-        }
-        Document pomDocument;
-        try {
-            //delete repositories and pluginsRepositories
-            //Maven model does not preserve layout
-            pomDocument = XmlUtils.parse(pomAsString);
-        } catch (Exception e) {
-            log.warn("Failed to parse pom '{}': ", e.getMessage());
-            return pomAsString;
-        }
-        Element pomRoot = pomDocument.getRootElement();
-        Namespace namespace = pomRoot.getNamespace();
-        removeChild(pomRoot, "repositories", namespace);
-        removeChild(pomRoot, "pluginRepositories", namespace);
-        boolean onlyActiveDefault = pomCleanupPolicy.equals(PomCleanupPolicy.discard_active_reference);
-
-        //delete repositories and pluginsRepositories in profiles
-        Element profilesElement = pomRoot.getChild("profiles", namespace);
-        if (profilesElement != null) {
-            List profiles = profilesElement.getChildren();
-            for (Object profile : profiles) {
-                Element profileElement = (Element) profile;
-                if (onlyActiveDefault) {
-                    boolean activeByDefault = false;
-                    Element activationElement = profileElement.getChild("activation", namespace);
-                    if (activationElement != null) {
-                        Element activationByDefault = activationElement.getChild("activeByDefault", namespace);
-                        if (activationByDefault != null) {
-                            activeByDefault = Boolean.parseBoolean(activationByDefault.getText());
-                        }
-                    }
-                    if (activeByDefault) {
-                        deleteProfileRepositories(profileElement, namespace);
-                    }
-                } else {
-                    deleteProfileRepositories(profileElement, namespace);
-                }
-            }
-        }
-
-        /**
-         * We might have reached here without the pom actually changing, so return the modified xml only if it was
-         * Actually modified, otherwise it can result with identical looking POMs that calculate to different checksums
-         */
-        if (pomChanged) {
-            return XmlUtils.outputString(pomDocument);
-        } else {
-            return pomAsString;
-        }
-    }
-
-    private void deleteProfileRepositories(Element profile, Namespace namespace) {
-        removeChild(profile, "repositories", namespace);
-        removeChild(profile, "pluginRepositories", namespace);
-    }
-
-    /**
-     * Create a central child removal method so that we can also track any changes made to the POM file
-     *
-     * @param toRemoveFrom  Element to remove a child from
-     * @param childToRemove Name of child to remove from element
-     * @param namespace     Namespace of current document
-     */
-    private void removeChild(Element toRemoveFrom, String childToRemove, Namespace namespace) {
-        boolean removed = toRemoveFrom.removeChild(childToRemove, namespace);
-        if (!pomChanged && removed) {
-            pomChanged = true;
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/webdav/LockableWebdavMethod.java b/backend/core/src/main/java/org/artifactory/repo/webdav/LockableWebdavMethod.java
deleted file mode 100644
index c204d77..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/webdav/LockableWebdavMethod.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.webdav;
-
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.request.ArtifactoryRequest;
-import org.artifactory.sapi.common.Lock;
-
-import java.io.IOException;
-
-/**
- * @author Yoav Luft
- */
-public interface LockableWebdavMethod extends WebdavMethod {
-
-    @Lock
-    @Override
-    void handle(ArtifactoryRequest request, ArtifactoryResponse response) throws IOException;
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/webdav/WebdavMethod.java b/backend/core/src/main/java/org/artifactory/repo/webdav/WebdavMethod.java
deleted file mode 100644
index c780341..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/webdav/WebdavMethod.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.webdav;
-
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.request.ArtifactoryRequest;
-
-import java.io.IOException;
-
-/**
- * @author Yoav Luft
- */
-public interface WebdavMethod {
-    /**
-     * Checks whether this method can handle the given request, returns true if it does.
-     * @param method the name of the requested method
-     * @return
-     */
-    boolean canHandle(String method);
-
-    /**
-     * Handle the request. Should only be called if @{link canHandle} returned true.
-     * @param request
-     * @param response
-     */
-    void handle(ArtifactoryRequest request, ArtifactoryResponse response) throws IOException;
-
-    /**
-     * Return this methods name.
-     */
-    String getName();
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/webdav/WebdavServiceImpl.java b/backend/core/src/main/java/org/artifactory/repo/webdav/WebdavServiceImpl.java
deleted file mode 100644
index ec11cdb..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/webdav/WebdavServiceImpl.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.webdav;
-
-import com.google.common.collect.Sets;
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.api.webdav.WebdavService;
-import org.artifactory.request.ArtifactoryRequest;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.io.IOException;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Service class to handle webdav protocol.<p/> Webdav RFCc at: <a href="http://www.ietf.org/rfc/rfc2518.txt">rfc2518</a>,
- * <a href="http://www.ietf.org/rfc/rfc4918.txt">rfc4918</a>.
- *
- * @author Yossi Shaul
- */
- at Service
-public class WebdavServiceImpl implements WebdavService {
-
-    /**
-     * Default depth is infinity. And it is limited no purpose to 3 level deep.
-     */
-    public static final int INFINITY = 3;
-
-    /**
-     * Default namespace.
-     */
-    public static final String DEFAULT_NAMESPACE = "DAV:";
-    public static final String APACHE_NAMESPACE = "http://apache.org/dav/props/";
-    public static final String DEFAULT_NS_ABBRV = "D";
-    public static final String PROP_NS_ABBRV1 = "lp1";
-    public static final String PROP_NS_ABBRV2 = "lp2";
-
-    @Autowired
-    private Collection<WebdavMethod> handlers;
-
-    @Override
-    public boolean handleRequest(String methodName, ArtifactoryRequest request, ArtifactoryResponse response) throws IOException {
-        for (WebdavMethod method : handlers) {
-            if (method.canHandle(methodName)) {
-                method.handle(request, response);
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public Set<String> supportedMethods() {
-        HashSet<String> names = Sets.newHashSet();
-        for (WebdavMethod method : handlers) {
-            names.add(method.getName());
-        }
-        return names;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/webdav/WebdavStatus.java b/backend/core/src/main/java/org/artifactory/repo/webdav/WebdavStatus.java
deleted file mode 100644
index f698236..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/webdav/WebdavStatus.java
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.webdav;
-
-import org.apache.http.HttpStatus;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Wraps the HttpServletResponse class to abstract the specific protocol used. To support other protocols we would only
- * need to modify this class.
- *
- * @author Marc Eaddy
- * @version $Revision$, $Date$
- */
-public class WebdavStatus {
-
-    // ------------------------------------------------------ HTTP Status Codes
-
-    /**
-     * Status code (200) indicating the request succeeded normally.
-     */
-    public static final int SC_OK = HttpStatus.SC_OK;
-
-    /**
-     * Status code (201) indicating the request succeeded and created a new resource on the server.
-     */
-    public static final int SC_CREATED = HttpStatus.SC_CREATED;
-
-    /**
-     * Status code (202) indicating that a request was accepted for processing, but was not completed.
-     */
-    public static final int SC_ACCEPTED = HttpStatus.SC_ACCEPTED;
-
-    /**
-     * Status code (204) indicating that the request succeeded but that there was no new information to return.
-     */
-    public static final int SC_NO_CONTENT = HttpStatus.SC_NO_CONTENT;
-
-    /**
-     * Status code (301) indicating that the resource has permanently moved to a new location, and that future
-     * references should use a new URI with their requests.
-     */
-    public static final int SC_MOVED_PERMANENTLY = HttpStatus.SC_MOVED_PERMANENTLY;
-
-    /**
-     * Status code (302) indicating that the resource has temporarily moved to another location, but that future
-     * references should still use the original URI to access the resource.
-     */
-    public static final int SC_MOVED_TEMPORARILY = HttpStatus.SC_MOVED_TEMPORARILY;
-
-    /**
-     * Status code (304) indicating that a conditional GET operation found that the resource was available and not
-     * modified.
-     */
-    public static final int SC_NOT_MODIFIED = HttpStatus.SC_NOT_MODIFIED;
-
-    /**
-     * Status code (400) indicating the request sent by the client was syntactically incorrect.
-     */
-    public static final int SC_BAD_REQUEST = HttpStatus.SC_BAD_REQUEST;
-
-    /**
-     * Status code (401) indicating that the request requires HTTP authentication.
-     */
-    public static final int SC_UNAUTHORIZED = HttpStatus.SC_UNAUTHORIZED;
-
-    /**
-     * Status code (403) indicating the server understood the request but refused to fulfill it.
-     */
-    public static final int SC_FORBIDDEN = HttpStatus.SC_FORBIDDEN;
-
-    /**
-     * Status code (404) indicating that the requested resource is not available.
-     */
-    public static final int SC_NOT_FOUND = HttpStatus.SC_NOT_FOUND;
-
-    /**
-     * Status code (500) indicating an error inside the HTTP service which prevented it from fulfilling the request.
-     */
-    public static final int SC_INTERNAL_SERVER_ERROR = HttpStatus.SC_INTERNAL_SERVER_ERROR;
-
-    /**
-     * Status code (501) indicating the HTTP service does not support the functionality needed to fulfill the request.
-     */
-    public static final int SC_NOT_IMPLEMENTED = HttpStatus.SC_NOT_IMPLEMENTED;
-
-    /**
-     * Status code (502) indicating that the HTTP server received an invalid response from a server it consulted when
-     * acting as a proxy or gateway.
-     */
-    public static final int SC_BAD_GATEWAY = HttpStatus.SC_BAD_GATEWAY;
-
-    /**
-     * Status code (503) indicating that the HTTP service is temporarily overloaded, and unable to handle the request.
-     */
-    public static final int SC_SERVICE_UNAVAILABLE = HttpStatus.SC_SERVICE_UNAVAILABLE;
-
-    /**
-     * Status code (100) indicating the client may continue with its request.  This interim response is used to inform
-     * the client that the initial part of the request has been received and has not yet been rejected by the server.
-     */
-    public static final int SC_CONTINUE = HttpStatus.SC_CONTINUE;
-
-    /**
-     * Status code (405) indicating the method specified is not allowed for the resource.
-     */
-    public static final int SC_METHOD_NOT_ALLOWED = HttpStatus.SC_METHOD_NOT_ALLOWED;
-
-    /**
-     * Status code (409) indicating that the request could not be completed due to a conflict with the current state of
-     * the resource.
-     */
-    public static final int SC_CONFLICT = HttpStatus.SC_CONFLICT;
-
-    /**
-     * Status code (412) indicating the precondition given in one or more of the request-header fields evaluated to
-     * false when it was tested on the server.
-     */
-    public static final int SC_PRECONDITION_FAILED = HttpStatus.SC_PRECONDITION_FAILED;
-
-    /**
-     * Status code (413) indicating the server is refusing to process a request because the request entity is larger
-     * than the server is willing or able to process.
-     */
-    public static final int SC_REQUEST_ENTITY_TOO_LARGE =
-            413;
-
-    /**
-     * Status code (415) indicating the server is refusing to service the request because the entity of the request is
-     * in a format not supported by the requested resource for the requested method.
-     */
-    public static final int SC_UNSUPPORTED_MEDIA_TYPE =
-            HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE;
-
-    // -------------------------------------------- Extended WebDav status code
-
-    /**
-     * Status code (207) indicating that the response requires providing status for multiple independent operations.
-     */
-    public static final int SC_MULTI_STATUS = 207;
-
-    /**
-     * Status code (422) indicating the entity body submitted with the PATCH method was not understood by the resource.
-     */
-    public static final int SC_UNPROCESSABLE_ENTITY = 422;
-
-    /**
-     * Status code (507) indicating that the resource does not have sufficient space to record the state of the resource
-     * after the execution of this method.
-     */
-    public static final int SC_INSUFFICIENT_SPACE_ON_RESOURCE = 507;
-
-    /**
-     * Status code (424) indicating the method was not executed on a particular resource within its scope because some
-     * part of the method's execution failed causing the entire method to be aborted.
-     */
-    public static final int SC_FAILED_DEPENDENCY = 424;
-
-    /**
-     * Status code (423) indicating the destination resource of a method is locked, and either the request did not
-     * contain a valid Lock-Info header, or the Lock-Info header identifies a lock held by another principal.
-     */
-    public static final int SC_LOCKED = 423;
-
-    /**
-     * This Hashtable contains the mapping of HTTP and WebDAV status codes to descriptive text.
-     */
-    private static Map<Integer, String> mapStatusCodes = new HashMap<>();
-
-    static {
-        // HTTP 1.1 status codes
-        addStatusCodeMap(SC_OK, "OK");
-        addStatusCodeMap(SC_CREATED, "Created");
-        addStatusCodeMap(SC_ACCEPTED, "Accepted");
-        addStatusCodeMap(SC_NO_CONTENT, "No Content");
-        addStatusCodeMap(SC_MOVED_PERMANENTLY, "Moved Permanently");
-        addStatusCodeMap(SC_MOVED_TEMPORARILY, "Moved Temporarily");
-        addStatusCodeMap(SC_NOT_MODIFIED, "Not Modified");
-        addStatusCodeMap(SC_BAD_REQUEST, "Bad Request");
-        addStatusCodeMap(SC_UNAUTHORIZED, "Unauthorized");
-        addStatusCodeMap(SC_FORBIDDEN, "Forbidden");
-        addStatusCodeMap(SC_NOT_FOUND, "Not Found");
-        addStatusCodeMap(SC_INTERNAL_SERVER_ERROR, "Internal Server Error");
-        addStatusCodeMap(SC_NOT_IMPLEMENTED, "Not Implemented");
-        addStatusCodeMap(SC_BAD_GATEWAY, "Bad Gateway");
-        addStatusCodeMap(SC_SERVICE_UNAVAILABLE, "Service Unavailable");
-        addStatusCodeMap(SC_CONTINUE, "Continue");
-        addStatusCodeMap(SC_METHOD_NOT_ALLOWED, "Method Not Allowed");
-        addStatusCodeMap(SC_CONFLICT, "Conflict");
-        addStatusCodeMap(SC_PRECONDITION_FAILED, "Precondition Failed");
-        addStatusCodeMap(SC_REQUEST_ENTITY_TOO_LARGE, "Request Too Long");
-        addStatusCodeMap(SC_UNSUPPORTED_MEDIA_TYPE, "Unsupported Media Type");
-        // WebDav status sodes
-        addStatusCodeMap(SC_MULTI_STATUS, "Multi-Status");
-        addStatusCodeMap(SC_UNPROCESSABLE_ENTITY, "Unprocessable Entity");
-        addStatusCodeMap(SC_INSUFFICIENT_SPACE_ON_RESOURCE, "Insufficient Space On Resource");
-        addStatusCodeMap(SC_FAILED_DEPENDENCY, "Failed Dependency");
-        addStatusCodeMap(SC_LOCKED, "Locked");
-    }
-
-    /**
-     * Returns the HTTP status text for the HTTP or WebDav status code specified by looking it up in the mapping.
-     *
-     * @param statusCode HTTP or WebDAV status code
-     * @return A string with a short descriptive phrase for the HTTP status code (e.g., "OK").
-     */
-    public static String getStatusText(int statusCode) {
-
-        if (!mapStatusCodes.containsKey(statusCode)) {
-            return "";
-        } else {
-            return mapStatusCodes.get(statusCode);
-        }
-    }
-
-    /**
-     * Adds a new status code -> status text mapping.  This is a static method because the mapping is a static
-     * variable.
-     *
-     * @param key    HTTP or WebDAV status code
-     * @param strVal HTTP status text
-     */
-    private static void addStatusCodeMap(int key, String strVal) {
-        mapStatusCodes.put(key, strVal);
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/repo/webdav/XmlWriter.java b/backend/core/src/main/java/org/artifactory/repo/webdav/XmlWriter.java
deleted file mode 100644
index cbd3bb1..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/webdav/XmlWriter.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.webdav;
-
-import java.io.IOException;
-import java.io.Writer;
-
-/**
- * XMLWriter helper class.
- *
- * @author <a href="mailto:remm at apache.org">Remy Maucherat</a>
- */
-public class XmlWriter {
-
-
-    // -------------------------------------------------------------- Constants
-
-
-    /**
-     * Opening tag.
-     */
-    public static final int OPENING = 0;
-
-
-    /**
-     * Closing tag.
-     */
-    public static final int CLOSING = 1;
-
-
-    /**
-     * Element with no content.
-     */
-    public static final int NO_CONTENT = 2;
-
-
-    // ----------------------------------------------------- Instance Variables
-
-
-    /**
-     * Buffer.
-     */
-    protected StringBuffer buffer = new StringBuffer();
-
-
-    /**
-     * Writer.
-     */
-    protected Writer writer = null;
-
-
-    // ----------------------------------------------------------- Constructors
-
-
-    /**
-     * Constructor.
-     */
-    public XmlWriter() {
-    }
-
-
-    /**
-     * Constructor.
-     */
-    public XmlWriter(Writer writer) {
-        this.writer = writer;
-    }
-
-
-    // --------------------------------------------------------- Public Methods
-
-
-    /**
-     * Retrieve generated XML.
-     *
-     * @return String containing the generated XML
-     */
-    public String toString() {
-        return buffer.toString();
-    }
-
-
-    /**
-     * Write property to the XML.
-     *
-     * @param namespace     Namespace
-     * @param namespaceInfo Namespace info
-     * @param name          Property name
-     * @param value         Property value
-     */
-    public void writeProperty(String namespace, String namespaceInfo,
-            String name, String value) {
-        writeElement(namespace, namespaceInfo, name, OPENING);
-        buffer.append(value);
-        writeElement(namespace, namespaceInfo, name, CLOSING);
-
-    }
-
-
-    /**
-     * Write property to the XML.
-     *
-     * @param namespace Namespace
-     * @param name      Property name
-     * @param value     Property value
-     */
-    public void writeProperty(String namespace, String name, String value) {
-        writeElement(namespace, name, OPENING);
-        buffer.append(value);
-        writeElement(namespace, name, CLOSING);
-    }
-
-
-    /**
-     * Write property to the XML.
-     *
-     * @param namespace Namespace
-     * @param name      Property name
-     */
-    public void writeProperty(String namespace, String name) {
-        writeElement(namespace, name, NO_CONTENT);
-    }
-
-
-    /**
-     * Write an element.
-     *
-     * @param name      Element name
-     * @param namespace Namespace abbreviation
-     * @param type      Element type
-     */
-    public void writeElement(String namespace, String name, int type) {
-        writeElement(namespace, null, name, type);
-    }
-
-    /**
-     *
-     * @param name              Element name
-     * @param type              Opening, closing or no content element
-     * @param namespace         Namespace abbreviation
-     * @param namespaceInfos    Namespace definitions
-     */
-    public void writeElement(String namespace, String name, int type, String... namespaceInfos) {
-        if ((namespace != null) && (namespace.length() > 0)) {
-            switch (type) {
-                case OPENING:
-                    if (namespaceInfos.length % 2 == 0) {
-                        buffer.append("<").append(namespace).append(":").append(name);
-                        for (int i = 0;  i < namespaceInfos.length; i += 2) {
-                            buffer.append(" xmlns:").append(namespaceInfos[i]).append("=\"")
-                                    .append(namespaceInfos[i + 1]).append("\"");
-                        }
-                        buffer.append(">");
-                    }
-                     else {
-                        buffer.append("<" + namespace + ":" + name + ">");
-                    }
-                    break;
-                case CLOSING:
-                    buffer.append("</" + namespace + ":" + name + ">\n");
-                    break;
-                case NO_CONTENT:
-                default:
-                    if (namespaceInfos.length % 2 == 0) {
-                        buffer.append("<").append(namespace).append(":").append(name);
-                        for (int i = 0;  i < namespaceInfos.length; i += 2) {
-                            buffer.append(" xmlns:").append(namespaceInfos[i]).append("=\"")
-                                    .append(namespaceInfos[i + 1]).append("\"");
-                        }
-                        buffer.append("/>");
-                    }
-                    else {
-                        buffer.append("<" + namespace + ":" + name + "/>");
-                    }
-                    break;
-            }
-        } else {
-            switch (type) {
-                case OPENING:
-                    buffer.append("<" + name + ">");
-                    break;
-                case CLOSING:
-                    buffer.append("</" + name + ">\n");
-                    break;
-                case NO_CONTENT:
-                default:
-                    buffer.append("<" + name + "/>");
-                    break;
-            }
-        }
-    }
-
-    /**
-     * Write an element.
-     *
-     * @param namespace     Namespace abbreviation
-     * @param namespaceInfo Namespace info
-     * @param name          Element name
-     * @param type          Element type
-     */
-    public void writeElement(String namespace, String namespaceInfo,
-            String name, int type) {
-        if ((namespace != null) && (namespace.length() > 0)) {
-            switch (type) {
-                case OPENING:
-                    if (namespaceInfo != null) {
-                        buffer.append("<" + namespace + ":" + name + " xmlns:"
-                                + namespace + "=\""
-                                + namespaceInfo + "\">");
-                    } else {
-                        buffer.append("<" + namespace + ":" + name + ">");
-                    }
-                    break;
-                case CLOSING:
-                    buffer.append("</" + namespace + ":" + name + ">\n");
-                    break;
-                case NO_CONTENT:
-                default:
-                    if (namespaceInfo != null) {
-                        buffer.append("<" + namespace + ":" + name + " xmlns:"
-                                + namespace + "=\""
-                                + namespaceInfo + "\"/>");
-                    } else {
-                        buffer.append("<" + namespace + ":" + name + "/>");
-                    }
-                    break;
-            }
-        } else {
-            switch (type) {
-                case OPENING:
-                    buffer.append("<" + name + ">");
-                    break;
-                case CLOSING:
-                    buffer.append("</" + name + ">\n");
-                    break;
-                case NO_CONTENT:
-                default:
-                    buffer.append("<" + name + "/>");
-                    break;
-            }
-        }
-    }
-
-
-    /**
-     * Write text.
-     *
-     * @param text Text to append
-     */
-    public void writeText(String text) {
-        buffer.append(text);
-    }
-
-
-    /**
-     * Write data.
-     *
-     * @param data Data to append
-     */
-    public void writeData(String data) {
-        buffer.append("<![CDATA[" + data + "]]>");
-    }
-
-
-    /**
-     * Write XML Header.
-     */
-    public void writeXMLHeader() {
-        buffer.append("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n");
-    }
-
-
-    /**
-     * Send data and reinitializes buffer.
-     */
-    public void sendData()
-            throws IOException {
-        if (writer != null) {
-            writer.write(buffer.toString());
-            buffer = new StringBuffer();
-        }
-    }
-
-
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/webdav/methods/AbstractWebdavMethod.java b/backend/core/src/main/java/org/artifactory/repo/webdav/methods/AbstractWebdavMethod.java
deleted file mode 100644
index e7a48b8..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/webdav/methods/AbstractWebdavMethod.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.webdav.methods;
-
-import org.artifactory.repo.webdav.WebdavMethod;
-import org.artifactory.request.ArtifactoryRequest;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.w3c.dom.Document;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-import java.io.IOException;
-import java.io.StringWriter;
-
-import static org.artifactory.repo.webdav.WebdavServiceImpl.INFINITY;
-
-/**
- * @author Yoav Luft
- */
-public abstract class AbstractWebdavMethod implements WebdavMethod {
-
-    private static final Logger log = LoggerFactory.getLogger(AbstractWebdavMethod.class);
-
-    /**
-     * Get the ETag associated with a file.
-     */
-    static String getEtag(String resourceLength, String lastModified)
-            throws IOException {
-        return "W/\"" + resourceLength + "-" + lastModified + "\"";
-    }
-
-    protected int findDepth(ArtifactoryRequest request) {
-        String depthStr = request.getHeader("Depth");
-        if (depthStr == null) {
-            return INFINITY;
-        }
-        switch (depthStr) {
-            case "0":
-                return 0;
-            case "1":
-                return 1;
-            case "infinity":
-                return INFINITY;
-            default:
-                return INFINITY;
-        }
-    }
-
-    /**
-     * resource type Return JAXP document builder instance.
-     *
-     * @return
-     * @throws javax.servlet.ServletException
-     */
-    protected DocumentBuilder getDocumentBuilder() throws IOException {
-        DocumentBuilder documentBuilder;
-        DocumentBuilderFactory documentBuilderFactory;
-        try {
-            documentBuilderFactory = DocumentBuilderFactory.newInstance();
-            documentBuilderFactory.setNamespaceAware(true);
-            documentBuilder = documentBuilderFactory.newDocumentBuilder();
-        } catch (ParserConfigurationException e) {
-            throw new IOException("JAXP document builder creation failed", e);
-        }
-        return documentBuilder;
-    }
-
-    protected void logWebdavRequest(Document document) throws TransformerException {
-        if (log.isDebugEnabled()) {
-            Transformer transformer = TransformerFactory.newInstance().newTransformer();
-            StringWriter writer = new StringWriter();
-            transformer.transform(new DOMSource(document), new StreamResult(writer));
-            log.debug("Webdav request body:\n" + writer.toString());
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/webdav/methods/DeleteMethod.java b/backend/core/src/main/java/org/artifactory/repo/webdav/methods/DeleteMethod.java
deleted file mode 100644
index 25140f7..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/webdav/methods/DeleteMethod.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.webdav.methods;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.common.StatusHolder;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.repo.webdav.WebdavMethod;
-import org.artifactory.request.ArtifactoryRequest;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-
-/**
- * @author Yoav Luft
- */
- at Component
-public class DeleteMethod implements WebdavMethod {
-
-    private static final Logger log = LoggerFactory.getLogger(DeleteMethod.class);
-
-    @Autowired
-    private InternalRepositoryService repoService;
-
-    @Override
-    public boolean canHandle(String method) {
-        return getName().equalsIgnoreCase(method);
-    }
-
-    @Override
-    public void handle(ArtifactoryRequest request, ArtifactoryResponse response) throws IOException {
-        log.debug("Handling {}", getName());
-        RepoPath repoPath = request.getRepoPath();
-        String repoKey = repoPath.getRepoKey();
-        LocalRepo localRepository = repoService.localOrCachedRepositoryByKey(repoKey);
-        if (localRepository == null) {
-            response.setStatus(HttpStatus.SC_NOT_FOUND);
-            return;
-        }
-        if (!NamingUtils.isProperties(repoPath.getPath())) {
-            deleteItems(request, response, repoPath);
-        } else {
-            deleteProperties(response, repoPath);
-        }
-    }
-
-    /**
-     * Delete items in single or multi trx
-     *
-     * @param request  - encapsulate data related to http servlet request
-     * @param response - encapsulate data related to http servlet response
-     * @param repoPath - repository path
-     * @throws IOException
-     */
-    private void deleteItems(ArtifactoryRequest request, ArtifactoryResponse response, RepoPath repoPath) throws IOException {
-        Boolean atomic = Boolean.valueOf(request.getParameter("atomic"));
-        if (atomic) {
-            deleteItem(response, repoPath);
-        } else {
-            deleteMultiTxItem(response, repoPath);
-        }
-    }
-
-    @Override
-    public String getName() {
-        return "delete";
-    }
-
-    private void deleteItem(ArtifactoryResponse response, RepoPath repoPath) throws IOException {
-        StatusHolder statusHolder = repoService.undeploy(repoPath);
-        if (statusHolder.isError()) {
-            response.sendError(statusHolder);
-        } else {
-            response.setStatus(HttpStatus.SC_NO_CONTENT);
-        }
-    }
-
-    /**
-     * delete file or folder in multi tx
-     *
-     * @param response - encapsulate data related to http servlet response
-     * @param repoPath - repository path
-     * @throws IOException
-     */
-    private void deleteMultiTxItem(ArtifactoryResponse response, RepoPath repoPath) throws IOException {
-        StatusHolder statusHolder = repoService.undeployMultiTransaction(repoPath);
-        if (statusHolder.isError()) {
-            response.sendError(statusHolder);
-        } else {
-            response.setStatus(HttpStatus.SC_NO_CONTENT);
-        }
-    }
-
-    private void deleteProperties(ArtifactoryResponse response, RepoPath repoPath) throws IOException {
-        RepoPathImpl itemRepoPath = new RepoPathImpl(repoPath.getRepoKey(),
-                NamingUtils.stripMetadataFromPath(repoPath.getPath()));
-        boolean removed = repoService.removeProperties(itemRepoPath);
-        if (removed) {
-            response.setStatus(HttpStatus.SC_NO_CONTENT);
-        } else {
-            response.sendError(HttpStatus.SC_NOT_FOUND, "Failed to remove properties from " + itemRepoPath, log);
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/webdav/methods/LockMethod.java b/backend/core/src/main/java/org/artifactory/repo/webdav/methods/LockMethod.java
deleted file mode 100644
index f7eb5b5..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/webdav/methods/LockMethod.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.webdav.methods;
-
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.repo.webdav.WebdavMethod;
-import org.artifactory.repo.webdav.WebdavStatus;
-import org.artifactory.repo.webdav.XmlWriter;
-import org.artifactory.request.ArtifactoryRequest;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-
-import javax.xml.parsers.DocumentBuilder;
-import java.io.IOException;
-import java.io.Writer;
-
-import static org.artifactory.repo.webdav.WebdavServiceImpl.DEFAULT_NAMESPACE;
-import static org.artifactory.repo.webdav.WebdavServiceImpl.DEFAULT_NS_ABBRV;
-
-/**
- * @author Yoav Luft
- */
- at Component
-public class LockMethod extends AbstractWebdavMethod implements WebdavMethod {
-
-    private static final Logger log = LoggerFactory.getLogger(LockMethod.class);
-    public static final String LOCK_TOKEN = "Artifactory:fake-lock-token";
-
-    @Autowired
-    private InternalRepositoryService repositoryService;
-
-    @Override
-    public boolean canHandle(String method) {
-        return getName().equalsIgnoreCase(method);
-    }
-
-    @Override
-    public void handle(ArtifactoryRequest request, ArtifactoryResponse response) throws IOException {
-        log.debug("Handling {}", getName());
-        if (request.getContentLength() <= 0) {
-            response.sendError(WebdavStatus.SC_BAD_REQUEST, "Bad lock request", log);
-        }
-        DocumentBuilder documentBuilder = getDocumentBuilder();
-        try {
-            Document document = documentBuilder.parse(new InputSource(request.getInputStream()));
-            Element root = document.getDocumentElement();
-            String namespace = root.getNamespaceURI();
-            String scope = getLockscope(root, namespace);
-            String lockType = getLockType(root, namespace);
-            String owner = getLockOwner(root, namespace);
-            if ("read".equals(lockType) && !repositoryService.exists(request.getRepoPath())) {
-                response.sendError(WebdavStatus.SC_NOT_FOUND, request.getRepoPath().toPath() + " not found", log);
-            }
-            Writer writer = response.getWriter();
-            writeResponse(writer, owner, scope, lockType);
-        } catch (SAXException e) {
-            response.sendError(WebdavStatus.SC_BAD_REQUEST, "Bad lock request", log);
-        }
-        response.setHeader("Lock-Token", "<" + LOCK_TOKEN + ">");
-        response.setHeader("Vary", "Accept-Encoding");
-        response.setContentType("text/xml; charset=\"utf-8\"");
-        response.sendSuccess();
-    }
-
-    private String getLockType(Element root, String namespace) {
-        Node locktype = root.getElementsByTagNameNS(namespace, "locktype").item(0);
-        if (locktype != null) {
-            if (locktype.getFirstChild() != null) {
-                return locktype.getFirstChild().getLocalName();
-            }
-        }
-        return "";
-    }
-
-    private String getLockscope(Element root, String namespace) {
-        Node lockscope = root.getElementsByTagNameNS(namespace, "lockscope").item(0);
-        if (lockscope != null) {
-            if (lockscope.getFirstChild() != null) {
-                return lockscope.getFirstChild().getLocalName();
-            }
-        }
-        return "";
-    }
-
-    private String getLockOwner(Element root, String namespace) {
-        Node ownerElement = root.getElementsByTagNameNS(namespace, "owner").item(0);
-        NodeList childNodes = ownerElement.getChildNodes();
-        for (int i = 0; i < childNodes.getLength(); i++) {
-            Node node = childNodes.item(i);
-            if ("href".equals(node.getLocalName())) {
-                return node.getFirstChild().getNodeValue();
-            }
-        }
-        return "";
-    }
-
-    private void writeResponse(Writer writer, String owner, String scope, String locktype) throws IOException {
-        XmlWriter xmlWriter = new XmlWriter(writer);
-        xmlWriter.writeXMLHeader();
-        xmlWriter.writeElement(DEFAULT_NS_ABBRV, "prop", XmlWriter.OPENING, DEFAULT_NS_ABBRV, DEFAULT_NAMESPACE);
-        xmlWriter.writeElement(DEFAULT_NS_ABBRV, "lockdiscovery", XmlWriter.OPENING);
-        xmlWriter.writeElement(DEFAULT_NS_ABBRV, "activelock", XmlWriter.OPENING);
-        if (!locktype.isEmpty()) {
-            xmlWriter.writeElement(DEFAULT_NS_ABBRV, "locktype", XmlWriter.OPENING);
-            xmlWriter.writeElement(DEFAULT_NS_ABBRV, locktype, XmlWriter.NO_CONTENT);
-            xmlWriter.writeElement(DEFAULT_NS_ABBRV, "locktype", XmlWriter.CLOSING);
-        } else {
-            xmlWriter.writeElement(DEFAULT_NS_ABBRV, "locktype", XmlWriter.NO_CONTENT);
-        }
-        if (!scope.isEmpty()) {
-            xmlWriter.writeElement(DEFAULT_NS_ABBRV, "lockscope", XmlWriter.OPENING);
-            xmlWriter.writeElement(DEFAULT_NS_ABBRV, scope, XmlWriter.NO_CONTENT);
-            xmlWriter.writeElement(DEFAULT_NS_ABBRV, "lockscope", XmlWriter.CLOSING);
-        } else {
-            xmlWriter.writeElement(DEFAULT_NS_ABBRV, "lockscope", XmlWriter.NO_CONTENT);
-        }
-        xmlWriter.writeElement(DEFAULT_NS_ABBRV, "depth", XmlWriter.OPENING);
-        xmlWriter.writeText("infinity");
-        xmlWriter.writeElement(DEFAULT_NS_ABBRV, "depth", XmlWriter.CLOSING);
-        if (!owner.isEmpty()) {
-            xmlWriter.writeElement("ns0", "owner", XmlWriter.OPENING, "ns0", DEFAULT_NAMESPACE);
-            xmlWriter.writeElement("ns0", "href", XmlWriter.OPENING);
-            xmlWriter.writeText(owner);
-            xmlWriter.writeElement("ns0", "href", XmlWriter.CLOSING);
-            xmlWriter.writeElement("ns0", "owner", XmlWriter.CLOSING);
-        } else {
-            xmlWriter.writeElement("ns0", "owner", XmlWriter.NO_CONTENT, "ns0", DEFAULT_NAMESPACE);
-        }
-        xmlWriter.writeElement(DEFAULT_NS_ABBRV, "timeout", XmlWriter.OPENING);
-        xmlWriter.writeText("Second-3600");
-        xmlWriter.writeElement(DEFAULT_NS_ABBRV, "timeout", XmlWriter.CLOSING);
-        xmlWriter.writeElement(DEFAULT_NS_ABBRV, "locktoken", XmlWriter.OPENING);
-        xmlWriter.writeElement(DEFAULT_NS_ABBRV, "href", XmlWriter.OPENING);
-        xmlWriter.writeText(LOCK_TOKEN);
-        xmlWriter.writeElement(DEFAULT_NS_ABBRV, "href", XmlWriter.CLOSING);
-        xmlWriter.writeElement(DEFAULT_NS_ABBRV, "locktoken", XmlWriter.CLOSING);
-        xmlWriter.writeElement(DEFAULT_NS_ABBRV, "activelock", XmlWriter.CLOSING);
-        xmlWriter.writeElement(DEFAULT_NS_ABBRV, "lockdiscovery", XmlWriter.CLOSING);
-        xmlWriter.writeElement(DEFAULT_NS_ABBRV, "prop", XmlWriter.CLOSING);
-        xmlWriter.sendData();
-    }
-
-    @Override
-    public String getName() {
-        return "lock";
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/webdav/methods/MkcolMethod.java b/backend/core/src/main/java/org/artifactory/repo/webdav/methods/MkcolMethod.java
deleted file mode 100644
index 9f73df4..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/webdav/methods/MkcolMethod.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.webdav.methods;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpHeaders;
-import org.apache.http.HttpStatus;
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.local.ValidDeployPathContext;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.repo.webdav.LockableWebdavMethod;
-import org.artifactory.request.ArtifactoryRequest;
-import org.artifactory.sapi.fs.VfsFolder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-
-/**
- * @author Yoav Luft
- */
- at Component
-public class MkcolMethod implements LockableWebdavMethod {
-
-    private static final Logger log = LoggerFactory.getLogger(MkcolMethod.class);
-
-    @Autowired
-    private InternalRepositoryService repoService;
-
-    @Override
-    public boolean canHandle(String method) {
-        return getName().equals(method);
-    }
-
-    @Override
-    public void handle(ArtifactoryRequest request, ArtifactoryResponse response) throws IOException {
-        log.debug("Handling {}", getName());
-        RepoPath repoPath = request.getRepoPath();
-        String repoKey = request.getRepoKey();
-        LocalRepo repo = repoService.localOrCachedRepositoryByKey(repoKey);
-        if (repo == null) {
-            response.sendError(HttpStatus.SC_NOT_FOUND, "Could not find repo '" + repoKey + "'.", log);
-            return;
-        }
-
-        //Return 405 if called on root or the folder already exists
-        String path = repoPath.getPath();
-        if (StringUtils.isBlank(path) || repo.itemExists(path)) {
-            response.sendError(HttpStatus.SC_METHOD_NOT_ALLOWED,
-                    "MKCOL can only be executed on non-existent resource: " + repoPath, log);
-            return;
-        }
-        //Check that we are allowed to write
-        try {
-            // Servlet container doesn't support long values so we take it manually from the header
-            String contentLengthHeader = request.getHeader(HttpHeaders.CONTENT_LENGTH);
-            long contentLength = StringUtils.isBlank(contentLengthHeader) ? -1 : Long.parseLong(contentLengthHeader);
-            repoService.assertValidDeployPath(
-                    new ValidDeployPathContext.Builder(repo, repoPath).contentLength(contentLength).build());
-        } catch (RepoRejectException rre) {
-            response.sendError(rre.getErrorCode(), rre.getMessage(), log);
-            return;
-        }
-
-        // make sure the parent exists
-        VfsFolder parentFolder = repo.getMutableFolder(repoPath.getParent());
-        if (parentFolder == null) {
-            response.sendError(HttpStatus.SC_CONFLICT,
-                    "Directory cannot be created: parent doesn't exist: " + repoPath.getParent(), log);
-            return;
-        }
-
-        repo.createOrGetFolder(repoPath);
-        response.setStatus(HttpStatus.SC_CREATED);
-    }
-
-    @Override
-    public String getName() {
-        return "mkcol";
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/webdav/methods/MoveMethod.java b/backend/core/src/main/java/org/artifactory/repo/webdav/methods/MoveMethod.java
deleted file mode 100644
index 69c0cc1..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/webdav/methods/MoveMethod.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.webdav.methods;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.artifactory.api.common.MoveMultiStatusHolder;
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.repo.webdav.WebdavMethod;
-import org.artifactory.request.ArtifactoryRequest;
-import org.artifactory.util.PathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.net.URLDecoder;
-
-/**
- * @author Yoav Luft
- */
- at Component
-public class MoveMethod implements WebdavMethod {
-
-    private static final Logger log = LoggerFactory.getLogger(MoveMethod.class);
-    private static final String METHOD_NAME = "move";
-
-    @Autowired
-    private AuthorizationService authService;
-
-    @Autowired
-    private InternalRepositoryService repoService;
-
-    @Override
-    public boolean canHandle(String method) {
-        return getName().equalsIgnoreCase(method);
-    }
-
-    @Override
-    public void handle(ArtifactoryRequest request, ArtifactoryResponse response) throws IOException {
-        log.debug("Handling {}", getName());
-        RepoPath repoPath = request.getRepoPath();
-        if (StringUtils.isEmpty(repoPath.getPath())) {
-            response.sendError(HttpStatus.SC_BAD_REQUEST, "Cannot perform MOVE action on a repository. " +
-                    "Please specify a valid path", log);
-            return;
-        }
-
-        String destination = URLDecoder.decode(request.getHeader("Destination"), "UTF-8");
-        if (StringUtils.isEmpty(destination)) {
-            response.sendError(HttpStatus.SC_BAD_REQUEST, "Header 'Destination' is required.", log);
-            return;
-        }
-
-        String targetPathWithoutContextUrl = StringUtils.remove(destination, request.getServletContextUrl());
-        String targetPathParent = PathUtils.getParent(targetPathWithoutContextUrl);
-        RepoPath targetPath = InternalRepoPathFactory.create(targetPathParent);
-        if (!authService.canDelete(repoPath) || !authService.canDeploy(targetPath)) {
-            response.sendError(HttpStatus.SC_FORBIDDEN, "Insufficient permissions.", log);
-            return;
-        }
-        MoveMultiStatusHolder status;
-        status = getMoveMultiStatusHolder(repoPath, targetPath, request);
-        if (!status.hasWarnings() && !status.hasErrors()) {
-            response.sendSuccess();
-        } else {
-            response.sendError(status);
-        }
-    }
-
-    /**
-     * move artifact with multiple tx and return status holder
-     *
-     * @param repoPath   - repo path
-     * @param targetPath - target repo path
-     * @return status holder
-     */
-    private MoveMultiStatusHolder getMoveMultiStatusHolder(RepoPath repoPath, RepoPath targetPath, ArtifactoryRequest request) {
-        MoveMultiStatusHolder status;
-        Boolean atomic = Boolean.valueOf(request.getParameter("atomic"));
-        if (atomic) {
-            status = repoService.move(repoPath, targetPath, false, true, true);
-        } else {
-            status = repoService.moveMultiTx(repoPath, targetPath, false, true, true);
-        }
-        return status;
-    }
-
-    @Override
-    public String getName() {
-        return METHOD_NAME;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/webdav/methods/OptionsMethod.java b/backend/core/src/main/java/org/artifactory/repo/webdav/methods/OptionsMethod.java
deleted file mode 100644
index 6295674..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/webdav/methods/OptionsMethod.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.webdav.methods;
-
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.api.webdav.WebdavService;
-import org.artifactory.repo.webdav.WebdavMethod;
-import org.artifactory.request.ArtifactoryRequest;
-import org.artifactory.util.PathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-
-/**
- * @author Yoav Luft
- */
- at Component
-public class OptionsMethod implements WebdavMethod {
-
-    private static final Logger log = LoggerFactory.getLogger(OptionsMethod.class);
-
-    @Autowired
-    private WebdavService webdavService;
-
-    @Override
-    public boolean canHandle(String method) {
-        return getName().equalsIgnoreCase(method);
-    }
-
-    @Override
-    public void handle(ArtifactoryRequest request, ArtifactoryResponse response) throws IOException {
-        log.debug("Handling {}", getName());
-        response.setHeader("DAV", "1,2");
-        response.setHeader("Allow", PathUtils.collectionToDelimitedString(webdavService.supportedMethods()));
-        response.setHeader("MS-Author-Via", "DAV");
-        response.sendSuccess();
-    }
-
-    @Override
-    public String getName() {
-        return "options";
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/webdav/methods/PostMethod.java b/backend/core/src/main/java/org/artifactory/repo/webdav/methods/PostMethod.java
deleted file mode 100644
index fc622b3..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/webdav/methods/PostMethod.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.webdav.methods;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.repo.webdav.WebdavMethod;
-import org.artifactory.request.ArtifactoryRequest;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-
-/**
- * @author Yoav Luft
- */
- at Component
-public class PostMethod implements WebdavMethod {
-
-    private static final Logger log = LoggerFactory.getLogger(PostMethod.class);
-
-    private static final String METHOD_NAME = "post";
-
-    @Autowired
-    private InternalRepositoryService repoService;
-
-    @Override
-    public boolean canHandle(String method) {
-        return METHOD_NAME.equalsIgnoreCase(method);
-    }
-
-    @Override
-    public void handle(ArtifactoryRequest request, ArtifactoryResponse response) throws IOException {
-        log.debug("Handling {}", getName());
-        RepoPath repoPath = request.getRepoPath();
-        String repoKey = repoPath.getRepoKey();
-        VirtualRepoDescriptor virtualRepo = repoService.virtualRepoDescriptorByKey(repoKey);
-
-        StringBuilder allowHeaderBuilder = new StringBuilder();
-        allowHeaderBuilder.append("GET");
-
-        if (virtualRepo == null) {
-            allowHeaderBuilder.append(",PUT,DELETE");
-        }
-        response.setHeader("Allow", allowHeaderBuilder.toString());
-        response.setStatus(HttpStatus.SC_METHOD_NOT_ALLOWED);
-    }
-
-    @Override
-    public String getName() {
-        return METHOD_NAME;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/webdav/methods/PropfindMethod.java b/backend/core/src/main/java/org/artifactory/repo/webdav/methods/PropfindMethod.java
deleted file mode 100644
index c3b8f9e..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/webdav/methods/PropfindMethod.java
+++ /dev/null
@@ -1,433 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.webdav.methods;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.artifactory.api.repo.BaseBrowsableItem;
-import org.artifactory.api.repo.BrowsableItem;
-import org.artifactory.api.repo.BrowsableItemCriteria;
-import org.artifactory.api.repo.RepositoryBrowsingService;
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.mime.MimeType;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.repo.webdav.WebdavStatus;
-import org.artifactory.repo.webdav.XmlWriter;
-import org.artifactory.request.ArtifactoryRequest;
-import org.artifactory.util.HttpUtils;
-import org.joda.time.DateTimeZone;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.InputSource;
-
-import javax.annotation.Nullable;
-import javax.xml.parsers.DocumentBuilder;
-import java.io.IOException;
-import java.io.StringWriter;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
-import static org.artifactory.repo.webdav.WebdavServiceImpl.*;
-
- at Component
-public class PropfindMethod extends AbstractWebdavMethod {
-
-    private static final Logger log = LoggerFactory.getLogger(PropfindMethod.class);
-
-    @Autowired
-    private InternalRepositoryService repoService;
-
-    @Autowired
-    private RepositoryBrowsingService repoBrowsing;
-
-    /**
-     * Simple date format for the creation date ISO representation (partial).
-     */
-    protected static final DateTimeFormatter CREATION_DATE_FORMAT =
-            DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss'Z'").withZone(DateTimeZone.forID("GMT"))
-                    .withLocale(Locale.ENGLISH);
-
-    /**
-     * RFC 1123 date format to use in "getlastmodified" attribute
-     * http://tools.ietf.org/html/rfc2068#section-3.3.1
-     */
-    protected static final DateTimeFormatter LAST_MODIFIED_DATE_FORMAT =
-            DateTimeFormat.forPattern("EEE, dd MMM yyyy HH:mm:ss 'GMT'").withZone(DateTimeZone.forID("GMT"))
-                    .withLocale(Locale.ENGLISH);
-
-    /**
-     * PROPFIND options
-     */
-    private enum PropfindType {
-        FIND_ALL_PROP("allprop"),
-        FIND_BY_PROPERTY("prop"),
-        FIND_PROPERTY_NAMES("propname");
-        private final String detectString;
-
-        PropfindType(String detectString) {
-            this.detectString = detectString;
-        }
-
-        @Nullable
-        public static PropfindType fromString(String s) {
-            for (PropfindType type : PropfindType.values()) {
-                if (s.endsWith(type.detectString)) {
-                    return type;
-                }
-            }
-            return null;
-        }
-    }
-
-    @Override
-    public boolean canHandle(String method) {
-        return getName().equalsIgnoreCase(method);
-    }
-
-    @Override
-    public void handle(ArtifactoryRequest request, ArtifactoryResponse response) throws IOException {
-        // Retrieve the resources
-        log.debug("Handling {}", getName());
-        int depth = findDepth(request);
-        List<String> properties = null;
-        PropfindType propertyFindType = PropfindType.FIND_ALL_PROP;
-        Node propNode = null;
-        //get propertyNode and type
-        if (request.getContentLength() > 0) {
-            DocumentBuilder documentBuilder = getDocumentBuilder();
-            try {
-                Document document = documentBuilder.parse(
-                        new InputSource(request.getInputStream()));
-                logWebdavRequest(document);
-                // Get the root element of the document
-                Element rootElement = document.getDocumentElement();
-                NodeList childList = rootElement.getChildNodes();
-
-                for (int i = 0; i < childList.getLength(); i++) {
-                    Node currentNode = childList.item(i);
-                    switch (currentNode.getNodeType()) {
-                        case Node.TEXT_NODE:
-                            break;
-                        case Node.ELEMENT_NODE:
-                            propertyFindType = PropfindType.fromString(currentNode.getNodeName());
-                            if (propertyFindType == PropfindType.FIND_BY_PROPERTY) {
-                                propNode = currentNode;
-                            }
-                            break;
-                    }
-                }
-            } catch (Exception e) {
-                throw new RuntimeException("Webdav propfind failed.", e);
-            }
-        }
-
-        if (propertyFindType == PropfindType.FIND_BY_PROPERTY) {
-            properties = getPropertiesFromXml(propNode);
-        }
-
-        response.setStatus(HttpStatus.SC_MULTI_STATUS);
-        response.setContentType("text/xml; charset=UTF-8");
-
-        // Create multistatus object
-        Writer writer = response.getWriter();
-        if (log.isDebugEnabled()) {
-            writer = new StringWriter(); // write to memory so we'll be able to log the result as string
-        }
-        XmlWriter generatedXml = new XmlWriter(writer);
-        generatedXml.writeXMLHeader();
-        generatedXml.writeElement(DEFAULT_NS_ABBRV, "multistatus", XmlWriter.OPENING,
-                DEFAULT_NS_ABBRV, DEFAULT_NAMESPACE, "ns0",
-                DEFAULT_NAMESPACE);
-
-        RepoPath repoPath = request.getRepoPath();
-        BrowsableItem rootItem = null;
-        if (repoService.exists(repoPath)) {
-            rootItem = repoBrowsing.getLocalRepoBrowsableItem(repoPath);
-        }
-        if (rootItem != null) {
-            recursiveParseProperties(request, generatedXml, rootItem, propertyFindType, properties,
-                    depth);
-        } else {
-            log.warn("Item '" + request.getRepoPath() + "' not found.");
-        }
-        generatedXml.writeElement(DEFAULT_NS_ABBRV, "multistatus", XmlWriter.CLOSING);
-        generatedXml.sendData();
-        if (log.isDebugEnabled()) {
-            log.debug("Webdav response:\n" + writer.toString());
-            //response.setContentLength(writer.toString().getBytes().length);
-            response.getWriter().append(writer.toString());
-        }
-        response.flush();
-    }
-
-    @Override
-    public String getName() {
-        return "propfind";
-    }
-
-    @SuppressWarnings({"OverlyComplexMethod"})
-    private void parseProperties(ArtifactoryRequest request, XmlWriter xmlResponse,
-            BaseBrowsableItem item, PropfindType type, List<String> propertiesList) throws IOException {
-        // Last modified should be returned as RFC 1123 format.
-        // See https://tools.ietf.org/html/rfc4918#section-8
-        RepoPath repoPath = item.getRepoPath();
-        String creationDate = CREATION_DATE_FORMAT.print(item.getCreated());
-        boolean isFolder = item.isFolder();
-        String rfcDate = LAST_MODIFIED_DATE_FORMAT.print(item.getLastModified());
-        String resourceLength = item.getSize() + "";
-
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "response", XmlWriter.OPENING, PROP_NS_ABBRV2, APACHE_NAMESPACE,
-                PROP_NS_ABBRV1, DEFAULT_NAMESPACE);
-
-        //Generating href element
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "href", XmlWriter.OPENING);
-        String origPath = request.getPath();
-        String uri = request.getUri();
-        String hrefBase = uri;
-        origPath = HttpUtils.encodeQuery(origPath);
-        if (origPath.length() > 0) {
-            int idx = uri.lastIndexOf(origPath);
-            if (idx > 0) {
-                //When called recursively avoid concatenating the original path on top of itself
-                hrefBase = uri.substring(0, idx);
-            }
-        }
-        String path = repoPath.getPath();
-        if (StringUtils.isNotBlank(path) && !hrefBase.endsWith("/")) {
-            hrefBase += "/";
-        }
-
-        // Encode only the path since the base is already encoded
-        String href = hrefBase + HttpUtils.encodeQuery(path);
-
-        xmlResponse.writeText(href);
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "href", XmlWriter.CLOSING);
-
-        String resourceName = path;
-        int lastSlash = path.lastIndexOf('/');
-        if (lastSlash != -1) {
-            resourceName = resourceName.substring(lastSlash + 1);
-        }
-
-        String status = "HTTP/1.1 " + WebdavStatus.SC_OK + " " +
-                WebdavStatus.getStatusText(WebdavStatus.SC_OK);
-        switch (type) {
-            case FIND_ALL_PROP:
-                handleFindAllPropsResponse(xmlResponse, creationDate, isFolder, rfcDate, resourceLength, status,
-                        path, resourceName);
-                break;
-            case FIND_PROPERTY_NAMES:
-                handleFindPropNamesResponse(xmlResponse, isFolder, status);
-                break;
-            case FIND_BY_PROPERTY:
-                handleFindByPropResponse(xmlResponse, propertiesList, creationDate, isFolder, rfcDate,
-                        resourceLength, status, path, resourceName);
-                break;
-
-        }
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "response", XmlWriter.CLOSING);
-    }
-
-    private void handleFindByPropResponse(XmlWriter xmlResponse, List<String> propertiesList, String creationDate,
-            boolean isFolder, String lastModified, String resourceLength, String status, String path,
-            String resourceName) throws IOException {
-        //noinspection MismatchedQueryAndUpdateOfCollection
-        List<String> propertiesNotFound = new ArrayList<>();
-        // Parse the list of properties
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "propstat", XmlWriter.OPENING);
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "prop", XmlWriter.OPENING);
-        for (String property : propertiesList) {
-            switch (property) {
-                case "creationdate":
-                    xmlResponse.writeProperty(PROP_NS_ABBRV1, "creationdate", creationDate);
-                    break;
-                case "displayname":
-                    xmlResponse.writeElement(DEFAULT_NS_ABBRV, "displayname", XmlWriter.OPENING);
-                    xmlResponse.writeData(resourceName);
-                    xmlResponse.writeElement(DEFAULT_NS_ABBRV, "displayname", XmlWriter.CLOSING);
-                    break;
-                case "getcontentlanguage":
-                    if (isFolder) {
-                        propertiesNotFound.add(property);
-                    } else {
-                        xmlResponse.writeElement(
-                                null, "getcontentlanguage", XmlWriter.NO_CONTENT);
-                    }
-                    break;
-                case "getcontentlength":
-                    if (isFolder) {
-                        propertiesNotFound.add(property);
-                    } else {
-                        xmlResponse.writeProperty(PROP_NS_ABBRV1, "getcontentlength", resourceLength);
-                    }
-                    break;
-                case "getcontenttype":
-                    if (isFolder) {
-                        propertiesNotFound.add(property);
-                    } else {
-                        xmlResponse.writeProperty(DEFAULT_NS_ABBRV, "getcontenttype",
-                                NamingUtils.getMimeTypeByPathAsString(path));
-                    }
-                    break;
-                case "getetag":
-                    xmlResponse.writeProperty(PROP_NS_ABBRV1, "getetag",
-                            getEtag(resourceLength, lastModified));
-                    break;
-                case "getlastmodified":
-                    xmlResponse.writeProperty(PROP_NS_ABBRV1, "getlastmodified", lastModified);
-                    break;
-                case "source":
-                    xmlResponse.writeProperty(DEFAULT_NS_ABBRV, "source", "");
-                    break;
-                default:
-                    propertiesNotFound.add(property);
-                    break;
-            }
-        }
-        //Always include resource type
-        if (isFolder) {
-            xmlResponse.writeElement(PROP_NS_ABBRV1, "resourcetype", XmlWriter.OPENING);
-            xmlResponse.writeElement(DEFAULT_NS_ABBRV, "collection", XmlWriter.NO_CONTENT);
-            xmlResponse.writeElement(PROP_NS_ABBRV1, "resourcetype", XmlWriter.CLOSING);
-        } else {
-            xmlResponse.writeElement(PROP_NS_ABBRV1, "resourcetype", XmlWriter.NO_CONTENT);
-        }
-
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "prop", XmlWriter.CLOSING);
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "status", XmlWriter.OPENING);
-        xmlResponse.writeText(status);
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "status", XmlWriter.CLOSING);
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "propstat", XmlWriter.CLOSING);
-    }
-
-    private void handleFindPropNamesResponse(XmlWriter xmlResponse, boolean isFolder, String status) {
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "propstat", XmlWriter.OPENING);
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "prop", XmlWriter.OPENING);
-        xmlResponse.writeElement(PROP_NS_ABBRV1, "creationdate", XmlWriter.NO_CONTENT);
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "displayname", XmlWriter.NO_CONTENT);
-        if (!isFolder) {
-            xmlResponse.writeElement(PROP_NS_ABBRV1, "getcontentlanguage", XmlWriter.NO_CONTENT);
-            xmlResponse.writeElement(PROP_NS_ABBRV1, "getcontentlength", XmlWriter.NO_CONTENT);
-            xmlResponse.writeElement(PROP_NS_ABBRV1, "getcontenttype", XmlWriter.NO_CONTENT);
-            xmlResponse.writeElement(PROP_NS_ABBRV1, "getetag", XmlWriter.NO_CONTENT);
-            xmlResponse.writeElement(PROP_NS_ABBRV1, "getlastmodified", XmlWriter.NO_CONTENT);
-        }
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "resourcetype", XmlWriter.NO_CONTENT);
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "source", XmlWriter.NO_CONTENT);
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "lockdiscovery", XmlWriter.NO_CONTENT);
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "prop", XmlWriter.CLOSING);
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "status", XmlWriter.OPENING);
-        xmlResponse.writeText(status);
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "status", XmlWriter.CLOSING);
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "propstat", XmlWriter.CLOSING);
-    }
-
-    private void handleFindAllPropsResponse(XmlWriter xmlResponse, String creationDate, boolean isFolder,
-            String lastModified,
-            String resourceLength, String status, String path, String resourceName) throws IOException {
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "propstat", XmlWriter.OPENING);
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "prop", XmlWriter.OPENING);
-        if (!isFolder) {
-            xmlResponse.writeProperty(PROP_NS_ABBRV1, "getcontentlength", resourceLength);
-
-            MimeType ct = NamingUtils.getMimeType(path);
-            xmlResponse.writeProperty(PROP_NS_ABBRV1, "getcontenttype", ct.getType());
-            xmlResponse.writeElement(PROP_NS_ABBRV1, "resourcetype", XmlWriter.NO_CONTENT);
-        } else {
-            xmlResponse.writeElement(PROP_NS_ABBRV1, "resourcetype", XmlWriter.OPENING);
-            xmlResponse.writeElement(DEFAULT_NS_ABBRV, "collection", XmlWriter.NO_CONTENT);
-            xmlResponse.writeElement(PROP_NS_ABBRV1, "resourcetype", XmlWriter.CLOSING);
-        }
-        xmlResponse.writeProperty(PROP_NS_ABBRV1, "getlastmodified", lastModified);
-        xmlResponse.writeProperty(PROP_NS_ABBRV1, "getetag", getEtag(resourceLength, lastModified));
-        xmlResponse.writeProperty(PROP_NS_ABBRV1, "creationdate", creationDate);
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "displayname", XmlWriter.OPENING);
-        xmlResponse.writeData(resourceName);
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "displayname", XmlWriter.CLOSING);
-        xmlResponse.writeProperty(DEFAULT_NS_ABBRV, "source", "");
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "prop", XmlWriter.CLOSING);
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "status", XmlWriter.OPENING);
-        xmlResponse.writeText(status);
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "status", XmlWriter.CLOSING);
-        xmlResponse.writeElement(DEFAULT_NS_ABBRV, "propstat", XmlWriter.CLOSING);
-    }
-
-    /**
-     * goes recursive through all folders. used by propfind
-     */
-    private void recursiveParseProperties(ArtifactoryRequest request,
-            XmlWriter generatedXml, BaseBrowsableItem currentItem, PropfindType propertyFindType,
-            List<String> properties,
-            int depth)
-            throws IOException {
-
-        parseProperties(request, generatedXml, currentItem, propertyFindType, properties);
-
-        if (depth <= 0) {
-            return;
-        }
-
-        if (currentItem.isFolder()) {
-            BrowsableItemCriteria criteria = new BrowsableItemCriteria.Builder(currentItem.getRepoPath()).build();
-            List<BaseBrowsableItem> browsableChildren = repoBrowsing.getLocalRepoBrowsableChildren(criteria);
-            for (BaseBrowsableItem child : browsableChildren) {
-                recursiveParseProperties(request, generatedXml, child,
-                        propertyFindType, properties, depth - 1);
-            }
-        }
-    }
-
-    private List<String> getPropertiesFromXml(Node propNode) {
-        List<String> properties;
-        properties = new ArrayList<>();
-        NodeList childList = propNode.getChildNodes();
-        for (int i = 0; i < childList.getLength(); i++) {
-            Node currentNode = childList.item(i);
-            switch (currentNode.getNodeType()) {
-                case Node.TEXT_NODE:
-                    break;
-                case Node.ELEMENT_NODE:
-                    String nodeName = currentNode.getNodeName();
-                    String propertyName;
-                    if (nodeName.indexOf(':') != -1) {
-                        propertyName = nodeName.substring(nodeName.indexOf(':') + 1);
-                    } else {
-                        propertyName = nodeName;
-                    }
-                    // href is a live property which is handled differently
-                    properties.add(propertyName);
-                    break;
-            }
-        }
-        return properties;
-    }
-
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/repo/webdav/methods/ProppatchMethod.java b/backend/core/src/main/java/org/artifactory/repo/webdav/methods/ProppatchMethod.java
deleted file mode 100644
index 3394147..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/webdav/methods/ProppatchMethod.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.webdav.methods;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.repo.webdav.WebdavMethod;
-import org.artifactory.request.ArtifactoryRequest;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-
-/**
- * Empty handler for supporting windows client
- *
- * @author Yoav Luft
- */
- at Component
-public class ProppatchMethod implements WebdavMethod {
-
-    private static final Logger log = LoggerFactory.getLogger(ProppatchMethod.class);
-    public static final String METHOD_NAME = "proppatch";
-
-    @Autowired
-    private InternalRepositoryService repoService;
-
-    @Override
-    public boolean canHandle(String method) {
-        return getName().equalsIgnoreCase(method);
-    }
-
-    @Override
-    public void handle(ArtifactoryRequest request, ArtifactoryResponse response) throws IOException {
-        log.debug("Handling {}", getName());
-        RepoPath repoPath = request.getRepoPath();
-        if (repoService.exists(repoPath)) {
-            // TODO [yluft]: actually check if we can handle the request.
-            response.sendSuccess();
-        } else {
-            response.sendError(HttpStatus.SC_NOT_FOUND, "Resource " + repoPath.toPath() + " does not exists.", log);
-        }
-    }
-
-    @Override
-    public String getName() {
-        return METHOD_NAME;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/repo/webdav/methods/UnlockMethod.java b/backend/core/src/main/java/org/artifactory/repo/webdav/methods/UnlockMethod.java
deleted file mode 100644
index f5600a6..0000000
--- a/backend/core/src/main/java/org/artifactory/repo/webdav/methods/UnlockMethod.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.webdav.methods;
-
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.repo.webdav.WebdavMethod;
-import org.artifactory.repo.webdav.WebdavStatus;
-import org.artifactory.request.ArtifactoryRequest;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-
-/**
- * @author Yoav Luft
- */
- at Component
-public class UnlockMethod implements WebdavMethod {
-    @Override
-    public boolean canHandle(String method) {
-        return getName().equalsIgnoreCase(method);
-    }
-
-    @Override
-    public void handle(ArtifactoryRequest request, ArtifactoryResponse response) throws IOException {
-        response.setStatus(WebdavStatus.SC_NO_CONTENT);
-    }
-
-    @Override
-    public String getName() {
-        return "unlock";
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/request/BaseRequestContext.java b/backend/core/src/main/java/org/artifactory/request/BaseRequestContext.java
deleted file mode 100644
index 48a4e26..0000000
--- a/backend/core/src/main/java/org/artifactory/request/BaseRequestContext.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.request;
-
-import com.google.common.collect.Maps;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpHeaders;
-
-import javax.annotation.Nonnull;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * @author Noam Y. Tenne
- */
-public abstract class BaseRequestContext implements InternalRequestContext {
-    private static final Pattern PATTERN_JAVA_AGENT = Pattern.compile("[Jj]ava/(.+)");
-
-    protected final ArtifactoryRequest request;
-
-    /**
-     * Generic attributes which can be added and queried, this should not be mistaken with
-     * request properties which are the matrix params of the request, the attributes are
-     * essentially meant for internal usage.
-     */
-    protected Map<String, String> attributes;
-
-    protected BaseRequestContext(@Nonnull ArtifactoryRequest request) {
-        this.request = request;
-    }
-
-    @Override
-    public String getServletContextUrl() {
-        return request.getServletContextUrl();
-    }
-
-    @Override
-    public boolean clientSupportsM3SnapshotVersions() {
-        Request request = getRequest();
-        String userAgent = request.getHeader(HttpHeaders.USER_AGENT);
-        if (StringUtils.isBlank(userAgent)) {
-            return true;
-        }
-
-        if (userAgent.startsWith("Wharf Ivy/") || userAgent.startsWith("Apache Ivy/")) {
-            return false;
-        }
-
-        /**
-         * Maven versions older that 2.0.9 (including) sent only the java version in the user agent; that's how we know
-         * if the metadata should be filtered for compatibility
-         */
-        Matcher agentVersionMatcher = PATTERN_JAVA_AGENT.matcher(userAgent);
-        return !agentVersionMatcher.matches();
-    }
-
-    @Override
-    @Nonnull
-    public ArtifactoryRequest getRequest() {
-        return request;
-    }
-
-    @Override
-    public void setAttribute(String name, String value) {
-        if (attributes == null) {
-            attributes = Maps.newHashMap();
-        }
-        attributes.put(name, value);
-    }
-
-    @Override
-    public String getAttribute(String name) {
-        if (attributes == null) {
-            return null;
-        }
-        return attributes.get(name);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/request/DownloadRequestContext.java b/backend/core/src/main/java/org/artifactory/request/DownloadRequestContext.java
deleted file mode 100644
index 96dceef..0000000
--- a/backend/core/src/main/java/org/artifactory/request/DownloadRequestContext.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.request;
-
-import org.artifactory.md.Properties;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.util.PathUtils;
-
-import javax.annotation.Nonnull;
-
-/**
- * Implementation based on a download http request.
- *
- * @author Yossi Shaul
- */
-public class DownloadRequestContext extends BaseRequestContext {
-
-    private boolean forceExpiryCheck;
-
-    public DownloadRequestContext(@Nonnull ArtifactoryRequest artifactoryRequest) {
-        super(artifactoryRequest);
-    }
-
-    public DownloadRequestContext(@Nonnull ArtifactoryRequest artifactoryRequest, boolean forceExpiryCheck) {
-        super(artifactoryRequest);
-        this.forceExpiryCheck = forceExpiryCheck;
-    }
-
-    @Override
-    public boolean isFromAnotherArtifactory() {
-        return request.isFromAnotherArtifactory();
-    }
-
-    @Override
-    public String getResourcePath() {
-        String path = request.getPath();
-        return NamingUtils.isChecksum(path) ? PathUtils.stripExtension(path) : path;
-    }
-
-    @Override
-    public Properties getProperties() {
-        return request.getProperties();
-    }
-
-    @Override
-    public boolean isForceExpiryCheck() {
-        return forceExpiryCheck;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/request/InternalArtifactoryResponse.java b/backend/core/src/main/java/org/artifactory/request/InternalArtifactoryResponse.java
deleted file mode 100644
index 277dda2..0000000
--- a/backend/core/src/main/java/org/artifactory/request/InternalArtifactoryResponse.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.request;
-
-import org.apache.commons.io.output.NullOutputStream;
-import org.apache.commons.io.output.NullWriter;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.common.StatusHolder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.Writer;
-
-/**
- * An internal response that is used as a dummy client to consume responses from Artifactory. It is used when
- * Artifactory is sending itself a request (e.g., to eager fetch sources jar). When using this response the download
- * traffic is not counted.
- *
- * @author Yossi Shaul
- */
-public class InternalArtifactoryResponse extends ArtifactoryResponseBase {
-
-    private static final Logger log = LoggerFactory.getLogger(InternalArtifactoryResponse.class);
-
-    private String statusMessage;
-
-    public InternalArtifactoryResponse() {
-    }
-
-    @Override
-    public void setLastModified(long lastModified) {
-        // ignore
-    }
-
-    @Override
-    public void setEtag(String etag) {
-        // ignore
-    }
-
-    @Override
-    public void setMd5(String md5) {
-        // ignore
-    }
-
-    @Override
-    public void setRangeSupport(String bytes) {
-        // ignore
-    }
-
-    @Override
-    public void setSha1(String sha1) {
-        // ignore
-    }
-
-    @Override
-    public void sendErrorInternal(int statusCode, String reason) throws IOException {
-        // nothing special
-        statusMessage = reason;
-    }
-
-    @Override
-    public void sendAuthorizationRequired(String message, String realm) throws IOException {
-        super.sendError(HttpStatus.SC_FORBIDDEN, message, log);
-    }
-
-    @Override
-    public OutputStream getOutputStream() throws IOException {
-        return new NullOutputStream();
-    }
-
-    @Override
-    public void setContentDispositionAttachment(String filename) {
-        // ignore
-    }
-
-    @Override
-    public void setFilename(String filename) {
-        // ignore
-    }
-
-    @Override
-    public Writer getWriter() throws IOException {
-        return new NullWriter();
-    }
-
-    @Override
-    public void setHeader(String header, String value) {
-        // ignore
-    }
-
-    @Override
-    public void flush() {
-        // ignore
-    }
-
-    @Override
-    public void setContentType(String contentType) {
-        // ignore
-    }
-
-    @Override
-    public boolean isCommitted() {
-        return false;
-    }
-
-    @Override
-    public void sendError(int statusCode, String reason, Logger log) throws IOException {
-        super.sendError(statusCode, reason, log);
-    }
-
-    public String getStatusMessage() {
-        return statusMessage;
-    }
-
-    public StatusHolder getStatusHolder() {
-        BasicStatusHolder sh = new BasicStatusHolder();
-        if (StringUtils.isNotBlank(statusMessage)) {
-            if (isSuccessful()) {
-                sh.status(statusMessage, getStatus(), log);
-            } else {
-                sh.error(statusMessage, getStatus(), log);
-            }
-        }
-        return sh;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/request/InternalCapturingResponse.java b/backend/core/src/main/java/org/artifactory/request/InternalCapturingResponse.java
deleted file mode 100644
index afb4e08..0000000
--- a/backend/core/src/main/java/org/artifactory/request/InternalCapturingResponse.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.request;
-
-import com.google.common.base.Charsets;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
-/**
- * An Artifactory response which holds the OutputStream for later use.
- *
-* @author Shay Yaakov
-*/
-public class InternalCapturingResponse extends InternalArtifactoryResponse {
-    /**
-     * Either the output stream or the writer might be used. Never both of them.
-     */
-    ByteArrayOutputStream out;
-    private StringWriter stringWriter;
-    private PrintWriter writer;
-
-    @Override
-    public OutputStream getOutputStream() throws IOException {
-        if (out == null) {
-            out = new ByteArrayOutputStream();
-        }
-        return out;
-    }
-
-    @Override
-    public PrintWriter getWriter() throws IOException {
-        if (stringWriter == null) {
-            stringWriter = new StringWriter();
-            writer = new PrintWriter(stringWriter);
-        }
-        return writer;
-    }
-
-    /**
-     * Returns the string representing the response. Only call this method if the expected response is text base.
-     *
-     * @return The response result as a stream.
-     */
-    public String getResultAsString() {
-        if (out != null) {
-            return new String(out.toByteArray(), Charsets.UTF_8);
-        } else if (stringWriter != null) {
-            return stringWriter.toString();
-        } else {
-            return null;
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/request/InternalRequestContext.java b/backend/core/src/main/java/org/artifactory/request/InternalRequestContext.java
deleted file mode 100644
index 5833d5c..0000000
--- a/backend/core/src/main/java/org/artifactory/request/InternalRequestContext.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.request;
-
-/**
- * @author Yoav Landman
- */
-public interface InternalRequestContext extends RequestContext {
-
-    /**
-     * Tests that the client's "User-Agent" header value does not match the pattern of older Maven versions (prior to
-     * and including 2.0.9) that don't support Maven 3 type metadata which includes a list of snapshot versions.
-     *
-     * @return True if the client "User-Agent" header value does not match the pattern of older Maven versions
-     */
-    public boolean clientSupportsM3SnapshotVersions();
-
-    /**
-     * Force resource expiry check (regardless of the resource cache age), usually triggered by a user plugin
-     * to add expired resources others than those who implements CacheExpirable.
-     *
-     * @return True if should force expiry check
-     * @see org.artifactory.repo.cache.expirable.CacheExpirable
-     * @see org.artifactory.addon.plugin.download.BeforeDownloadRequestAction
-     */
-    public boolean isForceExpiryCheck();
-}
diff --git a/backend/core/src/main/java/org/artifactory/request/NullRequestContext.java b/backend/core/src/main/java/org/artifactory/request/NullRequestContext.java
deleted file mode 100644
index cb0c46a..0000000
--- a/backend/core/src/main/java/org/artifactory/request/NullRequestContext.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.request;
-
-import org.artifactory.api.request.InternalArtifactoryRequest;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-
-/**
- * Dummy implementation of the request context. It doesn't contain the original request. Used in internal requests and
- * for testing.
- *
- * @author Yossi Shaul
- */
-public class NullRequestContext extends BaseRequestContext {
-
-    public NullRequestContext(RepoPath repoPath) {
-        super(new InternalArtifactoryRequest(repoPath));
-    }
-
-    @Override
-    public boolean isFromAnotherArtifactory() {
-        return false;
-    }
-
-    @Override
-    public String getResourcePath() {
-        final RepoPath repoPath = request.getRepoPath();
-        return repoPath.getPath();
-    }
-
-    @Override
-    public Properties getProperties() {
-        return (Properties) InfoFactoryHolder.get().createProperties();
-    }
-
-    public void setServletContextUrl(String servletContextUrl) {
-        ((InternalArtifactoryRequest)getRequest()).setServletContextUrl(servletContextUrl);
-    }
-
-    @Override
-    public boolean isForceExpiryCheck() {
-        return false;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/request/RequestResponseHelper.java b/backend/core/src/main/java/org/artifactory/request/RequestResponseHelper.java
deleted file mode 100644
index 2bfbc81..0000000
--- a/backend/core/src/main/java/org/artifactory/request/RequestResponseHelper.java
+++ /dev/null
@@ -1,330 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.request;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpHeaders;
-import org.apache.http.HttpStatus;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.api.rest.constant.ArtifactRestConstants;
-import org.artifactory.descriptor.repo.RealRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.request.range.RangeAwareContext;
-import org.artifactory.resource.RepoResourceInfo;
-import org.artifactory.resource.ResourceStreamHandle;
-import org.artifactory.resource.ZipEntryResource;
-import org.artifactory.security.AccessLogger;
-import org.artifactory.traffic.TrafficService;
-import org.artifactory.traffic.entry.DownloadEntry;
-import org.artifactory.util.HttpUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.http.MediaType;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-import static org.artifactory.api.rest.constant.ArtifactRestConstants.MT_ITEM_PROPERTIES;
-import static org.artifactory.request.range.ResponseWithRangeSupportHelper.createRangeAwareContext;
-
-/**
- * @author yoavl
- */
-public final class RequestResponseHelper {
-    private static final Logger log = LoggerFactory.getLogger(RequestResponseHelper.class);
-
-    private TrafficService trafficService;
-
-    public RequestResponseHelper(TrafficService service) {
-        trafficService = service;
-    }
-
-    private static void addDebugLog(long actualLength, long resLenght, RepoPath repoPath) {
-        if (log.isDebugEnabled()) {
-            log.debug("Sending back body response for '{}'. Original resource size: {}, actual size: {}.",
-                    repoPath, resLenght, actualLength);
-        }
-    }
-
-    public void sendBodyResponse(ArtifactoryResponse response, RepoResource res, ResourceStreamHandle handle,
-            InternalRequestContext requestContext) throws IOException {
-        // Try to get range headers
-        String rangesString = tryToGetRangeHeaderInsensitive(HttpHeaders.RANGE, requestContext.getRequest());
-        String ifRangesString = tryToGetRangeHeaderInsensitive(HttpHeaders.IF_RANGE, requestContext.getRequest());
-        // Get mimetype
-        String mimeType = res.getMimeType();
-        InputStream inputStream = handle.getInputStream();
-        // Get Actual file actualLength (Note that it might not be equal to the res.getSize)
-        long actualLength = handle.getSize();
-        AccessLogger.downloaded(res.getRepoPath());
-        addDebugLog(actualLength, res.getSize(), res.getRepoPath());
-        // Ensure valid content length
-        actualLength = actualLength > 0 ? actualLength : res.getSize();
-        // Get artifact last modified date
-        long lastModified = res.getLastModified();
-        // Get artifact sha1
-        String sha1 = res.getInfo().getSha1();
-        // Create range aware data for the response
-        RangeAwareContext context = createRangeAwareContext(inputStream, actualLength, rangesString, ifRangesString,
-                mimeType, lastModified, sha1);
-        // If request range not satisfiable update response status end return
-        if (context.getStatus() == HttpStatus.SC_REQUESTED_RANGE_NOT_SATISFIABLE) {
-            response.setHeader(HttpHeaders.CONTENT_RANGE, context.getContentRange());
-            response.setStatus(context.getStatus());
-            return;
-        }
-        // Update response with repo resource info
-        updateResponseFromRepoResource(response, res, context.getEtagExtension());
-        // update content length with range aware content length
-        response.setContentLength(context.getContentLength());
-        // update content type with range aware content type
-        response.setContentType(context.getContentType());
-        // update headers with range aware headers
-        if (context.getContentRange() != null) {
-            response.setHeader(HttpHeaders.CONTENT_RANGE, context.getContentRange());
-        }
-        // Set response status
-        if (context.getStatus() > 0) {
-            response.setStatus(context.getStatus());
-        }
-        // Get range aware input stream
-        inputStream = context.getInputStream();
-        // Get current time for logs
-        long start = System.currentTimeMillis();
-        // Send range aware input stream
-        response.sendStream(inputStream);
-        fireDownloadTrafficEvent(response, res.getRepoPath(), context.getContentLength(), start);
-    }
-
-    private String tryToGetRangeHeaderInsensitive(String name, Request request) {
-        String header = request.getHeader(name);
-        if (StringUtils.isBlank(header)) {
-            header = request.getHeader(name.toLowerCase());
-        }
-        return header;
-    }
-
-    public void sendBodyResponse(ArtifactoryResponse response, RepoPath repoPath, String content, Request request)
-            throws IOException {
-        // Make sure that the response is not empty
-        if (content == null) {
-            RuntimeException exception = new RuntimeException("Cannot send null response");
-            response.sendInternalError(exception, log);
-            throw exception;
-        }
-        byte[] bytes = content.getBytes("utf-8");
-        try (InputStream is = new ByteArrayInputStream(bytes)) {
-            String path = repoPath.getPath();
-            String mimeType = NamingUtils.getMimeTypeByPathAsString(path);
-            response.setContentType(mimeType);
-            int bodySize = bytes.length;
-            response.setLastModified(System.currentTimeMillis());
-            AccessLogger.downloaded(repoPath);
-            // Try to get range header
-            String rangesString = tryToGetRangeHeaderInsensitive(HttpHeaders.RANGE, request);
-            // Create range aware data for the response
-            // If-Range is not supported
-            RangeAwareContext context = createRangeAwareContext(is, bodySize, rangesString, null, mimeType, -1, null);
-            // If request range not satisfiable update response status end return
-            if (context.getStatus() == HttpStatus.SC_REQUESTED_RANGE_NOT_SATISFIABLE) {
-                response.setHeader(HttpHeaders.CONTENT_RANGE, context.getContentRange());
-                response.setStatus(context.getStatus());
-                return;
-            }
-            // update content length with range aware content length
-            response.setContentLength(context.getContentLength());
-            // update content type with range aware content type
-            response.setContentType(context.getContentType());
-            // update headers with range aware headers
-            if (context.getContentRange() != null) {
-                response.setHeader(HttpHeaders.CONTENT_RANGE, context.getContentRange());
-            }
-            // Get range aware input stream
-            InputStream inputStream = context.getInputStream();
-            // Set response status
-            if (context.getStatus() > 0) {
-                response.setStatus(context.getStatus());
-            }
-            // Get current time for logs
-            long start = System.currentTimeMillis();
-            response.sendStream(inputStream);
-            fireDownloadTrafficEvent(response, repoPath, context.getContentLength(), start);
-        }
-    }
-
-    private void fireDownloadTrafficEvent(ArtifactoryResponse response, RepoPath repoPath, long size,
-            long start) {
-        if (!(response instanceof InternalArtifactoryResponse)) {
-            String remoteAddress = HttpUtils.getRemoteClientAddress();
-            DownloadEntry downloadEntry = new DownloadEntry(
-                    repoPath.getId(), size, System.currentTimeMillis() - start, remoteAddress);
-            trafficService.handleTrafficEntry(downloadEntry);
-        }
-    }
-
-    public void sendHeadResponse(ArtifactoryResponse response, RepoResource res) {
-        log.debug("{}: Sending HEAD meta-information", res.getRepoPath());
-        if (!isContentLengthSet(response)) {
-            response.setContentLength(res.getSize());
-        }
-        updateResponseFromRepoResource(response, res, "");
-        response.setContentType(res.getMimeType());
-        response.sendSuccess();
-    }
-
-    public void sendNotModifiedResponse(ArtifactoryResponse response, RepoResource res) throws IOException {
-        log.debug("{}: Sending NOT-MODIFIED response", res.toString());
-        response.setContentLength(0);
-        updateResponseFromRepoResource(response, res, "");
-        response.setContentType(res.getMimeType());
-        response.setStatus(HttpStatus.SC_NOT_MODIFIED);
-    }
-
-    public void updateResponseForProperties(ArtifactoryResponse response, RepoResource res,
-            String content, MediaType mediaType, InternalRequestContext requestContext) throws IOException {
-        RepoPath propsDownloadRepoPath;
-        String contentType;
-        if (mediaType.equals(MediaType.APPLICATION_XML)) {
-            propsDownloadRepoPath = RepoPathFactory.create(res.getRepoPath().getRepoKey(),
-                    res.getRepoPath().getPath() + "?" + ArtifactRestConstants.PROPERTIES_XML_PARAM);
-            contentType = mediaType.getType();
-        } else if (mediaType.equals(MediaType.APPLICATION_JSON)) {
-            propsDownloadRepoPath = RepoPathFactory.create(res.getRepoPath().getRepoKey(),
-                    res.getRepoPath().getPath() + "?" + ArtifactRestConstants.PROPERTIES_PARAM);
-            contentType = MT_ITEM_PROPERTIES;
-        } else {
-            response.sendError(HttpStatus.SC_BAD_REQUEST, "Media Type " + mediaType + " not supported!", log);
-            return;
-        }
-        // props generated xml and json always browsable
-        setBasicHeaders(response, res, false, "");
-        noCache(response);
-        byte[] bytes = content.getBytes("utf-8");
-        try (InputStream is = new ByteArrayInputStream(bytes)) {
-            int bodySize = bytes.length;
-            AccessLogger.downloaded(propsDownloadRepoPath);
-            // Try to get range header
-            String rangesString = tryToGetRangeHeaderInsensitive(HttpHeaders.RANGE, requestContext.getRequest());
-            String ifRangesString = tryToGetRangeHeaderInsensitive(HttpHeaders.IF_RANGE, requestContext.getRequest());
-            // Get artifact last modified date
-            long lastModified = res.getLastModified();
-            // Get artifact sha1
-            String sha1 = res.getInfo().getSha1();
-            // Create range aware data for the response
-            RangeAwareContext context = createRangeAwareContext(is, bodySize, rangesString, ifRangesString, contentType,
-                    lastModified, sha1);
-            // If request range not satisfiable update response status end return
-            if (context.getStatus() == HttpStatus.SC_REQUESTED_RANGE_NOT_SATISFIABLE) {
-                response.setHeader(HttpHeaders.CONTENT_RANGE, context.getContentRange());
-                response.setStatus(context.getStatus());
-                return;
-            }
-            // update content length with range aware content length
-            response.setContentLength(context.getContentLength());
-            // update content type with range aware content type
-            response.setContentType(context.getContentType());
-            // update headers with range aware headers
-            if (context.getContentRange() != null) {
-                response.setHeader(HttpHeaders.CONTENT_RANGE, context.getContentRange());
-            }
-            // Set response status
-            if (context.getStatus() > 0) {
-                response.setStatus(context.getStatus());
-            }
-            // Get range aware input stream
-            InputStream inputStream = context.getInputStream();
-            // Get current time for logs
-            long start = System.currentTimeMillis();
-            // Send stream
-            response.sendStream(inputStream);
-            // Fire Download traffic event
-            fireDownloadTrafficEvent(response, propsDownloadRepoPath, context.getContentLength(), start);
-        }
-    }
-
-    private void updateResponseFromRepoResource(ArtifactoryResponse response, RepoResource res, String etagExtension) {
-        setBasicHeaders(response, res, contentBrowsingDisabled(res), etagExtension);
-        if (res.isExpirable()) {
-            noCache(response);
-        }
-    }
-
-    private boolean isContentLengthSet(ArtifactoryResponse response) {
-        return response.getContentLength() != -1;
-    }
-
-    private void setBasicHeaders(ArtifactoryResponse response, RepoResource res, boolean contentBrowsingDisabled,
-            String etagExtension) {
-        response.setLastModified(res.getLastModified());
-        RepoResourceInfo info = res.getInfo();
-        // set the sha1 as the eTag and the sha1 header
-        String sha1 = info.getSha1();
-        String etag = sha1 != null ? sha1 + etagExtension : null;
-        response.setEtag(etag);
-        response.setSha1(sha1);
-        response.setRangeSupport("bytes");
-        // set the md5 header
-        String md5 = info.getMd5();
-        response.setMd5(md5);
-        if (response instanceof ArtifactoryResponseBase) {
-            String fileName = info.getName();
-            if (!isNotZipResource(res)) {
-                // The filename is the zip entry inside the zip
-                ZipEntryResource zipEntryResource = (ZipEntryResource) res;
-                fileName = zipEntryResource.getEntryPath();
-            }
-            ((ArtifactoryResponseBase) response).setFilename(fileName);
-
-            // content disposition is not set only for archive resources when archived browsing is enabled
-            if (contentBrowsingDisabled) {
-                ((ArtifactoryResponseBase) response).setContentDispositionAttachment(fileName);
-            }
-        }
-    }
-
-    private void noCache(ArtifactoryResponse response) {
-        response.setHeader("Cache-Control", "no-store");
-    }
-
-    private boolean isNotZipResource(RepoResource res) {
-        return !(res instanceof ZipEntryResource);
-    }
-
-    private boolean contentBrowsingDisabled(RepoResource res) {
-        boolean result = true;
-        RepositoryService repositoryService = ContextHelper.get().getRepositoryService();
-        String repoKey = res.getResponseRepoPath().getRepoKey();
-        RepoDescriptor repoDescriptor = repositoryService.repoDescriptorByKey(repoKey);
-        if (repoDescriptor != null) {
-            if (repoDescriptor instanceof RealRepoDescriptor) {
-                result = !((RealRepoDescriptor) repoDescriptor).isArchiveBrowsingEnabled();
-            }
-        }
-
-        // We return true by default if we couldn't get the flag from the descriptor
-        return result;
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/request/aop/RequestAdvice.java b/backend/core/src/main/java/org/artifactory/request/aop/RequestAdvice.java
deleted file mode 100644
index 3c8078e..0000000
--- a/backend/core/src/main/java/org/artifactory/request/aop/RequestAdvice.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.request.aop;
-
-import org.aopalliance.intercept.MethodInterceptor;
-import org.aopalliance.intercept.MethodInvocation;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.repo.AggregatingRequestListener;
-import org.artifactory.api.repo.DirectRequestListener;
-import org.artifactory.api.repo.Request;
-import org.artifactory.api.repo.RequestListener;
-import org.artifactory.security.AuthenticationHelper;
-import org.artifactory.spring.InternalContextHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.core.Authentication;
-
-import java.util.Collection;
-import java.util.Map;
-
-/**
- * Request advice method interceptor
- *
- * @author Noam Tenne
- */
-public class RequestAdvice implements MethodInterceptor {
-
-    private static final Logger log = LoggerFactory.getLogger(RequestAdvice.class);
-
-    public RequestAdvice() {
-        log.debug("Creating request advice interceptor");
-    }
-
-    @Override
-    public Object invoke(MethodInvocation invocation) throws Throwable {
-        Request annotation = invocation.getMethod().getAnnotation(Request.class);
-        boolean aggregate = annotation.aggregateEventsByTimeWindow();
-
-        Map<String, ? extends RequestListener> listenerMap = getListenerMap(aggregate);
-
-        String remoteAddress = getRemoteAddress();
-        boolean performRequestAdvice = shouldPerformRequestAdvice(aggregate, remoteAddress);
-        Collection<? extends RequestListener> listeners = listenerMap.values();
-
-        onBeginRequest(remoteAddress, performRequestAdvice, listeners);
-
-        Object result;
-        try {
-            result = invocation.proceed();
-        } catch (Throwable t) {
-            onException(remoteAddress, performRequestAdvice, listeners);
-            throw t;
-        }
-
-        onEnd(remoteAddress, performRequestAdvice, listeners);
-        return result;
-    }
-
-    /**
-     * Returns the listener map relevant to the request annotation params
-     *
-     * @param aggregate Should current request annotation aggregate events
-     * @return Listener map
-     */
-    private Map<String, ? extends RequestListener> getListenerMap(boolean aggregate) {
-        //If aggregation of events is required, then search for the aggregating implementation
-        if (aggregate) {
-            return InternalContextHelper.get().beansForType(AggregatingRequestListener.class);
-        }
-        return InternalContextHelper.get().beansForType(DirectRequestListener.class);
-    }
-
-    /**
-     * Returns the remote address of the request
-     *
-     * @return Remote address
-     */
-    private String getRemoteAddress() {
-        Authentication authentication = AuthenticationHelper.getAuthentication();
-        return (authentication != null) ? AuthenticationHelper.getRemoteAddress(authentication) : null;
-    }
-
-    /**
-     * Indicates if the request advice (before, on-exception and after) should be performed
-     *
-     * @param aggregate     Indicates if aggregation of events is required
-     * @param remoteAddress The remote address of the request
-     * @return True if request advice should be performed. False if not
-     */
-    private boolean shouldPerformRequestAdvice(boolean aggregate, String remoteAddress) {
-        /**
-         * If aggregation is required, but the remote address is invalid, do not perform advice. The address is required
-         * For the aggregation
-         */
-        if (aggregate && StringUtils.isBlank(remoteAddress)) {
-            log.debug("Skipping request advice. Events should be aggregated, but no remote address could be resolved.");
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     * Performs on begin request advice
-     *
-     * @param remoteAddress        The remote address of the request
-     * @param performRequestAdvice Indicates if request advice should be performed
-     * @param listeners            Listeners to invoke
-     */
-    private void onBeginRequest(String remoteAddress, boolean performRequestAdvice,
-            Collection<? extends RequestListener> listeners) {
-        //Invoke listeners only if advice should be performed
-        if (performRequestAdvice) {
-            for (RequestListener listener : listeners) {
-                listener.onBeginRequest(remoteAddress);
-            }
-        }
-    }
-
-    /**
-     * Performs on exception request advice
-     *
-     * @param remoteAddress        The remote address of the request
-     * @param performRequestAdvice Indicates if request advice should be performed
-     * @param listeners            Listeners to invoke
-     */
-    private void onException(String remoteAddress, boolean performRequestAdvice,
-            Collection<? extends RequestListener> listeners) {
-        //Invoke listeners only if advice should be performed
-        if (performRequestAdvice) {
-            for (RequestListener listener : listeners) {
-                listener.onException(remoteAddress);
-            }
-        }
-    }
-
-    /**
-     * Performs on end request advice
-     *
-     * @param remoteAddress        The remote address of the request
-     * @param performRequestAdvice Indicates if request advice should be performed
-     * @param listeners            Listeners to invoke
-     */
-    private void onEnd(String remoteAddress, boolean performRequestAdvice,
-            Collection<? extends RequestListener> listeners) {
-        //Invoke listeners only if advice should be performed
-        if (performRequestAdvice) {
-            for (RequestListener listener : listeners) {
-                listener.onEndRequest(remoteAddress);
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/request/aop/RequestAdvisor.java b/backend/core/src/main/java/org/artifactory/request/aop/RequestAdvisor.java
deleted file mode 100644
index 983268c..0000000
--- a/backend/core/src/main/java/org/artifactory/request/aop/RequestAdvisor.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.request.aop;
-
-import org.artifactory.api.repo.Request;
-import org.springframework.aop.support.DefaultPointcutAdvisor;
-import org.springframework.aop.support.annotation.AnnotationMatchingPointcut;
-
-/**
- * Request advisor
- *
- * @author Noam Tenne
- */
-public class RequestAdvisor extends DefaultPointcutAdvisor {
-
-    /**
-     * Default constructor
-     */
-    public RequestAdvisor() {
-        super(new AnnotationMatchingPointcut(null, Request.class), new RequestAdvice());
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/request/range/IfRangeSelector.java b/backend/core/src/main/java/org/artifactory/request/range/IfRangeSelector.java
deleted file mode 100644
index 70a5da5..0000000
--- a/backend/core/src/main/java/org/artifactory/request/range/IfRangeSelector.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package org.artifactory.request.range;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.client.utils.DateUtils;
-
-import java.util.Date;
-
-/**
- * The class isolates the HTTP If-Range behaviour
- *
- * @author Gidi Shabat
- */
-public class IfRangeSelector {
-
-    private String ifRange;
-    private String actualSha1;
-    private String headerEtag;
-    private long actualLastModified;
-    private long headerEtagLastModified;
-
-    /**
-     * this Constructor is being used in case that the If-Range header does not exist
-     */
-    public IfRangeSelector() {
-    }
-
-    /**
-     * this Constructor is being used in case that the If-Range header contains ETag
-     */
-    public IfRangeSelector(String headerEtag, String actualSha1) {
-        this.ifRange = headerEtag;
-        this.headerEtag = headerEtag;
-        this.actualSha1 = actualSha1;
-    }
-
-    /**
-     * this Constructor is being used in case that the If-Range header contains modification date
-     */
-    public IfRangeSelector(String ifRange, long headerEtagLastModified, long actualLastModified) {
-        this.ifRange = ifRange;
-        this.headerEtagLastModified = headerEtagLastModified;
-        this.actualLastModified = actualLastModified;
-    }
-
-    /**
-     * Creates  IfRangeHandler instance according to the If-Range header existence and value
-     */
-    public static IfRangeSelector constructIfRange(String ifRange, long lastModified, String sha1) {
-        if (StringUtils.isBlank(ifRange)) {
-            return new IfRangeSelector();
-        }
-        Date date = DateUtils.parseDate(ifRange);
-        if (date == null) {
-            return new IfRangeSelector(ifRange, sha1);
-        } else {
-            return new IfRangeSelector(ifRange, date.getTime(), lastModified);
-        }
-    }
-
-    /**
-     * Returns true if the header If-Range exist and the file has been changes according to one of the following
-     * 1. In case that the If-Range contains date then: A file has been changed if its modification date is after the modification date in the If-Range header
-     * 2. In case that the If-Range contains ETag then: A file has been changed if the ETAg does not start with the sha1.
-     */
-    public boolean isIfChange() {
-        if (StringUtils.isBlank(ifRange)) {
-            return false;
-        }
-        if (headerEtag != null) {
-            return !headerEtag.startsWith(actualSha1);
-        } else {
-            // Compare second since HTTP doesn't support milli seconds
-            return headerEtagLastModified / 1000 < actualLastModified / 1000;
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/request/range/Range.java b/backend/core/src/main/java/org/artifactory/request/range/Range.java
deleted file mode 100644
index cffaff3..0000000
--- a/backend/core/src/main/java/org/artifactory/request/range/Range.java
+++ /dev/null
@@ -1,204 +0,0 @@
-package org.artifactory.request.range;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import static org.artifactory.request.range.ResponseWithRangeSupportHelper.HEADER_CONTENT_TYPE;
-import static org.artifactory.request.range.ResponseWithRangeSupportHelper.MULTIPART_BYTERANGES_BOUNDRY_SEP;
-
-/**
- * The class represent single http range
- *
- * @author Gidi Shabat
- */
-public class Range implements Comparable<Range> {
-    public static final Logger log = LoggerFactory.getLogger(Range.class);
-    private long start;
-    private long end;
-    private long entityLength;
-    private String contentType;
-    private String contentRange;
-
-    Range(String contentType, long start, long end, long entityLength) {
-        this.contentType = HEADER_CONTENT_TYPE + ": " + contentType;
-        this.start = start;
-        this.end = end;
-        this.entityLength = entityLength;
-    }
-
-    /**
-     * Factory method to construct a byte range from a range header value.
-     */
-    public static List<Range> constructRange(String rangesHeader, String contentType, long entityLength,
-            RangeAwareContext context, IfRangeSelector ifRangeSelector) {
-        ArrayList<Range> result = Lists.newArrayList();
-        if (ifRangeSelector.isIfChange()) {
-            return result;
-        }
-
-        if (StringUtils.isBlank(rangesHeader)) {
-            return result;
-        }
-        String[] rangesValues = StringUtils.split(rangesHeader, "=");
-        if (rangesValues.length != 2) {
-            return result;
-        }
-        // Transform the stringRanges into List<Ranges>
-        loadRanges(rangesHeader, contentType, entityLength, context, result, rangesValues[1]);
-        // Merge byte ranges if possible - IE handles this well, FireFox not so much
-        mergeRanges(result);
-        return result;
-    }
-
-    /**
-     * Validates and create ranges according to the Range header
-     */
-    private static void loadRanges(String rangesHeader, String contentType, long entityLength,
-            RangeAwareContext context,
-            ArrayList<Range> result, String rangesValues) {
-        String[] realRanges = StringUtils.split(rangesValues, ",");
-        for (String range : realRanges) {
-            range = range.trim();
-            if (StringUtils.isBlank(range)) {
-                log.warn("Not satisfiable range skipping range: '{}' for range header: '{}'", range, rangesHeader);
-                continue;
-            }
-            // strip total if present - it does not give us anything useful
-            if (range.indexOf('/') != -1) {
-                range = range.substring(0, range.indexOf('/'));
-            }
-            // find the separator
-            int separator = range.indexOf('-');
-            if (separator == -1) {
-                log.warn("Not satisfiable range skipping range: '{}' for range header: '{}'", range, rangesHeader);
-            }
-            try {
-                // split range and parse values
-                long start = 0L;
-                if (separator > 0) {
-                    start = Long.parseLong(range.substring(0, separator).trim());
-                }
-                long end = entityLength - 1;
-                if (separator != range.length() - 1) {
-                    end = Long.parseLong(range.substring(separator + 1).trim());
-                }
-                // Ignore invalid range
-                if(end<start){
-                    continue;
-                }
-                // return object to represent the byte-range
-                result.add(new Range(contentType, start, end, entityLength));
-            } catch (NumberFormatException err) {
-                log.warn("Not satisfiable range skipping range: '{}' for range header: '{}'", range, rangesHeader);
-            }
-        }
-        // If none of the ranges in the request's Range header are valid then return SC_REQUESTED_RANGE_NOT_SATISFIABLE
-        if (realRanges.length > 0 && result.size() == 0) {
-            log.warn("Returning not satisfiable range status since none of the ranges in '{}' is valid", rangesHeader);
-            //throw new HTTPException(HttpStatus.SC_REQUESTED_RANGE_NOT_SATISFIABLE);
-            context.setContentRange("bytes */" + entityLength);
-            context.setStatus(HttpStatus.SC_REQUESTED_RANGE_NOT_SATISFIABLE);
-        }
-    }
-
-    /**
-     * The class merges continues ranges
-     */
-    private static void mergeRanges(ArrayList<Range> result) {
-        if (result.size() > 1) {
-            Collections.sort(result);
-            for (int i = 0; i < result.size() - 1; i++) {
-                Range first = result.get(i);
-                Range second = result.get(i + 1);
-                if (first.getEnd() + 1 >= second.getStart()) {
-                    if (log.isDebugEnabled()) {
-                        log.debug("Merging byte range: " + first + " with " + second);
-                    }
-                    if (first.getEnd() < second.getEnd()) {
-                        // merge second range into first
-                        first.setEnd(second.getEnd());
-                    }
-                    // else we simply discard the second range - it is contained within the first
-
-                    // delete second range
-                    result.remove(i + 1);
-                    // reset loop index
-                    i--;
-                }
-            }
-        }
-    }
-
-
-    /**
-     * Output the header bytes for a multi-part byte range header
-     */
-    public byte[] outputHeader(boolean firstTime) throws IOException {
-        StringBuilder buffer = new StringBuilder();
-        // output multi-part boundry separator
-        if (!firstTime) {
-            buffer.append("\r\n");
-        }
-        buffer.append(MULTIPART_BYTERANGES_BOUNDRY_SEP).append("\r\n");
-        buffer.append(this.contentType).append("\r\n");
-        buffer.append(getContentRange()).append("\r\n");
-        buffer.append("\r\n");
-        return buffer.toString().getBytes();
-    }
-
-    /**
-     * Return the length in bytes of the byte range content including the header bytes
-     */
-    public int getLength() {
-        // length in bytes of range plus it's header plus section marker and line feed bytes
-        return MULTIPART_BYTERANGES_BOUNDRY_SEP.length() + 2 +
-                this.contentType.length() + 2 +
-                getContentRange().length() + 4 +
-                (int) (this.end - this.start) + 2;
-    }
-
-    /**
-     * Return the Content-Range header string value for this byte range
-     */
-    private String getContentRange() {
-        if (this.contentRange == null) {
-            this.contentRange = "Content-Range: bytes " + Long.toString(this.start) + "-" +
-                    Long.toString(this.end) + "/" + Long.toString(this.entityLength);
-        }
-        return this.contentRange;
-    }
-
-    @Override
-    public String toString() {
-        return this.start + "-" + this.end;
-    }
-
-    @Override
-    public int compareTo(Range o) {
-        return this.start > o.start ? 1 : -1;
-    }
-
-    public long getStart() {
-        return start;
-    }
-
-    public long getEnd() {
-        return end;
-    }
-
-    public void setEnd(long end) {
-        this.end = end;
-    }
-
-    public long getEntityLength() {
-        return entityLength;
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/request/range/RangeAwareContext.java b/backend/core/src/main/java/org/artifactory/request/range/RangeAwareContext.java
deleted file mode 100644
index a078440..0000000
--- a/backend/core/src/main/java/org/artifactory/request/range/RangeAwareContext.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.artifactory.request.range;
-
-import java.io.InputStream;
-
-/**
- * Contain the data needed to decorate the HttpResponse in order to support HTTP ranges
- *
- * @author Gidi Shabat
- */
-public class RangeAwareContext {
-    private long contentLength;
-    private InputStream inputStream;
-    private int status = -1;
-    private String contentType;
-    private String etagExtension;
-    private String contentRange;
-
-    public long getContentLength() {
-        return contentLength;
-    }
-
-    public void setContentLength(long contentLength) {
-        this.contentLength = contentLength;
-    }
-
-    public InputStream getInputStream() {
-        return inputStream;
-    }
-
-    public void setInputStream(InputStream inputStream) {
-        this.inputStream = inputStream;
-    }
-
-    public int getStatus() {
-        return status;
-    }
-
-    public void setStatus(int status) {
-        this.status = status;
-    }
-
-    public String getContentType() {
-        return contentType;
-    }
-
-    public void setContentType(String contentType) {
-        this.contentType = contentType;
-    }
-
-    public String getContentRange() {
-        return contentRange;
-    }
-
-    public void setContentRange(String contentRange) {
-        this.contentRange = contentRange;
-    }
-
-    public String getEtagExtension() {
-        return etagExtension;
-    }
-
-    public void setEtagExtension(String etagExtension) {
-        this.etagExtension = etagExtension;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/request/range/ResponseWithRangeSupportHelper.java b/backend/core/src/main/java/org/artifactory/request/range/ResponseWithRangeSupportHelper.java
deleted file mode 100644
index 5aae379..0000000
--- a/backend/core/src/main/java/org/artifactory/request/range/ResponseWithRangeSupportHelper.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package org.artifactory.request.range;
-
-import org.artifactory.request.range.stream.MultiRangeInputStream;
-import org.artifactory.request.range.stream.SingleRangeInputStream;
-import org.artifactory.request.range.stream.SingleRangeSkipInputStream;
-import org.jfrog.storage.binstore.ifc.SkippableInputStream;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.List;
-
-import static javax.servlet.http.HttpServletResponse.SC_PARTIAL_CONTENT;
-import static org.artifactory.common.ConstantValues.httpRangeSupport;
-import static org.artifactory.request.range.IfRangeSelector.constructIfRange;
-import static org.artifactory.request.range.Range.constructRange;
-
-/**
- * The class creates context that contains the data needed to decorate the httpResponse in order to support HTTP ranges
- *
- * @author Gidi Shabat
- */
-public class ResponseWithRangeSupportHelper {
-    public static final String HEADER_CONTENT_TYPE = "Content-Type";
-    public static final String MULTIPART_BYTERANGES_BOUNDRY = "BCD64322345343217845286A";
-    public static final String MULTIPART_BYTERANGES_HEADER = "multipart/byteranges; boundary=" + MULTIPART_BYTERANGES_BOUNDRY;
-    public static final String MULTIPART_BYTERANGES_BOUNDRY_SEP = "--" + MULTIPART_BYTERANGES_BOUNDRY;
-    public static final String MULTIPART_BYTERANGES_BOUNDRY_END = MULTIPART_BYTERANGES_BOUNDRY_SEP + "--";
-    private static final Logger log = LoggerFactory.getLogger(ResponseWithRangeSupportHelper.class);
-
-    public static RangeAwareContext createRangeAwareContext(InputStream in, long length, String rangesString,
-            String ifRange, String mimeType, long lastModified, String sha1) throws IOException {
-        RangeAwareContext context = new RangeAwareContext();
-        // resolve the If-Range behaviour from the If-Range header
-        IfRangeSelector ifRangeSelector = constructIfRange(ifRange, lastModified, sha1);
-        // Resolve the ranges from the ranges header
-        List<Range> ranges = constructRange(rangesString, mimeType, length, context, ifRangeSelector);
-        // Do not continue if error occurred
-        if (context.getStatus() > 0) {
-            return context;
-        }
-        // Fill the result context according to the ranges.
-        if (!httpRangeSupport.getBoolean() || ranges.size() == 0) {
-            handleSimpleResponse(in, length, mimeType, context);
-        } else if (ranges.size() == 1) {
-            handleSingleRangeResponse(in, ranges, mimeType, context);
-        } else {
-            handleMultiRangeResponse(in, ranges, context);
-        }
-        return context;
-    }
-
-    private static void handleSimpleResponse(InputStream in, long length, String mimeType, RangeAwareContext context)
-            throws IOException {
-        log.debug("Preparing response for simple response (None range response)");
-        // Update headers, content type, content length and logs
-        context.setContentLength(length);
-        context.setContentType(mimeType);
-        context.setInputStream(in);
-        context.setEtagExtension("");
-    }
-
-    private static void handleSingleRangeResponse(InputStream in, List<Range> ranges, String mimeType,
-            RangeAwareContext context) throws IOException {
-        log.debug("Preparing response for single range response");
-        // Resolve range
-        Range range = ranges.get(0);
-        String totalLength = range.getEntityLength() >= 0 ? Long.toString(range.getEntityLength()) : "*";
-        String contentRange = "bytes " + range.getStart() + "-" + range.getEnd() + "/" + totalLength;
-        context.setStatus(SC_PARTIAL_CONTENT);
-        context.setContentType(mimeType);
-        context.setContentRange(contentRange);
-        context.setContentLength((range.getEnd() - range.getStart()) + 1L);
-        if(isSkippable(in)){
-            context.setInputStream(new SingleRangeSkipInputStream(range, in));
-        }else {
-            context.setInputStream(new SingleRangeInputStream(range, in));
-        }
-        context.setEtagExtension("-" + range.getStart() + "-" + range.getEnd());
-    }
-
-    private static boolean isSkippable(InputStream inputStream) {
-        if(inputStream instanceof SkippableInputStream){
-            return ((SkippableInputStream)inputStream).isSkippable();
-        }
-        return true;
-    }
-
-    private static void handleMultiRangeResponse(InputStream in, List<Range> ranges, RangeAwareContext context)
-            throws IOException {
-        log.debug("Preparing response for multi range response");
-        // calculate response content length
-        long length = MULTIPART_BYTERANGES_BOUNDRY_END.length() + 2;
-        for (Range r : ranges) {
-            length += r.getLength();
-        }
-        context.setStatus(SC_PARTIAL_CONTENT);
-        context.setContentType(MULTIPART_BYTERANGES_HEADER);
-        context.setContentLength(length);
-        context.setInputStream(new MultiRangeInputStream(ranges, in));
-        StringBuilder builder = new StringBuilder();
-        for (Range range : ranges) {
-            builder.append("-").append(range.getStart()).append("-").append(range.getEnd());
-        }
-        context.setEtagExtension(builder.toString());
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/request/range/stream/MultiRangeInputStream.java b/backend/core/src/main/java/org/artifactory/request/range/stream/MultiRangeInputStream.java
deleted file mode 100644
index fb7c561..0000000
--- a/backend/core/src/main/java/org/artifactory/request/range/stream/MultiRangeInputStream.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package org.artifactory.request.range.stream;
-
-import org.apache.commons.io.IOUtils;
-import org.artifactory.request.range.Range;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.List;
-
-import static org.artifactory.request.range.ResponseWithRangeSupportHelper.MULTIPART_BYTERANGES_BOUNDRY_END;
-
-/**
- * Returns multi sub-streams by wrapping the stream and skipping irrelevant bytes
- *
- * @author Gidi Shabat
- */
-public class MultiRangeInputStream extends InputStream {
-    public static final Logger log = LoggerFactory.getLogger(MultiRangeInputStream.class);
-    private final int numberOfRanges;
-    private List<Range> ranges;
-    private InputStream inputStream;
-    private long streamPointer = 0;
-    private byte[] buffer;
-    private int bufferPointer = 0;
-    private Range currentRange;
-    private boolean end;
-
-    public MultiRangeInputStream(List<Range> ranges, InputStream inputStream) {
-        this.ranges = ranges;
-        numberOfRanges = ranges.size();
-        if (ranges.size() < 2) {
-            throw new RuntimeException(
-                    "unsupported number of ranges: " + ranges.size() + ". The minimum number of ranges is " + 2 + ".");
-        }
-        this.inputStream = inputStream;
-        // calculate response content length
-    }
-
-    @Override
-    public int read() throws IOException {
-        Range range = tryToPromoteRange();
-        if (buffer != null) {
-            byte result = buffer[bufferPointer];
-            bufferPointer++;
-            if (bufferPointer >= buffer.length) {
-                buffer = null;
-            }
-            return result;
-        }
-        if (range == null) {
-            // Make sure to read the file until EOF
-            int result=inputStream.read();
-            while (result>=0){
-                result=inputStream.read();
-            }
-            return -1;
-        }
-        streamPointer++;
-        return inputStream.read();
-    }
-
-    private Range tryToPromoteRange() throws IOException {
-        // Need to skip bytes in stream
-        if (currentRange != null && streamPointer < currentRange.getStart()) {
-            while (currentRange != null && streamPointer < currentRange.getStart()) {
-                inputStream.read();
-                streamPointer++;
-            }
-            return currentRange;
-        }
-        // Need to streaming range
-        if (currentRange != null && streamPointer >= currentRange.getStart() && streamPointer <= currentRange.getEnd()) {
-            return currentRange;
-        }
-        // Need to promote range
-        if (ranges.size() > 0 && (currentRange == null || streamPointer > currentRange.getEnd())) {
-            currentRange = ranges.remove(0);
-            buffer = currentRange.outputHeader(ranges.size() + 1 == numberOfRanges);
-            bufferPointer = 0;
-            return currentRange;
-        }
-        // Need to promote stream
-        if (!end) {
-            buffer = (MULTIPART_BYTERANGES_BOUNDRY_END + "\r\n").getBytes();
-            bufferPointer = 0;
-            end = true;
-            currentRange = null;
-            return null;
-        }
-        return null;
-    }
-
-    @Override
-    public void close() {
-        IOUtils.closeQuietly(inputStream);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/request/range/stream/SingleRangeInputStream.java b/backend/core/src/main/java/org/artifactory/request/range/stream/SingleRangeInputStream.java
deleted file mode 100644
index 7991de0..0000000
--- a/backend/core/src/main/java/org/artifactory/request/range/stream/SingleRangeInputStream.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package org.artifactory.request.range.stream;
-
-import org.apache.commons.io.IOUtils;
-import org.artifactory.request.range.Range;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * @author Gidi Shabat
- */
-public class SingleRangeInputStream extends InputStream {
-    public static final Logger log = LoggerFactory.getLogger(SingleRangeSkipInputStream.class);
-    public static final int BUFFER_SIZE = 1024 * 8;
-    private long left;
-    private InputStream inputStream;
-
-    public SingleRangeInputStream(Range range, InputStream inputStream) throws IOException {
-        // Skip unwanted bytes using a buffer to maximise use of the native buffer
-        long toSkip = range.getStart();
-        if (toSkip > 0L) {
-            long currentPos = 0;
-            byte[] bytes = new byte[(int) Math.min(BUFFER_SIZE, toSkip)];
-            while (currentPos < toSkip) {
-                int len = (int) Math.min((long) bytes.length, toSkip - currentPos);
-                int read = inputStream.read(bytes, 0, len);
-                if (read == -1) {
-                    IOException ex = new IOException("Trying to manually skip to " + toSkip + " and got end of file");
-                    log.error(ex.getMessage(), ex);
-                    throw ex;
-                }
-                currentPos += read;
-            }
-        }
-
-        // Limit the stream
-        this.left = range.getEnd() - toSkip + 1;
-        this.inputStream = inputStream;
-    }
-
-    @Override
-    public int read() throws IOException {
-
-        if (left == 0) {
-            // Make sure to read the file until EOF and return -1 EOF for end of range
-            int result = inputStream.read();
-            while (result >= 0) {
-                result = inputStream.read();
-            }
-            return result;
-        }
-        int result = inputStream.read();
-        if (result != -1) {
-            --left;
-        }
-        return result;
-    }
-
-    @Override
-    public void close() {
-        IOUtils.closeQuietly(inputStream);
-    }
-
-}
diff --git a/backend/core/src/main/java/org/artifactory/request/range/stream/SingleRangeSkipInputStream.java b/backend/core/src/main/java/org/artifactory/request/range/stream/SingleRangeSkipInputStream.java
deleted file mode 100644
index c0ff30d..0000000
--- a/backend/core/src/main/java/org/artifactory/request/range/stream/SingleRangeSkipInputStream.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.artifactory.request.range.stream;
-
-import com.google.common.io.ByteStreams;
-import org.artifactory.request.range.Range;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Returns single sub-stream by wrapping the stream and skipping irrelevant bytes
- *
- * @author Gidi Shabat
- */
-public class SingleRangeSkipInputStream extends FilterInputStream {
-    public static final Logger log = LoggerFactory.getLogger(SingleRangeSkipInputStream.class);
-
-    private static InputStream wrapInputStream(Range range, InputStream inputStream) throws IOException {
-        // Skip irrelevant bytes
-        ByteStreams.skipFully(inputStream, range.getStart());
-        // Limit the stream
-        return ByteStreams.limit(inputStream, range.getEnd() - range.getStart() + 1);
-    }
-
-    public SingleRangeSkipInputStream(Range range, InputStream inputStream) throws IOException {
-        super(wrapInputStream(range, inputStream));
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/resource/ChecksumResource.java b/backend/core/src/main/java/org/artifactory/resource/ChecksumResource.java
deleted file mode 100644
index 58bcd73..0000000
--- a/backend/core/src/main/java/org/artifactory/resource/ChecksumResource.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.resource;
-
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.mime.MimeType;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-
-/**
- * A checksum resource is used as a response for checksum request and it wraps the actual file resource for which the
- * checksum is requested. Currently it is built only for existing checksum (meaning isFound is always true).
- *
- * @author Yossi Shaul
- */
-public class ChecksumResource extends ResolvedResource {
-    private final ChecksumType type;
-
-    public ChecksumResource(RepoResource wrappedResource, ChecksumType type, String checksum) {
-        super(wrappedResource, checksum, false);
-        this.type = type;
-    }
-
-    @Override
-    public RepoPath getRepoPath() {
-        RepoPath fileRepoPath = super.getRepoPath();
-        return InternalRepoPathFactory.create(fileRepoPath.getRepoKey(), fileRepoPath.getPath() + type.ext());
-    }
-
-    @Override
-    public RepoPath getResponseRepoPath() {
-        RepoPath repoPath = super.getResponseRepoPath();
-        // super might already call this class getRepoPath, so fix the path only if required 
-        if (!repoPath.getPath().endsWith(type.ext())) {
-            repoPath = InternalRepoPathFactory.create(repoPath.getRepoKey(), repoPath.getPath() + type.ext());
-        }
-        return repoPath;
-    }
-
-    @Override
-    public long getSize() {
-        return getContent() != null ? getContent().length() : type.length();
-    }
-
-    @Override
-    public String getMimeType() {
-        return MimeType.checksum;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/resource/ExpiredRepoResource.java b/backend/core/src/main/java/org/artifactory/resource/ExpiredRepoResource.java
deleted file mode 100644
index 7992a93..0000000
--- a/backend/core/src/main/java/org/artifactory/resource/ExpiredRepoResource.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.resource;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.repo.RepoPath;
-
-public class ExpiredRepoResource implements RepoResource, UnfoundRepoResourceReason {
-
-    private RepoResource wrappedResource;
-
-    public ExpiredRepoResource(RepoResource wrappedResource) {
-        this.wrappedResource = wrappedResource;
-    }
-
-    @Override
-    public int getStatusCode() {
-        return HttpStatus.SC_NOT_FOUND;
-    }
-
-    @Override
-    public String getDetail() {
-        return "Resource has expired";
-    }
-
-    @Override
-    public RepoPath getRepoPath() {
-        return wrappedResource.getRepoPath();
-    }
-
-    @Override
-    public RepoPath getResponseRepoPath() {
-        return wrappedResource.getResponseRepoPath();
-    }
-
-    @Override
-    public void setResponseRepoPath(RepoPath responsePath) {
-        wrappedResource.setResponseRepoPath(responsePath);
-    }
-
-    @Override
-    public RepoResourceInfo getInfo() {
-        return wrappedResource.getInfo();
-    }
-
-    @Override
-    public long getSize() {
-        return wrappedResource.getSize();
-    }
-
-    @Override
-    public long getCacheAge() {
-        return wrappedResource.getCacheAge();
-    }
-
-    @Override
-    public long getLastModified() {
-        return wrappedResource.getLastModified();
-    }
-
-    @Override
-    public String getEtag() {
-        return wrappedResource.getEtag();
-    }
-
-    @Override
-    public String getMimeType() {
-        return wrappedResource.getMimeType();
-    }
-
-    @Override
-    public boolean isFound() {
-        return false;
-    }
-
-    @Override
-    public boolean isExactQueryMatch() {
-        return wrappedResource.isExactQueryMatch();
-    }
-
-    @Override
-    public boolean isExpired() {
-        return true;
-    }
-
-    @Override
-    public boolean isMetadata() {
-        return wrappedResource.isMetadata();
-    }
-
-    @Override
-    public boolean isExpirable() {
-        return true;
-    }
-
-    @Override
-    public void expirable() {
-    }
-
-    @Override
-    public String toString() {
-        return wrappedResource.getRepoPath().toString();
-    }
-
-    @Override
-    public Reason getReason() {
-        return Reason.EXPIRED;
-    }
-
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/resource/FileResource.java b/backend/core/src/main/java/org/artifactory/resource/FileResource.java
deleted file mode 100644
index 10a8ecd..0000000
--- a/backend/core/src/main/java/org/artifactory/resource/FileResource.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.resource;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.MutableFileInfo;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.mime.MimeType;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author Yoav Landman
- */
-public class FileResource implements RepoResource {
-
-    private final MutableFileInfo info;
-    /**
-     * Response repo path represents the exact repo path the resource came from which might be different from the
-     * request repo path. An example is when file is requested from remote repo and served from the remote cache or
-     * request from virtual and the response is coming from local/cache.
-     */
-    private RepoPath responseRepoPath;
-    private boolean exactQueryMatch;
-    private String mimeType;
-    private String etag = "";
-    private boolean expirable;
-
-    public FileResource(FileInfo fileInfo) {
-        this(fileInfo, true);
-    }
-
-    public FileResource(FileInfo fileInfo, boolean exactQueryMatch) {
-        // create mutable copy of the file info. this will guarantee that changes done to the resource file info
-        // doesn't change the original (possibly immutable) file info
-        this.info = InfoFactoryHolder.get().copyFileInfo(fileInfo);
-        this.exactQueryMatch = exactQueryMatch;
-    }
-
-    @Override
-    public RepoPath getRepoPath() {
-        return info.getRepoPath();
-    }
-
-    /**
-     * @see FileResource#responseRepoPath
-     */
-    @Override
-    public RepoPath getResponseRepoPath() {
-        return responseRepoPath != null ? responseRepoPath : getRepoPath();
-    }
-
-    /**
-     * @see FileResource#responseRepoPath
-     */
-    @Override
-    public void setResponseRepoPath(RepoPath responsePath) {
-        this.responseRepoPath = responsePath;
-    }
-
-    @Override
-    public MutableFileInfo getInfo() {
-        return info;
-    }
-
-    @Override
-    public boolean isFound() {
-        return true;
-    }
-
-    @Override
-    public boolean isExactQueryMatch() {
-        return exactQueryMatch;
-    }
-
-    @Override
-    public boolean isExpired() {
-        return false;
-    }
-
-    @Override
-    public boolean isMetadata() {
-        return false;
-    }
-
-    @Override
-    public long getSize() {
-        return info.getSize();
-    }
-
-    @Override
-    public long getLastModified() {
-        return info.getLastModified();
-    }
-
-    @Override
-    public String getEtag() {
-        return this.etag;
-    }
-
-    public void setETag(String etag) {
-        this.etag = etag;
-    }
-
-    @Override
-    public String getMimeType() {
-        if (StringUtils.isNotBlank(mimeType)) {
-            return mimeType;
-        } else {
-            MimeType contentType = NamingUtils.getMimeType(info.getRelPath());
-            return contentType.getType();
-        }
-    }
-
-    /**
-     * Set custom mime type for this resource. If not set the mime types file is consulted.
-     *
-     * @param mimeType Custom mime type to set on this resource
-     */
-    public void setMimeType(String mimeType) {
-        this.mimeType = mimeType;
-    }
-
-    @Override
-    public long getCacheAge() {
-        long lastUpdated = info.getLastUpdated();
-        if (lastUpdated <= 0) {
-            return -1;
-        }
-        return System.currentTimeMillis() - lastUpdated;
-    }
-
-    @Override
-    public boolean isExpirable() {
-        return expirable;
-    }
-
-    @Override
-    public void expirable() {
-        expirable = true;
-    }
-
-    @Override
-    public String toString() {
-        return info.getRepoPath().toString();
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/resource/MetadataResource.java b/backend/core/src/main/java/org/artifactory/resource/MetadataResource.java
deleted file mode 100644
index 7df19d6..0000000
--- a/backend/core/src/main/java/org/artifactory/resource/MetadataResource.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.resource;
-
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.md.MetadataInfo;
-import org.artifactory.mime.MimeType;
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author Yoav Landman
- */
-public class MetadataResource implements RepoResource {
-
-    private final MetadataInfo info;
-    private RepoPath responsePath;
-    private boolean expirable = false;
-
-    public MetadataResource(MetadataInfo info) {
-        this.info = info;
-    }
-
-    public MetadataResource(RepoPath repoPath) {
-        this.info = InfoFactoryHolder.get().createMetadata(repoPath);
-    }
-
-    @Override
-    public RepoPath getRepoPath() {
-        return info.getRepoPath();
-    }
-
-    @Override
-    public RepoPath getResponseRepoPath() {
-        return responsePath != null ? responsePath : getRepoPath();
-    }
-
-    @Override
-    public void setResponseRepoPath(RepoPath responsePath) {
-        this.responsePath = responsePath;
-    }
-
-    @Override
-    public MetadataInfo getInfo() {
-        return info;
-    }
-
-    @Override
-    public boolean isFound() {
-        return true;
-    }
-
-    @Override
-    public boolean isExactQueryMatch() {
-        return true;
-    }
-
-    @Override
-    public boolean isExpired() {
-        return false;
-    }
-
-    @Override
-    public boolean isMetadata() {
-        return true;
-    }
-
-    @Override
-    public long getSize() {
-        return info.getSize();
-    }
-
-    @Override
-    public long getLastModified() {
-        return info.getLastModified();
-    }
-
-    @Override
-    public String getEtag() {
-        // TODO: [by sy] impl?
-        return "";
-    }
-
-    @Override
-    public String getMimeType() {
-        return MimeType.applicationXml;
-    }
-
-    @Override
-    public long getCacheAge() {
-        long lastUpdated = info.getLastModified();
-        if (lastUpdated <= 0) {
-            return -1;
-        }
-        return System.currentTimeMillis() - lastUpdated;
-    }
-
-    @Override
-    public String toString() {
-        return info.getRepoPath().toString();
-    }
-
-    @Override
-    public boolean isExpirable() {
-        return expirable;
-    }
-
-    @Override
-    public void expirable() {
-        expirable = true;
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/resource/RemoteRepoResource.java b/backend/core/src/main/java/org/artifactory/resource/RemoteRepoResource.java
deleted file mode 100644
index b7341d4..0000000
--- a/backend/core/src/main/java/org/artifactory/resource/RemoteRepoResource.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.resource;
-
-import org.apache.http.Header;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.RepoPath;
-
-import java.util.Set;
-
-/**
- * A barebone resource representing minimal file information retrieved from a remote source
- *
- * @author Noam Y. Tenne
- */
-public class RemoteRepoResource implements RepoResource {
-
-    private final MutableRepoResourceInfo info;
-    private RepoPath responseRepoPath;
-    private boolean expirable;
-    private Header[] allHeaders;
-    private String etag;
-
-    public RemoteRepoResource(RepoPath repoPath, long lastModified, String etag, long size, Set<ChecksumInfo> checksums,
-                              Header[] allHeaders) {
-        this.allHeaders = allHeaders;
-        this.etag = etag;
-        if (NamingUtils.isMetadata(repoPath.getPath())) {
-            //TODO: [by YS] remove if not used by the replication for properties
-            info = InfoFactoryHolder.get().createMetadata(repoPath);
-        } else {
-            info = InfoFactoryHolder.get().createFileInfo(repoPath);
-        }
-        info.setLastModified(lastModified);
-        info.setSize(size);
-        info.setChecksums(checksums);
-    }
-
-    @Override
-    public RepoPath getRepoPath() {
-        return info.getRepoPath();
-    }
-
-    @Override
-    public RepoPath getResponseRepoPath() {
-        return (responseRepoPath != null) ? responseRepoPath : getRepoPath();
-    }
-
-    @Override
-    public void setResponseRepoPath(RepoPath responsePath) {
-        responseRepoPath = responsePath;
-    }
-
-    @Override
-    public MutableRepoResourceInfo getInfo() {
-        return info;
-    }
-
-    @Override
-    public boolean isFound() {
-        return true;
-    }
-
-    @Override
-    public boolean isExactQueryMatch() {
-        return true;
-    }
-
-    @Override
-    public boolean isExpired() {
-        return false;
-    }
-
-    @Override
-    public boolean isMetadata() {
-        return NamingUtils.isMetadata(getRepoPath().getPath());
-    }
-
-    @Override
-    public long getSize() {
-        return info.getSize();
-    }
-
-    @Override
-    public long getCacheAge() {
-        return 0;
-    }
-
-    @Override
-    public long getLastModified() {
-        return info.getLastModified();
-    }
-
-    @Override
-    public String getEtag() {
-        return etag;
-    }
-
-    @Override
-    public String getMimeType() {
-        return NamingUtils.getMimeType(getRepoPath().getPath()).getType();
-    }
-
-    @Override
-    public boolean isExpirable() {
-        return expirable;
-    }
-
-    @Override
-    public void expirable() {
-        expirable = true;
-    }
-
-    public Header[] getAllHeaders() {
-        return allHeaders;
-    }
-
-    @Override
-    public String toString() {
-        return "RemoteRepoResource{" +
-                "info=" + info +
-                ", responseRepoPath=" + responseRepoPath +
-                '}';
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/resource/ResolvedResource.java b/backend/core/src/main/java/org/artifactory/resource/ResolvedResource.java
deleted file mode 100644
index ec70621..0000000
--- a/backend/core/src/main/java/org/artifactory/resource/ResolvedResource.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.resource;
-
-import org.artifactory.checksum.ChecksumsInfo;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.io.checksum.ChecksumUtil;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.util.StringInputStream;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-
-/**
- * A resource who's content is already resolved (no need to get it's handle for its content) that holds the
- * resource content in a string.
- *
- * @author Yossi Shaul
- */
-public class ResolvedResource implements RepoResource {
-
-    private final RepoResource wrappedResource;
-    private final RepoResourceInfo repoResourceInfo;
-    private final String content;
-    private boolean expirable;
-
-    public ResolvedResource(RepoResource wrappedResource, String content) {
-        this(wrappedResource, content, true);
-    }
-
-    public ResolvedResource(RepoResource wrappedResource, String content, boolean overrideResourceInfoChecksums) {
-        this.wrappedResource = wrappedResource;
-        this.content = content;
-        this.repoResourceInfo = overrideChecksums(wrappedResource.getInfo(),
-                overrideResourceInfoChecksums ? content : null);
-    }
-
-    public String getContent() {
-        return content;
-    }
-
-    @Override
-    public RepoPath getRepoPath() {
-        return wrappedResource.getRepoPath();
-    }
-
-    @Override
-    public RepoPath getResponseRepoPath() {
-        return wrappedResource.getResponseRepoPath();
-    }
-
-    @Override
-    public void setResponseRepoPath(RepoPath responsePath) {
-        wrappedResource.setResponseRepoPath(responsePath);
-    }
-
-    @Override
-    public RepoResourceInfo getInfo() {
-        return repoResourceInfo;
-    }
-
-    @Override
-    public boolean isFound() {
-        return wrappedResource.isFound();
-    }
-
-    @Override
-    public boolean isExactQueryMatch() {
-        return wrappedResource.isExactQueryMatch();
-    }
-
-    @Override
-    public boolean isExpired() {
-        return wrappedResource.isExpired();
-    }
-
-    @Override
-    public boolean isMetadata() {
-        return wrappedResource.isMetadata();
-    }
-
-    @Override
-    public long getSize() {
-        return wrappedResource.getSize();
-    }
-
-    @Override
-    public long getCacheAge() {
-        return wrappedResource.getCacheAge();
-    }
-
-    @Override
-    public long getLastModified() {
-        return wrappedResource.getLastModified();
-    }
-
-    @Override
-    public String getEtag() {
-        return wrappedResource.getEtag();
-    }
-
-    @Override
-    public String getMimeType() {
-        return wrappedResource.getMimeType();
-    }
-
-    private static RepoResourceInfo overrideChecksums(RepoResourceInfo original, String content) {
-        if (original == null || content == null) {
-            return original;
-        }
-
-        try {
-            ByteArrayInputStream bais = new StringInputStream(content);
-            ChecksumsInfo checksumsInfo = ChecksumUtil.getChecksumsInfo(bais);
-            if (!original.getChecksumsInfo().isIdentical(checksumsInfo)) {
-                MutableRepoResourceInfo repoResourceCopy = InfoFactoryHolder.get()
-                        .copyRepoResource(original);
-                repoResourceCopy.setChecksums(checksumsInfo.getChecksums());
-                return repoResourceCopy;
-            } else {
-                return original;
-            }
-        } catch (IOException e) {
-            // rare since the checksum is calculated on in memory byte array built from a string
-            throw new RuntimeException("Failed to calculate content checksum", e);
-        }
-    }
-
-    @Override
-    public boolean isExpirable() {
-        return expirable || wrappedResource.isExpirable();
-    }
-
-    @Override
-    public void expirable() {
-        expirable = true;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/resource/UnfoundRepoResource.java b/backend/core/src/main/java/org/artifactory/resource/UnfoundRepoResource.java
deleted file mode 100644
index dc0d566..0000000
--- a/backend/core/src/main/java/org/artifactory/resource/UnfoundRepoResource.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.resource;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.repo.RepoPath;
-
-public class UnfoundRepoResource implements RepoResource, UnfoundRepoResourceReason {
-
-    private final RepoPath repoPath;
-    private final String detail;
-    private final int statusCode;
-    private final Reason reason;
-
-    public UnfoundRepoResource(RepoPath repoPath, String detail, Reason reason) {
-        this(repoPath, reason, detail, HttpStatus.SC_NOT_FOUND);
-    }
-
-    public UnfoundRepoResource(RepoPath repoPath, String detail) {
-        this(repoPath, detail, HttpStatus.SC_NOT_FOUND);
-    }
-
-    public UnfoundRepoResource(RepoPath repoPath, String detail, int statusCode) {
-        this.repoPath = repoPath;
-        this.detail = detail;
-        this.statusCode = statusCode > 0 ? statusCode : HttpStatus.SC_NOT_FOUND;
-        this.reason =  Reason.UNDEFINED;
-    }
-
-    public UnfoundRepoResource(RepoPath repoPath, Reason reason, String detail, int statusCode) {
-        this.repoPath = repoPath;
-        this.detail = detail;
-        this.statusCode = statusCode > 0 ? statusCode : HttpStatus.SC_NOT_FOUND;
-        this.reason = reason;
-    }
-
-    @Override
-    public String getDetail() {
-        return detail;
-    }
-
-    @Override
-    public int getStatusCode() {
-        return statusCode;
-    }
-
-    @Override
-    public RepoPath getRepoPath() {
-        return repoPath;
-    }
-
-    @Override
-    public RepoPath getResponseRepoPath() {
-        return null;
-    }
-
-    @Override
-    public void setResponseRepoPath(RepoPath responsePath) {
-    }
-
-    @Override
-    public MutableRepoResourceInfo getInfo() {
-        return null;
-    }
-
-    @Override
-    public boolean isFound() {
-        return false;
-    }
-
-    @Override
-    public boolean isExactQueryMatch() {
-        return false;
-    }
-
-    @Override
-    public boolean isExpired() {
-        return false;
-    }
-
-    @Override
-    public boolean isMetadata() {
-        return false;
-    }
-
-    @Override
-    public long getSize() {
-        return 0;
-    }
-
-    @Override
-    public long getCacheAge() {
-        return 0;
-    }
-
-    @Override
-    public long getLastModified() {
-        return 0;
-    }
-
-    @Override
-    public String getEtag() {
-        return "";
-    }
-
-    @Override
-    public String getMimeType() {
-        return null;
-    }
-
-    @Override
-    public boolean isExpirable() {
-        return false;
-    }
-
-    @Override
-    public void expirable() {
-    }
-
-    @Override
-    public Reason getReason() {
-        return reason;
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/resource/UnfoundRepoResourceReason.java b/backend/core/src/main/java/org/artifactory/resource/UnfoundRepoResourceReason.java
deleted file mode 100644
index 77eba81..0000000
--- a/backend/core/src/main/java/org/artifactory/resource/UnfoundRepoResourceReason.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.resource;
-
-/**
- * Unfound {@link org.artifactory.fs.RepoResource} should implement this interface to provide a reason and status code
- * when a resource is not found.
- *
- * @author Yossi Shaul
- */
-public interface UnfoundRepoResourceReason {
-
-    /**
-     * @return HTTP status code to return to the client
-     */
-    int getStatusCode();
-
-    /**
-     * @return The a detail explaining why resource was not found
-     */
-    String getDetail();
-
-    /**
-     * @return The a reason for missing resource
-     */
-    Reason getReason();
-
-    /**
-     * Unfound reason
-     */
-    enum Reason {UNDEFINED, PROPERTY_MISMATCH, EXPIRED, REJECTED}
-}
diff --git a/backend/core/src/main/java/org/artifactory/resource/ZipEntryResource.java b/backend/core/src/main/java/org/artifactory/resource/ZipEntryResource.java
deleted file mode 100644
index 9ce580c..0000000
--- a/backend/core/src/main/java/org/artifactory/resource/ZipEntryResource.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.resource;
-
-import org.artifactory.fs.ZipEntryRepoResource;
-import org.artifactory.fs.ZipEntryResourceInfo;
-import org.artifactory.repo.RepoPath;
-
-/**
- * This downloadable resource represents a file inside a zip/jar resource.
- * <p/>
- *
- * @author Yossi Shaul
- */
-public class ZipEntryResource implements ZipEntryRepoResource {
-    private final ZipEntryResourceInfo info;
-    private RepoPath responsePath;
-    private boolean expirable;
-
-    public ZipEntryResource(ZipEntryResourceInfo zipInfo) {
-        this.info = zipInfo;
-    }
-
-    @Override
-    public String getEntryPath() {
-        return info.getEntryPath();
-    }
-
-    @Override
-    public RepoPath getRepoPath() {
-        return info.getRepoPath();
-    }
-
-    @Override
-    public RepoPath getResponseRepoPath() {
-        return responsePath != null ? responsePath : getRepoPath();
-    }
-
-    @Override
-    public void setResponseRepoPath(RepoPath responsePath) {
-        this.responsePath = responsePath;
-    }
-
-    @Override
-    public RepoResourceInfo getInfo() {
-        return info;
-    }
-
-    @Override
-    public boolean isFound() {
-        return true;
-    }
-
-    @Override
-    public boolean isExactQueryMatch() {
-        return true;
-    }
-
-    @Override
-    public boolean isExpired() {
-        return false;
-    }
-
-    @Override
-    public boolean isMetadata() {
-        return false;
-    }
-
-    @Override
-    public long getSize() {
-        return info.getSize();
-    }
-
-    @Override
-    public long getCacheAge() {
-        // The age is always the age of the zip file itself
-        long lastUpdated = info.getZipFileInfo().getLastUpdated();
-        if (lastUpdated <= 0) {
-            return -1;
-        }
-        return System.currentTimeMillis() - lastUpdated;
-    }
-
-    @Override
-    public long getLastModified() {
-        return info.getLastModified();
-    }
-
-    @Override
-    public String getEtag() {
-        // TODO: [by sy] impl?
-        return "";
-    }
-
-    @Override
-    public String getMimeType() {
-        return info.getMimeType();
-    }
-
-    @Override
-    public boolean isExpirable() {
-        return expirable;
-    }
-
-    @Override
-    public void expirable() {
-        expirable = true;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/schedule/ArtifactorySchedulerFactoryBean.java b/backend/core/src/main/java/org/artifactory/schedule/ArtifactorySchedulerFactoryBean.java
deleted file mode 100644
index e4be6e1..0000000
--- a/backend/core/src/main/java/org/artifactory/schedule/ArtifactorySchedulerFactoryBean.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-import org.springframework.scheduling.quartz.SchedulerFactoryBean;
-
-/**
- * @author Yoav Landman
- */
-public class ArtifactorySchedulerFactoryBean extends SchedulerFactoryBean {
-
-}
diff --git a/backend/core/src/main/java/org/artifactory/schedule/BaseTaskServiceDescriptorHandler.java b/backend/core/src/main/java/org/artifactory/schedule/BaseTaskServiceDescriptorHandler.java
deleted file mode 100644
index 1088be4..0000000
--- a/backend/core/src/main/java/org/artifactory/schedule/BaseTaskServiceDescriptorHandler.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-import com.google.common.collect.Sets;
-import org.artifactory.descriptor.TaskDescriptor;
-import org.artifactory.spring.InternalContextHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-import java.util.Set;
-
-/**
- * User: freds
- * Date: 7/10/11
- * Time: 5:54 PM
- */
-public abstract class BaseTaskServiceDescriptorHandler<T extends TaskDescriptor>
-        implements TaskServiceDescriptorHandler<T> {
-    private static final Logger log = LoggerFactory.getLogger(BaseTaskServiceDescriptorHandler.class);
-
-    public void unschedule() {
-        TaskService taskService = InternalContextHelper.get().getBean(TaskService.class);
-        log.info("Removing all job " + jobName() + " from task service handler.");
-        taskService.cancelTasks(getAllPredicate(), true);
-    }
-
-    public void reschedule() {
-        TaskService taskService = InternalContextHelper.get().getBean(TaskService.class);
-        List<T> newDescriptors = getNewDescriptors();
-        if (newDescriptors.isEmpty()) {
-            log.debug("No " + jobName() + " configured. " + jobName() + " is disabled.");
-            taskService.cancelTasks(getAllPredicate(), true);
-            return;
-        }
-        Set<T> oldTasksNotToCancel = Sets.newHashSet();
-        for (T newDesc : newDescriptors) {
-            T oldDescriptor = findOldFromNew(newDesc);
-            if (oldDescriptor != null && oldDescriptor.sameTaskDefinition(newDesc)) {
-                oldTasksNotToCancel.add(oldDescriptor);
-            } else {
-                if (oldDescriptor != null) {
-                    oldTasksNotToCancel.add(oldDescriptor);
-                    taskService.cancelTasks(getPredicate(oldDescriptor), true);
-                }
-                activate(newDesc, false);
-            }
-        }
-        List<T> oldDescriptors = getOldDescriptors();
-        if (!oldDescriptors.isEmpty()) {
-            for (T oldDesc : oldDescriptors) {
-                if (!oldTasksNotToCancel.contains(oldDesc)) {
-                    taskService.cancelTasks(getPredicate(oldDesc), true);
-                }
-            }
-        }
-    }
-
-}
diff --git a/backend/core/src/main/java/org/artifactory/schedule/TaskServiceDescriptorHandler.java b/backend/core/src/main/java/org/artifactory/schedule/TaskServiceDescriptorHandler.java
deleted file mode 100644
index 403687f..0000000
--- a/backend/core/src/main/java/org/artifactory/schedule/TaskServiceDescriptorHandler.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-import org.artifactory.descriptor.TaskDescriptor;
-
-import javax.annotation.Nonnull;
-import java.util.List;
-import java.util.function.Predicate;
-
-/**
- * User: freds
- * Date: 7/10/11
- * Time: 5:12 PM
- */
-public interface TaskServiceDescriptorHandler<T extends TaskDescriptor> {
-    String jobName();
-
-    List<T> getNewDescriptors();
-
-    List<T> getOldDescriptors();
-
-    Predicate<Task> getAllPredicate();
-
-    Predicate<Task> getPredicate(@Nonnull T descriptor);
-
-    void activate(@Nonnull T descriptor, boolean manual);
-
-    T findOldFromNew(@Nonnull T newDescriptor);
-}
diff --git a/backend/core/src/main/java/org/artifactory/schedule/TaskServiceImpl.java b/backend/core/src/main/java/org/artifactory/schedule/TaskServiceImpl.java
deleted file mode 100644
index f1cb705..0000000
--- a/backend/core/src/main/java/org/artifactory/schedule/TaskServiceImpl.java
+++ /dev/null
@@ -1,593 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-import com.google.common.collect.Lists;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.HaAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.config.InternalCentralConfigService;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.mbean.MBeanRegistrationService;
-import org.artifactory.schedule.mbean.ManagedExecutor;
-import org.artifactory.spring.ContextReadinessListener;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.state.model.ArtifactoryStateManager;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.version.CompoundVersionDetails;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.util.ClassUtils;
-
-import javax.annotation.Nonnull;
-import java.lang.reflect.Modifier;
-import java.util.Arrays;
-import java.util.EnumMap;
-import java.util.List;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.stream.Collectors;
-import java.util.function.Predicate;
-
-/**
- * @author yoavl
- */
- at Service
- at Reloadable(beanClass = TaskService.class,
-        initAfter = {DbService.class, InternalCentralConfigService.class, ArtifactoryStateManager.class})
-public class TaskServiceImpl implements TaskService, ContextReadinessListener {
-    private static final Logger log = LoggerFactory.getLogger(TaskServiceImpl.class);
-
-    @Autowired
-    private CachedThreadPoolTaskExecutor executor;
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    private ConcurrentMap<String, TaskBase> activeTasksByToken = new ConcurrentHashMap<>();
-    private ConcurrentMap<String, TaskBase> inactiveTasksByToken = new ConcurrentHashMap<>();
-
-    private AtomicBoolean openForScheduling = new AtomicBoolean();
-
-    @Override
-    public void init() {
-        java.util.concurrent.Executor concurrentExecutor = executor.getConcurrentExecutor();
-        if (concurrentExecutor instanceof ArtifactoryConcurrentExecutor) {
-            ContextHelper.get().beanForType(MBeanRegistrationService.class).
-                    register(new ManagedExecutor((ArtifactoryConcurrentExecutor) concurrentExecutor),
-                            "Executor Pools", "Task Service");
-        }
-    }
-
-    @Override
-    public void destroy() {
-        cancelAllTasks(true);
-        //Shut down the executor service to terminate any async operations not managed by the task service
-        executor.destroy();
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-    }
-
-    @Override
-    public void onContextCreated() {
-    }
-
-    @Override
-    public void onContextReady() {
-        openForScheduling.set(true);
-        for (String taskKey : inactiveTasksByToken.keySet()) {
-            //Check the readiness and task status again since it can change
-            if (openForScheduling.get()) {
-                TaskBase task = inactiveTasksByToken.remove(taskKey);
-                if (task != null) {
-                    activeTasksByToken.put(taskKey, task);
-                    task.schedule(false);
-                }
-            }
-        }
-    }
-
-    @Override
-    public void onContextUnready() {
-        openForScheduling.set(false);
-    }
-
-    @Override
-    public String startTask(TaskBase task, boolean waitForRunning) {
-        if (ContextHelper.get().isOffline()) {
-            log.error("Artifactory is in offline state, task are not allowed to run during offline state!");
-            return task.getToken();
-        }
-        String token = task.getToken();
-        ConcurrentMap<String, TaskBase> taskMap =
-                openForScheduling.get() ? activeTasksByToken : inactiveTasksByToken;
-        canBeStarted(task);
-        if (task.isSingleton()) {
-            //Reject duplicate singleton tasks - by type + check automatically during insert that we are not
-            //rescheduling the same task instance
-            if (hasTaskOfType(task.getType(), taskMap, false) || taskMap.putIfAbsent(token, task) != null) {
-                throw new IllegalStateException("Cannot start a singleton task more than once (" + task + ").");
-            }
-        } else if (taskMap.put(token, task) != null) {
-            log.warn("Overriding an active task with the same token {}.", task);
-        }
-        if (openForScheduling.get()) {
-            task.schedule(waitForRunning);
-        }
-        return task.getToken();
-    }
-
-    @Override
-    public String startTask(TaskBase task, boolean waitForRunning, boolean propagateToMaster) {
-        if (propagateToMaster &&
-                task.getAttribute(TaskBase.TASK_RUN_ONLY_ON_PRIMARY).equals(true) &&
-                !addonsManager.addonByType(HaAddon.class).isPrimary()) {
-            log.debug("Propagating task to master {}", task.getToken());
-            addonsManager.addonByType(HaAddon.class).propagateTaskToPrimary(task);
-            return task.getToken();
-        } else {
-            return startTask(task, waitForRunning);
-        }
-    }
-
-    @Override
-    public void cancelTask(String token, boolean wait) {
-        TaskBase task = activeTasksByToken.get(token);
-        if (task != null) {
-            task.cancel(wait);
-        } else {
-            log.warn("Could not find task {} to cancel.", token);
-        }
-        activeTasksByToken.remove(token);
-    }
-
-    @Override
-    public List<TaskBase> getActiveTasks(@Nonnull Predicate<Task> predicate) {
-        return activeTasksByToken.values().stream()
-                .filter(t -> predicate.test(t))
-                .collect(Collectors.toList());
-    }
-
-    @Override
-    public void cancelTasks(@Nonnull Predicate<Task> predicate, boolean wait) {
-        List<TaskBase> toCancel = getActiveTasks(predicate);
-        for (Task task : toCancel) {
-            //TODO: Don't wait on each job in a serial fashion
-            cancelTask(task.getToken(), wait);
-        }
-    }
-
-    @Override
-    public void cancelTasks(@Nonnull final Class<? extends TaskCallback> callbackType, boolean wait) {
-        cancelTasks(TaskUtils.createPredicateForType(callbackType), wait);
-    }
-
-    @Override
-    public void cancelAllTasks(boolean wait) {
-        cancelTasks(input -> true, wait);
-    }
-
-    @Override
-    public void stopTask(String token, boolean wait) {
-        TaskBase task = activeTasksByToken.get(token);
-        if (task != null) {
-            task.stop(wait);
-        } else {
-            log.warn("Could not find task {} to stop.", token);
-        }
-    }
-
-    public void canBeStarted(TaskBase task) {
-        Class<? extends TaskCallback> callbackType = task.getType();
-        JobCommand jobCommand = callbackType.getAnnotation(JobCommand.class);
-        if (jobCommand == null) {
-            throw new IllegalArgumentException(
-                    "Callback type " + callbackType.getName() + " does not have the " +
-                            JobCommand.class.getName() + " annotation!");
-        }
-        if (task.isManuallyActivated() && jobCommand.manualUser() == TaskUser.INVALID) {
-            throw new IllegalStateException("Cannot start task (" + task + ") manually!" +
-                    " Manual user not defined!");
-        }
-        boolean hasKey = jobCommand.keyAttributes().length != 0;
-        if (!jobCommand.singleton() && !hasKey) {
-            return;
-        }
-        EnumMap<StopStrategy, Predicate<Task>> predicatePerStrategy = getPredicatePerStrategy(callbackType,
-                task.getKeyValues());
-        // Should not count myself :)
-        Predicate<Task> notMyself = getNotMySelfPredicate();
-
-        // Only impossible are blocker here
-        Predicate<Task> impossibleFilter = predicatePerStrategy.get(StopStrategy.IMPOSSIBLE);
-        if (impossibleFilter != null) {
-            for (TaskBase activeTask : getActiveTasks(notMyself.and(impossibleFilter))) {
-                if (task.isManuallyActivated()) {
-                    if (activeTask.processActive()) {
-                        throw new IllegalStateException("Cannot start task (" + task + ") manually!" +
-                                " Task " + activeTask + " is active!");
-                    }
-                    if (activeTask.isManuallyActivated() && !activeTask.wasCompleted()) {
-                        throw new IllegalStateException("Cannot start task (" + task + ") manually!" +
-                                " Another manual task " + activeTask + " exists and is not completed!");
-                    }
-                } else {
-                    // Starting impossible filter of same type means singleton or key based singleton match
-                    if (activeTask.getType().equals(callbackType)) {
-                        if (activeTask.isManuallyActivated()) {
-                            if (!activeTask.wasCompleted()) {
-                                throw new IllegalStateException("Cannot schedule task (" + task + ")!" +
-                                        " Another manual task of same type and key " + activeTask + " exists and is not completed!");
-                            }
-                        } else {
-                            throw new IllegalStateException("Cannot schedule task (" + task + ")!" +
-                                    " Another task of same type and key " + activeTask + " is already scheduled!");
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    @Override
-    public void checkCanStartManualTask(Class<? extends TaskCallback> typeToRun, MutableStatusHolder statusHolder,
-            Object... keyValues) {
-        JobCommand jobCommand = typeToRun.getAnnotation(JobCommand.class);
-        if (ContextHelper.get().isOffline()) {
-            statusHolder.error("Artifactory is in offline state, task are not allowed to run during offline state!",
-                    log);
-            return;
-        }
-        if (jobCommand == null) {
-            statusHolder.error(
-                    "Task type " + typeToRun.getName() + " does not have the " +
-                            JobCommand.class.getName() + " annotation!", log);
-            return;
-        }
-        if (jobCommand.manualUser() == TaskUser.INVALID) {
-            statusHolder.error("Task type " + typeToRun.getName() + " is not defined to run manually!", log);
-            return;
-        }
-        String currentToken = TaskCallback.currentTaskToken();
-        if (currentToken != null) {
-            statusHolder.error(
-                    "Cannot check for manual run with status from inside a running task: " + currentToken, log);
-            return;
-        }
-
-        // Extract task filters for each stop strategy
-        EnumMap<StopStrategy, Predicate<Task>> predicatePerStrategy = getPredicatePerStrategy(typeToRun, keyValues);
-
-        // Check first for impossible to run
-        Predicate<Task> impossibleFilter = predicatePerStrategy.get(StopStrategy.IMPOSSIBLE);
-        if (impossibleFilter != null) {
-            for (TaskBase activeTask : getActiveTasks(impossibleFilter)) {
-                if (activeTask.processActive()) {
-                    statusHolder.error(
-                            "Task " + typeToRun.getName() + " cannot stop a mandatory related job " +
-                                    activeTask.getType().getName() + " while it's running!",
-                            log);
-                }
-                if (activeTask.getType().equals(
-                        typeToRun) && activeTask.isManuallyActivated() && !activeTask.wasCompleted()) {
-                    statusHolder.error(
-                            "Another manual task " + typeToRun.getName() + " is still active!",
-                            log);
-                }
-            }
-        }
-
-        // Then check for stopped
-        Predicate<Task> stopFilter = predicatePerStrategy.get(StopStrategy.STOP);
-        if (stopFilter != null) {
-            for (TaskBase activeTask : getActiveTasks(stopFilter)) {
-                if (activeTask.processActive()) {
-                    statusHolder.warn(
-                            "Task " + activeTask.getType().getName() + " will be stop by running " + typeToRun.getName() + " !",
-                            log);
-                }
-            }
-        }
-
-        // Then pause what's needed
-        Predicate<Task> pauseFilter = predicatePerStrategy.get(StopStrategy.PAUSE);
-        if (pauseFilter != null) {
-            for (TaskBase activeTask : getActiveTasks(pauseFilter)) {
-                if (activeTask.processActive()) {
-                    statusHolder.warn(
-                            "Task " + activeTask.getType().getName() + " will be paused by running " + typeToRun.getName() + " !",
-                            log);
-                }
-            }
-        }
-
-        if (!statusHolder.isError()) {
-            statusHolder.debug("Task " + typeToRun.getName() + " can run.", log);
-        }
-    }
-
-    @Override
-    public void stopRelatedTasks(Class<? extends TaskCallback> typeToRun, List<String> tokenStopped,
-            Object... keyValues) {
-        // Extract task filters for each stop strategy
-        EnumMap<StopStrategy, Predicate<Task>> predicatePerStrategy = getPredicatePerStrategy(typeToRun, keyValues);
-
-        // Each predicates should not count myself :)
-        Predicate<Task> notMyself = getNotMySelfPredicate();
-
-        // Stop early if impossible to run
-        Predicate<Task> impossibleFilter = predicatePerStrategy.get(StopStrategy.IMPOSSIBLE);
-        if (impossibleFilter != null) {
-            for (TaskBase activeTask : getActiveTasks(notMyself.and(impossibleFilter))) {
-                if (activeTask.processActive()) {
-                    throw new TaskImpossibleToStartException(
-                            "Job " + typeToRun.getName() + " cannot stop related job " + activeTask + " while it's running!");
-                }
-                // Immediate stop fails if task in running mode
-                activeTask.stop(false);
-                // Single execution task that are stopped don't need to be resumed because they'll die.
-                // So, don't add the token to the list for stopped single exec tasks
-                if (!activeTask.isSingleExecution()) {
-                    tokenStopped.add(activeTask.getToken());
-                }
-            }
-        }
-
-        // Then stop what's needed
-        Predicate<Task> stopFilter = predicatePerStrategy.get(StopStrategy.STOP);
-        if (stopFilter != null) {
-            for (TaskBase activeTask : getActiveTasks(notMyself.and(stopFilter))) {
-                // Just stop and keep for resume
-                activeTask.stop(true);
-                // Single execution task that are stopped don't need to be resumed because they'll die.
-                // So, don't add the token to the list for stopped single exec tasks
-                if (!activeTask.isSingleExecution()) {
-                    tokenStopped.add(activeTask.getToken());
-                }
-            }
-        }
-
-        // Then pause what's needed
-        Predicate<Task> pauseFilter = predicatePerStrategy.get(StopStrategy.PAUSE);
-        if (pauseFilter != null) {
-            for (TaskBase activeTask : getActiveTasks(notMyself.and(pauseFilter))) {
-                // Just stop and always keep for resume, since even single execution paused should be resumed
-                activeTask.pause(true);
-                tokenStopped.add(activeTask.getToken());
-            }
-        }
-    }
-
-    private Predicate<Task> getNotMySelfPredicate() {
-        return input -> {
-            // null task always false
-            if (input == null) {
-                return false;
-            }
-            String currentToken = TaskCallback.currentTaskToken();
-            return currentToken == null || !currentToken.equals(input.getToken());
-        };
-    }
-
-    private EnumMap<StopStrategy, Predicate<Task>> getPredicatePerStrategy(
-            Class<? extends TaskCallback> typeToRun,
-            final Object... keyValues) {
-        EnumMap<StopStrategy, Predicate<Task>> result = new EnumMap<>(StopStrategy.class);
-        JobCommand toRunJobCommand = typeToRun.getAnnotation(JobCommand.class);
-        final String[] keys = toRunJobCommand.keyAttributes();
-        if (keys.length != keyValues.length) {
-            throw new IllegalArgumentException(
-                    "Cannot check if task " + typeToRun + " can start without key values!\n" +
-                            "Received " + Arrays.toString(keyValues) + " and expected values for " + Arrays.toString(
-                            keys));
-        }
-        for (StopCommand stopCommand : toRunJobCommand.commandsToStop()) {
-             Class<? extends TaskCallback> callbackType;
-            // get callback type from command or command name
-            callbackType = getCommand(typeToRun,stopCommand);
-            if ((callbackType.getModifiers() & Modifier.ABSTRACT) != 0) {
-                throw new IllegalArgumentException(
-                        "Job command definition for " + typeToRun.getName() + " contain an abstract class to stop!");
-            }
-            StopStrategy stopStrategy = stopCommand.strategy();
-            TaskTypePredicate taskPredicate = (TaskTypePredicate) result.get(stopStrategy);
-            if (stopCommand.useKey()) {
-                taskPredicate = getTaskPredicateForKey(callbackType, taskPredicate, keyValues);
-            } else {
-                taskPredicate = getTaskPredicateForType(callbackType, taskPredicate);
-            }
-            result.put(stopStrategy, taskPredicate);
-        }
-
-        if (toRunJobCommand.singleton()) {
-            // If singleton and currently running => Impossible to stop
-            TaskTypePredicate taskPredicate = (TaskTypePredicate) result.get(StopStrategy.IMPOSSIBLE);
-            taskPredicate = getTaskPredicateForType(typeToRun, taskPredicate);
-            result.put(StopStrategy.IMPOSSIBLE, taskPredicate);
-        }
-
-        if (keys.length != 0) {
-            // If key based and currently running => Impossible to stop
-            TaskTypePredicate taskPredicate = (TaskTypePredicate) result.get(StopStrategy.IMPOSSIBLE);
-            taskPredicate = getTaskPredicateForKey(typeToRun, taskPredicate, keyValues);
-            result.put(StopStrategy.IMPOSSIBLE, taskPredicate);
-        }
-
-        return result;
-    }
-
-    /**
-     * get task to do stop command on it
-     *
-     * @param typeToRun
-     * @param stopCommand - stop command to execute on job
-     * @return callback task class
-     */
-    private Class<? extends TaskCallback> getCommand(Class<? extends TaskCallback> typeToRun, StopCommand stopCommand){
-
-        Class<? extends TaskCallback> callbackType = null;
-        ScheduleJobEnum commandName =  stopCommand.commandName();
-        // is command name define bu no command type
-        if (!commandName.equals(ScheduleJobEnum.DUMMY_JOB) && stopCommand.command() == DummyJob.class){
-             try {
-                callbackType = (Class<? extends TaskCallback>) Class.forName(commandName.jobName);
-            } catch (ClassNotFoundException e) {
-                log.error("class commandName not found ",e);
-             }
-        }
-        // no command name or command type has been define
-        else if (commandName.equals(ScheduleJobEnum.DUMMY_JOB) && stopCommand.command() == DummyJob.class){
-            log.error("no job command type or name was define for job class: "+typeToRun.getSimpleName());
-         }
-        else {//command type has been define
-           callbackType = stopCommand.command();
-        }
-        return callbackType;
-    }
-
-    private TaskTypePredicate getTaskPredicateForType(Class<? extends TaskCallback> callbackType,
-            TaskTypePredicate taskPredicate) {
-        if (taskPredicate == null) {
-            taskPredicate = new TaskTypePredicate(callbackType);
-        } else {
-            taskPredicate = new TaskTypePredicate(taskPredicate, callbackType);
-        }
-        return taskPredicate;
-    }
-
-    private TaskTypePredicate getTaskPredicateForKey(final Class<? extends TaskCallback> callbackType,
-            TaskTypePredicate taskPredicate, final Object[] keyValues) {
-        if (taskPredicate == null) {
-            taskPredicate = new TaskTypePredicate();
-        }
-        taskPredicate.addSubPredicate(input -> (input != null) &&
-                ClassUtils.isAssignable(callbackType, input.getType()) &&
-                input.keyEquals(keyValues));
-        return taskPredicate;
-    }
-
-    @Override
-    public List<String> stopTasks(Class<? extends TaskCallback> callbackType) {
-        String currentToken = TaskCallback.currentTaskToken();
-        List<String> results = Lists.newArrayList();
-        for (TaskBase task : activeTasksByToken.values()) {
-            // If callback type is null means all, cannot stop myself
-            if ((callbackType == null || ClassUtils.isAssignable(callbackType, task.getType()))
-                    && (currentToken == null || !task.getToken().equals(currentToken))) {
-                //TODO: Don't wait on each job in a serial fashion
-                stopTask(task.getToken(), true);
-                results.add(task.getToken());
-            }
-        }
-        return results;
-    }
-
-    @Override
-    public void pauseTask(String token, boolean wait) {
-        TaskBase task = getInternalActiveTask(token, true);
-        if (task != null) {
-            task.pause(wait);
-        } else {
-            log.warn("Could not find task {} to pause.", token);
-        }
-    }
-
-    @Override
-    public boolean resumeTask(String token) {
-        TaskBase task = getInternalActiveTask(token, false);
-        if (task != null) {
-            return task.resume();
-        } else {
-            log.debug("Could not find task {} to resume.", token);
-            return false;
-        }
-    }
-
-    @Override
-    public boolean waitForTaskCompletion(String token) {
-        TaskBase task = getInternalActiveTask(token, false);
-        //Check for null since task may have already been canceled
-        return task == null || task.waitForCompletion(0);
-    }
-
-    @Override
-    public boolean waitForTaskCompletion(String token, long timeout) {
-        TaskBase task = getInternalActiveTask(token, false);
-        //Check for null since task may have already been canceled
-        return task == null || task.waitForCompletion(timeout);
-    }
-
-    @Override
-    public boolean pauseOrBreak() {
-        String token = TaskCallback.currentTaskToken();
-        // If not in a task the token is null
-        if (token == null) {
-            //Since this is called by external clients, it may be called directly or in tests with no surrounding task
-            log.debug("No current task is found on thread - nothing to block or pause.");
-            return false;
-        }
-        TaskBase task = getInternalActiveTask(token, true);
-        if (task == null) {
-            log.warn("Could not find task {} to check block on.", token);
-            return false;
-        }
-        return task.blockIfPausedAndShouldBreak();
-    }
-
-    @Override
-    public TaskBase getInternalActiveTask(String token, boolean warnIfMissing) {
-        if (token == null) {
-            throw new IllegalArgumentException("Could not find task with null token");
-        }
-        TaskBase task = activeTasksByToken.get(token);
-        if (warnIfMissing && task == null) {
-            log.warn("Could not locate active task with token {}. Task may have been canceled.", token);
-        }
-        return task;
-    }
-
-    @Override
-    public boolean hasTaskOfType(Class<? extends TaskCallback> callbackType) {
-        return hasTaskOfType(callbackType, activeTasksByToken, true);
-    }
-
-    private boolean hasTaskOfType(Class<? extends TaskCallback> callbackType, ConcurrentMap<String, TaskBase> taskMap,
-            boolean withManual) {
-        if (callbackType == null) {
-            return false;
-        }
-        for (TaskBase task : taskMap.values()) {
-            if (ClassUtils.isAssignable(callbackType, task.getType()) &&
-                    !(withManual && task.isManuallyActivated())) {
-                return true;
-            }
-        }
-        return false;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/schedule/TaskTypePredicate.java b/backend/core/src/main/java/org/artifactory/schedule/TaskTypePredicate.java
deleted file mode 100644
index 0c69fcc..0000000
--- a/backend/core/src/main/java/org/artifactory/schedule/TaskTypePredicate.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-import org.springframework.util.ClassUtils;
-
-import javax.annotation.Nullable;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.function.Predicate;
-
-/**
- * Date: 9/5/11
- * Time: 5:03 PM
- *
- * @author Fred Simon
- */
-public class TaskTypePredicate implements Predicate<Task> {
-    private final Class<? extends TaskCallback>[] types;
-    private Predicate<Task> delegate;
-
-    public TaskTypePredicate(Class<? extends TaskCallback>... types) {
-        this.types = types;
-    }
-
-    @SuppressWarnings({"unchecked"})
-    public TaskTypePredicate(TaskTypePredicate from, Class<? extends TaskCallback>... types) {
-        HashSet<Class<? extends TaskCallback>> classes = new HashSet<>();
-        Collections.addAll(classes, from.types);
-        Collections.addAll(classes, types);
-        this.types = classes.toArray(new Class[classes.size()]);
-    }
-
-    public void addSubPredicate(Predicate<Task> subPredicate) {
-        if (this.delegate == null) {
-            this.delegate = subPredicate;
-        } else {
-            this.delegate = delegate.or(subPredicate);
-        }
-    }
-
-    @Override
-    public boolean test(@Nullable Task input) {
-        if (delegate != null && delegate.test(input)) {
-            return true;
-        }
-        for (Class<? extends TaskCallback> type : types) {
-            if (ClassUtils.isAssignable(type, input.getType())) {
-                return true;
-            }
-        }
-        return false;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/schedule/TaskUtils.java b/backend/core/src/main/java/org/artifactory/schedule/TaskUtils.java
deleted file mode 100644
index 552af01..0000000
--- a/backend/core/src/main/java/org/artifactory/schedule/TaskUtils.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-import org.artifactory.schedule.quartz.QuartzCommand;
-import org.artifactory.schedule.quartz.QuartzTask;
-import org.artifactory.security.AnonymousAuthenticationToken;
-import org.artifactory.security.SystemAuthenticationToken;
-import org.artifactory.spring.InternalArtifactoryContext;
-import org.artifactory.spring.InternalContextHelper;
-import org.quartz.CronScheduleBuilder;
-import org.quartz.JobBuilder;
-import org.quartz.JobDetail;
-import org.quartz.SimpleScheduleBuilder;
-import org.quartz.Trigger;
-import org.quartz.TriggerBuilder;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-
-import javax.annotation.Nonnull;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Date;
-import java.util.UUID;
-import java.util.function.Predicate;
-
-/**
- * User: freds
- * Date: 7/6/11
- * Time: 2:54 PM
- */
-public abstract class TaskUtils {
-
-    public static TaskBase createManualTask(@Nonnull Class<? extends QuartzCommand> commandClass, long initialDelay) {
-        return createManualTask(commandClass, initialDelay, null);
-    }
-
-    public static TaskBase createManualTask(@Nonnull Class<? extends QuartzCommand> quartzCommand,
-            long initialDelay, String description) {
-        checkCommandClass(quartzCommand, true);
-
-        description = getTaskDescription(quartzCommand, description) + " (manual trigger)";
-
-        JobDetail jobDetail = JobBuilder.newJob(quartzCommand)
-                .withIdentity(generateUniqueName(quartzCommand), QuartzTask.ARTIFACTORY_GROUP)
-                .withDescription(description).build();
-
-        Trigger trigger = TriggerBuilder.newTrigger().forJob(jobDetail)
-                .withIdentity(generateUniqueName(quartzCommand))
-                .withSchedule(SimpleScheduleBuilder.simpleSchedule())
-                .startAt(new Date(System.currentTimeMillis() + initialDelay)).build();
-
-        return fillProperties(QuartzTask.createQuartzTask(quartzCommand, trigger, jobDetail), true);
-    }
-
-    public static TaskBase createRepeatingTask(@Nonnull Class<? extends QuartzCommand> commandClass,
-            long interval, long initialDelay) {
-        return createRepeatingTask(commandClass, interval, initialDelay, null);
-    }
-
-    public static TaskBase createRepeatingTask(@Nonnull Class<? extends QuartzCommand> quartzCommand,
-            long interval, long initialDelay, String description) {
-        checkCommandClass(quartzCommand, false);
-
-        JobDetail jobDetail = JobBuilder.newJob(quartzCommand)
-                .withIdentity(generateUniqueName(quartzCommand), QuartzTask.ARTIFACTORY_GROUP)
-                .withDescription(getTaskDescription(quartzCommand, description)).build();
-
-        SimpleScheduleBuilder schedulerBuilder = SimpleScheduleBuilder.simpleSchedule();
-        if (interval > 0) {
-            schedulerBuilder.repeatForever().withIntervalInMilliseconds(interval);
-        }
-        Trigger trigger = TriggerBuilder.newTrigger().forJob(jobDetail)
-                .withIdentity(generateUniqueName(quartzCommand))
-                .withSchedule(schedulerBuilder).startAt(new Date(System.currentTimeMillis() + initialDelay)).build();
-
-        return fillProperties(QuartzTask.createQuartzTask(quartzCommand, trigger, jobDetail), false);
-    }
-
-    public static TaskBase createCronTask(@Nonnull Class<? extends QuartzCommand> commandClass,
-            @Nonnull String cronExpression) {
-        return createCronTask(commandClass, cronExpression, null);
-    }
-
-    public static TaskBase createCronTask(@Nonnull Class<? extends QuartzCommand> quartzCommand,
-            @Nonnull String cronExpression, String description) {
-        checkCommandClass(quartzCommand, false);
-
-        JobDetail jobDetail = JobBuilder.newJob(quartzCommand)
-                .withIdentity(generateUniqueName(quartzCommand), QuartzTask.ARTIFACTORY_GROUP)
-                .withDescription(getTaskDescription(quartzCommand, description)).build();
-
-        Trigger trigger = TriggerBuilder.newTrigger().forJob(jobDetail)
-                .withIdentity(generateUniqueName(quartzCommand))
-                .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
-                .build();
-
-        return fillProperties(QuartzTask.createQuartzTask(quartzCommand, trigger, jobDetail), false);
-    }
-
-    private static String getTaskDescription(Class<? extends QuartzCommand> quartzCommand, String inDescription) {
-        if (inDescription == null) {
-            JobCommand jobCommand = quartzCommand.getAnnotation(JobCommand.class);
-            return jobCommand.description();
-        } else {
-            return inDescription;
-        }
-    }
-
-    private static TaskBase fillProperties(TaskBase task, boolean manual) {
-        task.setManuallyActivated(manual);
-        task.addAttribute(TaskBase.TASK_TOKEN, task.getToken());
-        JobCommand jobCommand = task.getType().getAnnotation(JobCommand.class);
-        task.addAttribute(TaskBase.TASK_AUTHENTICATION, getAuthentication(jobCommand, task, manual));
-        task.addAttribute(TaskBase.TASK_RUN_ONLY_ON_PRIMARY, jobCommand.runOnlyOnPrimary());
-        // Set good state for singleton
-        if (jobCommand.singleton()) {
-            // Manual activation of a singleton task is not singleton
-            task.setSingleton(!manual);
-        }
-        return task;
-    }
-
-    private static Authentication getAuthentication(JobCommand jobCommand, TaskBase task, boolean manual) {
-        TaskUser taskUser;
-        if (manual) {
-            taskUser = jobCommand.manualUser();
-        } else {
-            taskUser = jobCommand.schedulerUser();
-        }
-        Authentication authentication = null;
-        switch (taskUser) {
-            case INVALID:
-                throw new IllegalArgumentException(
-                        "Quartz command " + task.getType() + " did not set a task user for " +
-                                (manual ? "manual" : "scheduled") + " activation!"
-                );
-            case SYSTEM:
-                authentication = new SystemAuthenticationToken();
-                break;
-            case CURRENT:
-                authentication = SecurityContextHolder.getContext().getAuthentication();
-                // If authentication null continue to anonymous
-                if (authentication != null) {
-                    break;
-                }
-            case ANONYMOUS:
-                authentication = new AnonymousAuthenticationToken();
-                break;
-        }
-        if (authentication == null) {
-            throw new IllegalStateException("Could not find authentication credential for task " + task.getType());
-        }
-        return authentication;
-    }
-
-    private static void checkCommandClass(Class<? extends TaskCallback> commandClass, boolean manual) {
-        if (commandClass == null) {
-            throw new IllegalArgumentException("Command class mandatory");
-        }
-        JobCommand jobCommand = commandClass.getAnnotation(JobCommand.class);
-        if (jobCommand == null) {
-            throw new IllegalArgumentException(
-                    "Quartz command " + commandClass + " does not have the " + JobCommand.class + " annotation");
-        }
-        if (manual && jobCommand.manualUser() == TaskUser.INVALID) {
-            throw new IllegalArgumentException(
-                    "Quartz command " + commandClass + " does not support manual activation!");
-        }
-        if (!manual && jobCommand.schedulerUser() == TaskUser.INVALID) {
-            throw new IllegalArgumentException(
-                    "Quartz command " + commandClass + " does not support scheduled activation!");
-        }
-    }
-
-    public static boolean pauseOrBreak() {
-        InternalArtifactoryContext context = InternalContextHelper.get();
-        return context != null && context.getTaskService().pauseOrBreak();
-    }
-
-    public static long copyLarge(InputStream input, OutputStream output) throws IOException {
-        byte[] buffer = new byte[1024 * 8];
-        long count = 0;
-        int n;
-        while (-1 != (n = input.read(buffer))) {
-            output.write(buffer, 0, n);
-            count += n;
-            if (pauseOrBreak()) {
-                throw new IOException("Stopped copy on demand!");
-            }
-        }
-        return count;
-    }
-
-    private static String generateUniqueName(Class<? extends QuartzCommand> commandClass) {
-        return commandClass.getSimpleName() + "#" + UUID.randomUUID().toString();
-    }
-
-    public static Predicate<Task> createPredicateForType(final Class<? extends TaskCallback> callbackType) {
-        return new TaskTypePredicate(callbackType);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/schedule/aop/AsyncAdvice.java b/backend/core/src/main/java/org/artifactory/schedule/aop/AsyncAdvice.java
deleted file mode 100644
index d29eb1d..0000000
--- a/backend/core/src/main/java/org/artifactory/schedule/aop/AsyncAdvice.java
+++ /dev/null
@@ -1,376 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule.aop;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Lists;
-import org.aopalliance.intercept.MethodInterceptor;
-import org.aopalliance.intercept.MethodInvocation;
-import org.artifactory.api.repo.Async;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.sapi.common.Lock;
-import org.artifactory.schedule.CachedThreadPoolTaskExecutor;
-import org.artifactory.spring.InternalArtifactoryContext;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.storage.fs.lock.aop.LockingAdvice;
-import org.artifactory.storage.fs.session.StorageSession;
-import org.artifactory.storage.fs.session.StorageSessionHolder;
-import org.artifactory.storage.tx.SessionResource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.aop.framework.AopProxyUtils;
-import org.springframework.aop.framework.ReflectiveMethodInvocation;
-import org.springframework.aop.support.AopUtils;
-import org.springframework.core.task.TaskRejectedException;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContext;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.transaction.support.TransactionSynchronizationManager;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.AccessibleObject;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.Future;
-
-/**
- * @author Yoav Landman
- */
-public class AsyncAdvice implements MethodInterceptor {
-    private static final Logger log = LoggerFactory.getLogger(AsyncAdvice.class);
-
-    // holds all the pending and running invocations. used only during tests
-    private ConcurrentHashMap<MethodInvocation, MethodInvocation> pendingInvocations = new ConcurrentHashMap<>();
-
-    @Override
-    public Future<?> invoke(final MethodInvocation invocation) throws Throwable {
-        MethodAnnotation<Lock> lockMethodAnnotation = getMethodAnnotation(invocation, Lock.class);
-        if (lockMethodAnnotation.annotation != null) {
-            throw new RuntimeException("The @Async annotation cannot be used with the @Lock annotation. " +
-                    "Use @Async#transactional=true instead: " + lockMethodAnnotation.method);
-        }
-        MethodAnnotation<Async> asyncMethodAnnotation = getMethodAnnotation(invocation, Async.class);
-        boolean delayExecutionUntilCommit = asyncMethodAnnotation.annotation.delayUntilAfterCommit();
-        boolean failIfNotScheduledFromTransaction =
-                asyncMethodAnnotation.annotation.failIfNotScheduledFromTransaction();
-        boolean inSession = StorageSessionHolder.getSession() != null;
-        if (!inSession && delayExecutionUntilCommit) {
-            if (failIfNotScheduledFromTransaction) {
-                throw new IllegalStateException("Async invocation scheduled for after commit, " +
-                        "cannot be scheduled outside a transaction: " + asyncMethodAnnotation.method);
-            } else {
-                log.debug("Async invocation scheduled for after commit, but not scheduled inside a transaction: {}",
-                        asyncMethodAnnotation.method);
-            }
-        }
-
-        TraceableMethodInvocation traceableInvocation =
-                new TraceableMethodInvocation(invocation, Thread.currentThread().getName());
-        log.trace("Adding: {}", traceableInvocation);
-        if (ConstantValues.test.getBoolean()) {
-            pendingInvocations.put(traceableInvocation, traceableInvocation);
-        }
-        try {
-            if (delayExecutionUntilCommit && inSession) {
-                //Schedule task submission for session save()
-                StorageSession session = StorageSessionHolder.getSession();
-                MethodCallbackSessionResource sessionCallbacks =
-                        session.getOrCreateResource(MethodCallbackSessionResource.class);
-                sessionCallbacks.setAdvice(this);
-                sessionCallbacks.addInvocation(traceableInvocation, asyncMethodAnnotation.annotation.shared());
-                //No future
-                return null;
-            } else {
-                //Submit immediately
-                Future<?> future = submit(traceableInvocation);
-                return future;
-            }
-        } catch (Exception e) {
-            // making sure to remove the invocation from the pending/executing
-            removeInvocation(traceableInvocation);
-            throw e;
-        }
-    }
-
-    @SuppressWarnings({"unchecked"})
-    private <T extends Annotation> MethodAnnotation<T> getMethodAnnotation(MethodInvocation invocation,
-            Class<T> annotationClass) {
-        Method method = invocation.getMethod();
-        T annotation = method.getAnnotation(annotationClass);
-        //Try to read the class level annotation if the interface is not found
-        if (annotation != null) {
-            return new MethodAnnotation(method, annotation);
-        }
-        Class<?> targetClass = AopProxyUtils.ultimateTargetClass(
-                ((ReflectiveMethodInvocation) invocation).getProxy());
-        Method specificMethod = AopUtils.getMostSpecificMethod(method, targetClass);
-        annotation = specificMethod.getAnnotation(annotationClass);
-        return new MethodAnnotation(specificMethod, annotation);
-    }
-
-    private Future<?> submit(final MethodInvocation invocation) {
-        InternalArtifactoryContext context = InternalContextHelper.get();
-        CachedThreadPoolTaskExecutor executor = context.beanForType(CachedThreadPoolTaskExecutor.class);
-        Future<?> future = null;
-        try {
-            future = executor.submit(new Callable<Object>() {
-                @Override
-                public Object call() {
-                    try {
-                        if (TransactionSynchronizationManager.isSynchronizationActive()) {
-                            //Sanity check we should never have a tx sync on an existing pooled thread
-                            throw new IllegalStateException(
-                                    "An async invocation (" + invocation.getMethod() + ") " +
-                                            "should not be associated with an existing transaction.");
-                        }
-                        Object result = doInvoke(invocation);
-                        // if the result is not of type Future don't bother returning it (unless you are fond of ClassCastExceptions)
-                        if (result instanceof Future) {
-                            return ((Future) result).get();
-                        } else {
-                            return null;
-                        }
-                    } catch (Throwable throwable) {
-                        Throwable loggedThrowable;
-                        if (invocation instanceof TraceableMethodInvocation) {
-                            Throwable original = ((TraceableMethodInvocation) invocation).getThrowable();
-                            original.initCause(throwable);
-                            loggedThrowable = original;
-                        } else {
-                            loggedThrowable = throwable;
-                        }
-                        Method method;
-                        if (invocation instanceof CompoundInvocation) {
-                            method = ((CompoundInvocation) invocation).getLatestMethod();
-                        } else {
-                            method = invocation.getMethod();
-                        }
-                        log.error("Could not execute async method: '" + method + "'.", loggedThrowable);
-                        return null;
-                    }
-                }
-            });
-        } catch (TaskRejectedException e) {
-            log.error("Task {} rejected by scheduler: {}", invocation, e.getMessage());
-            log.debug("Task {} rejected by scheduler: {}", invocation, e.getMessage(), e);
-        }
-
-        // only return the future result if the method returns a Future object
-        if (!(invocation instanceof CompoundInvocation) &&
-                Future.class.isAssignableFrom(invocation.getMethod().getReturnType())) {
-            return future;
-        } else {
-            return null;
-        }
-    }
-
-    Object doInvoke(MethodInvocation invocation) throws Throwable {
-        if (invocation instanceof CompoundInvocation) {
-            invocation.proceed();
-            return null;    // multiple invocations -> no single return type
-        }
-
-        Authentication originalAuthentication = null;
-        try {
-            MethodAnnotation<Async> methodAnnotation =
-                    getMethodAnnotation(((TraceableMethodInvocation) invocation).wrapped, Async.class);
-            if (methodAnnotation.annotation == null) {
-                throw new IllegalArgumentException(
-                        "An async invocation (" + invocation.getMethod() +
-                                ") should be used with an @Async annotated invocation.");
-            }
-            if (methodAnnotation.annotation.authenticateAsSystem()) {
-                SecurityContext securityContext = SecurityContextHolder.getContext();
-                originalAuthentication = securityContext.getAuthentication();
-                InternalContextHelper.get().getSecurityService().authenticateAsSystem();
-            }
-            if (methodAnnotation.annotation.transactional()) {
-                //Wrap in a transaction
-                log.trace("Invoking {} in transaction", invocation);
-                return new LockingAdvice().invoke(invocation);
-            } else {
-                log.trace("Invoking {} ", invocation);
-                return invocation.proceed();
-            }
-        } catch (TaskRejectedException e) {
-            log.warn("Task was rejected by scheduler: {}", e.getMessage());
-            log.debug("Task was reject by scheduler", e);
-            return null;
-        } finally {
-            if (originalAuthentication != null) {
-                SecurityContext securityContext = SecurityContextHolder.getContext();
-                securityContext.setAuthentication(originalAuthentication);
-            }
-
-            // remove the invocations here (called from the Compound also)
-            removeInvocation(invocation);
-        }
-    }
-
-    private void removeInvocation(MethodInvocation invocation) {
-        if (ConstantValues.test.getBoolean()) {
-            log.trace("Removing: {}", invocation);
-            pendingInvocations.remove(invocation);
-        }
-    }
-
-    public ImmutableSet<MethodInvocation> getCurrentInvocations() {
-        return ImmutableSet.copyOf(pendingInvocations.keySet());
-    }
-
-    public void clearPendingInvocations() {
-        if (ConstantValues.test.getBoolean()) {
-            log.trace("Clearing all asyn invocations: {}", pendingInvocations);
-            pendingInvocations.clear();
-        }
-    }
-
-    /**
-     * @param method The method to check if pending execution (usually the interface method, not the implementation!)
-     * @return True if there is an pending (or running) async call to the given method
-     */
-    public boolean isPending(Method method) {
-        // iterate on a copy to avoid ConcurrentModificationException
-        for (MethodInvocation invocation : getCurrentInvocations()) {
-            if (invocation instanceof CompoundInvocation) {
-                ImmutableList<MethodInvocation> invocations = ((CompoundInvocation) invocation).getInvocations();
-                for (MethodInvocation methodInvocation : invocations) {
-                    if (method.equals(methodInvocation.getMethod())) {
-                        return true;
-                    }
-                }
-            } else {
-                if (method.equals(invocation.getMethod())) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    public static class MethodCallbackSessionResource implements SessionResource {
-        AsyncAdvice advice;
-        final List<MethodInvocation> invocations = new ArrayList<>();
-        final CompoundInvocation sharedInvocations = new CompoundInvocation();
-
-        public void setAdvice(AsyncAdvice advice) {
-            this.advice = advice;
-            sharedInvocations.setAdvice(advice);
-        }
-
-        public void addInvocation(TraceableMethodInvocation invocation, boolean shared) {
-            if (shared) {
-                sharedInvocations.add(invocation);
-            } else {
-                invocations.add(invocation);
-            }
-        }
-
-        @Override
-        public void afterCompletion(boolean commit) {
-            if (commit) {
-                //Submit the shared ones first
-                if (!sharedInvocations.isEmpty()) {
-                    advice.submit(sharedInvocations);
-                }
-                if (!invocations.isEmpty()) {
-                    //Clear the invocations for this session and submit them for async execution
-                    ArrayList<MethodInvocation> tmpInvocations = Lists.newArrayList(invocations);
-                    //Reset internal state
-                    invocations.clear();
-                    for (MethodInvocation invocation : tmpInvocations) {
-                        advice.submit(invocation);
-                    }
-                }
-            } else {
-                sharedInvocations.clear();
-                invocations.clear();
-            }
-        }
-
-        @Override
-        public boolean hasPendingResources() {
-            return !invocations.isEmpty();
-        }
-
-        @Override
-        public void onSessionSave() {
-        }
-    }
-
-    private static class TraceableMethodInvocation implements MethodInvocation {
-
-        private final MethodInvocation wrapped;
-        private final Throwable throwable;
-
-        public TraceableMethodInvocation(MethodInvocation wrapped, String threadName) {
-            this.wrapped = wrapped;
-            String msg = "[" + threadName + "] async call to '" + wrapped.getMethod() + "' completed with error.";
-            this.throwable = new Throwable(msg);
-        }
-
-        public Throwable getThrowable() {
-            return throwable;
-        }
-
-        @Override
-        public Method getMethod() {
-            return wrapped.getMethod();
-        }
-
-        @Override
-        public Object[] getArguments() {
-            return wrapped.getArguments();
-        }
-
-        @Override
-        public Object proceed() throws Throwable {
-            return wrapped.proceed();
-        }
-
-        @Override
-        public Object getThis() {
-            return wrapped.getThis();
-        }
-
-        @Override
-        public AccessibleObject getStaticPart() {
-            return wrapped.getStaticPart();
-        }
-
-        @Override
-        public String toString() {
-            return wrapped.toString();
-        }
-    }
-
-    private static class MethodAnnotation<T extends Annotation> {
-        private MethodAnnotation(Method method, T annotation) {
-            this.method = method;
-            this.annotation = annotation;
-        }
-
-        private final Method method;
-        private final T annotation;
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/schedule/aop/AsyncAdvisor.java b/backend/core/src/main/java/org/artifactory/schedule/aop/AsyncAdvisor.java
deleted file mode 100644
index 08d1aa8..0000000
--- a/backend/core/src/main/java/org/artifactory/schedule/aop/AsyncAdvisor.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule.aop;
-
-import org.artifactory.api.repo.Async;
-import org.springframework.aop.support.DefaultPointcutAdvisor;
-import org.springframework.aop.support.annotation.AnnotationMatchingPointcut;
-
-/**
- * @author Yoav Landman
- * @date Oct 27, 2008
- */
-public class AsyncAdvisor extends DefaultPointcutAdvisor {
-    public AsyncAdvisor() {
-        super(new AnnotationMatchingPointcut(null, Async.class), new AsyncAdvice());
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/schedule/aop/CompoundInvocation.java b/backend/core/src/main/java/org/artifactory/schedule/aop/CompoundInvocation.java
deleted file mode 100644
index dff0989..0000000
--- a/backend/core/src/main/java/org/artifactory/schedule/aop/CompoundInvocation.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule.aop;
-
-import com.google.common.collect.ImmutableList;
-import org.aopalliance.intercept.MethodInvocation;
-
-import java.lang.reflect.AccessibleObject;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Used mainly for stacking async invocations on the same async thread (shared asyncs).
- * <p/>
- * E.g. indexing a remotely downloaded jar and updating its download count.
- *
- * @author Yoav Landman
- */
-public class CompoundInvocation implements MethodInvocation {
-
-    private List<MethodInvocation> invocations = new ArrayList<>();
-    private MethodInvocation currentInvocation;
-    private AsyncAdvice advice;
-
-    void setAdvice(AsyncAdvice advice) {
-        this.advice = advice;
-    }
-
-    void add(MethodInvocation invocation) {
-        invocations.add(invocation);
-    }
-
-    @Override
-    public Object proceed() throws Throwable {
-        List<MethodInvocation> tmpInvocations = ImmutableList.copyOf(invocations);
-        invocations.clear();
-        for (MethodInvocation invocation : tmpInvocations) {
-            currentInvocation = invocation;
-            advice.doInvoke(invocation);
-        }
-        return null;
-    }
-
-    public ImmutableList<MethodInvocation> getInvocations() {
-        return ImmutableList.copyOf(invocations);
-    }
-
-    /**
-     * @return Returns the latest executed method (useful when something bad happens)
-     */
-    Method getLatestMethod() {
-        return currentInvocation != null ? currentInvocation.getMethod() : null;
-    }
-
-    boolean isEmpty() {
-        return invocations.isEmpty();
-    }
-
-    void clear() {
-        invocations.clear();
-        currentInvocation = null;
-    }
-
-    @Override
-    public Object getThis() {
-        throw new UnsupportedOperationException("Not supported in compound invocation");
-    }
-
-    @Override
-    public AccessibleObject getStaticPart() {
-        throw new UnsupportedOperationException("Not supported in compound invocation");
-    }
-
-    @Override
-    public Method getMethod() {
-        throw new UnsupportedOperationException("Not supported in compound invocation");
-    }
-
-    @Override
-    public Object[] getArguments() {
-        throw new UnsupportedOperationException("Not supported in compound invocation");
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/schedule/aop/test/AsyncComponent.java b/backend/core/src/main/java/org/artifactory/schedule/aop/test/AsyncComponent.java
deleted file mode 100644
index 78638da..0000000
--- a/backend/core/src/main/java/org/artifactory/schedule/aop/test/AsyncComponent.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2012 JFrog Ltd. All rights reserved.
- * JFROG PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
- */
-
-package org.artifactory.schedule.aop.test;
-
-import org.artifactory.api.repo.Async;
-
-import java.util.concurrent.Future;
-
-/**
- * This class is here only to simplify the async testing.
- *
- * @author Yossi Shaul
- */
-public interface AsyncComponent {
-
-    /**
-     * @return Number of async invocations done on this component.
-     */
-    int asyncInvocationsCount();
-
-    @Async
-    Future<Integer> invokeAsync();
-
-    /**
-     * Sends a signal to the async method {@link AsyncComponent#invokeAsyncAndWaitForSignal()} to finish.
-     */
-    void signal();
-
-    @Async
-    void invokeAsyncAndWaitForSignal();
-
-    @Async(delayUntilAfterCommit = true)
-    void invokeAsyncDelayUntilAfterCommit();
-
-    @Async(delayUntilAfterCommit = true, shared = true)
-    void invokeAsyncShared();
-
-}
diff --git a/backend/core/src/main/java/org/artifactory/schedule/aop/test/AsyncComponentImpl.java b/backend/core/src/main/java/org/artifactory/schedule/aop/test/AsyncComponentImpl.java
deleted file mode 100644
index 84a6168..0000000
--- a/backend/core/src/main/java/org/artifactory/schedule/aop/test/AsyncComponentImpl.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright 2012 JFrog Ltd. All rights reserved.
- * JFROG PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
- */
-
-package org.artifactory.schedule.aop.test;
-
-import org.springframework.stereotype.Component;
-
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-/**
- * This class is here only to simplify the async testing.
- *
- * @author Yossi Shaul
- */
- at Component
-public class AsyncComponentImpl implements AsyncComponent {
-
-    private int invocationsCounter = 0;
-    private boolean signal;
-
-    public int asyncInvocationsCount() {
-        return invocationsCounter;
-    }
-
-    public Future<Integer> invokeAsync() {
-        invocationsCounter++;
-        return new Future<Integer>() {
-            public boolean cancel(boolean mayInterruptIfRunning) {
-                return false;
-            }
-
-            public boolean isCancelled() {
-                return false;
-            }
-
-            public boolean isDone() {
-                return true;
-            }
-
-            public Integer get() throws InterruptedException, ExecutionException {
-                return invocationsCounter;
-            }
-
-            public Integer get(long timeout, TimeUnit unit)
-                    throws InterruptedException, ExecutionException, TimeoutException {
-                return get();
-            }
-        };
-    }
-
-    public void signal() {
-        signal = true;
-    }
-
-    public void invokeAsyncAndWaitForSignal() {
-        while (!signal) {
-            try {
-                Thread.sleep(50);
-            } catch (InterruptedException e) {
-                throw new RuntimeException(e);
-            }
-        }
-    }
-
-    public void invokeAsyncDelayUntilAfterCommit() {
-        // just for testing
-    }
-
-    public void invokeAsyncShared() {
-        // just for testing
-    }
-
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/schedule/quartz/ExecuteAction.java b/backend/core/src/main/java/org/artifactory/schedule/quartz/ExecuteAction.java
deleted file mode 100644
index 06df07c..0000000
--- a/backend/core/src/main/java/org/artifactory/schedule/quartz/ExecuteAction.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule.quartz;
-
-import org.artifactory.addon.plugin.PluginAction;
-
-/**
- * @author Yoav Landman
- */
-public interface ExecuteAction extends PluginAction {
-    void execute();
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/schedule/quartz/PluginCommand.java b/backend/core/src/main/java/org/artifactory/schedule/quartz/PluginCommand.java
deleted file mode 100644
index a636c6d..0000000
--- a/backend/core/src/main/java/org/artifactory/schedule/quartz/PluginCommand.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule.quartz;
-
-import org.artifactory.repo.service.ImportJob;
-import org.artifactory.schedule.JobCommand;
-import org.artifactory.schedule.StopCommand;
-import org.artifactory.schedule.StopStrategy;
-import org.artifactory.schedule.TaskUser;
-import org.quartz.JobDataMap;
-import org.quartz.JobDetail;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * A quartz command job that runs a plugin closure
- *
- * @author Yoav Landman
- */
- at JobCommand(schedulerUser = TaskUser.SYSTEM, manualUser = TaskUser.SYSTEM,
-        commandsToStop = {@StopCommand(command = ImportJob.class, strategy = StopStrategy.IMPOSSIBLE)}
-)
-public class PluginCommand extends QuartzCommand {
-    private static final Logger log = LoggerFactory.getLogger(PluginCommand.class);
-
-    public static final String ACTION_CLOSURE = "action-closure";
-
-    @Override
-    protected void onExecute(JobExecutionContext callbackContext) throws JobExecutionException {
-        JobDetail jobDetail = callbackContext.getJobDetail();
-        JobDataMap jobDataMap = jobDetail.getJobDataMap();
-        ExecuteAction action = (ExecuteAction) jobDataMap.get(ACTION_CLOSURE);
-        String jobName = jobDetail.getKey().toString();
-        log.debug("Executing plugin command '{}'...", jobName);
-        action.execute();
-        log.debug("Plugin command '{}'executed.", jobName);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/schedule/quartz/QuartzTask.java b/backend/core/src/main/java/org/artifactory/schedule/quartz/QuartzTask.java
deleted file mode 100644
index 1bdf31b..0000000
--- a/backend/core/src/main/java/org/artifactory/schedule/quartz/QuartzTask.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule.quartz;
-
-import com.google.common.collect.ImmutableMap;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.schedule.TaskBase;
-import org.artifactory.schedule.TaskCallback;
-import org.quartz.JobDetail;
-import org.quartz.JobKey;
-import org.quartz.Scheduler;
-import org.quartz.SchedulerException;
-import org.quartz.SimpleTrigger;
-import org.quartz.Trigger;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * @author yoavl
- */
-public class QuartzTask extends TaskBase {
-    private static final Logger log = LoggerFactory.getLogger(QuartzTask.class);
-    public static final String ARTIFACTORY_GROUP = "artifactory";
-
-    private final Trigger trigger;
-    private final JobDetail jobDetail;
-
-    public static TaskBase createQuartzTask(Class<? extends TaskCallback> command, Trigger trigger,
-            JobDetail jobDetail) {
-        return new QuartzTask(command, trigger, jobDetail);
-    }
-
-    private QuartzTask(Class<? extends TaskCallback> command, Trigger trigger, JobDetail jobDetail) {
-        super(command);
-        this.trigger = trigger;
-        this.jobDetail = jobDetail;
-    }
-
-    @Override
-    public void addAttribute(String key, Object value) {
-        jobDetail.getJobDataMap().put(key, value);
-    }
-
-    public ImmutableMap getAttributeMap() {
-        return ImmutableMap.copyOf(jobDetail.getJobDataMap());
-    }
-
-    @Override
-    public Object getAttribute(String key) {
-        return jobDetail.getJobDataMap().get(key);
-    }
-
-    @Override
-    public boolean isSingleExecution() {
-        if (trigger instanceof SimpleTrigger) {
-            return ((SimpleTrigger) trigger).getRepeatCount() == 0;
-        }
-        return !trigger.mayFireAgain();
-    }
-
-    /**
-     * Schedule the task
-     */
-    @Override
-    protected void scheduleTask() {
-        Scheduler scheduler = getScheduler();
-        try {
-            scheduler.scheduleJob(jobDetail, trigger);
-        } catch (SchedulerException e) {
-            log.warn("Scheduling job \""+ jobDetail.getKey().getName() + "\" has failed, {}", e.getMessage());
-            log.debug("Cause: {}", e);
-        }
-    }
-
-    /**
-     * Unschedule the task
-     */
-    @Override
-    protected void cancelTask() {
-        Scheduler scheduler = getScheduler();
-        try {
-            JobKey jobKey = jobDetail.getKey();
-            if (!scheduler.deleteJob(jobKey)) {
-                log.info("Task " + jobKey + " already deleted from scheduler");
-            }
-        } catch (SchedulerException e) {
-            throw new RuntimeException("Failed to unschedule previous job: " + trigger.getKey(), e);
-        }
-    }
-
-    @Override
-    public String getToken() {
-        return jobDetail.getKey().toString();
-    }
-
-    public String getDescription() {
-        return jobDetail.getDescription();
-    }
-
-    private static Scheduler getScheduler() {
-        return ContextHelper.get().beanForType(Scheduler.class);
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/search/ArtifactSearcher.java b/backend/core/src/main/java/org/artifactory/search/ArtifactSearcher.java
deleted file mode 100644
index 00b9f1f..0000000
--- a/backend/core/src/main/java/org/artifactory/search/ArtifactSearcher.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.search;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.artifact.ArtifactSearchControls;
-import org.artifactory.api.search.artifact.ArtifactSearchResult;
-import org.artifactory.api.search.artifact.ChecksumSearchControls;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.search.VfsQuery;
-import org.artifactory.sapi.search.VfsQueryResult;
-import org.artifactory.sapi.search.VfsQueryResultType;
-import org.artifactory.sapi.search.VfsQueryRow;
-
-import java.util.Collection;
-import java.util.EnumMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * User: freds Date: Jul 27, 2008 Time: 6:04:39 PM
- */
-public class ArtifactSearcher extends SearcherBase<ArtifactSearchControls, ArtifactSearchResult> {
-
-    @Override
-    public ItemSearchResults<ArtifactSearchResult> doSearch(ArtifactSearchControls controls) {
-        String providedQuery = controls.getQuery();
-        String relativePath = controls.getRelativePath();
-        List<ArtifactSearchResult> results = Lists.newArrayList();
-        int limit = getLimit(controls);
-
-        VfsQuery query = createQuery(controls);
-        if (StringUtils.isNotBlank(relativePath)) {
-            query.addPathFilter(relativePath);
-        }
-        query.expectedResult(VfsQueryResultType.FILE)
-                .prop("node_name").val(providedQuery);
-        VfsQueryResult queryResult = query.execute(limit);
-
-        for (VfsQueryRow row : queryResult.getAllRows()) {
-            if (limit > 0 && results.size() >= limit) {
-                break;
-            }
-            ItemInfo item = row.getItem();
-            if (isResultAcceptable(item.getRepoPath())) {
-                results.add(new ArtifactSearchResult(item));
-            }
-        }
-        return new ItemSearchResults<>(results, queryResult.getCount());
-    }
-
-    /**
-     * Searches for artifacts by their checksum values
-     *
-     * @param searchControls Search controls
-     * @return Set of repo paths that comply with the given checksums
-     */
-    public Collection<ItemInfo> searchArtifactsByChecksum(ChecksumSearchControls searchControls) {
-        Map<RepoPath, ItemInfo> results = Maps.newHashMap();
-
-        EnumMap<ChecksumType, String> checksums = searchControls.getChecksums();
-        for (Map.Entry<ChecksumType, String> checksumEntry : checksums.entrySet()) {
-            if (results.isEmpty() && StringUtils.isNotBlank(checksumEntry.getValue())) {
-                findArtifactsByChecksum(checksumEntry.getKey(), checksumEntry.getValue(), searchControls, results);
-            }
-        }
-        return results.values();
-    }
-
-    /**
-     * Locates artifacts by the given checksum value and adds them to the given list
-     *
-     * @param checksumType           Checksum type (sha1, md5) to search for
-     * @param checksumValue          Checksum value to match
-     * @param checksumSearchControls controls
-     * @param results                Set of items to append the results to
-     */
-    private void findArtifactsByChecksum(ChecksumType checksumType, String checksumValue,
-            ChecksumSearchControls checksumSearchControls,
-            Map<RepoPath, ItemInfo> results) {
-        VfsQuery query = createQuery(checksumSearchControls);
-        query.expectedResult(VfsQueryResultType.FILE);
-        query.prop(checksumType.name() + "_actual").val(checksumValue);
-        VfsQueryResult queryResult = query.execute(Integer.MAX_VALUE);
-        for (VfsQueryRow row : queryResult.getAllRows()) {
-            ItemInfo item = row.getItem();
-            LocalRepo localRepo = getRepoService().localOrCachedRepositoryByKey(item.getRepoKey());
-            if (localRepo == null) {
-                // Some left over in DB or the node is in a virtual repo
-                continue;
-            }
-            results.put(item.getRepoPath(), item);
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/search/InternalSearchService.java b/backend/core/src/main/java/org/artifactory/search/InternalSearchService.java
deleted file mode 100644
index bb564f8..0000000
--- a/backend/core/src/main/java/org/artifactory/search/InternalSearchService.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.search;
-
-import org.artifactory.api.search.SearchService;
-import org.artifactory.api.search.VersionSearchResults;
-import org.artifactory.api.search.deployable.VersionUnitSearchControls;
-import org.artifactory.spring.ReloadableBean;
-
-/**
- * @author Noam Tenne
- */
-public interface InternalSearchService extends SearchService, ReloadableBean {
-
-    /**
-     * Searches for version units within the given path
-     *
-     * @param controls Search controls
-     * @return Search results
-     */
-    VersionSearchResults searchVersionUnits(VersionUnitSearchControls controls);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/search/SearchServiceImpl.java b/backend/core/src/main/java/org/artifactory/search/SearchServiceImpl.java
deleted file mode 100644
index c992c59..0000000
--- a/backend/core/src/main/java/org/artifactory/search/SearchServiceImpl.java
+++ /dev/null
@@ -1,509 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.search;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.repo.RepositoryBrowsingService;
-import org.artifactory.api.repo.VirtualRepoItem;
-import org.artifactory.api.rest.search.common.RestDateFieldName;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.SearchControls;
-import org.artifactory.api.search.VersionSearchResults;
-import org.artifactory.api.search.archive.ArchiveSearchControls;
-import org.artifactory.api.search.archive.ArchiveSearchResult;
-import org.artifactory.api.search.artifact.ArtifactSearchControls;
-import org.artifactory.api.search.artifact.ArtifactSearchResult;
-import org.artifactory.api.search.artifact.ChecksumSearchControls;
-import org.artifactory.api.search.deployable.VersionUnitSearchControls;
-import org.artifactory.api.search.deployable.VersionUnitSearchResult;
-import org.artifactory.api.search.gavc.GavcSearchControls;
-import org.artifactory.api.search.gavc.GavcSearchResult;
-import org.artifactory.api.search.property.PropertySearchControls;
-import org.artifactory.api.search.property.PropertySearchResult;
-import org.artifactory.api.search.stats.StatsSearchControls;
-import org.artifactory.api.search.stats.StatsSearchResult;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.build.BuildRun;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.LocalCacheRepo;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RemoteRepoBase;
-import org.artifactory.repo.Repo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-import org.artifactory.sapi.search.VfsQuery;
-import org.artifactory.sapi.search.VfsQueryResult;
-import org.artifactory.sapi.search.VfsQueryRow;
-import org.artifactory.sapi.search.VfsQueryService;
-import org.artifactory.schedule.CachedThreadPoolTaskExecutor;
-import org.artifactory.search.archive.ArchiveSearcher;
-import org.artifactory.search.archive.ArchiveSearcherAql;
-import org.artifactory.search.build.BuildSearcher;
-import org.artifactory.search.deployable.VersionUnitSearcher;
-import org.artifactory.search.fields.FieldNameConverter;
-import org.artifactory.search.gavc.GavcSearcher;
-import org.artifactory.search.property.PropertySearcherAql;
-import org.artifactory.search.stats.LastDownloadedSearcher;
-import org.artifactory.security.AccessLogger;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.util.GlobalExcludes;
-import org.artifactory.util.PathMatcher;
-import org.artifactory.version.CompoundVersionDetails;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nullable;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-import static org.artifactory.sapi.search.VfsBoolType.OR;
-import static org.artifactory.sapi.search.VfsComparatorType.*;
-import static org.artifactory.sapi.search.VfsQueryResultType.FILE;
-
-/**
- * @author Frederic Simon
- * @author Yoav Landman
- */
- at Service
- at Reloadable(beanClass = InternalSearchService.class, initAfter = {InternalRepositoryService.class})
-public class SearchServiceImpl implements InternalSearchService {
-    private static final Logger log = LoggerFactory.getLogger(SearchServiceImpl.class);
-
-    @Autowired
-    private VfsQueryService vfsQueryService;
-
-    @Autowired
-    private InternalRepositoryService repoService;
-
-    @Autowired
-    private RepositoryBrowsingService repoBrowsingService;
-
-    @Autowired
-    private AuthorizationService authService;
-
-    @Autowired
-    private CachedThreadPoolTaskExecutor executor;
-
-    @Override
-    public ItemSearchResults<ArtifactSearchResult> searchArtifacts(ArtifactSearchControls controls) {
-        if (shouldReturnEmptyResults(controls)) {
-            return new ItemSearchResults<>(Lists.<ArtifactSearchResult>newArrayList());
-        }
-        ArtifactSearcher searcher = new ArtifactSearcher();
-        ItemSearchResults<ArtifactSearchResult> results = searcher.search(controls);
-        return results;
-    }
-
-    @Override
-    public Set<RepoPath> searchArtifactsByChecksum(ChecksumSearchControls searchControls) {
-        ArtifactSearcher searcher = new ArtifactSearcher();
-        Collection<ItemInfo> itemInfos = searcher.searchArtifactsByChecksum(searchControls);
-        Set<RepoPath> results = Sets.newHashSet(
-                Iterables.transform(itemInfos, new Function<ItemInfo, RepoPath>() {
-                    @Override
-                    public RepoPath apply(@Nullable ItemInfo input) {
-                        return input == null ? null : input.getRepoPath();
-                    }
-                })
-        );
-        return results;
-    }
-
-    @Override
-    public ItemSearchResults<ArtifactSearchResult> getArtifactsByChecksumResults(ChecksumSearchControls searchControls) {
-        List<ArtifactSearchResult> resultList = Lists.newArrayList();
-        ArtifactSearcher searcher = new ArtifactSearcher();
-        Collection<ItemInfo> itemInfos = searcher.searchArtifactsByChecksum(searchControls);
-        for (ItemInfo item : itemInfos) {
-            resultList.add(new ArtifactSearchResult(item));
-        }
-        return new ItemSearchResults<>(resultList, resultList.size());
-    }
-
-    @Override
-    public ItemSearchResults<ArchiveSearchResult> searchArchiveContent(ArchiveSearchControls controls) {
-        if (shouldReturnEmptyResults(controls)) {
-            return new ItemSearchResults<>(Lists.<ArchiveSearchResult>newArrayList());
-        }
-        ArchiveSearcher searcher = new ArchiveSearcher();
-        ItemSearchResults<ArchiveSearchResult> results = searcher.search(controls);
-        return results;
-    }
-
-    @Override
-    public ItemSearchResults<ArchiveSearchResult> searchArchiveContentAql(ArchiveSearchControls controls) {
-        if (shouldReturnEmptyResults(controls)) {
-            return new ItemSearchResults<>(Lists.<ArchiveSearchResult>newArrayList());
-        }
-        ArchiveSearcherAql searcher = new ArchiveSearcherAql();
-        ItemSearchResults<ArchiveSearchResult> results = searcher.search(controls);
-        return results;
-    }
-
-    @Override
-    public ItemSearchResults<StatsSearchResult> searchArtifactsNotDownloadedSince(StatsSearchControls controls) {
-        if (shouldReturnEmptyResults(controls)) {
-            return new ItemSearchResults<>(Lists.<StatsSearchResult>newArrayList());
-        }
-        return new LastDownloadedSearcher().search(controls);
-    }
-
-    @Override
-    public ItemSearchResults<GavcSearchResult> searchGavc(GavcSearchControls controls) {
-        if (shouldReturnEmptyResults(controls)) {
-            return new ItemSearchResults<>(Lists.<GavcSearchResult>newArrayList());
-        }
-
-        GavcSearcher searcher = new GavcSearcher();
-        ItemSearchResults<GavcSearchResult> results = searcher.search(controls);
-
-        return results;
-    }
-
-    @Override
-    public ItemSearchResults<PropertySearchResult> searchProperty(PropertySearchControls controls) {
-        if (shouldReturnEmptyResults(controls)) {
-            return new ItemSearchResults<>(Lists.<PropertySearchResult>newArrayList());
-        }
-
-        PropertySearcherAql searcher = new PropertySearcherAql();
-        ItemSearchResults<PropertySearchResult> results = searcher.search(controls);
-
-        return results;
-    }
-
-    @Override
-    public ItemSearchResults<PropertySearchResult> searchPropertyAql(PropertySearchControls controls) {
-        if (shouldReturnEmptyResults(controls)) {
-            return new ItemSearchResults<>(Lists.<PropertySearchResult>newArrayList());
-        }
-
-        PropertySearcherAql searcher = new PropertySearcherAql();
-        ItemSearchResults<PropertySearchResult> results = searcher.search(controls);
-
-        return results;
-    }
-
-    @Override
-    public ItemSearchResults<ArtifactSearchResult> searchArtifactsInRange(
-            Calendar from,
-            Calendar to,
-            List<String> reposToSearch,
-            RestDateFieldName... dates) {
-        if (from == null && to == null) {
-            log.warn("Received search artifacts in range with no range!");
-            return new ItemSearchResults<>(Collections.<ArtifactSearchResult>emptyList(), 0L);
-        }
-        if (dates == null || dates.length == 0) {
-            log.warn("Received search artifacts in range with no date field!");
-            return new ItemSearchResults<>(Collections.<ArtifactSearchResult>emptyList(), 0);
-        }
-
-        // all artifactory files that were created or modified after input date
-        VfsQuery query = vfsQueryService.createQuery().expectedResult(FILE)
-                .setRepoKeys(reposToSearch)
-                .name(MavenNaming.MAVEN_METADATA_NAME).comp(NOT_EQUAL);
-        // If only one date make it simple
-        if (dates.length == 1) {
-            addDateRangeFilter(query, from, to, dates[0]);
-        } else {
-            query.startGroup();
-            for (int i = 0; i < dates.length; i++) {
-                RestDateFieldName date = dates[i];
-                query.startGroup();
-                addDateRangeFilter(query, from, to, date);
-                // The last one is null end group
-                if (i < dates.length - 1) {
-                    query.endGroup(OR);
-                } else {
-                    query.endGroup(null);
-                }
-            }
-            query.endGroup();
-        }
-        VfsQueryResult queryResult = query.execute(Integer.MAX_VALUE);
-        // There are no limit here the the getCount is really the total amount
-        List<ArtifactSearchResult> results = new ArrayList<>((int) queryResult.getCount());
-        for (VfsQueryRow vfsQueryRow : queryResult.getAllRows()) {
-            ItemInfo item = vfsQueryRow.getItem();
-            if (isRangeResultValid(item.getRepoPath(), reposToSearch)) {
-                results.add(new ArtifactSearchResult(item));
-            }
-        }
-        return new ItemSearchResults<>(results, queryResult.getCount());
-    }
-
-    private void addDateRangeFilter(VfsQuery query, Calendar from, Calendar to, RestDateFieldName dateField) {
-        if (from != null) {
-            query.prop(FieldNameConverter.fromRest(dateField).getPropName()).comp(GREATER_THAN).val(from);
-        }
-        if (to != null) {
-            query.prop(FieldNameConverter.fromRest(dateField).getPropName()).comp(LOWER_THAN_EQUAL).val(to);
-        }
-    }
-
-    @Override
-    public VersionSearchResults searchVersionUnits(VersionUnitSearchControls controls) {
-        VersionUnitSearcher searcher = new VersionUnitSearcher();
-        ItemSearchResults<VersionUnitSearchResult> res = searcher.doSearch(controls);
-        return new VersionSearchResults(Sets.newHashSet(res.getResults()), res.getFullResultsCount(),
-                res.getFullResultsCount() >= ConstantValues.searchUserQueryLimit.getInt(), false);
-    }
-
-    @Override
-    public Set<BuildRun> getLatestBuilds() {
-        BuildSearcher searcher = new BuildSearcher();
-        try {
-            return searcher.getLatestBuildsByName();
-        } catch (Exception e) {
-            throw new RepositoryRuntimeException(e);
-        }
-    }
-
-    @Override
-    public Set<BuildRun> findBuildsByArtifactChecksum(String sha1, String md5) {
-        BuildSearcher searcher = new BuildSearcher();
-        return searcher.findBuildsByArtifactChecksum(sha1, md5);
-    }
-
-    @Override
-    public Set<BuildRun> findBuildsByDependencyChecksum(String sha1, String md5) {
-        BuildSearcher searcher = new BuildSearcher();
-        return searcher.findBuildsByDependencyChecksum(sha1, md5);
-    }
-
-    @Override
-    public Set<String> searchArtifactsByPattern(String pattern) throws ExecutionException, InterruptedException,
-            TimeoutException {
-        if (StringUtils.isBlank(pattern)) {
-            throw new IllegalArgumentException("Unable to search for an empty pattern");
-        }
-
-        pattern = pattern.trim();
-        if (!pattern.contains(":")) {
-            throw new IllegalArgumentException("Pattern must be formatted like [repo-key]:[pattern/to/search/for]");
-        }
-
-        if (pattern.contains("**")) {
-            throw new IllegalArgumentException("Pattern cannot contain the '**' wildcard");
-        }
-
-        String[] patternTokens = StringUtils.split(pattern, ":", 2);
-        String repoKey = patternTokens[0];
-
-        final Repo repo = repoService.repositoryByKey(repoKey);
-
-        if ((repo == null) || (patternTokens.length == 1) || (StringUtils.isBlank(patternTokens[1]))) {
-            return Sets.newHashSet();
-        }
-
-        final String innerPattern = StringUtils.replace(patternTokens[1], "\\", "/");
-
-        Callable<Set<String>> callable = new Callable<Set<String>>() {
-
-            @Override
-            public Set<String> call() throws Exception {
-                Set<String> pathsToReturn = Sets.newHashSet();
-                List<String> patternFragments = Lists.newArrayList(StringUtils.split(innerPattern, "/"));
-
-                if (repo.isReal()) {
-                    String repoKey;
-                    if (repo.isLocal() || repo.isCache()) {
-                        repoKey = repo.getKey();
-                    } else {
-                        LocalCacheRepo localCacheRepo = ((RemoteRepoBase) repo).getLocalCacheRepo();
-                        if (localCacheRepo != null) {
-                            repoKey = localCacheRepo.getKey();
-                        } else {
-                            repoKey = null;
-                        }
-                    }
-                    if (repoKey != null) {
-                        collectLocalRepoItemsRecursively(patternFragments, pathsToReturn,
-                                InternalRepoPathFactory.create(repoKey, ""));
-                    }
-                } else {
-                    collectVirtualRepoItemsRecursively(patternFragments, pathsToReturn,
-                            InternalRepoPathFactory.create(repo.getKey(), ""));
-                }
-                return pathsToReturn;
-            }
-        };
-
-        Future<Set<String>> future = executor.submit(callable);
-        return future.get(ConstantValues.searchPatternTimeoutSecs.getLong(), TimeUnit.SECONDS);
-    }
-
-    private boolean shouldReturnEmptyResults(SearchControls controls) {
-        return checkUnauthorized() || controls.isEmpty();
-    }
-
-    private boolean checkUnauthorized() {
-        boolean unauthorized =
-                !authService.isAuthenticated() || (authService.isAnonymous() && !authService.isAnonAccessEnabled());
-        if (unauthorized) {
-            AccessLogger.unauthorizedSearch();
-        }
-        return unauthorized;
-    }
-
-    @Override
-    public void init() {
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-    }
-
-    @Override
-    public void destroy() {
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-    }
-
-    /**
-     * Recursively collect items matching a given pattern from a local repo
-     *
-     * @param patternFragments Accepted pattern fragments
-     * @param pathsToReturn    Result path aggregator
-     * @param repoPath         Repo path to search at
-     */
-    private void collectLocalRepoItemsRecursively(List<String> patternFragments, Set<String> pathsToReturn,
-            RepoPath repoPath) {
-
-        org.artifactory.fs.ItemInfo itemInfo = repoService.getItemInfo(repoPath);
-
-        if (!patternFragments.isEmpty()) {
-
-            if (itemInfo.isFolder()) {
-
-                String firstFragment = patternFragments.get(0);
-                if (StringUtils.isBlank(firstFragment)) {
-                    return;
-                }
-
-                for (String childName : repoService.getChildrenNames(repoPath)) {
-
-                    if (patternMatches(firstFragment, childName)) {
-
-                        List<String> fragmentsToPass = Lists.newArrayList(patternFragments);
-                        fragmentsToPass.remove(0);
-                        collectLocalRepoItemsRecursively(fragmentsToPass, pathsToReturn,
-                                InternalRepoPathFactory.create(repoPath, childName));
-                    }
-                }
-            }
-        } else if (!itemInfo.isFolder()) {
-            pathsToReturn.add(repoPath.getPath());
-        }
-    }
-
-    /**
-     * Recursively collect items matching a given pattern from a virtual repo
-     *
-     * @param patternFragments Accepted pattern fragments
-     * @param pathsToReturn    Result path aggregator
-     * @param repoPath         Repo path to search at
-     */
-    private void collectVirtualRepoItemsRecursively(List<String> patternFragments, Set<String> pathsToReturn,
-            RepoPath repoPath) {
-
-        VirtualRepoItem itemInfo = repoBrowsingService.getVirtualRepoItem(repoPath);
-        if (itemInfo == null) {
-            return;
-        }
-
-        if (!patternFragments.isEmpty()) {
-
-            if (itemInfo.isFolder()) {
-
-                String firstFragment = patternFragments.get(0);
-                if (StringUtils.isBlank(firstFragment)) {
-                    return;
-                }
-                //TODO: [by tc] should not use the remote children
-                for (VirtualRepoItem child : repoBrowsingService.getVirtualRepoItems(repoPath)) {
-
-                    if (patternMatches(firstFragment, child.getName())) {
-
-                        List<String> fragmentsToPass = Lists.newArrayList(patternFragments);
-                        fragmentsToPass.remove(0);
-                        collectVirtualRepoItemsRecursively(fragmentsToPass, pathsToReturn,
-                                InternalRepoPathFactory.create(repoPath, child.getName()));
-                    }
-                }
-            }
-        } else if (!itemInfo.isFolder()) {
-            pathsToReturn.add(repoPath.getPath());
-        }
-    }
-
-    /**
-     * Checks if the given repo-relative path matches any of the given accepted patterns
-     *
-     * @param includePattern Accepted pattern
-     * @param path           Repo-relative path to check
-     * @return True if the path matches any of the patterns
-     */
-    private boolean patternMatches(String includePattern, String path) {
-        return PathMatcher.matches(path, Lists.newArrayList(includePattern), GlobalExcludes.getGlobalExcludes(), true);
-    }
-
-    /**
-     * Indicates whether the range query result repo path is valid
-     *
-     * @param repoPath      Repo path of query result
-     * @param reposToSearch Lists of repositories to search within
-     * @return True if the repo path is valid and comes from a local repo
-     */
-    private boolean isRangeResultValid(RepoPath repoPath, List<String> reposToSearch) {
-        if (repoPath == null) {
-            return false;
-        }
-        if ((reposToSearch != null) && !reposToSearch.isEmpty()) {
-            return true;
-        }
-
-        LocalRepo localRepo = repoService.localOrCachedRepositoryByKey(repoPath.getRepoKey());
-        return (localRepo != null) && (!NamingUtils.isChecksum(repoPath.getPath()));
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/search/SearcherBase.java b/backend/core/src/main/java/org/artifactory/search/SearcherBase.java
deleted file mode 100644
index ab7d265..0000000
--- a/backend/core/src/main/java/org/artifactory/search/SearcherBase.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.search;
-
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.search.ItemSearchResult;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.SearchControls;
-import org.artifactory.api.search.Searcher;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-import org.artifactory.sapi.search.InvalidQueryRuntimeException;
-import org.artifactory.sapi.search.VfsQuery;
-import org.artifactory.sapi.search.VfsQueryService;
-import org.artifactory.schedule.TaskInterruptedException;
-import org.artifactory.util.ExceptionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * @author yoavl
- */
-public abstract class SearcherBase<C extends SearchControls, R extends ItemSearchResult> implements Searcher<C, R> {
-    private static final Logger log = LoggerFactory.getLogger(SearcherBase.class);
-
-    private final VfsQueryService vfsQueryService;
-    private final InternalRepositoryService repoService;
-
-    //Cache this calculation (and don't make it a static...)
-    private final int maxResults = ConstantValues.searchUserQueryLimit.getInt();
-
-    protected SearcherBase() {
-        ArtifactoryContext context = ContextHelper.get();
-        vfsQueryService = context.beanForType(VfsQueryService.class);
-        repoService = context.beanForType(InternalRepositoryService.class);
-    }
-
-    @Override
-    public final ItemSearchResults<R> search(C controls) {
-        long start = System.currentTimeMillis();
-        ItemSearchResults<R> results;
-        try {
-            results = doSearch(controls);
-        } catch (TaskInterruptedException e) {
-            throw e;
-        } catch (Exception e) {
-            //Handle bad queries
-            @SuppressWarnings({"unchecked", "ThrowableResultOfMethodCallIgnored"})
-            Throwable invalidQueryException = ExceptionUtils.getCauseOfTypes(e, InvalidQueryRuntimeException.class);
-            if (invalidQueryException != null) {
-                log.debug("Invalid query encountered.", e);
-                throw (InvalidQueryRuntimeException) e;
-            } else {
-                log.error("Could not perform search.", e);
-                throw new RepositoryRuntimeException("Could not execute search query", e);
-            }
-        }
-        long time = System.currentTimeMillis() - start;
-        results.setTime(time);
-        log.debug("Total search time: {} ms", time);
-        return results;
-    }
-
-    protected VfsQuery createQuery(SearchControls controls) {
-        VfsQuery query = getVfsQueryService().createQuery();
-        if (controls.isSpecificRepoSearch()) {
-            query.setRepoKeys(controls.getSelectedRepoForSearch());
-        }
-        return query;
-    }
-
-    public abstract ItemSearchResults<R> doSearch(C controls);
-
-    public InternalRepositoryService getRepoService() {
-        return repoService;
-    }
-
-    public VfsQueryService getVfsQueryService() {
-        return vfsQueryService;
-    }
-
-    protected int getMaxResults() {
-        return maxResults;
-    }
-
-    /**
-     * Indicates whether the given result repo path is valid or not.<br> A repo path will stated as valid if the given
-     * origin local repo is not null, the path is readable (permission and repo-configuration-wise) and if it is not a
-     * checksum file.
-     *
-     * @param repoPath Repo path to validate
-     * @return True if the repo path is valid
-     */
-    protected boolean isResultAcceptable(RepoPath repoPath) {
-        if (repoPath == null) {
-            return false;
-        }
-        LocalRepo localRepo = getRepoService().localOrCachedRepositoryByKey(repoPath.getRepoKey());
-        return isResultAcceptable(repoPath, localRepo);
-    }
-
-    /**
-     * Indicates whether the given result repo path is valid or not.<br> A repo path will stated as valid if the given
-     * origin local repo is not null, the path is readable (permission and repo-configuration-wise) and if it is not a
-     * checksum file.
-     *
-     * @param repoPath        Repo path to validate
-     * @param sourceLocalRepo Source local repo to assert as valid
-     * @return True if the repo path is valid
-     */
-    protected boolean isResultAcceptable(RepoPath repoPath, LocalRepo sourceLocalRepo) {
-        return (sourceLocalRepo != null) && repoService.isRepoPathVisible(repoPath) &&
-                (!NamingUtils.isChecksum(repoPath.getPath()));
-    }
-
-    protected int getLimit(SearchControls controls) {
-        if (controls.isLimitSearchResults()) {
-            return getMaxResults();
-        }
-        return Integer.MAX_VALUE;
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/search/archive/ArchiveIndexerImpl.java b/backend/core/src/main/java/org/artifactory/search/archive/ArchiveIndexerImpl.java
deleted file mode 100644
index 31cb84f..0000000
--- a/backend/core/src/main/java/org/artifactory/search/archive/ArchiveIndexerImpl.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.search.archive;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import org.apache.commons.compress.archivers.ArchiveEntry;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.HaAddon;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.addon.ha.semaphore.SemaphoreWrapper;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.fs.ZipEntryInfo;
-import org.artifactory.mime.MimeType;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.model.xstream.fs.ArchiveEntryImpl;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.repo.cleanup.ArtifactCleanupJob;
-import org.artifactory.repo.service.ImportJob;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.repo.trash.TrashService;
-import org.artifactory.sapi.fs.VfsFile;
-import org.artifactory.sapi.fs.VfsItem;
-import org.artifactory.schedule.*;
-import org.artifactory.schedule.quartz.QuartzCommand;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.fs.VfsArchiveFile;
-import org.artifactory.storage.fs.service.ArchiveEntriesService;
-import org.artifactory.storage.fs.service.FileService;
-import org.artifactory.storage.fs.service.TasksService;
-import org.artifactory.storage.fs.tree.ItemNode;
-import org.artifactory.storage.fs.tree.ItemNodeFilter;
-import org.artifactory.storage.fs.tree.ItemTree;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.PostConstruct;
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.Callable;
-import java.util.concurrent.TimeUnit;
-
-import static org.artifactory.schedule.StopStrategy.IMPOSSIBLE;
-
-/**
- * A utility for marking archives and indexing their content
- *
- * @author Noam Tenne
- */
- at Service
-public class ArchiveIndexerImpl implements InternalArchiveIndexer {
-    private static final Logger log = LoggerFactory.getLogger(ArchiveIndexerImpl.class);
-
-    @Autowired
-    private TasksService tasksService;
-
-    @Autowired
-    private ArchiveEntriesService archiveEntriesService;
-
-    @Autowired
-    private FileService fileService;
-
-    @Autowired
-    private InternalRepositoryService repoService;
-
-    @Autowired
-    private DbService dbService;
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Autowired
-    private TaskService taskService;
-
-    // a semaphore to guard against parallel indexing
-    private SemaphoreWrapper indexingSemaphore;
-
-    @PostConstruct
-    protected void start() {
-        TaskBase reindexTask = TaskUtils.createRepeatingTask(ArchiveIndexJob.class,
-                TimeUnit.SECONDS.toMillis(ConstantValues.archiveIndexerTaskIntervalSecs.getLong()),
-                TimeUnit.SECONDS.toMillis(ConstantValues.archiveIndexerTaskIntervalSecs.getLong()));
-        taskService.startTask(reindexTask, false);
-    }
-
-    @Override
-    public boolean index(RepoPath archiveRepoPath) {
-        try {
-            // check the repo path is eligible for archive indexing
-            if (!isIndexSupported(archiveRepoPath)) {
-                log.trace("Indexing of '{}' not active.", archiveRepoPath);
-                return false;
-            }
-
-            // get the fs item and make sure it is a file
-            LocalRepo localRepo = repoService.localOrCachedRepositoryByKey(archiveRepoPath.getRepoKey());
-            if (localRepo == null) {
-                log.debug("Skipping archive indexing for {} - repo not found", archiveRepoPath);
-                return false;
-            }
-            VfsItem immutableItem = localRepo.getImmutableFsItem(archiveRepoPath);
-            if (immutableItem == null || !immutableItem.isFile()) {
-                log.debug("Skipping archive indexing for {} - item does not exist or not a file.", archiveRepoPath);
-                return false;
-            }
-
-            VfsFile vfsFile = (VfsFile) immutableItem;
-
-            // check if the checksum is already indexed
-            if (archiveEntriesService.isIndexed(vfsFile.getSha1())) {
-                log.debug("Archive '{}' with checksum '{}' is already indexed", archiveRepoPath, vfsFile.getSha1());
-                return false;
-            }
-
-            // start indexing ...
-            log.info("Indexing archive: {}", vfsFile);
-            try (VfsArchiveFile archive = new VfsArchiveFile(vfsFile)) {
-                List<? extends ArchiveEntry> entries = archive.entries();
-                Set<ZipEntryInfo> zipEntryInfos = Sets.newHashSet();
-                for (ArchiveEntry zipEntry : entries) {
-                    if (!zipEntry.isDirectory()) {
-                        zipEntryInfos.add(new ArchiveEntryImpl(zipEntry));
-                    }
-                }
-
-                ArchiveEntriesService archiveEntriesService = ContextHelper.get().beanForType(
-                        ArchiveEntriesService.class);
-                archiveEntriesService.addArchiveEntries(vfsFile.getSha1(), zipEntryInfos);
-                log.debug("Indexed archive: {}", vfsFile);
-                return true;
-            } catch (IOException e) {
-                log.error("Failed to index '{}': {}", archiveRepoPath, e.getMessage());
-                log.debug("Failed to index:", e);
-                return false;
-            }
-        } finally {
-            // remove the task in any case if it exists
-            tasksService.removeIndexTask(archiveRepoPath);
-        }
-    }
-
-    @Override
-    public void triggerQueueIndexing() {
-        if (shouldStop()) {
-            return;
-        }
-
-        if (!getIndexingSemaphore().tryAcquire()) {
-            log.trace("Archive indexing already running by another thread");
-            return;
-        }
-        try {
-            Set<RepoPath> indexingQueue = tasksService.getIndexTasks();
-            if (indexingQueue.isEmpty()) {
-                return;
-            }
-            log.debug("Indexing {} queued items", indexingQueue.size());
-
-            final InternalArchiveIndexer advisedMe = getAdvisedMe();
-            for (RepoPath repoPath : indexingQueue) {
-                try {
-                    if (shouldStop()) {
-                        break;  // stop execution if the context is not ready (shutting down, refreshing conf etc.)
-                    }
-                    advisedMe.index(repoPath);
-                } catch (Exception e) {
-                    log.error("Exception indexing " + repoPath, e);
-                    forceArchiveIndexerTaskDeletion(repoPath);
-                }
-            }
-            log.debug("Finished indexing {} queued items", indexingQueue.size());
-        } finally {
-            getIndexingSemaphore().release();
-        }
-    }
-
-    private boolean shouldStop() {
-        return !InternalContextHelper.get().isReady() || taskService.pauseOrBreak();
-    }
-
-    @Override
-    public void markArchiveForIndexing(RepoPath repoPath) {
-        if (!isIndexSupported(repoPath)) {
-            log.debug("Archive indexing is not supported for path '{}'", repoPath);
-            return;
-        }
-
-        tasksService.addIndexTask(repoPath);
-    }
-
-    @Override
-    public void asyncIndexMarkedArchives() {
-        triggerQueueIndexing();
-    }
-
-    @Override
-    public void recursiveMarkArchivesForIndexing(RepoPath baseRepoPath, boolean indexAllRepos) {
-        List<RepoPath> toIndex = Lists.newArrayList();
-        if (indexAllRepos) {
-            List<LocalRepoDescriptor> localRepos = repoService.getLocalAndCachedRepoDescriptors();
-            for (LocalRepoDescriptor localRepo : localRepos) {
-                // either root of all repos or relative path on each repo if provided
-                toIndex.add(RepoPathFactory.create(localRepo.getKey(), baseRepoPath.getPath()));
-            }
-        } else {
-            toIndex.add(baseRepoPath);
-        }
-        for (RepoPath repoPath : toIndex) {
-            ItemTree itemTree = new ItemTree(repoPath, new ItemNodeFilter() {
-                @Override
-                public boolean accepts(ItemInfo item) {
-                    return item.isFolder() || isIndexSupported(item.getRepoPath());
-                }
-            });
-            ItemNode rootNode = itemTree.getRootNode();
-            if (rootNode != null) {
-                log.info("Recursively marking paths under '{}' for archive indexing", repoPath);
-                addIndexTaskRecursively(rootNode);
-            } else {
-                log.warn("Root path for archive indexing not found: {}", repoPath);
-            }
-        }
-    }
-
-    @Override
-    public boolean isIndexed(RepoPath repoPath) {
-        String sha1 = fileService.getNodeSha1(repoPath);
-        return isIndexed(sha1);
-    }
-
-    @Override
-    public boolean isIndexed(String sha1) {
-        return archiveEntriesService.isIndexed(sha1);
-    }
-
-    private void addIndexTaskRecursively(ItemNode treeNode) {
-        if (!treeNode.isFolder()) {
-            getAdvisedMe().markArchiveForIndexing(treeNode.getRepoPath());
-        } else {
-            // Recursive call to calculate and set
-            //noinspection unchecked
-            List<ItemNode> children = treeNode.getChildren();
-            if (children != null) {
-                for (ItemNode child : children) {
-                    addIndexTaskRecursively(child);
-                }
-            }
-        }
-    }
-
-    private void forceArchiveIndexerTaskDeletion(final RepoPath repoPath) {
-        dbService.invokeInTransaction("ArchiveIndexer.forceArchiveIndexerTaskDeletion", new Callable<Object>() {
-            @Override
-            public Object call() throws Exception {
-                try {
-                    tasksService.removeIndexTask(repoPath);
-                } catch (Exception e) {
-                    log.error("Fail to delete task from database", e);
-                }
-                return null;
-            }
-        });
-    }
-
-    private boolean isIndexSupported(RepoPath repoPath) {
-        if (TrashService.TRASH_KEY.equals(repoPath.getRepoKey())) {
-            return false;
-        }
-        MimeType mimeType = NamingUtils.getMimeType(repoPath.getName());
-        return mimeType.isArchive() && mimeType.isIndex();
-    }
-
-    private InternalArchiveIndexer getAdvisedMe() {
-        return ContextHelper.get().beanForType(InternalArchiveIndexer.class);
-    }
-
-    private SemaphoreWrapper getIndexingSemaphore() {
-        if (indexingSemaphore == null) {
-            HaAddon haAddon = addonsManager.addonByType(HaAddon.class);
-            indexingSemaphore = haAddon.getSemaphore(HaCommonAddon.INDEXING_SEMAPHORE_NAME);
-        }
-        return indexingSemaphore;
-    }
-
-    @JobCommand(description = "Archive Files Indexer",
-            singleton = true, schedulerUser = TaskUser.SYSTEM, manualUser = TaskUser.SYSTEM,
-            commandsToStop = {
-                    //todo consider have group of index jobs/maintenance jobs/import-export jobs
-                    @StopCommand(command = ImportJob.class, strategy = IMPOSSIBLE),
-                    @StopCommand(command = ArtifactCleanupJob.class, strategy = IMPOSSIBLE),
-            })
-    public static class ArchiveIndexJob extends QuartzCommand {
-        @Override
-        protected void onExecute(JobExecutionContext callbackContext) throws JobExecutionException {
-            InternalArchiveIndexer archiveIndexer = ContextHelper.get().beanForType(InternalArchiveIndexer.class);
-            archiveIndexer.triggerQueueIndexing();
-        }
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/search/archive/ArchiveSearcher.java b/backend/core/src/main/java/org/artifactory/search/archive/ArchiveSearcher.java
deleted file mode 100644
index 67443af..0000000
--- a/backend/core/src/main/java/org/artifactory/search/archive/ArchiveSearcher.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.search.archive;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.archive.ArchiveSearchControls;
-import org.artifactory.api.search.archive.ArchiveSearchResult;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.search.ArchiveEntryRow;
-import org.artifactory.sapi.search.InvalidQueryRuntimeException;
-import org.artifactory.sapi.search.VfsBoolType;
-import org.artifactory.sapi.search.VfsComparatorType;
-import org.artifactory.sapi.search.VfsQuery;
-import org.artifactory.sapi.search.VfsQueryResult;
-import org.artifactory.sapi.search.VfsQueryResultType;
-import org.artifactory.sapi.search.VfsQueryRow;
-import org.artifactory.search.SearcherBase;
-import org.artifactory.util.PathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- * @author Noam Tenne
- */
-public class ArchiveSearcher extends SearcherBase<ArchiveSearchControls, ArchiveSearchResult> {
-
-    @SuppressWarnings("UnusedDeclaration")
-    private static final Logger log = LoggerFactory.getLogger(ArchiveSearcher.class);
-
-    @Override
-    public ItemSearchResults<ArchiveSearchResult> doSearch(ArchiveSearchControls controls) {
-        VfsQuery query = createQuery(controls);
-
-        String path = controls.getPath();
-        if (path != null && !path.isEmpty() && !controls.isWildcardsOnly(path)) {
-            if (path.contains(".") && !path.contains("/")) {
-                path = path.replace(".", "/");
-            }
-            validateQueryLength(path);
-            query.archivePath(path).nextBool(VfsBoolType.AND);
-        }
-
-        String name = controls.getName();
-        if (controls.isSearchClassResourcesOnly()) {
-            if (StringUtils.isEmpty(name)) {
-                name = "*";
-            }
-            if (!name.endsWith(".class")) {
-                name += ".class";
-            }
-        }
-        if (name != null && !name.isEmpty() && !controls.isWildcardsOnly(name)) {
-            validateQueryLength(name);
-            query.archiveName(name);
-        }
-
-        query.expectedResult(VfsQueryResultType.ARCHIVE_ENTRY);
-
-        if (controls.isExcludeInnerClasses()) {
-            query.archiveName("*$*").comp(VfsComparatorType.NOT_CONTAINS);
-        }
-        int limit = getLimit(controls);
-        VfsQueryResult queryResult = query.execute(limit);
-
-        List<ArchiveSearchResult> resultList = Lists.newArrayList();
-        for (VfsQueryRow row : queryResult.getAllRows()) {
-            //If the search results are limited, stop when reached more than max results + 1
-            if (resultList.size() < limit) {
-                ItemInfo item = row.getItem();
-                RepoPath repoPath = item.getRepoPath();
-                if (!isResultAcceptable(repoPath)) {
-                    continue;
-                }
-
-                boolean shouldCalc = controls.shouldCalcEntries();
-                if (shouldCalc) {
-                    Iterable<ArchiveEntryRow> archiveEntries = row.getArchiveEntries();
-                    /**
-                     * Handle normal archive search (needs to calculate entry paths for display and results were
-                     * returned)
-                     */
-                    for (ArchiveEntryRow entry : archiveEntries) {
-                        String entryName = entry.getEntryName();
-                        if (StringUtils.isEmpty(entryName)) {
-                            entryName = name;
-                        }
-                        resultList.add(new ArchiveSearchResult(item,
-                                entryName, entry.getEntryPath() + "/" + entryName, true));
-                    }
-                } else {
-                    /**
-                     * Create generic entries when we don't need to calculate paths (performing a search for the
-                     * "saved search results") or if the search query was too ambiguous (no results returned because
-                     * there were too many)
-                     */
-                    resultList.add(new ArchiveSearchResult(item, "Empty",
-                            "Entry path calculation is disabled.", false));
-                }
-            }
-        }
-        return new ItemSearchResults<>(resultList, resultList.size());
-    }
-
-    /**
-     * Validates the length of the given query
-     *
-     * @param query Query to validate
-     * @throws InvalidQueryRuntimeException If whitespace and wildcard-stripped query is less than 3 characters
-     */
-    private void validateQueryLength(String query) {
-        String trimmedQuery = PathUtils.trimWhitespace(query);
-
-        if (trimmedQuery.startsWith("*")) {
-            trimmedQuery = trimmedQuery.substring(1);
-        }
-        if (trimmedQuery.endsWith("*")) {
-            trimmedQuery = trimmedQuery.substring(0, trimmedQuery.length() - 1);
-        }
-
-        if (trimmedQuery.length() < ConstantValues.searchArchiveMinQueryLength.getLong()) {
-            throw new InvalidQueryRuntimeException("Search term must be at least " +
-                    ConstantValues.searchArchiveMinQueryLength.getString() + " characters long.");
-        }
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/search/archive/ArchiveSearcherAql.java b/backend/core/src/main/java/org/artifactory/search/archive/ArchiveSearcherAql.java
deleted file mode 100644
index 0768b18..0000000
--- a/backend/core/src/main/java/org/artifactory/search/archive/ArchiveSearcherAql.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.search.archive;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.archive.ArchiveSearchControls;
-import org.artifactory.api.search.archive.ArchiveSearchResult;
-import org.artifactory.aql.AqlConverts;
-import org.artifactory.aql.AqlService;
-import org.artifactory.aql.api.domain.sensitive.AqlApiItem;
-import org.artifactory.aql.result.AqlEagerResult;
-import org.artifactory.aql.result.rows.AqlArchiveEntryItem;
-import org.artifactory.aql.result.rows.AqlItem;
-import org.artifactory.search.SearcherBase;
-import org.artifactory.storage.spring.StorageContextHelper;
-
-import java.util.Set;
-
-/**
- * Searches for archive entries inside archive files.
- *
- * @author Gidi Shabat
- * @author Yossi Shaul
- */
-public class ArchiveSearcherAql extends SearcherBase<ArchiveSearchControls, ArchiveSearchResult> {
-
-    @Override
-    public ItemSearchResults<ArchiveSearchResult> doSearch(ArchiveSearchControls controls) {
-        AqlApiItem aql = AqlApiItem.create().filter(
-                AqlApiItem.and(
-                        AqlApiItem.archive().entry().name().equal(controls.getName()),
-                        AqlApiItem.archive().entry().path().matches(controls.getPath())
-                )).include(AqlApiItem.archive().entry().name(),AqlApiItem.archive().entry().path());
-
-        AqlService aqlService = StorageContextHelper.get().beanForType(AqlService.class);
-        AqlEagerResult<AqlItem> result = aqlService.executeQueryEager(aql);
-        Set<ArchiveSearchResult> results = Sets.newLinkedHashSet();
-        for (AqlItem aqlArtifact : result.getResults()) {
-            results.add(new ArchiveSearchResult(AqlConverts.toFileInfo.apply(aqlArtifact),
-                    ((AqlArchiveEntryItem)aqlArtifact).getEntryName(),
-                    ((AqlArchiveEntryItem)aqlArtifact).getEntryPath() + "/" +
-                            ((AqlArchiveEntryItem)aqlArtifact).getEntryName(), true));
-        }
-
-        return new ItemSearchResults<>(Lists.newArrayList(results));
-        /*VfsQuery query = createQuery(controls);
-
-        String path = controls.getPath();
-        if (path != null && !path.isEmpty() && !controls.isWildcardsOnly(path)) {
-            if (path.contains(".") && !path.contains("/")) {
-                path = path.replace(".", "/");
-            }
-            validateQueryLength(path);
-            query.archivePath(path).nextBool(VfsBoolType.AND);
-        }
-
-        String name = controls.getName();
-        if (controls.isSearchClassResourcesOnly()) {
-            if (StringUtils.isEmpty(name)) {
-                name = "*";
-            }
-            if (!name.endsWith(".class")) {
-                name += ".class";
-            }
-        }
-        if (name != null && !name.isEmpty() && !controls.isWildcardsOnly(name)) {
-            validateQueryLength(name);
-            query.archiveName(name);
-        }
-
-        query.expectedResult(VfsQueryResultType.ARCHIVE_ENTRY);
-
-        if (controls.isExcludeInnerClasses()) {
-            query.archiveName("*$*").comp(VfsComparatorType.NOT_CONTAINS);
-        }
-        int limit = getLimit(controls);
-        VfsQueryResult queryResult = query.execute(limit);
-
-        List<ArchiveSearchResult> resultList = Lists.newArrayList();
-        for (VfsQueryRow row : queryResult.getAllRows()) {
-            //If the search results are limited, stop when reached more than max results + 1
-            if (resultList.size() < limit) {
-                ItemInfo item = row.getItem();
-                RepoPath repoPath = item.getRepoPath();
-                if (!isResultAcceptable(repoPath)) {
-                    continue;
-                }
-
-                boolean shouldCalc = controls.shouldCalcEntries();
-                if (shouldCalc) {
-                    Iterable<ArchiveEntryRow> archiveEntries = row.getArchiveEntries();
-                    *//**
-         * Handle normal archive search (needs to calculate entry paths for display and results were
-         * returned)
-         *//*
-                    for (ArchiveEntryRow entry : archiveEntries) {
-                        String entryName = entry.getEntryName();
-                        if (StringUtils.isEmpty(entryName)) {
-                            entryName = name;
-                        }
-                        resultList.add(new ArchiveSearchResult(item,
-                                entryName, entry.getEntryPath() + "/" + entryName, true));
-                    }
-                } else {
-                    *//**
-         * Create generic entries when we don't need to calculate paths (performing a search for the
-         * "saved search results") or if the search query was too ambiguous (no results returned because
-         * there were too many)
-         *//*
-                    resultList.add(new ArchiveSearchResult(item, "Empty",
-                            "Entry path calculation is disabled.", false));
-                }
-            }
-        }
-        return new ItemSearchResults<>(resultList, resultList.size());*/
-    }
-
-    ///**
-    // * Validates the length of the given query
-    // *
-    // * @param query Query to validate
-    // * @throws org.artifactory.sapi.search.InvalidQueryRuntimeException If whitespace and wildcard-stripped query is less than 3 characters
-    // */
-    //private void validateQueryLength(String query) {
-    //    String trimmedQuery = PathUtils.trimWhitespace(query);
-    //
-    //    if (trimmedQuery.startsWith("*")) {
-    //        trimmedQuery = trimmedQuery.substring(1);
-    //    }
-    //    if (trimmedQuery.endsWith("*")) {
-    //        trimmedQuery = trimmedQuery.substring(0, trimmedQuery.length() - 1);
-    //    }
-    //
-    //    if (trimmedQuery.length() < ConstantValues.searchArchiveMinQueryLength.getLong()) {
-    //        throw new InvalidQueryRuntimeException("Search term must be at least " +
-    //                ConstantValues.searchArchiveMinQueryLength.getString() + " characters long.");
-    //    }
-    //}
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/search/archive/InternalArchiveIndexer.java b/backend/core/src/main/java/org/artifactory/search/archive/InternalArchiveIndexer.java
deleted file mode 100644
index 4965def..0000000
--- a/backend/core/src/main/java/org/artifactory/search/archive/InternalArchiveIndexer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.search.archive;
-
-import org.artifactory.api.search.ArchiveIndexer;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.common.Lock;
-
-/**
- * Internal interface for transaction management.
- *
- * @author Yossi Shaul
- */
-public interface InternalArchiveIndexer extends ArchiveIndexer {
-
-    /**
-     * Indexes the entries of the archive in this path if it supports indexing.
-     *
-     * @param archiveRepoPath The path to index.
-     * @return True if the file was indexed
-     */
-    @Lock
-    boolean index(RepoPath archiveRepoPath);
-
-    void triggerQueueIndexing();
-}
diff --git a/backend/core/src/main/java/org/artifactory/search/build/BuildSearcher.java b/backend/core/src/main/java/org/artifactory/search/build/BuildSearcher.java
deleted file mode 100644
index 68d5ab1..0000000
--- a/backend/core/src/main/java/org/artifactory/search/build/BuildSearcher.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.search.build;
-
-import com.google.common.collect.Sets;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.SearchControls;
-import org.artifactory.build.BuildRun;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.search.SearcherBase;
-import org.artifactory.storage.build.service.BuildSearchCriteria;
-import org.artifactory.storage.build.service.BuildStoreService;
-
-import java.util.Set;
-
-/**
- * Holds the build search logic
- *
- * @author Noam Y. Tenne
- */
-public class BuildSearcher extends SearcherBase {
-
-    /**
-     * Returns a set of build concentrated by name and latest date
-     *
-     * @return Set of latest builds by name
-     * @throws RepositoryException Any exception that might occur while executing the query
-     */
-    public Set<BuildRun> getLatestBuildsByName() throws Exception {
-        BuildStoreService buildStoreService = ContextHelper.get().beanForType(BuildStoreService.class);
-        return buildStoreService.getLatestBuildsByName();
-    }
-
-    /**
-     * Locates builds with deployed artifacts that have the given checksum
-     *
-     * @param sha1 SHA1 checksum to search for. Can be blank.
-     * @param md5  MD5 checksum to search for. Can be blank.
-     * @return List of basic build infos that deployed at least one artifact with the given checksum
-     */
-    public Set<BuildRun> findBuildsByArtifactChecksum(String sha1, String md5) {
-        return findBuildsByItemChecksum(BuildSearchCriteria.IN_ARTIFACTS, sha1, md5);
-    }
-
-    /**
-     * Locates builds with dependencies that have the given checksum
-     *
-     * @param sha1 SHA1 checksum to search for. Can be blank.
-     * @param md5  MD5 checksum to search for. Can be blank.
-     * @return List of basic build infos that depend on the artifact with the given checksum
-     */
-    public Set<BuildRun> findBuildsByDependencyChecksum(String sha1, String md5) {
-        return findBuildsByItemChecksum(BuildSearchCriteria.IN_DEPENDENCIES, sha1, md5);
-    }
-
-    /**
-     * DO NOT USE - NOT IMPLEMENTED
-     */
-    @Override
-    public ItemSearchResults doSearch(SearchControls controls) {
-        return null;
-    }
-
-    /**
-     * Locates builds that produced or depended on an item with the given checksum and adds them to the given list
-     *
-     * @param criteria Where the checksum should be search for (dependencies or artifacts)
-     * @param sha1     SHA1 checksum value
-     * @param md5      MD5 checksum value
-     */
-    private Set<BuildRun> findBuildsByItemChecksum(BuildSearchCriteria criteria, String sha1, String md5) {
-        Set<BuildRun> results = Sets.newHashSet();
-        boolean validSha1 = ChecksumType.sha1.isValid(sha1);
-        boolean validMd5 = ChecksumType.md5.isValid(md5);
-
-        if (!validSha1 && !validMd5) {
-            return results;
-        }
-        BuildStoreService buildStoreService = ContextHelper.get().beanForType(BuildStoreService.class);
-        if (validSha1) {
-            results.addAll(buildStoreService.findBuildsForChecksum(criteria, ChecksumType.sha1, sha1));
-        }
-        if (validMd5) {
-            results.addAll(buildStoreService.findBuildsForChecksum(criteria, ChecksumType.md5, md5));
-        }
-        return results;
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/search/deployable/VersionUnitSearcher.java b/backend/core/src/main/java/org/artifactory/search/deployable/VersionUnitSearcher.java
deleted file mode 100644
index 97790a7..0000000
--- a/backend/core/src/main/java/org/artifactory/search/deployable/VersionUnitSearcher.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.search.deployable;
-
-import com.google.common.collect.HashMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Multimap;
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.module.ModuleInfoBuilder;
-import org.artifactory.api.module.VersionUnit;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.deployable.VersionUnitSearchControls;
-import org.artifactory.api.search.deployable.VersionUnitSearchResult;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.Repo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.search.VfsQuery;
-import org.artifactory.sapi.search.VfsQueryResult;
-import org.artifactory.sapi.search.VfsQueryResultType;
-import org.artifactory.sapi.search.VfsQueryRow;
-import org.artifactory.search.SearcherBase;
-
-import java.util.Set;
-
-/**
- * Holds the version unit search logic
- *
- * @author Noam Y. Tenne
- */
-public class VersionUnitSearcher extends SearcherBase<VersionUnitSearchControls, VersionUnitSearchResult> {
-
-    @Override
-    public ItemSearchResults<VersionUnitSearchResult> doSearch(VersionUnitSearchControls controls) {
-        RepoPath pathToSearch = controls.getPathToSearchWithin();
-        Repo repo = getRepoService().repositoryByKey(pathToSearch.getRepoKey());
-        if (repo == null) {
-            return new ItemSearchResults<>(Lists.<VersionUnitSearchResult>newArrayList());
-        }
-        VfsQuery repoQuery = createQuery(controls)
-                .setSingleRepoKey(pathToSearch.getRepoKey())
-                .addPathFilter(pathToSearch.getPath())
-                .addPathFilters(VfsQuery.ALL_PATH_VALUE)
-                .expectedResult(VfsQueryResultType.FILE);
-
-        VfsQueryResult queryResult = repoQuery.execute(getLimit(controls));
-        Multimap<ModuleInfo, RepoPath> moduleInfoToRepoPaths = HashMultimap.create();
-        for (VfsQueryRow row : queryResult.getAllRows()) {
-            ItemInfo item = row.getItem();
-            ModuleInfo moduleInfo = repo.getItemModuleInfo(item.getRelPath());
-            if (moduleInfo.isValid()) {
-                ModuleInfo stripped = stripModuleInfoFromUnnecessaryData(moduleInfo);
-                moduleInfoToRepoPaths.put(stripped, item.getRepoPath());
-            }
-        }
-        Set<VersionUnitSearchResult> results = getVersionUnitResults(moduleInfoToRepoPaths);
-        return new ItemSearchResults<>(Lists.newArrayList(results), queryResult.getCount());
-    }
-
-    private Set<VersionUnitSearchResult> getVersionUnitResults(Multimap<ModuleInfo, RepoPath> moduleInfoToRepoPaths) {
-        Set<VersionUnitSearchResult> searchResults = Sets.newHashSet();
-        for (ModuleInfo moduleInfo : moduleInfoToRepoPaths.keySet()) {
-            searchResults.add(new VersionUnitSearchResult(
-                    new VersionUnit(moduleInfo, Sets.newHashSet(moduleInfoToRepoPaths.get(moduleInfo)))));
-        }
-        return searchResults;
-    }
-
-    private ModuleInfo stripModuleInfoFromUnnecessaryData(ModuleInfo moduleInfo) {
-        ModuleInfoBuilder moduleInfoBuilder = new ModuleInfoBuilder().organization(moduleInfo.getOrganization()).
-                module(moduleInfo.getModule()).baseRevision(moduleInfo.getBaseRevision());
-        if (moduleInfo.isIntegration()) {
-            String pathRevision = moduleInfo.getFolderIntegrationRevision();
-            String artifactRevision = moduleInfo.getFileIntegrationRevision();
-
-            boolean hasPathRevision = StringUtils.isNotBlank(pathRevision);
-            boolean hasArtifactRevision = StringUtils.isNotBlank(artifactRevision);
-
-            if (hasPathRevision && !hasArtifactRevision) {
-                moduleInfoBuilder.folderIntegrationRevision(pathRevision);
-                moduleInfoBuilder.fileIntegrationRevision(pathRevision);
-            } else if (!hasPathRevision && hasArtifactRevision) {
-                moduleInfoBuilder.fileIntegrationRevision(artifactRevision);
-                moduleInfoBuilder.folderIntegrationRevision(artifactRevision);
-            } else {
-                moduleInfoBuilder.folderIntegrationRevision(pathRevision);
-                moduleInfoBuilder.fileIntegrationRevision(artifactRevision);
-            }
-        }
-        return moduleInfoBuilder.build();
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/search/fields/FieldNameConverter.java b/backend/core/src/main/java/org/artifactory/search/fields/FieldNameConverter.java
deleted file mode 100644
index 96991a9..0000000
--- a/backend/core/src/main/java/org/artifactory/search/fields/FieldNameConverter.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.search.fields;
-
-import org.artifactory.api.rest.search.common.RestDateFieldName;
-import org.artifactory.sapi.search.VfsDateFieldName;
-
-/**
- * Date: 5/16/14 10:07 AM
- *
- * @author freds
- */
-public abstract class FieldNameConverter {
-
-    public static VfsDateFieldName fromRest(RestDateFieldName dateField) {
-        switch (dateField) {
-            case CREATED:
-                return VfsDateFieldName.CREATED;
-            case LAST_DOWNLOADED:
-                return VfsDateFieldName.LAST_DOWNLOADED;
-            case LAST_REMOTE_DOWNLOADED:
-                return VfsDateFieldName.LAST_REMOTE_DOWNLOADED;
-            case LAST_MODIFIED:
-                return VfsDateFieldName.LAST_MODIFIED;
-        }
-        throw new IllegalArgumentException("Date Field " + dateField + " has not Query equivalent!");
-    }
-
-}
diff --git a/backend/core/src/main/java/org/artifactory/search/gavc/GavcSearcher.java b/backend/core/src/main/java/org/artifactory/search/gavc/GavcSearcher.java
deleted file mode 100644
index e9ff5d0..0000000
--- a/backend/core/src/main/java/org/artifactory/search/gavc/GavcSearcher.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.search.gavc;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.gavc.GavcSearchControls;
-import org.artifactory.api.search.gavc.GavcSearchResult;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.sapi.search.VfsQuery;
-import org.artifactory.sapi.search.VfsQueryResult;
-import org.artifactory.sapi.search.VfsQueryResultType;
-import org.artifactory.sapi.search.VfsQueryRow;
-import org.artifactory.search.SearcherBase;
-import org.artifactory.util.PathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- * Holds the GAVC search logic
- *
- * @author Noam Tenne
- */
-public class GavcSearcher extends SearcherBase<GavcSearchControls, GavcSearchResult> {
-    @SuppressWarnings("UnusedDeclaration")
-    private static final Logger log = LoggerFactory.getLogger(GavcSearcher.class);
-
-    @Override
-    public ItemSearchResults<GavcSearchResult> doSearch(GavcSearchControls controls) {
-        //Validate and escape all input values
-        String groupInput = escapeGroupPath(controls.getGroupId());
-
-        //Build search path from inputted group
-        VfsQuery query = createQuery(controls)
-                .expectedResult(VfsQueryResultType.FILE)
-                .addPathFilter(groupInput)
-                .addPathFilters(controls.getArtifactId(), controls.getVersion());
-
-        String classifier = controls.getClassifier();
-        if (!StringUtils.isBlank(classifier)) {
-            query.name("*-" + classifier + "*");
-        }
-
-        int limit = getLimit(controls);
-        VfsQueryResult queryResult = query.execute(limit);
-        List<GavcSearchResult> results = Lists.newArrayList();
-        for (VfsQueryRow row : queryResult.getAllRows()) {
-            if (results.size() >= limit) {
-                break;
-            }
-            ItemInfo item = row.getItem();
-            String repoKey = item.getRepoKey();
-            LocalRepo localRepo = getRepoService().localOrCachedRepositoryByKey(repoKey);
-            if (localRepo == null || !isResultAcceptable(item.getRepoPath(), localRepo)) {
-                continue;
-            }
-
-            ModuleInfo moduleInfo = localRepo.getItemModuleInfo(item.getRelPath());
-
-            if (moduleInfo.isValid()) {
-                results.add(new GavcSearchResult(item, moduleInfo));
-            }
-        }
-
-        return new ItemSearchResults<>(results, queryResult.getCount());
-    }
-
-    /**
-     * Swaps all backward-slashes ('\') to forward ones ('/'). Removes leading and trailing slashes (if any), Replaces
-     * all periods ('.') to forward slashes.
-     *
-     * @param groupInput The inputted group path
-     * @return String - Group path after escape
-     */
-    private String escapeGroupPath(String groupInput) {
-        if (StringUtils.isBlank(groupInput)) {
-            groupInput = "";
-        }
-        groupInput = groupInput.replace('\\', '/');
-        groupInput = PathUtils.trimSlashes(groupInput).toString();
-        groupInput = groupInput.replace('.', '/');
-        // wildcard in the beginning means all values/as many folders begin
-        if (groupInput.startsWith("*") && !groupInput.startsWith(VfsQuery.ALL_PATH_VALUE)) {
-            groupInput = "*" + groupInput;
-        }
-        // Same for the end
-        if (groupInput.endsWith("*") && !groupInput.endsWith(VfsQuery.ALL_PATH_VALUE)) {
-            groupInput = groupInput + "*";
-        }
-        return groupInput;
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/search/property/PropertySearcher.java b/backend/core/src/main/java/org/artifactory/search/property/PropertySearcher.java
deleted file mode 100644
index e36e02f..0000000
--- a/backend/core/src/main/java/org/artifactory/search/property/PropertySearcher.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.search.property;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.property.PropertySearchControls;
-import org.artifactory.api.search.property.PropertySearchResult;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.sapi.search.VfsComparatorType;
-import org.artifactory.sapi.search.VfsQuery;
-import org.artifactory.sapi.search.VfsQueryResult;
-import org.artifactory.sapi.search.VfsQueryResultType;
-import org.artifactory.sapi.search.VfsQueryRow;
-import org.artifactory.search.SearcherBase;
-
-import java.util.ArrayList;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Noam Tenne
- */
-public class PropertySearcher extends SearcherBase<PropertySearchControls, PropertySearchResult> {
-
-    @Override
-    public ItemSearchResults<PropertySearchResult> doSearch(PropertySearchControls controls) {
-        LinkedHashSet<PropertySearchResult> globalResults = Sets.newLinkedHashSet();
-
-        // TODO: [by FSI] Create a real full DB query aggregating properties conditions
-        // Get all open property keys and search through them
-        Set<String> openPropertyKeys = controls.getPropertyKeysByOpenness(PropertySearchControls.OPEN);
-        long totalResultCount = executeOpenPropSearch(controls, openPropertyKeys, globalResults);
-
-        // Get all closed property keys and search through them
-        Set<String> closedPropertyKeys = controls.getPropertyKeysByOpenness(PropertySearchControls.CLOSED);
-        totalResultCount += executeClosedPropSearch(controls, closedPropertyKeys, globalResults);
-
-        //Return global results list
-        return new ItemSearchResults<>(new ArrayList<>(globalResults), totalResultCount);
-    }
-
-    /**
-     * Searches and aggregates results of open properties
-     *
-     * @param openPropertyKeys Keys to search through
-     */
-    private long executeOpenPropSearch(PropertySearchControls controls,
-            Set<String> openPropertyKeys,
-            Set<PropertySearchResult> globalResults) {
-        if (openPropertyKeys.isEmpty()) {
-            return 0;
-        }
-        VfsQuery repoQuery = createQuery(controls).expectedResult(VfsQueryResultType.ANY_ITEM);
-        for (String key : openPropertyKeys) {
-            Set<String> values = controls.get(key);
-            for (String value : values) {
-                repoQuery.prop(key).val(value);
-            }
-        }
-        VfsQueryResult queryResult = repoQuery.execute(getLimit(controls));
-        return processResults(controls, queryResult, globalResults);
-    }
-
-    /**
-     * Searches and aggregates results of closed properties
-     *
-     * @param closedPropertyKeys Keys to search through
-     */
-    @SuppressWarnings({"WhileLoopReplaceableByForEach"})
-    private long executeClosedPropSearch(PropertySearchControls controls,
-            Set<String> closedPropertyKeys,
-            Set<PropertySearchResult> globalResults) {
-        if (closedPropertyKeys.isEmpty()) {
-            return 0;
-        }
-        VfsQuery repoQuery = createQuery(controls).expectedResult(VfsQueryResultType.ANY_ITEM);
-        // TODO: Should support any boolean
-        for (String key : closedPropertyKeys) {
-            Set<String> values = controls.get(key);
-            for (String value : values) {
-                repoQuery.prop(key).comp(VfsComparatorType.EQUAL).val(value);
-            }
-        }
-        VfsQueryResult queryResult = repoQuery.execute(getLimit(controls));
-        return processResults(controls, queryResult, globalResults);
-    }
-
-    /**
-     * Processes, filters and aggregates query results into the global results list The filtering creates an AND like
-     * action. The first batch of results for the session automatically gets put in the global results list. Any batch
-     * of results after that is compared with the global list. If the new batch of results contains a result that does
-     * not exist in the global list, we discard it (Means the result does not fall under both searches, thus failing the
-     * AND requirement
-     *
-     * @param queryResult Result object
-     */
-    private long processResults(PropertySearchControls controls, VfsQueryResult queryResult,
-            Set<PropertySearchResult> globalResults) {
-        /**
-         * If the global results is empty (either first query made, or there were no results from queries executed up
-         * until now
-         */
-        boolean noGlobalResults = globalResults.isEmpty();
-        int limit = getLimit(controls);
-
-        long resultCount = 0L;
-        List<PropertySearchResult> currentSearchResults = Lists.newArrayList();
-        for (VfsQueryRow row : queryResult.getAllRows()) {
-            if (globalResults.size() >= limit) {
-                break;
-            }
-            ItemInfo item = row.getItem();
-            if (!isResultAcceptable(item.getRepoPath())) {
-                continue;
-            }
-
-            PropertySearchResult searchResult = new PropertySearchResult(item);
-
-            //Make sure that we don't get any double results
-            if (!currentSearchResults.contains(searchResult)) {
-                resultCount++;
-                currentSearchResults.add(searchResult);
-            }
-        }
-
-        /**
-         * If the global results list is empty, simply add all our results to set it as a comparison standard for the
-         * next set of results
-         */
-        if (noGlobalResults) {
-            globalResults.addAll(currentSearchResults);
-        } else {
-            //Create a copy of the global results so we can iterate and remove at the same time
-            ArrayList<PropertySearchResult> globalCopy = new ArrayList<>(globalResults);
-            for (PropertySearchResult globalResult : globalCopy) {
-                //If the received results do not exist in the global results, discard them
-                if (!currentSearchResults.contains(globalResult)) {
-                    globalResults.remove(globalResult);
-                    resultCount--;
-                }
-            }
-        }
-        return resultCount;
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/search/property/PropertySearcherAql.java b/backend/core/src/main/java/org/artifactory/search/property/PropertySearcherAql.java
deleted file mode 100644
index a83c44a..0000000
--- a/backend/core/src/main/java/org/artifactory/search/property/PropertySearcherAql.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.search.property;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Multimap;
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.property.PropertySearchControls;
-import org.artifactory.api.search.property.PropertySearchResult;
-import org.artifactory.aql.AqlConverts;
-import org.artifactory.aql.AqlService;
-import org.artifactory.aql.api.domain.sensitive.AqlApiItem;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.result.AqlEagerResult;
-import org.artifactory.aql.result.rows.AqlItem;
-import org.artifactory.search.SearcherBase;
-import org.artifactory.storage.spring.StorageContextHelper;
-
-import java.util.List;
-import java.util.Set;
-
-import static org.artifactory.aql.api.internal.AqlBase.*;
-import static org.artifactory.aql.model.AqlComparatorEnum.equals;
-
-/**
- * @author Gidi Shabat
- * @author Yossi Shaul
- */
-public class PropertySearcherAql extends SearcherBase<PropertySearchControls, PropertySearchResult> {
-
-    @Override
-    public ItemSearchResults<PropertySearchResult> doSearch(PropertySearchControls controls) {
-        Multimap<String, String> properties = controls.getProperties();
-
-        AqlBase.AndClause<AqlApiItem> and = and();
-        // Find files and folders
-        and.append(AqlApiItem.type().equal("any"));
-        // The artifact should exists in one of the repositories therefore the relation between the repos is OR
-        List<String> selectedRepoForSearch = controls.getSelectedRepoForSearch();
-        AqlBase.OrClause<AqlApiItem> or = or();
-        if (selectedRepoForSearch != null) {
-            for (String repoKey : selectedRepoForSearch) {
-                or.append(
-                        AqlApiItem.repo().equal(repoKey)
-                );
-            }
-        }
-        and.append(or);
-        Set<String> openness = controls.getPropertyKeysByOpenness(true);
-        for (String key : openness) {
-            for (String value : properties.get(key)) {
-                if (value == null || "*".equals(value.trim()) || StringUtils.isEmpty(value)) {
-                    createPropertyKeyCriteria(and, key);
-                } else {
-                    createPropertyCriteria(and, key, value);
-                }
-            }
-        }
-        Set<String> closeness = controls.getPropertyKeysByOpenness(false);
-        for (String key : closeness) {
-            for (String value : properties.get(key)) {
-                if (value == null) {
-                    and.append(
-                            AqlApiItem.property().key().equal(key)
-                    );
-                } else {
-                    and.append(
-                            AqlApiItem.property().property(key, equals, value)
-                    );
-                }
-            }
-        }
-        AqlApiItem aqlQuery = AqlApiItem.create().filter(and).limit(getLimit(controls));
-        AqlService aqlService = StorageContextHelper.get().beanForType(AqlService.class);
-        AqlEagerResult<AqlItem> result = aqlService.executeQueryEager(aqlQuery);
-        //Return global results list
-        long totalResultCount = result.getSize();
-        Set<PropertySearchResult> globalResults = Sets.newLinkedHashSet();
-        for (AqlItem aqlItem : result.getResults()) {
-            globalResults.add(new PropertySearchResult(AqlConverts.toFileInfo.apply(aqlItem)));
-        }
-
-        return new ItemSearchResults<>(Lists.newArrayList(globalResults), totalResultCount);
-    }
-
-    private void createPropertyCriteria(AndClause<AqlApiItem> and, String key, String value) {
-        CriteriaClause<AqlApiItem> keyCriteria;
-        CriteriaClause<AqlApiItem> valueCriteria;
-        if (key.contains("*") || key.contains("?")) {
-            keyCriteria = AqlApiItem.property().key().matches(key);
-        } else {
-            keyCriteria = AqlApiItem.property().key().equal(key);
-        }
-        if (value.contains("*") || value.contains("?")) {
-            valueCriteria = AqlApiItem.property().value().matches(value);
-        } else {
-            valueCriteria = AqlApiItem.property().value().equal(value);
-        }
-        and.append(
-                freezeJoin(
-                        and(
-                                keyCriteria,
-                                valueCriteria
-                        )
-                )
-        );
-    }
-
-    private void createPropertyKeyCriteria(AndClause<AqlApiItem> and, String key) {
-        if (key.contains("*") || key.contains("?")) {
-            and.append(
-                    AqlApiItem.property().key().matches(key)
-            );
-        } else {
-            and.append(
-                    AqlApiItem.property().key().equal(key)
-            );
-        }
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/search/stats/LastDownloadedSearcher.java b/backend/core/src/main/java/org/artifactory/search/stats/LastDownloadedSearcher.java
deleted file mode 100644
index cd02526..0000000
--- a/backend/core/src/main/java/org/artifactory/search/stats/LastDownloadedSearcher.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.search.stats;
-
-import com.google.common.collect.Lists;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.stats.StatsSearchControls;
-import org.artifactory.api.search.stats.StatsSearchResult;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.sapi.search.VfsQuery;
-import org.artifactory.sapi.search.VfsQueryResult;
-import org.artifactory.sapi.search.VfsQueryRow;
-import org.artifactory.schedule.TaskInterruptedException;
-import org.artifactory.schedule.TaskUtils;
-import org.artifactory.search.SearcherBase;
-
-import java.util.Calendar;
-import java.util.List;
-
-import static org.artifactory.sapi.search.VfsBoolType.AND;
-import static org.artifactory.sapi.search.VfsBoolType.OR;
-import static org.artifactory.sapi.search.VfsComparatorType.LOWER_THAN;
-import static org.artifactory.sapi.search.VfsComparatorType.NONE;
-import static org.artifactory.sapi.search.VfsQueryResultType.FILE;
-
-/**
- * @author Noam Y. Tenne
- */
-public class LastDownloadedSearcher extends SearcherBase<StatsSearchControls, StatsSearchResult> {
-
-    @Override
-    public ItemSearchResults<StatsSearchResult> doSearch(StatsSearchControls controls) {
-        Calendar since = controls.getDownloadedSince();
-        Calendar createdBefore = since;
-        if (controls.hasCreatedBefore()) {
-            createdBefore = controls.getCreatedBefore();
-        }
-
-        VfsQuery repoQuery = createQuery(controls)
-                .expectedResult(FILE)
-
-                .startGroup()
-                .prop("last_downloaded").comp(LOWER_THAN).val(since).nextBool(AND)
-                .prop("remote_last_downloaded").comp(LOWER_THAN).val(since)
-                .endGroup(OR)
-
-                .startGroup()
-                .prop("last_downloaded").comp(LOWER_THAN).val(since).nextBool(AND)
-                .prop("remote_last_downloaded").comp(NONE).nextBool(AND)
-                .endGroup(OR)
-
-                .startGroup()
-                .prop("last_downloaded").comp(NONE).nextBool(AND)
-                .prop("remote_last_downloaded").comp(LOWER_THAN).val(since).nextBool(OR)
-                .endGroup(OR)
-
-                .startGroup()
-                .prop("last_downloaded").comp(NONE).nextBool(AND)
-                .prop("remote_last_downloaded").comp(NONE).nextBool(AND)
-                .prop("created").comp(LOWER_THAN).val(createdBefore)
-                .endGroup();
-
-        VfsQueryResult queryResult = repoQuery.execute(getLimit(controls));
-
-        List<StatsSearchResult> results = Lists.newArrayList();
-        InternalRepositoryService repoService = getRepoService();
-        int iterationCount = 0;
-        for (VfsQueryRow row : queryResult.getAllRows()) {
-            ItemInfo item = row.getItem();
-            if ((++iterationCount % 10 == 0) && TaskUtils.pauseOrBreak()) {
-                throw new TaskInterruptedException();
-            }
-            LocalRepo localRepo = repoService.localOrCachedRepositoryByKey(item.getRepoKey());
-            if (localRepo == null || !isResultAcceptable(item.getRepoPath(), localRepo)) {
-                continue;
-            }
-
-            // TODO: Change the query to return the stats info
-            StatsSearchResult result =
-                    new StatsSearchResult(item, repoService.getStatsInfo(item.getRepoPath()));
-            results.add(result);
-        }
-        return new ItemSearchResults<>(results, queryResult.getCount());
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/AnonymousAuthenticationToken.java b/backend/core/src/main/java/org/artifactory/security/AnonymousAuthenticationToken.java
deleted file mode 100644
index 887dece..0000000
--- a/backend/core/src/main/java/org/artifactory/security/AnonymousAuthenticationToken.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.artifactory.factory.InfoFactoryHolder;
-import org.springframework.security.authentication.AbstractAuthenticationToken;
-
-import java.io.Serializable;
-
-/**
- * An authentication object to be used when needing authentication details for anonymous tasks
- *
- * @author Fred Simon
- */
-public class AnonymousAuthenticationToken extends AbstractAuthenticationToken implements Serializable {
-
-    /**
-     * Creates a token for the anonymous user
-     */
-    public AnonymousAuthenticationToken() {
-        super(SimpleUser.USER_GAS);
-    }
-
-    @Override
-    public Object getCredentials() {
-        return "";
-    }
-
-    @Override
-    public Object getPrincipal() {
-        return new SimpleUser(InfoFactoryHolder.get().createUser(UserInfo.ANONYMOUS));
-    }
-
-    @Override
-    public boolean isAuthenticated() {
-        return true;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/ArtifactorySid.java b/backend/core/src/main/java/org/artifactory/security/ArtifactorySid.java
deleted file mode 100644
index b326837..0000000
--- a/backend/core/src/main/java/org/artifactory/security/ArtifactorySid.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.springframework.util.Assert;
-
-/**
- * Artifactory security identity to be used for both users and groups.
- *
- * @author Yossi Shaul
- */
-public class ArtifactorySid {
-    private final String principal;
-    private final boolean group;
-
-    /**
-     * Created a new user or group security identity.
-     *
-     * @param principal The username or the group name
-     * @param group     True if this identity represents a group.
-     */
-    public ArtifactorySid(String principal, boolean group) {
-        Assert.notNull(principal, "Principal required");
-        this.principal = principal;
-        this.group = group;
-    }
-
-    /**
-     * @return The security identity (username or groupname)
-     */
-    public String getPrincipal() {
-        return principal;
-    }
-
-    public boolean isGroup() {
-        return group;
-    }
-
-    public boolean equals(Object other) {
-        if (this == other) {
-            return true;
-        }
-        if (other == null || getClass() != other.getClass()) {
-            return false;
-        }
-
-        ArtifactorySid sid = (ArtifactorySid) other;
-
-        if (group != sid.group) {
-            return false;
-        }
-        if (!principal.equals(sid.principal)) {
-            return false;
-        }
-
-        return true;
-    }
-
-    public int hashCode() {
-        int result;
-        result = principal.hashCode();
-        result = 31 * result + (group ? 1 : 0);
-        return result;
-    }
-
-    public String toString() {
-        return "ArtifactorySid[" + this.principal + ", isGroup: " + group + "]";
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/HaSystemAuthenticationToken.java b/backend/core/src/main/java/org/artifactory/security/HaSystemAuthenticationToken.java
deleted file mode 100644
index 6dda4a7..0000000
--- a/backend/core/src/main/java/org/artifactory/security/HaSystemAuthenticationToken.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2013 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.security;
-
-import com.google.common.collect.Sets;
-import org.artifactory.api.rest.constant.HaRestConstants;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.springframework.security.authentication.AbstractAuthenticationToken;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-
-import java.io.Serializable;
-import java.util.Set;
-
-/**
-* Authentication token for HA rest resources.
-* <p>see {@link HaRestConstants#ROLE_HA}
-*
-* @author mamo
-*/
-public class HaSystemAuthenticationToken extends AbstractAuthenticationToken implements Serializable {
-
-    public static final Set<GrantedAuthority> HA_ADMIN_GAS =
-            Sets.<GrantedAuthority>newHashSet(new SimpleGrantedAuthority(HaRestConstants.ROLE_HA));
-
-    /**
-     * Creates a token with the supplied array of authorities.
-     *
-     * @param authorities the collection of <tt>GrantedAuthority</tt>s for the principal represented by this
-     *                    authentication object.
-     */
-    public HaSystemAuthenticationToken() {
-        super(HA_ADMIN_GAS);
-    }
-
-    @Override
-    public Object getCredentials() {
-        return "";
-    }
-
-    @Override
-    public Object getPrincipal() {
-        MutableUserInfo user = InfoFactoryHolder.get().createUser(SecurityService.USER_SYSTEM);
-        user.setAdmin(true);
-        return new SimpleUser(user);
-    }
-
-    @Override
-    public boolean isAuthenticated() {
-        return true;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/InternalRealmAwareAuthentication.java b/backend/core/src/main/java/org/artifactory/security/InternalRealmAwareAuthentication.java
deleted file mode 100644
index 151d4cd..0000000
--- a/backend/core/src/main/java/org/artifactory/security/InternalRealmAwareAuthentication.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.artifactory.security.db.DbAuthenticationProvider;
-import org.springframework.security.core.GrantedAuthority;
-
-import java.util.Collection;
-
-/**
- * @author Tomer Cohen
- */
-public class InternalRealmAwareAuthentication extends RealmAwareUserPassAuthenticationToken {
-
-    public InternalRealmAwareAuthentication(Object principal, Object credentials) {
-        super(principal, credentials);
-    }
-
-    public InternalRealmAwareAuthentication(Object principal, Object credentials,
-            Collection<? extends GrantedAuthority> authorities) {
-        super(principal, credentials, authorities);
-    }
-
-    @Override
-    public String getRealm() {
-        return DbAuthenticationProvider.INTERNAL_REALM;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/InternalSecurityService.java b/backend/core/src/main/java/org/artifactory/security/InternalSecurityService.java
deleted file mode 100644
index a3d26eb..0000000
--- a/backend/core/src/main/java/org/artifactory/security/InternalSecurityService.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.artifactory.api.security.AclService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.spring.ReloadableBean;
-
-/**
- * @author yoavl
- */
-public interface InternalSecurityService extends ReloadableBean,
-        AuthorizationService, UserGroupService, AclService, SecurityService {
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/MasterEncryptionServiceImpl.java b/backend/core/src/main/java/org/artifactory/security/MasterEncryptionServiceImpl.java
deleted file mode 100644
index 9863aeb..0000000
--- a/backend/core/src/main/java/org/artifactory/security/MasterEncryptionServiceImpl.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.security.MasterEncryptionService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.layout.EncryptConfigurationInterceptor;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.security.interceptor.MissionControlEncryptInterceptor;
-import org.artifactory.security.interceptor.StoragePropertiesEncryptInterceptor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-/**
- * Implementation of the master encryption service based on symmetric key and Base58 encoding.
- *
- * @author Yossi Shaul
- */
- at Service
-public class MasterEncryptionServiceImpl implements MasterEncryptionService {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void encrypt() {
-        AccessLogger.approved("Encrypting with master encryption key");
-        // Create the master key if needed
-        if (!CryptoHelper.hasMasterKey()) {
-            CryptoHelper.createMasterKeyFile();
-        }
-        StoragePropertiesEncryptInterceptor storagePropertiesEncryptInterceptor = new StoragePropertiesEncryptInterceptor();
-        storagePropertiesEncryptInterceptor.encryptOrDecryptStoragePropertiesFile(true);
-        MissionControlEncryptInterceptor missionControlEncryptInterceptor=new MissionControlEncryptInterceptor();
-        missionControlEncryptInterceptor.encryptOrDecryptMissionControlPropertiesFile(true);
-        // config interceptor will encrypt the config before it is saved to the database
-        MutableCentralConfigDescriptor mutableDescriptor = centralConfigService.getMutableDescriptor();
-        centralConfigService.saveEditedDescriptorAndReload(mutableDescriptor);
-    }
-
-    @Override
-    public void decrypt() {
-        if (!CryptoHelper.hasMasterKey()) {
-            throw new IllegalStateException("Cannot decrypt without master key file");
-        }
-        AccessLogger.approved("Decrypting with master encryption key");
-        MutableCentralConfigDescriptor mutableDescriptor = centralConfigService.getMutableDescriptor();
-        StoragePropertiesEncryptInterceptor storagePropertiesEncryptInterceptor = new StoragePropertiesEncryptInterceptor();
-        storagePropertiesEncryptInterceptor.encryptOrDecryptStoragePropertiesFile(false);
-        MissionControlEncryptInterceptor missionControlEncryptInterceptor=new MissionControlEncryptInterceptor();
-        missionControlEncryptInterceptor.encryptOrDecryptMissionControlPropertiesFile(false);
-        EncryptConfigurationInterceptor.decrypt(mutableDescriptor);
-        CryptoHelper.removeMasterKeyFile();
-        centralConfigService.saveEditedDescriptorAndReload(mutableDescriptor);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/PasswordDecryptingManager.java b/backend/core/src/main/java/org/artifactory/security/PasswordDecryptingManager.java
deleted file mode 100644
index b91bb0e..0000000
--- a/backend/core/src/main/java/org/artifactory/security/PasswordDecryptingManager.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.security.PasswordSettings;
-import org.artifactory.descriptor.security.SecurityDescriptor;
-import org.artifactory.security.crypto.ArtifactoryBase58;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.security.db.apikey.PropsAuthenticationProvider;
-import org.artifactory.security.props.auth.ApiKeyManager;
-import org.artifactory.security.props.auth.PropsAuthenticationToken;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.AuthenticationException;
-
-import javax.crypto.SecretKey;
-import java.security.KeyPair;
-
-/**
- * This authentication manager will decrypted any encrypted passwords according to the password and encryption policy
- * and delegate the authentication to a standard authentication provider.
- *
- * @author Yossi Shaul
- */
-public class PasswordDecryptingManager implements AuthenticationManager {
-    private static final Logger log = LoggerFactory.getLogger(PasswordDecryptingManager.class);
-
-    private AuthenticationManager delegate;
-
-    private PropsAuthenticationProvider delegateProps;
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Autowired
-    private UserGroupService userGroupService;
-
-    @Autowired
-    SecurityService securityService;
-
-    /**
-     * Attempts to authenticate the passed {@link Authentication} object, returning a fully populated
-     * <code>Authentication</code> object (including granted authorities) if successful.
-     * <p>
-     * An <code>AuthenticationManager</code> must honour the following contract concerning exceptions:
-     * <ul>
-     * <li>A {@link org.springframework.security.authentication.DisabledException} must be thrown if an account is disabled and the
-     * <code>AuthenticationManager</code> can test for this state.</li>
-     * <li>A {@link org.springframework.security.authentication.LockedException} must be thrown if an account is locked and the
-     * <code>AuthenticationManager</code> can test for account locking.</li>
-     * <li>A {@link org.springframework.security.authentication.BadCredentialsException} must be thrown if incorrect credentials are presented. Whilst the
-     * above exceptions are optional, an <code>AuthenticationManager</code> must <B>always</B> test credentials.</li>
-     * </ul>
-     * Exceptions should be tested for and if applicable thrown in the order expressed above (i.e. if an
-     * account is disabled or locked, the authentication request is immediately rejected and the credentials testing
-     * process is not performed). This prevents credentials being tested against  disabled or locked accounts.
-     *
-     * @param authentication the authentication request object
-     *
-     * @return a fully authenticated object including credentials
-     *
-     * @throws AuthenticationException if authentication fails
-     */
-    @Override
-    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
-        log.trace("Received authentication request for {}", authentication);
-        String password = authentication.getCredentials().toString();
-        Object principal = authentication.getPrincipal();
-        String username = null;
-        if (principal != null) {
-            username = principal.toString();
-        }
-
-        if (authentication instanceof PropsAuthenticationToken) {
-            return delegateProps.authenticate(authentication);
-        }
-
-        boolean isApiKey = CryptoHelper.isApiKey(password);
-        if (isApiKey) {
-            if (!(authentication instanceof PropsAuthenticationToken)) {
-                // The API Key is used as a password => Transforming the token
-                authentication = new PropsAuthenticationToken(username, ApiKeyManager.API_KEY, password, null);
-            }
-        } else {
-            if (needsDecryption(password, (authentication instanceof InternalUsernamePasswordAuthenticationToken))) {
-                log.trace("Decrypting user password for user '{}'", username);
-                password = decryptPassword(password, username);
-                authentication = new UsernamePasswordAuthenticationToken(username, password);
-                ((UsernamePasswordAuthenticationToken)authentication).setDetails(authentication.getDetails());
-            }
-        }
-
-        if (authentication instanceof PropsAuthenticationToken) {
-            return delegateProps.authenticate(authentication);
-        } else {
-            return delegate.authenticate(authentication);
-        }
-    }
-
-    private boolean needsDecryption(String password, boolean internalRequest) {
-        CentralConfigDescriptor centralConfigDescriptor = centralConfigService.getDescriptor();
-        SecurityDescriptor securityDescriptor = centralConfigDescriptor.getSecurity();
-        PasswordSettings passwordSettings = securityDescriptor.getPasswordSettings();
-        boolean encryptionEnabled = passwordSettings.isEncryptionEnabled();
-        if (!encryptionEnabled) {
-            return false;
-        }
-        boolean isEncrypted = CryptoHelper.isPasswordEncrypted(password);
-
-        log.trace("Detected {} password", isEncrypted ? "encrypted" : "cleartext");
-        if (!isEncrypted) {
-            if (!internalRequest && passwordSettings.isEncryptionRequired()) {
-                log.debug("Cleartext passwords not allowed. Sending unauthorized response");
-                throw new PasswordEncryptionException("Artifactory configured to accept only " +
-                        "encrypted passwords but received a clear text password.");
-            } else {
-                return false;
-            }
-        }
-        log.trace("Password needs decryption");
-        return true;
-    }
-
-    private String decryptPassword(String encryptedPassword, String username) {
-        if (!CryptoHelper.isPasswordEncrypted(encryptedPassword)) {
-            throw new IllegalArgumentException("Password not encrypted");
-        }
-
-        KeyPair keyPair = getKeyPair(username);
-        SecretKey secretKey = CryptoHelper.generatePbeKeyFromKeyPair(keyPair);
-        try {
-            return CryptoHelper.decryptSymmetric(encryptedPassword, secretKey, false);
-        } catch (Exception e) {
-            log.debug("Failed to decrypt user password: " + e.getMessage());
-            throw new PasswordEncryptionException("Failed to decrypt password.", e);
-        }
-    }
-    private String decryptApiKey(String apiPassword) {
-        return new String(ArtifactoryBase58.extractBytes(apiPassword));
-    }
-
-    private KeyPair getKeyPair(String username) {
-        UserInfo userInfo = userGroupService.findUser(username);
-        String privateKey = userInfo.getPrivateKey();
-        String publicKey = userInfo.getPublicKey();
-        if (privateKey == null || publicKey == null) {
-            String message = "User with no key pair tries to authenticate with encrypted password.";
-            log.trace(message);
-            throw new PasswordEncryptionException(message);
-        }
-
-        return CryptoHelper.createKeyPair(privateKey, publicKey, false);
-    }
-
-    public void setDelegate(AuthenticationManager delegate) {
-        this.delegate = delegate;
-    }
-
-    public void setDelegateProps(PropsAuthenticationProvider delegateProps) {
-        this.delegateProps = delegateProps;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/PasswordEncryptionException.java b/backend/core/src/main/java/org/artifactory/security/PasswordEncryptionException.java
deleted file mode 100644
index 59cf68f..0000000
--- a/backend/core/src/main/java/org/artifactory/security/PasswordEncryptionException.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.springframework.security.core.AuthenticationException;
-
-/**
- * Thrown when Artifactory configured to support encrypted passwords and the authentication manager failed to decrypt.
- *
- * @author Yossi Shaul
- */
-public class PasswordEncryptionException extends AuthenticationException {
-    public PasswordEncryptionException(String message) {
-        super(message);
-    }
-
-    public PasswordEncryptionException(String message, Exception cause) {
-        super(message, cause);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/RealmAwareAuthentication.java b/backend/core/src/main/java/org/artifactory/security/RealmAwareAuthentication.java
deleted file mode 100644
index 3cf4f6c..0000000
--- a/backend/core/src/main/java/org/artifactory/security/RealmAwareAuthentication.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.springframework.security.core.Authentication;
-
-/**
- * An {@link org.springframework.security.core.Authentication} object, that knows which realm it came from
- *
- * @author Tomer Cohen
- */
-public interface RealmAwareAuthentication extends Authentication {
-
-    /**
-     * @return Get the realm that this authentication came from.
-     */
-    String getRealm();
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/RealmAwareAuthenticationManager.java b/backend/core/src/main/java/org/artifactory/security/RealmAwareAuthenticationManager.java
deleted file mode 100644
index 6a4c82d..0000000
--- a/backend/core/src/main/java/org/artifactory/security/RealmAwareAuthenticationManager.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import com.google.common.collect.Maps;
-import org.artifactory.api.security.UserAwareAuthenticationProvider;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.authentication.AuthenticationProvider;
-import org.springframework.security.authentication.ProviderManager;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.AuthenticationException;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * An authentication manager that has realm-aware auth providers.
- *
- * @author Tomer Cohen
- */
-public class RealmAwareAuthenticationManager extends ProviderManager implements UserAwareAuthenticationProvider {
-    private static final Logger log = LoggerFactory.getLogger(RealmAwareAuthenticationManager.class);
-
-    @Autowired
-    private UserGroupService userGroupService;
-
-    private Map<String, RealmAwareAuthenticationProvider> realmAwareAuthenticationProviders = Maps.newHashMap();
-
-    public RealmAwareAuthenticationManager(List<AuthenticationProvider> providers) {
-        super(providers);
-        providers.stream()
-                .filter(provider -> provider instanceof RealmAwareAuthenticationProvider)
-                .forEach(provider -> addRealmAwareAuthenticationProvider((RealmAwareAuthenticationProvider) provider));
-    }
-
-    /**
-     * {@inheritDoc}
-     * <p/>
-     * After the user has been authenticated, it will be updated with the appropriate <i>realm</i> that it came from.
-     */
-    @Override
-    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
-        Authentication result = super.authenticate(authentication);
-        if (result instanceof RealmAwareAuthentication) {
-            RealmAwareAuthentication realmAwareAuthentication = (RealmAwareAuthentication) result;
-            String realm = realmAwareAuthentication.getRealm();
-            log.debug("Authentication '{}' has realm '{}'", authentication, realm);
-            UserInfo user =
-                    userGroupService.findOrCreateExternalAuthUser(authentication.getPrincipal().toString(), true);
-            if (!user.isTransientUser() && !user.isAnonymous() && !realm.equals(user.getRealm())) {
-                MutableUserInfo mutableUser = InfoFactoryHolder.get().copyUser(user);
-                mutableUser.setRealm(realm);
-                log.debug("Updating user '{}' with realm '{}'", user, realm);
-                // lock the update transaction.
-                // If trying to access this concurrently, a TransactionSystemException may occur.
-                // see RTFACT-3883
-                synchronized (this) {
-                    userGroupService.updateUser(mutableUser, false);
-                }
-            }
-        }
-        return result;
-    }
-
-    @Override
-    public boolean userExists(String userName, String realm) {
-        RealmAwareAuthenticationProvider provider = getAuthenticationProvider(realm);
-        return provider != null && provider.userExists(userName);
-    }
-
-    @Override
-    public void addExternalGroups(String userName, String realm, Set<UserGroupInfo> groups) {
-        RealmAwareAuthenticationProvider provider = getAuthenticationProvider(realm);
-        if (provider == null) {
-            return;
-        }
-        provider.addExternalGroups(userName, groups);
-    }
-
-    public void addRealmAwareAuthenticationProvider(RealmAwareAuthenticationProvider provider) {
-        realmAwareAuthenticationProviders.put(provider.getRealm(), provider);
-    }
-
-    private RealmAwareAuthenticationProvider getAuthenticationProvider(String realm) {
-        return realmAwareAuthenticationProviders.get(realm);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/RealmAwareAuthenticationProvider.java b/backend/core/src/main/java/org/artifactory/security/RealmAwareAuthenticationProvider.java
deleted file mode 100644
index 0897762..0000000
--- a/backend/core/src/main/java/org/artifactory/security/RealmAwareAuthenticationProvider.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.springframework.security.authentication.AuthenticationProvider;
-
-import java.util.Set;
-
-/**
- * A realm-aware auth providers.
- *
- * @author Tomer Cohen
- */
-public interface RealmAwareAuthenticationProvider extends AuthenticationProvider {
-    /**
-     * @return The realm of the authentication provider.
-     */
-    String getRealm();
-
-    /**
-     * Add the external groups to the user by the specific realm that the user came from. If the user came from LDAP
-     * then it will be populated by LDAP groups, same for Crowd.
-     *
-     * @param username The username for which to populate in the realm
-     * @param groups   The initial groups that belongs to the username, and that the external groups should be added
-     *                 to.
-     */
-    public void addExternalGroups(String username, Set<UserGroupInfo> groups);
-
-    /**
-     * @param userName The username to check that it exists.
-     * @return True if the user exists in the realm.
-     */
-    boolean userExists(String userName);
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/RealmAwareUserPassAuthenticationToken.java b/backend/core/src/main/java/org/artifactory/security/RealmAwareUserPassAuthenticationToken.java
deleted file mode 100644
index 84a4fe4..0000000
--- a/backend/core/src/main/java/org/artifactory/security/RealmAwareUserPassAuthenticationToken.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright 2012 JFrog Ltd. All rights reserved.
- * JFROG PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
- */
-
-package org.artifactory.security;
-
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.GrantedAuthority;
-
-import java.util.Collection;
-
-public abstract class RealmAwareUserPassAuthenticationToken extends UsernamePasswordAuthenticationToken
-        implements RealmAwareAuthentication {
-
-    public RealmAwareUserPassAuthenticationToken(Object principal, Object credentials) {
-        super(principal, credentials);
-    }
-
-    public RealmAwareUserPassAuthenticationToken(Object principal, Object credentials,
-            Collection<? extends GrantedAuthority> authorities) {
-        super(principal, credentials, authorities);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/SecurityServiceImpl.java b/backend/core/src/main/java/org/artifactory/security/SecurityServiceImpl.java
deleted file mode 100644
index 8be7268..0000000
--- a/backend/core/src/main/java/org/artifactory/security/SecurityServiceImpl.java
+++ /dev/null
@@ -1,2442 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import com.google.common.base.Charsets;
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import com.thoughtworks.xstream.XStream;
-import org.apache.commons.codec.binary.Base64;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.CoreAddons;
-import org.artifactory.addon.HaAddon;
-import org.artifactory.addon.ha.message.HaMessageTopic;
-import org.artifactory.addon.sso.HttpSsoAddon;
-import org.artifactory.addon.sso.saml.SamlSsoAddon;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.config.ExportSettingsImpl;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.mail.MailService;
-import org.artifactory.api.security.*;
-import org.artifactory.api.security.ldap.LdapService;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.common.Info;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.config.ConfigurationException;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.repo.LocalCacheRepoDescriptor;
-import org.artifactory.descriptor.security.PasswordExpirationPolicy;
-import org.artifactory.descriptor.security.SecurityDescriptor;
-import org.artifactory.descriptor.security.UserLockPolicy;
-import org.artifactory.descriptor.security.ldap.LdapSetting;
-import org.artifactory.descriptor.security.oauth.OAuthSettings;
-import org.artifactory.descriptor.security.sso.HttpSsoSettings;
-import org.artifactory.descriptor.security.sso.SamlSettings;
-import org.artifactory.exception.InvalidNameException;
-import org.artifactory.exception.ValidationException;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.model.xstream.security.ImmutableAclInfo;
-import org.artifactory.repo.*;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.repo.trash.TrashService;
-import org.artifactory.repo.virtual.VirtualRepo;
-import org.artifactory.sapi.common.ExportSettings;
-import org.artifactory.sapi.common.ImportSettings;
-import org.artifactory.sapi.security.SecurityConstants;
-import org.artifactory.schedule.CachedThreadPoolTaskExecutor;
-import org.artifactory.schedule.TaskBase;
-import org.artifactory.schedule.TaskService;
-import org.artifactory.schedule.TaskUtils;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.security.exceptions.LoginDisabledException;
-import org.artifactory.security.exceptions.PasswordChangeException;
-import org.artifactory.security.exceptions.PasswordExpireException;
-import org.artifactory.security.exceptions.UserLockedException;
-import org.artifactory.security.interceptor.SecurityConfigurationChangesInterceptors;
-import org.artifactory.security.jobs.CredentialsWatchJob;
-import org.artifactory.security.jobs.PasswordExpireNotificationJob;
-import org.artifactory.security.props.auth.DockerTokenManager;
-import org.artifactory.security.props.auth.PropsAuthenticationToken;
-import org.artifactory.security.providermgr.ArtifactoryTokenProvider;
-import org.artifactory.spring.InternalArtifactoryContext;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.storage.StorageException;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.db.security.service.UserGroupServiceImpl;
-import org.artifactory.storage.security.service.AclStoreService;
-import org.artifactory.storage.security.service.UserGroupStoreService;
-import org.artifactory.update.security.SecurityInfoReader;
-import org.artifactory.update.security.SecurityVersion;
-import org.artifactory.util.*;
-import org.artifactory.version.CompoundVersionDetails;
-import org.joda.time.DateTime;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationContext;
-import org.springframework.security.authentication.encoding.PasswordEncoder;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import javax.crypto.SecretKey;
-import java.io.*;
-import java.security.KeyPair;
-import java.sql.SQLException;
-import java.text.DateFormat;
-import java.text.MessageFormat;
-import java.text.SimpleDateFormat;
-import java.util.*;
-import java.util.concurrent.Callable;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-
- at Service
- at Reloadable(beanClass = InternalSecurityService.class, initAfter = {DbService.class})
-public class SecurityServiceImpl implements InternalSecurityService {
-    private static final Logger log = LoggerFactory.getLogger(SecurityServiceImpl.class);
-
-    private static final String DELETE_FOR_SECURITY_MARKER_FILENAME = ".deleteForSecurityMarker";
-
-    // cache meaning  <userName, incorrect-login-timestampts>
-    private final Cache<String, List<Long>> unknownUsersCache = CacheBuilder.newBuilder().maximumSize(UserGroupServiceImpl.MAX_USERS_TO_TRACK).
-            expireAfterWrite(1, TimeUnit.HOURS).build();
-    @Autowired
-    DockerTokenManager dockerTokenManager;
-    @Autowired
-    private PasswordEncoder passwordEncoder;
-    @Autowired
-    private AclStoreService aclStoreService;
-    @Autowired
-    private UserGroupStoreService userGroupStoreService;
-    @Autowired
-    private CentralConfigService centralConfig;
-    @Autowired
-    private InternalRepositoryService repositoryService;
-    @Autowired
-    private MailService mailService;
-    @Autowired
-    private AddonsManager addons;
-    @Autowired
-    private LdapService ldapService;
-    @Autowired
-    private SecurityConfigurationChangesInterceptors interceptors;
-    @Autowired
-    private CachedThreadPoolTaskExecutor executor;
-    @Autowired
-    private TaskService taskService;
-    private InternalArtifactoryContext context;
-
-    private TreeSet<SecurityListener> securityListeners = new TreeSet<>();
-
-    /**
-     * @param user The authentication token.
-     * @return An array of sids of the current user and all it's groups.
-     */
-    private static Set<ArtifactorySid> getUserEffectiveSids(SimpleUser user) {
-        Set<ArtifactorySid> sids = new HashSet<>(2);
-        Set<UserGroupInfo> groups = user.getDescriptor().getGroups();
-        // add the current user
-        sids.add(new ArtifactorySid(user.getUsername(), false));
-        // add all the groups the user is a member of
-        for (UserGroupInfo group : groups) {
-            sids.add(new ArtifactorySid(group.getGroupName(), true));
-        }
-        return sids;
-    }
-
-    private static boolean isAdmin(Authentication authentication) {
-        return isAuthenticated(authentication) && getSimpleUser(authentication).isAdmin();
-    }
-
-    private static boolean isAuthenticated(Authentication authentication) {
-        return authentication != null && authentication.isAuthenticated();
-    }
-
-    private static SimpleUser getSimpleUser(Authentication authentication) {
-        return (SimpleUser) authentication.getPrincipal();
-    }
-
-    private static boolean matches(PermissionTargetInfo aclPermissionTarget, String path, boolean folder) {
-        return PathMatcher.matches(path, aclPermissionTarget.getIncludes(), aclPermissionTarget.getExcludes(), folder);
-    }
-
-    private static XStream getXstream() {
-        return InfoFactoryHolder.get().getSecurityXStream();
-    }
-
-    @Autowired
-    private void setApplicationContext(ApplicationContext context) throws BeansException {
-        this.context = (InternalArtifactoryContext) context;
-    }
-
-    @Override
-    public void init() {
-        // if we need to dump the current security config (.deleteForSecurityMarker doesn't exist)
-        // and unlock all admin users
-        if (shouldRestoreLoginCapabilities()) {
-            dumpCurrentSecurityConfig();
-            unlockAdminUsers();
-        }
-
-        //Locate and import external configuration file
-        checkForExternalConfiguration();
-        CoreAddons coreAddon = addons.addonByType(CoreAddons.class);
-        if (coreAddon.isCreateDefaultAdminAccountAllowed() && !userGroupStoreService.adminUserExists()) {
-            createDefaultAdminUser();
-        }
-        createDefaultAnonymousUser();
-
-        // start CredentialsWatchJob
-        TaskBase credentialsWatchJob = TaskUtils.createRepeatingTask(CredentialsWatchJob.class,
-                TimeUnit.SECONDS.toMillis(ConstantValues.passwordExpireJobIntervalSecs.getLong()),
-                TimeUnit.SECONDS.toMillis(30l));
-        taskService.startTask(credentialsWatchJob, false);
-
-        // start PasswordExpireNotificationJob
-        TaskBase passwordExpireNotificationJob = TaskUtils.createRepeatingTask(PasswordExpireNotificationJob.class,
-                TimeUnit.SECONDS.toMillis(ConstantValues.passwordExpireNotificationJobIntervalSecs.getLong()),
-                TimeUnit.SECONDS.toMillis(60l));
-        taskService.startTask(passwordExpireNotificationJob, false);
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-        // Need to check if security conf changed then clear security caches
-        if (!centralConfig.getDescriptor().getSecurity().equals(oldDescriptor.getSecurity())) {
-            clearSecurityListeners();
-        }
-    }
-
-    @Override
-    public void destroy() {
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-
-    }
-
-    private void dumpCurrentSecurityConfig() {
-
-        File etcDir = ArtifactoryHome.get().getEtcDir();
-        ExportSettingsImpl exportSettings = new ExportSettingsImpl(etcDir);
-
-        DateFormat formatter = new SimpleDateFormat("yyyyMMdd.HHmmss");
-        String timestamp = formatter.format(exportSettings.getTime());
-        String fileName = "security." + timestamp + ".xml";
-        exportSecurityInfo(exportSettings, fileName);
-        log.debug("Successfully dumped '{}' configuration file to '{}'", fileName, etcDir.getAbsolutePath());
-
-        createSecurityDumpMarkerFile();
-    }
-
-    /**
-     * @return true if SecurityDumpMarkerFile is unavailable
-     *         otherwise false
-     */
-    private boolean shouldRestoreLoginCapabilities() {
-        File deleteForConsistencyFix = getSecurityDumpMarkerFile();
-        if (deleteForConsistencyFix.exists())
-            return false;
-        return true;
-    }
-
-    /**
-     * Creates/recreates the file that enabled security descriptor dump.
-     * Also checks we have proper write access to the data folder.
-     *
-     * @return true if the deleteForSecurityMarker file did not exist and was created
-     */
-    private void createSecurityDumpMarkerFile() {
-        File securityDumpMarkerFile = getSecurityDumpMarkerFile();
-        try {
-            securityDumpMarkerFile.createNewFile();
-        } catch (IOException e) {
-            log.debug("Could not create file: '" + securityDumpMarkerFile.getAbsolutePath() + "'.", e);
-        }
-    }
-
-    private File getSecurityDumpMarkerFile() {
-        return new File(ArtifactoryHome.get().getDataDir(), DELETE_FOR_SECURITY_MARKER_FILENAME);
-    }
-
-    /**
-     * Checks for an externally supplied configuration file ($ARTIFACTORY_HOME/etc/security.xml). If such a file is
-     * found, it will be deserialized to a security info (descriptor) object and imported to the system. This option is
-     * to be used in cases like when an administrator is locked out of the system, etc'.
-     */
-    private void checkForExternalConfiguration() {
-        ArtifactoryContext ctx = ContextHelper.get();
-        final File etcDir = ctx.getArtifactoryHome().getEtcDir();
-        final File configurationFile = new File(etcDir, "security.import.xml");
-        //Work around Jackrabbit state visibility issues within the same tx by forking a separate tx (RTFACT-4526)
-        Callable callable = new Callable() {
-            @Override
-            public Object call() throws Exception {
-
-                String configAbsolutePath = configurationFile.getAbsolutePath();
-                if (configurationFile.isFile()) {
-                    if (!configurationFile.canRead() || !configurationFile.canWrite()) {
-                        throw new ConfigurationException(
-                                "Insufficient permissions. Security configuration import requires " +
-                                        "both read and write permissions for " + configAbsolutePath
-                        );
-                    }
-                    try {
-                        SecurityInfo descriptorToSave = new SecurityInfoReader().read(configurationFile);
-                        //InternalSecurityService txMe = ctx.beanForType(InternalSecurityService.class);
-                        getAdvisedMe().importSecurityData(descriptorToSave);
-                        Files
-                                .switchFiles(configurationFile, new File(etcDir, "security.bootstrap.xml"));
-                        log.info("Security configuration imported successfully from " + configAbsolutePath + ".");
-                    } catch (Exception e) {
-                        throw new IllegalArgumentException("An error has occurred while deserializing the file " +
-                                configAbsolutePath +
-                                ". Please assure it's validity or remove it from the 'etc' folder.", e);
-                    }
-                }
-                return null;
-            }
-        };
-        @SuppressWarnings("unchecked") Future<Set<String>> future = executor.submit(callable);
-        try {
-            future.get();
-        } catch (Exception e) {
-            throw new RuntimeException("Could not import external security config.", e);
-        }
-    }
-
-    @Override
-    public boolean isAnonymous() {
-        Authentication authentication = AuthenticationHelper.getAuthentication();
-        return authentication != null && isAnonymousUser(authentication.getName());
-    }
-
-    @Override
-    public boolean requireProfileUnlock() {
-        SecurityDescriptor security = ContextHelper.get().getCentralConfig().getDescriptor().getSecurity();
-        HttpSsoSettings httpSsoSettings = security.getHttpSsoSettings();
-        boolean allowUserToAccessProfileSso = httpSsoSettings == null ? false : httpSsoSettings.isAllowUserToAccessProfile();
-        SamlSettings samlSettings = security.getSamlSettings();
-        boolean allowUserToAccessProfileSaml = samlSettings == null ? false : samlSettings.isAllowUserToAccessProfile();
-        OAuthSettings oauthSettings = security.getOauthSettings();
-        boolean allowUserToAccessProfileOauth = oauthSettings == null ? false : oauthSettings.isAllowUserToAccessProfile();
-        Authentication authentication = AuthenticationHelper.getAuthentication();
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        SamlSsoAddon samlSsoAddon = addonsManager.addonByType(SamlSsoAddon.class);
-        HttpSsoAddon httpSsoAddon = addonsManager.addonByType(HttpSsoAddon.class);
-        if ((authentication instanceof PropsAuthenticationToken && allowUserToAccessProfileOauth) ||
-                (samlSsoAddon.isSamlAuthentication() && allowUserToAccessProfileSaml) ||
-                (httpSsoAddon.isHttpSsoAuthentication() && allowUserToAccessProfileSso)) {
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public boolean requireProfilePassword() {
-        UserGroupService userGroupService = ContextHelper.get().beanForType(UserGroupService.class);
-        UserInfo userInfo = userGroupService.findUser(currentUsername(), false);
-        boolean userHasPassword = false;
-        if (userInfo != null && userInfo.getPassword() != null) {
-            userHasPassword = userInfo.getPassword().length() > 0;
-        }
-        SecurityDescriptor security = ContextHelper.get().getCentralConfig().getDescriptor().getSecurity();
-        HttpSsoSettings httpSsoSettings = security.getHttpSsoSettings();
-        boolean allowUserToAccessProfileSso = httpSsoSettings == null ? false : httpSsoSettings.isAllowUserToAccessProfile();
-        SamlSettings samlSettings = security.getSamlSettings();
-        boolean allowUserToAccessProfileSaml = samlSettings == null ? false : samlSettings.isAllowUserToAccessProfile();
-        OAuthSettings oauthSettings = security.getOauthSettings();
-        boolean allowUserToAccessProfileOauth = oauthSettings == null ? false : oauthSettings.isAllowUserToAccessProfile();
-        Authentication authentication = AuthenticationHelper.getAuthentication();
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        SamlSsoAddon samlSsoAddon = addonsManager.addonByType(SamlSsoAddon.class);
-        HttpSsoAddon httpSsoAddon = addonsManager.addonByType(HttpSsoAddon.class);
-        if (doNotRequirePasswordFromExtUser(userHasPassword, allowUserToAccessProfileSso,
-                allowUserToAccessProfileSaml, allowUserToAccessProfileOauth,
-                authentication, samlSsoAddon, httpSsoAddon)) {
-            return false;
-        }
-        return true;
-    }
-
-    private boolean doNotRequirePasswordFromExtUser(boolean userHasPassword, boolean allowUserToAccessProfileSso, boolean allowUserToAccessProfileSaml, boolean allowUserToAccessProfileOauth, Authentication authentication, SamlSsoAddon samlSsoAddon, HttpSsoAddon httpSsoAddon) {
-        return ((authentication instanceof PropsAuthenticationToken && !allowUserToAccessProfileOauth) ||
-                (samlSsoAddon.isSamlAuthentication() && !allowUserToAccessProfileSaml) ||
-                (httpSsoAddon.isHttpSsoAuthentication() && !allowUserToAccessProfileSso)) && !userHasPassword;
-    }
-
-
-    @Override
-    public boolean isAnonAccessEnabled() {
-        SecurityDescriptor security = centralConfig.getDescriptor().getSecurity();
-        return security.isAnonAccessEnabled();
-    }
-
-    private boolean isAnonBuildInfoAccessDisabled() {
-        SecurityDescriptor security = centralConfig.getDescriptor().getSecurity();
-        return security.isAnonAccessToBuildInfosDisabled();
-    }
-
-    @Override
-    public boolean isAnonUserAndAnonBuildInfoAccessDisabled() {
-        return isAnonymous() && isAnonBuildInfoAccessDisabled();
-    }
-
-    @Override
-    public boolean isAuthenticated() {
-        Authentication authentication = AuthenticationHelper.getAuthentication();
-        return isAuthenticated(authentication);
-    }
-
-    @Override
-    public boolean isAdmin() {
-        Authentication authentication = AuthenticationHelper.getAuthentication();
-        return isAdmin(authentication);
-    }
-
-    @Override
-    public void createAcl(MutableAclInfo aclInfo) {
-        assertAdmin();
-        if (StringUtils.isEmpty(aclInfo.getPermissionTarget().getName())) {
-            throw new IllegalArgumentException("ACL name cannot be null");
-        }
-
-        MutableAclInfo compatibleAcl = makeNewAclRemoteRepoKeysAclCompatible(aclInfo);
-        cleanupAclInfo(compatibleAcl);
-        aclStoreService.createAcl(compatibleAcl);
-        interceptors.onPermissionsAdd();
-        addons.addonByType(HaAddon.class).notify(HaMessageTopic.ACL_CHANGE_TOPIC, null);
-    }
-
-    @Override
-    public void updateAcl(MutableAclInfo acl) {
-        //If the editing user is not a sys-admin
-        if (!isAdmin()) {
-            //Assert that no unauthorized modifications were performed
-            validateUnmodifiedPermissionTarget(acl.getPermissionTarget());
-        }
-
-        MutableAclInfo compatibleAcl = makeNewAclRemoteRepoKeysAclCompatible(acl);
-
-        // Removing empty Ace
-        cleanupAclInfo(compatibleAcl);
-        aclStoreService.updateAcl(compatibleAcl);
-        interceptors.onPermissionsUpdate();
-        addons.addonByType(HaAddon.class).notify(HaMessageTopic.ACL_CHANGE_TOPIC, null);
-    }
-
-    @Override
-    public void deleteAcl(PermissionTargetInfo target) {
-        aclStoreService.deleteAcl(target.getName());
-        interceptors.onPermissionsDelete();
-        addons.addonByType(HaAddon.class).notify(HaMessageTopic.ACL_CHANGE_TOPIC, null);
-    }
-
-    @Override
-    public List<PermissionTargetInfo> getPermissionTargets(ArtifactoryPermission permission) {
-        return getPermissionTargetsByPermission(permission);
-    }
-
-    private List<PermissionTargetInfo> getPermissionTargetsByPermission(ArtifactoryPermission permission) {
-        List<PermissionTargetInfo> result = new ArrayList<>();
-        Collection<AclInfo> allAcls = aclStoreService.getAllAcls();
-        for (AclInfo acl : allAcls) {
-            if (hasPermissionOnAcl(acl, permission)) {
-                result.add(acl.getPermissionTarget());
-            }
-        }
-        return result;
-    }
-
-    @Override
-    public boolean isUpdatableProfile() {
-        UserInfo simpleUser = currentUser();
-        return simpleUser != null && simpleUser.isUpdatableProfile();
-    }
-
-    @Override
-    public boolean isTransientUser() {
-        UserInfo simpleUser = currentUser();
-        return simpleUser != null && simpleUser.isTransientUser();
-    }
-
-    @Override
-    @Nonnull
-    public String currentUsername() {
-        Authentication authentication = AuthenticationHelper.getAuthentication();
-        //Do not return a null username or this will cause a constraint violation
-        return (authentication != null ? authentication.getName() : SecurityService.USER_SYSTEM);
-    }
-
-    @Override
-    public UserInfo currentUser() {
-        Authentication authentication = AuthenticationHelper.getAuthentication();
-        if (authentication == null) {
-            return null;
-        }
-        SimpleUser user = getSimpleUser(authentication);
-        return user.getDescriptor();
-    }
-
-    @Override
-    public UserInfo findUser(String username) {
-        return findUser(username, true);
-    }
-
-    /**
-     * Returns the user details for the given username.
-     *
-     * @param username The unique username
-     * @param errorOnAbsence throw error if user is not found
-     * @return UserInfo if user with the input username exists
-     */
-    @Override
-    public UserInfo findUser(String username, boolean errorOnAbsence) {
-        UserInfo user = userGroupStoreService.findUser(username);
-        if (errorOnAbsence && user == null) {
-            throw new UsernameNotFoundException("User " + username + " does not exists!");
-        }
-        return user;
-    }
-
-    @Override
-    public AclInfo getAcl(String permTargetName) {
-        return aclStoreService.getAcl(permTargetName);
-    }
-
-    @Override
-    public AclInfo getAcl(PermissionTargetInfo permissionTarget) {
-        return aclStoreService.getAcl(permissionTarget.getName());
-    }
-
-    @Override
-    public boolean permissionTargetExists(String key) {
-        return aclStoreService.permissionTargetExists(key);
-    }
-
-    private void cleanupAclInfo(MutableAclInfo acl) {
-        Iterator<MutableAceInfo> it = acl.getMutableAces().iterator();
-        while (it.hasNext()) {
-            AceInfo aceInfo = it.next();
-            if (aceInfo.getMask() == 0) {
-                it.remove();
-            }
-        }
-    }
-
-    @Override
-    public List<AclInfo> getAllAcls() {
-        return new ArrayList<>(aclStoreService.getAllAcls());
-    }
-
-    @Override
-    public List<UserInfo> getAllUsers(boolean includeAdmins) {
-        return userGroupStoreService.getAllUsers(includeAdmins);
-    }
-
-    @Override
-    public Collection<Info> getUsersGroupsPaging(boolean includeAdmins, String orderBy,
-            String startOffset, String limit, String direction) {
-        return userGroupStoreService.getUsersGroupsPaging(includeAdmins, orderBy,
-                startOffset, limit, direction);
-    }
-
-    @Override
-    public long getAllUsersGroupsCount(boolean includeAdmins) {
-        return userGroupStoreService.getAllUsersGroupsCount(includeAdmins);
-    }
-
-    @Override
-    public org.artifactory.md.Properties findPropertiesForUser(String username) {
-        return userGroupStoreService.findPropertiesForUser(username);
-    }
-
-    @Override
-    public boolean addUserProperty(String username, String key, String value) {
-        return userGroupStoreService.addUserProperty(username, key, value);
-    }
-
-    @Override
-    public void deleteProperty(String userName, String propertyKey) {
-        userGroupStoreService.deleteUserProperty(userName, propertyKey);
-    }
-
-    @Override
-    public void deletePropertyFromAllUsers(String propertyKey) {
-        userGroupStoreService.deletePropertyFromAllUsers(propertyKey);
-    }
-
-    @Override
-    public String getPropsToken(String userName, String propsKey) {
-        return userGroupStoreService.findUserProperty(userName, propsKey);
-    }
-
-    @Override
-    public boolean revokePropsToken(String userName, String propsKey) throws SQLException {
-        invalidateAuthCacheEntries(userName);
-        return userGroupStoreService.deleteUserProperty(userName, propsKey);
-    }
-
-    @Override
-    public boolean createPropsToken(String userName, String propsKey, String propsValue) throws SQLException {
-        boolean isPropsAddSucceeded = false;
-        try {
-            isPropsAddSucceeded = userGroupStoreService.addUserProperty(userName, propsKey, propsValue);
-
-        } catch (Exception e) {
-            log.debug("error adding {}:{} to db", propsKey, propsValue);
-        }
-        return isPropsAddSucceeded;
-    }
-
-    @Override
-    public void revokeAllPropsTokens(String propsKey) throws SQLException {
-        userGroupStoreService.deletePropertyFromAllUsers(propsKey);
-        invalidateAuthCacheEntriesForAllUsers();
-    }
-
-    @Override
-    public boolean updatePropsToken(String userName, String propsKey, String propsValue) throws SQLException {
-        boolean isUpdateSucceeded = userGroupStoreService.deleteUserProperty(userName, propsKey);
-        if (isUpdateSucceeded) {
-            isUpdateSucceeded = userGroupStoreService.addUserProperty(userName, propsKey, propsValue);
-            invalidateAuthCacheEntries(userName);
-        }
-        return isUpdateSucceeded;
-    }
-
-    /**
-     * Locks user upon incorrect login attempt
-     *
-     * @param userName
-     */
-    @Override
-    public void lockUser(String userName) {
-        if (!isAnonymousUser(userName)) {
-            log.debug("Locking user {} due to incorrect login attempts", userName);
-            userGroupStoreService.lockUser(userName);
-        }
-    }
-
-    /**
-     * Unlocks locked in user
-     *
-     * @param userName
-     */
-    @Override
-    public void unlockUser(String userName) {
-        if (!isAnonymousUser(userName)) {
-            log.debug("Unlocking user {}", userName);
-            userGroupStoreService.unlockUser(userName);
-            unknownUsersCache.invalidate(userName);
-        }
-    }
-
-    /**
-     * Unlocks all locked in users
-     */
-    @Override
-    public void unlockAllUsers() {
-        log.debug("Unlocking all users");
-        userGroupStoreService.unlockAllUsers();
-        unknownUsersCache.invalidateAll();
-    }
-
-    /**
-     * Unlocks all locked out admin users
-     */
-    @Override
-    public void unlockAdminUsers() {
-        log.debug("Unlocking all admin users");
-        userGroupStoreService.unlockAdminUsers();
-    }
-
-    /**
-     * Registers incorrect login attempt
-     *
-     * @param userName
-     */
-    @Override
-    public void registerIncorrectLoginAttempt(String userName) {
-        if (!isAnonymousUser(userName)) {
-            log.debug("Registering incorrect login attempt for user {}", userName);
-            userGroupStoreService.registerIncorrectLoginAttempt(userName);
-        }
-    }
-
-    /**
-     * @return List of locked in users
-     */
-    @Override
-    public Set<String> getLockedUsers() {
-        return userGroupStoreService.getLockedUsers();
-    }
-
-    /**
-     * Triggered when user success to login
-     *
-     * @param userName user to intercept
-     */
-    @Override
-    public void interceptLoginSuccess(String userName) {
-        if (!isAnonymousUser(userName)) {
-            log.debug("Resetting incorrect login attempt for user {}", userName);
-            userGroupStoreService.resetIncorrectLoginAttempts(userName);
-        }
-    }
-
-    /**
-     * Resets incorrect login attempts
-     *
-     * @param userName
-     */
-    @Override
-    public void resetIncorrectLoginAttempts(String userName) {
-        log.debug("Resetting incorrect login attempts for '{}'", userName);
-        userGroupStoreService.resetIncorrectLoginAttempts(userName);
-    }
-
-    /**
-     * Triggered when user fails to login and
-     * locks it if amount of login failures exceeds
-     * {@see LockPolicy#loginAttempts}
-     *
-     * @param userName user to intercept
-     * @param accessTime session creation time
-     */
-    @Override
-    public void interceptLoginFailure(String userName, long accessTime){
-        if (!isAnonymousUser(userName)) {
-            log.debug("Registering login attempt failure for user {}", userName);
-            registerIncorrectLoginAttempt(userName);
-            UserInfo user = userGroupStoreService.findUser(userName);
-            if (user == null) {
-                interceptUnknownUserLoginFailure(userName, accessTime);
-            } else {
-                interceptKnownUserLoginFailure(user);
-            }
-        }
-    }
-
-    /**
-     * Intercepts login failure for (known to artifactory) user
-     *
-     * @param user user to intercept failure for
-     */
-    private void interceptKnownUserLoginFailure(UserInfo user) {
-        if(isUserLockPolicyEnabled() && !user.isLocked() &&
-                userGroupStoreService.getIncorrectLoginAttempts(user.getUsername()) >= getAllowedMaxLoginAttempts()) {
-            lockUser(user.getUsername());
-        }
-    }
-
-    /**
-     * Intercepts login failure for (unknown to artifactory) user
-     *
-     * @param userName user to intercept failure for
-     * @param accessTime access time
-     */
-    private void interceptUnknownUserLoginFailure(String userName, long accessTime) {
-        log.trace("Memorizing {} (not a user) for blocking", userName);
-        if (!userGroupStoreService.isUserLocked(userName)) {
-            List<Long> incorrectLoginAttempts = unknownUsersCache.getIfPresent(userName);
-            if(incorrectLoginAttempts == null){
-                registerUnknownUser(userName);
-                // memorize incorrect login attempt
-                unknownUsersCache.put(userName, Lists.newArrayList(accessTime));
-            } else {
-                incorrectLoginAttempts.add(accessTime);
-                if (isUserLockPolicyEnabled() &&
-                        incorrectLoginAttempts.size() >= getAllowedMaxLoginAttempts()) {
-                    lockUser(userName);
-                    unknownUsersCache.invalidate(userName); // no need to track this user as it got locked
-                }
-            }
-        }
-    }
-
-    /**
-     * Registers unknown user in cache
-     *
-     * @param userName
-     */
-    private void registerUnknownUser(String userName) {
-        if (!isAnonymousUser(userName)) {
-            log.trace("Registering incorrect login attempt for unknown user {}", userName);
-            unknownUsersCache.put(userName, new ArrayList<>(getAllowedMaxLoginAttempts()));
-        }
-    }
-
-    /**
-     * @return whether {@link UserLockPolicy} is enabled
-     */
-    @Override
-    public boolean isUserLockPolicyEnabled() {
-        UserLockPolicy userLockPolicy = centralConfig.getDescriptor().getSecurity().getUserLockPolicy();
-        return userLockPolicy.isEnabled();
-    }
-
-    /**
-     * @return whether {@link PasswordExpirationPolicy} is enabled
-     */
-    @Override
-    public boolean isPasswordExpirationPolicyEnabled() {
-        if (centralConfig.getMutableDescriptor().getSecurity() != null &&
-                centralConfig.getMutableDescriptor().getSecurity().getPasswordSettings() != null &&
-                centralConfig.getMutableDescriptor().getSecurity().getPasswordSettings().getExpirationPolicy() != null) {
-
-            return centralConfig.getMutableDescriptor()
-                    .getSecurity()
-                    .getPasswordSettings()
-                    .getExpirationPolicy()
-                    .isEnabled();
-        }
-        return false;
-    }
-
-    /**
-     * @return MaxLoginAttempts allowed before user gets locked out
-     */
-    private int getAllowedMaxLoginAttempts() {
-        UserLockPolicy userLockPolicy =
-                centralConfig.getMutableDescriptor()
-                        .getSecurity().getUserLockPolicy();
-
-        return userLockPolicy.getLoginAttempts();
-    }
-
-    /**
-     * @return Number of days for password to get expired
-     */
-    private int getPasswordExpirationDays() {
-        PasswordExpirationPolicy passwordExpirationPolicy =
-                centralConfig.getMutableDescriptor()
-                        .getSecurity().getPasswordSettings().getExpirationPolicy();
-        return passwordExpirationPolicy.getPasswordMaxAge();
-    }
-
-    /**
-     * Throws LockedException if user is locked
-     *
-     * @param userName
-     * @throws UserLockedException
-     */
-    @Override
-    public void ensureUserIsNotLocked(String userName) throws UserLockedException {
-        log.debug("Checking if user {} is not locked", userName);
-        if(!isAnonymousUser(userName) &&
-                isUserLockPolicyEnabled() && isUserLocked(userName)) {
-            log.debug("User {} is locked, denying login", userName);
-            throw UserLockedException.userLocked(userName);
-        }
-    }
-
-    /**
-     * Throws LockedException if user is locked
-     *
-     * @param sessionIdentifier
-     * @throws UserLockedException
-     */
-    @Override
-    public void ensureSessionIsNotLocked(String sessionIdentifier) throws UserLockedException {
-        log.debug("Checking if session {} is not locked", sessionIdentifier);
-        if(isUserLockPolicyEnabled() && isUserLocked(sessionIdentifier)) {
-            log.debug("Session {} is locked, denying login", sessionIdentifier);
-            throw UserLockedException.sessionLocked();
-        }
-    }
-
-    /**
-     * Checks whether given user is locked
-     *
-     * note: this method using caching in sake
-     * of DB load preventing
-     *
-     * @param userName
-     *
-     * @return boolean
-     */
-    @Override
-    public boolean isUserLocked(String userName) {
-        return !isAnonymousUser(userName) &&
-                userGroupStoreService.isUserLocked(userName);
-    }
-
-    /**
-     * Throws LoginDelayedException if user has performed
-     * incorrect login in past and now should wait before
-     * performing another login attempt
-     *
-     * @param userName
-     * @throws {@link org.artifactory.security.exceptions.LoginDisabledException}
-     */
-    @Override
-    public void ensureLoginShouldNotBeDelayed(String userName) {
-        if(!isAnonymousUser(userName)) {
-            log.debug("Ensuring that user {} should not be blocked", userName);
-            long nextLogin = userGroupStoreService.getNextLogin(userName);
-            List<Long> list = unknownUsersCache.getIfPresent(userName);
-            if (nextLogin < 0 && list !=null) {
-                // check frontend cache for unknown users
-                nextLogin = userGroupStoreService.getNextLogin(
-                        list.size(),
-                        list.get(list.size()-1)
-                );
-            }
-
-            if (nextLogin > 0 && nextLogin > System.currentTimeMillis()) {
-                log.debug("User is blocked due to incorrect login attempts till {}", nextLogin);
-                throw LoginDisabledException.userLocked(userName, nextLogin);
-            }
-        }
-    }
-
-    /**
-     * Throws LoginDelayedException if session has performed
-     * incorrect login in past and now should wait before
-     * performing another login attempt
-     *
-     * @param sessionIdentifier
-     * @throws {@link org.artifactory.security.exceptions.LoginDisabledException}
-     */
-    @Override
-    public void ensureSessionShouldNotBeDelayed(String sessionIdentifier) {
-        if(!isAnonymousUser(sessionIdentifier)) {
-            log.debug("Ensuring that user {} should not be blocked", sessionIdentifier);
-            // Try to calculate next login time for known user
-            long nextLogin = userGroupStoreService.getNextLogin(sessionIdentifier);
-            // If user is unknown calculate next login for unknown user
-            List<Long> list = unknownUsersCache.getIfPresent(sessionIdentifier);
-            if (nextLogin < 0 && list !=null) {
-                // check frontend cache for unknown users
-                nextLogin = userGroupStoreService.getNextLogin(list.size(),list.get(list.size() - 1));
-            }
-            if (nextLogin > 0 && nextLogin > System.currentTimeMillis()) {
-                log.debug("Session is blocked due to incorrect login attempts till {}", nextLogin);
-                throw LoginDisabledException.sessionLocked(sessionIdentifier, nextLogin);
-            }
-        }
-    }
-
-    /**
-     * Performs check whther given user is anonymous
-     *
-     * @param userName
-     *
-     * @return true/false
-     */
-    private boolean isAnonymousUser(String userName) {
-        return userName != null &&
-                userName.length() == UserInfo.ANONYMOUS.length() &&
-                UserInfo.ANONYMOUS.equals(userName);
-    }
-
-    @Override
-    public boolean createUser(MutableUserInfo user) {
-        user.setUsername(user.getUsername().toLowerCase());
-        boolean userCreated = userGroupStoreService.createUser(user);
-        if (userCreated) {
-            interceptors.onUserAdd(user.getUsername());
-        }
-        return userCreated;
-    }
-
-    /**
-     * Changes user password
-     *
-     * @param userName user name
-     * @param oldPassword old password
-     * @param newPassword1 new password
-     * @param newPassword2 replication of new password
-     *
-     */
-    @Override
-    public void changePassword(String userName, String oldPassword, String newPassword1, String newPassword2) throws PasswordChangeException {
-        try {
-            // todo: [mp] use plain user fetch (rather than heavy groups join)
-            UserInfo user = findUser(userName);
-
-            // perform user account validity check
-            ensureUserIsNotLocked(userName);
-            ensureLoginShouldNotBeDelayed(userName);
-
-            if (isOldPasswordValid(user, oldPassword, newPassword1, newPassword2)) {
-                SaltedPassword newSaltedPassword = generateSaltedPassword(newPassword1);
-                if ((user.getPassword() == null && newSaltedPassword.getPassword() != null) ||
-                        !user.getPassword().equals(newSaltedPassword.getPassword())) {
-                    userGroupStoreService.changePassword(user, newSaltedPassword);
-                    invalidateAuthCacheEntries(user.getUsername());
-                    dockerTokenManager.revokeToken(userName);
-                    log.info("Password for user '" + userName + "' has been successfully changed");
-                } else {
-                    log.debug("Passwords are equal, not taking any action");
-                    throw new PasswordChangeException("New password has to be different from the old one");
-                }
-            }
-        } catch (RuntimeException e) {
-            log.error(e.getMessage());
-            log.debug("Cause: {}", e);
-            throw new PasswordChangeException("Changing password has failed: " + e.getMessage());
-        } catch (Exception e) {
-            log.error(e.getMessage());
-            log.debug("Cause: {}", e);
-            throw new PasswordChangeException("Changing password has failed, see logs for more details");
-        }
-    }
-
-    /**
-     * Checks whether old password is valid
-     *
-     * @param user a user to validate password details for
-     * @param oldPassword old password
-     * @param newPassword1 new password
-     * @param newPassword2 replication of new password
-     *
-     * @return true/false
-     */
-    private boolean isOldPasswordValid(UserInfo user, String oldPassword, String newPassword1, String newPassword2) {
-        SaltedPassword oldSaltedPassword = generateSaltedPassword(oldPassword);
-        if((user.getPassword() == null && oldSaltedPassword.getPassword() != null) ||
-                !user.getPassword().equals(oldSaltedPassword.getPassword())) {
-
-            // memorise login failure
-            interceptLoginFailure(user.getUsername(), System.currentTimeMillis());
-
-            throw new PasswordChangeException("Old password is incorrect");
-        }
-        if((newPassword1 != null && !newPassword1.equals(newPassword2)) ||
-                (newPassword2 != null && !newPassword2.equals(newPassword1))) {
-            throw new PasswordChangeException("New passwords do not match");
-        }
-        if (newPassword1 == null) {
-            throw new PasswordChangeException("New passwords cannot be empty");
-        }
-        return true;
-    }
-
-    @Override
-    public void updateUser(MutableUserInfo user, boolean activateListeners) {
-        user.setUsername(user.getUsername().toLowerCase());
-        userGroupStoreService.updateUser(user);
-        if (activateListeners) {
-            invalidateAuthCacheEntries(user.getUsername());
-            dockerTokenManager.revokeToken(user.getUsername());
-        }
-    }
-
-    @Override
-    public void deleteUser(String username) {
-        aclStoreService.removeAllUserAces(username);
-        userGroupStoreService.deleteUser(username);
-        interceptors.onUserDelete(username);
-        invalidateAuthCacheEntries(username);
-        dockerTokenManager.revokeToken(username);
-    }
-
-    /**
-     * Removes the user's cache entries from the non-ui and Docker auth caches
-     * @param userName user to remove
-     */
-    private void invalidateAuthCacheEntries(String userName) {
-        //Currently the only listener is AccessFilter - take care if more are added
-        for (SecurityListener listener : securityListeners) {
-            listener.onUserUpdate(userName);
-       }
-        //Also invalidate docker auth cache entries
-        ContextHelper.get().beanForType(ArtifactoryTokenProvider.class).invalidateUserCacheEntries(userName);
-    }
-
-    /**
-     * Removes cache entries from the non-ui and Docker auth caches for all users
-     */
-    private void invalidateAuthCacheEntriesForAllUsers() {
-        //Clear the entire non-ui cache
-        clearSecurityListeners();
-        ContextHelper.get().beanForType(ArtifactoryTokenProvider.class).invalidateCacheEntriesForAllUsers();
-    }
-
-    @Override
-    public void updateGroup(MutableGroupInfo groupInfo) {
-        userGroupStoreService.updateGroup(groupInfo);
-    }
-
-    @Override
-    public boolean createGroup(MutableGroupInfo groupInfo) {
-        boolean groupCreated = userGroupStoreService.createGroup(groupInfo);
-        if (groupCreated) {
-            interceptors.onGroupAdd(groupInfo.getGroupName());
-        }
-        return groupCreated;
-    }
-
-    @Override
-    public void updateGroupUsers(MutableGroupInfo group, List<String> usersInGroup) {
-        // remove users from groups
-        removePrevGroupUsers(group);
-        // add users to group
-        addUserToGroup(usersInGroup, group.getGroupName());
-    }
-
-    @Override
-    public void deleteGroup(String groupName) {
-        aclStoreService.removeAllGroupAces(groupName);
-        if (userGroupStoreService.deleteGroup(groupName)) {
-            interceptors.onGroupDelete(groupName);
-        }
-    }
-
-    @Override
-    public List<GroupInfo> getAllGroups() {
-        return userGroupStoreService.getAllGroups();
-    }
-
-    @Override
-    public List<GroupInfo> getNewUserDefaultGroups() {
-        return userGroupStoreService.getNewUserDefaultGroups();
-    }
-
-    @Override
-    public List<GroupInfo> getAllExternalGroups() {
-        return userGroupStoreService.getAllExternalGroups();
-    }
-
-    @Override
-    public List<GroupInfo> getInternalGroups() {
-        return userGroupStoreService.getInternalGroups();
-    }
-
-    @Override
-    public Set<String> getNewUserDefaultGroupsNames() {
-        return userGroupStoreService.getNewUserDefaultGroupsNames();
-    }
-
-    @Override
-    public void addUsersToGroup(String groupName, List<String> usernames) {
-        userGroupStoreService.addUsersToGroup(groupName, usernames);
-        interceptors.onAddUsersToGroup(groupName, usernames);
-        for (String username : usernames) {
-            invalidateAuthCacheEntries(username);
-            dockerTokenManager.revokeToken(username);
-        }
-    }
-
-    @Override
-    public void removeUsersFromGroup(String groupName, List<String> usernames) {
-        userGroupStoreService.removeUsersFromGroup(groupName, usernames);
-        interceptors.onRemoveUsersFromGroup(groupName, usernames);
-        for (String username : usernames) {
-            invalidateAuthCacheEntries(username);
-            dockerTokenManager.revokeToken(username);
-        }
-    }
-
-    @Override
-    public List<UserInfo> findUsersInGroup(String groupName) {
-        return userGroupStoreService.findUsersInGroup(groupName);
-    }
-
-    @Override
-    public String resetPassword(String userName, String remoteAddress, String resetPageUrl) {
-        UserInfo userInfo = null;
-        try {
-            userInfo = findUser(userName);
-        } catch (UsernameNotFoundException e) {
-            //Alert in the log when trying to reset a password of an unknown user
-            log.warn("An attempt has been made to reset a password of unknown user: {}", userName);
-        }
-
-        //If the user is found, and has an email address
-        if (userInfo != null && !StringUtils.isEmpty(userInfo.getEmail())) {
-
-            //If the user hasn't got sufficient permissions
-            if (!userInfo.isUpdatableProfile()) {
-                throw new RuntimeException("The specified user is not permitted to reset his password.");
-            }
-
-            //Get client IP, then generate and send a password reset key
-            try {
-                generatePasswordResetKey(userName, remoteAddress, resetPageUrl);
-            } catch (EmailException ex) {
-                String message = ex.getMessage() + " Please contact your administrator.";
-                throw new RuntimeException(message);
-            } catch (Exception e) {
-                throw new RuntimeException(e.getMessage());
-            }
-        }
-        return "We have sent you via email a link for resetting your password. Please check your inbox.";
-    }
-
-    @Override
-    public UserInfo findOrCreateExternalAuthUser(String userName, boolean transientUser) {
-        return findOrCreateExternalUser(userName, transientUser, false);
-    }
-
-    @Override
-    public UserInfo findOrCreateExternalAuthUser(String userName, boolean transientUser, boolean updateProfile) {
-        return findOrCreateExternalUser(userName, transientUser, updateProfile);
-    }
-
-    /**
-     * find or create external user in db
-     *
-     * @param userName      - user name to find
-     * @param transientUser - if true ,  user mark as transient (not created in db)
-     * @param updateProfile - if true ,  user will be able to update it own profile
-     * @return {@link UserInfo}
-     */
-    private UserInfo findOrCreateExternalUser(String userName, boolean transientUser, boolean updateProfile) {
-        UserInfo userInfo;
-        try {
-            userInfo = findUser(userName.toLowerCase());
-        } catch (UsernameNotFoundException nfe) {
-            try {
-                userInfo = autoCreateUser(userName, transientUser, updateProfile);
-            } catch (ValidationException ve) {
-                log.error("Auto-Creation of '" + userName + "' has failed, " + ve.getMessage());
-                throw new InvalidNameException(userName, ve.getMessage(), ve.getIndex());
-            }
-        }
-        return userInfo;
-    }
-
-
-    /**
-     * remove group users before update
-     *
-     * @param group - group data
-     */
-    private void removePrevGroupUsers(MutableGroupInfo group) {
-        List<UserInfo> usersInGroup = findUsersInGroup(group.getGroupName());
-        if (usersInGroup != null && !usersInGroup.isEmpty()) {
-            List<String> userInGroupList = new ArrayList<>();
-            usersInGroup.forEach(userInGroup -> userInGroupList.add(userInGroup.getUsername()));
-            removeUsersFromGroup(group.getGroupName(), userInGroupList);
-        }
-    }
-
-    /**
-     * @param users     - user list to be added to group
-     * @param groupName - group name
-     */
-    protected void addUserToGroup(List<String> users, String groupName) {
-        if (users != null && !users.isEmpty()) {
-            addUsersToGroup(groupName, users);
-        }
-    }
-
-    /**
-     * Auto create user
-     *
-     * @param userName
-     * @param transientUser
-     *
-     * @return {@link UserInfo}
-     * @throws ValidationException if userName is invalid
-     */
-    private UserInfo autoCreateUser(String userName, boolean transientUser,
-            boolean updateProfile) throws ValidationException {
-        UserInfo userInfo;
-        log.debug("Creating new external user '{}'", userName);
-
-        // make sure username answer artifactory standards RTFACT-8259
-        NameValidator.validate(userName);
-
-        UserInfoBuilder userInfoBuilder = new UserInfoBuilder(userName.toLowerCase()).updatableProfile(updateProfile);
-        userInfoBuilder.internalGroups(getNewUserDefaultGroupsNames());
-        if (transientUser) {
-            userInfoBuilder.transientUser();
-        }
-        userInfo = userInfoBuilder.build();
-
-        // Save non transient user
-        if (!transientUser) {
-            boolean success = userGroupStoreService.createUser(userInfo);
-            if (!success) {
-                log.error("User '{}' was not created!", userInfo);
-            }
-        }
-        return userInfo;
-    }
-
-    @Override
-    @Nullable
-    public GroupInfo findGroup(String groupName) {
-        return userGroupStoreService.findGroup(groupName);
-    }
-
-    @Override
-    public String createEncryptedPasswordIfNeeded(UserInfo user, String password) {
-        if (isPasswordEncryptionEnabled()) {
-            KeyPair keyPair;
-            if (StringUtils.isBlank(user.getPrivateKey())) {
-                MutableUserInfo mutableUser = InfoFactoryHolder.get().copyUser(user);
-                keyPair = CryptoHelper.generateKeyPair();
-                mutableUser.setPrivateKey(CryptoHelper.convertToString(keyPair.getPrivate()));
-                mutableUser.setPublicKey(CryptoHelper.convertToString(keyPair.getPublic()));
-                updateUser(mutableUser, false);
-            } else {
-                keyPair = CryptoHelper.createKeyPair(user.getPrivateKey(), user.getPublicKey(), false);
-            }
-
-            SecretKey secretKey = CryptoHelper.generatePbeKeyFromKeyPair(keyPair);
-            return CryptoHelper.encryptSymmetric(password, secretKey, false);
-        }
-        return password;
-    }
-
-    /**
-     * Generates a password recovery key for the specified user and send it by mail
-     *
-     * @param username      User to rest his password
-     * @param remoteAddress The IP of the client that sent the request
-     * @param resetPageUrl  The URL to the password reset page
-     * @throws Exception
-     */
-    @Override
-    public void generatePasswordResetKey(String username, String remoteAddress, String resetPageUrl) throws Exception {
-        UserInfo userInfo;
-        try {
-            userInfo = findUser(username);
-        } catch (UsernameNotFoundException e) {
-            //If can't find user
-            throw new IllegalArgumentException("Could not find specified username.", e);
-        }
-
-        //If user has valid email
-        if (!StringUtils.isEmpty(userInfo.getEmail())) {
-            if (!userInfo.isUpdatableProfile()) {
-                //If user is not allowed to update his profile
-                throw new AuthorizationException("User is not permitted to reset his password.");
-            }
-
-            //Build key by UUID + current time millis + client ip -> encoded in B64
-            UUID uuid = UUID.randomUUID();
-            String passwordKey = uuid.toString() + ":" + System.currentTimeMillis() + ":" + remoteAddress;
-            byte[] encodedKey = Base64.encodeBase64URLSafe(passwordKey.getBytes(Charsets.UTF_8));
-            String encodedKeyString = new String(encodedKey, Charsets.UTF_8);
-
-            MutableUserInfo mutableUser = InfoFactoryHolder.get().copyUser(userInfo);
-            mutableUser.setGenPasswordKey(encodedKeyString);
-            updateUser(mutableUser, false);
-
-            //Add encoded key to page url
-            String resetPage = resetPageUrl + "?key=" + encodedKeyString;
-
-            //If there are any admins with valid email addresses, add them to the list that the message will contain
-            //String adminList = getAdminListBlock(userInfo);
-            InputStream stream = null;
-            try {
-                //Get message body from properties and substitute variables
-                stream = getClass().getResourceAsStream("/org/artifactory/email/messages/resetPassword.properties");
-                ResourceBundle resourceBundle = new PropertyResourceBundle(stream);
-                String body = resourceBundle.getString("body");
-                body = MessageFormat.format(body, username, remoteAddress, resetPage);
-                mailService.sendMail(new String[]{userInfo.getEmail()}, "Reset password request", body);
-            } catch (EmailException e) {
-                log.error("Error while resetting password for user: '" + username + "'.", e);
-                throw e;
-            } finally {
-                IOUtils.closeQuietly(stream);
-            }
-            log.info("The user: '{}' has been sent a password reset message by mail.", username);
-        }
-    }
-
-    @Override
-    public SerializablePair<Date, String> getPasswordResetKeyInfo(String username) {
-        UserInfo userInfo = findUser(username);
-        String passwordKey = userInfo.getGenPasswordKey();
-        if (StringUtils.isEmpty(passwordKey)) {
-            return null;
-        }
-
-        byte[] decodedKey = Base64.decodeBase64(passwordKey.getBytes(Charsets.UTF_8));
-        String decodedKeyString = new String(decodedKey, Charsets.UTF_8);
-        String[] splitKey = decodedKeyString.split(":");
-
-        //Key must be in 3 parts
-        if (splitKey.length < 3) {
-            throw new IllegalArgumentException("Password reset key must contain 3 parts - 'UUID:Date:IP'");
-        }
-
-        String time = splitKey[1];
-        String ip = splitKey[2];
-
-        Date date = new Date(Long.parseLong(time));
-
-        return new SerializablePair<>(date, ip);
-    }
-
-    @Override
-    public SerializablePair<String, Long> getUserLastLoginInfo(String username) {
-        UserInfo userInfo;
-        try {
-            userInfo = findUser(username);
-        } catch (UsernameNotFoundException e) {
-            //If can't find user (might be transient user)
-            log.trace("Could not retrieve last login info for username '{}'.", username);
-            return null;
-        }
-
-        SerializablePair<String, Long> pair = null;
-        String lastLoginClientIp = userInfo.getLastLoginClientIp();
-        long lastLoginTimeMillis = userInfo.getLastLoginTimeMillis();
-        if (!StringUtils.isEmpty(lastLoginClientIp) && (lastLoginTimeMillis != 0)) {
-            pair = new SerializablePair<>(lastLoginClientIp, lastLoginTimeMillis);
-        }
-        return pair;
-    }
-
-    @Override
-    public void updateUserLastLogin(String username, String clientIp, long loginTimeMillis) {
-        long lastLoginBufferTimeSecs = ConstantValues.userLastAccessUpdatesResolutionSecs.getLong();
-        if (lastLoginBufferTimeSecs < 1) {
-            log.debug("Skipping the update of the last login time for the user '{}': tracking is disabled.", username);
-            return;
-        }
-        long lastLoginBufferTimeMillis = TimeUnit.SECONDS.toMillis(lastLoginBufferTimeSecs);
-        UserInfo userInfo = userGroupStoreService.findUser(username);
-        if (userInfo == null) {
-            // user not found (might be a transient user)
-            log.trace("Could not update non-exiting username: {}'.", username);
-            return;
-        }
-        long timeSinceLastLogin = loginTimeMillis - userInfo.getLastLoginTimeMillis();
-        if (timeSinceLastLogin < lastLoginBufferTimeMillis) {
-            log.debug("Skipping the update of the last login time for the user '{}': " +
-                    "was updated less than {} seconds ago.", username, lastLoginBufferTimeSecs);
-            return;
-        }
-        MutableUserInfo mutableUser = InfoFactoryHolder.get().copyUser(userInfo);
-        mutableUser.setLastLoginTimeMillis(loginTimeMillis);
-        mutableUser.setLastLoginClientIp(clientIp);
-        updateUser(mutableUser, false);
-    }
-
-    /**
-     * Updates user last access time, if user is not exist in artifactory
-     * keeps track of it in volatile cache
-     *
-     * @param userName                     Name of user that performed an action
-     * @param clientIp                     The IP of the client that has accessed
-     * @param accessTimeMillis             The time of access
-     *
-     * @throws UsernameNotFoundException
-     */
-    @Override
-    public void updateUserLastAccess(String userName, String clientIp, long accessTimeMillis){
-        log.debug("Updating access details for user {}, time={}, ip={}", userName, accessTimeMillis, clientIp);
-        userGroupStoreService.updateUserAccess(userName, clientIp, accessTimeMillis);
-    }
-
-    @Override
-    public boolean isHttpSsoProxied() {
-        HttpSsoSettings httpSsoSettings = centralConfig.getDescriptor().getSecurity().getHttpSsoSettings();
-        return httpSsoSettings != null && httpSsoSettings.isHttpSsoProxied();
-    }
-
-    @Override
-    public boolean isNoHttpSsoAutoUserCreation() {
-        HttpSsoSettings httpSsoSettings = centralConfig.getDescriptor().getSecurity().getHttpSsoSettings();
-        return httpSsoSettings != null && httpSsoSettings.isNoAutoUserCreation();
-    }
-
-    @Override
-    public String getHttpSsoRemoteUserRequestVariable() {
-        HttpSsoSettings httpSsoSettings = centralConfig.getDescriptor().getSecurity().getHttpSsoSettings();
-        if (httpSsoSettings == null) {
-            return null;
-        } else {
-            return httpSsoSettings.getRemoteUserRequestVariable();
-        }
-    }
-
-    @Override
-    public boolean hasPermission(ArtifactoryPermission artifactoryPermission) {
-        return isAdmin() || !getPermissionTargets(artifactoryPermission).isEmpty();
-    }
-
-    @Override
-    public boolean canRead(RepoPath repoPath) {
-        return hasPermission(repoPath, ArtifactoryPermission.READ);
-    }
-
-    @Override
-    public boolean canAnnotate(RepoPath repoPath) {
-        return hasPermission(repoPath, ArtifactoryPermission.ANNOTATE);
-    }
-
-    @Override
-    public boolean canDeploy(RepoPath repoPath) {
-        return hasPermission(repoPath, ArtifactoryPermission.DEPLOY);
-    }
-
-    @Override
-    public boolean canDelete(RepoPath repoPath) {
-        return hasPermission(repoPath, ArtifactoryPermission.DELETE);
-    }
-
-    @Override
-    public boolean canManage(RepoPath repoPath) {
-        return hasPermission(repoPath, ArtifactoryPermission.MANAGE);
-    }
-
-    @Override
-    public boolean canManage(PermissionTargetInfo target) {
-        return hasPermissionOnPermissionTarget(target, ArtifactoryPermission.MANAGE);
-    }
-
-    @Override
-    public boolean canRead(UserInfo user, PermissionTargetInfo target) {
-        return hasPermissionOnPermissionTarget(target, ArtifactoryPermission.READ, new SimpleUser(user));
-    }
-
-    @Override
-    public boolean canAnnotate(UserInfo user, PermissionTargetInfo target) {
-        return hasPermissionOnPermissionTarget(target, ArtifactoryPermission.ANNOTATE, new SimpleUser(user));
-    }
-
-    @Override
-    public boolean canDeploy(UserInfo user, PermissionTargetInfo target) {
-        return hasPermissionOnPermissionTarget(target, ArtifactoryPermission.DEPLOY, new SimpleUser(user));
-    }
-
-    @Override
-    public boolean canDelete(UserInfo user, PermissionTargetInfo target) {
-        return hasPermissionOnPermissionTarget(target, ArtifactoryPermission.DELETE, new SimpleUser(user));
-    }
-
-    @Override
-    public boolean canManage(UserInfo user, PermissionTargetInfo target) {
-        return hasPermissionOnPermissionTarget(target, ArtifactoryPermission.MANAGE, new SimpleUser(user));
-    }
-
-    @Override
-    public boolean canRead(UserInfo user, RepoPath path) {
-        return hasPermission(new SimpleUser(user), path, ArtifactoryPermission.READ);
-    }
-
-    @Override
-    public boolean canAnnotate(UserInfo user, RepoPath path) {
-        return hasPermission(new SimpleUser(user), path, ArtifactoryPermission.ANNOTATE);
-    }
-
-    @Override
-    public boolean canDelete(UserInfo user, RepoPath path) {
-        return hasPermission(new SimpleUser(user), path, ArtifactoryPermission.DELETE);
-    }
-
-    @Override
-    public boolean canDeploy(UserInfo user, RepoPath path) {
-        return hasPermission(new SimpleUser(user), path, ArtifactoryPermission.DEPLOY);
-    }
-
-    @Override
-    public boolean canManage(UserInfo user, RepoPath path) {
-        return hasPermission(new SimpleUser(user), path, ArtifactoryPermission.MANAGE);
-    }
-
-    @Override
-    public boolean canRead(GroupInfo group, RepoPath path) {
-        return hasPermission(group, path, ArtifactoryPermission.READ);
-    }
-
-    @Override
-    public boolean canAnnotate(GroupInfo group, RepoPath path) {
-        return hasPermission(group, path, ArtifactoryPermission.ANNOTATE);
-    }
-
-    @Override
-    public boolean canDelete(GroupInfo group, RepoPath path) {
-        return hasPermission(group, path, ArtifactoryPermission.DELETE);
-    }
-
-    @Override
-    public boolean canDeploy(GroupInfo group, RepoPath path) {
-        return hasPermission(group, path, ArtifactoryPermission.DEPLOY);
-    }
-
-    @Override
-    public boolean canManage(GroupInfo group, RepoPath path) {
-        return hasPermission(group, path, ArtifactoryPermission.MANAGE);
-    }
-
-    @Override
-    public boolean userHasPermissions(String username) {
-        UserInfo user = userGroupStoreService.findUser(username);
-        if (user == null) {
-            return false;
-        }
-        Set<ArtifactorySid> sids = getUserEffectiveSids(new SimpleUser(user));
-        List<AclInfo> acls = getAllAcls();
-        for (AclInfo acl : acls) {
-            if (hasAceInAcl(acl, sids)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public Map<PermissionTargetInfo, AceInfo> getUserPermissionByPrincipal(String username) {
-        Map<PermissionTargetInfo, AceInfo> aceInfoMap = Maps.newHashMap();
-        UserInfo user = userGroupStoreService.findUser(username);
-        if (user == null) {
-            return Maps.newHashMap();
-        }
-        Set<ArtifactorySid> sids = getUserEffectiveSids(new SimpleUser(user));
-        List<AclInfo> acls = getAllAcls();
-        for (AclInfo acl : acls) {
-            addSidsPermissions(aceInfoMap, sids, acl);
-        }
-        return aceInfoMap;
-    }
-
-    public Map<PermissionTargetInfo, AceInfo> getGroupsPermissions(List<String> groups) {
-        Map<PermissionTargetInfo, AceInfo> aceInfoMap = Maps.newHashMap();
-        List<AclInfo> acls = getAllAcls();
-        for (AclInfo acl : acls) {
-            for (AceInfo ace : acl.getAces()) {
-                if (ace.isGroup() && groups.contains(ace.getPrincipal())) {
-                    aceInfoMap.put(acl.getPermissionTarget(), ace);
-                }
-            }
-        }
-        return aceInfoMap;
-    }
-
-
-    public Map<PermissionTargetInfo, AceInfo> getUserPermissions(String userName) {
-        Map<PermissionTargetInfo, AceInfo> aceInfoMap = Maps.newHashMap();
-        List<AclInfo> acls = getAllAcls();
-        for (AclInfo acl : acls) {
-            for (AceInfo ace : acl.getAces()) {
-                if (!ace.isGroup() && userName.equals(ace.getPrincipal())) {
-                    aceInfoMap.put(acl.getPermissionTarget(), ace);
-                }
-            }
-        }
-        return aceInfoMap;
-    }
-
-
-    /**
-     * add artifactory sids permissions to map
-     *
-     * @param aceInfoMap - permission target and principal info map
-     * @param sids       -permissions related sids
-     * @param acl        - permissions acls
-     */
-    private void addSidsPermissions(Map<PermissionTargetInfo, AceInfo> aceInfoMap, Set<ArtifactorySid> sids,
-            AclInfo acl) {
-        for (AceInfo ace : acl.getAces()) {
-            //Check that we match the sids
-            if (sids.contains(new ArtifactorySid(ace.getPrincipal(), ace.isGroup()))) {
-                aceInfoMap.put(acl.getPermissionTarget(), ace);
-            }
-        }
-    }
-
-
-    @Override
-    public boolean userHasPermissionsOnRepositoryRoot(String repoKey) {
-        Repo repo = repositoryService.repositoryByKey(repoKey);
-        if (repo == null) {
-            // Repo does not exists => No permissions
-            return false;
-        }
-        // If it is a real (i.e local or cached simply check permission on root.
-        if (repo.isReal()) {
-            // If repository is real, check if the user has any permission on the root.
-            if (repo instanceof RemoteRepo) {
-                RepoPath remoteRepoPath = InternalRepoPathFactory.repoRootPath(repoKey);
-                repoKey = InternalRepoPathFactory.cacheRepoPath(remoteRepoPath).getRepoKey();
-            }
-            return hasPermissionOnRoot(repoKey);
-        } else {
-            // If repository is virtual go over all repository associated with it and check if user has permissions
-            // on it root.
-            VirtualRepo virtualRepo = (VirtualRepo) repo;
-            // Go over all resolved cached repos, i.e. if we have virtual repository aggregation,
-            // This will give the resolved cached repos.
-            Set<LocalCacheRepo> localCacheRepoList = virtualRepo.getResolvedLocalCachedRepos();
-            for (LocalCacheRepo localCacheRepo : localCacheRepoList) {
-                LocalRepo localRepo = repositoryService.localOrCachedRepositoryByKey(localCacheRepo.getKey());
-                if (localRepo != null) {
-                    if (hasPermissionOnRoot(localRepo.getKey())) {
-                        return true;
-                    }
-                }
-            }
-            // Go over all resolved local repositories, will bring me the resolved local repos from aggregation.
-            Set<LocalRepo> repoList = virtualRepo.getResolvedLocalRepos();
-            for (LocalRepo localCacheRepo : repoList) {
-                LocalRepo localRepo = repositoryService.localOrCachedRepositoryByKey(localCacheRepo.getKey());
-                if (localRepo != null) {
-                    if (hasPermissionOnRoot(localRepo.getKey())) {
-                        return true;
-                    }
-                }
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public boolean isDisableInternalPassword() {
-        UserInfo simpleUser = currentUser();
-        return simpleUser != null ? false : true;
-    }
-
-    @Override
-    public String currentUserEncryptedPassword(boolean escape) {
-        Authentication authentication = AuthenticationHelper.getAuthentication();
-        if ((authentication != null) && authentication.isAuthenticated()) {
-            String authUsername = ((UserDetails) authentication.getPrincipal()).getUsername();
-            String password = (String) authentication.getCredentials();
-            if (StringUtils.isNotBlank(password)) {
-                UserInfo user = userGroupStoreService.findUser(authUsername);
-                if (user == null) {
-                    log.warn("Can't return the encrypted password of the unfound user '{}'", authUsername);
-                } else {
-                    String encrypted = createEncryptedPasswordIfNeeded(user, password);
-                    if (!encrypted.equals(password)) {
-                        if (escape) {
-                            return CryptoHelper.needsEscaping(encrypted);
-                        } else {
-                            return encrypted;
-                        }
-                    }
-                }
-            }
-        }
-
-        return null;
-    }
-
-    private boolean hasPermissionOnRoot(String repoKey) {
-        RepoPath path = InternalRepoPathFactory.repoRootPath(repoKey);
-        for (ArtifactoryPermission permission : ArtifactoryPermission.values()) {
-            if (hasPermission(path, permission)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private boolean hasPermission(RepoPath repoPath, ArtifactoryPermission permission) {
-        Authentication authentication = AuthenticationHelper.getAuthentication();
-        if (!isAuthenticated(authentication)) {
-            return false;
-        }
-
-        // Admins has permissions for all paths and all repositories
-        if (isAdmin(authentication)) {
-            return true;
-        }
-
-        // Anonymous users are checked only if anonymous access is enabled
-        if (isAnonymous() && !isAnonAccessEnabled()) {
-            return false;
-        }
-
-        if (TrashService.TRASH_KEY.equals(repoPath.getRepoKey()) && !isAdmin()) {
-            return false;
-        }
-
-        Set<ArtifactorySid> sids = getUserEffectiveSids(getSimpleUser(authentication));
-        return isGranted(repoPath, permission, sids);
-    }
-
-    private boolean hasPermission(SimpleUser user, RepoPath repoPath, ArtifactoryPermission permission) {
-        // Admins has permissions for all paths and all repositories
-        if (user.isAdmin()) {
-            return true;
-        }
-
-        // Anonymous users are checked only if anonymous access is enabled
-        if (user.isAnonymous() && !isAnonAccessEnabled()) {
-            return false;
-        }
-
-        Set<ArtifactorySid> sids = getUserEffectiveSids(user);
-        return isGranted(repoPath, permission, sids);
-    }
-
-    private boolean hasPermission(final GroupInfo group, RepoPath repoPath, ArtifactoryPermission permission) {
-        Set<ArtifactorySid> sid = new HashSet<ArtifactorySid>() {{
-            add(new ArtifactorySid(group.getGroupName(), true));
-        }};
-        return isGranted(repoPath, permission, sid);
-    }
-
-    private boolean isPermissionTargetIncludesRepoKey(String repoKey, PermissionTargetInfo permissionTarget) {
-        // checks if repo key is part of the permission target repository keys taking into account
-        // the special logical repo keys of a permission target like "Any", "All Local" etc.
-        List<String> repoKeys = permissionTarget.getRepoKeys();
-        if (repoKeys.contains(PermissionTargetInfo.ANY_REPO)) {
-            return true;
-        }
-
-        if (repoKeys.contains(repoKey)) {
-            return true;
-        }
-
-        LocalRepo localRepo = repositoryService.localOrCachedRepositoryByKey(repoKey);
-        if (localRepo != null) {
-            if (!(localRepo instanceof DistributionRepo) && !localRepo.isCache() && repoKeys.contains(PermissionTargetInfo.ANY_LOCAL_REPO)) {
-                return true;
-            } else if (localRepo.isCache() && repoKeys.contains(PermissionTargetInfo.ANY_REMOTE_REPO)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private boolean hasPermissionOnPermissionTarget(PermissionTargetInfo permTarget, ArtifactoryPermission permission) {
-        AclInfo acl = aclStoreService.getAcl(permTarget.getName());
-        return hasPermissionOnAcl(acl, permission);
-    }
-
-    private boolean hasPermissionOnPermissionTarget(PermissionTargetInfo permTarget, ArtifactoryPermission permission,
-            SimpleUser user) {
-        AclInfo acl = aclStoreService.getAcl(permTarget.getName());
-        return hasPermissionOnAcl(acl, permission, user);
-    }
-
-    private boolean hasPermissionOnAcl(AclInfo acl, ArtifactoryPermission permission) {
-        Authentication authentication = AuthenticationHelper.getAuthentication();
-        if (!isAuthenticated(authentication)) {
-            return false;
-        }
-        // Admins has permissions on any target
-        if (isAdmin(authentication)) {
-            return true;
-        }
-
-        return hasPermissionOnAcl(acl, permission, getSimpleUser(authentication));
-    }
-
-    private boolean hasPermissionOnAcl(AclInfo acl, ArtifactoryPermission permission, SimpleUser user) {
-        // Admins has permissions on any target
-        if (user.isAdmin()) {
-            return true;
-        }
-
-        return isGranted(acl, permission, getUserEffectiveSids(user));
-    }
-
-    private boolean isGranted(AclInfo acl, ArtifactoryPermission permission, Set<ArtifactorySid> sids) {
-        for (AceInfo ace : acl.getAces()) {
-            //Check that we match the sids
-            if (sids.contains(new ArtifactorySid(ace.getPrincipal(), ace.isGroup()))) {
-                if ((ace.getMask() & permission.getMask()) > 0) {
-                    //Any of the permissions is enough for granting
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    private boolean isGranted(
-            RepoPath repoPath, ArtifactoryPermission permission, Set<ArtifactorySid> sids) {
-        Collection<AclInfo> acls = aclStoreService.getAllAcls();
-        for (AclInfo acl : acls) {
-            if (!(acl instanceof ImmutableAclInfo)) {
-                RuntimeException runtimeException = new RuntimeException(
-                        "Checking for permission on " + acl
-                                + " should use only immutable security objects not " + acl.getClass());
-                log.error(runtimeException.getMessage(), runtimeException);
-            }
-            if (!hasAceInAcl(acl, sids)) {
-                // If no ACE skip path analysis
-                continue;
-            }
-            String repoKey = repoPath.getRepoKey();
-            String aclCompatibleRepoKey = makeRemoteRepoKeyAclCompatible(repoKey);  //acl compatible key for remotes
-            String path = repoPath.getPath();
-            boolean folder = repoPath.isFolder();
-            PermissionTargetInfo aclPermissionTarget = acl.getPermissionTarget();
-            if (isPermissionTargetIncludesRepoKey(repoKey, aclPermissionTarget)
-                    || isPermissionTargetIncludesRepoKey(aclCompatibleRepoKey, aclPermissionTarget)) {
-                boolean checkPartialPath = (permission.getMask() & (ArtifactoryPermission.READ.getMask() | ArtifactoryPermission.DEPLOY.getMask())) != 0;
-                boolean behaveAsFolder = folder && checkPartialPath;
-                boolean match = matches(aclPermissionTarget, path, behaveAsFolder);
-                if (match) {
-                    if (isGranted(acl, permission, sids)) {
-                        return true;
-                    }
-                }
-            }
-        }
-        return false;
-    }
-
-    private boolean hasAceInAcl(AclInfo acl, Set<ArtifactorySid> sids) {
-        for (AceInfo ace : acl.getAces()) {
-            //Check that we match the sids
-            if (sids.contains(new ArtifactorySid(ace.getPrincipal(), ace.isGroup()))) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-
-    @Override
-    public void exportTo(ExportSettings settings) {
-        exportSecurityInfo(settings, FILE_NAME);
-    }
-
-    private void exportSecurityInfo(ExportSettings settings, String fileName) {
-        //Export the security settings as xml using xstream
-        SecurityInfo descriptor = getSecurityData();
-        String path = settings.getBaseDir() + "/" + fileName;
-        XStream xstream = getXstream();
-        OutputStream os = null;
-        try {
-            os = new BufferedOutputStream(new FileOutputStream(path));
-            xstream.toXML(descriptor, os);
-        } catch (FileNotFoundException e) {
-            throw new RuntimeException("Failed to export security configuration.", e);
-        } finally {
-            IOUtils.closeQuietly(os);
-        }
-    }
-
-    @Override
-    public SecurityInfo getSecurityData() {
-        List<UserInfo> users = getAllUsers(true);
-        List<GroupInfo> groups = getAllGroups();
-        List<AclInfo> acls = getAllAcls();
-        SecurityInfo descriptor = InfoFactoryHolder.get().createSecurityInfo(users, groups, acls);
-        descriptor.setVersion(SecurityVersion.getCurrent().name());
-        return descriptor;
-    }
-
-    @Override
-    public void importFrom(ImportSettings settings) {
-        MutableStatusHolder status = settings.getStatusHolder();
-        status.status("Importing security...", log);
-        importSecurityXml(settings, status);
-    }
-
-    private void importSecurityXml(ImportSettings settings, MutableStatusHolder status) {
-        //Import the new security definitions
-        File baseDir = settings.getBaseDir();
-        // First check for security.xml file
-        File securityXmlFile = new File(baseDir, FILE_NAME);
-        if (!securityXmlFile.exists()) {
-            String msg = "Security file " + securityXmlFile +
-                    " does not exists no import of security will be done.";
-            settings.alertFailIfEmpty(msg, log);
-            return;
-        }
-        SecurityInfo securityInfo;
-        try {
-            securityInfo = new SecurityInfoReader().read(securityXmlFile);
-        } catch (Exception e) {
-            status.warn("Could not read security file", log);
-            return;
-        }
-        SecurityService me = InternalContextHelper.get().beanForType(SecurityService.class);
-        me.importSecurityData(securityInfo);
-    }
-
-    private void createDefaultAdminUser() {
-        log.info("Creating the default super user '" + DEFAULT_ADMIN_USER + "', since no admin user exists!");
-        UserInfo defaultAdmin = userGroupStoreService.findUser(DEFAULT_ADMIN_USER);
-        UserInfoBuilder builder = new UserInfoBuilder(DEFAULT_ADMIN_USER);
-        if (defaultAdmin != null) {
-            log.error("No admin user where found, but the default user named '" + DEFAULT_ADMIN_USER + "'" +
-                    " exists and is not admin!\n" +
-                    "Updating the super user '" + DEFAULT_ADMIN_USER + "' with default state and password!");
-            builder.password(generateSaltedPassword(DEFAULT_ADMIN_PASSWORD))
-                    .email(defaultAdmin.getEmail())
-                    .admin(true).updatableProfile(true).enabled(true);
-            MutableUserInfo newAdminUser = builder.build();
-            newAdminUser.setLastLoginTimeMillis(defaultAdmin.getLastLoginTimeMillis());
-            newAdminUser.setLastLoginClientIp(defaultAdmin.getLastLoginClientIp());
-            updateUser(newAdminUser, false);
-        } else {
-            builder.password(generateSaltedPassword(DEFAULT_ADMIN_PASSWORD)).email(null)
-                    .admin(true).updatableProfile(true);
-            createUser(builder.build());
-        }
-    }
-
-    private void createDefaultAnonymousUser() {
-        UserInfo anonymousUser = userGroupStoreService.findUser(UserInfo.ANONYMOUS);
-        if (anonymousUser != null) {
-            log.debug("Anonymous user " + anonymousUser + " already exists");
-            return;
-        }
-        log.info("Creating the default anonymous user, since it does not exists!");
-        UserInfoBuilder builder = new UserInfoBuilder(UserInfo.ANONYMOUS);
-        builder.password(generateSaltedPassword("", null)).email(null).enabled(true).updatableProfile(false);
-        MutableUserInfo anonUser = builder.build();
-        boolean createdAnonymousUser = createUser(anonUser);
-
-        if (createdAnonymousUser) {
-            MutableGroupInfo readersGroup = InfoFactoryHolder.get().createGroup("readers");
-            readersGroup.setRealm(SecurityConstants.DEFAULT_REALM);
-            readersGroup.setDescription("A group for read-only users");
-            readersGroup.setNewUserDefault(true);
-            createGroup(readersGroup);
-            aclStoreService.createDefaultSecurityEntities(anonUser, readersGroup, currentUsername());
-        }
-    }
-
-    @Override
-    public void importSecurityData(String securityXml) {
-        importSecurityData(new SecurityInfoReader().read(securityXml));
-    }
-
-    @Override
-    public void importSecurityData(SecurityInfo securityInfo) {
-        interceptors.onBeforeSecurityImport(securityInfo);
-        clearSecurityData();
-        List<GroupInfo> groups = securityInfo.getGroups();
-        if (groups != null) {
-            for (GroupInfo group : groups) {
-                userGroupStoreService.createGroup(group);
-            }
-        }
-        List<UserInfo> users = securityInfo.getUsers();
-        boolean hasAnonymous = false;
-        if (users != null) {
-            for (UserInfo user : users) {
-                userGroupStoreService.createUserWithProperties(user, true);
-                if (user.isAnonymous()) {
-                    hasAnonymous = true;
-                }
-            }
-        }
-        List<AclInfo> acls = securityInfo.getAcls();
-        if (acls != null) {
-            for (AclInfo acl : acls) {
-                aclStoreService.createAcl(acl);
-            }
-        }
-        if (!hasAnonymous) {
-            createDefaultAnonymousUser();
-        }
-    }
-
-    private void clearSecurityData() {
-        //Respect order for clean removal
-        //Clean up all acls
-        log.debug("Clearing security data");
-        aclStoreService.deleteAllAcls();
-        //Remove all existing groups
-        userGroupStoreService.deleteAllGroupsAndUsers();
-        clearSecurityListeners();
-    }
-
-    @Override
-    public void addListener(SecurityListener listener) {
-        securityListeners.add(listener);
-    }
-
-    @Override
-    public void removeListener(SecurityListener listener) {
-        securityListeners.remove(listener);
-    }
-
-    @Override
-    public void authenticateAsSystem() {
-        SecurityContextHolder.getContext().setAuthentication(new SystemAuthenticationToken());
-    }
-
-    @Override
-    public void nullifyContext() {
-        SecurityContextHolder.getContext().setAuthentication(null);
-    }
-
-    @Override
-    public SaltedPassword generateSaltedPassword(String rawPassword) {
-        return generateSaltedPassword(rawPassword, getDefaultSalt());
-    }
-
-    @Override
-    public SaltedPassword generateSaltedPassword(@Nonnull String rawPassword, @Nullable String salt) {
-        return new SaltedPassword(passwordEncoder.encodePassword(rawPassword, salt), salt);
-    }
-
-    @Override
-    public String getDefaultSalt() {
-        return ConstantValues.defaultSaltValue.getString();
-    }
-
-    @Override
-    public BasicStatusHolder testLdapConnection(LdapSetting ldapSetting, String username, String password) {
-        return ldapService.testLdapConnection(ldapSetting, username, password);
-    }
-
-    @Override
-    public boolean isPasswordEncryptionEnabled() {
-        CentralConfigDescriptor cc = centralConfig.getDescriptor();
-        return cc.getSecurity().getPasswordSettings().isEncryptionEnabled();
-    }
-
-    @Override
-    public boolean userPasswordMatches(String passwordToCheck) {
-        Authentication authentication = AuthenticationHelper.getAuthentication();
-        return authentication != null && passwordToCheck.equals(authentication.getCredentials());
-    }
-
-    @Override
-    public boolean canDeployToLocalRepository() {
-        return !repositoryService.getDeployableRepoDescriptors().isEmpty();
-    }
-
-    private void clearSecurityListeners() {
-        //Notify security listeners
-        for (SecurityListener listener : securityListeners) {
-            listener.onClearSecurity();
-        }
-    }
-
-    private void assertAdmin() {
-        if (!isAdmin()) {
-            throw new SecurityException(
-                    "The attempted action is permitted to users with administrative privileges only.");
-        }
-    }
-
-    /**
-     * Validates that the edited given permission target is not different from the existing one. This method should be
-     * called before an ACL is being modified by a non-sys-admin user
-     *
-     * @param newInfo Edited permission target
-     * @throws AuthorizationException Thrown in case an unauthorized modification has occurred
-     */
-    private void validateUnmodifiedPermissionTarget(PermissionTargetInfo newInfo) throws AuthorizationException {
-        if (newInfo == null) {
-            return;
-        }
-
-        AclInfo oldAcl = getAcl(newInfo);
-        if (oldAcl == null) {
-            return;
-        }
-
-        PermissionTargetInfo oldInfo = oldAcl.getPermissionTarget();
-        if (oldInfo == null) {
-            return;
-        }
-
-        Sets.SetView<String> excludes = Sets.symmetricDifference(Sets.newHashSet(oldInfo.getExcludes()),
-                Sets.newHashSet(newInfo.getExcludes()));
-        if (excludes != null && !excludes.isEmpty()) {
-            alertModifiedField("excludes pattern");
-        }
-
-        if (!oldInfo.getExcludesPattern().equals(newInfo.getExcludesPattern())) {
-            alertModifiedField("exclude pattern");
-        }
-
-        Sets.SetView<String> includes = Sets.symmetricDifference(Sets.newHashSet(oldInfo.getIncludes()),
-                Sets.newHashSet(newInfo.getIncludes()));
-        if (includes != null && !includes.isEmpty()) {
-            alertModifiedField("include pattern");
-        }
-
-        if (!oldInfo.getIncludesPattern().equals(newInfo.getIncludesPattern())) {
-            alertModifiedField("include pattern");
-        }
-        // make repo keys compatible with acl cached data
-        List<String> compatibleRepoKeys = makeRemoteRepoKeysAclCompatible(newInfo.getRepoKeys());
-        // validate repo keys data , make sure that old repo data and new repo data is the same
-        Sets.SetView<String> repoKeys = Sets.symmetricDifference(Sets.newHashSet(oldInfo.getRepoKeys()),
-                Sets.newHashSet(compatibleRepoKeys));
-        if (repoKeys != null && !repoKeys.isEmpty()) {
-            alertModifiedField("repositories");
-        }
-    }
-
-    /**
-     * Throws an AuthorizationException alerting an un-authorized change of configuration
-     *
-     * @param modifiedFieldName Name of modified field
-     */
-    private void alertModifiedField(String modifiedFieldName) {
-        throw new AuthorizationException("User is not permitted to modify " + modifiedFieldName);
-    }
-
-    /**
-     * Retrieves the Async advised instance of the service
-     *
-     * @return InternalSecurityService - Async advised instance
-     */
-    private InternalSecurityService getAdvisedMe() {
-        return context.beanForType(InternalSecurityService.class);
-    }
-
-    @Override
-    public List<String> convertCachedRepoKeysToRemote(List<String> repoKeys) {
-        List<String> altered = Lists.newArrayList();
-        for (String repoKey : repoKeys) {
-            String repoKeyCacheOmitted;
-
-            if (repoKey.contains(LocalCacheRepoDescriptor.PATH_SUFFIX)) {
-                repoKeyCacheOmitted = repoKey.substring(0,
-                        repoKey.lastIndexOf(LocalCacheRepoDescriptor.PATH_SUFFIX.charAt(0)));
-            } else {
-                altered.add(repoKey);
-                continue;
-            }
-            if (repositoryService.remoteRepoDescriptorByKey(repoKeyCacheOmitted) != null) {
-                altered.add(repoKeyCacheOmitted);
-            } else {
-                altered.add(repoKey); //Its Possible that someone named their local repo '*-cache'
-            }
-        }
-        return altered;
-    }
-
-    /**
-     * Converts remote repo keys contained in the list to have the '-cache' suffix as acls currently
-     * only support this notation.
-     *
-     * @param repoKeys
-     * @return repoKeys with all remote repository keys concatenated with '-cache' suffix
-     */
-    private List<String> makeRemoteRepoKeysAclCompatible(List<String> repoKeys) {
-        List<String> altered = Lists.newArrayList();
-        for (String repoKey : repoKeys) {
-            if (repositoryService.remoteRepoDescriptorByKey(repoKey) != null) {
-                altered.add(repoKey.concat(LocalCacheRepoDescriptor.PATH_SUFFIX));
-            } else {
-                altered.add(repoKey);
-            }
-        }
-        return altered;
-    }
-
-    private String makeRemoteRepoKeyAclCompatible(String repoKey) {
-        List<String> repoKeyAsList = new ArrayList<>();
-        repoKeyAsList.add(repoKey);
-        return (makeRemoteRepoKeysAclCompatible(repoKeyAsList).get(0));
-    }
-
-    private MutableAclInfo makeNewAclRemoteRepoKeysAclCompatible(MutableAclInfo acl) {
-        //Make repository keys acl-compatible before update
-        MutablePermissionTargetInfo mutablePermissionTargetInfo = InfoFactoryHolder.get().copyPermissionTarget
-                (acl.getPermissionTarget());
-        List<String> compatibleRepoKeys = makeRemoteRepoKeysAclCompatible(mutablePermissionTargetInfo.getRepoKeys());
-        mutablePermissionTargetInfo.setRepoKeys(compatibleRepoKeys);
-        acl.setPermissionTarget(mutablePermissionTargetInfo);
-
-        return acl;
-    }
-
-    public MutableAclInfo convertNewAclCachedRepoKeysToRemote(MutableAclInfo acl) {
-        //Make repository keys acl-compatible before update
-        MutablePermissionTargetInfo mutablePermissionTargetInfo = InfoFactoryHolder.get().copyPermissionTarget
-                (acl.getPermissionTarget());
-        List<String> compatibleRepoKeys = convertCachedRepoKeysToRemote(mutablePermissionTargetInfo.getRepoKeys());
-        mutablePermissionTargetInfo.setRepoKeys(compatibleRepoKeys);
-        acl.setPermissionTarget(mutablePermissionTargetInfo);
-
-        return acl;
-    }
-
-    public String findUserByPropAuth(String key, String value) {
-        UserInfo userByProperty = userGroupStoreService.findUserByProperty(key, value);
-        if (userByProperty != null) {
-            return userByProperty.getUsername();
-        }
-        return null;
-    }
-
-    /**
-     * Makes user password expired
-     *
-     * @param userName
-     */
-    @Override
-    public void expireUserCredentials(String userName) {
-        if (!isPasswordExpirationPolicyEnabled()) {
-            throw new PasswordExpireException("Password expiration policy is disabled");
-        }
-        try {
-            if(unknownUsersCache.getIfPresent(userName)!=null) {
-                log.debug("User {} is registered in unknown users cache, no password to expire ...");
-                throw new UsernameNotFoundException("User " + userName + " does not exist");
-            }
-            UserInfo user = findUser(userName); // todo: [mp] use plain user fetch (rather than heavy groups join)
-            if (Strings.isNullOrEmpty(user.getPassword())) {
-                log.debug("User {} is not managed by system, ignoring expire request");
-                throw new PasswordExpireException(
-                        "User '" + userName + "' is not managed by the artifactory, can't expire credentials.");
-            }
-            if(!user.isCredentialsExpired()) {
-                userGroupStoreService.expireUserPassword(userName);
-                invalidateAuthCacheEntries(userName);
-                dockerTokenManager.revokeToken(userName);
-            }
-        } catch (StorageException e) {
-            throw new PasswordExpireException("Expiring password for \"" + userName + "\" has failed, " + e.getMessage(), e);
-        } catch (UsernameNotFoundException e) {
-            log.error(e.getMessage());
-            log.debug("Cause: {}", e);
-            throw new PasswordExpireException("Expiring password has failed, " + e.getMessage());
-        }
-    }
-
-    /**
-     * Makes user password expired
-     *
-     * @param userName
-     */
-    @Override
-    public void unexpirePassword(String userName) {
-        if (!isPasswordExpirationPolicyEnabled()) {
-            throw new PasswordExpireException("Password expiration policy is disabled");
-        }
-        try {
-            if(unknownUsersCache.getIfPresent(userName)!=null) {
-                log.debug("User {} is registered in unknown users cache, no password to expire ...");
-                throw new UsernameNotFoundException("User " + userName + " does not exist");
-            }
-            findUser(userName); // todo: [mp] use plain user fetch (rather than heavy groups join)
-            userGroupStoreService.revalidatePassword(userName);
-        } catch (StorageException e) {
-            throw new PasswordExpireException("Expiring password for \"" + userName + "\" has failed, " + e.getMessage(), e);
-        } catch (UsernameNotFoundException e) {
-            log.error(e.getMessage());
-            log.debug("Cause: {}", e);
-            throw new PasswordExpireException("Expiring password has failed, " + e.getMessage());
-        }
-    }
-
-    /**
-     * Makes all users passwords expired
-     *
-     */
-    @Override
-    public void expireCredentialsForAllUsers() {
-        try {
-            userGroupStoreService.expirePasswordForAllUsers();
-            //Invalidate all auth caches
-            invalidateAuthCacheEntriesForAllUsers();
-            dockerTokenManager.revokeAllTokens();
-        } catch(StorageException e) {
-            log.debug("Expiring all users credentials have failed, cause: {}", e);
-            throw new PasswordExpireException("Expiring all users credentials have failed, see logs for more details");
-        }
-    }
-
-    /**
-     * Makes all users passwords not expired
-     *
-     */
-    @Override
-    public void unexpirePasswordForAllUsers() {
-        try {
-            if (!isPasswordExpirationPolicyEnabled()) {
-                throw new PasswordExpireException("Password expirable is not enabled");
-            }
-            userGroupStoreService.revalidatePasswordForAllUsers();
-        } catch(StorageException e) {
-            log.debug("Un-expiring all users credentials have failed, cause: {}", e);
-            throw new PasswordExpireException("Un-expiring all users credentials have failed, see logs for more details");
-        }
-    }
-
-
-    /**
-     * Fetches users with password is about to expire
-     *
-     * @return list of users
-     */
-    @Override
-    public Set<PasswordExpiryUser> getUsersWhichPasswordIsAboutToExpire() {
-        return userGroupStoreService.getUsersWhichPasswordIsAboutToExpire(
-                ConstantValues.passwordDaysToNotifyBeforeExpiry.getInt(), getPasswordExpirationDays());
-    }
-
-    /**
-     * Marks user.credentialsExpired=True where password has expired
-     *
-     * @param daysToKeepPassword after what period password should be changed
-     */
-    @Override
-    public void markUsersCredentialsExpired(int daysToKeepPassword) {
-        List<String> expiredUsers = userGroupStoreService.markUsersCredentialsExpired(daysToKeepPassword);
-        expiredUsers.forEach(user -> {
-            invalidateAuthCacheEntries(user);
-            dockerTokenManager.revokeToken(user);
-        });
-    }
-
-
-    /**
-     * @param userName
-     * @return number of days left till password will expire
-     *         or negative value if password already expired
-     *         or NULL if password expiration feature is disabled
-     */
-    @Override
-    public Integer getUserPasswordDaysLeft(String userName) {
-        Integer daysLeft  = null;
-        if(isPasswordExpirationPolicyEnabled()) {
-            UserInfo user = userGroupStoreService.findUser(userName);
-            if (user != null && !user.isAnonymous() && !user.hasInvalidPassword()) {
-                Long userPasswordCreationTime = userGroupStoreService.getUserPasswordCreationTime(userName);
-                if(userPasswordCreationTime != null) {
-                    daysLeft = getDaysLeftUntilPasswordExpires(userPasswordCreationTime);
-                } else {
-                    log.debug("Password creation time for user {} returned no value", userName);
-                }
-            }
-        }
-        return daysLeft;
-    }
-
-    private Integer getDaysLeftUntilPasswordExpires(Long userPasswordCreationTime) {
-        Integer daysLeft;
-        DateTime created = new DateTime(userPasswordCreationTime.longValue());
-        int expiresIn = getPasswordExpirationDays();
-        DateTime now = DateTime.now();
-        daysLeft = created.plusDays(expiresIn).minusDays(now.getDayOfYear()).getDayOfYear();
-        if ((daysLeft == 365 || daysLeft == 366) && created.plusDays(expiresIn).dayOfYear().get() != daysLeft) {
-            daysLeft = 0;
-        }
-        return daysLeft;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/SimpleUser.java b/backend/core/src/main/java/org/artifactory/security/SimpleUser.java
deleted file mode 100644
index 1a35948..0000000
--- a/backend/core/src/main/java/org/artifactory/security/SimpleUser.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import com.google.common.collect.Sets;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.userdetails.UserDetails;
-
-import java.util.Collection;
-import java.util.Set;
-
-/**
- * Simple user - comparison is done only by user name. This class is immutable and will return new instances when
- * getters are called.
- */
-public class SimpleUser implements UserDetails, Comparable {
-
-    public static final Set<GrantedAuthority> USER_GAS =
-            Sets.<GrantedAuthority>newHashSet(new SimpleGrantedAuthority(SecurityServiceImpl.ROLE_USER));
-    public static final Set<GrantedAuthority> ADMIN_GAS =
-            Sets.<GrantedAuthority>newHashSet(new SimpleGrantedAuthority(InternalSecurityService.ROLE_ADMIN),
-                    new SimpleGrantedAuthority(SecurityServiceImpl.ROLE_USER));
-
-    private UserInfo userInfo;
-
-    Set<GrantedAuthority> authorities;
-
-    public SimpleUser(UserInfo userInfo) {
-        this.userInfo = userInfo;
-        authorities = isAdmin() ? ADMIN_GAS : USER_GAS;
-    }
-
-    /**
-     * @return A new instance of the underlying UserInfo.
-     */
-    public UserInfo getDescriptor() {
-        return userInfo;
-    }
-
-    @Override
-    public Collection<GrantedAuthority> getAuthorities() {
-        return authorities;
-    }
-
-    @Override
-    public String getPassword() {
-        return userInfo.getPassword();
-    }
-
-    @Override
-    public String getUsername() {
-        return userInfo.getUsername();
-    }
-
-    public String getSalt() {
-        return userInfo.getSalt();
-    }
-
-    @Override
-    public boolean isAccountNonExpired() {
-        return userInfo.isAccountNonExpired();
-    }
-
-    @Override
-    public boolean isAccountNonLocked() {
-        return userInfo.isAccountNonLocked();
-    }
-
-    public boolean isTransientUser() {
-        return userInfo.isTransientUser();
-    }
-
-    /**
-     * Indicates whether the user's credentials (password) has expired. Expired credentials prevent
-     * authentication.
-     *
-     * @return <code>true</code> if the user's credentials are valid (ie non-expired), <code>false</code> if no longer
-     *         valid (ie expired)
-     */
-    @Override
-    public boolean isCredentialsNonExpired() {
-        return userInfo.isCredentialsNonExpired();
-    }
-
-    @Override
-    public boolean isEnabled() {
-        return userInfo.isEnabled();
-    }
-
-    public boolean isExternal() {
-        return userInfo.isExternal();
-    }
-
-    public String getEmail() {
-        return userInfo.getEmail();
-    }
-
-    public boolean isAdmin() {
-        return userInfo.isAdmin();
-    }
-
-    public boolean isAnonymous() {
-        return UserInfo.ANONYMOUS.equals(userInfo.getUsername());
-    }
-
-    public boolean isUpdatableProfile() {
-        return userInfo.isUpdatableProfile();
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        SimpleUser user = (SimpleUser) o;
-        return getUsername().equals(user.getUsername());
-
-    }
-
-    @Override
-    public int hashCode() {
-        return getUsername().hashCode();
-    }
-
-    @Override
-    public String toString() {
-        return getUsername();
-    }
-
-    @Override
-    public int compareTo(Object o) {
-        if (o == null || !getClass().isAssignableFrom(o.getClass())) {
-            throw new IllegalArgumentException();
-        }
-        return getUsername().compareTo(((SimpleUser) o).getUsername());
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/SystemAuthenticationToken.java b/backend/core/src/main/java/org/artifactory/security/SystemAuthenticationToken.java
deleted file mode 100644
index 8acd663..0000000
--- a/backend/core/src/main/java/org/artifactory/security/SystemAuthenticationToken.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.springframework.security.authentication.AbstractAuthenticationToken;
-
-import java.io.Serializable;
-
-/**
- * An authentication object to be used when needing authentication details for system tasks
- *
- * @author Noam Y. Tenne
- */
-public class SystemAuthenticationToken extends AbstractAuthenticationToken implements Serializable {
-
-    /**
-     * Creates a token with the supplied array of authorities.
-     *
-     * @param authorities the collection of <tt>GrantedAuthority</tt>s for the principal represented by this
-     *                    authentication object.
-     */
-    public SystemAuthenticationToken() {
-        super(SimpleUser.ADMIN_GAS);
-    }
-
-    @Override
-    public Object getCredentials() {
-        return "";
-    }
-
-    @Override
-    public Object getPrincipal() {
-        MutableUserInfo user = InfoFactoryHolder.get().createUser(SecurityService.USER_SYSTEM);
-        user.setAdmin(true);
-        return new SimpleUser(user);
-    }
-
-    @Override
-    public boolean isAuthenticated() {
-        return true;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/crowd/CrowdAuthenticationProviderAdapter.java b/backend/core/src/main/java/org/artifactory/security/crowd/CrowdAuthenticationProviderAdapter.java
deleted file mode 100644
index 6c8f4d5..0000000
--- a/backend/core/src/main/java/org/artifactory/security/crowd/CrowdAuthenticationProviderAdapter.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security.crowd;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.sso.crowd.CrowdAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.security.RealmAwareAuthenticationProvider;
-import org.artifactory.security.UserGroupInfo;
-import org.artifactory.security.UserInfo;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.AuthenticationException;
-
-import java.util.Set;
-
-/**
- * An authentication provider adapter that delegates the calls to the SSO addon.<br> Needed since a provider cannot be
- * added to the spring authentication manager while in an addon library.
- *
- * @author Noam Y. Tenne
- */
-public class CrowdAuthenticationProviderAdapter implements RealmAwareAuthenticationProvider {
-
-    private AddonsManager addonsManager;
-
-    public CrowdAuthenticationProviderAdapter() {
-        addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-    }
-
-    @Override
-    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
-        String userName = authentication.getName();
-        // If it's an anonymous user, don't bother searching for the user.
-        if (UserInfo.ANONYMOUS.equals(userName)) {
-            return null;
-        }
-        return addonsManager.addonByType(CrowdAddon.class).authenticateCrowd(authentication);
-    }
-
-    @Override
-    public boolean supports(Class<?> authentication) {
-        return addonsManager.addonByType(CrowdAddon.class).isCrowdAuthenticationSupported(authentication);
-    }
-
-    @Override
-    public String getRealm() {
-        return CrowdAddon.REALM;
-    }
-
-    @Override
-    public void addExternalGroups(String username, Set<UserGroupInfo> groups) {
-        addonsManager.addonByType(CrowdAddon.class).addExternalGroups(username, groups);
-    }
-
-    @Override
-    public boolean userExists(String username) {
-        return addonsManager.addonByType(CrowdAddon.class).findUser(username);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/db/DbAuthenticationProvider.java b/backend/core/src/main/java/org/artifactory/security/db/DbAuthenticationProvider.java
deleted file mode 100644
index ffe5908..0000000
--- a/backend/core/src/main/java/org/artifactory/security/db/DbAuthenticationProvider.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security.db;
-
-import org.artifactory.security.InternalRealmAwareAuthentication;
-import org.artifactory.security.RealmAwareAuthenticationProvider;
-import org.artifactory.security.UserGroupInfo;
-import org.artifactory.storage.security.service.UserGroupStoreService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.AuthenticationException;
-
-import java.util.Set;
-
-/**
- * @author Fred Simon
- */
-public class DbAuthenticationProvider extends DaoAuthenticationProvider implements RealmAwareAuthenticationProvider {
-    private static final Logger log = LoggerFactory.getLogger(DbAuthenticationProvider.class);
-
-    public static final String INTERNAL_REALM = "internal";
-
-    @Autowired
-    private UserGroupStoreService userGroupStore;
-
-    @Override
-    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
-        Authentication authenticate = super.authenticate(authentication);
-        return new InternalRealmAwareAuthentication(authenticate.getPrincipal(), authenticate.getCredentials(),
-                authenticate.getAuthorities());
-    }
-
-    @Override
-    public String getRealm() {
-        return INTERNAL_REALM;
-    }
-
-    @Override
-    public void addExternalGroups(String username, Set<UserGroupInfo> groups) {
-        log.debug("User '{}' is an internal user that belongs to the following groups '{}'", username, groups);
-        // nop
-    }
-
-    @Override
-    public boolean userExists(String username) {
-        return userGroupStore.userExists(username);
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/security/db/DbUserDetailsService.java b/backend/core/src/main/java/org/artifactory/security/db/DbUserDetailsService.java
deleted file mode 100644
index be09ef8..0000000
--- a/backend/core/src/main/java/org/artifactory/security/db/DbUserDetailsService.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security.db;
-
-import org.artifactory.security.SimpleUser;
-import org.artifactory.security.UserInfo;
-import org.artifactory.storage.security.service.UserGroupStoreService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.authentication.dao.SaltSource;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.stereotype.Repository;
-
-/**
- * This class provides both the user details and the password salt. Configured in the security.xml.
- *
- * @author freds
- */
- at Repository("dbUserDetailsService")
-public class DbUserDetailsService implements UserDetailsService, SaltSource {
-
-    @Autowired
-    private UserGroupStoreService userGroupStore;
-
-    @Override
-    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
-        UserInfo user = userGroupStore.findUser(username);
-        if (user == null) {
-            throw new UsernameNotFoundException("User with name '" + username + "' does not exists!");
-        }
-        return new SimpleUser(user);
-    }
-
-    @Override
-    public Object getSalt(UserDetails user) {
-        return ((SimpleUser) user).getSalt();
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/db/apikey/PropsAuthenticationProvider.java b/backend/core/src/main/java/org/artifactory/security/db/apikey/PropsAuthenticationProvider.java
deleted file mode 100644
index e7800b4..0000000
--- a/backend/core/src/main/java/org/artifactory/security/db/apikey/PropsAuthenticationProvider.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security.db.apikey;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.security.RealmAwareAuthenticationProvider;
-import org.artifactory.security.SimpleUser;
-import org.artifactory.security.UserGroupInfo;
-import org.artifactory.security.UserInfo;
-import org.artifactory.security.props.auth.BadPropsAuthException;
-import org.artifactory.security.props.auth.PropsAuthenticationToken;
-import org.artifactory.security.props.auth.PropsTokenCache;
-import org.artifactory.security.props.auth.model.TokenKeyValue;
-import org.artifactory.storage.security.service.UserGroupStoreService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.core.authority.mapping.NullAuthoritiesMapper;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.util.Assert;
-
-import java.util.Set;
-
-/**
- * @author Chen Keinan
- */
-public class PropsAuthenticationProvider implements RealmAwareAuthenticationProvider {
-    private static final Logger log = LoggerFactory.getLogger(PropsAuthenticationProvider.class);
-
-    @Autowired
-    private UserGroupStoreService userGroupStore;
-
-    @Autowired
-    private PropsTokenCache propsTokenCache;
-
-    @Override
-    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
-        Assert.isInstanceOf(PropsAuthenticationToken.class,
-                authentication, "Only Props Authentication Token is supported");
-        PropsAuthenticationToken authToken = (PropsAuthenticationToken) authentication;
-        // Determine props key and value
-        String tokenKey = (String) authToken.getPropsKey();
-        String tokenValue = (String) authentication.getCredentials();
-        TokenKeyValue tokenKeyValue = new TokenKeyValue(tokenKey, tokenValue);
-        UserDetails principal = findPrincipalByToken(tokenKeyValue);
-        if (principal == null) {
-            log.debug("token not found: {}", tokenKeyValue);
-            throw new BadPropsAuthException("Bad props auth token: " + tokenKeyValue);
-        } else {
-            if (authToken.getPrincipal() != null && StringUtils.isNotBlank(authToken.getPrincipal().toString())) {
-                if (!authToken.getPrincipal().toString().equals(principal.getUsername())) {
-                    throw new BadPropsAuthException("Bad authentication Key " + tokenKeyValue
-                            + " for user " + principal.getUsername());
-                }
-            }
-        }
-        return createSuccessAuthentication(authToken, principal);
-    }
-
-    private UserDetails findPrincipalByToken(TokenKeyValue tokenKeyValue) {
-        UserDetails principal = propsTokenCache.get(tokenKeyValue);
-        if (principal == null) {
-            UserInfo user = userGroupStore.findUserByProperty(tokenKeyValue.getKey(), tokenKeyValue.getToken());
-            if (user != null) {
-                principal = new SimpleUser(user);
-            }
-        }
-        return principal;
-    }
-
-    @Override
-    public boolean supports(Class<?> authentication) {
-        return true;
-    }
-
-    protected Authentication createSuccessAuthentication(PropsAuthenticationToken authentication,
-                                                         UserDetails user) {
-        PropsAuthenticationToken result = new PropsAuthenticationToken(user, authentication.getPropsKey(),
-                authentication.getCredentials(), new NullAuthoritiesMapper().mapAuthorities(user.getAuthorities()));
-
-        result.setDetails(authentication.getDetails());
-        result.setAuthenticated(true);
-        return result;
-    }
-
-    @Override
-    public void addExternalGroups(String username, Set<UserGroupInfo> groups) {
-        // not require
-    }
-
-    @Override
-    public boolean userExists(String username) {
-        return userGroupStore.userExists(username);
-    }
-
-    @Override
-    public String getRealm() {
-        return null;
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/security/interceptor/MissionControlEncryptInterceptor.java b/backend/core/src/main/java/org/artifactory/security/interceptor/MissionControlEncryptInterceptor.java
deleted file mode 100644
index 84ab86f..0000000
--- a/backend/core/src/main/java/org/artifactory/security/interceptor/MissionControlEncryptInterceptor.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- */
-package org.artifactory.security.interceptor;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.security.mission.control.MissionControlProperties;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-
-/**
- * @author Gidi Shabat
- */
-public class MissionControlEncryptInterceptor {
-    private static final Logger log = LoggerFactory.getLogger(MissionControlEncryptInterceptor.class);
-
-    /**
-     * encrypt or decrypt mission control properties file
-     */
-    public void encryptOrDecryptMissionControlPropertiesFile(boolean encrypt) {
-        try {
-            MissionControlProperties missionControlProperties = ContextHelper.get().beanForType(MissionControlProperties.class);
-            String password = missionControlProperties.getToken();
-            if (StringUtils.isNotBlank(password)) {
-                missionControlProperties.setToken(getNewPassword(encrypt, password));
-            }
-            ArtifactoryHome artifactoryHome = ArtifactoryHome.get();
-            missionControlProperties.updateMissionControlPropertiesFile(artifactoryHome.getMissionControlPropertiesFile());
-        } catch (IOException e) {
-            log.error("Error during encrypt decrypt Mission Control properties File" + e.getMessage(), e, log);
-        }
-    }
-
-    private String getNewPassword(boolean encrypt, String password) {
-        if (StringUtils.isNotBlank(password)) {
-            if (encrypt) {
-                return CryptoHelper.encryptIfNeeded(password);
-            } else {
-                return CryptoHelper.decryptIfNeeded(password);
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/interceptor/SecurityConfigurationChangesAdapter.java b/backend/core/src/main/java/org/artifactory/security/interceptor/SecurityConfigurationChangesAdapter.java
deleted file mode 100644
index 4a2b5ce..0000000
--- a/backend/core/src/main/java/org/artifactory/security/interceptor/SecurityConfigurationChangesAdapter.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security.interceptor;
-
-import org.artifactory.security.SecurityInfo;
-
-import java.util.List;
-
-/**
- * A default implementation adapter for the security configuration changes interceptors
- *
- * @author Noam Y. Tenne
- */
-public abstract class SecurityConfigurationChangesAdapter implements SecurityConfigurationChangesInterceptor {
-
-    @Override
-    public void onUserAdd(String user) {
-    }
-
-    @Override
-    public void onUserDelete(String user) {
-    }
-
-    @Override
-    public void onAddUsersToGroup(String groupName, List<String> usernames) {
-    }
-
-    @Override
-    public void onRemoveUsersFromGroup(String groupName, List<String> usernames) {
-    }
-
-    @Override
-    public void onGroupAdd(String group) {
-    }
-
-    @Override
-    public void onGroupDelete(String group) {
-    }
-
-    @Override
-    public void onPermissionsAdd() {
-    }
-
-    @Override
-    public void onPermissionsUpdate() {
-    }
-
-    @Override
-    public void onPermissionsDelete() {
-    }
-
-    @Override
-    public void onBeforeSecurityImport(SecurityInfo securityInfo) {
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/security/interceptor/SecurityConfigurationChangesInterceptor.java b/backend/core/src/main/java/org/artifactory/security/interceptor/SecurityConfigurationChangesInterceptor.java
deleted file mode 100644
index 11c395b..0000000
--- a/backend/core/src/main/java/org/artifactory/security/interceptor/SecurityConfigurationChangesInterceptor.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security.interceptor;
-
-import org.artifactory.interceptor.Interceptor;
-import org.artifactory.security.SecurityInfo;
-
-import java.util.List;
-
-/**
- * @author Yossi Shaul
- */
-public interface SecurityConfigurationChangesInterceptor extends Interceptor {
-
-    // TODO: Missing on updates events. Cannot be used for SecurityListener.
-
-    /**
-     * Called when a new user is added
-     *
-     * @param user Username
-     */
-    void onUserAdd(String user);
-
-    /**
-     * Called when a user is removed
-     *
-     * @param user Username
-     */
-    void onUserDelete(String user);
-
-    /**
-     * Called when users are added to a group
-     *
-     * @param groupName Name of group the users were added to
-     * @param usernames Name of users that were added to the group
-     */
-    void onAddUsersToGroup(String groupName, List<String> usernames);
-
-    /**
-     * Called when users are added to a group
-     *
-     * @param groupName Name of group the users were removed from
-     * @param usernames Name of users that were removed from the group
-     */
-    void onRemoveUsersFromGroup(String groupName, List<String> usernames);
-
-    /**
-     * Called when a new group is added
-     *
-     * @param group Group name
-     */
-    void onGroupAdd(String group);
-
-    /**
-     * Called when a group is removed
-     *
-     * @param group Group name
-     */
-    void onGroupDelete(String group);
-
-    /**
-     * Called when new permissions are added
-     */
-    void onPermissionsAdd();
-
-    /**
-     * Called when permissions are updated
-     */
-    void onPermissionsUpdate();
-
-    /**
-     * Called when permissions are removed
-     */
-    void onPermissionsDelete();
-
-    /**
-     * Called before security data is imported
-     *
-     * @param securityInfo Security data
-     */
-    void onBeforeSecurityImport(SecurityInfo securityInfo);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/security/interceptor/SecurityConfigurationChangesInterceptors.java b/backend/core/src/main/java/org/artifactory/security/interceptor/SecurityConfigurationChangesInterceptors.java
deleted file mode 100644
index dbf2cb7..0000000
--- a/backend/core/src/main/java/org/artifactory/security/interceptor/SecurityConfigurationChangesInterceptors.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security.interceptor;
-
-import org.artifactory.spring.ReloadableBean;
-
-/**
- * @author Yossi Shaul
- */
-public interface SecurityConfigurationChangesInterceptors extends ReloadableBean,
-        SecurityConfigurationChangesInterceptor {
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/security/interceptor/SecurityConfigurationChangesInterceptorsImpl.java b/backend/core/src/main/java/org/artifactory/security/interceptor/SecurityConfigurationChangesInterceptorsImpl.java
deleted file mode 100644
index fd6faed..0000000
--- a/backend/core/src/main/java/org/artifactory/security/interceptor/SecurityConfigurationChangesInterceptorsImpl.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security.interceptor;
-
-import org.artifactory.repo.interceptor.Interceptors;
-import org.artifactory.security.SecurityInfo;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.storage.db.DbService;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-/**
- * @author Yossi Shaul
- */
- at Service
- at Reloadable(beanClass = SecurityConfigurationChangesInterceptors.class, initAfter = DbService.class)
-public class SecurityConfigurationChangesInterceptorsImpl extends Interceptors<SecurityConfigurationChangesInterceptor>
-        implements SecurityConfigurationChangesInterceptors {
-
-    @Override
-    public void onUserAdd(String user) {
-        for (SecurityConfigurationChangesInterceptor interceptor : this) {
-            interceptor.onUserAdd(user);
-        }
-    }
-
-    @Override
-    public void onUserDelete(String user) {
-        for (SecurityConfigurationChangesInterceptor interceptor : this) {
-            interceptor.onUserDelete(user);
-        }
-    }
-
-    @Override
-    public void onAddUsersToGroup(String groupName, List<String> usernames) {
-        for (SecurityConfigurationChangesInterceptor interceptor : this) {
-            interceptor.onAddUsersToGroup(groupName, usernames);
-        }
-    }
-
-    @Override
-    public void onRemoveUsersFromGroup(String groupName, List<String> usernames) {
-        for (SecurityConfigurationChangesInterceptor interceptor : this) {
-            interceptor.onRemoveUsersFromGroup(groupName, usernames);
-        }
-    }
-
-    @Override
-    public void onGroupAdd(String group) {
-        for (SecurityConfigurationChangesInterceptor interceptor : this) {
-            interceptor.onGroupAdd(group);
-        }
-    }
-
-    @Override
-    public void onGroupDelete(String group) {
-        for (SecurityConfigurationChangesInterceptor interceptor : this) {
-            interceptor.onGroupDelete(group);
-        }
-    }
-
-    @Override
-    public void onPermissionsAdd() {
-        for (SecurityConfigurationChangesInterceptor interceptor : this) {
-            interceptor.onPermissionsAdd();
-        }
-    }
-
-    @Override
-    public void onPermissionsUpdate() {
-        for (SecurityConfigurationChangesInterceptor interceptor : this) {
-            interceptor.onPermissionsUpdate();
-        }
-    }
-
-    @Override
-    public void onPermissionsDelete() {
-        for (SecurityConfigurationChangesInterceptor interceptor : this) {
-            interceptor.onPermissionsDelete();
-        }
-    }
-
-    @Override
-    public void onBeforeSecurityImport(SecurityInfo securityInfo) {
-        for (SecurityConfigurationChangesInterceptor interceptor : this) {
-            interceptor.onBeforeSecurityImport(securityInfo);
-        }
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/security/interceptor/StoragePropertiesEncryptInterceptor.java b/backend/core/src/main/java/org/artifactory/security/interceptor/StoragePropertiesEncryptInterceptor.java
deleted file mode 100644
index 1468272..0000000
--- a/backend/core/src/main/java/org/artifactory/security/interceptor/StoragePropertiesEncryptInterceptor.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.artifactory.security.interceptor;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.storage.StorageProperties;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.IOException;
-
-/**
- * @author Chen Keinan
- */
-public class StoragePropertiesEncryptInterceptor {
-    private static final Logger log = LoggerFactory.getLogger(StoragePropertiesEncryptInterceptor.class);
-
-    /**
-     * encrypt or decrypt storage properties file
-     *
-     * @param encrypt - if true encrypt else decrypt
-     * @throws java.io.IOException
-     */
-    public void encryptOrDecryptStoragePropertiesFile(boolean encrypt) {
-        try {
-            File propertiesFile = getPropertiesStorageFile();
-            StorageProperties storageProperties = ContextHelper.get().beanForType(StorageProperties.class);
-            String password = storageProperties.getProperty(StorageProperties.Key.password);
-            if (StringUtils.isNotBlank(password)) {
-                storageProperties.setPassword(getNewPassword(encrypt, password));
-            }
-            String s3Credential = storageProperties.getProperty(StorageProperties.Key.binaryProviderS3Credential);
-            if (StringUtils.isNotBlank(s3Credential)) {
-                storageProperties.setS3Credential(getNewPassword(encrypt, s3Credential));
-            }
-            String s3ProxyCredential = storageProperties.getProperty(StorageProperties.Key.binaryProviderS3ProxyCredential);
-            if (StringUtils.isNotBlank(s3ProxyCredential)) {
-                storageProperties.setS3ProxyCredential(getNewPassword(encrypt, s3ProxyCredential));
-            }
-            storageProperties.updateStoragePropertiesFile(propertiesFile);
-        } catch (IOException e) {
-            log.error("Error Loading encrypt storage properties File" + e.getMessage(), e, log);
-        }
-    }
-
-    /**
-     * get properties file from context Artifactory home
-     * getPropertiesStorageFile at return Storage properties File
-     */
-    private File getPropertiesStorageFile() {
-        ArtifactoryHome artifactoryHome = ContextHelper.get().getArtifactoryHome();
-        File storagePropsFile = artifactoryHome.getStoragePropertiesFile();
-        return storagePropsFile;
-    }
-
-    private String getNewPassword(boolean encrypt, String password) {
-        if (StringUtils.isNotBlank(password)) {
-            if (encrypt) {
-                return CryptoHelper.encryptIfNeeded(password);
-            } else {
-                return CryptoHelper.decryptIfNeeded(password);
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/jobs/CredentialsWatchJob.java b/backend/core/src/main/java/org/artifactory/security/jobs/CredentialsWatchJob.java
deleted file mode 100644
index c8d4bc9..0000000
--- a/backend/core/src/main/java/org/artifactory/security/jobs/CredentialsWatchJob.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security.jobs;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.schedule.JobCommand;
-import org.artifactory.schedule.TaskUser;
-import org.artifactory.schedule.quartz.QuartzCommand;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-
-/**
- * A job that mark users as user.credentialsExpired=True if password has expired
- *
- * @author Michael Pasternak
- */
- at JobCommand(description = "Credentials watch job",
-        singleton = true, runOnlyOnPrimary = true, schedulerUser = TaskUser.SYSTEM, manualUser = TaskUser.SYSTEM)
-public class CredentialsWatchJob extends QuartzCommand {
-    private static final Logger log = LoggerFactory.getLogger(CredentialsWatchJob.class);
-    private final ArtifactoryContext artifactoryContext = ContextHelper.get();
-
-    @Override
-    public void onExecute(JobExecutionContext callbackContext) throws JobExecutionException {
-        log.debug("Credentials watch is started");
-
-        CentralConfigService configService = artifactoryContext.beanForType(CentralConfigService.class);
-        if(!configService.getMutableDescriptor().getSecurity().getPasswordSettings().getExpirationPolicy().isEnabled()) {
-            log.debug("ExpirationPolicy is disabled");
-            return;
-        }
-
-        SecurityService securityService = artifactoryContext.beanForType(SecurityService.class);
-
-        securityService.markUsersCredentialsExpired(
-                configService.getMutableDescriptor().getSecurity().getPasswordSettings().getExpirationPolicy().getPasswordMaxAge()
-        );
-
-        log.debug("Credentials watch is finished");
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/jobs/PasswordExpireNotificationJob.java b/backend/core/src/main/java/org/artifactory/security/jobs/PasswordExpireNotificationJob.java
deleted file mode 100644
index 9dd65f5..0000000
--- a/backend/core/src/main/java/org/artifactory/security/jobs/PasswordExpireNotificationJob.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security.jobs;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.CoreAddons;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.mail.MailServerConfiguration;
-import org.artifactory.api.mail.MailService;
-import org.artifactory.api.security.PasswordExpiryUser;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.descriptor.mail.MailServerDescriptor;
-import org.artifactory.schedule.JobCommand;
-import org.artifactory.schedule.TaskUser;
-import org.artifactory.schedule.quartz.QuartzCommand;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.util.HttpUtils;
-import org.joda.time.DateTime;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.mail.Message;
-import java.util.Set;
-
-/**
- * A job that notifies users about expiring password
- *
- * @author Michael Pasternak
- */
- at JobCommand(description = "Password expire notification job",
-        singleton = true, runOnlyOnPrimary = true, schedulerUser = TaskUser.SYSTEM, manualUser = TaskUser.SYSTEM)
-public class PasswordExpireNotificationJob extends QuartzCommand {
-    private static final Logger log = LoggerFactory.getLogger(PasswordExpireNotificationJob.class);
-
-    private static final String MAIL_SUBJECT = "Your Artifactory password is about to expire";
-
-    private final ArtifactoryContext artifactoryContext = ContextHelper.get();
-
-    @Override
-    public void onExecute(JobExecutionContext callbackContext) throws JobExecutionException {
-        log.debug("Password expire notification job is started");
-
-        CentralConfigService configService = artifactoryContext.beanForType(CentralConfigService.class);
-        if(!configService.getMutableDescriptor().getSecurity().getPasswordSettings().getExpirationPolicy().isEnabled()) {
-            log.debug("ExpirationPolicy is disabled");
-            return;
-        }
-        if(!configService.getMutableDescriptor().getSecurity().getPasswordSettings().getExpirationPolicy().isNotifyByEmail()) {
-            log.debug("Email notification is disabled, not notifying users about expiring passwords ...");
-            return;
-        }
-
-        MailService mailService = artifactoryContext.beanForType(MailService.class);
-        SecurityService securityService = artifactoryContext.beanForType(SecurityService.class);
-
-        MailServerConfiguration emailConfig = getEmailConfig();
-        if(emailConfig == null || !emailConfig.isEnabled()) {
-            log.debug("Mail server is not configured/disabled, not notifying users about expiring passwords ...");
-            return;
-        }
-
-        Set<PasswordExpiryUser> usersWhichPasswordIsAboutToExpire = securityService.getUsersWhichPasswordIsAboutToExpire();
-        usersWhichPasswordIsAboutToExpire.stream()
-                .filter(user -> StringUtils.isNotBlank(user.getEmail()))
-                .forEach(user -> mailService.sendMail(
-                        getEmailAddresses(user.getEmail()),
-                        MAIL_SUBJECT,
-                        getMailBody(user.getUserName(), user.getPasswordCreated(), false),
-                        emailConfig,
-                        Message.RecipientType.TO
-                ));
-        log.debug("Password expire notification job is finished");
-    }
-
-    private String[] getEmailAddresses(String addresses) {
-        return new String[]{addresses};
-    }
-
-    /**
-     * @return mail server configuration {@link MailServerConfiguration}
-     */
-    private MailServerConfiguration getEmailConfig() {
-        CentralConfigService centralConfigService = artifactoryContext.beanForType(CentralConfigService.class);
-        MailServerDescriptor m = centralConfigService.getMutableDescriptor().getMailServer();
-
-        if (m == null) {
-            return null;
-        }
-
-        return new MailServerConfiguration(
-                m.isEnabled(), m.getHost(), m.getPort(), m.getUsername(),
-                CryptoHelper.decryptIfNeeded(m.getPassword()), m.getFrom(), m.getSubjectPrefix(),
-                m.isTls(), m.isSsl(), m.getArtifactoryUrl()
-        );
-    }
-
-    /**
-     * Produces unique (per user) email body
-     *
-     * @param userName          user name
-     * @param passwordCreated   the date when password was created
-     * @param plainText         whether email should be send in plain text or html
-     *
-     * @return email body
-     */
-    public String getMailBody(String userName, Long passwordCreated, boolean plainText) {
-        DateTime created = new DateTime(passwordCreated);
-        CentralConfigService centralConfigService = ContextHelper.get().beanForType(CentralConfigService.class);
-        int expiresIn = centralConfigService.getMutableDescriptor().getSecurity().getPasswordSettings().getExpirationPolicy().getPasswordMaxAge();
-        DateTime now = DateTime.now();
-        int daysLeft = created.plusDays(expiresIn).minusDays(now.getDayOfYear()).getDayOfYear();
-        if ((daysLeft == 365 || daysLeft == 366) && created.plusDays(expiresIn).dayOfYear().get() != daysLeft) daysLeft = 0;
-        DateTime dueDate = now.plusDays(daysLeft);
-
-        if(daysLeft == 0) {
-            if(!plainText)
-                return String.format(
-                        "<!DOCTYPE html>" +
-                                "<html>" +
-                                "<body>" +
-                                "<p>" +
-                                "Dear %s,<br><br>" +
-                                "Your Artifactory password is about to expire today (%s).<br>" +
-                                "Please change your password before it expires, " +
-                                "Once expired you will not be able to  access the<br>" +
-                                "Artifactory UI or REST API using that password until it will be changed.<br><br>" +
-                                "Password can be changed in <a href=\""+getProfilePageUrl()+"\">your profile page</a> " +
-                                "or by your system administrator.<br><br>" +
-                                "</p>" +
-                                "</body>" +
-                                "</html>",
-                        userName.toUpperCase(),
-                        dueDate.toString("MMMMM dd, YYYY")
-                );
-            return String.format(
-                    "Dear %s,\n" +
-                            "\n" +
-                            "Your Artifactory password is about to expire today (%s).\n" +
-                            "Please change your password before it expires. Once expired you will not be able to  access the\n" +
-                            "Artifactory UI or REST API using that password until it will be changed.\n" +
-                            "\n" +
-                            "Password can be changed in your page [1] or by your system administrator.\n\n" +
-                            "[1] " + getProfilePageUrl(),
-                    userName.toUpperCase(),
-                    dueDate.toString("MMMMM dd, YYYY")
-            );
-        } else {
-            if(!plainText)
-                return String.format(
-                        "<!DOCTYPE html>" +
-                                "<html>" +
-                                "<body>" +
-                                "<p>" +
-                                "Dear %s,<br><br>" +
-                                "Your Artifactory password is about to expire in %d " + (daysLeft == 1 ? "day" : "days") + " (%s).<br>" +
-                                "Please change your password before it expires, " +
-                                "Once expired you will not be able to  access the<br>" +
-                                "Artifactory UI or REST API using that password until it will be changed.<br><br>" +
-                                "Password can be changed in <a href=\""+getProfilePageUrl()+"\">your profile page</a> " +
-                                "or by your system administrator.<br><br>" +
-                                "</p>" +
-                                "</body>" +
-                                "</html>",
-                        userName.toUpperCase(),
-                        daysLeft,
-                        dueDate.toString("MMMMM dd, YYYY")
-                );
-            return String.format(
-                    "Dear %s,\n" +
-                            "\n" +
-                            "Your Artifactory password is about to expire in %d " + (daysLeft == 1 ? "day" : "days") + " (%s).\n" +
-                            "Please change your password before it expires. Once expired you will not be able to  access the\n" +
-                            "Artifactory UI or REST API using that password until it will be changed.\n" +
-                            "\n" +
-                            "Password can be changed in your page [1] or by your system administrator.\n\n" +
-                            "[1] " + getProfilePageUrl(),
-                    userName.toUpperCase(),
-                    daysLeft,
-                    dueDate.toString("MMMMM dd, YYYY")
-            );
-        }
-    }
-
-    /**
-     * @return a URL referring artifactory instance profile page
-     */
-    private String getProfilePageUrl() {
-        CoreAddons addon = ContextHelper.get().beanForType(AddonsManager.class).addonByType(CoreAddons.class);
-        String resetPageUrl = addon.getArtifactoryUrl();
-        if (resetPageUrl != null &&  StringUtils.isNotBlank(resetPageUrl)) {
-            if (!resetPageUrl.endsWith("/")) {
-                resetPageUrl += "/";
-            }
-            if (addon.isAol()) {
-                resetPageUrl += "#/profile";
-            } else {
-                resetPageUrl += HttpUtils.WEBAPP_URL_PATH_PREFIX + "/#/profile ";
-            }
-        }
-        return resetPageUrl;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/ldap/AbstractLdapService.java b/backend/core/src/main/java/org/artifactory/security/ldap/AbstractLdapService.java
deleted file mode 100644
index 69aac3d..0000000
--- a/backend/core/src/main/java/org/artifactory/security/ldap/AbstractLdapService.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security.ldap;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.descriptor.security.ldap.LdapSetting;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.ldap.AuthenticationException;
-import org.springframework.ldap.BadLdapGrammarException;
-import org.springframework.ldap.CommunicationException;
-import org.springframework.ldap.InvalidNameException;
-import org.springframework.ldap.NameNotFoundException;
-import org.springframework.ldap.core.LdapTemplate;
-import org.springframework.ldap.core.support.LdapContextSource;
-import org.springframework.security.authentication.BadCredentialsException;
-
-/**
- * @author Tomer Cohen
- */
-public class AbstractLdapService {
-    private static final Logger log = LoggerFactory.getLogger(AbstractLdapService.class);
-
-
-    protected void handleException(Exception e, BasicStatusHolder status, String username,
-            boolean isSearchAndBindActive) {
-        log.debug("LDAP connection test failed with exception", e);
-        if (e instanceof CommunicationException) {
-            status.error("Failed connecting to the server (probably wrong url or port)", e, log);
-        } else if (e instanceof NameNotFoundException) {
-            status.error("Server failed to parse the request: " +
-                    ((NameNotFoundException) e).getMostSpecificCause().getMessage(), e, log);
-        } else if (e instanceof InvalidNameException) {
-            status.error("Server failed to parse the request: " +
-                    ((InvalidNameException) e).getMostSpecificCause().getMessage(), e, log);
-        } else if (e instanceof AuthenticationException) {
-            if (isSearchAndBindActive) {
-                status.warn("LDAP authentication failed for " + username +
-                        ". Note: you have configured direct user binding " +
-                        "and manager-based search, which are usually mutually exclusive. For AD leave the User DN " +
-                        "Pattern field empty.", e, log);
-            } else {
-                status.error("Authentication failed. Probably a wrong manager dn or manager password", e,
-                        log);
-            }
-        } else if (e instanceof BadCredentialsException) {
-            status.error("Failed to authenticate user " + username, e, log);
-        } else if (e instanceof BadLdapGrammarException) {
-            status.error("Failed to parse R\\DN", e, log);
-        } else {
-            String message = "Error connecting to the LDAP server: ";
-            log.error(message, e);
-            status.error(message, log);
-        }
-    }
-
-    /**
-     * Create LDAP template to be used for performing LDAP queries.
-     *
-     * @param settings The LDAP settings with which to create the LDAP template.
-     * @return The LDAP template.
-     */
-    public LdapTemplate createLdapTemplate(LdapSetting settings) {
-        LdapContextSource securityContext = ArtifactoryLdapAuthenticator.createSecurityContext(settings);
-        LdapTemplate ldapTemplate = new LdapTemplate(securityContext);
-        ldapTemplate.setIgnorePartialResultException(true);
-        return ldapTemplate;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/ldap/ArtifactoryBindAuthenticator.java b/backend/core/src/main/java/org/artifactory/security/ldap/ArtifactoryBindAuthenticator.java
deleted file mode 100644
index 16b4308..0000000
--- a/backend/core/src/main/java/org/artifactory/security/ldap/ArtifactoryBindAuthenticator.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security.ldap;
-
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.CoreAddonsImpl;
-import org.artifactory.addon.LdapGroupAddon;
-import org.artifactory.descriptor.security.ldap.LdapSetting;
-import org.artifactory.descriptor.security.ldap.SearchPattern;
-import org.artifactory.spring.InternalArtifactoryContext;
-import org.artifactory.spring.InternalContextHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.dao.IncorrectResultSizeDataAccessException;
-import org.springframework.ldap.NamingException;
-import org.springframework.ldap.core.DirContextAdapter;
-import org.springframework.ldap.core.DirContextOperations;
-import org.springframework.ldap.core.DistinguishedName;
-import org.springframework.ldap.core.support.BaseLdapPathContextSource;
-import org.springframework.ldap.core.support.LdapContextSource;
-import org.springframework.ldap.support.LdapUtils;
-import org.springframework.security.authentication.BadCredentialsException;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.security.ldap.authentication.BindAuthenticator;
-import org.springframework.security.ldap.ppolicy.PasswordPolicyControl;
-import org.springframework.security.ldap.ppolicy.PasswordPolicyControlExtractor;
-import org.springframework.security.ldap.search.FilterBasedLdapUserSearch;
-import org.springframework.util.Assert;
-import org.springframework.util.StringUtils;
-
-import javax.naming.directory.Attributes;
-import javax.naming.directory.DirContext;
-import java.util.List;
-
-/**
- * @author freds
- * @date Sep 12, 2008
- */
-public class ArtifactoryBindAuthenticator extends BindAuthenticator {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryBindAuthenticator.class);
-
-    /**
-     * The spring context connected to LDAP server
-     */
-    private LdapContextSource contextSource;
-
-    /**
-     * A list of user search that can be used to search and authenticate the user. Used with AD.
-     */
-    private List<FilterBasedLdapUserSearch> userSearches;
-
-    public ArtifactoryBindAuthenticator(LdapContextSource contextSource, LdapSetting ldapSetting) {
-        super(contextSource);
-        init(contextSource, ldapSetting);
-    }
-
-    public void init(LdapContextSource contextSource, LdapSetting ldapSetting) {
-        Assert.notNull(contextSource, "contextSource must not be null.");
-        this.contextSource = contextSource;
-        boolean hasDnPattern = StringUtils.hasText(ldapSetting.getUserDnPattern());
-        SearchPattern search = ldapSetting.getSearch();
-        boolean hasSearch = search != null && StringUtils.hasText(search.getSearchFilter());
-        Assert.isTrue(hasDnPattern || hasSearch,
-                "An Authentication pattern should provide a userDnPattern or a searchFilter (or both)");
-
-        if (hasDnPattern) {
-            setUserDnPatterns(new String[]{ldapSetting.getUserDnPattern()});
-        }
-
-        if (hasSearch) {
-            this.userSearches = getLdapGroupAddon().getLdapUserSearches(contextSource, ldapSetting);
-        }
-    }
-
-    private LdapGroupAddon getLdapGroupAddon() {
-        InternalArtifactoryContext context = InternalContextHelper.get();
-        if (context != null) {
-            AddonsManager addonsManager = context.beanForType(AddonsManager.class);
-            return addonsManager.addonByType(LdapGroupAddon.class);
-        } else {
-            return new CoreAddonsImpl();
-        }
-    }
-
-    @Override
-    protected LdapContextSource getContextSource() {
-        return contextSource;
-    }
-
-    @Override
-    public void afterPropertiesSet() throws Exception {
-        // Nothing to do, check done at constructor time
-    }
-
-    @Override
-    public DirContextOperations authenticate(Authentication authentication) {
-        DirContextOperations user = null;
-        Assert.isInstanceOf(UsernamePasswordAuthenticationToken.class, authentication,
-                "Can only process UsernamePasswordAuthenticationToken objects");
-
-        String username = authentication.getName();
-        String password = (String) authentication.getCredentials();
-        // may have LDAPs that have no password for the users, see RTFACT-3103, RTFACT-3378
-        if (!StringUtils.hasText(password)) {
-            throw new BadCredentialsException("Empty password used.");
-        }
-
-        // If DN patterns are configured, try authenticating with them directly
-        for (String dn : getUserDns(username)) {
-            user = bindWithDn(dn, username, password);
-
-            if (user != null) {
-                break;
-            }
-        }
-
-        if (user == null && (userSearches != null && !userSearches.isEmpty())) {
-            for (FilterBasedLdapUserSearch userSearch : userSearches) {
-                try {
-                    DirContextOperations userFromSearch = userSearch.searchForUser(username);
-                    user = bindWithDn(userFromSearch.getDn().toString(), username, password);
-                    if (user != null) {
-                        break;
-                    }
-                } catch (UsernameNotFoundException e) {
-                    log.debug("Searching for user {} failed for {}: {}",
-                            userSearch, username, e.getMessage());
-                } catch (IncorrectResultSizeDataAccessException irsae) {
-                    log.error("User: {} found {} times in LDAP server", username, irsae.getActualSize());
-                }
-            }
-        }
-
-        if (user == null) {
-            throw new BadCredentialsException(
-                    messages.getMessage("BindAuthenticator.badCredentials", "Bad credentials"));
-        }
-
-        return user;
-    }
-
-    private DirContextOperations bindWithDn(String userDnStr, String username, String password) {
-        BaseLdapPathContextSource ctxSource = getContextSource();
-        DistinguishedName userDn = new DistinguishedName(userDnStr);
-        DistinguishedName fullDn = new DistinguishedName(userDn);
-        fullDn.prepend(ctxSource.getBaseLdapPath());
-
-        log.debug("Attempting to bind as " + fullDn);
-
-        DirContext ctx = null;
-        try {
-            ctx = getContextSource().getContext(fullDn.toString(), password);
-            // Check for password policy control
-            PasswordPolicyControl ppolicy = PasswordPolicyControlExtractor.extractControl(ctx);
-
-            log.debug("Retrieving attributes...");
-
-            Attributes attrs = ctx.getAttributes(userDn, getUserAttributes());
-
-            DirContextAdapter result = new DirContextAdapter(attrs, userDn, ctxSource.getBaseLdapPath());
-
-            if (ppolicy != null) {
-                result.setAttributeValue(ppolicy.getID(), ppolicy);
-            }
-
-            return result;
-        } catch (NamingException e) {
-            // This will be thrown if an invalid user name is used and the method may
-            // be called multiple times to try different names, so we trap the exception
-            // unless a subclass wishes to implement more specialized behaviour.
-            if ((e instanceof org.springframework.ldap.AuthenticationException)
-                    || (e instanceof org.springframework.ldap.OperationNotSupportedException)) {
-                handleBindException(userDnStr, username, e);
-            } else {
-                throw e;
-            }
-        } catch (javax.naming.NamingException e) {
-            throw LdapUtils.convertLdapException(e);
-        } finally {
-            LdapUtils.closeContext(ctx);
-        }
-
-        return null;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/ldap/ArtifactoryLdapAuthenticationProvider.java b/backend/core/src/main/java/org/artifactory/security/ldap/ArtifactoryLdapAuthenticationProvider.java
deleted file mode 100644
index 23b578b..0000000
--- a/backend/core/src/main/java/org/artifactory/security/ldap/ArtifactoryLdapAuthenticationProvider.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security.ldap;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.LdapGroupAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.api.security.ldap.LdapService;
-import org.artifactory.api.security.ldap.LdapUser;
-import org.artifactory.descriptor.security.ldap.LdapSetting;
-import org.artifactory.exception.InvalidNameException;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.security.*;
-import org.artifactory.spring.InternalContextHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.MessageSource;
-import org.springframework.context.MessageSourceAware;
-import org.springframework.ldap.AuthenticationException;
-import org.springframework.ldap.CommunicationException;
-import org.springframework.ldap.NamingException;
-import org.springframework.ldap.core.DirContextOperations;
-import org.springframework.security.authentication.AuthenticationServiceException;
-import org.springframework.security.authentication.InternalAuthenticationServiceException;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.ldap.LdapUtils;
-import org.springframework.security.ldap.authentication.BindAuthenticator;
-import org.springframework.security.ldap.authentication.LdapAuthenticationProvider;
-
-import java.util.*;
-
-/**
- * Custom LDAP authentication provider just for creating local users for newly ldap authenticated users.
- *
- * @author Yossi Shaul
- */
-public class ArtifactoryLdapAuthenticationProvider implements RealmAwareAuthenticationProvider, MessageSourceAware {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryLdapAuthenticationProvider.class);
-
-    @Autowired
-    private UserGroupService userGroupService;
-
-    @Autowired
-    private CentralConfigService centralConfig;
-
-    /**
-     * Keep the message source to in initialize LdapAuthenticationProvider when created
-     */
-    private MessageSource messageSource;
-
-    private Map<String, LdapAuthenticationProvider> ldapAuthenticationProviders = null;
-
-    @Autowired
-    private InternalLdapAuthenticator authenticator;
-
-    @Autowired
-    private LdapService ldapService;
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    /**
-     * Get the LDAP authentication providers, by iterating over all the bind authenticators and putting them in a map of
-     * the settings key.
-     *
-     * @return The LDAP authentication provers
-     */
-    public Map<String, LdapAuthenticationProvider> getLdapAuthenticationProviders() {
-        if (ldapAuthenticationProviders == null) {
-            ldapAuthenticationProviders = new HashMap<>();
-            Map<String, BindAuthenticator> authMap = authenticator.getAuthenticators();
-            for (Map.Entry<String, BindAuthenticator> entry : authMap.entrySet()) {
-                LdapAuthenticationProvider ldapAuthenticationProvider =
-                        new LdapAuthenticationProvider(entry.getValue());
-                if (messageSource != null) {
-                    ldapAuthenticationProvider.setMessageSource(messageSource);
-                }
-                ldapAuthenticationProviders.put(entry.getKey(), ldapAuthenticationProvider);
-            }
-        }
-        return ldapAuthenticationProviders;
-    }
-
-    @Override
-    public void setMessageSource(MessageSource messageSource) {
-        this.messageSource = messageSource;
-        if (ldapAuthenticationProviders != null) {
-            for (LdapAuthenticationProvider ldapAuthenticationProvider : ldapAuthenticationProviders.values()) {
-                ldapAuthenticationProvider.setMessageSource(messageSource);
-            }
-        }
-    }
-
-    @Override
-    public boolean supports(Class<?> authentication) {
-        if (centralConfig.getDescriptor().getSecurity().isLdapEnabled()) {
-            for (LdapAuthenticationProvider ldapAuthenticationProvider : getLdapAuthenticationProviders().values()) {
-                if (ldapAuthenticationProvider.supports(authentication)) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public Authentication authenticate(Authentication authentication) {
-        String userName = authentication.getName();
-        // If it's an anonymous user, don't bother searching for the user.
-        if (UserInfo.ANONYMOUS.equals(userName)) {
-            return null;
-        }
-
-        log.debug("Trying to authenticate user '{}' via ldap.", userName);
-        LdapSetting usedLdapSetting = null;
-        DirContextOperations user = null;
-        AddonsManager addonsManager = InternalContextHelper.get().beanForType(AddonsManager.class);
-        LdapGroupAddon ldapGroupAddon = addonsManager.addonByType(LdapGroupAddon.class);
-        try {
-            RuntimeException authenticationException = null;
-            for (Map.Entry<String, BindAuthenticator> entry : authenticator.getAuthenticators().entrySet()) {
-                LdapSetting currentLdapSetting =
-                        centralConfig.getDescriptor().getSecurity().getLdapSettings(entry.getKey());
-                BindAuthenticator bindAuthenticator = entry.getValue();
-                try {
-                    user = bindAuthenticator.authenticate(authentication);
-                    if (user != null) {
-                        usedLdapSetting = currentLdapSetting;
-                        break;
-                    }
-                } catch (AuthenticationException e) {
-                    authenticationException = e;
-                    checkIfBindAndSearchActive(currentLdapSetting, userName);
-                } catch (org.springframework.security.core.AuthenticationException e) {
-                    authenticationException = e;
-                    checkIfBindAndSearchActive(currentLdapSetting, userName);
-                } catch (RuntimeException e) {
-                    authenticationException = e;
-                }
-            }
-            if (user == null) {
-                if (authenticationException != null) {
-                    UserInfo userInfo = userGroupService.findUser(userName);
-                    if (userInfo != null) {
-                        log.debug("user {} failed to perform ldap authentication (not bad credential)", userInfo.getUsername());
-                        removeUserLdapRelatedGroups(userInfo);
-                    }
-                    throw authenticationException;
-                }
-                throw new AuthenticationServiceException(ArtifactoryLdapAuthenticator.LDAP_SERVICE_MISCONFIGURED);
-            }
-
-            // user authenticated via ldap
-            log.debug("'{}' authenticated successfully by ldap server.", userName);
-
-            //Collect internal groups, and if using external groups add them to the user info
-            MutableUserInfo userInfo = InfoFactoryHolder.get()
-                    .copyUser(userGroupService
-                            .findOrCreateExternalAuthUser(userName, !usedLdapSetting.isAutoCreateUser()));
-            userInfo.setRealm(LdapService.REALM);
-            String emailAttribute = usedLdapSetting.getEmailAttribute();
-            if (StringUtils.isNotBlank(emailAttribute)) {
-                String email = user.getStringAttribute(emailAttribute);
-                if (StringUtils.isNotBlank(email) && !userInfo.isTransientUser()) {
-                    log.debug("User '{}' has email address '{}'", userName, email);
-                    if (!email.equals(userInfo.getEmail())) {
-                        userInfo.setEmail(email);
-                        userGroupService.updateUser(userInfo, false);
-                    }
-                }
-            }
-
-            log.debug("Loading LDAP groups");
-            ldapGroupAddon.populateGroups(user, userInfo);
-            log.debug("Finished Loading LDAP groups");
-            SimpleUser simpleUser = new SimpleUser(userInfo);
-
-            // create new authentication response containing the user and it's authorities
-            return new LdapRealmAwareAuthentication(simpleUser, authentication.getCredentials(),
-                    simpleUser.getAuthorities());
-        } catch (AuthenticationException e) {
-            String message = String.format("Failed to authenticate user '%s' via LDAP: %s", userName, e.getMessage());
-            log.debug(message);
-            throw new AuthenticationServiceException(message, e);
-        } catch (CommunicationException ce) {
-            String message = String.format("Failed to authenticate user '%s' via LDAP: communication error", userName);
-            log.warn(message);
-            log.debug(message, ce);
-            throw new AuthenticationServiceException(message, ce);
-        } catch (org.springframework.security.core.AuthenticationException e) {
-            log.debug(String.format("Failed to authenticate user '%s': %s", userName, e.getMessage()));
-            throw e;
-        } catch (NamingException e) {
-            String message = String.format("Failed to locate directory entry for authenticated user: %s",
-                    e.getMostSpecificCause().getMessage());
-            log.debug(message);
-            throw new AuthenticationServiceException(message, e);
-        } catch (InvalidNameException e) {
-            String message = String.format("Failed to persist user '%s': %s", userName, e.getMessage());
-            log.warn(message);
-            log.debug("Cause: {}", e);
-            throw new InternalAuthenticationServiceException(message, e);
-        } catch (Exception e) {
-            String message = "Unexpected exception in LDAP authentication:";
-            log.error(message, e);
-            throw new AuthenticationServiceException(message, e);
-        } finally {
-            LdapUtils.closeContext(user);
-        }
-    }
-
-    /**
-     * remove user ldap related group as user no longer exist in ldap
-     *
-     * @param userInfo Artifactory User Data
-     */
-    private void removeUserLdapRelatedGroups(UserInfo userInfo) {
-        MutableUserInfo mutableUserInfo = InfoFactoryHolder.get()
-                .copyUser(userInfo);
-        Set<UserGroupInfo> updateUserGroup = new HashSet<>();
-        Set<UserGroupInfo> userGroupInfos = new HashSet<>(mutableUserInfo.getGroups());
-        for (Iterator<UserGroupInfo> userGroupInfoIterator = userGroupInfos.iterator(); userGroupInfoIterator.hasNext(); ) {
-            UserGroupInfo userGroupInfo = userGroupInfoIterator.next();
-            if (!LdapService.REALM.equals(userGroupInfo.getRealm())) {
-                updateUserGroup.add(userGroupInfo);
-            }
-        }
-        mutableUserInfo.setGroups(updateUserGroup);
-        if (!userInfo.isTransientUser() && userGroupInfos.size() != updateUserGroup.size()) {
-            log.debug("updating user {} after ldap login authentication failure (not bad credential) ,user groups for update are {}",
-                    mutableUserInfo.getUsername(), mutableUserInfo.getGroups());
-            userGroupService.updateUser(mutableUserInfo, false);
-        }
-    }
-
-    private void checkIfBindAndSearchActive(LdapSetting ldapSetting, String userName) {
-        if (StringUtils.isNotBlank(ldapSetting.getUserDnPattern()) &&
-                ldapSetting.getSearch() != null) {
-            log.warn("LDAP authentication failed for '{}'. Note: you have configured direct user binding and " +
-                    "manager-based search, which are usually mutually exclusive. For AD leave the User DN Pattern " +
-                    "field empty.", userName);
-        }
-    }
-
-    @Override
-    public String getRealm() {
-        return LdapService.REALM;
-    }
-
-    @Override
-    public void addExternalGroups(String username, Set<UserGroupInfo> groups) {
-        addonsManager.addonByType(LdapGroupAddon.class).addExternalGroups(username, groups);
-    }
-
-    @Override
-    public boolean userExists(String username) {
-        List<LdapSetting> settings = centralConfig.getMutableDescriptor().getSecurity().getLdapSettings();
-        if (settings == null || settings.isEmpty()) {
-            log.debug("No LDAP settings defined");
-            return false;
-        }
-        for (LdapSetting setting : settings) {
-            if (setting.isEnabled()) {
-                log.debug("Trying to find user '{}' with LDAP settings '{}'", username, setting);
-                LdapUser ldapUser = ldapService.getDnFromUserName(setting, username);
-                if (ldapUser != null) {
-                    log.debug("Found user '{}' with LDAP settings '{}'", username, setting);
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/security/ldap/ArtifactoryLdapAuthenticator.java b/backend/core/src/main/java/org/artifactory/security/ldap/ArtifactoryLdapAuthenticator.java
deleted file mode 100644
index 905966e..0000000
--- a/backend/core/src/main/java/org/artifactory/security/ldap/ArtifactoryLdapAuthenticator.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security.ldap;
-
-import com.google.common.collect.Maps;
-import org.apache.commons.lang.ObjectUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.LdapGroupAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.config.InternalCentralConfigService;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.security.ldap.LdapSetting;
-import org.artifactory.descriptor.security.ldap.SearchPattern;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.util.PathUtils;
-import org.artifactory.version.CompoundVersionDetails;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.ldap.core.DirContextOperations;
-import org.springframework.ldap.core.support.LdapContextSource;
-import org.springframework.security.authentication.AuthenticationServiceException;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.ldap.DefaultSpringSecurityContextSource;
-import org.springframework.security.ldap.authentication.BindAuthenticator;
-import org.springframework.stereotype.Component;
-
-import javax.naming.Context;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Wrapper for the LDAP bind authenticator. Used to authenticate users against ldap and as a factory for the security
- * context and actual authenticator.
- *
- * @author Yossi Shaul
- */
- at Reloadable(beanClass = InternalLdapAuthenticator.class, initAfter = InternalCentralConfigService.class)
- at Component
-public class ArtifactoryLdapAuthenticator implements InternalLdapAuthenticator {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryLdapAuthenticator.class);
-
-    private static final String NO_LDAP_SERVICE_CONFIGURED = "No LDAP service configured";
-    public static final String LDAP_SERVICE_MISCONFIGURED = "LDAP service misconfigured";
-
-    @Autowired
-    private CentralConfigService centralConfig;
-
-    private Map<String, BindAuthenticator> authenticators;
-
-    @Override
-    public void init() {
-        try {
-            authenticators = createBindAuthenticators();
-            if (authenticators.isEmpty()) {
-                authenticators = null;
-            }
-        } catch (Exception e) {
-            log.error("Failed to create LDAP authenticator. Please verify and fix your LDAP settings.", e);
-        }
-        if (authenticators == null) {
-            log.debug("LDAP service is disabled");
-        }
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-        if (!centralConfig.getDescriptor().getSecurity().equals(oldDescriptor.getSecurity())
-                || !ObjectUtils.equals(centralConfig.getDescriptor().getDefaultProxy(), oldDescriptor.getDefaultProxy())
-                || authenticators == null) {
-            authenticators = null;
-            init();
-        }
-    }
-
-    @Override
-    public void destroy() {
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-    }
-
-    @Override
-    public Map<String, BindAuthenticator> getAuthenticators() {
-        return authenticators;
-    }
-
-    private Map<String, BindAuthenticator> createBindAuthenticators() {
-        Map<String, BindAuthenticator> result = Maps.newLinkedHashMap();
-        LdapGroupAddon groupAddon = ContextHelper.get().beanForType(AddonsManager.class).addonByType(
-                LdapGroupAddon.class);
-        List<LdapSetting> ldapSettings = groupAddon.getEnabledLdapSettings();
-        for (LdapSetting ldapSetting : ldapSettings) {
-            LdapContextSource contextSource = createSecurityContext(ldapSetting);
-            ArtifactoryBindAuthenticator bindAuthenticator =
-                    new ArtifactoryBindAuthenticator(contextSource, ldapSetting);
-            result.put(ldapSetting.getKey(), bindAuthenticator);
-        }
-        return result;
-    }
-
-    static LdapContextSource createSecurityContext(LdapSetting ldapSetting) {
-        String url = ldapSetting.getLdapUrl();
-        String scheme = getLdapScheme(url);
-        String baseUrl = getLdapBaseUrl(scheme, url);
-        DefaultSpringSecurityContextSource contextSource = new DefaultSpringSecurityContextSource(scheme + baseUrl);
-        contextSource.setBase(adjustBase(url.substring((scheme + baseUrl).length())));
-
-        // set default connection timeout, read timeout and referral strategy.
-        Map<String, Object> env = new HashMap<>();
-        String connectTimeout = ArtifactoryHome.get().getArtifactoryProperties().getProperty(
-                "artifactory.security.ldap.connect.timeoutMillis", "10000");
-        env.put("com.sun.jndi.ldap.connect.timeout",connectTimeout);
-        String readTimeout = ArtifactoryHome.get().getArtifactoryProperties().getProperty(
-                "artifactory.security.ldap.socket.timeoutMillis", "15000");
-            env.put("com.sun.jndi.ldap.read.timeout", readTimeout);
-        String referralStrategy = ArtifactoryHome.get().getArtifactoryProperties().getProperty(
-                "artifactory.security.ldap.referralStrategy", "follow");
-        env.put(Context.REFERRAL, referralStrategy);
-        String poolIdleTimeout = ArtifactoryHome.get().getArtifactoryProperties().getProperty(
-                "artifactory.security.ldap.pool.timeoutMillis", null);
-        if (poolIdleTimeout != null) {
-            env.put("com.sun.jndi.ldap.connect.pool.timeout", poolIdleTimeout);
-        }
-
-        contextSource.setBaseEnvironmentProperties(env);
-        SearchPattern searchPattern = ldapSetting.getSearch();
-        if (searchPattern != null) {
-            if (PathUtils.hasText(searchPattern.getManagerDn())) {
-                contextSource.setUserDn(searchPattern.getManagerDn());
-                contextSource.setPassword(CryptoHelper.decryptIfNeeded(searchPattern.getManagerPassword()));
-            } else {
-                contextSource.setAnonymousReadOnly(true);
-            }
-        }
-
-        try {
-            contextSource.afterPropertiesSet();
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-        return contextSource;
-    }
-
-    private static String getLdapBaseUrl(String scheme, String url) {
-        url = url.substring(scheme.length());
-        int index = url.indexOf('/');
-        if (index != -1) {
-            return url.substring(0, index);
-        } else {
-            return url;
-        }
-    }
-
-    private static String getLdapScheme(String url) {
-        String scheme = url.substring(0, url.indexOf("//") + 2);
-        return scheme.substring(0, url.indexOf('/')) + "//";
-    }
-
-    /**
-     * Adjust the base {@link org.springframework.ldap.core.DistinguishedName} of the {@link LdapContextSource} which is
-     * space escaped
-     *
-     * @param url The entire LDAP url
-     * @return The escaped base DN
-     */
-    private static String adjustBase(String url) {
-        url = url.replace(" ", "%20");
-        URI uri;
-        try {
-            uri = new URI(url);
-        } catch (URISyntaxException e) {
-            throw new IllegalArgumentException("Could not parse LDAP URL.", e);
-        }
-        String base = uri.getPath();
-        if (base.indexOf('/') == 0) {
-            return base.substring(1);
-        } else {
-            return base;
-        }
-    }
-
-    @Override
-    public DirContextOperations authenticate(Authentication authentication) {
-        //Spring expects an exception on failed authentication
-        if (authenticators != null && centralConfig.getDescriptor().getSecurity().isLdapEnabled()) {
-            RuntimeException authenticationException = null;
-            for (BindAuthenticator authenticator : authenticators.values()) {
-                DirContextOperations user = null;
-                try {
-                    user = authenticator.authenticate(authentication);
-                } catch (RuntimeException e) {
-                    authenticationException = e;
-                }
-                if (user != null) {
-                    return user;
-                }
-            }
-            if (authenticationException != null) {
-                throw authenticationException;
-            }
-            throw new AuthenticationServiceException(LDAP_SERVICE_MISCONFIGURED);
-        } else {
-            throw new AuthenticationServiceException(NO_LDAP_SERVICE_CONFIGURED);
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/ldap/DaoLdapAuthoritiesPopulator.java b/backend/core/src/main/java/org/artifactory/security/ldap/DaoLdapAuthoritiesPopulator.java
deleted file mode 100644
index f5fb682..0000000
--- a/backend/core/src/main/java/org/artifactory/security/ldap/DaoLdapAuthoritiesPopulator.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security.ldap;
-
-import com.google.common.collect.Sets;
-import org.artifactory.security.SecurityServiceImpl;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.ldap.core.DirContextOperations;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.security.ldap.userdetails.LdapAuthoritiesPopulator;
-
-import java.util.Collection;
-
-public class DaoLdapAuthoritiesPopulator implements LdapAuthoritiesPopulator {
-    @Autowired
-    private UserDetailsService userDetailsService;
-
-    @Override
-    public Collection<? extends GrantedAuthority> getGrantedAuthorities(DirContextOperations userData,
-            String username) {
-        try {
-            UserDetails userDetails = userDetailsService.loadUserByUsername(username);
-            return userDetails.getAuthorities();
-        } catch (UsernameNotFoundException e) {
-            return Sets.<GrantedAuthority>newHashSet(new SimpleGrantedAuthority(SecurityServiceImpl.ROLE_USER));
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/ldap/InternalLdapAuthenticator.java b/backend/core/src/main/java/org/artifactory/security/ldap/InternalLdapAuthenticator.java
deleted file mode 100644
index baa062b..0000000
--- a/backend/core/src/main/java/org/artifactory/security/ldap/InternalLdapAuthenticator.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security.ldap;
-
-import org.artifactory.spring.ReloadableBean;
-import org.springframework.security.ldap.authentication.BindAuthenticator;
-import org.springframework.security.ldap.authentication.LdapAuthenticator;
-
-import java.util.Map;
-
-/**
- * @author Tomer Cohen
- */
-public interface InternalLdapAuthenticator extends LdapAuthenticator, ReloadableBean {
-    Map<String, BindAuthenticator> getAuthenticators();
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/security/ldap/LdapRealmAwareAuthentication.java b/backend/core/src/main/java/org/artifactory/security/ldap/LdapRealmAwareAuthentication.java
deleted file mode 100644
index 695d01a..0000000
--- a/backend/core/src/main/java/org/artifactory/security/ldap/LdapRealmAwareAuthentication.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security.ldap;
-
-import org.artifactory.api.security.ldap.LdapService;
-import org.artifactory.security.RealmAwareUserPassAuthenticationToken;
-import org.springframework.security.core.GrantedAuthority;
-
-import java.util.Collection;
-
-/**
- * UsernamePasswordAuthenticationToken that is realm aware, LDAP
- *
- * @author Tomer Cohen
- */
-public class LdapRealmAwareAuthentication extends RealmAwareUserPassAuthenticationToken {
-
-    public LdapRealmAwareAuthentication(Object principal, Object credentials) {
-        super(principal, credentials);
-    }
-
-    public LdapRealmAwareAuthentication(Object principal, Object credentials,
-            Collection<? extends GrantedAuthority> authorities) {
-        super(principal, credentials, authorities);
-    }
-
-    @Override
-    public String getRealm() {
-        return LdapService.REALM;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/ldap/LdapServiceImpl.java b/backend/core/src/main/java/org/artifactory/security/ldap/LdapServiceImpl.java
deleted file mode 100644
index 2a36f2c..0000000
--- a/backend/core/src/main/java/org/artifactory/security/ldap/LdapServiceImpl.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security.ldap;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.CoreAddonsImpl;
-import org.artifactory.addon.LdapGroupAddon;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.security.ldap.LdapService;
-import org.artifactory.api.security.ldap.LdapUser;
-import org.artifactory.descriptor.security.ldap.LdapSetting;
-import org.artifactory.descriptor.security.ldap.SearchPattern;
-import org.artifactory.spring.InternalArtifactoryContext;
-import org.artifactory.spring.InternalContextHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.ldap.CommunicationException;
-import org.springframework.ldap.core.DirContextAdapter;
-import org.springframework.ldap.core.DirContextOperations;
-import org.springframework.ldap.core.LdapTemplate;
-import org.springframework.ldap.core.support.LdapContextSource;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.ldap.search.FilterBasedLdapUserSearch;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-import static org.apache.commons.lang.StringUtils.isBlank;
-
-/**
- * This class tests an ldap connection given a ldap settings.
- *
- * @author Yossi Shaul
- * @author Tomer Cohen
- */
- at Service
-public class LdapServiceImpl extends AbstractLdapService implements LdapService {
-    private static final Logger log = LoggerFactory.getLogger(LdapServiceImpl.class);
-
-    @Override
-    public BasicStatusHolder testLdapConnection(LdapSetting ldapSetting, String username, String password) {
-        BasicStatusHolder status = new BasicStatusHolder();
-        try {
-            LdapContextSource securityContext =
-                    ArtifactoryLdapAuthenticator.createSecurityContext(ldapSetting);
-            ArtifactoryBindAuthenticator authenticator = new ArtifactoryBindAuthenticator(
-                    securityContext, ldapSetting);
-            UsernamePasswordAuthenticationToken authentication =
-                    new UsernamePasswordAuthenticationToken(username, password);
-            authenticator.authenticate(authentication);
-            status.status("Successfully connected and authenticated the test user", log);
-            LdapTemplate ldapTemplate = createLdapTemplate(ldapSetting);
-            LdapUser ldapUser = getUserFromLdapSearch(ldapTemplate, username, ldapSetting);
-            if (ldapUser == null) {
-                status.warn(
-                        "LDAP user search failed, LDAP queries concerning users and groups may not be available.",
-                        log);
-            }
-        } catch (Exception e) {
-            log.debug("Error while testing LDAP authentication: " + e.getMessage(), e);
-            SearchPattern pattern = ldapSetting.getSearch();
-            if ((pattern != null && StringUtils.isNotBlank(pattern.getSearchFilter())) &&
-                    StringUtils.isNotBlank(ldapSetting.getUserDnPattern())) {
-                handleException(e, status, username, true);
-            } else {
-                handleException(e, status, username, false);
-            }
-        }
-        return status;
-    }
-
-    private LdapGroupAddon getLdapGroupAddon() {
-        InternalArtifactoryContext context = InternalContextHelper.get();
-        if (context != null) {
-            AddonsManager addonsManager = context.beanForType(AddonsManager.class);
-            return addonsManager.addonByType(LdapGroupAddon.class);
-        } else {
-            return new CoreAddonsImpl();
-        }
-    }
-
-
-    @Override
-    @SuppressWarnings({"unchecked"})
-    public LdapUser getDnFromUserName(LdapSetting ldapSetting, String userName) {
-        if (ldapSetting == null) {
-            log.warn("Cannot find user '{}' in LDAP: No LDAP settings defined.", userName);
-            return null;
-        }
-        if (!ldapSetting.isEnabled()) {
-            log.warn("Cannot find user '{}' in LDAP: LDAP settings not enabled.", userName);
-            return null;
-        }
-        if (ldapSetting.getSearch() == null || isBlank(ldapSetting.getSearch().getSearchFilter())) {
-            log.warn("Cannot find user '{}' in LDAP: No search filter defined.", userName);
-            return null;
-        }
-        LdapTemplate ldapTemplate = createLdapTemplate(ldapSetting);
-        return getUserFromLdapSearch(ldapTemplate, userName, ldapSetting);
-    }
-
-    public DirContextOperations searchUserInLdap(LdapTemplate ldapTemplate, String userName, LdapSetting settings) {
-        if (settings.getSearch() == null) {
-            return null;
-        }
-        DirContextOperations contextOperations = null;
-        try {
-            log.debug("Searching for user {}", userName);
-            List<FilterBasedLdapUserSearch> ldapUserSearches = getLdapGroupAddon().getLdapUserSearches(
-                    ldapTemplate.getContextSource(), settings);
-            for (FilterBasedLdapUserSearch ldapUserSearch : ldapUserSearches) {
-                try {
-                    contextOperations = ldapUserSearch.searchForUser(userName);
-                } catch (org.springframework.security.core.AuthenticationException e) {
-                    log.debug("Failed to retrieve groups user '{}' via LDAP: {}", userName, e.getMessage());
-                }
-                if (contextOperations != null) {
-                    break;
-                }
-            }
-            if (contextOperations != null) {
-                // Only DirContextAdapter can be used since the LDAP connection need to be released and we still need
-                // read access to this LDAP context.
-                if (!(contextOperations instanceof DirContextAdapter)) {
-                    throw new ClassCastException(
-                            "Cannot use LDAP DirContext class " + contextOperations.getClass().getName() +
-                                    " it should be " + DirContextAdapter.class.getName());
-                }
-                log.debug("Found user {}, has DN: {}", userName, contextOperations.getNameInNamespace());
-            }
-        } catch (CommunicationException ce) {
-            String message =
-                    String.format("Failed to retrieve groups for user '%s' via LDAP: communication error.", userName);
-            log.warn(message);
-        } catch (Exception e) {
-            String message = "Unexpected exception in LDAP query:";
-            log.debug(message, e);
-            log.warn(message + "for user {} vid LDAP: {}", userName, e.getMessage());
-        }
-        return contextOperations;
-    }
-
-
-    private LdapUser getUserFromLdapSearch(LdapTemplate ldapTemplate, String userName, LdapSetting settings) {
-        DirContextOperations contextOperations = searchUserInLdap(ldapTemplate, userName, settings);
-        if (contextOperations == null) {
-            return null;
-        }
-        return new LdapUser(userName, contextOperations.getNameInNamespace());
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/ldap/UserContextMapper.java b/backend/core/src/main/java/org/artifactory/security/ldap/UserContextMapper.java
deleted file mode 100644
index 93e5b63..0000000
--- a/backend/core/src/main/java/org/artifactory/security/ldap/UserContextMapper.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security.ldap;
-
-import org.artifactory.api.security.ldap.LdapUser;
-import org.springframework.ldap.core.DirContextOperations;
-import org.springframework.ldap.core.support.AbstractContextMapper;
-
-/**
- * User mapper from ldap
- *
- * @author Tomer Cohen
- * @see GroupContextMapper
- */
-public class UserContextMapper extends AbstractContextMapper {
-
-    /**
-     * Method to map user from ldap attributes
-     *
-     * @param ctx The ldap context
-     * @return The mapped ldap user {@link org.artifactory.api.security.ldap.LdapUser}
-     */
-    @Override
-    protected LdapUser doMapFromContext(DirContextOperations ctx) {
-        String uidFromLdap = ctx.getStringAttribute("uid");
-        return new LdapUser(uidFromLdap, ctx.getNameInNamespace());
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/mission/control/MissionControlAuthenticationProviderImpl.java b/backend/core/src/main/java/org/artifactory/security/mission/control/MissionControlAuthenticationProviderImpl.java
deleted file mode 100644
index 654fcda..0000000
--- a/backend/core/src/main/java/org/artifactory/security/mission/control/MissionControlAuthenticationProviderImpl.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- */
-package org.artifactory.security.mission.control;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.security.MutableUserInfo;
-import org.artifactory.security.SimpleUser;
-import org.artifactory.security.UserInfo;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.core.Authentication;
-
-/**
- * @author Gidi Shabat
- */
-public class MissionControlAuthenticationProviderImpl implements MissionControlAuthenticationProvider {
-    private static final Logger log = LoggerFactory.getLogger(MissionControlAuthenticationProviderImpl.class);
-
-    @Override
-    public Authentication getFullAuthentication(String userName) {
-        log.debug("Starting to generate Mission control authentication");
-        UserGroupService userGroupService = ContextHelper.get().beanForType(UserGroupService.class);
-        UserInfo userInfo = userGroupService.findOrCreateExternalAuthUser(userName, true);
-        MutableUserInfo mutableUserInfo = InfoFactoryHolder.get().copyUser(userInfo);
-        mutableUserInfo.setRealm(MissionControlAuthenticationProvider.REALM);
-        mutableUserInfo.setAdmin(true);
-        userInfo = mutableUserInfo;
-        SimpleUser user = new SimpleUser(userInfo);
-        // create new authentication response containing the user and it's authorities.
-        log.debug("Finished to create Mission Control authentication");
-        return new MissionControlAuthenticationToken(user, user.getAuthorities());
-    }
-
-    @Override
-    public Authentication getAnonymousAuthentication() {
-        log.debug("Starting to generate Anonymous authentication");
-        UserGroupService userGroupService = ContextHelper.get().beanForType(UserGroupService.class);
-        UserInfo userInfo = userGroupService.findOrCreateExternalAuthUser(UserInfo.ANONYMOUS, true);
-        MutableUserInfo mutableUserInfo = InfoFactoryHolder.get().copyUser(userInfo);
-        mutableUserInfo.setRealm(MissionControlAuthenticationProvider.REALM);
-        userInfo = mutableUserInfo;
-        SimpleUser user = new SimpleUser(userInfo);
-        // create new authentication response containing the user and it's authorities.
-        log.debug("Finished to create Anonymous authentication");
-        return new MissionControlAuthenticationToken(user, user.getAuthorities());
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/mission/control/MissionControlAuthenticationToken.java b/backend/core/src/main/java/org/artifactory/security/mission/control/MissionControlAuthenticationToken.java
deleted file mode 100644
index be4102b..0000000
--- a/backend/core/src/main/java/org/artifactory/security/mission/control/MissionControlAuthenticationToken.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- */
-package org.artifactory.security.mission.control;
-
-import org.artifactory.security.SimpleUser;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.GrantedAuthority;
-
-import java.util.Collection;
-
-/**
- * @author Gidi Shabat
- */
-public class MissionControlAuthenticationToken extends UsernamePasswordAuthenticationToken {
-    public MissionControlAuthenticationToken(SimpleUser principal, Collection<? extends GrantedAuthority> authorities) {
-        super(principal, "", authorities);
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/security/props/auth/BadPropsAuthException.java b/backend/core/src/main/java/org/artifactory/security/props/auth/BadPropsAuthException.java
deleted file mode 100644
index 2496dba..0000000
--- a/backend/core/src/main/java/org/artifactory/security/props/auth/BadPropsAuthException.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.artifactory.security.props.auth;
-
-import org.springframework.security.core.AuthenticationException;
-
-/**
- * @author Chen Keinan
- */
-public class BadPropsAuthException extends AuthenticationException {
-    public BadPropsAuthException(String msg) {
-        super(msg);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/props/auth/PropsAuthNotFoundException.java b/backend/core/src/main/java/org/artifactory/security/props/auth/PropsAuthNotFoundException.java
deleted file mode 100644
index 27d3aa3..0000000
--- a/backend/core/src/main/java/org/artifactory/security/props/auth/PropsAuthNotFoundException.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.artifactory.security.props.auth;
-
-import org.springframework.security.core.AuthenticationException;
-
-/**
- * @author Chen Keinan
- */
-public class PropsAuthNotFoundException extends AuthenticationException {
-    public PropsAuthNotFoundException(String msg) {
-        super(msg);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/ssh/ArtifactoryCommandFactory.java b/backend/core/src/main/java/org/artifactory/security/ssh/ArtifactoryCommandFactory.java
deleted file mode 100644
index 650ceef..0000000
--- a/backend/core/src/main/java/org/artifactory/security/ssh/ArtifactoryCommandFactory.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.artifactory.security.ssh;
-
-import org.apache.sshd.server.Command;
-import org.apache.sshd.server.CommandFactory;
-import org.apache.sshd.server.command.UnknownCommand;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.gitlfs.GitLfsAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.security.props.auth.SshTokenManager;
-import org.artifactory.security.ssh.command.CliAuthenticateCommand;
-import org.artifactory.storage.security.service.UserGroupStoreService;
-
-/**
- * @author Noam Y. Tenne
- * @author Chen Keinan
- */
-public class ArtifactoryCommandFactory implements CommandFactory {
-
-    private CentralConfigService centralConfigService;
-    private UserGroupStoreService userGroupStoreService;
-    private SshTokenManager sshTokenManager;
-
-    public ArtifactoryCommandFactory(CentralConfigService centralConfigService,
-                                     UserGroupStoreService userGroupStoreService, SshTokenManager sshTokenManager) {
-        this.centralConfigService = centralConfigService;
-        this.userGroupStoreService = userGroupStoreService;
-        this.sshTokenManager = sshTokenManager;
-    }
-
-    @Override
-    public Command createCommand(String command) {
-        GitLfsAddon gitLfsAddon = ContextHelper.get().beanForType(AddonsManager.class).addonByType(GitLfsAddon.class);
-        // if git lfs command
-        if (gitLfsAddon.isGitLfsCommand(command)) {
-            return gitLfsAddon.createGitLfsCommand(command, sshTokenManager);
-        }
-        // if cli command
-        if (CliAuthenticateCommand.COMMAND_NAME.startsWith(command)) {
-            return new CliAuthenticateCommand(centralConfigService, userGroupStoreService, command, sshTokenManager);
-        }
-        return new UnknownCommand(command);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/ssh/InternalSshAuthService.java b/backend/core/src/main/java/org/artifactory/security/ssh/InternalSshAuthService.java
deleted file mode 100644
index 5782c54..0000000
--- a/backend/core/src/main/java/org/artifactory/security/ssh/InternalSshAuthService.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.artifactory.security.ssh;
-
-import org.artifactory.api.security.SshAuthService;
-import org.artifactory.spring.ReloadableBean;
-
-/**
- * @author Noam Y. Tenne
- */
-public interface InternalSshAuthService extends ReloadableBean, SshAuthService {
-
-
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/ssh/PublicKeyAuthenticator.java b/backend/core/src/main/java/org/artifactory/security/ssh/PublicKeyAuthenticator.java
deleted file mode 100644
index 098bf6e..0000000
--- a/backend/core/src/main/java/org/artifactory/security/ssh/PublicKeyAuthenticator.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package org.artifactory.security.ssh;
-
-import org.apache.commons.codec.binary.Base64;
-import org.apache.sshd.server.PublickeyAuthenticator;
-import org.apache.sshd.server.session.ServerSession;
-import org.artifactory.security.UserInfo;
-import org.artifactory.storage.security.service.UserGroupStoreService;
-import org.bouncycastle.jcajce.provider.asymmetric.rsa.BCRSAPublicKey;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.security.PublicKey;
-import java.security.interfaces.RSAPublicKey;
-
-/**
- * @author Noam Y. Tenne
- */
-public class PublicKeyAuthenticator implements PublickeyAuthenticator {
-
-    private static final Logger log = LoggerFactory.getLogger(PublicKeyAuthenticator.class);
-
-    private UserGroupStoreService userGroupStoreService;
-
-    public PublicKeyAuthenticator(UserGroupStoreService userGroupStoreService) {
-        this.userGroupStoreService = userGroupStoreService;
-    }
-
-    @Override
-    public boolean authenticate(String username, PublicKey key, ServerSession session) {
-        String sshPublicKey;
-        try {
-            sshPublicKey = decodedPublicKey(key);
-        } catch (IOException e) {
-            log.error("Failed to read public key as blob", e);
-            return false;
-        }
-        UserInfo userInfo = userGroupStoreService.findUserByProperty("sshPublicKey", sshPublicKey);
-        if (userInfo != null) {
-            session.setAttribute(new UsernameAttributeKey(), userInfo.getUsername());
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * decode public key and return it as string
-     * @param key - public key
-     * @return
-     * @throws IOException
-     */
-    private String decodedPublicKey(PublicKey key) throws IOException {
-        String algorithm = key.getAlgorithm();
-        if ("RSA".equals(algorithm)) {
-            byte[] rawKey = rsaKeyToBytes((RSAPublicKey) key);
-            return "ssh-rsa " + Base64.encodeBase64String(rawKey);
-        }
-        return "";
-    }
-
-    /**
-     * convert rsa key to bytes
-     * @param publicKey - rsa public key
-     * @return rsa key as byte array
-     * @throws IOException
-     */
-    private static byte[] rsaKeyToBytes(RSAPublicKey publicKey) throws IOException {
-        ByteArrayOutputStream out = new ByteArrayOutputStream();
-        writeLengthFirst("ssh-rsa".getBytes(), out);
-        writeLengthFirst(publicKey.getPublicExponent().toByteArray(), out);
-        writeLengthFirst(publicKey.getModulus().toByteArray(), out);
-        return out.toByteArray();
-    }
-
-    // http://www.ietf.org/rfc/rfc4253.txt
-
-    /**
-     * write public key data to byte array output stream
-     * @param array - byte array
-     * @param out - byte array output stream
-     * @throws IOException
-     */
-    private static void writeLengthFirst(byte[] array, ByteArrayOutputStream out) throws IOException {
-        out.write((array.length >>> 24) & 0xFF);
-        out.write((array.length >>> 16) & 0xFF);
-        out.write((array.length >>> 8) & 0xFF);
-        out.write((array.length) & 0xFF);
-        if (array.length == 1 && array[0] == (byte) 0x00) {
-            out.write(new byte[0]);
-        } else {
-            out.write(array);
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/ssh/SshAuthServiceImpl.java b/backend/core/src/main/java/org/artifactory/security/ssh/SshAuthServiceImpl.java
deleted file mode 100644
index 117dfdc..0000000
--- a/backend/core/src/main/java/org/artifactory/security/ssh/SshAuthServiceImpl.java
+++ /dev/null
@@ -1,212 +0,0 @@
-package org.artifactory.security.ssh;
-
-import org.apache.sshd.SshServer;
-import org.apache.sshd.common.keyprovider.FileKeyPairProvider;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.security.SecurityDescriptor;
-import org.artifactory.descriptor.security.sshserver.SshServerSettings;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.security.props.auth.SshTokenManager;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.storage.security.service.UserGroupStoreService;
-import org.artifactory.version.CompoundVersionDetails;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-
-/**
- * @author Noam Y. Tenne
- * @author Chen Keinan
- */
- at Service
- at Reloadable(beanClass = InternalSshAuthService.class)
-public class SshAuthServiceImpl implements InternalSshAuthService {
-
-    private static final Logger log = LoggerFactory.getLogger(SshAuthServiceImpl.class);
-
-    public final static String PUBLIC_KEY_FILE_NAME = "artifactory.ssh.public";
-    public final static String PRIVATE_KEY_FILE_NAME = "artifactory.ssh.private";
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Autowired
-    UserGroupStoreService userGroupStoreService;
-
-    @Autowired
-    SshTokenManager tokenManager;
-
-    private SshServer server;
-
-    @Override
-    public void init() {
-        configureAndStartServer();
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-        stopServer();
-        configureAndStartServer();
-    }
-
-    @Override
-    public void destroy() {
-        stopServer();
-    }
-
-    @Override
-    public boolean hasPublicKey() {
-        return Files.exists(getPublicKeyFile());
-    }
-
-    @Override
-    public boolean hasPrivateKey() {
-        return Files.exists(getPrivateKeyFile());
-    }
-
-    @Override
-    public Path getPublicKeyFile() {
-        return sshFolder().resolve(PUBLIC_KEY_FILE_NAME);
-    }
-
-    @Override
-    public Path getPrivateKeyFile() {
-        return sshFolder().resolve(PRIVATE_KEY_FILE_NAME);
-    }
-
-    @Override
-    public void savePublicKey(String publicKey) throws Exception {
-        createSshFolder();
-        Path path = getPublicKeyFile();
-        if (Files.notExists(path)) {
-            try {
-                Files.createFile(path);
-            } catch (IOException e) {
-                throw new Exception("Failed creating public key file: " + path.toAbsolutePath());
-            }
-        }
-        Files.write(path, publicKey.getBytes());
-        log.info("Successfully updated SSH public key");
-    }
-
-    @Override
-    public void savePrivateKey(String privateKey) throws Exception {
-        createSshFolder();
-        Path path = getPrivateKeyFile();
-        if (Files.notExists(path)) {
-            try {
-                Files.createFile(path);
-            } catch (IOException e) {
-                throw new Exception("Failed creating private key file: " + path.toAbsolutePath());
-            }
-        }
-        Files.write(path, privateKey.getBytes());
-        log.info("Successfully updated SSH private key");
-    }
-
-    @Override
-    public void removePublicKey() throws Exception {
-        Path publicKeyFile = getPublicKeyFile();
-        try {
-            Files.deleteIfExists(publicKeyFile);
-        } catch (IOException e) {
-            throw new Exception("Failed to delete SSH public key file");
-        }
-        log.info("SSH public key was deleted");
-    }
-
-    @Override
-    public void removePrivateKey() throws Exception {
-        Path privateKeyFile = getPrivateKeyFile();
-        try {
-            Files.deleteIfExists(privateKeyFile);
-        } catch (IOException e) {
-            throw new Exception("Failed to delete SSH private key file");
-        }
-        log.info("SSH private key was deleted");
-    }
-
-    /**
-     * create ssh folder and check folder permission
-     * @throws IOException
-     */
-    private void createSshFolder() throws IOException {
-        Path securityFolder = sshFolder();
-        if (Files.notExists(securityFolder)) {
-            Files.createDirectory(securityFolder);
-            CryptoHelper.setPermissionsOnSecurityFolder(securityFolder);
-        }
-        CryptoHelper.checkPermissionsOnSecurityFolder(securityFolder);
-    }
-
-    /**
-     * configure and start ssh server
-     */
-    private void configureAndStartServer() {
-        if (centralConfigService != null && centralConfigService.getDescriptor() != null) {
-            SecurityDescriptor securityDescriptor = centralConfigService.getDescriptor().getSecurity();
-            if (securityDescriptor != null) {
-                SshServerSettings sshServerSettings = securityDescriptor.getSshServerSettings();
-                if (sshServerSettings != null) {
-                    if (!sshServerSettings.isEnableSshServer()) {
-                        return;
-                    }
-                    configServer();
-                    try {
-                        server.start();
-                    } catch (IOException e) {
-                        log.error("Failed to start SSH server", e);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * stop ssh server
-     */
-    private void stopServer() {
-        if (server == null) {
-            return;
-        }
-        try {
-            server.stop(true);
-            while(!server.isClosed() && server.isClosing()) {
-                Thread.sleep(10);
-            }
-        } catch (InterruptedException e) {
-            log.error("Failed to stop SSH server", e);
-        }
-    }
-
-    /**
-     * configure ssh server
-     */
-    private void configServer() {
-        server = SshServer.setUpDefaultServer();
-        SshServerSettings sshServerSettings = centralConfigService.getDescriptor().getSecurity().getSshServerSettings();
-        server.setPort(sshServerSettings.getSshServerPort());
-
-        String[] keys = new String[]{getPrivateKeyFile().toString(), getPublicKeyFile().toString()};
-        server.setKeyPairProvider(new FileKeyPairProvider(keys));
-        server.setPublickeyAuthenticator(new PublicKeyAuthenticator(userGroupStoreService));
-        ArtifactoryCommandFactory commandFactory = new ArtifactoryCommandFactory(centralConfigService,
-                userGroupStoreService, tokenManager);
-        server.setCommandFactory(commandFactory);
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-    }
-
-    private Path sshFolder() {
-        return ArtifactoryHome.get().getHaAwareEtcDir().toPath().resolve("ssh");
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/ssh/UsernameAttributeKey.java b/backend/core/src/main/java/org/artifactory/security/ssh/UsernameAttributeKey.java
deleted file mode 100644
index d0244e2..0000000
--- a/backend/core/src/main/java/org/artifactory/security/ssh/UsernameAttributeKey.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.artifactory.security.ssh;
-
-import org.apache.sshd.common.Session;
-
-/**
- * @author Noam Y. Tenne
- */
-public class UsernameAttributeKey extends Session.AttributeKey<String> {
-
-    @Override
-    public boolean equals(Object obj) {
-        return obj instanceof UsernameAttributeKey;
-    }
-
-    /**
-     * Use a constant hash code as we expect only one such attribute per sessions
-     */
-    @Override
-    public int hashCode() {
-        return 1337;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/ssh/command/AbstractAuthenticateCommand.java b/backend/core/src/main/java/org/artifactory/security/ssh/command/AbstractAuthenticateCommand.java
deleted file mode 100644
index 4103263..0000000
--- a/backend/core/src/main/java/org/artifactory/security/ssh/command/AbstractAuthenticateCommand.java
+++ /dev/null
@@ -1,203 +0,0 @@
-package org.artifactory.security.ssh.command;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.sshd.common.RuntimeSshException;
-import org.apache.sshd.common.SshConstants;
-import org.apache.sshd.common.io.IoWriteFuture;
-import org.apache.sshd.common.util.Buffer;
-import org.apache.sshd.server.ChannelSessionAware;
-import org.apache.sshd.server.Command;
-import org.apache.sshd.server.Environment;
-import org.apache.sshd.server.ExitCallback;
-import org.apache.sshd.server.SessionAware;
-import org.apache.sshd.server.channel.ChannelSession;
-import org.apache.sshd.server.session.ServerSession;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.rest.restmodel.JsonUtil;
-import org.artifactory.security.props.auth.SshTokenManager;
-import org.artifactory.security.props.auth.model.TokenKeyValue;
-import org.artifactory.storage.security.service.UserGroupStoreService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
-public abstract class AbstractAuthenticateCommand implements Command, SessionAware, ChannelSessionAware {
-
-    private static final Logger log = LoggerFactory.getLogger(AbstractAuthenticateCommand.class);
-    protected static final String HREF = "href";
-
-    protected CentralConfigService centralConfigService;
-    protected UserGroupStoreService userGroupStoreService;
-    protected SshTokenManager sshTokenManager;
-    private InputStream inputStream;
-    private OutputStream outputStream;
-    private OutputStream errStream;
-    private ExitCallback callback;
-    protected ServerSession serverSession;
-    protected ChannelSession channelSession;
-
-    public AbstractAuthenticateCommand(CentralConfigService centralConfigService,
-                                       UserGroupStoreService userGroupStoreService, String command,
-                                       SshTokenManager sshTokenManager) {
-        this.centralConfigService = centralConfigService;
-        this.userGroupStoreService = userGroupStoreService;
-        this.sshTokenManager = sshTokenManager;
-        parseCommandDetails(command);
-    }
-
-    /**
-     * parse command details send by ssh client
-     *
-     * @param command - command send by ssh client
-     */
-    protected abstract void parseCommandDetails(String command);
-
-    @Override
-    public void setInputStream(InputStream inputStream) {
-        this.inputStream = inputStream;
-    }
-
-    @Override
-    public void setOutputStream(OutputStream outputStream) {
-        this.outputStream = outputStream;
-    }
-
-    @Override
-    public void setErrorStream(OutputStream errStream) {
-        this.errStream = errStream;
-    }
-
-    @Override
-    public void setExitCallback(ExitCallback callback) {
-        this.callback = callback;
-    }
-
-    @Override
-    public void start(Environment env) throws IOException {
-        log.debug("Starting command");
-        String urlBase = centralConfigService.getDescriptor().getUrlBase();
-        if (StringUtils.isBlank(urlBase)) {
-            throw new RuntimeSshException("Artifactory base url is not configure");
-        }
-        // start command action
-        sendAuthHeader();
-        sendEofSignal();
-        sendExitCodeSignal();
-        sendCloseSignal();
-        // end command action
-        log.debug("Finished command");
-    }
-
-    /**
-     * update authentication header for response
-     */
-    protected abstract void sendAuthHeader() throws IOException;
-
-    @Override
-    public void destroy() {
-        log.debug("Destroying command");
-    }
-
-    @Override
-    public void setSession(ServerSession serverSession) {
-        this.serverSession = serverSession;
-    }
-
-    @Override
-    public void setChannelSession(ChannelSession channelSession) {
-        this.channelSession = channelSession;
-    }
-
-
-    /**
-     * get configure base url or use default
-     *
-     * @return base url
-     */
-    protected String getBaseUrl() {
-        String urlBase = centralConfigService.getDescriptor().getUrlBase();
-        if (StringUtils.isBlank(urlBase)) {
-            urlBase = "http://127.0.0.1:8080/artifactory";
-        }
-        return urlBase;
-    }
-
-    /**
-     * write response to output stream
-     *
-     * @param response - hhs response
-     * @param header   - header with http data
-     * @throws IOException
-     */
-    protected void writeResponse(Map<String, Object> response, Map<String, Object> header) throws IOException {
-        updateResponseHeader(response, header);
-        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
-        outputStreamWriter.write((JsonUtil.jsonToString(response)));
-        outputStreamWriter.flush();
-    }
-
-    protected void updateResponseHeader(Map<String, Object> response, Map<String, Object> header) {
-        response.put("header", header);
-    }
-
-    /**
-     * send end of file signal to server session
-     *
-     * @throws IOException
-     */
-    private void sendEofSignal() throws IOException {
-        Buffer eofBuffer = serverSession.createBuffer(SshConstants.SSH_MSG_CHANNEL_EOF);
-        eofBuffer.putInt(channelSession.getRecipient());
-        IoWriteFuture eofPacket = serverSession.writePacket(eofBuffer);
-        eofPacket.verify();
-    }
-
-    /**
-     * send exist code signal to server session
-     *
-     * @throws IOException
-     */
-    private void sendExitCodeSignal() throws IOException {
-        Buffer exitBuffer = serverSession.createBuffer(SshConstants.SSH_MSG_CHANNEL_REQUEST);
-        exitBuffer.putInt(channelSession.getRecipient());
-        exitBuffer.putString("exit-status");
-        exitBuffer.putBoolean(false);
-        exitBuffer.putInt(0);
-        IoWriteFuture exitPacket = serverSession.writePacket(exitBuffer);
-        exitPacket.verify();
-    }
-
-    /**
-     * send close signal to server session
-     *
-     * @throws IOException
-     */
-    private void sendCloseSignal() throws IOException {
-        Buffer closeBuffer = serverSession.createBuffer(SshConstants.SSH_MSG_CHANNEL_CLOSE);
-        closeBuffer.putInt(channelSession.getRecipient());
-        IoWriteFuture closePacket = serverSession.writePacket(closeBuffer);
-        closePacket.verify();
-    }
-
-    /**
-     * generate unique auth token
-     *
-     * @param username - user name to associate token
-     * @return - unique token
-     */
-    protected TokenKeyValue generateUniqueToken(String username) {
-        TokenKeyValue tokenKeyValue = sshTokenManager.createToken(username);
-        if (tokenKeyValue != null) {
-            return tokenKeyValue;
-        }
-        throw new RuntimeException("error generating new token for authentication");
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/security/ssh/command/CliAuthenticateCommand.java b/backend/core/src/main/java/org/artifactory/security/ssh/command/CliAuthenticateCommand.java
deleted file mode 100644
index baef369..0000000
--- a/backend/core/src/main/java/org/artifactory/security/ssh/command/CliAuthenticateCommand.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package org.artifactory.security.ssh.command;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.security.props.auth.SshTokenManager;
-import org.artifactory.security.props.auth.model.TokenKeyValue;
-import org.artifactory.security.ssh.UsernameAttributeKey;
-import org.artifactory.storage.security.service.UserGroupStoreService;
-import org.artifactory.util.PathUtils;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
-public class CliAuthenticateCommand extends AbstractAuthenticateCommand {
-
-    public static final String COMMAND_NAME = "jfrog-authenticate";
-
-    public CliAuthenticateCommand(CentralConfigService centralConfigService,
-                                  UserGroupStoreService userGroupStoreService,
-                                  String command, SshTokenManager sshTokenManager) {
-        super(centralConfigService, userGroupStoreService, command, sshTokenManager);
-    }
-
-    @Override
-    protected void parseCommandDetails(String command) {
-        // do nothing
-    }
-
-    protected void sendAuthHeader() throws IOException {
-        Map<String, Object> response = new HashMap<>();
-        Map<String, Object> header = new HashMap<>();
-        // update header href
-        updateHeaderHref(response);
-        // update header authorization
-        updateHeaderAuthorization(header);
-        // write response
-        writeResponse(response, header);
-    }
-
-    /**
-     * update header basic authentication
-     *
-     * @param header - header object
-     */
-    private void updateHeaderAuthorization(Map<String, Object> header) {
-        String username = serverSession.getAttribute(new UsernameAttributeKey());
-        TokenKeyValue tokenKeyValue = sshTokenManager.getToken(username);
-        if (tokenKeyValue == null) {
-            tokenKeyValue = generateUniqueToken(username);
-        }
-        header.put(SshTokenManager.AUTHORIZATION_HEADER, SshTokenManager.OAUTH_TOKEN_PREFIX + tokenKeyValue.getToken());
-    }
-
-    protected void updateResponseHeader(Map<String, Object> response, Map<String, Object> header) {
-        response.put("headers", header);
-    }
-
-    /**
-     * update header href
-     *
-     * @param response - response map
-     */
-    private void updateHeaderHref(Map<String, Object> response) {
-        String urlBase = getBaseUrl();
-        response.put(HREF, PathUtils.addTrailingSlash(urlBase));
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/service/SmartRepoService.java b/backend/core/src/main/java/org/artifactory/service/SmartRepoService.java
deleted file mode 100644
index 02b345b..0000000
--- a/backend/core/src/main/java/org/artifactory/service/SmartRepoService.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.service;
-
-import org.artifactory.fs.RepoResource;
-import org.springframework.stereotype.Service;
-
-/**
- * Provides smart repo services
- *
- * @author Michael Pasternak
- */
- at Service
-public interface SmartRepoService {
-    /**
-     * Triggered on file download
-     *
-     * @param resource
-     */
-    void onFileDownload(RepoResource resource);
-
-    /**
-     * Updates properties from remote repository (if expired)
-     *
-     * @param resource an resource to update properties for
-     *
-     * @return success/failure
-     */
-    boolean updateProperties(RepoResource resource);
-
-    /**
-     * Checks whether remote (the source) was deleted
-     *
-     * @param repoResource
-     *
-     * @return true/false
-     */
-    boolean isArtifactMarkedAsRemoteDeleted(RepoResource repoResource);
-
-    /**
-     * Signifies this {@param repoKey} supports smart repo functionality
-     */
-    boolean isSmartRepo(String repoKey);
-}
diff --git a/backend/core/src/main/java/org/artifactory/service/SmartRepoServiceImpl.java b/backend/core/src/main/java/org/artifactory/service/SmartRepoServiceImpl.java
deleted file mode 100644
index 496ffa2..0000000
--- a/backend/core/src/main/java/org/artifactory/service/SmartRepoServiceImpl.java
+++ /dev/null
@@ -1,585 +0,0 @@
-package org.artifactory.service;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpHead;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.PropertiesAddon;
-import org.artifactory.addon.replication.ReplicationAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.jackson.JacksonReader;
-import org.artifactory.api.rest.artifact.ItemProperties;
-import org.artifactory.api.rest.constant.ArtifactRestConstants;
-import org.artifactory.descriptor.repo.HttpRepoDescriptor;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.HttpRepo;
-import org.artifactory.repo.LocalRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.cache.expirable.CacheExpiry;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.request.RepoRequests;
-import org.artifactory.resource.FileResource;
-import org.artifactory.resource.RemoteRepoResource;
-import org.artifactory.resource.UnfoundRepoResource;
-import org.artifactory.util.HttpUtils;
-import org.artifactory.util.PathUtils;
-import org.artifactory.util.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Provides smart repo services
- *
- * @author Michael Pasternak
- */
- at Service
-public class SmartRepoServiceImpl implements SmartRepoService {
-
-    private static final Logger log = LoggerFactory.getLogger(SmartRepoServiceImpl.class);
-    private static final String PROPERTIES = "?properties";
-    public static final String REMOTE_DELETED = "sourceDeleted";
-    public static final String REMOTE_DELETED_MESSAGE = "The source file of this replica has been deleted";
-    private static final String REMOTE_STORAGE_API_PATH = "/api/"+ ArtifactRestConstants.PATH_ROOT+"/";
-
-
-    @Autowired
-    private InternalRepositoryService repositoryService;
-
-    private PropertiesAddon propertiesAddon;
-
-
-    /**
-     * When triggered on file download, invokes SmartRepo
-     * specific logic such as:
-     *
-     * 1. remote properties update
-     * 2. sourceDeleted=true markup
-     *
-     * @param resource The RepoResource download was triggered for
-     */
-    @Override
-    public void onFileDownload(RepoResource resource) {
-        if (isSmartRepo(resource)) {
-            log.debug("'{}' resource was downloaded", resource);
-
-            if (!resource.isFound()) {
-                return;
-            } else if (resource instanceof RemoteRepoResource) {
-                // this resource cannot be in cache as this is first download,
-                // so properties should be updated by old syncProperties mechanism
-            } else if (resource instanceof FileResource) {
-                LocalRepo localRepo = repositoryService.localRepositoryByKey(resource.getRepoPath().getRepoKey());
-                if (localRepo != null) { // local repo
-                    if (localRepo.itemExists(resource.getRepoPath().getPath())) {
-                        unRegisterRemoteDeletedResource(resource);
-                    } else {
-                        // no need to save state as will be 404 response
-                        // shell it be filtered out at line 59?
-                    }
-                } else { // not local repo
-                    updateProperties(resource);
-                }
-            }
-        }
-    }
-
-    /**
-     * Updates sourceDeleted state to true
-     *
-     * @param resource the resource to work on
-     */
-    private void updateRemoteDeleted(RepoResource resource) {
-        if(isOriginAbsenceDetectionEnabled(resource)) {
-            log.debug("Verifying remote deleted state for resource {}", resource);
-            if (isArtifactMarkedAsRemoteDeleted(resource) || !isArtifactAvailableRemotely(resource)) {
-                registerRemoteDeletedResource(resource);
-            } else {
-                unRegisterRemoteDeletedResource(resource);
-            }
-        }
-    }
-
-    /**
-     * @return true if artifact marked as sourceDeleted=true on remote
-     *         repository or false
-     */
-    @Override
-    public boolean isArtifactMarkedAsRemoteDeleted(RepoResource repoResource) {
-        Properties properties = null;
-        PropertiesAddon propertiesAddon = getPropertiesAddon();
-
-        if(isSyncPropertiesEnabled(repoResource)) {
-            // if SyncProperties enabled, we get them for free
-            // i.e nothing else left to do as sibling node aware
-            // of "source" existence/absence, we only need to look
-            // at remote properties
-            log.debug("Using local properties to check isArtifactMarkedAsRemoteDeleted");
-            properties = propertiesAddon.getProperties(repoResource.getRepoPath());
-        } else {
-            // otherwise we need to check on a sibling node whether
-            // it aware of deleted source
-            log.debug("Using remote properties to check isArtifactMarkedAsRemoteDeleted");
-            properties = fetchRemoteProperties(repoResource);
-        }
-
-        if (properties != null) {
-            Set<String> content = properties.get(REMOTE_DELETED);
-            return content != null && !content.isEmpty();
-        }
-        return false;
-    }
-
-    /**
-     * @return {@link PropertiesAddon}
-     */
-    private PropertiesAddon getPropertiesAddon() {
-        if (propertiesAddon == null) {
-            AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-            propertiesAddon = addonsManager.addonByType(PropertiesAddon.class);
-        }
-        return propertiesAddon;
-    }
-
-    /**
-     * Checks whether SyncProperties enabled for the given {@link RepoResource}
-     *
-     * @param repoResource
-     *
-     * @return true/false
-     */
-    private boolean isSyncPropertiesEnabled(RepoResource repoResource) {
-        String repoKey = StringUtils.replaceLast(repoResource.getRepoPath().getRepoKey(), "-cache", "");
-        HttpRepoDescriptor descriptor = (HttpRepoDescriptor) repositoryService.remoteRepoDescriptorByKey(repoKey);
-        if (descriptor != null) {
-            return isSmartRepo(repoResource) &&
-                    descriptor.getContentSynchronisation().getProperties().isEnabled();
-        }
-        return false;
-    }
-
-    /**
-     * Checks whether OriginAbsenceDetection is enabled for the given {@link RepoResource}
-     *
-     * @param repoResource
-     *
-     * @return true/false
-     */
-    private boolean isOriginAbsenceDetectionEnabled(RepoResource repoResource) {
-        String repoKey = StringUtils.replaceLast(repoResource.getRepoPath().getRepoKey(), "-cache", "");
-        HttpRepoDescriptor descriptor = (HttpRepoDescriptor) repositoryService.remoteRepoDescriptorByKey(repoKey);
-        if (descriptor != null) {
-            return isSmartRepo(repoResource) &&
-                    descriptor.getContentSynchronisation().getSource().isOriginAbsenceDetection();
-        }
-        return false;
-    }
-
-    /**
-     * Checks whether SmartRepo is enabled for the given {@param RepoResource}'s HttpRepo
-     *
-     * @return true/false
-     */
-    private boolean isSmartRepo(RepoResource repoResource) {
-        return isSmartRepo(repoResource.getRepoPath().getRepoKey());
-    }
-
-    /**
-     * Signifies if the {@param repoKey} is a smart repo.
-     */
-    public boolean isSmartRepo(String repoKey) {
-        repoKey = StringUtils.replaceLast(repoKey, "-cache", "");
-        HttpRepoDescriptor descriptor = (HttpRepoDescriptor) repositoryService.remoteRepoDescriptorByKey(repoKey);
-        return descriptor != null && descriptor.getContentSynchronisation() != null
-                && descriptor.getContentSynchronisation().isEnabled();
-    }
-
-    /**
-     * Registers resource as sourceDeleted
-     *
-     * @param resource
-     */
-    private void registerRemoteDeletedResource(RepoResource resource) {
-        log.debug("Registering '{}' as remoteDeleted", resource);
-        PropertiesAddon propertiesAddon = getPropertiesAddon();
-        Properties properties = propertiesAddon.getProperties(resource.getRepoPath());
-
-        if (properties.get(REMOTE_DELETED) == null
-                || properties.get(REMOTE_DELETED).size() == 0) {
-            synchronized (properties) {
-                properties.put(REMOTE_DELETED, REMOTE_DELETED_MESSAGE);
-                propertiesAddon.setProperties(resource.getRepoPath(), properties);
-            }
-        }
-    }
-
-    /**
-     * Removes markup of resource as sourceDeleted=true
-     *
-     * @param resource
-     */
-    private void unRegisterRemoteDeletedResource(RepoResource resource) {
-        log.debug("Unregistering '{}' as remoteDeleted", resource);
-        PropertiesAddon propertiesAddon = getPropertiesAddon();
-        Properties properties = propertiesAddon.getProperties(resource.getRepoPath());
-
-        if (properties.get(REMOTE_DELETED) != null
-                && properties.get(REMOTE_DELETED).size() >= 1) {
-            synchronized (properties) {
-                Iterator<Map.Entry<String, String>> iterator = properties.entries().iterator();
-                while(iterator.hasNext()) {
-                    if(iterator.next().getKey().equals(REMOTE_DELETED))
-                        iterator.remove();
-                }
-                propertiesAddon.setProperties(resource.getRepoPath(), properties);
-            }
-        }
-    }
-
-    /**
-     * Performs and API call to check if resource available remotely
-     *
-     * @param resource
-     *
-     * @return true if resource available or false
-     */
-    private boolean isArtifactAvailableRemotely(RepoResource resource) {
-        String repoKey = StringUtils.replaceLast(resource.getRepoPath().getRepoKey(), "-cache", "");
-        HttpRepo repo = (HttpRepo)repositoryService.remoteRepositoryByKey(repoKey);
-        String targetArtifact = repo.getUrl() + "/" + resource.getRepoPath().getPath();
-        HttpHead getMethod = new HttpHead(HttpUtils.encodeQuery(targetArtifact));
-        CloseableHttpResponse getResponse = null;
-
-        log.debug("Checking if '{}' available remotely", resource);
-        try {
-            getResponse = repo.executeMethod(getMethod);
-            if(HttpStatus.SC_NOT_FOUND == getResponse.getStatusLine().getStatusCode()) {
-                return false;
-            }
-        } catch (IOException e) {
-            log.error("Cannot fetch metadata for remote artifact: " + resource, e);
-            return false;
-        } finally {
-            IOUtils.closeQuietly(getResponse);
-        }
-        return true;
-    }
-
-    /**
-     * Updates properties from remote repository (if expired)
-     * and artifact sourceDeleted=true status when source
-     * file is no longer available
-     *
-     * @param resource an resource to update properties for
-     *
-     * @return false if any error occurred or true
-     */
-    @Override
-    public boolean updateProperties(RepoResource resource) {
-        boolean status = false;
-        if (isSmartRepo(resource)) {
-            log.debug("Updating properties for '{}'", resource);
-
-            if (!resource.isFound()) {
-                return status;
-            }
-
-            if (isSyncPropertiesEnabled(resource)) {
-                status = doSyncProperties(resource);
-            } else {
-                status = doSyncSourceExistence(resource);
-            }
-        }
-        return status;
-    }
-
-    /**
-     * Checks & Updates (sourceDeleted=true|false)
-     * obtainable via remote properties, if current state
-     * is expired
-     *
-     * this is actually an alternative for properties
-     * synchronization and re-use same expiry mechanism
-     *
-     * @param resource
-     *
-     * @return true if remote deleted state verified otherwise false
-     */
-    private boolean doSyncSourceExistence(RepoResource resource) {
-        if(isOriginAbsenceDetectionEnabled(resource)) {
-            String repoKey = StringUtils.replaceLast(resource.getRepoPath().getRepoKey(), "-cache", "");
-            HttpRepo repo = (HttpRepo)repositoryService.remoteRepositoryByKey(repoKey);
-
-            if (repo != null && isPropertiesExpired(resource, repo) ) {
-                updateRemoteDeleted(resource);
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Updates properties from remote repository (if expired)
-     *
-     * @param resource an resource to update properties for
-     *
-     * @return false if any error occurred or true
-     */
-    private boolean doSyncProperties(RepoResource resource) {
-        try {
-            String repoKey = StringUtils.replaceLast(resource.getRepoPath().getRepoKey(), "-cache", "");
-            HttpRepoDescriptor descriptor = (HttpRepoDescriptor) repositoryService.remoteRepoDescriptorByKey(repoKey);
-            HttpRepo repo = (HttpRepo)repositoryService.remoteRepositoryByKey(repoKey);
-
-            if (!shouldSyncProperties(descriptor, repo, resource)) {
-                return true;
-            }
-            boolean status = pullAndUpdateProperties(resource, repo);
-            updateRemoteDeleted(resource);
-            return status;
-        }catch (Exception e){
-            log.error("Smart repo failed to get properties from remote repo :" + resource.getRepoPath(), e);
-            return false;
-        }
-    }
-
-    /**
-     * Checks whether current state is applicable for the properties update
-     *
-     * @param descriptor
-     * @param repo
-     * @param resource
-     *
-     * @return success/failure
-     */
-    private boolean shouldSyncProperties(HttpRepoDescriptor descriptor, HttpRepo repo, RepoResource resource) {
-        if (descriptor == null || repo == null) {
-            log.debug("Not performing content synchronization due to missing HttpRepoDescriptor/HttpRepo in context," +
-                    " for instance, this may happen if repoKey is incorrect");
-            return false;
-        }
-
-        if (descriptor.getContentSynchronisation() == null) {
-            log.debug("Not performing content synchronization due to missing ContentSynchronisation config");
-            return false;
-        }
-
-        if (!descriptor.getContentSynchronisation().isEnabled() ||
-                !descriptor.getContentSynchronisation().getProperties().isEnabled()) {
-            log.debug("Not performing content synchronization due to disabled ContentSynchronisation");
-            return false;
-        }
-        // If file doesn't exist then do not update properties since it will be updated during file download
-        if (!repositoryService.exists(resource.getRepoPath())) {
-            log.debug("Not performing content synchronization due to absence of resource {}", resource);
-            return false;
-        }
-        if (resourceIsExpirable(resource,repo)) {
-            log.debug("Not performing content synchronization cause resource is expirable and " +
-                    "properties will be fetched along with the artifact (if enabled)");
-            return false;
-        }
-        if (!isPropertiesExpired(resource, repo) ) {
-            log.debug("Not performing content synchronization cause properties did not expired yet");
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * Fetches remote properties
-     *
-     * @param resource - repo resource
-     *
-     * @return {@link Properties}
-     */
-    private Properties fetchRemoteProperties(RepoResource resource) {
-        log.debug("Downloading remote properties for artifact {}", resource);
-
-        CloseableHttpResponse getResponse = null;
-        InputStream stream = null;
-        Properties properties = null;
-
-        String repoKey = StringUtils.replaceLast(resource.getRepoPath().getRepoKey(), "-cache", "");
-        HttpRepo repo = (HttpRepo)repositoryService.remoteRepositoryByKey(repoKey);
-
-        if (repo != null) {
-            boolean ok, notFound;
-            String targetArtifact = buildPropertiesRestApiUrl(repo, resource);
-            HttpGet getMethod = new HttpGet(HttpUtils.encodeQuery(targetArtifact));
-            try {
-                getResponse = repo.executeMethod(getMethod);
-                ok = HttpStatus.SC_OK == getResponse.getStatusLine().getStatusCode();
-                notFound = HttpStatus.SC_NOT_FOUND == getResponse.getStatusLine().getStatusCode();
-                if (ok || notFound) {
-                    stream = getResponse.getEntity().getContent();
-                    properties = (Properties) InfoFactoryHolder.get().createProperties();
-                    if (ok && stream != null) {
-                        ItemProperties itemProperties = JacksonReader.streamAsClass(stream, ItemProperties.class);
-                        RepoRequests.logToContext("Received remote property content '{}'", itemProperties);
-                        for (Map.Entry<String, String[]> entry : itemProperties.properties.entrySet()) {
-                            String[] values = entry.getValue();
-                            RepoRequests.logToContext("Found remote property key '{}' with values '%s'", entry.getKey(), values);
-                            if (!entry.getKey().startsWith(ReplicationAddon.PROP_REPLICATION_PREFIX)) {
-                                properties.putAll(entry.getKey(), values);
-                            }
-                        }
-                    }
-                }
-                repositoryService.unexpireIfExists(repo.getLocalCacheRepo(),resource.getRepoPath().getPath());
-            } catch (IOException e) {
-                log.debug("Cannot fetch remote properties", e);
-            } finally {
-                IOUtils.closeQuietly(stream);
-                IOUtils.closeQuietly(getResponse);
-            }
-        } else {
-            log.debug("Cannot determinate the HttpRepo according to repoKey {}", repoKey);
-        }
-        return properties;
-    }
-
-    /**
-     * Combines url to fetch properties
-     *
-     * @param httpRepo
-     * @param resource
-     *
-     * @return url
-     */
-    private String buildPropertiesRestApiUrl(HttpRepo httpRepo, RepoResource resource) {
-        URI uri = URI.create(httpRepo.getUrl());
-        if (uri != null) {
-            String remoteRepo = PathUtils.getLastPathElement(httpRepo.getUrl());
-
-            return new StringBuilder()
-                    .append(uri.getScheme())
-                    .append("://")
-                    .append(uri.getHost())
-                    .append(uri.getPort() != -1 ?
-                                    ":" + uri.getPort()
-                                    :
-                                    ""
-                    )
-                    .append("/")
-                    .append(PathUtils.getFirstPathElement(uri.getPath()))
-                    .append(REMOTE_STORAGE_API_PATH)
-                    .append(remoteRepo)
-                    .append("/")
-                    .append(resource.getRepoPath().getPath())
-                    .append(PROPERTIES)
-                    .toString();
-
-        } else {
-            throw new IllegalArgumentException(
-                    "HttpRepo \""+ httpRepo.getKey() + "\"  target URL \"" + httpRepo.getUrl() +
-                            "\" seems to be malformed, constructing request URI has failed"
-            );
-        }
-    }
-
-    /**
-     * Performs local properties update with remote content
-     *
-     * @param resource
-     * @param repo
-     *
-     * @return false if any error occurred or true
-     */
-    private boolean pullAndUpdateProperties(RepoResource resource, HttpRepo repo) {
-        log.debug("Downloading remote properties for artifact {}", resource);
-
-        boolean ok, notFound;
-        InputStream stream = null;
-        CloseableHttpResponse getResponse = null;
-
-        String targetArtifact = buildPropertiesRestApiUrl(repo, resource);
-        HttpGet getMethod = new HttpGet(HttpUtils.encodeQuery(targetArtifact));
-
-        try {
-            getResponse = repo.executeMethod(getMethod);
-            ok = HttpStatus.SC_OK == getResponse.getStatusLine().getStatusCode();
-            notFound = HttpStatus.SC_NOT_FOUND == getResponse.getStatusLine().getStatusCode();
-            if (ok || notFound) {
-                stream = getResponse.getEntity().getContent();
-                Properties properties = (Properties) InfoFactoryHolder.get().createProperties();
-                if (ok && stream != null) {
-                    ItemProperties itemProperties = JacksonReader.streamAsClass(stream, ItemProperties.class);
-                    RepoRequests.logToContext("Received remote property content '{}'", itemProperties);
-                    for (Map.Entry<String, String[]> entry : itemProperties.properties.entrySet()) {
-                        String[] values = entry.getValue();
-                        RepoRequests.logToContext("Found remote property key '{}' with values '%s'", entry.getKey(), values);
-                        if (!entry.getKey().startsWith(ReplicationAddon.PROP_REPLICATION_PREFIX)) {
-                            properties.putAll(entry.getKey(), values);
-                        }
-                    }
-                }
-                IOUtils.closeQuietly(getResponse);
-                if(properties == null || properties.size() == 0)
-                    log.debug("Setting empty properties following '{}' response", getResponse.getStatusLine());
-                setProperties(resource, properties);
-            }
-            repositoryService.unexpireIfExists(repo.getLocalCacheRepo(),resource.getRepoPath().getPath());
-        } catch (Exception e) {
-            log.debug("Cannot update remote properties: {}", e);
-            return false;
-        } finally {
-            IOUtils.closeQuietly(stream);
-            IOUtils.closeQuietly(getResponse);
-        }
-        return notFound ? false : ok;
-    }
-
-    private boolean resourceIsExpirable(RepoResource resource, HttpRepo repo) {
-        // If the file is expirable then the expirable mechanism is responsible to update the file and the properties
-        String path = resource.getRepoPath().getPath();
-        CacheExpiry cacheExpiry = ContextHelper.get().beanForType(CacheExpiry.class);
-        return cacheExpiry.isExpirable(repo.getLocalCacheRepo(), path);
-    }
-
-    /**
-     * Updates local Properties with remote Properties content
-     *
-     * @param resource   - repo resource
-     * @param properties - properties
-     */
-    private void setProperties(RepoResource resource, Properties properties) {
-        log.debug("Setting properties '{}' for resource '{}'", properties, resource);
-        if (properties.size() == 0 && !isArtifactAvailableRemotely(resource))
-            return;
-        PropertiesAddon propertiesAddon = getPropertiesAddon();
-        propertiesAddon.setProperties(resource.getRepoPath(), properties);
-    }
-
-    /**
-     * Checks whether given resource's properties cache has expired
-     *
-     * @param resource - repo resource
-     * @param repo - http repo
-     *
-     * @return yes/no
-     */
-    private boolean isPropertiesExpired(RepoResource resource, HttpRepo repo) {
-        RepoPath repoPath = resource.getRepoPath();
-        long lastUpdated = repositoryService.getFileInfo(repoPath).getLastUpdated();
-        long cacheAge = System.currentTimeMillis() - lastUpdated;
-        long retrievalCachePeriodMillis = repo.getRetrievalCachePeriodSecs() * 1000L;
-        // If cache age is less than retrieval cache period then do not update properties.
-        if (cacheAge < retrievalCachePeriodMillis) {
-            return false;
-        }
-        return true;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/spring/ArtifactoryApplicationContext.java b/backend/core/src/main/java/org/artifactory/spring/ArtifactoryApplicationContext.java
deleted file mode 100644
index 98d91dc..0000000
--- a/backend/core/src/main/java/org/artifactory/spring/ArtifactoryApplicationContext.java
+++ /dev/null
@@ -1,818 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.spring;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.filefilter.NameFileFilter;
-import org.apache.commons.io.filefilter.NotFileFilter;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.WebstartAddon;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.addon.license.LicensesAddon;
-import org.artifactory.addon.plugin.PluginsAddon;
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.config.ExportSettingsImpl;
-import org.artifactory.api.config.ImportSettingsImpl;
-import org.artifactory.api.context.ArtifactoryContextThreadBinder;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.common.ha.HaNodeProperties;
-import org.artifactory.converters.ConverterManager;
-import org.artifactory.converters.VersionProvider;
-import org.artifactory.converters.VersionProviderImpl;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.logging.LoggingService;
-import org.artifactory.repo.service.ExportJob;
-import org.artifactory.repo.service.ImportJob;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.sapi.common.BaseSettings;
-import org.artifactory.sapi.common.ExportSettings;
-import org.artifactory.sapi.common.ImportSettings;
-import org.artifactory.schedule.TaskCallback;
-import org.artifactory.schedule.TaskService;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.security.interceptor.StoragePropertiesEncryptInterceptor;
-import org.artifactory.state.model.ArtifactoryStateManager;
-import org.artifactory.storage.binstore.service.BinaryService;
-import org.artifactory.update.utils.BackupUtils;
-import org.artifactory.util.ZipUtils;
-import org.artifactory.version.ArtifactoryVersion;
-import org.artifactory.version.CompoundVersionDetails;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.aop.support.AopUtils;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.BeanInitializationException;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.beans.factory.config.BeanPostProcessor;
-import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
-import org.springframework.context.support.ClassPathXmlApplicationContext;
-
-import java.io.File;
-import java.io.IOException;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * @author Yoav Landman
- */
-public class ArtifactoryApplicationContext extends ClassPathXmlApplicationContext
-        implements InternalArtifactoryContext {
-    public static final String CURRENT_TIME_EXPORT_DIR_NAME = "current";
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryApplicationContext.class);
-    private final ArtifactoryHome artifactoryHome;
-    private final ConverterManager converterManager;
-    private final String contextId;
-    private final SpringConfigPaths springConfigPaths;
-    private Set<Class<? extends ReloadableBean>> toInitialize = new HashSet<>();
-    private ConcurrentHashMap<Class, Object> beansForType = new ConcurrentHashMap<>();
-    private List<ReloadableBean> reloadableBeans;
-    private VersionProviderImpl versionProvider;
-    private volatile boolean ready;
-    private long started;
-    private boolean offline;
-
-    public ArtifactoryApplicationContext(
-            String contextId, SpringConfigPaths springConfigPaths, ArtifactoryHome artifactoryHome,
-            ConverterManager converterManager, VersionProviderImpl versionProvider)
-            throws BeansException {
-        super(springConfigPaths.getAllPaths(), false, null);
-        this.contextId = contextId;
-        this.artifactoryHome = artifactoryHome;
-        this.springConfigPaths = springConfigPaths;
-        this.converterManager = converterManager;
-        this.versionProvider = versionProvider;
-        this.started = System.currentTimeMillis();
-        refresh();
-        contextCreated();
-    }
-
-    @Override
-    public ArtifactoryHome getArtifactoryHome() {
-        return artifactoryHome;
-    }
-
-    @Override
-    public String getContextId() {
-        return contextId;
-    }
-
-    @Override
-    public String getDisplayName() {
-        return contextId;
-    }
-
-    @Override
-    public SpringConfigPaths getConfigPaths() {
-        return springConfigPaths;
-    }
-
-    @Override
-    public String getServerId() {
-        //For a cluster node take it from the cluster property, otherwise use the license hash
-        HaNodeProperties HaNodeProperties = getArtifactoryHome().getHaNodeProperties();
-        if (HaNodeProperties != null) {
-            return HaNodeProperties.getServerId();
-        }
-        return HaCommonAddon.ARTIFACTORY_PRO;
-    }
-
-    @Override
-    public boolean isOffline() {
-        return offline;
-    }
-
-    @Override
-    public void setOffline() {
-        this.offline = true;
-    }
-
-    @Override
-    public ConverterManager getConverterManager() {
-        return converterManager;
-    }
-
-    @Override
-    public VersionProvider getVersionProvider() {
-        return versionProvider;
-    }
-
-    @Override
-    public long getUptime() {
-        return System.currentTimeMillis() - started;
-    }
-
-    @Override
-    public CentralConfigService getCentralConfig() {
-        return beanForType(CentralConfigService.class);
-    }
-
-    @Override
-    public SecurityService getSecurityService() {
-        return beanForType(SecurityService.class);
-    }
-
-    @Override
-    public AuthorizationService getAuthorizationService() {
-        return beanForType(AuthorizationService.class);
-    }
-
-    @Override
-    public TaskService getTaskService() {
-        return beanForType(TaskService.class);
-    }
-
-    @Override
-    public RepositoryService getRepositoryService() {
-        return beanForType(InternalRepositoryService.class);
-    }
-
-    @Override
-    public void addReloadableBean(Class<? extends ReloadableBean> beanClass) {
-        toInitialize.add(beanClass);
-    }
-
-    @Override
-    public void refresh() throws BeansException, IllegalStateException {
-        try {
-            setReady(false);
-            beansForType.clear();
-            ArtifactoryContextThreadBinder.bind(this);
-            super.refresh();
-            reloadableBeans = new ArrayList<>(toInitialize.size());
-            Set<Class<? extends ReloadableBean>> toInit = new HashSet<>(toInitialize);
-            for (Class<? extends ReloadableBean> beanClass : toInitialize) {
-                orderReloadableBeans(toInit, beanClass);
-            }
-            log.debug("Reloadable list of beans: {}", reloadableBeans);
-            log.info("Artifactory context starting up...");
-            versionProvider.loadDbVersion();    // db should have been initialized by now -> we can read the db version
-            converterManager.beforeInits();
-            for (ReloadableBean reloadableBean : reloadableBeans) {
-                String beanIfc = getInterfaceName(reloadableBean);
-                log.info("Initializing {}", beanIfc);
-                converterManager.serviceConvert(reloadableBean);
-                try {
-                    reloadableBean.init();
-                } catch (Exception e) {
-                    throw new BeanInitializationException("Failed to initialize bean '" + beanIfc + "'.", e);
-                }
-                log.debug("Initialized {}", beanIfc);
-            }
-            converterManager.afterAllInits();
-            setReady(true);
-            converterManager.afterContextReady();
-        } finally {
-            ArtifactoryContextThreadBinder.unbind();
-        }
-    }
-
-    private void contextCreated() {
-        try {
-            ArtifactoryContextThreadBinder.bind(this);
-            Map<String, ContextReadinessListener> contextReadinessListeners =
-                    beansForType(ContextReadinessListener.class);
-            log.debug("Signaling context created to context readiness listener beans.");
-            for (ContextReadinessListener bean : contextReadinessListeners.values()) {
-                String beanIfc = getInterfaceName(bean);
-                log.debug("Signaling context created to {}.", beanIfc);
-                bean.onContextCreated();
-            }
-        } finally {
-            ArtifactoryContextThreadBinder.unbind();
-        }
-    }
-
-    @Override
-    protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
-        super.prepareBeanFactory(beanFactory);
-        //Add our own post processor that registers all reloadable beans auto-magically after construction
-        beanFactory.addBeanPostProcessor(new BeanPostProcessor() {
-            @Override
-            public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
-                Class<?> targetClass = AopUtils.getTargetClass(bean);
-                if (ReloadableBean.class.isAssignableFrom(targetClass)) {
-                    Reloadable annotation;
-                    if (targetClass.isAnnotationPresent(Reloadable.class)) {
-                        annotation = targetClass.getAnnotation(Reloadable.class);
-                        Class<? extends ReloadableBean> beanClass = annotation.beanClass();
-                        addReloadableBean(beanClass);
-                    } else {
-                        throw new IllegalStateException("Bean " + targetClass.getName() +
-                                " requires initialization beans to be initialized, but no such beans were found");
-                    }
-                }
-                return bean;
-            }
-
-            @Override
-            public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
-                //Do nothing
-                return bean;
-            }
-        });
-    }
-
-    @Override
-    public void init() {
-        // Nothing
-    }
-
-    @Override
-    public void destroy() {
-        setReady(false);
-        ArtifactoryContextThreadBinder.bind(this);
-        ArtifactoryHome.bind(getArtifactoryHome());
-        try {
-            try {
-                if (reloadableBeans != null && !reloadableBeans.isEmpty()) {
-                    // TODO[By Gidi] find better way to update the ArtifactoryStateManager on beforeDestroy event
-                    beanForType(ArtifactoryStateManager.class).beforeDestroy();
-                    log.debug("Destroying beans: {}", reloadableBeans);
-                    for (int i = reloadableBeans.size() - 1; i >= 0; i--) {
-                        ReloadableBean bean = reloadableBeans.get(i);
-                        String beanIfc = getInterfaceName(bean);
-                        log.info("Destroying {}", beanIfc);
-                        try {
-                            bean.destroy();
-                        } catch (Exception e) {
-                            if (log.isDebugEnabled() || Boolean.getBoolean(ConstantValues.test.getPropertyName())) {
-                                log.error("Exception while destroying bean '" + beanIfc + "'.", e);
-                            } else {
-                                log.error("Exception while destroying {} ({}).", beanIfc, e.getMessage());
-                            }
-                        }
-                        log.debug("Destroyed {}", beanIfc);
-                    }
-                }
-            } finally {
-                super.destroy();
-            }
-        } finally {
-            ArtifactoryContextThreadBinder.unbind();
-            ArtifactoryHome.unbind();
-        }
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-        setReady(false);
-        log.debug("Reloading beans: {}", reloadableBeans);
-        for (ReloadableBean reloadableBean : reloadableBeans) {
-            String beanIfc = getInterfaceName(reloadableBean);
-            log.debug("Reloading {}", beanIfc);
-            reloadableBean.reload(oldDescriptor);
-            log.debug("Reloaded {}", beanIfc);
-        }
-        setReady(true);
-    }
-
-    private String getInterfaceName(Object bean) {
-        return bean.getClass().getInterfaces()[0].getName();
-    }
-
-    private void orderReloadableBeans(Set<Class<? extends ReloadableBean>> beansLeftToInit,
-            Class<? extends ReloadableBean> beanClass) {
-        if (!beansLeftToInit.contains(beanClass)) {
-            // Already done
-            return;
-        }
-        ReloadableBean initializingBean = beanForType(beanClass);
-        Class<?> targetClass = AopUtils.getTargetClass(initializingBean);
-        Reloadable annotation;
-        if (targetClass.isAnnotationPresent(Reloadable.class)) {
-            annotation = targetClass.getAnnotation(Reloadable.class);
-        } else {
-            throw new IllegalStateException(
-                    "Bean " + targetClass.getName() + " requires the @Reloadable annotation to be present.");
-        }
-        Class<? extends ReloadableBean>[] dependsUpon = annotation.initAfter();
-        for (Class<? extends ReloadableBean> doBefore : dependsUpon) {
-            //Sanity check that prerequisite bean was registered
-            if (!toInitialize.contains(doBefore)) {
-                throw new IllegalStateException(
-                        "Bean '" + beanClass.getName() + "' requires bean '" + doBefore.getName() +
-                                "' to be initialized, but no such bean is registered for init.");
-            }
-            if (!doBefore.isInterface()) {
-                throw new IllegalStateException(
-                        "Cannot order bean with implementation class.\n" +
-                                " Please provide an interface extending " +
-                                ReloadableBean.class.getName());
-            }
-            orderReloadableBeans(beansLeftToInit, doBefore);
-        }
-        // Avoid double init
-        if (beansLeftToInit.remove(beanClass)) {
-            reloadableBeans.add(initializingBean);
-        }
-    }
-
-    @Override
-    public boolean isReady() {
-        return ready;
-    }
-
-    private void setReady(boolean ready) {
-        this.ready = ready;
-        if (hasBeanFactory()) {
-            //Signal to all the context ready listener beans
-            final Map<String, ContextReadinessListener> contextReadinessListeners =
-                    beansForType(ContextReadinessListener.class);
-            log.debug("Signaling context ready={} to context readiness listener beans.", ready);
-            for (ContextReadinessListener bean : contextReadinessListeners.values()) {
-                String beanIfc = getInterfaceName(bean);
-                log.debug("Signaling context ready={} to {}.", ready, beanIfc);
-                if (ready) {
-                    bean.onContextReady();
-                } else {
-                    bean.onContextUnready();
-                }
-            }
-        }
-        if (ready) {
-            log.info("Artifactory application context is ready.");
-        }
-    }
-
-    @Override
-    @SuppressWarnings("unchecked")
-    public <T> T beanForType(Class<T> type) {
-        //No sync needed. Sync is done on write, so in the worst case we might end up with
-        //a bean with the same value, which is fine
-        T bean = (T) beansForType.get(type);
-        if (bean == null) {
-            Map<String, T> beans = getBeansOfType(type);
-            if (beans.isEmpty()) {
-                throw new RuntimeException("Could not find bean of type '" + type.getName() + "'.");
-            }
-
-            bean = beans.values().iterator().next(); // default to the first bean encountered
-            if (beans.size() > 1) {
-                // prefer beans marked as primary
-                for (Map.Entry<String, T> beanEntry : beans.entrySet()) {
-                    BeanDefinition beanDefinition = getBeanFactory().getBeanDefinition(beanEntry.getKey());
-                    if (beanDefinition != null && beanDefinition.isPrimary()) {
-                        bean = beanEntry.getValue();
-                    }
-                }
-            }
-        }
-        beansForType.put(type, bean);
-        return bean;
-    }
-
-    @Override
-    public <T> Map<String, T> beansForType(Class<T> type) {
-        return getBeansOfType(type);
-    }
-
-    @Override
-    public <T> T beanForType(String name, Class<T> type) {
-        return getBean(name, type);
-    }
-
-    @Override
-    public BinaryService getBinaryStore() {
-        return beanForType(BinaryService.class);
-    }
-
-    @Override
-    public void importFrom(ImportSettings settings) {
-        MutableStatusHolder status = settings.getStatusHolder();
-        status.status("### Beginning full system import ###", log);
-        // First sync status and settings
-        status.setFastFail(settings.isFailFast());
-        status.setVerbose(settings.isVerbose());
-        // First check the version of the folder imported
-        ArtifactoryVersion backupVersion = BackupUtils.findVersion(settings.getBaseDir());
-        // We don't support import from 125 and below
-        ArtifactoryVersion supportFrom = ArtifactoryVersion.v125;
-        if (backupVersion.before(supportFrom)) {
-            throw new IllegalArgumentException("Folder " + settings.getBaseDir().getAbsolutePath() +
-                    " contains an export from a version older than " + supportFrom.getValue() + ".\n" +
-                    "Please use the dump-legacy-dbs first, to dump this version's data, then import it " +
-                    "into Artifactory.");
-        }
-        ((ImportSettingsImpl) settings).setExportVersion(backupVersion);
-        List<String> stoppedTasks = Lists.newArrayList();
-        try {
-            stopRelatedTasks(ImportJob.class, stoppedTasks);
-            importResourcesFromEtcDirectory(settings);
-            AddonsManager addonsManager = beanForType(AddonsManager.class);
-
-            encryptStorageProperties();
-            // import central configuration
-            getCentralConfig().importFrom(settings);
-            // import security settings
-            getSecurityService().importFrom(settings);
-            // import webstart keystore
-            addonsManager.addonByType(WebstartAddon.class).importKeyStore(settings);
-            // import 3rd party licenses
-            addonsManager.addonByType(LicensesAddon.class).importLicenses(settings);
-            // import user plugins
-            addonsManager.addonByType(PluginsAddon.class).importFrom(settings);
-            // import builds
-            beanForType(BuildService.class).importFrom(settings);
-            // import logback conf
-            beanForType(LoggingService.class).importFrom(settings);
-            if (!settings.isExcludeContent()) {
-                // import repositories content
-                getRepositoryService().importFrom(settings);
-            }
-            status.status("### Full system import finished ###", log);
-        } finally {
-            resumeTasks(stoppedTasks);
-        }
-    }
-
-    /**
-     * encrypt Storage Properties if master key exist
-     */
-    private void encryptStorageProperties() {
-        StoragePropertiesEncryptInterceptor storagePropertiesEncryptInterceptor = new StoragePropertiesEncryptInterceptor();
-        storagePropertiesEncryptInterceptor.encryptOrDecryptStoragePropertiesFile(true);
-    }
-
-    @Override
-    public void exportTo(ExportSettings settings) {
-        MutableStatusHolder status = settings.getStatusHolder();
-        status.status("Beginning full system export...", log);
-        String timestamp;
-        boolean incremental = settings.isIncremental();
-        if (!incremental) {
-            DateFormat formatter = new SimpleDateFormat("yyyyMMdd.HHmmss");
-            timestamp = formatter.format(settings.getTime());
-        } else {
-            timestamp = CURRENT_TIME_EXPORT_DIR_NAME;
-        }
-        File baseDir = settings.getBaseDir();
-
-        //Only create a temp dir when not performing incremental backup
-        File workingExportDir;
-        if (incremental) {
-            //Will always be baseDir/CURRENT_TIME_EXPORT_DIR_NAME
-            workingExportDir = new File(baseDir, timestamp);
-        } else {
-            workingExportDir = new File(baseDir, timestamp + ".tmp");
-            //Make sure the directory does not already exist
-            try {
-                FileUtils.deleteDirectory(workingExportDir);
-            } catch (IOException e) {
-                status.error("Failed to delete old temp export directory: " + workingExportDir.getAbsolutePath(), e,
-                        log);
-                return;
-            }
-        }
-        status.status("Creating temp export directory: " + workingExportDir.getAbsolutePath(), log);
-        try {
-            FileUtils.forceMkdir(workingExportDir);
-        } catch (IOException e) {
-            status.error("Failed to create backup dir: " + workingExportDir.getAbsolutePath(), e, log);
-            return;
-        }
-        status.status("Using backup directory: '" + workingExportDir.getAbsolutePath() + "'.", log);
-
-        ExportSettingsImpl exportSettings = new ExportSettingsImpl(workingExportDir, settings);
-
-        List<String> stoppedTasks = Lists.newArrayList();
-        try {
-            AddonsManager addonsManager = beanForType(AddonsManager.class);
-
-            stopRelatedTasks(ExportJob.class, stoppedTasks);
-
-            // central config
-            getCentralConfig().exportTo(exportSettings);
-            if (status.isError() && settings.isFailFast()) {
-                return;
-            }
-            // security
-            exportSecurity(exportSettings);
-            if (status.isError() && settings.isFailFast()) {
-                return;
-            }
-            // keystore
-            WebstartAddon webstartAddon = addonsManager.addonByType(WebstartAddon.class);
-            webstartAddon.exportKeyStore(exportSettings);
-            if (status.isError() && settings.isFailFast()) {
-                return;
-            }
-
-            // licenses
-            LicensesAddon licensesAddon = addonsManager.addonByType(LicensesAddon.class);
-            licensesAddon.exportLicenses(exportSettings);
-            if (status.isError() && settings.isFailFast()) {
-                return;
-            }
-
-            //artifactory.properties and etc files
-            exportArtifactoryProperties(exportSettings);
-            if (status.isError() && settings.isFailFast()) {
-                return;
-            }
-            exportEtcDirectory(exportSettings);
-            if (status.isError() && settings.isFailFast()) {
-                return;
-            }
-            exportHaEtcDirectory(exportSettings);
-            if (status.isError() && settings.isFailFast()) {
-                return;
-            }
-
-            // build info
-            exportBuildInfo(exportSettings);
-            if (status.isError() && settings.isFailFast()) {
-                return;
-            }
-
-            // repositories content
-            if (settings.isIncludeMetadata() || !settings.isExcludeContent()) {
-                getRepositoryService().exportTo(exportSettings);
-            }
-            if (status.isError() && settings.isFailFast()) {
-                return;
-            }
-
-            if (incremental && settings.isCreateArchive()) {
-                log.warn("Cannot create archive for an in place backup.");
-            }
-            if (!incremental) {
-                //Create an archive if necessary
-                if (settings.isCreateArchive()) {
-                    createArchive(settings, status, timestamp, workingExportDir);
-                } else {
-                    moveTmpToBackupDir(settings, status, timestamp, workingExportDir);
-                }
-            } else {
-                settings.setOutputFile(workingExportDir);
-            }
-
-            settings.cleanCallbacks();
-
-            status.status("Full system export completed successfully.", log);
-        } catch (RuntimeException e) {
-            status.error("Full system export failed: " + e.getMessage(), e, log);
-        } finally {
-            resumeTasks(stoppedTasks);
-        }
-    }
-
-    private void moveTmpToBackupDir(ExportSettings settings, MutableStatusHolder status, String timestamp,
-            File workingExportDir) {
-        //Delete any exiting final export dir
-        File exportDir = new File(settings.getBaseDir(), timestamp);
-        try {
-            FileUtils.deleteDirectory(exportDir);
-        } catch (IOException e) {
-            log.warn("Failed to delete existing final export directory.", e);
-        }
-        //Switch the directories
-        try {
-            FileUtils.moveDirectory(workingExportDir, exportDir);
-        } catch (IOException e) {
-            log.error("Failed to move '{}' to '{}': {}", workingExportDir, exportDir, e.getMessage());
-        } finally {
-            settings.setOutputFile(exportDir);
-        }
-    }
-
-    private void createArchive(ExportSettings settings, MutableStatusHolder status, String timestamp,
-            File workingExportDir) {
-        status.status("Creating archive...", log);
-
-        File tempArchiveFile = new File(settings.getBaseDir(), timestamp + ".tmp.zip");
-        try {
-            ZipUtils.archive(workingExportDir, tempArchiveFile, true);
-        } catch (IOException e) {
-            throw new RuntimeException("Failed to create system export archive.", e);
-        }
-        //Delete the temp export dir
-        try {
-            FileUtils.deleteDirectory(workingExportDir);
-        } catch (IOException e) {
-            log.warn("Failed to delete temp export directory.", e);
-        }
-
-        // From now on use only java.io.File for the file actions!
-
-        //Delete any exiting final archive
-        File archive = new File(settings.getBaseDir(), timestamp + ".zip");
-        if (archive.exists()) {
-            boolean deleted = archive.delete();
-            if (!deleted) {
-                status.warn("Failed to delete existing final export archive.", log);
-            }
-        }
-        //Rename the archive file
-        try {
-            FileUtils.moveFile(tempArchiveFile, archive);
-        } catch (IOException e) {
-            status.error(String.format("Failed to move '%s' to '%s'.", tempArchiveFile.getAbsolutePath(),
-                    archive.getAbsolutePath()), e, log);
-        } finally {
-            settings.setOutputFile(archive.getAbsoluteFile());
-        }
-    }
-
-    private void exportArtifactoryProperties(ExportSettings settings) {
-        MutableStatusHolder status = settings.getStatusHolder();
-        File artifactoryPropFile = artifactoryHome.getHomeArtifactoryPropertiesFile();
-        if (artifactoryPropFile.exists()) {
-            try {
-                FileUtils.copyFileToDirectory(artifactoryPropFile, settings.getBaseDir());
-            } catch (IOException e) {
-                status.error("Failed to copy artifactory.properties file", e, log);
-            }
-        } else {
-            status.status("No KeyVal defined no export done", log);
-        }
-    }
-
-    private void exportEtcDirectory(ExportSettings settings) {
-        try {
-            File targetBackupDir = new File(settings.getBaseDir(), "etc");
-            // TODO: [by fsi] Find a way to copy with permissions kept
-            FileUtils.copyDirectory(artifactoryHome.getEtcDir(), targetBackupDir,
-                    new NotFileFilter(new NameFileFilter("artifactory.lic")), true);
-            checkSecurityFolder(targetBackupDir);
-        } catch (IOException e) {
-            settings.getStatusHolder().error(
-                    "Failed to export etc directory: " + artifactoryHome.getEtcDir().getAbsolutePath(), e, log);
-        }
-    }
-
-    private void exportHaEtcDirectory(ExportSettings settings) {
-        if (artifactoryHome.isHaConfigured()) {
-            try {
-                File targetBackupDir = new File(settings.getBaseDir(), "ha-etc");
-                // TODO: [by fsi] Find a way to copy with permissions kept
-                FileUtils.copyDirectory(artifactoryHome.getHaAwareEtcDir(), targetBackupDir,
-                        new NotFileFilter(new NameFileFilter("artifactory.lic")));
-                checkSecurityFolder(targetBackupDir);
-            } catch (IOException e) {
-                settings.getStatusHolder().error(
-                        "Failed to export etc directory: " + artifactoryHome.getEtcDir().getAbsolutePath(), e, log);
-            }
-        }
-    }
-
-    private void checkSecurityFolder(File targetBackupDir) throws IOException {
-        File masterKeyDest = new File(targetBackupDir, "etc/" + ConstantValues.securityMasterKeyLocation.getDefValue());
-        if (masterKeyDest.exists()) {
-            CryptoHelper.setPermissionsOnSecurityFolder(masterKeyDest.getParentFile());
-        }
-    }
-
-    /**
-     * Import selected files from the etc directory. Note that while the export simply copies the etc directory, here we
-     * are only wish to import some of the files while ignoring others. The reason is that the etc may contain custom
-     * settings that are environment dependant (like db configuration) which will fail the import of will fail
-     * Artifactory on the next startup. So changes to the repo.xml and/or artifactory.system.properties has to be
-     * imported manually.
-     *
-     * @param settings basic settings with conf files
-     */
-    private void importResourcesFromEtcDirectory(ImportSettings settings) {
-        File importEtcDir = new File(settings.getBaseDir(), "etc");
-        if (!importEtcDir.exists()) {
-            // older versions didn't export the etc directory
-            log.info("Skipping etc directory import. File doesn't exist: " + importEtcDir.getAbsolutePath());
-            return;
-        }
-        // copy the logo if it exists
-        File customUiDir = new File(importEtcDir, "ui");
-        if (customUiDir.exists()) {
-            try {
-                FileUtils.copyDirectory(customUiDir, artifactoryHome.getLogoDir());
-            } catch (IOException e) {
-                settings.getStatusHolder().error(
-                        "Failed to import ui directory: " + customUiDir.getAbsolutePath(), e, log);
-            }
-        }
-
-        // copy the master encryption key if it exists
-        File etcSecurityDir = new File(importEtcDir, "security");
-        if (etcSecurityDir.exists()) {
-            try {
-                File destSecurityFolder = new File(artifactoryHome.getHaAwareEtcDir(), "security");
-                // TODO: [by fsi] Find a way to copy with permissions kept
-                FileUtils.copyDirectory(etcSecurityDir, destSecurityFolder);
-                CryptoHelper.setPermissionsOnSecurityFolder(destSecurityFolder);
-            } catch (IOException e) {
-                settings.getStatusHolder().error(
-                        "Failed to import security directory: " + etcSecurityDir.getAbsolutePath(), e, log);
-            }
-        }
-    }
-
-    private void exportSecurity(ExportSettingsImpl settings) {
-        MutableStatusHolder status = settings.getStatusHolder();
-        SecurityService security = getSecurityService();
-        status.status("Exporting security...", log);
-        security.exportTo(settings);
-    }
-
-    private void exportBuildInfo(ExportSettingsImpl exportSettings) {
-        MutableStatusHolder status = exportSettings.getStatusHolder();
-        if (exportSettings.isExcludeBuilds()) {
-            status.status("Skipping build info ...", log);
-            return;
-        }
-
-        BuildService build = beanForType(BuildService.class);
-        status.status("Exporting build info...", log);
-        build.exportTo(exportSettings);
-    }
-
-    public List<ReloadableBean> getBeans() {
-        return reloadableBeans;
-    }
-
-    private void stopRelatedTasks(Class<? extends TaskCallback> jobCommandClass, List<String> stoppedTokens) {
-        if (TaskCallback.currentTaskToken() != null) {
-            // Already stopped by standard task manager
-            return;
-        }
-        TaskService taskService = getTaskService();
-        taskService.stopRelatedTasks(jobCommandClass, stoppedTokens, BaseSettings.FULL_SYSTEM);
-    }
-
-    private void resumeTasks(List<String> tokens) {
-        if (TaskCallback.currentTaskToken() != null) {
-            // Already stopped by standard task manager
-            return;
-        }
-        TaskService taskService = getTaskService();
-        for (String token : tokens) {
-            taskService.resumeTask(token);
-        }
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/spring/InternalArtifactoryContext.java b/backend/core/src/main/java/org/artifactory/spring/InternalArtifactoryContext.java
deleted file mode 100644
index f90a3dd..0000000
--- a/backend/core/src/main/java/org/artifactory/spring/InternalArtifactoryContext.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.spring;
-
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.storage.spring.ArtifactoryStorageContext;
-import org.springframework.context.ApplicationContext;
-
-/**
- * @author freds
- */
-public interface InternalArtifactoryContext extends ArtifactoryStorageContext,
-        ReloadableBean, ApplicationContext {
-
-    SecurityService getSecurityService();
-
-    void addReloadableBean(Class<? extends ReloadableBean> interfaceClass);
-}
diff --git a/backend/core/src/main/java/org/artifactory/spring/InternalContextHelper.java b/backend/core/src/main/java/org/artifactory/spring/InternalContextHelper.java
deleted file mode 100644
index fee31a0..0000000
--- a/backend/core/src/main/java/org/artifactory/spring/InternalContextHelper.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.spring;
-
-import org.artifactory.api.context.ContextHelper;
-
-/**
- * @author Yoav Landman
- */
-public abstract class InternalContextHelper {
-    private InternalContextHelper() {
-        // utility class
-    }
-
-    public static InternalArtifactoryContext get() {
-        return (InternalArtifactoryContext) ContextHelper.get();
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/state/ArtifactoryStateManagerImpl.java b/backend/core/src/main/java/org/artifactory/state/ArtifactoryStateManagerImpl.java
deleted file mode 100644
index 2094fb9..0000000
--- a/backend/core/src/main/java/org/artifactory/state/ArtifactoryStateManagerImpl.java
+++ /dev/null
@@ -1,208 +0,0 @@
-package org.artifactory.state;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.ArtifactoryRunningMode;
-import org.artifactory.addon.HaAddon;
-import org.artifactory.addon.license.VerificationResult;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.version.VersionInfoService;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ha.HaNodeProperties;
-import org.artifactory.config.InternalCentralConfigService;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.spring.ContextReadinessListener;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.spring.ReloadableBean;
-import org.artifactory.state.model.ArtifactoryStateManager;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.db.servers.model.ArtifactoryServer;
-import org.artifactory.storage.db.servers.service.ArtifactoryServersCommonService;
-import org.artifactory.util.ArtifactoryServerHelper;
-import org.artifactory.version.CompoundVersionDetails;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import static org.artifactory.state.ArtifactoryServerState.*;
-import static org.artifactory.storage.db.servers.model.ArtifactoryServerRole.STANDALONE;
-
-/**
- * @author Gidi Shabat
- */
- at Reloadable(beanClass = ArtifactoryStateManager.class,
-        initAfter = {DbService.class, InternalCentralConfigService.class})
-public class ArtifactoryStateManagerImpl implements ArtifactoryStateManager, ReloadableBean, ContextReadinessListener {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryStateManagerImpl.class);
-
-    @Autowired
-    private ArtifactoryServersCommonService serversService;
-
-    @Autowired
-    private VersionInfoService versionInfoService;
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Override
-    public void init() {
-        ArtifactoryRunningMode runningMode = addonsManager.getArtifactoryRunningMode();
-        log.debug("Starting Artifactory in running mode: {}", runningMode.name());
-        VerificationResult result = addonsManager.verifyAllArtifactoryServers();
-        switch (result) {
-            case valid: {
-                initHa();
-                break;
-            }
-            case converting: {
-                updateArtifactoryServerState(STOPPED);
-                throw new RuntimeException(result.showMassage());
-            }
-            case notSameVersion: {
-                updateArtifactoryServerState(STOPPED);
-                throw new RuntimeException(result.showMassage());
-            }
-            case duplicateServerIds: {
-                long lastHeartbeat = serversService.getCurrentMember().getLastHeartbeat();
-                throw new RuntimeException("Current Artifactory node last heartbeat is: " + lastHeartbeat + ". " +
-                        result.showMassage());
-            }
-            default: {
-                updateArtifactoryServerState(OFFLINE);
-                log.error(result.showMassage());
-            }
-        }
-    }
-
-    private void initHa() {
-        boolean converting = ContextHelper.get().getConverterManager().isConverting();
-        updateArtifactoryServerState(converting ? CONVERTING : STARTING);
-        addonsManager.addonByType(HaAddon.class).init();
-    }
-
-    @Override
-    public void onContextReady() {
-        ArtifactoryServer artifactoryServer = serversService.getArtifactoryServer(getServerId());
-        if (artifactoryServer == null) {
-            throw new IllegalStateException("Artifactory server could not be found [" + getServerId() + "]");
-        }
-        // Allow to change the state only if not offline and the previous state was STARTING
-        boolean allowedToPromote = STARTING == artifactoryServer.getServerState() || CONVERTING == artifactoryServer.getServerState();
-        if (!ContextHelper.get().isOffline() && allowedToPromote) {
-            addonsManager.addonByType(HaAddon.class).updateArtifactoryServerRole();
-            updateArtifactoryServerState(RUNNING);
-        } else {
-            log.debug("Changing from {} to {} is allowed only if the previous step was {}",
-                    artifactoryServer.getServerState(), RUNNING.getPrettyName(), STARTING.getPrettyName());
-        }
-    }
-
-    @Override
-    public void beforeDestroy() {
-        updateArtifactoryServerState(STOPPING);
-    }
-
-    @Override
-    public void destroy() {
-        updateArtifactoryServerState(STOPPED);
-    }
-
-    @Override
-    public boolean forceState(ArtifactoryServerState state) {
-        // Currently we do not support to change state during offline
-        if (ContextHelper.get().isOffline() && ArtifactoryServerState.OFFLINE != state) {
-            log.warn("The change in Artifactory state to {} will take effect only after restart",
-                    OFFLINE.getPrettyName());
-            return false;
-        }
-        if (ArtifactoryServerState.OFFLINE == state) {
-            ContextHelper.get().setOffline();
-        } else if (ArtifactoryServerState.RUNNING == state) {
-            addonsManager.addonByType(HaAddon.class).updateArtifactoryServerRole();
-        }
-        updateArtifactoryServerState(state);
-
-        ArtifactoryServer artifactoryServer = serversService.getCurrentMember();
-        log.debug("Artifactory server '{}' state is {}", artifactoryServer.getServerId(),
-                artifactoryServer.getServerState().getPrettyName());
-        return true;
-    }
-
-    private ArtifactoryServer createOrUpdateCurrentArtifactoryServer(String serverId, String serverContextUrl,
-            ArtifactoryServerState serverState) {
-        ArtifactoryRunningMode runningMode = addonsManager.getArtifactoryRunningMode();
-        CompoundVersionDetails runningVersion = ContextHelper.get().getVersionProvider().getRunning();
-
-        ArtifactoryServer prevArtifactoryServer = serversService.getArtifactoryServer(serverId);
-        ArtifactoryServer artifactoryServer;
-        if (prevArtifactoryServer == null) {
-            int joinPort = 0; //initial cluster port is set to 0
-            artifactoryServer = ArtifactoryServerHelper.createArtifactoryServer(serverId, serverContextUrl, joinPort,
-                    runningVersion, serverState, STANDALONE, runningMode);
-            serversService.createArtifactoryServer(artifactoryServer);
-            log.debug("Created Artifactory server: {} state: {}",
-                    serverId, artifactoryServer.getServerState().getPrettyName());
-        } else {
-            int joinPort = 0; //initial cluster port is set to 0 //todo avoid it, not used anyway
-            artifactoryServer = ArtifactoryServerHelper.createArtifactoryServer(serverId, serverContextUrl, joinPort,
-                    runningVersion, serverState, prevArtifactoryServer.getServerRole(), runningMode);
-            verifyArtifactoryServerUpdate(serverId, prevArtifactoryServer, artifactoryServer);
-            serversService.updateArtifactoryServer(artifactoryServer);
-
-            log.debug("Updated Artifactory server: {} state: {}", serverId,
-                    artifactoryServer.getServerState().getPrettyName());
-        }
-        return artifactoryServer;
-    }
-
-    private String getServerId() {
-        final String serverId = ContextHelper.get().getServerId();
-        if (StringUtils.isBlank(serverId)) {
-            throw new IllegalArgumentException("Artifactory serverId cannot be empty or null!");
-        }
-        return serverId;
-    }
-
-    private void updateArtifactoryServerState(ArtifactoryServerState state) {
-        final String serverId = getServerId();
-        String contextUrl = "";
-        try {
-            HaNodeProperties haNodeProperties = ArtifactoryHome.get().getHaNodeProperties();
-            // TODO: [by sy] Pro -> HA should reload config or do something else here, otherwise will be empty string
-            contextUrl = haNodeProperties != null ? haNodeProperties.getContextUrl() : "";
-        } catch (Exception e) {
-            log.error("failed to find Artifactory contextUrl in ha-node properties");
-        }
-        //Create or update server row
-        createOrUpdateCurrentArtifactoryServer(serverId, contextUrl, state);
-    }
-
-    private void verifyArtifactoryServerUpdate(String serverId, ArtifactoryServer prevArtifactoryServer,
-            ArtifactoryServer artifactoryServer) {
-        //todo only master?
-        if (artifactoryServer.getServerState() != prevArtifactoryServer.getServerState()) {
-            log.debug("Changing Artifactory server: '{}' state: {} to state: {}", serverId,
-                    prevArtifactoryServer.getServerState(), artifactoryServer.getServerState());
-        }
-        if (!artifactoryServer.getContextUrl().equals(prevArtifactoryServer.getContextUrl())) {
-            log.debug("Previous Artifactory server: '{}' has different context URL {}. Updating {}", serverId,
-                    prevArtifactoryServer.getContextUrl(), artifactoryServer.getContextUrl());
-        }
-    }
-
-    @Override
-    public void onContextCreated() {
-    }
-
-    @Override
-    public void onContextUnready() {
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/storage/binary/BinaryStoreManagerService.java b/backend/core/src/main/java/org/artifactory/storage/binary/BinaryStoreManagerService.java
deleted file mode 100644
index 3419144..0000000
--- a/backend/core/src/main/java/org/artifactory/storage/binary/BinaryStoreManagerService.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.artifactory.storage.binary;
-
-import org.artifactory.spring.ReloadableBean;
-
-/**
- * @author gidis
- */
-public interface BinaryStoreManagerService extends ReloadableBean {
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/storage/binary/BinaryStoreManagerServiceImpl.java b/backend/core/src/main/java/org/artifactory/storage/binary/BinaryStoreManagerServiceImpl.java
deleted file mode 100644
index eed7b76..0000000
--- a/backend/core/src/main/java/org/artifactory/storage/binary/BinaryStoreManagerServiceImpl.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package org.artifactory.storage.binary;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.CoreAddons;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.mail.MailService;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.schedule.*;
-import org.artifactory.schedule.quartz.QuartzCommand;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.storage.binstore.service.BinaryService;
-import org.artifactory.version.CompoundVersionDetails;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-/**
- * @author gidis
- */
- at Service
- at Reloadable(beanClass = BinaryStoreManagerService.class,
-        initAfter = {TaskService.class})
-public class BinaryStoreManagerServiceImpl implements BinaryStoreManagerService {
-
-    @Autowired
-    private TaskService taskService;
-
-    @Override
-    public void init() {
-        registersErrorPollingJob();
-    }
-
-    /**
-     * creates & starts HeartbeatJob
-     */
-    private void registersErrorPollingJob() {
-        TaskBase errorNotificationJob = TaskUtils.createRepeatingTask(BinaryStoreErrorNotificationJob.class,
-                TimeUnit.SECONDS.toMillis(ConstantValues.binaryStoreErrorNotificationsIntervalSecs.getLong()),
-                TimeUnit.SECONDS.toMillis(ConstantValues.binaryStoreErrorNotificationsStaleIntervalSecs.getLong()));
-        taskService.startTask(errorNotificationJob, false);
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-
-    }
-
-    @Override
-    public void destroy() {
-
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-
-    }
-
-    @JobCommand(singleton = true, runOnlyOnPrimary = false, description = "binary store error notification",
-            schedulerUser = TaskUser.SYSTEM, manualUser = TaskUser.SYSTEM)
-    public static class BinaryStoreErrorNotificationJob extends QuartzCommand {
-        @Override
-        protected void onExecute(JobExecutionContext callbackContext) throws JobExecutionException {
-            BinaryService binaryService = ContextHelper.get().beanForType(BinaryService.class);
-            List<String> errorMessages = binaryService.getAndManageErrors();
-            for (String error : errorMessages) {
-                AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-                MailService mailService = ContextHelper.get().beanForType(MailService.class);
-                CoreAddons coreAddons = addonsManager.addonByType(CoreAddons.class);
-                List<String> adminEmails = coreAddons.getUsersForBackupNotifications();
-                for (String adminEmail : adminEmails) {
-                    mailService.sendMail(new String[]{adminEmail}, "Critical binary provider error", "Critical Error occurred in Artifactory binary provider - " + error + ", disabling single binary provider");
-                }
-            }
-        }
-    }
-}
-
diff --git a/backend/core/src/main/java/org/artifactory/storage/db/properties/service/ArtifactoryCommonDbPropertiesServiceImpl.java b/backend/core/src/main/java/org/artifactory/storage/db/properties/service/ArtifactoryCommonDbPropertiesServiceImpl.java
deleted file mode 100644
index 1424768..0000000
--- a/backend/core/src/main/java/org/artifactory/storage/db/properties/service/ArtifactoryCommonDbPropertiesServiceImpl.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.properties.service;
-
-import org.artifactory.storage.db.properties.model.DbProperties;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-/**
- * @author Gidi Shabat
- */
- at Service
-public class ArtifactoryCommonDbPropertiesServiceImpl implements ArtifactoryCommonDbPropertiesService {
-    @Autowired
-    private ArtifactoryDbPropertiesService dbPropertiesService;
-
-    @Override
-    public DbProperties getDbProperties() {
-        return dbPropertiesService.getDbProperties();
-    }
-
-    @Override
-    public boolean isDbPropertiesTableExists() {
-        return dbPropertiesService.isDbPropertiesTableExists();
-    }
-
-    @Override
-    public void updateDbProperties(DbProperties dbProperties) {
-        dbPropertiesService.updateDbProperties(dbProperties);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/storage/db/servers/service/ArtifactoryHeartbeatServiceImpl.java b/backend/core/src/main/java/org/artifactory/storage/db/servers/service/ArtifactoryHeartbeatServiceImpl.java
deleted file mode 100644
index f93aca1..0000000
--- a/backend/core/src/main/java/org/artifactory/storage/db/servers/service/ArtifactoryHeartbeatServiceImpl.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package org.artifactory.storage.db.servers.service;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.post.jobs.CallHomeJob;
-import org.artifactory.schedule.JobCommand;
-import org.artifactory.schedule.TaskBase;
-import org.artifactory.schedule.TaskService;
-import org.artifactory.schedule.TaskUser;
-import org.artifactory.schedule.TaskUtils;
-import org.artifactory.schedule.quartz.QuartzCommand;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.spring.ReloadableBean;
-import org.artifactory.state.model.ArtifactoryStateManager;
-import org.artifactory.version.CompoundVersionDetails;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.concurrent.TimeUnit;
-
-/**
- * author: gidis
- */
- at Service
- at Reloadable(beanClass = ArtifactoryHeartbeatService.class,
-        initAfter = {TaskService.class, ArtifactoryStateManager.class})
-public class ArtifactoryHeartbeatServiceImpl implements ArtifactoryHeartbeatService, ReloadableBean {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryHeartbeatServiceImpl.class);
-
-    @Autowired
-    private TaskService taskService;
-
-    @Autowired
-    private ArtifactoryServersCommonService artifactoryServersService;
-
-    @Override
-    public void init() {
-        registersHeartbeatJob();
-        registerCallHomeJob();
-    }
-
-    /**
-     * creates & starts HeartbeatJob
-     */
-    private void registersHeartbeatJob() {
-        TaskBase heartbeatJob = TaskUtils.createRepeatingTask(HeartbeatJob.class,
-                TimeUnit.SECONDS.toMillis(ConstantValues.haHeartbeatIntervalSecs.getLong()),
-                TimeUnit.SECONDS.toMillis(ConstantValues.haHeartbeatIntervalSecs.getLong()));
-        taskService.startTask(heartbeatJob, false);
-    }
-
-    /**
-     * creates & starts CallHomeJob
-     */
-    private void registerCallHomeJob() {
-        String callHomeQuarzExpression = CallHomeJob.buildRandomQuartzExp();
-        TaskBase callHomeJob = TaskUtils.createCronTask(
-                CallHomeJob.class,
-                callHomeQuarzExpression
-        );
-        log.debug("Scheduling CallHomeJob to run at '{}'", callHomeQuarzExpression);
-        taskService.startTask(callHomeJob, false);
-    }
-
-    @Override
-    public void updateHeartbeat() {
-        try {
-            if("art-8082".equals(ContextHelper.get().getServerId())){
-                return;
-            }
-            String serverId = ContextHelper.get().getServerId();
-            long heartbeat = System.currentTimeMillis();
-            log.debug("Updating heartbeat for {} [{}]", serverId, heartbeat);
-            artifactoryServersService.updateArtifactoryServerHeartbeat(serverId, heartbeat);
-            log.debug("Updated heartbeat for {} [{}]", serverId, heartbeat);
-        } catch (Exception e) {
-            log.error("Failed to update heartbeat", e);
-        }
-    }
-
-    @JobCommand(singleton = true, runOnlyOnPrimary = false, description = "Database Heartbeat",
-            schedulerUser = TaskUser.SYSTEM, manualUser = TaskUser.SYSTEM)
-    public static class HeartbeatJob extends QuartzCommand {
-        @Override
-        protected void onExecute(JobExecutionContext callbackContext) throws JobExecutionException {
-            ContextHelper.get().beanForType(ArtifactoryHeartbeatService.class).updateHeartbeat();
-        }
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-    }
-
-    @Override
-    public void destroy() {
-    }
-
-}
diff --git a/backend/core/src/main/java/org/artifactory/storage/db/servers/service/ArtifactoryServersCommonServiceImpl.java b/backend/core/src/main/java/org/artifactory/storage/db/servers/service/ArtifactoryServersCommonServiceImpl.java
deleted file mode 100644
index 1a723c0..0000000
--- a/backend/core/src/main/java/org/artifactory/storage/db/servers/service/ArtifactoryServersCommonServiceImpl.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package org.artifactory.storage.db.servers.service;
-
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.state.ArtifactoryServerState;
-import org.artifactory.storage.db.servers.model.ArtifactoryServer;
-import org.artifactory.storage.db.servers.model.ArtifactoryServerRole;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nullable;
-import java.util.List;
-
-import static com.google.common.base.Predicates.and;
-import static com.google.common.base.Predicates.or;
-
-/**
- * author: gidis
- */
- at Service
-public class ArtifactoryServersCommonServiceImpl implements ArtifactoryServersCommonService {
-
-    @Autowired
-    private ArtifactoryServersService serversService;
-
-    @Nullable
-    @Override
-    public ArtifactoryServer getRunningHaPrimary() {
-        List<ArtifactoryServer> servers = Lists.newArrayList(
-                Iterables.filter(serversService.getAllArtifactoryServers(), and(isPrimary, isRunning)));
-        if (servers.size() > 1) {
-            throw new IllegalStateException(
-                    "Found " + servers.size() + " running primary nodes where only 1 is allowed.");
-        }
-        return !servers.isEmpty() ? servers.get(0) : null;
-    }
-
-    @Override
-    public List<ArtifactoryServer> getOtherRunningHaMembers() {
-        return Lists.newArrayList(
-                Iterables.filter(serversService.getAllArtifactoryServers(), and(isOther, isRunning, hasHeartbeat)));
-    }
-
-    @Override
-    public ArtifactoryServer getArtifactoryServer(String serverId) {
-        return serversService.getArtifactoryServer(serverId);
-    }
-
-    @Override
-    public void updateArtifactoryServerRole(String serverId, ArtifactoryServerRole newRole) {
-        serversService.updateArtifactoryServerRole(serverId, newRole);
-    }
-
-    @Override
-    public void updateArtifactoryJoinPort(String serverId, int joinPort) {
-        serversService.updateArtifactoryJoinPort(serverId, joinPort);
-    }
-
-    @Override
-    public void updateArtifactoryServerState(ArtifactoryServer server, ArtifactoryServerState newState) {
-        serversService.updateArtifactoryServerState(server.getServerId(), newState);
-    }
-
-    @Override
-    public List<ArtifactoryServer> getAllArtifactoryServers() {
-        return serversService.getAllArtifactoryServers();
-    }
-
-    @Override
-    public void createArtifactoryServer(ArtifactoryServer artifactoryServer) {
-        serversService.createArtifactoryServer(artifactoryServer);
-    }
-
-    @Override
-    public void updateArtifactoryServer(ArtifactoryServer artifactoryServer) {
-        serversService.updateArtifactoryServer(artifactoryServer);
-    }
-
-    @Override
-    public boolean removeServer(String serverId) {
-        return serversService.removeServer(serverId);
-    }
-
-    @Override
-    public void updateArtifactoryServerHeartbeat(String serverId, long heartBeat) {
-        serversService.updateArtifactoryServerHeartbeat(serverId, heartBeat);
-    }
-
-    @Override
-    public List<ArtifactoryServer> getOtherActiveMembers() {
-        return Lists.newArrayList(Iterables.filter(getActiveMembers(), and(isOther)));
-    }
-
-    @Override
-    public List<ArtifactoryServer> getActiveMembers() {
-        return Lists.newArrayList(Iterables.filter(serversService.getAllArtifactoryServers(),
-                and(or(isRunning, isStarting, isStopping, isConverting), hasHeartbeat)));
-    }
-
-    @Override
-    public ArtifactoryServer getCurrentMember() {
-        String serverId = ContextHelper.get().getServerId();
-        return serversService.getArtifactoryServer(serverId);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/storage/jobs/StatsDelegatingServiceFlushJob.java b/backend/core/src/main/java/org/artifactory/storage/jobs/StatsDelegatingServiceFlushJob.java
deleted file mode 100644
index 9866b51..0000000
--- a/backend/core/src/main/java/org/artifactory/storage/jobs/StatsDelegatingServiceFlushJob.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.jobs;
-
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.schedule.JobCommand;
-import org.artifactory.schedule.TaskUser;
-import org.artifactory.schedule.quartz.QuartzCommand;
-import org.artifactory.storage.service.StatsDelegatingService;
-import org.artifactory.storage.service.StatsDelegatingServiceImpl;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * A simple job to trigger statistics flushing.
- *
- * @author Michael Pasternak
- * @see org.artifactory.storage.fs.service.StatsService#flushStats()
- */
- at JobCommand(description = "Download Statistics Flushing Delegator",
-        singleton = true, runOnlyOnPrimary = false, schedulerUser = TaskUser.SYSTEM, manualUser = TaskUser.SYSTEM)
-public class StatsDelegatingServiceFlushJob extends QuartzCommand {
-    private static final Logger log = LoggerFactory.getLogger(StatsDelegatingServiceFlushJob.class);
-
-    @Override
-    protected void onExecute(JobExecutionContext callbackContext) throws JobExecutionException {
-        log.debug("Remote Stats FlushJob started");
-        ArtifactoryContext artifactoryContext = ContextHelper.get();
-        StatsDelegatingService statsService = artifactoryContext.beanForType(StatsDelegatingServiceImpl.class);
-        statsService.flushStats();
-        log.debug("Remote  Stats FlushJob finished");
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/storage/jobs/StatsPersistingServiceFlushJob.java b/backend/core/src/main/java/org/artifactory/storage/jobs/StatsPersistingServiceFlushJob.java
deleted file mode 100644
index 0d520b5..0000000
--- a/backend/core/src/main/java/org/artifactory/storage/jobs/StatsPersistingServiceFlushJob.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.jobs;
-
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.schedule.JobCommand;
-import org.artifactory.schedule.TaskUser;
-import org.artifactory.schedule.quartz.QuartzCommand;
-import org.artifactory.storage.db.fs.service.StatsPersistingServiceImpl;
-import org.artifactory.storage.fs.service.StatsService;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * A job to trigger internal statistics flushing.
- *
- * @author Yossi Shaul
- * @see org.artifactory.storage.fs.service.StatsService#flushStats()
- */
- at JobCommand(description = "Download Statistics Flushing",
-        singleton = true, runOnlyOnPrimary = false, schedulerUser = TaskUser.SYSTEM, manualUser = TaskUser.SYSTEM)
-public class StatsPersistingServiceFlushJob extends QuartzCommand {
-    private static final Logger log = LoggerFactory.getLogger(StatsPersistingServiceFlushJob.class);
-
-    @Override
-    protected void onExecute(JobExecutionContext callbackContext) throws JobExecutionException {
-        log.debug("Internal Stats FlushJob started");
-        ArtifactoryContext artifactoryContext = ContextHelper.get();
-        StatsService statsService = artifactoryContext.beanForType(StatsPersistingServiceImpl.class);
-        statsService.flushStats();
-        log.debug("Internal Stats FlushJob finished");
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/storage/mbean/ManagedStorage.java b/backend/core/src/main/java/org/artifactory/storage/mbean/ManagedStorage.java
deleted file mode 100644
index 9e73961..0000000
--- a/backend/core/src/main/java/org/artifactory/storage/mbean/ManagedStorage.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.mbean;
-
-import org.artifactory.storage.binstore.service.InternalBinaryService;
-
-/**
- * StorageMBean implementation.
- *
- * @author Yossi Shaul
- */
-public class ManagedStorage implements ManagedStorageMBean {
-    private final InternalBinaryService binaryStore;
-
-    public ManagedStorage(InternalBinaryService binaryStore) {
-        this.binaryStore = binaryStore;
-    }
-
-    @Override
-    public long getSize() {
-        return binaryStore.getStorageSize();
-    }
-
-    public void pingTest() {
-        binaryStore.ping();
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/storage/mbean/ManagedStorageMBean.java b/backend/core/src/main/java/org/artifactory/storage/mbean/ManagedStorageMBean.java
deleted file mode 100644
index 97a37f0..0000000
--- a/backend/core/src/main/java/org/artifactory/storage/mbean/ManagedStorageMBean.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.mbean;
-
-/**
- * @author Yossi Shaul
- */
-public interface ManagedStorageMBean {
-
-    /**
-     * @return The database storage size in bytes
-     */
-    long getSize();
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/storage/service/InternalStorageService.java b/backend/core/src/main/java/org/artifactory/storage/service/InternalStorageService.java
deleted file mode 100644
index 9308e4f..0000000
--- a/backend/core/src/main/java/org/artifactory/storage/service/InternalStorageService.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.service;
-
-import org.artifactory.spring.ReloadableBean;
-import org.artifactory.storage.StorageService;
-
-/**
- * @author yoavl
- */
-public interface InternalStorageService extends StorageService, ReloadableBean {
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/storage/service/StatsDelegatingService.java b/backend/core/src/main/java/org/artifactory/storage/service/StatsDelegatingService.java
deleted file mode 100644
index 8338eb3..0000000
--- a/backend/core/src/main/java/org/artifactory/storage/service/StatsDelegatingService.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.artifactory.storage.service;
-
-import org.artifactory.repo.RepoPath;
-
-/**
- * Delegates statistics events to registered members
- *
- * @author Michael Pasternak
- */
-public interface StatsDelegatingService {
-    /**
-     * Update the download (performed at remote artifactory instance) stats and increment the count by one.
-     * The storage update is not immediate.
-     *
-     * @param origin         The origin hosts
-     * @param path           The round trip of download request
-     * @param repoPath       The file repo path to set/update stats
-     * @param downloadedBy   User who downloaded the file
-     * @param downloadedTime Time the file was downloaded
-     * @param count          Amount of performed downloads
-     */
-    void fileDownloaded(String origin, String path, RepoPath repoPath, String downloadedBy, long downloadedTime, long count);
-
-    /**
-     * Flushes the collected statistics event from the memory to the backing storage.
-     */
-    void flushStats();
-}
diff --git a/backend/core/src/main/java/org/artifactory/storage/service/StatsDelegatingServiceImpl.java b/backend/core/src/main/java/org/artifactory/storage/service/StatsDelegatingServiceImpl.java
deleted file mode 100644
index a99c783..0000000
--- a/backend/core/src/main/java/org/artifactory/storage/service/StatsDelegatingServiceImpl.java
+++ /dev/null
@@ -1,536 +0,0 @@
-package org.artifactory.storage.service;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.Maps;
-import org.apache.commons.io.IOUtils;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpPut;
-import org.apache.http.client.methods.HttpRequestBase;
-import org.apache.http.entity.ContentType;
-import org.apache.http.entity.StringEntity;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.addon.ha.semaphore.SemaphoreWrapper;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.rest.constant.ArtifactRestConstants;
-import org.artifactory.descriptor.repo.HttpRepoDescriptor;
-import org.artifactory.model.xstream.fs.StatsImpl;
-import org.artifactory.repo.HttpRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.storage.db.fs.entity.Stat;
-import org.artifactory.storage.db.fs.service.AbstractStatsService;
-import org.artifactory.util.PathUtils;
-import org.artifactory.util.StringUtils;
-import org.codehaus.jackson.map.DeserializationConfig;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.io.IOException;
-import java.net.URI;
-import java.sql.SQLException;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.ConcurrentMap;
-
-/**
- * Delegates statistics events to registered members
- *
- * @author Michael Pasternak
- */
- at Service
-public class StatsDelegatingServiceImpl extends AbstractStatsService implements StatsDelegatingService {
-
-    //queue interpretation: destination rr | source rr | content to send
-    private volatile ConcurrentMap<String, Map<String, Collection<StatsEvent>>> delegationQueue = Maps.newConcurrentMap();
-    private static final Logger log = LoggerFactory.getLogger(StatsDelegatingServiceImpl.class);
-    private static final String ARTIFACTORY_APP_PATH = "/artifactory";
-
-    private static final String REMOTE_STATS_ARTIFACTORY_API_PATH = ARTIFACTORY_APP_PATH + "/api/"+
-            ArtifactRestConstants.PATH_ROOT+"/"+ArtifactRestConstants.PATH_STATISTICS+"/";
-
-    private static final String REMOTE_STATS_API_PATH = "/api/"+
-            ArtifactRestConstants.PATH_ROOT+"/"+ArtifactRestConstants.PATH_STATISTICS+"/";
-
-    public static final String CACHE_SUFFIX = "-cache";
-
-    private SemaphoreWrapper flushingSemaphore;
-
-    @Autowired
-    private RepositoryService repositoryService;
-
-    @Autowired
-    private InternalRepositoryService repoService;
-
-    private RepositoryService getRepositoryService() {
-        return repositoryService;
-    }
-
-    /**
-     * Queueing event for delegation,
-     * (triggered on artifact local download event)
-     *
-     * @param repoPath       The file repo path to set/update stats
-     * @param downloadedBy   User who downloaded the file
-     * @param downloadedTime Time the file was downloaded
-     */
-    public synchronized void fileDownloaded(RepoPath repoPath, String downloadedBy, long downloadedTime) {
-        log.debug("Queuing downloaded delegation for resource '{}' by '{}' at '{}'", repoPath, downloadedBy, downloadedTime);
-
-        StatsEvent statsEvent = getStatsEvents().get(repoPath);
-        if (statsEvent == null) {
-            getStatsEvents().put(repoPath, statsEvent = new StatsEvent(repoPath, null));
-        }
-        statsEvent.update(downloadedBy, null, null, downloadedTime, 1);
-    }
-
-    /**
-     * Queueing event for delegation,
-     * (triggered on artifact remote download event)
-     *
-     * @param origin             The remote host the download was triggered by
-     * @param path               The round trip of download request
-     * @param repoPath           The file repo path to set/update stats
-     * @param downloadedBy       User who downloaded the file
-     * @param downloadedTime     Time the file was downloaded
-     * @param count              Amount of performed downloads
-     */
-    @Override
-    public synchronized void fileDownloaded(String origin, String path, RepoPath repoPath,
-            String downloadedBy, long downloadedTime, long count) {
-
-        log.debug("Queuing download delegation for resource '{}' downloaded remotely by '{}', at '{}', from {}, count: '{}'",
-                repoPath, downloadedBy, downloadedTime, origin, count);
-
-        StatsEvent statsEvent = getStatsEvents().get(repoPath);
-        if (statsEvent == null) {
-            getStatsEvents().put(repoPath, statsEvent = new StatsEvent(repoPath, origin));
-        }
-        statsEvent.update(downloadedBy, origin, path, downloadedTime, count);
-    }
-
-    /**
-     * Queue statistics for delegation to remote Artifactory instance,
-     * queueing grouping is based on RemoteRepo target. e.g actual remote
-     * repository
-     *
-     * @param event stats event
-     * @param nodeId id representing artifact location
-     * @param stats statistics
-     *
-     * @throws java.sql.SQLException
-     */
-    @Override
-    protected void processStats(StatsEvent event, long nodeId, Stat stats) throws SQLException {
-        log.debug("Processing delegation event '{}' for nodeId '{}', stats {}", event, nodeId, stats);
-
-        String sourceRepoKey = event.getRepoPath().getRepoKey();
-        RemoteRepoDescriptor remoteRepoDescriptor =
-                getRepositoryService().remoteRepoDescriptorByKey(fromCachedRepoKey(sourceRepoKey));
-        if (remoteRepoDescriptor != null) {
-            String targetRepoKey = getRemoteRepoKey(remoteRepoDescriptor);
-            if(!Strings.isNullOrEmpty(targetRepoKey)) {
-                log.debug("Event {} saved for delegation to repo {}", event, targetRepoKey);
-                getQueuedStatsEvents(sourceRepoKey, targetRepoKey).add(event);
-            } else {
-                log.debug("Can't find targetRepoKey by URL {}", remoteRepoDescriptor.getUrl());
-            }
-        } else {
-            log.debug("Can't find repoDescriptor by id {}", sourceRepoKey);
-        }
-    }
-
-    /**
-     * Locates actual remote repoKey by RemoteRepoDescriptor#Url
-     *
-     * @param remoteRepoDescriptor
-     *
-     * @return remote repoKey
-     */
-    private String getRemoteRepoKey(RemoteRepoDescriptor remoteRepoDescriptor) {
-        try {
-            URI uri = URI.create(remoteRepoDescriptor.getUrl());
-            if(uri != null) {
-                String[] pathItems = uri.getPath().split("/");
-                if(pathItems.length > 0)
-                    return pathItems[pathItems.length-1];
-            }
-            log.debug("Error on converting RepoDescriptor Url to URI");
-        } catch (Exception ex) {
-            log.debug("Error on converting RepoDescriptor Url to URI: {}", ex);
-        }
-        return null;
-    }
-
-    @Override
-    protected void onTraversingStart() {
-        log.debug("Starting events grouping for processing");
-    }
-
-    /**
-     * In remote context, this method triggers actual grouped
-     * events delegation
-     */
-    @Override
-    protected void onTraversingEnd() {
-        log.debug("Finished events grouping, delegating ...");
-
-        Iterator<Map.Entry<String, Map<String, Collection<StatsEvent>>>> iterator
-                = delegationQueue.entrySet().iterator();
-
-        while (iterator.hasNext()) {
-            final Map.Entry<String, Map<String, Collection<StatsEvent>>> entry = iterator.next();
-            final String repoKey = entry.getKey();
-            final Map<String, Collection<StatsEvent>> events = entry.getValue();
-            iterator.remove();
-            delegateStats(repoKey, events);
-        }
-    }
-
-    /**
-     * Fetches collection of events targeted to targetRepoKey grouped by sourceRepoKey
-     *
-     * @param sourceRepoKey local RemoteRepo
-     * @param targetRepoKey target RemoteRepo
-     *
-     * @return a collection of events
-     */
-    private Collection<StatsEvent> getQueuedStatsEvents(String sourceRepoKey, String targetRepoKey) {
-        Map<String, Collection<StatsEvent>> events = delegationQueue.get(targetRepoKey);
-        if (events == null) {
-            synchronized (delegationQueue) {
-                events = delegationQueue.get(targetRepoKey);
-                if(events == null) {
-                    delegationQueue.put(targetRepoKey, new ConcurrentHashMap<>());
-                    events = delegationQueue.get(targetRepoKey);
-                    events.put(sourceRepoKey, new ConcurrentLinkedQueue<>());
-                }
-            }
-        }
-        if (events.get(sourceRepoKey) == null) {
-            synchronized (delegationQueue) {
-                if (events.get(sourceRepoKey) == null){
-                    events.put(sourceRepoKey, new ConcurrentLinkedQueue<>());
-                }
-            }
-        }
-        return events.get(sourceRepoKey);
-    }
-
-    /**
-     * Performs statistics delegation to RemoteRepository
-     *
-     * @param events an events to delegated (grouped by source repo)
-     *
-     * @return if item/s was/where delegated or no
-     */
-    private boolean delegateStats(String repoKey, Map<String, Collection<StatsEvent>> events) {
-
-        if (!filterEvents(events)) {
-            return false;
-        }
-
-        log.debug("Delegating event/s '{}' to remote repo \"{}\"", events, repoKey);
-        return doDelegate(repoKey, events);
-    }
-
-    /**
-     * Filters out events not applicable for delegation
-     *
-     * @param events an events to delegated (grouped by source repo)
-     *
-     * @return if delegation should occur (e.g any events left)
-     */
-    private boolean filterEvents(Map<String, Collection<StatsEvent>> events) {
-
-        boolean shouldRemove;
-        Iterator<Map.Entry<String, Collection<StatsEvent>>> iterator = events.entrySet().iterator();
-        while (iterator.hasNext()) {
-
-            shouldRemove = false;
-            final Map.Entry<String, Collection<StatsEvent>> event = iterator.next();
-            String repoKey = fromCachedRepoKey(event.getKey());
-
-            if (events.size() == 0) return false;
-
-            HttpRepoDescriptor descriptor =
-                    (HttpRepoDescriptor) getRepositoryService()
-                            .remoteRepoDescriptorByKey(repoKey);
-
-            if (descriptor == null) {
-                log.debug("Not performing content synchronization due to missing HttpRepoDescriptor in context," +
-                        " for instance, this may happen if current repository is LOCAL or repoKey is incorrect");
-                shouldRemove = true;
-            }
-
-            if (descriptor.getContentSynchronisation() == null) {
-                log.debug("Not performing content synchronization due to missing ContentSynchronisation config");
-                shouldRemove = true;
-            }
-
-            if (!descriptor.getContentSynchronisation().isEnabled() ||
-                    !descriptor.getContentSynchronisation().getStatistics().isEnabled()) {
-                log.debug("Not performing content synchronization due to disabled ContentSynchronisation");
-                shouldRemove = true;
-            }
-
-            if(shouldRemove) iterator.remove();
-        }
-
-        return !events.isEmpty();
-    }
-
-    /**
-     * actual content delegation in groups targeted to specific
-     * remoteRepo
-     *
-     * @param remoteRepoKey
-     * @param eventsCollection
-     *
-     * @return is event/s where delegated
-     */
-    private boolean doDelegate(String remoteRepoKey, Map<String, Collection<StatsEvent>> eventsCollection) {
-        log.debug("Received content for delegation is: '{}', target: '{}'", eventsCollection, remoteRepoKey);
-
-        boolean succeeded=true;
-        HttpRepoDescriptor descriptor;
-        for (Map.Entry<String, Collection<StatsEvent>> localRepo : eventsCollection.entrySet()) {
-            String localRemoteRepoKey = fromCachedRepoKey(localRepo.getKey());
-            Collection<StatsEvent> events = localRepo.getValue();
-            descriptor = (HttpRepoDescriptor) getRepositoryService().remoteRepoDescriptorByKey(localRemoteRepoKey);
-
-            // though we grouping events by (target) remoteRepo, we fire them
-            // in sub-groups per (local) remoteRepo (initiated these events) cause
-            // it has own configuration (user/password/proxy/timeout/etc.)
-
-            if(descriptor != null) {
-                CloseableHttpResponse response = null;
-                try {
-                    if(events.size() == 0) continue;
-                    URI uri = URI.create(descriptor.getUrl());
-                    if (uri != null) {
-                        String actualUrl = produceRequestUrl(uri);
-                        log.debug("Target URL: '{}'", actualUrl);
-                        HttpPut putMethod = new HttpPut(actualUrl);
-                        String serializedData = serialize(toStatsImpl(remoteRepoKey, events));
-                        log.debug("Serialized content to send: '{}'", serializedData);
-                        putMethod.setEntity(new StringEntity(serializedData, ContentType.APPLICATION_JSON));
-                        putMethod.addHeader("Content-Type", ContentType.APPLICATION_JSON.getMimeType());
-                        response = request(putMethod, descriptor);
-                        if (response != null && response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
-                            log.debug("Successfully delegated content to \"{}\" from \"{}\"", remoteRepoKey, localRemoteRepoKey);
-                        } else {
-                            succeeded &= false;
-                            if (response != null)
-                                log.debug("Bad response \"{}\" from delegation request", response.getStatusLine());
-                        }
-                    } else {
-                        succeeded &= false;
-                        log.warn("Could not combine URI from descriptor url '{}'",
-                                descriptor.getUrl());
-                    }
-                } catch (IllegalArgumentException | IOException ex) {
-                    succeeded &= false;
-                    log.error("Error during content delegation", ex);
-
-                } finally {
-                    IOUtils.closeQuietly(response);
-                }
-            } else {
-                log.debug("Can't find local remoteRepo by key {} from delegation targeted events", localRemoteRepoKey);
-            }
-        }
-
-        return succeeded;
-    }
-
-    /**
-     * Converts StatsEvent to StatsImpl
-     *
-     * (StatsEvent is not available in artifactory-api layer)
-     *
-     * @param remoteRepoKey
-     * @param statsEvents
-     *
-     * @return {@link StatsImpl}
-     */
-    private StatsImpl[] toStatsImpl(String remoteRepoKey, Collection<StatsEvent> statsEvents) {
-        StatsImpl[] stats = new StatsImpl[statsEvents.size()];
-        int i=-1;
-
-        for(StatsEvent statsEvent : statsEvents) {
-            StatsImpl statsImpl = new StatsImpl();
-            statsImpl.setDownloadCount(statsEvent.getLocalEventCount().get());
-            statsImpl.setLastDownloaded(statsEvent.getLocalDownloadedTime());
-            statsImpl.setLastDownloadedBy(statsEvent.getLocalDownloadedBy());
-
-            statsImpl.setRemoteDownloadCount(statsEvent.getRemoteEventCount().get());
-            statsImpl.setRemoteLastDownloaded(statsEvent.getRemoteDownloadedTime());
-            statsImpl.setRemoteLastDownloadedBy(statsEvent.getRemoteDownloadedBy());
-
-            statsImpl.setRepoPath(statsEvent.getRepoPath().getPath());
-            statsImpl.setPath(statsEvent.getPath());
-
-            stats[++i] = statsImpl;
-        }
-
-        return stats;
-    }
-
-    /**
-     * Produces url to be used against target host
-     * @param uri original URI
-     *
-     * @return url to be used
-     */
-    private String produceRequestUrl(URI uri) {
-        String[] uriParts = uri.getPath().split("/");
-        String remoteRepoKey = uriParts[uriParts.length - 1];
-        return new StringBuilder()
-                .append(uri.getScheme())
-                .append("://")
-                .append(uri.getHost())
-                .append(uri.getPort() != -1 ?
-                                ":" + uri.getPort()
-                                :
-                                ""
-                )
-                .append(uri.getPath().startsWith(ARTIFACTORY_APP_PATH) ?
-                                REMOTE_STATS_ARTIFACTORY_API_PATH
-                                :
-                                getServiceName(uri) + REMOTE_STATS_API_PATH
-                )
-                .append(toCachedRepoKey(remoteRepoKey))
-                .toString();
-    }
-
-    /**
-     * Fetches service name from the original URI
-     *
-     * @param uri
-     * @return service name
-     */
-    private String getServiceName(URI uri) {
-        if(uri.getPath() != null) {
-            String[] parts = uri.getPath().split("/");
-            if(parts.length >= 2) {
-                if (!(parts.length == 2 && uri.getPath().startsWith("/") && uri.getPath().endsWith("/")))
-                    return "/" + PathUtils.getFirstPathElement(uri.getPath()); // .../serviceName/repoName
-            }
-        }
-        return ""; // .../repoName
-    }
-
-    /**
-     * Converts repoKey to repoKey-cache
-     *
-     * @param remoteRepoKey
-     *
-     * @return remote repoKey
-     */
-    private String toCachedRepoKey(String remoteRepoKey) {
-        boolean isLocalRepo = repoService
-                .localRepositoryByKey(remoteRepoKey) != null;
-
-        return (remoteRepoKey + (isLocalRepo || remoteRepoKey.endsWith(CACHE_SUFFIX) ?
-                ""
-                :
-                CACHE_SUFFIX)
-        );
-    }
-
-    /**
-     * Extracts repoKey from repoKey-cache
-     *
-     * @param repoKey
-     *
-     * @return remote repoKey
-     */
-    private String fromCachedRepoKey(String repoKey) {
-        if (!Strings.isNullOrEmpty(repoKey) && repoKey.endsWith(CACHE_SUFFIX))
-            repoKey = StringUtils.replaceLast(repoKey, CACHE_SUFFIX, "");
-        return repoKey;
-    }
-
-    @Override
-    protected SemaphoreWrapper getFlushingSemaphore() {
-        if (flushingSemaphore == null) {
-            AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-            HaCommonAddon haCommonAddon = addonsManager.addonByType(HaCommonAddon.class);
-            flushingSemaphore = haCommonAddon.getSemaphore(HaCommonAddon.STATS_REMOTE_SEMAPHORE_NAME);
-        }
-        return flushingSemaphore;
-    }
-
-    /**
-     * Serializes given item to json
-     *
-     * @param item an object to serialize
-     *
-     * @return serialized json string
-     *
-     * @throws IOException
-     */
-    private <T> String serialize(T item) throws IOException {
-        return getObjectMapper().writeValueAsString(item);
-    }
-
-    /**
-     * Creates a Jackson object mapper
-     *
-     * @return {@link org.codehaus.jackson.map.ObjectMapper}
-     */
-    private ObjectMapper getObjectMapper() {
-        ObjectMapper mapper = new ObjectMapper();
-        mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-        return mapper;
-    }
-
-    /**
-     * Executes HttpMethod against RemoteRepo target
-     *
-     * @param method
-     *
-     * @return {@link CloseableHttpResponse}
-     */
-    private CloseableHttpResponse request(HttpRequestBase method, HttpRepoDescriptor descriptor) {
-        HttpRepo httpRepo = getHttpRepo(descriptor);
-        if (httpRepo != null) {
-            try {
-                return httpRepo.executeMethod(method);
-            } catch (IOException e) {
-                log.debug("Executing remote statistics delegation to \"{}\" has failed due to:\n{}",
-                        descriptor.getUrl(),
-                        e
-                );
-            }
-        } else {
-            log.debug("RemoteRepo \"{}\" was not found",
-                    descriptor.getKey()
-            );
-        }
-        return null;
-    }
-
-    /**
-     * Fetches HttpRepo by HttpRepoDescriptor
-     *
-     * @param descriptor
-     *
-     * @return {@link HttpRepo}
-     */
-    private HttpRepo getHttpRepo(HttpRepoDescriptor descriptor) {
-        return  (HttpRepo) repoService.remoteRepositoryByKey(
-                descriptor.getKey()
-        );
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/storage/service/StatsServiceImpl.java b/backend/core/src/main/java/org/artifactory/storage/service/StatsServiceImpl.java
deleted file mode 100644
index 156fec8..0000000
--- a/backend/core/src/main/java/org/artifactory/storage/service/StatsServiceImpl.java
+++ /dev/null
@@ -1,131 +0,0 @@
-package org.artifactory.storage.service;
-
-import org.artifactory.fs.StatsInfo;
-import org.artifactory.model.xstream.fs.StatsImpl;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.storage.db.fs.service.StatsPersistingServiceImpl;
-import org.artifactory.storage.fs.service.StatsService;
-import org.artifactory.storage.service.constraints.NotSystemUserCriteria;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nullable;
-
-/**
- * Provides statistics persistence and delegation services
- *
- * @author Michael Pasternak
- */
- at Service
-public class StatsServiceImpl implements StatsService {
-
-    private static final Logger log = LoggerFactory.getLogger(StatsServiceImpl.class);
-
-    @Autowired
-    private StatsPersistingServiceImpl statsPersistingService;
-
-    @Autowired
-    private StatsDelegatingServiceImpl statsDelegatingService;
-
-    @Autowired
-    private NotSystemUserCriteria notSystemUserCriteria;
-
-    /**
-     * Collects stats from both DB and queue of events
-     *
-     * @param repoPath The file repo path to get stats on
-     *
-     * @return {@link StatsInfo}
-     */
-    @Nullable
-    @Override
-    public StatsInfo getStats(RepoPath repoPath) {
-        return (StatsImpl) statsPersistingService.getStats(repoPath);
-    }
-
-    /**
-     * Triggered on local download event
-     *
-     * Event queued for local stats update and potential delegation
-     *
-     * @param repoPath       The file repo path to set/update stats
-     * @param downloadedBy   User who downloaded the file
-     * @param downloadedTime Time the file was downloaded
-     * @param fromAnotherArtifactory specifying whether request comes fromAnotherArtifactory
-     *                               (happens on first transitive download when artifact not in cache yet)
-     */
-    @Override
-    public void fileDownloaded(RepoPath repoPath, String downloadedBy, long downloadedTime, boolean fromAnotherArtifactory) {
-        log.debug("Resource '{}' was downloaded by '{}' at '{}', fromAnotherArtifactory: '{}'",
-                repoPath, downloadedBy, downloadedTime, fromAnotherArtifactory);
-
-        if(notSystemUserCriteria.meet(downloadedBy)) {
-            statsPersistingService.fileDownloaded(repoPath, downloadedBy, downloadedTime, fromAnotherArtifactory);
-            if (!fromAnotherArtifactory) {
-                // we'd like to skip trigger comes fromAnotherArtifactory
-                // as it anyway will be delegated via remoteDownload event
-                statsDelegatingService.fileDownloaded(repoPath, downloadedBy, downloadedTime);
-            }
-        } else {
-            log.debug("User {} is not answering desired criteria, ignoring ...", downloadedBy);
-        }
-    }
-
-    /**
-     * Triggered on remote download event
-     *
-     * Event queued for local stats update and potential delegation
-     *
-     * @param origin             The remote host the download was triggered by
-     * @param path               The round trip of download request
-     * @param repoPath           The file repo path to set/update stats
-     * @param downloadedBy       User who downloaded the file
-     * @param downloadedTime     Time the file was downloaded
-     * @param count              Amount of performed downloads
-     */
-    @Override
-    public void fileDownloadedRemotely(String origin, String path, RepoPath repoPath, String downloadedBy,
-            long downloadedTime, long count) {
-        log.debug("Resource '{}' was downloaded remotely by '{}', at '{}', from {}, count: '{}'",
-                repoPath, downloadedBy, downloadedTime, origin, count);
-
-        if(notSystemUserCriteria.meet(downloadedBy)) {
-            statsPersistingService.fileDownloadedRemotely(origin, path, repoPath, downloadedBy, downloadedTime, count);
-            statsDelegatingService.fileDownloaded(origin, path, repoPath, downloadedBy, downloadedTime, count);
-        } else {
-            log.debug("User {} is not answering desired criteria, ignoring ...", downloadedBy);
-        }
-    }
-
-    @Override
-    public int setStats(long nodeId, StatsInfo statsInfo) {
-        return statsPersistingService.setStats(nodeId, statsInfo);
-    }
-
-    @Override
-    public boolean deleteStats(long nodeId) {
-        return statsPersistingService.deleteStats(nodeId);
-    }
-
-    /**
-     * Checks if local stats available
-     *
-     * @param repoPath The repo path to check
-     * @return
-     */
-    @Override
-    public boolean hasStats(RepoPath repoPath) {
-        return statsPersistingService.hasStats(repoPath);
-    }
-
-    /**
-     * Performs all queues flash
-     */
-    @Override
-    public void flushStats() {
-        statsPersistingService.flushStats();
-        statsDelegatingService.flushStats();
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/storage/service/StorageServiceImpl.java b/backend/core/src/main/java/org/artifactory/storage/service/StorageServiceImpl.java
deleted file mode 100644
index f48d56c..0000000
--- a/backend/core/src/main/java/org/artifactory/storage/service/StorageServiceImpl.java
+++ /dev/null
@@ -1,364 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.service;
-
-import com.google.common.base.Function;
-import com.google.common.collect.*;
-import org.apache.commons.io.FileUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.CoreAddons;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.repo.storage.RepoStorageSummaryInfo;
-import org.artifactory.api.storage.BinariesInfo;
-import org.artifactory.api.storage.StorageQuotaInfo;
-import org.artifactory.api.storage.StorageUnit;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.gc.GcConfigDescriptor;
-import org.artifactory.descriptor.quota.QuotaConfigDescriptor;
-import org.artifactory.descriptor.repo.*;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.mbean.MBeanRegistrationService;
-import org.artifactory.schedule.*;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.storage.FileStoreStorageSummary;
-import org.artifactory.storage.StorageProperties;
-import org.artifactory.storage.StorageSummaryInfo;
-import org.artifactory.storage.binstore.service.BinaryStoreGarbageCollectorJob;
-import org.artifactory.storage.binstore.service.InternalBinaryService;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.db.DbType;
-import org.artifactory.storage.fs.repo.RepoStorageSummary;
-import org.artifactory.storage.fs.service.FileService;
-import org.artifactory.storage.mbean.ManagedStorage;
-import org.artifactory.version.CompoundVersionDetails;
-import org.jfrog.storage.binstore.ifc.model.BinaryTreeElement;
-import org.jfrog.storage.binstore.ifc.model.StorageInfo;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.io.File;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import java.util.function.Predicate;
-
-import static org.artifactory.api.repo.storage.RepoStorageSummaryInfo.RepositoryType;
-
-/**
- * @author yoavl
- */
- at Service
- at Reloadable(beanClass = InternalStorageService.class, initAfter = TaskService.class)
-public class StorageServiceImpl implements InternalStorageService {
-    private static final Logger log = LoggerFactory.getLogger(StorageServiceImpl.class);
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Autowired
-    private DbService dbService;
-
-    @Autowired
-    private StorageProperties storageProperties;
-
-    @Autowired
-    private InternalBinaryService binaryStore;
-
-    @Autowired
-    private FileService fileService;
-
-    @Autowired
-    private TaskService taskService;
-
-    @Autowired
-    private RepositoryService repositoryService;
-
-    private boolean derbyUsed;
-
-    @Override
-    public void compress(BasicStatusHolder statusHolder) {
-        if (!derbyUsed) {
-            statusHolder.error("Compress command is not supported on current database type.", log);
-            return;
-        }
-
-        logStorageSizes();
-        dbService.compressDerbyDb(statusHolder);
-        logStorageSizes();
-    }
-
-    @Override
-    public void logStorageSizes() {
-        ArtifactoryHome artifactoryHome = ContextHelper.get().getArtifactoryHome();
-        File derbyDirectory = new File(artifactoryHome.getDataDir(), "derby");
-        long sizeOfDirectory = FileUtils.sizeOfDirectory(derbyDirectory);
-        log.info("Derby database storage size: {} ({})", StorageUnit.toReadableString(sizeOfDirectory), derbyDirectory);
-    }
-
-    @Override
-    public void ping() {
-        binaryStore.ping();
-    }
-
-    @Override
-    public BinaryTreeElement<Map<String, String>> getBinaryProviderInfo() {
-        BinaryTreeElement<Map<String, String>> binaryProvidersInfo = binaryStore.getBinaryProvidersInfo();
-        // Add the quota limits to the result
-        QuotaConfigDescriptor quotaConfig = centralConfigService.getDescriptor().getQuotaConfig();
-        if (quotaConfig != null && quotaConfig.isEnabled()) {
-            int quotaErrorLimit = quotaConfig.getDiskSpaceLimitPercentage();
-            int quotaWarningLimit = quotaConfig.getDiskSpaceWarningPercentage();
-            binaryProvidersInfo.getData().put("quotaErrorLimit", "" + quotaErrorLimit);
-            binaryProvidersInfo.getData().put("quotaWarningLimit", "" + quotaWarningLimit);
-        }
-        return binaryProvidersInfo;
-    }
-
-    @Override
-    public FileStoreStorageSummary getFileStoreStorageSummary() {
-        List<File> binariesDirs =Lists.newArrayList();
-        File binariesDir = binaryStore.getBinariesDir();
-        if(binariesDir != null){
-            binariesDirs.add(binariesDir);
-        }
-        return new FileStoreStorageSummary(binariesDirs, storageProperties);
-    }
-
-    @Override
-    public StorageQuotaInfo getStorageQuotaInfo(long fileContentLength) {
-        CentralConfigDescriptor descriptor = centralConfigService.getDescriptor();
-        QuotaConfigDescriptor quotaConfig = descriptor.getQuotaConfig();
-        if (quotaConfig == null) {
-            return null;
-        }
-        if (!quotaConfig.isEnabled()) {
-            return null;
-        }
-        StorageInfo storageInfo = binaryStore.getStorageInfoSummary();
-        long freeSpace = storageInfo.getFreeSpace();
-        long totalSpace = storageInfo.getTotalSpace();
-        long usageSpace = storageInfo.getUsageSpace();
-        return new StorageQuotaInfo(freeSpace, totalSpace, usageSpace, quotaConfig.getDiskSpaceLimitPercentage(),
-                quotaConfig.getDiskSpaceWarningPercentage());
-    }
-
-    @Override
-    public StorageSummaryInfo getStorageSummaryInfo() {
-        Set<RepoStorageSummary> summaries = fileService.getRepositoriesStorageSummary();
-        filterGlobalRepoIfNeeded(summaries);
-        List<RepoDescriptor> repos = Lists.newArrayList();
-        repos.addAll(repositoryService.getLocalAndCachedRepoDescriptors());
-        repos.addAll(repositoryService.getVirtualRepoDescriptors());
-        repos.addAll(repositoryService.getDistributionRepoDescriptors());
-        final ImmutableMap<String, RepoDescriptor> reposMap =
-                Maps.uniqueIndex(repos, new Function<RepoDescriptor, String>() {
-                    @Nullable
-                    @Override
-                    public String apply(@Nullable RepoDescriptor input) {
-                        if (input == null) {
-                            return null;
-                        }
-                        return input.getKey();
-                    }
-                });
-        Iterable<RepoStorageSummaryInfo> infos = Iterables.transform(summaries,
-                new Function<RepoStorageSummary, RepoStorageSummaryInfo>() {
-                    @Override
-                    public RepoStorageSummaryInfo apply(RepoStorageSummary r) {
-                        RepositoryType repoType = getRepoType(r.getRepoKey(), reposMap);
-                        RepoDescriptor repoDescriptor = reposMap.get(r.getRepoKey());
-                        String repoTypeName = "NA";
-                        if (repoDescriptor != null) {
-                            repoTypeName = repoDescriptor.getType().name();
-                        }
-                        RepoStorageSummaryInfo repoStorageSummaryInfo = new RepoStorageSummaryInfo(
-                                r.getRepoKey(), repoType, r.getFoldersCount(), r.getFilesCount(), r.getUsedSpace(),
-                                repoTypeName);
-                        return repoStorageSummaryInfo;
-                    }
-
-                    private RepositoryType getRepoType(String repoKey,
-                                                       ImmutableMap<String, RepoDescriptor> repoDescriptors) {
-                        RepoDescriptor repoDescriptor = repoDescriptors.get(repoKey);
-                        if (repoDescriptor == null) {
-                            return RepositoryType.NA;
-                        } else if (repoDescriptor instanceof RemoteRepoDescriptor) {
-                            return RepositoryType.REMOTE;
-                        } else if (repoDescriptor instanceof VirtualRepoDescriptor) {
-                            return RepositoryType.VIRTUAL;
-                        } else if (repoDescriptor instanceof LocalCacheRepoDescriptor) {
-                            return RepositoryType.CACHE;
-                        } else if (repoDescriptor instanceof DistributionRepoDescriptor) {
-                            return RepositoryType.DISTRIBUTION;
-                        } else if (repoDescriptor instanceof LocalRepoDescriptor) {
-                            return RepositoryType.LOCAL;
-                        } else {
-                            return RepositoryType.NA;
-                        }
-                    }
-                }
-        );
-
-        BinariesInfo binariesInfo = binaryStore.getBinariesInfo();
-
-        return new StorageSummaryInfo(Sets.newHashSet(infos), binariesInfo);
-    }
-
-    @Override
-    public void forceOptimizationOnce() {
-        binaryStore.forceOptimizationOnce();
-    }
-
-    private void filterGlobalRepoIfNeeded(Set<RepoStorageSummary> summaries) {
-        if (ConstantValues.disableGlobalRepoAccess.getBoolean()) {
-            summaries.removeIf(s -> VirtualRepoDescriptor.GLOBAL_VIRTUAL_REPO_KEY.equals(s.getRepoKey()));
-        }
-    }
-
-    @Override
-    public void callManualGarbageCollect(BasicStatusHolder statusHolder) {
-        taskService.checkCanStartManualTask(BinaryStoreGarbageCollectorJob.class, statusHolder);
-        if (!statusHolder.isError()) {
-            try {
-                execOneGcAndWait(true);
-            } catch (Exception e) {
-                statusHolder.error("Error activating Artifactory Storage Garbage Collector: " + e.getMessage(), e,
-                        log);
-            }
-        }
-    }
-
-    @Override
-    public void pruneUnreferencedFileInDataStore(BasicStatusHolder statusHolder) {
-        binaryStore.prune(statusHolder);
-    }
-
-    private String execOneGcAndWait(boolean waitForCompletion) {
-        TaskBase task = TaskUtils.createManualTask(BinaryStoreGarbageCollectorJob.class, 0L);
-        String token = taskService.startTask(task, true, true);
-        if (waitForCompletion) {
-            taskService.waitForTaskCompletion(token);
-        }
-        return token;
-    }
-
-    @Override
-    public boolean isDerbyUsed() {
-        return derbyUsed;
-    }
-
-    @Override
-    public void init() {
-        derbyUsed = dbService.getDatabaseType() == DbType.DERBY;
-
-        ContextHelper.get().beanForType(MBeanRegistrationService.class).
-                register(new ManagedStorage(binaryStore), "Storage", "Binary Storage");
-
-        CentralConfigDescriptor descriptor = centralConfigService.getDescriptor();
-        new GcSchedulerHandler(descriptor.getGcConfig(), null).reschedule();
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-        CentralConfigDescriptor descriptor = centralConfigService.getDescriptor();
-        new GcSchedulerHandler(descriptor.getGcConfig(), oldDescriptor.getGcConfig()).reschedule();
-    }
-
-    @Override
-    public void destroy() {
-        new GcSchedulerHandler(null, null).unschedule();
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-        //nop
-    }
-
-    static class GcSchedulerHandler extends BaseTaskServiceDescriptorHandler<GcConfigDescriptor> {
-
-        final List<GcConfigDescriptor> oldDescriptorHolder = Lists.newArrayList();
-        final List<GcConfigDescriptor> newDescriptorHolder = Lists.newArrayList();
-
-        GcSchedulerHandler(GcConfigDescriptor newDesc, GcConfigDescriptor oldDesc) {
-            if (newDesc != null) {
-                newDescriptorHolder.add(newDesc);
-            }
-            if (oldDesc != null) {
-                oldDescriptorHolder.add(oldDesc);
-            }
-        }
-
-        @Override
-        public String jobName() {
-            return "Garbage Collector";
-        }
-
-        @Override
-        public List<GcConfigDescriptor> getNewDescriptors() {
-            return newDescriptorHolder;
-        }
-
-        @Override
-        public List<GcConfigDescriptor> getOldDescriptors() {
-            return oldDescriptorHolder;
-        }
-
-        @Override
-        public Predicate<Task> getAllPredicate() {
-            return input -> (input != null) && BinaryStoreGarbageCollectorJob.class.isAssignableFrom(input.getType());
-        }
-
-        @Override
-        public Predicate<Task> getPredicate(@Nonnull GcConfigDescriptor descriptor) {
-            return getAllPredicate();
-        }
-
-        @Override
-        public void activate(@Nonnull GcConfigDescriptor descriptor, boolean manual) {
-            AddonsManager addonsManager = InternalContextHelper.get().beanForType(AddonsManager.class);
-            CoreAddons coreAddons = addonsManager.addonByType(CoreAddons.class);
-            TaskBase garbageCollectorTask;
-            if (coreAddons.isAol()) {
-                garbageCollectorTask = TaskUtils.createRepeatingTask(BinaryStoreGarbageCollectorJob.class,
-                        TimeUnit.SECONDS.toMillis(ConstantValues.gcIntervalSecs.getLong()),
-                        TimeUnit.SECONDS.toMillis(ConstantValues.gcDelaySecs.getLong()));
-            } else {
-                garbageCollectorTask = TaskUtils.createCronTask(BinaryStoreGarbageCollectorJob.class,
-                        descriptor.getCronExp(), "Binaries Garbage Collector");
-            }
-            InternalContextHelper.get().getTaskService().startTask(garbageCollectorTask, manual);
-        }
-
-        @Override
-        public GcConfigDescriptor findOldFromNew(@Nonnull GcConfigDescriptor newDescriptor) {
-            return oldDescriptorHolder.isEmpty() ? null : oldDescriptorHolder.get(0);
-        }
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/storage/service/constraints/Criteria.java b/backend/core/src/main/java/org/artifactory/storage/service/constraints/Criteria.java
deleted file mode 100644
index cd70a08..0000000
--- a/backend/core/src/main/java/org/artifactory/storage/service/constraints/Criteria.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.storage.service.constraints;
-
-/**
- * Filtering criteria
- *
- * @author Michael Pasternak
- *
- * @param <T> filter constraint type
- */
-public interface Criteria<T> {
-    /**
-     * Calculates whether given constraint
-     * answering desired criteria
-     *
-     * @param constraint constraint to be used for filtering
-     *
-     * @return true if content should be excluded,
-     *         otherwise false
-     */
-    boolean meet(T constraint);
-}
diff --git a/backend/core/src/main/java/org/artifactory/storage/service/constraints/NotSystemUserCriteria.java b/backend/core/src/main/java/org/artifactory/storage/service/constraints/NotSystemUserCriteria.java
deleted file mode 100644
index f549f8f..0000000
--- a/backend/core/src/main/java/org/artifactory/storage/service/constraints/NotSystemUserCriteria.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.storage.service.constraints;
-
-import org.artifactory.api.security.SecurityService;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Michael Pasternak
- */
- at Component
-public class NotSystemUserCriteria implements Criteria<String> {
-
-    private static final int USER_SYSTEM_HASH_CODE = SecurityService.USER_SYSTEM.hashCode();
-
-    /**
-     * Calculates whether given constraint
-     * answering desired criteria
-     *
-     * @param user to filter out
-     *
-     * @return true if content should be excluded,
-     *         otherwise false
-     */
-    @Override
-    public boolean meet(String user) {
-        return !(
-                user != null &&
-                USER_SYSTEM_HASH_CODE == user.hashCode() &&
-                SecurityService.USER_SYSTEM.equals(user)
-        );
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/traffic/InternalTrafficService.java b/backend/core/src/main/java/org/artifactory/traffic/InternalTrafficService.java
deleted file mode 100644
index f125912..0000000
--- a/backend/core/src/main/java/org/artifactory/traffic/InternalTrafficService.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic;
-
-import org.artifactory.spring.ReloadableBean;
-
-/**
- * @author yoavl
- */
-public interface InternalTrafficService extends ReloadableBean, TrafficService {
-
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/traffic/TrafficCollectionEvent.java b/backend/core/src/main/java/org/artifactory/traffic/TrafficCollectionEvent.java
deleted file mode 100644
index 172d919..0000000
--- a/backend/core/src/main/java/org/artifactory/traffic/TrafficCollectionEvent.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic;
-
-import com.google.common.collect.ImmutableList;
-import org.artifactory.traffic.entry.TrafficEntry;
-
-import java.util.List;
-
-/**
- * @author yoavl
- */
-public class TrafficCollectionEvent {
-
-    private final ImmutableList<TrafficEntry> trafficEntries;
-
-    public TrafficCollectionEvent(List<TrafficEntry> trafficEntries) {
-        this.trafficEntries = ImmutableList.<TrafficEntry>builder().addAll(trafficEntries).build();
-    }
-
-    public ImmutableList<TrafficEntry> getTrafficEntries() {
-        return trafficEntries;
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/traffic/TrafficCollector.java b/backend/core/src/main/java/org/artifactory/traffic/TrafficCollector.java
deleted file mode 100644
index a410cba..0000000
--- a/backend/core/src/main/java/org/artifactory/traffic/TrafficCollector.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic;
-
-import org.artifactory.sapi.common.ArtifactorySession;
-
-import java.util.Calendar;
-
-/**
- * A resolution based reaper of traffic events
- *
- * @author yoavl
- */
-public interface TrafficCollector {
-
-    String getName();
-
-    TrafficCollectorResolution getResolution();
-
-    void addListener(TrafficCollectorListener listener);
-
-    void removeListener(TrafficCollectorListener listener);
-
-    /**
-     * Called when traffic entries collection occurs by the traffic service. A traffic collector is expected to: (1)
-     * Collect back the data from the traffic service, either from the last collected until now or by some other time
-     * window based on the last collected value, and notify its listeners with the colleted data. and/or - (2) Use the
-     * provided collected entries segment.
-     *
-     * @param lastCollected
-     * @param service
-     * @param session
-     */
-    void collect(Calendar lastCollected, InternalTrafficService service, ArtifactorySession session);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/traffic/TrafficCollectorImpl.java b/backend/core/src/main/java/org/artifactory/traffic/TrafficCollectorImpl.java
deleted file mode 100644
index 40beec1..0000000
--- a/backend/core/src/main/java/org/artifactory/traffic/TrafficCollectorImpl.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic;
-
-import org.artifactory.sapi.common.ArtifactorySession;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Calendar;
-import java.util.Queue;
-import java.util.concurrent.ConcurrentLinkedQueue;
-
-/**
- * A basic traffic events collector
- *
- * @author yoavl
- */
-public class TrafficCollectorImpl implements TrafficCollector {
-
-    private static final Logger log = LoggerFactory.getLogger(TrafficCollectorImpl.class);
-
-    private final TrafficCollectorResolution resolution;
-    private final Queue<TrafficCollectorListener> listeners;
-    private final int[] fieldsToElapse;
-    private final Calendar collectorNextCollection;
-
-    public TrafficCollectorImpl(TrafficCollectorResolution resolution, int... fieldsToElapse) {
-        this.resolution = resolution;
-        this.listeners = new ConcurrentLinkedQueue<>();
-        this.fieldsToElapse = fieldsToElapse;
-        //Initialize next collection to now + interval
-        collectorNextCollection = Calendar.getInstance();
-        calcNextCollection(collectorNextCollection);
-    }
-
-    @Override
-    public String getName() {
-        return resolution.getName();
-    }
-
-    @Override
-    public TrafficCollectorResolution getResolution() {
-        return resolution;
-    }
-
-    @Override
-    public void addListener(TrafficCollectorListener listener) {
-        listeners.add(listener);
-    }
-
-    @Override
-    public void removeListener(TrafficCollectorListener listener) {
-        listeners.remove(listener);
-    }
-
-    @Override
-    public void collect(Calendar entriesCollection, InternalTrafficService trafficService, ArtifactorySession session) {
-        /*Calendar collectorLastCollected = trafficService.getLastCollected(resolution, session);
-        if (collectorLastCollected == null) {
-            //No last collected
-            log.trace("#### {}: Never collected before.", resolution.getName());
-        }
-
-        //Base the next collection time on the last collection time (if one exits) + collection interval
-        if (collectorLastCollected != null) {
-            calcNextCollection(collectorLastCollected);
-        }
-
-        log.trace("#### {}: collectorLastCollected: {}, collectorNextCollection: {}",
-                new Object[]{resolution.getName(), calendarToDateString(collectorLastCollected),
-                        collectorNextCollection.getTime()});
-
-        //Check if it's time to collect (we are after the collector's next collection time)
-        if (collectorNextCollection.before(entriesCollection)) {
-            //Select all entries that are part of our time window - from our last collected to our next collection
-            //(exclusive)
-            final TrafficEntriesIterator entriesIterator =
-                    trafficService.getDatabaseEntries(collectorLastCollected, collectorNextCollection, session);
-            log.trace("#### {}: Collecting {} from {} to {}",
-                    new Object[]{resolution.getName(), entriesIterator.size(),
-                            calendarToDateString(collectorLastCollected), collectorNextCollection.getTime()});
-            //Send the collection event to listeners
-            fireCollectionEvent(trafficService, entriesIterator);
-            //Update the collector's last collected
-            trafficService.updateLastCollected(resolution, collectorNextCollection, session);
-        }*/
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof TrafficCollectorImpl)) {
-            return false;
-        }
-        TrafficCollectorImpl collector = (TrafficCollectorImpl) o;
-        return resolution == collector.resolution;
-    }
-
-    @Override
-    public int hashCode() {
-        return resolution.hashCode();
-    }
-
-    void elapseCollectionFields(Calendar collection) {
-        for (int field : fieldsToElapse) {
-            collection.clear(field);
-        }
-    }
-
-    private void calcNextCollection(Calendar lastCollected) {
-        collectorNextCollection.setTime(lastCollected.getTime());
-        //Remove irrelevant fields (sec, mins etc.)
-        elapseCollectionFields(collectorNextCollection);
-        //Add the resolution to get the next collection time
-        collectorNextCollection.add(Calendar.SECOND, resolution.getSecs());
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/traffic/TrafficCollectorListener.java b/backend/core/src/main/java/org/artifactory/traffic/TrafficCollectorListener.java
deleted file mode 100644
index 99cc398..0000000
--- a/backend/core/src/main/java/org/artifactory/traffic/TrafficCollectorListener.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic;
-
-/**
- * @author yoavl
- */
-public interface TrafficCollectorListener {
-
-    public void onCollect(TrafficCollectionEvent e);
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/traffic/TrafficCollectorResolution.java b/backend/core/src/main/java/org/artifactory/traffic/TrafficCollectorResolution.java
deleted file mode 100644
index b82b01b..0000000
--- a/backend/core/src/main/java/org/artifactory/traffic/TrafficCollectorResolution.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic;
-
-/**
- * @author yoavl
- */
-public enum TrafficCollectorResolution {
-    SECOND(1),
-    MINUTE(SECOND.secs * 60),
-    HOUR(MINUTE.secs * 60),
-    DAY(HOUR.secs * 24),
-    WEEK(DAY.secs * 7),
-    MONTH(WEEK.secs * 4);
-
-    private final int secs;
-    private final String name;
-
-    TrafficCollectorResolution(int secs) {
-        this.secs = secs;
-        this.name = name().toLowerCase();
-    }
-
-    public int getSecs() {
-        return secs;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    @Override
-    public String toString() {
-        return getName();
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/traffic/TrafficServiceImpl.java b/backend/core/src/main/java/org/artifactory/traffic/TrafficServiceImpl.java
deleted file mode 100644
index 9218c8c..0000000
--- a/backend/core/src/main/java/org/artifactory/traffic/TrafficServiceImpl.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic;
-
-import com.google.common.collect.Lists;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.mbean.MBeanRegistrationService;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.schedule.TaskService;
-import org.artifactory.spring.InternalArtifactoryContext;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.spring.ReloadableBean;
-import org.artifactory.storage.db.servers.model.ArtifactoryServer;
-import org.artifactory.storage.db.servers.service.ArtifactoryServersCommonService;
-import org.artifactory.traffic.entry.TrafficEntry;
-import org.artifactory.traffic.entry.TransferEntry;
-import org.artifactory.traffic.mbean.Traffic;
-import org.artifactory.traffic.read.TrafficReader;
-import org.artifactory.version.CompoundVersionDetails;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.io.File;
-import java.util.Calendar;
-import java.util.List;
-
-/**
- * Traffic service persists the traffic (download/upload) in Artifactory and can retrieve it by date range.
- *
- * @author Yoav Landman
- */
- at Service
- at Reloadable(beanClass = InternalTrafficService.class, initAfter = {InternalRepositoryService.class, TaskService.class})
-public class TrafficServiceImpl implements InternalTrafficService, ReloadableBean {
-
-    private boolean active;
-
-    @Autowired
-    private ArtifactoryServersCommonService serversService;
-
-    @Override
-    public void init() {
-        //Register a mbean
-        InternalArtifactoryContext context = InternalContextHelper.get();
-        Traffic traffic = new Traffic(context.beanForType(InternalTrafficService.class));
-        ContextHelper.get().beanForType(MBeanRegistrationService.class).register(traffic);
-
-        active = ConstantValues.trafficCollectionActive.getBoolean();
-
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-        //nop
-    }
-
-    @Override
-    public void destroy() {
-        //nop
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-        //When conversion is needed, remove all old stats
-    }
-
-    @Override
-    public void handleTrafficEntry(TrafficEntry entry) {
-        if (active) {
-            if (entry instanceof TransferEntry) {
-                TrafficLogger.logTransferEntry((TransferEntry) entry);
-            }
-        }
-    }
-
-    public void validateDateRange(Calendar startDate, Calendar endDate) {
-        if (startDate.after(endDate)) {
-            throw new IllegalArgumentException("The start date cannot be later than the end date");
-        }
-    }
-
-    /**
-     * Returns traffic entries
-     *
-     * @param from Traffic start time
-     * @param to   Traffic end time
-     * @return List<TrafficEntry> taken from the traffic log files or the database
-     */
-    @Override
-    public List<TrafficEntry> getEntryList(Calendar from, Calendar to) {
-        List<TrafficEntry> logFileEntries = getLogFileEntries(from, to);
-        return logFileEntries;
-    }
-
-    /**
-     * Returns traffic entries from the traffic log files
-     *
-     * @param from Traffic start time
-     * @param to   Traffic end time
-     * @return List<TrafficEntry> taken from the traffic log files
-     */
-    public List<TrafficEntry> getLogFileEntries(Calendar from, Calendar to) {
-        File logDir = ContextHelper.get().getArtifactoryHome().getLogDir();
-        TrafficReader trafficReader = new TrafficReader(logDir);
-        List<TrafficEntry> logFileEntries = trafficReader.getEntries(from, to);
-        return logFileEntries;
-    }
-
-    /**
-     * Returns transfer usage
-     *
-     * @param startTime  Traffic start time in long
-     * @param endTime    Traffic end time in long
-     * @param ipToFilter filter the traffic by list of ip
-     * @return TransferUsage taken from the traffic log files or the database
-     */
-    @Override
-    public TransferUsage getTrafficUsageWithFilterCurrentNode(long startTime, long endTime,
-            List<String> ipToFilter) {
-        Calendar from = Calendar.getInstance();
-        from.setTimeInMillis(startTime);
-        Calendar to = Calendar.getInstance();
-        to.setTimeInMillis(endTime);
-        validateDateRange(from, to);
-        List<TrafficEntry> allTrafficEntry = getEntryList(from, to);
-        TransferUsage transferUsage = orderEntriesByFilter(allTrafficEntry, ipToFilter);
-        return transferUsage;
-    }
-
-    @Override
-    public boolean isActive() {
-        return active;
-    }
-
-    @Override
-    public TransferUsage getTrafficUsageWithFilter(long startTime, long endTime, List<String> ipsToFilter) {
-        List<TransferUsage> transferUsageList = Lists.newArrayList();
-        TransferUsage currentNodeUsage = getTrafficUsageWithFilterCurrentNode(startTime, endTime, ipsToFilter);
-        transferUsageList.add(currentNodeUsage);
-
-        HaCommonAddon haAddon = ContextHelper.get().beanForType(AddonsManager.class).addonByType(HaCommonAddon.class);
-        if (haAddon.isHaEnabled() && haAddon.isHaConfigured()) {
-            List<ArtifactoryServer> allOtherActiveHaServers = serversService.getOtherActiveMembers();
-            List<TransferUsage> responseList = (List<TransferUsage>) haAddon.propagateTrafficCollector(startTime, endTime, ipsToFilter,
-                    allOtherActiveHaServers, TransferUsage.class);
-            if (responseList == null) {
-               return null;
-            }
-            transferUsageList.addAll(responseList);
-        }
-        return aggregateUsage(transferUsageList);
-    }
-
-    private TransferUsage aggregateUsage(List<TransferUsage> transferUsageList) {
-        TransferUsage finalTransferUsage = new TransferUsage();
-        for (TransferUsage transferUsage : transferUsageList) {
-            finalTransferUsage.setDownload(finalTransferUsage.getDownload() + transferUsage.getDownload());
-            finalTransferUsage.setUpload(finalTransferUsage.getUpload() + transferUsage.getUpload());
-            finalTransferUsage.setExcludedDownload(
-                    finalTransferUsage.getExcludedDownload() + transferUsage.getExcludedDownload());
-            finalTransferUsage.setExcludedUpload(
-                    finalTransferUsage.getExcludedUpload() + transferUsage.getExcludedUpload());
-        }
-        return finalTransferUsage;
-    }
-
-    private TransferUsage orderEntriesByFilter(List<TrafficEntry> allTrafficEntry,
-            List<String> ipToFilter) {
-        TransferUsage transferUsage = new TransferUsage();
-        List<TrafficEntry> trafficEntriesExcludedUsage = Lists.newArrayList();
-        List<TrafficEntry> trafficEntriesUsage = Lists.newArrayList();
-        if (ipToFilter == null || ipToFilter.isEmpty()) {
-            trafficEntriesUsage.addAll(allTrafficEntry);
-        } else {
-            for (TrafficEntry trafficEntry : allTrafficEntry) {
-                if (isExcludedTraffic(trafficEntry, ipToFilter)) {
-                    trafficEntriesExcludedUsage.add(trafficEntry);
-                } else {
-                    trafficEntriesUsage.add(trafficEntry);
-                }
-            }
-
-        }
-        fillUsage(trafficEntriesExcludedUsage, transferUsage, true);
-        fillUsage(trafficEntriesUsage, transferUsage, false);
-        return transferUsage;
-    }
-
-    private void fillUsage(List<TrafficEntry> trafficEntriesUsage, TransferUsage transferUsage,
-            boolean isExcludedUsage) {
-        long uploadTransferUsage = 0;
-        long downloadTransferUsage = 0;
-
-        for (TrafficEntry trafficEntry : trafficEntriesUsage) {
-            long contentLength = ((TransferEntry) trafficEntry).getContentLength();
-            if (trafficEntry.getAction() == TrafficAction.UPLOAD) {
-                uploadTransferUsage += contentLength;
-            } else {
-                downloadTransferUsage += contentLength;
-            }
-        }
-        if (isExcludedUsage) {
-            transferUsage.setExcludedUpload(uploadTransferUsage);
-            transferUsage.setExcludedDownload(downloadTransferUsage);
-        } else {
-            transferUsage.setUpload(uploadTransferUsage);
-            transferUsage.setDownload(downloadTransferUsage);
-        }
-    }
-
-    private boolean isExcludedTraffic(TrafficEntry trafficEntry, List<String> ipToFilter) {
-        TransferEntry transferEntry = ((TransferEntry) trafficEntry);
-        for (String ipAddress : ipToFilter) {
-            if (transferEntry.getUserAddress().equals(ipAddress)) {
-                return true;
-            }
-        }
-        return false;
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/main/java/org/artifactory/traffic/mbean/Traffic.java b/backend/core/src/main/java/org/artifactory/traffic/mbean/Traffic.java
deleted file mode 100644
index 7ef3054..0000000
--- a/backend/core/src/main/java/org/artifactory/traffic/mbean/Traffic.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic.mbean;
-
-import org.artifactory.traffic.TrafficAction;
-import org.artifactory.traffic.TrafficService;
-import org.artifactory.traffic.entry.TrafficEntry;
-import org.artifactory.traffic.entry.TransferEntry;
-
-import java.util.Calendar;
-import java.util.List;
-
-/**
- * @author Noam Tenne
- */
-public class Traffic implements TrafficMBean {
-
-    private final TrafficService trafficService;
-
-    public Traffic(TrafficService service) {
-        trafficService = service;
-    }
-
-    @Override
-    public long getAccumulatedDownloadSize(long from, long to) {
-        List<TrafficEntry> entries = getEntries(from, to);
-        return sumTransfer(entries, TrafficAction.DOWNLOAD);
-    }
-
-    @Override
-    public long getAccumulatedUploadSize(long from, long to) {
-        List<TrafficEntry> entries = getEntries(from, to);
-        return sumTransfer(entries, TrafficAction.UPLOAD);
-    }
-
-    private long sumTransfer(List<TrafficEntry> entries, TrafficAction action) {
-        long sum = 0;
-        for (TrafficEntry entry : entries) {
-            if (action.equals(entry.getAction())) {
-                sum += ((TransferEntry) entry).getContentLength();
-            }
-        }
-        return sum;
-    }
-
-    private List<TrafficEntry> getEntries(long from, long to) {
-        Calendar fromCal = toCalender(from);
-        Calendar toCal = toCalender(to);
-        return trafficService.getEntryList(fromCal, toCal);
-    }
-
-    private Calendar toCalender(long timeMillis) {
-        if (timeMillis < 0) {
-            return null;
-        }
-        Calendar cal = Calendar.getInstance();
-        cal.setTimeInMillis(timeMillis);
-        return cal;
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/traffic/mbean/TrafficMBean.java b/backend/core/src/main/java/org/artifactory/traffic/mbean/TrafficMBean.java
deleted file mode 100644
index 95dd34f..0000000
--- a/backend/core/src/main/java/org/artifactory/traffic/mbean/TrafficMBean.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic.mbean;
-
-/**
- * @author Noam Tenne
- */
-//@MXBean
-public interface TrafficMBean {
-    long getAccumulatedDownloadSize(long from, long to);
-
-    long getAccumulatedUploadSize(long from, long to);
-}
diff --git a/backend/core/src/main/java/org/artifactory/util/ArtifactoryServerHelper.java b/backend/core/src/main/java/org/artifactory/util/ArtifactoryServerHelper.java
deleted file mode 100644
index eb9f81b..0000000
--- a/backend/core/src/main/java/org/artifactory/util/ArtifactoryServerHelper.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.artifactory.util;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.ArtifactoryRunningMode;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.state.ArtifactoryServerState;
-import org.artifactory.storage.db.servers.model.ArtifactoryServer;
-import org.artifactory.storage.db.servers.model.ArtifactoryServerRole;
-import org.artifactory.version.CompoundVersionDetails;
-
-/**
- * author: gidis
- */
-public abstract class ArtifactoryServerHelper {
-
-    public static ArtifactoryServer createArtifactoryServer(String serverId, String serverContextUrl,
-            int clusterPort, CompoundVersionDetails versionDetails, ArtifactoryServerState serverState,
-            ArtifactoryServerRole serverRole,
-            ArtifactoryRunningMode artifactoryRunningMode) {
-
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        long startTime = System.currentTimeMillis(); //todo pass real start time before bootstrapping started
-        String licenseKeyHash = addonsManager.getLicenseKeyHash();
-        return new ArtifactoryServer(
-                serverId,
-                startTime,
-                serverContextUrl,
-                clusterPort,
-                serverState,
-                serverRole,
-                System.currentTimeMillis(),
-                versionDetails.getVersionName(),
-                versionDetails.getRevisionInt(),
-                versionDetails.getTimestamp(),
-                artifactoryRunningMode, licenseKeyHash
-        );
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/version/VersionInfoServiceImpl.java b/backend/core/src/main/java/org/artifactory/version/VersionInfoServiceImpl.java
deleted file mode 100644
index bf85550..0000000
--- a/backend/core/src/main/java/org/artifactory/version/VersionInfoServiceImpl.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version;
-
-import com.google.common.cache.CacheBuilder;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpHeaders;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.utils.URIBuilder;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.util.EntityUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.version.ArtifactoryVersioning;
-import org.artifactory.api.version.VersionHolder;
-import org.artifactory.api.version.VersionInfoService;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.spring.InternalContextHelper;
-import org.artifactory.util.HttpClientConfigurator;
-import org.artifactory.util.HttpUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.annotation.AsyncResult;
-import org.springframework.stereotype.Service;
-
-import java.util.Map;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-
-import static org.artifactory.common.ConstantValues.artifactoryVersion;
-
-/**
- * Main implementation of the Version Info Service. Can be used to retrieve the latest version and revision numbers.
- *
- * @author Noam Tenne
- */
- at Service
-public class VersionInfoServiceImpl implements VersionInfoService {
-    private static final Logger log = LoggerFactory.getLogger(VersionInfoServiceImpl.class);
-
-    /**
-     * URL of remote version info
-     */
-    private static final String URL = "http://service.jfrog.org/api/version";
-    /**
-     * Key to use in version information cache
-     */
-    static final String CACHE_KEY = "versioning";
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    private Map<String, ArtifactoryVersioning> cache =
-            CacheBuilder.newBuilder().initialCapacity(3).expireAfterWrite(
-                    ConstantValues.versioningQueryIntervalSecs.getLong(),
-                    TimeUnit.SECONDS).<String, ArtifactoryVersioning>build().asMap();
-
-    private static final String PARAM_JAVA_VERSION = "java.version";
-    private static final String PARAM_OS_ARCH = "os.arch";
-    private static final String PARAM_OS_NAME = "os.name";
-    private static final String PARAM_OEM = "oem";
-    private static final String PARAM_HASH = "artifactory.hash";
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public VersionHolder getLatestVersion(Map<String, String> headersMap, boolean release) {
-        ArtifactoryVersioning versioning = getVersioning(headersMap);
-        if (release) {
-            return versioning.getRelease();
-        }
-        return versioning.getLatest();
-    }
-
-    /**
-     * Retrieves the remote version info asynchronously.
-     *
-     * @param headersMap A map of the needed headers
-     * @return ArtifactoryVersioning - Versioning info from the server
-     */
-    @Override
-    public synchronized Future<ArtifactoryVersioning> getRemoteVersioningAsync(Map<String, String> headersMap) {
-
-        ArtifactoryVersioning result;
-        CloseableHttpClient client = null;
-        CloseableHttpResponse response = null;
-        try {
-            URIBuilder urlBuilder = new URIBuilder(URL)
-                    .addParameter(artifactoryVersion.getPropertyName(), artifactoryVersion.getString())
-                    .addParameter(PARAM_JAVA_VERSION, System.getProperty(PARAM_JAVA_VERSION))
-                    .addParameter(PARAM_OS_ARCH, System.getProperty(PARAM_OS_ARCH))
-                    .addParameter(PARAM_OS_NAME, System.getProperty(PARAM_OS_NAME))
-                    .addParameter(PARAM_HASH, addonsManager.getLicenseKeyHash());
-
-            if (addonsManager.isPartnerLicense()) {
-                urlBuilder.addParameter(PARAM_OEM, "VMware");
-            }
-            HttpGet getMethod = new HttpGet(urlBuilder.build());
-            //Append headers
-            setHeader(getMethod, headersMap, HttpHeaders.USER_AGENT);
-            setHeader(getMethod, headersMap, HttpHeaders.REFERER);
-
-            client = createHttpClient();
-
-            log.debug("Retrieving Artifactory versioning from remote server");
-            response = client.execute(getMethod);
-            String returnedInfo = null;
-            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
-                returnedInfo = EntityUtils.toString(response.getEntity());
-            }
-            if (StringUtils.isBlank(returnedInfo)) {
-                log.debug("Versioning response contains no data");
-                result = createServiceUnavailableVersioning();
-            } else {
-                result = VersionParser.parse(returnedInfo);
-            }
-        } catch (Exception e) {
-            log.debug("Failed to retrieve Artifactory versioning from remote server {}", e.getMessage());
-            result = createServiceUnavailableVersioning();
-        } finally {
-            IOUtils.closeQuietly(client);
-            IOUtils.closeQuietly(response);
-        }
-
-        cache.put(VersionInfoServiceImpl.CACHE_KEY, result);
-        return new AsyncResult<>(result);
-    }
-
-    /**
-     * Retrieves the versioning info (either cached, or remote if needed)
-     *
-     * @param headersMap A map of the needed headers
-     * @return ArtifactoryVersioning - Latest version info
-     */
-    private ArtifactoryVersioning getVersioning(Map<String, String> headersMap) {
-        ArtifactoryVersioning versioning = getVersioningFromCache();
-        if (versioning == null) {
-            // get the version asynchronously from the remote server
-            getTransactionalMe().getRemoteVersioningAsync(headersMap);
-            // return service unavailable
-            versioning = createServiceUnavailableVersioning();
-        }
-        return versioning;
-    }
-
-    private ArtifactoryVersioning getVersioningFromCache() {
-        return cache.get(CACHE_KEY);
-    }
-
-    private CloseableHttpClient createHttpClient() {
-        ProxyDescriptor proxy = InternalContextHelper.get().getCentralConfig().getDescriptor().getDefaultProxy();
-        return new HttpClientConfigurator()
-                .soTimeout(15000)
-                .connectionTimeout(1500)
-                .retry(0, false)
-                .proxy(proxy)
-                .getClient();
-    }
-
-    private void setHeader(HttpGet getMethod, Map<String, String> headersMap, String headerKey) {
-        String headerVal = headersMap.get(headerKey.toUpperCase());
-        if ("Referer".equalsIgnoreCase(headerKey)) {
-            headerVal = HttpUtils.adjustRefererValue(headersMap, headerVal);
-        }
-        if (headerVal != null) {
-            getMethod.setHeader(headerKey, headerVal);
-        }
-    }
-
-    private ArtifactoryVersioning createServiceUnavailableVersioning() {
-        return new ArtifactoryVersioning(VersionHolder.VERSION_UNAVAILABLE, VersionHolder.VERSION_UNAVAILABLE);
-    }
-
-    private VersionInfoService getTransactionalMe() {
-        return ContextHelper.get().beanForType(VersionInfoService.class);
-    }
-}
diff --git a/backend/core/src/main/java/org/artifactory/version/VersionParser.java b/backend/core/src/main/java/org/artifactory/version/VersionParser.java
deleted file mode 100644
index c725256..0000000
--- a/backend/core/src/main/java/org/artifactory/version/VersionParser.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version;
-
-import org.artifactory.api.version.ArtifactoryVersioning;
-import org.artifactory.api.version.VersionHolder;
-import org.artifactory.util.XmlUtils;
-import org.jdom2.Document;
-import org.jdom2.Element;
-
-import java.util.List;
-
-/**
- * A tool to parse versioning info XML into an ArtifactoryVersioning
- *
- * @author Noam Tenne
- */
-public abstract class VersionParser {
-    private VersionParser() {
-        // utility class
-    }
-
-    /**
-     * Parses the received input string info an ArtifactoryVersioning object
-     *
-     * @param input String containing the XML of the versioning info file
-     * @return ArtifactoryVersioning - Object representation of the versioning info xml
-     */
-    public static ArtifactoryVersioning parse(String input) {
-        Document doc = XmlUtils.parse(input);
-        Element root = doc.getRootElement();
-        Element version = root.getChild("versioning");
-        if (version == null) {
-            throw new RuntimeException("No version is defined");
-        }
-
-        VersionHolder latest = null;
-        VersionHolder release = null;
-        List children = version.getChildren();
-        for (Object child : children) {
-            Element holder = (Element) child;
-            String versionNumber = holder.getChildText("version");
-            String revisionNumber = holder.getChildText("revision");
-            String wikiUrl = holder.getChildText("wikiUrl");
-            String downloadUrl = holder.getChildText("downloadUrl");
-            if ("latest".equals(holder.getName())) {
-                latest = new VersionHolder(versionNumber, revisionNumber, wikiUrl, downloadUrl);
-            } else if ("release".equals(holder.getName())) {
-                release = new VersionHolder(versionNumber, revisionNumber, wikiUrl, downloadUrl);
-            }
-        }
-
-        if ((latest == null) || (release == null)) {
-            throw new IllegalArgumentException("Latest and stable version and revisions are not defined properly");
-        }
-
-        return new ArtifactoryVersioning(latest, release);
-    }
-}
diff --git a/backend/core/src/main/resources/META-INF/ehcache/ehcache.xml b/backend/core/src/main/resources/META-INF/ehcache/ehcache.xml
deleted file mode 100644
index da09c6a..0000000
--- a/backend/core/src/main/resources/META-INF/ehcache/ehcache.xml
+++ /dev/null
@@ -1,288 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<ehcache>
-    <!--
-    DiskStore configuration
-
-    Sets the path to the directory where cache files are created.
-
-    If the path is a Java System Property it is replaced by its value in the
-    running VM.
-
-    The following properties are translated:
-    * user.home - User's home directory
-    * user.dir - User's current working directory
-    * java.io.tmpdir - Default temp file path
-
-    Subdirectories can be specified below the property e.g. java.io.tmpdir/one
-    -->
-    <diskStore path="java.io.tmpdir"/>
-
-    <!--
-    Specifies a CacheManagerEventListenerFactory, be used to create a CacheManagerPeerProvider,
-    which is notified when Caches are added or removed from the CacheManager.
-
-    The attributes of CacheManagerEventListenerFactory are:
-    * class - a fully qualified factory class name
-    * properties - comma separated properties having meaning only to the factory.
-
-    Sets the fully qualified class name to be registered as the CacheManager event listener.
-
-    The events include:
-    * adding a Cache
-    * removing a Cache
-
-    Callbacks to listener methods are synchronous and unsynchronized. It is the responsibility
-    of the implementer to safely handle the potential performance and thread safety issues
-    depending on what their listener is doing.
-
-    If no class is specified, no listener is created. There is no default.
-
-    <cacheManagerEventListenerFactory class="" properties=""/>
-    -->
-
-    <!--
-    (Enable for distributed operation)
-
-    Specifies a CacheManagerPeerProviderFactory which will be used to create a
-    CacheManagerPeerProvider, which discovers other CacheManagers in the cluster.
-
-    The attributes of cacheManagerPeerProviderFactory are:
-    * class - a fully qualified factory class name
-    * properties - comma separated properties having meaning only to the factory.
-
-    Ehcache comes with a built-in RMI-based distribution system with two means of discovery of
-    CacheManager peers participating in the cluster:
-    * automatic, using a multicast group. This one automatically discovers peers and detects
-      changes such as peers entering and leaving the group
-    * manual, using manual rmiURL configuration. A hardcoded list of peers is provided at
-      configuration time.
-
-    Configuring Automatic Discovery:
-    Automatic discovery is configured as per the following example:
-    <cacheManagerPeerProviderFactory
-                        class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
-                        properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1,
-                                    multicastGroupPort=4446, timeToLive=32"/>
-
-    Valid properties are:
-    * peerDiscovery (mandatory) - specify "automatic"
-    * multicastGroupAddress (mandatory) - specify a valid multicast group address
-    * multicastGroupPort (mandatory) - specify a dedicated port for the multicast heartbeat
-      traffic
-    * timeToLive - specify a value between 0 and 255 which determines how far the packets will propagate.
-      By convention, the restrictions are:
-      0   - the same host
-      1   - the same subnet
-      32  - the same site
-      64  - the same region
-      128 - the same continent
-      255 - unrestricted
-
-
-    Configuring Manual Discovery:
-    Manual discovery is configured as per the following example:
-    <cacheManagerPeerProviderFactory class=
-                          "net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
-                          properties="peerDiscovery=manual,
-                          rmiUrls=//server1:40000/sampleCache1|//server2:40000/sampleCache1
-                          | //server1:40000/sampleCache2|//server2:40000/sampleCache2"/>
-
-    Valid properties are:
-    * peerDiscovery (mandatory) - specify "manual"
-    * rmiUrls (mandatory) - specify a pipe separated list of rmiUrls, in the form
-                            //hostname:port
-
-    The hostname is the hostname of the remote CacheManager peer. The port is the listening
-    port of the RMICacheManagerPeerListener of the remote CacheManager peer.
-
-    <cacheManagerPeerProviderFactory
-            class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
-            properties="peerDiscovery=automatic,
-                        multicastGroupAddress=230.0.0.1,
-                        multicastGroupPort=4446, timeToLive=1"/>
-    -->
-
-    <!--
-    (Enable for distributed operation)
-
-    Specifies a CacheManagerPeerListenerFactory which will be used to create a
-    CacheManagerPeerListener, which
-    listens for messages from cache replicators participating in the cluster.
-
-    The attributes of cacheManagerPeerListenerFactory are:
-    class - a fully qualified factory class name
-    properties - comma separated properties having meaning only to the factory.
-
-    Ehcache comes with a built-in RMI-based distribution system. The listener component is
-    RMICacheManagerPeerListener which is configured using
-    RMICacheManagerPeerListenerFactory. It is configured as per the following example:
-
-    <cacheManagerPeerListenerFactory
-        class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
-        properties="hostName=fully_qualified_hostname_or_ip,
-                    port=40001,
-                    socketTimeoutMillis=120000"/>
-
-    All properties are optional. They are:
-    * hostName - the hostName of the host the listener is running on. Specify
-      where the host is multihomed and you want to control the interface over which cluster
-      messages are received. Defaults to the host name of the default interface if not
-      specified.
-    * port - the port the listener listens on. This defaults to a free port if not specified.
-    * socketTimeoutMillis - the number of ms client sockets will stay open when sending
-      messages to the listener. This should be long enough for the slowest message.
-      If not specified it defaults 120000ms.
-
-    <cacheManagerPeerListenerFactory
-            class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"/>
-    -->
-
-
-    <!-- Cache configuration.
-
-    The following attributes are required.
-
-    name:
-    Sets the name of the cache. This is used to identify the cache. It must be unique.
-
-    maxElementsInMemory:
-    Sets the maximum number of objects that will be created in memory
-
-	maxElementsOnDisk:
-    Sets the maximum number of objects that will be maintained in the DiskStore
-	The default value is zero, meaning unlimited.
-
-    eternal:
-    Sets whether elements are eternal. If eternal,  timeouts are ignored and the
-    element is never expired.
-
-    overflowToDisk:
-    Sets whether elements can overflow to disk when the in-memory cache
-    has reached the maxInMemory limit.
-
-    The following attributes are optional.
-
-    timeToIdleSeconds:
-    Sets the time to idle for an element before it expires.
-    i.e. The maximum amount of time between accesses before an element expires
-    Is only used if the element is not eternal.
-    Optional attribute. A value of 0 means that an Element can idle for infinity.
-    The default value is 0.
-
-    timeToLiveSeconds:
-    Sets the time to live for an element before it expires.
-    i.e. The maximum time between creation time and when an element expires.
-    Is only used if the element is not eternal.
-    Optional attribute. A value of 0 means that and Element can live for infinity.
-    The default value is 0.
-
-    diskPersistent:
-    Whether the disk store persists between restarts of the Virtual Machine.
-    The default value is false.
-
-    diskExpiryThreadIntervalSeconds:
-    The number of seconds between runs of the disk expiry thread. The default value
-    is 120 seconds.
-
-    memoryStoreEvictionPolicy:
-    Policy would be enforced upon reaching the maxElementsInMemory limit. Default
-    policy is Least Recently Used (specified as LRU). Other policies available -
-    First In First Out (specified as FIFO) and Less Frequently Used
-    (specified as LFU)
-
-    Cache elements can also contain sub elements which take the same format of a factory class
-    and properties. Defined sub-elements are:
-
-    * cacheEventListenerFactory - Enables registration of listeners for cache events, such as
-      put, remove, update, and expire.
-
-    * bootstrapCacheLoaderFactory - Specifies a BootstrapCacheLoader, which is called by a
-      cache on initialisation to prepopulate itself.
-
-    Each cache that will be distributed needs to set a cache event listener which replicates
-    messages to the other CacheManager peers. For the built-in RMI implementation this is done
-    by adding a cacheEventListenerFactory element of type RMICacheReplicatorFactory to each
-    distributed cache's configuration as per the following example:
-
-    <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
-         properties="replicateAsynchronously=true,
-         replicatePuts=true,
-         replicateUpdates=true,
-         replicateUpdatesViaCopy=true,
-         replicateRemovals=true "/>
-
-    The RMICacheReplicatorFactory recognises the following properties:
-
-    * replicatePuts=true|false - whether new elements placed in a cache are
-      replicated to others. Defaults to true.
-
-    * replicateUpdates=true|false - whether new elements which override an
-      element already existing with the same key are replicated. Defaults to true.
-
-    * replicateRemovals=true - whether element removals are replicated. Defaults to true.
-
-    * replicateAsynchronously=true | false - whether replications are
-      asynchronous (true) or synchronous (false). Defaults to true.
-
-    * replicateUpdatesViaCopy=true | false - whether the new elements are
-      copied to other caches (true), or whether a remove message is sent. Defaults to true.
-
-
-    * asynchronousReplicationIntervalMillis=<number of milliseconds> - The asynchronous
-      replicator runs at a set interval of milliseconds. The default is 1000. The minimum
-      is 10. This property is only applicable if replicateAsynchronously=true
-
-
-    The RMIBootstrapCacheLoader bootstraps caches in clusters where RMICacheReplicators are
-    used. It is configured as per the following example:
-
-    <bootstrapCacheLoaderFactory
-        class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"
-        properties="bootstrapAsynchronously=true, maximumChunkSizeBytes=5000000"/>
-
-    The RMIBootstrapCacheLoaderFactory recognises the following optional properties:
-
-    * bootstrapAsynchronously=true|false - whether the bootstrap happens in the background
-      after the cache has started. If false, bootstrapping must complete before the cache is
-      made available. The default value is true.
-
-    * maximumChunkSizeBytes=<integer> - Caches can potentially be very large, larger than the
-      memory limits of the VM. This property allows the bootstraper to fetched elements in
-      chunks. The default chunk size is 5000000 (5MB).
-
-    -->
-
-
-    <!--
-    Mandatory Default Cache configuration. These settings will be applied to caches
-    created programmtically using CacheManager.add(String cacheName)
-    -->
-    <defaultCache
-            maxElementsInMemory="1000"
-            eternal="false"
-            timeToIdleSeconds="300"
-            timeToLiveSeconds="300"
-            overflowToDisk="false"
-            maxElementsOnDisk="10000000"
-            diskPersistent="false"
-            diskExpiryThreadIntervalSeconds="120"
-            memoryStoreEvictionPolicy="LRU"
-            />
-</ehcache>
diff --git a/backend/core/src/main/resources/META-INF/spring/addons.xml b/backend/core/src/main/resources/META-INF/spring/addons.xml
deleted file mode 100644
index 0c04c9a..0000000
--- a/backend/core/src/main/resources/META-INF/spring/addons.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xsi:schemaLocation="
-       http://www.springframework.org/schema/beans
-       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
-</beans>
\ No newline at end of file
diff --git a/backend/core/src/main/resources/META-INF/spring/applicationContext.xml b/backend/core/src/main/resources/META-INF/spring/applicationContext.xml
deleted file mode 100644
index 94067ba..0000000
--- a/backend/core/src/main/resources/META-INF/spring/applicationContext.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xmlns:context="http://www.springframework.org/schema/context"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans
-            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
-            http://www.springframework.org/schema/context
-            http://www.springframework.org/schema/context/spring-context-3.0.xsd">
-
-    <!-- Enable configuration by annotations -->
-    <context:annotation-config/>
-    <context:component-scan base-package="org.artifactory">
-        <context:include-filter type="annotation" expression="org.artifactory.spring.Reloadable"/>
-        <context:exclude-filter type="regex" expression="org.artifactory.test.*"/>
-        <context:exclude-filter type="regex" expression="org.artifactory.storage.db.itest.*"/>
-    </context:component-scan>
-
-    <!-- enable the configuration of transactional behavior based on annotations -->
-    <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
-
-    <bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
-        <property name="transactionInterceptor" ref="txInterceptor"/>
-    </bean>
-
-    <bean id="txInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
-        <property name="transactionManager" ref="artifactoryTransactionManager"/>
-        <property name="transactionAttributeSource">
-            <bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource">
-            </bean>
-        </property>
-    </bean>
-
-    <bean class="org.artifactory.schedule.aop.AsyncAdvisor"/>
-    <bean class="org.artifactory.storage.fs.lock.aop.LockingAdvisor"/>
-    <bean class="org.artifactory.request.aop.RequestAdvisor"/>
-
-    <bean id="alwaysOnTxInterceptor"
-          class="org.springframework.transaction.interceptor.TransactionInterceptor" lazy-init="true">
-        <property name="transactionManager" ref="artifactoryTransactionManager"/>
-        <property name="transactionAttributeSource">
-            <bean class="org.springframework.transaction.interceptor.MatchAlwaysTransactionAttributeSource"/>
-        </property>
-    </bean>
-</beans>
\ No newline at end of file
diff --git a/backend/core/src/main/resources/META-INF/spring/interceptors.xml b/backend/core/src/main/resources/META-INF/spring/interceptors.xml
deleted file mode 100644
index 0c1994f..0000000
--- a/backend/core/src/main/resources/META-INF/spring/interceptors.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xsi:schemaLocation="
-       http://www.springframework.org/schema/beans
-       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
-
-    <!-- Default storage interceptors list -->
-    <bean class="org.artifactory.repo.interceptor.TrashInterceptor"/>
-    <bean class="org.artifactory.repo.interceptor.PluginsInterceptor"/>
-    <bean class="org.artifactory.repo.interceptor.IntegrationCleanerInterceptor"/>
-    <bean class="org.artifactory.repo.interceptor.MavenPomInterceptor"/>
-    <bean class="org.artifactory.repo.interceptor.MavenMetadataCalculationInterceptor"/>
-    <bean class="org.artifactory.repo.interceptor.ArchiveIndexingInterceptor"/>
-    <bean class="org.artifactory.repo.interceptor.AddPropertyAfterMoveOrCopyInterceptor"/>
-    <bean class="org.artifactory.repo.interceptor.NuGetCalculationInterceptor"/>
-    <bean class="org.artifactory.repo.interceptor.NpmMetadataInterceptor"/>
-</beans>
\ No newline at end of file
diff --git a/backend/core/src/main/resources/META-INF/spring/restContext.xml b/backend/core/src/main/resources/META-INF/spring/restContext.xml
deleted file mode 100644
index 9754a5d..0000000
--- a/backend/core/src/main/resources/META-INF/spring/restContext.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2015 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xmlns="http://www.springframework.org/schema/beans"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans
-            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
-    <bean id="securityFactory" class="org.artifactory.ui.rest.service.admin.security.SecurityServiceFactory"/>
-    <bean id="adminConfigFactory" class="org.artifactory.ui.rest.service.admin.configuration.ConfigServiceFactory"/>
-    <bean id="servicesFactory" class="org.artifactory.ui.rest.service.admin.services.ServicesServiceFactory"/>
-    <bean id="browseFactory" class="org.artifactory.ui.rest.service.artifacts.browse.BrowseServiceFactory"/>
-    <bean id="advanceFactory" class="org.artifactory.ui.rest.service.admin.advanced.AdvancedServiceFactory"/>
-    <bean id="utilsFactory" class="org.artifactory.ui.rest.service.utils.UtilsServiceFactory"/>
-    <bean id="searchFactory" class="org.artifactory.ui.rest.service.artifacts.search.SearchServiceFactory"/>
-    <bean id="deployFactory" class="org.artifactory.ui.rest.service.artifacts.deploy.DeployServiceFactory"/>
-    <bean id="importExportFactory" class="org.artifactory.ui.rest.service.admin.importexport.ImportExportServiceFactory"/>
-    <bean id="configFactory"  class="org.artifactory.rest.services.ConfigServiceFactory"/>
-    <bean id="repoServiceFactory"  class="org.artifactory.rest.services.RepoServiceFactory"/>
-    <bean id="generalFactory" class="org.artifactory.ui.rest.service.general.GeneralServiceFactory"/>
-    <bean id="buildsFactory" class="org.artifactory.ui.rest.service.builds.BuildsServiceFactory"/>
-    <bean class="org.artifactory.ui.rest.service.utils.validation.ValidationsServiceFactory"/>
-</beans>
\ No newline at end of file
diff --git a/backend/core/src/main/resources/META-INF/spring/scheduling.xml b/backend/core/src/main/resources/META-INF/spring/scheduling.xml
deleted file mode 100644
index 8e4943a..0000000
--- a/backend/core/src/main/resources/META-INF/spring/scheduling.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
-
-    <bean id="scheduler" class="org.artifactory.schedule.ArtifactorySchedulerFactoryBean">
-        <property name="quartzProperties">
-            <props>
-                <prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop>
-            </props>
-        </property>
-        <property name="taskExecutor" ref="taskExecutor"/>
-    </bean>
-
-    <bean id="taskExecutor" class="org.artifactory.schedule.CachedThreadPoolTaskExecutor"/>
-</beans>
\ No newline at end of file
diff --git a/backend/core/src/main/resources/META-INF/spring/security.xml b/backend/core/src/main/resources/META-INF/spring/security.xml
deleted file mode 100644
index 32047e8..0000000
--- a/backend/core/src/main/resources/META-INF/spring/security.xml
+++ /dev/null
@@ -1,109 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xmlns="http://www.springframework.org/schema/beans"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans
-          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
-
-    <!-- password decrypting authentication manager for passwords decryption if feature is active -->
-    <bean id="passwordDecryptingManager" class="org.artifactory.security.PasswordDecryptingManager">
-        <property name="delegate" ref="authenticationManager"/>
-        <property name="delegateProps" ref="propsAuthenticationProvider"/>
-    </bean>
-
-    <!-- register artifactory authentication filters -->
-    <bean class="org.artifactory.webapp.servlet.authentication.MissionControlAuthenticationFilter"/>
-    <bean class="org.artifactory.webapp.servlet.authentication.ArtifactoryBasicAuthenticationFilter"/>
-    <bean class="org.artifactory.webapp.servlet.authentication.ArtifactoryRememberMeFilter"/>
-
-    <!-- register artifactory authentication interceptors -->
-    <bean class="org.artifactory.webapp.servlet.authentication.interceptor.anonymous.AnonymousLoginInterceptor"/>
-    <bean class="org.artifactory.webapp.servlet.authentication.interceptor.anonymous.AnonymousPingInterceptor"/>
-
-    <!-- create the spring basic authentication filter (will be used as a delegate) -->
-    <bean id="basicAuthenticationFilter"
-          class="org.springframework.security.web.authentication.www.BasicAuthenticationFilter">
-        <constructor-arg ref="passwordDecryptingManager"/>
-        <constructor-arg ref="basicAuthenticationEntryPoint"/>
-        <property name="authenticationDetailsSource">
-            <bean class="org.artifactory.security.HttpAuthenticationDetailsSource"/>
-        </property>
-    </bean>
-
-    <!-- props auth security related (filter and authentication)  -->
-    <bean id="propsAuthenticationFilter"
-          class="org.artifactory.webapp.servlet.authentication.PropsAuthenticationFilter">
-        <constructor-arg ref="passwordDecryptingManager"/>
-        <constructor-arg ref="basicAuthenticationEntryPoint"/>
-    </bean>
-
-    <bean id="propsAuthenticationProvider"
-          class="org.artifactory.security.db.apikey.PropsAuthenticationProvider"></bean>
-
-    <bean id="basicAuthenticationEntryPoint"
-          class="org.artifactory.webapp.servlet.authentication.ArtifactoryBasicAuthenticationEntryPoint">
-    </bean>
-
-    <!-- create authentication providers -->
-    <bean class="org.artifactory.security.mission.control.MissionControlAuthenticationProviderImpl"/>
-    <bean id="ldapAuthenticationProvider" class="org.artifactory.security.ldap.ArtifactoryLdapAuthenticationProvider"/>
-    <bean id="crowdAuthenticationProviderAdapter"
-          class="org.artifactory.security.crowd.CrowdAuthenticationProviderAdapter"/>
-
-    <bean id="dbAuthenticationProvider" class="org.artifactory.security.db.DbAuthenticationProvider">
-        <property name="userDetailsService" ref="dbUserDetailsService"/>
-        <property name="saltSource" ref="dbUserDetailsService"/>
-        <property name="passwordEncoder" ref="passwordEncoder"/>
-    </bean>
-
-    <!-- authentication providers order is important. keep internal provider after ldap and sso -->
-    <bean id="authenticationManager" class="org.artifactory.security.RealmAwareAuthenticationManager">
-        <property name="eraseCredentialsAfterAuthentication" value="false"/>
-        <constructor-arg>
-            <list>
-                <ref bean="ldapAuthenticationProvider"/>
-                <ref bean="crowdAuthenticationProviderAdapter"/>
-                <ref bean="dbAuthenticationProvider"/>
-                <ref bean="rememberMeAuthenticationProvider"/>
-            </list>
-        </constructor-arg>
-    </bean>
-
-    <bean id="passwordEncoder"
-          class="org.springframework.security.authentication.encoding.Md5PasswordEncoder"/>
-
-    <bean id="rememberMeProcessingFilter"
-          class="org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter">
-        <constructor-arg ref="rememberMeServices"/>
-        <constructor-arg ref="authenticationManager"/>
-    </bean>
-
-    <bean id="rememberMeServices"
-          class="org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices">
-        <constructor-arg value="artifactory"/>
-        <constructor-arg ref="dbUserDetailsService"/>
-        <property name="tokenValiditySeconds" value="604800"/>
-    </bean>
-
-    <bean id="rememberMeAuthenticationProvider"
-          class="org.springframework.security.authentication.RememberMeAuthenticationProvider">
-        <constructor-arg value="artifactory"/>
-    </bean>
-</beans>
\ No newline at end of file
diff --git a/backend/core/src/main/resources/org/artifactory/email/messages/backupError.properties b/backend/core/src/main/resources/org/artifactory/email/messages/backupError.properties
deleted file mode 100644
index f2354a0..0000000
--- a/backend/core/src/main/resources/org/artifactory/email/messages/backupError.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-body=\
-  <html>\
-    <body>\
-        <p>Artifactory's system backup '{0}' was completed with some errors. Please see the server log for detailed information.<br>\
-        {1}</p>\
-        <p>The following errors have occurred:</p>\
-        <br>\
-        {2}\
-    </body>\
-  </html>
\ No newline at end of file
diff --git a/backend/core/src/main/resources/org/artifactory/email/messages/bintrayPushBuild.properties b/backend/core/src/main/resources/org/artifactory/email/messages/bintrayPushBuild.properties
deleted file mode 100644
index 516d7e3..0000000
--- a/backend/core/src/main/resources/org/artifactory/email/messages/bintrayPushBuild.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-body=\
-  <html>\
-    <body>\
-        <p>You have recently issued a build push from Artifactory to Bintray.<br>\
-        Here is a log summary of this push operation:</p>\
-        <pre>{0}</pre>\
-    </body>\
-  </html>
\ No newline at end of file
diff --git a/backend/core/src/main/resources/org/artifactory/email/messages/resetPassword.properties b/backend/core/src/main/resources/org/artifactory/email/messages/resetPassword.properties
deleted file mode 100644
index 0163eb6..0000000
--- a/backend/core/src/main/resources/org/artifactory/email/messages/resetPassword.properties
+++ /dev/null
@@ -1,32 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-body=\
-  <html>\
-    <body>\
-        Dear {0},\
-        <br>\
-        <p>Password reset request was issued for your Artifactory account: {0}.<br>\
-        The request was made from the following IP address: {1}.</p>\
-        <p>Reset your password by following this link:\
-        <br>\
-         <a href="{2}" target="_blank">{2}</a></p>\
-        <br>\
-        If you believe this message was wrongly sent to you please disregard it.\
-    </body>\
-  </html>
\ No newline at end of file
diff --git a/backend/core/src/main/resources/plugin-template.grv b/backend/core/src/main/resources/plugin-template.grv
deleted file mode 100644
index 6fc6507..0000000
--- a/backend/core/src/main/resources/plugin-template.grv
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see http://www.gnu.org/licenses/.
- */
-
-/**
- * Globally bound variables:
- *
- * log (org.slf4j.Logger)
- * repositories (org.artifactory.repo.Repositories)
- * security (org.artifactory.security.Security)
- * searches (org.artifactory.search.Searches) [since: 2.3.4]
- *
- * context (org.artifactory.spring.InternalArtifactoryContext) - NOT A PUBLIC API - FOR INTERNAL USE ONLY!
- *
- * @author Yoav Landman
- */
-
-/**
- * A section for handling and manipulating download events.
- */
-download {
-
-    /**
-     * Provide an alternative response, by one of the following methods:
-     * (1) Setting a success/error status code value and an optional error message.
-     * (2) Provide an alternative download content, by setting new values for the inputStream and size context variables.
-     *
-     * Note that, unless specifically handled, checksum requests for altered responses will return the checksum of the
-     * original resource, which may not match the checksum of the alternate response.
-     *
-     * Will not be called if the response is already committed (e.g. a previous error occurred).
-     * Currently called only for GET requests where the resource was found.
-     *
-     * Context variables:
-     * status (int) - a response status code. Defaults to -1 (unset).
-     * message (java.lang.String) - a text message to return in the response body, replacing the response content.
-     *                              Defaults to null.
-     * inputStream (java.io.InputStream) - a new stream that provides the response content. Defaults to null.
-     * size (long) - the size of the new content (helpful for clients processing the response). Defaults to -1.
-     *
-     *
-     * Closure parameters:
-     * request (org.artifactory.request.Request) - a read-only parameter of the request.
-     * responseRepoPath (org.artifactory.repo.RepoPath) - a read-only parameter of the response RepoPath (containing the
-     *                                                    physical repository the resource was found in).
-     */
-    altResponse { request, responseRepoPath ->
-    }
-
-    /**
-     * Provides an alternative download path under the same remote repository, by setting a new value to the path
-     * variable.
-     *
-     * Context variables:
-     * path (java.lang.String) - the new path value. Defaults to the originalRepoPath's path.
-     *
-     * Closure parameters:
-     * repoPath (org.artifactory.repo.RepoPath) - a read-only parameter of the original request RepoPath.
-     */
-    altRemotePath { repoPath ->
-    }
-
-    /**
-     * Provide an alternative download content, by setting new values for the inputStream and size context variables.
-     *
-     * Context variables:
-     * inputStream (java.io.InputStream) - a new stream that provides the response content. Defaults to null.
-     * size (long) - the size of the new content (helpful for clients processing the response). Defaults to -1.
-     *
-     * Closure parameters:
-     * repoPath (org.artifactory.repo.RepoPath) - a read-only parameter of the original request RepoPath.
-     */
-    altRemoteContent { repoPath ->
-    }
-
-    /**
-     * Handle before remote download events.
-     *
-     * Closure parameters:
-     * request (org.artifactory.request.Request) - a read-only parameter of the request. [since: 2.3.4]
-     * repoPath (org.artifactory.repo.RepoPath) - a read-only parameter of the original request RepoPath.
-     */
-    beforeRemoteDownload { request, repoPath ->
-    }
-
-    /**
-     * Handle after remote download events.
-     *
-     * Closure parameters:
-     * request (org.artifactory.request.Request) - a read-only parameter of the request. [since: 2.3.4]
-     * repoPath (org.artifactory.repo.RepoPath) - a read-only parameter of the original request RepoPath.
-     */
-    afterRemoteDownload { request, repoPath ->
-    }
-
-    /**
-     * Handle before local download events.
-     *
-     * Closure parameters:
-     * request (org.artifactory.request.Request) - a read-only parameter of the request.
-     * responseRepoPath (org.artifactory.repo.RepoPath) - a read-only parameter of the response RepoPath (containing the
-     *                                                    physical repository the resource was found in).
-     */
-    beforeDownload { request, responseRepoPath ->
-    }
-}
-
-/**
- * A section for handling and manipulating storage events.
- *
- * If you wish to abort an action you can do that in 'before' methods by throwing a runtime
- * org.artifactory.exception.CancelException with an error message and a proper http error code.
- */
-storage {
-
-    /**
-     * Handle before create events.
-     *
-     * Closure parameters:
-     * item (org.artifactory.fs.ItemInfo) - the original item being created.
-     */
-    beforeCreate { item ->
-    }
-
-    /**
-     * Handle after create events.
-     *
-     * Closure parameters:
-     * item (org.artifactory.fs.ItemInfo) - the original item being created.
-     */
-    afterCreate { item ->
-    }
-
-    /**
-     * Handle before create events.
-     *
-     * Closure parameters:
-     * item (org.artifactory.fs.ItemInfo) - the original item being being deleted.
-     */
-    beforeDelete { item ->
-    }
-
-    /**
-     * Handle after create events.
-     *
-     * Closure parameters:
-     * item (org.artifactory.fs.ItemInfo) - the original item deleted.
-     */
-    afterDelete { item ->
-    }
-
-    /**
-     * Handle before move events.
-     *
-     * Closure parameters:
-
-     * item (org.artifactory.fs.ItemInfo) - the source item being moved.
-     * targetRepoPath (org.artifactory.repo.RepoPath) - the target repoPath for the move.
-     * properties (org.artifactory.md.Properties) - user specified properties to add to the item being moved.
-     */
-    beforeMove { item, targetRepoPath, properties ->
-    }
-
-    /**
-     * Handle after move events.
-     *
-     * Closure parameters:
-     * item (org.artifactory.fs.ItemInfo) - the source item moved.
-     * targetRepoPath (org.artifactory.repo.RepoPath) - the target repoPath for the move.
-     * properties (org.artifactory.md.Properties) - user specified properties to add to the item being moved.
-     */
-    afterMove { item, targetRepoPath, properties ->
-    }
-
-    /**
-     * Handle before copy events.
-     *
-     * Closure parameters:
-     * item (org.artifactory.fs.ItemInfo) - the source item being copied.
-     * targetRepoPath (org.artifactory.repo.RepoPath) - the target repoPath for the copy.
-     * properties (org.artifactory.md.Properties) - user specified properties to add to the item being moved.
-     */
-    beforeCopy { item, targetRepoPath, properties ->
-    }
-
-    /**
-     * Handle after copy events.
-     *
-     * Closure parameters:
-     * item (org.artifactory.fs.ItemInfo) - the source item copied.
-     * targetRepoPath (org.artifactory.repo.RepoPath) - the target repoPath for the copy.
-     * properties (org.artifactory.md.Properties) - user specified properties to add to the item being moved.
-     */
-    afterCopy { item, targetRepoPath, properties ->
-    }
-}
-
-/**
- * A section for defining jobs.
- */
-jobs {
-
-    /**
-     * A job definition.
-     * The first value is a unique name for the job.
-     * Job runs are controlled by the provided interval or cron expression, which are mutually exclusive.
-     * The actual code to run as part of the job should be part of the job's closure.
-     *
-     * Parameters:
-     * delay (long) - An initial delay in milliseconds before the job starts running (not applicable for a cron job).
-     * interval (long) -  An interval in milliseconds between job runs.
-     * cron (java.lang.String) - A valid cron expression used to schedule job runs (see: http://www.quartz-scheduler.org/docs/tutorial/TutorialLesson06.html)
-     */
-
-    myJob(interval: 1000, delay: 100) {
-    }
-
-    mySecondJob(cron: "0/1 * * * * ?") {
-    }
-}
-
-/**
- * A section for defining external executions.
- * External executions are invoked via REST POST requests. For example:
- * curl -X POST -v -u admin:password "http://localhost:8080/artifactory/api/plugins/execute/multiply?params=msg=And+the+result+is:|no1=10|no2=15&async=0"
- *
- * Since:  2.3.1
- */
-executions {
-
-    /**
-     * An execution definition.
-     * The first value is a unique name for the execution.
-     *
-     * Context variables:
-     * status (int) - a response status code. Defaults to -1 (unset). Not applicable for an async execution.
-     * message (java.lang.String) - a text message to return in the response body, replacing the response content.
-     *                              Defaults to null. Not applicable for an async execution.
-     *
-     * Closure parameters:
-     * params (java.util.Map) - An execution takes a read-only key-value map that corresponds to the REST request
-     * parameter 'params'. Each entry in the map conatains an array of values.
-     */
-
-    myExecution() { params ->
-    }
-}
-
-/**
- * A section for management of security realms.
- * Realms defined here are added before any built-in realms (Artifactory internal realm, LDAP, Crowd etc.).
- * User authentication will be attempted against these realms first, by the order they are defined.
- */
-realms {
-
-    /**
-     * An security realm definition.
-     * The first value is a unique name for the realm.
-     *
-     * Parameters:
-     * autoCreateUsers (boolean) - Whether to automatically create users in Artifactory upon successul login. Defaults to
-     * true. When false, the user will be transient and his privileges will be managed according to permissions defined
-     * for auto-join groups.
-     */
-
-    myRealm(autoCreateUsers: true) {
-        /*
-        * Implementation should return true/false as the reult of the authentication.
-        * Closure parameters:
-        * username (java.lang.String) - The username
-        * credentials (java.lang.String) - The password
-        */
-        authenticate { username, credentials ->
-        }
-
-        /*
-        * Implementation should return true if the user is found in the realm.
-        * Closure parameters:
-        * username (java.lang.String) - The username
-        */
-        userExists { username ->
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/backend/core/src/test/java/org/artifactory/addon/replication/RemoteReplicationSettingsBuilderTest.java b/backend/core/src/test/java/org/artifactory/addon/replication/RemoteReplicationSettingsBuilderTest.java
deleted file mode 100644
index 44f67d1..0000000
--- a/backend/core/src/test/java/org/artifactory/addon/replication/RemoteReplicationSettingsBuilderTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.replication;
-
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.testng.annotations.Test;
-
-import java.io.StringWriter;
-
-import static org.testng.Assert.*;
-
-/**
- * @author Noam Y. Tenne
- */
- at Test
-public class RemoteReplicationSettingsBuilderTest {
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testNoRepoPath() throws Exception {
-        new RemoteReplicationSettingsBuilder(null).build();
-    }
-
-    @Test
-    public void testDefaultValues() throws Exception {
-        RepoPath repoPath = InternalRepoPathFactory.create("moo", "mieow");
-        StringWriter stringWriter = new StringWriter();
-        RemoteReplicationSettings settings = new RemoteReplicationSettingsBuilder(repoPath).responseWriter(stringWriter)
-                .build();
-
-        assertEquals(settings.getRepoPath(), repoPath, "Unexpected repo path.");
-        assertFalse(settings.isProgress(), "Unexpected default progress display state.");
-        assertEquals(settings.getMark(), 0, "Unexpected default mark.");
-        assertFalse(settings.isDeleteExisting(), "Unexpected default delete existing state.");
-        assertFalse(settings.isIncludeProperties(), "Unexpected default property inclusion state.");
-        assertEquals(settings.getOverwrite(), ReplicationAddon.Overwrite.force,
-                "Unexpected default overwrite switch state.");
-        assertEquals(settings.getResponseWriter(), stringWriter, "Unexpected response writer.");
-    }
-
-    @Test
-    public void testSetters() throws Exception {
-        RepoPath repoPath = InternalRepoPathFactory.create("moo", "mieow");
-        StringWriter stringWriter = new StringWriter();
-        RemoteReplicationSettings settings = new RemoteReplicationSettingsBuilder(repoPath).progress(true).mark(15)
-                .responseWriter(stringWriter).deleteExisting(true).includeProperties(true)
-                .overwrite(ReplicationAddon.Overwrite.never).build();
-
-        assertEquals(settings.getRepoPath(), repoPath, "Unexpected repo path.");
-        assertTrue(settings.isProgress(), "Unexpected progress display state.");
-        assertEquals(settings.getMark(), 15, "Unexpected mark.");
-        assertTrue(settings.isDeleteExisting(), "Unexpected delete existing state.");
-        assertTrue(settings.isIncludeProperties(), "Unexpected property inclusion state.");
-        assertEquals(settings.getOverwrite(), ReplicationAddon.Overwrite.never,
-                "Unexpected overwrite switch state.");
-        assertEquals(settings.getResponseWriter(), stringWriter, "Unexpected response writer.");
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/addon/replication/RemoteReplicationSettingsTest.java b/backend/core/src/test/java/org/artifactory/addon/replication/RemoteReplicationSettingsTest.java
deleted file mode 100644
index da03bad..0000000
--- a/backend/core/src/test/java/org/artifactory/addon/replication/RemoteReplicationSettingsTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.replication;
-
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.testng.annotations.Test;
-
-import java.io.StringWriter;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
-
-/**
- * @author Noam Y. Tenne
- */
- at Test
-public class RemoteReplicationSettingsTest {
-
-    public void testConstructor() {
-        RepoPath repoPath = InternalRepoPathFactory.create("momo", "pop");
-        StringWriter responseWriter = new StringWriter();
-        RemoteReplicationSettings settings = new RemoteReplicationSettings(repoPath, true, 15, true,
-                true, ReplicationAddon.Overwrite.never, responseWriter, "momo.com", 100);
-
-        assertEquals(settings.getRepoPath(), repoPath, "Unexpected repo path.");
-        assertTrue(settings.isProgress(), "Unexpected progress display state.");
-        assertEquals(settings.getMark(), 15, "Unexpected mark.");
-        assertTrue(settings.isDeleteExisting(), "Unexpected delete existing state.");
-        assertTrue(settings.isIncludeProperties(), "Unexpected property inclusion state.");
-        assertEquals(settings.getOverwrite(), ReplicationAddon.Overwrite.never,
-                "Unexpected overwrite switch state.");
-        assertEquals(settings.getResponseWriter(), responseWriter, "Unexpected response writer.");
-        assertEquals(settings.getUrl(), "momo.com", "Unexpected target URL.");
-        assertEquals(settings.getSocketTimeoutMillis(), 100, "Unexpected socket timeout.");
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/api/maven/MavenArtifactInfoTest.java b/backend/core/src/test/java/org/artifactory/api/maven/MavenArtifactInfoTest.java
deleted file mode 100644
index 6d13758..0000000
--- a/backend/core/src/test/java/org/artifactory/api/maven/MavenArtifactInfoTest.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.maven;
-
-import org.artifactory.common.ConstantValues;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the MavenArtifactInfo.
- *
- * @author Yossi Shaul
- */
- at Test
-public class MavenArtifactInfoTest extends ArtifactoryHomeBoundTest {
-
-    @BeforeClass
-    protected void setUp() throws Exception {
-        System.setProperty(ConstantValues.mvnCustomTypes.getPropertyName(), "tar.gz, custom.jar, tar.bz2");
-    }
-
-    @AfterClass
-    protected void tearDown() throws Exception {
-        System.clearProperty(ConstantValues.mvnCustomTypes.getPropertyName());
-    }
-
-    public void fromSimplePath() {
-        RepoPath path = InfoFactoryHolder.get().createRepoPath("repo",
-                "/org/jfrog/artifactory-core/2.0/artifactory-core-2.0.pom");
-        MavenArtifactInfo artifactInfo = MavenArtifactInfo.fromRepoPath(path);
-        assertTrue(artifactInfo.isValid());
-        assertEquals(artifactInfo.getGroupId(), "org.jfrog");
-        assertEquals(artifactInfo.getArtifactId(), "artifactory-core");
-        assertEquals(artifactInfo.getVersion(), "2.0");
-        assertNull(artifactInfo.getClassifier());
-        assertEquals(artifactInfo.getType(), "pom");
-    }
-
-    public void fromPathWithClassifier() {
-        RepoPath path = InfoFactoryHolder.get().createRepoPath("repo",
-                "/org/jfrog/artifactory-core/2.0/artifactory-core-2.0-sources.jar");
-        MavenArtifactInfo artifactInfo = MavenArtifactInfo.fromRepoPath(path);
-        assertTrue(artifactInfo.isValid());
-        assertEquals(artifactInfo.getGroupId(), "org.jfrog");
-        assertEquals(artifactInfo.getArtifactId(), "artifactory-core");
-        assertEquals(artifactInfo.getVersion(), "2.0");
-        assertEquals(artifactInfo.getClassifier(), "sources");
-        assertEquals(artifactInfo.getType(), "jar");
-    }
-
-    public void fromPathNonUniqueSnapshotVersion() {
-        // unique snapshot version is a version that includes the timestamp-buildnumber string in the version
-        RepoPath path = InfoFactoryHolder.get().createRepoPath("repo",
-                "com/core/5.4-SNAPSHOT/core-5.4-SNAPSHOT-sources.jar");
-        MavenArtifactInfo artifactInfo = MavenArtifactInfo.fromRepoPath(path);
-        assertTrue(artifactInfo.isValid());
-        assertEquals(artifactInfo.getGroupId(), "com");
-        assertEquals(artifactInfo.getArtifactId(), "core");
-        assertEquals(artifactInfo.getVersion(), "5.4-SNAPSHOT");
-        assertEquals(artifactInfo.getClassifier(), "sources");
-        assertEquals(artifactInfo.getType(), "jar");
-    }
-
-    public void fromPathUniqueSnapshotVersion() {
-        // unique snapshot version is a version that includes the SNAPSHOT string in the version and not the
-        // timestamp-buildnumber
-        RepoPath path = InfoFactoryHolder.get().createRepoPath("repo",
-                "com/core/5.4-SNAPSHOT/core-5.4-20081214.090217-4-sources.jar");
-        MavenArtifactInfo artifactInfo = MavenArtifactInfo.fromRepoPath(path);
-        assertTrue(artifactInfo.isValid());
-        assertEquals(artifactInfo.getGroupId(), "com");
-        assertEquals(artifactInfo.getArtifactId(), "core");
-        assertEquals(artifactInfo.getVersion(), "5.4-20081214.090217-4");
-        assertEquals(artifactInfo.getClassifier(), "sources");
-        assertEquals(artifactInfo.getType(), "jar");
-    }
-
-    public void fromPathUniqueMd5SnapshotVersion() {
-        // non-unique snapshot version is a version that includes the SNAPSHOT string in the version and not the
-        // timestamp-buildnumber
-        RepoPath path = InfoFactoryHolder.get().createRepoPath("repo",
-                "com/core/5.4-SNAPSHOT/core-5.4-20081214.090217-4-sources.jar");
-        MavenArtifactInfo artifactInfo = MavenArtifactInfo.fromRepoPath(path);
-        assertTrue(artifactInfo.isValid());
-        assertEquals(artifactInfo.getGroupId(), "com");
-        assertEquals(artifactInfo.getArtifactId(), "core");
-        assertEquals(artifactInfo.getVersion(), "5.4-20081214.090217-4");
-        assertEquals(artifactInfo.getClassifier(), "sources");
-        assertEquals(artifactInfo.getType(), "jar");
-    }
-
-    public void fromPathWithOneDigitVersion() {
-        RepoPath path = new RepoPathImpl("repo", "com/google/google/1/google-1-sources.pom");
-        MavenArtifactInfo artifactInfo = MavenArtifactInfo.fromRepoPath(path);
-        assertTrue(artifactInfo.isValid());
-        assertEquals(artifactInfo.getGroupId(), "com.google");
-        assertEquals(artifactInfo.getArtifactId(), "google");
-        assertEquals(artifactInfo.getVersion(), "1");
-        assertEquals(artifactInfo.getClassifier(), "sources");
-        assertEquals(artifactInfo.getType(), "pom");
-    }
-
-    public void testConfigPath() {
-        RepoPath path = new RepoPathImpl("repo",
-                "org/hi/common.atg/1.0.0/common.atg-1.0.0-20111104.164556-1-config+config.jar");
-        MavenArtifactInfo artifactInfo = MavenArtifactInfo.fromRepoPath(path);
-        assertTrue(artifactInfo.isValid());
-        assertEquals(artifactInfo.getGroupId(), "org.hi");
-        assertEquals(artifactInfo.getArtifactId(), "common.atg");
-        assertEquals(artifactInfo.getVersion(), "1.0.0-20111104.164556-1");
-        assertEquals(artifactInfo.getClassifier(), "config+config");
-        assertEquals(artifactInfo.getType(), "jar");
-    }
-
-    public void testCustomUserType() {
-        RepoPath path = new RepoPathImpl("repo",
-                "org/hi/common.atg/1.0.0-SNAPSHOT/common.atg-1.0.0-SNAPSHOT-lib+DAS-1.0.0-SNAPSHOT-lib+commons-codec-1.3.custom.jar");
-        MavenArtifactInfo artifactInfo = MavenArtifactInfo.fromRepoPath(path);
-        assertTrue(artifactInfo.isValid());
-        assertEquals(artifactInfo.getGroupId(), "org.hi");
-        assertEquals(artifactInfo.getArtifactId(), "common.atg");
-        assertEquals(artifactInfo.getVersion(), "1.0.0-SNAPSHOT");
-        assertEquals(artifactInfo.getClassifier(), "lib+DAS-1.0.0-SNAPSHOT-lib+commons-codec-1.3");
-        assertEquals(artifactInfo.getType(), "custom.jar");
-    }
-
-    public void testClassifierWithDot() {
-        RepoPath path = new RepoPathImpl("repo", "atg/REST/10.0-SNAPSHOT/REST-10.0-SNAPSHOT-lib+org.json.jar");
-        MavenArtifactInfo artifactInfo = MavenArtifactInfo.fromRepoPath(path);
-        assertTrue(artifactInfo.isValid());
-        assertEquals(artifactInfo.getGroupId(), "atg");
-        assertEquals(artifactInfo.getArtifactId(), "REST");
-        assertEquals(artifactInfo.getVersion(), "10.0-SNAPSHOT");
-        assertEquals(artifactInfo.getClassifier(), "lib+org.json");
-        assertEquals(artifactInfo.getType(), "jar");
-    }
-
-    public void testClassifierWithDotAndNumber() {
-        RepoPath path = new RepoPathImpl("repo",
-                "org/test/common.atg/1.0.0-SNAPSHOT/common.atg-1.0.0-20111104.164556-1-lib+bcprov-jdk16-1.46.jar");
-        MavenArtifactInfo artifactInfo = MavenArtifactInfo.fromRepoPath(path);
-        assertTrue(artifactInfo.isValid());
-        assertEquals(artifactInfo.getGroupId(), "org.test");
-        assertEquals(artifactInfo.getArtifactId(), "common.atg");
-        assertEquals(artifactInfo.getVersion(), "1.0.0-20111104.164556-1");
-        assertEquals(artifactInfo.getClassifier(), "lib+bcprov-jdk16-1.46");
-        assertEquals(artifactInfo.getType(), "jar");
-    }
-
-    public void testTarGz() {
-        RepoPath path = new RepoPathImpl("repo",
-                "org/jfrog/artifactory/10.0-SNAPSHOT/artifactory-10.0-20150515.164556-7-sources.tar.gz");
-        MavenArtifactInfo artifactInfo = MavenArtifactInfo.fromRepoPath(path);
-        assertTrue(artifactInfo.isValid());
-        assertEquals(artifactInfo.getGroupId(), "org.jfrog");
-        assertEquals(artifactInfo.getArtifactId(), "artifactory");
-        assertEquals(artifactInfo.getVersion(), "10.0-20150515.164556-7");
-        assertEquals(artifactInfo.getClassifier(), "sources");
-        assertEquals(artifactInfo.getType(), "tar.gz");
-    }
-
-    public void testTarBz2() {
-        RepoPath path = new RepoPathImpl("repo",
-                "org/jfrog/artifactory/10.0-SNAPSHOT/artifactory-10.0-20150515.164556-7-sources.tar.bz2");
-        MavenArtifactInfo artifactInfo = MavenArtifactInfo.fromRepoPath(path);
-        assertTrue(artifactInfo.isValid());
-        assertEquals(artifactInfo.getGroupId(), "org.jfrog");
-        assertEquals(artifactInfo.getArtifactId(), "artifactory");
-        assertEquals(artifactInfo.getVersion(), "10.0-20150515.164556-7");
-        assertEquals(artifactInfo.getClassifier(), "sources");
-        assertEquals(artifactInfo.getType(), "tar.bz2");
-    }
-
-    public void fileExtensionAsNumber() {
-        RepoPath path = InfoFactoryHolder.get().createRepoPath("repo",
-                "/org/jfrog/artifactory-core/2.0/artifactory-core-2.0.386");
-        MavenArtifactInfo artifactInfo = MavenArtifactInfo.fromRepoPath(path);
-        assertTrue(artifactInfo.isValid());
-        assertEquals(artifactInfo.getType(), "386");
-    }
-
-    public void fromInvalidPath() {
-        RepoPath path = InfoFactoryHolder.get().createRepoPath("repo", "com/5.4-SNAPSHOT");
-        MavenArtifactInfo artifactInfo = MavenArtifactInfo.fromRepoPath(path);
-        assertFalse(artifactInfo.isValid());
-    }
-
-    public void fromPathWithNoGroupId() {
-        RepoPath path = InfoFactoryHolder.get().createRepoPath("repo", "com/5.4-SNAPSHOT/bob.jar");
-        MavenArtifactInfo artifactInfo = MavenArtifactInfo.fromRepoPath(path);
-        assertFalse(artifactInfo.isValid());
-    }
-
-    public void fromPathWithoutExtension() {
-        RepoPath path = InfoFactoryHolder.get().createRepoPath("repo", "org/something/1/noExtension");
-        MavenArtifactInfo artifactInfo = MavenArtifactInfo.fromRepoPath(path);
-        assertTrue(artifactInfo.isValid());
-        assertEquals(artifactInfo.getGroupId(), "org");
-        assertEquals(artifactInfo.getArtifactId(), "something");
-        assertEquals(artifactInfo.getVersion(), "1");
-        assertNull(artifactInfo.getClassifier());
-        assertEquals(artifactInfo.getType(), "jar");
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/api/module/VersionUnitTest.java b/backend/core/src/test/java/org/artifactory/api/module/VersionUnitTest.java
deleted file mode 100644
index 8f3badc..0000000
--- a/backend/core/src/test/java/org/artifactory/api/module/VersionUnitTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.module;
-
-import com.google.common.collect.Sets;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.util.RepoLayoutUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.Set;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Tests the Version Unit.
- *
- * @author Yossi Shaul
- */
- at Test
-public class VersionUnitTest {
-
-    public void nodeConstructor() {
-        RepoPath descriptorPath = InfoFactoryHolder.get()
-                .createRepoPath("libs-releases", "org/artifactory/core/5.6/core-5.6.pom");
-        Set<RepoPath> repoPaths = Sets.newHashSet(descriptorPath);
-        ModuleInfo moduleInfo = ModuleInfoUtils.moduleInfoFromDescriptorPath(descriptorPath.getPath(),
-                RepoLayoutUtils.MAVEN_2_DEFAULT);
-        VersionUnit vu = new VersionUnit(moduleInfo, repoPaths);
-
-        assertEquals(vu.getRepoPaths(), repoPaths, "Unexpected repo path");
-        assertEquals(vu.getModuleInfo().getOrganization(), "org.artifactory", "Unexpected group id");
-        assertEquals(vu.getModuleInfo().getModule(), "core", "Unexpected artifact id");
-        assertEquals(vu.getModuleInfo().getBaseRevision(), "5.6", "Unexpected version");
-
-        RepoPath repoPath = vu.getRepoPaths().iterator().next();
-        assertEquals(repoPath.getRepoKey(), "libs-releases", "Unexpected repoKey");
-        assertEquals(repoPath.getPath(), "org/artifactory/core/5.6/core-5.6.pom", "Unexpected repo path");
-    }
-
-    public void invalidPath() {
-        RepoPath repoPath = InfoFactoryHolder.get()
-                .createRepoPath("libs-releases", "core/5.6");
-        Set<RepoPath> repoPaths = Sets.newHashSet(repoPath);
-        ModuleInfo moduleInfo = ModuleInfoUtils.moduleInfoFromDescriptorPath(repoPath.getPath(),
-                RepoLayoutUtils.MAVEN_2_DEFAULT);
-        VersionUnit versionUnit = new VersionUnit(moduleInfo, repoPaths);
-        ModuleInfo vUModuleInfo = versionUnit.getModuleInfo();
-        Assert.assertNotNull(vUModuleInfo,
-                "Version unit module info object should not be null even though it failed to match.");
-        Assert.assertFalse(vUModuleInfo.isValid(), "Version unit module info object should not be valid.");
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/api/request/ArtifactoryRequestTest.java b/backend/core/src/test/java/org/artifactory/api/request/ArtifactoryRequestTest.java
deleted file mode 100644
index 80071df..0000000
--- a/backend/core/src/test/java/org/artifactory/api/request/ArtifactoryRequestTest.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.request;
-
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.md.Properties;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.util.Enumeration;
-import java.util.Map;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertFalse;
-
-/**
- * @author Yoav Landman
- */
- at SuppressWarnings({"ConstantConditions"})
- at Test
-public class ArtifactoryRequestTest extends ArtifactoryHomeBoundTest {
-
-    public void matrixParams() throws UnsupportedEncodingException {
-        ArtifactoryRequestBase request = newRequest();
-        request.setRepoPath(request.calculateRepoPath("libs-releases/path1/path2:metadata1;a=1;a=11;b=2;c;d=4;e"));
-        Properties params = request.getProperties();
-        assertMatrixParams(params);
-        request = newRequest();
-        request.setRepoPath(request.calculateRepoPath("libs-releases;a=1;a=11;b=2;c;d=4;e/path1/path2:metadata1"));
-        params = request.getProperties();
-        assertMatrixParams(params);
-        request = newRequest();
-        request.setRepoPath(request.calculateRepoPath("libs-releases;a=1;b=2/path1/path2:metadata1;a=11;c;d=4;e"));
-        params = request.getProperties();
-        assertMatrixParams(params);
-        request = newRequest();
-        request.setRepoPath(request.calculateRepoPath("libs-releases;a=1;a=11;b=2;c;d=4;e"));
-        params = request.getProperties();
-        assertMatrixParams(params);
-    }
-
-    public void matrixParamsWithEncodedValues() throws UnsupportedEncodingException {
-        ArtifactoryRequestBase request = newRequest();
-        request.setRepoPath(request.calculateRepoPath("libs-releases;a=1%2B2;b=1+2;c=1%232;d=c%20c;e="));
-        Properties params = request.getProperties();
-        assertEquals(params.size(), 5, "Expecting 5 parameters");
-        assertEquals(params.get("a").iterator().next(), "1+2", "Character '%2B' should have been decoded to +");
-        assertEquals(params.get("b").iterator().next(), "1 2", "Character '+' should have been decoded to space");
-        assertEquals(params.get("c").iterator().next(), "1#2", "String '%23' should have been decoded to '#'");
-        assertEquals(params.get("d").iterator().next(), "c c", "String '%20' should have been decoded to space");
-        assertEquals(params.get("e").iterator().next(), "", "Expecting empty string");
-    }
-
-    public void pathsWithSpaces() throws UnsupportedEncodingException {
-        ArtifactoryRequestBase request = newRequest();
-        assertEquals(request.calculateRepoPath("libs-rele%C3%A3ses/%C3%A3%20path/with/some%20non%C3%A3scii.jar"),
-                InfoFactoryHolder.get().createRepoPath("libs-releãses", "ã path/with/some nonãscii.jar"));
-    }
-
-    public void pathWithNonAscii() throws UnsupportedEncodingException {
-        ArtifactoryRequestBase request = newRequest();
-        assertEquals(request.calculateRepoPath("libs-releases%20momo/a%20path/with/some%20spaces.jar"),
-                InfoFactoryHolder.get().createRepoPath("libs-releases momo", "a path/with/some spaces.jar"));
-        assertEquals(request.calculateRepoPath("libs-releases%20momo/a%20path/with/some%20spaces.jar:andmetadata"),
-                InfoFactoryHolder.get().createRepoPath("libs-releases momo",
-                        "a path/with/some spaces.jar:andmetadata"));
-    }
-
-    public void zipResourceAbsolute() throws UnsupportedEncodingException {
-        ArtifactoryRequestBase request = newRequest();
-        request.setRepoPath(request.calculateRepoPath("libs-releases/path/to/zip!/zip/resource"));
-        assertEquals(request.getRepoPath(), InfoFactoryHolder.get().createRepoPath("libs-releases", "path/to/zip"));
-        assertEquals(request.getZipResourcePath(), "zip/resource");
-    }
-
-    public void zipResourceRelative() throws UnsupportedEncodingException {
-        ArtifactoryRequestBase request = newRequest();
-        request.setRepoPath(request.calculateRepoPath("libs-releases/path/to/zip!zip/resource"));
-        assertEquals(request.getRepoPath(), InfoFactoryHolder.get().createRepoPath("libs-releases", "path/to/zip"));
-        assertEquals(request.getZipResourcePath(), "zip/resource");
-    }
-
-    public void zipResourceEmptyPath() throws UnsupportedEncodingException {
-        ArtifactoryRequestBase request = newRequest();
-        request.setRepoPath(request.calculateRepoPath("libs-releases/path/to/zip!"));
-        assertEquals(request.getRepoPath(), InfoFactoryHolder.get().createRepoPath("libs-releases", "path/to/zip"));
-        assertEquals(request.getZipResourcePath(), "",
-                "Expected empty path to zip resource: " + request.getZipResourcePath());
-    }
-
-    private void assertMatrixParams(Properties params) {
-        assertEquals(params.size(), 6);
-        assertEquals(params.get("a").toArray(), new String[]{"1", "11"});
-        assertEquals(params.get("b").iterator().next(), "2");
-        assertEquals(params.get("c").iterator().next(), "");
-        assertEquals(params.get("d").iterator().next(), "4");
-        assertEquals(params.get("e").iterator().next(), "");
-        assertFalse(params.get("f").iterator().hasNext());
-    }
-
-    private ArtifactoryRequestBase newRequest() {
-        return new ArtifactoryRequestBase() {
-            @Override
-            public long getLastModified() {
-                return 0;
-            }
-
-            @Override
-            public long getIfModifiedSince() {
-                return 0;
-            }
-
-            @Override
-            public boolean hasIfModifiedSince() {
-                return false;
-            }
-
-            @Override
-            public String getClientAddress() {
-                return null;
-            }
-
-            @Override
-            public InputStream getInputStream() throws IOException {
-                return null;
-            }
-
-            @Override
-            public boolean isHeadOnly() {
-                return false;
-            }
-
-            @Override
-            public boolean isRecursive() {
-                return false;
-            }
-
-            @Override
-            public boolean isFromAnotherArtifactory() {
-                return false;
-            }
-
-            @Override
-            public long getContentLength() {
-                return 0;
-            }
-
-            @Override
-            public String getHeader(String headerName) {
-                return null;
-            }
-
-            @Override
-            public Enumeration getHeaders(String headerName) {
-                return null;
-            }
-
-            @Override
-            public Map<String, String> getHeaders() {
-                return null;
-            }
-
-            @Override
-            public String getUri() {
-                return null;
-            }
-
-            @Override
-            public String getServletContextUrl() {
-                return "";
-            }
-        };
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/api/request/TranslatedArtifactoryRequestTest.java b/backend/core/src/test/java/org/artifactory/api/request/TranslatedArtifactoryRequestTest.java
deleted file mode 100644
index 7128f7d..0000000
--- a/backend/core/src/test/java/org/artifactory/api/request/TranslatedArtifactoryRequestTest.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.request;
-
-import org.apache.commons.io.input.NullInputStream;
-import org.artifactory.factory.InfoFactory;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.request.ArtifactoryRequest;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.artifactory.util.PathUtils;
-import org.easymock.EasyMock;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.InputStream;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the specialized translated artifactory request. Makes sure that special actions are taken where needed and
- * otherwise delegates to the original request object
- *
- * @author Noam Y. Tenne
- */
-public class TranslatedArtifactoryRequestTest extends ArtifactoryHomeBoundTest {
-
-    private RepoPath translatedRepoPath;
-    private RepoPath translatedMetadataRepoPath;
-    private RepoPath translatedChecksumRepoPath;
-
-    private TranslatedArtifactoryRequest translatedArtifactoryRequest;
-    private TranslatedArtifactoryRequest translatedMetadataArtifactoryRequest;
-    private TranslatedArtifactoryRequest translatedChecksumArtifactoryRequest;
-
-    protected final InfoFactory factory = InfoFactoryHolder.get();
-    private Properties properties = (Properties) factory.createProperties();
-    private String[] parameterValues = new String[]{"vals"};
-    private InputStream inputStream = new NullInputStream(0);
-
-    @BeforeClass
-    public void setUp() throws Exception {
-        ArtifactoryRequest artifactoryRequestMock = EasyMock.createMock(ArtifactoryRequest.class);
-        EasyMock.expect(artifactoryRequestMock.getClientAddress()).andReturn("sourceDescription").anyTimes();
-        EasyMock.expect(artifactoryRequestMock.isRecursive()).andReturn(true).anyTimes();
-        EasyMock.expect(artifactoryRequestMock.getModificationTime()).andReturn(2013944l).anyTimes();
-        EasyMock.expect(artifactoryRequestMock.isFromAnotherArtifactory()).andReturn(false).anyTimes();
-        EasyMock.expect(artifactoryRequestMock.isHeadOnly()).andReturn(true).anyTimes();
-        EasyMock.expect(artifactoryRequestMock.getLastModified()).andReturn(563752346l).anyTimes();
-        EasyMock.expect(artifactoryRequestMock.getIfModifiedSince()).andReturn(22076l).anyTimes();
-        EasyMock.expect(artifactoryRequestMock.isNewerThan(-1l)).andReturn(false).anyTimes();
-        EasyMock.expect(artifactoryRequestMock.getHeader("header")).andReturn("bob").anyTimes();
-        EasyMock.expect(artifactoryRequestMock.getServletContextUrl()).andReturn("url").anyTimes();
-        EasyMock.expect(artifactoryRequestMock.getUri()).andReturn("uri").anyTimes();
-        EasyMock.expect(artifactoryRequestMock.getProperties()).andReturn(properties).anyTimes();
-        EasyMock.expect(artifactoryRequestMock.hasProperties()).andReturn(true).anyTimes();
-        EasyMock.expect(artifactoryRequestMock.getParameter("parameter")).andReturn("moo").anyTimes();
-        EasyMock.expect(artifactoryRequestMock.getParameterValues("parameters")).andReturn(parameterValues).anyTimes();
-        EasyMock.expect(artifactoryRequestMock.getInputStream()).andReturn(inputStream).anyTimes();
-        EasyMock.expect(artifactoryRequestMock.getContentLength()).andReturn(1337L).anyTimes();
-        EasyMock.expect(artifactoryRequestMock.getZipResourcePath()).andReturn(null).anyTimes();
-        EasyMock.replay(artifactoryRequestMock);
-
-        InfoFactory factory = this.factory;
-        translatedRepoPath = factory.createRepoPath("translatedRepoKey", "translatedRepoPath");
-        translatedMetadataRepoPath = factory.createRepoPath("translatedRepoKey",
-                "translatedRepoPath:maven-metadata.xml");
-        translatedChecksumRepoPath = factory.createRepoPath("translatedRepoKey", "translatedRepoPath.md5");
-
-        translatedArtifactoryRequest = new TranslatedArtifactoryRequest(translatedRepoPath, artifactoryRequestMock);
-        translatedMetadataArtifactoryRequest = new TranslatedArtifactoryRequest(translatedMetadataRepoPath,
-                artifactoryRequestMock);
-        translatedChecksumArtifactoryRequest = new TranslatedArtifactoryRequest(translatedChecksumRepoPath,
-                artifactoryRequestMock);
-    }
-
-    @Test
-    public void testGetRepoKey() throws Exception {
-        assertEquals(translatedArtifactoryRequest.getRepoKey(), translatedRepoPath.getRepoKey());
-        assertEquals(translatedMetadataArtifactoryRequest.getRepoKey(), translatedMetadataRepoPath.getRepoKey());
-        assertEquals(translatedChecksumArtifactoryRequest.getRepoKey(), translatedChecksumRepoPath.getRepoKey());
-    }
-
-    @Test
-    public void testGetPath() throws Exception {
-        assertEquals(translatedArtifactoryRequest.getPath(), translatedRepoPath.getPath());
-        assertEquals(translatedMetadataArtifactoryRequest.getPath(), translatedMetadataRepoPath.getPath());
-        assertEquals(translatedChecksumArtifactoryRequest.getPath(), translatedChecksumRepoPath.getPath());
-    }
-
-    @Test
-    public void testGetSourceDescription() throws Exception {
-        assertEquals(translatedArtifactoryRequest.getClientAddress(), "sourceDescription");
-        assertEquals(translatedMetadataArtifactoryRequest.getClientAddress(), "sourceDescription");
-        assertEquals(translatedChecksumArtifactoryRequest.getClientAddress(), "sourceDescription");
-    }
-
-    @Test
-    public void testIsMetadata() throws Exception {
-        assertFalse(translatedArtifactoryRequest.isMetadata());
-        assertTrue(translatedMetadataArtifactoryRequest.isMetadata());
-        assertFalse(translatedChecksumArtifactoryRequest.isMetadata());
-    }
-
-    @Test
-    public void testIsRecursive() throws Exception {
-        assertTrue(translatedArtifactoryRequest.isRecursive());
-        assertTrue(translatedMetadataArtifactoryRequest.isRecursive());
-        assertTrue(translatedChecksumArtifactoryRequest.isRecursive());
-    }
-
-    @Test
-    public void testGetModificationTime() throws Exception {
-        assertEquals(translatedArtifactoryRequest.getModificationTime(), 2013944l);
-        assertEquals(translatedMetadataArtifactoryRequest.getModificationTime(), 2013944l);
-        assertEquals(translatedChecksumArtifactoryRequest.getModificationTime(), 2013944l);
-    }
-
-    @Test
-    public void testGetName() throws Exception {
-        assertEquals(translatedArtifactoryRequest.getName(), PathUtils.getFileName(translatedRepoPath.getPath()));
-        assertEquals(translatedMetadataArtifactoryRequest.getName(),
-                PathUtils.getFileName(translatedMetadataRepoPath.getPath()));
-        assertEquals(translatedChecksumArtifactoryRequest.getName(),
-                PathUtils.getFileName(translatedChecksumRepoPath.getPath()));
-    }
-
-    @Test
-    public void testGetRepoPath() throws Exception {
-        assertEquals(translatedArtifactoryRequest.getRepoPath(), translatedRepoPath);
-        assertEquals(translatedMetadataArtifactoryRequest.getRepoPath(), translatedMetadataRepoPath);
-        assertEquals(translatedChecksumArtifactoryRequest.getRepoPath(), translatedChecksumRepoPath);
-    }
-
-    @Test
-    public void testIsChecksum() throws Exception {
-        assertFalse(translatedArtifactoryRequest.isChecksum());
-        assertFalse(translatedMetadataArtifactoryRequest.isChecksum());
-        assertTrue(translatedChecksumArtifactoryRequest.isChecksum());
-    }
-
-    @Test
-    public void testIsFromAnotherArtifactory() throws Exception {
-        assertFalse(translatedArtifactoryRequest.isFromAnotherArtifactory());
-        assertFalse(translatedMetadataArtifactoryRequest.isFromAnotherArtifactory());
-        assertFalse(translatedChecksumArtifactoryRequest.isFromAnotherArtifactory());
-    }
-
-    @Test
-    public void testIsHeadOnly() throws Exception {
-        assertTrue(translatedArtifactoryRequest.isHeadOnly());
-        assertTrue(translatedMetadataArtifactoryRequest.isHeadOnly());
-        assertTrue(translatedChecksumArtifactoryRequest.isHeadOnly());
-    }
-
-    @Test
-    public void testGetLastModified() throws Exception {
-        assertEquals(translatedArtifactoryRequest.getLastModified(), 563752346l);
-        assertEquals(translatedMetadataArtifactoryRequest.getLastModified(), 563752346l);
-        assertEquals(translatedChecksumArtifactoryRequest.getLastModified(), 563752346l);
-    }
-
-    @Test
-    public void testGetIfModifiedSince() throws Exception {
-        assertEquals(translatedArtifactoryRequest.getIfModifiedSince(), 22076l);
-        assertEquals(translatedMetadataArtifactoryRequest.getIfModifiedSince(), 22076l);
-        assertEquals(translatedChecksumArtifactoryRequest.getIfModifiedSince(), 22076l);
-    }
-
-    @Test
-    public void testIsNewerThan() throws Exception {
-        assertFalse(translatedArtifactoryRequest.isNewerThan(-1l));
-        assertFalse(translatedMetadataArtifactoryRequest.isNewerThan(-1l));
-        assertFalse(translatedChecksumArtifactoryRequest.isNewerThan(-1l));
-    }
-
-    @Test
-    public void testGetHeader() throws Exception {
-        assertEquals(translatedArtifactoryRequest.getHeader("header"), "bob");
-        assertEquals(translatedMetadataArtifactoryRequest.getHeader("header"), "bob");
-        assertEquals(translatedChecksumArtifactoryRequest.getHeader("header"), "bob");
-    }
-
-    @Test
-    public void testGetServletContextUrl() throws Exception {
-        assertEquals(translatedArtifactoryRequest.getServletContextUrl(), "url");
-        assertEquals(translatedMetadataArtifactoryRequest.getServletContextUrl(), "url");
-        assertEquals(translatedChecksumArtifactoryRequest.getServletContextUrl(), "url");
-    }
-
-    @Test
-    public void testGetUri() throws Exception {
-        assertEquals(translatedArtifactoryRequest.getUri(), "uri");
-        assertEquals(translatedMetadataArtifactoryRequest.getUri(), "uri");
-        assertEquals(translatedChecksumArtifactoryRequest.getUri(), "uri");
-    }
-
-    @Test
-    public void testGetProperties() throws Exception {
-        assertEquals(translatedArtifactoryRequest.getProperties(), properties);
-        assertEquals(translatedMetadataArtifactoryRequest.getProperties(), properties);
-        assertEquals(translatedChecksumArtifactoryRequest.getProperties(), properties);
-    }
-
-    @Test
-    public void testHasProperties() throws Exception {
-        assertTrue(translatedArtifactoryRequest.hasProperties());
-        assertTrue(translatedMetadataArtifactoryRequest.hasProperties());
-        assertTrue(translatedChecksumArtifactoryRequest.hasProperties());
-    }
-
-    @Test
-    public void testGetParameter() throws Exception {
-        assertEquals(translatedArtifactoryRequest.getParameter("parameter"), "moo");
-        assertEquals(translatedMetadataArtifactoryRequest.getParameter("parameter"), "moo");
-        assertEquals(translatedChecksumArtifactoryRequest.getParameter("parameter"), "moo");
-    }
-
-    @Test
-    public void testGetParameterValues() throws Exception {
-        assertEquals(translatedArtifactoryRequest.getParameterValues("parameters"), parameterValues);
-        assertEquals(translatedMetadataArtifactoryRequest.getParameterValues("parameters"), parameterValues);
-        assertEquals(translatedChecksumArtifactoryRequest.getParameterValues("parameters"), parameterValues);
-    }
-
-    @Test
-    public void testGetInputStream() throws Exception {
-        assertEquals(translatedArtifactoryRequest.getInputStream(), inputStream);
-        assertEquals(translatedMetadataArtifactoryRequest.getInputStream(), inputStream);
-        assertEquals(translatedChecksumArtifactoryRequest.getInputStream(), inputStream);
-    }
-
-    @Test
-    public void testGetContentLength() throws Exception {
-        assertEquals(translatedArtifactoryRequest.getContentLength(), 1337);
-        assertEquals(translatedMetadataArtifactoryRequest.getContentLength(), 1337);
-        assertEquals(translatedChecksumArtifactoryRequest.getContentLength(), 1337);
-    }
-
-    @Test
-    public void testToString() throws Exception {
-        assertEquals(translatedArtifactoryRequest.toString(),
-                "source=sourceDescription, path=translatedRepoPath, lastModified=563752346, ifModifiedSince=22076");
-        assertEquals(translatedMetadataArtifactoryRequest.toString(), "source=sourceDescription, " +
-                "path=translatedRepoPath:maven-metadata.xml, lastModified=563752346, ifModifiedSince=22076");
-        assertEquals(translatedChecksumArtifactoryRequest.toString(), "source=sourceDescription, " +
-                "path=translatedRepoPath.md5, lastModified=563752346, ifModifiedSince=22076");
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/api/search/SavedSearchResultsTest.java b/backend/core/src/test/java/org/artifactory/api/search/SavedSearchResultsTest.java
deleted file mode 100644
index 59d8bef..0000000
--- a/backend/core/src/test/java/org/artifactory/api/search/SavedSearchResultsTest.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search;
-
-import com.google.common.collect.Lists;
-import org.artifactory.factory.InfoFactory;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.FileInfo;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the functionality of {@link SavedSearchResults}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class SavedSearchResultsTest {
-
-    public void defaultConstructor() {
-        SavedSearchResults results = new SavedSearchResults("test", Lists.<FileInfo>newArrayList());
-        assertEquals(results.getName(), "test");
-        assertEquals(results.getResults().size(), 0);
-    }
-
-    public void addResultsWithDuplicates() {
-        SavedSearchResults results = new SavedSearchResults("test", null);
-
-        InfoFactory factory = InfoFactoryHolder.get();
-        FileInfo fileInfo = factory.createFileInfo(factory.createRepoPath("repo1", "a/b/c/d"));
-        results.add(fileInfo);
-        assertTrue(results.contains(fileInfo), "Just added file info not found...");
-
-        // add the same file info again and expect to only one
-        results.add(fileInfo);
-        assertTrue(results.contains(fileInfo), "Just added file info not found...");
-        assertEquals(results.size(), 1, "Should not allow duplicates");
-    }
-
-    public void mergeResults() {
-        InfoFactory factory = InfoFactoryHolder.get();
-        FileInfo sharedFileInfo = factory.createFileInfo(factory.createRepoPath("repo1", "test1"));
-        FileInfo samePathDifferentRepoKey = factory.createFileInfo(factory.createRepoPath("repo2", "test1"));
-
-        SavedSearchResults results = new SavedSearchResults("test", null);
-        results.add(sharedFileInfo);
-
-        SavedSearchResults toMerge = new SavedSearchResults("test", Lists.newArrayList(
-                sharedFileInfo, samePathDifferentRepoKey));
-
-        results.merge(toMerge);
-
-        assertEquals(results.size(), 1, "The shared path should not have been added (same relative path)");
-        assertTrue(results.contains(sharedFileInfo));
-        assertTrue(results.contains(samePathDifferentRepoKey));
-    }
-
-    public void subtractResults() {
-        InfoFactory factory = InfoFactoryHolder.get();
-        FileInfo sharedFileInfo = factory.createFileInfo(factory.createRepoPath("repo1", "test1"));
-        FileInfo notInSubtract = factory.createFileInfo(factory.createRepoPath("repo1", "test2"));
-        FileInfo notInOriginal = factory.createFileInfo(factory.createRepoPath("repo1", "test2/123"));
-
-        SavedSearchResults results = new SavedSearchResults("test",
-                Lists.newArrayList(sharedFileInfo, notInSubtract));
-
-        SavedSearchResults toMerge = new SavedSearchResults("test",
-                Lists.newArrayList(sharedFileInfo, notInOriginal));
-
-        results.subtract(toMerge);
-
-        assertFalse(results.getResults().contains(sharedFileInfo), "Shared item should have been removed");
-        assertTrue(results.getResults().contains(notInSubtract));
-        assertEquals(results.size(), 1, "Only one item should remain: " + results);
-    }
-
-    public void intersectResults() {
-        InfoFactory factory = InfoFactoryHolder.get();
-        FileInfo shared = factory.createFileInfo(factory.createRepoPath("repo1", "test1"));
-        FileInfo onlyInA = factory.createFileInfo(factory.createRepoPath("repo1", "test2"));
-        FileInfo onlyInB = factory.createFileInfo(factory.createRepoPath("repo1", "test2/123"));
-
-        SavedSearchResults results = new SavedSearchResults("A",
-                Lists.newArrayList(shared, onlyInA));
-
-        SavedSearchResults toIntersect = new SavedSearchResults("B",
-                Lists.newArrayList(shared, onlyInB));
-
-        results.intersect(toIntersect);
-
-        assertTrue(results.getResults().contains(shared), "Shared item should be the only one left");
-        assertTrue(results.contains(shared), "Shared item should be the only one left");
-        assertEquals(results.size(), 1, "Only one item should remain: " + results);
-    }
-
-}
diff --git a/backend/core/src/test/java/org/artifactory/api/security/UserInfoBuilderTest.java b/backend/core/src/test/java/org/artifactory/api/security/UserInfoBuilderTest.java
deleted file mode 100644
index 1e0b61e..0000000
--- a/backend/core/src/test/java/org/artifactory/api/security/UserInfoBuilderTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.security;
-
-import org.artifactory.security.MutableUserInfo;
-import org.artifactory.security.SaltedPassword;
-import org.artifactory.security.UserInfo;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the UserInfoBuilder.
- *
- * @author Yossi Shaul
- */
- at Test
-public class UserInfoBuilderTest {
-
-    public void minimalBuild() {
-        UserInfoBuilder builder = new UserInfoBuilder("yossis");
-        UserInfo user = builder.build();
-        assertEquals(user.getUsername(), "yossis");
-        assertEquals(user.getPassword(), MutableUserInfo.INVALID_PASSWORD);
-        assertNotNull(user.getGroups());
-        assertTrue(user.getGroups().isEmpty());
-        assertTrue(user.isAccountNonExpired());
-        assertTrue(user.isAccountNonLocked());
-        assertFalse(user.isTransientUser());
-        assertFalse(user.isAdmin());
-        assertFalse(user.isAnonymous());
-        assertFalse(user.isCredentialsExpired());
-        assertFalse(user.isUpdatableProfile());
-        assertTrue(user.isEnabled());
-        assertEquals(user.getEmail(), "");
-        assertNull(user.getGenPasswordKey());
-        assertNull(user.getPrivateKey());
-        assertNull(user.getPublicKey());
-        assertNull(user.getPublicKey());
-        assertNull(user.getLastLoginClientIp());
-        assertEquals(user.getLastLoginTimeMillis(), 0);
-        assertNotNull(user.getSalt());
-    }
-
-    @Test(expectedExceptions = IllegalStateException.class)
-    public void noUsernameBuild() {
-        UserInfoBuilder builder = new UserInfoBuilder(null);
-        builder.build();
-    }
-
-    public void emailBuild() {
-        UserInfoBuilder builder = new UserInfoBuilder("yossis");
-        builder.email("yossis at test.org").password(new SaltedPassword("secret", "SALT"));
-        UserInfo user = builder.build();
-        assertEquals(user.getEmail(), "yossis at test.org");
-        assertEquals(user.getPassword(), "secret");
-    }
-
-    public void saltBuild() {
-        UserInfoBuilder builder = new UserInfoBuilder("yossis");
-        builder.email("yossis at test.org").password(new SaltedPassword("secret", "SALT"));
-        UserInfo user = builder.build();
-        assertEquals(user.getEmail(), "yossis at test.org");
-        assertEquals(user.getPassword(), "secret");
-        assertEquals(user.getSalt(), "SALT");
-    }
-
-}
diff --git a/backend/core/src/test/java/org/artifactory/bintray/BintrayServiceImplTest.java b/backend/core/src/test/java/org/artifactory/bintray/BintrayServiceImplTest.java
deleted file mode 100644
index 7ac9a7a..0000000
--- a/backend/core/src/test/java/org/artifactory/bintray/BintrayServiceImplTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.bintray;
-
-import org.artifactory.util.ResourceUtils;
-import org.springframework.test.util.ReflectionTestUtils;
-import org.testng.annotations.Test;
-
-import java.io.InputStream;
-import java.util.List;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
-
-/**
- * @author Shay Yaakov
- */
- at Test
-public class BintrayServiceImplTest {
-
-    public void testGetPackagesToDeploy() {
-        BintrayServiceImpl bintrayService = new BintrayServiceImpl();
-        InputStream inputStream = ResourceUtils.getResource("/org/artifactory/bintray/packagesToDeploy.json");
-        List<String> packagesList = ReflectionTestUtils.invokeMethod(bintrayService, "getPackagesList", inputStream);
-        assertEquals(packagesList.size(), 2, "Expected 2 packages");
-        assertTrue(packagesList.contains("package2"), "Expected to find package1");
-        assertTrue(packagesList.contains("package3"), "Expected to find package2");
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/build/DetailedBuildRunTests.java b/backend/core/src/test/java/org/artifactory/build/DetailedBuildRunTests.java
deleted file mode 100644
index c3f7f73..0000000
--- a/backend/core/src/test/java/org/artifactory/build/DetailedBuildRunTests.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.build;
-
-import org.jfrog.build.api.Build;
-import org.testng.Assert;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
-
-import java.util.Date;
-
-import static java.lang.String.valueOf;
-import static org.jfrog.build.api.Build.formatBuildStarted;
-
-/**
- * @author jbaruch
- * @since 04/05/12
- */
-public class DetailedBuildRunTests {
-
-    private DetailedBuildRunImpl original;
-
-    @BeforeTest
-    public void setup() {
-        Build build = new Build();
-        build.setNumber(valueOf(42));
-        build.setName("test-build");
-        build.setStarted(formatBuildStarted(new Date().getTime()));
-        original = new DetailedBuildRunImpl(build);
-    }
-
-    @Test
-    public void testCopy() throws Exception {
-        DetailedBuildRun copy = original.copy();
-        Assert.assertNotEquals(copy, original);//started should be different
-        Assert.assertEquals(copy.getName(), original.getName());
-        Assert.assertEquals(copy.getNumber(), original.getNumber());
-        Assert.assertNotEquals(copy.getStarted(), original.getStarted());
-    }
-
-    @Test
-    public void testCopyWithNewNumber() throws Exception {
-        String newNumber = "42-r";
-        DetailedBuildRun copy = original.copy(newNumber);
-        Assert.assertNotEquals(copy, original);//started should be different
-        Assert.assertEquals(copy.getName(), original.getName());
-        Assert.assertNotEquals(copy.getNumber(), original.getNumber());
-        Assert.assertEquals(copy.getNumber(), newNumber);
-        Assert.assertNotEquals(copy.getStarted(), original.getStarted());
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/config/CentralConfigServiceImplTest.java b/backend/core/src/test/java/org/artifactory/config/CentralConfigServiceImplTest.java
deleted file mode 100644
index d55dc17..0000000
--- a/backend/core/src/test/java/org/artifactory/config/CentralConfigServiceImplTest.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.config;
-
-import com.google.common.collect.Maps;
-import org.artifactory.descriptor.config.CentralConfigDescriptorImpl;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.property.PredefinedValue;
-import org.artifactory.descriptor.property.Property;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.descriptor.repo.HttpRepoDescriptor;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.springframework.test.util.ReflectionTestUtils;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-import java.util.Map;
-
-import static org.testng.Assert.assertTrue;
-
-/**
- * Unit tests for the CentralConfigServiceImpl.
- *
- * @author Yossi Shaul
- */
- at Test
-public class CentralConfigServiceImplTest {
-
-    public void idRefsUseTheSameObject() throws Exception {
-        MutableCentralConfigDescriptor cc = new CentralConfigDescriptorImpl();
-        cc.setServerName("mymy");
-        cc.setDateFormat("dd-MM-yy HH:mm:ss z");
-
-        LocalRepoDescriptor local1 = new LocalRepoDescriptor();
-        local1.setKey("local1");
-        Map<String, LocalRepoDescriptor> localReposMap = Maps.newLinkedHashMap();
-        localReposMap.put(local1.getKey(), local1);
-        cc.setLocalRepositoriesMap(localReposMap);
-
-        ProxyDescriptor proxy = new ProxyDescriptor();
-        proxy.setHost("localhost");
-        proxy.setKey("proxy");
-        proxy.setPort(8987);
-        cc.setProxies(Arrays.asList(proxy));
-
-        HttpRepoDescriptor httpRepo = new HttpRepoDescriptor();
-        httpRepo.setKey("http");
-        httpRepo.setProxy(proxy);
-        httpRepo.setUrl("http://blabla");
-        Map<String, RemoteRepoDescriptor> map = Maps.newLinkedHashMap();
-        map.put(httpRepo.getKey(), httpRepo);
-        cc.setRemoteRepositoriesMap(map);
-
-        // property sets
-        PropertySet propSet = new PropertySet();
-        propSet.setName("propSet1");
-        Property prop = new Property();
-        prop.setName("prop1");
-        PredefinedValue value1 = new PredefinedValue();
-        value1.setValue("value1");
-        prop.addPredefinedValue(value1);
-        PredefinedValue value2 = new PredefinedValue();
-        value2.setValue("value2");
-        prop.addPredefinedValue(value2);
-        propSet.addProperty(prop);
-        cc.addPropertySet(propSet);
-
-        local1.addPropertySet(propSet);
-
-        // set and duplicate the descriptor 
-        CentralConfigServiceImpl configService = new CentralConfigServiceImpl();
-        ReflectionTestUtils.setField(configService, "descriptor", cc);
-        MutableCentralConfigDescriptor copy = configService.getMutableDescriptor();
-
-        // make sure proxy object was not duplicated
-        proxy = copy.getProxies().get(0);
-        ProxyDescriptor httpProxy = ((HttpRepoDescriptor) copy.getRemoteRepositoriesMap().get("http")).getProxy();
-        assertTrue(proxy == httpProxy, "Proxy object was duplicated!");
-
-        // make sure the property set was not duplicated
-        PropertySet propSetCopy = copy.getPropertySets().get(0);
-        LocalRepoDescriptor local1Copy = copy.getLocalRepositoriesMap().get("local1");
-        PropertySet propSetCopyFromRepo = local1Copy.getPropertySet("propSet1");
-        assertTrue(propSetCopy == propSetCopyFromRepo, "Proxy set object was duplicated!");
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/config/DefaultConfigTest.java b/backend/core/src/test/java/org/artifactory/config/DefaultConfigTest.java
deleted file mode 100644
index 37e71be..0000000
--- a/backend/core/src/test/java/org/artifactory/config/DefaultConfigTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.config;
-
-import org.apache.commons.io.IOUtils;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.reader.CentralConfigReader;
-import org.artifactory.test.ArtifactoryHomeStub;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.Test;
-
-import java.io.*;
-
-/**
- * Tests the default configuration works.
- *
- * @author Yossi Shaul
- */
- at Test
-public class DefaultConfigTest {
-    private static final Logger log = LoggerFactory.getLogger(DefaultConfigTest.class);
-
-    public void testReadDefaultConfig() throws IOException {
-        ArtifactoryHome.bind(new ArtifactoryHomeStub());
-        InputStream is = getClass().getResourceAsStream("/META-INF/default/artifactory.config.xml");
-        File confFile = File.createTempFile("ConfTests", null);
-        confFile.deleteOnExit();
-        OutputStream os = new PrintStream(confFile);
-        IOUtils.copy(is, os);
-        is.close();
-        os.close();
-        CentralConfigDescriptor centralConfig = new CentralConfigReader().read(confFile);
-        log.debug("config = " + centralConfig);
-        ArtifactoryHome.unbind();
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/io/checksum/ChecksumsTest.java b/backend/core/src/test/java/org/artifactory/io/checksum/ChecksumsTest.java
deleted file mode 100644
index 919c905..0000000
--- a/backend/core/src/test/java/org/artifactory/io/checksum/ChecksumsTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.io.checksum;
-
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.checksum.ChecksumsInfo;
-import org.artifactory.util.Pair;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-
-/**
- * Tests the ChecksumCalculator.
- *
- * @author Yossi Shaul
- */
- at Test
-public class ChecksumsTest {
-
-    public void calculateSha1() throws IOException {
-        byte[] bytes = "this is a test".getBytes();
-        String result = ChecksumUtil.getChecksum(new ByteArrayInputStream(bytes), ChecksumType.sha1);
-        assertEquals(result, "fa26be19de6bff93f70bc2308434e4a440bbad02",
-                "Wrong SHA1 calculated");
-    }
-
-    public void calculateMd5() throws IOException {
-        byte[] bytes = "this is a test".getBytes();
-        String result = ChecksumUtil.getChecksum(new ByteArrayInputStream(bytes), ChecksumType.md5);
-        assertEquals(result, "54b0c58c7ce9f2a8b551351102ee0938",
-                "Wrong SHA1 calculated");
-    }
-
-    public void calculateSha1AndMd5() throws IOException {
-        byte[] bytes = "and this is another test".getBytes();
-        ChecksumsInfo results = ChecksumUtil.getChecksumsInfo(new ByteArrayInputStream(bytes));
-        assertNotNull(results, "Results should not be null");
-        assertEquals(results.size(), 2, "Expecting two calculated value");
-        assertEquals(results.getSha1(), "5258d99970d60aed055c0056a467a0422acf7cb8",
-                "Wrong SHA1 calculated");
-        assertEquals(results.getMd5(), "72f1aea68f75f79889b99cd4ff7acc83",
-                "Wrong MD5 calculated");
-    }
-
-    public void calculateAllKnownChecksums() throws IOException {
-        byte[] bytes = "and this is yet another test".getBytes();
-        Pair<Long, ChecksumsInfo> results = ChecksumUtil.getSizeAndChecksumsInfo(new ByteArrayInputStream(bytes), ChecksumType.values());
-        ChecksumsInfo checksumsInfo = results.getSecond();
-        assertNotNull(checksumsInfo, "Results should not be null");
-        assertEquals(checksumsInfo.size(), ChecksumType.values().length, "Expecting all checksums calculated value");
-        assertEquals(checksumsInfo.getSha1(), "4e125432334dc76048aab3132a1bbc03c79f27e9",
-                "Wrong SHA1 calculated");
-        assertEquals(checksumsInfo.getMd5(), "0df8861dcef78d35aae9c6c6c8c69506",
-                "Wrong MD5 calculated");
-        assertEquals(checksumsInfo.getSha256(), "02a5357cde4bf21ba850fce37721406475a0c311dbbdffc2c79148ece46049b3",
-                "Wrong SHA256 calculated");
-    }
-
-}
diff --git a/backend/core/src/test/java/org/artifactory/io/checksum/policy/ChecksumPolicyBaseTest.java b/backend/core/src/test/java/org/artifactory/io/checksum/policy/ChecksumPolicyBaseTest.java
deleted file mode 100644
index 204de3d..0000000
--- a/backend/core/src/test/java/org/artifactory/io/checksum/policy/ChecksumPolicyBaseTest.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.io.checksum.policy;
-
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.descriptor.repo.ChecksumPolicyType;
-import org.testng.Assert;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-import java.util.HashSet;
-
-/**
- * Base class for the checksum policies tests. Mainly to enforce certain tests for all the policies.
- *
- * @author Yossi Shaul
- */
-public abstract class ChecksumPolicyBaseTest {
-    public static final String DUMMY_SHA1 = "1234567890123456789012345678901234567890";
-    public static final String DUMMY2_SHA1 = "3234567890123456789012345678901234567890";
-    public static final String DUMMY_MD5 = "12345678901234567890123456789012";
-    public static final String DUMMY2_MD5 = "32345678901234567890123456789012";
-
-    ChecksumInfo matchedChecksums;
-    ChecksumInfo notMatchedChecksums;
-    ChecksumInfo noOriginalChecksum;
-
-    abstract ChecksumPolicy getPolicy();
-
-    abstract void checksumsMatch();
-
-    abstract void noOriginalChecksum();
-
-    abstract void checksumsDoesNotMatch();
-
-    abstract void returnedChecksum();
-
-    @BeforeMethod
-    void generateTestData() {
-        // Match checksum should be the only sha1
-        matchedChecksums = new ChecksumInfo(ChecksumType.sha1, DUMMY_SHA1, DUMMY_SHA1);
-        notMatchedChecksums = new ChecksumInfo(ChecksumType.md5, "thiswontmatch", DUMMY_MD5);
-        noOriginalChecksum = new ChecksumInfo(ChecksumType.md5, null, DUMMY2_MD5);
-
-    }
-
-    @Test
-    public void oneMatchedChecksumAllShouldPass() {
-        ChecksumPolicyBase delegatingBasePolicy = new ChecksumPolicyBase() {
-            @Override
-            boolean verifyChecksum(ChecksumInfo checksumInfo) {
-                return ((ChecksumPolicyBase) getPolicy()).verifyChecksum(checksumInfo);
-            }
-
-            @Override
-            String getChecksum(ChecksumInfo checksumInfo) {
-                return ((ChecksumPolicyBase) getPolicy()).getChecksum(checksumInfo);
-            }
-
-            @Override
-            ChecksumPolicyType getChecksumPolicyType() {
-                return null;
-            }
-        };
-        // You can have only 2 checksums in the set (one for each type)
-        Assert.assertTrue(delegatingBasePolicy.verify(new HashSet<ChecksumInfo>(
-                Arrays.asList(notMatchedChecksums, matchedChecksums))),
-                "All policies should pass because there is one matches checksum");
-        Assert.assertTrue(delegatingBasePolicy.verify(new HashSet<ChecksumInfo>(
-                Arrays.asList(noOriginalChecksum, matchedChecksums))),
-                "All policies should pass because there is one matches checksum");
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/io/checksum/policy/ChecksumPolicyFailTest.java b/backend/core/src/test/java/org/artifactory/io/checksum/policy/ChecksumPolicyFailTest.java
deleted file mode 100644
index 37113d4..0000000
--- a/backend/core/src/test/java/org/artifactory/io/checksum/policy/ChecksumPolicyFailTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.io.checksum.policy;
-
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-/**
- * Tests the ChecksumPolicyFail.
- *
- * @author Yossi Shaul
- */
- at Test
-public class ChecksumPolicyFailTest extends ChecksumPolicyBaseTest {
-    private ChecksumPolicyFail policy;
-
-    @BeforeClass
-    public void createChecksumPolicy() {
-        policy = new ChecksumPolicyFail();
-    }
-
-    @Override
-    ChecksumPolicy getPolicy() {
-        return policy;
-    }
-
-    @Override
-    public void checksumsMatch() {
-        boolean ok = policy.verifyChecksum(matchedChecksums);
-        Assert.assertTrue(ok, "Policy should pass if checksums are same");
-    }
-
-    @Override
-    public void checksumsDoesNotMatch() {
-        boolean ok = policy.verifyChecksum(notMatchedChecksums);
-        Assert.assertFalse(ok, "Policy should ignore any checksum errors");
-    }
-
-    @Override
-    public void noOriginalChecksum() {
-        boolean ok = policy.verifyChecksum(noOriginalChecksum);
-        Assert.assertFalse(ok, "Policy should ignore any checksum errors");
-    }
-
-    @Override
-    public void returnedChecksum() {
-        String checksum = policy.getChecksum(matchedChecksums);
-        Assert.assertEquals(checksum, matchedChecksums.getActual(), "Should always return the actual value");
-        checksum = policy.getChecksum(notMatchedChecksums);
-        Assert.assertEquals(checksum, notMatchedChecksums.getActual(), "Should always return the actual value");
-        checksum = policy.getChecksum(noOriginalChecksum);
-        Assert.assertEquals(checksum, noOriginalChecksum.getActual(), "Should always return the actual value");
-    }
-
-}
\ No newline at end of file
diff --git a/backend/core/src/test/java/org/artifactory/io/checksum/policy/ChecksumPolicyGenerateIfAbsentTest.java b/backend/core/src/test/java/org/artifactory/io/checksum/policy/ChecksumPolicyGenerateIfAbsentTest.java
deleted file mode 100644
index d61ba99..0000000
--- a/backend/core/src/test/java/org/artifactory/io/checksum/policy/ChecksumPolicyGenerateIfAbsentTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.io.checksum.policy;
-
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-/**
- * Tests the ChecksumPolicyGenerateIfAbsent.
- *
- * @author Yossi Shaul
- */
- at Test
-public class ChecksumPolicyGenerateIfAbsentTest extends ChecksumPolicyBaseTest {
-    private ChecksumPolicyGenerateIfAbsent policy;
-
-    @BeforeClass
-    public void createChecksumPolicy() {
-        policy = new ChecksumPolicyGenerateIfAbsent();
-    }
-
-    @Override
-    ChecksumPolicy getPolicy() {
-        return policy;
-    }
-
-    @Override
-    public void checksumsMatch() {
-        boolean ok = policy.verifyChecksum(matchedChecksums);
-        Assert.assertTrue(ok, "Policy should pass if checksums are same");
-    }
-
-    @Override
-    public void checksumsDoesNotMatch() {
-        boolean ok = policy.verifyChecksum(notMatchedChecksums);
-        Assert.assertFalse(ok, "Policy should fail if checksums don't match");
-    }
-
-    @Override
-    public void noOriginalChecksum() {
-        boolean ok = policy.verifyChecksum(noOriginalChecksum);
-        Assert.assertTrue(ok, "Policy should ignore missing original checksums");
-    }
-
-    @Override
-    public void returnedChecksum() {
-        String checksum = policy.getChecksum(matchedChecksums);
-        Assert.assertEquals(checksum, matchedChecksums.getActual(), "Should always return the actual value");
-        checksum = policy.getChecksum(notMatchedChecksums);
-        Assert.assertEquals(checksum, notMatchedChecksums.getActual(), "Should always return the actual value");
-        checksum = policy.getChecksum(noOriginalChecksum);
-        Assert.assertEquals(checksum, noOriginalChecksum.getActual(), "Should always return the actual value");
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/io/checksum/policy/ChecksumPolicyIgnoreAndGenerateTest.java b/backend/core/src/test/java/org/artifactory/io/checksum/policy/ChecksumPolicyIgnoreAndGenerateTest.java
deleted file mode 100644
index ab65ac4..0000000
--- a/backend/core/src/test/java/org/artifactory/io/checksum/policy/ChecksumPolicyIgnoreAndGenerateTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.io.checksum.policy;
-
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-/**
- * Tests the ChecksumPolicyIgnoreAndGenerate.
- *
- * @author Yossi Shaul
- */
- at Test
-public class ChecksumPolicyIgnoreAndGenerateTest extends ChecksumPolicyBaseTest {
-    private ChecksumPolicyIgnoreAndGenerate policy;
-
-    @BeforeClass
-    public void createChecksumPolicy() {
-        policy = new ChecksumPolicyIgnoreAndGenerate();
-    }
-
-    @Override
-    ChecksumPolicy getPolicy() {
-        return policy;
-    }
-
-    @Override
-    public void checksumsMatch() {
-        boolean ok = policy.verifyChecksum(matchedChecksums);
-        Assert.assertTrue(ok, "Policy should ignore any checksum errors");
-    }
-
-    @Override
-    public void checksumsDoesNotMatch() {
-        boolean ok = policy.verifyChecksum(notMatchedChecksums);
-        Assert.assertTrue(ok, "Policy should ignore any checksum errors");
-    }
-
-    @Override
-    public void noOriginalChecksum() {
-        boolean ok = policy.verifyChecksum(noOriginalChecksum);
-        Assert.assertTrue(ok, "Policy should ignore any checksum errors");
-    }
-
-    @Override
-    public void returnedChecksum() {
-        String checksum = policy.getChecksum(matchedChecksums);
-        Assert.assertEquals(checksum, matchedChecksums.getActual(), "Should always return the actual value");
-        checksum = policy.getChecksum(notMatchedChecksums);
-        Assert.assertEquals(checksum, notMatchedChecksums.getActual(), "Should always return the actual value");
-        checksum = policy.getChecksum(noOriginalChecksum);
-        Assert.assertEquals(checksum, noOriginalChecksum.getActual(), "Should always return the actual value");
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/io/checksum/policy/ChecksumPolicyPassThruTest.java b/backend/core/src/test/java/org/artifactory/io/checksum/policy/ChecksumPolicyPassThruTest.java
deleted file mode 100644
index b2ab047..0000000
--- a/backend/core/src/test/java/org/artifactory/io/checksum/policy/ChecksumPolicyPassThruTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.io.checksum.policy;
-
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-/**
- * Tests the ChecksumPolicyPassThru class.
- *
- * @author Yossi Shaul
- */
- at Test
-public class ChecksumPolicyPassThruTest extends ChecksumPolicyBaseTest {
-    private ChecksumPolicyPassThru policy;
-
-    @BeforeClass
-    public void createChecksumPolicy() {
-        policy = new ChecksumPolicyPassThru();
-    }
-
-    @Override
-    ChecksumPolicy getPolicy() {
-        return policy;
-    }
-
-    @Override
-    public void checksumsMatch() {
-        boolean ok = policy.verifyChecksum(matchedChecksums);
-        Assert.assertTrue(ok, "Policy should pass if checksums are same");
-    }
-
-    @Override
-    public void checksumsDoesNotMatch() {
-        boolean ok = policy.verifyChecksum(notMatchedChecksums);
-        Assert.assertTrue(ok, "Policy should not fail even if checksums don't match");
-    }
-
-    @Override
-    public void noOriginalChecksum() {
-        boolean ok = policy.verifyChecksum(noOriginalChecksum);
-        Assert.assertTrue(ok, "Policy should not fail if original checksum is missing");
-    }
-
-    @Override
-    public void returnedChecksum() {
-        String checksum = policy.getChecksum(matchedChecksums);
-        Assert.assertEquals(checksum, matchedChecksums.getOriginal(), "Should always return the original value");
-        checksum = policy.getChecksum(notMatchedChecksums);
-        Assert.assertEquals(checksum, notMatchedChecksums.getOriginal(), "Should always return the original value");
-        checksum = policy.getChecksum(noOriginalChecksum);
-        Assert.assertNull(checksum, "Should always return the original value");
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/io/checksum/policy/LocalRepoChecksumPolicyTest.java b/backend/core/src/test/java/org/artifactory/io/checksum/policy/LocalRepoChecksumPolicyTest.java
deleted file mode 100644
index 29de583..0000000
--- a/backend/core/src/test/java/org/artifactory/io/checksum/policy/LocalRepoChecksumPolicyTest.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.io.checksum.policy;
-
-import com.google.common.collect.Sets;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.descriptor.repo.LocalRepoChecksumPolicyType;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.util.Set;
-
-import static org.artifactory.checksum.ChecksumType.md5;
-import static org.artifactory.checksum.ChecksumType.sha1;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNull;
-
-/**
- * Tests the LocalRepoChecksumPolicyTest class.
- *
- * @author Yossi Shaul
- */
- at Test
-public class LocalRepoChecksumPolicyTest extends ArtifactoryHomeBoundTest {
-    public static final String SERVER_SHA1 = "a234567890123456789012345678901234567890";
-    public static final String CLIENT_SHA1 = "b234567890123456789012345678901234567890";
-    public static final String SERVER_MD5 = "a2345678901234567890123456789012";
-    public static final String CLIENT_MD5 = "b2345678901234567890123456789012";
-
-    private Set<ChecksumInfo> checksums;
-
-    @BeforeClass
-    public void createChecksumPolicy() {
-        checksums = Sets.newHashSet(
-                new ChecksumInfo(sha1, CLIENT_SHA1, SERVER_SHA1),
-                new ChecksumInfo(md5, CLIENT_MD5, SERVER_MD5));
-    }
-
-    public void clientPolicyType() {
-        LocalRepoChecksumPolicy policy = new LocalRepoChecksumPolicy(); // client type is the default
-        assertEquals(policy.getChecksum(sha1, checksums), CLIENT_SHA1);
-        assertEquals(policy.getChecksum(md5, checksums), CLIENT_MD5);
-    }
-
-    public void serverPolicyType() {
-        LocalRepoChecksumPolicy policy = new LocalRepoChecksumPolicy();
-        policy.setPolicyType(LocalRepoChecksumPolicyType.SERVER);
-        assertEquals(policy.getChecksum(sha1, checksums), SERVER_SHA1);
-        assertEquals(policy.getChecksum(md5, checksums), SERVER_MD5);
-    }
-
-    public void checksumTypeNotFound() {
-        LocalRepoChecksumPolicy policy = new LocalRepoChecksumPolicy();
-        Set<ChecksumInfo> empty = Sets.newHashSet();
-        assertNull(policy.getChecksum(sha1, empty));
-        assertNull(policy.getChecksum(md5, empty));
-    }
-
-    public void checksumValueNotFound() {
-        LocalRepoChecksumPolicy policy = new LocalRepoChecksumPolicy();
-        Set<ChecksumInfo> noOriginal = Sets.newHashSet(new ChecksumInfo(sha1, null, SERVER_SHA1));
-        assertNull(policy.getChecksum(sha1, noOriginal));
-
-        policy.setPolicyType(LocalRepoChecksumPolicyType.SERVER);
-        assertEquals(policy.getChecksum(sha1, noOriginal), SERVER_SHA1);
-    }
-
-    public void checksumOfMetadata() {
-        LocalRepoChecksumPolicy policy = new LocalRepoChecksumPolicy();
-        RepoPath metadataPath = InternalRepoPathFactory.create("repo", "test/test/1.0/maven-metadata.xml");
-        assertEquals(policy.getChecksum(sha1, checksums, metadataPath), SERVER_SHA1);
-
-        policy.setPolicyType(LocalRepoChecksumPolicyType.SERVER);
-        assertEquals(policy.getChecksum(sha1, checksums, metadataPath), SERVER_SHA1);
-    }
-
-    public void checksumOfSnapshotMetadata() {
-        LocalRepoChecksumPolicy policy = new LocalRepoChecksumPolicy();
-        RepoPath metadataPath = InternalRepoPathFactory.create("repo", "test/test/1.0-SNAPSHOT/maven-metadata.xml");
-        assertEquals(policy.getChecksum(sha1, checksums, metadataPath), SERVER_SHA1);
-
-        policy.setPolicyType(LocalRepoChecksumPolicyType.SERVER);
-        assertEquals(policy.getChecksum(sha1, checksums, metadataPath), SERVER_SHA1);
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/test/java/org/artifactory/maven/WorkQueueTest.java b/backend/core/src/test/java/org/artifactory/maven/WorkQueueTest.java
deleted file mode 100644
index eff7a1e..0000000
--- a/backend/core/src/test/java/org/artifactory/maven/WorkQueueTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.artifactory.maven;
-
-import ch.qos.logback.classic.Level;
-import org.artifactory.test.TestUtils;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import static org.fest.assertions.Assertions.assertThat;
-
-/**
- * Unit tests for the {@link WorkQueue}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class WorkQueueTest {
-
-    @BeforeClass
-    public void setup() {
-        TestUtils.setLoggingLevel(WorkQueue.class, Level.TRACE);
-    }
-
-    public void offerTheSameWorkConcurrently() throws InterruptedException {
-        List<AtomicInteger> counts = Collections.nCopies(10, new AtomicInteger(0));
-        WorkQueue<Integer> wq = new WorkQueue<>("Test Queue", workItem -> counts.get(workItem).incrementAndGet());
-
-        ExecutorService executorService = Executors.newFixedThreadPool(20);
-        for (int i = 0; i < 10; i++) {
-            for (int j = 0; j < 10; j++) {
-                final int finalI = i;
-                executorService.submit(() -> wq.offerWork(finalI));
-            }
-        }
-
-        executorService.shutdown();
-        executorService.awaitTermination(1500, TimeUnit.SECONDS);
-        // We expect each job to be executed at least once
-        counts.forEach(count -> assertThat(count.get()).isGreaterThanOrEqualTo(1));
-    }
-
-    public void offerWorkWithNWorkers() throws InterruptedException {
-        List<AtomicInteger> counts = Collections.nCopies(1000, new AtomicInteger(0));
-        WorkQueue<Integer> wq = new WorkQueue<>("Test Queue", 4, workItem -> counts.get(workItem).incrementAndGet());
-
-        ExecutorService executorService = Executors.newFixedThreadPool(20);
-        for (int i = 0; i < 10; i++) {
-            for (int j = 0; j < 10; j++) {
-                final int finalI = i;
-                executorService.submit(() -> wq.offerWork(finalI));
-            }
-        }
-
-        executorService.shutdown();
-        executorService.awaitTermination(1500, TimeUnit.SECONDS);
-        // We expect each job to be executed at least once
-        counts.forEach(count -> assertThat(count.get()).isGreaterThanOrEqualTo(1));
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/maven/versioning/CreationDateMavenMetadataVersionComparatorTest.java b/backend/core/src/test/java/org/artifactory/maven/versioning/CreationDateMavenMetadataVersionComparatorTest.java
deleted file mode 100644
index d0c146d..0000000
--- a/backend/core/src/test/java/org/artifactory/maven/versioning/CreationDateMavenMetadataVersionComparatorTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven.versioning;
-
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.MutableFileInfo;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.storage.fs.tree.FileNode;
-import org.artifactory.storage.fs.tree.ItemNode;
-import org.testng.annotations.Test;
-
-import java.util.concurrent.TimeUnit;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Tests {@link CreationDateMavenMetadataVersionComparator}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class CreationDateMavenMetadataVersionComparatorTest {
-
-    public void compare() {
-        CreationDateMavenMetadataVersionComparator comparator = new CreationDateMavenMetadataVersionComparator();
-
-        MutableFileInfo olderFileInfo = InfoFactoryHolder.get().createFileInfo(new RepoPathImpl("repo", "2.0"));
-        olderFileInfo.setCreated(System.currentTimeMillis());
-        ItemNode older = new FileNode(olderFileInfo);
-
-        MutableFileInfo newerFileInfo = InfoFactoryHolder.get().createFileInfo(new RepoPathImpl("repo", "1.1"));
-        newerFileInfo.setCreated(System.currentTimeMillis() + TimeUnit.HOURS.toMillis(2));
-        ItemNode newer = new FileNode(newerFileInfo);
-
-        assertEquals(comparator.compare(older, newer), -1, "The comparison should be time based");
-
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/maven/versioning/MavenMetadataVersionComparatorTest.java b/backend/core/src/test/java/org/artifactory/maven/versioning/MavenMetadataVersionComparatorTest.java
deleted file mode 100644
index d260e02..0000000
--- a/backend/core/src/test/java/org/artifactory/maven/versioning/MavenMetadataVersionComparatorTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven.versioning;
-
-import org.apache.commons.lang.SystemUtils;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.MutableFileInfo;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.storage.fs.tree.FileNode;
-import org.artifactory.storage.fs.tree.ItemNode;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
-
-/**
- * Tests {@link org.artifactory.maven.versioning.VersionNameMavenMetadataVersionComparator}. Additional tests for
- * various version strings are in {@link MavenVersionComparatorTest}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class MavenMetadataVersionComparatorTest {
-    static String[] versionsJetty = new String[]{
-            "6.0.1", "6.1.0pre1", "6.1.0pre2", "6.0.2", "6.1.0pre3", "6.1.0rc0", "6.1.0rc1", "6.1.0rc2", "6.1.0rc3",
-            "6.1.0", "6.1.1rc0", "6.1.1rc1", "6.1.1", "6.1.2pre0", "6.1.2pre1", "6.1.2rc0", "6.1.2rc1", "6.1.2rc2",
-            "6.1.2rc4", "6.1.2rc5", "6.1.2", "6.1.3", "6.1.4rc0", "6.1.4rc1", "6.1H.4rc1", "6.1.4", "6.1H.4-beta",
-            "6.1.5rc0", "6.1.5", "6.1H.5-beta", "6.1.6rc0", "6.1.6rc1", "6.1.6", "6.1H.6", "6.1.7", "6.1H.7", "6.1.8",
-            "6.1H.8", "6.1.9", "7.0.0pre0", "7.0.0pre1", "6.1.10", "6.1.11", "6.1H.10", "7.0.0pre2", "6.1.12rc1",
-            "7.0.0pre3", "6.1.12.rc2", "6.1.12.rc3", "6.1.12.rc4", "7.0.0.pre4", "6.1.12.rc5", "7.0.0.pre5", "6.1.12",
-            "6.1.14", "6.1H.14", "6.1H.14.1", "6.1.15.pre0", "6.1.15.rc2", "6.1.15.rc3", "6.1.15.rc4", "6.1.15.rc5",
-            "6.1.15", "6.1.16", "6.1H.22", "6.1.17", "6.1.18", "6.1.19", "6.1.20", "6.1.21", "6.1.22", "6.1.23",
-            "6.1.24", "6.1.25", "6.1.26RC0", "6.1.26"
-    };
-
-    public void compare1And2() {
-        VersionNameMavenMetadataVersionComparator comparator = new VersionNameMavenMetadataVersionComparator();
-
-        MutableFileInfo olderFileInfo = InfoFactoryHolder.get().createFileInfo(new RepoPathImpl("repo", "2.0"));
-        olderFileInfo.setCreated(System.currentTimeMillis());
-        ItemNode older = new FileNode(olderFileInfo);
-
-        MutableFileInfo newerFileInfo = InfoFactoryHolder.get().createFileInfo(new RepoPathImpl("repo", "1.1"));
-        newerFileInfo.setCreated(System.currentTimeMillis() + TimeUnit.HOURS.toMillis(2));
-        ItemNode newer = new FileNode(newerFileInfo);
-
-        assertEquals(comparator.compare(older, newer), 1, "The comparison should be version name based");
-
-    }
-
-    public void compareComplicatedJetty() {
-        MavenVersionComparator versionComparator = new MavenVersionComparator();
-        List<String> testList = new ArrayList<String>(versionsJetty.length);
-        Collections.addAll(testList, versionsJetty);
-        Iterator<String> it = testList.iterator();
-        while (it.hasNext()) {
-            String version = it.next();
-            if (version.contains("pre")) {
-                it.remove();
-            }
-        }
-        // Without pre we are OK
-        Collections.sort(testList, versionComparator);
-        try {
-            // On the full list will fail on comparison contract
-            Arrays.sort(versionsJetty, versionComparator);
-            assertTrue(!SystemUtils.IS_JAVA_1_7, "Should have get comparison contract error!");
-        } catch (IllegalArgumentException e) {
-            assertEquals(e.getMessage(), "Comparison method violates its general contract!");
-            Arrays.sort(versionsJetty);
-        }
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/maven/versioning/MavenVersionComparatorTest.java b/backend/core/src/test/java/org/artifactory/maven/versioning/MavenVersionComparatorTest.java
deleted file mode 100644
index 879b39d..0000000
--- a/backend/core/src/test/java/org/artifactory/maven/versioning/MavenVersionComparatorTest.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven.versioning;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
-
-/**
- * Tests the {@link MavenVersionComparator}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class MavenVersionComparatorTest {
-    private final MavenVersionComparator comparator = new MavenVersionComparator();
-
-    public void numericMajorVersionOnly() {
-        assertEquals(comparator.compare("1", "2"), -1, "2>1");
-        assertEquals(comparator.compare("2", "1"), 1, "2>1");
-        assertEquals(comparator.compare("3", "3"), 0, "3=3");
-    }
-
-    public void numericMajorMinor() {
-        assertEquals(comparator.compare("1.13", "2.0"), -1, "2.0>1.1");
-        assertEquals(comparator.compare("5.06", "5.08"), -1, "5.06<5.08");
-        assertEquals(comparator.compare("5.06", "5"), 1, "5<5.06");
-        assertEquals(comparator.compare("5.0", "5"), 0, "5.0=5");
-    }
-
-    public void numericMajorMinorBug() {
-        assertEquals(comparator.compare("2.1.2", "2.1.3"), -1, "2.1.3>2.1.2");
-        assertEquals(comparator.compare("2.2.2", "2.1.3"), 1, "2.1.3<2.2.2");
-        assertEquals(comparator.compare("2.2.2", "3.2.2"), -1, "2.2.2<3.2.2");
-
-        assertEquals(comparator.compare("2.2.2", "3"), -1, "2.2.2<3");
-        assertEquals(comparator.compare("2.2.2", "3.0"), -1, "2.2.2<3.0");
-        assertEquals(comparator.compare("2.2.2", "3.0.0"), -1, "2.2.2<3.0.0");
-    }
-
-    public void alphaBetaMilestoneRcGaVersions() {
-
-        // alpha before beta
-        assertEquals(comparator.compare("2.1.0-alpha", "2.1.0-alpha-1"), -1, "2.1.0-alpha<2.1.0-alpha-1");
-        assertEquals(comparator.compare("2.1.0-alpha-1", "2.1.0-alpha-2"), -1, "2.1.0-alpha-1<2.1.0-alpha-2");
-        assertEquals(comparator.compare("2.1.0-alpha-2", "2.1.0-beta-1"), -1, "2.1.0-alpha-2<2.1.0-beta-1");
-
-        // beta before release candidate
-        assertTrue(comparator.compare("2.1.0-beta-2", "2.1.0-rc") < -1, "2.1.0-beta-2<2.1.0-rc");
-        assertTrue(comparator.compare("2.1.0-beta-2", "2.1.0-rc-1") < -1, "2.1.0-beta-2<2.1.0-rc-1");
-
-        // beta before milestone
-        assertTrue(comparator.compare("2.1.0-alpha-1", "2.1.0-m1") < -1, "2.1.0-alpha-1<2.1.0-m1");
-        assertTrue(comparator.compare("2.1.0-beta-1", "2.1.0-m-1") < -1, "2.1.0-beta-1<2.1.0-m-1");
-
-        // milestone before release candidate
-        assertTrue(comparator.compare("2.1.0-m1", "2.1.0-ga") < -1, "2.1.0-m1<2.1.0-ga");
-        assertTrue(comparator.compare("2.1.0-m5", "2.1.0-ga-1") < -1, "2.1.0-m5<2.1.0-ga-1");
-
-        // release candidate before general availability
-        assertEquals(comparator.compare("2.1.0-rc-1", "2.1.0-ga"), -1, "2.1.0-rc-1<2.1.0-ga");
-        assertEquals(comparator.compare("2.1.0-ga", "2.1.0-ga-1"), -1, "2.1.0-ga<2.1.0-ga-1");
-
-        // final are equals
-        assertEquals(comparator.compare("5.1-ga", "5.1"), 0, "5.1-ga=5.1");
-        assertEquals(comparator.compare("5.1-ga", "5.1-final"), 0, "5.1-ga=5.1-final");
-
-        // release is better
-        assertTrue(comparator.compare("4.0.0", "4.0.0-alpha") > 1, "4.0.0>4.0.0-alpha");
-        assertTrue(comparator.compare("4.0.0", "4.0.0-beta") > 1, "4.0.0>4.0.0-beta");
-        assertEquals(comparator.compare("4.0.0", "4.0.0-rc"), 1, "4.0.0>4.0.0-rc");
-        assertEquals(comparator.compare("4.0.0", "4.0.0-rc1"), 1, "4.0.0>4.0.0-rc1");
-        assertEquals(comparator.compare("4.0.0", "4.0.0-rc6"), 1, "4.0.0>4.0.0-rc6");
-    }
-
-    public void snapshotVersions() {
-        assertEquals(comparator.compare("2.1.0-alpha", "2.1.0-SNAPSHOT"), 1, "2.1.0-alpha>2.1.0-SNAPSHOT");
-        assertTrue(comparator.compare("2.1.0", "2.1.0-SNAPSHOT") > 1, "2.1.0>2.1.0-SNAPSHOT");
-    }
-
-}
diff --git a/backend/core/src/test/java/org/artifactory/repo/DbRepoTest.java b/backend/core/src/test/java/org/artifactory/repo/DbRepoTest.java
deleted file mode 100644
index c565f20..0000000
--- a/backend/core/src/test/java/org/artifactory/repo/DbRepoTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import org.artifactory.api.context.ArtifactoryContextThreadBinder;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.common.StatusHolder;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.repo.db.DbLocalRepo;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.spring.InternalArtifactoryContext;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.artifactory.util.RepoLayoutUtils;
-import org.easymock.EasyMock;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * Unit tests for the DbRepo.
- *
- * @author Noam Tenne
- */
-public class DbRepoTest extends ArtifactoryHomeBoundTest {
-    @Test
-    public void testNoFilePermission() {
-        AuthorizationService authService = EasyMock.createMock(AuthorizationService.class);
-
-        InternalArtifactoryContext context = EasyMock.createMock(InternalArtifactoryContext.class);
-        EasyMock.expect(context.getAuthorizationService()).andReturn(authService);
-        EasyMock.replay(context);
-        ArtifactoryContextThreadBinder.bind(context);
-
-        InternalRepositoryService irs = EasyMock.createMock(InternalRepositoryService.class);
-        EasyMock.replay(irs);
-
-        LocalRepoDescriptor lrd = new LocalRepoDescriptor();
-        lrd.setKey("libs");
-        lrd.setRepoLayout(RepoLayoutUtils.MAVEN_2_DEFAULT);
-        DbLocalRepo dbLocalRepo = new DbLocalRepo<>(lrd, irs, null);
-        RepoPath path = InternalRepoPathFactory.create("libs", "jfrog/settings/jfrog-settings-sources.zip");
-        EasyMock.expect(authService.canRead(path)).andReturn(false);
-        EasyMock.expect(authService.currentUsername()).andReturn("testUser");
-        EasyMock.replay(authService);
-
-        StatusHolder holder = dbLocalRepo.checkDownloadIsAllowed(path);
-        Assert.assertTrue(holder.isError(), "User should not have access to src files");
-        EasyMock.verify(context, authService, irs);
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/repo/HttpRepoTest.java b/backend/core/src/test/java/org/artifactory/repo/HttpRepoTest.java
deleted file mode 100644
index e9ef4ea..0000000
--- a/backend/core/src/test/java/org/artifactory/repo/HttpRepoTest.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import org.apache.http.client.HttpClient;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.HaAddon;
-import org.artifactory.addon.LayoutsCoreAddon;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ArtifactoryContextThreadBinder;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.repo.HttpRepoDescriptor;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.repo.http.IdleConnectionMonitorService;
-import org.artifactory.repo.http.IdleConnectionMonitorServiceImpl;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.spring.InternalArtifactoryContext;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.artifactory.test.ArtifactoryHomeStub;
-import org.easymock.EasyMock;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-
-/**
- * @author Yoav Landman
- */
-public class HttpRepoTest extends ArtifactoryHomeBoundTest {
-    private InternalRepositoryService internalRepoService;
-    private IdleConnectionMonitorService idleConnectionMonitorService;
-    private ArtifactoryContext contextMock;
-
-    @BeforeClass
-    public void setup() {
-
-        bindArtifactoryHome();
-
-        getBound().setProperty(ConstantValues.idleConnectionMonitorInterval, "10");
-        getBound().setProperty(ConstantValues.disableIdleConnectionMonitoring, "false");
-        idleConnectionMonitorService = new IdleConnectionMonitorServiceImpl();
-
-        internalRepoService = EasyMock.createMock(InternalRepositoryService.class);
-        AddonsManager addonsManager = EasyMock.createMock(AddonsManager.class);
-        LayoutsCoreAddon layoutsCoreAddon = EasyMock.createMock(LayoutsCoreAddon.class);
-        HaAddon haAddon = EasyMock.createMock(HaAddon.class);
-        EasyMock.expect(addonsManager.addonByType(LayoutsCoreAddon.class)).andReturn(layoutsCoreAddon);
-        EasyMock.expect(addonsManager.addonByType(HaAddon.class)).andReturn(haAddon);
-        contextMock = EasyMock.createMock(InternalArtifactoryContext.class);
-        EasyMock.expect(contextMock.beanForType(AddonsManager.class)).andReturn(addonsManager).anyTimes();
-        EasyMock.expect(contextMock.beanForType(IdleConnectionMonitorService.class))
-                .andReturn(idleConnectionMonitorService).anyTimes();
-        ArtifactoryContextThreadBinder.bind(contextMock);
-        EasyMock.replay(contextMock, addonsManager);
-    }
-
-    @AfterClass
-    public void tearDown() {
-        bindArtifactoryHome();
-        ArtifactoryContextThreadBinder.unbind();
-    }
-
-    @Test
-    public void testProxyRemoteAuthAndMultihome() throws IOException {
-        ProxyDescriptor proxyDescriptor = new ProxyDescriptor();
-        proxyDescriptor.setHost("proxyHost");
-        proxyDescriptor.setUsername("proxy-username");
-        proxyDescriptor.setPassword("proxy-password");
-
-        HttpRepoDescriptor httpRepoDescriptor = new HttpRepoDescriptor();
-        httpRepoDescriptor.setUrl("http://test");
-
-        httpRepoDescriptor.setProxy(proxyDescriptor);
-
-        httpRepoDescriptor.setUsername("repo-username");
-        httpRepoDescriptor.setPassword("repo-password");
-
-        httpRepoDescriptor.setLocalAddress("0.0.0.0");
-
-        HttpRepo httpRepo = new HttpRepo(httpRepoDescriptor, internalRepoService, false, null);
-        CloseableHttpClient client = httpRepo.createHttpClient();
-        if(client!=null) client.close();
-
-        //TODO: [by YS] implement test on httpclient4
-        /*Credentials proxyCredentials = client.getState().getProxyCredentials(AuthScope.ANY);
-        Assert.assertNotNull(proxyCredentials);
-        Assert.assertTrue(proxyCredentials instanceof UsernamePasswordCredentials,
-                "proxyCredentials are of the wrong class");
-        Assert.assertEquals(((UsernamePasswordCredentials) proxyCredentials).getUserName(), "proxy-username");
-        Assert.assertEquals(proxyCredentials.getPassword(), "proxy-password");
-
-        Credentials repoCredentials = client.getState().getCredentials(
-                new AuthScope("test", AuthScope.ANY_PORT, AuthScope.ANY_REALM));
-        Assert.assertNotNull(repoCredentials);
-        Assert.assertTrue(repoCredentials instanceof UsernamePasswordCredentials,
-                "repoCredentials are of the wrong class");
-        Assert.assertEquals(((UsernamePasswordCredentials) repoCredentials).getUserName(), "repo-username");
-        Assert.assertEquals(repoCredentials.getPassword(), "repo-password");
-
-        Assert.assertEquals(client.getHostConfiguration().getLocalAddress().getHostAddress(), "0.0.0.0");*/
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/test/java/org/artifactory/repo/RemoteRepoBaseTest.java b/backend/core/src/test/java/org/artifactory/repo/RemoteRepoBaseTest.java
deleted file mode 100644
index 7ce90e2..0000000
--- a/backend/core/src/test/java/org/artifactory/repo/RemoteRepoBaseTest.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import org.apache.commons.io.IOUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.HaAddon;
-import org.artifactory.addon.LayoutsCoreAddon;
-import org.artifactory.api.context.ArtifactoryContextThreadBinder;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.common.StatusHolder;
-import org.artifactory.descriptor.repo.HttpRepoDescriptor;
-import org.artifactory.io.checksum.ChecksumUtil;
-import org.artifactory.repo.db.DbCacheRepo;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.spring.InternalArtifactoryContext;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.artifactory.util.RepoLayoutUtils;
-import org.easymock.EasyMock;
-import org.springframework.test.util.ReflectionTestUtils;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import java.io.InputStream;
-
-/**
- * This class tests the behaviour of the allowsDownloadMethod and checks that it returns the proper results on different
- * scenarios
- *
- * @author Noam Tenne
- */
-public class RemoteRepoBaseTest extends ArtifactoryHomeBoundTest {
-    AuthorizationService authService = EasyMock.createNiceMock(AuthorizationService.class);
-    InternalRepositoryService internalRepoService = EasyMock.createMock(InternalRepositoryService.class);
-    InternalArtifactoryContext context = EasyMock.createMock(InternalArtifactoryContext.class);
-    AddonsManager addonsManager = EasyMock.createMock(AddonsManager.class);
-    LayoutsCoreAddon layoutsCoreAddon = EasyMock.createMock(LayoutsCoreAddon.class);
-    HaAddon haAddon = EasyMock.createMock(HaAddon.class);
-
-    HttpRepoDescriptor httpRepoDescriptor = new HttpRepoDescriptor();
-    HttpRepo httpRepo;
-    RepoPath repoPath = InternalRepoPathFactory.create("remote-repo-cache", "test/test/1.0/test-1.0.jar");
-
-    @BeforeClass
-    public void setup() {
-        EasyMock.expect(context.getAuthorizationService()).andReturn(authService).anyTimes();
-        EasyMock.expect(context.beanForType(AddonsManager.class)).andReturn(addonsManager).anyTimes();
-        EasyMock.expect(addonsManager.addonByType(LayoutsCoreAddon.class)).andReturn(layoutsCoreAddon).anyTimes();
-        EasyMock.expect(addonsManager.addonByType(HaAddon.class)).andReturn(haAddon).anyTimes();
-        EasyMock.replay(authService, context, addonsManager);
-        ArtifactoryContextThreadBinder.bind(context);
-        httpRepoDescriptor.setRepoLayout(RepoLayoutUtils.MAVEN_2_DEFAULT);
-        httpRepo = new HttpRepo(httpRepoDescriptor, internalRepoService, false, null);
-    }
-
-    /**
-     * Try to download with ordinary path
-     */
-    @Test
-    public void testDownloadWithCachePrefix() {
-        expectCanRead(true);
-        createCacheRepo();
-        StatusHolder statusHolder = tryAllowsDownload(repoPath);
-        Assert.assertFalse(statusHolder.isError());
-    }
-
-    /**
-     * Try to download while supplying a path with no "-cache" prefix
-     */
-    @Test
-    public void testDownloadWithNoCachePrefix() {
-        RepoPath repoPathNoPrefix = InternalRepoPathFactory.create("remote-repo", "test/test/1.0/test-1.0.jar");
-        expectCanRead(true);
-        createCacheRepo();
-        StatusHolder statusHolder = tryAllowsDownload(repoPathNoPrefix);
-        Assert.assertFalse(statusHolder.isError());
-    }
-
-    /**
-     * Try to download when Anonymous mode is enabled
-     */
-    @Test
-    public void testDownloadWithAnonymousEnabledAndNoReadPermissions() {
-        expectCanRead(false);       // don't give read access
-        createCacheRepo();   // and enable anon
-        StatusHolder statusHolder = tryAllowsDownload(repoPath);
-        Assert.assertTrue(statusHolder.isError());
-    }
-
-    /**
-     * Try to download when the repo is blacked out
-     */
-    @Test
-    public void testDownloadWithBlackedOut() {
-        httpRepoDescriptor.setBlackedOut(true);
-        createCacheRepo();
-        StatusHolder statusHolder = tryAllowsDownload(repoPath);
-        Assert.assertTrue(statusHolder.isError());
-        httpRepoDescriptor.setBlackedOut(false);
-    }
-
-    /**
-     * Try to download when the repo does not serve releases
-     */
-    @Test
-    public void testDownloadWithNoReleases() {
-        httpRepoDescriptor.setHandleReleases(false);
-        createCacheRepo();
-        StatusHolder statusHolder = tryAllowsDownload(repoPath);
-        Assert.assertTrue(statusHolder.isError());
-        httpRepoDescriptor.setHandleReleases(true);
-    }
-
-    /**
-     * Try to download when requested resource is excluded
-     */
-    @Test
-    public void testDownloadWithExcludes() {
-        httpRepoDescriptor.setExcludesPattern("test/test/1.0/**");
-        createCacheRepo();
-        StatusHolder statusHolder = tryAllowsDownload(repoPath);
-        Assert.assertTrue(statusHolder.isError());
-        httpRepoDescriptor.setExcludesPattern("");
-    }
-
-    /**
-     * Verify reading of valid checksum file to test the {@link ChecksumUtil#checksumStringFromStream(InputStream)}
-     * method
-     */
-    @Test
-    public void testReadValidChecksum() throws Exception {
-        invokeReadChecksum("valid", "dasfasdf4r234234q32asdfadfasasdfasdf");
-    }
-
-    /**
-     * Verify reading of a checksum file containing comments to test the {@link ChecksumUtil#checksumStringFromStream(InputStream)}
-     * method
-     */
-    @Test
-    public void testReadCommentChecksum() throws Exception {
-        invokeReadChecksum("comment", "asdfaeaef435345435asdf");
-    }
-
-    /**
-     * Verify reading of a checksum file containing file description to test the {@link
-     * ChecksumUtil#checksumStringFromStream(InputStream)} method
-     */
-    @Test
-    public void testReadDescChecksum() throws Exception {
-        invokeReadChecksum("desc", "dasfasdf4r234234q32asdfadfasdf");
-    }
-
-    /**
-     * Verify reading of an empty checksum file to test the {@link ChecksumUtil#checksumStringFromStream(InputStream)}
-     * method
-     */
-    @Test
-    public void testReadEmptyChecksum() throws Exception {
-        invokeReadChecksum("empty", "");
-    }
-
-    /**
-     * Check the different values that are read from the given checksum are as expected
-     *
-     * @param checksumType  Type of checksum test file to read
-     * @param expectedValue Expected checksum value
-     */
-    private void invokeReadChecksum(String checksumType, String expectedValue) throws Exception {
-        InputStream stream = getClass().getResourceAsStream("/org/artifactory/repo/test-" + checksumType + ".md5");
-        try {
-            String checksum = ChecksumUtil.checksumStringFromStream(stream);
-            Assert.assertEquals(expectedValue, checksum, "Incorrect checksum value returned.");
-        } finally {
-            IOUtils.closeQuietly(stream);
-        }
-    }
-
-    private void createCacheRepo() {
-        httpRepoDescriptor.setKey("remote-repo");
-        DbCacheRepo localCacheRepo = new DbCacheRepo(httpRepo, null);
-        ReflectionTestUtils.setField(httpRepo, "localCacheRepo", localCacheRepo);
-    }
-
-    private void expectCanRead(boolean canRead) {
-        EasyMock.expect(authService.canRead(repoPath)).andReturn(canRead);
-        EasyMock.replay(authService);
-    }
-
-    /**
-     * Try to download the the given path
-     *
-     * @param path Repopath to test the download with
-     * @return StatusHolder - Contains any errors which might be monitored
-     */
-    private StatusHolder tryAllowsDownload(RepoPath path) {
-        StatusHolder statusHolder = httpRepo.checkDownloadIsAllowed(path);
-        return statusHolder;
-    }
-
-    /**
-     * Resets the mock objects after every test method to make sure the numbers of the expected method calls are exact
-     */
-    @BeforeMethod
-    private void resetMocks() {
-        EasyMock.reset(authService);
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/repo/RepoPathFactoryTest.java b/backend/core/src/test/java/org/artifactory/repo/RepoPathFactoryTest.java
deleted file mode 100644
index 08e524c..0000000
--- a/backend/core/src/test/java/org/artifactory/repo/RepoPathFactoryTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import org.artifactory.model.common.RepoPathImpl;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
-
-/**
- * @author Yoav Landman
- */
- at Test
-public class RepoPathFactoryTest {
-
-    public void testRepoPathFactory() {
-        RepoPath repoPath = InternalRepoPathFactory.create("repox", "/a/b/c/");
-        assertEquals(repoPath, InternalRepoPathFactory.create("repox", "/a/b/c/"));
-        assertEquals(repoPath, InternalRepoPathFactory.create("repox", "a/b/c"));
-        assertEquals(repoPath, InternalRepoPathFactory.create("repox", "a/b/c/"));
-        assertEquals(repoPath, InternalRepoPathFactory.create("repox", "/a/b/c"));
-    }
-
-    public void pathWithLeadingSlash() {
-        assertEquals(RepoPathFactory.create("/a/b/c"), new RepoPathImpl("a", "b/c"));
-        assertEquals(RepoPathFactory.create("/a"), new RepoPathImpl("a", ""));
-    }
-
-    public void rootRepositoryPathSingleArgument() {
-        RepoPath repoPath = RepoPathFactory.create("myrepo");
-        assertEquals(repoPath.getRepoKey(), "myrepo");
-        assertEquals(repoPath.getPath(), "");
-        assertTrue(repoPath.isFolder());
-        assertTrue(repoPath.isRoot());
-    }
-
-    public void rootRepositoryPath() {
-        RepoPath repoPath = RepoPathFactory.create("myrepo", "");
-        assertEquals(repoPath.getRepoKey(), "myrepo");
-        assertEquals(repoPath.getPath(), "");
-        assertTrue(repoPath.isFolder());
-        assertTrue(repoPath.isRoot());
-    }
-
-    public void singleArgumentFactoryFolder() {
-        RepoPath repoPath = RepoPathFactory.create("myrepo/a/b/c/");
-        assertEquals(repoPath.getRepoKey(), "myrepo");
-        assertEquals(repoPath.getPath(), "a/b/c");
-        assertTrue(repoPath.isFolder());
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/test/java/org/artifactory/repo/cache/expirable/vcs/GitRefsCacheExpirableTest.java b/backend/core/src/test/java/org/artifactory/repo/cache/expirable/vcs/GitRefsCacheExpirableTest.java
deleted file mode 100644
index 37ac121..0000000
--- a/backend/core/src/test/java/org/artifactory/repo/cache/expirable/vcs/GitRefsCacheExpirableTest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.artifactory.repo.cache.expirable.vcs;
-
-import org.artifactory.descriptor.repo.LocalCacheRepoDescriptor;
-import org.artifactory.repo.LocalCacheRepo;
-import org.testng.annotations.Test;
-
-import static org.easymock.EasyMock.*;
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
- at Test
-public class GitRefsCacheExpirableTest {
-
-    public void testExpirable() throws Exception {
-        LocalCacheRepoDescriptor descriptor = createMock(LocalCacheRepoDescriptor.class);
-
-        LocalCacheRepo repo = createMock(LocalCacheRepo.class);
-        expect(repo.getDescriptor()).andReturn(descriptor).anyTimes();
-
-        replay(descriptor, repo);
-
-        GitRefsCacheExpirable expirable = new GitRefsCacheExpirable();
-        assertFalse(expirable.isExpirable(repo, "refs.tar.gz"));
-        assertFalse(expirable.isExpirable(repo, "gitrefs.tgz"));
-        assertFalse(expirable.isExpirable(repo, "gitrefs.zip"));
-        assertTrue(expirable.isExpirable(repo, "gitrefs"));
-        assertTrue(expirable.isExpirable(repo, "bla/gitrefs"));
-        assertTrue(expirable.isExpirable(repo, "twbs/bootstrap/gitrefs"));
-
-        verify(descriptor, repo);
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/test/java/org/artifactory/repo/cahce/expirable/CacheExpiryImplTest.java b/backend/core/src/test/java/org/artifactory/repo/cahce/expirable/CacheExpiryImplTest.java
deleted file mode 100644
index 21e0d6c..0000000
--- a/backend/core/src/test/java/org/artifactory/repo/cahce/expirable/CacheExpiryImplTest.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cahce.expirable;
-
-import com.google.common.collect.Maps;
-import org.artifactory.repo.LocalCacheRepo;
-import org.artifactory.repo.cache.expirable.CacheExpirable;
-import org.artifactory.repo.cache.expirable.CacheExpiryImpl;
-import org.artifactory.spring.ArtifactoryApplicationContext;
-import org.easymock.EasyMock;
-import org.testng.annotations.Test;
-
-import java.util.Map;
-
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-/**
- * @author Noam Y. Tenne
- */
-public class CacheExpiryImplTest {
-
-    @Test(expectedExceptions = NullPointerException.class)
-    public void testInitWithNullContext() throws Exception {
-        new CacheExpiryImpl().init();
-    }
-
-    @Test
-    public void testInitWithNullBeanName() throws Exception {
-        ArtifactoryApplicationContext context = EasyMock.createMock(ArtifactoryApplicationContext.class);
-        EasyMock.expect(context.beansForType(CacheExpirable.class))
-                .andReturn(Maps.<String, CacheExpirable>newHashMap());
-        EasyMock.expect(context.getBean(EasyMock.<String>isNull())).andReturn(null);
-
-        EasyMock.replay(context);
-        CacheExpiryImpl cacheExpiry = new CacheExpiryImpl();
-        cacheExpiry.setApplicationContext(context);
-        cacheExpiry.init();
-        EasyMock.verify(context);
-    }
-
-    @Test
-    public void testIsExpirableWithNullPath() throws Exception {
-        assertFalse(new CacheExpiryImpl().isExpirable(null, null), "Null path should never be expirable.");
-    }
-
-    @Test
-    public void testIsExpirableWithValidPathAndNoExpirables() throws Exception {
-        assertFalse(new CacheExpiryImpl().isExpirable(null, "afdafasdf"),
-                "Nothing should be expirable when no expiry criteria is set.");
-    }
-
-    @Test
-    public void testIsNotExpirable() throws Exception {
-        LocalCacheRepo localCacheRepo = EasyMock.createMock(LocalCacheRepo.class);
-        CacheExpirable rootExpirable = EasyMock.createMock(CacheExpirable.class);
-        CacheExpirable denyingExpirable = EasyMock.createMock(CacheExpirable.class);
-        EasyMock.expect(denyingExpirable.isExpirable(EasyMock.anyObject(LocalCacheRepo.class),
-                EasyMock.<String>anyObject())).andReturn(false);
-
-        Map<String, CacheExpirable> expirableHashMap = Maps.newHashMap();
-        expirableHashMap.put("root", rootExpirable);
-        expirableHashMap.put("denying", denyingExpirable);
-
-        ArtifactoryApplicationContext context = EasyMock.createMock(ArtifactoryApplicationContext.class);
-        EasyMock.expect(context.beansForType(CacheExpirable.class)).andReturn(expirableHashMap);
-        EasyMock.expect(context.getBean("root")).andReturn(rootExpirable);
-
-        EasyMock.replay(localCacheRepo, rootExpirable, denyingExpirable, context);
-        CacheExpiryImpl cacheExpiry = new CacheExpiryImpl();
-        cacheExpiry.setApplicationContext(context);
-        cacheExpiry.setBeanName("root");
-        cacheExpiry.init();
-        assertFalse(cacheExpiry.isExpirable(localCacheRepo, "asdfasdf"), "Path should not be expirable.");
-        EasyMock.verify(localCacheRepo, rootExpirable, denyingExpirable, context);
-    }
-
-    @Test
-    public void testIsExpirable() throws Exception {
-        LocalCacheRepo localCacheRepo = EasyMock.createMock(LocalCacheRepo.class);
-        CacheExpirable rootExpirable = EasyMock.createMock(CacheExpirable.class);
-        CacheExpirable acceptingExpirable = EasyMock.createMock(CacheExpirable.class);
-        EasyMock.expect(acceptingExpirable.isExpirable(EasyMock.anyObject(LocalCacheRepo.class),
-                EasyMock.<String>anyObject())).andReturn(true);
-
-        Map<String, CacheExpirable> expirableHashMap = Maps.newHashMap();
-        expirableHashMap.put("root", rootExpirable);
-        expirableHashMap.put("accepting", acceptingExpirable);
-
-        ArtifactoryApplicationContext context = EasyMock.createMock(ArtifactoryApplicationContext.class);
-        EasyMock.expect(context.beansForType(CacheExpirable.class)).andReturn(expirableHashMap);
-        EasyMock.expect(context.getBean("root")).andReturn(rootExpirable);
-
-        EasyMock.replay(localCacheRepo, rootExpirable, acceptingExpirable, context);
-        CacheExpiryImpl cacheExpiry = new CacheExpiryImpl();
-        cacheExpiry.setApplicationContext(context);
-        cacheExpiry.setBeanName("root");
-        cacheExpiry.init();
-        assertTrue(cacheExpiry.isExpirable(localCacheRepo, "asdfasdf"), "Path should be expirable.");
-        EasyMock.verify(localCacheRepo, rootExpirable, acceptingExpirable, context);
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/test/java/org/artifactory/repo/cahce/expirable/MavenIndexCacheExpirableTest.java b/backend/core/src/test/java/org/artifactory/repo/cahce/expirable/MavenIndexCacheExpirableTest.java
deleted file mode 100644
index 9df6141..0000000
--- a/backend/core/src/test/java/org/artifactory/repo/cahce/expirable/MavenIndexCacheExpirableTest.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cahce.expirable;
-
-import org.artifactory.repo.cache.expirable.MavenIndexCacheExpirable;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-/**
- * @author Noam Y. Tenne
- */
-public class MavenIndexCacheExpirableTest {
-
-    MavenIndexCacheExpirable mavenIndexCacheExpirable = new MavenIndexCacheExpirable();
-
-    @Test
-    public void testIsExpirable() throws Exception {
-        expectExpirable("nexus-maven-repository-index");
-        expectExpirable("nexus-maven-repository-index.tar");
-        expectExpirable("nexus-maven-repository-index.gz");
-        expectExpirable("nexus-maven-repository-index.zip");
-        expectExpirable("nexus-maven-repository-index.bob");
-        expectExpirable("nexus-maven-repository-index.properties");
-
-        expectExpirable("org/nexus-maven-repository-index");
-        expectExpirable("org/nexus-maven-repository-index.tar");
-        expectExpirable("org/nexus-maven-repository-index.gz");
-        expectExpirable("org/nexus-maven-repository-index.zip");
-        expectExpirable("org/nexus-maven-repository-index.bob");
-        expectExpirable("org/nexus-maven-repository-index.properties");
-
-        expectExpirable("org/bob/1.0/nexus-maven-repository-index");
-        expectExpirable("org/bob/1.0/nexus-maven-repository-index.tar");
-        expectExpirable("org/bob/1.0/nexus-maven-repository-index.gz");
-        expectExpirable("org/bob/1.0/nexus-maven-repository-index.zip");
-        expectExpirable("org/bob/1.0/nexus-maven-repository-index.bob");
-        expectExpirable("org/bob/1.0/nexus-maven-repository-index.properties");
-
-        expectUnExpirable("bob.zip");
-        expectUnExpirable("bob.gz");
-        expectUnExpirable("org/bob.zip");
-        expectUnExpirable("org/bob.gz");
-        expectUnExpirable("org/artifact/bob.zip");
-        expectUnExpirable("org/artifact/bob.gz");
-        expectUnExpirable("org/artifact/1.0/bob.zip");
-        expectUnExpirable("org/artifact/1.0/bob.gz");
-    }
-
-    private void expectExpirable(String artifactPath) {
-        assertTrue(mavenIndexCacheExpirable.isExpirable(null, artifactPath),
-                artifactPath + " Should be expirable.");
-    }
-
-    private void expectUnExpirable(String artifactPath) {
-        assertFalse(mavenIndexCacheExpirable.isExpirable(null, artifactPath),
-                artifactPath + " Shouldn't be expirable.");
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/repo/cahce/expirable/MavenMetadataCacheExpirableTest.java b/backend/core/src/test/java/org/artifactory/repo/cahce/expirable/MavenMetadataCacheExpirableTest.java
deleted file mode 100644
index 8811ab3..0000000
--- a/backend/core/src/test/java/org/artifactory/repo/cahce/expirable/MavenMetadataCacheExpirableTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cahce.expirable;
-
-import org.artifactory.repo.cache.expirable.MavenMetadataCacheExpirable;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-/**
- * @author Noam Y. Tenne
- */
-public class MavenMetadataCacheExpirableTest {
-
-    MavenMetadataCacheExpirable mavenMetadataCacheExpirable = new MavenMetadataCacheExpirable();
-
-    @Test
-    public void testIsExpirable() throws Exception {
-        expectExpirable("maven-metadata.xml");
-        expectExpirable("org/maven-metadata.xml");
-        expectExpirable("org:maven-metadata.xml");
-        expectExpirable("org/artifact/maven-metadata.xml");
-        expectExpirable("org/artifact:maven-metadata.xml");
-        expectExpirable("org/artifact/1.0/maven-metadata.xml");
-        expectExpirable("org/artifact/1.0:maven-metadata.xml");
-
-        expectUnExpirable("another-metadata.xml");
-        expectUnExpirable("org/another-metadata.xml");
-        expectUnExpirable("org:another-metadata.xml");
-        expectUnExpirable("org/artifact/another-metadata.xml");
-        expectUnExpirable("org/artifact:another-metadata.xml");
-        expectUnExpirable("org/artifact/1.0/another-metadata.xml");
-        expectUnExpirable("org/artifact/1.0:another-metadata.xml");
-
-        expectUnExpirable("bob.jar");
-        expectUnExpirable("bob.pom");
-        expectUnExpirable("org/bob.jar");
-        expectUnExpirable("org/bob.pom");
-        expectUnExpirable("org/artifact/bob.jar");
-        expectUnExpirable("org/artifact/bob.pom");
-        expectUnExpirable("org/artifact/1.0/bob.jar");
-        expectUnExpirable("org/artifact/1.0/bob.pom");
-    }
-
-    private void expectExpirable(String artifactPath) {
-        assertTrue(mavenMetadataCacheExpirable.isExpirable(null, artifactPath),
-                artifactPath + " Should be expirable.");
-    }
-
-    private void expectUnExpirable(String artifactPath) {
-        assertFalse(mavenMetadataCacheExpirable.isExpirable(null, artifactPath),
-                artifactPath + " Shouldn't be expirable.");
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/repo/cahce/expirable/NonUniqueSnapshotArtifactExpirableOrOverridableTest.java b/backend/core/src/test/java/org/artifactory/repo/cahce/expirable/NonUniqueSnapshotArtifactExpirableOrOverridableTest.java
deleted file mode 100644
index 63e4565..0000000
--- a/backend/core/src/test/java/org/artifactory/repo/cahce/expirable/NonUniqueSnapshotArtifactExpirableOrOverridableTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.cahce.expirable;
-
-import org.artifactory.api.module.ModuleInfoBuilder;
-import org.artifactory.repo.LocalCacheRepo;
-import org.artifactory.repo.cache.expirable.NonUniqueSnapshotArtifactExpirableOrOverridable;
-import org.easymock.EasyMock;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-/**
- * @author Noam Y. Tenne
- */
-public class NonUniqueSnapshotArtifactExpirableOrOverridableTest {
-
-    NonUniqueSnapshotArtifactExpirableOrOverridable expirable = new NonUniqueSnapshotArtifactExpirableOrOverridable();
-
-    @Test
-    public void testIsExpirableOnNoIntegrationModuleInfo() throws Exception {
-        LocalCacheRepo localCacheRepo = EasyMock.createMock(LocalCacheRepo.class);
-
-        EasyMock.expect(localCacheRepo.getItemModuleInfo(EasyMock.isA(String.class)))
-                .andReturn(new ModuleInfoBuilder().build()).times(2);
-
-        EasyMock.replay(localCacheRepo);
-        expectUnExpirable(localCacheRepo, "momo");
-        EasyMock.verify(localCacheRepo);
-    }
-
-    @Test
-    public void testIsExpirable() throws Exception {
-        expectExpirable("g/a/1.0-SNAPSHOT/artifact-5.4-SNAPSHOT.pom");
-        expectExpirable("g/a/1.0/artifact-5.4-20081214.090217-4.pom");
-        expectExpirable("g/a/1.0-20081214.090217-4/artifact-5.4-20081214.090217-4.pom");
-
-        LocalCacheRepo localCacheRepo = EasyMock.createMock(LocalCacheRepo.class);
-
-        EasyMock.expect(localCacheRepo.getItemModuleInfo(EasyMock.isA(String.class)))
-                .andReturn(new ModuleInfoBuilder().folderIntegrationRevision("asdfa").build()).times(2);
-
-        EasyMock.replay(localCacheRepo);
-        expectUnExpirable(localCacheRepo, "g/a/1.0-SNAPSHOT/artifact-5.4-20081214.090217-4.pom");
-        EasyMock.verify(localCacheRepo);
-    }
-
-    private void expectExpirable(String artifactPath) {
-        LocalCacheRepo localCacheRepo = EasyMock.createMock(LocalCacheRepo.class);
-
-        EasyMock.expect(localCacheRepo.getItemModuleInfo(EasyMock.isA(String.class)))
-                .andReturn(new ModuleInfoBuilder().folderIntegrationRevision("asdfa").build()).times(2);
-
-        EasyMock.replay(localCacheRepo);
-        assertTrue(expirable.isExpirable(localCacheRepo, artifactPath),
-                artifactPath + " Should be expirable.");
-        assertTrue(expirable.isOverridable(localCacheRepo, artifactPath),
-                artifactPath + " Should be overridable.");
-        EasyMock.verify(localCacheRepo);
-    }
-
-    private void expectUnExpirable(LocalCacheRepo localCacheRepo, String artifactPath) {
-        assertFalse(expirable.isExpirable(localCacheRepo, artifactPath),
-                artifactPath + " Shouldn't be expirable.");
-        assertFalse(expirable.isOverridable(localCacheRepo, artifactPath),
-                artifactPath + " Shouldn't be overridable.");
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/test/java/org/artifactory/repo/db/DbRepoBaseTest.java b/backend/core/src/test/java/org/artifactory/repo/db/DbRepoBaseTest.java
deleted file mode 100644
index 265af8a..0000000
--- a/backend/core/src/test/java/org/artifactory/repo/db/DbRepoBaseTest.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.db;
-
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ArtifactoryContextThreadBinder;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.common.StatusHolder;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.snapshot.MavenSnapshotVersionAdapter;
-import org.artifactory.spring.InternalArtifactoryContext;
-import org.artifactory.util.RepoLayoutUtils;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import static org.easymock.EasyMock.*;
-import static org.testng.Assert.assertTrue;
-
-/**
- * Unit test the DbRepoBase.
- *
- * @author Yossi Shaul
- */
- at Test
-public class DbRepoBaseTest {
-    private AuthorizationService authService;
-    private DbLocalRepo repo;
-
-    @BeforeMethod
-    public void setup() {
-        ArtifactoryContext context = createNiceMock(InternalArtifactoryContext.class);
-        authService = createNiceMock(AuthorizationService.class);
-        expect(context.getAuthorizationService()).andReturn(authService);
-        replay(context);
-        ArtifactoryContextThreadBinder.bind(context);
-        repo = createDbRepoBase();
-    }
-
-    public void anonAccessDisabledAndNoReadPermissions() {
-        RepoPath dummyPath = InternalRepoPathFactory.create("target", "blabla");
-        expect(authService.canRead(dummyPath)).andReturn(false);
-        replay(authService);
-
-        StatusHolder status = repo.checkDownloadIsAllowed(dummyPath);
-
-        assertTrue(status.isError(), "Download is allowed: " + status.getStatusMsg());
-
-        verify(authService);
-    }
-
-    public void anonAccessEnabledAndNoReadPermissions() {
-        RepoPath dummyPath = InternalRepoPathFactory.create("target", "blabla");
-        expect(authService.canRead(dummyPath)).andReturn(false);
-        replay(authService);
-
-        StatusHolder status = repo.checkDownloadIsAllowed(dummyPath);
-
-        assertTrue(status.isError(), "Download is allowed: " + status.getStatusMsg());
-
-        verify(authService);
-    }
-
-    private DbLocalRepo<LocalRepoDescriptor> createDbRepoBase() {
-        LocalRepoDescriptor descriptor = new LocalRepoDescriptor();
-        DbLocalRepo<LocalRepoDescriptor> repo = new DbLocalRepo<LocalRepoDescriptor>(descriptor, null, null) {
-
-            @Override
-            public MavenSnapshotVersionAdapter getMavenSnapshotVersionAdapter() {
-                return null;
-            }
-
-            @Override
-            public boolean isSuppressPomConsistencyChecks() {
-                return false;
-            }
-        };
-        descriptor.setRepoLayout(RepoLayoutUtils.MAVEN_2_DEFAULT);
-        return repo;
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/repo/db/StoringRepoMixinTest.java b/backend/core/src/test/java/org/artifactory/repo/db/StoringRepoMixinTest.java
deleted file mode 100644
index 5721bc6..0000000
--- a/backend/core/src/test/java/org/artifactory/repo/db/StoringRepoMixinTest.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.db;
-
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ArtifactoryContextThreadBinder;
-import org.artifactory.api.repo.exception.ItemNotFoundRuntimeException;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.LocalCacheRepo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.cache.expirable.CacheExpiry;
-import org.artifactory.repo.local.LocalNonCacheOverridable;
-import org.artifactory.repo.local.LocalNonCacheOverridables;
-import org.artifactory.repo.local.PathDeletionContext;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.lang.reflect.Field;
-
-import static org.easymock.EasyMock.*;
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-/**
- * @author Noam Y. Tenne
- */
-public class StoringRepoMixinTest extends ArtifactoryHomeBoundTest {
-
-    LocalCacheRepo storingRepo = createMock(LocalCacheRepo.class);
-    ArtifactoryContext context = createMock(ArtifactoryContext.class);
-    LocalRepoDescriptor localRepoDescriptor = new LocalRepoDescriptor();
-
-    {
-        localRepoDescriptor.setKey("somekey");
-    }
-
-    DbStoringRepoMixin storingRepoMixin = new DbStoringRepoMixin(localRepoDescriptor, null);
-
-    @BeforeClass
-    public void setUp() throws Exception {
-        ArtifactoryContextThreadBinder.bind(context);
-    }
-
-    @Test
-    public void testChecksumProtection() throws Exception {
-        for (ChecksumType checksumType : ChecksumType.BASE_CHECKSUM_TYPES) {
-            PathDeletionContext deletionContext = new PathDeletionContext.Builder(storingRepo,
-                    checksumType.ext()).assertOverwrite(true).build();
-            assertFalse(storingRepoMixin.shouldProtectPathDeletion(deletionContext),
-                    "Checksum should never be protected.");
-            deletionContext = new PathDeletionContext.Builder(storingRepo, checksumType.ext())
-                    .assertOverwrite(false).build();
-            assertFalse(storingRepoMixin.shouldProtectPathDeletion(deletionContext),
-                    "Checksum should never be protected.");
-        }
-    }
-
-    @Test
-    public void testCacheAndExpirableProtection() throws Exception {
-        PathDeletionContext deletionContext = new PathDeletionContext.Builder(storingRepo, "somepath")
-                .assertOverwrite(false).build();
-        assertTrue(storingRepoMixin.shouldProtectPathDeletion(deletionContext),
-                "Non-checksum item should never be protected when not overriding.");
-        expect(storingRepo.isCache()).andReturn(true);
-        CacheExpiry expiry = createMock(CacheExpiry.class);
-        expect(expiry.isExpirable(eq(storingRepo), eq("somepath"))).andReturn(true);
-        expect(context.beanForType(CacheExpiry.class)).andReturn(expiry);
-        InternalRepositoryService repositoryService = createMock(InternalRepositoryService.class);
-        fieldSet(storingRepoMixin, "repositoryService", repositoryService);
-        expect(repositoryService.storingRepositoryByKey("somekey")).andReturn(storingRepo);
-        replay(expiry, context, storingRepo, repositoryService);
-        deletionContext = new PathDeletionContext.Builder(storingRepo, "somepath")
-                .assertOverwrite(true).build();
-        assertFalse(storingRepoMixin.shouldProtectPathDeletion(deletionContext),
-                "Expired path shouldn't be protected.");
-        verify(expiry, context, storingRepo);
-        reset(context, storingRepo);
-    }
-
-    @Test
-    public void testLocalNotCacheAndOverridableProtection() throws Exception {
-        expect(storingRepo.isCache()).andReturn(false);
-        LocalNonCacheOverridables overridables = createMock(LocalNonCacheOverridables.class);
-        expect(overridables.isOverridable(eq(storingRepo), eq("somepath"))).andReturn(true);
-        expect(context.beanForType(LocalNonCacheOverridables.class)).andReturn(overridables);
-        InternalRepositoryService repositoryService = createMock(InternalRepositoryService.class);
-        fieldSet(storingRepoMixin, "repositoryService", repositoryService);
-        expect(repositoryService.storingRepositoryByKey("somekey")).andReturn(storingRepo);
-
-        replay(overridables, context, storingRepo, repositoryService);
-        PathDeletionContext deletionContext = new PathDeletionContext.Builder(storingRepo, "somepath")
-                .assertOverwrite(true).build();
-        assertFalse(storingRepoMixin.shouldProtectPathDeletion(deletionContext),
-                "Overridable path shouldn't be protected.");
-        verify(overridables, context, storingRepo);
-        reset(context, storingRepo);
-    }
-
-    @Test
-    public void testLocalNotCacheAndMetadataProtection() throws Exception {
-        //expect(storingRepo.isCache()).andReturn(false).times(2);
-        LocalNonCacheOverridable overridable = createMock(LocalNonCacheOverridable.class);
-        //expect(overridable.isOverridable(eq(storingRepo), eq("maven-metadata.xml")))
-        //        .andReturn(false);
-        //expect(overridable.isOverridable(eq(storingRepo), eq("some:metadata.xml")))
-        //        .andReturn(false);
-        //expect(context.beanForType(LocalNonCacheOverridable.class)).andReturn(overridable);
-        InternalRepositoryService repositoryService = createMock(InternalRepositoryService.class);
-        fieldSet(storingRepoMixin, "repositoryService", repositoryService);
-        expect(repositoryService.storingRepositoryByKey("somekey")).andReturn(storingRepo);
-
-        replay(overridable, context, storingRepo, repositoryService);
-        PathDeletionContext deletionContext = new PathDeletionContext.Builder(storingRepo, "maven-metadata.xml")
-                .assertOverwrite(true).build();
-        assertFalse(storingRepoMixin.shouldProtectPathDeletion(deletionContext),
-                "Metadata path shouldn't be protected.");
-        //assertFalse(storingRepoMixin.shouldProtectPathDeletion("some:metadata.xml", true, null),
-        //        "Metadata path shouldn't be protected.");
-        verify(overridable, context, storingRepo);
-        reset(context, storingRepo);
-    }
-
-    @Test
-    public void testLocalNotCacheAndNotFileProtection() throws Exception {
-        expect(storingRepo.isCache()).andReturn(false);
-        LocalNonCacheOverridables overridables = createMock(LocalNonCacheOverridables.class);
-        expect(overridables.isOverridable(eq(storingRepo), eq("somefile"))).andReturn(false);
-        expect(context.beanForType(LocalNonCacheOverridables.class)).andReturn(overridables);
-        InternalRepositoryService repositoryService = createMock(InternalRepositoryService.class);
-        expect(repositoryService.exists(eq(InternalRepoPathFactory.create("somekey", "somefile"))))
-                .andReturn(false);
-        expect(repositoryService.storingRepositoryByKey(eq("somekey"))).andReturn(storingRepo);
-        fieldSet(storingRepoMixin, "repositoryService", repositoryService);
-        replay(overridables, repositoryService, context, storingRepo);
-        PathDeletionContext deletionContext = new PathDeletionContext.Builder(storingRepo, "somefile")
-                .assertOverwrite(true).build();
-        assertFalse(storingRepoMixin.shouldProtectPathDeletion(deletionContext),
-                "Items which aren't files shouldn't be protected.");
-        verify(overridables, repositoryService, context, storingRepo);
-        reset(context, storingRepo);
-    }
-
-    @Test
-    public void allowOverrideOfAnArtifactWithProvidedChecksumIfExistingFileHasTheSameChecksum() throws Exception {
-
-        InternalRepositoryService repositoryService = createMock(InternalRepositoryService.class);
-        fieldSet(storingRepoMixin, "repositoryService", repositoryService);
-        FileInfo fileInfo = createMock(FileInfo.class);
-
-        final RepoPath repoPath = InternalRepoPathFactory.create("somekey", "path");
-
-        //
-        expect(repositoryService.exists(eq(repoPath))).andReturn(true);
-        replay(storingRepo, repositoryService);
-        assertTrue(storingRepoMixin.shouldProtectPathDeletion("path", null),
-                "delete protection when not deploy with checksum for file");
-        verify(storingRepo, repositoryService);
-        reset(storingRepo, repositoryService);
-
-        //
-        expect(repositoryService.exists(eq(repoPath))).andReturn(false);
-        replay(storingRepo, repositoryService);
-        assertFalse(storingRepoMixin.shouldProtectPathDeletion("path", null),
-                "no delete protection when not deploy with checksum for non file");
-        verify(storingRepo, repositoryService);
-        reset(storingRepo, repositoryService);
-
-        //
-        expect(repositoryService.exists(eq(repoPath))).andReturn(false);
-        replay(storingRepo, repositoryService);
-        assertFalse(storingRepoMixin.shouldProtectPathDeletion("path", null),
-                "no delete protection when not deploy with checksum for non file");
-        verify(storingRepo, repositoryService);
-        reset(storingRepo, repositoryService);
-
-        //
-        expect(repositoryService.getFileInfo(eq(repoPath))).andThrow(new ItemNotFoundRuntimeException("aha"));
-        replay(storingRepo, repositoryService);
-        assertFalse(storingRepoMixin.shouldProtectPathDeletion("path", "non-null"),
-                "no delete protection when item not found in repo path");
-        verify(storingRepo, repositoryService);
-        reset(storingRepo, repositoryService);
-
-        //
-        expect(repositoryService.getFileInfo(repoPath)).andReturn(fileInfo);
-        expect(fileInfo.getSha1()).andReturn("sha1");
-        replay(storingRepo, repositoryService, fileInfo);
-        assertFalse(storingRepoMixin.shouldProtectPathDeletion("path", "sha1"),
-                "no delete protection when deploy with checksum that matches existing path checksum");
-        verify(storingRepo, repositoryService, fileInfo);
-        reset(storingRepo, repositoryService, fileInfo);
-
-        //
-        expect(repositoryService.getFileInfo(repoPath)).andReturn(fileInfo);
-        expect(fileInfo.getSha1()).andReturn("sha1");
-        replay(storingRepo, repositoryService, fileInfo);
-        assertTrue(storingRepoMixin.shouldProtectPathDeletion("path", "sha2"),
-                "delete protection when deploy with checksum that does not match existing path checksum");
-        verify(storingRepo, repositoryService, fileInfo);
-        reset(storingRepo, repositoryService, fileInfo);
-    }
-
-    private static void fieldSet(Object object, String field, Object value) throws NoSuchFieldException,
-            IllegalAccessException {
-        Field jcrServiceField = object.getClass().getDeclaredField(field);
-        jcrServiceField.setAccessible(true);
-        jcrServiceField.set(object, value);
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/repo/db/importexport/DbRepoImportHandlerSpec.groovy b/backend/core/src/test/java/org/artifactory/repo/db/importexport/DbRepoImportHandlerSpec.groovy
deleted file mode 100644
index af9e184..0000000
--- a/backend/core/src/test/java/org/artifactory/repo/db/importexport/DbRepoImportHandlerSpec.groovy
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-package org.artifactory.repo.db.importexport
-
-import com.google.common.io.Files
-import org.apache.commons.io.FileUtils
-import org.apache.commons.logging.Log
-import org.artifactory.api.config.RepositoryImportSettingsImpl
-import org.artifactory.api.context.ArtifactoryContextThreadBinder
-import org.artifactory.api.maven.MavenMetadataService
-import org.artifactory.api.security.AuthorizationService
-import org.artifactory.common.ArtifactoryHome
-import org.artifactory.descriptor.repo.LocalRepoDescriptor
-import org.artifactory.mime.MimeTypes
-import org.artifactory.mime.MimeTypesReader
-import org.artifactory.repo.InternalRepoPathFactory
-import org.artifactory.repo.LocalRepo
-import org.artifactory.repo.interceptor.ImportInterceptors
-import org.artifactory.repo.interceptor.StorageAggregationInterceptors
-import org.artifactory.repo.service.InternalRepositoryService
-import org.artifactory.sapi.fs.MutableVfsFile
-import org.artifactory.sapi.fs.MutableVfsFolder
-import org.artifactory.schedule.TaskService
-import org.artifactory.spring.InternalArtifactoryContext
-import org.artifactory.storage.BinaryInsertRetryException
-import org.artifactory.storage.db.binstore.service.BinaryInfoImpl
-import org.artifactory.test.ArtifactoryHomeStub
-import org.artifactory.util.ResourceUtils
-import org.joda.time.DateTimeUtils
-import org.joda.time.Duration
-import org.springframework.transaction.support.AbstractPlatformTransactionManager
-import org.springframework.transaction.support.DefaultTransactionStatus
-import spock.lang.Ignore
-import spock.lang.Specification
-
-import java.nio.file.Paths
-
-/**
- *
- * @author Yoav Luft
- */
-class DbRepoImportHandlerSpec extends Specification {
-
-    public static final String EMPTY_FILE_SHA1 = "da39a3ee5e6b4b0d3255bfef95601890afd80709"
-    public static final String EMPTY_FILE_MD5 = 'd41d8cd98f00b204e9800998ecf8427e'
-    File repoRoot
-    MimeTypes mimeTypes
-    private InternalRepositoryService repositoryService
-    private mavenMetadataService
-    private transactionManager
-    private transactionManagerLog
-    private transactionStatus
-    private taskService
-    private authorizationService
-    private importInterceptors
-    private aggregationInterceptors
-    private artifactoryContext
-
-    def setup() {
-        repoRoot = Files.createTempDir()
-        InputStream mimeTypesFile = ResourceUtils.getResource(
-                "/META-INF/default/" + ArtifactoryHome.MIME_TYPES_FILE_NAME);
-        mimeTypes = new MimeTypesReader().read(mimeTypesFile);
-        prepareArtifactoryHomeAndContext()
-    }
-
-    void cleanup() {
-        if (repoRoot != null) {
-            FileUtils.deleteDirectory repoRoot
-        }
-    }
-
-    def "Import single file without metadata"() {
-        setup:
-
-        def filename = "file-a.jar"
-        makeFiles filename
-        def importSettings = new RepositoryImportSettingsImpl(repoRoot)
-        def localRepo = Mock(LocalRepo)
-        def handler = new DbRepoImportHandler(localRepo, importSettings, "")
-
-        def repoName = "test-repo"
-        def rootPath = InternalRepoPathFactory.repoRootPath(repoName)
-        def fileRepoPath = InternalRepoPathFactory.create(rootPath, filename)
-
-        repositoryService.localOrCachedRepositoryByKey(repoName) >> localRepo
-
-        localRepo.getKey() >> repoName
-        localRepo.getDescriptor() >> Mock(LocalRepoDescriptor)
-
-        def vfsFolder = Mock(MutableVfsFolder)
-        def vfsFile = Mock(MutableVfsFile)
-
-        when:
-
-        handler.executeImport()
-
-        then:
-
-        1 * localRepo.createOrGetFolder(rootPath) >> vfsFolder
-        _ * vfsFolder.getRepoPath() >> rootPath
-
-        _ * vfsFile.getRepoPath() >> fileRepoPath
-
-        1 * localRepo.createOrGetFile(fileRepoPath) >> vfsFile
-
-        1 * localRepo.isCache() >> false
-        _ * localRepo.toString() >> "Mock for local repo 'test-repo'"
-
-        !importSettings.getStatusHolder().isError()
-    }
-
-    def "Test BinaryAlreadyExistsException is handled"() {
-        setup:
-
-        def filename = "file-a.jar"
-        makeFiles filename
-        def importSettings = new RepositoryImportSettingsImpl(repoRoot)
-
-        def localRepo = Mock(LocalRepo)
-
-        def repoName = "test-repo"
-        def rootPath = InternalRepoPathFactory.repoRootPath(repoName)
-        def fileRepoPath = InternalRepoPathFactory.create(rootPath, filename)
-
-        localRepo.getKey() >> repoName
-        localRepo.getDescriptor() >> Mock(LocalRepoDescriptor)
-        localRepo.isCache() >> false
-
-        repositoryService.localOrCachedRepositoryByKey(repoName) >> localRepo
-
-        def vfsFolder = Mock(MutableVfsFolder)
-        def vfsFile = Mock(MutableVfsFile)
-        vfsFile.getSha1() >> EMPTY_FILE_SHA1
-
-        def handler = new DbRepoImportHandler(localRepo, importSettings, "")
-
-        when:
-
-        handler.executeImport()
-
-        then:
-
-        1 * localRepo.createOrGetFolder(rootPath) >> vfsFolder
-        _ * vfsFolder.getRepoPath() >> rootPath
-
-        2 * localRepo.createOrGetFile(fileRepoPath) >> vfsFile
-
-        _ * vfsFile.getRepoPath() >> fileRepoPath
-        1 * vfsFile.tryUsingExistingBinary(_, _, _) >> {
-            throw new BinaryInsertRetryException(new BinaryInfoImpl(EMPTY_FILE_SHA1, EMPTY_FILE_MD5, 0), null)
-        }
-
-        _ * localRepo.toString() >> "Mock for local repo 'test-repo'"
-
-        then:
-
-        1 * vfsFile.tryUsingExistingBinary(_, _, _) >> true
-
-        !importSettings.getStatusHolder().isError()
-    }
-
-    @Ignore
-    def "Test file not found but has metadata"() {}
-
-    @Ignore
-    def "Test file not found"() {}
-
-    @Ignore
-    def "Test commit transaction after 1000 imported items"() {}
-
-    def "Test commit transaction after timeout"() {
-        setup:
-
-        def fileA = "file-a.jar"
-        def fileB = "file-b.jar"
-        makeFiles(fileA, fileB)
-        def importSettings = new RepositoryImportSettingsImpl(repoRoot)
-
-        def localRepo = Mock(LocalRepo)
-
-        def repoName = "test-repo"
-        def rootPath = InternalRepoPathFactory.repoRootPath(repoName)
-        def fileRepoPathA = InternalRepoPathFactory.create(rootPath, fileA)
-        def fileRepoPathB = InternalRepoPathFactory.create(rootPath, fileB)
-
-        localRepo.getKey() >> repoName
-        localRepo.getDescriptor() >> Mock(LocalRepoDescriptor)
-        localRepo.isCache() >> false
-        localRepo.toString() >> "Mock for local repo 'test-repo'"
-
-        repositoryService.localOrCachedRepositoryByKey(repoName) >> localRepo
-
-        def vfsFolder = Mock(MutableVfsFolder)
-        def vfsFileA = Mock(MutableVfsFile)
-        def vfsFileB = Mock(MutableVfsFile)
-        vfsFileA.getSha1() >> EMPTY_FILE_SHA1
-
-        localRepo.createOrGetFolder(rootPath) >> vfsFolder
-        vfsFolder.getRepoPath() >> rootPath
-        vfsFileA.getRepoPath() >> { fileRepoPathA }
-        vfsFileB.getRepoPath() >> fileRepoPathB
-
-        def handler = new DbRepoImportHandler(localRepo, importSettings, "")
-
-        when:
-
-        handler.executeImport()
-
-        then:
-        // Called by every commit and every start of new transaction
-        1 * artifactoryContext.getBean("artifactoryTransactionManager") >> this.transactionManager
-
-        then:
-        1 * localRepo.createOrGetFile(fileRepoPathA) >> {
-            // Move the time forward!
-            DateTimeUtils.setCurrentMillisOffset(Duration.standardMinutes(5).getMillis())
-            vfsFileA
-        }
-
-        then:
-        // Commit then start new transaction
-        2 * artifactoryContext.getBean("artifactoryTransactionManager") >> this.transactionManager
-
-        then:
-        localRepo.createOrGetFile(fileRepoPathB) >> vfsFileB
-        1 * artifactoryContext.getBean("artifactoryTransactionManager") >> this.transactionManager
-        !importSettings.getStatusHolder().isError()
-    }
-
-    @Ignore
-    def "Test termination if parent task terminates"() {}
-
-    def prepareArtifactoryHomeAndContext() {
-        artifactoryContext = Mock(InternalArtifactoryContext)
-        ArtifactoryContextThreadBinder.bind(artifactoryContext)
-
-        def artifactoryHomeStub = new ArtifactoryHomeStub()
-        artifactoryHomeStub.mimeTypes = mimeTypes
-        ArtifactoryHome.bind(artifactoryHomeStub)
-
-        setupContext(artifactoryContext)
-    }
-
-    private void setupContext(InternalArtifactoryContext context) {
-        repositoryService = Mock(InternalRepositoryService)
-        context.beanForType(InternalRepositoryService.class) >> this.repositoryService
-
-        mavenMetadataService = Mock(MavenMetadataService)
-        context.beanForType(MavenMetadataService.class) >> this.mavenMetadataService
-
-        transactionManager = Mock(AbstractPlatformTransactionManager)
-        context.getBean("artifactoryTransactionManager") >> this.transactionManager
-
-        transactionManagerLog = Mock(Log)
-        this.transactionManager.logger = this.transactionManagerLog
-
-        transactionStatus = Mock(DefaultTransactionStatus)
-        this.transactionManager.newTransactionStatus(_, _, _, _, _, _) >> this.transactionStatus
-
-        taskService = Mock(TaskService)
-        context.getTaskService() >> this.taskService
-
-        authorizationService = Mock(AuthorizationService)
-        context.getAuthorizationService() >> this.authorizationService
-        this.authorizationService.currentUsername() >> "admin"
-
-        importInterceptors = Mock(ImportInterceptors)
-        context.beanForType(ImportInterceptors.class) >> this.importInterceptors
-
-        aggregationInterceptors = Mock(StorageAggregationInterceptors)
-        context.beanForType(StorageAggregationInterceptors.class) >> this.aggregationInterceptors
-    }
-
-    def makeFiles(String... filenames) {
-        filenames.each {
-            def path = Paths.get(repoRoot.absolutePath, it)
-            Files.touch(path.toFile())
-        }
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/repo/interceptor/NuGetCalculationInterceptorTest.java b/backend/core/src/test/java/org/artifactory/repo/interceptor/NuGetCalculationInterceptorTest.java
deleted file mode 100644
index 0312ba1..0000000
--- a/backend/core/src/test/java/org/artifactory/repo/interceptor/NuGetCalculationInterceptorTest.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.interceptor;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.NuGetAddon;
-import org.artifactory.addon.nuget.NuGetProperties;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.model.xstream.fs.PropertiesImpl;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.sapi.fs.VfsFile;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import static org.easymock.EasyMock.*;
-
-/**
- * @author Noam Y. Tenne
- */
- at Test
-public class NuGetCalculationInterceptorTest {
-
-    private NuGetCalculationInterceptor nuGetCalculationInterceptor = new NuGetCalculationInterceptor();
-    private NuGetAddon nuGetAddon;
-
-    @BeforeClass
-    public void setUp() {
-    }
-
-    @BeforeMethod
-    public void beforeMethod() {
-        nuGetCalculationInterceptor.addonsManager = createMock(AddonsManager.class);
-        nuGetAddon = createMock(NuGetAddon.class);
-        expect(nuGetCalculationInterceptor.addonsManager.addonByType(NuGetAddon.class))
-                .andReturn(nuGetAddon).anyTimes();
-    }
-
-    @Test
-    public void testNotNuGetFile() {
-        VfsFile vfsItemMock = createAndGetFsItemMock(RepoPathFactory.create("bob", "bob.jar"));
-        replay(vfsItemMock);
-
-        nuGetCalculationInterceptor.afterCopy(null, vfsItemMock, null, null);
-        nuGetCalculationInterceptor.afterCreate(vfsItemMock, null);
-        nuGetCalculationInterceptor.afterMove(null, vfsItemMock, null, null);
-        nuGetCalculationInterceptor.beforeDelete(vfsItemMock, null, false);
-
-        verify(vfsItemMock);
-    }
-
-    @Test
-    public void testNotNuGetRepo() {
-        RepositoryService repoServiceMock = createAndSetMockRepo(false, "bob");
-
-        VfsFile vfsItemMock = createAndGetFsItemMock(RepoPathFactory.create("bob", "bob.nupkg"));
-        replay(vfsItemMock, repoServiceMock);
-
-        nuGetCalculationInterceptor.afterCopy(null, vfsItemMock, null, null);
-        nuGetCalculationInterceptor.afterCreate(vfsItemMock, null);
-        nuGetCalculationInterceptor.afterMove(null, vfsItemMock, null, null);
-        nuGetCalculationInterceptor.beforeDelete(vfsItemMock, null, false);
-
-        verify(vfsItemMock, repoServiceMock);
-    }
-
-    @Test
-    public void testAfterCreate() {
-        RepositoryService repoServiceMock = createAndSetMockRepo(true, "bob");
-        RepoPath repoPath = RepoPathFactory.create("bob", "bob.nupkg");
-        VfsFile vfsItemMock = createAndGetFsItemMock(repoPath);
-        FileInfo fileInfoMock = createAndGetFileInfoMock(repoPath);
-        expect(vfsItemMock.getInfo()).andReturn(fileInfoMock).anyTimes();
-        nuGetAddon.extractNuPkgInfo(eq(fileInfoMock), isA(MutableStatusHolder.class), eq(true));
-        expectLastCall();
-        replay(vfsItemMock, repoServiceMock, nuGetCalculationInterceptor.addonsManager, nuGetAddon);
-        nuGetCalculationInterceptor.afterCreate(vfsItemMock, new BasicStatusHolder());
-        verify(vfsItemMock, repoServiceMock, nuGetCalculationInterceptor.addonsManager, nuGetAddon);
-    }
-
-    @Test
-    public void testAfterMoveOrCopyNoIdProperty() {
-        RepositoryService repoServiceMock = createAndSetMockRepo(true, "bob");
-        RepoPath itemRepoPath = RepoPathFactory.create("bob", "bob.nupkg");
-        FileInfo fileInfoMock = createAndGetFileInfoMock(itemRepoPath);
-        VfsFile vfsItemMock = createAndGetFsItemMock(itemRepoPath);
-        expect(vfsItemMock.getInfo()).andReturn(fileInfoMock).anyTimes();
-        setVfsFileMockProperties(vfsItemMock, null);
-
-        replay(vfsItemMock, repoServiceMock, nuGetCalculationInterceptor.addonsManager);
-        nuGetCalculationInterceptor.afterCopy(null, vfsItemMock, null, null);
-        nuGetCalculationInterceptor.afterMove(null, vfsItemMock, null, null);
-        verify(vfsItemMock, repoServiceMock, nuGetCalculationInterceptor.addonsManager);
-    }
-
-    @Test
-    public void testAfterCopy() {
-        RepositoryService repoServiceMock = createAndSetMockRepo(true, "bob");
-        RepoPath itemRepoPath = RepoPathFactory.create("bob", "bob.nupkg");
-        VfsFile vfsItemMock = createAndGetFsItemMock(itemRepoPath);
-        setVfsFileMockProperties(vfsItemMock, "bobsId");
-
-        replay(vfsItemMock, repoServiceMock, nuGetCalculationInterceptor.addonsManager);
-        nuGetCalculationInterceptor.afterCopy(null, vfsItemMock, null, null);
-        verify(vfsItemMock, repoServiceMock, nuGetCalculationInterceptor.addonsManager);
-    }
-
-    @Test
-    public void testAfterMoveNoNuGetProperties() {
-        RepositoryService repoServiceMock = createAndSetMockRepo(true, "bob");
-        RepoPath targetRepoPath = RepoPathFactory.create("bob", "bob.nupkg");
-        FileInfo fileInfoMock = createAndGetFileInfoMock(targetRepoPath);
-        VfsFile targetVfsFile = createAndGetFsItemMock(targetRepoPath);
-        expect(targetVfsFile.getInfo()).andReturn(fileInfoMock).anyTimes();
-        setVfsFileMockProperties(targetVfsFile, null);
-
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-        nuGetAddon.extractNuPkgInfo(eq(fileInfoMock), eq(statusHolder), eq(true));
-        expectLastCall();
-
-        replay(targetVfsFile, repoServiceMock, nuGetCalculationInterceptor.addonsManager);
-        nuGetCalculationInterceptor.afterMove(targetVfsFile, targetVfsFile, statusHolder, null);
-        verify(targetVfsFile, repoServiceMock, nuGetCalculationInterceptor.addonsManager);
-    }
-
-    @Test
-    public void testAfterImport() throws Exception {
-        RepositoryService repoServiceMock = createAndSetMockRepo(true, "bob");
-        RepoPath itemRepoPath = RepoPathFactory.create("bob", "bob.nupkg");
-        FileInfo fileInfoMock = createAndGetFileInfoMock(itemRepoPath);
-        VfsFile vfsItemMock = createAndGetFsItemMock(itemRepoPath);
-        expect(vfsItemMock.getInfo()).andReturn(fileInfoMock).anyTimes();
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-
-        nuGetAddon.extractNuPkgInfo(eq(fileInfoMock), eq(statusHolder), eq(true));
-        expectLastCall();
-
-        replay(vfsItemMock, repoServiceMock, nuGetCalculationInterceptor.addonsManager, nuGetAddon);
-        nuGetCalculationInterceptor.afterImport(vfsItemMock, statusHolder);
-        verify(vfsItemMock, repoServiceMock, nuGetCalculationInterceptor.addonsManager, nuGetAddon);
-    }
-
-    private VfsFile createAndGetFsItemMock(RepoPath repoPath) {
-        VfsFile vfsItemMock = createMock(VfsFile.class);
-        expect(vfsItemMock.isFile()).andReturn(true).anyTimes();
-        expect(vfsItemMock.getRepoPath()).andReturn(repoPath).anyTimes();
-        return vfsItemMock;
-    }
-
-    private FileInfo createAndGetFileInfoMock(RepoPath repoPath) {
-        FileInfo fileInfoMock = createMock(FileInfo.class);
-        expect(fileInfoMock.getRepoPath()).andReturn(repoPath).anyTimes();
-        return fileInfoMock;
-    }
-
-    private RepositoryService createAndSetMockRepo(boolean nuGetSupported, String repoKey) {
-        RepositoryService repoServiceMock = createMock(RepositoryService.class);
-        LocalRepoDescriptor localRepoDescriptor = new LocalRepoDescriptor();
-        if(nuGetSupported) {
-            localRepoDescriptor.setType(RepoType.NuGet);
-        }
-        expect(repoServiceMock.repoDescriptorByKey(repoKey)).andReturn(localRepoDescriptor).anyTimes();
-        nuGetCalculationInterceptor.repositoryService = repoServiceMock;
-        return repoServiceMock;
-    }
-
-    private void setVfsFileMockProperties(VfsFile vfsFile, String nugetId) {
-        Properties toReturn = new PropertiesImpl();
-        if (!StringUtils.isBlank(nugetId)) {
-            toReturn.put(NuGetProperties.Id.nodePropertyName(), nugetId);
-        }
-
-        expect(vfsFile.getProperties()).andReturn(toReturn).anyTimes();
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/repo/remote/browse/HtmlRepositoryBrowserTest.java b/backend/core/src/test/java/org/artifactory/repo/remote/browse/HtmlRepositoryBrowserTest.java
deleted file mode 100644
index f0887e4..0000000
--- a/backend/core/src/test/java/org/artifactory/repo/remote/browse/HtmlRepositoryBrowserTest.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.remote.browse;
-
-import com.google.common.base.Charsets;
-import com.google.common.io.Files;
-import org.apache.commons.io.FileUtils;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpRequestBase;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.artifactory.util.ResourceUtils;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.List;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Test {@link HtmlRepositoryBrowser}.
- *
- * @author Tomer Cohen
- */
- at Test
-public class HtmlRepositoryBrowserTest extends ArtifactoryHomeBoundTest {
-
-    private HtmlRepositoryBrowser urlLister;
-    private String baseUrl;
-
-    @BeforeMethod
-    public void setUp() {
-        final CloseableHttpClient hc = HttpClients.createDefault();
-        HttpExecutor httpExecutor = new HttpExecutor() {
-            @Override
-            public CloseableHttpResponse executeMethod(HttpRequestBase method) throws IOException {
-                return hc.execute(method);
-            }
-        };
-        urlLister = new HtmlRepositoryBrowser(httpExecutor);
-        baseUrl = "http://blabla";
-    }
-
-    public void listAllInvalid() throws IOException {
-        File html = ResourceUtils.getResourceAsFile(testResourcesPath + "/invalidHtml.html");
-        List<RemoteItem> urls = urlLister.parseHtml(Files.toString(html, Charsets.UTF_8), baseUrl);
-        assertEquals(urls.size(), 0, "there should be no URLs in this html");
-    }
-
-    public void listAllNoHrefs() throws IOException {
-        File html = ResourceUtils.getResourceAsFile(testResourcesPath + "/noHrefs.html");
-        List<RemoteItem> urls = urlLister.parseHtml(Files.toString(html, Charsets.UTF_8), baseUrl);
-        assertEquals(urls.size(), 0, "there should be no URLs in this html");
-    }
-
-    public void listAll() throws IOException {
-        File html = ResourceUtils.getResourceAsFile(testResourcesPath + "/simple.html");
-        File validHtml = createValidHtml(html);
-        List<RemoteItem> urls = urlLister.parseHtml(Files.toString(validHtml, Charsets.UTF_8), baseUrl);
-        assertEquals(urls.size(), 1);
-    }
-
-    public void listAllFromArtifactorySimpleBrowsingHtml() throws IOException {
-        File html = ResourceUtils.getResourceAsFile(testResourcesPath + "/artifactory-simple.html");
-        // base url that matches the links un the test html file
-        String baseUrl = "http://localhost:8081/artifactory/libs-releases-local/org/jfrog/test/";
-        List<RemoteItem> children = urlLister.parseHtml(Files.toString(html, Charsets.UTF_8), baseUrl);
-        assertEquals(children.size(), 4, "Found: " + children);
-        assertEquals(children.get(0), new RemoteItem(baseUrl + "multi1/", true));
-        assertEquals(children.get(3), new RemoteItem(baseUrl + "multi.pom", false));
-    }
-
-    public void listAllFromArtifactoryListBrowsingHtml() throws IOException {
-        File html = ResourceUtils.getResourceAsFile(testResourcesPath + "/artifactory-list.html");
-        List<RemoteItem> children = urlLister.parseHtml(Files.toString(html, Charsets.UTF_8), baseUrl);
-        assertEquals(children.size(), 3, "Found: " + children);
-        assertEquals(children.get(0).getUrl(), baseUrl + "/multi1/");
-        assertEquals(children.get(1).getUrl(), baseUrl + "/multi2/");
-        assertEquals(children.get(2).getUrl(), baseUrl + "/multi3/");
-    }
-
-    public void listAllFromBintrayListBrowsingHtml() throws IOException {
-        baseUrl = "http://jcenter.bintray.com";
-        File html = ResourceUtils.getResourceAsFile(testResourcesPath + "/bintray.html");
-        List<RemoteItem> children = urlLister.parseHtml(Files.toString(html, Charsets.UTF_8), baseUrl);
-        assertEquals(children.size(), 1, "Found: " + children);
-        assertEquals(children.get(0).getUrl(), baseUrl + "/ojdbc/");
-    }
-
-    private File createValidHtml(File source) throws IOException {
-        File tempFile = File.createTempFile("artifactory", "html");
-        String fileContent = FileUtils.readFileToString(source);
-        fileContent = fileContent.replace("{placeHolder}", tempFile.toURI().toURL().toExternalForm());
-        FileUtils.writeStringToFile(tempFile, fileContent);
-        return tempFile;
-    }
-
-    private static final String testResourcesPath = "/org/artifactory/repo/remote/browse/html";
-
-    public void listAllFromArtifactoryListBrowsingHtmlWithSingleQuotes() throws IOException {
-        File html = ResourceUtils.getResourceAsFile(testResourcesPath + "/hrefExample.html");
-        List<RemoteItem> children = urlLister.parseHtml(Files.toString(html, Charsets.UTF_8), baseUrl);
-        assertEquals(children.size(), 4, "Found: " + children);
-        assertEquals(children.get(0).getUrl(), baseUrl + "/file.jar");
-        assertEquals(children.get(0).getName(), "file.jar");
-        assertEquals(children.get(1).getUrl(), baseUrl + "/file1");
-        assertEquals(children.get(1).getName(), "file1");
-        assertEquals(children.get(2).getUrl(), baseUrl + "/file2");
-        assertEquals(children.get(2).getName(), "file2");
-        assertEquals(children.get(3).getUrl(), baseUrl + "/index.html");
-        assertEquals(children.get(3).getName(), "index.html");
-    }
-
-}
diff --git a/backend/core/src/test/java/org/artifactory/repo/remote/browse/S3RepositoryBrowserTest.java b/backend/core/src/test/java/org/artifactory/repo/remote/browse/S3RepositoryBrowserTest.java
deleted file mode 100644
index 222b006..0000000
--- a/backend/core/src/test/java/org/artifactory/repo/remote/browse/S3RepositoryBrowserTest.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.remote.browse;
-
-import ch.qos.logback.classic.Level;
-import ch.qos.logback.classic.LoggerContext;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpRequestBase;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ArtifactoryContextThreadBinder;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.repo.http.IdleConnectionMonitorService;
-import org.artifactory.repo.http.IdleConnectionMonitorServiceImpl;
-import org.artifactory.spring.InternalArtifactoryContext;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.artifactory.test.ArtifactoryHomeStub;
-import org.artifactory.test.mock.SimpleMockServer;
-import org.artifactory.util.HttpClientConfigurator;
-import org.artifactory.util.StringInputStream;
-import org.easymock.EasyMock;
-import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.server.handler.AbstractHandler;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.test.util.ReflectionTestUtils;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-/**
- * Unit tests for {@link S3RepositoryBrowser}. Some tests are disabled because they require internet connection. They
- * should be executed by developers for debugging only.
- *
- * @author Yossi Shaul
- */
- at Test
-public class S3RepositoryBrowserTest extends ArtifactoryHomeBoundTest {
-    private static final Logger log = LoggerFactory.getLogger(S3RepositoryBrowserTest.class);
-    private IdleConnectionMonitorService idleConnectionMonitorService;
-    private ArtifactoryContext contextMock;
-
-    static {
-        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
-        lc.getLogger(S3RepositoryBrowserTest.class).setLevel(Level.INFO);
-    }
-
-    private SimpleMockServer server;
-    private CloseableHttpClient client;
-    private S3RepositoryBrowser s3Browser;
-
-    public void detectRootLocal() throws IOException {
-        String rootUrl = s3Browser.detectRootUrl(server.getBaseUrl() + testResourcesPath + "s3-nosuchkey.xml");
-        assertEquals(rootUrl, server.getBaseUrl(), "Wrong root url detected");
-    }
-
-    public void listRemoteItems() throws IOException {
-        ReflectionTestUtils.setField(s3Browser, "rootUrl", server.getBaseUrl());
-        List<RemoteItem> result = s3Browser.listContent(
-                server.getBaseUrl() + testResourcesPath + "s3-prefix-org.springframework.xml");
-        assertEquals(result.size(), 35, "Unexpected content count");
-
-        RemoteItem directoryItem = result.get(0);
-        assertEquals(directoryItem.getUrl(), server.getBaseUrl() + "maven/bundles/release/org/springframework/batch/");
-        assertTrue(directoryItem.isDirectory());
-        assertEquals(directoryItem.getSize(), 0, "No size for directories");
-        assertEquals(directoryItem.getLastModified(), 0);
-
-        // files after folders
-        assertEquals(result.get(33).getUrl(),
-                server.getBaseUrl() + "maven/bundles/release/org/springframework/roo_$folder$");
-        assertFalse(result.get(33).isDirectory());
-        RemoteItem fileItem = result.get(34);
-        assertEquals(fileItem.getUrl(), server.getBaseUrl() + "maven/bundles/release/org/springframework/my.txt");
-        assertFalse(fileItem.isDirectory());
-        assertEquals(fileItem.getSize(), 23);
-        assertEquals(fileItem.getLastModified(), 1305442594000L);
-    }
-
-    public void listRemoteItemsFolderAndFilesWithSameName() throws IOException {
-        // some s3 repositories (e.g., terracotta http://repo.terracotta.org/?delimiter=/&prefix=maven2/) has files and
-        // folders with the same name (for instance file named 'org' and directory named 'org/' under the same directory)
-        // in such a case we prefer the directory and don't return the file
-        ReflectionTestUtils.setField(s3Browser, "rootUrl", server.getBaseUrl());
-        List<RemoteItem> result = s3Browser.listContent(server.getBaseUrl() + testResourcesPath + "s3-terracotta.xml");
-        assertEquals(result.size(), 6, "Unexpected content count");
-    }
-
-    @Test(enabled = false)
-    public void isS3RepositorySpring() {
-        boolean s3Repository = S3RepositoryBrowser.isS3Repository(
-                "http://repository.springsource.com/maven/bundles/release", client);
-        assertTrue(s3Repository, "Expected true for S3 repository");
-    }
-
-    @Test(enabled = false)
-    public void isS3RepositoryTerracotta() {
-        boolean s3Repository = S3RepositoryBrowser.isS3Repository("http://repo.terracotta.org/", client);
-        assertTrue(s3Repository, "Expected true for S3 repository");
-    }
-
-    @Test(enabled = false)
-    public void isS3RepositoryNonS3() {
-        boolean s3Repository = S3RepositoryBrowser.isS3Repository("http://repo.jfrog.org/artifactory/repo/org", client);
-        assertFalse(s3Repository, "Expected false for S3 repository");
-    }
-
-    @Test(enabled = false)
-    public void detectRootUsingRoot() throws IOException {
-        String rootUrl = s3Browser.detectRootUrl("http://repository.springsource.com/");
-        assertEquals(rootUrl, "http://repository.springsource.com/");
-    }
-
-    @Test(enabled = false)
-    public void detectRootUsingRootNoSlash() throws IOException {
-        String rootUrl = s3Browser.detectRootUrl("http://repository.springsource.com");
-        assertEquals(rootUrl, "http://repository.springsource.com/");
-    }
-
-    @Test(enabled = false)
-    public void detectRootTerracottaUsingRoot() throws IOException {
-        String rootUrl = s3Browser.detectRootUrl("http://repo.terracotta.org/");
-        assertEquals(rootUrl, "http://repo.terracotta.org/");
-    }
-
-    @Test(enabled = false)
-    public void detectRootTerracottaNoSlash() throws IOException {
-        String rootUrl = s3Browser.detectRootUrl("http://repo.terracotta.org/maven2");
-        assertEquals(rootUrl, "http://repo.terracotta.org/");
-    }
-
-    @Test(enabled = false)
-    public void detectRootTerracottaExistingSubFolder() throws IOException {
-        String rootUrl = s3Browser.detectRootUrl("http://repo.terracotta.org/maven2/org/");
-        assertEquals(rootUrl, "http://repo.terracotta.org/");
-    }
-
-    @Test(enabled = false)
-    public void detectRootTerracottaExistingSubFolderNoSlash() throws IOException {
-        String rootUrl = s3Browser.detectRootUrl("http://repo.terracotta.org/maven2/org");
-        assertEquals(rootUrl, "http://repo.terracotta.org/");
-    }
-
-    @Test(enabled = false)
-    public void detectRootTerracottaNonExistingSubFolder() throws IOException {
-        String rootUrl = s3Browser.detectRootUrl("http://repo.terracotta.org/maven2/blabla/");
-        assertEquals(rootUrl, "http://repo.terracotta.org/");
-    }
-
-    @Test(enabled = false)
-    public void detectRootTerracottaNonExistingSubFolderNoSlash() throws IOException {
-        String rootUrl = s3Browser.detectRootUrl("http://repo.terracotta.org/maven2/blabla");
-        assertEquals(rootUrl, "http://repo.terracotta.org/");
-    }
-
-    @Test(enabled = false)
-    public void detectRoot() throws IOException {
-        String rootUrl = s3Browser.detectRootUrl("http://repo.terracotta.org/org/test");
-        assertEquals(rootUrl, "http://repo.terracotta.org/");
-    }
-
-    @BeforeMethod
-    public void beforeTestMethod() {
-        HttpExecutor httpExecutor = new HttpExecutor() {
-            @Override
-            public CloseableHttpResponse executeMethod(HttpRequestBase method) throws IOException {
-                log.info("Executing " + method.getURI() + " on dummy S3 repo!");
-                return client.execute(method);
-            }
-        };
-        s3Browser = new S3RepositoryBrowser(httpExecutor);
-    }
-
-    @BeforeClass
-    public void setup() {
-
-        bindArtifactoryHome();
-
-        getBound().setProperty(ConstantValues.idleConnectionMonitorInterval, "10");
-        getBound().setProperty(ConstantValues.disableIdleConnectionMonitoring, "false");
-        idleConnectionMonitorService = new IdleConnectionMonitorServiceImpl();
-
-        contextMock = EasyMock.createMock(InternalArtifactoryContext.class);
-        EasyMock.expect(contextMock.beanForType(IdleConnectionMonitorService.class))
-                .andReturn(idleConnectionMonitorService).anyTimes();
-        ArtifactoryContextThreadBinder.bind(contextMock);
-        EasyMock.replay(contextMock);
-
-        server = new SimpleMockServer(new S3Handler());
-        server.start();
-        ArtifactoryHomeStub props = new ArtifactoryHomeStub();
-        props.setProperty(ConstantValues.artifactoryVersion, "TEST");
-        ArtifactoryHome.bind(props);
-
-
-
-        client = new HttpClientConfigurator().connectionTimeout(30000).soTimeout(2000).noRetry().getClient();
-        ArtifactoryHome.unbind();
-    }
-
-    @AfterClass
-    public void shutdown() throws IOException {
-        if(client!=null) client.close();
-        server.stop();
-    }
-
-    private class S3Handler extends AbstractHandler {
-        @Override
-        public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
-                throws IOException, ServletException {
-            String path = target;
-            // compose the resource path based on the prefix
-            String prefix = request.getParameter("prefix");
-            if (StringUtils.isNotBlank(prefix)) {
-                path += prefix;
-            }
-            InputStream resource = SimpleMockServer.class.getResourceAsStream(path);
-            if (resource == null) {
-                response.setStatus(HttpServletResponse.SC_NOT_FOUND);
-                // assume the root is the base http, so use the target path as the Key
-                String key = StringUtils.removeStart(target, "/");
-                String responseBody = new StringBuilder().append("<Error>")
-                        .append("<Code>NoSuchKey</Code>")
-                        .append("<Message>The specified key does not exist.</Message>")
-                        .append("<Key>").append(key).append("</Key>")
-                        .append("<RequestId>E69C77E280506925</RequestId>")
-                        .append("<HostId>AfNsMbcTZ0kw77y06lcsMEb6oxENUr80Xa0yR2P3kRs9fajMBHr0i1NYNRtjd8mV</HostId>")
-                        .append("</Error>").toString();
-                resource = new StringInputStream(responseBody);
-            }
-            IOUtils.copy(resource, response.getOutputStream());
-            baseRequest.setHandled(true);
-        }
-    }
-
-    private static final String testResourcesPath = "org/artifactory/repo/remote/browse/s3/";
-
-}
diff --git a/backend/core/src/test/java/org/artifactory/repo/remote/browse/S3RepositorySecuredHelperTest.java b/backend/core/src/test/java/org/artifactory/repo/remote/browse/S3RepositorySecuredHelperTest.java
deleted file mode 100644
index e2828c0..0000000
--- a/backend/core/src/test/java/org/artifactory/repo/remote/browse/S3RepositorySecuredHelperTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.remote.browse;
-
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.repo.HttpRepo;
-import org.artifactory.test.ArtifactoryHomeStub;
-import org.easymock.EasyMock;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.Date;
-
-/**
- * @author mamo
- */
-public class S3RepositorySecuredHelperTest {
-
-    @Test
-    public void testBuildSecuredS3RequestUrl() throws Exception {
-        ArtifactoryHome.bind(new ArtifactoryHomeStub());
-        HttpRepo httpRepo = EasyMock.createMock(HttpRepo.class);
-        EasyMock.expect(httpRepo.getUsername()).andReturn("aws-sandbox at jfrog.com").anyTimes();
-        EasyMock.expect(httpRepo.getPassword()).andReturn("forgot").anyTimes();
-        EasyMock.expect(httpRepo.getRetrievalCachePeriodSecs()).andReturn(1000l).anyTimes();
-        EasyMock.replay(httpRepo);
-
-        long expiration = new Date(1000).getTime(); //whatever
-
-        Assert.assertEquals(S3RepositorySecuredHelper.buildSecuredS3RequestUrl(
-                "https://s3.amazonaws.com/jfrog-sandbox-bucket/Folder1/filestroreFile.txt", "filestroreFile.txt",
-                httpRepo,
-                expiration),
-
-                "https://jfrog-sandbox-bucket.s3.amazonaws.com/filestroreFile.txt" +
-                        "?AWSAccessKeyId=aws-sandbox at jfrog.com&Expires=1&Signature=gyBqk0wwPmbzZz%2BaonQW%2FX05M0o%3D");
-
-        Assert.assertEquals(S3RepositorySecuredHelper.buildSecuredS3RequestUrl(
-                "https://s3.amazonaws.com/some-bucket/somefolder/somejar-1.0.jar", "somefolder/somejar-1.0.jar",
-                httpRepo,
-                expiration),
-
-                "https://some-bucket.s3.amazonaws.com/somefolder/somejar-1.0.jar" +
-                        "?AWSAccessKeyId=aws-sandbox at jfrog.com&Expires=1&Signature=sPhzSCsOHDrmRvjKAtOdvC6M8JQ%3D");
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/repo/replication/LocalReplicationJobTest.java b/backend/core/src/test/java/org/artifactory/repo/replication/LocalReplicationJobTest.java
deleted file mode 100644
index 9e5f00d..0000000
--- a/backend/core/src/test/java/org/artifactory/repo/replication/LocalReplicationJobTest.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.replication;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.replication.LocalReplicationSettings;
-import org.artifactory.addon.replication.LocalReplicationSettingsBuilder;
-import org.artifactory.addon.replication.ReplicationAddon;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.context.ArtifactoryContextThreadBinder;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.descriptor.config.CentralConfigDescriptorImpl;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.schedule.Task;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.expectLastCall;
-
-/**
- * @author Noam Y. Tenne
- */
-public class LocalReplicationJobTest extends ReplicationJobTestBase {
-
-    private static final LocalReplicationJob job = new LocalReplicationJob();
-    private LocalReplicationDescriptor replicationDescriptor;
-    private LocalReplicationSettings replicationSettings;
-
-    @BeforeClass
-    public void setUp() throws Exception {
-        ArtifactoryContextThreadBinder.bind(artifactoryContext);
-
-        replicationDescriptor = new LocalReplicationDescriptor();
-        replicationDescriptor.setRepoKey("key");
-        replicationDescriptor.setEnabled(true);
-        replicationDescriptor.setPathPrefix("path");
-        replicationDescriptor.setSyncDeletes(true);
-        replicationDescriptor.setSyncProperties(true);
-        replicationDescriptor.setSocketTimeoutMillis(111111);
-        replicationDescriptor.setUrl("http://momo.com");
-        replicationDescriptor.setProxy(new ProxyDescriptor());
-        replicationDescriptor.setUsername("username");
-        replicationDescriptor.setPassword("password");
-        replicationDescriptor.setEnableEventReplication(true);
-
-        replicationSettings = new LocalReplicationSettingsBuilder(replicationDescriptor.getRepoPath(),
-                replicationDescriptor.getUrl())
-                .deleteExisting(replicationDescriptor.isSyncDeletes())
-                .includeProperties(replicationDescriptor.isSyncProperties())
-                .username(replicationDescriptor.getUsername())
-                .password(replicationDescriptor.getPassword())
-                .proxyDescriptor(replicationDescriptor.getProxy())
-                .socketTimeoutMillis(replicationDescriptor.getSocketTimeoutMillis())
-                .build();
-    }
-
-    @Test
-    public void testContextNotReady() throws Exception {
-        expect(artifactoryContext.isReady()).andReturn(false);
-        replayMocks();
-        job.onExecute(null);
-        verifyMocks();
-    }
-
-    @Test(expectedExceptions = NullPointerException.class)
-    public void testNullRepoKey() throws Exception {
-        expect(artifactoryContext.isReady()).andReturn(true);
-        expect(executionContext.getJobDetail()).andReturn(jobDetail);
-        expect(jobDetail.getJobDataMap()).andReturn(jobDataMap);
-        replayMocks();
-        job.onExecute(null);
-        verifyMocks();
-    }
-
-    @Test
-    public void testExecutionException() throws Exception {
-        expect(artifactoryContext.isReady()).andReturn(true);
-        expect(executionContext.getJobDetail()).andReturn(jobDetail);
-        expect(jobDetail.getJobDataMap()).andReturn(jobDataMap);
-        expect(jobDataMap.getString(Task.REPO_KEY)).andReturn("key");
-        expect(jobDataMap.getString(Task.PUSH_REPLICATION_URL)).andReturn("http://momo.com");
-        expect(jobDataMap.get(ReplicationAddon.TASK_MANUAL_DESCRIPTOR)).andReturn(null);
-
-        CentralConfigDescriptorImpl centralConfig = new CentralConfigDescriptorImpl();
-        centralConfig.addLocalReplication(replicationDescriptor);
-        expect(configService.getDescriptor()).andReturn(centralConfig).anyTimes();
-        expect(artifactoryContext.getCentralConfig()).andReturn(configService).anyTimes();
-        expect(artifactoryContext.beanForType(SecurityService.class)).andReturn(securityService);
-        securityService.authenticateAsSystem();
-        expectLastCall();
-        expect(artifactoryContext.beanForType(AddonsManager.class)).andReturn(addonsManager);
-        expect(addonsManager.addonByType(ReplicationAddon.class)).andReturn(replicationAddon);
-        expect(replicationAddon.performLocalReplication(replicationSettings))
-                .andThrow(new IOException());
-        securityService.nullifyContext();
-        expectLastCall();
-        replayMocks();
-        job.onExecute(executionContext);
-        verifyMocks();
-    }
-
-    @Test
-    public void testExecution() throws Exception {
-        expect(artifactoryContext.isReady()).andReturn(true);
-        expect(executionContext.getJobDetail()).andReturn(jobDetail);
-        expect(jobDetail.getJobDataMap()).andReturn(jobDataMap);
-        expect(jobDataMap.getString(Task.REPO_KEY)).andReturn("key");
-        expect(jobDataMap.getString(Task.PUSH_REPLICATION_URL)).andReturn("http://momo.com");
-        expect(jobDataMap.get(ReplicationAddon.TASK_MANUAL_DESCRIPTOR)).andReturn(null);
-
-        CentralConfigDescriptorImpl centralConfig = new CentralConfigDescriptorImpl();
-        centralConfig.addLocalReplication(replicationDescriptor);
-        expect(configService.getDescriptor()).andReturn(centralConfig).anyTimes();
-        expect(artifactoryContext.getCentralConfig()).andReturn(configService).anyTimes();
-        expect(artifactoryContext.beanForType(SecurityService.class)).andReturn(securityService);
-        securityService.authenticateAsSystem();
-        expectLastCall();
-        expect(artifactoryContext.beanForType(AddonsManager.class)).andReturn(addonsManager);
-        expect(addonsManager.addonByType(ReplicationAddon.class)).andReturn(replicationAddon);
-        expect(replicationAddon.performLocalReplication(replicationSettings))
-                .andReturn(new BasicStatusHolder());
-        securityService.nullifyContext();
-        expectLastCall();
-        replayMocks();
-        job.onExecute(executionContext);
-        verifyMocks();
-    }
-
-    @Test
-    public void testManualExecution() throws Exception {
-        expect(artifactoryContext.isReady()).andReturn(true);
-        expect(executionContext.getJobDetail()).andReturn(jobDetail);
-        expect(jobDetail.getJobDataMap()).andReturn(jobDataMap);
-        expect(jobDataMap.get(ReplicationAddon.TASK_MANUAL_DESCRIPTOR)).andReturn(replicationDescriptor);
-
-        expect(artifactoryContext.beanForType(SecurityService.class)).andReturn(securityService);
-        CentralConfigDescriptorImpl centralConfig = new CentralConfigDescriptorImpl();
-        centralConfig.addLocalReplication(replicationDescriptor);
-        expect(configService.getDescriptor()).andReturn(centralConfig).anyTimes();
-        expect(artifactoryContext.getCentralConfig()).andReturn(configService).anyTimes();
-        securityService.authenticateAsSystem();
-        expectLastCall();
-        expect(artifactoryContext.beanForType(AddonsManager.class)).andReturn(addonsManager);
-        expect(addonsManager.addonByType(ReplicationAddon.class)).andReturn(replicationAddon);
-        expect(replicationAddon.performLocalReplication(replicationSettings))
-                .andReturn(new BasicStatusHolder());
-        securityService.nullifyContext();
-        expectLastCall();
-        replayMocks();
-        job.onExecute(executionContext);
-        verifyMocks();
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/repo/replication/RemoteReplicationJobTest.java b/backend/core/src/test/java/org/artifactory/repo/replication/RemoteReplicationJobTest.java
deleted file mode 100644
index 5695e60..0000000
--- a/backend/core/src/test/java/org/artifactory/repo/replication/RemoteReplicationJobTest.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.replication;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.replication.RemoteReplicationSettings;
-import org.artifactory.addon.replication.RemoteReplicationSettingsBuilder;
-import org.artifactory.addon.replication.ReplicationAddon;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.context.ArtifactoryContextThreadBinder;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.descriptor.config.CentralConfigDescriptorImpl;
-import org.artifactory.descriptor.replication.RemoteReplicationDescriptor;
-import org.artifactory.descriptor.repo.HttpRepoDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.schedule.Task;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.expectLastCall;
-
-
-/**
- * @author Noam Y. Tenne
- */
-public class RemoteReplicationJobTest extends ReplicationJobTestBase {
-
-    private static final RemoteReplicationJob job = new RemoteReplicationJob();
-    private RemoteReplicationDescriptor replicationDescriptor;
-    private RemoteReplicationSettings replicationSettings;
-    private RemoteRepoDescriptor repoDescriptor = new HttpRepoDescriptor();
-
-    @BeforeClass
-    public void setUp() throws Exception {
-        ArtifactoryContextThreadBinder.bind(artifactoryContext);
-
-        replicationDescriptor = new RemoteReplicationDescriptor();
-        replicationDescriptor.setRepoKey("key");
-        replicationDescriptor.setEnabled(true);
-        replicationDescriptor.setPathPrefix("path");
-        replicationDescriptor.setSyncDeletes(true);
-        replicationDescriptor.setSyncProperties(true);
-
-        replicationSettings = new RemoteReplicationSettingsBuilder(replicationDescriptor.getRepoPath())
-                .deleteExisting(replicationDescriptor.isSyncDeletes())
-                .includeProperties(replicationDescriptor.isSyncProperties())
-                .build();
-    }
-
-    @Test
-    public void testContextNotReady() throws Exception {
-        expect(artifactoryContext.isReady()).andReturn(false);
-        replayMocks();
-        job.onExecute(null);
-        verifyMocks();
-    }
-
-    @Test(expectedExceptions = NullPointerException.class)
-    public void testNullRepoKey() throws Exception {
-        expect(artifactoryContext.isReady()).andReturn(true);
-        expect(executionContext.getJobDetail()).andReturn(jobDetail);
-        expect(jobDetail.getJobDataMap()).andReturn(jobDataMap);
-        replayMocks();
-        job.onExecute(null);
-        verifyMocks();
-    }
-
-    @Test
-    public void testExecutionException() throws Exception {
-        expect(artifactoryContext.isReady()).andReturn(true);
-        expect(executionContext.getJobDetail()).andReturn(jobDetail);
-        expect(jobDetail.getJobDataMap()).andReturn(jobDataMap);
-        expect(jobDataMap.getString(Task.REPO_KEY)).andReturn("key");
-        expect(jobDataMap.get(ReplicationAddon.TASK_MANUAL_DESCRIPTOR)).andReturn(null);
-
-        CentralConfigDescriptorImpl centralConfig = new CentralConfigDescriptorImpl();
-        centralConfig.addRemoteReplication(replicationDescriptor);
-        expect(configService.getDescriptor()).andReturn(centralConfig).anyTimes();
-        expect(artifactoryContext.getCentralConfig()).andReturn(configService).anyTimes();
-        expect(artifactoryContext.getRepositoryService()).andReturn(repositoryService);
-        expect(repositoryService.remoteRepoDescriptorByKey("key")).andReturn(repoDescriptor);
-        expect(artifactoryContext.beanForType(SecurityService.class)).andReturn(securityService);
-        securityService.authenticateAsSystem();
-        expectLastCall();
-        expect(artifactoryContext.beanForType(AddonsManager.class)).andReturn(addonsManager);
-        expect(addonsManager.addonByType(ReplicationAddon.class)).andReturn(replicationAddon);
-        expect(replicationAddon.performRemoteReplication(replicationSettings)).andThrow(new IOException());
-        securityService.nullifyContext();
-        expectLastCall();
-        replayMocks();
-        job.onExecute(executionContext);
-        verifyMocks();
-    }
-
-    @Test
-    public void testExecution() throws Exception {
-        expect(artifactoryContext.isReady()).andReturn(true);
-        expect(executionContext.getJobDetail()).andReturn(jobDetail);
-        expect(jobDetail.getJobDataMap()).andReturn(jobDataMap);
-        expect(jobDataMap.getString(Task.REPO_KEY)).andReturn("key");
-        expect(jobDataMap.get(ReplicationAddon.TASK_MANUAL_DESCRIPTOR)).andReturn(null);
-
-        CentralConfigDescriptorImpl centralConfig = new CentralConfigDescriptorImpl();
-        centralConfig.addRemoteReplication(replicationDescriptor);
-        expect(configService.getDescriptor()).andReturn(centralConfig).anyTimes();
-        expect(artifactoryContext.getCentralConfig()).andReturn(configService).anyTimes();
-        expect(artifactoryContext.beanForType(SecurityService.class)).andReturn(securityService);
-        expect(artifactoryContext.getRepositoryService()).andReturn(repositoryService);
-        expect(repositoryService.remoteRepoDescriptorByKey("key")).andReturn(repoDescriptor);
-        securityService.authenticateAsSystem();
-        expectLastCall();
-        expect(artifactoryContext.beanForType(AddonsManager.class)).andReturn(addonsManager);
-        expect(addonsManager.addonByType(ReplicationAddon.class)).andReturn(replicationAddon);
-        expect(replicationAddon.performRemoteReplication(replicationSettings)).andReturn(new BasicStatusHolder());
-        securityService.nullifyContext();
-        expectLastCall();
-        replayMocks();
-        job.onExecute(executionContext);
-        verifyMocks();
-    }
-
-    @Test
-    public void testManualExecution() throws Exception {
-        expect(artifactoryContext.isReady()).andReturn(true);
-        expect(executionContext.getJobDetail()).andReturn(jobDetail);
-        expect(jobDetail.getJobDataMap()).andReturn(jobDataMap);
-        expect(jobDataMap.get(ReplicationAddon.TASK_MANUAL_DESCRIPTOR)).andReturn(replicationDescriptor);
-
-        expect(artifactoryContext.beanForType(SecurityService.class)).andReturn(securityService);
-        CentralConfigDescriptorImpl centralConfig = new CentralConfigDescriptorImpl();
-        expect(configService.getDescriptor()).andReturn(centralConfig).anyTimes();
-        expect(artifactoryContext.getCentralConfig()).andReturn(configService).anyTimes();
-        securityService.authenticateAsSystem();
-        expectLastCall();
-        expect(artifactoryContext.beanForType(AddonsManager.class)).andReturn(addonsManager);
-        expect(addonsManager.addonByType(ReplicationAddon.class)).andReturn(replicationAddon);
-        expect(artifactoryContext.getRepositoryService()).andReturn(repositoryService);
-        expect(repositoryService.remoteRepoDescriptorByKey("key")).andReturn(repoDescriptor);
-        expect(replicationAddon.performRemoteReplication(replicationSettings)).andReturn(new BasicStatusHolder());
-        securityService.nullifyContext();
-        expectLastCall();
-        replayMocks();
-        job.onExecute(executionContext);
-        verifyMocks();
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/repo/replication/ReplicationJobTestBase.java b/backend/core/src/test/java/org/artifactory/repo/replication/ReplicationJobTestBase.java
deleted file mode 100644
index 527d958..0000000
--- a/backend/core/src/test/java/org/artifactory/repo/replication/ReplicationJobTestBase.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.replication;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.replication.ReplicationAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.spring.InternalArtifactoryContext;
-import org.easymock.EasyMock;
-import org.quartz.JobDataMap;
-import org.quartz.JobDetail;
-import org.quartz.JobExecutionContext;
-import org.testng.annotations.BeforeMethod;
-
-/**
- * @author Noam Y. Tenne
- */
-public abstract class ReplicationJobTestBase {
-
-    protected static final InternalArtifactoryContext artifactoryContext = EasyMock.createMock(
-            InternalArtifactoryContext.class);
-    protected static final JobExecutionContext executionContext = EasyMock.createMock(JobExecutionContext.class);
-    protected static final JobDetail jobDetail = EasyMock.createMock(JobDetail.class);
-    protected static final JobDataMap jobDataMap = EasyMock.createMock(JobDataMap.class);
-    protected static final CentralConfigService configService = EasyMock.createMock(CentralConfigService.class);
-    protected static final SecurityService securityService = EasyMock.createMock(SecurityService.class);
-    protected static final AddonsManager addonsManager = EasyMock.createMock(AddonsManager.class);
-    protected static final ReplicationAddon replicationAddon = EasyMock.createMock(ReplicationAddon.class);
-    protected static final RepositoryService repositoryService = EasyMock.createMock(RepositoryService.class);
-
-    @BeforeMethod
-    public void reset() throws Exception {
-        EasyMock.reset(artifactoryContext, executionContext, jobDetail, jobDataMap, configService, securityService,
-                addonsManager, replicationAddon, repositoryService);
-    }
-
-    protected void replayMocks() {
-        EasyMock.replay(artifactoryContext, executionContext, jobDetail, jobDataMap, configService, securityService,
-                addonsManager, replicationAddon, repositoryService);
-    }
-
-    protected void verifyMocks() {
-        EasyMock.verify(artifactoryContext, executionContext, jobDetail, jobDataMap, configService, securityService,
-                addonsManager, replicationAddon, repositoryService);
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/repo/service/ImportJobSpec.groovy b/backend/core/src/test/java/org/artifactory/repo/service/ImportJobSpec.groovy
deleted file mode 100644
index bb6bf31..0000000
--- a/backend/core/src/test/java/org/artifactory/repo/service/ImportJobSpec.groovy
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.artifactory.repo.service
-
-import com.google.common.io.Files
-import org.artifactory.api.config.RepositoryImportSettingsImpl
-import org.artifactory.repo.db.importexport.DbRepoImportHandler
-import org.quartz.JobDataMap
-import org.quartz.JobExecutionContext
-import org.quartz.impl.JobDetailImpl
-import org.springframework.core.task.AsyncTaskExecutor
-import spock.lang.Specification
-
-import java.util.concurrent.Callable
-import java.util.concurrent.Future
-import java.util.concurrent.Semaphore
-
-/**
- *
- * @author Yoav Luft
- */
-class ImportJobSpec extends Specification {
-
-    def "test finalizeImport called only after import"() {
-        setup:
-        def asyncTaskExecutor = Mock(AsyncTaskExecutor)
-        def callablesFactory = Mock(ImportHandlerCallablesFactory)
-        def semaphore = new Semaphore(3)
-        def repositoryService = Mock(InternalRepositoryService)
-
-        def importJob = new ImportJob(asyncTaskExecutor, callablesFactory, semaphore, repositoryService)
-
-        def repositoryKeys = ["repo1", "repo2", "repo3"]
-        def importRootFile = createDirectories(repositoryKeys)
-        importRootFile.mkdir()
-        def importSettings = new RepositoryImportSettingsImpl(importRootFile)
-
-        importSettings.repositories = repositoryKeys
-
-        def repo1Handler = Mock(DbRepoImportHandler)
-        def repo1Callable = { return repo1Handler } as Callable<DbRepoImportHandler>
-        def repo2Handler = Mock(DbRepoImportHandler)
-        def repo2Callable = { return repo2Handler } as Callable<DbRepoImportHandler>
-        def repo3Handler = Mock(DbRepoImportHandler)
-        def repo3Callable = { return repo3Handler } as Callable
-
-        def internalDataMap = [:]
-        internalDataMap.put(RepositoryImportSettingsImpl.class.getName(), importSettings)
-        def jobDataMap = new JobDataMap(internalDataMap)
-
-        def jobDetail = new JobDetailImpl()
-        jobDetail.setJobDataMap(jobDataMap)
-
-        def jobExecutionContext = Mock(JobExecutionContext)
-        jobExecutionContext.getJobDetail() >> jobDetail
-
-        when:
-        importJob.onExecute(jobExecutionContext)
-
-        then:
-        1 * callablesFactory.create("repo1", _ as File) >> { repo1Callable }
-        1 * callablesFactory.create("repo2", _ as File) >> { repo2Callable }
-        1 * callablesFactory.create("repo3", _ as File) >> { repo3Callable }
-        1 * asyncTaskExecutor.submit(repo1Callable) >> { { -> return repo1Handler } as Future }
-        1 * asyncTaskExecutor.submit(repo2Callable) >> { { -> return repo2Handler } as Future }
-        1 * asyncTaskExecutor.submit(repo3Callable) >> { { -> return repo3Handler } as Future }
-
-        then:
-        1 * repo1Handler.finalizeImport()
-        1 * repo2Handler.finalizeImport()
-        1 * repo3Handler.finalizeImport()
-
-        cleanup:
-        importRootFile.delete()
-    }
-
-    def createDirectories(dirNames) {
-        def root = Files.createTempDir()
-        root.setExecutable(true)
-        root.setWritable(true)
-        dirNames.each {
-            new File(root, it).mkdir()
-        }
-        return root
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/repo/service/mover/RepoPathIteratorTest.java b/backend/core/src/test/java/org/artifactory/repo/service/mover/RepoPathIteratorTest.java
deleted file mode 100644
index 935c4b6..0000000
--- a/backend/core/src/test/java/org/artifactory/repo/service/mover/RepoPathIteratorTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.service.mover;
-
-import org.artifactory.model.common.RepoPathImpl;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the {@link org.artifactory.repo.service.mover.RepoPathIterator}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class RepoPathIteratorTest {
-
-    public void rootRepoPath() {
-        RepoPathImpl root = new RepoPathImpl("root", "");
-        RepoPathIterator iter = new RepoPathIterator(root);
-        assertTrue(iter.hasNext());
-        assertEquals(iter.next(), root);
-        assertFalse(iter.hasNext());
-    }
-
-    public void twoLevelsRepoPath() {
-        RepoPathImpl orig = new RepoPathImpl("root", "1/2");
-        RepoPathIterator iter = new RepoPathIterator(orig);
-        assertTrue(iter.hasNext());
-        assertEquals(iter.next(), orig.getParent().getParent());
-        assertTrue(iter.hasNext());
-        assertEquals(iter.next(), orig.getParent());
-        assertTrue(iter.hasNext());
-        assertEquals(iter.next(), orig);
-        assertFalse(iter.hasNext());
-    }
-
-    @Test(expectedExceptions = NullPointerException.class)
-    public void nullPath() {
-        new RepoPathIterator(null);
-    }
-
-}
diff --git a/backend/core/src/test/java/org/artifactory/repo/service/trash/TrashSkipInterceptorsTest.java b/backend/core/src/test/java/org/artifactory/repo/service/trash/TrashSkipInterceptorsTest.java
deleted file mode 100644
index 89b3de4..0000000
--- a/backend/core/src/test/java/org/artifactory/repo/service/trash/TrashSkipInterceptorsTest.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package org.artifactory.repo.service.trash;
-
-import com.google.common.collect.Maps;
-import junit.framework.AssertionFailedError;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.repo.interceptor.storage.StorageInterceptorsImpl;
-import org.artifactory.repo.trash.TrashService;
-import org.artifactory.sapi.fs.VfsItem;
-import org.artifactory.sapi.interceptor.DeleteContext;
-import org.artifactory.sapi.interceptor.StorageInterceptor;
-import org.artifactory.spring.ArtifactoryApplicationContext;
-import org.testng.annotations.Test;
-
-import java.util.Map;
-
-import static org.easymock.EasyMock.*;
-
-/**
- * Test that storage interceptors are not triggered on the trash
- *
- * @author Shay Yaakov
- */
-public class TrashSkipInterceptorsTest {
-
-    @Test
-    public void testInterceptors() throws Exception {
-        StorageInterceptor root = createMock(StorageInterceptor.class);
-        StorageInterceptor interceptor = prepareMockInterceptor(true);
-
-        Map<String, StorageInterceptor> interceptorsHashMap = Maps.newHashMap();
-        interceptorsHashMap.put("root", root);
-        interceptorsHashMap.put("skipper", interceptor);
-
-        ArtifactoryApplicationContext context = createMock(ArtifactoryApplicationContext.class);
-        expect(context.beansForType(StorageInterceptor.class)).andReturn(interceptorsHashMap);
-        expect(context.getBean("root")).andReturn(root);
-
-        VfsItem vfsItem = createMock(VfsItem.class);
-        RepoPath repoPath = RepoPathFactory.create(TrashService.TRASH_KEY, "some/path");
-        expect(vfsItem.getRepoPath()).andReturn(repoPath).anyTimes();
-        replay(root, interceptor, context, vfsItem);
-        StorageInterceptorsImpl interceptors = new StorageInterceptorsImpl();
-        interceptors.setApplicationContext(context);
-        interceptors.setBeanName("root");
-        interceptors.init();
-        interceptors.beforeCreate(vfsItem, null);
-        interceptors.afterCreate(vfsItem, null);
-        interceptors.beforeDelete(vfsItem, null, false);
-        interceptors.afterDelete(vfsItem, null, new DeleteContext(vfsItem.getRepoPath()));
-        interceptors.beforeCopy(null, repoPath, null, null);
-        interceptors.afterCopy(null, vfsItem, null, null);
-        interceptors.beforeMove(vfsItem, null, null, null);
-        interceptors.beforePropertyCreate(vfsItem, null, null);
-        interceptors.afterPropertyCreate(vfsItem, null, null);
-        interceptors.beforePropertyDelete(vfsItem, null, null);
-        interceptors.afterPropertyDelete(vfsItem, null, null);
-        verify(root, interceptor, context, vfsItem);
-    }
-
-
-    private StorageInterceptor prepareMockInterceptor(boolean failOnCreate) {
-        StorageInterceptor interceptor = createMock(StorageInterceptor.class);
-        interceptor.beforeCreate(anyObject(VfsItem.class), anyObject(MutableStatusHolder.class));
-        failOnMethodCall();
-        interceptor.afterCreate(anyObject(VfsItem.class), anyObject(MutableStatusHolder.class));
-        if (failOnCreate) {
-            failOnMethodCall();
-        } else {
-            expectLastCall();
-        }
-        interceptor.beforeDelete(anyObject(VfsItem.class), anyObject(MutableStatusHolder.class), eq(false));
-        failOnMethodCall();
-        interceptor.afterDelete(anyObject(VfsItem.class), anyObject(MutableStatusHolder.class), anyObject(DeleteContext.class));
-        failOnMethodCall();
-        interceptor.beforeCopy(anyObject(), anyObject(), anyObject(), anyObject());
-        failOnMethodCall();
-        interceptor.afterCopy(anyObject(), anyObject(), anyObject(), anyObject());
-        failOnMethodCall();
-        interceptor.beforeMove(anyObject(), anyObject(), anyObject(), anyObject());
-        failOnMethodCall();
-        interceptor.afterMove(anyObject(), anyObject(), anyObject(), anyObject());
-        failOnMethodCall();
-        interceptor.beforePropertyCreate(anyObject(), anyObject(), anyObject());
-        failOnMethodCall();
-        interceptor.afterPropertyCreate(anyObject(), anyObject(), anyObject());
-        failOnMethodCall();
-        interceptor.beforePropertyDelete(anyObject(), anyObject(), anyObject());
-        failOnMethodCall();
-        interceptor.afterPropertyDelete(anyObject(), anyObject(), anyObject());
-        failOnMethodCall();
-
-        return interceptor;
-    }
-
-    private void failOnMethodCall() {
-        expectLastCall().andThrow(new AssertionFailedError("Interceptor should not get called on trash")).anyTimes();
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/test/java/org/artifactory/repo/snapshot/BaseSnapshotAdapterTest.java b/backend/core/src/test/java/org/artifactory/repo/snapshot/BaseSnapshotAdapterTest.java
deleted file mode 100644
index 3c3acb3..0000000
--- a/backend/core/src/test/java/org/artifactory/repo/snapshot/BaseSnapshotAdapterTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.snapshot;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.module.ModuleInfoUtils;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.artifactory.util.RepoLayoutUtils;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * @author Noam Y. Tenne
- */
-public abstract class BaseSnapshotAdapterTest<T extends MavenSnapshotVersionAdapter> extends ArtifactoryHomeBoundTest {
-
-    private T adapter;
-
-    public BaseSnapshotAdapterTest(T adapter) {
-        this.adapter = adapter;
-    }
-
-    private ModuleInfo getModuleInfo(String path) {
-        return ModuleInfoUtils.moduleInfoFromArtifactPath(path, RepoLayoutUtils.MAVEN_2_DEFAULT);
-    }
-
-    protected void adapt(String pathToAdjust, String expectedResult) {
-        adapt(pathToAdjust, expectedResult, null);
-    }
-
-    protected void adapt(String pathToAdjust, String expectedResult, String errorMessage) {
-        String result = adjust(pathToAdjust);
-
-        if (StringUtils.isBlank(errorMessage)) {
-            assertEquals(result, expectedResult);
-        } else {
-            assertEquals(result, expectedResult, errorMessage);
-        }
-    }
-
-    protected String adjust(String pathToAdjust) {
-        MavenSnapshotVersionAdapterContext context = new MavenSnapshotVersionAdapterContext(
-                InternalRepoPathFactory.create("local", pathToAdjust), getModuleInfo(pathToAdjust));
-        return adapter.adaptSnapshotPath(context);
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/repo/snapshot/NonUniqueSnapshotVersionAdapterTest.java b/backend/core/src/test/java/org/artifactory/repo/snapshot/NonUniqueSnapshotVersionAdapterTest.java
deleted file mode 100644
index 0284f4d..0000000
--- a/backend/core/src/test/java/org/artifactory/repo/snapshot/NonUniqueSnapshotVersionAdapterTest.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.snapshot;
-
-import org.testng.annotations.Test;
-
-/**
- * Unit tests for {@link NonUniqueSnapshotVersionAdapter}.<p/> Only the easy to unit test are here, the rest are in the
- * integration tests.
- *
- * @author Yossi Shaul
- */
- at Test
-public class NonUniqueSnapshotVersionAdapterTest extends BaseSnapshotAdapterTest<NonUniqueSnapshotVersionAdapter> {
-
-    private final String SNAPSHOT_PATH = "groupId/artifactId/1.4-SNAPSHOT/";
-
-    public NonUniqueSnapshotVersionAdapterTest() {
-        super(new NonUniqueSnapshotVersionAdapter());
-    }
-
-    public void uniqueArtifact() {
-        String path = SNAPSHOT_PATH + "artifactId-1.4-20081214.090217-4.jar";
-
-        adapt(path, SNAPSHOT_PATH + "artifactId-1.4-SNAPSHOT.jar");
-    }
-
-    public void uniqueArtifactWithClassifier() {
-        String path = SNAPSHOT_PATH + "artifactId-1.4-20081214.090217-4-classifier.jar";
-
-        adapt(path, SNAPSHOT_PATH + "artifactId-1.4-SNAPSHOT-classifier.jar");
-    }
-
-    public void uniqueArtifactWithComplexClassifier() {
-        String path = SNAPSHOT_PATH + "artifactId-1.4-20081214.090217-4-a-2complex-classifier.jar";
-
-        adapt(path, SNAPSHOT_PATH + "artifactId-1.4-SNAPSHOT-a-2complex-classifier.jar");
-    }
-
-    public void alreadyNonUniqueArtifact() {
-        String path = SNAPSHOT_PATH + "artifactId-1.4-SNAPSHOT.jar";
-
-        adapt(path, path);
-    }
-
-    public void uniqueChecksumArtifact() {
-        String path = SNAPSHOT_PATH + "artifactId-1.4-20081214.090217-4.jar.sha1";
-
-        adapt(path, SNAPSHOT_PATH + "artifactId-1.4-SNAPSHOT.jar.sha1");
-    }
-
-    public void alreadyNonUniqueChecksumArtifact() {
-        String path = SNAPSHOT_PATH + "artifactId-1.4-SNAPSHOT.jar.md5";
-
-        adapt(path, path);
-    }
-
-    public void artifactWithReleaseVersion() {
-        String path = SNAPSHOT_PATH + "artifactId-1.4.ivy";
-
-        adapt(path, path, "Files with release version should not be affected");
-    }
-
-    public void artifactWithNoMavenStructure() {
-        String path = SNAPSHOT_PATH + "blabla.xml";
-
-        adapt(path, path, "Non-maven structured files with release version should not be affected");
-    }
-
-    public void uniqueArtifactVersionWithDashes() {
-        String snapshotPath = "groupId/artifact_id/2.5-TEST-SNAPSHOT/";
-        String uniqueVersionFile = "artifact_id-2.5-TEST-20071014.090217-2.jar";
-        String path = snapshotPath + uniqueVersionFile;
-
-        adapt(path, snapshotPath + "artifact_id-2.5-TEST-SNAPSHOT.jar");
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/repo/snapshot/UniqueSnapshotVersionAdapterTest.java b/backend/core/src/test/java/org/artifactory/repo/snapshot/UniqueSnapshotVersionAdapterTest.java
deleted file mode 100644
index a201c11..0000000
--- a/backend/core/src/test/java/org/artifactory/repo/snapshot/UniqueSnapshotVersionAdapterTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.snapshot;
-
-import org.artifactory.api.context.ArtifactoryContextThreadBinder;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.spring.InternalArtifactoryContext;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import static org.artifactory.mime.MavenNaming.MAVEN_METADATA_NAME;
-import static org.easymock.EasyMock.*;
-
-/**
- * Unit tests for {@link UniqueSnapshotVersionAdapter}.<p/> Only the easy to unit test are here, the rest are in the
- * integration tests.
- *
- * @author Yossi Shaul
- */
- at Test
-public class UniqueSnapshotVersionAdapterTest extends BaseSnapshotAdapterTest<UniqueSnapshotVersionAdapter> {
-
-    private static final String SNAPSHOT_PATH = "groupPart1/groupPart2/artifactId/2.5-SNAPSHOT/";
-
-    public UniqueSnapshotVersionAdapterTest() {
-        super(new UniqueSnapshotVersionAdapter());
-    }
-
-    public void alreadyUniqueArtifact() {
-        String path = SNAPSHOT_PATH + "artifactId-2.5-20071014.090200-4.jar";
-        adapt(path, path, "Unique snapshots shouldn't be touched");
-    }
-
-    public void alreadyUniqueArtifactWithClassifier() {
-        String path = SNAPSHOT_PATH + "artifactId-2.5-20071014.090200-4-classifier.jar";
-
-        adapt(path, path, "Unique snapshots shouldn't be touched");
-    }
-
-    public void alreadyUniqueChecksumArtifact() {
-        String path = SNAPSHOT_PATH + "artifactId-2.5-20071014.090200-4.jar.sha1";
-
-        adapt(path, path);
-    }
-
-    public void artifactWithReleaseVersion() {
-        String path = SNAPSHOT_PATH + "artifactId-1.4.ivy";
-
-        adapt(path, path, "Files with release version should not be affected");
-    }
-
-    public void artifactWithNoMavenStructure() {
-        String path = SNAPSHOT_PATH + "blabla.xml";
-
-        adapt(path, path, "Non-maven structured files with release version should not be affected");
-    }
-
-    public void testArtifactWithSnapshotInTheClassifier() throws Exception {
-        String path = SNAPSHOT_PATH + "artifactId-2.5-SNAPSHOT-lib-2.3-SNAPSHOT-jdk5.jar";
-        RepoPath repoPath = RepoPathFactory.create("local", path);
-        RepositoryService repositoryServiceMock = createMock(RepositoryService.class);
-        expect(repositoryServiceMock.exists(repoPath)).andReturn(false).anyTimes();
-        expect(repositoryServiceMock.exists(repoPath.getParent())).andReturn(false).anyTimes();
-        expect(repositoryServiceMock.exists(new RepoPathImpl(repoPath.getParent(), MAVEN_METADATA_NAME)))
-                .andReturn(false).anyTimes();
-        InternalArtifactoryContext contextMock = createMock(InternalArtifactoryContext.class);
-        expect(contextMock.getRepositoryService()).andReturn(repositoryServiceMock).anyTimes();
-        ArtifactoryContextThreadBinder.bind(contextMock);
-        replay(repositoryServiceMock, contextMock);
-        String adjustedPath = adjust(path);
-        verify(repositoryServiceMock, contextMock);
-        Pattern pattern = Pattern.compile(
-                "groupPart1/groupPart2/artifactId/2\\.5\\-SNAPSHOT/artifactId\\-2\\.5\\-(\\d{8}\\.\\d{6}\\-\\d{1})\\" +
-                        "-lib\\-2\\.3\\-SNAPSHOT\\-jdk5\\.jar");
-        Matcher matcher = pattern.matcher(adjustedPath);
-        Assert.assertTrue(matcher.matches(), "Unexpected transformed path");
-        ArtifactoryContextThreadBinder.unbind();
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/test/java/org/artifactory/repo/virtual/interceptor/PomTransformerTest.java b/backend/core/src/test/java/org/artifactory/repo/virtual/interceptor/PomTransformerTest.java
deleted file mode 100644
index cec7a02..0000000
--- a/backend/core/src/test/java/org/artifactory/repo/virtual/interceptor/PomTransformerTest.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.virtual.interceptor;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.maven.model.Activation;
-import org.apache.maven.model.Model;
-import org.apache.maven.model.Profile;
-import org.artifactory.checksum.ChecksumsInfo;
-import org.artifactory.descriptor.repo.PomCleanupPolicy;
-import org.artifactory.io.checksum.ChecksumUtil;
-import org.artifactory.maven.MavenModelUtils;
-import org.artifactory.repo.virtual.interceptor.transformer.PomTransformer;
-import org.artifactory.util.ResourceUtils;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-/**
- * IMPORTANT FOR FUTURE EDITORS: WHEN ADDING A NEW POM TRANSFORMATION SCENARIO, MAKE SURE TO ADD ONE FOR THE
- * TRANSFORMABLE ONE AND ONE FOR THE CLEAN ONE AND COMPARE CHECKSUMS AT THE END
- *
- * @author Eli Givoni
- */
- at Test
-public class PomTransformerTest {
-
-    private String transformablePomAsString;
-    private String cleanPomAsString;
-
-    @BeforeClass
-    private void setup() throws IOException {
-        InputStream transformablePomResource = ResourceUtils.getResource(
-                "/org/artifactory/repo/virtual/interceptor/activeByDefault-test.pom");
-        InputStream cleanPomResource = ResourceUtils.getResource(
-                "/org/artifactory/repo/virtual/interceptor/clean-test.pom");
-        transformablePomAsString = IOUtils.toString(transformablePomResource, "utf-8");
-        cleanPomAsString = IOUtils.toString(cleanPomResource, "utf-8");
-        IOUtils.closeQuietly(transformablePomResource);
-        IOUtils.closeQuietly(cleanPomResource);
-    }
-
-    public void transformableWithNothingPolicy() throws IOException {
-        PomTransformer pomTransformer = new PomTransformer(transformablePomAsString, PomCleanupPolicy.nothing);
-        String transformedPom = pomTransformer.transform();
-
-        assertEquals(transformablePomAsString, transformedPom, "Expected a matching document");
-        assertTrue(transformablePomAsString.contains("This is a comment"));
-        compareChecksums(transformablePomAsString, transformedPom, true);
-    }
-
-    public void cleanWithNothingPolicy() throws IOException {
-        PomTransformer pomTransformer = new PomTransformer(cleanPomAsString, PomCleanupPolicy.nothing);
-        String transformedPom = pomTransformer.transform();
-
-        assertEquals(cleanPomAsString, transformedPom, "Expected a matching document");
-        assertTrue(cleanPomAsString.contains("This is a comment"));
-        compareChecksums(cleanPomAsString, transformedPom, true);
-    }
-
-    @SuppressWarnings({"unchecked"})
-    public void transformableWithDiscardActiveReference() throws IOException {
-
-        PomTransformer pomTransformer = new PomTransformer(transformablePomAsString,
-                PomCleanupPolicy.discard_active_reference);
-        String transformedPom = pomTransformer.transform();
-
-        Model pom = MavenModelUtils.stringToMavenModel(transformedPom);
-        List repositoriesList = pom.getRepositories();
-        List pluginsRepositoriesList = pom.getPluginRepositories();
-
-        assertEmptyList(repositoriesList, pluginsRepositoriesList);
-
-        List<Profile> pomProfiles = pom.getProfiles();
-        for (Profile profile : pomProfiles) {
-            boolean activeByDefault = false;
-            Activation activation = profile.getActivation();
-            if (activation != null) {
-                activeByDefault = activation.isActiveByDefault();
-            }
-            List profileRepositories = profile.getRepositories();
-            List profilePluginsRepositories = profile.getPluginRepositories();
-            if (activeByDefault) {
-                assertEmptyList(profileRepositories, profilePluginsRepositories);
-            } else {
-                assertNotEmptyList(profileRepositories, profilePluginsRepositories);
-            }
-        }
-        assertTrue(transformablePomAsString.contains("This is a comment"));
-        compareChecksums(transformablePomAsString, transformedPom, false);
-    }
-
-    public void cleanWithDiscardActiveReference() throws IOException {
-        PomTransformer pomTransformer = new PomTransformer(cleanPomAsString, PomCleanupPolicy.discard_active_reference);
-        String transformedPom = pomTransformer.transform();
-
-        assertEquals(cleanPomAsString, transformedPom, "Expected a matching document");
-        assertTrue(cleanPomAsString.contains("This is a comment"));
-        compareChecksums(cleanPomAsString, transformedPom, true);
-    }
-
-    public void transformableWithDiscardAnyReference() throws IOException {
-        PomTransformer pomTransformer = new PomTransformer(transformablePomAsString,
-                PomCleanupPolicy.discard_any_reference);
-        String transformedPom = pomTransformer.transform();
-
-        Model pom = MavenModelUtils.stringToMavenModel(transformedPom);
-        List repositoriesList = pom.getRepositories();
-        List pluginsRepositoriesList = pom.getPluginRepositories();
-
-        assertEmptyList(repositoriesList, pluginsRepositoriesList);
-
-        List<Profile> pomProfiles = pom.getProfiles();
-        for (Profile profile : pomProfiles) {
-            List profileRepositories = profile.getRepositories();
-            List profilePluginsRepositories = profile.getPluginRepositories();
-
-            assertEmptyList(profileRepositories, profilePluginsRepositories);
-        }
-        assertTrue(transformablePomAsString.contains("This is a comment"));
-        compareChecksums(transformablePomAsString, transformedPom, false);
-    }
-
-    public void cleanWithDiscardAnyReference() throws IOException {
-        PomTransformer pomTransformer = new PomTransformer(cleanPomAsString, PomCleanupPolicy.discard_any_reference);
-        String transformedPom = pomTransformer.transform();
-
-        assertEquals(cleanPomAsString, transformedPom, "Expected a matching document");
-        assertTrue(cleanPomAsString.contains("This is a comment"));
-        compareChecksums(cleanPomAsString, transformedPom, true);
-    }
-
-    public void transformBadPom() throws IOException {
-        InputStream badPomResource = ResourceUtils.getResource(
-                "/org/artifactory/repo/virtual/interceptor/bad.pom");
-        String badPom = IOUtils.toString(badPomResource, "utf-8");
-        IOUtils.closeQuietly(badPomResource);
-        PomTransformer transformer = new PomTransformer(badPom, PomCleanupPolicy.discard_active_reference);
-        String nonTransformedPom = transformer.transform();
-        assertEquals(nonTransformedPom, badPom, "xml document should not have been altered");
-        assertTrue(transformablePomAsString.contains("This is a comment"));
-    }
-
-    private void assertEmptyList(Object... list) {
-        for (Object o : list) {
-            List elementList = (ArrayList) o;
-            assertTrue(elementList.isEmpty(), "Expected an empty list");
-        }
-    }
-
-    private void assertNotEmptyList(Object... list) {
-        for (Object o : list) {
-            List elementList = (ArrayList) o;
-            assertFalse(elementList.isEmpty(), "Expected not an empty list");
-        }
-    }
-
-    /**
-     * Compares the checksums of two strings
-     *
-     * @param a             String to compare
-     * @param b             String to compare
-     * @param shouldBeEqual True if both strings should have equal checksums
-     */
-    private void compareChecksums(String a, String b, boolean shouldBeEqual) throws IOException {
-        InputStream streamA = IOUtils.toInputStream(a);
-        InputStream streamB = IOUtils.toInputStream(b);
-        ChecksumsInfo checksumsA = ChecksumUtil.getChecksumsInfo(streamA);
-        ChecksumsInfo checksumsB = ChecksumUtil.getChecksumsInfo(streamB);
-
-        if (shouldBeEqual) {
-            assertTrue(checksumsA.isIdentical(checksumsB), "POM checksums should be equal.");
-        } else {
-            assertFalse(checksumsA.isIdentical(checksumsB), "POM checksums should not be equal.");
-        }
-        IOUtils.closeQuietly(streamA);
-        IOUtils.closeQuietly(streamB);
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/request/ResponseWithHttpRangeSupportHelperTest.java b/backend/core/src/test/java/org/artifactory/request/ResponseWithHttpRangeSupportHelperTest.java
deleted file mode 100644
index bfbf8cf..0000000
--- a/backend/core/src/test/java/org/artifactory/request/ResponseWithHttpRangeSupportHelperTest.java
+++ /dev/null
@@ -1,209 +0,0 @@
-package org.artifactory.request;
-
-import org.apache.commons.io.IOUtils;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.request.range.RangeAwareContext;
-import org.jfrog.storage.binstore.ifc.SkippableInputStream;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-
-import static org.artifactory.request.range.ResponseWithRangeSupportHelper.createRangeAwareContext;
-
-/**
- * @author Gidi Shabat
- */
- at Test
-public class ResponseWithHttpRangeSupportHelperTest {
-    private byte[] content;
-
-    @BeforeClass
-    public void init() {
-        ArtifactoryHome.bind(new ArtifactoryHome(new File("./target/test/DebianEventsTest")));
-        content = "0123456789ABCDEFGI".getBytes();
-    }
-
-    @Test
-    public void noRangeRequest() throws IOException {
-        String range = null;
-        testDummyRangesReturnAll(range, true);
-        testDummyRangesReturnAll(range, false);
-    }
-
-    @Test
-    public void emptyRangeRequest() throws IOException {
-        String range = "";
-        testDummyRangesReturnAll(range, true);
-        testDummyRangesReturnAll(range, false);
-    }
-
-    @Test
-    public void invalidRangeRequest() throws IOException {
-        String range = "ranges:a-b";
-        testDummyRangesReturnAll(range, true);
-        testDummyRangesReturnAll(range, false);
-    }
-
-    @Test
-    public void singleRangeRequest() throws IOException {
-        for (int first = 0; first < content.length - 1; first++) {
-            for (int last = first; last < content.length; last++) {
-                String range = "byte=" + first + "-" + last;
-                testSingleRangeFirstLast(range, first, last);
-            }
-            // Test with start only range
-            String range = "byte=" + first + "-";
-            testSingleRangeFirstLast(range, first, content.length - 1);
-        }
-    }
-
-    @Test
-    public void multiRangeRequest() throws IOException {
-        String range = "bytes=1-3,7-10";
-        testMultiRangeRequest(range, true);
-        testMultiRangeRequest(range, false);
-    }
-
-    @Test
-    public void multiRangeDescendingOrderRequest() throws IOException {
-        String range = "bytes=7-10,1-3";
-        testMultiRangeRequest(range, true);
-        testMultiRangeRequest(range, false);
-    }
-
-    @Test
-    public void multiWithPartialErrorRangeDescendingOrderRequest() throws IOException {
-        String range = "bytes=7-10,12-a,1-3";
-        testMultiRangeRequest(range, true);
-        testMultiRangeRequest(range, false);
-    }
-
-    @Test
-    public void multiWithMergeRangeDescendingOrderRequest() throws IOException {
-        String range = "bytes=7-10,1-6";
-        testSingleRangeFirstLast(range, 1, 10);
-    }
-
-    private void assertSameContentNoStatus(RangeAwareContext context, String suffixMsg) throws IOException {
-        // Assert content length
-        Assert.assertEquals(content.length, context.getContentLength(), "Wrong content length for " + suffixMsg);
-        // Assert content
-        byte[] resultContent = IOUtils.toByteArray(context.getInputStream());
-        Assert.assertEquals(resultContent, content, "Expecting no change in the content for " + suffixMsg);
-        //Assert status
-        Assert.assertEquals(context.getStatus(), -1, "Expecting no status for " + suffixMsg);
-        //Assert etag extension
-        Assert.assertEquals(context.getEtagExtension(), "", "Expecting no etag to be set for " + suffixMsg);
-        // Assert content type
-        Assert.assertEquals(context.getContentType(), "pdf", "Expecting no change in the content type for " + suffixMsg);
-        // Assert content range
-        Assert.assertEquals(context.getContentRange(), null, "Expecting no content range for " + suffixMsg);
-    }
-
-    private void testDummyRangesReturnAll(String range, boolean skippable) throws IOException {
-        InputStream inputStream = createTestInputStream(skippable);
-        RangeAwareContext context = createRangeAwareContext(inputStream, content.length, range, null, "pdf",
-                -1, null);
-        assertSameContentNoStatus(context, "range " + range + " skippable " + skippable);
-    }
-
-    private void testSingleRangeFirstLast(String range, int expectedFirst, int expectedLast) throws IOException {
-        int expectedContentLength = expectedLast - expectedFirst + 1;
-        byte[] expectedBytes = new byte[expectedContentLength];
-        System.arraycopy(content, expectedFirst, expectedBytes, 0, expectedContentLength);
-        int expectedStatus = 206;
-        String expectedEtag = "-" + expectedFirst + "-" + expectedLast;
-        String expectedContentRange = "bytes " + expectedFirst + "-" + expectedLast + "/" + content.length;
-
-        internalTestSimpleRange(true, range, expectedContentLength, expectedBytes, expectedStatus, expectedEtag, expectedContentRange);
-        internalTestSimpleRange(false, range, expectedContentLength, expectedBytes, expectedStatus, expectedEtag, expectedContentRange);
-    }
-
-    private void internalTestSimpleRange(boolean skippable,
-                                         String range,
-                                         int expectedContentLength,
-                                         byte[] expectedBytes,
-                                         int expectedStatus,
-                                         String expectedEtag,
-                                         String expectedContentRange) throws IOException {
-        InputStream inputStream = createTestInputStream(skippable);
-        RangeAwareContext context = createRangeAwareContext(inputStream, content.length, range, null, "pdf",
-                -1, null);
-        // Assert content length
-        Assert.assertEquals(expectedContentLength, context.getContentLength(), "Wrong Length");
-        // Assert content
-        byte[] resultContent = IOUtils.toByteArray(context.getInputStream());
-        Assert.assertEquals(resultContent, expectedBytes, "Wrong content for " + range + " skippable " + skippable);
-        //Assert status
-        Assert.assertEquals(context.getStatus(), expectedStatus, "Wrong status for " + range + " skippable " + skippable);
-        //Assert etag extension
-        Assert.assertEquals(context.getEtagExtension(), expectedEtag, "Wrong etag for " + range + " skippable " + skippable);
-        // Assert content type
-        Assert.assertEquals(context.getContentType(), "pdf", "Expecting no change in the content type for " + range + " skippable " + skippable);
-        // Assert content range
-        Assert.assertEquals(context.getContentRange(), expectedContentRange, "Wrong Content Range for " + range + " skippable " + skippable);
-    }
-
-    private void testMultiRangeRequest(String range, boolean skippable) throws IOException {
-        InputStream inputStream = createTestInputStream(skippable);
-        RangeAwareContext context = createRangeAwareContext(inputStream, content.length, range, null, "pdf",
-                -1, null);
-        String suffixMsg = "range " + range + " skippable " + skippable;
-        // Assert content length
-        Assert.assertEquals(context.getContentLength(), 196, "Wrong content length for " + suffixMsg);
-        // Assert content
-        byte[] resultContent = IOUtils.toByteArray(context.getInputStream());
-        String expectedResult = "--BCD64322345343217845286A\r\n" +
-                "Content-Type: pdf\r\n" +
-                "Content-Range: bytes 1-3/18\r\n" +
-                "\r\n" +
-                "123\r\n" +
-                "--BCD64322345343217845286A\r\n" +
-                "Content-Type: pdf\r\n" +
-                "Content-Range: bytes 7-10/18\r\n" +
-                "\r\n" +
-                "789A--BCD64322345343217845286A--\r\n";
-        Assert.assertEquals(resultContent, expectedResult.getBytes(), "Wrong content for " + suffixMsg);
-        //Assert status
-        Assert.assertEquals(context.getStatus(), 206, "Wrong status for " + suffixMsg);
-        //Assert etag extension
-        Assert.assertEquals(context.getEtagExtension(), "-1-3-7-10", "Wrong etag for " + suffixMsg);
-        // Assert content type
-        Assert.assertEquals(context.getContentType(), "multipart/byteranges; boundary=BCD64322345343217845286A",
-                "Wrong content type for " + suffixMsg);
-        // Assert content range
-        Assert.assertEquals(context.getContentRange(), null, "Wrong range for " + suffixMsg);
-    }
-
-    private InputStream createTestInputStream(boolean skippable) {
-        InputStream inputStream;
-        if (skippable) {
-            inputStream = new ByteArrayInputStream(content);
-        } else {
-            inputStream = new NonSkippableStream(content);
-        }
-        return inputStream;
-    }
-
-    static class NonSkippableStream extends ByteArrayInputStream implements SkippableInputStream {
-        public NonSkippableStream(byte[] buf) {
-            super(buf);
-        }
-
-        @Override
-        public synchronized long skip(long n) {
-            throw new RuntimeException("I told you not to call me!");
-        }
-
-        @Override
-        public boolean isSkippable() {
-            return false;
-        }
-    }
-
-}
diff --git a/backend/core/src/test/java/org/artifactory/resource/ChecksumResourceTest.java b/backend/core/src/test/java/org/artifactory/resource/ChecksumResourceTest.java
deleted file mode 100644
index a8ff962..0000000
--- a/backend/core/src/test/java/org/artifactory/resource/ChecksumResourceTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.resource;
-
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.mime.MimeType;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Unit tests the ChecksumResource.
- *
- * @author Yossi Shaul
- */
- at Test
-public class ChecksumResourceTest extends ArtifactoryHomeBoundTest {
-
-    public void checksumResource() {
-        RepoPath fileRepoPath = InternalRepoPathFactory.create("test", "test.jar");
-        FileResource fileResource = new FileResource(InfoFactoryHolder.get().createFileInfo(fileRepoPath));
-
-        ChecksumResource resource = new ChecksumResource(fileResource, ChecksumType.sha1, "456789");
-
-        assertEquals(resource.getRepoPath(), InternalRepoPathFactory.create("test", "test.jar.sha1"));
-        assertEquals(resource.getResponseRepoPath(), InternalRepoPathFactory.create("test", "test.jar.sha1"));
-        assertEquals(resource.getMimeType(), MimeType.checksum);
-        assertEquals(resource.getSize(), "456789".length());
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/resource/ResolvedResourceTest.java b/backend/core/src/test/java/org/artifactory/resource/ResolvedResourceTest.java
deleted file mode 100644
index b473bff..0000000
--- a/backend/core/src/test/java/org/artifactory/resource/ResolvedResourceTest.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.resource;
-
-import org.artifactory.checksum.ChecksumsInfo;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.MutableFileInfo;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.io.checksum.ChecksumUtil;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.easymock.EasyMock;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertNotNull;
-
-/**
- * Tests the auto checksum recalculation of the resolved resource
- *
- * @author Noam Y. Tenne
- */
- at Test
-public class ResolvedResourceTest {
-
-    public void testAutoChecksumReCalculation() throws IOException {
-        String content = "dfadfgadfgadfgkadmgwtw45624563454k  fsg w5yk54ymkwmtk   tk4t5k mkqr q24kmfkmc";
-        ChecksumsInfo contentChecksums = calcChecksum(content);
-
-        MutableFileInfo fileInfo = createDemoFileInfo();
-
-        RepoResource originalResource = prepareOriginalRequestMock(fileInfo);
-
-        ResolvedResource resolvedResource = new ResolvedResource(originalResource, content);
-        assertFileInfoChecksums(contentChecksums, resolvedResource.getInfo());
-    }
-
-    public void testExplicitChecksumReCalculation() throws IOException {
-        String content = "dfgl4kmaewawm3,2r3 , awfm,q4t,m5y l,blt,h5664,3,';. p32.42,35346346";
-        ChecksumsInfo contentChecksums = calcChecksum(content);
-
-        MutableFileInfo fileInfo = createDemoFileInfo();
-
-        RepoResource originalResource = prepareOriginalRequestMock(fileInfo);
-
-        ResolvedResource resolvedResource = new ResolvedResource(originalResource, content, true);
-        assertFileInfoChecksums(contentChecksums, resolvedResource.getInfo());
-    }
-
-    public void testNoChecksumReCalculation() throws IOException {
-        String content = "fsdgdhthjtjml dfglmr5ouyw432qq ./ad,fgaw;l3tmr23 freg g";
-        MutableFileInfo fileInfo = createDemoFileInfo();
-
-        RepoResource originalResource = prepareOriginalRequestMock(fileInfo);
-
-        new ResolvedResource(originalResource, content, false);
-        Assert.assertTrue(fileInfo.getChecksums().isEmpty(), "Resource checksums should not have been recalculated.");
-    }
-
-    private MutableFileInfo createDemoFileInfo() {
-        return InfoFactoryHolder.get().createFileInfo(InternalRepoPathFactory.create("demo", "demo"));
-    }
-
-    private RepoResource prepareOriginalRequestMock(FileInfo fileInfo) {
-        RepoResource originalResource = EasyMock.createMock(RepoResource.class);
-        EasyMock.expect(originalResource.getInfo()).andReturn(fileInfo).times(2);
-        EasyMock.replay(originalResource);
-        return originalResource;
-    }
-
-    private void assertFileInfoChecksums(ChecksumsInfo contentChecksums, RepoResourceInfo resourceInfo) {
-        ChecksumsInfo recalculatedChecksums = resourceInfo.getChecksumsInfo();
-        assertNotNull(recalculatedChecksums, "Resource checksums should have been recalculated.");
-        assertNotNull(recalculatedChecksums.getChecksums(), "Resource checksums should have been recalculated.");
-        assertFalse(recalculatedChecksums.getChecksums().isEmpty(),
-                "Resource checksums should have been recalculated.");
-        Assert.assertTrue(contentChecksums.isIdentical(recalculatedChecksums), "Resource checksums should have been recalculated.");
-    }
-
-    private ChecksumsInfo calcChecksum(String content) throws IOException {
-        return ChecksumUtil.getChecksumsInfo(new ByteArrayInputStream(content.getBytes("utf-8")));
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/schedule/ArtifactoryHomeTaskTestStub.java b/backend/core/src/test/java/org/artifactory/schedule/ArtifactoryHomeTaskTestStub.java
deleted file mode 100644
index 3e57683..0000000
--- a/backend/core/src/test/java/org/artifactory/schedule/ArtifactoryHomeTaskTestStub.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-import org.artifactory.test.ArtifactoryHomeStub;
-import org.testng.Assert;
-import org.testng.collections.Maps;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * User: freds
- * Date: 7/5/11
- * Time: 1:52 PM
- */
-public class ArtifactoryHomeTaskTestStub extends ArtifactoryHomeStub {
-    public static class TaskTestData {
-        int nbExecutions;
-        int nbFails;
-        int nbBreaks;
-        int nbInterrupted;
-        int nbCompleted;
-        String userNameOnExecute;
-        List<String> taskStoppedOnExecute;
-        List<String> taskStoppedAfterExecute;
-
-        public void assertNbs(int nbExec, int nbBreak) {
-            Assert.assertEquals(nbExecutions, nbExec);
-            Assert.assertEquals(nbFails, 0);
-            Assert.assertEquals(nbBreaks, nbBreak);
-            Assert.assertEquals(nbInterrupted, 0);
-            Assert.assertEquals(nbCompleted, nbExec - nbBreak);
-        }
-
-        public void assertPause(int nbExec, int nbPause) {
-            Assert.assertEquals(nbExecutions, nbExec);
-            Assert.assertEquals(nbFails, 0);
-            Assert.assertEquals(nbBreaks, nbExec - nbPause);
-            Assert.assertEquals(nbInterrupted, 0);
-            Assert.assertEquals(nbCompleted, nbExec - nbPause);
-        }
-
-        public void assertFails(int nbExec, int fails) {
-            Assert.assertEquals(nbExecutions, nbExec);
-            Assert.assertEquals(nbFails, fails);
-            Assert.assertEquals(nbBreaks, 0);
-            Assert.assertEquals(nbInterrupted, 0);
-            Assert.assertEquals(nbCompleted, nbExec - fails);
-        }
-    }
-
-    private final Map<String, TaskTestData> testDataMap = Maps.newHashMap();
-
-    public void executed(String taskTestId) {
-        getTaskData(taskTestId).nbExecutions++;
-    }
-
-    public void failed(String taskTestId) {
-        getTaskData(taskTestId).nbFails++;
-    }
-
-    public void breaking(String taskTestId) {
-        getTaskData(taskTestId).nbBreaks++;
-    }
-
-    public void interrupted(String taskTestId) {
-        getTaskData(taskTestId).nbInterrupted++;
-    }
-
-    public void complete(String taskTestId) {
-        getTaskData(taskTestId).nbCompleted++;
-    }
-
-    public synchronized TaskTestData getTaskData(String taskTestId) {
-        TaskTestData taskTestData = testDataMap.get(taskTestId);
-        if (taskTestData == null) {
-            taskTestData = new TaskTestData();
-            testDataMap.put(taskTestId, taskTestData);
-        }
-        return taskTestData;
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/schedule/DummyQuartzCommand.java b/backend/core/src/test/java/org/artifactory/schedule/DummyQuartzCommand.java
deleted file mode 100644
index 11df7fc..0000000
--- a/backend/core/src/test/java/org/artifactory/schedule/DummyQuartzCommand.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-import org.artifactory.schedule.quartz.QuartzCommand;
-import org.artifactory.spring.InternalContextHelper;
-import org.quartz.JobDataMap;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * @author yoavl
- */
- at JobCommand(schedulerUser = TaskUser.CURRENT, manualUser = TaskUser.CURRENT)
-public class DummyQuartzCommand extends QuartzCommand {
-
-    public static final String FAIL = "FAIL";
-    public static final String MSECS_TO_RUN = "MSECS_TO_RUN";
-
-    private static final Logger log = LoggerFactory.getLogger(DummyQuartzCommand.class);
-
-    private static long SLEEP = 50;
-
-    public DummyQuartzCommand() {
-    }
-
-    @Override
-    protected void onExecute(JobExecutionContext callbackContext) throws JobExecutionException {
-        log.debug("Command for task " + currentTaskToken() + " is executing.");
-        JobDataMap jobDataMap = callbackContext.getMergedJobDataMap();
-        ArtifactoryHomeTaskTestStub artifactoryHome = getArtHomeStub();
-        artifactoryHome.executed(currentTaskToken());
-        if (jobDataMap.get(FAIL) != null &&
-                jobDataMap.getBoolean(FAIL)) {
-            log.info("Testing failing with exception!");
-            artifactoryHome.failed(currentTaskToken());
-            throw new RuntimeException("Voluntary failing execution to test Scheduler handling! No Worries!");
-        }
-        long msecsToRun = 500;
-        if (jobDataMap.get(MSECS_TO_RUN) != null) {
-            msecsToRun = jobDataMap.getLongValue(MSECS_TO_RUN);
-        }
-        long count = (long) (msecsToRun / (float) SLEEP);
-        long i = 0L;
-        for (; i < count; i++) {
-            boolean shouldBreak = getTaskService().pauseOrBreak();
-            if (shouldBreak) {
-                log.debug("Command for task " + currentTaskToken() + " is breaking.");
-                artifactoryHome.breaking(currentTaskToken());
-                break;
-            } else {
-                try {
-                    Thread.sleep(SLEEP);
-                } catch (InterruptedException e) {
-                    artifactoryHome.interrupted(currentTaskToken());
-                    e.printStackTrace();
-                    break;
-                }
-            }
-        }
-        if (i == count) {
-            artifactoryHome.complete(currentTaskToken());
-        }
-        log.debug("Command for task " + currentTaskToken() + " has ended.");
-    }
-
-    protected ArtifactoryHomeTaskTestStub getArtHomeStub() {
-        return (ArtifactoryHomeTaskTestStub) InternalContextHelper.get().getArtifactoryHome();
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/schedule/DummyQuartzCommandA.java b/backend/core/src/test/java/org/artifactory/schedule/DummyQuartzCommandA.java
deleted file mode 100644
index 91b85b8..0000000
--- a/backend/core/src/test/java/org/artifactory/schedule/DummyQuartzCommandA.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
- at JobCommand(singleton = true, schedulerUser = TaskUser.SYSTEM, manualUser = TaskUser.ANONYMOUS)
-public class DummyQuartzCommandA extends DummyStopCancelQuartzCommand {
-}
diff --git a/backend/core/src/test/java/org/artifactory/schedule/DummyQuartzCommandB.java b/backend/core/src/test/java/org/artifactory/schedule/DummyQuartzCommandB.java
deleted file mode 100644
index 7e01d7c..0000000
--- a/backend/core/src/test/java/org/artifactory/schedule/DummyQuartzCommandB.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-/**
- * User: freds
- * Date: 7/10/11
- * Time: 10:44 AM
- */
- at JobCommand(manualUser = TaskUser.ANONYMOUS,
-        commandsToStop = {@StopCommand(command = DummyQuartzCommandA.class, strategy = StopStrategy.STOP)})
-public class DummyQuartzCommandB extends DummyStopCancelQuartzCommand {
-}
diff --git a/backend/core/src/test/java/org/artifactory/schedule/DummyQuartzCommandC.java b/backend/core/src/test/java/org/artifactory/schedule/DummyQuartzCommandC.java
deleted file mode 100644
index 39188c6..0000000
--- a/backend/core/src/test/java/org/artifactory/schedule/DummyQuartzCommandC.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-/**
- * User: freds
- * Date: 7/10/11
- * Time: 10:45 AM
- */
- at JobCommand(
-        schedulerUser = TaskUser.CURRENT,
-        manualUser = TaskUser.CURRENT,
-        keyAttributes = {DummyQuartzCommandC.TEST_KEY},
-        commandsToStop = {
-                @StopCommand(command = DummyQuartzCommandA.class, strategy = StopStrategy.IMPOSSIBLE)
-        }
-)
-public class DummyQuartzCommandC extends DummyStopCancelQuartzCommand {
-    public static final String TEST_KEY = "TEST_KEY";
-}
diff --git a/backend/core/src/test/java/org/artifactory/schedule/DummyQuartzCommandD.java b/backend/core/src/test/java/org/artifactory/schedule/DummyQuartzCommandD.java
deleted file mode 100644
index ec3a43c..0000000
--- a/backend/core/src/test/java/org/artifactory/schedule/DummyQuartzCommandD.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-/**
- * User: freds
- * Date: 7/10/11
- * Time: 10:45 AM
- */
- at JobCommand(
-        manualUser = TaskUser.CURRENT,
-        schedulerUser = TaskUser.CURRENT,
-        keyAttributes = {DummyQuartzCommandC.TEST_KEY},
-        commandsToStop = {
-                @StopCommand(command = DummyQuartzCommandA.class, strategy = StopStrategy.PAUSE),
-                @StopCommand(command = DummyQuartzCommandC.class, strategy = StopStrategy.IMPOSSIBLE, useKey = true)
-        }
-)
-public class DummyQuartzCommandD extends DummyStopCancelQuartzCommand {
-}
diff --git a/backend/core/src/test/java/org/artifactory/schedule/DummyStopCancelQuartzCommand.java b/backend/core/src/test/java/org/artifactory/schedule/DummyStopCancelQuartzCommand.java
deleted file mode 100644
index f530a7a..0000000
--- a/backend/core/src/test/java/org/artifactory/schedule/DummyStopCancelQuartzCommand.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.test.util.ReflectionTestUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * User: freds
- * Date: 7/5/11
- * Time: 11:45 AM
- */
-public abstract class DummyStopCancelQuartzCommand extends DummyQuartzCommand {
-
-    private ArtifactoryHomeTaskTestStub.TaskTestData taskData;
-
-    @Override
-    protected void onExecute(JobExecutionContext callbackContext) throws JobExecutionException {
-        ArtifactoryHomeTaskTestStub artHome = getArtHomeStub();
-        taskData = artHome.getTaskData(currentTaskToken());
-        taskData.userNameOnExecute = SecurityContextHolder.getContext().getAuthentication().getPrincipal().toString();
-        taskData.taskStoppedOnExecute = new ArrayList<String>((List<String>) ReflectionTestUtils.getField(this,
-                "tasksStopped"));
-        super.onExecute(callbackContext);
-    }
-
-    @Override
-    protected void afterExecute() {
-        super.afterExecute();
-        // May be null on exception in running
-        if (taskData != null) {
-            taskData.taskStoppedAfterExecute = new ArrayList<String>(
-                    (List<String>) ReflectionTestUtils.getField(this, "tasksStopped"));
-        }
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/schedule/JobCommandTest.java b/backend/core/src/test/java/org/artifactory/schedule/JobCommandTest.java
deleted file mode 100644
index fda6c20..0000000
--- a/backend/core/src/test/java/org/artifactory/schedule/JobCommandTest.java
+++ /dev/null
@@ -1,317 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.schedule.quartz.QuartzCommand;
-import org.artifactory.security.UserInfo;
-import org.springframework.test.util.ReflectionTestUtils;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * @author freds
- */
- at Test(sequential = true)
-public class JobCommandTest extends TaskServiceTestBase {
-
-    private static final String NO_DUMMY_VALUE = "no-dummy";
-    private static final String DUMMY_RUNNING_VALUE = "dummy-running";
-    private static final String DUMMY_STOPPED_VALUE = "dummy-stopped";
-    private static final String DUMMY_PAUSED_VALUE = "dummy-paused";
-    private static final String DUMMY_MANUAL_PAUSED_VALUE = "dummy-manual-paused";
-    private static final String DUMMY_MANUAL_RUNNING_VALUE = "dummy-manual-stopped";
-
-    @AfterMethod
-    public void afterMethod() throws Exception {
-        Thread.sleep(500);
-    }
-
-    @Test
-    public void testCommandToStop() throws Exception {
-        ArtifactoryHomeTaskTestStub homeStub = getOrCreateArtifactoryHomeStub();
-        TaskBase task1 = createRunAndPauseDummyA(500);
-        ArtifactoryHomeTaskTestStub.TaskTestData task1Data = homeStub.getTaskData(task1.getToken());
-
-        taskService.resumeTask(task1.getToken());
-        Thread.sleep(500);
-        taskService.pauseTask(task1.getToken(), true);
-        task1Data.assertNbs(1, 0);
-        assertTrue(task1Data.taskStoppedOnExecute.isEmpty());
-        assertTrue(task1Data.taskStoppedAfterExecute.isEmpty());
-        assertEquals(task1Data.userNameOnExecute, SecurityService.USER_SYSTEM);
-
-        // Run while the other waiting
-        TaskBase task2 = createManualDummyB(task1.getToken());
-        ArtifactoryHomeTaskTestStub.TaskTestData task2Data = homeStub.getTaskData(task2.getToken());
-        assertTrue(taskService.resumeTask(task2.getToken()));
-        Thread.sleep(300);
-        task2Data.assertNbs(1, 0);
-        assertEquals(task2Data.taskStoppedAfterExecute.size(), 0);
-
-        taskService.stopTask(task1.getToken(), true);
-        task2Data.assertNbs(1, 0);
-        task1Data.assertNbs(1, 0);
-        taskService.cancelTask(task1.getToken(), true);
-        assertNull(taskService.getInternalActiveTask(task1.getToken(), false));
-        assertNull(taskService.getInternalActiveTask(task2.getToken(), false));
-    }
-
-    @Test
-    public void testSingletonAndManual() throws Exception {
-        ArtifactoryHomeTaskTestStub homeStub = getOrCreateArtifactoryHomeStub();
-        TaskBase task1 = createRunAndPauseDummyA(500);
-        try {
-            createRunAndPauseDummyA(500);
-            fail("Should get an IllegalStateException trying to start 2 singleton tasks");
-        } catch (IllegalStateException e) {
-        }
-        ArtifactoryHomeTaskTestStub.TaskTestData task1Data = homeStub.getTaskData(task1.getToken());
-        taskService.resumeTask(task1.getToken());
-        assertTrue(task1.isRunning());
-        try {
-            TaskBase failedTask = TaskUtils.createManualTask(DummyQuartzCommandA.class, 0L);
-            taskService.startTask(failedTask, false);
-            fail(
-                    "Should get an IllegalStateException trying to start a manual task while the singleton running");
-        } catch (IllegalStateException e) {
-        }
-        Thread.sleep(500);
-        task1Data.assertNbs(1, 0);
-        TaskBase manualTask = TaskUtils.createManualTask(DummyQuartzCommandA.class, 0L);
-        taskService.startTask(manualTask, true);
-        assertTrue(manualTask.isRunning());
-        assertFalse(task1.isRunning());
-        TaskBase.TaskState task1State = (TaskBase.TaskState) ReflectionTestUtils.getField(task1, "state");
-        assertEquals(task1State, TaskBase.TaskState.STOPPED);
-        taskService.pauseTask(manualTask.getToken(), true);
-        try {
-            TaskBase failedTask = TaskUtils.createManualTask(DummyQuartzCommandA.class, 0L);
-            taskService.startTask(failedTask, false);
-            fail("Should get an IllegalStateException trying to start 2 manual tasks for a singleton");
-        } catch (IllegalStateException e) {
-        }
-        assertFalse(manualTask.isSingleton());
-        assertTrue(manualTask.isManuallyActivated());
-        ArtifactoryHomeTaskTestStub.TaskTestData manualTaskData = homeStub.getTaskData(manualTask.getToken());
-        manualTaskData.assertPause(1, 1);
-        assertEquals(manualTaskData.taskStoppedOnExecute.size(), 1);
-        assertEquals(manualTaskData.taskStoppedOnExecute.get(0), task1.getToken());
-        assertNull(manualTaskData.taskStoppedAfterExecute);
-        assertEquals(manualTaskData.userNameOnExecute, UserInfo.ANONYMOUS);
-        assertTrue(taskService.resumeTask(manualTask.getToken()));
-        assertTrue(taskService.waitForTaskCompletion(manualTask.getToken()));
-        Thread.sleep(50);
-        manualTaskData.assertNbs(1, 0);
-        assertEquals(manualTaskData.taskStoppedAfterExecute.size(), 0);
-        task1State = (TaskBase.TaskState) ReflectionTestUtils.getField(task1, "state");
-        assertEquals(task1State, TaskBase.TaskState.SCHEDULED);
-        taskService.cancelTask(task1.getToken(), true);
-        assertNull(taskService.getInternalActiveTask(task1.getToken(), false));
-        assertNull(taskService.getInternalActiveTask(manualTask.getToken(), false));
-    }
-
-    private TaskBase createManualDummyB(String stoppedToken) {
-        ArtifactoryHomeTaskTestStub homeStub = getOrCreateArtifactoryHomeStub();
-        TaskBase task2 = TaskUtils.createManualTask(DummyQuartzCommandB.class, 0L);
-        task2.addAttribute(DummyQuartzCommand.MSECS_TO_RUN, "200");
-        taskService.startTask(task2, true);
-        ArtifactoryHomeTaskTestStub.TaskTestData taskData = homeStub.getTaskData(task2.getToken());
-        assertTrue(task2.isRunning());
-        taskService.pauseTask(task2.getToken(), true);
-        taskData.assertPause(1, 1);
-        assertFalse(task2.isRunning());
-        assertFalse(task2.isSingleton());
-        assertTrue(task2.isManuallyActivated());
-        assertEquals(taskData.taskStoppedOnExecute.size(), 1);
-        assertEquals(taskData.taskStoppedOnExecute.get(0), stoppedToken);
-        assertNull(taskData.taskStoppedAfterExecute);
-        assertEquals(taskData.userNameOnExecute, UserInfo.ANONYMOUS);
-        return task2;
-    }
-
-    private TaskBase createRunAndPauseDummyA(long msecToRun) throws Exception {
-        ArtifactoryHomeTaskTestStub homeStub = getOrCreateArtifactoryHomeStub();
-        TaskBase task1 = TaskUtils.createRepeatingTask(DummyQuartzCommandA.class, 1000L + msecToRun, 100);
-        task1.addAttribute(DummyQuartzCommand.MSECS_TO_RUN, msecToRun);
-        taskService.startTask(task1, false);
-        taskService.pauseTask(task1.getToken(), false);
-        ArtifactoryHomeTaskTestStub.TaskTestData taskData = homeStub.getTaskData(task1.getToken());
-        taskData.assertNbs(0, 0);
-        assertTrue(task1.isSingleton());
-        assertFalse(task1.isManuallyActivated());
-        assertTrue(taskService.resumeTask(task1.getToken()));
-        // Wait to start
-        Thread.sleep(200);
-        try {
-            assertTrue(task1.isRunning());
-            taskService.pauseTask(task1.getToken(), false);
-            fail("Should get cannot stop running task exception");
-        } catch (IllegalStateException e) {
-        }
-        taskService.pauseTask(task1.getToken(), true);
-        taskData.assertPause(1, 1);
-        assertTrue(taskData.taskStoppedOnExecute.isEmpty());
-        assertNull(taskData.taskStoppedAfterExecute);
-        assertEquals(taskData.userNameOnExecute, SecurityService.USER_SYSTEM);
-        return task1;
-    }
-
-    @Test
-    public void testStopStrategyAndKey() throws Exception {
-        TaskBase dummyA = createRunAndPauseDummyA(1000);
-        assertTrue(taskService.resumeTask(dummyA.getToken()));
-        try {
-            taskService.checkCanStartManualTask(DummyQuartzCommandC.class, new BasicStatusHolder());
-            fail("Should get " + IllegalArgumentException.class + " since no key values provided for a command with keys");
-        } catch (IllegalArgumentException e) {
-        }
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-        taskService.checkCanStartManualTask(DummyQuartzCommandC.class, statusHolder, NO_DUMMY_VALUE);
-        assertTrue(statusHolder.isError(),
-                "Command " + DummyQuartzCommandC.class + " should be forbidden to run due to " + dummyA + " active");
-        ArtifactoryHomeTaskTestStub homeStub = getOrCreateArtifactoryHomeStub();
-        ArtifactoryHomeTaskTestStub.TaskTestData dummyTaskData = homeStub.getTaskData(dummyA.getToken());
-        taskService.stopTask(dummyA.getToken(), true);
-        dummyTaskData.assertNbs(1, 1);
-        statusHolder = new BasicStatusHolder();
-        taskService.checkCanStartManualTask(DummyQuartzCommandC.class, statusHolder, NO_DUMMY_VALUE);
-        assertFalse(statusHolder.isError(),
-                "Command " + DummyQuartzCommandC.class + " should be allowed to run manually");
-
-        TaskBase dummyCRunning = TaskUtils.createRepeatingTask(DummyQuartzCommandC.class, 2000L, 0L);
-        dummyCRunning.addAttribute(DummyQuartzCommandC.TEST_KEY, DUMMY_RUNNING_VALUE);
-        assertEquals(taskService.startTask(dummyCRunning, true), dummyCRunning.getToken());
-
-        TaskBase dummyCStopped = TaskUtils.createRepeatingTask(DummyQuartzCommandC.class, 2000L, 0L);
-        dummyCStopped.addAttribute(DummyQuartzCommandC.TEST_KEY, DUMMY_STOPPED_VALUE);
-        assertEquals(taskService.startTask(dummyCStopped, true), dummyCStopped.getToken());
-        taskService.stopTask(dummyCStopped.getToken(), true);
-
-        TaskBase dummyCPaused = TaskUtils.createRepeatingTask(DummyQuartzCommandC.class, 2000L, 0L);
-        dummyCPaused.addAttribute(DummyQuartzCommandC.TEST_KEY, DUMMY_PAUSED_VALUE);
-        assertEquals(taskService.startTask(dummyCPaused, true), dummyCPaused.getToken());
-        taskService.pauseTask(dummyCPaused.getToken(), true);
-
-        TaskBase dummyCManualPaused = TaskUtils.createManualTask(DummyQuartzCommandC.class, 0L);
-        dummyCManualPaused.addAttribute(DummyQuartzCommandC.TEST_KEY, DUMMY_MANUAL_PAUSED_VALUE);
-        assertEquals(taskService.startTask(dummyCManualPaused, true), dummyCManualPaused.getToken());
-        taskService.pauseTask(dummyCManualPaused.getToken(), true);
-
-        TaskBase dummyCManualRunning = TaskUtils.createManualTask(DummyQuartzCommandC.class, 0L);
-        dummyCManualRunning.addAttribute(DummyQuartzCommandC.TEST_KEY, DUMMY_MANUAL_RUNNING_VALUE);
-        assertEquals(taskService.startTask(dummyCManualRunning, true), dummyCManualRunning.getToken());
-
-        checkCanRunManualMethod(DummyQuartzCommandC.class, true);
-        checkCanRunManualMethod(DummyQuartzCommandD.class, false);
-
-        taskService.cancelTask(dummyA.getToken(), true);
-        taskService.cancelTask(dummyCRunning.getToken(), true);
-        taskService.cancelTask(dummyCPaused.getToken(), true);
-        taskService.cancelTask(dummyCStopped.getToken(), true);
-        taskService.cancelTask(dummyCManualPaused.getToken(), true);
-        taskService.cancelTask(dummyCManualRunning.getToken(), true);
-        assertNull(taskService.getInternalActiveTask(dummyA.getToken(), false));
-        assertNull(taskService.getInternalActiveTask(dummyCRunning.getToken(), false));
-        assertNull(taskService.getInternalActiveTask(dummyCPaused.getToken(), false));
-        assertNull(taskService.getInternalActiveTask(dummyCStopped.getToken(), false));
-        assertNull(taskService.getInternalActiveTask(dummyCManualPaused.getToken(), false));
-        assertNull(taskService.getInternalActiveTask(dummyCManualRunning.getToken(), false));
-    }
-
-    private void checkCanRunManualMethod(Class<? extends QuartzCommand> typeToRun, boolean sameType)
-            throws InterruptedException {
-        checkShouldFail(typeToRun, DUMMY_RUNNING_VALUE, sameType);
-        checkShouldStart(typeToRun, NO_DUMMY_VALUE, false);
-        checkShouldStart(typeToRun, DUMMY_STOPPED_VALUE, sameType);
-        checkShouldFail(typeToRun, DUMMY_PAUSED_VALUE, sameType);
-        checkShouldFail(typeToRun, DUMMY_MANUAL_PAUSED_VALUE, sameType);
-        checkShouldFail(typeToRun, DUMMY_MANUAL_RUNNING_VALUE, sameType);
-    }
-
-    private void checkShouldFail(Class<? extends QuartzCommand> typeToRun, String keyValue, boolean sameType)
-            throws InterruptedException {
-        BasicStatusHolder statusHolder1 = new BasicStatusHolder();
-        taskService.checkCanStartManualTask(typeToRun, statusHolder1, keyValue);
-        assertTrue(statusHolder1.isError(), "Command " + typeToRun + " should be forbidden to run");
-
-        TaskBase manualTask = TaskUtils.createManualTask(typeToRun, 0L);
-        manualTask.addAttribute(DummyQuartzCommandC.TEST_KEY, keyValue);
-        try {
-            taskService.startTask(manualTask, true);
-            fail("Task " + manualTask + " should be forbidden to start");
-        } catch (IllegalStateException e) {
-        }
-        assertNull(taskService.getInternalActiveTask(manualTask.getToken(), false));
-
-        TaskBase repeatTask = TaskUtils.createRepeatingTask(typeToRun, 1000L, 0L);
-        repeatTask.addAttribute(DummyQuartzCommandC.TEST_KEY, keyValue);
-
-        if (sameType) {
-            try {
-                taskService.startTask(repeatTask, true);
-                fail("Task " + repeatTask + " should be forbidden to start");
-            } catch (IllegalStateException e) {
-            }
-        } else {
-            taskService.startTask(repeatTask, false);
-            Thread.sleep(20);
-            ArtifactoryHomeTaskTestStub homeStub = getOrCreateArtifactoryHomeStub();
-            ArtifactoryHomeTaskTestStub.TaskTestData repeatTaskData = homeStub.getTaskData(repeatTask.getToken());
-            // Never reached execution since it fails in beforeExecute
-            // TODO: Monitor the before execute calls
-            repeatTaskData.assertFails(0, 0);
-            taskService.cancelTask(repeatTask.getToken(), true);
-        }
-        assertNull(taskService.getInternalActiveTask(repeatTask.getToken(), false));
-    }
-
-    private void checkShouldStart(Class<? extends QuartzCommand> typeToRun, String keyValue, boolean onlyManual) {
-        BasicStatusHolder statusHolder1 = new BasicStatusHolder();
-        taskService.checkCanStartManualTask(typeToRun, statusHolder1, keyValue);
-        assertFalse(statusHolder1.isError(), "Command " + typeToRun + " should be allowed to run");
-
-        TaskBase manualTask = TaskUtils.createManualTask(typeToRun, 0L);
-        manualTask.addAttribute(DummyQuartzCommandC.TEST_KEY, keyValue);
-        assertEquals(taskService.startTask(manualTask, true), manualTask.getToken());
-        taskService.cancelTask(manualTask.getToken(), true);
-        assertNull(taskService.getInternalActiveTask(manualTask.getToken(), false));
-
-        TaskBase repeatTask = TaskUtils.createRepeatingTask(typeToRun, 1000L, 0L);
-        repeatTask.addAttribute(DummyQuartzCommandC.TEST_KEY, keyValue);
-
-        if (onlyManual) {
-            try {
-                taskService.startTask(repeatTask, true);
-                fail("Task " + repeatTask + " should be forbidden to start");
-            } catch (IllegalStateException e) {
-            }
-        } else {
-            assertEquals(taskService.startTask(repeatTask, true), repeatTask.getToken());
-            ArtifactoryHomeTaskTestStub homeStub = getOrCreateArtifactoryHomeStub();
-            ArtifactoryHomeTaskTestStub.TaskTestData repeatTaskData = homeStub.getTaskData(repeatTask.getToken());
-            taskService.cancelTask(repeatTask.getToken(), true);
-            repeatTaskData.assertNbs(1, 1);
-        }
-        assertNull(taskService.getInternalActiveTask(repeatTask.getToken(), false));
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/test/java/org/artifactory/schedule/SharedTaskServiceTest.java b/backend/core/src/test/java/org/artifactory/schedule/SharedTaskServiceTest.java
deleted file mode 100644
index 74aab4f..0000000
--- a/backend/core/src/test/java/org/artifactory/schedule/SharedTaskServiceTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-/**
- * @author yoavl
- */
- at Test(enabled = false, sequential = true)
-public class SharedTaskServiceTest extends TaskServiceTestBase {
-    private static final Logger log = LoggerFactory.getLogger(SharedTaskServiceTest.class);
-
-    protected TaskBase task;
-
-    @BeforeClass
-    public void startTask() throws Exception {
-        task = TaskUtils.createRepeatingTask(DummyQuartzCommand.class, 50, 0);
-        taskService.startTask(task, false);
-    }
-
-    @AfterClass
-    public void cancelTask() {
-        taskService.cancelTask(task.getToken(), true);
-    }
-
-    @Test(enabled = false)
-    public void testPause() throws Exception {
-        Thread.sleep(200);
-        log.debug("######### PAUSING #########");
-        taskService.pauseTask(task.getToken(), true);
-        log.debug("######### PAUSED #########");
-        Thread.sleep(200);
-        log.debug("######### RESUMED #########");
-        taskService.resumeTask(task.getToken());
-        Thread.sleep(200);
-        log.debug("######### STOPPING #########");
-        taskService.stopTask(task.getToken(), true);
-        log.debug("######### STOPPED #########");
-        Thread.sleep(200);
-        log.debug("######### RESUMING #########");
-        taskService.resumeTask(task.getToken());
-        log.debug("######### RESUMED #########");
-        Thread.sleep(200);
-    }
-
-    @Test(enabled = false, invocationCount = 12, threadPoolSize = 12)
-    public void testConcurrentServiceAccess() throws Exception {
-        taskService.pauseTask(task.getToken(), true);
-        Thread.sleep(200);
-        taskService.resumeTask(task.getToken());
-        Thread.sleep(200);
-        taskService.stopTask(task.getToken(), true);
-        Thread.sleep(200);
-        taskService.resumeTask(task.getToken());
-        Thread.sleep(200);
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/test/java/org/artifactory/schedule/TaskServiceTest.java b/backend/core/src/test/java/org/artifactory/schedule/TaskServiceTest.java
deleted file mode 100644
index 05f00d0..0000000
--- a/backend/core/src/test/java/org/artifactory/schedule/TaskServiceTest.java
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-import org.artifactory.schedule.quartz.QuartzCommand;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.concurrent.Callable;
-import java.util.concurrent.CyclicBarrier;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-
-import static org.testng.Assert.assertTrue;
-
-/**
- * @author Yoav Landman
- * @author Fred Simon
- */
- at Test(sequential = true, enabled = false)
-public class TaskServiceTest extends TaskServiceTestBase {
-    private static final Logger log = LoggerFactory.getLogger(TaskServiceTest.class);
-
-    @Test(enabled = false, invocationCount = 6, threadPoolSize = 3)
-    public void testServiceSynchronization() throws Exception {
-        TaskBase task1 = TaskUtils.createRepeatingTask(DummyQuartzCommand.class, 100, 200);
-        ArtifactoryHomeTaskTestStub homeStub = getOrCreateArtifactoryHomeStub();
-        taskService.startTask(task1, false);
-        taskService.pauseTask(task1.getToken(), false);
-        homeStub.getTaskData(task1.getToken()).assertNbs(0, 0);
-        TaskBase task2 = TaskUtils.createRepeatingTask(DummyQuartzCommand.class, 100, 0);
-        task2.addAttribute(DummyQuartzCommand.MSECS_TO_RUN, "400");
-        taskService.startTask(task2, false);
-        Thread.sleep(600);
-        taskService.stopTask(task1.getToken(), true);
-        taskService.stopTask(task2.getToken(), true);
-        homeStub.getTaskData(task2.getToken()).assertNbs(2, 1);
-        homeStub.getTaskData(task1.getToken()).assertNbs(0, 0);
-        taskService.cancelTask(task1.getToken(), true);
-        taskService.cancelTask(task2.getToken(), true);
-        Assert.assertNull(taskService.getInternalActiveTask(task1.getToken(), false));
-        Assert.assertNull(taskService.getInternalActiveTask(task2.getToken(), false));
-    }
-
-    @Test(enabled = false)
-    public void testStopWhileRunning() throws Exception {
-        TaskBase task1 = TaskUtils.createRepeatingTask(DummyQuartzCommand.class, 0, 0);
-        ArtifactoryHomeTaskTestStub homeStub = getOrCreateArtifactoryHomeStub();
-        taskService.startTask(task1, true);
-        assertTrue(task1.isRunning());
-        try {
-            taskService.pauseTask(task1.getToken(), false);
-            Assert.fail("Should not be able to pause with no wait on running task");
-        } catch (Exception e) {
-            log.debug("Fail to pause running task OK!");
-        }
-        taskService.stopTask(task1.getToken(), true);
-        // Need to wait for cancel afterExecute to be activated
-        Thread.sleep(50);
-        Assert.assertNull(taskService.getInternalActiveTask(task1.getToken(), false));
-        homeStub.getTaskData(task1.getToken()).assertNbs(1, 1);
-    }
-
-    @Test(enabled = false)
-    public void testCancelWhileRunning() throws Exception {
-        TaskBase task1 = TaskUtils.createRepeatingTask(DummyQuartzCommand.class, 0, 0);
-        ArtifactoryHomeTaskTestStub homeStub = getOrCreateArtifactoryHomeStub();
-        taskService.startTask(task1, true);
-        assertTrue(task1.isRunning());
-        taskService.cancelTask(task1.getToken(), true);
-        Assert.assertFalse(task1.isRunning());
-        Assert.assertNull(taskService.getInternalActiveTask(task1.getToken(), false));
-        assertTrue(task1.waitForCompletion(0));
-        homeStub.getTaskData(task1.getToken()).assertNbs(1, 1);
-    }
-
-    @Test(enabled = false, invocationCount = 6, threadPoolSize = 3)
-    public void testMutliResume() throws Exception {
-        final CyclicBarrier pauseBarrier1 = new CyclicBarrier(2);
-        final CyclicBarrier pauseBarrier2 = new CyclicBarrier(2);
-        final TaskBase tsk = TaskUtils.createRepeatingTask(DummyQuartzCommand.class, 0, 0);
-        Callable<String> c1 = new Callable<String>() {
-            @Override
-            public String call() throws Exception {
-                try {
-                    log.debug("........... PAUSING-1");
-                    taskService.pauseTask(tsk.getToken(), true);
-                    pauseBarrier1.await();
-                    pauseBarrier2.await();
-                } catch (Exception e) {
-                    e.printStackTrace();
-                    return e.getMessage();
-                }
-                return null;
-            }
-        };
-        Callable<String> c2 = new Callable<String>() {
-            @Override
-            public String call() throws Exception {
-                boolean resumed;
-                try {
-                    pauseBarrier1.await();
-                    log.debug("........... PAUSING-2");
-                    taskService.pauseTask(tsk.getToken(), true);
-                    pauseBarrier2.await();
-                    log.debug("........... RESUMING-1");
-                    resumed = taskService.resumeTask(tsk.getToken());
-                    if (resumed) {
-                        return "Resume barriers are broken - resumed too early.";
-                    }
-                    log.debug("........... RESUMING-2");
-                    resumed = taskService.resumeTask(tsk.getToken());
-                    if (!resumed) {
-                        return "Resume barriers are broken - expected resume was not be possible.";
-                    }
-                } catch (Exception e) {
-                    e.printStackTrace();
-                    return e.getMessage();
-                }
-                return null;
-            }
-        };
-        taskService.startTask(tsk, true);
-        ExecutorService executorService = Executors.newCachedThreadPool();
-        Future<String> c1Result = executorService.submit(c1);
-        Future<String> c2Result = executorService.submit(c2);
-        String error = c2Result.get();
-        Assert.assertNull(error, error);
-        error = c1Result.get();
-        Assert.assertNull(error, error);
-        assertTrue(taskService.waitForTaskCompletion(tsk.getToken()));
-        getOrCreateArtifactoryHomeStub().getTaskData(tsk.getToken()).assertNbs(1, 0);
-        Thread.sleep(50);
-        Assert.assertNull(taskService.getInternalActiveTask(tsk.getToken(), false));
-    }
-
-    @Test(enabled = false)
-    public void testCancelWhenWaitingOnStateTransition() throws Exception {
-        final TaskBase tsk = TaskUtils.createRepeatingTask(DummyQuartzCommand.class, 1000, 0);
-        final String tskToken = taskService.startTask(tsk, true);
-        ArtifactoryHomeTaskTestStub.TaskTestData taskData = getOrCreateArtifactoryHomeStub().getTaskData(tskToken);
-        assertTrue(tsk.isRunning());
-        taskService.pauseTask(tskToken, true);
-        assertTrue(tsk.processActive());
-        taskService.cancelTask(tsk.getToken(), true);
-        Assert.assertFalse(tsk.processActive());
-        Assert.assertNull(taskService.getInternalActiveTask(tsk.getToken(), false));
-        taskData.assertNbs(1, 1);
-    }
-
-    @Test(enabled = false)
-    public void testMultiSingleExecution() throws Exception {
-        taskService.cancelAllTasks(true);
-        QuartzCommand cmd = new DummyQuartzCommand();
-        final TaskBase tsk1 = TaskUtils.createRepeatingTask(cmd.getClass(), 0, 0);
-        //Make the task run at least 500ms, so that it wont finish before the second conflicting one is scheduled
-        tsk1.addAttribute(DummyQuartzCommand.MSECS_TO_RUN, "500");
-        tsk1.setSingleton(true);
-        taskService.startTask(tsk1, false);
-        log.debug("........... STARTED TSK1");
-        final TaskBase tsk2 = TaskUtils.createRepeatingTask(cmd.getClass(), 0, 0);
-        tsk2.setSingleton(true);
-        try {
-            taskService.startTask(tsk2, false);
-            Assert.fail("Should not be able to run 2 singleton tasks concurrently.");
-        } catch (IllegalStateException e) {
-            //Good - we expected it
-        }
-        Assert.assertTrue(taskService.waitForTaskCompletion(tsk1.getToken()));
-        Assert.assertTrue(taskService.waitForTaskCompletion(tsk2.getToken()));
-    }
-
-    @Test(enabled = false)
-    public void testSingleExecutionWithError() throws Exception {
-        taskService.cancelAllTasks(true);
-        QuartzCommand cmd = new DummyQuartzCommand();
-        final TaskBase tsk1 = TaskUtils.createRepeatingTask(cmd.getClass(), 0, 0);
-        tsk1.setSingleton(true);
-        tsk1.addAttribute(DummyQuartzCommand.FAIL, Boolean.TRUE);
-        taskService.startTask(tsk1, true);
-        log.debug("........... WAITING FOR TSK1");
-        assertTrue(taskService.waitForTaskCompletion(tsk1.getToken()));
-        getOrCreateArtifactoryHomeStub().getTaskData(tsk1.getToken()).assertFails(1, 1);
-        // Need to wait for cancel afterExecute to be activated
-        Thread.sleep(50);
-        Assert.assertNull(taskService.getInternalActiveTask(tsk1.getToken(), false));
-        final TaskBase tsk2 = TaskUtils.createRepeatingTask(cmd.getClass(), 0, 0);
-        tsk2.setSingleton(true);
-        taskService.startTask(tsk2, true);
-        taskService.waitForTaskCompletion(tsk2.getToken());
-        getOrCreateArtifactoryHomeStub().getTaskData(tsk2.getToken()).assertNbs(1, 0);
-        // Need to wait for cancel afterExecute to be activated
-        Thread.sleep(50);
-        Assert.assertNull(taskService.getInternalActiveTask(tsk2.getToken(), false));
-    }
-
-    @Test(enabled = false)
-    public void testConcurrentStopResumes() throws Exception {
-        final CyclicBarrier barrier1 = new CyclicBarrier(2);
-        final CyclicBarrier barrier2 = new CyclicBarrier(2);
-        final TaskBase tsk = TaskUtils.createRepeatingTask(DummyQuartzCommand.class, 0, 0);
-        Callable<String> c1 = new Callable<String>() {
-            @Override
-            public String call() throws Exception {
-                barrier1.await();
-                log.debug("........... PAUSING-1");
-                taskService.pauseTask(tsk.getToken(), true);
-                barrier2.await();
-                return null;
-            }
-        };
-        Callable<String> c2 = new Callable<String>() {
-            @Override
-            public String call() throws Exception {
-                barrier1.await();
-                log.debug("........... STOPING-2");
-                taskService.stopTask(tsk.getToken(), true);
-                barrier2.await();
-                return null;
-            }
-        };
-        taskService.startTask(tsk, true);
-        Thread.sleep(200);
-        ExecutorService executorService = Executors.newCachedThreadPool();
-        executorService.submit(c1);
-        executorService.submit(c2);
-        Assert.assertTrue(taskService.waitForTaskCompletion(tsk.getToken()));
-        taskService.cancelTask(tsk.getToken(), true);
-    }
-
-    @Test(enabled = false)
-    public void testDoubleResume() throws Exception {
-        TaskBase task1 = TaskUtils.createRepeatingTask(DummyQuartzCommand.class, 1000, 0);
-        taskService.startTask(task1, true);
-        taskService.pauseTask(task1.getToken(), true);
-        taskService.stopTask(task1.getToken(), true);
-        log.debug("........... RESUMING-1");
-        taskService.resumeTask(task1.getToken());
-        log.debug("........... RESUMING-2");
-        taskService.resumeTask(task1.getToken());
-        log.debug("........... RESUMING-3");
-        taskService.resumeTask(task1.getToken());
-        log.debug("........... RESUMING-4");
-        taskService.resumeTask(task1.getToken());
-        log.debug("........... DONE");
-        taskService.cancelTask(task1.getToken(), true);
-    }
-
-    @Test(enabled = false)
-    public void testMisfireIgnored() throws Exception {
-        // Create task running every second and lasting for 1.2s
-        TaskBase task1 = TaskUtils.createCronTask(DummyQuartzCommand.class, "* * * * * ?");
-        task1.addAttribute(DummyQuartzCommand.MSECS_TO_RUN, "1200");
-        taskService.startTask(task1, true);
-        Thread.sleep(3000);
-        taskService.cancelTask(task1.getToken(), true);
-        // Should have executed 3 times and one break
-        getOrCreateArtifactoryHomeStub().getTaskData(task1.getToken()).assertNbs(3, 1);
-    }
-
-    @Test(enabled = false)
-    public void testMisfireIgnoredOnPause() throws Exception {
-        // Create task running every second and pause for 1.2s
-        TaskBase task1 = TaskUtils.createCronTask(DummyQuartzCommand.class, "* * * * * ?");
-        taskService.startTask(task1, true);
-        Thread.sleep(100);
-        taskService.pauseTask(task1.getToken(), true);
-        Thread.sleep(1200);
-        Assert.assertTrue(taskService.resumeTask(task1.getToken()));
-        Thread.sleep(100);
-        taskService.cancelTask(task1.getToken(), true);
-        // Should have executed 3 times and one break
-        getOrCreateArtifactoryHomeStub().getTaskData(task1.getToken()).assertNbs(1, 1);
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/test/java/org/artifactory/schedule/TaskServiceTestBase.java b/backend/core/src/test/java/org/artifactory/schedule/TaskServiceTestBase.java
deleted file mode 100644
index 8d0165c..0000000
--- a/backend/core/src/test/java/org/artifactory/schedule/TaskServiceTestBase.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-import ch.qos.logback.classic.Level;
-import com.google.common.collect.Maps;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.CoreAddonsImpl;
-import org.artifactory.addon.OssAddonsManager;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-import org.artifactory.spring.InternalArtifactoryContext;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.artifactory.test.TestUtils;
-import org.artifactory.test.mock.MockUtils;
-import org.easymock.EasyMock;
-import org.quartz.JobKey;
-import org.quartz.Scheduler;
-import org.quartz.SchedulerException;
-import org.quartz.impl.matchers.GroupMatcher;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
-
-/**
- * @author yoavl
- */
- at Test(enabled = false)
-public class TaskServiceTestBase extends ArtifactoryHomeBoundTest {
-
-    private static final boolean HIGH_DEBUG = false;
-    protected ArtifactoryHomeTaskTestStub artifactoryHome;
-    protected TaskServiceImpl taskService;
-
-    @Override
-    protected ArtifactoryHomeTaskTestStub getOrCreateArtifactoryHomeStub() {
-        if (artifactoryHome == null) {
-            artifactoryHome = new ArtifactoryHomeTaskTestStub();
-            artifactoryHome.setMimeTypes(mimeTypes);
-        }
-        return artifactoryHome;
-    }
-
-    @BeforeClass
-    public void setupTaskService() throws Exception {
-        /*LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
-        lc.getLogger("org.artifactory.schedule").setLevel(Level.DEBUG);*/
-
-        InternalArtifactoryContext context = MockUtils.getThreadBoundedMockContext();
-
-        EasyMock.expect(context.getArtifactoryHome()).andReturn(getOrCreateArtifactoryHomeStub()).anyTimes();
-        EasyMock.expect(context.isOffline()).andReturn(false).anyTimes();
-        //Create a config mock
-        CentralConfigService cc = EasyMock.createMock(CentralConfigService.class);
-        EasyMock.expect(context.getCentralConfig()).andReturn(cc).anyTimes();
-        CentralConfigDescriptor ccd = EasyMock.createMock(CentralConfigDescriptor.class);
-        EasyMock.expect(
-                ccd.getLocalRepositoriesMap())
-                .andReturn(Maps.<String, LocalRepoDescriptor>newLinkedHashMap()).anyTimes();
-        EasyMock.expect(
-                ccd.getRemoteRepositoriesMap())
-                .andReturn(Maps.<String, RemoteRepoDescriptor>newLinkedHashMap()).anyTimes();
-        EasyMock.expect(
-                ccd.getVirtualRepositoriesMap())
-                .andReturn(Maps.<String, VirtualRepoDescriptor>newLinkedHashMap()).anyTimes();
-        EasyMock.expect(cc.getDescriptor()).andReturn(ccd).anyTimes();
-
-        //Put the task service into the context
-        taskService = new TaskServiceImpl();
-        taskService.onContextReady();
-        EasyMock.expect(context.getTaskService()).andReturn(taskService).anyTimes();
-
-        AddonsManager addonsManager = new OssAddonsManager();
-        TestUtils.setField(addonsManager, "context", context);
-        EasyMock.expect(context.beanForType(AddonsManager.class)).andReturn(addonsManager).anyTimes();
-        TestUtils.setField(taskService, "addonsManager", addonsManager);
-        CoreAddonsImpl coreAddons = new CoreAddonsImpl();
-        EasyMock.expect(context.beanForType(HaCommonAddon.class)).andReturn(coreAddons).anyTimes();
-
-        //Put the scheduler into the context
-        try {
-            super.bindArtifactoryHome();
-            ArtifactorySchedulerFactoryBean schedulerFactory = new ArtifactorySchedulerFactoryBean();
-            schedulerFactory.setTaskExecutor(new CachedThreadPoolTaskExecutor());
-            schedulerFactory.afterPropertiesSet();
-            Scheduler scheduler = schedulerFactory.getObject();
-            EasyMock.expect(context.beanForType(Scheduler.class)).andReturn(scheduler).anyTimes();
-            schedulerFactory.setApplicationContext(context);
-
-            //Charge the mocks
-            EasyMock.replay(context, cc, ccd);
-            schedulerFactory.start();
-        } finally {
-            super.unbindArtifactoryHome();
-        }
-    }
-
-    @BeforeClass
-    public void setEnvironment() throws Exception {
-        if (HIGH_DEBUG) {
-            TestUtils.setLoggingLevel("org.artifactory.schedule", Level.DEBUG);
-            TestUtils.setLoggingLevel("org.artifactory.schedule.TaskBase", Level.TRACE);
-            TestUtils.setLoggingLevel("org.artifactory.schedule.TaskCallback", Level.TRACE);
-        } else {
-            TestUtils.setLoggingLevel("org.artifactory.schedule", Level.INFO);
-        }
-        getOrCreateArtifactoryHomeStub().setProperty(ConstantValues.taskCompletionLockTimeoutRetries, "3");
-        getOrCreateArtifactoryHomeStub().setProperty(ConstantValues.locksTimeoutSecs, "5");
-    }
-
-    @AfterMethod(enabled = HIGH_DEBUG, lastTimeOnly = true)
-    public void assertNoActiveTasks() throws SchedulerException {
-        List<TaskBase> activeTasks = taskService.getActiveTasks(input -> true);
-        assertTrue(activeTasks.isEmpty(), "Active tasks after test method finished: " + activeTasks);
-        Scheduler scheduler = ContextHelper.get().beanForType(Scheduler.class);
-        assertEquals(scheduler.getJobKeys(GroupMatcher.<JobKey>anyGroup()).size(), 0);
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/test/java/org/artifactory/schedule/TaskUtilsTest.java b/backend/core/src/test/java/org/artifactory/schedule/TaskUtilsTest.java
deleted file mode 100644
index bd1df48..0000000
--- a/backend/core/src/test/java/org/artifactory/schedule/TaskUtilsTest.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package org.artifactory.schedule;
-
-import org.artifactory.backup.BackupJob;
-import org.artifactory.repo.cleanup.IntegrationCleanupJob;
-import org.artifactory.storage.binstore.service.BinaryStoreGarbageCollectorJob;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * Unit tests for {@link TaskUtils}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class TaskUtilsTest {
-
-    public void taskManualJobDetailsPopulation() {
-        TaskBase t = TaskUtils.createManualTask(BackupJob.class, 0);
-        assertTrue(t.getToken().startsWith("artifactory.BackupJob"));
-        assertEquals(t.getLastStarted(), 0);
-        assertEquals(t.getType(), BackupJob.class);
-        assertTrue(t.isManuallyActivated());
-        assertFalse(t.isRunning());
-        JobCommand jobCommand = BackupJob.class.getAnnotation(JobCommand.class);
-        assertEquals(t.isSingleton(), jobCommand.singleton());
-        assertEquals(t.getDescription(), jobCommand.description() + " (manual trigger)");
-    }
-
-    public void taskRepeatingJobDetailsPopulation() {
-        TaskBase t = TaskUtils.createRepeatingTask(IntegrationCleanupJob.class, 3, 4);
-        t.addAttribute("custom", "attribute");
-        assertTrue(t.getToken().startsWith("artifactory.IntegrationCleanupJob"));
-        assertEquals(t.getLastStarted(), 0);
-        assertEquals(t.getType(), IntegrationCleanupJob.class);
-        assertFalse(t.isManuallyActivated());
-        assertFalse(t.isRunning());
-        JobCommand jobCommand = IntegrationCleanupJob.class.getAnnotation(JobCommand.class);
-        assertEquals(t.isSingleton(), jobCommand.singleton());
-        assertEquals(t.getDescription(), jobCommand.description());
-    }
-
-    public void taskCronJobDetailsPopulation() {
-        TaskBase t = TaskUtils.createCronTask(BinaryStoreGarbageCollectorJob.class, "0 0 /6 * * ?");
-        assertTrue(t.getToken().startsWith("artifactory.BinaryStoreGarbageCollectorJob"));
-        assertEquals(t.getLastStarted(), 0);
-        assertEquals(t.getType(), BinaryStoreGarbageCollectorJob.class);
-        assertFalse(t.isManuallyActivated());
-        assertFalse(t.isRunning());
-        JobCommand jobCommand = BinaryStoreGarbageCollectorJob.class.getAnnotation(JobCommand.class);
-        assertEquals(t.isSingleton(), jobCommand.singleton());
-        assertEquals(t.getDescription(), jobCommand.description());
-    }
-
-    public void taskDescriptionOverride() {
-        TaskBase t = TaskUtils.createManualTask(BinaryStoreGarbageCollectorJob.class, 2, "Another change");
-        assertEquals(t.getDescription(), "Another change (manual trigger)");
-
-        t = TaskUtils.createCronTask(BinaryStoreGarbageCollectorJob.class, "0 0 /6 * * ?",
-                "Change the default");
-        assertEquals(t.getDescription(), "Change the default");
-
-        t = TaskUtils.createRepeatingTask(BinaryStoreGarbageCollectorJob.class, 1, 2,
-                "My description");
-        assertEquals(t.getDescription(), "My description");
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/test/java/org/artifactory/security/ArtifactorySidTest.java b/backend/core/src/test/java/org/artifactory/security/ArtifactorySidTest.java
deleted file mode 100644
index 89da3d3..0000000
--- a/backend/core/src/test/java/org/artifactory/security/ArtifactorySidTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * ArtifactorySid unit tests.
- *
- * @author Yossi Shaul
- */
- at Test
-public class ArtifactorySidTest {
-
-    public void userConstructor() {
-        ArtifactorySid sid = new ArtifactorySid("momo", false);
-        assertEquals(sid.getPrincipal(), "momo");
-        assertFalse(sid.isGroup(), "Default group value should be false");
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void nullPrincipal() {
-        new ArtifactorySid(null, false);
-    }
-
-    public void userSidCreation() {
-        ArtifactorySid sid = new ArtifactorySid("momo", false);
-        assertEquals(sid.getPrincipal(), "momo");
-        assertFalse(sid.isGroup());
-    }
-
-    public void groupSidCreation() {
-        ArtifactorySid sid = new ArtifactorySid("agroup", true);
-        assertEquals(sid.getPrincipal(), "agroup");
-        assertTrue(sid.isGroup());
-    }
-
-    public void userSidsEquals() {
-        ArtifactorySid sid1 = new ArtifactorySid("user1", false);
-        // equal entry
-        ArtifactorySid sid2 = new ArtifactorySid("user1", false);
-        // different user
-        ArtifactorySid sid3 = new ArtifactorySid("user2", false);
-        // subclass with same value
-        ArtifactorySid sid4 = new ArtifactorySid("user1", false) {
-        };
-        // group with same name
-        ArtifactorySid groupSid = new ArtifactorySid("user1", true);
-
-        assertTrue(sid1.equals(sid2));
-        assertFalse(sid1.equals(sid3), "Different user sid");
-        assertFalse(sid1.equals(sid4), "Subclass should not equal");
-        assertFalse(sid1.equals(groupSid), "Group and User should not equal");
-    }
-
-    public void groupSidsEquals() {
-        ArtifactorySid sid1 = new ArtifactorySid("group1", true);
-        // equal entry
-        ArtifactorySid sid2 = new ArtifactorySid("group1", true);
-        // different user
-        ArtifactorySid sid3 = new ArtifactorySid("group2", false);
-        // subclass with same value
-        ArtifactorySid sid4 = new ArtifactorySid("group1", false) {
-        };
-
-        assertTrue(sid1.equals(sid2));
-        assertFalse(sid1.equals(sid3), "Different group sid");
-        assertFalse(sid1.equals(sid4), "Subclass should not equal");
-    }
-
-    public void groupAndUserNotEquals() {
-        ArtifactorySid userSid = new ArtifactorySid("principal", false);
-        ArtifactorySid groupSid = new ArtifactorySid("principal", true);
-
-        assertFalse(userSid.equals(groupSid), "User and group SIDs cannot be equal");
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/security/SaltTest.java b/backend/core/src/test/java/org/artifactory/security/SaltTest.java
deleted file mode 100644
index 2f20a94..0000000
--- a/backend/core/src/test/java/org/artifactory/security/SaltTest.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.schedule.ArtifactoryHomeTaskTestStub;
-import org.artifactory.storage.security.service.UserGroupStoreService;
-import org.springframework.security.authentication.encoding.Md5PasswordEncoder;
-import org.springframework.test.util.ReflectionTestUtils;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import static org.easymock.EasyMock.createMock;
-
-/**
- * Test the password encoding logic with regard to Salt encoding
- *
- * @author Gidi Shabat
- */
-public class SaltTest {
-
-    private SecurityServiceImpl securityService;
-    private UserGroupStoreService userGroupStoreService;
-
-    @BeforeClass
-    public void initArtifactoryRoles() {
-        userGroupStoreService = createMock(UserGroupStoreService.class);
-        ArtifactoryHome.bind(new ArtifactoryHomeTaskTestStub());
-    }
-
-    @BeforeMethod
-    public void setUp() {
-        securityService = new SecurityServiceImpl();
-        ReflectionTestUtils.setField(securityService, "userGroupStoreService", userGroupStoreService);
-        ReflectionTestUtils.setField(securityService, "passwordEncoder", new Md5PasswordEncoder());
-    }
-
-    @Test
-    public void saltValueTest() {
-        String defaultSalt = securityService.getDefaultSalt();
-        Assert.assertEquals(defaultSalt, ConstantValues.defaultSaltValue.getString(),
-                "Fail to fetch default Salt value");
-    }
-
-    @Test
-    public void saltedPasswordWitDefaultSaltGenerationTest() {
-        SaltedPassword saltedPassword = securityService.generateSaltedPassword("password");
-        Md5PasswordEncoder encoder = new Md5PasswordEncoder();
-        // Expect to use the default Salt
-        String salt = ConstantValues.defaultSaltValue.getString();
-        SaltedPassword expectedPassword = new SaltedPassword(encoder.encodePassword("password", salt), salt);
-        Assert.assertEquals(saltedPassword, expectedPassword, "Fail to generate secured password with Salt");
-    }
-
-    @Test
-    public void saltedPasswordGenerationWithNullSaltTest() {
-        // Expect to use the default Salt
-        SaltedPassword securedPassword = securityService.generateSaltedPassword("password", null);
-        Md5PasswordEncoder encoder = new Md5PasswordEncoder();
-        String salt = null;
-        SaltedPassword expectedPassword = new SaltedPassword(encoder.encodePassword("password", salt), salt);
-        Assert.assertEquals(securedPassword, expectedPassword, "Fail to generate secured password with Salt");
-    }
-
-    @Test
-    public void saltedPasswordGenerationWithExistingUserTest() {
-        // Expect to use the user Salt
-        SaltedPassword securedPassword = securityService.generateSaltedPassword("password", "SALT");
-        Md5PasswordEncoder encoder = new Md5PasswordEncoder();
-        SaltedPassword expectedPassword = new SaltedPassword(encoder.encodePassword("password", "SALT"), "SALT");
-        Assert.assertEquals(securedPassword, expectedPassword, "Fail to generate secured password with Salt");
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/security/SecurityServiceImplTest.java b/backend/core/src/test/java/org/artifactory/security/SecurityServiceImplTest.java
deleted file mode 100644
index cae0474..0000000
--- a/backend/core/src/test/java/org/artifactory/security/SecurityServiceImplTest.java
+++ /dev/null
@@ -1,1030 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.artifactory.api.security.SecurityListener;
-import org.artifactory.api.security.UserInfoBuilder;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.config.InternalCentralConfigService;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.security.*;
-import org.artifactory.descriptor.security.ldap.LdapSetting;
-import org.artifactory.exception.InvalidNameException;
-import org.artifactory.factory.InfoFactory;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.model.xstream.security.UserImpl;
-import org.artifactory.repo.*;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.security.exceptions.PasswordChangeException;
-import org.artifactory.storage.security.service.AclStoreService;
-import org.artifactory.storage.security.service.UserGroupStoreService;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.artifactory.util.NameValidator;
-import org.easymock.EasyMock;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.authentication.encoding.PasswordEncoder;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.core.context.SecurityContextImpl;
-import org.springframework.test.util.ReflectionTestUtils;
-import org.testng.annotations.*;
-
-import java.util.*;
-
-import static org.easymock.EasyMock.*;
-import static org.testng.Assert.*;
-
-/**
- * SecurityServiceImpl unit tests. TODO: simplify the tests
- *
- * @author Yossi Shaul
- */
- at Test
-public class SecurityServiceImplTest extends ArtifactoryHomeBoundTest {
-    private InfoFactory factory = InfoFactoryHolder.get();
-    private SecurityContextImpl securityContext;
-    private SecurityServiceImpl service;
-    private List<AclInfo> testAcls;
-    private AclStoreService aclStoreServiceMock;
-    private String userAndGroupSharedName;
-    private InternalRepositoryService repositoryServiceMock;
-    private LocalRepo localRepoMock;
-    private LocalRepo cacheRepoMock;
-    private InternalCentralConfigService centralConfigServiceMock;
-    private UserGroupStoreService userGroupStoreService;
-    private SecurityListener securityListenerMock;
-    private PasswordEncoder passwordEncoderMock;
-
-    @BeforeClass
-    public void initArtifactoryRoles() {
-        testAcls = createTestAcls();
-        aclStoreServiceMock = createMock(AclStoreService.class);
-        repositoryServiceMock = createRepoServiceMock();
-        centralConfigServiceMock = createMock(InternalCentralConfigService.class);
-        userGroupStoreService = createMock(UserGroupStoreService.class);
-        localRepoMock = createLocalRepoMock();
-        cacheRepoMock = createCacheRepoMock();
-        securityListenerMock = createMock(SecurityListener.class);
-        passwordEncoderMock = createMock(PasswordEncoder.class);
-    }
-
-    @BeforeMethod
-    public void setUp() {
-        // create new security context
-        securityContext = new SecurityContextImpl();
-        SecurityContextHolder.setContext(securityContext);
-
-        // new service instance
-        service = new SecurityServiceImpl();
-        // set the aclManager mock on the security service
-        ReflectionTestUtils.setField(service, "userGroupStoreService", userGroupStoreService);
-        ReflectionTestUtils.setField(service, "aclStoreService", aclStoreServiceMock);
-        ReflectionTestUtils.setField(service, "repositoryService", repositoryServiceMock);
-        ReflectionTestUtils.setField(service, "centralConfig", centralConfigServiceMock);
-        ReflectionTestUtils.setField(service, "passwordEncoder", passwordEncoderMock);
-
-        // reset mocks
-        reset(aclStoreServiceMock, repositoryServiceMock, centralConfigServiceMock, passwordEncoderMock);
-    }
-
-    public void isAdminOnAdminUser() {
-        Authentication authentication = setAdminAuthentication();
-
-        boolean admin = service.isAdmin();
-        assertTrue(admin, "The user in test is admin");
-        // un-authenticate
-        authentication.setAuthenticated(false);
-        admin = service.isAdmin();
-        assertFalse(admin, "Unauthenticated token");
-    }
-
-    public void isAdminOnSimpleUser() {
-        setSimpleUserAuthentication();
-
-        boolean admin = service.isAdmin();
-        assertFalse(admin, "The user in test is not an admin");
-    }
-
-    @Test(dependsOnMethods = "isAdminOnAdminUser")
-    public void spidermanCanDoAnything() {
-        setAdminAuthentication();
-        assertFalse(service.isAnonymous());// sanity
-        assertTrue(service.isAdmin());// sanity
-
-        RepoPath path = InternalRepoPathFactory.create("someRepo", "blabla");
-        boolean canRead = service.canRead(path);
-        assertTrue(canRead);
-        boolean canDeploy = service.canDeploy(path);
-        assertTrue(canDeploy);
-    }
-
-    @Test
-    public void userReadAndDeployPermissions() {
-        Authentication authentication = setSimpleUserAuthentication();
-
-        RepoPath securedPath = InternalRepoPathFactory.create("securedRepo", "blabla");
-        expect(repositoryServiceMock.localOrCachedRepositoryByKey(securedPath.getRepoKey()))
-                .andReturn(localRepoMock).anyTimes();
-        expect(repositoryServiceMock.remoteRepoDescriptorByKey(securedPath.getRepoKey())).andReturn(null).anyTimes();
-        replay(repositoryServiceMock);
-
-        // cannot read the specified path
-        expectGetAllAclsCall(authentication);
-        replay(aclStoreServiceMock);
-        boolean canRead = service.canRead(securedPath);
-        assertFalse(canRead, "User should not have permissions for this path");
-        verify(aclStoreServiceMock);
-        reset(aclStoreServiceMock);
-
-        // cannot deploy to the specified path
-        expectGetAllAclsCall(authentication);
-        replay(aclStoreServiceMock);
-
-        boolean canDeploy = service.canDeploy(securedPath);
-        assertFalse(canDeploy, "User should not have permissions for this path");
-        verify(aclStoreServiceMock, repositoryServiceMock);
-        reset(aclStoreServiceMock, repositoryServiceMock);
-
-        RepoPath allowedReadPath = InternalRepoPathFactory.create("testRepo1", "blabla");
-        expect(repositoryServiceMock.localOrCachedRepositoryByKey(allowedReadPath.getRepoKey()))
-                .andReturn(localRepoMock).anyTimes();
-        expect(repositoryServiceMock.remoteRepoDescriptorByKey(allowedReadPath.getRepoKey())).andReturn(null).anyTimes();
-        replay(repositoryServiceMock);
-
-        // can read the specified path
-        expectGetAllAclsCall(authentication);
-        replay(aclStoreServiceMock);
-        canRead = service.canRead(allowedReadPath);
-        assertTrue(canRead, "User should have read permissions for this path");
-        verify(aclStoreServiceMock);
-        reset(aclStoreServiceMock);
-
-        // cannot deploy to the specified path
-        expectGetAllAclsCall(authentication);
-        replay(aclStoreServiceMock);
-        canDeploy = service.canDeploy(allowedReadPath);
-        assertFalse(canDeploy, "User should not have permissions for this path");
-        verify(aclStoreServiceMock, repositoryServiceMock);
-        reset(aclStoreServiceMock);
-
-        // cannot admin the specified path
-        expectGetAllAclsCall(authentication);
-        replay(aclStoreServiceMock);
-        boolean canAdmin = service.canManage(allowedReadPath);
-        assertFalse(canAdmin, "User should not have permissions for this path");
-        verify(aclStoreServiceMock);
-    }
-
-    @Test
-    public void adminRolePermissions() {
-        // user with admin role on permission target 'target1'
-        Authentication authentication = setSimpleUserAuthentication("yossis");
-
-        RepoPath allowedReadPath = InternalRepoPathFactory.create("testRepo1", "blabla");
-
-        // can read the specified path
-        expect(repositoryServiceMock.remoteRepoDescriptorByKey("testRepo1")).andReturn(null).anyTimes();
-        expectGetAllAclsCall(authentication);
-        replay(aclStoreServiceMock, repositoryServiceMock);
-        boolean canRead = service.canRead(allowedReadPath);
-        assertTrue(canRead, "User should have permissions for this path");
-        verify(aclStoreServiceMock);
-        reset(aclStoreServiceMock);
-
-        // can deploy to the specified path
-        expectGetAllAclsCall(authentication);
-        replay(aclStoreServiceMock);
-        boolean canDeploy = service.canDeploy(allowedReadPath);
-        assertTrue(canDeploy, "User should have permissions for this path");
-        verify(aclStoreServiceMock);
-        reset(aclStoreServiceMock);
-
-        // can admin the specified path
-        expectGetAllAclsCall(authentication);
-        replay(aclStoreServiceMock);
-        boolean canAdmin = service.canManage(allowedReadPath);
-        assertTrue(canAdmin, "User should have permissions for this path");
-        verify(aclStoreServiceMock);
-        reset(aclStoreServiceMock);
-
-        // can admin
-        AclInfo testRepo1Acl = testAcls.get(0);
-        PermissionTargetInfo target = testRepo1Acl.getPermissionTarget();
-        expect(aclStoreServiceMock.getAcl(target.getName())).andReturn(testRepo1Acl);
-        replay(aclStoreServiceMock);
-        boolean canAdminTarget = service.canManage(target);
-        assertTrue(canAdminTarget, "User should have admin permissions for this target");
-        verify(aclStoreServiceMock);
-    }
-
-    @Test
-    public void groupPermissions() {
-        Authentication authentication = setSimpleUserAuthentication("userwithnopermissions");
-
-        RepoPath allowedReadPath = InternalRepoPathFactory.create("testRepo1", "**");
-        expect(repositoryServiceMock.localOrCachedRepositoryByKey(allowedReadPath.getRepoKey()))
-                .andReturn(localRepoMock).anyTimes();
-        expect(repositoryServiceMock.remoteRepoDescriptorByKey("testRepo1")).andReturn(null).anyTimes();
-        replay(repositoryServiceMock);
-
-        // cannot deploy to the specified path
-        expectGetAllAclsCall(authentication);
-        replay(aclStoreServiceMock);
-        boolean canDeploy = service.canDeploy(allowedReadPath);
-        assertFalse(canDeploy, "User should have permissions for this path");
-        verify(aclStoreServiceMock);
-        reset(aclStoreServiceMock);
-
-        // add the user to a group with permissions and expext permission garnted
-        setSimpleUserAuthentication("userwithnopermissions", "deployGroup");
-        expectGetAllAclsCallWithAnyArray();
-        replay(aclStoreServiceMock);
-        canDeploy = service.canDeploy(allowedReadPath);
-        assertTrue(canDeploy, "User in a group with permissions for this path");
-        verify(aclStoreServiceMock, repositoryServiceMock);
-        reset(aclStoreServiceMock, repositoryServiceMock);
-    }
-
-    @Test
-    public void userWithPermissionsToAGroupWithTheSameName() {
-        setSimpleUserAuthentication(userAndGroupSharedName, userAndGroupSharedName);
-
-        RepoPath testRepo1Path = InternalRepoPathFactory.create("testRepo1", "**");
-        expect(repositoryServiceMock.remoteRepoDescriptorByKey("testRepo1")).andReturn(null).anyTimes();
-        expectGetAllAclsCallWithAnyArray();
-        replay(aclStoreServiceMock, repositoryServiceMock);
-        boolean canRead = service.canRead(testRepo1Path);
-        assertTrue(canRead, "User should have permissions for this path");
-        verify(aclStoreServiceMock);
-        reset(aclStoreServiceMock, repositoryServiceMock);
-
-        RepoPath testRepo2Path = InternalRepoPathFactory.create("testRepo2", "**");
-        expectGetAllAclsCallWithAnyArray();
-        expect(repositoryServiceMock.localOrCachedRepositoryByKey("testRepo2")).andReturn(localRepoMock).anyTimes();
-        expect(repositoryServiceMock.remoteRepoDescriptorByKey("testRepo2")).andReturn(null).anyTimes();
-        replay(aclStoreServiceMock, repositoryServiceMock);
-        canRead = service.canRead(testRepo2Path);
-        assertTrue(canRead, "User belongs to a group with permissions to the path");
-        verify(aclStoreServiceMock);
-        reset(aclStoreServiceMock);
-    }
-
-    @Test
-    public void userWithPermissionsToANonUniqueGroupName() {
-        // here we test that a user that belongs to a group which has
-        // the same name of a nother user will only get the group permissions
-        // and not the user with the same name permissions
-        setSimpleUserAuthentication("auser", userAndGroupSharedName);
-
-        RepoPath testRepo1Path = InternalRepoPathFactory.create("testRepo1", "**");
-        expectGetAllAclsCallWithAnyArray();
-        expect(repositoryServiceMock.localOrCachedRepositoryByKey("testRepo1"))
-                .andReturn(localRepoMock).anyTimes();
-        expect(repositoryServiceMock.remoteRepoDescriptorByKey("testRepo1")).andReturn(null).anyTimes();
-        replay(aclStoreServiceMock, repositoryServiceMock);
-        boolean canRead = service.canRead(testRepo1Path);
-        assertFalse(canRead, "User should not have permissions for this path");
-        verify(aclStoreServiceMock, repositoryServiceMock);
-        reset(aclStoreServiceMock, repositoryServiceMock);
-
-        RepoPath testRepo2Path = InternalRepoPathFactory.create("testRepo2", "**");
-        expectGetAllAclsCallWithAnyArray();
-        expect(repositoryServiceMock.localOrCachedRepositoryByKey("testRepo2"))
-                .andReturn(localRepoMock).anyTimes();
-        expect(repositoryServiceMock.remoteRepoDescriptorByKey("testRepo2")).andReturn(null).anyTimes();
-        replay(aclStoreServiceMock, repositoryServiceMock);
-        canRead = service.canRead(testRepo2Path);
-        assertTrue(canRead, "User belongs to a group with permissions to the path");
-        verify(aclStoreServiceMock, repositoryServiceMock);
-    }
-
-    @Test
-    public void hasPermissionPassingUserInfo() {
-        SimpleUser user = createNonAdminUser("yossis");
-        UserInfo userInfo = user.getDescriptor();
-
-        RepoPath testRepo1Path = InternalRepoPathFactory.create("testRepo1", "any/path");
-
-        expect(repositoryServiceMock.remoteRepoDescriptorByKey("testRepo1")).andReturn(null).anyTimes();
-        expectGetAllAclsCallWithAnyArray();
-        replay(aclStoreServiceMock, repositoryServiceMock);
-        boolean canRead = service.canRead(userInfo, testRepo1Path);
-        assertTrue(canRead, "User should have permissions for this path");
-        verify(aclStoreServiceMock);
-        reset(aclStoreServiceMock, repositoryServiceMock);
-
-        expect(repositoryServiceMock.remoteRepoDescriptorByKey("testRepo1")).andReturn(null).anyTimes();
-        expectGetAllAclsCallWithAnyArray();
-        replay(aclStoreServiceMock, repositoryServiceMock);
-        boolean canDeploy = service.canDeploy(userInfo, testRepo1Path);
-        assertTrue(canDeploy, "User should have permissions for this path");
-        verify(aclStoreServiceMock);
-        reset(aclStoreServiceMock, repositoryServiceMock);
-
-        expect(repositoryServiceMock.localOrCachedRepositoryByKey("testRepo1")).andReturn(localRepoMock).anyTimes();
-        expect(repositoryServiceMock.remoteRepoDescriptorByKey("testRepo1")).andReturn(null).anyTimes();
-        expectGetAllAclsCallWithAnyArray();
-        replay(aclStoreServiceMock, repositoryServiceMock);
-        boolean canDelete = service.canDelete(userInfo, testRepo1Path);
-        assertFalse(canDelete, "User should not have permissions for this path");
-        verify(aclStoreServiceMock, repositoryServiceMock);
-        reset(aclStoreServiceMock);
-
-        expectGetAllAclsCallWithAnyArray();
-        replay(aclStoreServiceMock);
-        boolean canAdmin = service.canManage(userInfo, testRepo1Path);
-        assertTrue(canAdmin, "User should have permissions for this path");
-        verify(aclStoreServiceMock);
-        reset(aclStoreServiceMock, repositoryServiceMock);
-
-        RepoPath testRepo2Path = InternalRepoPathFactory.create("testRepo2", "**");
-
-        expect(repositoryServiceMock.localOrCachedRepositoryByKey("testRepo2")).andReturn(localRepoMock).anyTimes();
-        expect(repositoryServiceMock.remoteRepoDescriptorByKey("testRepo2")).andReturn(null).anyTimes();
-        expectGetAllAclsCallWithAnyArray();
-        replay(aclStoreServiceMock, repositoryServiceMock);
-        canRead = service.canRead(userInfo, testRepo2Path);
-        assertFalse(canRead, "User should not have permissions for this path");
-        verify(aclStoreServiceMock);
-        reset(aclStoreServiceMock, repositoryServiceMock);
-
-        SecurityDescriptor securityDescriptor = new SecurityDescriptor();
-        securityDescriptor.setAnonAccessEnabled(false);
-
-        CentralConfigDescriptor configDescriptor = createMock(CentralConfigDescriptor.class);
-        expect(configDescriptor.getSecurity()).andReturn(securityDescriptor).anyTimes();
-        replay(configDescriptor);
-        expect(centralConfigServiceMock.getDescriptor()).andReturn(configDescriptor).anyTimes();
-        replay(centralConfigServiceMock);
-
-        SimpleUser anon = createNonAdminUser(UserInfo.ANONYMOUS);
-        UserInfo anonUserInfo = anon.getDescriptor();
-
-        RepoPath testMultiRepo = InternalRepoPathFactory.create("multi1", "**");
-        expect(repositoryServiceMock.localOrCachedRepositoryByKey("multi1")).andReturn(cacheRepoMock).anyTimes();
-        expectGetAllAclsCallWithAnyArray();
-        replay(repositoryServiceMock);
-
-        canRead = service.canRead(anonUserInfo, testMultiRepo);
-        assertFalse(canRead, "Anonymous user should have permissions for this path");
-        verify(configDescriptor, centralConfigServiceMock);
-    }
-
-    @Test
-    public void hasPermissionWithSpecificTarget() {
-        SimpleUser user = createNonAdminUser("shay");
-        UserInfo userInfo = user.getDescriptor();
-
-        RepoPath testRepo1Path = InternalRepoPathFactory.create("specific-repo", "com", true);
-
-        expect(repositoryServiceMock.localOrCachedRepositoryByKey("specific-repo")).andReturn(localRepoMock).anyTimes();
-        expect(repositoryServiceMock.remoteRepoDescriptorByKey("specific-repo")).andReturn(null).anyTimes();
-        expectGetAllAclsCallWithAnyArray();
-        replay(aclStoreServiceMock, repositoryServiceMock);
-        boolean canRead = service.canRead(userInfo, testRepo1Path);
-        assertTrue(canRead, "User should have read permissions for this path");
-        verify(aclStoreServiceMock, repositoryServiceMock);
-        reset(aclStoreServiceMock);
-
-        expectGetAllAclsCallWithAnyArray();
-        replay(aclStoreServiceMock);
-        boolean canDeploy = service.canDeploy(userInfo, testRepo1Path);
-        assertTrue(canDeploy, "User should have deploy permissions for this path");
-        verify(aclStoreServiceMock, repositoryServiceMock);
-        reset(aclStoreServiceMock);
-
-        expectGetAllAclsCallWithAnyArray();
-        replay(aclStoreServiceMock);
-        boolean canDelete = service.canDelete(userInfo, testRepo1Path);
-        assertFalse(canDelete, "User should not have delete permissions for this path");
-        verify(aclStoreServiceMock, repositoryServiceMock);
-        reset(aclStoreServiceMock);
-
-        expectGetAllAclsCallWithAnyArray();
-        replay(aclStoreServiceMock);
-        boolean canAdmin = service.canManage(userInfo, testRepo1Path);
-        assertFalse(canAdmin, "User should not have admin permissions for this path");
-        verify(aclStoreServiceMock, repositoryServiceMock);
-        reset(aclStoreServiceMock, repositoryServiceMock);
-    }
-
-    @Test
-    public void hasPermissionForGroupInfo() {
-        GroupInfo groupInfo = InfoFactoryHolder.get().createGroup("deployGroup");
-
-        RepoPath testRepo1Path = InternalRepoPathFactory.create("testRepo1", "any/path");
-        expect(repositoryServiceMock.localOrCachedRepositoryByKey("testRepo1"))
-                .andReturn(localRepoMock).anyTimes();
-        expect(repositoryServiceMock.remoteRepoDescriptorByKey("testRepo1")).andReturn(null).anyTimes();
-        replay(repositoryServiceMock);
-
-        expectGetAllAclsCallWithAnyArray();
-        replay(aclStoreServiceMock);
-        boolean canRead = service.canRead(groupInfo, testRepo1Path);
-        assertFalse(canRead, "Group should not have permissions for this path");
-        verify(aclStoreServiceMock);
-        reset(aclStoreServiceMock);
-
-        expectGetAllAclsCallWithAnyArray();
-        replay(aclStoreServiceMock);
-        boolean canDeploy = service.canDeploy(groupInfo, testRepo1Path);
-        assertTrue(canDeploy, "Group should have permissions for this path");
-        verify(aclStoreServiceMock);
-        reset(aclStoreServiceMock);
-
-        expectGetAllAclsCallWithAnyArray();
-        replay(aclStoreServiceMock);
-        boolean canDelete = service.canDelete(groupInfo, testRepo1Path);
-        assertFalse(canDelete, "Group should not have permissions for this path");
-        verify(aclStoreServiceMock);
-        reset(aclStoreServiceMock);
-
-        expectGetAllAclsCallWithAnyArray();
-        replay(aclStoreServiceMock);
-        boolean canAdmin = service.canManage(groupInfo, testRepo1Path);
-        assertFalse(canAdmin, "Group should not have permissions for this path");
-        verify(aclStoreServiceMock);
-        reset(aclStoreServiceMock, repositoryServiceMock);
-
-        RepoPath testRepo2Path = InternalRepoPathFactory.create("testRepo2", "some/path");
-
-        expect(repositoryServiceMock.localOrCachedRepositoryByKey("testRepo2"))
-                .andReturn(localRepoMock).anyTimes();
-        expect(repositoryServiceMock.remoteRepoDescriptorByKey("testRepo2")).andReturn(null).anyTimes();
-        replay(repositoryServiceMock);
-        expectGetAllAclsCallWithAnyArray();
-        replay(aclStoreServiceMock);
-        canRead = service.canRead(groupInfo, testRepo2Path);
-        assertFalse(canRead, "Group should not have permissions for this path");
-        verify(aclStoreServiceMock, repositoryServiceMock);
-        reset(aclStoreServiceMock, repositoryServiceMock);
-
-        GroupInfo anyRepoGroupRead = InfoFactoryHolder.get().createGroup("anyRepoReadersGroup");
-
-        RepoPath somePath = InternalRepoPathFactory.create("blabla", "some/path");
-
-        expect(repositoryServiceMock.localOrCachedRepositoryByKey("blabla")).andReturn(localRepoMock).anyTimes();
-        expect(repositoryServiceMock.remoteRepoDescriptorByKey("blabla")).andReturn(null).anyTimes();
-        expectGetAllAclsCallWithAnyArray();
-        replay(aclStoreServiceMock, repositoryServiceMock);
-        canRead = service.canRead(anyRepoGroupRead, somePath);
-        assertTrue(canRead, "Group should have permissions for this path");
-        verify(aclStoreServiceMock, repositoryServiceMock);
-        reset(aclStoreServiceMock);
-
-        expectGetAllAclsCallWithAnyArray();
-        replay(aclStoreServiceMock);
-        canDeploy = service.canDeploy(anyRepoGroupRead, somePath);
-        assertFalse(canDeploy, "Group should not have permissions for this path");
-        verify(aclStoreServiceMock);
-        reset(aclStoreServiceMock, repositoryServiceMock);
-
-        GroupInfo multiRepoGroupRead = InfoFactoryHolder.get().createGroup("multiRepoReadersGroup");
-
-        RepoPath multiPath = InternalRepoPathFactory.create("multi1", "some/path");
-        expect(repositoryServiceMock.localOrCachedRepositoryByKey("multi1")).andReturn(localRepoMock).anyTimes();
-        expect(repositoryServiceMock.remoteRepoDescriptorByKey("multi1")).andReturn(null).anyTimes();
-        expect(repositoryServiceMock.localOrCachedRepositoryByKey("multi2")).andReturn(localRepoMock).anyTimes();
-        expect(repositoryServiceMock.remoteRepoDescriptorByKey("multi2")).andReturn(null).anyTimes();
-        expectGetAllAclsCallWithAnyArray();
-        replay(aclStoreServiceMock, repositoryServiceMock);
-        canRead = service.canRead(multiRepoGroupRead, multiPath);
-        assertTrue(canRead, "Group should have permissions for this path");
-        verify(aclStoreServiceMock, repositoryServiceMock);
-        reset(aclStoreServiceMock);
-
-        RepoPath multiPath2 = InternalRepoPathFactory.create("multi2", "some/path");
-        expectGetAllAclsCallWithAnyArray();
-        replay(aclStoreServiceMock);
-        canRead = service.canRead(multiRepoGroupRead, multiPath2);
-        assertTrue(canRead, "Group should have permissions for this path");
-        verify(aclStoreServiceMock, repositoryServiceMock);
-        reset(aclStoreServiceMock);
-
-        expectGetAllAclsCallWithAnyArray();
-        replay(aclStoreServiceMock);
-        canDeploy = service.canDeploy(multiRepoGroupRead, multiPath);
-        assertFalse(canDeploy, "Group should not have permissions for this path");
-        verify(aclStoreServiceMock, repositoryServiceMock);
-    }
-
-    @Test
-    public void getAllPermissionTargetsForAdminUser() {
-        setAdminAuthentication();
-
-        expect(aclStoreServiceMock.getAllAcls()).andReturn(testAcls);
-        //expect(aclManagerMock.getAllAcls()).andReturn(testAcls);
-        //expectGetAllAclsCall(authentication);
-        replay(aclStoreServiceMock);
-        List<PermissionTargetInfo> permissionTargets = service.getPermissionTargets(ArtifactoryPermission.MANAGE);
-        assertEquals(permissionTargets.size(), permissionTargets.size());
-        verify(aclStoreServiceMock);
-    }
-
-    @Test
-    public void getAllPermissionTargetsForUserWithNoPermission() {
-        setSimpleUserAuthentication("noadminpermissionsuser");
-
-        expectAclScan();
-
-        List<PermissionTargetInfo> permissionTargets = service.getPermissionTargets(ArtifactoryPermission.MANAGE);
-        assertEquals(permissionTargets.size(), 0);
-
-        verify(aclStoreServiceMock);
-    }
-
-    @Test(enabled = false)
-    public void getDeployPermissionTargetsForUserWithNoPermission() {
-        setSimpleUserAuthentication("user");
-
-        expectAclScan();
-
-        List<PermissionTargetInfo> targets = service.getPermissionTargets(ArtifactoryPermission.DEPLOY);
-        assertEquals(targets.size(), 0);
-
-        verify(aclStoreServiceMock);
-    }
-
-    @Test
-    public void getDeployPermissionTargetsForUserWithDeployPermission() {
-        setSimpleUserAuthentication("yossis");
-
-        expectAclScan();
-
-        List<PermissionTargetInfo> targets = service.getPermissionTargets(ArtifactoryPermission.DEPLOY);
-        assertEquals(targets.size(), 1, "Expecting one deploy permission");
-
-        verify(aclStoreServiceMock);
-    }
-
-    @Test
-    public void userPasswordMatches() {
-        setSimpleUserAuthentication("user");
-
-        assertTrue(service.userPasswordMatches("password"));
-        assertFalse(service.userPasswordMatches(""));
-        assertFalse(service.userPasswordMatches("Password"));
-        assertFalse(service.userPasswordMatches("blabla"));
-    }
-
-    @Test
-    public void permissionOnRemoteRoot() {
-        Authentication authentication = setSimpleUserAuthentication();
-
-        expect(repositoryServiceMock.repositoryByKey("testRemote")).andReturn(createRemoteRepoMock()).anyTimes();
-        expect(repositoryServiceMock.localOrCachedRepositoryByKey("testRemote-cache")).andReturn(null).anyTimes();
-        expect(repositoryServiceMock.remoteRepoDescriptorByKey("testRemote-cache")).andReturn(null).anyTimes();
-        replay(repositoryServiceMock);
-
-        // cannot read the specified path
-        expectGetAllAclsCall(authentication);
-        replay(aclStoreServiceMock);
-        boolean hasPermissionOnRemoteRoot = service.userHasPermissionsOnRepositoryRoot("testRemote");
-        assertTrue(hasPermissionOnRemoteRoot, "User should have permissions for this path");
-        verify(aclStoreServiceMock, repositoryServiceMock);
-        reset(aclStoreServiceMock, repositoryServiceMock);
-    }
-
-    @Test(dependsOnMethods = {"permissionOnRemoteRoot"},
-            expectedExceptions = {InvalidNameException.class})
-    protected void findOrCreateExternalAuthUserWithIllegalChars() {
-        reset(userGroupStoreService);
-        String userName = new String(NameValidator.getForbiddenChars());
-        expect(userGroupStoreService.findUser(userName)).andReturn(null).anyTimes();
-        replay(userGroupStoreService);
-        service.findOrCreateExternalAuthUser(userName, false);
-    }
-
-    public void testUserHasPermissions() {
-        SimpleUser user = createNonAdminUser("noperm");
-        reset(userGroupStoreService);
-        expect(userGroupStoreService.findUser("noperm")).andReturn(user.getDescriptor()).once();
-
-        expectGetAllAclsCallWithAnyArray();
-        replay(aclStoreServiceMock, userGroupStoreService);
-        boolean hasPermissions = service.userHasPermissions("noperm");
-        assertFalse(hasPermissions, "User should not have permissions");
-        verify(aclStoreServiceMock, userGroupStoreService);
-        reset(aclStoreServiceMock, userGroupStoreService);
-    }
-
-    public void testUserHasPermissionsFromGroup() {
-        SimpleUser user = createNonAdminUser("noperm", userAndGroupSharedName);
-        reset(userGroupStoreService);
-        expect(userGroupStoreService.findUser("noperm")).andReturn(user.getDescriptor()).once();
-
-        expectGetAllAclsCallWithAnyArray();
-        replay(aclStoreServiceMock, userGroupStoreService);
-        boolean hasPermissions = service.userHasPermissions("noperm");
-        assertTrue(hasPermissions, "User should have permissions for this path");
-        verify(aclStoreServiceMock, userGroupStoreService);
-        reset(aclStoreServiceMock, userGroupStoreService);
-    }
-
-    public void userReadAndDeployPermissionsOnAnyRemote() {
-        final Authentication authentication = setSimpleUserAuthentication();
-
-        // can read the specified path
-        RepoPath securedPath = InternalRepoPathFactory.create("repo1-cache", "blabla");
-        expect(repositoryServiceMock.localOrCachedRepositoryByKey(securedPath.getRepoKey()))
-                .andReturn(cacheRepoMock).anyTimes();
-        expect(repositoryServiceMock.remoteRepoDescriptorByKey("repo1-cache")).andReturn(null).anyTimes();
-        expect(aclStoreServiceMock.getAllAcls()).andReturn(createAnyRemotelAcl());
-
-        verifyAnyRemoteOrAnyLocal(authentication, securedPath);
-    }
-
-    public void userReadAndDeployPermissionsOnAnyLocal() {
-        Authentication authentication = setSimpleUserAuthentication();
-
-        // can read the specified path
-        RepoPath securedPath = InternalRepoPathFactory.create("local-repo", "mama");
-        expect(repositoryServiceMock.localOrCachedRepositoryByKey(securedPath.getRepoKey()))
-                .andReturn(localRepoMock).anyTimes();
-        expect(repositoryServiceMock.remoteRepoDescriptorByKey("local-repo")).andReturn(null).anyTimes();
-        expect(repositoryServiceMock.remoteRepoDescriptorByKey("testRepo1")).andReturn(null).anyTimes();
-        expect(aclStoreServiceMock.getAllAcls()).andReturn(createAnyLocalAcl());
-
-        verifyAnyRemoteOrAnyLocal(authentication, securedPath);
-    }
-
-    public void updateLastLoginWithNotExistingUserTest() throws InterruptedException {
-        // Make sure that if the user doesn't exists we stop the "updateLastLogin" process without  exception
-        reset(userGroupStoreService);
-        // Enable the update last login process "userLastAccessUpdatesResolutionSecs" must be greater or equals to "1"
-        getBound().setProperty(ConstantValues.userLastAccessUpdatesResolutionSecs, "1");
-        expect(userGroupStoreService.findUser("user")).andReturn(null).once();
-        replay(userGroupStoreService);
-        service.updateUserLastLogin("user", "momo", System.currentTimeMillis() + 1000);
-        verify(userGroupStoreService);
-        reset(userGroupStoreService);
-    }
-
-    public void testUserLastLoginTimeUpdateBuffer() throws InterruptedException {
-        getBound().setProperty(ConstantValues.userLastAccessUpdatesResolutionSecs, "0");
-        service.updateUserLastLogin("user", "momo", System.currentTimeMillis());
-        getBound().setProperty(ConstantValues.userLastAccessUpdatesResolutionSecs,
-                ConstantValues.userLastAccessUpdatesResolutionSecs.getDefValue());
-
-        MutableUserInfo user = new UserInfoBuilder("user").build();
-        user.setLastLoginTimeMillis(0);
-
-        //Simulate No existing last login, expect an update
-        expect(userGroupStoreService.findUser("user")).andReturn(user).once();
-        userGroupStoreService.updateUser(user);
-        EasyMock.expectLastCall();
-        replay(userGroupStoreService);
-        service.updateUserLastLogin("user", "momo", System.currentTimeMillis());
-
-        //Give a last login from the near past, expect no update
-        long nearPastLogin = System.currentTimeMillis();
-
-        verify(userGroupStoreService);
-        reset(userGroupStoreService);
-        user = new UserInfoBuilder("user").build();
-        user.setLastLoginTimeMillis(nearPastLogin);
-        expect(userGroupStoreService.findUser("user")).andReturn(user).once();
-        replay(userGroupStoreService);
-        service.updateUserLastLogin("user", "momo", nearPastLogin + 100l);
-
-        //Give a last login from the future, expect an update
-        verify(userGroupStoreService);
-        reset(userGroupStoreService);
-        expect(userGroupStoreService.findUser("user")).andReturn(user).once();
-        userGroupStoreService.updateUser(user);
-        EasyMock.expectLastCall();
-        replay(userGroupStoreService);
-        service.updateUserLastLogin("user", "momo", System.currentTimeMillis() + 6000l);
-    }
-
-    public void testSelectiveReload() {
-        TreeSet<SecurityListener> securityListeners = new TreeSet<>();
-        securityListeners.add(securityListenerMock);
-        ReflectionTestUtils.setField(service, "securityListeners", securityListeners);
-        reset(securityListenerMock);
-        securityListenerMock.onClearSecurity();
-        expect(securityListenerMock.compareTo(securityListenerMock)).andReturn(0).anyTimes();
-        replay(securityListenerMock);
-
-        SecurityDescriptor newSecurityDescriptor = new SecurityDescriptor();
-        SecurityDescriptor oldSecurityDescriptor = new SecurityDescriptor();
-        oldSecurityDescriptor.addLdap(new LdapSetting());
-
-        CentralConfigDescriptor newConfigDescriptor = createMock(CentralConfigDescriptor.class);
-        expect(newConfigDescriptor.getSecurity()).andReturn(newSecurityDescriptor).anyTimes();
-        replay(newConfigDescriptor);
-
-        CentralConfigDescriptor oldConfigDescriptor = createMock(CentralConfigDescriptor.class);
-        expect(oldConfigDescriptor.getSecurity()).andReturn(oldSecurityDescriptor).anyTimes();
-        replay(oldConfigDescriptor);
-
-        expect(centralConfigServiceMock.getDescriptor()).andReturn(newConfigDescriptor).anyTimes();
-        replay(centralConfigServiceMock);
-
-        service.reload(oldConfigDescriptor);
-        verify(securityListenerMock);
-
-        // The security conf is the same, so onClearSecurity should NOT be called
-        service.reload(newConfigDescriptor);
-        verify(securityListenerMock);
-        ReflectionTestUtils.setField(service, "securityListeners", null);
-    }
-
-    private void verifyAnyRemoteOrAnyLocal(Authentication authentication, RepoPath securedPath) {
-        replay(aclStoreServiceMock, repositoryServiceMock);
-        boolean canRead = service.canRead(securedPath);
-        assertTrue(canRead, "User should have permissions for this path");
-        verify(aclStoreServiceMock);
-        reset(aclStoreServiceMock);
-
-        // can deploy to the specified path
-        expectGetAllAclsCall(authentication);
-        replay(aclStoreServiceMock);
-
-        boolean canDeploy = service.canDeploy(securedPath);
-        assertFalse(canDeploy, "User should have permissions for this path");
-        verify(aclStoreServiceMock, repositoryServiceMock);
-        reset(aclStoreServiceMock, repositoryServiceMock);
-
-        RepoPath allowedReadPath = InternalRepoPathFactory.create("testRepo1", "blabla");
-        expect(repositoryServiceMock.localOrCachedRepositoryByKey(allowedReadPath.getRepoKey()))
-                .andReturn(localRepoMock).anyTimes();
-        expect(repositoryServiceMock.remoteRepoDescriptorByKey("testRepo1")).andReturn(null).anyTimes();
-        replay(repositoryServiceMock);
-
-        // can read the specified path
-        expectGetAllAclsCall(authentication);
-        replay(aclStoreServiceMock);
-        canRead = service.canRead(allowedReadPath);
-        assertTrue(canRead, "User should have read permissions for this path");
-        verify(aclStoreServiceMock);
-        reset(aclStoreServiceMock);
-
-        // cannot deploy to the specified path
-        expectGetAllAclsCall(authentication);
-        replay(aclStoreServiceMock);
-        canDeploy = service.canDeploy(allowedReadPath);
-        assertFalse(canDeploy, "User should not have permissions for this path");
-        verify(aclStoreServiceMock, repositoryServiceMock);
-        reset(aclStoreServiceMock);
-
-        // cannot admin the specified path
-        expectGetAllAclsCall(authentication);
-        replay(aclStoreServiceMock);
-        boolean canAdmin = service.canManage(allowedReadPath);
-        assertFalse(canAdmin, "User should not have permissions for this path");
-        verify(aclStoreServiceMock);
-    }
-
-    private void expectAclScan() {
-        expect(aclStoreServiceMock.getAllAcls()).andReturn(testAcls).anyTimes();
-        /*
-        expect(aclStoreServiceMock.getAcl(permissionTargets.get(0).getName())).andReturn(testAcls.get(0));
-        expect(aclStoreServiceMock.getAcl(permissionTargets.get(1).getName())).andReturn(testAcls.get(1));
-        expect(aclStoreServiceMock.getAcl(permissionTargets.get(2).getName())).andReturn(testAcls.get(2));
-        expect(aclStoreServiceMock.getAcl(permissionTargets.get(3).getName())).andReturn(testAcls.get(3));
-        expect(aclStoreServiceMock.getAcl(permissionTargets.get(4).getName())).andReturn(testAcls.get(4));
-        */
-        replay(aclStoreServiceMock);
-    }
-
-    private void expectGetAllAclsCall(Authentication authentication) {
-        expect(aclStoreServiceMock.getAllAcls()).andReturn(testAcls).anyTimes();
-    }
-
-    private void expectGetAllAclsCallWithAnyArray() {
-        expect(aclStoreServiceMock.getAllAcls()).andReturn(testAcls);
-    }
-
-    private List<AclInfo> createTestAcls() {
-        userAndGroupSharedName = "usergroup";
-        PermissionTargetInfo pmi = InfoFactoryHolder.get().createPermissionTarget("target1",
-                Arrays.asList("testRepo1", "testRemote-cache"));
-        // yossis has all the permissions (when all permissions are checked)
-        MutableAceInfo adminAce = factory.createAce("yossis", false, ArtifactoryPermission.MANAGE.getMask());
-        adminAce.setDeploy(true);
-        adminAce.setRead(true);
-        MutableAceInfo readerAce = factory.createAce("user", false, ArtifactoryPermission.READ.getMask());
-        MutableAceInfo deleteAce = factory.createAce("shay", false, ArtifactoryPermission.DELETE.getMask());
-        deleteAce.setDeploy(true);
-        deleteAce.setAnnotate(true);
-        deleteAce.setRead(true);
-        MutableAceInfo userGroupAce =
-                factory.createAce(userAndGroupSharedName, false, ArtifactoryPermission.READ.getMask());
-        MutableAceInfo deployerGroupAce =
-                factory.createAce("deployGroup", true, ArtifactoryPermission.DEPLOY.getMask());
-        Set<AceInfo> aces = new HashSet<AceInfo>(
-                Arrays.asList(adminAce, readerAce, userGroupAce, deployerGroupAce));
-        AclInfo aclInfo = factory.createAcl(pmi, aces, "me");
-
-        PermissionTargetInfo pmi2 = InfoFactoryHolder.get().createPermissionTarget("target2",
-                Arrays.asList("testRepo2"));
-        MutableAceInfo target2GroupAce = factory.createAce(userAndGroupSharedName, true,
-                ArtifactoryPermission.READ.getMask());
-        Set<AceInfo> target2Aces = new HashSet<AceInfo>(Arrays.asList(target2GroupAce));
-        AclInfo aclInfo2 = factory.createAcl(pmi2, target2Aces, "me");
-
-        // acl for any repository with read permissions to group
-        PermissionTargetInfo anyTarget = InfoFactoryHolder.get().createPermissionTarget("anyRepoTarget",
-                Arrays.asList(PermissionTargetInfo.ANY_REPO));
-        MutableAceInfo readerGroupAce =
-                factory.createAce("anyRepoReadersGroup", true, ArtifactoryPermission.READ.getMask());
-        Set<AceInfo> anyTargetAces = new HashSet<AceInfo>(Arrays.asList(readerGroupAce));
-        AclInfo anyTargetAcl = factory.createAcl(anyTarget, anyTargetAces, "me");
-
-        // acl with multiple repo keys with read permissions to group and anonymous
-        PermissionTargetInfo multiReposTarget = InfoFactoryHolder.get().createPermissionTarget("multiRepoTarget",
-                Arrays.asList("multi1", "multi2"));
-        MutableAceInfo multiReaderGroupAce =
-                factory.createAce("multiRepoReadersGroup", true, ArtifactoryPermission.READ.getMask());
-        MutableAceInfo multiReaderAnonAce =
-                factory.createAce(UserInfo.ANONYMOUS, false, ArtifactoryPermission.READ.getMask());
-        Set<AceInfo> multiTargetAces = new HashSet<AceInfo>(Arrays.asList(multiReaderGroupAce, multiReaderAnonAce));
-        AclInfo multiReposAcl = factory.createAcl(multiReposTarget, multiTargetAces, "me");
-
-        // acl for any repository with specific path delete permissions to user
-        MutablePermissionTargetInfo anyRepoSpecificPathTarget = InfoFactoryHolder.get().createPermissionTarget(
-                "anyRepoSpecificPathTarget",
-                Arrays.asList("specific-repo"));
-        anyRepoSpecificPathTarget.setIncludes(Arrays.asList("com/acme/**"));
-        Set<AceInfo> specificDeleteAces = new HashSet<AceInfo>(Arrays.asList(deleteAce));
-        AclInfo allReposSpecificPathAcl = factory.createAcl(anyRepoSpecificPathTarget, specificDeleteAces, "me");
-
-        return Arrays.asList(aclInfo, aclInfo2, anyTargetAcl, multiReposAcl, allReposSpecificPathAcl);
-    }
-
-    private List<AclInfo> createAnyRemotelAcl() {
-        PermissionTargetInfo pmi = InfoFactoryHolder.get().createPermissionTarget("target1",
-                Arrays.asList(PermissionTargetInfo.ANY_REMOTE_REPO));
-        MutableAceInfo readerAndDeployer = factory.createAce("user", false,
-                ArtifactoryPermission.READ.getMask() | ArtifactoryPermission.DEPLOY.getMask());
-        Set<AceInfo> aces = new HashSet<AceInfo>(Arrays.asList(readerAndDeployer));
-        AclInfo aclInfo = factory.createAcl(pmi, aces, "me");
-
-        return Arrays.asList(aclInfo);
-    }
-
-    private List<AclInfo> createAnyLocalAcl() {
-        PermissionTargetInfo pmi = InfoFactoryHolder.get().createPermissionTarget("target1",
-                Arrays.asList(PermissionTargetInfo.ANY_LOCAL_REPO));
-        MutableAceInfo readerAndDeployer = factory.createAce("user", false,
-                ArtifactoryPermission.READ.getMask() | ArtifactoryPermission.DEPLOY.getMask());
-        Set<AceInfo> aces = new HashSet<AceInfo>(Arrays.asList(readerAndDeployer));
-        AclInfo aclInfo = factory.createAcl(pmi, aces, "me");
-
-        return Arrays.asList(aclInfo);
-    }
-
-    private Authentication setAdminAuthentication() {
-        SimpleUser adminUser = createAdminUser();
-        UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(
-                adminUser, null, SimpleUser.ADMIN_GAS);
-        securityContext.setAuthentication(authenticationToken);
-        return authenticationToken;
-    }
-
-    private Authentication setSimpleUserAuthentication() {
-        return setSimpleUserAuthentication("user");
-    }
-
-    private Authentication setSimpleUserAuthentication(String username, String... groups) {
-        SimpleUser simpleUser = createNonAdminUser(username, groups);
-        UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(
-                simpleUser, "password", SimpleUser.USER_GAS);
-        securityContext.setAuthentication(authenticationToken);
-        return authenticationToken;
-    }
-
-    private static SimpleUser createNonAdminUser(String username, String... groups) {
-        UserInfo userInfo = new UserInfoBuilder(username).updatableProfile(true)
-                .internalGroups(new HashSet<String>(Arrays.asList(groups))).build();
-        return new SimpleUser(userInfo);
-    }
-
-    private static SimpleUser createAdminUser() {
-        UserInfo userInfo = new UserInfoBuilder("spiderman").admin(true).updatableProfile(true).build();
-        return new SimpleUser(userInfo);
-    }
-
-    private static LocalRepo createLocalRepoMock() {
-        LocalRepo localRepo = createMock(LocalRepo.class);
-        expect(localRepo.isLocal()).andReturn(true).anyTimes();
-        expect(localRepo.isCache()).andReturn(false).anyTimes();
-        replay(localRepo);
-        return localRepo;
-    }
-
-    private static LocalRepo createCacheRepoMock() {
-        LocalRepo localRepo = createMock(LocalRepo.class);
-        expect(localRepo.isLocal()).andReturn(true).anyTimes();
-        expect(localRepo.isCache()).andReturn(true).anyTimes();
-        replay(localRepo);
-        return localRepo;
-    }
-
-    private RemoteRepo createRemoteRepoMock() {
-        RemoteRepo remoteRepo = createMock(RemoteRepo.class);
-        expect(remoteRepo.isReal()).andReturn(true).anyTimes();
-        replay(remoteRepo);
-        return remoteRepo;
-    }
-
-    private InternalRepositoryService createRepoServiceMock() {
-        InternalRepositoryService repositoryService = createMock(InternalRepositoryService.class);
-        //expect(repositoryService.getGlobalVirtualRepo()).andReturn(globalVirtualRepoMock).anyTimes();
-        //expect(repositoryService.remoteRepoDescriptorByKey("testRepo1")).andReturn(new HttpRepoDescriptor()).anyTimes();
-        replay(repositoryService);
-        return repositoryService;
-    }
-
-    @Test(
-            expectedExceptions = {PasswordChangeException.class},
-            expectedExceptionsMessageRegExp = "Changing password has failed: Old password is incorrect"
-    )
-    private void changePasswordUsingIncorrectOldPassword() {
-
-        SaltedPassword sp = new SaltedPassword("foo", "salt");
-
-        UserInfo user = new UserImpl() {{
-            setUsername("test");
-            setUpdatableProfile(true);
-            setPassword(sp);
-        }};
-
-        expect(userGroupStoreService.findUser("test")).andReturn(user).anyTimes();
-
-        MutableCentralConfigDescriptor mutableCentralConfigDescriptor = createMock(MutableCentralConfigDescriptor.class);
-        PasswordExpirationPolicy expirationPolicy = new PasswordExpirationPolicy();
-        expirationPolicy.setEnabled(Boolean.TRUE);
-
-        SecurityDescriptor securityDescriptor = new SecurityDescriptor();
-        securityDescriptor.setPasswordSettings(new PasswordSettings(){{setExpirationPolicy(expirationPolicy);}});
-
-        expect(centralConfigServiceMock.getDescriptor()).andReturn(mutableCentralConfigDescriptor).anyTimes();
-        expect(centralConfigServiceMock.getMutableDescriptor()).andReturn(mutableCentralConfigDescriptor).anyTimes();
-        expect(mutableCentralConfigDescriptor.getSecurity()).andReturn(securityDescriptor).anyTimes();
-        expect(userGroupStoreService.getNextLogin("test")).andReturn(-1l).anyTimes();
-        userGroupStoreService.registerIncorrectLoginAttempt("test");
-        EasyMock.expectLastCall();
-        replay(userGroupStoreService, mutableCentralConfigDescriptor, centralConfigServiceMock);
-
-        service.changePassword("test", "bar", "pass", "pass");
-    }
-
-    @Test(
-            dependsOnMethods = {"changePasswordUsingIncorrectOldPassword"},
-            expectedExceptions = {PasswordChangeException.class},
-            expectedExceptionsMessageRegExp = "Changing password has failed: User test is Locked.\n" +
-                    "Contact System Administrator to Unlock The Account."
-    )
-    private void changePasswordForLockedOutUserTest() {
-        SaltedPassword sp = new SaltedPassword("foo", "salt");
-
-        UserInfo user = new UserImpl() {{
-            setUsername("test");
-            setUpdatableProfile(true);
-            setPassword(sp);
-        }};
-
-        expect(userGroupStoreService.findUser("test")).andReturn(user).anyTimes();
-
-        MutableCentralConfigDescriptor mutableCentralConfigDescriptor = createMock(MutableCentralConfigDescriptor.class);
-        PasswordExpirationPolicy expirationPolicy = new PasswordExpirationPolicy();
-        expirationPolicy.setEnabled(Boolean.TRUE);
-
-        SecurityDescriptor securityDescriptor = new SecurityDescriptor();
-        securityDescriptor.setPasswordSettings(new PasswordSettings(){{
-            setExpirationPolicy(expirationPolicy);}});
-
-        UserLockPolicy userLockPolicy = new UserLockPolicy() {{
-            setEnabled(Boolean.TRUE);
-            setLoginAttempts(1);
-        }};
-        securityDescriptor.setUserLockPolicy(userLockPolicy);
-
-        expect(centralConfigServiceMock.getDescriptor()).andReturn(mutableCentralConfigDescriptor).anyTimes();
-        expect(centralConfigServiceMock.getMutableDescriptor()).andReturn(mutableCentralConfigDescriptor).anyTimes();
-        expect(mutableCentralConfigDescriptor.getSecurity()).andReturn(securityDescriptor).anyTimes();
-        expect(userGroupStoreService.isUserLocked("test")).andReturn(true);
-        replay(userGroupStoreService, mutableCentralConfigDescriptor, centralConfigServiceMock);
-
-        service.changePassword("test", "bar", "pass", "pass");
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/security/StoragePropertiesEncryptInterceptorTest.java b/backend/core/src/test/java/org/artifactory/security/StoragePropertiesEncryptInterceptorTest.java
deleted file mode 100644
index 350dd01..0000000
--- a/backend/core/src/test/java/org/artifactory/security/StoragePropertiesEncryptInterceptorTest.java
+++ /dev/null
@@ -1,115 +0,0 @@
-package org.artifactory.security;
-
-import org.apache.commons.io.FileUtils;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ArtifactoryContextThreadBinder;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.security.interceptor.StoragePropertiesEncryptInterceptor;
-import org.artifactory.storage.StorageProperties;
-import org.artifactory.util.ResourceUtils;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-
-/**
- * @author Gidi Shabat
- */
- at Test
-public class StoragePropertiesEncryptInterceptorTest {
-
-    /**
-     * Emulates Artifactory environment
-     */
-    @BeforeClass
-    public void init() throws IOException {
-        //TODO: [by YS] We need to add functionality to the ArtifactoryHomeBoundTest to support storage.properties
-        // Create Artifactory home and bind it to the thread
-        File home = new File("target/test/StoragePropertiesEncryptInterceptorTest");
-        ArtifactoryHome.bind(new ArtifactoryHome(home));
-        // Create mock ArtifactoryContext using Proxy and invocation handler
-        TestInvocationHandler handler = new TestInvocationHandler();
-        ArtifactoryContext context = proxy(ArtifactoryContext.class, handler);
-        ArtifactoryContextThreadBinder.bind(context);
-        File storageProperties = ResourceUtils.getResourceAsFile("/org/artifactory/security/storage.properties");
-        FileUtils.copyFile(storageProperties, ArtifactoryHome.get().getStoragePropertiesFile());
-        String keyFileLocation = ConstantValues.securityMasterKeyLocation.getString();
-        File keyFile = new File(ArtifactoryHome.get().getEtcDir(), keyFileLocation);
-        //noinspection ResultOfMethodCallIgnored
-        keyFile.delete();
-        CryptoHelper.createMasterKeyFile();
-    }
-
-    @Test()
-    public void encryptTest() throws IOException {
-        StoragePropertiesEncryptInterceptor interceptor = new StoragePropertiesEncryptInterceptor();
-        interceptor.encryptOrDecryptStoragePropertiesFile(true);
-        StorageProperties storageProperties = new StorageProperties(ArtifactoryHome.get().getStoragePropertiesFile());
-        // Check the password
-        String password = storageProperties.getProperty("password", null);
-        Assert.assertNotEquals(password, "test1");
-        password = storageProperties.getPassword();
-        Assert.assertEquals(password, "test1");
-        // Check the credentials
-        String credentials = storageProperties.getProperty("binary.provider.s3.credential", null);
-        Assert.assertNotEquals(credentials, "test2");
-        credentials = storageProperties.getS3Credential();
-        Assert.assertEquals(credentials, "test2");
-        // Check proxy credential
-        String proxyCredentials = storageProperties.getProperty("binary.provider.s3.proxy.credential", null);
-        Assert.assertNotEquals(proxyCredentials, "test3");
-        proxyCredentials = storageProperties.getS3ProxyCredential();
-        Assert.assertEquals(proxyCredentials, "test3");
-        // Check the url
-        String url = storageProperties.getConnectionUrl();
-        Assert.assertEquals(url, "jdbc:derby:{db.home};create=true");
-    }
-
-    @Test(dependsOnMethods = "encryptTest")
-    public void decryptTest() throws IOException {
-        StoragePropertiesEncryptInterceptor interceptor = new StoragePropertiesEncryptInterceptor();
-        interceptor.encryptOrDecryptStoragePropertiesFile(false);
-        StorageProperties storageProperties = new StorageProperties(ArtifactoryHome.get().getStoragePropertiesFile());
-        // Check the password
-        String password = storageProperties.getProperty("password", null);
-        Assert.assertEquals(password, "test1");
-        // Check the credentials
-        String credentials = storageProperties.getProperty("binary.provider.s3.credential", null);
-        Assert.assertEquals(credentials, "test2");
-        // Check the proxy credentials
-        String proxyCredentials = storageProperties.getProperty("binary.provider.s3.proxy.credential", null);
-        Assert.assertEquals(proxyCredentials, "test3");
-        // Check the url
-        String url = storageProperties.getConnectionUrl();
-        Assert.assertEquals(url, "jdbc:derby:{db.home};create=true");
-    }
-
-    public class TestInvocationHandler implements InvocationHandler {
-        public int count = 0;
-
-        @Override
-        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
-            if ("getArtifactoryHome".equals(method.getName())) {
-                return ArtifactoryHome.get();
-            }
-            if ("beanForType".equals(method.getName()) && ((Class) args[0]).getName().equals(
-                    StorageProperties.class.getName())) {
-                return new StorageProperties(ArtifactoryHome.get().getStoragePropertiesFile());
-            }
-            throw new IllegalStateException("The state is not expected in this test: " + method.getName());
-        }
-    }
-
-    public static <T> T proxy(Class<T> interfaceClass, InvocationHandler handler) {
-        Class[] interfaces = {interfaceClass};
-        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-        return (T) Proxy.newProxyInstance(classLoader, interfaces, handler);
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/security/ssh/ArtifactoryCommandFactorySpec.groovy b/backend/core/src/test/java/org/artifactory/security/ssh/ArtifactoryCommandFactorySpec.groovy
deleted file mode 100644
index 479846c..0000000
--- a/backend/core/src/test/java/org/artifactory/security/ssh/ArtifactoryCommandFactorySpec.groovy
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.artifactory.security.ssh
-
-import org.apache.sshd.server.Command
-import org.apache.sshd.server.command.UnknownCommand
-import org.artifactory.addon.gitlfs.GitLfsAddon
-import org.artifactory.api.context.ContextHelper
-import spock.lang.Specification
-
-/**
- * @author Noam Y. Tenne
- */
-class ArtifactoryCommandFactorySpec extends Specification {
-
-    def 'Create an LFS command'() {
-        setup:
-        def commandFactory = new ArtifactoryCommandFactory(null, null)
-
-        when:
-        Command command = commandFactory.createCommand(GitLfsAuthenticateCommand.COMMAND_NAME +
-                " artifactory/jim upload 46eb912dc29d5000f4412f329c1a1a22400bead03a07491e77e33cdfe923fa76")
-
-        then:
-        GitLfsAddon gitLfsAddon = ContextHelper.get().beanForType(GitLfsAddon.class)
-
-        // command instanceof GitLfsAuthenticateCommand
-    }
-
-    def 'Create an unknown command'() {
-        setup:
-        def commandFactory = new ArtifactoryCommandFactory(null, null)
-
-        when:
-        Command command = commandFactory.createCommand('git-lfs-unkown-command')
-
-        then:
-        command instanceof UnknownCommand
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/security/ssh/PublicKeyAuthenticatorSpec.groovy b/backend/core/src/test/java/org/artifactory/security/ssh/PublicKeyAuthenticatorSpec.groovy
deleted file mode 100644
index eb7f62d..0000000
--- a/backend/core/src/test/java/org/artifactory/security/ssh/PublicKeyAuthenticatorSpec.groovy
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.artifactory.security.ssh
-
-import org.apache.sshd.server.session.ServerSession
-import org.artifactory.api.security.UserInfoBuilder
-import org.artifactory.storage.security.service.UserGroupStoreService
-import org.bouncycastle.jcajce.provider.asymmetric.rsa.BCRSAPublicKey
-import spock.lang.Specification
-
-import java.security.spec.RSAPublicKeySpec
-
-/**
- * @author Noam Y. Tenne
- */
-class PublicKeyAuthenticatorSpec extends Specification {
-
-    def 'Authenticate public key'() {
-        def userGroupStoreService = Mock(UserGroupStoreService)
-        def serverSession = Mock(ServerSession)
-        def authenticator = new PublicKeyAuthenticator(userGroupStoreService)
-
-        def publicKey = new BCRSAPublicKey(new RSAPublicKeySpec(1.toBigInteger(), 3.toBigInteger()));
-
-        when:
-        def result = authenticator.authenticate('git', publicKey, serverSession)
-
-        then:
-        result
-        1 * userGroupStoreService.findUserByProperty('sshPublicKey', 'ssh-rsa AAAAB3NzaC1yc2EAAAABAwAAAAEB') >> {
-            return new UserInfoBuilder('jim').build()
-        }
-        1 * serverSession.setAttribute(_ as UsernameAttributeKey, 'jim')
-    }
-
-    def 'Authenticate public key and find no user '() {
-        def userGroupStoreService = Mock(UserGroupStoreService)
-        def serverSession = Mock(ServerSession)
-        def authenticator = new PublicKeyAuthenticator(userGroupStoreService)
-
-        def publicKey = new BCRSAPublicKey(new RSAPublicKeySpec(1.toBigInteger(), 3.toBigInteger()));
-
-        when:
-        def result = authenticator.authenticate('git', publicKey, serverSession)
-
-        then:
-        !result
-        1 * userGroupStoreService.findUserByProperty('sshPublicKey', 'ssh-rsa AAAAB3NzaC1yc2EAAAABAwAAAAEB') >> {
-            return null
-        }
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/security/ssh/SshAuthServiceImplTest.java b/backend/core/src/test/java/org/artifactory/security/ssh/SshAuthServiceImplTest.java
deleted file mode 100644
index 3283229..0000000
--- a/backend/core/src/test/java/org/artifactory/security/ssh/SshAuthServiceImplTest.java
+++ /dev/null
@@ -1,221 +0,0 @@
-package org.artifactory.security.ssh;
-
-import org.apache.sshd.ClientChannel;
-import org.apache.sshd.ClientSession;
-import org.apache.sshd.SshClient;
-import org.apache.sshd.client.channel.ChannelExec;
-import org.apache.sshd.client.channel.ChannelShell;
-import org.apache.sshd.client.future.AuthFuture;
-import org.apache.sshd.client.future.ConnectFuture;
-import org.apache.sshd.client.future.OpenFuture;
-import org.apache.sshd.client.keyverifier.AcceptAllServerKeyVerifier;
-import org.apache.sshd.common.KeyExchange;
-import org.apache.sshd.common.NamedFactory;
-import org.apache.sshd.common.SshConstants;
-import org.apache.sshd.common.forward.DefaultTcpipForwarderFactory;
-import org.apache.sshd.common.keyprovider.FileKeyPairProvider;
-import org.apache.sshd.common.random.BouncyCastleRandom;
-import org.apache.sshd.common.random.SingletonRandomFactory;
-import org.apache.sshd.common.util.Buffer;
-import org.artifactory.api.security.UserInfoBuilder;
-import org.artifactory.config.InternalCentralConfigService;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.config.CentralConfigDescriptorImpl;
-import org.artifactory.descriptor.security.SecurityDescriptor;
-import org.artifactory.descriptor.security.sshserver.SshServerSettings;
-import org.artifactory.md.Properties;
-import org.artifactory.model.xstream.fs.PropertiesImpl;
-import org.artifactory.security.MutableUserInfo;
-import org.artifactory.security.UserInfo;
-import org.artifactory.storage.db.security.service.UserGroupServiceImpl;
-import org.artifactory.storage.security.service.UserGroupStoreService;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.artifactory.util.Files;
-import org.artifactory.util.ResourceUtils;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PipedInputStream;
-import java.io.PipedOutputStream;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.concurrent.TimeUnit;
-
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.testng.Assert.*;
-
-/**
- * @author Noam Y. Tenne
- */
-public class SshAuthServiceImplTest extends ArtifactoryHomeBoundTest {
-
-    SshAuthServiceImpl sshAuthService;
-
-    @BeforeClass
-    public void init() {
-        sshAuthService = new SshAuthServiceImpl();
-    }
-
-    @BeforeMethod
-    public void clearKeys() throws Exception {
-        sshAuthService.removePrivateKey();
-        sshAuthService.removePublicKey();
-    }
-
-    @AfterMethod
-    public void shutdown() throws Exception {
-        sshAuthService.destroy();
-    }
-
-    @Test(enabled = false)
-    public void installPublicKey() throws Exception {
-        assertFalse(sshAuthService.hasPublicKey());
-
-        sshAuthService.savePublicKey("key");
-        assertTrue(sshAuthService.hasPublicKey());
-
-        Path path = sshAuthService.getPublicKeyFile();
-        String keyContent = Files.readFileToString(path.toFile());
-        assertEquals("key", keyContent);
-        sshAuthService.removePublicKey();
-        assertFalse(sshAuthService.hasPublicKey());
-    }
-
-    @Test(enabled = false)
-    public void installPrivateKey() throws Exception {
-        assertFalse(sshAuthService.hasPrivateKey());
-
-        sshAuthService.savePrivateKey("privateKey");
-        assertTrue(sshAuthService.hasPrivateKey());
-
-        Path path = sshAuthService.getPrivateKeyFile();
-        String keyContent = Files.readFileToString(path.toFile());
-        assertEquals("privateKey", keyContent);
-        sshAuthService.removePrivateKey();
-        assertFalse(sshAuthService.hasPrivateKey());
-    }
-
-    @Test(enabled = false)
-    public void ssh() throws Exception {
-        prepareServiceForSsh();
-
-        SshClient sshClient = prepareClient();
-        ClientSession session = createSession(sshClient);
-
-        String string = "git-lfs-authenticate" +
-                " artifactory/jim upload 46eb912dc29d5000f4412f329c1a1a22400bead03a07491e77e33cdfe923fa76";
-
-        ClientChannel channel = session.createExecChannel(string);
-        ByteArrayOutputStream sent = new ByteArrayOutputStream();
-        PipedOutputStream pipedIn = new TeePipedOutputStream(sent);
-        channel.setIn(new PipedInputStream(pipedIn));
-        ByteArrayOutputStream out = new ByteArrayOutputStream();
-        ByteArrayOutputStream err = new ByteArrayOutputStream();
-        channel.setOut(out);
-        channel.setErr(err);
-        channel.open();
-        pipedIn.write(string.getBytes());
-        pipedIn.flush();
-        channel.waitFor(ClientChannel.CLOSED, 0);
-        channel.close(false);
-        sshClient.stop();
-
-        assertEquals("{\"header\":{\"Authorization\":\"Bearer meintoken\"},\"href\":\"http://127.0.0.1:8080/artifactory/api/lfs/jim\"}", out.toString());
-    }
-
-    private SshClient prepareClient() {
-        SshClient sshClient = SshClient.setUpDefaultClient();
-
-        String[] keys = new String[]{sshAuthService.getPrivateKeyFile().toAbsolutePath().toString(),
-                sshAuthService.getPublicKeyFile().toAbsolutePath().toString()};
-        sshClient.setKeyPairProvider(new FileKeyPairProvider(keys));
-
-        sshClient.start();
-        return sshClient;
-    }
-
-    private ClientSession createSession(SshClient sshClient) throws IOException, InterruptedException {
-        ConnectFuture connectFuture = sshClient.connect("git", "localhost", 1337);
-        assertTrue(connectFuture.await(5, TimeUnit.SECONDS), "Couldn't connect to the server");
-        ClientSession session = connectFuture.getSession();
-        AuthFuture authFuture = session.auth();
-        assertTrue(authFuture.await(500, TimeUnit.SECONDS), "Couldn't authenticate with the server");
-        return session;
-    }
-
-    private void prepareServiceForSsh() throws Exception {
-        installUserGroupStore();
-        installCentralConfig();
-        installKeys();
-        sshAuthService.init();
-    }
-
-    private void installUserGroupStore() {
-        MutableUserInfo jim = new UserInfoBuilder("jim").build();
-        UserGroupServiceImpl userGroupServiceImpl = createMock(UserGroupServiceImpl.class);
-        expect(userGroupServiceImpl.findUserByProperty("sshPublicKey", Files.readFileToString(
-                ResourceUtils.getResourceAsFile("/org/artifactory/security/ssh/id_rsa.pub")))).andReturn(
-                jim).anyTimes();
-        PropertiesImpl properties = new PropertiesImpl();
-        properties.put("basictoken", "meintoken");
-        expect(userGroupServiceImpl.findPropertiesForUser("jim")).andReturn(properties).anyTimes();
-        replay(userGroupServiceImpl);
-
-        sshAuthService.userGroupStoreService = userGroupServiceImpl;
-    }
-
-    private void installCentralConfig() {
-        SshServerSettings sshServerSettings = new SshServerSettings();
-        sshServerSettings.setEnableSshServer(true);
-        sshServerSettings.setSshServerPort(1337);
-
-        SecurityDescriptor securityDescriptor = new SecurityDescriptor();
-        securityDescriptor.setSshServerSettings(sshServerSettings);
-
-        CentralConfigDescriptorImpl configDescriptor = new CentralConfigDescriptorImpl();
-        configDescriptor.setSecurity(securityDescriptor);
-
-        InternalCentralConfigService centralConfigServiceMock = createMock(InternalCentralConfigService.class);
-        expect(centralConfigServiceMock.getDescriptor()).andReturn(configDescriptor).anyTimes();
-        replay(centralConfigServiceMock);
-
-        sshAuthService.centralConfigService = centralConfigServiceMock;
-    }
-
-    private void installKeys() throws Exception {
-        sshAuthService.savePrivateKey(
-                Files.readFileToString(ResourceUtils.getResourceAsFile("/org/artifactory/security/ssh/id_rsa")));
-        sshAuthService.savePublicKey(
-                Files.readFileToString(ResourceUtils.getResourceAsFile("/org/artifactory/security/ssh/id_rsa.pub")));
-    }
-
-    public class TeePipedOutputStream extends PipedOutputStream {
-
-        private OutputStream tee;
-
-        public TeePipedOutputStream(OutputStream tee) {
-            this.tee = tee;
-        }
-
-        @Override
-        public void write(int b) throws IOException {
-            super.write(b);
-            tee.write(b);
-        }
-
-        @Override
-        public void write(byte[] b, int off, int len) throws IOException {
-            super.write(b, off, len);
-            tee.write(b, off, len);
-        }
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/test/java/org/artifactory/test/mock/MockUtils.java b/backend/core/src/test/java/org/artifactory/test/mock/MockUtils.java
deleted file mode 100644
index e6ad458..0000000
--- a/backend/core/src/test/java/org/artifactory/test/mock/MockUtils.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.test.mock;
-
-import org.artifactory.api.context.ArtifactoryContextThreadBinder;
-import org.artifactory.spring.InternalArtifactoryContext;
-import org.easymock.EasyMock;
-
-/**
- * @author yoavl
- */
-public class MockUtils {
-
-    /**
-     * Remember to call EasyMock.replay() on the context!
-     */
-    public static InternalArtifactoryContext getThreadBoundedMockContext() {
-        InternalArtifactoryContext context = EasyMock.createMock(InternalArtifactoryContext.class);
-        EasyMock.expect(context.isReady()).andReturn(true).anyTimes();
-        EasyMock.expect(context.getClassLoader()).andReturn(
-                Thread.currentThread().getContextClassLoader()).anyTimes();
-        ArtifactoryContextThreadBinder.bind(context);
-        return context;
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/test/mock/SimpleMockServer.java b/backend/core/src/test/java/org/artifactory/test/mock/SimpleMockServer.java
deleted file mode 100644
index ec171e5..0000000
--- a/backend/core/src/test/java/org/artifactory/test/mock/SimpleMockServer.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.test.mock;
-
-import org.apache.commons.io.IOUtils;
-import org.artifactory.test.TestUtils;
-import org.eclipse.jetty.server.Connector;
-import org.eclipse.jetty.server.Handler;
-import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.handler.AbstractHandler;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * A simple mock server that just returns resources from the root path.
- *
- * @author Yossi Shaul
- */
-public class SimpleMockServer {
-
-    private Server server;
-    private Handler handler;
-
-    public SimpleMockServer() {
-        this(new SimpleMockHandler());
-    }
-
-    public SimpleMockServer(Handler handler) {
-        this.handler = handler;
-    }
-
-    public void start() {
-        try {
-            this.server = new Server(0);
-            server.setHandler(handler);
-            server.start();
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    public void setHandler(Handler handler) {
-        server.setHandler(handler);
-    }
-
-    public void stop() {
-        try {
-            server.stop();
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    public int getPort() {
-        Connector connector = server.getConnectors()[0];
-        return connector.getLocalPort() <= 0 ? connector.getPort() : connector.getLocalPort();
-    }
-
-    public String getBaseUrl() {
-        Connector connector = server.getConnectors()[0];
-        return "http://" + TestUtils.extractHost(connector.getHost()) + ":" + getPort() + "/";
-    }
-
-    private static class SimpleMockHandler extends AbstractHandler {
-        @Override
-        public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
-                throws IOException, ServletException {
-            InputStream resource = SimpleMockServer.class.getResourceAsStream(target);
-            if (resource == null) {
-                response.setStatus(HttpServletResponse.SC_NOT_FOUND);
-            } else {
-                IOUtils.copy(resource, response.getOutputStream());
-            }
-            baseRequest.setHandled(true);
-        }
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/util/FilePathMatcherTest.java b/backend/core/src/test/java/org/artifactory/util/FilePathMatcherTest.java
deleted file mode 100644
index f399082..0000000
--- a/backend/core/src/test/java/org/artifactory/util/FilePathMatcherTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.artifactory.util;
-
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-/**
- * GlobalExcludes unit tests.
- *
- * @author Gidi Shabat
- */
- at Test
-public class FilePathMatcherTest extends ArtifactoryHomeBoundTest {
-
-    @Test
-    public void globalExcludes() {
-        File file = new File("/work/tmp/t2/20080810.145407/repositories/repo1-cache/.DS_Store");
-        assertTrue(GlobalExcludes.isInGlobalExcludes(file));
-        assertFalse(GlobalExcludes.matches(file, null, GlobalExcludes.getGlobalExcludes()));
-        file = new File("/repo1-cache/test~");
-        assertTrue(GlobalExcludes.isInGlobalExcludes(file));
-        assertFalse(GlobalExcludes.matches(file, null, GlobalExcludes.getGlobalExcludes()));
-        // RTFACT-5394 -  Make sure global excludes doesn't check match start
-        File shortFileName = new File("/t");
-        assertFalse(GlobalExcludes.isInGlobalExcludes(shortFileName));
-        // Make sure that global excludes, exclude CVS directories.
-        File cvsFile = new File("/toto/CVS/should/be/excluded");
-        assertTrue(GlobalExcludes.isInGlobalExcludes(cvsFile));
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/util/HttpClientConfiguratorTest.java b/backend/core/src/test/java/org/artifactory/util/HttpClientConfiguratorTest.java
deleted file mode 100644
index e281008..0000000
--- a/backend/core/src/test/java/org/artifactory/util/HttpClientConfiguratorTest.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.auth.AuthSchemeProvider;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.config.Registry;
-import org.apache.http.conn.HttpClientConnectionManager;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.conn.BasicHttpClientConnectionManager;
-import org.apache.http.impl.conn.DefaultRoutePlanner;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ArtifactoryContextThreadBinder;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.repo.http.IdleConnectionMonitorService;
-import org.artifactory.repo.http.IdleConnectionMonitorServiceImpl;
-import org.artifactory.spring.InternalArtifactoryContext;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.artifactory.test.TestUtils;
-import org.artifactory.util.bearer.BearerSchemeFactory;
-import org.easymock.EasyMock;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-
-import static org.fest.assertions.Assertions.assertThat;
-import static org.testng.Assert.*;
-
-/**
- * Tests the HTTP client configurator behaviors and conditions.
- * Implementation is package protected so most test must be done using reflection.
- *
- * @author Yossi Shaul
- */
- at Test
-public class HttpClientConfiguratorTest extends ArtifactoryHomeBoundTest {
-
-    private IdleConnectionMonitorService idleConnectionMonitorService;
-    private ArtifactoryContext contextMock;
-
-    @BeforeMethod
-    public void setUp() throws Exception {
-        bindArtifactoryHome();
-
-        getBound().setProperty(ConstantValues.idleConnectionMonitorInterval, "10");
-        getBound().setProperty(ConstantValues.disableIdleConnectionMonitoring, "false");
-        idleConnectionMonitorService = new IdleConnectionMonitorServiceImpl();
-        contextMock = EasyMock.createMock(InternalArtifactoryContext.class);
-        EasyMock.expect(contextMock.beanForType(IdleConnectionMonitorService.class))
-                .andReturn(idleConnectionMonitorService).anyTimes();
-        ArtifactoryContextThreadBinder.bind(contextMock);
-        EasyMock.replay(contextMock);
-
-        //Version might not have been initialized
-        if (StringUtils.isBlank(ConstantValues.artifactoryVersion.getString())) {
-            ArtifactoryHome.get().getArtifactoryProperties().
-                    setProperty(ConstantValues.artifactoryVersion.getPropertyName(), "momo");
-        }
-    }
-
-    public void testConstructor() {
-        CloseableHttpClient multiThreadedClient = new HttpClientConfigurator().getClient();
-        assertNotNull(multiThreadedClient, "A valid client should have been constructed.");
-
-        HttpClientConnectionManager connManager = getConnManager(multiThreadedClient);
-        assertTrue(connManager instanceof PoolingHttpClientConnectionManager,
-                "Expected a multi-threaded connection manager but found " + multiThreadedClient.getClass());
-        //testClientUserAgent(multiThreadedClient);
-
-        //validateSingleThreadedClient(new HttpClient4Configurator(false).getClient());
-        //validateSingleThreadedClient(new HttpClient4Configurator().getClient());
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testHostFromInvalidUrl() {
-        new HttpClientConfigurator().hostFromUrl("sttp:/.com");
-    }
-
-    public void testHost() throws IOException {
-        CloseableHttpClient client = new HttpClientConfigurator().host("bob").getClient();
-        DefaultRoutePlanner routePlanner = getRoutePlanner(client);
-        assertThat(routePlanner).isInstanceOf(HttpClientConfigurator.DefaultHostRoutePlanner.class);
-        assertEquals(((HttpClientConfigurator.DefaultHostRoutePlanner)
-                routePlanner).getDefaultHost().getHostName(), "bob", "Unexpected host.");
-        client.close();
-    }
-
-    public void testTokenAuthentication() throws IOException {
-        CloseableHttpClient client = new HttpClientConfigurator().host("bob").enableTokenAuthentication(true, null, null).getClient();
-        Registry<AuthSchemeProvider> registry = getAuthSchemeRegistry(client);
-        assertThat(registry.lookup("bearer")).isInstanceOf(BearerSchemeFactory.class);
-        RequestConfig defaultConfig = getDefaultConfig(client);
-        assertThat(defaultConfig.getTargetPreferredAuthSchemes().size()).isEqualTo(1);
-        assertThat(defaultConfig.getTargetPreferredAuthSchemes().iterator().next()).isEqualTo("Bearer");
-        client.close();
-    }
-
-    private Registry<AuthSchemeProvider> getAuthSchemeRegistry(HttpClient client) {
-        return TestUtils.getField(getCloseableHttpClient(client), "authSchemeRegistry", Registry.class);
-    }
-
-    private RequestConfig getDefaultConfig(HttpClient client) {
-        return TestUtils.getField(getCloseableHttpClient(client), "defaultConfig", RequestConfig.class);
-    }
-
-    /*private Registry<AuthSchemeProvider> getAuthSchemeRegistry(HttpClient client) {
-        return TestUtils.getField(client, "authSchemeRegistry", Registry.class);
-    }*/
-
-    private DefaultRoutePlanner getRoutePlanner(HttpClient client) {
-        return TestUtils.getField(getCloseableHttpClient(client), "routePlanner", DefaultRoutePlanner.class);
-    }
-
-    /*
-
-    public void testHostFromNullUrl() {
-        CloseableHttpClient client = new HttpClient4Configurator().hostFromUrl(null).getClient();
-        assertNull(client.getHostConfiguration().getHost(), "Expected a null host.");
-    }
-
-    public void testHostFromUrl() {
-        HttpClient client = new HttpClient4Configurator().hostFromUrl("http://momo.com/bobson").getClient();
-        assertEquals(client.getHostConfiguration().getHost(), "momo.com", "Unexpected host.");
-    }
-
-    public void testNullHost() {
-        HttpClient client = new HttpClient4Configurator().host(null).getClient();
-        assertNull(client.getHostConfiguration().getHost(), "Expected a null host.");
-    }
-
-    public void testHost() {
-        HttpClient client = new HttpClient4Configurator().host("bob").getClient();
-        assertEquals(client.getHostConfiguration().getHost(), "bob", "Unexpected host.");
-    }
-
-    public void testNullLocalAddress() {
-        HttpClient client = new HttpClient4Configurator().localAddress(null).getClient();
-        assertNull(client.getHostConfiguration().getLocalAddress(), "Unexpected local address.");
-    }
-
-    public void testLocalAddress() {
-        HttpClient client = new HttpClient4Configurator().localAddress("localhost").getClient();
-        assertNotNull(client.getHostConfiguration().getLocalAddress(), "Expected a local address.");
-    }
-
-    public void testAuthenticationWithNullCredentials() {
-        HttpClient client = new HttpClient4Configurator().authentication(null).getClient();
-        assertNull(client.getState().getCredentials(AuthScope.ANY), "Unexpected auth scope.");
-    }
-
-    public void testAuthenticationWithCredentialsObject() {
-        UsernamePasswordCredentials creds = new UsernamePasswordCredentials("asd", "fgh");
-        HttpClient client = new HttpClient4Configurator().host("moo.com").authentication(creds).getClient();
-        assertEquals(client.getState().getCredentials(AuthScope.ANY), creds, "Unexpected credentials object.");
-    }
-
-    public void testAuthenticationWithBlankUsername() {
-        HttpClient client = new HttpClient4Configurator().authentication(null, null).getClient();
-        assertNull(client.getState().getCredentials(AuthScope.ANY), "Unexpected auth scope.");
-    }
-
-    @Test(expectedExceptions = IllegalStateException.class, expectedExceptionsMessageRegExp = ".*no host.*")
-    public void testAuthenticationWithBlankHost() {
-        new HttpClient4Configurator().authentication("momo", "popo");
-    }
-
-    public void testAuthentication() {
-        HttpClient client = new HttpClient4Configurator().host("momo.com").authentication("moo", "bob").getClient();
-        UsernamePasswordCredentials credentials =
-                (UsernamePasswordCredentials) client.getState().getCredentials(AuthScope.ANY);
-        assertNotNull(credentials, "Unexpected auth scope.");
-        assertEquals("moo", credentials.getUserName(), "Unexpected authentication username.");
-        assertEquals("bob", credentials.getPassword(), "Unexpected authentication password.");
-    }
-
-    public void testSimpleSetters() {
-        ProxyDescriptor proxyDescriptor = new ProxyDescriptor();
-        proxyDescriptor.setHost("moo.com");
-        proxyDescriptor.setPort(8686);
-
-        HttpClient client = new HttpClient4Configurator()
-                .defaultMaxConnectionsPerHost(234)
-                .maxTotalConnections(444)
-                .connectionTimeout(2121)
-                .soTimeout(999)
-                .staleCheckingEnabled(true)
-                .retry(60, true)
-                .proxy(proxyDescriptor)
-                .getClient();
-
-        HttpConnectionManager httpConnectionManager = client.getHttpConnectionManager();
-
-        HttpClientParams clientParams = client.getParams();
-        HttpConnectionManagerParams connectionManagerparams = httpConnectionManager.getParams();
-
-        assertEquals(connectionManagerparams.getDefaultMaxConnectionsPerHost(), 234,
-                "Unexpected default max connections per host.");
-        assertEquals(connectionManagerparams.getMaxTotalConnections(), 444, "Unexpected max total connections.");
-        assertEquals(connectionManagerparams.getConnectionTimeout(), 2121, "Unexpected connection timeout.");
-        assertEquals(clientParams.getConnectionManagerTimeout(), 2121, "Unexpected connection timeout.");
-        assertEquals(connectionManagerparams.getSoTimeout(), 999, "Unexpected socket timeout.");
-        assertEquals(clientParams.getSoTimeout(), 999, "Unexpected socket timeout.");
-        assertTrue(connectionManagerparams.isStaleCheckingEnabled(), "Stale checking should be enabled.");
-
-        DefaultHttpMethodRetryHandler retryHandler = (DefaultHttpMethodRetryHandler) clientParams.getParameter(
-                HttpMethodParams.RETRY_HANDLER);
-        assertEquals(retryHandler.getRetryCount(), 60, "Unexpected retry count.");
-        assertTrue(retryHandler.isRequestSentRetryEnabled(), "Request sent entry should be enabled.");
-
-        assertEquals(client.getHostConfiguration().getProxyHost(), "moo.com", "Unexpected proxy host.");
-        assertEquals(client.getHostConfiguration().getProxyPort(), 8686, "Unexpected proxy port.");
-    }
-    */
-
-    private void validateSingleThreadedClient(HttpClient client) {
-        assertNotNull(client, "A valid client should have been constructed.");
-        assertTrue(getConnManager(client) instanceof BasicHttpClientConnectionManager,
-                "Expected a single-threaded connection manager.");
-        //testClientUserAgent(client);
-    }
-
-    /*private void testClientUserAgent(HttpClient client) {
-        RedirectExec execChain = TestUtils.getField(client, "execChain", RedirectExec.class);
-        TestUtils.getField(execChain, "requestExecutor", HttpRequestExecutor.class);
-        assertEquals(client.getParams().getParameter(HttpHeaders.USER_AGENT), HttpUtils.getArtifactoryUserAgent(),
-                "Unexpected client user agent.");
-    }*/
-
-    private HttpClientConnectionManager getConnManager(HttpClient client) {
-        return TestUtils.getField(getCloseableHttpClient(client), "connManager", HttpClientConnectionManager.class);
-    }
-
-    private CloseableHttpClient getCloseableHttpClient(HttpClient client) {
-        return TestUtils.getField(client, "closeableHttpClient", CloseableHttpClient.class);
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/util/PathMatcherTest.java b/backend/core/src/test/java/org/artifactory/util/PathMatcherTest.java
deleted file mode 100644
index 6716ee2..0000000
--- a/backend/core/src/test/java/org/artifactory/util/PathMatcherTest.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-/**
- * PathMatcher unit tests.
- *
- * @author Yossi Shaul
- */
- at Test
-public class PathMatcherTest extends ArtifactoryHomeBoundTest {
-
-    public void matchWithIncludeAll() {
-        // File
-        boolean matches1 = PathMatcher.matches("apath", Arrays.asList("**"), Arrays.asList(""), false);
-        assertTrue(matches1);
-        // Folder
-        boolean matches2 = PathMatcher.matches("apath", Arrays.asList("**"), Arrays.asList(""), true);
-        assertTrue(matches2);
-    }
-
-    public void matchWithExcludeAll() {
-        // File
-        boolean matches1 = PathMatcher.matches("apath", Arrays.asList(""), Arrays.asList("**"), false);
-        assertFalse(matches1);
-
-        // Folder
-        boolean matches2 = PathMatcher.matches("apath", Arrays.asList(""), Arrays.asList("**"), true);
-        assertFalse(matches2);
-    }
-
-    public void matchWithIncludesOnly() {
-        // File
-        List<String> includes = Arrays.asList("apath/*", "**/my/test/path", "public/in/**");
-        List<String> excludes = Arrays.asList("");
-        assertFalse(PathMatcher.matches("apath", includes, excludes, false));
-        assertTrue(PathMatcher.matches("this/is/my/test/path", includes, excludes, false));
-        assertFalse(PathMatcher.matches("this/is/my/test/path/andmore", includes, excludes, false));
-        assertFalse(PathMatcher.matches("this/is/my/test/path/andmore", includes, excludes, false));
-        assertTrue(PathMatcher.matches("public/in/the/public.jar", includes, excludes, false));
-        assertFalse(PathMatcher.matches("public", includes, excludes, false));
-        assertFalse(PathMatcher.matches("public/i", includes, excludes, false));
-        assertFalse(PathMatcher.matches("public2", Arrays.asList("apath/*", "public/in/**"), excludes, false));
-        //Folder
-        assertTrue(PathMatcher.matches("apath", includes, excludes, true));
-        assertTrue(PathMatcher.matches("this/is/my/test/path", includes, excludes, true));
-        assertTrue(PathMatcher.matches("this/is/my/test/path/andmore", includes, excludes, true));
-        assertTrue(PathMatcher.matches("this/is/my/test/path/andmore", includes, excludes, true));
-        assertTrue(PathMatcher.matches("public/in/the/public.jar", includes, excludes, true));
-        assertTrue(PathMatcher.matches("public", includes, excludes, true));
-        assertTrue(PathMatcher.matches("public/i", includes, excludes, true));
-        assertFalse(PathMatcher.matches("public2", Arrays.asList("apath/*", "public/in/**"), excludes, true));
-    }
-
-    public void matchWithIncludesOnlyPartial() {
-        // File
-        List<String> excludes = Arrays.asList("");
-        assertFalse(PathMatcher.matches("ap/x", Arrays.asList("*p/x/y"), excludes, false));
-        assertFalse(PathMatcher.matches("ap/x", Arrays.asList("**/y/*"), excludes, false));
-        assertFalse(PathMatcher.matches("ap/x", Arrays.asList("*/x/*"), excludes, false));
-        assertFalse(PathMatcher.matches("ap/x", Arrays.asList("*/*/*"), excludes, false));
-        assertFalse(PathMatcher.matches("ap/x", Arrays.asList("*/*/t"), excludes, false));
-        assertFalse(PathMatcher.matches("ap/x", Arrays.asList("*/x/t"), excludes, false));
-        assertTrue(PathMatcher.matches("ap/x", Arrays.asList("a?/x"), excludes, false));
-        assertTrue(PathMatcher.matches("ap/x", Arrays.asList("?p*/?"), excludes, false));
-        assertFalse(PathMatcher.matches("ap/x", Arrays.asList("?p*/??"), excludes, false));
-        assertFalse(PathMatcher.matches("ap/x", Arrays.asList("aa?/x"), excludes, false));
-        assertFalse(PathMatcher.matches("ap/x", Arrays.asList("*/d/*"), excludes, false));
-        assertFalse(PathMatcher.matches("apath", Arrays.asList("apath/some/other/*"), excludes, false));
-        assertFalse(PathMatcher.matches("apath/some", Arrays.asList("apath/some/other/*"), excludes, false));
-        assertFalse(PathMatcher.matches("apath/some2", Arrays.asList("apath/some/other/*"), excludes, false));
-        assertFalse(PathMatcher.matches("apath2", Arrays.asList("apath/some/other/*"), excludes, false));
-        assertFalse(
-                PathMatcher.matches("com", Arrays.asList("com/some/other/*", "com/acme/***", "com/toto/*"), excludes,
-                        false));
-        assertFalse(
-                PathMatcher.matches("org", Arrays.asList("com/some/other/*", "com/acme/***", "com/toto/*"), excludes,
-                        false));
-        assertFalse(PathMatcher.matches("apath2", Arrays.asList("apath/*"), excludes, false));
-        assertFalse(PathMatcher.matches("apath", Arrays.asList("apath2/*"), excludes, false));
-        assertFalse(PathMatcher.matches("apath", Arrays.asList("apath2"), excludes, false));
-        // Folder
-        assertTrue(PathMatcher.matches("ap/x", Arrays.asList("*p/x/y"), excludes, true));
-        assertTrue(PathMatcher.matches("ap/x", Arrays.asList("**/y/*"), excludes, true));
-        assertTrue(PathMatcher.matches("ap/x", Arrays.asList("*/x/*"), excludes, true));
-        assertTrue(PathMatcher.matches("ap/x", Arrays.asList("*/*/*"), excludes, true));
-        assertTrue(PathMatcher.matches("ap/x", Arrays.asList("*/*/t"), excludes, true));
-        assertTrue(PathMatcher.matches("ap/x", Arrays.asList("*/x/t"), excludes, true));
-        assertTrue(PathMatcher.matches("ap/x", Arrays.asList("a?/x"), excludes, true));
-        assertTrue(PathMatcher.matches("ap/x", Arrays.asList("?p*/?"), excludes, true));
-        assertFalse(PathMatcher.matches("ap/x", Arrays.asList("?p*/??"), excludes, true));
-        assertFalse(PathMatcher.matches("ap/x", Arrays.asList("aa?/x"), excludes, true));
-        assertFalse(PathMatcher.matches("ap/x", Arrays.asList("*/d/*"), excludes, true));
-        assertTrue(PathMatcher.matches("apath", Arrays.asList("apath/some/other/*"), excludes, true));
-        assertTrue(PathMatcher.matches("apath/some", Arrays.asList("apath/some/other/*"), excludes, true));
-        assertFalse(PathMatcher.matches("apath/some2", Arrays.asList("apath/some/other/*"), excludes, true));
-        assertFalse(PathMatcher.matches("apath2", Arrays.asList("apath/some/other/*"), excludes, true));
-        assertTrue(
-                PathMatcher.matches("com", Arrays.asList("com/some/other/*", "com/acme/***", "com/toto/*"), excludes,
-                        true));
-        assertFalse(
-                PathMatcher.matches("org", Arrays.asList("com/some/other/*", "com/acme/***", "com/toto/*"), excludes,
-                        true));
-        assertFalse(PathMatcher.matches("apath2", Arrays.asList("apath/*"), excludes, true));
-        assertFalse(PathMatcher.matches("apath", Arrays.asList("apath2/*"), excludes, true));
-        assertFalse(PathMatcher.matches("apath", Arrays.asList("apath2"), excludes, true));
-
-    }
-
-    public void matchWithExcludesOnly() {
-        // File
-        List<String> includes = Collections.emptyList();
-        List<String> excludes = Arrays.asList("apath", "**/my/test/path", "commons-*", "main/*");
-        assertTrue(PathMatcher.matches("apat", includes, excludes, false));
-        assertFalse(PathMatcher.matches("apath", includes, excludes, false));
-        assertTrue(PathMatcher.matches("apath2", includes, excludes, false));
-        assertFalse(PathMatcher.matches("commons-codec", includes, excludes, false));
-        assertTrue(PathMatcher.matches("main.123", includes, excludes, false));
-        assertTrue(PathMatcher.matches("apath/deep", includes, excludes, false));
-        assertFalse(PathMatcher.matches("this/is/my/test/path", includes, excludes, false));
-        assertTrue(PathMatcher.matches("this/is/my/test/path/andmore", includes, excludes, false));
-        // Folder
-        assertTrue(PathMatcher.matches("apat", includes, excludes, true));
-        assertFalse(PathMatcher.matches("apath", includes, excludes, true));
-        assertTrue(PathMatcher.matches("apath2", includes, excludes, true));
-        assertFalse(PathMatcher.matches("commons-codec", includes, excludes, true));
-        assertTrue(PathMatcher.matches("main.123", includes, excludes, true));
-        assertTrue(PathMatcher.matches("apath/deep", includes, excludes, true));
-        assertFalse(PathMatcher.matches("this/is/my/test/path", includes, excludes, true));
-        assertTrue(PathMatcher.matches("this/is/my/test/path/andmore", includes, excludes, true));
-
-    }
-
-    public void matchExcludesAndIncludes() {
-        // File
-        List<String> includes = Arrays.asList("org/**", "com/**", "net/**");
-        List<String> excludes = Arrays.asList("org/apache/**", "commons-*");
-        assertTrue(PathMatcher.matches("org/codesulting", includes, excludes, false));
-        assertTrue(PathMatcher.matches("com/test/123", includes, excludes, false));
-        assertFalse(PathMatcher.matches("org/apache/bla", includes, excludes, false));
-        assertFalse(PathMatcher.matches("commons-lang", includes, excludes, false));
-        // Folder
-        assertTrue(PathMatcher.matches("org/codesulting", includes, excludes, true));
-        assertTrue(PathMatcher.matches("com/test/123", includes, excludes, true));
-        assertFalse(PathMatcher.matches("org/apache/bla", includes, excludes, true));
-        assertFalse(PathMatcher.matches("commons-lang", includes, excludes, true));
-    }
-
-    public void excludesTakesPrecedenceOverIncludes() {
-        // currently excludes alway takes precedence, we might want to change it in the future so the closer will win
-        // File
-        List<String> excludes = Arrays.asList("apath/**");
-        List<String> includes = Arrays.asList("**", "apath/sub/1");
-        assertFalse(PathMatcher.matches("apath", includes, excludes, false));
-        assertFalse(PathMatcher.matches("apath/sub", includes, excludes, false));
-        assertFalse(PathMatcher.matches("apath/sub/1", includes, excludes,
-                false));  // even though it is explicitly included
-        assertTrue(PathMatcher.matches("apath2", includes, excludes, false));
-        //Folder
-        assertFalse(PathMatcher.matches("apath", includes, excludes, true));
-        assertFalse(PathMatcher.matches("apath/sub", includes, excludes, true));
-        assertFalse(
-                PathMatcher.matches("apath/sub/1", includes, excludes, true));  // even though it is explicitly included
-        assertTrue(PathMatcher.matches("apath2", includes, excludes, true));
-    }
-
-    public void subPathIncludes() {
-        List<String> includes = Arrays.asList("apath1/sub1/**", "apath1/sub2/**", "apath2/sub1/**");
-        //File
-        assertFalse(PathMatcher.matches("apath", includes, null, false));
-        assertFalse(PathMatcher.matches("apath1", includes, null, false));
-        assertFalse(PathMatcher.matches("apath2", includes, null, false));
-        assertFalse(PathMatcher.matches("apath1/sub", includes, null, false));
-        assertTrue(PathMatcher.matches("apath1/sub1", includes, null, false));
-        assertTrue(PathMatcher.matches("apath1/sub1/t", includes, null, false));
-        assertTrue(PathMatcher.matches("apath1/sub1/toto/tutu", includes, null, false));
-        // Folder
-        assertFalse(PathMatcher.matches("apath", includes, null, true));
-        assertTrue(PathMatcher.matches("apath1", includes, null, true));
-        assertTrue(PathMatcher.matches("apath2", includes, null, true));
-        assertFalse(PathMatcher.matches("apath1/sub", includes, null, true));
-        assertTrue(PathMatcher.matches("apath1/sub1", includes, null, true));
-        assertTrue(PathMatcher.matches("apath1/sub1/t", includes, null, true));
-        assertTrue(PathMatcher.matches("apath1/sub1/toto/tutu", includes, null, true));
-    }
-
-    public void sourcesIncludes() {
-        List<String> includes = Arrays.asList("**/*-sources.jar*");
-        // File
-        assertFalse(PathMatcher.matches("apath/", includes, null, false));
-        assertFalse(PathMatcher.matches("apath1/", includes, null, false));
-        assertFalse(PathMatcher.matches("apath2/", includes, null, false));
-        assertFalse(PathMatcher.matches("apath1/subfolder-longer-than-pattern/", includes, null, false));
-        assertFalse(PathMatcher.matches("apath1/sub1/", includes, null, false));
-        assertFalse(PathMatcher.matches("apath1/sub1/t/", includes, null, false));
-        assertFalse(PathMatcher.matches("apath1/sub1/toto/tutu/", includes, null, false));
-        assertTrue(PathMatcher.matches("apath1/toto-sources.jar", includes, null, false));
-        assertTrue(PathMatcher.matches("apath1/sub/toto-sources.jar", includes, null, false));
-        assertTrue(PathMatcher.matches("apath1/toto-sources.jar.md5", includes, null, false));
-        assertTrue(PathMatcher.matches("apath1/sub/toto-sources.jar.md5", includes, null, false));
-        assertFalse(PathMatcher.matches("apath1/toto-1.0.jar", includes, null, false));
-        assertFalse(PathMatcher.matches("apath1/sub/toto-1.0.jar", includes, null, false));
-        assertFalse(PathMatcher.matches("apath1/toto-1.0.jar.md5", includes, null, false));
-        assertFalse(PathMatcher.matches("apath1/sub/toto-1.0.jar.md5", includes, null, false));
-        // Folder
-        assertTrue(PathMatcher.matches("apath/", includes, null, true));
-        assertTrue(PathMatcher.matches("apath1/", includes, null, true));
-        assertTrue(PathMatcher.matches("apath2/", includes, null, true));
-        assertTrue(PathMatcher.matches("apath1/subfolder-longer-than-pattern/", includes, null, true));
-        assertTrue(PathMatcher.matches("apath1/sub1/", includes, null, true));
-        assertTrue(PathMatcher.matches("apath1/sub1/t/", includes, null, true));
-        assertTrue(PathMatcher.matches("apath1/sub1/toto/tutu/", includes, null, true));
-        assertTrue(PathMatcher.matches("apath1/toto-sources.jar", includes, null, true));
-        assertTrue(PathMatcher.matches("apath1/sub/toto-sources.jar", includes, null, true));
-        assertTrue(PathMatcher.matches("apath1/toto-sources.jar.md5", includes, null, true));
-        assertTrue(PathMatcher.matches("apath1/sub/toto-sources.jar.md5", includes, null, true));
-        assertTrue(PathMatcher.matches("apath1/toto-1.0.jar", includes, null, true));
-        assertTrue(PathMatcher.matches("apath1/sub/toto-1.0.jar", includes, null, true));
-        assertTrue(PathMatcher.matches("apath1/toto-1.0.jar.md5", includes, null, true));
-        assertTrue(PathMatcher.matches("apath1/sub/toto-1.0.jar.md5", includes, null, true));
-    }
-
-    public void test() {
-        List<String> includes = Arrays.asList("**/*-test.jar");
-        List<String> excludes = Arrays.asList();
-        assertFalse(PathMatcher.matches("a/", includes, excludes, false));
-        assertTrue(PathMatcher.matches("a/", includes, excludes, true));
-    }
-}
diff --git a/backend/core/src/test/java/org/artifactory/util/VersionParserTest.java b/backend/core/src/test/java/org/artifactory/util/VersionParserTest.java
deleted file mode 100644
index f7dce1b..0000000
--- a/backend/core/src/test/java/org/artifactory/util/VersionParserTest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import org.apache.commons.io.IOUtils;
-import org.artifactory.api.version.ArtifactoryVersioning;
-import org.artifactory.version.VersionParser;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Tests the behaviour of the Version Parser
- *
- * @author Noam Tenne
- */
-public class VersionParserTest {
-
-    /**
-     * Supplies the version parser with a mock versioning xml file and tries to parse ot to an ArtifactoryVersioning
-     * object
-     *
-     * @throws IOException - Exception thrown if there are any problems with reading from the stream
-     */
-    @Test
-    public void testLoadResource() throws IOException {
-        InputStream is = getClass().getResourceAsStream("/org/artifactory/util/versioning.xml");
-        String input = IOUtils.toString(is, "utf-8");
-        ArtifactoryVersioning artifactoryVersioning = VersionParser.parse(input);
-        artifactoryVersioning.getLatest();
-    }
-}
\ No newline at end of file
diff --git a/backend/core/src/test/resources/org/artifactory/bintray/packagesToDeploy.json b/backend/core/src/test/resources/org/artifactory/bintray/packagesToDeploy.json
deleted file mode 100644
index 991162b..0000000
--- a/backend/core/src/test/resources/org/artifactory/bintray/packagesToDeploy.json
+++ /dev/null
@@ -1,14 +0,0 @@
-[
-    {
-        "name": "package1",
-        "linked": true
-    },
-    {
-        "name": "package2",
-        "linked": false
-    },
-    {
-        "name": "package3",
-        "linked": false
-    }
-]
\ No newline at end of file
diff --git a/backend/core/src/test/resources/org/artifactory/repo/PropertyLoaderTest1.properties b/backend/core/src/test/resources/org/artifactory/repo/PropertyLoaderTest1.properties
deleted file mode 100644
index ec2b95b..0000000
--- a/backend/core/src/test/resources/org/artifactory/repo/PropertyLoaderTest1.properties
+++ /dev/null
@@ -1,163 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-################ GLOBAL SETTINGS
-# This is where maven-proxy stores files it has downloaded
-repo.local.store=./target/repo
-
-#The port to listen on - not used if loaded as a webapp
-port=9999
-
-#This is the base area that all files are loaded from. While it is possible to leave this blank, this behaviour
-#is deprecated and will be disabled in version 2.0.  There are too many namespace conflicts caused by not using
-#a prefix.
-#The repository will be shown at http://localhost:9999/repository/
-#for the .war loaded into a webapp server, the default prefix is "repository" (edit the web.xml to change)
-# As maven doesn't like a trailing slash, this address shouldn't have one either.
-prefix=repository
-
-#This is the simple date format used to display the last modified date while browsing the repository.
-lastModifiedDateFormat=yyyy/MM/dd HH:mm:ss
-
-################ SNAPSHOT HANDLING
-#If you want the proxy to look for newer snapshots, set to true
-snapshot.update=true
-
-################ M2 METADATA HANDLING
-#If you want the proxy to prevent looking for newer metadata, set to false (default is true)
-#metadata.update=false
-
-################ M2 POM HANDLING
-#If you want the proxy to look for newer POMs, set to true (default is false)
-pom.update=true
-
-################ PROMOTION HANDLING
-# ***** NOT CURRENTLY IMPLEMENTED *****
-#Promotion describes the process by which new artifacts are loaded to global maven-proxy repository.  It
-# is designed to be used by "higher security installations" that do not want to acquire artifacts from
-# remote repositories without approval.
-#
-#If promotion handling is enabled, then the proxy will not download remote artifacts without permission
-# (local repositories with copy=false are considered to be local)
-#
-#Permission to download is granted via the Promotion menu which will be enabled
-#  when promotion handling is enabled.
-#
-#If promotion is false, artifacts are sourced from any repository as per normal.
-#
-#Promotion and snapshots:  If promotion is enabled, snapshots are not downloadable.  The concept of using
-# a snapshot in a production build (which is primarily what promotion is for) is counterintuitive.
-##
-promotion=false
-
-################ WEB INTERFACE
-# This defines the absolute URL the server should use to identify itself.
-# This can often be determined automatically, but we recommend you specify
-# it explicitly to prevent problems during startup.
-# The prefix will be added to this for the actual repository
-# i.e. proxy available at http://localhost:9999/, repository at http://localhost:9999/repository
-serverName=http://localhost:9999
-
-#If true, the repository can be browsed
-browsable=true
-
-#If true, the repository can be searched
-searchable=true
-
-#Not currently implemented. Will allow webdav access to the repository at some point.
-webdav=true
-
-#Stylesheet - if configured, will override the default stylesheet shipped with maven-proxy - absolute URLs only
-#eg.  /maven-proxy/style.css, http://www.example.com/style.css
-stylesheet=/maven-proxy/style.css
-
-#bgColor / bgColorHighlight are replaced in the built in stylesheet to produce a simple color scheme.
-#If a stylesheet is set, these are not used.
-bgColor=#14B
-bgColorHighlight=#94B
-
-#rowColor / rowColorHighlight are replaced in the built in stylesheet to produce a simple color scheme.
-#If a stylesheet is set, these are not used.
-rowColor=#CCF
-rowColorHighlight=#DDF
-
-
-################ PROXIES
-#This is just a hack, it should auto discover them
-proxy.list=one,two,three
-
-#Unauthenticated proxy
-proxy.one.host=proxy1.example.com
-proxy.one.port=3128
-
-#Authenticated proxy
-proxy.two.host=proxy2.example.org
-proxy.two.port=80
-proxy.two.username=username2
-proxy.two.password=password2
-
-#Authenticated proxy
-proxy.three.host=proxy3.example.net
-proxy.three.port=3129
-proxy.three.username=username3
-proxy.three.password=password3
-
-
-################# REPOSITORIES
-#This is not just a hack, it specifies the order repositories should be checked
-#Note that the proxy adds a "/" which is why the urls aren't suffixed with a "/"
-repo.list=local-repo,www-ibiblio-org,dist-codehaus-org,private-example-com
-
-#local-store
-# The local store represents a location that local jars you host can be located.
-# This could also be achieved by having a local http repository, but this is less cumbersome
-repo.local-repo.url=file:///./target/repo-local
-repo.local-repo.description=Super Secret Custom Repository
-#If copy is true, jars are copied from the store to the proxy-repo. Only configurable for file:/// repos
-repo.local-repo.copy=false
-#If hardfail is true, any unexpected errors from the repository will cause
-#the client download to fail (typically with a 500 error)
-repo.local-repo.hardfail=true
-#Don't cache a file repository
-repo.local-repo.cache.period=0
-
-
-#www.ibiblio.org
-repo.www-ibiblio-org.url=http://www.ibiblio.org/maven
-repo.www-ibiblio-org.description=www.ibiblio.org
-repo.www-ibiblio-org.proxy=one
-repo.www-ibiblio-org.hardfail=true
-#Cache this repository for 1 hour
-repo.www-ibiblio-org.cache.period=3600
-repo.www-ibiblio-org.cache.failures=true
-
-#dist.codehaus.org
-repo.dist-codehaus-org.url=http://dist.codehaus.org
-repo.dist-codehaus-org.proxy=two
-repo.dist-codehaus-org.hardfail=false
-repo.dist-codehaus-org.cache.period=3600
-repo.dist-codehaus-org.cache.failures=true
-
-#private.example.com
-repo.private-example-com.url=http://private.example.com/internal
-repo.private-example-com.description=Commercial In Confidence Repository
-repo.private-example-com.username=username1
-repo.private-example-com.password=password1
-repo.private-example-com.proxy=three
-repo.private-example-com.cache.period=3600
-
diff --git a/backend/core/src/test/resources/org/artifactory/repo/PropertyLoaderTest2.properties b/backend/core/src/test/resources/org/artifactory/repo/PropertyLoaderTest2.properties
deleted file mode 100644
index ef868a4..0000000
--- a/backend/core/src/test/resources/org/artifactory/repo/PropertyLoaderTest2.properties
+++ /dev/null
@@ -1,39 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-################ GLOBAL SETTINGS
-# This is where maven-proxy stores files it has downloaded
-repo.local.store=/var/tmp/proxy-repo
-
-#The port to listen on
-port=9999
-
-#If true, the repository can be browsed
-browsable=true
-searchable=false
-
-
-################# REPOSITORIES
-#This is not just a hack, it specifies the order repositories should be checked
-#Note that the proxy adds a "/" which is why the urls aren't suffixed with a "/"
-repo.list=local-repo
-
-repo.local-repo.url=fnert:///usr/local/custom-repo
-
-
-
diff --git a/backend/core/src/test/resources/org/artifactory/repo/PropertyLoaderTest3.properties b/backend/core/src/test/resources/org/artifactory/repo/PropertyLoaderTest3.properties
deleted file mode 100644
index 01ec29c..0000000
--- a/backend/core/src/test/resources/org/artifactory/repo/PropertyLoaderTest3.properties
+++ /dev/null
@@ -1,46 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-################ GLOBAL SETTINGS
-# The following directory will probably not exist.
-repo.local.store=gingangulygulygulygulygoo
-port=9999
-prefix=repository
-
-################ BROWSING
-#If true, the repository can be browsed
-browsable=true
-
-################ SEARCHING
-#If true, the repository can be searched
-searchable=true
-
-################ SNAPSHOT HANDLING
-snapshot.update=true
-snapshot.update.interval=60
-
-
-################ PROXIES
-proxy.list=
-
-################# REPOSITORIES
-repo.list=local-repo
-
-#local-store
-# Another non-existent directory
-repo.local-repo.url=file:///ikeepmyteethinajarbesidethebed
diff --git a/backend/core/src/test/resources/org/artifactory/repo/PropertyLoaderTest4.properties b/backend/core/src/test/resources/org/artifactory/repo/PropertyLoaderTest4.properties
deleted file mode 100644
index ae9404b..0000000
--- a/backend/core/src/test/resources/org/artifactory/repo/PropertyLoaderTest4.properties
+++ /dev/null
@@ -1,47 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-################ GLOBAL SETTINGS
-# The following directory will probably not exist.
-repo.local.store=./target/repo
-port=9999
-prefix=repository
-
-################ BROWSING
-#If true, the repository can be browsed
-browsable=true
-
-################ SEARCHING
-#If true, the repository can be searched
-searchable=true
-
-################ SNAPSHOT HANDLING
-snapshot.update=true
-snapshot.update.interval=60
-snapshot.cache.failures=false
-
-
-################ PROXIES
-
-################# REPOSITORIES
-repo.list=local-repo
-
-#local-store
-# Another non-existent directory
-repo.local-repo.url=file:///./target/repo
-
diff --git a/backend/core/src/test/resources/org/artifactory/repo/artifactory.test.config.xml b/backend/core/src/test/resources/org/artifactory/repo/artifactory.test.config.xml
deleted file mode 100644
index c4fd7f4..0000000
--- a/backend/core/src/test/resources/org/artifactory/repo/artifactory.test.config.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<ns2:config xmlns:ns2="http://artifactory.jfrog.org/xsd/1.3.1">
-    <ns2:adminCredential>test</ns2:adminCredential>
-    <!--<localRepositoriesDir>repos</localRepositoriesDir>
-    <localRepositories>
-        <localRepository>
-            <key>local-repo</key>
-            <description>local repoitory</description>
-        </localRepository>
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>ibiblio</key>
-            <url>http://www.ibiblio.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus</key>
-            <url>http://dist.codehaus.org</url>
-        </remoteRepository>
-    </remoteRepositories>-->
-</ns2:config>
\ No newline at end of file
diff --git a/backend/core/src/test/resources/org/artifactory/repo/remote/browse/html/artifactory-list.html b/backend/core/src/test/resources/org/artifactory/repo/remote/browse/html/artifactory-list.html
deleted file mode 100644
index c2ddd4e..0000000
--- a/backend/core/src/test/resources/org/artifactory/repo/remote/browse/html/artifactory-list.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<html>
-<head>
-    <title>Index of libs-releases-local/org/jfrog/test</title>
-</head>
-<body>
-<h1>Index of libs-releases-local/org/jfrog/test</h1>
-<pre>Name    Last modified      Size</pre>
-<hr/>
-<pre><a href="../">../</a>
-<a href="multi1/">multi1/</a>  15-Dec-2010 16:07    -
-<a href="multi2/">multi2/</a>  15-Dec-2010 16:07    -
-<a href="multi3/">multi3/</a>  15-Dec-2010 16:08    -
-</pre>
-<hr/>
-<address style="font-size:small;">Artifactory/${project.version.prop} Server at localhost Port 8081</address>
-</body>
-</html> 
diff --git a/backend/core/src/test/resources/org/artifactory/repo/remote/browse/html/artifactory-simple.html b/backend/core/src/test/resources/org/artifactory/repo/remote/browse/html/artifactory-simple.html
deleted file mode 100644
index a65e8e7..0000000
--- a/backend/core/src/test/resources/org/artifactory/repo/remote/browse/html/artifactory-simple.html
+++ /dev/null
@@ -1,387 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
-    <link rel="icon" type="image/x-icon" href="../../../../favicon.ico"/>
-    <link rel="shortcut icon" type="image/x-icon" href="../../../../favicon.ico"/>
-    <title>Artifactory at tomer-desktop :: Repository Browser</title>
-    <meta name="revision" content="${timestamp}"/>
-
-    <script type="text/javascript"><!--/*--><![CDATA[/*><!--*/
-    var djConfig = {
-        isDebug:false,
-        parseOnLoad:false,
-        debugAtAllCosts:false,
-        excludeNamespace:['wicket']
-    };
-    /*-->]]>*/</script>
-
-    <script type="text/javascript"
-            src="../../../../webapp/v232/resources/org.artifactory.common.wicket.resources.dojo.DojoPackage/release/dojo/dojo.js"></script>
-    <script type="text/javascript"
-            src="../../../../webapp/v232/resources/org.artifactory.common.wicket.resources.dojo.DojoPackage/release/dojo/artifactory-dojo.js"></script>
-    <link rel="stylesheet" type="text/css"
-          href="../../../../webapp/v232/resources/org.artifactory.common.wicket.resources.dojo.DojoPackage/release/dojo/resources/dojo.css"/>
-    <link rel="stylesheet" type="text/css"
-          href="../../../../webapp/v232/resources/org.artifactory.common.wicket.resources.dojo.DojoPackage/release/dijit/themes/tundra/tundra.css"/>
-    <script type="text/javascript"
-            src="../../../../webapp/v232/resources/org.artifactory.common.wicket.resources.domutils.CommonJsPackage/DomUtils.js"></script>
-    <script type="text/javascript"
-            src="../../../../webapp/v232/resources/org.artifactory.common.wicket.resources.domutils.CommonJsPackage/AjaxIndicator.js"></script>
-    <link rel="stylesheet" type="text/css"
-          href="../../../../webapp/v232/resources/org.artifactory.web.ui.skins.GreenSkin/GreenSkin.css"/>
-    <script type="text/javascript"
-            src="../../../../webapp/v232/resources/org.artifactory.common.wicket.component.panel.feedback.aggregated.AggregateFeedbackPanel/AggregateFeedbackPanel.js"></script>
-    <script type="text/javascript"
-            src="../../../../webapp/v232/resources/org.artifactory.common.wicket.component.panel.feedback.FeedbackDistributer/FeedbackDistributer.js"></script>
-    <script type="text/javascript"
-            src="../../../../webapp/v232/resources/org.apache.wicket.markup.html.WicketEventReference/wicket-event.js"></script>
-    <script type="text/javascript"
-            src="../../../../webapp/v232/resources/org.apache.wicket.ajax.WicketAjaxReference/wicket-ajax.js"></script>
-    <script type="text/javascript"
-            src="../../../../webapp/v232/resources/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/wicket-ajax-debug.js"></script>
-    <script type="text/javascript" id="wicket-ajax-debug-enable"><!--/*--><![CDATA[/*><!--*/
-    wicketAjaxDebugEnable = true;
-    /*-->]]>*/</script>
-
-    <script type="text/javascript"
-            src="../../../../webapp/v232/resources/org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow/res/modal.js"></script>
-    <link rel="stylesheet" type="text/css"
-          href="../../../../webapp/v232/resources/org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow/res/modal.css"/>
-    <script type="text/javascript"
-            src="../../../../webapp/v232/resources/org.artifactory.common.wicket.component.modal.ModalHandler/ModalHandler.js"></script>
-    <script type="text/javascript"
-            src="../../../../webapp/v232/resources/org.artifactory.common.wicket.component.panel.sidemenu.SubMenuPanel/SubMenuPanel.js"></script>
-</head>
-<body class="tundra">
-<table cellpadding="0" cellspacing="0" class="page">
-<tr>
-<td class="main">
-<div class="header">
-    <div class="spacer">
-        <div id="logoa97" class="app-logo">
-            <a title="Artifactory" href="../../../../webapp/home.html" class=" artifactory-logo">
-
-                <span class="none">Artifactory</span>
-
-
-            </a>
-        </div>
-        <div class="top-menu">
-            <ul>
-                <li class="HomePage menu-group menu-group-enabled">
-                    <a href="../../../../webapp/home.html" class="enabled">
-                        <span class="menu-center"></span>
-                        <span class="menu-left"></span>
-                        <span class="menu-right"></span>
-                        <span class="item-name">Home</span>
-                    </a>
-                </li>
-                <li class="BrowseRepoPage menu-group menu-group-opened">
-                    <a href="../../../../webapp/browserepo.html" class="opened">
-                        <span class="menu-center"></span>
-                        <span class="menu-left"></span>
-                        <span class="menu-right"></span>
-                        <span class="item-name">Artifacts</span>
-                    </a>
-                </li>
-                <li class="DeployArtifactPage menu-group menu-group-enabled">
-                    <a href="../../../../webapp/deployartifact.html" class="enabled">
-                        <span class="menu-center"></span>
-                        <span class="menu-left"></span>
-                        <span class="menu-right"></span>
-                        <span class="item-name">Deploy</span>
-                    </a>
-                </li>
-                <li class="AdminPage menu-group menu-group-enabled">
-                    <a href="../../../../webapp/admin.html" class="enabled">
-                        <span class="menu-center"></span>
-                        <span class="menu-left"></span>
-                        <span class="menu-right"></span>
-                        <span class="item-name">Admin</span>
-                    </a>
-                </li>
-            </ul>
-        </div>
-        <div class="quick-search-box">
-            <form id="searchForma98" method="post"
-                  action="../../../../webapp/?wicket:interface=:108:searchForm::IFormSubmitListener::">
-                <div style="display:none"><input type="hidden" name="searchForma98_hf_0" id="searchForma98_hf_0"/></div>
-                <div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input
-                        type="text" autocomplete="false"/><input type="submit" name="searchButton"
-                                                                 onclick=" var b=document.getElementById('searchButtona99'); if (b!=null&&b.onclick!=null&&typeof(b.onclick) != 'undefined') {  var r = b.onclick.bind(b)(); if (r != false) {b.click();
-} } else { b.click(); };  return false;"/>
-                </div>
-<span class="search-box">
-<input type="text" value="" name="query"/>
-</span>
-                <button type="submit" id="searchButtona99" class=" button" name="searchButton"
-                        onclick="var wcall=wicketSubmitFormById('searchForma98', '../../../../webapp/?wicket:interface=:108:searchForm:searchButton::IActivePageBehaviorListener:0:3&wicket:ignoreIfNotActive=true', 'searchButton' ,function() { }.bind(this),function() { }.bind(this), function() {return Wicket.$$(this)&&Wicket.$$('searchForma98')}.bind(this));return !wcall;;">
-                    <span class='button-center'><span class='button-left'><span
-                            class='button-right'>Search</span></span></span></button>
-            </form>
-        </div>
-        <div class="user-info">
-            <span>Logged In as</span>
-            <a class="profileLink button" href="../../../../webapp/profile.html">admin</a>
-            <span> | </span>
-            <a class=" button" href="../../../../webapp/logout.html">Log Out</a>
-
-        </div>
-    </div>
-</div>
-<div id="defaultFeedbacka9a" class="aggregate-feedback default-feedback"
-     onclear="AggregateFeedbackPanel.onClear('defaultFeedbacka9a')"
-     onshow="AggregateFeedbackPanel.onShow('defaultFeedbacka9a')"></div>
-<div class="main">
-
-<div class="side-menu" id="sideMenu">
-    <div class="side-menu-top">
-        <div class="side-menu-bottom">
-            <div id="sideMenuPanela9b">
-                <ul class="menu-items">
-                    <li class="menu-group menu-group-opened">
-                        <a href="#" onclick="return SubMenuPanel.toogleMenu('menu.1.0', this);" class="opened">
-                            <span class="menu-center"></span>
-                            <span class="menu-left"></span>
-                            <span class="menu-right"></span>
-                            <span class="item-name">Browse</span>
-                        </a>
-                    </li>
-                    <li id="id2a9c" class="sub-menu-opened">
-                        <ul class="menu-items">
-                            <li class="BrowseRepoPage menu-item menu-item-enabled">
-                                <a href="../../../../webapp/browserepo.html" class="enabled">
-                                    <span class="menu-center"></span>
-                                    <span class="menu-left"></span>
-                                    <span class="menu-right"></span>
-                                    <span class="item-name">Tree Browser</span>
-                                </a>
-                            </li>
-                            <li class="SimpleBrowserRootPage menu-item menu-item-selected">
-                                <a href="../../../../webapp/simplebrowserroot.html" class="selected">
-                                    <span class="menu-center"></span>
-                                    <span class="menu-left"></span>
-                                    <span class="menu-right"></span>
-                                    <span class="item-name">Simple Browser</span>
-                                </a>
-                            </li>
-                            <li class="BrowseResultsPage menu-item menu-item-enabled">
-                                <a href="../../../../webapp/browseresults.html" class="enabled">
-                                    <span class="menu-center"></span>
-                                    <span class="menu-left"></span>
-                                    <span class="menu-right"></span>
-                                    <span class="item-name">Search Results</span>
-                                </a>
-                            </li>
-                            <li class="BuildBrowserRootPage menu-item menu-item-enabled">
-                                <a href="../../../../webapp/builds/" class="enabled">
-                                    <span class="menu-center"></span>
-                                    <span class="menu-left"></span>
-                                    <span class="menu-right"></span>
-                                    <span class="item-name">Builds</span>
-                                </a>
-                            </li>
-                        </ul>
-                    </li>
-                    <li class="menu-group menu-group-opened">
-                        <a href="#" onclick="return SubMenuPanel.toogleMenu('menu.1.1', this);" class="opened">
-                            <span class="menu-center"></span>
-                            <span class="menu-left"></span>
-                            <span class="menu-right"></span>
-                            <span class="item-name">Search</span>
-                        </a>
-                    </li>
-                    <li id="id4a9d" class="sub-menu-opened">
-                        <ul class="menu-items">
-                            <li class="ArtifactSearchPage menu-item menu-item-enabled">
-                                <a href="../../../../webapp/search/artifact" class="enabled">
-                                    <span class="menu-center"></span>
-                                    <span class="menu-left"></span>
-                                    <span class="menu-right"></span>
-                                    <span class="item-name">Quick Search</span>
-                                </a>
-                            </li>
-                            <li class="ChecksumSearchPage menu-item menu-item-enabled">
-                                <a href="../../../../webapp/checksumsearch.html" class="enabled">
-                                    <span class="menu-center"></span>
-                                    <span class="menu-left"></span>
-                                    <span class="menu-right"></span>
-                                    <span class="item-name">Checksum Search</span>
-                                </a>
-                            </li>
-                            <li class="ArchiveSearchPage menu-item menu-item-enabled">
-                                <a href="../../../../webapp/archivesearch.html" class="enabled">
-                                    <span class="menu-center"></span>
-                                    <span class="menu-left"></span>
-                                    <span class="menu-right"></span>
-                                    <span class="item-name">Class Search</span>
-                                </a>
-                            </li>
-                            <li class="GavcSearchPage menu-item menu-item-enabled">
-                                <a href="../../../../webapp/gavcsearch.html" class="enabled">
-                                    <span class="menu-center"></span>
-                                    <span class="menu-left"></span>
-                                    <span class="menu-right"></span>
-                                    <span class="item-name">GAVC Search</span>
-                                </a>
-                            </li>
-                            <li class="PropertySearchPage menu-item menu-item-enabled">
-                                <a href="../../../../webapp/propertysearch.html" class="enabled">
-                                    <span class="menu-center"></span>
-                                    <span class="menu-left"></span>
-                                    <span class="menu-right"></span>
-                                    <span class="item-name">Property Search</span>
-                                </a>
-                            </li>
-                            <li class="MetadataSearchPage menu-item menu-item-enabled">
-                                <a href="../../../../webapp/metadatasearch.html" class="enabled">
-                                    <span class="menu-center"></span>
-                                    <span class="menu-left"></span>
-                                    <span class="menu-right"></span>
-                                    <span class="item-name">POM/XML Search</span>
-                                </a>
-                            </li>
-                        </ul>
-                    </li>
-                </ul>
-            </div>
-        </div>
-    </div>
-</div>
-<div class="page-content">
-    <div class="outer-border-wrapper">
-        <div class="outer-border-top">
-            <div class="outer-border-bottom">
-                <div class="outer-border-left">
-                    <div class="outer-border-right">
-                        <div class="outer-border-top-left">
-                            <div class="outer-border-top-right">
-                                <div class="outer-border-bottom-left">
-                                    <div class="outer-border-bottom-right">
-                                        <h1 class="outer-border-title">Repository Browser</h1>
-
-                                        <div class="outer-border-content">
-
-                                            <div id="browseRepoPanela9e">
-                                                <div class="border-wrapper">
-                                                    <div class="border-top">
-                                                        <div class="border-left">
-                                                            <div class="border-right">
-                                                                <div class="border-top-left">
-                                                                    <div class="border-top-right">
-                                                                        <div class="border-bottom">
-                                                                            <div class="border-bottom-left">
-                                                                                <div class="border-bottom-right">
-                                                                                    <h2 class="border-title">
-
-
-                                                                                    </h2>
-
-                                                                                    <div class="border-content">
-
-                                                                                        <div class="bread-crumbs">
-<span class="crumb">
-<a href="http://localhost:8081/artifactory/libs-releases-local/">libs-releases-local</a>
-:
-</span><span class="crumb">
-<a href="http://localhost:8081/artifactory/libs-releases-local/org/">org</a>
-/
-</span><span class="crumb">
-<a href="http://localhost:8081/artifactory/libs-releases-local/org/jfrog/">jfrog</a>
-/
-</span><span class="crumb">
-<a href="http://localhost:8081/artifactory/libs-releases-local/org/jfrog/test/">test</a>
-/
-</span>
-
-                                                                                            <div class="clear"></div>
-                                                                                        </div>
-                                                                                        <div class="local-repos-list">
-                                                                                            <div>
-                                                                                                <a class="icon-link folder"
-                                                                                                   href="http://localhost:8081/artifactory/libs-releases-local/org/jfrog/">..</a>
-                                                                                            </div>
-                                                                                            <div>
-                                                                                                <a class="icon-link folder"
-                                                                                                   href="http://localhost:8081/artifactory/libs-releases-local/org/jfrog/test/multi1/">multi1</a>
-                                                                                            </div>
-                                                                                            <div>
-                                                                                                <a class="icon-link folder"
-                                                                                                   href="http://localhost:8081/artifactory/libs-releases-local/org/jfrog/test/multi2/">multi2</a>
-                                                                                            </div>
-                                                                                            <div>
-                                                                                                <a class="icon-link folder"
-                                                                                                   href="http://localhost:8081/artifactory/libs-releases-local/org/jfrog/test/multi3/">multi3</a>
-                                                                                            </div>
-                                                                                            <div>
-                                                                                                <a class="icon-link folder"
-                                                                                                   href="http://localhost:8081/artifactory/libs-releases-local/org/jfrog/test/multi.pom">multi.pom</a>
-                                                                                            </div>
-                                                                                        </div>
-
-                                                                                        <div class="clear"></div>
-                                                                                    </div>
-                                                                                </div>
-                                                                            </div>
-                                                                        </div>
-                                                                    </div>
-                                                                </div>
-                                                            </div>
-                                                        </div>
-                                                    </div>
-                                                </div>
-                                            </div>
-
-                                        </div>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
-</div>
-
-</div>
-</td>
-</tr>
-<tr>
-    <td class="footer">
-
-        <div class="footer">
-<span class="copywrites">
-<span>ֲ© Copyright 2013</span><a target="_blank" href="http://www.jfrog.org">JFrog Ltd.</a>
-<span name="footer" id="footera9f">sss</span>
-</span>
-            <span class="license">Artifactory Pro Power Pack - licensed to JFrog Development.</span>
-            <span class="version">Artifactory Pro Power Pack ${project.version.prop} (rev. ${timestamp})</span>
-        </div>
-    </td>
-</tr>
-</table>
-<div id="modalaa0" style="display:none">
-
-</div>
-<div id="feedbackDistributeraa1">
-    <script type="text/javascript">(function (fd) {
-        fd.init('defaultFeedbacka9a');
-        fd.showMessages();
-    })(FeedbackDistributer);
-    </script>
-</div>
-<div id="ajaxIndicatorContainer" class="ajax-indicator">
-
-    <iframe src="javascript:;"></iframe>
-
-    <div id="ajaxIndicator">
-        <div class="ajax-indicator-bg"></div>
-        <div id="ajaxIndicatorMessage" class="ajax-indicator-message">
-            <span>Loading...</span>
-        </div>
-    </div>
-</div>
-</body>
-</html>
\ No newline at end of file
diff --git a/backend/core/src/test/resources/org/artifactory/repo/remote/browse/html/bintray.html b/backend/core/src/test/resources/org/artifactory/repo/remote/browse/html/bintray.html
deleted file mode 100644
index dd7feb5..0000000
--- a/backend/core/src/test/resources/org/artifactory/repo/remote/browse/html/bintray.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<html>
-<head>
-    <script>
-        //1435578215242
-        function navi(e) {
-            location.href = e.target.href.replace('#', '');
-            e.preventDefault();
-        }
-    </script>
-</head>
-<body>
-<pre><a onclick="navi(event)" href="#ojdbc/" rel="nofollow">ojdbc/</a></pre>
-</body>
-</html>
\ No newline at end of file
diff --git a/backend/core/src/test/resources/org/artifactory/repo/remote/browse/html/hrefExample.html b/backend/core/src/test/resources/org/artifactory/repo/remote/browse/html/hrefExample.html
deleted file mode 100644
index aaf23e0..0000000
--- a/backend/core/src/test/resources/org/artifactory/repo/remote/browse/html/hrefExample.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head lang="en">
-    <meta charset="UTF-8">
-    <title>href links with both single and duplicate quotes</title>
-</head>
-<body>
-<pre>
-<a href="file.jar">file.jar</a> 15-Dec-2010 16:07    -
-<a href="file1">file1</a> 15-Dec-2010 16:07    -
-<a href='file2'>file2</a> 15-Dec-2010 16:07    -
-<a href='index.html'>index.html</a> 15-Dec-2010 16:07    - d
-</pre>
-</body>
-</html>
diff --git a/backend/core/src/test/resources/org/artifactory/repo/remote/browse/html/invalidHtml.html b/backend/core/src/test/resources/org/artifactory/repo/remote/browse/html/invalidHtml.html
deleted file mode 100644
index dbd410d..0000000
--- a/backend/core/src/test/resources/org/artifactory/repo/remote/browse/html/invalidHtml.html
+++ /dev/null
@@ -1 +0,0 @@
-<blabla
diff --git a/backend/core/src/test/resources/org/artifactory/repo/remote/browse/html/noHrefs.html b/backend/core/src/test/resources/org/artifactory/repo/remote/browse/html/noHrefs.html
deleted file mode 100644
index 49a19ed..0000000
--- a/backend/core/src/test/resources/org/artifactory/repo/remote/browse/html/noHrefs.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<html>
-<body>
-stop playing
-</body>
-</html>
-
diff --git a/backend/core/src/test/resources/org/artifactory/repo/remote/browse/html/simple.html b/backend/core/src/test/resources/org/artifactory/repo/remote/browse/html/simple.html
deleted file mode 100644
index a51284b..0000000
--- a/backend/core/src/test/resources/org/artifactory/repo/remote/browse/html/simple.html
+++ /dev/null
@@ -1 +0,0 @@
-<a class="icon-link folder" href="{placeHolder}">{placeHolder}</a>
diff --git a/backend/core/src/test/resources/org/artifactory/repo/remote/browse/s3/s3-nosuchkey.xml b/backend/core/src/test/resources/org/artifactory/repo/remote/browse/s3/s3-nosuchkey.xml
deleted file mode 100644
index 412db71..0000000
--- a/backend/core/src/test/resources/org/artifactory/repo/remote/browse/s3/s3-nosuchkey.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Error>
-    <Code>NoSuchKey</Code>
-    <Message>The specified key does not exist.</Message>
-    <Key>org/artifactory/repo/remote/browse/s3/s3-nosuchkey.xml</Key>
-    <RequestId>E69C77E280506925</RequestId>
-    <HostId>AfNsMbcTZ0kw77y06lcsMEb6oxENUr80Xa0yR2P3kRs9fajMBHr0i1NYNRtjd8mV</HostId>
-</Error>
diff --git a/backend/core/src/test/resources/org/artifactory/repo/remote/browse/s3/s3-prefix-org.springframework.xml b/backend/core/src/test/resources/org/artifactory/repo/remote/browse/s3/s3-prefix-org.springframework.xml
deleted file mode 100644
index 3ceb0c2..0000000
--- a/backend/core/src/test/resources/org/artifactory/repo/remote/browse/s3/s3-prefix-org.springframework.xml
+++ /dev/null
@@ -1,130 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--http://repository.springsource.com/?delimiter=/&prefix=maven/bundles/release/org/springframework/-->
-<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
-    <Name>repository.springsource.com</Name>
-    <Prefix>maven/bundles/release/org/springframework/</Prefix>
-    <Marker/>
-    <MaxKeys>1000</MaxKeys>
-    <Delimiter>/</Delimiter>
-    <IsTruncated>false</IsTruncated>
-    <Contents>
-        <Key>maven/bundles/release/org/springframework/</Key>
-        <LastModified>2011-02-28T14:41:46.000Z</LastModified>
-        <ETag>"d41d8cd98f00b204e9800998ecf8427e"</ETag>
-        <Size>0</Size>
-        <StorageClass>STANDARD</StorageClass>
-    </Contents>
-    <Contents>
-        <Key>maven/bundles/release/org/springframework/roo_$folder$</Key>
-        <LastModified>2009-05-27T06:56:34.000Z</LastModified>
-        <ETag>"d41d8cd98f00b204e9800998ecf8427e"</ETag>
-        <Size>0</Size>
-        <StorageClass>STANDARD</StorageClass>
-    </Contents>
-    <Contents>
-        <Key>maven/bundles/release/org/springframework/my.txt</Key>
-        <LastModified>2011-05-15T06:56:34.000Z</LastModified>
-        <ETag>"d41d8cd98f00b204e9800998ecf8427e"</ETag>
-        <Size>23</Size>
-        <StorageClass>STANDARD</StorageClass>
-    </Contents>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/batch/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/build/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/flex/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/integration/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/ldap/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/maven/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/org.springframework.aop/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/org.springframework.asm/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/org.springframework.aspects/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/org.springframework.beans/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/org.springframework.context.support/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/org.springframework.context/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/org.springframework.core/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/org.springframework.expression/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/org.springframework.instrument.classloading/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/org.springframework.instrument.tomcat/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/org.springframework.instrument/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/org.springframework.jdbc/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/org.springframework.jms/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/org.springframework.orm/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/org.springframework.oxm/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/org.springframework.test/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/org.springframework.transaction/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/org.springframework.web.portlet/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/org.springframework.web.servlet/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/org.springframework.web.struts/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/org.springframework.web/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/osgi/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/roo/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/samples/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/security/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/webflow/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven/bundles/release/org/springframework/ws/</Prefix>
-    </CommonPrefixes>
-</ListBucketResult>
diff --git a/backend/core/src/test/resources/org/artifactory/repo/remote/browse/s3/s3-terracotta.xml b/backend/core/src/test/resources/org/artifactory/repo/remote/browse/s3/s3-terracotta.xml
deleted file mode 100644
index d776904..0000000
--- a/backend/core/src/test/resources/org/artifactory/repo/remote/browse/s3/s3-terracotta.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- based on http://repo.terracotta.org/?delimiter=/&prefix=maven2/ -->
-<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
-    <Name>repo.terracotta.org</Name>
-    <Prefix>maven2/</Prefix>
-    <Marker></Marker>
-    <MaxKeys>1000</MaxKeys>
-    <Delimiter>/</Delimiter>
-    <IsTruncated>false</IsTruncated>
-    <Contents>
-        <Key>maven2/.index</Key>
-        <LastModified>2011-03-04T00:50:05.000Z</LastModified>
-        <ETag>"d66759af42f282e1ba19144df2d405d0"</ETag>
-        <Size>38</Size>
-        <StorageClass>STANDARD</StorageClass>
-    </Contents>
-    <Contents>
-        <Key>maven2/AutoComplete</Key>
-        <LastModified>2011-03-18T03:50:12.000Z</LastModified>
-        <ETag>"d66759af42f282e1ba19144df2d405d0"</ETag>
-        <Size>38</Size>
-        <StorageClass>STANDARD</StorageClass>
-    </Contents>
-    <Contents>
-        <Key>maven2/archetype-catalog.xml</Key>
-        <LastModified>2011-03-03T20:50:08.000Z</LastModified>
-        <ETag>"da82f071c0ef680112b1cbdf3bf11c72"</ETag>
-        <Size>25</Size>
-        <StorageClass>STANDARD</StorageClass>
-    </Contents>
-    <Contents>
-        <Key>maven2/com</Key>
-        <LastModified>2009-03-11T01:15:46.000Z</LastModified>
-        <ETag>"d66759af42f282e1ba19144df2d405d0"</ETag>
-        <Size>38</Size>
-        <StorageClass>STANDARD</StorageClass>
-    </Contents>
-    <Contents>
-        <Key>maven2/org</Key>
-        <LastModified>2009-03-11T01:16:45.000Z</LastModified>
-        <ETag>"d66759af42f282e1ba19144df2d405d0"</ETag>
-        <Size>38</Size>
-        <StorageClass>STANDARD</StorageClass>
-    </Contents>
-    <CommonPrefixes>
-        <Prefix>maven2/.index/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven2/AutoComplete/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven2/astra-flex/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven2/com/</Prefix>
-    </CommonPrefixes>
-    <CommonPrefixes>
-        <Prefix>maven2/org/</Prefix>
-    </CommonPrefixes>
-</ListBucketResult>
\ No newline at end of file
diff --git a/backend/core/src/test/resources/org/artifactory/repo/test-comment.md5 b/backend/core/src/test/resources/org/artifactory/repo/test-comment.md5
deleted file mode 100644
index 6f13bbc..0000000
--- a/backend/core/src/test/resources/org/artifactory/repo/test-comment.md5
+++ /dev/null
@@ -1,3 +0,0 @@
-//This is a comment
-//This is another
-asdfaeaef435345435asdf Mooo the cow
\ No newline at end of file
diff --git a/backend/core/src/test/resources/org/artifactory/repo/test-desc.md5 b/backend/core/src/test/resources/org/artifactory/repo/test-desc.md5
deleted file mode 100644
index e8e2c89..0000000
--- a/backend/core/src/test/resources/org/artifactory/repo/test-desc.md5
+++ /dev/null
@@ -1 +0,0 @@
-dasfasdf4r234234q32asdfadfasdf Mooo the cow
\ No newline at end of file
diff --git a/backend/core/src/test/resources/org/artifactory/repo/test-empty.md5 b/backend/core/src/test/resources/org/artifactory/repo/test-empty.md5
deleted file mode 100644
index e69de29..0000000
diff --git a/backend/core/src/test/resources/org/artifactory/repo/test-valid.md5 b/backend/core/src/test/resources/org/artifactory/repo/test-valid.md5
deleted file mode 100644
index 196e123..0000000
--- a/backend/core/src/test/resources/org/artifactory/repo/test-valid.md5
+++ /dev/null
@@ -1 +0,0 @@
-dasfasdf4r234234q32asdfadfasasdfasdf
\ No newline at end of file
diff --git a/backend/core/src/test/resources/org/artifactory/repo/virtual/interceptor/activeByDefault-test.pom b/backend/core/src/test/resources/org/artifactory/repo/virtual/interceptor/activeByDefault-test.pom
deleted file mode 100644
index 1add308..0000000
--- a/backend/core/src/test/resources/org/artifactory/repo/virtual/interceptor/activeByDefault-test.pom
+++ /dev/null
@@ -1,172 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
-         http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--This is a comment-->
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>org.artifactory</groupId>
-    <artifactId>artifactory-parent</artifactId>
-    <packaging>pom</packaging>
-    <version>2.1.x-SNAPSHOT</version>
-    <name>Artifactory Parent</name>
-    <url>http://artifactory.jfrog.org/</url>
-
-    <properties>
-        <artifactory.version>2.1.x-SNAPSHOT</artifactory.version>
-    </properties>
-
-    <description>
-        Artifactory is a Maven 2 enterprise repository. It offers advanced proxying, caching and security facilities to
-    </description>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.testng</groupId>
-            <artifactId>testng</artifactId>
-            <classifier>jdk15</classifier>
-        </dependency>
-    </dependencies>
-
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>commons-cli</groupId>
-                <artifactId>commons-cli</artifactId>
-                <version>1.0</version>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
-    <repositories>
-        <repository>
-            <id>jfrog-libs-releases</id>
-            <url>http://repo.jfrog.org/artifactory/libs-releases</url>
-            <snapshots>
-                <enabled>false</enabled>
-            </snapshots>
-        </repository>
-        <repository>
-            <id>jfrog-libs-snapshots</id>
-            <name>The jfrog repository for 3rd party snapshots</name>
-            <url>http://repo.jfrog.org/artifactory/libs-snapshots</url>
-            <releases>
-                <enabled>false</enabled>
-            </releases>
-        </repository>
-    </repositories>
-    <pluginRepositories>
-        <pluginRepository>
-            <id>jfrog-plugins-releases</id>
-            <url>http://repo.jfrog.org/artifactory/plugins-releases</url>
-        </pluginRepository>
-        <pluginRepository>
-            <id>jfrog-plugins-snapshots</id>
-            <url>http://repo.jfrog.org/artifactory/plugins-snapshots</url>
-        </pluginRepository>
-    </pluginRepositories>
-
-    <profiles>
-        <profile>
-            <activation>
-                <activeByDefault>false</activeByDefault>
-            </activation>
-            <id>artifactory</id>
-            <repositories>
-                <repository>
-                    <id>jfrog-libs-releases</id>
-                    <url>http://repo.jfrog.org/artifactory/libs-releases</url>
-                    <snapshots>
-                        <enabled>false</enabled>
-                    </snapshots>
-                </repository>
-                <repository>
-                    <id>jfrog-libs-snapshots</id>
-                    <name>The jfrog repository for 3rd party snapshots</name>
-                    <url>http://repo.jfrog.org/artifactory/libs-snapshots</url>
-                    <releases>
-                        <enabled>false</enabled>
-                    </releases>
-                </repository>
-            </repositories>
-            <pluginRepositories>
-                <pluginRepository>
-                    <id>jfrog-plugins-releases</id>
-                    <name>The jfrog repository for plugin releases</name>
-                    <url>http://repo.jfrog.org/artifactory/plugins-releases</url>
-                    <snapshots>
-                        <enabled>false</enabled>
-                    </snapshots>
-                </pluginRepository>
-                <pluginRepository>
-                    <id>jfrog-plugins-snapshots</id>
-                    <name>The jfrog repository for plugin snapshots</name>
-                    <url>http://repo.jfrog.org/artifactory/plugins-snapshots</url>
-                    <releases>
-                        <enabled>false</enabled>
-                    </releases>
-                </pluginRepository>
-            </pluginRepositories>
-        </profile>
-        <profile>
-            <activation>
-                <activeByDefault>true</activeByDefault>
-            </activation>
-            <id>jfrog</id>
-            <repositories>
-                <repository>
-                    <id>jfrog-libs-releases</id>
-                    <url>http://repo.jfrog.org/artifactory/libs-releases</url>
-                    <snapshots>
-                        <enabled>false</enabled>
-                    </snapshots>
-                </repository>
-                <repository>
-                    <id>jfrog-libs-snapshots</id>
-                    <name>The jfrog repository for 3rd party snapshots</name>
-                    <url>http://repo.jfrog.org/artifactory/libs-snapshots</url>
-                    <releases>
-                        <enabled>false</enabled>
-                    </releases>
-                </repository>
-            </repositories>
-            <pluginRepositories>
-                <pluginRepository>
-                    <id>jfrog-plugins-releases</id>
-                    <name>The jfrog repository for plugin releases</name>
-                    <url>http://repo.jfrog.org/artifactory/plugins-releases</url>
-                    <snapshots>
-                        <enabled>false</enabled>
-                    </snapshots>
-                </pluginRepository>
-                <pluginRepository>
-                    <id>jfrog-plugins-snapshots</id>
-                    <name>The jfrog repository for plugin snapshots</name>
-                    <url>http://repo.jfrog.org/artifactory/plugins-snapshots</url>
-                    <releases>
-                        <enabled>false</enabled>
-                    </releases>
-                </pluginRepository>
-            </pluginRepositories>
-        </profile>
-    </profiles>
-</project>
diff --git a/backend/core/src/test/resources/org/artifactory/repo/virtual/interceptor/bad.pom b/backend/core/src/test/resources/org/artifactory/repo/virtual/interceptor/bad.pom
deleted file mode 100644
index e00e207..0000000
--- a/backend/core/src/test/resources/org/artifactory/repo/virtual/interceptor/bad.pom
+++ /dev/null
@@ -1,44 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.apache</groupId>
-        <artifactId>apache</artifactId>
-        <version>4</version>
-    </parent>
-    <groupId>ant</groupId>
-    <artifactId>ant</artifactId>
-    <version>1.6.5</version>
-    <!-- Fixed per MEV-531 -->
-    <dependencies>
-        <dependency>
-            <groupId>xerces</groupId>
-            <artifactId>xercesImpl</artifactId>
-            <version>2.6.2</version>
-            <optional>true</optional>
-        </dependency>
-        <dependency>
-            <groupId>xml-apis</groupId>
-            <artifactId>xml-apis</artifactId>
-            <version>1.3.04</version>
-            <optional>true</optional>
-        </dependency>
-    </dependencies>
-</project>
diff --git a/backend/core/src/test/resources/org/artifactory/repo/virtual/interceptor/clean-test.pom b/backend/core/src/test/resources/org/artifactory/repo/virtual/interceptor/clean-test.pom
deleted file mode 100644
index 951243a..0000000
--- a/backend/core/src/test/resources/org/artifactory/repo/virtual/interceptor/clean-test.pom
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
-         http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <!--This is a comment-->
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>org.artifactory</groupId>
-    <artifactId>artifactory-parent</artifactId>
-    <packaging>pom</packaging>
-    <version>2.1.x-SNAPSHOT</version>
-    <name>Artifactory Parent</name>
-    <url>http://artifactory.jfrog.org/</url>
-
-    <properties>
-        <artifactory.version>2.1.x-SNAPSHOT</artifactory.version>
-    </properties>
-
-    <description>
-        Artifactory is a Maven 2 enterprise repository. It offers advanced proxying, caching and security facilities to
-    </description>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.testng</groupId>
-            <artifactId>testng</artifactId>
-            <classifier>jdk15</classifier>
-        </dependency>
-    </dependencies>
-
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>commons-cli</groupId>
-                <artifactId>commons-cli</artifactId>
-                <version>1.0</version>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-</project>
diff --git a/backend/core/src/test/resources/org/artifactory/security/ssh/id_rsa b/backend/core/src/test/resources/org/artifactory/security/ssh/id_rsa
deleted file mode 100644
index 05a6568..0000000
--- a/backend/core/src/test/resources/org/artifactory/security/ssh/id_rsa
+++ /dev/null
@@ -1,27 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEogIBAAKCAQEA7buI9EK+TzdeCmJVrauJ9ysqeKBF/dcmZH6PIXYDn0z9lIDR
-tocbovzvLThjWPMtIr5JucvOLE5+u38U5ElFmqdab1X112ff2I251rPlwGnsxZfW
-x+XJ2EwS9eD15L720aCueqlVmPfaiIfjgHw4CpNHAq1uhSVP6n2/s+iNBCoavYtD
-kiE6MGI5IfsMvUexT1Y+HwQ0tbjBMGZC7m5oMoVhvf8mI62mdoQpJaQJTSs8Vs6i
-jhPEimyGlbexTRfrBRGidcqZFDHFo9M8+cEadLHnDnwyQfJyKMUB/7JKAF9XaKLK
-aVkGZ4PKlz2xyB4BvHq7kX+KqW5wM0UEZG7UdwIBIwKCAQA9IZg+z1WCFY013sWT
-DtpVgCDdMIcGwkuzcQA7zeOsnsTdCy6cpmYxObnYbZXjrD7Oa3ILNGg3R2Jqukcz
-Y0xpmL97twSzu5/1200LUtSt0hhQERn441Eo/Z55vYEO70bIMKHlBvjA70bSppmW
-EVA9O9BuZxxrYV2xU4kRAUjVLucFBf4yu/tIgAMDhIrNP5AUpFCIxZnmRfDAlWY9
-OzuDvMWYw4opYAEZq6ukuRRqPaj+BeQM4O7KSsqSqlYgVLDLdh0BuPMCKmcVnvcq
-HbP8Zkwy75y/nXgir7hfWSmc0hdmdIuLv3UhDVCdI985bNH1VrRTqjnlwX6cFSwY
-feGzAoGBAP79AvvBAond9ZVxn248qx17eEq+VPzjQu2xhjy1QcbsSH3qlP/qsP/G
-qfCd4qROvXlngHR3Y6c7Lkq0q9V51R0Nx5o0IeecZg4mDz+Sm44kbOh5MHsMMFXe
-ukUDNSbmHgPLOTj32FHHI6t8ffpdx413Db+gfnxvF6Es18H9sV4dAoGBAO6s/zJh
-JzRxXl8UdJ8piPG8e2TbBBo2gkeuYiNLDWR+0I4PjilfMfe9zNXquMBE004v4fAd
-fkPKxgumrlQAMldR1Ak69eP9mJhikq38QEIlYdZA/TkwJNdRX2HClCvxSTGAwMgZ
-Jl7m83PUF8UZPXynxnePMi0SLXDgU8/OmwijAoGAQZGEbJ9YbJgpNQ6WtfJX4wJ+
-BJdXrr4YhkOXi/QYOndF1zxSMy24fEkHIJ2grehcm4+ksDv1Db7CwsC+eLjtqGKh
-CmUtSi+H9QJ48xcSDpum+fNG+xHDSUfmwUn3uYuhUW7Fkk5cMkkmbezP7+w6oLg2
-vD82d8TLj9hUvNrV1l8CgYEA59tBDF5gmVgvyhPfAQPG3DNwjdwSnR8CNwEsIkjo
-cECtVs1IRXJrDeuTyH2dh5NQ7N4Orr2QmaBonZqauAAw5xxKUhwEztkX5H0DhHFi
-/m10/ASeN43apUe7vg15/s0ih9wo/OU7N56GGL9njERnnapLxJm7tsEzdPcs2H+P
-SjcCgYEAi310ITw3B9eWU+ASz04VTtA9lDqkhs85Ua0+Ze5EyeoTtTz0NatPAkDt
-Q/lIhvTtDuv+WoK6kTv90WQrH5MaHK6TnSTDhZ9V/CeY/oLURWyiVdW22w54B65N
-cPGeYcTQ1T0hbzAdrbe5w7XCk8T+jzZDSlrDCKfBSRsTiMV7m/U=
------END RSA PRIVATE KEY-----
diff --git a/backend/core/src/test/resources/org/artifactory/security/ssh/id_rsa.pub b/backend/core/src/test/resources/org/artifactory/security/ssh/id_rsa.pub
deleted file mode 100644
index 846920c..0000000
--- a/backend/core/src/test/resources/org/artifactory/security/ssh/id_rsa.pub
+++ /dev/null
@@ -1 +0,0 @@
-ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA7buI9EK+TzdeCmJVrauJ9ysqeKBF/dcmZH6PIXYDn0z9lIDRtocbovzvLThjWPMtIr5JucvOLE5+u38U5ElFmqdab1X112ff2I251rPlwGnsxZfWx+XJ2EwS9eD15L720aCueqlVmPfaiIfjgHw4CpNHAq1uhSVP6n2/s+iNBCoavYtDkiE6MGI5IfsMvUexT1Y+HwQ0tbjBMGZC7m5oMoVhvf8mI62mdoQpJaQJTSs8Vs6ijhPEimyGlbexTRfrBRGidcqZFDHFo9M8+cEadLHnDnwyQfJyKMUB/7JKAF9XaKLKaVkGZ4PKlz2xyB4BvHq7kX+KqW5wM0UEZG7Udw==
\ No newline at end of file
diff --git a/backend/core/src/test/resources/org/artifactory/security/storage.properties b/backend/core/src/test/resources/org/artifactory/security/storage.properties
deleted file mode 100644
index de2211d..0000000
--- a/backend/core/src/test/resources/org/artifactory/security/storage.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-type=derby
-url=jdbc:derby:{db.home};create=true
-driver=org.apache.derby.jdbc.EmbeddedDriver
-binary.provider.s3.credential=test2
-binary.provider.s3.proxy.credential=test3
-password=test1
diff --git a/backend/core/src/test/resources/org/artifactory/util/versioning.xml b/backend/core/src/test/resources/org/artifactory/util/versioning.xml
deleted file mode 100644
index 59a391f..0000000
--- a/backend/core/src/test/resources/org/artifactory/util/versioning.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<artifactory>
-    <versioning>
-        <latest>
-            <version>2.0.0</version>
-            <revision>3498</revision>
-            <wikiUrl>http://wiki.jfrog.org/confluence/display/RTF</wikiUrl>
-            <downloadUrl>http://www.jfrog.org/download.php</downloadUrl>
-        </latest>
-        <release>
-            <version>2.0.0</version>
-            <revision>3498</revision>
-            <wikiUrl>http://wiki.jfrog.org/confluence/display/RTF</wikiUrl>
-            <downloadUrl>http://www.jfrog.org/download.php</downloadUrl>
-        </release>
-    </versioning>
-</artifactory>
\ No newline at end of file
diff --git a/backend/pom.xml b/backend/pom.xml
deleted file mode 100644
index a9a8e7b..0000000
--- a/backend/pom.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0          http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.artifactory</groupId>
-        <artifactId>artifactory-parent</artifactId>
-        <version>4.8.0</version>
-    </parent>
-
-    <artifactId>artifactory-backend-parent</artifactId>
-    <packaging>pom</packaging>
-    <name>Artifactory Backend Parent</name>
-
-    <modules>
-        <module>traffic</module>
-        <module>core</module>
-    </modules>
-
-</project>
diff --git a/backend/traffic/pom.xml b/backend/traffic/pom.xml
deleted file mode 100644
index 42ecdd2..0000000
--- a/backend/traffic/pom.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0          http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>artifactory-traffic</artifactId>
-    <packaging>jar</packaging>
-    <name>Artifactory Traffic</name>
-
-    <parent>
-        <artifactId>artifactory-backend-parent</artifactId>
-        <groupId>org.artifactory</groupId>
-        <version>4.8.0</version>
-    </parent>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-log</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-api</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-storage-common</artifactId>
-            <scope>runtime</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-tx</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-io</groupId>
-            <artifactId>commons-io</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-lang</groupId>
-            <artifactId>commons-lang</artifactId>
-        </dependency>
-    </dependencies>
-
-</project>
diff --git a/backend/traffic/src/main/java/org/artifactory/traffic/RequestLogger.java b/backend/traffic/src/main/java/org/artifactory/traffic/RequestLogger.java
deleted file mode 100644
index ec0558f..0000000
--- a/backend/traffic/src/main/java/org/artifactory/traffic/RequestLogger.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic;
-
-import org.artifactory.traffic.entry.RequestEntry;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Logger class for general web requests.
- * An example of log line:
- * <code>20140508154145|2632|REQUEST|82:12:13:14|admin|GET|/jcenter/org/iostreams-0.2.jar|HTTP/1.1|200|8296</code>
- * The columns are pipe delimited:
- * <ol>
- *  <li>Log entry date (the end of the request) in the format of YYYYMMDDHHMMSS</li>
- *  <li>Processing time in millis</li>
- *  <li>Request type ({@link org.artifactory.traffic.TrafficAction})</li>
- *  <li>IP address of the requesting user</li>
- *  <li>Username (non_authenticated_user for anonymous)</li>
- *  <li>The HTTP request method</li>
- *  <li>The requested resource path</li>
- *  <li>The HTTP protocol version</li>
- *  <li>HTTP response code</li>
- *  <li>Content length in byes of the response in case of HEAD and GET requests and of the request in case of PUT and POST requests</li>
- * </ol>
- *
- * @author Noam Tenne
- */
-public abstract class RequestLogger {
-    private static final Logger log = LoggerFactory.getLogger(RequestLogger.class);
-
-    private RequestLogger() {
-        // utility class
-    }
-
-    /**
-     * Logs a web request
-     *
-     * @param userAddress   Address of client machine
-     * @param username      Client Artifactory username
-     * @param method        HTTP Request method
-     * @param path          Request path
-     * @param protocol      Request protocol
-     * @param returnCode    Response status code
-     * @param contentLength Response body size for GET requests or request body size in case of PUT or POST
-     */
-    public static void request(String userAddress, String username, String method, String path, String protocol,
-            int returnCode, long contentLength, long duration) {
-        RequestEntry requestEntry = new RequestEntry(userAddress, username, method, path, protocol, returnCode,
-                contentLength, duration);
-        log.info(requestEntry.toString());
-    }
-}
\ No newline at end of file
diff --git a/backend/traffic/src/main/java/org/artifactory/traffic/TrafficAction.java b/backend/traffic/src/main/java/org/artifactory/traffic/TrafficAction.java
deleted file mode 100644
index 6bdea89..0000000
--- a/backend/traffic/src/main/java/org/artifactory/traffic/TrafficAction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic;
-
-import org.artifactory.traffic.entry.DownloadEntry;
-import org.artifactory.traffic.entry.RequestEntry;
-import org.artifactory.traffic.entry.TrafficEntry;
-import org.artifactory.traffic.entry.UploadEntry;
-
-/**
- * The different traffic action types
- */
-public enum TrafficAction {
-    REQUEST(RequestEntry.class),
-    DOWNLOAD(DownloadEntry.class),
-    UPLOAD(UploadEntry.class);
-
-    Class<? extends TrafficEntry> trafficEntryType;
-    int numberOfColumns;
-
-    /**
-     * Default constructor
-     *
-     * @param trafficEntryType TrafficEntry class associated with the action type
-     */
-    TrafficAction(Class<? extends TrafficEntry> trafficEntryType) {
-        this.trafficEntryType = trafficEntryType;
-    }
-
-    public Class<? extends TrafficEntry> getTrafficEntryType() {
-        return trafficEntryType;
-    }
-}
\ No newline at end of file
diff --git a/backend/traffic/src/main/java/org/artifactory/traffic/TrafficLogger.java b/backend/traffic/src/main/java/org/artifactory/traffic/TrafficLogger.java
deleted file mode 100644
index 0b85c60..0000000
--- a/backend/traffic/src/main/java/org/artifactory/traffic/TrafficLogger.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic;
-
-import org.artifactory.traffic.entry.TransferEntry;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Logger class for traffic events
- *
- * @author Noam Tenne
- */
-abstract class TrafficLogger {
-    private static final Logger log = LoggerFactory.getLogger(TrafficLogger.class);
-
-    private TrafficLogger() {
-        // utility class
-    }
-
-    /**
-     * Log a completed xfer (upload/download) event
-     *
-     * @param entry Traffic entry to log
-     */
-    public static void logTransferEntry(TransferEntry entry) {
-        log.info(entry.toString());
-    }
-}
\ No newline at end of file
diff --git a/backend/traffic/src/main/java/org/artifactory/traffic/TrafficService.java b/backend/traffic/src/main/java/org/artifactory/traffic/TrafficService.java
deleted file mode 100644
index 6e40b53..0000000
--- a/backend/traffic/src/main/java/org/artifactory/traffic/TrafficService.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic;
-
-import org.artifactory.traffic.entry.TrafficEntry;
-
-import java.util.Calendar;
-import java.util.List;
-
-/**
- * The main interface of the traffic service
- *
- * @author Noam Tenne
- */
-public interface TrafficService {
-    /**
-     * Get a list of traffic entries for the specified time window (edges inclusive)
-     */
-    List<TrafficEntry> getEntryList(Calendar from, Calendar to);
-
-    /**
-     * Store a new traffic entry for later processing (collection) dd
-     *
-     * @param entry
-     */
-    void handleTrafficEntry(TrafficEntry entry);
-
-    /**
-     * Get transfer usage for the specified time window (edges inclusive) filtered by ips
-     */
-    TransferUsage getTrafficUsageWithFilterCurrentNode(long startTime, long endTime, List<String> ipToFilter);
-
-    /**
-     * return true if The traffic service is active (if the traffic is collected for AOL)
-     */
-    boolean isActive();
-
-    /**
-     * Get transfer usage for the specified time window (edges inclusive) filtered by ips
-     * Case the instance is an HA instance - collect traffic from all nodes and aggregate it to TransferUsage
-     */
-    TransferUsage getTrafficUsageWithFilter(long startLong, long endLong, List<String> ipsToFilter);
-
-    void validateDateRange(Calendar startDate, Calendar endDate);
-}
\ No newline at end of file
diff --git a/backend/traffic/src/main/java/org/artifactory/traffic/TrafficUtils.java b/backend/traffic/src/main/java/org/artifactory/traffic/TrafficUtils.java
deleted file mode 100644
index a7705a7..0000000
--- a/backend/traffic/src/main/java/org/artifactory/traffic/TrafficUtils.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic;
-
-import java.util.Date;
-
-/**
- * Utility class for the traffic module
- *
- * @author Noam Tenne
- */
-public abstract class TrafficUtils {
-    private TrafficUtils() {
-        // utility class
-    }
-
-    /**
-     * Performs a comparison that checks if the date to compare is equals or before the date we want to compare to
-     *
-     * @param to Compare Date to compare
-     * @param to Compare to
-     * @return boolean - If the date to compare is equals or before the date we compare to
-     */
-    public static boolean dateEqualsBefore(Date toCompare, Date to) {
-        return toCompare.compareTo(to) < 1;
-    }
-
-    /**
-     * Performs a comparison that checks if the date to compare is equals or after the date we want to compare to
-     *
-     * @param to Compare Date to compare
-     * @param to Compare to
-     * @return boolean - If the date to compare is equals or after the date we compare to
-     */
-    public static boolean dateEqualsAfter(Date toCompare, Date to) {
-        return toCompare.compareTo(to) > -1;
-    }
-}
diff --git a/backend/traffic/src/main/java/org/artifactory/traffic/TransferUsage.java b/backend/traffic/src/main/java/org/artifactory/traffic/TransferUsage.java
deleted file mode 100644
index b4e54a8..0000000
--- a/backend/traffic/src/main/java/org/artifactory/traffic/TransferUsage.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.artifactory.traffic;
-
-/*
- * @author Lior Azar
- */
-public class TransferUsage {
-
-    private long download; // downloaded bytes (without the excluded ips)
-    private long upload;    // uploaded bytes (without the excluded ips)
-    private long excludedDownload;  // excluded download traffic in bytes
-    private long excludedUpload; // excluded upload traffic in bytes
-
-    public long getDownload() {
-        return download;
-    }
-
-    public long getUpload() {
-        return upload;
-    }
-
-    public long getExcludedDownload() {
-        return excludedDownload;
-    }
-
-    public long getExcludedUpload() {
-        return excludedUpload;
-    }
-
-    public void setDownload(long download) {
-        this.download = download;
-    }
-
-    public void setUpload(long upload) {
-        this.upload = upload;
-    }
-
-    public void setExcludedDownload(long excludedDownload) {
-        this.excludedDownload = excludedDownload;
-    }
-
-    public void setExcludedUpload(long excludedUpload) {
-        this.excludedUpload = excludedUpload;
-    }
-}
diff --git a/backend/traffic/src/main/java/org/artifactory/traffic/entry/DownloadEntry.java b/backend/traffic/src/main/java/org/artifactory/traffic/entry/DownloadEntry.java
deleted file mode 100644
index 2ef64e4..0000000
--- a/backend/traffic/src/main/java/org/artifactory/traffic/entry/DownloadEntry.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic.entry;
-
-import org.artifactory.traffic.TrafficAction;
-
-/**
- * Artifact download traffic entry
- *
- * @author Noam Tenne
- */
-public class DownloadEntry extends TransferEntry {
-
-    /**
-     * Parses the given textual entry and sets the object fields accordingly
-     *
-     * @param entry Textual entry
-     */
-    public DownloadEntry(String entry) {
-        super(entry);
-    }
-
-    /**
-     * Sets the given entry data in the relevant fields
-     *
-     * @param repoPath      Requested artifact repo path
-     * @param contentLength Requested artifact size
-     */
-    public DownloadEntry(String repoPath, long contentLength, long duration, String userAddress) {
-        super(repoPath, contentLength, duration, userAddress);
-    }
-
-    @Override
-    public TrafficAction getAction() {
-        return TrafficAction.DOWNLOAD;
-    }
-}
\ No newline at end of file
diff --git a/backend/traffic/src/main/java/org/artifactory/traffic/entry/RequestEntry.java b/backend/traffic/src/main/java/org/artifactory/traffic/entry/RequestEntry.java
deleted file mode 100644
index d79ff9d..0000000
--- a/backend/traffic/src/main/java/org/artifactory/traffic/entry/RequestEntry.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic.entry;
-
-import org.artifactory.traffic.TrafficAction;
-
-/**
- * General web request traffic entry.
- * <p/>
- * Example: 20090319110249|100|REQUEST|127.0.0.1|admin|GET|/remote-repos/antlr/antlr/2.7.6/antlr-2.7.6.jar|HTTP/1.1|200|443432
- *
- * @author Noam Tenne
- */
-public class RequestEntry extends TokenizedTrafficEntry {
-    private static final int COLUMNS_COUNT_SPEC = 10;
-
-    private String userAddress;
-    private String username;
-    private String method;
-    private String path;
-    private String protocol;
-    private int returnCode;
-    private long contentLength;
-
-    /**
-     * Parses the given textual entry and sets the object fields accordingly
-     *
-     * @param entry Textual entry
-     */
-    public RequestEntry(String entry) {
-        super(entry);
-        this.userAddress = tokens[3];
-        this.username = tokens[4];
-        this.method = tokens[5];
-        this.path = tokens[6];
-        this.protocol = tokens[7];
-        this.returnCode = Integer.parseInt(tokens[8]);
-        this.contentLength = Long.parseLong(tokens[9]);
-    }
-
-    /**
-     * Sets the given entry data in the relevant fields
-     *
-     * @param userAddress   Address of client machine
-     * @param username      Client Artifactory username
-     * @param method        HTTP Request method
-     * @param path          Request path
-     * @param protocol      Request protocol
-     * @param returnCode    Response status code
-     * @param contentLength Response body size
-     */
-    public RequestEntry(String userAddress, String username, String method, String path, String protocol,
-            int returnCode, long contentLength, long duration) {
-        super(duration);
-        this.userAddress = userAddress;
-        this.username = username;
-        this.method = method;
-        this.path = path;
-        this.protocol = protocol;
-        this.returnCode = returnCode;
-        this.contentLength = contentLength;
-    }
-
-    @Override
-    protected void initTokens() {
-        super.initTokens();
-        tokens[3] = userAddress;
-        tokens[4] = username;
-        tokens[5] = method;
-        tokens[6] = path;
-        tokens[7] = protocol;
-        tokens[8] = returnCode + "";
-        tokens[9] = contentLength + "";
-    }
-
-    @Override
-    public TrafficAction getAction() {
-        return TrafficAction.REQUEST;
-    }
-
-    @Override
-    public int getColumnsCount() {
-        return COLUMNS_COUNT_SPEC;
-    }
-
-    /**
-     * Returns the address of the client's machine
-     *
-     * @return String - Address of client machine
-     */
-    public String getUserAddress() {
-        return userAddress;
-    }
-
-    /**
-     * Returns the client's Artifactory username
-     *
-     * @return String - Client Artifactory username
-     */
-    public String getUsername() {
-        return username;
-    }
-
-    /**
-     * Returns the request method
-     *
-     * @return HTTP Request method
-     */
-    public String getMethod() {
-        return method;
-    }
-
-    /**
-     * Returns the request path
-     *
-     * @return String - Request path
-     */
-    public String getPath() {
-        return path;
-    }
-
-    /**
-     * Returns the request protocol
-     *
-     * @return String - Request protocol
-     */
-    public String getProtocol() {
-        return protocol;
-    }
-
-    /**
-     * Returns the response status code
-     *
-     * @return int - Response status code
-     */
-    public int getReturnCode() {
-        return returnCode;
-    }
-
-    /**
-     * Returns the response body size
-     *
-     * @return Response body size
-     */
-    public long getContentLength() {
-        return contentLength;
-    }
-}
diff --git a/backend/traffic/src/main/java/org/artifactory/traffic/entry/TokenizedTrafficEntry.java b/backend/traffic/src/main/java/org/artifactory/traffic/entry/TokenizedTrafficEntry.java
deleted file mode 100644
index 4a63ac1..0000000
--- a/backend/traffic/src/main/java/org/artifactory/traffic/entry/TokenizedTrafficEntry.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic.entry;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.traffic.TrafficAction;
-
-import java.util.Arrays;
-import java.util.concurrent.atomic.AtomicReference;
-
-/**
- * The main implementation of a string tokenized TrafficEntry
- *
- * @author Noam Tenne
- */
-public abstract class TokenizedTrafficEntry extends TrafficEntryBase {
-
-    /**
-     * Separates the columns of the textual entries
-     */
-    public static final String COLUMN_SEPARATOR = "|";
-
-    protected AtomicReference<String> tokenizedValue = new AtomicReference<>();
-
-    protected String[] tokens;
-
-    protected TokenizedTrafficEntry(long duration) {
-        super(duration);
-        tokens = new String[getColumnsCount()];
-    }
-
-    /**
-     * Parses the given textual entry and sets the object fields accordingly
-     *
-     * @param entry Textual entry
-     */
-    public TokenizedTrafficEntry(String entry) {
-        parseEntry(entry);
-    }
-
-    @Override
-    public String toString() {
-        //Lazy init once if null
-        tokenizedValue.compareAndSet(null, buildEntry());
-        return tokenizedValue.get();
-    }
-
-    protected void initTokens() {
-        tokens[0] = getFormattedDate();
-        tokens[1] = getDuration() + "";
-        tokens[2] = getAction().name();
-    }
-
-    /**
-     * Returns the number of info columns this type of entry should hold
-     *
-     * @return int - Entry's number of info columns
-     */
-    protected abstract int getColumnsCount();
-
-    /**
-     * Builds and returns a textual entry using the entry fields
-     *
-     * @return String - Textual entry
-     */
-    private String buildEntry() {
-        initTokens();
-        StringBuilder builder = new StringBuilder();
-        for (int i = 0; i < tokens.length; i++) {
-            builder.append(tokens[i]);
-            if (i != (tokens.length - 1)) {
-                builder.append(COLUMN_SEPARATOR);
-            }
-        }
-        return builder.toString();
-    }
-
-    /**
-     * Parses a textual entry and sets the entry fields accordingly
-     *
-     * @param entry - Textual entry
-     */
-    private void parseEntry(String entry) {
-        if (StringUtils.isEmpty(entry)) {
-            throw new IllegalArgumentException("Entry is empty");
-        }
-
-        tokens = StringUtils.split(entry, COLUMN_SEPARATOR);
-
-
-        if (tokens.length == 0) {
-            throw new IllegalArgumentException("No tokens found in entry");
-        }
-        if (!isColumnCountValid()) {
-            throw new IllegalArgumentException(
-                    "Number of entry columns does not match the entry specification." +
-                            "Expected: " + getColumnsCount() + " got: " + tokens.length + " tokens: " +
-                            Arrays.toString(tokens));
-        }
-
-        // Date should always be located in the first token
-        String dateToken = tokens[0];
-        time = ENTRY_DATE_FORMATTER.parseMillis(dateToken);
-        // Duration should always be located in the second token
-        String durationToken = tokens[1];
-        try {
-            duration = Long.parseLong(durationToken);
-        } catch (NumberFormatException e) {
-            throw new IllegalArgumentException("Invalid duration token: " + durationToken);
-        }
-    }
-
-    private boolean isColumnCountValid(){
-        TrafficAction action = getAction();
-        if(TrafficAction.REQUEST.equals(action)){
-            return (tokens.length == getColumnsCount());
-        }else{
-            return ((tokens.length == getColumnsCount()) || ((getColumnsCount() - 1) == tokens.length));
-        }
-    }
-}
diff --git a/backend/traffic/src/main/java/org/artifactory/traffic/entry/TokenizedTrafficEntryFactory.java b/backend/traffic/src/main/java/org/artifactory/traffic/entry/TokenizedTrafficEntryFactory.java
deleted file mode 100644
index 79bbb73..0000000
--- a/backend/traffic/src/main/java/org/artifactory/traffic/entry/TokenizedTrafficEntryFactory.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic.entry;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.traffic.TrafficAction;
-
-import java.lang.reflect.Constructor;
-
-/**
- * @author Yoav Landman
- */
-public abstract class TokenizedTrafficEntryFactory {
-    private TokenizedTrafficEntryFactory() {
-        // utility class
-    }
-
-    /**
-     * Initializes a new traffic entry class using a textual entry
-     *
-     * @param entry Textual entry to create into an object
-     * @return TrafficEntry - Object created from textual entry
-     */
-    public static TrafficEntry newTrafficEntry(String entry) {
-        if (StringUtils.isEmpty(entry)) {
-            throw new IllegalArgumentException("Entry is empty");
-        }
-
-        String[] entryElements = StringUtils.split(entry, TokenizedTrafficEntry.COLUMN_SEPARATOR);
-        if (entryElements.length < 3) {
-            throw new IllegalArgumentException("Entry should contain at least three elements: " + entry);
-        }
-
-        //Action specification should always be in the third column
-        String action = entryElements[2];
-        TrafficAction trafficAction = TrafficAction.valueOf(action);
-        try {
-            Constructor<? extends TrafficEntry> constructor =
-                    trafficAction.getTrafficEntryType().getConstructor(String.class);
-            //Will init the date and duration
-            return constructor.newInstance(entry);
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-}
diff --git a/backend/traffic/src/main/java/org/artifactory/traffic/entry/TrafficEntry.java b/backend/traffic/src/main/java/org/artifactory/traffic/entry/TrafficEntry.java
deleted file mode 100644
index 258e0fd..0000000
--- a/backend/traffic/src/main/java/org/artifactory/traffic/entry/TrafficEntry.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic.entry;
-
-import org.artifactory.traffic.TrafficAction;
-
-/**
- * Main interface for the traffic entry objects
- *
- * @author Noam Tenne
- */
-public interface TrafficEntry extends Comparable<TrafficEntry> {
-
-    /**
-     * Returns the entry's event date
-     *
-     * @return Entry event time in millis
-     */
-    long getTime();
-
-    /**
-     * Returns the entry's action type
-     *
-     * @return TrafficAction - Entry action type
-     */
-    TrafficAction getAction();
-
-    /**
-     * Returns the duration it took the entry's action to execute
-     *
-     * @return Execution duration in millis
-     */
-    long getDuration();
-}
\ No newline at end of file
diff --git a/backend/traffic/src/main/java/org/artifactory/traffic/entry/TrafficEntryBase.java b/backend/traffic/src/main/java/org/artifactory/traffic/entry/TrafficEntryBase.java
deleted file mode 100644
index be94cfd..0000000
--- a/backend/traffic/src/main/java/org/artifactory/traffic/entry/TrafficEntryBase.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic.entry;
-
-import org.artifactory.traffic.TrafficAction;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
-
-import java.util.concurrent.atomic.AtomicReference;
-
-/**
- * The main implementation of the TrafficEntry interface
- *
- * @author Noam Tenne
- * @author Yoav Landman
- */
-public abstract class TrafficEntryBase implements TrafficEntry {
-    protected static final DateTimeFormatter ENTRY_DATE_FORMATTER = DateTimeFormat.forPattern("yyyyMMddHHmmss");
-
-    protected long time;
-    protected long duration;
-    protected AtomicReference<String> formattedDate = new AtomicReference<>();
-
-    /**
-     * Default constructor
-     */
-    protected TrafficEntryBase() {
-        this.time = System.currentTimeMillis();
-        this.duration = 0;
-    }
-
-    protected TrafficEntryBase(long duration) {
-        this.time = System.currentTimeMillis();
-        this.duration = duration;
-    }
-
-    @Override
-    public long getTime() {
-        return time;
-    }
-
-    @Override
-    public long getDuration() {
-        return this.duration;
-    }
-
-    @Override
-    public abstract TrafficAction getAction();
-
-    /**
-     * Compares the entry by date
-     *
-     * @param that Entry to compare to
-     * @return int - Date comparison result
-     */
-    @Override
-    public int compareTo(TrafficEntry that) {
-        return Long.compare(time, that.getTime());
-    }
-
-    /**
-     * Formats the entry date (according to the textual entry format) and returns it
-     *
-     * @return String - Textual entry type formatted date
-     */
-    String getFormattedDate() {
-        //Lazy initialize if null
-        formattedDate.compareAndSet(null, ENTRY_DATE_FORMATTER.print(time));
-        return formattedDate.get();
-    }
-}
\ No newline at end of file
diff --git a/backend/traffic/src/main/java/org/artifactory/traffic/entry/TransferEntry.java b/backend/traffic/src/main/java/org/artifactory/traffic/entry/TransferEntry.java
deleted file mode 100644
index 2df4328..0000000
--- a/backend/traffic/src/main/java/org/artifactory/traffic/entry/TransferEntry.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic.entry;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.traffic.TrafficAction;
-
-/**
- * Base entry for data transfer traffic entries.
- * <p/>
- * Example:
- * <pre>
- * 20090318162747|110|UPLOAD|10.0.0.10|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|632
- * 20090319110249|7|UPLOAD|repo1-cache:antlr/antlr/2.7.6/antlr-2.7.6.jar|443432
- * </pre>
- *
- * @author Yossi Shaul
- */
-public abstract class TransferEntry extends TokenizedTrafficEntry {
-    static final int COLUMNS_COUNT_SPEC = 6;
-
-    private String repoPath;
-    private String userAddress;
-    private long contentLength;
-
-    /**
-     * Parses the given textual entry and sets the object fields accordingly
-     *
-     * @param entry Textual entry
-     */
-    public TransferEntry(String entry) {
-        super(entry);
-        int entryLength = StringUtils.split(entry, COLUMN_SEPARATOR).length;
-        if (entryLength == COLUMNS_COUNT_SPEC) {
-            userAddress = tokens[3];
-            repoPath = tokens[4];
-            contentLength = Long.parseLong(tokens[5]);
-        } else {
-            // TODO: this is to support old log format that contained no ip address. Can remove it in future version
-            userAddress = "";
-            repoPath = tokens[3];
-            contentLength = Long.parseLong(tokens[4]);
-        }
-
-    }
-
-    /**
-     * Sets the given entry data in the relevant fields
-     *
-     * @param repoPath      Requested artifact repo path
-     * @param contentLength Requested artifact size
-     */
-    public TransferEntry(String repoPath, long contentLength, long duration, String userAddress) {
-        super(duration);
-        this.userAddress = userAddress;
-        this.repoPath = repoPath;
-        this.contentLength = contentLength;
-    }
-
-    @Override
-    protected void initTokens() {
-        super.initTokens();
-        tokens[3] = userAddress + "";
-        tokens[4] = repoPath;
-        tokens[5] = contentLength + "";
-    }
-
-    @Override
-    public TrafficAction getAction() {
-        return TrafficAction.UPLOAD;
-    }
-
-    @Override
-    public int getColumnsCount() {
-        return COLUMNS_COUNT_SPEC;
-    }
-
-    /**
-     * Returns the requested artifact's repo path
-     *
-     * @return String - Repo path of requested artifact
-     */
-    public String getRepoPath() {
-        return repoPath;
-    }
-
-    /**
-     * Returns the requested artifact's size
-     *
-     * @return long - Size of requested artifact
-     */
-    public long getContentLength() {
-        return contentLength;
-    }
-
-    /**
-     * Returns the address of the client's machine
-     *
-     * @return String - Address of client machine
-     */
-    public String getUserAddress() {
-        return userAddress;
-    }
-}
diff --git a/backend/traffic/src/main/java/org/artifactory/traffic/entry/UploadEntry.java b/backend/traffic/src/main/java/org/artifactory/traffic/entry/UploadEntry.java
deleted file mode 100644
index 4f5f677..0000000
--- a/backend/traffic/src/main/java/org/artifactory/traffic/entry/UploadEntry.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic.entry;
-
-import org.artifactory.traffic.TrafficAction;
-
-/**
- * Artifact upload traffic entry
- *
- * @author Noam Tenne
- */
-public class UploadEntry extends TransferEntry {
-
-    /**
-     * Parses the given textual entry and sets the object fields accordingly
-     *
-     * @param entry Textual entry
-     */
-    public UploadEntry(String entry) {
-        super(entry);
-    }
-
-    /**
-     * Sets the given entry data in the relevant fields
-     *
-     * @param repoPath      Requested artifact repo path
-     * @param contentLength Requested artifact size
-     */
-    public UploadEntry(String repoPath, long contentLength, long duration, String userAddress) {
-        super(repoPath, contentLength, duration, userAddress);
-    }
-
-    @Override
-    public TrafficAction getAction() {
-        return TrafficAction.UPLOAD;
-    }
-}
\ No newline at end of file
diff --git a/backend/traffic/src/main/java/org/artifactory/traffic/policy/TrafficTimeBasedRollingPolicy.java b/backend/traffic/src/main/java/org/artifactory/traffic/policy/TrafficTimeBasedRollingPolicy.java
deleted file mode 100644
index 076cdc7..0000000
--- a/backend/traffic/src/main/java/org/artifactory/traffic/policy/TrafficTimeBasedRollingPolicy.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic.policy;
-
-import ch.qos.logback.core.rolling.RolloverFailure;
-import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
-import ch.qos.logback.core.rolling.helper.RenameUtil;
-
-import java.io.File;
-
-/**
- * Overrides the TimeBasedRollingPolicy, to enable the addition of the start and end times of each log file, to their
- * name.
- * <p/>
- * When starting up the logger for the first time, we take out the base log file name from the XML:<br>
- * $ARTIFACTORY_HOME/logs/traffic<br> We then check to see if the startedTime field is set (shouldn't be), and set it as
- * the current time.<br> We override the ch.qos.logback.core.rolling.TimeBasedRollingPolicy#getActiveFileName() method,
- * so it will return the base file name (traffic), after appending to it the startedTime and the log suffix, resulting
- * in:<br> $ARTIFACTORY_HOME/logs/traffic.SOMETIME_LONG.log<br> </P>
- * <p/>
- * When a rollover should occur, the overriden ch.qos.logback.core.rolling.TimeBasedRollingPolicy#rollover() method,
- * keeps aside the content of the startedTime field, sets it's new value to the current time, and the renames the
- * current active log file to:<br> $ARTIFACTORY_HOME/logs/traffic.OLD_START_TIME_LONG-NEW_START_TIME_LONG.log<br> After
- * several rollovers, these actions shold result in a list of logs as such:<br> <UL>
- * <LI>$ARTIFACTORY_HOME/logs/traffic.SOMETIME_LONG-SOMETIME_LONG.log</LI> <LI>$ARTIFACTORY_HOME/logs/traffic.SOMETIME_LONG-SOMETIME_LONG.log</LI>
- * <LI>$ARTIFACTORY_HOME/logs/traffic.SOMETIME_LONG-SOMETIME_LONG.log</LI> <LI>$ARTIFACTORY_HOME/logs/traffic.SOMETIME_LONG.log</LI>
- * </UL> </P>
- * <p/>
- * If the logger will be stopped, and started again, the overriden ch.qos.logback.core.rolling.TimeBasedRollingPolicy#start()
- * method, will first search the log dir for a last active log file (traffic.SOMETIME_LONG.log), take it's time value
- * from the name, and set it in the startedTime field, So it will continue the last log that was started, but not rolled
- * over.<br> In a case when a last active log file will not be found, it will create a new one, with the current time,
- * at the startedTime field. </P>
- *
- * @author Noam Tenne
- */
-public class TrafficTimeBasedRollingPolicy extends TimeBasedRollingPolicy {
-
-    /**
-     * Log suffix
-     */
-    private static final String LOG_EXT = ".log";
-
-    /**
-     * Date seperator
-     */
-    private static final String TS_SEP = "-";
-
-    /**
-     * Start time of the currently active log. Accessible by tests
-     */
-    long startedTime;
-
-    /**
-     * Create a local instance of util, since it is private in the super class
-     */
-    RenameUtil util = new RenameUtil();
-
-    /**
-     * Path of currently active log file
-     */
-    String activeLogFilePath;
-
-    @Override
-    public void start() {
-        super.start();
-
-        //Get active log file from XML, if we don't already have it
-        if (activeLogFilePath == null) {
-            activeLogFilePath = getParentsRawFileProperty();
-        }
-
-        //Sanity check
-        if (activeLogFilePath == null) {
-            throw new IllegalStateException("Appender file name must be set.");
-        }
-
-        //Set the LR for our utility object
-        util.setContext(this.context);
-
-        //If we do not have the log start date
-        if (startedTime == 0) {
-
-            //Search the directory of the active log file, to see if we can locate the last active one (and continue it)
-            File logsDir = new File(activeLogFilePath).getParentFile();
-            final File[] logDirContent = logsDir.listFiles();
-            for (File currentlyCheckedFile : logDirContent) {
-                if (findLastActiveLogFile(currentlyCheckedFile)) {
-                    return;
-                }
-            }
-
-            //If last log file is not found, start it off with the current time
-            startedTime = System.currentTimeMillis();
-        }
-    }
-
-    /**
-     * Finds and sets the correct log start time in the last active log file. Searches for the last active log file
-     * which hasn't been rolled over, and if it will be found, the timestamp Will be taken and set as the current log
-     * file start time
-     *
-     * @param currentlyCheckedFile File to validate as a last active traffic log, to find the correct start time
-     * @return boolean - True if last active log file found, false it not.
-     */
-    private boolean findLastActiveLogFile(File currentlyCheckedFile) {
-        if (currentlyCheckedFile != null) {
-            String currentFileName = currentlyCheckedFile.getName();
-            String activeLogFileName = new File(activeLogFilePath).getName();
-
-            //Sanity checks
-            if ((currentFileName.length() == 0) || (activeLogFileName.length() == 0)) {
-                return false;
-            }
-
-            /**
-             * -If the currently checked file is actually a file.
-             * -If it begins with the same path and prefix as the XML specified active file (means it's a traffic log).
-             * -If it does not contain the date seperator '-' (means it's a log file that hasn't rolled over yet.
-             * -If it ends with the log extension (*.log)
-             */
-            if (currentlyCheckedFile.isFile() && currentFileName.startsWith(activeLogFileName) &&
-                    !currentFileName.contains(TS_SEP) && currentFileName.endsWith(LOG_EXT)) {
-                try {
-                    //Strip the start-time stamp from the last active log file
-                    String startedStr = currentFileName
-                            .substring(activeLogFileName.length() + 1, currentFileName.length() - LOG_EXT.length());
-
-                    //Set the stripped time as the start time of the currently active log
-                    startedTime = Long.parseLong(startedStr);
-                    return true;
-                } catch (Exception e) {
-                    //Bad file name - just continue scanning
-                }
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Return the last active log file name, after we append to it the last documented start date, and the log
-     * extension
-     *
-     * @return String - Last active log file name
-     */
-    @Override
-    public String getActiveFileName() {
-        return activeLogFilePath + "." + startedTime + LOG_EXT;
-    }
-
-    /**
-     * Rollover current log file name, after we append the rollover time to it (so we can know the time each file
-     * covers
-     *
-     * @throws RolloverFailure
-     */
-    @Override
-    public void rollover() throws RolloverFailure {
-        //Get last active file name (to rename it)
-        String prevActiveFileName = getActiveFileName();
-
-        //Keep last start date, since we update it now
-        long previousStarted = startedTime;
-        startedTime = System.currentTimeMillis();
-
-        //Rename append start and end time to the last active file name
-        util.rename(prevActiveFileName, activeLogFilePath + "." + previousStarted + TS_SEP + startedTime + LOG_EXT);
-    }
-}
diff --git a/backend/traffic/src/main/java/org/artifactory/traffic/read/TrafficReader.java b/backend/traffic/src/main/java/org/artifactory/traffic/read/TrafficReader.java
deleted file mode 100644
index a25dcca..0000000
--- a/backend/traffic/src/main/java/org/artifactory/traffic/read/TrafficReader.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic.read;
-
-import com.google.common.base.Charsets;
-import com.google.common.collect.Lists;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.io.filefilter.AbstractFileFilter;
-import org.apache.commons.io.filefilter.DirectoryFileFilter;
-import org.apache.commons.io.filefilter.IOFileFilter;
-import org.artifactory.traffic.entry.TrafficEntry;
-
-import javax.annotation.Nullable;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-
-import static org.artifactory.traffic.TrafficUtils.dateEqualsAfter;
-import static org.artifactory.traffic.TrafficUtils.dateEqualsBefore;
-
-/**
- * Traffic entry log file reader
- *
- * @author Noam Tenne
- */
-public class TrafficReader {
-    public static final String LOG_PREFIX = "traffic.";
-    public static final String LOG_SUFFIX = ".log";
-    File logDir;
-
-    /**
-     * Default constructor
-     *
-     * @param logDir Directory to search for logs in
-     */
-    public TrafficReader(File logDir) {
-        if ((logDir == null) || !logDir.exists() || !logDir.isDirectory()) {
-            throw new IllegalArgumentException("Log directory must be valid.");
-        }
-        this.logDir = logDir;
-    }
-
-    public List<TrafficEntry> getEntries(@Nullable Calendar from, @Nullable Calendar to) {
-        //If from is null get all entries from the epoch, if to is null get all entries up to now
-        Date fromDate = from != null ? from.getTime() : new Date(0);
-        Date toDate = to != null ? to.getTime() : new Date();
-        return getEntries(fromDate, toDate);
-    }
-
-    /**
-     * Returns a list of traffic entries relevant to the given time window - using the traffic stream parser
-     *
-     * @param startDate Time window start date
-     * @param endDate   Time window end date
-     * @return List<TrafficEntry> - List of TrafficEntry object relevant to the given time window
-     */
-    public List<TrafficEntry> getEntries(Date startDate, Date endDate) {
-        validateDateRange(startDate, endDate);
-
-        Collection<File> trafficLogs = readFiles(startDate, endDate);
-
-        List<TrafficEntry> entries = new ArrayList<>();
-        Reader reader = null;
-        for (File trafficLog : trafficLogs) {
-            try {
-                reader = new InputStreamReader(new FileInputStream(trafficLog), Charsets.UTF_8);
-                entries.addAll(TrafficStreamParser.parse(reader, startDate, endDate));
-            } catch (FileNotFoundException e) {
-                throw new IllegalStateException(e);
-            } catch (IOException e) {
-                throw new RuntimeException(e);
-            } finally {
-                IOUtils.closeQuietly(reader);
-            }
-        }
-        Collections.sort(entries);
-
-        return entries;
-    }
-
-    /**
-     * Writes the entire content of the traffic entry log files which are relevant to the given time window, into the
-     * given output stream
-     *
-     * @param outputStream Stream to write log file contents to
-     * @param startDate    Time window start date
-     * @param endDate      Time window end date
-     * @return long - Total amount of characters written to the output stream
-     */
-    public long writeFileToStream(OutputStream outputStream, Date startDate, Date endDate) {
-        validateDateRange(startDate, endDate);
-
-        if (outputStream == null) {
-            throw new IllegalArgumentException("Output stream cannot be null.");
-        }
-
-        Collection<File> trafficLogs = readFiles(startDate, endDate);
-        OutputStreamWriter writer = new OutputStreamWriter(outputStream, Charsets.UTF_8);
-        long totalCharsWritten = 0;
-
-        for (File trafficLog : trafficLogs) {
-            Reader fileReader = null;
-            try {
-                fileReader = new InputStreamReader(new FileInputStream(trafficLog), Charsets.UTF_8);
-                int charsCopied = IOUtils.copy(fileReader, writer);
-                totalCharsWritten += charsCopied;
-                writer.flush();
-            } catch (FileNotFoundException e) {
-                throw new IllegalStateException(e);
-            } catch (IOException e) {
-                throw new RuntimeException(e);
-            } finally {
-                IOUtils.closeQuietly(fileReader);
-            }
-        }
-
-        return totalCharsWritten;
-    }
-
-    /**
-     * Returns a collection of traffic entry log files which are relevant to the given time window
-     *
-     * @param startDate Time window start date
-     * @param endDate   Time window end date
-     * @return Collection<File> - Collection of file objects that represent the traffic entry log files which are
-     *         relevant to the given time window
-     */
-    public Collection<File> readFiles(Date startDate, Date endDate) {
-        IOFileFilter trafficLogFileFilter = new AbstractFileFilter() {
-            @Override
-            public boolean accept(File file) {
-                String logFileName = file.getName();
-                return logFileName.contains(LOG_PREFIX) && logFileName.contains(LOG_SUFFIX);
-            }
-        };
-        Collection<File> collection = FileUtils.listFiles(logDir, trafficLogFileFilter, DirectoryFileFilter.DIRECTORY);
-        List<File> trafficLogFiles = Lists.newArrayList(collection);
-        Collections.sort(trafficLogFiles);
-        List<File> selectedFiles = new ArrayList<>();
-        for (File logFile : trafficLogFiles) {
-            Date[] logFileDates = getLogFileDates(logFile);
-
-            //Sanity check
-            if (logFileDates.length != 2) {
-                throw new RuntimeException("Could not read log file dates.");
-            }
-
-            //Sanity check
-            Date logFileStartDate = logFileDates[0];
-            Date logFileEndDate = logFileDates[1];
-            if ((logFileStartDate == null) || (logFileEndDate == null)) {
-                throw new RuntimeException("Log file dates cannot be null.");
-            }
-
-            boolean withinRange = isDateWithinRange(logFileStartDate, logFileEndDate, startDate, endDate);
-            if (withinRange) {
-                selectedFiles.add(logFile);
-            }
-        }
-        return selectedFiles;
-    }
-
-    /**
-     * Returns a date array containing the start and end dates of the given log file
-     *
-     * @param logFile Log file to check
-     * @return Date[] - Start and end date of give log file
-     */
-    private Date[] getLogFileDates(File logFile) {
-        //Create default sized date array to return
-        Date[] logDates = new Date[2];
-        String logFileName = logFile.getName();
-        if ((logFileName != null) && (logFileName.length() != 0)) {
-            try {
-                //Extract the date range from the log file name
-                String logTimeRange =
-                        logFileName.substring(LOG_PREFIX.length(), (logFileName.length() - LOG_SUFFIX.length()));
-
-                //Split the date range. Array will have only one item, if it is the current active log file
-                String[] logTimes = logTimeRange.split("-");
-
-                //Iterate over default date array for using its default size
-                for (int i = 0; i < logDates.length; i++) {
-
-                    //If the index does not exist in the time range, insert a default date
-                    if (i >= logTimes.length) {
-                        logDates[i] = new Date();
-                        continue;
-                    }
-                    logDates[i] = new Date(Long.parseLong(logTimes[i]));
-                }
-            } catch (IndexOutOfBoundsException ioobe) {
-                //If the splitting of the file name has failed, return a default date array
-                Date currentTime = new Date();
-                return new Date[]{currentTime, currentTime};
-            }
-        }
-
-        return logDates;
-    }
-
-    /**
-     * Check if the traffic log file dates are within range of the given time window
-     *
-     * @param logStartDate Log file start date
-     * @param logEndDate   Log file end date
-     * @param startDate    Time window start date
-     * @param endDate      Time window end date
-     * @return boolean - True if log file dates are within time window range. False if not
-     */
-    private boolean isDateWithinRange(Date logStartDate, Date logEndDate, Date startDate, Date endDate) {
-        if ((logStartDate != null) && (logEndDate != null)) {
-            /**
-             * Scenario: Log file starts after time window starts and ends after time window ends
-             *
-             * Log start date = 01/03
-             * Log end date = 31/03
-             * Request start date = 20/02
-             * Request end date = 20/03
-             */
-            if ((dateEqualsBefore(startDate, logStartDate) && dateEqualsAfter(endDate, logStartDate)) ||
-                    /**
-                     * Scenario: Log file starts before time window starts and ends after time window ends
-                     *
-                     * Log start date = 01/03
-                     * Log end date = 31/03
-                     * Request start date = 10/03
-                     * Request end date = 20/03
-                     */
-                    (dateEqualsAfter(startDate, logStartDate)) && (dateEqualsBefore(endDate, logEndDate)) ||
-                    /**
-                     * Scenario: Log file starts before time window starts and ends after time window starts
-                     *
-                     * Log start date = 01/03
-                     * Log end date = 31/03
-                     * Request start date = 10/03
-                     */
-                    (dateEqualsAfter(startDate, logStartDate) && dateEqualsBefore(startDate, logEndDate)) ||
-                    /**
-                     * Scenario: Log file starts before time window ends and ends after time window ends
-                     *
-                     * Log start date = 01/03
-                     * Log end date = 31/03
-                     * Request end date = 10/03
-                     */
-                    (dateEqualsAfter(endDate, logStartDate) && dateEqualsBefore(endDate, logEndDate))) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Checks that neither of the given dates are null, and that the given start date's value isn't higher than the
-     * given end date's value
-     *
-     * @param startDate Start date to check
-     * @param endDate   End date to check
-     */
-    private void validateDateRange(Date startDate, Date endDate) {
-        if ((startDate == null) || (endDate == null)) {
-            throw new IllegalArgumentException("Traffic dates cannot be null.");
-        }
-        if (startDate.after(endDate)) {
-            throw new IllegalArgumentException("Traffic start date cannot be after end date.");
-        }
-    }
-}
diff --git a/backend/traffic/src/main/java/org/artifactory/traffic/read/TrafficStreamParser.java b/backend/traffic/src/main/java/org/artifactory/traffic/read/TrafficStreamParser.java
deleted file mode 100644
index f022af8..0000000
--- a/backend/traffic/src/main/java/org/artifactory/traffic/read/TrafficStreamParser.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic.read;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.traffic.entry.TokenizedTrafficEntryFactory;
-import org.artifactory.traffic.entry.TrafficEntry;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.Reader;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-/**
- * Textual traffic entry parser
- *
- * @author Noam Tenne
- */
-public abstract class TrafficStreamParser {
-    private TrafficStreamParser() {
-        // utility class
-    }
-
-    /**
-     * Parses a stream of textual traffic entries, converts them to traffic entry objects, and returns a list of the
-     * objects that are relevant to the given time window
-     *
-     * @param entries   Stream of textual entries
-     * @param startDate Time window start date
-     * @param endDate   Time window end date
-     * @return List<TrafficEntry> - List of TrafficEntry object relevant to the given time window
-     * @throws IOException
-     */
-    public static List<TrafficEntry> parse(Reader entries, Date startDate, Date endDate) throws IOException {
-        //Perform some sanity checks
-        if (entries == null) {
-            throw new IllegalArgumentException("Entry reader cannot be null");
-        }
-        if ((startDate == null) || (endDate == null)) {
-            throw new IllegalArgumentException("Traffic dates cannot be null.");
-        }
-        if (startDate.after(endDate)) {
-            throw new IllegalArgumentException("Traffic start date cannot be after end date.");
-        }
-
-        BufferedReader source = null;
-        try {
-            source = new BufferedReader(entries);
-            List<TrafficEntry> entryList = new ArrayList<>();
-            String entryRow;
-            while ((entryRow = source.readLine()) != null) {
-                if (StringUtils.isNotBlank(entryRow)) {
-                    TrafficEntry trafficEntry = TokenizedTrafficEntryFactory.newTrafficEntry(entryRow);
-                    if (isWithinDateRange(trafficEntry, startDate, endDate)) {
-                        entryList.add(trafficEntry);
-                    } else if (trafficEntry.getTime() >= endDate.getTime()) {
-                        // file entries are sorted, once we reach an entry after the endDate we can stop parsing
-                        break;
-                    }
-                }
-            }
-            return entryList;
-        } finally {
-            IOUtils.closeQuietly(entries);
-            IOUtils.closeQuietly(source);
-        }
-    }
-
-    /**
-     * Checks if the given traffic entry is relevant to the given time window
-     *
-     * @param baseEntry Entry to check
-     * @param startDate Time window start date
-     * @param endDate   Time window end date
-     * @return boolean - True if the given entry is relevant to the given time window. False if not
-     */
-    private static boolean isWithinDateRange(TrafficEntry baseEntry, Date startDate, Date endDate) {
-        long entryTime = baseEntry.getTime();
-        return startDate.getTime() <= entryTime && entryTime < endDate.getTime();
-    }
-}
diff --git a/backend/traffic/src/test/java/org/artifactory/traffic/TrafficActionTest.java b/backend/traffic/src/test/java/org/artifactory/traffic/TrafficActionTest.java
deleted file mode 100644
index 858987c..0000000
--- a/backend/traffic/src/test/java/org/artifactory/traffic/TrafficActionTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic;
-
-import org.artifactory.traffic.entry.DownloadEntry;
-import org.artifactory.traffic.entry.RequestEntry;
-import org.artifactory.traffic.entry.TokenizedTrafficEntryFactory;
-import org.artifactory.traffic.entry.TrafficEntry;
-import org.artifactory.traffic.entry.UploadEntry;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * Unit test for the TrafficAction enum
- *
- * @author Noam Tenne
- */
- at Test
-public class TrafficActionTest {
-
-    /**
-     * Construct a request entry with an expression using the TrafficAction
-     */
-    public void testRequestAction() {
-        String entry = "20090319110249|10|REQUEST|127.0.0.1|admin|GET|/remote-repos/antlr/antlr/2.7.6/antlr-2.7.6.jar" +
-                "|HTTP/1.1|200|443432";
-        TrafficEntry trafficEntry = TokenizedTrafficEntryFactory.newTrafficEntry(entry);
-        Assert.assertNotNull(trafficEntry);
-        Assert.assertEquals(trafficEntry.getAction(), TrafficAction.REQUEST);
-        Assert.assertTrue(trafficEntry instanceof RequestEntry);
-    }
-
-    /**
-     * Construct a download entry with an expression using the TrafficAction
-     */
-    public void testDownloadAction() {
-        String entry = "20090319110249|10|DOWNLOAD|127.0.0.1|repo1:antlr/antlr/2.7.6/antlr-2.7.6.jar|443432";
-        TrafficEntry trafficEntry = TokenizedTrafficEntryFactory.newTrafficEntry(entry);
-        Assert.assertNotNull(trafficEntry);
-        Assert.assertEquals(trafficEntry.getAction(), TrafficAction.DOWNLOAD);
-        Assert.assertTrue(trafficEntry instanceof DownloadEntry);
-    }
-
-    /**
-     * Construct an upload entry with an expression using the TrafficAction
-     */
-    public void testUploadAction() {
-        String entry = "20090319110249|10|UPLOAD|127.0.0.1|repo1-cache:antlr/antlr/2.7.6/antlr-2.7.6.jar|443432";
-        TrafficEntry trafficEntry = TokenizedTrafficEntryFactory.newTrafficEntry(entry);
-        Assert.assertNotNull(trafficEntry);
-        Assert.assertEquals(trafficEntry.getAction(), TrafficAction.UPLOAD);
-        Assert.assertTrue(trafficEntry instanceof UploadEntry);
-    }
-}
diff --git a/backend/traffic/src/test/java/org/artifactory/traffic/TrafficTest.java b/backend/traffic/src/test/java/org/artifactory/traffic/TrafficTest.java
deleted file mode 100644
index 6c18e20..0000000
--- a/backend/traffic/src/test/java/org/artifactory/traffic/TrafficTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic;
-
-import ch.qos.logback.classic.Logger;
-import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.joran.JoranConfigurator;
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.Appender;
-import ch.qos.logback.core.joran.spi.JoranException;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.traffic.entry.DownloadEntry;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.net.URL;
-
-/**
- * @author Noam Tenne
- */
-public class TrafficTest {
-
-    @BeforeClass
-    public void setUp() throws JoranException {
-        URL logConfigResource = getClass().getResource("/org/artifactory/traffic/logback.xml");
-        File logConfigFile = new File(logConfigResource.getFile());
-        Assert.assertNotNull(logConfigFile, "Cannot locate logback configuration file.");
-        Assert.assertTrue(logConfigFile.exists(), "Cannot locate logback configuration file.");
-
-        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
-        JoranConfigurator configurator = new JoranConfigurator();
-        configurator.setContext(lc);
-        lc.stop();
-        configurator.doConfigure(logConfigFile);
-        Logger logger = lc.getLogger(TrafficLogger.class);
-        Appender<ILoggingEvent> appender = logger.getAppender("TRAFFIC");
-
-        System.out.println(appender);
-    }
-
-    @Test
-    public void testTrafficLog() {
-        TrafficLogger.logTransferEntry(new DownloadEntry(
-                InfoFactoryHolder.get().createRepoPath("moo", "moo").getId(), 1L, 0L, "127.0.0.1"));
-    }
-}
\ No newline at end of file
diff --git a/backend/traffic/src/test/java/org/artifactory/traffic/entry/BaseEntryBehaviorTest.java b/backend/traffic/src/test/java/org/artifactory/traffic/entry/BaseEntryBehaviorTest.java
deleted file mode 100644
index 487f687..0000000
--- a/backend/traffic/src/test/java/org/artifactory/traffic/entry/BaseEntryBehaviorTest.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic.entry;
-
-import org.testng.annotations.Test;
-
-/**
- * Unit test for the behavior of the traffic's BaseEntry object
- *
- * @author Noam Tenne
- */
- at Test
-public class BaseEntryBehaviorTest {
-
-    /**
-     * Try to create a download entry with a null expression
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testNullDownloadEntry() {
-        new DownloadEntry(null);
-    }
-
-    /**
-     * Try to create an upload entry with an empty expression
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testEmptyUploadEntry() {
-        new UploadEntry("");
-    }
-
-    /**
-     * Try to create a request entry with an expression that contains no data
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testNoDataRequestEntry() {
-        new RequestEntry("|||");
-    }
-
-    /**
-     * Try to create a download entry with an expression that doesn't have enough columns
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testShortDownloadEntry() {
-        new DownloadEntry("20090318162747|UPLOAD|127.0.0.1|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom");
-    }
-
-    /**
-     * Try to create an upload entry with an expression that has too many columns
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testLongUploadEntry() {
-        new UploadEntry("20090318162747|UPLOAD|127.0.0.1|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|632|MOO");
-    }
-
-    /**
-     * Try to create a request entry that contains an invalid date
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testInvalidRequestEntryDate() {
-        new RequestEntry("200903a816l747|UPLOAD|127.0.0.1|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|632");
-    }
-
-    /**
-     * Try to create a download entry that contains a date in an invalid format
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testInvalidDownloadEntryDateFormat() {
-        new DownloadEntry("2-00---78|UPLOAD|127.0.0.1|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|632");
-    }
-}
diff --git a/backend/traffic/src/test/java/org/artifactory/traffic/entry/RequestEntryTest.java b/backend/traffic/src/test/java/org/artifactory/traffic/entry/RequestEntryTest.java
deleted file mode 100644
index 3ceb752..0000000
--- a/backend/traffic/src/test/java/org/artifactory/traffic/entry/RequestEntryTest.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic.entry;
-
-import org.artifactory.traffic.TrafficAction;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Unit test for the traffic's RequestEntry object
- *
- * @author Noam Tenne
- */
- at Test
-public class RequestEntryTest {
-
-    /**
-     * Creates a new entry with the data constructor, and compares it's string representation with it's equivalent entry
-     * Expression
-     */
-    public void requestEntryToString() {
-        String userAddress = "127.0.0.1";
-        String username = "admin";
-        String method = "GET";
-        String path = "/remote-repos/antlr/antlr/2.7.6/antlr-2.7.6.jar";
-        String protocol = "HTTP/1.1";
-        int returnCode = 200;
-        int contentLength = 443432;
-        RequestEntry requestEntry = new RequestEntry(userAddress, username, method,
-                path, protocol, returnCode, contentLength, 10);
-
-        assertEquals(requestEntry.getDuration(), 10, "Duration should be equal");
-        assertEquals(requestEntry.getAction(), TrafficAction.REQUEST, "Entry action should be equal");
-        assertEquals(requestEntry.getUserAddress(), userAddress, "Entry user addresses should be equal");
-        assertEquals(requestEntry.getUsername(), username, "Entry usernames should be equal");
-        assertEquals(requestEntry.getMethod(), method, "Entry methods should be equal");
-        assertEquals(requestEntry.getPath(), path, "Entry paths should be equal");
-        assertEquals(requestEntry.getProtocol(), protocol, "Entry protocols should be equal");
-        assertEquals(requestEntry.getReturnCode(), returnCode, "Entry return codes should be equal");
-        assertEquals(requestEntry.getContentLength(), contentLength, "Entry return codes should be equal");
-
-        String expected = requestEntry.getFormattedDate()
-                + "|10|REQUEST|127.0.0.1|admin|GET|/remote-repos/antlr/antlr/2.7.6/antlr-2.7.6.jar|HTTP/1.1|200|443432";
-
-        assertEquals(requestEntry.toString(), expected, "Entry expressions should be equal");
-    }
-
-    /**
-     * Creates a new entry using an entry expression, and validates it
-     */
-    public void stringToRequestEntry() {
-        String entry =
-                "20090319110249|10|REQUEST|127.0.0.1|admin|GET|/remote-repos/antlr/antlr/2.7.6/antlr-2.7.6.jar|" +
-                        "HTTP/1.1|200|443432";
-        RequestEntry requestEntry = new RequestEntry(entry);
-
-        assertEquals(entry, requestEntry.toString(), "Entry expressions should be equal");
-        assertEquals(requestEntry.getDuration(), 10, "Duration should be equal");
-        assertEquals(requestEntry.getAction(), TrafficAction.REQUEST, "Entry action should be equal");
-        assertEquals(requestEntry.getUserAddress(), "127.0.0.1", "Entry user addresses should be equal");
-        assertEquals(requestEntry.getUsername(), "admin", "Entry usernames should be equal");
-        assertEquals(requestEntry.getMethod(), "GET", "Entry methods should be equal");
-        assertEquals(requestEntry.getPath(), "/remote-repos/antlr/antlr/2.7.6/antlr-2.7.6.jar",
-                "Entry paths should be equal");
-        assertEquals(requestEntry.getProtocol(), "HTTP/1.1", "Entry protocols should be equal");
-        assertEquals(requestEntry.getReturnCode(), 200, "Entry return codes should be equal");
-        assertEquals(requestEntry.getContentLength(), 443432, "Entry return codes should be equal");
-    }
-
-    /**
-     * Creates a new entry using an entry expression with an invalid content length
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testInvalidReturnCode() {
-        new UploadEntry("20090319110249|REQUEST|127.0.0.1|admin|GET|/remote-repos/antlr/antlr/2.7.6/antlr-2.7.6.jar|" +
-                "HTTP/1.1|2a00z|443432");
-    }
-
-    /**
-     * Creates a new entry using an entry expression with an invalid content length
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testInvalidContentLength() {
-        new UploadEntry("20090319110249|REQUEST|127.0.0.1|admin|GET|/remote-repos/antlr/antlr/2.7.6/antlr-2.7.6.jar|" +
-                "HTTP/1.1|200|4434a3a2");
-    }
-}
diff --git a/backend/traffic/src/test/java/org/artifactory/traffic/entry/TrafficEntryBuilderTest.java b/backend/traffic/src/test/java/org/artifactory/traffic/entry/TrafficEntryBuilderTest.java
deleted file mode 100644
index 05ee9e4..0000000
--- a/backend/traffic/src/test/java/org/artifactory/traffic/entry/TrafficEntryBuilderTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic.entry;
-
-import org.artifactory.traffic.TrafficAction;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * Unit test for the TrafficEntryBuilder object
- *
- * @author Noam Tenne
- */
- at Test
-public class TrafficEntryBuilderTest {
-
-    /**
-     * Create an entry with an expression using the entry builder
-     */
-    public void testValidEntry() {
-        String entry = "20050318162747|10|UPLOAD|127.0.0.1|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|456";
-        TrafficEntry trafficEntry = TokenizedTrafficEntryFactory.newTrafficEntry(entry);
-        Assert.assertNotNull(trafficEntry, "Entry should not be null");
-        Assert.assertEquals(trafficEntry.getAction(), TrafficAction.UPLOAD, "Entry action should be - upload");
-    }
-
-    /**
-     * Create an entry with a null expression
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testNullEntry() {
-        TokenizedTrafficEntryFactory.newTrafficEntry(null);
-    }
-
-    /**
-     * Create an entry with an empty expression
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testEmptyEntry() {
-        TokenizedTrafficEntryFactory.newTrafficEntry("");
-    }
-
-    /**
-     * Create an entry with an expression that has no data
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testEntryNoData() {
-        TokenizedTrafficEntryFactory.newTrafficEntry("|");
-    }
-}
diff --git a/backend/traffic/src/test/java/org/artifactory/traffic/entry/TransferEntryTest.java b/backend/traffic/src/test/java/org/artifactory/traffic/entry/TransferEntryTest.java
deleted file mode 100644
index 5d22209..0000000
--- a/backend/traffic/src/test/java/org/artifactory/traffic/entry/TransferEntryTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic.entry;
-
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.traffic.TrafficAction;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Unit test for the traffic's TransferEntry object
- *
- * @author Noam Tenne
- */
- at Test
-public class TransferEntryTest {
-
-    /**
-     * Creates a new entry with the data constructor, and compares it's string representation with it's equivalent entry
-     * Expression
-     */
-    public void uploadEntryToString() {
-        RepoPath repoPath = InfoFactoryHolder.get()
-                .createRepoPathFromId("libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom");
-        int contentLength = 632;
-        String clientRemoteAddress = "127.0.0.1";
-        UploadEntry uploadEntry = new UploadEntry(repoPath.getId(), contentLength, 10, clientRemoteAddress);
-
-        assertEquals(uploadEntry.getDuration(), 10, "Duration should be equal");
-        assertEquals(uploadEntry.getAction(), TrafficAction.UPLOAD, "Entry action should be equal");
-        assertEquals(uploadEntry.getRepoPath(), repoPath.getId(), "Entry repo paths should be equal");
-        assertEquals(uploadEntry.getContentLength(), contentLength, "Entry content lengths should be equal");
-        assertEquals(uploadEntry.getUserAddress(), clientRemoteAddress, "Entry remote address should be equal");
-
-        String expected = uploadEntry.getFormattedDate()
-                + "|10|UPLOAD|127.0.0.1|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|632";
-
-        assertEquals(uploadEntry.toString(), expected, "Entry expressions should be equal");
-    }
-
-    /**
-     * Creates a new entry using an entry expression, and validates it
-     */
-    public void stringToUploadEntry() {
-        String entry = "20050318162747|10|UPLOAD|127.0.0.1|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|456";
-        UploadEntry uploadEntry = new UploadEntry(entry);
-
-        assertEquals(entry, uploadEntry.toString(), "Upload entry should be equal to the expression that created it");
-
-        assertEquals(uploadEntry.getDuration(), 10, "Duration should be equal");
-        assertEquals(uploadEntry.getAction(), TrafficAction.UPLOAD, "Action should be equal");
-        assertEquals(uploadEntry.getRepoPath(),
-                InfoFactoryHolder.get()
-                        .createRepoPath("libs-releases-local", "antlr/antlr/2.7.7/antlr-2.7.7.pom").getId(),
-                "Entry repo paths should be equal");
-        assertEquals(uploadEntry.getContentLength(), 456, "Entry content lengths should be equal");
-        assertEquals(uploadEntry.getUserAddress(), "127.0.0.1", "Entry content lengths should be equal");
-    }
-
-    /**
-     * Creates a new entry using an entry expression with an invalid content length
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testInvalidUploadEntryContentLength() {
-        new UploadEntry("20090318162747|10|MOO|127.0.0.1|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|63a2");
-    }
-}
diff --git a/backend/traffic/src/test/java/org/artifactory/traffic/read/TrafficReaderTest.java b/backend/traffic/src/test/java/org/artifactory/traffic/read/TrafficReaderTest.java
deleted file mode 100644
index bfa1715..0000000
--- a/backend/traffic/src/test/java/org/artifactory/traffic/read/TrafficReaderTest.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic.read;
-
-import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.joran.JoranConfigurator;
-import ch.qos.logback.core.joran.spi.JoranException;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.filefilter.FileFilterUtils;
-import org.apache.commons.io.output.NullOutputStream;
-import org.artifactory.traffic.entry.TrafficEntry;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-/**
- * @author Noam Tenne
- */
- at Test
-public class TrafficReaderTest {
-    URL trafficLogDir = getClass().getResource("/org/artifactory/traffic/logs");
-    TrafficReader trafficReader;
-
-    @BeforeClass
-    public void setUp() throws JoranException {
-        URL logConfigResource = getClass().getResource("/org/artifactory/traffic/logback.xml");
-        File logConfigFile = new File(logConfigResource.getFile());
-        Assert.assertNotNull(logConfigFile, "Cannot locate logback configuration file.");
-        assertTrue(logConfigFile.exists(), "Cannot locate logback configuration file.");
-
-        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
-        JoranConfigurator configurator = new JoranConfigurator();
-        configurator.setContext(lc);
-        lc.stop();
-        configurator.doConfigure(logConfigFile);
-        lc.start();
-    }
-
-    /**
-     * Supply the reader with a null object as the log file directory
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testNullDir() {
-        trafficReader = new TrafficReader(null);
-    }
-
-    /**
-     * Supply the reader with a file object of a non existing base dir
-     *
-     * @throws IOException
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testNonExistingBaseDir() throws IOException {
-        trafficReader = new TrafficReader(new File("mll"));
-    }
-
-    /**
-     * Supply the reader with null dates
-     *
-     * @throws IOException
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testNullDates() throws IOException {
-        trafficReader = new TrafficReader(new File(trafficLogDir.getFile()));
-        trafficReader.getEntries((Date) null, null);
-    }
-
-    /**
-     * Supply the reader with invalid dates
-     *
-     * @throws IOException
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testInvalidDates() throws IOException {
-        long currentTime = System.currentTimeMillis();
-        Date startDate = new Date(currentTime + 1000);
-        Date endDate = new Date(currentTime);
-        trafficReader = new TrafficReader(new File(trafficLogDir.getFile()));
-        trafficReader.getEntries(startDate, endDate);
-    }
-
-    /**
-     * Test the stream writer with valid in-range dates
-     */
-    public void testEntriesStream() {
-        Date[] dateRange = findDateRange();
-        trafficReader = new TrafficReader(new File(trafficLogDir.getFile()));
-        Date startDate = dateRange[0];
-        Date endDate = dateRange[1];
-        long charsWritten = trafficReader.writeFileToStream(new NullOutputStream(), startDate, endDate);
-        assertTrue(charsWritten > 0);
-    }
-
-    /**
-     * Test the reader with valid in-range dates
-     */
-    public void testEntriesWithinRange() {
-        Date[] dateRange = findDateRange();
-        trafficReader = new TrafficReader(new File(trafficLogDir.getFile()));
-        Date startDate = dateRange[0];
-        Date endDate = dateRange[1];
-
-        long lastEntryDate = 0;
-        List<TrafficEntry> entries = trafficReader.getEntries(startDate, endDate);
-
-        assertFalse(entries.isEmpty(), "Entry list shouldn't be empty.");
-
-        for (TrafficEntry currentEntry : entries) {
-            long currentEntryDate = currentEntry.getTime();
-
-            if (lastEntryDate > 0) {
-                assertFalse(currentEntry.getTime() < lastEntryDate, "Entry list should be sorted.");
-            }
-            assertTrue(currentEntryDate > startDate.getTime(), "Current entry date should be within range.");
-            assertTrue(currentEntryDate < endDate.getTime(), "Current entry date should be within range.");
-            lastEntryDate = currentEntryDate;
-        }
-    }
-
-    /**
-     * Test the reader with dates that should be out of range
-     *
-     * @throws IOException
-     */
-    public void testOutOfRange() throws IOException {
-        trafficReader = new TrafficReader(new File(trafficLogDir.getFile()));
-        List<TrafficEntry> trafficEntryList = trafficReader.getEntries(new Date(), new Date());
-        assertTrue(trafficEntryList.isEmpty(), "Entry list shouldn't be empty.");
-    }
-
-    private Date[] findDateRange() {
-        Date startDate = null;
-        Date endDate = null;
-        String trafficPrefix = "traffic.";
-        String logSuffix = ".log";
-        Collection<File> logFiles =
-                FileUtils.listFiles(new File(trafficLogDir.getFile()), FileFilterUtils.trueFileFilter(),
-                        FileFilterUtils.trueFileFilter());
-
-        for (File logFile : logFiles) {
-            String logFileName = logFile.getName();
-            Assert.assertNotNull(logFileName, "Unable to find dummy log file.");
-            assertTrue(logFileName.length() > 0, "Dummy log file name is empty");
-            String timeRange =
-                    logFileName.substring(trafficPrefix.length(), (logFileName.length() - logSuffix.length()));
-            String[] logTimes = timeRange.split("-");
-            assertFalse(logTimes.length == 0);
-            String logStartTime = logTimes[0];
-            Assert.assertNotNull(logStartTime);
-            Date logFileStartDate = new Date(Long.parseLong(logStartTime));
-            if ((startDate == null) || (logFileStartDate.before(startDate))) {
-                startDate = logFileStartDate;
-            }
-            if ((logTimes.length > 1) && (logTimes[1] != null)) {
-                Date logFileEndDate = new Date(Long.parseLong(logTimes[1]));
-                if ((endDate == null) || (logFileEndDate.after(endDate))) {
-                    endDate = logFileEndDate;
-                }
-            } else {
-                endDate = new Date();
-            }
-        }
-
-        return new Date[]{startDate, endDate};
-    }
-}
diff --git a/backend/traffic/src/test/java/org/artifactory/traffic/read/TrafficStreamParserTest.java b/backend/traffic/src/test/java/org/artifactory/traffic/read/TrafficStreamParserTest.java
deleted file mode 100644
index 30db1de..0000000
--- a/backend/traffic/src/test/java/org/artifactory/traffic/read/TrafficStreamParserTest.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.traffic.read;
-
-import com.google.common.base.Charsets;
-import com.google.common.io.Resources;
-import org.apache.commons.io.input.NullReader;
-import org.apache.commons.lang.time.DateUtils;
-import org.artifactory.traffic.entry.TrafficEntry;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.FileReader;
-import java.io.IOException;
-import java.net.URL;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-
-import static org.testng.Assert.assertTrue;
-
-/**
- * Unit test for the TrafficStreamParser
- *
- * @author Noam Tenne
- */
- at Test
-public class TrafficStreamParserTest {
-    SimpleDateFormat entryDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
-    URL trafficLogFile = getClass().getResource("/org/artifactory/traffic/logs/traffic.1238313542120.log");
-
-    /**
-     * Supply the parser with a null object instead of a reader
-     *
-     * @throws IOException
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testNullReader() throws IOException {
-        TrafficStreamParser.parse(null, null, null);
-    }
-
-    /**
-     * Supply the parser with null objects instead of dates
-     *
-     * @throws IOException
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testNullDates() throws IOException {
-        TrafficStreamParser.parse(new NullReader(0), null, null);
-    }
-
-    /**
-     * Supply the parser with invalid dates
-     *
-     * @throws IOException
-     */
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testInvalidDates() throws IOException {
-        long currentTime = System.currentTimeMillis();
-        Date startDate = new Date(currentTime + 1000);
-        Date endDate = new Date(currentTime);
-        TrafficStreamParser.parse(new NullReader(0), startDate, endDate);
-    }
-
-    /**
-     * Test the parser with valid in-range dates
-     *
-     * @throws IOException
-     * @throws ParseException
-     */
-    public void testWithinRange() throws IOException, ParseException {
-        List<String> list = Resources.readLines(trafficLogFile, Charsets.UTF_8);
-        String firstEntry = list.get(0);
-        String[] splitFirstEntry = firstEntry.split("\\|");
-        String lastEntry = list.get(list.size() - 1);
-        String[] splitLastEntry = lastEntry.split("\\|");
-
-        Date startDate = entryDateFormat.parse(splitFirstEntry[0]);
-        Date endDate = entryDateFormat.parse(splitLastEntry[0]);
-        startDate = DateUtils.truncate(startDate, Calendar.MINUTE);
-        endDate = DateUtils.round(endDate, Calendar.MINUTE);
-        List<TrafficEntry> entries =
-                TrafficStreamParser.parse(new FileReader(trafficLogFile.getFile()), startDate, endDate);
-
-        Assert.assertFalse(entries.isEmpty(), "Log parsing should return results.");
-        for (TrafficEntry entry : entries) {
-            long currentEntryDate = entry.getTime();
-            assertTrue(currentEntryDate > startDate.getTime(), "Current entry date should be within range.");
-            assertTrue(currentEntryDate < endDate.getTime(), "Current entry date should be within range.");
-        }
-    }
-
-    /**
-     * Test the parser with dates that should be out of range
-     *
-     * @throws IOException
-     */
-    public void testOutOfRange() throws IOException {
-        List<TrafficEntry> trafficEntryList =
-                TrafficStreamParser.parse(new FileReader(trafficLogFile.getFile()), new Date(), new Date());
-        assertTrue(trafficEntryList.isEmpty(), "Log parsing shouldn't return results.");
-    }
-}
\ No newline at end of file
diff --git a/backend/traffic/src/test/resources/org/artifactory/traffic/logback.xml b/backend/traffic/src/test/resources/org/artifactory/traffic/logback.xml
deleted file mode 100644
index 6bedb14..0000000
--- a/backend/traffic/src/test/resources/org/artifactory/traffic/logback.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<configuration debug="false">
-    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-        <encoder>
-            <pattern>%d [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
-        </encoder>
-    </appender>
-    <appender name="TRAFFIC" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>target/traffic</File>
-        <encoder>
-            <pattern>%message%n</pattern>
-        </encoder>
-        <rollingPolicy class="org.artifactory.traffic.policy.TrafficTimeBasedRollingPolicy">
-            <FileNamePattern>target/traffic.%d{yyyyMMdd}</FileNamePattern>
-        </rollingPolicy>
-    </appender>
-    <root>
-        <level value="WARN"/>
-        <appender-ref ref="CONSOLE"/>
-    </root>
-    <logger name="org.artifactory.traffic.TrafficLogger" additivity="false">
-        <level value="INFO"/>
-        <appender-ref ref="TRAFFIC"/>
-    </logger>
-</configuration>
\ No newline at end of file
diff --git a/backend/traffic/src/test/resources/org/artifactory/traffic/logs/traffic.1238313294196-1238313394196.log b/backend/traffic/src/test/resources/org/artifactory/traffic/logs/traffic.1238313294196-1238313394196.log
deleted file mode 100644
index 1076558..0000000
--- a/backend/traffic/src/test/resources/org/artifactory/traffic/logs/traffic.1238313294196-1238313394196.log
+++ /dev/null
@@ -1,10 +0,0 @@
-20150112123017|17|UPLOAD|127.0.0.1|ext-release-local:boo.txt|4
-20150112123146|20|UPLOAD|127.0.0.1|ext-release-local:boo.txt|4
-20150112123213|90|UPLOAD|127.0.0.1|ext-release-local:avalon-framework/avalon-framework/4.1.3/avalon-framework-4.1.3.pom|167
-20150112123220|13|UPLOAD|127.0.0.1|ext-release-local:boo.txt|4
-20150112123239|1|DOWNLOAD|127.0.0.1|ext-release-local:boo.txt|4
-20150112123254|3|DOWNLOAD|127.0.0.1|ext-release-local:ca/juliusdavies/not-yet-commons-ssl/0.3.9/not-yet-commons-ssl-0.3.9.jar|258278
-20150112133129|75|UPLOAD|127.0.0.1|ext-release-local:boo.txt|0
-20150112153756|114|UPLOAD|127.0.0.1|ext-release-local:avalon-framework/avalon-framework/4.1.3/avalon-framework-4.1.3.pom|167
-20150112153835|48|UPLOAD|127.0.0.1|ext-release-local:bsh/bsh/1.3.0/bsh-1.3.0.pom|210
-20150112154102|1|DOWNLOAD|127.0.0.1|plugins-release-local:bsh/bsh/1.3.0/bsh-1.3.0.pom|210
diff --git a/backend/traffic/src/test/resources/org/artifactory/traffic/logs/traffic.1238313394196-1238313494196.log b/backend/traffic/src/test/resources/org/artifactory/traffic/logs/traffic.1238313394196-1238313494196.log
deleted file mode 100644
index 975ab21..0000000
--- a/backend/traffic/src/test/resources/org/artifactory/traffic/logs/traffic.1238313394196-1238313494196.log
+++ /dev/null
@@ -1,14 +0,0 @@
-20090329105733|10|UPLOAD|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|632
-20090329105734|10|UPLOAD|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|632
-20090329105735|10|UPLOAD|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|632
-20090329105736|10|UPLOAD|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|632
-20090329105737|10|UPLOAD|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|632
-20090329105902|10|DOWNLOAD|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.jar|445288
-20090329105905|10|DOWNLOAD|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|632
-20090329115902|10|DOWNLOAD|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.jar|445288
-20090329115905|10|DOWNLOAD|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|632
-20090329105736|10|UPLOAD|127.0.0.1|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|632
-20090329105737|10|UPLOAD|127.0.0.1|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|632
-20090329115902|10|DOWNLOAD|127.0.0.1|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.jar|445288
-20090329115905|10|DOWNLOAD|127.0.0.1|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|632
-
diff --git a/backend/traffic/src/test/resources/org/artifactory/traffic/logs/traffic.1238313453672-1238313494196.log b/backend/traffic/src/test/resources/org/artifactory/traffic/logs/traffic.1238313453672-1238313494196.log
deleted file mode 100644
index ad09641..0000000
--- a/backend/traffic/src/test/resources/org/artifactory/traffic/logs/traffic.1238313453672-1238313494196.log
+++ /dev/null
@@ -1,5 +0,0 @@
-20090329105733|10|UPLOAD|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|632
-20090329105734|10|UPLOAD|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|632
-20090329105735|10|UPLOAD|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|632
-20090329105736|10|UPLOAD|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|632
-20090329105737|10|UPLOAD|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|632
diff --git a/backend/traffic/src/test/resources/org/artifactory/traffic/logs/traffic.1238313494196-1238313542120.log b/backend/traffic/src/test/resources/org/artifactory/traffic/logs/traffic.1238313494196-1238313542120.log
deleted file mode 100644
index d97ebc5..0000000
--- a/backend/traffic/src/test/resources/org/artifactory/traffic/logs/traffic.1238313494196-1238313542120.log
+++ /dev/null
@@ -1,4 +0,0 @@
-20090329105814|10|UPLOAD|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.jar|445288
-20090329105830|10|UPLOAD|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|632
-20090329105831|10|UPLOAD|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|632
-20090329105832|10|UPLOAD|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|632
diff --git a/backend/traffic/src/test/resources/org/artifactory/traffic/logs/traffic.1238313542120.log b/backend/traffic/src/test/resources/org/artifactory/traffic/logs/traffic.1238313542120.log
deleted file mode 100644
index cfbfbc0..0000000
--- a/backend/traffic/src/test/resources/org/artifactory/traffic/logs/traffic.1238313542120.log
+++ /dev/null
@@ -1,4 +0,0 @@
-20090329105902|10|DOWNLOAD|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.jar|445288
-20090329105905|10|DOWNLOAD|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|632
-20090329115902|10|DOWNLOAD|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.jar|445288
-20090329115905|10|DOWNLOAD|libs-releases-local:antlr/antlr/2.7.7/antlr-2.7.7.pom|632
diff --git a/base/api/pom.xml b/base/api/pom.xml
deleted file mode 100644
index 16bd911..0000000
--- a/base/api/pom.xml
+++ /dev/null
@@ -1,118 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0          http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>artifactory-api</artifactId>
-    <packaging>jar</packaging>
-    <name>Artifactory API</name>
-
-    <parent>
-        <artifactId>artifactory-base-parent</artifactId>
-        <groupId>org.artifactory</groupId>
-        <version>4.8.0</version>
-    </parent>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-config</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-capi</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-config</artifactId>
-            <type>test-jar</type>
-        </dependency>
-
-        <dependency>
-            <groupId>org.codehaus.woodstox</groupId>
-            <artifactId>woodstox-core-asl</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-lang</groupId>
-            <artifactId>commons-lang</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.easymock</groupId>
-            <artifactId>easymock</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-compress</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.ivy</groupId>
-            <artifactId>ivy</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.codehaus.jackson</groupId>
-            <artifactId>jackson-mapper-asl</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.thoughtworks.xstream</groupId>
-            <artifactId>xstream</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-tx</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>joda-time</groupId>
-            <artifactId>joda-time</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.jfrog.bintray.client</groupId>
-            <artifactId>bintray-client-java-service</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>javax.mail</groupId>
-            <artifactId>mail</artifactId>
-        </dependency>
-
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jar-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>test-jar</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/base/api/src/main/java/org/artifactory/addon/layouts/translate/ChecksumTranslatorFilter.java b/base/api/src/main/java/org/artifactory/addon/layouts/translate/ChecksumTranslatorFilter.java
deleted file mode 100644
index 3fe98d8..0000000
--- a/base/api/src/main/java/org/artifactory/addon/layouts/translate/ChecksumTranslatorFilter.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.layouts.translate;
-
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.util.PathUtils;
-
-/**
- * Filters checksum extensions
- *
- * @author Noam Y. Tenne
- */
-public class ChecksumTranslatorFilter implements TranslatorFilter {
-
-    @Override
-    public boolean filterRequired(String path) {
-        return NamingUtils.isChecksum(path);
-    }
-
-    @Override
-    public String getFilteredContent(String path) {
-        ChecksumType checksumType = ChecksumType.forFilePath(path);
-        if (checksumType == null) {
-            return null;
-        }
-        return checksumType.ext();
-    }
-
-    @Override
-    public String stripPath(String path) {
-        return PathUtils.stripExtension(path);
-    }
-
-    @Override
-    public String applyFilteredContent(String strippedPath, String filteredContent) {
-        return strippedPath + filteredContent;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/addon/layouts/translate/MetadataTranslatorFilter.java b/base/api/src/main/java/org/artifactory/addon/layouts/translate/MetadataTranslatorFilter.java
deleted file mode 100644
index 5920b79..0000000
--- a/base/api/src/main/java/org/artifactory/addon/layouts/translate/MetadataTranslatorFilter.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.layouts.translate;
-
-import org.artifactory.mime.NamingUtils;
-
-/**
- * Filters metadata names
- *
- * @author Noam Y. Tenne
- */
-public class MetadataTranslatorFilter implements TranslatorFilter {
-
-    @Override
-    public boolean filterRequired(String path) {
-        return NamingUtils.isMetadata(path);
-    }
-
-    @Override
-    public String getFilteredContent(String path) {
-        return NamingUtils.getMetadataName(path);
-    }
-
-    @Override
-    public String stripPath(String path) {
-        return NamingUtils.stripMetadataFromPath(path);
-    }
-
-    @Override
-    public String applyFilteredContent(String strippedPath, String filteredContent) {
-        return NamingUtils.getMetadataPath(strippedPath, filteredContent);
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/addon/layouts/translate/PathTranslationHelper.java b/base/api/src/main/java/org/artifactory/addon/layouts/translate/PathTranslationHelper.java
deleted file mode 100644
index 419def4..0000000
--- a/base/api/src/main/java/org/artifactory/addon/layouts/translate/PathTranslationHelper.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.layouts.translate;
-
-import com.google.common.collect.Lists;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.module.ModuleInfoUtils;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.util.Pair;
-import org.artifactory.util.RepoLayoutUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.LinkedList;
-
-/**
- * Holds the cross layout path translation logic
- *
- * @author Noam Y. Tenne
- */
-public class PathTranslationHelper {
-
-    private static final Logger log = LoggerFactory.getLogger(PathTranslationHelper.class);
-
-    private TranslatorFilter[] translatorFilters = new TranslatorFilter[]{new ChecksumTranslatorFilter(),
-            new MetadataTranslatorFilter()};
-
-    public String translatePath(RepoLayout sourceRepoLayout, RepoLayout targetRepoLayout, String path,
-            BasicStatusHolder multiStatusHolder) {
-
-        LinkedList<Pair<String, TranslatorFilter>> filters = Lists.newLinkedList();
-
-        path = filterPaths(path, filters);
-
-        ModuleInfo moduleInfo = null;
-        boolean descriptor = true;
-
-        if (sourceRepoLayout.isDistinctiveDescriptorPathPattern()) {
-            moduleInfo = ModuleInfoUtils.moduleInfoFromDescriptorPath(path, sourceRepoLayout);
-        }
-
-        if ((moduleInfo == null) || !moduleInfo.isValid()) {
-            moduleInfo = ModuleInfoUtils.moduleInfoFromArtifactPath(path, sourceRepoLayout);
-            descriptor = false;
-        }
-
-        if ((moduleInfo == null) || !moduleInfo.isValid()) {
-            if (multiStatusHolder != null) {
-                multiStatusHolder.warn("Unable to translate path '" + path +
-                        "': does not represent a valid module path within the source.", log);
-            }
-
-            return applyFilteredContent(path, filters);
-        }
-
-        String result;
-        ModuleInfo resultModuleInfo;
-
-        /**
-         * If mixing between Maven and non-Maven layouts, treat the source descriptor as a normal artifact. Most chances
-         * are that the descriptor won't have any meaning. Currently the best compromise
-         */
-        if (descriptor && !isExclusivelyOneLayoutM2(sourceRepoLayout, targetRepoLayout)) {
-            result = ModuleInfoUtils.constructDescriptorPath(moduleInfo, targetRepoLayout, true);
-            resultModuleInfo = ModuleInfoUtils.moduleInfoFromDescriptorPath(result, targetRepoLayout);
-        } else {
-            result = ModuleInfoUtils.constructArtifactPath(moduleInfo, targetRepoLayout, true);
-            resultModuleInfo = ModuleInfoUtils.moduleInfoFromArtifactPath(result, targetRepoLayout);
-        }
-
-        if (!resultModuleInfo.isValid() && (multiStatusHolder != null)) {
-            multiStatusHolder.warn("Translated path '" + path +
-                    "', but the result does not represent a valid module path within the target.", log);
-        }
-
-        return applyFilteredContent(result, filters);
-    }
-
-    private String filterPaths(String path, LinkedList<Pair<String, TranslatorFilter>> filterList) {
-
-        for (TranslatorFilter translatorFilter : translatorFilters) {
-            if (translatorFilter.filterRequired(path)) {
-                String filteredContent = translatorFilter.getFilteredContent(path);
-                path = translatorFilter.stripPath(path);
-                filterList.add(new Pair<>(filteredContent, translatorFilter));
-            }
-        }
-
-        return path;
-    }
-
-    private boolean isExclusivelyOneLayoutM2(RepoLayout layoutA, RepoLayout layoutB) {
-        boolean sourceIsDefaultM2 = RepoLayoutUtils.isDefaultM2(layoutA);
-        boolean targetIsDefaultM2 = RepoLayoutUtils.isDefaultM2(layoutB);
-
-        return ((sourceIsDefaultM2 && !targetIsDefaultM2) || (!sourceIsDefaultM2 && targetIsDefaultM2));
-    }
-
-    private String applyFilteredContent(String strippedPath, LinkedList<Pair<String, TranslatorFilter>> filterList) {
-        while (filterList.size() != 0) {
-            Pair<String, TranslatorFilter> filterPair = filterList.removeLast();
-            strippedPath = filterPair.getSecond().applyFilteredContent(strippedPath, filterPair.getFirst());
-        }
-
-        return strippedPath;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/addon/layouts/translate/TranslatorFilter.java b/base/api/src/main/java/org/artifactory/addon/layouts/translate/TranslatorFilter.java
deleted file mode 100644
index c62f5b6..0000000
--- a/base/api/src/main/java/org/artifactory/addon/layouts/translate/TranslatorFilter.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.layouts.translate;
-
-/**
- * A common interface for module info translator filters. Mainly used to deal with extra path information that should
- * be in the path during conversion, but should be re-added after the conversion.
- *
- * @author Noam Y. Tenne
- */
-public interface TranslatorFilter {
-
-    boolean filterRequired(String path);
-
-    String getFilteredContent(String path);
-
-    String stripPath(String path);
-
-    String applyFilteredContent(String strippedPath, String filteredContent);
-}
diff --git a/base/api/src/main/java/org/artifactory/api/archive/ArchiveType.java b/base/api/src/main/java/org/artifactory/api/archive/ArchiveType.java
deleted file mode 100644
index c3c1c6d..0000000
--- a/base/api/src/main/java/org/artifactory/api/archive/ArchiveType.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.archive;
-
-/**
- * An object which defines the supported archiving types
- *
- * @author Shay Yaakov
- */
-public enum ArchiveType {
-    ZIP("zip"), TAR("tar"), TARGZ("tar.gz"), TGZ("tgz");
-
-    private final String value;
-
-    ArchiveType(String value) {
-        this.value = value;
-    }
-
-    public String value() {
-        return value;
-    }
-
-    public static ArchiveType fromValue(String v) {
-        for (ArchiveType c : ArchiveType.values()) {
-            if (c.value.equalsIgnoreCase(v)) {
-                return c;
-            }
-        }
-        throw new IllegalArgumentException("Archive type parameter must be one of: 'zip','tar','tar.gz','tgz'. You " +
-                "sent: " + v);
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/artifact/ArtifactInfo.java b/base/api/src/main/java/org/artifactory/api/artifact/ArtifactInfo.java
deleted file mode 100644
index 076c7b4..0000000
--- a/base/api/src/main/java/org/artifactory/api/artifact/ArtifactInfo.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.artifact;
-
-import org.apache.commons.lang.StringUtils;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-/**
- * Generic Artifact Info
- *
- * @author Tomer Cohen
- */
- at JsonTypeName("base")
-public class ArtifactInfo implements UnitInfo {
-    private String artifactType = "base";
-
-    private String path;
-
-    /**
-     * Artifact info constructor, which takes a path.
-     *
-     * @param path The path of deployment for the artifact.
-     */
-    public ArtifactInfo(String path) {
-        this.path = path;
-    }
-
-    ArtifactInfo() {
-    }
-
-
-    /**
-     * {@inheritDoc}
-     *
-     * @return False, since this is a generic artifact.
-     */
-    @Override
-    public boolean isMavenArtifact() {
-        return false;
-    }
-
-    @Override
-    public String getPath() {
-        return path;
-    }
-
-    @Override
-    public boolean isValid() {
-        return StringUtils.isNotBlank(path) && !NA.equals(path);
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    public String getArtifactType() {
-        return artifactType;
-    }
-
-    public void setArtifactType(String artifactType) {
-        this.artifactType = artifactType;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/artifact/DebianArtifactInfo.java b/base/api/src/main/java/org/artifactory/api/artifact/DebianArtifactInfo.java
deleted file mode 100644
index 4e03f73..0000000
--- a/base/api/src/main/java/org/artifactory/api/artifact/DebianArtifactInfo.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.artifactory.api.artifact;
-
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-/**
- * @author Chen keinan
- */
- at JsonTypeName("debian")
-public class DebianArtifactInfo implements UnitInfo {
-
-    private String artifactType = "debian";
-    private String path;
-
-    public DebianArtifactInfo() {
-    }
-
-    public DebianArtifactInfo(String path) {
-        this.path = path;
-    }
-
-    @Override
-    public boolean isMavenArtifact() {
-        return false;
-    }
-
-    @Override
-    public String getPath() {
-        return path;
-    }
-
-    @Override
-    public boolean isValid() {
-        return true;
-    }
-
-    @Override
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    public String getArtifactType() {
-        return artifactType;
-    }
-
-    public void setArtifactType(String artifactType) {
-        this.artifactType = artifactType;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/artifact/UnitInfo.java b/base/api/src/main/java/org/artifactory/api/artifact/UnitInfo.java
deleted file mode 100644
index 2b0ee3c..0000000
--- a/base/api/src/main/java/org/artifactory/api/artifact/UnitInfo.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.artifact;
-
-import org.artifactory.api.maven.MavenArtifactInfo;
-import org.codehaus.jackson.annotate.JsonSubTypes;
-import org.codehaus.jackson.annotate.JsonTypeInfo;
-
-import java.io.Serializable;
-
-/**
- * A unit info representation.
- *
- * @author Tomer Cohen
- */
-
- at JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "artifactType")
- at JsonSubTypes({@JsonSubTypes.Type(value = MavenArtifactInfo.class, name = "maven"),
-        @JsonSubTypes.Type(value = DebianArtifactInfo.class, name = "debian"),
-        @JsonSubTypes.Type(value = VagrantArtifactInfo.class, name = "vagrant"),
-        @JsonSubTypes.Type(value = ArtifactInfo.class, name = "base")})
-public interface UnitInfo extends Serializable {
-    /**
-     * Represents a value that is not set or not available (for some implementers it indicates an invalid state)
-     */
-    public static final String NA = "NA";
-
-    /**
-     * Returns whether this artifact is a Maven artifact or a Generic type artifact.
-     *
-     * @return Whether this artifact is a Maven artifact or a Generic type artifact.
-     */
-    boolean isMavenArtifact();
-
-    /**
-     * Returns the path of the artifact. If it is Maven it is automatically guessed by Artifactory, otherwise it is a
-     * user-defined path.
-     *
-     * @return The path of the artifact
-     */
-    String getPath();
-
-    /**
-     * Checks whether this artifact has a valid path. If it is a Maven path it checks that the repo path is a valid
-     * Maven 2 path, if it is generic it checks that it is not blank.
-     *
-     * @return True if the artifact is valid, false otherwise.
-     */
-    boolean isValid();
-
-    void setPath(String path);
-}
diff --git a/base/api/src/main/java/org/artifactory/api/artifact/VagrantArtifactInfo.java b/base/api/src/main/java/org/artifactory/api/artifact/VagrantArtifactInfo.java
deleted file mode 100644
index 3984f83..0000000
--- a/base/api/src/main/java/org/artifactory/api/artifact/VagrantArtifactInfo.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.api.artifact;
-
-/**
- * @author Gidi Shabat
- */
-public class VagrantArtifactInfo implements UnitInfo {
-
-    private String artifactType = "vagrant";
-    private String path;
-
-    public VagrantArtifactInfo() {
-    }
-
-    public VagrantArtifactInfo(String path) {
-        this.path = path;
-    }
-
-    @Override
-    public boolean isMavenArtifact() {
-        return false;
-    }
-
-    @Override
-    public String getPath() {
-        return path;
-    }
-
-    @Override
-    public boolean isValid() {
-        return true;
-    }
-
-    @Override
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    public String getArtifactType() {
-        return artifactType;
-    }
-
-    public void setArtifactType(String artifactType) {
-        this.artifactType = artifactType;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/bintray/BintrayItemInfo.java b/base/api/src/main/java/org/artifactory/api/bintray/BintrayItemInfo.java
deleted file mode 100644
index dd2d444..0000000
--- a/base/api/src/main/java/org/artifactory/api/bintray/BintrayItemInfo.java
+++ /dev/null
@@ -1,122 +0,0 @@
-package org.artifactory.api.bintray;
-
-
-import org.artifactory.repo.RepoPath;
-import org.codehaus.jackson.annotate.JsonProperty;
-
-import java.io.Serializable;
-
-/**
- * Bintray single item info.
- */
-public class BintrayItemInfo implements Serializable {
-    @JsonProperty(value = "name")
-    private String name;
-    @JsonProperty(value = "package")
-    private String packageName;
-    @JsonProperty(value = "version")
-    private String version;
-    @JsonProperty(value = "repo")
-    private String repo;
-    @JsonProperty(value = "created")
-    private String created;
-    @JsonProperty(value = "path")
-    private String path;
-    @JsonProperty(value = "owner")
-    private String owner;
-
-    // Local information
-    private boolean cached;
-    private RepoPath localRepoPath;
-
-
-    public String getName() {
-        return name;
-    }
-
-    public String getPackage() {
-        return packageName;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public String getRepo() {
-        return repo;
-    }
-
-    public String getCreated() {
-        return created;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public boolean getCached() {
-        return cached;
-    }
-
-    public void setCached(boolean cached) {
-        this.cached = cached;
-    }
-
-    public String getOwner() {
-        return owner;
-    }
-
-    public boolean isCached() {
-        return cached;
-    }
-
-    public RepoPath getLocalRepoPath() {
-        return localRepoPath;
-    }
-
-    public void setLocalRepoPath(RepoPath localRepoPath) {
-        this.localRepoPath = localRepoPath;
-    }
-
-    public void setCreated(String created) {
-        this.created = created;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof BintrayItemInfo)) {
-            return false;
-        }
-
-        BintrayItemInfo that = (BintrayItemInfo) o;
-
-        if (!name.equals(that.name)) {
-            return false;
-        }
-        if (packageName != null ? !packageName.equals(that.packageName) : that.packageName != null) {
-            return false;
-        }
-        if (version != null ? !version.equals(that.version) : that.version != null) {
-            return false;
-        }
-        if (repo != null ? !repo.equals(that.repo) : that.repo != null) {
-            return false;
-        }
-
-        return !(path != null ? !path.equals(that.path) : that.path != null);
-
-    }
-
-    @Override
-    public int hashCode() {
-        int result = name.hashCode();
-        result = 31 * result + (packageName != null ? packageName.hashCode() : 0);
-        result = 31 * result + (version != null ? version.hashCode() : 0);
-        result = 31 * result + (repo != null ? repo.hashCode() : 0);
-        result = 31 * result + (path != null ? path.hashCode() : 0);
-        return result;
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/bintray/BintrayPackageInfo.java b/base/api/src/main/java/org/artifactory/api/bintray/BintrayPackageInfo.java
deleted file mode 100644
index 9d9e1cd..0000000
--- a/base/api/src/main/java/org/artifactory/api/bintray/BintrayPackageInfo.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package org.artifactory.api.bintray;
-
-import org.codehaus.jackson.annotate.JsonProperty;
-
-import java.io.Serializable;
-
-/**
- * Bintray package info
- *
- * @author Gidi Shabat
- */
-
-public class BintrayPackageInfo implements Serializable {
-    @JsonProperty(value = "name")
-    private String name;
-    @JsonProperty(value = "repo")
-    private String repo;
-    @JsonProperty(value = "owner")
-    private String owner;
-    @JsonProperty(value = "desc")
-    private String desc;
-    @JsonProperty(value = "desc_url")
-    private String desc_url;
-    //@JsonProperty(value = "labels")
-    //private String labels;
-    //@JsonProperty(value = "attribute_names")
-    //private String attribute_names;
-    @JsonProperty(value = "rating")
-    private String rating;
-    @JsonProperty(value = "rating_count")
-    private String rating_count;
-    @JsonProperty(value = "followers_count")
-    private String followers_count;
-    @JsonProperty(value = "created")
-    private String created;
-    //@JsonProperty(value = "versions")
-    //private String versions;
-    @JsonProperty(value = "latest_version")
-    private String latest_version;
-    @JsonProperty(value = "updated")
-    private String updated;
-    @JsonProperty(value = "linked_to_repo")
-    private String linked_to_repo;
-
-
-    public String getOwner() {
-        return owner;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public String getDesc() {
-        return desc;
-    }
-
-    public String getDesc_url() {
-        return desc_url;
-    }
-
-    public String getRepo() {
-        return repo;
-    }
-
-    //public String getVersions() {
-    //    return versions;
-    //}
-
-    public String getLatest_version() {
-        return latest_version;
-    }
-
-    public String getUpdated() {
-        return updated;
-    }
-
-    public String getRating_count() {
-        return rating_count;
-    }
-
-    public String getCreated() {
-        return created;
-    }
-
-    public String getFollowers_count() {
-        return followers_count;
-    }
-
-    public String getRating() {
-        return rating;
-    }
-
-    //public String getAttribute_names() {
-    //    return attribute_names;
-    //}
-
-    //public String getLabels() {
-    //    return labels;
-    //}
-
-    public String getLinked_to_repo() {
-        return linked_to_repo;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/bintray/BintrayParams.java b/base/api/src/main/java/org/artifactory/api/bintray/BintrayParams.java
deleted file mode 100644
index 52f76a7..0000000
--- a/base/api/src/main/java/org/artifactory/api/bintray/BintrayParams.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.bintray;
-
-import org.apache.commons.lang.StringUtils;
-import org.codehaus.jackson.annotate.JsonIgnore;
-
-import java.io.Serializable;
-
-/**
- * Bintray parameters model
- *
- * @author Shay Yaakov
- */
-public class BintrayParams implements Serializable {
-
-    private String repo;
-    private String packageId;
-    private String version;
-    private String path;
-    private boolean useExistingProps;
-    private boolean notify;
-    private String packageType;
-
-    public String getRepo() {
-        return repo;
-    }
-
-    public void setRepo(String repo) {
-        if (StringUtils.isNotBlank(repo)) {
-            this.repo = repo;
-        }
-    }
-
-    public String getPackageId() {
-        return packageId;
-    }
-
-    public void setPackageId(String packageId) {
-        if (StringUtils.isNotBlank(packageId)) {
-            this.packageId = packageId;
-        }
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        if (StringUtils.isNotBlank(version)) {
-            this.version = version;
-        }
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public void setPath(String path) {
-        if (StringUtils.isNotBlank(path)) {
-            this.path = path;
-        }
-    }
-
-    public boolean isUseExistingProps() {
-        return useExistingProps;
-    }
-
-    public void setUseExistingProps(boolean useExistingProps) {
-        this.useExistingProps = useExistingProps;
-    }
-
-    public boolean isNotify() {
-        return notify;
-    }
-
-    public void setNotify(boolean notify) {
-        this.notify = notify;
-    }
-
-    public boolean isValid() {
-        return StringUtils.isNotBlank(repo) && StringUtils.isNotBlank(packageId) &&
-                StringUtils.isNotBlank(version) && StringUtils.isNotBlank(path);
-    }
-
-    @JsonIgnore
-    public String getPackageType() {
-        return packageType;
-    }
-
-    @JsonIgnore
-    public void setPackageType(String packageType) {
-        this.packageType = packageType;
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/bintray/BintrayService.java b/base/api/src/main/java/org/artifactory/api/bintray/BintrayService.java
deleted file mode 100644
index bd59507..0000000
--- a/base/api/src/main/java/org/artifactory/api/bintray/BintrayService.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.bintray;
-
-import com.jfrog.bintray.client.api.handle.Bintray;
-import com.jfrog.bintray.client.api.handle.VersionHandle;
-import org.artifactory.api.bintray.exception.BintrayException;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.repo.Async;
-import org.artifactory.api.search.BintrayItemSearchResults;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.RepoPath;
-import org.jfrog.build.api.Build;
-import org.jfrog.build.api.release.BintrayUploadInfoOverride;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Provides different Bintray related business methods
- *
- * @author Shay Yaakov
- */
-public interface BintrayService {
-
-    String BINTRAY_REPO = "bintray.repo";
-    String BINTRAY_PACKAGE = "bintray.package";
-    String BINTRAY_VERSION = "bintray.version";
-    String BINTRAY_PATH = "bintray.path";
-    String BINTRAY_UPLOAD_TIME = "bintray.upload.time";
-
-    String PATH_CONTENT = "content";
-    String PATH_REPOS = "repos";
-    String PATH_PACKAGES = "packages";
-    String PATH_USERS = "users";
-
-    /**
-     * Pushing synchronously single artifact to Bintray
-     *
-     * @param itemInfo      The item info to push, in case of a folder all it's content will get pushed
-     * @param bintrayParams The Bintray model which holds the properties where to push
-     * @param headersMap    request header
-     * @return Multi status holder containing all the logs during the process
-     * @throws IOException In case of connection errors with Bintray
-     */
-    BasicStatusHolder pushArtifact(ItemInfo itemInfo, BintrayParams bintrayParams,
-            @Nullable Map<String, String> headersMap) throws IOException;
-
-    /**
-     * Pushing synchronously all build artifacts to Bintray
-     *
-     * @param build         The build of which to collect the artifacts to push
-     * @param bintrayParams The Bintray model which holds the properties where to push
-     * @param headersMap    request header
-     * @return Multi status holder containing all the logs during the process
-     * @throws IOException In case of connection errors with Bintray
-     */
-    BasicStatusHolder pushBuild(Build build, BintrayParams bintrayParams, @Nullable Map<String, String> headersMap)
-            throws IOException;
-
-    /**
-     * * Pushes a promoted build to Bintray according to the info supplied in the json spec file.
-     * expects to find the json spec file as one of the build's artifacts.
-     *
-     * @param build           The build to push
-     * @param gpgPassphrase   The key that is used with the subject's Bintray-stored gpg key to sign the version
-     * @param gpgSignOverride if set to true, overrides the gpgSign in the descriptor(if exists) or causes the version
-     *                        to be signed without a passphrase if no descriptor
-     * @param override        Overrides the descriptor with minimal parameters for version creation
-     * @return MultiStatusHolder containing results of the push operation
-     */
-    BasicStatusHolder pushPromotedBuild(Build build, String gpgPassphrase, Boolean gpgSignOverride,
-            BintrayUploadInfoOverride override);
-
-    /**
-     * Pushes a version to Bintray according to the file paths that are specified in the JSON file, if no paths are
-     * specified pushes the entire directory tree that resides under the folder containing the json file
-     *
-     * @param jsonFile      The json file
-     * @param gpgPassphrase The key that is used with the subject's Bintray-stored gpg key to sign the version
-     * @return MultiStatusHolder containing results of the push operation
-     */
-    BasicStatusHolder pushVersionFilesAccordingToSpec(FileInfo jsonFile, Boolean gpgSignOverride, String gpgPassphrase);
-
-    /**
-     * Pushing asynchronously all build artifacts to Bintray
-     *
-     * @param build         The build of which to collect the artifacts to push
-     * @param bintrayParams The Bintray model which holds the properties where to push
-     * @param headersMap    request header
-     */
-    @Async
-    void executeAsyncPushBuild(Build build, BintrayParams bintrayParams, @Nullable Map<String, String> headersMap);
-
-    /**
-     * Generates Bintray properties model from the metadata attached to a certain repo path
-     *
-     * @param repoPath The repo path to search attached metadata from
-     * @return The bintray model constructed from the metadata, empty model in case no metadata exists
-     */
-    @Nonnull
-    BintrayParams createParamsFromProperties(RepoPath repoPath);
-
-    /**
-     * Saves the given bintray model parameters as metadata properties on the given repo path
-     *
-     * @param repoPath      The repo path to attach metadata on
-     * @param bintrayParams The bintray model to attach as metadata
-     */
-    void savePropertiesOnRepoPath(RepoPath repoPath, BintrayParams bintrayParams);
-
-    /**
-     * Get available repositories from Bintray
-     * The list will contain repositories which the logged in user has permissions to deploy to
-     *
-     * @param headersMap request header
-     * @throws IOException      In case of connection errors with Bintray
-     * @throws BintrayException In case we received any response other than 200 OK
-     */
-    List<Repo> getReposToDeploy(@Nullable Map<String, String> headersMap) throws IOException, BintrayException;
-
-    /**
-     * Get available packages of specific repository from Bintray
-     * The list will contain packages which the logged in user has permissions to deploy to
-     *
-     * @param repoKey    The repository key to search packages under
-     * @param headersMap request header
-     * @throws IOException      In case of connection errors with Bintray
-     * @throws BintrayException In case we received any response other than 200 OK
-     */
-    List<String> getPackagesToDeploy(String repoKey, @Nullable Map<String, String> headersMap)
-            throws IOException, BintrayException;
-
-    /**
-     * Get available package versions of specific repository and package from Bintray
-     *
-     * @param repoKey    The repository key to search packages under
-     * @param packageId  The package name to search for versions
-     * @param headersMap request header
-     * @throws IOException      In case of connection errors with Bintray
-     * @throws BintrayException In case we received any response other than 200 OK
-     */
-    List<String> getVersions(String repoKey, String packageId, @Nullable Map<String, String> headersMap)
-            throws IOException, BintrayException;
-
-    /**
-     * Get the version URL in Bintray of which the user can browse into
-     *
-     * @param bintrayParams The bintray model to extract the URL from
-     */
-    String getVersionFilesUrl(BintrayParams bintrayParams);
-
-    /**
-     * Get a Bintray user information
-     *
-     * @param username   The username to search
-     * @param apiKey     The apiKey which belongs to the given username
-     * @param headersMap request header
-     * @throws IOException      In case of connection errors with Bintray
-     * @throws BintrayException In case we received any response other than 200 OK
-     */
-    BintrayUser getBintrayUser(String username, String apiKey, @Nullable Map<String, String> headersMap)
-            throws IOException, BintrayException;
-
-    /**
-     * Get a Bintray user information
-     *
-     * @param username The username to search
-     * @param apiKey   The apiKey which belongs to the given username
-     * @throws IOException      In case of connection errors with Bintray
-     * @throws BintrayException In case we received any response other than 200 OK
-     */
-    BintrayUser getBintrayUser(String username, String apiKey) throws IOException, BintrayException;
-
-    /**
-     * Validates that the user properly configured his Bintray credentials
-     */
-    boolean isUserHasBintrayAuth();
-
-    /**
-     * Get the registation URL for Bintray including Artifactory specific source query param.
-     * In case of Artifactory Pro, the license hash is also included with the query param value.
-     */
-    String getBintrayRegistrationUrl();
-
-    /**
-     * Search for a files by name, can take the * and ? wildcard characters.
-     */
-    BintrayItemSearchResults<BintrayItemInfo> searchByName(String query, @Nullable Map<String, String> headersMap)
-            throws IOException, BintrayException;
-
-    /**
-     * Retrieves JCenter repo
-     */
-    RemoteRepoDescriptor getJCenterRepo();
-
-    /**
-     * Retrieves from  Bintray package info for  item's sha1.
-     */
-    BintrayPackageInfo getBintrayPackageInfo(String sha1, @Nullable Map<String, String> headersMap);
-
-    /**
-     * Retrieves true if system Bintray API key exists
-     */
-    boolean hasBintraySystemUser();
-
-    /**
-     *  Uses either the credentials from the user profile or ones given globally as system params
-     */
-    Bintray createBasicAuthBintrayClient() throws IllegalArgumentException;
-
-    /**
-     *  Creates a basic auth Bintray client with specified {@param userName} ans {@param password}
-     */
-    Bintray createBasicAuthBintrayClient(String userName, String password, @Nullable ProxyDescriptor proxy, boolean useDefaultProxy) throws IllegalArgumentException;
-
-    /**
-     * Creates a 'blank' client without any auth configuration
-     */
-    Bintray createBlankBintrayClient() throws IllegalArgumentException;
-
-    /**
-     * Signs the {@param versionHandle} with the {@param gpgPassphrase} if the config {@param descriptorGpgSign}
-     * indicates to do so or if an {@param gpgSignOverride} was sent from the REST call that initiated the push
-     * operation.
-     * {@param fileCount} is used to approximate a suitable timeout for the signing operation and should always be > 0
-     */
-    void signVersion(VersionHandle versionHandle, boolean descriptorGpgSign, @Nullable Boolean gpgSignOverride,
-            @Nullable String gpgPassphrase, int fileCount, BasicStatusHolder status) throws Exception;
-}
diff --git a/base/api/src/main/java/org/artifactory/api/bintray/BintrayUploadInfo.java b/base/api/src/main/java/org/artifactory/api/bintray/BintrayUploadInfo.java
deleted file mode 100644
index 4f4056d..0000000
--- a/base/api/src/main/java/org/artifactory/api/bintray/BintrayUploadInfo.java
+++ /dev/null
@@ -1,202 +0,0 @@
-package org.artifactory.api.bintray;
-
-import com.jfrog.bintray.client.api.details.PackageDetails;
-import com.jfrog.bintray.client.api.details.RepositoryDetails;
-import com.jfrog.bintray.client.api.details.VersionDetails;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.jfrog.build.api.release.BintrayUploadInfoOverride;
-
-import java.io.Serializable;
-import java.util.*;
-
-/**
- * Container class for the Bintray client's PackageDetails and VersionDetails to allow easy deserialization from
- * Artifactory's own json format which also includes the file and property filters.
- *
- * @author Dan Feldman
- */
- at JsonIgnoreProperties(ignoreUnknown = true)
-public class BintrayUploadInfo implements Serializable {
-
-    @JsonProperty("repo")
-    RepositoryDetails repositoryDetails = new RepositoryDetails();
-    @JsonProperty("package")
-    PackageDetails packageDetails = new PackageDetails();
-    @JsonProperty("version")
-    VersionDetails versionDetails = new VersionDetails();
-    @JsonProperty(value = "applyToRepoFiles")
-    private List<String> artifactRelativePaths;                 //Relative paths in same repo
-    @JsonProperty(value = "applyToFiles")
-    private List<String> artifactPaths;                         //Fully qualified paths, from any repo
-    @JsonProperty(value = "applyToProps")
-    private Set<Map<String, Collection<String>>> filterProps;   //Properties to filter artifacts by
-    @JsonProperty
-    private Boolean publish;
-
-    public BintrayUploadInfo() {
-
-    }
-
-    @JsonIgnore
-    public BintrayUploadInfo(BintrayUploadInfoOverride override) {
-        this.packageDetails = new PackageDetails(override.packageName);
-        this.packageDetails.setSubject(override.subject);
-        this.packageDetails.setRepo(override.repoName);
-        this.packageDetails.setLicenses(override.licenses);
-        this.versionDetails = new VersionDetails(override.versionName);
-        this.packageDetails.setVcsUrl(override.vcsUrl);
-    }
-
-    public RepositoryDetails getRepositoryDetails() {
-        return repositoryDetails;
-    }
-
-    public void setRepositoryDetails(RepositoryDetails repositoryDetails) {
-        this.repositoryDetails = repositoryDetails;
-    }
-
-    public PackageDetails getPackageDetails() {
-        return packageDetails;
-    }
-
-    public void setPackageDetails(PackageDetails packageDetails) {
-        this.packageDetails = packageDetails;
-    }
-
-    public VersionDetails getVersionDetails() {
-        return versionDetails;
-    }
-
-    public void setVersionDetails(VersionDetails versionDetails) {
-        this.versionDetails = versionDetails;
-    }
-
-    public List<String> getArtifactRelativePaths() {
-        return artifactRelativePaths;
-    }
-
-    public void setArtifactRelativePaths(List<String> artifactRelativePaths) {
-        this.artifactRelativePaths = artifactRelativePaths;
-    }
-
-    public List<String> getArtifactPaths() {
-        return artifactPaths;
-    }
-
-    public void setArtifactPaths(List<String> artifactPaths) {
-        this.artifactPaths = artifactPaths;
-    }
-
-    public Set<Map<String, Collection<String>>> getFilterProps() {
-        return filterProps;
-    }
-
-    public void setFilterProps(Set<Map<String, Collection<String>>> filterProps) {
-        this.filterProps = filterProps;
-    }
-
-    public Boolean isPublish() {
-        return publish;
-    }
-
-    public void setPublish(Boolean publish) {
-        this.publish = publish;
-    }
-
-    @Override
-    @JsonIgnore
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof BintrayUploadInfo)) return false;
-
-        BintrayUploadInfo that = (BintrayUploadInfo) o;
-
-        if(repositoryDetails != null) {
-            if (that.repositoryDetails != null) {
-                if (!Optional.ofNullable(repositoryDetails.getName()).orElse("").equals(that.repositoryDetails.getName()) ||
-                !Optional.ofNullable(repositoryDetails.getOwner()).orElse("").equals(that.repositoryDetails.getOwner()) ||
-                !Optional.ofNullable(repositoryDetails.getType()).orElse("").equals(that.repositoryDetails.getType())) {
-                    return false;
-                }
-            } else {
-                return false;
-            }
-        } else if (that.repositoryDetails != null) {
-            return false;
-        }
-
-        if(packageDetails != null) {
-            if (that.packageDetails != null) {
-                if (!Optional.ofNullable(packageDetails.getName()).orElse("").equals(that.packageDetails.getName()) ||
-                        !Optional.ofNullable(packageDetails.getRepo()).orElse("").equals(that.packageDetails.getRepo()) ||
-                        !Optional.ofNullable(packageDetails.getOwner()).orElse("").equals(that.packageDetails.getOwner()) ||
-                        !Optional.ofNullable(packageDetails.getSubject()).orElse("").equals(that.packageDetails.getSubject())) {
-                    return false;
-                }
-            } else {
-                return false;
-            }
-        } else if (that.packageDetails != null) {
-            return false;
-        }
-
-        if(versionDetails != null) {
-            if (that.versionDetails != null) {
-                if (!Optional.ofNullable(versionDetails.getName()).orElse("").equals(that.versionDetails.getName()) ||
-                        !Optional.ofNullable(versionDetails.getOwner()).orElse("").equals(that.versionDetails.getOwner()) ||
-                        !Optional.ofNullable(versionDetails.getPkg()).orElse("").equals(that.versionDetails.getPkg()) ||
-                        !Optional.ofNullable(versionDetails.getRepo()).orElse("").equals(that.versionDetails.getRepo())) {
-                    return false;
-                }
-            } else {
-                return false;
-            }
-        } else if (that.versionDetails != null) {
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    @JsonIgnore
-    public int hashCode() {
-        int result = 0;
-        if(repositoryDetails != null) {
-            result = 31 * result + (repositoryDetails.getName() != null ? repositoryDetails.getName().hashCode() : 0);
-            result = 31 * result + (repositoryDetails.getOwner() != null ? repositoryDetails.getOwner().hashCode() : 0);
-            result = 31 * result + (repositoryDetails.getType() != null ? repositoryDetails.getType().hashCode() : 0);
-        }
-        if(packageDetails != null) {
-            result = 31 * result + (packageDetails.getName() != null ? packageDetails.getName().hashCode() : 0);
-            result = 31 * result + (packageDetails.getRepo() != null ? packageDetails.getRepo().hashCode() : 0);
-            result = 31 * result + (packageDetails.getOwner() != null ? packageDetails.getOwner().hashCode() : 0);
-            result = 31 * result + (packageDetails.getSubject() != null ? packageDetails.getSubject().hashCode() : 0);
-        }
-        if(versionDetails != null) {
-            result = 31 * result + (versionDetails.getName() != null ? versionDetails.getName().hashCode() : 0);
-            result = 31 * result + (versionDetails.getOwner() != null ? versionDetails.getOwner().hashCode() : 0);
-            result = 31 * result + (versionDetails.getPkg() != null ? versionDetails.getPkg().hashCode() : 0);
-            result = 31 * result + (versionDetails.getRepo() != null ? versionDetails.getRepo().hashCode() : 0);
-        }
-        return result;
-    }
-
-    @Override
-    @JsonIgnore
-    public String toString() {
-        String toString = "";
-        if(repositoryDetails != null) {
-            toString += repositoryDetails.getOwner() == null ? "" : repositoryDetails.getOwner() + "/";
-            toString += repositoryDetails.getName() == null ? "" : repositoryDetails.getName() + "/";
-        }
-        if(packageDetails != null) {
-            toString += packageDetails.getName() == null ? "" : packageDetails.getName() + "/";
-        }
-        if(versionDetails != null) {
-            toString += versionDetails.getName() == null ? "" : versionDetails.getName();
-        }
-        return toString;
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/bintray/BintrayUser.java b/base/api/src/main/java/org/artifactory/api/bintray/BintrayUser.java
deleted file mode 100644
index 3f1cde3..0000000
--- a/base/api/src/main/java/org/artifactory/api/bintray/BintrayUser.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.bintray;
-
-import org.codehaus.jackson.annotate.JsonProperty;
-
-import java.util.List;
-
-/**
- * @author Shay Yaakov
- */
-public class BintrayUser {
-
-    @JsonProperty(value = "name")
-    private String username;
-
-    @JsonProperty(value = "full_name")
-    private String fullName;
-
-    @JsonProperty(value = "gravatar_id")
-    private String gravatarUrl;
-
-    @JsonProperty
-    private List<String> organizations;
-
-    public String getUsername() {
-        return username;
-    }
-
-    public void setUsername(String username) {
-        this.username = username;
-    }
-
-    public String getFullName() {
-        return fullName;
-    }
-
-    public void setFullName(String fullName) {
-        this.fullName = fullName;
-    }
-
-    public String getGravatarUrl() {
-        return gravatarUrl;
-    }
-
-    public void setGravatarUrl(String gravatarUrl) {
-        this.gravatarUrl = gravatarUrl;
-    }
-
-    public List<String> getOrganizations() {
-        return organizations;
-    }
-
-    public void setOrganizations(List<String> organizations) {
-        this.organizations = organizations;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/bintray/Repo.java b/base/api/src/main/java/org/artifactory/api/bintray/Repo.java
deleted file mode 100644
index 97a92c7..0000000
--- a/base/api/src/main/java/org/artifactory/api/bintray/Repo.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.bintray;
-
-import java.io.Serializable;
-
-/**
- * Represents a repository in Bintray.
- *
- * @author Shay Yaakov
- */
-public class Repo implements Serializable {
-
-    private String name;
-    private String owner;
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getOwner() {
-        return owner;
-    }
-
-    public void setOwner(String owner) {
-        this.owner = owner;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/bintray/RepoPackage.java b/base/api/src/main/java/org/artifactory/api/bintray/RepoPackage.java
deleted file mode 100644
index 0e0c432..0000000
--- a/base/api/src/main/java/org/artifactory/api/bintray/RepoPackage.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.bintray;
-
-import com.google.common.collect.Lists;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * Represents a package in Bintray.
- *
- * @author Shay Yaakov
- */
-public class RepoPackage implements Serializable {
-    private String name;
-    private String repo;
-    private String owner;
-    private String desc;
-    List<String> versions = Lists.newArrayList();
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getRepo() {
-        return repo;
-    }
-
-    public void setRepo(String repo) {
-        this.repo = repo;
-    }
-
-    public String getOwner() {
-        return owner;
-    }
-
-    public void setOwner(String owner) {
-        this.owner = owner;
-    }
-
-    public String getDesc() {
-        return desc;
-    }
-
-    public void setDesc(String desc) {
-        this.desc = desc;
-    }
-
-    public List<String> getVersions() {
-        return versions;
-    }
-
-    public void setVersions(List<String> versions) {
-        this.versions = versions;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/bintray/distribution/Distribution.java b/base/api/src/main/java/org/artifactory/api/bintray/distribution/Distribution.java
deleted file mode 100644
index da4798b..0000000
--- a/base/api/src/main/java/org/artifactory/api/bintray/distribution/Distribution.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.artifactory.api.bintray.distribution;
-
-import org.codehaus.jackson.annotate.JsonIgnore;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A Distribution denotes an actions which distributes either a build or a list of files to Bintray using the specified
- * target repo's rules.
- *
- * @author Dan Feldman
- */
-public class Distribution {
-
-    private Boolean publish;
-    private Boolean overrideExistingFiles;
-    private List<String> sourceRepos;                                 //Used only when distributing build.
-    private List<String> packagesRepoPaths = new ArrayList<>();       //Used only when distributing packages.
-    private String targetRepo;
-    private String gpgPassphrase;
-    private boolean async = false;
-    private boolean dryRun = false;
-
-    public Boolean isPublish() {
-        return publish;
-    }
-
-    public void setPublish(Boolean publish) {
-        this.publish = publish;
-    }
-
-    public Boolean isOverrideExistingFiles() {
-        return overrideExistingFiles != null && overrideExistingFiles;
-    }
-
-    public void setOverrideExistingFiles(Boolean overrideExistingFiles) {
-        this.overrideExistingFiles = overrideExistingFiles;
-    }
-
-    public List<String> getSourceRepos() {
-        return sourceRepos;
-    }
-
-    public void setSourceRepos(List<String> sourceRepos) {
-        this.sourceRepos = sourceRepos;
-    }
-
-    public List<String> getPackagesRepoPaths() {
-        return packagesRepoPaths;
-    }
-
-    public void setPackagesRepoPaths(List<String> packagesRepoPaths) {
-        this.packagesRepoPaths = packagesRepoPaths;
-    }
-
-    @JsonIgnore
-    public void addPath(String fullRepoPath) {
-        packagesRepoPaths.add(fullRepoPath);
-    }
-
-    public String getTargetRepo() {
-        return targetRepo;
-    }
-
-    public void setTargetRepo(String targetRepo) {
-        this.targetRepo = targetRepo;
-    }
-
-    public String getGpgPassphrase() {
-        return gpgPassphrase;
-    }
-
-    public void setGpgPassphrase(String gpgPassphrase) {
-        this.gpgPassphrase = gpgPassphrase;
-    }
-
-    public boolean isAsync() {
-        return async;
-    }
-
-    public void setAsync(boolean async) {
-        this.async = async;
-    }
-
-    public boolean isDryRun() {
-        return dryRun;
-    }
-
-    public void setDryRun(boolean dryRun) {
-        this.dryRun = dryRun;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/bintray/distribution/DistributionService.java b/base/api/src/main/java/org/artifactory/api/bintray/distribution/DistributionService.java
deleted file mode 100644
index 6b30544..0000000
--- a/base/api/src/main/java/org/artifactory/api/bintray/distribution/DistributionService.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package org.artifactory.api.bintray.distribution;
-
-import com.google.common.collect.Multimap;
-import org.artifactory.api.bintray.BintrayUploadInfo;
-import org.artifactory.api.bintray.distribution.model.DistributionRepoCreationDetails;
-import org.artifactory.api.bintray.distribution.resolver.DistributionCoordinatesResolver;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.repo.Async;
-import org.artifactory.descriptor.repo.BintrayApplicationConfig;
-import org.artifactory.descriptor.repo.distribution.DistributionCoordinates;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.descriptor.repo.distribution.rule.DistributionRule;
-import org.artifactory.repo.RepoPath;
-
-import java.io.IOException;
-import java.util.List;
-
-/**
- * Interface defining the set of actions a Distribution Repo uses.
- *
- * @author Dan Feldman
- */
-public interface DistributionService {
-
-    /**
-     * First call made by the creation wizard, uses the client id and temp secret
-     * generated by Bintray to establish trust and acquire a token and a refresh token
-     *
-     * @param clientId    Client id generated by Bintray
-     * @param secret      Client secret generated by Bintray
-     * @param code        Code sent back with initial request that should be sent when acquiring token
-     * @param scope       Scope of authorization used by this app (generated by Bintray according to org)
-     * @param redirectUrl redirect url given in the initial request (must be identical)
-     * @return Key of the newly created  {@link BintrayApplicationConfig} that enables working with this
-     * Bintray OAuth Application
-     */
-    DistributionRepoCreationDetails createBintrayAppConfig(String clientId, String secret, String code, String scope, String redirectUrl) throws IOException;
-
-    /**
-     * Executes a 'refresh token' call in cases where the current token has expired and saves the new token
-     * in the config where {@param bintrayAppKey} is the key.
-     * Will save the change to the corresponding {@link BintrayApplicationConfig} if the returned refresh token has changed.
-     *
-     * @param repoKey Repository to update the token for.
-     * @return the new OAuth token to access the Bintray OAuth app denoted by {@param bintrayAppKey}
-     */
-    String refreshBintrayOAuthAppToken(String repoKey) throws Exception;
-
-    /**
-     * Tries to match each path from {@param paths} to the repo's {@link DistributionRule} (passed as {@param repoRules})
-     * that matches it most either by type (and path filtration if defined) or solely by path filtration.
-     * If no rules of the same type match an attempt to match against the generic rules will be made, if any were defined
-     * for the repo.
-     * Also populates each of the coordinate's {@link BintrayUploadInfo} that will
-     * be used eventually when pushing artifacts to Bintray using the {@param descriptor}
-     *
-     * @return The mapping of path in Artifactory to it's path ({@link DistributionCoordinates}) in Bintray.
-     */
-    Multimap<BintrayUploadInfo, DistributionCoordinatesResolver> coordinatesForPaths(List<RepoPath> paths, List<DistributionRule> repoRules,
-            DistributionRepoDescriptor descriptor, BasicStatusHolder status);
-
-    /**
-     * Returns UI specific info for create/update repo wizard of {@param repoKey} - org licenses, the bintray Oauth app
-     * flow), and is the org premium.
-     */
-    DistributionRepoCreationDetails getRepoCreationDetails(String repoKey) throws IOException;
-
-    /**
-     * Calls the repo specified in {@param distribution} - {@link Distribution#targetRepo} to distribute the artifacts
-     * specified in {@link Distribution#paths} using the other setting as well.
-     */
-    BasicStatusHolder distribute(Distribution distribution);
-
-    @Async
-    BasicStatusHolder distributeInternal(Distribution distribution);
-}
diff --git a/base/api/src/main/java/org/artifactory/api/bintray/distribution/model/DistributionRepoCreationDetails.java b/base/api/src/main/java/org/artifactory/api/bintray/distribution/model/DistributionRepoCreationDetails.java
deleted file mode 100644
index fc23c9c..0000000
--- a/base/api/src/main/java/org/artifactory/api/bintray/distribution/model/DistributionRepoCreationDetails.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.api.bintray.distribution.model;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Holds model info that can only be retrieved with valid auth information that users of this model
- * supply to the {@link org.artifactory.api.bintray.distribution.DistributionService} when calling relevant methods
- *
- * @author Dan Feldman
- */
-public class DistributionRepoCreationDetails {
-
-    public String oauthAppConfigKey;
-    public String oauthToken;
-    public List<String> orgLicenses = new ArrayList<>();
-    public boolean isOrgPremium = false;
-    public String org;
-    public String clientId;
-
-}
diff --git a/base/api/src/main/java/org/artifactory/api/bintray/distribution/resolver/DistributionCoordinatesResolver.java b/base/api/src/main/java/org/artifactory/api/bintray/distribution/resolver/DistributionCoordinatesResolver.java
deleted file mode 100644
index 9136514..0000000
--- a/base/api/src/main/java/org/artifactory/api/bintray/distribution/resolver/DistributionCoordinatesResolver.java
+++ /dev/null
@@ -1,385 +0,0 @@
-package org.artifactory.api.bintray.distribution.resolver;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.jfrog.bintray.client.api.details.Attribute;
-import com.jfrog.bintray.client.api.details.PackageDetails;
-import com.jfrog.bintray.client.api.details.RepositoryDetails;
-import com.jfrog.bintray.client.api.details.VersionDetails;
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.bintray.BintrayUploadInfo;
-import org.artifactory.api.bintray.distribution.rule.DistributionRulePropertyToken;
-import org.artifactory.api.bintray.distribution.rule.DistributionRuleToken;
-import org.artifactory.api.bintray.distribution.rule.DistributionRuleTokens;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.descriptor.repo.distribution.DistributionCoordinates;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.descriptor.repo.distribution.rule.DistributionRule;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.util.distribution.DistributionConstants;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nonnull;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import static org.artifactory.api.bintray.BintrayService.*;
-import static org.artifactory.api.bintray.distribution.resolver.DistributionRuleFilterType.GENERAL_CAP_GROUP_PATTERN;
-import static org.artifactory.util.distribution.DistributionConstants.ARTIFACT_TYPE_OVERRIDE_PROP;
-import static org.artifactory.util.distribution.DistributionConstants.TOKEN_PATTERN;
-
-/**
- * Distribution Coordinates implementation that holds it's own tokens (with values where applicable), capturing groups
- * if any were defined in the filters and can replace all tags in it's coordinate fields with actual values
- *
- * @author Dan Feldman
- */
-public class DistributionCoordinatesResolver extends DistributionCoordinates {
-    private static final Logger log = LoggerFactory.getLogger(DistributionCoordinatesResolver.class);
-
-    private final static String REPO_FIELD = "repo";
-    private final static String PACKAGE_FIELD = "package";
-    private final static String VERSION_FIELD = "version";
-    private final static String PATH_FIELD = "path";
-
-    @JsonIgnore
-    public RepoPath artifactPath; //Path (in Artifactory) of artifact that will be distributed.
-
-    @JsonIgnore
-    public List<DistributionRuleToken> tokens = new ArrayList<>(); //All related tokens and their values
-
-    @JsonIgnore
-    public RepoType type; //Type of the distributed artifact.
-
-    @JsonIgnore
-    public BintrayUploadInfo uploadInfo; //Info for bintray repo/pkg/version creation
-
-    @JsonIgnore
-    private Map<DistributionRuleFilterType, List<String>> capturingGroups = initCaptureGroups(); //Values of the capturing groups extracted from the rule.
-
-    private Map<DistributionRuleFilterType, List<String>> initCaptureGroups() {
-        Map<DistributionRuleFilterType, List<String>> map = Maps.newHashMap();
-        Stream.of(DistributionRuleFilterType.values()).forEach((type) -> map.put(type, Lists.newArrayList()));
-        return Collections.unmodifiableMap(map);
-    }
-
-    @JsonIgnore
-    private Properties pathProperties;
-
-    public DistributionCoordinatesResolver(DistributionRule rule, RepoPath path, @Nonnull Properties pathProperties) {
-        super(rule.getDistributionCoordinates());
-        this.artifactPath = path;
-        this.type = rule.getType();
-        this.tokens = DistributionRuleTokens.tokensByType(type);
-        this.ruleName = rule.getName();
-        this.pathProperties = pathProperties;
-    }
-
-    @JsonIgnore
-    public String ruleName; //The rule these resolver maps
-
-    @JsonIgnore
-    public RepoPath getArtifactPath() {
-        return artifactPath;
-    }
-
-    @JsonIgnore
-    public BintrayUploadInfo getBintrayUploadInfo() {
-        return uploadInfo;
-    }
-
-    /**
-     * adds {@param group} to the capturing groups list of the given filter type - maintains insertion order so that
-     * the token ${qualifier:1} will resolve to capturingGroups[type](0)
-     */
-    public void addCaptureGroup(DistributionRuleFilterType filterType, String group) {
-        this.capturingGroups.get(filterType).add(group);
-    }
-
-    /**
-     * Resolves the target Bintray coordinates by populating all tokens available to this resolver with properties set
-     * on the path it's supposed to resolve, or replace the fields with pre-existing Bintray coordinates that were
-     * already set on the path as properties as well.
-     *
-     * If no pre-existing coordinates exist, and tokens are populated with values, this method also replaces all tokens
-     * in each coordinate field of this resolver.
-     */
-    public DistributionCoordinatesResolver resolve(BasicStatusHolder status) {
-        if (pathProperties != null) {
-            if (pathHasDistributionCoordinates(pathProperties)) {
-                status.status("Path " + artifactPath.toPath() + " has pre-existing Bintray distribution coordinates."
-                        + " it will be distributed according to them.", log);
-                replaceFieldsWithExistingCoordinates(status);
-            } else {
-                populateTokenValues(status);
-                replaceTokensWithValues(status);
-            }
-        }
-        return validateNoTokensLeftInFields(status);
-    }
-
-    public static boolean pathHasDistributionCoordinates(Properties pathProperties) {
-        return pathProperties.containsKey(BINTRAY_REPO) && pathProperties.containsKey(BINTRAY_PACKAGE)
-                && pathProperties.containsKey(BINTRAY_VERSION) && pathProperties.containsKey(BINTRAY_PATH);
-    }
-
-    /**
-     * Assigns a value for each token based on what's in {@param pathProperties}
-     */
-    private void populateTokenValues(BasicStatusHolder status) {
-        for (DistributionRuleToken token : tokens) {
-            try {
-                token.populateValue(artifactPath, pathProperties);
-            } catch (Exception e) {
-                String err = e.getMessage() + " - in rule " + ruleName;
-                status.warn(err, 400, log);
-                log.debug(err, e);
-            }
-        }
-    }
-
-    /**
-     * replaces all field of this resolver with the pre-existing coordinates (bintray.repo/package/version/path) in
-     * {@param pathProperties} to support the re-distribute action
-     * use only if all properties are set on the path!
-     */
-    private void replaceFieldsWithExistingCoordinates(BasicStatusHolder status) {
-        this.repo = pathProperties.getFirst(BINTRAY_REPO);
-        this.pkg = pathProperties.getFirst(BINTRAY_PACKAGE);
-        this.version = pathProperties.getFirst(BINTRAY_VERSION);
-        this.path = pathProperties.getFirst(BINTRAY_PATH);
-        try {
-            this.type = RepoType.fromType(pathProperties.getFirst(ARTIFACT_TYPE_OVERRIDE_PROP));
-        } catch (Exception e) {
-            status.warn("Failed to retrieve artifact path from expected property " + ARTIFACT_TYPE_OVERRIDE_PROP +
-                    ". artifact " + artifactPath + " will be distributed with the existing coordinates but as "
-                    + "generic", 404, log);
-        }
-        try {
-            //Push to Bintray sets the repo property as 'subject/repo' distribution does not use the subject.
-            if (repo.contains("/")) {
-                log.debug("Found old Bintray repo coordinate property for Bintray repo: {}, removing subject" +
-                        " from field for resolution", repo);
-                repo = repo.split("/")[1];
-            }
-        } catch (Exception e) {
-            status.warn("Failed to get subject from old bintray repo coordinate property: " + repo + ": "
-                    + e.getMessage() + ". the repo coordinate will be used as-is.", log);
-        }
-        log.debug("Overriding coordinates by rule for path {}, based on existing distribution coordinates set on " +
-                        "it: repo -> {}, package -> {}, version -> {}, path -> {}", artifactPath.toPath(), repo, pkg,
-                version, path);
-    }
-
-    /**
-     * Replaces all tokens in each of the coordinate fields (repo, package, version, path) with actual values,
-     * according to the tokens available to this rule (given as {@param tokens}) and the capturing groups
-     * (given as {@param capturingGroups}) extracted from the rule's path filter, if any.
-     */
-    private DistributionCoordinatesResolver replaceTokensWithValues(BasicStatusHolder status) {
-        try {
-            for (DistributionRuleToken token : tokens) {
-                repo = replaceTokenInField(token, repo, REPO_FIELD);
-                pkg = replaceTokenInField(token, pkg, PACKAGE_FIELD);
-                version = replaceTokenInField(token, version, VERSION_FIELD);
-                path = replaceTokenInField(token, path, PATH_FIELD);
-            }
-            for (DistributionRuleFilterType filterType : DistributionRuleFilterType.values()) {
-                if (CollectionUtils.isNotEmpty(capturingGroups.get(filterType))) {
-                    repo = replaceCaptureGroupsInField(filterType, repo, REPO_FIELD);
-                    pkg = replaceCaptureGroupsInField(filterType, pkg, PACKAGE_FIELD);
-                    version = replaceCaptureGroupsInField(filterType, version, VERSION_FIELD);
-                    path = replaceCaptureGroupsInField(filterType, path, PATH_FIELD);
-                }
-            }
-        } catch (Exception e) {
-            String err = (e.getMessage() == null ? "An error occurred while resolving distribution " +
-                    "coordinates for artifact " + artifactPath.toPath() : e.getMessage())
-                    + " - in rule " + ruleName;
-            status.warn(err + ". Check the log for more details.", 400, log);
-            log.debug(err, e);
-        }
-        return this;
-    }
-
-    private String replaceTokenInField(DistributionRuleToken token, String field, String fieldName) throws Exception {
-        if (field.contains(token.getToken())) {
-            if (token.getValue() == null) {
-                String err = "Failing rule " + ruleName + " - No value present for token " + token.getToken() +
-                        " that was found in field '" + fieldName + "' for artifact " + artifactPath.toPath();
-                if (token instanceof DistributionRulePropertyToken
-                        && !token.getToken().equals(DistributionConstants.PRODUCT_NAME_TOKEN)) {
-                    err += "Verify that this package has been indexed and property " +
-                            ((DistributionRulePropertyToken) token).getPropertyKey() + " is set correctly.";
-                }
-                throw new Exception(err);
-            }
-            log.debug("Found token {} in '{}' field: {} for artifact {}. replacing with value {}", token.getToken(),
-                    fieldName, artifactPath.toPath(), field, token.getValue());
-            Matcher fieldMatcher = Pattern.compile(token.getToken(), Pattern.LITERAL).matcher(field);
-            return fieldMatcher.replaceAll(token.getValue());
-        }
-        return field;
-    }
-
-    private String replaceCaptureGroupsInField(DistributionRuleFilterType filterType, String field, String fieldName) throws Exception {
-        Matcher capGroupMatcher = filterType.getCaptureGroupPattern().matcher(field);
-        while (capGroupMatcher.find()) {
-            String group = capGroupMatcher.group(0);
-            log.debug("Found group token {} in {} field {}. trying to parse group number", group, fieldName, field);
-            int groupNum = filterType.getGroupNumber(group);
-            try {
-                //group 1 is position 0 in the array
-                String val = capturingGroups.get(filterType).get(groupNum - 1);
-                log.debug("Replacing group token {} with value {}", group, val);
-                field = field.replaceAll(Pattern.quote(group), val);
-            } catch (IndexOutOfBoundsException obe) {
-                throw new Exception("No capturing group found with number " + groupNum + " for field " + fieldName +
-                        " : " + field + ". Failing distribution rule '" + ruleName + "'.");
-            }
-        }
-        capGroupMatcher = capGroupMatcher.reset(field);
-        //Field still has unmatched capture group tokens - fail the rule
-        if (capGroupMatcher.find()) {
-            throw new Exception("Couldn't match all capture group tokens in field " + fieldName + ": " + field
-                    + ". Failing distribution rule '" + ruleName + "'.");
-        }
-        return field;
-    }
-
-    /**
-     * Validates no tokens are left in the coordinate fields - will fail the rule if any tokens are left.
-     */
-    private DistributionCoordinatesResolver validateNoTokensLeftInFields(BasicStatusHolder status) {
-        boolean hasTokens = false;
-        String err = "Coordinate Field %s in rule '" + ruleName + "' contains tokens that were not matched: %s" +
-                " for artifact " + artifactPath.toPath() + ", failing this rule.";
-        if (containsToken(repo)) {
-            hasTokens = true;
-            status.error(String.format(err, REPO_FIELD, repo), 400, log);
-        } else if (containsToken(pkg)) {
-            hasTokens = true;
-            status.error(String.format(err, PACKAGE_FIELD, pkg), 400, log);
-        } else if (containsToken(version)) {
-            hasTokens = true;
-            status.error(String.format(err, VERSION_FIELD, version), 400, log);
-        } else if (containsToken(path)) {
-            hasTokens = true;
-            status.error(String.format(err, PATH_FIELD, path), 400, log);
-        }
-        if (hasTokens) {
-            return null;
-        }
-        return this;
-    }
-
-    /**
-     * @return true if the given string (representing a field in the coordinates resolver) contains a token
-     */
-    private static boolean containsToken(String field) {
-        return TOKEN_PATTERN.matcher(field).find() || GENERAL_CAP_GROUP_PATTERN.matcher(field).find();
-    }
-
-    @JsonIgnore
-    public DistributionCoordinatesResolver populateUploadInfo(DistributionRepoDescriptor descriptor) {
-        BintrayUploadInfo info = new BintrayUploadInfo();
-
-        //repo
-        RepositoryDetails btRepo = new RepositoryDetails();
-        btRepo.setName(repo);
-        setBintrayRepoType(btRepo);
-        btRepo.setOwner(descriptor.getBintrayApplication().getOrg());
-        btRepo.setIsPrivate(descriptor.getDefaultNewRepoPrivate());
-        btRepo.setPremium(descriptor.getDefaultNewRepoPremium());
-        btRepo.setUpdateExisting(false);
-        info.setRepositoryDetails(btRepo);
-
-        //pkg
-        PackageDetails btPkg = new PackageDetails(pkg);
-        if (CollectionUtils.isNotEmpty(descriptor.getDefaultLicenses())) {
-            btPkg.licenses(Lists.newArrayList(descriptor.getDefaultLicenses()));
-        }
-        if (StringUtils.isNotBlank(descriptor.getDefaultVcsUrl())) {
-            btPkg.vcsUrl(descriptor.getDefaultVcsUrl());
-        }
-        info.setPackageDetails(btPkg);
-
-        //version
-        VersionDetails versionDetails = new VersionDetails(version);
-        versionDetails.setAttributes(getWhitelistProperties(descriptor));
-        info.setVersionDetails(versionDetails);
-
-        this.uploadInfo = info;
-        return this;
-    }
-
-    private List<Attribute> getWhitelistProperties(DistributionRepoDescriptor descriptor) {
-        return descriptor.getWhiteListedProperties().stream()
-                .filter(pathProperties::containsKey)
-                .map(propKey -> new Attribute<>(propKey, Attribute.Type.string, Lists.newArrayList(pathProperties.get(propKey))))
-                .collect(Collectors.toList());
-    }
-
-    private void setBintrayRepoType(RepositoryDetails btRepo) {
-        switch (type) {
-            case YUM:
-                btRepo.setType("rpm");
-                break;
-            case Maven:
-            case Ivy:
-            case SBT:
-            case Gradle:
-                btRepo.setType("maven");
-                break;
-            case NuGet:
-                btRepo.setType("nuget");
-                break;
-            case Vagrant:
-                btRepo.setType("vagrant");
-                break;
-            case Debian:
-                btRepo.setType("debian");
-                break;
-            case Opkg:
-                btRepo.setType("opkg");
-                break;
-            case Docker:
-                btRepo.setType("docker");
-                break;
-            default:
-                btRepo.setType("generic");
-        }
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof DistributionCoordinatesResolver)) return false;
-        if (!super.equals(o)) return false;
-        DistributionCoordinatesResolver resolver = (DistributionCoordinatesResolver) o;
-        return artifactPath != null ? artifactPath.equals(resolver.artifactPath) : resolver.artifactPath == null;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = super.hashCode();
-        result = 31 * result + (artifactPath != null ? artifactPath.hashCode() : 0);
-        return result;
-    }
-
-    @Override
-    public String toString() {
-        return artifactPath + " -> " + repo + "/" + pkg + "/" + version + "/" + path;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/bintray/distribution/resolver/DistributionRuleFilterType.java b/base/api/src/main/java/org/artifactory/api/bintray/distribution/resolver/DistributionRuleFilterType.java
deleted file mode 100644
index c34ec13..0000000
--- a/base/api/src/main/java/org/artifactory/api/bintray/distribution/resolver/DistributionRuleFilterType.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.artifactory.api.bintray.distribution.resolver;
-
-import java.util.regex.Pattern;
-
-/**
- * <p>Created on 18/05/16
- *
- * @author Yinon Avraham
- */
-public enum DistributionRuleFilterType {
-
-    repo("repo"),
-    path("path");
-
-    public static final Pattern GENERAL_CAP_GROUP_PATTERN = createCapGroupPattern("[a-z]+");
-
-    private final String qualifier;
-    private final Pattern capGroupPattern;
-
-    DistributionRuleFilterType(String qualifier) {
-        this.qualifier = qualifier;
-        this.capGroupPattern = createCapGroupPattern(qualifier);
-    }
-
-    private static Pattern createCapGroupPattern(String qualifier) {
-        return Pattern.compile("(\\$\\{" + qualifier + ":\\d+\\})"); // ${qualifier:group_number}
-    }
-
-    public String getQualifier() {
-        return qualifier;
-    }
-
-    public Pattern getCaptureGroupPattern() {
-        return capGroupPattern;
-    }
-
-    /**
-     * Tries to extract a capture group's number.
-     *
-     * @param group the captured group text, e.g. "${repo:1}"
-     * @return the int value of the group
-     */
-    public int getGroupNumber(String group) throws NumberFormatException {
-        int start = ("${" + qualifier + ":").length();
-        return Integer.parseInt(group.substring(start, group.length()-1));
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/bintray/distribution/rule/DistributionRuleLayoutToken.java b/base/api/src/main/java/org/artifactory/api/bintray/distribution/rule/DistributionRuleLayoutToken.java
deleted file mode 100644
index b845b0e..0000000
--- a/base/api/src/main/java/org/artifactory/api/bintray/distribution/rule/DistributionRuleLayoutToken.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.artifactory.api.bintray.distribution.rule;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-
-/**
- * Denotes an available token for a distribution rule that resolves to section of the layout this artifact belongs to
- * (i.e. the layout of the repo storing this artifact)
- *
- * @author Dan Feldman
- */
-public class DistributionRuleLayoutToken implements DistributionRuleToken {
-
-    //Token is the same as the layout token
-    private String token;
-    private String value;
-
-    public DistributionRuleLayoutToken(String token) {
-        this.token = token;
-    }
-
-    @Override
-    public String getToken() {
-        return token;
-    }
-
-    @Override
-    public String getValue() {
-        return value;
-    }
-
-    @Override
-    public void populateValue(RepoPath path, Properties pathProperties) throws Exception {
-        value = pathProperties.getFirst(token);
-        if (StringUtils.isBlank(value)) {
-            throw new Exception("No value was resolved for layout token " + token + " on artifact " + path.toPath());
-        }
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/bintray/distribution/rule/DistributionRulePathToken.java b/base/api/src/main/java/org/artifactory/api/bintray/distribution/rule/DistributionRulePathToken.java
deleted file mode 100644
index 130b1cc..0000000
--- a/base/api/src/main/java/org/artifactory/api/bintray/distribution/rule/DistributionRulePathToken.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.artifactory.api.bintray.distribution.rule;
-
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.util.PathUtils;
-
-import static org.artifactory.util.distribution.DistributionConstants.PATH_TOKEN;
-
-/**
- * Denotes an available token for a distribution rule that resolves to the Artifact's path.
- * Can optionally use {@param pathElement} to indicate the value should be populated by the path element in that
- * position after running the path through {@link PathUtils#getPathElements}.
- *
- * @author Dan Feldman
- */
-public class DistributionRulePathToken implements DistributionRuleToken {
-
-    private String token = PATH_TOKEN;
-    private String value;
-    private int pathElement;
-
-    public DistributionRulePathToken(String token) {
-        this.token = token;
-        this.pathElement = 0;
-    }
-
-    public DistributionRulePathToken(String token, int pathElement) {
-        this.token = token;
-        this.pathElement = pathElement;
-    }
-
-    @Override
-    public String getToken() {
-        return token;
-    }
-
-    @Override
-    public String getValue() {
-        return value;
-    }
-
-    @Override
-    public void populateValue(RepoPath path, Properties pathProperties) throws Exception {
-        if (pathElement > 0) {
-            String[] elements = PathUtils.getPathElements(path.getPath());
-            if (elements.length < pathElement) {
-                throw new Exception("Token " + token + " is unable to resolve a value from path " + path + " as it's" +
-                        " trying to match a path location " + pathElement + " that doesn't exist.");
-            } else {
-                value = elements[pathElement -1];
-            }
-        } else {
-            value = path.getPath();
-        }
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/bintray/distribution/rule/DistributionRulePropertyToken.java b/base/api/src/main/java/org/artifactory/api/bintray/distribution/rule/DistributionRulePropertyToken.java
deleted file mode 100644
index 17691a2..0000000
--- a/base/api/src/main/java/org/artifactory/api/bintray/distribution/rule/DistributionRulePropertyToken.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.artifactory.api.bintray.distribution.rule;
-
-import org.apache.commons.collections.CollectionUtils;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.util.PathUtils;
-import org.codehaus.jackson.annotate.JsonIgnore;
-
-import java.util.Set;
-
-/**
- * Denotes an available token for a distribution rule that resolves to a property set on the Artifact.
- *
- * @author Dan Feldman
- */
-public class DistributionRulePropertyToken implements DistributionRuleToken {
-
-    @JsonIgnore
-    private String propertyKey;
-    private String token;
-    private String value;
-
-    public DistributionRulePropertyToken(String token, String key) {
-        this.token = token;
-        this.propertyKey = key;
-    }
-
-    @Override
-    public String getToken() {
-        return token;
-    }
-
-    @Override
-    public String getValue() {
-        return value;
-    }
-
-    @JsonIgnore
-    public String getPropertyKey() {
-        return propertyKey;
-    }
-
-    @Override
-    public void populateValue(RepoPath path, Properties pathProperties) throws Exception {
-        Set<String> values = pathProperties.get(propertyKey);
-        if (CollectionUtils.isEmpty(values)) {
-            throw new Exception("No value was resolved for property token " + token + " on artifact " + path.toPath()
-            + ", which is resolved from property: " + propertyKey);
-        }
-        value = PathUtils.collectionToDelimitedString(values);
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/bintray/distribution/rule/DistributionRuleToken.java b/base/api/src/main/java/org/artifactory/api/bintray/distribution/rule/DistributionRuleToken.java
deleted file mode 100644
index 6b55714..0000000
--- a/base/api/src/main/java/org/artifactory/api/bintray/distribution/rule/DistributionRuleToken.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.artifactory.api.bintray.distribution.rule;
-
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-
-/**
- * Denotes an available token for a distribution rule that resolves to a property set on the Artifact.
- *
- * @author Dan Feldman
- */
-public interface DistributionRuleToken {
-
-    String getToken();
-
-    String getValue();
-
-    /**
-     * Populates the value of this token if it's actual key matches a key in the properties, or the path.
-     * the {@param Properties} are used to pass any key-value pair that tokens might use such as actual properties
-     * set on an Artifact or layout tokens and their actual value
-     */
-    void populateValue(RepoPath path, Properties pathProperties) throws Exception;
-}
diff --git a/base/api/src/main/java/org/artifactory/api/bintray/distribution/rule/DistributionRuleTokenFactory.java b/base/api/src/main/java/org/artifactory/api/bintray/distribution/rule/DistributionRuleTokenFactory.java
deleted file mode 100644
index a0704b0..0000000
--- a/base/api/src/main/java/org/artifactory/api/bintray/distribution/rule/DistributionRuleTokenFactory.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.artifactory.api.bintray.distribution.rule;
-
-/**
- * <p>Created on 18/05/16
- *
- * @author Yinon Avraham
- */
-public interface DistributionRuleTokenFactory {
-
-    DistributionRuleToken create();
-
-}
diff --git a/base/api/src/main/java/org/artifactory/api/bintray/distribution/rule/DistributionRuleTokens.java b/base/api/src/main/java/org/artifactory/api/bintray/distribution/rule/DistributionRuleTokens.java
deleted file mode 100644
index 1c44448..0000000
--- a/base/api/src/main/java/org/artifactory/api/bintray/distribution/rule/DistributionRuleTokens.java
+++ /dev/null
@@ -1,191 +0,0 @@
-package org.artifactory.api.bintray.distribution.rule;
-
-import com.google.common.collect.Lists;
-import org.artifactory.descriptor.repo.RepoType;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import static org.artifactory.util.distribution.DistributionConstants.*;
-
-/**
- * Tokens that are available to each rule based on its {@link RepoType}
- *
- * @author Dan Feldman
- */
-public enum DistributionRuleTokens {
-
-    bowerName(RepoType.Bower, () -> new DistributionRulePropertyToken(Keys.packageName.key, "bower.name")),
-    bowerVersion(RepoType.Bower, () -> new DistributionRulePropertyToken(Keys.packageVersion.key, "bower.version")),
-    cocoaPodsName(RepoType.CocoaPods, () -> new DistributionRulePropertyToken(Keys.packageName.key, "pods.name")),
-    cocoaPodsVersion(RepoType.CocoaPods, () -> new DistributionRulePropertyToken(Keys.packageVersion.key, "pods.version")),
-    debianName(RepoType.Debian, () -> new DistributionRulePropertyToken(Keys.packageName.key, "deb.name")),
-    debianVersion(RepoType.Debian, () -> new DistributionRulePropertyToken(Keys.packageVersion.key, "deb.version")),
-    debianDistribution(RepoType.Debian, () -> new DistributionRulePropertyToken(Keys.debDist.key, "deb.distribution")),
-    debianComponent(RepoType.Debian, () -> new DistributionRulePropertyToken(Keys.debComp.key, "deb.component")),
-    debianArchitecture(RepoType.Debian, () -> new DistributionRulePropertyToken(Keys.architecture.key, "deb.architecture")),
-    dockerImage(RepoType.Docker, () -> new DistributionRulePropertyToken(Keys.dockerImage.key, "docker.repoName")),
-    dockerTag(RepoType.Docker, () -> new DistributionRulePropertyToken(Keys.dockerTag.key, "docker.manifest")),
-    // gemName(RepoType.Gems, () -> new DistributionRulePropertyToken(Keys.packageName.key, "gem.name")),
-    // gemVersion(RepoType.Gems, () -> new DistributionRulePropertyToken(Keys.packageVersion.key, "gem.version")),
-    gradleOrg(RepoType.Gradle, () -> new DistributionRuleLayoutToken(Keys.layoutOrg.key)),
-    gradleModule(RepoType.Gradle, () -> new DistributionRuleLayoutToken(Keys.layoutModule.key)),
-    gradleBaseRev(RepoType.Gradle, () -> new DistributionRuleLayoutToken(Keys.layoutBaseRev.key)),
-    // gradleFolderRev(RepoType.Gradle, () -> new DistributionRuleLayoutToken(Keys.layoutFolderRev.key)),
-    // gradleFileRev(RepoType.Gradle, () -> new DistributionRuleLayoutToken(Keys.layoutFileRev.key)),
-    gradleClassifier(RepoType.Gradle, () -> new DistributionRuleLayoutToken(Keys.layoutClassifier.key)),
-    gradleExt(RepoType.Gradle, () -> new DistributionRuleLayoutToken(Keys.layoutExt.key)),
-    ivyOrg(RepoType.Ivy, () -> new DistributionRuleLayoutToken(Keys.layoutOrg.key)),
-    ivyModule(RepoType.Ivy, () -> new DistributionRuleLayoutToken(Keys.layoutModule.key)),
-    ivyBaseRev(RepoType.Ivy, () -> new DistributionRuleLayoutToken(Keys.layoutBaseRev.key)),
-    // ivyFolderRev(RepoType.Ivy, () -> new DistributionRuleLayoutToken(Keys.layoutFolderRev.key)),
-    ivyType(RepoType.Ivy, () -> new DistributionRuleLayoutToken(Keys.layoutType.key)),
-    ivyClassifier(RepoType.Ivy, () -> new DistributionRuleLayoutToken(Keys.layoutClassifier.key)),
-    // ivyFileRev(RepoType.Ivy, () -> new DistributionRuleLayoutToken(Keys.layoutFileRev.key)),
-    ivyExt(RepoType.Ivy, () -> new DistributionRuleLayoutToken(Keys.layoutExt.key)),
-    mavenOrg(RepoType.Maven, () -> new DistributionRuleLayoutToken(Keys.layoutOrgPath.key)),
-    mavenModule(RepoType.Maven, () -> new DistributionRuleLayoutToken(Keys.layoutModule.key)),
-    mavenBaseRev(RepoType.Maven, () -> new DistributionRuleLayoutToken(Keys.layoutBaseRev.key)),
-    // mavenFolderRev(RepoType.Maven, () -> new DistributionRuleLayoutToken(Keys.layoutFolderRev.key)),
-    // mavenFileRev(RepoType.Maven, () -> new DistributionRuleLayoutToken(Keys.layoutFileRev.key)),
-    mavenClassifier(RepoType.Maven, () -> new DistributionRuleLayoutToken(Keys.layoutClassifier.key)),
-    mavenExt(RepoType.Maven, () -> new DistributionRuleLayoutToken(Keys.layoutExt.key)),
-    npmName(RepoType.Npm, () -> new DistributionRulePropertyToken(Keys.packageName.key, "npm.name")),
-    npmVersion(RepoType.Npm, () -> new DistributionRulePropertyToken(Keys.packageVersion.key, "npm.version")),
-    // npmScope(RepoType.Npm, () -> new DistributionRulePropertyToken(Keys.scope.key, "npm.name")), //TODO [by dan]: special handle scope
-    nuGetName(RepoType.NuGet, () -> new DistributionRulePropertyToken(Keys.packageName.key, "nuget.id")),
-    nuGetVersion(RepoType.NuGet, () -> new DistributionRulePropertyToken(Keys.packageVersion.key, "nuget.version")),
-    opkgName(RepoType.Opkg, () -> new DistributionRulePropertyToken(Keys.packageName.key, "opkg.name")),
-    opkgVersion(RepoType.Opkg, () -> new DistributionRulePropertyToken(Keys.packageVersion.key, "opkg.version")),
-    opkgArchitecture(RepoType.Opkg, () -> new DistributionRulePropertyToken(Keys.architecture.key, "opkg.architecture")),
-    // pypiName(RepoType.Pypi, () -> new DistributionRulePropertyToken(Keys.packageName.key, "pypi.name")),
-    // pypiVersion(RepoType.Pypi, () -> new DistributionRulePropertyToken(Keys.packageVersion.key, "pypi.version")),
-    rpmName(RepoType.YUM, () -> new DistributionRulePropertyToken(Keys.packageName.key, "rpm.metadata.name")),
-    rpmVersion(RepoType.YUM, () -> new DistributionRulePropertyToken(Keys.packageVersion.key, "rpm.metadata.version")),
-    rpmArchitecture(RepoType.YUM, () -> new DistributionRulePropertyToken(Keys.architecture.key, "rpm.metadata.arch")),
-    sbtOrg(RepoType.SBT, () -> new DistributionRuleLayoutToken(Keys.layoutOrg.key)),
-    sbtModule(RepoType.SBT, () -> new DistributionRuleLayoutToken(Keys.layoutModule.key)),
-    sbtScalaVersion(RepoType.SBT, () -> new DistributionRuleLayoutToken(Keys.layoutScalaVer.key)),
-    sbtSbtVersion(RepoType.SBT, () -> new DistributionRuleLayoutToken(Keys.layoutSbtVer.key)),
-    sbtBaseRev(RepoType.SBT, () -> new DistributionRuleLayoutToken(Keys.layoutBaseRev.key)),
-    sbtType(RepoType.SBT, () -> new DistributionRuleLayoutToken(Keys.layoutType.key)),
-    sbtClassifier(RepoType.SBT, () -> new DistributionRuleLayoutToken(Keys.layoutClassifier.key)),
-    sbtExt(RepoType.SBT, () -> new DistributionRuleLayoutToken(Keys.layoutExt.key)),
-    vagrantName(RepoType.Vagrant, () -> new DistributionRulePropertyToken(Keys.packageName.key, "box_name")),
-    vagrantVersion(RepoType.Vagrant, () -> new DistributionRulePropertyToken(Keys.packageVersion.key, "box_version")),
-    vagrantProvider(RepoType.Vagrant, () -> new DistributionRulePropertyToken(Keys.vagrantProvider.key, "box_provider"));
-    // vcsOrg(RepoType.VCS, () -> new DistributionRulePathToken(Keys.vcsOrg.key, 2)),
-    // vcsRepo(RepoType.VCS, () -> new DistributionRulePathToken(Keys.vcsRepo.key, 3)),
-    // vcsTag(RepoType.VCS, () -> new DistributionRulePropertyToken(Keys.vcsTag.key, "vcs.tag")),
-    // vcsBranch(RepoType.VCS, () -> new DistributionRulePropertyToken(Keys.vcsBranch.key, "vcs.branch"));
-
-    final RepoType type;
-    final DistributionRuleTokenFactory tokenFactory;
-
-    DistributionRuleTokens(RepoType type, DistributionRuleTokenFactory tokenFactory) {
-        this.type = type;
-        this.tokenFactory = tokenFactory;
-    }
-
-    public DistributionRuleToken getToken() {
-        return tokenFactory.create();
-    }
-
-    DistributionRuleTokenFactory getTokenFactory() {
-        return tokenFactory;
-    }
-
-    public static final DistributionRuleTokenFactory PRODUCT_NAME_TOKEN_FACTORY = () -> new DistributionRulePropertyToken(PRODUCT_NAME_TOKEN, PRODUCT_NAME_DUMMY_PROP);
-
-    public static DistributionRuleToken getProductNameToken() {
-        return PRODUCT_NAME_TOKEN_FACTORY.create();
-    }
-
-    /**
-     * @return all tokens available to the given {@param type}, with the default path and product name tokens.
-     */
-    public static List<DistributionRuleToken> tokensByType(RepoType type) {
-        List<DistributionRuleToken> allTokens = Lists.newArrayList();
-        if (type == null) {
-            return allTokens;
-        }
-        allTokens.add(new DistributionRulePathToken(PATH_TOKEN));
-        allTokens.addAll(Stream.of(Types.values())
-                .filter(types -> type.equals(types.repoType))
-                .findAny()
-                .orElse(Types.dummy)
-                .tokenFactories.stream().map(DistributionRuleTokenFactory::create).collect(Collectors.toList()));
-        return allTokens;
-    }
-
-    private static List<DistributionRuleTokenFactory> tokensByPackageType(RepoType type) {
-        return Stream.of(values())
-                .filter(tokenKey -> tokenKey.type.equals(type))
-                .map(DistributionRuleTokens::getTokenFactory)
-                .collect(Collectors.toList());
-    }
-
-    public enum Types {
-        bower(RepoType.Bower, tokensByPackageType(RepoType.Bower)),
-        cocoaPods(RepoType.CocoaPods, tokensByPackageType(RepoType.CocoaPods)),
-        debian(RepoType.Debian, tokensByPackageType(RepoType.Debian)),
-        docker(RepoType.Docker, tokensByPackageType(RepoType.Docker)),
-        // gems(RepoType.Gems, tokensByPackageType(RepoType.Gems)),
-        gradle(RepoType.Gradle, tokensByPackageType(RepoType.Gradle)),
-        ivy(RepoType.Ivy, tokensByPackageType(RepoType.Ivy)),
-        maven(RepoType.Maven, tokensByPackageType(RepoType.Maven)),
-        npm(RepoType.Npm, tokensByPackageType(RepoType.Npm)),
-        nuGet(RepoType.NuGet, tokensByPackageType(RepoType.NuGet)),
-        opkg(RepoType.Opkg, tokensByPackageType(RepoType.Opkg)),
-        // pypi(RepoType.Pypi, tokensByPackageType(RepoType.Pypi)),
-        rpm(RepoType.YUM, tokensByPackageType(RepoType.YUM)),
-        sbt(RepoType.SBT, tokensByPackageType(RepoType.SBT)),
-        vagrant(RepoType.Vagrant, tokensByPackageType(RepoType.Vagrant)),
-        // vcs(RepoType.VCS, tokensByPackageType(RepoType.VCS)),
-        dummy(null, new ArrayList<>());
-
-        final RepoType repoType;
-        final List<DistributionRuleTokenFactory> tokenFactories;
-
-        Types(RepoType repoType, List<DistributionRuleTokenFactory> tokenFactories) {
-            this.repoType = repoType;
-            this.tokenFactories = Collections.unmodifiableList(Lists.newArrayList(tokenFactories));
-        }
-    }
-
-    public enum Keys {
-        packageName(PACKAGE_NAME_TOKEN),
-        packageVersion(PACKAGE_VERSION_TOKEN),
-        debDist(wrapToken("distribution")),
-        debComp(wrapToken("component")),
-        architecture(ARCHITECTURE_TOKEN),
-        vagrantProvider(wrapToken("boxProvider")),
-        layoutOrg(wrapToken("org")),
-        layoutOrgPath(wrapToken("orgPath")),
-        layoutModule(MODULE_TOKEN),
-        layoutBaseRev(BASE_REV_TOKEN),
-        layoutFolderRev(wrapToken("folderItegRev")),
-        layoutFileRev(wrapToken("fileItegRev")),
-        layoutClassifier(wrapToken("classifier")),
-        layoutType(wrapToken("type")),
-        layoutExt(wrapToken("ext")),
-        layoutScalaVer(wrapToken("scalaVersion")),
-        layoutSbtVer(wrapToken("sbtVersion")),
-        // vcsTag(VCS_TAG_TOKEN),
-        // vcsRepo(VCS_REPO_TOKEN),
-        // vcsOrg(wrapToken("vcsOrg")),
-        // vcsBranch(wrapToken("vcsBranch")),
-        scope(wrapToken("scope")),
-        dockerImage(DOCKER_IMAGE_TOKEN),
-        dockerTag(DOCKER_TAG_TOKEN);
-
-        public final String key;
-
-        Keys(String key) {
-            this.key = key;
-        }
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/bintray/docker/BintrayDockerPushRequest.java b/base/api/src/main/java/org/artifactory/api/bintray/docker/BintrayDockerPushRequest.java
deleted file mode 100644
index cc2c3cf..0000000
--- a/base/api/src/main/java/org/artifactory/api/bintray/docker/BintrayDockerPushRequest.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.artifactory.api.bintray.docker;
-
-/**
- * @author Shay Yaakov
- */
-public class BintrayDockerPushRequest {
-
-    public String dockerRepository;
-    public String dockerTagName;
-    public String bintraySubject;
-    public String bintrayRepo;
-    public String bintrayPackage;
-    public String bintrayTag;
-    public boolean async;
-}
diff --git a/base/api/src/main/java/org/artifactory/api/bintray/docker/DockerBintrayImageInfo.java b/base/api/src/main/java/org/artifactory/api/bintray/docker/DockerBintrayImageInfo.java
deleted file mode 100644
index 9ee56a5..0000000
--- a/base/api/src/main/java/org/artifactory/api/bintray/docker/DockerBintrayImageInfo.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.artifactory.api.bintray.docker;
-
-import org.artifactory.fs.FileInfo;
-
-/**
- * @author Shay Yaakov
- */
-public class DockerBintrayImageInfo {
-
-    public FileInfo json;
-    public FileInfo layer;
-
-    public DockerBintrayImageInfo(FileInfo json, FileInfo layer) {
-        this.json = json;
-        this.layer = layer;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/bintray/docker/DockerV1BintrayInfo.java b/base/api/src/main/java/org/artifactory/api/bintray/docker/DockerV1BintrayInfo.java
deleted file mode 100644
index c8fc883..0000000
--- a/base/api/src/main/java/org/artifactory/api/bintray/docker/DockerV1BintrayInfo.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.artifactory.api.bintray.docker;
-
-import com.google.common.collect.Maps;
-import org.artifactory.fs.FileInfo;
-
-import java.util.Map;
-
-/**
- * @author Shay Yaakov
- */
-public class DockerV1BintrayInfo {
-
-    public FileInfo indexImages;
-    public Map<String, DockerBintrayImageInfo> images = Maps.newLinkedHashMap();
-    public String tagId;
-    public String userAgent;
-}
diff --git a/base/api/src/main/java/org/artifactory/api/bintray/docker/DockerV2BintrayInfo.java b/base/api/src/main/java/org/artifactory/api/bintray/docker/DockerV2BintrayInfo.java
deleted file mode 100644
index ddcf200..0000000
--- a/base/api/src/main/java/org/artifactory/api/bintray/docker/DockerV2BintrayInfo.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.artifactory.api.bintray.docker;
-
-import org.artifactory.repo.RepoPath;
-
-import java.util.Map;
-
-/**
- * @author Dan Feldman
- */
-public class DockerV2BintrayInfo {
-
-    public RepoPath manifestFile;
-    public Map<String, RepoPath> imageDigestToPath;
-
-    public DockerV2BintrayInfo(RepoPath manifestFile, Map<String, RepoPath> imageDigestToPath, RepoPath tagPath) {
-        this.manifestFile = manifestFile;
-        this.imageDigestToPath = imageDigestToPath;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/bintray/exception/BintrayException.java b/base/api/src/main/java/org/artifactory/api/bintray/exception/BintrayException.java
deleted file mode 100644
index 2ebec46..0000000
--- a/base/api/src/main/java/org/artifactory/api/bintray/exception/BintrayException.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.bintray.exception;
-
-/**
- * Exception thrown during communication with Bintray.
- *
- * @author Shay Yaakov
- */
-public class BintrayException extends Exception {
-
-    private int status;
-
-    public BintrayException(String message, int status) {
-        super(message);
-        this.status = status;
-    }
-
-    public int getStatus() {
-        return status;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/build/BuildProps.java b/base/api/src/main/java/org/artifactory/api/build/BuildProps.java
deleted file mode 100644
index bee7493..0000000
--- a/base/api/src/main/java/org/artifactory/api/build/BuildProps.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.artifactory.api.build;
-
-/**
- * @author Chen keinan
- */
-public class BuildProps {
-    private String key;
-    private String value;
-    private String status;
-    private String prevValue;
-
-    public BuildProps(String key, String value, String status) {
-        this.key = key;
-        this.value = value;
-        this.status = status;
-    }
-
-    public String getKey() {
-        return key;
-    }
-
-    public void setKey(String key) {
-        this.key = key;
-    }
-
-    public String getValue() {
-        return value;
-    }
-
-    public void setValue(String value) {
-        this.value = value;
-    }
-
-    public String getStatus() {
-        return status;
-    }
-
-    public void setStatus(String status) {
-        this.status = status;
-    }
-
-    public String getPrevValue() {
-        return prevValue;
-    }
-
-    public void setPrevValue(String prevValue) {
-        this.prevValue = prevValue;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/build/BuildRunComparators.java b/base/api/src/main/java/org/artifactory/api/build/BuildRunComparators.java
deleted file mode 100644
index ddc2844..0000000
--- a/base/api/src/main/java/org/artifactory/api/build/BuildRunComparators.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.build;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.build.BuildRun;
-
-import java.io.Serializable;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * Comparator class factory
- */
-public class BuildRunComparators {
-
-    /**
-     * Determines the type of comparator based on the value type of the build number.
-     *
-     * @param builds Builds to compare
-     * @return Build number comparator
-     */
-    public static Comparator<BuildRun> getComparatorFor(List<BuildRun> builds) {
-        for (BuildRun build : builds) {
-            if (!StringUtils.isNumeric(build.getNumber())) {
-                return new BuildNumberStringComparator();
-            }
-        }
-        return new BuildNumberLongComparator();
-    }
-
-    public static Comparator<BuildRun> getBuildStartDateComparator() {
-        return new BuildStartDateComparator();
-    }
-
-    /**
-     * Compares builds based on numeric order of the build number.
-     * All build numbers must have valid Long values.
-     */
-    private static class BuildNumberLongComparator implements Comparator<BuildRun> {
-        @Override
-        public int compare(BuildRun build1, BuildRun build2) {
-            if (build1 == null || build2 == null) {
-                return 0;
-            }
-            return Long.valueOf(build1.getNumber()).compareTo(Long.valueOf(build2.getNumber()));
-        }
-    }
-
-    /**
-     * Compares builds based on the lexicographic order of the build number.
-     */
-    private static class BuildNumberStringComparator implements Comparator<BuildRun> {
-        @Override
-        public int compare(BuildRun build1, BuildRun build2) {
-            if (build1 == null || build2 == null) {
-                return 0;
-            }
-            return build1.getNumber().compareTo(build2.getNumber());
-        }
-    }
-
-    /**
-     * Compares builds based on the start date.
-     */
-    private static class BuildStartDateComparator implements Comparator<BuildRun>, Serializable {
-        @Override
-        public int compare(BuildRun build1, BuildRun build2) {
-            if (build1 == null || build2 == null) {
-                return 0;
-            }
-            return build1.getStartedDate().compareTo(build2.getStartedDate());
-        }
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/build/BuildService.java b/base/api/src/main/java/org/artifactory/api/build/BuildService.java
deleted file mode 100644
index e820049..0000000
--- a/base/api/src/main/java/org/artifactory/api/build/BuildService.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.build;
-
-import org.artifactory.api.build.diff.BuildParams;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.config.ImportableExportable;
-import org.artifactory.api.rest.artifact.PromotionResult;
-import org.artifactory.build.BuildRun;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.sapi.common.ExportSettings;
-import org.artifactory.sapi.common.ImportSettings;
-import org.artifactory.sapi.common.Lock;
-import org.jfrog.build.api.Build;
-import org.jfrog.build.api.release.Promotion;
-import org.jfrog.build.api.release.PromotionStatus;
-
-import javax.annotation.Nullable;
-import java.sql.SQLException;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Build service main interface
- *
- * @author Noam Y. Tenne
- */
-public interface BuildService extends ImportableExportable {
-
-    /**
-     * In case a dependency contains a {@code null} scope, fill it with an unspecified scope that will be used for
-     * filtering.
-     */
-    public static final String UNSPECIFIED_SCOPE = "unspecified";
-    static String LATEST_BUILD = "LATEST";
-    static String LAST_RELEASED_BUILD = "LAST_RELEASE";
-
-
-    /**
-     * Adds the given build to the DB
-     *
-     * @param build Build to add
-     */
-    @Lock
-    void addBuild(Build build);
-
-    /**
-     * Returns the JSON string of the given build details
-     *
-     * @param buildRun at return Build JSON if parsing succeeded. Empty string if not
-     */
-    String getBuildAsJson(BuildRun buildRun);
-
-    /**
-     * Removes all the builds of the given name
-     *
-     * @param buildName         Name of builds to remove
-     * @param deleteArtifacts   True if build artifacts should be deleted
-     * @param multiStatusHolder Status holder
-     */
-    @Lock
-    void deleteBuild(String buildName, boolean deleteArtifacts, BasicStatusHolder multiStatusHolder);
-
-    /**
-     * Removes the build of the given details
-     *
-     * @param buildRun          Build info details
-     * @param deleteArtifacts   True if build artifacts should be deleted
-     * @param multiStatusHolder Status holder
-     */
-    @Lock
-    void deleteBuild(BuildRun buildRun, boolean deleteArtifacts, BasicStatusHolder multiStatusHolder);
-
-    /**
-     * Returns the build of the given details
-     *
-     * @param buildRun Build run retrieved
-     * @return Build if found. Null if not
-     */
-    Build getBuild(BuildRun buildRun);
-
-    /**
-     * Returns the latest build for the given name and number
-     *
-     * @param buildName   Name of build to locate
-     * @param buildNumber Number of build to locate
-     * @return Latest build if found. Null if not
-     */
-    @Nullable
-    Build getLatestBuildByNameAndNumber(String buildName, String buildNumber);
-
-    /**
-     * Locates builds that are named as the given name
-     *
-     * @param buildName Name of builds to locate
-     * @return Set of builds with the given name
-     */
-    Set<BuildRun> searchBuildsByName(String buildName);
-
-    List<String> getBuildNames();
-
-    /**
-     * Returns a sorted list of all previous builds to the given one
-     *
-     * @param buildName    Name of build to locate
-     * @param buildNumber  Number of build to locate
-     * @param buildStarted The started time of the given build, will return all builds prior to this value
-     * @return Ordered list (newest first) of builds prior to the given one
-     */
-    List<BuildRun> getAllPreviousBuilds(String buildName, String buildNumber, String buildStarted);
-
-    /**
-     * Locates builds that are named and numbered as the given name and number
-     *
-     * @param buildName   Name of builds to locate
-     * @param buildNumber Number of builds to locate
-     * @return Set of builds with the given name
-     */
-    Set<BuildRun> searchBuildsByNameAndNumber(String buildName, String buildNumber);
-
-    BuildRun getBuildRun(String buildName, String buildNumber, String buildStarted);
-
-    @Override
-    void exportTo(ExportSettings settings);
-
-    Set<String> findScopes(Build build);
-
-    /**
-     * @return True if the build is not Ivy/Gradle/Maven.
-     */
-    boolean isGenericBuild(Build build);
-
-    @Override
-    void importFrom(ImportSettings settings);
-
-    /**
-     * Promotes a build
-     *
-     * @param buildRun  Basic info of build to promote
-     * @param promotion Promotion settings
-     * @return Promotion result
-     */
-    @Lock
-    PromotionResult promoteBuild(BuildRun buildRun, Promotion promotion);
-
-    /**
-     * Renames the structure and content of build info objects
-     *
-     * @param from Name to replace
-     * @param to   Replacement build name
-     */
-    void renameBuilds(String from, String to);
-
-    /**
-     * Updates the content of the given build. Please note that this method does nothing apart from updating
-     * the JSON data. Other properties and data surrounding the build nodes (apart from mandatory) will not change
-     *
-     * @param build                     Updated content
-     * @param refreshChecksumProperties True if the build's searchable checksum properties should be updated with any
-     *                                  checksum modifications of the build model
-     */
-    @Lock
-    void updateBuild(Build build, boolean refreshChecksumProperties);
-
-    @Lock
-    void addPromotionStatus(Build build, PromotionStatus promotion);
-
-    @Nullable
-    List<PublishedModule> getPublishedModules(String buildName, String date, String orderBy, String direction, String offset, String limit);
-
-   int  getPublishedModulesCounts(String buildName, String date);
-
-    List<ModuleArtifact> getModuleArtifact(String buildName,String buildNumber, String moduleId,String date, String orderBy, String direction, String offset, String limit);
-
-     int getModuleArtifactCount(String buildNumber, String moduleId,String date);
-
-    List<ModuleDependency> getModuleDependency(String buildNumber, String moduleId, String date, String orderBy, String direction, String offset, String limit);
-
-    int getModuleDependencyCount(String buildNumber, String moduleId, String date);
-
-    void deleteAllBuilds(String buildName);
-
-    List<ModuleArtifact> getModuleArtifactsForDiffWithPaging(BuildParams buildParams, String offset, String limit);
-
-    Map<String, ModuleArtifact> getAllModuleArtifacts(String buildNumber, String moduleId, String date, String orderBy, String direction, String offset, String limit);
-
-    int getModuleArtifactsForDiffCount(BuildParams buildParams, String offset, String limit);
-
-    List<ModuleDependency> getModuleDependencyForDiffWithPaging(BuildParams buildParams, String offset, String limit);
-
-    int getModuleDependencyForDiffCount(BuildParams buildParams, String offset, String limit);
-
-    List<GeneralBuild> getPrevBuildsList(String buildName, String buildDate);
-
-    List<BuildProps> getBuildProps(BuildParams buildParams, String offset, String limit);
-
-    int getPropsDiffCount(BuildParams buildParams);
-
-    List<BuildProps> getBuildPropsData(BuildParams buildParams, String offset, String limit, String orderBy);
-
-    long getBuildPropsCounts(BuildParams buildParams);
-
-    Set<BuildRun> getLatestBuildsPaging(String offset, String orderBy, String direction, String limit);
-
-    List<GeneralBuild> getBuildForNamePaging(String buildName, String orderBy, String direction, String offset, String limit) throws SQLException;
-
-    /**
-     * Retrieves all build artifacts and filters out missing entries (Artifacts that don't exist return a null
-     * FileInfo mapping).
-     * Logs missing artifacts with level warn
-     *
-     * @param build         Build to retrieve artifacts for.
-     * @param sourceRepos   only include results from these repositories, not mandatory
-     * @param excludedRepos exclude results from these repositories, not mandatory
-     * @param status        StatusHolder for logging.
-     *
-     * @return List of FileInfo objects that represent this build's (found) artifacts
-     */
-    List<FileInfo> collectBuildArtifacts(Build build, @Nullable List<String> sourceRepos, @Nullable List<String> excludedRepos, @Nullable BasicStatusHolder status);
-}
diff --git a/base/api/src/main/java/org/artifactory/api/build/GeneralBuild.java b/base/api/src/main/java/org/artifactory/api/build/GeneralBuild.java
deleted file mode 100644
index 57af37a..0000000
--- a/base/api/src/main/java/org/artifactory/api/build/GeneralBuild.java
+++ /dev/null
@@ -1,159 +0,0 @@
-package org.artifactory.api.build;
-
-import org.apache.commons.lang.StringUtils;
-
-/**
- * @author Chen Keinan
- */
-public class GeneralBuild {
-
-    private long buildId;
-    private String buildName;
-    private String buildNumber;
-    private long buildDate;
-    private String ciUrl;
-    private long created;
-    private String createdBy;
-    private long modified;
-    private String modifiedBy;
-    private String numOfModules;
-    private String numOfArtifacts;
-    private String numOfDependencies;
-    private String status;
-    private Long promotionCreated;
-
-
-    public GeneralBuild(long buildId, String buildName, String buildNumber, long buildDate, String ciUrl, long created,
-                        String createdBy, long modified, String modifiedBy) {
-        if (buildId <= 0L) {
-            throw new IllegalArgumentException("Build id cannot be zero or negative!");
-        }
-        if (StringUtils.isBlank(buildName) || StringUtils.isBlank(buildNumber) || buildDate <= 0L) {
-            throw new IllegalArgumentException("Build name, number and date cannot be empty or null!");
-        }
-        if (created <= 0L) {
-            throw new IllegalArgumentException("Created date cannot be zero or negative!");
-        }
-        this.buildId = buildId;
-        this.buildName = buildName;
-        this.buildNumber = buildNumber;
-        this.buildDate = buildDate;
-        this.ciUrl = ciUrl;
-        this.created = created;
-        this.createdBy = createdBy;
-        this.modified = modified;
-        this.modifiedBy = modifiedBy;
-    }
-
-    public long getBuildId() {
-        return buildId;
-    }
-
-    public void setBuildId(long buildId) {
-        this.buildId = buildId;
-    }
-
-    public String getBuildName() {
-        return buildName;
-    }
-
-    public void setBuildName(String buildName) {
-        this.buildName = buildName;
-    }
-
-    public String getBuildNumber() {
-        return buildNumber;
-    }
-
-    public void setBuildNumber(String buildNumber) {
-        this.buildNumber = buildNumber;
-    }
-
-    public long getBuildDate() {
-        return buildDate;
-    }
-
-    public void setBuildDate(long buildDate) {
-        this.buildDate = buildDate;
-    }
-
-    public String getCiUrl() {
-        return ciUrl;
-    }
-
-    public void setCiUrl(String ciUrl) {
-        this.ciUrl = ciUrl;
-    }
-
-    public long getCreated() {
-        return created;
-    }
-
-    public void setCreated(long created) {
-        this.created = created;
-    }
-
-    public String getCreatedBy() {
-        return createdBy;
-    }
-
-    public void setCreatedBy(String createdBy) {
-        this.createdBy = createdBy;
-    }
-
-    public long getModified() {
-        return modified;
-    }
-
-    public void setModified(long modified) {
-        this.modified = modified;
-    }
-
-    public String getModifiedBy() {
-        return modifiedBy;
-    }
-
-    public void setModifiedBy(String modifiedBy) {
-        this.modifiedBy = modifiedBy;
-    }
-
-    public String getNumOfModules() {
-        return numOfModules;
-    }
-
-    public void setNumOfModules(String numOfModules) {
-        this.numOfModules = numOfModules;
-    }
-
-    public String getNumOfArtifacts() {
-        return numOfArtifacts;
-    }
-
-    public void setNumOfArtifacts(String numOfArtifacts) {
-        this.numOfArtifacts = numOfArtifacts;
-    }
-
-    public String getNumOfDependencies() {
-        return numOfDependencies;
-    }
-
-    public void setNumOfDependencies(String numOfDependencies) {
-        this.numOfDependencies = numOfDependencies;
-    }
-
-    public String getStatus() {
-        return status;
-    }
-
-    public void setStatus(String status) {
-        this.status = status;
-    }
-
-    public Long getPromotionCreated() {
-        return promotionCreated;
-    }
-
-    public void setPromotionCreated(Long promotionCreated) {
-        this.promotionCreated = promotionCreated;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/build/ImportableExportableBuild.java b/base/api/src/main/java/org/artifactory/api/build/ImportableExportableBuild.java
deleted file mode 100644
index 7683cc6..0000000
--- a/base/api/src/main/java/org/artifactory/api/build/ImportableExportableBuild.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.build;
-
-import com.google.common.collect.Sets;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumsInfo;
-
-import java.io.Serializable;
-import java.util.Set;
-
-/**
- * @author Noam Y. Tenne
- */
- at XStreamAlias("exported-build")
-public class ImportableExportableBuild implements Serializable {
-    @XStreamAsAttribute
-    private String version;
-
-    private String buildName;
-    private String buildNumber;
-    private String buildStarted;
-    private String json;
-    private Set<String> artifactChecksums;
-    private Set<String> dependencyChecksums;
-
-    private long created;
-    private long lastModified;
-    private String createdBy;
-    private String lastModifiedBy;
-    private String mimeType;
-    private ChecksumsInfo checksumsInfo;
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public String getBuildName() {
-        return buildName;
-    }
-
-    public void setBuildName(String buildName) {
-        this.buildName = buildName;
-    }
-
-    public String getBuildNumber() {
-        return buildNumber;
-    }
-
-    public void setBuildNumber(String buildNumber) {
-        this.buildNumber = buildNumber;
-    }
-
-    public String getBuildStarted() {
-        return buildStarted;
-    }
-
-    public void setBuildStarted(String buildStarted) {
-        this.buildStarted = buildStarted;
-    }
-
-    public String getJson() {
-        return json;
-    }
-
-    public void setJson(String json) {
-        this.json = json;
-    }
-
-    public Set<String> getArtifactChecksums() {
-        return artifactChecksums;
-    }
-
-    public void addArtifactChecksum(String artifactChecksum) {
-        if (artifactChecksums == null) {
-            artifactChecksums = Sets.newHashSet();
-        }
-        artifactChecksums.add(artifactChecksum);
-    }
-
-    public void setArtifactChecksums(Set<String> artifactChecksums) {
-        this.artifactChecksums = artifactChecksums;
-    }
-
-    public Set<String> getDependencyChecksums() {
-        return dependencyChecksums;
-    }
-
-    public void addDependencyChecksum(String dependencyChecksum) {
-        if (dependencyChecksums == null) {
-            dependencyChecksums = Sets.newHashSet();
-        }
-        dependencyChecksums.add(dependencyChecksum);
-    }
-
-    public void setDependencyChecksums(Set<String> dependencyChecksums) {
-        this.dependencyChecksums = dependencyChecksums;
-    }
-
-    public long getCreated() {
-        return created;
-    }
-
-    public void setCreated(long created) {
-        this.created = created;
-    }
-
-    public long getLastModified() {
-        return lastModified;
-    }
-
-    public void setLastModified(long lastModified) {
-        this.lastModified = lastModified;
-    }
-
-    public String getCreatedBy() {
-        return createdBy;
-    }
-
-    public void setCreatedBy(String createdBy) {
-        this.createdBy = createdBy;
-    }
-
-    public String getLastModifiedBy() {
-        return lastModifiedBy;
-    }
-
-    public void setLastModifiedBy(String lastModifiedBy) {
-        this.lastModifiedBy = lastModifiedBy;
-    }
-
-    public ChecksumsInfo getChecksumsInfo() {
-        return checksumsInfo;
-    }
-
-    public String getMimeType() {
-        return mimeType;
-    }
-
-    public void setMimeType(String mimeType) {
-        this.mimeType = mimeType;
-    }
-
-    public void addChecksumInfo(ChecksumInfo checksumInfo) {
-        if (checksumsInfo == null) {
-            checksumsInfo = new ChecksumsInfo();
-        }
-        checksumsInfo.addChecksumInfo(checksumInfo);
-    }
-
-    public void setChecksumsInfo(ChecksumsInfo checksumsInfo) {
-        this.checksumsInfo = checksumsInfo;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/build/ModuleArtifact.java b/base/api/src/main/java/org/artifactory/api/build/ModuleArtifact.java
deleted file mode 100644
index 5c8deed..0000000
--- a/base/api/src/main/java/org/artifactory/api/build/ModuleArtifact.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package org.artifactory.api.build;
-
-/**
- * @author Chen Keinan
- */
-public class ModuleArtifact {
-
-    private String repoKey;
-    private String path;
-    private String name;
-    private String type;
-    private String sha1;
-    private String status;
-    private String module;
-
-    public ModuleArtifact(String repoKey, String path, String name, String type, String sha1) {
-        this.repoKey = repoKey;
-        if (path != null) {
-            this.path = path.equals(".") ? name : path + "/" + name;
-        }
-        this.name = name;
-        this.type = type;
-        this.sha1 = sha1;
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public String getSha1() {
-        return sha1;
-    }
-
-    public void setSha1(String sha1) {
-        this.sha1 = sha1;
-    }
-
-    public String getStatus() {
-        return status;
-    }
-
-    public void setStatus(String status) {
-        this.status = status;
-    }
-
-    public String getModule() {
-        return module;
-    }
-
-    public void setModule(String module) {
-        this.module = module;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/build/ModuleDependency.java b/base/api/src/main/java/org/artifactory/api/build/ModuleDependency.java
deleted file mode 100644
index 0ba06ef..0000000
--- a/base/api/src/main/java/org/artifactory/api/build/ModuleDependency.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package org.artifactory.api.build;
-
-/**
- * @author Chen Keinan
- */
-public class ModuleDependency {
-
-    private String repoKey;
-    private String path;
-    private String name;
-    private String type;
-    private String scope;
-    private String sha1;
-    private String status;
-    private String module;
-
-    public ModuleDependency(String repoKey, String path, String name, String type, String scope, String sha1) {
-        this.repoKey = repoKey;
-        if (path != null) {
-            this.path = path;
-        }
-        this.name = name;
-        this.type = type;
-        this.scope = scope;
-        this.sha1 = sha1;
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public String getScope() {
-        return scope;
-    }
-
-    public void setScope(String scope) {
-        this.scope = scope;
-    }
-
-    public String getSha1() {
-        return sha1;
-    }
-
-    public void setSha1(String sha1) {
-        this.sha1 = sha1;
-    }
-
-    public String getStatus() {
-        return status;
-    }
-
-    public void setStatus(String status) {
-        this.status = status;
-    }
-
-    public String getModule() {
-        return module;
-    }
-
-    public void setModule(String module) {
-        this.module = module;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/build/PublishedModule.java b/base/api/src/main/java/org/artifactory/api/build/PublishedModule.java
deleted file mode 100644
index 13df72b..0000000
--- a/base/api/src/main/java/org/artifactory/api/build/PublishedModule.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.artifactory.api.build;
-
-/**
- * @author Chen Keinan.
- */
-public class PublishedModule {
-
-    private String id;
-
-    private String numOfArtifact;
-
-    private String numOfDependencies;
-
-    public String getNumOfArtifact() {
-        return numOfArtifact;
-    }
-
-    public void setNumOfArtifact(String numOfArtifact) {
-        this.numOfArtifact = numOfArtifact;
-    }
-
-    public String getNumOfDependencies() {
-        return numOfDependencies;
-    }
-
-    public void setNumOfDependencies(String numOfDependencies) {
-        this.numOfDependencies = numOfDependencies;
-    }
-
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/build/diff/BuildParams.java b/base/api/src/main/java/org/artifactory/api/build/diff/BuildParams.java
deleted file mode 100644
index 30701ae..0000000
--- a/base/api/src/main/java/org/artifactory/api/build/diff/BuildParams.java
+++ /dev/null
@@ -1,161 +0,0 @@
-package org.artifactory.api.build.diff;
-
-/**
- * @author Chen Keinan
- */
-public class BuildParams {
-
-    private String currBuildNum;
-    private String buildName;
-    private String comperedBuildNum;
-    private Long currBuildDate;
-    private Long comperedBuildDate;
-    private String buildModuleId;
-    boolean allArtifact = false;
-    boolean allDependencies = false;
-    boolean isEnvProps = false;
-    boolean excludeInternalDependencies = false;
-    private String orderBy;
-    private String direction;
-    private String groupBy;
-    private String offset;
-    private String limit;
-
-    public BuildParams(String moduleId, String buildNumber, String comparedBuildNum,
-                       String comparedDate, String buildStarted, String buildName) {
-        this.currBuildNum = buildNumber;
-        this.comperedBuildNum = comparedBuildNum;
-        if (buildStarted != null) {
-            this.currBuildDate = Long.parseLong(buildStarted);
-        }
-        if (comparedBuildNum != null) {
-            this.comperedBuildDate = Long.parseLong(comparedDate);
-        }
-        this.buildModuleId = moduleId;
-        this.buildName = buildName;
-    }
-
-    public String getCurrBuildNum() {
-        return currBuildNum;
-    }
-
-    public void setCurrBuildNum(String currBuildNum) {
-        this.currBuildNum = currBuildNum;
-    }
-
-    public String getComperedBuildNum() {
-        return comperedBuildNum;
-    }
-
-    public void setComperedBuildNum(String comperedBuildNum) {
-        this.comperedBuildNum = comperedBuildNum;
-    }
-
-    public Long getCurrBuildDate() {
-        return currBuildDate;
-    }
-
-    public void setCurrBuildDate(Long currBuildDate) {
-        this.currBuildDate = currBuildDate;
-    }
-
-    public Long getComperedBuildDate() {
-        return comperedBuildDate;
-    }
-
-    public void setComperedBuildDate(Long comperedBuildDate) {
-        this.comperedBuildDate = comperedBuildDate;
-    }
-
-    public String getBuildModuleId() {
-        return buildModuleId;
-    }
-
-    public void setBuildModuleId(String buildModuleId) {
-        this.buildModuleId = buildModuleId;
-    }
-
-    public String getBuildName() {
-        return buildName;
-    }
-
-    public void setBuildName(String buildName) {
-        this.buildName = buildName;
-    }
-
-    public boolean isAllArtifact() {
-        return allArtifact;
-    }
-
-    public void setAllArtifact(boolean allArtifact) {
-        this.allArtifact = allArtifact;
-    }
-
-    public boolean isAllDependencies() {
-        return allDependencies;
-    }
-
-    public void setAllDependencies(boolean allDependencies) {
-        this.allDependencies = allDependencies;
-    }
-
-    public boolean isEnvProps() {
-        return isEnvProps;
-    }
-
-    public void setIsEnv(boolean isEnv) {
-        this.isEnvProps = isEnv;
-    }
-
-    public boolean isExcludeInternalDependencies() {
-        return excludeInternalDependencies;
-    }
-
-    public void setExcludeInternalDependencies(boolean excludeInternalDependencies) {
-        this.excludeInternalDependencies = excludeInternalDependencies;
-    }
-
-    public void setIsEnvProps(boolean isEnvProps) {
-        this.isEnvProps = isEnvProps;
-    }
-
-    public String getOrderBy() {
-        return orderBy;
-    }
-
-    public void setOrderBy(String orderBy) {
-        this.orderBy = orderBy;
-    }
-
-    public String getDirection() {
-        return direction;
-    }
-
-    public void setDirection(String direction) {
-        this.direction = direction;
-    }
-
-    public String getGroupBy() {
-        return groupBy;
-    }
-
-    public void setGroupBy(String groupBy) {
-        this.groupBy = groupBy;
-    }
-
-    public String getOffset() {
-        return offset;
-    }
-
-    public void setOffset(String offset) {
-        this.offset = offset;
-    }
-
-    public String getLimit() {
-        return limit;
-    }
-
-    public void setLimit(String limit) {
-        this.limit = limit;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/build/diff/BuildsDiffArtifactModel.java b/base/api/src/main/java/org/artifactory/api/build/diff/BuildsDiffArtifactModel.java
deleted file mode 100644
index 20efea2..0000000
--- a/base/api/src/main/java/org/artifactory/api/build/diff/BuildsDiffArtifactModel.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.build.diff;
-
-/**
- * Builds diff model object which wraps artifacts diff
- *
- * @author Shay Yaakov
- */
-public class BuildsDiffArtifactModel extends BuildsDiffBaseFileModel {
-
-    @Override
-    public String getName() {
-        return name;
-    }
-
-    @Override
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    @Override
-    public String getDiffName() {
-        return diffName;
-    }
-
-    @Override
-    public void setDiffName(String diffName) {
-        this.diffName = diffName;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/build/diff/BuildsDiffBaseFileModel.java b/base/api/src/main/java/org/artifactory/api/build/diff/BuildsDiffBaseFileModel.java
deleted file mode 100644
index 570a02d..0000000
--- a/base/api/src/main/java/org/artifactory/api/build/diff/BuildsDiffBaseFileModel.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.build.diff;
-
-import org.artifactory.repo.RepoPath;
-import org.codehaus.jackson.annotate.JsonIgnore;
-
-import java.io.Serializable;
-
-/**
- * Builds diff base file model object for artifacts or dependencies model
- * Holds file related fields such as sha1, md5 etc.
- *
- * @author Shay Yaakov
- */
-public abstract class BuildsDiffBaseFileModel implements Serializable {
-
-    protected String name;
-    protected String diffName;
-    private String module;
-    private String type;
-    private String sha1;
-    private String md5;
-    private String uri;
-
-    @JsonIgnore
-    private RepoPath repoPath;
-
-    @JsonIgnore
-    private BuildsDiffStatus status;
-
-    public abstract String getName();
-
-    public abstract void setName(String name);
-
-    public abstract String getDiffName();
-
-    public abstract void setDiffName(String diffName);
-
-    public String getModule() {
-        return module;
-    }
-
-    public void setModule(String module) {
-        this.module = module;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public String getSha1() {
-        return sha1;
-    }
-
-    public void setSha1(String sha1) {
-        this.sha1 = sha1;
-    }
-
-    public String getMd5() {
-        return md5;
-    }
-
-    public void setMd5(String md5) {
-        this.md5 = md5;
-    }
-
-    public RepoPath getRepoPath() {
-        return repoPath;
-    }
-
-    public void setRepoPath(RepoPath repoPath) {
-        this.repoPath = repoPath;
-    }
-
-    public BuildsDiffStatus getStatus() {
-        return status;
-    }
-
-    public void setStatus(BuildsDiffStatus status) {
-        this.status = status;
-    }
-
-    public String getUri() {
-        return uri;
-    }
-
-    public void setUri(String uri) {
-        this.uri = uri;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/build/diff/BuildsDiffDependencyModel.java b/base/api/src/main/java/org/artifactory/api/build/diff/BuildsDiffDependencyModel.java
deleted file mode 100644
index 8a6764f..0000000
--- a/base/api/src/main/java/org/artifactory/api/build/diff/BuildsDiffDependencyModel.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.build.diff;
-
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonProperty;
-
-import java.util.Set;
-
-/**
- * Builds diff model object which wraps dependencies diff
- *
- * @author Shay Yaakov
- */
-public class BuildsDiffDependencyModel extends BuildsDiffBaseFileModel {
-
-    @JsonIgnore
-    private boolean internalDependency;
-
-    private Set<String> scopes;
-
-    public boolean isInternalDependency() {
-        return internalDependency;
-    }
-
-    public void setInternalDependency(boolean internalDependency) {
-        this.internalDependency = internalDependency;
-    }
-
-    public Set<String> getScopes() {
-        return scopes;
-    }
-
-    public void setScopes(Set<String> scopes) {
-        this.scopes = scopes;
-    }
-
-    @Override
-    public String getName() {
-        return name;
-    }
-
-    @JsonProperty(value = "id")
-    @Override
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    @Override
-    public String getDiffName() {
-        return diffName;
-    }
-
-    @JsonProperty(value = "diffId")
-    @Override
-    public void setDiffName(String diffName) {
-        this.diffName = diffName;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/build/diff/BuildsDiffPropertyModel.java b/base/api/src/main/java/org/artifactory/api/build/diff/BuildsDiffPropertyModel.java
deleted file mode 100644
index 778a9c3..0000000
--- a/base/api/src/main/java/org/artifactory/api/build/diff/BuildsDiffPropertyModel.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.build.diff;
-
-import org.apache.commons.lang.StringUtils;
-import org.codehaus.jackson.annotate.JsonIgnore;
-
-import java.io.Serializable;
-
-/**
- * Builds diff model object which wraps properties diff
- *
- * @author Shay Yaakov
- */
-public class BuildsDiffPropertyModel implements Serializable {
-
-    private String key;
-    private String value;
-    private String diffValue;
-
-    @JsonIgnore
-    private BuildsDiffStatus status;
-
-    public String getKey() {
-        return key;
-    }
-
-    public void setKey(String key) {
-        this.key = key;
-    }
-
-    public String getValue() {
-        return value;
-    }
-
-    public void setValue(String value) {
-        this.value = value;
-    }
-
-    public String getDiffValue() {
-        return diffValue;
-    }
-
-    public void setDiffValue(String diffValue) {
-        this.diffValue = diffValue;
-    }
-
-    public BuildsDiffStatus getStatus() {
-        return status;
-    }
-
-    public void setStatus(BuildsDiffStatus status) {
-        this.status = status;
-    }
-
-    public String getCompoundKeyValue() {
-        if (StringUtils.isBlank(value)) {
-            return null;
-        }
-
-        return key + ":" + value;
-    }
-
-    public String getCompoundDiffKeyValue() {
-        if (StringUtils.isBlank(diffValue)) {
-            return null;
-        }
-
-        return key + ":" + diffValue;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/build/diff/BuildsDiffStatus.java b/base/api/src/main/java/org/artifactory/api/build/diff/BuildsDiffStatus.java
deleted file mode 100644
index fb943bb..0000000
--- a/base/api/src/main/java/org/artifactory/api/build/diff/BuildsDiffStatus.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.build.diff;
-
-import java.io.Serializable;
-
-/**
- * Builds diff status holder
- *
- * @author Shay Yaakov
- */
-public enum BuildsDiffStatus implements Serializable {
-    NEW("New"),
-    UPDATED("Updated"),
-    REMOVED("Removed"),
-    UNCHANGED("Unchanged");
-
-    private String description;
-
-    BuildsDiffStatus(String description) {
-        this.description = description;
-    }
-
-    @Override
-    public String toString() {
-        return description;
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/cache/CacheType.java b/base/api/src/main/java/org/artifactory/api/cache/CacheType.java
deleted file mode 100644
index 2770f10..0000000
--- a/base/api/src/main/java/org/artifactory/api/cache/CacheType.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.cache;
-
-/**
- * @author freds
- * @date Nov 6, 2008
- */
-public enum CacheType {
-    GLOBAL, REMOTE_REPO, STORING_REPO, VIRTUAL_REPO
-}
diff --git a/base/api/src/main/java/org/artifactory/api/cache/ElementReferenceType.java b/base/api/src/main/java/org/artifactory/api/cache/ElementReferenceType.java
deleted file mode 100644
index 5b583a5..0000000
--- a/base/api/src/main/java/org/artifactory/api/cache/ElementReferenceType.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.cache;
-
-/**
- * @author freds
- * @date Nov 6, 2008
- */
-public enum ElementReferenceType {
-    HARD, SOFT, WEAK
-}
diff --git a/base/api/src/main/java/org/artifactory/api/callhome/CallHomeRequest.java b/base/api/src/main/java/org/artifactory/api/callhome/CallHomeRequest.java
deleted file mode 100644
index 6734ba2..0000000
--- a/base/api/src/main/java/org/artifactory/api/callhome/CallHomeRequest.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package org.artifactory.api.callhome;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.codehaus.jackson.annotate.JsonProperty;
-
-import java.util.List;
-
-/**
- * POJO used when calling home
- *
- * @author Shay Yaakov
- */
-public class CallHomeRequest {
-
-    public String product = "JFrog-Artifactory";
-
-    public String repository = "artifactory";
-
-    @JsonProperty(value = "package")
-    public String packageName = "jfrog-artifactory-generic";
-
-    public String version;
-
-    @JsonProperty(value = "artifactory_license_type")
-    public String licenseType;
-
-    @JsonProperty(value = "artifactory_license_oem")
-    public String licenseOEM;
-
-    @JsonProperty(value = "artifactory_license_expiration")
-    public String licenseExpiration;
-
-    public String dist = "unknown";
-
-    public Environment environment = new Environment();
-
-    @JsonProperty(value = "feature_groups")
-    private List<FeatureGroup> featureGroups;
-
-    public CallHomeRequest() {
-    }
-
-    /**
-     * Adds in
-     *
-     * @param callHomeFeature
-     */
-    public void addCallHomeFeature(FeatureGroup callHomeFeature) {
-        if (featureGroups == null)
-            featureGroups = Lists.newLinkedList();
-        featureGroups.add(callHomeFeature);
-    }
-
-    public void setDist(String artdist) {
-        if (StringUtils.isBlank(artdist)) {
-            return;
-        }
-
-        this.dist = artdist;
-        String repoSuffix = StringUtils.equals(this.licenseType, "oss") ? "" : "-pro";
-        String pkgSuffix = StringUtils.equals(this.licenseType, "oss") ? "-oss" : "-pro";
-        switch (artdist) {
-            case "docker":
-                this.repository = "registry";
-                this.packageName = "artifactory:artifactory" + pkgSuffix;
-                break;
-            case "zip":
-                this.repository = "artifactory" + repoSuffix;
-                this.packageName = "jfrog-artifactory" + pkgSuffix + "-zip";
-                break;
-            case "rpm":
-                this.repository = "artifactory" + repoSuffix + "-rpms";
-                this.packageName = "jfrog-artifactory" + pkgSuffix + "-rpm";
-                break;
-            case "deb":
-                this.repository = "artifactory" + repoSuffix + "-debs";
-                this.packageName = "jfrog-artifactory" + pkgSuffix + "-deb";
-                break;
-        }
-    }
-
-    public static class Environment {
-        @JsonProperty(value = "runtime_id")
-        public String hostId;
-        @JsonProperty(value = "user_id")
-        public String licenseHash;
-        public Attributes attributes = new Attributes();
-
-        public static class Attributes {
-            @JsonProperty(value = "os_name")
-            public String osName;
-            @JsonProperty(value = "os_arch")
-            public String osArch;
-            @JsonProperty(value = "java_version")
-            public String javaVersion;
-        }
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/callhome/FeatureGroup.java b/base/api/src/main/java/org/artifactory/api/callhome/FeatureGroup.java
deleted file mode 100644
index d5614d3..0000000
--- a/base/api/src/main/java/org/artifactory/api/callhome/FeatureGroup.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.api.callhome;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import org.codehaus.jackson.annotate.JsonProperty;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Michael Pasternak
- */
-public class FeatureGroup {
-
-    @JsonProperty(value = "name")
-    private String name;
-    @JsonProperty(value = "attributes")
-    private Map<String, Object> attributes;
-    @JsonProperty(value = "features")
-    private List<FeatureGroup> features;
-
-    public FeatureGroup() {
-    }
-
-    public FeatureGroup(String name) {
-        this.name = name;
-    }
-
-    public void addFeature(FeatureGroup featureGroup) {
-        if (features == null)
-            features = Lists.newLinkedList();
-        features.add(featureGroup);
-    }
-
-    public void addFeatureAttribute(String name, Object value) {
-        if(attributes == null)
-            attributes = Maps.newLinkedHashMap();
-        attributes.put(name, value);
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/common/BasicStatusHolder.java b/base/api/src/main/java/org/artifactory/api/common/BasicStatusHolder.java
deleted file mode 100644
index 3bea2d2..0000000
--- a/base/api/src/main/java/org/artifactory/api/common/BasicStatusHolder.java
+++ /dev/null
@@ -1,406 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.common;
-
-import com.google.common.collect.Lists;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.common.StatusEntry;
-import org.artifactory.common.StatusEntryLevel;
-import org.artifactory.exception.CancelException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nonnull;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.ArrayBlockingQueue;
-
-/**
- * @author Yoav Landman
- */
- at XStreamAlias("status")
-public class BasicStatusHolder implements MutableStatusHolder {
-    private static final Logger log = LoggerFactory.getLogger(BasicStatusHolder.class);
-
-    private static final String MSG_IDLE = "Idle.";
-    // save up to 500 messages. if exhausted, we manually drop the oldest element
-    private final ArrayBlockingQueue<StatusEntry> statusEntries = new ArrayBlockingQueue<>(500);
-    // save up to 2000 errors messages. if exhausted, we manually drop the oldest element
-    private final ArrayBlockingQueue<StatusEntry> errorEntries = new ArrayBlockingQueue<>(2000);
-    // save up to 100 warning messages. if exhausted, we manually drop the oldest element
-    private final ArrayBlockingQueue<StatusEntry> warningEntries = new ArrayBlockingQueue<>(100);
-
-    public static final int CODE_OK = 200;
-    public static final int CODE_INTERNAL_ERROR = 500;
-
-    protected boolean activateLogging;
-    // the latest status
-    protected boolean fastFail = false;
-    protected boolean verbose = false;
-    private StatusEntry lastStatusEntry;
-    private StatusEntry lastErrorStatusEntry;
-    private StatusEntry lastWarningStatusEntry;
-
-    public BasicStatusHolder() {
-        //addStatusEntry(new StatusEntry(CODE_OK, StatusEntryLevel.DEBUG, MSG_IDLE, null));
-        activateLogging = true;
-    }
-
-    @Override
-    public void setFastFail(boolean fastFail) {
-        this.fastFail = fastFail;
-    }
-
-    @Override
-    public void setVerbose(boolean verbose) {
-        this.verbose = verbose;
-    }
-
-    private boolean isFastFail() {
-        return fastFail;
-    }
-
-    @Override
-    public boolean isVerbose() {
-        return verbose;
-    }
-
-    @Override
-    public StatusEntry getLastError() {
-        return lastErrorStatusEntry;
-    }
-
-    @Override
-    public StatusEntry getLastWarning() {
-        return lastWarningStatusEntry;
-    }
-
-    @Override
-    public StatusEntry getLastStatusEntry() {
-       return lastStatusEntry;
-    }
-
-    @Override
-    public final void debug(String statusMsg, @Nonnull Logger logger) {
-        logEntryAndAddEntry(new StatusEntry(CODE_OK, StatusEntryLevel.DEBUG, statusMsg, null), logger);
-    }
-
-    public final void setDebug(String statusMsg, int statusCode, @Nonnull Logger logger) {
-        logEntryAndAddEntry(new StatusEntry(statusCode, StatusEntryLevel.DEBUG, statusMsg, null), logger);
-    }
-
-    @Override
-    public final void status(String statusMsg, @Nonnull Logger logger) {
-        status(statusMsg, CODE_OK, logger);
-    }
-
-    @Override
-    public final void status(String statusMsg, int statusCode, @Nonnull Logger logger) {
-        logEntryAndAddEntry(new StatusEntry(statusCode, statusMsg), logger);
-    }
-
-    @Override
-    public void error(String status, Throwable throwable, @Nonnull Logger logger) {
-        error(status, CODE_INTERNAL_ERROR, throwable, logger);
-    }
-
-    @Override
-    public void error(String statusMsg, @Nonnull Logger logger) {
-        error(statusMsg, CODE_INTERNAL_ERROR, null, logger);
-    }
-
-    @Override
-    public void error(String statusMsg, int statusCode, @Nonnull Logger logger) {
-        error(statusMsg, statusCode, null, logger);
-    }
-
-    @Override
-    public void error(String statusMsg, int statusCode, Throwable throwable, @Nonnull Logger logger) {
-        addError(new StatusEntry(statusCode, StatusEntryLevel.ERROR, statusMsg, throwable), logger);
-    }
-
-    @Override
-    public void warn(String statusMsg, Throwable throwable, @Nonnull Logger logger) {
-        addError(new StatusEntry(CODE_INTERNAL_ERROR, StatusEntryLevel.WARNING, statusMsg, throwable), logger);
-    }
-
-    @Override
-    public void warn(String statusMsg, int statusCode, Throwable throwable, @Nonnull Logger logger) {
-        addError(new StatusEntry(statusCode, StatusEntryLevel.WARNING, statusMsg, throwable), logger);
-    }
-
-    @Override
-    public void warn(String statusMsg, @Nonnull Logger logger) {
-        addError(new StatusEntry(CODE_INTERNAL_ERROR, StatusEntryLevel.WARNING, statusMsg, null), logger);
-    }
-
-    @Override
-    public void warn(String statusMsg, int statusCode, @Nonnull Logger logger) {
-        addError(new StatusEntry(statusCode, StatusEntryLevel.WARNING, statusMsg, null), logger);
-    }
-
-    protected StatusEntry addError(@Nonnull StatusEntry errorEntry, @Nonnull Logger logger) {
-        if (isActivateLogging()) {
-            logEntry(errorEntry, logger);
-        }
-        addStatusEntry(errorEntry);
-        if (!errorEntry.isWarning() && isFastFail()) {
-            Throwable throwable = errorEntry.getException();
-            if (throwable != null) {
-                if (throwable instanceof RuntimeException) {
-                    throw (RuntimeException) throwable;
-                } else if (throwable instanceof Error) {
-                    throw (Error) throwable;
-                } else {
-                    throw new RuntimeException("Fast fail exception: " + errorEntry.getMessage(), throwable);
-                }
-            } else {
-                throw new RuntimeException("Fast fail exception: " + errorEntry.getMessage());
-            }
-        }
-        return errorEntry;
-    }
-
-    protected void logEntry(@Nonnull StatusEntry entry, @Nonnull Logger logger) {
-        /**
-         * If an external logger is given, it shall be the active one; unless verbose output is requested, then we need
-         * to use that status holder logger for the debug level
-         */
-        if (isVerbose()) {
-            doLogEntry(entry, log);
-        } else {
-            doLogEntry(entry, logger);
-        }
-    }
-
-    protected void doLogEntry(@Nonnull StatusEntry entry, @Nonnull Logger logger) {
-        String statusMessage = entry.getMessage();
-        Throwable throwable = entry.getException();
-        if (!isVerbose() && throwable != null) {
-            //Update the status message for when there's an exception message to append
-            statusMessage += ": " + (StringUtils.isNotBlank(throwable.getMessage()) ? throwable.getMessage() :
-                    throwable.getClass().getSimpleName());
-        }
-        if (entry.isWarning() && logger.isWarnEnabled()) {
-            if (isVerbose()) {
-                logger.warn(statusMessage, throwable);
-            } else {
-                logger.warn(statusMessage);
-            }
-        } else if (entry.isError() && logger.isErrorEnabled()) {
-            if (isVerbose()) {
-                logger.error(statusMessage, throwable);
-            } else {
-                logger.error(statusMessage);
-            }
-        } else if (entry.isDebug() && logger.isDebugEnabled()) {
-            logger.debug(statusMessage);
-        } else if (entry.isInfo() && logger.isInfoEnabled()) {
-            logger.info(statusMessage);
-        }
-    }
-
-    @Override
-    public String getStatusMsg() {
-        StatusEntry lastError = getLastError();
-        if (lastError != null) {
-            return lastError.getMessage();
-        }
-        StatusEntry lastWarning = getLastWarning();
-        if (lastWarning != null) {
-            return lastWarning.getMessage();
-        }
-        StatusEntry statusEntry = getLastStatusEntry();
-        return statusEntry!=null?statusEntry.getMessage():null;
-    }
-
-    @Override
-    public boolean isError() {
-        return getLastError()!=null;
-    }
-
-    @Override
-    public CancelException getCancelException() {
-        return getCancelException(null);
-    }
-
-    public CancelException getCancelException(StatusEntry previousToLastError) {
-        StatusEntry lastError = getLastError();
-        if (lastError != null && !lastError.equals(previousToLastError)) {
-            //We have a new error check if it is a cancellation one
-            Throwable cause = lastError.getException();
-            if (cause != null && cause instanceof CancelException) {
-                return (CancelException) cause;
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public Throwable getException() {
-        StatusEntry lastError = getLastError();
-        if (lastError != null) {
-            return lastError.getException();
-        }
-        StatusEntry lastWarning = getLastWarning();
-        if (lastWarning != null) {
-            return lastWarning.getException();
-        }
-        StatusEntry statusEntry = getLastStatusEntry();
-        return statusEntry!=null?statusEntry.getException():null;
-    }
-
-    @Override
-    public int getStatusCode() {
-        StatusEntry lastError = getLastError();
-        if (lastError != null) {
-            return lastError.getStatusCode();
-        }
-        StatusEntry lastWarning = getLastWarning();
-        if (lastWarning != null) {
-            return lastWarning.getStatusCode();
-        }
-        StatusEntry statusEntry = getLastStatusEntry();
-        return statusEntry!=null?statusEntry.getStatusCode():-1;
-    }
-
-    protected void logEntryAndAddEntry(@Nonnull StatusEntry entry, @Nonnull Logger logger) {
-        addStatusEntry(entry);
-        logEntry(entry, logger);
-    }
-
-    protected void addStatusEntry(StatusEntry entry) {
-        // we don't really want to block if we reached the limit. remove the last element until offer is accepted
-        while (!statusEntries.offer(entry)) {
-            statusEntries.poll();
-        }
-        lastStatusEntry=entry;
-        if (entry.isError()) {
-            while (!errorEntries.offer(entry)) {
-                errorEntries.poll();
-            }
-            lastErrorStatusEntry=entry;
-        }
-        else if (entry.isWarning()) {
-            while (!warningEntries.offer(entry)) {
-                warningEntries.poll();
-            }
-            lastWarningStatusEntry=entry;
-        }
-    }
-
-    /**
-     * @return True if the status holder prints the messages to the logger.
-     */
-    private boolean isActivateLogging() {
-        return activateLogging;
-    }
-
-    /**
-     * If set to false the status holder will not print the messages to the logger. It will only keep the statuses.
-     *
-     * @param activateLogging Set to false to disable logging
-     */
-    @Override
-    public void setActivateLogging(boolean activateLogging) {
-        this.activateLogging = activateLogging;
-    }
-
-    @Override
-    public void reset() {
-        statusEntries.clear();
-        errorEntries.clear();
-        warningEntries.clear();
-        activateLogging = true;
-    }
-
-    @Override
-    public String toString() {
-        return "StatusHolder{" +
-                "activateLogging=" + activateLogging +
-                ", statusMessage=" + statusEntries + '}'+
-                ", errorMessage=" + errorEntries + '}'+
-                ", warningMessage=" + warningEntries + '}';
-    }
-
-    /**
-     * Merge this and the input status. Will append entry from the input this one. If the status to merge has last error
-     * it will be used. This method is not thread safe, the two statuses are assumed to be inactive in the time of
-     * merging.
-     *
-     * @param toMerge The status to merge into this.
-     */
-    public void merge(BasicStatusHolder toMerge) {
-        for (StatusEntry statusEntry : toMerge.statusEntries) {
-            while (!statusEntries.offer(statusEntry)) {
-                statusEntries.poll();
-            }
-        }
-        lastStatusEntry=toMerge.statusEntries.peek();
-        for (StatusEntry statusEntry : toMerge.errorEntries) {
-            while (!errorEntries.offer(statusEntry)) {
-                errorEntries.poll();
-            }
-        }
-        lastErrorStatusEntry=toMerge.errorEntries.peek();
-        for (StatusEntry statusEntry : toMerge.warningEntries) {
-            while (!warningEntries.offer(statusEntry)) {
-                warningEntries.poll();
-            }
-
-        }
-        lastWarningStatusEntry=toMerge.warningEntries.peek();
-    }
-
-    public List<StatusEntry> getEntries() {
-        return Lists.newArrayList(statusEntries);
-    }
-
-    public List<StatusEntry> getEntries(StatusEntryLevel level) {
-        List<StatusEntry> result = new ArrayList<>();
-        if (level == StatusEntryLevel.ERROR) {
-            result.addAll(errorEntries);
-        } else {
-            for (StatusEntry entry : statusEntries) {
-                if (level.equals(entry.getLevel())) {
-                    result.add(entry);
-                }
-            }
-        }
-        return result;
-    }
-
-    public boolean hasWarnings() {
-        return warningEntries.size()>0;
-    }
-
-    public boolean hasErrors() {
-        return errorEntries.size()>0;
-    }
-
-    public List<StatusEntry> getErrors() {
-        return Lists.newArrayList(errorEntries);
-    }
-
-    public List<StatusEntry> getWarnings() {
-        return Lists.newArrayList(warningEntries);
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/common/ImportExportStatusHolder.java b/base/api/src/main/java/org/artifactory/api/common/ImportExportStatusHolder.java
deleted file mode 100644
index adc3e1b..0000000
--- a/base/api/src/main/java/org/artifactory/api/common/ImportExportStatusHolder.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.artifactory.api.common;
-
-import org.artifactory.common.StatusEntry;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nonnull;
-
-/**
- * NOTE: WHEN CHANGING THE NAME OR THE PACKAGE OF THIS CLASS, MAKE SURE TO UPDATE TEST AND PRODUCTION LOGBACK
- * CONFIGURATION FILES WITH THE CHANGES AND CREATE A CONVERTER IF NEEDED. SOME APPENDERS DEPEND ON THIS.
- * <p/>
- * Specialized status holder for the import and export processes.
- *
- * @author Gidi Shabat
- */
-public class ImportExportStatusHolder extends BasicStatusHolder {
-    protected static final Logger log = LoggerFactory.getLogger(ImportExportStatusHolder.class);
-
-    @Override
-    protected void logEntry(@Nonnull StatusEntry entry, @Nonnull Logger logger) {
-        if (isVerbose()) {
-            doLogEntry(entry, log);
-        }
-        doLogEntry(entry, logger);
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/common/MoveMultiStatusHolder.java b/base/api/src/main/java/org/artifactory/api/common/MoveMultiStatusHolder.java
deleted file mode 100644
index 9473441..0000000
--- a/base/api/src/main/java/org/artifactory/api/common/MoveMultiStatusHolder.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.common;
-
-import com.google.common.collect.Sets;
-import org.artifactory.repo.RepoPath;
-
-import java.util.Set;
-
-/**
- * A custom multi status holder for the different artifact move actions, which retains a counter that represents the
- * number of artifacts that have been moved in the move operation that was invoked and associated with this holder
- *
- * @author Noam Tenne
- */
-public class MoveMultiStatusHolder extends BasicStatusHolder {
-
-    /**
-     * Represents the number of artifacts that have been moved
-     */
-    private int artifactsMovedCounter = 0;
-
-
-    /**
-     * Represents the number of folders that have been moved
-     */
-    private int foldersMovedCounter = 0;
-
-    /**
-     * Folders repo paths to calculate maven metadata on when the entire move/copy finishes
-     */
-    private Set<RepoPath> candidatesForMavenMetadataCalculation = Sets.newHashSet();
-
-    /**
-     * Raises the moved artifacts counter by 1
-     */
-    public void artifactMoved() {
-        artifactsMovedCounter++;
-    }
-
-    /**
-     * Raises the moved folder counter by 1
-     */
-    public void folderMoved() {
-        foldersMovedCounter++;
-    }
-
-    /**
-     * Add folder path to calculate maven metadata when the move/copy process finishes
-     *
-     * @param repoPath The folder repo path, will be calculated non-recursively later on
-     */
-    public void addToMavenMetadataCandidates(RepoPath repoPath) {
-        candidatesForMavenMetadataCalculation.add(repoPath);
-    }
-
-    /**
-     * Returns the total number of artifacts that have been moved
-     *
-     * @return Total artifacts moved
-     */
-    public int getMovedArtifactsCount() {
-        return artifactsMovedCounter;
-    }
-
-    /**
-     * Returns the total number of folders that have been moved
-     *
-     * @return Total folders moved
-     */
-    public int getMovedFoldersCount() {
-        return foldersMovedCounter;
-    }
-
-    public Set<RepoPath> getCandidatesForMavenMetadataCalculation() {
-        return candidatesForMavenMetadataCalculation;
-    }
-
-    @Override
-    public void merge(BasicStatusHolder toMerge) {
-        super.merge(toMerge);
-        if (toMerge instanceof MoveMultiStatusHolder) {
-            //Merge moved items counter
-            MoveMultiStatusHolder moveMultiStatusHolder = (MoveMultiStatusHolder) toMerge;
-            artifactsMovedCounter += moveMultiStatusHolder.getMovedArtifactsCount();
-            foldersMovedCounter += moveMultiStatusHolder.getMovedFoldersCount();
-            candidatesForMavenMetadataCalculation.addAll(
-                    ((MoveMultiStatusHolder) toMerge).getCandidatesForMavenMetadataCalculation());
-        }
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/config/CentralConfigService.java b/base/api/src/main/java/org/artifactory/api/config/CentralConfigService.java
deleted file mode 100644
index ba5b8a8..0000000
--- a/base/api/src/main/java/org/artifactory/api/config/CentralConfigService.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.config;
-
-import org.artifactory.descriptor.DescriptorAware;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.joda.time.format.DateTimeFormatter;
-
-import java.io.File;
-import java.io.IOException;
-
-/**
- * User: freds Date: Aug 3, 2008 Time: 6:22:39 PM
- */
-public interface CentralConfigService extends DescriptorAware<CentralConfigDescriptor>, ImportableExportable {
-    DateTimeFormatter getDateFormatter();
-
-    void saveEditedDescriptorAndReload(CentralConfigDescriptor descriptor);
-
-    /**
-     * Reload configuration from storage
-     *
-     * @return {@code true} if succeeded reloading
-     */
-    boolean reloadConfiguration(boolean saveConfiguration);
-
-    String getServerName();
-
-    /**
-     * Formats the given milliseconds date with the date format configured in the central config.
-     *
-     * @param date Date in milliseconds
-     * @return Formatted date string
-     */
-    String format(long date);
-
-    VersionInfo getVersionInfo();
-
-    /**
-     * @return A mutable COPY of the central config descriptor.
-     */
-    MutableCentralConfigDescriptor getMutableDescriptor();
-
-    String getConfigXml();
-
-    void setConfigXml(String xmlConfig,boolean saveConfiguration);
-
-    void setLogo(File logo) throws IOException;
-
-    boolean defaultProxyDefined();
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/config/ExportSettingsImpl.java b/base/api/src/main/java/org/artifactory/api/config/ExportSettingsImpl.java
deleted file mode 100644
index 454ba0c..0000000
--- a/base/api/src/main/java/org/artifactory/api/config/ExportSettingsImpl.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.config;
-
-import com.google.common.collect.HashMultimap;
-import com.google.common.collect.SetMultimap;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import com.thoughtworks.xstream.annotations.XStreamOmitField;
-import org.artifactory.api.common.ImportExportStatusHolder;
-import org.artifactory.sapi.common.ExportSettings;
-import org.artifactory.sapi.common.FileExportCallback;
-import org.artifactory.sapi.common.FileExportEvent;
-import org.artifactory.sapi.common.FileExportInfo;
-
-import java.io.File;
-import java.util.Date;
-import java.util.Set;
-
-/**
- * @author Yoav Landman
- */
- at XStreamAlias("export-settings")
-public class ExportSettingsImpl extends ImportExportSettingsImpl implements ExportSettings {
-
-    private boolean ignoreRepositoryFilteringRulesOn = false;
-    private boolean createArchive = false;
-    private Date time;
-
-    /**
-     * Flag that indicates if to export m2 compatible meta data
-     */
-    private boolean m2Compatible = false;
-
-    private boolean incremental;
-
-    private boolean excludeBuilds;
-
-    /**
-     * Callbacks - If we need to perform any special actions before exporting a file
-     */
-    @XStreamOmitField
-    private SetMultimap<FileExportEvent, FileExportCallback> callbacks;
-
-    private File outputFile;
-
-    public ExportSettingsImpl(File baseDir) {
-        super(baseDir, new ImportExportStatusHolder());
-        time = new Date();
-        callbacks = HashMultimap.create();
-    }
-
-    public ExportSettingsImpl(File baseDir, ImportExportStatusHolder statusHolder) {
-        super(baseDir, statusHolder);
-        time = new Date();
-        callbacks = HashMultimap.create();
-    }
-
-    public ExportSettingsImpl(File baseDir, ExportSettings exportSettings) {
-        this(baseDir, exportSettings, (ImportExportStatusHolder) exportSettings.getStatusHolder());
-    }
-
-    public ExportSettingsImpl(File baseDir, ExportSettings exportSettings, ImportExportStatusHolder statusHolder) {
-        super(baseDir, exportSettings, statusHolder);
-        ExportSettingsImpl settings = (ExportSettingsImpl) exportSettings;
-        this.ignoreRepositoryFilteringRulesOn = settings.ignoreRepositoryFilteringRulesOn;
-        this.createArchive = settings.createArchive;
-        this.time = settings.time;
-        this.m2Compatible = settings.m2Compatible;
-        this.incremental = settings.incremental;
-        this.callbacks = settings.callbacks;
-        this.excludeBuilds = settings.excludeBuilds;
-
-    }
-
-    @Override
-    public boolean isIgnoreRepositoryFilteringRulesOn() {
-        return ignoreRepositoryFilteringRulesOn;
-    }
-
-    @Override
-    public void setIgnoreRepositoryFilteringRulesOn(boolean ignoreRepositoryFilteringRulesOn) {
-        this.ignoreRepositoryFilteringRulesOn = ignoreRepositoryFilteringRulesOn;
-    }
-
-    @Override
-    public boolean isCreateArchive() {
-        return createArchive;
-    }
-
-    @Override
-    public void setCreateArchive(boolean createArchive) {
-        this.createArchive = createArchive;
-    }
-
-    @Override
-    public Date getTime() {
-        return time;
-    }
-
-    @Override
-    public void setTime(Date time) {
-        this.time = time;
-    }
-
-    /**
-     * @return True is the export is incremental. Meaning override target only if exported file or folder is newer.
-     */
-    @Override
-    public boolean isIncremental() {
-        return incremental;
-    }
-
-    /**
-     * Incremental export only writes files and folder that are newer than what's in the target.
-     *
-     * @param incremental True to use incremental export.
-     */
-    @Override
-    public void setIncremental(boolean incremental) {
-        this.incremental = incremental;
-    }
-
-    @Override
-    public boolean isM2Compatible() {
-        return m2Compatible;
-    }
-
-    @Override
-    public void setM2Compatible(boolean m2Compatible) {
-        this.m2Compatible = m2Compatible;
-    }
-
-    @Override
-    public void addCallback(FileExportCallback callback) {
-        if (callbacks == null) {
-            callbacks = HashMultimap.create();
-        }
-        for (FileExportEvent event : callback.triggeringEvents()) {
-            callbacks.put(event, callback);
-        }
-    }
-
-    public void executeCallbacks(FileExportInfo info, FileExportEvent event) {
-        if (callbacks != null && callbacks.containsKey(event)) {
-            final Set<FileExportCallback> triggered = callbacks.get(event);
-            for (FileExportCallback callback : triggered) {
-                callback.callback(this, info);
-            }
-        }
-    }
-
-    @Override
-    public void cleanCallbacks() {
-        if ((callbacks != null) && !callbacks.isEmpty()) {
-            for (FileExportCallback callback : callbacks.values()) {
-                callback.cleanup();
-            }
-        }
-        callbacks.clear();
-    }
-
-    @Override
-    public boolean isExcludeBuilds() {
-        return excludeBuilds;
-    }
-
-    @Override
-    public void setExcludeBuilds(boolean excludeBuilds) {
-        this.excludeBuilds = excludeBuilds;
-    }
-
-    @Override
-    public File getOutputFile() {
-        return outputFile;
-    }
-
-    @Override
-    public void setOutputFile(File outputFile) {
-        this.outputFile = outputFile;
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/config/ImportExportSettingsImpl.java b/base/api/src/main/java/org/artifactory/api/config/ImportExportSettingsImpl.java
deleted file mode 100644
index e9d8f86..0000000
--- a/base/api/src/main/java/org/artifactory/api/config/ImportExportSettingsImpl.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.config;
-
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.sapi.common.BaseSettings;
-import org.slf4j.Logger;
-
-import java.io.File;
-import java.nio.file.Path;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * @author Fred Simon
- * @date Sep 29, 2008
- */
-public class ImportExportSettingsImpl implements BaseSettings {
-    private final File baseDir;
-    private boolean includeMetadata = true;
-    private boolean verbose;
-    private boolean failFast;
-    private boolean failIfEmpty;
-    private Path archiveTempDir;
-    protected boolean excludeContent;
-    private MutableStatusHolder statusHolder;
-    /**
-     * List of repositories to do export or import on. When empty - export or import all
-     */
-    private List<String> repositories = Collections.emptyList();
-
-
-    public ImportExportSettingsImpl(File baseDir, MutableStatusHolder statusHolder) {
-        this.baseDir = baseDir;
-        this.statusHolder = statusHolder;
-    }
-
-    public ImportExportSettingsImpl(File baseDir, BaseSettings baseSettings, MutableStatusHolder statusHolder) {
-        this(baseDir, statusHolder);
-        ImportExportSettingsImpl settings = (ImportExportSettingsImpl) baseSettings;
-        this.includeMetadata = settings.includeMetadata;
-        this.repositories = settings.repositories;
-        this.verbose = settings.verbose;
-        this.failFast = settings.failFast;
-        this.failIfEmpty = settings.failIfEmpty;
-        this.excludeContent = settings.excludeContent;
-    }
-
-    /**
-     * @return Base directory of the operation (target directory of the export or source directory of an import)
-     */
-    @Override
-    public File getBaseDir() {
-        return baseDir;
-    }
-
-    @Override
-    public boolean isIncludeMetadata() {
-        return includeMetadata;
-    }
-
-    @Override
-    public void setIncludeMetadata(boolean includeMetadata) {
-        this.includeMetadata = includeMetadata;
-    }
-
-    /**
-     * @return List of repositories to do export or import on. Empty if needs to export or import all.
-     */
-    @Override
-    public List<String> getRepositories() {
-        return repositories;
-    }
-
-    @Override
-    public void setRepositories(List<String> repositories) {
-        this.repositories = repositories;
-    }
-
-    @Override
-    public boolean isVerbose() {
-        return verbose;
-    }
-
-    @Override
-    public void setVerbose(boolean verbose) {
-        this.verbose = verbose;
-        statusHolder.setVerbose(verbose);
-    }
-
-    @Override
-    public boolean isFailFast() {
-        return failFast;
-    }
-
-    @Override
-    public void setFailFast(boolean failFast) {
-        this.failFast = failFast;
-        statusHolder.setFastFail(failFast);
-    }
-
-    @Override
-    public boolean isFailIfEmpty() {
-        return failIfEmpty;
-    }
-
-    @Override
-    public void setFailIfEmpty(boolean failIfEmpty) {
-        this.failIfEmpty = failIfEmpty;
-    }
-
-    @Override
-    public MutableStatusHolder getStatusHolder() {
-        return statusHolder;
-    }
-
-    @Override
-    public boolean isExcludeContent() {
-        return excludeContent;
-    }
-
-    @Override
-    public void setExcludeContent(boolean excludeContent) {
-        this.excludeContent = excludeContent;
-    }
-
-    @Override
-    public void alertFailIfEmpty(String message, Logger log) {
-        if (isFailIfEmpty()) {
-            statusHolder.error(message, log);
-        } else {
-            statusHolder.warn(message, log);
-        }
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/config/ImportSettingsImpl.java b/base/api/src/main/java/org/artifactory/api/config/ImportSettingsImpl.java
deleted file mode 100644
index e3a97f4..0000000
--- a/base/api/src/main/java/org/artifactory/api/config/ImportSettingsImpl.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.config;
-
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import org.artifactory.api.common.ImportExportStatusHolder;
-import org.artifactory.sapi.common.ImportSettings;
-import org.artifactory.sapi.fs.MetadataReader;
-import org.artifactory.version.ArtifactoryVersion;
-
-import java.io.File;
-
-/**
- * @author Yoav Landman
- */
- at XStreamAlias("import-settings")
-public class ImportSettingsImpl extends ImportExportSettingsImpl implements ImportSettings {
-
-    /**
-     * Need an internal holder class to make sure that the same flags are used even after copy constructor. The info
-     * member is pointing to same instance during the all import process.
-     */
-    private static class SharedInfo {
-
-        /**
-         * The actual artifactory version that created the folder that need to be imported.
-         */
-        private ArtifactoryVersion exportVersion;
-
-        private MetadataReader metadataReader;
-        private boolean indexMarkedArchives;
-
-    }
-
-    private final SharedInfo info;
-
-    public ImportSettingsImpl(File baseDir) {
-        super(baseDir, new ImportExportStatusHolder());
-        info = new SharedInfo();
-    }
-
-    public ImportSettingsImpl(File baseDir, ImportExportStatusHolder statusHolder) {
-        super(baseDir, statusHolder);
-        this.info = new SharedInfo();
-    }
-
-    public ImportSettingsImpl(File baseDir, ImportSettings settings) {
-        this(baseDir, settings, (ImportExportStatusHolder) settings.getStatusHolder());
-    }
-
-    public ImportSettingsImpl(File baseDir, ImportSettings settings, ImportExportStatusHolder statusHolder) {
-        super(baseDir, settings, statusHolder);
-        info = ((ImportSettingsImpl) settings).info;
-    }
-
-    public ArtifactoryVersion getExportVersion() {
-        return info.exportVersion;
-    }
-
-    public void setExportVersion(ArtifactoryVersion exportVersion) {
-        this.info.exportVersion = exportVersion;
-    }
-
-    @Override
-    public MetadataReader getMetadataReader() {
-        return info.metadataReader;
-    }
-
-    @Override
-    public void setMetadataReader(MetadataReader metadataReader) {
-        this.info.metadataReader = metadataReader;
-    }
-
-    /**
-     * This method activates the archive indexer immediately on all artifacts that are marked for indexing. This is
-     * usually used when importing a repository (usually a single one) and indexing will take place right after the
-     * import process and not in async manner like after importing many repositories.
-     *
-     * @return Whether immediate indexing for marked artifacts is active or not.
-     */
-    @Override
-    public boolean isIndexMarkedArchives() {
-        return info.indexMarkedArchives;
-    }
-
-    @Override
-    public void setIndexMarkedArchives(boolean indexMarkedArchives) {
-        info.indexMarkedArchives = indexMarkedArchives;
-    }
-
-}
diff --git a/base/api/src/main/java/org/artifactory/api/config/ImportableExportable.java b/base/api/src/main/java/org/artifactory/api/config/ImportableExportable.java
deleted file mode 100644
index a2a7868..0000000
--- a/base/api/src/main/java/org/artifactory/api/config/ImportableExportable.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.config;
-
-import org.artifactory.sapi.common.ExportSettings;
-import org.artifactory.sapi.common.ImportSettings;
-
-/**
- * @author Yoav Landman
- */
-public interface ImportableExportable {
-    void exportTo(ExportSettings settings);
-
-    void importFrom(ImportSettings settings);
-}
diff --git a/base/api/src/main/java/org/artifactory/api/config/RepositoryImportSettingsImpl.java b/base/api/src/main/java/org/artifactory/api/config/RepositoryImportSettingsImpl.java
deleted file mode 100644
index 058a397..0000000
--- a/base/api/src/main/java/org/artifactory/api/config/RepositoryImportSettingsImpl.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.config;
-
-import org.artifactory.sapi.common.ImportSettings;
-
-import java.io.File;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Specific settings for repositories import.
- *
- * @author Yoav Luft
- */
-public class RepositoryImportSettingsImpl extends ImportSettingsImpl implements ImportSettings {
-    private List<String> repositoriesToDelete = Collections.emptyList();
-    /**
-     * When true this variable implies that only one repository should be imported and the baseDir is the root of this
-     * repository.
-     */
-    private boolean singleRepoImport = false;
-
-    public RepositoryImportSettingsImpl(File baseDir) {
-        super(baseDir);
-    }
-
-    public RepositoryImportSettingsImpl(File baseDir, ImportSettings settings) {
-        super(baseDir, settings);
-        if (settings instanceof RepositoryImportSettingsImpl) {
-            this.singleRepoImport = ((RepositoryImportSettingsImpl) settings).isSingleRepoImport();
-            this.repositoriesToDelete = ((RepositoryImportSettingsImpl) settings).getRepositoriesToDelete();
-        }
-    }
-
-    public void setRepositoriesToDelete(List<String> repositoriesToDelete) {
-        this.repositoriesToDelete = repositoriesToDelete;
-    }
-
-    public List<String> getRepositoriesToDelete() {
-        return repositoriesToDelete;
-    }
-
-    public boolean isSingleRepoImport() {
-        return singleRepoImport;
-    }
-
-    public void setSingleRepoImport(boolean singleRepoImport) {
-        this.singleRepoImport = singleRepoImport;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/config/VersionInfo.java b/base/api/src/main/java/org/artifactory/api/config/VersionInfo.java
deleted file mode 100644
index 2abff20..0000000
--- a/base/api/src/main/java/org/artifactory/api/config/VersionInfo.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.config;
-
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.Serializable;
-
-/**
- * User: freds Date: Aug 5, 2008 Time: 9:30:26 PM
- */
- at XStreamAlias("artifactoryVersion")
-public class VersionInfo implements Serializable, Comparable<VersionInfo> {
-
-    private static final String SNAPSHOT = "-SNAPSHOT";
-    private static final Logger log = LoggerFactory.getLogger(VersionInfo.class);
-
-    private String version;
-    private String revision;
-
-    /**
-     * Serialization .ctr
-     */
-    public VersionInfo() {
-    }
-
-    public VersionInfo(String version, String revision) {
-        this.version = version;
-        this.revision = revision;
-    }
-
-    public VersionInfo(String version) {
-        this.version = version;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public String getRevision() {
-        return revision;
-    }
-
-    public void setRevision(String revision) {
-        this.revision = revision;
-    }
-
-    @Override
-    public String toString() {
-        return "VersionInfo{" +
-                "version='" + version + '\'' +
-                ", revision='" + revision + '\'' +
-                '}';
-    }
-
-    /**
-     * Performs version compare
-     *
-     * @param other {@link VersionInfo} to compare against this instance
-     *
-     * @exception  NumberFormatException if the {@code Version}
-     *             does not contain a parsable {@code int}.
-     *
-     * @return int (-1/0/1)
-     */
-    @Override
-    public int compareTo(VersionInfo other) {
-        if (other.getVersion().endsWith(SNAPSHOT)) {
-            log.debug("Found development {} version, assuming it grader than any other version ...", other);
-            return 1;
-        }
-
-        String[] arrLeft = other.getVersion().split("\\.");
-        String[] arrRight = this.getVersion().split("\\.");
-
-        // TODO: Should we support revision as well?
-
-        int i=0;
-        while(i<arrLeft.length || i<arrRight.length){
-            if(i<arrLeft.length && i<arrRight.length){
-                if(Integer.parseInt(arrLeft[i]) < Integer.parseInt(arrRight[i])){
-                    return -1;
-                }else if(Integer.parseInt(arrLeft[i]) > Integer.parseInt(arrRight[i])){
-                    return 1;
-                }
-            } else if(i<arrLeft.length){
-                if(Integer.parseInt(arrLeft[i]) != 0){
-                    return 1;
-                }
-            } else if(i<arrRight.length){
-                if(Integer.parseInt(arrRight[i]) != 0){
-                    return -1;
-                }
-            }
-
-            i++;
-        }
-
-        return 0;
-    }
-
-    /**
-     * Defines equality of VersionInfo
-     */
-    @Override
-    public boolean equals(Object other) {
-        if (this == other) return true;
-        if (!(other instanceof VersionInfo)) return false;
-
-        VersionInfo that = (VersionInfo)other;
-        return this.getVersion().equals(that.getVersion()) &&
-                this.getRevision().equals(that.getRevision());
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/context/ArtifactoryContext.java b/base/api/src/main/java/org/artifactory/api/context/ArtifactoryContext.java
deleted file mode 100644
index 205d134..0000000
--- a/base/api/src/main/java/org/artifactory/api/context/ArtifactoryContext.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.context;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.config.ImportableExportable;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.converters.ConverterManager;
-import org.artifactory.converters.VersionProvider;
-import org.artifactory.spring.SpringConfigPaths;
-
-import java.util.Map;
-
-/**
- * @author yoavl
- */
-public interface ArtifactoryContext extends ImportableExportable {
-    String MBEANS_DOMAIN_NAME = "org.jfrog.artifactory:";
-    String APPLICATION_CONTEXT_KEY = "org.artifactory.spring.ApplicationContext";
-
-    CentralConfigService getCentralConfig();
-
-    public <T> T beanForType(Class<T> type);
-
-    <T> T beanForType(String name, Class<T> type);
-
-    public <T> Map<String, T> beansForType(Class<T> type);
-
-    public Object getBean(String name);
-
-    RepositoryService getRepositoryService();
-
-    AuthorizationService getAuthorizationService();
-
-    long getUptime();
-
-    ArtifactoryHome getArtifactoryHome();
-
-    String getContextId();
-
-    SpringConfigPaths getConfigPaths();
-
-    String getServerId();
-
-    boolean isOffline();
-
-    void setOffline();
-
-    ConverterManager getConverterManager();
-
-    VersionProvider getVersionProvider();
-
-    void destroy();
-}
diff --git a/base/api/src/main/java/org/artifactory/api/context/ArtifactoryContextThreadBinder.java b/base/api/src/main/java/org/artifactory/api/context/ArtifactoryContextThreadBinder.java
deleted file mode 100644
index c83171c..0000000
--- a/base/api/src/main/java/org/artifactory/api/context/ArtifactoryContextThreadBinder.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.context;
-
-import org.artifactory.log.logback.LogbackContextSelector;
-
-/**
- * @author yoavl
- */
-public abstract class ArtifactoryContextThreadBinder {
-
-    private static final InheritableThreadLocal<ArtifactoryContext> current =
-            new InheritableThreadLocal<>();
-
-    static ArtifactoryContext getArtifactoryContext() {
-        return current.get();
-    }
-
-    public static void bind(ArtifactoryContext context) {
-        current.set(context);
-        LogbackContextSelector.bind();
-    }
-
-    public static void unbind() {
-        LogbackContextSelector.unbind();
-        current.remove();
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/context/ContextHelper.java b/base/api/src/main/java/org/artifactory/api/context/ContextHelper.java
deleted file mode 100644
index 3340005..0000000
--- a/base/api/src/main/java/org/artifactory/api/context/ContextHelper.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.context;
-
-/**
- * @author Yoav Landman
- */
-public class ContextHelper {
-    public static ArtifactoryContext get() {
-        return ArtifactoryContextThreadBinder.getArtifactoryContext();
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/download/FolderDownloadInfo.java b/base/api/src/main/java/org/artifactory/api/download/FolderDownloadInfo.java
deleted file mode 100644
index 71ea554..0000000
--- a/base/api/src/main/java/org/artifactory/api/download/FolderDownloadInfo.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.api.download;
-
-/**
- * Holds information about the folder requested for download
- *
- * @author Dan Feldman
- */
-public class FolderDownloadInfo {
-
-    private double sizeMb;
-    private long totalFiles;
-
-    public FolderDownloadInfo(double sizeMb, long totalFiles) {
-        this.sizeMb = sizeMb;
-        this.totalFiles = totalFiles;
-    }
-
-    public double getSizeMb() {
-        return sizeMb;
-    }
-
-    public long getTotalFiles() {
-        return totalFiles;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/download/FolderDownloadService.java b/base/api/src/main/java/org/artifactory/api/download/FolderDownloadService.java
deleted file mode 100644
index 11f4eae..0000000
--- a/base/api/src/main/java/org/artifactory/api/download/FolderDownloadService.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.download;
-
-import org.artifactory.api.archive.ArchiveType;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.descriptor.download.FolderDownloadConfigDescriptor;
-import org.artifactory.repo.RepoPath;
-
-import java.io.InputStream;
-
-/**
- * A service for downloading entire directory contents as an archive.
- *
- * @author Dan Feldman
- */
-public interface FolderDownloadService {
-
-    /**
-     * Tries to acquire an available download slot from the pool (which is limited by the amount specified in the config)
-     *
-     * @return true if slot acquired.
-     */
-    boolean getAvailableDownloadSlot();
-
-    /**
-     * Releases a download slot to the pool
-     */
-    void releaseDownloadSlot();
-
-    /**
-     * Collects all files under the current folder and returns an OutputStream with a type as required by
-     * {@param archiveType}. Files that the user doesn't have permission to read are filtered and not included in the
-     * archive.
-     *
-     * NOTE: It is the callers responsibility to acquire a download slot with {@link this#getAvailableDownloadSlot()}
-     * when starting the operation and release it with {@link this#releaseDownloadSlot()} when done (and closing)
-     * <b>writing the stream</b>
-     *
-     * @param folder      - Folder to download
-     * @param archiveType - Type of archive to stream files in
-     * @param status      - Status of operation
-     * @return - OutputStream based on {@param archiveType}
-     */
-    InputStream process(RepoPath pathToDownload, ArchiveType archiveType, BasicStatusHolder status);
-
-    /**
-     * Same as process, but ignores the limits set by the download slots config, max size and max file count
-     * This method is meant to be used by services such as CocoaPods to serve its index compressed.
-     * CAUTION: Also does not check if the service was enabled in the config and serves the request in any case.
-     */
-    InputStream processNoLimit(RepoPath pathToDownload, ArchiveType archiveType, BasicStatusHolder status);
-
-    /**
-     * Collects file count and total size for the requested folder for the UI to show
-     *
-     * @param folder folder to get info about
-     * @return FolderDownloadInfo model with the info
-     */
-    FolderDownloadInfo collectFolderInfo(RepoPath folder);
-
-    /**
-     * @return the {@link FolderDownloadConfigDescriptor}
-     */
-    FolderDownloadConfigDescriptor getFolderDownloadConfig();
-}
diff --git a/base/api/src/main/java/org/artifactory/api/governance/BaseAction.java b/base/api/src/main/java/org/artifactory/api/governance/BaseAction.java
deleted file mode 100644
index fb9b379..0000000
--- a/base/api/src/main/java/org/artifactory/api/governance/BaseAction.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.artifactory.api.governance;
-
-/**
- * @author Chen Keinan
- */
-public class BaseAction {
-
-    private String name;
-
-    BaseAction() {
-    }
-    public BaseAction(String name) {
-        this.name = name;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/governance/BlackDuckApplicationInfo.java b/base/api/src/main/java/org/artifactory/api/governance/BlackDuckApplicationInfo.java
deleted file mode 100644
index e17e2c8..0000000
--- a/base/api/src/main/java/org/artifactory/api/governance/BlackDuckApplicationInfo.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.governance;
-
-import java.io.Serializable;
-
-/**
- * @author mamo
- * @author chen Keinan
- */
-public class BlackDuckApplicationInfo implements Serializable {
-
-    private String name;
-    private String version;
-    private String applicationId;
-    private String link;
-    private String description;
-    private String approvalStatus;
-    private String owner;
-
-    public BlackDuckApplicationInfo() {
-    }
-
-    public BlackDuckApplicationInfo(String name, String version) {
-        this.name = name;
-        this.version = version;
-    }
-
-    public String getApplicationId() {
-        return applicationId;
-    }
-
-    public void setApplicationId(String applicationId) {
-        this.applicationId = applicationId;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public String getLink() {
-        return link;
-    }
-
-    public void setLink(String link) {
-        this.link = link;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public String getApprovalStatus() {
-        return approvalStatus;
-    }
-
-    public void setApprovalStatus(String approvalStatus) {
-        this.approvalStatus = approvalStatus;
-    }
-
-    public String getOwner() {
-        return owner;
-    }
-
-    public void setOwner(String owner) {
-        this.owner = owner;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/governance/BlackDuckUtils.java b/base/api/src/main/java/org/artifactory/api/governance/BlackDuckUtils.java
deleted file mode 100644
index 540c8af..0000000
--- a/base/api/src/main/java/org/artifactory/api/governance/BlackDuckUtils.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.governance;
-
-import org.apache.commons.lang.WordUtils;
-
-/**
- * @author mamo
- */
-public class BlackDuckUtils {
-    public static String sanitizeDescription(String description) {
-        String prefix = "Maven GAV: ";
-        int i1 = description.indexOf(prefix);
-        if (i1 != -1) {
-            int i2 = description.indexOf(" ", i1 + prefix.length());
-            if (i2 != -1) {
-                description = description.substring(0, i1) + description.substring(i2);
-            }
-        }
-        return description;
-    }
-
-    public static String camelize(String text) {
-        return text != null ? WordUtils.capitalizeFully(text.toLowerCase()) : null;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/governance/ExtComponentCoordinates.java b/base/api/src/main/java/org/artifactory/api/governance/ExtComponentCoordinates.java
deleted file mode 100644
index 4a429b4..0000000
--- a/base/api/src/main/java/org/artifactory/api/governance/ExtComponentCoordinates.java
+++ /dev/null
@@ -1,197 +0,0 @@
-package org.artifactory.api.governance;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.maven.MavenArtifactInfo;
-import org.artifactory.api.module.ModuleInfo;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.Serializable;
-
-/**
- * @author Dan Feldman
- * @author Chen Keinan
- */
-public class ExtComponentCoordinates implements Serializable {
-    private static final Logger log = LoggerFactory.getLogger(ExtComponentCoordinates.class);
-
-    //Packages that are separated by '/' and have a version that consists of 4 numbers are converted to links by browsers
-    private static final String MAIL_COMPATIBLE_DELIMITER = ":";
-
-    //Namespace prefixes
-    public enum PackageType {
-        MAVEN("org.apache.maven"), NUGET("org.nuget"), UNSPECIFIED("");
-
-        private final String stringValue;
-
-        PackageType(final String s) {
-            stringValue = s;
-        }
-
-        public String toString() {
-            return stringValue;
-        }
-    }
-
-    private PackageType packageType;
-    private String coordinates;
-    private String groupId;
-    private String name;
-    private String nameSpace;
-    private String version;
-    private String externalId;
-    private String mailCompatibleCoordinates; // :(
-
-    public ExtComponentCoordinates() {
-
-    }
-
-    /**
-     * To be used only when coordinates are not used to directly resolve components (i.e.
-     */
-    public ExtComponentCoordinates(String coordinates) {
-        name = "";
-        version = "";
-        packageType = PackageType.UNSPECIFIED;
-        this.coordinates = coordinates;
-    }
-
-    /**
-     * No groupId (i.e. NuGet)
-     */
-    public ExtComponentCoordinates(String packageName, String packageVersion, PackageType packageType) {
-        this.name = StringUtils.isNotBlank(packageName) ? packageName : "";
-        this.version = StringUtils.isNotBlank(packageVersion) ? packageVersion : "";
-        this.packageType = packageType;
-        this.coordinates = assembleCoordinates(packageType, null, packageName, packageVersion);
-    }
-
-    /**
-     * Maven
-     */
-    public ExtComponentCoordinates(MavenArtifactInfo artifactInfo) {
-        this.name = StringUtils.isNotBlank(artifactInfo.getArtifactId()) ? artifactInfo.getArtifactId() : "";
-        this.version = StringUtils.isNotBlank(artifactInfo.getVersion()) ? artifactInfo.getVersion() : "";
-        this.groupId = StringUtils.isNotBlank(artifactInfo.getGroupId()) ? artifactInfo.getGroupId() : "";
-        this.packageType = PackageType.MAVEN;
-        this.coordinates = assembleCoordinates(packageType, groupId, name, version);
-    }
-
-
-    public ExtComponentCoordinates(ModuleInfo moduleInfo, PackageType packageType) {
-        this.groupId = StringUtils.isNotBlank(moduleInfo.getOrganization()) ? moduleInfo.getOrganization() : "";
-        this.name = StringUtils.isNotBlank(moduleInfo.getModule()) ? moduleInfo.getModule() : "";
-        StringBuilder version = new StringBuilder(StringUtils.isNotBlank(moduleInfo.getBaseRevision())
-                ? moduleInfo.getBaseRevision() : "");
-        version.append(StringUtils.isNotBlank(moduleInfo.getFolderIntegrationRevision())
-                ? "-" + moduleInfo.getFolderIntegrationRevision() : "");
-        this.version = version.toString();
-        this.packageType = packageType;
-        this.coordinates = assembleCoordinates(packageType, groupId, name, this.version);
-    }
-
-    private String assembleCoordinates(PackageType packageType, String groupId, String name, String version) {
-        String delimiter = getDelimiterByPackageType(packageType);
-        StringBuilder coordinates = new StringBuilder();
-        StringBuilder mailCoordinates = new StringBuilder();
-        if (StringUtils.isNotBlank(groupId)) {
-            coordinates.append(groupId).append(delimiter);
-            mailCoordinates.append(groupId).append(MAIL_COMPATIBLE_DELIMITER);
-        }
-        if (StringUtils.isNotBlank(name)) {
-            coordinates.append(name);
-            mailCoordinates.append(name);
-        }
-        if (StringUtils.isNotBlank(version)) {
-            coordinates.append(delimiter).append(version);
-            mailCoordinates.append(MAIL_COMPATIBLE_DELIMITER).append(version);
-        }
-        log.debug("Creating Black Duck component coordinates for {} package: {}, version: {}, with Code Center " +
-                        "Namespace: {}.  Coordinates are: {}",
-                StringUtils.isBlank(groupId) ? "" : "groupId: " + groupId,
-                name, version, packageType, coordinates);
-        this.mailCompatibleCoordinates = mailCoordinates.toString();
-        return coordinates.toString();
-    }
-
-    public String getNamespace() {
-        return this.nameSpace;
-    }
-
-    public String getCoordinates() {
-        return coordinates;
-    }
-
-    public String getMailCompatibleCoordinates() {
-        return mailCompatibleCoordinates;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    /**
-     * @return externalId if set, coordinates if not
-     */
-    public String getExternalId() {
-        return StringUtils.isNotBlank(externalId) ? externalId : coordinates;
-    }
-
-    public void setExternalId(String externalId) {
-        this.externalId = externalId;
-    }
-
-    public boolean isValid() {
-        return StringUtils.isNotBlank(name) && StringUtils.isNotBlank(version) && StringUtils.isNotBlank(coordinates)
-                && packageType != null;
-    }
-
-    private String getDelimiterByPackageType(PackageType packageType) {
-        if (PackageType.MAVEN.equals(packageType)) {
-            return ":";
-        } else if (PackageType.NUGET.equals(packageType)) {
-            return "/";
-        }
-        return "";
-    }
-
-    public PackageType getPackageType() {
-        return packageType;
-    }
-
-    public void setPackageType(PackageType packageType) {
-        this.packageType = packageType;
-    }
-
-    public void setCoordinates(String coordinates) {
-        this.coordinates = coordinates;
-    }
-
-    public String getGroupId() {
-        return groupId;
-    }
-
-    public void setGroupId(String groupId) {
-        this.groupId = groupId;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public void setMailCompatibleCoordinates(String mailCompatibleCoordinates) {
-        this.mailCompatibleCoordinates = mailCompatibleCoordinates;
-    }
-
-    public void setNameSpace(String nameSpace) {
-        this.nameSpace = nameSpace;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/governance/ExternalVulnerability.java b/base/api/src/main/java/org/artifactory/api/governance/ExternalVulnerability.java
deleted file mode 100644
index 7e34236..0000000
--- a/base/api/src/main/java/org/artifactory/api/governance/ExternalVulnerability.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.governance;
-
-import java.io.Serializable;
-
-/**
- * @author Chen Keinan
- */
-public class ExternalVulnerability implements Serializable {
-
-    private String name;
-    private String severity;
-    private String description;
-    private Long publishDate;
-    private String link;
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-        if (name != null) {
-            link = "http://web.nvd.nist.gov/view/vuln/detail?vulnId=" + name;
-        }
-    }
-
-    public String getSeverity() {
-        return severity;
-    }
-
-    public void setSeverity(String severity) {
-        this.severity = severity;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public Long getPublishDate() {
-        return publishDate;
-    }
-
-    public void setPublishDate(Long publishDate) {
-        this.publishDate = publishDate;
-    }
-
-    public String getLink() {
-        return link;
-    }
-
-    public void setLink(String link) {
-        this.link = link;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/governance/GovernanceRequestInfo.java b/base/api/src/main/java/org/artifactory/api/governance/GovernanceRequestInfo.java
deleted file mode 100644
index c130bd4..0000000
--- a/base/api/src/main/java/org/artifactory/api/governance/GovernanceRequestInfo.java
+++ /dev/null
@@ -1,196 +0,0 @@
-package org.artifactory.api.governance;
-
-import com.google.common.collect.Sets;
-import org.artifactory.repo.RepoPath;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-
-import javax.annotation.Nullable;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Chen Keinan
- */
- at JsonIgnoreProperties("repoPath")
-public class GovernanceRequestInfo {
-
-    ExtComponentCoordinates componentCoordinates;
-    private String componentName;
-    private String componentVersion;
-    private Set<String> scopes = Sets.newHashSet();
-    private boolean published;
-    private RepoPath repoPath;
-    private String license;
-    private String componentId; //reflects catalog component id
-    private List<ExternalVulnerability> vulnerabilities;
-    private String status;
-    private String repoKey;
-    private String path;
-    private List<String> actions;
-    private String requestLink;
-
-
-    public void setComponentName(String componentName) {
-        this.componentName = componentName;
-    }
-
-    public String getComponentName() {
-        return componentName;
-    }
-
-    public void setComponentVersion(String componentVersion) {
-        this.componentVersion = componentVersion;
-    }
-
-    public String getComponentVersion() {
-        return componentVersion;
-    }
-
-    public void setLicense(String license) {
-        this.license = license;
-    }
-
-    public String getLicense() {
-        return license;
-    }
-
-    public String getStatus() {
-        return status;
-    }
-
-    public void setStatus(String status) {
-        this.status = status;
-        if (status != null && (status.equals("Missing") || status.equals("Stale"))) {
-            if (actions == null) {
-                actions = new ArrayList<>();
-            }
-            actions.add("UpdateRequest");
-        }
-    }
-
-    public String getCoordinates() {
-        return getComponentCoordinates().getCoordinates();
-    }
-
-    public String getMailCompatibleCoordinates() {
-        return getComponentCoordinates().getMailCompatibleCoordinates();
-    }
-
-    public String getExternalId() {
-        return getComponentCoordinates().getExternalId();
-    }
-
-    public String getNameSpace() {
-        return componentCoordinates.getNamespace();
-    }
-
-    public void setComponentCoordinates(ExtComponentCoordinates coordinates) {
-        this.componentCoordinates = coordinates;
-    }
-
-    public ExtComponentCoordinates getComponentCoordinates() {
-        return componentCoordinates;
-    }
-
-    public String getComponentId() {
-        return componentId;
-    }
-
-    public void setComponentId(String componentId) {
-        this.componentId = componentId;
-    }
-
-    public RepoPath getRepoPath() {
-        return repoPath;
-    }
-
-    public void setRepoPath(RepoPath repoPath) {
-        this.repoPath = repoPath;
-        if (repoPath != null) {
-            repoKey = repoPath.getRepoKey();
-            path = repoPath.getPath();
-            if (actions == null) {
-                actions = new ArrayList<>();
-            }
-            actions.add("ShowInTree");
-        } else {
-            repoKey = "";
-            path = "No path found (externally resolved or deleted/overwritten)";
-        }
-    }
-
-    public Set<String> getScopes() {
-        return scopes;
-    }
-
-    public void setScopes(Set<String> scopes) {
-        this.scopes = scopes;
-    }
-
-    public boolean isPublished() {
-        return published;
-    }
-
-    public void setPublished(boolean published) {
-        this.published = published;
-    }
-
-    @Nullable
-    public List<ExternalVulnerability> getVulnerabilities() {
-        return vulnerabilities;
-    }
-
-    public void setVulnerabilities(@Nullable List<ExternalVulnerability> vulnerabilities) {
-        this.vulnerabilities = vulnerabilities;
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    public List<String> getActions() {
-        return actions;
-    }
-
-    public void setActions(List<String> actions) {
-        this.actions = actions;
-    }
-
-    public String getRequestLink() {
-        return requestLink;
-    }
-
-    public void setRequestLink(String requestLink) {
-        this.requestLink = requestLink;
-        if (requestLink != null) {
-            if (actions == null) {
-                actions = new ArrayList<>();
-            }
-            actions.add("ShowRequest");
-        }
-    }
-
-    @Override
-    public String toString() {
-        return "BlackDuckRequestInfo{" +
-                "componentName='" + componentName + '\'' +
-                ", componentVersion='" + componentVersion + '\'' +
-                ", Code Center Namespace='" + componentCoordinates.getNamespace() + '\'' +
-                ", coordinates='" + componentCoordinates.getCoordinates() + '\'' +
-                ", componentId='" + componentId + '\'' +
-                '}';
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/governance/GovernanceUpdateResult.java b/base/api/src/main/java/org/artifactory/api/governance/GovernanceUpdateResult.java
deleted file mode 100644
index 1243638..0000000
--- a/base/api/src/main/java/org/artifactory/api/governance/GovernanceUpdateResult.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package org.artifactory.api.governance;
-
-import com.google.common.base.Function;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Multimaps;
-import org.apache.commons.collections.CollectionUtils;
-
-import java.util.List;
-
-/**
- * @author mamo
- */
-public class GovernanceUpdateResult {
-
-    public enum UpdateStatus {
-        create, deleteOrUpdate, error, skip;
-
-        @Override
-        public String toString() {
-            return BlackDuckUtils.camelize(name());
-        }
-    }
-
-    public final GovernanceRequestInfo requestInfo;
-    public final UpdateStatus updateStatus;
-    private String message;
-
-    public GovernanceUpdateResult(GovernanceRequestInfo requestInfo, String updateStatus) {
-        this.requestInfo = requestInfo;
-        this.updateStatus = getUpdateStatus(updateStatus);
-    }
-
-    /**
-     * get updated enum status
-     *
-     * @param updateStatus - updated status
-     * @return - enum status
-     */
-    public UpdateStatus getUpdateStatus(String updateStatus) {
-        switch (updateStatus) {
-            case "create":
-                return UpdateStatus.create;
-            case "deleteOrUpdate":
-                return UpdateStatus.deleteOrUpdate;
-            case "error":
-                return UpdateStatus.error;
-            case "skip":
-                return UpdateStatus.skip;
-            default:
-                return UpdateStatus.create;
-        }
-    }
-
-    public GovernanceUpdateResult message(String message) {
-        this.message = message;
-        return this;
-    }
-
-    public String getMessage() {
-        return message;
-    }
-
-    public static int numberOfErrors(List<GovernanceUpdateResult> resultList) {
-        if (CollectionUtils.isNotEmpty(resultList)) {
-            ImmutableList<GovernanceUpdateResult> errors = Multimaps.index(resultList, $updateStatus).get(
-                    UpdateStatus.error);
-            return errors != null ? errors.size() : 0;
-        } else {
-            return 0;
-        }
-    }
-
-    public static final Function<GovernanceUpdateResult, UpdateStatus> $updateStatus = new Function<GovernanceUpdateResult, UpdateStatus>() {
-        @Override
-        public UpdateStatus apply(GovernanceUpdateResult input) {
-            return input.updateStatus;
-        }
-    };
-
-}
diff --git a/base/api/src/main/java/org/artifactory/api/license/ArtifactLicenseModel.java b/base/api/src/main/java/org/artifactory/api/license/ArtifactLicenseModel.java
deleted file mode 100644
index 45723a5..0000000
--- a/base/api/src/main/java/org/artifactory/api/license/ArtifactLicenseModel.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright 2012 JFrog Ltd. All rights reserved.
- * JFROG PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
- */
-
-package org.artifactory.api.license;
-
-import java.io.Serializable;
-
-/**
- * @author Tomer Cohen
- */
-public class ArtifactLicenseModel implements Serializable {
-    public static final String UNAPPROVED = "Unapproved";
-    public static final String APPROVED = "Approved";
-
-    private String name;
-    private String longName;
-    private String url;
-    private String comments;
-    private String regexp;
-    private boolean approved;
-
-    public ArtifactLicenseModel() {
-    }
-
-    public ArtifactLicenseModel(LicenseInfo licenseInfo) {
-        this.comments = licenseInfo.getComments();
-        this.longName = licenseInfo.getLongName();
-        this.name = licenseInfo.getName();
-        this.url = licenseInfo.getUrl();
-        this.regexp = licenseInfo.getRegexp();
-        this.approved = licenseInfo.isApproved();
-    }
-
-    public String getComments() {
-        return comments;
-    }
-
-    public void setComments(String comments) {
-        this.comments = comments;
-    }
-
-    public String getLongName() {
-        return longName;
-    }
-
-    public void setLongName(String longName) {
-        this.longName = longName;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getStatus() {
-        return isApproved() ? APPROVED : UNAPPROVED;
-    }
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    public String getRegexp() {
-        return regexp;
-    }
-
-    public void setRegexp(String regexp) {
-        this.regexp = regexp;
-    }
-
-    public boolean isApproved() {
-        return approved;
-    }
-
-    public void setApproved(boolean approved) {
-        this.approved = approved;
-    }
-
-    /**
-     * Changes the license status from approved to unapproved or vice versa.
-     */
-    public void changeStatus() {
-        setApproved(!isApproved());
-    }
-
-    /**
-     * Build a LicenseInfo Object from this model with State.FOUND - use this only when persisting License Info
-     */
-    public LicenseInfo buildLicenseInfo() {
-        LicenseInfo info = new LicenseInfo(name, longName, url);
-        info.setApproved(approved);
-        info.setComments(comments);
-        info.setRegexp(regexp);
-        return info;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/license/LicenseInfo.java b/base/api/src/main/java/org/artifactory/api/license/LicenseInfo.java
deleted file mode 100644
index 026ef8f..0000000
--- a/base/api/src/main/java/org/artifactory/api/license/LicenseInfo.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright 2012 JFrog Ltd. All rights reserved.
- * JFROG PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
- */
-
-package org.artifactory.api.license;
-
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import org.apache.commons.lang.StringUtils;
-
-import java.io.Serializable;
-import java.util.regex.Pattern;
-
-/**
- * This class represents a software license (e.g. apache, lgpl etc..) Each license is comprised of a name
- * (which is a must) a long name which describes it, the URL where to find the full license content, a
- * {@link java.util.regex.Pattern} which describes the license, and a boolean value whether this license is an approved
- * one to use.
- *
- * @author Tomer Cohen
- * @author Dan Feldman
- */
- at XStreamAlias(LicenseInfo.ROOT)
-public class LicenseInfo implements Serializable {
-
-    public static final String NOT_FOUND = "Not Found";
-    public static final String UNKNOWN = "Unknown";
-    public static final String ROOT = "license";
-    private static final String NOT_SEARCHED = "Not Searched";
-
-    private String name = "";
-    private String longName = "";
-    private String url = "";
-    private String regexp = "";
-    private String comments = "";
-    private boolean approved = false;
-    private boolean unknown;
-    private boolean validLicense;
-    private boolean found;
-    private boolean notFound;
-    private boolean notSearched;
-
-
-
-    public LicenseInfo(String name, String longName, String url) {
-        this.name = name;
-        this.longName = longName;
-        this.url = url;
-    }
-
-    public LicenseInfo() {
-
-    }
-
-    public boolean isApproved() {
-        return approved;
-    }
-
-    public void setApproved(boolean approved) {
-        this.approved = approved;
-    }
-
-    public String getComments() {
-        return comments;
-    }
-
-    public void setComments(String comments) {
-        this.comments = comments;
-    }
-
-    public String getRegexp() {
-        return regexp;
-    }
-
-    public void setRegexp(String regexp) {
-        this.regexp = regexp;
-    }
-
-    public String getLongName() {
-        return longName;
-    }
-
-    public void setLongName(String longName) {
-        this.longName = longName;
-    }
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public boolean isValidLicense() {
-        return !isUnknown() && isFound();
-    }
-
-    public boolean matchesLicense(String otherLicense) {
-        //Blank - nothing to match
-        if (StringUtils.isBlank(otherLicense)) {
-            return false;
-        }
-        //Try exact match first
-        if (otherLicense.equalsIgnoreCase(getName())) {
-            return true;
-        } else if (StringUtils.isNotBlank(regexp)) {
-            return Pattern.compile(regexp, Pattern.CASE_INSENSITIVE).matcher(otherLicense).matches();
-        }
-        return false;
-    }
-
-    /**
-     * No license info available
-     */
-    public static LicenseInfo createNotFound() {
-        return new LicenseInfo(NOT_FOUND, "", "");
-    }
-
-    /**
-     * Internal use, signifies license was not searched for by any LicenseLocatorStrategy
-     */
-    public static LicenseInfo createNotSearched() {
-        return new LicenseInfo(NOT_SEARCHED, "", "");
-    }
-
-    public boolean isNotFound() {
-        return name.equals(NOT_FOUND);
-    }
-
-    /**
-     * NOTE: this is not the opposite of notFound - in order to be found a license's name must both be not equal to
-     * NOT_FOUND AND NOT_SEARCHED (so this is a found license that was extracted)
-     */
-    public boolean isFound() {
-        return !isNotFound() && !isNotSearched();
-    }
-
-    /**
-     * License info exists, but wasn't matched to any existing license
-     */
-    public static LicenseInfo createUnknown(String name, String url) {
-        return new LicenseInfo(UNKNOWN, name, url);
-    }
-
-    /**
-     * Unknown license that no valid name was found for.
-     * Mostly used for backwards compatibility with older versions that only saved 'unknown' as the name.
-     */
-    public static LicenseInfo createEmptyUnknown() {
-        return new LicenseInfo(NOT_SEARCHED, "", "");
-    }
-
-    public boolean isUnknown() {
-        return name.equals(UNKNOWN);
-    }
-
-    public boolean isNotSearched() {
-        return name.equals(NOT_SEARCHED);
-    }
-
-    public static boolean isUnknownLicenseName(String licenseName) {
-        return licenseName.equalsIgnoreCase(UNKNOWN);
-    }
-
-    public static boolean isNotFoundLicenseName(String licenseName) {
-        return licenseName.equalsIgnoreCase(NOT_FOUND);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        LicenseInfo that = (LicenseInfo) o;
-
-        if(this.isNotFound() && that.isNotFound()) {
-            return true;
-        } else if (this.isNotSearched() && that.isNotSearched()) {
-            return true;
-        } else if (this.isUnknown() && that.isUnknown()) {
-            return longName != null ? longName.equals(that.longName) : that.longName != null;
-        } else {
-            return name != null ? name.equals(that.name) : that.name != null;
-        }
-    }
-
-    @Override
-    public int hashCode() {
-        int result = name.hashCode();
-        result = (longName != null ? (31 * result + longName.hashCode()) : result);
-        return result;
-    }
-
-    @Override
-    public String toString() {
-        return "LicenseInfo" + "{name='" + name + '\'' + ", longName='" + longName + '\'' + ", url='" + url + '\'' + '}';
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/license/LicensesInfo.java b/base/api/src/main/java/org/artifactory/api/license/LicensesInfo.java
deleted file mode 100644
index 5bbac94..0000000
--- a/base/api/src/main/java/org/artifactory/api/license/LicensesInfo.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright 2012 JFrog Ltd. All rights reserved.
- * JFROG PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
- */
-
-package org.artifactory.api.license;
-
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * A container licenses class, contains a list of {@link LicenseInfo} each of which represent a license.
- *
- * @author Tomer Cohen
- */
- at XStreamAlias(LicensesInfo.ROOT)
-public class LicensesInfo implements Serializable {
-    public static final String ROOT = "licenses";
-
-    private List<LicenseInfo> licenses;
-
-    public List<LicenseInfo> getLicenses() {
-        return licenses;
-    }
-
-    public void setLicenses(List<LicenseInfo> licenses) {
-        this.licenses = licenses;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/license/ModuleLicenseModel.java b/base/api/src/main/java/org/artifactory/api/license/ModuleLicenseModel.java
deleted file mode 100644
index 1c02abc..0000000
--- a/base/api/src/main/java/org/artifactory/api/license/ModuleLicenseModel.java
+++ /dev/null
@@ -1,333 +0,0 @@
-package org.artifactory.api.license;
-
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.repo.RepoPath;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-import org.jfrog.build.api.Dependency;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-import static org.artifactory.api.license.LicenseInfo.*;
-
-/**
- * @author Chen Keinan
- */
- at JsonIgnoreProperties({"repoPath", "neutral"})
-public class ModuleLicenseModel {
-
-    private String id;
-    private String md5;
-    private String sha1;
-    private LicenseInfo license = createNotFound();              //License set as prop
-    private LicenseInfo extractedLicense = createNotSearched();  //Licenses from archive / descriptor
-    private Set<String> scopes = Sets.newHashSet();
-    private String scopeNames = "";
-    private boolean selected;
-    private boolean overridable = false;
-
-
-    private boolean hasConflicts = false;
-    private boolean notFound = false;
-    private boolean neutral = false;
-    private RepoPath repoPath;
-    private String repoKey;
-    private String path;
-    private String displayName;
-    List<String> actions = new ArrayList<>();
-
-    public ModuleLicenseModel() {
-    }
-
-    public ModuleLicenseModel(RepoPath repoPath) {
-        this.repoPath = repoPath;
-        if (repoPath != null) {
-            addActions(repoPath);
-        } else {
-            repoKey = "";
-            path = "No path found (externally resolved or deleted/overwritten)";
-        }
-        actions.add("EditLicense");
-    }
-
-    /**
-     * add actions to artifact
-     *
-     * @param repoPath - artifact repo path
-     */
-    private void addActions(RepoPath repoPath) {
-        AuthorizationService authService = ContextHelper.get().getAuthorizationService();
-        this.repoKey = repoPath.getRepoKey();
-        this.path = repoPath.getPath();
-        actions.add("ChangeLicense");
-        if (authService.canRead(repoPath)) {
-            actions.add("ShowInTree");
-            actions.add("Download");
-        }
-    }
-
-    public ModuleLicenseModel(LicenseInfo license, String id, RepoPath repoPath) {
-        this.repoPath = repoPath;
-        this.license = license;
-        this.id = id;
-    }
-
-    /**
-     * create not found model
-     * @param path - artifact path
-     * @return - license module
-     */
-    public static ModuleLicenseModel createNotFoundModel(RepoPath path) {
-        ModuleLicenseModel model = new ModuleLicenseModel(path);
-        model.extractedLicense = LicenseInfo.createNotFound();
-        model.setModelProperties(false);
-        return model;
-    }
-
-    public void populateFields(Dependency dependency) {
-        this.md5 = dependency.getMd5();
-        this.sha1 = dependency.getSha1();
-        if (StringUtils.isNotBlank(dependency.getId())) {
-            this.id = dependency.getId();
-        }
-        if ((dependency.getScopes() == null || dependency.getScopes().isEmpty()) || dependency.getScopes().contains(null)) {
-            this.scopes.add(BuildService.UNSPECIFIED_SCOPE);
-        } else {
-            setScopes(dependency.getScopes());
-        }
-    }
-
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public String getMd5() {
-        return md5;
-    }
-
-    public void setMd5(String md5) {
-        this.md5 = md5;
-    }
-
-    public String getSha1() {
-        return sha1;
-    }
-
-    public void setSha1(String sha1) {
-        this.sha1 = sha1;
-    }
-
-    public Set<String> getScopes() {
-        return scopes;
-    }
-
-    public void setScopes(Set<String> scopes) {
-        this.scopes = scopes;
-        ScopeForView(scopes);
-    }
-
-    /**
-     * return scope in view table format
-     * @param scopes
-     */
-    private void ScopeForView(Set<String> scopes) {
-        if (scopes != null && !scopes.isEmpty()) {
-            StringBuilder scopesBuilder = new StringBuilder();
-            scopes.forEach(scope -> scopesBuilder.append(scope + " , "));
-            String scopeString = scopesBuilder.toString();
-            if (scopeString.length() > 0) {
-                scopeNames = scopeString.substring(0, scopesBuilder.toString().length() - 3);
-            }
-        }
-    }
-
-    public String getScopeNames() {
-        return scopeNames;
-    }
-
-    public LicenseInfo getLicense() {
-        return license;
-    }
-
-    public void setLicense(LicenseInfo license) {
-        this.license = license;
-    }
-
-    public LicenseInfo getExtractedLicense() {
-        return extractedLicense;
-    }
-
-    public void setExtractedLicense(LicenseInfo extractedLicense) {
-        this.extractedLicense = extractedLicense;
-    }
-
-    public boolean isSelected() {
-        return selected;
-    }
-
-    public void setSelected(boolean selected) {
-        this.selected = selected;
-    }
-
-    public boolean isOverridable() {
-        return overridable;
-    }
-
-    public void setOverridable(boolean overridable) {
-        this.overridable = overridable;
-    }
-
-    public boolean hasConflicts() {
-        return hasConflicts;
-    }
-
-    public boolean isNotFound() {
-        return notFound;
-    }
-
-    public boolean isNeutral() {
-        return neutral;
-    }
-
-    public void setNeutral(boolean isNeutral) {
-        this.neutral = isNeutral;
-    }
-
-    /**
-     * This method should be called after populating all licenses (property based and extracted), it will mark
-     * conflict, not found, and overridable status properties
-     */
-    public void setModelProperties(boolean canAnnotate) {
-        //Null proof just in case
-        if (license == null) {
-            license = LicenseInfo.createNotFound();
-        }
-        if (extractedLicense == null) {
-            extractedLicense = LicenseInfo.createNotSearched();
-        }
-        //Both licenses not found (or extracted was not searched) - mark model as not found
-        if ((license.isNotFound() && extractedLicense.isNotFound())
-                || (license.isNotFound() && extractedLicense.isNotSearched())) {
-            hasConflicts = true;
-            notFound = true;
-            actions.remove("EditLicense");
-        } else {
-            overridable = hasMismatchingOverridableLicenses() && canAnnotate;
-            //No property-based license info
-            hasConflicts = license.isNotFound()
-                    //Conflicting licenses - mismatch between extracted(if it was searched) and property-based
-                    || hasMismatchingLicenses()
-                    //property-based license found and unapproved
-                    || (license.isFound() && !license.isApproved())
-                    //Property-based license is unknown
-                    || license.isUnknown();
-        }
-    }
-
-    /**
-     * true if property-based and extracted licenses are inconsistent, in case the extracted license was searched for
-     */
-    private boolean hasMismatchingLicenses() {
-        return !extractedLicense.isNotSearched() && !license.equals(extractedLicense);
-    }
-
-    /**
-     * true if model has an extracted license that can override(i.e. has 'meaningful' data) the property-based one
-     * when running in auto mode (i.e property license if not found or empty unknown)
-     */
-    public boolean hasMismatchingAutoOverridableLicenses() {
-        return extractedLicense.isFound() && (license.isNotFound()
-                || (license.equals(createEmptyUnknown()) && !extractedLicense.equals(createEmptyUnknown())));
-    }
-
-    /**
-     * true if the model has mismatching licenses and the extracted license is valid - doesn't allow overriding any
-     * property-based license with an unknown license.
-     * Use only with UI, the auto run (CI) has another variant of overridable model decision.
-     */
-    private boolean hasMismatchingOverridableLicenses() {
-        return hasMismatchingLicenses() && extractedLicense.isValidLicense();
-    }
-
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        ModuleLicenseModel that = (ModuleLicenseModel) o;
-
-        if (!getId().equals(that.getId())) {
-            return false;
-        } else if (!license.equals(that.license)) {
-            return false;
-        } else if (!extractedLicense.equals(that.extractedLicense)) {
-            return false;
-        } else if ((getRepoPath() != null) && !getRepoPath().equals(that.getRepoPath())) {
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result;
-        result = 31 * getId().hashCode();
-        result = 31 * result + license.hashCode();
-        result = 31 * result + extractedLicense.hashCode();
-        if (getRepoPath() != null) {
-            result = 31 * result + getRepoPath().hashCode();
-        }
-        return result;
-    }
-
-    public String getDisplayName() {
-        return getId();
-    }
-
-    public RepoPath getRepoPath() {
-        return repoPath;
-    }
-
-    public void setRepoPath(RepoPath repoPath) {
-        this.repoPath = repoPath;
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    public List<String> getActions() {
-        return actions;
-    }
-
-    public void setActions(List<String> actions) {
-        this.actions = actions;
-    }
-
-}
diff --git a/base/api/src/main/java/org/artifactory/api/mail/MailServerConfiguration.java b/base/api/src/main/java/org/artifactory/api/mail/MailServerConfiguration.java
deleted file mode 100644
index 6adeb47..0000000
--- a/base/api/src/main/java/org/artifactory/api/mail/MailServerConfiguration.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.mail;
-
-/**
- * Contains the different parameters of the mail server configuration
- *
- * @author Noam Tenne
- */
-public class MailServerConfiguration {
-
-    private boolean enabled;
-    private String host;
-    private int port;
-    private String username;
-    private String password;
-    private String from;
-    private String subjectPrefix;
-    private String artifactoryUrl;
-    private boolean useTls;
-    private boolean useSsl;
-
-    public MailServerConfiguration(boolean enabled, String host, int port, String username, String password,
-            String from, String subjectPrefix, boolean useTls, boolean useSsl, String artifactoryUrl) {
-        this.enabled = enabled;
-        this.host = host;
-        this.port = port;
-        this.username = username;
-        this.password = password;
-        this.from = from;
-        this.subjectPrefix = subjectPrefix;
-        this.useTls = useTls;
-        this.useSsl = useSsl;
-        this.artifactoryUrl = artifactoryUrl;
-    }
-
-    public boolean isEnabled() {
-        return enabled;
-    }
-
-    public String getHost() {
-        return host;
-    }
-
-    public int getPort() {
-        return port;
-    }
-
-    public String getUsername() {
-        return username;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public String getFrom() {
-        return from;
-    }
-
-    public String getSubjectPrefix() {
-        return subjectPrefix;
-    }
-
-    public boolean isUseTls() {
-        return useTls;
-    }
-
-    public boolean isUseSsl() {
-        return useSsl;
-    }
-
-    public String getArtifactoryUrl() {
-        return artifactoryUrl;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/mail/MailService.java b/base/api/src/main/java/org/artifactory/api/mail/MailService.java
deleted file mode 100644
index c36595d..0000000
--- a/base/api/src/main/java/org/artifactory/api/mail/MailService.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.mail;
-
-import org.artifactory.util.EmailException;
-
-import javax.mail.Message;
-
-/**
- * The mail service's main interface
- *
- * @author Noam Tenne
- */
-public interface MailService {
-    void sendMail(String[] recipients, String subject, String body) throws EmailException;
-
-    void sendMail(String[] recipients, String subject, String body, MailServerConfiguration config)
-            throws EmailException;
-
-    /**
-     * Send an e-mail message
-     *
-     * @param recipients Recipients of the message that will be sent
-     * @param subject    The subject of the message
-     * @param body       The body of the message
-     * @param config     A mail server configuration to use
-     * @param recipientType {@link Message.RecipientType}
-     *
-     * @throws EmailException
-     */
-    void sendMail(String[] recipients, String subject, String body, MailServerConfiguration config,
-            Message.RecipientType recipientType) throws EmailException;
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/maven/MavenArtifactInfo.java b/base/api/src/main/java/org/artifactory/api/maven/MavenArtifactInfo.java
deleted file mode 100644
index 84e9600..0000000
--- a/base/api/src/main/java/org/artifactory/api/maven/MavenArtifactInfo.java
+++ /dev/null
@@ -1,346 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.maven;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.artifact.UnitInfo;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.util.PathUtils;
-import org.codehaus.jackson.annotate.JsonTypeName;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nullable;
-import java.util.LinkedList;
-import java.util.Set;
-import java.util.StringTokenizer;
-
-/**
- * Artifact info for Maven artifacts. Holds the groupId, artifactId, version, classifier and type of the Maven artifact
- * to be deployed, if a certain attribute cannot be found it will be marked as NA. You must have at least groupId,
- * artifactId and version for a valid Maven artifact.
- *
- * @author Tomer Cohen
- */
- at JsonTypeName("maven")
-public class MavenArtifactInfo implements UnitInfo {
-    private static final Logger log = LoggerFactory.getLogger(MavenArtifactInfo.class);
-    public static final String ROOT = "artifactory-maven-artifact";
-    public static final String POM = "pom";
-    public static final String JAR = "jar";
-    public static final String XML = "xml";
-    private String artifactType = "maven";
-    private String artifactId;
-    private String groupId;
-    private String version;
-    private String classifier;
-    private String type;
-
-    public String getArtifactType() {
-        return artifactType;
-    }
-
-    public void setArtifactType(String artifactType) {
-        this.artifactType = artifactType;
-    }
-
-    public MavenArtifactInfo(String groupId, String artifactId, String version) {
-        this(groupId, artifactId, version, NA, NA);
-    }
-
-    public MavenArtifactInfo(MavenArtifactInfo copy) {
-        this(copy.groupId, copy.artifactId, copy.version, copy.classifier, copy.type);
-    }
-
-    public MavenArtifactInfo() {
-        this(NA, NA, NA, NA, JAR);
-    }
-
-    public MavenArtifactInfo(String groupId, String artifactId, String version, String classifier, String type) {
-        if (groupId == null || artifactId == null) {
-            throw new IllegalArgumentException("Cannot create a maven unit with null groupId or ArtifactId");
-        }
-        this.groupId = groupId;
-        this.artifactId = artifactId;
-        if (PathUtils.hasText(version)) {
-            this.version = version;
-        } else {
-            this.version = NA;
-        }
-        if (PathUtils.hasText(classifier)) {
-            this.classifier = classifier;
-        } else {
-            this.classifier = NA;
-        }
-        if (PathUtils.hasText(type)) {
-            this.type = type;
-        } else {
-            this.type = JAR;
-        }
-    }
-
-    public String getGroupId() {
-        return groupId;
-    }
-
-    public String getArtifactId() {
-        return artifactId;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setGroupId(String groupId) {
-        this.groupId = groupId;
-    }
-
-    public void setArtifactId(String artifactId) {
-        this.artifactId = artifactId;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public boolean hasGroupId() {
-        return StringUtils.isNotBlank(groupId) && !NA.equals(groupId);
-    }
-
-    public boolean hasArtifactId() {
-        return StringUtils.isNotBlank(artifactId) && !NA.equals(artifactId);
-    }
-
-    public boolean hasVersion() {
-        return StringUtils.isNotBlank(version) && !NA.equals(version);
-    }
-
-    @Override
-    public boolean isMavenArtifact() {
-        return true;
-    }
-
-    public String getClassifier() {
-        if (!hasClassifier()) {
-            return null;
-        }
-        return classifier;
-    }
-
-    public void setClassifier(String classifier) {
-        this.classifier = classifier;
-    }
-
-    public boolean hasClassifier() {
-        return classifier != null && !NA.equals(classifier);
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    @Override
-    public boolean isValid() {
-        return hasGroupId() && hasArtifactId() && hasVersion();
-    }
-
-    @Override
-    public void setPath(String path) {
-    }
-
-    @Override
-    public String getPath() {
-        return buildMavenPath();
-    }
-
-    @Override
-    public String toString() {
-        return getGroupId() + ":" + getArtifactId() + ":" + getVersion() +
-                (classifier != null ? (":" + classifier) : "") + ":" + type;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        if (!super.equals(o)) {
-            return false;
-        }
-
-        MavenArtifactInfo that = (MavenArtifactInfo) o;
-
-        return artifactId.equals(that.artifactId) && classifier.equals(that.classifier) &&
-                groupId.equals(that.groupId) && type.equals(that.type) &&
-                version.equals(that.version);
-    }
-
-    @Override
-    public int hashCode() {
-        int result = super.hashCode();
-        result = 31 * result + groupId.hashCode();
-        result = 31 * result + artifactId.hashCode();
-        result = 31 * result + version.hashCode();
-        result = 31 * result + classifier.hashCode();
-        result = 31 * result + type.hashCode();
-        return result;
-    }
-
-    public static MavenArtifactInfo fromRepoPath(RepoPath repoPath) {
-        String groupId, artifactId, version, type = MavenArtifactInfo.NA, classifier = MavenArtifactInfo.NA;
-
-        String path = repoPath.getPath();
-        String fileName = repoPath.getName();
-
-        //The format of the relative path in maven is a/b/c/artifactId/baseVer/fileName where
-        //groupId="a.b.c". We split the path to elements and analyze the needed fields.
-        LinkedList<String> pathElements = new LinkedList<>();
-        StringTokenizer tokenizer = new StringTokenizer(path, "/");
-        while (tokenizer.hasMoreTokens()) {
-            pathElements.add(tokenizer.nextToken());
-        }
-        //Sanity check, we need groupId, artifactId and version
-        if (pathElements.size() < 3) {
-            log.debug("Cannot build MavenArtifactInfo from '{}'. The groupId, artifactId and version are unreadable.",
-                    repoPath);
-            return new MavenArtifactInfo();
-        }
-
-        //Extract the version, artifactId and groupId
-        int pos = pathElements.size() - 2;  // one before the last path element
-        version = pathElements.get(pos--);
-        artifactId = pathElements.get(pos--);
-        StringBuilder groupIdBuff = new StringBuilder();
-        for (; pos >= 0; pos--) {
-            if (groupIdBuff.length() != 0) {
-                groupIdBuff.insert(0, '.');
-            }
-            groupIdBuff.insert(0, pathElements.get(pos));
-        }
-        groupId = groupIdBuff.toString();
-        //Extract the type and classifier except for metadata files
-        boolean metaData = NamingUtils.isMetadata(fileName);
-        if (!metaData) {
-            if (MavenNaming.isUniqueSnapshotFileName(fileName)) {
-                version = StringUtils.remove(version, "-" + MavenNaming.SNAPSHOT);
-                version = version + "-" + MavenNaming.getUniqueSnapshotVersionTimestampAndBuildNumber(fileName);
-            }
-
-            type = StringUtils.substring(fileName, artifactId.length() + version.length() + 2);
-            int versionStartIndex = StringUtils.indexOf(fileName, "-", artifactId.length()) + 1;
-            int classifierStartIndex = StringUtils.indexOf(fileName, "-", versionStartIndex + version.length());
-            if (classifierStartIndex >= 0) {
-                Set<String> customMavenTypes = getMavenCustomTypes();
-                for (String customMavenType : customMavenTypes) {
-                    if (StringUtils.endsWith(fileName, customMavenType)) {
-                        classifier = StringUtils.remove(type, "." + customMavenType);
-                        type = customMavenType;
-                        break;
-                    }
-                }
-
-                if (MavenArtifactInfo.NA.equals(classifier)) {
-                    int typeDotStartIndex = StringUtils.lastIndexOf(type, ".");
-                    classifier = StringUtils.substring(type, 0, typeDotStartIndex);
-                    type = StringUtils.substring(type, classifier.length() + 1);
-                }
-            }
-        }
-        return new MavenArtifactInfo(groupId, artifactId, version, classifier, type);
-    }
-
-    private static Set<String> getMavenCustomTypes() {
-        String mvnCustomTypes = ConstantValues.mvnCustomTypes.getString();
-        return Sets.newHashSet(
-                Iterables.transform(Sets.newHashSet(StringUtils.split(mvnCustomTypes, ",")),
-                        new Function<String, String>() {
-                            @Override
-                            public String apply(@Nullable String input) {
-                                return StringUtils.isBlank(input) ? input : StringUtils.trim(input);
-                            }
-                        }
-                )
-        );
-    }
-
-    /**
-     * Returns the maven artifact "id" in a "prettier" format.<br>
-     * {@link #toString()} will not omit fields like the classifier and type when
-     * they are not specified. This results in ugly artifact IDs.<br>
-     * This implementation will simply omit fields which are not specified.
-     *
-     * @return Summarized artifact info
-     */
-    public String getPrettyArtifactId() {
-        StringBuilder artifactIdBuilder = new StringBuilder(getGroupId()).append(":").
-                append(getArtifactId()).append(":").
-                append(getVersion());
-
-        String classifier = getClassifier();
-        if (StringUtils.isNotBlank(classifier) && !MavenArtifactInfo.NA.equals(classifier)) {
-            artifactIdBuilder.append(":").append(classifier);
-        }
-
-        String type = getType();
-        if (StringUtils.isNotBlank(type) && !MavenArtifactInfo.NA.equals(classifier)) {
-            artifactIdBuilder.append(":").append(type);
-        }
-        return artifactIdBuilder.toString();
-    }
-
-    /**
-     * Builds a maven path according to the artifact's GAVC.
-     *
-     * @return The maven path according the artifact's GAVC.
-     */
-    private String buildMavenPath() {
-        StringBuilder path = new StringBuilder();
-        if (isValid()) {
-            addBasePath(path);
-            path.append("/").append(getArtifactId()).append("-").append(getVersion());
-            if (hasClassifier()) {
-                path.append("-").append(classifier);
-            }
-            path.append(".").append(type);
-        }
-        return path.toString();
-    }
-
-    private void addBasePath(StringBuilder path) {
-        if (isValid()) {
-            path.append(groupId.replace('.', '/')).append("/").append(artifactId);
-            if (hasVersion()) {
-                path.append("/").append(version);
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/maven/MavenMetadataService.java b/base/api/src/main/java/org/artifactory/api/maven/MavenMetadataService.java
deleted file mode 100644
index 8449daa..0000000
--- a/base/api/src/main/java/org/artifactory/api/maven/MavenMetadataService.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.api.maven;
-
-import org.artifactory.api.repo.Async;
-import org.artifactory.repo.RepoPath;
-
-/**
- * A service for calculating maven metadata.
- *
- * @author Yossi Shaul
- */
-public interface MavenMetadataService {
-
-    /**
-     * Calculate maven metadata on the giver repo path asynchronously.
-     *
-     * @param baseFolderPath A path to a folder to start calculating metadata from. Must be a local non-cache repository
-     *                       path.
-     * @param recursive      True is should calculate recursively from the base folder path
-     */
-    @Async(delayUntilAfterCommit = true)
-    void calculateMavenMetadataAsync(RepoPath baseFolderPath, boolean recursive);
-
-    /**
-     * Calculates the maven metadata recursively on all the folders under the input folder.
-     * This will also trigger asynchronous maven metadata calculation for maven plugins.
-     *
-     * @param baseFolderPath Base repo path to start calculating from
-     * @param recursive      True is should calculate recursively from the base folder path
-     */
-    void calculateMavenMetadata(RepoPath baseFolderPath, boolean recursive);
-
-    /**
-     * Calculate the maven plugins metadata asynchronously after the current transaction is committed. The reason is the
-     * metadata calculator uses xpath queries for its job and since the move is not committed yet, the xpath query
-     * result might not be accurate (for example when moving plugins from one repo to another the query on the source
-     * repository will return the moved plugins while the target repo will not return them). <p/> Note: you should call
-     * the markBaseForMavenMetadataRecalculation() before calling this method to recover in case this task is
-     * interrupted in the middle.
-     *
-     * @param localRepoKey Key of the local non-cache repository to calculate maven plugins metadata on.
-     */
-    @Async(delayUntilAfterCommit = true)
-    void calculateMavenPluginsMetadataAsync(String localRepoKey);
-
-}
diff --git a/base/api/src/main/java/org/artifactory/api/maven/MavenService.java b/base/api/src/main/java/org/artifactory/api/maven/MavenService.java
deleted file mode 100644
index 49d656f..0000000
--- a/base/api/src/main/java/org/artifactory/api/maven/MavenService.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.maven;
-
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.repo.exception.maven.BadPomException;
-
-import java.io.File;
-import java.io.IOException;
-
-/**
- * Provides different maven related service methods
- *
- * @author Noam Tenne
- */
-public interface MavenService {
-
-    /**
-     * Generate maven settings data from a MavenSettings object
-     *
-     * @param mavenSettings Data to generate settings from
-     * @return String - Maven settings that can be put directly into the settings.xml file
-     */
-    String generateSettings(MavenSettings mavenSettings) throws IOException;
-
-    /**
-     * Validates pom content before deployment
-     *
-     * @param pomContent                   POM content to validate
-     * @param relPath                      Relative deployment path of the pom
-     * @param moduleInfo                   POM module info
-     * @param suppressPomConsistencyChecks If true will not throw an exception is pom consistency fails (eg, groupId
-     *                                     doesn't match target relative path)
-     * @throws IOException If POM is invalid
-     */
-    void validatePomContent(String pomContent, String relPath, ModuleInfo moduleInfo,
-            boolean suppressPomConsistencyChecks) throws IOException;
-
-    /**
-     * Validates pom file's content before deployment
-     *
-     * @param pomFile                      POM file to validate
-     * @param relPath                      Relative deployment path of the pom
-     * @param moduleInfo                   POM module info
-     * @param suppressPomConsistencyChecks If true will not throw an exception is pom consistency fails (eg, groupId
-     *                                     doesn't match target relative path)
-     * @throws BadPomException If POM is invalid
-     */
-    void validatePomFile(File pomFile, String relPath, ModuleInfo moduleInfo,
-            boolean suppressPomConsistencyChecks) throws BadPomException;
-
-    /**
-     * Get the artifact model from a jar or pom file
-     *
-     * @param uploadedFile .jar or .pom file
-     * @return null if no pom found
-     * @throws java.io.IOException if uploaded file is unreadable
-     */
-    MavenArtifactInfo getMavenArtifactInfo(File uploadedFile);
-
-    /**
-     * Get the POM model that represents a file. If the file is a POM file then we simply return it. If it is a jar with
-     * a POM then we check that we return its contents. Otherwise we generate a default POM according to the file's
-     * GAVC.
-     *
-     * @param file The file to analyze.
-     * @return The file's POM in string representation.
-     */
-    String getPomModelString(File file);
-}
diff --git a/base/api/src/main/java/org/artifactory/api/maven/MavenSetting.java b/base/api/src/main/java/org/artifactory/api/maven/MavenSetting.java
deleted file mode 100644
index b455324..0000000
--- a/base/api/src/main/java/org/artifactory/api/maven/MavenSetting.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.maven;
-
-/**
- * Main interface of maven settings unit
- *
- * @author Noam Tenne
- */
-public interface MavenSetting {
-
-    /**
-     * Returns the repository ID
-     *
-     * @return String - Repository ID
-     */
-    String getId();
-
-    /**
-     * Checks if setting data valid. Throws IllegalArgumentException if data is invalid
-     */
-    void isValid();
-}
diff --git a/base/api/src/main/java/org/artifactory/api/maven/MavenSettingUnit.java b/base/api/src/main/java/org/artifactory/api/maven/MavenSettingUnit.java
deleted file mode 100644
index b8e4e0e..0000000
--- a/base/api/src/main/java/org/artifactory/api/maven/MavenSettingUnit.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.maven;
-
-import org.apache.commons.lang.StringUtils;
-
-/**
- * Base implementation of the maven setting
- *
- * @author Noam Tenne
- */
-public abstract class MavenSettingUnit implements MavenSetting {
-    protected String id;
-    protected String name;
-
-    /**
-     * Default constructor
-     *
-     * @param id   Repository ID
-     * @param name Repository name
-     */
-    public MavenSettingUnit(String id, String name) {
-        this.id = id;
-        this.name = name;
-        isDataValid();
-    }
-
-    @Override
-    public String getId() {
-        return id;
-    }
-
-    /**
-     * Returns the repository name
-     *
-     * @return String - Repository name
-     */
-    public String getName() {
-        return name;
-    }
-
-    private void isDataValid() {
-        if ((StringUtils.isEmpty(id)) || (StringUtils.isEmpty(name))) {
-            throw new IllegalArgumentException("Setting data is not valid");
-        }
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/maven/MavenSettings.java b/base/api/src/main/java/org/artifactory/api/maven/MavenSettings.java
deleted file mode 100644
index 7c92930..0000000
--- a/base/api/src/main/java/org/artifactory/api/maven/MavenSettings.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.maven;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Contains different maven settings data. Used mainly by the maven settings generator
- *
- * @author Noam Tenne
- */
-public class MavenSettings {
-    private String url;
-    private List<MavenSettingsRepository> releaseRepositories;
-    private List<MavenSettingsRepository> pluginRepositories;
-    private List<MavenSettingsMirror> mirrorRepositories;
-    private List<MavenSettingsServer> servers;
-
-    /**
-     * Default constructor
-     *
-     * @param url Context URL
-     */
-    public MavenSettings(String url) {
-        this(url, new ArrayList<MavenSettingsRepository>(), new ArrayList<MavenSettingsRepository>(),
-                new ArrayList<MavenSettingsMirror>(), new ArrayList<MavenSettingsServer>());
-    }
-
-    /**
-     * Secondary constructor
-     *
-     * @param url                Context URL
-     * @param repositories       Release repository list
-     * @param pluginRepositories Plugin repository list
-     * @param mirrorRepositories Mirror repository list
-     * @param servers            Server list
-     */
-    public MavenSettings(String url, List<MavenSettingsRepository> repositories,
-            List<MavenSettingsRepository> pluginRepositories, List<MavenSettingsMirror> mirrorRepositories,
-            List<MavenSettingsServer> servers) {
-        //Make sure URL ends with slash
-        if (!url.endsWith("/")) {
-            url += "/";
-        }
-        this.url = url;
-        this.releaseRepositories = repositories;
-        this.pluginRepositories = pluginRepositories;
-        this.mirrorRepositories = mirrorRepositories;
-        this.servers = servers;
-    }
-
-    /**
-     * Returns the context URL of Artifactory
-     *
-     * @return String - Context URL
-     */
-    public String getUrl() {
-        return url;
-    }
-
-    /**
-     * Returns the list of release repositories
-     *
-     * @return List<MavenSettingsRepository> - Release repositories
-     */
-    public List<MavenSettingsRepository> getReleaseRepositories() {
-        return releaseRepositories;
-    }
-
-    /**
-     * Returns the list of plugin repositories
-     *
-     * @return List<MavenSettingsRepository> - Plugin repositories
-     */
-    public List<MavenSettingsRepository> getPluginRepositories() {
-        return pluginRepositories;
-    }
-
-    /**
-     * Returns the list of mirror repositories
-     *
-     * @return List<MavenSettingsMirror> - Mirror repositories
-     */
-    public List<MavenSettingsMirror> getMirrorRepositories() {
-        return mirrorRepositories;
-    }
-
-    /**
-     * Returns the list of servers
-     *
-     * @return List<MavenSettingsServer> - Servers
-     */
-    public List<MavenSettingsServer> getServers() {
-        return servers;
-    }
-
-    /**
-     * Adds a repository to the release repository list
-     *
-     * @param mavenSettingsRepository Release repository
-     */
-    public void addReleaseRepository(MavenSettingsRepository mavenSettingsRepository) {
-        releaseRepositories.add(mavenSettingsRepository);
-    }
-
-    /**
-     * Adds a repository to the plugin repository list
-     *
-     * @param mavenSettingsRepository Plugin repository
-     */
-    public void addPluginRepository(MavenSettingsRepository mavenSettingsRepository) {
-        pluginRepositories.add(mavenSettingsRepository);
-    }
-
-    /**
-     * Adds a repository to the mirror repository list
-     *
-     * @param mavenSettingsMirror Mirror repository
-     */
-    public void addMirrorRepository(MavenSettingsMirror mavenSettingsMirror) {
-        mirrorRepositories.add(mavenSettingsMirror);
-    }
-
-    /**
-     * Adds a server to the server list
-     *
-     * @param mavenSettingsServer Server
-     */
-    public void addServer(MavenSettingsServer mavenSettingsServer) {
-        servers.add(mavenSettingsServer);
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/maven/MavenSettingsMirror.java b/base/api/src/main/java/org/artifactory/api/maven/MavenSettingsMirror.java
deleted file mode 100644
index 6b2a36a..0000000
--- a/base/api/src/main/java/org/artifactory/api/maven/MavenSettingsMirror.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.maven;
-
-import org.apache.commons.lang.StringUtils;
-
-/**
- * Contains information of a maven settings mirror
- *
- * @author Noam Tenne
- */
-public class MavenSettingsMirror extends MavenSettingUnit {
-    private String mirrorOf;
-
-    /**
-     * Default constructor
-     *
-     * @param id       Repository ID
-     * @param name     Repository name
-     * @param mirrorOf mirrorOf expression
-     */
-    public MavenSettingsMirror(String id, String name, String mirrorOf) {
-        super(id, name);
-        this.mirrorOf = mirrorOf;
-        isValid();
-    }
-
-    /**
-     * Returns the mirrorOf expression
-     *
-     * @return String - mirrorOf expression
-     */
-    public String getMirrorOf() {
-        return mirrorOf;
-    }
-
-    @Override
-    public void isValid() {
-        if (StringUtils.isEmpty(mirrorOf)) {
-            throw new IllegalArgumentException("Setting data is not valid");
-        }
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/maven/MavenSettingsRepository.java b/base/api/src/main/java/org/artifactory/api/maven/MavenSettingsRepository.java
deleted file mode 100644
index f95d196..0000000
--- a/base/api/src/main/java/org/artifactory/api/maven/MavenSettingsRepository.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.maven;
-
-/**
- * Contains information of a maven settings repository
- *
- * @author Noam Tenne
- */
-public class MavenSettingsRepository extends MavenSettingUnit {
-    private boolean handlesSnapshots;
-
-    /**
-     * Default constructor
-     *
-     * @param id               Repository ID
-     * @param name             Repository name
-     * @param handlesSnapshots Handles snapshots
-     */
-    public MavenSettingsRepository(String id, String name, boolean handlesSnapshots) {
-        super(id, name);
-        this.handlesSnapshots = handlesSnapshots;
-        isValid();
-    }
-
-
-    /**
-     * Does the repository handle snapshots
-     *
-     * @return boolean - Handles snapshots
-     */
-    public boolean isHandlesSnapshots() {
-        return handlesSnapshots;
-    }
-
-    @Override
-    public void isValid() {
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/maven/MavenSettingsServer.java b/base/api/src/main/java/org/artifactory/api/maven/MavenSettingsServer.java
deleted file mode 100644
index bbbf0eb..0000000
--- a/base/api/src/main/java/org/artifactory/api/maven/MavenSettingsServer.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.maven;
-
-import org.apache.commons.lang.StringUtils;
-
-/**
- * Contains information of a maven settings server
- *
- * @author Noam Y. Tenne
- */
-public class MavenSettingsServer implements MavenSetting {
-
-    private String id;
-    private String username;
-    private String password;
-
-    /**
-     * @param id       Server ID
-     * @param username Username for server access
-     * @param password Password for server access
-     */
-    public MavenSettingsServer(String id, String username, String password) {
-        this.id = id;
-        this.username = username;
-        this.password = password;
-    }
-
-    /**
-     * Returns the server ID
-     *
-     * @return Server ID
-     */
-    @Override
-    public String getId() {
-        return id;
-    }
-
-    /**
-     * Returns the server access username
-     *
-     * @return Server username
-     */
-    public String getUsername() {
-        return username;
-    }
-
-    /**
-     * Returns the server access password
-     *
-     * @return Server password
-     */
-    public String getPassword() {
-        return password;
-    }
-
-    @Override
-    public void isValid() {
-        if (StringUtils.isEmpty(id)) {
-            throw new IllegalArgumentException("Setting data is not valid");
-        }
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/message/ArtifactoryUpdatesService.java b/base/api/src/main/java/org/artifactory/api/message/ArtifactoryUpdatesService.java
deleted file mode 100644
index 4ed99ce..0000000
--- a/base/api/src/main/java/org/artifactory/api/message/ArtifactoryUpdatesService.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.message;
-
-import org.artifactory.api.repo.Async;
-
-/**
- * @author Yoav Aharoni
- */
-public interface ArtifactoryUpdatesService {
-
-    Message PROCESSING_MESSAGE = new Message("running", "");
-    Message ERROR_MESSAGE = new Message("na", "");
-
-    Message getMessage();
-
-    Message getCachedMessage();
-
-    @Async
-    void fetchMessage();
-}
diff --git a/base/api/src/main/java/org/artifactory/api/message/Message.java b/base/api/src/main/java/org/artifactory/api/message/Message.java
deleted file mode 100644
index d03c05a..0000000
--- a/base/api/src/main/java/org/artifactory/api/message/Message.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.message;
-
-import java.io.Serializable;
-
-/**
- * @author Yoav Aharoni
- */
-public class Message implements Serializable {
-    private final String id;
-    private final String body;
-
-    public Message(String id, String body) {
-        this.id = id;
-        this.body = body;
-    }
-
-    @Override
-    public String toString() {
-        return body;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        Message message = (Message) o;
-        return body.equals(message.body) && id.equals(message.id);
-    }
-
-    @Override
-    public int hashCode() {
-        int result = id.hashCode();
-        result = 31 * result + body.hashCode();
-        return result;
-    }
-
-    public String getBody() {
-        return body;
-    }
-
-    public String getId() {
-        return id;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/mime/MimeEntry.java b/base/api/src/main/java/org/artifactory/api/mime/MimeEntry.java
deleted file mode 100644
index 28d2d97..0000000
--- a/base/api/src/main/java/org/artifactory/api/mime/MimeEntry.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.mime;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * <p>A MIME type entry representing a MIME type as specified in <a href="http://tools.ietf.org/html/rfc2046">RFC
- * 2046</a> and an associated collection of file extensions.</p>
- *
- * @author Brennan Spies
- */
-public class MimeEntry {
-    private final String type, subType;
-    private final List<String> fileExts;
-
-    @SuppressWarnings("unchecked")
-    public MimeEntry(String mime, String... exts) {
-        //could use regex here to make sure only one '/'
-        //and exclude other invalid chars
-        if (mime.indexOf('/') == -1) {
-            throw new IllegalArgumentException("MIME type '" + mime
-                    + "' is not valid");
-        }
-        String[] parts = mime.split("/", 2);
-        this.type = parts[0].toLowerCase();
-        this.subType = parts[1].toLowerCase();
-        this.fileExts = Arrays.asList(exts);
-    }
-
-    /**
-     * Returns the type of the MIME as specified by "type/subtype".
-     *
-     * @return The type part of the MIME type
-     */
-    public String getType() {
-        return type;
-    }
-
-    /**
-     * Returns the "subtype" part of the MIME type.
-     *
-     * @return The subtype
-     */
-    public String getSubType() {
-        return subType;
-    }
-
-    /**
-     * Adds a file extension to the collection of file extensions associated with the MIME type.
-     *
-     * @param fileExt The file extension
-     */
-    public void addFileExt(String fileExt) {
-        fileExts.add(fileExt);
-    }
-
-    /**
-     * Returns the file extensions associated with this MIME type.
-     *
-     * @return The file extensions
-     */
-    public Collection<String> getFileExts() {
-        return fileExts;
-    }
-
-    /**
-     * Returns the MIME type.
-     *
-     * @return The MIME type
-     */
-    public String getMimeType() {
-        return type + "/" + subType;
-    }
-
-    /**
-     * Shows entry as "mime-type ext1 ext2 ...".
-     *
-     * @see java.lang.Object#toString()
-     */
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder(getMimeType()).append(' ');
-        for (String ext : fileExts) {
-            sb.append(' ').append(ext);
-        }
-        return sb.toString();
-    }
-
-    public String getDefaultExtension() {
-        if (fileExts != null && !fileExts.isEmpty()) {
-            return fileExts.get(0);
-        }
-        return null;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/module/ModuleInfo.java b/base/api/src/main/java/org/artifactory/api/module/ModuleInfo.java
deleted file mode 100644
index 14dd52b..0000000
--- a/base/api/src/main/java/org/artifactory/api/module/ModuleInfo.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.module;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.fs.FileLayoutInfo;
-
-import java.util.Map;
-
-/**
- * @author Noam Y. Tenne
- */
-public class ModuleInfo implements FileLayoutInfo {
-
-    private String organization;
-    private String module;
-    private String baseRevision;
-    private String folderIntegrationRevision;
-    private String fileIntegrationRevision;
-    private String classifier;
-    private String ext;
-    private String type;
-    private Map<String, String> customFields;
-
-    public ModuleInfo() {
-    }
-
-    ModuleInfo(String organization, String module, String baseRevision, String folderIntegrationRevision,
-            String fileIntegrationRevision, String classifier, String ext, String type,
-            Map<String, String> customFields) {
-        this.organization = organization;
-        this.module = module;
-        this.baseRevision = baseRevision;
-        this.folderIntegrationRevision = folderIntegrationRevision;
-        this.fileIntegrationRevision = fileIntegrationRevision;
-        this.classifier = classifier;
-        this.ext = ext;
-        this.type = type;
-        this.customFields = customFields;
-    }
-
-    @Override
-    public String getOrganization() {
-        return organization;
-    }
-
-    @Override
-    public String getModule() {
-        return module;
-    }
-
-    @Override
-    public String getBaseRevision() {
-        return baseRevision;
-    }
-
-    @Override
-    public String getFolderIntegrationRevision() {
-        return folderIntegrationRevision;
-    }
-
-    @Override
-    public String getFileIntegrationRevision() {
-        return fileIntegrationRevision;
-    }
-
-    @Override
-    public String getClassifier() {
-        return classifier;
-    }
-
-    @Override
-    public String getExt() {
-        return ext;
-    }
-
-    @Override
-    public String getType() {
-        return type;
-    }
-
-    @Override
-    public Map<String, String> getCustomFields() {
-        return customFields;
-    }
-
-    @Override
-    public String getCustomField(String tokenName) {
-        if (customFields == null) {
-            return null;
-        }
-        return customFields.get(tokenName);
-    }
-
-    @Override
-    public boolean isValid() {
-        return StringUtils.isNotBlank(organization) && StringUtils.isNotBlank(module) &&
-                StringUtils.isNotBlank(baseRevision);
-    }
-
-    /**
-     * Returns the module "id" in a "prettier" format.<br> {@link #toString()} will not omit fields like the classifier
-     * and type when they are not specified. This results in ugly artifact IDs.<br> This implementation will simply omit
-     * fields which are not specified.
-     *
-     * @return Summarized module info
-     */
-    @Override
-    public String getPrettyModuleId() {
-        if (StringUtils.isBlank(getOrganization()) || StringUtils.isBlank(getModule()) ||
-                StringUtils.isBlank(getBaseRevision())) {
-            return "null:null:null";
-        }
-
-        StringBuilder moduleIdBuilder = new StringBuilder(getOrganization()).append(":").append(getModule()).
-                append(":").append(getBaseRevision());
-
-        if (StringUtils.isNotBlank(getFileIntegrationRevision())) {
-            moduleIdBuilder.append("-").append(getFileIntegrationRevision());
-        }
-
-        String classifier = getClassifier();
-        if (StringUtils.isNotBlank(classifier)) {
-            moduleIdBuilder.append(":").append(classifier);
-        }
-
-        String type = getType();
-        if (StringUtils.isNotBlank(type)) {
-            moduleIdBuilder.append(":").append(type);
-        }
-        return moduleIdBuilder.toString();
-    }
-
-    @Override
-    public boolean isIntegration() {
-        return StringUtils.isNotBlank(getFolderIntegrationRevision()) ||
-                StringUtils.isNotBlank(getFileIntegrationRevision());
-    }
-
-    @Override
-    public String toString() {
-        return new StringBuilder("organization = ").append(organization).append(", module = ").append(module).
-                append(", baseRevision = ").append(baseRevision).append(", folderIntegrationRevision = ").
-                append(folderIntegrationRevision).append(", fileIntegrationRevision = ").
-                append(fileIntegrationRevision).append(", classifier = ").append(classifier).append(", ext = ").
-                append(ext).append(", type = ").append(type).toString();
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof ModuleInfo)) {
-            return false;
-        }
-
-        ModuleInfo that = (ModuleInfo) o;
-
-        if (fileIntegrationRevision != null ?
-                !fileIntegrationRevision.equals(that.fileIntegrationRevision) :
-                that.fileIntegrationRevision != null) {
-            return false;
-        }
-        if (classifier != null ? !classifier.equals(that.classifier) : that.classifier != null) {
-            return false;
-        }
-        if (ext != null ? !ext.equals(that.ext) : that.ext != null) {
-            return false;
-        }
-        if (module != null ? !module.equals(that.module) : that.module != null) {
-            return false;
-        }
-        if (organization != null ? !organization.equals(that.organization) : that.organization != null) {
-            return false;
-        }
-        if (folderIntegrationRevision != null ? !folderIntegrationRevision.equals(that.folderIntegrationRevision) :
-                that.folderIntegrationRevision != null) {
-            return false;
-        }
-        if (baseRevision != null ? !baseRevision.equals(that.baseRevision) : that.baseRevision != null) {
-            return false;
-        }
-        if (type != null ? !type.equals(that.type) : that.type != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = organization != null ? organization.hashCode() : 0;
-        result = 31 * result + (module != null ? module.hashCode() : 0);
-        result = 31 * result + (baseRevision != null ? baseRevision.hashCode() : 0);
-        result = 31 * result + (folderIntegrationRevision != null ? folderIntegrationRevision.hashCode() : 0);
-        result = 31 * result + (fileIntegrationRevision != null ? fileIntegrationRevision.hashCode() : 0);
-        result = 31 * result + (classifier != null ? classifier.hashCode() : 0);
-        result = 31 * result + (ext != null ? ext.hashCode() : 0);
-        result = 31 * result + (type != null ? type.hashCode() : 0);
-        return result;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/module/ModuleInfoBuilder.java b/base/api/src/main/java/org/artifactory/api/module/ModuleInfoBuilder.java
deleted file mode 100644
index d29075a..0000000
--- a/base/api/src/main/java/org/artifactory/api/module/ModuleInfoBuilder.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.module;
-
-import com.google.common.collect.Maps;
-import org.artifactory.fs.FileLayoutInfo;
-
-import java.io.Serializable;
-import java.util.Map;
-
-/**
- * @author Noam Y. Tenne
- */
-public class ModuleInfoBuilder implements Serializable {
-
-    private String organization = null;
-    private String module = null;
-    private String baseRevision = null;
-    private String folderIntegrationRevision = null;
-    private String fileIntegrationRevision = null;
-    private String classifier = null;
-    private String ext = null;
-    private String type = null;
-    private Map<String, String> customFields;
-
-    public ModuleInfoBuilder() {
-    }
-
-    public ModuleInfoBuilder(FileLayoutInfo copy) {
-        organization = copy.getOrganization();
-        module = copy.getModule();
-        baseRevision = copy.getBaseRevision();
-        folderIntegrationRevision = copy.getFolderIntegrationRevision();
-        fileIntegrationRevision = copy.getFileIntegrationRevision();
-        classifier = copy.getClassifier();
-        ext = copy.getExt();
-        type = copy.getType();
-        Map<String, String> customFields = copy.getCustomFields();
-        if (customFields != null) {
-            this.customFields = Maps.newHashMap(customFields);
-        }
-    }
-
-    public ModuleInfoBuilder organization(String organization) {
-        this.organization = organization;
-        return this;
-    }
-
-    public ModuleInfoBuilder module(String module) {
-        this.module = module;
-        return this;
-    }
-
-    public ModuleInfoBuilder baseRevision(String baseRevision) {
-        this.baseRevision = baseRevision;
-        return this;
-    }
-
-    public ModuleInfoBuilder folderIntegrationRevision(String folderIntegrationRevision) {
-        this.folderIntegrationRevision = folderIntegrationRevision;
-        return this;
-    }
-
-    public ModuleInfoBuilder fileIntegrationRevision(String fileIntegrationRevision) {
-        this.fileIntegrationRevision = fileIntegrationRevision;
-        return this;
-    }
-
-    public ModuleInfoBuilder classifier(String classifier) {
-        this.classifier = classifier;
-        return this;
-    }
-
-    public ModuleInfoBuilder ext(String ext) {
-        this.ext = ext;
-        return this;
-    }
-
-    public ModuleInfoBuilder type(String type) {
-        this.type = type;
-        return this;
-    }
-
-    public ModuleInfoBuilder customField(String tokenName, String tokenValue) {
-        if (customFields == null) {
-            customFields = Maps.newHashMap();
-        }
-
-        customFields.put(tokenName, tokenValue);
-        return this;
-    }
-
-    public ModuleInfo build() {
-        return new ModuleInfo(organization, module, baseRevision, folderIntegrationRevision, fileIntegrationRevision,
-                classifier, ext, type, customFields);
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/module/ModuleInfoUtils.java b/base/api/src/main/java/org/artifactory/api/module/ModuleInfoUtils.java
deleted file mode 100644
index d2dfa04..0000000
--- a/base/api/src/main/java/org/artifactory/api/module/ModuleInfoUtils.java
+++ /dev/null
@@ -1,397 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.module;
-
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.module.regex.NamedMatcher;
-import org.artifactory.api.module.regex.NamedPattern;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.util.PathUtils;
-import org.artifactory.util.RepoLayoutUtils;
-import org.artifactory.util.layouts.token.BaseTokenFilter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Noam Y. Tenne
- */
-public abstract class ModuleInfoUtils {
-
-    private static final Logger log = LoggerFactory.getLogger(ModuleInfoUtils.class);
-
-    private ModuleInfoUtils() {
-    }
-
-    public static String constructArtifactPath(ModuleInfo moduleInfo, RepoLayout repoLayout) {
-        return constructArtifactPath(moduleInfo, repoLayout, true);
-    }
-
-    public static String constructArtifactPath(ModuleInfo moduleInfo, RepoLayout repoLayout,
-            boolean clearUnReplacedOptionals) {
-        return constructItemPath(moduleInfo, repoLayout, false, clearUnReplacedOptionals);
-    }
-
-    public static String constructDescriptorPath(ModuleInfo moduleInfo, RepoLayout repoLayout,
-            boolean clearUnReplacedOptionals) {
-        return constructItemPath(moduleInfo, repoLayout, true, clearUnReplacedOptionals);
-    }
-
-    /**
-     * Creates a module info object from an <b>artifact</b> path.<br/>
-     * <b>NOTE:</b> Unless you've got a really good reason, refrain from using this method directly. Please create a
-     * module info using the methods of {@link org.artifactory.repo.Repo} or {@link org.artifactory.api.repo.RepositoryService}
-     *
-     * @param itemPath   Artifact path (relative to the repository)
-     * @param repoLayout Repository layout to use for resolution
-     * @return Module info object. When supplied with a path that does not match the layout, validity is unwarranted.
-     */
-    public static ModuleInfo moduleInfoFromArtifactPath(String itemPath, RepoLayout repoLayout) {
-        return moduleInfoFromItemPath(itemPath, repoLayout, false, false);
-    }
-
-    public static ModuleInfo moduleInfoFromArtifactPath(String itemPath, RepoLayout repoLayout,
-            boolean supportVersionsTokens) {
-        ModuleInfo moduleInfo = null;
-        if (repoLayout.isDistinctiveDescriptorPathPattern()) {
-            moduleInfo = moduleInfoFromItemPath(itemPath, repoLayout, true, supportVersionsTokens);
-            if (moduleInfo.isValid() && StringUtils.isBlank(moduleInfo.getExt())) {
-                moduleInfo = new ModuleInfoBuilder(moduleInfo).ext(PathUtils.getExtension(itemPath)).build();
-            }
-        }
-
-        if ((moduleInfo == null) || !moduleInfo.isValid()) {
-            moduleInfo = moduleInfoFromItemPath(itemPath, repoLayout, false, supportVersionsTokens);
-        }
-
-        return moduleInfo;
-    }
-
-    /**
-     * Creates a module info object from a <b>descriptor</b> path.<br/>
-     * <b>NOTE:</b> Unless you've got a really good reason, refrain from using this method directly. Please create a
-     * module info using the methods of {@link org.artifactory.repo.Repo} or {@link org.artifactory.api.repo.RepositoryService}
-     *
-     * @param itemPath   Descriptor path (relative to the repository)
-     * @param repoLayout Repository layout to use for resolution
-     * @return Module info object. When supplied with a path that does not match the layout, validity is unwarranted.
-     */
-    public static ModuleInfo moduleInfoFromDescriptorPath(String itemPath, RepoLayout repoLayout) {
-        ModuleInfo moduleInfo = moduleInfoFromItemPath(itemPath, repoLayout, true, false);
-        if (repoLayout.isDistinctiveDescriptorPathPattern() && moduleInfo.isValid() &&
-                StringUtils.isBlank(moduleInfo.getExt())) {
-            return new ModuleInfoBuilder(moduleInfo).ext(PathUtils.getExtension(itemPath)).build();
-        }
-        return moduleInfo;
-    }
-
-    private static String constructItemPath(ModuleInfo moduleInfo, RepoLayout repoLayout, boolean descriptor,
-            boolean clearUnReplacedOptionals) {
-        if (moduleInfo == null) {
-            throw new IllegalArgumentException("Unable to construct a path from a null module info object.");
-        }
-        if (!moduleInfo.isValid()) {
-            throw new IllegalArgumentException("Unable to construct a path from an invalid module info object.");
-        }
-        if (repoLayout == null) {
-            throw new IllegalArgumentException("Unable to construct a path from a null repository layout.");
-        }
-
-        String itemPathPattern;
-        if (descriptor && repoLayout.isDistinctiveDescriptorPathPattern()) {
-            itemPathPattern = repoLayout.getDescriptorPathPattern();
-        } else {
-            itemPathPattern = repoLayout.getArtifactPathPattern();
-        }
-
-        itemPathPattern = replaceDeclaredFields(moduleInfo, itemPathPattern);
-
-        itemPathPattern = RepoLayoutUtils.removeReplacedTokenOptionalBrackets(itemPathPattern, false);
-
-        if (clearUnReplacedOptionals) {
-            itemPathPattern = RepoLayoutUtils.removeUnReplacedTokenOptionalBrackets(itemPathPattern);
-        }
-
-        return itemPathPattern;
-    }
-
-    /**
-     * Constructs a path according to a given {@link ModuleInfo} information and a specific repo layout
-     * This path can be used as a repoPath for searching artifacts
-     *
-     * @param moduleInfo the {@link ModuleInfo} information, it must contains at least groupId and artifactId
-     * @param repoLayout the {@link RepoLayout} to base the path on
-     * @return String path of the gathered information, null in case the given {@link RepoLayout} is invalid,
-     *         an invalid repo layout is one that has brackets between the groupId and the moduleId or a bracket before them
-     */
-    public static String constructBaseItemPath(ModuleInfo moduleInfo, RepoLayout repoLayout) {
-        if (moduleInfo == null) {
-            throw new IllegalArgumentException("Unable to construct a path from a null module info object.");
-        }
-        if (repoLayout == null) {
-            throw new IllegalArgumentException("Unable to construct a path from a null repository layout.");
-        }
-
-        String itemPathPattern = repoLayout.getArtifactPathPattern();
-        itemPathPattern = replaceDeclaredFields(moduleInfo, itemPathPattern);
-        itemPathPattern = RepoLayoutUtils.removeUnReplacedTokenOptionalBrackets(itemPathPattern);
-        itemPathPattern = verifyAndBuildPathPattern(itemPathPattern);
-        if (StringUtils.isBlank(itemPathPattern)) {
-            log.warn("The repo layout '{}' is invalid and cannot be parsed for searching versions.",
-                    repoLayout.getName());
-        }
-
-        return itemPathPattern;
-    }
-
-    /**
-     * Constructs a module version according to the given {@link ModuleInfo} details and the {@link RepoLayout}
-     * Examples: '1.4.1-20120319.160615-2', '1.0-SNAPSHOT', '1.2'
-     *
-     * @param moduleInfo Contains the module details (base revision, file integration revision..)
-     * @param repoLayout The repo layout to calculate the module version from
-     * @return A module version string
-     */
-    public static String constructModuleVersion(ModuleInfo moduleInfo, RepoLayout repoLayout) {
-        if (moduleInfo == null) {
-            throw new IllegalArgumentException("Unable to construct a path from a null module info object.");
-        }
-        if (repoLayout == null) {
-            throw new IllegalArgumentException("Unable to construct a path from a null repository layout.");
-        }
-
-        String itemPathPattern = repoLayout.getArtifactPathPattern();
-        itemPathPattern = getModuleVersionPattern(itemPathPattern);
-        if (!StringUtils.isBlank(itemPathPattern)) {
-            itemPathPattern = replaceDeclaredFields(moduleInfo, itemPathPattern);
-            itemPathPattern = RepoLayoutUtils.removeReplacedTokenOptionalBrackets(itemPathPattern, false);
-            itemPathPattern = RepoLayoutUtils.removeUnReplacedTokenOptionalBrackets(itemPathPattern);
-        } else {
-            log.warn("The repo layout '{}' is invalid and cannot be parsed for version file name",
-                    repoLayout.getName());
-        }
-
-        return itemPathPattern;
-    }
-
-    /**
-     * Constructs the module version pattern, starting from [baseRev] to [fileItegRev]
-     *
-     * @param itemPathPattern the item path containing all the tokens of a given repo layout
-     * @return the tokens path representing the file name, empty string ("") in case of unsupported layout,
-     *         Unsupported layout is one which [fileItegRev] is before [baseRev]
-     */
-    private static String getModuleVersionPattern(String itemPathPattern) {
-        String wrappedBaseRevisionToken = RepoLayoutUtils.wrapKeywordAsToken(RepoLayoutUtils.BASE_REVISION);
-        String wrappedFileItegRevToken = RepoLayoutUtils.wrapKeywordAsToken(RepoLayoutUtils.FILE_INTEGRATION_REVISION);
-        int baseRevStartPos = StringUtils.lastIndexOf(itemPathPattern, wrappedBaseRevisionToken);
-        int fileItegRevEndPos = StringUtils.lastIndexOf(itemPathPattern, wrappedFileItegRevToken);
-        int indexOfClosingOptionalBracket = StringUtils.indexOf(itemPathPattern, ")", fileItegRevEndPos);
-        if (indexOfClosingOptionalBracket > 0) {
-            fileItegRevEndPos = indexOfClosingOptionalBracket + 1;
-        }
-        if (fileItegRevEndPos >= baseRevStartPos) {
-            return StringUtils.substring(itemPathPattern, baseRevStartPos, fileItegRevEndPos);
-        }
-
-        return "";
-    }
-
-    /**
-     * Verifies the given path is legit and removes the remaining brackets from it
-     *
-     * @param itemPathPattern the item path to verify
-     * @return the repo path without any brackets tokens in it, null in case the repo path is invalid
-     *         an invalid repo path is one that has brackets between the groupId and the moduleId or a bracket before them
-     */
-    private static String verifyAndBuildPathPattern(String itemPathPattern) {
-        String[] tokens = StringUtils.split(itemPathPattern, "/");
-        StringBuilder newPathBuilder = new StringBuilder();
-        boolean foundBracketToken = false;
-        for (String token : tokens) {
-            if (StringUtils.containsNone(token, new char[]{'[', ']'})) {
-                if (foundBracketToken) {
-                    // Invalid repo path, found a bracket between the groupId and the moduleId
-                    // or a bracket before them, returning null
-                    return null;
-                }
-                newPathBuilder.append(token).append("/");
-                foundBracketToken = false;
-            } else {
-                foundBracketToken = true;
-            }
-        }
-
-        return newPathBuilder.toString();
-    }
-
-    /**
-     * Insert all the given module info values to the pattern
-     *
-     * @param moduleInfo       Module info to use
-     * @param itemPathTemplate Item path template to fill
-     * @return Modified item path template
-     */
-    private static String replaceDeclaredFields(ModuleInfo moduleInfo, String itemPathTemplate) {
-        Set<String> tokens = Sets.newHashSet(RepoLayoutUtils.TOKENS);
-        Map<String, String> customFields = moduleInfo.getCustomFields();
-        if (customFields != null) {
-            itemPathTemplate = RepoLayoutUtils.clearCustomTokenRegEx(itemPathTemplate);
-            tokens.addAll(customFields.keySet());
-        }
-
-        for (String token : tokens) {
-            String wrappedToken = RepoLayoutUtils.wrapKeywordAsToken(token);
-
-            if (StringUtils.contains(itemPathTemplate, wrappedToken)) {
-
-                String tokenValue = getTokenValue(moduleInfo, token);
-
-                if (RepoLayoutUtils.TYPE.equals(token) && StringUtils.isBlank(tokenValue)) {
-                    tokenValue = moduleInfo.getExt();
-                }
-
-                if (StringUtils.isNotBlank(tokenValue)) {
-
-                    if (RepoLayoutUtils.tokenHasFilter(token)) {
-                        BaseTokenFilter tokenFilter = RepoLayoutUtils.TOKEN_FILTERS.get(token);
-                        if (tokenFilter != null) {
-                            tokenValue = tokenFilter.forPath(tokenValue);
-                        }
-                    }
-
-                    itemPathTemplate = StringUtils.replace(itemPathTemplate, wrappedToken, tokenValue);
-                }
-            }
-        }
-        return itemPathTemplate;
-    }
-
-    public static String getTokenValue(ModuleInfo moduleInfo, String tokenName) {
-        if (RepoLayoutUtils.ORGANIZATION.equals(tokenName)) {
-            return moduleInfo.getOrganization();
-        } else if (RepoLayoutUtils.ORGANIZATION_PATH.equals(tokenName)) {
-            return moduleInfo.getOrganization();
-        } else if (RepoLayoutUtils.MODULE.equals(tokenName)) {
-            return moduleInfo.getModule();
-        } else if (RepoLayoutUtils.BASE_REVISION.equals(tokenName)) {
-            return moduleInfo.getBaseRevision();
-        } else if (RepoLayoutUtils.FOLDER_INTEGRATION_REVISION.equals(tokenName)) {
-            return moduleInfo.getFolderIntegrationRevision();
-        } else if (RepoLayoutUtils.FILE_INTEGRATION_REVISION.equals(tokenName)) {
-            return moduleInfo.getFileIntegrationRevision();
-        } else if (RepoLayoutUtils.CLASSIFIER.equals(tokenName)) {
-            return moduleInfo.getClassifier();
-        } else if (RepoLayoutUtils.EXT.equals(tokenName)) {
-            return moduleInfo.getExt();
-        } else if (RepoLayoutUtils.TYPE.equals(tokenName)) {
-            return moduleInfo.getType();
-        } else {
-            return moduleInfo.getCustomField(tokenName);
-        }
-    }
-
-    private static ModuleInfo moduleInfoFromItemPath(String itemPath, RepoLayout repoLayout, boolean descriptor,
-            boolean supportVersionsTokens) {
-        if (StringUtils.isBlank(itemPath)) {
-            throw new IllegalArgumentException("Cannot construct a module info object from a blank item path.");
-        }
-        if (repoLayout == null) {
-            throw new IllegalArgumentException("Cannot construct a module info object from a null repository layout.");
-        }
-
-        String pattern;
-        if (descriptor && repoLayout.isDistinctiveDescriptorPathPattern()) {
-            pattern = repoLayout.getDescriptorPathPattern();
-        } else {
-            pattern = repoLayout.getArtifactPathPattern();
-        }
-
-        return moduleInfoFromPattern(itemPath, repoLayout, pattern, supportVersionsTokens);
-    }
-
-    private static ModuleInfo moduleInfoFromPattern(String itemPath, RepoLayout repoLayout, String pattern,
-            boolean supportVersionsTokens) {
-        String itemPathPatternRegExp = RepoLayoutUtils.generateRegExpFromPattern(repoLayout, pattern, false,
-                supportVersionsTokens);
-        //TODO: [by yl] Cache the patterns
-        NamedPattern itemPathRegExPattern = NamedPattern.compile(itemPathPatternRegExp);
-        NamedMatcher itemPathMatcher = itemPathRegExPattern.matcher(itemPath);
-        ModuleInfo moduleInfo;
-        if (!itemPathMatcher.matches()) {
-            moduleInfo = new ModuleInfo();
-        } else {
-            moduleInfo = createModuleInfo(itemPathMatcher);
-        }
-        if (!moduleInfo.isValid()) {
-            log.debug("Could not transform {} to a valid module info.", itemPath);
-        }
-        return moduleInfo;
-    }
-
-    private static ModuleInfo createModuleInfo(NamedMatcher itemPathMatcher) {
-        Map<String, String> namedGroups = itemPathMatcher.namedGroups();
-        ModuleInfoBuilder moduleInfoBuilder = new ModuleInfoBuilder();
-        for (Map.Entry<String, String> namedGroupEntry : namedGroups.entrySet()) {
-            String groupName = namedGroupEntry.getKey();
-            String groupValue = namedGroupEntry.getValue();
-
-            /**
-             * Check if the group name (token name) has a filter registered to it before checking for token aliases
-             * since the filter might be registered to the alias
-             */
-            if (RepoLayoutUtils.tokenHasFilter(groupName)) {
-                BaseTokenFilter tokenFilter = RepoLayoutUtils.TOKEN_FILTERS.get(groupName);
-                if (tokenFilter != null) {
-                    groupValue = tokenFilter.fromPath(groupValue);
-                }
-            }
-            setTokenValue(moduleInfoBuilder, groupName, groupValue);
-        }
-
-        return moduleInfoBuilder.build();
-    }
-
-    private static void setTokenValue(ModuleInfoBuilder moduleInfoBuilder, String tokenName, String tokenValue) {
-        if (RepoLayoutUtils.ORGANIZATION.equals(tokenName)) {
-            moduleInfoBuilder.organization(tokenValue);
-        } else if (RepoLayoutUtils.ORGANIZATION_PATH.equals(tokenName)) {
-            moduleInfoBuilder.organization(tokenValue);
-        } else if (RepoLayoutUtils.MODULE.equals(tokenName)) {
-            moduleInfoBuilder.module(tokenValue);
-        } else if (RepoLayoutUtils.BASE_REVISION.equals(tokenName)) {
-            moduleInfoBuilder.baseRevision(tokenValue);
-        } else if (RepoLayoutUtils.FOLDER_INTEGRATION_REVISION.equals(tokenName)) {
-            moduleInfoBuilder.folderIntegrationRevision(tokenValue);
-        } else if (RepoLayoutUtils.FILE_INTEGRATION_REVISION.equals(tokenName)) {
-            moduleInfoBuilder.fileIntegrationRevision(tokenValue);
-        } else if (RepoLayoutUtils.CLASSIFIER.equals(tokenName)) {
-            moduleInfoBuilder.classifier(tokenValue);
-        } else if (RepoLayoutUtils.EXT.equals(tokenName)) {
-            moduleInfoBuilder.ext(tokenValue);
-        } else if (RepoLayoutUtils.TYPE.equals(tokenName)) {
-            moduleInfoBuilder.type(tokenValue);
-        } else {
-            moduleInfoBuilder.customField(tokenName, tokenValue);
-        }
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/module/VersionUnit.java b/base/api/src/main/java/org/artifactory/api/module/VersionUnit.java
deleted file mode 100644
index 02c7daa..0000000
--- a/base/api/src/main/java/org/artifactory/api/module/VersionUnit.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.module;
-
-import com.google.common.collect.Sets;
-import org.artifactory.repo.RepoPath;
-
-import java.io.Serializable;
-import java.util.Set;
-
-/**
- * Version unit represents a group of deployed files. For maven it is the version path.
- *
- * @author Yossi Shaul
- */
-public class VersionUnit implements Serializable {
-
-    private final ModuleInfo moduleInfo;
-    private final Set<RepoPath> repoPaths;
-    private final Set<RepoPath> parents;
-
-    public VersionUnit(ModuleInfo moduleInfo, Set<RepoPath> repoPaths) {
-        this.moduleInfo = moduleInfo;
-        this.repoPaths = repoPaths;
-        parents = getParents(repoPaths);
-    }
-
-    private Set<RepoPath> getParents(Set<RepoPath> repoPaths) {
-        Set<RepoPath> parentSet = Sets.newHashSet();
-        for (RepoPath repoPath : repoPaths) {
-            parentSet.add(repoPath.getParent());
-        }
-
-        return parentSet;
-    }
-
-    public ModuleInfo getModuleInfo() {
-        return moduleInfo;
-    }
-
-    public Set<RepoPath> getRepoPaths() {
-        return repoPaths;
-    }
-
-    public Set<RepoPath> getParents() {
-        return parents;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof VersionUnit)) {
-            return false;
-        }
-
-        VersionUnit that = (VersionUnit) o;
-
-        if (moduleInfo != null ? !moduleInfo.equals(that.moduleInfo) : that.moduleInfo != null) {
-            return false;
-        }
-        if (repoPaths != null ? !repoPaths.equals(that.repoPaths) : that.repoPaths != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = moduleInfo != null ? moduleInfo.hashCode() : 0;
-        result = 31 * result + (repoPaths != null ? repoPaths.hashCode() : 0);
-        return result;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/module/regex/NamedMatchResult.java b/base/api/src/main/java/org/artifactory/api/module/regex/NamedMatchResult.java
deleted file mode 100644
index 7f45f0f..0000000
--- a/base/api/src/main/java/org/artifactory/api/module/regex/NamedMatchResult.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.module.regex;
-
-import java.util.List;
-import java.util.Map;
-import java.util.regex.MatchResult;
-
-/**
- * A reg ex pattern with added support for named capturing groups.
- * BASED ON THE PROJECT: http://code.google.com/p/named-regexp
- * REMOVE WHEN MIGRATING TO JAVA 7 (yeah, right)
- *
- * @author Noam Y. Tenne
- */
-public interface NamedMatchResult extends MatchResult {
-
-    public List<String> orderedGroups();
-
-    public Map<String, String> namedGroups();
-
-    public String group(String groupName);
-
-    public int start(String groupName);
-
-    public int end(String groupName);
-}
diff --git a/base/api/src/main/java/org/artifactory/api/module/regex/NamedMatcher.java b/base/api/src/main/java/org/artifactory/api/module/regex/NamedMatcher.java
deleted file mode 100644
index 42fd1dd..0000000
--- a/base/api/src/main/java/org/artifactory/api/module/regex/NamedMatcher.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.module.regex;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-import java.util.Map;
-import java.util.regex.MatchResult;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * A reg ex named matcher with added support for named capturing groups.
- * BASED ON THE PROJECT: http://code.google.com/p/named-regexp
- * REMOVE WHEN MIGRATING TO JAVA 7 (yeah, right)
- *
- * @author Noam Y. Tenne
- */
-public class NamedMatcher implements NamedMatchResult {
-    private static final Logger log = LoggerFactory.getLogger(NamedMatcher.class);
-
-    private Matcher matcher;
-    private NamedPattern parentPattern;
-
-    NamedMatcher() {
-    }
-
-    NamedMatcher(NamedPattern parentPattern, MatchResult matcher) {
-        this.parentPattern = parentPattern;
-        this.matcher = (Matcher) matcher;
-    }
-
-    NamedMatcher(NamedPattern parentPattern, CharSequence input) {
-        this.parentPattern = parentPattern;
-        this.matcher = parentPattern.pattern().matcher(input);
-    }
-
-    public Pattern standardPattern() {
-        return matcher.pattern();
-    }
-
-    public NamedPattern namedPattern() {
-        return parentPattern;
-    }
-
-    public NamedMatcher usePattern(NamedPattern newPattern) {
-        this.parentPattern = newPattern;
-        matcher.usePattern(newPattern.pattern());
-        return this;
-    }
-
-    public NamedMatcher reset() {
-        matcher.reset();
-        return this;
-    }
-
-    public NamedMatcher reset(CharSequence input) {
-        matcher.reset(input);
-        return this;
-    }
-
-    public boolean regexpMatches() {
-        return matcher.matches();
-    }
-
-    public boolean matches() {
-        if (!matcher.matches()) {
-            return false;
-        }
-        if (groupCount() != parentPattern.groupNames().size()) {
-            log.error("Regular expression '" + parentPattern.namedPattern() + "' uses unnamed capturing group!");
-            return false;
-        }
-        return matcher.matches();
-    }
-
-    public NamedMatchResult toMatchResult() {
-        return new NamedMatcher(this.parentPattern, matcher.toMatchResult());
-    }
-
-    public boolean find() {
-        return matcher.find();
-    }
-
-    public boolean find(int start) {
-        return matcher.find(start);
-    }
-
-    public boolean lookingAt() {
-        return matcher.lookingAt();
-    }
-
-    public NamedMatcher appendReplacement(StringBuffer sb, String replacement) {
-        matcher.appendReplacement(sb, replacement);
-        return this;
-    }
-
-    public StringBuffer appendTail(StringBuffer sb) {
-        return matcher.appendTail(sb);
-    }
-
-    @Override
-    public String group() {
-        return matcher.group();
-    }
-
-    @Override
-    public String group(int group) {
-        return matcher.group(group);
-    }
-
-    @Override
-    public int groupCount() {
-        return matcher.groupCount();
-    }
-
-    @Override
-    public List<String> orderedGroups() {
-        List<String> groups = Lists.newArrayList();
-        for (int i = 1; i <= groupCount(); i++) {
-            groups.add(group(i));
-        }
-        return groups;
-    }
-
-    @Override
-    public String group(String groupName) {
-        return group(groupIndex(groupName));
-    }
-
-    @Override
-    public Map<String, String> namedGroups() {
-        Map<String, String> result = Maps.newLinkedHashMap();
-        if (!matches()) {
-            log.error("Pattern did not match! Cannot extract named groups!");
-            return result;
-        }
-
-        for (int i = 1; i <= groupCount(); i++) {
-            String groupName = parentPattern.groupNames().get(i - 1);
-            String groupValue = matcher.group(i);
-            result.put(groupName, groupValue);
-        }
-
-        return result;
-    }
-
-    private int groupIndex(String groupName) {
-        return parentPattern.groupNames().indexOf(groupName) + 1;
-    }
-
-    @Override
-    public int start() {
-        return matcher.start();
-    }
-
-    @Override
-    public int start(int group) {
-        return matcher.start(group);
-    }
-
-    @Override
-    public int start(String groupName) {
-        return start(groupIndex(groupName));
-    }
-
-    @Override
-    public int end() {
-        return matcher.end();
-    }
-
-    @Override
-    public int end(int group) {
-        return matcher.end(group);
-    }
-
-    @Override
-    public int end(String groupName) {
-        return end(groupIndex(groupName));
-    }
-
-    public NamedMatcher region(int start, int end) {
-        matcher.region(start, end);
-        return this;
-    }
-
-    public int regionEnd() {
-        return matcher.regionEnd();
-    }
-
-    public int regionStart() {
-        return matcher.regionStart();
-    }
-
-    public boolean hitEnd() {
-        return matcher.hitEnd();
-    }
-
-    public boolean requireEnd() {
-        return matcher.requireEnd();
-    }
-
-    public boolean hasAnchoringBounds() {
-        return matcher.hasAnchoringBounds();
-    }
-
-    public boolean hasTransparentBounds() {
-        return matcher.hasTransparentBounds();
-    }
-
-    public String replaceAll(String replacement) {
-        return matcher.replaceAll(replacement);
-    }
-
-    public String replaceFirst(String replacement) {
-        return matcher.replaceFirst(replacement);
-    }
-
-    public NamedMatcher useAnchoringBounds(boolean b) {
-        matcher.useAnchoringBounds(b);
-        return this;
-    }
-
-    public NamedMatcher useTransparentBounds(boolean b) {
-        matcher.useTransparentBounds(b);
-        return this;
-    }
-
-    public boolean equals(Object obj) {
-        return matcher.equals(obj);
-    }
-
-    public int hashCode() {
-        return matcher.hashCode();
-    }
-
-    public String toString() {
-        return matcher.toString();
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/module/regex/NamedPattern.java b/base/api/src/main/java/org/artifactory/api/module/regex/NamedPattern.java
deleted file mode 100644
index 1492d31..0000000
--- a/base/api/src/main/java/org/artifactory/api/module/regex/NamedPattern.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.module.regex;
-
-import com.google.common.collect.Lists;
-
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * A reg ex pattern with added support for named capturing groups.
- * BASED ON THE PROJECT: http://code.google.com/p/named-regexp
- * REMOVE WHEN MIGRATING TO JAVA 7 (yeah, right)
- *
- * @author Noam Y. Tenne
- */
-public class NamedPattern {
-
-    private static final Pattern NAMED_GROUP_PATTERN = Pattern.compile("\\(\\?<(\\w+)>");
-
-    private Pattern pattern;
-    private String namedPattern;
-    private List<String> groupNames;
-
-    public static NamedPattern compile(String regex) {
-        return new NamedPattern(regex, 0);
-    }
-
-    public static NamedPattern compile(String regex, int flags) {
-        return new NamedPattern(regex, flags);
-    }
-
-    private NamedPattern(String regex, int i) {
-        namedPattern = regex;
-        pattern = buildStandardPattern(regex);
-        groupNames = extractGroupNames(regex);
-    }
-
-    public int flags() {
-        return pattern.flags();
-    }
-
-    public NamedMatcher matcher(CharSequence input) {
-        return new NamedMatcher(this, input);
-    }
-
-    Pattern pattern() {
-        return pattern;
-    }
-
-    public String standardPattern() {
-        return pattern.pattern();
-    }
-
-    public String namedPattern() {
-        return namedPattern;
-    }
-
-    public List<String> groupNames() {
-        return groupNames;
-    }
-
-    public String[] split(CharSequence input, int limit) {
-        return pattern.split(input, limit);
-    }
-
-    public String[] split(CharSequence input) {
-        return pattern.split(input);
-    }
-
-    public String toString() {
-        return namedPattern;
-    }
-
-    static List<String> extractGroupNames(String namedPattern) {
-        List<String> groupNames = Lists.newArrayList();
-        Matcher matcher = NAMED_GROUP_PATTERN.matcher(namedPattern);
-        while (matcher.find()) {
-            groupNames.add(matcher.group(1));
-        }
-        return groupNames;
-    }
-
-    static Pattern buildStandardPattern(String namedPattern) {
-        return Pattern.compile(NAMED_GROUP_PATTERN.matcher(namedPattern).replaceAll("("));
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/properties/LockableAddProperties.java b/base/api/src/main/java/org/artifactory/api/properties/LockableAddProperties.java
deleted file mode 100644
index 84de1f3..0000000
--- a/base/api/src/main/java/org/artifactory/api/properties/LockableAddProperties.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2012 JFrog Ltd. All rights reserved.
- * JFROG PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
- */
-
-package org.artifactory.api.properties;
-
-import org.artifactory.descriptor.property.Property;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.common.Lock;
-
-import javax.annotation.Nullable;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Chen  Keinan
- */
-public interface LockableAddProperties {
-
-    /**
-     * Recursively adds (and stores) a property to the item at the repo path.
-     *
-     * @param repoPath    The item repo path
-     * @param propertySet Property set to add - can be null
-     * @param propertyMapFromRequests    Property map from request
-     */
-    @Lock
-    void addPropertyInternalMultiple(RepoPath repoPath, @Nullable PropertySet propertySet,
-                                     Map<Property, List<String>> propertyMapFromRequests,boolean updateAccessLogger);
-
-    @Lock
-    void addSha256PropertyInternalMultiple(RepoPath repoPath);
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/properties/PropertiesService.java b/base/api/src/main/java/org/artifactory/api/properties/PropertiesService.java
deleted file mode 100644
index 39b914c..0000000
--- a/base/api/src/main/java/org/artifactory/api/properties/PropertiesService.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright 2012 JFrog Ltd. All rights reserved.
- * JFROG PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
- */
-
-package org.artifactory.api.properties;
-
-import org.artifactory.descriptor.property.Property;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.common.Lock;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Yossi Shaul
- */
-public interface PropertiesService {
-
-    String FILTERED_RESOURCE_PROPERTY_NAME = "filtered";
-
-    String MAVEN_PLUGIN_PROPERTY_NAME = "artifactory.maven.mavenPlugin";
-
-    String CONTENT_TYPE_PROPERTY_NAME = "content-type";
-
-    /**
-     * @param repoPath The item (repository/folder/file) repository path
-     * @return The properties attached to this repo path. Empty properties if non exist.
-     */
-    @Nonnull
-    Properties getProperties(RepoPath repoPath);
-
-    /**
-     * Adds (and stores) a property to the item at the repo path.
-     *
-     * @param repoPath    The item repo path
-     * @param propertySet Property set to add - can be null
-     * @param property    Property to add
-     * @param values      Property values (if null, will not add the property)
-     */
-    @Lock
-    void addProperty(RepoPath repoPath, @Nullable PropertySet propertySet, Property property,
-            boolean updateAccessLogger,String... values);
-
-    @Lock
-    void addProperty(RepoPath repoPath, @Nullable PropertySet propertySet, Property property,String... values);
-
-    /**
-     * Edit a property on a specific repo path.
-     *
-     * @param repoPath    The item repo path
-     * @param propertySet The property set to edit
-     * @param property    The property to add
-     * @param values      Property values
-     */
-    @Lock
-    void editProperty(RepoPath repoPath, PropertySet propertySet, Property property, boolean updateAccessLogger,String... values);
-
-
-    /**
-     * Recursively adds (and stores) a property to the item at the repo path.
-     *
-     * @param repoPath    The item repo path
-     * @param propertySet Property set to add - can be null
-     * @param property    Property to add
-     * @param values      Property values (if null, will not add the property)
-     */
-    @Lock
-    void addPropertyRecursively(RepoPath repoPath, @Nullable PropertySet propertySet, Property property,
-            boolean updateAccessLogger,String... values);
-
-    /**
-     * Recursively adds (and stores) a property to the item at the repo path.
-     *
-     * @param repoPath    The item repo path
-     * @param propertySet Property set to add - can be null
-     * @param property    Property to add
-     * @param values      Property values (if null, will not add the property)
-     */
-    @Lock
-    void addPropertyRecursively(RepoPath repoPath, @Nullable PropertySet propertySet, Property property,
-            String... values);
-    /**
-     * Deletes the property from the item.
-     *
-     * @param repoPath The item repo path
-     * @param property Property name to delete
-     */
-    @Lock
-    boolean deleteProperty(RepoPath repoPath, String property,boolean updateAccessLogger);
-
-    @Lock
-    boolean deleteProperty(RepoPath repoPath, String property);
-
-
-    /**
-     * Recursively adds (and stores) a property to the item at the repo path in multiple transaction.
-     *
-     * @param repoPath    The item repo path
-     * @param propertySet Property set to add - can be null
-     * @param propertyMapFromRequest    Properties map from request
-     */
-    void addPropertyRecursivelyMultiple(RepoPath repoPath, @Nullable PropertySet propertySet,
-                                        Map<Property, List<String>> propertyMapFromRequest,boolean updateAccessLogger);
-
-
-    /**
-     * Recursively adds (and stores) a property to the item at the repo path in multiple transaction.
-     *
-     * @param repoPath    The item repo path
-     * @param propertySet Property set to add - can be null
-     * @param propertyMapFromRequest    Properties map from request
-     */
-    void addPropertyRecursivelyMultiple(RepoPath repoPath, @Nullable PropertySet propertySet,
-            Map<Property, List<String>> propertyMapFromRequest);
-
-    void addPropertySha256RecursivelyMultiple(RepoPath repoPath);
-
-        /**
-         * Deletes property from the item recursively.
-         *
-         * @param repoPath The item repo path
-         * @param property Property name to delete
-         */
-    @Lock
-    void deletePropertyRecursively(RepoPath repoPath, String property, boolean updateAccessLogger);
-
-    /**
-     * Deletes property from the item recursively.
-     *
-     * @param repoPath The item repo path
-     * @param property Property name to delete
-     */
-    @Lock
-    void deletePropertyRecursively(RepoPath repoPath, String property);
-
-    /**
-     * Returns map of properties for the given repo paths
-     *
-     * @param repoPaths     Paths to extract properties for
-     * @param mandatoryKeys Any property keys that should be mandatory for resulting properties. If provided, property
-     *                      objects will be added to the map only if they contain all the given keys
-     * @return Map of repo paths with their corresponding properties
-     */
-    Map<RepoPath, Properties> getProperties(Set<RepoPath> repoPaths, String... mandatoryKeys);
-
-    @Lock
-    void setProperties(RepoPath repoPath,Properties newProperties);
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/repo/AggregatingRequestListener.java b/base/api/src/main/java/org/artifactory/api/repo/AggregatingRequestListener.java
deleted file mode 100644
index 6be03a3..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/AggregatingRequestListener.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo;
-
-/**
- * The main interface for the aggregating request listener implementation
- *
- * @author Noam Y. Tenne
- */
-public interface AggregatingRequestListener extends RequestListener {
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/repo/ArchiveFileContent.java b/base/api/src/main/java/org/artifactory/api/repo/ArchiveFileContent.java
deleted file mode 100644
index 50c7350..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/ArchiveFileContent.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo;
-
-import org.artifactory.repo.RepoPath;
-
-import java.io.Serializable;
-
-/**
- * A value object with results for archive file content request.
- *
- * @author Yossi Shaul
- */
-public class ArchiveFileContent implements Serializable {
-
-    private String content;
-    private RepoPath sourceArchive;
-    private String sourcePath;
-    private String reason;
-
-    public ArchiveFileContent(String content, RepoPath sourceArchive, String sourcePath) {
-        this.content = content;
-        this.sourceArchive = sourceArchive;
-        this.sourcePath = sourcePath;
-    }
-
-    /**
-     * @return The content of the source, null if ont found.
-     */
-    public String getContent() {
-        return content;
-    }
-
-    /**
-     * @return Repo path of the archive containing the source.
-     */
-    public RepoPath getSourceArchive() {
-        return sourceArchive;
-    }
-
-    /**
-     * @return Source file path inside the archive.
-     */
-    public String getSourcePath() {
-        return sourcePath;
-    }
-
-    /**
-     * @return Failure reason if the source was not found.
-     */
-    public String getFailureReason() {
-        return reason;
-    }
-
-    public static ArchiveFileContent contentNotFound(String reason) {
-        ArchiveFileContent notFound = new ArchiveFileContent(null, null, null);
-        notFound.reason = reason;
-        return notFound;
-    }
-
-    public void setContent(String content) {
-        this.content = content;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/repo/Async.java b/base/api/src/main/java/org/artifactory/api/repo/Async.java
deleted file mode 100644
index cea913c..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/Async.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Schedule asynchronous invocation of a method. Cannot be combined with the @Lock annotation. If the method returns
- * a value it must be of type {@link java.util.concurrent.Future}.
- *
- * @author Yoav Landman
- */
- at Target({ElementType.METHOD})
- at Retention(RetentionPolicy.RUNTIME)
- at Inherited
- at Documented
-public @interface Async {
-    /**
-     * Transactional will execute the async in a transaction.
-     */
-    boolean transactional() default false;
-
-    /**
-     * Delay the execution until the current transaction (if any) commits successfully.
-     */
-    boolean delayUntilAfterCommit() default false;
-
-    /**
-     * Share the thread with other async callbacks registered on the current thread - only applicable if
-     * 'delayUntilAfterCommit' is true.
-     */
-    boolean shared() default true;
-
-    /**
-     * Don't execute if calling thread is not in a transaction.
-     */
-    boolean failIfNotScheduledFromTransaction() default false;
-
-    /**
-     * Invoke the async method with {@link org.artifactory.api.security.SecurityService#authenticateAsSystem()}
-     */
-    boolean authenticateAsSystem() default false;
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/repo/BackupService.java b/base/api/src/main/java/org/artifactory/api/repo/BackupService.java
deleted file mode 100644
index 3bfcfa9..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/BackupService.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.config.ExportSettingsImpl;
-import org.artifactory.descriptor.backup.BackupDescriptor;
-import org.artifactory.descriptor.repo.RealRepoDescriptor;
-
-import java.io.File;
-import java.util.List;
-
-/**
- * User: freds Date: Aug 5, 2008 Time: 9:25:33 PM
- */
-public interface BackupService {
-    void backupRepos(File backupDir, ExportSettingsImpl exportSettings);
-
-    void backupRepos(File backupDir, List<RealRepoDescriptor> excludeRepositories,
-            ExportSettingsImpl exportSettings);
-
-    void scheduleImmediateSystemBackup(BackupDescriptor backupDescriptor, BasicStatusHolder statusHolder);
-}
diff --git a/base/api/src/main/java/org/artifactory/api/repo/BaseBrowsableItem.java b/base/api/src/main/java/org/artifactory/api/repo/BaseBrowsableItem.java
deleted file mode 100644
index de61932..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/BaseBrowsableItem.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo;
-
-import org.artifactory.repo.RepoPath;
-
-import java.io.Serializable;
-
-/**
- * Base class of simple browsable item
- *
- * @author Noam Y. Tenne
- */
-public abstract class BaseBrowsableItem implements Serializable, Comparable<BaseBrowsableItem> {
-
-    private static final long serialVersionUID = 1L;
-
-    public static final String UP = "..";
-    protected String name;
-    private boolean folder;
-    private long created;
-    private long lastModified;
-    private long size;
-    private boolean remote = false;
-
-
-    /**
-     * Main constructor
-     *
-     * @param name         Item display name
-     * @param folder       True if the item represents a folder
-     * @param created
-     * @param lastModified Item last modified time
-     * @param size         Item size (applicable only to files)
-     */
-    public BaseBrowsableItem(String name, boolean folder, long created, long lastModified, long size) {
-        this.name = name;
-        this.folder = folder;
-        this.created = created;
-        this.lastModified = lastModified;
-        this.size = size;
-    }
-
-    public boolean isRemote() {
-        return remote;
-    }
-
-    public void setRemote(boolean remote) {
-        this.remote = remote;
-    }
-
-    /**
-     * Returns the display name of the item
-     *
-     * @return Item display name
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Returns the repo path of the item
-     *
-     * @return Item repo path
-     */
-    public abstract RepoPath getRepoPath();
-
-    /**
-     * Returns the repo key of the item
-     *
-     * @return Item repo key
-     */
-    public abstract String getRepoKey();
-
-    /**
-     * Returns the relative path of the item
-     *
-     * @return Item relative path
-     */
-    public abstract String getRelativePath();
-
-    /**
-     * Returns the last modified time of the item
-     *
-     * @return Item last modified time in millis
-     */
-    public long getLastModified() {
-        return lastModified;
-    }
-
-    /**
-     * Returns the creation time of the item
-     *
-     * @return Item creation time in millis
-     */
-    public long getCreated() {
-        return created;
-    }
-
-    /**
-     * Returns the size of the item
-     *
-     * @return Item size
-     */
-    public long getSize() {
-        return size;
-    }
-
-    public boolean isFolder() {
-        return folder;
-    }
-
-    public void setCreated(long created) {
-        this.created = created;
-    }
-
-    public void setLastModified(long lastModified) {
-        this.lastModified = lastModified;
-    }
-
-    public void setSize(long size) {
-        this.size = size;
-    }
-
-    @Override
-    public String toString() {
-        return getRepoPath().toString();
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/repo/BrowsableItem.java b/base/api/src/main/java/org/artifactory/api/repo/BrowsableItem.java
deleted file mode 100644
index 16bd04a..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/BrowsableItem.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo;
-
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-
-/**
- * Local\cache repo display item for all the simple browsers
- *
- * @author Noam Y. Tenne
- */
-public class BrowsableItem extends BaseBrowsableItem {
-
-    private static final long serialVersionUID = 1L;
-
-    private RepoPath repoPath;
-
-    /**
-     * Main constructor.<br> Please use factory methods for normal object creation.
-     *
-     * @param name         Item display name
-     * @param folder       True if the item represents a folder
-     * @param created
-     * @param lastModified Item last modified time
-     * @param size         Item size (applicable only to files)
-     * @param repoPath     Item repo path
-     */
-    public BrowsableItem(String name, boolean folder, long created, long lastModified, long size, RepoPath repoPath) {
-        super(name, folder, created, lastModified, size);
-        this.repoPath = repoPath;
-    }
-
-    /**
-     * Creates a standard browsable item
-     *
-     * @param itemInfo Backing item info
-     * @return Browsable item
-     */
-    public static <T extends ItemInfo> BrowsableItem getItem(T itemInfo) {
-        if (itemInfo.isFolder()) {
-            return new BrowsableItem(itemInfo.getName(), true, itemInfo.getCreated(),
-                    itemInfo.getLastModified(), 0, itemInfo.getRepoPath());
-        }
-        return new BrowsableItem(itemInfo.getName(), false, itemInfo.getCreated(),
-                itemInfo.getLastModified(), ((FileInfo) itemInfo).getSize(), itemInfo.getRepoPath()
-        );
-    }
-
-    /**
-     * Creates a checksum browsable item
-     *
-     * @param browsableItem       Browsable item file that the checksum belongs to
-     * @param checksumType        Type of checksum to create for
-     * @param checksumValueLength Byte length of checksum value
-     * @return Browsable item
-     */
-    public static BrowsableItem getChecksumItem(BrowsableItem browsableItem, ChecksumType checksumType,
-            long checksumValueLength) {
-        String checksumItemName = browsableItem.getName() + checksumType.ext();
-        RepoPath repoPath = InternalRepoPathFactory.create(browsableItem.getRepoKey(),
-                browsableItem.getRelativePath() + checksumType.ext());
-
-        return new BrowsableItem(checksumItemName, false, browsableItem.getCreated(),
-                browsableItem.getLastModified(), checksumValueLength, repoPath);
-    }
-
-    @Override
-    public RepoPath getRepoPath() {
-        return repoPath;
-    }
-
-    @Override
-    public String getRepoKey() {
-        return repoPath.getRepoKey();
-    }
-
-    @Override
-    public String getRelativePath() {
-        return repoPath.getPath();
-    }
-
-    @Override
-    public int compareTo(BaseBrowsableItem o) {
-        if (name.equals(o.name)) {
-            return 0;
-        }
-        if (name.equals(UP) || (isFolder() && !o.isFolder())) {
-            return -1;
-        }
-        if (o.name.equals(UP) || (!isFolder() && o.isFolder())) {
-            return 1;
-        }
-        return name.compareTo(o.name);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof BrowsableItem)) {
-            return false;
-        }
-
-        BrowsableItem that = (BrowsableItem) o;
-
-        if (name != null ? !name.equals(that.name) : that.name != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return name != null ? name.hashCode() : 0;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/repo/BrowsableItemCriteria.java b/base/api/src/main/java/org/artifactory/api/repo/BrowsableItemCriteria.java
deleted file mode 100644
index 3d4f715..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/BrowsableItemCriteria.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo;
-
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author Noam Y. Tenne
- */
-public class BrowsableItemCriteria {
-
-    private final RepoPath repoPath;
-    private final boolean includeChecksums;
-    private final boolean includeRemoteResources;
-    private final Properties requestProperties;
-
-    private BrowsableItemCriteria(RepoPath repoPath, boolean includeChecksums,
-            boolean includeRemoteResources, Properties requestProperties) {
-        this.repoPath = repoPath;
-        this.includeChecksums = includeChecksums;
-        this.includeRemoteResources = includeRemoteResources;
-        this.requestProperties = requestProperties;
-    }
-
-    public RepoPath getRepoPath() {
-        return repoPath;
-    }
-
-    public boolean isIncludeChecksums() {
-        return includeChecksums;
-    }
-
-    public boolean isIncludeRemoteResources() {
-        return includeRemoteResources;
-    }
-
-    public Properties getRequestProperties() {
-        return requestProperties;
-    }
-
-    public static class Builder {
-
-        private RepoPath repoPath;
-        private boolean includeChecksums = true;
-        private boolean includeRemoteResources = true;
-        private Properties requestProperties;
-
-        public Builder(RepoPath repoPath) {
-            this.repoPath = repoPath;
-        }
-
-        public Builder(BrowsableItemCriteria copy) {
-            this.repoPath = copy.getRepoPath();
-            this.includeChecksums = copy.isIncludeChecksums();
-            this.includeRemoteResources = copy.isIncludeRemoteResources();
-            this.requestProperties = copy.getRequestProperties();
-        }
-
-        public Builder repoPath(RepoPath repoPath) {
-            this.repoPath = repoPath;
-            return this;
-        }
-
-        public Builder includeChecksums(boolean includeChecksums) {
-            this.includeChecksums = includeChecksums;
-            return this;
-        }
-
-        public Builder includeRemoteResources(boolean includeRemoteResources) {
-            this.includeRemoteResources = includeRemoteResources;
-            return this;
-        }
-
-        public Builder requestProperties(Properties requestProperties) {
-            this.requestProperties = requestProperties;
-            return this;
-        }
-
-        public BrowsableItemCriteria build() {
-            if (repoPath == null) {
-                throw new IllegalArgumentException("Please provide a repo path.");
-            }
-
-            return new BrowsableItemCriteria(repoPath, includeChecksums, includeRemoteResources, requestProperties);
-        }
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/repo/CaseSensitivityRepairService.java b/base/api/src/main/java/org/artifactory/api/repo/CaseSensitivityRepairService.java
deleted file mode 100644
index 7681623..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/CaseSensitivityRepairService.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.artifactory.api.repo;
-
-import org.artifactory.api.rest.artifact.RepairPathConflictsResult;
-import org.artifactory.fs.ItemInfo;
-
-import java.util.List;
-
-/**
- * @author Yoav Luft
- */
-public interface CaseSensitivityRepairService {
-    /**
-     * Finds all paths rooted at basePath that have letter case conflicting names.
-     *
-     * @param path root path for search, only elements belonging to it's subtree will be searched
-     * @return {@link RepairPathConflictsResult} element containing all found conflicts, their count and status message
-     */
-    RepairPathConflictsResult findPathConflicts(String path);
-
-    /**
-     * Attempts to automatically fix all parent-child path case conflicts for the given list of paths
-     *
-     * @param conflicts paths to be fixed
-     * @return {@link RepairPathConflictsResult} element containing all found conflicts, their count, count of repaired
-     * paths and a status message
-     */
-    RepairPathConflictsResult fixCaseConflicts(List<RepairPathConflictsResult.PathConflict> conflicts);
-
-    List<ItemInfo> getOrphanItems(String path);
-}
diff --git a/base/api/src/main/java/org/artifactory/api/repo/DeployService.java b/base/api/src/main/java/org/artifactory/api/repo/DeployService.java
deleted file mode 100644
index 935d424..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/DeployService.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo;
-
-import org.artifactory.api.artifact.UnitInfo;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.descriptor.repo.RealRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.md.Properties;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.io.File;
-
-/**
- * Provides artifacts deploy services.
- *
- * @author Yossi Shaul
- */
-public interface DeployService {
-
-    @Request
-    void deploy(RepoDescriptor targetRepo, UnitInfo artifactInfo, File fileToDeploy, @Nullable Properties properties)
-            throws RepoRejectException;
-
-    @Request
-    void deploy(RepoDescriptor targetRepo, UnitInfo artifactInfo, File fileToDeploy, String pomString,
-            boolean forceDeployPom, boolean partOfBundleDeploy, Properties properties) throws RepoRejectException;
-
-    @Request
-    void deployBundle(File bundle, RealRepoDescriptor targetRepo, BasicStatusHolder status, boolean failFast);
-
-    @Request
-    void deployBundle(File bundle, RealRepoDescriptor targetRepo, BasicStatusHolder status, boolean failFast,
-            @Nonnull String prefix, Properties properties);
-}
diff --git a/base/api/src/main/java/org/artifactory/api/repo/DirectRequestListener.java b/base/api/src/main/java/org/artifactory/api/repo/DirectRequestListener.java
deleted file mode 100644
index 2306831..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/DirectRequestListener.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo;
-
-/**
- * The main interface for the direct request listener implementation
- *
- * @author Noam Y. Tenne
- */
-public interface DirectRequestListener extends RequestListener {
-}
diff --git a/base/api/src/main/java/org/artifactory/api/repo/DockerRepositoryAction.java b/base/api/src/main/java/org/artifactory/api/repo/DockerRepositoryAction.java
deleted file mode 100644
index d9744a5..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/DockerRepositoryAction.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package org.artifactory.api.repo;
-
-/**
- * @author Nessim
- */
-public enum DockerRepositoryAction {
-    CREATE, DELETE
-}
diff --git a/base/api/src/main/java/org/artifactory/api/repo/ItemInfoAware.java b/base/api/src/main/java/org/artifactory/api/repo/ItemInfoAware.java
deleted file mode 100644
index 325c258..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/ItemInfoAware.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo;
-
-import org.artifactory.fs.ItemInfo;
-
-import java.io.Serializable;
-
-/**
- * @author Yoav Aharoni
- */
-public interface ItemInfoAware extends Serializable {
-    ItemInfo getItemInfo();
-}
diff --git a/base/api/src/main/java/org/artifactory/api/repo/RemoteBrowsableItem.java b/base/api/src/main/java/org/artifactory/api/repo/RemoteBrowsableItem.java
deleted file mode 100644
index 46a83d2..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/RemoteBrowsableItem.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo;
-
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.remote.browse.RemoteItem;
-
-/**
- * Represents an item on a remote server.
- *
- * @author Tomer Cohen
- */
-public class RemoteBrowsableItem extends BrowsableItem {
-
-    /**
-     * The effective url for linking this item
-     */
-    private String effectiveUrl;
-
-    /**
-     * Creates a new remote browsable item.
-     *
-     * @param remoteItem Remote item details
-     * @param repoPath   Item repo path
-     */
-    public RemoteBrowsableItem(RemoteItem remoteItem, RepoPath repoPath) {
-        super(remoteItem.getName(), remoteItem.isDirectory(), 0L,
-                remoteItem.getLastModified(), remoteItem.getSize(), repoPath);
-        setRemote(true);
-    }
-
-    public String getEffectiveUrl() {
-        return effectiveUrl;
-    }
-
-    public void setEffectiveUrl(String effectiveUrl) {
-        this.effectiveUrl = effectiveUrl;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof RemoteBrowsableItem)) {
-            return false;
-        }
-        if (!super.equals(o)) {
-            return false;
-        }
-
-        RemoteBrowsableItem item = (RemoteBrowsableItem) o;
-
-        if (name != null ? !name.equals(item.name) : item.name != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = super.hashCode();
-        result = 31 * result + (name != null ? name.hashCode() : 0);
-        return result;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/repo/RepositoryBrowsingService.java b/base/api/src/main/java/org/artifactory/api/repo/RepositoryBrowsingService.java
deleted file mode 100644
index 3dd7192..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/RepositoryBrowsingService.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo;
-
-import org.artifactory.repo.RepoPath;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.List;
-
-/**
- * This service supports the repository browsing done in the web UI.
- *
- * @author Tomer Cohen
- */
-public interface RepositoryBrowsingService {
-    /**
-     * @param repoPath Path to a virtual repo item.
-     * @return Virtual repo item with all real repo keys the real item exists and accessible to the current user. Null
-     *         if not found or user has no permissions.
-     */
-    @Nullable
-    VirtualRepoItem getVirtualRepoItem(RepoPath repoPath);
-
-    /**
-     * @param virtualFolderPath Path to a virtual repo folder.
-     * @return List of virtual items (files and folders) under the virtual folders. Will return empty list if item
-     *         doesn't exist, not a file of no permissions.
-     */
-    List<VirtualRepoItem> getVirtualRepoItems(RepoPath virtualFolderPath);
-
-    /**
-     * Creates a list of local and cached repo children items for all the simple browsers. <br> This method is not to be
-     * used by non-ui clients for simple child discovery. It is also intended to serve only local and cache
-     * repositories. Use {@link RepositoryService#getChildren(org.artifactory.repo.RepoPath)} instead.
-     *
-     * @param criteria Browsable item conditions
-     * @return Null if given a non-existent or non-folder repo path. Otherwise, the list of children
-     */
-    @Nonnull
-    List<BaseBrowsableItem> getLocalRepoBrowsableChildren(@Nonnull BrowsableItemCriteria criteria);
-
-    /**
-     * Get external browsable children from a remote repo. Using {@link org.apache.ivy.util.url.ApacheURLLister#listAll}
-     * of Ivy in order to get a remote listing.
-     *
-     * @param criteria Browsable item conditions
-     * @return A list of all browsable items (local and remote)
-     */
-    @Nonnull
-    List<BaseBrowsableItem> getRemoteRepoBrowsableChildren(@Nonnull BrowsableItemCriteria criteria);
-
-    /**
-     * Creates a list of virtual repo children items for all the simple browsers.<br> This method is not to be used by
-     * non-ui clients for simple child discovery. Use {@link RepositoryService#getVirtualRepoItems(org.artifactory.repo.RepoPath)}
-     * instead.
-     *
-     * @param criteria Browsable item conditions
-     * @return Null if given a non-existent or non-folder repo path. Otherwise, the list of children
-     */
-    @Nonnull
-    List<BaseBrowsableItem> getVirtualRepoBrowsableChildren(@Nonnull BrowsableItemCriteria criteria);
-
-    /**
-     * Returns a browsable item for the given repo path. It also checks if the artifacts exists and if the repository is
-     * blacked out.
-     *
-     * @param repoPath The item repo path (file or folder)
-     * @return Browsable item for the repo path. Null if the item exists but the repository is blacked out.
-     * @throws ItemNotFoundRuntimeException if the item is not found
-     */
-    @Nullable
-    BrowsableItem getLocalRepoBrowsableItem(RepoPath repoPath);
-
-    /**
-     * Returns a virtual browsable item for the given repo path.
-     *
-     * @param repoPath The item repo path (file or folder)
-     * @return Virtual browsable item for the repo path
-     */
-    @Nullable
-    VirtualBrowsableItem getVirtualRepoBrowsableItem(RepoPath repoPath);
-
-    /**
-     * Creates a list of local and cached repo children items for all the simple browsers. <br> This method is not to be
-     * used by non-ui clients for simple child discovery. It is also intended to serve only local and cache
-     * repositories. Use {@link RepositoryService#getChildren(org.artifactory.repo.RepoPath)} instead.
-     * the browsableItemAccept is update with indication if browsable item list is empty because have no Read rights
-     * @param criteria Browsable item conditions
-     * @return Null if given a non-existent or non-folder repo path. Otherwise, the list of children
-     */
-    @Nullable
-    public List<BaseBrowsableItem> getLocalRepoBrowsableChildren(@Nonnull BrowsableItemCriteria criteria,
-            boolean updateRootNodesFilterFlag,RootNodesFilterResult rootNodesFilterResult);
-
-    /**
-     * Get external browsable children from a remote repo. Using {@link org.apache.ivy.util.url.ApacheURLLister#listAll}
-     * of Ivy in order to get a remote listing.
-     * the browsableItemAccept is update with indication if browsable item list is empty because have no Read rights
-     * @param criteria Browsable item conditions
-     * @return A list of all browsable items (local and remote)
-     */
-    @Nullable
-    public List<BaseBrowsableItem> getRemoteRepoBrowsableChildren(@Nonnull BrowsableItemCriteria criteria,boolean
-            updateRootNodesFilterFlag , RootNodesFilterResult rootNodesFilterResult);
-
-
-    /**
-     * Creates a list of virtual repo children items for all the simple browsers.<br> This method is not to be used by
-     * non-ui clients for simple child discovery. Use {@link RepositoryService#getVirtualRepoItems(org.artifactory.repo.RepoPath)}
-     * instead.
-     * the browsableItemAccept is update with indication if browsable item list is empty because have no Read rights
-     * @param criteria Browsable item conditions
-     * @return Null if given a non-existent or non-folder repo path. Otherwise, the list of children
-     */
-    @Nullable
-    public List<BaseBrowsableItem> getVirtualRepoBrowsableChildren(@Nonnull BrowsableItemCriteria criteria,
-            boolean updateRootNodesFilterFlag,RootNodesFilterResult rootNodesFilterResult);
-
-
-    }
diff --git a/base/api/src/main/java/org/artifactory/api/repo/RepositoryService.java b/base/api/src/main/java/org/artifactory/api/repo/RepositoryService.java
deleted file mode 100644
index 0f3017f..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/RepositoryService.java
+++ /dev/null
@@ -1,532 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo;
-
-import org.apache.commons.compress.archivers.ArchiveInputStream;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.common.MoveMultiStatusHolder;
-import org.artifactory.api.config.ExportSettingsImpl;
-import org.artifactory.api.config.ImportSettingsImpl;
-import org.artifactory.api.config.ImportableExportable;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.module.VersionUnit;
-import org.artifactory.api.repo.exception.FileExpectedException;
-import org.artifactory.api.repo.exception.FolderExpectedException;
-import org.artifactory.api.repo.exception.ItemNotFoundRuntimeException;
-import org.artifactory.api.search.SavedSearchResults;
-import org.artifactory.api.search.VersionSearchResults;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.common.StatusHolder;
-import org.artifactory.descriptor.repo.*;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.fs.*;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.resource.ResourceStreamHandle;
-import org.artifactory.sapi.common.ExportSettings;
-import org.artifactory.sapi.common.Lock;
-import org.artifactory.sapi.fs.MutableVfsItem;
-import org.artifactory.util.Tree;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.zip.ZipInputStream;
-
-/**
- * User: freds Date: Jul 21, 2008 Time: 8:07:50 PM
- */
-public interface RepositoryService extends ImportableExportable {
-
-    String METADATA_FOLDER = ".artifactory-metadata";
-
-    List<LocalRepoDescriptor> getLocalRepoDescriptors();
-
-    List<LocalCacheRepoDescriptor> getCachedRepoDescriptors();
-
-    List<VirtualRepoDescriptor> getVirtualRepoDescriptors();
-
-    List<DistributionRepoDescriptor> getDistributionRepoDescriptors();
-
-    /**
-     * @return Gets a list of local and remote repositories, no caches
-     */
-    List<RepoDescriptor> getLocalAndRemoteRepoDescriptors();
-
-    List<LocalRepoDescriptor> getLocalAndCachedRepoDescriptors();
-
-    List<RemoteRepoDescriptor> getRemoteRepoDescriptors();
-
-    RepoDescriptor repoDescriptorByKey(String key);
-
-    /**
-     * Gets a local or cache repository by key.
-     *
-     * @param repoKey The key for a cache can either be the remote repository one or the cache one(ends with "-cache")
-     */
-    LocalRepoDescriptor localOrCachedRepoDescriptorByKey(String repoKey);
-
-    LocalRepoDescriptor localCachedOrDistributionRepoDescriptorByKey(String repoKey);
-
-    LocalRepoDescriptor localRepoDescriptorByKey(String key);
-
-    RemoteRepoDescriptor remoteRepoDescriptorByKey(String repoKey);
-
-    VirtualRepoDescriptor virtualRepoDescriptorByKey(String repoKey);
-
-    DistributionRepoDescriptor distributionRepoDescriptorByKey(String key);
-
-    String getSha1BySha2Property(String value);
-
-    /**
-     * Internal - get the raw content directly
-     */
-    @Nonnull
-    String getStringContent(FileInfo fileInfo);
-
-    /**
-     * Internal - get the raw content directly. Returns empty string if content not found.
-     */
-    @Nonnull
-    String getStringContent(RepoPath repoPath);
-
-    /**
-     * Internal - get the raw content directly
-     *
-     * @return The ResourceStreamHandle for an existing file or a NullResourceStreamHandle for a non-exiting file
-     */
-    ResourceStreamHandle getResourceStreamHandle(RepoPath repoPath);
-
-    /**
-     * @param archivePath     Repository path of the archive file
-     * @param sourceEntryPath File path inside the archive
-     * @return The source entry details (including content if found)
-     * @throws IOException On failure reading to archive or the sources file (will not fail if not found)
-     */
-    ArchiveFileContent getArchiveFileContent(RepoPath archivePath, String sourceEntryPath) throws IOException;
-
-    /**
-     * Import all the repositories under the passed folder which matches local or cached repository declared in the
-     * configuration. Having empty directory for each repository is allowed and not an error. Nothing will be imported
-     * for those.
-     *
-     * @param settings
-     */
-    void importAll(ImportSettingsImpl settings);
-
-    /**
-     * Import the artifacts under the folder passed directly in the repository named "repoKey". If no repository with
-     * this repo key exists or if the folder passed is empty, the status will be set to error.
-     *
-     * @param repoKey
-     * @param settings
-     */
-    void importRepo(String repoKey, ImportSettingsImpl settings);
-
-    /**
-     * @param repoPath Repository path of the item
-     * @return Folder or file info. Throws exception if the path doesn't exist.
-     */
-    @Nonnull
-    ItemInfo getItemInfo(RepoPath repoPath) throws ItemNotFoundRuntimeException;
-
-    /**
-     * @param repoPath Repository path of the file
-     * @return The file info. Throws exception if the path doesn't exist or it doesn't point to a file.
-     */
-    @Nonnull
-    FileInfo getFileInfo(RepoPath repoPath) throws ItemNotFoundRuntimeException, FileExpectedException;
-
-    /**
-     * @param repoPath Repository path of the folder
-     * @return The folder info. Throws exception if the path doesn't exist or it doesn't point to a folder.
-     */
-    @Nonnull
-    FolderInfo getFolderInfo(RepoPath repoPath) throws ItemNotFoundRuntimeException, FolderExpectedException;
-
-    boolean hasProperties(RepoPath repoPath);
-
-    @Nullable
-    Properties getProperties(RepoPath repoPath);
-
-    /**
-     * Sets the given properties on the target existing item. Overrides any existing properties.
-     * This methods checks for annotate permissions.
-     *
-     * @param repoPath   Repo path of the item
-     * @param properties Properties to set
-     * @return True if properties were set successfully
-     */
-    @Lock
-    boolean setProperties(RepoPath repoPath, Properties properties);
-
-    @Lock
-    boolean removeProperties(RepoPath repoPath);
-
-    @Request(aggregateEventsByTimeWindow = true)
-    @Lock
-    BasicStatusHolder undeploy(RepoPath repoPath);
-
-    @Request(aggregateEventsByTimeWindow = true)
-    @Lock
-    BasicStatusHolder undeploy(RepoPath repoPath, boolean calcMavenMetadata);
-
-    @Request(aggregateEventsByTimeWindow = true)
-    @Lock
-    BasicStatusHolder undeploy(RepoPath repoPath, boolean calcMavenMetadata, boolean pruneEmptyFolders);
-
-    @Request(aggregateEventsByTimeWindow = true)
-    StatusHolder undeployMultiTransaction(RepoPath repoPath);
-
-    @Request(aggregateEventsByTimeWindow = true)
-    StatusHolder undeployVersionUnits(Set<VersionUnit> versionUnits);
-
-    /**
-     * Moves repository path (pointing to a folder) to another absolute target. The move will only move paths the user
-     * has permissions to move and paths that are accepted by the target repository. Maven metadata will be recalculated
-     * for both the source and target folders.
-     *
-     * @param targetPath      The target local non-cached repository to move the path to.
-     * @param dryRun          If true the method will just report the expected result but will not move any file
-     * @param suppressLayouts If true, path translation across different layouts should be suppressed.
-     * @param failFast        If true, the operation should fail upon encountering an error.
-     * @return MoveMultiStatusHolder holding the errors and warnings
-     */
-    @Lock
-    MoveMultiStatusHolder move(RepoPath fromRepoPath, RepoPath targetPath, boolean dryRun, boolean suppressLayouts,
-            boolean failFast);
-
-    /**
-     * Moves set of paths to another local repository.
-     * <p/>
-     * This method will only move paths the user has permissions to move and paths that are accepted by the target
-     * repository.
-     * <p/>
-     * Maven metadata will be recalculated for both the source and target folders after all items has been moved. If a
-     * path already belongs to the target repository it will be skipped.
-     * <p/>
-     * This move method does not use Unix-style handling of existing nested folders, meaning that folder content might
-     * be overwritten (i.e. when moving source path org/jfrog/1 to target path org/jfrog/1 the contents of source 1/
-     * are moved into target 1/  - unlike normal unix behavior where such an operation will create org/jfrog/1/1)
-     *
-     * @param pathsToMove   Paths to move, each pointing to file or folder.
-     * @param targetRepoKey Key of the target local non-cached repository to move the path to.
-     * @param properties    Properties to attach on the target paths
-     * @param dryRun        If true the method will just report the expected result but will not move any file  @return
-     * @param failFast      True if the operation should abort upon the first occurring warning or error
-     * @return MoveMultiStatusHolder holding the errors and warnings
-     */
-    @Lock
-    MoveMultiStatusHolder move(Set<RepoPath> pathsToMove, String targetRepoKey, Properties properties,
-            boolean dryRun, boolean failFast);
-
-    /**
-     * Copies repository path to another absolute path in multi tx. The copy will only copy paths the user has permissions to read
-     * and paths that are accepted by the target repository. Maven metadata will be recalculated for both the source and
-     * target folders. Metadata is also copied.
-     *
-     * @param fromRepoPath    Repository path to copy. This path must represent a folder in a local repository.
-     * @param targetRepoPath  Path of the target local non-cached repository to copy the path to.
-     * @param dryRun          If true the method will just report the expected result but will not copy any file
-     * @param suppressLayouts If true, path translation across different layouts should be suppressed.
-     * @param failFast        If true, the operation should fail upon encountering an error.
-     * @return MoveMultiStatusHolder holding the errors and warnings
-     */
-    MoveMultiStatusHolder copyMultiTx(RepoPath fromRepoPath, RepoPath targetRepoPath, boolean dryRun, boolean suppressLayouts,
-                                      boolean failFast);
-
-    /**
-     * Move repository path to another absolute path in multi tx. The move will only move paths the user has permissions to read
-     * and paths that are accepted by the target repository. Maven metadata will be recalculated for both the source and
-     * target folders. Metadata is also moved.
-     *
-     * @param fromRepoPath    Repository path to move. This path must represent a folder in a local repository.
-     * @param targetRepoPath  Path of the target local non-cached repository to move the path to.
-     * @param dryRun          If true the method will just report the expected result but will not copy any file
-     * @param suppressLayouts If true, path translation across different layouts should be suppressed.
-     * @param failFast        If true, the operation should fail upon encountering an error.
-     * @return MoveMultiStatusHolder holding the errors and warnings
-     */
-    MoveMultiStatusHolder moveMultiTx(RepoPath fromRepoPath, RepoPath targetRepoPath, boolean dryRun, boolean suppressLayouts,
-                                      boolean failFast);
-
-    /**
-     * Copies repository path to another absolute path in single tx may case performance issues. The copy will only copy paths the user has permissions to read
-     * and paths that are accepted by the target repository. Maven metadata will be recalculated for both the source and
-     * target folders. Metadata is also copied.
-     *
-     * @param fromRepoPath    Repository path to copy. This path must represent a folder in a local repository.
-     * @param targetRepoPath  Path of the target local non-cached repository to copy the path to.
-     * @param dryRun          If true the method will just report the expected result but will not copy any file
-     * @param suppressLayouts If true, path translation across different layouts should be suppressed.
-     * @param failFast        If true, the operation should fail upon encountering an error.
-     * @return MoveMultiStatusHolder holding the errors and warnings
-     */
-    @Lock
-    MoveMultiStatusHolder copy(RepoPath fromRepoPath, RepoPath targetRepoPath, boolean dryRun, boolean suppressLayouts,
-                               boolean failFast);
-
-    /**
-     * Copies a set of paths to another local repository in single tx mode in order to prevent long db locking.
-     * <p/>
-     * This method will only copy paths the user has permissions to move and paths that are accepted by the target
-     * repository.
-     * <p/>
-     * Maven metadata will be recalculated for both the source and target folders after all items has been copied. If a
-     * path already belongs to the target repository it will be skipped.
-     * <p/>
-     * This copy method does not use Unix-style handling of existing nested folders, meaning that folder content might
-     * be overwritten (i.e. when copying source path org/jfrog/1 to target path org/jfrog/1 the contents of source 1/
-     * are copied into target 1/  - unlike normal unix behavior where such an operation will create org/jfrog/1/1)
-     *
-     * @param pathsToCopy        Paths to copy, each pointing to file or folder.
-     * @param targetLocalRepoKey Key of the target local non-cached repository to move the path to.
-     * @param properties
-     * @param dryRun             If true the method will just report the expected result but will not copy any file
-     * @param failFast           True if the operation should abort upon the first occurring warning or error
-     * @return MoveMultiStatusHolder holding the errors and warnings
-     */
-    @Lock
-    MoveMultiStatusHolder copy(Set<RepoPath> pathsToCopy, String targetLocalRepoKey,
-            Properties properties, boolean dryRun, boolean failFast);
-
-    /**
-     * Expire expirable resources (folders, snapshot artifacts, maven metadata, etc.)
-     *
-     * @param repoPath Cache repository path of a folder of file to zap. If it is a folder the zap is recursively
-     *                 applied.
-     * @return A count of the items affected by the zap
-     */
-    @Lock
-    int zap(RepoPath repoPath);
-
-    List<FolderInfo> getWithEmptyChildren(FolderInfo folderInfo);
-
-    Set<String> getAllRepoKeys();
-
-    /**
-     * Return true if the given {@code repoPath} exists as a local or local cache repository. Throws an exception if not found
-     *
-     * @param repoPath A repo path in the repository
-     * @return Local/cache repository matching the repo path repo key
-     * @throws IllegalArgumentException if repoPath not found
-     */
-    boolean exists(RepoPath repoPath);
-
-    /**
-     * Returns a list of children {@link org.artifactory.fs.ItemInfo} of the given repo path that can be read by the
-     * current user.
-     * An empty list is returned if the path doesn't exist of is not pointing to a folder.
-     *
-     * @param repoPath The repo path to list children
-     * @return Returns a list of children {@link org.artifactory.fs.ItemInfo} of the given repo path or empty list.
-     */
-    @Nonnull
-    List<ItemInfo> getChildren(RepoPath repoPath);
-
-    @Lock
-    List<ItemInfo> getChildrenDeeply(RepoPath path);
-
-    List<String> getChildrenNames(RepoPath repoPath);
-
-    boolean hasChildren(RepoPath repoPath);
-
-    void exportRepo(String repoKey, ExportSettings settings);
-
-    ArchiveFileContent getGenericArchiveFileContent(RepoPath archivePath, String sourceEntryPath) throws IOException;
-
-
-    /**
-     * Export the selected search result into a target directory
-     *
-     * @param searchResults The search results to export
-     * @param baseSettings
-     * @return The status of the procedure
-     */
-    MutableStatusHolder exportSearchResults(SavedSearchResults searchResults, ExportSettingsImpl baseSettings);
-
-    /**
-     * Returns all the version units under a certain path.
-     *
-     * @param repoPath The repository path (might be repository root with no sub-path)
-     * @return ItemSearchResults containing version units under a certain path
-     */
-    VersionSearchResults getVersionUnitsUnder(RepoPath repoPath);
-
-    /**
-     * @return the number of artifacts currently being served, including virtual repo cached files
-     */
-    long getArtifactCount();
-
-    /**
-     * Returns a list of local repo descriptors that the user is permitted to deploy on
-     *
-     * @return List<LocalRepoDescriptor> - List of deploy-permitted local repos
-     */
-    List<LocalRepoDescriptor> getDeployableRepoDescriptors();
-
-    /**
-     * Checks if the specified repoPath is handled by the snapshot(integration)/release policy of the repoPath's
-     * repository.
-     *
-     * @param repoPath
-     * @return
-     */
-    boolean isRepoPathHandled(RepoPath repoPath);
-
-    /**
-     * Checks if the specified repoPath is accepted by the include/exclude rules of the repoPath's repository.
-     *
-     * @param repoPath The repo path to check
-     * @return True if the repository accepts the given path
-     */
-    boolean isRepoPathAccepted(RepoPath repoPath);
-
-    /**
-     * Indicates whether the repo path is visible, permission and repo-acceptance-wise
-     *
-     * @param repoPath Repo path to check
-     * @return True if the the current user can read the path and the path is accepted by the repo. When the path is not
-     * accepted, the method will return true if the user has annotate permissions or higher
-     */
-    boolean isRepoPathVisible(RepoPath repoPath);
-
-    /**
-     * @return List of virtual repositories that include the repository in their list.
-     */
-    List<VirtualRepoDescriptor> getVirtualReposContainingRepo(RepoDescriptor repoDescriptor);
-
-    /**
-     * Indicates if the given virtual repo path exists
-     *
-     * @param repoPath Virtual repo path
-     * @return True if repo path exists, false if not
-     */
-    boolean virtualItemExists(RepoPath repoPath);
-
-    /**
-     * Returns the shared remote repository list from the given Artifactory instance URL
-     *
-     * @param remoteUrl  URL of remote Artifactory instance
-     * @param headersMap Header-map to add to the request
-     * @return List of shared remote repositories
-     */
-    List<RemoteRepoDescriptor> getSharedRemoteRepoConfigs(String remoteUrl, Map<String, String> headersMap);
-
-    /**
-     * @param zipPath Path to a zip like file
-     * @return Tree representation of the entries in the zip.
-     * @throws IOException On error retrieving or parsing the zip file
-     */
-    Tree<ZipEntryInfo> zipEntriesToTree(RepoPath zipPath) throws IOException;
-
-
-    ArchiveInputStream archiveInputStream(RepoPath zipPath) throws IOException;
-
-    ZipInputStream zipInputStream(RepoPath zipPath) throws IOException;
-    /**
-     * Returns the latest modified item of the given file or folder (recursively)
-     *
-     * @param pathToSearch Repo path to search in
-     * @return Latest modified item
-     */
-    ItemInfo getLastModified(RepoPath pathToSearch);
-
-    @Lock
-    void touch(RepoPath repoPath);
-
-    /**
-     * Fixes ant inconsistencies with the files checksums.
-     *
-     * @param fileRepoPath Repository path of the file
-     */
-    @Lock
-    void fixChecksums(RepoPath fileRepoPath);
-
-    ModuleInfo getItemModuleInfo(RepoPath repoPath);
-
-    @Lock
-    boolean mkdirs(RepoPath folderRepoPath);
-
-    StatusHolder deploy(RepoPath repoPath, InputStream inputStream);
-
-    /**
-     * Returns the first resolved local file info from a virtual repo.
-     *
-     * @param virtualRepoPath Repo path of virtual file
-     * @return Local file info
-     */
-    FileInfo getVirtualFileInfo(RepoPath virtualRepoPath);
-
-    /**
-     * Returns the first resolved local item info from a virtual repo.
-     *
-     * @param virtualRepoPath Repo path of virtual item
-     * @return Local item info
-     */
-    ItemInfo getVirtualItemInfo(RepoPath virtualRepoPath);
-
-    /**
-     * Returns a list of the local and cache aggregated repositories (recursively) under the given virtual
-     * repository key, or an empty list in case of non-existing virtual repository
-     *
-     * @param virtualRepoKey The virtual repository key
-     * @return A list of the local and cache aggregates repositories under the given virtual repository key
-     */
-    List<RepoDescriptor> getVirtualResolvedLocalAndCacheDescriptors(String virtualRepoKey);
-
-    /**
-     * Returns the files count under the specified repo path (repository or folder).
-     *
-     * @param repoPath Repository path of a root repo or a folder
-     * @return Files count under the specified repo path
-     */
-    long getArtifactCount(RepoPath repoPath);
-
-    /**
-     * Returns the files and folder (nodes)count under the specified repo path (repository or folder).
-     *
-     * @param repoPath Repository path of a root repo or a folder
-     * @return files and folder count under the specified repo path
-     */
-    long getNodesCount(RepoPath repoPath);
-
-    /**
-     * Search for all files with bad checksums of the given checksum type (SHA-1 or MD5)
-     *
-     * @param type The checksum type to search for, we support SHA-1 or MD5
-     */
-    List<FileInfo> searchFilesWithBadChecksum(ChecksumType type);
-
-    //TODO: [by YS] cannot be transactional by itself should be transactional mandatory
-    MutableVfsItem getMutableItem(RepoPath repoPath);
-
-    @Nullable
-    StatsInfo getStatsInfo(RepoPath repoPath);
-
-    boolean isWriteLocked(RepoPath repoPath);
-
-    List<ItemInfo> getOrphanItems(RepoPath repoPath);
-
-}
diff --git a/base/api/src/main/java/org/artifactory/api/repo/Request.java b/base/api/src/main/java/org/artifactory/api/repo/Request.java
deleted file mode 100644
index e57aca4..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/Request.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Request annotation. Used when needed to mark the begining and the end of a logical action
- *
- * @author Noam Tenne
- */
- at Target({ElementType.METHOD})
- at Retention(RetentionPolicy.RUNTIME)
- at Inherited
- at Documented
-public @interface Request {
-
-    /**
-     * Indicates if the occurring of events should be notified at the end of the request, or be aggregated for certain
-     * time window
-     *
-     * @return True if events should be aggregated. False if not
-     */
-    boolean aggregateEventsByTimeWindow() default false;
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/repo/RequestListener.java b/base/api/src/main/java/org/artifactory/api/repo/RequestListener.java
deleted file mode 100644
index b73e0df..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/RequestListener.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo;
-
-/**
- * The main listener interface for the request annotation
- *
- * @author Noam Tenne
- */
-public interface RequestListener {
-
-    /**
-     * Called before the request has begun
-     *
-     * @param remoteAddress The address that the request was originated from
-     */
-    void onBeginRequest(String remoteAddress);
-
-    /**
-     * Called after the request has ended
-     *
-     * @param remoteAddress The address that the request was originated from
-     */
-    void onEndRequest(String remoteAddress);
-
-    /**
-     * Called when an exception occurrs while invoking the method
-     *
-     * @param remoteAddress The address that the request was originated from
-     */
-    void onException(String remoteAddress);
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/repo/RootNodesFilterResult.java b/base/api/src/main/java/org/artifactory/api/repo/RootNodesFilterResult.java
deleted file mode 100644
index 8f9f743..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/RootNodesFilterResult.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.artifactory.api.repo;
-
-/**
- * @author Chen Keinan
- */
-public class RootNodesFilterResult {
-    private boolean allItemNodesCanRead = true;
-
-    public boolean isAllItemNodesCanRead() {
-        return allItemNodesCanRead;
-    }
-
-    public void setAllItemNodesCanRead(boolean isBrowsableItemsAcceptCanRead) {
-        this.allItemNodesCanRead = isBrowsableItemsAcceptCanRead;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/repo/VirtualBrowsableItem.java b/base/api/src/main/java/org/artifactory/api/repo/VirtualBrowsableItem.java
deleted file mode 100644
index 9a1455f..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/VirtualBrowsableItem.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo;
-
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.MutableItemInfo;
-import org.artifactory.repo.RepoPath;
-
-import java.util.List;
-
-/**
- * Virtual repo display item for all the simple browsers
- *
- * @author Noam Y. Tenne
- */
-public class VirtualBrowsableItem extends BaseBrowsableItem {
-
-    private static final long serialVersionUID = 1L;
-
-    private RepoPath repoPath;
-    private List<String> repoKeys;
-
-    /**
-     * Main constructor.<br> Please use factory methods for normal object creation.
-     *
-     * @param name         Item display name
-     * @param folder       True if the item represents a folder
-     * @param created      Item creation time
-     * @param lastModified Item last modified time
-     * @param size         Item size (applicable only to files)
-     * @param repoPath     Item repo path
-     * @param repoKeys     List of keys of the repos that the item appears in
-     */
-    public VirtualBrowsableItem(String name, boolean folder, long created, long lastModified, long size,
-            RepoPath repoPath,
-            List<String> repoKeys) {
-        super(name, folder, created, lastModified, size);
-        this.repoPath = repoPath;
-        this.repoKeys = repoKeys;
-    }
-
-    /**
-     * Creates a standard browsable item
-     *
-     * @param repoPath Item's virtual repo path
-     * @param itemInfo Backing item info
-     * @param repoKeys List of keys of the repos that the item appears in
-     * @return Browsable item
-     */
-    public static <T extends MutableItemInfo> VirtualBrowsableItem getItem(RepoPath repoPath, T itemInfo,
-            List<String> repoKeys) {
-        if (itemInfo.isFolder()) {
-            return new VirtualBrowsableItem(itemInfo.getName(), true, itemInfo.getCreated(),
-                    itemInfo.getLastModified(), 0, repoPath, repoKeys);
-        }
-        return new VirtualBrowsableItem(itemInfo.getName(), false, itemInfo.getCreated(), itemInfo.getLastModified(),
-                ((FileInfo) itemInfo).getSize(), repoPath, repoKeys);
-    }
-
-    @Override
-    public RepoPath getRepoPath() {
-        return repoPath;
-    }
-
-    @Override
-    public String getRepoKey() {
-        return repoPath.getRepoKey();
-    }
-
-    public void addRepoKey(String repoKey) {
-        repoKeys.add(repoKey);
-    }
-
-    @Override
-    public String getRelativePath() {
-        return repoPath.getPath();
-    }
-
-    public List<String> getRepoKeys() {
-        return repoKeys;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        VirtualBrowsableItem item = (VirtualBrowsableItem) o;
-        return repoPath.getPath().equals(item.getRelativePath());
-    }
-
-    @Override
-    public int hashCode() {
-        return repoPath.getPath().hashCode();
-    }
-
-    @Override
-    public int compareTo(BaseBrowsableItem o) {
-
-        if (name.equals(UP) || (isFolder() && !o.isFolder())) {
-            return -1;
-        }
-
-        if (o.name.equals(UP) || (!isFolder() && o.isFolder())) {
-            return 1;
-        }
-
-        return this.repoPath.getPath().compareTo(o.getRelativePath());
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/repo/VirtualRepoItem.java b/base/api/src/main/java/org/artifactory/api/repo/VirtualRepoItem.java
deleted file mode 100644
index fcec497..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/VirtualRepoItem.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo;
-
-import org.artifactory.fs.ItemInfo;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Represents a virtual file/folder inside a virtual repository. Holds the item info of one concrete item (usually the
- * first one) and a list of local repository keys that accessible from the virtual repo and contain this item.
- *
- * @author yoavl
- */
-public class VirtualRepoItem implements ItemInfoAware {
-    private final ItemInfo itemInfo;
-    private List<String> repoKeys = new ArrayList<>();
-
-    public VirtualRepoItem(ItemInfo itemInfo) {
-        this.itemInfo = itemInfo;
-    }
-
-    public String getName() {
-        return itemInfo.getName();
-    }
-
-    public String getPath() {
-        return itemInfo.getRelPath();
-    }
-
-    public boolean isFolder() {
-        return itemInfo.isFolder();
-    }
-
-    public List<String> getRepoKeys() {
-        return repoKeys;
-    }
-
-    @Override
-    public ItemInfo getItemInfo() {
-        return itemInfo;
-    }
-
-    public void addRepoKey(String repoKey) {
-        getRepoKeys().add(repoKey);
-    }
-
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        VirtualRepoItem item1 = (VirtualRepoItem) o;
-        return itemInfo.equals(item1.itemInfo);
-
-    }
-
-    public int hashCode() {
-        return itemInfo.hashCode();
-    }
-
-    @Override
-    public String toString() {
-        return "VirtualRepoItem{" +
-                "item=" + itemInfo +
-                ", repoKeys=" + repoKeys +
-                '}';
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/repo/cleanup/ArtifactCleanupService.java b/base/api/src/main/java/org/artifactory/api/repo/cleanup/ArtifactCleanupService.java
deleted file mode 100644
index a81d648..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/cleanup/ArtifactCleanupService.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo.cleanup;
-
-
-import org.artifactory.api.common.BasicStatusHolder;
-
-import javax.annotation.Nullable;
-
-/**
- * The main interface of the clean-up service
- *
- * @author Noam Tenne
- */
-public interface ArtifactCleanupService {
-
-    /**
-     * Induce the artifact cleanup manually, and wait for the cleanup to start running.
-     *
-     * @param statusHolder A status holder for the results.
-     * @return The task id or null if failed to start the task
-     */
-    @Nullable
-    String callManualArtifactCleanup(BasicStatusHolder statusHolder);
-}
diff --git a/base/api/src/main/java/org/artifactory/api/repo/cleanup/VirtualCacheCleanupService.java b/base/api/src/main/java/org/artifactory/api/repo/cleanup/VirtualCacheCleanupService.java
deleted file mode 100644
index 4b1222e..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/cleanup/VirtualCacheCleanupService.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo.cleanup;
-
-
-import org.artifactory.api.common.BasicStatusHolder;
-
-import javax.annotation.Nullable;
-
-/**
- * Interface for the VirtualCacheCleanupService
- *
- * @author Yoav Luft
- */
-public interface VirtualCacheCleanupService {
-
-    /**
-     * Manually schedule cleanup of virtual cache.
-     *
-     * @param multiStatusHolder Status holder that will hold the results
-     * @return task ID of the clean up task or null if failed to start.
-     */
-    @Nullable
-    String callVirtualCacheCleanup(BasicStatusHolder multiStatusHolder);
-}
diff --git a/base/api/src/main/java/org/artifactory/api/repo/exception/BlackedOutException.java b/base/api/src/main/java/org/artifactory/api/repo/exception/BlackedOutException.java
deleted file mode 100644
index 2c724ab..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/exception/BlackedOutException.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo.exception;
-
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.repo.RepoPath;
-
-/**
- * A rejection exception thrown when attempting to import to a blacked out repository
- *
- * @author Noam Y. Tenne
- */
-public class BlackedOutException extends RejectedArtifactException {
-
-    /**
-     * Main constructor
-     *
-     * @param rejectingRepo    The descriptor of the rejecting repo
-     * @param rejectedArtifact The repo path of the rejected artifact
-     */
-    public BlackedOutException(RepoDescriptor rejectingRepo, RepoPath rejectedArtifact) {
-        super(rejectingRepo, rejectedArtifact);
-    }
-
-    @Override
-    public String getMessage() {
-        return "The repository '" + rejectingRepo.getKey() + "' is blacked out and cannot serve artifact '" +
-                rejectedArtifact + "'.";
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/repo/exception/FileExpectedException.java b/base/api/src/main/java/org/artifactory/api/repo/exception/FileExpectedException.java
deleted file mode 100644
index ca96719..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/exception/FileExpectedException.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo.exception;
-
-import org.artifactory.repo.RepoPath;
-
-/**
- * This exception is thrown whenever a folder exists in the repository path but a file is expected.
- */
-public class FileExpectedException extends RuntimeException {
-    private final RepoPath repoPath;
-    private static final String MESSAGE_PREFIX = "Expected a file but found a folder, at: ";
-
-    public FileExpectedException(RepoPath repoPath) {
-        super(MESSAGE_PREFIX + repoPath);
-        this.repoPath = repoPath;
-    }
-
-    public RepoPath getRepoPath() {
-        return repoPath;
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/repo/exception/FolderExpectedException.java b/base/api/src/main/java/org/artifactory/api/repo/exception/FolderExpectedException.java
deleted file mode 100644
index 45a7afb..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/exception/FolderExpectedException.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo.exception;
-
-import org.artifactory.repo.RepoPath;
-
-public class FolderExpectedException extends RuntimeException {
-    private final RepoPath repoPath;
-    private static final String MESSAGE_PREFIX = "Expected a folder but found a file, at: ";
-
-    public FolderExpectedException(RepoPath repoPath) {
-        super(MESSAGE_PREFIX + repoPath);
-        this.repoPath = repoPath;
-    }
-
-    public RepoPath getRepoPath() {
-        return repoPath;
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/repo/exception/IncludeExcludeException.java b/base/api/src/main/java/org/artifactory/api/repo/exception/IncludeExcludeException.java
deleted file mode 100644
index ca00d62..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/exception/IncludeExcludeException.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo.exception;
-
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.repo.RepoPath;
-
-/**
- * A rejection exception thrown when the artifact path clashes with the include\exclude definitions
- *
- * @author Noam Y. Tenne
- */
-public class IncludeExcludeException extends RejectedArtifactException {
-
-    /**
-     * Main constructor
-     *
-     * @param status           Response status code
-     * @param rejectingRepo    The descriptor of the rejecting repo
-     * @param rejectedArtifact The repo path of the rejected artifact
-     */
-    public IncludeExcludeException(int status, RepoDescriptor rejectingRepo, RepoPath rejectedArtifact) {
-        super(status, rejectingRepo, rejectedArtifact);
-    }
-
-    @Override
-    public String getMessage() {
-        return "The repository '" + rejectingRepo.getKey() + "' rejected the artifact '" + rejectedArtifact +
-                "' due to its include/exclude pattern settings.";
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/repo/exception/ItemNotFoundRuntimeException.java b/base/api/src/main/java/org/artifactory/api/repo/exception/ItemNotFoundRuntimeException.java
deleted file mode 100644
index 9038f18..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/exception/ItemNotFoundRuntimeException.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo.exception;
-
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-
-/**
- * @author freds
- * @date Oct 24, 2008
- */
-public class ItemNotFoundRuntimeException extends RepositoryRuntimeException {
-    public ItemNotFoundRuntimeException(RepoPath repoPath) {
-        super("Item " + repoPath + " does not exist");
-    }
-
-    public ItemNotFoundRuntimeException(String message) {
-        super(message);
-    }
-
-    public ItemNotFoundRuntimeException(Throwable cause) {
-        super(cause);
-    }
-
-    public ItemNotFoundRuntimeException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/repo/exception/RejectedArtifactException.java b/base/api/src/main/java/org/artifactory/api/repo/exception/RejectedArtifactException.java
deleted file mode 100644
index 471bd42..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/exception/RejectedArtifactException.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo.exception;
-
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.repo.RepoPath;
-
-/**
- * An exception thrown when is rejected for deployment
- *
- * @author Noam Y. Tenne
- */
-public abstract class RejectedArtifactException extends RepoRejectException {
-
-    protected RepoDescriptor rejectingRepo;
-    protected RepoPath rejectedArtifact;
-
-    /**
-     * Main constructor
-     *
-     * @param rejectingRepo    The descriptor of the rejecting repo
-     * @param rejectedArtifact The repo path of the rejected artifact
-     */
-    public RejectedArtifactException(RepoDescriptor rejectingRepo, RepoPath rejectedArtifact) {
-        this.rejectingRepo = rejectingRepo;
-        this.rejectedArtifact = rejectedArtifact;
-    }
-
-    protected RejectedArtifactException(int status, RepoDescriptor rejectingRepo, RepoPath rejectedArtifact) {
-        super(status);
-        this.rejectingRepo = rejectingRepo;
-        this.rejectedArtifact = rejectedArtifact;
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/repo/exception/RepoAccessException.java b/base/api/src/main/java/org/artifactory/api/repo/exception/RepoAccessException.java
deleted file mode 100644
index 9a5e5f5..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/exception/RepoAccessException.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo.exception;
-
-import org.artifactory.repo.RepoPath;
-
-public class RepoAccessException extends RepoRejectException {
-
-    private final RepoPath repoPath;
-    private final String username;
-    private final String action;
-
-    public RepoAccessException(String message, RepoPath repoPath, String action, String username) {
-        super(message);
-        this.repoPath = repoPath;
-        this.username = username;
-        this.action = action;
-    }
-
-    @Override
-    public String getMessage() {
-        return super.getMessage() + " Action '" + action + "' is unauthorized for user '" + username + "' on '" +
-                repoPath + "'.";
-    }
-
-    @Override
-    public int getErrorCode() {
-        return 403; // forbidden
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/repo/exception/RepoRejectException.java b/base/api/src/main/java/org/artifactory/api/repo/exception/RepoRejectException.java
deleted file mode 100644
index 20654b7..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/exception/RepoRejectException.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo.exception;
-
-import org.artifactory.exception.CancelException;
-
-/**
- * An exception thrown when a repo rejects the deployment or retrieval of an item.
- *
- * @author Noam Y. Tenne
- */
-public class RepoRejectException extends Exception {
-
-    private int status = 404;
-
-    protected RepoRejectException() {
-        super();
-    }
-
-    protected RepoRejectException(int status) {
-        this.status = status;
-    }
-
-    /**
-     * Error message constructor
-     *
-     * @param message Error message
-     */
-    public RepoRejectException(String message) {
-        super(message);
-    }
-
-    /**
-     * Error message constructor
-     *
-     * @param message Error message
-     * @param status  The (http) error status
-     */
-    public RepoRejectException(String message, int status) {
-        super(message);
-        if (status > 0) {
-            this.status = status;
-        }
-    }
-
-    /**
-     * Cause constructor
-     *
-     * @param cause The nested exception
-     */
-    public RepoRejectException(Throwable cause) {
-        super(cause);
-        if (cause instanceof CancelException) {
-            status = ((CancelException) cause).getErrorCode();
-        }
-    }
-
-    /**
-     * Returns the HTTP error code associated with the thrown exception
-     *
-     * @return HTTP error code
-     */
-    public int getErrorCode() {
-        return status;
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/repo/exception/SnapshotPolicyException.java b/base/api/src/main/java/org/artifactory/api/repo/exception/SnapshotPolicyException.java
deleted file mode 100644
index aa9e619..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/exception/SnapshotPolicyException.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo.exception;
-
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.repo.RepoPath;
-
-/**
- * A rejection exception thrown when the snapshot policy of the artifact clashes with the snapshot policy of the target
- * repository
- *
- * @author Noam Y. Tenne
- */
-public class SnapshotPolicyException extends RejectedArtifactException {
-
-    /**
-     * Main constructor
-     *
-     * @param rejectingRepo    The descriptor of the rejecting repo
-     * @param rejectedArtifact The repo path of the rejected artifact
-     */
-    public SnapshotPolicyException(RepoDescriptor rejectingRepo, RepoPath rejectedArtifact) {
-        super(rejectingRepo, rejectedArtifact);
-    }
-
-    @Override
-    public String getMessage() {
-        return "The repository '" + rejectingRepo.getKey() + "' rejected the resolution of an artifact '" + rejectedArtifact +
-                "' due to conflict in the snapshot release handling policy.";
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * @return In case of snapshot policy rejection, should return 409 - Conflict.
-     */
-    @Override
-    public int getErrorCode() {
-        return 409;
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/repo/exception/maven/BadPomException.java b/base/api/src/main/java/org/artifactory/api/repo/exception/maven/BadPomException.java
deleted file mode 100644
index b92f974..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/exception/maven/BadPomException.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo.exception.maven;
-
-import java.io.IOException;
-
-/**
- * @author yoavl
- */
-public class BadPomException extends IOException {
-
-    public BadPomException(String message) {
-        super(message);
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/repo/index/MavenIndexerService.java b/base/api/src/main/java/org/artifactory/api/repo/index/MavenIndexerService.java
deleted file mode 100644
index 10f4b6b..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/index/MavenIndexerService.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo.index;
-
-import org.artifactory.common.MutableStatusHolder;
-
-import java.util.List;
-
-/**
- * @author yoavl
- */
-public interface MavenIndexerService {
-
-    /**
-     * Schedule the indexer to run immediately even if it is disabled
-     */
-    void scheduleImmediateIndexing(MutableStatusHolder statusHolder);
-
-    /**
-     * Run the indexer immediately for a specific repo even if it's not included
-     *
-     * @param statusHolder        holds the status of the started task which runs the indexer task
-     * @param repoKeys            Keys of repositories to index
-     * @param forceRemoteDownload force remote repo index download even if there is one at the cache and even if not
-     */
-    void runSpecificIndexer(MutableStatusHolder statusHolder, List<String> repoKeys, boolean forceRemoteDownload);
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/repo/storage/RepoStorageSummaryInfo.java b/base/api/src/main/java/org/artifactory/api/repo/storage/RepoStorageSummaryInfo.java
deleted file mode 100644
index e82103a..0000000
--- a/base/api/src/main/java/org/artifactory/api/repo/storage/RepoStorageSummaryInfo.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo.storage;
-
-import javax.annotation.Nonnull;
-import java.io.Serializable;
-
-/**
- * Represents a repository nodes summary.
- *
- * @author Yossi Shaul
- */
-public class RepoStorageSummaryInfo implements Serializable {
-
-    public enum RepositoryType {
-        LOCAL,
-        CACHE,
-        REMOTE,
-        VIRTUAL,
-        DISTRIBUTION,
-        BROKEN, // Used to indicate that the repository's type could not be determined
-        NA      // To be used with deliberately not stating type
-    }
-
-    private final String repoKey;
-    private final RepositoryType repoType;
-    private final long foldersCount;
-    private final long filesCount;
-    private final long usedSpace;
-    private long itemsCount;
-    private String type;
-
-    /**
-     * Creates a new empty repository summary.
-     *
-     * @param repoKey      The repository key
-     * @param repoType
-     * @param foldersCount Folders count of this repository
-     * @param filesCount   Files count of this repository
-     * @param usedSpace    Space, in bytes, used by the files in this repository
-     */
-    public RepoStorageSummaryInfo(@Nonnull String repoKey, RepositoryType repoType, long foldersCount, long filesCount,
-            long usedSpace, String type) {
-        this.repoKey = repoKey;
-        this.repoType = repoType;
-
-        this.filesCount = filesCount;
-        this.foldersCount = foldersCount;
-        this.usedSpace = usedSpace;
-        this.type = type;
-    }
-
-    /**
-     * @return The repository key
-     */
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    /**
-     * @return The repository type (Local, Cache, Remote, Virtual)
-     */
-    public RepositoryType getRepoType() {
-        return repoType;
-    }
-
-    /**
-     * @return Folders count of this repository (the repository folder itself is not included)
-     */
-    public long getFoldersCount() {
-        return foldersCount;
-    }
-
-    /**
-     * @return Files count of this repository
-     */
-    public long getFilesCount() {
-        return filesCount;
-    }
-
-    /**
-     * @return Space used by the files in this repository. In bytes.
-     */
-    public long getUsedSpace() {
-        return usedSpace;
-    }
-
-    /**
-     * @return Total items in the repository (sum of the folders and files count)
-     */
-    public long getItemsCount() {
-        return getFoldersCount() + getFilesCount();
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        RepoStorageSummaryInfo that = (RepoStorageSummaryInfo) o;
-
-        if (!repoKey.equals(that.repoKey)) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return repoKey.hashCode();
-    }
-
-    @Override
-    public String toString() {
-        final StringBuilder sb = new StringBuilder("RepoStorageSummaryInfo{");
-        sb.append("repoKey='").append(repoKey).append('\'');
-        sb.append(", repoType=").append(repoType);
-        sb.append(", filesCount=").append(filesCount);
-        sb.append(", foldersCount=").append(foldersCount);
-        sb.append(", usedSpace=").append(usedSpace);
-        sb.append('}');
-        return sb.toString();
-    }
-
-}
diff --git a/base/api/src/main/java/org/artifactory/api/request/ArtifactoryRequestBase.java b/base/api/src/main/java/org/artifactory/api/request/ArtifactoryRequestBase.java
deleted file mode 100644
index e1af2ea..0000000
--- a/base/api/src/main/java/org/artifactory/api/request/ArtifactoryRequestBase.java
+++ /dev/null
@@ -1,337 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.request;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.md.Properties;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.request.ArtifactoryRequest;
-import org.artifactory.util.PathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.Map;
-
-public abstract class ArtifactoryRequestBase implements ArtifactoryRequest {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryRequestBase.class);
-
-    private RepoPath repoPath;
-
-    /**
-     * A set of matrix parameters found on the request path in the form of:
-     * <p/>
-     * /pathseg1/pathseg2;param1=v1;param2=v2;param3=v3
-     */
-    private Properties properties = (Properties) InfoFactoryHolder.get().createProperties();
-
-    /**
-     * A path inside a zip file. The path never starts with leading slash. <p/> For example for path like
-     * /path/to/zip!/path/to/resource/in/zip the resource path is path/to/resource/in/zip
-     */
-    private String zipResourcePath;
-
-    private long modificationTime = -1;
-
-    @Override
-    public RepoPath getRepoPath() {
-        return repoPath;
-    }
-
-    @Override
-    public String getRepoKey() {
-        return repoPath.getRepoKey();
-    }
-
-    @Override
-    public String getPath() {
-        return repoPath.getPath();
-    }
-
-    @Override
-    public Properties getProperties() {
-        return properties;
-    }
-
-    @Override
-    public boolean hasProperties() {
-        return !properties.isEmpty();
-    }
-
-    @Override
-    public String getZipResourcePath() {
-        return zipResourcePath;
-    }
-
-    @Override
-    public boolean isZipResourceRequest() {
-        return StringUtils.isNotBlank(zipResourcePath);
-    }
-
-    @Override
-    public boolean isNoneMatch(String etag) {
-        if (StringUtils.isBlank(etag)) {
-            return true;
-        }
-        Enumeration ifNoneMatch = getHeaders("If-None-Match");
-        while (ifNoneMatch != null && ifNoneMatch.hasMoreElements()) {
-            Object requestIfNoneMatch = ifNoneMatch.nextElement();
-            if (etag.equals(requestIfNoneMatch)) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    @Override
-    public boolean hasIfNoneMatch() {
-        return getHeader("If-None-Match") != null;
-    }
-
-    @Override
-    public boolean isMetadata() {
-        return NamingUtils.isMetadata(getPath());
-    }
-
-    @Override
-    public boolean isChecksum() {
-        return NamingUtils.isChecksum(getPath()) || NamingUtils.isChecksum(zipResourcePath);
-    }
-
-    @Override
-    public String getName() {
-        return PathUtils.getFileName(getPath());
-    }
-
-    @Override
-    public boolean isNewerThan(long resourceLastModified) {
-        long modificationTime = getModificationTime();
-        //Check that the resource has a modification time and that it is older than the request's one.
-        //Since HTTP dates do not carry millisecond-level data compare with the value rounded-down to the nearest sec.
-        log.debug("Check isNewerThan. resourceLastModified={}, roundedResourceLastModified={}, modificationTime={}",
-                resourceLastModified, roundMillis(resourceLastModified), modificationTime);
-        return resourceLastModified >= 0 && roundMillis(resourceLastModified) <= modificationTime;
-    }
-
-    @Override
-    public long getModificationTime() {
-        //If not calculated yet
-        if (modificationTime < 0) {
-            //These headers are not filled by mvn lw-http wagon (doesn't call "getIfNewer")
-            long lastModified = getLastModified();
-            long ifModifiedSince = getIfModifiedSince();
-            if (lastModified < 0 && ifModifiedSince < 0) {
-                if (log.isDebugEnabled()) {
-                    log.debug("Neither If-Modified-Since nor Last-Modified are set");
-                }
-                return -1;
-            }
-            if (lastModified >= 0 && ifModifiedSince >= 0 && lastModified != ifModifiedSince) {
-                if (log.isDebugEnabled()) {
-                    log.warn(
-                            "If-Modified-Since (" + ifModifiedSince + ") AND Last-Modified (" + lastModified +
-                                    ") both set and unequal");
-                }
-
-            }
-            modificationTime = Math.max(lastModified, ifModifiedSince);
-        }
-        return modificationTime;
-    }
-
-    protected void setRepoPath(RepoPath repoPath) {
-        this.repoPath = repoPath;
-    }
-
-    protected void setZipResourcePath(String zipResourcePath) {
-        this.zipResourcePath = zipResourcePath;
-    }
-
-    public static long roundMillis(long time) {
-        if (time != -1) {
-            return (time / 1000) * 1000;
-        }
-        return time;
-    }
-
-    @Override
-    public String getParameter(String name) {
-        return null;
-    }
-
-    @Override
-    public Map<String, String[]> getParameters() {
-        return Collections.emptyMap();
-    }
-
-    @Override
-    public String[] getParameterValues(String name) {
-        return new String[0];
-    }
-
-    /**
-     * Decodes and calculates a repoPath based on the given servlet path (path after the context root, including the
-     * repo prefix).
-     */
-    @SuppressWarnings({"deprecation"})
-    protected RepoPath calculateRepoPath(String requestPath) throws UnsupportedEncodingException {
-        String repoKey = PathUtils.getFirstPathElement(requestPath);
-        // index where the path to the file or directory starts (i.e., the request path after the repository key)
-        int pathStartIndex;
-        if (NamingUtils.isMetadata(repoKey)) {
-            //Support repository-level metadata requests
-            repoKey = NamingUtils.stripMetadataFromPath(repoKey);
-            pathStartIndex = repoKey.length() + NamingUtils.METADATA_PREFIX.length();
-        } else if (LIST_BROWSING_PATH.equals(repoKey)) {
-            int repoKeyStartIndex = requestPath.indexOf(LIST_BROWSING_PATH) + LIST_BROWSING_PATH.length() + 1;
-            if (repoKeyStartIndex > requestPath.length()) {
-                repoKeyStartIndex--;    // request doesn't end with '/', no repo key
-            }
-            repoKey = PathUtils.getFirstPathElement(requestPath.substring(repoKeyStartIndex));
-            pathStartIndex = repoKeyStartIndex + repoKey.length() + 1;
-        } else if (ArtifactoryRequest.SIMPLE_BROWSING_PATH.equals(repoKey)) {
-            int repoKeyStartIndex = requestPath.indexOf(SIMPLE_BROWSING_PATH) + SIMPLE_BROWSING_PATH.length() + 1;
-            if (repoKeyStartIndex > requestPath.length()) {
-                repoKeyStartIndex--;    // request doesn't end with '/', no repo key
-            }
-            repoKey = PathUtils.getFirstPathElement(requestPath.substring(repoKeyStartIndex));
-            pathStartIndex = repoKeyStartIndex + repoKey.length() + 1;
-        } else {
-            pathStartIndex = requestPath.startsWith("/") ? repoKey.length() + 2 : repoKey.length() + 1;
-        }
-
-        //REPO HANDLING
-
-        //Calculate matrix params on the repo
-        repoKey = processMatrixParamsIfExist(repoKey);
-
-        /**
-         * Decode the repo key before performing sys-prop based substitution, otherwise the substitution would be based
-         * on the potentially encoded repo key
-         */
-        repoKey = URLDecoder.decode(repoKey, "UTF-8");
-
-        //Test if we need to substitute the targetRepo due to system prop existence
-        String substTargetRepo = ArtifactoryHome.get().getArtifactoryProperties().getSubstituteRepoKeys().get(repoKey);
-        if (substTargetRepo != null) {
-            repoKey = substTargetRepo;
-        }
-
-        //PATH HANDLING
-
-        //Strip any trailing '/'
-        boolean endsWithSlash = requestPath.endsWith("/");
-        int pathEndIndex = endsWithSlash ? requestPath.length() - 1 : requestPath.length();
-        String path = pathStartIndex < pathEndIndex ? requestPath.substring(pathStartIndex, pathEndIndex) : "";
-
-        //Calculate matrix params on the path and return path without matrix params
-        path = processMatrixParamsIfExist(path);
-
-        path = URLDecoder.decode(path.replace("+", "%2B"), "UTF-8").replace("%2B", "+");
-
-        // calculate zip resource path and return path without the zip resource path
-        path = processZipResourcePathIfExist(path);
-
-        return InfoFactoryHolder.get().createRepoPath(repoKey, path, endsWithSlash);
-    }
-
-    protected String processMatrixParamsIfExist(String fragment) {
-        int matrixParamStart = fragment.indexOf(Properties.MATRIX_PARAMS_SEP);
-        if (matrixParamStart > 0) {
-            processMatrixParams(this.properties, fragment.substring(matrixParamStart));
-            //Return the clean fragment
-            return fragment.substring(0, matrixParamStart);
-        } else {
-            return fragment;
-        }
-    }
-
-    /**
-     * Extracts the zip resource sub path from the path and returns the main resource path.<p/> For example if the
-     * request path is /path/to/zip!/path/to/resource/in/zip the method will detect '/path/to/resource/in/zip' as the
-     * zip resource path and will return '/path/to/zip' as the root path.
-     *
-     * @param path Valid path to resource in the repository
-     * @return The path without the zip resource sub path. Same path if it's not a zip resource request (i.e., doesn't
-     * contain '!' as part of the path).
-     */
-    private String processZipResourcePathIfExist(String path) {
-        String[] splitPath = PathUtils.splitZipResourcePathIfExist(path, false);
-        if (splitPath.length > 1) {
-            zipResourcePath = splitPath[1];
-        }
-        return splitPath[0];
-    }
-
-    @Override
-    public String toString() {
-        return "source=" + getClientAddress()
-                + ", path=" + getPath() + ", lastModified=" + getLastModified()
-                + ", ifModifiedSince=" + getIfModifiedSince();
-    }
-
-    /**
-     * Extracts the matrix params from the given strings and adds them to the properties object.<br> Note that the
-     * matrix params string must begin with matrix params, and any params found are omitted, so only the rest of the
-     * path (if exists) will remain in the string.
-     *
-     * @param propertyCollection Property collection to append to. Cannot be null
-     * @param matrixParams       Matrix params to process. Cannot be null
-     */
-    public static void processMatrixParams(Properties propertyCollection, String matrixParams) {
-        int matrixParamStart = 0;
-        do {
-            int matrixParamEnd = matrixParams.indexOf(Properties.MATRIX_PARAMS_SEP, matrixParamStart + 1);
-            if (matrixParamEnd < 0) {
-                matrixParamEnd = matrixParams.length();
-            }
-            String param = matrixParams.substring(matrixParamStart + 1, matrixParamEnd);
-            int equals = param.indexOf('=');
-            if (equals > 0) {
-                String key = param.substring(0, equals);
-                String value = param.substring(equals + 1);
-                // url-decode the value
-                try {
-                    value = URLDecoder.decode(value, "UTF-8");
-                } catch (UnsupportedEncodingException e) {
-                    log.warn("Encoding not supported: {}. Using original value", e.getMessage());
-                }
-                propertyCollection.put(key, value);
-            } else if (param.length() > 0) {
-                propertyCollection.put(param, "");
-            } // else no key declared, ignore
-            matrixParamStart = matrixParamEnd;
-        } while (matrixParamStart > 0 && matrixParamStart < matrixParams.length());
-    }
-
-    @Override
-    public boolean isDirectoryRequest() {
-        String uri = this.getUri();
-        boolean endsWithSlash = uri.endsWith("/");
-        boolean containsSlashWithSemicolon = uri.contains("/;");
-        boolean lastSlashIndex = uri.lastIndexOf("/;") >= uri.lastIndexOf("/");
-        return endsWithSlash || (containsSlashWithSemicolon && lastSlashIndex);
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/request/ArtifactoryResponse.java b/base/api/src/main/java/org/artifactory/api/request/ArtifactoryResponse.java
deleted file mode 100644
index 5ee4649..0000000
--- a/base/api/src/main/java/org/artifactory/api/request/ArtifactoryResponse.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.request;
-
-import org.artifactory.common.StatusHolder;
-import org.slf4j.Logger;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Writer;
-
-public interface ArtifactoryResponse {
-
-    String ARTIFACTORY_ID = "X-Artifactory-Id";
-
-    boolean isError();
-
-    void setLastModified(long lastModified);
-
-    void setEtag(String etag);
-
-    void setSha1(String sha1);
-
-    void setMd5(String md5);
-
-    void setRangeSupport(String bytes);
-
-    long getContentLength();
-
-    void setContentLength(long length);
-
-    void setContentType(String contentType);
-
-    Writer getWriter() throws IOException;
-
-    void sendInternalError(Exception exception, Logger logger) throws IOException;
-
-    void sendError(int statusCode, String reason, Logger logger) throws IOException;
-
-    void sendError(StatusHolder statusHolder) throws IOException;
-
-    void sendStream(InputStream is) throws IOException;
-
-    void sendSuccess();
-
-    int getStatus();
-
-    void setStatus(int statusCode);
-
-    void setHeader(String header, String value);
-
-    boolean isCommitted();
-
-    boolean isSuccessful();
-
-    void flush();
-
-    void sendAuthorizationRequired(String message, String realm) throws IOException;
-
-    boolean isPropertiesQuery();
-
-    String getPropertiesMediaType();
-
-    void setPropertiesMediaType(String propsQueryFormat);
-
-    void close(Closeable closeable);
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/request/DownloadService.java b/base/api/src/main/java/org/artifactory/api/request/DownloadService.java
deleted file mode 100644
index 78b0f70..0000000
--- a/base/api/src/main/java/org/artifactory/api/request/DownloadService.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.request;
-
-import org.artifactory.api.repo.Request;
-import org.artifactory.api.repo.exception.FileExpectedException;
-import org.artifactory.request.ArtifactoryRequest;
-
-import java.io.IOException;
-
-/**
- * User: freds Date: Aug 3, 2008 Time: 7:57:48 PM
- */
-public interface DownloadService {
-
-    @Request(aggregateEventsByTimeWindow = true)
-    void process(ArtifactoryRequest request, ArtifactoryResponse response) throws IOException, FileExpectedException;
-}
diff --git a/base/api/src/main/java/org/artifactory/api/request/InternalArtifactoryRequest.java b/base/api/src/main/java/org/artifactory/api/request/InternalArtifactoryRequest.java
deleted file mode 100644
index cbd19ee..0000000
--- a/base/api/src/main/java/org/artifactory/api/request/InternalArtifactoryRequest.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.request;
-
-import com.google.common.collect.Maps;
-import org.apache.commons.collections.iterators.IteratorEnumeration;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.repo.RepoPath;
-
-import java.io.InputStream;
-import java.util.*;
-
-/**
- * An internal resource request that is sent by Artifactory itself to the DownloadService asking for a resource.
- *
- * @author Yossi Shaul
- */
-public class InternalArtifactoryRequest extends ArtifactoryRequestBase {
-
-    private boolean skipJarIndexing;
-    // set this flag to true if Artifactory should mark uploaded artifacts with trusted checksums mark
-    private boolean trustServerChecksums;
-
-    private boolean forceDownloadIfNewer;
-
-    private Boolean searchForExistingResourceOnRemoteRequest;
-
-    private Boolean replicationDownloadRequest;
-
-    private Boolean disableFolderRedirectAssertion;
-
-    private String alternativeRemoteDownloadUrl;
-
-    private String servletContextUrl = "";
-
-    private Boolean replaceHeadRequestWithGet;
-
-    private boolean skipEncoding;
-
-    private Map<String, String> headers = Maps.newHashMap();
-
-    private final Set<String> delegationAllowedHeaders;
-
-    public InternalArtifactoryRequest(RepoPath repoPath) {
-        String repoKey = processMatrixParamsIfExist(repoPath.getRepoKey());
-        String path = processMatrixParamsIfExist(repoPath.getPath());
-        setRepoPath(InfoFactoryHolder.get().createRepoPath(repoKey, path));
-        delegationAllowedHeaders = new HashSet<>();
-    }
-
-    @Override
-    public long getLastModified() {
-        return 0;
-    }
-
-    /**
-     * @return false - internal requests are sent to download resources
-     */
-    @Override
-    public boolean isHeadOnly() {
-        return false;
-    }
-
-    @Override
-    public String getClientAddress() {
-        return null;
-    }
-
-    @Override
-    public long getIfModifiedSince() {
-        return 0;
-    }
-
-    @Override
-    public boolean hasIfModifiedSince() {
-        return false;
-    }
-
-    @Override
-    public boolean isFromAnotherArtifactory() {
-        return false;
-    }
-
-    @Override
-    public boolean isRecursive() {
-        return false;
-    }
-
-    /**
-     * @return null - the internal request has no input stream
-     */
-    @Override
-    public InputStream getInputStream() {
-        return null;
-    }
-
-    /**
-     * @return 0 - the internal request has no content (only url and headers)
-     */
-    @Override
-    public long getContentLength() {
-        return 0;
-    }
-
-    @Override
-    public String getHeader(String headerName) {
-        return headers.get(headerName);
-    }
-
-    @Override
-    public Enumeration getHeaders(String headerName) {
-        return new IteratorEnumeration(headers.values().iterator());
-    }
-
-    public Map<String, String> getHeaders() {
-        return headers;
-    }
-
-    public void addHeader(String key, String value) {
-        this.headers.put(key, value);
-    }
-
-    /**
-     * Adds http header eligible for remote host delegation, for more details
-     * @see {@link org.artifactory.api.request.InternalArtifactoryRequest#getDelegationAllowedHeaders()}
-     *
-     * @param key header name
-     * @param value header value
-     */
-    public void addHeaderEligibleForDelegation(String key, String value) {
-        delegationAllowedHeaders.add(key);
-        addHeader(key, value);
-    }
-
-    public void addHeaders(Map<String, String> headers) {
-        this.headers.putAll(headers);
-    }
-
-    @Override
-    public String getUri() {
-        return "";
-    }
-
-    @Override
-    public String getServletContextUrl() {
-        return servletContextUrl;
-    }
-
-    public void setServletContextUrl(String servletContextUrl) {
-        this.servletContextUrl = servletContextUrl;
-    }
-
-    public void setSkipJarIndexing(boolean skipJarIndexing) {
-        this.skipJarIndexing = skipJarIndexing;
-    }
-
-    public void setTrustServerChecksums(boolean trustServerChecksums) {
-        this.trustServerChecksums = trustServerChecksums;
-    }
-
-    public boolean isSkipEncoding() {
-        return skipEncoding;
-    }
-
-    public boolean isSkipJarIndexing() {
-        return skipJarIndexing;
-    }
-
-    public boolean isTrustServerChecksums() {
-        return trustServerChecksums;
-    }
-
-    public boolean isForceDownloadIfNewer() {
-        return forceDownloadIfNewer;
-    }
-
-    public void setForceDownloadIfNewer(boolean forceDownloadIfNewer) {
-        this.forceDownloadIfNewer = forceDownloadIfNewer;
-    }
-
-    public void setSearchForExistingResourceOnRemoteRequest(boolean searchForExistingResourceOnRemoteRequest) {
-        this.searchForExistingResourceOnRemoteRequest = searchForExistingResourceOnRemoteRequest;
-    }
-
-    public void setAlternativeRemoteDownloadUrl(String alternativeRemoteDownloadUrl) {
-        this.alternativeRemoteDownloadUrl = alternativeRemoteDownloadUrl;
-    }
-
-    public void setReplicationDownloadRequest(Boolean replicationDownloadRequest) {
-        this.replicationDownloadRequest = replicationDownloadRequest;
-    }
-
-    public void setDisableFolderRedirectAssertion(Boolean disableFolderRedirectAssertion) {
-        this.disableFolderRedirectAssertion = disableFolderRedirectAssertion;
-    }
-
-    public void setReplaceHeadRequestWithGet(Boolean replaceHeadRequestWithGet) {
-        this.replaceHeadRequestWithGet = replaceHeadRequestWithGet;
-    }
-
-    public void setSkipEncoding(boolean skipEncoding) {
-        this.skipEncoding = skipEncoding;
-    }
-
-    @Override
-    public void setZipResourcePath(String zipResourcePath) {
-        super.setZipResourcePath(zipResourcePath);
-    }
-
-    @Override
-    public String getParameter(String name) {
-        if (PARAM_SKIP_JAR_INDEXING.equals(name)) {
-            return String.valueOf(skipJarIndexing);
-        }
-        if (PARAM_FORCE_DOWNLOAD_IF_NEWER.equals(name)) {
-            return String.valueOf(forceDownloadIfNewer);
-        }
-        if (PARAM_SEARCH_FOR_EXISTING_RESOURCE_ON_REMOTE_REQUEST.equals(name) &&
-                searchForExistingResourceOnRemoteRequest != null) {
-            return String.valueOf(searchForExistingResourceOnRemoteRequest);
-        }
-        if (PARAM_ALTERNATIVE_REMOTE_DOWNLOAD_URL.equals(name)) {
-            return alternativeRemoteDownloadUrl;
-        }
-        if (PARAM_REPLICATION_DOWNLOAD_REQUESET.equals(name)) {
-            return String.valueOf(replicationDownloadRequest);
-        }
-        if (PARAM_FOLDER_REDIRECT_ASSERTION.equals(name)) {
-            return String.valueOf(disableFolderRedirectAssertion);
-        }
-        if (PARAM_REPLACE_HEAD_IN_RETRIEVE_INFO_WITH_GET.equals(name)) {
-            return String.valueOf(replaceHeadRequestWithGet);
-        }
-        if (PARAM_SKIP_ENCODING.equals(name)) {
-            return String.valueOf(skipEncoding);
-        }
-        return null;
-    }
-
-    @Override
-    public String[] getParameterValues(String name) {
-        String val = getParameter(name);
-        if (val != null) {
-            return new String[]{val};
-        } else {
-            return super.getParameterValues(name);
-        }
-    }
-
-    /**
-     * A list of headers that can be delegated to the
-     * remote host,
-     *
-     * This is white-list filtering that used for preventing from
-     * unauthorized headers leaking to the external request
-     * towards destination server.
-     *
-     * Service willing to allow certain header being delegated
-     * to remote host, should explicitly mark it as eligible
-     * for that by registering it in DelegationAllowedHeaders set
-     * via {@link org.artifactory.api.request.InternalArtifactoryRequest#addHeaderEligibleForDelegation(String, String)}
-     *
-     * @return Set<String>
-     */
-    public Set<String> getDelegationAllowedHeaders() {
-        return Collections.unmodifiableSet(delegationAllowedHeaders);
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/request/TranslatedArtifactoryRequest.java b/base/api/src/main/java/org/artifactory/api/request/TranslatedArtifactoryRequest.java
deleted file mode 100644
index bc61a13..0000000
--- a/base/api/src/main/java/org/artifactory/api/request/TranslatedArtifactoryRequest.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.request;
-
-import org.artifactory.md.Properties;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.request.ArtifactoryRequest;
-import org.artifactory.util.PathUtils;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Enumeration;
-import java.util.Map;
-
-/**
- * @author Noam Y. Tenne
- */
-public class TranslatedArtifactoryRequest implements ArtifactoryRequest {
-
-    private RepoPath translatedRepoPath;
-    private ArtifactoryRequest originalRequest;
-
-    public TranslatedArtifactoryRequest(RepoPath translatedRepoPath, ArtifactoryRequest originalRequest) {
-        this.translatedRepoPath = translatedRepoPath;
-        this.originalRequest = originalRequest;
-    }
-
-    @Override
-    public String getRepoKey() {
-        return translatedRepoPath.getRepoKey();
-    }
-
-    @Override
-    public String getPath() {
-        return translatedRepoPath.getPath();
-    }
-
-    @Override
-    public String getClientAddress() {
-        return originalRequest.getClientAddress();
-    }
-
-    @Override
-    public boolean isMetadata() {
-        return NamingUtils.isMetadata(getPath());
-    }
-
-    @Override
-    public boolean isRecursive() {
-        return originalRequest.isRecursive();
-    }
-
-    @Override
-    public long getModificationTime() {
-        return originalRequest.getModificationTime();
-    }
-
-    @Override
-    public String getName() {
-        return PathUtils.getFileName(getPath());
-    }
-
-    @Override
-    public boolean isDirectoryRequest() {
-        return originalRequest.isDirectoryRequest();
-    }
-
-    @Override
-    public RepoPath getRepoPath() {
-        return translatedRepoPath;
-    }
-
-    @Override
-    public boolean isChecksum() {
-        return NamingUtils.isChecksum(getPath()) || NamingUtils.isChecksum(originalRequest.getZipResourcePath());
-    }
-
-    @Override
-    public boolean isFromAnotherArtifactory() {
-        return originalRequest.isFromAnotherArtifactory();
-    }
-
-    @Override
-    public boolean isHeadOnly() {
-        return originalRequest.isHeadOnly();
-    }
-
-    @Override
-    public long getLastModified() {
-        return originalRequest.getLastModified();
-    }
-
-    @Override
-    public long getIfModifiedSince() {
-        return originalRequest.getIfModifiedSince();
-    }
-
-    @Override
-    public boolean hasIfModifiedSince() {
-        return originalRequest.hasIfModifiedSince();
-    }
-
-    @Override
-    public boolean isNewerThan(long time) {
-        return originalRequest.isNewerThan(time);
-    }
-
-    @Override
-    public String getHeader(String headerName) {
-        return originalRequest.getHeader(headerName);
-    }
-
-    @Override
-    public Enumeration getHeaders(String headerName) {
-        return originalRequest.getHeaders(headerName);
-    }
-
-    @Override
-    public Map<String, String> getHeaders() {
-        return originalRequest.getHeaders();
-    }
-
-    @Override
-    public String getServletContextUrl() {
-        return originalRequest.getServletContextUrl();
-    }
-
-    @Override
-    public String getUri() {
-        return originalRequest.getUri();
-    }
-
-    @Override
-    public Properties getProperties() {
-        return originalRequest.getProperties();
-    }
-
-    @Override
-    public boolean hasProperties() {
-        return originalRequest.hasProperties();
-    }
-
-    @Override
-    public Map<String, String[]> getParameters() {
-        return originalRequest.getParameters();
-    }
-
-    @Override
-    public String getZipResourcePath() {
-        return originalRequest.getZipResourcePath();
-    }
-
-    @Override
-    public boolean isZipResourceRequest() {
-        return originalRequest.isZipResourceRequest();
-    }
-
-    @Override
-    public String getParameter(String name) {
-        return originalRequest.getParameter(name);
-    }
-
-    @Override
-    public String[] getParameterValues(String name) {
-        return originalRequest.getParameterValues(name);
-    }
-
-    @Override
-    public InputStream getInputStream() throws IOException {
-        return originalRequest.getInputStream();
-    }
-
-    @Override
-    public long getContentLength() {
-        return originalRequest.getContentLength();
-    }
-
-    @Override
-    public boolean isNoneMatch(String etag) {
-        return originalRequest.isNoneMatch(etag);
-    }
-
-    @Override
-    public boolean hasIfNoneMatch() {
-        return originalRequest.hasIfNoneMatch();
-    }
-
-    @Override
-    public String toString() {
-        return "source=" + getClientAddress()
-                + ", path=" + getPath() + ", lastModified=" + getLastModified()
-                + ", ifModifiedSince=" + getIfModifiedSince();
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/request/UploadService.java b/base/api/src/main/java/org/artifactory/api/request/UploadService.java
deleted file mode 100644
index 137bd6a..0000000
--- a/base/api/src/main/java/org/artifactory/api/request/UploadService.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.request;
-
-import org.artifactory.api.repo.Request;
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.request.ArtifactoryRequest;
-
-import java.io.IOException;
-
-public interface UploadService {
-    @Request(aggregateEventsByTimeWindow = true)
-    void upload(ArtifactoryRequest request, ArtifactoryResponse response) throws IOException, RepoRejectException;
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/rest/Link.java b/base/api/src/main/java/org/artifactory/api/rest/Link.java
deleted file mode 100644
index e44016b..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/Link.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest;
-
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-
-import java.io.Serializable;
-
-/**
- * A resource link
- *
- * @author yoavl
- */
- at XStreamAlias("link")
-public class Link implements Serializable {
-    public static final String REL_SELF = "self";
-
-    public final String href;
-    public final String rel;
-    public final String type;
-
-    public Link(String href) {
-        this(href, REL_SELF);
-    }
-
-    public Link(String href, String type) {
-        this(href, REL_SELF, type);
-    }
-
-    public Link(String href, String rel, String type) {
-        this.href = href;
-        this.rel = rel;
-        this.type = type;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        Link link = (Link) o;
-        return href.equals(link.href) && rel.equals(link.rel) &&
-                !(type != null ? !type.equals(link.type) : link.type != null);
-
-    }
-
-    @Override
-    public int hashCode() {
-        int result = href.hashCode();
-        result = 31 * result + rel.hashCode();
-        result = 31 * result + (type != null ? type.hashCode() : 0);
-        return result;
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/rest/artifact/FileList.java b/base/api/src/main/java/org/artifactory/api/rest/artifact/FileList.java
deleted file mode 100644
index 4992d76..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/artifact/FileList.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.artifact;
-
-import javax.annotation.Nullable;
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * File list REST command result object
- *
- * @author Noam Y. Tenne
- */
-public class FileList implements Serializable {
-
-    String uri;
-    String created;
-    List<FileListElement> files;
-
-    /**
-     * Default constructor
-     */
-    public FileList() {
-    }
-
-    /**
-     * Full constructor
-     *
-     * @param uri     URI of request sent by user
-     * @param created The ISO8601 time the result was assembled
-     * @param files   List of folders found
-     */
-    public FileList(@Nullable String uri, String created, List<FileListElement> files) {
-        this.uri = uri;
-        this.created = created;
-        this.files = files;
-    }
-
-    /**
-     * Returns the URI of the request
-     *
-     * @return Request URI
-     */
-    @Nullable
-    public String getUri() {
-        return uri;
-    }
-
-    /**
-     * Sets the URI of the request
-     *
-     * @param uri Request URI
-     */
-    public void setUri(@Nullable String uri) {
-        this.uri = uri;
-    }
-
-    /**
-     * Returns the creation time of the result
-     *
-     * @return Result creation time
-     */
-    public String getCreated() {
-        return created;
-    }
-
-    /**
-     * Sets the creation time of the result
-     *
-     * @param created Result creation time
-     */
-    public void setCreated(String created) {
-        this.created = created;
-    }
-
-    /**
-     * Returns the list of files found
-     *
-     * @return Found file list
-     */
-    public List<FileListElement> getFiles() {
-        return files;
-    }
-
-    /**
-     * List of files found
-     *
-     * @param files Found file list
-     */
-    public void setFiles(List<FileListElement> files) {
-        this.files = files;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/artifact/FileListElement.java b/base/api/src/main/java/org/artifactory/api/rest/artifact/FileListElement.java
deleted file mode 100644
index 6ac94ca..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/artifact/FileListElement.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.artifact;
-
-import com.google.common.collect.Maps;
-
-import java.io.Serializable;
-import java.util.Map;
-
-/**
- * A found file element of the File List REST command
- *
- * @author Noam Y. Tenne
- */
-public class FileListElement implements Serializable {
-
-    String uri;
-    long size;
-    String lastModified;
-    boolean folder;
-    String sha1;
-    Map<String, String> mdTimestamps;
-
-    public FileListElement() {
-    }
-
-    /**
-     * Full constructor
-     *
-     * @param uri          URI of file relative to the request path
-     * @param size         Physical size of file in bytes
-     * @param lastModified The ISO8601 time the file was last modified
-     * @param folder       True if item is a folder
-     */
-    public FileListElement(String uri, long size, String lastModified, boolean folder) {
-        this.uri = uri;
-        this.size = size;
-        this.lastModified = lastModified;
-        this.folder = folder;
-    }
-
-    /**
-     * Returns the URI of the file relative to the request path
-     *
-     * @return Request path-relative URI of file
-     */
-    public String getUri() {
-        return uri;
-    }
-
-    /**
-     * Sets the URI of the file relative to the request path
-     *
-     * @param uri Request path-relative URI of file
-     */
-    public void setUri(String uri) {
-        this.uri = uri;
-    }
-
-    /**
-     * Returns the physical size of the file in bytes
-     *
-     * @return File physical size in bytes
-     */
-    public long getSize() {
-        return size;
-    }
-
-    /**
-     * Sets the physical size of the file in bytes
-     *
-     * @param size File physical size in bytes
-     */
-    public void setSize(long size) {
-        this.size = size;
-    }
-
-    /**
-     * Returns the time the file was last modified
-     *
-     * @return File last modified time
-     */
-    public String getLastModified() {
-        return lastModified;
-    }
-
-    /**
-     * Sets the time the file was last modified
-     *
-     * @param lastModified File last modified time
-     */
-    public void setLastModified(String lastModified) {
-        this.lastModified = lastModified;
-    }
-
-    /**
-     * Indicates whether this element is a folder
-     *
-     * @return True if a folder
-     */
-    public boolean isFolder() {
-        return folder;
-    }
-
-    /**
-     * Sets the folder indication
-     *
-     * @param folder True if a folder
-     */
-    public void setFolder(boolean folder) {
-        this.folder = folder;
-    }
-
-    public String getSha1() {
-        return sha1;
-    }
-
-    public void setSha1(String sha1) {
-        this.sha1 = sha1;
-    }
-
-    public Map<String, String> getMdTimestamps() {
-        return mdTimestamps;
-    }
-
-    public void setMdTimestamps(Map<String, String> mdTimestamps) {
-        this.mdTimestamps = mdTimestamps;
-    }
-
-    public void addMdTimestamp(String metadataName, String timestamp) {
-        if (mdTimestamps == null) {
-            mdTimestamps = Maps.newHashMap();
-        }
-        mdTimestamps.put(metadataName, timestamp);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof FileListElement)) {
-            return false;
-        }
-
-        FileListElement that = (FileListElement) o;
-
-        if (folder != that.folder) {
-            return false;
-        }
-        if (size != that.size) {
-            return false;
-        }
-        if (lastModified != null ? !lastModified.equals(that.lastModified) : that.lastModified != null) {
-            return false;
-        }
-        if (uri != null ? !uri.equals(that.uri) : that.uri != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = uri != null ? uri.hashCode() : 0;
-        result = 31 * result + (int) (size ^ (size >>> 32));
-        result = 31 * result + (lastModified != null ? lastModified.hashCode() : 0);
-        result = 31 * result + (folder ? 1 : 0);
-        return result;
-    }
-
-    @Override
-    public String toString() {
-        return uri;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/artifact/ItemLastModified.java b/base/api/src/main/java/org/artifactory/api/rest/artifact/ItemLastModified.java
deleted file mode 100644
index 99b7e36..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/artifact/ItemLastModified.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.artifact;
-
-import java.io.Serializable;
-
-/**
- * Represents the latest modified item in a request base
- *
- * @author Noam Y. Tenne
- */
-public class ItemLastModified implements Serializable {
-
-    private String uri;
-    private String lastModified;
-
-    public ItemLastModified() {
-    }
-
-    public ItemLastModified(String uri, String lastModified) {
-        this.uri = uri;
-        this.lastModified = lastModified;
-    }
-
-    public String getUri() {
-        return uri;
-    }
-
-    public void setUri(String uri) {
-        this.uri = uri;
-    }
-
-    public String getLastModified() {
-        return lastModified;
-    }
-
-    public void setLastModified(String lastModified) {
-        this.lastModified = lastModified;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/artifact/ItemPermissions.java b/base/api/src/main/java/org/artifactory/api/rest/artifact/ItemPermissions.java
deleted file mode 100644
index 9f95e37..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/artifact/ItemPermissions.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.artifact;
-
-import java.io.Serializable;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Noam Y. Tenne
- */
-public class ItemPermissions implements Serializable {
-
-    private String uri;
-    private Principals principals;
-
-    public ItemPermissions() {
-    }
-
-    public ItemPermissions(String uri, Principals principals) {
-        this.uri = uri;
-        this.principals = principals;
-    }
-
-    public String getUri() {
-        return uri;
-    }
-
-    public void setUri(String uri) {
-        this.uri = uri;
-    }
-
-    public Principals getPrincipals() {
-        return principals;
-    }
-
-    public void setPrincipals(Principals principals) {
-        this.principals = principals;
-    }
-
-    public static class Principals implements Serializable {
-
-        Map<String, Set<String>> users;
-        Map<String, Set<String>> groups;
-
-        public Principals() {
-        }
-
-        public Principals(Map<String, Set<String>> users, Map<String, Set<String>> groups) {
-            this.users = users;
-            this.groups = groups;
-        }
-
-        public Map<String, Set<String>> getUsers() {
-            return users;
-        }
-
-        public void setUsers(Map<String, Set<String>> users) {
-            this.users = users;
-        }
-
-        public Map<String, Set<String>> getGroups() {
-            return groups;
-        }
-
-        public void setGroups(Map<String, Set<String>> groups) {
-            this.groups = groups;
-        }
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/artifact/ItemProperties.java b/base/api/src/main/java/org/artifactory/api/rest/artifact/ItemProperties.java
deleted file mode 100644
index 09ad43c..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/artifact/ItemProperties.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.artifact;
-
-import com.google.common.collect.Maps;
-
-import javax.xml.bind.annotation.XmlElement;
-import java.util.Map;
-
-/**
- * Wrapper class for the properties and URI in JSON format.
- *
- * @author Tomer Cohen
- */
-public class ItemProperties {
-    @XmlElement(name = "uri")
-    public String slf;
-
-    /**
-     * Map of the properties
-     */
-    public Map<String, String[]> properties = Maps.newTreeMap();
-
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/artifact/ItemStatsInfo.java b/base/api/src/main/java/org/artifactory/api/rest/artifact/ItemStatsInfo.java
deleted file mode 100644
index d4badda..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/artifact/ItemStatsInfo.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package org.artifactory.api.rest.artifact;
-
-import org.artifactory.fs.StatsInfo;
-import org.codehaus.jackson.annotate.JsonIgnore;
-
-import java.io.Serializable;
-
-/**
- * @author Yoav Luft
- */
-public class ItemStatsInfo implements StatsInfo, Serializable {
-
-    private String uri;
-    private long downloadCount;
-    private long lastDownloaded;
-    private String lastDownloadedBy;
-
-    private long remoteDownloadCount;
-    private long remoteLastDownloaded;
-    private String remoteLastDownloadedBy;
-    private String origin;
-
-    public ItemStatsInfo() {
-    }
-
-    public ItemStatsInfo(String uri, long downloadCount, long lastDownloaded,
-            String lastDownloadedBy) {
-        this.uri = uri;
-        this.downloadCount = downloadCount;
-        this.lastDownloaded = lastDownloaded;
-        this.lastDownloadedBy = lastDownloadedBy;
-    }
-
-    public ItemStatsInfo(String uri, long downloadCount, long lastDownloaded,
-            String lastDownloadedBy, String origin) {
-        this.uri = uri;
-        this.downloadCount = downloadCount;
-        this.lastDownloaded = lastDownloaded;
-        this.lastDownloadedBy = lastDownloadedBy;
-        this.origin = origin;
-    }
-
-    public void setUri(String uri) {
-        this.uri = uri;
-    }
-
-    public void setDownloadCount(long downloadCount) {
-        this.downloadCount = downloadCount;
-    }
-
-    public void setLastDownloaded(long lastDownloaded) {
-        this.lastDownloaded = lastDownloaded;
-    }
-
-    public void setLastDownloadedBy(String lastDownloadedBy) {
-        this.lastDownloadedBy = lastDownloadedBy;
-    }
-
-    public String getUri() {
-        return uri;
-    }
-
-    @Override
-    public long getDownloadCount() {
-        return downloadCount;
-    }
-
-    @Override
-    public long getLastDownloaded() {
-        return lastDownloaded;
-    }
-
-    @Override
-    public String getLastDownloadedBy() {
-        return lastDownloadedBy;
-    }
-
-    @Override
-    public long getRemoteDownloadCount() {
-        return remoteDownloadCount;
-    }
-
-    @Override
-    public long getRemoteLastDownloaded() {
-        return remoteLastDownloaded;
-    }
-
-    @Override
-    public String getRemoteLastDownloadedBy() {
-        return remoteLastDownloadedBy;
-    }
-
-    @JsonIgnore
-    @Override
-    public String getPath() {
-        return null;
-    }
-
-    @Override
-    public String getOrigin() {
-        return origin;
-    }
-
-    public void setOrigin(String origin) {
-        this.origin = origin;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/artifact/PromotionResult.java b/base/api/src/main/java/org/artifactory/api/rest/artifact/PromotionResult.java
deleted file mode 100644
index 23dfd36..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/artifact/PromotionResult.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.artifact;
-
-import com.google.common.collect.Lists;
-import org.artifactory.common.StatusEntry;
-import org.artifactory.common.StatusEntryLevel;
-
-import java.util.List;
-
-/**
- * @author Noam Y. Tenne
- */
-public class PromotionResult {
-
-    public List<PromotionResultMessages> messages = Lists.newArrayList();
-
-    public static class PromotionResultMessages {
-        public String level;
-        public String message;
-
-        public PromotionResultMessages(StatusEntry statusEntry) {
-            this.level = statusEntry.getLevel().name();
-            this.message = statusEntry.getMessage();
-        }
-
-        public PromotionResultMessages(StatusEntryLevel level, String message) {
-            this.level = level.name();
-            this.message = message;
-        }
-
-        private PromotionResultMessages() {
-        }
-    }
-
-    public boolean errorsOrWarningHaveOccurred() {
-        for (PromotionResultMessages message : messages) {
-
-            if (StatusEntryLevel.ERROR.name().equals(message.level) ||
-                    StatusEntryLevel.WARNING.name().equals(message.level)) {
-                return true;
-            }
-        }
-        return false;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/artifact/RepairPathConflictsResult.java b/base/api/src/main/java/org/artifactory/api/rest/artifact/RepairPathConflictsResult.java
deleted file mode 100644
index 8fa04c0..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/artifact/RepairPathConflictsResult.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.artifact;
-
-import com.google.common.collect.Lists;
-
-import javax.xml.bind.annotation.XmlType;
-import java.util.List;
-
-/**
- * Container for path conflict repair results
- * @author Yoav Luft
- */
-public class RepairPathConflictsResult {
-
-    public String message;
-    public long numConflicts;
-    public long numRepaired;
-    public List<PathConflict> conflicts;
-
-    public RepairPathConflictsResult(String message) {
-        this.message = message;
-    }
-
-    public RepairPathConflictsResult(List<PathConflict> conflicts, String message) {
-        this.conflicts = conflicts;
-        this.numConflicts = conflicts.size();
-        this.message = message;
-    }
-
-    @XmlType(name = "PathConflict", propOrder = {"path", "conflicts"})
-    public static class PathConflict {
-
-        private String path;
-        private List<String> conflicts = Lists.newArrayListWithCapacity(2);
-
-        // Required by JABX
-        @SuppressWarnings("unused")
-        public PathConflict() { }
-
-        public PathConflict(String path) {
-            this.path = path;
-            this.conflicts = Lists.newArrayList();
-        }
-
-        public void add(String path) {
-            conflicts.add(path);
-        }
-
-        public String getPath() {
-            return path;
-        }
-
-        public List<String> getConflicts() {
-            return conflicts;
-        }
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/artifact/RestBaseStorageInfo.java b/base/api/src/main/java/org/artifactory/api/rest/artifact/RestBaseStorageInfo.java
deleted file mode 100644
index 4defb41..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/artifact/RestBaseStorageInfo.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.artifact;
-
-import javax.xml.bind.annotation.XmlElement;
-import java.io.Serializable;
-import java.util.Map;
-
-/**
- * @author Eli Givoni
- */
-public abstract class RestBaseStorageInfo implements Serializable {
-    @XmlElement(name = "uri")
-    public String slf;
-    public String repo;
-    public String path;
-    public String created;
-    public String createdBy;
-    public String lastModified;
-    public String modifiedBy;
-    public String lastUpdated;
-    public Map<String, String[]> properties;
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/artifact/RestFileInfo.java b/base/api/src/main/java/org/artifactory/api/rest/artifact/RestFileInfo.java
deleted file mode 100644
index 402e909..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/artifact/RestFileInfo.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.artifact;
-
-import java.io.Serializable;
-
-/**
- * @author Eli Givoni
- */
-public class RestFileInfo extends RestBaseStorageInfo {
-
-    public String downloadUri;
-    public String remoteUrl;
-    public String mimeType;
-    public String size;
-    public Checksums checksums;
-    public Checksums originalChecksums;
-
-    public static class Checksums implements Serializable {
-        public String sha1;
-        public String md5;
-        public String sha256;
-
-        public Checksums(String sha1, String md5) {
-            this.sha1 = sha1;
-            this.md5 = md5;
-        }
-
-        public Checksums(String sha1, String md5, String sha256) {
-            this.sha1 = sha1;
-            this.md5 = md5;
-            this.sha256 = sha256;
-        }
-
-
-        private Checksums() {
-        }
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/artifact/RestFolderInfo.java b/base/api/src/main/java/org/artifactory/api/rest/artifact/RestFolderInfo.java
deleted file mode 100644
index ef3c7ea..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/artifact/RestFolderInfo.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.artifact;
-
-import java.util.List;
-
-/**
- * @author Eli Givoni
- */
-public class RestFolderInfo extends RestBaseStorageInfo {
-
-    public List<DirItem> children;
-
-    public static class DirItem {
-        public String uri;
-        public boolean folder;
-
-        public DirItem(String uri, boolean isFolder) {
-            this.uri = uri;
-            this.folder = isFolder;
-        }
-
-        private DirItem() {
-        }
-
-        @Override
-        public String toString() {
-            return uri + (folder ? "/" : "");
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (this == o) {
-                return true;
-            }
-            if (!(o instanceof DirItem)) {
-                return false;
-            }
-
-            DirItem item = (DirItem) o;
-
-            if (folder != item.folder) {
-                return false;
-            }
-            if (uri != null ? !uri.equals(item.uri) : item.uri != null) {
-                return false;
-            }
-
-            return true;
-        }
-
-        @Override
-        public int hashCode() {
-            int result = uri != null ? uri.hashCode() : 0;
-            result = 31 * result + (folder ? 1 : 0);
-            return result;
-        }
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/build/BuildInfo.java b/base/api/src/main/java/org/artifactory/api/rest/build/BuildInfo.java
deleted file mode 100644
index b9ec6f7..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/build/BuildInfo.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.build;
-
-import org.jfrog.build.api.Build;
-
-import javax.xml.bind.annotation.XmlElement;
-import java.io.Serializable;
-
-/**
- * @author Eli Givoni
- */
-public class BuildInfo implements Serializable {
-    @XmlElement(name = "uri")
-    public String slf;
-    public Build buildInfo;
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/build/Builds.java b/base/api/src/main/java/org/artifactory/api/rest/build/Builds.java
deleted file mode 100644
index 9d0b423..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/build/Builds.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.build;
-
-import javax.xml.bind.annotation.XmlElement;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A resource that enlists builds
- *
- * @author yoavl
- */
-public class Builds implements Serializable {
-
-    @XmlElement(name = "uri")
-    public String slf;
-    public List<Build> builds = new ArrayList<>();
-
-
-    public static class Build {
-        @XmlElement
-        public String uri;
-        public String lastStarted;
-
-        public Build(String uri, String lastStarted) {
-            this.lastStarted = lastStarted;
-            this.uri = uri;
-        }
-
-        private Build() {
-        }
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/rest/build/BuildsByName.java b/base/api/src/main/java/org/artifactory/api/rest/build/BuildsByName.java
deleted file mode 100644
index 62f3a36..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/build/BuildsByName.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.build;
-
-import javax.xml.bind.annotation.XmlElement;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Eli Givoni
- */
-public class BuildsByName implements Serializable {
-    @XmlElement(name = "uri")
-    public String slf;
-    public List<Build> buildsNumbers = new ArrayList<>();
-
-    public static class Build {
-        public String uri;
-        public String started;
-
-        public Build(String uri, String started) {
-            this.started = started;
-            this.uri = uri;
-        }
-
-        private Build() {
-        }
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/build/artifacts/BuildArtifactsMapping.java b/base/api/src/main/java/org/artifactory/api/rest/build/artifacts/BuildArtifactsMapping.java
deleted file mode 100644
index a65a48b..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/build/artifacts/BuildArtifactsMapping.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.build.artifacts;
-
-import java.io.Serializable;
-
-/**
- * Represents a mapping between an input regexp pattern of build artifacts to their output target directory.
- * The target directory (output) is used only by the archive REST API and represents the hierarchy of the returned archive.
- * <p>RegExp capturing groups are supported, the corresponding place holders must be presented in the output regexp with the '$' prefix <br>
- * For example: input="(.+)/(.+)-sources.jar", output=""$1/sources/$2.jar""
- *
- * @author Shay Yaakov
- * @see BuildArtifactsRequest
- */
-public class BuildArtifactsMapping implements Serializable {
-
-    private String input;
-
-    /**
-     * Optionally, when omitted, the output target directory will be the full artifact relative path
-     */
-    private String output;
-
-    public String getInput() {
-        return input;
-    }
-
-    public void setInput(String input) {
-        this.input = input;
-    }
-
-    public String getOutput() {
-        return output;
-    }
-
-    public void setOutput(String output) {
-        this.output = output;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/build/artifacts/BuildArtifactsRequest.java b/base/api/src/main/java/org/artifactory/api/rest/build/artifacts/BuildArtifactsRequest.java
deleted file mode 100644
index 7cff46f..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/build/artifacts/BuildArtifactsRequest.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.build.artifacts;
-
-import org.artifactory.api.archive.ArchiveType;
-import org.codehaus.jackson.annotate.JsonIgnore;
-
-import javax.xml.bind.annotation.XmlRootElement;
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * A request wrapper object which holds all the necessary parameters
- * for the build artifacts search and archive REST APIs.
- *
- * @author Shay Yaakov
- */
- at XmlRootElement
-public class BuildArtifactsRequest implements Serializable {
-
-    /**
-     * The build name to get artifacts from
-     */
-    private String buildName;
-
-    /**
-     * The build number to get artifacts from, can be the const LATEST for latest build
-     */
-    private String buildNumber;
-
-    /**
-     * The build status to get artifacts from, will return the last build with this status
-     */
-    private String buildStatus;
-
-    /**
-     * limit the search to specific repos, if null then get from all real repos
-     */
-    private List<String> repos;
-
-    /**
-     * Optionally list of mappings between input regexp to search artifacts with and output regexp to lay out the found artifacts,
-     * (Usually the output pattern is used for build artifacts archive resource and represents the final archive layout).
-     */
-    private List<BuildArtifactsMapping> mappings;
-
-    /**
-     * The archive type to send back to the user (valid only for build artifacts archive resource), can be zip/tar/tar.gz/tgz
-     */
-    private ArchiveType archiveType;
-
-    public String getBuildName() {
-        return buildName;
-    }
-
-    public void setBuildName(String buildName) {
-        this.buildName = buildName;
-    }
-
-    public String getBuildNumber() {
-        return buildNumber;
-    }
-
-    public void setBuildNumber(String buildNumber) {
-        this.buildNumber = buildNumber;
-    }
-
-    public String getBuildStatus() {
-        return buildStatus;
-    }
-
-    public void setBuildStatus(String buildStatus) {
-        this.buildStatus = buildStatus;
-    }
-
-    public List<String> getRepos() {
-        return repos;
-    }
-
-    public void setRepos(List<String> repos) {
-        this.repos = repos;
-    }
-
-    public List<BuildArtifactsMapping> getMappings() {
-        return mappings;
-    }
-
-    public void setMappings(List<BuildArtifactsMapping> mappings) {
-        this.mappings = mappings;
-    }
-
-    public String getArchiveType() {
-        if (archiveType == null) {
-            return null;
-        }
-        return archiveType.value();
-    }
-
-    @JsonIgnore
-    public ArchiveType getType() {
-        return archiveType;
-    }
-
-    public void setArchiveType(String archiveTypeValue) {
-        this.archiveType = ArchiveType.fromValue(archiveTypeValue);
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/build/diff/BuildsDiff.java b/base/api/src/main/java/org/artifactory/api/rest/build/diff/BuildsDiff.java
deleted file mode 100644
index c725ae0..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/build/diff/BuildsDiff.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.build.diff;
-
-import org.artifactory.api.build.diff.BuildsDiffArtifactModel;
-import org.artifactory.api.build.diff.BuildsDiffDependencyModel;
-import org.artifactory.api.build.diff.BuildsDiffPropertyModel;
-
-import javax.xml.bind.annotation.XmlElement;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A REST object to return for builds diff REST API
- *
- * @author Shay Yaakov
- */
-public class BuildsDiff implements Serializable {
-
-    public ArtifactsEntry artifacts = new ArtifactsEntry();
-    public DependenciesEntry dependencies = new DependenciesEntry();
-    public PropertiesEntry properties = new PropertiesEntry();
-
-    public static class ArtifactsEntry {
-        @XmlElement(name = "new")
-        public List<BuildsDiffArtifactModel> newItems = new ArrayList<>();
-        public List<BuildsDiffArtifactModel> updated = new ArrayList<>();
-        public List<BuildsDiffArtifactModel> unchanged = new ArrayList<>();
-        public List<BuildsDiffArtifactModel> removed = new ArrayList<>();
-    }
-
-    public static class DependenciesEntry {
-        @XmlElement(name = "new")
-        public List<BuildsDiffDependencyModel> newItems = new ArrayList<>();
-        public List<BuildsDiffDependencyModel> updated = new ArrayList<>();
-        public List<BuildsDiffDependencyModel> unchanged = new ArrayList<>();
-        public List<BuildsDiffDependencyModel> removed = new ArrayList<>();
-    }
-
-    public static class PropertiesEntry {
-        @XmlElement(name = "new")
-        public List<BuildsDiffPropertyModel> newItems = new ArrayList<>();
-        public List<BuildsDiffPropertyModel> updated = new ArrayList<>();
-        public List<BuildsDiffPropertyModel> unchanged = new ArrayList<>();
-        public List<BuildsDiffPropertyModel> removed = new ArrayList<>();
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/compliance/FileComplianceInfo.java b/base/api/src/main/java/org/artifactory/api/rest/compliance/FileComplianceInfo.java
deleted file mode 100644
index dc61227..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/compliance/FileComplianceInfo.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.compliance;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * @author mamo
- */
-public class FileComplianceInfo implements Serializable {
-    public List<NameUrlPair> licenses;
-    public List<NameUrlPair> vulnerabilities;
-
-    public FileComplianceInfo() {
-    }
-
-    public static class NameUrlPair implements Serializable {
-        public String name;
-        public String url;
-
-        public NameUrlPair() {
-        }
-
-        public NameUrlPair(String name, String url) {
-            this.name = name;
-            this.url = url;
-        }
-
-        public static NameUrlPair of(String name, String url) {
-            return new NameUrlPair(name, url);
-        }
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/constant/ArchiveIndexRestConstants.java b/base/api/src/main/java/org/artifactory/api/rest/constant/ArchiveIndexRestConstants.java
deleted file mode 100644
index bc7709e..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/constant/ArchiveIndexRestConstants.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.constant;
-
-/**
- * @author Shay Yaakov
- */
-public interface ArchiveIndexRestConstants {
-    String PATH_ROOT = "archiveIndex";
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/constant/ArchiveRestConstants.java b/base/api/src/main/java/org/artifactory/api/rest/constant/ArchiveRestConstants.java
deleted file mode 100644
index 67803ba..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/constant/ArchiveRestConstants.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.constant;
-
-/**
- * @author Shay Yaakov
- */
-public interface ArchiveRestConstants {
-    String PATH_ROOT = "archive";
-
-    //Query path
-    String PATH_BUILD_ARTIFACTS = "buildArtifacts";
-
-    String PATH_DOWNLOAD_REPO_PATH = "download/{repoKey}/{path: .+}";
-
-    String PATH_DOWNLOAD_REPO_ROOT = "download/{repoKey}";
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/constant/ArtifactRestConstants.java b/base/api/src/main/java/org/artifactory/api/rest/constant/ArtifactRestConstants.java
deleted file mode 100644
index 5fafb9b..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/constant/ArtifactRestConstants.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.constant;
-
-/**
- * @author Eli Givoni
- */
-public interface ArtifactRestConstants {
-    String PATH_PARAM = "path";
-    String PATH_ROOT = "storage";
-    String SUPPORT_ROOT = "support";
-    String SUPPORT_BUNDLES_PATH = "bundles";
-    String PATH_STATISTICS = "statistics";
-    String MT_FOLDER_INFO = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".FolderInfo+json";
-    String MT_FILE_INFO = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".FileInfo+json";
-    String MT_ITEM_PROPERTIES = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".ItemProperties+json";
-    String MT_COPY_MOVE_RESULT = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".CopyOrMoveResult+json";
-    String MT_FILE_LIST = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".FileList+json";
-    String MT_ITEM_LAST_MODIFIED = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".ItemLastModified+json";
-    String MT_ITEM_CREATED = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".ItemCreated+json";
-    String MT_ITEM_PERMISSIONS = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".ItemPermissions+json";
-    String MT_STATS_INFO = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".StatsInfo+json";
-
-    String PATH_COPY = "copy";
-    String PATH_MOVE = "move";
-    String PARAM_TARGET = "to";
-    String PARAM_DRY_RUN = "dry";
-    String PARAM_SUPPRESS_LAYOUTS = "suppressLayouts";
-    String PARAM_FAIL_FAST = "failFast";
-    String PARAM_ATOMIC = "atomic";
-
-
-    String PATH_DOWNLOAD = "download";
-    String PARAM_CONTENT = "content";
-    String PARAM_MARK = "mark";
-
-    String PATH_SYNC = "sync";
-    String PARAM_PROGRESS = "progress";
-    String PARAM_DELETE = "delete";
-    String PARAM_OVERWRITE = "overwrite";
-    String PARAM_TIMEOUT = "timeout";
-
-    String TRACE_PARAM = "trace";
-    String PROPERTIES_PARAM = "properties";
-    String PROPERTIES_XML_PARAM = "propertiesXml";
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/rest/constant/BintrayRestConstants.java b/base/api/src/main/java/org/artifactory/api/rest/constant/BintrayRestConstants.java
deleted file mode 100644
index 6fe89f2..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/constant/BintrayRestConstants.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.constant;
-
-/**
- * Constants used by the REST bintray resource
- *
- * @author Dan Feldman
- */
-public interface BintrayRestConstants {
-    String PATH_ROOT = "bintray";
-    String MT_BINTRAY_PUSH_RESPONSE = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".BintrayPushResponse+json";
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/constant/BuildRestConstants.java b/base/api/src/main/java/org/artifactory/api/rest/constant/BuildRestConstants.java
deleted file mode 100644
index 15d642d..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/constant/BuildRestConstants.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.constant;
-
-/**
- * Constants used by the REST build resource
- *
- * @author Noam Y. Tenne
- */
-public interface BuildRestConstants {
-    String PATH_ROOT = "build";
-
-    //TODO: [by yl] Move to the buildInfo module
-    String MT_BUILDS = RestConstants.MT_JFROG_APP + PATH_ROOT + ".Builds+json";
-    String MT_BUILDS_BY_NAME = RestConstants.MT_JFROG_APP + PATH_ROOT + ".BuildsByName+json";
-
-    String MT_BUILD = RestConstants.MT_JFROG_APP + PATH_ROOT + ".Build+json";
-    String MT_BUILD_INFO = RestConstants.MT_JFROG_APP + PATH_ROOT + ".BuildInfo+json";
-    String MT_BUILD_INFO_MODULE = RestConstants.MT_JFROG_APP + PATH_ROOT + ".BuildInfoModule+json";
-    String MT_BUILDS_DIFF = RestConstants.MT_JFROG_APP + PATH_ROOT + ".BuildsDiff+json";
-    String MT_BUILD_PATTERN_ARTIFACTS_REQUEST = RestConstants.MT_JFROG_APP + PATH_ROOT + ".BuildPatternArtifactsRequest+json";
-    String MT_BUILD_PATTERN_ARTIFACTS_RESULT = RestConstants.MT_JFROG_APP + PATH_ROOT + ".BuildPatternArtifactsResult+json";
-    String MT_BUILD_ARTIFACTS_REQUEST = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".BuildArtifactsRequest+json";
-
-    @Deprecated
-    String MT_COPY_MOVE_RESULT = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".CopyOrMoveResult+json";
-
-    String MT_PROMOTION_REQUEST = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".PromotionRequest+json";
-    String MT_PROMOTION_RESULT = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".PromotionResult+json";
-    String MT_BINTRAY_DESCRIPTOR_OVERRIDE = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".BintrayDescriptorOverrideParams+json";
-    String MT_DISTRIBUTION = RestConstants.MT_ARTIFACTORY_APP + "distribute" + ".Distribution+json";
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/constant/ComplianceConstants.java b/base/api/src/main/java/org/artifactory/api/rest/constant/ComplianceConstants.java
deleted file mode 100644
index 376ee4a..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/constant/ComplianceConstants.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.constant;
-
-/**
- * @author mamo
- */
-public interface ComplianceConstants {
-
-    String PATH_ROOT = "compliance";
-
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/constant/ConfigRestConstants.java b/base/api/src/main/java/org/artifactory/api/rest/constant/ConfigRestConstants.java
deleted file mode 100644
index 671e265..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/constant/ConfigRestConstants.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.constant;
-
-/**
- * @author Michael Pasternak
- */
-public interface ConfigRestConstants {
-    String REMOTE_REPOSITORIES_PATH = "remoteRepositories";
-    String LOGO_URL_PATH = "logoUrl";
-    String URL_BASE_PATH = "baseUrl";
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/constant/GitLfsResourceConstants.java b/base/api/src/main/java/org/artifactory/api/rest/constant/GitLfsResourceConstants.java
deleted file mode 100644
index 1d2f77a..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/constant/GitLfsResourceConstants.java
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-package org.artifactory.api.rest.constant;
-
-/**
- * Constants for the {@link GitLfsResource}
- *
- * @author Dan Feldman
- */
-public interface GitLfsResourceConstants {
-    String PATH_ROOT = "lfs";
-
-    String OBJECTS = "objects";
-    String REPO_KEY = "repoKey";
-    String OID = "OID";
-    //String API_V1 = "version https://git-lfs.github.com/spec/v1";
-    String LFS_JSON = "application/vnd.git-lfs+json";
-    //String LFS_BINARY = "application/vnd.git-lfs";
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/constant/HaRestConstants.java b/base/api/src/main/java/org/artifactory/api/rest/constant/HaRestConstants.java
deleted file mode 100644
index b259f4d..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/constant/HaRestConstants.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.constant;
-
-import static org.artifactory.api.rest.constant.RestConstants.PATH_API;
-
-/**
- * @author yoavl
- */
-public interface HaRestConstants {
-    String PATH_ROOT = "ha";
-    String HA_ADMIN_ROOT = "ha-admin";
-    String PATH_PREFIX = "/" + PATH_API + "/" + PATH_ROOT + "/";
-    String PROPAGATE_TASK = "propagateTask";
-    String CLUSTER_DUMP = "clusterDump";
-    String ACTION = "action";
-
-    String ROLE_HA = "ha";
-
-    String ARTIFACTORY_HA_ORIGINATED_SERVER_ID = "X-Artifactory-HA-Originated-ServerId";
-    String ARTIFACTORY_HA_SECURITY_TOKEN = "X-Artifactory-HA-Security-Token";
-    String ARTIFACTORY_HA_ORIGINATED_USERNAME = "X-Artifactory-HA-Originated-Username";
-    String ARTIFACTORY_HA_EVENT = "X-Artifactory-HA-Event";
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/constant/ImportRestConstants.java b/base/api/src/main/java/org/artifactory/api/rest/constant/ImportRestConstants.java
deleted file mode 100644
index 8dc6756..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/constant/ImportRestConstants.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.constant;
-
-/**
- * @author Tomer Cohen
- */
-public interface ImportRestConstants {
-    String PATH_ROOT = "import";
-    String SYSTEM_PATH = "system";
-    String REPOSITORIES_PATH = "repositories";
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/constant/MavenRestConstants.java b/base/api/src/main/java/org/artifactory/api/rest/constant/MavenRestConstants.java
deleted file mode 100644
index ebca641..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/constant/MavenRestConstants.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.constant;
-
-/**
- * Constants to be used with the Maven REST resource
- *
- * @author Shay Yaakov
- */
-public interface MavenRestConstants {
-    String PATH_ROOT = "maven";
-
-    String PARAM_REPOS_TO_INDEX = "repos";
-
-    String PARAM_FORCE = "force";
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/constant/NuGetResourceConstants.java b/base/api/src/main/java/org/artifactory/api/rest/constant/NuGetResourceConstants.java
deleted file mode 100644
index c38b05b..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/constant/NuGetResourceConstants.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.artifactory.api.rest.constant;
-
-/**
- * @author Noam Y. Tenne
- */
-public interface NuGetResourceConstants {
-    String PATH_ROOT = "nuget";
-    String REPO_KEY = "repoKey";
-    String FILE_NAME = "filename";
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/constant/PluginRestConstants.java b/base/api/src/main/java/org/artifactory/api/rest/constant/PluginRestConstants.java
deleted file mode 100644
index 549f1e4..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/constant/PluginRestConstants.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.constant;
-
-/**
- * @author yoavl
- */
-public interface PluginRestConstants {
-    String PATH_ROOT = "plugins";
-    String PATH_EXECUTE = "execute";
-    String PATH_BUILD = "build/";
-    String PATH_STAGING = PATH_BUILD + "staging";
-    String PATH_PROMOTE = PATH_BUILD + "promote";
-
-    String PARAM_PARAMS = "params";
-    String PARAM_ASYNC = "async";
-
-    String MT_BUILD_STAGING_STRATEGY = RestConstants.MT_JFROG_APP + PATH_ROOT + ".BuildStagingStrategy+json";
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/rest/constant/RepairRepositoryConstants.java b/base/api/src/main/java/org/artifactory/api/rest/constant/RepairRepositoryConstants.java
deleted file mode 100644
index 34edc7b..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/constant/RepairRepositoryConstants.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.constant;
-
-/**
- * @author Yoav Luft
- */
-public interface RepairRepositoryConstants {
-    String PATH_ROOT = "repairPaths";
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/constant/ReplicationRestConstants.java b/base/api/src/main/java/org/artifactory/api/rest/constant/ReplicationRestConstants.java
deleted file mode 100644
index 652f98a..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/constant/ReplicationRestConstants.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.constant;
-
-/**
- * @author Noam Y. Tenne
- */
-public interface ReplicationRestConstants {
-    String ROOT = "replication";
-    String MT_REPLICATION_REQUEST = RestConstants.MT_ARTIFACTORY_APP + ROOT + ".ReplicationRequest+json";
-    String MT_REPLICATION_STATUS = RestConstants.MT_ARTIFACTORY_APP + ROOT + ".ReplicationStatus+json";
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/constant/ReplicationsRestConstants.java b/base/api/src/main/java/org/artifactory/api/rest/constant/ReplicationsRestConstants.java
deleted file mode 100644
index 067be76..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/constant/ReplicationsRestConstants.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.constant;
-
-/**
- * @author Noam Y. Tenne
- */
-public interface ReplicationsRestConstants {
-    String ROOT = "replications";
-    String MT_REPLICATION_CONFIG_REQUEST = RestConstants.MT_ARTIFACTORY_APP + ROOT + ".ReplicationConfigRequest+json";
-    String MT_MULTI_REPLICATION_CONFIG_REQUEST = RestConstants.MT_ARTIFACTORY_APP + ROOT + ".MultipleReplicationConfigRequest+json";
-
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/constant/RepositoriesRestConstants.java b/base/api/src/main/java/org/artifactory/api/rest/constant/RepositoriesRestConstants.java
deleted file mode 100644
index 92272a5..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/constant/RepositoriesRestConstants.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.constant;
-
-/**
- * Constants used by the rest repositories resource
- *
- * @author Noam Tenne
- */
-public interface RepositoriesRestConstants {
-    String PATH_ROOT = "repositories";
-    String PATH_CONFIGURATION = "configuration";
-    String PARAM_REPO_TYPE = "type";
-
-    String MT_REPOSITORY_DETAILS_LIST = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".RepositoryDetailsList+json";
-    String MT_LOCAL_REPOSITORY_CONFIGURATION = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".LocalRepositoryConfiguration+json";
-    String MT_REMOTE_REPOSITORY_CONFIG = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".RemoteRepositoryConfiguration+json";
-    String MT_VIRTUAL_REPOSITORY_CONFIGURATION = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".VirtualRepositoryConfiguration+json";
-    String MT_REMOTE_REPOSITORY_CONFIGURATION =
-            RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".RepositoryConfiguration+json";
-
-    String PATH = "path";
-    String TARGET_REPO = "repo";
-    String EXCLUDE_CONTENT = "content";
-    String INCLUDE_METADATA = "metadata";
-    String VERBOSE = "verbose";
-    String POSITION = "pos";
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/constant/RestConstants.java b/base/api/src/main/java/org/artifactory/api/rest/constant/RestConstants.java
deleted file mode 100644
index a3e4630..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/constant/RestConstants.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.constant;
-
-/**
- * @author yoavl
- */
-public interface RestConstants {
-    String PATH_API = "api";
-    String MT_JFROG_APP = "application/vnd.org.jfrog.";
-    String MT_ARTIFACTORY_APP = MT_JFROG_APP + "artifactory.";
-    String MT_LEGACY_ARTIFACTORY_APP = MT_JFROG_APP + "artifactory+json";
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/rest/constant/SearchRestConstants.java b/base/api/src/main/java/org/artifactory/api/rest/constant/SearchRestConstants.java
deleted file mode 100644
index f39ed76..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/constant/SearchRestConstants.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.constant;
-
-/**
- * @author yoavl
- */
-public interface SearchRestConstants {
-    String PATH_ROOT = "search";
-
-    //Query path
-    String PATH_ARTIFACT = "artifact";
-    String PATH_ARCHIVE = "archive";
-    String PATH_GAVC = "gavc";
-    String PATH_PROPERTY = "prop";
-    String PATH_USAGE_SINCE = "usage";
-    String PATH_CREATED_IN_RANGE = "creation";
-    String PATH_DATES_IN_RANGE = "dates";
-    String PATH_PATTERN = "pattern";
-    String PATH_LICENSE = "license";
-    String PATH_CHECKSUM = "checksum";
-    String PATH_BAD_CHECKSUM = "badChecksum";
-    String PATH_DEPENDENCY = "dependency";
-    String PATH_VERSIONS = "versions";
-    String PATH_LATEST_VERSION = "latestVersion";
-    String PATH_BUILD_ARTIFACTS = "buildArtifacts";
-
-    //Common query params
-    String PARAM_REPO_TO_SEARCH = "repos";
-    String PARAM_SEARCH_NAME = "name";
-    String PARAM_PROPERTIES = "properties";
-
-    //Gavc query params
-    String PARAM_GAVC_GROUP_ID = "g";
-    String PARAM_GAVC_ARTIFACT_ID = "a";
-    String PARAM_GAVC_VERSION = "v";
-    String PARAM_GAVC_CLASSIFIER = "c";
-
-    //Xpath query params
-    String PARAM_METADATA_NAME_SEARCH = "name";
-    String PARAM_METADATA_SEARCH_TYPE = "metadata";
-    String PARAM_METADATA_PATH = "xpath";
-    String PARAM_METADATA_VALUE = "val";
-
-    //Downloaded Since query params
-    String PARAM_SEARCH_NOT_USED_SINCE = "notUsedSince";
-    String PARAM_CREATED_BEFORE = "createdBefore";
-
-    //Modified in range query params
-    String PARAM_IN_RANGE_FROM = "from";
-    String PARAM_IN_RANGE_TO = "to";
-
-    //Pattern of artifacts to search for
-    String PARAM_PATTERN = "pattern";
-
-    //Licenses query params
-    String UNAPPROVED_PARAM = "unapproved";
-    String UNKNOWN_PARAM = "unknown";
-    String NOT_FOUND_PARAM = "notfound";
-    String NEUTRAL_PARAM = "neutral";
-    String APPROVED_PARAM = "approved";
-    String AUTOFIND_PARAM = "autofind";
-    String REPOS_PARAM = "repos";
-
-    String PARAM_SHA256_CHECKSUM = "sha256";
-    String PARAM_MD5_CHECKSUM = "md5";
-    String PARAM_SHA1_CHECKSUM = "sha1";
-
-    //Artifact versions params
-    String PARAM_FETCH_FROM_REMOTE = "remote";
-
-    // Dynamic search params
-    String PARAM_DATE_FIELDS = "dateFields";
-
-    //Build artifacts params
-    String BUILD_NAME_PARAM = "buildName";
-    String BUILD_NUMBER_PARAM = "buildNumber";
-    String BUILD_ARTIFACTS_INCLUDES = "includes";
-    String BUILD_ARTIFACTS_EXCLUDES = "excludes";
-
-    //Media types
-    String MT_ARTIFACT_SEARCH_RESULT = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".ArtifactSearchResult+json";
-    String MT_ARCHIVE_ENTRY_SEARCH_RESULT =
-            RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".ArchiveEntrySearchResult+json";
-    String MT_GAVC_SEARCH_RESULT = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".GavcSearchResult+json";
-    String MT_PROPERTY_SEARCH_RESULT = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".MetadataSearchResult+json";
-    String MT_XPATH_SEARCH_RESULT = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".XpathSearchResult+json";
-    String MT_USAGE_SINCE_SEARCH_RESULT = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".ArtifactUsageResult+json";
-    String MT_CREATED_IN_RANGE_SEARCH_RESULT =
-            RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".ArtifactCreationResult+json";
-    String MT_PATTERN_SEARCH_RESULT = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".PatternResultFileSet+json";
-    String MT_LICENSE_SEARCH_RESULT = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".LicenseResult+json";
-    String MT_CHECKSUM_SEARCH_RESULT = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".ChecksumSearchResult+json";
-    String MT_BAD_CHECKSUM_SEARCH_RESULT =
-            RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".BadChecksumSearchResult+json";
-    String MT_DEPENDENCY_BUILDS = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".DependencyBuilds+json";
-    String MT_ARTIFACT_VERSIONS_SEARCH_RESULT =
-            RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".ArtifactVersionsResult+json";
-    String MT_BUILD_ARTIFACTS_SEARCH_RESULT = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".BuildArtifactsSearchResult+json";
-    String MT_ARTIFACT_RESULT = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".ArtifactResult+json";
-
-    String NOT_FOUND = "No results found.";
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/rest/constant/SecurityRestConstants.java b/base/api/src/main/java/org/artifactory/api/rest/constant/SecurityRestConstants.java
deleted file mode 100644
index 08b0fdb..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/constant/SecurityRestConstants.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.constant;
-
-/**
- * @author Noam Y. Tenne
- */
-public interface SecurityRestConstants {
-    String PATH_ROOT = "security";
-
-    String MT_USER = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".User+json";
-    String MT_GROUP = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".Group+json";
-    String MT_PERMISSION_TARGET = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".PermissionTarget+json";
-    String MT_USERS = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".Users+json";
-    String MT_GROUPS = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".Groups+json";
-    String MT_PERMISSION_TARGETS = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".PermissionTargets+json";
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/constant/SystemRestConstants.java b/base/api/src/main/java/org/artifactory/api/rest/constant/SystemRestConstants.java
deleted file mode 100644
index 134d7cc..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/constant/SystemRestConstants.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.constant;
-
-/**
- * @author yoavl
- */
-public interface SystemRestConstants {
-    String PATH_ROOT = "system";
-    String PATH_IMPORT = "import";
-    String PATH_EXPORT = "export";
-    String PATH_CONFIGURATION = "configuration";
-    String PATH_SECURITY = "security";
-    String PATH_STORAGE = "storage";
-    String PATH_STORAGE_COMPRESS = "compress";
-    String PATH_REPOSITORIES = "repositories";
-    String PATH_VERSION = "version";
-    String PATH_PING = "ping";
-    String PATH_ENCRYPT = "encrypt";
-    String PATH_DECRYPT = "decrypt";
-    String PATH_LICENSE = "license";
-    String PATH_REPLICATIONS = "replications";
-    String MT_VERSION_RESULT = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".Version+json";
-    String MT_IMPORT_SETTINGS = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".ImportSettings+json";
-    String MT_EXPORT_SETTINGS = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".ExportSettings+json";
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/constant/TestRestConstants.java b/base/api/src/main/java/org/artifactory/api/rest/constant/TestRestConstants.java
deleted file mode 100644
index d0b76f3..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/constant/TestRestConstants.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.constant;
-
-/**
- * @author Shay Yaakov
- */
-public interface TestRestConstants {
-    String PATH_ROOT = "test";
-    String PATH_FLUSH_STATS = "flushStats";
-    String PATH_ARCHIVE_INDEXER_DONE = "archiveIndexerDone";
-    String PATH_MAVEN_METADATA_DONE = "mavenMetadataDone";
-    String PATH_MAVEN_INDEXER_DONE = "mavenIndexerDone";
-    String PATH_NUGET_INDEX_DONE = "nuGetIndexDone";
-    String PATH_All_ASYNC_DONE = "asyncDone";
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/constant/TrafficRestConstants.java b/base/api/src/main/java/org/artifactory/api/rest/constant/TrafficRestConstants.java
deleted file mode 100644
index 527ba3d..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/constant/TrafficRestConstants.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.constant;
-
-/**
- * @author Noam Tenne
- */
-public interface TrafficRestConstants {
-    String PATH_ROOT = "traffic";
-    String FILES_ROOT = "files";
-    String STREAM_ROOT = "stream";
-    String PATH_FILTER = STREAM_ROOT + "/filter";
-    String PATH_FILTER_NODE = "/filter/node";
-    String PARAM_START_DATE = "start";
-    String PARAM_END_DATE = "end";
-    String PARAM_FILTER = "ipsToFilter";
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/rest/constant/TrashcanRestConstants.java b/base/api/src/main/java/org/artifactory/api/rest/constant/TrashcanRestConstants.java
deleted file mode 100644
index afd6ea0..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/constant/TrashcanRestConstants.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.constant;
-
-/**
- * @author Shay Yaakov
- */
-public interface TrashcanRestConstants {
-    String ROOT = "trash";
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/constant/YumRestConstants.java b/base/api/src/main/java/org/artifactory/api/rest/constant/YumRestConstants.java
deleted file mode 100644
index 1de3915..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/constant/YumRestConstants.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.constant;
-
-/**
- * @author Noam Y. Tenne
- */
-public interface YumRestConstants {
-    String PATH_ROOT = "yum";
-    String PARAM_ASYNC = "async";
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/replication/MultipleReplicationConfigRequest.java b/base/api/src/main/java/org/artifactory/api/rest/replication/MultipleReplicationConfigRequest.java
deleted file mode 100644
index d3287bb..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/replication/MultipleReplicationConfigRequest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.artifactory.api.rest.replication;
-
-import org.artifactory.api.rest.restmodel.IModel;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class MultipleReplicationConfigRequest implements Serializable, IModel {
-
-    private String cronExp;
-    private Boolean enableEventReplication;
-    private List<ReplicationConfigRequest> replications;
-
-    public List<ReplicationConfigRequest> getReplications() {
-        return replications;
-    }
-
-    public void setReplications(
-            List<ReplicationConfigRequest> replications) {
-        this.replications = replications;
-    }
-
-    public String getCronExp() {
-        return cronExp;
-    }
-
-    public void setCronExp(String cronExp) {
-        this.cronExp = cronExp;
-    }
-
-    public Boolean isEnableEventReplication() {
-        return enableEventReplication;
-    }
-
-    public void setEnableEventReplication(Boolean enableEventReplication) {
-        this.enableEventReplication = enableEventReplication;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/replication/ReplicationConfigRequest.java b/base/api/src/main/java/org/artifactory/api/rest/replication/ReplicationConfigRequest.java
deleted file mode 100644
index 8db1ee9..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/replication/ReplicationConfigRequest.java
+++ /dev/null
@@ -1,114 +0,0 @@
-package org.artifactory.api.rest.replication;
-
-import org.artifactory.api.rest.restmodel.IModel;
-
-import java.io.Serializable;
-
-/**
- * @author mamo
- */
-public class ReplicationConfigRequest implements Serializable, IModel {
-
-    //local/remote
-    private Boolean enabled;
-    private String cronExp;
-    private Boolean syncDeletes;
-    private Boolean syncProperties;
-    private String pathPrefix;
-
-    //local only
-    private String url;
-    private Boolean enableEventReplication;
-    private String username;
-    private String password;
-    private String proxy;
-    private Integer socketTimeoutMillis;
-
-    public Boolean isEnabled() {
-        return enabled;
-    }
-
-    public void setEnabled(Boolean enabled) {
-        this.enabled = enabled;
-    }
-
-    public String getCronExp() {
-        return cronExp;
-    }
-
-    public void setCronExp(String cronExp) {
-        this.cronExp = cronExp;
-    }
-
-    public Boolean getSyncDeletes() {
-        return syncDeletes;
-    }
-
-    public void setSyncDeletes(Boolean syncDeletes) {
-        this.syncDeletes = syncDeletes;
-    }
-
-    public Boolean getSyncProperties() {
-        return syncProperties;
-    }
-
-    public void setSyncProperties(Boolean syncProperties) {
-        this.syncProperties = syncProperties;
-    }
-
-    public String getPathPrefix() {
-        return pathPrefix;
-    }
-
-    public void setPathPrefix(String pathPrefix) {
-        this.pathPrefix = pathPrefix;
-    }
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    public Boolean getEnableEventReplication() {
-        return enableEventReplication;
-    }
-
-    public void setEnableEventReplication(Boolean enableEventReplication) {
-        this.enableEventReplication = enableEventReplication;
-    }
-
-    public String getUsername() {
-        return username;
-    }
-
-    public void setUsername(String username) {
-        this.username = username;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public void setPassword(String password) {
-        this.password = password;
-    }
-
-    public String getProxy() {
-        return proxy;
-    }
-
-    public void setProxy(String proxy) {
-        this.proxy = proxy;
-    }
-
-    public Integer getSocketTimeoutMillis() {
-        return socketTimeoutMillis;
-    }
-
-    public void setSocketTimeoutMillis(Integer socketTimeoutMillis) {
-        this.socketTimeoutMillis = socketTimeoutMillis;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/replication/ReplicationEnableDisableRequest.java b/base/api/src/main/java/org/artifactory/api/rest/replication/ReplicationEnableDisableRequest.java
deleted file mode 100644
index 759af9b..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/replication/ReplicationEnableDisableRequest.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.artifactory.api.rest.replication;
-
-import org.artifactory.api.rest.restmodel.IModel;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * @author Shay Yaakov
- */
-public class ReplicationEnableDisableRequest implements Serializable, IModel {
-
-    private List<String> include;
-    private List<String> exclude;
-    private boolean isEnable;
-
-    public List<String> getInclude() {
-        return include;
-    }
-
-    public void setInclude(List<String> include) {
-        this.include = include;
-    }
-
-    public List<String> getExclude() {
-        return exclude;
-    }
-
-    public void setExclude(List<String> exclude) {
-        this.exclude = exclude;
-    }
-
-    public boolean isEnable() {
-        return isEnable;
-    }
-
-    public void setEnable(boolean enable) {
-        isEnable = enable;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/replication/ReplicationRequest.java b/base/api/src/main/java/org/artifactory/api/rest/replication/ReplicationRequest.java
deleted file mode 100644
index 39d6a29..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/replication/ReplicationRequest.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.replication;
-
-import java.io.Serializable;
-
-/**
- * @author Noam Y. Tenne
- */
-public class ReplicationRequest implements Serializable {
-
-    private boolean properties = true;
-    private boolean delete = false;
-
-    /**
-     * Needed only for local replications
-     */
-    private String url;
-    private String username;
-    private String password;
-    private String proxy;
-
-    public ReplicationRequest(boolean properties, boolean delete, String url, String username, String password,
-            String proxy) {
-        this.properties = properties;
-        this.delete = delete;
-        this.url = url;
-        this.username = username;
-        this.password = password;
-        this.proxy = proxy;
-    }
-
-    public ReplicationRequest() {
-    }
-
-    public boolean isProperties() {
-        return properties;
-    }
-
-    public void setProperties(boolean properties) {
-        this.properties = properties;
-    }
-
-    public boolean isDelete() {
-        return delete;
-    }
-
-    public void setDelete(boolean delete) {
-        this.delete = delete;
-    }
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    public String getUsername() {
-        return username;
-    }
-
-    public void setUsername(String username) {
-        this.username = username;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public void setPassword(String password) {
-        this.password = password;
-    }
-
-    public String getProxy() {
-        return proxy;
-    }
-
-    public void setProxy(String proxy) {
-        this.proxy = proxy;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/replication/ReplicationStatus.java b/base/api/src/main/java/org/artifactory/api/rest/replication/ReplicationStatus.java
deleted file mode 100644
index 71e26b6..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/replication/ReplicationStatus.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.replication;
-
-import org.codehaus.jackson.annotate.JsonIgnore;
-
-import javax.annotation.Nullable;
-import java.io.Serializable;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Holds the info about the latest replication that annotates a replication root item
- *
- * @author Noam Y. Tenne
- */
-public class ReplicationStatus implements Serializable {
-
-    private ReplicationStatusType status;
-    private String lastCompleted;
-    private Map<String, ReplicationStatus> repositories;
-
-    public ReplicationStatus() {
-    }
-
-    public ReplicationStatus(ReplicationStatusType status, @Nullable String lastCompleted) {
-        this.status = status;
-        this.lastCompleted = lastCompleted;
-    }
-
-    /**
-     * @param status general status
-     * @param lastCompleted general last completed
-     * @param repositories multi-replication repositories statuses
-     */
-    public ReplicationStatus(ReplicationStatusType status, @Nullable String lastCompleted, Map<String, ReplicationStatus> repositories) {
-        this.status = status;
-        this.lastCompleted = lastCompleted;
-        this.repositories = repositories;
-    }
-
-    public String getStatus() {
-        return status.getId();
-    }
-
-    @JsonIgnore
-    public String getDisplayName() {
-        return status.getDisplayName();
-    }
-
-    @JsonIgnore
-    public ReplicationStatusType getType() {
-        return status;
-    }
-
-    public void setStatus(String status) {
-        this.status = ReplicationStatusType.findTypeById(status);
-    }
-
-    @Nullable
-    public String getLastCompleted() {
-        return lastCompleted;
-    }
-
-    public void setLastCompleted(@Nullable String lastCompleted) {
-        this.lastCompleted = lastCompleted;
-    }
-
-    public Map<String, ReplicationStatus> getRepositories() {
-        return repositories;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/replication/ReplicationStatusType.java b/base/api/src/main/java/org/artifactory/api/rest/replication/ReplicationStatusType.java
deleted file mode 100644
index bfd9e49..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/replication/ReplicationStatusType.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.replication;
-
-import javax.annotation.Nullable;
-
-/**
- * Replication statue available types used for repo last replication info
- *
- * @author Shay Yaakov
- */
-public enum ReplicationStatusType {
-    UNKNOWN("unknown", "Unknown"),
-    NEVER_RUN("never_run", "Never ran"),
-    INCOMPLETE("incomplete", "Incomplete"),
-    ERROR("error", "Completed with errors"),
-    WARN("warn", "Completed with warnings"),
-    OK("ok", "Completed successfully"),
-    INCONSISTENT("inconsistent", "Inconsistent"),
-    PARTIAL_FAILURE("partial_failure", "Some replications completed with errors");
-
-    private String id;
-    private String displayName;
-
-    ReplicationStatusType(String id, String displayName) {
-        this.id = id;
-        this.displayName = displayName;
-    }
-
-    public String getId() {
-        return id;
-    }
-
-    public String getDisplayName() {
-        return displayName;
-    }
-
-    public static ReplicationStatusType findTypeById(@Nullable String id) {
-        for (ReplicationStatusType replicationStatusType : values()) {
-            if (replicationStatusType.getId().equals(id)) {
-                return replicationStatusType;
-            }
-        }
-        return UNKNOWN;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/restmodel/IModel.java b/base/api/src/main/java/org/artifactory/api/rest/restmodel/IModel.java
deleted file mode 100644
index de4e8a4..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/restmodel/IModel.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.artifactory.api.rest.restmodel;
-
-/**
- * @author Chen Keinan
- */
-public interface IModel {
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/restmodel/JsonUtil.java b/base/api/src/main/java/org/artifactory/api/rest/restmodel/JsonUtil.java
deleted file mode 100644
index b6d35fb..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/restmodel/JsonUtil.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.artifactory.api.rest.restmodel;
-
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * @author Chen Keinan
- */
-public class JsonUtil {
-    private static final Logger log = LoggerFactory.getLogger(JsonUtil.class);
-    private static final ObjectMapper mapper = new ObjectMapper();
-
-    /**
-     * json to String exclude null data
-     *
-     * @param model - model data to String
-     * @return - model data with json format
-     */
-    public static String jsonToString(Object model) {
-        //        ObjectMapper mapper = new ObjectMapper();
-        mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
-        mapper.disableDefaultTyping();
-        String jasonString = null;
-        try {
-            jasonString = mapper.writeValueAsString(model);
-        } catch (IOException e) {
-            log.error(e.toString());
-        }
-        return jasonString;
-    }
-
-
-    /**
-     * map input stream to model
-     *
-     * @param data      - input stream
-     * @param valueType - class type
-     * @param <T>       -
-     * @return
-     * @throws IOException
-     */
-    public static <T> T mapDataToModel(InputStream data, Class<T> valueType) throws IOException {
-        ObjectMapper mapper = new ObjectMapper();
-        T model = mapper.readValue(data, valueType);
-        return model;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/search/common/RestDateFieldName.java b/base/api/src/main/java/org/artifactory/api/rest/search/common/RestDateFieldName.java
deleted file mode 100644
index da0727e..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/search/common/RestDateFieldName.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.search.common;
-
-/**
- * Date: 5/11/14 3:29 PM
- *
- * @author freds
- */
-public enum  RestDateFieldName {
-    LAST_MODIFIED("lastModified"),
-    CREATED("created"),
-    LAST_DOWNLOADED("lastDownloaded"),
-    LAST_REMOTE_DOWNLOADED("remote_last_downloaded");
-
-
-    public String fieldName;
-
-    RestDateFieldName(String fieldName) {
-        this.fieldName = fieldName;
-    }
-
-    public static RestDateFieldName byFieldName(String fieldName) {
-        for (RestDateFieldName dateFieldName : values()) {
-            if (dateFieldName.fieldName.equals(fieldName)) {
-                return dateFieldName;
-            }
-        }
-        return null;
-    }
-
-
-    @Override
-    public String toString() {
-        return fieldName;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/search/query/BaseRestQuery.java b/base/api/src/main/java/org/artifactory/api/rest/search/query/BaseRestQuery.java
deleted file mode 100644
index 6d1c1b5..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/search/query/BaseRestQuery.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.search.query;
-
-import com.google.common.collect.Lists;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * REST API search query base class
- *
- * @author Noam Y. Tenne
- */
-public abstract class BaseRestQuery implements Serializable {
-
-    private List<String> reposToSearch = Lists.newArrayList();
-
-    /**
-     * Default constructor
-     */
-    protected BaseRestQuery() {
-    }
-
-    /**
-     * Returns the list of repositories to search in
-     *
-     * @return List of repositories to search in
-     */
-    public List<String> getReposToSearch() {
-        return reposToSearch;
-    }
-
-    /**
-     * Sets the list of repositories to search in
-     *
-     * @param reposToSearch List of repositories to search in
-     */
-    public void setReposToSearch(List<String> reposToSearch) {
-        this.reposToSearch = reposToSearch;
-    }
-
-    /**
-     * Adds a key of a repository to search in
-     *
-     * @param repoKey Key of repository to search in
-     */
-    public void addRepoToSearch(String repoKey) {
-        reposToSearch.add(repoKey);
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/rest/search/query/RestArchiveQuery.java b/base/api/src/main/java/org/artifactory/api/rest/search/query/RestArchiveQuery.java
deleted file mode 100644
index 0b090e9..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/search/query/RestArchiveQuery.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.search.query;
-
-/**
- * REST API archive query object
- *
- * @author Noam Y. Tenne
- */
-public class RestArchiveQuery extends BaseRestQuery {
-
-    private String entryName;
-    private boolean shouldCalcEntries = true;
-
-    /**
-     * Default constructor
-     */
-    public RestArchiveQuery() {
-    }
-
-    /**
-     * Returns the name of the entry to search for
-     *
-     * @return Entry name to search for
-     */
-    public String getEntryName() {
-        return entryName;
-    }
-
-    /**
-     * Sets the name of the entry name to search for
-     *
-     * @param entryName Entry name to search for
-     */
-    public void setEntryName(String entryName) {
-        this.entryName = entryName;
-    }
-
-    /**
-     * Indicates if to perform result entry analysis
-     *
-     * @return True if should perform result entry analysis
-     */
-    public boolean isShouldCalcEntries() {
-        return shouldCalcEntries;
-    }
-
-    /**
-     * Sets if to perform result entry analysis
-     *
-     * @param shouldCalcEntries True if should perform result entry analysis
-     */
-    public void setShouldCalcEntries(boolean shouldCalcEntries) {
-        this.shouldCalcEntries = shouldCalcEntries;
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/rest/search/query/RestArtifactQuery.java b/base/api/src/main/java/org/artifactory/api/rest/search/query/RestArtifactQuery.java
deleted file mode 100644
index cb6ceac..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/search/query/RestArtifactQuery.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.search.query;
-
-/**
- * REST API artifact query object
- *
- * @author Noam Y. Tenne
- */
-public class RestArtifactQuery extends BaseRestQuery {
-
-    private String artifactId;
-
-    /**
-     * Default constructor
-     */
-    public RestArtifactQuery() {
-    }
-
-    /**
-     * Returns the artifact ID to search for
-     *
-     * @return Artifact ID to search for
-     */
-    public String getArtifactId() {
-        return artifactId;
-    }
-
-    /**
-     * Sets the artifact ID to search for
-     *
-     * @param artifactId Artifact ID to search for
-     */
-    public void setArtifactId(String artifactId) {
-        this.artifactId = artifactId;
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/rest/search/query/RestGavcQuery.java b/base/api/src/main/java/org/artifactory/api/rest/search/query/RestGavcQuery.java
deleted file mode 100644
index 15cc956..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/search/query/RestGavcQuery.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.search.query;
-
-/**
- * REST API GAVC query object
- *
- * @author Noam Y. Tenne
- */
-public class RestGavcQuery extends BaseRestQuery {
-
-    private String groupId;
-    private String artifactId;
-    private String version;
-    private String classifier;
-
-    /**
-     * Default constructor
-     */
-    public RestGavcQuery() {
-    }
-
-    /**
-     * Returns the group ID to search for
-     *
-     * @return Group ID to search for
-     */
-    public String getGroupId() {
-        return groupId;
-    }
-
-    /**
-     * Sets the group ID to search for
-     *
-     * @param groupId Group ID to search for
-     */
-    public void setGroupId(String groupId) {
-        this.groupId = groupId;
-    }
-
-    /**
-     * Returns the artifact ID to search for
-     *
-     * @return Artifact ID to search for
-     */
-    public String getArtifactId() {
-        return artifactId;
-    }
-
-    /**
-     * Sets the artifact ID to search for
-     *
-     * @param artifactId Artifact ID to search for
-     */
-    public void setArtifactId(String artifactId) {
-        this.artifactId = artifactId;
-    }
-
-    /**
-     * Returns the version to search for
-     *
-     * @return Version to search for
-     */
-    public String getVersion() {
-        return version;
-    }
-
-    /**
-     * Sets the version to search for
-     *
-     * @param version Version to search for
-     */
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    /**
-     * Returns the classifier to search for
-     *
-     * @return Classifier to search for
-     */
-    public String getClassifier() {
-        return classifier;
-    }
-
-    /**
-     * Sets the classifier to search for
-     *
-     * @param classifier Classifier to search for
-     */
-    public void setClassifier(String classifier) {
-        this.classifier = classifier;
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/rest/search/query/RestMetadataQuery.java b/base/api/src/main/java/org/artifactory/api/rest/search/query/RestMetadataQuery.java
deleted file mode 100644
index d79a52c..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/search/query/RestMetadataQuery.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.search.query;
-
-/**
- * REST API archive query object
- *
- * @author Noam Y. Tenne
- */
-public class RestMetadataQuery extends BaseRestQuery {
-
-    private boolean xmlSearch;
-    private String metadataName;
-    private String path;
-    private String value;
-    private boolean exactMatch;
-
-    /**
-     * Default constructor
-     */
-    public RestMetadataQuery() {
-    }
-
-    /**
-     * Indicates if the search should be performed as an XML search or as a metadata search
-     *
-     * @return True if the search should be performed as an XML search. False if as a metadata search
-     */
-    public boolean isXmlSearch() {
-        return xmlSearch;
-    }
-
-    /**
-     * Sets if the search should be performed as an XML search or as a metadata search
-     *
-     * @param xmlSearch True if the search should be performed as an XML search. False if as a metadata search
-     */
-    public void setXmlSearch(boolean xmlSearch) {
-        this.xmlSearch = xmlSearch;
-    }
-
-    /**
-     * Returns the name of the metadata type to search for
-     *
-     * @return Metadata type name to search for
-     */
-    public String getMetadataName() {
-        return metadataName;
-    }
-
-    /**
-     * Sets the name of the metadata type to search for
-     *
-     * @param metadataName Metadata type name to search for
-     */
-    public void setMetadataName(String metadataName) {
-        this.metadataName = metadataName;
-    }
-
-    /**
-     * Returns the path to search for within the metadata
-     *
-     * @return The path to search for within the metadata
-     */
-    public String getPath() {
-        return path;
-    }
-
-    /**
-     * Sets the path to search for within the metadata
-     *
-     * @param path The path to search for within the metadata
-     */
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    /**
-     * Returns the value to search for within the metadata
-     *
-     * @return The value to search for within the metadata
-     */
-    public String getValue() {
-        return value;
-    }
-
-    /**
-     * Sets the value to search for within the metadata
-     *
-     * @param value The value to search for within the metadata
-     */
-    public void setValue(String value) {
-        this.value = value;
-    }
-
-    /**
-     * Indicates if the results should be an exact match of the value
-     *
-     * @return True if the results should be an exact match of the value
-     */
-    public boolean isExactMatch() {
-        return exactMatch;
-    }
-
-    /**
-     * Sets if the results should be an exact match of the value
-     *
-     * @param exactMatch True if the results should be an exact match of the value
-     */
-    public void setExactMatch(boolean exactMatch) {
-        this.exactMatch = exactMatch;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/search/result/ArchiveRestSearchResult.java b/base/api/src/main/java/org/artifactory/api/rest/search/result/ArchiveRestSearchResult.java
deleted file mode 100644
index 71f6639..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/search/result/ArchiveRestSearchResult.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.search.result;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Json object retuning the ArchiveSearchResource search results
- *
- * @author Eli Givoni
- */
-public class ArchiveRestSearchResult {
-    public List<ArchiveEntry> results = new ArrayList<>();
-
-    public static class ArchiveEntry {
-        public String entry;
-        public List<String> archiveUris;
-
-        public ArchiveEntry(String entry, List<String> archiveUris) {
-            this.entry = entry;
-            this.archiveUris = archiveUris;
-        }
-
-        private ArchiveEntry() {
-        }
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/rest/search/result/ArtifactVersionsResult.java b/base/api/src/main/java/org/artifactory/api/rest/search/result/ArtifactVersionsResult.java
deleted file mode 100644
index 563cac3..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/search/result/ArtifactVersionsResult.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.search.result;
-
-import com.google.common.collect.Lists;
-
-import javax.annotation.Nonnull;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * Search result object to be returned by REST artifact versions searches
- *
- * @author Shay Yaakov
- */
-public class ArtifactVersionsResult {
-    private List<VersionEntry> results;
-
-    /**
-     * Default constructor for JSON parsing
-     */
-    public ArtifactVersionsResult() {
-    }
-
-    public ArtifactVersionsResult(Collection<VersionEntry> versionEntries, final Comparator<String> versionComparator) {
-        if (versionEntries == null) {
-            this.results = Collections.emptyList();
-        } else {
-            this.results = Lists.newArrayList(versionEntries);
-            // sort according to the input string version comparator
-            Collections.sort(results, new Comparator<VersionEntry>() {
-                @Override
-                public int compare(VersionEntry version1, VersionEntry version2) {
-                    return versionComparator.compare(version2.getVersion(), version1.getVersion());
-                }
-            });
-        }
-    }
-
-    @Nonnull
-    public List<VersionEntry> getResults() {
-        return results;
-    }
-
-    public void setResults(List<VersionEntry> results) {
-        this.results = results;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/search/result/BadChecksumRestSearchResult.java b/base/api/src/main/java/org/artifactory/api/rest/search/result/BadChecksumRestSearchResult.java
deleted file mode 100644
index 4c02e59..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/search/result/BadChecksumRestSearchResult.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.search.result;
-
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.checksum.ChecksumType;
-
-import java.util.Set;
-
-/**
- * Search result object to be returned by REST bad checksum searches
- *
- * @author Tomer Cohen
- */
-public class BadChecksumRestSearchResult {
-
-    private Set<SearchEntry> results = Sets.newHashSet();
-
-    public BadChecksumRestSearchResult(Set<SearchEntry> results) {
-        this.results = results;
-    }
-
-    public BadChecksumRestSearchResult() {
-    }
-
-    public Set<SearchEntry> getResults() {
-        return results;
-    }
-
-    public void setResults(Set<SearchEntry> results) {
-        this.results = results;
-    }
-
-    public void addResultAccordingToType(String uri, String clientChecksum, String serverChecksum, ChecksumType type) {
-        results.add(SearchEntry.createSearchEntryAccordingToType(uri, serverChecksum, clientChecksum, type));
-    }
-
-    public static class SearchEntry {
-        private String uri;
-        private String serverMd5;
-        private String clientMd5;
-        private String serverSha1;
-        private String clientSha1;
-
-        public SearchEntry(String uri) {
-            this.uri = uri;
-        }
-
-        public static SearchEntry createSearchEntryAccordingToType(String uri, String serverChecksum,
-                String clientChecksum, ChecksumType type) {
-            SearchEntry entry = new SearchEntry(uri);
-            serverChecksum = StringUtils.isNotBlank(serverChecksum) ? serverChecksum : "";
-            clientChecksum = StringUtils.isNotBlank(clientChecksum) ? clientChecksum : "";
-            if (ChecksumType.md5.equals(type)) {
-                entry.setServerMd5(serverChecksum);
-                entry.setClientMd5(clientChecksum);
-            } else if (ChecksumType.sha1.equals(type)) {
-                entry.setServerSha1(serverChecksum);
-                entry.setClientSha1(clientChecksum);
-            } else {
-                throw new AssertionError();
-            }
-            return entry;
-        }
-
-        private SearchEntry() {
-        }
-
-        public String getUri() {
-            return uri;
-        }
-
-        public void setUri(String uri) {
-            this.uri = uri;
-        }
-
-        public String getServerMd5() {
-            return serverMd5;
-        }
-
-        public void setServerMd5(String serverMd5) {
-            this.serverMd5 = serverMd5;
-        }
-
-        public String getClientMd5() {
-            return clientMd5;
-        }
-
-        public void setClientMd5(String clientMd5) {
-            this.clientMd5 = clientMd5;
-        }
-
-        public String getServerSha1() {
-            return serverSha1;
-        }
-
-        public void setServerSha1(String serverSha1) {
-            this.serverSha1 = serverSha1;
-        }
-
-        public String getClientSha1() {
-            return clientSha1;
-        }
-
-        public void setClientSha1(String clientSha1) {
-            this.clientSha1 = clientSha1;
-        }
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/search/result/CreatedInRangeRestSearchResult.java b/base/api/src/main/java/org/artifactory/api/rest/search/result/CreatedInRangeRestSearchResult.java
deleted file mode 100644
index c33fbdc..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/search/result/CreatedInRangeRestSearchResult.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-package org.artifactory.api.rest.search.result;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Json object retuning the CreatedInRangeResource search results
- *
- * @author Eli Givoni
- */
-public class CreatedInRangeRestSearchResult {
-    public List<CreatedEntry> results = new ArrayList<>();
-
-    public static class CreatedEntry {
-        public String uri;
-        public String created;
-
-        public CreatedEntry(String uri, String created) {
-            this.uri = uri;
-            this.created = created;
-        }
-
-        private CreatedEntry() {
-        }
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/search/result/DependencyBuilds.java b/base/api/src/main/java/org/artifactory/api/rest/search/result/DependencyBuilds.java
deleted file mode 100644
index 7c97185..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/search/result/DependencyBuilds.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.search.result;
-
-import java.util.List;
-
-/**
- * @author Noam Y. Tenne
- */
-public class DependencyBuilds {
-
-    List<DependencyBuild> results;
-
-    public DependencyBuilds(List<DependencyBuild> results) {
-        this.results = results;
-    }
-
-    public DependencyBuilds() {
-    }
-
-    public List<DependencyBuild> getResults() {
-        return results;
-    }
-
-    public void setResults(List<DependencyBuild> results) {
-        this.results = results;
-    }
-
-    public static class DependencyBuild {
-        private String uri;
-
-        public DependencyBuild(String uri) {
-            this.uri = uri;
-        }
-
-        public DependencyBuild() {
-        }
-
-        public String getUri() {
-            return uri;
-        }
-
-        public void setUri(String uri) {
-            this.uri = uri;
-        }
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/search/result/DownloadRestSearchResult.java b/base/api/src/main/java/org/artifactory/api/rest/search/result/DownloadRestSearchResult.java
deleted file mode 100644
index cd04752..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/search/result/DownloadRestSearchResult.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.search.result;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Json object retuning the BuildArtifactSearchResource search results
- *
- * @author Shay Yaakov
- */
-public class DownloadRestSearchResult {
-    public List<SearchEntry> results = new ArrayList<>();
-
-    public static class SearchEntry {
-        public String downloadUri;
-
-        public SearchEntry(String downloadUri) {
-            this.downloadUri = downloadUri;
-        }
-
-        private SearchEntry() {
-        }
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/search/result/DynamicItemSearchResult.java b/base/api/src/main/java/org/artifactory/api/rest/search/result/DynamicItemSearchResult.java
deleted file mode 100644
index 2fa8b7f..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/search/result/DynamicItemSearchResult.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.search.result;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Date: 5/11/14 2:51 PM
- *
- * @author freds
- */
-public class DynamicItemSearchResult {
-    public List<SearchEntry> results = new ArrayList<>();
-
-    public static class SearchEntry {
-        public String uri;
-        public String created;
-        public String lastModified;
-        public String lastDownloaded;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/search/result/InfoRestSearchResult.java b/base/api/src/main/java/org/artifactory/api/rest/search/result/InfoRestSearchResult.java
deleted file mode 100644
index 3636ca0..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/search/result/InfoRestSearchResult.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-package org.artifactory.api.rest.search.result;
-
-import org.artifactory.api.rest.artifact.RestBaseStorageInfo;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Json object retuning the ArtifactSearchResource,GavcSearchResource, PropertySearchResource search results
- *
- * @author Eli Givoni
- */
-public class InfoRestSearchResult {
-    public List<RestBaseStorageInfo> results = new ArrayList<>();
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/search/result/LastDownloadRestResult.java b/base/api/src/main/java/org/artifactory/api/rest/search/result/LastDownloadRestResult.java
deleted file mode 100644
index f59b360..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/search/result/LastDownloadRestResult.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-package org.artifactory.api.rest.search.result;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Json object retuning the UsageSinceResource search results
- *
- * @author Eli Givoni
- */
-public class LastDownloadRestResult {
-    public List<DownloadedEntry> results = new ArrayList<>();
-
-    @Override
-    public String toString() {
-        return results.toString();
-    }
-
-    public static class DownloadedEntry {
-        public String uri;
-        public String lastDownloaded;
-
-        public DownloadedEntry(String uri, String lastDownloaded) {
-            this.uri = uri;
-            this.lastDownloaded = lastDownloaded;
-        }
-
-        @SuppressWarnings("UnusedDeclaration")
-        private DownloadedEntry() {
-            // for json mapper
-        }
-
-        @Override
-        public String toString() {
-            final StringBuilder sb = new StringBuilder();
-            sb.append("DownloadedEntry");
-            sb.append("{uri='").append(uri).append('\'');
-            sb.append(", lastDownloaded='").append(lastDownloaded).append('\'');
-            sb.append('}');
-            return sb.toString();
-        }
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/search/result/LicensesSearchResult.java b/base/api/src/main/java/org/artifactory/api/rest/search/result/LicensesSearchResult.java
deleted file mode 100644
index d50c3cb..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/search/result/LicensesSearchResult.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.search.result;
-
-import com.google.common.collect.Lists;
-
-import java.util.List;
-
-/**
- * License search results for REST query.
- *
- * @author Tomer Cohen
- */
-public class LicensesSearchResult {
-
-    public List<ArtifactLicenses> results = Lists.newArrayList();
-
-    public static class ArtifactLicenses {
-        public String uri;
-        public String license;
-        public String found = "";
-        public String status;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/search/result/PatternResultFileSet.java b/base/api/src/main/java/org/artifactory/api/rest/search/result/PatternResultFileSet.java
deleted file mode 100644
index dc44661..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/search/result/PatternResultFileSet.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.search.result;
-
-import com.google.common.collect.Sets;
-
-import java.util.Set;
-
-/**
- * The pattern searcher result model
- *
- * @author Noam Y. Tenne
- */
-public class PatternResultFileSet {
-
-    private String repoUri;
-    private String sourcePattern;
-    private Set<String> files = Sets.newHashSet();
-
-    public PatternResultFileSet(String repoUri, String sourcePattern) {
-        this.repoUri = repoUri;
-        this.sourcePattern = sourcePattern;
-    }
-
-    public PatternResultFileSet(String repoUri, String sourcePattern, Set<String> files) {
-        this.repoUri = repoUri;
-        this.sourcePattern = sourcePattern;
-        this.files = files;
-    }
-
-    public PatternResultFileSet() {
-    }
-
-    public String getRepoUri() {
-        return repoUri;
-    }
-
-    public void setRepoUri(String repoUri) {
-        this.repoUri = repoUri;
-    }
-
-    public String getSourcePattern() {
-        return sourcePattern;
-    }
-
-    public void setSourcePattern(String sourcePattern) {
-        this.sourcePattern = sourcePattern;
-    }
-
-    public Set<String> getFiles() {
-        return files;
-    }
-
-    public void setFiles(Set<String> files) {
-        this.files = files;
-    }
-
-    public void addFile(String fileRelativePath) {
-        if (files == null) {
-            files = Sets.newHashSet();
-        }
-
-        files.add(fileRelativePath);
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/search/result/VersionEntry.java b/base/api/src/main/java/org/artifactory/api/rest/search/result/VersionEntry.java
deleted file mode 100644
index a54f877..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/search/result/VersionEntry.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.search.result;
-
-/**
- * Compound result object to be returned by REST artifact versions searches
- *
- * @author Shay Yaakov
- */
-public class VersionEntry {
-
-    /**
-     * The version string
-     */
-    private String version;
-    /**
-     * True if it represents an integration (snapshot) version in the repository it originated
-     */
-    private boolean integration;
-
-    /**
-     * Default constructor for Json parsing
-     */
-    public VersionEntry() {
-
-    }
-
-    public VersionEntry(String version, boolean integration) {
-        this.version = version;
-        this.integration = integration;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public boolean isIntegration() {
-        return integration;
-    }
-
-    public void setIntegration(boolean integration) {
-        this.integration = integration;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        VersionEntry that = (VersionEntry) o;
-
-        if (integration != that.integration) {
-            return false;
-        }
-
-        if (!version.equals(that.version)) {
-            return false;
-        }
-
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = version.hashCode();
-        result = 31 * result + (integration ? 1 : 0);
-        return result;
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/rest/search/result/VersionRestResult.java b/base/api/src/main/java/org/artifactory/api/rest/search/result/VersionRestResult.java
deleted file mode 100644
index 8a3c9b0..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/search/result/VersionRestResult.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.search.result;
-
-import org.artifactory.api.config.VersionInfo;
-
-import java.util.List;
-
-/**
- * A wrapper class for a JSON object representation of Artifactory's version, revision, and a list of enabled addons.
- *
- * @author Tomer Cohen
- */
-public class VersionRestResult {
-
-    public String version;
-    public String revision;
-    public List<String> addons;
-    public String license;
-
-    public VersionRestResult(String version, String revision, List<String> addons, String license) {
-        this.version = version;
-        this.revision = revision;
-        this.addons = addons;
-        this.license = license;
-    }
-
-    /**
-     * Constructor used by the JSON parser
-     */
-    private VersionRestResult() {
-
-    }
-
-    /**
-     * Converts {@link VersionRestResult} to {@link VersionInfo}
-     *
-     * @return {@link VersionInfo}
-     */
-    public VersionInfo toVersionInfo() {
-        return new VersionInfo(version, revision);
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append("version: ");
-        sb.append(version);
-        sb.append(" | ");
-        sb.append("revision: ");
-        sb.append(revision);
-        sb.append(" | ");
-        sb.append("addons: ");
-        sb.append(addons);
-        sb.append(" | ");
-        sb.append("license: ");
-        sb.append(license);
-        return sb.toString();
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/rest/versions/VersionsSearchResult.java b/base/api/src/main/java/org/artifactory/api/rest/versions/VersionsSearchResult.java
deleted file mode 100644
index 9453202..0000000
--- a/base/api/src/main/java/org/artifactory/api/rest/versions/VersionsSearchResult.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.versions;
-
-import org.artifactory.api.rest.artifact.RestFileInfo;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class VersionsSearchResult {
-    public String version;
-    public List<RestFileInfo> artifacts = new ArrayList<>();
-}
diff --git a/base/api/src/main/java/org/artifactory/api/search/ArchiveIndexer.java b/base/api/src/main/java/org/artifactory/api/search/ArchiveIndexer.java
deleted file mode 100644
index dce0011..0000000
--- a/base/api/src/main/java/org/artifactory/api/search/ArchiveIndexer.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search;
-
-import org.artifactory.api.repo.Async;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.common.Lock;
-
-import javax.annotation.Nullable;
-
-/**
- * The archive indexer manages the indexes task queue and performs archives indexing.
- *
- * @author Yossi Shaul
- */
-public interface ArchiveIndexer {
-
-    /**
-     * Async indexes all the archives that were marked.
-     * <p>Does not guarantee actual indexing, it is the responsibility of {@link ArchiveIndexer} to decide on indexing
-     * or even stop indexing in the middle.
-     */
-    @Async(delayUntilAfterCommit = true)
-    void asyncIndexMarkedArchives();
-
-    /**
-     * Adds the given repo path to the archive indexing queue.
-     */
-    @Lock
-    void markArchiveForIndexing(RepoPath searchPath);
-
-    /**
-     * Recursively adds the given repo path to the archive indexing queue.
-     * <p>Does not call {@link #asyncIndexMarkedArchives()}, this responsibility left to the client.
-     *
-     * @param baseRepoPath  repository path to start indexing from
-     * @param indexAllRepos If true ignores the base repo path and index all the local/cache repositories
-     */
-    @Async(delayUntilAfterCommit = true)
-    void recursiveMarkArchivesForIndexing(@Nullable RepoPath baseRepoPath, boolean indexAllRepos);
-
-    /**
-     * @param repoPath The repo path to check
-     * @return True if the binary file on this repo path is already indexed. False if doesn't exist of not indexed
-     */
-    boolean isIndexed(RepoPath repoPath);
-
-    /**
-     * @param sha1 The sha1 of the binary to check
-     * @return True if the binary file for this checksum is already indexed. False if doesn't exist of not indexed
-     */
-    boolean isIndexed(String sha1);
-}
diff --git a/base/api/src/main/java/org/artifactory/api/search/BintrayItemSearchResults.java b/base/api/src/main/java/org/artifactory/api/search/BintrayItemSearchResults.java
deleted file mode 100644
index 31c6971..0000000
--- a/base/api/src/main/java/org/artifactory/api/search/BintrayItemSearchResults.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.artifactory.api.search;
-
-import com.thoughtworks.xstream.annotations.XStreamImplicit;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * Bintray Search result
- *
- * @author Gidi Shabat
- */
-public class BintrayItemSearchResults<T> implements Serializable {
-
-    @XStreamImplicit(itemFieldName = "searchResult")
-    private List<T> results;
-    private long rangeLimitTotal;
-
-    public BintrayItemSearchResults(List<T> results, long rangeLimitTotal) {
-        this.results = results;
-        this.rangeLimitTotal = rangeLimitTotal;
-    }
-
-    public List<T> getResults() {
-        return results;
-    }
-
-    public long getRangeLimitTotal() {
-        return rangeLimitTotal;
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/search/ItemSearchResult.java b/base/api/src/main/java/org/artifactory/api/search/ItemSearchResult.java
deleted file mode 100644
index a0a95c0..0000000
--- a/base/api/src/main/java/org/artifactory/api/search/ItemSearchResult.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search;
-
-import org.artifactory.fs.ItemInfo;
-
-import java.io.Serializable;
-
-/**
- * A search result that holds a repository item
- *
- * @author Yoav Landman
- */
-public interface ItemSearchResult extends Serializable {
-    ItemInfo getItemInfo();
-
-    String getName();
-}
diff --git a/base/api/src/main/java/org/artifactory/api/search/ItemSearchResults.java b/base/api/src/main/java/org/artifactory/api/search/ItemSearchResults.java
deleted file mode 100644
index 4d5f3a7..0000000
--- a/base/api/src/main/java/org/artifactory/api/search/ItemSearchResults.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search;
-
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import com.thoughtworks.xstream.annotations.XStreamImplicit;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * Holds a list of search results
- *
- * @author Noam Tenne
- */
- at XStreamAlias("searchResults")
-public class ItemSearchResults<T extends ItemSearchResult> implements Serializable {
-
-    @XStreamImplicit(itemFieldName = "searchResult")
-    private List<T> results;
-
-    private long fullResultsCount;
-
-    private long time;
-
-    /**
-     * Constructor - A list of SearchResult objects
-     *
-     * @param results
-     */
-    public ItemSearchResults(List<T> results) {
-        this.results = results;
-        this.fullResultsCount = -1L;
-    }
-
-    /**
-     * Constructor
-     *
-     * @param results - A list of SearchResult objects
-     * @param count   - The number of the complete amount of search results (including the excluded results, like
-     *                checksums)
-     */
-    public ItemSearchResults(List<T> results, long count) {
-        this.results = results;
-        this.fullResultsCount = count;
-    }
-
-    /**
-     * Returns the result group
-     *
-     * @return List<ResultEntry> - A list of SearchResult objects
-     */
-    public List<T> getResults() {
-        return results;
-    }
-
-    /**
-     * Sets the result group
-     *
-     * @param results - A list of SearchResult objects
-     */
-    public void setResults(List<T> results) {
-        this.results = results;
-    }
-
-    /**
-     * Returns the counter of the full amount of results that were returned in the search (including filtered results).
-     * May return -1 if the total number of results in unknown for performance reasons.
-     *
-     * @return long - Full size of results, or -1 if unkonwn
-     */
-    public long getFullResultsCount() {
-        return fullResultsCount;
-    }
-
-    /**
-     * Sets the amount for the counter of all the results returned from the search
-     *
-     * @param fullResultsCount - Full amount of results
-     */
-    public void setFullResultsCount(long fullResultsCount) {
-        this.fullResultsCount = fullResultsCount;
-    }
-
-    public long getTime() {
-        return time;
-    }
-
-    public void setTime(long time) {
-        this.time = time;
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/search/SavedSearchResults.java b/base/api/src/main/java/org/artifactory/api/search/SavedSearchResults.java
deleted file mode 100644
index d8e5891..0000000
--- a/base/api/src/main/java/org/artifactory/api/search/SavedSearchResults.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.fs.FileInfo;
-
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Holds and manages list of search files. Instances of this class doesn't allow files with the same relative path.
- *
- * @author Yossi Shaul
- */
-public class SavedSearchResults implements Serializable {
-    private final String name;
-    //private final List<FileInfo> results;
-    private final Set<RepoAgnosticFileInfo> results;
-
-    public SavedSearchResults(String name, List<FileInfo> results) {
-        if (StringUtils.isEmpty(name)) {
-            throw new IllegalArgumentException("Empty results name is not allowed");
-        }
-        this.name = name;
-        this.results = Sets.newHashSet();
-        if (results != null) {
-            // make a protective copy and remove duplicates if exist
-            addAll(results);
-        }
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void merge(SavedSearchResults toMerge) {
-        results.addAll(toMerge.results);
-    }
-
-    public void subtract(SavedSearchResults toSubtract) {
-        results.removeAll(toSubtract.results);
-    }
-
-    public void intersect(SavedSearchResults toIntersect) {
-        results.retainAll(toIntersect.results); // Sets.retainAll <==> intersection
-    }
-
-    public void discardFromResult(SavedSearchResults toDiscardFromResult) {
-        results.removeAll(toDiscardFromResult.results);
-    }
-
-    public ImmutableList<FileInfo> getResults() {
-        ImmutableList.Builder<FileInfo> builder = ImmutableList.builder();
-        for (RepoAgnosticFileInfo result : results) {
-            builder.add(result.fileInfo);
-        }
-        return builder.build();
-    }
-
-    public void addAll(Collection<FileInfo> fileInfos) {
-        results.addAll(toRepoAgnosticSet(fileInfos));
-    }
-
-    public void removeAll(Collection<FileInfo> fileInfos) {
-        results.removeAll(toRepoAgnosticSet(fileInfos));
-    }
-
-    public int size() {
-        return results.size();
-    }
-
-    public boolean isEmpty() {
-        return results.isEmpty();
-    }
-
-    boolean contains(FileInfo fileInfo) {
-        return results.contains(new RepoAgnosticFileInfo(fileInfo));
-    }
-
-    void add(FileInfo fileInfo) {
-        results.add(new RepoAgnosticFileInfo(fileInfo));
-    }
-
-    private Set<RepoAgnosticFileInfo> toRepoAgnosticSet(Collection<FileInfo> fileInfos) {
-        Set<RepoAgnosticFileInfo> agnostics = Sets.newHashSet();
-        for (FileInfo fileInfo : fileInfos) {
-            agnostics.add(new RepoAgnosticFileInfo(fileInfo));
-        }
-        return agnostics;
-    }
-
-    /**
-     * Holds a file info and ignores the source repository when comparing two file infos.
-     */
-    private static class RepoAgnosticFileInfo implements Serializable {
-        private FileInfo fileInfo;
-
-        private RepoAgnosticFileInfo(FileInfo fileInfo) {
-            this.fileInfo = fileInfo;
-        }
-
-        /**
-         * files equality is driven by the relative path only. We use the relative path because the artifact may be
-         * from different repos and we only display one of them
-         */
-        @Override
-        public boolean equals(Object o) {
-            if (this == o) {
-                return true;
-            }
-            if (o == null || getClass() != o.getClass()) {
-                return false;
-            }
-
-            RepoAgnosticFileInfo that = (RepoAgnosticFileInfo) o;
-
-            if (fileInfo.getRelPath() != null ? !fileInfo.getRelPath().equals(that.fileInfo.getRelPath()) :
-                    that.fileInfo.getRelPath() != null) {
-                return false;
-            }
-
-            return true;
-        }
-
-        @Override
-        public int hashCode() {
-            return fileInfo.getRelPath() != null ? fileInfo.getRelPath().hashCode() : 0;
-        }
-    }
-
-}
diff --git a/base/api/src/main/java/org/artifactory/api/search/SearchControls.java b/base/api/src/main/java/org/artifactory/api/search/SearchControls.java
deleted file mode 100644
index ab1e8b1..0000000
--- a/base/api/src/main/java/org/artifactory/api/search/SearchControls.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search;
-
-import javax.annotation.Nullable;
-import java.io.Serializable;
-import java.util.List;
-
-public interface SearchControls extends Serializable {
-    /**
-     * @return true if the search controls are considered "empty" so that a search should not even be attempted.
-     */
-    boolean isEmpty();
-
-    /**
-     * @return true if the search controls contains wildcards only. User search should be attempted.
-     */
-    boolean isWildcardsOnly();
-
-    /**
-     * Indicates if the search results should be limited as in the system spec
-     *
-     * @return True if the search results should be limited
-     */
-    boolean isLimitSearchResults();
-
-    /**
-     * Resets the result limit indicator to it's default - true
-     */
-    void resetResultLimit();
-
-    /**
-     * Returns list of repository keys to search in. Search in any repo if null or empty.
-     */
-    @Nullable
-    List<String> getSelectedRepoForSearch();
-
-    /**
-     * @return True if the search is limited to specific repositories.
-     */
-    boolean isSpecificRepoSearch();
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/search/SearchControlsBase.java b/base/api/src/main/java/org/artifactory/api/search/SearchControlsBase.java
deleted file mode 100644
index d0593aa..0000000
--- a/base/api/src/main/java/org/artifactory/api/search/SearchControlsBase.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-
-import javax.annotation.Nullable;
-import java.util.List;
-import java.util.regex.Pattern;
-
-/**
- * A base implementation for all search control classes
- *
- * @author Noam Y. Tenne
- */
-public abstract class SearchControlsBase implements SearchControls {
-
-    /**
-     * Regexp to test if string contains only wildcards ('*' or '?' only).
-     */
-    private static Pattern wildcardsOnlyPattern = Pattern.compile("(\\*|\\?)+");
-
-    private boolean limitSearchResults = true;
-    protected List<String> selectedRepoForSearch;
-
-    @Override
-    @Nullable
-    public List<String> getSelectedRepoForSearch() {
-        return selectedRepoForSearch;
-    }
-
-    /**
-     * Limit the search to the specified repository keys. Search in any repo if empty.
-     *
-     * @param selectedRepoForSearch List of repository keys to search in.
-     */
-    public void setSelectedRepoForSearch(List<String> selectedRepoForSearch) {
-        this.selectedRepoForSearch = selectedRepoForSearch;
-    }
-
-    @Override
-    public boolean isLimitSearchResults() {
-        return limitSearchResults;
-    }
-
-    /**
-     * Sets the search result limit indicator
-     *
-     * @param limitSearchResults True if the search results should be limited
-     */
-    public void setLimitSearchResults(boolean limitSearchResults) {
-        this.limitSearchResults = limitSearchResults;
-    }
-
-    @Override
-    public void resetResultLimit() {
-        limitSearchResults = true;
-    }
-
-    @Override
-    public boolean isSpecificRepoSearch() {
-        return selectedRepoForSearch != null && !selectedRepoForSearch.isEmpty();
-    }
-
-    public void addRepoToSearch(String repoKey) {
-        if (selectedRepoForSearch == null) {
-            selectedRepoForSearch = Lists.newArrayList();
-        }
-        selectedRepoForSearch.add(repoKey);
-    }
-
-    /**
-     * @param str String to check
-     * @return True is the input is empty or it contains wildcards only
-     */
-    public boolean isWildcardsOnly(String str) {
-        return StringUtils.isBlank(str) || wildcardsOnlyPattern.matcher(str).matches();
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/search/SearchResultBase.java b/base/api/src/main/java/org/artifactory/api/search/SearchResultBase.java
deleted file mode 100644
index 60fb3ec..0000000
--- a/base/api/src/main/java/org/artifactory/api/search/SearchResultBase.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.util.PathUtils;
-
-/**
- * @author Yoav Landman
- */
-public abstract class SearchResultBase implements ItemSearchResult {
-    public final ItemInfo itemInfo;
-
-    public SearchResultBase(ItemInfo itemInfo) {
-        this.itemInfo = itemInfo;
-    }
-
-    @Override
-    public ItemInfo getItemInfo() {
-        return itemInfo;
-    }
-
-    @Override
-    public String getName() {
-        String itemName = itemInfo.getName();
-        if (StringUtils.isEmpty(itemName)) {
-            return getRepoKey();
-        }
-        return itemName;
-    }
-
-    public String getRelDirPath() {
-        return PathUtils.getParent(itemInfo.getRelPath());
-    }
-
-    public String getRepoKey() {
-        return itemInfo.getRepoKey();
-    }
-
-    /**
-     * @return The relative path of the search result item
-     */
-    public String getRelativePath() {
-        return itemInfo.getRelPath();
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof SearchResultBase)) {
-            return false;
-        }
-
-        SearchResultBase base = (SearchResultBase) o;
-
-        return !(itemInfo != null ? !itemInfo.equals(base.itemInfo) : base.itemInfo != null);
-
-    }
-
-    @Override
-    public int hashCode() {
-        return itemInfo != null ? itemInfo.hashCode() : 0;
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/search/SearchService.java b/base/api/src/main/java/org/artifactory/api/search/SearchService.java
deleted file mode 100644
index ee65347..0000000
--- a/base/api/src/main/java/org/artifactory/api/search/SearchService.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search;
-
-import org.artifactory.api.rest.search.common.RestDateFieldName;
-import org.artifactory.api.search.archive.ArchiveSearchControls;
-import org.artifactory.api.search.archive.ArchiveSearchResult;
-import org.artifactory.api.search.artifact.ArtifactSearchControls;
-import org.artifactory.api.search.artifact.ArtifactSearchResult;
-import org.artifactory.api.search.artifact.ChecksumSearchControls;
-import org.artifactory.api.search.gavc.GavcSearchControls;
-import org.artifactory.api.search.gavc.GavcSearchResult;
-import org.artifactory.api.search.property.PropertySearchControls;
-import org.artifactory.api.search.property.PropertySearchResult;
-import org.artifactory.api.search.stats.StatsSearchControls;
-import org.artifactory.api.search.stats.StatsSearchResult;
-import org.artifactory.build.BuildRun;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-
-import javax.annotation.Nullable;
-import java.util.Calendar;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeoutException;
-
-/**
- * @author Noam Tenne
- */
-public interface SearchService {
-
-    /**
-     * @param controls Search data (mainly the search term)
-     * @return Artifacts found by the search, empty list if nothing was found
-     */
-    ItemSearchResults<ArtifactSearchResult> searchArtifacts(ArtifactSearchControls controls);
-
-    /**
-     * Searches for artifacts by their checksum values
-     *
-     * @param searchControls Search controls
-     * @return Set of repo paths that comply with the given checksums
-     */
-    Set<RepoPath> searchArtifactsByChecksum(ChecksumSearchControls searchControls);
-
-    /**
-     * Searches for artifacts by their checksum values
-     *
-     * @param searchControls Search controls
-     * @return List of ItemSearchResults
-     */
-    ItemSearchResults<ArtifactSearchResult> getArtifactsByChecksumResults(ChecksumSearchControls searchControls);
-
-    /**
-     * Search for files with dates fields passed that are included in the date range provided.
-     * One of the from or to date is mandatory.
-     *
-     * @param from          The time to start the search exclusive (eg, >). If empty will start from 1st Jan 1970
-     * @param to            The time to end search inclusive (eg, <=), If empty, will not use current time as the limit
-     * @param reposToSearch Lists of repositories to search within
-     * @param dates         Lists of date field names to look for
-     * @return List of artifacts that have a date between the input time range and the date the file
-     * was modified. Empty if none is found.
-     */
-    ItemSearchResults<ArtifactSearchResult> searchArtifactsInRange(
-            Calendar from,
-            Calendar to,
-            List<String> reposToSearch,
-            RestDateFieldName... dates);
-
-    ItemSearchResults<StatsSearchResult> searchArtifactsNotDownloadedSince(StatsSearchControls controls);
-
-    ItemSearchResults<ArchiveSearchResult> searchArchiveContent(ArchiveSearchControls controls);
-
-    ItemSearchResults<ArchiveSearchResult> searchArchiveContentAql(ArchiveSearchControls controls);
-
-    ItemSearchResults<GavcSearchResult> searchGavc(GavcSearchControls controls);
-
-    ItemSearchResults<PropertySearchResult> searchProperty(PropertySearchControls controls);
-
-    ItemSearchResults<PropertySearchResult> searchPropertyAql(PropertySearchControls controls);
-
-    Set<BuildRun> getLatestBuilds() throws RepositoryRuntimeException;
-
-    Set<BuildRun> findBuildsByArtifactChecksum(@Nullable String sha1, @Nullable String md5)
-            throws RepositoryRuntimeException;
-
-    Set<BuildRun> findBuildsByDependencyChecksum(@Nullable String sha1, @Nullable String md5)
-            throws RepositoryRuntimeException;
-
-    /**
-     * Search for artifacts within a repository matching a given pattern.<br> The pattern should be like
-     * repo-key:this/is/a/pattern
-     *
-     * @param pattern Pattern to search for
-     * @return Set of matching artifact paths relative to the repo
-     */
-    Set<String> searchArtifactsByPattern(String pattern) throws ExecutionException, InterruptedException,
-            TimeoutException;
-}
diff --git a/base/api/src/main/java/org/artifactory/api/search/Searcher.java b/base/api/src/main/java/org/artifactory/api/search/Searcher.java
deleted file mode 100644
index 92cb7f7..0000000
--- a/base/api/src/main/java/org/artifactory/api/search/Searcher.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search;
-
-/**
- * @author yoavl
- */
-public interface Searcher<C extends SearchControls, R extends ItemSearchResult> {
-    ItemSearchResults<R> search(C controls);
-}
diff --git a/base/api/src/main/java/org/artifactory/api/search/VersionSearchResults.java b/base/api/src/main/java/org/artifactory/api/search/VersionSearchResults.java
deleted file mode 100644
index 6a57a65..0000000
--- a/base/api/src/main/java/org/artifactory/api/search/VersionSearchResults.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search;
-
-import com.google.common.collect.Lists;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import org.artifactory.api.search.deployable.VersionUnitSearchResult;
-
-import java.util.Set;
-
-/**
- * Holds a list of version search results
- *
- * @author Dan Feldman
- */
- at XStreamAlias("searchResults")
-public class VersionSearchResults extends ItemSearchResults<VersionUnitSearchResult> {
-
-    //Signifies if the query exceeded the allowed query limit
-    private boolean queryLimitExceeded;
-
-    private boolean searchHadErrors;
-
-    public VersionSearchResults(Set<VersionUnitSearchResult> results, long count, boolean queryLimitExceeded,
-            boolean searchHadErrors) {
-        super(Lists.newArrayList(results), count);
-        this.queryLimitExceeded = queryLimitExceeded;
-        this.searchHadErrors = searchHadErrors;
-    }
-
-    public boolean isQueryLimitExceeded() {
-        return queryLimitExceeded;
-    }
-
-    public boolean isSearchHadErrors() {
-        return searchHadErrors;
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/search/archive/ArchiveSearchControls.java b/base/api/src/main/java/org/artifactory/api/search/archive/ArchiveSearchControls.java
deleted file mode 100644
index eba7c94..0000000
--- a/base/api/src/main/java/org/artifactory/api/search/archive/ArchiveSearchControls.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search.archive;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.search.SearchControlsBase;
-
-/**
- * Holds the archive content search parameters
- *
- * @author Noam Tenne
- */
-public class ArchiveSearchControls extends SearchControlsBase {
-    private String path;
-    private String name;
-    private boolean excludeInnerClasses;
-    private boolean shouldCalcEntries;
-    private boolean searchClassResourcesOnly;
-
-    /**
-     * Default constructor
-     */
-    public ArchiveSearchControls() {
-        excludeInnerClasses = false;
-        shouldCalcEntries = true;
-        searchClassResourcesOnly = false;
-    }
-
-    /**
-     * Copy constructor
-     *
-     * @param archiveSearchControls Controls to copy
-     */
-    public ArchiveSearchControls(ArchiveSearchControls archiveSearchControls) {
-        this.path = archiveSearchControls.path;
-        this.name = archiveSearchControls.name;
-        this.selectedRepoForSearch = archiveSearchControls.selectedRepoForSearch;
-        setLimitSearchResults(archiveSearchControls.isLimitSearchResults());
-        this.excludeInnerClasses = archiveSearchControls.excludeInnerClasses;
-        this.shouldCalcEntries = archiveSearchControls.shouldCalcEntries;
-        this.searchClassResourcesOnly = archiveSearchControls.searchClassResourcesOnly;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return StringUtils.isEmpty(path) && StringUtils.isEmpty(name);
-    }
-
-    @Override
-    public boolean isWildcardsOnly() {
-        return isWildcardsOnly(path) && isWildcardsOnly(name);
-    }
-
-    public boolean isExcludeInnerClasses() {
-        return excludeInnerClasses;
-    }
-
-    public void setExcludeInnerClasses(boolean excludeInnerClasses) {
-        this.excludeInnerClasses = excludeInnerClasses;
-    }
-
-    public boolean shouldCalcEntries() {
-        return shouldCalcEntries;
-    }
-
-    public void setShouldCalcEntries(boolean shouldCalcEntries) {
-        this.shouldCalcEntries = shouldCalcEntries;
-    }
-
-    public boolean isSearchClassResourcesOnly() {
-        return searchClassResourcesOnly;
-    }
-
-    public void setSearchClassResourcesOnly(boolean searchClassResourcesOnly) {
-        this.searchClassResourcesOnly = searchClassResourcesOnly;
-    }
-
-    public String getQueryDisplay() {
-        return (StringUtils.isNotEmpty(getPath()) && !isWildcardsOnly(getPath()) ? getPath() + "/" : "") +
-                (StringUtils.isNotEmpty(getName()) ? getName() : "");
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/search/archive/ArchiveSearchResult.java b/base/api/src/main/java/org/artifactory/api/search/archive/ArchiveSearchResult.java
deleted file mode 100644
index 56eaa07..0000000
--- a/base/api/src/main/java/org/artifactory/api/search/archive/ArchiveSearchResult.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search.archive;
-
-import org.artifactory.api.search.artifact.ArtifactSearchResult;
-import org.artifactory.fs.ItemInfo;
-
-/**
- * Holds archive content search result data. Inherits from SearchResult and adds two fields: -Entry name -Entry path
- *
- * @author Noam Tenne
- */
-public class ArchiveSearchResult extends ArtifactSearchResult {
-
-    private final String entryName;
-    private final String entryPath;
-    private final boolean isRealEntry;
-
-    /**
-     * @param itemInfo    Item info the info of the zip or jar containing this entry
-     * @param entryName
-     * @param entryPath   Entry path the full path of the entry with the file name at the end
-     * @param isRealEntry Whether the entry is a real one, or just an informative missing entry message
-     */
-    public ArchiveSearchResult(ItemInfo itemInfo, String entryName, String entryPath, boolean isRealEntry) {
-        super(itemInfo);
-        this.entryName = entryName;
-        this.entryPath = entryPath;
-        this.isRealEntry = isRealEntry;
-    }
-
-    public String getEntryName() {
-        return entryName;
-    }
-
-    /**
-     * Returns the entry full path
-     *
-     * @return String - entry full path
-     */
-    public String getEntryPath() {
-        return entryPath;
-    }
-
-    public boolean isRealEntry() {
-        return isRealEntry;
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/search/artifact/ArtifactSearchControls.java b/base/api/src/main/java/org/artifactory/api/search/artifact/ArtifactSearchControls.java
deleted file mode 100644
index 0bc79d3..0000000
--- a/base/api/src/main/java/org/artifactory/api/search/artifact/ArtifactSearchControls.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search.artifact;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.search.SearchControlsBase;
-
-/**
- * Search controls to search for files by name pattern.
- */
-public class ArtifactSearchControls extends SearchControlsBase {
-
-    private String query;
-    private String relativePath;
-
-    public ArtifactSearchControls() {
-    }
-
-    /**
-     * Copy constructor
-     *
-     * @param artifactSearchControls Controls to copy
-     */
-    public ArtifactSearchControls(ArtifactSearchControls artifactSearchControls) {
-        this.query = artifactSearchControls.query;
-        this.relativePath = artifactSearchControls.relativePath;
-        setSelectedRepoForSearch(artifactSearchControls.selectedRepoForSearch);
-        setLimitSearchResults(artifactSearchControls.isLimitSearchResults());
-    }
-
-    public String getQuery() {
-        return query;
-    }
-
-    public void setQuery(String query) {
-        this.query = query;
-    }
-
-    public String getRelativePath() {
-        return relativePath;
-    }
-
-    /**
-     * Relative path to search the artifact under
-     *
-     * @param relativePath Relative path to search the artifact under
-     * @see org.artifactory.sapi.search.VfsQuery#addPathFilter(String)
-     */
-    public void setRelativePath(String relativePath) {
-        this.relativePath = relativePath;
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return StringUtils.isEmpty(query);
-    }
-
-    @Override
-    public boolean isWildcardsOnly() {
-        return isWildcardsOnly(query);
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/search/artifact/ArtifactSearchResult.java b/base/api/src/main/java/org/artifactory/api/search/artifact/ArtifactSearchResult.java
deleted file mode 100644
index 95488c1..0000000
--- a/base/api/src/main/java/org/artifactory/api/search/artifact/ArtifactSearchResult.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search.artifact;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.search.SearchResultBase;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
-
-import java.util.Locale;
-
-/**
- * @author Yoav Landman
- */
-public class ArtifactSearchResult extends SearchResultBase {
-    private static final DateTimeFormatter DAY_FORMAT = DateTimeFormat.forPattern("yyyy-MM-dd")
-            .withLocale(Locale.ENGLISH);
-
-    public ArtifactSearchResult(org.artifactory.fs.ItemInfo itemInfo) {
-        super(itemInfo);
-    }
-
-    public String getLastModifiedDay() {
-        return DAY_FORMAT.print(getLastModified());
-    }
-
-    public String getLastModifiedString() {
-        long lastModified = getItemInfo().getLastModified();
-        return ContextHelper.get().getCentralConfig().format(lastModified);
-    }
-
-    public long getLastModified() {
-        return getItemInfo().getLastModified();
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/search/artifact/ChecksumSearchControls.java b/base/api/src/main/java/org/artifactory/api/search/artifact/ChecksumSearchControls.java
deleted file mode 100644
index cc546bf..0000000
--- a/base/api/src/main/java/org/artifactory/api/search/artifact/ChecksumSearchControls.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search.artifact;
-
-import org.artifactory.api.search.SearchControlsBase;
-import org.artifactory.checksum.ChecksumType;
-
-import java.util.EnumMap;
-
-/**
- * Search controls to be used for checksum searches
- *
- * @author Noam Y. Tenne
- */
-public class ChecksumSearchControls extends SearchControlsBase {
-
-    private EnumMap<ChecksumType, String> checksums;
-
-    public ChecksumSearchControls() {
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return checksums == null || checksums.isEmpty();
-    }
-
-    @Override
-    public boolean isWildcardsOnly() {
-        if (isEmpty()) {
-            return true;
-        }
-        if (checksums != null) {
-            for (String checksum : checksums.values()) {
-                if (isWildcardsOnly(checksum)) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    public EnumMap<ChecksumType, String> getChecksums() {
-        return checksums;
-    }
-
-    public void addChecksum(ChecksumType checksumType, String checksumValue) {
-        if (checksums == null) {
-            checksums = new EnumMap<>(ChecksumType.class);
-        }
-        checksums.put(checksumType, checksumValue);
-    }
-
-    public void clearChecksums() {
-        if (checksums != null) {
-            checksums.clear();
-        }
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/search/deployable/VersionUnitSearchControls.java b/base/api/src/main/java/org/artifactory/api/search/deployable/VersionUnitSearchControls.java
deleted file mode 100644
index 8b0c68d..0000000
--- a/base/api/src/main/java/org/artifactory/api/search/deployable/VersionUnitSearchControls.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search.deployable;
-
-import org.artifactory.api.search.SearchControlsBase;
-import org.artifactory.repo.RepoPath;
-
-/**
- * Holds the version unit search parameters
- *
- * @author Noam Y. Tenne
- */
-public class VersionUnitSearchControls extends SearchControlsBase {
-
-    private RepoPath pathToSearchWithin;
-
-    /**
-     * Main constructor
-     *
-     * @param pathToSearchWithin Repo path to search version units within
-     */
-    public VersionUnitSearchControls(RepoPath pathToSearchWithin) {
-        this.pathToSearchWithin = pathToSearchWithin;
-        addRepoToSearch(pathToSearchWithin.getRepoKey());
-    }
-
-    /**
-     * Returns the repo path to search within
-     *
-     * @return Repo path to search within
-     */
-    public RepoPath getPathToSearchWithin() {
-        return pathToSearchWithin;
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return pathToSearchWithin == null;
-    }
-
-    @Override
-    public boolean isWildcardsOnly() {
-        // cannot really be a wildcards only search
-        return isEmpty();
-    }
-
-}
diff --git a/base/api/src/main/java/org/artifactory/api/search/deployable/VersionUnitSearchResult.java b/base/api/src/main/java/org/artifactory/api/search/deployable/VersionUnitSearchResult.java
deleted file mode 100644
index 8289f3b..0000000
--- a/base/api/src/main/java/org/artifactory/api/search/deployable/VersionUnitSearchResult.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search.deployable;
-
-import org.artifactory.api.module.VersionUnit;
-import org.artifactory.api.search.SearchResultBase;
-
-/**
- * Holds version unit search result data.
- *
- * @author Noam Y. Tenne
- */
-public class VersionUnitSearchResult extends SearchResultBase {
-
-    private VersionUnit versionUnit;
-
-    /**
-     * Main constructor
-     *
-     * @param versionUnit Version unit
-     */
-    public VersionUnitSearchResult(VersionUnit versionUnit) {
-        super(null);
-        this.versionUnit = versionUnit;
-    }
-
-    /**
-     * Returns the version unit
-     *
-     * @return Version unit
-     */
-    public VersionUnit getVersionUnit() {
-        return versionUnit;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        if (!super.equals(o)) {
-            return false;
-        }
-
-        VersionUnitSearchResult that = (VersionUnitSearchResult) o;
-
-        if (!versionUnit.equals(that.versionUnit)) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = super.hashCode();
-        result = 31 * result + versionUnit.hashCode();
-        return result;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/search/gavc/GavcSearchControls.java b/base/api/src/main/java/org/artifactory/api/search/gavc/GavcSearchControls.java
deleted file mode 100644
index 0c34521..0000000
--- a/base/api/src/main/java/org/artifactory/api/search/gavc/GavcSearchControls.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search.gavc;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.search.SearchControlsBase;
-
-/**
- * Holds the GAVC search parameters
- *
- * @author Noam Tenne
- */
-public class GavcSearchControls extends SearchControlsBase {
-
-    private String groupId;
-    private String artifactId;
-    private String version;
-    private String classifier;
-
-    /**
-     * Default constructor
-     */
-    public GavcSearchControls() {
-    }
-
-    /**
-     * Copy constructor
-     *
-     * @param gavcSearchControls Controls to copy
-     */
-    public GavcSearchControls(GavcSearchControls gavcSearchControls) {
-        this.groupId = gavcSearchControls.groupId;
-        this.artifactId = gavcSearchControls.artifactId;
-        this.version = gavcSearchControls.version;
-        this.classifier = gavcSearchControls.classifier;
-        this.selectedRepoForSearch = gavcSearchControls.selectedRepoForSearch;
-        setLimitSearchResults(gavcSearchControls.isLimitSearchResults());
-    }
-
-    public String getGroupId() {
-        return groupId;
-    }
-
-    public void setGroupId(String groupId) {
-        this.groupId = groupId;
-    }
-
-    public String getArtifactId() {
-        return artifactId;
-    }
-
-    public void setArtifactId(String artifactId) {
-        this.artifactId = artifactId;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public String getClassifier() {
-        return classifier;
-    }
-
-    public void setClassifier(String classifier) {
-        this.classifier = classifier;
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return isEmpty(groupId) && isEmpty(artifactId) && isEmpty(version) && isEmpty(classifier);
-    }
-
-    @Override
-    public boolean isWildcardsOnly() {
-        String expression = StringUtils.remove(getSearchExpression(), '-');
-        return StringUtils.isBlank(expression) || isWildcardsOnly(expression);
-    }
-
-    public String getSearchExpression() {
-        StringBuilder sb = new StringBuilder();
-        if (!isEmpty(groupId)) {
-            sb.append(groupId).append("-");
-        }
-        if (!isEmpty(artifactId)) {
-            sb.append(artifactId).append("-");
-        }
-        if (!isEmpty(version)) {
-            sb.append(version).append("-");
-        }
-        if (!isEmpty(classifier)) {
-            sb.append(classifier);
-        }
-
-        String expression = sb.toString();
-        if (expression.endsWith("-")) {
-            expression = expression.substring(0, (expression.length() - 1));
-        }
-
-        return expression;
-    }
-
-    private boolean isEmpty(String field) {
-        return StringUtils.isEmpty(field);
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/search/gavc/GavcSearchResult.java b/base/api/src/main/java/org/artifactory/api/search/gavc/GavcSearchResult.java
deleted file mode 100644
index 362d658..0000000
--- a/base/api/src/main/java/org/artifactory/api/search/gavc/GavcSearchResult.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search.gavc;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.search.artifact.ArtifactSearchResult;
-import org.artifactory.fs.ItemInfo;
-
-/**
- * Holds GAVC search result data.
- *
- * @author Noam Tenne
- */
-public class GavcSearchResult extends ArtifactSearchResult {
-
-    private ModuleInfo moduleInfo;
-
-    public GavcSearchResult(ItemInfo itemInfo, ModuleInfo moduleInfo) {
-        super(itemInfo);
-
-        this.moduleInfo = moduleInfo;
-    }
-
-    public String getGroupId() {
-        return moduleInfo.getOrganization();
-    }
-
-    public String getArtifactId() {
-        return moduleInfo.getModule();
-    }
-
-    public String getVersion() {
-        StringBuilder revisionBuilder = new StringBuilder(moduleInfo.getBaseRevision());
-        String artifactRevisionIntegration = moduleInfo.getFileIntegrationRevision();
-        if (StringUtils.isNotBlank(artifactRevisionIntegration)) {
-            revisionBuilder.append("-").append(artifactRevisionIntegration);
-        }
-        return revisionBuilder.toString();
-    }
-
-    public String getClassifier() {
-        return moduleInfo.getClassifier();
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/search/property/PropertySearchControls.java b/base/api/src/main/java/org/artifactory/api/search/property/PropertySearchControls.java
deleted file mode 100644
index 28d1773..0000000
--- a/base/api/src/main/java/org/artifactory/api/search/property/PropertySearchControls.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search.property;
-
-import com.google.common.collect.LinkedHashMultimap;
-import com.google.common.collect.Multiset;
-import org.artifactory.api.search.SearchControlsBase;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Holds the property search parameters
- *
- * @author Noam Tenne
- */
-public class PropertySearchControls extends SearchControlsBase {
-
-    //Store property key and value
-    private LinkedHashMultimap<String, String> properties;
-
-    //Store property key and openness indication
-    private LinkedHashMultimap<Boolean, String> propertyOpenIndication;
-
-    //Openness statuses
-    public static final boolean OPEN = true;
-    public static final boolean CLOSED = false;
-
-    /**
-     * Default constructor
-     */
-    public PropertySearchControls() {
-        properties = LinkedHashMultimap.create();
-        propertyOpenIndication = LinkedHashMultimap.create();
-    }
-
-    /**
-     * Copy constructor
-     *
-     * @param propertySearchControls Controls to copy
-     */
-    public PropertySearchControls(PropertySearchControls propertySearchControls) {
-        this.properties = propertySearchControls.properties;
-        this.propertyOpenIndication = propertySearchControls.propertyOpenIndication;
-        this.selectedRepoForSearch = propertySearchControls.selectedRepoForSearch;
-        setLimitSearchResults(propertySearchControls.isLimitSearchResults());
-    }
-
-    public LinkedHashMultimap<String, String> getProperties() {
-        return properties;
-    }
-
-    public Set<String> get(String key) {
-        return properties.get(key);
-    }
-
-    public boolean put(String key, String value, boolean isPropertyOpen) {
-        boolean propertyAdded = properties.put(key, value);
-        boolean indicationAdded = propertyOpenIndication.put(isPropertyOpen, key);
-        return propertyAdded && indicationAdded;
-    }
-
-    public void removeAll(String key) {
-        //Check if the openness indication contains the key with either open or closed
-        if (propertyOpenIndication.containsEntry(OPEN, key)) {
-            propertyOpenIndication.remove(OPEN, key);
-        } else if (propertyOpenIndication.containsEntry(CLOSED, key)) {
-            propertyOpenIndication.remove(CLOSED, key);
-        }
-        properties.removeAll(key);
-    }
-
-    public Collection<String> values() {
-        return properties.values();
-    }
-
-    public Set<Map.Entry<String, String>> entries() {
-        return properties.entries();
-    }
-
-    public Multiset<String> keys() {
-        return properties.keys();
-    }
-
-    public Set<String> keySet() {
-        return properties.keySet();
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return properties.isEmpty();
-    }
-
-    @Override
-    public boolean isWildcardsOnly() {
-        if (isEmpty()) {
-            return true;
-        }
-        for (String key : properties.keys()) {
-            if (isWildcardsOnly(key)) {
-                // one key that contains wildcards is enough
-                return true;
-            }
-        }
-        return false;
-    }
-
-
-    public boolean containsEntry(String key, String value) {
-        return properties.containsEntry(key, value);
-    }
-
-    /**
-     * Creates a string that represents the search query: " PROPERTY1 = { VALUE1; VALUE2}, PROPERTY2 = {VALUE3} "
-     *
-     * @return Query string
-     */
-    public String getValue() {
-        StringBuilder builder = new StringBuilder();
-        Iterator<String> keyIterator = properties.keySet().iterator();
-        while (keyIterator.hasNext()) {
-            String key = keyIterator.next();
-            builder.append(key).append("=");
-            builder.append("{");
-            Iterator<String> valueIterator = properties.get(key).iterator();
-            while (valueIterator.hasNext()) {
-                String value = valueIterator.next();
-                builder.append(value);
-                if (valueIterator.hasNext()) {
-                    builder.append(";");
-                }
-            }
-            builder.append("}");
-            if (keyIterator.hasNext()) {
-                builder.append(" , ");
-            }
-        }
-
-        return builder.toString();
-    }
-
-    /**
-     * Returns a boolean representation of the properties map state
-     *
-     * @return True if the map is initialized. False if not.
-     */
-    public boolean isMapInitialized() {
-        return properties != null;
-    }
-
-    /**
-     * Returns all property keys that have the given openness specification
-     *
-     * @param openness Should return keys of open or closed properties
-     * @return Set of property keys
-     */
-    public Set<String> getPropertyKeysByOpenness(boolean openness) {
-        return propertyOpenIndication.get(openness);
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/search/property/PropertySearchResult.java b/base/api/src/main/java/org/artifactory/api/search/property/PropertySearchResult.java
deleted file mode 100644
index ac70af5..0000000
--- a/base/api/src/main/java/org/artifactory/api/search/property/PropertySearchResult.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search.property;
-
-import org.artifactory.api.search.SearchResultBase;
-import org.artifactory.fs.ItemInfo;
-
-/**
- * Holds property search result data.
- *
- * @author Noam Tenne
- */
-public class PropertySearchResult extends SearchResultBase {
-
-    public PropertySearchResult(ItemInfo itemInfo) {
-        super(itemInfo);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || !(o instanceof SearchResultBase)) {
-            return false;
-        }
-        return getItemInfo().equals(((SearchResultBase) o).getItemInfo());
-    }
-
-    @Override
-    public int hashCode() {
-        return getItemInfo().hashCode();
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/search/stats/StatsSearchControls.java b/base/api/src/main/java/org/artifactory/api/search/stats/StatsSearchControls.java
deleted file mode 100644
index 80e2f6f..0000000
--- a/base/api/src/main/java/org/artifactory/api/search/stats/StatsSearchControls.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search.stats;
-
-import org.artifactory.api.search.SearchControlsBase;
-
-import java.util.Calendar;
-
-/**
- * @author Yoav Landman
- */
-public class StatsSearchControls extends SearchControlsBase {
-
-    private Calendar downloadedSince;
-    private Calendar createdBefore;
-
-    public StatsSearchControls() {
-    }
-
-    @Override
-    public boolean isEmpty() {
-        // Interested only in downloaded since
-        return !hasDownloadedSince();
-    }
-
-    public boolean hasCreatedBefore() {
-        return createdBefore != null && createdBefore.getTimeInMillis() > 0L;
-    }
-
-    public boolean hasDownloadedSince() {
-        return downloadedSince != null && downloadedSince.getTimeInMillis() > 0L;
-    }
-
-    @Override
-    public boolean isWildcardsOnly() {
-        return false;
-    }
-
-    public Calendar getDownloadedSince() {
-        return downloadedSince;
-    }
-
-    public void setDownloadedSince(Calendar downloadedSince) {
-        this.downloadedSince = downloadedSince;
-    }
-
-    public Calendar getCreatedBefore() {
-        return createdBefore;
-    }
-
-    public void setCreatedBefore(Calendar createdBefore) {
-        this.createdBefore = createdBefore;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/search/stats/StatsSearchResult.java b/base/api/src/main/java/org/artifactory/api/search/stats/StatsSearchResult.java
deleted file mode 100644
index 4fe66de..0000000
--- a/base/api/src/main/java/org/artifactory/api/search/stats/StatsSearchResult.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search.stats;
-
-import org.artifactory.api.search.artifact.ArtifactSearchResult;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.fs.StatsInfo;
-
-/**
- * Date: 12/19/12
- * Time: 11:22 AM
- *
- * @author freds
- */
-public class StatsSearchResult extends ArtifactSearchResult {
-    private final StatsInfo statsInfo;
-
-    public StatsSearchResult(ItemInfo itemInfo, StatsInfo statsInfo) {
-        super(itemInfo);
-        this.statsInfo = statsInfo;
-    }
-
-    public long getDownloadCount() {
-        if (statsInfo == null) {
-            return 0L;
-        }
-        return statsInfo.getDownloadCount();
-    }
-
-    public String getLastDownloadedBy() {
-        if (statsInfo == null) {
-            return getItemInfo().getModifiedBy();
-        }
-        return statsInfo.getLastDownloadedBy();
-    }
-
-    public long getLastDownloaded() {
-        if (statsInfo == null) {
-            return getItemInfo().getCreated();
-        }
-        return statsInfo.getLastDownloaded();
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/security/AclManager.java b/base/api/src/main/java/org/artifactory/api/security/AclManager.java
deleted file mode 100644
index 72e2367..0000000
--- a/base/api/src/main/java/org/artifactory/api/security/AclManager.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.security;
-
-/**
- * Main ACL manager interface
- *
- * @author Noam Y. Tenne
- */
-public interface AclManager {
-
-    /**
-     * Reloads all the ACLs to the configuration
-     */
-    void reloadAcls();
-}
diff --git a/base/api/src/main/java/org/artifactory/api/security/AclService.java b/base/api/src/main/java/org/artifactory/api/security/AclService.java
deleted file mode 100644
index 0c7071b..0000000
--- a/base/api/src/main/java/org/artifactory/api/security/AclService.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.security;
-
-import org.artifactory.sapi.common.Lock;
-import org.artifactory.security.*;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * User: freds Date: Aug 5, 2008 Time: 8:46:40 PM
- */
-public interface AclService {
-
-    /**
-     * Returns a list of permission targets for the current logged-in user for the type of permission given.
-     *
-     * @param artifactoryPermission Type of permission to find
-     * @return List of permission target info objects
-     */
-    List<PermissionTargetInfo> getPermissionTargets(ArtifactoryPermission artifactoryPermission);
-
-    /**
-     * @return Returns all the AclInfos
-     */
-    List<AclInfo> getAllAcls();
-
-    /**
-     * @param target The permission target to check.
-     * @return True if the current logged in user has admin permissions on the permission target
-     */
-    boolean canManage(PermissionTargetInfo target);
-
-    /**
-     * @return True is the user or a group the user belongs to has read permissions on the target
-     */
-    boolean canRead(UserInfo user, PermissionTargetInfo target);
-
-    /**
-     * @return True is the user or a group the user belongs to has annotate permissions on the target
-     */
-    boolean canAnnotate(UserInfo user, PermissionTargetInfo target);
-
-    /**
-     * @return True is the user or a group the user belongs to has deploy permissions on the target
-     */
-    boolean canDeploy(UserInfo user, PermissionTargetInfo target);
-
-    /**
-     * @return True is the user or a group the user belongs to has delete permissions on the target
-     */
-    boolean canDelete(UserInfo user, PermissionTargetInfo target);
-
-    /**
-     * @return True is the user or a group the user belongs to has admin permissions on the target
-     */
-    boolean canManage(UserInfo user, PermissionTargetInfo target);
-
-    @Lock
-    void createAcl(MutableAclInfo entity);
-
-    @Lock
-    void deleteAcl(PermissionTargetInfo target);
-
-    AclInfo getAcl(String permTargetName);
-
-    AclInfo getAcl(PermissionTargetInfo permissionTarget);
-
-    void updateAcl(MutableAclInfo acl);
-
-    boolean permissionTargetExists(String key);
-
-    /**
-     * Converts cached repo keys contained in the list so that the '-cache' suffix is omitted.
-     * When provided with a remote or local repository key, it will stay unchanged.
-     *
-     * @param repoKeys
-     * @return repoKeys with all '-cache' suffixes omitted
-     */
-    List<String> convertCachedRepoKeysToRemote(List<String> repoKeys);
-
-    /**
-     * Converts cached repo keys contained in the acl's permission target so that the '-cache' suffix is omitted.
-     * When provided with a remote or local repository key, it will stay unchanged.
-     *
-     * @param acl
-     * @return a new MutableAclInfo with its permission target's repo keys modified to omit the '-cache' suffix
-     */
-    MutableAclInfo convertNewAclCachedRepoKeysToRemote(MutableAclInfo acl);
-
-    /**
-     * return map permissions
-     *
-     * @param username
-     * @return
-     */
-    Map<PermissionTargetInfo, AceInfo> getUserPermissionByPrincipal(String username);
-
-    /**
-     * get groups related permissions
-     *
-     * @param groups - groups to get permissions for
-     * @return -map of permissions and groups access rights
-     */
-    Map<PermissionTargetInfo, AceInfo> getGroupsPermissions(List<String> groups);
-
-    /**
-     * get user related permissions
-     *
-     * @param userName - userName to get permissions for
-     * @return -map of permissions and user access rights
-     */
-    Map<PermissionTargetInfo, AceInfo> getUserPermissions(String userName);
-}
diff --git a/base/api/src/main/java/org/artifactory/api/security/AuthorizationException.java b/base/api/src/main/java/org/artifactory/api/security/AuthorizationException.java
deleted file mode 100644
index 19c719b..0000000
--- a/base/api/src/main/java/org/artifactory/api/security/AuthorizationException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.security;
-
-/**
- * Throw this exception when user tries to perform action she is not authorize to.
- *
- * @author Yossi Shaul
- */
-public class AuthorizationException extends RuntimeException {
-    public AuthorizationException(String message) {
-        super(message);
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/security/AuthorizationService.java b/base/api/src/main/java/org/artifactory/api/security/AuthorizationService.java
deleted file mode 100644
index abb5c5d..0000000
--- a/base/api/src/main/java/org/artifactory/api/security/AuthorizationService.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.security;
-
-import org.artifactory.repo.RepoPath;
-import org.artifactory.security.ArtifactoryPermission;
-import org.artifactory.security.GroupInfo;
-import org.artifactory.security.UserInfo;
-
-import javax.annotation.Nonnull;
-
-/**
- * These are the usage of security data and logged in user methods.
- */
-public interface AuthorizationService {
-    String ROLE_USER = "user";
-    String ROLE_ADMIN = "admin";
-
-    /**
-     * @return True if the current user can update her profile.
-     */
-    boolean isUpdatableProfile();
-
-    /**
-     * @return True if the current user is transient
-     */
-    boolean isTransientUser();
-
-    /**
-     * @return True if anonymous access is allowed.
-     */
-    boolean isAnonAccessEnabled();
-
-    /**
-     * @return True if user is anonymous and access to build infos is disabled
-     */
-    boolean isAnonUserAndAnonBuildInfoAccessDisabled();
-
-    /**
-     * @return True if the current user can read the specified path.
-     */
-    boolean canRead(RepoPath path);
-
-    /**
-     * @return True if the current user can annotate the specified path.
-     */
-    boolean canAnnotate(RepoPath repoPath);
-
-    /**
-     * @return True if the current user can delete the specified path.
-     */
-    boolean canDelete(RepoPath path);
-
-    /**
-     * @return True if the current user can deploy to the specified path.
-     */
-    boolean canDeploy(RepoPath path);
-
-    /**
-     * @return True if the user can deploy to at least one non-cache repositories.
-     */
-    boolean canDeployToLocalRepository();
-
-    /**
-     * @return True if the current user has admin permissions on a target info that includes this path..
-     */
-    boolean canManage(RepoPath path);
-
-    /**
-     * Indicates if the current user has the given permission, no matter the target
-     *
-     * @param artifactoryPermission Permission to check
-     * @return True if the current user has such permission. False if not
-     */
-    boolean hasPermission(ArtifactoryPermission artifactoryPermission);
-
-    /**
-     * @return True if the user can read the specified path.
-     */
-    boolean canRead(UserInfo user, RepoPath path);
-
-    /**
-     * @return True if the user can annotate the specified path.
-     */
-    boolean canAnnotate(UserInfo user, RepoPath path);
-
-    /**
-     * @return True if the user can delete the specified path.
-     */
-    boolean canDelete(UserInfo user, RepoPath path);
-
-    /**
-     * @return True if the user can deploy to the specified path.
-     */
-    boolean canDeploy(UserInfo user, RepoPath path);
-
-    /**
-     * @return True if the user can administer the specified path.
-     */
-    boolean canManage(UserInfo user, RepoPath path);
-
-    /**
-     * @return True if users in the group can read the specified path.
-     */
-    boolean canRead(GroupInfo group, RepoPath path);
-
-    /**
-     * @return True if users in the group can annotate the specified path.
-     */
-    boolean canAnnotate(GroupInfo group, RepoPath path);
-
-    /**
-     * @return True if users in the group can delete the specified path.
-     */
-    boolean canDelete(GroupInfo group, RepoPath path);
-
-    /**
-     * @return True if users in the group can deploy to the specified path.
-     */
-    boolean canDeploy(GroupInfo group, RepoPath path);
-
-    /**
-     * @return True if users in the group can administer the specified path.
-     */
-    boolean canManage(GroupInfo group, RepoPath path);
-
-    /**
-     * @return True if the current is a system administrator.
-     */
-    boolean isAdmin();
-
-    /**
-     * @return True if the current user is a anonymous.
-     */
-    boolean isAnonymous();
-
-    /**
-     *
-     * @return true if require profile unlock
-     */
-    boolean requireProfileUnlock();
-
-    /**
-     *
-     * @return true if require profile unlock
-     */
-    boolean requireProfilePassword();
-
-    /**
-     * @return The current logged in username. {@link org.artifactory.api.security.SecurityService#USER_SYSTEM} is
-     * returned if no login information is found.
-     */
-    @Nonnull
-    String currentUsername();
-
-    boolean isAuthenticated();
-
-    /**
-     * Indicates if the given user has any permissions at all, no matter the target
-     *
-     * @param username Name of user to check
-     * @return True if user has any permissions, false if not
-     */
-    boolean userHasPermissions(String username);
-
-    /**
-     * Indicates if the given user has any permissions at all, on the root repository. If it is a virtual repository
-     * then if the user has a permission in any one of the real repositories associated with it will return {@code
-     * true}
-     *
-     * @param repoKey The repository key of the repository to check the user's permissions.
-     * @return Whether the user has any permissions on a repository root
-     */
-    boolean userHasPermissionsOnRepositoryRoot(String repoKey);
-
-    boolean isDisableInternalPassword();
-
-    /**
-     * @return The current authentication user encrypted password if exists.
-     * @param escape Should the return password get escaped
-     */
-    String currentUserEncryptedPassword(boolean escape);
-
-
-    String findUserByPropAuth(String key, String value);
-
-}
diff --git a/base/api/src/main/java/org/artifactory/api/security/GroupNotFoundException.java b/base/api/src/main/java/org/artifactory/api/security/GroupNotFoundException.java
deleted file mode 100644
index 8e70096..0000000
--- a/base/api/src/main/java/org/artifactory/api/security/GroupNotFoundException.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.security;
-
-/**
- * @author Noam Y. Tenne
- */
-public class GroupNotFoundException extends RuntimeException {
-
-    public GroupNotFoundException(String message) {
-        super(message);
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/security/MasterEncryptionService.java b/base/api/src/main/java/org/artifactory/api/security/MasterEncryptionService.java
deleted file mode 100644
index 8c43268..0000000
--- a/base/api/src/main/java/org/artifactory/api/security/MasterEncryptionService.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.security;
-
-/**
- * Service to perform encryption/decryption of config files passwords with a master encryption key.
- *
- * @author Yossi Shaul
- */
-public interface MasterEncryptionService {
-
-    /**
-     * Encrypts the configuration files passwords with the master encryption key.
-     * The key is created if not already exists.
-     */
-    void encrypt();
-
-    /**
-     * Decrypts the configuration files passwords using the existing master encryption key.
-     * The key is renamed after decryption and never used again.
-     */
-    void decrypt();
-
-}
diff --git a/base/api/src/main/java/org/artifactory/api/security/PasswordExpiryUser.java b/base/api/src/main/java/org/artifactory/api/security/PasswordExpiryUser.java
deleted file mode 100644
index 9c42265..0000000
--- a/base/api/src/main/java/org/artifactory/api/security/PasswordExpiryUser.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.artifactory.api.security;
-
-/**
- * A lean object that holds only necessary info to avoid thousand of user objects on expiry and
- * notification jobs.
- *
- * @author Dan Feldman
- */
-public class PasswordExpiryUser {
-
-    private String userName;
-    private String email;
-    private long passwordCreated;
-    private long userId;
-
-    public PasswordExpiryUser(long userId, String userName, String email, long passwordCreated) {
-        this.userId = userId;
-        this.userName = userName;
-        this.email = email;
-        this.passwordCreated = passwordCreated;
-    }
-
-    public String getUserName() {
-        return userName;
-    }
-
-    public String getEmail() {
-        return email;
-    }
-
-    public long getPasswordCreated() {
-        return passwordCreated;
-    }
-
-    public long getUserId() {
-        return userId;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/security/SecurityListener.java b/base/api/src/main/java/org/artifactory/api/security/SecurityListener.java
deleted file mode 100644
index 8544227..0000000
--- a/base/api/src/main/java/org/artifactory/api/security/SecurityListener.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.security;
-
-/**
- * A listener for security service events
- * <p/>
- * TODO [YS]: this interface should be merged with {@link org.artifactory.security.interceptor.SecurityConfigurationChangesInterceptors}
- * TODO [FS]: The security conf change listener has no on updates events
- *
- * @author Yoav Landman
- */
-public interface SecurityListener extends Comparable<SecurityListener> {
-
-    /**
-     * Called whenever a complete security caches cleanup should be done.
-     */
-    void onClearSecurity();
-
-    /**
-     * Called when a user is deleted from Artifactory.
-     *
-     * @param username The deleted username
-     */
-    void onUserDelete(String username);
-
-    /**
-     * Called when a user is updated in Artifactory.
-     *
-     * @param username The username of the updated user
-     */
-    void onUserUpdate(String username);
-}
diff --git a/base/api/src/main/java/org/artifactory/api/security/SecurityService.java b/base/api/src/main/java/org/artifactory/api/security/SecurityService.java
deleted file mode 100644
index 6eebe12..0000000
--- a/base/api/src/main/java/org/artifactory/api/security/SecurityService.java
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.security;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.config.ImportableExportable;
-import org.artifactory.api.repo.Async;
-import org.artifactory.descriptor.security.PasswordExpirationPolicy;
-import org.artifactory.descriptor.security.UserLockPolicy;
-import org.artifactory.descriptor.security.ldap.LdapSetting;
-import org.artifactory.sapi.common.Lock;
-import org.artifactory.security.SaltedPassword;
-import org.artifactory.security.SecurityInfo;
-import org.artifactory.util.SerializablePair;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.Date;
-import java.util.Set;
-
-/**
- * User: freds Date: Aug 13, 2008 Time: 5:17:47 PM
- */
-public interface SecurityService extends ImportableExportable {
-    String FILE_NAME = "security.xml";
-
-    String DEFAULT_ADMIN_USER = "admin";
-
-    String DEFAULT_ADMIN_PASSWORD = "password";
-
-    String USER_SYSTEM = "_system_";
-
-    SecurityInfo getSecurityData();
-
-    @Lock
-    void importSecurityData(String securityXml);
-
-    @Lock
-    void importSecurityData(SecurityInfo descriptor);
-
-    /**
-     * @see org.artifactory.security.ldap.LdapConnectionTester#testLdapConnection
-     */
-    BasicStatusHolder testLdapConnection(LdapSetting ldapSetting, String username, String password);
-
-    /**
-     * @return True if password encryption is enabled (supported or required).
-     */
-    public boolean isPasswordEncryptionEnabled();
-
-    /**
-     * @return True if the password matches to the password of the currently logged-in user.
-     */
-    public boolean userPasswordMatches(String passwordToCheck);
-
-    /**
-     * Generates a password recovery key for the specified user and send it by mail
-     *
-     * @param username     User to rest his password
-     * @param clientIp     The IP of the client that sent the request
-     * @param resetPageUrl The URL of the reset page we refer to
-     */
-    @Async(transactional = true)
-    void generatePasswordResetKey(String username, String clientIp, String resetPageUrl) throws Exception;
-
-    /**
-     * Returns a pair object with the given users password reset key info. If user doesn't exist, a
-     * UsernameNotFoundException will be thrown. When the user is not associated with a key, return a null object. In a
-     * case where the key is invalid (has less than 3 parts), an IllegalArgumentException is thrown
-     *
-     * @param username User to retrieve password reset info about
-     * @return Pair<Date, String> - Pair containing key generation time and client ip (respectively)
-     */
-    SerializablePair<Date, String> getPasswordResetKeyInfo(String username);
-
-    /**
-     * Returns the given user's last login information
-     *
-     * @param username Logged in user's name
-     * @return Pair<String, Long> - Containing the client IP and last logged in time millis
-     */
-    SerializablePair<String, Long> getUserLastLoginInfo(String username);
-
-    /**
-     * Updates the user last login information
-     *
-     * @param username        Logged in user's name
-     * @param clientIp        The IP of the client that was logged in from
-     * @param loginTimeMillis The time of login
-     */
-    @Async(transactional = true)
-    void updateUserLastLogin(String username, String clientIp, long loginTimeMillis);
-
-    /**
-     * Updates the user last access information
-     *
-     * @param username                     Name of user that performed an action
-     * @param clientIp                     The IP of the client that has accessed
-     * @param accessTimeMillis             The time of access
-     */
-    void updateUserLastAccess(String username, String clientIp, long accessTimeMillis);
-
-    /**
-     * Indicates if Artifactory is configured as proxied by Apache
-     *
-     * @return True if is proxied. False if not
-     */
-    boolean isHttpSsoProxied();
-
-    /**
-     * Returns the HTTP SSO remote user request variable
-     *
-     * @return Remote user request variable
-     */
-    String getHttpSsoRemoteUserRequestVariable();
-
-    /**
-     * Indicates if artifactory shouldn't automatically create a user object in the DB for an SSO authenticated user
-     *
-     * @return True if user should be created in memory. False if user should be created in the DB
-     */
-    boolean isNoHttpSsoAutoUserCreation();
-
-    void addListener(SecurityListener listener);
-
-    void removeListener(SecurityListener listener);
-
-    void authenticateAsSystem();
-
-    void nullifyContext();
-
-    SaltedPassword generateSaltedPassword(String rawPassword);
-
-    SaltedPassword generateSaltedPassword(String rawPassword, @Nullable String salt);
-
-    String getDefaultSalt();
-
-    /**
-     * Triggered when user fails to login and
-     * locks it if amount of login failures exceeds
-     * {@see LockPolicy#loginAttempts}
-     *
-     * @param userName user to intercept
-     * @param accessTime session creation time
-     */
-    @Nonnull
-    void interceptLoginFailure(String userName, long accessTime);
-
-    /**
-     * Triggered when user success to login
-     *
-     * @param userName user to intercept
-     */
-    @Nonnull
-    void interceptLoginSuccess(String userName);
-
-    /**
-     * Throws LockedException if user is locked
-     *
-     * @param userName
-     * @throws org.springframework.security.authentication.LockedException
-     */
-    @Nonnull
-    void ensureUserIsNotLocked(String userName);
-
-    /**
-     * Throws LockedException if user is locked
-     *
-     * @param sessionIdentifier
-     * @throws org.springframework.security.authentication.LockedException
-     */
-    @Nonnull
-    void ensureSessionIsNotLocked(String sessionIdentifier);
-
-    /**
-     * Throws LoginDelayedException if user has performed
-     * incorrect login in past and now should wait before
-     * performing another login attempt
-     *
-     * @param userName
-     * @throws {@link org.artifactory.api.security.exceptions.LoginDelayedException}
-     */
-    @Nonnull
-    void ensureLoginShouldNotBeDelayed(String userName);
-
-    /**
-     * Throws LoginDelayedException if session has performed
-     * incorrect login in past and now should wait before
-     * performing another login attempt
-     *
-     * @param sessionIdentifier
-     * @throws {@link org.artifactory.api.security.exceptions.LoginDelayedException}
-     */
-    @Nonnull
-    void ensureSessionShouldNotBeDelayed(String sessionIdentifier);
-
-    /**
-     * Checks whether given user is locked
-     *
-     * note: this method using caching in sake
-     * of DB load preventing
-     *
-     * @param userName
-     *
-     * @return boolean
-     */
-    boolean isUserLocked(String userName);
-
-    /**
-     * Changes user password
-     *
-     * @param userName user name
-     * @param oldPassword old password
-     * @param newPassword1 new password
-     * @param newPassword2 replication of new password
-     *
-     * @return sucess/failure
-     */
-    void changePassword(String userName, String oldPassword, String newPassword1, String newPassword2);
-
-    /**
-     * Makes user password expired
-     *
-     * @param userName
-     */
-    void expireUserCredentials(String userName);
-
-    /**
-     * Makes user password not expired
-     *
-     * @param userName
-     */
-    void unexpirePassword(String userName);
-
-    /**
-     * Makes all users passwords expired
-     *
-     */
-    void expireCredentialsForAllUsers();
-
-    /**
-     * Makes all users passwords not expired
-     *
-     */
-    void unexpirePasswordForAllUsers();
-
-    /**
-     * Fetches users with password is about to expire
-     *
-     * @return list of users
-     */
-    Set<PasswordExpiryUser> getUsersWhichPasswordIsAboutToExpire();
-
-    /**
-     * Marks user.credentialsExpired=True where password has expired
-     *
-     * @param daysToKeepPassword after what period password should be changed
-     */
-    void markUsersCredentialsExpired(int daysToKeepPassword);
-
-    /**
-     * @param userName
-     * @return number of days left till password will expire
-     *         or -1 if password already expired or NULL if
-     *         password expiration feature is disabled
-     */
-    Integer getUserPasswordDaysLeft(String userName);
-
-    /**
-     * @return whether {@link UserLockPolicy} is enabled
-     */
-    boolean isUserLockPolicyEnabled();
-
-    /**
-     * @return whether {@link PasswordExpirationPolicy} is enabled
-     */
-    boolean isPasswordExpirationPolicyEnabled();
-}
diff --git a/base/api/src/main/java/org/artifactory/api/security/SshAuthService.java b/base/api/src/main/java/org/artifactory/api/security/SshAuthService.java
deleted file mode 100644
index bf420d1..0000000
--- a/base/api/src/main/java/org/artifactory/api/security/SshAuthService.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.artifactory.api.security;
-
-import java.nio.file.Path;
-
-/**
- * @author Noam Y. Tenne
- */
-public interface SshAuthService {
-    boolean hasPublicKey();
-
-    boolean hasPrivateKey();
-
-    Path getPublicKeyFile();
-
-    Path getPrivateKeyFile();
-
-    void savePublicKey(String publicKey) throws Exception;
-
-    void savePrivateKey(String privateKey) throws Exception;
-
-    void removePublicKey() throws Exception;
-
-    void removePrivateKey() throws Exception;
-}
diff --git a/base/api/src/main/java/org/artifactory/api/security/UserAwareAuthenticationProvider.java b/base/api/src/main/java/org/artifactory/api/security/UserAwareAuthenticationProvider.java
deleted file mode 100644
index 8fbdbd1..0000000
--- a/base/api/src/main/java/org/artifactory/api/security/UserAwareAuthenticationProvider.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.security;
-
-import org.artifactory.security.UserGroupInfo;
-
-import java.util.List;
-import java.util.Set;
-
-/**
- * A an authentication provider that expands on external users, checking, and populating user's groups from an external
- * realm (e.g. LDAP or Crowd)
- *
- * @author Tomer Cohen
- */
-public interface UserAwareAuthenticationProvider {
-
-    /**
-     * Check if the user exists in a specific realm.
-     *
-     * @param userName The username to check
-     * @param realm    The realm that the user should belong to
-     * @return True if the user exists in the realm.
-     */
-    boolean userExists(String userName, String realm);
-
-    /**
-     * Add external groups from an external realm (e.g. LDAP or Crowd) to a user.
-     *
-     * @param userName The username.
-     * @param realm    The realm that the username belongs to.
-     * @param groups   The initial set of groups that the user belongs to and that should be populated with the external
-     *                 groups.
-     */
-    void addExternalGroups(String userName, String realm, Set<UserGroupInfo> groups);
-
-    /**
-     * @return The list of authentication providers.
-     */
-    public List getProviders();
-}
diff --git a/base/api/src/main/java/org/artifactory/api/security/UserGroupService.java b/base/api/src/main/java/org/artifactory/api/security/UserGroupService.java
deleted file mode 100644
index 8dc250d..0000000
--- a/base/api/src/main/java/org/artifactory/api/security/UserGroupService.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.security;
-
-import org.artifactory.common.Info;
-import org.artifactory.md.Properties;
-import org.artifactory.sapi.common.Lock;
-import org.artifactory.security.GroupInfo;
-import org.artifactory.security.MutableGroupInfo;
-import org.artifactory.security.MutableUserInfo;
-import org.artifactory.security.UserInfo;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.sql.SQLException;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Fred Simon
- */
-public interface UserGroupService {
-    // Own profile page
-
-    UserInfo currentUser();
-
-    /**
-     * Returns the user details for the given username.
-     *
-     * @param username The unique username
-     * @return UserInfo if user with the input username exists
-     */
-    @Nonnull
-    UserInfo findUser(String username);
-
-    /**
-     * Returns the user details for the given username.
-     *
-     * @param username The unique username
-     * @param errorOnAbsence throw error if user is not found
-     * @return UserInfo if user with the input username exists
-     */
-    @Nonnull
-    UserInfo findUser(String username, boolean errorOnAbsence);
-
-    void updateUser(MutableUserInfo user, boolean activateListeners);
-
-    @Lock
-    boolean createUser(MutableUserInfo user);
-
-    @Lock
-    void deleteUser(String username);
-
-    List<UserInfo> getAllUsers(boolean includeAdmins);
-
-    /**
-     * Deletes the group from the database including any group membership users have to this group.
-     *
-     * @param groupName The group name to delete
-     */
-    @Lock
-    void deleteGroup(String groupName);
-
-    List<GroupInfo> getAllGroups();
-
-    /**
-     * @return A set of all the groups that should be added by default to newly created users.
-     */
-    List<GroupInfo> getNewUserDefaultGroups();
-
-    /**
-     * @return A list of all groups that are of an external realm
-     */
-    List<GroupInfo> getAllExternalGroups();
-
-    /**
-     * @return A list of <b>internal</b> groups only
-     */
-    List<GroupInfo> getInternalGroups();
-
-    /**
-     * @return A set of all the groups names that should be added by default to newly created users.
-     */
-    Set<String> getNewUserDefaultGroupsNames();
-
-    /**
-     * Updates a users group. Group name update is not allowed.
-     *
-     * @param groupInfo The updated group info
-     */
-    void updateGroup(MutableGroupInfo groupInfo);
-
-    @Lock
-    boolean createGroup(MutableGroupInfo groupInfo);
-
-    /**
-     * remove users group before update and add users group after update
-     *
-     * @param groupInfo    - update group
-     * @param usersInGroup - users after group update
-     */
-    @Lock
-    void updateGroupUsers(MutableGroupInfo groupInfo, List<String> usersInGroup);
-
-    /**
-     * Adds a list of users to a group.
-     *
-     * @param groupName The group's unique name.
-     * @param usernames The list of users names.
-     */
-    @Lock
-    void addUsersToGroup(String groupName, List<String> usernames);
-
-    /**
-     * Deletes the user's membership of a group.
-     *
-     * @param groupName The group name
-     * @param usernames The list of usernames
-     */
-    @Lock
-    void removeUsersFromGroup(String groupName, List<String> usernames);
-
-    /**
-     * Locates the users who are members of a group
-     *
-     * @param groupName the group whose members are required
-     * @return the usernames of the group members
-     */
-    List<UserInfo> findUsersInGroup(String groupName);
-
-    String resetPassword(String userName, String remoteAddress, String resetPageUrl);
-
-    /**
-     * For use with external authentication methods only (CAS/LDAP/SSO/Crowd) tries to locate a user with the given
-     * name. When can't be found a new user will be created. The user will have no defined email, will not be an admin,
-     * and will not have an updatable profile.
-     *
-     * @param username      The username to find/create
-     * @param transientUser If true a transient user will be created and will cease to exists when the session ends. If
-     *                      the user already exist in Artifactory users, this flag has no meaning.
-     * @return Found\created user
-     */
-    UserInfo findOrCreateExternalAuthUser(String username, boolean transientUser);
-
-    /**
-     * For use with external authentication methods only (SSO , SAML and OAUTH) tries to locate a user with the given
-     * name. When can't be found a new user will be created. The user will have no defined email, will not be an admin,
-     * and will not have an updatable profile.
-     *
-     * @param username      The username to find/create
-     * @param transientUser If true a transient user will be created and will cease to exists when the session ends. If
-     *                      the user already exist in Artifactory users, this flag has no meaning.
-     * @param  updateProfile - if true , user will be able to update it own profile
-     * @return Found\created user
-     */
-    UserInfo findOrCreateExternalAuthUser(String username, boolean transientUser,boolean updateProfile);
-
-    /**
-     * Returns the group details for the group name provided.
-     *
-     * @param groupName The name of the group to look for
-     * @return The group details, null if no group with this name found
-     */
-    @Nullable
-    GroupInfo findGroup(String groupName);
-
-    String createEncryptedPasswordIfNeeded(UserInfo user, String password);
-
-    Collection<Info> getUsersGroupsPaging(boolean includeAdmins, String orderBy,
-            String startOffset, String limit, String direction);
-
-    long getAllUsersGroupsCount(boolean includeAdmins);
-
-    Properties findPropertiesForUser(String username);
-
-    boolean addUserProperty(String username, String key, String value);
-
-    void deleteProperty(String userName, String propertyKey);
-
-    void deletePropertyFromAllUsers(String propertyKey);
-
-    String getPropsToken(String userName, String propsKey);
-
-    @Lock
-    boolean revokePropsToken(String userName, String propsKey) throws SQLException;
-
-    @Lock
-    boolean createPropsToken(String userName, String key, String value) throws SQLException;
-
-    @Lock
-    void revokeAllPropsTokens(String propsKey) throws SQLException;
-
-    @Lock
-    boolean updatePropsToken(String user, String propKey, String propValue) throws SQLException;
-
-    /**
-     * Locks user upon incorrect login attempt
-     *
-     * @param userName
-     */
-    @Nonnull
-    void lockUser(String userName);
-
-    /**
-     * Unlocks locked in user
-     *
-     * @param userName
-     */
-    @Nonnull
-    void unlockUser(String userName);
-
-    /**
-     * Unlocks all locked in users
-     */
-    @Nonnull
-    void unlockAllUsers();
-
-    /**
-     * Unlocks all locked out admin users
-     */
-    @Nonnull
-    public void unlockAdminUsers();
-
-    /**
-     * Registers incorrect login attempt
-     *
-     * @param userName
-     */
-    @Nonnull
-    void registerIncorrectLoginAttempt(String userName);
-
-    /**
-     * Resets logon failures
-     *
-     * @param userName
-     */
-    @Nonnull
-    void resetIncorrectLoginAttempts(String userName);
-
-    /**
-     * @return List of locked in users
-     */
-    Set<String> getLockedUsers();
-}
diff --git a/base/api/src/main/java/org/artifactory/api/security/UserInfoBuilder.java b/base/api/src/main/java/org/artifactory/api/security/UserInfoBuilder.java
deleted file mode 100644
index 380cfe4..0000000
--- a/base/api/src/main/java/org/artifactory/api/security/UserInfoBuilder.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.security;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-import javax.annotation.Nullable;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.util.Builder;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.security.MutableUserInfo;
-import org.artifactory.security.SaltedPassword;
-import org.artifactory.security.UserGroupInfo;
-import org.artifactory.security.UserPropertyInfo;
-
-import com.google.common.collect.Sets;
-
-/**
- * Builder for user info with sensible defaults.
- *
- * @author Yossi Shaul
- */
-public class UserInfoBuilder implements Builder<MutableUserInfo> {
-
-    private final String username;
-    private SaltedPassword password = SaltedPassword.INVALID_PASSWORD;
-    private String email = "";
-    private boolean admin = false;
-    private boolean enabled = true;
-    private boolean updatableProfile = false;
-    private boolean transientUser = false;
-    private Set<UserGroupInfo> groups = new HashSet<>();
-    private String bintrayAuth;
-    private Set<UserPropertyInfo> userPropertyInfos;
-    public UserInfoBuilder(String username) {
-        this.username = username;
-    }
-
-    /**
-     * @return The user.
-     */
-    @Override
-    public MutableUserInfo build() {
-        if (StringUtils.isBlank(username)) {
-            throw new IllegalStateException("User must have a username");
-        }
-
-        MutableUserInfo user = InfoFactoryHolder.get().createUser();
-        user.setUsername(username);
-        user.setPassword(password);
-        user.setEmail(email);
-        user.setAdmin(admin);
-        user.setEnabled(enabled);
-        user.setUpdatableProfile(updatableProfile);
-        user.setAccountNonExpired(true);
-        user.setCredentialsExpired(false);
-        user.setCredentialsNonExpired(true);
-        user.setAccountNonLocked(true);
-        user.setTransientUser(transientUser);
-        user.setGroups(groups);
-        user.setBintrayAuth(bintrayAuth);
-        user.setUserProperties(userPropertyInfos);
-        return user;
-    }
-
-    public UserInfoBuilder email(String email) {
-        this.email = email;
-        return this;
-    }
-
-    public UserInfoBuilder password(SaltedPassword saltedPassword) {
-        this.password = saltedPassword;
-        return this;
-    }
-
-    public UserInfoBuilder admin(boolean admin) {
-        this.admin = admin;
-        return this;
-    }
-
-    public UserInfoBuilder enabled(boolean enabled) {
-        this.enabled = enabled;
-        return this;
-    }
-
-    public UserInfoBuilder updatableProfile(boolean updatableProfile) {
-        this.updatableProfile = updatableProfile;
-        return this;
-    }
-
-    public UserInfoBuilder transientUser() {
-        this.transientUser = true;
-        return this;
-    }
-
-    public UserInfoBuilder internalGroups(Set<String> groupNames) {
-        if (groupNames != null) {
-            groups(InfoFactoryHolder.get().createGroups(groupNames));
-        } else {
-            groups(null);
-        }
-        return this;
-    }
-
-    public UserInfoBuilder groups(@Nullable Set<UserGroupInfo> groups) {
-        if (groups != null) {
-            this.groups = groups;
-        } else {
-            this.groups = Collections.emptySet();
-        }
-        return this;
-    }
-
-    public UserInfoBuilder addProp(UserPropertyInfo prop) {
-        if (userPropertyInfos == null) {
-            this.userPropertyInfos = Sets.newHashSet();
-        }
-        userPropertyInfos.add(prop);
-        return this;
-    }
-
-    public UserInfoBuilder bintrayAuth(String bintrayAuth) {
-        this.bintrayAuth = bintrayAuth;
-        return this;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/security/ldap/LdapService.java b/base/api/src/main/java/org/artifactory/api/security/ldap/LdapService.java
deleted file mode 100644
index 83b3f9b..0000000
--- a/base/api/src/main/java/org/artifactory/api/security/ldap/LdapService.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.security.ldap;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.descriptor.security.ldap.LdapSetting;
-
-/**
- * LDAP service, which performs basic procedures (e.g. testing LDAP connection) on an LDAP server.
- *
- * @author Tomer Cohen
- */
-public interface LdapService {
-    /**
-     * The realm of LDAP groups.
-     */
-    String REALM = "ldap";
-
-    /**
-     * Tries to connect to an ldap server and returns the result in the status holder. The message in the status holder
-     * is meant to be displayed to the user.
-     *
-     * @param ldapSetting The information for the ldap connection
-     * @param username    The username that will be used to test the connection
-     * @param password    The password that will be used to test the connection
-     * @return StatusHolder with the connection attempt results.
-     */
-    BasicStatusHolder testLdapConnection(LdapSetting ldapSetting, String username, String password);
-
-    /**
-     * Given the username, bring back the LDAP user with the DN.
-     *
-     * @param ldapSetting The ldap Settings.
-     * @param userName    The user name
-     * @return The LDAP user with the DN.
-     */
-    LdapUser getDnFromUserName(LdapSetting ldapSetting, String userName);
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/security/ldap/LdapUser.java b/base/api/src/main/java/org/artifactory/api/security/ldap/LdapUser.java
deleted file mode 100644
index 1fefab8..0000000
--- a/base/api/src/main/java/org/artifactory/api/security/ldap/LdapUser.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.security.ldap;
-
-/**
- * Object representation of an LDAP user.
- *
- * @author Tomer Cohen
- */
-public class LdapUser {
-
-    private String uid;
-    private String dn;
-
-    public LdapUser(String uid, String dn) {
-        this.dn = dn;
-        this.uid = uid;
-    }
-
-    public String getUid() {
-        return uid;
-    }
-
-    public void setUid(String uid) {
-        this.uid = uid;
-    }
-
-    public String getDn() {
-        return dn;
-    }
-
-    public void setDn(String dn) {
-        this.dn = dn;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof LdapUser)) {
-            return false;
-        }
-
-        LdapUser ldapUser = (LdapUser) o;
-
-        if (!uid.equals(ldapUser.uid)) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return uid.hashCode();
-    }
-
-    @Override
-    public String toString() {
-        final StringBuilder sb = new StringBuilder();
-        sb.append("LdapUser");
-        sb.append("{uid='").append(uid).append('\'');
-        sb.append(", dn='").append(dn).append('\'');
-        sb.append('}');
-        return sb.toString();
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/storage/BinariesInfo.java b/base/api/src/main/java/org/artifactory/api/storage/BinariesInfo.java
deleted file mode 100644
index 35a52cd..0000000
--- a/base/api/src/main/java/org/artifactory/api/storage/BinariesInfo.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.storage;
-
-import java.io.Serializable;
-
-/**
- * Simple value object to store stored binaries info.
- *
- * @author Yossi Shaul
- */
-public class BinariesInfo implements Serializable {
-    private final long binariesCount;
-    private final long binariesSize;
-
-    public BinariesInfo(long binariesCount, long binariesSize) {
-        this.binariesCount = binariesCount;
-        this.binariesSize = binariesSize;
-    }
-
-    /**
-     * @return Number of binaries
-     */
-    public long getBinariesCount() {
-        return binariesCount;
-    }
-
-    /**
-     * @return Total size, in bytes, of the binaries
-     */
-    public long getBinariesSize() {
-        return binariesSize;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/storage/StorageQuotaInfo.java b/base/api/src/main/java/org/artifactory/api/storage/StorageQuotaInfo.java
deleted file mode 100644
index 37dad46..0000000
--- a/base/api/src/main/java/org/artifactory/api/storage/StorageQuotaInfo.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.storage;
-
-/**
- * Holds the storage quota information.
- *
- * @author Shay Yaakov
- */
-public class StorageQuotaInfo {
-    private final int diskSpaceLimitPercentage;
-    private final int diskSpaceWarningPercentage;
-    private long freeSpace;
-    private long totalSpace;
-    private long usedSpace;
-    private double dataUsagePercentage;
-
-    public StorageQuotaInfo(long freeSpace, long totalSpace, long usedSpace, int diskSpaceLimitPercentage,
-                            int diskSpaceWarningPercentage) {
-        this.freeSpace = freeSpace;
-        this.totalSpace = totalSpace;
-        this.usedSpace = usedSpace;
-        this.diskSpaceLimitPercentage = diskSpaceLimitPercentage;
-        this.diskSpaceWarningPercentage = diskSpaceWarningPercentage;
-        this.dataUsagePercentage = (double) usedSpace / totalSpace * 100;
-    }
-
-    public boolean isLimitReached() {
-        return dataUsagePercentage >= diskSpaceLimitPercentage;
-    }
-
-    public boolean isWarningLimitReached() {
-        return dataUsagePercentage >= diskSpaceWarningPercentage;
-    }
-
-    public int getDiskSpaceLimitPercentage() {
-        return diskSpaceLimitPercentage;
-    }
-
-    public int getDataUsagePercentage() {
-        return (int) dataUsagePercentage;
-    }
-
-    public int getDiskSpaceWarningPercentage() {
-        return diskSpaceWarningPercentage;
-    }
-
-    public String getReadableFreeSpace() {
-        return StorageUnit.toReadableString(freeSpace);
-    }
-
-    public String getReadableTotalSpace() {
-        return StorageUnit.toReadableString(totalSpace);
-    }
-
-    public String getReadableUsedSpace() {
-        return StorageUnit.toReadableString(usedSpace);
-    }
-
-    public String getErrorMessage() {
-        return String.format("Datastore disk space is too high: " +
-                "Max limit: %s%%, Used: %s%%, Total: %s, Used: %s, Available: %s",
-                getDiskSpaceLimitPercentage(), getDataUsagePercentage(),
-                getReadableTotalSpace(), getReadableUsedSpace(), getReadableFreeSpace());
-    }
-
-    public String getWarningMessage() {
-        return String.format("Datastore disk is too high: " +
-                "Warning limit: %s%%, Used: %s%%, Total: %s, Used: %s, Available: %s",
-                getDiskSpaceWarningPercentage(), getDataUsagePercentage(),
-                getReadableTotalSpace(), getReadableUsedSpace(), getReadableFreeSpace());
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/storage/StorageUnit.java b/base/api/src/main/java/org/artifactory/api/storage/StorageUnit.java
deleted file mode 100644
index ead6945..0000000
--- a/base/api/src/main/java/org/artifactory/api/storage/StorageUnit.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.storage;
-
-import java.math.BigDecimal;
-import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
-import java.util.Locale;
-
-interface StorageConstants {
-    /**
-     * One kilo bytes in big decimal
-     */
-    BigDecimal ONE_KILO = new BigDecimal(1024);
-
-    /**
-     * The number of units to the transition to the next unit, i.e. there are 1024 bytes in a KB.
-     */
-    double UNITS_TO_NEXT_UNIT = 1024.0;
-}
-
-/**
- * Represent the different storage units and their conversion to/from bytes
- *
- * @author Tomer Cohen
- */
-public enum StorageUnit {
-    /**
-     * One byte
-     */
-    ONE(new BigDecimal(1)) {
-        @Override
-        public double fromBytes(long size) {
-            return size;
-        }
-
-        @Override
-        public double toBytes(int size) {
-            return size;
-        }
-
-        @Override
-        public String displayName() {
-            return "bytes";
-        }
-    },
-    /**
-     * The kilobyte storage unit.
-     */
-    KB(StorageConstants.ONE_KILO) {
-        @Override
-        public double fromBytes(long size) {
-            return size / StorageConstants.UNITS_TO_NEXT_UNIT;
-        }
-
-        @Override
-        public double toBytes(int size) {
-            return size * StorageConstants.UNITS_TO_NEXT_UNIT;
-        }
-    },
-    /**
-     * The megabyte storage unit.
-     */
-    MB(KB.getNumberOfBytes().multiply(StorageConstants.ONE_KILO)) {
-        @Override
-        public double fromBytes(long size) {
-            return KB.fromBytes(size) / StorageConstants.UNITS_TO_NEXT_UNIT;
-        }
-
-        @Override
-        public double toBytes(int size) {
-            return KB.toBytes(size) * StorageConstants.UNITS_TO_NEXT_UNIT;
-        }
-    },
-    /**
-     * The gigabyte storage unit.
-     */
-    GB(MB.getNumberOfBytes().multiply(StorageConstants.ONE_KILO)) {
-        @Override
-        public double fromBytes(long size) {
-            return MB.fromBytes(size) / StorageConstants.UNITS_TO_NEXT_UNIT;
-        }
-
-        @Override
-        public double toBytes(int size) {
-            return MB.toBytes(size) * StorageConstants.UNITS_TO_NEXT_UNIT;
-        }
-    },
-
-    /**
-     * The terabyte storage unit.
-     */
-    TB(GB.getNumberOfBytes().multiply(StorageConstants.ONE_KILO)) {
-        @Override
-        public double fromBytes(long size) {
-            return GB.fromBytes(size) / StorageConstants.UNITS_TO_NEXT_UNIT;
-        }
-
-        @Override
-        public double toBytes(int size) {
-            return GB.toBytes(size) * StorageConstants.UNITS_TO_NEXT_UNIT;
-        }
-    };
-
-    private final BigDecimal numberOfBytes;
-
-    StorageUnit(BigDecimal numberOfBytes) {
-        this.numberOfBytes = numberOfBytes;
-    }
-
-    public BigDecimal getNumberOfBytes() {
-        return numberOfBytes;
-    }
-
-    /**
-     * Convert the number of bytes to the target storage unit.
-     *
-     * @param size The initial number in bytes.
-     * @return The converted number of bytes in the target storage unit.
-     */
-    public abstract double fromBytes(long size);
-
-    /**
-     * Revert the number of the target storage unit to bytes.
-     *
-     * @param size The number of the target storage unit.
-     * @return The converted number of target storage units back to bytes.
-     */
-    public abstract double toBytes(int size);
-
-    /**
-     * @return How to display the size in readable format
-     */
-    public String displayName() {
-        return name();
-    }
-
-    /**
-     * Convert the number of bytes to a human readable size, if the size is more than 1024 megabytes display the correct
-     * number of gigabytes.
-     *
-     * @param size The size in bytes.
-     * @return The size in human readable format.
-     */
-    public static String toReadableString(long size) {
-        DecimalFormat decimalFormat = createFormat();
-        for (StorageUnit unit : StorageUnit.values()) {
-            double readableSize = unit.fromBytes(size);
-            if (unit == TB) {
-                // no more always return
-                return decimalFormat.format(readableSize) + " " + unit.displayName();
-            }
-            // if less than 1 byte, then simply return the bytes as it is
-            if (readableSize < StorageConstants.UNITS_TO_NEXT_UNIT) {
-                if (unit == ONE) {
-                    return size + " " + unit.displayName();
-                } else {
-                    return decimalFormat.format(readableSize) + " " + unit.displayName();
-                }
-            }
-        }
-        throw new IllegalStateException("Could not reach here");
-    }
-
-    public static String format(double size) {
-        return createFormat().format(size);
-    }
-
-    public static long fromReadableString(String humanReadableSize) {
-        String number = humanReadableSize.replaceAll("([TtGgMmKkBb])", "");
-        BigDecimal d = new BigDecimal(number);
-        BigDecimal l = null;
-        int unitLength = humanReadableSize.length() - number.length();
-        int unitIndex = unitLength > 0 ? humanReadableSize.length() - unitLength : 0;
-        switch (humanReadableSize.charAt(unitIndex)) {
-            default:
-                l = d;
-                break;
-            case 'K':
-            case 'k':
-                l = d.multiply(KB.getNumberOfBytes());
-                break;
-            case 'M':
-            case 'm':
-                l = d.multiply(MB.getNumberOfBytes());
-                break;
-            case 'G':
-            case 'g':
-                l = d.multiply(GB.getNumberOfBytes());
-                break;
-            case 'T':
-            case 't':
-                l = d.multiply(TB.getNumberOfBytes());
-                break;
-        }
-        return l.longValue();
-    }
-
-    private static DecimalFormat createFormat() {
-        DecimalFormat decimalFormat = new DecimalFormat(",###.##", new DecimalFormatSymbols(Locale.ENGLISH));
-        decimalFormat.setMinimumFractionDigits(2);
-        return decimalFormat;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/api/util/Builder.java b/base/api/src/main/java/org/artifactory/api/util/Builder.java
deleted file mode 100644
index 40d0520..0000000
--- a/base/api/src/main/java/org/artifactory/api/util/Builder.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.util;
-
-/**
- * Builder interface.
- *
- * @author Yossi Shaul
- */
-public interface Builder<T> {
-    /**
-     * @return Validate create and configure the object.
-     */
-    T build();
-}
diff --git a/base/api/src/main/java/org/artifactory/api/version/ArtifactoryVersioning.java b/base/api/src/main/java/org/artifactory/api/version/ArtifactoryVersioning.java
deleted file mode 100644
index b35be94..0000000
--- a/base/api/src/main/java/org/artifactory/api/version/ArtifactoryVersioning.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.version;
-
-/**
- * An object that is used to contain the VersionHolders of the the VersionInfoService
- *
- * @author Noam Tenne
- */
-public class ArtifactoryVersioning {
-    /**
-     * A version holder for the latest version of any kind (beta, rc, release)
-     */
-    private VersionHolder latest;
-    /**
-     * A version holder for the latest release version
-     */
-    private VersionHolder release;
-
-    /**
-     * Main constructor
-     *
-     * @param latest  Version holder with latest version of any kind
-     * @param release Version holder with latest release version
-     */
-    public ArtifactoryVersioning(VersionHolder latest, VersionHolder release) {
-        this.latest = latest;
-        this.release = release;
-    }
-
-    /**
-     * Returns the version holder with latest version of any kind
-     *
-     * @return VersionHolder - Latest version of any kind
-     */
-    public VersionHolder getLatest() {
-        return latest;
-    }
-
-    /**
-     * Returns the version holder with latest release version
-     *
-     * @return VersionHolder - Latest release version
-     */
-    public VersionHolder getRelease() {
-        return release;
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/version/VersionHolder.java b/base/api/src/main/java/org/artifactory/api/version/VersionHolder.java
deleted file mode 100644
index 93aa82a..0000000
--- a/base/api/src/main/java/org/artifactory/api/version/VersionHolder.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.version;
-
-import static org.artifactory.api.version.VersionInfoService.SERVICE_UNAVAILABLE;
-import static org.artifactory.api.version.VersionInfoService.WIKI_DEFAULT;
-
-/**
- * An object used to hold version and revision information for the VersionInfoService
- *
- * @author Noam Tenne
- */
-public class VersionHolder {
-
-    public static final VersionHolder VERSION_UNAVAILABLE = new VersionHolder(
-            SERVICE_UNAVAILABLE, SERVICE_UNAVAILABLE, WIKI_DEFAULT, SERVICE_UNAVAILABLE);
-
-    /**
-     * Version number
-     */
-    private String version;
-    /**
-     * Revision number
-     */
-    private String revision;
-    /**
-     * The url of the version wiki
-     */
-    private String wikiUrl;
-    /**
-     * The url of the version download
-     */
-    private String downloadUrl;
-
-    /**
-     * Main constructor
-     *
-     * @param version     Version number
-     * @param revision    Revision number
-     * @param wikiUrl     Url to version wiki
-     * @param downloadUrl Url to version download
-     */
-    public VersionHolder(String version, String revision, String wikiUrl, String downloadUrl) {
-        this.version = version;
-        this.revision = revision;
-        this.wikiUrl = wikiUrl;
-        this.downloadUrl = downloadUrl;
-    }
-
-    /**
-     * Returns the version number
-     *
-     * @return String - Version number
-     */
-    public String getVersion() {
-        return version;
-    }
-
-    /**
-     * Returns the revisions number
-     *
-     * @return String - Revision number
-     */
-    public String getRevision() {
-        return revision;
-    }
-
-    /**
-     * Returns the url to the wiki page of the version
-     *
-     * @return String - Url to version wiki
-     */
-    public String getWikiUrl() {
-        return wikiUrl;
-    }
-
-    /**
-     * Returns the url of the version download
-     *
-     * @return String Url to version download
-     */
-    public String getDownloadUrl() {
-        return downloadUrl;
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/api/version/VersionInfoService.java b/base/api/src/main/java/org/artifactory/api/version/VersionInfoService.java
deleted file mode 100644
index 6d0c023..0000000
--- a/base/api/src/main/java/org/artifactory/api/version/VersionInfoService.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.version;
-
-import org.artifactory.api.repo.Async;
-
-import java.util.Map;
-import java.util.concurrent.Future;
-
-/**
- * Main interface for the Version Info Service
- *
- * @author Noam Tenne
- */
-public interface VersionInfoService {
-
-    /**
-     * Indicates that the remote versioning service is unavailable It might be down, blocked or not connected yet
-     */
-    String SERVICE_UNAVAILABLE = "NA";
-
-    /**
-     * Points to the wiki home page, in case the service is unavailable
-     */
-    String WIKI_DEFAULT = "http://wiki.jfrog.org/confluence/display/RTF";
-
-    /**
-     * Get latest version information. If not yet retrieved from the remote server return SERVICE_UNAVAILABLE and
-     * retrieve the versioning in a background task.
-     *
-     * @param headersMap a map of the original http headers
-     * @param release    True to get the latest stable version, False to get the latest version of any kind @return
-     *                   String Latest version number
-     */
-    VersionHolder getLatestVersion(Map<String, String> headersMap, boolean release);
-
-    /**
-     * @param headersMap Client http header params
-     * @return Artifactory versioning info from the remove jfrog service.
-     */
-    @Async
-    Future<ArtifactoryVersioning> getRemoteVersioningAsync(Map<String, String> headersMap);
-}
diff --git a/base/api/src/main/java/org/artifactory/api/web/WebappService.java b/base/api/src/main/java/org/artifactory/api/web/WebappService.java
deleted file mode 100644
index d062f95..0000000
--- a/base/api/src/main/java/org/artifactory/api/web/WebappService.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.web;
-
-/**
- * Services given by the web application to other components.
- *
- * @author Yossi Shaul
- */
-public interface WebappService {
-
-    /**
-     * Creates an HTML link to the given repo path ID in the tree browser
-     *
-     * @param artifactoryUrl URL to Artifactory (excluding context)
-     * @param repoPathId     Repo path ID to link to
-     * @param linkLabel      Link label
-     * @return HTML link
-     */
-    String createLinkToBrowsableArtifact(String artifactoryUrl, String repoPathId, String linkLabel);
-
-}
diff --git a/base/api/src/main/java/org/artifactory/api/webdav/WebdavService.java b/base/api/src/main/java/org/artifactory/api/webdav/WebdavService.java
deleted file mode 100644
index 0f7ddd9..0000000
--- a/base/api/src/main/java/org/artifactory/api/webdav/WebdavService.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.webdav;
-
-import com.google.common.collect.Sets;
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.request.ArtifactoryRequest;
-
-import java.io.IOException;
-import java.util.Set;
-
-/**
- * User: freds Date: Jul 27, 2008 Time: 9:26:56 PM
- */
-public interface WebdavService {
-
-    /**
-     * This is used by request utils and should go
-     * Supported web dav methods. (post method is not supported)
-     * TODO [yluft]: Remove this.
-     */
-    Set<String> WEBDAV_METHODS = Sets.newHashSet(
-            "propfind", "mkcol", "move", "delete", "options", "proppatch", "lock", "unlock");
-
-    /**
-     * Attempt to handle the request.
-     * @param request
-     * @param response
-     * @return true if request was handled, false if no method handler was found.
-     * @throws IOException
-     */
-    boolean handleRequest(String methodName, ArtifactoryRequest request, ArtifactoryResponse response) throws IOException;
-
-    /**
-     * Supported web dav methods. (post method is not supported)
-     */
-    Set<String> supportedMethods();
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/AqlConverts.java b/base/api/src/main/java/org/artifactory/aql/AqlConverts.java
deleted file mode 100644
index 25849a8..0000000
--- a/base/api/src/main/java/org/artifactory/aql/AqlConverts.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package org.artifactory.aql;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Sets;
-import org.artifactory.aql.model.AqlItemTypeEnum;
-import org.artifactory.aql.result.rows.AqlBaseFullRowImpl;
-import org.artifactory.aql.result.rows.AqlItem;
-import org.artifactory.aql.util.AqlUtils;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.fs.MutableFileInfo;
-import org.artifactory.fs.MutableFolderInfo;
-import org.artifactory.repo.RepoPath;
-
-import java.util.Date;
-import java.util.Set;
-
-/**
- * Converter from Aql entities to other data objects.
- *
- * @author Yossi Shaul
- */
-public abstract class AqlConverts {
-    public static final Function<AqlItem, ItemInfo> toFileInfo = new Function<AqlItem, ItemInfo>() {
-        @Override
-        public ItemInfo apply(AqlItem input) {
-            RepoPath repoPath = AqlUtils.fromAql((AqlBaseFullRowImpl) input);
-            AqlItemTypeEnum type = input.getType();
-            if (AqlItemTypeEnum.folder == type) {
-                MutableFolderInfo folderInfo = InfoFactoryHolder.get().createFolderInfo(repoPath);
-                folderInfo.setCreated(input.getCreated().getTime());
-                folderInfo.setLastUpdated(input.getUpdated().getTime());
-                folderInfo.setCreatedBy(input.getCreatedBy());
-                Date modified = input.getModified();
-                if (modified != null) {
-                    folderInfo.setLastModified(modified.getTime());
-                }
-                folderInfo.setModifiedBy(input.getModifiedBy());
-                return folderInfo;
-            } else {
-                MutableFileInfo fileInfo = InfoFactoryHolder.get().createFileInfo(repoPath);
-                fileInfo.setSize(input.getSize());
-                fileInfo.setCreated(input.getCreated().getTime());
-                fileInfo.setLastUpdated(input.getUpdated().getTime());
-                fileInfo.setCreatedBy(input.getCreatedBy());
-                Date modified = input.getModified();
-                if (modified != null) {
-                    fileInfo.setLastModified(modified.getTime());
-                }
-                fileInfo.setModifiedBy(input.getModifiedBy());
-                Set<ChecksumInfo> checksums = Sets.newHashSet();
-                checksums.add(new ChecksumInfo(ChecksumType.md5, input.getOriginalMd5(), input.getActualMd5()));
-                checksums.add(new ChecksumInfo(ChecksumType.sha1, input.getOriginalSha1(), input.getActualSha1()));
-                fileInfo.setChecksums(checksums);
-                return fileInfo;
-            }
-        }
-    };
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/AqlException.java b/base/api/src/main/java/org/artifactory/aql/AqlException.java
deleted file mode 100644
index 4bd4103..0000000
--- a/base/api/src/main/java/org/artifactory/aql/AqlException.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.artifactory.aql;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlException extends RuntimeException {
-    public AqlException(String message) {
-        super(message);
-    }
-
-    public AqlException(String message, Exception e) {
-        super(message, e);
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/aql/AqlFieldResolver.java b/base/api/src/main/java/org/artifactory/aql/AqlFieldResolver.java
deleted file mode 100644
index 9f448d4..0000000
--- a/base/api/src/main/java/org/artifactory/aql/AqlFieldResolver.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.aql;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.aql.model.AqlField;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.model.AqlValue;
-import org.artifactory.aql.model.AqlVariable;
-import org.artifactory.aql.model.AqlVariableTypeEnum;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlFieldResolver {
-    public static AqlVariable resolve(String fieldName) {
-        if (StringUtils.isEmpty(fieldName)) {
-            throw new IllegalArgumentException("Cannot accept null or empty property name!");
-        }
-        AqlFieldEnum value = AqlFieldEnum.value(fieldName);
-        if (value != null) {
-            return new AqlField(value);
-        } else {
-            return new AqlValue(AqlVariableTypeEnum.string, fieldName);
-        }
-    }
-
-    public static AqlField resolve(AqlFieldEnum fieldEnum) {
-        if (fieldEnum == null) {
-            throw new IllegalArgumentException("Cannot accept null fields!");
-        }
-        return new AqlField(fieldEnum);
-    }
-
-    public static AqlVariable resolve(String value, AqlVariableTypeEnum type) {
-        return new AqlValue(type, value);
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/AqlParserException.java b/base/api/src/main/java/org/artifactory/aql/AqlParserException.java
deleted file mode 100644
index 64e14ca..0000000
--- a/base/api/src/main/java/org/artifactory/aql/AqlParserException.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.artifactory.aql;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlParserException extends AqlException {
-    public AqlParserException(String message) {
-        super(message);
-    }
-
-    public AqlParserException(String message, Exception e) {
-        super(message, e);
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/AqlService.java b/base/api/src/main/java/org/artifactory/aql/AqlService.java
deleted file mode 100644
index 7b0b794..0000000
--- a/base/api/src/main/java/org/artifactory/aql/AqlService.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.aql;
-
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.result.AqlEagerResult;
-import org.artifactory.aql.result.AqlLazyResult;
-import org.artifactory.aql.result.rows.AqlRowResult;
-
-/**
- * @author Gidi Shabat
- */
-public interface AqlService {
-
-    /**
-     * Parse the AQL query,
-     * convert the parser result into Aql query,
-     * convert the Aql query to sql query
-     * and finally execute the query lazy
-     */
-    AqlLazyResult executeQueryLazy(String query);
-
-    /**
-     * Parse the AQL query,
-     * convert the parser result into AqlApi query,
-     * convert the AqlApi query to sql query
-     * and finally execute the query eagerly
-     */
-    AqlEagerResult executeQueryEager(String query);
-
-    /**
-     * Converts the AQL API QUERY into aqlApi query,
-     * then convert the aqlApi query into SQL query,
-     * and finally execute the query eagerly
-     */
-
-    <T extends AqlRowResult> AqlEagerResult<T> executeQueryEager(AqlBase<? extends AqlBase, T> aqlBase);
-
-    AqlLazyResult executeQueryLazy(AqlBase query);
-
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/api/AqlApiElement.java b/base/api/src/main/java/org/artifactory/aql/api/AqlApiElement.java
deleted file mode 100644
index 82d990d..0000000
--- a/base/api/src/main/java/org/artifactory/aql/api/AqlApiElement.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.artifactory.aql.api;
-
-import org.artifactory.aql.api.internal.AqlBase;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public interface AqlApiElement<T extends AqlBase> {
-    List<AqlApiElement<T>> get();
-
-    public boolean isEmpty();
-    public String toNative(int dept);
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiArchive.java b/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiArchive.java
deleted file mode 100644
index 5319929..0000000
--- a/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiArchive.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.artifactory.aql.api.domain.sensitive;
-
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.api.internal.AqlApiDynamicFieldsDomains;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.result.rows.AqlArchiveEntryItem;
-
-import java.util.ArrayList;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlApiArchive extends AqlBase<AqlApiArchive, AqlArchiveEntryItem> {
-
-    public AqlApiArchive() {
-        super(AqlArchiveEntryItem.class);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiArchiveEntryDynamicFieldsDomains<AqlApiArchive> entry() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.archives, AqlDomainEnum.entries);
-        return new AqlApiDynamicFieldsDomains.AqlApiArchiveEntryDynamicFieldsDomains(subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiItemDynamicFieldsDomains<AqlApiArchive> item() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.archives, AqlDomainEnum.items);
-        return new AqlApiDynamicFieldsDomains.AqlApiItemDynamicFieldsDomains(subDomains);
-    }
-
-    public static AqlApiArchive create() {
-        return new AqlApiArchive();
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiArtifact.java b/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiArtifact.java
deleted file mode 100644
index 8351344..0000000
--- a/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiArtifact.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.artifactory.aql.api.domain.sensitive;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.api.internal.AqlApiDynamicFieldsDomains;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.result.rows.AqlBuildArtifact;
-
-import java.util.ArrayList;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlApiArtifact extends AqlBase<AqlApiArtifact, AqlBuildArtifact> {
-
-    public AqlApiArtifact() {
-        super(AqlBuildArtifact.class);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiArtifact> type() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.artifacts);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.buildArtifactType, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiArtifact> name() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.artifacts);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.buildArtifactName, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiArtifact> sha1() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.artifacts);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.buildArtifactSha1, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiArtifact> md5() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.artifacts);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.buildArtifactMd5, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiModuleDynamicFieldsDomains<AqlApiArtifact> module() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.artifacts, AqlDomainEnum.modules);
-        return new AqlApiDynamicFieldsDomains.AqlApiModuleDynamicFieldsDomains(subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiItemDynamicFieldsDomains<AqlApiArtifact> item() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.artifacts, AqlDomainEnum.items);
-        return new AqlApiDynamicFieldsDomains.AqlApiItemDynamicFieldsDomains(subDomains);
-    }
-
-    public static AqlApiArtifact create() {
-        return new AqlApiArtifact();
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiBuild.java b/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiBuild.java
deleted file mode 100644
index ef29ece..0000000
--- a/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiBuild.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.artifactory.aql.api.domain.sensitive;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.api.internal.AqlApiDynamicFieldsDomains;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.result.rows.AqlBuild;
-
-import java.util.ArrayList;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlApiBuild extends AqlBase<AqlApiBuild, AqlBuild> {
-
-    public AqlApiBuild() {
-        super(AqlBuild.class);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiBuild> number() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.builds);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.buildNumber, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiBuild> name() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.builds);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.buildName, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiBuild> url() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.builds);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.buildUrl, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiBuild> created() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.builds);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.buildCreated, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiBuild> createdBy() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.builds);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.buildCreatedBy, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiBuild> modified() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.builds);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.buildModified, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiBuild> modifiedBy() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.builds);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.buildModifiedBy, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiModuleDynamicFieldsDomains<AqlApiBuild> module() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.builds, AqlDomainEnum.modules);
-        return new AqlApiDynamicFieldsDomains.AqlApiModuleDynamicFieldsDomains(subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiBuildPropertyDynamicFieldsDomains<AqlApiBuild> property() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.builds, AqlDomainEnum.buildProperties);
-        return new AqlApiDynamicFieldsDomains.AqlApiBuildPropertyDynamicFieldsDomains(subDomains);
-    }
-
-    public static AqlApiBuild create() {
-        return new AqlApiBuild();
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiBuildPromotion.java b/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiBuildPromotion.java
deleted file mode 100644
index c972d09..0000000
--- a/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiBuildPromotion.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.artifactory.aql.api.domain.sensitive;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.api.internal.AqlApiDynamicFieldsDomains;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.result.rows.AqlBuildPromotion;
-
-import java.util.ArrayList;
-
-/**
- * @author gidis
- */
-public class AqlApiBuildPromotion extends AqlBase<AqlApiBuildPromotion, AqlBuildPromotion> {
-
-    public AqlApiBuildPromotion() {
-        super(AqlBuildPromotion.class);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiBuildPromotion> created() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.buildPromotions);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.buildPromotionCreated, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiBuildPromotion> createdBy() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.buildPromotions);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.buildPromotionCreatedBy, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiBuildPromotion> comment() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.buildPromotions);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.buildPromotionComment, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiBuildPromotion> status() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.buildPromotions);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.buildPromotionStatus, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiBuildPromotion> repo() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.buildPromotions);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.buildPromotionRepo, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiBuildPromotion> userName() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.buildPromotions);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.buildPromotionUserName, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiBuildDynamicFieldsDomains<AqlApiBuildPromotion> build() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.buildPromotions, AqlDomainEnum.builds);
-        return new AqlApiDynamicFieldsDomains.AqlApiBuildDynamicFieldsDomains(subDomains);
-    }
-
-    public static AqlApiBuildPromotion create() {
-        return new AqlApiBuildPromotion();
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiBuildProperty.java b/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiBuildProperty.java
deleted file mode 100644
index 007ae1b..0000000
--- a/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiBuildProperty.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.aql.api.domain.sensitive;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.api.internal.AqlApiDynamicFieldsDomains;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.model.AqlComparatorEnum;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.result.rows.AqlBuildProperty;
-
-import java.util.ArrayList;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlApiBuildProperty extends AqlBase<AqlApiBuildProperty, AqlBuildProperty> {
-
-    public AqlApiBuildProperty() {
-        super(AqlBuildProperty.class);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiBuildProperty> key() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.buildProperties);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.buildPropertyKey, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiBuildProperty> value() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.buildProperties);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.buildPropertyValue, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiBuildDynamicFieldsDomains<AqlApiBuildProperty> build() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.buildProperties, AqlDomainEnum.builds);
-        return new AqlApiDynamicFieldsDomains.AqlApiBuildDynamicFieldsDomains(subDomains);
-    }
-
-    public static AqlBase.PropertyCriteriaClause<AqlApiProperty> property(String key, AqlComparatorEnum comparator,
-            String value) {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.buildProperties);
-        return new AqlBase.PropertyCriteriaClause(key, comparator, value, subDomains);
-    }
-    public static AqlApiBuildProperty create() {
-        return new AqlApiBuildProperty();
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiDependency.java b/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiDependency.java
deleted file mode 100644
index 650b89d..0000000
--- a/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiDependency.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.artifactory.aql.api.domain.sensitive;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.api.internal.AqlApiDynamicFieldsDomains;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.result.rows.AqlBuildDependency;
-
-import java.util.ArrayList;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlApiDependency extends AqlBase<AqlApiDependency, AqlBuildDependency> {
-
-    public AqlApiDependency() {
-        super(AqlBuildDependency.class);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiDependency> type() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.dependencies);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.buildDependencyType, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiDependency> name() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.dependencies);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.buildDependencyName, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiDependency> sha1() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.dependencies);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.buildDependencySha1, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiDependency> md5() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.dependencies);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.buildDependencyMd5, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiDependency> scope() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.dependencies);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.buildDependencyScope, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiModuleDynamicFieldsDomains<AqlApiDependency> module() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.dependencies, AqlDomainEnum.modules);
-        return new AqlApiDynamicFieldsDomains.AqlApiModuleDynamicFieldsDomains(subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiItemDynamicFieldsDomains<AqlApiDependency> item() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.dependencies, AqlDomainEnum.items);
-        return new AqlApiDynamicFieldsDomains.AqlApiItemDynamicFieldsDomains(subDomains);
-    }
-
-    public static AqlApiDependency create() {
-        return new AqlApiDependency();
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiEntry.java b/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiEntry.java
deleted file mode 100644
index 9257121..0000000
--- a/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiEntry.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.artifactory.aql.api.domain.sensitive;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.api.internal.AqlApiDynamicFieldsDomains;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.result.rows.AqlArchiveEntryItem;
-
-import java.util.ArrayList;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlApiEntry  extends AqlBase<AqlApiEntry, AqlArchiveEntryItem> {
-
-    public AqlApiEntry() {
-        super(AqlArchiveEntryItem.class);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiEntry> path() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.entries);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.archiveEntryPath, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiEntry> name() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.entries);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.archiveEntryName, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiArchiveDynamicFieldsDomains<AqlApiEntry> archive() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.entries, AqlDomainEnum.archives);
-        return new AqlApiDynamicFieldsDomains.AqlApiArchiveDynamicFieldsDomains(subDomains);
-    }
-
-
-
-    public static AqlApiEntry create() {
-        return new AqlApiEntry();
-    }
-}
-
diff --git a/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiItem.java b/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiItem.java
deleted file mode 100644
index 651ab38..0000000
--- a/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiItem.java
+++ /dev/null
@@ -1,119 +0,0 @@
-package org.artifactory.aql.api.domain.sensitive;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.api.internal.AqlApiDynamicFieldsDomains;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.result.rows.AqlItem;
-
-import java.util.ArrayList;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlApiItem extends AqlBase<AqlApiItem, AqlItem> {
-
-    public AqlApiItem() {
-        super(AqlItem.class);
-    }
-
-    public static AqlApiItem create() {
-        return new AqlApiItem();
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiItem> repo() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.items);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator<>(AqlFieldEnum.itemRepo, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiItem> path() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.items);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator<>(AqlFieldEnum.itemPath, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiItem> name() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.items);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator<>(AqlFieldEnum.itemName, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiItem> type() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.items);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator<>(AqlFieldEnum.itemType, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiItem> size() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.items);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator<>(AqlFieldEnum.itemSize, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiItem> created() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.items);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator<>(AqlFieldEnum.itemCreated, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiItem> createdBy() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.items);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator<>(AqlFieldEnum.itemCreatedBy, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiItem> modified() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.items);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator<>(AqlFieldEnum.itemModified, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiItem> modifiedBy() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.items);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator<>(AqlFieldEnum.itemModifiedBy, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiItem> sha1Actual() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.items);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator<>(AqlFieldEnum.itemActualSha1, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiItem> sha1Orginal() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.items);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator<>(AqlFieldEnum.itemOriginalSha1, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiItem> md5Actual() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.items);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator<>(AqlFieldEnum.itemActualMd5, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiItem> md5Orginal() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.items);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator<>(AqlFieldEnum.itemOriginalMd5, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiArchiveDynamicFieldsDomains<AqlApiItem> archive() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.items, AqlDomainEnum.archives);
-        return new AqlApiDynamicFieldsDomains.AqlApiArchiveDynamicFieldsDomains<>(subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiItemPropertyDynamicFieldsDomains<AqlApiItem> property() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.items, AqlDomainEnum.properties);
-        return new AqlApiDynamicFieldsDomains.AqlApiItemPropertyDynamicFieldsDomains<>(subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiStatisticDynamicFieldsDomains<AqlApiItem> statistic() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.items, AqlDomainEnum.statistics);
-        return new AqlApiDynamicFieldsDomains.AqlApiStatisticDynamicFieldsDomains<>(subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiArtifactDynamicFieldsDomains<AqlApiItem> artifact() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.items, AqlDomainEnum.artifacts);
-        return new AqlApiDynamicFieldsDomains.AqlApiArtifactDynamicFieldsDomains<>(subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiDependencyDynamicFieldsDomains<AqlApiItem> dependency() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.items, AqlDomainEnum.dependencies);
-        return new AqlApiDynamicFieldsDomains.AqlApiDependencyDynamicFieldsDomains<>(subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiItem> depth() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.items);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator<>(AqlFieldEnum.itemDepth, subDomains);
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiModule.java b/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiModule.java
deleted file mode 100644
index 6d85813..0000000
--- a/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiModule.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.artifactory.aql.api.domain.sensitive;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.api.internal.AqlApiDynamicFieldsDomains;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.result.rows.AqlBuildModule;
-
-import java.util.ArrayList;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlApiModule extends AqlBase<AqlApiArtifact, AqlBuildModule> {
-
-    public AqlApiModule() {
-        super(AqlBuildModule.class);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiModule> name() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.modules);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.moduleName, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiArtifactDynamicFieldsDomains<AqlApiModule> artifact() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.modules, AqlDomainEnum.artifacts);
-        return new AqlApiDynamicFieldsDomains.AqlApiArtifactDynamicFieldsDomains(subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiDependencyDynamicFieldsDomains<AqlApiModule> dependency() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.modules, AqlDomainEnum.dependencies);
-        return new AqlApiDynamicFieldsDomains.AqlApiDependencyDynamicFieldsDomains(subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiBuildDynamicFieldsDomains<AqlApiModule> build() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.modules, AqlDomainEnum.builds);
-        return new AqlApiDynamicFieldsDomains.AqlApiBuildDynamicFieldsDomains(subDomains);
-    }
-
-    public static AqlApiModule create() {
-        return new AqlApiModule();
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiProperty.java b/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiProperty.java
deleted file mode 100644
index 67c55e6..0000000
--- a/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiProperty.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.artifactory.aql.api.domain.sensitive;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.api.internal.AqlApiDynamicFieldsDomains;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.model.AqlComparatorEnum;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.result.rows.AqlProperty;
-
-import java.util.ArrayList;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlApiProperty extends AqlBase<AqlApiProperty, AqlProperty> {
-
-    public AqlApiProperty() {
-        super(AqlProperty.class);
-    }
-
-    public static AqlApiProperty create() {
-        return new AqlApiProperty();
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiProperty> key() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.properties);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.propertyKey, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiProperty> value() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.properties);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.propertyValue, subDomains);
-    }
-
-    public static AqlBase.PropertyCriteriaClause<AqlApiProperty> property(String key, AqlComparatorEnum comparator,
-            String value) {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.properties);
-        return new AqlBase.PropertyCriteriaClause(key, comparator, value, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiItemDynamicFieldsDomains<AqlApiProperty> item() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.properties, AqlDomainEnum.items);
-        return new AqlApiDynamicFieldsDomains.AqlApiItemDynamicFieldsDomains(subDomains);
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiStatistic.java b/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiStatistic.java
deleted file mode 100644
index 476f62c..0000000
--- a/base/api/src/main/java/org/artifactory/aql/api/domain/sensitive/AqlApiStatistic.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.aql.api.domain.sensitive;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.api.internal.AqlApiDynamicFieldsDomains;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.result.rows.AqlStatistics;
-
-import java.util.ArrayList;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlApiStatistic extends AqlBase<AqlApiStatistic, AqlStatistics> {
-
-    public AqlApiStatistic() {
-        super(AqlStatistics.class);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiStatistic> downloads() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.statistics);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.statDownloads, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiStatistic> downloadBy() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.statistics);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.statDownloadedBy, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiComparator<AqlApiStatistic> downloaded() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.statistics);
-        return new AqlApiDynamicFieldsDomains.AqlApiComparator(AqlFieldEnum.statDownloaded, subDomains);
-    }
-
-    public static AqlApiDynamicFieldsDomains.AqlApiItemDynamicFieldsDomains<AqlApiStatistic> item() {
-        ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(AqlDomainEnum.statistics, AqlDomainEnum.items);
-        subDomains.add(AqlDomainEnum.modules);
-        return new AqlApiDynamicFieldsDomains.AqlApiItemDynamicFieldsDomains(subDomains);
-    }
-
-    public static AqlApiStatistic create() {
-        return new AqlApiStatistic();
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/api/internal/AqlApiDynamicFieldsDomains.java b/base/api/src/main/java/org/artifactory/aql/api/internal/AqlApiDynamicFieldsDomains.java
deleted file mode 100644
index 63ef835..0000000
--- a/base/api/src/main/java/org/artifactory/aql/api/internal/AqlApiDynamicFieldsDomains.java
+++ /dev/null
@@ -1,562 +0,0 @@
-package org.artifactory.aql.api.internal;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlComparatorEnum;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.joda.time.DateTime;
-import org.joda.time.format.ISODateTimeFormat;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlApiDynamicFieldsDomains {
-    public static class AqlApiItemDynamicFieldsDomains<T extends AqlBase> {
-
-        private List<AqlDomainEnum> domains = Lists.newArrayList();
-
-        public AqlApiItemDynamicFieldsDomains(List<AqlDomainEnum> domains) {
-            this.domains.addAll(domains);
-        }
-
-        public AqlApiComparator<T> size() {
-            return new AqlApiComparator<>(AqlFieldEnum.itemSize, domains);
-        }
-
-        public AqlApiComparator<T> updated() {
-            return new AqlApiComparator<>(AqlFieldEnum.itemUpdated, domains);
-        }
-
-        public AqlApiComparator<T> repo() {
-            return new AqlApiComparator<>(AqlFieldEnum.itemRepo, domains);
-        }
-
-        public AqlApiComparator<T> path() {
-            return new AqlApiComparator<>(AqlFieldEnum.itemPath, domains);
-        }
-
-        public AqlApiComparator<T> name() {
-            return new AqlApiComparator<>(AqlFieldEnum.itemName, domains);
-        }
-
-        public AqlApiComparator<T> type() {
-            return new AqlApiComparator<>(AqlFieldEnum.itemType, domains);
-        }
-
-        public AqlApiComparator<T> created() {
-            return new AqlApiComparator<>(AqlFieldEnum.itemCreated, domains);
-        }
-
-        public AqlApiComparator<T> createdBy() {
-            return new AqlApiComparator<>(AqlFieldEnum.itemCreatedBy, domains);
-        }
-
-        public AqlApiComparator<T> modified() {
-            return new AqlApiComparator<>(AqlFieldEnum.itemModified, domains);
-        }
-
-        public AqlApiComparator<T> modifiedBy() {
-            return new AqlApiComparator<>(AqlFieldEnum.itemModifiedBy, domains);
-        }
-
-        public AqlApiComparator<T> sha1Actual() {
-            return new AqlApiComparator<>(AqlFieldEnum.itemActualSha1, domains);
-        }
-
-        public AqlApiComparator<T> sha1Original() {
-            return new AqlApiComparator<>(AqlFieldEnum.itemOriginalSha1, domains);
-        }
-
-        public AqlApiComparator<T> md5Actual() {
-            return new AqlApiComparator<>(AqlFieldEnum.itemActualMd5, domains);
-        }
-
-        public AqlApiComparator<T> md5Orginal() {
-            return new AqlApiComparator<>(AqlFieldEnum.itemOriginalMd5, domains);
-        }
-
-        public AqlApiComparator<T> depth() {
-            return new AqlApiComparator<>(AqlFieldEnum.itemDepth, domains);
-        }
-
-        public AqlApiArchiveDynamicFieldsDomains<T> archive() {
-            ArrayList<AqlDomainEnum> tempDomains = Lists.newArrayList(domains);
-            tempDomains.add(AqlDomainEnum.archives);
-            return new AqlApiArchiveDynamicFieldsDomains<>(tempDomains);
-        }
-
-        public AqlApiItemPropertyDynamicFieldsDomains<T> property() {
-            ArrayList<AqlDomainEnum> tempDomains = Lists.newArrayList(domains);
-            tempDomains.add(AqlDomainEnum.properties);
-            return new AqlApiItemPropertyDynamicFieldsDomains<>(tempDomains);
-        }
-
-        public AqlApiStatisticDynamicFieldsDomains<T> statistic() {
-            ArrayList<AqlDomainEnum> tempDomains = Lists.newArrayList(domains);
-            tempDomains.add(AqlDomainEnum.statistics);
-            return new AqlApiStatisticDynamicFieldsDomains<>(tempDomains);
-        }
-
-        public AqlApiArtifactDynamicFieldsDomains<T> artifact() {
-            ArrayList<AqlDomainEnum> tempDomains = Lists.newArrayList(domains);
-            tempDomains.add(AqlDomainEnum.artifacts);
-            return new AqlApiArtifactDynamicFieldsDomains<>(tempDomains);
-        }
-
-        public AqlApiDependencyDynamicFieldsDomains<T> dependency() {
-            ArrayList<AqlDomainEnum> tempDomains = Lists.newArrayList(domains);
-            tempDomains.add(AqlDomainEnum.dependencies);
-            return new AqlApiDependencyDynamicFieldsDomains<>(tempDomains);
-        }
-    }
-
-    public static class AqlApiArchiveDynamicFieldsDomains<T extends AqlBase> {
-        private List<AqlDomainEnum> domains = Lists.newArrayList();
-
-        public AqlApiArchiveDynamicFieldsDomains(List<AqlDomainEnum> domains) {
-            this.domains.addAll(domains);
-        }
-
-        public AqlApiItemDynamicFieldsDomains<T> item() {
-            ArrayList<AqlDomainEnum> tempDomains = Lists.newArrayList(domains);
-            tempDomains.add(AqlDomainEnum.items);
-            return new AqlApiItemDynamicFieldsDomains<>(tempDomains);
-        }
-
-        public AqlApiArchiveEntryDynamicFieldsDomains<T> entry() {
-            ArrayList<AqlDomainEnum> tempDomains = Lists.newArrayList(domains);
-            tempDomains.add(AqlDomainEnum.entries);
-            return new AqlApiArchiveEntryDynamicFieldsDomains<>(tempDomains);
-        }
-
-    }
-
-    public static class AqlApiArchiveEntryDynamicFieldsDomains<T extends AqlBase> {
-        private List<AqlDomainEnum> domains = Lists.newArrayList();
-
-        public AqlApiArchiveEntryDynamicFieldsDomains(List<AqlDomainEnum> domains) {
-            this.domains.addAll(domains);
-        }
-
-        public AqlApiComparator<T> name() {
-            return new AqlApiComparator<>(AqlFieldEnum.archiveEntryName, domains);
-        }
-
-        public AqlApiComparator<T> path() {
-            return new AqlApiComparator<>(AqlFieldEnum.archiveEntryPath, domains);
-        }
-
-        public AqlApiArchiveDynamicFieldsDomains<T> archive() {
-            ArrayList<AqlDomainEnum> tempDomains = Lists.newArrayList(domains);
-            tempDomains.add(AqlDomainEnum.archives);
-            return new AqlApiArchiveDynamicFieldsDomains<>(tempDomains);
-        }
-
-    }
-
-    public static class AqlApiBuildDynamicFieldsDomains<T extends AqlBase> {
-
-        private List<AqlDomainEnum> domains = Lists.newArrayList();
-
-        public AqlApiBuildDynamicFieldsDomains(List<AqlDomainEnum> domains) {
-            this.domains.addAll(domains);
-        }
-
-        public AqlApiComparator<T> name() {
-            return new AqlApiComparator<>(AqlFieldEnum.buildName, domains);
-        }
-
-        public AqlApiComparator<T> number() {
-            return new AqlApiComparator<>(AqlFieldEnum.buildNumber, domains);
-        }
-
-        public AqlApiModuleDynamicFieldsDomains<T> module() {
-            ArrayList<AqlDomainEnum> tempDomains = Lists.newArrayList(domains);
-            tempDomains.add(AqlDomainEnum.modules);
-            return new AqlApiModuleDynamicFieldsDomains<>(tempDomains);
-        }
-
-        public AqlApiBuildPropertyDynamicFieldsDomains<T> property() {
-            ArrayList<AqlDomainEnum> tempDomains = Lists.newArrayList(domains);
-            tempDomains.add(AqlDomainEnum.buildProperties);
-            return new AqlApiBuildPropertyDynamicFieldsDomains<>(tempDomains);
-        }
-
-        public AqlApiBuildPromotionDynamicFieldsDomains<T> promotion() {
-            ArrayList<AqlDomainEnum> tempDomains = Lists.newArrayList(domains);
-            tempDomains.add(AqlDomainEnum.buildPromotions);
-            return new AqlApiBuildPromotionDynamicFieldsDomains<>(tempDomains);
-        }
-
-    }
-
-    public static class AqlApiArtifactDynamicFieldsDomains<T extends AqlBase> {
-        private ArrayList<AqlDomainEnum> domains = Lists.newArrayList();
-
-        public AqlApiArtifactDynamicFieldsDomains(ArrayList<AqlDomainEnum> domains) {
-            this.domains.addAll(domains);
-        }
-
-        public AqlApiComparator<T> name() {
-            return new AqlApiComparator<>(AqlFieldEnum.buildArtifactName, domains);
-        }
-
-        public AqlApiComparator<T> type() {
-            return new AqlApiComparator<>(AqlFieldEnum.buildArtifactType, domains);
-        }
-
-        public AqlApiComparator<T> sha1() {
-            return new AqlApiComparator<>(AqlFieldEnum.buildArtifactSha1, domains);
-        }
-
-        public AqlApiComparator<T> md5() {
-            return new AqlApiComparator<>(AqlFieldEnum.buildArtifactMd5, domains);
-        }
-
-        public AqlApiModuleDynamicFieldsDomains<T> module() {
-            ArrayList<AqlDomainEnum> tempDomains = Lists.newArrayList(domains);
-            tempDomains.add(AqlDomainEnum.modules);
-            return new AqlApiModuleDynamicFieldsDomains<>(tempDomains);
-        }
-
-        public AqlApiItemDynamicFieldsDomains<T> item() {
-            ArrayList<AqlDomainEnum> tempDomains = Lists.newArrayList(domains);
-            tempDomains.add(AqlDomainEnum.items);
-            return new AqlApiItemDynamicFieldsDomains<>(tempDomains);
-        }
-    }
-
-    public static class AqlApiDependencyDynamicFieldsDomains<T extends AqlBase> {
-
-        private ArrayList<AqlDomainEnum> domains = Lists.newArrayList();
-
-        public AqlApiDependencyDynamicFieldsDomains(ArrayList<AqlDomainEnum> domains) {
-            this.domains.addAll(domains);
-        }
-
-        public AqlApiComparator<T> name() {
-            return new AqlApiComparator<>(AqlFieldEnum.buildDependencyName, domains);
-        }
-
-        public AqlApiComparator<T> scope() {
-            return new AqlApiComparator<>(AqlFieldEnum.buildDependencyScope, domains);
-        }
-
-        public AqlApiComparator<T> type() {
-            return new AqlApiComparator<>(AqlFieldEnum.buildDependencyType, domains);
-        }
-
-        public AqlApiComparator<T> sha1() {
-            return new AqlApiComparator<>(AqlFieldEnum.buildDependencySha1, domains);
-        }
-
-        public AqlApiComparator<T> md5() {
-            return new AqlApiComparator<>(AqlFieldEnum.buildDependencyMd5, domains);
-        }
-
-        public AqlApiItemDynamicFieldsDomains<T> item() {
-            ArrayList<AqlDomainEnum> tempDomains = Lists.newArrayList(domains);
-            tempDomains.add(AqlDomainEnum.items);
-            return new AqlApiItemDynamicFieldsDomains<>(tempDomains);
-        }
-
-        public AqlApiModuleDynamicFieldsDomains<T> module() {
-            ArrayList<AqlDomainEnum> tempDomains = Lists.newArrayList(domains);
-            tempDomains.add(AqlDomainEnum.modules);
-            return new AqlApiModuleDynamicFieldsDomains<>(tempDomains);
-        }
-    }
-
-    public static class AqlApiModuleDynamicFieldsDomains<T extends AqlBase> {
-        private List<AqlDomainEnum> domains = Lists.newArrayList();
-
-        public AqlApiModuleDynamicFieldsDomains(List<AqlDomainEnum> domains) {
-            this.domains.addAll(domains);
-        }
-
-        public AqlApiComparator<T> name() {
-            return new AqlApiComparator<>(AqlFieldEnum.moduleName, domains);
-        }
-
-        public AqlApiBuildDynamicFieldsDomains<T> build() {
-            ArrayList<AqlDomainEnum> tempDomains = Lists.newArrayList(domains);
-            tempDomains.add(AqlDomainEnum.builds);
-            return new AqlApiBuildDynamicFieldsDomains<>(tempDomains);
-        }
-
-        public AqlApiArtifactDynamicFieldsDomains<T> artifact() {
-            ArrayList<AqlDomainEnum> tempDomains = Lists.newArrayList(domains);
-            tempDomains.add(AqlDomainEnum.artifacts);
-            return new AqlApiArtifactDynamicFieldsDomains<>(tempDomains);
-        }
-
-        public AqlApiDependencyDynamicFieldsDomains<T> dependecy() {
-            ArrayList<AqlDomainEnum> tempDomains = Lists.newArrayList(domains);
-            tempDomains.add(AqlDomainEnum.dependencies);
-            return new AqlApiDependencyDynamicFieldsDomains<>(tempDomains);
-        }
-    }
-
-    public static class AqlApiItemPropertyDynamicFieldsDomains<T extends AqlBase> {
-        private final List<AqlDomainEnum> domains = Lists.newArrayList();
-
-        public AqlApiItemPropertyDynamicFieldsDomains(ArrayList<AqlDomainEnum> domains) {
-            this.domains.addAll(domains);
-        }
-
-        public AqlBase.PropertyCriteriaClause<T> property(String key, AqlComparatorEnum comparator, String value) {
-            return new AqlBase.PropertyCriteriaClause<>(key, comparator, value, domains);
-        }
-
-        public AqlApiComparator<T> key() {
-            return new AqlApiComparator<>(AqlFieldEnum.propertyKey, domains);
-        }
-
-        public AqlApiComparator<T> value() {
-            return new AqlApiComparator<>(AqlFieldEnum.propertyValue, domains);
-        }
-
-        public AqlApiItemDynamicFieldsDomains<T> item() {
-            ArrayList<AqlDomainEnum> tempDomains = Lists.newArrayList(domains);
-            tempDomains.add(AqlDomainEnum.items);
-            return new AqlApiItemDynamicFieldsDomains<>(tempDomains);
-        }
-    }
-
-    public static class AqlApiBuildPropertyDynamicFieldsDomains<T extends AqlBase> {
-        private final List<AqlDomainEnum> domains = Lists.newArrayList();
-
-        public AqlApiBuildPropertyDynamicFieldsDomains(List<AqlDomainEnum> domains) {
-            this.domains.addAll(domains);
-        }
-
-        public AqlApiComparator<T> key() {
-            return new AqlApiComparator<>(AqlFieldEnum.buildPropertyKey, domains);
-        }
-
-        public AqlApiComparator<T> value() {
-            return new AqlApiComparator<>(AqlFieldEnum.buildPropertyValue, domains);
-        }
-
-        public AqlApiBuildDynamicFieldsDomains<T> build() {
-            ArrayList<AqlDomainEnum> tempDomains = Lists.newArrayList(domains);
-            tempDomains.add(AqlDomainEnum.builds);
-            return new AqlApiBuildDynamicFieldsDomains<>(tempDomains);
-        }
-    }
-
-    public static class AqlApiBuildPromotionDynamicFieldsDomains<T extends AqlBase> {
-        private final List<AqlDomainEnum> domains = Lists.newArrayList();
-
-        public AqlApiBuildPromotionDynamicFieldsDomains(List<AqlDomainEnum> domains) {
-            this.domains.addAll(domains);
-        }
-
-        public AqlApiComparator<T> created() {
-            return new AqlApiComparator<>(AqlFieldEnum.buildPromotionCreated, domains);
-        }
-
-        public AqlApiComparator<T> createdBy() {
-            return new AqlApiComparator<>(AqlFieldEnum.buildPromotionCreatedBy, domains);
-        }
-
-        public AqlApiComparator<T> userName() {
-            return new AqlApiComparator<>(AqlFieldEnum.buildPromotionUserName, domains);
-        }
-
-        public AqlApiComparator<T> comment() {
-            return new AqlApiComparator<>(AqlFieldEnum.buildPromotionComment, domains);
-        }
-
-        public AqlApiComparator<T> repo() {
-            return new AqlApiComparator<>(AqlFieldEnum.buildPromotionRepo, domains);
-        }
-
-        public AqlApiComparator<T> status() {
-            return new AqlApiComparator<>(AqlFieldEnum.buildPromotionStatus, domains);
-        }
-
-        public AqlApiBuildDynamicFieldsDomains<T> build() {
-            ArrayList<AqlDomainEnum> tempDomains = Lists.newArrayList(domains);
-            tempDomains.add(AqlDomainEnum.builds);
-            return new AqlApiBuildDynamicFieldsDomains<>(tempDomains);
-        }
-    }
-
-    public static class AqlApiStatisticDynamicFieldsDomains<T extends AqlBase> {
-        private final List<AqlDomainEnum> domains = Lists.newArrayList();
-
-        public AqlApiStatisticDynamicFieldsDomains(ArrayList<AqlDomainEnum> domains) {
-            this.domains.addAll(domains);
-        }
-
-        public AqlApiComparator<T> downloads() {
-            return new AqlApiComparator<>(AqlFieldEnum.statDownloads, domains);
-        }
-
-        public AqlApiItemDynamicFieldsDomains<T> item() {
-            ArrayList<AqlDomainEnum> tempDomains = Lists.newArrayList(domains);
-            tempDomains.add(AqlDomainEnum.items);
-            return new AqlApiItemDynamicFieldsDomains<>(tempDomains);
-        }
-    }
-
-    public static class AqlApiComparator<T extends AqlBase> {
-        protected final List<AqlDomainEnum> domains = Lists.newArrayList();
-        protected AqlFieldEnum fieldEnum;
-
-        public AqlApiComparator(AqlFieldEnum fieldEnum, List<AqlDomainEnum> domains) {
-            this.fieldEnum = fieldEnum;
-            this.domains.addAll(domains);
-        }
-
-        public AqlBase.CriteriaClause<T> matches(int value) {
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.matches, "" + value);
-        }
-
-        public AqlBase.CriteriaClause<T> matches(long value) {
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.matches, "" + value);
-        }
-
-        public AqlBase.CriteriaClause<T> matches(DateTime value) {
-            String dateString = convertDateToString(value);
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.matches, dateString);
-        }
-
-        public AqlBase.CriteriaClause<T> matches(String value) {
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.matches, value);
-        }
-
-        public AqlBase.CriteriaClause<T> notMatches(int value) {
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.notMatches, "" + value);
-        }
-
-        public AqlBase.CriteriaClause<T> notMatches(long value) {
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.notMatches, "" + value);
-        }
-
-        public AqlBase.CriteriaClause<T> notMatches(DateTime value) {
-            String dateString = convertDateToString(value);
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.notMatches, dateString);
-        }
-
-        public AqlBase.CriteriaClause<T> notMatches(String value) {
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.notMatches, value);
-        }
-
-
-        public AqlBase.CriteriaClause<T> equals(int value) {
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.equals, "" + value);
-        }
-
-        public AqlBase.CriteriaClause<T> equals(long value) {
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.equals, "" + value);
-        }
-
-        public AqlBase.CriteriaClause<T> equals(DateTime value) {
-            String dateString = convertDateToString(value);
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.equals, dateString);
-        }
-
-        public AqlBase.CriteriaClause<T> equal(String value) {
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.equals, value);
-        }
-
-
-        public AqlBase.CriteriaClause<T> notEquals(int value) {
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.notEquals, "" + value);
-        }
-
-        public AqlBase.CriteriaClause<T> notEquals(long value) {
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.notEquals, "" + value);
-        }
-
-        public AqlBase.CriteriaClause<T> notEquals(DateTime value) {
-            String dateString = convertDateToString(value);
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.notEquals, dateString);
-        }
-
-        public AqlBase.CriteriaClause<T> notEquals(String value) {
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.notEquals, value);
-        }
-
-
-        public AqlBase.CriteriaClause<T> greater(int value) {
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.greater, "" + value);
-        }
-
-        public AqlBase.CriteriaClause<T> greater(long value) {
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.greater, "" + value);
-        }
-
-        public AqlBase.CriteriaClause<T> greater(DateTime value) {
-            String dateString = convertDateToString(value);
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.greater, dateString);
-        }
-
-        public AqlBase.CriteriaClause<T> greater(String value) {
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.greater, value);
-        }
-
-
-        public AqlBase.CriteriaClause<T> greaterEquals(int value) {
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.greaterEquals, "" + value);
-        }
-
-        public AqlBase.CriteriaClause<T> greaterEquals(long value) {
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.greaterEquals, "" + value);
-        }
-
-        public AqlBase.CriteriaClause<T> greaterEquals(DateTime value) {
-            String dateString = convertDateToString(value);
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.greaterEquals, dateString);
-        }
-
-        public AqlBase.CriteriaClause<T> greaterEquals(String value) {
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.greaterEquals, value);
-        }
-
-
-        public AqlBase.CriteriaClause<T> less(int value) {
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.less, "" + value);
-        }
-
-        public AqlBase.CriteriaClause<T> less(long value) {
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.less, "" + value);
-        }
-
-        public AqlBase.CriteriaClause<T> less(DateTime value) {
-            String dateString = convertDateToString(value);
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.less, dateString);
-        }
-
-        public AqlBase.CriteriaClause<T> less(String value) {
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.less, value);
-        }
-
-        public AqlBase.CriteriaClause<T> lessEquals(int value) {
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.lessEquals, "" + value);
-        }
-
-        public AqlBase.CriteriaClause<T> lessEquals(long value) {
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.lessEquals, "" + value);
-        }
-
-        public AqlBase.CriteriaClause<T> lessEquals(DateTime value) {
-            String dateString = convertDateToString(value);
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.lessEquals, dateString);
-        }
-
-        public AqlBase.CriteriaClause<T> lessEquals(String value) {
-            return new AqlBase.CriteriaClause<>(fieldEnum, domains, AqlComparatorEnum.lessEquals, value);
-        }
-
-        private static String convertDateToString(DateTime date) {
-            return ISODateTimeFormat.dateTime().print(date);
-        }
-
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/api/internal/AqlBase.java b/base/api/src/main/java/org/artifactory/aql/api/internal/AqlBase.java
deleted file mode 100644
index e36e431..0000000
--- a/base/api/src/main/java/org/artifactory/aql/api/internal/AqlBase.java
+++ /dev/null
@@ -1,681 +0,0 @@
-package org.artifactory.aql.api.internal;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.AqlException;
-import org.artifactory.aql.api.AqlApiElement;
-import org.artifactory.aql.model.AqlComparatorEnum;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.model.AqlOperatorEnum;
-import org.artifactory.aql.model.AqlSortTypeEnum;
-import org.artifactory.aql.model.AqlVariableTypeEnum;
-import org.artifactory.aql.model.DomainSensitiveField;
-import org.artifactory.aql.result.rows.AqlRowResult;
-import org.artifactory.aql.result.rows.QueryTypes;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlBase<T extends AqlBase, Y extends AqlRowResult> implements AqlApiElement {
-
-    protected SortApiElement sortApiElement = new SortApiElement();
-    protected LimitApiElement limit = new LimitApiElement();
-    protected OffsetApiElement offset = new OffsetApiElement();
-    protected FilterApiElement filter = new FilterApiElement();
-    protected DomainApiElement domain = new DomainApiElement();
-    protected IncludeApiElement include = new IncludeApiElement();
-
-
-    public AqlBase(Class<? extends AqlRowResult> domainClass) {
-        QueryTypes annotation = domainClass.getAnnotation(QueryTypes.class);
-        AqlDomainEnum domain = annotation.value();
-        AqlFieldEnum[] resultField = annotation.fields();
-        this.domain.setDomain(domain);
-        for (AqlFieldEnum field : domain.fields) {
-            this.include.getResultFields().add(new DomainSensitiveField(field, Lists.newArrayList(domain)));
-        }
-        for (AqlFieldEnum field : resultField) {
-            this.include.getResultFields().add(new DomainSensitiveField(field, Lists.newArrayList(domain)));
-        }
-    }
-
-    @SafeVarargs
-    public static <T extends AqlBase> AndClause<T> and(AqlApiElement<T>... elements) {
-        return new AndClause(elements);
-    }
-
-    @SafeVarargs
-    public static <T extends AqlBase> PropertyResultFilterClause<T> propertyResultFilter(AqlApiElement<T>... elements) {
-        return new PropertyResultFilterClause(elements);
-    }
-
-    @SafeVarargs
-    public static <T extends AqlBase> OrClause<T> or(AqlApiElement<T>... elements) {
-        return new OrClause(elements);
-    }
-
-    @SafeVarargs
-    public static <T extends AqlBase> FreezeJoin<T> freezeJoin(AqlApiElement<T>... elements) {
-        return new FreezeJoin(elements);
-    }
-
-    public T filter(AqlApiElement<T> filter) {
-        this.filter.setFilter(filter);
-        return (T) this;
-    }
-
-    @Override
-    public List<AqlApiElement> get() {
-        ArrayList<AqlApiElement> elements = Lists.newArrayList();
-        elements.add(domain);
-        elements.add(sortApiElement);
-        elements.add(filter);
-        elements.add(limit);
-        elements.add(offset);
-        elements.add(include);
-        return elements;
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return false;
-    }
-
-    @Override
-    public String toNative(int dept) {
-        if(domain==null){
-            throw new AqlException("Missing primary domain in query");
-        }else{
-            String ident= getIdent(dept+1);
-            StringBuilder builder = new StringBuilder();
-            builder.append(domain.toNative(dept)).append("find(\n");
-            String identPlus= getIdent(dept+2);
-            if(filter != null && ! filter.isEmpty()){
-                builder.append(ident).append("{\n");
-                builder.append(identPlus).append(filter.toNative(dept + 2)).append("\n");
-                builder.append(ident).append("}\n");
-            }
-            builder.append(")");
-            if(include != null && ! include.isEmpty()){
-                builder.append(".\n").append(include.toNative(dept));
-            }
-            if(sortApiElement != null && ! sortApiElement.isEmpty()){
-                builder.append(".\n").append(sortApiElement.toNative(dept+1));
-            }
-            if(offset != null && ! offset.isEmpty()){
-                builder.append(".\n").append(offset.toNative(dept+1));
-            }
-            if(limit != null && ! limit.isEmpty()){
-                builder.append(".\n").append(limit.toNative(dept+1));
-            }
-            return builder.toString();
-        }
-    }
-
-    public T asc() {
-        this.sortApiElement.setSortType(AqlSortTypeEnum.asc);
-        return (T) this;
-    }
-
-    public T desc() {
-        this.sortApiElement.setSortType(AqlSortTypeEnum.desc);
-        return (T) this;
-    }
-
-    public T addSortElement(AqlApiDynamicFieldsDomains.AqlApiComparator<T> fields) {
-        this.sortApiElement.addSortElement(fields);
-        return (T) this;
-    }
-
-    public T limit(int limit) {
-        this.limit.setLimit(limit);
-        return (T) this;
-    }
-
-    public T offset(int offset) {
-        this.offset.setOffset(offset);
-        return (T) this;
-    }
-
-    public T include(AqlApiDynamicFieldsDomains.AqlApiComparator... comparator) {
-        for (AqlApiDynamicFieldsDomains.AqlApiComparator aqlApiComparator : comparator) {
-            include.getIncludeFields().add(new DomainSensitiveField(aqlApiComparator.fieldEnum, aqlApiComparator.domains));
-        }
-
-        return (T) this;
-    }
-
-    public static class FilterApiElement implements AqlApiElement {
-
-
-        private AqlApiElement filter;
-
-        @Override
-        public List<AqlApiElement> get() {
-            return Lists.newArrayList(filter);
-        }
-
-
-        @Override
-        public boolean isEmpty() {
-            return filter == null  || filter.isEmpty();
-        }
-
-        public AqlApiElement getFilter() {
-            return filter;
-        }
-
-        public void setFilter(AqlApiElement filter) {
-            this.filter = filter;
-        }
-
-        @Override
-        public String toNative(int dept) {
-            if(filter==null){
-                return "";
-            }else {
-                return filter.toNative(dept);
-            }
-        }
-
-    }
-    public static class DomainApiElement implements AqlApiElement {
-
-        private AqlDomainEnum domain;
-        @Override
-        public List<AqlApiElement> get() {
-            return Lists.newArrayList();
-        }
-
-        public AqlDomainEnum getDomain() {
-            return domain;
-        }
-
-        public void setDomain(AqlDomainEnum domain) {
-            this.domain = domain;
-        }
-
-        @Override
-        public boolean isEmpty() {
-            return false;
-        }
-
-        @Override
-        public String toNative(int dept) {
-            StringBuilder builder=new StringBuilder();
-            for (String subDomain : domain.subDomains) {
-                builder.append(subDomain).append(".");
-            }
-            return builder.toString();
-        }
-
-    }
-    public static class IncludeApiElement implements AqlApiElement {
-
-        private List<DomainSensitiveField> includeFields = Lists.newArrayList();
-        private List<DomainSensitiveField> resultFields = Lists.newArrayList();
-        public List<DomainSensitiveField> getIncludeFields() {
-            return includeFields;
-        }
-
-        public List<DomainSensitiveField> getResultFields() {
-            return resultFields;
-        }
-
-        @Override
-        public List<AqlApiElement> get() {
-            return Lists.newArrayList();
-        }
-
-        @Override
-        public boolean isEmpty() {
-            return includeFields.size()<=0;
-        }
-
-        @Override
-        public String toNative(int dept) {
-            StringBuilder builder=new StringBuilder();
-            builder.append("include(");
-            Set<DomainSensitiveField> set=new HashSet<>();
-            set.addAll(includeFields);
-            set.addAll(resultFields);
-            ArrayList<DomainSensitiveField> allResultFields = Lists.newArrayList(set);
-            for (int i = 0; i < allResultFields.size(); i++) {
-                DomainSensitiveField field = allResultFields.get(i);
-                builder.append("\"").append(getPath(field.getSubDomains())).append(field.getField().signature).append("\"");
-                if(i< allResultFields.size()-1) {
-                    builder.append(",");
-                }
-            }
-            builder.append(")");
-            return builder.toString();
-        }
-
-    }
-    public static class LimitApiElement implements AqlApiElement {
-
-        private long limit = Long.MAX_VALUE;
-        public long getLimit() {
-            return limit;
-        }
-
-        public void setLimit(int limit) {
-            this.limit = limit;
-        }
-
-        @Override
-        public List<AqlApiElement> get() {
-            return Lists.newArrayList();
-        }
-
-        @Override
-        public boolean isEmpty() {
-            return limit < 0 || limit >= Long.MAX_VALUE;
-        }
-
-        @Override
-        public String toNative(int dept) {
-            StringBuilder builder=new StringBuilder();
-            builder.append("limit(");
-            builder.append(""+limit);
-            builder.append(")");
-            return builder.toString();
-        }
-
-    }
-    public static class OffsetApiElement implements AqlApiElement {
-
-        private long offset = 0;
-        public long getOffset() {
-            return offset;
-        }
-
-        public void setOffset(int offset) {
-            this.offset = offset;
-        }
-
-        @Override
-        public List<AqlApiElement> get() {
-            return Lists.newArrayList();
-        }
-
-        @Override
-        public boolean isEmpty() {
-            return offset <= 0 || offset >= Long.MAX_VALUE;
-        }
-
-        @Override
-        public String toNative(int dept) {
-            StringBuilder builder=new StringBuilder();
-            builder.append("offset(");
-            builder.append("" + offset);
-            builder.append(")");
-            return builder.toString();
-        }
-
-    }
-    public static class SortApiElement implements AqlApiElement {
-
-        private AqlSortTypeEnum sortType = AqlSortTypeEnum.desc;
-        private List<DomainSensitiveField> fields=new ArrayList<>();
-        public AqlSortTypeEnum getSortType() {
-            return sortType;
-        }
-
-        public void setSortType(AqlSortTypeEnum sortType) {
-            this.sortType = sortType;
-        }
-
-        public List<DomainSensitiveField> getFields() {
-            return fields;
-        }
-
-        public void addSortElement(AqlApiDynamicFieldsDomains.AqlApiComparator field) {
-            this.fields.add(new DomainSensitiveField(field.fieldEnum,field.domains));
-        }
-
-        @Override
-        public List<AqlApiElement> get() {
-            return Lists.newArrayList();
-        }
-
-        @Override
-        public boolean isEmpty() {
-            return sortType == null || fields == null || fields.size() == 0;
-        }
-
-        @Override
-        public String toNative(int dept) {
-            StringBuilder builder=new StringBuilder();
-            builder.append("sort({");
-            builder.append("\"").append(sortType.getAqlName()).append("\"");
-            builder.append(":[");
-            for (int i = 0; i < fields.size(); i++) {
-                DomainSensitiveField field=fields.get(i);
-                builder.append("\"").append(getPath(field.getSubDomains())).
-                        append(field.getField().signature).append("\"");
-                if(i<fields.size()-1) {
-                    builder.append(",");
-                }
-            }
-            builder.append("]");
-            builder.append("})");
-            return builder.toString();
-        }
-
-    }
-    public static class AndClause<T extends AqlBase> implements AqlApiElement<T> {
-
-        private final ArrayList<AqlApiElement<T>> andElements;
-
-        public AndClause(AqlApiElement<T>[] elements) {
-            this.andElements = Lists.newArrayList(elements);
-        }
-
-        @Override
-        public List<AqlApiElement<T>> get() {
-            return andElements;
-        }
-
-        @Override
-        public boolean isEmpty() {
-            return andElements.isEmpty();
-        }
-
-        public void append(AqlApiElement<T> aqlApiElement) {
-            andElements.add(aqlApiElement);
-        }
-
-        @Override
-        public String toNative(int dept) {
-            String ident = getIdent(dept);
-            StringBuilder builder=new StringBuilder();
-            builder.append("\"").append(AqlOperatorEnum.and.signature).append("\"").append(":[\n");
-            String identPlus = getIdent(dept+1);
-            for (int i = 0; i < andElements.size(); i++) {
-                AqlApiElement<T> element = andElements.get(i);
-                builder.append(identPlus).append("{").append(element.toNative(dept+1)).append("}");
-                if(i<andElements.size()-1) {
-                    builder.append(",");
-                }
-                builder.append("\n");
-            }
-            builder.append(ident).append("]");
-            return builder.toString();
-        }
-
-    }
-    public static class OrClause<T extends AqlBase> implements AqlApiElement<T> {
-
-        private final ArrayList<AqlApiElement<T>> orElements;
-
-        public OrClause(AqlApiElement<T>[] elements) {
-            this.orElements = Lists.newArrayList(elements);
-        }
-
-        @Override
-        public List<AqlApiElement<T>> get() {
-            return orElements;
-        }
-
-        @Override
-        public boolean isEmpty() {
-            return orElements.isEmpty();
-        }
-
-        public void append(AqlApiElement aqlApiElement) {
-            orElements.add(aqlApiElement);
-        }
-
-        @Override
-        public String toNative(int dept) {
-            String ident = getIdent(dept);
-            StringBuilder builder=new StringBuilder();
-            builder.append("\"").append(AqlOperatorEnum.or.signature).append("\"").append(":[\n");
-            String identPlus = getIdent(dept+1);
-            for (int i = 0; i < orElements.size(); i++) {
-                AqlApiElement<T> element = orElements.get(i);
-                builder.append(identPlus).append("{").append(element.toNative(dept+1)).append("}");
-                if(i<orElements.size()-1) {
-                    builder.append(",");
-                }
-                builder.append("\n");
-            }
-            builder.append(ident).append("]");
-            return builder.toString();
-        }
-
-    }
-    public static class PropertyResultFilterClause<T extends AqlBase> implements AqlApiElement<T> {
-
-        private final ArrayList<AqlApiElement<T>> elements;
-
-        public PropertyResultFilterClause(AqlApiElement<T>[] elements) {
-            this.elements = Lists.newArrayList(elements);
-        }
-
-        @Override
-        public List<AqlApiElement<T>> get() {
-            return elements;
-        }
-
-        @Override
-        public boolean isEmpty() {
-            return elements.isEmpty();
-        }
-
-        public void append(AqlApiElement<T> aqlApiElement) {
-            elements.add(aqlApiElement);
-        }
-
-        @Override
-        public String toNative(int dept) {
-            String ident = getIdent(dept);
-            StringBuilder builder=new StringBuilder();
-            builder.append("\"").append(AqlOperatorEnum.resultFilter.signature).append("\"").append(
-                    ":[\n");
-            String identPlus = getIdent(dept+1);
-            for (int i = 0; i < elements.size(); i++) {
-                AqlApiElement<T> element = elements.get(i);
-                builder.append(identPlus).append("{").append(element.toNative(dept+1)).append("}");
-                if(i<elements.size()-1) {
-                    builder.append(",");
-                }
-                builder.append("\n");
-            }
-            builder.append(ident).append("]");
-            return builder.toString();
-        }
-
-    }
-    public static class FreezeJoin<T extends AqlBase> implements AqlApiElement<T> {
-
-        private final ArrayList<AqlApiElement<T>> elements;
-
-        public FreezeJoin(AqlApiElement<T>[] elements) {
-            this.elements = Lists.newArrayList(elements);
-        }
-
-        @Override
-        public List<AqlApiElement<T>> get() {
-            return elements;
-        }
-
-        @Override
-        public boolean isEmpty() {
-            return elements.isEmpty();
-        }
-
-        @Override
-        public String toNative(int dept) {
-            String ident = getIdent(dept);
-            StringBuilder builder=new StringBuilder();
-            builder.append("\"").append(AqlOperatorEnum.freezeJoin.signature).append("\"").append(":[\n");
-            String identPlus = getIdent(dept+1);
-            for (int i = 0; i < elements.size(); i++) {
-                AqlApiElement<T> element = elements.get(i);
-                builder.append(identPlus).append("{").append(element.toNative(dept+1)).append("}");
-                if(i<elements.size()-1) {
-                    builder.append(",");
-                }
-                builder.append("\n");
-            }
-            builder.append(ident).append("]");
-            return builder.toString();
-        }
-
-    }
-    public static class CriteriaClause<T extends AqlBase> implements AqlApiElement<T> {
-
-        private AqlFieldEnum fieldEnum;
-        private List<AqlDomainEnum> subDomains;
-        private AqlComparatorEnum comparator;
-        private String value;
-        public CriteriaClause(AqlFieldEnum fieldEnum, List<AqlDomainEnum> subDomains, AqlComparatorEnum comparator,
-                String value) {
-            this.fieldEnum = fieldEnum;
-            this.subDomains = subDomains;
-            this.comparator = comparator;
-            this.value = value;
-        }
-
-        public List<AqlDomainEnum> getSubDomains() {
-            return subDomains;
-        }
-
-        public AqlFieldEnum getFieldEnum() {
-            return fieldEnum;
-        }
-
-        public AqlComparatorEnum getComparator() {
-            return comparator;
-        }
-
-        public String getValue() {
-            return value;
-        }
-
-        @Override
-        public List<AqlApiElement<T>> get() {
-            return Lists.newArrayList();
-        }
-
-        @Override
-        public boolean isEmpty() {
-            return fieldEnum == null || comparator == null;
-        }
-
-        @Override
-        public String toNative(int dept) {
-            StringBuilder builder=new StringBuilder();
-            builder.append("\"").append(getPath(subDomains)).append(fieldEnum.signature).append("\"");
-            builder.append(":{");
-            builder.append("\"").append(comparator.signature).append("\"");
-            builder.append(":");
-            if(value==null) {
-                builder.append("null");
-            }else if(AqlVariableTypeEnum.longInt==fieldEnum.type || AqlVariableTypeEnum.integer==fieldEnum.type) {
-                builder.append(value);
-            }else {
-                builder.append("\"").append(value).append("\"");
-            }
-            builder.append("}");
-            return builder.toString();
-        }
-
-    }
-    public static class PropertyCriteriaClause<T extends AqlBase> implements AqlApiElement<T> {
-
-
-        private String string1;
-        private AqlComparatorEnum comparator;
-        private String string2;
-        private List<AqlDomainEnum> subDomains;
-        public PropertyCriteriaClause(String key, AqlComparatorEnum comparator, String value,
-                List<AqlDomainEnum> subDomains) {
-            this.string1 = key;
-            this.comparator = comparator;
-            this.string2 = value;
-            this.subDomains = subDomains;
-        }
-
-        public List<AqlDomainEnum> getSubDomains() {
-            return subDomains;
-        }
-
-        public String getString1() {
-            return string1;
-        }
-
-        public AqlComparatorEnum getComparator() {
-            return comparator;
-        }
-
-        public String getString2() {
-            return string2;
-        }
-
-        @Override
-        public List<AqlApiElement<T>> get() {
-            return Lists.newArrayList();
-        }
-
-        @Override
-        public boolean isEmpty() {
-            return string1 != null && string2 != null && comparator != null;
-        }
-
-        @Override
-        public String toNative(int dept) {
-            StringBuilder builder=new StringBuilder();
-            builder.append("\"").append(getProprtySensitivePath(subDomains)).append(string1).append("\"");
-            builder.append(":{");
-            builder.append("\"").append(comparator.signature).append("\"");
-            builder.append(":");
-            if(string2==null){
-                builder.append("null");
-            }else {
-                builder.append("\"").append(string2).append("\"");
-            }
-            builder.append("}");
-            return builder.toString();
-        }
-
-    }
-
-
-    private static String getPath(List<AqlDomainEnum> subDomains) {
-        StringBuilder builder=new StringBuilder();
-        for (int i = 1; i < subDomains.size(); i++) {
-            AqlDomainEnum domainEnum = subDomains.get(i);
-            builder.append(domainEnum.signatue).append(".");
-        }
-        return builder.toString();
-    }
-
-    private static String getProprtySensitivePath(List<AqlDomainEnum> subDomains) {
-        StringBuilder builder=new StringBuilder();
-        for (int i = 1; i < subDomains.size(); i++) {
-            AqlDomainEnum domainEnum = subDomains.get(i);
-            if ("property".equals(domainEnum.signatue)) {
-                builder.append("@");
-            } else {
-                builder.append(domainEnum.signatue).append(".");
-            }
-        }
-        return builder.toString();
-    }
-
-    private static String getIdent(int dept) {
-        String result="";
-        for (int i = 0; i < dept; i++) {
-             result+="  ";
-        }
-        return result;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/model/AqlComparatorEnum.java b/base/api/src/main/java/org/artifactory/aql/model/AqlComparatorEnum.java
deleted file mode 100644
index f834f6b..0000000
--- a/base/api/src/main/java/org/artifactory/aql/model/AqlComparatorEnum.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.artifactory.aql.model;
-
-/**
- * @author Gidi Shabat
- */
-public enum AqlComparatorEnum {
-    notEquals("$ne"),
-    equals("$eq"),
-    greaterEquals("$gte"),
-    greater("$gt"),
-    matches("$match"),
-    notMatches("$nmatch"),
-    lessEquals("$lte"),
-    less("$lt");
-
-
-    public String signature;
-
-
-    AqlComparatorEnum(String signature) {
-        this.signature = signature;
-    }
-
-    public static AqlComparatorEnum value(String comparator) {
-        comparator = comparator.toLowerCase();
-        for (AqlComparatorEnum comparatorEnum : values()) {
-            if (comparatorEnum.signature.equals(comparator)) {
-                return comparatorEnum;
-            }
-        }
-        return null;
-    }
-
-    public boolean isNegative() {
-        return this == notMatches || this == notEquals;
-
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/model/AqlDomainEnum.java b/base/api/src/main/java/org/artifactory/aql/model/AqlDomainEnum.java
deleted file mode 100644
index ce18bcf..0000000
--- a/base/api/src/main/java/org/artifactory/aql/model/AqlDomainEnum.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.artifactory.aql.model;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-
-import static org.artifactory.aql.model.AqlFieldEnum.*;
-
-/**
- * @author Gidi Shabat
- */
-public enum AqlDomainEnum {
-
-
-    items("item", new String[]{"items"}, itemRepo, itemPath, itemName, itemType, itemSize, itemCreated, itemCreatedBy,
-            itemModified, itemModifiedBy, itemUpdated),
-    properties("property", new String[]{"properties"}, propertyKey, propertyValue),
-    statistics("stat", new String[]{"stats"}, statDownloads, statDownloaded,
-            statDownloadedBy),
-    archives("archive", new String[]{"archives"}),
-    entries("entry", new String[]{"archive","entries"}, archiveEntryPath, archiveEntryName),
-    builds("build", new String[]{"builds"}, buildNumber, buildName, buildUrl, buildCreated, buildCreatedBy,
-            buildModified, buildModifiedBy),
-    artifacts("artifact", new String[]{"artifacts"}, buildArtifactName, buildArtifactType),
-    dependencies("dependency", new String[]{"dependencies"}, buildDependencyName,
-            buildDependencyType,
-            buildDependencyScope),
-    modules("module", new String[]{"modules"}, moduleName),
-    buildProperties("property", new String[]{"build", "properties"}, buildPropertyKey, buildPropertyValue),
-    buildPromotions("promotion", new String[]{"build", "promotions"}, buildPromotionCreated, buildPromotionCreatedBy,
-            buildPromotionStatus,buildPromotionRepo,buildPromotionComment,buildPromotionUserName),
-    moduleProperties("property", new String[]{ "module","properties"}, modulePropertyKey,
-            modulePropertyValue);
-
-
-    public String signatue;
-    public String[] subDomains;
-    public AqlFieldEnum[] fields;
-
-    AqlDomainEnum(String signature, String[] subDomains, AqlFieldEnum... fields) {
-        this.signatue = signature;
-        this.subDomains = subDomains;
-        this.fields = fields;
-    }
-
-    public static AqlDomainEnum valueFromSubDomains(ArrayList<String> subDomains) {
-        String[] externalSubDomain = subDomains.toArray(new String[subDomains.size()]);
-        for (AqlDomainEnum aqlDomainEnum : values()) {
-            if (Arrays.equals(aqlDomainEnum.subDomains, externalSubDomain)) {
-                return aqlDomainEnum;
-            }
-        }
-        return null;
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/aql/model/AqlField.java b/base/api/src/main/java/org/artifactory/aql/model/AqlField.java
deleted file mode 100644
index b7509f5..0000000
--- a/base/api/src/main/java/org/artifactory/aql/model/AqlField.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.artifactory.aql.model;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlField implements AqlVariable {
-    private AqlFieldEnum fieldEnum;
-
-    public AqlField(AqlFieldEnum fieldEnum) {
-        this.fieldEnum = fieldEnum;
-    }
-
-    public AqlFieldEnum getFieldEnum() {
-        return fieldEnum;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/model/AqlFieldEnum.java b/base/api/src/main/java/org/artifactory/aql/model/AqlFieldEnum.java
deleted file mode 100644
index 52a37ae..0000000
--- a/base/api/src/main/java/org/artifactory/aql/model/AqlFieldEnum.java
+++ /dev/null
@@ -1,213 +0,0 @@
-package org.artifactory.aql.model;
-
-import static org.artifactory.aql.model.AqlVariableTypeEnum.*;
-
-/**
- * @author Gidi Shabat
- *
- * This class contains all the Fields (domain, native name and type) supported by AQL
- * In order to add new Field to AQL, just add new field to this class and update acordinatlly the AqlFieldExtensionEnum class
- */
-public enum AqlFieldEnum {
-    // node
-    itemRepo("repo", "items", string),
-    itemPath("path", "items", string),
-    itemName("name", "items", string),
-    itemCreated("created", "items", date),
-    itemModified("modified", "items", date),
-    itemUpdated("updated", "items", date),
-    itemCreatedBy("created_by", "items", string),
-    itemModifiedBy("modified_by", "items", string),
-    itemType("type", "items", AqlVariableTypeEnum.itemType),
-    itemDepth("depth", "items", integer),
-    itemId("id", "items", longInt),
-    itemOriginalMd5("original_md5", "items", string),
-    itemActualMd5("actual_md5", "items", string),
-    itemOriginalSha1("original_sha1", "items", string),
-    itemActualSha1("actual_sha1", "items", string),
-    itemSize("size", "items", longInt),
-    // stats
-    statDownloaded("downloaded", "statistics", date),
-    statDownloads("downloads", "statistics", integer),
-    statDownloadedBy("downloaded_by", "statistics", string),
-    statId("id", "statistics", longInt),
-    // properties
-    propertyKey("key", "properties", string),
-    propertyValue("value", "properties", string),
-    propertyId("id", "properties", longInt),
-    // archive entries
-    archiveEntryName("name", "entries", string),
-    archiveEntryPath("path", "entries", string),
-    archiveEntryPathId("path_id", "entries", longInt),
-    archiveEntryNameId("name_id", "entries", longInt),
-    // builds
-    moduleName("name", "modules", string),
-    moduleId("id","modules",longInt),
-    buildDependencyName("name", "dependencies", string),
-    buildDependencyScope("scope", "dependencies", string),
-    buildDependencyType("type", "dependencies", string),
-    buildDependencySha1("sha1", "dependencies", string),
-    buildDependencyMd5("md5", "dependencies", string),
-    buildDependencyId("id", "dependencies", longInt),
-    buildArtifactName("name", "artifacts", string),
-    buildArtifactType("type", "artifacts", string),
-    buildArtifactSha1("sha1", "artifacts", string),
-    buildArtifactMd5("md5", "artifacts", string),
-    buildArtifactId("id", "artifacts", longInt),
-    buildPropertyKey("key", "buildProperties", string),
-    buildPropertyValue("value", "buildProperties", string),
-    buildPropertyId("id", "buildProperties", longInt),
-    buildPromotionCreated("created","buildPromotions",date),
-    buildPromotionCreatedBy("created_by","buildPromotions",string),
-    buildPromotionStatus("status","buildPromotions",string),
-    buildPromotionRepo("repo","buildPromotions",string),
-    buildPromotionComment("comment","buildPromotions",string),
-    buildPromotionUserName("user","buildPromotions",string),
-    modulePropertyKey("key", "moduleProperties", string),
-    modulePropertyValue("value", "moduleProperties", string),
-    modulePropertyId("id", "moduleProperties", longInt),
-    buildUrl("url", "builds", string),
-    buildName("name", "builds", string),
-    buildNumber("number", "builds", string),
-    buildCreated("created", "builds", date),
-    buildCreatedBy("created_by", "builds", string),
-    buildModified("modified", "builds", date),
-    buildModifiedBy("modified_by", "builds", string),
-    buildId("id","builds",longInt);
-    public String signature;
-    public String domainName;
-    public AqlVariableTypeEnum type;
-
-    AqlFieldEnum(String signature, String domainName, AqlVariableTypeEnum type) {
-        this.signature = signature;
-        this.domainName = domainName;
-        this.type = type;
-    }
-
-    public static AqlFieldEnum value(String signature) {
-        signature = signature.toLowerCase();
-        for (AqlFieldEnum field : values()) {
-            if (field.signature.equals(signature)) {
-                return field;
-            }
-        }
-        return null;
-    }
-
-    public static AqlFieldEnum[] getFieldByDomain(AqlDomainEnum domain) {
-        switch (domain) {
-            case items:
-                return new AqlFieldEnum[]{
-                        itemRepo,
-                        itemPath,
-                        itemName,
-                        itemCreated,
-                        itemModified,
-                        itemUpdated,
-                        itemCreatedBy,
-                        itemModifiedBy,
-                        itemType,
-                        itemDepth,
-                        itemId,
-                        itemOriginalMd5,
-                        itemActualMd5,
-                        itemOriginalSha1,
-                        itemActualSha1,
-                        itemSize
-                };
-            case statistics:
-                return new AqlFieldEnum[]{
-                        statDownloaded,
-                        statDownloads,
-                        statDownloadedBy,
-                        statId
-                };
-            case properties:
-                return new AqlFieldEnum[]{
-                        propertyKey,
-                        propertyValue,
-                        propertyId
-                };
-            case archives:
-                return new AqlFieldEnum[]{
-                };
-            case entries:
-                return new AqlFieldEnum[]{
-                        archiveEntryName,
-                        archiveEntryNameId,
-                        archiveEntryPath,
-                        archiveEntryPathId
-                };
-            case artifacts:
-                return new AqlFieldEnum[]{
-                        buildArtifactName,
-                        buildArtifactType,
-                        buildArtifactSha1,
-                        buildArtifactMd5,
-                        buildArtifactId
-                };
-            case dependencies:
-                return new AqlFieldEnum[]{
-                        buildDependencyName,
-                        buildDependencyScope,
-                        buildDependencyType,
-                        buildDependencySha1,
-                        buildDependencyMd5,
-                        buildDependencyId
-                };
-            case modules:
-                return new AqlFieldEnum[]{
-                        moduleName,
-                        moduleId
-                };
-            case moduleProperties:
-                return new AqlFieldEnum[]{
-                        modulePropertyKey,
-                        modulePropertyValue,
-                        modulePropertyId
-                };
-            case buildProperties:
-                return new AqlFieldEnum[]{
-                        buildPropertyKey,
-                        buildPropertyValue,
-                        buildPropertyId
-                };
-            case buildPromotions:
-                return new AqlFieldEnum[]{
-                        buildPromotionCreated,
-                        buildPromotionCreatedBy,
-                        buildPromotionComment,
-                        buildPromotionRepo,
-                        buildPromotionUserName,
-                        buildPromotionStatus
-                };
-            case builds:
-                return new AqlFieldEnum[]{
-                        buildUrl,
-                        buildName,
-                        buildNumber,
-                        buildCreated,
-                        buildCreatedBy,
-                        buildModified,
-                        buildModifiedBy,
-                        buildId
-                };
-        }
-        throw new UnsupportedOperationException("Unsupported domain: " + domain);
-    }
-
-    public static AqlFieldEnum resolveFieldBySignatureAndDomain(String fieldSignatue, AqlDomainEnum domain) {
-        for (AqlFieldEnum aqlField : values()) {
-            if (aqlField.signature.equals(fieldSignatue) &&
-                    AqlDomainEnum.valueOf(aqlField.domainName) == domain) {
-                return aqlField;
-            }
-        }
-        return null;
-    }
-
-    public boolean isId() {
-        return this==itemId || this==propertyId || this==statId || this==buildArtifactId || this==buildDependencyId ||
-                this==moduleId || this==modulePropertyId || this==buildId || this==buildPropertyId;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/model/AqlItemTypeEnum.java b/base/api/src/main/java/org/artifactory/aql/model/AqlItemTypeEnum.java
deleted file mode 100644
index a1b6bc1..0000000
--- a/base/api/src/main/java/org/artifactory/aql/model/AqlItemTypeEnum.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.artifactory.aql.model;
-
-/**
- * @author Gidi Shabat
- */
-public enum AqlItemTypeEnum {
-    folder("folder", 0), file("file", 1), any("any", -1);
-    public String signature;
-    public int type;
-
-    AqlItemTypeEnum(String signature, int type) {
-        this.signature = signature;
-        this.type = type;
-    }
-
-    public static AqlItemTypeEnum fromTypes(int type) {
-        for (AqlItemTypeEnum aqlItemTypeEnum : values()) {
-            if (aqlItemTypeEnum.type == type) {
-                return aqlItemTypeEnum;
-            }
-        }
-        return null;
-    }
-
-    public static AqlItemTypeEnum fromSignature(String signature) {
-        for (AqlItemTypeEnum aqlItemTypeEnum : values()) {
-            if (aqlItemTypeEnum.signature.equals(signature)) {
-                return aqlItemTypeEnum;
-            }
-        }
-        return null;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/model/AqlOperatorEnum.java b/base/api/src/main/java/org/artifactory/aql/model/AqlOperatorEnum.java
deleted file mode 100644
index 2de4e55..0000000
--- a/base/api/src/main/java/org/artifactory/aql/model/AqlOperatorEnum.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.aql.model;
-
-
-/**
- * @author Gidi Shabat
- */
-public enum AqlOperatorEnum {
-    and("$and"), or("$or"), freezeJoin("$msp"), resultFilter("$rf");
-    public String signature;
-
-    AqlOperatorEnum(String signature) {
-        this.signature = signature;
-    }
-
-    public static AqlOperatorEnum value(String operator) {
-        operator = operator.toLowerCase();
-        for (AqlOperatorEnum operatorEnum : values()) {
-            if (operatorEnum.signature.equals(operator)) {
-                return operatorEnum;
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/model/AqlPermissionProvider.java b/base/api/src/main/java/org/artifactory/aql/model/AqlPermissionProvider.java
deleted file mode 100644
index bc4ef23..0000000
--- a/base/api/src/main/java/org/artifactory/aql/model/AqlPermissionProvider.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.artifactory.aql.model;
-
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author Gidi Shabat
- */
-public interface AqlPermissionProvider {
-    boolean canRead(RepoPath repoPath);
-
-    boolean isAdmin();
-
-    boolean isOss();
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/model/AqlRelativeDateComparatorEnum.java b/base/api/src/main/java/org/artifactory/aql/model/AqlRelativeDateComparatorEnum.java
deleted file mode 100644
index 288650e..0000000
--- a/base/api/src/main/java/org/artifactory/aql/model/AqlRelativeDateComparatorEnum.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.artifactory.aql.model;
-
-import org.apache.commons.compress.archivers.dump.InvalidFormatException;
-import org.joda.time.DateTime;
-import org.joda.time.Period;
-import org.joda.time.format.PeriodFormatter;
-import org.joda.time.format.PeriodFormatterBuilder;
-
-import java.util.Date;
-
-/**
- * @author gidis
- */
-public enum AqlRelativeDateComparatorEnum {
-    last("$last", AqlComparatorEnum.greater),
-    before("$before", AqlComparatorEnum.less);
-
-    public String signature;
-    public AqlComparatorEnum aqlComparatorEnum;
-
-    AqlRelativeDateComparatorEnum(String signature, AqlComparatorEnum aqlComparatorEnum) {
-        this.signature = signature;
-        this.aqlComparatorEnum = aqlComparatorEnum;
-    }
-
-    public static AqlRelativeDateComparatorEnum value(String comparator) {
-        for (AqlRelativeDateComparatorEnum comparatorEnum : values()) {
-            if (comparatorEnum.signature.equals(comparator)) {
-                return comparatorEnum;
-            }
-        }
-        return null;
-    }
-
-    public long toDate(String value) {
-        try {
-            PeriodFormatter formatter = new PeriodFormatterBuilder()
-                    .appendMillis().appendSuffix("millis")
-                    .appendMillis().appendSuffix("ms")
-                    .appendMinutes().appendSuffix("minutes")
-                    .appendMinutes().appendSuffix("mi")
-                    .appendDays().appendSuffix("days")
-                    .appendDays().appendSuffix("d")
-                    .appendMonths().appendSuffix("months")
-                    .appendMonths().appendSuffix("mo")
-                    .appendYears().appendSuffix("years")
-                    .appendYears().appendSuffix("y")
-                    .appendSeconds().appendSuffix("seconds")
-                    .appendSeconds().appendSuffix("s")
-                    .appendWeeks().appendSuffix("weeks")
-                    .appendWeeks().appendSuffix("w")
-                    .toFormatter();
-            Period period = formatter.parsePeriod(value);
-            DateTime now = DateTime.now();
-            return now.minus(period).getMillis();
-        }catch (IllegalArgumentException e){
-            return -1;
-        }
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/model/AqlSortTypeEnum.java b/base/api/src/main/java/org/artifactory/aql/model/AqlSortTypeEnum.java
deleted file mode 100644
index 9c69ce9..0000000
--- a/base/api/src/main/java/org/artifactory/aql/model/AqlSortTypeEnum.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.artifactory.aql.model;
-
-/**
- * @author Gidi Shabat
- */
-public enum AqlSortTypeEnum {
-    desc("$desc", "DESC"), asc("$asc", "ASC");
-    private String aqlName;
-    private String sqlName;
-
-    AqlSortTypeEnum(String aqlName, String sqlName) {
-        this.aqlName = aqlName;
-        this.sqlName = sqlName;
-    }
-
-    public String getAqlName() {
-        return aqlName;
-    }
-
-    public String getSqlName() {
-        return sqlName;
-    }
-
-    public static AqlSortTypeEnum fromAql(String aql) {
-        for (AqlSortTypeEnum sortTypeEnum : values()) {
-            if (sortTypeEnum.aqlName.equals(aql)) {
-                return sortTypeEnum;
-            }
-        }
-        throw new IllegalStateException("Couldn't find enum with the corresponded aql name");
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/model/AqlTableFieldsEnum.java b/base/api/src/main/java/org/artifactory/aql/model/AqlTableFieldsEnum.java
deleted file mode 100644
index 4091448..0000000
--- a/base/api/src/main/java/org/artifactory/aql/model/AqlTableFieldsEnum.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.artifactory.aql.model;
-
-/**
- * @author Gidi Shabat
- */
-public enum AqlTableFieldsEnum {
-    modified,
-    created,
-    updated,
-    node_name,
-    node_path,
-    entry_path,
-    entry_name,
-    repo,
-    node_type,
-    depth,
-    node_id,
-    bin_length,
-    sha1_original,
-    sha1_actual,
-    md5_original,
-    md5_actual,
-    created_by,
-    modified_by,
-    last_downloaded,
-    last_downloaded_by,
-    download_count,
-    prop_key,
-    prop_value,
-    prop_id,
-    artifact_name,
-    artifact_type,
-    dependency_name_id,
-    dependency_scopes,
-    dependency_type,
-    sha1,
-    md5,
-    artifact_id,
-    dependency_id,
-    module_name_id,
-    ci_url,
-    build_name,
-    build_number,
-    archive_sha1,
-    indexed_archives_id,
-    name_id,
-    entry_name_id,
-    path_id,
-    entry_path_id,
-    build_id,
-    module_id,
-    status,
-    promotion_comment,
-    ci_user,
-    unknown,
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/model/AqlValue.java b/base/api/src/main/java/org/artifactory/aql/model/AqlValue.java
deleted file mode 100644
index 48f59fe..0000000
--- a/base/api/src/main/java/org/artifactory/aql/model/AqlValue.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package org.artifactory.aql.model;
-
-import org.artifactory.aql.AqlException;
-import org.artifactory.aql.AqlParserException;
-import org.joda.time.format.ISODateTimeFormat;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlValue implements AqlVariable {
-
-    private AqlVariableTypeEnum valueType;
-    private String value;
-
-    public AqlValue(AqlVariableTypeEnum valueType, String value) {
-        this.valueType = valueType;
-        this.value = value;
-    }
-
-    public Object toObject() throws AqlException {
-        Object result = value;
-        if (value == null) {
-            return null;
-        }
-        if (AqlVariableTypeEnum.string == valueType) {
-            result = value;
-        }
-        if (AqlVariableTypeEnum.date == valueType) {
-            try {
-                result = Long.parseLong(value);
-            } catch (Exception e1) {
-                try {
-                    result = ISODateTimeFormat.dateOptionalTimeParser().parseMillis(value);
-                } catch (Exception e2) {
-                    throw new AqlParserException(
-                            String.format("Invalid Date format: %s, AQL expect ISODateTimeFormat or long number", value), e2);
-                }
-            }
-        }
-        if (AqlVariableTypeEnum.longInt == valueType) {
-            try {
-                result = Long.valueOf(value);
-            } catch (NumberFormatException e) {
-                throw new AqlException("AQL Expect long value but found:" + value.toString() + "\n");
-            }
-        }
-        if (AqlVariableTypeEnum.itemType == valueType) {
-            AqlItemTypeEnum aqlItemTypeEnum = AqlItemTypeEnum.fromSignature(value);
-            if(aqlItemTypeEnum !=null){
-                result = aqlItemTypeEnum.type;
-            }else{
-                throw new AqlException(String.format("Invalid file type: %s, valid types are : %s, %s, %s", value,
-                        AqlItemTypeEnum.file.signature, AqlItemTypeEnum.folder.signature,
-                        AqlItemTypeEnum.any.signature));
-            }
-        }
-        if (AqlVariableTypeEnum.integer == valueType) {
-            try {
-                result = Integer.valueOf(value);
-            } catch (NumberFormatException e) {
-                throw new AqlException("AQL Expect integer value but found:" + value.toString() + "\n");
-            }
-        }
-        return result;
-
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/model/AqlVariable.java b/base/api/src/main/java/org/artifactory/aql/model/AqlVariable.java
deleted file mode 100644
index 3a8ab71..0000000
--- a/base/api/src/main/java/org/artifactory/aql/model/AqlVariable.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.artifactory.aql.model;
-
-/**
- * @author Gidi Shabat
- */
-public interface AqlVariable {
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/aql/model/AqlVariableTypeEnum.java b/base/api/src/main/java/org/artifactory/aql/model/AqlVariableTypeEnum.java
deleted file mode 100644
index 52a36c6..0000000
--- a/base/api/src/main/java/org/artifactory/aql/model/AqlVariableTypeEnum.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package org.artifactory.aql.model;
-
-/**
- * @author Gidi Shabat
- */
-public enum AqlVariableTypeEnum {
-    date, string, integer, longInt, itemType
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/model/DomainSensitiveField.java b/base/api/src/main/java/org/artifactory/aql/model/DomainSensitiveField.java
deleted file mode 100644
index 69f67bc..0000000
--- a/base/api/src/main/java/org/artifactory/aql/model/DomainSensitiveField.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.artifactory.aql.model;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class DomainSensitiveField {
-    private AqlFieldEnum field;
-    private List<AqlDomainEnum> subDomains;
-
-    public DomainSensitiveField(AqlFieldEnum field, List<AqlDomainEnum> domains) {
-        this.field = field;
-        subDomains = domains;
-    }
-
-    public AqlFieldEnum getField() {
-        return field;
-    }
-
-    public void setField(AqlFieldEnum field) {
-        this.field = field;
-    }
-
-    public List<AqlDomainEnum> getSubDomains() {
-        return subDomains;
-    }
-
-    public void setSubDomains(List<AqlDomainEnum> subDomains) {
-        this.subDomains = subDomains;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        DomainSensitiveField that = (DomainSensitiveField) o;
-
-        if (field != that.field) {
-            return false;
-        }
-        if (subDomains != null ? !subDomains.equals(that.subDomains) : that.subDomains != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = field != null ? field.hashCode() : 0;
-        result = 31 * result + (subDomains != null ? subDomains.hashCode() : 0);
-        return result;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/result/AqlEagerResult.java b/base/api/src/main/java/org/artifactory/aql/result/AqlEagerResult.java
deleted file mode 100644
index f78ef1c..0000000
--- a/base/api/src/main/java/org/artifactory/aql/result/AqlEagerResult.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.artifactory.aql.result;
-
-import org.artifactory.aql.result.rows.AqlRowResult;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public interface AqlEagerResult<T extends AqlRowResult> {
-    int getSize();
-
-    T getResult(int j);
-
-    List<T> getResults();
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/result/AqlJsonStreamer.java b/base/api/src/main/java/org/artifactory/aql/result/AqlJsonStreamer.java
deleted file mode 100644
index 8307668..0000000
--- a/base/api/src/main/java/org/artifactory/aql/result/AqlJsonStreamer.java
+++ /dev/null
@@ -1,229 +0,0 @@
-package org.artifactory.aql.result;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.aql.AqlException;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.model.AqlItemTypeEnum;
-import org.artifactory.aql.model.DomainSensitiveField;
-import org.artifactory.aql.result.rows.InflatableRow;
-import org.artifactory.aql.util.AqlUtils;
-import org.codehaus.jackson.annotate.JsonAutoDetect;
-import org.codehaus.jackson.annotate.JsonMethod;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.joda.time.format.ISODateTimeFormat;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.sql.ResultSet;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Gidi Shabat
- *         The class converts the AqlLazyResult to in-memory Aql Json result
- *         The Max number of rows allowed by this result is the actually artifactory searchUserQueryLimit:
- *         (ConstantValues.searchUserQueryLimit)
- */
-public class AqlJsonStreamer extends AqlRestResult implements Cloneable {
-    private static final Logger log = LoggerFactory.getLogger(AqlJsonStreamer.class);
-    private static final String QUERY_PREFIX = "\n{\n\"results\" : [ ";
-    private static final String NUMBER_OF_ROWS = "<NUMBER_OF_ROWS>";
-    private static final String QUERY_POSTFIX = " ],\n\"range\" : " + NUMBER_OF_ROWS + "\n}\n";
-    private final ResultSet resultSet;
-    private final List<DomainSensitiveField> fields;
-    private final Map<AqlFieldEnum, String> dbFieldNames;
-    private final long limit;
-    private final long offset;
-    private long rowsCount;
-    private Buffer buffer = new Buffer();
-    private boolean ended;
-    private String mainId = null;
-    private Row mainRow;
-    private AqlDomainEnum domain;
-
-    public AqlJsonStreamer(AqlLazyResult lazyResult) {
-        super(lazyResult.getPermissionProvider());
-        this.resultSet = lazyResult.getResultSet();
-        this.fields = lazyResult.getFields();
-        this.dbFieldNames = lazyResult.getDbFieldNames();
-        this.limit = lazyResult.getLimit();
-        this.offset = lazyResult.getOffset();
-        this.domain = lazyResult.getDomain();
-        buffer.push(QUERY_PREFIX.getBytes());
-    }
-
-    /**
-     * Read the ResultSet from db:
-     * 1. In case of multi domain result the method merge multi rows into Json multi layer json result
-     * 2. In case of single domain result the class convert single row into flat json.
-     */
-    private Row inflateRow() {
-
-        try {
-            while (resultSet.next()) {
-                InflatableRow row = new InflatableRow();
-                for (DomainSensitiveField field : fields) {
-                    AqlFieldEnum fieldEnum = field.getField();
-                    String dbFieldName =fieldEnum.name();
-                    switch (fieldEnum.type) {
-                        case date: {
-                            Long valueLong = resultSet.getLong(dbFieldName);
-                            String value = valueLong == 0 ? null : ISODateTimeFormat.dateTime().print(valueLong);
-                            row.put(field, value);
-                            break;
-                        }
-                        case longInt: {
-                            long value = resultSet.getLong(dbFieldName);
-                            row.put(field, value);
-                            break;
-                        }
-                        case integer: {
-                            int value = resultSet.getInt(dbFieldName);
-                            row.put(field, value);
-                            break;
-                        }
-                        case string: {
-                            String value = resultSet.getString(dbFieldName);
-                            row.put(field, value);
-                            break;
-                        }
-                        case itemType: {
-                            int type = resultSet.getInt(dbFieldName);
-                            AqlItemTypeEnum aqlItemTypeEnum = AqlItemTypeEnum.fromTypes(type);
-                            row.put(field, aqlItemTypeEnum);
-                            break;
-                        }
-                    }
-                }
-                if (!canRead(domain, resultSet)) {
-                    continue;
-                }
-                Map<String, Row> map = row.inflate();
-                String newId = map.keySet().iterator().next();
-                Row newRow = map.values().iterator().next();
-                if (mainId == null) {
-                    mainId = newId;
-                    mainRow = newRow;
-                } else {
-                    if (!mainId.equals(newId)) {
-                        Row temp = mainRow;
-                        mainRow = newRow;
-                        mainId = newId;
-                        return temp.build();
-                    } else {
-                        mainRow.merge(newRow);
-                    }
-                }
-            }
-        } catch (Exception e) {
-            throw new AqlException("Failed to fetch Aql result", e);
-        }
-        if (mainRow != null) {
-            Row row = mainRow;
-            mainRow = null;
-            return row.build();
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * Reads Single row from The Json result
-     * The method return null to signal end of stream
-     *
-     * @return Json row in byte array
-     * @throws java.io.IOException
-     */
-    @Override
-    public byte[]    read() throws IOException {
-        // Use the data in the buffer, reloading  the buffer is allowed only if it is empty
-        if (!buffer.isEmpty()) {
-            return buffer.getData();
-        }
-        // Fill the buffer from result-set
-        byte[] data;
-        if ((data = getNewRowFromDb()) != null) {
-            rowsCount++;
-            buffer.push(data);
-            return buffer.getData();
-        }
-        // Fill the buffer from post fix
-        if (!ended) {
-            appendEndSection();
-            return buffer.getData();
-        }
-        return null;
-    }
-
-    private void appendEndSection() {
-        try {
-            if (!ended) {
-                String range = generateRangeJson();
-                String summary = StringUtils.replace(QUERY_POSTFIX, NUMBER_OF_ROWS, "" + range);
-                buffer.push(summary.getBytes());
-                ended = true;
-            }
-        } catch (IOException e) {
-            log.error("Failed to generate Aql result summery.", e);
-        }
-    }
-
-    private String generateRangeJson() throws IOException {
-        Range range = new Range(offset, rowsCount, rowsCount, limit);
-        ObjectMapper mapper = new ObjectMapper();
-        mapper.getSerializationConfig().withSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
-        mapper.setVisibility(JsonMethod.ALL, JsonAutoDetect.Visibility.NONE);
-        mapper.setVisibility(JsonMethod.FIELD, JsonAutoDetect.Visibility.ANY);
-        return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(range);
-    }
-
-    public byte[] getNewRowFromDb() {
-        boolean isFirstElement = mainId == null;
-        Row row = inflateRow();
-        if (row != null) {
-            try {
-                ObjectMapper mapper = new ObjectMapper();
-                mapper.getSerializationConfig().withSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
-                mapper.setVisibility(JsonMethod.ALL, JsonAutoDetect.Visibility.NONE);
-                mapper.setVisibility(JsonMethod.FIELD, JsonAutoDetect.Visibility.ANY);
-                String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(row);
-                json = isFirstElement ? "" + json : "," + json;
-                return json.getBytes();
-            } catch (Exception e) {
-                throw new AqlException("Failed to convert Aql Result to JSON", e);
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public void close() {
-        AqlUtils.closeResultSet(resultSet);
-    }
-
-
-    /**
-     * Simplify the work with the stream during the read
-     */
-    private class Buffer {
-        private byte[] buffer;
-
-        public void push(byte[] bytes) {
-            buffer = bytes;
-        }
-
-        public byte[] getData() {
-            byte[] temp = buffer;
-            buffer = null;
-            return temp;
-        }
-
-        public boolean isEmpty() {
-            return buffer == null;
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/aql/result/AqlLazyResult.java b/base/api/src/main/java/org/artifactory/aql/result/AqlLazyResult.java
deleted file mode 100644
index 259078c..0000000
--- a/base/api/src/main/java/org/artifactory/aql/result/AqlLazyResult.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.artifactory.aql.result;
-
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.model.AqlPermissionProvider;
-import org.artifactory.aql.model.DomainSensitiveField;
-import org.artifactory.aql.result.rows.AqlRowResult;
-
-import java.sql.ResultSet;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Gidi Shabat
- */
-public interface AqlLazyResult <T extends AqlRowResult> {
-
-    AqlPermissionProvider getPermissionProvider();
-    List<DomainSensitiveField> getFields();
-
-    ResultSet getResultSet();
-
-    long getLimit();
-
-    long getOffset();
-
-    Map<AqlFieldEnum, String> getDbFieldNames();
-
-    AqlDomainEnum getDomain();
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/result/AqlRestResult.java b/base/api/src/main/java/org/artifactory/aql/result/AqlRestResult.java
deleted file mode 100644
index bd26dfe..0000000
--- a/base/api/src/main/java/org/artifactory/aql/result/AqlRestResult.java
+++ /dev/null
@@ -1,419 +0,0 @@
-package org.artifactory.aql.result;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import org.artifactory.aql.AqlException;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.model.AqlItemTypeEnum;
-import org.artifactory.aql.model.AqlPermissionProvider;
-import org.artifactory.aql.util.AqlUtils;
-import org.artifactory.repo.RepoPath;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.annotate.JsonPropertyOrder;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.sql.ResultSet;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Gidi Shabat
- */
-public abstract class AqlRestResult implements Closeable {
-    private static final Logger log = LoggerFactory.getLogger(AqlRestResult.class);
-    private AqlPermissionProvider permissionProvider;
-
-    public AqlRestResult(AqlPermissionProvider permissionProvider) {
-        this.permissionProvider = permissionProvider;
-    }
-
-    protected boolean canRead(AqlDomainEnum domain, final ResultSet resultSet) {
-        if (permissionProvider.isAdmin()) {
-            return true;
-        } else {
-            if (AqlDomainEnum.items == domain) {
-                try {
-                    String itemRepo = resultSet.getString(AqlFieldEnum.itemRepo.name());
-                    String itemPath = resultSet.getString(AqlFieldEnum.itemPath.name());
-                    String itemName = resultSet.getString(AqlFieldEnum.itemName.name());
-                    RepoPath repoPath = AqlUtils.fromAql(itemRepo, itemPath, itemName);
-                    return permissionProvider.canRead(repoPath);
-                } catch (Exception e) {
-                    log.error("AQL minimal field expectation error: repo, path and name");
-                }
-            }
-            return false;
-        }
-    }
-
-    protected boolean canRead(AqlDomainEnum domain, final String repo, final String path, final String name) {
-        if (permissionProvider.isAdmin()) {
-            return true;
-        } else {
-            if (AqlDomainEnum.items == domain) {
-                try {
-                    RepoPath repoPath = AqlUtils.fromAql(repo, path, name);
-                    return permissionProvider.canRead(repoPath);
-                } catch (Exception e) {
-                    log.error("AQL minimal field expectation error: repo, path and name");
-                }
-            }
-            return false;
-        }
-    }
-
-    public abstract byte[] read() throws IOException;
-
-    @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
-    @JsonPropertyOrder(value = {"itemRepo", "itemPath", "itemName", "itemType", "itemSize", "itemCreated", "itemCreatedBy", "itemModified", "itemModifiedBy", "itemUpdated", "itemDepth"}, alphabetic = true)
-    public static class Row {
-        @JsonIgnore
-        public Map<String, Row> subDomains;
-        @JsonIgnore
-        public AqlDomainEnum domain;
-        @JsonIgnore
-        public Long statId;
-        @JsonIgnore
-        public Long itemId;
-        @JsonIgnore
-        public Long propertyId;
-        @JsonIgnore
-        public Long buildId;
-        @JsonIgnore
-        public Long buildPropertyId;
-        @JsonIgnore
-        public Long buildArtifactId;
-        @JsonIgnore
-        public Long modulePropertyId;
-        @JsonIgnore
-        public Long moduleId;
-        @JsonIgnore
-        public Long buildDependencyId;
-        @JsonIgnore
-        public Long archiveEntryPathId;
-        @JsonIgnore
-        public Long archiveEntryNameId;
-
-
-
-        @JsonProperty("repo")
-        public String itemRepo;
-        @JsonProperty("path")
-        public String itemPath;
-        @JsonProperty("name")
-        public String itemName;
-        @JsonProperty("size")
-        public Long itemSize;
-        @JsonProperty("depth")
-        public Integer itemDepth;
-        @JsonProperty("modified")
-        public String itemModified;
-        @JsonProperty("created")
-        public String itemCreated;
-        @JsonProperty("updated")
-        public String itemUpdated;
-        @JsonProperty("created_by")
-        public String itemCreatedBy;
-        @JsonProperty("modified_by")
-        public String itemModifiedBy;
-        @JsonProperty("type")
-        public AqlItemTypeEnum itemType;
-        @JsonProperty("original_md5")
-        public String itemOriginalMd5;
-        @JsonProperty("actual_md5")
-        public String itemActualMd5;
-        @JsonProperty("original_sha1")
-        public String itemOriginalSha1;
-        @JsonProperty("actual_sha1")
-        public String itemActualSha1;
-        @JsonProperty("downloaded")
-        public String statDownloaded;
-        @JsonProperty("downloads")
-        public Integer statDownloads;
-        @JsonProperty("downloaded_by")
-        public String statDownloadedBy;
-        @JsonProperty("key")
-        public String propertyKey;
-        @JsonProperty("value")
-        public String propertyValue;
-        @JsonProperty("entry.name")
-        public String archiveEntryName;
-        @JsonProperty("entry.path")
-        public String archiveEntryPath;
-        @JsonProperty("module.name")
-        public String moduleName;
-        @JsonProperty("module.property.key")
-        public String modulePropertyKey;
-        @JsonProperty("module.property.value")
-        public String modulePropertyValue;
-        @JsonProperty("dependency.name")
-        public String buildDependencyName;
-        @JsonProperty("dependency.scope")
-        public String buildDependencyScope;
-        @JsonProperty("dependency.type")
-        public String buildDependencyType;
-        @JsonProperty("dependency.sha1")
-        public String buildDependencySha1;
-        @JsonProperty("dependency.md5")
-        public String buildDependencyMd5;
-        @JsonProperty("artifact.name")
-        public String buildArtifactName;
-        @JsonProperty("artifact.type")
-        public String buildArtifactType;
-        @JsonProperty("artifact.sha1")
-        public String buildArtifactSha1;
-        @JsonProperty("artifact.md5")
-        public String buildArtifactMd5;
-        @JsonProperty("build.property.key")
-        public String buildPropertyKey;
-        @JsonProperty("build.property.value")
-        public String buildPropertyValue;
-        @JsonProperty("build.url")
-        public String buildUrl;
-        @JsonProperty("build.name")
-        public String buildName;
-        @JsonProperty("build.number")
-        public String buildNumber;
-        @JsonProperty("build.created")
-        public String buildCreated;
-        @JsonProperty("build.created_by")
-        public String buildCreatedBy;
-        @JsonProperty("build.modified")
-        public String buildModified;
-        @JsonProperty("build.modified_by")
-        public String buildModifiedBy;
-
-        @JsonProperty("build.promotion.created")
-        public String buildPromotionCreated;
-        @JsonProperty("build.promotion.created_by")
-        public String buildPromotionCreatedBy;
-        @JsonProperty("build.promotion.user")
-        public String buildPromotionUserName;
-        @JsonProperty("build.promotion.status")
-        public String buildPromotionStatus;
-        @JsonProperty("build.promotion.repo")
-        public String buildPromotionRepo;
-        @JsonProperty("build.promotion.comment")
-        public String buildPromotionComment;
-
-        @JsonProperty("items")
-        public List<Row> items;
-        @JsonProperty("properties")
-        public List<Row> properties;
-        @JsonProperty("stats")
-        public List<Row> statistics;
-        @JsonProperty("archives")
-        public List<Row> archives;
-        @JsonProperty("entries")
-        public List<Row> entries;
-        @JsonProperty("artifacts")
-        public List<Row> artifacts;
-        @JsonProperty("dependencies")
-        public List<Row> dependencies;
-        @JsonProperty("modules")
-        public List<Row> modules;
-        @JsonProperty("module.properties")
-        public List<Row> moduleProperties;
-        @JsonProperty("builds")
-        public List<Row> builds;
-        @JsonProperty("build.properties")
-        public List<Row> buildProperties;
-        @JsonProperty("build.promotions")
-        public List<Row> buildPromotions;
-
-
-
-        public Row(AqlDomainEnum domain) {
-            this.domain = domain;
-        }
-
-        public void put(String fieldName, Object value) {
-            try {
-                Field declaredField = getClass().getDeclaredField(fieldName);
-                declaredField.setAccessible(true);
-                declaredField.set(this, value);
-            } catch (Exception e) {
-                log.error("Failed to fill Aql result "+fieldName+": with value:"+value);
-            }
-        }
-
-        public void merge(Row row) {
-            merge( row,this);
-        }
-
-        private boolean merge(Row source, Row target) {
-            boolean containsData = mapFields(source, target);
-            boolean childContainsData = false;
-            if (source.subDomains != null) {
-                for (String id : source.subDomains.keySet()) {
-                    Row sourceSubRow = source.subDomains.get(id);
-                    if (target.subDomains == null) {
-                        target.subDomains = Maps.newHashMap();
-                    }
-                    Row targetSubRow = target.subDomains.get(id);
-                    if (targetSubRow == null) {
-                        targetSubRow = new Row(sourceSubRow.getDomain());
-                        target.subDomains.put(id, targetSubRow);
-                    }
-                    childContainsData = merge(sourceSubRow, targetSubRow);
-                    if (!childContainsData) {
-                        target.subDomains.remove(id);
-                    }
-                }
-            }
-            return containsData || childContainsData;
-        }
-
-        private boolean mapFields(Row source, Row target) {
-            boolean containsData = false;
-            try {
-                Field[] declaredFields = source.getClass().getFields();
-                for (Field declaredField : declaredFields) {
-                    if (!declaredField.getName().equals("subDomains") && !declaredField.getName().equals("domain")) {
-                        Object value = declaredField.get(source);
-                        //Special behaviour for archive domain, since archive domain is built by two tables and doesn't have real key
-                        containsData = true;
-                        declaredField.set(target, value);
-                    }
-                }
-            } catch (IllegalAccessException e) {
-                throw new AqlException("failed to map result fields");
-            }
-            return containsData;
-        }
-
-        public Row build() {
-            if (subDomains != null) {
-                for (Row row : subDomains.values()) {
-                    row.build();
-                    AqlDomainEnum domainEnum = row.getDomain();
-                    switch (domainEnum) {
-                        case items: {
-                            if (this.items == null) {
-                                this.items = Lists.newArrayList();
-                            }
-                            this.items.add(row);
-                            break;
-                        }
-                        case properties: {
-                            if (this.properties == null) {
-                                this.properties = Lists.newArrayList();
-                            }
-                            this.properties.add(row);
-                            break;
-                        }
-                        case statistics: {
-                            if (this.statistics == null) {
-                                this.statistics = Lists.newArrayList();
-                            }
-                            this.statistics.add(row);
-                            break;
-                        }
-                        case archives: {
-                            if (this.archives == null) {
-                                this.archives = Lists.newArrayList();
-                            }
-                            this.archives.add(row);
-                            break;
-                        }
-                        case entries: {
-                            if (this.entries == null) {
-                                this.entries = Lists.newArrayList();
-                            }
-                            this.entries.add(row);
-                            break;
-                        }
-                        case artifacts: {
-                            if (this.artifacts == null) {
-                                this.artifacts = Lists.newArrayList();
-                            }
-                            this.artifacts.add(row);
-                            break;
-                        }
-                        case dependencies: {
-                            if (this.dependencies == null) {
-                                this.dependencies = Lists.newArrayList();
-                            }
-                            this.dependencies.add(row);
-                            break;
-                        }
-                        case modules: {
-                            if (this.modules == null) {
-                                this.modules = Lists.newArrayList();
-                            }
-                            this.modules.add(row);
-                            break;
-                        }
-                        case moduleProperties: {
-                            if (this.moduleProperties == null) {
-                                this.moduleProperties = Lists.newArrayList();
-                            }
-                            this.moduleProperties.add(row);
-                            break;
-                        }
-                        case builds: {
-                            if (this.builds == null) {
-                                this.builds = Lists.newArrayList();
-                            }
-                            this.builds.add(row);
-                            break;
-                        }
-                        case buildProperties: {
-                            if (this.buildProperties == null) {
-                                this.buildProperties = Lists.newArrayList();
-                            }
-                            this.buildProperties.add(row);
-                            break;
-                        }
-                        case buildPromotions: {
-                            if (this.buildPromotions == null) {
-                                this.buildPromotions = Lists.newArrayList();
-                            }
-                            this.buildPromotions.add(row);
-                            break;
-                        }
-                    }
-                }
-            }
-            return this;
-        }
-
-        public AqlDomainEnum getDomain() {
-            return domain;
-        }
-    }
-
-    @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
-    @JsonPropertyOrder(value = {"start", "end", "total"}, alphabetic = true)
-    protected class Range {
-
-        @JsonProperty("start_pos")
-        protected Long start;
-        @JsonProperty("end_pos")
-        protected Long end;
-        @JsonProperty("total")
-        protected Long total;
-        @JsonProperty("limit")
-        protected Long limited;
-
-        public Range(long start, long end, long limited) {
-            this.start = start;
-            this.end = end;
-            this.limited = Long.MAX_VALUE == limited ? null : limited;
-        }
-
-        public Range(long start, long end, long total, long limited) {
-            this.start = start;
-            this.end = end;
-            this.total = total;
-            this.limited = Long.MAX_VALUE == limited ? null : limited;
-        }
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlArchiveEntryItem.java b/base/api/src/main/java/org/artifactory/aql/result/rows/AqlArchiveEntryItem.java
deleted file mode 100644
index c1a8a7c..0000000
--- a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlArchiveEntryItem.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.artifactory.aql.result.rows;
-
-import static org.artifactory.aql.model.AqlDomainEnum.entries;
-import static org.artifactory.aql.model.AqlFieldEnum.*;
-
-/**
- * @author Gidi Shabat
- */
- at QueryTypes(value = entries, fields = {archiveEntryPath, archiveEntryName, archiveEntryPathId, archiveEntryNameId})
-public interface AqlArchiveEntryItem extends AqlRowResult {
-    String getEntryName();
-
-    String getEntryPath();
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlBaseFullRowImpl.java b/base/api/src/main/java/org/artifactory/aql/result/rows/AqlBaseFullRowImpl.java
deleted file mode 100644
index 4f10394..0000000
--- a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlBaseFullRowImpl.java
+++ /dev/null
@@ -1,288 +0,0 @@
-package org.artifactory.aql.result.rows;
-
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.model.AqlItemTypeEnum;
-
-import java.util.Date;
-import java.util.Map;
-
-import static org.artifactory.aql.model.AqlDomainEnum.items;
-import static org.artifactory.aql.model.AqlFieldEnum.*;
-
-/**
- * @author Gidi Shabat
- */
- at QueryTypes(value = items,
-        fields = {itemId, itemType, itemRepo, itemPath, itemName, itemDepth, itemCreated, itemCreatedBy,
-                itemModified, itemModifiedBy, itemUpdated, itemSize, itemActualSha1, itemOriginalSha1, itemActualMd5,
-                // stats
-                statDownloaded, statDownloads, statDownloadedBy,
-                // properties
-                propertyKey, propertyValue,
-                // archive entries
-                archiveEntryName, archiveEntryPath,
-                // builds
-                moduleName, buildDependencyName, buildDependencyScope, buildDependencyType, buildDependencySha1,
-                buildDependencyMd5, buildArtifactName, buildArtifactType, buildArtifactSha1, buildArtifactMd5, buildPropertyKey,
-                buildPropertyValue, buildUrl, buildName, buildNumber, buildCreated, buildCreatedBy, buildModified, buildModifiedBy
-        })
-public class AqlBaseFullRowImpl
-        implements AqlRowResult, FullRow, AqlItem, AqlBaseItem, AqlArchiveEntryItem, AqlBuildArtifact, AqlBuildDependency,
-        AqlProperty, AqlBuild, AqlStatisticItem, AqlBuildProperty, AqlStatistics,AqlBuildModule,AqlBuildPromotion {
-
-    Map<AqlFieldEnum, Object> map;
-
-    public AqlBaseFullRowImpl(Map<AqlFieldEnum, Object> map) {
-        this.map = map;
-    }
-
-    @Override
-    public Date getCreated() {
-        return (Date) map.get(AqlFieldEnum.itemCreated);
-    }
-
-    @Override
-    public Date getModified() {
-        return (Date) map.get(AqlFieldEnum.itemModified);
-    }
-
-    @Override
-    public Date getUpdated() {
-        return (Date) map.get(AqlFieldEnum.itemUpdated);
-    }
-
-    @Override
-    public String getCreatedBy() {
-        return (String) map.get(AqlFieldEnum.itemCreatedBy);
-    }
-
-    @Override
-    public String getModifiedBy() {
-        return (String) map.get(AqlFieldEnum.itemModifiedBy);
-    }
-
-    @Override
-    public Date getDownloaded() {
-        return (Date) map.get(AqlFieldEnum.statDownloaded);
-    }
-
-    @Override
-    public int getDownloads() {
-        return (int) map.get(AqlFieldEnum.statDownloads);
-    }
-
-    @Override
-    public String getDownloadedBy() {
-        return (String) map.get(AqlFieldEnum.statDownloadedBy);
-    }
-
-    @Override
-    public AqlItemTypeEnum getType() {
-        return (AqlItemTypeEnum) map.get(AqlFieldEnum.itemType);
-    }
-
-    @Override
-    public String getRepo() {
-        return (String) map.get(AqlFieldEnum.itemRepo);
-    }
-
-    @Override
-    public String getPath() {
-        return (String) map.get(AqlFieldEnum.itemPath);
-    }
-
-    @Override
-    public String getName() {
-        return (String) map.get(AqlFieldEnum.itemName);
-    }
-
-    @Override
-    public long getSize() {
-        return (long) map.get(AqlFieldEnum.itemSize);
-    }
-
-    @Override
-    public int getDepth() {
-        return (int) map.get(AqlFieldEnum.itemDepth);
-    }
-
-    @Override
-    public long getNodeId() {
-        return (int) map.get(AqlFieldEnum.itemId);
-    }
-
-    @Override
-    public String getOriginalMd5() {
-        return (String) map.get(AqlFieldEnum.itemOriginalMd5);
-    }
-
-    @Override
-    public String getActualMd5() {
-        return (String) map.get(AqlFieldEnum.itemActualMd5);
-    }
-
-    @Override
-    public String getOriginalSha1() {
-        return (String) map.get(AqlFieldEnum.itemOriginalSha1);
-    }
-
-    @Override
-    public String getActualSha1() {
-        return (String) map.get(AqlFieldEnum.itemActualSha1);
-    }
-
-    @Override
-    public String getKey() {
-        return (String) map.get(AqlFieldEnum.propertyKey);
-    }
-
-    @Override
-    public String getValue() {
-        return (String) map.get(AqlFieldEnum.propertyValue);
-    }
-
-    @Override
-    public String getEntryName() {
-        return (String) map.get(AqlFieldEnum.archiveEntryName);
-    }
-
-    @Override
-    public String getEntryPath() {
-        return (String) map.get(AqlFieldEnum.archiveEntryPath);
-    }
-
-    @Override
-    public String getBuildModuleName() {
-        return (String) map.get(AqlFieldEnum.moduleName);
-    }
-
-    @Override
-    public Long getBuildModuleId() {
-        return (Long) map.get(AqlFieldEnum.moduleId);
-    }
-
-    @Override
-    public String getBuildDependencyName() {
-        return (String) map.get(AqlFieldEnum.buildDependencyName);
-    }
-
-    @Override
-    public String getBuildDependencyScope() {
-        return (String) map.get(AqlFieldEnum.buildDependencyScope);
-    }
-
-    @Override
-    public String getBuildDependencyType() {
-        return (String) map.get(AqlFieldEnum.buildDependencyType);
-    }
-
-    @Override
-    public String getBuildDependencySha1() {
-        return (String) map.get(AqlFieldEnum.buildDependencySha1);
-    }
-
-    @Override
-    public String getBuildDependencyMd5() {
-        return (String) map.get(AqlFieldEnum.buildDependencyMd5);
-    }
-
-    @Override
-    public String getBuildArtifactName() {
-        return (String) map.get(AqlFieldEnum.buildArtifactName);
-    }
-
-    @Override
-    public String getBuildArtifactType() {
-        return (String) map.get(AqlFieldEnum.buildArtifactType);
-    }
-
-    @Override
-    public String getBuildArtifactSha1() {
-        return (String) map.get(AqlFieldEnum.buildArtifactSha1);
-    }
-
-    @Override
-    public String getBuildArtifactMd5() {
-        return (String) map.get(AqlFieldEnum.buildArtifactMd5);
-    }
-
-    @Override
-    public String getBuildPropKey() {
-        return (String) map.get(AqlFieldEnum.buildPropertyKey);
-    }
-
-    @Override
-    public String getBuildPropValue() {
-        return (String) map.get(AqlFieldEnum.buildPropertyValue);
-    }
-
-    @Override
-    public String getBuildUrl() {
-        return (String) map.get(AqlFieldEnum.buildUrl);
-    }
-
-    @Override
-    public String getBuildName() {
-        return (String) map.get(AqlFieldEnum.buildName);
-    }
-
-    @Override
-    public String getBuildNumber() {
-        return (String) map.get(AqlFieldEnum.buildNumber);
-    }
-
-    @Override
-    public Date getBuildCreated() {
-        return (Date) map.get(AqlFieldEnum.buildCreated);
-    }
-
-    @Override
-    public String getBuildCreatedBy() {
-        return (String) map.get(AqlFieldEnum.buildCreatedBy);
-    }
-
-    @Override
-    public Date getBuildModified() {
-        return (Date) map.get(AqlFieldEnum.buildModified);
-    }
-
-    @Override
-    public String getBuildModifiedBy() {
-        return (String) map.get(AqlFieldEnum.buildModifiedBy);
-    }
-
-    @Override
-    public Date getBuildPromotionCreated() {
-        return (Date) map.get(AqlFieldEnum.buildPromotionCreated);
-    }
-
-    @Override
-    public String getBuildPromotionCreatedBy() {
-        return (String) map.get(AqlFieldEnum.buildPromotionCreatedBy);
-    }
-
-    @Override
-    public String getBuildPromotionUser() {
-        return (String) map.get(AqlFieldEnum.buildPromotionUserName);
-    }
-
-    @Override
-    public String getBuildPromotionComment() {
-        return (String) map.get(AqlFieldEnum.buildPromotionComment);
-    }
-
-    @Override
-    public String getBuildPromotionStatus() {
-        return (String) map.get(AqlFieldEnum.buildPromotionStatus);
-    }
-
-    @Override
-    public String getBuildPromotionRepo() {
-        return (String) map.get(AqlFieldEnum.buildPromotionRepo);
-    }
-
-    @Override
-    public String toString() {
-        return "AqlBaseFullRowImpl{map=" + map + "}";
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlBaseItem.java b/base/api/src/main/java/org/artifactory/aql/result/rows/AqlBaseItem.java
deleted file mode 100644
index 5d52cc1..0000000
--- a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlBaseItem.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.artifactory.aql.result.rows;
-
-import org.artifactory.aql.model.AqlItemTypeEnum;
-
-import static org.artifactory.aql.model.AqlDomainEnum.items;
-
-
-/**
- * @author Gidi Shabat
- */
- at QueryTypes(items)
-public interface AqlBaseItem extends AqlRowResult {
-    AqlItemTypeEnum getType();
-
-    String getRepo();
-
-    String getPath();
-
-    String getName();
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlBuild.java b/base/api/src/main/java/org/artifactory/aql/result/rows/AqlBuild.java
deleted file mode 100644
index b905dcb..0000000
--- a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlBuild.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.aql.result.rows;
-
-import java.util.Date;
-
-import static org.artifactory.aql.model.AqlDomainEnum.builds;
-
-/**
- * @author Gidi Shabat
- */
- at QueryTypes(builds)
-public interface AqlBuild extends AqlRowResult {
-    String getBuildUrl();
-
-    String getBuildName();
-
-    String getBuildNumber();
-
-    Date getBuildCreated();
-
-    String getBuildCreatedBy();
-
-    Date getBuildModified();
-
-    String getBuildModifiedBy();
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlBuildArtifact.java b/base/api/src/main/java/org/artifactory/aql/result/rows/AqlBuildArtifact.java
deleted file mode 100644
index 2f291dd..0000000
--- a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlBuildArtifact.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.artifactory.aql.result.rows;
-
-import static org.artifactory.aql.model.AqlDomainEnum.artifacts;
-
-/**
- * @author Gidi Shabat
- */
- at QueryTypes(value = artifacts)
-public interface AqlBuildArtifact extends AqlRowResult {
-    String getBuildArtifactName();
-
-    String getBuildArtifactType();
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlBuildDependency.java b/base/api/src/main/java/org/artifactory/aql/result/rows/AqlBuildDependency.java
deleted file mode 100644
index fed110e..0000000
--- a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlBuildDependency.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.artifactory.aql.result.rows;
-
-import static org.artifactory.aql.model.AqlDomainEnum.dependencies;
-
-/**
- * @author Gidi Shabat
- */
-
- at QueryTypes(value = dependencies)
-public interface AqlBuildDependency extends AqlRowResult {
-    String getBuildDependencyName();
-
-    String getBuildDependencyScope();
-
-    String getBuildDependencyType();
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlBuildModule.java b/base/api/src/main/java/org/artifactory/aql/result/rows/AqlBuildModule.java
deleted file mode 100644
index 0f287ba..0000000
--- a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlBuildModule.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.artifactory.aql.result.rows;
-
-import static org.artifactory.aql.model.AqlDomainEnum.modules;
-
-/**
- * @author Gidi Shabat
- */
- at QueryTypes(modules)
-public interface AqlBuildModule extends AqlRowResult {
-    String getBuildModuleName();
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlBuildPromotion.java b/base/api/src/main/java/org/artifactory/aql/result/rows/AqlBuildPromotion.java
deleted file mode 100644
index 267b6f2..0000000
--- a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlBuildPromotion.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.artifactory.aql.result.rows;
-
-import org.artifactory.aql.model.AqlDomainEnum;
-
-import java.util.Date;
-
-/**
- * @author gidis
- */
- at QueryTypes(AqlDomainEnum.buildPromotions)
-public interface AqlBuildPromotion  extends AqlRowResult {
-    Date getBuildPromotionCreated();
-
-    String getBuildPromotionCreatedBy();
-
-    String getBuildPromotionUser();
-
-    String getBuildPromotionComment();
-
-    String getBuildPromotionStatus();
-
-    String getBuildPromotionRepo();
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlBuildProperty.java b/base/api/src/main/java/org/artifactory/aql/result/rows/AqlBuildProperty.java
deleted file mode 100644
index a1608d8..0000000
--- a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlBuildProperty.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.artifactory.aql.result.rows;
-
-import static org.artifactory.aql.model.AqlDomainEnum.buildProperties;
-
-/**
- * @author Gidi Shabat
- */
- at QueryTypes(buildProperties)
-public interface AqlBuildProperty extends AqlRowResult {
-    String getBuildPropKey();
-
-    String getBuildPropValue();
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlItem.java b/base/api/src/main/java/org/artifactory/aql/result/rows/AqlItem.java
deleted file mode 100644
index 744cb17..0000000
--- a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlItem.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.artifactory.aql.result.rows;
-
-
-import org.artifactory.aql.model.AqlItemTypeEnum;
-
-import java.util.Date;
-
-import static org.artifactory.aql.model.AqlDomainEnum.items;
-import static org.artifactory.aql.model.AqlFieldEnum.*;
-
-/**
- * @author Gidi Shabat
- */
- at QueryTypes(value = items, fields = {itemId, itemType, itemRepo, itemPath, itemName,
-        itemDepth, itemCreated, itemCreatedBy, itemModified, itemModifiedBy, itemUpdated,
-        itemSize, itemActualSha1, itemOriginalSha1, itemActualMd5, itemOriginalMd5})
-public interface AqlItem extends AqlRowResult {
-    Date getCreated();
-
-    Date getModified();
-
-    Date getUpdated();
-
-    String getCreatedBy();
-
-    String getModifiedBy();
-
-    AqlItemTypeEnum getType();
-
-    String getRepo();
-
-    String getPath();
-
-    String getName();
-
-    long getSize();
-
-    int getDepth();
-
-    long getNodeId();
-
-    String getOriginalMd5();
-
-    String getActualMd5();
-
-    String getOriginalSha1();
-
-    String getActualSha1();
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlProperty.java b/base/api/src/main/java/org/artifactory/aql/result/rows/AqlProperty.java
deleted file mode 100644
index 5fd9dec..0000000
--- a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlProperty.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.artifactory.aql.result.rows;
-
-import static org.artifactory.aql.model.AqlDomainEnum.properties;
-
-/**
- * @author Gidi Shabat
- */
- at QueryTypes(properties)
-public interface AqlProperty extends AqlRowResult {
-    String getKey();
-
-    String getValue();
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlRowResult.java b/base/api/src/main/java/org/artifactory/aql/result/rows/AqlRowResult.java
deleted file mode 100644
index 695cdc1..0000000
--- a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlRowResult.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.artifactory.aql.result.rows;
-
-import static org.artifactory.aql.model.AqlDomainEnum.items;
-
-/**
- * @author Gidi Shabat
- */
- at QueryTypes(items)
-public interface AqlRowResult {
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlStatisticItem.java b/base/api/src/main/java/org/artifactory/aql/result/rows/AqlStatisticItem.java
deleted file mode 100644
index 9ed61c8..0000000
--- a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlStatisticItem.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.artifactory.aql.result.rows;
-
-import java.util.Date;
-
-import static org.artifactory.aql.model.AqlDomainEnum.statistics;
-import static org.artifactory.aql.model.AqlFieldEnum.*;
-
-/**
- * @author Gidi Shabat
- */
- at QueryTypes(value = statistics, fields = {itemId, itemType, itemRepo, itemPath, itemName,
-        itemDepth, itemCreated, itemCreatedBy, itemModified, itemModifiedBy, itemUpdated,
-        itemSize, itemActualSha1, itemOriginalSha1, itemActualMd5, itemOriginalMd5})
-public interface AqlStatisticItem extends AqlItem {
-    Date getDownloaded();
-
-    int getDownloads();
-
-    String getDownloadedBy();
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlStatistics.java b/base/api/src/main/java/org/artifactory/aql/result/rows/AqlStatistics.java
deleted file mode 100644
index 0e321e6..0000000
--- a/base/api/src/main/java/org/artifactory/aql/result/rows/AqlStatistics.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.artifactory.aql.result.rows;
-
-import java.util.Date;
-
-import static org.artifactory.aql.model.AqlDomainEnum.statistics;
-
-/**
- * @author Gidi Shabat
- */
- at QueryTypes(statistics)
-public interface AqlStatistics extends AqlRowResult {
-    Date getDownloaded();
-
-    int getDownloads();
-
-    String getDownloadedBy();
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/result/rows/FullRow.java b/base/api/src/main/java/org/artifactory/aql/result/rows/FullRow.java
deleted file mode 100644
index 008bae6..0000000
--- a/base/api/src/main/java/org/artifactory/aql/result/rows/FullRow.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package org.artifactory.aql.result.rows;
-
-import org.artifactory.aql.model.AqlItemTypeEnum;
-
-import java.util.Date;
-
-/**
- * @author Gidi Shabat
- */
-public interface FullRow {
-    Date getCreated();
-
-    Date getModified();
-
-    Date getUpdated();
-
-    String getCreatedBy();
-
-    String getModifiedBy();
-
-    Date getDownloaded();
-
-    int getDownloads();
-
-    String getDownloadedBy();
-
-    AqlItemTypeEnum getType();
-
-    String getRepo();
-
-    String getPath();
-
-    String getName();
-
-    long getSize();
-
-    int getDepth();
-
-    long getNodeId();
-
-    String getOriginalMd5();
-
-    String getActualMd5();
-
-    String getOriginalSha1();
-
-    String getActualSha1();
-
-    String getKey();
-
-    String getValue();
-
-    String getEntryName();
-
-    String getEntryPath();
-
-    String getBuildModuleName();
-
-    Long getBuildModuleId();
-
-    String getBuildDependencyName();
-
-    String getBuildDependencyScope();
-
-    String getBuildDependencyType();
-
-    String getBuildDependencySha1();
-
-    String getBuildDependencyMd5();
-
-    String getBuildArtifactName();
-
-    String getBuildArtifactType();
-
-    String getBuildArtifactSha1();
-
-    String getBuildArtifactMd5();
-
-    String getBuildPropKey();
-
-    String getBuildPropValue();
-
-    String getBuildUrl();
-
-    String getBuildName();
-
-    String getBuildNumber();
-
-    Date getBuildCreated();
-
-    String getBuildCreatedBy();
-
-    Date getBuildModified();
-
-    String getBuildModifiedBy();
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/result/rows/InflatableRow.java b/base/api/src/main/java/org/artifactory/aql/result/rows/InflatableRow.java
deleted file mode 100644
index b7e4792..0000000
--- a/base/api/src/main/java/org/artifactory/aql/result/rows/InflatableRow.java
+++ /dev/null
@@ -1,132 +0,0 @@
-package org.artifactory.aql.result.rows;
-
-import com.google.common.collect.Maps;
-import org.artifactory.aql.AqlException;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.model.DomainSensitiveField;
-import org.artifactory.aql.result.AqlRestResult;
-
-import java.lang.reflect.Field;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Gidi Shabat
- *         The class represent single row that returns from the database. in addition the InflatableRow contains the domin sensitive
- *         fields that corelates the results and allows to inflate the flate row result into multi domain model
- */
-public class InflatableRow {
-    private Map<DomainSensitiveField, Object> map = Maps.newHashMap();
-
-    /**
-     * pushes the pair: {DomainSensitiveField and results} to the InflatableRow
-     */
-    public void put(DomainSensitiveField field, Object value) {
-        map.put(field, value);
-    }
-
-    /**
-     * The method transforms the flat row into multi domain model
-     * The result is multi layer map (each layer represent single domain)
-     */
-    public Map<String, AqlRestResult.Row> inflate() {
-        Map<String, AqlRestResult.Row> result = Maps.newHashMap();
-        AqlRestResult.Row prev = null;
-        // For each field in the row resolve the domains list and set the value in its location in the multi layer domain
-        for (DomainSensitiveField field : map.keySet()) {
-            Map<String, AqlRestResult.Row> current = result;
-            List<AqlDomainEnum> subDomains = field.getSubDomains();
-            for (AqlDomainEnum subDomain : subDomains) {
-                String id = resolveId(subDomain);
-                // if map exist use it else create it
-                if (current == null) {
-                    current = Maps.newHashMap();
-                    prev.subDomains = current;
-                }
-                // if element row exist, use it,else create it
-                AqlRestResult.Row row = current.get(id);
-                if (row == null) {
-                    row = new AqlRestResult.Row(subDomain);
-                    current.put(id, row);
-                    fillRelevantFields(row, subDomain);
-                }
-                prev = row;
-                current = row.subDomains;
-            }
-        }
-        // Clean empty rows
-        clean(result.values().iterator().next());
-        return result;
-    }
-
-    /**
-     * Cleans all empty row (no need for them)
-     */
-    private boolean clean(AqlRestResult.Row next) {
-        // Clean all sub-domains
-        if (next.subDomains != null) {
-            Iterator<AqlRestResult.Row> iterator = next.subDomains.values().iterator();
-            while (iterator.hasNext()) {
-                AqlRestResult.Row row = iterator.next();
-                if (clean(row)) {
-                    iterator.remove();
-                }
-            }
-        }
-        // Check if we should clean this row parent
-        try {
-            Field[] declaredFields = next.getClass().getFields();
-            for (Field declaredField : declaredFields) {
-                if (!declaredField.getName().equals("subDomains") && !declaredField.getName().equals("domain")) {
-                    declaredField.setAccessible(true);
-                    Object value = declaredField.get(next);
-                    //Special behaviour for archive domain, since archive domain is built by two tables and doesn't have real key
-                    if (value != null && !"archiveId".equals(declaredField.getName()) && !AqlFieldEnum.valueOf(
-                            declaredField.getName()).isId()) {
-                        return false;
-                    }
-                }
-            }
-        } catch (IllegalAccessException e) {
-            throw new AqlException("Failed to map result fields", e);
-        }
-        return next.subDomains == null || next.subDomains.size() == 0;
-    }
-
-    /**
-     * The method fills all data (result from db) that is relevant for the current domain
-     */
-    private boolean fillRelevantFields(AqlRestResult.Row row, AqlDomainEnum subDomain) {
-        boolean containsData = false;
-        for (DomainSensitiveField field : map.keySet()) {
-            Object value = map.get(field);
-            if (field.getField().domainName.equals(subDomain.name())) {
-                if (value != null && !field.getField().isId()) {
-                    containsData = true;
-                }
-
-                row.put(field.getField().name(), value);
-            }
-        }
-        return containsData;
-    }
-
-    /**
-     * The method returns the element id according to the domain
-     */
-    private String resolveId(AqlDomainEnum domain) {
-        StringBuilder builder = new StringBuilder();
-        for (DomainSensitiveField domainSensitiveField : map.keySet()) {
-            AqlDomainEnum fieldDomain = AqlDomainEnum.valueOf(domainSensitiveField.getField().domainName);
-            if (fieldDomain == domain) {
-                String elementKey = domainSensitiveField.getField().name();
-                Object value = map.get(domainSensitiveField);
-                builder.append("((key:").append(elementKey).append(")(value:").append(value).append("))");
-            }
-        }
-        return builder.toString();
-    }
-
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/result/rows/QueryTypes.java b/base/api/src/main/java/org/artifactory/aql/result/rows/QueryTypes.java
deleted file mode 100644
index a05e2a7..0000000
--- a/base/api/src/main/java/org/artifactory/aql/result/rows/QueryTypes.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.aql.result.rows;
-
-
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * @author Gidi Shabat
- */
- at Target({ElementType.TYPE})
- at Retention(RetentionPolicy.RUNTIME)
-public @interface QueryTypes {
-    AqlDomainEnum value();
-
-    AqlFieldEnum[] fields() default {};
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/util/AqlSearchablePath.java b/base/api/src/main/java/org/artifactory/aql/util/AqlSearchablePath.java
deleted file mode 100644
index befa540..0000000
--- a/base/api/src/main/java/org/artifactory/aql/util/AqlSearchablePath.java
+++ /dev/null
@@ -1,130 +0,0 @@
-package org.artifactory.aql.util;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.util.PathUtils;
-
-import java.util.List;
-
-/**
- * This class represents an AQL searchable path.
- * Path elements are separated to repo key, path, and file name to support easier searches when using the AQL's
- * repo(), path() and name() fields.
- * ALL 3 FIELDS MUST BE SUPPLIED TO THE CONSTRUCTORS
- * <p/>
- * This class can accept either RepoPath or a full path as a string for conversion.
- * Available wildcards for search operations are ?(character) and *(word).
- * <p/>
- * Syntax examples for using this util correctly:
- * [**] - search recursively in all sub folders (used in path section only)
- * [.] -  search in root folder only            (used in path section only)
- * [*.ext] - all files with extension .ext      (used in fileName section only)
- * [*.*] - all files                            (used in fileName section only)
- * [*.?ar] - all files ending with any character followed by 'ar' (war, jar, ear, etc.)
- * <p/>
- * repo2/org/jfrog/test/**/*.*          -  all files under all of org/jfrog/test sub folders
- * repo2/org/jfrog/test/module*/*.jar   -  all jar files under  org/jfrog/test sub folders that start with module
- *
- * @author danf
- */
-public class AqlSearchablePath {
-
-    private String repo;
-    private String path;
-    private String fileName;
-
-    public AqlSearchablePath(String repo, String path, String fileName) {
-        this.repo = repo;
-        this.path = path;
-        this.fileName = fileName;
-    }
-
-    public AqlSearchablePath(String fullPath) {
-        repo = PathUtils.getFirstPathElement(fullPath);
-        path = PathUtils.getParent(PathUtils.stripFirstPathElement(fullPath));
-        fileName = PathUtils.getFileName(fullPath);
-    }
-
-    public AqlSearchablePath(RepoPath repoPath) {
-        repo = repoPath.getRepoKey();
-        try {
-            path = repoPath.getParent().getPath();
-        } catch (NullPointerException npe) {
-            throw new IllegalArgumentException("Aql searchable path must be a full path to file (or *.*)");
-        }
-        if (StringUtils.isBlank(path)) {    //root of repo
-            path = ".";
-        }
-        fileName = repoPath.getName();
-    }
-
-    /**
-     * Returns a list of {@link org.artifactory.aql.util.AqlSearchablePath} representing all full paths in the input
-     *
-     * @param fullPaths full paths (including repo) to artifacts
-     */
-    public static List<AqlSearchablePath> fullPathToSearchablePathList(List<String> fullPaths) {
-        List<AqlSearchablePath> outList = Lists.newArrayList();
-        for (String fullPath : fullPaths) {
-            outList.add(new AqlSearchablePath(fullPath));
-        }
-        return outList;
-    }
-
-    /**
-     * Returns a list of {@link org.artifactory.aql.util.AqlSearchablePath} representing all paths in the input:
-     * If the path starts with '/' then it is 'started'(appended) from the repo's root, else it is 'started'(appended)
-     * from the folder which originPath points to
-     *
-     * @param relativePaths List of relative paths to create
-     * @param originPath    Path pointing to a folder where relative paths should be started from
-     */
-    public static List<AqlSearchablePath> relativePathToSearchablePathList(List<String> relativePaths,
-            RepoPath originPath) {
-        List<AqlSearchablePath> outList = Lists.newArrayList();
-        for (String relPath : relativePaths) {
-            String fullPath;
-            if (relPath.startsWith("/")) {
-                fullPath = originPath.getRepoKey() + relPath;
-            } else {
-                fullPath = PathUtils.trimTrailingSlashes(originPath.toPath()) + "/" + relPath;
-            }
-            outList.add(new AqlSearchablePath(fullPath));
-        }
-        return outList;
-    }
-
-    public String getRepo() {
-        return repo;
-    }
-
-    public void setRepo(String repo) {
-        this.repo = repo;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    public String getFileName() {
-        return fileName;
-    }
-
-    public void setFileName(String fileName) {
-        this.fileName = fileName;
-    }
-
-    public String toFullPath() {
-        return repo + "/" + path + "/" + fileName;
-    }
-
-    public RepoPath toRepoPath() {
-        return InternalRepoPathFactory.create(repo, path + "/" + fileName);
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/aql/util/AqlUtils.java b/base/api/src/main/java/org/artifactory/aql/util/AqlUtils.java
deleted file mode 100644
index 91b7ad6..0000000
--- a/base/api/src/main/java/org/artifactory/aql/util/AqlUtils.java
+++ /dev/null
@@ -1,172 +0,0 @@
-package org.artifactory.aql.util;
-
-import com.google.common.collect.HashMultimap;
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.aql.AqlService;
-import org.artifactory.aql.api.domain.sensitive.AqlApiItem;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.result.AqlEagerResult;
-import org.artifactory.aql.result.rows.AqlBaseFullRowImpl;
-import org.artifactory.aql.result.rows.AqlItem;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.List;
-
-import static org.artifactory.aql.api.internal.AqlBase.and;
-
-/**
- * General class for aql utilities
- *
- * @author Dan Feldman
- */
-public class AqlUtils {
-    private static final Logger log = LoggerFactory.getLogger(AqlUtils.class);
-
-    /**
-     * Returns a RepoPath from an aql result's path fields
-     *
-     * @param repo repo key
-     * @param path path
-     * @param name file name
-     */
-    public static RepoPath fromAql(String repo, String path, String name) {
-        if (StringUtils.equals(path, ".")) {
-            return RepoPathFactory.create(repo, name);
-        } else {
-            return RepoPathFactory.create(repo, path + "/" + name);
-        }
-    }
-
-    /**
-     * Returns the RepoPath that points to this aql result
-     *
-     * @param row AqlFullRow object that has repo, path and name fields
-     */
-    public static RepoPath fromAql(AqlBaseFullRowImpl row) throws IllegalArgumentException {
-        if (StringUtils.isBlank(row.getRepo()) || StringUtils.isBlank(row.getPath())
-                || StringUtils.isBlank(row.getName())) {
-            throw new IllegalArgumentException("Repo, Path, and Name fields must contain values");
-        }
-        return fromAql(row.getRepo(), row.getPath(), row.getName());
-    }
-
-    public static RepoPath fromAql(AqlItem item) {
-        return fromAql((AqlBaseFullRowImpl) item);
-    }
-
-    /**
-     * Returns true if the node that the path points to exists (Use with files only!)
-     *
-     * @param path repo path to check for existence
-     */
-    public static boolean exists(RepoPath path) {
-        AqlSearchablePath aqlPath = new AqlSearchablePath(path);
-        AqlApiItem aql = AqlApiItem.create().filter(
-                and(
-                        AqlApiItem.repo().equal(aqlPath.getRepo()),
-                        AqlApiItem.path().equal(aqlPath.getPath()),
-                        AqlApiItem.name().equal(aqlPath.getFileName())
-                )
-        );
-        AqlEagerResult<AqlItem> results = ContextHelper.get().beanForType(AqlService.class).executeQueryEager(aql);
-        return results != null && results.getResults() != null && results.getResults().size() > 0;
-    }
-
-    /**
-     * Returns a list of {@link org.artifactory.aql.util.AqlSearchablePath} pointing to all files contained in the
-     * current folder as well as all files under all subdirectories of that folder.
-     * NOTE: use only with folders!
-     *
-     * @param path RepoPath of the folder to construct the search paths from
-     */
-    public static List<AqlSearchablePath> getSearchablePathForCurrentFolderAndSubfolders(RepoPath path) {
-        List<AqlSearchablePath> artifactPaths = Lists.newArrayList();
-        //Add *.* in filename for AqlSearchablePath creation - path is assumed to be a folder
-        RepoPath searchPath = InternalRepoPathFactory.childRepoPath(path, "*.*");
-        //All files in the folder containing the file
-        AqlSearchablePath allFilesInCurrentFolder = new AqlSearchablePath(searchPath);
-        //This will also find files without any extension (i.e. docker, lfs)
-        allFilesInCurrentFolder.setFileName("*");
-        artifactPaths.add(allFilesInCurrentFolder);
-        artifactPaths.add(getSearchablePathForAllFilesInSubfolders(path));
-        return artifactPaths;
-    }
-
-    /**
-     * Returns a searchable path representing all subfolders of current path and all files in them
-     * NOTE: use only with folders!
-     */
-    public static AqlSearchablePath getSearchablePathForAllFilesInSubfolders(RepoPath path) {
-        //Add *.* in filename for AqlSearchablePath creation - path is assumed to be a folder
-        RepoPath searchPath = InternalRepoPathFactory.childRepoPath(path, "*.*");
-        //All files in all subfolders of folder containing the file
-        AqlSearchablePath allFilesInSubFolders = new AqlSearchablePath(searchPath);
-        if (".".equals(allFilesInSubFolders.getPath())) {  //Special case for root folder
-            allFilesInSubFolders.setPath("**");
-        } else {
-            allFilesInSubFolders.setPath(allFilesInSubFolders.getPath() + "/**");
-        }
-        allFilesInSubFolders.setFileName("*");
-        return allFilesInSubFolders;
-    }
-
-    /**
-     * Returns an AqlApiItem OR clause containing an AND for each of the searchable paths given
-     */
-    public static AqlBase.OrClause getSearchClauseForPaths(List<AqlSearchablePath> aqlSearchablePaths) {
-        AqlBase.OrClause searchClause = AqlBase.or();
-        for (AqlSearchablePath path : aqlSearchablePaths) {
-            log.debug("Adding path '{}' to artifact search", path.toRepoPath().toString());
-            int depth = path.getPath().split("/").length;
-            searchClause.append(
-                    and(
-                            AqlApiItem.repo().equal(path.getRepo()),
-                            AqlApiItem.path().matches(path.getPath()),
-                            AqlApiItem.name().matches(path.getFileName()),
-                            AqlApiItem.depth().greaterEquals(depth)
-                    )
-            );
-        }
-        return searchClause;
-    }
-
-    public static void closeResultSet(ResultSet resultSet) {
-        if (resultSet != null) {
-            try {
-                resultSet.close();
-            } catch (SQLException e) {
-                log.trace("Could not close JDBC result set", e);
-            } catch (Exception e) {
-                log.trace("Unexpected exception when closing JDBC result set", e);
-            }
-        }
-    }
-
-    /**
-     * Maps repo path to all rows returned by the search for it. Also filters out results based on user read permissions.
-     */
-    public static HashMultimap<RepoPath, AqlBaseFullRowImpl> aggregateResultsByPath(List<AqlBaseFullRowImpl> results,
-            AuthorizationService authService) {
-        HashMultimap<RepoPath, AqlBaseFullRowImpl> aggregator = HashMultimap.create();
-        results.forEach(
-                result -> {
-                    RepoPath path = AqlUtils.fromAql(result);
-                    if (authService.canRead(path)) {
-                        aggregator.put(path, result);
-                    } else {
-                        log.debug("Path '{}' omitted from results due to missing read permissions for user {}",
-                                path.toPath(), authService.currentUsername());
-                    }
-                });
-        return aggregator;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/ivy/IvyService.java b/base/api/src/main/java/org/artifactory/ivy/IvyService.java
deleted file mode 100644
index ec1237a..0000000
--- a/base/api/src/main/java/org/artifactory/ivy/IvyService.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ivy;
-
-import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
-import org.artifactory.repo.RepoPath;
-
-import java.io.File;
-
-/**
- * @author Yoav Landman
- */
-public interface IvyService {
-    ModuleDescriptor parseIvyFile(RepoPath repoPath);
-
-    ModuleDescriptor parseIvyFile(File file);
-
-}
diff --git a/base/api/src/main/java/org/artifactory/log/logback/LogbackContextHelper.java b/base/api/src/main/java/org/artifactory/log/logback/LogbackContextHelper.java
deleted file mode 100644
index baf64ba..0000000
--- a/base/api/src/main/java/org/artifactory/log/logback/LogbackContextHelper.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.log.logback;
-
-import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.joran.JoranConfigurator;
-import ch.qos.logback.core.joran.spi.JoranException;
-import ch.qos.logback.core.util.StatusPrinter;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.common.ArtifactoryHome;
-
-/**
- * @author Yoav Landman
- */
-public abstract class LogbackContextHelper {
-    private LogbackContextHelper() {
-        // utility class
-    }
-
-    public static LoggerContext configure(LoggerContext lc, ArtifactoryHome artifactoryHome) {
-        return configure(lc, artifactoryHome, "");
-    }
-
-    public static LoggerContext configure(LoggerContext lc, ArtifactoryHome artifactoryHome, String contextId) {
-        try {
-            contextId = StringUtils.trimToEmpty(contextId);
-            contextId = "artifactory".equalsIgnoreCase(contextId) ? "" : contextId + " ";
-            contextId = StringUtils.isBlank(contextId) ? "" : contextId;
-            JoranConfigurator configurator = new JoranConfigurator();
-            lc.stop();
-            configurator.setContext(lc);
-            // Set the contextId to differentiate AOLs console logger logs
-            lc.putProperty("artifactory.contextId", StringUtils.uncapitalize(contextId));
-            // Set the artifactory.home so that tokens in the logback config file are extracted
-            lc.putProperty(ArtifactoryHome.SYS_PROP, artifactoryHome.getHomeDir().getAbsolutePath());
-            configurator.doConfigure(artifactoryHome.getLogbackConfig());
-            StatusPrinter.printIfErrorsOccured(lc);
-        } catch (JoranException je) {
-            StatusPrinter.print(lc);
-        }
-        return lc;
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/main/java/org/artifactory/log/logback/LogbackContextSelector.java b/base/api/src/main/java/org/artifactory/log/logback/LogbackContextSelector.java
deleted file mode 100644
index a5f8395..0000000
--- a/base/api/src/main/java/org/artifactory/log/logback/LogbackContextSelector.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.log.logback;
-
-import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.selector.ContextSelector;
-import ch.qos.logback.classic.util.ContextSelectorStaticBinder;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.ArtifactoryHome;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-/**
- * @author Yoav Landman
- */
-public class LogbackContextSelector implements ContextSelector {
-
-    private final ConcurrentMap<String, LoggerContext> loggerContextsByContextId;
-    private final LoggerContext defaultContext;
-
-    private static final ThreadLocal<LoggerContext> tlsLoggingContext = new ThreadLocal<>();
-    private static final ThreadLocal<LoggerConfigInfo> tlsConfigInfo = new ThreadLocal<>();
-
-    public LogbackContextSelector(LoggerContext context) {
-        loggerContextsByContextId = new ConcurrentHashMap<>();
-        defaultContext = context;
-    }
-
-    @Override
-    public LoggerContext getDefaultLoggerContext() {
-        return defaultContext;
-    }
-
-    @Override
-    public LoggerContext detachLoggerContext(String loggerContextName) {
-        return loggerContextsByContextId.remove(loggerContextName);
-    }
-
-    @Override
-    public LoggerContext getLoggerContext() {
-        //First check if ThreadLocal has been set already
-        LoggerContext loggerContext = tlsLoggingContext.get();
-        if (loggerContext != null) {
-            return loggerContext;
-        }
-        LoggerConfigInfo configInfo = getConfigInfo();
-        if (configInfo != null) {
-            //Try to get it from the cache by contextPath
-            String contextPath = configInfo.getContextId();
-            loggerContext = loggerContextsByContextId.get(contextPath);
-            if (loggerContext == null) {
-                //We have to create a new LoggerContext
-                loggerContext = new LoggerContext();
-                loggerContext.setName(contextPath);
-                ArtifactoryHome home = configInfo.getHome();
-                if (home == null) {
-                    throw new IllegalStateException(
-                            "Trying to create a new configuration but artifactory home is null.");
-                }
-                LogbackContextHelper.configure(loggerContext, home, configInfo.getContextId());
-                LoggerContext existingContext = loggerContextsByContextId.putIfAbsent(contextPath, loggerContext);
-                return existingContext == null ? loggerContext : existingContext;
-            } else {
-                return loggerContext;
-            }
-        } else {
-            //Return the default context
-            return defaultContext;
-        }
-    }
-
-    @Override
-    public List<String> getContextNames() {
-        List<String> list = new ArrayList<>();
-        list.addAll(loggerContextsByContextId.keySet());
-        return list;
-    }
-
-    @Override
-    public LoggerContext getLoggerContext(String name) {
-        return loggerContextsByContextId.get(name);
-    }
-
-    /**
-     * Returns the number of managed contexts Used for testing purposes
-     *
-     * @return the number of managed contexts
-     */
-    public int getCount() {
-        return loggerContextsByContextId.size();
-    }
-
-    public static void bind() {
-        LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
-        ContextSelector selector = ContextSelectorStaticBinder.getSingleton().getContextSelector();
-        if (selector instanceof LogbackContextSelector) {
-            tlsLoggingContext.set(context);
-        }
-    }
-
-    public static void unbind() {
-        tlsLoggingContext.remove();
-    }
-
-    public static void bindConfig(LoggerConfigInfo info) {
-        tlsConfigInfo.set(info);
-    }
-
-    public static void unbindConfig() {
-        tlsConfigInfo.remove();
-    }
-
-    /**
-     * Try to get a thread bound config (set during initialization). If there is no config info on the thread try
-     * creating it from artifactory home
-     */
-    private LoggerConfigInfo getConfigInfo() {
-        LoggerConfigInfo configInfo = tlsConfigInfo.get();
-        if (configInfo == null) {
-            ArtifactoryContext context = ContextHelper.get();
-            if (context != null) {
-                configInfo = new LoggerConfigInfo(context);
-            }
-        }
-        return configInfo;
-    }
-
-}
diff --git a/base/api/src/main/java/org/artifactory/log/logback/LoggerConfigInfo.java b/base/api/src/main/java/org/artifactory/log/logback/LoggerConfigInfo.java
deleted file mode 100644
index cdd86da..0000000
--- a/base/api/src/main/java/org/artifactory/log/logback/LoggerConfigInfo.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.log.logback;
-
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.common.ArtifactoryHome;
-
-import java.io.Serializable;
-
-/**
- * @author Yoav Landman
- */
-public class LoggerConfigInfo implements Serializable {
-
-    private String contextId;
-    private ArtifactoryHome home;
-
-    public LoggerConfigInfo(String contextId) {
-        this(contextId, null);
-    }
-
-    public LoggerConfigInfo(String contextId, ArtifactoryHome home) {
-        this.contextId = contextId;
-        this.home = home;
-    }
-
-    LoggerConfigInfo(ArtifactoryContext context) {
-        this(context.getContextId(), context.getArtifactoryHome());
-    }
-
-    String getContextId() {
-        return contextId;
-    }
-
-    ArtifactoryHome getHome() {
-        return home;
-    }
-}
diff --git a/base/api/src/main/java/org/artifactory/repo/remote/browse/RemoteItem.java b/base/api/src/main/java/org/artifactory/repo/remote/browse/RemoteItem.java
deleted file mode 100644
index 884711d..0000000
--- a/base/api/src/main/java/org/artifactory/repo/remote/browse/RemoteItem.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.remote.browse;
-
-import org.artifactory.util.PathUtils;
-
-import javax.annotation.Nonnull;
-
-/**
- * Holds information about a remote file or directory.
- *
- * @author Yossi Shaul
- */
-public class RemoteItem {
-    /**
-     * Absolute URL of the remote item.
-     */
-    private final String url;
-    /**
-     * True if the remote item is a directory.
-     */
-    private final boolean directory;
-    /**
-     * Size of the item in bytes.
-     */
-    private final long size;
-    /**
-     * Last modification time in millis. 0 if unknown.
-     */
-    private final long lastModified;
-    /**
-     * The effective url for linking this item, overriding {@link #url}
-     */
-    private String effectiveUrl;
-
-    public RemoteItem(@Nonnull String url, boolean directory) {
-        this(url, directory, 0, 0);
-    }
-
-    public RemoteItem(@Nonnull String url, boolean directory, long size, long lastModified) {
-        if (url == null) {
-            throw new NullPointerException("URL cannot be null");
-        }
-        this.url = url;
-        this.directory = directory;
-        this.size = size;
-        this.lastModified = lastModified;
-    }
-
-    /**
-     * @return The absolute URL to the remote item.
-     */
-    @Nonnull
-    public String getUrl() {
-        return url;
-    }
-
-    /**
-     * @return True if the remote item represents a directory.
-     */
-    public boolean isDirectory() {
-        return directory;
-    }
-
-    /**
-     * @return Size of the item in bytes. Returns 0 for directories.
-     */
-    public long getSize() {
-        return size;
-    }
-
-    /**
-     * @return Last modification time in millis. 0 if unknown.
-     */
-    public long getLastModified() {
-        return lastModified;
-    }
-
-    /**
-     * @return The name of the item (the last part of the URL after the last '/')
-     */
-    public String getName() {
-        return PathUtils.getFileName(url);
-    }
-
-    public String getEffectiveUrl() {
-        return effectiveUrl;
-    }
-
-    public void setEffectiveUrl(String effectiveUrl) {
-        this.effectiveUrl = effectiveUrl;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        RemoteItem that = (RemoteItem) o;
-
-        if (directory != that.directory) {
-            return false;
-        }
-        if (!url.equals(that.url)) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = url.hashCode();
-        result = 31 * result + (directory ? 1 : 0);
-        return result;
-    }
-
-    @Override
-    public String toString() {
-        final StringBuilder sb = new StringBuilder();
-        sb.append("RemoteItem");
-        sb.append("{url='").append(url).append('\'');
-        sb.append(", directory=").append(directory);
-        sb.append(", size=").append(size);
-        sb.append(", lastModified=").append(lastModified);
-        sb.append('}');
-        return sb.toString();
-    }
-
-}
diff --git a/base/api/src/main/java/org/artifactory/request/ArtifactoryRequest.java b/base/api/src/main/java/org/artifactory/request/ArtifactoryRequest.java
deleted file mode 100644
index ef76f3c..0000000
--- a/base/api/src/main/java/org/artifactory/request/ArtifactoryRequest.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.request;
-
-public interface ArtifactoryRequest extends Request {
-    @Deprecated
-    String ORIGIN_ARTIFACTORY = "Origin-Artifactory";
-
-    String ARTIFACTORY_ORIGINATED = "X-Artifactory-Originated";
-
-    String ARTIFACTORY_OVERRIDE_BASE_URL = "X-Artifactory-Override-Base-Url";
-
-    String CHECKSUM_SHA1 = "X-Checksum-Sha1";
-
-    String CHECKSUM_SHA256 = "X-Checksum-Sha256";
-
-    String CHECKSUM_MD5 = "X-Checksum-Md5";
-
-    String ACCEPT_RANGES = "Accept-Ranges";
-
-    String FILE_NAME = "X-Artifactory-Filename";
-
-    /**
-     * An header to trigger checksum deploy (when the value is true). Request must also include
-     * {@link org.artifactory.request.ArtifactoryRequest#CHECKSUM_SHA1}.
-     */
-    String CHECKSUM_DEPLOY = "X-Checksum-Deploy";
-
-    /**
-     * Header to trigger bundle archive deployment (supports zip/tar/tar.gz)
-     */
-    String EXPLODE_ARCHIVE = "X-Explode-Archive";
-
-    String RESULT_DETAIL = "X-Result-Detail";
-
-    String PARAM_SKIP_JAR_INDEXING = "artifactory.skipJarIndexing";
-
-    String PARAM_FORCE_DOWNLOAD_IF_NEWER = "artifactory.forceDownloadIfNewer";
-
-    String PARAM_SEARCH_FOR_EXISTING_RESOURCE_ON_REMOTE_REQUEST =
-            "artifactory.searchForExistingResourceOnRemoteRequest";
-
-    String PARAM_ALTERNATIVE_REMOTE_DOWNLOAD_URL = "artifactory.alternativeRemoteDownloadUrl";
-
-    String PARAM_REPLICATION_DOWNLOAD_REQUESET = "artifactory.replicationDownloadRequest";
-
-    String PARAM_FOLDER_REDIRECT_ASSERTION = "artifactory.disableFolderRedirectAssertion";
-
-    /**
-     * Will replace the HEAD request in RetrieveInfo with a GET request
-     */
-    String PARAM_REPLACE_HEAD_IN_RETRIEVE_INFO_WITH_GET = "artifactory.replaceHeadInRetrieveInfoWithGet";
-
-    /**
-     * Will skip the encoding of the alternative remote download url, assumes it's already encoded
-     */
-    String PARAM_SKIP_ENCODING = "artifactory.skipEncoding";
-
-    /**
-     * The path prefix name for list browsing.
-     */
-    String LIST_BROWSING_PATH = "list";
-
-    /**
-     * The path prefix name for simple browsing.
-     */
-    String SIMPLE_BROWSING_PATH = "simple";
-
-    String LAST_MODIFIED = "X-Artifactory-Last-Modified";
-
-    String CREATED = "X-Artifactory-Created";
-
-    String MODIFIED_BY = "X-Artifactory-Modified-By";
-
-    String CREATED_BY = "X-Artifactory-Created-By";
-
-    String getRepoKey();
-
-    String getPath();
-
-    boolean isMetadata();
-
-    /**
-     * Indicates whether the request is coming back to the same proxy as a result of reverse mirroring
-     */
-    boolean isRecursive();
-
-    long getModificationTime();
-
-    String getName();
-
-    /**
-     * Indicates whether the request if for a directory instead of a file
-     *
-     * @return True if the request uri if for a directory
-     */
-    boolean isDirectoryRequest();
-}
diff --git a/base/api/src/test/java/org/artifactory/addon/layouts/translate/ChecksumTranslatorFilterTest.java b/base/api/src/test/java/org/artifactory/addon/layouts/translate/ChecksumTranslatorFilterTest.java
deleted file mode 100644
index 923e92e..0000000
--- a/base/api/src/test/java/org/artifactory/addon/layouts/translate/ChecksumTranslatorFilterTest.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.layouts.translate;
-
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the path translators checksum filter
- *
- * @author Noam Y. Tenne
- */
- at Test
-public class ChecksumTranslatorFilterTest extends ArtifactoryHomeBoundTest {
-
-    public void testInvalidPaths() {
-        ChecksumTranslatorFilter filter = new ChecksumTranslatorFilter();
-        assertFalse(filter.filterRequired(null));
-        assertFalse(filter.filterRequired(""));
-        assertFalse(filter.filterRequired(" "));
-        assertFalse(filter.filterRequired("momo.jar"));
-        assertFalse(filter.filterRequired("momo.jar:metadata.xml"));
-        assertFalse(filter.filterRequired("momo.tar.gz"));
-        assertFalse(filter.filterRequired("org.momo/popo/momo.jar"));
-        assertFalse(filter.filterRequired("org.momo/popo/momo.jar:metadata.xml"));
-        assertFalse(filter.filterRequired("org.momo/popo/momo.tar.gz"));
-        assertFalse(filter.filterRequired("org/momo/popo/momo.jar"));
-        assertFalse(filter.filterRequired("org/momo/popo/momo.jar:metadata.xml"));
-        assertFalse(filter.filterRequired("org/momo/popo/momo.tar.gz"));
-    }
-
-    public void testValidMd5Test() {
-        String path = "org/momo/popo/momo.jar.md5";
-        ChecksumTranslatorFilter filter = new ChecksumTranslatorFilter();
-        assertTrue(filter.filterRequired(path));
-        assertEquals(filter.getFilteredContent(path), ".md5");
-        assertEquals(filter.stripPath(path), "org/momo/popo/momo.jar");
-        assertEquals(filter.applyFilteredContent("org/momo/popo/momo.jar", ".md5"), path);
-    }
-
-    public void testValidSha1Test() {
-        String path = "org.momo/popo/momo.jar.sha1";
-        ChecksumTranslatorFilter filter = new ChecksumTranslatorFilter();
-        assertTrue(filter.filterRequired(path));
-        assertEquals(filter.getFilteredContent(path), ".sha1");
-        assertEquals(filter.stripPath(path), "org.momo/popo/momo.jar");
-        assertEquals(filter.applyFilteredContent("org.momo/popo/momo.jar", ".sha1"), path);
-    }
-}
diff --git a/base/api/src/test/java/org/artifactory/addon/layouts/translate/MetadataTranslatorFilterTest.java b/base/api/src/test/java/org/artifactory/addon/layouts/translate/MetadataTranslatorFilterTest.java
deleted file mode 100644
index 2544e48..0000000
--- a/base/api/src/test/java/org/artifactory/addon/layouts/translate/MetadataTranslatorFilterTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.layouts.translate;
-
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the path translators metadata filter
- *
- * @author Noam Y. Tenne
- */
- at Test
-public class MetadataTranslatorFilterTest extends ArtifactoryHomeBoundTest {
-
-    public void testInvalidPaths() {
-        MetadataTranslatorFilter filter = new MetadataTranslatorFilter();
-        assertFalse(filter.filterRequired(null));
-        assertFalse(filter.filterRequired(""));
-        assertFalse(filter.filterRequired(" "));
-        assertFalse(filter.filterRequired("momo.jar"));
-        assertFalse(filter.filterRequired("momo.jar.sha1"));
-        assertFalse(filter.filterRequired("momo.tar.gz"));
-        assertFalse(filter.filterRequired("org.momo/popo/momo.jar"));
-        assertFalse(filter.filterRequired("org.momo/popo/momo.jar.md5"));
-        assertFalse(filter.filterRequired("org.momo/popo/momo.tar.gz"));
-        assertFalse(filter.filterRequired("org/momo/popo/momo.jar"));
-        assertFalse(filter.filterRequired("org/momo/popo/momo.jar.sha1"));
-        assertFalse(filter.filterRequired("org/momo/popo/momo.tar.gz"));
-    }
-
-    public void testValidMetadataTest() {
-        String path = "org/momo/popo/momo.jar:metadata.xml";
-        MetadataTranslatorFilter filter = new MetadataTranslatorFilter();
-        assertTrue(filter.filterRequired(path));
-        assertEquals(filter.getFilteredContent(path), "metadata.xml");
-        assertEquals(filter.stripPath(path), "org/momo/popo/momo.jar");
-        assertEquals(filter.applyFilteredContent("org/momo/popo/momo.jar", "metadata.xml"), path);
-    }
-}
diff --git a/base/api/src/test/java/org/artifactory/addon/layouts/translate/PathTranslationHelperTest.java b/base/api/src/test/java/org/artifactory/addon/layouts/translate/PathTranslationHelperTest.java
deleted file mode 100644
index 260db7e..0000000
--- a/base/api/src/test/java/org/artifactory/addon/layouts/translate/PathTranslationHelperTest.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.layouts.translate;
-
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import static org.artifactory.util.RepoLayoutUtils.*;
-
-/**
- * Tests the module info path translator
- *
- * @author Noam Y. Tenne
- */
- at Test
-public class PathTranslationHelperTest extends ArtifactoryHomeBoundTest {
-
-    private static final String[] MAVEN_PATHS = {"org/momo/popo/1.0/popo-1.0.jar", "org/momo/popo/1.0/popo-1.0.tar.gz",
-            "org/momo/popo/1.0/popo-1.0.jar.md5", "org/momo/popo/1.0/popo-1.0.jar:metadata.xml",
-            "org/momo/popo/1.0/popo-1.0.pom", "org/momo/popo/1.0/popo-1.0-sources.jar",
-            "org/momo/popo/1.0/popo-1.0-sources.tar.gz", "org/momo/popo/1.0/popo-1.0-sources.jar.md5",
-            "org/momo/popo/1.0/popo-1.0-sources.jar:metadata.xml",
-            "really/super/ultra/mega/long/artifact-of-death/1.0/artifact-of-death-1.0.jar",
-            "really/super/ultra/mega-hyper/long/artifact-of-death/1.0/artifact-of-death-1.0-sources.jar"};
-
-    private static final String[] IVY_PATHS = {"org.momo/popo/1.0/jars/popo-1.0.jar",
-            "org.momo/popo/1.0/tar.gzs/popo-1.0.tar.gz", "org.momo/popo/1.0/jars/popo-1.0.jar.md5",
-            "org.momo/popo/1.0/jars/popo-1.0.jar:metadata.xml", "org.momo/popo/1.0/ivys/ivy-1.0.xml",
-            "org.momo/popo/1.0/java-sources/popo-sources-1.0.jar", "org.momo/popo/1.0/tar.gzs/popo-sources-1.0.tar.gz",
-            "org.momo/popo/1.0/java-sources/popo-sources-1.0.jar.md5",
-            "org.momo/popo/1.0/java-sources/popo-sources-1.0.jar:metadata.xml",
-            "really.super.ultra.mega.long/artifact-of-death/1.0/jars/artifact-of-death-1.0.jar",
-            "really.super.ultra.mega-hyper.long/artifact-of-death/1.0/java-sources/artifact-of-death-sources-1.0.jar"};
-
-    private static final String[] GRADLE_PATHS = {"org.momo/popo/1.0/popo-1.0.jar", "org.momo/popo/1.0/popo-1.0.tar.gz",
-            "org.momo/popo/1.0/popo-1.0.jar.md5", "org.momo/popo/1.0/popo-1.0.jar:metadata.xml",
-            "org.momo/popo/ivy-1.0.xml", "org.momo/popo/1.0/popo-1.0-sources.jar",
-            "org.momo/popo/1.0/popo-1.0-sources.tar.gz", "org.momo/popo/1.0/popo-1.0-sources.jar.md5",
-            "org.momo/popo/1.0/popo-1.0-sources.jar:metadata.xml",
-            "really.super.ultra.mega.long/artifact-of-death/1.0/artifact-of-death-1.0.jar",
-            "really.super.ultra.mega-hyper.long/artifact-of-death/1.0/artifact-of-death-1.0-sources.jar"};
-
-    public void testMavenToMaven() {
-        for (String mavenPath : MAVEN_PATHS) {
-            assertSameTranslation(MAVEN_2_DEFAULT, mavenPath);
-        }
-    }
-
-    public void testMavenToIvy() {
-        assertCrossTranslation(MAVEN_2_DEFAULT, IVY_DEFAULT, MAVEN_PATHS[0], "org.momo/popo/1.0/jars/popo-1.0.jar");
-        assertCrossTranslation(MAVEN_2_DEFAULT, IVY_DEFAULT, MAVEN_PATHS[1],
-                "org.momo/popo/1.0/tar.gzs/popo-1.0.tar.gz");
-        assertCrossTranslation(MAVEN_2_DEFAULT, IVY_DEFAULT, MAVEN_PATHS[2], "org.momo/popo/1.0/jars/popo-1.0.jar.md5");
-        assertCrossTranslation(MAVEN_2_DEFAULT, IVY_DEFAULT, MAVEN_PATHS[3],
-                "org.momo/popo/1.0/jars/popo-1.0.jar:metadata.xml");
-        assertCrossTranslation(MAVEN_2_DEFAULT, IVY_DEFAULT, MAVEN_PATHS[4], "org.momo/popo/1.0/poms/popo-1.0.pom");
-        assertCrossTranslation(MAVEN_2_DEFAULT, IVY_DEFAULT, MAVEN_PATHS[5],
-                "org.momo/popo/1.0/jars/popo-sources-1.0.jar");
-        assertCrossTranslation(MAVEN_2_DEFAULT, IVY_DEFAULT, MAVEN_PATHS[6],
-                "org.momo/popo/1.0/tar.gzs/popo-sources-1.0.tar.gz");
-        assertCrossTranslation(MAVEN_2_DEFAULT, IVY_DEFAULT, MAVEN_PATHS[7],
-                "org.momo/popo/1.0/jars/popo-sources-1.0.jar.md5");
-        assertCrossTranslation(MAVEN_2_DEFAULT, IVY_DEFAULT, MAVEN_PATHS[8],
-                "org.momo/popo/1.0/jars/popo-sources-1.0.jar:metadata.xml");
-        assertCrossTranslation(MAVEN_2_DEFAULT, IVY_DEFAULT, MAVEN_PATHS[9],
-                "really.super.ultra.mega.long/artifact-of-death/1.0/jars/artifact-of-death-1.0.jar");
-        assertCrossTranslation(MAVEN_2_DEFAULT, IVY_DEFAULT, MAVEN_PATHS[10],
-                "really.super.ultra.mega-hyper.long/artifact-of-death/1.0/jars/artifact-of-death-sources-1.0.jar");
-    }
-
-    public void testMavenToGradle() {
-        assertCrossTranslation(MAVEN_2_DEFAULT, GRADLE_DEFAULT, MAVEN_PATHS[0], "org.momo/popo/1.0/popo-1.0.jar");
-        assertCrossTranslation(MAVEN_2_DEFAULT, GRADLE_DEFAULT, MAVEN_PATHS[1], "org.momo/popo/1.0/popo-1.0.tar.gz");
-        assertCrossTranslation(MAVEN_2_DEFAULT, GRADLE_DEFAULT, MAVEN_PATHS[2], "org.momo/popo/1.0/popo-1.0.jar.md5");
-        assertCrossTranslation(MAVEN_2_DEFAULT, GRADLE_DEFAULT, MAVEN_PATHS[3],
-                "org.momo/popo/1.0/popo-1.0.jar:metadata.xml");
-        assertCrossTranslation(MAVEN_2_DEFAULT, GRADLE_DEFAULT, MAVEN_PATHS[4], "org.momo/popo/1.0/popo-1.0.pom");
-        assertCrossTranslation(MAVEN_2_DEFAULT, GRADLE_DEFAULT, MAVEN_PATHS[5],
-                "org.momo/popo/1.0/popo-1.0-sources.jar");
-        assertCrossTranslation(MAVEN_2_DEFAULT, GRADLE_DEFAULT, MAVEN_PATHS[6],
-                "org.momo/popo/1.0/popo-1.0-sources.tar.gz");
-        assertCrossTranslation(MAVEN_2_DEFAULT, GRADLE_DEFAULT, MAVEN_PATHS[7],
-                "org.momo/popo/1.0/popo-1.0-sources.jar.md5");
-        assertCrossTranslation(MAVEN_2_DEFAULT, GRADLE_DEFAULT, MAVEN_PATHS[8],
-                "org.momo/popo/1.0/popo-1.0-sources.jar:metadata.xml");
-        assertCrossTranslation(MAVEN_2_DEFAULT, GRADLE_DEFAULT, MAVEN_PATHS[9],
-                "really.super.ultra.mega.long/artifact-of-death/1.0/artifact-of-death-1.0.jar");
-        assertCrossTranslation(MAVEN_2_DEFAULT, GRADLE_DEFAULT, MAVEN_PATHS[10],
-                "really.super.ultra.mega-hyper.long/artifact-of-death/1.0/artifact-of-death-1.0-sources.jar");
-    }
-
-    public void testIvyToIvy() {
-        for (String ivyPath : IVY_PATHS) {
-            assertSameTranslation(IVY_DEFAULT, ivyPath);
-        }
-    }
-
-    public void testIvyToMaven() {
-        assertCrossTranslation(IVY_DEFAULT, MAVEN_2_DEFAULT, IVY_PATHS[0], "org/momo/popo/1.0/popo-1.0.jar");
-        assertCrossTranslation(IVY_DEFAULT, MAVEN_2_DEFAULT, IVY_PATHS[1], "org/momo/popo/1.0/popo-1.0.tar.gz");
-        assertCrossTranslation(IVY_DEFAULT, MAVEN_2_DEFAULT, IVY_PATHS[2], "org/momo/popo/1.0/popo-1.0.jar.md5");
-        assertCrossTranslation(IVY_DEFAULT, MAVEN_2_DEFAULT, IVY_PATHS[3],
-                "org/momo/popo/1.0/popo-1.0.jar:metadata.xml");
-        assertCrossTranslation(IVY_DEFAULT, MAVEN_2_DEFAULT, IVY_PATHS[4], "org/momo/popo/1.0/popo-1.0.xml");
-        assertCrossTranslation(IVY_DEFAULT, MAVEN_2_DEFAULT, IVY_PATHS[5], "org/momo/popo/1.0/popo-1.0-sources.jar");
-        assertCrossTranslation(IVY_DEFAULT, MAVEN_2_DEFAULT, IVY_PATHS[6], "org/momo/popo/1.0/popo-1.0-sources.tar.gz");
-        assertCrossTranslation(IVY_DEFAULT, MAVEN_2_DEFAULT, IVY_PATHS[7],
-                "org/momo/popo/1.0/popo-1.0-sources.jar.md5");
-        assertCrossTranslation(IVY_DEFAULT, MAVEN_2_DEFAULT, IVY_PATHS[8],
-                "org/momo/popo/1.0/popo-1.0-sources.jar:metadata.xml");
-        assertCrossTranslation(IVY_DEFAULT, MAVEN_2_DEFAULT, IVY_PATHS[9],
-                "really/super/ultra/mega/long/artifact-of-death/1.0/artifact-of-death-1.0.jar");
-        assertCrossTranslation(IVY_DEFAULT, MAVEN_2_DEFAULT, IVY_PATHS[10],
-                "really/super/ultra/mega-hyper/long/artifact-of-death/1.0/artifact-of-death-1.0-sources.jar");
-    }
-
-    public void testIvyToGradle() {
-        assertCrossTranslation(IVY_DEFAULT, GRADLE_DEFAULT, IVY_PATHS[0], "org.momo/popo/1.0/popo-1.0.jar");
-        assertCrossTranslation(IVY_DEFAULT, GRADLE_DEFAULT, IVY_PATHS[1], "org.momo/popo/1.0/popo-1.0.tar.gz");
-        assertCrossTranslation(IVY_DEFAULT, GRADLE_DEFAULT, IVY_PATHS[2], "org.momo/popo/1.0/popo-1.0.jar.md5");
-        assertCrossTranslation(IVY_DEFAULT, GRADLE_DEFAULT, IVY_PATHS[3],
-                "org.momo/popo/1.0/popo-1.0.jar:metadata.xml");
-        assertCrossTranslation(IVY_DEFAULT, GRADLE_DEFAULT, IVY_PATHS[4], "org.momo/popo/ivy-1.0.xml");
-        assertCrossTranslation(IVY_DEFAULT, GRADLE_DEFAULT, IVY_PATHS[5], "org.momo/popo/1.0/popo-1.0-sources.jar");
-        assertCrossTranslation(IVY_DEFAULT, GRADLE_DEFAULT, IVY_PATHS[6], "org.momo/popo/1.0/popo-1.0-sources.tar.gz");
-        assertCrossTranslation(IVY_DEFAULT, GRADLE_DEFAULT, IVY_PATHS[7], "org.momo/popo/1.0/popo-1.0-sources.jar.md5");
-        assertCrossTranslation(IVY_DEFAULT, GRADLE_DEFAULT, IVY_PATHS[8],
-                "org.momo/popo/1.0/popo-1.0-sources.jar:metadata.xml");
-        assertCrossTranslation(IVY_DEFAULT, GRADLE_DEFAULT, IVY_PATHS[9],
-                "really.super.ultra.mega.long/artifact-of-death/1.0/artifact-of-death-1.0.jar");
-        assertCrossTranslation(IVY_DEFAULT, GRADLE_DEFAULT, IVY_PATHS[10],
-                "really.super.ultra.mega-hyper.long/artifact-of-death/1.0/artifact-of-death-1.0-sources.jar");
-    }
-
-    public void testGradleToGradle() {
-        for (String gradlePath : GRADLE_PATHS) {
-            assertSameTranslation(GRADLE_DEFAULT, gradlePath);
-        }
-    }
-
-    public void testGradleToMaven() {
-        assertCrossTranslation(GRADLE_DEFAULT, MAVEN_2_DEFAULT, GRADLE_PATHS[0], "org/momo/popo/1.0/popo-1.0.jar");
-        assertCrossTranslation(GRADLE_DEFAULT, MAVEN_2_DEFAULT, GRADLE_PATHS[1], "org/momo/popo/1.0/popo-1.0.tar.gz");
-        assertCrossTranslation(GRADLE_DEFAULT, MAVEN_2_DEFAULT, GRADLE_PATHS[2], "org/momo/popo/1.0/popo-1.0.jar.md5");
-        assertCrossTranslation(GRADLE_DEFAULT, MAVEN_2_DEFAULT, GRADLE_PATHS[3],
-                "org/momo/popo/1.0/popo-1.0.jar:metadata.xml");
-        assertCrossTranslation(GRADLE_DEFAULT, MAVEN_2_DEFAULT, GRADLE_PATHS[4], "org/momo/popo/1.0/popo-1.0.xml");
-        assertCrossTranslation(GRADLE_DEFAULT, MAVEN_2_DEFAULT, GRADLE_PATHS[5],
-                "org/momo/popo/1.0/popo-1.0-sources.jar");
-        assertCrossTranslation(GRADLE_DEFAULT, MAVEN_2_DEFAULT, GRADLE_PATHS[6],
-                "org/momo/popo/1.0/popo-1.0-sources.tar.gz");
-        assertCrossTranslation(GRADLE_DEFAULT, MAVEN_2_DEFAULT, GRADLE_PATHS[7],
-                "org/momo/popo/1.0/popo-1.0-sources.jar.md5");
-        assertCrossTranslation(GRADLE_DEFAULT, MAVEN_2_DEFAULT, GRADLE_PATHS[8],
-                "org/momo/popo/1.0/popo-1.0-sources.jar:metadata.xml");
-        assertCrossTranslation(GRADLE_DEFAULT, MAVEN_2_DEFAULT, GRADLE_PATHS[9],
-                "really/super/ultra/mega/long/artifact-of-death/1.0/artifact-of-death-1.0.jar");
-        assertCrossTranslation(GRADLE_DEFAULT, MAVEN_2_DEFAULT, GRADLE_PATHS[10],
-                "really/super/ultra/mega-hyper/long/artifact-of-death/1.0/artifact-of-death-1.0-sources.jar");
-    }
-
-    public void testGradleToIvy() {
-        assertCrossTranslation(GRADLE_DEFAULT, IVY_DEFAULT, GRADLE_PATHS[0], "org.momo/popo/1.0/jars/popo-1.0.jar");
-        assertCrossTranslation(GRADLE_DEFAULT, IVY_DEFAULT, GRADLE_PATHS[1],
-                "org.momo/popo/1.0/tar.gzs/popo-1.0.tar.gz");
-        assertCrossTranslation(GRADLE_DEFAULT, IVY_DEFAULT, GRADLE_PATHS[2], "org.momo/popo/1.0/jars/popo-1.0.jar.md5");
-        assertCrossTranslation(GRADLE_DEFAULT, IVY_DEFAULT, GRADLE_PATHS[3],
-                "org.momo/popo/1.0/jars/popo-1.0.jar:metadata.xml");
-        assertCrossTranslation(GRADLE_DEFAULT, IVY_DEFAULT, GRADLE_PATHS[4], "org.momo/popo/1.0/xmls/ivy-1.0.xml");
-        assertCrossTranslation(GRADLE_DEFAULT, IVY_DEFAULT, GRADLE_PATHS[5],
-                "org.momo/popo/1.0/jars/popo-sources-1.0.jar");
-        assertCrossTranslation(GRADLE_DEFAULT, IVY_DEFAULT, GRADLE_PATHS[6],
-                "org.momo/popo/1.0/tar.gzs/popo-sources-1.0.tar.gz");
-        assertCrossTranslation(GRADLE_DEFAULT, IVY_DEFAULT, GRADLE_PATHS[7],
-                "org.momo/popo/1.0/jars/popo-sources-1.0.jar.md5");
-        assertCrossTranslation(GRADLE_DEFAULT, IVY_DEFAULT, GRADLE_PATHS[8],
-                "org.momo/popo/1.0/jars/popo-sources-1.0.jar:metadata.xml");
-        assertCrossTranslation(GRADLE_DEFAULT, IVY_DEFAULT, GRADLE_PATHS[9],
-                "really.super.ultra.mega.long/artifact-of-death/1.0/jars/artifact-of-death-1.0.jar");
-        assertCrossTranslation(GRADLE_DEFAULT, IVY_DEFAULT, GRADLE_PATHS[10],
-                "really.super.ultra.mega-hyper.long/artifact-of-death/1.0/jars/artifact-of-death-sources-1.0.jar");
-    }
-
-    private void assertSameTranslation(RepoLayout layout, String path) {
-        assertCrossTranslation(layout, layout, path, path);
-    }
-
-    private void assertCrossTranslation(RepoLayout source, RepoLayout target, String sourcePath, String expectedPath) {
-        Assert.assertEquals(new PathTranslationHelper().translatePath(source, target, sourcePath, null), expectedPath);
-    }
-}
diff --git a/base/api/src/test/java/org/artifactory/api/common/MultiStatusHolderTest.java b/base/api/src/test/java/org/artifactory/api/common/MultiStatusHolderTest.java
deleted file mode 100644
index 59d5970..0000000
--- a/base/api/src/test/java/org/artifactory/api/common/MultiStatusHolderTest.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.common;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the MultiStatusHolder.
- *
- * @author Yossi Shaul
- */
- at Test
-public class MultiStatusHolderTest {
-    private static final Logger log = LoggerFactory.getLogger(MultiStatusHolderTest.class);
-    private BasicStatusHolder toMerge;
-    private BasicStatusHolder target;
-
-    @BeforeMethod
-    void initStatusHolders() {
-        toMerge = new BasicStatusHolder();
-        toMerge.setActivateLogging(false);
-        target = new BasicStatusHolder();
-        target.setActivateLogging(false);
-    }
-
-    public void mergeTwoStatusHolders() {
-        toMerge.warn("warning", log);
-        toMerge.status("ok", log);
-
-        target.status("target1", log);
-        target.status("target2", log);
-
-        assertFalse(target.hasWarnings());
-        assertEquals(target.getEntries().size(), 2);
-
-        // now merge
-        target.merge(toMerge);
-
-        assertTrue(target.hasWarnings());
-        assertFalse(target.hasErrors());
-        assertEquals(target.getEntries().size(), 4);
-    }
-
-    public void mergeWithEmptyStatusHolder() {
-        target.setActivateLogging(false);
-        target.error("target1", log);
-        target.status("target2", log);
-
-        target.merge(toMerge);
-
-        assertFalse(target.hasWarnings());
-        assertTrue(target.hasErrors());
-        assertEquals(target.getEntries().size(), 2);
-    }
-
-    public void mergeWithErrorOverride() {
-        toMerge.error("toMergeError", log);
-        target.error("targetError", log);
-
-        target.merge(toMerge);
-
-        assertTrue(target.hasErrors());
-        assertEquals(target.getErrors().size(), 2);
-        assertEquals(target.getLastError().getMessage(), "toMergeError");
-    }
-
-    public void mergeWithSingleStatusHolder() {
-        BasicStatusHolder single = new BasicStatusHolder();
-        single.error("error", log);
-
-        target.status("target1", log);
-        target.status("target2", log);
-
-        assertFalse(target.hasWarnings());
-        assertEquals(target.getEntries().size(), 2);
-
-        // now merge
-        target.merge(single);
-
-        assertFalse(target.hasWarnings());
-        assertTrue(target.hasErrors());
-        assertEquals(target.getEntries().size(), 3);
-
-        single = new BasicStatusHolder();
-        single.warn("warning", log);
-
-        // merge again
-        target.merge(single);
-
-        assertTrue(target.hasWarnings());
-        assertTrue(target.hasErrors());
-        assertEquals(target.getEntries().size(), 4);
-    }
-
-}
diff --git a/base/api/src/test/java/org/artifactory/api/config/ExportSettingsTest.java b/base/api/src/test/java/org/artifactory/api/config/ExportSettingsTest.java
deleted file mode 100644
index 5b36eb9..0000000
--- a/base/api/src/test/java/org/artifactory/api/config/ExportSettingsTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.config;
-
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.artifactory.sapi.common.ExportSettings;
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the ExportSettinds.
- *
- * @author Yossi Shaul
- */
- at Test
-public class ExportSettingsTest {
-
-    public void fileConstructor() {
-        File dir = new File("base");
-        ExportSettings settings = new ExportSettingsImpl(dir);
-        assertEquals(settings.getBaseDir(), dir);
-        assertNotNull(settings.getTime());
-        assertFalse(settings.isM2Compatible());
-        assertFalse(settings.isCreateArchive());
-        assertFalse(settings.isIgnoreRepositoryFilteringRulesOn());
-        assertTrue(settings.isIncludeMetadata());
-        assertFalse(settings.isIncremental());
-    }
-
-    public void copyConstructor() {
-        File base = new File("bases");
-        ExportSettingsImpl orig = new ExportSettingsImpl(base);
-        orig.setIgnoreRepositoryFilteringRulesOn(true);
-        orig.setIncremental(true);
-
-        ExportSettings copy = new ExportSettingsImpl(base, orig);
-        assertTrue(EqualsBuilder.reflectionEquals(orig, copy), "Reflection comparison after " +
-                "copy constructor failed");
-
-        copy = new ExportSettingsImpl(new File("base2"), orig);
-        assertFalse(copy.getBaseDir().equals(base), "The copy constructor shouldn't copy the base dir");
-    }
-
-}
diff --git a/base/api/src/test/java/org/artifactory/api/mail/MailServerConfigurationTest.java b/base/api/src/test/java/org/artifactory/api/mail/MailServerConfigurationTest.java
deleted file mode 100644
index 4cc5232..0000000
--- a/base/api/src/test/java/org/artifactory/api/mail/MailServerConfigurationTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.mail;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
-
-/**
- * Tests the mail server configuration object
- *
- * @author Noam Y. Tenne
- */
- at Test
-public class MailServerConfigurationTest {
-
-    /**
-     * Tests the state of the configuration after constructing the the main constructor
-     */
-    public void testMainConstructor() {
-        String host = "momo";
-        int port = 2131;
-        String username = "popo";
-        String password = "jojo";
-        String from = "mitzi";
-        String subjectPrefix = "gogo";
-
-        MailServerConfiguration config = new MailServerConfiguration(true, host, port, username, password, from,
-                subjectPrefix, true, true, "http://artifactory.lal");
-
-        assertEquals(config.isEnabled(), true, "Unexpected mail server activity state.");
-        assertEquals(config.getHost(), host, "Unexpected mail server host.");
-        assertEquals(config.getPort(), port, "Unexpected mail server port.");
-        assertEquals(config.getUsername(), username, "Unexpected mail server username.");
-        assertEquals(config.getPassword(), password, "Unexpected mail server password.");
-        assertEquals(config.getFrom(), from, "Unexpected mail server from.");
-        assertEquals(config.getSubjectPrefix(), subjectPrefix, "Unexpected mail server subject prefix.");
-        assertTrue(config.isUseSsl(), "Unexpected mail server SSL state.");
-        assertTrue(config.isUseTls(), "Unexpected mail server TLS state.");
-        assertEquals(config.getArtifactoryUrl(), "http://artifactory.lal");
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/test/java/org/artifactory/api/mime/NamingUtilsTest.java b/base/api/src/test/java/org/artifactory/api/mime/NamingUtilsTest.java
deleted file mode 100644
index 83dadbc..0000000
--- a/base/api/src/test/java/org/artifactory/api/mime/NamingUtilsTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.mime;
-
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.testng.annotations.Test;
-
-import static org.artifactory.mime.NamingUtils.*;
-import static org.testng.Assert.*;
-
-/**
- * @author yoavl
- */
- at Test
-public class NamingUtilsTest extends ArtifactoryHomeBoundTest {
-
-    public void testIsMetadata() {
-        assertFalse(isMetadata("path/1.0-SNAPSHOT/maven-metadata.xml"));
-        assertTrue(isMetadata("path/1.0/resource:md"));
-    }
-
-    public void testIsProperties() {
-        assertTrue(isProperties("path/1.0-SNAPSHOT/maven-metadata.xml:properties"));
-        assertTrue(isProperties("path/1.0/resource:properties"));
-        assertFalse(isProperties("path/1.0/resource:md"));
-        assertFalse(isProperties("path/1.0:properties/resource"));
-    }
-
-    public void testIsMetadataChecksum() {
-        assertFalse(isMetadataChecksum("path/1.0-SNAPSHOT/maven-metadata.xml"));
-        assertFalse(isMetadataChecksum("1.0-SNAPSHOT/maven-metadata.xml.bla1"));
-        assertFalse(isMetadataChecksum("1.0-SNAPSHOT/maven-metadata.xml.sha1"));
-        assertFalse(isMetadataChecksum("maven-metadata.xml.md5"));
-        assertFalse(isMetadataChecksum("path/1.0/resource:md"));
-        assertTrue(isMetadataChecksum("path/1.0/resource:md.md5"));
-        assertTrue(isMetadataChecksum("path/1.0/resource:md.sha1"));
-    }
-
-    public void testJavaSourceNameFromClassName() {
-        assertEquals(javaSourceNameFromClassName("/a/b/c.class"), "/a/b/c.java");
-        assertEquals(javaSourceNameFromClassName("c.bla"), "c.bla");
-        assertEquals(javaSourceNameFromClassName("a$1.class"), "a.java");
-        assertEquals(javaSourceNameFromClassName("a$b$c.class"), "a.java");
-        assertEquals(javaSourceNameFromClassName("z/y/x/a$b$c.class"), "z/y/x/a.java");
-    }
-
-    public void testIsViewable() {
-        assertFalse(isViewable("a.class"));
-        assertFalse(isViewable("a/b/c.class"));
-        assertFalse(isViewable("/c.class"));
-
-        assertTrue(isViewable("a.java"));
-        assertTrue(isViewable("a.b.c.groovy"));
-        assertTrue(isViewable("a.b.c.gradle"));
-        assertTrue(isViewable("ivy-4.3.xml"));
-        assertTrue(isViewable("a.ivy"));
-        assertTrue(isViewable("a.xml"));
-        assertTrue(isViewable("a.css"));
-        assertTrue(isViewable("a.html"));
-    }
-}
diff --git a/base/api/src/test/java/org/artifactory/api/module/BaseModuleInfoUtilsTest.java b/base/api/src/test/java/org/artifactory/api/module/BaseModuleInfoUtilsTest.java
deleted file mode 100644
index 9354c87..0000000
--- a/base/api/src/test/java/org/artifactory/api/module/BaseModuleInfoUtilsTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.module;
-
-import org.artifactory.descriptor.repo.RepoLayout;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * @author Noam Y. Tenne
- */
-public abstract class BaseModuleInfoUtilsTest {
-
-    protected RepoLayout repoLayout;
-
-    protected BaseModuleInfoUtilsTest(RepoLayout repoLayout) {
-        this.repoLayout = repoLayout;
-    }
-
-    protected void testArtifactModuleToModule(ModuleInfo moduleInfo) {
-        testArtifactModuleToModule(moduleInfo, repoLayout);
-    }
-
-    protected void testArtifactModuleToModule(ModuleInfo moduleInfo, RepoLayout layoutToTest) {
-        String artifactPath = ModuleInfoUtils.constructArtifactPath(moduleInfo, layoutToTest);
-        ModuleInfo extractedModuleInfo = ModuleInfoUtils.moduleInfoFromArtifactPath(artifactPath, layoutToTest);
-        assertEquals(extractedModuleInfo, moduleInfo, "Converted module info does not match the original one.");
-    }
-
-    protected void testArtifactPathToModule(String artifactPath, ModuleInfo expectedModule) {
-        testArtifactPathToModule(artifactPath, expectedModule, repoLayout);
-    }
-
-    protected void testArtifactPathToModule(String artifactPath, ModuleInfo expectedModule, RepoLayout layoutToTest) {
-        ModuleInfo extractedModuleInfo = ModuleInfoUtils.moduleInfoFromArtifactPath(artifactPath, layoutToTest);
-        assertEquals(extractedModuleInfo, expectedModule, "Converted module info does not match the expected one.");
-    }
-
-    protected void testDescriptorPathToModule(String descriptorPath, ModuleInfo expectedModule) {
-        testDescriptorPathToModule(descriptorPath, expectedModule, repoLayout);
-    }
-
-    protected void testDescriptorPathToModule(String descriptorPath, ModuleInfo expectedModule, RepoLayout
-            layoutToTest) {
-        ModuleInfo extractedModuleInfo = ModuleInfoUtils.moduleInfoFromDescriptorPath(descriptorPath, layoutToTest);
-        assertEquals(extractedModuleInfo, expectedModule, "Converted module info does not match the expected one.");
-    }
-}
diff --git a/base/api/src/test/java/org/artifactory/api/module/CustomModuleInfoUtilsTest.java b/base/api/src/test/java/org/artifactory/api/module/CustomModuleInfoUtilsTest.java
deleted file mode 100644
index 7ea5e61..0000000
--- a/base/api/src/test/java/org/artifactory/api/module/CustomModuleInfoUtilsTest.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.module;
-
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.descriptor.repo.RepoLayoutBuilder;
-import org.testng.annotations.Test;
-
-/**
- * @author Noam Y. Tenne
- */
-public class CustomModuleInfoUtilsTest extends BaseModuleInfoUtilsTest {
-
-    RepoLayout otherLayout = new RepoLayoutBuilder()
-            .artifactPathPattern("[org]/[custom1<popo>]/[module]/[module]-[baseRev](-[custom2<momo>])")
-            .descriptorPathPattern("[org](.[custom1<popo>])/[module]/[baseRev]/[module]-[custom2<momo>].[ext]")
-            .distinctiveDescriptorPathPattern(true)
-            .build();
-
-    RepoLayout constantExtensionLayout = new RepoLayoutBuilder()
-            .artifactPathPattern("[org]/[custom1<popo>]/[module]/[module]-[baseRev](-[custom2<momo>]).jar")
-            .descriptorPathPattern("[org](.[custom1<popo>])/[module]/[baseRev]/[module]-[custom2<momo>].pom")
-            .distinctiveDescriptorPathPattern(true)
-            .build();
-
-    public CustomModuleInfoUtilsTest() {
-        super(new RepoLayoutBuilder()
-                .artifactPathPattern("[org]/[custom1<popo>]/[module]/[baseRev](-[custom2<momo>])")
-                .descriptorPathPattern("[org](.[custom1<popo>])/[module]/[baseRev]/[custom2<momo>].[ext]")
-                .distinctiveDescriptorPathPattern(true)
-                .build()
-        );
-    }
-
-    @Test
-    public void testArtifactModuleToModule() throws Exception {
-        testArtifactModuleToModule(repoLayout);
-        testArtifactModuleToModule(otherLayout);
-    }
-
-    @Test
-    public void testArtifactPathToModule() throws Exception {
-        testArtifactPathToModule("bob/popo/mcbob/2.2.0-momo", new ModuleInfoBuilder().organization("bob").
-                module("mcbob").baseRevision("2.2.0").customField("custom1", "popo").customField("custom2", "momo").
-                build(), repoLayout);
-        testArtifactPathToModule("jim/popo/bob/1.2.x", new ModuleInfoBuilder().organization("jim").module("bob").
-                baseRevision("1.2.x").customField("custom1", "popo").build(), repoLayout);
-        testArtifactPathToModule("bob/popo/mcbob/mcbob-2.2.0-momo", new ModuleInfoBuilder().organization("bob").
-                module("mcbob").baseRevision("2.2.0").customField("custom1", "popo").customField("custom2", "momo").
-                build(), otherLayout);
-        testArtifactPathToModule("jim/popo/bob/bob-1.2.x", new ModuleInfoBuilder().organization("jim").module("bob").
-                baseRevision("1.2.x").customField("custom1", "popo").build(), otherLayout);
-    }
-
-    @Test
-    public void testDescriptorPathToModule() throws Exception {
-        testDescriptorPathToModule("bob.popo/mcbob/2.2.0/momo.jar", new ModuleInfoBuilder().organization("bob").
-                module("mcbob").baseRevision("2.2.0").ext("jar").customField("custom1", "popo").
-                customField("custom2", "momo").build(), repoLayout);
-        testDescriptorPathToModule("jim/bob/1.2.x/momo.so",
-                new ModuleInfoBuilder().organization("jim").module("bob").
-                        baseRevision("1.2.x").ext("so").customField("custom2", "momo").build(), repoLayout);
-        testDescriptorPathToModule("bob.popo/mcbob/2.2.0/mcbob-momo.jar", new ModuleInfoBuilder().organization("bob").
-                module("mcbob").baseRevision("2.2.0").ext("jar").customField("custom1", "popo").
-                customField("custom2", "momo").build(), otherLayout);
-        testDescriptorPathToModule("jim/bob/1.2.x/bob-momo.so",
-                new ModuleInfoBuilder().organization("jim").module("bob").
-                        baseRevision("1.2.x").ext("so").customField("custom2", "momo").build(), otherLayout);
-    }
-
-    @Test
-    public void testDescriptorPathToModuleWithConstantExtension() throws Exception {
-        testDescriptorPathToModule("jim.popo/bob/1.2.x/bob-momo.pom", new ModuleInfoBuilder().organization("jim")
-                .module("bob").baseRevision("1.2.x").ext("pom").customField("custom1", "popo")
-                .customField("custom2", "momo").build(), constantExtensionLayout);
-    }
-
-    @Test
-    public void testCustom1() throws Exception {
-        RepoLayout someLayout = new RepoLayoutBuilder()
-                .artifactPathPattern("[org]/[module]/[baseRev](-[folderItegRev])/[type]/[artifact<\\w+>]/[baseRev]" +
-                        "(-[fileItegRev])(-[classifier]).[ext]").build();
-        ModuleInfo moduleInfo = new ModuleInfoBuilder().organization("net.sourceforge.basher").module("basher-booter").
-                baseRevision("1.0.10").type("jar").ext("jar").customField("artifact", "myartifact").build();
-        testArtifactModuleToModule(moduleInfo, someLayout);
-        testArtifactPathToModule("net.sourceforge.basher/basher-booter/1.0.10/jar/myartifact/1.0.10.jar", moduleInfo,
-                someLayout);
-    }
-
-    @Test
-    public void testCustom2() throws Exception {
-        RepoLayout someLayout = new RepoLayoutBuilder()
-                .artifactPathPattern("[org]/[module]/[artifact<\\w+>]/[baseRev](-[folderItegRev])/[type]/[baseRev]" +
-                        "(-[fileItegRev])(-[classifier]).[ext]").build();
-        ModuleInfo moduleInfo = new ModuleInfoBuilder().organization("net.sourceforge.basher").module("basher-booter").
-                baseRevision("1.0.10").type("jar").ext("jar").customField("artifact", "myartifact").build();
-        testArtifactModuleToModule(moduleInfo, someLayout);
-        testArtifactPathToModule("net.sourceforge.basher/basher-booter/myartifact/1.0.10/jar/1.0.10.jar", moduleInfo,
-                someLayout);
-    }
-
-    @Test
-    public void testCustomExtensionWithDot() throws Exception {
-        RepoLayout someLayout = new RepoLayoutBuilder()
-                .artifactPathPattern("[orgPath]/[module]/[baseRev](/[classifier]/[prgbuildVer<prgbuild_\\d{2}\\.\\d{2}>]/[buildConfig<[A-Za-z0-9][A-Za-z0-9\\-_]*>])/[module].[ext]").build();
-        ModuleInfo moduleInfo = new ModuleInfoBuilder().organization("prgbuild.prg_fw_system_all").module("mddb-mdl-system_all").
-                baseRevision("24.12.00").classifier("vc-100").ext("7z").customField("buildConfig", "msvcrtd")
-                .customField("prgbuildVer", "prgbuild_04.04").build();
-        testArtifactModuleToModule(moduleInfo, someLayout);
-        testArtifactPathToModule("prgbuild/prg_fw_system_all/mddb-mdl-system_all/24.12.00/vc-100/prgbuild_04.04/msvcrtd/mddb-mdl-system_all.7z",
-                moduleInfo, someLayout);
-    }
-
-    private void testArtifactModuleToModule(RepoLayout layoutToUse) throws Exception {
-        ModuleInfo moduleInfo = new ModuleInfoBuilder().organization("org.moo").module("bob").baseRevision("1.0")
-                .customField("custom1", "popo").customField("custom2", "momo").build();
-        testArtifactModuleToModule(moduleInfo, layoutToUse);
-
-        moduleInfo = new ModuleInfoBuilder().organization("org.moo").module("bob").baseRevision("1.0")
-                .customField("custom1", "popo").build();
-        testArtifactModuleToModule(moduleInfo, layoutToUse);
-    }
-}
diff --git a/base/api/src/test/java/org/artifactory/api/module/GradleModuleInfoUtilsTest.java b/base/api/src/test/java/org/artifactory/api/module/GradleModuleInfoUtilsTest.java
deleted file mode 100644
index b8e3f18..0000000
--- a/base/api/src/test/java/org/artifactory/api/module/GradleModuleInfoUtilsTest.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.module;
-
-import org.artifactory.util.RepoLayoutUtils;
-import org.testng.annotations.Test;
-
-/**
- * @author Noam Y. Tenne
- */
- at Test
-public class GradleModuleInfoUtilsTest extends BaseModuleInfoUtilsTest {
-
-    public GradleModuleInfoUtilsTest() {
-        super(RepoLayoutUtils.GRADLE_DEFAULT);
-    }
-
-    public void testRelease() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("org.moo").module("bob").baseRevision("1.0").
-                ext("jar");
-        ModuleInfo artifactModuleInfo = builder.build();
-        testArtifactModuleToModule(artifactModuleInfo);
-
-        testArtifactPathToModule("org.moo/bob/1.0/bob-1.0.jar", artifactModuleInfo);
-
-        builder.ext("xml");
-        testDescriptorPathToModule("org.moo/bob/ivy-1.0.xml", builder.build());
-    }
-
-    public void testReleaseChecksum() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("org.moo").module("bob").baseRevision("1.0").
-                ext("jar.sha1");
-        ModuleInfo artifactModuleInfo = builder.build();
-        testArtifactModuleToModule(artifactModuleInfo);
-
-        testArtifactPathToModule("org.moo/bob/1.0/bob-1.0.jar.sha1", artifactModuleInfo);
-    }
-
-    public void testReleaseWithClassifier() {
-        ModuleInfo moduleInfo = new ModuleInfoBuilder().organization("org.moo").module("bob").baseRevision("1.0").
-                classifier("sources").ext("jar").build();
-        testArtifactModuleToModule(moduleInfo);
-
-        testArtifactPathToModule("org.moo/bob/1.0/bob-1.0-sources.jar", moduleInfo);
-    }
-
-    public void testReleaseChecksumWithClassifier() {
-        ModuleInfo moduleInfo = new ModuleInfoBuilder().organization("org.moo").module("bob").baseRevision("1.0").
-                classifier("sources").ext("jar.sha1").build();
-        testArtifactModuleToModule(moduleInfo);
-
-        testArtifactPathToModule("org.moo/bob/1.0/bob-1.0-sources.jar.sha1", moduleInfo);
-    }
-
-    public void testIntegration() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("org.moo").module("bob").baseRevision("1.0").
-                folderIntegrationRevision("11111111111111").fileIntegrationRevision("22222222222222").ext("jar");
-        ModuleInfo artifactModuleInfo = builder.build();
-        testArtifactModuleToModule(artifactModuleInfo);
-
-        testArtifactPathToModule("org.moo/bob/1.0-11111111111111/bob-1.0-22222222222222.jar", artifactModuleInfo);
-
-        builder.folderIntegrationRevision(null);
-        builder.ext("xml");
-        testDescriptorPathToModule("org.moo/bob/ivy-1.0-22222222222222.xml", builder.build());
-    }
-
-    public void testIntegrationChecksum() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("org.moo").module("bob").baseRevision("1.0").
-                folderIntegrationRevision("11111111111111").fileIntegrationRevision("22222222222222").ext("jar.md5");
-        ModuleInfo artifactModuleInfo = builder.build();
-        testArtifactModuleToModule(artifactModuleInfo);
-
-        testArtifactPathToModule("org.moo/bob/1.0-11111111111111/bob-1.0-22222222222222.jar.md5", artifactModuleInfo);
-    }
-
-    public void testIntegrationWithClassifier() {
-        ModuleInfo moduleInfo = new ModuleInfoBuilder().organization("org.moo").module("bob").baseRevision("1.0").
-                folderIntegrationRevision("11111111111111").fileIntegrationRevision("22222222222222").
-                classifier("sources").ext("jar").build();
-        testArtifactModuleToModule(moduleInfo);
-
-        testArtifactPathToModule("org.moo/bob/1.0-11111111111111/bob-1.0-22222222222222-sources.jar", moduleInfo);
-    }
-
-    public void testIntegrationChecksumWithClassifier() {
-        ModuleInfo moduleInfo = new ModuleInfoBuilder().organization("org.moo").module("bob").baseRevision("1.0").
-                folderIntegrationRevision("11111111111111").fileIntegrationRevision("22222222222222").
-                classifier("sources").ext("jar.sha1").build();
-        testArtifactModuleToModule(moduleInfo);
-
-        testArtifactPathToModule("org.moo/bob/1.0-11111111111111/bob-1.0-22222222222222-sources.jar.sha1", moduleInfo);
-    }
-
-    public void testSuperLongRelease() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("bob-mcmoo-mbob").baseRevision("1.0").ext("jar");
-        ModuleInfo artifactModuleInfo = builder.build();
-        testArtifactModuleToModule(artifactModuleInfo);
-
-        testArtifactPathToModule("this.is.a-super.ultra-really.mega-long.org/bob-mcmoo-mbob/1.0/bob-mcmoo-mbob-1.0.jar",
-                artifactModuleInfo);
-
-        builder.ext("xml");
-        testDescriptorPathToModule("this.is.a-super.ultra-really.mega-long.org/bob-mcmoo-mbob/ivy-1.0.xml",
-                builder.build());
-    }
-
-    public void testSuperLongReleaseChecksum() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("bob-mcmoo-mbob").baseRevision("1.0").ext("jar.sha1");
-        ModuleInfo artifactModuleInfo = builder.build();
-        testArtifactModuleToModule(artifactModuleInfo);
-
-        testArtifactPathToModule("this.is.a-super.ultra-really.mega-long.org/bob-mcmoo-mbob/1.0/" +
-                "bob-mcmoo-mbob-1.0.jar.sha1", artifactModuleInfo);
-    }
-
-    public void testSuperLongReleaseWithClassifier() {
-        ModuleInfo moduleInfo = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("bob-mcmoo-mbob").baseRevision("1.0").classifier("sources").ext("jar").build();
-        testArtifactModuleToModule(moduleInfo);
-
-        testArtifactPathToModule("this.is.a-super.ultra-really.mega-long.org/bob-mcmoo-mbob/1.0/" +
-                "bob-mcmoo-mbob-1.0-sources.jar", moduleInfo);
-    }
-
-    public void testSuperLongReleaseChecksumWithClassifier() {
-        ModuleInfo moduleInfo = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("bob-mcmoo-mbob").baseRevision("1.0").classifier("sources").ext("jar.sha1").build();
-        testArtifactModuleToModule(moduleInfo);
-
-        testArtifactPathToModule("this.is.a-super.ultra-really.mega-long.org/bob-mcmoo-mbob/1.0/" +
-                "bob-mcmoo-mbob-1.0-sources.jar.sha1", moduleInfo);
-    }
-
-    public void testSuperLongIntegration() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("bob-mcmoo-mbob").baseRevision("1.0").folderIntegrationRevision("11111111111111").
-                fileIntegrationRevision("22222222222222").ext("jar");
-        ModuleInfo artifactModuleInfo = builder.build();
-        testArtifactModuleToModule(artifactModuleInfo);
-
-        testArtifactPathToModule("this.is.a-super.ultra-really.mega-long.org/bob-mcmoo-mbob/1.0-11111111111111/" +
-                "bob-mcmoo-mbob-1.0-22222222222222.jar", artifactModuleInfo);
-
-        builder.folderIntegrationRevision(null);
-        builder.ext("xml");
-        testDescriptorPathToModule("this.is.a-super.ultra-really.mega-long.org/bob-mcmoo-mbob/" +
-                "ivy-1.0-22222222222222.xml", builder.build());
-    }
-
-    public void testSuperLongIntegrationChecksum() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("bob-mcmoo-mbob").baseRevision("1.0").folderIntegrationRevision("11111111111111").
-                fileIntegrationRevision("22222222222222").ext("jar.md5");
-        ModuleInfo artifactModuleInfo = builder.build();
-        testArtifactModuleToModule(artifactModuleInfo);
-
-        testArtifactPathToModule("this.is.a-super.ultra-really.mega-long.org/bob-mcmoo-mbob/1.0-11111111111111/" +
-                "bob-mcmoo-mbob-1.0-22222222222222.jar.md5", artifactModuleInfo);
-    }
-
-    public void testSuperLongIntegrationWithClassifier() {
-        ModuleInfo moduleInfo = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("bob-mcmoo-mbob").baseRevision("1.0").folderIntegrationRevision("11111111111111").
-                fileIntegrationRevision("22222222222222").classifier("sources").ext("jar").build();
-        testArtifactModuleToModule(moduleInfo);
-
-        testArtifactPathToModule("this.is.a-super.ultra-really.mega-long.org/bob-mcmoo-mbob/1.0-11111111111111/" +
-                "bob-mcmoo-mbob-1.0-22222222222222-sources.jar", moduleInfo);
-    }
-
-    public void testSuperLongIntegrationChecksumWithClassifier() {
-        ModuleInfo moduleInfo = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("bob-mcmoo-mbob").baseRevision("1.0").folderIntegrationRevision("11111111111111").
-                fileIntegrationRevision("22222222222222").classifier("sources").ext("jar.sha1").build();
-        testArtifactModuleToModule(moduleInfo);
-
-        testArtifactPathToModule("this.is.a-super.ultra-really.mega-long.org/bob-mcmoo-mbob/1.0-11111111111111/" +
-                "bob-mcmoo-mbob-1.0-22222222222222-sources.jar.sha1", moduleInfo);
-    }
-}
diff --git a/base/api/src/test/java/org/artifactory/api/module/IvyModuleInfoUtilsTest.java b/base/api/src/test/java/org/artifactory/api/module/IvyModuleInfoUtilsTest.java
deleted file mode 100644
index b69023b..0000000
--- a/base/api/src/test/java/org/artifactory/api/module/IvyModuleInfoUtilsTest.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.module;
-
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.descriptor.repo.RepoLayoutBuilder;
-import org.artifactory.util.RepoLayoutUtils;
-import org.testng.annotations.Test;
-
-/**
- * @author Noam Y. Tenne
- */
- at Test
-public class IvyModuleInfoUtilsTest extends BaseModuleInfoUtilsTest {
-
-    public IvyModuleInfoUtilsTest() {
-        super(RepoLayoutUtils.IVY_DEFAULT);
-    }
-
-    public void testRelease() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("org.moo").module("bob").baseRevision("1.0").
-                ext("jar").type("jar");
-
-        testArtifactModuleToModule(builder.build());
-
-        builder.ext("xml");
-        builder.type("xml");
-        testDescriptorPathToModule("org.moo/bob/1.0/xmls/ivy-1.0.xml", builder.build());
-    }
-
-    public void testReleaseWithClassifier() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("org.moo").module("bob").baseRevision("1.0").
-                classifier("sources").ext("jar").type("java-source");
-
-        testArtifactModuleToModule(builder.build());
-    }
-
-    public void testUniqueSnapshot() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("org.moo").module("bob").baseRevision("1.0").
-                folderIntegrationRevision("22222222222222").fileIntegrationRevision("22222222222222").ext("jar").
-                type("jar");
-        testArtifactModuleToModule(builder.build());
-
-        testArtifactPathToModule("org.moo/bob/1.0-22222222222222/jars/bob-1.0-22222222222222.jar", builder.build());
-
-        builder.ext("xml");
-        builder.type("xml");
-        testDescriptorPathToModule("org.moo/bob/1.0-22222222222222/xmls/ivy-1.0-22222222222222.xml", builder.build());
-    }
-
-    public void testUniqueSnapshotWithClassifier() {
-        ModuleInfo expectedModule = new ModuleInfoBuilder().organization("org.moo").module("bob").baseRevision("1.0").
-                folderIntegrationRevision("22222222222222").fileIntegrationRevision("22222222222222").
-                classifier("sources").ext("jar").type("java-source").build();
-        testArtifactModuleToModule(expectedModule);
-
-        testArtifactPathToModule("org.moo/bob/1.0-22222222222222/java-sources/bob-sources-1.0-22222222222222.jar",
-                expectedModule);
-    }
-
-    public void testLowercaseSnapshot() {
-        RepoLayout layout = new RepoLayoutBuilder()
-                .artifactPathPattern("[org]/[module]/[baseRev](-[folderItegRev])/[type]s/" +
-                        "[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]")
-                .folderIntegrationRevisionRegExp("\\d{8}")
-                .fileIntegrationRevisionRegExp("\\d{8}")
-                .build();
-
-        ModuleInfo expectedModule = new ModuleInfoBuilder().organization("com").module("popo").baseRevision("snapshot").
-                folderIntegrationRevision("20080530").fileIntegrationRevision("20080530").ext("pom").type("pom").
-                build();
-
-        testArtifactPathToModule("com/popo/snapshot-20080530/poms/popo-snapshot-20080530.pom", expectedModule, layout);
-    }
-
-    public void testTimezoneSnapshot() {
-        RepoLayout layout = new RepoLayoutBuilder()
-                .artifactPathPattern("[org]/[module]/[baseRev](-[folderItegRev])/[type]s/" +
-                        "[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]")
-                .folderIntegrationRevisionRegExp("\\d{12}\\+\\d{4}")
-                .fileIntegrationRevisionRegExp("\\d{12}\\+\\d{4}")
-                .build();
-
-        ModuleInfo expectedModule = new ModuleInfoBuilder().organization("com").module("popo").
-                baseRevision("0.9-build-daemon").folderIntegrationRevision("200805300000+3200").
-                fileIntegrationRevision("200805300000+3200").classifier("bin").ext("pom").type("pom").build();
-
-        testArtifactPathToModule(
-                "com/popo/0.9-build-daemon-200805300000+3200/poms/popo-bin-0.9-build-daemon-200805300000+3200.pom",
-                expectedModule, layout);
-    }
-
-    public void testLinkedInIvyModule() {
-        RepoLayout layout = new RepoLayoutBuilder()
-                .artifactPathPattern("[org]/[module]/[baseRev](-[folderItegRev])/[type]s/" +
-                        "[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]")
-                .distinctiveDescriptorPathPattern(true)
-                .descriptorPathPattern("[org]/[module]/[baseRev](-[folderItegRev])/[type]s/" +
-                        "[module](-[classifier])-[baseRev](-[fileItegRev]).ivy")
-                .folderIntegrationRevisionRegExp("\\d{14}")
-                .fileIntegrationRevisionRegExp("\\d{14}")
-                .build();
-
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("org.moo").module("bob").baseRevision("1.0").
-                folderIntegrationRevision("22222222222222").fileIntegrationRevision("22222222222222").type("ivy").
-                ext("ivy");
-        testDescriptorPathToModule("org.moo/bob/1.0-22222222222222/ivys/bob-1.0-22222222222222.ivy", builder.build(),
-                layout);
-    }
-
-    public void testGradleStyle() {
-        RepoLayout layout = new RepoLayoutBuilder()
-                .artifactPathPattern("[orgPath]/[module]/[type]s/[module]-[baseRev]" +
-                        "(-[fileItegRev])(-[classifier]).[ext]")
-                .distinctiveDescriptorPathPattern(true)
-                .descriptorPathPattern("[orgPath]/[module]/[type]s/ivy-[baseRev]" +
-                        "(-[fileItegRev]).xml")
-                .folderIntegrationRevisionRegExp("\\d{14}")
-                .fileIntegrationRevisionRegExp("\\d{14}")
-                .build();
-
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("org.moo").module("bob").baseRevision("1.0").
-                type("jar").ext("jar");
-
-        //Test release - fails. no way to guess properly
-        //testArtifactPathToModule("org/moo/bob/jars/bob-1.0.jar", builder.build(), layout);
-
-        //Test snapshot artifact
-        builder.fileIntegrationRevision("22222222222222");
-        testArtifactPathToModule("org/moo/bob/jars/bob-1.0-22222222222222.jar", builder.build(), layout);
-
-        //Test artifact with classifer
-        builder.classifier("sources");
-        testArtifactPathToModule("org/moo/bob/jars/bob-1.0-22222222222222-sources.jar", builder.build(), layout);
-
-        //Test module
-        builder.classifier(null);
-        builder.type("xml");
-        builder.ext("xml");
-        testDescriptorPathToModule("org/moo/bob/xmls/ivy-1.0-22222222222222.xml", builder.build(), layout);
-    }
-
-    public void testSuperLongRelease() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("bob-mcmoo-mbob").baseRevision("1.0").ext("jar").type("jar");
-
-        testArtifactModuleToModule(builder.build());
-        testArtifactPathToModule("this.is.a-super.ultra-really.mega-long.org/bob-mcmoo-mbob/1.0/jars/" +
-                "bob-mcmoo-mbob-1.0.jar", builder.build());
-
-        builder.ext("xml");
-        builder.type("xml");
-        testDescriptorPathToModule("this.is.a-super.ultra-really.mega-long.org/bob-mcmoo-mbob/1.0/xmls/ivy-1.0.xml",
-                builder.build());
-    }
-
-    public void testSuperLongReleaseWithClassifier() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("bob-mcmoo-mbob").baseRevision("1.0").classifier("sources").ext("jar").type("java-source");
-
-        testArtifactModuleToModule(builder.build());
-        testArtifactPathToModule("this.is.a-super.ultra-really.mega-long.org/bob-mcmoo-mbob/1.0/java-sources/" +
-                "bob-mcmoo-mbob-sources-1.0.jar", builder.build());
-    }
-
-    public void testSuperLongUniqueSnapshot() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("bob-mcmoo-mbob").baseRevision("1.0").folderIntegrationRevision("22222222222222").
-                fileIntegrationRevision("22222222222222").ext("jar").type("jar");
-        testArtifactModuleToModule(builder.build());
-
-        testArtifactPathToModule("this.is.a-super.ultra-really.mega-long.org/bob-mcmoo-mbob/1.0-22222222222222/jars/" +
-                "bob-mcmoo-mbob-1.0-22222222222222.jar", builder.build());
-
-        builder.ext("xml");
-        builder.type("xml");
-        testDescriptorPathToModule("this.is.a-super.ultra-really.mega-long.org/bob-mcmoo-mbob/1.0-22222222222222/" +
-                "xmls/ivy-1.0-22222222222222.xml", builder.build());
-    }
-
-    public void testSuperLongUniqueSnapshotWithClassifier() {
-        ModuleInfo expectedModule = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("bob-mcmoo-mbob").baseRevision("1.0").folderIntegrationRevision("22222222222222").
-                fileIntegrationRevision("22222222222222").classifier("sources").ext("jar").type("java-source").build();
-        testArtifactModuleToModule(expectedModule);
-
-        testArtifactPathToModule("this.is.a-super.ultra-really.mega-long.org/bob-mcmoo-mbob/1.0-22222222222222/" +
-                "java-sources/bob-mcmoo-mbob-sources-1.0-22222222222222.jar", expectedModule);
-    }
-
-    public void testSuperLongLowercaseSnapshot() {
-        RepoLayout layout = new RepoLayoutBuilder()
-                .artifactPathPattern("[org]/[module]/[baseRev](-[folderItegRev])/[type]s/" +
-                        "[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]")
-                .folderIntegrationRevisionRegExp("\\d{8}")
-                .fileIntegrationRevisionRegExp("\\d{8}")
-                .build();
-
-        ModuleInfo expectedModule = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("bob-mcmoo-mbob").baseRevision("snapshot").folderIntegrationRevision("20080530").
-                fileIntegrationRevision("20080530").ext("pom").type("pom").build();
-
-        testArtifactPathToModule("this.is.a-super.ultra-really.mega-long.org/bob-mcmoo-mbob/snapshot-20080530/poms/" +
-                "bob-mcmoo-mbob-snapshot-20080530.pom", expectedModule, layout);
-    }
-
-    public void testSuperLongTimezoneSnapshot() {
-        RepoLayout layout = new RepoLayoutBuilder()
-                .artifactPathPattern("[org]/[module]/[baseRev](-[folderItegRev])/[type]s/" +
-                        "[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]")
-                .folderIntegrationRevisionRegExp("\\d{12}\\+\\d{4}")
-                .fileIntegrationRevisionRegExp("\\d{12}\\+\\d{4}")
-                .build();
-
-        ModuleInfo expectedModule = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("bob-mcmoo-mbob").baseRevision("0.9-build-daemon").
-                folderIntegrationRevision("200805300000+3200").fileIntegrationRevision("200805300000+3200").
-                classifier("bin").ext("pom").type("pom").build();
-
-        testArtifactPathToModule("this.is.a-super.ultra-really.mega-long.org/bob-mcmoo-mbob/" +
-                "0.9-build-daemon-200805300000+3200/poms/bob-mcmoo-mbob-bin-0.9-build-daemon-200805300000+3200.pom",
-                expectedModule, layout);
-    }
-
-    public void testSuperLongLinkedInIvyModule() {
-        RepoLayout layout = new RepoLayoutBuilder()
-                .artifactPathPattern("[org]/[module]/[baseRev](-[folderItegRev])/[type]s/" +
-                        "[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]")
-                .distinctiveDescriptorPathPattern(true)
-                .descriptorPathPattern("[org]/[module]/[baseRev](-[folderItegRev])/[type]s/" +
-                        "[module](-[classifier])-[baseRev](-[fileItegRev]).ivy")
-                .folderIntegrationRevisionRegExp("\\d{14}")
-                .fileIntegrationRevisionRegExp("\\d{14}")
-                .build();
-
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("bob-mcmoo-mbob").baseRevision("1.0").folderIntegrationRevision("22222222222222").
-                fileIntegrationRevision("22222222222222").type("ivy").ext("ivy");
-        testDescriptorPathToModule("this.is.a-super.ultra-really.mega-long.org/bob-mcmoo-mbob/1.0-22222222222222/" +
-                "ivys/bob-mcmoo-mbob-1.0-22222222222222.ivy", builder.build(), layout);
-    }
-
-    public void testSuperLongGradleStyle() {
-        RepoLayout layout = new RepoLayoutBuilder()
-                .artifactPathPattern("[orgPath]/[module]/[type]s/[module]-[baseRev]" +
-                        "(-[fileItegRev])(-[classifier]).[ext]")
-                .distinctiveDescriptorPathPattern(true)
-                .descriptorPathPattern("[orgPath]/[module]/[type]s/ivy-[baseRev]" +
-                        "(-[fileItegRev]).xml")
-                .folderIntegrationRevisionRegExp("\\d{14}")
-                .fileIntegrationRevisionRegExp("\\d{14}")
-                .build();
-
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("bob-mcmoo-mbob").baseRevision("1.0").type("jar").ext("jar");
-
-        //Test release - fails. no way to guess properly
-        //testArtifactPathToModule("org/moo/bob-mcmoo-mbob/jars/bob-mcmoo-mbob-1.0.jar", builder.build(), layout);
-
-        //Test snapshot artifact
-        builder.fileIntegrationRevision("22222222222222");
-        testArtifactPathToModule("this/is/a-super/ultra-really/mega-long/org/bob-mcmoo-mbob/jars/" +
-                "bob-mcmoo-mbob-1.0-22222222222222.jar", builder.build(), layout);
-
-        //Test artifact with classifer
-        builder.classifier("sources");
-        testArtifactPathToModule("this/is/a-super/ultra-really/mega-long/org/bob-mcmoo-mbob/jars/" +
-                "bob-mcmoo-mbob-1.0-22222222222222-sources.jar", builder.build(), layout);
-
-        //Test module
-        builder.classifier(null);
-        builder.type("xml");
-        builder.ext("xml");
-        testDescriptorPathToModule("this/is/a-super/ultra-really/mega-long/org/bob-mcmoo-mbob/xmls/" +
-                "ivy-1.0-22222222222222.xml", builder.build(), layout);
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/test/java/org/artifactory/api/module/Maven23ModuleInfoUtilsTest.java b/base/api/src/test/java/org/artifactory/api/module/Maven23ModuleInfoUtilsTest.java
deleted file mode 100644
index 7aa0805..0000000
--- a/base/api/src/test/java/org/artifactory/api/module/Maven23ModuleInfoUtilsTest.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.module;
-
-import org.artifactory.util.RepoLayoutUtils;
-import org.testng.annotations.Test;
-
-/**
- * @author Noam Y. Tenne
- */
- at Test
-public class Maven23ModuleInfoUtilsTest extends BaseModuleInfoUtilsTest {
-
-    public Maven23ModuleInfoUtilsTest() {
-        super(RepoLayoutUtils.MAVEN_2_DEFAULT);
-    }
-
-    public void testRelease() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("org.moo").module("bob").baseRevision("1.0").
-                ext("jar");
-        testArtifactModuleToModule(builder.build());
-
-        builder.ext("pom");
-        testDescriptorPathToModule("org/moo/bob/1.0/bob-1.0.pom", builder.build());
-    }
-
-    public void testReleaseWithClassifier() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("org.moo").module("bob").baseRevision("1.0").
-                classifier("sources").ext("jar");
-        testArtifactModuleToModule(builder.build());
-
-        builder.ext("pom");
-        testDescriptorPathToModule("org/moo/bob/1.0/bob-1.0-sources.pom", builder.build());
-    }
-
-    public void testSuperLongRelease() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("bob-mcmoo-mbob").baseRevision("1.0").ext("jar");
-        testArtifactModuleToModule(builder.build());
-        testArtifactPathToModule("this/is/a-super/ultra-really/mega-long/org/bob-mcmoo-mbob/1.0/bob-mcmoo-mbob-1.0.jar",
-                builder.build());
-
-        builder.ext("pom");
-        testDescriptorPathToModule("this/is/a-super/ultra-really/mega-long/org/bob-mcmoo-mbob/1.0/" +
-                "bob-mcmoo-mbob-1.0.pom", builder.build());
-    }
-
-    public void testSuperLongReleaseWithClassifier() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("bob-mcmoo-mbob").baseRevision("1.0").classifier("sources").ext("jar");
-        testArtifactModuleToModule(builder.build());
-        testArtifactPathToModule("this/is/a-super/ultra-really/mega-long/org/bob-mcmoo-mbob/1.0/" +
-                "bob-mcmoo-mbob-1.0-sources.jar", builder.build());
-
-        builder.ext("pom");
-        testDescriptorPathToModule("this/is/a-super/ultra-really/mega-long/org/bob-mcmoo-mbob/1.0/" +
-                "bob-mcmoo-mbob-1.0-sources.pom", builder.build());
-    }
-
-    public void testUniqueSnapshot() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("org.moo").module("bob").baseRevision("1.0").
-                folderIntegrationRevision("SNAPSHOT").fileIntegrationRevision("22222222.222222-1").ext("jar");
-
-        testArtifactModuleToModule(builder.build());
-
-        builder.ext("pom");
-        testDescriptorPathToModule("org/moo/bob/1.0-SNAPSHOT/bob-1.0-22222222.222222-1.pom", builder.build());
-    }
-
-    public void testUniqueSnapshotWithClassifier() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("org.moo").module("bob").baseRevision("1.0").
-                folderIntegrationRevision("SNAPSHOT").fileIntegrationRevision("22222222.222222-1").
-                classifier("sources").ext("jar");
-
-        testArtifactModuleToModule(builder.build());
-
-        builder.ext("pom");
-        testDescriptorPathToModule("org/moo/bob/1.0-SNAPSHOT/bob-1.0-22222222.222222-1-sources.pom", builder.build());
-    }
-
-    public void testSuperLongUniqueSnapshot() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("bob-mcmoo-mbob").baseRevision("1.0").folderIntegrationRevision("SNAPSHOT").
-                fileIntegrationRevision("22222222.222222-1").ext("jar");
-
-        testArtifactModuleToModule(builder.build());
-        testArtifactPathToModule("this/is/a-super/ultra-really/mega-long/org/bob-mcmoo-mbob/1.0-SNAPSHOT/" +
-                "bob-mcmoo-mbob-1.0-22222222.222222-1.jar", builder.build());
-
-        builder.ext("pom");
-        testDescriptorPathToModule("this/is/a-super/ultra-really/mega-long/org/bob-mcmoo-mbob/1.0-SNAPSHOT/" +
-                "bob-mcmoo-mbob-1.0-22222222.222222-1.pom", builder.build());
-    }
-
-    public void testSuperLongUniqueSnapshotWithClassifier() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("bob-mcmoo-mbob").baseRevision("1.0").folderIntegrationRevision("SNAPSHOT").
-                fileIntegrationRevision("22222222.222222-1").classifier("sources").ext("jar");
-
-        testArtifactModuleToModule(builder.build());
-        testArtifactPathToModule("this/is/a-super/ultra-really/mega-long/org/bob-mcmoo-mbob/1.0-SNAPSHOT/" +
-                "bob-mcmoo-mbob-1.0-22222222.222222-1-sources.jar", builder.build());
-
-        builder.ext("pom");
-        testDescriptorPathToModule("this/is/a-super/ultra-really/mega-long/org/bob-mcmoo-mbob/1.0-SNAPSHOT/" +
-                "bob-mcmoo-mbob-1.0-22222222.222222-1-sources.pom", builder.build());
-    }
-
-    public void testNonUniqueSnapshot() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("org.moo").module("bob").baseRevision("1.0").
-                folderIntegrationRevision("SNAPSHOT").fileIntegrationRevision("SNAPSHOT").ext("jar");
-
-        testArtifactModuleToModule(builder.build());
-
-        builder.ext("pom");
-        testDescriptorPathToModule("org/moo/bob/1.0-SNAPSHOT/bob-1.0-SNAPSHOT.pom", builder.build());
-    }
-
-    public void testNonUniqueSnapshotWithClassifier() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("org.moo").module("bob").baseRevision("1.0").
-                folderIntegrationRevision("SNAPSHOT").fileIntegrationRevision("SNAPSHOT").classifier("sources").
-                ext("jar");
-
-        testArtifactModuleToModule(builder.build());
-
-        builder.ext("pom");
-        testDescriptorPathToModule("org/moo/bob/1.0-SNAPSHOT/bob-1.0-SNAPSHOT-sources.pom", builder.build());
-    }
-
-    public void testSuperLongNonUniqueSnapshot() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("bob-mcmoo-mbob").baseRevision("1.0").folderIntegrationRevision("SNAPSHOT").
-                fileIntegrationRevision("SNAPSHOT").ext("jar");
-
-        testArtifactModuleToModule(builder.build());
-        testArtifactPathToModule("this/is/a-super/ultra-really/mega-long/org/bob-mcmoo-mbob/1.0-SNAPSHOT/" +
-                "bob-mcmoo-mbob-1.0-SNAPSHOT.jar", builder.build());
-
-        builder.ext("pom");
-        testDescriptorPathToModule("this/is/a-super/ultra-really/mega-long/org/bob-mcmoo-mbob/1.0-SNAPSHOT/" +
-                "bob-mcmoo-mbob-1.0-SNAPSHOT.pom", builder.build());
-    }
-
-    public void testSuperLongNonUniqueSnapshotWithClassifier() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("bob-mcmoo-mbob").baseRevision("1.0").folderIntegrationRevision("SNAPSHOT").
-                fileIntegrationRevision("SNAPSHOT").classifier("sources").ext("jar");
-
-        testArtifactModuleToModule(builder.build());
-        testArtifactPathToModule("this/is/a-super/ultra-really/mega-long/org/bob-mcmoo-mbob/1.0-SNAPSHOT/" +
-                "bob-mcmoo-mbob-1.0-SNAPSHOT-sources.jar", builder.build());
-
-        builder.ext("pom");
-        testDescriptorPathToModule("this/is/a-super/ultra-really/mega-long/org/bob-mcmoo-mbob/1.0-SNAPSHOT/" +
-                "bob-mcmoo-mbob-1.0-SNAPSHOT-sources.pom", builder.build());
-    }
-
-    public void testReleaseChecksum() {
-        ModuleInfo moduleInfo = new ModuleInfoBuilder().organization("org.moo").module("bob").baseRevision("1.0").
-                ext("tar.gz.md5").build();
-
-        testArtifactModuleToModule(moduleInfo);
-
-        testArtifactPathToModule("org/moo/bob/1.0/bob-1.0.tar.gz.md5", moduleInfo);
-    }
-
-    public void testSuperLongReleaseChecksum() {
-        ModuleInfo moduleInfo = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("bob-mcmoo-mbob").baseRevision("1.0").ext("tar.gz.md5").build();
-
-        testArtifactModuleToModule(moduleInfo);
-
-        testArtifactPathToModule("this/is/a-super/ultra-really/mega-long/org/bob-mcmoo-mbob/1.0/" +
-                "bob-mcmoo-mbob-1.0.tar.gz.md5", moduleInfo);
-    }
-
-    public void testReleaseChecksumWithClassifier() {
-        ModuleInfo moduleInfo = new ModuleInfoBuilder().organization("org.moo").module("bob").baseRevision("1.0").
-                classifier("sources").ext("tar.gz.sha1").build();
-
-        testArtifactModuleToModule(moduleInfo);
-
-        testArtifactPathToModule("org/moo/bob/1.0/bob-1.0-sources.tar.gz.sha1", moduleInfo);
-    }
-
-    public void testSuperLongReleaseChecksumWithClassifier() {
-        ModuleInfo moduleInfo = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("bob-mcmoo-mbob").baseRevision("1.0").classifier("sources").ext("tar.gz.sha1").build();
-
-        testArtifactModuleToModule(moduleInfo);
-
-        testArtifactPathToModule("this/is/a-super/ultra-really/mega-long/org/bob-mcmoo-mbob/1.0/" +
-                "bob-mcmoo-mbob-1.0-sources.tar.gz.sha1", moduleInfo);
-
-    }
-
-    public void testClassifierWithDots() {
-        ModuleInfo moduleInfo = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("DAS").baseRevision("10.0").fileIntegrationRevision("SNAPSHOT").classifier(
-                "lib+spring-aop-1.2-rc1").ext("jar.sha1").build();
-        testArtifactModuleToModule(moduleInfo);
-        testArtifactPathToModule("this/is/a-super/ultra-really/mega-long/org/DAS/10.0/" +
-                "DAS-10.0-SNAPSHOT-lib+spring-aop-1.2-rc1.jar.sha1", moduleInfo);
-
-        moduleInfo = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("common.dcs").baseRevision("1.0.0").fileIntegrationRevision("SNAPSHOT").classifier(
-                "lib+ack-order-1.0.0-SNAPSHOT").ext("jar.md5").build();
-        testArtifactModuleToModule(moduleInfo);
-        testArtifactPathToModule("this/is/a-super/ultra-really/mega-long/org/common.dcs/1.0.0/" +
-                "common.dcs-1.0.0-SNAPSHOT-lib+ack-order-1.0.0-SNAPSHOT.jar.md5", moduleInfo);
-
-        moduleInfo = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("common.dcs").baseRevision("1.0.0").fileIntegrationRevision("SNAPSHOT").classifier(
-                "lib+ack-order-1.0.0-SNAPSHOT").ext("jar").build();
-        testArtifactModuleToModule(moduleInfo);
-        testArtifactPathToModule("this/is/a-super/ultra-really/mega-long/org/common.dcs/1.0.0/" +
-                "common.dcs-1.0.0-SNAPSHOT-lib+ack-order-1.0.0-SNAPSHOT.jar", moduleInfo);
-
-        moduleInfo = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("common.dcs").baseRevision("1.0.0").fileIntegrationRevision("SNAPSHOT").classifier(
-                "lib+ack-order-1.0.0-SNAPSHOT").ext("jar.md5").build();
-        testArtifactModuleToModule(moduleInfo);
-        testArtifactPathToModule("this/is/a-super/ultra-really/mega-long/org/common.dcs/1.0.0/" +
-                "common.dcs-1.0.0-SNAPSHOT-lib+ack-order-1.0.0-SNAPSHOT.jar.md5", moduleInfo);
-
-        moduleInfo = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("common.dcs").baseRevision("1.0.0").folderIntegrationRevision("SNAPSHOT").
-                fileIntegrationRevision("20111104.160931-1").classifier("lib+ack-order-1.0.0-SNAPSHOT").ext("tar.gzip")
-                .build();
-        testArtifactModuleToModule(moduleInfo);
-        testArtifactPathToModule("this/is/a-super/ultra-really/mega-long/org/common.dcs/1.0.0-SNAPSHOT/" +
-                "common.dcs-1.0.0-20111104.160931-1-lib+ack-order-1.0.0-SNAPSHOT.tar.gzip", moduleInfo);
-
-        moduleInfo = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("common.dcs").baseRevision("1.0.0").folderIntegrationRevision("SNAPSHOT").
-                fileIntegrationRevision("20111104.160931-1").classifier("lib+ack-order").ext("tar.gzip").build();
-        testArtifactModuleToModule(moduleInfo);
-        testArtifactPathToModule("this/is/a-super/ultra-really/mega-long/org/common.dcs/1.0.0-SNAPSHOT/" +
-                "common.dcs-1.0.0-20111104.160931-1-lib+ack-order.tar.gzip", moduleInfo);
-
-        moduleInfo = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("common.dcs").baseRevision("1.0.0").folderIntegrationRevision("SNAPSHOT").
-                fileIntegrationRevision("20111104.160931-1").classifier("1classifier").ext("tar.gzip").build();
-        testArtifactModuleToModule(moduleInfo);
-        testArtifactPathToModule("this/is/a-super/ultra-really/mega-long/org/common.dcs/1.0.0-SNAPSHOT/" +
-                "common.dcs-1.0.0-20111104.160931-1-1classifier.tar.gzip", moduleInfo);
-
-        moduleInfo = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("common.dcs").baseRevision("1.0.0").folderIntegrationRevision("SNAPSHOT").
-                fileIntegrationRevision("20111104.160931-1").classifier("classifier1").ext("tar.gzip").build();
-        testArtifactModuleToModule(moduleInfo);
-        testArtifactPathToModule("this/is/a-super/ultra-really/mega-long/org/common.dcs/1.0.0-SNAPSHOT/" +
-                "common.dcs-1.0.0-20111104.160931-1-classifier1.tar.gzip", moduleInfo);
-
-        moduleInfo = new ModuleInfoBuilder().organization("this.is.a-super.ultra-really.mega-long.org").
-                module("common.xyz").baseRevision("1.0.0").folderIntegrationRevision("SNAPSHOT").
-                fileIntegrationRevision("SNAPSHOT").classifier("123abc-3.1").ext("jar").build();
-        testArtifactModuleToModule(moduleInfo);
-        testArtifactPathToModule("this/is/a-super/ultra-really/mega-long/org/common.xyz/1.0.0-SNAPSHOT/" +
-                "common.xyz-1.0.0-SNAPSHOT-123abc-3.1.jar", moduleInfo);
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/test/java/org/artifactory/api/module/ModuleInfoBuilderTest.java b/base/api/src/test/java/org/artifactory/api/module/ModuleInfoBuilderTest.java
deleted file mode 100644
index 8d0f902..0000000
--- a/base/api/src/test/java/org/artifactory/api/module/ModuleInfoBuilderTest.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.module;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNull;
-
-/**
- * @author Noam Y. Tenne
- */
- at Test
-public class ModuleInfoBuilderTest {
-
-    public void testNoParams() {
-        ModuleInfo build = new ModuleInfoBuilder().build();
-        assertNull(build.getOrganization(), "Default 'organization' value of module info builder should be null.");
-        assertNull(build.getModule(), "Default 'module' value of module info builder should be null.");
-        assertNull(build.getBaseRevision(), "Default 'base revision' value of module info builder should be null.");
-        assertNull(build.getFolderIntegrationRevision(),
-                "Default 'folder integration revision' value of module info builder should be null.");
-        assertNull(build.getFileIntegrationRevision(),
-                "Default 'file integration revision' value of module info builder should be null.");
-        assertNull(build.getClassifier(), "Default 'classifier' value of module info builder should be null.");
-        assertNull(build.getExt(), "Default 'extension' value of module info builder should be null.");
-        assertNull(build.getType(), "Default 'type' value of module info builder should be null.");
-        assertNull(build.getCustomFields(), "Default 'custom fields' value of module info builder should be null.");
-    }
-
-    public void testNullParams() {
-        ModuleInfo build = new ModuleInfoBuilder().organization(null).module(null).baseRevision(null).
-                folderIntegrationRevision(null).fileIntegrationRevision(null).classifier(null).ext(null).type(null).
-                build();
-        assertNull(build.getOrganization(), "Expected 'organization' value of module info builder to be null.");
-        assertNull(build.getModule(), "Expected 'module' value of module info builder to be null.");
-        assertNull(build.getBaseRevision(), "Expected 'base revision' value of module info builder to be null.");
-        assertNull(build.getFolderIntegrationRevision(),
-                "Expected 'folder integration revision' value of module info builder to be null.");
-        assertNull(build.getFileIntegrationRevision(),
-                "Expected 'file integration revision' value of module info builder to be null.");
-        assertNull(build.getClassifier(), "Expected 'classifier' value of module info builder to be null.");
-        assertNull(build.getExt(), "Expected 'ext' value of module info builder to be null.");
-        assertNull(build.getType(), "Expected 'type' value of module info builder to be null.");
-    }
-
-    public void testValidParams() {
-        ModuleInfo build = new ModuleInfoBuilder().organization("organization").module("module").
-                baseRevision("revisionBase").folderIntegrationRevision("pathRevisionIntegration").
-                fileIntegrationRevision("artifactRevisionIntegration").classifier("classifier").ext("ext").
-                type("type").customField("tokenName", "tokenValue").build();
-        assertEquals(build.getOrganization(), "organization",
-                "Unexpected 'organization' value of module info builder.");
-        assertEquals(build.getModule(), "module", "Unexpected 'module' value of module info builder.");
-        assertEquals(build.getBaseRevision(), "revisionBase",
-                "Unexpected 'base revision' value of module info builder.");
-        assertEquals(build.getFolderIntegrationRevision(), "pathRevisionIntegration",
-                "Unexpected 'folder integration revision' value of module info builder.");
-        assertEquals(build.getFileIntegrationRevision(), "artifactRevisionIntegration",
-                "Unexpected 'file integration revision' value of module info builder.");
-        assertEquals(build.getClassifier(), "classifier", "Unexpected 'classifier' value of module info builder.");
-        assertEquals(build.getExt(), "ext", "Unexpected 'ext' value of module info builder.");
-        assertEquals(build.getType(), "type", "Unexpected 'type' value of module info builder.");
-        assertEquals(build.getCustomField("tokenName"), "tokenValue",
-                "Unexpected 'custom field' value of module info builder.");
-    }
-
-    public void testCopyConstructor() throws Exception {
-        ModuleInfo toCopy = new ModuleInfoBuilder().organization("organization").module("module").
-                baseRevision("revisionBase").folderIntegrationRevision("pathRevisionIntegration").
-                fileIntegrationRevision("artifactRevisionIntegration").classifier("classifier").ext("ext").
-                type("type").customField("tokenName", "tokenValue").customField("tokenName2", "tokenValue2").build();
-        ModuleInfo copy = new ModuleInfoBuilder(toCopy).build();
-        assertEquals(copy.getOrganization(), "organization",
-                "Unexpected 'organization' value of module info builder.");
-        assertEquals(copy.getModule(), "module", "Unexpected 'module' value of module info builder.");
-        assertEquals(copy.getBaseRevision(), "revisionBase",
-                "Unexpected 'base revision' value of module info builder.");
-        assertEquals(copy.getFolderIntegrationRevision(), "pathRevisionIntegration",
-                "Unexpected 'folder integration revision' value of module info builder.");
-        assertEquals(copy.getFileIntegrationRevision(), "artifactRevisionIntegration",
-                "Unexpected 'file integration revision' value of module info builder.");
-        assertEquals(copy.getClassifier(), "classifier", "Unexpected 'classifier' value of module info builder.");
-        assertEquals(copy.getExt(), "ext", "Unexpected 'ext' value of module info builder.");
-        assertEquals(copy.getType(), "type", "Unexpected 'type' value of module info builder.");
-        assertEquals(copy.getCustomField("tokenName"), "tokenValue",
-                "Unexpected 'custom field' value of module info builder.");
-        assertEquals(copy.getCustomField("tokenName2"), "tokenValue2",
-                "Unexpected 'custom field' value of module info builder.");
-    }
-
-    @Test
-    public void testCopyDefaultConstruct() throws Exception {
-        ModuleInfo copy = new ModuleInfoBuilder(new ModuleInfo()).build();
-        assertNull(copy.getOrganization(), "Default 'organization' value of module info copyer should be null.");
-        assertNull(copy.getModule(), "Default 'module' value of module info copyer should be null.");
-        assertNull(copy.getBaseRevision(), "Default 'base revision' value of module info copyer should be null.");
-        assertNull(copy.getFolderIntegrationRevision(),
-                "Default 'folder integration revision' value of module info copyer should be null.");
-        assertNull(copy.getFileIntegrationRevision(),
-                "Default 'file integration revision' value of module info copyer should be null.");
-        assertNull(copy.getClassifier(), "Default 'classifier' value of module info copyer should be null.");
-        assertNull(copy.getExt(), "Default 'extension' value of module info copyer should be null.");
-        assertNull(copy.getType(), "Default 'type' value of module info copyer should be null.");
-        assertNull(copy.getCustomFields(), "Default 'custom fields' value of module info copyer should be null.");
-    }
-}
\ No newline at end of file
diff --git a/base/api/src/test/java/org/artifactory/api/module/ModuleInfoTest.java b/base/api/src/test/java/org/artifactory/api/module/ModuleInfoTest.java
deleted file mode 100644
index 5aabd87..0000000
--- a/base/api/src/test/java/org/artifactory/api/module/ModuleInfoTest.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.module;
-
-import com.google.common.collect.Maps;
-import org.testng.annotations.Test;
-
-import java.util.Map;
-
-import static org.testng.Assert.*;
-
-/**
- * @author Noam Y. Tenne
- */
- at Test
-public class ModuleInfoTest {
-
-    public void testDefaultConstructor() {
-        ModuleInfo moduleInfo = new ModuleInfo();
-        assertNull(moduleInfo.getOrganization(), "Default 'organization' value of module info should be null.");
-        assertNull(moduleInfo.getModule(), "Default 'module' value of module info should be null.");
-        assertNull(moduleInfo.getBaseRevision(),
-                "Default 'base revision' value of module info should be null.");
-        assertNull(moduleInfo.getFolderIntegrationRevision(),
-                "Default 'folder integration revision' value of module info should be null.");
-        assertNull(moduleInfo.getFileIntegrationRevision(),
-                "Default 'file integration revision' value of module info should be null.");
-        assertNull(moduleInfo.getClassifier(), "Default 'classifier' value of module info should be null.");
-        assertNull(moduleInfo.getExt(), "Default 'extension' value of module info should be null.");
-        assertNull(moduleInfo.getType(), "Default 'type' value of module info should be null.");
-        assertFalse(moduleInfo.isValid(), "Module should should not be valid.");
-        assertFalse(moduleInfo.isIntegration(), "Module info should should be considered as an 'integration' module.");
-        assertEquals(moduleInfo.getPrettyModuleId(), "null:null:null",
-                "Unexpected module info 'pretty ID' representation.");
-        assertEquals(moduleInfo.toString(), "organization = null, module = null, baseRevision = null, " +
-                "folderIntegrationRevision = null, fileIntegrationRevision = null, classifier = null, ext = null, " +
-                "type = null", "Unexpected module info string representation.");
-    }
-
-    public void testPartialInfo() {
-        ModuleInfo moduleInfo = new ModuleInfo("organization", "module", null, null, null, null, null, null, null);
-        assertEquals(moduleInfo.getOrganization(), "organization", "Unexpected 'organization' value of module info.");
-        assertEquals(moduleInfo.getModule(), "module", "Unexpected 'module' value of module info.");
-        assertNull(moduleInfo.getBaseRevision(), "Expected 'base revision' value of module info to be null.");
-        assertNull(moduleInfo.getFolderIntegrationRevision(),
-                "Expected 'folder integration revision' value of module info to be null.");
-        assertNull(moduleInfo.getFileIntegrationRevision(),
-                "Expected 'file integration revision' value of module info to be null.");
-        assertNull(moduleInfo.getClassifier(), "Expected 'classifier' value of module info to be null.");
-        assertNull(moduleInfo.getExt(), "Expected 'extension' value of module info to be null.");
-        assertNull(moduleInfo.getType(), "Expected 'type' value of module info to be null.");
-        assertNull(moduleInfo.getCustomFields(), "Expected 'custom fields' value of module info to be null.");
-        assertFalse(moduleInfo.isValid(), "Module info should not be valid.");
-        assertFalse(moduleInfo.isIntegration(), "Module info should not be considered as an 'integration' module.");
-        assertEquals(moduleInfo.getPrettyModuleId(), "null:null:null",
-                "Unexpected module info 'pretty ID' representation.");
-        assertEquals(moduleInfo.toString(), "organization = organization, module = module, baseRevision = null, " +
-                "folderIntegrationRevision = null, fileIntegrationRevision = null, classifier = null, ext = null, " +
-                "type = null", "Unexpected module info string representation.");
-    }
-
-    public void testMinimalInfo() {
-        ModuleInfo moduleInfo = new ModuleInfo("organization", "module", "revisionBase", null, null, null, null, null,
-                null);
-        assertEquals(moduleInfo.getOrganization(), "organization", "Unexpected 'organization' value of module info.");
-        assertEquals(moduleInfo.getModule(), "module", "Unexpected 'module' value of module info.");
-        assertEquals(moduleInfo.getBaseRevision(), "revisionBase", "Unexpected 'base revision' value of module info.");
-        assertNull(moduleInfo.getFolderIntegrationRevision(),
-                "Expected 'folder integration revision' value of module info to be null.");
-        assertNull(moduleInfo.getFileIntegrationRevision(),
-                "Expected 'file integration revision' value of module info to be null.");
-        assertNull(moduleInfo.getClassifier(), "Expected 'classifier' value of module info to be null.");
-        assertNull(moduleInfo.getExt(), "Expected 'extension' value of module info to be null.");
-        assertNull(moduleInfo.getType(), "Expected 'type' value of module info to be null.");
-        assertNull(moduleInfo.getCustomFields(), "Expected 'custom fields' value of module info to be null.");
-        assertTrue(moduleInfo.isValid(), "Module info should be valid.");
-        assertFalse(moduleInfo.isIntegration(), "Module info should not be considered as an 'integration' module.");
-        assertEquals(moduleInfo.getPrettyModuleId(), "organization:module:revisionBase",
-                "Unexpected module info 'pretty ID' representation.");
-        assertEquals(moduleInfo.toString(), "organization = organization, module = module, " +
-                "baseRevision = revisionBase, folderIntegrationRevision = null, fileIntegrationRevision = null, " +
-                "classifier = null, ext = null, type = null", "Unexpected module info string representation.");
-    }
-
-    public void testFullInfo() {
-        Map<String, String> customFields = Maps.newHashMap();
-        customFields.put("customKey", "customValue");
-        ModuleInfo moduleInfo = new ModuleInfo("organization", "module", "revisionBase", "pathRevisionIntegration",
-                "artifactRevisionIntegration", "classifier", "ext", "type", customFields);
-        assertEquals(moduleInfo.getOrganization(), "organization", "Unexpected 'organization' value of module info.");
-        assertEquals(moduleInfo.getModule(), "module", "Unexpected 'module' value of module info.");
-        assertEquals(moduleInfo.getBaseRevision(), "revisionBase", "Unexpected 'base revision' value of module info.");
-        assertEquals(moduleInfo.getFolderIntegrationRevision(), "pathRevisionIntegration",
-                "Unexpected 'folder integration revision' value of module info.");
-        assertEquals(moduleInfo.getFileIntegrationRevision(), "artifactRevisionIntegration",
-                "Unexpected 'file integration revision' value of module info.");
-        assertEquals(moduleInfo.getClassifier(), "classifier", "Unexpected 'classifier' value of module info.");
-        assertEquals(moduleInfo.getExt(), "ext", "Unexpected 'extension' value of module info.");
-        assertEquals(moduleInfo.getType(), "type", "Unexpected 'type' value of module info.");
-        assertEquals(moduleInfo.getCustomFields(), customFields, "Unexpected 'custom fields' value of module info.");
-        assertTrue(moduleInfo.isValid(), "Module info should be valid.");
-        assertTrue(moduleInfo.isIntegration(), "Module info should be considered as an 'integration' module.");
-        assertEquals(moduleInfo.getPrettyModuleId(),
-                "organization:module:revisionBase-artifactRevisionIntegration:classifier:type",
-                "Unexpected module info 'pretty ID' representation.");
-        assertEquals(moduleInfo.toString(), "organization = organization, module = module, " +
-                "baseRevision = revisionBase, folderIntegrationRevision = pathRevisionIntegration, " +
-                "fileIntegrationRevision = artifactRevisionIntegration, classifier = classifier, ext = ext," +
-                " type = type", "Unexpected module info string representation.");
-    }
-}
diff --git a/base/api/src/test/java/org/artifactory/api/module/ModuleInfoUtilsTest.java b/base/api/src/test/java/org/artifactory/api/module/ModuleInfoUtilsTest.java
deleted file mode 100644
index 1210124..0000000
--- a/base/api/src/test/java/org/artifactory/api/module/ModuleInfoUtilsTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.module;
-
-import org.testng.annotations.Test;
-
-import static org.artifactory.api.module.ModuleInfoUtils.*;
-
-/**
- * @author Noam Y. Tenne
- */
- at Test
-public class ModuleInfoUtilsTest {
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = "Unable to construct a path from a null module info object.")
-    public void constructArtifactPathWithNullModuleInfo() {
-        constructArtifactPath(null, null);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = "Unable to construct a path from an invalid module info object.")
-    public void constructArtifactPathWithInvalidModuleInfo() {
-        constructArtifactPath(new ModuleInfo(), null);
-    }
-
-    /*@Test(description = "RTFACT-7125")
-    public void constructMavenSnapshotWithDots() {
-        ModuleInfo module = new ModuleInfoBuilder().organization("org.jfrog").module("mod").baseRevision("1.0").ext("jar")
-                .fileIntegrationRevision("SNAPSHOT").folderIntegrationRevision("SNAPSHOT").build();
-        String path = constructArtifactPath(module, RepoLayoutUtils.MAVEN_2_DEFAULT, true, true);
-        Assert.assertEquals(path, "org.jfrog/mod/1.0-SNAPSHOT/mod-1.0-SNAPSHOT.jar");
-        String path2 = constructArtifactPath(module, RepoLayoutUtils.MAVEN_2_DEFAULT);
-        Assert.assertEquals(path2, "org/jfrog/mod/1.0-SNAPSHOT/mod-1.0-SNAPSHOT.jar");
-        String path3 = constructArtifactPath(module, RepoLayoutUtils.MAVEN_2_DEFAULT, true);
-        Assert.assertEquals(path3, "org/jfrog/mod/1.0-SNAPSHOT/mod-1.0-SNAPSHOT.jar");
-    }*/
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = "Unable to construct a path from a null repository layout.")
-    public void constructArtifactPathWithNullRepoLayout() {
-        constructArtifactPath(new ModuleInfoBuilder().organization("org").module("mod").baseRevision("rev").build(),
-                null);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = "Cannot construct a module info object from a blank item path.")
-    public void moduleInfoFromArtifactPathWithNullArtifactPath() {
-        moduleInfoFromArtifactPath(null, null);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = "Cannot construct a module info object from a blank item path.")
-    public void moduleInfoFromDescriptorPathWithNullArtifactPath() {
-        moduleInfoFromDescriptorPath(null, null);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = "Cannot construct a module info object from a blank item path.")
-    public void moduleInfoFromArtifactPathWithBlankItemPath() {
-        moduleInfoFromArtifactPath("", null);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = "Cannot construct a module info object from a blank item path.")
-    public void moduleInfoFromDescriptorPathWithBlankItemPath() {
-        moduleInfoFromDescriptorPath("", null);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = "Cannot construct a module info object from a null repository layout.")
-    public void moduleInfoFromArtifactPathWithNullRepoLayout() {
-        moduleInfoFromArtifactPath("org/meow", null);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = "Cannot construct a module info object from a null repository layout.")
-    public void moduleInfoFromDescriptorPathWithNullRepoLayout() {
-        moduleInfoFromDescriptorPath("org/meow", null);
-    }
-}
diff --git a/base/api/src/test/java/org/artifactory/api/module/SpringIvyModuleInfoUtilsTest.java b/base/api/src/test/java/org/artifactory/api/module/SpringIvyModuleInfoUtilsTest.java
deleted file mode 100644
index 01418ad..0000000
--- a/base/api/src/test/java/org/artifactory/api/module/SpringIvyModuleInfoUtilsTest.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.module;
-
-import org.artifactory.descriptor.repo.RepoLayoutBuilder;
-import org.testng.annotations.Test;
-
-/**
- * @author Noam Y. Tenne
- */
- at Test
-public class SpringIvyModuleInfoUtilsTest extends BaseModuleInfoUtilsTest {
-
-    public SpringIvyModuleInfoUtilsTest() {
-        super(new RepoLayoutBuilder()
-                .artifactPathPattern("[org]/[module]/[baseRev](.[folderItegRev])/" +
-                        "[module](-[classifier])-[baseRev](.[fileItegRev]).[ext]")
-                .distinctiveDescriptorPathPattern(true)
-                .descriptorPathPattern("[org]/[module]/[baseRev](.[folderItegRev])/" +
-                        "ivy-[baseRev](.[fileItegRev]).xml")
-                .folderIntegrationRevisionRegExp("CI-(?:(?:[A-Z]\\d+\\-[A-Z]\\d+)|(?:\\d+))")
-                .fileIntegrationRevisionRegExp("CI-(?:(?:[A-Z]\\d+\\-[A-Z]\\d+)|(?:\\d+))")
-                .build());
-    }
-
-    public void testSpringBundlesExternal() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("ch.qos.logback").
-                module("com.springsource.ch.qos.logback.classic").baseRevision("0.9.24").ext("jar");
-
-        testArtifactPathToModule("ch.qos.logback/com.springsource.ch.qos.logback.classic/0.9.24/" +
-                "com.springsource.ch.qos.logback.classic-0.9.24.jar", builder.build());
-
-        builder.classifier("sources");
-        testArtifactPathToModule("ch.qos.logback/com.springsource.ch.qos.logback.classic/0.9.24/" +
-                "com.springsource.ch.qos.logback.classic-sources-0.9.24.jar", builder.build());
-
-        builder.classifier(null);
-        builder.ext("xml");
-        testDescriptorPathToModule("ch.qos.logback/com.springsource.ch.qos.logback.classic/0.9.24/ivy-0.9.24.xml",
-                builder.build());
-    }
-
-    public void testSpringBundlesRelease() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("org.springframework.flex").
-                module("org.springframework.flex").baseRevision("1.0.3.RELEASE").ext("jar");
-
-        testArtifactPathToModule("org.springframework.flex/org.springframework.flex/1.0.3.RELEASE/" +
-                "org.springframework.flex-1.0.3.RELEASE.jar", builder.build());
-
-        builder.classifier("sources");
-        testArtifactPathToModule("org.springframework.flex/org.springframework.flex/1.0.3.RELEASE/" +
-                "org.springframework.flex-sources-1.0.3.RELEASE.jar", builder.build());
-
-        builder.classifier(null);
-        builder.ext("xml");
-        testDescriptorPathToModule("org.springframework.flex/org.springframework.flex/1.0.3.RELEASE/" +
-                "ivy-1.0.3.RELEASE.xml", builder.build());
-    }
-
-    public void testSpringBundlesMilestone() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("org.springframework.flex").
-                module("org.springframework.flex").baseRevision("1.0.0.RC2").ext("jar");
-
-        testArtifactPathToModule("org.springframework.flex/org.springframework.flex/1.0.0.RC2/" +
-                "org.springframework.flex-1.0.0.RC2.jar", builder.build());
-
-        builder.classifier("sources");
-        testArtifactPathToModule("org.springframework.flex/org.springframework.flex/1.0.0.RC2/" +
-                "org.springframework.flex-sources-1.0.0.RC2.jar", builder.build());
-
-        builder.classifier(null);
-        builder.ext("xml");
-        testDescriptorPathToModule("org.springframework.flex/org.springframework.flex/1.0.0.RC2/" +
-                "ivy-1.0.0.RC2.xml", builder.build());
-    }
-
-    public void testSpringBundlesSnapshot1() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("com.springsource.manifestexpander").
-                module("com.springsource.manifestexpander").baseRevision("1.0.0").folderIntegrationRevision("CI-23").
-                fileIntegrationRevision("CI-23").ext("jar");
-
-        testArtifactPathToModule("com.springsource.manifestexpander/com.springsource.manifestexpander/1.0.0.CI-23/" +
-                "com.springsource.manifestexpander-1.0.0.CI-23.jar", builder.build());
-
-        builder.classifier("sources");
-        testArtifactPathToModule("com.springsource.manifestexpander/com.springsource.manifestexpander/1.0.0.CI-23/" +
-                "com.springsource.manifestexpander-sources-1.0.0.CI-23.jar", builder.build());
-
-        builder.classifier(null);
-        builder.ext("xml");
-        testDescriptorPathToModule("com.springsource.manifestexpander/com.springsource.manifestexpander/1.0.0.CI-23/" +
-                "ivy-1.0.0.CI-23.xml", builder.build());
-    }
-
-    public void testSpringBundlesSnapshot2() {
-        ModuleInfoBuilder builder = new ModuleInfoBuilder().organization("com.springsource.manifestexpander").
-                module("com.springsource.manifestexpander").baseRevision("1.0.0").folderIntegrationRevision(
-                "CI-R11-B2").
-                fileIntegrationRevision("CI-R11-B2").ext("jar");
-
-        testArtifactPathToModule("com.springsource.manifestexpander/com.springsource.manifestexpander/" +
-                "1.0.0.CI-R11-B2/com.springsource.manifestexpander-1.0.0.CI-R11-B2.jar", builder.build());
-
-        builder.classifier("sources");
-        testArtifactPathToModule("com.springsource.manifestexpander/com.springsource.manifestexpander/" +
-                "1.0.0.CI-R11-B2/com.springsource.manifestexpander-sources-1.0.0.CI-R11-B2.jar", builder.build());
-
-        builder.classifier(null);
-        builder.ext("xml");
-        testDescriptorPathToModule("com.springsource.manifestexpander/com.springsource.manifestexpander/" +
-                "1.0.0.CI-R11-B2/ivy-1.0.0.CI-R11-B2.xml", builder.build());
-    }
-}
diff --git a/base/api/src/test/java/org/artifactory/api/module/SpringMaven23ModuleInfoUtilsTest.java b/base/api/src/test/java/org/artifactory/api/module/SpringMaven23ModuleInfoUtilsTest.java
deleted file mode 100644
index d44d830..0000000
--- a/base/api/src/test/java/org/artifactory/api/module/SpringMaven23ModuleInfoUtilsTest.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.module;
-
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.descriptor.repo.RepoLayoutBuilder;
-import org.artifactory.util.RepoLayoutUtils;
-import org.testng.annotations.Test;
-
-/**
- * @author Noam Y. Tenne
- */
- at Test
-public class SpringMaven23ModuleInfoUtilsTest extends BaseModuleInfoUtilsTest {
-
-    public SpringMaven23ModuleInfoUtilsTest() {
-        super(RepoLayoutUtils.MAVEN_2_DEFAULT);
-    }
-
-    public void testSpringDistSnapshot() {
-        RepoLayout layout = new RepoLayoutBuilder().artifactPathPattern("[org]/[module]-[baseRev]" +
-                ".[fileItegRev](-[classifier]).[ext]").
-                fileIntegrationRevisionRegExp("?:CI\\-(\\d+)").build();
-
-        ModuleInfo module = new ModuleInfoBuilder().organization("FLEX").module("spring-flex").
-                baseRevision("1.0.3").fileIntegrationRevision("31").ext("zip").build();
-        testArtifactPathToModule("FLEX/spring-flex-1.0.3.CI-31.zip", module, layout);
-
-        ModuleInfo moduleWithClassifier = new ModuleInfoBuilder().organization("FLEX").module("spring-flex").
-                baseRevision("1.0.3").fileIntegrationRevision("31").classifier("with-dependencies").ext("zip").
-                build();
-        testArtifactPathToModule("FLEX/spring-flex-1.0.3.CI-31-with-dependencies.zip", moduleWithClassifier, layout);
-    }
-
-    public void testSpringDistMilestone() {
-        RepoLayout layout = new RepoLayoutBuilder().artifactPathPattern("[org]/[module]-[baseRev]" +
-                ".[fileItegRev](-[classifier]).[ext]").
-                fileIntegrationRevisionRegExp("?:M(\\d+)").build();
-
-        ModuleInfo module = new ModuleInfoBuilder().organization("FLEX").module("spring-flex").
-                baseRevision("1.0.0").fileIntegrationRevision("1").ext("zip").build();
-        testArtifactPathToModule("FLEX/spring-flex-1.0.0.M1.zip", module, layout);
-
-        ModuleInfo moduleWithClassifier = new ModuleInfoBuilder().organization("FLEX").module("spring-flex").
-                baseRevision("1.0.0").fileIntegrationRevision("1").classifier("with-dependencies").ext("zip").
-                build();
-        testArtifactPathToModule("FLEX/spring-flex-1.0.0.M1-with-dependencies.zip", moduleWithClassifier, layout);
-    }
-
-    public void testSpringDistRelease() {
-        RepoLayout layout = new RepoLayoutBuilder().artifactPathPattern("[org]/[module]-[baseRev]" +
-                ".RELEASE(-[classifier]).[ext]").build();
-
-        ModuleInfo module = new ModuleInfoBuilder().organization("FLEX").module("spring-flex").
-                baseRevision("1.0.0").ext("zip").build();
-        testArtifactPathToModule("FLEX/spring-flex-1.0.0.RELEASE.zip", module, layout);
-
-        ModuleInfo moduleWithClassifier = new ModuleInfoBuilder().organization("FLEX").module("spring-flex").
-                baseRevision("1.0.0").classifier("with-dependencies").ext("zip").build();
-        testArtifactPathToModule("FLEX/spring-flex-1.0.0.RELEASE-with-dependencies.zip", moduleWithClassifier, layout);
-    }
-
-    public void testSpringArtifacts() {
-
-        ModuleInfo module = new ModuleInfoBuilder().organization("com.springsource").module("groovy-eclipse-compiler").
-                baseRevision("0.0.1").folderIntegrationRevision("SNAPSHOT").fileIntegrationRevision("SNAPSHOT").
-                ext("jar").build();
-        testArtifactPathToModule("com/springsource/groovy-eclipse-compiler/0.0.1-SNAPSHOT/" +
-                "groovy-eclipse-compiler-0.0.1-SNAPSHOT.jar", module);
-
-        module = new ModuleInfoBuilder().organization("com.springsource.insight").
-                module("com.springsource.insight.collection.tcserver").baseRevision("1.0.0.M2-RC2").
-                classifier("sources").ext("jar").build();
-        testArtifactPathToModule("com/springsource/insight/com.springsource.insight.collection.tcserver/1.0.0.M2-RC2/" +
-                "com.springsource.insight.collection.tcserver-1.0.0.M2-RC2-sources.jar",
-                module);
-
-        module = new ModuleInfoBuilder().organization("org.apache.ivy").module("ivy").
-                baseRevision("2.0.0-alpha2-incubating").ext("jar").build();
-        testArtifactPathToModule("org/apache/ivy/ivy/2.0.0-alpha2-incubating/ivy-2.0.0-alpha2-incubating.jar", module);
-    }
-
-    public void testSpringBundles() {
-        ModuleInfo module = new ModuleInfoBuilder().organization("org.antlr").
-                module("com.springsource.org.antlr.stringtemplate").baseRevision("3.1.0.b1").classifier("license").
-                ext("txt").build();
-        testArtifactPathToModule("org/antlr/com.springsource.org.antlr.stringtemplate/3.1.0.b1/" +
-                "com.springsource.org.antlr.stringtemplate-3.1.0.b1-license.txt", module);
-
-        module = new ModuleInfoBuilder().organization("org.apache.maven.plugins").module("maven-par-plugin").
-                baseRevision("1.0.0.BUILD").folderIntegrationRevision("SNAPSHOT").
-                fileIntegrationRevision("20090624.153253-1").classifier("sources").ext("jar").build();
-        testArtifactPathToModule("org/apache/maven/plugins/maven-par-plugin/1.0.0.BUILD-SNAPSHOT/" +
-                "maven-par-plugin-1.0.0.BUILD-20090624.153253-1-sources.jar", module);
-
-        module = new ModuleInfoBuilder().organization("org.apache.maven.plugins").module("maven-par-plugin").
-                baseRevision("1.0.0.BUILD").folderIntegrationRevision("SNAPSHOT").
-                fileIntegrationRevision("20090624.153253-1").ext("jar").build();
-        testArtifactPathToModule("org/apache/maven/plugins/maven-par-plugin/1.0.0.BUILD-SNAPSHOT/" +
-                "maven-par-plugin-1.0.0.BUILD-20090624.153253-1.jar", module);
-    }
-}
diff --git a/base/api/src/test/java/org/artifactory/api/repo/storage/RepoStorageSummaryInfoTest.java b/base/api/src/test/java/org/artifactory/api/repo/storage/RepoStorageSummaryInfoTest.java
deleted file mode 100644
index 9f450ec..0000000
--- a/base/api/src/test/java/org/artifactory/api/repo/storage/RepoStorageSummaryInfoTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.repo.storage;
-
-import org.testng.annotations.Test;
-
-import static org.artifactory.api.repo.storage.RepoStorageSummaryInfo.RepositoryType;
-import static org.testng.Assert.assertEquals;
-
-/**
- * Unit tests for {@link RepoStorageSummaryInfo}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class RepoStorageSummaryInfoTest {
-
-    @Test
-    public void simpleConstructor() {
-        RepoStorageSummaryInfo rs = new RepoStorageSummaryInfo("bla", RepositoryType.LOCAL, 100, 120, 1024, "maven");
-        assertEquals(rs.getRepoKey(), "bla");
-        assertEquals(rs.getRepoType(), RepositoryType.LOCAL);
-        assertEquals(rs.getFoldersCount(), 100);
-        assertEquals(rs.getFilesCount(), 120);
-        assertEquals(rs.getUsedSpace(), 1024);
-        assertEquals(rs.getItemsCount(), 220);
-    }
-}
diff --git a/base/api/src/test/java/org/artifactory/api/rest/artifact/FileListElementTest.java b/base/api/src/test/java/org/artifactory/api/rest/artifact/FileListElementTest.java
deleted file mode 100644
index 0b904d0..0000000
--- a/base/api/src/test/java/org/artifactory/api/rest/artifact/FileListElementTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.artifact;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the behavior of the file list element object
- *
- * @author Noam Y. Tenne
- */
- at Test
-public class FileListElementTest {
-
-    /**
-     * Tests the values of the object after initializing with the default constructor
-     */
-    public void testDefaultConstructor() {
-        FileListElement fileListElement = new FileListElement();
-
-        assertNull(fileListElement.getLastModified(), "Default last modified time should be null.");
-        assertEquals(fileListElement.getSize(), 0L, "Unexpected default size.");
-        assertNull(fileListElement.getUri(), "Default URI should be null.");
-        assertFalse(fileListElement.isFolder(), "Default element should represent a file.");
-    }
-
-    /**
-     * Tests the values of the object after initializing with the full constructor
-     */
-    public void testFullConstructor() {
-        String uri = "uri";
-        long size = 2323L;
-        String lastModified = "lastModified";
-        boolean folder = true;
-
-        FileListElement fileListElement = new FileListElement(uri, size, lastModified, folder);
-
-        assertEquals(fileListElement.getLastModified(), lastModified, "Unexpected last modified value.");
-        assertEquals(fileListElement.getSize(), size, "Unexpected size value.");
-        assertEquals(fileListElement.getUri(), uri, "Unexpected URI value.");
-        assertTrue(fileListElement.isFolder(), "Unexpected Element type state.");
-    }
-
-    /**
-     * Tests the values of the object after initializing them with their setters
-     */
-    public void testSetters() {
-        String uri = "uri";
-        long size = 2323L;
-        String lastModified = "lastModified";
-        boolean folder = true;
-
-        FileListElement fileListElement = new FileListElement();
-
-        fileListElement.setLastModified(lastModified);
-        fileListElement.setSize(size);
-        fileListElement.setUri(uri);
-        fileListElement.setFolder(folder);
-
-        assertEquals(fileListElement.getLastModified(), lastModified, "Unexpected last modified value.");
-        assertEquals(fileListElement.getSize(), size, "Unexpected size value.");
-        assertEquals(fileListElement.getUri(), uri, "Unexpected URI value.");
-        assertTrue(fileListElement.isFolder(), "Unexpected Element type state.");
-    }
-}
diff --git a/base/api/src/test/java/org/artifactory/api/rest/artifact/FileListTest.java b/base/api/src/test/java/org/artifactory/api/rest/artifact/FileListTest.java
deleted file mode 100644
index 9f99a41..0000000
--- a/base/api/src/test/java/org/artifactory/api/rest/artifact/FileListTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.artifact;
-
-import com.google.common.collect.Lists;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNull;
-
-/**
- * Tests the behavior of the file list object
- *
- * @author Noam Y. Tenne
- */
- at Test
-public class FileListTest {
-
-    /**
-     * Tests the values of the object after initializing with the default constructor
-     */
-    @Test
-    public void testDefaultConstructor() throws Exception {
-        FileList fileList = new FileList();
-
-        assertNull(fileList.getCreated(), "Default created time should be null.");
-        assertNull(fileList.getFiles(), "Default file list should be null.");
-        assertNull(fileList.getUri(), "Default URI should be null.");
-    }
-
-    /**
-     * Tests the values of the object after initializing with the full constructor
-     */
-    @Test
-    public void testFullConstructor() throws Exception {
-        String uri = "uri";
-        FileListElement folder = new FileListElement("uri", 324234L, "lastModified", true);
-        FileListElement file = new FileListElement("uri", 324234L, "lastModified", false);
-        List<FileListElement> files = Lists.newArrayList(folder, file);
-        String created = "created";
-
-        FileList fileList = new FileList(uri, created, files);
-
-        assertEquals(fileList.getCreated(), created, "Unexpected created time value.");
-        assertEquals(fileList.getFiles(), files, "Unexpected file list value.");
-        assertEquals(fileList.getFiles().get(0), folder, "Unexpected list content value.");
-        assertEquals(fileList.getFiles().get(1), file, "Unexpected list content value.");
-    }
-
-    /**
-     * Tests the values of the object after initializing them with their setters
-     */
-    @Test
-    public void testSetters() throws Exception {
-        String uri = "uri";
-        FileListElement folder = new FileListElement("uri", 324234L, "lastModified", true);
-        FileListElement file = new FileListElement("uri", 324234L, "lastModified", false);
-        List<FileListElement> files = Lists.newArrayList(folder, file);
-        String created = "created";
-
-        FileList fileList = new FileList();
-
-        fileList.setCreated(created);
-        fileList.setFiles(files);
-        fileList.setUri(uri);
-
-        assertEquals(fileList.getCreated(), created, "Unexpected created time value.");
-        assertEquals(fileList.getFiles(), files, "Unexpected file list value.");
-        assertEquals(fileList.getFiles().get(0), folder, "Unexpected list content value.");
-        assertEquals(fileList.getFiles().get(1), file, "Unexpected list content value.");
-    }
-}
diff --git a/base/api/src/test/java/org/artifactory/api/rest/search/result/PatternResultFileSetTest.java b/base/api/src/test/java/org/artifactory/api/rest/search/result/PatternResultFileSetTest.java
deleted file mode 100644
index 0d7b763..0000000
--- a/base/api/src/test/java/org/artifactory/api/rest/search/result/PatternResultFileSetTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.rest.search.result;
-
-import com.google.common.collect.Sets;
-import org.testng.annotations.Test;
-
-import java.util.Set;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the behavior of the pattern search result class
- *
- * @author Noam Y. Tenne
- */
- at Test
-public class PatternResultFileSetTest {
-
-    /**
-     * Test the object values when initializing the default constructor
-     */
-    public void testDefaultConstructor() {
-        PatternResultFileSet fileSet = new PatternResultFileSet();
-
-        assertNull(fileSet.getRepoUri(), "Default repo URI should be null.");
-        assertNull(fileSet.getSourcePattern(), "Default source pattern should be null.");
-        assertNotNull(fileSet.getFiles(), "Default file set should not be null.");
-        assertTrue(fileSet.getFiles().isEmpty(), "Default file set should be empty.");
-    }
-
-    /**
-     * Test the object values when initializing the constructor that does not specify the file set
-     */
-    public void testNoFilesConstructor() {
-        String repoUri = "repoUri";
-        String sourcePattern = "sourcePattern";
-
-        PatternResultFileSet fileSet = new PatternResultFileSet(repoUri, sourcePattern);
-
-        assertEquals(fileSet.getRepoUri(), repoUri, "Unexpected repo URI.");
-        assertEquals(fileSet.getSourcePattern(), sourcePattern, "Unexpected source pattern.");
-        assertNotNull(fileSet.getFiles(), "Default file set should not be null.");
-        assertTrue(fileSet.getFiles().isEmpty(), "Default file set should be empty.");
-    }
-
-    /**
-     * Test the object values when initializing the full constructor
-     */
-    public void testFullConstructor() {
-        String repoUri = "repoUri";
-        String sourcePattern = "sourcePattern";
-        Set<String> files = Sets.newHashSet("file");
-
-        PatternResultFileSet fileSet = new PatternResultFileSet(repoUri, sourcePattern, files);
-
-        assertEquals(fileSet.getRepoUri(), repoUri, "Unexpected repo URI.");
-        assertEquals(fileSet.getSourcePattern(), sourcePattern, "Unexpected source pattern.");
-        assertEquals(fileSet.getFiles(), files, "Unexpected file set.");
-    }
-
-    /**
-     * Test the object values after initializing them with setters
-     */
-    public void testSetters() {
-        String repoUri = "repoUri";
-        String sourcePattern = "sourcePattern";
-        Set<String> files = Sets.newHashSet("file");
-
-        PatternResultFileSet fileSet = new PatternResultFileSet();
-        fileSet.setFiles(files);
-        fileSet.setRepoUri(repoUri);
-        fileSet.setSourcePattern(sourcePattern);
-
-        assertEquals(fileSet.getRepoUri(), repoUri, "Unexpected repo URI.");
-        assertEquals(fileSet.getSourcePattern(), sourcePattern, "Unexpected source pattern.");
-        assertEquals(fileSet.getFiles(), files, "Unexpected file set.");
-    }
-
-    /**
-     * Test the file set value after initializing with the add method
-     */
-    public void testAddMethod() {
-        PatternResultFileSet fileSet = new PatternResultFileSet();
-        fileSet.setFiles(null);
-        fileSet.addFile("file");
-        assertNotNull(fileSet.getFiles(), "File set should have been initialized.");
-        assertFalse(fileSet.getFiles().isEmpty(), "File set should contain the added element.");
-        assertEquals(fileSet.getFiles().iterator().next(), "file", "Unexpected file.");
-    }
-}
diff --git a/base/api/src/test/java/org/artifactory/api/search/SearchControlsBaseTest.java b/base/api/src/test/java/org/artifactory/api/search/SearchControlsBaseTest.java
deleted file mode 100644
index 46fdbc3..0000000
--- a/base/api/src/test/java/org/artifactory/api/search/SearchControlsBaseTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search;
-
-import org.easymock.EasyMock;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-/**
- * Tests {@link org.artifactory.api.search.SearchControlsBaseTest}.
- *
- * @author Yossi Shaul
- */
-public class SearchControlsBaseTest {
-    @Test
-    public void isWildcardsOnly() {
-        SearchControlsBase controls = EasyMock.createMockBuilder(SearchControlsBase.class).createNiceMock();
-        EasyMock.replay(controls);
-        assertTrue(controls.isWildcardsOnly("*"));
-        assertTrue(controls.isWildcardsOnly("?"));
-        assertTrue(controls.isWildcardsOnly("**"));
-        assertTrue(controls.isWildcardsOnly("?*"));
-        assertFalse(controls.isWildcardsOnly("a?*"));
-        assertFalse(controls.isWildcardsOnly("*b"));
-    }
-}
diff --git a/base/api/src/test/java/org/artifactory/api/search/archive/ArchiveSearchControlsTest.java b/base/api/src/test/java/org/artifactory/api/search/archive/ArchiveSearchControlsTest.java
deleted file mode 100644
index e4ef04d..0000000
--- a/base/api/src/test/java/org/artifactory/api/search/archive/ArchiveSearchControlsTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search.archive;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-/**
- * Tests {@link org.artifactory.api.search.archive.ArchiveSearchControls}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class ArchiveSearchControlsTest {
-
-    public void isWildcardsOnly() throws Exception {
-        ArchiveSearchControls controls = new ArchiveSearchControls();
-        assertTrue(controls.isWildcardsOnly());
-        controls.setPath("*?*");
-        assertTrue(controls.isWildcardsOnly());
-        controls.setPath("Agent");
-        assertFalse(controls.isWildcardsOnly());
-    }
-}
diff --git a/base/api/src/test/java/org/artifactory/api/search/artifact/ArtifactSearchControlsTest.java b/base/api/src/test/java/org/artifactory/api/search/artifact/ArtifactSearchControlsTest.java
deleted file mode 100644
index 9d9f5fb..0000000
--- a/base/api/src/test/java/org/artifactory/api/search/artifact/ArtifactSearchControlsTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search.artifact;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-/**
- * Tests {@link org.artifactory.api.search.artifact.ArtifactSearchControls}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class ArtifactSearchControlsTest {
-
-    public void emptyControls() throws Exception {
-        ArtifactSearchControls controls = new ArtifactSearchControls();
-        assertTrue(controls.isEmpty(), "Expected empty controls");
-        controls.setQuery("boo");
-        assertFalse(controls.isEmpty(), "Expected non empty controls");
-    }
-
-    public void wildcardsOnlyControls() throws Exception {
-        ArtifactSearchControls controls = new ArtifactSearchControls();
-        assertTrue(controls.isWildcardsOnly());
-        controls.setQuery("*");
-        assertTrue(controls.isWildcardsOnly());
-        controls.setQuery("?");
-        assertTrue(controls.isWildcardsOnly());
-        controls.setQuery("**");
-        assertTrue(controls.isWildcardsOnly());
-        controls.setQuery("?*");
-        assertTrue(controls.isWildcardsOnly());
-        controls.setQuery("a?*");
-        assertFalse(controls.isWildcardsOnly());
-        controls.setQuery("*b");
-        assertFalse(controls.isWildcardsOnly());
-    }
-}
diff --git a/base/api/src/test/java/org/artifactory/api/search/artifact/ChecksumSearchControlsTest.java b/base/api/src/test/java/org/artifactory/api/search/artifact/ChecksumSearchControlsTest.java
deleted file mode 100644
index e02a394..0000000
--- a/base/api/src/test/java/org/artifactory/api/search/artifact/ChecksumSearchControlsTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search.artifact;
-
-import org.artifactory.checksum.ChecksumType;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-/**
- * Tests {@link org.artifactory.api.search.artifact.ChecksumSearchControls}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class ChecksumSearchControlsTest {
-
-    public void isWildcardsOnly() throws Exception {
-        ChecksumSearchControls controls = new ChecksumSearchControls();
-        assertTrue(controls.isWildcardsOnly());
-        controls.addChecksum(ChecksumType.sha1, "*");
-        assertTrue(controls.isWildcardsOnly());
-        controls.getChecksums().remove(ChecksumType.md5);
-        controls.addChecksum(ChecksumType.sha1, "999");
-        assertFalse(controls.isWildcardsOnly());
-    }
-}
diff --git a/base/api/src/test/java/org/artifactory/api/search/gavc/GavcSearchControlsTest.java b/base/api/src/test/java/org/artifactory/api/search/gavc/GavcSearchControlsTest.java
deleted file mode 100644
index 41e0b91..0000000
--- a/base/api/src/test/java/org/artifactory/api/search/gavc/GavcSearchControlsTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search.gavc;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-/**
- * Tests {@link org.artifactory.api.search.gavc.GavcSearchControls}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class GavcSearchControlsTest {
-
-    public void isWildcardsOnly() {
-        GavcSearchControls controls = new GavcSearchControls();
-        assertTrue(controls.isWildcardsOnly());
-        controls.setArtifactId("?");
-        assertTrue(controls.isWildcardsOnly());
-        controls.setGroupId("**");
-        assertTrue(controls.isWildcardsOnly());
-        controls.setVersion("2");
-        assertFalse(controls.isWildcardsOnly());
-    }
-}
diff --git a/base/api/src/test/java/org/artifactory/api/search/property/PropertySearchControlsTest.java b/base/api/src/test/java/org/artifactory/api/search/property/PropertySearchControlsTest.java
deleted file mode 100644
index ccf1af6..0000000
--- a/base/api/src/test/java/org/artifactory/api/search/property/PropertySearchControlsTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.search.property;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-/**
- * Tests {@link org.artifactory.api.search.property.PropertySearchControls}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class PropertySearchControlsTest {
-
-    public void isWildcardsOnly() {
-        PropertySearchControls controls = new PropertySearchControls();
-        assertTrue(controls.isWildcardsOnly(), "Empty controls considered as wildcards only");
-        controls.put("*", "val", false);
-        assertTrue(controls.isWildcardsOnly(), "There's a wildcards only key");
-        controls.put("test", "?", true);
-        assertTrue(controls.isWildcardsOnly(), "There's a wildcards only key");
-        controls.removeAll("*");
-        assertFalse(controls.isWildcardsOnly());
-    }
-}
diff --git a/base/api/src/test/java/org/artifactory/checksum/ChecksumInfoTest.java b/base/api/src/test/java/org/artifactory/checksum/ChecksumInfoTest.java
deleted file mode 100644
index 039861a..0000000
--- a/base/api/src/test/java/org/artifactory/checksum/ChecksumInfoTest.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.checksum;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the ChecksumInfo class.
- *
- * @author Yossi Shaul
- */
- at Test
-public class ChecksumInfoTest {
-
-    public static final String DUMMY_UPPER_CASE_SHA1 = "1234567890ABCD56789012345678901234567890";
-    public static final String DUMMY_SHA1 = "1234567890123456789012345678901234567890";
-    public static final String DUMMY2_SHA1 = "3234567890123456789012345678901234567890";
-
-    public static final String DUMMY_UPPER_CASE_MD5 = "1234567890ABCD567890123456789012";
-    public static final String DUMMY_MD5 = "12345678901234567890123456789012";
-    public static final String DUMMY2_MD5 = "32345678901234567890123456789012";
-
-    @Test(expectedExceptions = IllegalStateException.class)
-    public void wrongSha1Actual() {
-        new ChecksumInfo(ChecksumType.sha1, DUMMY_SHA1, "f");
-    }
-
-    @Test(expectedExceptions = IllegalStateException.class)
-    public void wrongMd5Actual() {
-        new ChecksumInfo(ChecksumType.md5, DUMMY_MD5, "f");
-    }
-
-    public void matchSameOriginalAndActual() {
-        ChecksumInfo infoSha1 = new ChecksumInfo(ChecksumType.sha1, DUMMY_SHA1, DUMMY_SHA1);
-        assertTrue(infoSha1.checksumsMatch(), "SHA1 Checksums should match");
-        ChecksumInfo infoMd5 = new ChecksumInfo(ChecksumType.md5, DUMMY2_MD5, DUMMY2_MD5);
-        assertTrue(infoMd5.checksumsMatch(), "MD5 Checksums should match");
-    }
-
-    public void matchDifferentOriginalAndActual() {
-        ChecksumInfo infoSha1 = new ChecksumInfo(ChecksumType.sha1, DUMMY_SHA1, DUMMY2_SHA1);
-        assertFalse(infoSha1.checksumsMatch(), "SHA1 Checksums shouldn't match");
-        ChecksumInfo infoMd5 = new ChecksumInfo(ChecksumType.md5, DUMMY_MD5, DUMMY2_MD5);
-        assertFalse(infoMd5.checksumsMatch(), "MD5 Checksums shouldn't match");
-    }
-
-    public void matchNullOriginal() {
-        ChecksumInfo infoSha1 = new org.artifactory.checksum.ChecksumInfo(ChecksumType.sha1, null, DUMMY_SHA1);
-        assertFalse(infoSha1.checksumsMatch(), "SHA1 Checksums shouldn't if one is null");
-        ChecksumInfo infoMd5 = new org.artifactory.checksum.ChecksumInfo(ChecksumType.md5, null, DUMMY_MD5);
-        assertFalse(infoMd5.checksumsMatch(), "MD5 Checksums shouldn't if one is null");
-    }
-
-    public void matchNullActual() {
-        ChecksumInfo infoSha1 = new ChecksumInfo(ChecksumType.sha1, DUMMY_SHA1, null);
-        assertFalse(infoSha1.checksumsMatch(), "SHA1 Checksums shouldn't if one is null");
-        ChecksumInfo infoMd5 = new ChecksumInfo(ChecksumType.md5, DUMMY_MD5, null);
-        assertFalse(infoMd5.checksumsMatch(), "MD5 Checksums shouldn't if one is null");
-    }
-
-    public void matchNullOriginalAndActual() {
-        ChecksumInfo infoSha1 = new ChecksumInfo(ChecksumType.sha1, null, null);
-        assertFalse(infoSha1.checksumsMatch(), "SHA1 Checksums shouldn't if one is null");
-        ChecksumInfo infoMd5 = new ChecksumInfo(ChecksumType.md5, null, null);
-        assertFalse(infoMd5.checksumsMatch(), "MD5 Checksums shouldn't if one is null");
-    }
-
-    public void trustedOriginalShouldReturnActual() {
-        ChecksumInfo infoSha1 = new ChecksumInfo(ChecksumType.sha1, ChecksumInfo.TRUSTED_FILE_MARKER, DUMMY_SHA1);
-        assertTrue(infoSha1.isMarkedAsTrusted(), "SHA1 Should have been marked as trusted");
-        assertEquals(infoSha1.getOriginal(), infoSha1.getActual(), "SHA1 Original should return actual if marked " +
-                "as trusted");
-        ChecksumInfo infoMd5 = new ChecksumInfo(ChecksumType.md5, ChecksumInfo.TRUSTED_FILE_MARKER, DUMMY_MD5);
-        assertTrue(infoMd5.isMarkedAsTrusted(), "MD5 Should have been marked as trusted");
-        assertEquals(infoMd5.getOriginal(), infoMd5.getActual(), "MD5 Original should return actual if marked " +
-                "as trusted");
-    }
-
-    public void matchIfOriginalIsTruetedAndActualIsSet() {
-        ChecksumInfo infoSha1 = new ChecksumInfo(ChecksumType.sha1, ChecksumInfo.TRUSTED_FILE_MARKER, DUMMY_SHA1);
-        assertTrue(infoSha1.checksumsMatch(), "SHA1 Checksums should match if " +
-                "marked as trusted and actual not null");
-        ChecksumInfo infoMd5 = new ChecksumInfo(ChecksumType.md5, ChecksumInfo.TRUSTED_FILE_MARKER, DUMMY_MD5);
-        assertTrue(infoMd5.checksumsMatch(), "SHA1 Checksums should match if " +
-                "marked as trusted and actual not null");
-    }
-
-    /**
-     * This test makes sure that if the  original checksum is valid  then the original checksum is being converted to lowercase.
-     */
-    public void validChecksumWithDifferentCaseNormalizationTest() {
-        ChecksumInfo infoSha1 = new ChecksumInfo(ChecksumType.sha1, DUMMY_UPPER_CASE_SHA1.toUpperCase(),
-                DUMMY_UPPER_CASE_SHA1.toLowerCase());
-        assertTrue(infoSha1.getOriginal().equals(DUMMY_UPPER_CASE_SHA1.toLowerCase()),
-                "Expected lower case but fund upper case");
-        assertTrue(infoSha1.checksumsMatch(), "SHA1 Checksums should match");
-        ChecksumInfo infoMd5 = new ChecksumInfo(ChecksumType.md5, DUMMY_UPPER_CASE_MD5.toUpperCase(),
-                DUMMY_UPPER_CASE_MD5.toLowerCase());
-        assertTrue(infoMd5.getOriginal().equals(DUMMY_UPPER_CASE_MD5.toLowerCase()),
-                "Expected lower case but fund upper case");
-        assertTrue(infoMd5.checksumsMatch(), "MD5 Checksums should match");
-    }
-
-    /**
-     * This test makes sure that if the  original checksum is not valid  then the original checksum stay untouched.
-     */
-    public void notValidChecksumNormalizationTest() {
-        String sha1Checksum = "ABC";
-        String md5Checksum = "DEF";
-        ChecksumInfo infoSha1 = new ChecksumInfo(ChecksumType.sha1, sha1Checksum.toUpperCase(),
-                DUMMY_UPPER_CASE_SHA1.toLowerCase());
-        assertTrue(infoSha1.getOriginal().equals(sha1Checksum), "Expected upper case but fund lower case");
-        ChecksumInfo infoMd5 = new ChecksumInfo(ChecksumType.md5, md5Checksum.toUpperCase(),
-                DUMMY_UPPER_CASE_MD5.toLowerCase());
-        assertTrue(infoMd5.getOriginal().equals(md5Checksum), "Expected upper case but fund lower case");
-
-    }
-}
diff --git a/base/api/src/test/java/org/artifactory/checksum/ChecksumsInfoTest.java b/base/api/src/test/java/org/artifactory/checksum/ChecksumsInfoTest.java
deleted file mode 100644
index b02140e..0000000
--- a/base/api/src/test/java/org/artifactory/checksum/ChecksumsInfoTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.checksum;
-
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * @author Yossi Shaul
- */
- at Test
-public class ChecksumsInfoTest {
-
-    public void copyConstructor() {
-        ChecksumsInfo orig = new ChecksumsInfo();
-        ChecksumInfo checksum = new ChecksumInfo(ChecksumType.sha1, ChecksumInfoTest.DUMMY_SHA1,
-                ChecksumInfoTest.DUMMY2_SHA1);
-        orig.addChecksumInfo(checksum);
-
-        ChecksumsInfo copy = new org.artifactory.checksum.ChecksumsInfo(orig);
-
-        assertTrue(EqualsBuilder.reflectionEquals(orig, copy), "Orig and copy differ");
-        assertTrue(orig.isIdentical(copy), "Orig and copy differ");
-        assertSame(checksum, copy.getChecksumInfo(ChecksumType.sha1),
-                "Should have made a copy, not use the same object");
-    }
-
-    public void addChecksum() {
-        ChecksumsInfo checksumsInfo = new ChecksumsInfo();
-        ChecksumInfo checksum = new ChecksumInfo(ChecksumType.sha1, ChecksumInfoTest.DUMMY_SHA1,
-                ChecksumInfoTest.DUMMY2_SHA1);
-        ChecksumInfo checksum2 = new ChecksumInfo(ChecksumType.md5, ChecksumInfoTest.DUMMY_MD5,
-                ChecksumInfoTest.DUMMY2_MD5);
-        String finalSha1Actual = ChecksumInfoTest.DUMMY2_SHA1.replace('5', '0');
-        String finalSha1Original = ChecksumInfoTest.DUMMY_SHA1.replace('0', '1');
-        ChecksumInfo checksum3 = new ChecksumInfo(ChecksumType.sha1, finalSha1Original, finalSha1Actual);
-        checksumsInfo.addChecksumInfo(checksum);
-        checksumsInfo.addChecksumInfo(checksum2);
-        checksumsInfo.addChecksumInfo(checksum3);
-        assertEquals(checksumsInfo.getChecksums().size(), 2, "Size should be two");
-        assertSame(checksumsInfo.getChecksumInfo(ChecksumType.md5), checksum2, "Should be the same");
-        assertSame(checksumsInfo.getChecksumInfo(ChecksumType.sha1), checksum3, "Should be the same");
-        assertEquals(checksumsInfo.getSha1(), finalSha1Actual, "SHA1 Checksum not correct");
-        assertEquals(checksumsInfo.getChecksumInfo(ChecksumType.sha1).getOriginal(), finalSha1Original,
-                "SHA1 Original checksum not correct");
-        String finalMd5Actual = ChecksumInfoTest.DUMMY2_MD5.replace('5', '0');
-        String finalMd5Original = ChecksumInfoTest.DUMMY_MD5.replace('0', '1');
-        checksumsInfo.addChecksumInfo(new ChecksumInfo(ChecksumType.md5, finalMd5Original, finalMd5Actual));
-        assertEquals(checksumsInfo.getChecksums().size(), 2, "Size should be two");
-        assertEquals(checksumsInfo.getMd5(), finalMd5Actual, "MD5 Checksum not correct");
-        assertEquals(checksumsInfo.getChecksumInfo(ChecksumType.md5).getOriginal(), finalMd5Original,
-                "MD5 Original Checksum nopt correct");
-    }
-
-}
diff --git a/base/api/src/test/java/org/artifactory/checksum/ChecksumsTypeTest.java b/base/api/src/test/java/org/artifactory/checksum/ChecksumsTypeTest.java
deleted file mode 100644
index da2718b..0000000
--- a/base/api/src/test/java/org/artifactory/checksum/ChecksumsTypeTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.checksum;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-/**
- * Tests the {@link org.artifactory.checksum.ChecksumType} enum.
- *
- * @author Yossi Shaul
- */
- at Test
-public class ChecksumsTypeTest {
-
-    public void nullAndEmptyAreNotValidChecksums() {
-        for (ChecksumType checksumType : ChecksumType.values()) {
-            assertFalse(checksumType.isValid(null));
-            assertFalse(checksumType.isValid(""));
-        }
-    }
-
-    public void wrongLengthChecksums() {
-        for (ChecksumType checksumType : ChecksumType.values()) {
-            assertFalse(checksumType.isValid("aaa"));
-        }
-    }
-
-    public void invalidMD5Checksum() {
-        // good length but not hexadecimal
-        assertFalse(ChecksumType.md5.isValid("xf222ca7499ed5bc49fe25a1182c59f7"));
-    }
-
-    public void invalidSha1Checksum() {
-        // good length but not hexadecimal
-        assertFalse(ChecksumType.sha1.isValid("96bcc93bec1f99e45b6c1bdfcef73948b8fa122g"));
-    }
-
-    public void invalidSha256Checksum() {
-        // good length but not hexadecimal
-        assertFalse(ChecksumType.sha256.isValid("e3b0x44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"));
-    }
-
-    public void validMD5Checksum() {
-        assertTrue(ChecksumType.md5.isValid("2f222ca7499ed5bc49fe25a1182c59f7"));
-        assertTrue(ChecksumType.md5.isValid("d06a3ab307d28384a235d0ab6b70d3ae"));
-    }
-
-    public void validSha1Checksum() {
-        assertTrue(ChecksumType.sha1.isValid("911ca40cdb527969ee47dc6f782425d94a36b510"));
-        assertTrue(ChecksumType.sha1.isValid("96bcc93bec1f99e45b6c1bdfcef73948b8fa122c"));
-    }
-
-    public void validSha256Checksum() {
-        assertTrue(ChecksumType.sha256.isValid("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"));
-        assertTrue(ChecksumType.sha256.isValid("5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8"));
-    }
-
-}
diff --git a/base/api/src/test/java/org/artifactory/repo/remote/browse/RemoteItemTest.java b/base/api/src/test/java/org/artifactory/repo/remote/browse/RemoteItemTest.java
deleted file mode 100644
index 99a862b..0000000
--- a/base/api/src/test/java/org/artifactory/repo/remote/browse/RemoteItemTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.remote.browse;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Unit tests for {@link RemoteItem}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class RemoteItemTest {
-    @Test(expectedExceptions = NullPointerException.class)
-    public void nullUrl() {
-        new RemoteItem(null, false);
-    }
-
-    public void getNameFromFile() {
-        assertEquals(new RemoteItem("http://test/123/file.name", false).getName(), "file.name");
-    }
-
-    public void getNameFromDirectory() {
-        assertEquals(new RemoteItem("http://test/123/dir/", true).getName(), "dir");
-    }
-}
diff --git a/base/capi/pom.xml b/base/capi/pom.xml
deleted file mode 100644
index a363391..0000000
--- a/base/capi/pom.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0          http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>artifactory-capi</artifactId>
-    <packaging>jar</packaging>
-    <name>Artifactory Common API</name>
-
-    <parent>
-        <artifactId>artifactory-base-parent</artifactId>
-        <groupId>org.artifactory</groupId>
-        <version>4.8.0</version>
-    </parent>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-papi</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.google.guava</groupId>
-            <artifactId>guava</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.thoughtworks.xstream</groupId>
-            <artifactId>xstream</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-compress</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>commons-lang</groupId>
-            <artifactId>commons-lang</artifactId>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-javadoc-plugin</artifactId>
-                <configuration>
-                    <skip>false</skip>
-                    <doctitle>${project.name} ${project.version}</doctitle>
-                    <windowtitle>${project.name} ${project.version}</windowtitle>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/base/capi/src/main/java/org/artifactory/common/MutableStatusHolder.java b/base/capi/src/main/java/org/artifactory/common/MutableStatusHolder.java
deleted file mode 100644
index d9ef110..0000000
--- a/base/capi/src/main/java/org/artifactory/common/MutableStatusHolder.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.common;
-
-import org.slf4j.Logger;
-
-import javax.annotation.Nonnull;
-
-/**
- * @author Yoav Landman
- */
-public interface MutableStatusHolder extends StatusHolder {
-
-    //TODO: [by YS] this should only be in the importexport status holder
-    void setFastFail(boolean failFast);
-
-    void setVerbose(boolean verbose);
-
-    void debug(String message, @Nonnull Logger logger);
-
-    void status(String message, @Nonnull Logger logger);
-
-    void status(String message, int statusCode, @Nonnull Logger logger);
-
-    void warn(String message, @Nonnull Logger logger);
-
-    void warn(String message, int statusCode, @Nonnull Logger logger);
-
-    void warn(String message, Throwable throwable, @Nonnull Logger logger);
-
-    void warn(String message, int statusCode, Throwable throwable, @Nonnull Logger logger);
-
-    void error(String message, @Nonnull Logger logger);
-
-    void error(String message, int statusCode, @Nonnull Logger logger);
-
-    void error(String message, Throwable throwable, @Nonnull Logger logger);
-
-    void error(String message, int statusCode, Throwable throwable, @Nonnull Logger logger);
-
-    void setActivateLogging(boolean activateLogging);
-
-    void reset();
-}
diff --git a/base/capi/src/main/java/org/artifactory/factory/BasicFactory.java b/base/capi/src/main/java/org/artifactory/factory/BasicFactory.java
deleted file mode 100644
index 01ccdc9..0000000
--- a/base/capi/src/main/java/org/artifactory/factory/BasicFactory.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.artifactory.factory;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Date: 8/4/11
- * Time: 9:30 PM
- *
- * @author Fred Simon
- */
-public abstract class BasicFactory {
-    private static final Logger log = LoggerFactory.getLogger(BasicFactory.class);
-
-    public static <T> T createInstance(Class<T> clazz, String className) {
-        T result = null;
-        try {
-            Class<T> cls =
-                    (Class<T>) Thread.currentThread().getContextClassLoader().loadClass(className);
-            result = cls.newInstance();
-        } catch (Exception e) {
-            log.error("Could not create the default factory object due to:" + e.getMessage(), e);
-        }
-        return result;
-    }
-}
diff --git a/base/capi/src/main/java/org/artifactory/factory/InfoFactory.java b/base/capi/src/main/java/org/artifactory/factory/InfoFactory.java
deleted file mode 100644
index fdb19f8..0000000
--- a/base/capi/src/main/java/org/artifactory/factory/InfoFactory.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.factory;
-
-import com.thoughtworks.xstream.XStream;
-import org.apache.commons.compress.archivers.ArchiveEntry;
-import org.artifactory.checksum.ChecksumsInfo;
-import org.artifactory.fs.*;
-import org.artifactory.md.MutableMetadataInfo;
-import org.artifactory.md.MutablePropertiesInfo;
-import org.artifactory.md.PropertiesInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.resource.MutableRepoResourceInfo;
-import org.artifactory.resource.RepoResourceInfo;
-import org.artifactory.security.*;
-import org.artifactory.util.Tree;
-
-import java.util.List;
-import java.util.Set;
-import java.util.zip.ZipEntry;
-
-/**
- * Date: 8/1/11
- * Time: 8:46 PM
- *
- * @author Fred Simon
- */
-public interface InfoFactory {
-    RepoPath createRepoPathFromId(String repoPathId);
-
-    RepoPath createRepoPath(String repoKey, String path);
-
-    RepoPath createRepoPath(RepoPath parent, String relPath);
-
-    MutableRepoResourceInfo copyRepoResource(RepoResourceInfo repoResourceInfo);
-
-    MutableItemInfo copyItemInfo(ItemInfo itemInfo);
-
-    MutableFileInfo createFileInfo(RepoPath repoPath);
-
-    MutableFileInfo copyFileInfo(FileInfo fileInfo);
-
-    MutableFolderInfo createFolderInfo(RepoPath repoPath);
-
-    MutableFolderInfo copyFolderInfo(FolderInfo folderInfo);
-
-    MutablePropertiesInfo createProperties();
-
-    MutablePermissionTargetInfo createPermissionTarget();
-
-    MutablePropertiesInfo copyProperties(PropertiesInfo copy);
-
-    MutablePermissionTargetInfo copyPermissionTarget(PermissionTargetInfo copy);
-
-    MutableUserInfo createUser();
-
-    MutableUserInfo copyUser(UserInfo copy);
-
-    MutableGroupInfo createGroup();
-
-    MutableGroupInfo copyGroup(GroupInfo copy);
-
-    MutableAclInfo createAcl();
-
-    MutableAclInfo copyAcl(AclInfo copy);
-
-    MutableAceInfo createAce();
-
-    MutableAceInfo copyAce(AceInfo copy);
-
-    UserGroupInfo createUserGroup(String groupName);
-
-    Set<UserGroupInfo> createGroups(Set<String> names);
-
-    UserGroupInfo createUserGroup(String groupName, String realm);
-
-    SecurityInfo createSecurityInfo(List<UserInfo> users, List<GroupInfo> groups, List<AclInfo> acls);
-
-    XStream getSecurityXStream();
-
-    MutablePermissionTargetInfo createPermissionTarget(String permName, List<String> repoKeys);
-
-    MutableAceInfo createAce(String principal, boolean group, int mask);
-
-    MutableGroupInfo createGroup(String groupName);
-
-    MutableUserInfo createUser(String userName);
-
-    MutableAclInfo createAcl(PermissionTargetInfo permissionTarget);
-
-    /**
-     * Return an immutable ACL
-     * @param permissionTarget
-     * @param aces
-     * @param updatedBy
-     * @return
-     */
-    AclInfo createAcl(PermissionTargetInfo permissionTarget, Set<AceInfo> aces, String updatedBy);
-
-    Tree<ZipEntryInfo> createZipEntriesTree();
-
-    ZipEntryInfo createZipEntry(ZipEntry... zipEntry);
-
-    ZipEntryInfo createArchiveEntry(ArchiveEntry... archiveEntries);
-
-    ZipEntryResourceInfo createZipEntryResource(FileInfo info, ZipEntryInfo zipEntryInfo, long actualSize,
-            ChecksumsInfo checksumsInfo);
-
-    MutableMetadataInfo createMetadata(RepoPath repoPath);
-
-    XStream getFileSystemXStream();
-
-    MutableStatsInfo createStats();
-
-    MutableStatsInfo copyStats(StatsInfo copy);
-
-    MutableWatchersInfo createWatchers();
-
-    MutableWatcherInfo createWatcher(String watcherUsername, long watchCreationDate);
-
-    MetadataEntryInfo createMetadataEntry(String metadataName, String xmlContent);
-
-    MutableWatchersInfo copyWatchers(WatchersInfo copy);
-
-    MutableMetadataInfo createMetadata(RepoPath repoPath, String metadataName);
-
-    RepoPath createRepoPath(String repoKey, String path, boolean folder);
-}
diff --git a/base/capi/src/main/java/org/artifactory/factory/InfoFactoryHolder.java b/base/capi/src/main/java/org/artifactory/factory/InfoFactoryHolder.java
deleted file mode 100644
index ec39e01..0000000
--- a/base/capi/src/main/java/org/artifactory/factory/InfoFactoryHolder.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.factory;
-
-/**
- * Date: 8/1/11
- * Time: 8:59 PM
- *
- * @author Fred Simon
- */
-public abstract class InfoFactoryHolder {
-    private static final InfoFactory DEFAULT_FACTORY;
-
-    public static InfoFactory get() {
-        return DEFAULT_FACTORY;
-    }
-
-    static {
-        DEFAULT_FACTORY = BasicFactory.createInstance(InfoFactory.class,
-                "org.artifactory.factory.xstream.XStreamInfoFactory");
-    }
-}
diff --git a/base/capi/src/main/java/org/artifactory/fs/MetadataEntryInfo.java b/base/capi/src/main/java/org/artifactory/fs/MetadataEntryInfo.java
deleted file mode 100644
index 5f7cdb3..0000000
--- a/base/capi/src/main/java/org/artifactory/fs/MetadataEntryInfo.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.fs;
-
-import org.artifactory.common.Info;
-
-/**
- * Date: 8/2/11
- * Time: 12:31 AM
- *
- * @author Fred Simon
- */
-public interface MetadataEntryInfo extends Info {
-    String getMetadataName();
-
-    String getXmlContent();
-}
diff --git a/base/capi/src/main/java/org/artifactory/fs/MutableFileInfo.java b/base/capi/src/main/java/org/artifactory/fs/MutableFileInfo.java
deleted file mode 100644
index d7e73f6..0000000
--- a/base/capi/src/main/java/org/artifactory/fs/MutableFileInfo.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.fs;
-
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.resource.MutableRepoResourceInfo;
-
-/**
- * @author Yoav Landman
- */
-public interface MutableFileInfo extends FileInfo, MutableItemInfo, MutableRepoResourceInfo {
-
-    void setMimeType(String mimeType);
-
-    void createTrustedChecksums();
-
-    void addChecksumInfo(ChecksumInfo info);
-}
diff --git a/base/capi/src/main/java/org/artifactory/fs/MutableFolderInfo.java b/base/capi/src/main/java/org/artifactory/fs/MutableFolderInfo.java
deleted file mode 100644
index 0f4eb82..0000000
--- a/base/capi/src/main/java/org/artifactory/fs/MutableFolderInfo.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.fs;
-
-/**
- * Date: 8/1/11
- * Time: 7:15 PM
- *
- * @author Fred Simon
- */
-public interface MutableFolderInfo extends MutableItemInfo, FolderInfo {
-}
diff --git a/base/capi/src/main/java/org/artifactory/fs/MutableItemInfo.java b/base/capi/src/main/java/org/artifactory/fs/MutableItemInfo.java
deleted file mode 100644
index f37327b..0000000
--- a/base/capi/src/main/java/org/artifactory/fs/MutableItemInfo.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.fs;
-
-/**
- * @author Yoav Landman
- */
-public interface MutableItemInfo extends ItemInfo {
-
-    void setCreated(long created);
-
-    void setLastModified(long lastModified);
-
-    void setModifiedBy(String name);
-
-    void setCreatedBy(String name);
-
-    void setLastUpdated(long lastUpdated);
-
-    boolean merge(MutableItemInfo itemInfo);
-}
diff --git a/base/capi/src/main/java/org/artifactory/fs/MutableStatsInfo.java b/base/capi/src/main/java/org/artifactory/fs/MutableStatsInfo.java
deleted file mode 100644
index 09bacf0..0000000
--- a/base/capi/src/main/java/org/artifactory/fs/MutableStatsInfo.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.fs;
-
-/**
- * Date: 8/3/11
- * Time: 1:22 PM
- *
- * @author Fred Simon
- */
-public interface MutableStatsInfo extends StatsInfo {
-
-    void setDownloadCount(long downloadCount);
-
-    void setLastDownloaded(long lastDownloaded);
-
-    void setLastDownloadedBy(String lastDownloadedBy);
-
-    void setRemoteDownloadCount(long remoteDownloadCount);
-
-    void setRemoteLastDownloaded(long remoteLastDownloaded);
-
-    void setRemoteLastDownloadedBy(String remoteLastDownloadedBy);
-
-    void setOrigin(String origin);
-}
diff --git a/base/capi/src/main/java/org/artifactory/fs/MutableWatcherInfo.java b/base/capi/src/main/java/org/artifactory/fs/MutableWatcherInfo.java
deleted file mode 100644
index c2388fd..0000000
--- a/base/capi/src/main/java/org/artifactory/fs/MutableWatcherInfo.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.fs;
-
-/**
- * Date: 8/3/11
- * Time: 2:17 PM
- *
- * @author Fred Simon
- */
-public interface MutableWatcherInfo extends WatcherInfo {
-
-    void setUsername(String username);
-
-    void setWatchingSinceTime(long watchingSinceTime);
-}
diff --git a/base/capi/src/main/java/org/artifactory/fs/MutableWatchersInfo.java b/base/capi/src/main/java/org/artifactory/fs/MutableWatchersInfo.java
deleted file mode 100644
index ae826a7..0000000
--- a/base/capi/src/main/java/org/artifactory/fs/MutableWatchersInfo.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.fs;
-
-/**
- * Date: 8/3/11
- * Time: 2:20 PM
- *
- * @author Fred Simon
- */
-public interface MutableWatchersInfo extends WatchersInfo {
-
-    void addWatcher(WatcherInfo watcher);
-
-    void removeWatcher(String username);
-
-}
diff --git a/base/capi/src/main/java/org/artifactory/fs/RepoResource.java b/base/capi/src/main/java/org/artifactory/fs/RepoResource.java
deleted file mode 100644
index db8e4fe..0000000
--- a/base/capi/src/main/java/org/artifactory/fs/RepoResource.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.fs;
-
-import org.artifactory.repo.RepoPath;
-import org.artifactory.resource.RepoResourceInfo;
-
-import java.io.Serializable;
-
-/**
- * A resolution result, encapsulating the outcome of a resource request against a repo.
- *
- * @author yoavl
- */
-public interface RepoResource extends Serializable {
-
-    /**
-     * @return The resource repository path. This path might be virtual and is usually represent the path from the
-     * request.
-     */
-    RepoPath getRepoPath();
-
-    /**
-     * @return The actual repo path the resource came from. Might be different from the request repo path. For example
-     * when a request is made on a virtual repository, the response repo path should point to the actual
-     * repository containing this resource.
-     */
-    RepoPath getResponseRepoPath();
-
-    void setResponseRepoPath(RepoPath responsePath);
-
-    RepoResourceInfo getInfo();
-
-    boolean isFound();
-
-    boolean isExactQueryMatch();
-
-    boolean isExpired();
-
-    boolean isMetadata();
-
-    long getSize();
-
-    long getCacheAge();
-
-    long getLastModified();
-
-    String getEtag();
-
-    String getMimeType();
-
-    /**
-     * Returns true if this resource represents a resource which might get expired (metadata, properties, non-unique
-     * snapshots etc.). Expirable resources should prevent or limit http caching.
-     *
-     * @return True if this resource is expirable
-     */
-    boolean isExpirable();
-
-    /**
-     * Sets this resource as expirable to indicate how http caches should cache this resource.
-     */
-    void expirable();
-}
diff --git a/base/capi/src/main/java/org/artifactory/fs/WatcherInfo.java b/base/capi/src/main/java/org/artifactory/fs/WatcherInfo.java
deleted file mode 100644
index d582926..0000000
--- a/base/capi/src/main/java/org/artifactory/fs/WatcherInfo.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.fs;
-
-import org.artifactory.common.Info;
-
-import java.util.Date;
-
-/**
- * Date: 8/3/11
- * Time: 2:19 PM
- *
- * @author Fred Simon
- */
-public interface WatcherInfo extends Info {
-    String ROOT = "watcher";
-
-    String getUsername();
-
-    long getWatchingSinceTime();
-
-    Date getWatchingSinceDate();
-}
diff --git a/base/capi/src/main/java/org/artifactory/fs/WatchersInfo.java b/base/capi/src/main/java/org/artifactory/fs/WatchersInfo.java
deleted file mode 100644
index 0f63547..0000000
--- a/base/capi/src/main/java/org/artifactory/fs/WatchersInfo.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.fs;
-
-import org.artifactory.common.Info;
-
-import java.util.Set;
-
-/**
- * Date: 8/3/11
- * Time: 2:23 PM
- *
- * @author Fred Simon
- */
-public interface WatchersInfo extends Info {
-    String ROOT = "watchers";
-
-    Set<WatcherInfo> getWatchers();
-
-    WatcherInfo getWatcher(String username);
-
-    boolean isUserWatching(String username);
-
-    boolean isEmpty();
-}
diff --git a/base/capi/src/main/java/org/artifactory/fs/ZipEntryInfo.java b/base/capi/src/main/java/org/artifactory/fs/ZipEntryInfo.java
deleted file mode 100644
index 5e30a02..0000000
--- a/base/capi/src/main/java/org/artifactory/fs/ZipEntryInfo.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.fs;
-
-/**
- * Date: 8/1/11
- * Time: 11:37 PM
- *
- * @author Fred Simon
- */
-public interface ZipEntryInfo {
-    /**
-     * @return The full path of the archive entry in the given archive
-     */
-    String getPath();
-
-    /**
-     * @return File or folder name of archive entry
-     */
-    String getName();
-
-    long getTime();
-
-    long getCrc();
-
-    long getSize();
-
-    long getCompressedSize();
-
-    String getComment();
-
-    boolean isDirectory();
-}
diff --git a/base/capi/src/main/java/org/artifactory/fs/ZipEntryRepoResource.java b/base/capi/src/main/java/org/artifactory/fs/ZipEntryRepoResource.java
deleted file mode 100644
index 6ddc028..0000000
--- a/base/capi/src/main/java/org/artifactory/fs/ZipEntryRepoResource.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.artifactory.fs;
-
-/**
- * Date: 8/4/11
- * Time: 6:15 PM
- *
- * @author Fred Simon
- */
-public interface ZipEntryRepoResource extends RepoResource {
-    String getEntryPath();
-}
diff --git a/base/capi/src/main/java/org/artifactory/fs/ZipEntryResourceInfo.java b/base/capi/src/main/java/org/artifactory/fs/ZipEntryResourceInfo.java
deleted file mode 100644
index 65a063b..0000000
--- a/base/capi/src/main/java/org/artifactory/fs/ZipEntryResourceInfo.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.fs;
-
-/**
- * Date: 8/3/11
- * Time: 12:18 PM
- *
- * @author Fred Simon
- */
-public interface ZipEntryResourceInfo extends FileInfo {
-    String getEntryPath();
-
-    FileInfo getZipFileInfo();
-
-    ZipEntryInfo getZipEntryInfo();
-}
diff --git a/base/capi/src/main/java/org/artifactory/interceptor/Interceptor.java b/base/capi/src/main/java/org/artifactory/interceptor/Interceptor.java
deleted file mode 100644
index ab5c09a..0000000
--- a/base/capi/src/main/java/org/artifactory/interceptor/Interceptor.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.interceptor;
-
-import java.io.Serializable;
-
-/**
- * Marker interface for all interceptors
- *
- * @author yoav
- */
-public interface Interceptor<T> extends Serializable {
-
-}
\ No newline at end of file
diff --git a/base/capi/src/main/java/org/artifactory/md/MutableMetadataInfo.java b/base/capi/src/main/java/org/artifactory/md/MutableMetadataInfo.java
deleted file mode 100644
index 9f8c765..0000000
--- a/base/capi/src/main/java/org/artifactory/md/MutableMetadataInfo.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-import org.artifactory.resource.MutableRepoResourceInfo;
-
-/**
- * @author yoavl
- */
-public interface MutableMetadataInfo extends MetadataInfo, MutableRepoResourceInfo {
-
-    void setName(String name);
-
-    void setCreated(long created);
-
-    void setLastModifiedBy(String lastModifiedBy);
-}
diff --git a/base/capi/src/main/java/org/artifactory/repo/InternalRepoPathFactory.java b/base/capi/src/main/java/org/artifactory/repo/InternalRepoPathFactory.java
deleted file mode 100644
index 5375bea..0000000
--- a/base/capi/src/main/java/org/artifactory/repo/InternalRepoPathFactory.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.security.PermissionTargetInfo;
-import org.artifactory.util.PathUtils;
-
-/**
- * An internal factory for creating RepoPath objects.
- * <p/>
- *
- * @author Yoav Landman
- */
-public abstract class InternalRepoPathFactory extends RepoPathFactory {
-
-    public static RepoPath create(String repoKey, String path, boolean folder) {
-        return InfoFactoryHolder.get().createRepoPath(repoKey, path, folder);
-    }
-
-    public static RepoPath create(String repoKey, String path) {
-        return InfoFactoryHolder.get().createRepoPath(repoKey, path);
-    }
-
-    public static RepoPath create(RepoPath parent, String relPath) {
-        return InfoFactoryHolder.get().createRepoPath(parent, relPath);
-    }
-
-    /**
-     * Constructs a RepoPath from a RepoPath identifier in the format of repoKey:path
-     *
-     * @param repoPathId
-     * @return
-     */
-    public static RepoPath fromId(String repoPathId) {
-        return InfoFactoryHolder.get().createRepoPathFromId(repoPathId);
-    }
-
-    /**
-     * @param repoKey The repository key
-     * @return Return the root repo path of the given repository
-     */
-    public static RepoPath repoRootPath(String repoKey) {
-        return create(repoKey, StringUtils.EMPTY);
-    }
-
-    /**
-     * Builds a repository path to a resource inside an archive file. <p/> The format is
-     * <code>archiveRepoPath!/resourcePath</code>
-     *
-     * @param archiveRepoPath Repo path to an archive file (zip, jar etc.)
-     * @param resourcePath    Path to a resource (file or folder) inside the archive
-     * @return Repo path to a resource inside an archive file
-     */
-    public static RepoPath archiveResourceRepoPath(RepoPath archiveRepoPath, String resourcePath) {
-        if (!resourcePath.startsWith("/")) {
-            resourcePath = "/" + resourcePath;
-        }
-        return create(archiveRepoPath.getRepoKey(),
-                archiveRepoPath.getPath() + RepoPath.ARCHIVE_SEP + resourcePath);
-    }
-
-    public static RepoPath childRepoPath(RepoPath repoPath, String childRelPath) {
-        if (!childRelPath.startsWith("/")) {
-            childRelPath = "/" + childRelPath;
-        }
-        return create(repoPath.getRepoKey(), repoPath.getPath() + childRelPath);
-    }
-
-    public static RepoPath secureRepoPathForRepo(String repoKey) {
-        return create(repoKey, PermissionTargetInfo.ANY_PATH);
-    }
-
-    public static RepoPath cacheRepoPath(RepoPath remoteRepoPath) {
-        return create(remoteRepoPath.getRepoKey() + RepoPath.REMOTE_CACHE_SUFFIX, remoteRepoPath.getPath(),
-                remoteRepoPath.isFolder());
-    }
-
-
-    public static RepoPath createRepoPath(String id) {
-        if (id == null || id.length() == 0) {
-            throw new IllegalArgumentException(
-                    "RepoAndPathIdIdentity cannot have a null id");
-        }
-        int idx = id.indexOf(RepoPath.REPO_PATH_SEP);
-        if (idx <= 0) {
-            throw new IllegalArgumentException(
-                    "Could not determine both repository key and path from '" +
-                            id + "'.");
-        }
-        String repoKey = id.substring(0, idx);
-        String path = PathUtils.formatRelativePath(id.substring(idx + 1));
-        return create(repoKey, path);
-    }
-
-}
\ No newline at end of file
diff --git a/base/capi/src/main/java/org/artifactory/resource/MutableRepoResourceInfo.java b/base/capi/src/main/java/org/artifactory/resource/MutableRepoResourceInfo.java
deleted file mode 100644
index c3bf730..0000000
--- a/base/capi/src/main/java/org/artifactory/resource/MutableRepoResourceInfo.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.resource;
-
-import org.artifactory.checksum.ChecksumInfo;
-
-import java.util.Set;
-
-/**
- * Basic information about the file. Internally not stored as XML but as node properties
- *
- * @author yoavl
- */
-public interface MutableRepoResourceInfo extends RepoResourceInfo {
-
-    void setLastModified(long modified);
-
-    void setSize(long size);
-
-    void setChecksums(Set<ChecksumInfo> checksums);
-}
\ No newline at end of file
diff --git a/base/capi/src/main/java/org/artifactory/sapi/common/ArtifactorySession.java b/base/capi/src/main/java/org/artifactory/sapi/common/ArtifactorySession.java
deleted file mode 100644
index d52c1f9..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/common/ArtifactorySession.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.artifactory.sapi.common;
-
-import java.util.concurrent.Callable;
-
-/**
- * Date: 8/5/11
- * Time: 4:31 PM
- *
- * @author Fred Simon
- */
-public interface ArtifactorySession {
-    void save();
-
-    void logout();
-
-    void addLogoutListener(Callable callable);
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/common/BaseSettings.java b/base/capi/src/main/java/org/artifactory/sapi/common/BaseSettings.java
deleted file mode 100644
index 4c882c2..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/common/BaseSettings.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.common;
-
-import org.artifactory.common.MutableStatusHolder;
-import org.slf4j.Logger;
-
-import java.io.File;
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * Date: 8/3/11
- * Time: 4:00 PM
- *
- * @author Fred Simon
- */
-public interface BaseSettings extends Serializable {
-    String FULL_SYSTEM = "FULL";
-
-    File getBaseDir();
-
-    boolean isIncludeMetadata();
-
-    void setIncludeMetadata(boolean includeMetadata);
-
-    List<String> getRepositories();
-
-    void setRepositories(List<String> repositories);
-
-    boolean isVerbose();
-
-    void setVerbose(boolean verbose);
-
-    /**
-     * @return True if the import/export should fail immediately on certain errors.
-     */
-    boolean isFailFast();
-
-    /**
-     * Is set to true certain import/export actions will fail immediately on error instead of just logging the error
-     * and continuing with the import/export.
-     *
-     * @param failFast True to fail fast, false otherwise
-     */
-    void setFailFast(boolean failFast);
-
-    boolean isFailIfEmpty();
-
-    void setFailIfEmpty(boolean failIfEmpty);
-
-    MutableStatusHolder getStatusHolder();
-
-    boolean isExcludeContent();
-
-    void setExcludeContent(boolean excludeContent);
-
-    void alertFailIfEmpty(String message, Logger log);
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/common/ExportSettings.java b/base/capi/src/main/java/org/artifactory/sapi/common/ExportSettings.java
deleted file mode 100644
index b671a7e..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/common/ExportSettings.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.common;
-
-import java.io.File;
-import java.util.Date;
-
-/**
- * Date: 8/4/11
- * Time: 2:15 PM
- *
- * @author Fred Simon
- */
-public interface ExportSettings extends BaseSettings {
-    boolean isIgnoreRepositoryFilteringRulesOn();
-
-    void setIgnoreRepositoryFilteringRulesOn(boolean ignoreRepositoryFilteringRulesOn);
-
-    boolean isCreateArchive();
-
-    void setCreateArchive(boolean createArchive);
-
-    Date getTime();
-
-    void setTime(Date time);
-
-    boolean isIncremental();
-
-    void setIncremental(boolean incremental);
-
-    boolean isM2Compatible();
-
-    void setM2Compatible(boolean m2Compatible);
-
-    void addCallback(FileExportCallback callback);
-
-    void executeCallbacks(FileExportInfo info, FileExportEvent event);
-
-    void cleanCallbacks();
-
-    boolean isExcludeBuilds();
-
-    void setExcludeBuilds(boolean excludeBuilds);
-
-
-    /**
-     * @return The location of the backup. This can be a folder or a file in case of an archive backup.
-     */
-    public File getOutputFile();
-
-    /**
-     * Sets the location of the backup. This can be a folder or a file in case of an archive backup.
-     */
-    public void setOutputFile(File outputFile);
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/common/FileExportCallback.java b/base/capi/src/main/java/org/artifactory/sapi/common/FileExportCallback.java
deleted file mode 100644
index cbe8bda..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/common/FileExportCallback.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.common;
-
-import java.util.Set;
-
-/**
- * Callback called before exporting a VFS file
- *
- * @author Noam Tenne
- */
-public interface FileExportCallback {
-    /**
-     * Perform action
-     *
-     * @param currentSettings Currently used export settings
-     * @param fileRepoPath    Repo Path of currently exported file
-     */
-    void callback(ExportSettings currentSettings, FileExportInfo info);
-
-    /**
-     * A chance to cleanup internal resources
-     */
-    void cleanup();
-
-    /**
-     * Which export event triggers this callback
-     *
-     * @return
-     */
-    Set<FileExportEvent> triggeringEvents();
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/common/FileExportEvent.java b/base/capi/src/main/java/org/artifactory/sapi/common/FileExportEvent.java
deleted file mode 100644
index cf96ce9..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/common/FileExportEvent.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.common;
-
-/**
- * Date: 12/12/11
- * Time: 12:15
- *
- * @author Dror Bereznitsky
- */
-public enum FileExportEvent {
-    BEFORE_FILE_EXPORT,
-    AFTER_FILE_EXPORT,
-    BEFORE_FILE_REMOVED;
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/common/FileExportInfo.java b/base/capi/src/main/java/org/artifactory/sapi/common/FileExportInfo.java
deleted file mode 100644
index fa03f26..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/common/FileExportInfo.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.common;
-
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.FolderInfo;
-
-import java.io.File;
-
-/**
- * Date: 12/12/11
- * Time: 11:24
- *
- * @author Dror Bereznitsky
- */
-public interface FileExportInfo {
-    FileInfo getFileInfo();
-
-    FolderInfo getParentInfo();
-
-    File getTargetPath();
-
-    FileExportStatus status();
-
-    public enum FileExportStatus {
-        PENDING, ADDED, REMOVED, SKIPPED;
-    }
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/common/ImportSettings.java b/base/capi/src/main/java/org/artifactory/sapi/common/ImportSettings.java
deleted file mode 100644
index e975e7e..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/common/ImportSettings.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.common;
-
-import org.artifactory.sapi.fs.MetadataReader;
-
-/**
- * Date: 8/3/11
- * Time: 4:40 PM
- *
- * @author Fred Simon
- */
-public interface ImportSettings extends BaseSettings {
-
-    MetadataReader getMetadataReader();
-
-    void setMetadataReader(MetadataReader metadataReader);
-
-    boolean isIndexMarkedArchives();
-
-    void setIndexMarkedArchives(boolean indexMarkedArchives);
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/common/Lock.java b/base/capi/src/main/java/org/artifactory/sapi/common/Lock.java
deleted file mode 100644
index 429672c..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/common/Lock.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.common;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Create a thread (thus session) scoped lock manager to manage subsequent locking operations scopes.
- *
- * @author freds
- * @date Oct 27, 2008
- */
- at Target({ElementType.METHOD})
- at Retention(RetentionPolicy.RUNTIME)
- at Inherited
- at Documented
-public @interface Lock {
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/common/PathBuilder.java b/base/capi/src/main/java/org/artifactory/sapi/common/PathBuilder.java
deleted file mode 100644
index 480823f..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/common/PathBuilder.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.common;
-
-/**
- * Date: 8/4/11
- * Time: 11:59 AM
- *
- * @author Fred Simon
- */
-public interface PathBuilder {
-    PathBuilder append(String... pathElements);
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/common/PathFactory.java b/base/capi/src/main/java/org/artifactory/sapi/common/PathFactory.java
deleted file mode 100644
index 43d4095..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/common/PathFactory.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.common;
-
-import org.artifactory.repo.RepoPath;
-
-import java.io.File;
-
-/**
- * Date: 8/4/11
- * Time: 11:38 AM
- *
- * @author Fred Simon
- */
-public interface PathFactory {
-    String escape(String pathElement);
-
-    String getAllRepoRootPath();
-
-    File getRepositoriesExportDir(File exportDir);
-
-    String getAbsolutePath(RepoPath repoPath);
-
-    RepoPath getRepoPath(String absPath);
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/common/RepositoryRuntimeException.java b/base/capi/src/main/java/org/artifactory/sapi/common/RepositoryRuntimeException.java
deleted file mode 100644
index de90720..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/common/RepositoryRuntimeException.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.common;
-
-/**
- * @author Yoav Landman
- */
-public class RepositoryRuntimeException extends RuntimeException {
-
-    public RepositoryRuntimeException(String message) {
-        super(message);
-    }
-
-    public RepositoryRuntimeException(Throwable cause) {
-        super(cause);
-    }
-
-    public RepositoryRuntimeException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/common/TxPropagation.java b/base/capi/src/main/java/org/artifactory/sapi/common/TxPropagation.java
deleted file mode 100644
index 7be33fd..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/common/TxPropagation.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.artifactory.sapi.common;
-
-/**
- * Date: 8/5/11
- * Time: 11:19 AM
- *
- * @author Fred Simon
- */
-public enum TxPropagation {
-    NEVER, REQUIRED, ENFORCED, SUPPORTS
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/data/BinaryContent.java b/base/capi/src/main/java/org/artifactory/sapi/data/BinaryContent.java
deleted file mode 100644
index 033589f..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/data/BinaryContent.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.data;
-
-import org.artifactory.checksum.ChecksumsInfo;
-
-import java.io.InputStream;
-
-/**
- * Date: 8/4/11
- * Time: 10:18 AM
- *
- * @author Fred Simon
- */
-public interface BinaryContent {
-    String binaryId();
-
-    long getSize();
-
-    String getMimeType();
-
-    String getEncoding();
-
-    String getContentAsString();
-
-    InputStream getStream();
-
-    ChecksumsInfo getChecksums();
-
-    void checkClosed();
-
-    long getLastModified();
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/data/MutableBinaryContent.java b/base/capi/src/main/java/org/artifactory/sapi/data/MutableBinaryContent.java
deleted file mode 100644
index 2edda3e..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/data/MutableBinaryContent.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.artifactory.sapi.data;
-
-/**
- * Date: 8/5/11
- * Time: 2:29 PM
- *
- * @author Fred Simon
- */
-public interface MutableBinaryContent extends BinaryContent {
-    void setLastModified(long lastModified);
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/data/VfsProperty.java b/base/capi/src/main/java/org/artifactory/sapi/data/VfsProperty.java
deleted file mode 100644
index 45d5074..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/data/VfsProperty.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.data;
-
-import java.util.Calendar;
-import java.util.Collection;
-
-/**
- * A property value container for any VfsNode.
- * We support auto multi values for strings.
- * We don't support multi values for long and date.
- * <p/>
- * Date: 8/4/11
- * Time: 9:06 AM
- *
- * @author Fred Simon
- */
-public interface VfsProperty {
-
-    public enum VfsValueType {STRING, LONG, DATE}
-
-    public enum VfsPropertyType {AUTO, SINGLE, MULTI_VALUE}
-
-    VfsValueType getValueType();
-
-    VfsPropertyType getPropertyType();
-
-    String getString();
-
-    Collection<String> getStrings();
-
-    Long getLong();
-
-    Calendar getDate();
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/fs/MetadataReader.java b/base/capi/src/main/java/org/artifactory/sapi/fs/MetadataReader.java
deleted file mode 100644
index d48bdd3..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/fs/MetadataReader.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.fs;
-
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.fs.MetadataEntryInfo;
-
-import java.io.File;
-import java.util.List;
-
-/**
- * @author freds
- * @date Nov 13, 2008
- */
-public interface MetadataReader {
-    List<MetadataEntryInfo> getMetadataEntries(File file, MutableStatusHolder status);
-
-    MetadataEntryInfo convertMetadataEntry(MetadataEntryInfo metadataEntryInfo);
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/fs/MutableVfsFile.java b/base/capi/src/main/java/org/artifactory/sapi/fs/MutableVfsFile.java
deleted file mode 100644
index dda3ca0..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/fs/MutableVfsFile.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.fs;
-
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.MutableFileInfo;
-import org.artifactory.fs.StatsInfo;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.io.InputStream;
-
-/**
- * A mutable interface of a virtual file.
- *
- * @author Yossi Shaul
- */
-public interface MutableVfsFile extends MutableVfsItem<MutableFileInfo>, VfsFile<MutableFileInfo> {
-    /**
-     * Sets the client provided checksum. This value is provided by the user and might not be a valid checksum.
-     *
-     * @param type     The checksum type. Either sha1 or md5
-     * @param checksum The user provided checksum value
-     */
-    void setClientChecksum(@Nonnull ChecksumType type, @Nullable String checksum);
-
-    /**
-     * Sets the client provided sha1 checksum. This value is provided by the user and might not be a valid checksum.
-     *
-     * @param sha1 The user provided sha1 checksum
-     */
-    void setClientSha1(@Nullable String sha1);
-
-    /**
-     * Sets the client provided md5 checksum. This value is provided by the user and might not be a valid checksum.
-     *
-     * @param md5 The user provided sha1 checksum
-     */
-    void setClientMd5(String md5);
-
-    void fillBinaryData(InputStream in);
-
-    /**
-     * Sets the statistics data on this mutable file. Used only during import.
-     *
-     * @param statsInfo The stats info to set on this file
-     */
-    void setStats(StatsInfo statsInfo);
-
-    /**
-     * Fills the non-content dependent fields (real checksums) from the source info.
-     *
-     * @param sourceInfo The source file info to read data from
-     */
-    void fillInfo(FileInfo sourceInfo);
-
-    /**
-     * Automatically adds a binary record to the database if binary matching the given sha1 exists in the binary
-     * provider. This method is required to support skeleton import.
-     *
-     * @param sha1   The binary sha1 checksum
-     * @param md5    The binary md5 checksum
-     * @param length The length of the binary
-     * @return True if the record exists or was added successfully
-     */
-    boolean tryUsingExistingBinary(String sha1, String md5, long length);
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/fs/MutableVfsFolder.java b/base/capi/src/main/java/org/artifactory/sapi/fs/MutableVfsFolder.java
deleted file mode 100644
index 330a508..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/fs/MutableVfsFolder.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.fs;
-
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.fs.MutableFolderInfo;
-
-import java.util.List;
-
-/**
- * A mutable interface of a virtual folder.
- *
- * @author Yossi Shaul
- */
-public interface MutableVfsFolder extends MutableVfsItem<MutableFolderInfo>, VfsFolder<MutableFolderInfo> {
-
-    /**
-     * Fill the mutable info of this folder from the source folder info. Repo path is not taken from the source.
-     *
-     * @param source Source of the info to copy.
-     */
-    public void fillInfo(FolderInfo source);
-
-    /**
-     * @return A list of mutable children of this folder.
-     */
-    List<MutableVfsItem> getMutableChildren();
-
-    /**
-     * Deletes entire repository content including the root folder.
-     */
-    void deleteIncludingRoot();
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/fs/MutableVfsItem.java b/base/capi/src/main/java/org/artifactory/sapi/fs/MutableVfsItem.java
deleted file mode 100644
index adf84e0..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/fs/MutableVfsItem.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.fs;
-
-import org.artifactory.fs.MutableItemInfo;
-import org.artifactory.fs.WatcherInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.sapi.interceptor.DeleteContext;
-
-/**
- * The mutable additions for a virtual item.
- *
- * @author Yossi Shaul
- */
-public interface MutableVfsItem<T extends MutableItemInfo> extends VfsItem<T> {
-
-    /**
-     * @return True if this item is new and doesn't exist in the database yet
-     */
-    boolean isNew();
-
-    /**
-     * Marks this for deletion on session save. After the session is saved all the deleted items are automatically
-     * unlocked and removed from the session.
-     *
-     * @param ctx The deletion context
-     * @return TODO: no need to return a value?
-     */
-    boolean delete(DeleteContext ctx);
-
-    /**
-     * @return True is this item was deleted from the database. This only happens after the item is marked for
-     * deletion and the session is saved.
-     */
-    boolean isDeleted();
-
-    boolean hasPendingChanges();
-
-    boolean isMarkedForDeletion();
-
-    void save();
-
-    void setCreated(long created);
-
-    void setCreatedBy(String createBy);
-
-    void setModified(long modified);
-
-    void setModifiedBy(String modifiedBy);
-
-    void setUpdated(long updated);
-
-    void setProperties(Properties properties);
-
-    void addWatch(WatcherInfo watch);
-
-    /**
-     * Marks the state of this item as in error. Items in error state should not be saved by the session manager.
-     * This should not be used occasionally, only in cases where on one hand we don't want to split a transaction to
-     * multiple small ones and on the other hand we don't want single failure to rollback the entire transaction.
-     */
-    void markError();
-
-    /**
-     * Releases any resources held by the current mutable item.
-     * This is called just before the write lock of the mutable item is released, regardless of the item state (success or failure).
-     */
-    void releaseResources();
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/fs/VfsFile.java b/base/capi/src/main/java/org/artifactory/sapi/fs/VfsFile.java
deleted file mode 100644
index c3ca1b2..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/fs/VfsFile.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.fs;
-
-import org.artifactory.fs.FileInfo;
-
-import java.io.InputStream;
-
-/**
- * Immutable interface of a virtual file.
- *
- * @author Yossi Shaul
- */
-public interface VfsFile<T extends FileInfo> extends VfsItem<T> {
-
-    @Override
-    FileInfo getInfo();
-
-    /**
-     * Returns the actual sha1 checksum of the binary for this file.
-     * <b>Note:</b> This might be null during new file creation
-     *
-     * @return The actual sha1 checksum of the binary for this file, null if not constructed yet
-     */
-    String getSha1();
-
-    /**
-     * Returns the actual md5 checksum of the binary for this file.
-     * <b>Note:</b> This might be null during new file creation
-     *
-     * @return The actual sha1 checksum of the binary for this file, null if not constructed yet
-     */
-    String getMd5();
-
-    /**
-     * Returns the input stream of this file. This method will throw an exception if the content doesn't exist
-     * (new item) or the content couldn't be loaded.
-     *
-     * @return An input stream of this file data.
-     */
-    InputStream getStream();
-
-    /**
-     * @return The size, in bytes, of the current file
-     */
-    long length();
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/fs/VfsFolder.java b/base/capi/src/main/java/org/artifactory/sapi/fs/VfsFolder.java
deleted file mode 100644
index 6988459..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/fs/VfsFolder.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.fs;
-
-import org.artifactory.fs.FolderInfo;
-
-import java.util.List;
-
-/**
- * Immutable interface of a virtual folder.
- *
- * @author Yossi Shaul
- */
-public interface VfsFolder<T extends FolderInfo> extends VfsItem<T> {
-    @Override
-    FolderInfo getInfo();
-
-    boolean hasChildren();
-
-    List<VfsItem> getImmutableChildren();
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/fs/VfsItem.java b/base/capi/src/main/java/org/artifactory/sapi/fs/VfsItem.java
deleted file mode 100644
index 000aec4..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/fs/VfsItem.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.fs;
-
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-
-import javax.annotation.Nonnull;
-
-/**
- * An immutable interface of a virtual file/folder.
- *
- * @author Yossi Shaul
- */
-public interface VfsItem<T extends ItemInfo> {
-    /**
-     * @return The storage system id of this item. Zero if the item is not persisted.
-     */
-    long getId();
-
-    /**
-     * @return The path part of the repo path (i.e., path relative to the repo key)
-     */
-    String getPath();
-
-    String getName();
-
-    String getRepoKey();
-
-    RepoPath getRepoPath();
-
-    boolean isFile();
-
-    boolean isFolder();
-
-    long getCreated();
-
-    ItemInfo getInfo();
-
-    @Nonnull
-    Properties getProperties();
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/fs/VfsItemVisitor.java b/base/capi/src/main/java/org/artifactory/sapi/fs/VfsItemVisitor.java
deleted file mode 100644
index cf2acfc..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/fs/VfsItemVisitor.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.fs;
-
-/**
- * A {@link Visitor} of {@link VfsItem}.
- *
- * @author Yossi Shaul
- */
-public interface VfsItemVisitor extends Visitor<VfsItem> {
-
-    void visit(VfsFile file);
-
-    void visit(VfsFolder folder);
-
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/fs/Visitor.java b/base/capi/src/main/java/org/artifactory/sapi/fs/Visitor.java
deleted file mode 100644
index b7bb967..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/fs/Visitor.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.fs;
-
-/**
- * The visitor interface from the <a href="http://www.oodesign.com/visitor-pattern.html">Visitor design pattern</a>.
- *
- * @author Yossi Shaul
- */
-public interface Visitor<T> {
-    public void visit(T visitable);
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/interceptor/DeleteContext.java b/base/capi/src/main/java/org/artifactory/sapi/interceptor/DeleteContext.java
deleted file mode 100644
index c226d94..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/interceptor/DeleteContext.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.artifactory.sapi.interceptor;
-
-import org.artifactory.repo.RepoPath;
-
-/**
- * A context to pass when performing item deletion.
- *
- * @author Yossi Shaul
- */
-public class DeleteContext {
-
-    private final RepoPath repoPath;
-    private boolean calculateMavenMetadata;
-    private boolean triggeredByMove;
-
-    public DeleteContext(RepoPath repoPath) {
-        this.repoPath = repoPath;
-    }
-
-    /**
-     * @return The original repo path send to delete.
-     */
-    public RepoPath getRepoPath() {
-        return repoPath;
-    }
-
-    public boolean isCalculateMavenMetadata() {
-        return calculateMavenMetadata;
-    }
-
-    public DeleteContext calculateMavenMetadata() {
-        return calculateMavenMetadata(true);
-    }
-
-    public DeleteContext calculateMavenMetadata(boolean calculateMavenMetadata) {
-        this.calculateMavenMetadata = calculateMavenMetadata;
-        return this;
-    }
-
-    public boolean isTriggeredByMove() {
-        return triggeredByMove;
-    }
-
-    public DeleteContext triggeredByMove() {
-        triggeredByMove = true;
-        return this;
-    }
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/interceptor/ImportInterceptor.java b/base/capi/src/main/java/org/artifactory/sapi/interceptor/ImportInterceptor.java
deleted file mode 100644
index 1008d1f..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/interceptor/ImportInterceptor.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.interceptor;
-
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.interceptor.Interceptor;
-import org.artifactory.sapi.fs.VfsItem;
-
-/**
- * @author Noam Y. Tenne
- */
-public interface ImportInterceptor extends Interceptor {
-
-    void afterImport(VfsItem fsItem, MutableStatusHolder statusHolder);
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/interceptor/StorageAggregationInterceptor.java b/base/capi/src/main/java/org/artifactory/sapi/interceptor/StorageAggregationInterceptor.java
deleted file mode 100644
index 47e9310..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/interceptor/StorageAggregationInterceptor.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.interceptor;
-
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.interceptor.Interceptor;
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author mamo
- */
-public interface StorageAggregationInterceptor extends Interceptor {
-
-    void afterRepoImport(RepoPath rootRepoPath, int itemsCount, MutableStatusHolder status);
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/interceptor/StorageInterceptor.java b/base/capi/src/main/java/org/artifactory/sapi/interceptor/StorageInterceptor.java
deleted file mode 100644
index 6969d0f..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/interceptor/StorageInterceptor.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.interceptor;
-
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.interceptor.Interceptor;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.fs.VfsItem;
-
-/**
- * @author yoav
- */
-public interface StorageInterceptor extends Interceptor {
-
-    void beforeCreate(VfsItem fsItem, MutableStatusHolder statusHolder);
-
-    void afterCreate(VfsItem fsItem, MutableStatusHolder statusHolder);
-
-    void beforeDelete(VfsItem fsItem, MutableStatusHolder statusHolder, boolean moved);
-
-    void afterDelete(VfsItem fsItem, MutableStatusHolder statusHolder, DeleteContext ctx);
-
-    void beforeMove(VfsItem sourceItem, RepoPath targetRepoPath, MutableStatusHolder statusHolder,
-            Properties properties);
-
-    void afterMove(VfsItem sourceItem, VfsItem targetItem, MutableStatusHolder statusHolder, Properties properties);
-
-    void beforeCopy(VfsItem sourceItem, RepoPath targetRepoPath, MutableStatusHolder statusHolder,
-            Properties properties);
-
-    void afterCopy(VfsItem sourceItem, VfsItem targetItem, MutableStatusHolder statusHolder, Properties properties);
-
-    void beforePropertyCreate(VfsItem fsItem, MutableStatusHolder statusHolder, String name, String... values);
-
-    void afterPropertyCreate(VfsItem fsItem, MutableStatusHolder statusHolder, String name,
-            String... values);
-
-    void beforePropertyDelete(VfsItem fsItem, MutableStatusHolder statusHolder, String name);
-
-    void afterPropertyDelete(VfsItem fsItem, MutableStatusHolder statusHolder, String name);
-}
\ No newline at end of file
diff --git a/base/capi/src/main/java/org/artifactory/sapi/search/ArchiveEntryRow.java b/base/capi/src/main/java/org/artifactory/sapi/search/ArchiveEntryRow.java
deleted file mode 100644
index d896de5..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/search/ArchiveEntryRow.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.search;
-
-/**
- * Date: 12/4/12
- * Time: 10:22 AM
- *
- * @author freds
- */
-public interface ArchiveEntryRow {
-    String getEntryName();
-
-    String getEntryPath();
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/search/InvalidQueryRuntimeException.java b/base/capi/src/main/java/org/artifactory/sapi/search/InvalidQueryRuntimeException.java
deleted file mode 100644
index b730a8c..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/search/InvalidQueryRuntimeException.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.artifactory.sapi.search;
-
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-
-/**
- * Date: 8/6/11
- * Time: 1:56 PM
- *
- * @author Fred Simon
- */
-public class InvalidQueryRuntimeException extends RepositoryRuntimeException {
-    public InvalidQueryRuntimeException(String message) {
-        super(message);
-    }
-
-    public InvalidQueryRuntimeException(Throwable cause) {
-        super(cause);
-    }
-
-    public InvalidQueryRuntimeException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/search/VfsBoolType.java b/base/capi/src/main/java/org/artifactory/sapi/search/VfsBoolType.java
deleted file mode 100644
index 60afa1c..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/search/VfsBoolType.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.artifactory.sapi.search;
-
-/**
- * Date: 8/6/11
- * Time: 12:13 PM
- *
- * @author Fred Simon
- */
-public enum VfsBoolType {
-    AND("and"), OR("or");
-
-    public final String str;
-
-    VfsBoolType(String str) {
-        this.str = str;
-    }
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/search/VfsComparatorType.java b/base/capi/src/main/java/org/artifactory/sapi/search/VfsComparatorType.java
deleted file mode 100644
index 0a76b11..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/search/VfsComparatorType.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.artifactory.sapi.search;
-
-/**
- * Date: 8/5/11
- * Time: 6:38 PM
- *
- * @author Fred Simon
- */
-public enum VfsComparatorType {
-    ANY("IS NOT NULL"), IN("IN"), NONE("IS NULL"),
-    EQUAL("="), NOT_EQUAL("!="),
-    GREATER_THAN(">"), LOWER_THAN("<"),
-    GREATER_THAN_EQUAL(">="), LOWER_THAN_EQUAL("<="),
-    CONTAINS("LIKE"), NOT_CONTAINS("NOT LIKE");
-
-    public final String str;
-
-    VfsComparatorType(String str) {
-        this.str = str;
-    }
-
-    public boolean acceptValue() {
-        return this != ANY && this != NONE;
-    }
-
-    public boolean acceptFunction() {
-        return acceptValue() && this != CONTAINS && this != IN;
-    }
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/search/VfsDateFieldName.java b/base/capi/src/main/java/org/artifactory/sapi/search/VfsDateFieldName.java
deleted file mode 100644
index f66d6e4..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/search/VfsDateFieldName.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.search;
-
-import com.google.common.base.Strings;
-
-/**
- * Date: 4/30/14 6:28 PM
- *
- * @author freds
- */
-public enum VfsDateFieldName {
-    LAST_MODIFIED("modified"),
-    CREATED("created"),
-    LAST_DOWNLOADED("last_downloaded"),
-    LAST_REMOTE_DOWNLOADED("remote_last_downloaded", "last_downloaded");
-
-    private final String propName;
-    private final String propActualName;
-
-    /**
-     * If different tables have same column names,
-     * we'd like to decorate propName with propNameAlias
-     * which will be used as decoration reference to the
-     * actual column name
-     *
-     * @param propNameAlias the alias to the actual propName
-     * @param propName the actual propName
-     */
-    VfsDateFieldName(String propNameAlias, String propName) {
-        this.propName = propNameAlias;
-        this.propActualName = propName;
-    }
-
-    VfsDateFieldName(String propName) {
-        this.propName = propName;
-        this.propActualName = null;
-    }
-
-    public static VfsDateFieldName byPropertyName(String fieldName) {
-        for (VfsDateFieldName dateFieldName : values()) {
-            if (dateFieldName.propName.equals(fieldName)) {
-                return dateFieldName;
-            }
-        }
-        return null;
-    }
-
-    public String getPropName() {
-        return propName;
-    }
-
-    /**
-     * @return Actual propName (if propNameAlias is set)
-     */
-    public String getPropActualName() {
-        return propActualName;
-    }
-
-    public boolean hasPropAlias() {
-        return !Strings.isNullOrEmpty(propActualName);
-    }
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/search/VfsFunctionType.java b/base/capi/src/main/java/org/artifactory/sapi/search/VfsFunctionType.java
deleted file mode 100644
index 69cbb27..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/search/VfsFunctionType.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.search;
-
-/**
- * Query function types
- *
- * @author Noam Y. Tenne
- */
-public enum VfsFunctionType {
-
-    NONE(""), LOWER_CASE("LOWER"), UPPER_CASE("UPPER");
-
-    public final String str;
-
-    VfsFunctionType(String str) {
-        this.str = str;
-    }
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/search/VfsItemFieldName.java b/base/capi/src/main/java/org/artifactory/sapi/search/VfsItemFieldName.java
deleted file mode 100644
index 1bfd72c..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/search/VfsItemFieldName.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.search;
-
-/**
- * Date: 5/11/14 3:14 PM
- *
- * @author freds
- */
-public enum VfsItemFieldName {
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/search/VfsQuery.java b/base/capi/src/main/java/org/artifactory/sapi/search/VfsQuery.java
deleted file mode 100644
index 55e7000..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/search/VfsQuery.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.artifactory.sapi.search;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.Calendar;
-import java.util.Collection;
-
-/**
- * Date: 8/5/11
- * Time: 6:04 PM
- *
- * @author Fred Simon
- */
-public interface VfsQuery {
-    String ALL_PATH_VALUE = "**";
-
-    VfsQuery expectedResult(@Nonnull VfsQueryResultType itemType);
-
-    VfsQuery setSingleRepoKey(String repoKey);
-
-    VfsQuery setRepoKeys(Collection<String> repoKeys);
-
-    VfsQuery orderByAscending(@Nonnull String propertyName);
-
-    VfsQuery orderByDescending(@Nonnull String propertyName);
-
-    VfsQuery name(@Nonnull String nodeName);
-
-    VfsQuery archiveName(@Nonnull String entryName);
-
-    VfsQuery archivePath(@Nonnull String entryPath);
-
-    VfsQuery prop(@Nonnull String propertyName);
-
-    VfsQuery comp(@Nonnull VfsComparatorType comparator);
-
-    VfsQuery func(@Nonnull VfsFunctionType function);
-
-    VfsQuery val(String... values);
-
-    VfsQuery val(@Nonnull Long value);
-
-    VfsQuery val(@Nonnull Calendar value);
-
-    VfsQuery nextBool(@Nonnull VfsBoolType bool);
-
-    VfsQuery startGroup();
-
-    VfsQuery endGroup(@Nullable VfsBoolType bool);
-
-    VfsQuery endGroup();
-
-    VfsQuery addPathFilters(String... folderNames);
-
-    VfsQuery addPathFilter(String pathSearch);
-
-    @Nonnull
-    VfsQueryResult execute(int limit);
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/search/VfsQueryFieldType.java b/base/capi/src/main/java/org/artifactory/sapi/search/VfsQueryFieldType.java
deleted file mode 100644
index e474dc8..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/search/VfsQueryFieldType.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.search;
-
-/**
- * Date: 11/27/12
- * Time: 4:44 PM
- *
- * @author freds
- */
-public enum VfsQueryFieldType {
-    BASE_NODE,
-    CHECKSUM,
-    PATH,
-    ARCHIVE_PATH,
-    ARCHIVE_NAME,
-    PROPERTY,
-    STATISTIC,
-    REMOTE_STATISTIC;
-
-    public boolean isProperty() {
-        return this == PROPERTY;
-    }
-
-    public boolean isBasic() {
-        return this == BASE_NODE || this == CHECKSUM || this == PATH;
-    }
-
-    public boolean isStatistic() {
-        return this == STATISTIC;
-    }
-
-    public boolean isRemoteStatistic() {
-        return this == REMOTE_STATISTIC;
-    }
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/search/VfsQueryProperty.java b/base/capi/src/main/java/org/artifactory/sapi/search/VfsQueryProperty.java
deleted file mode 100644
index 2ce2f8a..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/search/VfsQueryProperty.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.search;
-
-/**
- * Date: 11/28/12
- * Time: 12:53 PM
- *
- * @author freds
- */
-public enum VfsQueryProperty {
-    id, type, repo, path, name, depth,
-    created, created_by, modified, modified_by, sha1, md5,
-    generic_property
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/search/VfsQueryResult.java b/base/capi/src/main/java/org/artifactory/sapi/search/VfsQueryResult.java
deleted file mode 100644
index b400980..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/search/VfsQueryResult.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.artifactory.sapi.search;
-
-/**
- * Date: 8/5/11
- * Time: 6:47 PM
- *
- * @author Fred Simon
- */
-public interface VfsQueryResult {
-    long getCount();
-
-    Iterable<VfsQueryRow> getAllRows();
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/search/VfsQueryResultType.java b/base/capi/src/main/java/org/artifactory/sapi/search/VfsQueryResultType.java
deleted file mode 100644
index fa7e09e..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/search/VfsQueryResultType.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.search;
-
-/**
- * Date: 8/4/11
- * Time: 4:49 PM
- *
- * @author Fred Simon
- */
-public enum VfsQueryResultType {
-    ANY_ITEM,
-    FOLDER,
-    FILE,
-    ARCHIVE_ENTRY
-    //BUILD,
-    //USER;
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/search/VfsQueryRow.java b/base/capi/src/main/java/org/artifactory/sapi/search/VfsQueryRow.java
deleted file mode 100644
index 0c2ac60..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/search/VfsQueryRow.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.artifactory.sapi.search;
-
-import org.artifactory.fs.ItemInfo;
-
-/**
- * Date: 8/5/11
- * Time: 10:52 PM
- *
- * @author Fred Simon
- */
-public interface VfsQueryRow {
-    ItemInfo getItem();
-
-    Iterable<ArchiveEntryRow> getArchiveEntries();
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/search/VfsQueryService.java b/base/capi/src/main/java/org/artifactory/sapi/search/VfsQueryService.java
deleted file mode 100644
index aeedc9d..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/search/VfsQueryService.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.search;
-
-/**
- * Date: 8/5/11
- * Time: 9:39 PM
- *
- * @author Fred Simon
- */
-public interface VfsQueryService {
-    VfsQuery createQuery();
-}
diff --git a/base/capi/src/main/java/org/artifactory/sapi/security/SecurityConstants.java b/base/capi/src/main/java/org/artifactory/sapi/security/SecurityConstants.java
deleted file mode 100644
index 8332ff6..0000000
--- a/base/capi/src/main/java/org/artifactory/sapi/security/SecurityConstants.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.sapi.security;
-
-/**
- * Date: 7/27/11
- * Time: 5:04 PM
- *
- * @author Fred Simon
- */
-public interface SecurityConstants {
-    String DEFAULT_REALM = "artifactory";
-}
diff --git a/base/capi/src/main/java/org/artifactory/security/AceInfo.java b/base/capi/src/main/java/org/artifactory/security/AceInfo.java
deleted file mode 100644
index 1a633c9..0000000
--- a/base/capi/src/main/java/org/artifactory/security/AceInfo.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.artifactory.security;
-
-import org.artifactory.common.Info;
-
-import java.util.Set;
-
-/**
- * Date: 8/2/11
- * Time: 10:23 AM
- *
- * @author Fred Simon
- */
-public interface AceInfo extends Info {
-    String getPrincipal();
-
-    boolean isGroup();
-
-    int getMask();
-
-    boolean canManage();
-
-    boolean canDelete();
-
-    boolean canDeploy();
-
-    boolean canAnnotate();
-
-    boolean canRead();
-
-    Set<String> getPermissionsAsString();
-}
diff --git a/base/capi/src/main/java/org/artifactory/security/AclInfo.java b/base/capi/src/main/java/org/artifactory/security/AclInfo.java
deleted file mode 100644
index 1daeb32..0000000
--- a/base/capi/src/main/java/org/artifactory/security/AclInfo.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.artifactory.security;
-
-import org.artifactory.common.Info;
-
-import java.util.Set;
-
-/**
- * Date: 8/2/11
- * Time: 10:29 AM
- *
- * @author Fred Simon
- */
-public interface AclInfo extends Info {
-    PermissionTargetInfo getPermissionTarget();
-
-    Set<AceInfo> getAces();
-
-    String getUpdatedBy();
-}
diff --git a/base/capi/src/main/java/org/artifactory/security/ArtifactoryPermission.java b/base/capi/src/main/java/org/artifactory/security/ArtifactoryPermission.java
deleted file mode 100644
index 3565743..0000000
--- a/base/capi/src/main/java/org/artifactory/security/ArtifactoryPermission.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-/**
- * @author Yoav Landman
- */
-public enum ArtifactoryPermission {
-    MANAGE(4, "m"), DELETE(3, "d"), ANNOTATE(2, "n"), DEPLOY(1, "w"), READ(0, "r");
-
-    private final int mask;
-    private final String string;
-
-    ArtifactoryPermission(int bitPos, String string) {
-        this.mask = 1 << bitPos;
-        this.string = string;
-    }
-
-    public int getMask() {
-        return mask;
-    }
-
-    public String getString() {
-        return string;
-    }
-}
diff --git a/base/capi/src/main/java/org/artifactory/security/GroupInfo.java b/base/capi/src/main/java/org/artifactory/security/GroupInfo.java
deleted file mode 100644
index 0cdc360..0000000
--- a/base/capi/src/main/java/org/artifactory/security/GroupInfo.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.artifactory.common.Info;
-
-/**
- * Date: 8/2/11
- * Time: 10:39 AM
- *
- * @author Fred Simon
- */
-public interface GroupInfo extends Info {
-    String getGroupName();
-
-    String getDescription();
-
-    boolean isNewUserDefault();
-
-    boolean isExternal();
-
-    String getRealm();
-
-    String getRealmAttributes();
-}
diff --git a/base/capi/src/main/java/org/artifactory/security/MutableAceInfo.java b/base/capi/src/main/java/org/artifactory/security/MutableAceInfo.java
deleted file mode 100644
index 125e198..0000000
--- a/base/capi/src/main/java/org/artifactory/security/MutableAceInfo.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import java.util.Set;
-
-/**
- * Date: 8/2/11
- * Time: 10:22 AM
- *
- * @author Fred Simon
- */
-public interface MutableAceInfo extends AceInfo {
-
-    void setPrincipal(String principal);
-
-    void setGroup(boolean group);
-
-    void setMask(int mask);
-
-    void setManage(boolean manage);
-
-    void setDelete(boolean delete);
-
-    void setDeploy(boolean deploy);
-
-    void setAnnotate(boolean annotate);
-
-    void setRead(boolean read);
-
-    void setPermissionsFromString(Set<String> permissionStrings);
-}
diff --git a/base/capi/src/main/java/org/artifactory/security/MutableAclInfo.java b/base/capi/src/main/java/org/artifactory/security/MutableAclInfo.java
deleted file mode 100644
index 5fe6245..0000000
--- a/base/capi/src/main/java/org/artifactory/security/MutableAclInfo.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import java.util.Set;
-
-/**
- * Date: 8/2/11
- * Time: 10:28 AM
- *
- * @author Fred Simon
- */
-public interface MutableAclInfo extends AclInfo {
-
-    void setPermissionTarget(PermissionTargetInfo permissionTarget);
-
-    Set<MutableAceInfo> getMutableAces();
-
-    void setAces(Set<AceInfo> aces);
-
-    void setUpdatedBy(String updatedBy);
-}
diff --git a/base/capi/src/main/java/org/artifactory/security/MutableGroupInfo.java b/base/capi/src/main/java/org/artifactory/security/MutableGroupInfo.java
deleted file mode 100644
index d8e6ffb..0000000
--- a/base/capi/src/main/java/org/artifactory/security/MutableGroupInfo.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-/**
- * Date: 8/2/11
- * Time: 10:38 AM
- *
- * @author Fred Simon
- */
-public interface MutableGroupInfo extends GroupInfo {
-
-    void setGroupName(String groupName);
-
-    void setDescription(String description);
-
-    void setNewUserDefault(boolean newUserDefault);
-
-    void setRealm(String realm);
-
-    void setRealmAttributes(String realmAttributes);
-}
diff --git a/base/capi/src/main/java/org/artifactory/security/MutablePermissionTargetInfo.java b/base/capi/src/main/java/org/artifactory/security/MutablePermissionTargetInfo.java
deleted file mode 100644
index 7a66a6d..0000000
--- a/base/capi/src/main/java/org/artifactory/security/MutablePermissionTargetInfo.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import java.util.List;
-
-/**
- * Date: 8/2/11
- * Time: 10:05 AM
- *
- * @author Fred Simon
- */
-public interface MutablePermissionTargetInfo extends PermissionTargetInfo {
-
-    void setName(String name);
-
-    void setRepoKeys(List<String> repoKeys);
-
-    void setIncludes(List<String> includes);
-
-    void setExcludes(List<String> excludes);
-
-    void setIncludesPattern(String includesPattern);
-
-    void setExcludesPattern(String excludesPattern);
-}
diff --git a/base/capi/src/main/java/org/artifactory/security/MutableUserInfo.java b/base/capi/src/main/java/org/artifactory/security/MutableUserInfo.java
deleted file mode 100644
index 9aecf59..0000000
--- a/base/capi/src/main/java/org/artifactory/security/MutableUserInfo.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import javax.annotation.Nullable;
-import java.util.Set;
-
-/**
- * Date: 8/2/11
- * Time: 10:49 AM
- *
- * @author Fred Simon
- */
-public interface MutableUserInfo extends UserInfo {
-    /**
-     * Users with invalid password can only authenticate externally
-     */
-    String INVALID_PASSWORD = "";
-
-    void setUsername(String username);
-
-    void setPassword(SaltedPassword password);
-
-    void setEmail(String email);
-
-    void setPrivateKey(String privateKey);
-
-    void setPublicKey(String publicKey);
-
-    void setGenPasswordKey(@Nullable String genPasswordKey);
-
-    void setAdmin(boolean admin);
-
-    void setEnabled(boolean enabled);
-
-    void setUpdatableProfile(boolean updatableProfile);
-
-    void setAccountNonExpired(boolean accountNonExpired);
-
-    void setCredentialsNonExpired(boolean credentialsNonExpired);
-
-    void setAccountNonLocked(boolean accountNonLocked);
-
-    void setTransientUser(boolean transientUser);
-
-    void setRealm(String realm);
-
-    void setCredentialsExpired(boolean credentialsNonExpired);
-
-    void addGroup(String groupName);
-
-    void addGroup(String groupName, String realm);
-
-    void removeGroup(String groupName);
-
-    void setGroups(Set<UserGroupInfo> groups);
-
-    void setUserProperties(Set<UserPropertyInfo> userProperties);
-
-    void putUserProperty(String key, String val);
-
-    void setInternalGroups(Set<String> groups);
-
-    void setLastLoginTimeMillis(long lastLoginTimeMillis);
-
-    void setLastLoginClientIp(String lastLoginClientIp);
-
-    @Deprecated
-    void setLastAccessTimeMillis(long lastAccessTimeMillis);
-    @Deprecated
-    void setLastAccessClientIp(String lastAccessClientIp);
-
-    void setBintrayAuth(String bintrayAuth);
-
-    void setLocked(boolean locked);
-}
diff --git a/base/capi/src/main/java/org/artifactory/security/PermissionTargetInfo.java b/base/capi/src/main/java/org/artifactory/security/PermissionTargetInfo.java
deleted file mode 100644
index f4ad786..0000000
--- a/base/capi/src/main/java/org/artifactory/security/PermissionTargetInfo.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.artifactory.common.Info;
-
-import java.util.List;
-
-/**
- * Date: 8/2/11
- * Time: 10:07 AM
- *
- * @author Fred Simon
- */
-public interface PermissionTargetInfo extends Info {
-    String ANY_PERMISSION_TARGET_NAME = "Anything";
-    String ANY_REMOTE_PERMISSION_TARGET_NAME = "Any Remote";
-    String ANY_PATH = "**";
-    String ANY_REPO = "ANY";
-    String ANY_LOCAL_REPO = "ANY LOCAL";
-    String ANY_REMOTE_REPO = "ANY REMOTE";
-
-    String getName();
-
-    List<String> getRepoKeys();
-
-    List<String> getIncludes();
-
-    List<String> getExcludes();
-
-    String getIncludesPattern();
-
-    String getExcludesPattern();
-}
diff --git a/base/capi/src/main/java/org/artifactory/security/SaltedPassword.java b/base/capi/src/main/java/org/artifactory/security/SaltedPassword.java
deleted file mode 100644
index 3deac58..0000000
--- a/base/capi/src/main/java/org/artifactory/security/SaltedPassword.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-/**
- * Salted password contains the password hashed with the salt and salt value.
- *
- * @author Gidi Shabat
- */
-public class SaltedPassword {
-
-    // this instance represents an invalid password state and used when a user has no internal password (e.g., ldap user)
-    public static final SaltedPassword INVALID_PASSWORD = new SaltedPassword(MutableUserInfo.INVALID_PASSWORD, "");
-
-    private final String password;
-    private final String salt;
-
-    public SaltedPassword(String password, String salt) {
-        this.password = password;
-        this.salt = salt;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public String getSalt() {
-        return salt;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        SaltedPassword saltedPassword1 = (SaltedPassword) o;
-
-        if (password != null ? !password.equals(saltedPassword1.password) : saltedPassword1.password != null) {
-            return false;
-        }
-        if (salt != null ? !salt.equals(saltedPassword1.salt) : saltedPassword1.salt != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = password != null ? password.hashCode() : 0;
-        result = 31 * result + (salt != null ? salt.hashCode() : 0);
-        return result;
-    }
-
-}
diff --git a/base/capi/src/main/java/org/artifactory/security/SecurityInfo.java b/base/capi/src/main/java/org/artifactory/security/SecurityInfo.java
deleted file mode 100644
index 8d9b7b6..0000000
--- a/base/capi/src/main/java/org/artifactory/security/SecurityInfo.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.artifactory.common.Info;
-
-import java.util.List;
-
-/**
- * Date: 8/2/11
- * Time: 7:00 PM
- *
- * @author Fred Simon
- */
-public interface SecurityInfo extends Info {
-    String getVersion();
-
-    void setVersion(String version);
-
-    List<UserInfo> getUsers();
-
-    List<GroupInfo> getGroups();
-
-    List<AclInfo> getAcls();
-}
diff --git a/base/capi/src/main/java/org/artifactory/security/UserGroupInfo.java b/base/capi/src/main/java/org/artifactory/security/UserGroupInfo.java
deleted file mode 100644
index 3982e3a..0000000
--- a/base/capi/src/main/java/org/artifactory/security/UserGroupInfo.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.artifactory.common.Info;
-
-/**
- * Date: 8/2/11
- * Time: 10:46 AM
- *
- * @author Fred Simon
- */
-public interface UserGroupInfo extends Info {
-    String getGroupName();
-
-    String getRealm();
-
-    boolean isExternal();
-}
diff --git a/base/capi/src/main/java/org/artifactory/security/UserInfo.java b/base/capi/src/main/java/org/artifactory/security/UserInfo.java
deleted file mode 100644
index 8191f12..0000000
--- a/base/capi/src/main/java/org/artifactory/security/UserInfo.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.artifactory.common.Info;
-
-import java.util.Set;
-
-/**
- * Date: 8/2/11
- * Time: 10:50 AM
- *
- * @author Fred Simon
- */
-public interface UserInfo extends Info {
-    String MISSION_CONTROLL = "Mission-Control";
-    String ANONYMOUS = "anonymous";
-
-    String getUsername();
-
-    String getPassword();
-
-    String getSalt();
-
-    String getEmail();
-
-    String getPrivateKey();
-
-    String getPublicKey();
-
-    String getGenPasswordKey();
-
-    boolean isAdmin();
-
-    boolean isEnabled();
-
-    boolean isUpdatableProfile();
-
-    boolean isAccountNonExpired();
-
-    boolean isAccountNonLocked();
-
-    boolean isTransientUser();
-
-    String getRealm();
-
-    boolean isExternal();
-
-    /**
-     * Indicates whether the user's credentials (password) has expired. Expired credentials prevent
-     * authentication.
-     *
-     * @return <code>false</code> if the user's credentials are valid (ie non-expired), <code>true</code> if no longer
-     *         valid (ie expired)
-     */
-    boolean isCredentialsExpired();
-
-    boolean isCredentialsNonExpired();
-
-    boolean isAnonymous();
-
-    boolean isInGroup(String groupName);
-
-    Set<UserGroupInfo> getGroups();
-
-    Set<UserPropertyInfo> getUserProperties();
-
-    long getLastLoginTimeMillis();
-
-    String getLastLoginClientIp();
-    @Deprecated
-    long getLastAccessTimeMillis();
-    @Deprecated
-    String getLastAccessClientIp();
-
-    boolean hasSameAuthorizationContext(UserInfo o);
-
-    boolean hasInvalidPassword();
-
-    String getBintrayAuth();
-
-    boolean isLocked();
-}
diff --git a/base/capi/src/main/java/org/artifactory/security/UserPropertyInfo.java b/base/capi/src/main/java/org/artifactory/security/UserPropertyInfo.java
deleted file mode 100644
index 3aff193..0000000
--- a/base/capi/src/main/java/org/artifactory/security/UserPropertyInfo.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.artifactory.security;
-
-import org.artifactory.common.Info;
-
-
-/**
- * @author Chen Keinan
- */
-public interface UserPropertyInfo extends Info {
-
-    String getPropKey();
-
-    String getPropValue();
-}
diff --git a/base/capi/src/main/java/org/artifactory/util/Pair.java b/base/capi/src/main/java/org/artifactory/util/Pair.java
deleted file mode 100644
index 6a5b627..0000000
--- a/base/capi/src/main/java/org/artifactory/util/Pair.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-/**
- * A pair class, holds two objects.
- *
- * @author Noam Tenne
- * @author Yossi Shaul
- */
-public class Pair<X, Y> {
-
-    private X first;
-    private Y second;
-
-    public Pair() {
-        // empty constructor required for inherit class serialization
-    }
-
-    public Pair(X first, Y second) {
-        this.first = first;
-        this.second = second;
-    }
-
-    public X getFirst() {
-        return first;
-    }
-
-    public Y getSecond() {
-        return second;
-    }
-
-    public void setFirst(X first) {
-        this.first = first;
-    }
-
-    public void setSecond(Y second) {
-        this.second = second;
-    }
-
-    public boolean isNotNull() {
-        return first != null && second != null;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        Pair pair = (Pair) o;
-        return !(first != null ? !first.equals(pair.first) : pair.first != null) &&
-                !(second != null ? !second.equals(pair.second) : pair.second != null);
-    }
-
-    @Override
-    public int hashCode() {
-        int result = first != null ? first.hashCode() : 0;
-        result = 31 * result + (second != null ? second.hashCode() : 0);
-        return result;
-    }
-
-    @Override
-    public String toString() {
-        return first + ":" + second;
-    }
-}
diff --git a/base/capi/src/main/java/org/artifactory/util/SerializablePair.java b/base/capi/src/main/java/org/artifactory/util/SerializablePair.java
deleted file mode 100644
index 91be4bc..0000000
--- a/base/capi/src/main/java/org/artifactory/util/SerializablePair.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import java.io.Serializable;
-
-/**
- * Serializable pair class, holds serializable pair.
- *
- * @author Noam Tenne
- */
-public class SerializablePair<X extends Serializable, Y extends Serializable>
-        extends Pair<X, Y> implements Serializable {
-
-    public SerializablePair(X first, Y second) {
-        super(first, second);
-    }
-
-}
diff --git a/base/capi/src/main/java/org/artifactory/util/Tree.java b/base/capi/src/main/java/org/artifactory/util/Tree.java
deleted file mode 100644
index 1c5012a..0000000
--- a/base/capi/src/main/java/org/artifactory/util/Tree.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-/**
- * @author Yossi Shaul
- */
-public interface Tree<T> {
-
-    TreeNode<T> insert(T data);
-
-    TreeNode<T> getRoot();
-
-}
diff --git a/base/capi/src/main/java/org/artifactory/util/TreeNode.java b/base/capi/src/main/java/org/artifactory/util/TreeNode.java
deleted file mode 100644
index 92130b0..0000000
--- a/base/capi/src/main/java/org/artifactory/util/TreeNode.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import java.util.Collection;
-
-/**
- * @author Yossi Shaul
- */
-public interface TreeNode<T> {
-
-    public T getData();
-
-    public Collection<? extends TreeNode<T>> getChildren();
-
-    public boolean hasChildren();
-
-    public boolean isLeaf();
-
-    public TreeNode<T> getChild(T data);
-}
diff --git a/base/common/pom.xml b/base/common/pom.xml
deleted file mode 100644
index 231b92b..0000000
--- a/base/common/pom.xml
+++ /dev/null
@@ -1,151 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0          http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>artifactory-common</artifactId>
-    <packaging>jar</packaging>
-    <name>Artifactory Common</name>
-
-    <parent>
-        <artifactId>artifactory-base-parent</artifactId>
-        <groupId>org.artifactory</groupId>
-        <version>4.8.0</version>
-    </parent>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-log</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.jfrog.storage</groupId>
-            <artifactId>binary-store-api</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-api</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-config</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-config</artifactId>
-            <type>test-jar</type>
-        </dependency>
-
-        <dependency>
-            <groupId>org.jfrog.buildinfo</groupId>
-            <artifactId>build-info-api</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.sshd</groupId>
-            <artifactId>sshd-core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.security</groupId>
-            <artifactId>spring-security-core</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.security</groupId>
-            <artifactId>spring-security-config</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.security</groupId>
-            <artifactId>spring-security-web</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-codec</groupId>
-            <artifactId>commons-codec</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.maven</groupId>
-            <artifactId>maven-artifact</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.maven</groupId>
-            <artifactId>maven-settings</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.maven</groupId>
-            <artifactId>maven-repository-metadata</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.maven</groupId>
-            <artifactId>maven-project</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.codehaus.jackson</groupId>
-            <artifactId>jackson-jaxrs</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.codehaus.jackson</groupId>
-            <artifactId>jackson-xc</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>joda-time</groupId>
-            <artifactId>joda-time</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-compress</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-test</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.easymock</groupId>
-            <artifactId>easymock</artifactId>
-        </dependency>
-
-        <!-- for cron expressions validation -->
-        <dependency>
-            <groupId>org.quartz-scheduler</groupId>
-            <artifactId>quartz</artifactId>
-        </dependency>
-    </dependencies>
-</project>
diff --git a/base/common/src/main/java/org/artifactory/UiAuthenticationDetails.java b/base/common/src/main/java/org/artifactory/UiAuthenticationDetails.java
deleted file mode 100644
index b5d8964..0000000
--- a/base/common/src/main/java/org/artifactory/UiAuthenticationDetails.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory;
-
-import org.artifactory.security.HttpAuthenticationDetails;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * @author Noam Y. Tenne
- */
-public class UiAuthenticationDetails extends HttpAuthenticationDetails {
-
-    private HttpServletRequest request;
-    private HttpServletResponse response;
-
-    public UiAuthenticationDetails(HttpServletRequest request, HttpServletResponse response) {
-        super(request);
-        this.request = request;
-        this.response = response;
-    }
-
-    public HttpServletRequest getRequest() {
-        return request;
-    }
-
-    public HttpServletResponse getResponse() {
-        return response;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/Addon.java b/base/common/src/main/java/org/artifactory/addon/Addon.java
deleted file mode 100644
index 6375552..0000000
--- a/base/common/src/main/java/org/artifactory/addon/Addon.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon;
-
-import java.io.Serializable;
-
-/**
- * Base interface for all addons interfaces.
- *
- * @author Yossi Shaul
- */
-public interface Addon extends Serializable {
-    /**
-     * @return True if this addon factory is the default implementation. Usually the addon factory of the addon should
-     *         return false.
-     */
-    boolean isDefault();
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/AddonType.java b/base/common/src/main/java/org/artifactory/addon/AddonType.java
deleted file mode 100644
index 7954cef..0000000
--- a/base/common/src/main/java/org/artifactory/addon/AddonType.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon;
-
-/**
- * @author Yoav Aharoni
- */
-public enum AddonType {
-    //
-    //PLEASE MAKE SURE THESE DETAILS ARE CONSISTENT WITH THE ONES IN THE PROPERTY FILES
-    //
-    AOL("aol", "Artifactory Online", -1, new String[]{"all"}, "pro", "aol"),
-    BUILD("build", "Build Integration", 100, new String[]{"all", "features"}, "pro", "Build+Integration"),
-    MULTIPUSH("multipush", "Multipush Replication", 100, new String[]{"all", "enterprise"}, "ent", "Repository+Replication#RepositoryReplication-Multi-pushReplication"),
-    LICENSES("license", "License Control", 200, new String[]{"all", "features"}, "pro", "License+Control"),
-    REST("rest", "Advanced REST", 300, new String[]{"all", "features"}, "pro", "Artifactory+REST+API"),
-    LDAP("ldap", "LDAP Groups", 400, new String[]{"all", "features"}, "pro", "Ldap+Groups"),
-    REPLICATION("replication", "Repository Replication", 500, new String[]{"all", "features"}, "pro", "Repository+Replication"),
-    PROPERTIES("properties", "Properties", 600, new String[]{"all", "features"}, "pro", "Properties"),
-    SEARCH("search", "Smart Searches", 700, new String[]{"all", "features"}, "pro", "Smart+Searches"),
-    PLUGINS("plugins", "User Plugins", 800, new String[]{"all", "features"}, "pro", "User+Plugins"),
-    YUM("yum", "YUM", 900, new String[]{"all", "packageManagement"}, "pro", "YUM+Repositories"),
-    P2("p2", "P2", 1000, new String[]{"all", "packageManagement"}, "pro", "P2+Repositories"),
-    NUGET("nuget", "NuGet", 1100, new String[]{"all", "packageManagement"}, "pro", "Nuget+Repositories"),
-    LAYOUTS("layouts", "Repository Layouts", 1200, new String[]{"all", "features"}, "pro", "Repository+Layouts"),
-    FILTERED_RESOURCES("filtered-resources", "Filtered Resources", 1300, new String[]{"all", "features"}, "pro", "Filtered+Resources"),
-    SSO("sso", "Crowd & SSO", 1400, new String[]{"all"}, "pro", "Atlassian+Crowd+Integration"),
-    SSH("ssh", "SSH", 500, new String[]{"all", "features"}, "oss", "SSH+Integration"),
-    WATCH("watch", "Watches", 1500, new String[]{"all", "features"}, "pro", "Watches"),
-    WEBSTART("webstart", "Jar Signing", 1600, new String[]{"all", "features"}, "pro","WebStart+and+Jar+Signing"),
-    BLACKDUCK("blackduck", "Black Duck Integration", 250, new String[]{"all"}, "pro", "Black+Duck+Code+Center+Integration"),
-    GEMS("gems", "RubyGems", 1100, new String[]{"all", "packageManagement"}, "pro", "RubyGems+Repositories") ,
-    NPM("npm", "npm", 860, new String[]{"all", "packageManagement"}, "pro", "NPM+Repositories"),
-    BOWER("bower", "Bower", 870, new String[]{"all", "packageManagement"}, "pro", "Bower+Repositories"),
-    COCOAPODS("cocoapods", "CocoaPods", 880, new String[]{"all", "packageManagement"}, "pro", "CocoaPods+Repositories"),
-    DEBIAN("debian", "Debian", 900, new String[]{"all", "packageManagement"}, "pro", "Debian+Repositories"),
-    DISTRIBUTION("distribution", "Bintray Distribution", 930, new String[]{"all", "ecosystem"}, "oss","Distribution+Repository"),
-    OPKG("opkg", "Opkg", 700, new String[]{"all", "packageManagement"}, "pro", "Opkg+Repositories"),
-    PYPI("pypi", "PyPI", 970, new String[]{"all", "packageManagement"}, "pro", "PyPI+Repositories"),
-    DOCKER("docker", "Docker", 910, new String[]{"all", "packageManagement"}, "pro", "Docker+Repositories"),
-    VAGRANT("vagrant", "Vagrant", 915, new String[]{"all", "packageManagement"}, "pro", "Vagrant+Repositories"),
-    VCS("vcs", "VCS", 920, new String[]{"all", "packageManagement"}, "pro", "VCS+Repositories"),
-    GITLFS("git-lfs", "Git LFS", 930, new String[]{"all", "packageManagement"}, "pro", "Git+LFS+Repositories"),
-    HA("ha", "High Availability", 2000, new String[]{"all", "enterprise"}, "ent", "Artifactory+High+Availability"),
-    S3("s3fileStore", "S3 Object Store", 2000, new String[]{"all", "enterprise"}, "ent", "S3+Object+Storage"),
-    GCS("gcs", "Google Cloud Storage", 2000, new String[]{"all", "enterprise"}, "ent", "Google+Cloud+Storage"),
-    HDFS("hdfsFileStore", "HDFS", 2020, new String[]{"all", "enterprise"}, "ent", "HDFS+Storage" ),
-    SHARDING("sharding", "Sharding", 2020, new String[]{"all", "enterprise"}, "ent", "Binary+Store+Sharding" ),
-    AQL("aql", "AQL", 2000, new String[]{"all", "features"}, "oss", "Artifactory+Query+Language"),
-    MAVEN_PLUGIN("maven", "Maven Plugin", 2000, new String[]{"all", "ecosystem"}, "oss", "Maven+Artifactory+Plugin"),
-    GRADLE_PLUGIN("gradle", "Gradle Plugin", 2000, new String[]{"all", "ecosystem"}, "oss", "Gradle+Artifactory+Plugin"),
-    JENKINS_PLUGIN("jenkins", "Jenkins Plugin", 2000, new String[]{"all", "ecosystem"}, "oss", "Jenkins+(Hudson)+Artifactory+Plug-in"),
-    BAMBOO_PLUGIN("bamboo", "Bamboo Plugin", 2000, new String[]{"all", "ecosystem"}, "oss", "Bamboo+Artifactory+Plug-in"),
-    TC_PLUGIN("teamcity", "TeamCity Plugin", 2000, new String[]{"all", "ecosystem"}, "oss", "TeamCity+Artifactory+Plug-in"),
-    MSBUILD_PLUGIN("msbuild", "MSBuild/TFS Plugin", 2000, new String[]{"all", "ecosystem"}, "oss", "MSBuild+Artifactory+Plugin"),
-    BINTRAY_INTEGRATION("bintray-integration", "Bintray Integration", 2000, new String[]{"all", "ecosystem"}, "oss", "Bintray+Integration"),
-    SMART_REPO("smart-repo", "Smart Remote Repo", 2000, new String[]{"all", "features"}, "pro", "Smart+Remote+Repositories"),
-    OAUTH("oauth", "OAuth", 2000, new String[]{"all", "features"}, "pro", "OAuth+Integration"),
-    SBT("sbt", "SBT", 2000, new String[]{"all", "packageManagement"}, "oss", "SBT+Repositories"),
-    IVY("ivy", "Ivy Plugin", 2000, new String[]{"all", "ecosystem"}, "oss", "Working+with+Ivy");
-
-
-    private String addonName;
-    private String addonDisplayName;
-    private int displayOrdinal;
-    private String[] categories;
-    private String type;
-    private String configureUrlSuffix;
-
-    AddonType(String addonName, String addonDisplayName, int displayOrdinal, String[] categories, String type, String configureUrlSuffix) {
-        this.addonName = addonName;
-        this.addonDisplayName = addonDisplayName;
-        this.displayOrdinal = displayOrdinal;
-        this.categories = categories;
-        this.type = type;
-        this.configureUrlSuffix = configureUrlSuffix;
-    }
-
-    public String getAddonDisplayName() {
-        return addonDisplayName;
-    }
-
-    public String getAddonName() {
-        return addonName;
-    }
-
-    public int getDisplayOrdinal() {
-        return displayOrdinal;
-    }
-
-    public String[] getCategories() {
-        return categories;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public String getConfigureUrlSuffix() {
-        return configureUrlSuffix;
-    }
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/addon/AddonsManager.java b/base/common/src/main/java/org/artifactory/addon/AddonsManager.java
deleted file mode 100644
index b4423f0..0000000
--- a/base/common/src/main/java/org/artifactory/addon/AddonsManager.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon;
-
-import org.artifactory.addon.license.VerificationResult;
-import org.artifactory.api.request.ArtifactoryResponse;
-
-import javax.annotation.Nullable;
-import java.io.IOException;
-import java.util.Date;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Provides addon factory by type.
- *
- * @author Yossi Shaul
- */
-public interface AddonsManager {
-
-    <T extends Addon> T addonByType(Class<T> type);
-
-    List<AddonInfo> getInstalledAddons(@Nullable Set<String> excludedAddonKeys);
-
-    List<String> getEnabledAddonNames();
-
-    boolean isLicenseInstalled();
-
-    /**
-     * check if addon is supported
-     * @param addonType - add on type to check
-     * @return if true - addon is supported
-     */
-    boolean isAddonSupported(AddonType addonType);
-
-    /**
-     * Indicates whether there's a valid HA or Trial license installed.
-     *
-     * @return True if the license is either HA or Trial.
-     */
-    boolean isHaLicensed();
-
-    VerificationResult isLicenseKeyValid(String licenseKey);
-
-    /**
-     * Returns the request property of the given addon name
-     *
-     * @param addonName Name of addon to query
-     * @param addonKey  Key of requested property
-     * @return Property value if addon name and property key were found. Null if not
-     */
-    String getAddonProperty(String addonName, String addonKey);
-
-    /**
-     * Installs a new Artifactory license key
-     *
-     * @param licenseKey The license key
-     * @throws IOException If the license is invalid or failed to save the license file
-     */
-    VerificationResult installLicense(String licenseKey);
-
-    /**
-     * @return The currently installed license key.
-     */
-    String getLicenseKey();
-
-    Date getLicenseValidUntil();
-
-    /**
-     * Returns the hash of the license key (if installed) with an added char for indication of type
-     * (<b>t</b>rial \ <b>c</b>ommercial).<br/>
-     * <b>NOTE:</b> The returned hash will not be a valid one (inclusion of indication char).
-     *
-     * @return license hash + type indication
-     */
-    String getLicenseKeyHash();
-
-    boolean isProLicensed(String licenseKeyHash);
-
-    /**
-     * check if license key hash is HA based on last Digit
-     * @param licenseKeyHash - license key hash
-     * @return if true key hash is HA license
-     */
-    boolean isLicenseKeyHashHAType(String licenseKeyHash);
-
-    boolean lockdown();
-
-    /**
-     * Sends a "forbidden" response to the request if no valid license is installed
-     *
-     * @param response Response to intercept
-     */
-    void interceptResponse(ArtifactoryResponse response) throws IOException;
-
-    /**
-     * Sends a "forbidden" response to the rest request if no valid license is installed
-     *
-     * @param response Response to intercept
-     * @param path
-     */
-    void interceptRestResponse(ArtifactoryResponse response, String path) throws IOException;
-
-    String[] getLicenseDetails();
-
-    String getProductName();
-
-    /**
-     * Verify current member is HA, all other members are HA and no duplicate licenses exist
-     */
-    VerificationResult verifyAllArtifactoryServers();
-
-    ArtifactoryRunningMode getArtifactoryRunningMode();
-
-    boolean isPartnerLicense();
-
-    FooterMessage getLicenseFooterMessage();
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/AddonsWebManager.java b/base/common/src/main/java/org/artifactory/addon/AddonsWebManager.java
deleted file mode 100644
index fca7c70..0000000
--- a/base/common/src/main/java/org/artifactory/addon/AddonsWebManager.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon;
-
-/**
- * An interface that holds all the web related operations that are available only as part of Artifactory's Add-ons.
- *
- * @author Shay Yaakov
- */
-public interface AddonsWebManager {
-
-    String getFooterMessage(boolean admin);
-
-    FooterMessage getLicenseFooterMessage();
-
-    String getLicenseRequiredMessage(String licensePageUrl);
-
-    void onNoInstalledLicense(boolean userVisitedLicensePage, NoInstalledLicenseAction action);
-
-    boolean isAdminPageAccessible();
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/ArtifactoryRunningMode.java b/base/common/src/main/java/org/artifactory/addon/ArtifactoryRunningMode.java
deleted file mode 100644
index 12d0617..0000000
--- a/base/common/src/main/java/org/artifactory/addon/ArtifactoryRunningMode.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.artifactory.addon;
-
-/**
- * author: gidis
- * Represent the actualArtifactory mode which can be one of the following OSS,PRO,HA,AOL
- */
-public enum ArtifactoryRunningMode {
-    OSS, PRO, HA;
-
-    public static ArtifactoryRunningMode fromString(String val) {
-        // Artifactory always have its running mode so throw exception if fail to find proper enum.
-        return valueOf(val.toUpperCase());
-    }
-
-    public boolean isHa() {
-        return HA == this;
-    }
-
-    public static boolean sameMode(ArtifactoryRunningMode... runningModes) {
-        ArtifactoryRunningMode last = runningModes[0];
-        for (ArtifactoryRunningMode runningMode : runningModes) {
-            if (runningMode != last) {
-                return false;
-            }
-        }
-        return true;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/CoreAddons.java b/base/common/src/main/java/org/artifactory/addon/CoreAddons.java
deleted file mode 100644
index 2f5c3e4..0000000
--- a/base/common/src/main/java/org/artifactory/addon/CoreAddons.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon;
-
-import org.artifactory.api.repo.DockerRepositoryAction;
-import org.artifactory.security.UserInfo;
-
-import javax.annotation.Nonnull;
-import java.util.List;
-
-/**
- * Core services addons interface.
- *
- * @author Yossi Shaul
- */
-public interface CoreAddons extends Addon {
-    String SUPER_USER_NAME = "super";
-
-    /**
-     * @return True if creation of new admin accounts is allowed.
-     */
-    boolean isCreateDefaultAdminAccountAllowed();
-
-    /**
-     * Check if the current logged in user is the AOL administrator.
-     *
-     * @return True if the user is a pure Artifactory user, that is NOT allowed access to the AOL dashboard
-     */
-    boolean isAolAdmin();
-
-    /**
-     * Check if a certain user is the AOL administrator, by checking that via the AOL dashboard.
-     *
-     * @param userInfo The user to check if its deletion is allowed.
-     * @return True if the user is the AOL admin user
-     */
-    boolean isAolAdmin(UserInfo userInfo);
-
-    /**
-     * @return True if the AOL addon is activated
-     */
-    boolean isAol();
-
-    /**
-     * @return Returns email addresses of Artifactory administrators to send error notification to.
-     */
-    @Nonnull
-    List<String> getUsersForBackupNotifications();
-
-    void validateTargetHasDifferentLicenseKeyHash(String targetLicenseHash, List<String> addons);
-
-    /**
-     * Validates that given licenseHash is different from license installed on this instance,
-     * unless artifactoryId and current instance artifactoryId are equal (e.g same Artifactory)
-     *
-     * @param licenseHash license to check
-     * @param artifactoryId artifactory id of the checked license
-     */
-    boolean validateTargetHasDifferentLicense(String licenseHash, String artifactoryId);
-
-    void validateMultiPushReplicationSupportedForTargetLicense(String targetLicenseKey,
-            boolean isMultiPushConfigureForThisRepo, String targetUrl);
-
-    String getBuildNum();
-
-    /**
-     * @return Artifactory version string for list browsing
-     */
-    String getListBrowsingVersion();
-
-    String getArtifactoryServerName();
-
-    String getArtifactoryUrl();
-
-    void sendDockerRepoEvent(String repoName, String dockerApiVersion, DockerRepositoryAction action);
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/addon/FooterMessage.java b/base/common/src/main/java/org/artifactory/addon/FooterMessage.java
deleted file mode 100644
index 6eb1624..0000000
--- a/base/common/src/main/java/org/artifactory/addon/FooterMessage.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package org.artifactory.addon;
-
-/**
- * @author Gidi Shabat
- */
-public class FooterMessage {
-    private String message;
-    private String type;
-    private String visibility;
-
-    public FooterMessage(String message, FooterMessageType type,FooterMessageVisibility visibility) {
-        this.message = message;
-        this.type = type.name();
-        this.visibility=visibility.name();
-    }
-
-    public String getMessage() {
-        return message;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public String getVisibility() {
-        return visibility;
-    }
-
-    public static FooterMessage createWarning(String message,FooterMessageVisibility visibility) {
-        return new FooterMessage(message,FooterMessageType.warning,visibility);
-    }
-
-    public static FooterMessage createinfo(String message,FooterMessageVisibility visibility) {
-        return new FooterMessage(message,FooterMessageType.info,visibility);
-    }
-
-    public static FooterMessage createError(String message,FooterMessageVisibility visibility) {
-        return new FooterMessage(message,FooterMessageType.error,visibility);
-    }
-
-    static enum FooterMessageType{
-        info,warning,error
-    }
-
-    public static enum FooterMessageVisibility{
-        admin,user,all;
-        public boolean isVisible(boolean adminPermission, boolean userPermission){
-            if(adminPermission){
-                return true;
-            }else if(userPermission){
-                return this== user ||this== all;
-            }else{
-                return this==all;
-            }
-        }
-
-        public static boolean isVisible(String visibilityName, boolean admin, boolean notAnonymous) {
-            try {
-                FooterMessageVisibility visibility = FooterMessageVisibility.valueOf(visibilityName);
-                return visibility.isVisible(admin,notAnonymous);
-            }catch (Exception e){
-                return false;
-            }
-        }
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/NoInstalledLicenseAction.java b/base/common/src/main/java/org/artifactory/addon/NoInstalledLicenseAction.java
deleted file mode 100644
index 2ab124b..0000000
--- a/base/common/src/main/java/org/artifactory/addon/NoInstalledLicenseAction.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon;
-
-import java.io.Serializable;
-
-/**
- * An action which is performed in case no Artifactory Pro license is installed
- * and the user has not visited the license page
- *
- * @author Shay Yaakov
- */
-public interface NoInstalledLicenseAction extends Serializable {
-
-    void act();
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/OssAddonsManager.java b/base/common/src/main/java/org/artifactory/addon/OssAddonsManager.java
deleted file mode 100644
index 78da2b4..0000000
--- a/base/common/src/main/java/org/artifactory/addon/OssAddonsManager.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon;
-
-import com.google.common.collect.Lists;
-import org.artifactory.addon.license.VerificationResult;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.security.ArtifactoryPermission;
-import org.artifactory.storage.db.servers.model.ArtifactoryServer;
-import org.artifactory.storage.db.servers.service.ArtifactoryServersCommonService;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationContext;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Set;
-
-import static org.artifactory.addon.license.VerificationResult.error;
-import static org.artifactory.addon.license.VerificationResult.valid;
-
-/**
- * @author Yossi Shaul
- */
- at Component
-public class OssAddonsManager implements AddonsManager, AddonsWebManager {
-
-    public static final String OSS_LICENSE_KEY_HASH = "Artifactory OSS";
-    protected ArtifactoryContext context;
-    @Autowired
-    private ArtifactoryServersCommonService serversService;
-
-    @Autowired
-    private void setApplicationContext(ApplicationContext context) throws BeansException {
-        this.context = (ArtifactoryContext) context;
-    }
-
-    @Override
-    public <T extends Addon> T addonByType(Class<T> type) {
-        return context.beanForType(type);
-    }
-
-    @Override
-    public String getProductName() {
-        return "Artifactory";
-    }
-
-    @Override
-    public String getLicenseRequiredMessage(String licensePageUrl) {
-        return "Add-ons are currently disabled.";
-    }
-
-    @Override
-    public void onNoInstalledLicense(boolean userVisitedLicensePage, NoInstalledLicenseAction action) {
-    }
-
-    @Override
-    public boolean isAdminPageAccessible() {
-        AuthorizationService authService = context.beanForType(AuthorizationService.class);
-        return authService.isAdmin() || authService.hasPermission(ArtifactoryPermission.MANAGE);
-    }
-
-    @Override
-    public List<AddonInfo> getInstalledAddons(Set<String> excludedAddonKeys) {
-        List<AddonInfo> addonInfos = Lists.newArrayList();
-        for (AddonType addonType : AddonType.values()) {
-            if (AddonType.AOL.equals(addonType)) {
-                continue;
-            }
-            addonInfos.add(new AddonInfo(addonType.getAddonName(), addonType.getAddonDisplayName(), null,
-                    AddonState.INACTIVATED, null, addonType.getDisplayOrdinal()));
-        }
-
-        Collections.sort(addonInfos);
-        return addonInfos;
-    }
-
-    @Override
-    public List<String> getEnabledAddonNames() {
-        return Collections.emptyList();
-    }
-
-    @Override
-    public boolean isLicenseInstalled() {
-        return false;
-    }
-
-    @Override
-    public boolean isAddonSupported(AddonType addonType) {
-        return false;
-    }
-
-    @Override
-    public boolean isHaLicensed() {
-        return false;
-    }
-
-    @Override
-    public VerificationResult isLicenseKeyValid(String licenseKey) {
-        return error;
-    }
-
-    @Override
-    public String getAddonProperty(String addonName, String addonKey) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public VerificationResult installLicense(String licenseKey) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public String getLicenseKey() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public Date getLicenseValidUntil() {
-        return null;
-    }
-
-    @Override
-    public String getLicenseKeyHash() {
-        return OSS_LICENSE_KEY_HASH;
-    }
-
-    @Override
-    public boolean isProLicensed(String licenseKeyHash) {
-        return false;
-    }
-
-    @Override
-    public boolean isLicenseKeyHashHAType(String licenseKeyHash) {
-        return false;
-    }
-
-    @Override
-    public boolean lockdown() {
-        return false;
-    }
-
-    @Override
-    public String[] getLicenseDetails() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public String getFooterMessage(boolean admin) {
-        return null;
-    }
-
-    @Override
-    public FooterMessage getLicenseFooterMessage() {
-        return null;
-    }
-
-    @Override
-    public VerificationResult verifyAllArtifactoryServers() {
-        List<ArtifactoryServer> otherMembers = serversService.getOtherActiveMembers();
-        if (!otherMembers.isEmpty()) {
-            context.setOffline(); //leave it here
-            throw new RuntimeException("Found active HA servers in DB, OSS is not supported in by active HA " +
-                    "environment. Shutting down Artifactory.");
-        }
-        return valid;
-    }
-
-    @Override
-    public ArtifactoryRunningMode getArtifactoryRunningMode() {
-        return ArtifactoryRunningMode.OSS;
-    }
-
-    @Override
-    public boolean isPartnerLicense() {
-        return false;
-    }
-
-    @Override
-    public void interceptResponse(ArtifactoryResponse response) {
-    }
-
-    @Override
-    public void interceptRestResponse(ArtifactoryResponse response, String path) throws IOException {
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/blackduck/BlackDuckAddon.java b/base/common/src/main/java/org/artifactory/addon/blackduck/BlackDuckAddon.java
deleted file mode 100644
index 7a77075..0000000
--- a/base/common/src/main/java/org/artifactory/addon/blackduck/BlackDuckAddon.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.blackduck;
-
-import org.artifactory.addon.Addon;
-import org.artifactory.api.governance.BlackDuckApplicationInfo;
-import org.artifactory.api.governance.GovernanceRequestInfo;
-import org.artifactory.api.repo.Async;
-import org.artifactory.api.rest.compliance.FileComplianceInfo;
-import org.artifactory.descriptor.external.BlackDuckSettingsDescriptor;
-import org.artifactory.repo.RepoPath;
-import org.jfrog.build.api.Build;
-
-import java.util.Collection;
-import java.util.Set;
-
-/**
- * @author mamo
- */
-public interface BlackDuckAddon extends Addon {
-
-    String UNDEFINED_LICENSE = "undefined";
-
-    /**
-     * returns external component info as found in the metadata
-     */
-    FileComplianceInfo getExternalInfoFromMetadata(RepoPath repoPath);
-
-    /**
-     * Perform Black Duck application validation on given {@code build}
-     *
-     * @param build The build to perform the license calculation on.
-     */
-    @Async(delayUntilAfterCommit = true)
-    void performBlackDuckOnBuildArtifacts(Build build);
-
-    void testConnection(BlackDuckSettingsDescriptor blackDuckSettingsDescriptor) throws Exception;
-
-    ExternalComponentInfo getBlackduckInfo(RepoPath repoPath);
-
-    /**
-     * Used by the UI to trigger Black Duck calculation on a single path
-     */
-    boolean queryCodeCenterForPath(RepoPath path);
-
-    String getComponentExternalIdFromProperty(RepoPath repoPath);
-
-    String getComponentIdFromProperty(RepoPath repoPath);
-
-    void clearComponentIdProperty(RepoPath repoPath);
-
-    void setComponentExternalIdProperty(RepoPath repoPath, String updatedComponentId);
-
-    boolean isEnableIntegration();
-
-    Collection<GovernanceRequestInfo> getGovernanceRequestInfos(Build build, String appName, String appVersion,
-                                                                Set<String> scopes);
-
-    BlackDuckApplicationInfo blackDuckApplicationInfo(String appInfo, String versionInfo);
-
-    String updateRequest(Build build, GovernanceRequestInfo requestInfo);
-
-    boolean isSupportedPackageType(RepoPath path);
-
-    Set<String> getPathLicensesFromProperties(RepoPath path);
-
-    String getLicenseUrl(String license);
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/blackduck/BlackDuckVulnerabilities.java b/base/common/src/main/java/org/artifactory/addon/blackduck/BlackDuckVulnerabilities.java
deleted file mode 100644
index f924166..0000000
--- a/base/common/src/main/java/org/artifactory/addon/blackduck/BlackDuckVulnerabilities.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.addon.blackduck;
-
-/**
- * @author chen Keinan
- */
-public class BlackDuckVulnerabilities {
-
-    private String artifactID;
-    private String name;
-    private String severity;
-    private String description;
-
-    public BlackDuckVulnerabilities(String artifactID, String name, String severity, String description) {
-        this.artifactID = artifactID;
-        this.name = name;
-        this.severity = severity;
-        this.description = description;
-    }
-
-    public String getArtifactID() {
-        return artifactID;
-    }
-
-    public void setArtifactID(String artifactID) {
-        this.artifactID = artifactID;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getSeverity() {
-        return severity;
-    }
-
-    public void setSeverity(String severity) {
-        this.severity = severity;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/blackduck/BlackduckInfo.java b/base/common/src/main/java/org/artifactory/addon/blackduck/BlackduckInfo.java
deleted file mode 100644
index d1eed43..0000000
--- a/base/common/src/main/java/org/artifactory/addon/blackduck/BlackduckInfo.java
+++ /dev/null
@@ -1,122 +0,0 @@
-package org.artifactory.addon.blackduck;
-
-/**
- * @author Chen Keinan
- */
-public class BlackduckInfo {
-
-    private String name;
-    private String version;
-    private String componentId;
-    private String extComponentId;
-    private String kbComponentId;
-    private String kbReleaseId;
-    private String homepage;
-    private String description;
-    private boolean isCatalogComponent;
-    private String componentLink;
-    private String licenseLink;
-
-    public BlackduckInfo(String name, String version, String componentId, String kbComponentId,
-            String kbReleaseId, String homepage, String description, boolean component) {
-        this.name = name;
-        this.version = version;
-        this.componentId = componentId;
-        this.kbComponentId = kbComponentId;
-        this.kbReleaseId = kbReleaseId;
-        this.homepage = homepage;
-        this.description = description;
-        this.isCatalogComponent = component;
-    }
-
-    public BlackduckInfo() {
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public String getComponentId() {
-        return componentId;
-    }
-
-    public void setComponentId(String componentId) {
-        this.componentId = componentId;
-    }
-
-    public String getKbComponentId() {
-        return kbComponentId;
-    }
-
-    public void setKbComponentId(String kbComponentId) {
-        this.kbComponentId = kbComponentId;
-    }
-
-    public String getKbReleaseId() {
-        return kbReleaseId;
-    }
-
-    public void setKbReleaseId(String kbReleaseId) {
-        this.kbReleaseId = kbReleaseId;
-    }
-
-    public String getHomepage() {
-        return homepage;
-    }
-
-    public void setHomepage(String homepage) {
-        this.homepage = homepage;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public boolean isCatalogComponent() {
-        return isCatalogComponent;
-    }
-
-    public void setIsCatalogComponent(boolean isCatalogComponent) {
-        this.isCatalogComponent = isCatalogComponent;
-    }
-
-    public String getComponentLink() {
-        return componentLink;
-    }
-
-    public void setComponentLink(String compponentLink) {
-        this.componentLink = compponentLink;
-    }
-
-    public String getLicenseLink() {
-        return licenseLink;
-    }
-
-    public void setLicenseLink(String licenseLink) {
-        this.licenseLink = licenseLink;
-    }
-
-    public String getExtComponentId() {
-        return extComponentId;
-    }
-
-    public void setExtComponentId(String extComponentId) {
-        this.extComponentId = extComponentId;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/blackduck/ExternalComponentInfo.java b/base/common/src/main/java/org/artifactory/addon/blackduck/ExternalComponentInfo.java
deleted file mode 100644
index 7c2f634..0000000
--- a/base/common/src/main/java/org/artifactory/addon/blackduck/ExternalComponentInfo.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.artifactory.addon.blackduck;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class ExternalComponentInfo {
-
-    private BlackduckInfo info;
-    private List<LicensePair> license;
-    private List<BlackDuckVulnerabilities> vulnerabilities;
-
-    public BlackduckInfo getInfo() {
-        return info;
-    }
-
-    public void setInfo(BlackduckInfo info) {
-        this.info = info;
-    }
-
-    public List<LicensePair> getLicense() {
-        return license;
-    }
-
-    public void setLicense(List<LicensePair> license) {
-        this.license = license;
-    }
-
-    public List<BlackDuckVulnerabilities> getVulnerabilities() {
-        return vulnerabilities;
-    }
-
-    public void setVulnerabilities(List<BlackDuckVulnerabilities> vulnerabilities) {
-        this.vulnerabilities = vulnerabilities;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/blackduck/LicensePair.java b/base/common/src/main/java/org/artifactory/addon/blackduck/LicensePair.java
deleted file mode 100644
index cc86140..0000000
--- a/base/common/src/main/java/org/artifactory/addon/blackduck/LicensePair.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.artifactory.addon.blackduck;
-
-/**
- * @author Chen Keinan
- */
-public class LicensePair {
-
-    private String licenseName;
-    private String licenseUrl;
-
-    public LicensePair(String licenseName, String licenseLink) {
-        this.licenseName = licenseName;
-        this.licenseUrl = licenseLink;
-    }
-
-    public String getLicenseName() {
-        return licenseName;
-    }
-
-    public void setLicenseName(String licenseName) {
-        this.licenseName = licenseName;
-    }
-
-    public String getLicenseUrl() {
-        return licenseUrl;
-    }
-
-    public void setLicenseUrl(String licenseUrl) {
-        this.licenseUrl = licenseUrl;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/bower/BowerAddon.java b/base/common/src/main/java/org/artifactory/addon/bower/BowerAddon.java
deleted file mode 100644
index 03dfb35..0000000
--- a/base/common/src/main/java/org/artifactory/addon/bower/BowerAddon.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.bower;
-
-import org.artifactory.addon.Addon;
-import org.artifactory.api.repo.Async;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.repo.RepoPath;
-
-/**
- * Core Bower functionality interface
- *
- * @author Shay Yaakov
- */
-public interface BowerAddon extends Addon {
-
-    /**
-     * Adds a bower package to the repository and indexing it by tagging name and version properties.
-     *
-     * @param info The added bower package file
-     */
-    void addBowerPackage(FileInfo info);
-
-    /**
-     *
-     * Adds a bower package to the repository asynchronously, delegates to the indexing for properties extraction.
-     *
-     * @param info The added bower package file
-     */
-    @Async(delayUntilAfterCommit = true)
-    void handleAddAfterCommit(FileInfo info);
-
-    /**
-     * Removes a bower package from the repository.
-     *
-     * @param info The bower package file to be removed
-     */
-    void removeBowerPackage(FileInfo info);
-
-    /**
-     * Checks if a given path is a valid bower file according to it's extension (tar.gz, tgz, zip).
-     *
-     * @param filePath The file path to check
-     */
-    boolean isBowerFile(String filePath);
-
-    /**
-     * Adds the given repository key into the map of queued reindex requests and trigger asynchronously
-     * {@link BowerService#asyncReindex()} for actual re-indexing.
-     *
-     * @param repoKey The repository key to reindex
-     */
-    void requestAsyncReindexBowerPackages(String repoKey);
-
-    /**
-     * get bower meta data info
-     *
-     * @param repoPath - bower file info
-     * @return bower meta data info
-     */
-    BowerMetadataInfo getBowerMetadata(RepoPath repoPath);
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/addon/bower/BowerDependencies.java b/base/common/src/main/java/org/artifactory/addon/bower/BowerDependencies.java
deleted file mode 100644
index a8c0299..0000000
--- a/base/common/src/main/java/org/artifactory/addon/bower/BowerDependencies.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.artifactory.addon.bower;
-
-/**
- * @author Chen Keinan
- */
-public class BowerDependencies {
-
-    private String name;
-    private String version;
-
-    public BowerDependencies(String name, String version) {
-        this.name = name;
-        this.version = version;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/bower/BowerMetadataInfo.java b/base/common/src/main/java/org/artifactory/addon/bower/BowerMetadataInfo.java
deleted file mode 100644
index efaa2b6..0000000
--- a/base/common/src/main/java/org/artifactory/addon/bower/BowerMetadataInfo.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.artifactory.addon.bower;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class BowerMetadataInfo {
-
-    private BowerPkgInfo bowerPkgInfo;
-    private List<BowerDependencies> bowerDependencies;
-    private List<String> mainFiles;
-    private List<String> ignoredFiles;
-
-    public BowerPkgInfo getBowerPkgInfo() {
-        return bowerPkgInfo;
-    }
-
-    public void setBowerPkgInfo(BowerPkgInfo bowerPkgInfo) {
-        this.bowerPkgInfo = bowerPkgInfo;
-    }
-
-    public List<BowerDependencies> getBowerDependencies() {
-        return bowerDependencies;
-    }
-
-    public void setBowerDependencies(List<BowerDependencies> bowerDependencies) {
-        this.bowerDependencies = bowerDependencies;
-    }
-
-    public List<String> getMainFiles() {
-        return mainFiles;
-    }
-
-    public void setMainFiles(List<String> mainFiles) {
-        this.mainFiles = mainFiles;
-    }
-
-    public List<String> getIgnoredFiles() {
-        return ignoredFiles;
-    }
-
-    public void setIgnoredFiles(List<String> ignoredFiles) {
-        this.ignoredFiles = ignoredFiles;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/bower/BowerPkgInfo.java b/base/common/src/main/java/org/artifactory/addon/bower/BowerPkgInfo.java
deleted file mode 100644
index d574047..0000000
--- a/base/common/src/main/java/org/artifactory/addon/bower/BowerPkgInfo.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.artifactory.addon.bower;
-
-/**
- * @author Chen Keinan
- */
-public class BowerPkgInfo {
-
-    private String name;
-    private String description;
-    private String version;
-    private String license;
-    private String keywords;
-    private String repository;
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public String getLicense() {
-        return license;
-    }
-
-    public void setLicense(String license) {
-        this.license = license;
-    }
-
-    public String getKeywords() {
-        return keywords;
-    }
-
-    public void setKeywords(String keywords) {
-        this.keywords = keywords;
-    }
-
-    public String getRepository() {
-        return repository;
-    }
-
-    public void setRepository(String repository) {
-        this.repository = repository;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/build/ArtifactBuildAddon.java b/base/common/src/main/java/org/artifactory/addon/build/ArtifactBuildAddon.java
deleted file mode 100644
index c0a6ba1..0000000
--- a/base/common/src/main/java/org/artifactory/addon/build/ArtifactBuildAddon.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package org.artifactory.addon.build;
-
-import org.artifactory.addon.Addon;
-import org.artifactory.api.build.GeneralBuild;
-import org.artifactory.api.build.ModuleArtifact;
-import org.artifactory.api.build.ModuleDependency;
-import org.artifactory.api.build.PublishedModule;
-import org.artifactory.api.build.diff.BuildsDiffBaseFileModel;
-import org.artifactory.api.build.diff.BuildsDiffPropertyModel;
-import org.artifactory.api.rest.build.diff.BuildsDiff;
-import org.artifactory.build.ArtifactoryBuildArtifact;
-import org.artifactory.build.BuildRun;
-import org.artifactory.fs.FileInfo;
-import org.jfrog.build.api.Build;
-import org.jfrog.build.api.Dependency;
-
-import java.sql.SQLException;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Chen Keinan
- */
-public interface ArtifactBuildAddon extends Addon {
-
-    /**
-     * get build artifact info
-     * @param build - build general info
-     * @return map of build artifact info
-     */
-    Set<ArtifactoryBuildArtifact> getBuildArtifactsFileInfos(Build build);
-
-    /**
-     * get build dependencies file info
-     * @param build - build general i nfo
-     * @return map of build dependencies  file info
-     */
-    Map<Dependency, FileInfo> getBuildDependenciesFileInfos(Build build);
-
-    /**
-     * get alll latest builds with paging
-     *
-     * @param offset    - query offset
-     * @param orderBy   -  query order by
-     * @param direction - query direction
-     * @param limit     - query limit
-     * @return - set of builds
-     */
-    Set<BuildRun> getLatestBuildsPaging(String offset, String orderBy, String direction, String limit);
-
-    /**
-     * return list of Builds history by build name
-     *
-     * @param buildName - build name
-     * @param orderBy   - order by
-     * @param direction - direction (asc|desc)
-     * @param offset    - offset start row
-     * @param limit     - limit end row
-     * @return list of build history
-     * @throws SQLException
-     */
-    List<GeneralBuild> getBuildForNamePaging(String buildName, String orderBy, String direction, String offset, String limit) throws SQLException;
-
-    /**
-     * return to total count of historical Builds  for each name
-     *
-     * @return list of builds
-     */
-    int getBuildForNameTotalCount(String buildName) throws SQLException;
-
-    Build getBuild(BuildRun build);
-
-    BuildRun getBuildRun(String buildName, String buildNumber, String buildStarted);
-
-    Build getLatestBuildByNameAndNumber(String  buildName , String BuildNumber);
-
-    List<PublishedModule> getPublishedModules(String buildName, String date, String orderBy, String direction, String offset, String limit);
-
-    int  getPublishedModulesCounts(String buildName, String date);
-
-    List<ModuleArtifact> getModuleArtifact(String buildName ,String buildNumber, String moduleId,String date, String orderBy, String direction, String offset, String limit);
-
-   int getModuleArtifactCount(String buildNumber, String moduleId,String date);
-
-    List<ModuleDependency> getModuleDependency(String buildNumber, String moduleId, String date, String orderBy, String direction, String offset, String limit);
-
-    int getModuleDependencyCount(String buildNumber, String moduleId, String date);
-
-    void deleteAllBuilds(String buildName);
-
-     BuildsDiff getBuildsDiff(Build firstBuild, Build secondBuild, String baseStorageInfoUri);
-
-    List<BuildsDiffBaseFileModel> compareArtifacts(Build build,Build secondBuild);
-
-    List<BuildsDiffBaseFileModel> compareDependencies(Build build,Build secondBuild);
-
-    List<BuildsDiffPropertyModel> compareProperties(Build build,Build secondBuild);
-    }
diff --git a/base/common/src/main/java/org/artifactory/addon/build/BuildAddon.java b/base/common/src/main/java/org/artifactory/addon/build/BuildAddon.java
deleted file mode 100644
index fb4970c..0000000
--- a/base/common/src/main/java/org/artifactory/addon/build/BuildAddon.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.build;
-
-import org.artifactory.addon.Addon;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.rest.build.artifacts.BuildArtifactsRequest;
-import org.artifactory.api.rest.build.diff.BuildsDiff;
-import org.artifactory.build.ArtifactoryBuildArtifact;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.sapi.common.Lock;
-import org.jfrog.build.api.BaseBuildFileBean;
-import org.jfrog.build.api.Build;
-import org.jfrog.build.api.BuildRetention;
-import org.jfrog.build.api.Dependency;
-import org.jfrog.build.api.dependency.BuildPatternArtifacts;
-import org.jfrog.build.api.dependency.BuildPatternArtifactsRequest;
-
-import javax.annotation.Nonnull;
-import java.io.File;
-import java.io.IOException;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Addon for continuous integration info handling
- *
- * @author Noam Y. Tenne
- */
-public interface BuildAddon extends Addon {
-
-    /**
-     * Returns a mapping of file info to artifact for all artifacts in this build, will return artifacts that were not
-     * directly involved in the build (but same checksum!) if the build's artifacts themselves were'nt found based on
-     * their properties.
-     * NOTE: a mapping might be null if the artifact does not exist in artifactory
-     *
-     * @param build The searched build
-     * @return file beans and file infos
-     */
-    Set<ArtifactoryBuildArtifact> getBuildArtifactsFileInfosWithFallback(Build build);
-
-    /**
-     * Returns a mapping of file info to artifact for all artifacts in this build.
-     * NOTE: a mapping might be null if the artifact does not exist in artifactory
-     *
-     * @param build The searched build
-     * @return file beans and file infos
-     */
-    Set<ArtifactoryBuildArtifact> getBuildArtifactsFileInfos(Build build);
-
-    /**
-     * Returns a file info of dependency object for a build file bean
-     * NOTE: a mapping might be null if the dependency does not exist in artifactory
-     *
-     * @param build The searched build
-     * @return file beans and file infos
-     */
-    Map<Dependency, FileInfo> getBuildDependenciesFileInfos(Build build);
-
-    /**
-     * Searches for artifacts with build name properties that contain 'from' as a value and renames them to 'to'
-     *
-     * @param from Build name property value to search for
-     * @param to   Replacement build name
-     */
-    @Lock
-    void renameBuildNameProperty(String from, String to);
-
-    /**
-     * Discard old builds according to a maximum date. If a build is below the {@code minimumBuildDate} then that build
-     * will be discarded.
-     *
-     * @param buildName         The name of the build.
-     * @param buildRetention    Build retention model that holds information about which build to discard
-     * @param multiStatusHolder Status holder
-     */
-    @Lock
-    void discardOldBuildsByDate(String buildName, BuildRetention buildRetention, BasicStatusHolder multiStatusHolder);
-
-    /**
-     * Discard old builds according to the maximum amount of builds that should be retained. if {@code count} is larger
-     * than the size of the set of builds, all builds will be retained.
-     *
-     * @param buildName         The name of the build.
-     * @param discard           Build retention model that holds information about which build to discard
-     * @param multiStatusHolder Status holder
-     */
-    @Lock
-    void discardOldBuildsByCount(String buildName, BuildRetention discard, BasicStatusHolder multiStatusHolder);
-
-    /**
-     * Returns the built artifacts matching the request
-     *
-     * @param buildPatternArtifactsRequest contains build name and build number or keyword
-     * @param servletContextUrl            for building urls of current Artifactory instance
-     * @return artifacts generated by the build
-     */
-    BuildPatternArtifacts getBuildPatternArtifacts(@Nonnull BuildPatternArtifactsRequest buildPatternArtifactsRequest,
-            String servletContextUrl);
-
-    /**
-     * Returns build artifacts map according to the param input regexp patterns.
-     *
-     * @param buildArtifactsRequest A wrapper which contains the necessary parameters
-     * @return A map from {@link FileInfo}s to their target directories relative paths
-     * @see BuildArtifactsRequest
-     */
-    Map<FileInfo, String> getBuildArtifacts(BuildArtifactsRequest buildArtifactsRequest);
-
-    /**
-     * Returns an archive file according to the param archive type (zip/tar/tar.gz/tgz) which contains
-     * all build artifacts according to the given build name and number (can be latest or latest by status).
-     *
-     * @param buildArtifactsRequest A wrapper which contains the necessary parameters
-     * @return The archived file of build artifacts with their hierarchy rules
-     * @see BuildArtifactsRequest
-     */
-    File getBuildArtifactsArchive(BuildArtifactsRequest buildArtifactsRequest) throws IOException;
-
-    /**
-     * Returns diff object between two given builds (same build name, different numbers)
-     *
-     * @param firstBuild         The first build to compare, must be newer than the second build
-     * @param secondBuild        The second build to compare against
-     * @param baseStorageInfoUri Base storage uri
-     */
-    BuildsDiff getBuildsDiff(Build firstBuild, Build secondBuild, String baseStorageInfoUri);
-
-    /**
-     * return artifact or dependency file info (in order to get repo path)
-     *
-     * @param artifact - artifact or dependency  (to get file info for)
-     * @param build    - build data
-     * @return file info instance of artifact or dependency
-     */
-    FileInfo getFileBeanInfo(BaseBuildFileBean artifact, Build build);
-
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/addon/cocoapods/CocoaPodsAddon.java b/base/common/src/main/java/org/artifactory/addon/cocoapods/CocoaPodsAddon.java
deleted file mode 100644
index 7d87450..0000000
--- a/base/common/src/main/java/org/artifactory/addon/cocoapods/CocoaPodsAddon.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.artifactory.addon.cocoapods;
-
-import org.artifactory.addon.Addon;
-import org.artifactory.api.repo.Async;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.md.Properties;
-
-/**
- * @author Dan Feldman
- */
-public interface CocoaPodsAddon extends Addon {
-
-    /**
-     * Adds a pod to the repository by triggering an index and tagging with properties
-     *
-     * @param info The added pod file
-     */
-    void addPod(FileInfo info);
-
-    /**
-     * Adds a pod to the repository asynchronously.
-     *
-     * @param info The added pod file
-     */
-    @Async(delayUntilAfterCommit = true)
-    void addPodAfterCommit(FileInfo info);
-
-    /**
-     * Used by the remote interceptor to just cache properties on a downloaded pod as there's no need to write an
-     * index entry for it.
-     * @param info Pod to write properties for
-     */
-    @Async(delayUntilAfterCommit = true, authenticateAsSystem = true)
-    void cachePodProperties(FileInfo info);
-
-    /**
-     * Removes a pod's index entry from the repository.
-     *
-     * @param info          The pod file being removed
-     * @param properties    Properties of the pod being removed
-     */
-    @Async(delayUntilAfterCommit = true)
-    void removePod(FileInfo info, Properties properties);
-
-
-    /**
-     * Adds the given repository key into the map of queued reindex requests and trigger the
-     * async reindex operation in the service.
-     *
-     * @param repoKey The repository key to reindex
-     */
-    void reindexAsync(String repoKey);
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/debian/DebianAddon.java b/base/common/src/main/java/org/artifactory/addon/debian/DebianAddon.java
deleted file mode 100644
index 5cda398..0000000
--- a/base/common/src/main/java/org/artifactory/addon/debian/DebianAddon.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.debian;
-
-import org.artifactory.addon.Addon;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.repo.RepoPath;
-
-import javax.annotation.Nullable;
-import java.util.Collection;
-import java.util.Set;
-
-/**
- * @author Gidi Shabat
- */
-public interface DebianAddon extends Addon {
-
-    void recalculateAll(LocalRepoDescriptor localRepoDescriptor, String password, boolean delayed, boolean writeProps);
-
-    void calculateMetaData(Set<DebianCalculationEvent> calculationRequests,
-            @Nullable Collection<RepoPath> propertyWriterEntries, boolean delayed);
-
-     void onInstallKey(String key,boolean isPublic) throws Exception;
-
-    void removeKey(boolean isPublic);
-
-    boolean hasPrivateKey();
-
-    boolean hasPublicKey();
-
-    boolean verifyPassPhrase(String phrase);
-
-    void savePassPhrase(String password);
-
-    boolean foundExpiredAndRemoteIsNewer(RepoResource remoteResource, RepoResource cachedResource);
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/debian/DebianCalculationEvent.java b/base/common/src/main/java/org/artifactory/addon/debian/DebianCalculationEvent.java
deleted file mode 100644
index 92ef571..0000000
--- a/base/common/src/main/java/org/artifactory/addon/debian/DebianCalculationEvent.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.debian;
-
-import org.artifactory.addon.dpkgcommon.DpkgCalculationEvent;
-
-import java.io.Serializable;
-
-/**
- * @author Gidi Shabat
- */
-public class DebianCalculationEvent extends DpkgCalculationEvent implements Comparable<DebianCalculationEvent>, Serializable {
-
-    public static final String INDEX_ENTIRE_REPO = "reindex_entire_repo";
-
-    private final String distribution;
-    private final String component;
-    private final String architecture;
-    private final Layout layout;
-
-    public DebianCalculationEvent(String distribution, String component, String architecture, String repoKey,
-            Layout layout) {
-        super(repoKey, false);
-        this.distribution = distribution;
-        this.component = component;
-        this.architecture = architecture;
-        this.layout = layout;
-    }
-
-    public static DebianCalculationEvent indexEntireRepoEvent(String repoKey, Layout layout) {
-        return new DebianCalculationEvent(repoKey, layout);
-    }
-
-    /**
-     * Constructs an event that will be interpreted as index entire repo
-     */
-    private DebianCalculationEvent(String repoKey, Layout layout) {
-        super(repoKey, true);
-        this.layout = layout;
-        this.distribution = INDEX_ENTIRE_REPO;
-        this.component = null;
-        this.architecture = null;
-    }
-
-    public String getDistribution() {
-        return distribution;
-    }
-
-    public String getComponent() {
-        return component;
-    }
-
-    public String getArchitecture() {
-        return architecture;
-    }
-
-    public Layout getLayout() {
-        return layout;
-    }
-
-    @Override
-    public int compareTo(DebianCalculationEvent o) {
-        int i = repoKey.compareTo(o.repoKey);
-        if (i != 0) {
-            return i;
-        }
-        if (distribution != null) {
-            i = distribution.compareTo(o.distribution);
-            if (i != 0) {
-                return i;
-            }
-        }
-        if (component != null) {
-            i = component.compareTo(o.component);
-            if (i != 0) {
-                return i;
-            }
-        }
-        if (architecture != null) {
-            i = architecture.compareTo(o.architecture);
-            if (i != 0) {
-                return i;
-            }
-        }
-        return i;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        if (!super.equals(o)) {
-            return false;
-        }
-        DebianCalculationEvent that = (DebianCalculationEvent) o;
-        if (distribution != null ? !distribution.equals(that.getDistribution()) : that.getDistribution() != null) {
-            return false;
-        }
-        if (component != null ? !component.equals(that.getComponent()) : that.getComponent() != null) {
-            return false;
-        }
-        return architecture != null ? architecture.equals(that.getArchitecture()) : that.getArchitecture() == null;
-    }
-
-    @Override
-    public String toString() {
-        return (repoKey != null ? "repoKey=" + repoKey + " " : "") +
-                (distribution != null ? "distribution=" + distribution + " " : "") +
-                (component != null ? "component=" + component + " " : "") +
-                (architecture != null ? ", architecture=" + architecture + " " : "") + "]";
-    }
-
-    @Override
-    public int hashCode() {
-        int result = component != null ? component.hashCode() : 0;
-        result = 31 * result + (architecture != null ? architecture.hashCode() : 0);
-        result = 31 * result + (distribution != null ? distribution.hashCode() : 0);
-        result = 31 * result + super.hashCode();
-        return result;
-    }
-
-    public enum Layout implements Serializable{
-        auto, trivial
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/debian/HaDebianMessage.java b/base/common/src/main/java/org/artifactory/addon/debian/HaDebianMessage.java
deleted file mode 100644
index e9352c9..0000000
--- a/base/common/src/main/java/org/artifactory/addon/debian/HaDebianMessage.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.artifactory.addon.debian;
-
-import org.artifactory.addon.ha.message.HaMessage;
-import org.artifactory.repo.RepoPath;
-
-import java.util.Collection;
-import java.util.Set;
-
-/**
- * @author Gidi Shabat
- */
-public class HaDebianMessage implements HaMessage {
-    private Set<DebianCalculationEvent> newEvents;
-    private Collection<RepoPath> propertyWriterEntries;
-    private boolean async;
-
-    public HaDebianMessage(Set<DebianCalculationEvent> newEvents, Collection<RepoPath> propertyWriterEntries, boolean async) {
-        this.newEvents = newEvents;
-        this.propertyWriterEntries = propertyWriterEntries;
-        this.async =async;
-    }
-
-    public Set<DebianCalculationEvent> getNewEvents() {
-        return newEvents;
-    }
-
-    public Collection<RepoPath> getPropertyWriterEntries() {
-        return propertyWriterEntries;
-    }
-
-    public void setNewEvents(Set<DebianCalculationEvent> newEvents) {
-        this.newEvents = newEvents;
-    }
-
-    public boolean isAsync() {
-        return async;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/docker/DockerAddon.java b/base/common/src/main/java/org/artifactory/addon/docker/DockerAddon.java
deleted file mode 100644
index 32117ad..0000000
--- a/base/common/src/main/java/org/artifactory/addon/docker/DockerAddon.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.docker;
-
-import org.artifactory.addon.Addon;
-import org.artifactory.addon.docker.rest.DockerTokenCacheKey;
-import org.artifactory.api.bintray.docker.BintrayDockerPushRequest;
-import org.artifactory.repo.RepoPath;
-
-import javax.annotation.Nullable;
-import java.io.IOException;
-
-/**
- * @author Shay Yaakov
- */
-public interface DockerAddon extends Addon {
-
-    /**
-     * Pushes the image:tag from {@param repoKey} given in {@param request} to Bintray, can optionally use a
-     * distribution repository's client instead of a client that's created for the current user
-     * if {@param distRepoKey} is specified.
-     */
-    void pushTagToBintray(String repoKey, BintrayDockerPushRequest request, @Nullable String distRepoKey);
-
-    DockerV2InfoModel getDockerV2Model(RepoPath manifestPath) throws IOException;
-
-    /**
-     * Retrieves a new auth token for the {@param tokenCacheKey} passed to it.
-     */
-    String fetchDockerAuthToken(DockerTokenCacheKey tokenCacheKey);
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/addon/docker/DockerBlobInfoModel.java b/base/common/src/main/java/org/artifactory/addon/docker/DockerBlobInfoModel.java
deleted file mode 100644
index 7cdbba7..0000000
--- a/base/common/src/main/java/org/artifactory/addon/docker/DockerBlobInfoModel.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.artifactory.addon.docker;
-
-import org.apache.commons.lang.StringUtils;
-
-/**
- * @author Shay Yaakov
- */
-public class DockerBlobInfoModel {
-
-    public String id;
-    public String shortId;
-    public String digest;
-    public String size;
-    public String created;
-    public String command;
-    public String commandText;
-
-    public DockerBlobInfoModel(String id, String digest, String size, String created) {
-        this.id = id;
-        if (StringUtils.isNotBlank(id)) {
-            this.shortId = id.substring(0, 12);
-        }
-        this.digest = digest;
-        this.size = size;
-        this.created = created;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/docker/DockerLabel.java b/base/common/src/main/java/org/artifactory/addon/docker/DockerLabel.java
deleted file mode 100644
index 5351128..0000000
--- a/base/common/src/main/java/org/artifactory/addon/docker/DockerLabel.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.artifactory.addon.docker;
-
-import java.util.Map;
-
-/**
- * @author Dan Feldman
- */
-public class DockerLabel {
-
-    private String key;
-    private String value;
-
-    public DockerLabel(String key, String value) {
-        this.key = key;
-        this.value = value;
-    }
-
-    public DockerLabel(Map.Entry<String, String> dockerV2InfoLabelEntry) {
-        this.key = dockerV2InfoLabelEntry.getKey();
-        this.value = dockerV2InfoLabelEntry.getValue();
-    }
-
-    public String getKey() {
-        return key;
-    }
-
-    public String getValue() {
-        return value;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/docker/DockerTagInfoModel.java b/base/common/src/main/java/org/artifactory/addon/docker/DockerTagInfoModel.java
deleted file mode 100644
index ae138bf..0000000
--- a/base/common/src/main/java/org/artifactory/addon/docker/DockerTagInfoModel.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.artifactory.addon.docker;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Shay Yaakov
- */
-public class DockerTagInfoModel {
-
-    public String title;
-    public String digest;
-    public String totalSize;
-    public Set<String> ports = Sets.newHashSet();
-    public Set<String> volumes = Sets.newHashSet();
-    public List<DockerLabel> labels = Lists.newArrayList();
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/addon/docker/DockerV2InfoModel.java b/base/common/src/main/java/org/artifactory/addon/docker/DockerV2InfoModel.java
deleted file mode 100644
index 97871fe..0000000
--- a/base/common/src/main/java/org/artifactory/addon/docker/DockerV2InfoModel.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.artifactory.addon.docker;
-
-import com.google.common.collect.Lists;
-
-import java.util.List;
-
-/**
- * @author Shay Yaakov
- */
-public class DockerV2InfoModel {
-
-    public DockerTagInfoModel tagInfo = new DockerTagInfoModel();
-    public List<DockerBlobInfoModel> blobsInfo = Lists.newArrayList();
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/docker/rest/DockerRemoteTokenProvider.java b/base/common/src/main/java/org/artifactory/addon/docker/rest/DockerRemoteTokenProvider.java
deleted file mode 100644
index 81bb7d2..0000000
--- a/base/common/src/main/java/org/artifactory/addon/docker/rest/DockerRemoteTokenProvider.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package org.artifactory.addon.docker.rest;
-
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.docker.DockerAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.util.bearer.TokenProvider;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nonnull;
-import javax.annotation.PostConstruct;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Map;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Docker specific implementation of a {@link TokenProvider}.
- * The tokens are cached in-memory and auto expire according to the
- * {@code artifactory.docker.tokens.cache.idleTimeSecs} system property
- *
- * @author Shay Yaakov
- */
- at Service
-public class DockerRemoteTokenProvider implements TokenProvider {
-    private static final Logger log = LoggerFactory.getLogger(DockerRemoteTokenProvider.class);
-
-    private LoadingCache<DockerTokenCacheKey, String> tokens;
-
-    @PostConstruct
-    public void initTokensCache() {
-        tokens = CacheBuilder.newBuilder()
-                .initialCapacity(1000)
-                .expireAfterWrite(ConstantValues.dockerTokensCacheIdleTimeSecs.getLong(), TimeUnit.SECONDS)
-                .build(new CacheLoader<DockerTokenCacheKey, String>() {
-                    @Override
-                    public String load(@Nonnull DockerTokenCacheKey key) throws Exception {
-                        String token = fetchNewToken(key);
-                        if (StringUtils.isBlank(token)) {
-                            throw new Exception("Can't fetch token for repo: " + key.getRepoKey() + " realm: "
-                                    + key.getRealm() + " scope:" + key.getScope());
-                        }
-                        return token;
-                    }
-                });
-    }
-
-    @Override
-    public String getToken(Map<String, String> challengeParams, String method, String uri, String repoKey) {
-        try {
-            populateParamsIfNeeded(challengeParams, method, uri);
-            log.trace("Getting token for " + challengeParams);
-            return tokens.get(new DockerTokenCacheKey(challengeParams, repoKey));
-        } catch (ExecutionException e) {
-            throw new RuntimeException("Could not get token from cache for " + challengeParams, e);
-        }
-    }
-
-    private void populateParamsIfNeeded(Map<String, String> challengeParams, String method, String uri) {
-        if (!challengeParams.containsKey("service")) {
-            String realm = challengeParams.get("realm");
-            if (StringUtils.isNotBlank(realm) && realm.startsWith("http")) {
-                try {
-                    challengeParams.put("service", new URL(realm).getHost());
-                } catch (MalformedURLException e) {
-                    log.error("Realm of token cannot be parsed due to: " + e.getMessage(), e);
-                }
-            }
-        }
-        if (!challengeParams.containsKey("scope")) {
-            if (uri.startsWith("/v2/")) {
-                String newScope = null;
-                StringBuilder scopeBuilder = new StringBuilder("repository:");
-                String[] split = uri.split("/"); // The first / ends up with empty string at pos 0
-                if (split.length < 3) {
-                    // Simple ping => empty scope
-                } else {
-                    scopeBuilder.append(split[2]);
-                }
-                if (split.length > 3) {
-                    scopeBuilder.append("/");
-                    scopeBuilder.append(split[3]);
-                }
-                scopeBuilder.append(":");
-                if ("GET".equalsIgnoreCase(method)) {
-                    scopeBuilder.append("pull");
-                    newScope = scopeBuilder.toString();
-                } else if ("PUT".equalsIgnoreCase(method)) {
-                    scopeBuilder.append("pull");
-                    newScope = scopeBuilder.toString();
-                } else {
-                    log.warn("Docker Bearer challenge has no scope and method is not GET or PUT '" + method + "'");
-                }
-                if (newScope != null) {
-                    log.debug("Docker Bearer challenge new scope set to '" + newScope + "'");
-                    challengeParams.put("scope", newScope);
-                }
-            } else {
-                log.warn("Docker Bearer challenge has no scope and URI does not starts with /v2 but '" + uri + "'");
-            }
-        }
-    }
-
-    private String fetchNewToken(DockerTokenCacheKey tokenCacheKey) {
-        log.trace("Fetching new token for '{}'", tokenCacheKey);
-        return ContextHelper.get().beanForType(AddonsManager.class).addonByType(DockerAddon.class)
-                .fetchDockerAuthToken(tokenCacheKey);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/docker/rest/DockerTokenCacheKey.java b/base/common/src/main/java/org/artifactory/addon/docker/rest/DockerTokenCacheKey.java
deleted file mode 100644
index 92d306a..0000000
--- a/base/common/src/main/java/org/artifactory/addon/docker/rest/DockerTokenCacheKey.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package org.artifactory.addon.docker.rest;
-
-import java.util.Map;
-
-/**
- * Model object for saving bearer tokens
- *
- * @author Shay Yaakov
- */
-public class DockerTokenCacheKey {
-    private final String scope;
-    private final String realm;
-    private final String service;
-    private final String repoKey;
-
-    public DockerTokenCacheKey(Map<String, String> challengeParams, String repoKey) {
-        this.repoKey = repoKey;
-        this.scope = challengeParams.get("scope");
-        this.realm = challengeParams.get("realm");
-        this.service = challengeParams.get("service");
-    }
-
-    public String getScope() {
-        return scope;
-    }
-
-    public String getRealm() {
-        return realm;
-    }
-
-    public String getService() {
-        return service;
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        DockerTokenCacheKey that = (DockerTokenCacheKey) o;
-
-        if (scope != null ? !scope.equals(that.scope) : that.scope != null) return false;
-        if (realm != null ? !realm.equals(that.realm) : that.realm != null) return false;
-        if (service != null ? !service.equals(that.service) : that.service != null) return false;
-        return !(repoKey != null ? !repoKey.equals(that.repoKey) : that.repoKey != null);
-
-    }
-
-    @Override
-    public int hashCode() {
-        int result = scope != null ? scope.hashCode() : 0;
-        result = 31 * result + (realm != null ? realm.hashCode() : 0);
-        result = 31 * result + (service != null ? service.hashCode() : 0);
-        result = 31 * result + (repoKey != null ? repoKey.hashCode() : 0);
-        return result;
-    }
-
-    @Override
-    public String toString() {
-        return "TokenCacheKey{" +
-                "scope='" + scope + '\'' +
-                ", realm='" + realm + '\'' +
-                ", service='" + service + '\'' +
-                ", repoKey='" + repoKey + '\'' +
-                '}';
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/dpkgcommon/DpkgCalculationEvent.java b/base/common/src/main/java/org/artifactory/addon/dpkgcommon/DpkgCalculationEvent.java
deleted file mode 100644
index 848850e..0000000
--- a/base/common/src/main/java/org/artifactory/addon/dpkgcommon/DpkgCalculationEvent.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.artifactory.addon.dpkgcommon;
-
-import java.io.Serializable;
-
-/**
- * @author Dan Feldman
- */
-public abstract class DpkgCalculationEvent implements Serializable {
-
-    protected final String repoKey;
-    protected String passphrase = null;
-    protected long timestamp;
-    protected final boolean isIndexEntireRepo;
-
-    public DpkgCalculationEvent(String repoKey, boolean isIndexEntireRepo) {
-        this.repoKey = repoKey;
-        this.timestamp = System.currentTimeMillis();
-        this.isIndexEntireRepo = isIndexEntireRepo;
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public String getPassphrase() {
-        return passphrase;
-    }
-
-    public void setPassphrase(String passphrase) {
-        this.passphrase = passphrase;
-    }
-
-    public long getTimestamp() {
-        return timestamp;
-    }
-
-    public void setTimestamp(long timestamp) {
-        this.timestamp = timestamp;
-    }
-
-    public boolean isIndexEntireRepo() {
-        return isIndexEntireRepo;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof DpkgCalculationEvent)) return false;
-
-        DpkgCalculationEvent that = (DpkgCalculationEvent) o;
-        return getRepoKey() != null ? getRepoKey().equals(that.getRepoKey()) : that.getRepoKey() == null;
-    }
-
-    @Override
-    public int hashCode() {
-        return getRepoKey() != null ? getRepoKey().hashCode() : 0;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/filteredresources/FilteredResourcesAddon.java b/base/common/src/main/java/org/artifactory/addon/filteredresources/FilteredResourcesAddon.java
deleted file mode 100644
index 2aac023..0000000
--- a/base/common/src/main/java/org/artifactory/addon/filteredresources/FilteredResourcesAddon.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.filteredresources;
-
-import org.artifactory.addon.Addon;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.fs.ZipEntryRepoResource;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.request.Request;
-import org.artifactory.resource.ResourceStreamHandle;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-
-/**
- * Filtered resources core functionality interface
- *
- * @author Noam Y. Tenne
- */
-public interface FilteredResourcesAddon extends Addon {
-
-    /**
-     * Indicates whether this file is marked as a resource that can be filtered
-     *
-     * @param repoPath Item to check
-     * @return True if the file is marked as a filtered resource
-     */
-    boolean isFilteredResourceFile(RepoPath repoPath);
-
-    /**
-     * Indicates whether this file is marked as a resource that can be filtered based on the file properties given as
-     * parameter.
-     *
-     * @param repoPath Item to check
-     * @param props    The item current properties
-     * @return True if the file is marked as a filtered resource
-     */
-    boolean isFilteredResourceFile(RepoPath repoPath, Properties props);
-
-    /**
-     * Returns the file's content after filtering it. Always auto closes the input stream
-     *
-     * @param request         File request
-     * @param fileInfo        File info
-     * @param fileInputStream File content input stream. Always auto closed
-     * @return Resource of filtered file content
-     */
-    RepoResource getFilteredResource(Request request, FileInfo fileInfo, InputStream fileInputStream);
-
-    String filterResource(Request request, Properties contextProperties, Reader reader) throws Exception;
-
-    String filterResource(Reader reader, Object model) throws Exception;
-
-    /**
-     * Controls the filtered state of a resource
-     *
-     * @param repoPath Target item repo path
-     * @param filtered True if the item should be marked as filter
-     */
-    void toggleResourceFilterState(RepoPath repoPath, boolean filtered);
-
-    /**
-     * Returns resource representing a file inside zip. The method will fail if the input stream doesn't represent valid
-     * zip stream.
-     *
-     * @param request The client request
-     * @param info    The zip file info
-     * @param stream  The file input stream
-     * @return The resource info contained in the zip file. Including size and checksums
-     */
-    RepoResource getZipResource(Request request, FileInfo info, InputStream stream);
-
-    /**
-     * Returns stream handle to the entry inside the zip
-     *
-     * @param resource The zip resource
-     * @param stream   Input stream of a zip
-     * @return Stream handle to the entry inside the zip
-     * @throws IOException on failure to open the zip stream of to locate the entry
-     */
-    ResourceStreamHandle getZipResourceHandle(ZipEntryRepoResource resource, InputStream stream) throws IOException;
-
-
-    String getGeneratedSettingsUsernameTemplate();
-
-    String getGeneratedSettingsUserCredentialsTemplate(boolean escape);
-
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/gems/ArtifactGemsInfo.java b/base/common/src/main/java/org/artifactory/addon/gems/ArtifactGemsInfo.java
deleted file mode 100644
index 2dcb6ab..0000000
--- a/base/common/src/main/java/org/artifactory/addon/gems/ArtifactGemsInfo.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package org.artifactory.addon.gems;
-
-/**
- * @author Chen Keinan
- */
-public class ArtifactGemsInfo {
-    private String name;
-    private String version;
-    private String platform;
-    private String authors;
-    private String info;
-    private GemsDependsInfo dependencies;
-    private String homepage;
-    private String summary;
-    private String license;
-
-    public ArtifactGemsInfo() {
-    }
-
-    public String getName() {
-        return this.name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getVersion() {
-        return this.version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public String getPlatform() {
-        return this.platform;
-    }
-
-    public void setPlatform(String platform) {
-        this.platform = platform;
-    }
-
-    public String getAuthors() {
-        return this.authors;
-    }
-
-    public void setAuthors(String authors) {
-        this.authors = authors;
-    }
-
-    public String getInfo() {
-        return this.info;
-    }
-
-    public void setInfo(String info) {
-        this.info = info;
-    }
-
-    public GemsDependsInfo getDependencies() {
-        return dependencies;
-    }
-
-    public void setDependencies(GemsDependsInfo dependencies) {
-        this.dependencies = dependencies;
-    }
-
-    public String getHomepage() {
-        return this.homepage;
-    }
-
-    public void setHomepage(String homepage) {
-        this.homepage = homepage;
-    }
-
-    public String getSummary() {
-        return this.summary;
-    }
-
-    public void setSummary(String summary) {
-        this.summary = summary;
-    }
-
-    public String getLicense() {
-        return this.license;
-    }
-
-    public void setLicense(String license) {
-        this.license = license;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/gems/GemsAddon.java b/base/common/src/main/java/org/artifactory/addon/gems/GemsAddon.java
deleted file mode 100644
index 42044a8..0000000
--- a/base/common/src/main/java/org/artifactory/addon/gems/GemsAddon.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.artifactory.addon.gems;
-
-import org.artifactory.addon.Addon;
-import org.artifactory.api.repo.Async;
-
-/**
- * @author mamo
- */
-public interface GemsAddon extends Addon {
-
-    @Async
-    void reindexAsync(String repoKey);
-
-    @Async(delayUntilAfterCommit = true, authenticateAsSystem = true)
-    void afterRepoInit(String repoKey);
-
-    ArtifactGemsInfo getGemsInfo(String repoKey,String path);
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/gems/GemsDependInfo.java b/base/common/src/main/java/org/artifactory/addon/gems/GemsDependInfo.java
deleted file mode 100644
index 4483dab..0000000
--- a/base/common/src/main/java/org/artifactory/addon/gems/GemsDependInfo.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.artifactory.addon.gems;
-
-/**
- * @author Chen Keinan
- */
-public class GemsDependInfo {
-    private String name;
-    private String requirements;
-
-    public GemsDependInfo(String name, String requirements) {
-        this.name = name;
-        this.requirements = requirements;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getRequirements() {
-        return requirements;
-    }
-
-    public void setRequirements(String requirements) {
-        this.requirements = requirements;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/gems/GemsDependsInfo.java b/base/common/src/main/java/org/artifactory/addon/gems/GemsDependsInfo.java
deleted file mode 100644
index f9a997d..0000000
--- a/base/common/src/main/java/org/artifactory/addon/gems/GemsDependsInfo.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.artifactory.addon.gems;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class GemsDependsInfo {
-    private List<GemsDependInfo> development;
-    private List<GemsDependInfo> runtime;
-
-    public GemsDependsInfo() {
-    }
-
-    public GemsDependsInfo(List<GemsDependInfo> devDependsInfos, List<GemsDependInfo> runDependsInfos) {
-        this.development = devDependsInfos;
-        this.runtime = runDependsInfos;
-    }
-
-    public List<GemsDependInfo> getDevelopment() {
-        return development;
-    }
-
-    public void setDevelopment(List<GemsDependInfo> development) {
-        this.development = development;
-    }
-
-    public List<GemsDependInfo> getRuntime() {
-        return runtime;
-    }
-
-    public void setRuntime(List<GemsDependInfo> runtime) {
-        this.runtime = runtime;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/gitlfs/GitLfsAddon.java b/base/common/src/main/java/org/artifactory/addon/gitlfs/GitLfsAddon.java
deleted file mode 100644
index 077747d..0000000
--- a/base/common/src/main/java/org/artifactory/addon/gitlfs/GitLfsAddon.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.artifactory.addon.gitlfs;
-
-import org.apache.sshd.server.Command;
-import org.artifactory.addon.Addon;
-import org.artifactory.security.props.auth.SshTokenManager;
-
-
-/**
- * @author Chen Keinan
- */
-public interface GitLfsAddon extends Addon {
-
-    boolean isGitLfsCommand(String command);
-
-    Command createGitLfsCommand(String command, SshTokenManager sshTokenManager);
-
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/ha/HaCommonAddon.java b/base/common/src/main/java/org/artifactory/addon/ha/HaCommonAddon.java
deleted file mode 100644
index 3b174d2..0000000
--- a/base/common/src/main/java/org/artifactory/addon/ha/HaCommonAddon.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package org.artifactory.addon.ha;
-
-import org.artifactory.addon.Addon;
-import org.artifactory.addon.ha.message.HaMessage;
-import org.artifactory.addon.ha.message.HaMessageTopic;
-import org.artifactory.addon.ha.semaphore.SemaphoreWrapper;
-import org.artifactory.security.props.auth.CacheWrapper;
-import org.artifactory.security.props.auth.CacheWrapper.CacheConfig;
-import org.artifactory.storage.db.servers.model.ArtifactoryServer;
-
-import java.util.List;
-
-/**
- * @author mamo, gidi, fred
- */
-public interface HaCommonAddon extends Addon {
-
-    /**
-     * Response header for an HA Artifactory Node
-     */
-    String ARTIFACTORY_NODE_ID = "X-Artifactory-Node-Id";
-
-    /**
-     * Server ID in case of a non HA Artifactory node
-     */
-    String ARTIFACTORY_PRO = "Artifactory";
-
-    String SUPPORT_BUNDLE_SEMAPHORE_NAME = "supportBundleSemaphore";
-    String STATS_SEMAPHORE_NAME = "flushStatsSemaphore";
-    String STATS_REMOTE_SEMAPHORE_NAME = "flushRemoteStatsSemaphore";
-    String INDEXING_SEMAPHORE_NAME = "indexingSemaphore";
-    String INDEX_MARKED_ARCHIVES_SEMAPHORE_NAME = "indexMarkedArchivesSemaphore";
-    int DEFAULT_SEMAPHORE_PERMITS = 1;
-    // we block concurrent executions to prevent race condition
-    // between delete(async) and list(),
-    //
-    // also there is no justification to perform concurrent execution
-    // as we support taking several thread dumps with or without interval
-    int SUPPORT_BUNDLE_SEMAPHORE_INITIAL_PERMITS = 1;
-
-    /**
-     * determines if HA is enabled.
-     * <p>that is {@link org.artifactory.common.ArtifactoryHome#ARTIFACTORY_HA_NODE_PROPERTIES_FILE} exists and license type
-     * is HA or Trial
-     *
-     * @return {@code true} if the current Artifactory instance is HA enabled
-     */
-    boolean isHaEnabled();
-
-    /**
-     * @return {@code true} if HA is enabled and activated, and current Artifactory instance is the primary.
-     *         <p>is HA is <b>not enabled</b>, return true
-     */
-    boolean isPrimary();
-
-    /**
-     * @return {@code true} if HA is configured.
-     */
-    boolean isHaConfigured();
-
-    //todo move into HaAddon, should not be a common interface
-    void notify(HaMessageTopic haMessageTopic, HaMessage haMessage);
-
-    /**
-     * @return A unique hostId for a Pro/OSS installation, a hashed token for an HA node
-     */
-    String getHostId();
-
-    SemaphoreWrapper getSemaphore(String semaphoreName);
-
-    <K, V> CacheWrapper<K, V> getCache(String cacheName, CacheConfig cacheConfig);
-
-    void shutdown();
-
-    List<ArtifactoryServer> getAllArtifactoryServers();
-
-    boolean deleteArtifactoryServer(String id);
-
-    boolean artifactoryServerHasHeartbeat(ArtifactoryServer artifactoryServer);
-
-    String getCurrentMemberServerId();
-
-
-    void propagateDebianReindexAll(ArtifactoryServer server, String repoKey, boolean async, boolean writeProps);
-
-    void propagateOpkgReindexAll(ArtifactoryServer server, String repoKey, boolean async, boolean writeProps);
-
-    List propagateTrafficCollector(long startLong, long endLong, List<String> ipsToFilter,
-            List<ArtifactoryServer> servers, Class clazz) ;
-
-    <T> List<T> propagateTasksList(List<ArtifactoryServer> servers, Class<T> clazz);
-
-    void forceOptimizationOnce();
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/ha/message/HaMessage.java b/base/common/src/main/java/org/artifactory/addon/ha/message/HaMessage.java
deleted file mode 100644
index 58d24a0..0000000
--- a/base/common/src/main/java/org/artifactory/addon/ha/message/HaMessage.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.artifactory.addon.ha.message;
-
-import java.io.Serializable;
-
-/**
-* @author mamo
-*/
-public interface HaMessage extends Serializable {
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/ha/message/HaMessageTopic.java b/base/common/src/main/java/org/artifactory/addon/ha/message/HaMessageTopic.java
deleted file mode 100644
index 48c1051..0000000
--- a/base/common/src/main/java/org/artifactory/addon/ha/message/HaMessageTopic.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.addon.ha.message;
-
-/**
- * @author mamo
- */
-public enum HaMessageTopic {
-    CALCULATE_DEBIAN("calculateDebian"),
-    CALCULATE_OPKG("calculateOpkg"),
-    OFFLINE_TOPIC("putOffline"),
-    CONFIG_CHANGE_TOPIC("configChange"),
-    ACL_CHANGE_TOPIC("aclChange"),
-    LICENSES_CHANGE_TOPIC("licensesChange"),
-    NUPKG_TOPIC("nuPkgChange"),
-    WATCHES_TOPIC("watchesChange");
-
-    private final String topicName;
-
-    HaMessageTopic(String topicName) {
-        this.topicName = topicName;
-    }
-
-    public String topicName() {
-        return topicName;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/ha/message/NuPkgHaMessage.java b/base/common/src/main/java/org/artifactory/addon/ha/message/NuPkgHaMessage.java
deleted file mode 100644
index c32d634..0000000
--- a/base/common/src/main/java/org/artifactory/addon/ha/message/NuPkgHaMessage.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.artifactory.addon.ha.message;
-
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author mamo
- */
-public interface NuPkgHaMessage extends HaMessage {
-
-    public class Added implements NuPkgHaMessage {
-        public final RepoPath repoPath;
-        public final Properties properties;
-
-        public Added(RepoPath repoPath, Properties properties) {
-            this.repoPath = repoPath;
-            this.properties = properties;
-        }
-    }
-
-    public class Removed implements NuPkgHaMessage {
-        public final String repoKey;
-        public final String packageId;
-        public final String packageVersion;
-
-        public Removed(String repoKey, String packageId, String packageVersion) {
-            this.repoKey = repoKey;
-            this.packageId = packageId;
-            this.packageVersion = packageVersion;
-        }
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/ha/message/WatchesHaMessage.java b/base/common/src/main/java/org/artifactory/addon/ha/message/WatchesHaMessage.java
deleted file mode 100644
index 89e1d90..0000000
--- a/base/common/src/main/java/org/artifactory/addon/ha/message/WatchesHaMessage.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.artifactory.addon.ha.message;
-
-import org.artifactory.fs.WatcherInfo;
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author mamo
- */
-public interface WatchesHaMessage extends HaMessage {
-
-    public class AddWatch implements WatchesHaMessage {
-        public final long nodeId;
-        public final WatcherInfo watchInfo;
-
-        public AddWatch(long nodeId, WatcherInfo watchInfo) {
-            this.nodeId = nodeId;
-            this.watchInfo = watchInfo;
-        }
-    }
-
-    public class DeleteAllWatches implements WatchesHaMessage {
-        public final RepoPath repoPath;
-
-        public DeleteAllWatches(RepoPath repoPath) {
-            this.repoPath = repoPath;
-        }
-    }
-
-    public class DeleteUserWatches implements WatchesHaMessage {
-        public final RepoPath repoPath;
-        public final String username;
-
-        public DeleteUserWatches(RepoPath repoPath, String username) {
-            this.repoPath = repoPath;
-            this.username = username;
-        }
-    }
-
-    public class DeleteAllUserWatches implements WatchesHaMessage {
-        public final String username;
-
-        public DeleteAllUserWatches(String username) {
-            this.username = username;
-        }
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/ha/semaphore/JVMSemaphoreWrapper.java b/base/common/src/main/java/org/artifactory/addon/ha/semaphore/JVMSemaphoreWrapper.java
deleted file mode 100644
index 6c3bcc3..0000000
--- a/base/common/src/main/java/org/artifactory/addon/ha/semaphore/JVMSemaphoreWrapper.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.artifactory.addon.ha.semaphore;
-
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-
-/**
- * @author mamo
- */
-public class JVMSemaphoreWrapper implements SemaphoreWrapper {
-    private final Semaphore semaphore;
-
-    public JVMSemaphoreWrapper(Semaphore semaphore) {
-        this.semaphore = semaphore;
-    }
-
-    @Override
-    public boolean tryAcquire() {
-        return semaphore.tryAcquire();
-    }
-
-    @Override
-    public boolean tryAcquire(long timeout, TimeUnit unit) throws InterruptedException {
-        return semaphore.tryAcquire(timeout, unit);
-    }
-
-    @Override
-    public void release() {
-        semaphore.release();
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/ha/semaphore/SemaphoreWrapper.java b/base/common/src/main/java/org/artifactory/addon/ha/semaphore/SemaphoreWrapper.java
deleted file mode 100644
index 0fff7c9..0000000
--- a/base/common/src/main/java/org/artifactory/addon/ha/semaphore/SemaphoreWrapper.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.artifactory.addon.ha.semaphore;
-
-import java.util.concurrent.TimeUnit;
-
-public interface SemaphoreWrapper {
-
-    boolean tryAcquire();
-
-    boolean tryAcquire(long timeout, TimeUnit unit) throws InterruptedException;
-
-    void release();
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/addon/ldapgroup/LdapUserGroup.java b/base/common/src/main/java/org/artifactory/addon/ldapgroup/LdapUserGroup.java
deleted file mode 100644
index 40ae4fc..0000000
--- a/base/common/src/main/java/org/artifactory/addon/ldapgroup/LdapUserGroup.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package org.artifactory.addon.ldapgroup;
-
-/**
- * @author Chen Keinan
- */
-public class LdapUserGroup {
-    private String groupName;
-    private String description;
-    private String groupDn;
-    private Status requiredUpdate = Status.DOES_NOT_EXIST;
-
-    protected LdapUserGroup() {
-    }
-
-    public LdapUserGroup(String groupName, String description, String groupDn) {
-        this.groupName = groupName;
-        this.description = description;
-        this.groupDn = groupDn;
-    }
-
-    public Status getRequiredUpdate() {
-        return requiredUpdate;
-    }
-
-    public void setRequiredUpdate(Status requiredUpdate) {
-        this.requiredUpdate = requiredUpdate;
-    }
-
-    public String getGroupName() {
-        return groupName;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public String getGroupDn() {
-        return groupDn;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        LdapUserGroup group = (LdapUserGroup) o;
-        if (!groupName.equals(group.groupName)) {
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return groupName.hashCode();
-    }
-
-    @Override
-    public String toString() {
-        final StringBuilder sb = new StringBuilder();
-        sb.append("LdapGroup");
-        sb.append("{groupName='").append(groupName).append('\'');
-        sb.append(", description='").append(description).append('\'');
-        sb.append('}');
-        return sb.toString();
-    }
-
-    public enum Status {
-        DOES_NOT_EXIST("Ready to be imported."),
-        REQUIRES_UPDATE("Group information is ou-of-date. DN has changed in LDAP."),
-        IN_ARTIFACTORY("Group information is up-to-date in Artifactory.");
-
-        private String description;
-
-        Status(String description) {
-            this.description = description;
-        }
-
-        @Override
-        public String toString() {
-            return description;
-        }
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/ldapgroup/LdapUserGroupAddon.java b/base/common/src/main/java/org/artifactory/addon/ldapgroup/LdapUserGroupAddon.java
deleted file mode 100644
index 6923be2..0000000
--- a/base/common/src/main/java/org/artifactory/addon/ldapgroup/LdapUserGroupAddon.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.artifactory.addon.ldapgroup;
-
-import org.artifactory.addon.Addon;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.descriptor.security.ldap.group.LdapGroupPopulatorStrategies;
-import org.artifactory.descriptor.security.ldap.group.LdapGroupSetting;
-
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Chen Keinan
- */
-public interface LdapUserGroupAddon extends Addon {
-
-    /**
-     * refresh ldap groups
-     *
-     * @param userName         - refresh by user name
-     * @param ldapGroupSetting - ldap group settings
-     * @param statusHolder     -  import status holder
-     * @return List of Groups found following refresh
-     */
-    Set<LdapUserGroup> refreshLdapGroups(String userName, LdapGroupSetting ldapGroupSetting,
-            BasicStatusHolder statusHolder);
-
-    /**
-     * import ldap groups into artifactory
-     *
-     * @param ldapGroups - ldap groups to be imported
-     * @param strategy   - ldap group strategy
-     * @return number group imported
-     */
-    int importLdapGroupsToArtifactory(List ldapGroups, LdapGroupPopulatorStrategies strategy);
-
-    String[] retrieveUserLdapGroups(String userName, LdapGroupSetting ldapGroupSetting);
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/license/LicenseInstaller.java b/base/common/src/main/java/org/artifactory/addon/license/LicenseInstaller.java
deleted file mode 100644
index 145dd40..0000000
--- a/base/common/src/main/java/org/artifactory/addon/license/LicenseInstaller.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.license;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.ArtifactoryRunningMode;
-import org.artifactory.api.context.ContextHelper;
-
-import static org.artifactory.addon.license.VerificationResult.valid;
-
-/**
- * @author Yoav Luft
- */
-public class LicenseInstaller {
-
-    public static final String NOT_SUPPORT_FOR_SWITCHING_MODE_ON_RUNTIME = "Changing Artifactory mode to offline" +
-            " since Artifactory doesn't allow to switch its mode during run time. Please restart the server";
-    public static final String SUCCESSFULLY_INSTALL = "The license has been successfully installed.";
-
-    private final AddonsManager addonsManager;
-
-    public LicenseInstaller() {
-        this(ContextHelper.get().beanForType(AddonsManager.class));
-    }
-
-    public LicenseInstaller(AddonsManager addonsManager) {
-        this.addonsManager = addonsManager;
-    }
-
-    public interface LicenseInstallCallback {
-        void handleSuccess();
-
-        void switchOffline(String message);
-
-        void handleError(String message);
-    }
-
-    public void install(String licenseKey, LicenseInstallCallback callback) {
-        ArtifactoryRunningMode oldRunningMode = addonsManager.getArtifactoryRunningMode();
-        VerificationResult result;
-        try {
-            result = addonsManager.installLicense(licenseKey);
-        } catch (UnsupportedOperationException e) {
-            callback.handleError("Cannot install license on OSS installation.");
-            return;
-        }
-        ArtifactoryRunningMode newRunningMode = addonsManager.getArtifactoryRunningMode();
-        if (result == valid) {
-            boolean sameMode = ArtifactoryRunningMode.sameMode(oldRunningMode, newRunningMode);
-            if (sameMode) {
-                callback.handleSuccess();
-            } else {
-                String message = SUCCESSFULLY_INSTALL + " " + NOT_SUPPORT_FOR_SWITCHING_MODE_ON_RUNTIME;
-                callback.switchOffline(message);
-            }
-        } else {
-            callback.handleError("License could not be installed due to an error: " + result);
-        }
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/license/LicenseStatus.java b/base/common/src/main/java/org/artifactory/addon/license/LicenseStatus.java
deleted file mode 100644
index ac8506f..0000000
--- a/base/common/src/main/java/org/artifactory/addon/license/LicenseStatus.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.license;
-
-
-/**
- * Dummy object to hold all the different statuses for a license
- *
- * @author Tomer Cohen
- */
-public class LicenseStatus {
-    private final boolean approved;
-    private final boolean unapproved;
-    private final boolean unknown;
-    private final boolean notFound;
-    private final boolean neutral;
-    private final boolean autofind;
-
-    public LicenseStatus(boolean approved, boolean autofind, boolean neutral, boolean notFound, boolean unapproved,
-            boolean unknown) {
-        this.approved = approved;
-        this.autofind = autofind;
-        this.neutral = neutral;
-        this.notFound = notFound;
-        this.unapproved = unapproved;
-        this.unknown = unknown;
-    }
-
-    public boolean isApproved() {
-        return approved;
-    }
-
-    public boolean isAutofind() {
-        return autofind;
-    }
-
-    public boolean isNeutral() {
-        return neutral;
-    }
-
-    public boolean isNotFound() {
-        return notFound;
-    }
-
-    public boolean isUnapproved() {
-        return unapproved;
-    }
-
-    public boolean isUnknown() {
-        return unknown;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/license/LicensesAddon.java b/base/common/src/main/java/org/artifactory/addon/license/LicensesAddon.java
deleted file mode 100644
index 047f7a8..0000000
--- a/base/common/src/main/java/org/artifactory/addon/license/LicensesAddon.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.license;
-
-import com.google.common.collect.Multimap;
-import org.artifactory.addon.Addon;
-import org.artifactory.api.license.LicenseInfo;
-import org.artifactory.api.license.ModuleLicenseModel;
-import org.artifactory.api.license.LicensesInfo;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.descriptor.repo.RealRepoDescriptor;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.common.ExportSettings;
-import org.artifactory.sapi.common.ImportSettings;
-import org.jfrog.build.api.Build;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Tomer Cohen
- */
-public interface LicensesAddon extends Addon {
-
-    String LICENSES_PROP_NAME = "licenses"; //Represents the license's id
-    String LICENSES_PROP_FULL_NAME = PropertySet.ARTIFACTORY_RESERVED_PROP_SET + "." + LICENSES_PROP_NAME;
-    String LICENSES_UNKNOWN_PREFIX = "unknown";
-    String LICENSES_UNKNOWN_PROP_NAME = LICENSES_PROP_NAME + "." + LICENSES_UNKNOWN_PREFIX + ".name"; //Represents the license's name (for unknown licenses)
-    String LICENSES_UNKNOWN_PROP_FULL_NAME = PropertySet.ARTIFACTORY_RESERVED_PROP_SET + "." + LICENSES_UNKNOWN_PROP_NAME;
-
-    /**
-     * Perform license calculation on build artifacts. Depending on the {@link Build#buildAgent} this method will
-     * extract the license from the descriptor and attach it as a property on the dependencies of the modules.
-     *
-     * @param build The build to perform the license calculation on.
-     */
-    void performOnBuildArtifacts(Build build);
-
-    /**
-     * Add the special property set for the license on the local repository (if it does not exist).
-     *
-     * @param descriptor The descriptor that represents the repository for which to add the property set to.
-     */
-    void addPropertySetToRepository(RealRepoDescriptor descriptor);
-
-    /**
-     * Import licenses as part of the full system import.
-     */
-    void importLicenses(ImportSettings settings);
-
-    /**
-     * Export licenses as part of the full system export.
-     */
-    void exportLicenses(ExportSettings exportSettings);
-
-    List<ModuleLicenseModel> findLicensesInRepos(Set<String> repoKeys, LicenseStatus status);
-
-    LicensesInfo getArtifactsLicensesInfo();
-
-    String writeLicenseXML(LicensesInfo licensesInfo);
-
-    void addLicenseInfo(LicenseInfo licensesInfo);
-
-    void updateLicenseInfo(LicenseInfo licensesInfo);
-
-    void deleteLicenseInfo(LicenseInfo licensesInfo);
-
-    LicenseInfo getLicenseByName(String licenseName);
-
-    void reloadLicensesCache();
-
-    Multimap<RepoPath, ModuleLicenseModel> populateLicenseInfoSynchronously(Build build, boolean autoDiscover);
-
-    String generateLicenseCsv(Collection<ModuleLicenseModel> models);
-
-    boolean setLicensePropsOnPath(RepoPath path, Set<LicenseInfo> licenses);
-
-    void setLicensePropsOnPath(RepoPath path, String... licenseNames);
-
-    /**
-     * Used by the UI to scan path for licenses - returns all licenses for path, property-based and
-     * descriptor-retrieved (extracted). Returns a distinct list of licenses (i.e. no duplicates that were found both
-     * in properties and extracted).
-     */
-    Set<LicenseInfo> scanPathForLicenses(RepoPath path);
-
-    /**
-     * Used by the UI to retrieve property-based licenses to show
-     */
-    Set<LicenseInfo> getPathLicensesByProps(RepoPath path);
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/license/VerificationResult.java b/base/common/src/main/java/org/artifactory/addon/license/VerificationResult.java
deleted file mode 100644
index 3bf6c43..0000000
--- a/base/common/src/main/java/org/artifactory/addon/license/VerificationResult.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package org.artifactory.addon.license;
-
-import org.artifactory.common.ArtifactoryHome;
-
-/**
- * Author: gidis
- * Helps to manage and transfer the servers members verification result
- */
-public enum VerificationResult {
-    valid, noLicense, invalidKey, error, duplicateServerIds, duplicateLicense, converting, notSameVersion,
-    runningModeConflict, haConfiguredNotHaLicense;
-
-    public boolean isValid() {
-        return this == valid;
-    }
-
-    public String showMassage() {
-        switch (this) {
-            case valid: {
-                return "Valid.";
-            }
-            case invalidKey: {
-                return "Invalid Artifactory license";
-            }
-            case duplicateServerIds: {
-                return "Stopping Artifactory since duplicate node ids have been found in registry. " +
-                        "If you restarted this server, make sure to wait at least 30 seconds before re-activating it.";
-            }
-            case duplicateLicense: {
-                return "Changing Artifactory mode to offline since duplicate license has been found in registry.";
-            }
-            case runningModeConflict: {
-                if (ArtifactoryHome.get().isHaConfigured()) {
-                    return "Changing Artifactory mode to offline since the local server is running as HA " +
-                            "but found none HA server in registry.";
-                } else {
-                    return "Changing Artifactory mode to offline since the local server is running as PRO/OSS " +
-                            "but found other servers in registry.";
-                }
-            }
-            case converting: {
-                return "Stopping Artifactory start up ,another server running converting process.";
-            }
-            case notSameVersion: {
-                return "Stopping Artifactory start up ,another server with different version has been found.";
-            }
-            case noLicense: {
-                return "Changing Artifactory mode to offline since no license is installed and other servers have " +
-                        "been found in registry. Try to install HA license and then restart the server.";
-            }
-            case haConfiguredNotHaLicense: {
-                return "Changing Artifactory mode to offline since the server is configured as HA but the license " +
-                        "is either not exist or not HA License.";
-            }
-            default: {
-                return "Error occurred during license verification/installation.";
-            }
-        }
-    }
-
-    public static VerificationResult and(VerificationResult... values) {
-        for (VerificationResult value : values) {
-            if (valid != value) {
-                return value;
-            }
-        }
-        return valid;
-    }
-
-    public static VerificationResult or(VerificationResult... values) {
-        VerificationResult result = valid;
-        for (VerificationResult value : values) {
-            if (valid == value) {
-                return valid;
-            } else {
-                result = value;
-            }
-        }
-        return result;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/npm/NpmAddon.java b/base/common/src/main/java/org/artifactory/addon/npm/NpmAddon.java
deleted file mode 100644
index 0166820..0000000
--- a/base/common/src/main/java/org/artifactory/addon/npm/NpmAddon.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.npm;
-
-import org.artifactory.addon.Addon;
-import org.artifactory.api.repo.Async;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author Shay Yaakov
- */
-public interface NpmAddon extends Addon {
-
-    void addNpmPackage(FileInfo info);
-
-    @Async(delayUntilAfterCommit = true)
-    void handleAddAfterCommit(FileInfo info);
-
-    void removeNpmPackage(FileInfo info);
-
-    @Async
-    void reindexAsync(String repoKey);
-
-    NpmMetadataInfo getNpmMetaDataInfo(RepoPath repoPath);
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/addon/npm/NpmDependency.java b/base/common/src/main/java/org/artifactory/addon/npm/NpmDependency.java
deleted file mode 100644
index d91aad1..0000000
--- a/base/common/src/main/java/org/artifactory/addon/npm/NpmDependency.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.artifactory.addon.npm;
-
-/**
- * @author Chen Keinan
- */
-public class NpmDependency {
-
-    private String name;
-    private String version;
-
-    public NpmDependency(String key, String value) {
-        this.name = key;
-        this.version = value;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/npm/NpmInfo.java b/base/common/src/main/java/org/artifactory/addon/npm/NpmInfo.java
deleted file mode 100644
index f6f92fe..0000000
--- a/base/common/src/main/java/org/artifactory/addon/npm/NpmInfo.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.artifactory.addon.npm;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * @author Chen Keinan
- */
-public class NpmInfo {
-
-    private static final Pattern GIT_URL = Pattern.compile(
-            "(?:https?:\\/\\/|git(?::\\/\\/|@))(gist.github.com|github.com)[:\\/](.*?)(?:.git)?$");
-
-    private String name;
-    private String version;
-    private String license;
-    private String keywords;
-    private String description;
-    private String repository;
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public String getLicense() {
-        return license;
-    }
-
-    public void setLicense(String license) {
-        this.license = license;
-    }
-
-    public String getKeywords() {
-        return keywords;
-    }
-
-    public void setKeywords(String keywords) {
-        this.keywords = keywords;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public String getRepository() {
-        return repository;
-    }
-
-    public void setRepository(String repository) {
-        if (repository != null) {
-            Matcher matcher = GIT_URL.matcher(repository);
-            if (matcher.matches()) {
-                repository = "https://" + matcher.group(1) + "/" + matcher.group(2);
-            }
-            this.repository = repository;
-        }
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/npm/NpmMetadataInfo.java b/base/common/src/main/java/org/artifactory/addon/npm/NpmMetadataInfo.java
deleted file mode 100644
index 5957ca3..0000000
--- a/base/common/src/main/java/org/artifactory/addon/npm/NpmMetadataInfo.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.artifactory.addon.npm;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class NpmMetadataInfo {
-
-    private NpmInfo npmInfo;
-    private List<NpmDependency> npmDependencies;
-
-    public NpmMetadataInfo(NpmInfo npmInfo, List<NpmDependency> dependencies) {
-        this.npmInfo = npmInfo;
-        this.npmDependencies = dependencies;
-    }
-
-    public NpmInfo getNpmInfo() {
-        return npmInfo;
-    }
-
-    public void setNpmInfo(NpmInfo npmInfo) {
-        this.npmInfo = npmInfo;
-    }
-
-    public List<NpmDependency> getNpmDependencies() {
-        return npmDependencies;
-    }
-
-    public void setNpmDependencies(List<NpmDependency> npmDependencies) {
-        this.npmDependencies = npmDependencies;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/nuget/NuGetAuthUtil.java b/base/common/src/main/java/org/artifactory/addon/nuget/NuGetAuthUtil.java
deleted file mode 100644
index fd6af38..0000000
--- a/base/common/src/main/java/org/artifactory/addon/nuget/NuGetAuthUtil.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.artifactory.addon.nuget;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.util.PathUtils;
-
-import java.util.List;
-
-/**
- * Shared authentication util for the NuGet Resource and the NuGet anonymous auth interceptor.
- *
- * @author Dan Feldman
- */
-public class NuGetAuthUtil {
-
-    public static boolean repoAllowsAnonymousRootGet(String repoKey) {
-        boolean allow = false;
-        String allowRootGet = ConstantValues.nuGetAllowRootGetWithAnon.getString();
-        if ("true".equalsIgnoreCase(allowRootGet) || "all".equalsIgnoreCase(allowRootGet)) {
-            allow = true;
-        } else {
-            List<String> repoKeys = PathUtils.delimitedListToStringList(allowRootGet, ",");
-            for (String key : repoKeys) {
-                if (key.contains("*")) {
-                    if (repoKey.matches(key)) {
-                        allow = true;
-                    }
-                } else if (key.equals(repoKey)) {
-                    allow = true;
-                }
-            }
-        }
-        return allow && !forceAuthIsNeededForRepo(repoKey);
-    }
-
-    public static boolean forceAuthIsNeededForRepo(String repoKey) {
-        //Check for nuget force auth on repo descriptor
-        boolean forceAuth = false;
-        //Need both due to RTFACT-4891
-        RepositoryService repoService = ContextHelper.get().beanForType(RepositoryService.class);
-        RepoDescriptor descriptor = repoService.repoDescriptorByKey(repoKey);
-        RepoDescriptor virtual = repoService.virtualRepoDescriptorByKey(repoKey);
-        if (descriptor != null) {
-            forceAuth = descriptor.isForceNugetAuthentication();
-        } else if (virtual != null) {
-            forceAuth = virtual.isForceNugetAuthentication();
-        }
-
-        //Fallback to force auth system property if not set on descriptor
-        if (!forceAuth && ConstantValues.nuGetRequireAuthentication.isSet()) {
-            String requireAuth = ConstantValues.nuGetRequireAuthentication.getString();
-            if ("true".equalsIgnoreCase(requireAuth) || "all".equalsIgnoreCase(requireAuth)) {
-                forceAuth = true;
-            } else {
-                List<String> repoKeys = PathUtils.delimitedListToStringList(requireAuth, ",");
-                for (String key : repoKeys) {
-                    if (key.contains("*")) {
-                        if (repoKey.matches(key)) {
-                            forceAuth = true;
-                            break;
-                        }
-                    } else if (key.equals(repoKey)) {
-                        forceAuth = true;
-                        break;
-                    }
-                }
-            }
-        }
-        return forceAuth;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/nuget/UiNuGetAddon.java b/base/common/src/main/java/org/artifactory/addon/nuget/UiNuGetAddon.java
deleted file mode 100644
index b1a0ef7..0000000
--- a/base/common/src/main/java/org/artifactory/addon/nuget/UiNuGetAddon.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.artifactory.addon.nuget;
-
-import org.artifactory.addon.Addon;
-import org.artifactory.nuget.NuMetaData;
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author Chen Keinan
- */
-public interface UiNuGetAddon extends Addon {
-
-    NuMetaData getNutSpecMetaData(RepoPath nuGetRepoPath);
-
-    void requestAsyncReindexNuPkgs(String repoKey);
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/addon/oauth/OAuthHandler.java b/base/common/src/main/java/org/artifactory/addon/oauth/OAuthHandler.java
deleted file mode 100644
index ef98b71..0000000
--- a/base/common/src/main/java/org/artifactory/addon/oauth/OAuthHandler.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.addon.oauth;
-
-import org.artifactory.security.props.auth.model.OauthModel;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.List;
-
-/**
- * @author Travis Foster
- */
-public interface OAuthHandler {
-
-    /**
-     * Handle identityProvider login response.
-     */
-    Object handleLoginResponse(HttpServletRequest request);
-
-    /**
-     * Handle login event from Artifactory login link.
-     * Create login request and redirect to the OAuth login page.
-     */
-    List<OAuthLoginUrl> getActiveProviders(HttpServletRequest request);
-
-    /**
-     * Handle login from external command line tool.
-     * Use basic auth to log in and return an access token.
-     */
-    Object handleLogin(String method, String name, String path, HttpServletRequest request);
-
-    /**
-     * Get the name of the provider specified for NPM logins (if exists)
-     */
-    String getNpmLoginHandler();
-
-
-    /**
-     * use rest api to get user active token
-     *
-     * @param providerName - provider name (git enterprise and etc)
-     * @param userName     - user name
-     * @param basicAuth    - basic authorization
-     * @return Oauth model with token
-     */
-    OauthModel getCreateToken(String providerName, String userName, String basicAuth);
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/oauth/OAuthLoginUrl.java b/base/common/src/main/java/org/artifactory/addon/oauth/OAuthLoginUrl.java
deleted file mode 100644
index b880d03..0000000
--- a/base/common/src/main/java/org/artifactory/addon/oauth/OAuthLoginUrl.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.artifactory.addon.oauth;
-
-/**
- * @author Gidi Shabat
- */
-public class OAuthLoginUrl {
-    private String name;
-    private String url;
-    private OAuthProvidersTypeEnum type;
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    public OAuthProvidersTypeEnum getType() {
-        return type;
-    }
-
-    public void setType(OAuthProvidersTypeEnum type) {
-        this.type = type;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/oauth/OAuthProvidersTypeEnum.java b/base/common/src/main/java/org/artifactory/addon/oauth/OAuthProvidersTypeEnum.java
deleted file mode 100644
index eeeec72..0000000
--- a/base/common/src/main/java/org/artifactory/addon/oauth/OAuthProvidersTypeEnum.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package org.artifactory.addon.oauth;
-
-/**
- * @author Gidi Shabat
- */
-public enum OAuthProvidersTypeEnum {
-    github,openId,wordpress,facebook,linkedIn,google,cloudfoundry
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/oauth/OAuthSsoAddon.java b/base/common/src/main/java/org/artifactory/addon/oauth/OAuthSsoAddon.java
deleted file mode 100644
index 2209ced..0000000
--- a/base/common/src/main/java/org/artifactory/addon/oauth/OAuthSsoAddon.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.artifactory.addon.oauth;
-
-import org.artifactory.addon.Addon;
-
-/**
- * @author Travis Foster
- */
-public interface OAuthSsoAddon extends Addon {
-    boolean isActive();
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/opkg/HaOpkgMessage.java b/base/common/src/main/java/org/artifactory/addon/opkg/HaOpkgMessage.java
deleted file mode 100644
index 2d455f5..0000000
--- a/base/common/src/main/java/org/artifactory/addon/opkg/HaOpkgMessage.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.artifactory.addon.opkg;
-
-import org.artifactory.addon.ha.message.HaMessage;
-import org.artifactory.repo.RepoPath;
-
-import java.util.Collection;
-import java.util.Set;
-
-/**
- * @author Dan Feldman
- */
-public class HaOpkgMessage implements HaMessage {
-
-    public static final String HA_FAILED_MSG = "Failed to send Opkg calculation message to server";
-
-    private Set<OpkgCalculationEvent> newEvents;
-    private Collection<RepoPath> propertyWriterEntries;
-    private boolean async;
-
-    public HaOpkgMessage(Set<OpkgCalculationEvent> newEvents, Collection<RepoPath> propertyWriterEntries, boolean async) {
-        this.newEvents = newEvents;
-        this.propertyWriterEntries = propertyWriterEntries;
-        this.async = async;
-    }
-
-    public Set<OpkgCalculationEvent> getNewEvents() {
-        return newEvents;
-    }
-
-    public Collection<RepoPath> getPropertyWriterEntries() {
-        return propertyWriterEntries;
-    }
-
-    public boolean isAsync() {
-        return async;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/opkg/OpkgAddon.java b/base/common/src/main/java/org/artifactory/addon/opkg/OpkgAddon.java
deleted file mode 100644
index 9434088..0000000
--- a/base/common/src/main/java/org/artifactory/addon/opkg/OpkgAddon.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.artifactory.addon.opkg;
-
-import org.artifactory.addon.Addon;
-import org.artifactory.repo.RepoPath;
-
-import javax.annotation.Nullable;
-import java.util.Collection;
-import java.util.Set;
-
-/**
- * @author Dan Feldman
- */
-public interface OpkgAddon extends Addon {
-
-    void recalculateEntireRepo(String repoKey, String password, boolean delayed, boolean writeProps);
-
-    void calculateMetadata(Set<OpkgCalculationEvent> calculationRequests, @Nullable Collection<RepoPath> propertyWriterEntries, boolean delayed);
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/opkg/OpkgCalculationEvent.java b/base/common/src/main/java/org/artifactory/addon/opkg/OpkgCalculationEvent.java
deleted file mode 100644
index f0682ba..0000000
--- a/base/common/src/main/java/org/artifactory/addon/opkg/OpkgCalculationEvent.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.opkg;
-
-
-import org.artifactory.addon.dpkgcommon.DpkgCalculationEvent;
-
-import java.io.Serializable;
-
-/**
- * @author Noam Y. Tenne
- * @author Dan Feldman
- */
-//TODO [by dan]: As we still don't know how an automatic layout use case looks like (or if we're going to implement)
-//TODO: this event is used only with the trivial use case, when implementing auto move the properties from the Debian
-//TODO: event to the shared DpkgCalculationEvent class.
-public class OpkgCalculationEvent extends DpkgCalculationEvent implements Comparable<OpkgCalculationEvent>, Serializable {
-
-    private final String path;
-
-    public OpkgCalculationEvent(String repoKey, String path, boolean isIndexEntireRepo) {
-        super(repoKey, isIndexEntireRepo);
-        this.path = path;
-    }
-
-    public static OpkgCalculationEvent indexEntireRepoEvent(String repoKey) {
-        return new OpkgCalculationEvent(repoKey, "", true);
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    @Override
-    public int compareTo(OpkgCalculationEvent o) {
-        int i = repoKey.compareTo(o.repoKey);
-        if (i != 0) {
-            return i;
-        }
-        i = Boolean.compare(isIndexEntireRepo, o.isIndexEntireRepo);
-        if(i != 0) {
-            return i;
-        }
-        if (path != null) {
-            i = path.compareTo(o.path);
-            if (i != 0) {
-                return i;
-            }
-        }
-        return i;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof OpkgCalculationEvent)) {
-            return false;
-        }
-        OpkgCalculationEvent that = (OpkgCalculationEvent) o;
-        if(!super.equals(o)) {
-            return false;
-        }
-        if (isIndexEntireRepo != that.isIndexEntireRepo()) {
-            return false;
-        }
-        return !(path != null ? !path.equals(that.getPath()) : that.getPath() != null);
-    }
-
-    @Override
-    public int hashCode() {
-        int result = super.hashCode();
-        result = 31 * result + (path != null ? path.hashCode() : 0);
-        result = 31 * result + (isIndexEntireRepo ? 1 : 0);
-        return result;
-    }
-
-    @Override
-    public String toString() {
-        return "OpkgCalculationEvent{" +
-                "repoKey='" + repoKey + '\'' +
-                "path='" + path + '\'' +
-                "timestamp='" + timestamp + '\'' +
-                '}';
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/p2/P2Addon.java b/base/common/src/main/java/org/artifactory/addon/p2/P2Addon.java
deleted file mode 100644
index bc6757e..0000000
--- a/base/common/src/main/java/org/artifactory/addon/p2/P2Addon.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.p2;
-
-import org.artifactory.addon.Addon;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Web interface of P2 addon.
- *
- * @author Yossi Shaul
- * @author Dan Feldman
- */
-public interface P2Addon extends Addon {
-
-    /**
-     * Verifies all the remotes repositories and returns a list to be presented in the UI
-     *
-     * @return A list of remote repositories that are added/created/verified based on the virtual repo configuration.
-     */
-    List<P2Repo> verifyRemoteRepositories(MutableCentralConfigDescriptor currentDescriptor,
-            VirtualRepoDescriptor virtualRepo, @Nullable List<P2Repo> currentList, @Nullable List<P2Repo> requestedList,
-            @Nonnull Map<String, List<String>> subCompositeUrls, MutableStatusHolder statusHolder);
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/p2/P2Repo.java b/base/common/src/main/java/org/artifactory/addon/p2/P2Repo.java
deleted file mode 100644
index f64248f..0000000
--- a/base/common/src/main/java/org/artifactory/addon/p2/P2Repo.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.p2;
-
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.codehaus.jackson.annotate.JsonIgnore;
-
-import java.io.Serializable;
-
-/**
- * Model of a local or remote repository for the UI
- *
- * @author Shay Yaakov
- */
-public class P2Repo implements Serializable {
-
-    private String repoKey;
-
-    private String repoUrl;
-
-    // TODO: [by dan] if this doesn't work when this object is nested in P2TypeSpecific need to duplicate model in rest-ui module
-    @JsonIgnore
-    private RepoDescriptor descriptor;
-
-    public P2Repo() {
-
-    }
-
-    public P2Repo(RepoDescriptor descriptor, String repoKey, String repoUrl) {
-        this.descriptor = descriptor;
-        this.repoKey = repoKey;
-        this.repoUrl = repoUrl;
-    }
-
-    @JsonIgnore
-    public boolean isRemote() {
-        return descriptor instanceof RemoteRepoDescriptor;
-    }
-
-    @JsonIgnore
-    public RepoDescriptor getDescriptor() {
-        return descriptor;
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    public String getRepoUrl() {
-        return repoUrl;
-    }
-
-    public void setRepoUrl(String repoUrl) {
-        this.repoUrl = repoUrl;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/plugin/PluginAction.java b/base/common/src/main/java/org/artifactory/addon/plugin/PluginAction.java
deleted file mode 100644
index 4ab5d65..0000000
--- a/base/common/src/main/java/org/artifactory/addon/plugin/PluginAction.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin;
-
-import java.io.Serializable;
-
-
-public interface PluginAction extends Serializable {
-
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/addon/plugin/PluginsAddon.java b/base/common/src/main/java/org/artifactory/addon/plugin/PluginsAddon.java
deleted file mode 100644
index a72c24c..0000000
--- a/base/common/src/main/java/org/artifactory/addon/plugin/PluginsAddon.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin;
-
-import org.artifactory.addon.Addon;
-import org.artifactory.api.config.ImportableExportable;
-import org.artifactory.build.staging.BuildStagingStrategy;
-import org.artifactory.request.Request;
-import org.artifactory.resource.ResourceStreamHandle;
-
-import javax.annotation.Nullable;
-import java.io.Reader;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Yoav Landman
- * @date Oct 28, 2008
- */
-public interface PluginsAddon extends Addon, ImportableExportable {
-    String PLUGIN_STATUS_LOADED = "Loaded";
-    String PLUGIN_STATUS_ERROR = "Error";
-
-    <C> void execPluginActions(Class<? extends PluginAction> type, C context, Object... args);
-
-    ResponseCtx execute(String executionName, String method, Map params, @Nullable ResourceStreamHandle body,
-            boolean async);
-
-    BuildStagingStrategy getStagingStrategy(String strategyName, String buildName, Map params);
-
-    Map<String, List<PluginInfo>> getPluginInfo(@Nullable String pluginType);
-
-    ResponseCtx promote(String promotionName, String buildName, String buildNumber, Map params);
-
-    ResponseCtx deployPlugin(Reader pluginContent, String scriptName);
-
-    /**
-     * Reloads user plugins. Nothing is reloaded if there's no plugin present or no plugin modified since the last reload.
-     *
-     * @return Response context with status for various reloaded user plugins.
-     */
-    ResponseCtx reloadPlugins();
-
-    void executeAdditiveRealmPlugins(Request servletRequest);
-
-    /**
-     * Used by the UI to get info about all plugins in the plugin directory (loaded and otherwise).
-     */
-    Map<String, String> getPluginsStatus();
-
-    /**
-     *  Used by the Support Bundle Service to append plugins info.
-     */
-    String getPluginsInfoSupportBundleDump();
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/plugin/RemoteRequestCtx.java b/base/common/src/main/java/org/artifactory/addon/plugin/RemoteRequestCtx.java
deleted file mode 100644
index d1b5fb5..0000000
--- a/base/common/src/main/java/org/artifactory/addon/plugin/RemoteRequestCtx.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.artifactory.addon.plugin;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author Gidi Shabat
- */
-public class RemoteRequestCtx extends ResourceStreamCtx {
-
-    private Map<String, String> headers = new HashMap<>();
-
-    public Map<String, String> getHeaders() {return headers;}
-
-    public void setHeaders(Map<String, String> headers) {
-        this.headers = headers;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/plugin/ResourceStreamCtx.java b/base/common/src/main/java/org/artifactory/addon/plugin/ResourceStreamCtx.java
deleted file mode 100644
index 548f951..0000000
--- a/base/common/src/main/java/org/artifactory/addon/plugin/ResourceStreamCtx.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin;
-
-import java.io.InputStream;
-
-public class ResourceStreamCtx {
-
-    private InputStream inputStream;
-    private long size = -1;
-
-    public InputStream getInputStream() {
-        return inputStream;
-    }
-
-    public long getSize() {
-        return size;
-    }
-
-    public void setInputStream(InputStream inputStream) {
-        this.inputStream = inputStream;
-    }
-
-    public void setSize(long size) {
-        this.size = size;
-    }
-
-    public boolean hasSize() {
-        return size >= 0;
-    }
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/addon/plugin/ResponseCtx.java b/base/common/src/main/java/org/artifactory/addon/plugin/ResponseCtx.java
deleted file mode 100644
index 3b81a31..0000000
--- a/base/common/src/main/java/org/artifactory/addon/plugin/ResponseCtx.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class ResponseCtx extends ResourceStreamCtx {
-
-    public final static int UNSET_STATUS = -1;
-
-    private int status = UNSET_STATUS;
-    private String message;
-    private Map<String, String> headers = new HashMap<>();
-
-    public int getStatus() {
-        return status;
-    }
-
-    public String getMessage() {
-        return message;
-    }
-
-    public Map<String, String> getHeaders() {
-        return headers;
-    }
-
-    public void setStatus(int status) {
-        this.status = status;
-    }
-
-    public void setMessage(String message) {
-        this.message = message;
-    }
-
-    public void setHeaders(Map<String, String> headers) {
-        this.headers = headers;
-    }
-
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/addon/properties/ArtifactPropertiesAddon.java b/base/common/src/main/java/org/artifactory/addon/properties/ArtifactPropertiesAddon.java
deleted file mode 100644
index 7156679..0000000
--- a/base/common/src/main/java/org/artifactory/addon/properties/ArtifactPropertiesAddon.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.artifactory.addon.properties;
-
-import org.artifactory.addon.Addon;
-import org.artifactory.api.search.property.PropertySearchControls;
-import org.artifactory.repo.RepoPath;
-
-import java.util.ArrayList;
-
-/**
- * @author Chen Keinan
- */
-public interface ArtifactPropertiesAddon extends Addon {
-
-    void addPropertySha256RecursivelyMultiple(RepoPath repoPath);
-
-    /**
-     * update property control search
-     *
-     * @return property control search
-     */
-    PropertySearchControls getSha256PropertyControlSearch(String sha256, ArrayList<String> reposToSearch);
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/pypi/PypiAddon.java b/base/common/src/main/java/org/artifactory/addon/pypi/PypiAddon.java
deleted file mode 100644
index aef2151..0000000
--- a/base/common/src/main/java/org/artifactory/addon/pypi/PypiAddon.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.pypi;
-
-import org.artifactory.addon.Addon;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author Yoav Luft
- */
-public interface PypiAddon extends Addon {
-
-    String PROPERTIES_PREFIX = "pypi";
-    String NAME_PROPERTY = PROPERTIES_PREFIX + ".name";
-    String VERSION_PROPERTY = PROPERTIES_PREFIX + ".version";
-
-    void reindex(LocalRepoDescriptor descriptor, boolean async);
-
-    PypiPkgMetadata getPypiMetadata(RepoPath packagePath);
-
-    boolean isPypiFile(FileInfo fileInfo);
-
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/pypi/PypiPkgInfo.java b/base/common/src/main/java/org/artifactory/addon/pypi/PypiPkgInfo.java
deleted file mode 100644
index c6c30d2..0000000
--- a/base/common/src/main/java/org/artifactory/addon/pypi/PypiPkgInfo.java
+++ /dev/null
@@ -1,126 +0,0 @@
-package org.artifactory.addon.pypi;
-
-import javax.annotation.Nullable;
-
-/**
- * @author Chen Keinan
- */
-public class PypiPkgInfo {
-
-    private String name;
-    private String version;
-    private String platform;
-    private String supportedPlatform;
-    private String summary;
-    @Nullable
-    private String description;
-    @Nullable
-    private String keywords;
-    @Nullable
-    private String homepage;
-    private String downloadUrl;
-    @Nullable
-    private String author;
-    private String authorEmail;
-    private String license;
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public String getPlatform() {
-        return platform;
-    }
-
-    public void setPlatform(String platform) {
-        this.platform = platform;
-    }
-
-    public String getSupportedPlatform() {
-        return supportedPlatform;
-    }
-
-    public void setSupportedPlatform(String supportedPlatform) {
-        this.supportedPlatform = supportedPlatform;
-    }
-
-    public String getSummary() {
-        return summary;
-    }
-
-    public void setSummary(String summary) {
-        this.summary = summary;
-    }
-
-    @Nullable
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(@Nullable String description) {
-        this.description = description;
-    }
-
-    @Nullable
-    public String getKeywords() {
-        return keywords;
-    }
-
-    public void setKeywords(@Nullable String keywords) {
-        this.keywords = keywords;
-    }
-
-    @Nullable
-    public String getHomepage() {
-        return homepage;
-    }
-
-    public void setHomepage(@Nullable String homepage) {
-        this.homepage = homepage;
-    }
-
-    public String getDownloadUrl() {
-        return downloadUrl;
-    }
-
-    public void setDownloadUrl(String downloadUrl) {
-        this.downloadUrl = downloadUrl;
-    }
-
-    @Nullable
-    public String getAuthor() {
-        return author;
-    }
-
-    public void setAuthor(@Nullable String author) {
-        this.author = author;
-    }
-
-    public String getAuthorEmail() {
-        return authorEmail;
-    }
-
-    public void setAuthorEmail(String authorEmail) {
-        this.authorEmail = authorEmail;
-    }
-
-    public String getLicense() {
-        return license;
-    }
-
-    public void setLicense(String license) {
-        this.license = license;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/pypi/PypiPkgMetadata.java b/base/common/src/main/java/org/artifactory/addon/pypi/PypiPkgMetadata.java
deleted file mode 100644
index b3358df..0000000
--- a/base/common/src/main/java/org/artifactory/addon/pypi/PypiPkgMetadata.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package org.artifactory.addon.pypi;
-
-import javax.annotation.Nullable;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class PypiPkgMetadata {
-
-    private PypiPkgInfo pypiPkgInfo;
-    @Nullable
-    public List<String> categories;
-    @Nullable
-    public List<String> requires;
-    @Nullable
-    public List<String> provides;
-    @Nullable
-    public List<String> obsoletes;
-
-    public PypiPkgInfo getPypiPkgInfo() {
-        return pypiPkgInfo;
-    }
-
-    public void setPypiPkgInfo(PypiPkgInfo pypiPkgInfo) {
-        this.pypiPkgInfo = pypiPkgInfo;
-    }
-
-    @Nullable
-    public List<String> getCategories() {
-        return categories;
-    }
-
-    public void setCategories(@Nullable List<String> categories) {
-        this.categories = categories;
-    }
-
-    @Nullable
-    public List<String> getRequires() {
-        return requires;
-    }
-
-    public void setRequires(@Nullable List<String> requires) {
-        this.requires = requires;
-    }
-
-    @Nullable
-    public List<String> getProvides() {
-        return provides;
-    }
-
-    public void setProvides(@Nullable List<String> provides) {
-        this.provides = provides;
-    }
-
-    @Nullable
-    public List<String> getObsoletes() {
-        return obsoletes;
-    }
-
-    public void setObsoletes(@Nullable List<String> obsoletes) {
-        this.obsoletes = obsoletes;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/replication/LocalReplicationSettings.java b/base/common/src/main/java/org/artifactory/addon/replication/LocalReplicationSettings.java
deleted file mode 100644
index 87fa0a5..0000000
--- a/base/common/src/main/java/org/artifactory/addon/replication/LocalReplicationSettings.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.replication;
-
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author Noam Y. Tenne
- */
-public class LocalReplicationSettings extends ReplicationBaseSettings {
-
-    private final String username;
-    private final String password;
-    private final ProxyDescriptor proxyDescriptor;
-
-    public LocalReplicationSettings(LocalReplicationDescriptor descriptor) {
-        this(descriptor.getRepoPath(), descriptor.getUrl(), descriptor.getProxy(), descriptor.getSocketTimeoutMillis(),
-                descriptor.getUsername(), descriptor.getPassword(), descriptor.isSyncDeletes(),
-                descriptor.isSyncProperties());
-    }
-
-    /**
-     * <B>NOTE<B>: Try to refrain from using this constructor directly and use the builder instead
-     */
-    public LocalReplicationSettings(RepoPath repoPath, String url, ProxyDescriptor proxyDescriptor,
-            int socketTimeoutMillis, String username, String password, boolean deleteExisting,
-            boolean includeProperties) {
-        super(repoPath, deleteExisting, includeProperties, url, socketTimeoutMillis);
-        this.proxyDescriptor = proxyDescriptor;
-        this.username = username;
-        this.password = password;
-    }
-
-    public ProxyDescriptor getProxyDescriptor() {
-        return proxyDescriptor;
-    }
-
-    public String getUsername() {
-        return username;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof LocalReplicationSettings)) {
-            return false;
-        }
-        if (!super.equals(o)) {
-            return false;
-        }
-
-        LocalReplicationSettings that = (LocalReplicationSettings) o;
-
-        if (password != null ? !password.equals(that.password) : that.password != null) {
-            return false;
-        }
-        if (proxyDescriptor != null ? !proxyDescriptor.equals(that.proxyDescriptor) : that.proxyDescriptor != null) {
-            return false;
-        }
-        if (!username.equals(that.username)) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = super.hashCode();
-        result = 31 * result + username.hashCode();
-        result = 31 * result + (password != null ? password.hashCode() : 0);
-        result = 31 * result + (proxyDescriptor != null ? proxyDescriptor.hashCode() : 0);
-        return result;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/replication/LocalReplicationSettingsBuilder.java b/base/common/src/main/java/org/artifactory/addon/replication/LocalReplicationSettingsBuilder.java
deleted file mode 100644
index 6e7a84c..0000000
--- a/base/common/src/main/java/org/artifactory/addon/replication/LocalReplicationSettingsBuilder.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.replication;
-
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author Noam Y. Tenne
- */
-public class LocalReplicationSettingsBuilder {
-
-    private final RepoPath repoPath;
-    private final String url;
-    private ProxyDescriptor proxyDescriptor;
-    private int socketTimeoutMillis;
-    private String username;
-    private String password;
-    private boolean deleteExisting = false;
-    private boolean includeProperties = false;
-
-    public LocalReplicationSettingsBuilder(RepoPath repoPath, String url) {
-        this.repoPath = repoPath;
-        this.url = url;
-    }
-
-    public LocalReplicationSettingsBuilder proxyDescriptor(ProxyDescriptor proxyDescriptor) {
-        this.proxyDescriptor = proxyDescriptor;
-        return this;
-    }
-
-    public LocalReplicationSettingsBuilder socketTimeoutMillis(int socketTimeoutMillis) {
-        this.socketTimeoutMillis = socketTimeoutMillis;
-        return this;
-    }
-
-    public LocalReplicationSettingsBuilder username(String username) {
-        this.username = username;
-        return this;
-    }
-
-    public LocalReplicationSettingsBuilder password(String password) {
-        this.password = password;
-        return this;
-    }
-
-    public LocalReplicationSettingsBuilder deleteExisting(boolean deleteExisting) {
-        this.deleteExisting = deleteExisting;
-        return this;
-    }
-
-    public LocalReplicationSettingsBuilder includeProperties(boolean includeProperties) {
-        this.includeProperties = includeProperties;
-        return this;
-    }
-
-    public LocalReplicationSettings build() {
-        return new LocalReplicationSettings(repoPath, url, proxyDescriptor, socketTimeoutMillis, username, password,
-                deleteExisting, includeProperties);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/replication/RemoteReplicationSettings.java b/base/common/src/main/java/org/artifactory/addon/replication/RemoteReplicationSettings.java
deleted file mode 100644
index 87faee3..0000000
--- a/base/common/src/main/java/org/artifactory/addon/replication/RemoteReplicationSettings.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.replication;
-
-import org.artifactory.repo.RepoPath;
-
-import java.io.Writer;
-
-/**
- * @author Noam Y. Tenne
- */
-public class RemoteReplicationSettings extends ReplicationBaseSettings {
-
-    private final boolean progress;
-    private final ReplicationAddon.Overwrite overwrite;
-
-    /**
-     * Never used ?!?!
-     */
-    @Deprecated
-    private final int mark;
-
-    /**
-     * Never used ?!?!
-     */
-    @Deprecated
-    private final Writer responseWriter;
-
-    /**
-     * <B>NOTE<B>: Try to refrain from using this constructor directly and use the builder instead
-     */
-    protected RemoteReplicationSettings(RepoPath repoPath, boolean progress, int mark, boolean deleteExisting,
-            boolean includeProperties, ReplicationAddon.Overwrite overwrite, Writer responseWriter,
-            String url, int socketTimeoutMillis) {
-        super(repoPath, deleteExisting, includeProperties, url, socketTimeoutMillis);
-        this.progress = progress;
-        this.mark = mark;
-        this.overwrite = overwrite;
-        this.responseWriter = responseWriter;
-    }
-
-    public boolean isProgress() {
-        return progress;
-    }
-
-    /**
-     * Never used ?!?!
-     */
-    @Deprecated
-    public int getMark() {
-        return mark;
-    }
-
-    public ReplicationAddon.Overwrite getOverwrite() {
-        return overwrite;
-    }
-
-    /**
-     * Never used ?!?!
-     */
-    @Deprecated
-    public Writer getResponseWriter() {
-        return responseWriter;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof RemoteReplicationSettings)) {
-            return false;
-        }
-        if (!super.equals(o)) {
-            return false;
-        }
-
-        RemoteReplicationSettings that = (RemoteReplicationSettings) o;
-
-        if (mark != that.mark) {
-            return false;
-        }
-        if (progress != that.progress) {
-            return false;
-        }
-        if (overwrite != that.overwrite) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = super.hashCode();
-        result = 31 * result + (progress ? 1 : 0);
-        result = 31 * result + mark;
-        result = 31 * result + (overwrite != null ? overwrite.hashCode() : 0);
-        return result;
-    }
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/addon/replication/RemoteReplicationSettingsBuilder.java b/base/common/src/main/java/org/artifactory/addon/replication/RemoteReplicationSettingsBuilder.java
deleted file mode 100644
index 7d9df8b..0000000
--- a/base/common/src/main/java/org/artifactory/addon/replication/RemoteReplicationSettingsBuilder.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.replication;
-
-import org.artifactory.repo.RepoPath;
-
-import java.io.Writer;
-
-/**
- * @author Noam Y. Tenne
- */
-public class RemoteReplicationSettingsBuilder {
-
-    private final RepoPath repoPath;
-    private boolean progress = false;
-    private String url;
-    private int socketTimeoutMillis = 15000;
-    private boolean deleteExisting = false;
-    private boolean includeProperties = false;
-    private ReplicationAddon.Overwrite overwrite = ReplicationAddon.Overwrite.force;
-
-    /**
-     * Never used ?!?!
-     */
-    @Deprecated
-    private int mark = 0;
-
-    /**
-     * Never used ?!?!
-     */
-    @Deprecated
-    private Writer responseWriter;
-
-    public RemoteReplicationSettingsBuilder(RepoPath repoPath) {
-        this.repoPath = repoPath;
-    }
-
-    /**
-     * Never used ?!?!
-     */
-    @Deprecated
-    public RemoteReplicationSettingsBuilder responseWriter(Writer responseWriter) {
-        this.responseWriter = responseWriter;
-        return this;
-    }
-
-    public RemoteReplicationSettingsBuilder progress(boolean progress) {
-        this.progress = progress;
-        return this;
-    }
-
-    /**
-     * Never used ?!?!
-     */
-    @Deprecated
-    public RemoteReplicationSettingsBuilder mark(int mark) {
-        this.mark = mark;
-        return this;
-    }
-
-    public RemoteReplicationSettingsBuilder deleteExisting(boolean deleteExisting) {
-        this.deleteExisting = deleteExisting;
-        return this;
-    }
-
-    public RemoteReplicationSettingsBuilder includeProperties(boolean includeProperties) {
-        this.includeProperties = includeProperties;
-        return this;
-    }
-
-    public RemoteReplicationSettingsBuilder overwrite(ReplicationAddon.Overwrite overwrite) {
-        this.overwrite = overwrite;
-        return this;
-    }
-
-    public RemoteReplicationSettingsBuilder url(String url) {
-        this.url = url;
-        return this;
-    }
-
-    public RemoteReplicationSettingsBuilder timeout(int socketTimeoutMillis) {
-        this.socketTimeoutMillis = socketTimeoutMillis;
-        return this;
-    }
-
-    public RemoteReplicationSettings build() {
-        if (repoPath == null) {
-            throw new IllegalArgumentException("Repo path cannot be null.");
-        }
-        return new RemoteReplicationSettings(repoPath, progress, mark, deleteExisting, includeProperties, overwrite,
-                responseWriter, url, socketTimeoutMillis);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/replication/ReplicationAddon.java b/base/common/src/main/java/org/artifactory/addon/replication/ReplicationAddon.java
deleted file mode 100644
index 3b79382..0000000
--- a/base/common/src/main/java/org/artifactory/addon/replication/ReplicationAddon.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.replication;
-
-import org.artifactory.addon.Addon;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.rest.replication.ReplicationStatus;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.replication.RemoteReplicationDescriptor;
-import org.artifactory.descriptor.replication.ReplicationBaseDescriptor;
-import org.artifactory.descriptor.repo.RealRepoDescriptor;
-import org.artifactory.repo.RepoPath;
-import java.io.IOException;
-import java.util.List;
-
-/**
- * @author Noam Y. Tenne
- */
-public interface ReplicationAddon extends Addon {
-
-    //replication
-    String PROP_REPLICATION_PREFIX = "artifactory.replication.";
-    String PROP_REPLICATION_STARTED_SUFFIX = ".started";
-    String PROP_REPLICATION_FINISHED_SUFFIX = ".finished";
-    String PROP_REPLICATION_RESULT_SUFFIX = ".result";
-    String TASK_MANUAL_DESCRIPTOR = "task_manual_settings";
-
-    BasicStatusHolder performRemoteReplication(RemoteReplicationSettings settings) throws IOException;
-
-    BasicStatusHolder performLocalReplication(LocalReplicationSettings settings) throws IOException;
-
-    void scheduleImmediateLocalReplicationTask(LocalReplicationDescriptor replicationDescriptor,
-            BasicStatusHolder statusHolder);
-
-    void scheduleImmediateRemoteReplicationTask(RemoteReplicationDescriptor replicationDescriptor,
-            BasicStatusHolder statusHolder);
-
-    ReplicationStatus getReplicationStatus(RepoPath repoPath);
-
-    void offerLocalReplicationDeploymentEvent(RepoPath repoPath);
-
-    void offerLocalReplicationMkDirEvent(RepoPath repoPath);
-
-    void offerLocalReplicationDeleteEvent(RepoPath repoPath);
-
-    void offerLocalReplicationPropertiesChangeEvent(RepoPath repoPath);
-
-    void validateTargetIsDifferentInstance(ReplicationBaseDescriptor descriptor, RealRepoDescriptor repoDescriptor)
-            throws IOException;
-
-    void validateTargetLicense(ReplicationBaseDescriptor descriptor,RealRepoDescriptor repoDescriptor,int numOfReplicationConfigured)
-            throws IOException;
-
-    /**
-     * Check if license is HA (only HA license support multi-push). If license is non-HA, keep only one replication
-     * within the list of replications
-     *
-     * @param pushReplications The list of replications to perform
-     * @return BasicStatusHolder Status holder that aggregates messages.
-     */
-    BasicStatusHolder filterIfMultiPushIsNotAllowed(List<LocalReplicationDescriptor> pushReplications);
-
-    /**
-     * When a local replication is removed, or changes it's url call this method to get rid of it's (now) unused properties
-     */
-    void cleanupLocalReplicationProperties(LocalReplicationDescriptor replication);
-
-    public enum Overwrite {
-        never, force
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/replication/ReplicationBaseSettings.java b/base/common/src/main/java/org/artifactory/addon/replication/ReplicationBaseSettings.java
deleted file mode 100644
index 7b28681..0000000
--- a/base/common/src/main/java/org/artifactory/addon/replication/ReplicationBaseSettings.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.replication;
-
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author Noam Y. Tenne
- */
-public abstract class ReplicationBaseSettings {
-
-    private final RepoPath repoPath;
-    private final boolean deleteExisting;
-    private final boolean includeProperties;
-    private final String url;
-    private final int socketTimeoutMillis;
-
-    protected ReplicationBaseSettings(RepoPath repoPath, boolean deleteExisting, boolean includeProperties,
-            String url, int socketTimeoutMillis) {
-        this.repoPath = repoPath;
-        this.deleteExisting = deleteExisting;
-        this.includeProperties = includeProperties;
-        this.url = url;
-        this.socketTimeoutMillis = socketTimeoutMillis;
-    }
-
-    public RepoPath getRepoPath() {
-        return repoPath;
-    }
-
-    public boolean isDeleteExisting() {
-        return deleteExisting;
-    }
-
-    public boolean isIncludeProperties() {
-        return includeProperties;
-    }
-
-    public String getUrl() {
-        return url;
-    }
-
-    public int getSocketTimeoutMillis() {
-        return socketTimeoutMillis;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof ReplicationBaseSettings)) {
-            return false;
-        }
-
-        ReplicationBaseSettings that = (ReplicationBaseSettings) o;
-
-        if (deleteExisting != that.deleteExisting) {
-            return false;
-        }
-        if (includeProperties != that.includeProperties) {
-            return false;
-        }
-        if (socketTimeoutMillis != that.socketTimeoutMillis) {
-            return false;
-        }
-        if (!repoPath.equals(that.repoPath)) {
-            return false;
-        }
-        if (url != null ? !url.equals(that.url) : that.url != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = repoPath.hashCode();
-        result = 31 * result + (deleteExisting ? 1 : 0);
-        result = 31 * result + (includeProperties ? 1 : 0);
-        result = 31 * result + socketTimeoutMillis;
-        result = 31 * result + (url != null ? url.hashCode() : 0);
-        return result;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/search/ArtifactSearchAddon.java b/base/common/src/main/java/org/artifactory/addon/search/ArtifactSearchAddon.java
deleted file mode 100644
index bf5b67b..0000000
--- a/base/common/src/main/java/org/artifactory/addon/search/ArtifactSearchAddon.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.artifactory.addon.search;
-
-import org.artifactory.addon.Addon;
-import org.artifactory.api.search.ItemSearchResult;
-import org.artifactory.api.search.SavedSearchResults;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public interface ArtifactSearchAddon extends Addon {
-
-    SavedSearchResults getSearchResults(String name,List<? extends ItemSearchResult> itemSearchResults,boolean completeVersion);
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/smartrepo/SmartRepoAddon.java b/base/common/src/main/java/org/artifactory/addon/smartrepo/SmartRepoAddon.java
deleted file mode 100644
index 6bbb6fc..0000000
--- a/base/common/src/main/java/org/artifactory/addon/smartrepo/SmartRepoAddon.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.addon.smartrepo;
-
-import org.artifactory.addon.Addon;
-import org.artifactory.fs.StatsInfo;
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author Chen Keinan
- */
-public interface SmartRepoAddon extends Addon {
-
-    boolean supportRemoteStats();
-
-    /**
-     * Triggered on remote download event
-     *
-     * Event queued for local stats update and potential delegation
-     *
-     * @param statsInfo The {@link StatsInfo} container
-     * @param origin    The remote host the download was triggered by
-     * @param repoPath  The file repo path to set/update stats
-     */
-    void fileDownloadedRemotely(StatsInfo statsInfo, String origin, RepoPath repoPath);
-
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/sso/HttpSsoAddon.java b/base/common/src/main/java/org/artifactory/addon/sso/HttpSsoAddon.java
deleted file mode 100644
index b2739eb..0000000
--- a/base/common/src/main/java/org/artifactory/addon/sso/HttpSsoAddon.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.sso;
-
-import org.artifactory.addon.Addon;
-
-/**
- * Addon for HTTP SSO capabilities.
- *
- * @author Noam Tenne
- */
-public interface HttpSsoAddon extends Addon {
-    String REALM = "http-sso";
-
-    boolean isHttpSsoAuthentication();
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/sso/crowd/CrowdAddon.java b/base/common/src/main/java/org/artifactory/addon/sso/crowd/CrowdAddon.java
deleted file mode 100644
index ef955ca..0000000
--- a/base/common/src/main/java/org/artifactory/addon/sso/crowd/CrowdAddon.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.sso.crowd;
-
-import org.artifactory.addon.Addon;
-import org.artifactory.descriptor.security.sso.CrowdSettings;
-import org.artifactory.security.UserGroupInfo;
-import org.springframework.security.core.Authentication;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.rmi.RemoteException;
-import java.util.Set;
-
-/**
- * Allows the SSO addon to behave as a proxy for Crowd authentication.<br> These methods cannot appear in the normal
- * addon interface since they need to be used by components in the core
- *
- * @author Noam Y. Tenne
- */
-public interface CrowdAddon extends Addon {
-
-    String REALM = "crowd";
-
-    /**
-     * Indicates whether crowd authentication is supported\enabled
-     *
-     * @param authentication Authentication object for the provider
-     * @return True if crowd authentication is supported\enabled
-     */
-    boolean isCrowdAuthenticationSupported(Class<?> authentication);
-
-    /**
-     * Authenticates the request via Crowd
-     *
-     * @param authentication Authentication to use
-     * @return New token with local user details and credentials
-     */
-    Authentication authenticateCrowd(Authentication authentication);
-
-    /**
-     * Find user in Crowd.
-     *
-     * @param userName The username to find in Crowd
-     * @return True if the user exists, false otherwise.
-     */
-    boolean findUser(String userName);
-
-    /**
-     * Add external groups that were brought over from Crowd into the set of groups that the user belongs to. Only
-     * groups that were imported into Artifactory from crowd will be added
-     *
-     * @param userName The username to find the groups for.
-     * @param groups   The set of groups that the user belongs to.
-     */
-    void addExternalGroups(String userName, Set<UserGroupInfo> groups);
-
-    /**
-     * Finds Crowd groups for a certain username, if blank retrieves all groups that are configured in Crowd.
-     *
-     * @param username             The username for which to get the groups for.
-     * @param currentCrowdSettings
-     * @return A set of Crowd groups that the user belongs to, if the username is blank, all groups configured in Crowd
-     *         will be returned.
-     */
-    Set<CrowdExtGroup> findCrowdExtGroups(String username, CrowdSettings currentCrowdSettings);
-
-    void testCrowdConnection(CrowdSettings crowdSettings) throws Exception;
-
-    /**
-     * Logoff the crowd authenticated user from the crowd server.
-     *
-     * @param request  The http request
-     * @param response The hyyp response
-     */
-    void logOffCrowd(HttpServletRequest request, HttpServletResponse response) throws RemoteException;
-
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/sso/crowd/CrowdExtGroup.java b/base/common/src/main/java/org/artifactory/addon/sso/crowd/CrowdExtGroup.java
deleted file mode 100644
index 61dd3b8..0000000
--- a/base/common/src/main/java/org/artifactory/addon/sso/crowd/CrowdExtGroup.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright 2012 JFrog Ltd. All rights reserved.
- * JFROG PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
- */
-
-package org.artifactory.addon.sso.crowd;
-
-import java.io.Serializable;
-
-/**
- * @author Chen  Keinan
- */
-public class CrowdExtGroup implements Serializable {
-
-    private String groupName;
-
-    private String description;
-
-    private boolean existsInArtifactory = false;
-
-    private boolean importIntoArtifactory = false;
-
-    public CrowdExtGroup(String groupName, String description) {
-        this.description = description;
-        this.groupName = groupName;
-    }
-
-
-    public CrowdExtGroup() {
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public String getGroupName() {
-        return groupName;
-    }
-
-    public boolean isExistsInArtifactory() {
-        return existsInArtifactory;
-    }
-
-    public void setExistsInArtifactory(boolean existsInArtifactory) {
-        this.existsInArtifactory = existsInArtifactory;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        CrowdExtGroup group = (CrowdExtGroup) o;
-
-        return groupName.equals(group.groupName);
-    }
-
-    public boolean isImportIntoArtifactory() {
-        return importIntoArtifactory;
-    }
-
-    public void setImportIntoArtifactory(boolean importIntoArtifactory) {
-        this.importIntoArtifactory = importIntoArtifactory;
-    }
-
-    public void setGroupName(String groupName) {
-        this.groupName = groupName;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    @Override
-    public int hashCode() {
-        return groupName.hashCode();
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/sso/saml/SamlException.java b/base/common/src/main/java/org/artifactory/addon/sso/saml/SamlException.java
deleted file mode 100644
index a707173..0000000
--- a/base/common/src/main/java/org/artifactory/addon/sso/saml/SamlException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.sso.saml;
-
-/**
- * SAML Exception
- *
- * @author Gidi Shabat
- */
-public class SamlException extends Exception {
-    public SamlException(String s) {
-        super(s);
-    }
-
-    public SamlException(String s, Exception cause) {
-        super(s, cause);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/sso/saml/SamlHandler.java b/base/common/src/main/java/org/artifactory/addon/sso/saml/SamlHandler.java
deleted file mode 100644
index adc6ee3..0000000
--- a/base/common/src/main/java/org/artifactory/addon/sso/saml/SamlHandler.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.artifactory.addon.sso.saml;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.HashMap;
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public interface SamlHandler {
-
-    /**
-     * Check if the authentication is SAML authentication.
-     */
-    public boolean isSamlAuthentication(HttpServletRequest request, HttpServletResponse response) throws SamlException;
-
-    /**
-     * Handle identityProvider login response.
-     */
-    public void handleLoginResponse(HttpServletRequest request, HttpServletResponse response,
-            HashMap<String, List<String>> samlResponseFromParam) throws SamlException;
-    /**
-     * Handle login event from Artifactory login link.
-     * Create login request and redirect to the  identity provider.
-     */
-    void handleLoginRequest(HttpServletRequest request, HttpServletResponse response) throws SamlException;
-
-    /**
-     * Return the logout redirect url
-     */
-    public String generateSamlLogoutRedirectUrl(HttpServletRequest request, HttpServletResponse response)throws SamlException;
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/sso/saml/SamlSsoAddon.java b/base/common/src/main/java/org/artifactory/addon/sso/saml/SamlSsoAddon.java
deleted file mode 100644
index 0ec4e7f..0000000
--- a/base/common/src/main/java/org/artifactory/addon/sso/saml/SamlSsoAddon.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.artifactory.addon.sso.saml;
-
-import org.artifactory.addon.Addon;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * @author Chen Keinan
- */
-public interface SamlSsoAddon extends Addon {
-    String REALM = "saml";
-
-    String getSamlLoginIdentityProviderUrl(HttpServletRequest request);
-
-    void createCertificate(String certificate) throws Exception;
-
-    Boolean isSamlAuthentication(HttpServletRequest servletRequest, HttpServletResponse servletResponse)
-            throws SamlException;
-
-    boolean isSamlAuthentication();
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/support/SupportAddon.java b/base/common/src/main/java/org/artifactory/addon/support/SupportAddon.java
deleted file mode 100644
index 140478e..0000000
--- a/base/common/src/main/java/org/artifactory/addon/support/SupportAddon.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.artifactory.addon.support;
-
-import org.artifactory.addon.Addon;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-import java.util.List;
-
-/**
- * @author Michael Pasternak
- */
-public interface SupportAddon extends Addon {
-
-    boolean isSupportAddonEnabled();
-
-    /**
-     * Generates support bundle/s
-     *
-     * @param bundleConfiguration config to be used
-     *
-     * @return name/s of generated bundles
-     */
-    List<String> generate(Object bundleConfiguration);
-
-    /**
-     * List earlier created support bundle/s
-     *
-     * @return name/s of generated bundles
-     */
-    List<String> list();
-
-    /**
-     * Downloads support bundles
-     *
-     * @param bundleName
-     * @return {@link InputStream} to support bundle
-     *
-     * @throws FileNotFoundException
-     */
-    public InputStream download(String bundleName) throws FileNotFoundException;
-
-    /**
-     * Deletes support bundles
-     *
-     * @param bundleName name of bundle to delete
-     * @param async whether delete should be performed asynchronously
-     *
-     * @return result
-     *
-     * @throws FileNotFoundException
-     */
-    public boolean delete(String bundleName, boolean async) throws FileNotFoundException;
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/watch/ArtifactWatchAddon.java b/base/common/src/main/java/org/artifactory/addon/watch/ArtifactWatchAddon.java
deleted file mode 100644
index 427bece..0000000
--- a/base/common/src/main/java/org/artifactory/addon/watch/ArtifactWatchAddon.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.watch;
-
-import org.artifactory.addon.Addon;
-import org.artifactory.fs.WatchersInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.util.Pair;
-
-import java.util.Map;
-
-/**
- * @author mamo
- */
-public interface ArtifactWatchAddon extends Addon {
-
-    Map<RepoPath, WatchersInfo> getAllWatchers(RepoPath repoPath);
-
-    /**
-     * remove watcher by name and repo path
-     *
-     * @param repoPath  - artifact repo path
-     * @param watchUser - watcher name
-     */
-    void removeWatcher(RepoPath repoPath,String watchUser);
-
-    /**
-     * add watcher by name and repo path
-     *
-     * @param repoPath  - artifact repo path
-     * @param watchUser - watcher name
-     */
-    void addWatcher(RepoPath repoPath, String watcherUsername);
-
-
-    /**
-     * check if user is currently watching this repo path
-     * @param repoPath - repo path
-     * @param userName - user Name
-     * @return if true , user is watching
-     */
-     boolean isUserWatchingRepo(RepoPath repoPath,String userName);
-
-
-    Pair<RepoPath, WatchersInfo> getNearestWatchDefinition(RepoPath repoPath, String userName);
-
-
-    /**
-     * get watches for repo path
-     *
-     * @param repoPath - repo path
-     * @return watches for repo path
-     */
-    WatchersInfo getWatchers(RepoPath repoPath);
-
-    }
diff --git a/base/common/src/main/java/org/artifactory/addon/webstart/ArtifactWebstartAddon.java b/base/common/src/main/java/org/artifactory/addon/webstart/ArtifactWebstartAddon.java
deleted file mode 100644
index fb0765c..0000000
--- a/base/common/src/main/java/org/artifactory/addon/webstart/ArtifactWebstartAddon.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.webstart;
-
-import org.artifactory.addon.Addon;
-
-import java.io.File;
-import java.io.IOException;
-import java.security.Key;
-import java.security.KeyStore;
-import java.util.List;
-
-/**
- * Webstart addon factory.
- *
- * @author Yossi Shaul
- */
-public interface ArtifactWebstartAddon extends Addon {
-
-    KeyStore loadKeyStore(File keyStoreFile, String password);
-
-    Key getAliasKey(KeyStore keyStore, String alias, String password);
-
-    void addKeyPair(File file, String pairName, String keyStorePassword, String alias, String privateKeyPassword) throws IOException;
-
-    boolean keyStoreExist();
-
-    List<String> getKeyPairNames();
-
-    boolean removeKeyPair(String keyPairName);
-
-    void setKeyStorePassword(String password);
-
-    void removeKeyStorePassword();
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/yum/ArtifactRpmMetadata.java b/base/common/src/main/java/org/artifactory/addon/yum/ArtifactRpmMetadata.java
deleted file mode 100644
index 84de6cd..0000000
--- a/base/common/src/main/java/org/artifactory/addon/yum/ArtifactRpmMetadata.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.artifactory.addon.yum;
-
-import java.io.File;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class ArtifactRpmMetadata {
-
-    private GeneralRpmMetadata generalRpmMetadata;
-    private MiscRpmMetadata miscRpmMetadata;
-    private String description;
-    private List<MetadataEntry> provide;
-    private List<MetadataEntry> require;
-    private List<MetadataEntry> conflict;
-    private List<MetadataEntry> obsolete;
-    private List<File> files;
-    private List<MetadataChangeLog> changeLogs;
-
-
-    public GeneralRpmMetadata getGeneralRpmMetadata() {
-        return generalRpmMetadata;
-    }
-
-    public void setGeneralRpmMetadata(GeneralRpmMetadata generalRpmMetadata) {
-        this.generalRpmMetadata = generalRpmMetadata;
-    }
-
-    public MiscRpmMetadata getMiscRpmMetadata() {
-        return miscRpmMetadata;
-    }
-
-    public void setMiscRpmMetadata(MiscRpmMetadata miscRpmMetadata) {
-        this.miscRpmMetadata = miscRpmMetadata;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public List<MetadataEntry> getProvide() {
-        return provide;
-    }
-
-    public void setProvide(List<MetadataEntry> provide) {
-        this.provide = provide;
-    }
-
-    public List<MetadataEntry> getRequire() {
-        return require;
-    }
-
-    public void setRequire(List<MetadataEntry> require) {
-        this.require = require;
-    }
-
-    public List<MetadataEntry> getConflict() {
-        return conflict;
-    }
-
-    public void setConflict(List<MetadataEntry> conflict) {
-        this.conflict = conflict;
-    }
-
-    public List<MetadataEntry> getObsolete() {
-        return obsolete;
-    }
-
-    public void setObsolete(List<MetadataEntry> obsolete) {
-        this.obsolete = obsolete;
-    }
-
-    public List<File> getFiles() {
-        return files;
-    }
-
-    public void setFiles(List<File> files) {
-        this.files = files;
-    }
-
-    public List<MetadataChangeLog> getChangeLogs() {
-        return changeLogs;
-    }
-
-    public void setChangeLogs(List<MetadataChangeLog> changeLogs) {
-        this.changeLogs = changeLogs;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/yum/GeneralRpmMetadata.java b/base/common/src/main/java/org/artifactory/addon/yum/GeneralRpmMetadata.java
deleted file mode 100644
index d302400..0000000
--- a/base/common/src/main/java/org/artifactory/addon/yum/GeneralRpmMetadata.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.artifactory.addon.yum;
-
-/**
- * @author Chen Keinan
- */
-public class GeneralRpmMetadata {
-
-    private String name;
-    private String version;
-    private String release;
-    private String summary;
-    private int epoch;
-    private String buildDate;
-    private long size;
-
-
-    public long getSize() {
-        return size;
-    }
-
-    public void setSize(long size) {
-        this.size = size;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public int getEpoch() {
-        return epoch;
-    }
-
-    public void setEpoch(int epoch) {
-        this.epoch = epoch;
-    }
-
-    public String getRelease() {
-        return release;
-    }
-
-    public void setRelease(String release) {
-        this.release = release;
-    }
-
-    public String getSummary() {
-        return summary;
-    }
-
-    public void setSummary(String summary) {
-        this.summary = summary;
-    }
-
-    public String getBuildDate() {
-        return buildDate;
-    }
-
-    public void setBuildDate(String buildDate) {
-        this.buildDate = buildDate;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/yum/MetadataChangeLog.java b/base/common/src/main/java/org/artifactory/addon/yum/MetadataChangeLog.java
deleted file mode 100644
index 4358d94..0000000
--- a/base/common/src/main/java/org/artifactory/addon/yum/MetadataChangeLog.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.artifactory.addon.yum;
-
-/**
- * @author Chen Keinan
- */
-public class MetadataChangeLog {
-    public String author;
-    public String date;
-    public String text;
-
-    public MetadataChangeLog(String author, String date, String text) {
-        this.author = author;
-        this.date = date;
-        this.text = text;
-    }
-
-    public String getDate() {
-        return date;
-    }
-
-    public void setDate(String date) {
-        this.date = date;
-    }
-
-    public String getAuthor() {
-        return author;
-    }
-
-    public void setAuthor(String author) {
-        this.author = author;
-    }
-
-    public String getText() {
-        return text;
-    }
-
-    public void setText(String text) {
-        this.text = text;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/yum/MetadataEntry.java b/base/common/src/main/java/org/artifactory/addon/yum/MetadataEntry.java
deleted file mode 100644
index 34a0549..0000000
--- a/base/common/src/main/java/org/artifactory/addon/yum/MetadataEntry.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package org.artifactory.addon.yum;
-
-/**
- * @author Chen Keinan
- */
-public class MetadataEntry {
-    public String name;
-    public String flags;
-    public String epoch;
-    public String version;
-    public String release;
-    public String pre;
-
-    public MetadataEntry(String epoch, String flags, String name, String pre, String release,
-            String version) {
-        this.epoch = epoch;
-        this.flags = flags;
-        this.name = name;
-        this.pre = pre;
-        this.release = release;
-        this.version = version;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getFlags() {
-        return flags;
-    }
-
-    public void setFlags(String flags) {
-        this.flags = flags;
-    }
-
-    public String getEpoch() {
-        return epoch;
-    }
-
-    public void setEpoch(String epoch) {
-        this.epoch = epoch;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public String getRelease() {
-        return release;
-    }
-
-    public void setRelease(String release) {
-        this.release = release;
-    }
-
-    public String getPre() {
-        return pre;
-    }
-
-    public void setPre(String pre) {
-        this.pre = pre;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/yum/MiscRpmMetadata.java b/base/common/src/main/java/org/artifactory/addon/yum/MiscRpmMetadata.java
deleted file mode 100644
index 00c92c7..0000000
--- a/base/common/src/main/java/org/artifactory/addon/yum/MiscRpmMetadata.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.artifactory.addon.yum;
-
-/**
- * @author Chen Keinan
- */
-public class MiscRpmMetadata {
-
-    private String url;
-    private String vendor;
-    private String packager;
-    private String buildHost;
-    private String sourceRpm;
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    public String getVendor() {
-        return vendor;
-    }
-
-    public void setVendor(String vendor) {
-        this.vendor = vendor;
-    }
-
-    public String getPackager() {
-        return packager;
-    }
-
-    public void setPackager(String packager) {
-        this.packager = packager;
-    }
-
-    public String getBuildHost() {
-        return buildHost;
-    }
-
-    public void setBuildHost(String buildHost) {
-        this.buildHost = buildHost;
-    }
-
-    public String getSourceRpm() {
-        return sourceRpm;
-    }
-
-    public void setSourceRpm(String sourceRpm) {
-        this.sourceRpm = sourceRpm;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/addon/yum/YumAddon.java b/base/common/src/main/java/org/artifactory/addon/yum/YumAddon.java
deleted file mode 100644
index 8a6a20b..0000000
--- a/base/common/src/main/java/org/artifactory/addon/yum/YumAddon.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.yum;
-
-import org.artifactory.addon.Addon;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author Noam Y. Tenne
- */
-public interface YumAddon extends Addon {
-
-    String REPO_DATA_DIR = "repodata/";
-
-    /**
-     * Activate the YUM metadata calculation for all needed paths under the local repository.
-     * The paths are the parent of all repodata needed based on the yum depth parameter.
-     * Each calculation will be queued and processed asynchronously.
-     *
-     * @param repo the local repository to activate YUM calculation on.
-     */
-    void requestAsyncRepositoryYumMetadataCalculation(LocalRepoDescriptor repo);
-
-    /**
-     * Activate the YUM metadata calculation for the specific list of paths.
-     * Each paths should be a parent of a repodata folder that need recalculation.
-     * Each calculation will be queued and processed asynchronously.
-     *
-     * @param repoPaths
-     */
-    void requestAsyncRepositoryYumMetadataCalculation(RepoPath... repoPaths);
-
-    /**
-     * Activate the YUM metadata calculation for all needed paths under the local repository.
-     * The paths are the parent of all repodata needed based on the yum depth parameter.
-     * Each calculation will be processed in a separate transaction but synchronously to this method.
-     *
-     * @param repo the local repository to activate YUM calculation on.
-     */
-    void requestYumMetadataCalculation(LocalRepoDescriptor repo);
-
-    /**
-     *  get Rpm file Meta data
-     * @param fileInfo
-     * @return
-     */
-    ArtifactRpmMetadata getRpmMetadata(FileInfo fileInfo) ;
-}
diff --git a/base/common/src/main/java/org/artifactory/api/jackson/JacksonFactory.java b/base/common/src/main/java/org/artifactory/api/jackson/JacksonFactory.java
deleted file mode 100644
index 39cdd48..0000000
--- a/base/common/src/main/java/org/artifactory/api/jackson/JacksonFactory.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.jackson;
-
-import com.sun.xml.internal.ws.developer.SerializationFeature;
-import org.codehaus.jackson.JsonEncoding;
-import org.codehaus.jackson.JsonFactory;
-import org.codehaus.jackson.JsonGenerator;
-import org.codehaus.jackson.JsonParser;
-import org.codehaus.jackson.map.AnnotationIntrospector;
-import org.codehaus.jackson.map.DeserializationConfig;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.map.SerializationConfig;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.codehaus.jackson.map.introspect.Annotated;
-import org.codehaus.jackson.map.introspect.JacksonAnnotationIntrospector;
-import org.codehaus.jackson.xc.JaxbAnnotationIntrospector;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.Writer;
-
-/**
- * Jackson generator factory class
- *
- * @author Noam Tenne
- */
-public abstract class JacksonFactory {
-    private JacksonFactory() {
-        // utility class
-    }
-
-    /**
-     * Creates a JsonGenerator using the given output stream as a writer
-     *
-     * @param outputStream Stream to write to
-     * @return Json Generator
-     * @throws IOException
-     */
-    public static JsonGenerator createJsonGenerator(OutputStream outputStream) throws IOException {
-        JsonFactory jsonFactory = getFactory();
-        JsonGenerator jsonGenerator = jsonFactory.createJsonGenerator(outputStream, JsonEncoding.UTF8);
-        updateGenerator(jsonFactory, jsonGenerator);
-        return jsonGenerator;
-    }
-
-    /**
-     * Creates a JsonGenerator using the given writer
-     *
-     * @param writer Stream to write to
-     * @return Json Generator
-     * @throws IOException
-     */
-    public static JsonGenerator createJsonGenerator(Writer writer) throws IOException {
-        JsonFactory jsonFactory = getFactory();
-        JsonGenerator jsonGenerator = jsonFactory.createJsonGenerator(writer);
-        updateGenerator(jsonFactory, jsonGenerator);
-        return jsonGenerator;
-    }
-
-    /**
-     * Creates a JsonParser using the given input stream as a reader.<BR>
-     * Please do not use this method directly for simple parsing tasks, instead use {@link JacksonReader}.
-     *
-     * @param inputStream Stream to read from
-     * @return Json Parser
-     * @throws IOException
-     */
-    public static JsonParser createJsonParser(InputStream inputStream) throws IOException {
-        JsonFactory jsonFactory = getFactory();
-        JsonParser jsonParser = jsonFactory.createJsonParser(inputStream);
-        updateParser(jsonFactory, jsonParser);
-        return jsonParser;
-    }
-
-
-    /**
-     * Creates a JsonParser using the given byte[] as a reader.<BR>
-     * Please do not use this method directly for simple parsing tasks, instead use {@link JacksonReader}.
-     *
-     * @param input Input to read from
-     * @return Json Parser
-     * @throws IOException
-     */
-    public static JsonParser createJsonParser(byte[] input) throws IOException {
-        JsonFactory jsonFactory = getFactory();
-        JsonParser jsonParser = jsonFactory.createJsonParser(input);
-        updateParser(jsonFactory, jsonParser);
-        return jsonParser;
-    }
-
-    /**
-     * Create the JSON factory
-     *
-     * @return JSON factory
-     */
-    private static JsonFactory getFactory() {
-        JsonFactory jsonFactory = new JsonFactory();
-        //Do not auto-close target output when writing completes
-        jsonFactory.disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET);
-
-        //Do not auto-close source output when reading completes
-        jsonFactory.disable(JsonParser.Feature.AUTO_CLOSE_SOURCE);
-        return jsonFactory;
-    }
-
-    /**
-     * Update the generator with a default codec and pretty printer
-     *
-     * @param jsonFactory   Factory to set as codec
-     * @param jsonGenerator Generator to configure
-     */
-    private static void updateGenerator(JsonFactory jsonFactory, JsonGenerator jsonGenerator) {
-        ObjectMapper mapper = new ObjectMapper(jsonFactory);
-
-        //Update the annotation interceptor to also include jaxb annotations as a second choice
-        AnnotationIntrospector primary = new JacksonAnnotationIntrospector();
-        AnnotationIntrospector secondary = new JaxbAnnotationIntrospector() {
-
-            /**
-             * BUG FIX:
-             * By contract, if findSerializationInclusion didn't encounter any annotations that should change the
-             * inclusion value, it should return the default value it has received; but actually returns null, which
-             * overrides the NON_NULL option we set.
-             * The doc states issue JACKSON-256 which was supposed to be fixed in 1.5.0. *twilight zone theme song*
-             */
-
-            @Override
-            public JsonSerialize.Inclusion findSerializationInclusion(Annotated a, JsonSerialize.Inclusion defValue) {
-                JsonSerialize.Inclusion inclusion = super.findSerializationInclusion(a, defValue);
-                if (inclusion == null) {
-                    return defValue;
-                }
-                return inclusion;
-            }
-        };
-        AnnotationIntrospector pair = new AnnotationIntrospector.Pair(primary, secondary);
-        mapper.getSerializationConfig().setAnnotationIntrospector(pair);
-        mapper.getSerializationConfig().setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
-
-        jsonGenerator.setCodec(mapper);
-        jsonGenerator.useDefaultPrettyPrinter();
-    }
-
-    /**
-     * Update the parser with a default codec
-     *
-     * @param jsonFactory Factory to set as codec
-     * @param jsonParser  Parser to configure
-     */
-    private static void updateParser(JsonFactory jsonFactory, JsonParser jsonParser) {
-        AnnotationIntrospector primary = new JacksonAnnotationIntrospector();
-        AnnotationIntrospector secondary = new JaxbAnnotationIntrospector();
-        AnnotationIntrospector pair = new AnnotationIntrospector.Pair(primary, secondary);
-
-        ObjectMapper mapper = new ObjectMapper(jsonFactory);
-        mapper.getSerializationConfig().setAnnotationIntrospector(pair);
-        mapper.getDeserializationConfig().setAnnotationIntrospector(pair);
-        mapper.getDeserializationConfig().disable(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES);
-        jsonParser.setCodec(mapper);
-    }
-
-    /**
-     * Creates a Jackson object mapper
-     *
-     * @param ident ident output for pretty printing
-     *
-     * @return {@link org.codehaus.jackson.map.ObjectMapper}
-     */
-    public static ObjectMapper createObjectMapper(boolean ident) {
-        ObjectMapper mapper = new ObjectMapper();
-        mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-        mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
-        if (ident) mapper.enable(SerializationConfig.Feature.INDENT_OUTPUT);
-        return mapper;
-    }
-
-    /**
-     * Creates a Jackson object mapper
-     *
-     * @return {@link org.codehaus.jackson.map.ObjectMapper}
-     */
-    public static ObjectMapper createObjectMapper() {
-        return  createObjectMapper(false);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/api/jackson/JacksonReader.java b/base/common/src/main/java/org/artifactory/api/jackson/JacksonReader.java
deleted file mode 100644
index 829ac8e..0000000
--- a/base/common/src/main/java/org/artifactory/api/jackson/JacksonReader.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.jackson;
-
-import org.codehaus.jackson.JsonNode;
-import org.codehaus.jackson.type.TypeReference;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * JSON parsing helper.<br>
- * All typical JSON parsing operations should be performed through this class and not directly on a parser.
- *
- * @author Noam Y. Tenne
- */
-public final class JacksonReader {
-
-    private JacksonReader() {
-    }
-
-    /**
-     * Parses bytes to an object
-     *
-     * @param bytes   Bytes to parse
-     * @param asClass Class of resulting object
-     * @param <T>     Object class
-     * @return Parsed object
-     */
-    public static <T> T bytesAsClass(byte[] bytes, Class<T> asClass) throws IOException {
-        return JacksonFactory.createJsonParser(bytes).readValueAs(asClass);
-    }
-
-    /**
-     * Parse bytes to a JSON tree.<BR>
-     * ATTENTION: closing the given stream is the responsibility of the caller.
-     *
-     * @param bytes Bytes to parse
-     * @return JSON node
-     */
-    public static JsonNode bytesAsTree(byte[] bytes) throws IOException {
-        return JacksonFactory.createJsonParser(bytes).readValueAsTree();
-    }
-
-    /**
-     * Parses bytes to an object
-     *
-     * @param bytes              Bytes to parse
-     * @param valueTypeReference Type reference of resulting object
-     * @param <T>                Object class
-     * @return Parsed object
-     */
-    public static <T> T bytesAsValueTypeReference(byte[] bytes, TypeReference<T> valueTypeReference)
-            throws IOException {
-        return JacksonFactory.createJsonParser(bytes).readValueAs(valueTypeReference);
-    }
-
-    /**
-     * Parses the content of an input stream to an object.<BR>
-     * ATTENTION: closing the given stream is the responsibility of the caller.
-     *
-     * @param inputStream Stream to read and parse
-     * @param asClass     Class of resulting object
-     * @param <T>         Object class
-     * @return Parsed object
-     */
-    public static <T> T streamAsClass(InputStream inputStream, Class<T> asClass) throws IOException {
-        return JacksonFactory.createJsonParser(inputStream).readValueAs(asClass);
-    }
-
-    /**
-     * Parses the content of an input stream to an object.<BR>
-     * ATTENTION: closing the given stream is the responsibility of the caller.
-     *
-     * @param inputStream        Stream to read and parse
-     * @param valueTypeReference Type reference of resulting object
-     * @param <T>                Object class
-     * @return Parsed object
-     */
-    public static <T> T streamAsValueTypeReference(InputStream inputStream, TypeReference<T> valueTypeReference)
-            throws IOException {
-        return JacksonFactory.createJsonParser(inputStream).readValueAs(valueTypeReference);
-    }
-
-    /**
-     * Parse the content of an input stream to a JSON tree.<BR>
-     * ATTENTION: closing the given stream is the responsibility of the caller.
-     *
-     * @param inputStream Stream to read and parse
-     * @return JSON node
-     */
-    public static JsonNode streamAsTree(InputStream inputStream) throws IOException {
-        return JacksonFactory.createJsonParser(inputStream).readValueAsTree();
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/api/jackson/JacksonWriter.java b/base/common/src/main/java/org/artifactory/api/jackson/JacksonWriter.java
deleted file mode 100644
index 5d1fe27..0000000
--- a/base/common/src/main/java/org/artifactory/api/jackson/JacksonWriter.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.jackson;
-
-import java.io.IOException;
-
-/**
- * Created by michaelp on 10/14/15.
- */
-public final class JacksonWriter {
-
-    /**
-     * Serializes given item to json
-     *
-     * @param item an object to serialize
-     *
-     * @return serialized json string
-     *
-     * @throws java.io.IOException
-     */
-    public static <T> String serialize(T item) throws IOException {
-        return JacksonFactory.createObjectMapper().writeValueAsString(item);
-    }
-
-    /**
-     * Serializes given item to json
-     *
-     * @param item an object to serialize
-     * @param prettyPrint ident output
-     *
-     * @return serialized json string
-     *
-     * @throws java.io.IOException
-     */
-    public static <T> String serialize(T item, boolean prettyPrint) throws IOException {
-        return JacksonFactory.createObjectMapper(prettyPrint).writeValueAsString(item);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/build/ArtifactoryBuildArtifact.java b/base/common/src/main/java/org/artifactory/build/ArtifactoryBuildArtifact.java
deleted file mode 100644
index 5597ada..0000000
--- a/base/common/src/main/java/org/artifactory/build/ArtifactoryBuildArtifact.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.artifactory.build;
-
-import org.artifactory.fs.FileInfo;
-import org.jfrog.build.api.Artifact;
-
-/**
- * @author Dan Feldman
- */
-public class ArtifactoryBuildArtifact {
-
-    private final FileInfo fileInfo;
-    private final Artifact artifact;
-
-    public ArtifactoryBuildArtifact(Artifact artifact, FileInfo fileInfo) {
-        this.artifact = artifact;
-        this.fileInfo = fileInfo;
-    }
-
-    public FileInfo getFileInfo() {
-        return fileInfo;
-    }
-
-    public Artifact getArtifact() {
-        return artifact;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof ArtifactoryBuildArtifact)) {
-            return false;
-        }
-        if (!super.equals(o)) {
-            return false;
-        }
-        ArtifactoryBuildArtifact that = (ArtifactoryBuildArtifact) o;
-        if (!artifact.equals(that.artifact)) {
-            return false;
-        }
-        if (getFileInfo() != null && that.getFileInfo() != null) {
-            return getFileInfo().isIdentical(that.getFileInfo());
-        } else {
-            return getFileInfo() != null || that.getFileInfo() != null;
-        }
-    }
-
-    @Override
-    public int hashCode() {
-        int result = artifact != null ? artifact.hashCode() : 1;
-        result = 31 * result + (getFileInfo() != null ? getFileInfo().hashCode() : 0);
-        return result;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/build/BuildInfoUtils.java b/base/common/src/main/java/org/artifactory/build/BuildInfoUtils.java
deleted file mode 100644
index 6e3da39..0000000
--- a/base/common/src/main/java/org/artifactory/build/BuildInfoUtils.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.artifactory.build;
-
-import org.jfrog.build.api.Build;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
-
-/**
- * Utility class to work with build info common operation.
- *
- * @author Yossi Shaul
- */
-public abstract class BuildInfoUtils {
-
-    private static final DateTimeFormatter BUILD_FORMATTER = DateTimeFormat.forPattern(Build.STARTED_FORMAT);
-
-    /**
-     * @param time Time in millis to format
-     * @return Formatted time using the {@link org.jfrog.build.api.Build#STARTED_FORMAT} time format (ISO time format).
-     */
-    public static String formatBuildTime(long time) {
-        return BUILD_FORMATTER.print(time);
-    }
-
-    /**
-     * @param buildTimeFormat Build time with {@link org.jfrog.build.api.Build#STARTED_FORMAT} format
-     * @return Time in millis represented by the string
-     */
-    public static long parseBuildTime(String buildTimeFormat) {
-        return BUILD_FORMATTER.parseDateTime(buildTimeFormat).getMillis();
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/concurrent/ExpiringDelayed.java b/base/common/src/main/java/org/artifactory/concurrent/ExpiringDelayed.java
deleted file mode 100644
index a17df10..0000000
--- a/base/common/src/main/java/org/artifactory/concurrent/ExpiringDelayed.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.concurrent;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.concurrent.Delayed;
-import java.util.concurrent.TimeUnit;
-
-/**
- * @author Yoav Landman
- */
-public abstract class ExpiringDelayed implements Delayed {
-
-    private static final Logger log = LoggerFactory.getLogger(ExpiringDelayed.class);
-
-    private final long expiry;
-
-    /**
-     * Creates a new instance.
-     *
-     * @param expiry In milliseconds
-     */
-    public ExpiringDelayed(long expiry) {
-        this.expiry = expiry;
-        if (log.isTraceEnabled()) {
-            log.trace("Created delayed entry on {}, expiring on {} for {}.",
-                    System.currentTimeMillis(), expiry, getClass().getName());
-        }
-    }
-
-    /**
-     * @return The subject/entry/actual value that this delay is wrapping
-     */
-    public abstract String getSubject();
-
-    @Override
-    public final long getDelay(TimeUnit unit) {
-        long millisToExpiry = expiry - System.currentTimeMillis();
-        long delay = unit.convert(millisToExpiry < 0 ? 0 : millisToExpiry, TimeUnit.MILLISECONDS);
-        return delay;
-    }
-
-    @Override
-    public final int compareTo(Delayed o) {
-        long d = getDelay(TimeUnit.MILLISECONDS) - o.getDelay(TimeUnit.MILLISECONDS);
-        return (d == 0) ? 0 : ((d < 0) ? -1 : 1);
-    }
-
-    @Override
-    public final boolean equals(Object o) {
-        return this == o || !(o == null || getClass() != o.getClass()) && getSubject().equals(o);
-    }
-
-    @Override
-    public final int hashCode() {
-        return getSubject().hashCode();
-    }
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/concurrent/LockingException.java b/base/common/src/main/java/org/artifactory/concurrent/LockingException.java
deleted file mode 100644
index ef0cd75..0000000
--- a/base/common/src/main/java/org/artifactory/concurrent/LockingException.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.concurrent;
-
-/**
- * @author freds
- * @date Sep 5, 2008
- */
-public class LockingException extends RuntimeException {
-
-    public LockingException(String message) {
-        super(message);
-    }
-
-    public LockingException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-}
diff --git a/base/common/src/main/java/org/artifactory/concurrent/State.java b/base/common/src/main/java/org/artifactory/concurrent/State.java
deleted file mode 100644
index 1624164..0000000
--- a/base/common/src/main/java/org/artifactory/concurrent/State.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.concurrent;
-
-/**
- * @author freds
- * @date Aug 28, 2009
- */
-public interface State {
-    boolean canTransitionTo(State newState);
-}
diff --git a/base/common/src/main/java/org/artifactory/concurrent/StateAware.java b/base/common/src/main/java/org/artifactory/concurrent/StateAware.java
deleted file mode 100644
index f08a2a6..0000000
--- a/base/common/src/main/java/org/artifactory/concurrent/StateAware.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.concurrent;
-
-/**
- * @author Yoav Landman
- */
-public interface StateAware {
-    State getInitialState();
-}
diff --git a/base/common/src/main/java/org/artifactory/config/ConfigurationException.java b/base/common/src/main/java/org/artifactory/config/ConfigurationException.java
deleted file mode 100644
index 2f50c90..0000000
--- a/base/common/src/main/java/org/artifactory/config/ConfigurationException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.config;
-
-
-public class ConfigurationException extends RuntimeException {
-    public ConfigurationException(String message) {
-        super(message);
-    }
-
-    public ConfigurationException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/config/CronConfigurationException.java b/base/common/src/main/java/org/artifactory/config/CronConfigurationException.java
deleted file mode 100644
index 0606b7f..0000000
--- a/base/common/src/main/java/org/artifactory/config/CronConfigurationException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.config;
-
-/**
- * Thrown when cron configuration is illegal
- *
- * @author Michael Pasternak
- */
-public class CronConfigurationException extends ConfigurationException {
-    public CronConfigurationException(String message) {
-        super(message);
-    }
-
-    public CronConfigurationException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/config/xml/ArtifactoryXmlFactory.java b/base/common/src/main/java/org/artifactory/config/xml/ArtifactoryXmlFactory.java
deleted file mode 100644
index b0a5830..0000000
--- a/base/common/src/main/java/org/artifactory/config/xml/ArtifactoryXmlFactory.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.config.xml;
-
-import javax.xml.parsers.SAXParserFactory;
-
-/**
- * User: freds Date: Jun 2, 2008 Time: 7:14:17 PM
- */
-public class ArtifactoryXmlFactory {
-    private static boolean xmlInitialized;
-    private static SAXParserFactory factory;
-
-    private static synchronized void initXmlConfiguration() {
-        if (xmlInitialized) {
-            return;
-        }
-        xmlInitialized = true;
-        //Create the sax parser factory
-        factory = SAXParserFactory.newInstance();
-        factory.setNamespaceAware(true);
-        factory.setValidating(false);
-        try {
-            factory.setFeature("http://xml.org/sax/features/validation", false);
-            factory.setFeature("http://xml.org/sax/features/external-general-entities", true);
-            factory.setFeature("http://xml.org/sax/features/resolve-dtd-uris", false);
-            factory.setFeature("http://apache.org/xml/features/continue-after-fatal-error", true);
-            factory.setFeature("http://xml.org/sax/features/namespaces", true);
-            factory.setFeature("http://xml.org/sax/features/namespace-prefixes", false);
-        } catch (Exception e) {
-            factory = null;
-            throw new RuntimeException("SAX parser factory initialization error.", e);
-        }
-    }
-
-    public static SAXParserFactory getFactory() {
-        initXmlConfiguration();
-        return factory;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/config/xml/EntityResolvingContentHandler.java b/base/common/src/main/java/org/artifactory/config/xml/EntityResolvingContentHandler.java
deleted file mode 100644
index 3f78be1..0000000
--- a/base/common/src/main/java/org/artifactory/config/xml/EntityResolvingContentHandler.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.config.xml;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.xml.sax.Attributes;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.InputSource;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-import org.xml.sax.helpers.DefaultHandler;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * @author Yoav Landman
- */
-public class EntityResolvingContentHandler extends DefaultHandler {
-    private static final Logger log = LoggerFactory.getLogger(EntityResolvingContentHandler.class);
-    private final ContentHandler handler;
-    private final boolean namespaceAware;
-
-
-    public EntityResolvingContentHandler(ContentHandler handler) {
-        this(handler, false);
-    }
-
-    public EntityResolvingContentHandler(ContentHandler handler, boolean namespaceAware) {
-        this.handler = handler;
-        this.namespaceAware = namespaceAware;
-    }
-
-    @Override
-    public InputSource resolveEntity(String publicId, String systemId) throws IOException, SAXException {
-        InputSource source = super.resolveEntity(publicId, systemId);
-        if (source == null) {
-            InputStream stream = this.getClass().getResourceAsStream("xml/characters.ent");
-            if (stream != null) {
-                source = new InputSource(stream);
-            }
-        }
-        return source;
-    }
-
-    @Override
-    public void setDocumentLocator(Locator locator) {
-        handler.setDocumentLocator(locator);
-    }
-
-    @Override
-    public void startDocument() throws SAXException {
-        handler.startDocument();
-    }
-
-    @Override
-    public void endDocument() throws SAXException {
-        handler.endDocument();
-    }
-
-    @Override
-    public void startPrefixMapping(String prefix, String uri) throws SAXException {
-        handler.startPrefixMapping(prefix, uri);
-    }
-
-    @Override
-    public void endPrefixMapping(String prefix) throws SAXException {
-        handler.endPrefixMapping(prefix);
-    }
-
-    @Override
-    public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
-        handler.startElement(processUri(uri), localName, qName, atts);
-    }
-
-    @Override
-    public void endElement(String uri, String localName, String qName) throws SAXException {
-        handler.endElement(processUri(uri), localName, qName);
-    }
-
-    @Override
-    public void characters(char ch[], int start, int length) throws SAXException {
-        handler.characters(ch, start, length);
-    }
-
-    @Override
-    public void ignorableWhitespace(char ch[], int start, int length) throws SAXException {
-        handler.ignorableWhitespace(ch, start, length);
-    }
-
-    @Override
-    public void processingInstruction(String target, String data) throws SAXException {
-        handler.processingInstruction(target, data);
-    }
-
-    @Override
-    public void skippedEntity(String name) throws SAXException {
-        handler.skippedEntity(name);
-    }
-
-    @Override
-    public void fatalError(SAXParseException e) throws SAXException {
-        //Temp hack to avoid broken plexus poms (ver 1.0.4 & 1.0.5)
-        log.warn("Received the following error during xml parsing: '" + e.getMessage() + "'.");
-        //No 'super.fatalError(e)'!;
-    }
-
-    private String processUri(String uri) {
-        return namespaceAware ? uri : "";
-    }
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/converters/ConvertersManagerImpl.java b/base/common/src/main/java/org/artifactory/converters/ConvertersManagerImpl.java
deleted file mode 100644
index a78fd09..0000000
--- a/base/common/src/main/java/org/artifactory/converters/ConvertersManagerImpl.java
+++ /dev/null
@@ -1,287 +0,0 @@
-package org.artifactory.converters;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.property.ArtifactoryConverter;
-import org.artifactory.common.property.FatalConversionException;
-import org.artifactory.config.CronConfigurationException;
-import org.artifactory.storage.db.properties.model.DbProperties;
-import org.artifactory.storage.db.properties.service.ArtifactoryCommonDbPropertiesService;
-import org.artifactory.version.CompoundVersionDetails;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.artifactory.addon.ha.message.HaMessageTopic.CONFIG_CHANGE_TOPIC;
-
-
-/**
- * The class manages the conversions process during Artifactory life cycle.
- * It creates a complete separation between the HOME, CLUSTER and database
- * environments, thoughts Artifactory converts each environment independently,
- * each environment has its own original version and each original version might
- * trigger the relevant conversion.
- * For HA environment, only the primary master node can do a conversion of the
- * cluster home and DB. And once primary is up and running,
- * shutdown events are sent to the slaves.
- *
- * @author Gidi Shabat
- */
-public class ConvertersManagerImpl implements ConverterManager {
-    private static final Logger log = LoggerFactory.getLogger(ConvertersManagerImpl.class);
-
-    private final ArtifactoryHome artifactoryHome;
-    private final VersionProviderImpl vp;
-    private List<ArtifactoryConverterAdapter> localHomeConverters = new ArrayList<>();
-    private List<ArtifactoryConverterAdapter> clusterHomeConverters = new ArrayList<>();
-    private boolean homeConversionRunning = false;
-    private boolean databaseConversionRunning = false;
-
-    public ConvertersManagerImpl(ArtifactoryHome artifactoryHome, VersionProviderImpl vp) {
-        // Initialize
-        this.artifactoryHome = artifactoryHome;
-        this.vp = vp;
-        // create home converters
-        localHomeConverters.add(new LoggingConverter(artifactoryHome.getEtcDir()));
-        localHomeConverters.add(new MimeTypeConverter(artifactoryHome.getMimeTypesFile()));
-        // create cluster converters
-        clusterHomeConverters.add(new MimeTypeConverter(artifactoryHome.getHaAwareMimeTypesFile()));
-    }
-
-    @Override
-    public void convertHomes() {
-        convertHome();
-        convertClusterHome();
-    }
-
-    @Override
-    public void beforeInits() {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        if (homeConversionRunning) {
-            boolean lockdown = addonsManager.lockdown();
-            if (lockdown) {
-                cleanRevertConverters(localHomeConverters, LocalConverterTaskType.revert);
-                cleanRevertConverters(clusterHomeConverters, LocalConverterTaskType.revert);
-                throw new FatalConversionException(
-                        "Reverting conversions and stopping Artifactory due to missing or invalid license");
-            } else {
-                cleanRevertConverters(localHomeConverters, LocalConverterTaskType.clean);
-                cleanRevertConverters(clusterHomeConverters, LocalConverterTaskType.clean);
-            }
-        }
-    }
-
-    @Override
-    public void serviceConvert(ArtifactoryConverter artifactoryConverter) {
-        try {
-            if (isDatabaseConversionInterested()) {
-                assertDatabaseConversionOnPrimaryOnly();
-                CompoundVersionDetails running = vp.getRunning();
-                CompoundVersionDetails originalService = vp.getOriginalDatabaseVersion();
-                log.debug("Starting ReloadableBean conversion for: {}, from {} to {}",
-                        artifactoryConverter.getClass().getName(), originalService, running);
-                databaseConversionRunning = true;
-                artifactoryConverter.convert(originalService, running);
-                log.debug("Finished ReloadableBean conversion for: {}", artifactoryConverter.getClass().getName());
-            }
-        } catch (Exception e) {
-            handleException(e);
-        }
-    }
-
-    @Override
-    public void afterAllInits() {
-        if (isConverting()) {
-            try {
-                // Save home artifactory.properties
-                log.info("Updating local file data/artifactory.properties to running version");
-                artifactoryHome.writeBundledHomeArtifactoryProperties();
-                vp.reloadArtifactorySystemProperties(artifactoryHome.getHomeArtifactoryPropertiesFile());
-                // HA etc cluster home or DB for non HA or primary only
-                if (isNonHaOrConfiguredPrimary()) {
-                    // Save cluster artifactory.properties
-                    if (artifactoryHome.isHaConfigured()) {
-                        log.info("Updating cluster file ha-data/artifactory.properties to running version");
-                        artifactoryHome.writeBundledHaArtifactoryProperties();
-                        vp.reloadArtifactorySystemProperties(artifactoryHome.getHaArtifactoryPropertiesFile());
-                    }
-                    //Insert the new version to the database only if have to
-                    ArtifactoryCommonDbPropertiesService dbPropertiesService = ContextHelper.get().beanForType(
-                            ArtifactoryCommonDbPropertiesService.class);
-                    if (isDatabaseConversionInterested()) {
-                        log.info("Updating database properties to running version");
-                        dbPropertiesService.updateDbProperties(createDbPropertiesFromVersion(vp.getRunning()));
-                    }
-                }
-            } catch (Exception e) {
-                throw new RuntimeException("Failed to finish conversion", e);
-            }
-        }
-    }
-
-    @Override
-    public void afterContextReady() {
-        if (isConverting()) {
-            try {
-                // Now HA Addon is initialized check for primary with complete server list
-                AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-                if (addonsManager != null) {
-                    HaCommonAddon haAddon = addonsManager.addonByType(HaCommonAddon.class);
-                    if (haAddon != null) {
-                        // Send message to slaves shutdown
-                        log.info("Sending configuration update message to slaves");
-                        haAddon.notify(CONFIG_CHANGE_TOPIC, null);
-                    }
-                }
-            } finally {
-                homeConversionRunning = false;
-                databaseConversionRunning = false;
-            }
-        }
-    }
-
-    private void convertHome() {
-        try {
-            if (isLocalHomeInterested()) {
-                CompoundVersionDetails originalHome = vp.getOriginalHome();
-                CompoundVersionDetails running = vp.getRunning();
-                homeConversionRunning = true;
-                String message = "Starting home conversion, from {}, to {}";
-                log.info(message, originalHome.getVersion(), running.getVersion());
-                runConverters(localHomeConverters, originalHome, running);
-                log.info("Finished home conversion");
-            }
-        } catch (Exception e) {
-            handleException(e);
-        }
-    }
-
-    private void convertClusterHome() {
-        try {
-            if (isHaInterested()) {
-                CompoundVersionDetails originalHa = vp.getOriginalHa();
-                CompoundVersionDetails running = vp.getRunning();
-                homeConversionRunning = true;
-                String message = "Starting cluster home conversion, from {}, to {}";
-                log.info(message, originalHa.getVersion(), running.getVersion());
-                runConverters(clusterHomeConverters, originalHa, running);
-                log.info("Finished cluster home conversion");
-            }
-        } catch (Exception e) {
-            handleException(e);
-        }
-    }
-
-    private void handleException(Exception e) {
-        if (e instanceof CronConfigurationException) {
-            // we let saving cron (even if its no longer valid/malformed)
-            // rather than fail upgrade, later on user can change it manually
-            log.warn(e.getMessage());
-            log.debug("{}", e);
-        } else {
-            log.error("Conversion failed. You should analyze the error and retry launching " +
-                    "Artifactory. Error is: {}", e.getMessage());
-            homeConversionRunning = false;
-            databaseConversionRunning = false;
-            throw new RuntimeException(e.getMessage(), e);
-        }
-    }
-
-    private DbProperties createDbPropertiesFromVersion(CompoundVersionDetails versionDetails) {
-        long installTime = System.currentTimeMillis();
-        return new DbProperties(installTime,
-                versionDetails.getVersionName(),
-                versionDetails.getRevisionInt(),
-                versionDetails.getTimestamp()
-        );
-    }
-
-    @Override
-    public boolean isConverting() {
-        return homeConversionRunning || databaseConversionRunning;
-    }
-
-    private void runConverters(List<ArtifactoryConverterAdapter> converters, CompoundVersionDetails fromVersion,
-            CompoundVersionDetails toVersion) {
-        for (ArtifactoryConverterAdapter converter : converters) {
-            if (converter.isInterested(fromVersion, toVersion)) {
-                converter.backup();
-                converter.convert(fromVersion, toVersion);
-            }
-        }
-    }
-
-    private void cleanRevertConverters(List<ArtifactoryConverterAdapter> converters,
-            LocalConverterTaskType localConverterTaskType) {
-        for (ArtifactoryConverterAdapter converter : converters) {
-            switch (localConverterTaskType) {
-                case clean: {
-                    converter.clean();
-                    break;
-                }
-                case revert: {
-                    converter.revert();
-                    break;
-                }
-            }
-        }
-    }
-
-    private void assertDatabaseConversionOnPrimaryOnly() {
-        if (artifactoryHome.isHaConfigured() && !isConfiguredPrimary()) {
-            throw new RuntimeException("Stopping Artifactory, couldn't start Artifactory upgrade, on slave node!\n" +
-                    "Please run Artifactory upgrade on the master first!");
-        }
-    }
-
-    private boolean isNonHaOrConfiguredPrimary() {
-        return (!artifactoryHome.isHaConfigured() || isConfiguredPrimary());
-    }
-
-    private boolean isConfiguredPrimary() {
-        return artifactoryHome.isHaConfigured() && artifactoryHome.getHaNodeProperties() != null
-                && artifactoryHome.getHaNodeProperties().isPrimary();
-    }
-
-    private boolean isDatabaseConversionInterested() {
-        return vp.getOriginalDatabaseVersion() != null && !vp.getOriginalDatabaseVersion().isCurrent();
-    }
-
-    private boolean isLocalHomeInterested() {
-        for (ArtifactoryConverterAdapter converter : localHomeConverters) {
-            if (converter.isInterested(vp.getOriginalHome(), vp.getRunning())) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private boolean isHaInterested() {
-        if (!artifactoryHome.isHaConfigured() || !isConfiguredPrimary()) {
-            return false;
-        }
-        for (ArtifactoryConverterAdapter converter : clusterHomeConverters) {
-            if (converter.isInterested(vp.getOriginalHa(), vp.getRunning())) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public List<ArtifactoryConverterAdapter> getLocalHomeConverters() {
-        return localHomeConverters;
-    }
-
-    public List<ArtifactoryConverterAdapter> getClusterHomeConverters() {
-        return clusterHomeConverters;
-    }
-
-    private static enum LocalConverterTaskType {
-        convert, backup, revert, clean
-    }
-
-}
diff --git a/base/common/src/main/java/org/artifactory/converters/VersionProviderImpl.java b/base/common/src/main/java/org/artifactory/converters/VersionProviderImpl.java
deleted file mode 100644
index 79fffe2..0000000
--- a/base/common/src/main/java/org/artifactory/converters/VersionProviderImpl.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.converters;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.storage.db.properties.model.DbProperties;
-import org.artifactory.storage.db.properties.service.ArtifactoryCommonDbPropertiesService;
-import org.artifactory.version.ArtifactoryVersion;
-import org.artifactory.version.ArtifactoryVersionReader;
-import org.artifactory.version.CompoundVersionDetails;
-import org.artifactory.version.ConfigVersion;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.Properties;
-
-import static java.lang.String.valueOf;
-import static org.artifactory.version.ArtifactoryVersion.*;
-
-/**
- * @author Gidi Shabat
- */
-public class VersionProviderImpl implements VersionProvider {
-    private static final Logger log = LoggerFactory.getLogger(VersionProviderImpl.class);
-
-    /**
-     * The current running version, discovered during runtime.
-     */
-    private CompoundVersionDetails runningVersion;
-    /**
-     * The initial version from the local home properties file on startup. Effective only until the conversion starts.
-     */
-    private CompoundVersionDetails originalHomeVersion;
-
-    /**
-     * The initial version from the cluster home properties file on startup. Effective only until the conversion starts.
-     */
-    private CompoundVersionDetails originalHaVersion;
-
-    /**
-     * The initial version from the database. Not null only after the call to loadDbVersion() method which
-     * occurs first thing after access to the database is allowed.
-     */
-    private CompoundVersionDetails originalDatabaseVersion;
-
-    private ArtifactoryHome artifactoryHome;
-
-
-    public VersionProviderImpl(ArtifactoryHome artifactoryHome) {
-        this.artifactoryHome = artifactoryHome;
-        init();
-    }
-
-    private void init() {
-        try {
-            runningVersion = artifactoryHome.readRunningArtifactoryVersion();
-            log.debug("Current running version is : {}", runningVersion.getVersion().name());
-            originalHomeVersion = runningVersion;
-            originalHaVersion = runningVersion;
-            updateOriginalHomeVersion();
-            verifyVersion(originalHomeVersion.getVersion(), runningVersion.getVersion());
-            log.debug("Last Artifactory home version is: {}", originalHomeVersion.getVersion().name());
-            if (artifactoryHome.isHaConfigured()) {
-                updateOriginalHaVersion();
-                verifyVersion(originalHaVersion.getVersion(), runningVersion.getVersion());
-                log.debug("Last Artifactory cluster home version is: {}", originalHaVersion.getVersion().name());
-            }
-        } catch (Exception e) {
-            log.error("Fail to load artifactory.properties", e);
-        }
-    }
-
-    /**
-     * Loads the original version from the database.
-     * Calling this method is allowed only after the DBService "PostConstruct", before this stage there is no access
-     * to the database and any try to access it wil fail.
-     */
-    public void loadDbVersion() {
-        try {
-            ArtifactoryCommonDbPropertiesService dbPropertiesService = getArtifactoryCommonDbPropertiesService();
-            boolean dbPropertiesTableExists = dbPropertiesService.isDbPropertiesTableExists();
-            if (dbPropertiesTableExists) {
-                DbProperties dbProperties = dbPropertiesService.getDbProperties();
-                // If the db_properties table exists, but no version found the we can't conclude the original version
-                // in such case the vest choice is to assume that the home version is equals to the database version.
-                if (dbProperties == null) {
-                    if (ConstantValues.test.getBoolean()) {
-                        String version = v441.name();
-                        String revision = valueOf(v441.getRevision());
-                        originalDatabaseVersion = new CompoundVersionDetails(v441, version, revision, 1387059697274l);
-                    } else {
-                        // In this case it is ok to assume that the version is 3.1.0 since the DB_PROPERTIES table exists and above is
-                        // allowed only from version 3.0.0 and no conversion has been added between version 3.0.0 to 3.1.0
-                        // except the addition of DB_PROPERTIES and the ARTIFACTORY_SERVERS tables.
-                        String version = v310.name();
-                        String revision = valueOf(v310.getRevision());
-                        long timestampOfVersion311 = 1387059697274l;
-                        originalDatabaseVersion = new CompoundVersionDetails(v310, version, revision,
-                                timestampOfVersion311);
-                    }
-                } else {
-                    originalDatabaseVersion = getDbCompoundVersionDetails(dbProperties);
-                }
-            } else {
-                // In this case it is ok to assume that the version is 3.0.4 since upgrade to 3.1.0 and above is
-                // allowed only from version 3.0.0 and no conversion has been added between version 3.0.0 to 3.0.4.
-                log.info("Failed to find the db_properties table: assuming that the db version is 3.0.4");
-                String version = v304.name();
-                String revision = valueOf(v304.getRevision());
-                long timestampOfVersion304 = 1382872758304l;
-                originalDatabaseVersion = new CompoundVersionDetails(v304, version, revision, timestampOfVersion304);
-            }
-            verifyVersion(originalDatabaseVersion.getVersion(), runningVersion.getVersion());
-            log.debug("Last Artifactory database version is: {}", originalDatabaseVersion.getVersion().name());
-        } catch (Exception e) {
-            log.error("Failed to resolve DbProperties from database", originalDatabaseVersion.getVersion().name());
-            throw new RuntimeException(e.getMessage(), e);
-        }
-    }
-
-    private ArtifactoryCommonDbPropertiesService getArtifactoryCommonDbPropertiesService() {
-        return ContextHelper.get().beanForType(
-                ArtifactoryCommonDbPropertiesService.class);
-    }
-
-    @Override
-    public CompoundVersionDetails getOriginalHome() {
-        return originalHomeVersion;
-    }
-
-    @Override
-    public CompoundVersionDetails getOriginalHa() {
-        return originalHaVersion;
-    }
-
-    @Override
-    public CompoundVersionDetails getRunning() {
-        return runningVersion;
-    }
-
-    @Override
-    public boolean isOriginalDatabaseVersionReady() {
-        return originalDatabaseVersion != null;
-    }
-
-    /**
-     * The originalServiceVersion value is null until access to db is allowed
-     *
-     * @return
-     */
-    @Override
-    public CompoundVersionDetails getOriginalDatabaseVersion() {
-        if (originalDatabaseVersion == null) {
-            throw new RuntimeException(
-                    "The original version from the database is not ready, use this method after dbService initialization");
-        }
-        return originalDatabaseVersion;
-    }
-
-    private void updateOriginalHaVersion() throws IOException {
-        File artifactoryPropertiesFile = artifactoryHome.getHaArtifactoryPropertiesFile();
-        // If the properties file doesn't exists, then create it
-        if (!artifactoryPropertiesFile.exists()) {
-            artifactoryHome.writeBundledHaArtifactoryProperties();
-        }
-        // Load the original home version
-        originalHaVersion = ArtifactoryVersionReader.read(artifactoryPropertiesFile);
-    }
-
-    private void updateOriginalHomeVersion() throws IOException {
-        File artifactoryPropertiesFile = artifactoryHome.getHomeArtifactoryPropertiesFile();
-        // If the properties file doesn't exists, then create it
-        if (!artifactoryPropertiesFile.exists()) {
-            artifactoryHome.writeBundledHomeArtifactoryProperties();
-        }
-        // Load the original home version
-        originalHomeVersion = ArtifactoryVersionReader.read(artifactoryPropertiesFile);
-    }
-
-    void reloadArtifactorySystemProperties(File artifactoryPropertiesFile) throws IOException {
-        Properties properties = new Properties();
-        try (FileInputStream inStream = new FileInputStream(artifactoryPropertiesFile)) {
-            properties.load(inStream);
-        }
-        for (Object o : properties.keySet()) {
-            artifactoryHome.getArtifactoryProperties().setProperty((String) o, properties.getProperty((String) o));
-        }
-    }
-
-    public static CompoundVersionDetails getDbCompoundVersionDetails(DbProperties dbProperties) {
-        return ArtifactoryVersionReader.getCompoundVersionDetails(
-                dbProperties.getArtifactoryVersion(),
-                getRevisionStringFromInt(dbProperties.getArtifactoryRevision()),
-                "" + dbProperties.getArtifactoryRelease());
-    }
-
-    private static String getRevisionStringFromInt(int rev) {
-        if (rev <= 0 || rev == Integer.MAX_VALUE) {
-            return "" + Integer.MAX_VALUE;
-        }
-        return "" + rev;
-    }
-
-    public void verifyVersion(ArtifactoryVersion original, ArtifactoryVersion running) {
-        if (!running.equals(original)) {
-            // the version written in the jar and the version read from the data directory/DB are different
-            // make sure the version from the data directory/DB is supported by the current deployed artifactory
-            ConfigVersion actualConfigVersion = ConfigVersion.findCompatibleVersion(original);
-            //No compatible version -> conversion needed, but supported only from v4 onward
-            if (!actualConfigVersion.isCurrent()) {
-                String msg = "The stored version for (" + original.getValue() + ") " +
-                        "is not up-to-date with the currently deployed Artifactory (" +
-                        running + ")";
-                if (!actualConfigVersion.isAutoUpdateCapable()) {
-                    //Cannot convert
-                    msg += ": no automatic conversion is possible. Exiting now...";
-                    throw new IllegalStateException(msg);
-                }
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/cron/CronUtils.java b/base/common/src/main/java/org/artifactory/cron/CronUtils.java
deleted file mode 100644
index a301013..0000000
--- a/base/common/src/main/java/org/artifactory/cron/CronUtils.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package org.artifactory.cron;
-
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-import org.apache.commons.lang.StringUtils;
-import org.joda.time.DateTime;
-import org.joda.time.Minutes;
-import org.quartz.CronExpression;
-
-import javax.annotation.Nullable;
-import java.text.ParseException;
-import java.util.Date;
-
-/**
- * @author Chen Keinan
- */
-public abstract class CronUtils {
-
-    private static final Minutes MINIMUM_ALLOWED_MINUTES = Minutes.minutes(5);
-
-    private CronUtils() {
-        // utility class
-    }
-
-    /**
-     * Returns a boolean value representing the validity of a given Cron Expression
-     *
-     * @param cronExpression A Cron Expression
-     * @return boolean - Is given expression valid
-     */
-    public static boolean isValid(String cronExpression) {
-        return CronExpression.isValidExpression(cronExpression);
-    }
-
-    /**
-     * Returns a String value representing the validity message given invalid Cron Expression
-     *
-     * @param cronExpression A Cron Expression
-     * @return String - the invalid message returned when expression is not valid, or null if valid
-     */
-    public static
-    @Nullable
-    String getInvalidMessage(String cronExpression) {
-        try {
-            new CronExpression(cronExpression);
-            return null;
-        } catch (ParseException pe) {
-            return pe.getMessage();
-        }
-    }
-
-    /**
-     * Returns the next execution time based on the given Cron Expression
-     *
-     * @param cronExpression A Cron Expression
-     * @return Date - The next time the given Cron Expression should fire
-     */
-    public static Date getNextExecution(String cronExpression) {
-        try {
-            CronExpression cron = new CronExpression(cronExpression);
-            return cron.getNextValidTimeAfter(new Date(System.currentTimeMillis()));
-        } catch (ParseException e) {
-            throw new IllegalArgumentException(e.getMessage());
-        }
-    }
-
-    /**
-     * Checks if the given cron expression interval is less or equals to a certain minimum.
-     *
-     * @param cronExpression the cron expression to check
-     */
-    public static boolean isCronIntervalLessThanMinimum(String cronExpression) {
-        try {
-            // If input is empty or invalid simply return false as default
-            if (StringUtils.isBlank(cronExpression) || !isValid(cronExpression)) {
-                return false;
-            }
-
-            CronExpression cron = new CronExpression(cronExpression);
-            final Date firstExecution = cron.getNextValidTimeAfter(new Date(System.currentTimeMillis()));
-            final Date secondExecution = cron.getNextValidTimeAfter(firstExecution);
-
-            Minutes intervalMinutes = Minutes.minutesBetween(new DateTime(firstExecution),
-                    new DateTime(secondExecution));
-            return !intervalMinutes.isGreaterThan(MINIMUM_ALLOWED_MINUTES);
-        } catch (ParseException e) {
-            throw new IllegalArgumentException(e.getMessage());
-        }
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/exception/InvalidNameException.java b/base/common/src/main/java/org/artifactory/exception/InvalidNameException.java
deleted file mode 100644
index a895472..0000000
--- a/base/common/src/main/java/org/artifactory/exception/InvalidNameException.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.exception;
-
-import java.nio.file.InvalidPathException;
-
-/**
- * Thrown whenever an invalid name is used.
- *
- * @author Yossi Shaul
- */
-public class InvalidNameException extends InvalidPathException {
-
-    public InvalidNameException(String name, String message, int index) {
-        super(name, message, index);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/exception/ValidationException.java b/base/common/src/main/java/org/artifactory/exception/ValidationException.java
deleted file mode 100644
index 5104aaf..0000000
--- a/base/common/src/main/java/org/artifactory/exception/ValidationException.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.artifactory.exception;
-
-/**
- * Exception thrown on invalid input from a UI control.
- *
- * @author Yossi Shaul
- */
-public class ValidationException extends Exception {
-    private Integer index;
-    /**
-     * Builds a new validation exception with message to display to the user.
-     *
-     * @param uiMessage Message to display in the UI
-     */
-    public ValidationException(String uiMessage) {
-        super(uiMessage);
-    }
-    /**
-     * Builds a new validation exception with message to display to the user.
-     *
-     * @param uiMessage Message to display in the UI
-     * @param index the index of invalid char
-     */
-    public ValidationException(String uiMessage, int index) {
-        super(uiMessage);
-        this.index = Integer.valueOf(index);
-    }
-
-    /**
-     * @return the index of invalid char
-     */
-    public int getIndex() {
-        return index == null ? -1 : index.intValue();
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/features/VersionFeature.java b/base/common/src/main/java/org/artifactory/features/VersionFeature.java
deleted file mode 100644
index 308096d..0000000
--- a/base/common/src/main/java/org/artifactory/features/VersionFeature.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.features;
-
-/**
- * Created by michaelp on 10/1/15.
- */
-
-import org.artifactory.api.config.VersionInfo;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-import java.io.Serializable;
-
-/**
- * Single VersionFeature
- */
- at XmlType(name = "VersionFeature")
-public class VersionFeature implements Serializable {
-
-    @XmlElement(required = true)
-    private String name;
-    @XmlElement(required = true)
-    private VersionInfo availableFrom;
-
-    /**
-     * serialization .ctr
-     */
-    public VersionFeature() {
-    }
-
-    /**
-     * @param name feature name
-     * @param availableFrom version this feature is available from (inclusive)
-     */
-    public VersionFeature(String name, VersionInfo availableFrom) {
-        this.name = name;
-        this.availableFrom = availableFrom;
-    }
-
-    /**
-     * @return {@link VersionInfo} that this {@link VersionFeature}
-     *         is available from
-     */
-    public VersionInfo getAvailableFrom() {
-        return availableFrom;
-    }
-
-    /**
-     * @return feature name
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Defines equality of {@link VersionFeature}
-     */
-    @Override
-    public boolean equals(Object other) {
-        if (this == other) return true;
-        if (!(other instanceof VersionFeature)) return false;
-
-        VersionFeature that = (VersionFeature)other;
-        return this.getName().equals(that.getName()) &&
-                this.getAvailableFrom().compareTo(that.getAvailableFrom()) == 0;
-    }
-}
-
diff --git a/base/common/src/main/java/org/artifactory/features/VersionFeatures.java b/base/common/src/main/java/org/artifactory/features/VersionFeatures.java
deleted file mode 100644
index 5c1effa..0000000
--- a/base/common/src/main/java/org/artifactory/features/VersionFeatures.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.features;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.io.IOUtils;
-import org.artifactory.api.config.VersionInfo;
-import org.artifactory.common.ArtifactoryHome;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Unmarshaller;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlRootElement;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * Version features descriptor
- *
- * @author Michael Pasternak
- */
- at XmlRootElement
- at XmlAccessorType(XmlAccessType.FIELD)
-public class VersionFeatures {
-
-    transient private static final Logger log = LoggerFactory.getLogger(VersionFeatures.class);
-
-    transient public static final VersionInfo v4_1 = new VersionInfo("4.1");
-    transient public static final VersionInfo v4_2 = new VersionInfo("4.2");
-    transient public static final String FEATURES_CONFIG_PATH = "/features/";
-
-    @XmlElementWrapper(name = "features")
-    @XmlElement(name = "feature", required = false)
-    private List<VersionFeature> features;
-
-    /**
-     * serialization .ctr
-     */
-    protected VersionFeatures() {
-        features = new LinkedList<>();
-    }
-
-    /**
-     * Builds {@link VersionFeatures}
-     *
-     * @param versionFeatures a collection of {@link VersionFeature}
-     */
-    public VersionFeatures(VersionFeature... versionFeatures) {
-        this();
-        for(VersionFeature versionFeature : versionFeatures) {
-            features.add(versionFeature);
-        }
-    }
-
-    /**
-     * Builds master VersionFeatures container by
-     * merging other {@link VersionFeatures} into this VersionFeatures
-     *
-     * @param versionFeatures a collection of {@link VersionFeatures}
-     */
-    public VersionFeatures(VersionFeatures... versionFeatures) {
-        this();
-        for(VersionFeatures versionFeature : versionFeatures) {
-            features.addAll(versionFeature.getFeatures());
-        }
-    }
-
-    /**
-     * Loads {@link VersionFeatures} from the resource
-     *
-     * @param configPath a path to resource with {@link VersionFeatures}
-     */
-    public VersionFeatures(String configPath) {
-        this();
-        VersionFeatures resourceConfig = getResourceConfig(configPath);
-        if (resourceConfig != null) {
-            List<VersionFeature> features = resourceConfig.getFeatures();
-            if (features != null) {
-                this.features.addAll(features);
-            } else {
-                log.debug("No features were loaded from \"{}\"", configPath);
-            }
-        } else {
-            log.debug("No resourceConfig were loaded from \"{}\"", configPath);
-        }
-    }
-
-    /**
-     * Returns features available for the given version
-     *
-     * @param version {@link VersionInfo} to check from (inclusive)
-     *
-     * @return List<VersionFeature>
-     */
-    public List<VersionFeature> getFeaturesByVersion(VersionInfo version) {
-        if(version == null)
-            return Lists.newLinkedList();
-
-        return features.parallelStream()
-                .filter(n -> n.getAvailableFrom().compareTo(version) >= 0)
-                .collect(Collectors.toCollection(LinkedList::new));
-
-    }
-
-    /**
-     * @return all {@link VersionFeature} held by this container
-     */
-    public List<VersionFeature> getFeatures() {
-        return features;
-    }
-
-    /**
-     * Fetches features resource config
-     *
-     * @param configStream a stream from config resource
-     *
-     * @return {@link VersionFeatures} implementator
-     */
-    private VersionFeatures getResourceConfig(InputStream configStream) {
-        VersionFeatures versionFeatures = null;
-        JAXBContext jaxbContext = null;
-        Unmarshaller jaxbUnmarshaller = null;
-        String errorMsg = "Loading VersionFeatures has failed";
-        try {
-            jaxbContext = JAXBContext.newInstance(VersionFeatures.class);
-            jaxbUnmarshaller = jaxbContext.createUnmarshaller();
-            versionFeatures = (VersionFeatures) jaxbUnmarshaller.unmarshal(configStream);
-        } catch (JAXBException e) {
-            log.error(errorMsg, e);
-        } finally {
-            IOUtils.closeQuietly(configStream);
-        }
-        if (versionFeatures == null) {
-            log.error(errorMsg);
-        }
-        return versionFeatures;
-    }
-
-    /**
-     * Fetches features resource config
-     *
-     * @param configPath the name of specific "features" config resource
-     *
-     * @return {@link VersionFeatures} implementator
-     */
-    private VersionFeatures getResourceConfig(String configPath) {
-        String errorMsg = "Cannot read VersionFeatures config \"" + configPath + "\"";
-        log.debug("Loading SmartRepoVersionFeatures from \"{}\"", configPath);
-        try {
-            URL resource = ArtifactoryHome.class.getResource(FEATURES_CONFIG_PATH + configPath);
-            if (resource != null) {
-                InputStream configStream = resource.openStream();
-                return getResourceConfig(configStream);
-            } else {
-                throw new IllegalStateException(errorMsg);
-            }
-        } catch (IOException e) {
-            log.error(errorMsg, e);
-            throw new IllegalStateException(errorMsg, e);
-        }
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/features/matrix/SmartRepoVersionFeatures.java b/base/common/src/main/java/org/artifactory/features/matrix/SmartRepoVersionFeatures.java
deleted file mode 100644
index 8793ab2..0000000
--- a/base/common/src/main/java/org/artifactory/features/matrix/SmartRepoVersionFeatures.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.features.matrix;
-
-import org.artifactory.features.VersionFeatures;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * SmartRepo Version features descriptor
- *
- * @author Michael Pasternak
- */
- at Lazy(true)
- at Scope(BeanDefinition.SCOPE_SINGLETON)
- at Component()
-public class SmartRepoVersionFeatures extends VersionFeatures {
-
-    transient private static final Logger log = LoggerFactory.getLogger(SmartRepoVersionFeatures.class);
-
-    transient public static final String SYNC_PROPERTIES = "SYNC_PROPERTIES";
-    transient public static final String LIST_CONTENT = "LIST_CONTENT";
-    transient public static final String SYNC_STATISTICS = "SYNC_STATISTICS";
-    transient public static final String DETECT_ORIGIN_ABSENCE = "DETECT_ORIGIN_ABSENCE";
-
-    public SmartRepoVersionFeatures() {
-        super("smartrepo-features.xml");
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/file/lock/ArtifactoryLockFile.java b/base/common/src/main/java/org/artifactory/file/lock/ArtifactoryLockFile.java
deleted file mode 100644
index 9961097..0000000
--- a/base/common/src/main/java/org/artifactory/file/lock/ArtifactoryLockFile.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.file.lock;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.nio.channels.FileChannel;
-import java.nio.channels.FileLock;
-
-/**
- * Assures this is the one and only instance of Artifactory running over the {@code artifactoryHome}
- *
- * @author mamo
- */
-public class ArtifactoryLockFile implements LockFile {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryLockFile.class);
-
-    private File file;
-    private RandomAccessFile randomAccessFile;
-    private FileLock fileLock;
-
-    public ArtifactoryLockFile(File lockFile) {
-        file = lockFile;
-    }
-
-    public LockFile tryLock() {
-        boolean existing = file.exists();
-
-        try {
-            randomAccessFile = new RandomAccessFile(file, "rw");
-            fileLock = randomAccessFile.getChannel().tryLock();
-        } catch (Exception e) {
-            closeRandomAccessFile();
-            throw new RuntimeException("Could not create lock file. [" + file + "]", e);
-        }
-
-        if (fileLock == null) {
-            throw new RuntimeException("Another instance of Artifactory is already running. " +
-                    "The lock file is locked by another process. [" + file + "]");
-        }
-
-        if (existing) {
-            log.warn("Found existing lock file. Artifactory was not shutdown properly. [" + file + "]");
-        }
-
-        return this;
-    }
-
-    public void release() {
-        if (fileLock != null) {
-            try {
-                FileChannel channel = fileLock.channel();
-                fileLock.release();
-                channel.close();
-            } catch (IOException e) {
-                log.warn("Could not release lock. [" + file + "]", e);
-            }
-            closeRandomAccessFile();
-        }
-
-        if (!file.delete()) {
-            log.warn("Could not delete lock file. [" + file + "]");
-        }
-        fileLock = null;
-        file = null;
-    }
-
-    public boolean isLockedByMe() {
-        return fileLock != null;
-    }
-
-    private void closeRandomAccessFile() {
-        if (randomAccessFile != null) {
-            try {
-                randomAccessFile.close();
-            } catch (IOException e) {
-                log.warn("Could not close lock file. [" + file + "]", e.getMessage());
-            }
-            randomAccessFile = null;
-        }
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/file/lock/LockFile.java b/base/common/src/main/java/org/artifactory/file/lock/LockFile.java
deleted file mode 100644
index 9827eaa..0000000
--- a/base/common/src/main/java/org/artifactory/file/lock/LockFile.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.file.lock;
-
-/**
- * @author Gidi Shabat
- */
-public interface LockFile {
-    LockFile tryLock();
-
-    void release();
-
-    boolean isLockedByMe();
-}
diff --git a/base/common/src/main/java/org/artifactory/file/lock/LockFileForNoneLockingFileSystem.java b/base/common/src/main/java/org/artifactory/file/lock/LockFileForNoneLockingFileSystem.java
deleted file mode 100644
index 9c5af12..0000000
--- a/base/common/src/main/java/org/artifactory/file/lock/LockFileForNoneLockingFileSystem.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.file.lock;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-
-/**
- * Allows to lock files in none locking file systems such as NFS
- * The usage of this class is recommended only in none locking file systems.
- *
- * @author Gidi Shabat
- */
-public class LockFileForNoneLockingFileSystem implements LockFile {
-    private static final Logger log = LoggerFactory.getLogger(LockFileForNoneLockingFileSystem.class);
-    private File file;
-    private boolean lock;
-
-    public LockFileForNoneLockingFileSystem(File lockFile) {
-        file = lockFile;
-    }
-
-    public LockFile tryLock() {
-        // If lock is already obtained to me then return successfully
-        if (isLockedByMe()) {
-            log.debug("No need to obtaining lock file: {}. Lock already obtained.", file);
-            return this;
-        }
-        // Check if the lock is not obtained by other server
-        log.debug("Obtaining lock file: {}.", file);
-        if (isLockFileExists()) {
-            throw new RuntimeException("Another instance of Artifactory is already running. " +
-                    "The lock file is locked by another process. [" + file + "]");
-        }
-        try {
-            file.createNewFile();
-        } catch (Exception e) {
-            throw new RuntimeException("Could not create lock file. [" + file + "]", e);
-        }
-        lock = true;
-        log.debug("Lock file: {} has been obtained ", file);
-        return this;
-    }
-
-    private boolean isLockFileExists() {
-        return file.exists();
-    }
-
-    public void release() {
-        if (!isLockedByMe()) {
-            throw new RuntimeException("Fail to release the lock. The lock file is locked by another process." +
-                    " [" + file + "]");
-        }
-        try {
-            log.debug("Releasing lock file: {}.", file);
-            file.delete();
-            log.debug("Lock file: {} has been released.", file);
-        } catch (Exception e) {
-            log.warn("Could not release lock. [" + file + "]", e);
-        } finally {
-            lock = false;
-        }
-    }
-
-    public boolean isLockedByMe() {
-        return lock;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/io/FileUtils.java b/base/common/src/main/java/org/artifactory/io/FileUtils.java
deleted file mode 100644
index 6eeffb1..0000000
--- a/base/common/src/main/java/org/artifactory/io/FileUtils.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package org.artifactory.io;
-
-import org.codehaus.plexus.util.IOUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * @author Chen Keinan
- */
-public class FileUtils {
-    private static final int TEMP_DIR_CREATE_ATTEMPTS = 10;
-    private static final Logger log = LoggerFactory.getLogger(FileUtils.class);
-    private static final long MEGABYTE = 1024L * 1024L;
-    public static long bytesToMeg(long bytes) {
-        return bytes / MEGABYTE;
-    }
-
-    /**
-     * write byte array to file
-     *
-     * @param filename file name
-     * @param content  byte array
-     */
-    public static void writeFile(String filename, byte[] content) {
-        File file = new File(filename);
-        FileOutputStream fop = null;
-        try {
-            /// check if file exist
-            if (!file.exists()) {
-                if (file.createNewFile()) {
-                    fop = new FileOutputStream(file);
-                    fop.write(content);
-                    fop.flush();
-                }
-            }
-        } catch (Exception e) {
-            throw new IllegalStateException("Cannot write file to temporary directory");
-        } finally {
-            IOUtil.close(fop);
-        }
-    }
-
-
-    /**
-     * copy input stream to file
-     *
-     * @param in   - input stream
-     * @param file - files
-     */
-    public static void copyInputStreamToFile(InputStream in, File file) {
-        OutputStream out = null;
-        try {
-            out = new FileOutputStream(file);
-            byte[] buf = new byte[1024];
-            int len;
-            while ((len = in.read(buf)) > 0) {
-                out.write(buf, 0, len);
-            }
-        } catch (Exception e) {
-            throw new IllegalStateException("Cannot copy file input stream");
-        } finally {
-            IOUtil.close(out);
-            IOUtil.close(in);
-        }
-    }
-
-    public static long bytesToMB(long sizeInBytes) {
-        return sizeInBytes / (1024 * 1024);
-    }
-
-    /**
-     * Create directory (if not already exist)
-     *
-     * @param dir a directory to be created
-     */
-    public static void createDirectory(File dir) {
-        if(!dir.exists()) {
-            for (int i = 0; i < TEMP_DIR_CREATE_ATTEMPTS; i++) {
-                if (dir.mkdir()) {
-                    break;
-                }
-            }
-            if(!dir.exists()) {
-                throw new IllegalStateException("Cannot create temporary directory");
-            }
-        }
-        dir.setWritable(true);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/ivy/IvyNaming.java b/base/common/src/main/java/org/artifactory/ivy/IvyNaming.java
deleted file mode 100644
index f24b3a0..0000000
--- a/base/common/src/main/java/org/artifactory/ivy/IvyNaming.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ivy;
-
-import org.apache.commons.lang.StringUtils;
-
-public abstract class IvyNaming {
-
-    public static final String IVY_XML = "ivy.xml";
-
-    private IvyNaming() {
-        // utility class
-    }
-
-    public static boolean isIvyFileName(String fileName) {
-        if (StringUtils.isBlank(fileName)) {
-            return false;
-        }
-        return IvyNaming.IVY_XML.equals(fileName) || (fileName.startsWith("ivy-") && fileName.endsWith(".xml")) ||
-                fileName.endsWith(".ivy") ||
-                fileName.endsWith("-" + IVY_XML);
-    }
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/logging/LoggingService.java b/base/common/src/main/java/org/artifactory/logging/LoggingService.java
deleted file mode 100644
index e142004..0000000
--- a/base/common/src/main/java/org/artifactory/logging/LoggingService.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.logging;
-
-import org.artifactory.api.config.ImportableExportable;
-
-/**
- * Logging service main interface
- *
- * @author Noam Y. Tenne
- */
-public interface LoggingService extends ImportableExportable {
-}
diff --git a/base/common/src/main/java/org/artifactory/maven/MavenModelUtils.java b/base/common/src/main/java/org/artifactory/maven/MavenModelUtils.java
deleted file mode 100644
index 014a51e..0000000
--- a/base/common/src/main/java/org/artifactory/maven/MavenModelUtils.java
+++ /dev/null
@@ -1,532 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.io.FilenameUtils;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
-import org.apache.ivy.core.module.id.ModuleRevisionId;
-import org.apache.maven.artifact.repository.metadata.Metadata;
-import org.apache.maven.artifact.repository.metadata.Snapshot;
-import org.apache.maven.artifact.repository.metadata.SnapshotVersion;
-import org.apache.maven.artifact.repository.metadata.Versioning;
-import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader;
-import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Writer;
-import org.apache.maven.model.Model;
-import org.apache.maven.model.Parent;
-import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
-import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.maven.MavenArtifactInfo;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.ivy.IvyNaming;
-import org.artifactory.ivy.IvyService;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-import org.artifactory.util.PathUtils;
-import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nonnull;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.util.Date;
-import java.util.SortedSet;
-import java.util.jar.JarEntry;
-import java.util.jar.JarInputStream;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * @author Yoav Landman
- */
-public abstract class MavenModelUtils {
-    public static final String UTF8 = "utf-8";
-    private static final Logger log = LoggerFactory.getLogger(MavenModelUtils.class);
-    private static final DateTimeFormatter UNIQUE_SNAPSHOT_FORMATTER =
-            DateTimeFormat.forPattern("yyyyMMdd.HHmmss").withZoneUTC();
-    //Uses lazy evaluation of the version (+?)
-    //see: http://www.regular-expressions.info/reference.html
-    //For testing, see: http://www.cis.upenn.edu/~matuszek/General/RegexTester/regex-tester.html
-    //Should be used with standard artifact names:
-    //artifactId-version.ext
-    //artifactId-version-classifier.ext
-    //groups: 1-artifactId; 2-version; 5 or 7-classifier; 8-packaging (file extension).
-    //note that you may have a multi-part version value, e.g. 1.0-rc3, in this case check that there
-    //is a '-' with a value and that the classifier is not empty and simply append it.
-    private static final Pattern ARTIFACT_NAME_PATTERN =
-            Pattern.compile("(.+?)-(\\d.+?(-SNAPSHOT)?)(-(.+?))?(-(.+?))?\\.(\\w{1,}?)");
-
-    private MavenModelUtils() {
-        // utility class
-    }
-
-    /**
-     * @param time Time to format
-     * @return Maven unique snapshot version timestamp for the input date. For example: 20130603.113821
-     */
-    public static String dateToUniqueSnapshotTimestamp(long time) {
-        return UNIQUE_SNAPSHOT_FORMATTER.print(time);
-    }
-
-    /**
-     * @param dateTime Time to format
-     * @return Maven unique snapshot timestamp for the input date. For example: 20130603.113821
-     */
-    public static Date uniqueSnapshotTimestampToDate(String dateTime) {
-        return UNIQUE_SNAPSHOT_FORMATTER.parseDateTime(dateTime).toDate();
-    }
-
-    /**
-     * Creates a maven <code>Metadata</code> out of a string.
-     *
-     * @param metadataAsString String representing content of maven-metadata.xml
-     * @return Metadata object created from the input string
-     * @throws java.io.IOException If the input string is not a valid maven metadata
-     */
-    public static Metadata toMavenMetadata(String metadataAsString) throws IOException {
-        return toMavenMetadata(new StringReader(metadataAsString));
-    }
-
-    /**
-     * Creates a maven <code>Metadata</code> out of an input stream and will close the stream.
-     *
-     * @param metadataStream An input stream representing content of maven-metadata.xml
-     * @return Metadata object created from the input stream
-     * @throws java.io.IOException If the input stream is not a valid maven metadata
-     */
-    public static Metadata toMavenMetadata(InputStream metadataStream) throws IOException {
-        return toMavenMetadata(new InputStreamReader(metadataStream, UTF8));
-    }
-
-    /**
-     * Creates a maven <code>Metadata</code> out of a <code>java.io.Reader</code> and will close the reader.
-     *
-     * @param reader Reader representing content of maven-metadata.xml
-     * @return Metadata object created from the reader
-     * @throws java.io.IOException If the input reader doesn't holds a valid maven metadata
-     */
-    public static Metadata toMavenMetadata(Reader reader) throws IOException {
-        MetadataXpp3Reader metadataReader = new MetadataXpp3Reader();
-        try {
-            return metadataReader.read(reader, false);
-        } catch (XmlPullParserException e) {
-            throw new IOException("Failed to parse metadata: " + e.getMessage());
-        } finally {
-            IOUtils.closeQuietly(reader);
-        }
-    }
-
-    /**
-     * Build custom maven-metadata.xml according to a specific version.
-     *
-     * @param moduleInfo The original {@code ModuleInfo} to assemble the maven metadata according to the same
-     *                   gid,aid,and version, {@link org.apache.maven.artifact.repository.metadata.Versioning#setLastUpdatedTimestamp(java.util.Date)} is updated to now. and
-     *                   the build number and timestamp in the {@link org.apache.maven.artifact.repository.metadata.Snapshot} is set according to the name.
-     * @param fileName   The file name
-     * @return The custom maven-metadata.xml
-     */
-    public static Metadata buildSnapshotMavenMetadata(ModuleInfo moduleInfo, String fileName) {
-        Metadata metadata = new Metadata();
-        metadata.setGroupId(moduleInfo.getOrganization());
-        metadata.setArtifactId(moduleInfo.getModule());
-        metadata.setVersion(moduleInfo.getBaseRevision() + "-" + moduleInfo.getFolderIntegrationRevision());
-        Versioning versioning = new Versioning();
-        metadata.setVersioning(versioning);
-        versioning.setLastUpdatedTimestamp(new Date());
-        Snapshot snapshot = new Snapshot();
-        versioning.setSnapshot(snapshot);
-        snapshot.setBuildNumber(MavenNaming.getUniqueSnapshotVersionBuildNumber(fileName));
-        snapshot.setTimestamp(MavenNaming.getUniqueSnapshotVersionTimestamp(fileName));
-        if (ConstantValues.mvnMetadataVersion3Enabled.getBoolean()) {
-            SnapshotVersion snapshotVersion = new SnapshotVersion();
-            snapshotVersion.setUpdated(StringUtils.remove(snapshot.getTimestamp(), '.'));
-            snapshotVersion.setVersion(moduleInfo.getBaseRevision() + "-" +
-                    moduleInfo.getFileIntegrationRevision());
-            //Should always be a pom, since this method is called only by PropertiesAddonImpl.assembleDynamicMetadata
-            snapshotVersion.setExtension(moduleInfo.getExt());
-            versioning.setSnapshotVersions(Lists.newArrayList(snapshotVersion));
-        }
-        return metadata;
-    }
-
-    /**
-     * Create xml string from the input <code>Metadata</code>.
-     *
-     * @param metadata Maven metadata object
-     * @return Xml string for the input metadata
-     */
-    public static String mavenMetadataToString(Metadata metadata) throws IOException {
-        MetadataXpp3Writer writer = new MetadataXpp3Writer();
-        StringWriter stringWriter = new StringWriter();
-        writer.write(stringWriter, metadata);
-        return stringWriter.toString();
-    }
-
-    /**
-     * @param artifactInfo Maven artifact info to build the model from
-     * @return A maven {@link Model} matching the values of the maven artifact info.
-     */
-    public static Model toMavenModel(MavenArtifactInfo artifactInfo) {
-        return new MavenPomBuilder().groupId(artifactInfo.getGroupId()).artifactId(artifactInfo.getArtifactId())
-                .version(artifactInfo.getVersion()).packaging(artifactInfo.getType()).build();
-    }
-
-    public static String mavenModelToString(Model model) {
-        MavenXpp3Writer writer = new MavenXpp3Writer();
-        StringWriter stringWriter = new StringWriter();
-        try {
-            writer.write(stringWriter, model);
-        } catch (IOException e) {
-            throw new RepositoryRuntimeException("Failed to convert maven model to string", e);
-        }
-        return stringWriter.toString();
-    }
-
-    public static Model stringToMavenModel(String pomAsString) {
-        MavenXpp3Reader reader = new MavenXpp3Reader();
-        StringReader pomStream = new StringReader(pomAsString);
-        try {
-            return reader.read(pomStream);
-        } catch (Exception e) {
-            throw new RepositoryRuntimeException("Failed to convert string to maven model", e);
-        }
-    }
-
-    /**
-     * @param pomInputStream Input stream of the pom content.
-     * @return Maven artifact info built from the pom data.
-     */
-    public static MavenArtifactInfo mavenModelToArtifactInfo(InputStream pomInputStream)
-            throws IOException, XmlPullParserException {
-        MavenXpp3Reader reader = new MavenXpp3Reader();
-        InputStreamReader pomStream = new InputStreamReader(pomInputStream, UTF8);
-        Model model = reader.read(pomStream);
-        return mavenModelToArtifactInfo(model);
-    }
-
-    public static MavenArtifactInfo mavenModelToArtifactInfo(Model model) {
-        Parent parent = model.getParent();
-        String groupId = model.getGroupId();
-        if (groupId == null && parent != null) {
-            groupId = parent.getGroupId();
-        }
-        MavenArtifactInfo artifactInfo = new MavenArtifactInfo();
-        artifactInfo.setGroupId(groupId);
-        artifactInfo.setArtifactId(model.getArtifactId());
-        String version = model.getVersion();
-        if (version == null && parent != null) {
-            version = parent.getVersion();
-        }
-        artifactInfo.setVersion(version);
-        return artifactInfo;
-    }
-
-    /**
-     * Returns a maven artifact info after gathering information from the given file
-     *
-     * @param file File to gather information from
-     * @return MavenArtifactInfo object containing gathered information
-     */
-    public static MavenArtifactInfo artifactInfoFromFile(File file) {
-        MavenArtifactInfo result;
-        result = attemptToBuildInfoFromModel(file);
-        if (result != null) {
-            // built from model - most accurate, we're done
-            return result;
-        }
-
-        // no info from a model, try to guess as good as possible based on the file name and path
-        result = getInfoByMatching(file.getName());
-        fillMissingRequiredFields(file, result);
-        return result;
-    }
-
-    /**
-     * Attempt to gather maven artifact information from the given file based on a model (pom, ivy etc.).
-     *
-     * @param file Uploaded file to gather info from
-     * @return Maven artifact info based on the model, null if model not found or couldn't be parsed
-     */
-    private static MavenArtifactInfo attemptToBuildInfoFromModel(File file) {
-        MavenArtifactInfo result = null;
-        String fileName = file.getName();
-        if (NamingUtils.isJarVariant(fileName)) {
-            //File is a jar variant
-            result = gatherInfoFromJarFile(file);
-        } else if (MavenNaming.isClientOrServerPom(fileName)) {
-            result = gatherInfoFromPomFile(file);
-        } else if (IvyNaming.isIvyFileName(fileName)) {
-            result = gatherInfoFromIvyFile(file);
-        }
-        return result;
-    }
-
-    /**
-     * Gathers maven artifact information which was (or was not) managed to gather from the given Jar file
-     *
-     * @param file Jar file to gather info from
-     */
-
-    private static MavenArtifactInfo gatherInfoFromJarFile(File file) {
-        MavenArtifactInfo artifactInfo = null;
-        JarInputStream jis = null;
-        JarEntry entry;
-        try {
-            //Create a stream and try to find the pom file within the jar
-            jis = new JarInputStream(new FileInputStream(file));
-            entry = getPomFile(jis);
-
-            //If a valid pom file was found
-            if (entry != null) {
-                try {
-                    //Read the uncompressed content
-                    artifactInfo = mavenModelToArtifactInfo(jis);
-                    artifactInfo.setType(PathUtils.getExtension(file.getPath()));
-                } catch (Exception e) {
-                    log.warn("Failed to read maven model from '" + entry.getName() + "'. Cause: " + e.getMessage() +
-                            ".", e);
-                    artifactInfo = null;
-                }
-            }
-        } catch (IOException e) {
-            log.warn("Failed to read maven model from '" + file + "'. Cause: " + e.getMessage() + ".", e);
-        } finally {
-            IOUtils.closeQuietly(jis);
-        }
-        return artifactInfo;
-    }
-
-    /**
-     * Returns a JarEntry object if a valid pom file is found in the given jar input stream
-     *
-     * @param jis Input stream of given jar
-     * @return JarEntry object if a pom file is found. Null if not
-     * @throws IOException Any exceptions that might occur while using the given stream
-     */
-    private static JarEntry getPomFile(JarInputStream jis) throws IOException {
-        if (jis != null) {
-            JarEntry entry;
-            while (((entry = jis.getNextJarEntry()) != null)) {
-                String name = entry.getName();
-                //Look for pom.xml in META-INF/maven/
-                if (name.startsWith("META-INF/maven/") && name.endsWith("pom.xml")) {
-                    return entry;
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @param file The file from which to try to extract the POM entry from.
-     * @return The POM from the JAR in its String representation.
-     */
-    public static String getPomFileAsStringFromJar(File file) {
-        JarEntry pomEntry;
-        JarInputStream inputStream = null;
-        try {
-            inputStream = new JarInputStream(new FileInputStream(file));
-            pomEntry = getPomFile(inputStream);
-            if (pomEntry != null) {
-                return IOUtils.toString(inputStream);
-            }
-        } catch (IOException e) {
-            log.warn("Unable to read JAR to extract the POM from it.");
-            // If the file has a corrupt file, the following error will be thrown.
-            // See java.util.zip.ZipInputStream.getUTF8String()
-        } catch (IllegalArgumentException iae) {
-            log.warn("Unable to read JAR to extract the POM from it.");
-        } finally {
-            IOUtils.closeQuietly(inputStream);
-        }
-        return null;
-    }
-
-    /**
-     * Gathers maven artifact information which was (or was not) managed to gather from the given pom file
-     *
-     * @param file Jar file to gather info from
-     * @return MavenArtifactInfo object to append info to, null if pom parsing failed
-     */
-    private static MavenArtifactInfo gatherInfoFromPomFile(File file) {
-        MavenArtifactInfo result = null;
-        FileInputStream in = null;
-        try {
-            in = new FileInputStream(file);
-            result = mavenModelToArtifactInfo(in);
-            result.setType(MavenArtifactInfo.POM);
-        } catch (Exception e) {
-            log.debug("Failed to read maven model from '{}'. Cause: {}.", file.getName(), e.getMessage());
-        } finally {
-            IOUtils.closeQuietly(in);
-        }
-        return result;
-    }
-
-    private static MavenArtifactInfo gatherInfoFromIvyFile(File file) {
-        MavenArtifactInfo result = null;
-        try {
-            IvyService ivyService = ContextHelper.get().beanForType(IvyService.class);
-            ModuleDescriptor ivyDescriptor = ivyService.parseIvyFile(file);
-            if (ivyDescriptor != null) {
-                ModuleRevisionId ivyModule = ivyDescriptor.getModuleRevisionId();
-                result = new MavenArtifactInfo();
-                result.setGroupId(ivyModule.getOrganisation());
-                result.setArtifactId(ivyModule.getName());
-                result.setVersion(ivyModule.getRevision());
-                result.setClassifier("ivy");
-                result.setType(MavenArtifactInfo.XML);
-            } else {
-                log.debug("Failed to read ivy model from '{}'", file.getName());
-            }
-        } catch (Exception e) {
-            log.debug("Failed to read ivy model from '{}'. Cause: {}.", file.getName(), e.getMessage());
-        }
-        return result;
-    }
-
-    /**
-     * Provides a fallback in order to fill in essential but missing information by using the given file's name
-     *
-     * @param file   Uploaded file to gather info from
-     * @param result MavenArtifactInfo object to append info to
-     */
-    private static void fillMissingRequiredFields(File file, MavenArtifactInfo result) {
-        String fileName = file.getName();
-        String baseFileName = FilenameUtils.getBaseName(fileName);
-
-        //Complete values by falling back to dumb defaults
-        if (MavenArtifactInfo.NA.equals(result.getArtifactId())) {
-            result.setArtifactId(baseFileName);
-        }
-        if (MavenArtifactInfo.NA.equals(result.getGroupId())) {
-            //If we have no group, set it to be the same as the artifact name
-            result.setGroupId(result.getArtifactId());
-        }
-        if (MavenArtifactInfo.NA.equals(result.getVersion())) {
-            result.setVersion(baseFileName);
-        }
-
-        // fill the type if the extension is not null and the result holds the default (jar) or is NA
-        String extension = PathUtils.getExtension(fileName);
-        if (extension != null &&
-                (MavenArtifactInfo.NA.equals(result.getType()) || MavenArtifactInfo.JAR.equals(result.getType()))) {
-            result.setType(extension);
-        }
-    }
-
-    /**
-     * Returns a MavenArtifactInfo based on info that was managed to gather from the file name matcher
-     *
-     * @param fileName The file name (with no preceding path) to match against
-     * @return MavenArtifactInfo object with gathered info
-     */
-    public static MavenArtifactInfo getInfoByMatching(String fileName) {
-        MavenArtifactInfo mavenArtifactInfo = new MavenArtifactInfo();
-        Matcher matcher = ARTIFACT_NAME_PATTERN.matcher(fileName);
-        if (matcher.matches()) {
-            mavenArtifactInfo.setArtifactId(matcher.group(1));
-            String version = matcher.group(2);
-            if (StringUtils.isNotBlank(matcher.group(5)) && StringUtils.isNotBlank((matcher.group(7)))) {
-                version += "-" + matcher.group(5);
-            }
-            mavenArtifactInfo.setVersion(version);
-            String classifier;
-            if (StringUtils.isNotBlank(matcher.group(5)) && StringUtils.isBlank(matcher.group(7))) {
-                classifier = matcher.group(5);
-            } else {
-                classifier = matcher.group(7);
-            }
-            mavenArtifactInfo.setClassifier(classifier);
-            mavenArtifactInfo.setType(matcher.group(8));
-        }
-        return mavenArtifactInfo;
-    }
-
-    /**
-     * Returns a MavenArtifactInfo based on the supplied maven GAV coordinates, e.g. "group.id:artifactId:version"
-     *
-     * @param gav GAV, GAVC or GACV string
-     * @return MavenMetadataInfo object with gathered info
-     */
-    @Nonnull
-    public static MavenArtifactInfo getInfoFromGavString(String gav) {
-        MavenArtifactInfo result = new MavenArtifactInfo();
-        String[] splitId = gav.split(":");
-        if (splitId.length == 4) {
-            result.setGroupId(splitId[0]);
-            result.setArtifactId(splitId[1]);
-            result.setClassifier(splitId[2]);
-            result.setVersion(splitId[3]);
-        } else if (splitId.length == 3) {
-            result.setGroupId(splitId[0]);
-            result.setArtifactId(splitId[1]);
-            result.setVersion(splitId[2]);
-        }
-        return result;
-    }
-
-    /**
-     * Constructs GAV or GACV string representation of the given MavenArtifactInfo.
-     *
-     * @param info Maven info to use
-     * @param gacv if true, creates "GroupId:ArtifactId:Classifier:Version" string, else create
-     *             "GroupId:ArtifactId:Version"
-     * @return GAV or GACV string
-     */
-    public static String getGavStringFromMavenInfo(MavenArtifactInfo info, boolean gacv) {
-        StringBuilder builder = new StringBuilder(info.getGroupId());
-        builder.append(":").append(info.getArtifactId());
-        if (gacv) {
-            builder.append(":").append(info.getClassifier());
-        }
-        return builder.append(":").append(info.getVersion()).toString();
-    }
-
-    public static Metadata buildReleasesMavenMetadata(String organization, String module,
-            SortedSet<String> sortedVersions) {
-        Metadata metadata = new Metadata();
-        metadata.setGroupId(organization);
-        metadata.setArtifactId(module);
-        if (!sortedVersions.isEmpty()) {
-            metadata.setVersion(sortedVersions.first());
-            Versioning versioning = new Versioning();
-            metadata.setVersioning(versioning);
-            versioning.setVersions(Lists.newArrayList(sortedVersions));
-            versioning.setLastUpdatedTimestamp(new Date());
-            versioning.setLatest(sortedVersions.last());
-            versioning.setRelease(sortedVersions.last());
-        }
-        return metadata;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/maven/MavenPomBuilder.java b/base/common/src/main/java/org/artifactory/maven/MavenPomBuilder.java
deleted file mode 100644
index ba178ce..0000000
--- a/base/common/src/main/java/org/artifactory/maven/MavenPomBuilder.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven;
-
-import org.apache.maven.model.Model;
-import org.artifactory.api.util.Builder;
-
-/**
- * Builder for maven {@link Model}.
- *
- * @author Yossi Shaul
- */
-public class MavenPomBuilder implements Builder<Model> {
-    private String groupId;
-    private String artifactId;
-    private String version;
-    private String packaging;
-
-    @Override
-    public Model build() {
-        Model model = new Model();
-        model.setModelVersion("4.0.0");
-        model.setGroupId(groupId);
-        model.setArtifactId(artifactId);
-        model.setVersion(version);
-        model.setPackaging(packaging);
-        model.setDescription("Artifactory auto generated POM");
-        return model;
-    }
-
-    public MavenPomBuilder groupId(String groupId) {
-        this.groupId = groupId;
-        return this;
-    }
-
-    public MavenPomBuilder artifactId(String artifactId) {
-        this.artifactId = artifactId;
-        return this;
-    }
-
-    public MavenPomBuilder version(String version) {
-        this.version = version;
-        return this;
-    }
-
-    public MavenPomBuilder packaging(String packaging) {
-        this.packaging = packaging;
-        return this;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/maven/MavenServiceImpl.java b/base/common/src/main/java/org/artifactory/maven/MavenServiceImpl.java
deleted file mode 100644
index cb47847..0000000
--- a/base/common/src/main/java/org/artifactory/maven/MavenServiceImpl.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.maven.settings.Mirror;
-import org.apache.maven.settings.Profile;
-import org.apache.maven.settings.Repository;
-import org.apache.maven.settings.RepositoryPolicy;
-import org.apache.maven.settings.Server;
-import org.apache.maven.settings.Settings;
-import org.apache.maven.settings.io.xpp3.SettingsXpp3Writer;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.maven.MavenArtifactInfo;
-import org.artifactory.api.maven.MavenService;
-import org.artifactory.api.maven.MavenSettings;
-import org.artifactory.api.maven.MavenSettingsMirror;
-import org.artifactory.api.maven.MavenSettingsRepository;
-import org.artifactory.api.maven.MavenSettingsServer;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.repo.exception.maven.BadPomException;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringWriter;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Main implementation of the MavenService interface
- *
- * @author Noam Tenne
- */
- at Service
-public class MavenServiceImpl implements MavenService {
-    private static final Logger log = LoggerFactory.getLogger(MavenServiceImpl.class);
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String generateSettings(MavenSettings mavenSettings) throws IOException {
-        Settings settings = transformSettings(mavenSettings);
-        SettingsXpp3Writer settingsWriter = new SettingsXpp3Writer();
-        StringWriter stringWriter = new StringWriter();
-        settingsWriter.write(stringWriter, settings);
-        String settingsXml = stringWriter.toString();
-        settingsXml = settingsXml.replace("<settings>", "<settings xmlns=\"http://maven.apache.org/SETTINGS/1.0.0\"\n" +
-                "          xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
-                "          xsi:schemaLocation=\"http://maven.apache.org/SETTINGS/1.0.0\n" +
-                "                      http://maven.apache.org/xsd/settings-1.0.0.xsd\">");
-        return settingsXml;
-    }
-
-    /**
-     * Recieves artifactories MavenSettings object and transforms it to maven's Settings object
-     *
-     * @param mavenSettings Settings to transform
-     * @return Settings - Transformed settings
-     */
-    private Settings transformSettings(MavenSettings mavenSettings) {
-        String contextUrl = mavenSettings.getUrl();
-
-        Settings settings = new Settings();
-
-        Profile profile = new Profile();
-        profile.setId("artifactory");
-
-        //Add plugin and releases repositories to the profile
-        addReleaseRepositories(contextUrl, profile, mavenSettings.getReleaseRepositories());
-        addPluginRepositories(contextUrl, profile, mavenSettings.getPluginRepositories());
-        settings.addProfile(profile);
-        settings.setActiveProfiles(Collections.singletonList(profile.getId()));
-
-        //Add mirrors to the settings
-        addMirrors(contextUrl, settings, mavenSettings.getMirrorRepositories());
-
-        addServers(settings, mavenSettings.getServers());
-
-        return settings;
-    }
-
-    /**
-     * Adds a list of release repository configurations to the maven profile object
-     *
-     * @param contextUrl   System URL
-     * @param profile      Maven profile to append to
-     * @param repositories Repositories to add to the profile
-     */
-    private void addReleaseRepositories(String contextUrl, Profile profile,
-            List<MavenSettingsRepository> repositories) {
-        for (MavenSettingsRepository repository : repositories) {
-            Repository repoToAdd = new Repository();
-            repoToAdd.setId(repository.getId());
-            String repositoryName = repository.getName();
-            repoToAdd.setName(repositoryName);
-            repoToAdd.setUrl(contextUrl + repositoryName);
-
-            boolean handlesSnapshots = repository.isHandlesSnapshots();
-            RepositoryPolicy snapshotPolicy = new RepositoryPolicy();
-            snapshotPolicy.setEnabled(handlesSnapshots);
-            repoToAdd.setSnapshots(snapshotPolicy);
-
-            profile.addRepository(repoToAdd);
-        }
-    }
-
-    /**
-     * Adds a list of plugin repository configurations to the maven profile object
-     *
-     * @param contextUrl   System URL
-     * @param profile      Maven profile to append to
-     * @param repositories Repositories to add to the profile
-     */
-    private void addPluginRepositories(String contextUrl, Profile profile, List<MavenSettingsRepository> repositories) {
-        for (MavenSettingsRepository repository : repositories) {
-            Repository repoToAdd = new Repository();
-            repoToAdd.setId(repository.getId());
-            String repositoryName = repository.getName();
-            repoToAdd.setName(repositoryName);
-            repoToAdd.setUrl(contextUrl + repositoryName);
-
-            boolean handlesSnapshots = repository.isHandlesSnapshots();
-            RepositoryPolicy snapshotPolicy = new RepositoryPolicy();
-            snapshotPolicy.setEnabled(handlesSnapshots);
-            repoToAdd.setSnapshots(snapshotPolicy);
-
-            profile.addPluginRepository(repoToAdd);
-        }
-    }
-
-    /**
-     * Adds a list of mirror configurations to the maven settings object
-     *
-     * @param contextUrl System URL
-     * @param settings   Maven Settings to append to
-     * @param mirrors    Mirrors to add to the settings
-     */
-    private void addMirrors(String contextUrl, Settings settings, List<MavenSettingsMirror> mirrors) {
-        for (MavenSettingsMirror mirror : mirrors) {
-            Mirror mirrorToAdd = new Mirror();
-            String mirrorId = mirror.getId();
-            mirrorToAdd.setId(mirrorId);
-            mirrorToAdd.setName(mirrorId);
-            mirrorToAdd.setUrl(contextUrl + mirrorId);
-            mirrorToAdd.setMirrorOf(mirror.getMirrorOf());
-
-            settings.addMirror(mirrorToAdd);
-        }
-    }
-
-    /**
-     * Adds a list of server configurations to the maven settings object
-     *
-     * @param settings Maven Settings to append to
-     * @param servers  Servers to add to the settings
-     */
-    private void addServers(Settings settings, List<MavenSettingsServer> servers) {
-        for (MavenSettingsServer server : servers) {
-            Server serverToAdd = new Server();
-            serverToAdd.setId(server.getId());
-
-            String username = server.getUsername();
-            String password = server.getPassword();
-
-            if (StringUtils.isNotBlank(username)) {
-                serverToAdd.setUsername(username);
-            }
-            if (StringUtils.isNotBlank(password)) {
-                serverToAdd.setPassword(password);
-            }
-            settings.addServer(serverToAdd);
-        }
-    }
-
-    @Override
-    public void validatePomContent(String pomContent, String relPath, ModuleInfo moduleInfo,
-            boolean suppressPomConsistencyChecks) throws IOException {
-        ArtifactoryHome artifactoryHome = ContextHelper.get().getArtifactoryHome();
-        File tempFile = File.createTempFile("pom.validation", ".tmp", artifactoryHome.getTempWorkDir());
-        try {
-            FileUtils.writeStringToFile(tempFile, pomContent, "utf-8");
-            validatePomFile(tempFile, relPath, moduleInfo, suppressPomConsistencyChecks);
-        } finally {
-            FileUtils.forceDelete(tempFile);
-        }
-    }
-
-    @Override
-    public void validatePomFile(File pomFile, String relPath, ModuleInfo moduleInfo,
-            boolean suppressPomConsistencyChecks) throws BadPomException {
-        InputStream inputStream = null;
-        try {
-            inputStream = new BufferedInputStream(new FileInputStream(pomFile));
-            new PomTargetPathValidator(relPath, moduleInfo).validate(inputStream, suppressPomConsistencyChecks);
-        } catch (Exception e) {
-            String message = "Error while validating POM for path: " + relPath +
-                    ". Please assure the validity of the POM file.";
-            throw new BadPomException(message);
-        } finally {
-            IOUtils.closeQuietly(inputStream);
-        }
-    }
-
-    @Override
-    public MavenArtifactInfo getMavenArtifactInfo(File uploadedFile) {
-        return MavenModelUtils.artifactInfoFromFile(uploadedFile);
-    }
-
-    @Override
-    public String getPomModelString(File file) {
-        if (MavenNaming.isPom(file.getAbsolutePath())) {
-            try {
-                FileInputStream fileInputStream = new FileInputStream(file);
-                return IOUtils.toString(fileInputStream);
-            } catch (IOException e) {
-                log.error("The following error occurred while reading {} {}", file.getAbsolutePath(), e);
-            }
-        }
-        String pomFromJar = MavenModelUtils.getPomFileAsStringFromJar(file);
-        if (StringUtils.isNotBlank(pomFromJar)) {
-            try {
-                MavenModelUtils.stringToMavenModel(pomFromJar);
-                return pomFromJar;
-            } catch (RepositoryRuntimeException rre) {
-                log.error("Failed to validate the model of the POM file within '{}'.", file.getAbsolutePath());
-            }
-        }
-        MavenArtifactInfo model = getMavenArtifactInfo(file);
-        return MavenModelUtils.mavenModelToString(MavenModelUtils.toMavenModel(model));
-    }
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/maven/PomTargetPathValidator.java b/base/common/src/main/java/org/artifactory/maven/PomTargetPathValidator.java
deleted file mode 100644
index e1d0ece..0000000
--- a/base/common/src/main/java/org/artifactory/maven/PomTargetPathValidator.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.maven.model.Model;
-import org.apache.maven.model.Parent;
-import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.repo.exception.maven.BadPomException;
-import org.artifactory.mime.MavenNaming;
-import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-
-/**
- * @author Noam Y. Tenne
- */
-public class PomTargetPathValidator {
-    private static final Logger log = LoggerFactory.getLogger(PomTargetPathValidator.class);
-
-    private final String relPath;
-    private final ModuleInfo moduleInfo;
-    private Model model;
-
-    public PomTargetPathValidator(String relPath, ModuleInfo moduleInfo) {
-        this.relPath = relPath;
-        this.moduleInfo = moduleInfo;
-    }
-
-    public void validate(InputStream in, boolean suppressPomConsistencyChecks) throws IOException {
-        MavenXpp3Reader reader = new MavenXpp3Reader();
-        try {
-            model = reader.read(new InputStreamReader(in, MavenModelUtils.UTF8));
-
-            String groupId = getGroupId(model);
-
-            if (StringUtils.isNotBlank(groupId)) {
-                //Do not verify if the pom's groupid does not exist
-                String modelVersion = getModelVersion(model);
-                if (StringUtils.isBlank(modelVersion)) {
-                    String msg = String.format(
-                            "The Pom version of '%s' does not exists. Please verify your POM content for correctness",
-                            relPath);
-                    if (suppressPomConsistencyChecks) {
-                        log.error("{} POM consistency checks are suppressed. Broken artifacts might have been " +
-                                "stored in the repository - please resolve this manually.", msg);
-                        return;
-                    } else {
-                        throw new BadPomException(msg);
-                    }
-                }
-
-                //For snapshots with unique snapshot version, do not include the model version in the path
-                boolean snapshot = moduleInfo.isIntegration();
-                boolean versionSnapshot = MavenNaming.isNonUniqueSnapshotVersion(modelVersion);
-
-                String pathPrefix = null;
-                if (snapshot && !versionSnapshot) {
-                    pathPrefix = groupId.replace('.', '/') + "/" + model.getArtifactId() + "/";
-                } else if (StringUtils.isNotBlank(modelVersion)) {
-                    pathPrefix = groupId.replace('.', '/') + "/" + model.getArtifactId() + "/" +
-                            modelVersion;
-                }
-
-                //Do not validate paths that contain property references
-                if (pathPrefix != null && !pathPrefix.contains("${")
-                        && !StringUtils.startsWithIgnoreCase(relPath, pathPrefix)) {
-                    String msg = String.format(
-                            "The target deployment path '%s' does not match the POM's expected path " +
-                                    "prefix '%s'. Please verify your POM content for correctness and make sure the source path " +
-                                    "is a valid Maven repository root path.", relPath, pathPrefix);
-                    if (suppressPomConsistencyChecks) {
-                        log.warn("{} POM consistency checks are suppressed. Broken artifacts might have been " +
-                                "stored in the repository - please resolve this manually.", msg);
-                    } else {
-                        throw new BadPomException(msg);
-                    }
-                }
-            }
-        } catch (XmlPullParserException e) {
-            if (log.isDebugEnabled()) {
-                try {
-                    in.reset();
-                    InputStreamReader isr = new InputStreamReader(in, MavenModelUtils.UTF8);
-                    String s = readString(isr);
-                    log.debug("Could not parse bad POM for '{}'. Bad POM content:\n{}\n", relPath, s);
-                } catch (Exception ex) {
-                    log.trace("Could not extract bad POM content for '{}': {}.", relPath, e.getMessage());
-                }
-            }
-            String message = "Failed to read POM for '" + relPath + "': " + e.getMessage() + ".";
-            if (suppressPomConsistencyChecks) {
-                log.error(message + " POM consistency checks are suppressed. Broken artifacts might have been " +
-                        "stored in the repository - please resolve this manually.");
-            } else {
-                throw new BadPomException(message);
-            }
-        }
-    }
-
-    private String getGroupId(Model model) {
-        String groupId = model.getGroupId();
-        if (StringUtils.isBlank(groupId)) {
-            Parent parent = model.getParent();
-            if (parent != null) {
-                groupId = parent.getGroupId();
-            }
-        }
-        return groupId;
-    }
-
-    private String getModelVersion(Model model) {
-        String modelVersion = model.getVersion();
-        //Version may come from the parent
-        if (StringUtils.isBlank(modelVersion)) {
-            Parent parent = model.getParent();
-            if (parent != null) {
-                modelVersion = parent.getVersion();
-            }
-        }
-        return modelVersion;
-    }
-
-    private String readString(Reader reader) throws IOException {
-        StringBuilder buffer = new StringBuilder(2048);
-        int value;
-        while ((value = reader.read()) != -1) {
-            buffer.append((char) value);
-        }
-        return buffer.toString();
-    }
-
-    /**
-     * @return True if the processed pom represents a maven plugin.
-     */
-    public boolean isMavenPlugin() {
-        return model != null && "maven-plugin".equals(model.getPackaging());
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/mbean/MBeanRegistrationService.java b/base/common/src/main/java/org/artifactory/mbean/MBeanRegistrationService.java
deleted file mode 100644
index 2b8dac0..0000000
--- a/base/common/src/main/java/org/artifactory/mbean/MBeanRegistrationService.java
+++ /dev/null
@@ -1,212 +0,0 @@
-package org.artifactory.mbean;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nullable;
-import javax.management.MBeanServer;
-import javax.management.MalformedObjectNameException;
-import javax.management.ObjectInstance;
-import javax.management.ObjectName;
-import java.io.PrintStream;
-import java.lang.management.ManagementFactory;
-import java.net.Socket;
-import java.util.Set;
-
- at Service
-public class MBeanRegistrationService {
-    private static final Logger log = LoggerFactory.getLogger(MBeanRegistrationService.class);
-
-    private static final String MBEANS_DOMAIN_NAME = "org.jfrog.artifactory";
-    private static final String MANAGED_PREFIX = "Managed";
-    private static final String MBEAN_SUFFIX = "MBean";
-
-    /**
-     * Registers an object as a mbean.
-     * <p><i>It is assumed that the given {@code mbean} has an interface with name ends with MBean</i></p>
-     *
-     * @param mbean      The mbean implementation
-     */
-    public <T> void register(T mbean) {
-        register(mbean, createObjectName(getMBeanInterface(mbean), null));
-    }
-
-    /**
-     * Registers an object as an mbean.
-     * <p><i>It is assumed that the given {@code mbean} has an interface with name ends with MBean</i></p>
-     *
-     * @param mbean      The mbean implementation
-     * @param mbeanProps Optional string to attach to the mbean name
-     */
-    public <T> void register(T mbean, @Nullable String mbeanProps) {
-        register(mbean, createObjectName(getMBeanInterface(mbean), mbeanProps));
-    }
-
-    /**
-     * Registers an object as an mbean.
-     *
-     * @param mbean      The mbean implementation
-     * @param mbeanIfc   The mbean interface
-     * @param mbeanProps Optional string to attach to the mbean name
-     */
-    public <T> void register(T mbean, Class<T> mbeanIfc, @Nullable String mbeanProps) {
-        register(mbean, createObjectName(mbeanIfc, mbeanProps));
-    }
-
-    public <T> void register(T mbean, String group, @Nullable String prop) {
-        register(mbean, createObjectName(group, prop));
-    }
-
-    private <T> void register(T mbean, ObjectName mbeanName) {
-        try {
-            if (getMBeanServer().isRegistered(mbeanName)) {
-                log.debug("Unregistering existing mbean '{}'.", mbeanName);
-                getMBeanServer().unregisterMBean(mbeanName);
-            }
-            log.debug("Registering mbean '{}'.", mbeanName);
-            getMBeanServer().registerMBean(mbean, mbeanName);
-        } catch (Exception e) {
-            throw new RuntimeException("Could not register new mbean '" + mbeanName + "'.", e);
-        }
-    }
-
-    /**
-     * Unregisters all MBeans where the type matches given {@code type}.
-     * <p>Object name is created using {@link #createObjectName(String, String)}
-     * <p><i>In case of exception, a warn log will be written </i>
-     * @return  the count of unregistered MBeans
-     * @param mbeanIfc
-     */
-    public int unregisterAll(String type) {
-        int count = 0;
-        String canonicalName = createObjectName(type, null).getCanonicalName();
-
-        Set<ObjectInstance> objectInstances = getMBeanServer().queryMBeans(null, null);
-        for (ObjectInstance objectInstance : objectInstances) {
-            ObjectName objectName = objectInstance.getObjectName();
-            if (objectName.getCanonicalName().startsWith(canonicalName)) {
-                try {
-                    getMBeanServer().unregisterMBean(objectName);
-                    count++;
-                } catch (Exception e) {
-                    log.warn("Could not un-register MBean '" + objectName.getCanonicalName() + "'.", e.getMessage());
-                }
-            }
-        }
-        return count;
-    }
-
-    /**
-     * Reading state of MBean server, tries to shutdown the server as clean as possible
-     */
-    public void shutdownServer() {
-        MBeanServer server = getMBeanServer();
-        ObjectName name = null;
-        try {
-            name = new ObjectName("Catalina:type=Server");
-            if (!server.isRegistered(name)) {
-                // Try the embedded version
-                name = new ObjectName("Tomcat:type=Server");
-            }
-        } catch (MalformedObjectNameException e) {
-            log.error("Could not create tomcat mbean names", e);
-        }
-        if (name != null && server.isRegistered(name)) {
-            try {
-                log.info("Shutting down Tomcat server...");
-                int port = (int) server.getAttribute(name, "port");
-                if (port == -1) {
-                    log.info("No Tomcat management port defined. Shutting down manually...");
-                    new Thread(new ShutdownThread()).start();
-                } else {
-                    String address = (String) server.getAttribute(name, "address");
-                    String shutdownPassword = (String) server.getAttribute(name, "shutdown");
-                    log.info("Tomcat shutdown using " + address + ":" + port);
-                    Socket s = new Socket(address, port);
-                    PrintStream ps = new PrintStream(s.getOutputStream());
-                    ps.println(shutdownPassword);
-                    s.close();
-                }
-            } catch (Exception e) {
-                log.error("Failed to call tomcat shutdown!", e);
-            }
-        } else {
-            log.info("Shutting down Jetty server...");
-            new Thread(new ShutdownThread()).start();
-        }
-    }
-
-    static class ShutdownThread implements Runnable {
-        private final ArtifactoryContext ctx;
-
-        ShutdownThread() {
-            this.ctx = ContextHelper.get();
-        }
-
-        @Override
-        public void run() {
-            try {
-                Thread.sleep(100L);
-                ctx.destroy();
-                System.exit(0);
-            } catch (InterruptedException e) {
-                e.printStackTrace();
-            }
-        }
-    }
-
-    /**
-     * Create MBean name for the given {@code mbeanIfc} according to the convention {@code prefix:instance:type:props}
-     * <p>for example: {@code org.jfrog.artifactory:Artifactory:Repository:libs-releases-locel}
-     * @param mbeanIfc   The mbean interface
-     * @param mbeanProps Optional string to attach to the mbean name
-     * @return  the MBean name for the given {@code mbeanIfc}
-     */
-    protected ObjectName createObjectName(Class mbeanIfc, @Nullable String mbeanProps) {
-        String type = mbeanIfc.getSimpleName();
-        if (type.startsWith(MANAGED_PREFIX)) {
-            type = type.substring(MANAGED_PREFIX.length());
-        }
-        if (type.endsWith(MBEAN_SUFFIX)) {
-            type = type.substring(0, type.length() - MBEAN_SUFFIX.length());
-        }
-
-        return createObjectName(type, mbeanProps);
-    }
-
-    protected ObjectName createObjectName(String type, String mbeanProps) {
-        String instanceId = ContextHelper.get().getContextId();
-        if (StringUtils.isBlank(instanceId)) {
-            instanceId = "Artifactory"; //default instanceId for tomcat ROOT
-        }
-        String nameStr = MBEANS_DOMAIN_NAME + ":" + "instance=" + instanceId + ", type=" + type;
-        if (StringUtils.isNotBlank(mbeanProps)) {
-            nameStr += ",prop=" + mbeanProps;
-        }
-
-        try {
-            return new ObjectName(nameStr);
-        } catch (MalformedObjectNameException e) {
-            throw new IllegalArgumentException("Failed to create object name for '" + nameStr + "'.", e);
-        }
-    }
-
-    protected MBeanServer getMBeanServer() {
-        //Delegate to the mbean server already created by the platform
-        return ManagementFactory.getPlatformMBeanServer();
-    }
-
-    private static <T> Class<T> getMBeanInterface(T mbean) {
-        for (Class<?> ifc : mbean.getClass().getInterfaces()) {
-            if (ifc.getName().endsWith(MBEAN_SUFFIX)) {
-                return (Class<T>) ifc;
-            }
-        }
-        return null;
-    }
-}
-
diff --git a/base/common/src/main/java/org/artifactory/mbean/ThreadDumper.java b/base/common/src/main/java/org/artifactory/mbean/ThreadDumper.java
deleted file mode 100644
index f2b28f8..0000000
--- a/base/common/src/main/java/org/artifactory/mbean/ThreadDumper.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mbean;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.management.MBeanOperationInfo;
-import javax.management.MBeanServer;
-import javax.management.ObjectName;
-import java.lang.management.LockInfo;
-import java.lang.management.ManagementFactory;
-import java.lang.management.MonitorInfo;
-import java.lang.management.ThreadInfo;
-import java.lang.management.ThreadMXBean;
-
-/**
- * @author Yoav Landman
- */
-public class ThreadDumper {
-
-    private static final Logger log = LoggerFactory.getLogger(ThreadDumper.class);
-
-    private static final String JAVA6_FIND_DEADLOCKS_METHOD_NAME = "findDeadlockedThreads";
-    private static final String JAVA5_FIND_DEADLOCKS_METHOD_NAME = "findMonitorDeadlockedThreads";
-    private static String TAB = "    ";
-
-    private ThreadMXBean tmbean;
-    //Default for JDK 6+ VM
-
-    //Whether can dump ownable synchronizer locks
-    private boolean canDumpSyncLocks = true;
-
-    private boolean ready;
-
-
-    public ThreadDumper() {
-        try {
-            MBeanServer server = ManagementFactory.getPlatformMBeanServer();
-            tmbean = ManagementFactory
-                    .newPlatformMXBeanProxy(server, ManagementFactory.THREAD_MXBEAN_NAME, ThreadMXBean.class);
-            ObjectName oname = new ObjectName(ManagementFactory.THREAD_MXBEAN_NAME);
-            //See if we can dump deadlock info by testing if the method exists
-            MBeanOperationInfo[] mopis = server.getMBeanInfo(oname).getOperations();
-
-            //Look for the java 6+ method
-            boolean found = false;
-            for (MBeanOperationInfo op : mopis) {
-                if (op.getName().equals(JAVA6_FIND_DEADLOCKS_METHOD_NAME)) {
-                    found = true;
-                    break;
-                }
-            }
-            if (!found) {
-                //Fallback to java 5 - monitor locks cannot be dumped
-                canDumpSyncLocks = false;
-            }
-        } catch (Exception e) {
-            log.error("Could not initialize the debugging thread dumper.", e);
-            return;
-        }
-        ready = true;
-    }
-
-
-    /**
-     * Prints out the thread dump information
-     */
-    public CharSequence dumpThreads() {
-        assertReady();
-        StringBuilder dump = new StringBuilder();
-        if (canDumpSyncLocks && tmbean.isObjectMonitorUsageSupported() && tmbean.isSynchronizerUsageSupported()) {
-            //Lock info if both object monitor usage and synchronizer usage are supported (java 6)
-            dump.append("Full Java thread dump with locks info").append('\n');
-            ThreadInfo[] tinfos = tmbean.dumpAllThreads(true, true);
-            for (ThreadInfo ti : tinfos) {
-                printThreadInfo(ti, dump);
-                LockInfo[] syncs = ti.getLockedSynchronizers();
-                printLockInfo(syncs, dump);
-            }
-        } else {
-            //Java 5
-            dump.append("Full Java thread dump").append('\n');
-            long[] tids = tmbean.getAllThreadIds();
-            ThreadInfo[] tinfos = tmbean.getThreadInfo(tids, Integer.MAX_VALUE);
-            for (ThreadInfo ti : tinfos) {
-                printThreadInfo(ti, dump);
-            }
-        }
-        dump.append('\n');
-        return dump;
-    }
-
-    /**
-     * Checks if any threads are deadlocked. If any, print the thread dump information.
-     */
-    public boolean findDeadlock(StringBuilder dump) {
-        assertReady();
-        long[] tids;
-        if (canDumpSyncLocks && tmbean.isSynchronizerUsageSupported()) {
-            tids = tmbean.findDeadlockedThreads();
-            if (tids == null) {
-                return false;
-            }
-            dump.append("Deadlock found:-").append('\n');
-            ThreadInfo[] infos = tmbean.getThreadInfo(tids, true, true);
-            for (ThreadInfo ti : infos) {
-                printThreadInfo(ti, dump);
-                printLockInfo(ti.getLockedSynchronizers(), dump);
-                dump.append("");
-            }
-        } else {
-            tids = tmbean.findMonitorDeadlockedThreads();
-            if (tids == null) {
-                return false;
-            }
-            ThreadInfo[] infos = tmbean.getThreadInfo(tids, Integer.MAX_VALUE);
-            for (ThreadInfo ti : infos) {
-                printThreadInfo(ti, dump);
-                printMonitorInfo(ti.getLockedMonitors(), dump);
-            }
-        }
-        return true;
-    }
-
-    private void printThreadInfo(ThreadInfo ti, StringBuilder dump) {
-        // print thread information
-        printThread(ti, dump);
-
-        // print stack trace with locks
-        StackTraceElement[] stacktrace = ti.getStackTrace();
-        MonitorInfo[] monitors = ti.getLockedMonitors();
-        for (int i = 0; i < stacktrace.length; i++) {
-            StackTraceElement ste = stacktrace[i];
-            dump.append(TAB).append("at ").append(ste.toString()).append('\n');
-            for (MonitorInfo mi : monitors) {
-                if (mi.getLockedStackDepth() == i) {
-                    dump.append(TAB).append("  - locked ").append(mi).append('\n');
-                }
-            }
-        }
-        dump.append("");
-    }
-
-    private void printThread(ThreadInfo ti, StringBuilder dump) {
-        StringBuilder sb = new StringBuilder("\"" + ti.getThreadName() + "\"" + " Id="
-                + ti.getThreadId() + " in " + ti.getThreadState());
-        if (ti.getLockName() != null) {
-            sb.append(" on lock=").append(ti.getLockName());
-        }
-        if (ti.isSuspended()) {
-            sb.append(" (suspended)");
-        }
-        if (ti.isInNative()) {
-            sb.append(" (running in native)");
-        }
-        dump.append(sb).append('\n');
-        if (ti.getLockOwnerName() != null) {
-            dump.append(TAB).append(" owned by ").append(ti.getLockOwnerName()).append(" Id=")
-                    .append(ti.getLockOwnerId()).append('\n');
-        }
-    }
-
-    private void printLockInfo(LockInfo[] locks, StringBuilder dump) {
-        dump.append(TAB).append("Locked synchronizers: count = ").append(locks.length).append('\n');
-        for (LockInfo li : locks) {
-            dump.append(TAB).append("  - ").append(li).append('\n');
-        }
-        dump.append('\n');
-    }
-
-    private void printMonitorInfo(MonitorInfo[] monitors, StringBuilder dump) {
-        dump.append(TAB).append("Locked monitors: count = ").append(monitors.length).append('\n');
-        for (MonitorInfo mi : monitors) {
-            dump.append(TAB).append("  - ").append(mi).append(" locked at ").append('\n');
-            dump.append(TAB).append("      ").append(mi.getLockedStackDepth()).append(" ")
-                    .append(mi.getLockedStackFrame()).append('\n');
-        }
-    }
-
-    private void assertReady() {
-        if (!ready) {
-            throw new IllegalStateException("Thread dumper was not initialize properly.");
-        }
-    }
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/nuget/NuDependency.java b/base/common/src/main/java/org/artifactory/nuget/NuDependency.java
deleted file mode 100644
index 37094ec..0000000
--- a/base/common/src/main/java/org/artifactory/nuget/NuDependency.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.artifactory.nuget;
-
-/**
- * @author Shay Yaakov
- */
-public class NuDependency {
-
-    private String id;
-    private String version;
-    private String targetFramework;
-
-    public NuDependency() {
-    }
-
-    public NuDependency(String id, String version, String targetFramework) {
-        this.id = id;
-        this.version = version;
-        this.targetFramework = targetFramework;
-    }
-
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public String getTargetFramework() {
-        return targetFramework;
-    }
-
-    public void setTargetFramework(String targetFramework) {
-        this.targetFramework = targetFramework;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/nuget/NuMetaData.java b/base/common/src/main/java/org/artifactory/nuget/NuMetaData.java
deleted file mode 100644
index 1dd828a..0000000
--- a/base/common/src/main/java/org/artifactory/nuget/NuMetaData.java
+++ /dev/null
@@ -1,197 +0,0 @@
-package org.artifactory.nuget;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class NuMetaData {
-
-    private String id;
-    private String version;
-    private String title;
-    private String authors;
-    private String owners;
-    private String licenseUrl;
-    private String projectUrl;
-    private String iconUrl;
-    private boolean requireLicenseAcceptance;
-    private String description;
-    private String summary;
-    private String language;
-    private String tags;
-    private String releaseNotes;
-    private String copyright;
-    private List dependencies;
-    private List<NuSpecFrameworkAssembly> frameworkAssemblies;
-    private List references;
-
-
-    public NuMetaData(String id, String version, String title, String authors, String owners, String licenseUrl,
-            String projectUrl, String iconUrl, boolean requireLicenseAcceptance, String description, String summary,
-            String language, String tags, String releaseNotes, String copyright, List dependencies, List references,
-            List<NuSpecFrameworkAssembly> frameworkAssemblies) {
-        this.id = id;
-        this.version = version;
-        this.title = title;
-        this.authors = authors;
-        this.owners = owners;
-        this.licenseUrl = licenseUrl;
-        this.projectUrl = projectUrl;
-        this.iconUrl = iconUrl;
-        this.requireLicenseAcceptance = requireLicenseAcceptance;
-        this.description = description;
-        this.summary = summary;
-        this.language = language;
-        this.tags = tags;
-        this.releaseNotes = releaseNotes;
-        this.copyright = copyright;
-        this.dependencies = dependencies;
-        this.references = references;
-        this.frameworkAssemblies = frameworkAssemblies;
-    }
-
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public String getTitle() {
-        return title;
-    }
-
-    public void setTitle(String title) {
-        this.title = title;
-    }
-
-    public String getAuthors() {
-        return authors;
-    }
-
-    public void setAuthors(String authors) {
-        this.authors = authors;
-    }
-
-    public String getOwners() {
-        return owners;
-    }
-
-    public void setOwners(String owners) {
-        this.owners = owners;
-    }
-
-    public String getLicenseUrl() {
-        return licenseUrl;
-    }
-
-    public void setLicenseUrl(String licenseUrl) {
-        this.licenseUrl = licenseUrl;
-    }
-
-    public String getProjectUrl() {
-        return projectUrl;
-    }
-
-    public void setProjectUrl(String projectUrl) {
-        this.projectUrl = projectUrl;
-    }
-
-    public String getIconUrl() {
-        return iconUrl;
-    }
-
-    public void setIconUrl(String iconUrl) {
-        this.iconUrl = iconUrl;
-    }
-
-    public boolean isRequireLicenseAcceptance() {
-        return requireLicenseAcceptance;
-    }
-
-    public void setRequireLicenseAcceptance(boolean requireLicenseAcceptance) {
-        this.requireLicenseAcceptance = requireLicenseAcceptance;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public String getSummary() {
-        return summary;
-    }
-
-    public void setSummary(String summary) {
-        this.summary = summary;
-    }
-
-    public String getLanguage() {
-        return language;
-    }
-
-    public void setLanguage(String language) {
-        this.language = language;
-    }
-
-    public String getTags() {
-        return tags;
-    }
-
-    public void setTags(String tags) {
-        this.tags = tags;
-    }
-
-    public String getReleaseNotes() {
-        return releaseNotes;
-    }
-
-    public void setReleaseNotes(String releaseNotes) {
-        this.releaseNotes = releaseNotes;
-    }
-
-    public String getCopyright() {
-        return copyright;
-    }
-
-    public void setCopyright(String copyright) {
-        this.copyright = copyright;
-    }
-
-    public List getDependencies() {
-        return dependencies;
-    }
-
-    public void setDependencies(List dependencies) {
-        this.dependencies = dependencies;
-    }
-
-    public List getReferences() {
-        return references;
-    }
-
-    public void setReferences(List references) {
-        this.references = references;
-    }
-
-    public List<NuSpecFrameworkAssembly> getFrameworkAssemblies() {
-        return frameworkAssemblies;
-    }
-
-    public void setFrameworkAssemblies(List<NuSpecFrameworkAssembly> frameworkAssemblies) {
-        this.frameworkAssemblies = frameworkAssemblies;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/nuget/NuSpecFrameworkAssembly.java b/base/common/src/main/java/org/artifactory/nuget/NuSpecFrameworkAssembly.java
deleted file mode 100644
index 68d9476..0000000
--- a/base/common/src/main/java/org/artifactory/nuget/NuSpecFrameworkAssembly.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.nuget;
-
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
-
-import java.io.Serializable;
-
-/**
- * @author Noam Y. Tenne
- */
- at XStreamAlias("frameworkAssembly")
-public class NuSpecFrameworkAssembly implements Serializable {
-
-    @XStreamAsAttribute
-    private String assemblyName;
-
-    @XStreamAsAttribute
-    private String targetFramework;
-
-    public NuSpecFrameworkAssembly(String assemblyName, String targetFramework) {
-        this.assemblyName = assemblyName;
-        this.targetFramework = targetFramework;
-    }
-
-    public NuSpecFrameworkAssembly() {
-    }
-
-    public String getAssemblyName() {
-        return assemblyName;
-    }
-
-    public void setAssemblyName(String assemblyName) {
-        this.assemblyName = assemblyName;
-    }
-
-    public String getTargetFramework() {
-        return targetFramework;
-    }
-
-    public void setTargetFramework(String targetFramework) {
-        this.targetFramework = targetFramework;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/observers/CloseableObserver.java b/base/common/src/main/java/org/artifactory/observers/CloseableObserver.java
deleted file mode 100644
index 56be39f..0000000
--- a/base/common/src/main/java/org/artifactory/observers/CloseableObserver.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.observers;
-
-/**
- * Provides onClose() observation capabilities
- *
- * @author Michael Pasternak
- */
-public interface CloseableObserver {
-    /**
-     * Invoked by observed objects on close() event
-     *
-     * @param object the owner of observed event
-     */
-    public void onObservedClose(Object object);
-}
diff --git a/base/common/src/main/java/org/artifactory/repo/HttpRepositoryConfigurationImpl.java b/base/common/src/main/java/org/artifactory/repo/HttpRepositoryConfigurationImpl.java
deleted file mode 100644
index 07f788e..0000000
--- a/base/common/src/main/java/org/artifactory/repo/HttpRepositoryConfigurationImpl.java
+++ /dev/null
@@ -1,542 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.delegation.ContentSynchronisation;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.descriptor.repo.BowerConfiguration;
-import org.artifactory.descriptor.repo.ChecksumPolicyType;
-import org.artifactory.descriptor.repo.CocoaPodsConfiguration;
-import org.artifactory.descriptor.repo.HttpRepoDescriptor;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.descriptor.repo.VcsConfiguration;
-import org.artifactory.descriptor.repo.vcs.VcsGitProvider;
-import org.artifactory.descriptor.repo.vcs.VcsType;
-import org.artifactory.util.RepoLayoutUtils;
-
-import javax.annotation.Nonnull;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Remote Repository configuration
- *
- * @author Tomer Cohen
- * @see org.artifactory.descriptor.repo.HttpRepoDescriptor
- */
-public class HttpRepositoryConfigurationImpl extends RepositoryConfigurationBase
-        implements HttpRepositoryConfiguration {
-
-    private String url;
-    private String username = "";
-    private String password = "";
-    private String proxy;
-    private boolean handleReleases = true;
-    private boolean handleSnapshots = true;
-    private boolean suppressPomConsistencyChecks = false;
-    private String remoteRepoChecksumPolicyType = "";
-    private boolean hardFail = false;
-    private boolean offline = false;
-    private boolean blackedOut = false;
-    private boolean storeArtifactsLocally = true;
-    private int socketTimeoutMillis = 15000;
-    private String localAddress = "";
-    private long retrievalCachePeriodSecs = 600L;
-    private long assumedOfflinePeriodSecs = 300L;
-    private long missedRetrievalCachePeriodSecs = 1800L;
-    private int unusedArtifactsCleanupPeriodHours = 0;
-    private boolean fetchJarsEagerly = false;
-    private boolean fetchSourcesEagerly = false;
-    private boolean shareConfiguration = false;
-    private boolean synchronizeProperties = false;
-    private int maxUniqueSnapshots = 0;
-    private List<String> propertySets;
-    private String remoteRepoLayoutRef;
-    private boolean archiveBrowsingEnabled = false;
-    private boolean listRemoteFolderItems = true;
-    private boolean rejectInvalidJars = false;
-    private boolean allowAnyHostAuth;
-    private boolean enableCookieManagement;
-    private boolean enableTokenAuthentication;
-    private String queryParams;
-    private boolean propagateQueryParams;
-    private boolean blockMismatchingMimeTypes;
-    private String mismatchingMimeTypesOverrideList;
-
-
-    private BowerConfiguration bowerConfiguration = new BowerConfiguration();
-    private CocoaPodsConfiguration podsConfiguration = new CocoaPodsConfiguration();
-    private VcsConfiguration vcsConfiguration = new VcsConfiguration();
-    private ContentSynchronisation contentSynchronisation;
-
-    public HttpRepositoryConfigurationImpl() {
-        setRepoLayoutRef(RepoLayoutUtils.MAVEN_2_DEFAULT_NAME);
-    }
-
-    public HttpRepositoryConfigurationImpl(HttpRepoDescriptor repoDescriptor) {
-        super(repoDescriptor, TYPE);
-        try {
-            new URL(repoDescriptor.getUrl());
-        } catch (MalformedURLException e) {
-            throw new IllegalArgumentException("Remote URL '"+repoDescriptor.getUrl()+"' is not valid", e);
-        }
-        this.url = repoDescriptor.getUrl();
-        String username = repoDescriptor.getUsername();
-        if (StringUtils.isNotBlank(username)) {
-            setUsername(username);
-        }
-        String password = repoDescriptor.getPassword();
-        if (StringUtils.isNotBlank(password)) {
-            setPassword(password);
-        }
-        setAllowAnyHostAuth(repoDescriptor.isAllowAnyHostAuth());
-        setEnableTokenAuthentication(repoDescriptor.isEnableTokenAuthentication());
-        ProxyDescriptor proxy = repoDescriptor.getProxy();
-        if (proxy != null) {
-            setProxy(proxy.getKey());
-        }
-        Map<String, String> checksumPolicyTypes = extractXmlValueFromEnumAnnotations(ChecksumPolicyType.class);
-        for (Map.Entry<String, String> checksumPolicyType : checksumPolicyTypes.entrySet()) {
-            if (checksumPolicyType.getKey().equals(repoDescriptor.getChecksumPolicyType().name())) {
-                setRemoteRepoChecksumPolicyType(checksumPolicyType.getKey());
-            }
-        }
-        setHardFail(repoDescriptor.isHardFail());
-        setOffline(repoDescriptor.isOffline());
-        setStoreArtifactsLocally(repoDescriptor.isStoreArtifactsLocally());
-        setSocketTimeoutMillis(repoDescriptor.getSocketTimeoutMillis());
-        String localAddress = repoDescriptor.getLocalAddress();
-        if (StringUtils.isNotBlank(localAddress)) {
-            setLocalAddress(localAddress);
-        }
-        setEnableCookieManagement(repoDescriptor.isEnableCookieManagement());
-        setBlackedOut(repoDescriptor.isBlackedOut());
-        setHandleReleases(repoDescriptor.isHandleReleases());
-        setHandleSnapshots(repoDescriptor.isHandleSnapshots());
-        setSuppressPomConsistencyChecks(repoDescriptor.isSuppressPomConsistencyChecks());
-        setRetrievalCachePeriodSecs(repoDescriptor.getRetrievalCachePeriodSecs());
-        setAssumedOfflinePeriodSecs(repoDescriptor.getAssumedOfflinePeriodSecs());
-        setMissedRetrievalCachePeriodSecs(repoDescriptor.getMissedRetrievalCachePeriodSecs());
-        setUnusedArtifactsCleanupPeriodHours(repoDescriptor.getUnusedArtifactsCleanupPeriodHours());
-        setFetchJarsEagerly(repoDescriptor.isFetchJarsEagerly());
-        setFetchSourcesEagerly(repoDescriptor.isFetchSourcesEagerly());
-        setShareConfiguration(repoDescriptor.isShareConfiguration());
-        setMaxUniqueSnapshots(repoDescriptor.getMaxUniqueSnapshots());
-        setSynchronizeProperties(repoDescriptor.isSynchronizeProperties());
-        setContentSynchronisation(repoDescriptor.getContentSynchronisation());
-        setPropagateQueryParams(repoDescriptor.isPropagateQueryParams());
-        List<PropertySet> propertySets = repoDescriptor.getPropertySets();
-        if (propertySets != null && !propertySets.isEmpty()) {
-            setPropertySets(Lists.transform(propertySets, new Function<PropertySet, String>() {
-                @Override
-                public String apply(@Nonnull PropertySet input) {
-                    return input.getName();
-                }
-            }));
-        } else {
-            setPropertySets(Lists.<String>newArrayList());
-        }
-        RepoLayout remoteRepoLayout = repoDescriptor.getRemoteRepoLayout();
-        if (remoteRepoLayout != null) {
-            setRemoteRepoLayoutRef(remoteRepoLayout.getName());
-        }
-        setArchiveBrowsingEnabled(repoDescriptor.isArchiveBrowsingEnabled());
-        setListRemoteFolderItems(repoDescriptor.isListRemoteFolderItems());
-        setRejectInvalidJars(repoDescriptor.isRejectInvalidJars());
-        this.bowerConfiguration = repoDescriptor.getBower();
-        this.podsConfiguration = repoDescriptor.getCocoaPods();
-        this.vcsConfiguration = repoDescriptor.getVcs();
-        setBlockMismatchingMimeTypes(repoDescriptor.isBlockMismatchingMimeTypes());
-        setMismatchingMimeTypesOverrideList(repoDescriptor.getMismatchingMimeTypesOverrideList());
-    }
-
-    @Override
-    public int getMaxUniqueSnapshots() {
-        return maxUniqueSnapshots;
-    }
-
-    public void setMaxUniqueSnapshots(int maxUniqueSnapshots) {
-        this.maxUniqueSnapshots = maxUniqueSnapshots;
-    }
-
-    @Override
-    public boolean isSuppressPomConsistencyChecks() {
-        return suppressPomConsistencyChecks;
-    }
-
-    public void setSuppressPomConsistencyChecks(boolean suppressPomConsistencyChecks) {
-        this.suppressPomConsistencyChecks = suppressPomConsistencyChecks;
-    }
-
-    @Override
-    public boolean isHandleReleases() {
-        return handleReleases;
-    }
-
-    public void setHandleReleases(boolean handleReleases) {
-        this.handleReleases = handleReleases;
-    }
-
-    @Override
-    public boolean isHandleSnapshots() {
-        return handleSnapshots;
-    }
-
-    public void setHandleSnapshots(boolean handleSnapshots) {
-        this.handleSnapshots = handleSnapshots;
-    }
-
-    @Override
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    @Override
-    public boolean isBlackedOut() {
-        return blackedOut;
-    }
-
-    public void setBlackedOut(boolean blackedOut) {
-        this.blackedOut = blackedOut;
-    }
-
-    @Override
-    public long getAssumedOfflinePeriodSecs() {
-        return assumedOfflinePeriodSecs;
-    }
-
-    public void setAssumedOfflinePeriodSecs(long assumedOfflinePeriodSecs) {
-        this.assumedOfflinePeriodSecs = assumedOfflinePeriodSecs;
-    }
-
-    @Override
-    public boolean isFetchJarsEagerly() {
-        return fetchJarsEagerly;
-    }
-
-    public void setFetchJarsEagerly(boolean fetchJarsEagerly) {
-        this.fetchJarsEagerly = fetchJarsEagerly;
-    }
-
-    @Override
-    public boolean isFetchSourcesEagerly() {
-        return fetchSourcesEagerly;
-    }
-
-    public void setFetchSourcesEagerly(boolean fetchSourcesEagerly) {
-        this.fetchSourcesEagerly = fetchSourcesEagerly;
-    }
-
-    @Override
-    public boolean isHardFail() {
-        return hardFail;
-    }
-
-    public void setHardFail(boolean hardFail) {
-        this.hardFail = hardFail;
-    }
-
-    @Override
-    public String getLocalAddress() {
-        return localAddress;
-    }
-
-    public void setLocalAddress(String localAddress) {
-        this.localAddress = localAddress;
-    }
-
-    @Override
-    public long getMissedRetrievalCachePeriodSecs() {
-        return missedRetrievalCachePeriodSecs;
-    }
-
-    public void setMissedRetrievalCachePeriodSecs(long missedRetrievalCachePeriodSecs) {
-        this.missedRetrievalCachePeriodSecs = missedRetrievalCachePeriodSecs;
-    }
-
-    @Override
-    public boolean isOffline() {
-        return offline;
-    }
-
-    public void setOffline(boolean offline) {
-        this.offline = offline;
-    }
-
-    @Override
-    public String getPassword() {
-        return password;
-    }
-
-    public void setPassword(String password) {
-        this.password = password;
-    }
-
-    @Override
-    public List<String> getPropertySets() {
-        return propertySets;
-    }
-
-    public void setPropertySets(List<String> propertySets) {
-        this.propertySets = propertySets;
-    }
-
-    @Override
-    public String getProxy() {
-        return proxy;
-    }
-
-    public void setProxy(String proxy) {
-        this.proxy = proxy;
-    }
-
-    @Override
-    public String getRemoteRepoChecksumPolicyType() {
-        return remoteRepoChecksumPolicyType;
-    }
-
-    public void setRemoteRepoChecksumPolicyType(String remoteRepoChecksumPolicyType) {
-        this.remoteRepoChecksumPolicyType = remoteRepoChecksumPolicyType;
-    }
-
-    @Override
-    public long getRetrievalCachePeriodSecs() {
-        return retrievalCachePeriodSecs;
-    }
-
-    public void setRetrievalCachePeriodSecs(long retrievalCachePeriodSecs) {
-        this.retrievalCachePeriodSecs = retrievalCachePeriodSecs;
-    }
-
-    @Override
-    public boolean isShareConfiguration() {
-        return shareConfiguration;
-    }
-
-    public void setShareConfiguration(boolean shareConfiguration) {
-        this.shareConfiguration = shareConfiguration;
-    }
-
-    @Override
-    public int getSocketTimeoutMillis() {
-        return socketTimeoutMillis;
-    }
-
-    public void setSocketTimeoutMillis(int socketTimeoutMillis) {
-        this.socketTimeoutMillis = socketTimeoutMillis;
-    }
-
-    @Override
-    public boolean isStoreArtifactsLocally() {
-        return storeArtifactsLocally;
-    }
-
-    public void setStoreArtifactsLocally(boolean storeArtifactsLocally) {
-        this.storeArtifactsLocally = storeArtifactsLocally;
-    }
-
-    @Override
-    public boolean isSynchronizeProperties() {
-        return synchronizeProperties;
-    }
-
-    public void setSynchronizeProperties(boolean synchronizeProperties) {
-        this.synchronizeProperties = synchronizeProperties;
-    }
-
-    @Override
-    public int getUnusedArtifactsCleanupPeriodHours() {
-        return unusedArtifactsCleanupPeriodHours;
-    }
-
-    public void setUnusedArtifactsCleanupPeriodHours(int unusedArtifactsCleanupPeriodHours) {
-        this.unusedArtifactsCleanupPeriodHours = unusedArtifactsCleanupPeriodHours;
-    }
-
-    @Override
-    public String getUsername() {
-        return username;
-    }
-
-    public void setUsername(String username) {
-        this.username = username;
-    }
-
-    @Override
-    public String getRemoteRepoLayoutRef() {
-        return remoteRepoLayoutRef;
-    }
-
-    public void setRemoteRepoLayoutRef(String remoteRepoLayoutRef) {
-        this.remoteRepoLayoutRef = remoteRepoLayoutRef;
-    }
-
-    @Override
-    public boolean isArchiveBrowsingEnabled() {
-        return archiveBrowsingEnabled;
-    }
-
-    public void setArchiveBrowsingEnabled(boolean archiveBrowsingEnabled) {
-        this.archiveBrowsingEnabled = archiveBrowsingEnabled;
-    }
-
-    @Override
-    public boolean isListRemoteFolderItems() {
-        return listRemoteFolderItems;
-    }
-
-    public void setListRemoteFolderItems(boolean listRemoteFolderItems) {
-        this.listRemoteFolderItems = listRemoteFolderItems;
-    }
-
-    @Override
-    public boolean isRejectInvalidJars() {
-        return rejectInvalidJars;
-    }
-
-    public void setRejectInvalidJars(boolean rejectInvalidJars) {
-        this.rejectInvalidJars = rejectInvalidJars;
-    }
-
-    @Override
-    public boolean isAllowAnyHostAuth() {
-        return allowAnyHostAuth;
-    }
-
-    public void setAllowAnyHostAuth(boolean allowAnyHostAuth) {
-        this.allowAnyHostAuth = allowAnyHostAuth;
-    }
-
-    @Override
-    public boolean isEnableTokenAuthentication() {
-        return enableTokenAuthentication;
-    }
-
-    public void setEnableTokenAuthentication(boolean enableTokenAuthentication) {
-        this.enableTokenAuthentication = enableTokenAuthentication;
-    }
-
-    @Override
-    public String getQueryParams() {
-        return queryParams;
-    }
-
-    public void setQueryParams(String queryParams) {
-        this.queryParams = queryParams;
-    }
-
-    @Override
-    public boolean isEnableCookieManagement() {
-        return enableCookieManagement;
-    }
-
-    public void setEnableCookieManagement(boolean enableCookieManagement) {
-        this.enableCookieManagement = enableCookieManagement;
-    }
-
-    @Override
-    public String getBowerRegistryUrl() {
-        return this.bowerConfiguration != null ? this.bowerConfiguration.getBowerRegistryUrl() : null;
-    }
-
-    @Override
-    public String getPodsSpecsRepoUrl() {
-        return this.podsConfiguration != null ? this.podsConfiguration.getCocoaPodsSpecsRepoUrl() : null;
-    }
-
-    @Override
-    public String getVcsType() {
-        return this.vcsConfiguration != null ? this.vcsConfiguration.getType().name() : null;
-    }
-
-    @Override
-    public String getVcsGitProvider() {
-        return this.vcsConfiguration != null ? this.vcsConfiguration.getGit().getProvider().name() : null;
-    }
-
-    @Override
-    public String getVcsGitDownloadUrl() {
-        return this.vcsConfiguration != null ? this.vcsConfiguration.getGit().getDownloadUrl() : null;
-    }
-
-    // Keep these setters for jackson
-    public void setBowerRegistryUrl(String bowerRegistryUrl) {
-        this.bowerConfiguration.setBowerRegistryUrl(bowerRegistryUrl);
-    }
-
-    public void setPodsSpecsRepoUrl(String podsSpecsRepoUrl) {
-        this.podsConfiguration.setCocoaPodsSpecsRepoUrl(podsSpecsRepoUrl);
-    }
-
-    public void setVcsType(String vcsType) {
-        this.vcsConfiguration.setType(VcsType.valueOf(vcsType));
-    }
-
-    public void setVcsGitProvider(String gitProvider) {
-        this.vcsConfiguration.getGit().setProvider(VcsGitProvider.valueOf(gitProvider));
-    }
-
-    public void setVcsGitDownloadUrl(String vcsGitDownloadUrl) {
-        this.vcsConfiguration.getGit().setDownloadUrl(vcsGitDownloadUrl);
-    }
-
-    public ContentSynchronisation getContentSynchronisation() {
-        return contentSynchronisation;
-    }
-
-    public void setContentSynchronisation(ContentSynchronisation contentSynchronisation) {
-        this.contentSynchronisation = contentSynchronisation;
-    }
-
-    public boolean isPropagateQueryParams() {
-        return propagateQueryParams;
-    }
-
-    public void setPropagateQueryParams(boolean propagateQueryParams) {
-        this.propagateQueryParams = propagateQueryParams;
-    }
-
-    @Override
-    public boolean isBlockMismatchingMimeTypes() {
-        return blockMismatchingMimeTypes;
-    }
-
-    public void setBlockMismatchingMimeTypes(boolean blockMismatchingMimeTypes) {
-        this.blockMismatchingMimeTypes = blockMismatchingMimeTypes;
-    }
-
-    @Override
-    public String getMismatchingMimeTypesOverrideList() {
-        return mismatchingMimeTypesOverrideList;
-    }
-
-    public void setMismatchingMimeTypesOverrideList(String mismatchingMimeTypesOverrideList) {
-        this.mismatchingMimeTypesOverrideList = mismatchingMimeTypesOverrideList;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/repo/LocalRepositoryConfigurationImpl.java b/base/common/src/main/java/org/artifactory/repo/LocalRepositoryConfigurationImpl.java
deleted file mode 100644
index 3962f0f..0000000
--- a/base/common/src/main/java/org/artifactory/repo/LocalRepositoryConfigurationImpl.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Lists;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.descriptor.repo.LocalRepoChecksumPolicyType;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.SnapshotVersionBehavior;
-import org.artifactory.util.RepoLayoutUtils;
-
-import javax.annotation.Nonnull;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Local repository configuration
- *
- * @author Tomer Cohen
- * @see org.artifactory.descriptor.repo.LocalRepoDescriptor
- */
-public class LocalRepositoryConfigurationImpl extends RepositoryConfigurationBase
-        implements LocalRepositoryConfiguration {
-
-    private String checksumPolicyType = "client-checksums";
-    private boolean handleReleases = true;
-    private boolean handleSnapshots = true;
-    private int maxUniqueSnapshots;
-    private String snapshotVersionBehavior = "non-unique";
-    private boolean suppressPomConsistencyChecks = false;
-    private boolean blackedOut = false;
-    private List<String> propertySets;
-    private boolean archiveBrowsingEnabled = false;
-    private boolean calculateYumMetadata = false;
-    private int yumRootDepth = 0;
-    private String yumGroupFileNames;
-
-    public LocalRepositoryConfigurationImpl() {
-        setRepoLayoutRef(RepoLayoutUtils.MAVEN_2_DEFAULT_NAME);
-    }
-
-    public LocalRepositoryConfigurationImpl(LocalRepoDescriptor localRepoDescriptor) {
-        super(localRepoDescriptor, TYPE);
-        LocalRepoChecksumPolicyType checksumPolicyType = localRepoDescriptor.getChecksumPolicyType();
-        setChecksumPolicyType(checksumPolicyType.getMessage());
-        setHandleReleases(localRepoDescriptor.isHandleReleases());
-        setHandleSnapshots(localRepoDescriptor.isHandleSnapshots());
-        setMaxUniqueSnapshots(localRepoDescriptor.getMaxUniqueSnapshots());
-        Map<String, String> snapshotBehaviours = extractXmlValueFromEnumAnnotations(SnapshotVersionBehavior.class);
-        for (Map.Entry<String, String> annotationToField : snapshotBehaviours.entrySet()) {
-            if (annotationToField.getValue().equals(localRepoDescriptor.getSnapshotVersionBehavior().name())) {
-                setSnapshotVersionBehavior(annotationToField.getKey());
-            }
-        }
-        setSuppressPomConsistencyChecks(localRepoDescriptor.isSuppressPomConsistencyChecks());
-        setBlackedOut(localRepoDescriptor.isBlackedOut());
-        List<PropertySet> propertySets = localRepoDescriptor.getPropertySets();
-        if (propertySets != null && !propertySets.isEmpty()) {
-            setPropertySets(Lists.transform(propertySets, new Function<PropertySet, String>() {
-                @Override
-                public String apply(@Nonnull PropertySet input) {
-                    return input.getName();
-                }
-            }));
-        } else {
-            setPropertySets(Lists.<String>newArrayList());
-        }
-        setArchiveBrowsingEnabled(localRepoDescriptor.isArchiveBrowsingEnabled());
-        setCalculateYumMetadata(localRepoDescriptor.isCalculateYumMetadata());
-        setYumRootDepth(localRepoDescriptor.getYumRootDepth());
-        setDebianTrivialLayout(localRepoDescriptor.isDebianTrivialLayout());
-    }
-
-    @Override
-    public boolean isBlackedOut() {
-        return blackedOut;
-    }
-
-    public void setBlackedOut(boolean blackedOut) {
-        this.blackedOut = blackedOut;
-    }
-
-    @Override
-    public String getChecksumPolicyType() {
-        return checksumPolicyType;
-    }
-
-    public void setChecksumPolicyType(String checksumPolicyType) {
-        this.checksumPolicyType = checksumPolicyType;
-    }
-
-    @Override
-    public boolean isHandleReleases() {
-        return handleReleases;
-    }
-
-    public void setHandleReleases(boolean handleReleases) {
-        this.handleReleases = handleReleases;
-    }
-
-    @Override
-    public boolean isHandleSnapshots() {
-        return handleSnapshots;
-    }
-
-    public void setHandleSnapshots(boolean handleSnapshots) {
-        this.handleSnapshots = handleSnapshots;
-    }
-
-    @Override
-    public int getMaxUniqueSnapshots() {
-        return maxUniqueSnapshots;
-    }
-
-    public void setMaxUniqueSnapshots(int maxUniqueSnapshots) {
-        this.maxUniqueSnapshots = maxUniqueSnapshots;
-    }
-
-    @Override
-    public List<String> getPropertySets() {
-        return propertySets;
-    }
-
-    public void setPropertySets(List<String> propertySetKeys) {
-        this.propertySets = propertySetKeys;
-    }
-
-    @Override
-    public String getSnapshotVersionBehavior() {
-        return snapshotVersionBehavior;
-    }
-
-    public void setSnapshotVersionBehavior(String snapshotVersionBehavior) {
-        this.snapshotVersionBehavior = snapshotVersionBehavior;
-    }
-
-    @Override
-    public boolean isSuppressPomConsistencyChecks() {
-        return suppressPomConsistencyChecks;
-    }
-
-    public void setSuppressPomConsistencyChecks(boolean suppressPomConsistencyChecks) {
-        this.suppressPomConsistencyChecks = suppressPomConsistencyChecks;
-    }
-
-    @Override
-    public boolean isArchiveBrowsingEnabled() {
-        return archiveBrowsingEnabled;
-    }
-
-    public void setArchiveBrowsingEnabled(boolean archiveBrowsingEnabled) {
-        this.archiveBrowsingEnabled = archiveBrowsingEnabled;
-    }
-
-    @Override
-    public boolean isCalculateYumMetadata() {
-        return calculateYumMetadata;
-    }
-
-    public void setCalculateYumMetadata(boolean calculateYumMetadata) {
-        this.calculateYumMetadata = calculateYumMetadata;
-    }
-
-    @Override
-    public int getYumRootDepth() {
-        return yumRootDepth;
-    }
-
-    public void setYumRootDepth(int yumRootDepth) {
-        this.yumRootDepth = yumRootDepth;
-    }
-
-    @Override
-    public String getYumGroupFileNames() {
-        return yumGroupFileNames;
-    }
-
-    public void setYumGroupFileNames(String yumGroupFileNames) {
-        this.yumGroupFileNames = yumGroupFileNames;
-    }
-
-}
diff --git a/base/common/src/main/java/org/artifactory/repo/RepoDetails.java b/base/common/src/main/java/org/artifactory/repo/RepoDetails.java
deleted file mode 100644
index b30cb4c..0000000
--- a/base/common/src/main/java/org/artifactory/repo/RepoDetails.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-/**
- * An object to hold minimal details for repository provisioning
- *
- * @author Noam Y. Tenne
- */
-public class RepoDetails {
-
-    private String key;
-    private String description;
-    private RepoDetailsType type;
-    private String url;
-    private String configuration;
-
-    /**
-     * Default Constructor
-     */
-    public RepoDetails() {
-    }
-
-    /**
-     * Local\virtual repository constructor
-     *
-     * @param key         Repository key
-     * @param description Repository description
-     * @param type        Repository type
-     * @param url         URL to repository
-     */
-    public RepoDetails(String key, String description, RepoDetailsType type, String url) {
-        this(key, description, type, url, null);
-    }
-
-    /**
-     * Remote repository constructor
-     *
-     * @param key           Repository key
-     * @param description   Repository description
-     * @param type          Repository type
-     * @param url           URL to repository
-     * @param configuration URL to repository configuration
-     */
-    public RepoDetails(String key, String description, RepoDetailsType type, String url, String configuration) {
-        this.key = key;
-        this.description = description;
-        this.type = type;
-        this.url = url;
-        this.configuration = configuration;
-    }
-
-    /**
-     * Returns the key of the repository
-     *
-     * @return Repository key
-     */
-    public String getKey() {
-        return key;
-    }
-
-    /**
-     * Sets the key of the repository
-     *
-     * @param key Repository key
-     */
-    public void setKey(String key) {
-        this.key = key;
-    }
-
-    /**
-     * Returns the description of the repository
-     *
-     * @return Repository description
-     */
-    public String getDescription() {
-        return description;
-    }
-
-    /**
-     * Sets the description of the repository
-     *
-     * @param description Repository description
-     */
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    /**
-     * Returns the type of the repository
-     *
-     * @return Repository type
-     */
-    public RepoDetailsType getType() {
-        return type;
-    }
-
-    /**
-     * Sets the type of the repository
-     *
-     * @param type Repository type
-     */
-    public void setType(RepoDetailsType type) {
-        this.type = type;
-    }
-
-    /**
-     * Returns the URL of the repository
-     *
-     * @return Repository URL
-     */
-    public String getUrl() {
-        return url;
-    }
-
-    /**
-     * Sets the URL of the repository
-     *
-     * @param url Repository URL
-     */
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    /**
-     * Returns the configuration URL of the repository
-     *
-     * @return Repository configuration URL
-     */
-    public String getConfiguration() {
-        return configuration;
-    }
-
-    /**
-     * Sets the configuration URL of the repository
-     *
-     * @param configuration Repository configuration URL
-     */
-    public void setConfiguration(String configuration) {
-        this.configuration = configuration;
-    }
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/repo/RepoDetailsType.java b/base/common/src/main/java/org/artifactory/repo/RepoDetailsType.java
deleted file mode 100644
index 1590b8d..0000000
--- a/base/common/src/main/java/org/artifactory/repo/RepoDetailsType.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-/**
- * An object that defines the type for the repository provisioning
- *
- * @author Noam Y. Tenne
- */
-public enum RepoDetailsType {
-    LOCAL("Local"), REMOTE("Remote"), VIRTUAL("Virtual");
-
-    private String typeName;
-
-    /**
-     * Main constructor
-     *
-     * @param typeName The display name of the type
-     */
-    RepoDetailsType(String typeName) {
-        this.typeName = typeName;
-    }
-
-    /**
-     * Returns the display name of the type
-     *
-     * @return Type display name
-     */
-    public String getTypeName() {
-        return typeName;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/repo/RepositoryConfigurationBase.java b/base/common/src/main/java/org/artifactory/repo/RepositoryConfigurationBase.java
deleted file mode 100644
index b13be26..0000000
--- a/base/common/src/main/java/org/artifactory/repo/RepositoryConfigurationBase.java
+++ /dev/null
@@ -1,373 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import com.google.common.collect.Maps;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.repo.DockerApiVersion;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.codehaus.jackson.annotate.JsonProperty;
-
-import javax.xml.bind.annotation.XmlEnumValue;
-import java.lang.reflect.Field;
-import java.util.Map;
-
-/**
- * Base class for the repository configuration.
- *
- * @author Tomer Cohen
- */
-public abstract class RepositoryConfigurationBase implements RepositoryConfiguration {
-
-    private String key;
-    private String type;
-    private String packageType;
-    private String description = "";
-    private String notes = "";
-    private String includesPattern = "";
-    private String excludesPattern = "";
-    private String repoLayoutRef;
-    private boolean enableNuGetSupport = false;
-    private boolean enableGemsSupport = false;
-    private boolean enableNpmSupport = false;
-    private boolean enableBowerSupport = false;
-    private boolean enableCocoaPodsSupport = false;
-    private boolean enableDebianSupport = false;
-    private boolean debianTrivialLayout = false;
-    private boolean enablePypiSupport = false;
-    private boolean enableDockerSupport = false;
-    private DockerApiVersion dockerApiVersion = DockerApiVersion.V2;
-    private boolean forceDockerAuthentication = false;
-    private boolean forceNugetAuthentication = false;
-    private boolean enableVagrantSupport = false;
-    private boolean enableGitLfsSupport = false;
-    private boolean enableDistRepoSupport = false;
-
-    protected RepositoryConfigurationBase() {
-    }
-
-    protected RepositoryConfigurationBase(RepoDescriptor repoDescriptor, String type) {
-        this.key = repoDescriptor.getKey();
-        this.type = type;
-        this.packageType = repoDescriptor.getType().toString().toLowerCase();
-        String description = repoDescriptor.getDescription();
-        if (StringUtils.isNotBlank(description)) {
-            setDescription(description);
-        }
-        String notes = repoDescriptor.getNotes();
-        if (StringUtils.isNotBlank(notes)) {
-            setNotes(notes);
-        }
-        String excludesPattern = repoDescriptor.getExcludesPattern();
-        if (StringUtils.isNotBlank(excludesPattern)) {
-            setExcludesPattern(excludesPattern);
-        }
-        String includesPattern = repoDescriptor.getIncludesPattern();
-        if (StringUtils.isNotBlank(includesPattern)) {
-            setIncludesPattern(includesPattern);
-        }
-        RepoLayout repoLayout = repoDescriptor.getRepoLayout();
-        if (repoLayout != null) {
-            setRepoLayoutRef(repoLayout.getName());
-        }
-
-
-        switch (repoDescriptor.getType()) {
-            case Maven:
-                break;
-            case Gradle:
-                break;
-            case Ivy:
-                break;
-            case SBT:
-                break;
-            case NuGet:
-                setEnableNuGetSupport(true);
-                setForceNugetAuthentication(repoDescriptor.isForceNugetAuthentication());
-                break;
-            case Gems:
-                setEnableGemsSupport(true);
-                break;
-            case Npm:
-                setEnableNpmSupport(true);
-                break;
-            case Bower:
-                setEnableBowerSupport(true);
-                break;
-            case CocoaPods:
-                setEnableCocoaPodsSupport(true);
-            case Debian:
-                setEnableDebianSupport(true);
-                break;
-            case Distribution:
-                setEnableDistRepoSupport(true);
-                break;
-            case Pypi:
-                setEnablePypiSupport(true);
-                break;
-            case Docker:
-                setEnableDockerSupport(true);
-                setDockerApiVersion(repoDescriptor.getDockerApiVersion().name());
-                setForceDockerAuthentication(repoDescriptor.isForceDockerAuthentication());
-                break;
-            case Vagrant:
-                setEnableVagrantSupport(true);
-                break;
-            case GitLfs:
-                setEnableGitLfsSupport(true);
-                break;
-            case YUM:
-                break;
-            case VCS:
-                break;
-            case P2:
-                break;
-            case Generic:
-                break;
-        }
-
-    }
-
-    public void setKey(String key) {
-        this.key = key;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    @Override
-    public String getKey() {
-        return key;
-    }
-
-    @Override
-    @JsonProperty(TYPE_KEY)
-    public String getType() {
-        return type;
-    }
-
-    @Override
-    public String getPackageType() {
-        return packageType;
-    }
-
-    public void setPackageType(String packageType) {
-        this.packageType = packageType.toLowerCase();
-    }
-
-    @Override
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    @Override
-    public String getExcludesPattern() {
-        return excludesPattern;
-    }
-
-    public void setExcludesPattern(String excludesPattern) {
-        this.excludesPattern = excludesPattern;
-    }
-
-    @Override
-    public String getIncludesPattern() {
-        return includesPattern;
-    }
-
-    public void setIncludesPattern(String includesPattern) {
-        this.includesPattern = includesPattern;
-    }
-
-    @Override
-    public String getNotes() {
-        return notes;
-    }
-
-    public void setNotes(String notes) {
-        this.notes = notes;
-    }
-
-    @Override
-    public String getRepoLayoutRef() {
-        return repoLayoutRef;
-    }
-
-    public void setRepoLayoutRef(String repoLayoutRef) {
-        this.repoLayoutRef = repoLayoutRef;
-    }
-
-    @Override
-    public boolean isEnableNuGetSupport() {
-        return enableNuGetSupport;
-    }
-
-    public void setEnableNuGetSupport(boolean enableNuGetSupport) {
-        this.enableNuGetSupport = enableNuGetSupport;
-    }
-
-    @Override
-    public boolean isEnableGemsSupport() {
-        return enableGemsSupport;
-    }
-
-    public void setEnableGemsSupport(boolean enableGemsSupport) {
-        this.enableGemsSupport = enableGemsSupport;
-    }
-
-    @Override
-    public boolean isEnableNpmSupport() {
-        return enableNpmSupport;
-    }
-
-    public void setEnableNpmSupport(boolean enableNpmSupport) {
-        this.enableNpmSupport = enableNpmSupport;
-    }
-
-    @Override
-    public boolean isEnableBowerSupport() {
-        return enableBowerSupport;
-    }
-
-    public void setEnableBowerSupport(boolean enableBowerSupport) {
-        this.enableBowerSupport = enableBowerSupport;
-    }
-
-    @Override
-    public boolean isEnableCocoaPodsSupport() {
-        return enableCocoaPodsSupport;
-    }
-
-    public void setEnableCocoaPodsSupport(boolean enableCocoaPodsSupport) {
-        this.enableCocoaPodsSupport = enableCocoaPodsSupport;
-    }
-
-    public void setEnableDebianSupport(boolean enableDebianSupport) {
-        this.enableDebianSupport = enableDebianSupport;
-    }
-
-    @Override
-    public boolean isEnableDebianSupport() {
-        return enableDebianSupport;
-    }
-
-    @Override
-    public boolean isDebianTrivialLayout() {
-        return debianTrivialLayout;
-    }
-
-    @Override
-    public boolean isEnableDistRepoSupport() {
-        return enableDistRepoSupport;
-    }
-
-    public void setEnableDistRepoSupport(boolean enableDistRepoSupport) {
-        this.enableDistRepoSupport = enableDistRepoSupport;
-    }
-
-    public void setDebianTrivialLayout(boolean debianTrivialLayout) {
-        this.debianTrivialLayout = debianTrivialLayout;
-    }
-
-    @Override
-    public boolean isEnablePypiSupport() {
-        return enablePypiSupport;
-    }
-
-    public void setEnablePypiSupport(boolean enablePypiSupport) {
-        this.enablePypiSupport = enablePypiSupport;
-    }
-
-    @Override
-    public boolean isEnableDockerSupport() {
-        return enableDockerSupport;
-    }
-
-    public void setEnableDockerSupport(boolean enableDockerSupport) {
-        this.enableDockerSupport = enableDockerSupport;
-    }
-
-    @Override
-    public String getDockerApiVersion() {
-        return dockerApiVersion.name();
-    }
-
-    public void setDockerApiVersion(String dockerApiVersion) {
-        this.dockerApiVersion = DockerApiVersion.valueOf(dockerApiVersion);
-    }
-
-    @Override
-    public boolean isForceDockerAuthentication() {
-        return forceDockerAuthentication;
-    }
-
-    public void setForceDockerAuthentication(boolean forceDockerAuthentication) {
-        this.forceDockerAuthentication = forceDockerAuthentication;
-    }
-
-    @Override
-    public boolean isForceNugetAuthentication() {
-        return forceNugetAuthentication;
-    }
-
-    public void setForceNugetAuthentication(boolean forceNugetAuthentication) {
-        this.forceNugetAuthentication = forceNugetAuthentication;
-    }
-
-    @Override
-    public boolean isEnableVagrantSupport() {
-        return enableVagrantSupport;
-    }
-
-    public void setEnableVagrantSupport(boolean enableVagrantSupport) {
-        this.enableVagrantSupport = enableVagrantSupport;
-    }
-
-    @Override
-    public boolean isEnableGitLfsSupport() {
-        return enableGitLfsSupport;
-    }
-
-    public void setEnableGitLfsSupport(boolean enableGitLfsSupport) {
-        this.enableGitLfsSupport = enableGitLfsSupport;
-    }
-
-    /**
-     * Extract from an Enum the {@link javax.xml.bind.annotation.XmlEnumValue} that are associated with its fields.
-     *
-     * @param clazz The class that is to be introspected
-     * @return A map that maps {@link javax.xml.bind.annotation.XmlEnumValue#value()} to the enum name itself.
-     */
-    protected Map<String, String> extractXmlValueFromEnumAnnotations(Class clazz) {
-        Map<String, String> annotationToName = Maps.newHashMap();
-        Field[] fields = clazz.getFields();
-        for (Field field : fields) {
-            if (field.isAnnotationPresent(XmlEnumValue.class)) {
-                XmlEnumValue annotation = field.getAnnotation(XmlEnumValue.class);
-                annotationToName.put(annotation.value(), field.getName());
-            }
-        }
-        return annotationToName;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/repo/VirtualRepositoryConfigurationImpl.java b/base/common/src/main/java/org/artifactory/repo/VirtualRepositoryConfigurationImpl.java
deleted file mode 100644
index 82ae9ef..0000000
--- a/base/common/src/main/java/org/artifactory/repo/VirtualRepositoryConfigurationImpl.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.repo.ExternalDependenciesConfig;
-import org.artifactory.descriptor.repo.PomCleanupPolicy;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * Virtual repository configuration
- *
- * @author Tomer Cohen
- * @see org.artifactory.descriptor.repo.VirtualRepoDescriptor
- */
-public class VirtualRepositoryConfigurationImpl extends RepositoryConfigurationBase
-        implements VirtualRepositoryConfiguration {
-
-    private List<String> repositories;
-    private boolean artifactoryRequestsCanRetrieveRemoteArtifacts = false;
-    private String keyPair = "";
-    private String pomRepositoryReferencesCleanupPolicy = "discard_active_reference";
-    private String defaultDeploymentRepo;
-    private boolean externalDependenciesEnabled;
-    private String externalDependenciesRemoteRepo;
-    private List<String> externalDependenciesPatterns;
-
-    public VirtualRepositoryConfigurationImpl() {
-    }
-
-    public VirtualRepositoryConfigurationImpl(VirtualRepoDescriptor repoDescriptor) {
-        super(repoDescriptor, TYPE);
-        setArtifactoryRequestsCanRetrieveRemoteArtifacts(
-                repoDescriptor.isArtifactoryRequestsCanRetrieveRemoteArtifacts());
-        String keyPair = repoDescriptor.getKeyPair();
-        if (StringUtils.isNotBlank(keyPair)) {
-            setKeyPair(keyPair);
-        }
-        Map<String, String> pomCleanupPolicies = extractXmlValueFromEnumAnnotations(PomCleanupPolicy.class);
-        for (Map.Entry<String, String> pomCleanupPolicy : pomCleanupPolicies.entrySet()) {
-            if (pomCleanupPolicy.getKey().equals(repoDescriptor.getPomRepositoryReferencesCleanupPolicy().name())) {
-                setPomRepositoryReferencesCleanupPolicy(pomCleanupPolicy.getKey());
-            }
-        }
-        List<RepoDescriptor> repositories = repoDescriptor.getRepositories();
-        setRepositories(Lists.transform(repositories, RepoDescriptor::getKey));
-        if (repoDescriptor.getDefaultDeploymentRepo() != null) {
-            setDefaultDeploymentRepo(repoDescriptor.getDefaultDeploymentRepo().getKey());
-        }
-        if (repoDescriptor.getExternalDependencies() != null) {
-            ExternalDependenciesConfig externalDependencies = repoDescriptor.getExternalDependencies();
-            setExternalDependenciesEnabled(externalDependencies.isEnabled());
-            if (externalDependencies.getRemoteRepo() != null) {
-                setExternalDependenciesRemoteRepo(externalDependencies.getRemoteRepo().getKey());
-            }
-            setExternalDependenciesPatterns(externalDependencies.getPatterns());
-        }
-    }
-
-    @Override
-    public boolean isArtifactoryRequestsCanRetrieveRemoteArtifacts() {
-        return artifactoryRequestsCanRetrieveRemoteArtifacts;
-    }
-
-    public void setArtifactoryRequestsCanRetrieveRemoteArtifacts(
-            boolean artifactoryRequestsCanRetrieveRemoteArtifacts) {
-        this.artifactoryRequestsCanRetrieveRemoteArtifacts = artifactoryRequestsCanRetrieveRemoteArtifacts;
-    }
-
-    @Override
-    public String getKeyPair() {
-        return keyPair;
-    }
-
-    public void setKeyPair(String keyPair) {
-        this.keyPair = keyPair;
-    }
-
-    @Override
-    public String getPomRepositoryReferencesCleanupPolicy() {
-        return pomRepositoryReferencesCleanupPolicy;
-    }
-
-    public void setPomRepositoryReferencesCleanupPolicy(String pomRepositoryReferencesCleanupPolicy) {
-        this.pomRepositoryReferencesCleanupPolicy = pomRepositoryReferencesCleanupPolicy;
-    }
-
-    @Override
-    public String getDefaultDeploymentRepo() {
-        return defaultDeploymentRepo;
-    }
-
-    public void setDefaultDeploymentRepo(String defaultDeploymentRepo) {
-        this.defaultDeploymentRepo = defaultDeploymentRepo;
-    }
-
-    @Override
-    public List<String> getRepositories() {
-        return repositories;
-    }
-
-    public void setRepositories(List<String> repositories) {
-        this.repositories = repositories;
-    }
-
-    @Override
-    public boolean isExternalDependenciesEnabled() {
-        return externalDependenciesEnabled;
-    }
-
-    public void setExternalDependenciesEnabled(boolean externalDependenciesEnabled) {
-        this.externalDependenciesEnabled = externalDependenciesEnabled;
-    }
-
-    @Override
-    public String getExternalDependenciesRemoteRepo() {
-        return externalDependenciesRemoteRepo;
-    }
-
-    public void setExternalDependenciesRemoteRepo(String externalDependenciesRemoteRepo) {
-        this.externalDependenciesRemoteRepo = externalDependenciesRemoteRepo;
-    }
-
-    @Override
-    public List<String> getExternalDependenciesPatterns() {
-        return externalDependenciesPatterns;
-    }
-
-    public void setExternalDependenciesPatterns(List<String> externalDependenciesPatterns) {
-        this.externalDependenciesPatterns = externalDependenciesPatterns;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/repo/distribution/auth/BintrayTokenProvider.java b/base/common/src/main/java/org/artifactory/repo/distribution/auth/BintrayTokenProvider.java
deleted file mode 100644
index 670894b..0000000
--- a/base/common/src/main/java/org/artifactory/repo/distribution/auth/BintrayTokenProvider.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package org.artifactory.repo.distribution.auth;
-
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.bintray.distribution.DistributionService;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.util.bearer.TokenProvider;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nonnull;
-import javax.annotation.PostConstruct;
-import java.util.Map;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Bintray specific implementation of a {@link TokenProvider}.
- * The tokens are cached in-memory and auto expire according to the
- * {@code ConstantValues.bintrayOAuthTokenExpirySeconds} system property
- *
- * @author Dan Feldman
- */
- at Service
-public class BintrayTokenProvider implements TokenProvider {
-    private static final Logger log = LoggerFactory.getLogger(BintrayTokenProvider.class);
-
-    @Autowired
-    private DistributionService distService;
-
-    private LoadingCache<String, String> tokens;
-
-    @PostConstruct
-    public void initTokensCache() {
-        tokens = CacheBuilder.newBuilder()
-                .initialCapacity(100)
-                .expireAfterWrite(ConstantValues.bintrayOAuthTokenExpirySeconds.getLong(), TimeUnit.SECONDS)
-                .build(new CacheLoader<String, String>() {
-                    @Override
-                    public String load(@Nonnull String repoKey) throws Exception {
-                        String token = fetchNewToken(repoKey);
-                        if (StringUtils.isBlank(token)) {
-                            throw new Exception("Can't fetch Bintray OAuth token for repo: " + repoKey);
-                        }
-                        return token;
-                    }
-                });
-    }
-
-    @Override
-    public String getToken(Map<String, String> challengeParams, String method, String uri, String repoKey) {
-        try {
-            log.trace("Getting Bintray OAuth token for {}, that has expiry of {}", repoKey,
-                    ConstantValues.bintrayOAuthTokenExpirySeconds.getLong());
-            return tokens.get(repoKey);
-        } catch (ExecutionException e) {
-            throw new RuntimeException("Could not get Bintray OAuth token from cache for " + repoKey, e);
-        }
-    }
-
-    private String fetchNewToken(String repoKey) throws Exception {
-        log.trace("Fetching new OAuth token from Bintray for repo '{}'", repoKey);
-        //TODO [by dan]: handle errors?
-        return distService.refreshBintrayOAuthAppToken(repoKey);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/repo/http/CloseableHttpClientDecorator.java b/base/common/src/main/java/org/artifactory/repo/http/CloseableHttpClientDecorator.java
deleted file mode 100644
index f281c43..0000000
--- a/base/common/src/main/java/org/artifactory/repo/http/CloseableHttpClientDecorator.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.http;
-
-import com.google.common.collect.Lists;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpRequestBase;
-import org.apache.http.conn.ClientConnectionManager;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.apache.http.params.HttpParams;
-import org.apache.http.protocol.HttpContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.observers.CloseableObserver;
-import org.artifactory.repo.http.kerberos.KerberosAuthProvider;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import java.io.IOException;
-import java.util.List;
-import java.util.Optional;
-
-/**
- * Provides decoration capabilities for HttpClient,
- * where {@link CloseableObserver} can register to
- * onClose() event
- *
- * @author Michael Pasternak
- */
-public class CloseableHttpClientDecorator extends CloseableHttpClient {
-
-    private static final Logger log = LoggerFactory.getLogger(CloseableHttpClientDecorator.class);
-
-    private final CloseableHttpClient closeableHttpClient;
-    private final List<CloseableObserver> closeableObservers;
-    private final KerberosAuthProvider kerberosAuthProvider;
-
-    /**
-     * @param closeableHttpClient     {@link CloseableHttpClient}
-     * @param clientConnectionManager {@link PoolingHttpClientConnectionManager}
-     */
-    public CloseableHttpClientDecorator(CloseableHttpClient closeableHttpClient,
-            PoolingHttpClientConnectionManager clientConnectionManager, boolean useKerberos) {
-        assert closeableHttpClient != null : "closeableHttpClient cannot be empty";
-        assert clientConnectionManager != null : "clientConnectionManager cannot be empty";
-        this.closeableObservers = Lists.newArrayList();
-        this.closeableHttpClient = closeableHttpClient;
-        IdleConnectionMonitorService idleConnectionMonitorService =
-                ContextHelper.get().beanForType(IdleConnectionMonitorService.class);
-        idleConnectionMonitorService.add(this, clientConnectionManager);
-        registerCloseableObserver((CloseableObserver) idleConnectionMonitorService);
-        kerberosAuthProvider = useKerberos ? new KerberosAuthProvider(closeableHttpClient) : null;
-    }
-
-    /**
-     * Release resources and unregister itself from {@link IdleConnectionMonitorService}
-     *
-     * @throws IOException
-     */
-    @Override
-    public void close() throws IOException {
-        // notify listeners
-        onClose();
-        // release resources
-        closeableHttpClient.close();
-    }
-
-    @Override
-    protected CloseableHttpResponse doExecute(HttpHost target, HttpRequest request, HttpContext context)
-            throws IOException {
-        return closeableHttpClient.execute(target, request, context);
-    }
-
-    @Deprecated
-    @Override
-    public HttpParams getParams() {
-        return closeableHttpClient.getParams();
-    }
-
-    @Deprecated
-    @Override
-    public ClientConnectionManager getConnectionManager() {
-        return closeableHttpClient.getConnectionManager();
-    }
-
-    /**
-     * @return {@link CloseableHttpClient}
-     */
-    public final CloseableHttpClient getDecorated() {
-        return closeableHttpClient;
-    }
-
-    /**
-     * Registers {@link CloseableObserver}
-     *
-     * @param closeableObserver
-     */
-    public final void registerCloseableObserver(CloseableObserver closeableObserver) {
-        closeableObservers.add(closeableObserver);
-    }
-
-    /**
-     * Fired on close() event
-     */
-    private void onClose() {
-        closeableObservers.stream().forEach(o -> o.onObservedClose(this));
-    }
-
-    /**
-     * Executes request using kerberos credentials authentication
-     *
-     * @param principal a user principal
-     * @param password  a principal password
-     * @param request   a request to execute
-     *
-     * @return {@link CloseableHttpResponse}
-     */
-    public CloseableHttpResponse executeKerberos(String principal, char[] password, HttpRequestBase request) throws IOException {
-        log.trace("Executing kerberos password based request principal='{}', method='{}', url={}",
-                principal, request.getMethod(), request.getURI());
-        return Optional.ofNullable(kerberosAuthProvider)
-                .orElseThrow(() -> new IOException("Kerberos authentication not supported by this client"))
-                .executeKerberos(principal, password, request);
-    }
-
-    /**
-     * Executes request using kerberos keytab authentication
-     *
-     * @param principal  a principal to be used
-     * @param keyTabLocation a keytab location
-     * @param request        a request to execute
-     *
-     * @return {@link CloseableHttpResponse}
-     */
-    public CloseableHttpResponse executeKerberos(String principal, String keyTabLocation, HttpRequestBase request) throws IOException {
-        log.trace("Executing kerberos keytab based request principal='{}', method='{}', url={}",
-                principal, request.getMethod(), request.getURI());
-        return Optional.ofNullable(kerberosAuthProvider)
-                .orElseThrow(() -> new IOException("Kerberos authentication not supported by this client"))
-                .executeKerberos(principal, keyTabLocation, request);
-    }
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/repo/http/IdleConnectionMonitorService.java b/base/common/src/main/java/org/artifactory/repo/http/IdleConnectionMonitorService.java
deleted file mode 100644
index 7634b04..0000000
--- a/base/common/src/main/java/org/artifactory/repo/http/IdleConnectionMonitorService.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.http;
-
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-
-import javax.annotation.Nullable;
-
-/**
- * Service providing idle connections monitoring
- * for {@link PoolingHttpClientConnectionManager}
- *
- * @author Michael Pasternak
- */
-public interface IdleConnectionMonitorService {
-    /**
-     * Adds {@link org.apache.http.impl.conn.PoolingHttpClientConnectionManager} to monitor
-     *
-     * @param owner the owner of connectionManager
-     * @param connectionManager {@link PoolingHttpClientConnectionManager}
-     */
-    public void add(Object owner, PoolingHttpClientConnectionManager connectionManager);
-
-    /**
-     * @return {@link Thread.State}
-     */
-    @Nullable
-    public Thread.State getStatus();
-
-    /**
-     * Removes monitored {@link PoolingHttpClientConnectionManager}
-     *
-     * @param owner
-     */
-    public void remove(Object owner);
-
-    /**
-     * Causes this thread to begin execution
-     *
-     * @exception  IllegalThreadStateException  if the thread was already
-     *               started.
-     */
-    public void start();
-
-    /**
-     * Stops idleConnection watcher
-     */
-    public void stop();
-}
diff --git a/base/common/src/main/java/org/artifactory/repo/http/IdleConnectionMonitorServiceImpl.java b/base/common/src/main/java/org/artifactory/repo/http/IdleConnectionMonitorServiceImpl.java
deleted file mode 100644
index e5f534a..0000000
--- a/base/common/src/main/java/org/artifactory/repo/http/IdleConnectionMonitorServiceImpl.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.http;
-
-import com.google.common.collect.Maps;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.observers.CloseableObserver;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nullable;
-import java.util.Map;
-
-/**
- * Service providing idle connections monitoring
- * for {@link PoolingHttpClientConnectionManager}
- *
- * @author Michael Pasternak
- */
- at Lazy(true)
- at Scope(BeanDefinition.SCOPE_SINGLETON)
- at Service
-public class IdleConnectionMonitorServiceImpl implements IdleConnectionMonitorService, CloseableObserver {
-
-    private static final Logger log = LoggerFactory.getLogger(IdleConnectionMonitorServiceImpl.class);
-    private static int MONITOR_INTERVAL;
-
-    private IdleConnectionMonitorThread idleConnectionMonitorThread;
-    private final Map<Object, PoolingHttpClientConnectionManager> remoteRepoHttpConnMgrList = Maps.newConcurrentMap();
-
-    public IdleConnectionMonitorServiceImpl() {
-        MONITOR_INTERVAL = ConstantValues.idleConnectionMonitorInterval.getInt() * 1000;
-        createTread();
-    }
-
-    /**
-     * Creates thread
-     */
-    private void createTread() {
-        if(!ConstantValues.disableIdleConnectionMonitoring.getBoolean()) {
-            idleConnectionMonitorThread = new IdleConnectionMonitorThread(remoteRepoHttpConnMgrList);
-            idleConnectionMonitorThread.setName("Idle Connection Monitor");
-            idleConnectionMonitorThread.setDaemon(true);
-            idleConnectionMonitorThread.start();
-        }
-    }
-
-    /**
-     * @return {@link Thread.State}
-     */
-    @Nullable
-    @Override
-    public Thread.State getStatus() {
-        return idleConnectionMonitorThread != null ?
-                idleConnectionMonitorThread.getState() : null;
-    }
-
-    /**
-     * Causes this service to begin idle connections monitoring
-     *
-     * @exception  IllegalThreadStateException  if the thread was already started.
-     */
-    @Override
-    public void start() {
-        if(!ConstantValues.disableIdleConnectionMonitoring.getBoolean() &&
-                (idleConnectionMonitorThread == null || !idleConnectionMonitorThread.isAlive()))
-            createTread();
-    }
-
-    /**
-     * Stops idleConnection monitoring
-     */
-    @Override
-    public final void stop() {
-        log.debug("Stopping IdleConnectionMonitorService");
-        if (idleConnectionMonitorThread != null) {
-            idleConnectionMonitorThread.shutdown();
-        }
-    }
-
-    /**
-     * Adds {@link org.apache.http.impl.conn.PoolingHttpClientConnectionManager} to monitor
-     *
-     * @param owner the owner of connectionManager
-     * @param connectionManager {@link PoolingHttpClientConnectionManager}
-     */
-    @Override
-    public final void add(Object owner, PoolingHttpClientConnectionManager connectionManager) {
-        if (owner != null && connectionManager != null) {
-            log.debug("Performing add request for params owner: {}, connectionManager: {}",
-                    owner, connectionManager);
-            remoteRepoHttpConnMgrList.put(owner, connectionManager);
-        } else {
-            log.debug("Ignoring add request for params owner: {}, connectionManager: {}",
-                    owner, connectionManager);
-        }
-    }
-
-    /**
-     * Removes monitored {@link PoolingHttpClientConnectionManager}
-     *
-     * @param owner the object that owns this PoolingHttpClientConnectionManager
-     */
-    @Override
-    public final void remove(Object owner) {
-        if (owner != null) {
-            log.debug("Performing remove request for owner: {}", owner);
-            remoteRepoHttpConnMgrList.remove(owner);
-        } else {
-            log.debug("Ignoring remove request for undefined owner");
-        }
-    }
-
-    /**
-     * Invoked by observed objects on close() event {@see CloseableObserver}
-     *
-     * @param object the owner of observed event
-     */
-    @Override
-    public void onObservedClose(Object object) {
-        remove(object);
-    }
-
-    /**
-     * thread to monitor expired and idle connection , if found clear it and return it back to pool
-     */
-    private static class IdleConnectionMonitorThread extends Thread {
-
-        private final Map<Object, PoolingHttpClientConnectionManager> connMgrList;
-        private volatile boolean shutdown;
-
-        public IdleConnectionMonitorThread(Map<Object, PoolingHttpClientConnectionManager> connMgrList) {
-            super();
-            this.connMgrList = connMgrList;
-        }
-
-        @Override
-        public void run() {
-            try {
-                log.debug("Starting Idle Connection Monitor Thread ");
-                synchronized (this) {
-                    while (!shutdown) {
-                        wait(MONITOR_INTERVAL);
-                        if (!connMgrList.isEmpty()) {
-                            for (PoolingHttpClientConnectionManager connPollMgr : connMgrList.values()) {
-                                if (connPollMgr != null) {
-                                    log.debug("Cleaning idle connections for ConnectionManager: {}", connPollMgr);
-                                    connPollMgr.closeExpiredConnections();
-                                }
-                            }
-                        }
-                    }
-                }
-            } catch (InterruptedException ex) {
-                log.debug("Terminating Idle Connection Monitor Thread ");
-            }
-        }
-
-        public void shutdown() {
-            log.debug("Shutdown Idle Connection Monitor Thread ");
-            shutdown = true;
-            synchronized (this) {
-                notifyAll();
-            }
-        }
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/repo/http/kerberos/KerberosAuthProvider.java b/base/common/src/main/java/org/artifactory/repo/http/kerberos/KerberosAuthProvider.java
deleted file mode 100644
index eb1e5b4..0000000
--- a/base/common/src/main/java/org/artifactory/repo/http/kerberos/KerberosAuthProvider.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.repo.http.kerberos;
-
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.authentication.jaas.memory.InMemoryConfiguration;
-
-import javax.security.auth.Subject;
-import javax.security.auth.callback.Callback;
-import javax.security.auth.callback.CallbackHandler;
-import javax.security.auth.callback.NameCallback;
-import javax.security.auth.callback.PasswordCallback;
-import javax.security.auth.callback.UnsupportedCallbackException;
-import javax.security.auth.login.AppConfigurationEntry;
-import javax.security.auth.login.LoginContext;
-import javax.security.auth.login.LoginException;
-import org.apache.http.client.methods.HttpRequestBase;
-
-import java.io.IOException;
-import java.security.PrivilegedAction;
-import java.util.HashMap;
-import java.util.Map;
-
-
-/**
- * Provides kerberos auth capabilities
- *
- * @author Michael Pasternak
- */
-public class KerberosAuthProvider {
-    private final CloseableHttpClient closeableHttpClient;
-    private static final Logger log = LoggerFactory.getLogger(KerberosAuthProvider.class);
-
-    public KerberosAuthProvider(CloseableHttpClient closeableHttpClient) {
-        this.closeableHttpClient = closeableHttpClient;
-    }
-
-    /**
-     * Executes request using kerberos credentials authentication
-     *
-     * @param principal a user principal
-     * @param password a principal password
-     * @param request a request to execute
-     *
-     * @return {@link CloseableHttpResponse}
-     */
-    public CloseableHttpResponse executeKerberos(String principal, char[] password, HttpRequestBase request) {
-        LoginContext loginCOntext = null;
-        CloseableHttpResponse response = null;
-        try {
-            loginCOntext = new LoginContext("KrbLogin", new Subject(),
-                    new KerberosCallBackHandler(principal, password),
-                    new InMemoryConfiguration(new HashMap<String, AppConfigurationEntry[]>(){{
-                        put("KrbLogin", getPasswordConfigurationEntry());
-                    }}));
-
-            log.trace("Obtaining password subject for principal '{}'", principal);
-            loginCOntext.login();
-            // TODO: [mp] reuse loged-in state rather than re-authenticating
-
-            PrivilegedAction sendAction = new PrivilegedAction() {
-                CloseableHttpResponse res = null;
-                @Override
-                public Object run() {
-                    try {
-                        log.trace("Executing PrivilegedAction callback");
-                        res = closeableHttpClient.execute(request);
-                    } catch (IOException e) {
-                        log.error("Error during privileged action execution, " + e.getMessage());
-                    }
-                    return res;
-                }
-            };
-            log.trace("Executing PrivilegedAction using password subject principals '{}'", loginCOntext.getSubject().getPrincipals());
-            response = (CloseableHttpResponse) Subject.doAs(loginCOntext.getSubject(), sendAction);
-            return response;
-        } catch (LoginException le) {
-            log.error("Kerberos login has failed, " + le.getMessage());
-            log.debug("Cause: {}", le);
-        } finally {
-            logoutKerberos(loginCOntext);
-        }
-        return null;
-    }
-
-    /**
-     * Explicit logout for kerberos auth
-     *
-     * @param loginCOntext {@link LoginContext} to be used
-     */
-    private void logoutKerberos(LoginContext loginCOntext) {
-        if(loginCOntext != null) {
-            try {
-                log.trace("Log out of principals {}", loginCOntext.getSubject().getPrincipals());
-                loginCOntext.logout();
-            } catch (LoginException e) {
-                log.debug("Logout has failed: " + e.getMessage(), e);
-            }
-        }
-    }
-
-    /**
-     * Executes request using kerberos keytab authentication
-     *
-     * @param userPrincipal a principal to be used
-     * @param keyTabLocation a keytab location
-     * @param request a request to execute
-     *
-     * @return {@link CloseableHttpResponse}
-     */
-    public CloseableHttpResponse executeKerberos(String userPrincipal, String keyTabLocation, HttpRequestBase request) {
-        LoginContext loginCOntext = null;
-        CloseableHttpResponse response = null;
-        try {
-            loginCOntext = new LoginContext("KrbLogin", new Subject(),
-                    new KerberosCallBackHandler(userPrincipal),
-                    new InMemoryConfiguration(new HashMap<String, AppConfigurationEntry[]>(){{
-                        put("KrbLogin", getKeyTabConfigurationEntry(keyTabLocation, userPrincipal));
-                    }}));
-
-            log.trace("Obtaining keytab subject for principal '{}'", userPrincipal);
-            loginCOntext.login();
-            // TODO: [mp] reuse loged-in state rather than re-authenticating
-
-            PrivilegedAction sendAction = new PrivilegedAction() {
-                CloseableHttpResponse res = null;
-                @Override
-                public Object run() {
-                    try {
-                        log.trace("Executing PrivilegedAction callback");
-                        res = closeableHttpClient.execute(request);
-                    } catch (IOException e) {
-                        log.error("Error during privileged action execution, " + e.getMessage());
-                    }
-                    return res;
-                }
-            };
-            log.trace("Executing PrivilegedAction using keytab subject principals '{}'", loginCOntext.getSubject().getPrincipals());
-            response = (CloseableHttpResponse) Subject.doAs(loginCOntext.getSubject(), sendAction);
-            return response;
-        } catch (LoginException le) {
-            log.error("Kerberos login has failed, " + le.getMessage());
-        } finally {
-            logoutKerberos(loginCOntext);
-        }
-        return null;
-    }
-
-    /**
-     * Configures keytab centric {@link AppConfigurationEntry}s
-     *
-     * @param keyTabLocation keytab location
-     * @param userPrincipal the principal to be used
-     *
-     * @return and array of {@link AppConfigurationEntry}
-     */
-    private AppConfigurationEntry[] getKeyTabConfigurationEntry(String keyTabLocation, String userPrincipal) {
-
-        Map<String, Object> options = new HashMap<String, Object>();
-
-        options.put("useKeyTab", "true");
-        options.put("storeKey", "true");
-        options.put("keyTab", keyTabLocation);
-        options.put("principal", userPrincipal);
-        options.put("isInitiator", "true");
-        options.put("debug", Boolean.toString(log.isDebugEnabled()));
-
-        return new AppConfigurationEntry[] { new AppConfigurationEntry(
-                "com.sun.security.auth.module.Krb5LoginModule",
-                AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options) };
-    }
-
-    /**
-     * Configures password centric {@link AppConfigurationEntry}s
-     *
-     * @return and array of {@link AppConfigurationEntry}
-     */
-    private AppConfigurationEntry[] getPasswordConfigurationEntry() {
-
-        Map<String, Object> options = new HashMap<String, Object>();
-
-        options.put("useSubjectCredsOnly", "false");
-        options.put("doNotPrompt", "false");
-        options.put("useTicketCache", "true");
-
-        return new AppConfigurationEntry[] { new AppConfigurationEntry(
-                "com.sun.security.auth.module.Krb5LoginModule",
-                AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options) };
-    }
-
-    /**
-     * A default KerberosCallBackHandler
-     */
-    class KerberosCallBackHandler implements CallbackHandler {
-
-        private final String principal;
-        private final char[] password;
-
-        /**
-         * @param principal
-         * @param password
-         */
-        public KerberosCallBackHandler(String principal, char[] password) {
-            this.principal = principal;
-            this.password = password;
-        }
-
-        public KerberosCallBackHandler(String principal) {
-            this.principal = principal;
-            this.password = null;
-        }
-
-        /**
-         * Handles callbacks
-         *
-         * @param callbacks
-         * @throws IOException
-         * @throws UnsupportedCallbackException
-         */
-        public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
-            log.trace("KerberosCallBackHandler is invoked");
-            for (Callback callback : callbacks) {
-                log.trace("processing callback {}", callback.getClass().getSimpleName());
-                if (callback instanceof NameCallback) {
-                    NameCallback nc = (NameCallback) callback;
-                    nc.setName(principal);
-                } else if (callback instanceof PasswordCallback) {
-                    PasswordCallback pc = (PasswordCallback) callback;
-                    pc.setPassword(password);
-                } else {
-                    throw new UnsupportedCallbackException(callback, "Unknown Callback");
-                }
-            }
-        }
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/repo/interceptor/ImportInterceptors.java b/base/common/src/main/java/org/artifactory/repo/interceptor/ImportInterceptors.java
deleted file mode 100644
index 7661dae..0000000
--- a/base/common/src/main/java/org/artifactory/repo/interceptor/ImportInterceptors.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.interceptor;
-
-import org.artifactory.sapi.interceptor.ImportInterceptor;
-import org.artifactory.spring.ReloadableBean;
-
-/**
- * @author Noam Y. Tenne
- */
-public interface ImportInterceptors extends ReloadableBean, ImportInterceptor {
-}
diff --git a/base/common/src/main/java/org/artifactory/repo/interceptor/StorageAggregationInterceptors.java b/base/common/src/main/java/org/artifactory/repo/interceptor/StorageAggregationInterceptors.java
deleted file mode 100644
index ef0db42..0000000
--- a/base/common/src/main/java/org/artifactory/repo/interceptor/StorageAggregationInterceptors.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.interceptor;
-
-import org.artifactory.sapi.interceptor.StorageAggregationInterceptor;
-import org.artifactory.spring.ReloadableBean;
-
-/**
- * @author mamo
- */
-public interface StorageAggregationInterceptors extends ReloadableBean, StorageAggregationInterceptor {
-}
diff --git a/base/common/src/main/java/org/artifactory/repo/interceptor/StorageInterceptors.java b/base/common/src/main/java/org/artifactory/repo/interceptor/StorageInterceptors.java
deleted file mode 100644
index 523e3a5..0000000
--- a/base/common/src/main/java/org/artifactory/repo/interceptor/StorageInterceptors.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.interceptor;
-
-import org.artifactory.sapi.interceptor.StorageInterceptor;
-import org.artifactory.spring.ReloadableBean;
-
-/**
- * @author Yossi Shaul
- */
-public interface StorageInterceptors extends ReloadableBean, StorageInterceptor {
-}
diff --git a/base/common/src/main/java/org/artifactory/repo/reverseProxy/ApacheTemplateProvider.java b/base/common/src/main/java/org/artifactory/repo/reverseProxy/ApacheTemplateProvider.java
deleted file mode 100644
index 2a14a64..0000000
--- a/base/common/src/main/java/org/artifactory/repo/reverseProxy/ApacheTemplateProvider.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.artifactory.repo.reverseProxy;
-
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.ReverseProxyDescriptor;
-import org.artifactory.descriptor.repo.ReverseProxyRepoConfig;
-import org.artifactory.storage.db.servers.model.ArtifactoryServer;
-import org.artifactory.util.HttpUtils;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
- at Component
-public class ApacheTemplateProvider extends ReverseProxyTemplateProvider {
-
-    /**
-     * return reverse proxy snippet
-     *
-     * @param repoDescriptor         - repo descriptor
-     * @param reverseProxyRepoConfig - reverse proxy descriptor
-     * @param generalOnly            - is general data
-     * @return snippet
-     */
-    protected String getReverseProxySnippet(ReverseProxyDescriptor reverseProxy, RepoDescriptor repoDescriptor,
-            ReverseProxyRepoConfig reverseProxyRepoConfig,
-            boolean generalOnly) {
-        if (isGeneralSslAndDockerPortAreTheSame(reverseProxy, reverseProxyRepoConfig)) {
-            return "";
-        }
-        return buildDockerTemplate(reverseProxy, repoDescriptor, reverseProxyRepoConfig, generalOnly, "/templates/apache.ftl");
-    }
-
-    /**
-     * generate reverse proxy snippet
-     *
-     * @param reverseProxyDescriptor - reverse proxy descriptor
-     * @return reverse proxy snippet
-     */
-    protected String getGeneralReverseProxySnippet(ReverseProxyDescriptor reverseProxyDescriptor,
-            List<String> repoKeys) {
-        StringBuilder generalBuilder = new StringBuilder();
-        if (reverseProxyDescriptor.isUseHttp()) {
-            generalBuilder.append(buildGeneralTemplate(reverseProxyDescriptor, "/templates/apache.ftl", repoKeys, new ReverseProxyPorts(true, false, false), true));
-        }
-        if (reverseProxyDescriptor.isUseHttps()) {
-            generalBuilder.append(buildGeneralTemplate(reverseProxyDescriptor, "/templates/apache.ftl", repoKeys, new ReverseProxyPorts(false, true, false), false));
-        }
-        return generalBuilder.toString();
-    }
-
-    protected void updateGeneralHttpPorts(ReverseProxyDescriptor reverseProxyDescriptor, Map<Object, Object> params,
-            int sslPort, ReverseProxyPorts reverseProxyPorts) {
-        updateGeneralPortsUsage(params, reverseProxyPorts);
-        params.put("sslPort", sslPort);
-        params.put("addSsl", reverseProxyDescriptor.isUseHttps());
-        params.put("useHttps", reverseProxyDescriptor.isUseHttps());
-        params.put("useHttp", reverseProxyDescriptor.isUseHttp());
-        params.put("httpPort", reverseProxyDescriptor.getHttpPort());
-    }
-
-    private void updateGeneralPortsUsage(Map<Object, Object> params, ReverseProxyPorts reverseProxyPorts) {
-        if (reverseProxyPorts.isHttp()) {
-            params.put("httpOnly", true);
-        } else {
-            params.put("httpOnly", false);
-        }
-        if (reverseProxyPorts.isHttps()) {
-            params.put("httpsOnly", true);
-        } else {
-            params.put("httpsOnly", false);
-        }
-    }
-
-    @Override
-    protected boolean isNginx() {
-        return false;
-    }
-
-    @Override
-    protected String getServerBalancerKey(ArtifactoryServer server) {
-        return "BalancerMember " + HttpUtils.getApacheServerAndPortFromContext(server.getContextUrl()) + " route=" + server.getServerId();
-    }
-
-    @Override
-    public boolean addHaApacheForDocker(Map<Object, Object> params) {
-        boolean haConfigure = isHaConfigure();
-        params.put("addHa", haConfigure);
-        return haConfigure;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/repo/reverseProxy/NginxTemplateProvider.java b/base/common/src/main/java/org/artifactory/repo/reverseProxy/NginxTemplateProvider.java
deleted file mode 100644
index 4a24374..0000000
--- a/base/common/src/main/java/org/artifactory/repo/reverseProxy/NginxTemplateProvider.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package org.artifactory.repo.reverseProxy;
-
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.ReverseProxyDescriptor;
-import org.artifactory.descriptor.repo.ReverseProxyRepoConfig;
-import org.artifactory.storage.db.servers.model.ArtifactoryServer;
-import org.artifactory.util.HttpUtils;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
- at Component
-public class NginxTemplateProvider extends ReverseProxyTemplateProvider {
-
-    /**
-     * return reverse proxy snippet
-     *
-     * @param repoDescriptor         - repo descriptor
-     * @param reverseProxyRepoConfig - reverse proxy descriptor
-     * @param generalOnly            - is general data
-     * @return snippet
-     */
-    protected String getReverseProxySnippet(ReverseProxyDescriptor reverseProxy, RepoDescriptor repoDescriptor,
-            ReverseProxyRepoConfig reverseProxyRepoConfig,
-            boolean generalOnly) {
-        if (isGeneralSslAndDockerPortAreTheSame(reverseProxy, reverseProxyRepoConfig)) {
-            return "";
-        }
-        return buildDockerTemplate(reverseProxy, repoDescriptor, reverseProxyRepoConfig, generalOnly, "/templates/nginx.ftl");
-    }
-
-    /**
-     * generate reverse proxy snippet
-     *
-     * @param reverseProxyDescriptor - reverse proxy descriptor
-     * @return reverse proxy snippet
-     */
-    protected String getGeneralReverseProxySnippet(ReverseProxyDescriptor reverseProxyDescriptor,
-            List<String> repoKeys) {
-        return buildGeneralTemplate(reverseProxyDescriptor, "/templates/nginx.ftl", repoKeys, new ReverseProxyPorts(), true);
-    }
-
-
-    @Override
-    protected String getServerBalancerKey(ArtifactoryServer server) {
-        return HttpUtils.getServerAndPortFromContext(server.getContextUrl());
-    }
-
-    @Override
-    public boolean addHaApacheForDocker(Map<Object, Object> params) {
-        params.put("addHa", false);
-        return false;
-    }
-
-    @Override
-    protected boolean isNginx() {
-        return true;
-    }
-
-}
diff --git a/base/common/src/main/java/org/artifactory/repo/reverseProxy/ReverseProxyPorts.java b/base/common/src/main/java/org/artifactory/repo/reverseProxy/ReverseProxyPorts.java
deleted file mode 100644
index e4482f0..0000000
--- a/base/common/src/main/java/org/artifactory/repo/reverseProxy/ReverseProxyPorts.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.artifactory.repo.reverseProxy;
-
-/**
- * @author Chen Keinan
- */
-public class ReverseProxyPorts {
-
-    private boolean http;
-    private boolean https;
-    private boolean bothPorts;
-
-    public ReverseProxyPorts() {
-    }
-
-    public ReverseProxyPorts(boolean http, boolean https, boolean bothPorts) {
-        this.http = http;
-        this.https = https;
-        this.bothPorts = bothPorts;
-    }
-
-    public boolean isHttp() {
-        return http;
-    }
-
-    public void setHttp(boolean http) {
-        this.http = http;
-    }
-
-    public boolean isHttps() {
-        return https;
-    }
-
-    public void setHttps(boolean https) {
-        this.https = https;
-    }
-
-    public boolean isBothPorts() {
-        return bothPorts;
-    }
-
-    public void setBothPorts(boolean bothPorts) {
-        this.bothPorts = bothPorts;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/repo/reverseProxy/ReverseProxyTemplateProvider.java b/base/common/src/main/java/org/artifactory/repo/reverseProxy/ReverseProxyTemplateProvider.java
deleted file mode 100644
index a2b1d4a..0000000
--- a/base/common/src/main/java/org/artifactory/repo/reverseProxy/ReverseProxyTemplateProvider.java
+++ /dev/null
@@ -1,426 +0,0 @@
-package org.artifactory.repo.reverseProxy;
-
-import com.google.common.collect.Maps;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.filteredresources.FilteredResourcesAddon;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.descriptor.repo.*;
-import org.artifactory.storage.db.servers.model.ArtifactoryServer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import java.io.*;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Shay Yaakov
- * @author Chen Keinan
- */
-public abstract class ReverseProxyTemplateProvider {
-    private static final Logger log = LoggerFactory.getLogger(ReverseProxyTemplateProvider.class);
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    /**
-     * @return
-     */
-    public String provideGeneralServerConfigServer(List<String> repoKeys) {
-        CentralConfigService centralConfig = ContextHelper.get().getCentralConfig();
-        ReverseProxyDescriptor reverseProxy = centralConfig.getMutableDescriptor().getCurrentReverseProxy();
-        String snippet = getGeneralReverseProxySnippet(reverseProxy, repoKeys);
-        if (snippet != null) {
-            return snippet;
-        }
-        return null;
-    }
-
-
-
-    /**
-     * return docker reverse proxy snippet
-     * @param repo - docker repository
-     * @param config  - reverse proxy config
-     * @param generalOnly - if true general config
-     * @return -  snippet
-     */
-    //TODO: Remove "boolean isNginx" from method signature
-    protected String buildDockerTemplate(ReverseProxyDescriptor reverseProxyDescriptor, RepoDescriptor repo,
-            ReverseProxyRepoConfig config, boolean generalOnly, String templatePath) {
-        try {
-            FilteredResourcesAddon filteredResourcesAddon = addonsManager.addonByType(FilteredResourcesAddon.class);
-            ReverseProxyMethod dockerReverseProxyMethod = reverseProxyDescriptor.getDockerReverseProxyMethod();
-            InputStreamReader reader = getInputStreamReader(templatePath);
-            int repoPort = config.getPort();
-            int generalPort = getGeneralPort(reverseProxyDescriptor);
-            Map<Object, Object> params = Maps.newHashMap();
-            // add template variables
-            params.put("repoKey", repo.getKey());
-            params.put("sslCrtPath", reverseProxyDescriptor.getSslCertificate());
-            params.put("sslKeyPath", reverseProxyDescriptor.getSslKey());
-            params.put("addOnce", false);
-            params.put("addGeneral", false);
-            params.put("addSsl", false);
-            params.put("useHttp", reverseProxyDescriptor.isUseHttp());
-            params.put("httpPort", reverseProxyDescriptor.getHttpPort());
-            params.put("serverName", reverseProxyDescriptor.getServerName());
-            params.put("useHttps", reverseProxyDescriptor.isUseHttps());
-            params.put("httpOnly", false);
-            params.put("httpsOnly", false);
-            String artifactoryAppContext = reverseProxyDescriptor.getArtifactoryAppContext();
-            artifactoryAppContext = updateAppContext(artifactoryAppContext);
-            params.put("absoluteAppContext", artifactoryAppContext);
-            params.put("appContext", artifactoryAppContext);
-            String publicAppContext = reverseProxyDescriptor.getPublicAppContext();
-            ReverseProxyDescriptor reverseProxy = reverseProxyDescriptor;
-            updateWebPublicContext(params, reverseProxy);
-            params.put("publicContext", publicAppContext);
-            params.put("quotes", "\"");
-            updatePublicContextWithSlash(params, reverseProxy);
-            addHaApacheForDocker(params);
-            updateLocalNameAndPortData(reverseProxyDescriptor, params,
-                    reverseProxyDescriptor.getArtifactoryPort());
-            params.put("upstreamName", reverseProxyDescriptor.getUpStreamName());
-            params.put("generalOnly", generalOnly);
-            params.put("generalPort", generalPort);
-            updateSubDomain(dockerReverseProxyMethod, params);
-            params.put("repoPort", repoPort);
-            return filteredResourcesAddon.filterResource(reader, params);
-        } catch (Exception e) {
-            log.error("Unable to filter nginx reverse proxy template: " + e.getMessage(), e);
-            log.debug("Unable to filter nginx reverse proxy template: " + e.getMessage(), e);
-        }
-        return "";
-    }
-
-    /**
-     * return reverse proxy snippet
-     * @param repoDescriptor - repo descriptor
-     * @param reverseProxyRepoConfig - reverse proxy descriptor
-     * @param generalOnly - is general data
-     * @return  snippet
-     */
-    protected abstract String getReverseProxySnippet(ReverseProxyDescriptor reverseProxy, RepoDescriptor repoDescriptor,
-            ReverseProxyRepoConfig reverseProxyRepoConfig,
-            boolean generalOnly);
-
-    /**
-     * check weather general ssl port and docker port are the same
-     * @param reverseProxy - general port config
-     * @param reverseProxyRepoConfig - docker port config
-     * @return
-     */
-    protected boolean isGeneralSslAndDockerPortAreTheSame(ReverseProxyDescriptor reverseProxy,
-            ReverseProxyRepoConfig reverseProxyRepoConfig) {
-        return reverseProxy.isUseHttps() && reverseProxy.getSslPort() == (reverseProxyRepoConfig.getPort());
-    }
-
-    /**
-     * generate reverse proxy snippet
-     *
-     * @param reverseProxyDescriptor - reverse proxy descriptor
-     * @return reverse proxy snippet
-     */
-    protected abstract String getGeneralReverseProxySnippet(ReverseProxyDescriptor reverseProxyDescriptor,
-            List<String> repoKeys);
-
-
-    /**
-     * return provide global snippet by reverse proxy id
-     *
-     * @return - proxy snippet
-     */
-    public String provideDockerReverseProxyServerSnippet(List<String> repoKeys) {
-        ReverseProxyDescriptor reverseProxy = ContextHelper.get().getCentralConfig().
-                getMutableDescriptor().getCurrentReverseProxy();
-        List<ReverseProxyRepoConfig> reverseProxyRepoConfigs = reverseProxy.getReverseProxyRepoConfigs();
-        StringBuilder snippetBuilder = new StringBuilder();
-        reverseProxyRepoConfigs.forEach(reverseProxyRepoConfig -> {
-            if (reverseProxyRepoConfig != null) {
-                RepoBaseDescriptor repoRef = reverseProxyRepoConfig.getRepoRef();
-                if (!repoRef.getType().equals(RepoType.Docker)) {
-                    return;
-                }
-                String snippet = getReverseProxySnippet(reverseProxy,repoRef, reverseProxyRepoConfig, false);
-                if (!StringUtils.isEmpty(snippet)) {
-                    snippetBuilder.append(snippet).append("\n");
-                } else {
-                    if (isGeneralSslAndDockerPortAreTheSame(reverseProxy, reverseProxyRepoConfig)) {
-                        repoKeys.add(reverseProxyRepoConfig.getRepoRef().getKey());
-                    }
-                }
-            }
-        });
-        String snippetToString = snippetBuilder.toString();
-        if (!StringUtils.isEmpty(snippetToString)) {
-            return snippetToString;
-        }
-        return null;
-    }
-
-    /**
-     * return general nginx reverse proxy snippet
-     *
-     * @return nginx general snippet
-     */
-    public String haData(Map<Object, Object> params) {
-        try {
-            List<String> haData = fetchHaServerList();
-            params.put("hsservers",haData);
-        } catch (Exception e) {
-            log.error("Unable to filter nginx reverse proxy template: " + e.getMessage(), e);
-            log.debug("Unable to filter nginx reverse proxy template: " + e.getMessage(), e);
-        }
-        return "";
-    }
-
-
-    protected String updateAppContext(String artifactoryAppContext) {
-        if (!StringUtils.isEmpty(artifactoryAppContext)){
-            artifactoryAppContext = artifactoryAppContext+"/";
-        }
-        return artifactoryAppContext;
-    }
-
-    protected void updateWebPublicContext(Map<Object, Object> params, ReverseProxyDescriptor reverseProxy) {
-        String webPublicAppContext = reverseProxy.getPublicAppContext();
-        if (StringUtils.isEmpty(webPublicAppContext)){
-            webPublicAppContext = "/";
-        }else{
-            webPublicAppContext = "/"+webPublicAppContext+"/";
-        }
-        params.put("webPublicContext", webPublicAppContext);
-    }
-
-    /**
-     * update public context value with slash
-     *
-     * @param params       - params map
-     * @param reverseProxy - reverse proxy descriptor
-     */
-    public void updatePublicContextWithSlash(Map<Object, Object> params, ReverseProxyDescriptor reverseProxy) {
-        String publicAppContext = reverseProxy.getPublicAppContext();
-        if (!StringUtils.isEmpty(publicAppContext)){
-            publicAppContext = "/"+publicAppContext;
-        }
-        params.put("publicContextWithSlash", publicAppContext);
-    }
-
-    /**
-     * update local host data
-     * @param reverseProxyDescriptor - reverse proxy config
-     * @param params - template param
-     */
-    protected void updateLocalNameAndPortData(ReverseProxyDescriptor reverseProxyDescriptor,
-                                            Map<Object, Object> params,int port) {
-        if (isHaConfigure()){
-            params.put("localNameAndPort",reverseProxyDescriptor.getUpStreamName());
-        }else{
-            params.put("localNameAndPort", reverseProxyDescriptor.getArtifactoryServerName()+":"+port);
-        }
-    }
-
-    /**
-     * @param dockerReverseProxyMethod - docker reverse proxy method
-     * @param params                   - params map
-     */
-    protected void updateSubDomain(ReverseProxyMethod dockerReverseProxyMethod, Map<Object, Object> params) {
-        if (dockerReverseProxyMethod != null) {
-            params.put("subdomain", dockerReverseProxyMethod.toString().equals("subDomain"));
-        } else {
-            params.put("subdomain", false);
-        }
-    }
-
-    /**
-     * return general nginx reverse proxy snippet
-     * @param reverseProxyDescriptor - reverse proxy descriptor
-     * @return nginx general snippet
-     */
-    protected String buildGeneralTemplate(ReverseProxyDescriptor reverseProxyDescriptor,
-            String templatePath, List<String> repoKeys, ReverseProxyPorts reverseProxyPorts, boolean addHa) {
-        try {
-            FilteredResourcesAddon filteredResourcesAddon = addonsManager.addonByType(FilteredResourcesAddon.class);
-            InputStreamReader reader = getInputStreamReader(templatePath);
-            Map<Object, Object> params = Maps.newHashMap();
-            ReverseProxyMethod dockerReverseProxyMethod = reverseProxyDescriptor.getDockerReverseProxyMethod();
-            int sslPort = reverseProxyDescriptor.getSslPort();
-            // update template variables
-            if (!repoKeys.isEmpty()) {
-                params.put("repoKey", repoKeys.get(0));
-            }
-            params.put("serverName", reverseProxyDescriptor.getServerName());
-            updateGeneralHttpPorts(reverseProxyDescriptor, params, sslPort,reverseProxyPorts);
-            String artifactoryAppContext = reverseProxyDescriptor.getArtifactoryAppContext();
-            artifactoryAppContext = updateAppContext(artifactoryAppContext);
-            params.put("absoluteAppContext", StringUtils.isEmpty(artifactoryAppContext) ? "" : artifactoryAppContext.replaceAll("/", ""));
-            params.put("appContext", artifactoryAppContext);
-            params.put("publicContext", reverseProxyDescriptor.getPublicAppContext());
-            params.put("webapp",StringUtils.isEmpty(reverseProxyDescriptor.getPublicAppContext())?"webapp":"");
-            updatePublicContextWithSlash(params, reverseProxyDescriptor);
-            params.put("sslCrtPath", reverseProxyDescriptor.getSslCertificate());
-            params.put("sslKeyPath", reverseProxyDescriptor.getSslKey());
-            boolean isSamePort = isDockerAndGeneralSamePort(reverseProxyDescriptor);
-            boolean isSamePortValue = isSamePort && reverseProxyDescriptor.getDockerReverseProxyMethod().equals(ReverseProxyMethod.PORTPERREPO);
-            params.put("isSamePort", isSamePortValue);
-            addHaConfiguration(params, addHa);
-            addHaFlag(params);
-            params.put("addOnce", addHa);
-            updateWebPublicContext(params, reverseProxyDescriptor);
-            updateLocalNameAndPortData(reverseProxyDescriptor, params,
-                    reverseProxyDescriptor.getArtifactoryPort());
-            params.put("upstreamName", reverseProxyDescriptor.getUpStreamName());
-            params.put("generalOnly", true);
-            params.put("addGeneral",true);
-            params.put("quotes", "\"");
-            updateSubDomainVariable(params, dockerReverseProxyMethod);
-            //  params.put("isDocker", !noValue);
-            return filteredResourcesAddon.filterResource(reader, params);
-        } catch (Exception e) {
-            log.error("Unable to filter nginx reverse proxy template: " + e.getMessage(), e);
-            log.debug("Unable to filter nginx reverse proxy template: " + e.getMessage(), e);
-        }
-        return "";
-    }
-
-    /**
-     * update general http ports
-     *
-     * @param reverseProxyDescriptor - reverse proxy descriptor
-     * @param params                 - params map
-     * @param sslPort                - ssl port
-     * @param reverseProxyPorts
-     */
-    protected void updateGeneralHttpPorts(ReverseProxyDescriptor reverseProxyDescriptor, Map<Object, Object> params,
-            int sslPort, ReverseProxyPorts reverseProxyPorts) {
-        params.put("sslPort", sslPort);
-        params.put("addSsl", reverseProxyDescriptor.isUseHttps());
-        params.put("useHttps", reverseProxyDescriptor.isUseHttps());
-        params.put("useHttp", reverseProxyDescriptor.isUseHttp());
-        params.put("httpPort", reverseProxyDescriptor.getHttpPort());
-    }
-
-    private boolean isDockerAndGeneralSamePort(ReverseProxyDescriptor reverseProxyDescriptor) {
-        return reverseProxyDescriptor.getReverseProxyRepoConfigs().stream().anyMatch(reverseProxyRepoConfig ->
-                reverseProxyRepoConfig.getPort() == reverseProxyDescriptor.getSslPort());
-    }
-
-    /**
-     * @param params - params map
-     */
-    protected void addHaConfiguration(Map<Object, Object> params, boolean addForThisTemplate) {
-        if (addForThisTemplate && isHaConfigure()) {
-            haData(params);
-        }
-    }
-
-    /**
-     * @param params - params map
-     */
-    protected void addHaFlag(Map<Object, Object> params) {
-        if (isHaConfigure()) {
-            params.put("addHa", true);
-        } else {
-            params.put("addHa", false);
-        }
-    }
-
-    protected abstract boolean isNginx();
-
-    /**
-     * look for template file in etc 1st and then in resource
-     * @param templatePath
-     * @return
-     */
-    protected InputStreamReader getInputStreamReader(String templatePath){
-        InputStreamReader reader = null;
-        File etcDir = ContextHelper.get().getArtifactoryHome().getEtcDir();
-        File file = new File(etcDir,File.separator + templatePath.replace("/templates/", ""));
-        InputStream inputStream = null;
-        try {
-            inputStream = new FileInputStream(file.toString());
-        } catch (FileNotFoundException e) {
-            log.debug("file {} not found",file.toString());
-        }
-        if (inputStream != null) {
-            reader = new InputStreamReader(inputStream);
-        }
-        if (reader == null) {
-            reader = getReader(templatePath);
-        }
-        return reader;
-    }
-
-    protected void updateSubDomainVariable(Map<Object, Object> params, ReverseProxyMethod dockerReverseProxyMethod) {
-        if (dockerReverseProxyMethod != null) {
-            params.put("subdomain", dockerReverseProxyMethod.toString().equals("subDomain"));
-        } else {
-            params.put("subdomain", false);
-        }
-    }
-
-    /**
-     * return nginx port , 1st check if exist in repo if noot take the value from global config
-     *
-     * @param reverseProxyDescriptor - nginx repo config
-     * @return - nginx port
-     */
-    protected int getGeneralPort(ReverseProxyDescriptor reverseProxyDescriptor) {
-        int port;
-        if (reverseProxyDescriptor.isUseHttps()) {
-            port = reverseProxyDescriptor.getSslPort();
-        } else {
-            port = reverseProxyDescriptor.getHttpPort();
-        }
-        return port;
-    }
-
-    private InputStreamReader getReader(String templateResourcePath) {
-        InputStream stream = getClass().getResourceAsStream(templateResourcePath);
-        return new InputStreamReader(stream);
-    }
-
-
-    /**
-     * fetch server ip and port list
-     *
-     * @return list of servers (ip and port)
-     */
-    protected List<String> fetchHaServerList() {
-        List<String> servers = new ArrayList<>();
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        HaCommonAddon haCommonAddon = addonsManager.addonByType(HaCommonAddon.class);
-        List<ArtifactoryServer> allArtifactoryServers = haCommonAddon.getAllArtifactoryServers();
-        allArtifactoryServers.forEach(server -> {
-            String serverAndPortFromContext = getServerBalancerKey(server);
-            if (!StringUtils.isEmpty(serverAndPortFromContext)) {
-                servers.add(serverAndPortFromContext);
-            }
-        });
-        return servers;
-    }
-
-    protected abstract String getServerBalancerKey(ArtifactoryServer server);
-
-    /**
-     * check if ha is configure
-     * @return true if ha is configure
-     */
-    public boolean isHaConfigure() {
-        return !fetchHaServerList().isEmpty();
-    }
-
-    /**
-     * check if ha is configure
-     *
-     * @param params
-     * @return true if ha is configure
-     */
-    public abstract boolean addHaApacheForDocker(Map<Object, Object> params);
-}
diff --git a/base/common/src/main/java/org/artifactory/repo/trash/TrashService.java b/base/common/src/main/java/org/artifactory/repo/trash/TrashService.java
deleted file mode 100644
index 1d416a4..0000000
--- a/base/common/src/main/java/org/artifactory/repo/trash/TrashService.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.artifactory.repo.trash;
-
-import org.artifactory.api.common.MoveMultiStatusHolder;
-import org.artifactory.common.StatusHolder;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.spring.ReloadableBean;
-
-/**
- * @author Shay Yaakov
- */
-public interface TrashService extends ReloadableBean {
-
-    String TRASH_KEY = "auto-trashcan";
-    String PROP_TRASH_TIME = "trash.time";
-    String PROP_DELETED_BY = "trash.deletedBy";
-    String PROP_ORIGIN_REPO = "trash.originalRepository";
-    String PROP_ORIGIN_REPO_TYPE = "trash.originalRepositoryType";
-    String PROP_ORIGIN_PATH = "trash.originalPath";
-    String PROP_RESTORED_TIME = "trash.restoredTime";
-
-    /**
-     * Copies the given repoPath to the trashcan if it's a file, overriding properties if it's a folder.
-     * Usually this will be called after all beforeDelete events and before any afterDelete events.
-     *
-     * @param repoPath The repo path to trash
-     */
-    void copyToTrash(RepoPath repoPath);
-
-    /**
-     * Restores an item from the trashcan to it's original repository path.
-     *
-     * @param repoPath The repo path to restore
-     * @param restoreRepo The restore repo key
-     * @param restorePath The restore repo path (can be a file for renaming or a folder)
-     */
-    MoveMultiStatusHolder restore(RepoPath repoPath, String restoreRepo, String restorePath);
-
-    /**
-     * Removes all the item from the trashcan
-     */
-    StatusHolder empty();
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/request/ArtifactoryResponseBase.java b/base/common/src/main/java/org/artifactory/request/ArtifactoryResponseBase.java
deleted file mode 100644
index 1517296..0000000
--- a/base/common/src/main/java/org/artifactory/request/ArtifactoryResponseBase.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.request;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.http.HttpStatus;
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.common.StatusHolder;
-import org.artifactory.util.ExceptionUtils;
-import org.artifactory.util.HttpClientUtils;
-import org.artifactory.util.HttpUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-public abstract class ArtifactoryResponseBase implements ArtifactoryResponse {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryResponseBase.class);
-
-    private int status = HttpStatus.SC_OK;
-    private long contentLength = -1;
-    private String propertiesMediaType = null;
-
-    private static String makeDebugMessage(int statusCode, String reason) {
-        StringBuilder builder = new StringBuilder("Sending HTTP error code ").append(statusCode);
-        if (reason != null) {
-            builder.append(": ").append(reason);
-        }
-        return builder.toString();
-    }
-
-    @Override
-    public void sendStream(InputStream is) throws IOException {
-        OutputStream os = getOutputStream();
-        setStatus(status);
-        try {
-            long bytesCopied = IOUtils.copyLarge(is, os);
-            if (bytesCopied == 0 && getContentLength() > 0) {
-                log.warn("Zero bytes sent to client but expected {} bytes.", getContentLength());
-            } else {
-                long expectedLength = getContentLength();
-                if (expectedLength > 0 && bytesCopied != expectedLength) {
-                    log.warn("Actual bytes sent to client ({}) are different than expected ({}).", bytesCopied,
-                            expectedLength);
-                } else {
-                    log.debug("{} bytes sent to client.", bytesCopied);
-                }
-            }
-            sendSuccess();
-        } catch (Exception e) {
-            sendInternalError(e, log);
-        } finally {
-            IOUtils.closeQuietly(os);
-            IOUtils.closeQuietly(is);
-        }
-    }
-
-    @Override
-    public int getStatus() {
-        return status;
-    }
-
-    @Override
-    public void setStatus(int status) {
-        this.status = status;
-    }
-
-    @Override
-    public void sendSuccess() {
-        if (isSuccessful() || HttpUtils.isRedirectionResponseCode(status)) {
-            flush();
-        } else {
-            log.error("Could not send success. Exiting status: {}.", status);
-            if (log.isDebugEnabled()) {
-                log.debug("Could not send success.", new Throwable());
-            }
-        }
-    }
-
-    @Override
-    public void sendError(int statusCode, String reason, Logger logger) throws IOException {
-        String msg = makeDebugMessage(statusCode, reason);
-        if (statusCode == HttpStatus.SC_NOT_FOUND || statusCode == HttpStatus.SC_NOT_MODIFIED) {
-            logger.debug(msg);
-        } else {
-            log.warn(msg);
-        }
-        this.status = statusCode;
-        sendErrorInternal(statusCode, reason);
-    }
-
-    @Override
-    public void sendError(StatusHolder statusHolder) throws IOException {
-        sendError(statusHolder.getStatusCode(), statusHolder.getStatusMsg(), log);
-    }
-
-    @Override
-    public void sendInternalError(Exception exception, Logger logger) throws IOException {
-        Throwable ioException = ExceptionUtils.getCauseOfTypes(exception, IOException.class);
-        String reason;
-        if (ioException != null) {
-            reason = HttpClientUtils.getErrorMessage(ioException);
-            String message;
-            if (isCommitted()) {
-                // The client already received a status answer, so changing the status code
-                // is for internal use only. Meaning that traffic, request and access logger
-                // will not confuse this as a successful download.
-                // Using the 499 HTTP code used by Nginx for Client Closed Request
-                status = 499;
-                message = "Client Closed Request " + status + ": " + reason;
-            } else {
-                status = HttpStatus.SC_NOT_FOUND;
-                message = makeDebugMessage(status, reason);
-            }
-            logger.debug(message, exception);
-            logger.warn(message);
-        } else {
-            status = HttpStatus.SC_INTERNAL_SERVER_ERROR;
-            reason = exception.getMessage();
-            String message = makeDebugMessage(status, reason);
-            // This should always stay full error. If some exceptions happened too often
-            // then analyze it, and print it like it is done in the IOException above
-            logger.error(message, exception);
-        }
-        sendErrorInternal(status, reason);
-    }
-
-    @Override
-    public boolean isSuccessful() {
-        return HttpUtils.isSuccessfulResponseCode(status);
-    }
-
-    @Override
-    public boolean isError() {
-        return !isSuccessful();
-    }
-
-    @Override
-    public long getContentLength() {
-        return contentLength;
-    }
-
-    @Override
-    public void setContentLength(long length) {
-        //Cache the content length locally
-        this.contentLength = length;
-    }
-
-    @Override
-    public boolean isPropertiesQuery() {
-        return propertiesMediaType != null;
-    }
-
-    @Override
-    public String getPropertiesMediaType() {
-        return propertiesMediaType;
-    }
-
-    @Override
-    public void setPropertiesMediaType(String propsQueryFormat) {
-        this.propertiesMediaType = propsQueryFormat;
-    }
-
-    @Override
-    public void close(Closeable closeable) {
-        IOUtils.closeQuietly(closeable);
-    }
-
-    protected abstract void sendErrorInternal(int code, String reason) throws IOException;
-
-    protected abstract OutputStream getOutputStream() throws IOException;
-
-    public abstract void setContentDispositionAttachment(String filename);
-
-    public abstract void setFilename(String filename);
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/request/RemoteRequestException.java b/base/common/src/main/java/org/artifactory/request/RemoteRequestException.java
deleted file mode 100644
index 02fc7f8..0000000
--- a/base/common/src/main/java/org/artifactory/request/RemoteRequestException.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.request;
-
-import javax.annotation.Nullable;
-import java.io.IOException;
-
-/**
- * A custom exception that enables retaining an error status code and message received from a remote request exception.
- *
- * @author Noam Y. Tenne
- * @author Yossi Shaul
- */
-public class RemoteRequestException extends IOException {
-
-    private int remoteReturnCode;
-
-    /**
-     * @param message              Exception message
-     * @param remoteReturnCode     Remote returned HTTP status code
-     * @param remoteResponseReason Remote returned HTTP status reason
-     */
-    public RemoteRequestException(String message, int remoteReturnCode, @Nullable String remoteResponseReason) {
-        super(message + " (remote response: " + remoteReturnCode + ": " + remoteResponseReason + ")");
-        this.remoteReturnCode = remoteReturnCode;
-    }
-
-    /**
-     * Returns the HTTP status code returned from the remote request
-     *
-     * @return Remote returned HTTP status code
-     */
-    public int getRemoteReturnCode() {
-        return remoteReturnCode;
-    }
-
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/request/RepoRequestContext.java b/base/common/src/main/java/org/artifactory/request/RepoRequestContext.java
deleted file mode 100644
index a3dd60e..0000000
--- a/base/common/src/main/java/org/artifactory/request/RepoRequestContext.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.request;
-
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.webapp.servlet.TraceLoggingResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nonnull;
-import java.io.IOException;
-import java.util.Enumeration;
-import java.util.Set;
-import java.util.UUID;
-
-/**
- * A context maintained as a thread local object for all download/upload requests arriving to Artifactory.
- *
- * @author Noam Y. Tenne
- */
-public class RepoRequestContext {
-
-    private static final Logger log = LoggerFactory.getLogger(RepoRequestContext.class);
-
-    private final String id;
-    private final String methodName;
-    private final String username;
-    private final ArtifactoryRequest artifactoryRequest;
-    private final ArtifactoryResponse artifactoryResponse;
-    private final String logSig;
-
-    public static RepoRequestContext create(String methodName, String username, ArtifactoryRequest artifactoryRequest,
-            ArtifactoryResponse artifactoryResponse) {
-        if (artifactoryResponse instanceof TraceLoggingResponse) {
-            return new TraceLoggingRepoRequestContext(methodName, username, artifactoryRequest, artifactoryResponse);
-        }
-        return new RepoRequestContext(methodName, username, artifactoryRequest, artifactoryResponse);
-    }
-
-    public void destroy() throws IOException {
-    }
-
-    protected RepoRequestContext(String methodName, String username, ArtifactoryRequest artifactoryRequest,
-            ArtifactoryResponse artifactoryResponse) {
-        id = UUID.randomUUID().toString().substring(0, 8);
-        this.methodName = methodName.toUpperCase();
-        this.username = username;
-        this.artifactoryRequest = artifactoryRequest;
-        this.artifactoryResponse = artifactoryResponse;
-        logSig = id + " " + methodName + " " + username + " " + artifactoryRequest.getRepoPath().getId();
-    }
-
-    public void log(String message) {
-        if (log.isDebugEnabled()) {
-            log.debug(logSig + " " + message);
-        }
-    }
-
-    protected String getId() {
-        return id;
-    }
-
-    protected String getMethodName() {
-        return methodName;
-    }
-
-    protected String getUsername() {
-        return username;
-    }
-
-    protected ArtifactoryRequest getArtifactoryRequest() {
-        return artifactoryRequest;
-    }
-
-    protected ArtifactoryResponse getArtifactoryResponse() {
-        return artifactoryResponse;
-    }
-
-    public void appendOriginatedHeaders(@Nonnull Set<String> originatedHeaders) {
-        ArtifactoryRequest request = getArtifactoryRequest();
-        Enumeration requestOriginated = request.getHeaders(ArtifactoryRequest.ARTIFACTORY_ORIGINATED);
-        if (requestOriginated != null) {
-            while (requestOriginated.hasMoreElements()) {
-                originatedHeaders.add(((String) requestOriginated.nextElement()));
-            }
-        }
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/request/RepoRequests.java b/base/common/src/main/java/org/artifactory/request/RepoRequests.java
deleted file mode 100644
index 529401c..0000000
--- a/base/common/src/main/java/org/artifactory/request/RepoRequests.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.request;
-
-import com.google.common.collect.Sets;
-import org.artifactory.api.request.ArtifactoryResponse;
-
-import java.io.IOException;
-import java.util.Set;
-
-/**
- * @author Noam Y. Tenne
- */
-public abstract class RepoRequests {
-
-    private static ThreadLocal<RepoRequestContext> context = new ThreadLocal<>();
-
-    private RepoRequests() {
-    }
-
-    public static void set(String methodName, String username, ArtifactoryRequest artifactoryRequest,
-            ArtifactoryResponse artifactoryResponse) {
-        context.set(RepoRequestContext.create(methodName, username, artifactoryRequest, artifactoryResponse));
-    }
-
-    public static void destroy() throws IOException {
-        try {
-            RepoRequestContext repoRequestContext = context.get();
-            if (repoRequestContext != null) {
-                repoRequestContext.destroy();
-            }
-        } finally {
-            context.remove();
-        }
-    }
-
-    public static void logToContext(String format, Object... params) {
-        RepoRequestContext repoRequestContext = context.get();
-        if (repoRequestContext != null) {
-            String formattedMessage = String.format(format, params);
-            repoRequestContext.log(formattedMessage);
-        }
-    }
-
-    public static Set<String> getOriginatedHeaders() {
-        Set<String> originatedHeaders = Sets.newHashSet();
-        RepoRequestContext repoRequestContext = context.get();
-        if (repoRequestContext != null) {
-            repoRequestContext.appendOriginatedHeaders(originatedHeaders);
-        }
-        return originatedHeaders;
-    }
-
-    /**
-     * Use with caution, This might return an empty string when calling internally from a different thread!
-     *
-     * @return The servlet context url if the thread local is bounded, otherwise returns an empty string
-     */
-    public static String getServletContextUrl() {
-        RepoRequestContext repoRequestContext = context.get();
-        if (repoRequestContext != null) {
-            return repoRequestContext.getArtifactoryRequest().getServletContextUrl();
-        }
-
-        return "";
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/request/RequestThreadLocal.java b/base/common/src/main/java/org/artifactory/request/RequestThreadLocal.java
deleted file mode 100644
index 37331b1..0000000
--- a/base/common/src/main/java/org/artifactory/request/RequestThreadLocal.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.request;
-
-import java.io.IOException;
-
-/*
- * @author Lior Azar
- */
-public class RequestThreadLocal {
-
-    private static ThreadLocal<RequestThreadLocalContext> context = new ThreadLocal<>();
-
-    private RequestThreadLocal() {
-    }
-
-    public static void set(RequestWrapper requestWrapper) {
-        context.set(RequestThreadLocalContext.create(requestWrapper));
-    }
-
-    public static void destroy() throws IOException {
-        try {
-            RequestThreadLocalContext requestThreadLocalContext = context.get();
-            if (requestThreadLocalContext != null) {
-                requestThreadLocalContext.destroy();
-            }
-        } finally {
-            context.remove();
-        }
-    }
-
-    public static String getClientAddress(){
-        RequestThreadLocalContext requestThreadLocalContext = context.get();
-        if (requestThreadLocalContext != null) {
-            return requestThreadLocalContext.getRequestThreadLocal().getClientAddress();
-        }
-        return "";
-    }
-
-    public static String getBaseUrl() {
-        RequestThreadLocalContext requestThreadLocalContext = context.get();
-        if (requestThreadLocalContext != null) {
-            return requestThreadLocalContext.getRequestThreadLocal().getBaseUrl();
-        }
-        return "";
-    }
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/request/RequestThreadLocalContext.java b/base/common/src/main/java/org/artifactory/request/RequestThreadLocalContext.java
deleted file mode 100644
index e4999ef..0000000
--- a/base/common/src/main/java/org/artifactory/request/RequestThreadLocalContext.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.request;
-
-import java.io.IOException;
-
-/*
- * @author Lior Azar
- */
-public class RequestThreadLocalContext {
-    private final RequestWrapper requestWrapper;
-
-    public static RequestThreadLocalContext create(RequestWrapper requestWrapper) {
-        return new RequestThreadLocalContext(requestWrapper);
-    }
-
-    public void destroy() throws IOException {
-    }
-
-    protected RequestThreadLocalContext(RequestWrapper requestWrapper) {
-        this.requestWrapper = requestWrapper;
-    }
-
-    protected RequestWrapper getRequestThreadLocal() {
-        return requestWrapper;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/request/RequestWrapper.java b/base/common/src/main/java/org/artifactory/request/RequestWrapper.java
deleted file mode 100644
index d350526..0000000
--- a/base/common/src/main/java/org/artifactory/request/RequestWrapper.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.artifactory.request;
-
-import org.artifactory.util.HttpUtils;
-
-import javax.servlet.http.HttpServletRequest;
-
-/*
- * @author Lior Azar
- */
-public class RequestWrapper {
-    private HttpServletRequest request;
-
-    public RequestWrapper(HttpServletRequest request) {
-        this.request = request;
-    }
-
-    public String getClientAddress() {
-        return HttpUtils.getRemoteClientAddress(request);
-    }
-
-    public String getBaseUrl() {
-        return HttpUtils.getServletContextUrl(request);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/request/ResponseStatusCodesMapper.java b/base/common/src/main/java/org/artifactory/request/ResponseStatusCodesMapper.java
deleted file mode 100644
index 137ab2d..0000000
--- a/base/common/src/main/java/org/artifactory/request/ResponseStatusCodesMapper.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.request;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.api.repo.exception.ItemNotFoundRuntimeException;
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.api.repo.exception.maven.BadPomException;
-import org.artifactory.util.DoesNotExistException;
-
-/**
- * Maps different exceptions to their appropriate HttpStatus code
- *
- * @author Shay Yaakov
- */
-public class ResponseStatusCodesMapper {
-
-    public int getStatusCode(Throwable e) {
-        if (e instanceof BadPomException) {
-            return HttpStatus.SC_CONFLICT;
-        } else if (e instanceof DoesNotExistException) {
-            return HttpStatus.SC_NOT_FOUND;
-        } else if (e instanceof ItemNotFoundRuntimeException) {
-            return HttpStatus.SC_BAD_REQUEST;
-        } else if (e instanceof RepoRejectException) {
-            return ((RepoRejectException) e).getErrorCode();
-        } else if (e instanceof IllegalArgumentException) {
-            return HttpStatus.SC_BAD_REQUEST;
-        }
-
-        return HttpStatus.SC_INTERNAL_SERVER_ERROR;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/request/ResponseWithStatusHolderMapper.java b/base/common/src/main/java/org/artifactory/request/ResponseWithStatusHolderMapper.java
deleted file mode 100644
index bcc2ea7..0000000
--- a/base/common/src/main/java/org/artifactory/request/ResponseWithStatusHolderMapper.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.request;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.common.StatusHolder;
-
-/**
- * Only maps exceptions in case there is no status code inside the status holder
- *
- * @author Shay Yaakov
- */
-public class ResponseWithStatusHolderMapper extends ResponseStatusCodesMapper {
-
-    private StatusHolder statusHolder;
-
-    public ResponseWithStatusHolderMapper(StatusHolder statusHolder) {
-        this.statusHolder = statusHolder;
-    }
-
-    @Override
-    public int getStatusCode(Throwable e) {
-        int statusCode = statusHolder.getStatusCode();
-        if (statusCode != HttpStatus.SC_INTERNAL_SERVER_ERROR) {
-            return statusCode;
-        }
-
-        return super.getStatusCode(e);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/request/TraceLoggingRepoRequestContext.java b/base/common/src/main/java/org/artifactory/request/TraceLoggingRepoRequestContext.java
deleted file mode 100644
index dce8a64..0000000
--- a/base/common/src/main/java/org/artifactory/request/TraceLoggingRepoRequestContext.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.request;
-
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.webapp.servlet.TraceLoggingResponse;
-import org.joda.time.format.ISODateTimeFormat;
-
-import java.io.IOException;
-
-/**
- * @author Noam Y. Tenne
- */
-public class TraceLoggingRepoRequestContext extends RepoRequestContext {
-    public TraceLoggingRepoRequestContext(String methodName, String username, ArtifactoryRequest artifactoryRequest,
-            ArtifactoryResponse artifactoryResponse) {
-        super(methodName, username, artifactoryRequest, artifactoryResponse);
-    }
-
-    @Override
-    public void destroy() throws IOException {
-        super.destroy();
-        ((TraceLoggingResponse) getArtifactoryResponse()).sendResponse(getId(), getMethodName(), getUsername(),
-                getArtifactoryRequest().getRepoPath().getId());
-    }
-
-    @Override
-    public void log(String message) {
-        super.log(message);
-        ((TraceLoggingResponse) getArtifactoryResponse()).log(
-                ISODateTimeFormat.dateTime().print(System.currentTimeMillis()) + " " + message);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/rest/ErrorResponse.java b/base/common/src/main/java/org/artifactory/rest/ErrorResponse.java
deleted file mode 100644
index fc4698d..0000000
--- a/base/common/src/main/java/org/artifactory/rest/ErrorResponse.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest;
-
-import com.google.common.collect.Lists;
-
-import java.util.List;
-
-/**
- * A JSON object to be sent as an error thrown by the REST API.
- *
- * @author Shay Yaakov
- */
-public class ErrorResponse {
-
-    List<Error> errors = Lists.newArrayList();
-
-    public ErrorResponse(int status, String message) {
-        errors.add(new Error(status, message != null ? message : ""));
-    }
-
-    public List<Error> getErrors() {
-        return errors;
-    }
-
-    private static class Error {
-        private int status = 500;
-        private String message = "";
-
-        private Error(int status) {
-            this.status = status;
-        }
-
-        private Error(int status, String message) {
-            this.status = status;
-            this.message = message;
-        }
-
-        public int getStatus() {
-            return status;
-        }
-
-        public String getMessage() {
-            return message;
-        }
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/search/SearchTreeBuilder.java b/base/common/src/main/java/org/artifactory/search/SearchTreeBuilder.java
deleted file mode 100644
index d529143..0000000
--- a/base/common/src/main/java/org/artifactory/search/SearchTreeBuilder.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package org.artifactory.search;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.search.ItemSearchResult;
-import org.artifactory.api.search.SavedSearchResults;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.fs.MutableFileInfo;
-import org.artifactory.repo.RepoPath;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author chen keinan
- */
-public abstract class SearchTreeBuilder {
-
-    private static final Logger log = LoggerFactory.getLogger(SearchTreeBuilder.class);
-
-    private SearchTreeBuilder() {
-        // utility class
-    }
-
-    public static SavedSearchResults buildFullArtifactsList(String name, List<? extends ItemSearchResult> searchResults,
-            boolean completeVersion) {
-        List<org.artifactory.fs.FileInfo> artifacts = removeFolders(searchResults);
-        removeDuplicateFiles(artifacts);
-        if (completeVersion) {
-            artifacts = getAllDeploymentUnitFiles(artifacts);
-        }
-
-        return new SavedSearchResults(name, artifacts);
-    }
-
-    public static List<org.artifactory.fs.FileInfo> removeFolders(List<? extends ItemSearchResult> searchResults) {
-        List<org.artifactory.fs.FileInfo> artifacts = new ArrayList<>();
-        for (ItemSearchResult result : searchResults) {
-            ItemInfo itemInfo = result.getItemInfo();
-            if (!itemInfo.isFolder()) {
-                artifacts.add((FileInfo) itemInfo);
-            }
-        }
-        return artifacts;
-    }
-
-    private static void removeDuplicateFiles(List<org.artifactory.fs.FileInfo> searchResults) {
-        // the search might return the same files that exist under different repositories
-        // we don't/can't display both so we remove the duplicates
-        Map<String, FileInfo> searchResultByRelativePath = new HashMap<>();
-        Iterator<FileInfo> iter = searchResults.iterator();
-        while (iter.hasNext()) {
-            org.artifactory.fs.FileInfo result = iter.next();
-            String relativePath = result.getRepoPath().getPath();
-            if (!searchResultByRelativePath.containsKey(relativePath)) {
-                searchResultByRelativePath.put(relativePath, result);
-            } else {
-                iter.remove();
-            }
-        }
-    }
-
-    // the search tree will display all the files that belong to the same version unit of the result files.
-    // for example if the user searched for pom files, the search tree will display the pom file and all the artifacts
-    // under the same directory (same version unit)
-
-    private static List<FileInfo> getAllDeploymentUnitFiles(List<org.artifactory.fs.FileInfo> results) {
-        List<RepoPath> processedPaths = new ArrayList<>();
-        List<FileInfo> allFiles = new ArrayList<>();
-        for (org.artifactory.fs.FileInfo result : results) {
-            RepoPath resultRepoPath = result.getRepoPath();
-            RepoPath resultParentRepoPath = resultRepoPath.getParent(); // the version unit path
-            if (!processedPaths.contains(resultParentRepoPath)) {
-                // get all the files under the current version unit
-                RepositoryService repoService = ContextHelper.get().getRepositoryService();
-
-                List<ItemInfo> children = repoService.getChildren(resultParentRepoPath);
-                for (ItemInfo child : children) {
-                    /**
-                     * It is unlikely to receive a folder that contains both artifacts and subfolders, but it can happen
-                     * Protect in any case
-                     */
-                    if (child instanceof MutableFileInfo) {
-                        allFiles.add((org.artifactory.fs.FileInfo) child);
-                    }
-                }
-                processedPaths.add(resultParentRepoPath);
-            }
-        }
-        return allFiles;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/AccessLogger.java b/base/common/src/main/java/org/artifactory/security/AccessLogger.java
deleted file mode 100644
index 24b48ff..0000000
--- a/base/common/src/main/java/org/artifactory/security/AccessLogger.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.artifactory.repo.RepoPath;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.core.Authentication;
-
-/**
- * A audit logger for various security access.
- * An example of log line:
- * <code>2014-05-08 15:52:27,456 [ACCEPTED DOWNLOAD] jcenter-cache:org/iostreams-0.2.jar for anonymous/127:0:0:1.</code>
- * The columns are space delimited:
- * <ol>
- * <li>Log entry date in the format of YYYY-MM-DD HH:MM:SS,Millis</li>
- * <li>Action result (denied or accepted) and type (@see {@link org.artifactory.security.AccessLogger.Action})</li>
- * <li>Repo path (optional)</li>
- * <li>Log message (optional)</li>
- * <li>Username</li>
- * <li>Remote user address</li>
- * </ol>
- *
- * @author Yoav Landman
- */
-public abstract class AccessLogger {
-    private static final Logger log = LoggerFactory.getLogger(AccessLogger.class);
-
-    public enum Action {
-        ANNOTATE, ANNOTATE_DELETE, DOWNLOAD, DEPLOY, DELETE, SEARCH, LOGIN, CONFIGURATION_CHANGE, CREATE, UPDATE,
-        APPROVE, DISAPPROVE, FORM_SUBMIT, PROPERTY_ADDED,PROPERTY_REMOVED,PROPERTY_UPDATED
-    }
-
-    private AccessLogger() {
-        // utility class
-    }
-
-    public static void annotated(RepoPath repoPath) {
-        annotated(repoPath, false, AuthenticationHelper.getAuthentication());
-    }
-
-    public static void annotateDenied(RepoPath repoPath) {
-        annotated(repoPath, true, AuthenticationHelper.getAuthentication());
-    }
-
-    public static void annotated(RepoPath repoPath, boolean denied, Authentication authentication) {
-        logAction(repoPath, Action.ANNOTATE, denied, authentication);
-    }
-
-    public static void downloaded(RepoPath repoPath) {
-        downloaded(repoPath, false, AuthenticationHelper.getAuthentication());
-    }
-
-    public static void downloadDenied(RepoPath repoPath) {
-        downloaded(repoPath, true, AuthenticationHelper.getAuthentication());
-    }
-
-    public static void downloaded(RepoPath repoPath, boolean denied, Authentication authentication) {
-        logAction(repoPath, Action.DOWNLOAD, denied, authentication);
-    }
-
-    public static void deployed(RepoPath repoPath) {
-        deployed(repoPath, false, AuthenticationHelper.getAuthentication());
-    }
-
-    public static void deployDenied(RepoPath repoPath) {
-        deployed(repoPath, true, AuthenticationHelper.getAuthentication());
-    }
-
-    public static void deployed(RepoPath repoPath, boolean denied, Authentication authentication) {
-        logAction(repoPath, Action.DEPLOY, denied, authentication);
-    }
-
-    public static void deleted(String message) {
-        deleted(null, false, AuthenticationHelper.getAuthentication(), message);
-    }
-
-    public static void deleted(RepoPath repoPath) {
-        deleted(repoPath, false, AuthenticationHelper.getAuthentication(), null);
-    }
-
-    public static void deleteDenied(RepoPath repoPath) {
-        deleted(repoPath, true, AuthenticationHelper.getAuthentication(), null);
-    }
-
-    public static void deleted(RepoPath repoPath, boolean denied, Authentication authentication, String message) {
-        logAction(repoPath, Action.DELETE, denied, authentication, message);
-    }
-
-    public static void unauthorizedSearch() {
-        logAction(null, Action.SEARCH, true, AuthenticationHelper.getAuthentication());
-    }
-
-    public static void unauthorizedFormSubmit(String message) {
-        logAction(null, Action.FORM_SUBMIT, true, AuthenticationHelper.getAuthentication(), message);
-    }
-
-    public static void loggedIn(Authentication authentication) {
-        logAction(null, Action.LOGIN, false, authentication);
-    }
-
-    public static void loginDenied(Authentication authentication) {
-        logAction(null, Action.LOGIN, true, authentication);
-    }
-
-    public static void configurationChanged() {
-        logAction(null, Action.CONFIGURATION_CHANGE, false, AuthenticationHelper.getAuthentication());
-    }
-
-    public static void created(String message) {
-        logAction(null, Action.CREATE, false, AuthenticationHelper.getAuthentication(), message);
-    }
-
-    public static void updated(String message) {
-        logAction(null, Action.UPDATE, false, AuthenticationHelper.getAuthentication(), message);
-    }
-
-    public static void approved(String message) {
-        logAction(null, Action.APPROVE, false, AuthenticationHelper.getAuthentication(), message);
-    }
-
-    public static void propertyAdded(RepoPath repoPath, String message) {
-        logAction(repoPath, Action.PROPERTY_ADDED, false, AuthenticationHelper.getAuthentication(), message);
-    }
-
-    public static void propertyAddedDenied(RepoPath repoPath,String message) {
-        logAction(repoPath, Action.PROPERTY_ADDED, true, AuthenticationHelper.getAuthentication(), message);
-    }
-
-    public static void propertyDeleted(RepoPath repoPath, String message) {
-        logAction(repoPath, Action.PROPERTY_REMOVED, false, AuthenticationHelper.getAuthentication(), message);
-    }
-
-    public static void propertyDeletedDenied(RepoPath repoPath, String message) {
-        logAction(repoPath, Action.PROPERTY_REMOVED, true, AuthenticationHelper.getAuthentication(), message);
-    }
-
-    public static void propertyUpdated(RepoPath repoPath, String message) {
-        logAction(repoPath, Action.PROPERTY_UPDATED, false, AuthenticationHelper.getAuthentication(), message);
-    }
-
-    public static void disapproved(String message) {
-        logAction(null, Action.DISAPPROVE, false, AuthenticationHelper.getAuthentication(), message);
-    }
-
-    public static void logAction(RepoPath repoPath, Action action, boolean denied, Authentication authentication) {
-        logAction(repoPath, action, denied, authentication, null);
-    }
-
-    public static void logAction(RepoPath repoPath, Action action, boolean denied, Authentication authentication,
-            String message) {
-        if (authentication != null) {
-            String address = AuthenticationHelper.getRemoteAddress(authentication);
-            log.info(
-                    (denied ? "[DENIED " : "[ACCEPTED ") + action.name() + "] " + (repoPath != null ? repoPath : "") +
-                            (message != null ? message : "") + " for " + authentication.getName() + (address != null ?
-                            "/" + address : "") + "."
-            );
-        }
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/AuthenticationHelper.java b/base/common/src/main/java/org/artifactory/security/AuthenticationHelper.java
deleted file mode 100644
index f0d2711..0000000
--- a/base/common/src/main/java/org/artifactory/security/AuthenticationHelper.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContext;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.web.authentication.WebAuthenticationDetails;
-
-/**
- * Provides an easy API for getting the Authentication object
- *
- * @author Noam Tenne
- */
-
-public abstract class AuthenticationHelper {
-    private AuthenticationHelper() {
-        // utility class
-    }
-
-    public static Authentication getAuthentication() {
-        SecurityContext securityContext = SecurityContextHolder.getContext();
-        if (securityContext == null) {
-            return null;
-        }
-        Authentication authentication = securityContext.getAuthentication();
-        return authentication;
-    }
-
-    public static String getRemoteAddress(Authentication authentication) {
-        if (authentication == null) {
-            return null;
-        }
-        Object details = authentication.getDetails();
-        String address = null;
-        if (details instanceof WebAuthenticationDetails) {
-            address = ((WebAuthenticationDetails) details).getRemoteAddress();
-        }
-        return address;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/GroupConfigurationImpl.java b/base/common/src/main/java/org/artifactory/security/GroupConfigurationImpl.java
deleted file mode 100644
index 5d96bed..0000000
--- a/base/common/src/main/java/org/artifactory/security/GroupConfigurationImpl.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-/**
- * @author Noam Y. Tenne
- */
-public class GroupConfigurationImpl {
-
-    private String name;
-    private String description;
-    private boolean autoJoin;
-    private String realm;
-    private String realmAttributes;
-
-    public GroupConfigurationImpl() {
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public boolean isAutoJoin() {
-        return autoJoin;
-    }
-
-    public void setAutoJoin(boolean autoJoin) {
-        this.autoJoin = autoJoin;
-    }
-
-    public String getRealm() {
-        return realm;
-    }
-
-    public void setRealm(String realm) {
-        this.realm = realm;
-    }
-
-    public String getRealmAttributes() {
-        return realmAttributes;
-    }
-
-    public void setRealmAttributes(String realmAttributes) {
-        this.realmAttributes = realmAttributes;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof GroupConfigurationImpl)) {
-            return false;
-        }
-
-        GroupConfigurationImpl that = (GroupConfigurationImpl) o;
-
-        if (autoJoin != that.autoJoin) {
-            return false;
-        }
-        if (description != null ? !description.equals(that.description) : that.description != null) {
-            return false;
-        }
-        if (name != null ? !name.equals(that.name) : that.name != null) {
-            return false;
-        }
-        if (realm != null ? !realm.equals(that.realm) : that.realm != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = name.hashCode();
-        result = 31 * result + (description != null ? description.hashCode() : 0);
-        result = 31 * result + (autoJoin ? 1 : 0);
-        result = 31 * result + (realm != null ? realm.hashCode() : 0);
-        return result;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/HttpAuthenticationDetails.java b/base/common/src/main/java/org/artifactory/security/HttpAuthenticationDetails.java
deleted file mode 100644
index ed7c321..0000000
--- a/base/common/src/main/java/org/artifactory/security/HttpAuthenticationDetails.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.artifactory.util.HttpUtils;
-import org.springframework.security.web.authentication.WebAuthenticationDetails;
-
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * Support getting the client's ip address in reverse-proxied environments
- *
- * @author yoavl
- */
-public class HttpAuthenticationDetails extends WebAuthenticationDetails {
-    private String remoteAddress;
-
-    /**
-     * Records the remote address and will also set the session Id if a session already exists (it won't create one).
-     *
-     * @param request that the authentication request was received from
-     */
-    public HttpAuthenticationDetails(HttpServletRequest request) {
-        super(request);
-        this.remoteAddress = HttpUtils.getRemoteClientAddress(request);
-    }
-
-    @Override
-    public String getRemoteAddress() {
-        return remoteAddress;
-    }
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/security/HttpAuthenticationDetailsSource.java b/base/common/src/main/java/org/artifactory/security/HttpAuthenticationDetailsSource.java
deleted file mode 100644
index 39447d8..0000000
--- a/base/common/src/main/java/org/artifactory/security/HttpAuthenticationDetailsSource.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.springframework.security.authentication.AuthenticationDetailsSource;
-import org.springframework.security.web.authentication.WebAuthenticationDetails;
-
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * Support using the HttpAuthenticationDetails class
- *
- * @author yoavl
- */
-public class HttpAuthenticationDetailsSource implements
-        AuthenticationDetailsSource<HttpServletRequest, WebAuthenticationDetails> {
-    public HttpAuthenticationDetailsSource() {
-        super();
-    }
-
-    @Override
-    public WebAuthenticationDetails buildDetails(HttpServletRequest context) {
-        return new HttpAuthenticationDetails(context);
-    }
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/security/InternalUsernamePasswordAuthenticationToken.java b/base/common/src/main/java/org/artifactory/security/InternalUsernamePasswordAuthenticationToken.java
deleted file mode 100644
index 98f8b4c..0000000
--- a/base/common/src/main/java/org/artifactory/security/InternalUsernamePasswordAuthenticationToken.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-
-/**
- * @author Noam Y. Tenne
- */
-public class InternalUsernamePasswordAuthenticationToken extends UsernamePasswordAuthenticationToken {
-
-    public InternalUsernamePasswordAuthenticationToken(Object principal, Object credentials) {
-        super(principal, credentials);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/LoginHandler.java b/base/common/src/main/java/org/artifactory/security/LoginHandler.java
deleted file mode 100644
index 96ce398..0000000
--- a/base/common/src/main/java/org/artifactory/security/LoginHandler.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.artifactory.security;
-
-import org.artifactory.security.props.auth.model.OauthModel;
-import org.springframework.security.authentication.AuthenticationDetailsSource;
-import org.springframework.security.authentication.BadCredentialsException;
-
-import javax.servlet.http.HttpServletRequest;
-import java.io.IOException;
-import java.text.ParseException;
-
-/**
- * @author Chen  Keinan
- */
-public interface LoginHandler {
-
-    /**
-     * do basic authentication
-     *
-     * @param tokens - tokens
-     * @return
-     * @throws IOException
-     */
-    OauthModel doBasicAuthWithDb(String[] tokens,
-            AuthenticationDetailsSource<HttpServletRequest, ?> authenticationDetailsSource) throws IOException, ParseException;
-
-    /**
-     * do basic authentication with db
-     *
-     * @param header   - authorization header
-     * @param username - username
-     * @return
-     */
-    OauthModel doBasicAuthWithProvider(String header, String username);
-
-    /**
-     * Decodes the header into a username and password.
-     *
-     * @throws BadCredentialsException if the Basic header is not present or is not valid Base64
-     */
-    String[] extractAndDecodeHeader(String header) throws IOException;
-}
diff --git a/base/common/src/main/java/org/artifactory/security/LoginHandlerImpl.java b/base/common/src/main/java/org/artifactory/security/LoginHandlerImpl.java
deleted file mode 100644
index 513c1d1..0000000
--- a/base/common/src/main/java/org/artifactory/security/LoginHandlerImpl.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package org.artifactory.security;
-
-import org.artifactory.addon.oauth.OAuthHandler;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.security.oauth.OAuthSettings;
-import org.artifactory.security.props.auth.OauthManager;
-import org.artifactory.security.props.auth.PropsTokenCache;
-import org.artifactory.security.props.auth.model.AuthenticationModel;
-import org.artifactory.security.props.auth.model.OauthModel;
-import org.artifactory.security.props.auth.model.TokenKeyValue;
-import org.artifactory.util.dateUtils.DateUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.authentication.AuthenticationDetailsSource;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.authentication.BadCredentialsException;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletRequest;
-import java.io.IOException;
-import java.text.ParseException;
-
-/**
- * @author Chen  Keinan
- */
- at Component
-public class LoginHandlerImpl implements LoginHandler {
-    private static final Logger log = LoggerFactory.getLogger(LoginHandlerImpl.class);
-
-    @Autowired
-    private OauthManager oauthManager;
-
-    @Autowired
-    private PropsTokenCache propsTokenCache;
-
-    @Override
-    public OauthModel doBasicAuthWithDb(String[] tokens,
-            AuthenticationDetailsSource<HttpServletRequest, ?> authenticationDetailsSource) throws IOException, ParseException {
-        assert tokens.length == 2;
-        AuthenticationManager authenticationManager = ContextHelper.get().beanForType(AuthenticationManager.class);
-        String username = tokens[0];
-        UsernamePasswordAuthenticationToken authRequest =
-                new UsernamePasswordAuthenticationToken(username, tokens[1]);
-        authRequest.setDetails(authenticationDetailsSource);
-        Authentication authenticate = authenticationManager.authenticate(authRequest);
-        SecurityContextHolder.getContext().setAuthentication(authenticate);
-        TokenKeyValue tokenKeyValue = oauthManager.getToken(username);
-        if (tokenKeyValue == null) {
-            tokenKeyValue = oauthManager.createToken(username);
-        }
-        if (tokenKeyValue == null) {
-            log.debug("could not create and persist token for authenticated user {}, storing generated token in shared cache.", username);
-            tokenKeyValue = oauthManager.generateToken(username);
-            if (tokenKeyValue != null) {
-                propsTokenCache.put(tokenKeyValue, (UserDetails) authenticate.getPrincipal());
-            } else {
-                throw new RuntimeException("failed to generate token for authenticated user: " + username);
-            }
-        }
-        String createdAt = DateUtils.formatBuildDate(System.currentTimeMillis());
-        OauthModel oauthModel = new AuthenticationModel(tokenKeyValue.getToken(), createdAt);
-        return oauthModel;
-    }
-
-    @Override
-    public OauthModel doBasicAuthWithProvider(String header, String username) {
-        OAuthHandler oAuthHandler = ContextHelper.get().beanForType(OAuthHandler.class);
-        CentralConfigDescriptor descriptor = ContextHelper.get().getCentralConfig().getDescriptor();
-        OAuthSettings oauthSettings = descriptor.getSecurity().getOauthSettings();
-        String defaultProvider = oauthSettings.getDefaultNpm();
-        // try to get token from provider
-        OauthModel oauthModel = oAuthHandler.getCreateToken(defaultProvider, username, header);
-        return oauthModel;
-    }
-
-    @Override
-    public String[] extractAndDecodeHeader(String header) throws IOException {
-
-        byte[] base64Token = header.substring(6).getBytes("UTF-8");
-        byte[] decoded;
-        try {
-            decoded = org.springframework.security.crypto.codec.Base64.decode(base64Token);
-        } catch (IllegalArgumentException e) {
-            throw new BadCredentialsException("Failed to decode basic authentication token");
-        }
-        String token = new String(decoded, "UTF-8");
-
-        int delim = token.indexOf(":");
-
-        if (delim == -1) {
-            throw new BadCredentialsException("Invalid basic authentication token");
-        }
-        return new String[]{token.substring(0, delim), token.substring(delim + 1)};
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/PermissionTargetConfigurationImpl.java b/base/common/src/main/java/org/artifactory/security/PermissionTargetConfigurationImpl.java
deleted file mode 100644
index 2e10540..0000000
--- a/base/common/src/main/java/org/artifactory/security/PermissionTargetConfigurationImpl.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import java.util.List;
-
-/**
- * @author Noam Y. Tenne
- */
-public class PermissionTargetConfigurationImpl {
-
-    private String name;
-    private String includesPattern = "**";
-    private String excludesPattern = "";
-    private List<String> repositories;
-    private PrincipalConfigurationImpl principals;
-
-    public PermissionTargetConfigurationImpl() {
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getIncludesPattern() {
-        return includesPattern;
-    }
-
-    public void setIncludesPattern(String includesPattern) {
-        this.includesPattern = includesPattern;
-    }
-
-    public String getExcludesPattern() {
-        return excludesPattern;
-    }
-
-    public void setExcludesPattern(String excludesPattern) {
-        this.excludesPattern = excludesPattern;
-    }
-
-    public List<String> getRepositories() {
-        return repositories;
-    }
-
-    public void setRepositories(List<String> repositories) {
-        this.repositories = repositories;
-    }
-
-    public PrincipalConfigurationImpl getPrincipals() {
-        return principals;
-    }
-
-    public void setPrincipals(PrincipalConfigurationImpl principals) {
-        this.principals = principals;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof PermissionTargetConfigurationImpl)) {
-            return false;
-        }
-
-        PermissionTargetConfigurationImpl that = (PermissionTargetConfigurationImpl) o;
-
-        if (excludesPattern != null ? !excludesPattern.equals(that.excludesPattern) : that.excludesPattern != null) {
-            return false;
-        }
-        if (includesPattern != null ? !includesPattern.equals(that.includesPattern) : that.includesPattern != null) {
-            return false;
-        }
-        if (name != null ? !name.equals(that.name) : that.name != null) {
-            return false;
-        }
-        if (principals != null ? !principals.equals(that.principals) : that.principals != null) {
-            return false;
-        }
-        if (repositories != null ? !repositories.equals(that.repositories) : that.repositories != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = name != null ? name.hashCode() : 0;
-        result = 31 * result + (includesPattern != null ? includesPattern.hashCode() : 0);
-        result = 31 * result + (excludesPattern != null ? excludesPattern.hashCode() : 0);
-        result = 31 * result + (repositories != null ? repositories.hashCode() : 0);
-        result = 31 * result + (principals != null ? principals.hashCode() : 0);
-        return result;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/PrincipalConfigurationImpl.java b/base/common/src/main/java/org/artifactory/security/PrincipalConfigurationImpl.java
deleted file mode 100644
index 23baf73..0000000
--- a/base/common/src/main/java/org/artifactory/security/PrincipalConfigurationImpl.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Noam Y. Tenne
- */
-public class PrincipalConfigurationImpl {
-
-    private Map<String, Set<String>> users;
-    private Map<String, Set<String>> groups;
-
-    public Map<String, Set<String>> getUsers() {
-        return users;
-    }
-
-    public void setUsers(Map<String, Set<String>> users) {
-        this.users = users;
-    }
-
-    public Map<String, Set<String>> getGroups() {
-        return groups;
-    }
-
-    public void setGroups(Map<String, Set<String>> groups) {
-        this.groups = groups;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof PrincipalConfigurationImpl)) {
-            return false;
-        }
-
-        PrincipalConfigurationImpl that = (PrincipalConfigurationImpl) o;
-
-        if (groups != null ? !groups.equals(that.groups) : that.groups != null) {
-            return false;
-        }
-        if (users != null ? !users.equals(that.users) : that.users != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = users != null ? users.hashCode() : 0;
-        result = 31 * result + (groups != null ? groups.hashCode() : 0);
-        return result;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/SecurityEntityListItem.java b/base/common/src/main/java/org/artifactory/security/SecurityEntityListItem.java
deleted file mode 100644
index e9001d7..0000000
--- a/base/common/src/main/java/org/artifactory/security/SecurityEntityListItem.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-/**
- * @author Noam Y. Tenne
- */
-public class SecurityEntityListItem {
-
-    private String name;
-    private String uri;
-
-    public SecurityEntityListItem() {
-    }
-
-    public SecurityEntityListItem(String name, String uri) {
-        this.name = name;
-        this.uri = uri;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getUri() {
-        return uri;
-    }
-
-    public void setUri(String uri) {
-        this.uri = uri;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof SecurityEntityListItem)) {
-            return false;
-        }
-
-        SecurityEntityListItem that = (SecurityEntityListItem) o;
-
-        if (name != null ? !name.equals(that.name) : that.name != null) {
-            return false;
-        }
-        if (uri != null ? !uri.equals(that.uri) : that.uri != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = name != null ? name.hashCode() : 0;
-        result = 31 * result + (uri != null ? uri.hashCode() : 0);
-        return result;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/UserConfigurationImpl.java b/base/common/src/main/java/org/artifactory/security/UserConfigurationImpl.java
deleted file mode 100644
index 185ce49..0000000
--- a/base/common/src/main/java/org/artifactory/security/UserConfigurationImpl.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import java.util.Set;
-
-/**
- * @author Noam Y. Tenne
- */
-public class UserConfigurationImpl {
-
-    private String name;
-    private String email;
-    private String password;
-    private boolean admin;
-    private boolean profileUpdatable = true;
-    private boolean internalPasswordDisabled = false;
-    private Set<String> groups;
-    private String lastLoggedIn;
-    private long lastLoggedInMillis;
-    private String realm;
-    private boolean offlineMode;
-
-    public UserConfigurationImpl() {
-    }
-
-    /**
-     * @return The username
-     */
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getEmail() {
-        return email;
-    }
-
-    public void setEmail(String email) {
-        this.email = email;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public void setPassword(String password) {
-        this.password = password;
-    }
-
-    public boolean isAdmin() {
-        return admin;
-    }
-
-    public void setAdmin(boolean admin) {
-        this.admin = admin;
-    }
-
-    public boolean isProfileUpdatable() {
-        return profileUpdatable;
-    }
-
-    public void setProfileUpdatable(boolean profileUpdatable) {
-        this.profileUpdatable = profileUpdatable;
-    }
-
-    public boolean isInternalPasswordDisabled() {
-        return internalPasswordDisabled;
-    }
-
-    public void setInternalPasswordDisabled(boolean internalPasswordDisabled) {
-        this.internalPasswordDisabled = internalPasswordDisabled;
-    }
-
-    public Set<String> getGroups() {
-        return groups;
-    }
-
-    public void setGroups(Set<String> groups) {
-        this.groups = groups;
-    }
-
-    public String getLastLoggedIn() {
-        return lastLoggedIn;
-    }
-
-    public void setLastLoggedIn(String lastLoggedIn) {
-        this.lastLoggedIn = lastLoggedIn;
-    }
-
-    public String getRealm() {
-        return realm;
-    }
-
-    public void setRealm(String realm) {
-        this.realm = realm;
-    }
-
-    public boolean isOfflineMode() {
-        return offlineMode;
-    }
-
-    public void setOfflineMode(boolean offlineMode) {
-        this.offlineMode = offlineMode;
-    }
-
-    public long getLastLoggedInMillis() {
-        return lastLoggedInMillis;
-    }
-
-    public void setLastLoggedInMillis(long lastLoggedInMillis) {
-        this.lastLoggedInMillis = lastLoggedInMillis;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof UserConfigurationImpl)) {
-            return false;
-        }
-
-        UserConfigurationImpl that = (UserConfigurationImpl) o;
-
-        if (admin != that.admin) {
-            return false;
-        }
-        if (internalPasswordDisabled != that.internalPasswordDisabled) {
-            return false;
-        }
-        if (profileUpdatable != that.profileUpdatable) {
-            return false;
-        }
-        if (email != null ? !email.equals(that.email) : that.email != null) {
-            return false;
-        }
-        if (groups != null ? !groups.equals(that.groups) : that.groups != null) {
-            return false;
-        }
-        if (!name.equals(that.name)) {
-            return false;
-        }
-        if (realm != null ? !realm.equals(that.realm) : that.realm != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = name.hashCode();
-        result = 31 * result + email.hashCode();
-        result = 31 * result + (admin ? 1 : 0);
-        result = 31 * result + (profileUpdatable ? 1 : 0);
-        result = 31 * result + (internalPasswordDisabled ? 1 : 0);
-        result = 31 * result + (groups != null ? groups.hashCode() : 0);
-        result = 31 * result + (realm != null ? realm.hashCode() : 0);
-        return result;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/crypto/ArtifactoryBase58.java b/base/common/src/main/java/org/artifactory/security/crypto/ArtifactoryBase58.java
deleted file mode 100644
index 964a3b0..0000000
--- a/base/common/src/main/java/org/artifactory/security/crypto/ArtifactoryBase58.java
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security.crypto;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-
-/**
- * Date: 5/20/14 11:25 PM
- *
- * @author freds
- */
-public abstract class ArtifactoryBase58 {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryBase58.class);
-
-    private static final char ARTIFACTORY_BYTE = 'A';
-    private static final char ARTIFACTORY_PASSWORD_BYTE = 'P';  // encrypted with user specific key
-    private static final char ARTIFACTORY_MASTER_BYTE = 'M';    // encrypted with master encryption key
-    private static final char ARTIFACTORY_API_BYTE = 'K';    // encrypted with api key
-
-    private static final char[] ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
-            .toCharArray();
-    private static final int BASE_58 = ALPHABET.length;
-    private static final int BASE_256 = 256;
-
-    private static final int[] INDEXES = new int[128];
-    private static final byte[] EMPTY_STRING_CODE = new byte[2];
-
-    static {
-        for (int i = 0; i < INDEXES.length; i++) {
-            INDEXES[i] = -1;
-        }
-        for (int i = 0; i < ALPHABET.length; i++) {
-            INDEXES[ALPHABET[i]] = i;
-        }
-    }
-
-    public static boolean isCorrectFormat(String input) {
-        return extractBytes(input) != null;
-    }
-
-    public static boolean isPasswordEncrypted(String input) {
-        if (!isCorrectFormat(input)) {
-            return false;
-        }
-        return input.charAt(1) == ARTIFACTORY_PASSWORD_BYTE;
-    }
-
-    public static boolean isAPIKey(String input) {
-        if (!isCorrectFormat(input)) {
-            return false;
-        }
-        return input.charAt(1) == ARTIFACTORY_API_BYTE;
-    }
-
-    public static boolean isMasterEncrypted(String input) {
-        if (!isCorrectFormat(input)) {
-            return false;
-        }
-        return input.charAt(1) == ARTIFACTORY_MASTER_BYTE;
-    }
-
-    public static byte[] extractBytes(String input) {
-        if (input != null && input.length() > 3 && input.charAt(0) == ARTIFACTORY_BYTE
-                && (input.charAt(1) == ARTIFACTORY_MASTER_BYTE || input.charAt(1) == ARTIFACTORY_PASSWORD_BYTE
-                || input.charAt(1) == ARTIFACTORY_API_BYTE)) {
-            if (!isBase58(input)) {
-                return null;
-            }
-
-            byte[] inputWithChk = decode(input.substring(2));
-            MessageDigest digest = getSha256MessageDigest();
-            byte[] bytes = copyOfRange(inputWithChk, 0, inputWithChk.length - 2);
-            byte[] doubleDigest = digest.digest(digest.digest(bytes));
-            if ((doubleDigest[0] != inputWithChk[inputWithChk.length - 2])
-                    || (doubleDigest[1] != inputWithChk[inputWithChk.length - 1])) {
-                return null;
-            }
-            return bytes;
-        }
-        return null;
-    }
-
-    public static String convertPasswordToString(byte[] toEncode) {
-        return "" + ARTIFACTORY_BYTE + ARTIFACTORY_PASSWORD_BYTE + encode(bytesToEncode(toEncode));
-    }
-
-    public static String convertMasterToString(byte[] toEncode) {
-        return "" + ARTIFACTORY_BYTE + ARTIFACTORY_MASTER_BYTE + encode(bytesToEncode(toEncode));
-    }
-
-    public static String convertApiTokenToString(byte[] toEncode) {
-        return "" + ARTIFACTORY_BYTE + ARTIFACTORY_API_BYTE + encode(bytesToEncode(toEncode));
-    }
-
-    private static byte[] bytesToEncode(byte[] toEncode) {
-        byte[] bytes;
-        if (toEncode == null || toEncode.length == 0) {
-            checkEmptyString();
-            bytes = EMPTY_STRING_CODE;
-        } else {
-            MessageDigest digest = getSha256MessageDigest();
-            byte[] doubleDigest = digest.digest(digest.digest(toEncode));
-            bytes = new byte[toEncode.length + 2];
-            System.arraycopy(toEncode, 0, bytes, 0, toEncode.length);
-            bytes[bytes.length - 2] = doubleDigest[0];
-            bytes[bytes.length - 1] = doubleDigest[1];
-        }
-        return bytes;
-    }
-
-    private static void checkEmptyString() {
-        if (EMPTY_STRING_CODE[0] == 0) {
-            MessageDigest digest = getSha256MessageDigest();
-            byte[] doubleDigest = digest.digest(digest.digest(new byte[0]));
-            EMPTY_STRING_CODE[0] = doubleDigest[0];
-            EMPTY_STRING_CODE[1] = doubleDigest[1];
-        }
-    }
-
-    public static MessageDigest getSha256MessageDigest() {
-        try {
-            return MessageDigest.getInstance("SHA-256");
-        } catch (NoSuchAlgorithmException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    public static boolean isBase58(String input) {
-        char[] chars = input.toCharArray();
-        for (char c : chars) {
-            boolean inAlphabet = false;
-            for (char c1 : ALPHABET) {
-                if (c1 == c) {
-                    inAlphabet = true;
-                    break;
-                }
-            }
-            if (!inAlphabet) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Pure base 58 encoding
-     *
-     * @param input Input to encode
-     * @return Decoded string
-     */
-    public static String encode(byte[] input) {
-        if (input.length == 0) {
-            // paying with the same coin
-            return "";
-        }
-
-        //
-        // Make a copy of the input since we are going to modify it.
-        //
-        input = copyOfRange(input, 0, input.length);
-
-        //
-        // Count leading zeroes
-        //
-        int zeroCount = 0;
-        while (zeroCount < input.length && input[zeroCount] == 0) {
-            ++zeroCount;
-        }
-
-        //
-        // The actual encoding
-        //
-        byte[] temp = new byte[input.length * 2];
-        int j = temp.length;
-
-        int startAt = zeroCount;
-        while (startAt < input.length) {
-            byte mod = divmod58(input, startAt);
-            if (input[startAt] == 0) {
-                ++startAt;
-            }
-
-            temp[--j] = (byte) ALPHABET[mod];
-        }
-
-        //
-        // Strip extra '1' if any
-        //
-        while (j < temp.length && temp[j] == ALPHABET[0]) {
-            ++j;
-        }
-
-        //
-        // Add as many leading '1' as there were leading zeros.
-        //
-        while (--zeroCount >= 0) {
-            temp[--j] = (byte) ALPHABET[0];
-        }
-
-        byte[] output = copyOfRange(temp, j, temp.length);
-        return new String(output);
-    }
-
-    /**
-     * Pure base 58 decoding
-     *
-     * @param input Input to decode
-     * @return Decoded bytes
-     */
-    public static byte[] decode(String input) {
-        if (input.length() == 0) {
-            // paying with the same coin
-            return new byte[0];
-        }
-
-        byte[] input58 = new byte[input.length()];
-        //
-        // Transform the String to a base58 byte sequence
-        //
-        for (int i = 0; i < input.length(); ++i) {
-            char c = input.charAt(i);
-
-            int digit58 = -1;
-            if (c >= 0 && c < 128) {
-                digit58 = INDEXES[c];
-            }
-            if (digit58 < 0) {
-                throw new RuntimeException("Not a ArtifactoryBase58 input: " + input);
-            }
-
-            input58[i] = (byte) digit58;
-        }
-
-        //
-        // Count leading zeroes
-        //
-        int zeroCount = 0;
-        while (zeroCount < input58.length && input58[zeroCount] == 0) {
-            ++zeroCount;
-        }
-
-        //
-        // The encoding
-        //
-        byte[] temp = new byte[input.length()];
-        int j = temp.length;
-
-        int startAt = zeroCount;
-        while (startAt < input58.length) {
-            byte mod = divmod256(input58, startAt);
-            if (input58[startAt] == 0) {
-                ++startAt;
-            }
-
-            temp[--j] = mod;
-        }
-
-        //
-        // Do no add extra leading zeroes, move j to first non null byte.
-        //
-        while (j < temp.length && temp[j] == 0) {
-            ++j;
-        }
-
-        return copyOfRange(temp, j - zeroCount, temp.length);
-    }
-
-    private static byte divmod58(byte[] number, int startAt) {
-        int remainder = 0;
-        for (int i = startAt; i < number.length; i++) {
-            int digit256 = (int) number[i] & 0xFF;
-            int temp = remainder * BASE_256 + digit256;
-
-            number[i] = (byte) (temp / BASE_58);
-
-            remainder = temp % BASE_58;
-        }
-
-        return (byte) remainder;
-    }
-
-    private static byte divmod256(byte[] number58, int startAt) {
-        int remainder = 0;
-        for (int i = startAt; i < number58.length; i++) {
-            int digit58 = (int) number58[i] & 0xFF;
-            int temp = remainder * BASE_58 + digit58;
-
-            number58[i] = (byte) (temp / BASE_256);
-
-            remainder = temp % BASE_256;
-        }
-
-        return (byte) remainder;
-    }
-
-    private static byte[] copyOfRange(byte[] source, int from, int to) {
-        byte[] range = new byte[to - from];
-        System.arraycopy(source, from, range, 0, range.length);
-
-        return range;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/crypto/ArtifactoryBase64.java b/base/common/src/main/java/org/artifactory/security/crypto/ArtifactoryBase64.java
deleted file mode 100644
index 2a9a71a..0000000
--- a/base/common/src/main/java/org/artifactory/security/crypto/ArtifactoryBase64.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security.crypto;
-
-import org.apache.commons.codec.binary.Base64;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.common.ConstantValues;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Date: 5/18/14 6:23 PM
- *
- * @author freds
- */
-public abstract class ArtifactoryBase64 {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryBase64.class);
-
-    private static final String DEFAULT_ENCRYPTION_PREFIX = "{DESede}";
-    // since maven 2.1.0 the curly braces are treated as special characters and hence needs to be escaped
-    // but still, maven sends the password with the escape characters. go figure...
-    private static final String ESCAPED_DEFAULT_ENCRYPTION_PREFIX = "\\{DESede\\}";
-    private static String encryptionPrefix;
-
-    public static boolean isCorrectFormat(String in) {
-        return extractBytes(in) != null;
-    }
-
-    public static boolean isPasswordEncrypted(String in) {
-        if (!isCorrectFormat(in)) {
-            return false;
-        }
-        return in.startsWith(ESCAPED_DEFAULT_ENCRYPTION_PREFIX) || in.startsWith(getEncryptionPrefix());
-    }
-
-    public static byte[] extractBytes(String encrypted) {
-        String stripped;
-        if (encrypted.startsWith(ESCAPED_DEFAULT_ENCRYPTION_PREFIX)) {
-            stripped = StringUtils.removeStart(encrypted, ESCAPED_DEFAULT_ENCRYPTION_PREFIX);
-        } else if (encrypted.startsWith(getEncryptionPrefix())) {
-            stripped = StringUtils.removeStart(encrypted, getEncryptionPrefix());
-        } else if (encrypted.length() > 125) {
-            // The private and public key are big and have no {DESede} in the front but are full base64
-            stripped = encrypted;
-        } else {
-            return null;
-        }
-        if (Base64.isBase64(stripped)) {
-            return fromBase64(stripped);
-        }
-        return null;
-    }
-
-    public static String convertToString(byte[] encrypted, boolean master) {
-        if (master) {
-            return toBase64(encrypted);
-        } else {
-            return getEncryptionPrefix() + toBase64(encrypted);
-        }
-    }
-
-    private static String getEncryptionPrefix() {
-        if (StringUtils.isBlank(encryptionPrefix)) {
-            String surroundCharacters = ConstantValues.securityAuthenticationEncryptedPasswordSurroundChars.getString();
-            if ((surroundCharacters.length() % 2) != 0) {
-                log.error("Provided with an asymmetric pair of encrypted password prefix surrounding characters: " +
-                        "falling back to the default.");
-                surroundCharacters = ConstantValues.securityAuthenticationEncryptedPasswordSurroundChars.getDefValue();
-            }
-
-            int middle = surroundCharacters.length() / 2;
-            String opening = surroundCharacters.substring(0, middle);
-            String closing = surroundCharacters.substring(middle, surroundCharacters.length());
-            encryptionPrefix = new StringBuilder(opening).append("DESede").append(closing).toString();
-        }
-
-        return encryptionPrefix;
-    }
-
-    static String toBase64(byte[] bytes) {
-        return CryptoHelper.bytesToString(Base64.encodeBase64(bytes));
-    }
-
-    static byte[] fromBase64(String base64Encoded) {
-        return Base64.decodeBase64(CryptoHelper.stringToBytes(base64Encoded));
-    }
-
-    /**
-     * Escape the encrypted password for maven usage.
-     *
-     * @param encryptedPassword Encrypted password to escape
-     * @return Escaped encrypted password.
-     */
-    public static String escapeEncryptedPassword(String encryptedPassword) {
-
-        if (encryptedPassword.startsWith(DEFAULT_ENCRYPTION_PREFIX)) {
-            return encryptedPassword.replace(DEFAULT_ENCRYPTION_PREFIX, ESCAPED_DEFAULT_ENCRYPTION_PREFIX);
-        }
-        return encryptedPassword;
-    }
-
-    public static boolean isEncryptedPasswordPrefixedWithDefault(String encryptedPassword) {
-        return encryptedPassword.startsWith(DEFAULT_ENCRYPTION_PREFIX);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/crypto/CryptoHelper.java b/base/common/src/main/java/org/artifactory/security/crypto/CryptoHelper.java
deleted file mode 100644
index e9fb947..0000000
--- a/base/common/src/main/java/org/artifactory/security/crypto/CryptoHelper.java
+++ /dev/null
@@ -1,375 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security.crypto;
-
-import org.apache.commons.io.FileUtils;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.crypto.Cipher;
-import javax.crypto.SecretKey;
-import javax.crypto.SecretKeyFactory;
-import javax.crypto.spec.PBEKeySpec;
-import javax.crypto.spec.PBEParameterSpec;
-import java.io.*;
-import java.nio.file.FileSystems;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.attribute.PosixFilePermission;
-import java.security.*;
-import java.security.spec.EncodedKeySpec;
-import java.security.spec.InvalidKeySpecException;
-import java.security.spec.PKCS8EncodedKeySpec;
-import java.security.spec.X509EncodedKeySpec;
-import java.text.SimpleDateFormat;
-import java.util.*;
-
-
-/**
- * Helper class for encrypting/decrypting passwords.
- *
- * @author Yossi Shaul
- */
-public abstract class CryptoHelper {
-    private static final Logger log = LoggerFactory.getLogger(CryptoHelper.class);
-
-    static final String ASYM_ALGORITHM = "RSA";
-    private static final String UTF8 = "UTF-8";
-    public static final String COLON = ":";
-
-    static final String SYM_ALGORITHM = "PBEWithSHA1AndDESede";
-    private static final byte[] PBE_SALT = new byte[]{
-            (byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE,
-            (byte) 0xEB, (byte) 0xAB, (byte) 0xEF, (byte) 0xAC
-    };
-    private static final int PBE_ITERATION_COUNT = 20;
-
-    private CryptoHelper() {
-        // utility class
-    }
-
-    public static String convertToString(Key key) {
-        return convertToString(key.getEncoded(), true);
-    }
-
-    // Use whenever byte array needs to be converted to a readable string
-    public static String convertToString(byte[] encrypted, boolean master) {
-        if (!master && ConstantValues.securityUseBase64.getBoolean()) {
-            // Master encryption supported only in base58
-            return ArtifactoryBase64.convertToString(encrypted, false);
-        } else {
-            if (master) {
-                return ArtifactoryBase58.convertMasterToString(encrypted);
-            } else {
-                return ArtifactoryBase58.convertPasswordToString(encrypted);
-            }
-        }
-    }
-
-    // Use whenever a string needs to be converted to the original byte array
-    public static byte[] convertToBytes(String encrypted, boolean master) {
-        byte[] bytes = ArtifactoryBase58.extractBytes(encrypted);
-        if (!master && bytes == null) {
-            bytes = ArtifactoryBase64.extractBytes(encrypted);
-        }
-        if (bytes == null) {
-            throw new IllegalArgumentException("String " + encrypted + " was not encrypted by Artifactory!");
-        }
-        return bytes;
-    }
-
-    public static boolean isMasterEncrypted(String in) {
-        if (in == null || in.length() == 0) {
-            return false;
-        }
-        // Master encryption supported only in base58
-        return ArtifactoryBase58.isMasterEncrypted(in);
-    }
-
-    public static boolean isPasswordEncrypted(String in) {
-        if (in == null || in.length() == 0) {
-            return false;
-        }
-
-        return ArtifactoryBase58.isPasswordEncrypted(in) || ArtifactoryBase64.isPasswordEncrypted(in);
-    }
-
-    public static boolean isApiKey(String in) {
-        if (in == null || in.length() == 0) {
-            return false;
-        }
-        return ArtifactoryBase58.isAPIKey(in);
-    }
-
-    public static String needsEscaping(String encrypted) {
-        if (ConstantValues.securityUseBase64.getBoolean()
-                && ArtifactoryBase64.isEncryptedPasswordPrefixedWithDefault(encrypted)) {
-            return ArtifactoryBase64.escapeEncryptedPassword(encrypted);
-        }
-        return encrypted;
-    }
-
-    public static KeyPair generateKeyPair() {
-        try {
-            KeyPairGenerator keyGen = KeyPairGenerator.getInstance(ASYM_ALGORITHM);
-            SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
-            keyGen.initialize(512, random);
-            return keyGen.generateKeyPair();
-        } catch (NoSuchAlgorithmException e) {
-            throw new IllegalArgumentException("No such algorithm:" + e.getMessage());
-        }
-    }
-
-    static KeyPair createKeyPair(byte[] encodedPrivateKey, byte[] encodedPublicKey) {
-        try {
-            EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(encodedPrivateKey);
-            KeyFactory generator = KeyFactory.getInstance(ASYM_ALGORITHM);
-            PrivateKey privateKey = generator.generatePrivate(privateKeySpec);
-
-            EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(encodedPublicKey);
-            PublicKey publicKey = generator.generatePublic(publicKeySpec);
-            return new KeyPair(publicKey, privateKey);
-        } catch (Exception e) {
-            throw new IllegalArgumentException("Failed to create KeyPair from provided encoded keys", e);
-        }
-    }
-
-    public static KeyPair createKeyPair(String stringBasePrivateKey, String stringBasePublicKey, boolean master) {
-        byte[] privateKeyEncoded = convertToBytes(stringBasePrivateKey, master);
-        byte[] publicKeyEncoded = convertToBytes(stringBasePublicKey, master);
-        return createKeyPair(privateKeyEncoded, publicKeyEncoded);
-    }
-
-    public static SecretKey generatePbeKeyFromKeyPair(String privateKey, String publicKey, boolean master) {
-        KeyPair keyPair = createKeyPair(privateKey, publicKey, master);
-        // Always use Base64 encoding (Historical and why not keep it reason)
-        return generatePbeKeyFromKeyPair(keyPair);
-    }
-
-    public static SecretKey generatePbeKeyFromKeyPair(KeyPair keyPair) {
-        return generatePbeKey(ArtifactoryBase64.toBase64(keyPair.getPrivate().getEncoded()));
-    }
-
-    public static SecretKey generatePbeKey(String password) {
-        try {
-            PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());
-            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(SYM_ALGORITHM);
-            SecretKey secretKey = keyFactory.generateSecret(pbeKeySpec);
-            return secretKey;
-        } catch (NoSuchAlgorithmException e) {
-            throw new IllegalArgumentException("No such algorithm: " + e.getMessage());
-        } catch (InvalidKeySpecException e) {
-            throw new RuntimeException("Unexpected exception: ", e);
-        }
-    }
-
-    public static String encryptSymmetric(String plainText, SecretKey pbeKey, boolean master) {
-        try {
-            Cipher pbeCipher = Cipher.getInstance(SYM_ALGORITHM);
-            PBEParameterSpec pbeParamSpec = new PBEParameterSpec(PBE_SALT, PBE_ITERATION_COUNT);
-            pbeCipher.init(Cipher.ENCRYPT_MODE, pbeKey, pbeParamSpec);
-            byte[] encrypted = pbeCipher.doFinal(stringToBytes(plainText));
-            return convertToString(encrypted, master);
-        } catch (Exception e) {
-            throw new UnsupportedOperationException(e);
-        }
-    }
-
-    public static String generateUniqueToken() throws GeneralSecurityException {
-        String data = String.valueOf(System.currentTimeMillis()) + COLON + UUID.randomUUID().toString();
-        return ArtifactoryBase58.convertApiTokenToString(stringToBytes(data));
-    }
-
-    public static String decryptSymmetric(String encrypted, SecretKey pbeKey, boolean master) {
-        try {
-            byte[] bytes = convertToBytes(encrypted, master);
-            Cipher pbeCipher = Cipher.getInstance(SYM_ALGORITHM);
-            PBEParameterSpec pbeParamSpec = new PBEParameterSpec(PBE_SALT, PBE_ITERATION_COUNT);
-            pbeCipher.init(Cipher.DECRYPT_MODE, pbeKey, pbeParamSpec);
-            byte[] decryptedBytes = pbeCipher.doFinal(bytes);
-            return bytesToString(decryptedBytes);
-        } catch (Exception e) {
-            throw new UnsupportedOperationException(e);
-        }
-    }
-
-    static String bytesToString(byte[] bytes) {
-        try {
-            return new String(bytes, UTF8);
-        } catch (UnsupportedEncodingException e) {
-            throw new RuntimeException("Unexpected exception", e);
-        }
-    }
-
-    static byte[] stringToBytes(String string) {
-        try {
-            return (string.getBytes(UTF8));
-        } catch (UnsupportedEncodingException e) {
-            throw new RuntimeException("Unexpected exception", e);
-        }
-    }
-
-    public static String encryptIfNeeded(String password) {
-        // If password null => no encryption
-        if (password == null || password.length() == 0) {
-            return password;
-        }
-        // If already encrypted => no encrypt again
-        if (isMasterEncrypted(password)) {
-            return password;
-        }
-
-        File keyFile = getMasterKeyFile();
-        if (!keyFile.exists()) {
-            return password;
-        }
-        SecretKey secretKey = getSecretKeyFromFile(keyFile);
-        return encryptSymmetric(password, secretKey, true);
-    }
-
-    public static String decryptIfNeeded(String password) {
-        if (isMasterEncrypted(password)) {
-            File keyFile = getMasterKeyFile();
-            if (!keyFile.exists()) {
-                throw new IllegalArgumentException("The Password is encrypted.\n" +
-                        "And no Master Key file found at " + keyFile.getAbsolutePath());
-            }
-            SecretKey secretKey = getSecretKeyFromFile(keyFile);
-            password = decryptSymmetric(password, secretKey, true);
-        }
-        return password;
-    }
-
-    /**
-     * Renames the master key file, effectively disabling encryption.
-     */
-    public static void removeMasterKeyFile() {
-        File keyFile = getMasterKeyFile();
-        if (!keyFile.exists()) {
-            throw new RuntimeException(
-                    "Cannot remove master key file if it does not exists at " + keyFile.getAbsolutePath());
-        }
-        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmsssSSS");
-        File renamed = new File(keyFile + "." + new Random().nextInt((10000 - 1) + 1) + "." + format.format(new Date()));
-
-        try {
-            FileUtils.moveFile(keyFile, renamed);
-        } catch (IOException e) {
-            throw new RuntimeException("Could not rename master key file at " + keyFile.getAbsolutePath()
-                    + " to " + renamed.getAbsolutePath(), e);
-        }
-    }
-
-    /**
-     * Creates a master encryption key file. Throws an exception if the key file already exists of on any failure with
-     * file or key creation.
-     */
-    public static void createMasterKeyFile() {
-        File keyFile = getMasterKeyFile();
-        if (keyFile.exists()) {
-            throw new IllegalStateException(
-                    "Cannot create new master key file if it already exists at " + keyFile.getAbsolutePath());
-        }
-        log.info("Creating master encryption key at {}", keyFile.getAbsolutePath());
-        KeyPair keyPair = generateKeyPair();
-        try {
-            File securityFolder = keyFile.getParentFile();
-            if (!securityFolder.exists()) {
-                if (!securityFolder.mkdirs()) {
-                    throw new RuntimeException(
-                            "Could not create the folder containing the key file " + securityFolder.getAbsolutePath());
-                }
-                setPermissionsOnSecurityFolder(securityFolder);
-            }
-
-            checkPermissionsOnSecurityFolder(securityFolder);
-            try (BufferedWriter writer = new BufferedWriter(new FileWriter(keyFile))) {
-                writer.write(convertToString(keyPair.getPrivate().getEncoded(), true));
-                writer.newLine();
-                writer.write(convertToString(keyPair.getPublic().getEncoded(), true));
-                writer.newLine();
-            }
-        } catch (IOException e) {
-            throw new RuntimeException("Could not write the key into " + keyFile.getAbsolutePath(), e);
-        }
-    }
-
-    /**
-     * @return Master encryption file configured location. The file might not exist.
-     */
-    public static File getMasterKeyFile() {
-        ArtifactoryHome home = ArtifactoryHome.get();
-        String keyFileLocation = ConstantValues.securityMasterKeyLocation.getString();
-        File keyFile = new File(keyFileLocation);
-        if (!keyFile.isAbsolute()) {
-            keyFile = new File(home.getHaAwareEtcDir(), keyFileLocation);
-        }
-        return keyFile;
-    }
-
-    public static void checkPermissionsOnSecurityFolder(File securityFolder) throws IOException {
-        checkPermissionsOnSecurityFolder(securityFolder.toPath());
-    }
-
-    public static void checkPermissionsOnSecurityFolder(Path securityFolder) throws IOException {
-        if (FileSystems.getDefault().supportedFileAttributeViews().contains("posix")) {
-            Set<PosixFilePermission> filePermissions = Files.getPosixFilePermissions(securityFolder);
-            if (filePermissions.contains(PosixFilePermission.GROUP_READ) || filePermissions.contains(
-                    PosixFilePermission.OTHERS_READ)) {
-                throw new RuntimeException("The folder containing the key file " +
-                        securityFolder.toAbsolutePath().toString() + " has too broad permissions!\n" +
-                        "Please limit access to the Artifactory user only!");
-            }
-        }
-    }
-
-    public static void setPermissionsOnSecurityFolder(File securityFolder) throws IOException {
-        setPermissionsOnSecurityFolder(securityFolder.toPath());
-    }
-
-    public static void setPermissionsOnSecurityFolder(Path securityFolder) throws IOException {
-        // The security folder should accessible only by the owner
-        if (FileSystems.getDefault().supportedFileAttributeViews().contains("posix")) {
-            Files.setPosixFilePermissions(securityFolder, EnumSet.of(
-                    PosixFilePermission.OWNER_EXECUTE, PosixFilePermission.OWNER_WRITE,
-                    PosixFilePermission.OWNER_READ));
-        }
-    }
-
-    private static SecretKey getSecretKeyFromFile(File keyFile) {
-        try (BufferedReader reader = new BufferedReader(new FileReader(keyFile))) {
-            String privateKey = reader.readLine();
-            String publicKey = reader.readLine();
-            return generatePbeKeyFromKeyPair(privateKey, publicKey, true);
-        } catch (IOException e) {
-            throw new RuntimeException(
-                    "Could not read master key " + keyFile.getAbsolutePath() + " to decrypt password!", e);
-        }
-    }
-
-    public static boolean hasMasterKey() {
-        return getMasterKeyFile().exists();
-    }
-
-    public static String getKeyFilePath() {
-        return getMasterKeyFile().getPath();
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/exceptions/LoginDisabledException.java b/base/common/src/main/java/org/artifactory/security/exceptions/LoginDisabledException.java
deleted file mode 100644
index 0dc919c..0000000
--- a/base/common/src/main/java/org/artifactory/security/exceptions/LoginDisabledException.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.security.exceptions;
-
-import org.artifactory.util.StringUtils;
-import org.joda.time.DateTime;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
-import org.springframework.security.authentication.DisabledException;
-
-/**
- * Thrown when user temporary blocked due to recurrent incorrect login attempts
- *
- * @author Michael Pasternak
- */
-public class LoginDisabledException extends DisabledException {
-
-    private static final int ONE_SECOND = 1000;
-    private static final float SECONDS_IN_MINUTE = 60 * 1000;
-    private static final DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("HH:mm:ss");
-
-    /**
-     * @param userName blocked user
-     * @param retryAt when next login retry is allowed
-     */
-    public LoginDisabledException(String userName, long retryAt) {
-        super(getUserErrorMessage(userName, retryAt));
-    }
-
-    /**
-     * @param retryAt when next login retry is allowed
-     */
-    public LoginDisabledException(long retryAt) {
-        super(getSessionErrorMessage(retryAt));
-    }
-
-    /**
-     * @param retryAt when next login retry is allowed
-     *
-     * @return error message
-     */
-    private static String getSessionErrorMessage(long retryAt) {
-        return String.format(
-                "This request is blocked due to recurrent login failures, please try again in %s",
-                calcNextLogin(retryAt, false)
-        );
-    }
-
-    /**
-     * @param userName blocked user
-     * @param retryAt when next login retry is allowed
-     *
-     * @param userName
-     * @param retryAt
-     *
-     * @return error message
-     */
-    private static String getUserErrorMessage(String userName, long retryAt) {
-        return String.format(
-                "'%s' is blocked due to recurrent login failures, " +
-                "please try again in %s",
-                userName,
-                calcNextLogin(retryAt, false)
-        );
-    }
-
-    /**
-     * @param userName blocked user
-     * @param retryAt when next login retry is allowed
-     * @param showNextLogin if next login time should be shown
-     */
-    public LoginDisabledException(String userName, long retryAt, boolean showNextLogin) {
-        super(
-                String.format(
-                        "'%s' is blocked due to recurrent login failures, " +
-                                "please try again in %s",
-                        userName,
-                        calcNextLogin(retryAt, showNextLogin)
-                )
-        );
-    }
-
-    /**
-     * Formats next login
-     *
-     * @param retryAt login available from
-     * @param showNextLogin if next login time should be shown
-     *
-     * @return formatted string
-     */
-    private static String calcNextLogin(long retryAt, boolean showNextLogin) {
-        DateTime delay = new DateTime(retryAt);
-        DateTime now = DateTime.now();
-        long diff = delay.getMillis() - now.getMillis();
-
-        if (showNextLogin) {
-            if (diff < SECONDS_IN_MINUTE) {
-                long seconds = diff / ONE_SECOND;
-                return String.format(
-                        "%d seconds (%s)",
-                        seconds == 0 ? 1 : seconds,
-                        dateTimeFormatter.print(delay.toLocalTime())
-                );
-            } else {
-                return String.format(
-                        "%.1f minutes (%s)",
-                        diff / SECONDS_IN_MINUTE,
-                        dateTimeFormatter.print(delay.toLocalTime())
-                );
-            }
-        } else {
-            if (diff < SECONDS_IN_MINUTE) {
-                long seconds = diff / ONE_SECOND;
-                return String.format(
-                        "%d seconds",
-                        seconds == 0 ? 1 : seconds
-                );
-            } else {
-                return String.format(
-                        "%.1f minutes",
-                        diff / SECONDS_IN_MINUTE
-                );
-            }
-        }
-    }
-
-    /**
-     * @param userName blocked user
-     * @param retryAt login available from
-     *
-     * @return {@link LoginDisabledException}
-     */
-    public static LoginDisabledException userLocked(String userName, long retryAt) {
-        return new LoginDisabledException(userName, retryAt);
-    }
-
-    /**
-     * @param userName blocked user
-     * @param retryAt login available from
-     *
-     * @return {@link LoginDisabledException}
-     */
-    public static LoginDisabledException sessionLocked(String userName, long retryAt) {
-        return new LoginDisabledException(userName, retryAt);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/exceptions/PasswordChangeException.java b/base/common/src/main/java/org/artifactory/security/exceptions/PasswordChangeException.java
deleted file mode 100644
index 5997646..0000000
--- a/base/common/src/main/java/org/artifactory/security/exceptions/PasswordChangeException.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.artifactory.security.exceptions;
-
-/**
- * Thrown when changing password fails
- *
- * Created by Michael Pasternak on 1/5/16.
- */
-public class PasswordChangeException extends RuntimeException {
-    public PasswordChangeException(String message) {
-        super(message);
-    }
-
-    public PasswordChangeException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/exceptions/PasswordExpireException.java b/base/common/src/main/java/org/artifactory/security/exceptions/PasswordExpireException.java
deleted file mode 100644
index f8d5074..0000000
--- a/base/common/src/main/java/org/artifactory/security/exceptions/PasswordExpireException.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.artifactory.security.exceptions;
-
-/**
- * Thrown when expiring password fails
- *
- * Created by Michael Pasternak on 1/5/16.
- */
-public class PasswordExpireException extends RuntimeException {
-    public PasswordExpireException(String message) {
-        super(message);
-    }
-
-    public PasswordExpireException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/exceptions/UserCredentialsExpiredException.java b/base/common/src/main/java/org/artifactory/security/exceptions/UserCredentialsExpiredException.java
deleted file mode 100644
index 047a724..0000000
--- a/base/common/src/main/java/org/artifactory/security/exceptions/UserCredentialsExpiredException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.artifactory.security.exceptions;
-
-import org.springframework.security.authentication.CredentialsExpiredException;
-
-/**
- * Thrown when user credentials have expired
- *
- * @author Michael Pasternak
- */
-public class UserCredentialsExpiredException extends CredentialsExpiredException {
-    public UserCredentialsExpiredException(String msg) {
-        super(msg);
-    }
-
-    public UserCredentialsExpiredException(String msg, Throwable t) {
-        super(msg, t);
-    }
-
-    /**
-     * Produces UserCredentialsExpiredException
-     *
-     * @param userName
-     * @return {@link UserCredentialsExpiredException}
-     */
-    public static UserCredentialsExpiredException instance(String userName) {
-        return new UserCredentialsExpiredException(
-                "Your credentials have expired, You must change your password before trying to login again"
-        );
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/exceptions/UserLockedException.java b/base/common/src/main/java/org/artifactory/security/exceptions/UserLockedException.java
deleted file mode 100644
index 1104e5d..0000000
--- a/base/common/src/main/java/org/artifactory/security/exceptions/UserLockedException.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.security.exceptions;
-
-import org.springframework.security.authentication.LockedException;
-
-/**
- * Thrown when user got locked due to incorrect login
- *
- * @author Michael Pasternak
- */
-public class UserLockedException extends LockedException {
-
-    public UserLockedException(String msg) {
-        super(msg);
-    }
-
-    /**
-     * Produces user error
-     *
-     * @param userName
-     * @return {@link UserLockedException}
-     */
-    public static UserLockedException userLocked(String userName) {
-        return new UserLockedException(getUserErrorMessage(userName));
-    }
-
-    /**
-     * Produces session/request error
-     *
-     * @return {@link UserLockedException}
-     */
-    public static UserLockedException sessionLocked() {
-        return new UserLockedException(getSessionErrorMessage());
-    }
-
-    /**
-     * Produces context aware error message
-     *
-     * @param userName
-     *
-     * @return error message
-     */
-    private static String getUserErrorMessage(String userName) {
-        return String.format("User %s is Locked.\nContact System Administrator to Unlock The Account.", userName);
-    }
-
-    /**
-     * Produces context aware error message
-     *
-     * @return error message
-     */
-    private static String getSessionErrorMessage() {
-        return String.format("This request is locked due to recurrent log on errors");
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/mission/control/MissionControlAuthenticationProvider.java b/base/common/src/main/java/org/artifactory/security/mission/control/MissionControlAuthenticationProvider.java
deleted file mode 100644
index c9c9af9..0000000
--- a/base/common/src/main/java/org/artifactory/security/mission/control/MissionControlAuthenticationProvider.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- */
-package org.artifactory.security.mission.control;
-
-import org.springframework.security.core.Authentication;
-
-/**
- * @author Gidi Shabat
- */
-public interface MissionControlAuthenticationProvider {
-    public static final String REALM = "mission-control";
-    public static final String HEADER_NAME = "Authorization-token";
-
-    /**
-     * Generate Mission Control authentication for success Mission Control token authentication
-     */
-    Authentication getFullAuthentication(String UserName);
-
-    /**
-     * Generate Anonymous authentication for invalid Mission Control token authentication
-     */
-    Authentication getAnonymousAuthentication();
-}
diff --git a/base/common/src/main/java/org/artifactory/security/mission/control/MissionControlProperties.java b/base/common/src/main/java/org/artifactory/security/mission/control/MissionControlProperties.java
deleted file mode 100644
index b68e40e..0000000
--- a/base/common/src/main/java/org/artifactory/security/mission/control/MissionControlProperties.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- */
-package org.artifactory.security.mission.control;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.storage.LinkedProperties;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Iterator;
-import java.util.Map;
-
-/**
- * @author Gidi Shabat
- */
-public class MissionControlProperties {
-    private static final Logger log = LoggerFactory.getLogger(MissionControlProperties.class);
-    private LinkedProperties props = null;
-
-    public MissionControlProperties(File missionControlPropsFile) {
-        props = new LinkedProperties();
-        if (missionControlPropsFile != null && missionControlPropsFile.exists()) {
-            try {
-                try (FileInputStream pis = new FileInputStream(missionControlPropsFile)) {
-                    props.load(pis);
-                }
-                trimValues();
-                assertMandatoryProperties();
-            } catch (Exception e) {
-                log.debug("Mission Control properties exist but contain invalid data", e);
-            }
-        }
-
-    }
-
-    private void trimValues() {
-        Iterator<Map.Entry<String, String>> iter = props.iterator();
-        while (iter.hasNext()) {
-            Map.Entry<String, String> entry = iter.next();
-            String value = entry.getValue();
-            if (!StringUtils.trimToEmpty(value).equals(value)) {
-                entry.setValue(StringUtils.trim(value));
-            }
-        }
-    }
-
-    public String getUrl() {
-        return props.getProperty("url", null);
-    }
-    public String getCreatedBy() {
-        return props.getProperty("created.by", null);
-    }
-    public String getCreatedDate() {
-        return props.getProperty("created.date", null);
-    }
-
-    public void setUrl(String url) {
-        props.setProperty("url", url);
-    }
-
-    public void setCreatedBy(String userName) {
-        props.setProperty("created.by", userName);
-    }
-
-    public void setCreatedDate(long date) {
-        props.setProperty("created.date", ""+date);
-    }
-
-    public String getToken() {
-        return props.getProperty("token", null);
-    }
-
-    public void setToken(String token) {
-        props.setProperty("token", token);
-    }
-
-    private void assertMandatoryProperties() {
-        if (StringUtils.isBlank(getUrl())) {
-            throw new RuntimeException("Missing URL field in Mission Control properties file");
-        }
-        if (StringUtils.isBlank(getToken())) {
-            throw new RuntimeException("Missing Token field in Mission Control properties file");
-        }
-
-    }
-
-    public void updateMissionControlPropertiesFile(File missionControlPropertiesFile) throws IOException {
-        if (props != null &&  props.iterator().hasNext()) {
-            OutputStream outputStream = new FileOutputStream(missionControlPropertiesFile);
-            props.store(outputStream, "");
-        }
-
-    }
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/security/props/auth/ApiKeyManager.java b/base/common/src/main/java/org/artifactory/security/props/auth/ApiKeyManager.java
deleted file mode 100644
index 6c8a7ca..0000000
--- a/base/common/src/main/java/org/artifactory/security/props/auth/ApiKeyManager.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.security.props.auth;
-
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
-public class ApiKeyManager extends PropsTokenManager {
-
-    public static final String API_KEY = "apiKey";
-
-    public static final String API_KEY_HEADER = "X-JFrog-Art-Api";
-
-    public static final String OLD_API_KEY_HEADER = "X-Api-Key";
-
-    @Override
-    protected String getPropKey() {
-        return API_KEY;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/props/auth/CacheWrapper.java b/base/common/src/main/java/org/artifactory/security/props/auth/CacheWrapper.java
deleted file mode 100644
index b35d135..0000000
--- a/base/common/src/main/java/org/artifactory/security/props/auth/CacheWrapper.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.artifactory.security.props.auth;
-
-import java.util.concurrent.TimeUnit;
-
-/**
- * <p>Created on 04/05/16
- *
- * @author Yinon Avraham
- */
-public interface CacheWrapper<K, V> {
-
-    void put(K key, V value);
-
-    V get(K key);
-
-    class CacheConfig {
-        private final Long duration;
-        private final TimeUnit timeUnit;
-
-        private CacheConfig(Long duration, TimeUnit timeUnit) {
-            this.duration = duration;
-            this.timeUnit = timeUnit;
-        }
-
-        static CacheConfigBuilder newConfig() {
-            return new CacheConfigBuilder();
-        }
-
-        public long getExpirationDuration() {
-            assert hasExpiration();
-            return duration;
-        }
-
-        public TimeUnit getExpirationTimeUnit() {
-            assert hasExpiration();
-            return timeUnit;
-        }
-
-        public boolean hasExpiration() {
-            return duration != null && timeUnit != null;
-        }
-    }
-
-    class CacheConfigBuilder {
-        private Long duration = null;
-        private TimeUnit timeUnit = null;
-
-        public CacheConfigBuilder expireAfterWrite(long duration, TimeUnit timeUnit) {
-            this.duration = duration;
-            this.timeUnit = timeUnit;
-            return this;
-        }
-
-        public CacheConfigBuilder noExpiration() {
-            this.duration = null;
-            this.timeUnit = null;
-            return this;
-        }
-
-        public CacheConfig build() {
-            return new CacheConfig(duration, timeUnit);
-        }
-    }
-
-}
diff --git a/base/common/src/main/java/org/artifactory/security/props/auth/DockerTokenManager.java b/base/common/src/main/java/org/artifactory/security/props/auth/DockerTokenManager.java
deleted file mode 100644
index 61b9447..0000000
--- a/base/common/src/main/java/org/artifactory/security/props/auth/DockerTokenManager.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.security.props.auth;
-
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
-public class DockerTokenManager extends PropsTokenManager {
-
-    public static final String DOCKER_TOKEN_KEY = "docker.basictoken";
-
-    public static final String AUTHORIZATION_HEADER = "Authorization";
-
-    public static final String OAUTH_TOKEN_PREFIX = "Bearer ";
-
-    @Override
-    protected String getPropKey() {
-        return DOCKER_TOKEN_KEY;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/props/auth/OauthManager.java b/base/common/src/main/java/org/artifactory/security/props/auth/OauthManager.java
deleted file mode 100644
index 4b03fd0..0000000
--- a/base/common/src/main/java/org/artifactory/security/props/auth/OauthManager.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.security.props.auth;
-
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
-public class OauthManager extends PropsTokenManager {
-
-    public static final String OAUTH_KEY = "basictoken";
-
-    public static final String AUTHORIZATION_HEADER = "Authorization";
-
-    public static final String OAUTH_TOKEN_PREFIX = "Bearer ";
-
-    @Override
-    protected String getPropKey() {
-        return OAUTH_KEY;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/props/auth/PropsAuthenticationToken.java b/base/common/src/main/java/org/artifactory/security/props/auth/PropsAuthenticationToken.java
deleted file mode 100644
index 0214931..0000000
--- a/base/common/src/main/java/org/artifactory/security/props/auth/PropsAuthenticationToken.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- */
-package org.artifactory.security.props.auth;
-
-import org.apache.commons.lang.StringUtils;
-import org.springframework.security.authentication.AbstractAuthenticationToken;
-import org.springframework.security.core.GrantedAuthority;
-
-import java.util.Collection;
-
-/**
- * @author Chen Keinan
- */
-public class PropsAuthenticationToken extends AbstractAuthenticationToken {
-
-    private final Object propsKey;
-    private final Object principal;
-    private Object credentials;
-
-    /**
-     * This constructor should only be used by <code>AuthenticationManager</code> or <code>AuthenticationProvider</code>
-     * implementations that are satisfied with producing a trusted (i.e. {@link #isAuthenticated()} = <code>true</code>)
-     * authentication token.
-     *
-     * @param principal - user principal
-     * @param propsKey - token principal
-     * @param credentials - user credential
-     * @param authorities - user authorities
-     */
-    public PropsAuthenticationToken(Object principal, Object propsKey, Object credentials, Collection<? extends GrantedAuthority> authorities) {
-        super(authorities);
-        this.credentials = credentials;
-        if (StringUtils.isBlank((String)propsKey)) {
-            this.propsKey = "NONE_PROVIDED";
-        } else {
-            this.propsKey = propsKey;
-        }
-        this.principal = principal;
-    }
-
-    @Override
-    public Object getCredentials() {
-        return credentials;
-    }
-
-    @Override
-    public Object getPrincipal() {
-        return principal;
-    }
-
-    public Object getPropsKey() {
-        return propsKey;
-    }
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/security/props/auth/PropsTokenCache.java b/base/common/src/main/java/org/artifactory/security/props/auth/PropsTokenCache.java
deleted file mode 100644
index 21c5033..0000000
--- a/base/common/src/main/java/org/artifactory/security/props/auth/PropsTokenCache.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.artifactory.security.props.auth;
-
-import org.artifactory.security.props.auth.model.TokenKeyValue;
-import org.springframework.security.core.userdetails.UserDetails;
-
-/**
- * <p>Created on 04/05/16
- *
- * @author Yinon Avraham
- */
-public interface PropsTokenCache {
-
-    void put(TokenKeyValue tokenKeyValue, UserDetails principal);
-
-    UserDetails get(TokenKeyValue tokenKeyValue);
-
-}
diff --git a/base/common/src/main/java/org/artifactory/security/props/auth/PropsTokenCacheImpl.java b/base/common/src/main/java/org/artifactory/security/props/auth/PropsTokenCacheImpl.java
deleted file mode 100644
index c9ef7f1..0000000
--- a/base/common/src/main/java/org/artifactory/security/props/auth/PropsTokenCacheImpl.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.artifactory.security.props.auth;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.security.props.auth.CacheWrapper.CacheConfig;
-import org.artifactory.security.props.auth.model.TokenKeyValue;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.stereotype.Component;
-
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.locks.ReentrantLock;
-
-/**
- * <p>Created on 04/05/16
- *
- * @author Yinon Avraham
- */
- at Component
-public class PropsTokenCacheImpl implements PropsTokenCache {
-
-    private static final String PROPS_TOKEN_CACHE_NAME = PropsTokenCacheImpl.class.getName();
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    private CacheWrapper<TokenKeyValue, UserDetails> cache;
-    private final ReentrantLock cacheLock = new ReentrantLock();
-
-    private void init() {
-        if (cache == null) {
-            cacheLock.lock();
-            if (cache == null) {
-                try {
-                    initCache();
-                } finally {
-                    cacheLock.unlock();
-                }
-            }
-        }
-    }
-
-    private void initCache() {
-        CacheConfig cacheConfig = CacheConfig.newConfig()
-                .expireAfterWrite(5, TimeUnit.MINUTES)
-                .build();
-        HaCommonAddon haAddon = addonsManager.addonByType(HaCommonAddon.class);
-        this.cache = haAddon.getCache(PROPS_TOKEN_CACHE_NAME, cacheConfig);
-    }
-
-    @Override
-    public void put(TokenKeyValue tokenKeyValue, UserDetails principal) {
-        init();
-        cache.put(tokenKeyValue, principal);
-    }
-
-    @Override
-    public UserDetails get(TokenKeyValue tokenKeyValue) {
-        init();
-        return cache.get(tokenKeyValue);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/props/auth/PropsTokenManager.java b/base/common/src/main/java/org/artifactory/security/props/auth/PropsTokenManager.java
deleted file mode 100644
index e87098d..0000000
--- a/base/common/src/main/java/org/artifactory/security/props/auth/PropsTokenManager.java
+++ /dev/null
@@ -1,139 +0,0 @@
-package org.artifactory.security.props.auth;
-
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.security.props.auth.model.TokenKeyValue;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.security.GeneralSecurityException;
-import java.sql.SQLException;
-
-/**
- * @author Chen Keinan
- */
- at Component
-public abstract class PropsTokenManager implements TokenManager {
-    private static final Logger log = LoggerFactory.getLogger(PropsTokenManager.class);
-
-    @Autowired
-    UserGroupService userGroupService;
-
-    /**
-     * return props key for each token type (oauth , apiKey and etc)
-     *
-     * @return key
-     */
-    protected abstract String getPropKey();
-
-
-    @Override
-    public TokenKeyValue generateToken(String userName) {
-        TokenKeyValue token = null;
-        String key = getPropKey();
-        try {
-            String value = CryptoHelper.generateUniqueToken();
-            token = new TokenKeyValue(key, value);
-        } catch (GeneralSecurityException e) {
-            log.debug("error with generating token for user {} with key {}", userName, key, e);
-        }
-        return token;
-    }
-
-    @Override
-    public TokenKeyValue createToken(String userName) {
-        TokenKeyValue token = null;
-        String tokenValue = null;
-        String key = getPropKey();
-        try {
-            tokenValue = CryptoHelper.generateUniqueToken();
-            boolean tokenPropCreated = userGroupService.createPropsToken(userName, key, tokenValue);
-            if (tokenPropCreated) {
-                token = new TokenKeyValue(key, tokenValue);
-            }
-        } catch (GeneralSecurityException e) {
-            log.debug("error with generating token for user {} with key {}", userName, key, e);
-        } catch (SQLException e) {
-            log.debug("error with adding token for user {} with key {} and value {}", userName, key, tokenValue, e);
-        }
-        return token;
-    }
-
-    @Override
-    public TokenKeyValue addExternalToken(String userName, String tokenValue) {
-        TokenKeyValue token = null;
-        String key = getPropKey();
-        try {
-            boolean propsToken = userGroupService.createPropsToken(userName, key, tokenValue);
-            if (propsToken) {
-                token = new TokenKeyValue(key, tokenValue);
-            }
-        } catch (SQLException e) {
-            log.debug("error with adding external token for user {} with key {} and value {}", userName, key, tokenValue, e);
-        }
-        return token;
-    }
-    @Override
-    public TokenKeyValue refreshToken(String userName) {
-        TokenKeyValue token = null;
-        try {
-            String value = CryptoHelper.generateUniqueToken();
-            token = updateToken(userName, value);
-        } catch (GeneralSecurityException e) {
-            log.debug("error with refreshing token for user {}", userName, e);
-        }
-        return token;
-    }
-
-    @Override
-    public TokenKeyValue updateToken(String userName, String value) {
-        String key = getPropKey();
-        TokenKeyValue token = null;
-        try {
-            boolean propsToken = userGroupService.updatePropsToken(userName, key, value);
-            if (propsToken) {
-                token = new TokenKeyValue(key, value);
-            }
-        } catch (SQLException e) {
-            log.debug("error with updating token for user {} with key {} and value {}", userName, key, value, e);
-        }
-        return token;
-    }
-
-    public TokenKeyValue getToken(String userName) {
-        String key = getPropKey();
-        TokenKeyValue token = null;
-        String value = userGroupService.getPropsToken(userName, key);
-        if (value != null) {
-            token = new TokenKeyValue(key, value);
-        }
-        return token;
-    }
-
-    @Override
-    public boolean revokeToken(String userName) {
-        boolean tokenRevokeSucceeded = false;
-        String key = getPropKey();
-        try {
-            tokenRevokeSucceeded = userGroupService.revokePropsToken(userName, key);
-        } catch (SQLException e) {
-            log.debug("error with revoking token for user {} with key {}", userName, key, e);
-        }
-        return tokenRevokeSucceeded;
-    }
-
-    @Override
-    public boolean revokeAllTokens() {
-        boolean tokenRevokeSucceeded = false;
-        String key = getPropKey();
-        try {
-            userGroupService.revokeAllPropsTokens(key);
-            tokenRevokeSucceeded = true;
-        } catch (SQLException e) {
-            log.debug("error with revoking all tokens with key {}", key, e);
-        }
-        return tokenRevokeSucceeded;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/props/auth/SimpleCacheWrapper.java b/base/common/src/main/java/org/artifactory/security/props/auth/SimpleCacheWrapper.java
deleted file mode 100644
index 51903f6..0000000
--- a/base/common/src/main/java/org/artifactory/security/props/auth/SimpleCacheWrapper.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.security.props.auth;
-
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
-
-/**
- * <p>Created on 04/05/16
- *
- * @author Yinon Avraham
- */
-public class SimpleCacheWrapper<K, V> implements CacheWrapper<K, V> {
-
-    private final Cache<K, V> cache;
-
-    public SimpleCacheWrapper(CacheConfig cacheConfig) {
-        cache = buildCache(cacheConfig);
-    }
-
-    private static <K, V> Cache<K, V> buildCache(CacheConfig cacheConfig) {
-        CacheBuilder<Object, Object> builder = CacheBuilder.<K, V>newBuilder();
-        if (cacheConfig.hasExpiration()) {
-            builder.expireAfterWrite(cacheConfig.getExpirationDuration(), cacheConfig.getExpirationTimeUnit());
-        }
-        return builder.build();
-    }
-
-    @Override
-    public void put(K key, V value) {
-        cache.put(key, value);
-    }
-
-    @Override
-    public V get(K key) {
-        return cache.getIfPresent(key);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/props/auth/SshTokenManager.java b/base/common/src/main/java/org/artifactory/security/props/auth/SshTokenManager.java
deleted file mode 100644
index 2befac7..0000000
--- a/base/common/src/main/java/org/artifactory/security/props/auth/SshTokenManager.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.security.props.auth;
-
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
-public class SshTokenManager extends PropsTokenManager {
-
-    public static final String SSH_KEY = "ssh.basictoken";
-
-    public static final String AUTHORIZATION_HEADER = "Authorization";
-
-    public static final String OAUTH_TOKEN_PREFIX = "Bearer ";
-
-    @Override
-    protected String getPropKey() {
-        return SSH_KEY;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/props/auth/TokenManager.java b/base/common/src/main/java/org/artifactory/security/props/auth/TokenManager.java
deleted file mode 100644
index 8a93e47..0000000
--- a/base/common/src/main/java/org/artifactory/security/props/auth/TokenManager.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package org.artifactory.security.props.auth;
-
-
-import org.artifactory.security.props.auth.model.TokenKeyValue;
-
-/**
- * @author Chen Keinan
- */
-public interface TokenManager {
-
-    /**
-     * generate a token, does <b><i>not</i></b> store it
-     *
-     * @param userName - userName to create token for
-     * @return Token data
-     */
-    TokenKeyValue generateToken(String userName);
-
-    /**
-     * create token (user props) and store it in DB
-     *
-     * @param userName - userName to create token for
-     * @return Token data
-     */
-    TokenKeyValue createToken(String userName);
-
-    /**
-     * delete current token and create  new token (user props) and store it in DB
-     *
-     * @param userName - userName to refresh token for
-     * @return Token data
-     */
-    TokenKeyValue refreshToken(String userName);
-
-    /**
-     * delete current token and store new given token
-     *
-     * @param userName - userName to update token for
-     * @param token - new token to store
-     * @return Token data
-     */
-    TokenKeyValue updateToken(String userName, String token);
-
-    /**
-     * get current token
-     *
-     * @param userName - userName to get token for
-     * @return Token data
-     */
-    TokenKeyValue getToken(String userName);
-
-    /**
-     * delete current token from DB
-     *
-     * @param userName - userName to delete token for
-     * @return Token data
-     */
-    boolean revokeToken(String userName);
-
-    /**
-     * delete all tokens in user props table DB
-     *
-     * @return Token data
-     */
-    boolean revokeAllTokens();
-
-    /**
-     * add external Token (git enterprise and etc) to db
-     *
-     * @param userName
-     * @param extToken
-     * @return
-     */
-    TokenKeyValue addExternalToken(String userName, String extToken);
-
-}
diff --git a/base/common/src/main/java/org/artifactory/security/props/auth/model/AuthenticationModel.java b/base/common/src/main/java/org/artifactory/security/props/auth/model/AuthenticationModel.java
deleted file mode 100644
index f97ff38..0000000
--- a/base/common/src/main/java/org/artifactory/security/props/auth/model/AuthenticationModel.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.artifactory.security.props.auth.model;
-
-import org.codehaus.jackson.annotate.JsonProperty;
-
-/**
- * @author Chenk Keinan
- */
-public class AuthenticationModel implements OauthModel {
-
-    private String token;
-    @JsonProperty("expires_in")
-    private Integer expiresIn;
-    @JsonProperty("issued_at")
-    private String issuedAt;
-
-    public AuthenticationModel() {
-    }
-
-    public AuthenticationModel(String token, String issuedAt) {
-        this.issuedAt = issuedAt;
-        this.expiresIn = 3600;
-        this.token = token;
-    }
-
-
-    public String getToken() {
-        return token;
-    }
-
-    public void setToken(String token) {
-        this.token = token;
-    }
-
-    public Integer getExpiresIn() {
-        return expiresIn;
-    }
-
-    public void setExpiresIn(Integer expiresIn) {
-        this.expiresIn = expiresIn;
-    }
-
-    public String getIssuedAt() {
-        return issuedAt;
-    }
-
-    public void setIssuedAt(String issuedAt) {
-        this.issuedAt = issuedAt;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/props/auth/model/OauthDockerErrorModel.java b/base/common/src/main/java/org/artifactory/security/props/auth/model/OauthDockerErrorModel.java
deleted file mode 100644
index 8a98bf5..0000000
--- a/base/common/src/main/java/org/artifactory/security/props/auth/model/OauthDockerErrorModel.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.artifactory.security.props.auth.model;
-
-/**
- * @author Chen Keinan
- */
-public class OauthDockerErrorModel implements OauthModel {
-
-    private int statusCode;
-    private OauthErrorEnum details;
-
-    public OauthDockerErrorModel() {
-    }
-
-    public OauthDockerErrorModel(int statusCode, OauthErrorEnum internalErrorMsg) {
-        this.statusCode = statusCode;
-        this.details = internalErrorMsg;
-    }
-
-    public int getStatusCode() {
-        return statusCode;
-    }
-
-    public void setStatusCode(int statusCode) {
-        this.statusCode = statusCode;
-    }
-
-    public OauthErrorEnum getDetails() {
-        return details;
-    }
-
-    public void setDetails(OauthErrorEnum details) {
-        this.details = details;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/props/auth/model/OauthErrorEnum.java b/base/common/src/main/java/org/artifactory/security/props/auth/model/OauthErrorEnum.java
deleted file mode 100644
index 811bb55..0000000
--- a/base/common/src/main/java/org/artifactory/security/props/auth/model/OauthErrorEnum.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.security.props.auth.model;
-
-
-/**
- * @author Chenk Keinan
- */
-public enum OauthErrorEnum {
-
-    USER_NOT_FOUND("user not found"),
-    INTERNAL_SERVER_ERROR("internal server error"),
-    BAD_REQUEST("bad request"),
-    UNAUTHORIZED("unauthorized request"),
-    BAD_CREDENTIAL("Bad Credential");
-
-
-    private String value;
-
-    private OauthErrorEnum(String value) {
-        this.value = value;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/props/auth/model/OauthErrorModel.java b/base/common/src/main/java/org/artifactory/security/props/auth/model/OauthErrorModel.java
deleted file mode 100644
index 6069430..0000000
--- a/base/common/src/main/java/org/artifactory/security/props/auth/model/OauthErrorModel.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.artifactory.security.props.auth.model;
-
-import org.codehaus.jackson.annotate.JsonProperty;
-
-/**
- * @author Chen Keinan
- */
-public class OauthErrorModel implements OauthModel {
-
-    private int statusCode;
-    private OauthErrorEnum internalErrorMsg;
-    private String message;
-    @JsonProperty("documentation_url")
-    private String documentationUrl;
-
-    public OauthErrorModel() {
-    }
-
-    public OauthErrorModel(int statusCode, OauthErrorEnum internalErrorMsg) {
-        this.statusCode = statusCode;
-        this.internalErrorMsg = internalErrorMsg;
-    }
-
-    public int getStatusCode() {
-        return statusCode;
-    }
-
-    public void setStatusCode(int statusCode) {
-        this.statusCode = statusCode;
-    }
-
-    public OauthErrorEnum getInternalErrorMsg() {
-        return internalErrorMsg;
-    }
-
-    public void setInternalErrorMsg(OauthErrorEnum internalErrorMsg) {
-        this.internalErrorMsg = internalErrorMsg;
-    }
-
-    public String getMessage() {
-        return message;
-    }
-
-    public void setMessage(String message) {
-        this.message = message;
-    }
-
-    public String getDocumentationUrl() {
-        return documentationUrl;
-    }
-
-    public void setDocumentationUrl(String documentationUrl) {
-        this.documentationUrl = documentationUrl;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/props/auth/model/OauthModel.java b/base/common/src/main/java/org/artifactory/security/props/auth/model/OauthModel.java
deleted file mode 100644
index 3b0a424..0000000
--- a/base/common/src/main/java/org/artifactory/security/props/auth/model/OauthModel.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.artifactory.security.props.auth.model;
-
-/**
- * @author Chen Keinan
- */
-public interface OauthModel {
-}
diff --git a/base/common/src/main/java/org/artifactory/security/props/auth/model/TokenKeyValue.java b/base/common/src/main/java/org/artifactory/security/props/auth/model/TokenKeyValue.java
deleted file mode 100644
index 941ceab..0000000
--- a/base/common/src/main/java/org/artifactory/security/props/auth/model/TokenKeyValue.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.artifactory.security.props.auth.model;
-
-import java.io.Serializable;
-
-/**
- * @author Chen Keinan
- */
-public class TokenKeyValue implements Serializable {
-
-    private String token;
-
-    private String key;
-
-    public TokenKeyValue(String token) {
-        this.token = token;
-    }
-
-    public TokenKeyValue(String key, String token) {
-        this.key = key;
-        this.token = token;
-    }
-
-    public String getToken() {
-        return token;
-    }
-
-    public void setToken(String token) {
-        this.token = token;
-    }
-
-    public String getKey() {
-        return key;
-    }
-
-    public void setKey(String key) {
-        this.key = key;
-    }
-
-    @Override
-    public String toString() {
-        return String.format("%s=%s", key, token);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        TokenKeyValue that = (TokenKeyValue) o;
-
-        return this.toString().equals(that.toString());
-
-    }
-
-    @Override
-    public int hashCode() {
-        return this.toString().hashCode();
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/providermgr/ArtifactoryCacheKey.java b/base/common/src/main/java/org/artifactory/security/providermgr/ArtifactoryCacheKey.java
deleted file mode 100644
index 45260b9..0000000
--- a/base/common/src/main/java/org/artifactory/security/providermgr/ArtifactoryCacheKey.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package org.artifactory.security.providermgr;
-
-import org.springframework.security.authentication.AuthenticationDetailsSource;
-
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * Model object for saving bearer tokens
- *
- * @author Chen Keinan
- */
-public abstract class ArtifactoryCacheKey {
-    private String user;
-    protected String basicauth;
-    private String repoKey;
-    protected AuthenticationDetailsSource<HttpServletRequest, ?> authenticationDetailsSource;
-
-    public ArtifactoryCacheKey(String user, String basicauth, String repoKey,
-            AuthenticationDetailsSource<HttpServletRequest, ?> authenticationDetailsSource) {
-        this.user = user;
-        this.basicauth = basicauth;
-        this.repoKey = repoKey;
-        this.authenticationDetailsSource = authenticationDetailsSource;
-    }
-
-    public String getUser() {
-        return user;
-    }
-
-    public void setUser(String user) {
-        this.user = user;
-    }
-
-    public String getBasicauth() {
-        return basicauth;
-    }
-
-    public void setBasicauth(String basicauth) {
-        this.basicauth = basicauth;
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        ArtifactoryCacheKey that = (ArtifactoryCacheKey) o;
-
-        if (user != null ? !user.equals(that.user) : that.user != null) return false;
-        if (basicauth != null ? !basicauth.equals(that.basicauth) : that.basicauth != null) return false;
-        return !(repoKey != null ? !repoKey.equals(that.repoKey) : that.repoKey != null);
-
-    }
-
-    @Override
-    public int hashCode() {
-        int result = user != null ? user.hashCode() : 0;
-        result = 31 * result + (basicauth != null ? basicauth.hashCode() : 0);
-        result = 31 * result + (repoKey != null ? repoKey.hashCode() : 0);
-        return result;
-    }
-
-    @Override
-    public String toString() {
-        return "TokenCacheKey{" +
-                "scope='" + user + '\'' +
-                ", realm='" + basicauth + '\'' +
-                ", repoKey='" + repoKey + '\'' +
-                '}';
-    }
-
-    public abstract ProviderMgr getProviderMgr();
-}
diff --git a/base/common/src/main/java/org/artifactory/security/providermgr/ArtifactoryTokenProvider.java b/base/common/src/main/java/org/artifactory/security/providermgr/ArtifactoryTokenProvider.java
deleted file mode 100644
index 0dbcef2..0000000
--- a/base/common/src/main/java/org/artifactory/security/providermgr/ArtifactoryTokenProvider.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.artifactory.security.providermgr;
-
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.security.props.auth.model.OauthDockerErrorModel;
-import org.artifactory.security.props.auth.model.OauthErrorModel;
-import org.artifactory.security.props.auth.model.OauthModel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Nonnull;
-import javax.annotation.PostConstruct;
-import java.util.List;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-
-/**
- * artifactory specific token cache implementation ,
- * The tokens are cached in-memory and auto expire according to the
- *
- * @author Chen Keinan
- */
- at Component
-public class ArtifactoryTokenProvider {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryTokenProvider.class);
-
-    private LoadingCache<ArtifactoryCacheKey, OauthModel> tokens;
-
-    @PostConstruct
-    public void initTokensCache() {
-        tokens = CacheBuilder.newBuilder()
-                .initialCapacity(1000)
-                .expireAfterWrite(ConstantValues.genericTokensCacheIdleTimeSecs.getLong(), TimeUnit.SECONDS)
-                .build(new CacheLoader<ArtifactoryCacheKey, OauthModel>() {
-                    @Override
-                    public OauthModel load(@Nonnull ArtifactoryCacheKey key) throws Exception {
-                        return fetchNewToken(key);
-                    }
-                });
-    }
-
-    public OauthModel getToken(ArtifactoryCacheKey artifactoryCacheKey) {
-        String userName = artifactoryCacheKey.getUser();
-        OauthModel oauthModel = null;
-        try {
-            log.trace("Getting token for " + userName);
-            oauthModel = tokens.get(artifactoryCacheKey);
-            return oauthModel;
-        } catch (ExecutionException e) {
-            throw new RuntimeException("Could not get token from cache for " + userName, e);
-        } finally {
-            if (oauthModel != null) {
-                if (oauthModel instanceof OauthErrorModel || oauthModel instanceof OauthDockerErrorModel) {
-                    tokens.invalidate(artifactoryCacheKey);
-                }
-            }
-        }
-    }
-
-    /**
-     * Used when expiring user credentials or revoking api keys - will remove the user's tokens from the cache
-     * to force re-authentication.
-     * @param userName  user to invalidate cache entries for
-     */
-    public void invalidateUserCacheEntries(String userName) {
-        List<ArtifactoryCacheKey> toInvalidate = tokens.asMap().keySet().stream()
-                .filter(cacheKey -> cacheKey.getUser().equalsIgnoreCase(userName))
-                .collect(Collectors.toList());
-        tokens.invalidateAll(toInvalidate);
-    }
-
-    public void invalidateCacheEntriesForAllUsers() {
-        tokens.invalidateAll();
-    }
-
-    private OauthModel fetchNewToken(ArtifactoryCacheKey artifactoryCacheKey) {
-        return artifactoryCacheKey.getProviderMgr().fetchTokenFromProvider();
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/providermgr/DockerCacheKey.java b/base/common/src/main/java/org/artifactory/security/providermgr/DockerCacheKey.java
deleted file mode 100644
index b7a02b5..0000000
--- a/base/common/src/main/java/org/artifactory/security/providermgr/DockerCacheKey.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.security.providermgr;
-
-import org.springframework.security.authentication.AuthenticationDetailsSource;
-
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * @author Chen Keinan
- */
-public class DockerCacheKey extends ArtifactoryCacheKey {
-
-    public DockerCacheKey(String user, String basicauth, String repoKey,
-            AuthenticationDetailsSource<HttpServletRequest, ?> authenticationDetailsSource) {
-        super(user, basicauth, repoKey, authenticationDetailsSource);
-    }
-
-    @Override
-    public ProviderMgr getProviderMgr() {
-        return new DockerProviderMgr(authenticationDetailsSource, basicauth);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/providermgr/DockerProviderMgr.java b/base/common/src/main/java/org/artifactory/security/providermgr/DockerProviderMgr.java
deleted file mode 100644
index f9caaa2..0000000
--- a/base/common/src/main/java/org/artifactory/security/providermgr/DockerProviderMgr.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package org.artifactory.security.providermgr;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.security.SecurityDescriptor;
-import org.artifactory.descriptor.security.oauth.OAuthSettings;
-import org.artifactory.security.LoginHandler;
-import org.artifactory.security.props.auth.model.OauthDockerErrorModel;
-import org.artifactory.security.props.auth.model.OauthErrorEnum;
-import org.artifactory.security.props.auth.model.OauthModel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.authentication.AuthenticationDetailsSource;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-/**
- * @author Chen Keinan
- */
-public class DockerProviderMgr implements ProviderMgr {
-    private static final Logger log = LoggerFactory.getLogger(DockerProviderMgr.class);
-
-    private AuthenticationDetailsSource<HttpServletRequest, ?> authenticationDetailsSource;
-    private String authHeader;
-
-    public DockerProviderMgr(AuthenticationDetailsSource<HttpServletRequest, ?> authenticationDetailsSource,
-            String authHeader) {
-        this.authenticationDetailsSource = authenticationDetailsSource;
-        this.authHeader = authHeader;
-    }
-
-    @Override
-    public OauthModel fetchTokenFromProvider() {
-        LoginHandler loginHandler = ContextHelper.get().beanForType(LoginHandler.class);
-        // if basic auth no present return with unauthorized
-        String[] tokens = new String[]{"anonymous", ""};
-        try {
-            if (StringUtils.isNotBlank(authHeader)) {
-                tokens = loginHandler.extractAndDecodeHeader(authHeader);
-            }
-        } catch (IOException e) {
-            log.error("failed to extract credential from headers", e);
-        }
-        String username = tokens[0];
-        OauthModel json;
-        try {
-            return loginHandler.doBasicAuthWithDb(tokens, authenticationDetailsSource);
-        } catch (Exception e) {
-            json = new OauthDockerErrorModel(HttpServletResponse.SC_UNAUTHORIZED, OauthErrorEnum.BAD_CREDENTIAL);
-            log.debug("failed to authenticate with basic authentication", e);
-        }
-        // if auth integration isn't enable return
-        if (!isOauthSettingEnable()) {
-            log.debug("Artifactory basic authentication failed ,oauth integration isn't enable");
-            return json;
-        }
-        return loginHandler.doBasicAuthWithProvider(authHeader, username);
-    }
-
-
-    /**
-     * check weather oauth integration is enabled
-     *
-     * @return true if auth integration is enabled
-     */
-    private boolean isOauthSettingEnable() {
-        CentralConfigDescriptor descriptor = ContextHelper.get().getCentralConfig().getDescriptor();
-        SecurityDescriptor security = descriptor.getSecurity();
-            OAuthSettings oauthSettings = security.getOauthSettings();
-            if (oauthSettings != null && oauthSettings.getEnableIntegration()) {
-                return true;
-        }
-        return false;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/security/providermgr/ProviderMgr.java b/base/common/src/main/java/org/artifactory/security/providermgr/ProviderMgr.java
deleted file mode 100644
index a86e854..0000000
--- a/base/common/src/main/java/org/artifactory/security/providermgr/ProviderMgr.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.artifactory.security.providermgr;
-
-import org.artifactory.security.props.auth.model.OauthModel;
-
-/**
- * @author Chen Keinan
- */
-public interface ProviderMgr {
-
-    OauthModel fetchTokenFromProvider();
-}
diff --git a/base/common/src/main/java/org/artifactory/spring/ContextReadinessListener.java b/base/common/src/main/java/org/artifactory/spring/ContextReadinessListener.java
deleted file mode 100644
index 9d894f7..0000000
--- a/base/common/src/main/java/org/artifactory/spring/ContextReadinessListener.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.spring;
-
-/**
- * @author yoavl
- */
-public interface ContextReadinessListener {
-
-    /**
-     * Called once after the context has been created, all beans initialized and context ready
-     * Actually called AFTER contextReady
-     */
-    void onContextCreated();
-
-    /**
-     * Called when all beans have initialized and the artifactory context is fully ready
-     */
-    void onContextReady();
-
-    void onContextUnready();
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/spring/LicenseEventListener.java b/base/common/src/main/java/org/artifactory/spring/LicenseEventListener.java
deleted file mode 100644
index 199a7a5..0000000
--- a/base/common/src/main/java/org/artifactory/spring/LicenseEventListener.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.spring;
-
-import java.io.IOException;
-
-/**
- * Marks recipients of license installation events
- */
-public interface LicenseEventListener {
-
-    /**
-     * Called when a new license is installed (not applicable to reloads on import and startup)
-     */
-    void verifyLicense(String licenseKeyHash) throws IOException;
-
-    /**
-     * Called when a new license is installed (not applicable to reloads on import and startup)
-     */
-    void onLicenseLoaded();
-}
diff --git a/base/common/src/main/java/org/artifactory/spring/Reloadable.java b/base/common/src/main/java/org/artifactory/spring/Reloadable.java
deleted file mode 100644
index 3e74b87..0000000
--- a/base/common/src/main/java/org/artifactory/spring/Reloadable.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.spring;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Annotate classes that can be reloaded.
- *
- * @author Tomer Cohen
- */
- at Target({ElementType.TYPE})
- at Retention(RetentionPolicy.RUNTIME)
- at Inherited
- at Documented
-public @interface Reloadable {
-
-    /**
-     * @return The class by which this bean will be identified for dependency management (initAfter()).
-     */
-    Class<? extends ReloadableBean> beanClass();
-
-    /**
-     * List of classes this bean is dependant on. It is guaranteed that this {@link ReloadableBean} convert and init
-     * methods will be called after the dependent beans. During shutdown the order is the opposite.
-     *
-     * @return List of beans that this one depends upon
-     */
-    Class<? extends ReloadableBean>[] initAfter() default {};
-}
diff --git a/base/common/src/main/java/org/artifactory/spring/ReloadableBean.java b/base/common/src/main/java/org/artifactory/spring/ReloadableBean.java
deleted file mode 100644
index bd7a7a7..0000000
--- a/base/common/src/main/java/org/artifactory/spring/ReloadableBean.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.spring;
-
-import org.artifactory.common.property.ArtifactoryConverter;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.sapi.common.Lock;
-
-/**
- * User: freds Date: Jul 21, 2008 Time: 11:43:00 AM
- */
-public interface ReloadableBean extends ArtifactoryConverter {
-
-    /**
-     * This init will be called after the context is created and can be annotated with transactional propagation
-     */
-    @Lock
-    void init();
-
-    /**
-     * This is called when the configuration xml changes. It is using the same init order all beans that need to do
-     * something on reload.
-     *
-     * @param oldDescriptor
-     */
-    void reload(CentralConfigDescriptor oldDescriptor);
-
-    /**
-     * Called when Artifactory is shutting down. Called in reverse order than the init order.
-     */
-    void destroy();
-
-}
diff --git a/base/common/src/main/java/org/artifactory/state/ArtifactoryServerState.java b/base/common/src/main/java/org/artifactory/state/ArtifactoryServerState.java
deleted file mode 100644
index 56401d1..0000000
--- a/base/common/src/main/java/org/artifactory/state/ArtifactoryServerState.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.state;
-
-import org.apache.commons.lang.StringUtils;
-
-/**
- * @author mamo, fsi
- */
-public enum ArtifactoryServerState {
-    UNKNOWN, OFFLINE, STARTING, RUNNING, STOPPING, STOPPED, CONVERTING;
-
-    public static ArtifactoryServerState fromString(String val) {
-        if (StringUtils.isBlank(val)) {
-            return UNKNOWN;
-        }
-        try {
-            return valueOf(val.toUpperCase());
-        } catch (IllegalArgumentException e) {
-            return UNKNOWN;
-        }
-    }
-
-    public String getPrettyName() {
-        return StringUtils.capitalize(name().toLowerCase());
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/state/model/ArtifactoryStateManager.java b/base/common/src/main/java/org/artifactory/state/model/ArtifactoryStateManager.java
deleted file mode 100644
index 3d2d0a2..0000000
--- a/base/common/src/main/java/org/artifactory/state/model/ArtifactoryStateManager.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.artifactory.state.model;
-
-import org.artifactory.spring.ReloadableBean;
-import org.artifactory.state.ArtifactoryServerState;
-
-/**
- * author: gidis
- */
-public interface ArtifactoryStateManager extends ReloadableBean {
-
-    /**
-     * Set the {@link org.artifactory.storage.ha.entity.ArtifactoryServer} matching the
-     * given {@code serverId} state to the {@code state}
-     * <p><i>Use this method with caution.</i>
-     *
-     * @param serverId the serverId of an existing {@code ArtifactoryServer}
-     * @throws IllegalStateException when given {@code serverId} does not match any existing server
-     */
-    boolean forceState(ArtifactoryServerState state);
-
-    void beforeDestroy();
-}
diff --git a/base/common/src/main/java/org/artifactory/storage/BinariesSummary.java b/base/common/src/main/java/org/artifactory/storage/BinariesSummary.java
deleted file mode 100644
index 0abd813..0000000
--- a/base/common/src/main/java/org/artifactory/storage/BinariesSummary.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package org.artifactory.storage;
-
-/**
- * @author Chen Keinan
- */
-public class BinariesSummary {
-
-    private String binariesCount;
-    private String binariesSize;
-    private String artifactsSize;
-    private String optimization;
-    private String itemsCount;
-    private String artifactsCount;
-    private String totalSize;
-
-    public String getBinariesSize() {
-        return binariesSize;
-    }
-
-    public void setBinariesSize(String binariesSize) {
-        this.binariesSize = binariesSize;
-    }
-
-    public String getArtifactsSize() {
-        return artifactsSize;
-    }
-
-    public void setArtifactsSize(String artifactsSize) {
-        this.artifactsSize = artifactsSize;
-    }
-
-    public String getOptimization() {
-        return optimization;
-    }
-
-    public void setOptimization(String optimization) {
-        this.optimization = optimization;
-    }
-
-    public String getBinariesCount() {
-        return binariesCount;
-    }
-
-    public void setBinariesCount(String binariesCount) {
-        this.binariesCount = binariesCount;
-    }
-
-    public String getItemsCount() {
-        return itemsCount;
-    }
-
-    public void setItemsCount(String itemsCount) {
-        this.itemsCount = itemsCount;
-    }
-
-    public String getArtifactsCount() {
-        return artifactsCount;
-    }
-
-    public void setArtifactsCount(String artifactsCount) {
-        this.artifactsCount = artifactsCount;
-    }
-
-    public String getTotalSize() {
-        return totalSize;
-    }
-
-    public void setTotalSize(String totalSize) {
-        this.totalSize = totalSize;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/storage/FileStoreStorageSummary.java b/base/common/src/main/java/org/artifactory/storage/FileStoreStorageSummary.java
deleted file mode 100644
index d2d63ce..0000000
--- a/base/common/src/main/java/org/artifactory/storage/FileStoreStorageSummary.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2014 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.storage;
-
-import javax.annotation.Nullable;
-import java.io.File;
-import java.io.Serializable;
-import java.util.List;
-
-import static org.artifactory.storage.StorageProperties.BinaryProviderType;
-import static org.artifactory.storage.StorageProperties.BinaryProviderType.cachedFS;
-import static org.artifactory.storage.StorageProperties.BinaryProviderType.fullDb;
-
-/**
- * Summary of the storage used by Artifactory on the filesystem.
- * This is usually either the binaries filestore or the cache folder.
- *
- * @author Yossi Shaul
- */
-public class FileStoreStorageSummary implements Serializable {
-    private final List<File> binariesFolders;
-    private final BinaryProviderType binariesStorageType;
-    private long freeSpace;
-    private long totalSpace;
-    private long usedSpace;
-    private long cacheSize;
-
-    public FileStoreStorageSummary(List<File> binariesFolders, StorageProperties storageProperties) {
-        this(binariesFolders, storageProperties.getBinariesStorageType());
-        if (fullDb.equals(binariesStorageType) || cachedFS.equals(binariesStorageType)) {
-            cacheSize = storageProperties.getCacheProviderMaxSize();
-        } else {
-            cacheSize = -1L;
-        }
-    }
-
-    public FileStoreStorageSummary(@Nullable List<File> binariesFolders, BinaryProviderType binariesStorageType) {
-        this.binariesFolders = binariesFolders;
-        this.binariesStorageType = binariesStorageType;
-        if (binariesFolders != null && !binariesFolders.isEmpty()) {
-            freeSpace = binariesFolders.stream().mapToLong(File::getFreeSpace).sum();
-            totalSpace = binariesFolders.stream().mapToLong(File::getTotalSpace).sum();
-            usedSpace = totalSpace - freeSpace;
-        } else {
-            freeSpace = 0;
-            totalSpace = 0;
-            usedSpace = 0;
-        }
-    }
-
-    /**
-     * @return The type of the binaries storage (filesystem, full db etc.)
-     */
-    public BinaryProviderType getBinariesStorageType() {
-        return binariesStorageType;
-    }
-
-    /**
-     * @return The location on the filesystem storing the binaries (either the filestore or the cache). Might be null
-     * when configured to use full db without a cache
-     */
-    @Nullable
-    public List<File> getBinariesFolders() {
-        return binariesFolders;
-    }
-
-    /**
-     * @return The total space in bytes on the device containing {@link FileStoreStorageSummary#getBinariesFolders()}
-     */
-    public long getTotalSpace() {
-        return totalSpace;
-    }
-
-    /**
-     * @return The free space, in bytes, on the device containing {@link FileStoreStorageSummary#getBinariesFolders()}
-     */
-    public long getUsedSpace() {
-        return usedSpace;
-    }
-
-    /**
-     * @return The free space, in bytes, on the device containing {@link FileStoreStorageSummary#getBinariesFolders()}
-     */
-    public long getFreeSpace() {
-        return freeSpace;
-    }
-
-    /**
-     * @return Used space fraction
-     */
-    public double getUsedSpaceFraction() {
-        return (double) usedSpace / totalSpace;
-    }
-
-    /**
-     * @return Free space fraction
-     */
-    public double getFreeSpaceFraction() {
-        return (double) freeSpace / totalSpace;
-    }
-
-    public long getCacheSize() {
-        return cacheSize;
-    }
-
-    protected void setCacheSize(long cacheSize) {
-        this.cacheSize = cacheSize;
-    }
-
-}
diff --git a/base/common/src/main/java/org/artifactory/storage/FileStoreSummary.java b/base/common/src/main/java/org/artifactory/storage/FileStoreSummary.java
deleted file mode 100644
index 36ba523..0000000
--- a/base/common/src/main/java/org/artifactory/storage/FileStoreSummary.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.artifactory.storage;
-
-/**
- * @author Chen Keinan
- */
-public class FileStoreSummary {
-
-    private String storageType;
-    private String storageDirectory;
-    private String totalSpace;
-    private String usedSpace;
-    private String freeSpace;
-
-
-    public String getStorageType() {
-        return storageType;
-    }
-
-    public void setStorageType(String storageType) {
-        this.storageType = storageType;
-    }
-
-    public String getStorageDirectory() {
-        return storageDirectory;
-    }
-
-    public void setStorageDirectory(String storageDirectory) {
-        this.storageDirectory = storageDirectory;
-    }
-
-    public String getTotalSpace() {
-        return totalSpace;
-    }
-
-    public void setTotalSpace(String totalSpace) {
-        this.totalSpace = totalSpace;
-    }
-
-    public String getUsedSpace() {
-        return usedSpace;
-    }
-
-    public void setUsedSpace(String usedSpace) {
-        this.usedSpace = usedSpace;
-    }
-
-    public String getFreeSpace() {
-        return freeSpace;
-    }
-
-    public void setFreeSpace(String freeSpace) {
-        this.freeSpace = freeSpace;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/storage/LinkedProperties.java b/base/common/src/main/java/org/artifactory/storage/LinkedProperties.java
deleted file mode 100644
index 0d56837..0000000
--- a/base/common/src/main/java/org/artifactory/storage/LinkedProperties.java
+++ /dev/null
@@ -1,209 +0,0 @@
-package org.artifactory.storage;
-
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.*;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Map.Entry;
-import java.util.Properties;
-import java.util.Set;
-
-/**
- * class extends Properties in order to enable
- * reading and writing properties file in order with comments
- *
- * @author Chen Keinan
- */
-public class LinkedProperties extends Properties {
-
-    private static final Logger log = LoggerFactory.getLogger(LinkedProperties.class);
-    private LinkedHashMap<String, String> linkedProps = new LinkedHashMap<>();
-    private int commentCount;
-
-    public static String toString(String key, String value) {
-        if (key.charAt(0) == '#') {
-            return value;
-        }
-        return key + "=" + value;
-    }
-
-    @Override
-    public String getProperty(String key) {
-        return linkedProps.get(key);
-    }
-
-    @Override
-    public String getProperty(String key, String defaultValue) {
-        String propKey = linkedProps.get(key);
-        if (propKey != null) {
-            return propKey;
-        }
-        return defaultValue;
-    }
-
-    @Override
-    public synchronized Object setProperty(String key, String value) {
-        String trimmed = StringUtils.trimToEmpty(value); // nulls are not allowed
-        return linkedProps.put(key, trimmed);
-    }
-
-    /**
-     * Set properties file data line
-     *
-     * @param data   - property data
-     * @param lineNo - line number
-     */
-    private void setLine(String data, int lineNo) {
-        int i = 0;
-        char c;
-        int state = 0;
-        StringBuilder key = new StringBuilder();
-        StringBuilder value = new StringBuilder();
-
-        for (; i < data.length(); i++) {
-            c = data.charAt(i);
-            switch (state) {
-                case 0:
-                    if (!Character.isWhitespace(c)) {
-                        state = 1;
-                        i--;
-                    }
-                    break;
-                case 1:
-                    if (c == '#' || c == '!') {
-                        i = data.length();
-                    } else {
-                        key.append(c);
-                        state = 2;
-                    }
-                    break;
-                case 2:
-                    if (Character.isWhitespace(c) || c == '=' || c == ':') {
-                        state = 3;
-                        i--;
-                    } else {
-                        key.append(c);
-                    }
-                    break;
-                case 3:
-                    if (!Character.isWhitespace(c)) {
-                        state = 4;
-                        i--;
-                    }
-                    break;
-                case 4:
-                    if (c == '=' || c == ':') {
-                        state = 5;
-                    } else {
-                        throw new IllegalArgumentException("Line in properties file is malformed: " + lineNo);
-                    }
-                    break;
-                case 5:
-                    if (!Character.isWhitespace(c)) {
-                        state = 6;
-                        i--;
-                    }
-                    break;
-                case 6:
-                    value.append(c);
-                    break;
-            }
-        }
-
-        if (key.length() == 0) {
-            addComment(data);
-        } else {
-            linkedProps.put(key.toString(), value.toString());
-        }
-    }
-
-    public void addComment(String comment) {
-        linkedProps.put("#" + (++commentCount), comment);
-    }
-
-    public void load(String fname) throws IOException {
-        File file = new File(fname);
-        if (file.exists() && file.isFile()) {
-            InputStream inputStream = null;
-            try {
-                load(inputStream = new FileInputStream(file));
-            } finally {
-                if (inputStream != null) {
-                    try {
-                        inputStream.close();
-                    } catch (IOException ex) {
-                        log.error("Error Loading properties File" + ex.getMessage(), ex, log);
-                    }
-                }
-            }
-        }
-    }
-
-    @Override
-    public synchronized void load(InputStream inputStream) throws IOException {
-        load(new InputStreamReader(inputStream));
-    }
-
-    @Override
-    public synchronized void load(Reader reader) throws IOException {
-        String dataLine;
-        int lineNo = 0;
-        commentCount = 0;
-        BufferedReader in = new BufferedReader(reader);
-        while ((dataLine = in.readLine()) != null) {
-            setLine(dataLine, ++lineNo);
-        }
-    }
-
-    public void store(String fName, String comment)
-            throws IOException {
-        File file = new File(fName);
-        if (file.exists() && !file.isFile()) {
-            return;
-        }
-        OutputStream outputStream = null;
-        try {
-            store(outputStream = new FileOutputStream(file), comment);
-        } finally {
-            if (outputStream != null) {
-                try {
-                    outputStream.close();
-                } catch (IOException ex) {
-                    log.error("Error Saving properties File" + ex.getMessage(), ex, log);
-                }
-            }
-        }
-    }
-
-    @Override
-    public void store(OutputStream out, String comment) throws IOException {
-        store(new PrintWriter(out, true), comment);
-    }
-
-    @Override
-    public void store(Writer writer, String comment) throws IOException {
-        store(new PrintWriter(writer, true), comment);
-    }
-
-    public void store(PrintWriter out, String comment) throws IOException {
-        Set<String> keySet = linkedProps.keySet();
-        for (String key : keySet) {
-            out.println(toString(key, linkedProps.get(key)));
-        }
-    }
-
-    @Override
-    public void list(PrintStream out) {
-        Set<String> keySet = linkedProps.keySet();
-        for (String key : keySet) {
-            out.println(toString(key, linkedProps.get(key)));
-        }
-    }
-
-    public Iterator<Entry<String, String>> iterator() {
-        return linkedProps.entrySet().iterator();
-    }
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/storage/RepositorySummary.java b/base/common/src/main/java/org/artifactory/storage/RepositorySummary.java
deleted file mode 100644
index 32d093e..0000000
--- a/base/common/src/main/java/org/artifactory/storage/RepositorySummary.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package org.artifactory.storage;
-
-import org.artifactory.api.repo.storage.RepoStorageSummaryInfo;
-import org.artifactory.api.storage.StorageUnit;
-import org.artifactory.util.NumberFormatter;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonProperty;
-
-/**
- * @author Chen Keinan
- */
-public class RepositorySummary {
-
-    private String repoKey;
-    private RepoStorageSummaryInfo.RepositoryType repoType;
-    private long foldersCount;
-    private long filesCount;
-    private String usedSpace;
-    private long itemsCount;
-    @JsonIgnore
-    private Double percentage;
-    @JsonProperty("percentage")
-    private String displayPercentage;
-    private String packageType;
-
-    public RepositorySummary() {
-    }
-
-    public RepositorySummary(RepoStorageSummaryInfo repoStorageSummaryInfo, long totalSize) {
-        this.setRepoKey(repoStorageSummaryInfo.getRepoKey());
-        this.setUsedSpace(StorageUnit.toReadableString(repoStorageSummaryInfo.getUsedSpace()));
-        this.setPercentage(Double.longBitsToDouble(repoStorageSummaryInfo.getUsedSpace()) / Double.longBitsToDouble(totalSize));
-        this.setDisplayPercentage(NumberFormatter.formatPercentage(getPercentage()));
-        this.setFilesCount(repoStorageSummaryInfo.getFilesCount());
-        this.setFoldersCount(repoStorageSummaryInfo.getFoldersCount());
-        this.setItemsCount(repoStorageSummaryInfo.getItemsCount());
-        this.packageType = repoStorageSummaryInfo.getType();
-        this.repoType = repoStorageSummaryInfo.getRepoType();
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    public RepoStorageSummaryInfo.RepositoryType getRepoType() {
-        return repoType;
-    }
-
-    public void setRepoType(RepoStorageSummaryInfo.RepositoryType repoType) {
-        this.repoType = repoType;
-    }
-
-    public String getUsedSpace() {
-        return usedSpace;
-    }
-
-    public void setUsedSpace(String usedSpace) {
-        this.usedSpace = usedSpace;
-    }
-
-    public long getFoldersCount() {
-        return foldersCount;
-    }
-
-    public void setFoldersCount(long foldersCount) {
-        this.foldersCount = foldersCount;
-    }
-
-    public long getFilesCount() {
-        return filesCount;
-    }
-
-    public void setFilesCount(long filesCount) {
-        this.filesCount = filesCount;
-    }
-
-    public long getItemsCount() {
-        return itemsCount;
-    }
-
-    public void setItemsCount(long itemsCount) {
-        this.itemsCount = itemsCount;
-    }
-
-    public Double getPercentage() {
-        return percentage;
-    }
-
-    public void setPercentage(double percentage) {
-        this.percentage = percentage;
-    }
-
-    public String getDisplayPercentage() {
-        return displayPercentage;
-    }
-
-    public void setDisplayPercentage(String displayPercentage) {
-        this.displayPercentage = displayPercentage;
-    }
-
-    public String getPackageType() {
-        return packageType;
-    }
-
-    public void setPackageType(String packageType) {
-        this.packageType = packageType;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/storage/StorageProperties.java b/base/common/src/main/java/org/artifactory/storage/StorageProperties.java
deleted file mode 100644
index 6268ffe..0000000
--- a/base/common/src/main/java/org/artifactory/storage/StorageProperties.java
+++ /dev/null
@@ -1,383 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage;
-
-import com.google.common.collect.Maps;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.storage.StorageUnit;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.storage.db.DbType;
-import org.jfrog.storage.binstore.ifc.BinaryProviderConfig;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nonnull;
-import java.io.*;
-import java.util.Iterator;
-import java.util.Map;
-
-/**
- * A convenient class to parse the storage properties file.
- *
- * @author Yossi Shaul
- */
-public class StorageProperties {
-    protected static final int DEFAULT_MAX_ACTIVE_CONNECTIONS = 100;
-    protected static final int DEFAULT_MAX_IDLE_CONNECTIONS = 10;
-    private static final Logger log = LoggerFactory.getLogger(StorageProperties.class);
-    private static final String DEFAULT_MAX_CACHE_SIZE = "5GB";
-
-    private LinkedProperties props = null;
-    private DbType dbType = null;
-
-    public StorageProperties(File storagePropsFile) throws IOException {
-        props = new LinkedProperties();
-        try (FileInputStream pis = new FileInputStream(storagePropsFile)) {
-            props.load(pis);
-        }
-
-        trimValues();
-        assertMandatoryProperties();
-
-        // cache commonly used properties
-        dbType = DbType.parse(getProperty(Key.type));
-
-        // verify that the database is supported (will throw an exception if not found)
-        log.debug("Loaded storage properties for supported database type: {}", getDbType());
-    }
-
-    /**
-     * update storage properties file;
-     *
-     * @throws IOException
-     */
-    public void updateStoragePropertiesFile(File updateStoragePropFile) throws IOException {
-        if (props != null) {
-            OutputStream outputStream = new FileOutputStream(updateStoragePropFile);
-            props.store(outputStream, "");
-        }
-    }
-
-    public DbType getDbType() {
-        return dbType;
-    }
-
-    public String getConnectionUrl() {
-        return getProperty(Key.url);
-    }
-
-    /**
-     * Update the connection URL property (should only be called for derby when the url contains place holders)
-     *
-     * @param connectionUrl The new connection URL
-     */
-    public void setConnectionUrl(String connectionUrl) {
-        props.setProperty(Key.url.key, connectionUrl);
-    }
-
-    public String getDriverClass() {
-        return getProperty(Key.driver);
-    }
-
-    public String getUsername() {
-        return getProperty(Key.username);
-    }
-
-    public String getPassword() {
-        String password = getProperty(Key.password);
-        password = CryptoHelper.decryptIfNeeded(password);
-        return password;
-    }
-
-    public void setPassword(String updatedPassword) {
-        props.setProperty(Key.password.key, updatedPassword);
-    }
-
-    public String getTempDir() {
-        return getProperty(Key.binaryProviderFilesystemTempDir, "_pre");
-    }
-
-    public int getMaxActiveConnections() {
-        return getIntProperty(Key.maxActiveConnections.key, DEFAULT_MAX_ACTIVE_CONNECTIONS);
-    }
-
-    public int getMaxIdleConnections() {
-        return getIntProperty(Key.maxIdleConnections.key, DEFAULT_MAX_IDLE_CONNECTIONS);
-    }
-
-    @Nonnull
-    public BinaryProviderType getBinariesStorageType() {
-        return BinaryProviderType.valueOf(
-                getProperty(Key.binaryProviderType, BinaryProviderType.filesystem.name()));
-    }
-
-    public String getS3BucketName() {
-        return getProperty(Key.binaryProviderS3BucketName, null);
-    }
-
-    public String getS3Credential() {
-        String credential = getProperty(Key.binaryProviderS3Credential);
-        return CryptoHelper.decryptIfNeeded(credential);
-    }
-
-    public void setS3Credential(String credential) {
-        props.setProperty(Key.binaryProviderS3Credential.key(), credential);
-    }
-
-    public Map<String, String> getS3Params() {
-        return getProperties(Key.binaryProviderS3Param.key + ".");
-    }
-
-    public Map<String, String> getGCParams() {
-        return getProperties(Key.binaryProviderGCParam + ".");
-    }
-
-    public String getS3ProxyCredential() {
-        String credential = getProperty(Key.binaryProviderS3ProxyCredential.key, null);
-        return CryptoHelper.decryptIfNeeded(credential);
-    }
-
-    public void setS3ProxyCredential(String credential) {
-        props.setProperty(Key.binaryProviderS3ProxyCredential.key(), credential);
-    }
-
-    public String getBinaryProviderExternalDir() {
-        return getProperty(Key.binaryProviderExternalDir);
-    }
-
-    public long getCacheProviderMaxSize() {
-        return StorageUnit.fromReadableString(getProperty(Key.binaryProviderCacheMaxSize, DEFAULT_MAX_CACHE_SIZE));
-    }
-
-    public String getProperty(Key property) {
-        return props.getProperty(property.key);
-    }
-
-    public String getProperty(Key property, String defaultValue) {
-        return props.getProperty(property.key, defaultValue);
-    }
-
-    public String getProperty(String key, String defaultValue) {
-        return props.getProperty(key, defaultValue);
-    }
-
-    public boolean getBooleanProperty(String key, boolean defaultValue) {
-        return Boolean.parseBoolean(props.getProperty(key, defaultValue + ""));
-    }
-
-    public int getIntProperty(String key, int defaultValue) {
-        return Integer.parseInt(props.getProperty(key, defaultValue + ""));
-    }
-
-    public long getLongProperty(String key, long defaultValue) {
-        return Long.parseLong(props.getProperty(key, defaultValue + ""));
-    }
-
-    public Map<String, String> getProperties(String prefix) {
-        Map<String, String> result = Maps.newHashMap();
-        Iterator<Map.Entry<String, String>> iterator = props.iterator();
-        while (iterator.hasNext()) {
-            Map.Entry<String, String> next = iterator.next();
-            if (next.getKey().startsWith(prefix)) {
-                String reminder = next.getKey().replace(prefix, "");
-                if (!StringUtils.isBlank(reminder)) {
-                    result.put(reminder, next.getValue());
-                }
-            }
-        }
-        return result;
-    }
-
-    private void trimValues() {
-        Iterator<Map.Entry<String, String>> iter = props.iterator();
-        while (iter.hasNext()) {
-            Map.Entry<String, String> entry = iter.next();
-            String value = entry.getValue();
-            if (!StringUtils.trimToEmpty(value).equals(value)) {
-                entry.setValue(StringUtils.trim(value));
-            }
-        }
-    }
-
-    private void assertMandatoryProperties() {
-        Key[] mandatory = {Key.type, Key.url, Key.driver};
-        for (Key mandatoryProperty : mandatory) {
-            String value = getProperty(mandatoryProperty);
-            if (StringUtils.isBlank(value)) {
-                throw new IllegalStateException("Mandatory storage property '" + mandatoryProperty + "' doesn't exist");
-            }
-        }
-    }
-
-    public boolean isDerby() {
-        return dbType == DbType.DERBY;
-    }
-
-    public boolean isPostgres() {
-        return dbType == DbType.POSTGRESQL;
-    }
-
-    public BinaryProviderConfig toDefaultValues() {
-        BinaryProviderConfig defaultValues = new BinaryProviderConfig();
-        for (Key key : Key.values()) {
-            if (!key.isBinaryProviderField()) {
-                continue;
-            }
-            if (Key.binaryProviderCacheMaxSize.equals(key)) {
-                String value = getProperty(key, DEFAULT_MAX_CACHE_SIZE);
-                defaultValues.addParam(key.signature, "" + StorageUnit.fromReadableString(value));
-            } else {
-                String defaultValue = key.getDefaultValue() != null ? key.getDefaultValue().toString() : null;
-                defaultValues.addParam(key.signature, getProperty(key.key(), defaultValue));
-            }
-        }
-        defaultValues.addParam("baseDataDir", ArtifactoryHome.get().getHaAwareDataDir().getAbsolutePath());
-        addS3Properties(defaultValues);
-        addGCProperties(defaultValues);
-        return defaultValues;
-    }
-
-    private void addS3Properties(BinaryProviderConfig binaryProviderConfig) {
-        Map<String, String> s3Params = getS3Params();
-        for (String key : s3Params.keySet()) {
-            binaryProviderConfig.addProperty(key, s3Params.get(key));
-        }
-    }
-
-    private void addGCProperties(BinaryProviderConfig binaryProviderConfig) {
-        Map<String, String> s3Params = getGCParams();
-        for (String key : s3Params.keySet()) {
-            binaryProviderConfig.addProperty(key, s3Params.get(key));
-        }
-    }
-
-
-    public enum Key {
-        username, password, type, url, driver,
-        maxActiveConnections("pool.max.active", null, null),
-        maxIdleConnections("pool.max.idle", null, null),
-
-        binaryProviderType("binary.provider.type", "storageType", BinaryProviderType.filesystem.name()),  // see BinaryProviderType
-        binaryProviderCacheMaxSize("binary.provider.cache.maxSize", "maxCacheSize", DEFAULT_MAX_CACHE_SIZE),
-        binaryProviderCacheCacheSynchQuitePeriod("binary.provider.cache.synch.quite.period", "cacheSynchQuietPeriod", 60 * 1000),
-        binaryProviderCacheDir("binary.provider.cache.dir", "cacheProviderDir", "cache"),
-        binaryProviderFilesystemDir("binary.provider.filesystem.dir", "fileStoreDir", "filestore"),
-        binaryProviderFilesystemTempDir("binary.provider.filesystem.temp.dir", "tempDir", "_pre"),
-        binaryProviderExternalDir("binary.provider.external.dir", "externalDir", null),
-        binaryProviderExternalMode("binary.provider.external.mode", "connectMode", null),
-        binaryProviderInfoEvictionTime("binary.provider.info.eviction.time", "binaryProviderInfoEvictionTime", 1000 * 5),
-
-        // Retry binary provider
-        binaryProviderRetryMaxRetriesNumber("binary.provider.retry.max.retries.number", "maxTrys", 5),
-        binaryProviderRetryDelayBetweenRetries("binary.provider.retry.delay.between.retries", "interval", 5000),
-
-        // S3 binary provider
-        binaryProviderS3Identity("binary.provider.s3.identity", "s3Identity", null),
-        binaryProviderS3UseSignature("binary.provider.s3.use.signature", "s3UseSignature", false),
-        binaryProviderS3Credential("binary.provider.s3.credential", "s3Credential", null),
-        binaryProviderS3BlobVerifyTimeout("binary.provider.s3.blob.verification.timeout", "s3VerificationTimeout", 60000),
-        binaryProviderS3ProxyIdentity("binary.provider.s3.proxy.identity", "s3ProxyIdentity", null),
-        binaryProviderS3ProxyCredential("binary.provider.s3.proxy.credential", "s3ProxyCredential", null),
-        binaryProviderS3BucketName("binary.provider.s3.bucket.name", "s3BucketName", null),
-        binaryProviderS3BucketPath("binary.provider.s3.bucket.path", "s3Path", "filestore"),
-        binaryProviderS3ProviderId("binary.provider.s3.provider.id", "s3ProviderId", "s3"),
-        binaryProviderS3Endpoint("binary.provider.s3.endpoint", "s3Endpoint", null),
-        binaryProviderS3EndpointPort("binary.provider.s3.endpoint.port", "s3Port", -1),
-        binaryProviderS3awsVersion("binary.provider.s3.aws.version", "s3AwsVersion", null),
-        binaryProviderS3Region("binary.provider.s3.region", "s3Region", null),
-        binaryProviderS3MultiPartLimit("binary.provider.s3.multi.part.limit", "s3MultiPartLimit", 100 * 1000 * 1000),
-        binaryProviderS3HttpsOnly("binary.provider.s3.https.only", "s3HttpsOnly", true),
-        binaryProviderS3HttpsPort("binary.provider.s3.https.port", "s3HttpsPort", -1),
-        binaryProviderS3TestConnection("binary.provider.s3.test.connection", "s3TestConnection", true),
-        binaryProviderS3ProxyPort("binary.provider.s3.proxy.port", "s3ProxyPort", -1),
-        binaryProviderS3ProxyHost("binary.provider.s3.proxy.host", "s3ProxyHost", null),
-
-        // Google binary provider
-        binaryProviderGsIdentity("binary.provider.gs.identity", "gsIdentity", null),
-        binaryProviderGsCredential("binary.provider.gs.credential", "gsCredential", null),
-        binaryProviderGsProxyIdentity("binary.provider.gs.proxy.identity", "gsProxyIdentity", null),
-        binaryProviderGsProxyCredential("binary.provider.gs.proxy.credential", "gsProxyCredential", null),
-        binaryProviderGsBucketName("binary.provider.gs.bucket.name", "gsBucketName", null),
-        binaryProviderGsBucketPath("binary.provider.gs.bucket.path", "gsPath", "filestore"),
-        binaryProviderGsHttpPort("binary.provider.gs.endpoint.http.port", "gsPort", 80),
-        binaryProviderGsEndPoint("binary.provider.gs.endpoint", "gsEndpoint", "commondatastorage.googleapis.com"),
-        binaryProviderGsHttpsOnly("binary.provider.gs.https.only", "gsHttpsOnly", true),
-        binaryProviderGsHttpsPort("binary.provider.gs.https.port", "gsHttpsPort", 443),
-        binaryProviderGsTestConnection("binary.provider.gs.test.connection", "gsTestConnection", true),
-        binaryProviderGsProxyPort("binary.provider.gs.proxy.port", "gsProxyPort", -1),
-        binaryProviderGsProxyHost("binary.provider.gs.proxy.host", "gsProxyHost", null),
-
-        // Dynamic S3 Param
-        binaryProviderS3Param("binary.provider.s3.env", null, null),
-
-        // Dynamic GC Param
-        binaryProviderGCParam("binary.provider.gc.env", null, null),
-
-        // Eventually persisted binary provider
-        binaryProviderEventuallyPersistedMaxNumberOfTreads(
-                "binary.provider.eventually.persisted.max.number.of.threads", "numberOfThreads", 5),
-        binaryProviderEventuallyPersistedTimeOut("binary.provider.eventually.persisted.timeout", "timeout", 120000),
-        binaryProviderEventuallyPersistedDispatcherSleepTime(
-                "binary.provider.eventually.dispatcher.sleep.time", "dispatcherInterval", 5000), // in millis
-        binaryProviderEventuallyPersistedWaitHazelcastTime(
-                "binary.provider.eventually.persisted.wait.hazelcast.time", "hazelcastWaitingTime", 5000), // in millis
-        binaryProviderEventuallyPersistedQueueSize(
-                "binary.provider.eventually.persisted.queue.size", "queueSize", 64);
-
-        private final String key;
-        private final Object defaultValue;
-        private final String signature;
-
-        Key() {
-            this.key = name();
-            this.defaultValue = null;
-            this.signature = null;
-        }
-
-        Key(String key, String signature, Object defaultValue) {
-            this.key = key;
-            this.signature = signature;
-            this.defaultValue = defaultValue;
-        }
-
-        public String key() {
-            return key;
-        }
-
-        public Object getDefaultValue() {
-            return defaultValue;
-        }
-
-        public boolean isBinaryProviderField() {
-            return !(this.equals(username) || this.equals(password) || this.equals(type) || this.equals(url) ||
-                    this.equals(driver) || this.equals(maxActiveConnections) || this.equals(maxIdleConnections)
-                    || this.equals(binaryProviderS3Param) || this.equals(binaryProviderGCParam));
-        }
-    }
-
-    public enum BinaryProviderType {
-        filesystem, // binaries are stored in the filesystem
-        fullDb,     // binaries are stored as blobs in the db, filesystem is used for caching unless cache size is 0
-        cachedFS,   // binaries are stored in the filesystem, but a front cache (faster access) is added
-        S3,         // binaries are stored in S3 JClouds API
-        S3Old,        // binaries are stored in S3 Jets3t API
-        goog        // binaries are stored in S3 Jets3t API
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/storage/StorageService.java b/base/common/src/main/java/org/artifactory/storage/StorageService.java
deleted file mode 100644
index a4f1cbf..0000000
--- a/base/common/src/main/java/org/artifactory/storage/StorageService.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.storage.StorageQuotaInfo;
-import org.jfrog.storage.binstore.ifc.model.BinaryTreeElement;
-
-import java.util.Map;
-
-/**
- * @author yoavl
- */
-public interface StorageService {
-
-    void compress(BasicStatusHolder statusHolder);
-
-    boolean isDerbyUsed();
-
-    void logStorageSizes();
-
-    /**
-     * Check that manual garbage collection can be run, and then activate the double GC asynchronously.
-     */
-    void callManualGarbageCollect(BasicStatusHolder statusHolder);
-
-    void pruneUnreferencedFileInDataStore(BasicStatusHolder statusHolder);
-
-    void ping();
-
-
-    BinaryTreeElement<Map<String, String>> getBinaryProviderInfo();
-
-    /**
-     * Create and retrieve a storage quota info object which contains information about
-     * the system storage total space, free space etc.
-     *
-     * @param fileContentLength The uploaded file content length to include in the quota calculation
-     * @return The {@link org.artifactory.api.storage.StorageQuotaInfo} object, might return null if quota management doesn't exist inside
-     * the central config or it is disabled.
-     */
-    StorageQuotaInfo getStorageQuotaInfo(long fileContentLength);
-
-    /**
-     * Creates a summary of artifacts storage, including number of items and size per repository.
-     */
-    StorageSummaryInfo getStorageSummaryInfo();
-
-    /**
-     * Force optimization once even if there is no need for optimization (For immigration).
-     */
-    void forceOptimizationOnce();
-
-    /**
-     * Creates a summary of the filestore storage used by Artifactory.
-     *
-     * @return a filestore usage summary
-     */
-    FileStoreStorageSummary getFileStoreStorageSummary();
-}
diff --git a/base/common/src/main/java/org/artifactory/storage/StorageSummary.java b/base/common/src/main/java/org/artifactory/storage/StorageSummary.java
deleted file mode 100644
index ee66b0a..0000000
--- a/base/common/src/main/java/org/artifactory/storage/StorageSummary.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.storage;
-
-import java.util.List;
-
-/**
- * Represents Storage usage summary
- *
- * @author Michael Pasternak
- */
-public interface StorageSummary {
-    public BinariesSummary getBinariesSummary();
-
-    public void setBinariesSummary(BinariesSummary binariesSummary);
-
-    public FileStoreSummary getFileStoreSummary();
-
-    public void setFileStoreSummary(FileStoreSummary fileStoreSummary);
-
-    public List<RepositorySummary> getRepositoriesSummaryList();
-
-    public void setRepositoriesSummaryList(List<RepositorySummary> repositoriesSummaryList);
-}
diff --git a/base/common/src/main/java/org/artifactory/storage/StorageSummaryImpl.java b/base/common/src/main/java/org/artifactory/storage/StorageSummaryImpl.java
deleted file mode 100644
index 0bbe8da..0000000
--- a/base/common/src/main/java/org/artifactory/storage/StorageSummaryImpl.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.storage;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.storage.RepoStorageSummaryInfo;
-import org.artifactory.api.storage.StorageUnit;
-import org.artifactory.util.NumberFormatter;
-
-import javax.xml.bind.annotation.XmlRootElement;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * This class represents StorageSummary
- *
- * @author Michael Pasternak
- */
- at XmlRootElement(name = "storage")
-public class StorageSummaryImpl implements StorageSummary {
-
-    private BinariesSummary binariesSummary;
-    private FileStoreSummary fileStoreSummary;
-    private List<RepositorySummary> repositoriesSummaryList;
-
-    /**
-     * serialization .ctr
-     */
-    public StorageSummaryImpl() {
-    }
-
-    /**
-     * Creates {@link StorageSummaryImpl} from {@link StorageSummaryInfo}
-     *
-     * @param storageSummaryInfo
-     */
-    public StorageSummaryImpl(StorageSummaryInfo storageSummaryInfo) {
-        // update binaries summary
-        updateBinariesSummary(storageSummaryInfo, this);
-        // update file store summary
-        updateFileStoreSummary(this);
-        // update repositorySummary
-        updateRepositorySummary(storageSummaryInfo, this);
-    }
-
-    public BinariesSummary getBinariesSummary() {
-        return binariesSummary;
-    }
-
-    public void setBinariesSummary(BinariesSummary binariesSummary) {
-        this.binariesSummary = binariesSummary;
-    }
-
-    public FileStoreSummary getFileStoreSummary() {
-        return fileStoreSummary;
-    }
-
-    public void setFileStoreSummary(FileStoreSummary fileStoreSummary) {
-        this.fileStoreSummary = fileStoreSummary;
-    }
-
-    public List<RepositorySummary> getRepositoriesSummaryList() {
-        return repositoriesSummaryList;
-    }
-
-    public void setRepositoriesSummaryList(List<RepositorySummary> repositoriesSummaryList) {
-        this.repositoriesSummaryList = repositoriesSummaryList;
-    }
-
-    /**
-     * update repository summary
-     *
-     * @param storageSummaryInfo - summary info
-     */
-    private void updateRepositorySummary(StorageSummaryInfo storageSummaryInfo, StorageSummaryImpl storageSummaryModel) {
-        //populate repository info to list of models
-        List<RepositorySummary> repositorySummaryList = new ArrayList<>();
-        Set<RepoStorageSummaryInfo> repoStorageSummaries = storageSummaryInfo.getRepoStorageSummaries();
-        repoStorageSummaries.forEach(repoStorageSummary -> repositorySummaryList.add(
-                new RepositorySummary(repoStorageSummary, storageSummaryInfo.getTotalSize())));
-        // update total data
-        updateTotalRepositoryData(storageSummaryInfo, repositorySummaryList);
-        storageSummaryModel.setRepositoriesSummaryList(repositorySummaryList);
-    }
-
-    /**
-     * update total repository data
-     *
-     * @param storageSummaryInfo    - storage info data
-     * @param repositorySummaryList - list of storage repository models
-     */
-    private void updateTotalRepositoryData(StorageSummaryInfo storageSummaryInfo,
-            List<RepositorySummary> repositorySummaryList) {
-        RepositorySummary repositorySummary = new RepositorySummary();
-        repositorySummary.setRepoKey("TOTAL");
-        repositorySummary.setRepoType(RepoStorageSummaryInfo.RepositoryType.NA);
-        repositorySummary.setFoldersCount(storageSummaryInfo.getTotalFolders());
-        repositorySummary.setFilesCount(storageSummaryInfo.getTotalFiles());
-        repositorySummary.setUsedSpace(StorageUnit.toReadableString(storageSummaryInfo.getTotalSize()));
-        repositorySummary.setItemsCount(storageSummaryInfo.getTotalItems());
-        repositorySummaryList.add(repositorySummary);
-    }
-
-    /**
-     * update storage summary with binaries repositories
-     *
-     * @param storageSummaryModel - storageSummary Model
-     */
-    private void updateFileStoreSummary(StorageSummaryImpl storageSummaryModel) {
-
-        StorageService storageService = ContextHelper.get().beanForType(StorageService.class);
-
-        FileStoreStorageSummary fileStoreSummaryInfo = storageService.getFileStoreStorageSummary();
-        FileStoreSummary fileStoreSummary = new FileStoreSummary();
-        fileStoreSummary.setStorageType(fileStoreSummaryInfo.getBinariesStorageType().toString());
-        List<File> binariesFolders = fileStoreSummaryInfo.getBinariesFolders();
-        String storageDirLabel = "Filesystem storage is not used";
-        if (binariesFolders != null && !binariesFolders.isEmpty()) {
-            storageDirLabel = String.join(", ",
-                    binariesFolders.stream().map(File::getAbsolutePath).collect(Collectors.toList()));
-        }
-        fileStoreSummary.setStorageDirectory(storageDirLabel);
-        fileStoreSummary.setTotalSpace(StorageUnit.toReadableString(fileStoreSummaryInfo.getTotalSpace()));
-        fileStoreSummary.setUsedSpace(
-                StorageUnit.toReadableString(fileStoreSummaryInfo.getUsedSpace()) + " (" +
-                        NumberFormatter.formatPercentage(fileStoreSummaryInfo.getUsedSpaceFraction()) + ")");
-        fileStoreSummary.setFreeSpace(
-                StorageUnit.toReadableString(fileStoreSummaryInfo.getFreeSpace()) + " (" +
-                        NumberFormatter.formatPercentage(fileStoreSummaryInfo.getFreeSpaceFraction()) + ")");
-        storageSummaryModel.setFileStoreSummary(fileStoreSummary);
-    }
-
-    /**
-     * update storage summary with binaries repositories
-     *
-     * @param storageSummaryInfo - storage info
-     * @param storageSummaryModel     - storageSummary Model
-     */
-    private void updateBinariesSummary(StorageSummaryInfo storageSummaryInfo, StorageSummaryImpl storageSummaryModel) {
-        BinariesSummary binariesSummary = new BinariesSummary();
-        binariesSummary.setBinariesCount(NumberFormatter.formatLong(
-                storageSummaryInfo.getBinariesInfo().getBinariesCount()));
-
-        binariesSummary.setBinariesSize(StorageUnit.toReadableString(
-                storageSummaryInfo.getBinariesInfo().getBinariesSize()));
-
-        binariesSummary.setOptimization(NumberFormatter.formatPercentage(storageSummaryInfo.getOptimization()));
-        binariesSummary.setArtifactsSize(StorageUnit.toReadableString(storageSummaryInfo.getTotalSize()));
-        binariesSummary.setItemsCount(NumberFormatter.formatLong((storageSummaryInfo.getTotalItems())));
-        binariesSummary.setArtifactsCount(NumberFormatter.formatLong((storageSummaryInfo.getTotalFiles())));
-
-        storageSummaryModel.setBinariesSummary(binariesSummary);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/storage/StorageSummaryInfo.java b/base/common/src/main/java/org/artifactory/storage/StorageSummaryInfo.java
deleted file mode 100644
index 96afd36..0000000
--- a/base/common/src/main/java/org/artifactory/storage/StorageSummaryInfo.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage;
-
-import org.artifactory.api.repo.storage.RepoStorageSummaryInfo;
-import org.artifactory.api.storage.BinariesInfo;
-
-import java.io.Serializable;
-import java.util.Set;
-
-/**
- * Holds summary about the storage used by the various repositories.
- *
- * @author Yossi Shaul
- */
-public class StorageSummaryInfo implements Serializable {
-
-    private final Set<RepoStorageSummaryInfo> repoStorageSummaries;
-    private final BinariesInfo binariesInfo;
-    private long totalSize;
-    private long totalFolders;
-    private long totalFiles;
-
-    public StorageSummaryInfo(Set<RepoStorageSummaryInfo> repoStorageSummaries, BinariesInfo binariesInfo) {
-        this.repoStorageSummaries = repoStorageSummaries;
-        this.binariesInfo = binariesInfo;
-        for (RepoStorageSummaryInfo s : repoStorageSummaries) {
-            totalFolders += s.getFoldersCount();
-            totalFiles += s.getFilesCount();
-            totalSize += s.getUsedSpace();
-        }
-    }
-
-    public Set<RepoStorageSummaryInfo> getRepoStorageSummaries() {
-        return repoStorageSummaries;
-    }
-
-    /**
-     * @return Total size, in bytes, of all the stored files in Artifactory. This is the non-checksum optimized storage
-     * but can still be smaller than the binary store until storage GC is executed.
-     */
-    public long getTotalSize() {
-        return totalSize;
-    }
-
-    /**
-     * @return Number of folders stored in Artifactory (excluding repository root folders)
-     */
-    public long getTotalFolders() {
-        return totalFolders;
-    }
-
-    /**
-     * @return Number of files stored in Artifactory
-     */
-    public long getTotalFiles() {
-        return totalFiles;
-    }
-
-    /**
-     * @return Number of files and folder stored in Artifactory
-     */
-    public long getTotalItems() {
-        return totalFolders + totalFiles;
-    }
-
-    /**
-     * @return Returns the information about the binaries stored in Artifactory
-     */
-    public BinariesInfo getBinariesInfo() {
-        return binariesInfo;
-    }
-
-    public double getOptimization() {
-        double ratio = binariesInfo.getBinariesSize() / new Double(totalSize);
-        return ratio;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/storage/db/DbType.java b/base/common/src/main/java/org/artifactory/storage/db/DbType.java
deleted file mode 100644
index 11fbd72..0000000
--- a/base/common/src/main/java/org/artifactory/storage/db/DbType.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db;
-
-/**
- * Enumeration of the supported database types.
- *
- * @author Yossi Shaul
- */
-public enum DbType {
-
-    DERBY, MYSQL, ORACLE, MSSQL, POSTGRESQL;
-
-    public static DbType parse(String dbName) {
-        for (DbType dbType : values()) {
-            if (dbType.toString().equalsIgnoreCase(dbName)) {
-                return dbType;
-            }
-        }
-        throw new IllegalArgumentException("Couldn't find db type matching the name '" + dbName + "'");
-    }
-
-
-    @Override
-    public String toString() {
-        return name().toLowerCase();
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/storage/db/properties/model/DbProperties.java b/base/common/src/main/java/org/artifactory/storage/db/properties/model/DbProperties.java
deleted file mode 100644
index dbb934b..0000000
--- a/base/common/src/main/java/org/artifactory/storage/db/properties/model/DbProperties.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.artifactory.storage.db.properties.model;
-
-import org.apache.commons.lang.StringUtils;
-
-/**
- * Version and state of the database
- * <p/>
- * Date: 7/10/13 3:02 PM
- *
- * @author freds
- */
-public class DbProperties {
-    private final long installationDate;
-    private final String artifactoryVersion;
-    private final int artifactoryRevision;
-    private final long artifactoryRelease;
-
-    public DbProperties(long installationDate, String artifactoryVersion, int artifactoryRevision,
-            long artifactoryRelease) {
-        if (installationDate <= 0L) {
-            throw new IllegalArgumentException("Installation date cannot be zero or negative!");
-        }
-        if (StringUtils.isBlank(artifactoryVersion)) {
-            throw new IllegalArgumentException(
-                    "Artifactory version and Artifactory running mode cannot be empty or null!");
-        }
-        this.installationDate = installationDate;
-        this.artifactoryVersion = artifactoryVersion;
-        this.artifactoryRevision = artifactoryRevision;
-        this.artifactoryRelease = artifactoryRelease;
-    }
-
-    public long getInstallationDate() {
-        return installationDate;
-    }
-
-    public String getArtifactoryVersion() {
-        return artifactoryVersion;
-    }
-
-    public int getArtifactoryRevision() {
-        return artifactoryRevision;
-    }
-
-    public long getArtifactoryRelease() {
-        return artifactoryRelease;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/storage/db/properties/service/ArtifactoryCommonDbPropertiesService.java b/base/common/src/main/java/org/artifactory/storage/db/properties/service/ArtifactoryCommonDbPropertiesService.java
deleted file mode 100644
index 44eaeb8..0000000
--- a/base/common/src/main/java/org/artifactory/storage/db/properties/service/ArtifactoryCommonDbPropertiesService.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.properties.service;
-
-import org.artifactory.storage.db.properties.model.DbProperties;
-import org.springframework.stereotype.Service;
-
-/**
- * @author Gidi Shabat
- */
- at Service
-public interface ArtifactoryCommonDbPropertiesService {
-    void updateDbProperties(DbProperties dbProperties);
-
-    DbProperties getDbProperties();
-
-    boolean isDbPropertiesTableExists();
-}
diff --git a/base/common/src/main/java/org/artifactory/storage/db/servers/model/ArtifactoryServer.java b/base/common/src/main/java/org/artifactory/storage/db/servers/model/ArtifactoryServer.java
deleted file mode 100644
index bfd5c5f..0000000
--- a/base/common/src/main/java/org/artifactory/storage/db/servers/model/ArtifactoryServer.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.servers.model;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.ArtifactoryRunningMode;
-import org.artifactory.state.ArtifactoryServerState;
-
-import javax.annotation.Nonnull;
-import java.io.Serializable;
-
-/**
- * Represents an Artifactory server in cluster configuration.
- *
- * @author Yossi Shaul
- */
-public class ArtifactoryServer implements Serializable {
-    private final String serverId;
-    private final long startTime;
-    private final String contextUrl;
-    private final int membershipPort;
-    private final ArtifactoryServerState serverState;
-    private final ArtifactoryServerRole serverRole;
-    private final long lastHeartbeat;
-    private final String artifactoryVersion;
-    private final int artifactoryRevision;
-    private final long artifactoryRelease;
-    private final String licenseKeyHash;
-    private final ArtifactoryRunningMode artifactoryRunningMode;
-
-    public ArtifactoryServer(String serverId, long startTime, String contextUrl, int membershipPort,
-            ArtifactoryServerState serverState, ArtifactoryServerRole serverRole, long lastHeartbeat,
-            String artifactoryVersion, int artifactoryRevision, long artifactoryRelease,
-            ArtifactoryRunningMode artifactoryRunningMode, String licenseKeyHash) {
-
-        if (StringUtils.isBlank(serverId)) {
-            throw new IllegalArgumentException("Artifactory serverId cannot be empty or null!");
-        }
-        if (startTime <= 0L) {
-            throw new IllegalArgumentException("Artifactory server start time cannot be zero or negative!");
-        }
-        if (serverState == null || serverRole == null) {
-            throw new IllegalArgumentException("Artifactory server state and role cannot be null!");
-        }
-        if (StringUtils.isBlank(licenseKeyHash)) {
-            throw new IllegalArgumentException("Artifactory licenseKeyHash cannot be empty or null!");
-        }
-        if (artifactoryRunningMode == null) {
-            throw new IllegalArgumentException("Artifactory artifactoryRunningMode cannot be null!");
-        }
-        this.licenseKeyHash = licenseKeyHash;
-        this.serverId = serverId.trim();
-        this.startTime = startTime;
-        this.contextUrl = contextUrl;
-        this.membershipPort = membershipPort;
-        this.serverState = serverState;
-        this.serverRole = serverRole;
-        this.lastHeartbeat = lastHeartbeat;
-        this.artifactoryVersion = artifactoryVersion;
-        this.artifactoryRevision = artifactoryRevision;
-        this.artifactoryRelease = artifactoryRelease;
-        this.artifactoryRunningMode = artifactoryRunningMode;
-    }
-
-    @Nonnull
-    public String getServerId() {
-        return serverId;
-    }
-
-    public long getStartTime() {
-        return startTime;
-    }
-
-    public String getContextUrl() {
-        return contextUrl;
-    }
-
-    public int getMembershipPort() {
-        return membershipPort;
-    }
-
-    public ArtifactoryServerState getServerState() {
-        return serverState;
-    }
-
-    public ArtifactoryServerRole getServerRole() {
-        return serverRole;
-    }
-
-    public long getLastHeartbeat() {
-        return lastHeartbeat;
-    }
-
-    public String getArtifactoryVersion() {
-        return artifactoryVersion;
-    }
-
-    public int getArtifactoryRevision() {
-        return artifactoryRevision;
-    }
-
-    public long getArtifactoryRelease() {
-        return artifactoryRelease;
-    }
-
-    public String getLicenseKeyHash() {
-        return licenseKeyHash;
-    }
-
-    public ArtifactoryRunningMode getArtifactoryRunningMode() {
-        return artifactoryRunningMode;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        ArtifactoryServer that = (ArtifactoryServer) o;
-
-        if (!serverId.equals(that.serverId)) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return serverId.hashCode();
-    }
-
-    @Override
-    public String toString() {
-        return serverId;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/storage/db/servers/model/ArtifactoryServerRole.java b/base/common/src/main/java/org/artifactory/storage/db/servers/model/ArtifactoryServerRole.java
deleted file mode 100644
index bbd5d4f..0000000
--- a/base/common/src/main/java/org/artifactory/storage/db/servers/model/ArtifactoryServerRole.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.artifactory.storage.db.servers.model;
-
-import org.apache.commons.lang.StringUtils;
-
-/**
- * @author mamo, fsi
- */
-public enum ArtifactoryServerRole {
-
-    STANDALONE, PRIMARY, MEMBER, COPY;
-
-    public static ArtifactoryServerRole fromString(String val) {
-        if (StringUtils.isBlank(val)) {
-            return STANDALONE;
-        }
-        try {
-            return valueOf(val.toUpperCase());
-        } catch (IllegalArgumentException e) {
-            return STANDALONE;
-        }
-    }
-
-    public String getPrettyName() {
-        return StringUtils.capitalize(name().toLowerCase());
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/storage/db/servers/service/ArtifactoryHeartbeatService.java b/base/common/src/main/java/org/artifactory/storage/db/servers/service/ArtifactoryHeartbeatService.java
deleted file mode 100644
index 4e6aa8c..0000000
--- a/base/common/src/main/java/org/artifactory/storage/db/servers/service/ArtifactoryHeartbeatService.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.artifactory.storage.db.servers.service;
-
-import org.artifactory.spring.ReloadableBean;
-
-/**
- * author: gidis
- */
-public interface ArtifactoryHeartbeatService extends ReloadableBean {
-    void updateHeartbeat();
-}
diff --git a/base/common/src/main/java/org/artifactory/storage/db/servers/service/ArtifactoryServersCommonService.java b/base/common/src/main/java/org/artifactory/storage/db/servers/service/ArtifactoryServersCommonService.java
deleted file mode 100644
index 9634e77..0000000
--- a/base/common/src/main/java/org/artifactory/storage/db/servers/service/ArtifactoryServersCommonService.java
+++ /dev/null
@@ -1,134 +0,0 @@
-package org.artifactory.storage.db.servers.service;
-
-import com.google.common.base.Predicate;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.state.ArtifactoryServerState;
-import org.artifactory.storage.db.servers.model.ArtifactoryServer;
-import org.artifactory.storage.db.servers.model.ArtifactoryServerRole;
-
-import javax.annotation.Nullable;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-/**
- * author: gidis
- */
-public interface ArtifactoryServersCommonService {
-
-    /**
-     * Get the current running primary HA member
-     *
-     * @return {@link org.artifactory.storage.db.servers.model.ArtifactoryServer} if exists, otherwise null
-     */
-    @Nullable
-    ArtifactoryServer getRunningHaPrimary();
-
-    /**
-     * Get the current server
-     */
-    ArtifactoryServer getCurrentMember();
-
-    /**
-     * Get al the other active (state=STARTING,RUNNING,STOPPING) servers
-     */
-    List<ArtifactoryServer> getOtherActiveMembers();
-
-    /**
-     * Get al the other active (state=STARTING,RUNNING,STOPPING) servers
-     */
-    List<ArtifactoryServer> getActiveMembers();
-
-    /**
-     * Get al the other running HA(state=RUNNING and license=HA) servers
-     */
-    List<ArtifactoryServer> getOtherRunningHaMembers();
-
-    /**
-     * Gets Artifactory server from database by serverId
-     */
-    ArtifactoryServer getArtifactoryServer(String serverId);
-
-    /**
-     * Returns all the ArtifactoryServers from the database.
-     */
-    List<ArtifactoryServer> getAllArtifactoryServers();
-
-    void updateArtifactoryServerRole(String serverId, ArtifactoryServerRole newRole);
-
-    void updateArtifactoryJoinPort(String serverId, int port);
-
-    void updateArtifactoryServerState(ArtifactoryServer server, ArtifactoryServerState newState);
-
-    void createArtifactoryServer(ArtifactoryServer artifactoryServer);
-
-    void updateArtifactoryServer(ArtifactoryServer artifactoryServer);
-
-    boolean removeServer(String serverId);
-
-    void updateArtifactoryServerHeartbeat(String serverId, long heartBeat);
-
-    //predicates
-    //todo remove from here
-    public static final Predicate<ArtifactoryServer> isOther = new Predicate<ArtifactoryServer>() {
-        @Override
-        public boolean apply(ArtifactoryServer input) {
-            final String serverId = ContextHelper.get().getServerId();
-            return !input.getServerId().trim().equals(serverId);
-        }
-    };
-
-    public static final Predicate<ArtifactoryServer> isRunning = new Predicate<ArtifactoryServer>() {
-        @Override
-        public boolean apply(ArtifactoryServer server) {
-            return server.getServerState() == ArtifactoryServerState.RUNNING;
-        }
-    };
-
-    public static final Predicate<ArtifactoryServer> isStarting = new Predicate<ArtifactoryServer>() {
-        @Override
-        public boolean apply(ArtifactoryServer server) {
-            return server.getServerState() == ArtifactoryServerState.STARTING;
-        }
-    };
-
-    public static final Predicate<ArtifactoryServer> isStopping = new Predicate<ArtifactoryServer>() {
-        @Override
-        public boolean apply(ArtifactoryServer server) {
-            return server.getServerState() == ArtifactoryServerState.STOPPING;
-        }
-    };
-
-    public static final Predicate<ArtifactoryServer> isConverting = new Predicate<ArtifactoryServer>() {
-        @Override
-        public boolean apply(ArtifactoryServer server) {
-            return server.getServerState() == ArtifactoryServerState.CONVERTING;
-        }
-    };
-
-    public static final Predicate<ArtifactoryServer> hasHeartbeat = new Predicate<ArtifactoryServer>() {
-        @Override
-        public boolean apply(ArtifactoryServer server) {
-            long lastHeartbeatBeforeSecs = TimeUnit.MILLISECONDS.toSeconds(
-                    System.currentTimeMillis() - server.getLastHeartbeat());
-            return lastHeartbeatBeforeSecs <= ConstantValues.haHeartbeatStaleIntervalSecs.getInt();
-        }
-    };
-
-    public static final Predicate<ArtifactoryServer> validForRemoval = new Predicate<ArtifactoryServer>() {
-        @Override
-        public boolean apply(ArtifactoryServer server) {
-            long lastHeartbeatBeforeSecs = TimeUnit.MILLISECONDS.toSeconds(
-                    System.currentTimeMillis() - server.getLastHeartbeat());
-            return lastHeartbeatBeforeSecs >= (ConstantValues.haHeartbeatStaleIntervalSecs.getInt() * 5);
-        }
-    };
-
-    public static final Predicate<ArtifactoryServer> isPrimary = new Predicate<ArtifactoryServer>() {
-        @Override
-        public boolean apply(ArtifactoryServer server) {
-            return server.getServerRole() == ArtifactoryServerRole.PRIMARY;
-        }
-    };
-}
-
diff --git a/base/common/src/main/java/org/artifactory/util/ArchiveUtils.java b/base/common/src/main/java/org/artifactory/util/ArchiveUtils.java
deleted file mode 100644
index 94b92d4..0000000
--- a/base/common/src/main/java/org/artifactory/util/ArchiveUtils.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import org.apache.commons.compress.archivers.ArchiveEntry;
-import org.apache.commons.compress.archivers.ArchiveOutputStream;
-import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
-import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
-import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
-import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
-import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
-import org.apache.commons.io.FilenameUtils;
-import org.apache.commons.io.IOUtils;
-import org.artifactory.api.archive.ArchiveType;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Collection;
-
-/**
- * A utility class to help create archives for the supported {@link org.artifactory.api.archive.ArchiveType}s.
- *
- * @author Shay Yaakov
- */
-public abstract class ArchiveUtils {
-    private static final Logger log = LoggerFactory.getLogger(ArchiveUtils.class);
-
-    /**
-     * Archives the contents of the given directory into the given archive using the apache commons compress tools
-     *
-     * @param sourceDirectory    Directory to archive
-     * @param destinationArchive Archive file to create
-     * @param recurse            True if should recurse file scan of source directory. False if not
-     * @param archiveType        Archive type to create
-     * @throws java.io.IOException      Any exceptions that might occur while handling the given files and used streams
-     * @throws IllegalArgumentException Thrown when given invalid destinations
-     */
-    public static void archive(File sourceDirectory, File destinationArchive, boolean recurse, ArchiveType archiveType)
-            throws IOException {
-        if ((sourceDirectory == null) || (destinationArchive == null)) {
-            throw new IllegalArgumentException("Supplied destinations cannot be null.");
-        }
-        if (!sourceDirectory.isDirectory()) {
-            throw new IllegalArgumentException("Supplied source directory must be an existing directory.");
-        }
-        String sourcePath = sourceDirectory.getAbsolutePath();
-        String archivePath = destinationArchive.getAbsolutePath();
-        log.debug("Beginning to archive '{}' into '{}'", sourcePath, archivePath);
-        FileOutputStream destinationOutputStream = new FileOutputStream(destinationArchive);
-        ArchiveOutputStream archiveOutputStream = createArchiveOutputStream(
-                new BufferedOutputStream(destinationOutputStream), archiveType);
-        try {
-            @SuppressWarnings({"unchecked"})
-            Collection<File> childrenFiles = org.apache.commons.io.FileUtils.listFiles(sourceDirectory, null, recurse);
-            childrenFiles.remove(destinationArchive);
-
-            ArchiveEntry archiveEntry;
-            FileInputStream fileInputStream;
-            for (File childFile : childrenFiles) {
-                String childPath = childFile.getAbsolutePath();
-                String relativePath = childPath.substring((sourcePath.length() + 1), childPath.length());
-
-                /**
-                 * Need to convert separators to unix format since zipping on windows machines creates windows specific
-                 * FS file paths
-                 */
-                relativePath = FilenameUtils.separatorsToUnix(relativePath);
-                archiveEntry = createArchiveEntry(childFile, relativePath, archiveType);
-                fileInputStream = new FileInputStream(childFile);
-                archiveOutputStream.putArchiveEntry(archiveEntry);
-
-                try {
-                    IOUtils.copy(fileInputStream, archiveOutputStream);
-                } finally {
-                    IOUtils.closeQuietly(fileInputStream);
-                    archiveOutputStream.closeArchiveEntry();
-                }
-                log.debug("Archive '{}' into '{}'", childPath, archivePath);
-            }
-        } finally {
-            IOUtils.closeQuietly(archiveOutputStream);
-        }
-
-        log.debug("Completed archiving of '{}' into '{}'", sourcePath, archivePath);
-    }
-
-    public static ArchiveOutputStream createArchiveOutputStream(OutputStream outputStream, ArchiveType archiveType)
-            throws IOException {
-        ArchiveOutputStream result = null;
-        switch (archiveType) {
-            case ZIP:
-                result = new ZipArchiveOutputStream(outputStream);
-                break;
-            case TAR:
-                result = new TarArchiveOutputStream(outputStream);
-                ((TarArchiveOutputStream) result).setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU);
-                break;
-            case TARGZ:
-                result = new TarArchiveOutputStream(new GzipCompressorOutputStream(outputStream));
-                ((TarArchiveOutputStream) result).setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU);
-                break;
-            case TGZ:
-                result = new TarArchiveOutputStream(new GzipCompressorOutputStream(outputStream));
-                ((TarArchiveOutputStream) result).setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU);
-                break;
-        }
-
-        if (result == null) {
-            throw new IllegalArgumentException("Unsupported archive type: '" + archiveType + "'");
-        }
-
-        return result;
-    }
-
-    /**
-     * Use for writing streams - must specify file size in advance as well
-     */
-    public static ArchiveEntry createArchiveEntry(String relativePath, ArchiveType archiveType, long size) {
-        switch (archiveType) {
-            case ZIP:
-                ZipArchiveEntry zipEntry = new ZipArchiveEntry(relativePath);
-                zipEntry.setSize(size);
-                return zipEntry;
-            case TAR:
-            case TARGZ:
-            case TGZ:
-                TarArchiveEntry tarEntry = new TarArchiveEntry(relativePath);
-                tarEntry.setSize(size);
-                return tarEntry;
-        }
-        throw new IllegalArgumentException("Unsupported archive type: '" + archiveType + "'");
-    }
-
-    private static ArchiveEntry createArchiveEntry(File file, String relativePath, ArchiveType archiveType) {
-        switch (archiveType) {
-            case ZIP:
-                return new ZipArchiveEntry(file, relativePath);
-            case TAR:
-                return new TarArchiveEntry(file, relativePath);
-            case TARGZ:
-                return new TarArchiveEntry(file, relativePath);
-            case TGZ:
-                return new TarArchiveEntry(file, relativePath);
-        }
-
-        throw new IllegalArgumentException("Unsupported archive type: '" + archiveType + "'");
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/util/AutoTimeoutRegexCharSequence.java b/base/common/src/main/java/org/artifactory/util/AutoTimeoutRegexCharSequence.java
deleted file mode 100644
index 2eac150..0000000
--- a/base/common/src/main/java/org/artifactory/util/AutoTimeoutRegexCharSequence.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.artifactory.util;
-
-/**
- * A {@link CharSequence} that has the ability to abort an operation running on it (i.e. regex matching) after the
- * specified {@param timeoutMillis} has passed.
- *
- * @author Dan Feldman
- */
-public class AutoTimeoutRegexCharSequence implements CharSequence {
-
-    private final CharSequence inner;
-    private final int timeoutMillis;
-    private final long timeoutTime;
-    private final String stringToMatch;
-    private final String regexPattern;
-
-    public AutoTimeoutRegexCharSequence(CharSequence inner, String stringToMatch, String regexPattern, int timeoutMillis) {
-        super();
-        this.inner = inner;
-        this.timeoutMillis = timeoutMillis;
-        this.stringToMatch = stringToMatch;
-        this.regexPattern = regexPattern;
-        timeoutTime = System.currentTimeMillis() + timeoutMillis;
-    }
-
-    public char charAt(int index) {
-        //TODO [by dan]: currenTime is costly... can also count how many charAt calls were made but is should be something big
-        long currentTime = System.currentTimeMillis();
-        if (currentTime > timeoutTime) {
-            throw new RuntimeException("Timeout occurred after " + (currentTime - timeoutMillis) + " ms while " +
-                    "processing regex '" + regexPattern + "' on input '" + stringToMatch);
-        }
-        return inner.charAt(index);
-    }
-
-    public int length() {
-        return inner.length();
-    }
-
-    public CharSequence subSequence(int start, int end) {
-        return new AutoTimeoutRegexCharSequence(inner.subSequence(start, end), stringToMatch, regexPattern, timeoutMillis);
-    }
-
-    @Override
-    public String toString() {
-        return inner.toString();
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/util/CollectionUtils.java b/base/common/src/main/java/org/artifactory/util/CollectionUtils.java
deleted file mode 100644
index 08fde59..0000000
--- a/base/common/src/main/java/org/artifactory/util/CollectionUtils.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import javax.annotation.Nullable;
-import java.util.Collection;
-
-/**
- * General utils class.
- *
- * @author Yossi Shaul
- */
-public abstract class CollectionUtils {
-    private CollectionUtils() {
-        // utility class
-    }
-
-    /**
-     * @return  True if the input collection is null of empty
-     */
-    public static boolean isNullOrEmpty(@Nullable Collection c) {
-        return c == null || c.isEmpty();
-    }
-
-    /**
-     * @return  True if the input collection is not empty
-     */
-    public static boolean notNullOrEmpty(@Nullable Collection c) {
-        return !isNullOrEmpty(c);
-    }
-
-    /**
-     * @return  True if the input array is null of empty
-     */
-    public static <T> boolean isNullOrEmpty(@Nullable T[] a) {
-        return a == null || a.length == 0;
-    }
-
-}
diff --git a/base/common/src/main/java/org/artifactory/util/FileWatchDog.java b/base/common/src/main/java/org/artifactory/util/FileWatchDog.java
deleted file mode 100644
index d41b327..0000000
--- a/base/common/src/main/java/org/artifactory/util/FileWatchDog.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import java.io.File;
-
-/**
- * Check every now and then that a certain file has not changed. If it has, then call the {@link #doOnChange} method.
- * Based on the log4j FileWatchdog implementation.
- *
- * @author Yossi Shaul
- */
-public abstract class FileWatchDog extends Thread {
-    /**
-     * The default delay between every file modification check, set to 30 seconds.
-     */
-    public static final long DEFAULT_DELAY = 30000;
-
-    /**
-     * The delay to observe between every check. By default set {@link #DEFAULT_DELAY}.
-     */
-    protected long delay = DEFAULT_DELAY;
-
-    protected final File file;
-    private long lastChanged = 0;
-    private boolean warnedAlready = false;
-    private boolean interrupted = false;
-
-    /**
-     * Creates a new watch dog thread.
-     *
-     * @param file     The file to watch
-     * @param checkNow If true will check the file status before the constructor returns
-     */
-    protected FileWatchDog(File file, boolean checkNow) {
-        this.file = file;
-        setDaemon(true);
-        if (checkNow) {
-            checkAndConfigure();
-        } else {
-            lastChanged = System.currentTimeMillis();
-        }
-    }
-
-    /**
-     * Set the delay to observe between each check of the file changes.
-     */
-    public void setDelay(long delay) {
-        this.delay = delay;
-    }
-
-    protected abstract void doOnChange();
-
-    protected void checkAndConfigure() {
-        boolean fileExists;
-        try {
-            fileExists = file.exists();
-        } catch (SecurityException e) {
-            System.err.printf("Check for file existence - read denied, file: [%s].", file.getAbsolutePath());
-            interrupted = true;// there is no point in continuing
-            return;
-        }
-
-        if (fileExists) {
-            long l = file.lastModified();
-            if (l > lastChanged) {
-                lastChanged = l;
-                doOnChange();
-                warnedAlready = false;
-            }
-        } else {
-            if (!warnedAlready) {
-                System.err.printf("[%s] does not exist.", file.getAbsolutePath());
-                warnedAlready = true;
-            }
-        }
-    }
-
-    @Override
-    public void run() {
-        while (!interrupted) {
-            try {
-                sleep(delay);
-            } catch (InterruptedException e) {
-                interrupted = true;
-            }
-            checkAndConfigure();
-        }
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/util/GlobalExcludes.java b/base/common/src/main/java/org/artifactory/util/GlobalExcludes.java
deleted file mode 100644
index 5babdc2..0000000
--- a/base/common/src/main/java/org/artifactory/util/GlobalExcludes.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import com.google.common.collect.Lists;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.util.AntPathMatcher;
-
-import javax.annotation.Nullable;
-import java.io.File;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * An adapter from file to  Ant-based path matcher util class.
- *
- * @author Gidi Shabat
- */
-public abstract class GlobalExcludes {
-    private static final Logger log = LoggerFactory.getLogger(PathMatcher.class);
-
-    private static final AntPathMatcher antPathMatcher = new AntPathMatcher();
-
-    /**
-     * Default global exclude patterns. Will be used if not configured by the user.
-     */
-    private static final List<String> DEFAULT_GLOBAL_EXCLUDES = Lists.newArrayList(
-            "**/*~",
-            "**/#*#",
-            "**/.#*",
-            "**/%*%",
-            "**/._*",
-            "**/CVS",
-            "**/CVS/**",
-            "**/.cvsignore",
-            "**/SCCS",
-            "**/SCCS/**",
-            "**/vssver.scc",
-            "**/.svn",
-            "**/.svn/**",
-            "**/.DS_Store");
-
-    /**
-     * The global excludes that applies to all repositories. Configurable by the user with {@link
-     * org.artifactory.common.ConstantValues#globalExcludes}.
-     */
-    private static List<String> GLOBAL_EXCLUDES;
-
-    private GlobalExcludes() {
-        // utility class
-    }
-
-    public static boolean isInGlobalExcludes(File file) {
-        // global excludes are used as includes to test if path is in the default excludes
-        // Always behave as file to force full match.
-        return PathMatcher.matches(cleanPath(file), initOrGetGlobalExcludes(), null, false);
-    }
-
-    public static boolean matches(File file, @Nullable Collection<String> includes,
-            @Nullable Collection<String> excludes) {
-        return PathMatcher.matches(cleanPath(file), includes, excludes, false);
-    }
-
-
-    private static List<String> initOrGetGlobalExcludes() {
-        if (GLOBAL_EXCLUDES == null) {
-            try {
-                String defaultExcludes = ArtifactoryHome.get().getArtifactoryProperties().getProperty(
-                        ConstantValues.globalExcludes);
-                if (defaultExcludes == null) {
-                    GLOBAL_EXCLUDES = DEFAULT_GLOBAL_EXCLUDES;
-                } else {
-                    GLOBAL_EXCLUDES = Arrays.asList(defaultExcludes.split(","));
-                }
-            } catch (Exception e) {
-                log.error("Failed to parse global default excludes. Using default values: " + e.getMessage());
-                GLOBAL_EXCLUDES = DEFAULT_GLOBAL_EXCLUDES;
-            }
-        }
-        return GLOBAL_EXCLUDES;
-    }
-
-    public static String cleanPath(File file) {
-        String path = file.getAbsolutePath();
-        path = path.replace('\\', '/');
-        if (path.startsWith("/") && path.length() > 1) {
-            return path.substring(1);
-        }
-        return path;
-    }
-
-    public static List<String> getGlobalExcludes() {
-        return Lists.newArrayList(initOrGetGlobalExcludes());
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/util/HttpClientConfigurator.java b/base/common/src/main/java/org/artifactory/util/HttpClientConfigurator.java
deleted file mode 100644
index 27a3368..0000000
--- a/base/common/src/main/java/org/artifactory/util/HttpClientConfigurator.java
+++ /dev/null
@@ -1,589 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.*;
-import org.apache.http.auth.*;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.client.config.AuthSchemes;
-import org.apache.http.client.config.CookieSpecs;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.config.Registry;
-import org.apache.http.config.RegistryBuilder;
-import org.apache.http.conn.ConnectionKeepAliveStrategy;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.conn.socket.ConnectionSocketFactory;
-import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
-import org.apache.http.conn.socket.PlainConnectionSocketFactory;
-import org.apache.http.conn.ssl.DefaultHostnameVerifier;
-import org.apache.http.conn.ssl.NoopHostnameVerifier;
-import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
-import org.apache.http.impl.auth.BasicSchemeFactory;
-import org.apache.http.impl.auth.SPNegoSchemeFactory;
-import org.apache.http.impl.client.*;
-import org.apache.http.impl.conn.DefaultRoutePlanner;
-import org.apache.http.impl.conn.DefaultSchemePortResolver;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-import org.apache.http.message.BasicHeaderElementIterator;
-import org.apache.http.protocol.HTTP;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.ssl.SSLContexts;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.repo.http.CloseableHttpClientDecorator;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.util.bearer.BearerSchemeFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nullable;
-import javax.net.ssl.SSLContext;
-import java.io.File;
-import java.net.InetAddress;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.UnknownHostException;
-import java.security.Principal;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Builder for HTTP client.
- *
- * @author Yossi Shaul
- */
-public class HttpClientConfigurator {
-    private static final Logger log = LoggerFactory.getLogger(HttpClientConfigurator.class);
-
-    // in httpclient 4.4 handling of stale connections was changed,
-    // previously, the code would check every connection by default before re-using it.
-    // The code now only checks connection if the elapsed time since the last use of
-    // the connection exceeds the timeout that has been set
-    private static final int INACTIVITY_TIMEOUT = 500;
-    private static final int DEFAULT_PORT = 80;
-    // max connections for localhost:80
-    private static final String LOCALHOST = "localhost";
-    private static final int MAX_CONNECTIONS_PER_HOST = 50;
-
-
-    private HttpClientBuilder builder = HttpClients.custom();
-    private RequestConfig.Builder config = RequestConfig.custom();
-    private String host;
-    private BasicCredentialsProvider credsProvider;
-    private boolean explicitCookieSupport;
-
-    private String keyStoreLocation;
-    private char[] keyStorePassword;
-    private boolean trustSelfSignCert;
-    private boolean noHostVerification;
-    private boolean allowAnyHostAuth;
-    private String proxyHost;
-    private String repoKey;
-    private AuthScheme chosenAuthScheme = AuthScheme.BASIC; //Signifies what auth scheme will be used by the client
-
-    public HttpClientConfigurator() {
-        builder.setUserAgent(HttpUtils.getArtifactoryUserAgent());
-        credsProvider = new BasicCredentialsProvider();
-        handleGzipResponse(ConstantValues.httpAcceptEncodingGzip.getBoolean());
-        config.setMaxRedirects(20);
-        config.setCircularRedirectsAllowed(true);
-    }
-
-    public CloseableHttpClient getClient() {
-        if (!explicitCookieSupport && !ConstantValues.enableCookieManagement.getBoolean()) {
-            builder.disableCookieManagement();
-        }
-        additionalConfigByAuthScheme();
-        if (hasCredentials()) {
-            builder.setDefaultCredentialsProvider(credsProvider);
-        }
-        builder.setDefaultRequestConfig(config.build());
-
-        /**
-         * Connection management
-         */
-        builder.setKeepAliveStrategy(getConnectionKeepAliveStrategy());
-        PoolingHttpClientConnectionManager connectionMgr = createConnectionMgr();
-        builder.setConnectionManager(connectionMgr);
-        return new CloseableHttpClientDecorator(builder.build(), connectionMgr, chosenAuthScheme == AuthScheme.SPNEGO);
-    }
-
-    /**
-     * Creates custom Http Client connection pool to be used by Http Client
-     *
-     * @return {@link PoolingHttpClientConnectionManager}
-     */
-    private PoolingHttpClientConnectionManager createConnectionMgr() {
-
-        PoolingHttpClientConnectionManager connectionMgr;
-
-        // prepare SSLContext
-        if (!Strings.isNullOrEmpty(keyStoreLocation) && keyStorePassword != null) {
-            ConnectionSocketFactory plainsf = PlainConnectionSocketFactory.getSocketFactory();
-            SSLContext sslContext = null;
-            if (trustSelfSignCert) {
-                // Self signed cert. support
-                try {
-                    sslContext = SSLContexts.custom()
-                            .loadTrustMaterial(TrustSelfSignedStrategy.INSTANCE)
-                            .loadTrustMaterial(new File(keyStoreLocation), keyStorePassword)
-                            .build();
-                } catch (Exception e) {
-                    log.error("SSLContexts initiation has failed, " + e.getMessage());
-                }
-            } else {
-                try {
-                    sslContext = SSLContexts.custom()
-                            .loadTrustMaterial(new File(this.keyStoreLocation), keyStorePassword)
-                            .build();
-                } catch (Exception e) {
-                    log.error("SSLContexts initiation has failed, " + e.getMessage());
-                }
-            }
-
-            // we allow to disable host name verification against CA certificate,
-            // notice: in general this is insecure and should be avoided in production,
-            // (this type of configuration is useful for development purposes)
-            LayeredConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
-                    sslContext,
-                    noHostVerification ? NoopHostnameVerifier.INSTANCE : new DefaultHostnameVerifier()
-                    // todo: michaelp implement PublicSuffixMatcherLoader support (if needed)
-            );
-
-            Registry<ConnectionSocketFactory> r = RegistryBuilder.<ConnectionSocketFactory>create()
-                    .register("http", plainsf)
-                    .register("https", sslsf)
-                    .build();
-            connectionMgr = new PoolingHttpClientConnectionManager(r);
-            // todo: support INACTIVITY_TIMEOUT & TimeUnit.MILLISECONDS
-        } else {
-            connectionMgr = new PoolingHttpClientConnectionManager(INACTIVITY_TIMEOUT, TimeUnit.MILLISECONDS);
-        }
-
-        connectionMgr.setMaxTotal(ConstantValues.httpClientMaxTotalConnections.getInt());
-        connectionMgr.setDefaultMaxPerRoute(MAX_CONNECTIONS_PER_HOST);
-        HttpHost localhost = new HttpHost(LOCALHOST, DEFAULT_PORT);
-        connectionMgr.setMaxPerRoute(new HttpRoute(localhost), ConstantValues.httpClientMaxConnectionsPerRoute.getInt());
-        return connectionMgr;
-    }
-
-    /**
-     * Produces a {@link ConnectionKeepAliveStrategy}
-     *
-     * @return keep-alive strategy to be used for connection pool
-     */
-    private ConnectionKeepAliveStrategy getConnectionKeepAliveStrategy() {
-        return new ConnectionKeepAliveStrategy() {
-            @Override
-            public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
-                // Honor 'keep-alive' header
-                HeaderElementIterator it = new BasicHeaderElementIterator(
-                        response.headerIterator(HTTP.CONN_KEEP_ALIVE));
-                while (it.hasNext()) {
-                    HeaderElement he = it.nextElement();
-                    String param = he.getName();
-                    String value = he.getValue();
-                    if (value != null && param.equalsIgnoreCase("timeout")) {
-                        try {
-                            return Long.parseLong(value) * 1000;
-                        } catch (NumberFormatException ignore) {
-                        }
-                    }
-                }
-                return 30 * 1000;
-            }
-        };
-    }
-
-    /**
-     * Disable the automatic gzip compression on read.
-     * Once disabled cannot be activated.
-     */
-    public HttpClientConfigurator handleGzipResponse(boolean handleGzipResponse) {
-        if (!handleGzipResponse) {
-            builder.disableContentCompression();
-        }
-        return this;
-    }
-
-    /**
-     * May throw a runtime exception when the given URL is invalid.
-     */
-    public HttpClientConfigurator hostFromUrl(String urlStr) {
-        if (StringUtils.isNotBlank(urlStr)) {
-            try {
-                URL url = new URL(urlStr);
-                host(url.getHost());
-            } catch (MalformedURLException e) {
-                throw new IllegalArgumentException("Cannot parse the url " + urlStr, e);
-            }
-        }
-        return this;
-    }
-
-    /**
-     * Ignores blank values
-     */
-    public HttpClientConfigurator host(String host) {
-        if (StringUtils.isNotBlank(host)) {
-            this.host = host;
-            builder.setRoutePlanner(new DefaultHostRoutePlanner(host));
-        }
-        return this;
-    }
-
-    public HttpClientConfigurator defaultMaxConnectionsPerHost(int maxConnectionsPerHost) {
-        builder.setMaxConnPerRoute(maxConnectionsPerHost);
-        return this;
-    }
-
-    public HttpClientConfigurator maxTotalConnections(int maxTotalConnections) {
-        builder.setMaxConnTotal(maxTotalConnections);
-        return this;
-    }
-
-    public HttpClientConfigurator connectionTimeout(int connectionTimeout) {
-        config.setConnectTimeout(connectionTimeout);
-        return this;
-    }
-
-    public HttpClientConfigurator soTimeout(int soTimeout) {
-        config.setSocketTimeout(soTimeout);
-        return this;
-    }
-
-    /**
-     * see {@link org.apache.http.client.config.RequestConfig#isStaleConnectionCheckEnabled()}
-     */
-    public HttpClientConfigurator staleCheckingEnabled(boolean staleCheckingEnabled) {
-        config.setStaleConnectionCheckEnabled(staleCheckingEnabled);
-        return this;
-    }
-
-    /**
-     * Disable request retries on service unavailability.
-     */
-    public HttpClientConfigurator noRetry() {
-        return retry(0, false);
-    }
-
-    /**
-     * Number of retry attempts. Default is 3 retries.
-     *
-     * @param retryCount Number of retry attempts. 0 means no retries.
-     */
-    public HttpClientConfigurator retry(int retryCount, boolean requestSentRetryEnabled) {
-        if (retryCount == 0) {
-            builder.disableAutomaticRetries();
-        } else {
-            builder.setRetryHandler(new DefaultHttpRequestRetryHandler(retryCount, requestSentRetryEnabled));
-        }
-        return this;
-    }
-
-    /**
-     * Ignores blank or invalid input
-     */
-    public HttpClientConfigurator localAddress(String localAddress) {
-        if (StringUtils.isNotBlank(localAddress)) {
-            try {
-                InetAddress address = InetAddress.getByName(localAddress);
-                config.setLocalAddress(address);
-            } catch (UnknownHostException e) {
-                throw new IllegalArgumentException("Invalid local address: " + localAddress, e);
-            }
-        }
-        return this;
-    }
-
-    /**
-     * Ignores null credentials
-     */
-    public HttpClientConfigurator authentication(UsernamePasswordCredentials creds) {
-        if (creds != null) {
-            authentication(creds.getUserName(), creds.getPassword());
-        }
-
-        return this;
-    }
-
-    /**
-     * Configures preemptive authentication on this client. Ignores blank username input.
-     */
-    public HttpClientConfigurator authentication(String username, String password) {
-        return authentication(username, password, false);
-    }
-
-    /**
-     * Configures preemptive authentication on this client. Ignores blank username input.
-     */
-    public HttpClientConfigurator authentication(String username, String password, boolean allowAnyHost) {
-        if (StringUtils.isNotBlank(username)) {
-            if (StringUtils.isBlank(host)) {
-                throw new IllegalStateException("Cannot configure authentication when host is not set.");
-            }
-            this.allowAnyHostAuth = allowAnyHost;
-            AuthScope authscope = allowAnyHost ?
-                    new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM) :
-                    new AuthScope(host, AuthScope.ANY_PORT, AuthScope.ANY_REALM);
-            credsProvider.setCredentials(authscope, new UsernamePasswordCredentials(username, password));
-        }
-        return this;
-    }
-
-    /**
-     * Enable cookie management for this client.
-     */
-    public HttpClientConfigurator enableCookieManagement(boolean enableCookieManagement) {
-        if (enableCookieManagement) {
-            config.setCookieSpec(CookieSpecs.BROWSER_COMPATIBILITY);
-        } else {
-            config.setCookieSpec(null);
-        }
-        explicitCookieSupport = enableCookieManagement;
-        return this;
-    }
-
-    public HttpClientConfigurator setConnectionManagerShared(boolean connectionManagerShared) {
-        builder.setConnectionManagerShared(true);
-        return this;
-    }
-
-    public HttpClientConfigurator enableTokenAuthentication(boolean enableTokenAuthentication, String repoKey,
-            @Nullable HttpRequestInterceptor requestInterceptor) {
-        if (enableTokenAuthentication) {
-            if (StringUtils.isBlank(host)) {
-                throw new IllegalStateException("Cannot configure authentication when host is not set.");
-            }
-            this.repoKey = repoKey;
-            config.setTargetPreferredAuthSchemes(Collections.singletonList("Bearer"));
-            // The repository key is passed to the Bearer to reuse it's http client
-            Registry<AuthSchemeProvider> bearerRegistry = RegistryBuilder.<AuthSchemeProvider>create()
-                    .register("Bearer", new BearerSchemeFactory(repoKey))
-                    .build();
-            builder.setDefaultAuthSchemeRegistry(bearerRegistry);
-            if (requestInterceptor != null) {
-                builder.addInterceptorFirst(requestInterceptor);
-            }
-            chosenAuthScheme = AuthScheme.BEARER;
-        }
-        return this;
-    }
-
-    public HttpClientConfigurator proxy(@Nullable ProxyDescriptor proxyDescriptor) {
-        configureProxy(proxyDescriptor);
-        return this;
-    }
-
-    /**
-     * @param keyStoreLocation ssl keystore location
-     * @return {@link HttpClientConfigurator}
-     */
-    public HttpClientConfigurator keyStoreLocation(String keyStoreLocation) {
-        this.keyStoreLocation = keyStoreLocation;
-        return this;
-    }
-
-    /**
-     * @param keyStorePassword ssl keystore password
-     * @return {@link HttpClientConfigurator}
-     */
-    public HttpClientConfigurator keyStorePassword(char[] keyStorePassword) {
-        this.keyStorePassword = keyStorePassword;
-        return this;
-    }
-
-    /**
-     * Set SPNEGO scheme for kerberos auth.
-     *
-     * @param useKerberos to activate kerberos executions
-     * @return {@link HttpClientConfigurator}
-     */
-    public HttpClientConfigurator useKerberos(boolean useKerberos) {
-        if (useKerberos) {
-            Credentials use_jaas_creds = new Credentials() {
-                public String getPassword() {
-                    return null;
-                }
-
-                public Principal getUserPrincipal() {
-                    return null;
-                }
-            };
-            CredentialsProvider credsProvider = new BasicCredentialsProvider();
-            credsProvider.setCredentials(new AuthScope(null, -1, null), use_jaas_creds);
-            Registry<AuthSchemeProvider> spnegoScheme = RegistryBuilder.<AuthSchemeProvider>create()
-                    .register(AuthSchemes.SPNEGO, new SPNegoSchemeFactory(true))
-                    .build();
-            builder.setDefaultAuthSchemeRegistry(spnegoScheme).setDefaultCredentialsProvider(credsProvider);
-            chosenAuthScheme = AuthScheme.SPNEGO;
-        }
-        return this;
-    }
-
-    /**
-     * @param trustSelfSignCert Trust self signed certificates on SSL handshake
-     * @return {@link HttpClientConfigurator}
-     */
-    public HttpClientConfigurator trustSelfSignCert(boolean trustSelfSignCert) {
-        this.trustSelfSignCert = trustSelfSignCert;
-        return this;
-    }
-
-    /**
-     * @param noHostVerification whether host name verification against CA certificate is disabled on SSL handshake
-     * @return {@link HttpClientConfigurator}
-     */
-    public HttpClientConfigurator noHostVerification(boolean noHostVerification) {
-        this.noHostVerification = noHostVerification;
-        return this;
-    }
-
-    private void configureProxy(ProxyDescriptor proxy) {
-        if (proxy != null) {
-            config.setProxy(new HttpHost(proxy.getHost(), proxy.getPort()));
-            this.proxyHost = proxy.getHost();
-            if (StringUtils.isNotBlank(proxy.getUsername())) {
-                Credentials creds = null;
-                if (proxy.getDomain() == null) {
-                    creds = new UsernamePasswordCredentials(proxy.getUsername(),
-                            CryptoHelper.decryptIfNeeded(proxy.getPassword()));
-                    //This will demote the NTLM authentication scheme so that the proxy won't barf
-                    //when we try to give it traditional credentials. If the proxy doesn't do NTLM
-                    //then this won't hurt it (jcej at tragus dot org)
-                    List<String> authPrefs = Arrays.asList(AuthSchemes.DIGEST, AuthSchemes.BASIC, AuthSchemes.NTLM);
-                    config.setProxyPreferredAuthSchemes(authPrefs);
-                    // preemptive proxy authentication
-                    builder.addInterceptorFirst(new ProxyPreemptiveAuthInterceptor());
-                } else {
-                    try {
-                        String ntHost =
-                                StringUtils.isBlank(proxy.getNtHost()) ? InetAddress.getLocalHost().getHostName() :
-                                        proxy.getNtHost();
-                        creds = new NTCredentials(proxy.getUsername(),
-                                CryptoHelper.decryptIfNeeded(proxy.getPassword()), ntHost, proxy.getDomain());
-                    } catch (UnknownHostException e) {
-                        log.error("Failed to determine required local hostname for NTLM credentials.", e);
-                    }
-                }
-                if (creds != null) {
-                    credsProvider.setCredentials(
-                            new AuthScope(proxy.getHost(), proxy.getPort(), AuthScope.ANY_REALM), creds);
-                    if (proxy.getRedirectedToHostsList() != null) {
-                        for (String hostName : proxy.getRedirectedToHostsList()) {
-                            credsProvider.setCredentials(
-                                    new AuthScope(hostName, AuthScope.ANY_PORT, AuthScope.ANY_REALM), creds);
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    private boolean hasCredentials() {
-        return credsProvider.getCredentials(AuthScope.ANY) != null;
-    }
-
-    static class DefaultHostRoutePlanner extends DefaultRoutePlanner {
-
-        private final HttpHost defaultHost;
-
-        public DefaultHostRoutePlanner(String defaultHost) {
-            super(DefaultSchemePortResolver.INSTANCE);
-            this.defaultHost = new HttpHost(defaultHost);
-        }
-
-        @Override
-        public HttpRoute determineRoute(HttpHost host, HttpRequest request, HttpContext context) throws HttpException {
-            if (host == null) {
-                host = defaultHost;
-            }
-            return super.determineRoute(host, request, context);
-        }
-
-        public HttpHost getDefaultHost() {
-            return defaultHost;
-        }
-    }
-
-    /**
-     * Sets required configuration based on the final chosen config for this client so that configurations
-     * don't interfere with each other based on when they were created in the chain (i.e. auth before token etc.)
-     */
-    private void additionalConfigByAuthScheme() {
-        switch (chosenAuthScheme) {
-            case BASIC:
-                builder.addInterceptorFirst(new PreemptiveAuthInterceptor());
-                break;
-            case BEARER:
-                if (shouldConfigureBearerDummyCredentials()) {
-                    // We need dummy credentials hack to enforce httpClient behavior, otherwise we won't respond to a
-                    //challenge properly... Dummy:dummy is the specification for forcing token authentication
-                    credsProvider.setCredentials(new AuthScope(host, AuthScope.ANY_PORT, AuthScope.ANY_REALM),
-                            new UsernamePasswordCredentials("dummy", "dummy"));
-                } else {
-                    //Valid credentials exist for target host - set basic auth preference and register additional scheme
-                    //so we can respond to basic challenges from target as required
-                    List<String> authPrefs = Arrays.asList("Bearer", AuthSchemes.BASIC);
-                    config.setTargetPreferredAuthSchemes(authPrefs);
-                    Registry<AuthSchemeProvider> bearerRegistry = RegistryBuilder.<AuthSchemeProvider>create()
-                            .register("Bearer", new BearerSchemeFactory(repoKey))
-                            .register(AuthSchemes.BASIC, new BasicSchemeFactory())
-                            .build();
-                    builder.setDefaultAuthSchemeRegistry(bearerRegistry);
-                }
-                break;
-        }
-    }
-
-    /**
-     * @return false if credentials were configured for this client's host (or any host if lenient) -> also
-     * verifies the credential set is not the one configured for the proxy (proxy credentials are not considered
-     * host credentials), true if dummy credentials should be configured for Bearer auth
-     */
-    private boolean shouldConfigureBearerDummyCredentials() {
-        boolean shouldSetDummy = false;
-        Credentials hostCreds = credsProvider.getCredentials(
-                new AuthScope(host, AuthScope.ANY_PORT, AuthScope.ANY_REALM));
-        Credentials anyHostCreds = credsProvider.getCredentials(
-                new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM));
-        Credentials proxyCreds = null;
-        if (StringUtils.isNotBlank(proxyHost)) {
-            proxyCreds = credsProvider.getCredentials(new AuthScope(proxyHost, AuthScope.ANY_PORT, AuthScope.ANY_REALM));
-        }
-
-        //Any host allowed - make sure credentials were set and that the credsProvider didn't just return
-        //the proxy's credentials for the ANY_HOST scope.
-        if (allowAnyHostAuth && anyHostCreds != null
-                && (proxyCreds == null || (!proxyCreds.getUserPrincipal().equals(anyHostCreds.getUserPrincipal())))) {
-            shouldSetDummy = true;
-        } else if (hostCreds == null) {
-            shouldSetDummy = true;
-        }
-        return shouldSetDummy;
-    }
-
-    private enum AuthScheme {
-        BASIC, SPNEGO, BEARER
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/util/HttpClientUtils.java b/base/common/src/main/java/org/artifactory/util/HttpClientUtils.java
deleted file mode 100644
index 6deeb9a..0000000
--- a/base/common/src/main/java/org/artifactory/util/HttpClientUtils.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.config.RequestConfig;
-import org.apache.http.client.methods.HttpRequestBase;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.artifactory.repo.http.CloseableHttpClientDecorator;
-import org.springframework.util.ReflectionUtils;
-
-import javax.annotation.Nonnull;
-import java.lang.reflect.Field;
-import java.net.UnknownHostException;
-
-/**
- * Set of utils for easier configuration of apache http client.
- *
- * @author Yossi Shaul
- */
-public abstract class HttpClientUtils {
-    private HttpClientUtils() {
-        // utility class
-    }
-
-    /**
-     * Creates a custom configuration for the request based on the default client configuration.
-     * Http client will disregard the default client configuration if a request contains specific configuration. So it
-     * important to copy from the client default config and not just creating a plain new config.
-     *
-     * @param client  The client expected to run this request
-     * @param request The request for the custom config
-     * @return Request configuration builder based on the client defaults ot the already existing request config.
-     */
-    public static RequestConfig.Builder copyOrCreateConfig(@Nonnull HttpClient client, HttpRequestBase request) {
-        if (request.getConfig() != null) {
-            // request already has custom config -> copy from it
-            return RequestConfig.copy(request.getConfig());
-        }
-
-        RequestConfig defaultConfig = getDefaultConfig(client);
-        if (defaultConfig != null) {
-            // create based on the client default config
-            return RequestConfig.copy(defaultConfig);
-        } else {
-            return RequestConfig.custom();
-        }
-    }
-
-    /**
-     * @param e The throwable to inspect for the error message
-     * @return Most fitting error message for the given throwable. Tries to prevent empty exception messages.
-     */
-    public static String getErrorMessage(Throwable e) {
-        if (e == null) {
-            return null;
-        }
-        String message = e.getMessage(); // default message
-        if (e instanceof UnknownHostException) {
-            message = "Unknown host - " + e.getMessage();
-        } else if (e instanceof ClientProtocolException) {
-            // ClientProtocolException doesn't return a message but holds the cause with the message
-            if (e.getCause() != null) {
-                message = e.getCause().getMessage();
-            }
-        }
-        if (StringUtils.isBlank(message)) {
-            message = e.getClass().toString();
-        }
-        return message;
-    }
-
-    private static RequestConfig getDefaultConfig(HttpClient client) {
-        if (client == null) {
-            return null;
-        }
-        try {
-            HttpClient httpClient = extractCloseableHttpClient(client);
-            Field requestConfigField = httpClient.getClass().getDeclaredField("defaultConfig");
-            requestConfigField.setAccessible(true);
-            return (RequestConfig) ReflectionUtils.getField(requestConfigField, httpClient);
-        } catch (NoSuchFieldException e) {
-            throw new IllegalStateException("Failed to get default request config", e);
-        }
-    }
-
-    /**
-     * Extracts decorated HttpClient (if decorated)
-     *
-     * @param client
-     * @return {@link HttpClient}
-     */
-    private static HttpClient extractCloseableHttpClient(HttpClient client) throws NoSuchFieldException {
-        if (client instanceof CloseableHttpClientDecorator)
-            return ((CloseableHttpClientDecorator)client).getDecorated();
-        return client;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/util/HttpUtils.java b/base/common/src/main/java/org/artifactory/util/HttpUtils.java
deleted file mode 100644
index c6d5e15..0000000
--- a/base/common/src/main/java/org/artifactory/util/HttpUtils.java
+++ /dev/null
@@ -1,484 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import com.google.common.base.Joiner;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.*;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.utils.URIBuilder;
-import org.apache.http.conn.ManagedHttpClientConnection;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.rest.constant.RestConstants;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.request.ArtifactoryRequest;
-import org.artifactory.request.RequestThreadLocal;
-import org.artifactory.rest.ErrorResponse;
-import org.artifactory.util.encodeing.URIUtil;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.map.SerializationConfig;
-import org.jfrog.build.api.Build;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.http.MediaType;
-
-import javax.annotation.Nullable;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletRequest;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.rmi.dgc.VMID;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-/**
- * @author yoavl
- */
-public abstract class HttpUtils {
-    public static final String WEBAPP_URL_PATH_PREFIX = "webapp";
-    private static final String BROWSE_REPO_URL_PREFIX = "/#/artifacts/browse/tree/General/";
-    /**
-     * Determine if we are running with servlet API v2.4 or v2.5
-     */
-    static {
-        //Check the availability of javax.servlet.ServletContext.getContextPath()
-        Method contextPathGetter = null;
-        try {
-            contextPathGetter = ServletContext.class.getMethod("getContextPath", new Class[0]);
-        } catch (NoSuchMethodException e) {
-        } finally {
-            /**
-             * Indicate whether we are running v2.4 or v2.5 by checking if javax.servlet.ServletContext.getContextPath()
-             * is available (introduced in v2.5)
-             */
-            SERVLET_24 = (contextPathGetter == null);
-        }
-    }
-    private static final Logger log = LoggerFactory.getLogger(HttpUtils.class);
-    //Indicates whether Artifactory is working with servlet API v2.4
-    private static final boolean SERVLET_24;
-    private static String userAgent;
-    private static String VM_HOST_ID;
-
-    private HttpUtils() {
-        // utility class
-    }
-
-    public static String getArtifactoryUserAgent() {
-        if (userAgent == null) {
-            String artifactoryVersion = ConstantValues.artifactoryVersion.getString();
-            if (artifactoryVersion.startsWith("$") || artifactoryVersion.endsWith("SNAPSHOT")) {
-                artifactoryVersion = "development";
-            }
-            userAgent = "Artifactory/" + artifactoryVersion;
-        }
-        return userAgent;
-    }
-
-    /**
-     * Reset the cached Artifactory user agent string (required after upgrade)
-     */
-    public static void resetArtifactoryUserAgent() {
-        userAgent = null;
-    }
-
-    @SuppressWarnings({"IfMayBeConditional"})
-    public static String getRemoteClientAddress(HttpServletRequest request) {
-        String remoteAddress;
-        //Check if there is a remote address coming from a proxied request
-        //(http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypreservehost)
-        String header = request.getHeader("X-Forwarded-For");
-        if (StringUtils.isNotBlank(header)) {
-            //Might contain multiple entries - take the first
-            remoteAddress = new StringTokenizer(header, ",").nextToken();
-        } else {
-            //Take it the standard way
-            remoteAddress = request.getRemoteAddr();
-        }
-        return remoteAddress;
-    }
-
-    public static String getServletContextUrl(HttpServletRequest httpRequest) {
-        String origUrl = httpRequest.getHeader(ArtifactoryRequest.ARTIFACTORY_OVERRIDE_BASE_URL);
-        if (StringUtils.isNotBlank(origUrl)) {
-            // original artifactory request url overrides request and base url
-            return origUrl;
-        }
-        CentralConfigService centralConfigService = ContextHelper.get().getCentralConfig();
-        String baseUrl = centralConfigService.getDescriptor().getUrlBase();
-        if (!StringUtils.isEmpty(baseUrl)) {
-            String scheme = httpRequest.getScheme();
-            if (baseUrl.startsWith(scheme)) {
-                return baseUrl;
-            } else {
-                int idx = baseUrl.indexOf("://");
-                if (idx > 0) {
-                    return scheme + "://" + baseUrl.substring(idx + 3);
-                } else {
-                    return scheme + "://" + baseUrl;
-                }
-            }
-        }
-        return getServerUrl(httpRequest) + httpRequest.getContextPath();
-    }
-
-    public static String getRestApiUrl(HttpServletRequest request) {
-        return getServletContextUrl(request) + "/" + RestConstants.PATH_API;
-    }
-
-    public static String getServerUrl(HttpServletRequest httpRequest) {
-        int port = httpRequest.getServerPort();
-        String scheme = httpRequest.getScheme();
-        if (isDefaultPort(scheme, port)) {
-            return scheme + "://" + httpRequest.getServerName();
-        }
-        return scheme + "://" + httpRequest.getServerName() + ":" + port;
-    }
-
-    public static boolean isDefaultPort(String scheme, int port) {
-        switch (port) {
-            case 80:
-                return "http".equalsIgnoreCase(scheme);
-            case 443:
-                return "https".equalsIgnoreCase(scheme);
-            default:
-                return false;
-        }
-    }
-
-    public static String getSha1Checksum(ArtifactoryRequest request) {
-        return request.getHeader(ArtifactoryRequest.CHECKSUM_SHA1);
-    }
-
-    public static String getSha256Checksum(ArtifactoryRequest request) {
-        return request.getHeader(ArtifactoryRequest.CHECKSUM_SHA256);
-    }
-
-    public static boolean isExpectedContinue(ArtifactoryRequest request) {
-        String expectHeader = request.getHeader("Expect");
-        if (StringUtils.isBlank(expectHeader)) {
-            return false;
-        }
-        // some clients make the C lowercase even when passed uppercase
-        return expectHeader.contains("100-continue") || expectHeader.contains("100-Continue");
-    }
-
-    public static String getMd5Checksum(ArtifactoryRequest request) {
-        return request.getHeader(ArtifactoryRequest.CHECKSUM_MD5);
-    }
-
-    public synchronized static String getContextId(ServletContext servletContext) {
-        //If running servlet API 2.4, just return the servlet context name
-        if (SERVLET_24) {
-            return servletContext.getServletContextName();
-        }
-
-        //If running v2.5, return proper context path
-        String contextUniqueName = PathUtils.trimLeadingSlashes(servletContext.getContextPath());
-        contextUniqueName = StringUtils.capitalize(contextUniqueName);
-        return contextUniqueName;
-    }
-
-    /**
-     * @param status The (http based) response code
-     * @return True if the code symbols a successful request cycle (i.e., in the 200-299 range)
-     */
-    public static boolean isSuccessfulResponseCode(int status) {
-        return HttpStatus.SC_OK <= status && status <= 299;
-    }
-
-    /**
-     * @param status The (http based) response code
-     * @return True if the code symbols a successful request cycle (i.e., in the 300-399 range)
-     */
-    public static boolean isRedirectionResponseCode(int status) {
-        return HttpStatus.SC_MULTIPLE_CHOICES <= status && status <= 399;
-    }
-
-    /**
-     * Calculate a unique id for the VM to support Artifactories with the same ip (e.g. accross NATs)
-     */
-    public static String getHostId() {
-        if (StringUtils.isNotBlank(ConstantValues.hostId.getString())) {
-            return ConstantValues.hostId.getString();
-        }
-        if (VM_HOST_ID == null) {
-            VMID vmid = new VMID();
-            VM_HOST_ID = vmid.toString();
-        }
-        return VM_HOST_ID;
-    }
-
-    /**
-     * @param response The response to get the body from
-     * @return Returns the response body input stream or null is there is none.
-     */
-    @Nullable
-    public static InputStream getResponseBody(HttpResponse response) throws IOException {
-        HttpEntity entity = response.getEntity();
-        return entity == null ? null : entity.getContent();
-    }
-
-    public static String encodeQuery(String unescaped) {
-        try {
-            return URIUtil.encodeQuery(unescaped, "UTF-8");
-        } catch (HttpException e) {
-            // Nothing to do here, we will return the un-escaped value.
-            log.warn("Could not encode path '{}' with UTF-8 charset, returning the un-escaped value.", unescaped);
-        }
-        return unescaped;
-    }
-
-    public static String decodeUri(String encodedUri) {
-        try {
-            return URIUtil.decode(encodedUri, "UTF-8");
-        } catch (HttpException e) {
-            // Nothing to do here, we will return the un-escaped value.
-            log.warn("Could not decode uri '{}' with UTF-8 charset, returning the encoded value.", encodedUri);
-        }
-        return encodedUri;
-    }
-
-    /**
-     * Removes the query parameters from the given url
-     *
-     * @param url URL string with query parameters, e.g. "http://hello/world?lang=java&run=1"
-     * @return new string object without the query parameters, e.g. "http://hello/world". If no query elements found the
-     * original string is returned.
-     */
-    public static String stripQuery(String url) {
-        int i = url.indexOf("?");
-        if (i > -1) {
-            return url.substring(0, i);
-        } else {
-            return url;
-        }
-    }
-
-    public static String adjustRefererValue(Map<String, String> headersMap, String headerVal) {
-        //Append the artifactory user agent to the referer
-        if (headerVal == null) {
-            //Fallback to host
-            headerVal = headersMap.get("HOST");
-            if (headerVal == null) {
-                //Fallback to unknown
-                headerVal = "UNKNOWN";
-            }
-        }
-        if (!headerVal.startsWith("http")) {
-            headerVal = "http://" + headerVal;
-        }
-        try {
-            java.net.URL uri = new java.net.URL(headerVal);
-            //Only use the uri up to the path part
-            headerVal = uri.getProtocol() + "://" + uri.getAuthority();
-        } catch (MalformedURLException e) {
-            //Nothing
-        }
-        headerVal += "/" + HttpUtils.getArtifactoryUserAgent();
-        return headerVal;
-    }
-
-    /**
-     * Extracts the content length from the response header, or return -1 if the content-length field was not found.
-     *
-     * @param response The response
-     * @return Content length in bytes or -1 if header not found
-     */
-    public static long getContentLength(HttpResponse response) {
-        Header contentLengthHeader = response.getFirstHeader(HttpHeaders.CONTENT_LENGTH);
-        if (contentLengthHeader != null) {
-            return extractContentLengthFromHeader(contentLengthHeader.getValue());
-        } else {
-            return -1;
-        }
-    }
-
-    public static String getServerAndPortFromContext(String contextUrl){
-        String [] splittedServerContext = contextUrl.split("/");
-        if (splittedServerContext.length >= 3) {
-            return splittedServerContext[2];
-        }else{
-            return "";
-        }
-    }
-
-    public static String getApacheServerAndPortFromContext(String contextUrl) {
-        String[] splittedServerContext = contextUrl.split("/");
-        if (splittedServerContext.length >= 3) {
-            return splittedServerContext[0] + "//" + splittedServerContext[2];
-        } else {
-            return "";
-        }
-    }
-
-    /**
-     * Return content length as long (required for uploaded files > 2GB).
-     * The servlet api can only return this as int.
-     *
-     * @param request The request
-     * @return The content length in bytes or -1 if not found
-     */
-    public static long getContentLength(HttpServletRequest request) {
-        return extractContentLengthFromHeader(request.getHeader(HttpHeaders.CONTENT_LENGTH));
-    }
-
-    private static long extractContentLengthFromHeader(String lengthHeader) {
-        long contentLength;
-        if (lengthHeader != null) {
-            try {
-                contentLength = Long.parseLong(lengthHeader);
-            } catch (NumberFormatException e) {
-                log.trace("Bad Content-Length value {}", lengthHeader);
-                contentLength = -1;
-            }
-        } else {
-            contentLength = -1;
-        }
-        return contentLength;
-    }
-
-    public static void sendErrorResponse(HttpServletResponse response, int statusCode, String message)
-            throws IOException {
-        response.setContentType(MediaType.APPLICATION_JSON_VALUE);
-        response.setStatus(statusCode);
-        ObjectMapper mapper = new ObjectMapper();
-        mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
-        ErrorResponse errorResponse = new ErrorResponse(statusCode, message);
-        response.getWriter().write(mapper.writeValueAsString(errorResponse));
-    }
-
-    public static boolean isAbsolute(String url) {
-        try {
-            URI uri = new URIBuilder(url).build();
-            return uri.isAbsolute();
-        } catch (URISyntaxException e) {
-            return false;
-        }
-    }
-
-    public static String getRemoteClientAddress() {
-        if (ConstantValues.test.getBoolean()) {
-            return "127.0.0.1";
-        }
-        String remoteClientAddress = RequestThreadLocal.getClientAddress();
-        if (remoteClientAddress == null ) {
-            return "";
-        } else {
-            return remoteClientAddress;
-        }
-    }
-
-    public static String resolveResponseRemoteAddress(CloseableHttpResponse response) {
-        try {
-            Field connHolderField = response.getClass().getDeclaredField("connHolder");
-            connHolderField.setAccessible(true);
-            Object connHolder = connHolderField.get(response);
-
-            Field managedConnField = connHolder.getClass().getDeclaredField("managedConn");
-            managedConnField.setAccessible(true);
-            ManagedHttpClientConnection managedConn = (ManagedHttpClientConnection) managedConnField.get(
-                    connHolder);
-            String hostAddress = managedConn.getSocket().getInetAddress().getHostAddress();
-            return hostAddress == null ? StringUtils.EMPTY : hostAddress;
-        } catch (Throwable throwable) {
-            return StringUtils.EMPTY;
-        }
-    }
-
-    public static String createBuildInfoLink(Build build) {
-        String artifactoryUrl = ContextHelper.get().beanForType(
-                CentralConfigService.class).getDescriptor().getServerUrlForEmail();
-        if (StringUtils.isBlank(artifactoryUrl)) {
-            return build.getName() + ":" + build.getNumber();
-        } else {
-            try {
-                String href = Joiner.on("/").join(
-                        artifactoryUrl + HttpUtils.WEBAPP_URL_PATH_PREFIX,
-                        "builds",
-                        // Do a manual "encoding" of spaces for the build name. This is due to the fact that if the mail
-                        // is sent to a Gmail account it will automatically insert '+' for every space, and not its '%20'
-                        // hex representation, this will cause a broken link. see more here:
-                        // http://www.google.fr/support/forum/p/gmail/thread?tid=53a5c616a0324d96&hl=en
-                        build.getName().replace(" ", "%20"),
-                        build.getNumber());
-
-                return "<a href=\"" + href + "\"" + " target=\"blank\">" + build.getName() + ":" + build.getNumber()
-                        + "</a>";
-            } catch (Exception e) {
-                return build.getName() + ":" + build.getNumber();
-            }
-        }
-    }
-
-    public static String createLinkToBrowsableArtifact(RepoPath repoPath, String linkLabel) {
-        String artifactoryUrl = ContextHelper.get().beanForType(CentralConfigService.class).getDescriptor()
-                .getServerUrlForEmail();
-        if(StringUtils.isBlank(artifactoryUrl)) {
-            return linkLabel;
-        } else {
-            String url = artifactoryUrl + HttpUtils.WEBAPP_URL_PATH_PREFIX + BROWSE_REPO_URL_PREFIX
-                    + HttpUtils.encodeQuery(repoPath.toPath());
-            return "<a href=" + url + " target=\"blank\"" + ">" + linkLabel + "</a>";
-        }
-    }
-
-    /**
-     * Extracts session access time if session exist,
-     * if session is null, returns System.currentTimeMillis
-     *
-     * @param servletRequest
-     * @return session access time
-     */
-    public static long getSessionAccessTime(HttpServletRequest servletRequest) {
-        HttpSession session = servletRequest.getSession(false);
-        return session != null ?
-                (
-                        session.getLastAccessedTime() == 0 ?
-                            session.getCreationTime()
-                            :
-                            session.getLastAccessedTime()
-                )
-                :
-                System.currentTimeMillis();
-    }
-
-    /**
-     * Checks whether request targeted for changePassword api
-     * or if admin triggered "unExpirePasswordForAllUsers" action
-     *
-     * @param servletRequest
-     * @return true if request targeted for "changePassword"
-     */
-    public static boolean isChangePasswordRequest(ServletRequest servletRequest) {
-        String uri = ((HttpServletRequest) servletRequest).getRequestURI();
-        String invokedMethod = PathUtils.getLastPathElement(uri);
-        return "changePassword".equals(invokedMethod) || "unExpirePasswordForAllUsers".equals(invokedMethod) ;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/util/NameValidator.java b/base/common/src/main/java/org/artifactory/util/NameValidator.java
deleted file mode 100644
index cec3c5b..0000000
--- a/base/common/src/main/java/org/artifactory/util/NameValidator.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.artifactory.util;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.exception.ValidationException;
-
-/**
- * Generic name validator for root entity names (repos, descriptor keys etc.).
- *
- * @author Yossi Shaul
- */
-public final class NameValidator {
-    private static final char[] forbiddenChars = {'/', '\\', ':', '|', '?', '*', '"', '<', '>'};
-
-    public static void validate(String name) throws ValidationException {
-        if (StringUtils.isBlank(name)) {
-            throw new ValidationException("Name cannot be blank");
-        }
-
-        if (name.equals(".") || name.equals("..") || name.equals("&")) {
-            throw new ValidationException("Name cannot be empty link: '" + name + "'");
-        }
-
-        char[] nameChars = name.toCharArray();
-        for (int i = 0; i < nameChars.length; i++) {
-            char c = nameChars[i];
-            for (char fc : forbiddenChars) {
-                if (c == fc) {
-                    throw new ValidationException("Illegal name character: '" + c + "' at index " + i + ": " + name, i);
-                }
-            }
-        }
-    }
-
-    /**
-     * @return ForbiddenChars
-     */
-    public static char[] getForbiddenChars() {
-        return forbiddenChars;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/util/NumberFormatter.java b/base/common/src/main/java/org/artifactory/util/NumberFormatter.java
deleted file mode 100644
index 57cc223..0000000
--- a/base/common/src/main/java/org/artifactory/util/NumberFormatter.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import java.text.DecimalFormat;
-
-/**
- * Utility for frequently used number formats.
- *
- * @author Yossi Shaul
- */
-public abstract class NumberFormatter {
-
-    /**
-     * Returns a formatted long value according to the pattern "#,###".<p/>
-     * For example:
-     * <pre>
-     * formatLong(100) = "100"
-     * formatLong(1000) = "1,000"
-     * formatLong(10000) = "10,000"
-     * formatLong(1000000) = "1,000,000"
-     * </pre>
-     *
-     * @param val The value to format
-     * @return A formatted long value according to the pattern "#,###"
-     */
-    public static String formatLong(long val) {
-        return new DecimalFormat("#,###").format(val);
-    }
-
-    /**
-     * Returns formatted percentage value for the given fraction.<p/>
-     * For example:
-     * <pre>
-     * formatPercentage(0.1) = "10%"
-     * formatPercentage(0.55558) = "55.56%"
-     * formatPercentage(2.3) = "230%"
-     * </pre>
-     *
-     * @param fraction The fraction to turn into percentage format
-     * @return A formatted percentage value for the given fraction
-     */
-    public static String formatPercentage(double fraction) {
-        if (Double.isNaN(fraction)) {
-            return "N/A";
-        }
-        return new DecimalFormat("###.##%").format(fraction);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/util/PathMatcher.java b/base/common/src/main/java/org/artifactory/util/PathMatcher.java
deleted file mode 100644
index 0a31dc8..0000000
--- a/base/common/src/main/java/org/artifactory/util/PathMatcher.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import org.artifactory.repo.RepoPath;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.util.AntPathMatcher;
-
-import javax.annotation.Nullable;
-import java.util.Collection;
-
-/**
- * An Ant-based path matcher util class.
- *
- * @author Yossi Shaul
- */
-public abstract class PathMatcher {
-    private static final Logger log = LoggerFactory.getLogger(PathMatcher.class);
-
-    private static final AntPathMatcher antPathMatcher = new AntPathMatcher();
-
-    private PathMatcher() {
-        // utility class
-    }
-
-    public static boolean matches(RepoPath repoPath, @Nullable Collection<String> includes,
-            @Nullable Collection<String> excludes) {
-        // If repoPath represents folder then use "startMatch"
-        boolean useStartMatch = repoPath.isFolder();
-        return matches(repoPath.getPath(), includes, excludes, useStartMatch);
-    }
-
-    public static boolean matches(String path, @Nullable Collection<String> includes,
-            @Nullable Collection<String> excludes, boolean useStartMatch) {
-        if (CollectionUtils.notNullOrEmpty(excludes)) {
-            for (String exclude : excludes) {
-                if (antPathMatcher.match(exclude, path)) {
-                    log.debug("excludes pattern ({}) rejected path '{}'.", exclude, path);
-                    return false;
-                }
-            }
-        }
-
-        if (CollectionUtils.notNullOrEmpty(includes)) {
-            for (String include : includes) {
-                if (includeMatch(path, useStartMatch, include)) {
-                    return true;
-                }
-            }
-        } else {
-            return true;
-        }
-        return false;
-    }
-
-    private static boolean includeMatch(String path, boolean useStartMatch, String include) {
-        return "**/*".equals(include)
-                || "**".equals(include)
-                || (useStartMatch && antPathMatcher.matchStart(include, path))
-                || antPathMatcher.match(include, path);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/util/PathValidator.java b/base/common/src/main/java/org/artifactory/util/PathValidator.java
deleted file mode 100644
index ecf64e0..0000000
--- a/base/common/src/main/java/org/artifactory/util/PathValidator.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import org.apache.commons.lang.StringUtils;
-
-import java.nio.file.InvalidPathException;
-
-/**
- * A path validator, used by both the web and the storage
- *
- * @author Shay Yaakov
- */
-public abstract class PathValidator {
-
-    // The state when starting to parse the entire path and when we are valid so far
-    private static final int STATE_OK = 0;
-    // The state when we found a slash ('/')
-    private static final int STATE_SLASH = 1;
-    // The state when we found a dot ('.')
-    private static final int STATE_DOT = 2;
-    // The state when we found a space character (' ' even from tab etc)
-    private static final int STATE_SPACE = 3;
-    // The state when an ampersand is found ('&') only at the start of a token (start of the entire path or after a '/')
-    private static final int STATE_AMPERSAND = 4;
-
-    /**
-     * Validates the the given path, throws {@link InvalidPathException} in case it's invalid.
-     *
-     * @param path The path to validate, it is expected to be in unix separators
-     */
-    public static void validate(String path) {
-
-        if (StringUtils.isBlank(path)) {
-            throw new InvalidPathException(path, "Path cannot be blank");
-        }
-
-        int state = STATE_OK;
-        int len = path.length();
-        int pos = 0;
-
-        final char EOF = (char) -1;
-        while (pos <= len) {
-            char c = pos == len ? EOF : path.charAt(pos);
-
-            // special check for whitespace
-            if (c != ' ' && Character.isWhitespace(c)) {
-                c = ' ';
-            }
-            switch (c) {
-                case '/':
-                case EOF:
-                    if (state == STATE_SPACE) {
-                        throw new InvalidPathException(path, "Path cannot have a slash after a space");
-                    } else if (state == STATE_DOT) {
-                        throw new InvalidPathException(path, "Path element cannot end with a dot");
-                    } else if (state == STATE_AMPERSAND) {
-                        throw new InvalidPathException(path, "Path cannot have single ampersand");
-                    }
-                    state = STATE_SLASH;
-                    break;
-
-                case '&':
-                    if (pos == 0 || state == STATE_SLASH) {
-                        // We do not allow only & at a path token but it is allowed in general ('test&', '&test')
-                        state = STATE_AMPERSAND;
-                    }
-                    break;
-
-                case '.':
-                    if (pos == 0 || state == STATE_SLASH) {
-                        state = STATE_DOT;
-                    }
-                    break;
-
-                case ' ':
-                    if (state == STATE_SLASH) {
-                        throw new InvalidPathException(path, "Path cannot have a space after a slash");
-                    }
-                    state = STATE_SPACE;
-                    break;
-
-                case '\\':
-                case '|':
-                case ':':
-                case '*':
-                case '?':
-                case '"':
-                    throw new InvalidPathException(path, "Invalid path. '" + c + "' is not a valid name character");
-
-                default:
-                    state = STATE_OK;
-                    break;
-            }
-
-            pos++;
-        }
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/util/PerfTimer.java b/base/common/src/main/java/org/artifactory/util/PerfTimer.java
deleted file mode 100644
index 721a7b7..0000000
--- a/base/common/src/main/java/org/artifactory/util/PerfTimer.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-/**
- * Performance monitor.
- *
- * @author Yossi Shaul
- */
-public class PerfTimer {
-
-    private final long start;
-    private long end;
-
-    /**
-     * Creates the performance timer and records the start time
-     */
-    public PerfTimer() {
-        start = System.nanoTime();
-    }
-
-    /**
-     * Stops the timer and returns the execution time in nanos.
-     *
-     * @return Execution time in nanos
-     */
-    public long stop() {
-        end = System.nanoTime();
-        return end - start;
-    }
-
-    /**
-     * @return Execution time in nanos since the start time
-     */
-    public long getTime() {
-        if (end < start) {
-            return -1;  // illegal state but we don't want to fail application code
-        }
-        return end - start;
-    }
-
-    /**
-     * @return The time passed since the start time (regardless of the stop time)
-     */
-    public String currentTimeString() {
-        return getTimeString(System.nanoTime() - start);
-    }
-
-    /**
-     * @return A human readable string adjusted by time units
-     */
-    public String getTimeString() {
-        long nanos = getTime();
-        return getTimeString(nanos);
-    }
-
-    @Override
-    public String toString() {
-        return getTimeString();
-    }
-
-    private String getTimeString(long nanos) {
-        return TimeUnitFormat.getTimeString(nanos);
-    }
-
-}
diff --git a/base/common/src/main/java/org/artifactory/util/PreemptiveAuthInterceptor.java b/base/common/src/main/java/org/artifactory/util/PreemptiveAuthInterceptor.java
deleted file mode 100644
index 90ea54a..0000000
--- a/base/common/src/main/java/org/artifactory/util/PreemptiveAuthInterceptor.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpRequestInterceptor;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.AuthState;
-import org.apache.http.auth.Credentials;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.impl.auth.BasicScheme;
-import org.apache.http.protocol.HttpContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-
-/**
- * Request interceptor to perform preemptive authentication with http client.
- *
- * @author Yossi Shaul
- */
-public class PreemptiveAuthInterceptor implements HttpRequestInterceptor {
-    private static final Logger log = LoggerFactory.getLogger(PreemptiveAuthInterceptor.class);
-
-    @Override
-    public void process(HttpRequest request, HttpContext context) throws HttpException, IOException {
-        HttpClientContext clientContext = HttpClientContext.adapt(context);
-        AuthState authState = clientContext.getTargetAuthState();
-
-        // If there's no auth scheme available yet, try to initialize it preemptively
-        if (authState.getAuthScheme() == null) {
-            CredentialsProvider credsProvider = clientContext.getCredentialsProvider();
-            HttpHost targetHost = clientContext.getTargetHost();
-            Credentials creds = credsProvider.getCredentials(
-                    new AuthScope(targetHost.getHostName(), targetHost.getPort()));
-            if (creds == null) {
-                log.debug("No credentials found for host " + targetHost);
-            } else {
-                log.debug("Updating credentials for host " + targetHost);
-                authState.update(new BasicScheme(), creds);
-            }
-        }
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/util/ProxyPreemptiveAuthInterceptor.java b/base/common/src/main/java/org/artifactory/util/ProxyPreemptiveAuthInterceptor.java
deleted file mode 100644
index 28317a4..0000000
--- a/base/common/src/main/java/org/artifactory/util/ProxyPreemptiveAuthInterceptor.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpRequestInterceptor;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.AuthState;
-import org.apache.http.auth.ChallengeState;
-import org.apache.http.auth.Credentials;
-import org.apache.http.client.CredentialsProvider;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.conn.routing.RouteInfo;
-import org.apache.http.impl.auth.BasicScheme;
-import org.apache.http.protocol.HttpContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-
-/**
- * Request interceptor to perform preemptive authentication against an http proxy.
- *
- * @author Yossi Shaul
- */
-public class ProxyPreemptiveAuthInterceptor implements HttpRequestInterceptor {
-    private static final Logger log = LoggerFactory.getLogger(ProxyPreemptiveAuthInterceptor.class);
-
-    @Override
-    public void process(HttpRequest request, HttpContext context) throws HttpException, IOException {
-        HttpClientContext clientContext = HttpClientContext.adapt(context);
-        AuthState proxyAuthState = clientContext.getProxyAuthState();
-
-        // If there's no auth scheme available yet, try to initialize it preemptively
-        if (proxyAuthState.getAuthScheme() == null) {
-            CredentialsProvider credsProvider = clientContext.getCredentialsProvider();
-            RouteInfo route = clientContext.getHttpRoute();
-            if (route == null) {
-                log.debug("No route found for {}", clientContext.getTargetHost());
-                return;
-            }
-
-            HttpHost proxyHost = route.getProxyHost();
-            if (proxyHost == null) {
-                log.warn("No proxy host found in route {} for host {}", route, clientContext.getTargetHost());
-                return;
-            }
-
-            Credentials creds = credsProvider.getCredentials(
-                    new AuthScope(proxyHost.getHostName(), proxyHost.getPort()));
-            if (creds == null) {
-                log.info("No credentials found for proxy: " + proxyHost);
-                return;
-            }
-            proxyAuthState.update(new BasicScheme(ChallengeState.PROXY), creds);
-        }
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/util/RepoPathUtils.java b/base/common/src/main/java/org/artifactory/util/RepoPathUtils.java
deleted file mode 100644
index c38d825..0000000
--- a/base/common/src/main/java/org/artifactory/util/RepoPathUtils.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-
-import javax.annotation.Nullable;
-
-/**
- * Utility class for {@link org.artifactory.repo.RepoPath}.
- *
- * @author Yossi Shaul
- */
-public abstract class RepoPathUtils {
-
-    /**
-     * @param degree The degree of the ancestor (1 - parent, 2 - grandparent, etc)
-     * @return Returns the n-th ancestor of this repo path. Null if doesn't exist.
-     */
-    @Nullable
-    public static RepoPath getAncestor(RepoPath repoPath, int degree) {
-        RepoPath result = repoPath.getParent();   // first ancestor
-        for (int i = degree - 1; i > 0 && result != null; i--) {
-            result = result.getParent();
-        }
-        return result;
-    }
-
-    /**
-     * Creates repo path representing the root repository path (i.e. path is empty).
-     *
-     * @param repoKey The repository key
-     * @return Repository root repo path
-     */
-    public static RepoPath repoRootPath(String repoKey) {
-        return RepoPathFactory.create(repoKey, "");
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/util/SessionUtils.java b/base/common/src/main/java/org/artifactory/util/SessionUtils.java
deleted file mode 100644
index 1cf52cb..0000000
--- a/base/common/src/main/java/org/artifactory/util/SessionUtils.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.artifactory.util;
-
-import org.springframework.security.core.Authentication;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-
-/**
- * @author Gidi Shabat
- */
-public class SessionUtils {
-    private static final String LAST_USER_KEY = "artifactory:lastUserId";
-
-
-    /**
-     * create updated session with remember me authentication
-     *
-     * @param request        - http servlet request
-     * @param authentication - remember me authentication
-     * @param createSession  - if true create session
-     * @return
-     */
-    public static boolean setAuthentication(HttpServletRequest request, Authentication authentication,
-            boolean createSession) {
-        HttpSession session = request.getSession(createSession);
-        if (session == null) {
-            return false;
-        }
-        session.setAttribute(LAST_USER_KEY, authentication);
-        return true;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/util/StringUtils.java b/base/common/src/main/java/org/artifactory/util/StringUtils.java
deleted file mode 100644
index 9699c5e..0000000
--- a/base/common/src/main/java/org/artifactory/util/StringUtils.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.util;
-
-/**
- * Created by michaelp on 6/29/15.
- */
-public class StringUtils {
-
-    public static final String LINE_SEPARATOR = System.lineSeparator();
-
-    private StringUtils() {;}
-
-    /**
-     * Replaces last occurrence of given string
-     *
-     * @param string string to work on
-     * @param from replace candidate
-     * @param to replace content
-     *
-     * @return modified string
-     */
-    public static String replaceLast(String string, String from, String to) {
-        if (!com.google.common.base.Strings.isNullOrEmpty(string)) {
-            int lastIndex = string.lastIndexOf(from);
-            if (lastIndex < 0) return string;
-            String tail = string.substring(lastIndex).replaceFirst(from, to);
-            return string.substring(0, lastIndex) + tail;
-        }
-        return string;
-    }
-
-    /**
-     * Capitalizes first latter in string
-     *
-     * @param string
-     *
-     * @return capitalized string
-     */
-    public static String capitalize(String string) {
-        return Character.toUpperCase(string.charAt(0)) + string.substring(1);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/util/TimeUnitFormat.java b/base/common/src/main/java/org/artifactory/util/TimeUnitFormat.java
deleted file mode 100644
index 565bfa0..0000000
--- a/base/common/src/main/java/org/artifactory/util/TimeUnitFormat.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
-import java.text.NumberFormat;
-import java.util.Locale;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Formats time units to human readable strings.
- *
- * @author Yossi Shaul
- */
-public abstract class TimeUnitFormat {
-
-    private static final long NANOS_IN_ONE_MILLIS = 1_000_000L;
-    private static final long NANOS_IN_ONE_SECOND = NANOS_IN_ONE_MILLIS * 1000;
-    private static final long NANOS_IN_ONE_MINUTE = NANOS_IN_ONE_SECOND * 60;
-
-    /**
-     * @param duration Duration in the time unit specified with the second parameter
-     * @return A formatted string with the closest matching time unit
-     */
-    public static String getTimeString(long duration, TimeUnit timeUnit) {
-        return getTimeString(timeUnit.toNanos(duration));
-    }
-
-    /**
-     * @param nanos Time in nano seconds
-     * @return A formatted string with the closest matching time unit
-     */
-    public static String getTimeString(long nanos) {
-        // use a thread safe alternative or thread local in the future
-        NumberFormat numberFormat = new DecimalFormat("###.##", new DecimalFormatSymbols(Locale.UK));
-
-        if (nanos < NANOS_IN_ONE_MILLIS) {
-            // show in nanoseconds
-            return nanos + " nanos";
-        } else if (nanos < NANOS_IN_ONE_SECOND) {
-            // show in millis
-            return numberFormat.format((float) nanos / NANOS_IN_ONE_MILLIS) + " millis";
-        } else if (nanos < NANOS_IN_ONE_MINUTE) {
-            // show in seconds
-            return numberFormat.format((float) nanos / NANOS_IN_ONE_SECOND) + " secs";
-        } else {
-            // show in minutes
-            return numberFormat.format((float) nanos / NANOS_IN_ONE_MINUTE) + " minutes";
-        }
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/util/UiRequestUtils.java b/base/common/src/main/java/org/artifactory/util/UiRequestUtils.java
deleted file mode 100644
index df79da0..0000000
--- a/base/common/src/main/java/org/artifactory/util/UiRequestUtils.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.webdav.WebdavService;
-import org.artifactory.md.Properties;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.request.ArtifactoryRequest;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.core.Authentication;
-
-import javax.servlet.ServletContext;
-import javax.servlet.ServletRequest;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Locale;
-import java.util.Set;
-
-import static org.apache.commons.lang.StringUtils.EMPTY;
-
-/**
- * @author Chen Keinan
- */
-public abstract class UiRequestUtils {
-    public static final String LAST_USER_KEY = "artifactory:lastUserId";
-    private static final Logger log = LoggerFactory.getLogger(UiRequestUtils.class);
-    private static final Set<String> NON_UI_PATH_PREFIXES = new HashSet<>();
-    private static final Set<String> UI_PATH_PREFIXES = new HashSet<>();
-    private static final String DEFAULT_ENCODING = "utf-8";
-
-    private UiRequestUtils() {
-        // utility class
-    }
-
-    public static void setNonUiPathPrefixes(Collection<String> uriPathPrefixes) {
-        NON_UI_PATH_PREFIXES.clear();
-        NON_UI_PATH_PREFIXES.addAll(uriPathPrefixes);
-    }
-
-    public static void setUiPathPrefixes(Collection<String> uriPathPrefixes) {
-        UI_PATH_PREFIXES.clear();
-        UI_PATH_PREFIXES.addAll(uriPathPrefixes);
-    }
-
-    public static boolean isUiRestRequest(HttpServletRequest request) {
-        String contextPath = request.getContextPath();
-        String ui_uri = contextPath.endsWith("/") ? "ui/" : "/ui/";
-        String requestAgent = request.getHeader("Request-Agent");
-        if (request.getRequestURI().toString().startsWith(contextPath + ui_uri) || (requestAgent != null && requestAgent.equals("artifactoryUI"))) {
-            return true;
-        }
-        return false;
-    }
-
-    @SuppressWarnings({"IfMayBeConditional"})
-    public static String getContextPrefix(HttpServletRequest request) {
-        String contextPrefix;
-        String requestUri = request.getRequestURI();
-        int contextPrefixEndIdx = requestUri.indexOf('/', 1);
-        if (contextPrefixEndIdx > 0) {
-            contextPrefix = requestUri.substring(1, contextPrefixEndIdx);
-        } else {
-            contextPrefix = "";
-        }
-        return contextPrefix;
-    }
-
-    public static boolean isRepoRequest(HttpServletRequest request) {
-        return isRepoRequest(request, false);
-    }
-
-    public static boolean isRepoRequest(HttpServletRequest request, boolean warnIfRepoDoesNotExist) {
-        String servletPath = getServletPathFromRequest(request);
-        String pathPrefix = PathUtils.getFirstPathElement(servletPath);
-        if (pathPrefix == null || pathPrefix.length() == 0) {
-            return false;
-        }
-        if (ArtifactoryRequest.LIST_BROWSING_PATH.equals(pathPrefix)) {
-            pathPrefix = PathUtils.getFirstPathElement(servletPath.substring("list/".length()));
-        }
-        if (ArtifactoryRequest.SIMPLE_BROWSING_PATH.equals(pathPrefix)) {
-            pathPrefix = PathUtils.getFirstPathElement(servletPath.substring("simple/".length()));
-        }
-        if (UI_PATH_PREFIXES.contains(pathPrefix)) {
-            return false;
-        }
-        if (NON_UI_PATH_PREFIXES.contains(pathPrefix)) {
-            return false;
-        }
-        String repoKey = pathPrefix;
-        //Support repository-level metadata requests
-        repoKey = NamingUtils.stripMetadataFromPath(repoKey);
-        //Strip any matrix params
-        int paramsIdx = repoKey.indexOf(Properties.MATRIX_PARAMS_SEP);
-        if (paramsIdx > 0) {
-            repoKey = repoKey.substring(0, paramsIdx);
-        }
-        RepositoryService repositoryService = ContextHelper.get().getRepositoryService();
-        Set<String> allRepos = repositoryService.getAllRepoKeys();
-        try {
-            repoKey = URLDecoder.decode(repoKey, "utf-8");
-        } catch (UnsupportedEncodingException e) {
-            log.warn("Could not decode repo key '" + repoKey + "' in utf-8");
-            return false;
-        }
-        if (!allRepos.contains(repoKey)) {
-            if (warnIfRepoDoesNotExist) {
-                log.warn("Request " + servletPath + " should be a repo request and does not match any repo key");
-            }
-            return false;
-        }
-        return true;
-    }
-
-    public static boolean isWebdavRequest(HttpServletRequest request) {
-        if (!isRepoRequest(request)) {
-            return false;
-        }
-        if (WebdavService.WEBDAV_METHODS.contains(request.getMethod().toLowerCase(Locale.ENGLISH))) {
-            return true;
-        }
-        String wagonProvider = request.getHeader("X-wagon-provider");
-        return wagonProvider != null && wagonProvider.contains("webdav");
-    }
-
-    public static boolean isUiRequest(HttpServletRequest request) {
-        if (isWebdavRequest(request)) {
-            return false;
-        }
-        String pathPrefix = PathUtils.getFirstPathElement(getServletPathFromRequest(request));
-        return isUiPathPrefix(pathPrefix);
-    }
-
-    public static boolean isUiPathPrefix(String pathPrefix) {
-        if (UI_PATH_PREFIXES.contains(pathPrefix)) {
-            return true;
-        }
-        if (NON_UI_PATH_PREFIXES.contains(pathPrefix)) {
-            return false;
-        }
-        return false;
-    }
-
-    public static boolean isReservedName(String pathPrefix) {
-        return !(UI_PATH_PREFIXES.parallelStream().filter(pathPrefix::equalsIgnoreCase).count() == 0
-                && (NON_UI_PATH_PREFIXES.parallelStream().filter(pathPrefix::equalsIgnoreCase).count() == 0)
-                && !"list".equalsIgnoreCase(pathPrefix));
-    }
-
-    public static boolean isAuthHeaderPresent(HttpServletRequest request) {
-        String header = request.getHeader("Authorization");
-        if (header != null && header.startsWith("Basic ")) {
-            String auth = header.substring(6);
-            return !"Og==".equals(auth);
-        }
-
-        return false;
-    }
-
-    public static Authentication getAuthentication(HttpServletRequest request) {
-        HttpSession session = request.getSession(false);
-        if (session == null) {
-            return null;
-        }
-        return (Authentication) session.getAttribute(LAST_USER_KEY);
-    }
-
-    public static boolean setAuthentication(HttpServletRequest request, Authentication authentication,
-            boolean createSession) {
-        HttpSession session = request.getSession(createSession);
-        if (session == null) {
-            return false;
-        }
-        session.setAttribute(LAST_USER_KEY, authentication);
-        return true;
-    }
-
-    public static void removeAuthentication(HttpServletRequest request) {
-        HttpSession session = request.getSession(false);
-        if (session != null) {
-            session.removeAttribute(LAST_USER_KEY);
-        }
-    }
-
-    /**
-     * Returns the un-decoded servlet path from the request
-     *
-     * @param req The received request
-     * @return String - Servlet path
-     */
-    public static String getServletPathFromRequest(HttpServletRequest req) {
-        String contextPath = req.getContextPath();
-        if (StringUtils.isBlank(contextPath)) {
-            return req.getRequestURI();
-        }
-        return req.getRequestURI().substring(contextPath.length());
-    }
-
-    /**
-     * @param servletContext The servlet context
-     * @return The artifactory spring context
-     */
-    public static ArtifactoryContext getArtifactoryContext(ServletContext servletContext) {
-        return (ArtifactoryContext) servletContext.getAttribute(ArtifactoryContext.APPLICATION_CONTEXT_KEY);
-    }
-
-
-    /**
-     * Extract the username out of the request, by checking the the header for the {@code Authorization} and then if it
-     * starts with {@code Basic} get it as a base 64 token and decode it.
-     *
-     * @param request The request to examine
-     * @return The extracted username
-     * @throws UnsupportedEncodingException If UTF-8 is not supported.
-     */
-    public static String extractUsernameFromRequest(ServletRequest request)
-            throws UnsupportedEncodingException {
-        String header = ((HttpServletRequest) request).getHeader("Authorization");
-        if ((header != null) && header.startsWith("Basic ")) {
-            String token;
-            byte[] base64Token;
-            try {
-                base64Token = header.substring(6).getBytes(DEFAULT_ENCODING);
-                token = new String(org.apache.commons.codec.binary.Base64.decodeBase64(base64Token), DEFAULT_ENCODING);
-            } catch (UnsupportedEncodingException e) {
-                log.info("the encoding is not supported");
-                return EMPTY;
-            }
-            String username = EMPTY;
-            int delim = token.indexOf(':');
-            if (delim != -1) {
-                username = token.substring(0, delim);
-            }
-            return username;
-        }
-        return EMPTY;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/util/UrlValidator.java b/base/common/src/main/java/org/artifactory/util/UrlValidator.java
deleted file mode 100644
index 1ea97ac..0000000
--- a/base/common/src/main/java/org/artifactory/util/UrlValidator.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package org.artifactory.util;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpHost;
-import org.apache.http.client.utils.URIBuilder;
-import org.apache.http.client.utils.URIUtils;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.Arrays;
-
-/**
- * Created by michaelp on 6/16/15.
- */
-public class UrlValidator {
-
-    private final String[] allowedSchemes;
-
-    /**
-     * Creates new URI validator.
-     *
-     * @param allowedSchemes List of allowed uri schemes (http, ldap, etc.). If empty all schemes are allowed.
-     */
-    public UrlValidator(String... allowedSchemes) {
-        this.allowedSchemes = allowedSchemes;
-    }
-
-    /**
-     * @return allowed schemes
-     */
-    public String[] getAllowedSchemes() {
-        return allowedSchemes;
-    }
-
-    /**
-     * Validates URI
-     *
-     * @param url
-     * @throws UrlValidationException is thrown when URL is in illegal form.
-     */
-    public void validate(String url) throws UrlValidationException {
-
-        if (!PathUtils.hasText(url)) {
-            throw new RuntimeException("The URL cannot be empty");
-        }
-
-        try {
-            URI parsedUri = new URIBuilder(url).build();
-            String scheme = parsedUri.getScheme();
-            if (!isAnySchemaAllowed() && StringUtils.isBlank(scheme)) {
-
-                throw new UrlValidationException(String.format(
-                        "Url scheme cannot be empty. The following schemes are allowed: %s. " +
-                                "For example: %s://host",
-                        Arrays.asList(allowedSchemes), allowedSchemes[0]
-                ));
-
-
-            } else if (!isAllowedSchema(scheme)) {
-                throw new UrlValidationException(String.format(
-                        "Scheme '%s' is not allowed. The following schemes are allowed: %s",
-                        scheme, Arrays.asList(allowedSchemes)));
-            }
-
-            HttpHost host = URIUtils.extractHost(parsedUri);
-            if (host == null) {
-                throw new UrlValidationException("Cannot resolve host from url: " + url);
-            }
-        } catch (URISyntaxException e) {
-            throw new UrlValidationException(String.format("'%s' is not a valid url", url));
-        }
-    }
-
-    /**
-     * Allowed schemas
-     *
-     * @param scheme
-     * @return boolean
-     */
-    public boolean isAllowedSchema(String scheme) {
-        if (isAnySchemaAllowed()) {
-            return true;
-        }
-
-        for (String allowedScheme : allowedSchemes) {
-            if (allowedScheme.equalsIgnoreCase(scheme)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Checks if any schema allowed
-     *
-     * @return boolean
-     */
-    public boolean isAnySchemaAllowed() {
-        return allowedSchemes == null || allowedSchemes.length == 0;
-    }
-
-    /**
-     * Raised on validation error
-     */
-    public class UrlValidationException extends Exception {
-        /**
-         * @param message validation error
-         */
-        public UrlValidationException(String message) {
-            super(message);
-        }
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/util/ZipUtils.java b/base/common/src/main/java/org/artifactory/util/ZipUtils.java
deleted file mode 100644
index 71db489..0000000
--- a/base/common/src/main/java/org/artifactory/util/ZipUtils.java
+++ /dev/null
@@ -1,543 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Sets;
-import org.apache.commons.compress.archivers.ArchiveEntry;
-import org.apache.commons.compress.archivers.ArchiveInputStream;
-import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
-import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
-import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
-import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
-import org.apache.commons.io.FilenameUtils;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.archive.ArchiveType;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.sapi.fs.VfsFile;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nullable;
-import java.io.*;
-import java.util.Date;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-
-/**
- * A utility class to perform different archive related actions
- *
- * @author Noam Tenne
- */
-public abstract class ZipUtils {
-    private static final Logger log = LoggerFactory.getLogger(ZipUtils.class);
-
-    /**
-     * Archives the contents of the given directory into the given archive using the apache commons compress tools
-     *
-     * @param sourceDirectory    Directory to archive
-     * @param destinationArchive Archive file to create
-     * @param recurse            True if should recurse file scan of source directory. False if not
-     * @throws IOException              Any exceptions that might occur while handling the given files and used streams
-     * @throws IllegalArgumentException Thrown when given invalid destinations
-     * @see ArchiveUtils#archive(java.io.File, java.io.File, boolean, org.artifactory.api.archive.ArchiveType)
-     */
-    public static void archive(File sourceDirectory, File destinationArchive, boolean recurse)
-            throws IOException {
-        ArchiveUtils.archive(sourceDirectory, destinationArchive, recurse, ArchiveType.ZIP);
-    }
-
-    /**
-     * Extracts the given archive file into the given directory
-     *
-     * @param sourceArchive        Archive to extract
-     * @param destinationDirectory Directory to extract achive to
-     * @throws Exception                Any exception which are thrown
-     * @throws IllegalArgumentException Thrown when given invalid destinations
-     * @throws Exception                Thrown when any error occures while extracting
-     */
-    public static void extract(File sourceArchive, File destinationDirectory) throws Exception {
-        if ((sourceArchive == null) || (destinationDirectory == null)) {
-            throw new IllegalArgumentException("Supplied destinations cannot be null.");
-        }
-        if (!sourceArchive.isFile()) {
-            throw new IllegalArgumentException("Supplied source archive must be an existing file.");
-        }
-        String sourcePath = sourceArchive.getAbsolutePath();
-        String destinationPath = destinationDirectory.getAbsolutePath();
-        log.debug("Beginning extraction of '{}' into '{}'", sourcePath, destinationPath);
-        extractFiles(sourceArchive, destinationDirectory.getCanonicalFile());
-        log.debug("Completed extraction of '{}' into '{}'", sourcePath, destinationPath);
-    }
-
-    /**
-     * @param zis       The zip input stream
-     * @param entryPath The entry path to search for
-     * @return The entry if found, null otherwise
-     * @throws IOException On failure to read the stream
-     * @see ZipUtils#locateEntry(java.util.zip.ZipInputStream, java.lang.String, java.util.List<java.lang.String>)
-     */
-    public static ArchiveEntry locateArchiveEntry(ArchiveInputStream zis, String entryPath) throws IOException {
-        return locateArchiveEntry(zis, entryPath, null);
-    }
-
-    /**
-     * @param zis       The zip input stream
-     * @param entryPath The entry path to search for
-     * @return The entry if found, null otherwise
-     * @throws IOException On failure to read the stream
-     * @see ZipUtils#locateEntry(java.util.zip.ZipInputStream, java.lang.String, java.util.List<java.lang.String>)
-     */
-    public static ZipEntry locateEntry(ZipInputStream zis, String entryPath) throws IOException {
-        return locateEntry(zis, entryPath, null);
-    }
-
-
-    /**
-     * Searches for an entry inside the zip stream by entry path. If there are alternative extensions, will also look
-     * for entry with alternative extension. The search stops reading the stream when the entry is found, so calling
-     * read on the stream will read the returned entry. <p/>
-     * The zip input stream doesn't support mark/reset so once this method is used you cannot go back - either the
-     * stream was fully read (when entry is not found) or the stream was read until the current entry.
-     *
-     * @param zis                   The zip input stream
-     * @param entryPath             The entry path to search for
-     * @param alternativeExtensions List of alternative file extensions to try if the main entry path is not found.
-     * @return The entry if found, null otherwise
-     * @throws IOException On failure to read the stream
-     */
-    public static ZipEntry locateEntry(ZipInputStream zis, String entryPath, List<String> alternativeExtensions)
-            throws IOException {
-        ZipEntry zipEntry;
-        while ((zipEntry = zis.getNextEntry()) != null) {
-            String zipEntryName = zipEntry.getName();
-            if (zipEntryName.equals(entryPath)) {
-                return zipEntry;
-            } else if (alternativeExtensions != null) {
-                String basePath = PathUtils.stripExtension(entryPath);
-                for (String alternativeExtension : alternativeExtensions) {
-                    String alternativeSourcePath = basePath + "." + alternativeExtension;
-                    if (zipEntryName.equals(alternativeSourcePath)) {
-                        return zipEntry;
-                    }
-                }
-            }
-        }
-        return null;
-    }
-
-
-    /**
-     * Searches for an entry inside the zip stream by entry path. If there are alternative extensions, will also look
-     * for entry with alternative extension. The search stops reading the stream when the entry is found, so calling
-     * read on the stream will read the returned entry. <p/>
-     * The zip input stream doesn't support mark/reset so once this method is used you cannot go back - either the
-     * stream was fully read (when entry is not found) or the stream was read until the current entry.
-     *
-     * @param zis                   The ar input stream
-     * @param entryPath             The entry path to search for
-     * @param alternativeExtensions List of alternative file extensions to try if the main entry path is not found.
-     * @return The entry if found, null otherwise
-     * @throws IOException On failure to read the stream
-     */
-    public static ArchiveEntry locateArchiveEntry(ArchiveInputStream zis, String entryPath,
-            List<String> alternativeExtensions)
-            throws IOException {
-        ArchiveEntry archiveEntry;
-        while ((archiveEntry = zis.getNextEntry()) != null) {
-            String zipEntryName = archiveEntry.getName();
-            if (zipEntryName.equals(entryPath)) {
-                return archiveEntry;
-            } else if (alternativeExtensions != null) {
-                String basePath = PathUtils.stripExtension(entryPath);
-                for (String alternativeExtension : alternativeExtensions) {
-                    String alternativeSourcePath = basePath + "." + alternativeExtension;
-                    if (zipEntryName.equals(alternativeSourcePath)) {
-                        return archiveEntry;
-                    }
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Extracts the given archive file into the given directory
-     *
-     * @param sourceArchive        Archive to extract
-     * @param destinationDirectory Directory to extract archive to
-     */
-    private static void extractFiles(File sourceArchive, File destinationDirectory) {
-        ArchiveInputStream archiveInputStream = null;
-        try {
-            archiveInputStream = createArchiveInputStream(sourceArchive);
-            extractFiles(archiveInputStream, destinationDirectory);
-        } catch (IOException ioe) {
-            throw new RuntimeException("Error while extracting " + sourceArchive.getPath(), ioe);
-        } finally {
-            IOUtils.closeQuietly(archiveInputStream);
-        }
-    }
-
-    public static void extractFiles(ArchiveInputStream archiveInputStream, File destinationDirectory) throws IOException {
-        ArchiveEntry entry;
-        while ((entry = archiveInputStream.getNextEntry()) != null) {
-            //Validate entry name before extracting
-            String validatedEntryName = validateEntryName(entry.getName());
-
-            if (StringUtils.isNotBlank(validatedEntryName)) {
-                // ZipArchiveEntry does not carry relevant info
-                // for symlink identification, thus it not supported
-                // at this stage
-                if (!entry.isDirectory() && entry instanceof TarArchiveEntry
-                        && ((TarArchiveEntry) entry).isSymbolicLink()) {
-                    extractTarSymLink(destinationDirectory, (TarArchiveEntry) entry);
-                } else {
-                    extractFile("", destinationDirectory, archiveInputStream, validatedEntryName,
-                            entry.getLastModifiedDate(), entry.isDirectory());
-                }
-            }
-        }
-    }
-
-    /**
-     * TarArchiveEntry does not recognize soft link attributes
-     * on file decompression and extracts it as ordinal file,
-     * this method is manual symlink reconstruction
-     *
-     * @param dir destination directory
-     * @param entry {@link TarArchiveEntry} entry to create symlink from
-     */
-    private static void extractTarSymLink(File dir, TarArchiveEntry entry) {
-        if(com.google.common.base.Strings.isNullOrEmpty(entry.getLinkName())) {
-            log.warn(String.format(
-                            "Symbolic link '%s' is malformed, ignoring it ...",
-                            entry.getName()
-                    ));
-            return;
-        }
-        File linkFile = org.codehaus.plexus.util.FileUtils.resolveFile(dir, entry.getName());
-        // we have no clear way in link to understand if link target path is from cwd
-        // or from root other than checking if link path starts with pathSeparator
-        String linkTarget = entry.getLinkName().startsWith(File.separator) ?
-                entry.getLinkName()
-                :
-                linkFile.getParentFile().getPath() + File.separator +  entry.getLinkName();
-        try {
-            File targetCanonicalFile = new File(linkTarget).getCanonicalFile();
-            if (!targetCanonicalFile.getPath().startsWith(dir.getPath())) {
-                log.warn(String.format(
-                        "Symlink '%s' is trying to access outer filesystem, ignoring it ...",
-                        linkFile.getName()
-                    )
-                );
-                log.debug(String.format(
-                                "Symlink '{}' attempted to access outer filesystem '{}'",
-                                linkFile.getName(),
-                                targetCanonicalFile.getPath()
-                        )
-                );
-                return;
-            } else if (!targetCanonicalFile.exists()) {
-                // we cannot assume that file not exist at this point
-                // as the order of extracted content is unpredictable,
-                // i.e we may process symlink before actual file is get
-                // extracted
-                log.debug(String.format(
-                                "Symlink '{}' is referring non existent file '{}', " +
-                                        "either it not exist or not extracted yet",
-                                linkFile.getName(),
-                                targetCanonicalFile.getPath()
-                        )
-                );
-            }
-            log.debug("Creating symlink '{}' to {}", linkFile.getPath(), targetCanonicalFile.getPath());
-            java.nio.file.Files.createSymbolicLink(linkFile.toPath(), targetCanonicalFile.toPath());
-        } catch (IOException | UnsupportedOperationException e) {
-            log.error("Creating symlink has failed, " + e.getMessage());
-            log.debug("Cause: {}", e);
-        }
-    }
-
-    /**
-     * get archive input stream from File Object
-     *
-     * @param sourceArchive - archive File
-     * @return archive input stream
-     * @throws IOException
-     */
-    private static ArchiveInputStream createArchiveInputStream(File sourceArchive) throws IOException {
-        String fileName = sourceArchive.getName();
-        String extension = PathUtils.getExtension(fileName);
-        verifySupportedExtension(extension);
-        FileInputStream fis = new FileInputStream(sourceArchive);
-        ArchiveInputStream archiveInputStream = returnArchiveInputStream(fis, extension);
-        if (archiveInputStream != null) {
-            return archiveInputStream;
-        }
-        throw new IllegalArgumentException("Unsupported archive extension: '" + extension + "'");
-    }
-
-    /**
-     *  get archive input stream from VfsFile Object
-     * @param file - archive vfs file
-     * @return archive input stream
-     * @throws IOException
-     */
-    public static ArchiveInputStream getArchiveInputStream(VfsFile file) throws IOException {
-        String archiveSuffix = file.getPath().toLowerCase();
-        ArchiveInputStream archiveInputStream = returnArchiveInputStream(file.getStream(), archiveSuffix);
-            return archiveInputStream;
-        }
-
-    /**
-     * return archive input stream
-     *
-     * @param inputStream - file  input Stream
-     * @param archiveSuffix   - archive suffix
-     * @return archive input stream
-     * @throws IOException
-     */
-    public static ArchiveInputStream returnArchiveInputStream(InputStream inputStream, String archiveSuffix)
-            throws IOException {
-        if (isZipFamilyArchive(archiveSuffix)) {
-            return new ZipArchiveInputStream(inputStream);
-        }
-
-        if (isTarArchive(archiveSuffix)) {
-            return new TarArchiveInputStream(inputStream);
-        }
-
-        if (isTgzFamilyArchive(archiveSuffix) || isGzCompress(archiveSuffix)) {
-            return new TarArchiveInputStream(new GzipCompressorInputStream(inputStream));
-        }
-        return new ZipArchiveInputStream(inputStream);
-    }
-
-    /**
-     * get archive input stream array
-     * @param file - file archive
-     * @param length - length of array
-     * @return  -array of archive input stream
-     * @throws IOException
-     */
-    public static ArchiveInputStream[] getArchiveInputStreamArray(String file, int length) throws IOException {
-        String archiveSuffix = file.toLowerCase();
-        if (isZipFamilyArchive(archiveSuffix)) {
-            return new ZipArchiveInputStream[length];
-        }
-        if (isTarArchive(archiveSuffix) || isTgzFamilyArchive(archiveSuffix)) {
-            return new TarArchiveInputStream[length];
-        }
-        return new ZipArchiveInputStream[length];
-    }
-
-    /**
-     * is file suffix related to gz compress
-     *
-     * @param archiveSuffix - archive file suffix
-     * @return
-     */
-    private static boolean isGzCompress(String archiveSuffix) {
-        return archiveSuffix.equals("gz");
-    }
-
-    /**
-     * is file suffix related to tar archive
-     *
-     * @param archiveSuffix - archive suffix
-     * @return
-     */
-    private static boolean isTarArchive(String archiveSuffix) {
-        return archiveSuffix.endsWith("tar");
-    }
-
-    private static boolean isTgzFamilyArchive(String archiveSuffix) {
-        return archiveSuffix.endsWith("tar.gz") || archiveSuffix.endsWith("tgz");
-    }
-
-    private static boolean isZipFamilyArchive(String archiveSuffix) {
-        return archiveSuffix.endsWith("zip") || archiveSuffix.endsWith("jar") || archiveSuffix.toLowerCase().endsWith(
-                "nupkg") || archiveSuffix.endsWith("war");
-    }
-
-    private static void verifySupportedExtension(String extension) {
-        Set<String> supportedExtensions = Sets.newHashSet();
-        try {
-            String supportedExtensionsNames = ConstantValues.requestExplodedArchiveExtensions.getString();
-            supportedExtensions = Sets.newHashSet(
-                    Iterables.transform(Sets.newHashSet(StringUtils.split(supportedExtensionsNames, ",")),
-                            new Function<String, String>() {
-                                @Override
-                                public String apply(@Nullable String input) {
-                                    String result = StringUtils.isBlank(input) ? input : StringUtils.trim(input);
-                                    return StringUtils.equals(result, "tar.gz") ? "gz" : result;
-                                }
-                            }
-                    )
-            );
-        } catch (Exception e) {
-            log.error("Failed to parse global default excludes. Using default values: " + e.getMessage());
-        }
-
-        if (StringUtils.isBlank(extension) || !supportedExtensions.contains(extension)) {
-            throw new IllegalArgumentException("Unsupported archive extension: '" + extension + "'");
-        }
-    }
-
-    /**
-     * Extracts the given zip entry
-     *
-     * @param sourcePath           Path of archive that is being extracted
-     * @param destinationDirectory Extracted file destination
-     * @param zipInputStream       Input stream of archive
-     * @param entryName            Entry to extract
-     * @param entryDate            Last modification date of zip entry
-     * @param isEntryDirectory     Indication if the entry is a directory or not
-     * @throws IOException
-     */
-    private static void extractFile(String sourcePath, File destinationDirectory, InputStream zipInputStream,
-            String entryName, Date entryDate, boolean isEntryDirectory) throws IOException {
-
-        File resolvedEntryFile = org.codehaus.plexus.util.FileUtils.resolveFile(destinationDirectory, entryName);
-        try {
-            File parentFile = resolvedEntryFile.getParentFile();
-
-            //If the parent file isn't null, attempt to create it because it might not exist
-            if (parentFile != null) {
-                parentFile.mkdirs();
-            }
-
-            if (isEntryDirectory) {
-                //Create directory entry
-                resolvedEntryFile.mkdirs();
-            } else {
-                //Extract file entry
-                byte[] buffer = new byte[1024];
-                int length;
-                FileOutputStream fileOutputStream = null;
-                try {
-                    fileOutputStream = new FileOutputStream(resolvedEntryFile);
-
-                    while ((length = zipInputStream.read(buffer)) >= 0) {
-                        fileOutputStream.write(buffer, 0, length);
-                    }
-                } finally {
-                    IOUtils.closeQuietly(fileOutputStream);
-                }
-            }
-
-            //Preserve last modified date
-            resolvedEntryFile.setLastModified(entryDate.getTime());
-        } catch (FileNotFoundException ex) {
-            throw new RuntimeException("Can't extract file " + sourcePath, ex);
-        }
-    }
-
-    /**
-     * Validates the given entry name by removing different slashes that might appear in the begining of the name and
-     * any occurences of relative paths like "../", so we can protect from path traversal attacks
-     *
-     * @param entryName Name of zip entry
-     */
-    private static String validateEntryName(String entryName) {
-        entryName = FilenameUtils.separatorsToUnix(entryName);
-        entryName = PathUtils.trimLeadingSlashes(entryName);
-        entryName = removeDotSegments(entryName);
-
-        return entryName;
-    }
-
-    //"Borrowed" from com.sun.jersey.server.impl.uri.UriHelper
-    // alg taken from http://gbiv.com/protocols/uri/rfc/rfc3986.html#relative-dot-segments
-    // the alg works as follows:
-    //       1. The input buffer is initialized with the now-appended path components and the output buffer is initialized to the empty string.
-    //   2. While the input buffer is not empty, loop as follows:
-    //         A. If the input buffer begins with a prefix of "../" or "./", then remove that prefix from the input buffer; otherwise,
-    //         B. if the input buffer begins with a prefix of "/./"
-    //            or "/.", where "." is a complete path segment, then replace that prefix with "/" in the input buffer; otherwise,
-    //         C. if the input buffer begins with a prefix of "/../"
-    //            or "/..", where ".." is a complete path segment,
-    //            then replace that prefix with "/" in the input buffer and remove the last segment and its preceding "/" (if any) from the output buffer; otherwise,
-    //         D. if the input buffer consists only of "." or "..", then remove that from the input buffer; otherwise,
-    //         E. move the first path segment in the input buffer to the end of the output buffer,
-    //            including the initial "/" character (if any) and any subsequent characters up to, but not including,
-    //            the next "/" character or the end of the input buffer.
-    //   3. Finally, the output buffer is returned as the result of remove_dot_segments.
-
-    @SuppressWarnings({"OverlyComplexMethod"})
-    private static String removeDotSegments(String path) {
-
-        if (null == path) {
-            return null;
-        }
-
-        List<String> outputSegments = new LinkedList<>();
-
-        while (path.length() > 0) {
-            if (path.startsWith("../")) {   // rule 2A
-                path = PathUtils.trimLeadingSlashes(path.substring(3));
-            } else if (path.startsWith("./")) { // rule 2A
-                path = PathUtils.trimLeadingSlashes(path.substring(2));
-            } else if (path.startsWith("/./")) { // rule 2B
-                path = "/" + PathUtils.trimLeadingSlashes(path.substring(3));
-            } else if ("/.".equals(path)) { // rule 2B
-                path = "/";
-            } else if (path.startsWith("/../")) { // rule 2C
-                path = "/" + PathUtils.trimLeadingSlashes(path.substring(4));
-                if (!outputSegments.isEmpty()) { // removing last segment if any
-                    outputSegments.remove(outputSegments.size() - 1);
-                }
-            } else if ("/..".equals(path)) { // rule 2C
-                path = "/";
-                if (!outputSegments.isEmpty()) { // removing last segment if any
-                    outputSegments.remove(outputSegments.size() - 1);
-                }
-            } else if ("..".equals(path) || ".".equals(path)) { // rule 2D
-                path = "";
-            } else { // rule E
-                int slashStartSearchIndex;
-                if (path.startsWith("/")) {
-                    path = "/" + PathUtils.trimLeadingSlashes(path.substring(1));
-                    slashStartSearchIndex = 1;
-                } else {
-                    slashStartSearchIndex = 0;
-                }
-                int segLength = path.indexOf('/', slashStartSearchIndex);
-                if (-1 == segLength) {
-                    segLength = path.length();
-                }
-                outputSegments.add(path.substring(0, segLength));
-                path = path.substring(segLength);
-            }
-        }
-
-        StringBuffer result = new StringBuffer();
-        for (String segment : outputSegments) {
-            result.append(segment);
-        }
-
-        return result.toString();
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/util/bearer/BearerScheme.java b/base/common/src/main/java/org/artifactory/util/bearer/BearerScheme.java
deleted file mode 100644
index cf1f560..0000000
--- a/base/common/src/main/java/org/artifactory/util/bearer/BearerScheme.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.artifactory.util.bearer;
-
-import org.apache.http.Header;
-import org.apache.http.HttpRequest;
-import org.apache.http.auth.AUTH;
-import org.apache.http.auth.AuthenticationException;
-import org.apache.http.auth.Credentials;
-import org.apache.http.impl.auth.RFC2617Scheme;
-import org.apache.http.message.BufferedHeader;
-import org.apache.http.protocol.BasicHttpContext;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.util.CharArrayBuffer;
-import org.artifactory.addon.docker.rest.DockerRemoteTokenProvider;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.repo.distribution.auth.BintrayTokenProvider;
-
-import java.util.Optional;
-
-/**
- * Bearer authentication scheme as defined in RFC 2617
- *
- * @author Shay Yaakov
- */
-public class BearerScheme extends RFC2617Scheme {
-    private String repoKey;
-    private TokenProvider tokenProvider;
-
-    public BearerScheme(String repoKey) {
-        this.repoKey = repoKey;
-        tokenProvider = getTokenProviderByRepoType(repoKey);
-    }
-
-    @Override
-    public String getSchemeName() {
-        return "bearer";
-    }
-
-    @Override
-    public boolean isConnectionBased() {
-        return false;
-    }
-
-    @Override
-    public boolean isComplete() {
-        return true;
-    }
-
-    @Override
-    public Header authenticate(Credentials dummyCredentials, HttpRequest request) throws AuthenticationException {
-        return authenticate(dummyCredentials, request, new BasicHttpContext());
-    }
-
-    @Override
-    public Header authenticate(Credentials dummyCredentials, HttpRequest request, HttpContext context)
-            throws AuthenticationException {
-        String token = tokenProvider.getToken(getParameters(),
-                request.getRequestLine().getMethod(),
-                request.getRequestLine().getUri(),
-                repoKey);
-        final CharArrayBuffer buffer = new CharArrayBuffer(32);
-        buffer.append(AUTH.WWW_AUTH_RESP);
-        buffer.append(": Bearer ");
-        buffer.append(token);
-        return new BufferedHeader(buffer);
-    }
-
-    private TokenProvider getTokenProviderByRepoType(String repoKey) {
-        TokenProvider provider;
-        RepoType type = Optional.ofNullable(ContextHelper.get().beanForType(RepositoryService.class)
-                .repoDescriptorByKey(repoKey))
-                .orElseThrow(() -> new RuntimeException("No such repository " + repoKey))
-                .getType();
-        switch (type) {
-            case Distribution:
-                provider = ContextHelper.get().beanForType(BintrayTokenProvider.class);
-                break;
-            case Docker:
-                provider = ContextHelper.get().beanForType(DockerRemoteTokenProvider.class);
-                break;
-            default:
-                throw new IllegalArgumentException("Token Authentication is not available for repositories of type "
-                        + type);
-        }
-        return provider;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/util/bearer/BearerSchemeFactory.java b/base/common/src/main/java/org/artifactory/util/bearer/BearerSchemeFactory.java
deleted file mode 100644
index 96867ca..0000000
--- a/base/common/src/main/java/org/artifactory/util/bearer/BearerSchemeFactory.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.artifactory.util.bearer;
-
-import org.apache.http.auth.AuthScheme;
-import org.apache.http.auth.AuthSchemeProvider;
-import org.apache.http.protocol.HttpContext;
-
-/**
- * {@link AuthSchemeProvider} implementation that creates and initializes {@link BearerScheme} instances
- *
- * @author Shay Yaakov
- */
-public class BearerSchemeFactory implements AuthSchemeProvider {
-
-    private String repoKey;
-
-    public BearerSchemeFactory(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    @Override
-    public AuthScheme create(HttpContext context) {
-        return new BearerScheme(repoKey);
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/util/bearer/BintrayBearerPreemptiveAuthInterceptor.java b/base/common/src/main/java/org/artifactory/util/bearer/BintrayBearerPreemptiveAuthInterceptor.java
deleted file mode 100644
index f8bd695..0000000
--- a/base/common/src/main/java/org/artifactory/util/bearer/BintrayBearerPreemptiveAuthInterceptor.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.util.bearer;
-
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpRequestInterceptor;
-import org.apache.http.auth.AuthState;
-import org.apache.http.auth.UsernamePasswordCredentials;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.protocol.HttpContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-
-/**
- * Interceptor that preemptively acquires the Bintray OAuth token and attaches it to the request
- * Needed because Bintray's default www-authenticate response is Basic and therefore the client can't
- * authenticate with Bearer auth automatically.
- *
- * @author Dan Feldman
- */
-public class BintrayBearerPreemptiveAuthInterceptor implements HttpRequestInterceptor {
-    private static final Logger log = LoggerFactory.getLogger(BintrayBearerPreemptiveAuthInterceptor.class);
-
-    private String repoKey;
-
-    public BintrayBearerPreemptiveAuthInterceptor(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    @Override
-    public void process(HttpRequest request, HttpContext context) throws HttpException, IOException {
-        HttpClientContext clientContext = HttpClientContext.adapt(context);
-        AuthState authState = clientContext.getTargetAuthState();
-
-        // If there's no auth scheme available yet, try to initialize it preemptively
-        if (authState.getAuthScheme() == null) {
-            HttpHost targetHost = clientContext.getTargetHost();
-            log.debug("Updating bearer credentials for Bintray host " + targetHost);
-            //Bintray token provider only needs repo key to work so dummy is ok here
-            authState.update(new BearerScheme(repoKey), new UsernamePasswordCredentials("dummy", "dummy"));
-        }
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/util/bearer/TokenProvider.java b/base/common/src/main/java/org/artifactory/util/bearer/TokenProvider.java
deleted file mode 100644
index 2ddb6af..0000000
--- a/base/common/src/main/java/org/artifactory/util/bearer/TokenProvider.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.artifactory.util.bearer;
-
-import java.util.Map;
-
-/**
- * Provides a bearer token to be used by {@link BearerScheme}
- *
- * @author Shay Yaakov
- */
-public interface TokenProvider {
-
-    String getToken(Map<String, String> challengeParams, String method, String uri, String repoKey);
-}
diff --git a/base/common/src/main/java/org/artifactory/util/dateUtils/DateUtils.java b/base/common/src/main/java/org/artifactory/util/dateUtils/DateUtils.java
deleted file mode 100644
index ac35e7f..0000000
--- a/base/common/src/main/java/org/artifactory/util/dateUtils/DateUtils.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.artifactory.util.dateUtils;
-
-import org.jfrog.build.api.Build;
-
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-/**
- * @author Chen Keinan
- */
-public class DateUtils {
-
-    /**
-     * format Build date
-     *
-     * @param time - long date
-     * @return
-     * @throws ParseException
-     */
-    public static String formatBuildDate(long time) throws ParseException {
-        Date date = new Date(time);
-        SimpleDateFormat df2 = new SimpleDateFormat(Build.STARTED_FORMAT);
-        String dateText = df2.format(date);
-        return dateText;
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/util/encodeing/URI.java b/base/common/src/main/java/org/artifactory/util/encodeing/URI.java
deleted file mode 100644
index 08b56f2..0000000
--- a/base/common/src/main/java/org/artifactory/util/encodeing/URI.java
+++ /dev/null
@@ -1,1203 +0,0 @@
-/*
- * $HeadURL: https://svn.apache.org/repos/asf/jakarta/httpcomponents/oac.hc3x/tags/HTTPCLIENT_3_1/src/java/org/apache/commons/httpclient/URI.java $
- * $Revision: 564973 $
- * $Date: 2007-08-11 22:51:47 +0200 (Sat, 11 Aug 2007) $
- *
- * ====================================================================
- *
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-/*
- * Based on apache-httpclient 3.1 org.apache.commons.httpclient.URI.java
- * Additional contributors:
- *    JFrog Ltd.
- */
-package org.artifactory.util.encodeing;
-
-import org.apache.commons.codec.DecoderException;
-import org.apache.commons.codec.net.URLCodec;
-import org.apache.http.HttpException;
-import org.apache.http.util.EncodingUtils;
-
-import java.util.BitSet;
-
-/**
- * The interface for the URI(Uniform Resource Identifiers) version of RFC 2396.
- * This class has the purpose of supporting of parsing a URI reference to
- * extend any specific protocols, the character encoding of the protocol to
- * be transported and the charset of the document.
- * <p/>
- * A URI is always in an "escaped" form, since escaping or unescaping a
- * completed URI might change its semantics.
- * <p/>
- * Implementers should be careful not to escape or unescape the same string
- * more than once, since unescaping an already unescaped string might lead to
- * misinterpreting a percent data character as another escaped character,
- * or vice versa in the case of escaping an already escaped string.
- * <p/>
- * In order to avoid these problems, data types used as follows:
- * <p><blockquote><pre>
- *   URI character sequence: char
- *   octet sequence: byte
- *   original character sequence: String
- * </pre></blockquote><p>
- * <p/>
- * So, a URI is a sequence of characters as an array of a char type, which
- * is not always represented as a sequence of octets as an array of byte.
- * <p/>
- * <p/>
- * URI Syntactic Components
- * <p><blockquote><pre>
- * - In general, written as follows:
- *   Absolute URI = <scheme&gt:<scheme-specific-part>
- *   Generic URI = <scheme>://<authority><path>?<query>
- * <p/>
- * - Syntax
- *   absoluteURI   = scheme ":" ( hier_part | opaque_part )
- *   hier_part     = ( net_path | abs_path ) [ "?" query ]
- *   net_path      = "//" authority [ abs_path ]
- *   abs_path      = "/"  path_segments
- * </pre></blockquote><p>
- * <p/>
- * The following examples illustrate URI that are in common use.
- * <pre>
- * ftp://ftp.is.co.za/rfc/rfc1808.txt
- *    -- ftp scheme for File Transfer Protocol services
- * gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles
- *    -- gopher scheme for Gopher and Gopher+ Protocol services
- * http://www.math.uio.no/faq/compression-faq/part1.html
- *    -- http scheme for Hypertext Transfer Protocol services
- * mailto:mduerst at ifi.unizh.ch
- *    -- mailto scheme for electronic mail addresses
- * news:comp.infosystems.www.servers.unix
- *    -- news scheme for USENET news groups and articles
- * telnet://melvyl.ucop.edu/
- *    -- telnet scheme for interactive services via the TELNET Protocol
- * </pre>
- * Please, notice that there are many modifications from URL(RFC 1738) and
- * relative URL(RFC 1808).
- * <p/>
- * <b>The expressions for a URI</b>
- * <p><pre>
- * For escaped URI forms
- *  - URI(char[]) // constructor
- *  - char[] getRawXxx() // method
- *  - String getEscapedXxx() // method
- *  - String toString() // method
- * <p/>
- * For unescaped URI forms
- *  - URI(String) // constructor
- *  - String getXXX() // method
- * </pre><p>
- *
- * @author <a href="mailto:jericho at apache.org">Sung-Gu</a>
- * @author <a href="mailto:mbowler at GargoyleSoftware.com">Mike Bowler</a>
- * @version $Revision: 564973 $ $Date: 2002/03/14 15:14:01
- */
-public class URI {
-
-    /**
-     * The percent "%" character always has the reserved purpose of being the
-     * escape indicator, it must be escaped as "%25" in order to be used as
-     * data within a URI.
-     */
-    protected static final BitSet percent = new BitSet(256);
-
-    // Static initializer for percent
-    static {
-        percent.set('%');
-    }
-
-
-    /**
-     * BitSet for digit.
-     * <p><blockquote><pre>
-     * digit    = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" |
-     *            "8" | "9"
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet digit = new BitSet(256);
-
-    // Static initializer for digit
-    static {
-        for (int i = '0'; i <= '9'; i++) {
-            digit.set(i);
-        }
-    }
-
-
-    /**
-     * BitSet for alpha.
-     * <p><blockquote><pre>
-     * alpha         = lowalpha | upalpha
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet alpha = new BitSet(256);
-
-    // Static initializer for alpha
-    static {
-        for (int i = 'a'; i <= 'z'; i++) {
-            alpha.set(i);
-        }
-        for (int i = 'A'; i <= 'Z'; i++) {
-            alpha.set(i);
-        }
-    }
-
-
-    /**
-     * BitSet for alphanum (join of alpha & digit).
-     * <p><blockquote><pre>
-     *  alphanum      = alpha | digit
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet alphanum = new BitSet(256);
-
-    // Static initializer for alphanum
-    static {
-        alphanum.or(alpha);
-        alphanum.or(digit);
-    }
-
-
-    /**
-     * BitSet for hex.
-     * <p><blockquote><pre>
-     * hex           = digit | "A" | "B" | "C" | "D" | "E" | "F" |
-     *                         "a" | "b" | "c" | "d" | "e" | "f"
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet hex = new BitSet(256);
-
-    // Static initializer for hex
-    static {
-        hex.or(digit);
-        for (int i = 'a'; i <= 'f'; i++) {
-            hex.set(i);
-        }
-        for (int i = 'A'; i <= 'F'; i++) {
-            hex.set(i);
-        }
-    }
-
-
-    /**
-     * BitSet for escaped.
-     * <p><blockquote><pre>
-     * escaped       = "%" hex hex
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet escaped = new BitSet(256);
-
-    // Static initializer for escaped
-    static {
-        escaped.or(percent);
-        escaped.or(hex);
-    }
-
-
-    /**
-     * BitSet for mark.
-     * <p><blockquote><pre>
-     * mark          = "-" | "_" | "." | "!" | "~" | "*" | "'" |
-     *                 "(" | ")"
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet mark = new BitSet(256);
-
-    // Static initializer for mark
-    static {
-        mark.set('-');
-        mark.set('_');
-        mark.set('.');
-        mark.set('!');
-        mark.set('~');
-        mark.set('*');
-        mark.set('\'');
-        mark.set('(');
-        mark.set(')');
-    }
-
-
-    /**
-     * Data characters that are allowed in a URI but do not have a reserved
-     * purpose are called unreserved.
-     * <p><blockquote><pre>
-     * unreserved    = alphanum | mark
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet unreserved = new BitSet(256);
-
-    // Static initializer for unreserved
-    static {
-        unreserved.or(alphanum);
-        unreserved.or(mark);
-    }
-
-
-    /**
-     * BitSet for reserved.
-     * <p><blockquote><pre>
-     * reserved      = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
-     *                 "$" | ","
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet reserved = new BitSet(256);
-
-    // Static initializer for reserved
-    static {
-        reserved.set(';');
-        reserved.set('/');
-        reserved.set('?');
-        reserved.set(':');
-        reserved.set('@');
-        reserved.set('&');
-        reserved.set('=');
-        reserved.set('+');
-        reserved.set('$');
-        reserved.set(',');
-    }
-
-
-    /**
-     * BitSet for uric.
-     * <p><blockquote><pre>
-     * uric          = reserved | unreserved | escaped
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet uric = new BitSet(256);
-
-    // Static initializer for uric
-    static {
-        uric.or(reserved);
-        uric.or(unreserved);
-        uric.or(escaped);
-    }
-
-
-    /**
-     * BitSet for fragment (alias for uric).
-     * <p><blockquote><pre>
-     * fragment      = *uric
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet fragment = uric;
-
-
-    /**
-     * BitSet for query (alias for uric).
-     * <p><blockquote><pre>
-     * query         = *uric
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet query = uric;
-
-
-    /**
-     * BitSet for pchar.
-     * <p><blockquote><pre>
-     * pchar         = unreserved | escaped |
-     *                 ":" | "@" | "&" | "=" | "+" | "$" | ","
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet pchar = new BitSet(256);
-
-    // Static initializer for pchar
-    static {
-        pchar.or(unreserved);
-        pchar.or(escaped);
-        pchar.set(':');
-        pchar.set('@');
-        pchar.set('&');
-        pchar.set('=');
-        pchar.set('+');
-        pchar.set('$');
-        pchar.set(',');
-    }
-
-
-    /**
-     * BitSet for param (alias for pchar).
-     * <p><blockquote><pre>
-     * param         = *pchar
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet param = pchar;
-
-
-    /**
-     * BitSet for segment.
-     * <p><blockquote><pre>
-     * segment       = *pchar *( ";" param )
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet segment = new BitSet(256);
-
-    // Static initializer for segment
-    static {
-        segment.or(pchar);
-        segment.set(';');
-        segment.or(param);
-    }
-
-
-    /**
-     * BitSet for path segments.
-     * <p><blockquote><pre>
-     * path_segments = segment *( "/" segment )
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet path_segments = new BitSet(256);
-
-    // Static initializer for path_segments
-    static {
-        path_segments.set('/');
-        path_segments.or(segment);
-    }
-
-
-    /**
-     * URI absolute path.
-     * <p><blockquote><pre>
-     * abs_path      = "/"  path_segments
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet abs_path = new BitSet(256);
-
-    // Static initializer for abs_path
-    static {
-        abs_path.set('/');
-        abs_path.or(path_segments);
-    }
-
-
-    /**
-     * URI bitset for encoding typical non-slash characters.
-     * <p><blockquote><pre>
-     * uric_no_slash = unreserved | escaped | ";" | "?" | ":" | "@" |
-     *                 "&" | "=" | "+" | "$" | ","
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet uric_no_slash = new BitSet(256);
-
-    // Static initializer for uric_no_slash
-    static {
-        uric_no_slash.or(unreserved);
-        uric_no_slash.or(escaped);
-        uric_no_slash.set(';');
-        uric_no_slash.set('?');
-        uric_no_slash.set(';');
-        uric_no_slash.set('@');
-        uric_no_slash.set('&');
-        uric_no_slash.set('=');
-        uric_no_slash.set('+');
-        uric_no_slash.set('$');
-        uric_no_slash.set(',');
-    }
-
-
-    /**
-     * URI bitset that combines uric_no_slash and uric.
-     * <p><blockquote><pre>
-     * opaque_part   = uric_no_slash *uric
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet opaque_part = new BitSet(256);
-
-    // Static initializer for opaque_part
-    static {
-        // it's generous. because first character must not include a slash
-        opaque_part.or(uric_no_slash);
-        opaque_part.or(uric);
-    }
-
-
-    /**
-     * URI bitset that combines absolute path and opaque part.
-     * <p><blockquote><pre>
-     * path          = [ abs_path | opaque_part ]
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet path = new BitSet(256);
-
-    // Static initializer for path
-    static {
-        path.or(abs_path);
-        path.or(opaque_part);
-    }
-
-
-    /**
-     * Port, a logical alias for digit.
-     */
-    protected static final BitSet port = digit;
-
-
-    /**
-     * Bitset that combines digit and dot fo IPv$address.
-     * <p><blockquote><pre>
-     * IPv4address   = 1*digit "." 1*digit "." 1*digit "." 1*digit
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet IPv4address = new BitSet(256);
-
-    // Static initializer for IPv4address
-    static {
-        IPv4address.or(digit);
-        IPv4address.set('.');
-    }
-
-
-    /**
-     * RFC 2373.
-     * <p><blockquote><pre>
-     * IPv6address = hexpart [ ":" IPv4address ]
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet IPv6address = new BitSet(256);
-
-    // Static initializer for IPv6address reference
-    static {
-        IPv6address.or(hex); // hexpart
-        IPv6address.set(':');
-        IPv6address.or(IPv4address);
-    }
-
-
-    /**
-     * RFC 2732, 2373.
-     * <p><blockquote><pre>
-     * IPv6reference   = "[" IPv6address "]"
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet IPv6reference = new BitSet(256);
-
-    // Static initializer for IPv6reference
-    static {
-        IPv6reference.set('[');
-        IPv6reference.or(IPv6address);
-        IPv6reference.set(']');
-    }
-
-
-    /**
-     * BitSet for toplabel.
-     * <p><blockquote><pre>
-     * toplabel      = alpha | alpha *( alphanum | "-" ) alphanum
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet toplabel = new BitSet(256);
-
-    // Static initializer for toplabel
-    static {
-        toplabel.or(alphanum);
-        toplabel.set('-');
-    }
-
-
-    /**
-     * BitSet for hostname.
-     * <p><blockquote><pre>
-     * hostname      = *( domainlabel "." ) toplabel [ "." ]
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet hostname = new BitSet(256);
-
-    // Static initializer for hostname
-    static {
-        hostname.or(toplabel);
-        // hostname.or(domainlabel);
-        hostname.set('.');
-    }
-
-
-    /**
-     * BitSet for host.
-     * <p><blockquote><pre>
-     * host          = hostname | IPv4address | IPv6reference
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet host = new BitSet(256);
-
-    // Static initializer for host
-    static {
-        host.or(hostname);
-        // host.or(IPv4address);
-        host.or(IPv6reference); // IPv4address
-    }
-
-
-    /**
-     * BitSet for hostport.
-     * <p><blockquote><pre>
-     * hostport      = host [ ":" port ]
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet hostport = new BitSet(256);
-
-    // Static initializer for hostport
-    static {
-        hostport.or(host);
-        hostport.set(':');
-        hostport.or(port);
-    }
-
-
-    /**
-     * Bitset for userinfo.
-     * <p><blockquote><pre>
-     * userinfo      = *( unreserved | escaped |
-     *                    ";" | ":" | "&" | "=" | "+" | "$" | "," )
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet userinfo = new BitSet(256);
-
-    // Static initializer for userinfo
-    static {
-        userinfo.or(unreserved);
-        userinfo.or(escaped);
-        userinfo.set(';');
-        userinfo.set(':');
-        userinfo.set('&');
-        userinfo.set('=');
-        userinfo.set('+');
-        userinfo.set('$');
-        userinfo.set(',');
-    }
-
-
-    /**
-     * BitSet for within the userinfo component like user and password.
-     */
-    public static final BitSet within_userinfo = new BitSet(256);
-
-    // Static initializer for within_userinfo
-    static {
-        within_userinfo.or(userinfo);
-        within_userinfo.clear(';'); // reserved within authority
-        within_userinfo.clear(':');
-        within_userinfo.clear('@');
-        within_userinfo.clear('?');
-        within_userinfo.clear('/');
-    }
-
-
-    /**
-     * Bitset for server.
-     * <p><blockquote><pre>
-     * server        = [ [ userinfo "@" ] hostport ]
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet server = new BitSet(256);
-
-    // Static initializer for server
-    static {
-        server.or(userinfo);
-        server.set('@');
-        server.or(hostport);
-    }
-
-
-    /**
-     * BitSet for reg_name.
-     * <p><blockquote><pre>
-     * reg_name      = 1*( unreserved | escaped | "$" | "," |
-     *                     ";" | ":" | "@" | "&" | "=" | "+" )
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet reg_name = new BitSet(256);
-
-    // Static initializer for reg_name
-    static {
-        reg_name.or(unreserved);
-        reg_name.or(escaped);
-        reg_name.set('$');
-        reg_name.set(',');
-        reg_name.set(';');
-        reg_name.set(':');
-        reg_name.set('@');
-        reg_name.set('&');
-        reg_name.set('=');
-        reg_name.set('+');
-    }
-
-
-    /**
-     * BitSet for authority.
-     * <p><blockquote><pre>
-     * authority     = server | reg_name
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet authority = new BitSet(256);
-
-    // Static initializer for authority
-    static {
-        authority.or(server);
-        authority.or(reg_name);
-    }
-
-
-    /**
-     * BitSet for scheme.
-     * <p><blockquote><pre>
-     * scheme        = alpha *( alpha | digit | "+" | "-" | "." )
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet scheme = new BitSet(256);
-
-    // Static initializer for scheme
-    static {
-        scheme.or(alpha);
-        scheme.or(digit);
-        scheme.set('+');
-        scheme.set('-');
-        scheme.set('.');
-    }
-
-
-    /**
-     * BitSet for rel_segment.
-     * <p><blockquote><pre>
-     * rel_segment   = 1*( unreserved | escaped |
-     *                     ";" | "@" | "&" | "=" | "+" | "$" | "," )
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet rel_segment = new BitSet(256);
-
-    // Static initializer for rel_segment
-    static {
-        rel_segment.or(unreserved);
-        rel_segment.or(escaped);
-        rel_segment.set(';');
-        rel_segment.set('@');
-        rel_segment.set('&');
-        rel_segment.set('=');
-        rel_segment.set('+');
-        rel_segment.set('$');
-        rel_segment.set(',');
-    }
-
-
-    /**
-     * BitSet for rel_path.
-     * <p><blockquote><pre>
-     * rel_path      = rel_segment [ abs_path ]
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet rel_path = new BitSet(256);
-
-    // Static initializer for rel_path
-    static {
-        rel_path.or(rel_segment);
-        rel_path.or(abs_path);
-    }
-
-
-    /**
-     * BitSet for net_path.
-     * <p><blockquote><pre>
-     * net_path      = "//" authority [ abs_path ]
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet net_path = new BitSet(256);
-
-    // Static initializer for net_path
-    static {
-        net_path.set('/');
-        net_path.or(authority);
-        net_path.or(abs_path);
-    }
-
-
-    /**
-     * BitSet for hier_part.
-     * <p><blockquote><pre>
-     * hier_part     = ( net_path | abs_path ) [ "?" query ]
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet hier_part = new BitSet(256);
-
-    // Static initializer for hier_part
-    static {
-        hier_part.or(net_path);
-        hier_part.or(abs_path);
-        // hier_part.set('?'); aleady included
-        hier_part.or(query);
-    }
-
-
-    /**
-     * BitSet for relativeURI.
-     * <p><blockquote><pre>
-     * relativeURI   = ( net_path | abs_path | rel_path ) [ "?" query ]
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet relativeURI = new BitSet(256);
-
-    // Static initializer for relativeURI
-    static {
-        relativeURI.or(net_path);
-        relativeURI.or(abs_path);
-        relativeURI.or(rel_path);
-        // relativeURI.set('?'); aleady included
-        relativeURI.or(query);
-    }
-
-
-    /**
-     * BitSet for absoluteURI.
-     * <p><blockquote><pre>
-     * absoluteURI   = scheme ":" ( hier_part | opaque_part )
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet absoluteURI = new BitSet(256);
-
-    // Static initializer for absoluteURI
-    static {
-        absoluteURI.or(scheme);
-        absoluteURI.set(':');
-        absoluteURI.or(hier_part);
-        absoluteURI.or(opaque_part);
-    }
-
-
-    /**
-     * BitSet for URI-reference.
-     * <p><blockquote><pre>
-     * URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]
-     * </pre></blockquote><p>
-     */
-    protected static final BitSet URI_reference = new BitSet(256);
-
-    // Static initializer for URI_reference
-    static {
-        URI_reference.or(absoluteURI);
-        URI_reference.or(relativeURI);
-        URI_reference.set('#');
-        URI_reference.or(fragment);
-    }
-
-    // ---------------------------- Characters disallowed within the URI syntax
-    // Excluded US-ASCII Characters are like control, space, delims and unwise
-
-    /**
-     * BitSet for control.
-     */
-    public static final BitSet control = new BitSet(256);
-
-    // Static initializer for control
-    static {
-        for (int i = 0; i <= 0x1F; i++) {
-            control.set(i);
-        }
-        control.set(0x7F);
-    }
-
-    /**
-     * BitSet for space.
-     */
-    public static final BitSet space = new BitSet(256);
-
-    // Static initializer for space
-    static {
-        space.set(0x20);
-    }
-
-
-    /**
-     * BitSet for delims.
-     */
-    public static final BitSet delims = new BitSet(256);
-
-    // Static initializer for delims
-    static {
-        delims.set('<');
-        delims.set('>');
-        delims.set('#');
-        delims.set('%');
-        delims.set('"');
-    }
-
-
-    /**
-     * BitSet for unwise.
-     */
-    public static final BitSet unwise = new BitSet(256);
-
-    // Static initializer for unwise
-    static {
-        unwise.set('{');
-        unwise.set('}');
-        unwise.set('|');
-        unwise.set('\\');
-        unwise.set('^');
-        unwise.set('[');
-        unwise.set(']');
-        unwise.set('`');
-    }
-
-
-    /**
-     * Disallowed rel_path before escaping.
-     */
-    public static final BitSet disallowed_rel_path = new BitSet(256);
-
-    // Static initializer for disallowed_rel_path
-    static {
-        disallowed_rel_path.or(uric);
-        disallowed_rel_path.andNot(rel_path);
-    }
-
-
-    /**
-     * Disallowed opaque_part before escaping.
-     */
-    public static final BitSet disallowed_opaque_part = new BitSet(256);
-
-    // Static initializer for disallowed_opaque_part
-    static {
-        disallowed_opaque_part.or(uric);
-        disallowed_opaque_part.andNot(opaque_part);
-    }
-
-    // ----------------------- Characters allowed within and for each component
-
-    /**
-     * Those characters that are allowed for the authority component.
-     */
-    public static final BitSet allowed_authority = new BitSet(256);
-
-    // Static initializer for allowed_authority
-    static {
-        allowed_authority.or(authority);
-        allowed_authority.clear('%');
-    }
-
-
-    /**
-     * Those characters that are allowed for the opaque_part.
-     */
-    public static final BitSet allowed_opaque_part = new BitSet(256);
-
-    // Static initializer for allowed_opaque_part
-    static {
-        allowed_opaque_part.or(opaque_part);
-        allowed_opaque_part.clear('%');
-    }
-
-
-    /**
-     * Those characters that are allowed for the reg_name.
-     */
-    public static final BitSet allowed_reg_name = new BitSet(256);
-
-    // Static initializer for allowed_reg_name
-    static {
-        allowed_reg_name.or(reg_name);
-        // allowed_reg_name.andNot(percent);
-        allowed_reg_name.clear('%');
-    }
-
-
-    /**
-     * Those characters that are allowed for the userinfo component.
-     */
-    public static final BitSet allowed_userinfo = new BitSet(256);
-
-    // Static initializer for allowed_userinfo
-    static {
-        allowed_userinfo.or(userinfo);
-        // allowed_userinfo.andNot(percent);
-        allowed_userinfo.clear('%');
-    }
-
-
-    /**
-     * Those characters that are allowed for within the userinfo component.
-     */
-    public static final BitSet allowed_within_userinfo = new BitSet(256);
-
-    // Static initializer for allowed_within_userinfo
-    static {
-        allowed_within_userinfo.or(within_userinfo);
-        allowed_within_userinfo.clear('%');
-    }
-
-
-    /**
-     * Those characters that are allowed for the IPv6reference component.
-     * The characters '[', ']' in IPv6reference should be excluded.
-     */
-    public static final BitSet allowed_IPv6reference = new BitSet(256);
-
-    // Static initializer for allowed_IPv6reference
-    static {
-        allowed_IPv6reference.or(IPv6reference);
-        // allowed_IPv6reference.andNot(unwise);
-        allowed_IPv6reference.clear('[');
-        allowed_IPv6reference.clear(']');
-    }
-
-
-    /**
-     * Those characters that are allowed for the host component.
-     * The characters '[', ']' in IPv6reference should be excluded.
-     */
-    public static final BitSet allowed_host = new BitSet(256);
-
-    // Static initializer for allowed_host
-    static {
-        allowed_host.or(hostname);
-        allowed_host.or(allowed_IPv6reference);
-    }
-
-
-    /**
-     * Those characters that are allowed for the authority component.
-     */
-    public static final BitSet allowed_within_authority = new BitSet(256);
-
-    // Static initializer for allowed_within_authority
-    static {
-        allowed_within_authority.or(server);
-        allowed_within_authority.or(reg_name);
-        allowed_within_authority.clear(';');
-        allowed_within_authority.clear(':');
-        allowed_within_authority.clear('@');
-        allowed_within_authority.clear('?');
-        allowed_within_authority.clear('/');
-    }
-
-
-    /**
-     * Those characters that are allowed for the abs_path.
-     */
-    public static final BitSet allowed_abs_path = new BitSet(256);
-
-    // Static initializer for allowed_abs_path
-    static {
-        allowed_abs_path.or(abs_path);
-        // allowed_abs_path.set('/');  // aleady included
-        allowed_abs_path.andNot(percent);
-        allowed_abs_path.clear('+');
-    }
-
-
-    /**
-     * Those characters that are allowed for the rel_path.
-     */
-    public static final BitSet allowed_rel_path = new BitSet(256);
-
-    // Static initializer for allowed_rel_path
-    static {
-        allowed_rel_path.or(rel_path);
-        allowed_rel_path.clear('%');
-        allowed_rel_path.clear('+');
-    }
-
-
-    /**
-     * Those characters that are allowed within the path.
-     */
-    public static final BitSet allowed_within_path = new BitSet(256);
-
-    // Static initializer for allowed_within_path
-    static {
-        allowed_within_path.or(abs_path);
-        allowed_within_path.clear('/');
-        allowed_within_path.clear(';');
-        allowed_within_path.clear('=');
-        allowed_within_path.clear('?');
-    }
-
-
-    /**
-     * Those characters that are allowed for the query component.
-     */
-    public static final BitSet allowed_query = new BitSet(256);
-
-    // Static initializer for allowed_query
-    static {
-        allowed_query.or(uric);
-        allowed_query.clear('%');
-    }
-
-
-    /**
-     * Those characters that are allowed within the query component.
-     */
-    public static final BitSet allowed_within_query = new BitSet(256);
-
-    // Static initializer for allowed_within_query
-    static {
-        allowed_within_query.or(allowed_query);
-        allowed_within_query.andNot(reserved); // excluded 'reserved'
-    }
-
-
-    /**
-     * Those characters that are allowed for the fragment component.
-     */
-    public static final BitSet allowed_fragment = new BitSet(256);
-
-    // Static initializer for allowed_fragment
-    static {
-        allowed_fragment.or(uric);
-        allowed_fragment.clear('%');
-    }
-
-    // ------------------------------------------ Character and escape encoding
-
-    /**
-     * Encodes URI string.
-     * <p/>
-     * This is a two mapping, one from original characters to octets, and
-     * subsequently a second from octets to URI characters:
-     * <p><blockquote><pre>
-     *   original character sequence->octet sequence->URI character sequence
-     * </pre></blockquote><p>
-     * <p/>
-     * An escaped octet is encoded as a character triplet, consisting of the
-     * percent character "%" followed by the two hexadecimal digits
-     * representing the octet code. For example, "%20" is the escaped
-     * encoding for the US-ASCII space character.
-     * <p/>
-     * Conversion from the local filesystem character set to UTF-8 will
-     * normally involve a two step process. First convert the local character
-     * set to the UCS; then convert the UCS to UTF-8.
-     * The first step in the process can be performed by maintaining a mapping
-     * table that includes the local character set code and the corresponding
-     * UCS code.
-     * The next step is to convert the UCS character code to the UTF-8 encoding.
-     * <p/>
-     * Mapping between vendor codepages can be done in a very similar manner
-     * as described above.
-     * <p/>
-     * The only time escape encodings can allowedly be made is when a URI is
-     * being created from its component parts.  The escape and validate methods
-     * are internally performed within this method.
-     *
-     * @param original the original character sequence
-     * @param allowed  those characters that are allowed within a component
-     * @param charset  the protocol charset
-     * @return URI character sequence
-     * @throws HttpException null component or unsupported character encoding
-     */
-
-    protected static char[] encode(String original, BitSet allowed,
-            String charset) throws HttpException {
-        if (original == null) {
-            throw new IllegalArgumentException("Original string may not be null");
-        }
-        if (allowed == null) {
-            throw new IllegalArgumentException("Allowed bitset may not be null");
-        }
-        byte[] rawdata = URLCodec.encodeUrl(allowed, EncodingUtils.getBytes(original, charset));
-        return EncodingUtils.getAsciiString(rawdata).toCharArray();
-    }
-
-    /**
-     * Decodes URI encoded string.
-     * <p/>
-     * This is a two mapping, one from URI characters to octets, and
-     * subsequently a second from octets to original characters:
-     * <p><blockquote><pre>
-     *   URI character sequence->octet sequence->original character sequence
-     * </pre></blockquote><p>
-     * <p/>
-     * A URI must be separated into its components before the escaped
-     * characters within those components can be allowedly decoded.
-     * <p/>
-     * Notice that there is a chance that URI characters that are non UTF-8
-     * may be parsed as valid UTF-8.  A recent non-scientific analysis found
-     * that EUC encoded Japanese words had a 2.7% false reading; SJIS had a
-     * 0.0005% false reading; other encoding such as ASCII or KOI-8 have a 0%
-     * false reading.
-     * <p/>
-     * The percent "%" character always has the reserved purpose of being
-     * the escape indicator, it must be escaped as "%25" in order to be used
-     * as data within a URI.
-     * <p/>
-     * The unescape method is internally performed within this method.
-     *
-     * @param component the URI character sequence
-     * @param charset   the protocol charset
-     * @return original character sequence
-     * @throws HttpException incomplete trailing escape pattern or unsupported
-     *                       character encoding
-     */
-    protected static String decode(char[] component, String charset)
-            throws HttpException {
-        if (component == null) {
-            throw new IllegalArgumentException("Component array of chars may not be null");
-        }
-        return decode(new String(component), charset);
-    }
-
-    /**
-     * Decodes URI encoded string.
-     * <p/>
-     * This is a two mapping, one from URI characters to octets, and
-     * subsequently a second from octets to original characters:
-     * <p><blockquote><pre>
-     *   URI character sequence->octet sequence->original character sequence
-     * </pre></blockquote><p>
-     * <p/>
-     * A URI must be separated into its components before the escaped
-     * characters within those components can be allowedly decoded.
-     * <p/>
-     * Notice that there is a chance that URI characters that are non UTF-8
-     * may be parsed as valid UTF-8.  A recent non-scientific analysis found
-     * that EUC encoded Japanese words had a 2.7% false reading; SJIS had a
-     * 0.0005% false reading; other encoding such as ASCII or KOI-8 have a 0%
-     * false reading.
-     * <p/>
-     * The percent "%" character always has the reserved purpose of being
-     * the escape indicator, it must be escaped as "%25" in order to be used
-     * as data within a URI.
-     * <p/>
-     * The unescape method is internally performed within this method.
-     *
-     * @param component the URI character sequence
-     * @param charset   the protocol charset
-     * @return original character sequence
-     * @throws HttpException incomplete trailing escape pattern or unsupported
-     *                       character encoding
-     * @since 3.0
-     */
-    protected static String decode(String component, String charset)
-            throws HttpException {
-        if (component == null) {
-            throw new IllegalArgumentException("Component array of chars may not be null");
-        }
-        byte[] rawdata = null;
-        try {
-            rawdata = URLCodec.decodeUrl(EncodingUtils.getAsciiBytes(component));
-        } catch (DecoderException e) {
-            throw new HttpException(e.getMessage());
-        }
-        return EncodingUtils.getString(rawdata, charset);
-    }
-
-}
-
diff --git a/base/common/src/main/java/org/artifactory/util/encodeing/URIUtil.java b/base/common/src/main/java/org/artifactory/util/encodeing/URIUtil.java
deleted file mode 100644
index c9958e2..0000000
--- a/base/common/src/main/java/org/artifactory/util/encodeing/URIUtil.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//httpclient/src/java/org/apache/commons/httpclient/util/URIUtil.java,v 1.27 2004/05/05 20:34:01 olegk Exp $
- * $Revision: 507321 $
- * $Date: 2007-02-14 01:10:51 +0100 (Wed, 14 Feb 2007) $
- *
- * ====================================================================
- *
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-/*
- * Based on apache-httpclient 3.1 org.apache.commons.httpclient.util.URIUtil.java
- * Additional contributors:
- *    JFrog Ltd.
- */
-package org.artifactory.util.encodeing;
-
-import com.google.common.base.Charsets;
-import org.apache.commons.codec.DecoderException;
-import org.apache.commons.codec.net.URLCodec;
-import org.apache.http.HttpException;
-import org.apache.http.util.EncodingUtils;
-
-import java.util.BitSet;
-
-/**
- * The URI escape and character encoding and decoding utility.
- * It's compatible with {@link org.apache.commons.httpclient.HttpURL} rather
- * than {@link org.apache.commons.httpclient.URI}.
- *
- * @author <a href="mailto:jericho at apache.org">Sung-Gu</a>
- * @version $Revision: 507321 $ $Date: 2002/03/14 15:14:01
- */
-public class URIUtil {
-
-    protected static final BitSet empty = new BitSet(1);
-
-
-    /**
-     * Escape and encode a string regarded as the query component of an URI with
-     * the default protocol charset.
-     * When a query string is not misunderstood the reserved special characters
-     * ("&", "=", "+", ",", and "$") within a query component, this method
-     * is recommended to use in encoding the whole query.
-     *
-     * @param unescaped an unescaped string
-     * @return the escaped string
-     * @throws HttpException if the default protocol charset is not supported
-     * @see #encode
-     */
-    public static String encodeQuery(String unescaped) throws HttpException {
-        return encodeQuery(unescaped, Charsets.UTF_8.name());
-    }
-
-
-    /**
-     * Escape and encode a string regarded as the query component of an URI with
-     * a given charset.
-     * When a query string is not misunderstood the reserved special characters
-     * ("&", "=", "+", ",", and "$") within a query component, this method
-     * is recommended to use in encoding the whole query.
-     *
-     * @param unescaped an unescaped string
-     * @param charset   the charset
-     * @return the escaped string
-     * @throws HttpException if the charset is not supported
-     * @see #encode
-     */
-    public static String encodeQuery(String unescaped, String charset)
-            throws HttpException {
-
-        return encode(unescaped, URI.allowed_query, charset);
-    }
-
-
-    /**
-     * Escape and encode a given string with allowed characters not to be
-     * escaped and the default protocol charset.
-     *
-     * @param unescaped a string
-     * @param allowed   allowed characters not to be escaped
-     * @return the escaped string
-     * @throws HttpException if the default protocol charset is not supported
-     */
-    public static String encode(String unescaped, BitSet allowed)
-            throws HttpException {
-
-        return encode(unescaped, allowed, Charsets.UTF_8.name());
-    }
-
-
-    /**
-     * Escape and encode a given string with allowed characters not to be
-     * escaped and a given charset.
-     *
-     * @param unescaped a string
-     * @param allowed   allowed characters not to be escaped
-     * @param charset   the charset
-     * @return the escaped string
-     */
-    public static String encode(String unescaped, BitSet allowed,
-            String charset) throws HttpException {
-        byte[] rawdata = URLCodec.encodeUrl(allowed,
-                EncodingUtils.getBytes(unescaped, charset));
-        return EncodingUtils.getAsciiString(rawdata);
-    }
-
-
-    /**
-     * Unescape and decode a given string regarded as an escaped string with the
-     * default protocol charset.
-     *
-     * @param escaped a string
-     * @return the unescaped string
-     * @throws HttpException if the string cannot be decoded (invalid)
-     */
-    public static String decode(String escaped) throws HttpException {
-        try {
-            byte[] rawdata = URLCodec.decodeUrl(EncodingUtils.getAsciiBytes(escaped));
-            return EncodingUtils.getString(rawdata, Charsets.UTF_8.name());
-        } catch (DecoderException e) {
-            throw new HttpException(e.getMessage());
-        }
-    }
-
-    /**
-     * Unescape and decode a given string regarded as an escaped string.
-     *
-     * @param escaped a string
-     * @param charset the charset
-     * @return the unescaped string
-     * @throws HttpException if the charset is not supported
-     */
-    public static String decode(String escaped, String charset)
-            throws HttpException {
-
-        return URI.decode(escaped.toCharArray(), charset);
-    }
-
-}
-
diff --git a/base/common/src/main/java/org/artifactory/webapp/servlet/DelayedHttpResponse.java b/base/common/src/main/java/org/artifactory/webapp/servlet/DelayedHttpResponse.java
deleted file mode 100644
index e60479c..0000000
--- a/base/common/src/main/java/org/artifactory/webapp/servlet/DelayedHttpResponse.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.webapp.servlet;
-
-import org.apache.commons.io.IOUtils;
-import org.artifactory.request.ArtifactoryResponseBase;
-import org.artifactory.util.HttpUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.servlet.http.HttpServletResponse;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
-/**
- * This class delays successful responses until {@link org.artifactory.webapp.servlet.DelayedHttpResponse#commitResponseCode()}.
- * is manually called. Use it whenever using http response inside a transaction that might fail after interacting with
- * the response.<p/> It assumes the clients will not call sendStream directly. When used, any writes to the output will
- * be cached. So be aware not to use it when responding with a lot of data.
- *
- * @author Yossi Shaul
- * @deprecated Usage of this class is not required anymore. The upload service now uses a more fine grained transactions
- * so a successful response is sent by the upload service only after the DB transaction was successfully committed
- */
- at Deprecated
-public class DelayedHttpResponse extends ArtifactoryResponseBase {
-    private static final Logger log = LoggerFactory.getLogger(DelayedHttpResponse.class);
-
-    private final HttpArtifactoryResponse response;
-    private int status;
-    private ByteArrayOutputStream out;
-    private PrintWriter writer;
-    private StringWriter stringWriter;
-
-    public DelayedHttpResponse(HttpArtifactoryResponse response) {
-        this.response = response;
-        status = HttpServletResponse.SC_OK; // default status
-    }
-
-    /**
-     * Call at the end of the <b>successful</b> request (after transaction commit or external processes are done) to
-     * commit the response back to the client.<p/> Unsuccessful requests are assumes to call sendError which will send
-     * the information without delay.
-     *
-     * @throws IOException If failed to write to the response stream.
-     */
-    public void commitResponseCode() throws IOException {
-        if (isCommitted()) {
-            log.trace("Response has already been committed.");
-            return;
-        }
-        // set internal status only if successful (otherwise it was already done)
-        if (isSuccessful()) {
-            response.setStatus(status);
-        }
-        // write the response output
-        if (out != null) {
-            IOUtils.write(out.toByteArray(), response.getOutputStream());
-        } else if (writer != null) {
-            IOUtils.write(stringWriter.getBuffer(), response.getWriter());
-        }
-        response.flush();
-    }
-
-    @Override
-    public OutputStream getOutputStream() throws IOException {
-        // return an internal output stream that will cache the response data
-        if (out == null) {
-            out = new ByteArrayOutputStream();
-        }
-        return out;
-    }
-
-    @Override
-    public void setContentDispositionAttachment(String filename) {
-        response.setContentDispositionAttachment(filename);
-    }
-
-    @Override
-    public void setFilename(String filename) {
-        response.setFilename(filename);
-    }
-
-    @Override
-    public PrintWriter getWriter() throws IOException {
-        // return an internal writer that will cache the response data
-        if (writer == null) {
-            stringWriter = new StringWriter();
-            writer = new PrintWriter(stringWriter);
-        }
-        return writer;
-    }
-
-    @Override
-    public void setStatus(int status) {
-        this.status = status;
-        super.setStatus(status);    // call the super (NOT the http response)
-        // only update the http response status is unsuccessful response code
-        if (!HttpUtils.isSuccessfulResponseCode(status)) {
-            response.setStatus(status);
-        }
-    }
-
-    @Override
-    public void sendSuccess() {
-        setStatus(getStatus());
-    }
-
-    @Override
-    public void flush() {
-        // delay if status is ok
-        if (!HttpUtils.isSuccessfulResponseCode(status)) {
-            response.flush();
-        }
-    }
-
-    // delegate unmodified methods //
-
-    @Override
-    public void setLastModified(long lastModified) {
-        response.setLastModified(lastModified);
-    }
-
-    @Override
-    public void setEtag(String etag) {
-        response.setEtag(etag);
-    }
-
-    @Override
-    public void setMd5(String md5) {
-        response.setMd5(md5);
-    }
-
-    @Override
-    public void setRangeSupport(String bytes) {
-        response.setRangeSupport(bytes);
-    }
-
-    @Override
-    public void setSha1(String sha1) {
-        response.setSha1(sha1);
-    }
-
-    @Override
-    public void sendErrorInternal(int statusCode, String reason) throws IOException {
-        response.sendErrorInternal(statusCode, reason);
-    }
-
-    @Override
-    public void sendAuthorizationRequired(String message, String realm) throws IOException {
-        response.sendAuthorizationRequired(message, realm);
-    }
-
-    @Override
-    public void setContentLength(long length) {
-        response.setContentLength(length);
-    }
-
-    @Override
-    public void setHeader(String header, String value) {
-        response.setHeader(header, value);
-    }
-
-    @Override
-    public void setContentType(String contentType) {
-        response.setContentType(contentType);
-    }
-
-    @Override
-    public boolean isCommitted() {
-        return response.isCommitted();
-    }
-}
diff --git a/base/common/src/main/java/org/artifactory/webapp/servlet/DelayedInit.java b/base/common/src/main/java/org/artifactory/webapp/servlet/DelayedInit.java
deleted file mode 100644
index f7e13e8..0000000
--- a/base/common/src/main/java/org/artifactory/webapp/servlet/DelayedInit.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.webapp.servlet;
-
-import javax.servlet.ServletException;
-
-/**
- * An interface for servlet filters and servlets that should only be initiated after the application context is ready
- *
- * @author Yoav Landman
- */
-public interface DelayedInit {
-    String APPLICATION_CONTEXT_LOCK_KEY = "org.artifactory.webapp.lock";
-
-    void delayedInit() throws ServletException;
-}
diff --git a/base/common/src/main/java/org/artifactory/webapp/servlet/HttpArtifactoryResponse.java b/base/common/src/main/java/org/artifactory/webapp/servlet/HttpArtifactoryResponse.java
deleted file mode 100644
index 864b8a7..0000000
--- a/base/common/src/main/java/org/artifactory/webapp/servlet/HttpArtifactoryResponse.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.webapp.servlet;
-
-import org.apache.http.HttpHeaders;
-import org.apache.http.HttpStatus;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.request.ArtifactoryRequest;
-import org.artifactory.request.ArtifactoryResponseBase;
-import org.artifactory.util.HttpUtils;
-import org.codehaus.plexus.util.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-
-public class HttpArtifactoryResponse extends ArtifactoryResponseBase {
-    private static final Logger log = LoggerFactory.getLogger(HttpArtifactoryResponse.class);
-
-    private final HttpServletResponse response;
-
-    public HttpArtifactoryResponse(HttpServletResponse response) {
-        this.response = response;
-    }
-
-    @Override
-    public void setLastModified(long lastModified) {
-        response.setDateHeader("Last-Modified", lastModified);
-    }
-
-    @Override
-    public void setEtag(String etag) {
-        if (etag != null) {
-            response.setHeader("ETag", etag);
-        } else {
-            log.debug("Could not register a null etag with the response.");
-        }
-    }
-
-    @Override
-    public void setMd5(String md5) {
-        if (md5 != null) {
-            response.setHeader(ArtifactoryRequest.CHECKSUM_MD5, md5);
-        } else {
-            log.debug("Could not register a null md5 tag with the response.");
-        }
-    }
-
-    public void setRangeSupport(String bytes) {
-        if (bytes != null) {
-            response.setHeader(ArtifactoryRequest.ACCEPT_RANGES, bytes);
-        } else {
-            log.debug("Could not register a null range support tag with the response.");
-        }
-    }
-
-    @Override
-    public void setSha1(String sha1) {
-        if (sha1 != null) {
-            response.setHeader(ArtifactoryRequest.CHECKSUM_SHA1, sha1);
-        } else {
-            log.debug("Could not register a null sha1 tag with the response.");
-        }
-    }
-
-    /**
-     * Set the content disposition type to attachment. This will instruct the browser downloading the file to save it
-     * instead of displaying it inline (for example html files). <p/>
-     * We don't set the name here and let the browser decide based on download URL.
-     * For more info read <a href="https://www.ietf.org/rfc/rfc2183.txt">RFC2183</a>
-     */
-    @Override
-    public void setContentDispositionAttachment(String filename) {
-        if (ConstantValues.responseDisableContentDispositionFilename.getBoolean() || StringUtils.isBlank(filename)) {
-            response.setHeader("Content-Disposition", "attachment");
-        } else {
-            response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"" +
-                    "; filename*=UTF-8''" + HttpUtils.encodeQuery(filename));
-        }
-    }
-
-    @Override
-    public void setFilename(String filename) {
-        if (StringUtils.isNotBlank(filename)) {
-            response.setHeader(ArtifactoryRequest.FILE_NAME, HttpUtils.encodeQuery(filename));
-        } else {
-            log.debug("Could not register a null filename with the response.");
-        }
-    }
-
-    @Override
-    protected void sendErrorInternal(int statusCode, String reason) throws IOException {
-        if (response.isCommitted()) {
-            log.debug("Cannot send error " + statusCode +
-                    (reason != null ? " (" + reason + ")" : "") +
-                    ": response already committed.");
-            return;
-        }
-        try {
-            log.trace("Sending back error code {}. Reason: {}", statusCode, reason);
-            HttpUtils.sendErrorResponse(response, statusCode, reason);
-            flush();
-        } catch (IOException e) {
-            throw e;
-        } catch (Throwable t) {
-            log.warn("Failed to send http error (" + t.getMessage() + ").", t);
-        }
-    }
-
-    @Override
-    public void sendAuthorizationRequired(String message, String realm) throws IOException {
-        try {
-            response.addHeader("WWW-Authenticate", "Basic realm=\"" + realm + "\"");
-            HttpUtils.sendErrorResponse(response, HttpStatus.SC_UNAUTHORIZED, "Unauthorized");
-            flush();
-        } catch (IOException e) {
-            throw e;
-        } catch (IllegalStateException e) {
-            log.warn("Failed to send http error (" + e.getMessage() + ").", e);
-        } catch (Throwable t) {
-            log.warn("Failed to send http error (" + t.getMessage() + ").", t);
-        }
-    }
-
-    @Override
-    public void setContentLength(long length) {
-        super.setContentLength(length);
-        if (length <= Integer.MAX_VALUE) {
-            response.setContentLength((int) length);
-        } else {
-            // servlet api doesn't support long values, set the header manually
-            response.setHeader(HttpHeaders.CONTENT_LENGTH, length + "");
-        }
-    }
-
-    @Override
-    public OutputStream getOutputStream() throws IOException {
-        return response.getOutputStream();
-    }
-
-    @Override
-    public PrintWriter getWriter() throws IOException {
-        return response.getWriter();
-    }
-
-    @Override
-    public void setStatus(int status) {
-        super.setStatus(status);
-        response.setStatus(status);
-    }
-
-    @Override
-    public void setHeader(String header, String value) {
-        response.setHeader(header, value);
-    }
-
-    @Override
-    public void flush() {
-        try {
-            response.flushBuffer();
-        } catch (IOException e) {
-            String message = "Failed to commit http response (" + e.getMessage() + ").";
-            log.warn(message);
-            log.debug(message, e);
-        }
-    }
-
-    @Override
-    public void setContentType(String contentType) {
-        response.setContentType(contentType);
-    }
-
-    @Override
-    public boolean isCommitted() {
-        return response.isCommitted();
-    }
-}
\ No newline at end of file
diff --git a/base/common/src/main/java/org/artifactory/webapp/servlet/TraceLoggingResponse.java b/base/common/src/main/java/org/artifactory/webapp/servlet/TraceLoggingResponse.java
deleted file mode 100644
index 746c338..0000000
--- a/base/common/src/main/java/org/artifactory/webapp/servlet/TraceLoggingResponse.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.webapp.servlet;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.io.output.NullWriter;
-import org.apache.http.HttpStatus;
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.common.StatusHolder;
-import org.artifactory.util.HttpUtils;
-import org.joda.time.format.ISODateTimeFormat;
-import org.slf4j.Logger;
-import org.springframework.http.MediaType;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Writer;
-import java.util.List;
-
-/**
- * A response wrapper that maintains but ignores the activities of the request process and collects the request trace
- * messages for later response. To be used in conjunction with {@link org.artifactory.request.RequestTraceLogger}
- *
- * @author Noam Y. Tenne
- */
-public class TraceLoggingResponse implements ArtifactoryResponse {
-
-    private final String threadName;
-    private final String time;
-
-    private long length = -1;
-    private int statusCode;
-    private ArtifactoryResponse artifactoryResponse;
-    private List<String> logAggregator = Lists.newArrayList();
-
-    public TraceLoggingResponse(ArtifactoryResponse artifactoryResponse) {
-        threadName = Thread.currentThread().getName();
-        time = ISODateTimeFormat.dateTime().print(System.currentTimeMillis());
-        this.artifactoryResponse = artifactoryResponse;
-    }
-
-    @Override
-    public boolean isError() {
-        return ((statusCode > 0) && !HttpUtils.isSuccessfulResponseCode(statusCode));
-    }
-
-    @Override
-    public void setLastModified(long lastModified) {
-    }
-
-    @Override
-    public void setEtag(String etag) {
-    }
-
-    @Override
-    public void setSha1(String sha1) {
-    }
-
-    @Override
-    public void setMd5(String md5) {
-    }
-
-    @Override
-    public void setRangeSupport(String bytes) {
-    }
-
-    @Override
-    public long getContentLength() {
-        return length;
-    }
-
-    @Override
-    public void setContentLength(long length) {
-        this.length = length;
-    }
-
-    @Override
-    public void setContentType(String contentType) {
-    }
-
-    @Override
-    public Writer getWriter() throws IOException {
-        return new NullWriter();
-    }
-
-    @Override
-    public void sendInternalError(Exception exception, Logger logger) throws IOException {
-        // TODO: [by fsi] Trace should have heavy tracing on error
-    }
-
-    @Override
-    public void sendError(int statusCode, String reason, Logger logger) throws IOException {
-        this.statusCode = statusCode;
-    }
-
-    @Override
-    public void sendError(StatusHolder statusHolder) throws IOException {
-        this.statusCode = statusHolder.getStatusCode();
-    }
-
-    @Override
-    public void sendStream(InputStream is) throws IOException {
-        if (statusCode <= 0) {
-            statusCode = HttpStatus.SC_OK;
-        }
-    }
-
-    @Override
-    public void sendSuccess() {
-        this.statusCode = HttpStatus.SC_OK;
-    }
-
-    @Override
-    public int getStatus() {
-        return statusCode;
-    }
-
-    @Override
-    public void setStatus(int statusCode) {
-        this.statusCode = statusCode;
-    }
-
-    @Override
-    public void setHeader(String header, String value) {
-    }
-
-    @Override
-    public boolean isCommitted() {
-        return false;
-    }
-
-    @Override
-    public boolean isSuccessful() {
-        return ((statusCode <= 0) || HttpUtils.isSuccessfulResponseCode(statusCode));
-    }
-
-    @Override
-    public boolean isPropertiesQuery() {
-        return false;
-    }
-
-    @Override
-    public String getPropertiesMediaType() {
-        return null;
-    }
-
-    @Override
-    public void setPropertiesMediaType(String propsQueryFormat) {
-    }
-
-    @Override
-    public void close(Closeable closeable) {
-        IOUtils.closeQuietly(closeable);
-    }
-
-    @Override
-    public void flush() {
-    }
-
-    @Override
-    public void sendAuthorizationRequired(String message, String realm) throws IOException {
-        statusCode = HttpStatus.SC_UNAUTHORIZED;
-    }
-
-    /**
-     * Appends a request trace log message
-     *
-     * @param message Message to log
-     */
-    public void log(String message) {
-        logAggregator.add(message);
-    }
-
-    /**
-     * Writes the request info and messages to the response
-     *
-     * @param requestId   Request trace context ID
-     * @param methodName  HTTP method name
-     * @param username    Authenticated user name
-     * @param requestPath Request repo path id
-     * @throws IOException
-     */
-    public void sendResponse(String requestId, String methodName, String username, String requestPath)
-            throws IOException {
-        Writer writer = null;
-        try {
-            artifactoryResponse.setContentType(MediaType.TEXT_PLAIN.toString());
-            writer = artifactoryResponse.getWriter();
-            writer.append("Request ID: ").append(requestId).append("\n");
-            writer.append("Repo Path ID: ").append(requestPath).append("\n");
-            writer.append("Method Name: ").append(methodName).append("\n");
-            writer.append("User: ").append(username).append("\n");
-            writer.append("Time: ").append(time).append("\n");
-            writer.append("Thread: ").append(threadName).append("\n");
-            writer.flush();
-            writer.append("Steps: ").append("\n");
-            IOUtils.writeLines(logAggregator, null, writer);
-            writer.flush();
-            artifactoryResponse.sendSuccess();
-        } finally {
-            if (writer != null) {
-                writer.close();
-            }
-        }
-    }
-}
diff --git a/base/common/src/main/resources/templates/apache.ftl b/base/common/src/main/resources/templates/apache.ftl
deleted file mode 100644
index f021745..0000000
--- a/base/common/src/main/resources/templates/apache.ftl
+++ /dev/null
@@ -1,79 +0,0 @@
-<#if addHa && addOnce>
-## add HA entries when ha is configured
-<Proxy balancer://${upstreamName}>
-    <#list hsservers as haserver>
-    ${haserver}
-    </#list>
-ProxySet lbmethod=byrequests
-ProxySet stickysession=ROUTEID
-</Proxy>
-</#if>
-
-<#if !generalOnly>
-Listen ${repoPort}
-</#if>
-<VirtualHost *:<#if httpOnly && generalOnly>${httpPort}</#if><#if !generalOnly>${repoPort}</#if><#if httpsOnly && generalOnly>${sslPort}</#if>>
-
-    ProxyPreserveHost On
-
-    ServerName ${serverName}
-    ServerAlias *.${serverName}
-    ServerAdmin server at admin
-
-<#if useHttps && !httpOnly>
-    SSLEngine on
-    SSLCertificateFile ${sslCrtPath}
-    SSLCertificateKeyFile ${sslKeyPath}
-    SSLProxyEngine on
-</#if>
-
-    ## Application specific logs
-    ## ErrorLog ${APACHE_LOG_DIR}/${serverName}-error.log
-    ## CustomLog ${APACHE_LOG_DIR}/${serverName}-access.log combined
-
-    RewriteEngine on
-
-    RewriteCond %{SERVER_PORT} (.*)
-    RewriteRule (.*) - [E=my_server_port:%1]
-    ##  NOTE: The 'REQUEST_SCHEME' Header is supported only from apache version 2.4 and above
-    RewriteCond %{REQUEST_SCHEME} (.*)
-    RewriteRule (.*) - [E=my_scheme:%1]
-
-    RewriteCond %{HTTP_HOST} (.*)
-    RewriteRule (.*) - [E=my_custom_host:%1]
-
-<#if subdomain>
-    RewriteCond "%{REQUEST_URI}" "^/(v1|v2)/"
-    RewriteCond "%{HTTP_HOST}" ${quotes}^(.*)\.${serverName}$${quotes}
-    RewriteRule "^/(v1|v2)/(.*)$" ${quotes}${webPublicContext}api/docker/%1/$1/$2${quotes} [PT]
-</#if>
-
-<#if (!subdomain && !generalOnly) || isSamePort>
-    RewriteRule "^/(v1|v2)/(.*)$" ${quotes}${webPublicContext}api/docker/${repoKey}/$1/$2${quotes} [P]
-</#if>
-
-    RewriteRule ^/$                ${webPublicContext}webapp/ [R,L]
-    RewriteRule ^/${publicContext}(/)?$      ${webPublicContext}webapp/ [R,L]
-    RewriteRule ^/${publicContext}/webapp$   ${webPublicContext}webapp/ [R,L]
-
-    RequestHeader set Host %{my_custom_host}e
-    RequestHeader set X-Forwarded-Port %{my_server_port}e
-    ## NOTE: {my_scheme} requires a module which is supported only from apache version 2.4 and above
-    RequestHeader set X-Forwarded-Proto %{my_scheme}e
-    RequestHeader set X-Artifactory-Override-Base-Url %{my_scheme}e://${serverName}:%{my_server_port}e${publicContextWithSlash}
-    ProxyPassReverseCookiePath /${absoluteAppContext} /${publicContext}
-
-<#if addGeneral>
-    ProxyRequests off
-    ProxyPreserveHost on
-</#if>
-<#if !addHa>
-    ProxyPass ${webPublicContext} http://${localNameAndPort}/${appContext}
-    ProxyPassReverse ${webPublicContext} http://${localNameAndPort}/${appContext}
-</#if>
-<#if addHa>
-    ProxyPass ${webPublicContext} balancer://${upstreamName}/${appContext}
-    ProxyPassReverse ${webPublicContext} balancer://${upstreamName}/${appContext}
-    Header add Set-Cookie ${quotes}ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/${publicContext}/${quotes} env=BALANCER_ROUTE_CHANGED
-</#if>
-</VirtualHost>
diff --git a/base/common/src/main/resources/templates/nginx.ftl b/base/common/src/main/resources/templates/nginx.ftl
deleted file mode 100644
index e3b476c..0000000
--- a/base/common/src/main/resources/templates/nginx.ftl
+++ /dev/null
@@ -1,61 +0,0 @@
-<#if addHa>
-## add HA entries when ha is configure
-upstream ${upstreamName} {
-ip_hash;
-    <#list hsservers as haserver>
-    server ${haserver};
-    </#list>
-}
-</#if>
-<#if addSsl>
-## add ssl entries when https has been set in config
-ssl_certificate      ${sslCrtPath};
-ssl_certificate_key  ${sslKeyPath};
-ssl_session_cache shared:SSL:1m;
-ssl_prefer_server_ciphers   on;
-</#if>
-## server configuration
-server {
-    <#-- set the server port to lisen , depend if ssl or docker repository is configure  -->
-    <#if !generalOnly>listen ${repoPort}<#if useHttps> ssl</#if>;</#if><#if generalOnly && useHttps>listen ${sslPort} ssl;</#if>
-    <#if useHttp && generalOnly>listen ${httpPort} ;</#if>
-    <#-- set subdomain regex if doocker subdomain method has been define-->
-    <#if subdomain>server_name ~(?<repo>.+)\.${serverName} ${serverName};</#if>
-    <#if !subdomain>server_name ${serverName};</#if>
-    if ($http_x_forwarded_proto = '') {
-        set $http_x_forwarded_proto  $scheme;
-    }
-    ## Application specific logs
-    ## access_log /var/log/nginx/${serverName}-access.log timing;
-    ## error_log /var/log/nginx/${serverName}-error.log;
-<#-- set webapp rewrite incase of general or subdomain setting-->
-<#if generalOnly || subdomain>
-    rewrite ^/$ ${webPublicContext}webapp/ redirect;
-    rewrite ^/${publicContext}/?(/webapp)?$ ${webPublicContext}webapp/ redirect;
-<#-- set docker v1/v2 rewrite incase of subdomain setting-->
-    <#if subdomain>
-    rewrite ^/(v1|v2)/(.*) ${webPublicContext}api/docker/$repo/$1/$2;
-    client_max_body_size 0;
-    chunked_transfer_encoding on;
-    </#if>
-</#if>
-<#-- set docker v1/v2 rewrite incase of port method setting or
- in case docker ssl and general ports are the same-->
-<#if (!generalOnly && !subdomain) || isSamePort>
-    rewrite ^/(v1|v2)/(.*) ${webPublicContext}api/docker/${repoKey}/$1/$2;
-    client_max_body_size 0;
-    chunked_transfer_encoding on;
-</#if>
-<#-- set location and required headers to artifactory server-->
-    location ${webPublicContext} {
-    proxy_read_timeout  900;
-    proxy_pass_header   Server;
-    proxy_cookie_path ~*^/.* /;
-    proxy_pass         http://${localNameAndPort}/${appContext};
-    proxy_set_header   X-Artifactory-Override-Base-Url $http_x_forwarded_proto://$host:$server_port${publicContextWithSlash};
-    proxy_set_header    X-Forwarded-Port  $server_port;
-    proxy_set_header    X-Forwarded-Proto $http_x_forwarded_proto;
-    proxy_set_header    Host              $http_host;
-    proxy_set_header    X-Forwarded-For   $proxy_add_x_forwarded_for;
-    }
-}
diff --git a/base/common/src/test/java/org/artifactory/addon/AddonTypeTest.java b/base/common/src/test/java/org/artifactory/addon/AddonTypeTest.java
deleted file mode 100644
index b13f6ed..0000000
--- a/base/common/src/test/java/org/artifactory/addon/AddonTypeTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * User: Shay Yaakov
- */
- at Test
-public class AddonTypeTest {
-
-    @Test
-    public void testAddonsDisplayOrdinal() {
-        assertEquals(AddonType.AOL.getDisplayOrdinal(), -1, "Unexpected ordinal value");
-        assertEquals(AddonType.BUILD.getDisplayOrdinal(), 100, "Unexpected ordinal value");
-        assertEquals(AddonType.LICENSES.getDisplayOrdinal(), 200, "Unexpected ordinal value");
-        assertEquals(AddonType.REST.getDisplayOrdinal(), 300, "Unexpected ordinal value");
-        assertEquals(AddonType.LDAP.getDisplayOrdinal(), 400, "Unexpected ordinal value");
-        assertEquals(AddonType.REPLICATION.getDisplayOrdinal(), 500, "Unexpected ordinal value");
-        assertEquals(AddonType.PROPERTIES.getDisplayOrdinal(), 600, "Unexpected ordinal value");
-        assertEquals(AddonType.SEARCH.getDisplayOrdinal(), 700, "Unexpected ordinal value");
-        assertEquals(AddonType.PLUGINS.getDisplayOrdinal(), 800, "Unexpected ordinal value");
-        assertEquals(AddonType.YUM.getDisplayOrdinal(), 900, "Unexpected ordinal value");
-        assertEquals(AddonType.P2.getDisplayOrdinal(), 1000, "Unexpected ordinal value");
-        assertEquals(AddonType.NUGET.getDisplayOrdinal(), 1100, "Unexpected ordinal value");
-        assertEquals(AddonType.LAYOUTS.getDisplayOrdinal(), 1200, "Unexpected ordinal value");
-        assertEquals(AddonType.FILTERED_RESOURCES.getDisplayOrdinal(), 1300, "Unexpected ordinal value");
-        assertEquals(AddonType.SSO.getDisplayOrdinal(), 1400, "Unexpected ordinal value");
-        assertEquals(AddonType.WATCH.getDisplayOrdinal(), 1500, "Unexpected ordinal value");
-        assertEquals(AddonType.WEBSTART.getDisplayOrdinal(), 1600, "Unexpected ordinal value");
-    }
-}
diff --git a/base/common/src/test/java/org/artifactory/build/BuildInfoIOTest.java b/base/common/src/test/java/org/artifactory/build/BuildInfoIOTest.java
deleted file mode 100644
index 4c2607a..0000000
--- a/base/common/src/test/java/org/artifactory/build/BuildInfoIOTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.build;
-
-import org.artifactory.api.jackson.JacksonFactory;
-import org.codehaus.jackson.JsonGenerator;
-import org.jfrog.build.api.Build;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.io.StringWriter;
-
-/**
- * Different parsing\generation tests for the build info JSON
- *
- * @author Noam Y. Tenne
- */
- at Test
-public class BuildInfoIOTest {
-
-    /**
-     * Generate a simple object and make sure it has no null fields
-     */
-    public void generateFromObject() throws IOException {
-        Build build = new Build();
-        StringWriter out = new StringWriter();
-        JsonGenerator generator = JacksonFactory.createJsonGenerator(out);
-        generator.writeObject(build);
-        String result = out.getBuffer().toString();
-
-        System.out.println("result = " + result);
-
-        Assert.assertFalse(result.contains("null"), "Result should not contain null fields");
-    }
-}
\ No newline at end of file
diff --git a/base/common/src/test/java/org/artifactory/common/IvyNamingTest.java b/base/common/src/test/java/org/artifactory/common/IvyNamingTest.java
deleted file mode 100644
index 4cde2ac..0000000
--- a/base/common/src/test/java/org/artifactory/common/IvyNamingTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.common;
-
-import org.artifactory.ivy.IvyNaming;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-/**
- * Tests the IvyNaming.
- *
- * @author Yossi Shaul
- */
- at Test
-public class IvyNamingTest {
-
-    public void ivyFileName() {
-        assertTrue(IvyNaming.isIvyFileName("ivy.xml"));
-        assertTrue(IvyNaming.isIvyFileName("ivy-.xml"));
-        assertTrue(IvyNaming.isIvyFileName("ivy-.ivy"));
-        assertTrue(IvyNaming.isIvyFileName("organisation-ivy.xml"));
-        assertTrue(IvyNaming.isIvyFileName("ivy-1.2.2.3.4.xml"));
-        assertFalse(IvyNaming.isIvyFileName("1ivy.xml"));
-        assertFalse(IvyNaming.isIvyFileName("ivyy.xml"));
-        assertFalse(IvyNaming.isIvyFileName("xxx.ivy.xml"));
-    }
-
-}
diff --git a/base/common/src/test/java/org/artifactory/converters/ConvertersManagerTest.java b/base/common/src/test/java/org/artifactory/converters/ConvertersManagerTest.java
deleted file mode 100644
index 8968ee9..0000000
--- a/base/common/src/test/java/org/artifactory/converters/ConvertersManagerTest.java
+++ /dev/null
@@ -1,145 +0,0 @@
-package org.artifactory.converters;
-
-import org.artifactory.version.ArtifactoryVersion;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-
-import static org.artifactory.converters.helpers.ConvertersManagerTestHelper.*;
-import static org.artifactory.version.ArtifactoryVersion.v301;
-import static org.artifactory.version.ArtifactoryVersion.v310;
-
-/**
- * @author Gidi Shabat
- */
- at Test
-
-public class ConvertersManagerTest {
-
-    /**
-     * Convert artifactory which home is version 3.0.1  DBProperties is 3.0.1 and cluster version is 3.0.1
-     */
-    public void convertAll301() throws IOException {
-        createEnvironment(v301, v301, v301);
-        // Make sure that the artifactory local home properties.file has been updated
-        Assert.assertTrue(isArtifactoryLocalHomePropertiesHasBeenUpdatedToCurrent());
-        Assert.assertTrue(isArtifactoryLocalHomePropertiesHasBeenUpdated());
-        // Make sure that the artifactory local home properties.file has been updated
-        Assert.assertTrue(isArtifactoryClusterHomePropertiesHasBeenUpdatedToCurrent());
-        Assert.assertTrue(isArtifactoryClusterHomePropertiesHasBeenUpdated());
-        // Make sure that the artifactory db properties has been updated
-        Assert.assertTrue(isArtifactoryDBPropertiesHasBeenUpdated());
-    }
-
-
-    /**
-     * Convert artifactory which home is version 3.0.4  DBProperties is 3.0.4 and cluster version is 3.0.4
-     */
-    public void convertAll304() throws IOException {
-        createEnvironment(v301, v301, v301);
-        // Make sure that the artifactory local home properties.file has been updated
-        Assert.assertTrue(isArtifactoryLocalHomePropertiesHasBeenUpdatedToCurrent());
-        Assert.assertTrue(isArtifactoryLocalHomePropertiesHasBeenUpdated());
-        // Make sure that the artifactory local home properties.file has been updated
-        Assert.assertTrue(isArtifactoryClusterHomePropertiesHasBeenUpdatedToCurrent());
-        Assert.assertTrue(isArtifactoryClusterHomePropertiesHasBeenUpdated());
-        // Make sure that the artifactory db properties has been updated
-        Assert.assertTrue(isArtifactoryDBPropertiesHasBeenUpdated());
-    }
-
-    /**
-     * Convert artifactory which home is version current  DBProperties is current and cluster version is current
-     */
-    public void convertAllCurrent() throws IOException {
-        ArtifactoryVersion current = ArtifactoryVersion.getCurrent();
-        createEnvironment(current, current, current);
-        // Make sure that the artifactory local home properties.file has been updated
-        Assert.assertFalse(isArtifactoryLocalHomePropertiesHasBeenUpdated());
-        // Make sure that the artifactory local home properties.file has been updated
-        Assert.assertFalse(isArtifactoryClusterHomePropertiesHasBeenUpdated());
-        // Make sure that the artifactory db properties has been updated
-        Assert.assertFalse(isArtifactoryDBPropertiesHasBeenUpdated());
-    }
-
-    /**
-     * Convert artifactory which home is version null  DBProperties is null and cluster version is null
-     */
-    public void convertNoVersions() throws IOException {
-        createEnvironment(null, null, null);
-        // Make sure that the artifactory local home properties.file has been updated
-        Assert.assertFalse(isArtifactoryLocalHomePropertiesHasBeenUpdated());
-        // Make sure that the artifactory local home properties.file has been updated
-        Assert.assertFalse(isArtifactoryClusterHomePropertiesHasBeenUpdated());
-        // Make sure that the artifactory db properties has been updated
-        Assert.assertTrue(isArtifactoryDBPropertiesHasBeenUpdated());
-    }
-
-    /**
-     * Convert artifactory which home is current  DBProperties is 3.0.1 and cluster version is current
-     * <p/>
-     * In case that the db_properties doesn't exist then take the version from home.
-     * This is dangerous: in case that the home version is current no db conversion will run
-     */
-    public void convertCurrentHomeNoDbCurrentCluster() throws IOException {
-        ArtifactoryVersion current = ArtifactoryVersion.getCurrent();
-        createEnvironment(current, v301, current);
-        // Make sure that the artifactory local home properties.file has been updated
-        Assert.assertFalse(isArtifactoryLocalHomePropertiesHasBeenUpdated());
-        // Make sure that the artifactory local home properties.file has been updated
-        Assert.assertFalse(isArtifactoryClusterHomePropertiesHasBeenUpdated());
-        // Make sure that the artifactory db properties has been updated
-        Assert.assertTrue(isArtifactoryDBPropertiesHasBeenUpdated());
-    }
-
-    /**
-     * * Convert artifactory which home is version current  DBProperties is 3.1.0 and cluster version is current
-     */
-    public void convertCurrentHomeOldDbCurrentCluster() throws IOException {
-        ArtifactoryVersion current = ArtifactoryVersion.getCurrent();
-        createEnvironment(current, v310, current);
-        // Make sure that the artifactory local home properties.file has been updated
-        Assert.assertFalse(isArtifactoryLocalHomePropertiesHasBeenUpdated());
-        // Make sure that the artifactory local cluster properties.file has been updated
-        Assert.assertFalse(isArtifactoryClusterHomePropertiesHasBeenUpdated());
-        // Make sure that the artifactory db properties has been updated
-        Assert.assertTrue(isArtifactoryDBPropertiesHasBeenUpdated());
-    }
-
-
-    /**
-     * Convert artifactory which home is version 3.0.1  DBProperties is current and cluster version is current
-     */
-    public void convertOldHomeCurrentDbCurrentCluster() throws IOException {
-        ArtifactoryVersion current = ArtifactoryVersion.getCurrent();
-        createEnvironment(v301, current, current);
-        // Make sure that the artifactory local home properties.file has been updated
-        Assert.assertTrue(isArtifactoryLocalHomePropertiesHasBeenUpdatedToCurrent());
-        Assert.assertTrue(isArtifactoryLocalHomePropertiesHasBeenUpdated());
-        // Make sure that the artifactory cluster home properties.file has been updated
-        Assert.assertFalse(isArtifactoryClusterHomePropertiesHasBeenUpdated());
-        // Make sure that the artifactory db properties has been updated
-        Assert.assertFalse(isArtifactoryDBPropertiesHasBeenUpdated());
-    }
-
-    /**
-     * Convert artifactory which home is version current  DBProperties iscurrent and cluster version is 3.0.1
-     */
-    public void convertCurrentHomeCurrentDbOldCluster() throws IOException {
-        ArtifactoryVersion current = ArtifactoryVersion.getCurrent();
-        createEnvironment(current, current, v301);
-        // Make sure that the artifactory local home properties.file has been updated
-        Assert.assertFalse(isArtifactoryLocalHomePropertiesHasBeenUpdated());
-        // Make sure that the artifactory cluster home properties.file has been updated
-        Assert.assertTrue(isArtifactoryClusterHomePropertiesHasBeenUpdatedToCurrent());
-        Assert.assertTrue(isArtifactoryClusterHomePropertiesHasBeenUpdated());
-        // Make sure that the artifactory db properties has been updated
-        Assert.assertFalse(isArtifactoryDBPropertiesHasBeenUpdated());
-    }
-}
-
-
-
-
-
-
diff --git a/base/common/src/test/java/org/artifactory/converters/ConvertersManagerWithRevertBackupTest.java b/base/common/src/test/java/org/artifactory/converters/ConvertersManagerWithRevertBackupTest.java
deleted file mode 100644
index c899b81..0000000
--- a/base/common/src/test/java/org/artifactory/converters/ConvertersManagerWithRevertBackupTest.java
+++ /dev/null
@@ -1,123 +0,0 @@
-package org.artifactory.converters;
-
-import org.apache.commons.io.FileUtils;
-import org.artifactory.api.context.ArtifactoryContextThreadBinder;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.property.FatalConversionException;
-import org.artifactory.converters.helpers.MockArtifactoryContext;
-import org.artifactory.converters.helpers.MockArtifactoryHome;
-import org.artifactory.util.ResourceUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-
-import static org.artifactory.common.ArtifactoryHome.LOGBACK_CONFIG_FILE_NAME;
-import static org.artifactory.common.ArtifactoryHome.MIME_TYPES_FILE_NAME;
-import static org.artifactory.converters.helpers.ConvertersManagerTestHelper.*;
-import static org.artifactory.version.ArtifactoryVersion.v301;
-
-/**
- * The test makes sure to revert the logBack and the mimetype files in case of invalid license
- *
- * @author Gidi Shabat
- */
- at Test
-public class ConvertersManagerWithRevertBackupTest {
-
-    /**
-     * Revert home conversions in case of invalid license
-     */
-    public void ensureRevertHomeConversionOnInvalidLicense() throws IOException {
-        // Update Artifactory home files to be v301 compliant
-        createHomeEnvironment(v301, v301);
-        // Create ArtifactoryHome
-        ArtifactoryHome artifactoryHome = new MockArtifactoryHome();
-        // Create versionProvider
-        VersionProviderImpl versionProvider = new VersionProviderImpl(artifactoryHome);
-        // Create converter manager
-        ConvertersManagerImpl convertersManager = new ConvertersManagerImpl(artifactoryHome, versionProvider);
-        // Run home conversion
-        File logBackSourceFile = new File(ArtifactoryHome.get().getEtcDir(), LOGBACK_CONFIG_FILE_NAME);
-        String logBackSource301 = FileUtils.readFileToString(logBackSourceFile);
-        File mimeTypeSourceFile = new File(ArtifactoryHome.get().getEtcDir(), MIME_TYPES_FILE_NAME);
-        String mimeTypeSource301 = FileUtils.readFileToString(mimeTypeSourceFile);
-        convertersManager.convertHomes();
-        // Now bind ArtifactoryContext and artifactoryHome like in real environment
-        MockArtifactoryContext artifactoryContext = new MockArtifactoryContext(v301, 1, convertersManager,
-                versionProvider, false);
-        ArtifactoryContextThreadBinder.bind(artifactoryContext);
-        ArtifactoryHome.bind(artifactoryHome);
-        ((VersionProviderImpl) artifactoryContext.getVersionProvider()).loadDbVersion();
-        // Now Ensure that all backup files exist
-        File logBackBackupFile = new File(ArtifactoryHome.get().getEtcDir(), LOGBACK_CONFIG_FILE_NAME + ".back");
-        File mimeTypeBackupFile = new File(ArtifactoryHome.get().getEtcDir(), MIME_TYPES_FILE_NAME + ".back");
-        Assert.assertTrue(logBackBackupFile.exists());
-        Assert.assertTrue(mimeTypeBackupFile.exists());
-        try {
-            convertersManager.beforeInits();
-        } catch (FatalConversionException e) {
-            // Now Ensure that all backup files were deleted
-            Assert.assertFalse(logBackBackupFile.exists());
-            Assert.assertFalse(mimeTypeBackupFile.exists());
-            // Ensure logBack has been reverted
-            File revert = new File(ArtifactoryHome.get().getEtcDir(), LOGBACK_CONFIG_FILE_NAME);
-            String newLogBack = FileUtils.readFileToString(revert);
-            Assert.assertEquals(newLogBack, logBackSource301);
-            // Ensure mimeType has been reverted
-            File mimeTypeRevert = new File(ArtifactoryHome.get().getEtcDir(), MIME_TYPES_FILE_NAME);
-            String newMimeType = FileUtils.readFileToString(mimeTypeRevert);
-            Assert.assertEquals(newMimeType, mimeTypeSource301);
-            return;
-        }
-        Assert.fail();
-    }
-
-    /**
-     * Complete home conversions in case of valid license
-     */
-    public void ensureCompleteHomeConversionOnValidLicense() throws IOException {
-        // Update Artifactory home files to be v301 compliant
-        createHomeEnvironment(v301, v301);
-        // Create ArtifactoryHome
-        ArtifactoryHome artifactoryHome = new MockArtifactoryHome();
-        // Create versionProvider
-        VersionProviderImpl versionProvider = new VersionProviderImpl(artifactoryHome);
-        // Create converter manager
-        ConvertersManagerImpl convertersManager = new ConvertersManagerImpl(artifactoryHome, versionProvider);
-        // Run home conversion
-        convertersManager.convertHomes();
-        // Now bind ArtifactoryContext and artifactoryHome like in real environment
-        MockArtifactoryContext artifactoryContext = new MockArtifactoryContext(v301, 1, convertersManager,
-                versionProvider, true);
-        ArtifactoryContextThreadBinder.bind(artifactoryContext);
-        ArtifactoryHome.bind(artifactoryHome);
-        ((VersionProviderImpl) artifactoryContext.getVersionProvider()).loadDbVersion();
-        // Make sure that the backup files exist
-        File logBackBackupFile = new File(ArtifactoryHome.get().getEtcDir(), LOGBACK_CONFIG_FILE_NAME + ".back");
-        File mimeTypeBackupFile = new File(ArtifactoryHome.get().getEtcDir(), MIME_TYPES_FILE_NAME + ".back");
-        Assert.assertTrue(logBackBackupFile.exists());
-        Assert.assertTrue(mimeTypeBackupFile.exists());
-        // Call "beforeInits" event and make sure that all the changes have been reverted
-        convertersManager.beforeInits();
-        // Ensure that backup files were deleted
-        Assert.assertFalse(logBackBackupFile.exists());
-        Assert.assertFalse(mimeTypeBackupFile.exists());
-
-        // Ensure logBack has not been reverted
-        File logBackRevert = new File(ArtifactoryHome.get().getEtcDir(), LOGBACK_CONFIG_FILE_NAME);
-        String newLogBack = FileUtils.readFileToString(logBackRevert);
-        String pathToLogBack301 = "/converters/templates/home/3.0.1";
-        String logBack301 = ResourceUtils.getResourceAsString(pathToLogBack301 + "/" + LOGBACK_CONFIG_FILE_NAME);
-        Assert.assertNotEquals(newLogBack, logBack301);
-
-        // Ensure mimeType has not been reverted
-        File mimeTypeRevert = new File(ArtifactoryHome.get().getEtcDir(), MIME_TYPES_FILE_NAME);
-        String newMimeType = FileUtils.readFileToString(mimeTypeRevert);
-        String pathToMimeType301 = "/converters/templates/home/3.0.1";
-        String mimeType301 = ResourceUtils.getResourceAsString(pathToMimeType301 + "/" + MIME_TYPES_FILE_NAME);
-        Assert.assertNotEquals(newMimeType, mimeType301);
-    }
-
-}
diff --git a/base/common/src/test/java/org/artifactory/converters/helpers/ConvertersManagerTestHelper.java b/base/common/src/test/java/org/artifactory/converters/helpers/ConvertersManagerTestHelper.java
deleted file mode 100644
index da9ccea..0000000
--- a/base/common/src/test/java/org/artifactory/converters/helpers/ConvertersManagerTestHelper.java
+++ /dev/null
@@ -1,173 +0,0 @@
-package org.artifactory.converters.helpers;
-
-import org.apache.commons.io.FileUtils;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ArtifactoryContextThreadBinder;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ha.HaNodeProperties;
-import org.artifactory.converters.ConvertersManagerImpl;
-import org.artifactory.converters.VersionProviderImpl;
-import org.artifactory.util.ResourceUtils;
-import org.artifactory.version.ArtifactoryVersion;
-import org.joda.time.DateTimeUtils;
-import org.testng.Assert;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Properties;
-
-import static org.artifactory.common.ArtifactoryHome.*;
-import static org.artifactory.common.ConstantValues.*;
-
-/**
- * Helper static methods for the ConverterManagerTest.
- *
- * @author Gidi Shabat
- */
-public class ConvertersManagerTestHelper {
-    public static final String home = "target/converterManagerTest/";
-    public static final String localHomeTestFile = home + ".history/localHome.test";
-    public static final String clusterHomeTestFile = home + ".history/localCluster.test";
-    public static final String dbHomeTestFile = home + ".history/db.test";
-
-    /**
-     * Creates Complete environment files and database simulator
-     */
-    public static ArtifactoryContext createEnvironment(ArtifactoryVersion homeVersion, ArtifactoryVersion dbVersion,
-            ArtifactoryVersion clusterVersion)
-            throws IOException {
-        createHomeEnvironment(homeVersion, clusterVersion);
-        ArtifactoryHome artifactoryHome = new MockArtifactoryHome();
-        VersionProviderImpl versionProvider = new VersionProviderImpl(artifactoryHome);
-        ConvertersManagerImpl convertersManager = new ConvertersManagerImpl(artifactoryHome, versionProvider);
-        convertersManager.getLocalHomeConverters().add(new MockHomeConverter(localHomeTestFile));
-        convertersManager.getClusterHomeConverters().add(new MockHomeConverter(clusterHomeTestFile));
-        convertersManager.convertHomes();
-        MockArtifactoryContext artifactoryContext = new MockArtifactoryContext(dbVersion, 1, convertersManager,
-                versionProvider, true);
-        ArtifactoryContextThreadBinder.bind(artifactoryContext);
-        ArtifactoryHome.bind(artifactoryHome);
-        ((VersionProviderImpl) artifactoryContext.getVersionProvider()).loadDbVersion();
-        MockHomeConverter artifactoryConverter = new MockHomeConverter(dbHomeTestFile);
-        convertersManager.beforeInits();
-        convertersManager.serviceConvert(artifactoryConverter);
-        convertersManager.afterAllInits();
-        convertersManager.afterContextReady();
-        return artifactoryContext;
-    }
-
-    public static boolean isArtifactoryClusterHomePropertiesHasBeenUpdated() throws IOException {
-        return isArtifactoryPropertiesHasBeenUpdated(clusterHomeTestFile);
-    }
-
-    public static boolean isArtifactoryLocalHomePropertiesHasBeenUpdated() throws IOException {
-        return isArtifactoryPropertiesHasBeenUpdated(localHomeTestFile);
-    }
-
-    public static boolean isArtifactoryDBPropertiesHasBeenUpdated() throws IOException {
-        return isArtifactoryPropertiesHasBeenUpdated(dbHomeTestFile);
-    }
-
-    public static boolean isArtifactoryClusterHomePropertiesHasBeenUpdatedToCurrent() throws IOException {
-        return isArtifactoryPropertiesHasBeenUpdatedToCurrentVersion(".artifactory-ha/ha-data/artifactory.properties");
-    }
-
-    public static boolean isArtifactoryLocalHomePropertiesHasBeenUpdatedToCurrent() throws IOException {
-        return isArtifactoryPropertiesHasBeenUpdatedToCurrentVersion(".artifactory/data/artifactory.properties");
-    }
-
-    private static boolean isArtifactoryPropertiesHasBeenUpdated(String path) throws IOException {
-        File file = new File(path);
-        return file.exists();
-    }
-
-    private static boolean isArtifactoryPropertiesHasBeenUpdatedToCurrentVersion(String path) throws IOException {
-        Properties properties = new Properties();
-        try (FileInputStream inStream = new FileInputStream(home + path)) {
-            properties.load(inStream);
-            // Assert that the Artifactory.properties file has been updated
-            String runningVersion = ContextHelper.get().getVersionProvider().getRunning().getVersion().getValue();
-            return properties.get("artifactory.version").equals(runningVersion);
-        }
-    }
-
-    public static void createHomeEnvironment(ArtifactoryVersion homeVersion, ArtifactoryVersion clusterVersion)
-            throws IOException {
-        File homeDir = new File(home);
-        File artDir = new File(homeDir, ".artifactory");
-        File artHa = new File(homeDir, ".artifactory-ha");
-
-        FileUtils.deleteDirectory(artDir);
-        FileUtils.deleteDirectory(artHa);
-        FileUtils.deleteDirectory(new File(homeDir, ".history"));
-
-        homeDir.mkdir();
-        Assert.assertTrue(artDir.mkdir());
-        Assert.assertTrue(artHa.mkdir());
-        Assert.assertTrue(new File(homeDir, ".history").mkdir());
-        Assert.assertTrue(new File(artHa, "ha-data").mkdir());
-        Assert.assertTrue(new File(artHa, "ha-etc").mkdir());
-        if (homeVersion != null) {
-            File dataDir = new File(artDir, "data");
-            File etcDir = new File(artDir, "etc");
-            Assert.assertTrue(dataDir.mkdir());
-            Assert.assertTrue(etcDir.mkdir());
-            Properties artifactoryProperties = createArtifactoryProperties(homeVersion);
-            String basePath = "/converters/templates/home/" + homeVersion.getValue();
-            Properties haNodeProperties = createHaNodeProperties();
-            try (FileOutputStream out = new FileOutputStream(new File(dataDir, ARTIFACTORY_PROPERTIES_FILE))) {
-                artifactoryProperties.store(out, "");
-            }
-            try (FileOutputStream out = new FileOutputStream(new File(etcDir, ARTIFACTORY_HA_NODE_PROPERTIES_FILE))) {
-                haNodeProperties.store(out, "");
-            }
-            if (!homeVersion.isCurrent()) {
-                String logbackValue = ResourceUtils.getResourceAsString(basePath + "/" + LOGBACK_CONFIG_FILE_NAME);
-                String mimetypesValue = ResourceUtils.getResourceAsString(basePath + "/" + MIME_TYPES_FILE_NAME);
-                // HOME
-                FileUtils.write(new File(etcDir, LOGBACK_CONFIG_FILE_NAME), logbackValue);
-                FileUtils.write(new File(etcDir, MIME_TYPES_FILE_NAME), mimetypesValue);
-            }
-        }
-        if (clusterVersion != null) {
-            String basePath = "/converters/templates/home/" + clusterVersion.getValue();
-            Properties artifactoryProperties = createArtifactoryProperties(clusterVersion);
-            String clusterPropertiesValue = "security.token=76b07383dcda344979681e01efa5ac50";
-            FileUtils.write(new File(home + ".artifactory-ha/ha-etc/" + CLUSTER_PROPS_FILE), clusterPropertiesValue);
-            try (FileOutputStream out = new FileOutputStream(
-                    home + ".artifactory-ha/ha-data/" + ARTIFACTORY_PROPERTIES_FILE)) {
-                artifactoryProperties.store(out, "");
-            }
-            if (!clusterVersion.isCurrent()) {
-                String logbackValue = ResourceUtils.getResourceAsString(basePath + "/" + LOGBACK_CONFIG_FILE_NAME);
-                String mimetypesValue = ResourceUtils.getResourceAsString(basePath + "/" + MIME_TYPES_FILE_NAME);
-                // HA
-                FileUtils.write(new File(home + ".artifactory-ha/ha-etc/" + LOGBACK_CONFIG_FILE_NAME), logbackValue);
-                FileUtils.write(new File(home + ".artifactory-ha/ha-etc/" + MIME_TYPES_FILE_NAME), mimetypesValue);
-            }
-
-        }
-    }
-
-    private static Properties createHaNodeProperties() {
-        Properties properties = new Properties();
-        properties.put(HaNodeProperties.PROP_NODE_ID, "pom");
-        properties.put(HaNodeProperties.PROP_CLUSTER_HOME,
-                System.getProperties().get("user.dir") + "/" + home + ".artifactory-ha");
-        properties.put(HaNodeProperties.PROP_CONTEXT_URL, "localhost");
-        // TODO: Test block when conf as slave
-        properties.put(HaNodeProperties.PROP_PRIMARY, "true");
-        return properties;
-    }
-
-    private static Properties createArtifactoryProperties(ArtifactoryVersion version) {
-        Properties properties = new Properties();
-        properties.put(artifactoryVersion.getPropertyName(), version.getValue());
-        properties.put(artifactoryRevision.getPropertyName(), "" + version.getRevision());
-        properties.put(artifactoryTimestamp.getPropertyName(), "" + DateTimeUtils.currentTimeMillis());
-        return properties;
-    }
-}
diff --git a/base/common/src/test/java/org/artifactory/converters/helpers/MockArtifactoryContext.java b/base/common/src/test/java/org/artifactory/converters/helpers/MockArtifactoryContext.java
deleted file mode 100644
index 211356d..0000000
--- a/base/common/src/test/java/org/artifactory/converters/helpers/MockArtifactoryContext.java
+++ /dev/null
@@ -1,170 +0,0 @@
-package org.artifactory.converters.helpers;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.converters.ConverterManager;
-import org.artifactory.converters.ConvertersManagerImpl;
-import org.artifactory.converters.VersionProvider;
-import org.artifactory.converters.VersionProviderImpl;
-import org.artifactory.sapi.common.ExportSettings;
-import org.artifactory.sapi.common.ImportSettings;
-import org.artifactory.spring.SpringConfigPaths;
-import org.artifactory.state.model.ArtifactoryStateManager;
-import org.artifactory.storage.db.properties.service.ArtifactoryCommonDbPropertiesService;
-import org.artifactory.storage.db.servers.service.ArtifactoryServersCommonService;
-import org.artifactory.version.ArtifactoryVersion;
-
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.util.Map;
-
-/**
- * @author Gidi Shabat
- */
-public class MockArtifactoryContext implements ArtifactoryContext {
-
-    private final MockDbPropertiesService mockDbPropertiesService;
-    private final MockArtifactoryStateManager mockArtifactoryStateManager;
-    private final MockArtifactoryServersCommonService mockArtifactoryServersCommonService;
-    private final AddonsManager addonsManager;
-    private ConvertersManagerImpl convertersManager;
-    private VersionProviderImpl versionProvider;
-
-    public MockArtifactoryContext(ArtifactoryVersion version, long release, ConvertersManagerImpl convertersManager,
-            VersionProviderImpl versionProvider, final boolean validLicense) {
-        this.convertersManager = convertersManager;
-        this.versionProvider = versionProvider;
-        mockDbPropertiesService = new MockDbPropertiesService(version, release);
-        mockArtifactoryStateManager = new MockArtifactoryStateManager();
-        mockArtifactoryServersCommonService = new MockArtifactoryServersCommonService(version);
-        ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
-        Class[] interfaces = {AddonsManager.class};
-        addonsManager = (AddonsManager) Proxy.newProxyInstance(contextClassLoader, interfaces, new InvocationHandler() {
-            @Override
-            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
-                if ("lockdown".equals(method.getName())) {
-                    return !validLicense;
-                }
-                return null;
-            }
-        });
-    }
-
-    @Override
-    public <T> T beanForType(String name, Class<T> type) {
-        return null;
-    }
-
-    @Override
-    public CentralConfigService getCentralConfig() {
-        return null;
-    }
-
-    @Override
-    public <T> T beanForType(Class<T> type) {
-        if (type.equals(ArtifactoryCommonDbPropertiesService.class)) {
-            return (T) mockDbPropertiesService;
-        }
-        if (type.equals(ArtifactoryStateManager.class)) {
-            return (T) mockArtifactoryStateManager;
-        }
-        if (type.equals(ArtifactoryServersCommonService.class)) {
-            return (T) mockArtifactoryServersCommonService;
-        }
-        if (type.equals(AddonsManager.class)) {
-            return (T) addonsManager;
-        }
-
-        return null;
-    }
-
-    @Override
-    public <T> Map<String, T> beansForType(Class<T> type) {
-        return null;
-    }
-
-    @Override
-    public Object getBean(String name) {
-        return null;
-    }
-
-    @Override
-    public RepositoryService getRepositoryService() {
-        return null;
-    }
-
-    @Override
-    public AuthorizationService getAuthorizationService() {
-        return null;
-    }
-
-    @Override
-    public long getUptime() {
-        return 0;
-    }
-
-    @Override
-    public ArtifactoryHome getArtifactoryHome() {
-        return null;
-    }
-
-    @Override
-    public String getContextId() {
-        return null;
-    }
-
-    @Override
-    public SpringConfigPaths getConfigPaths() {
-        return null;
-    }
-
-    @Override
-    public String getServerId() {
-        return "test";
-    }
-
-    @Override
-    public boolean isOffline() {
-        return false;
-    }
-
-    @Override
-    public void setOffline() {
-    }
-
-    @Override
-    public ConverterManager getConverterManager() {
-        return convertersManager;
-    }
-
-    @Override
-    public VersionProvider getVersionProvider() {
-        return versionProvider;
-    }
-
-    @Override
-    public void destroy() {
-        // NOOP
-    }
-
-    @Override
-    public void exportTo(ExportSettings settings) {
-    }
-
-    @Override
-    public void importFrom(ImportSettings settings) {
-    }
-
-    public MockDbPropertiesService getMockDbPropertiesService() {
-        return mockDbPropertiesService;
-    }
-
-    public MockArtifactoryStateManager getMockArtifactoryStateManager() {
-        return mockArtifactoryStateManager;
-    }
-}
\ No newline at end of file
diff --git a/base/common/src/test/java/org/artifactory/converters/helpers/MockArtifactoryHome.java b/base/common/src/test/java/org/artifactory/converters/helpers/MockArtifactoryHome.java
deleted file mode 100644
index 17acd69..0000000
--- a/base/common/src/test/java/org/artifactory/converters/helpers/MockArtifactoryHome.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.artifactory.converters.helpers;
-
-import org.apache.commons.io.FileUtils;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.version.ArtifactoryVersion;
-import org.artifactory.version.CompoundVersionDetails;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Date;
-
-/**
- * Author: gidis
- */
-public class MockArtifactoryHome extends ArtifactoryHome {
-
-    public MockArtifactoryHome() {
-        super(new File(ConvertersManagerTestHelper.home + ".artifactory"));
-    }
-
-    @Override
-    public CompoundVersionDetails readRunningArtifactoryVersion() {
-        return new CompoundVersionDetails(ArtifactoryVersion.getCurrent(), ArtifactoryVersion.getCurrent().name(), "1",
-                new Date().getTime());
-    }
-
-    @Override
-    public void writeBundledHomeArtifactoryProperties() {
-        File artifactoryPropertiesFile = getHomeArtifactoryPropertiesFile();
-        //Copy the artifactory.properties file into the data folder
-        try {
-            String text = "artifactory.version=" + ArtifactoryVersion.getCurrent().getValue() + "\n" +
-                    "artifactory.revision=1\n" +
-                    "artifactory.release=1\n";
-            //Copy from default
-            FileUtils.writeStringToFile(artifactoryPropertiesFile, text);
-        } catch (IOException e) {
-            throw new RuntimeException("Could not copy " + ARTIFACTORY_PROPERTIES_FILE + " to " +
-                    artifactoryPropertiesFile.getAbsolutePath(), e);
-        }
-    }
-
-    @Override
-    public void writeBundledHaArtifactoryProperties() {
-        File artifactoryPropertiesFile = getHaArtifactoryPropertiesFile();
-        //Copy the artifactory.properties file into the data folder
-        try {
-            String text = "artifactory.version=" + ArtifactoryVersion.getCurrent().getValue() + "\n" +
-                    "artifactory.revision=1\n" +
-                    "artifactory.release=1\n";
-            //Copy from default
-            FileUtils.writeStringToFile(artifactoryPropertiesFile, text);
-        } catch (IOException e) {
-            throw new RuntimeException("Could not copy " + ARTIFACTORY_PROPERTIES_FILE + " to " +
-                    artifactoryPropertiesFile.getAbsolutePath(), e);
-        }
-    }
-}
diff --git a/base/common/src/test/java/org/artifactory/converters/helpers/MockArtifactoryServersCommonService.java b/base/common/src/test/java/org/artifactory/converters/helpers/MockArtifactoryServersCommonService.java
deleted file mode 100644
index e4e979e..0000000
--- a/base/common/src/test/java/org/artifactory/converters/helpers/MockArtifactoryServersCommonService.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.converters.helpers;
-
-import org.artifactory.state.ArtifactoryServerState;
-import org.artifactory.storage.db.servers.model.ArtifactoryServer;
-import org.artifactory.storage.db.servers.model.ArtifactoryServerRole;
-import org.artifactory.storage.db.servers.service.ArtifactoryServersCommonService;
-import org.artifactory.version.ArtifactoryVersion;
-
-import javax.annotation.Nullable;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class MockArtifactoryServersCommonService implements ArtifactoryServersCommonService {
-    public MockArtifactoryServersCommonService(ArtifactoryVersion version) {
-
-    }
-
-    @Nullable
-    @Override
-    public ArtifactoryServer getRunningHaPrimary() {
-        return null;
-    }
-
-    @Override
-    public ArtifactoryServer getCurrentMember() {
-        return null;
-    }
-
-    @Override
-    public List<ArtifactoryServer> getOtherActiveMembers() {
-        return new ArrayList<>();
-    }
-
-    @Override
-    public List<ArtifactoryServer> getActiveMembers() {
-        return null;
-    }
-
-    @Override
-    public List<ArtifactoryServer> getOtherRunningHaMembers() {
-        return null;
-    }
-
-    @Override
-    public ArtifactoryServer getArtifactoryServer(String serverId) {
-        return null;
-    }
-
-    @Override
-    public List<ArtifactoryServer> getAllArtifactoryServers() {
-        return null;
-    }
-
-    @Override
-    public void updateArtifactoryServerRole(String serverId, ArtifactoryServerRole newRole) {
-
-    }
-
-    @Override
-    public void updateArtifactoryJoinPort(String serverId, int port) {
-
-    }
-
-    @Override
-    public void updateArtifactoryServerState(ArtifactoryServer server, ArtifactoryServerState newState) {
-
-    }
-
-    @Override
-    public void createArtifactoryServer(ArtifactoryServer artifactoryServer) {
-
-    }
-
-    @Override
-    public void updateArtifactoryServer(ArtifactoryServer artifactoryServer) {
-
-    }
-
-    @Override
-    public boolean removeServer(String serverId) {
-        return false;
-    }
-
-    @Override
-    public void updateArtifactoryServerHeartbeat(String serverId, long heartBeat) {
-
-    }
-}
diff --git a/base/common/src/test/java/org/artifactory/converters/helpers/MockArtifactoryStateManager.java b/base/common/src/test/java/org/artifactory/converters/helpers/MockArtifactoryStateManager.java
deleted file mode 100644
index 883fcff..0000000
--- a/base/common/src/test/java/org/artifactory/converters/helpers/MockArtifactoryStateManager.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.artifactory.converters.helpers;
-
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.state.ArtifactoryServerState;
-import org.artifactory.state.model.ArtifactoryStateManager;
-import org.artifactory.version.CompoundVersionDetails;
-
-/**
- * Author: gidis
- */
-public class MockArtifactoryStateManager implements ArtifactoryStateManager {
-
-    @Override
-    public boolean forceState(ArtifactoryServerState state) {
-        return false;
-    }
-
-    @Override
-    public void beforeDestroy() {
-    }
-
-    @Override
-    public void init() {
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-    }
-
-    @Override
-    public void destroy() {
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-    }
-
-}
diff --git a/base/common/src/test/java/org/artifactory/converters/helpers/MockDbPropertiesService.java b/base/common/src/test/java/org/artifactory/converters/helpers/MockDbPropertiesService.java
deleted file mode 100644
index a2c0021..0000000
--- a/base/common/src/test/java/org/artifactory/converters/helpers/MockDbPropertiesService.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.artifactory.converters.helpers;
-
-import org.artifactory.storage.db.properties.model.DbProperties;
-import org.artifactory.storage.db.properties.service.ArtifactoryCommonDbPropertiesService;
-import org.artifactory.version.ArtifactoryVersion;
-
-import java.util.Date;
-
-/**
- * @author Gidi Shabat
- */
-public class MockDbPropertiesService implements ArtifactoryCommonDbPropertiesService {
-    private ArtifactoryVersion version;
-    private long release;
-    private DbProperties dbProperties;
-
-    public MockDbPropertiesService(ArtifactoryVersion version, long release) {
-        this.version = version;
-        this.release = release;
-    }
-
-    @Override
-    public void updateDbProperties(DbProperties dbProperties) {
-        this.dbProperties = dbProperties;
-    }
-
-    @Override
-    public DbProperties getDbProperties() {
-        if (version == null) {
-            return null;
-        } else {
-            return new DbProperties(new Date().getTime(), version.getValue(), (int) version.getRevision(), release);
-        }
-    }
-
-    @Override
-    public boolean isDbPropertiesTableExists() {
-        return version != null && ArtifactoryVersion.v310.beforeOrEqual(version);
-    }
-
-    public boolean isUpdateDbPropertiesHasBeenCalled() {
-        return dbProperties != null;
-    }
-}
diff --git a/base/common/src/test/java/org/artifactory/converters/helpers/MockHomeConverter.java b/base/common/src/test/java/org/artifactory/converters/helpers/MockHomeConverter.java
deleted file mode 100644
index 6618cd2..0000000
--- a/base/common/src/test/java/org/artifactory/converters/helpers/MockHomeConverter.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.converters.helpers;
-
-import org.artifactory.converters.ArtifactoryConverterAdapter;
-import org.artifactory.version.CompoundVersionDetails;
-
-import java.io.FileOutputStream;
-
-/**
- * @author Gidi Shabat
- */
-public class MockHomeConverter implements ArtifactoryConverterAdapter {
-    private String parh;
-
-    public MockHomeConverter(String parh) {
-        this.parh = parh;
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-        try {
-            FileOutputStream fileOutputStream = new FileOutputStream(parh);
-            fileOutputStream.close();
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    @Override
-    public boolean isInterested(CompoundVersionDetails source, CompoundVersionDetails target) {
-        return source.getVersion().before(target.getVersion());
-    }
-
-    @Override
-    public void revert() {
-
-    }
-
-    @Override
-    public void backup() {
-
-    }
-
-    @Override
-    public void clean() {
-
-    }
-}
diff --git a/base/common/src/test/java/org/artifactory/maven/MavenModelUtilsTest.java b/base/common/src/test/java/org/artifactory/maven/MavenModelUtilsTest.java
deleted file mode 100644
index 1cac139..0000000
--- a/base/common/src/test/java/org/artifactory/maven/MavenModelUtilsTest.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.maven.artifact.repository.metadata.Metadata;
-import org.apache.maven.artifact.repository.metadata.Snapshot;
-import org.apache.maven.artifact.repository.metadata.SnapshotVersion;
-import org.apache.maven.artifact.repository.metadata.Versioning;
-import org.apache.maven.model.Model;
-import org.apache.maven.model.Parent;
-import org.artifactory.api.artifact.UnitInfo;
-import org.artifactory.api.maven.MavenArtifactInfo;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.module.ModuleInfoBuilder;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.common.property.ArtifactorySystemProperties;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.artifactory.test.ArtifactoryHomeStub;
-import org.artifactory.util.ResourceUtils;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-/**
- * Unit tests for MavenModelUtils
- *
- * @author Yossi Shaul
- */
- at Test
-public class MavenModelUtilsTest extends ArtifactoryHomeBoundTest {
-
-    public void testToMaven1Path() {
-        String maven1Url = MavenNaming.toMaven1Path(
-                "org/apache/commons/commons-email/1.1/commons-email-1.1.jar");
-        assertEquals("org.apache.commons/jars/commons-email-1.1.jar", maven1Url);
-    }
-
-    public void testToMaven1PathPom() {
-        String maven1Url = MavenNaming.toMaven1Path(
-                "org/apache/commons/commons-email/1.1/commons-email-1.1.pom");
-        assertEquals("org.apache.commons/poms/commons-email-1.1.pom", maven1Url);
-    }
-
-    public void testToMaven1PathMd5() {
-        String maven1Url = MavenNaming.toMaven1Path(
-                "com/sun/commons/logging-api/1.0.4/logging-api-1.0.4.jar.md5");
-        assertEquals("com.sun.commons/jars/logging-api-1.0.4.jar.md5", maven1Url);
-    }
-
-    public void testToMaven1PathSha1() {
-        String maven1Url = MavenNaming.toMaven1Path(
-                "com/sun/commons/logging-api/1.0.4/logging-api-1.0.4.pom.sha1");
-        assertEquals("com.sun.commons/poms/logging-api-1.0.4.pom.sha1", maven1Url);
-    }
-
-    public void validStringToMetadataNoVersioning() throws IOException {
-        Metadata metadata = MavenModelUtils.toMavenMetadata(
-                "<metadata>\n" +
-                        "<groupId>boo</groupId>\n" +
-                        "<artifactId>boo</artifactId>\n" +
-                        "<version>0.5.1</version>\n" +
-                        "</metadata>");
-
-        assertEquals(metadata.getGroupId(), "boo");
-        assertEquals(metadata.getArtifactId(), "boo");
-        assertEquals(metadata.getVersion(), "0.5.1");
-        assertNull(metadata.getVersioning());
-    }
-
-    public void validStringToMetadata() throws IOException {
-        Metadata metadata = MavenModelUtils.toMavenMetadata(
-                "<metadata>\n" +
-                        "<groupId>boo</groupId>\n" +
-                        "<artifactId>boo</artifactId>\n" +
-                        "<version>0.7.0.1921</version>\n" +
-                        "<versioning>\n" +
-                        "<versions>\n" +
-                        "<version>0.7.0.1921</version>\n" +
-                        "</versions>\n" +
-                        "</versioning>\n" +
-                        "</metadata>");
-
-        assertEquals(metadata.getGroupId(), "boo");
-        Versioning versioning = metadata.getVersioning();
-        assertNotNull(versioning);
-        assertEquals(versioning.getVersions().size(), 1);
-    }
-
-    @Test(expectedExceptions = IOException.class)
-    public void nonValidMetadataString() throws IOException {
-        MavenModelUtils.toMavenMetadata(
-                "<metadatablabla\n" +
-                        "<artifactId>boo</artifactId>\n" +
-                        "<version>0.5.1</version>\n" +
-                        "</metadata>");
-    }
-
-    public void inputStreamToMavenMetadata() throws IOException {
-        InputStream is = getClass().getResourceAsStream("/org/artifactory/maven/maven-metadata.xml");
-        Metadata metadata = MavenModelUtils.toMavenMetadata(is);
-        assertNotNull(metadata.getVersioning());
-    }
-
-    public void mavenMetadataToString() throws IOException {
-        Metadata metadata = new Metadata();
-        metadata.setArtifactId("theartid");
-        metadata.setGroupId("thegroupid");
-
-        String metadataStr = MavenModelUtils.mavenMetadataToString(metadata);
-        assertNotNull(metadataStr);
-        Metadata newMetadata = MavenModelUtils.toMavenMetadata(metadataStr);
-        assertEquals(newMetadata.getArtifactId(), metadata.getArtifactId());
-        assertEquals(newMetadata.getGroupId(), metadata.getGroupId());
-    }
-
-    public void getArtifactInfoPom() throws Exception {
-        File artifact = ResourceUtils.getResourceAsFile("/org/artifactory/maven/yourpit-1.0.0-alpha2.pom");
-        MavenArtifactInfo artifactInfo = MavenModelUtils.artifactInfoFromFile(artifact);
-        assertEquals(artifactInfo.getGroupId(), "org.yourpit");
-        assertEquals(artifactInfo.getArtifactId(), "yourpit");
-        assertEquals(artifactInfo.getVersion(), "1.0.0-alpha2");
-        assertNull(artifactInfo.getClassifier(), "Classifier should be null");
-    }
-
-    public void getArtifactInfoJar() throws Exception {
-        File artifact = ResourceUtils.getResourceAsFile("/org/artifactory/maven/testng-5.11-jdk15.jar");
-        MavenArtifactInfo artifactInfo = MavenModelUtils.artifactInfoFromFile(artifact);
-        assertEquals(artifactInfo.getGroupId(), "testng");
-        assertEquals(artifactInfo.getArtifactId(), "testng");
-        assertEquals(artifactInfo.getVersion(), "5.11");
-        assertEquals(artifactInfo.getClassifier(), "jdk15");
-    }
-
-    public void mavenModelToArtifactInfo() {
-        Model model = new MavenPomBuilder().groupId("myGroupId").artifactId("myArtifactId").version("1.0.0").build();
-        MavenArtifactInfo artifactInfo = MavenModelUtils.mavenModelToArtifactInfo(model);
-        assertEquals(artifactInfo.getGroupId(), "myGroupId");
-        assertEquals(artifactInfo.getArtifactId(), "myArtifactId");
-        assertEquals(artifactInfo.getVersion(), "1.0.0");
-    }
-
-    public void mavenModelToArtifactInfoGroupIdInParent() {
-        Model model = new MavenPomBuilder().artifactId("myArtifactId").version("1.0.0").build();
-        Parent parent = new Parent();
-        parent.setGroupId("parentGroupId");
-        parent.setArtifactId("parentArifactId");
-        parent.setVersion("1.2.0");
-        model.setParent(parent);
-
-        MavenArtifactInfo artifactInfo = MavenModelUtils.mavenModelToArtifactInfo(model);
-
-        assertEquals(artifactInfo.getGroupId(), "parentGroupId");
-        assertEquals(artifactInfo.getArtifactId(), "myArtifactId");
-        assertEquals(artifactInfo.getVersion(), "1.0.0");
-    }
-
-    public void readNewMaven3MetadataFormat() throws IOException {
-        String newMaven3MetadataFormat = ResourceUtils.getResourceAsString(
-                "/org/artifactory/maven/maven3-metadata.xml");
-        MavenModelUtils.toMavenMetadata(newMaven3MetadataFormat);
-    }
-
-    public void buildSnapshotMavenMetadataWithM3Metadata() {
-        buildSnapshotMavenMetadata(true);
-    }
-
-    public void buildSnapshotMavenMetadataWithoutM3Metadata() {
-        ArtifactoryHomeStub home = getBound();
-        ArtifactorySystemProperties artifactoryProperties = home.getArtifactoryProperties();
-        artifactoryProperties.setProperty(ConstantValues.mvnMetadataVersion3Enabled.getPropertyName(), "false");
-        buildSnapshotMavenMetadata(false);
-        artifactoryProperties.setProperty(ConstantValues.mvnMetadataVersion3Enabled.getPropertyName(), "true");
-    }
-
-    public void gavStringToInfo() {
-        MavenArtifactInfo result = MavenModelUtils.getInfoFromGavString("");
-        assertEquals(result.getArtifactId(), UnitInfo.NA);
-        assertEquals(result.getGroupId(), UnitInfo.NA);
-        assertEquals(result.getVersion(), UnitInfo.NA);
-        assertNull(result.getClassifier());
-
-        String groupId = "some.group.id";
-        String artifactId = "artifact.id";
-        String version = "version.1-2";
-        String classifier = "classifier";
-
-        result = MavenModelUtils.getInfoFromGavString(groupId + ":" + artifactId + ":" + version);
-        assertEquals(result.getGroupId(), groupId);
-        assertEquals(result.getArtifactId(), artifactId);
-        assertEquals(result.getVersion(), version);
-        assertNull(result.getClassifier());
-
-        result = MavenModelUtils.getInfoFromGavString(groupId + ":" + artifactId + ":" + classifier + ":" + version);
-        assertEquals(result.getGroupId(), groupId);
-        assertEquals(result.getArtifactId(), artifactId);
-        assertEquals(result.getVersion(), version);
-        assertEquals(result.getClassifier(), classifier);
-    }
-
-    private void buildSnapshotMavenMetadata(boolean shouldContainM3Metadata) {
-        ModuleInfo moduleInfo = new ModuleInfoBuilder().organization("org").module("art").baseRevision("2.0").
-                folderIntegrationRevision("SNAPSHOT").fileIntegrationRevision("20111111.121212-2").ext("pom").build();
-        Metadata metadata = MavenModelUtils.buildSnapshotMavenMetadata(moduleInfo,
-                "org/art/2.0-SNAPSHOT/art-2.0-20111111.121212-2.pom");
-        assertEquals(metadata.getGroupId(), "org", "Unexpected group ID.");
-        assertEquals(metadata.getArtifactId(), "art", "Unexpected artifact ID.");
-        assertEquals(metadata.getVersion(), "2.0-SNAPSHOT", "Unexpected version.");
-
-        Versioning metadataVersioning = metadata.getVersioning();
-        assertNotNull(metadataVersioning, "Expected a versioning object.");
-        assertTrue(StringUtils.isNotBlank(metadataVersioning.getLastUpdated()),
-                "Expected a valid versioning last update time.");
-
-        Snapshot snapshot = metadataVersioning.getSnapshot();
-        assertEquals(snapshot.getTimestamp(), "20111111.121212", "Unexpected snapshot timestamp.");
-        assertEquals(snapshot.getBuildNumber(), 2, "Unexpected snapshot build number.");
-
-        if (shouldContainM3Metadata) {
-            List<SnapshotVersion> snapshotVersions = metadataVersioning.getSnapshotVersions();
-            assertNotNull(snapshotVersions, "Expected a snapshot version list.");
-            assertFalse(snapshotVersions.isEmpty(), "Expected a snapshot version.");
-
-            SnapshotVersion snapshotVersion = snapshotVersions.get(0);
-            assertEquals(snapshotVersion.getUpdated(), "20111111121212",
-                    "Unexpected snapshot version last update time.");
-            assertEquals(snapshotVersion.getVersion(), "2.0-20111111.121212-2", "Unexpected snapshot version.");
-            assertEquals(snapshotVersion.getExtension(), "pom", "Unexpected snapshot version extension.");
-            assertTrue(StringUtils.isBlank(snapshotVersion.getClassifier()), "Unexpected snapshot version classifier.");
-        } else {
-            List<SnapshotVersion> snapshotVersions = metadataVersioning.getSnapshotVersions();
-            assertTrue(snapshotVersions.isEmpty(), "Unexpected snapshot version list.");
-        }
-    }
-}
\ No newline at end of file
diff --git a/base/common/src/test/java/org/artifactory/maven/MavenNamingTest.java b/base/common/src/test/java/org/artifactory/maven/MavenNamingTest.java
deleted file mode 100644
index 2532ee5..0000000
--- a/base/common/src/test/java/org/artifactory/maven/MavenNamingTest.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven;
-
-import org.artifactory.api.maven.MavenArtifactInfo;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the MavenNaming.
- *
- * @author Yossi Shaul
- */
- at Test
-public class MavenNamingTest extends ArtifactoryHomeBoundTest {
-
-    public void isSnapshotVersion() {
-        assertTrue(MavenNaming.isSnapshot("1.5-SNAPSHOT"));
-        assertFalse(MavenNaming.isSnapshot("1.5-SNAPSHOT123"));
-        assertFalse(MavenNaming.isSnapshot("1.5"));
-        assertFalse(MavenNaming.isSnapshot("1.5SNAPSHOT/1.5SNAPSHOT"));
-        assertFalse(MavenNaming.isSnapshot("1.5.SNAPSHOT"));
-    }
-
-    public void isNonUniqueSnapshotVersion() {
-        assertTrue(MavenNaming.isNonUniqueSnapshotVersion("1.2-SNAPSHOT"));
-        assertFalse(MavenNaming.isNonUniqueSnapshotVersion("1.2-SNAPSHOT123"));
-        assertFalse(MavenNaming.isNonUniqueSnapshotVersion("1.2"));
-        assertFalse(MavenNaming.isNonUniqueSnapshotVersion("1.2SNAPSHOT"));
-    }
-
-    public void testIsNonUniqueSnapshotFilePath() {
-        assertFalse(MavenNaming.isNonUniqueSnapshot("a/path/1.0-SNAPSHOT/1.0-SNAPSHOT"));
-        assertTrue(MavenNaming.isNonUniqueSnapshot("a/path/1.0-SNAPSHOT/1.0-SNAPSHOT.pom"));
-        assertTrue(MavenNaming.isNonUniqueSnapshot("a/path/1.0-SNAPSHOT/1.0-SNAPSHOT-sources.jar"));
-        assertFalse(MavenNaming.isNonUniqueSnapshot("a/path/5.4-SNAPSHOT/path-5.4-20081214.090217-4.pom"));
-    }
-
-    public void testIsClientOrServerPom() {
-        assertTrue(MavenNaming.isClientOrServerPom("a/path/1.0-SNAPSHOT/1.0-SNAPSHOT.pom"));
-        assertTrue(MavenNaming.isClientOrServerPom("a/path/1.0-SNAPSHOT/pom.xml"));
-        assertTrue(MavenNaming.isClientOrServerPom("a/path/1.0-SNAPSHOT/1.0.pom"));
-        assertFalse(MavenNaming.isClientOrServerPom("a/path/1.0-SNAPSHOT/ivy.xml"));
-        assertFalse(MavenNaming.isClientOrServerPom("a/path/1.0-SNAPSHOT/1.0-SNAPSHOT.jar"));
-        assertFalse(MavenNaming.isClientOrServerPom("a/path/1.0-SNAPSHOT/1.0-SNAPSHOT.txt"));
-    }
-
-    public void testIsVersionUniqueSnapshot() {
-        assertTrue(MavenNaming.isUniqueSnapshot("g/a/1.0-SNAPSHOT/artifact-5.4-20081214.090217-4.pom"));
-        assertFalse(MavenNaming.isUniqueSnapshot("g/a/1.0SNAPSHOT/artifact-5.4-20081214.090217-4.pom"));
-        assertFalse(MavenNaming.isUniqueSnapshot("g/a/1.0/artifact-5.4-20081214.090217-4.pom"));
-    }
-
-    public void testIsVersionUniqueSnapshotFileName() {
-        assertTrue(MavenNaming.isUniqueSnapshotFileName("artifact-5.4-20081214.090217-4.pom"));
-        assertTrue(MavenNaming.isUniqueSnapshotFileName("artifact-5.4-20081214.090217-4-classifier.pom"));
-        assertFalse(MavenNaming.isUniqueSnapshotFileName("-20081214.090217-4.pom"), "No artifact id");
-        assertFalse(MavenNaming.isUniqueSnapshotFileName("5.4-20081214.090217-4.pom"), "No artifact id");
-        assertFalse(MavenNaming.isUniqueSnapshotFileName("artifact-5.4-20081214.090217-4"), "no type");
-        assertFalse(MavenNaming.isUniqueSnapshotFileName("artifact-5.4-20081214.090217-4."), "empty type");
-    }
-
-    public void testUniqueVersionTimestamp() {
-        String versionFile = "artifact-5.4-20081214.090217-4.pom";
-        assertEquals(MavenNaming.getUniqueSnapshotVersionTimestamp(versionFile), "20081214.090217");
-    }
-
-    public void testUniqueVersionTimestampAndBuildNumber() {
-        String versionFile = "artifact-5.4-20081214.090217-4.pom";
-        assertEquals(MavenNaming.getUniqueSnapshotVersionTimestampAndBuildNumber(versionFile), "20081214.090217-4");
-    }
-
-    public void testUniqueSnapshotVersionBuildNumber() {
-        String versionFile = "artifact-5.4-20081214.090217-4.pom";
-        assertEquals(MavenNaming.getUniqueSnapshotVersionBuildNumber(versionFile), 4);
-
-        versionFile = "artifact-456-20081214.120217-777.pom";
-        assertEquals(MavenNaming.getUniqueSnapshotVersionBuildNumber(versionFile), 777);
-    }
-
-    public void uniqueSnapshotVersionBaseVersion() {
-        String versionFile = "artifact-5.4-20081214.090217-4.pom";
-        assertEquals(MavenNaming.getUniqueSnapshotVersionBaseVersion(versionFile), "5.4");
-
-        versionFile = "artifact-aaa-20081214.120217-777.pom";
-        assertEquals(MavenNaming.getUniqueSnapshotVersionBaseVersion(versionFile), "aaa");
-    }
-
-    public void isMetadata() {
-        assertTrue(MavenNaming.isMavenMetadata("path/1.0-SNAPSHOT/maven-metadata.xml"));
-        assertTrue(MavenNaming.isMavenMetadata("path/1.0-SNAPSHOT:maven-metadata.xml"));
-        assertTrue(MavenNaming.isMavenMetadata("path/1.0:maven-metadata.xml"));
-        assertFalse(MavenNaming.isMavenMetadata(
-                "org/apache/maven/plugins/maven-plugin-plugin/maven-metadata-xyz-snapshots.xml"), "Not maven metadata");
-    }
-
-    public void isSnapshotMavenMetadata() {
-        assertTrue(MavenNaming.isSnapshotMavenMetadata("path/1.0-SNAPSHOT/maven-metadata.xml"));
-        assertTrue(MavenNaming.isSnapshotMavenMetadata("path/1.0-SNAPSHOT:maven-metadata.xml"));
-        assertFalse(MavenNaming.isSnapshotMavenMetadata("path/1.0-SNAPSHOT/resource:maven-metadata.xml"));
-        assertFalse(MavenNaming.isSnapshotMavenMetadata("path/1.0/maven-metadata.xml"), "Not a snapshot");
-        assertFalse(MavenNaming.isSnapshotMavenMetadata("path/1.0/resource:maven-metadata.xml"), "Not a snapshot");
-        assertFalse(MavenNaming.isSnapshotMavenMetadata("path/1.0-SNAPSHOT/other.metadata.xml"), "Not maven metadata");
-        assertFalse(MavenNaming.isSnapshotMavenMetadata("path/1.0-SNAPSHOT/resource:other.metadata.xml"),
-                "Not maven metadata");
-        assertFalse(MavenNaming.isSnapshotMavenMetadata("path/1.0-SNAPSHOT"), "Not metadata path");
-        assertFalse(MavenNaming.isSnapshotMavenMetadata("path/1.0-SNAPSHOT/"), "Not metadata path");
-        assertFalse(MavenNaming.isSnapshotMavenMetadata("path/1.0-SNAPSHOT/:matadata-name"), "Not maven metadata");
-        assertFalse(MavenNaming.isSnapshotMavenMetadata("path/1.0.SNAPSHOT/maven-metadata.xml"));
-    }
-
-    public void isMavenMetadataChecksum() {
-        assertFalse(MavenNaming.isMavenMetadataChecksum(null));
-        assertFalse(MavenNaming.isMavenMetadataChecksum(""));
-        assertFalse(MavenNaming.isMavenMetadataChecksum("path/1.0-SNAPSHOT/maven-metadata.xml"));
-        assertTrue(MavenNaming.isMavenMetadataChecksum("path/1.0-SNAPSHOT/maven-metadata.xml.md5"));
-        assertFalse(MavenNaming.isMavenMetadataChecksum("path/1.0/maven-metadata.xml"));
-        assertTrue(MavenNaming.isMavenMetadataChecksum("path/1.0/maven-metadata.xml.sha1"));
-    }
-
-    public void getArtifactInfo() {
-        String[] invalidArtifactNames = new String[]{".jar", "1.0.jar", "artifactId.jar", "groupId/artifactId/1.0/",
-                "1.0-artifactId.jar"};
-        for (String invalidArtifactName : invalidArtifactNames) {
-            MavenArtifactInfo info = MavenModelUtils.getInfoByMatching(invalidArtifactName);
-            assertEquals(info.getArtifactId(), MavenArtifactInfo.NA, "Not a valid artifact name");
-            assertEquals(info.getVersion(), MavenArtifactInfo.NA, "Not a valid artifact name");
-            assertEquals(info.getClassifier(), null, "Not a valid artifact name");
-        }
-    }
-
-    public void artifactWithPath() {
-        MavenArtifactInfo info = MavenModelUtils.getInfoByMatching("groupId/artifactId/1.0/artifactId-1.0.jar");
-        assertEquals(info.getArtifactId(), "groupId/artifactId/1.0/artifactId", "Matcher should not separate path");
-        assertEquals(info.getVersion(), "1.0", "Version should be 1.0");
-        assertEquals(info.getClassifier(), null, "No classifier expected");
-        assertEquals(info.getType(), "jar", "Unexpected type");
-    }
-
-    public void pathWithCompositeFileExtension() {
-        MavenArtifactInfo info = MavenModelUtils.getInfoByMatching("artifactId-1.0.another.jar");
-        assertEquals(info.getArtifactId(), "artifactId", "Unexpected artifact id");
-        assertEquals(info.getVersion(), "1.0.another", "Unexpected version");
-        assertEquals(info.getClassifier(), null, "No classifier expected");
-        assertEquals(info.getType(), "jar", "Unexpected type");
-    }
-
-    public void artifactWithNoClassifier() {
-        MavenArtifactInfo info = MavenModelUtils.getInfoByMatching("artifactId-1.0.war");
-        assertEquals(info.getArtifactId(), "artifactId", "Artifact id should be 'artifactId'");
-        assertEquals(info.getVersion(), "1.0", "Version should be 1.0");
-        assertEquals(info.getClassifier(), null, "No classifier expected");
-        assertEquals(info.getType(), "war", "Unexpected type");
-    }
-
-    public void artifactWithNumericArtifactId() {
-        MavenArtifactInfo info = MavenModelUtils.getInfoByMatching("12354-1.0.zara");
-        assertEquals(info.getArtifactId(), "12354", "Artifact id should be '12354'");
-        assertEquals(info.getVersion(), "1.0", "Version should be 1.0");
-        assertEquals(info.getClassifier(), null, "No classifier expected");
-        assertEquals(info.getType(), "zara", "Unexpected type");
-    }
-
-    @DataProvider(name = "artifactWithAlphaNumberArtifactId")
-    private Object[][] getArtifactWithAlphaNumberArtifactId() {
-        return new Object[][]{
-                {"artifactId1231"},
-                {"1213artifactId"},
-                {"1213artifactId1231"}
-        };
-    }
-
-    @Test(dataProvider = "artifactWithAlphaNumberArtifactId")
-    public void artifactWithAlphaNumberArtifactId(String artifactName) {
-        MavenArtifactInfo info = MavenModelUtils.getInfoByMatching(artifactName + "-1.0.jar");
-        assertEquals(info.getArtifactId(), artifactName,
-                "Artifact id should be '" + artifactName + "'");
-        assertEquals(info.getVersion(), "1.0", "Version should be 1.0");
-        assertEquals(info.getClassifier(), null, "No classifier expected");
-        assertEquals(info.getType(), "jar", "Unexpected type");
-    }
-
-    @DataProvider(name = "artifactWithMultipleArtifactIds")
-    private Object[][] getArtifactWithMultipleArtifactIds() {
-        return new Object[][]{
-                {"artifactId-artifactId"},
-                {"artifactId2-artifactId"},
-                {"artifactId-artifactId2"},
-                {"artifactId2-artifactId2"},
-                {"2artifactId-artifactId"}
-                //{"artifactId-2artifactId"},
-                //{"2artifactId-2artifactId"},
-                //{"123123-123123"},
-        };
-    }
-
-    @Test(dataProvider = "artifactWithMultipleArtifactIds")
-    public void artifactWithMultipleArtifactIds(String artifactName) {
-        MavenArtifactInfo info = MavenModelUtils.getInfoByMatching(artifactName + "-1.0.jar");
-        assertEquals(info.getArtifactId(), artifactName,
-                "Artifact id should be '" + artifactName + "'");
-        assertEquals(info.getVersion(), "1.0", "Version should be 1.0");
-        assertEquals(info.getClassifier(), null, "No classifier expected");
-        assertEquals(info.getType(), "jar", "Unexpected type");
-    }
-
-    @Test(enabled = false)
-    //Difficult to guess
-    public void artifactWithAlphaVersion() {
-        MavenArtifactInfo info = MavenModelUtils.getInfoByMatching("artifactId-alpha.pom");
-        assertEquals(info.getArtifactId(), "artifact", "Artifact id should be 'artifactId'");
-        assertEquals(info.getVersion(), "alpha", "Version should be 'alpha'");
-        assertEquals(info.getClassifier(), null, "No classifier expected");
-        assertEquals(info.getType(), "pom", "Unexpected type");
-    }
-
-    @DataProvider(name = "artifactWithAlphaNumericVersion")
-    private Object[][] getArtifactWithAlphaNumericVersion() {
-        return new Object[][]{
-                {"1.0alpha"}
-                //{"alpha1.0"}, //Difficult to guess
-                //{"1.0-version"} //Difficult to guess
-        };
-    }
-
-    @Test(dataProvider = "artifactWithAlphaNumericVersion")
-    public void artifactWithAlphaNumericVersion(String version) {
-        MavenArtifactInfo info = MavenModelUtils.getInfoByMatching("artifactId-" + version + ".jar");
-        assertEquals(info.getArtifactId(), "artifactId",
-                "Artifact id should be 'artifactId'");
-        assertEquals(info.getVersion(), version, "Version should be '" + version + "'");
-        assertEquals(info.getClassifier(), null, "No classifier expected");
-        assertEquals(info.getType(), "jar", "Unexpected type");
-    }
-
-    public void artifactWithClassifier() {
-        MavenArtifactInfo info = MavenModelUtils.getInfoByMatching("artifactId-1.0-classifier.jar");
-        assertEquals(info.getArtifactId(), "artifactId", "Artifact id should be 'artifactId'");
-        assertEquals(info.getVersion(), "1.0", "Version should be '1.0'");
-        assertEquals(info.getClassifier(), "classifier", "Classifier should be 'classifier'");
-        assertEquals(info.getType(), "jar", "Unexpected type");
-    }
-
-    public void artifactWithNumericClassifier() {
-        MavenArtifactInfo info = MavenModelUtils.getInfoByMatching("artifactId-1.0-1234.jar");
-        assertEquals(info.getArtifactId(), "artifactId", "Artifact id should be 'artifactId'");
-        assertEquals(info.getVersion(), "1.0", "Version should be '1.0'");
-        assertEquals(info.getClassifier(), "1234", "Classifier should be '1234'");
-        assertEquals(info.getType(), "jar", "Unexpected type");
-    }
-
-    @DataProvider(name = "artifactWithAlphaNumericClassifier")
-    private Object[][] getArtifactWithAlphaNumericClassifier() {
-        return new Object[][]{
-                {"classifier123"},
-                {"123classifier"}
-        };
-    }
-
-    @Test(dataProvider = "artifactWithAlphaNumericClassifier")
-    public void artifactWithAlphaNumericClassifier(String classifier) {
-        MavenArtifactInfo info = MavenModelUtils.getInfoByMatching("artifactId-1.0-" + classifier + ".jar");
-        assertEquals(info.getArtifactId(), "artifactId",
-                "Artifact id should be 'artifactId'");
-        assertEquals(info.getVersion(), "1.0", "Version should be '1.0'");
-        assertEquals(info.getClassifier(), classifier, "Classifier should be '" + classifier + "'");
-        assertEquals(info.getType(), "jar", "Unexpected type");
-    }
-
-    public void artifactWithShortExtension() {
-        MavenArtifactInfo info = MavenModelUtils.getInfoByMatching("artifactId-1.0.ba");
-        assertEquals(info.getArtifactId(), "artifactId", "Artifact id should be 'artifactId'");
-        assertEquals(info.getVersion(), "1.0", "Version should be '1.0'");
-        assertNull(info.getClassifier(), "Classifier should be null");
-        assertEquals(info.getType(), "ba", "Unexpected type");
-    }
-
-    public void artifactWithLongExtension() {
-        MavenArtifactInfo info = MavenModelUtils.getInfoByMatching("artifactId-1.0.bababababa");
-        assertEquals(info.getArtifactId(), "artifactId", "Artifact id should be 'artifactId'");
-        assertEquals(info.getVersion(), "1.0", "Version should be '1.0'");
-        assertNull(info.getClassifier(), "Classifier should be null");
-        assertEquals(info.getType(), "bababababa", "Unexpected type");
-    }
-}
diff --git a/base/common/src/test/java/org/artifactory/maven/MavenPomBuilderTest.java b/base/common/src/test/java/org/artifactory/maven/MavenPomBuilderTest.java
deleted file mode 100644
index 2ca5289..0000000
--- a/base/common/src/test/java/org/artifactory/maven/MavenPomBuilderTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven;
-
-import org.apache.maven.model.Model;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Tests the {@link MavenPomBuilder}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class MavenPomBuilderTest {
-
-    public void buildSimple() {
-        Model model = new MavenPomBuilder().groupId("a").artifactId("b").version("1.8").packaging("zip").build();
-
-        assertEquals(model.getModelVersion(), "4.0.0");
-        assertEquals(model.getGroupId(), "a");
-        assertEquals(model.getArtifactId(), "b");
-        assertEquals(model.getVersion(), "1.8");
-        assertEquals(model.getPackaging(), "zip");
-    }
-}
diff --git a/base/common/src/test/java/org/artifactory/maven/MavenServiceImplTest.java b/base/common/src/test/java/org/artifactory/maven/MavenServiceImplTest.java
deleted file mode 100644
index 0300409..0000000
--- a/base/common/src/test/java/org/artifactory/maven/MavenServiceImplTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven;
-
-import org.apache.maven.settings.Server;
-import org.apache.maven.settings.Settings;
-import org.apache.maven.settings.io.xpp3.SettingsXpp3Reader;
-import org.artifactory.api.maven.MavenSettings;
-import org.artifactory.api.maven.MavenSettingsServer;
-import org.artifactory.util.StringInputStream;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
-
-/**
- * @author Eli Givoni
- */
- at Test
-public class MavenServiceImplTest {
-
-    public void generateMavenSettings() throws Exception {
-        MavenServiceImpl mavenService = new MavenServiceImpl();
-        MavenSettings mavenSettings = new MavenSettings("blabla");
-        mavenSettings.addServer(new MavenSettingsServer("server1", "elig", "secret"));
-        String result = mavenService.generateSettings(mavenSettings);
-        assertTrue(result.contains("http://maven.apache.org/xsd/settings-1.1.0.xsd"),
-                "Schema declaration not found:\n " + result);
-        SettingsXpp3Reader reader = new SettingsXpp3Reader();
-        Settings resultedSettings = reader.read(new StringInputStream(result));
-        assertEquals(resultedSettings.getServers().size(), 1);
-        Server resultedServer = resultedSettings.getServers().get(0);
-        assertEquals(resultedServer.getId(), "server1");
-    }
-
-}
diff --git a/base/common/src/test/java/org/artifactory/maven/PomTargetPathValidatorTest.java b/base/common/src/test/java/org/artifactory/maven/PomTargetPathValidatorTest.java
deleted file mode 100644
index 0348ad2..0000000
--- a/base/common/src/test/java/org/artifactory/maven/PomTargetPathValidatorTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.maven;
-
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.module.ModuleInfoUtils;
-import org.artifactory.api.repo.exception.maven.BadPomException;
-import org.artifactory.util.RepoLayoutUtils;
-import org.artifactory.util.ResourceUtils;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-/**
- * @author Noam Y. Tenne
- */
- at Test
-public class PomTargetPathValidatorTest {
-
-    public void validatePomTargetValidPath() throws IOException {
-        InputStream inputStream = ResourceUtils.getResource("/org/artifactory/maven/yourpit-1.0.0-alpha2.pom");
-        String path = "org/yourpit/yourpit/1.0.0-alpha2";
-
-        ModuleInfo moduleInfo = ModuleInfoUtils.moduleInfoFromDescriptorPath(path, RepoLayoutUtils.MAVEN_2_DEFAULT);
-
-        PomTargetPathValidator validator = new PomTargetPathValidator(path, moduleInfo);
-        validator.validate(inputStream, false);
-        assertFalse(validator.isMavenPlugin(), "Not expected detection of maven plugin");
-    }
-
-    @Test(expectedExceptions = BadPomException.class)
-    public void validatePomWithDots() throws IOException {
-        InputStream inputStream = ResourceUtils.getResource("/org/artifactory/maven/yourpit-1.0.0-alpha2.pom");
-        String path = "org.jfrog/yourpit/1.0.0-alpha2";
-
-        ModuleInfo moduleInfo = ModuleInfoUtils.moduleInfoFromDescriptorPath(path, RepoLayoutUtils.MAVEN_2_DEFAULT);
-
-        PomTargetPathValidator validator = new PomTargetPathValidator(path, moduleInfo);
-        validator.validate(inputStream, false);
-        assertFalse(validator.isMavenPlugin(), "Not expected detection of maven plugin");
-    }
-
-    @Test(expectedExceptions = BadPomException.class)
-    public void validatePomTargetInValidPath() throws IOException {
-        InputStream inputStream = ResourceUtils.getResource("/org/artifactory/maven/yourpit-1.0.0-alpha2.pom");
-        String path = "blab/bla/1.0.0-alpha2";
-
-        ModuleInfo moduleInfo = ModuleInfoUtils.moduleInfoFromDescriptorPath(path, RepoLayoutUtils.MAVEN_2_DEFAULT);
-
-        new PomTargetPathValidator(path, moduleInfo).validate(inputStream, false);
-    }
-
-    public void validatePluginPom() throws IOException {
-        InputStream inputStream = ResourceUtils.getResource("/org/artifactory/maven/maven-null-plugin.pom");
-        String path = "maven/maven-null-plugin/1.4";
-
-        ModuleInfo moduleInfo = ModuleInfoUtils.moduleInfoFromDescriptorPath(path, RepoLayoutUtils.MAVEN_2_DEFAULT);
-
-        PomTargetPathValidator validator = new PomTargetPathValidator(path, moduleInfo);
-        validator.validate(inputStream, false);
-
-        assertTrue(validator.isMavenPlugin(), "Expected detection of maven plugin");
-    }
-}
diff --git a/base/common/src/test/java/org/artifactory/repo/RepoDetailsTest.java b/base/common/src/test/java/org/artifactory/repo/RepoDetailsTest.java
deleted file mode 100644
index d4bd6f7..0000000
--- a/base/common/src/test/java/org/artifactory/repo/RepoDetailsTest.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNull;
-
-/**
- * Tests the RepoDetails class
- *
- * @author Noam Y. Tenne
- */
- at Test
-public class RepoDetailsTest {
-
-    /**
-     * Tests that all the repo details are null when initializing the default constructor
-     */
-    public void testDefaultConstructor() {
-        RepoDetails details = new RepoDetails();
-        assertNull(details.getKey(), "Repository key should be null.");
-        assertNull(details.getDescription(), "Repository description should be null.");
-        assertNull(details.getType(), "Repository type should be null.");
-        assertNull(details.getUrl(), "Repository URL should be null.");
-        assertNull(details.getConfiguration(), "Repository configuration URL should be null.");
-    }
-
-    /**
-     * Tests that all the local\virtual relevant details are set by the constructor properly
-     */
-    public void testLocalOrVirtualConstructor() {
-        String repoKey = "moo";
-        String repoDesc = "moo repository";
-        RepoDetailsType repoType = RepoDetailsType.LOCAL;
-        String repoUrl = "http://art/moo";
-
-        RepoDetails details = new RepoDetails(repoKey, repoDesc, repoType, repoUrl);
-
-        assertEquals(details.getKey(), repoKey, "Repository key should be " + repoKey);
-        assertEquals(details.getDescription(), repoDesc, "Repository description should be " + repoDesc);
-        assertEquals(details.getType(), repoType, "Repository type should be " + repoType);
-        assertEquals(details.getUrl(), repoUrl, "Repository URL should be " + repoUrl);
-        assertNull(details.getConfiguration(), "Repository configuration URL should be null.");
-    }
-
-    /**
-     * Tests that all the remote relevant details are set by the constructor properly
-     */
-    public void testRemoteConstructor() {
-        String repoKey = "bla";
-        String repoDesc = "bla repository";
-        RepoDetailsType repoType = RepoDetailsType.REMOTE;
-        String repoUrl = "http://art/bla";
-        String configUrl = "http://art/bla/configuration";
-
-        RepoDetails details = new RepoDetails(repoKey, repoDesc, repoType, repoUrl, configUrl);
-
-        assertEquals(details.getKey(), repoKey, "Repository key should be " + repoKey);
-        assertEquals(details.getDescription(), repoDesc, "Repository description should be " + repoDesc);
-        assertEquals(details.getType(), repoType, "Repository type should be " + repoType);
-        assertEquals(details.getUrl(), repoUrl, "Repository URL should be " + repoUrl);
-        assertEquals(details.getConfiguration(), configUrl, "Repository configuration URL should be " + configUrl);
-    }
-
-    /**
-     * Tests that all the details are set by the setters properly
-     */
-    public void testSetters() {
-        String repoKey = "pop";
-        String repoDesc = "pop repository";
-        RepoDetailsType repoType = RepoDetailsType.VIRTUAL;
-        String repoUrl = "http://art/pop";
-        String configUrl = "http://art/pop/configuration";
-
-        RepoDetails details = new RepoDetails();
-        details.setKey(repoKey);
-        details.setDescription(repoDesc);
-        details.setType(repoType);
-        details.setUrl(repoUrl);
-        details.setConfiguration(configUrl);
-
-        assertEquals(details.getKey(), repoKey, "Repository key should be " + repoKey);
-        assertEquals(details.getDescription(), repoDesc, "Repository description should be " + repoDesc);
-        assertEquals(details.getType(), repoType, "Repository type should be " + repoType);
-        assertEquals(details.getUrl(), repoUrl, "Repository URL should be " + repoUrl);
-        assertEquals(details.getConfiguration(), configUrl, "Repository configuration URL should be " + configUrl);
-    }
-}
diff --git a/base/common/src/test/java/org/artifactory/repo/RepoDetailsTypeTest.java b/base/common/src/test/java/org/artifactory/repo/RepoDetailsTypeTest.java
deleted file mode 100644
index 484ea17..0000000
--- a/base/common/src/test/java/org/artifactory/repo/RepoDetailsTypeTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Tests the RepoDetailsType enum
- *
- * @author Noam Y. Tenne
- */
- at Test
-public class RepoDetailsTypeTest {
-
-    /**
-     * Tests the different type display names
-     */
-    public void testDisplayName() {
-        assertEquals(RepoDetailsType.LOCAL.getTypeName(), "Local");
-        assertEquals(RepoDetailsType.REMOTE.getTypeName(), "Remote");
-        assertEquals(RepoDetailsType.VIRTUAL.getTypeName(), "Virtual");
-    }
-}
\ No newline at end of file
diff --git a/base/common/src/test/java/org/artifactory/request/ArtifactoryResponseTest.java b/base/common/src/test/java/org/artifactory/request/ArtifactoryResponseTest.java
deleted file mode 100644
index b018f47..0000000
--- a/base/common/src/test/java/org/artifactory/request/ArtifactoryResponseTest.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.request;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.Writer;
-
-import static org.testng.Assert.assertTrue;
-
-/**
- * @author Yoav Landman
- */
- at Test
-public class ArtifactoryResponseTest {
-
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryResponseTest.class);
-
-    public void sendErroChangesState() throws IOException {
-        ArtifactoryResponseBase response = newResponse();
-        response.sendError(500, "Bad bad thing", log);
-        assertTrue(response.isError());
-    }
-
-    private ArtifactoryResponseBase newResponse() {
-        return new ArtifactoryResponseBase() {
-            @Override
-            protected void sendErrorInternal(int code, String reason) throws IOException {
-            }
-
-            @Override
-            public void setLastModified(long lastModified) {
-            }
-
-            @Override
-            public void setEtag(String etag) {
-            }
-
-            @Override
-            public void setSha1(String sha1) {
-            }
-
-            @Override
-            public void setMd5(String md5) {
-            }
-
-            @Override
-            public void setRangeSupport(String bytes) {
-            }
-
-            @Override
-            public void setContentType(String contentType) {
-            }
-
-            @Override
-            public OutputStream getOutputStream() throws IOException {
-                return null;
-            }
-
-            @Override
-            public void setContentDispositionAttachment(String filename) {
-
-            }
-
-            @Override
-            public void setFilename(String filename) {
-
-            }
-
-            @Override
-            public Writer getWriter() throws IOException {
-                return null;
-            }
-
-            @Override
-            public void setHeader(String header, String value) {
-            }
-
-            @Override
-            public boolean isCommitted() {
-                return false;
-            }
-
-            @Override
-            public void flush() {
-            }
-
-            @Override
-            public void sendAuthorizationRequired(String message, String realm) throws IOException {
-            }
-        };
-    }
-}
diff --git a/base/common/src/test/java/org/artifactory/security/CustomizedEncryptedPasswordPrefixTest.java b/base/common/src/test/java/org/artifactory/security/CustomizedEncryptedPasswordPrefixTest.java
deleted file mode 100644
index 545aa5e..0000000
--- a/base/common/src/test/java/org/artifactory/security/CustomizedEncryptedPasswordPrefixTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.security.crypto.ArtifactoryBase64;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.artifactory.test.ArtifactoryHomeStub;
-import org.testng.annotations.Test;
-
-import javax.crypto.SecretKey;
-import java.lang.reflect.Field;
-
-import static org.testng.Assert.assertTrue;
-
-/**
- * Tests the customized encrypted password prefix brackets
- *
- * @author Noam Y. Tenne
- */
- at Test
-public class CustomizedEncryptedPasswordPrefixTest extends ArtifactoryHomeBoundTest {
-
-    @Test(enabled = false)
-    public void testStandardEncryptCharacters() throws Exception {
-        nullifyEncryptionPrefix();
-        setSurroundAndBase("%%&&", "false");
-        SecretKey secretKey = CryptoHelper.generatePbeKeyFromKeyPair(CryptoHelper.generateKeyPair());
-        String encrypted = CryptoHelper.encryptSymmetric("toto", secretKey, false);
-        assertTrue(encrypted.startsWith("A"), "Encrypted password should have been prefixed with A " +
-                "since customized surrounding characters are ignored in Base58.");
-    }
-
-    @Test
-    public void testCustomizedEncryptedPasswordPrefixSurroundingCharacters() throws Exception {
-        nullifyEncryptionPrefix();
-        setSurroundAndBase("%%&&", "true");
-        SecretKey secretKey = CryptoHelper.generatePbeKeyFromKeyPair(CryptoHelper.generateKeyPair());
-        String encrypted = CryptoHelper.encryptSymmetric("toto", secretKey, false);
-        assertTrue(encrypted.startsWith("%%DESede&&"), "Encrypted password should have been prefixed with the " +
-                "customized surrounding characters.");
-    }
-
-    @Test
-    public void testCustomizedEncryptedPasswordPrefixWithInvalidSurroundingCharacters() throws Exception {
-        nullifyEncryptionPrefix();
-        setSurroundAndBase("###*&", "true");
-        SecretKey secretKey = CryptoHelper.generatePbeKeyFromKeyPair(CryptoHelper.generateKeyPair());
-        String encrypted = CryptoHelper.encryptSymmetric("toto", secretKey, false);
-        assertTrue(encrypted.startsWith("{DESede}"), "Encrypted password should have been prefixed with the " +
-                "default surrounding characters since the customized ones were not of an even number.");
-    }
-
-    private static void nullifyEncryptionPrefix() throws NoSuchFieldException, IllegalAccessException {
-        Field encryptionPrefix = ArtifactoryBase64.class.getDeclaredField("encryptionPrefix");
-        encryptionPrefix.setAccessible(true);
-        encryptionPrefix.set(null, null);
-    }
-
-    private static void setSurroundAndBase(String surroundChars, String base64) {
-        ((ArtifactoryHomeStub) ArtifactoryHome.get()).setProperty(
-                ConstantValues.securityAuthenticationEncryptedPasswordSurroundChars, surroundChars);
-        ((ArtifactoryHomeStub) ArtifactoryHome.get()).setProperty(
-                ConstantValues.securityUseBase64, base64);
-    }
-
-}
diff --git a/base/common/src/test/java/org/artifactory/security/GroupConfigurationImplTest.java b/base/common/src/test/java/org/artifactory/security/GroupConfigurationImplTest.java
deleted file mode 100644
index 5642673..0000000
--- a/base/common/src/test/java/org/artifactory/security/GroupConfigurationImplTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * @author Noam Y. Tenne
- */
-public class GroupConfigurationImplTest {
-
-    @Test
-    public void testDefaultConstructor() throws Exception {
-        GroupConfigurationImpl groupConfiguration = new GroupConfigurationImpl();
-        assertNull(groupConfiguration.getRealm(), "Unexpected default realm.");
-        assertNull(groupConfiguration.getDescription(), "Unexpected default description.");
-        assertNull(groupConfiguration.getName(), "Unexpected default name.");
-        assertFalse(groupConfiguration.isAutoJoin(), "Unexpected default auto join state.");
-    }
-
-    @Test
-    public void testSetters() throws Exception {
-        GroupConfigurationImpl groupConfiguration = new GroupConfigurationImpl();
-        groupConfiguration.setDescription("desc");
-        groupConfiguration.setName("name");
-        groupConfiguration.setAutoJoin(true);
-        groupConfiguration.setRealm("realm");
-
-        assertEquals(groupConfiguration.getRealm(), "realm", "Unexpected realm.");
-        assertEquals(groupConfiguration.getDescription(), "desc", "Unexpected description.");
-        assertEquals(groupConfiguration.getName(), "name", "Unexpected name.");
-        assertTrue(groupConfiguration.isAutoJoin(), "Unexpected auto join state.");
-    }
-}
diff --git a/base/common/src/test/java/org/artifactory/security/PermissionTargetConfigurationImplTest.java b/base/common/src/test/java/org/artifactory/security/PermissionTargetConfigurationImplTest.java
deleted file mode 100644
index 38cc4af..0000000
--- a/base/common/src/test/java/org/artifactory/security/PermissionTargetConfigurationImplTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import com.google.common.collect.Lists;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNull;
-
-/**
- * @author Noam Y. Tenne
- */
-public class PermissionTargetConfigurationImplTest {
-
-    @Test
-    public void testDefaultValues() throws Exception {
-        PermissionTargetConfigurationImpl permissionTargetConfiguration = new PermissionTargetConfigurationImpl();
-        assertEquals(permissionTargetConfiguration.getExcludesPattern(), "", "Unexpected default excludes pattern.");
-        assertEquals(permissionTargetConfiguration.getIncludesPattern(), "**", "Unexpected default includes pattern.");
-        assertNull(permissionTargetConfiguration.getName(), "Unexpected default name.");
-        assertNull(permissionTargetConfiguration.getPrincipals(), "Unexpected default principals.");
-        assertNull(permissionTargetConfiguration.getRepositories(), "Unexpected default repositories.");
-    }
-
-    @Test
-    public void testSetters() throws Exception {
-        PermissionTargetConfigurationImpl permissionTargetConfiguration = new PermissionTargetConfigurationImpl();
-        permissionTargetConfiguration.setExcludesPattern("excludes");
-        permissionTargetConfiguration.setIncludesPattern("includes");
-        permissionTargetConfiguration.setName("name");
-
-        PrincipalConfigurationImpl principalConfiguration = new PrincipalConfigurationImpl();
-        permissionTargetConfiguration.setPrincipals(principalConfiguration);
-
-        List<String> repositories = Lists.newArrayList("key1", "key2");
-        permissionTargetConfiguration.setRepositories(repositories);
-
-        assertEquals(permissionTargetConfiguration.getExcludesPattern(), "excludes", "Unexpected excludes.");
-        assertEquals(permissionTargetConfiguration.getIncludesPattern(), "includes", "Unexpected includes.");
-        assertEquals(permissionTargetConfiguration.getName(), "name", "Unexpected name.");
-        assertEquals(permissionTargetConfiguration.getPrincipals(), principalConfiguration, "Unexpected principals.");
-        assertEquals(permissionTargetConfiguration.getRepositories(), repositories, "Unexpected repositories.");
-    }
-}
diff --git a/base/common/src/test/java/org/artifactory/security/PrincipalConfigurationImplTest.java b/base/common/src/test/java/org/artifactory/security/PrincipalConfigurationImplTest.java
deleted file mode 100644
index 9a1effd..0000000
--- a/base/common/src/test/java/org/artifactory/security/PrincipalConfigurationImplTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import org.testng.annotations.Test;
-
-import java.util.Map;
-import java.util.Set;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNull;
-
-/**
- * @author Noam Y. Tenne
- */
-public class PrincipalConfigurationImplTest {
-
-    @Test
-    public void testDefaultValues() throws Exception {
-        PrincipalConfigurationImpl principalConfiguration = new PrincipalConfigurationImpl();
-        assertNull(principalConfiguration.getUsers(), "Unexpected default users.");
-        assertNull(principalConfiguration.getGroups(), "Unexpected default groups.");
-    }
-
-    @Test
-    public void testSetters() throws Exception {
-        Map<String, Set<String>> users = Maps.newHashMap();
-        users.put("momo", Sets.<String>newHashSet("popo"));
-
-        Map<String, Set<String>> groups = Maps.newHashMap();
-        users.put("koko", Sets.<String>newHashSet("jojo"));
-
-        PrincipalConfigurationImpl principalConfiguration = new PrincipalConfigurationImpl();
-        principalConfiguration.setUsers(users);
-        principalConfiguration.setGroups(groups);
-
-        assertEquals(principalConfiguration.getUsers(), users, "Unexpected users.");
-        assertEquals(principalConfiguration.getGroups(), groups, "Unexpected groups.");
-    }
-}
diff --git a/base/common/src/test/java/org/artifactory/security/SecurityEntityListItemTest.java b/base/common/src/test/java/org/artifactory/security/SecurityEntityListItemTest.java
deleted file mode 100644
index 4e48669..0000000
--- a/base/common/src/test/java/org/artifactory/security/SecurityEntityListItemTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNull;
-
-/**
- * @author Noam Y. Tenne
- */
-public class SecurityEntityListItemTest {
-
-    @Test
-    public void testDefaultValues() throws Exception {
-        SecurityEntityListItem securityEntityListItem = new SecurityEntityListItem();
-        assertNull(securityEntityListItem.getName(), "Unexpected default entity name.");
-        assertNull(securityEntityListItem.getUri(), "Unexpected default entity URI.");
-    }
-
-    @Test
-    public void testSetters() throws Exception {
-        SecurityEntityListItem securityEntityListItem = new SecurityEntityListItem();
-        securityEntityListItem.setName("name");
-        securityEntityListItem.setUri("uri");
-        assertEquals(securityEntityListItem.getName(), "name", "Unexpected entity name.");
-        assertEquals(securityEntityListItem.getUri(), "uri", "Unexpected entity URI.");
-    }
-}
diff --git a/base/common/src/test/java/org/artifactory/security/UserConfigurationImplTest.java b/base/common/src/test/java/org/artifactory/security/UserConfigurationImplTest.java
deleted file mode 100644
index 580c269..0000000
--- a/base/common/src/test/java/org/artifactory/security/UserConfigurationImplTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import com.google.common.collect.Sets;
-import org.testng.annotations.Test;
-
-import java.util.Set;
-
-import static org.testng.Assert.*;
-
-/**
- * @author Noam Y. Tenne
- */
-public class UserConfigurationImplTest {
-
-    @Test
-    public void testDefaultConstructor() throws Exception {
-        UserConfigurationImpl userConfiguration = new UserConfigurationImpl();
-        assertNull(userConfiguration.getEmail(), "Unexpected default email.");
-        assertNull(userConfiguration.getPassword(), "Unexpected default password.");
-        assertNull(userConfiguration.getName(), "Unexpected default username.");
-        assertFalse(userConfiguration.isAdmin(), "Unexpected default admin state.");
-        assertTrue(userConfiguration.isProfileUpdatable(), "Unexpected default updatable profile state.");
-        assertFalse(userConfiguration.isInternalPasswordDisabled(),
-                "Unexpected default internal password disabled state.");
-        assertNull(userConfiguration.getGroups(), "Unexpected default groups.");
-        assertNull(userConfiguration.getLastLoggedIn(), "Unexpected default last logged in.");
-        assertNull(userConfiguration.getRealm(), "Unexpected default realm.");
-    }
-
-    @Test
-    public void testSetters() throws Exception {
-        UserConfigurationImpl userConfiguration = new UserConfigurationImpl();
-        userConfiguration.setEmail("email");
-        userConfiguration.setPassword("password");
-        userConfiguration.setName("username");
-        userConfiguration.setAdmin(true);
-        userConfiguration.setProfileUpdatable(true);
-        userConfiguration.setInternalPasswordDisabled(true);
-
-        Set<String> groups = Sets.newHashSet("group1", "group2");
-        userConfiguration.setGroups(groups);
-        userConfiguration.setLastLoggedIn("asfafdasfd");
-        userConfiguration.setRealm("realm");
-
-        assertEquals(userConfiguration.getEmail(), "email", "Unexpected email.");
-        assertEquals(userConfiguration.getPassword(), "password", "Unexpected password.");
-        assertEquals(userConfiguration.getName(), "username", "Unexpected username.");
-        assertTrue(userConfiguration.isAdmin(), "Unexpected admin state.");
-        assertTrue(userConfiguration.isProfileUpdatable(), "Unexpected updatable profile state.");
-        assertTrue(userConfiguration.isInternalPasswordDisabled(), "Unexpected internal password disabled state.");
-        assertEquals(userConfiguration.getGroups(), groups, "Unexpected groups.");
-        assertEquals(userConfiguration.getLastLoggedIn(), "asfafdasfd", "Unexpected last logged in.");
-        assertEquals(userConfiguration.getRealm(), "realm", "Unexpected realm.");
-    }
-}
diff --git a/base/common/src/test/java/org/artifactory/security/crypto/ArtifactoryBase58Test.java b/base/common/src/test/java/org/artifactory/security/crypto/ArtifactoryBase58Test.java
deleted file mode 100644
index b287ed1..0000000
--- a/base/common/src/test/java/org/artifactory/security/crypto/ArtifactoryBase58Test.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security.crypto;
-
-import org.testng.annotations.Test;
-
-import static org.artifactory.security.crypto.ArtifactoryBase58.decode;
-import static org.artifactory.security.crypto.ArtifactoryBase58.encode;
-import static org.testng.Assert.assertEquals;
-
-/**
- * Tests the bases 58 encoding
- *
- * @autho Yossi Shaul
- */
- at Test
-public class ArtifactoryBase58Test {
-
-    public void pureBase58Encoding() {
-        assertEquals(encode("286755fad04869ca523320acce0dc6a4".getBytes()),
-                "4P36jbxC2teSxQ9tBPTFfPz5fmtL3jG3tFtsLTkmTfrK");
-        assertEquals(encode("h".getBytes()), "2o");
-        assertEquals(encode("#0@".getBytes()), "CpXZ");
-        assertEquals(encode("sdf34tmo 3po4tk3opsv 34 t34t6 ebergv3w45 bt".getBytes()),
-                "9W1pJHcN8v4aWXofPp8KBXjSTaCiVqdQExA4duH616XD7H8cz9VoeDSiohu");
-        assertEquals(encode("\"12432EFWQER#@234qravfqwv32".getBytes()), "5d2qLgyvpfGsdeLSYA3Hos6muR3DKKVysZ43s");
-        assertEquals(encode("PFAJ#OOOOOOASDvsdfsfasfd11111111111111111111111111111".getBytes()),
-                "2U3pyXTXsQt9GtdpqYGH2ns6jZF6mZ2FrCHgMtt9RxmvcTEePN8v1QSfWiVU66dRRB1TKAMex");
-    }
-
-    public void pureBase58Decoding() {
-        assertEquals(new String(decode("2d4bH6gYhhJCCs5WGS35tALmDqsZ")), "this is how we do it");
-        assertEquals(new String(decode("2DNGgN9CaCS4TwwcT")), "@Jfrog#SWAMP");
-        assertEquals(new String(decode("5jga22KMYWJSDczEVFAaxMNc4fekocBdgm3YxTiTCCJX8KaghMwabBZa2kn")),
-                "@Jfrog#SWAMP9sdsdfj4qioienjbnoka[awemjidwew");
-        assertEquals(new String(decode("3MnTTd4bFfKCxXDKHoVxfLqiPxxb1WSd1JURMGgesX3EFrTR8sPRbgb8W8WWCGKHGo")),
-                "@Jfrog#SWAMP9sdsdfj4qioidsfw09-0---___0kdsfoij94");
-        assertEquals(new String(
-                        decode("2Fw7NuAc3Q9omjY4hvc2gfwCS9JWATxK7oJasXKDx3zZS4bQCyda86S9zwjh35JaAP1Xxt7R879PknEMLfHd")),
-                "]>{LadsfweSAE>#0qwfe-l2fc9sdsdfj4qioidsfw09-0---___0kdsfoij94");
-    }
-
-    public void base58EncodeDecode() {
-        assertEquals(new String(decode(encode("a".getBytes()))), "a");
-        assertEquals(new String(decode(encode("ofer".getBytes()))), "ofer");
-        assertEquals(new String(decode(encode("dima".getBytes()))), "dima");
-        assertEquals(new String(decode(encode("daniel".getBytes()))), "daniel");
-        assertEquals(new String(decode(encode("roy".getBytes()))), "roy");
-    }
-}
\ No newline at end of file
diff --git a/base/common/src/test/java/org/artifactory/security/crypto/CryptoHelperTest.java b/base/common/src/test/java/org/artifactory/security/crypto/CryptoHelperTest.java
deleted file mode 100644
index 31851d8..0000000
--- a/base/common/src/test/java/org/artifactory/security/crypto/CryptoHelperTest.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security.crypto;
-
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.Test;
-
-import javax.crypto.SecretKey;
-import java.io.File;
-import java.security.KeyPair;
-import java.security.PrivateKey;
-import java.security.Provider;
-import java.security.PublicKey;
-import java.security.Security;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import static org.artifactory.security.crypto.CryptoHelper.ASYM_ALGORITHM;
-import static org.artifactory.security.crypto.CryptoHelper.SYM_ALGORITHM;
-import static org.testng.Assert.*;
-
-/**
- * Tests the CryptoHelper.
- *
- * @author Yossi Shaul
- * @author Noam Tenne
- */
- at Test
-public class CryptoHelperTest extends ArtifactoryHomeBoundTest {
-    private static final Logger log = LoggerFactory.getLogger(CryptoHelperTest.class);
-
-    public void generateKeyPair() throws Exception {
-        long start = System.nanoTime();
-        KeyPair keyPair = CryptoHelper.generateKeyPair();
-        log.debug("KeyPair generation for " + ASYM_ALGORITHM + ": " + (System.nanoTime() - start) / 1000000 + " ms.");
-        assertNotNull(keyPair);
-        assertNotNull(keyPair.getPrivate());
-        assertNotNull(keyPair.getPublic());
-        assertNotNull(keyPair.getPrivate().getAlgorithm());
-        assertNotNull(keyPair.getPublic().getAlgorithm());
-        assertEquals(keyPair.getPublic().getAlgorithm(), ASYM_ALGORITHM);
-        assertEquals(keyPair.getPublic().getAlgorithm(), keyPair.getPrivate().getAlgorithm());
-        /*log.debug("Public: " + new String(keyPair.getPublic().getEncoded())
-                + " Private: " + new String(keyPair.getPrivate().getEncoded()));*/
-    }
-
-    public void generateSecretKey() throws Exception {
-        long start = System.nanoTime();
-        SecretKey secretKey = CryptoHelper.generatePbeKeyFromKeyPair(CryptoHelper.generateKeyPair());
-        log.debug("SecretKey generation for " + SYM_ALGORITHM + ": " + (System.nanoTime() - start) / 1000000 + " ms.");
-        assertNotNull(secretKey);
-        assertNotNull(secretKey.getAlgorithm());
-        // don't check the algorithm since the same key can be used by multiple algorithms and
-        // in jdk5 the name returned may not be the one used when generating the key
-        //assertEquals(secretKey.getAlgorithm(), SYM_ALGORITHM);
-        log.debug("SecretKey: " + new String(secretKey.getEncoded()));
-    }
-
-    public void encryptSymmetric() {
-        SecretKey secretKey = CryptoHelper.generatePbeKeyFromKeyPair(CryptoHelper.generateKeyPair());
-        String encrypted = CryptoHelper.encryptSymmetric("toto", secretKey, false);
-        log.debug("Symmetric encrypted toto: {}", encrypted);
-        assertNotNull(encrypted);
-        assertTrue(CryptoHelper.isPasswordEncrypted(encrypted));
-    }
-
-    public void encryptDecryptSymmetric() {
-        SecretKey secretKey = CryptoHelper.generatePbeKeyFromKeyPair(CryptoHelper.generateKeyPair());
-        String toEncrypt = "12345678901234567890";
-        String encrypted = CryptoHelper.encryptSymmetric(toEncrypt, secretKey, false);
-        assertTrue(CryptoHelper.isPasswordEncrypted(encrypted));
-        log.debug("Symmetric encrypted {}: {}", toEncrypt, encrypted);
-        String decrypted = CryptoHelper.decryptSymmetric(encrypted, secretKey, false);
-        assertNotNull(decrypted);
-        assertFalse(CryptoHelper.isPasswordEncrypted(decrypted));
-        assertEquals(decrypted, toEncrypt);
-    }
-
-    public void escapeEncryptedPassword() {
-        assertEquals(ArtifactoryBase64.escapeEncryptedPassword("{DESede}123"), "\\{DESede\\}123");
-        assertEquals(ArtifactoryBase64.escapeEncryptedPassword("\\{DESede\\}123"), "\\{DESede\\}123");
-        assertEquals(ArtifactoryBase64.escapeEncryptedPassword("123"), "123");
-        assertEquals(ArtifactoryBase64.escapeEncryptedPassword("{DESede}"), "\\{DESede\\}");
-        assertEquals(ArtifactoryBase64.escapeEncryptedPassword("%%DESede&&"), "%%DESede&&");
-    }
-
-    public void toBase64String() {
-        KeyPair keyPair = CryptoHelper.generateKeyPair();
-        String base64EncodedPrivate = CryptoHelper.convertToString(keyPair.getPrivate());
-        assertNotNull(base64EncodedPrivate);
-        String base64EncodedPublic = CryptoHelper.convertToString(keyPair.getPublic());
-        assertNotNull(base64EncodedPublic);
-    }
-
-    public void restorePrivateKey() {
-        KeyPair original = CryptoHelper.generateKeyPair();
-        PrivateKey privateKey = original.getPrivate();
-        PublicKey publicKey = original.getPublic();
-
-        KeyPair restored = CryptoHelper.createKeyPair(privateKey.getEncoded(), publicKey.getEncoded());
-        assertEquals(restored.getPrivate(), original.getPrivate());
-        assertEquals(restored.getPublic(), original.getPublic());
-    }
-
-    public void restoreKeysFromStringBase() {
-        KeyPair original = CryptoHelper.generateKeyPair();
-        PrivateKey privateKey = original.getPrivate();
-        PublicKey publicKey = original.getPublic();
-
-        KeyPair restored = CryptoHelper.createKeyPair(CryptoHelper.convertToString(privateKey),
-                CryptoHelper.convertToString(publicKey), false);
-        assertEquals(restored.getPrivate(), original.getPrivate());
-        assertEquals(restored.getPublic(), original.getPublic());
-    }
-
-    public void isEncrypted() {
-        assertFalse(CryptoHelper.isPasswordEncrypted("blabla"));
-        assertFalse(CryptoHelper.isMasterEncrypted("blabla"));
-        assertFalse(CryptoHelper.isPasswordEncrypted("{RSA}blabla"));
-        assertFalse(CryptoHelper.isPasswordEncrypted("{ENC}blabla"));
-        assertTrue(CryptoHelper.isPasswordEncrypted("{DESede}blabla"));
-        assertFalse(CryptoHelper.isMasterEncrypted("{DESede}blabla"));
-        assertTrue(CryptoHelper.isPasswordEncrypted("\\{DESede\\}blabla"), "Escaped maven encryption prefix");
-        assertFalse(CryptoHelper.isMasterEncrypted("\\{DESede\\}blabla"), "Escaped maven encryption prefix not master");
-        assertFalse(CryptoHelper.isPasswordEncrypted("\\{DESede}blabla"));
-        assertFalse(CryptoHelper.isPasswordEncrypted("{DESede\\}blabla"));
-    }
-
-    public void encrypt() {
-        SecretKey secretKey = CryptoHelper.generatePbeKeyFromKeyPair(CryptoHelper.generateKeyPair());
-        String encrypted = CryptoHelper.encryptSymmetric("toto", secretKey, false);
-        assertNotNull(encrypted);
-        assertTrue(CryptoHelper.isPasswordEncrypted(encrypted));
-        assertFalse(CryptoHelper.isMasterEncrypted(encrypted));
-        encrypted = CryptoHelper.encryptSymmetric("toto", secretKey, true);
-        assertNotNull(encrypted);
-        assertFalse(CryptoHelper.isPasswordEncrypted(encrypted));
-        assertTrue(CryptoHelper.isMasterEncrypted(encrypted));
-    }
-
-    public void encryptDecrypt() {
-        SecretKey secretKey = CryptoHelper.generatePbeKeyFromKeyPair(CryptoHelper.generateKeyPair());
-        // TODO: Check between master and not incompatible
-        String encrypted = CryptoHelper.encryptSymmetric("momopopo", secretKey, false);
-        assertTrue(CryptoHelper.isPasswordEncrypted(encrypted));
-        String decrypted = CryptoHelper.decryptSymmetric(encrypted, secretKey, false);
-        assertNotNull(decrypted);
-        assertFalse(CryptoHelper.isPasswordEncrypted(decrypted));
-        assertEquals(decrypted, "momopopo");
-    }
-
-    class OldEncryptedPassword {
-        final String clearText;
-        final String privateKey;
-        final String publicKey;
-        final String encryptedPassword;
-
-        OldEncryptedPassword(String clearText, String privateKey, String publicKey, String encryptedPassword) {
-            this.clearText = clearText;
-            this.privateKey = privateKey;
-            this.publicKey = publicKey;
-            this.encryptedPassword = encryptedPassword;
-        }
-    }
-
-    public void decryptOldBase64Format() {
-        List<OldEncryptedPassword> oldEncrypted = new ArrayList<>(3);
-        OldEncryptedPassword jenkins = new OldEncryptedPassword(
-                "jenkins",
-                "MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAhY7PeGz1M+TzcLeYPcdhtY+R8HuWY5ENZ15Iqi/75RRelhTvar5vdzMHSeaXcezVv/2a5sUUQ5ZoVQI6mBcVtQIDAQABAkAoEbZw/M976D6ZHJvSPRU1cYNpUMrHyGbrEkBevtKl4UpefDj3qUqusDR84fv4aeHzvKaxTx7s06k+/uNZUNBBAiEA65Zwxb6WqdGdpxrwB706bp5nUNZaFzVqmcYG2KAZ5ikCIQCRIUBVDogJqeuu6htlnrHnQNp05oxDwT24s80G4LusrQIgSy8IsGLhjDKEQJcdMSsXocPVrvupZqy6Z3bGKo31lfkCIHozhGbaUIPKlw/2QdFkOapd+lQ6mFqoyR7QDtA+xOgVAiEA0qlPXafzMLjEIjWZvHeg1oJhMsWsWGaAYlZtlkgsS4g=",
-                "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIWOz3hs9TPk83C3mD3HYbWPkfB7lmORDWdeSKov++UUXpYU72q+b3czB0nml3Hs1b/9mubFFEOWaFUCOpgXFbUCAwEAAQ==",
-                "{DESede}Iz5I9KOc0co="
-        );
-        OldEncryptedPassword admin = new OldEncryptedPassword(
-                "password",
-                "MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAvZPtw3g4MFCDzQ+gCP1gBeNr+0Enl2OHyItnVDFCQ/yMn8WtfKrZqpKdef4N5gwdLGe9neFD1BdUDnyVkG3jFQIDAQABAkAYc60WKjptGOV3HI3SuwOYntW9qZC2uRK5bimctWHLrN0CRxOhfiYZxiX22SID0nZtPlKTiQvD4xkHbdWqJLjdAiEA/Qhi6vRywkEswjdPxCPCI8UJjeFUkLeB88uWhjGy538CIQC/zQxjuPRbIazaSpzRWMLdZiJB+PMVoZHODyVDIMFfawIhALyNN0jmB24Bqxy+os4B53VIKqpzMtT0Kf5Fw1EUT8B5AiASsrWzfxNrUvQb78wr6IBOvyc10UQ5Zp/lO7rBOY9AcwIhAOiNRF3kFQim8LUOqORm7gMh4I91NdN4G3BGN0GtOFBk",
-                "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAL2T7cN4ODBQg80PoAj9YAXja/tBJ5djh8iLZ1QxQkP8jJ/FrXyq2aqSnXn+DeYMHSxnvZ3hQ9QXVA58lZBt4xUCAwEAAQ==",
-                "{DESede}nO1mRNRdxXk/hP3mIVLBuA=="
-        );
-        oldEncrypted.add(jenkins);
-        oldEncrypted.add(admin);
-        oldEncrypted.add(new OldEncryptedPassword(jenkins.clearText,
-                "{DESede}" + jenkins.privateKey,
-                "{DESede}" + jenkins.publicKey, jenkins.encryptedPassword));
-        oldEncrypted.add(new OldEncryptedPassword(admin.clearText,
-                "{DESede}" + admin.privateKey,
-                "{DESede}" + admin.publicKey, admin.encryptedPassword));
-        for (OldEncryptedPassword oldData : oldEncrypted) {
-            KeyPair keyPair = CryptoHelper.createKeyPair(oldData.privateKey, oldData.publicKey, false);
-            SecretKey secretKey = CryptoHelper.generatePbeKeyFromKeyPair(keyPair);
-            assertTrue(CryptoHelper.isPasswordEncrypted(oldData.encryptedPassword));
-            assertFalse(CryptoHelper.isMasterEncrypted(oldData.encryptedPassword));
-            String decrypted = CryptoHelper.decryptSymmetric(oldData.encryptedPassword, secretKey, false);
-            assertNotNull(decrypted);
-            assertFalse(CryptoHelper.isPasswordEncrypted(decrypted));
-            assertFalse(CryptoHelper.isMasterEncrypted(decrypted));
-            assertEquals(decrypted, oldData.clearText);
-        }
-    }
-
-    public void encryptDecryptMasterKey() {
-        // First make sure no master key around
-        if (CryptoHelper.hasMasterKey()) {
-            CryptoHelper.removeMasterKeyFile();
-        }
-        String pass = "mySuper34Hard42Password";
-        String nonEncryptPass = CryptoHelper.encryptIfNeeded(pass);
-        assertEquals(nonEncryptPass, pass, "Before creating master key, no encryption should run");
-        CryptoHelper.createMasterKeyFile();
-        String encryptPass = CryptoHelper.encryptIfNeeded(pass);
-        assertNotEquals(encryptPass, pass, "After creating master key, encryption should run");
-        assertTrue(encryptPass.startsWith("AM"), "Encrypted password should start with AM");
-        assertTrue(CryptoHelper.isMasterEncrypted(encryptPass), "Encrypted password should be master encrypted");
-        assertFalse(CryptoHelper.isPasswordEncrypted(encryptPass),
-                "Encrypted password should not be password encrypted");
-        String encryptPass2 = CryptoHelper.encryptIfNeeded(encryptPass);
-        assertEquals(encryptPass2, encryptPass, "Encrypting twice should not do anything");
-
-        // Encrypting password then encrypt in master
-        SecretKey secretKey = CryptoHelper.generatePbeKeyFromKeyPair(CryptoHelper.generateKeyPair());
-        String passEncrypt = CryptoHelper.encryptSymmetric(pass, secretKey, false);
-        assertNotEquals(passEncrypt, encryptPass, "Encrypting pass should be different");
-        assertFalse(CryptoHelper.isMasterEncrypted(passEncrypt), "Encrypted password should not be master encrypted");
-        assertTrue(CryptoHelper.isPasswordEncrypted(passEncrypt),
-                "Encrypted password should be password encrypted");
-        String encryptPassEncrypt = CryptoHelper.encryptIfNeeded(passEncrypt);
-        assertNotEquals(encryptPassEncrypt, passEncrypt, "Encrypting pass should be different");
-        assertTrue(CryptoHelper.isMasterEncrypted(encryptPassEncrypt), "Encrypted password should be master encrypted");
-        assertFalse(CryptoHelper.isPasswordEncrypted(encryptPassEncrypt),
-                "Encrypted password should not be password encrypted");
-
-        String decrypted = CryptoHelper.decryptIfNeeded(encryptPass);
-        assertEquals(decrypted, pass, "decrypted password should go back to origin");
-
-        String decryptedPass = CryptoHelper.decryptIfNeeded(encryptPassEncrypt);
-        assertEquals(decryptedPass, passEncrypt, "decrypted password encrypted should go back to pass encrypt");
-        assertEquals(CryptoHelper.decryptSymmetric(decryptedPass, secretKey, false), pass,
-                "decrypted password should go back to origin");
-    }
-
-    @Test(enabled = false)
-    public void encryptDecryptLongString() {
-        StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < 500; i++) {
-            sb.append(i);
-        }
-
-        SecretKey secretKey = CryptoHelper.generatePbeKeyFromKeyPair(CryptoHelper.generateKeyPair());
-        // TODO: Check between master and not incompatible
-        String encrypted = CryptoHelper.encryptSymmetric(sb.toString(), secretKey, false);
-        log.debug("Encrypted: {}", encrypted);
-        assertNotNull(encrypted);
-        assertTrue(CryptoHelper.isPasswordEncrypted(encrypted));
-        String decrypted = CryptoHelper.decryptSymmetric(encrypted, secretKey, false);
-        assertEquals(decrypted, sb.toString());
-        assertFalse(CryptoHelper.isPasswordEncrypted(decrypted));
-    }
-
-    public void availableAlgorithms() {
-        List<String> securityProviders = Arrays.asList(getServiceTypes());
-        for (String provider : securityProviders) {
-            if ("KeyPairGenerator".equals(provider) || "Cipher".equals(provider)) {
-                log.debug("Provider: " + provider);
-                log.debug("Crypto:" + Arrays.asList(getProviderImpls(provider)));
-            }
-        }
-    }
-
-    public void removeKeyFile() {
-        if (!CryptoHelper.hasMasterKey()) {
-            CryptoHelper.createMasterKeyFile();
-        }
-        File master = CryptoHelper.getMasterKeyFile();
-        assertTrue(master.exists(), "Master encryption file not found at " + master.getAbsolutePath());
-        CryptoHelper.removeMasterKeyFile();
-        assertFalse(master.exists(), "Master encryption file found at " + master.getAbsolutePath());
-    }
-
-    // This method returns all available services types
-
-    private String[] getServiceTypes() {
-        Set<String> result = new HashSet<>();
-
-        // All all providers
-        Provider[] providers = Security.getProviders();
-        for (Provider provider : providers) {
-            // Get services provided by each provider
-            Set keys = provider.keySet();
-            for (Object key1 : keys) {
-                String key = (String) key1;
-                key = key.split(" ")[0];
-
-                if (key.startsWith("Alg.Alias.")) {
-                    // Strip the alias
-                    key = key.substring(10);
-                }
-                int ix = key.indexOf('.');
-                result.add(key.substring(0, ix));
-            }
-        }
-        return result.toArray(new String[result.size()]);
-    }
-
-    // This method returns the available implementations for a service type
-
-    private String[] getProviderImpls(String serviceType) {
-        Set<String> result = new HashSet<>();
-
-        // All all providers
-        Provider[] providers = Security.getProviders();
-        for (Provider provider : providers) {
-            // Get services provided by each provider
-            Set keys = provider.keySet();
-            for (Object key1 : keys) {
-                String key = (String) key1;
-                key = key.split(" ")[0];
-
-                if (key.startsWith(serviceType + ".")) {
-                    result.add(key.substring(serviceType.length() + 1));
-                } else if (key.startsWith("Alg.Alias." + serviceType + ".")) {
-                    // This is an alias
-                    result.add(key.substring(serviceType.length() + 11));
-                }
-            }
-        }
-        return result.toArray(new String[result.size()]);
-    }
-
-}
diff --git a/base/common/src/test/java/org/artifactory/storage/LinkedPropertiesTest.java b/base/common/src/test/java/org/artifactory/storage/LinkedPropertiesTest.java
deleted file mode 100644
index 4875735..0000000
--- a/base/common/src/test/java/org/artifactory/storage/LinkedPropertiesTest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2015 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Unit tests for {@link LinkedProperties}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class LinkedPropertiesTest {
-
-    public void nullValueTurnsToEmptyString() {
-        LinkedProperties lp = new LinkedProperties();
-        lp.setProperty("key", null);
-        assertEquals(lp.getProperty("key"), "");
-    }
-}
\ No newline at end of file
diff --git a/base/common/src/test/java/org/artifactory/storage/StorageUnitTest.java b/base/common/src/test/java/org/artifactory/storage/StorageUnitTest.java
deleted file mode 100644
index 63bcb14..0000000
--- a/base/common/src/test/java/org/artifactory/storage/StorageUnitTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage;
-
-import org.artifactory.api.storage.StorageUnit;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Test the {@link org.artifactory.api.storage.StorageUnit} enum
- *
- * @author Tomer Cohen
- */
- at Test
-public class StorageUnitTest {
-
-    private static final long twoGbInBytes = 2147483648L;
-    private static final long twoAndAHalfGigsInBytes = 2684354560L;
-    private static final long twoAndAHalfTbsInBytes = twoAndAHalfGigsInBytes * 1024L;
-    private static final long twoAndAHalfPbsInBytes = twoAndAHalfTbsInBytes * 1024L;
-    private static final long twoMbInBytes = 2097152L;
-
-    public void convertBytesToGb() {
-        double bytesInGiga = StorageUnit.GB.fromBytes(twoGbInBytes);
-        assertEquals(bytesInGiga, 2.0, "The convert bytes in giga don't match");
-    }
-
-    public void revertGbToBytes() {
-        double gigasInBytes = StorageUnit.GB.toBytes(2);
-        assertEquals(gigasInBytes, 2147483648.0, "The convert giga in bytes don't match");
-    }
-
-    public void convertBytesToMb() {
-        double bytesInGiga = StorageUnit.MB.fromBytes(twoMbInBytes);
-        assertEquals(bytesInGiga, 2.0, "The convert bytes in giga don't match");
-    }
-
-    public void revertMbToBytes() {
-        double gigasInBytes = StorageUnit.MB.toBytes(2);
-        assertEquals(gigasInBytes, 2097152.0, "The convert giga in bytes don't match");
-    }
-
-    public void bytesToReadableFormat() {
-        String someBytes = StorageUnit.toReadableString(234L);
-        assertEquals(someBytes, "234 bytes");
-
-        String megabytes = StorageUnit.toReadableString(twoMbInBytes);
-        assertEquals(megabytes, "2.00 MB");
-
-        String gigabytes = StorageUnit.toReadableString(twoGbInBytes);
-        assertEquals(gigabytes, "2.00 GB");
-
-        String twoAndAHalfGigs = StorageUnit.toReadableString(twoAndAHalfGigsInBytes);
-        assertEquals(twoAndAHalfGigs, "2.50 GB");
-
-        String twoAndAHalfTbs = StorageUnit.toReadableString(twoAndAHalfTbsInBytes);
-        assertEquals(twoAndAHalfTbs, "2.50 TB");
-
-        String twoAndAHalfPbs = StorageUnit.toReadableString(twoAndAHalfPbsInBytes);
-        assertEquals(twoAndAHalfPbs, "2,560.00 TB");
-    }
-
-    public void readableFormatToBytes() {
-        assertEquals(StorageUnit.fromReadableString("3"), 3);
-        assertEquals(StorageUnit.fromReadableString("5368709120"), 5368709120L);
-
-        assertEquals(StorageUnit.fromReadableString("4k"), 4096);
-        assertEquals(StorageUnit.fromReadableString("12K"), 12288);
-        assertEquals(StorageUnit.fromReadableString("3kb"), 3072);
-        assertEquals(StorageUnit.fromReadableString("32KB"), 32768);
-
-        assertEquals(StorageUnit.fromReadableString("1024m"), 1073741824);
-        assertEquals(StorageUnit.fromReadableString("500M"), 524288000);
-        assertEquals(StorageUnit.fromReadableString("40mb"), 41943040);
-        assertEquals(StorageUnit.fromReadableString("128MB"), 134217728);
-
-        assertEquals(StorageUnit.fromReadableString("4g"), 4294967296L);
-        assertEquals(StorageUnit.fromReadableString("12G"), 12884901888L);
-        assertEquals(StorageUnit.fromReadableString("3gb"), 3221225472L);
-        assertEquals(StorageUnit.fromReadableString("32GB"), 34359738368L);
-        assertEquals(StorageUnit.fromReadableString("1.67Tb"), 1836184418385L);
-        assertEquals(StorageUnit.fromReadableString("12T"), 13194139533312L);
-    }
-}
diff --git a/base/common/src/test/java/org/artifactory/util/HttpUtilsTest.java b/base/common/src/test/java/org/artifactory/util/HttpUtilsTest.java
deleted file mode 100644
index 2020b44..0000000
--- a/base/common/src/test/java/org/artifactory/util/HttpUtilsTest.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2015 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.artifactory.util;
-
-import org.apache.commons.codec.EncoderException;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ArtifactoryContextThreadBinder;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.request.ArtifactoryRequest;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.springframework.mock.web.MockHttpServletRequest;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import static org.easymock.EasyMock.*;
-import static org.testng.Assert.assertEquals;
-
-/**
- * Tests the helper {@link HttpUtils} class.
- */
- at Test
-public class HttpUtilsTest extends ArtifactoryHomeBoundTest {
-
-    public void encodeUrlWithParameters() throws EncoderException {
-        String unescaped = "http://domain:8089/context/path?x=a/b/c&b=c";
-        String escaped = HttpUtils.encodeQuery(unescaped);
-        assertEquals(escaped, unescaped);
-    }
-
-    public void encodeUrlWithSpaces() throws EncoderException {
-        String unescaped = "http://domain:8089/context/file path.txt";
-        String escaped = HttpUtils.encodeQuery(unescaped);
-        assertEquals(escaped, "http://domain:8089/context/file%20path.txt");
-    }
-
-    public void encodeBuildUrl() throws EncoderException {
-        String unescaped = "http://127.0.0.1:53123/artifactory/api/build/moo :: moo/999";
-        String escaped = HttpUtils.encodeQuery(unescaped);
-        assertEquals(escaped, "http://127.0.0.1:53123/artifactory/api/build/moo%20::%20moo/999");
-    }
-
-    public void getServletContextUrl() throws EncoderException {
-        String requestUrl = "http://lala.land.com";
-        MockHttpServletRequest mockRequest = new MockHttpServletRequest("GET", requestUrl);
-        mockRequest.setServerName("lala.land.com");
-        String servletContextUrl = HttpUtils.getServletContextUrl(mockRequest);
-        assertEquals(servletContextUrl, requestUrl);
-    }
-
-    public void getServletContextUrlHttps() throws EncoderException {
-        String requestUrl = "https://lala.land.com";
-        MockHttpServletRequest mockRequest = new MockHttpServletRequest("GET", requestUrl);
-        mockRequest.setServerName("lala.land.com");
-        mockRequest.setScheme("https");
-        mockRequest.setServerPort(443);
-        String servletContextUrl = HttpUtils.getServletContextUrl(mockRequest);
-        assertEquals(servletContextUrl, requestUrl);
-    }
-
-    public void getServletContextUrlWithBaseUrl() throws EncoderException {
-        String requestUrl = "http://lala.land.com";
-        setBaseUrl("https://custombaseurl.net");
-        MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUrl);
-        request.setServerName("lala.land.com");
-        String servletContextUrl = HttpUtils.getServletContextUrl(request);
-        assertEquals(servletContextUrl, "https://custombaseurl.net");
-    }
-
-    public void getServletContextUrlWithBaseUrlAndOverridingHeader() throws EncoderException {
-        String requestUrl = "http://lala.land.com";
-        setBaseUrl("https://custombaseurl.net");
-        MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUrl);
-        request.setServerName("lala.land.com");
-        request.addHeader(ArtifactoryRequest.ARTIFACTORY_OVERRIDE_BASE_URL, "http://originartifactory.net");
-        String servletContextUrl = HttpUtils.getServletContextUrl(request);
-        assertEquals(servletContextUrl, "http://originartifactory.net");
-    }
-
-    private void setBaseUrl(String baseUrl) {
-        CentralConfigDescriptor ccd = ContextHelper.get().getCentralConfig().getDescriptor();
-        reset(ccd);
-        expect(ccd.getUrlBase()).andReturn(baseUrl).anyTimes();
-        replay(ccd);
-    }
-
-    @BeforeMethod
-    private void setupMock() {
-        ArtifactoryContext context = createMock(ArtifactoryContext.class);
-        ArtifactoryContextThreadBinder.bind(context);
-        CentralConfigService cc = createMock(CentralConfigService.class);
-        expect(context.getCentralConfig()).andReturn(cc).anyTimes();
-        CentralConfigDescriptor ccd = createMock(CentralConfigDescriptor.class);
-        expect(cc.getDescriptor()).andReturn(ccd).anyTimes();
-        expect(ccd.getUrlBase()).andReturn(null).anyTimes();
-        replay(context, cc, ccd);
-    }
-
-    @AfterMethod
-    private void shutdownMock() {
-        ArtifactoryContextThreadBinder.unbind();
-    }
-}
\ No newline at end of file
diff --git a/base/common/src/test/java/org/artifactory/util/NumberFormatterTest.java b/base/common/src/test/java/org/artifactory/util/NumberFormatterTest.java
deleted file mode 100644
index 63fbea5..0000000
--- a/base/common/src/test/java/org/artifactory/util/NumberFormatterTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Unit tests for {@link NumberFormatter}
- *
- * @author Yossi Shaul
- */
- at Test
-public class NumberFormatterTest {
-
-    public void formatLong() {
-        assertEquals(NumberFormatter.formatLong(0), "0");
-        assertEquals(NumberFormatter.formatLong(1), "1");
-        assertEquals(NumberFormatter.formatLong(100), "100");
-        assertEquals(NumberFormatter.formatLong(1_000), "1,000");
-        assertEquals(NumberFormatter.formatLong(10_000), "10,000");
-        assertEquals(NumberFormatter.formatLong(1_000_000), "1,000,000");
-        assertEquals(NumberFormatter.formatLong(1_000_001_000), "1,000,001,000");
-    }
-
-    public void formatPercentage() {
-        assertEquals(NumberFormatter.formatPercentage(0), "0%");
-        assertEquals(NumberFormatter.formatPercentage(0.0), "0%");
-        assertEquals(NumberFormatter.formatPercentage(1), "100%");
-        assertEquals(NumberFormatter.formatPercentage(0.5555), "55.55%");
-        if (System.getProperty("java.version").startsWith("1.8")) {
-            assertEquals(NumberFormatter.formatPercentage(0.55555), "55.55%");
-        } else {
-            assertEquals(NumberFormatter.formatPercentage(0.55555), "55.56%");
-        }
-        assertEquals(NumberFormatter.formatPercentage(0.55558), "55.56%");
-        assertEquals(NumberFormatter.formatPercentage(0.55554), "55.55%");
-        assertEquals(NumberFormatter.formatPercentage(30.55554), "3055.55%");
-    }
-
-}
diff --git a/base/common/src/test/java/org/artifactory/util/PathValidatorTest.java b/base/common/src/test/java/org/artifactory/util/PathValidatorTest.java
deleted file mode 100644
index 203b4a5..0000000
--- a/base/common/src/test/java/org/artifactory/util/PathValidatorTest.java
+++ /dev/null
@@ -1,138 +0,0 @@
-package org.artifactory.util;
-
-import org.testng.annotations.Test;
-
-import java.nio.file.InvalidPathException;
-
-/**
- * Tests the behavior of {@link PathValidator}
- *
- * @author Shay Yaakov
- */
- at Test
-public class PathValidatorTest {
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void invalidSingleSlash() {
-        PathValidator.validate("");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void invalidSingleColon() {
-        PathValidator.validate(":");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void invalidSingleAmpersand() {
-        PathValidator.validate("&");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void invalidSingleTokenAmpersand() {
-        PathValidator.validate("bbb/&");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void invalidSingleDot() {
-        PathValidator.validate(".");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void invalidSingleDotDot() {
-        PathValidator.validate("..");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void invalidDot() {
-        PathValidator.validate("blabla/.");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void invalidDotDot() {
-        PathValidator.validate("dot/../dot/file.jar");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void invalidAllSpaces() {
-        PathValidator.validate("       ");
-    }
-
-    @Test
-    public void validCarretLeft() {
-        PathValidator.validate("hibla<sdf");
-    }
-
-    @Test
-    public void validCarretRight() {
-        PathValidator.validate("path/to>file.jar");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void illegalBackslash() {
-        PathValidator.validate("back\\slash.zors");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void illegalQuestionMark() {
-        PathValidator.validate("riddle/me_this?.tar");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void illegalQuotationMark() {
-        PathValidator.validate("make\"believe.hello");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void illegalPipe() {
-        PathValidator.validate("sup|r|mario");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void illegalStar() {
-        PathValidator.validate("the/universe/has/lots/of/*");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void illegalColon() {
-        PathValidator.validate("c/olo:n/repo/path");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void invalidSpaceBeforeSlash() {
-        PathValidator.validate(" shsh/gaga /hdt");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void invalidSpaceAfterSlash() {
-        PathValidator.validate("blabla/hello/      ");
-    }
-
-    public void validPaths() {
-        PathValidator.validate("antlr/antlr/2.7.6/antlr-2.7.6.jar");
-        PathValidator.validate("ca/juliusdavies/not-yet-commons-ssl/0.3.9/not-yet-commons-ssl-0.3.9.jar.sha1");
-        PathValidator.validate("commons-codec/commons-codec/1.5/commons-codec-1.5.pom.md5");
-        PathValidator.validate("/axis/axis-saaj/1.4/axis-saaj-1.4.pom");
-        PathValidator.validate("cccc}dd{dd");
-        PathValidator.validate("dsfsdf!cgxcbv$");
-        PathValidator.validate("sdf/d dd$dd");
-        PathValidator.validate("P at ssw0rd.h$sh");
-        PathValidator.validate("sdfs9(vcx).jar");
-        PathValidator.validate("xcv[sdf..sdf]");
-        PathValidator.validate("vxvc^fvnb^..sdfsde&");
-        PathValidator.validate("a=1&b=2");
-        PathValidator.validate("copy   maven     project");
-        PathValidator.validate("de/regnis/sequence/1.0.0/sequence-library-1.0.0.jar;tmp.sha1.tmp");
-        PathValidator.validate("vv/aa..bb/&gg.pom");
-        PathValidator.validate("v1.0...0");
-        PathValidator.validate("jar-100%.jar");
-        PathValidator.validate("gogo,baba.jar");
-        PathValidator.validate("file    tab.jar");
-        PathValidator.validate(".index");
-        PathValidator.validate("..index");
-        PathValidator.validate("blabla/.index");
-        PathValidator.validate("blabla/..index");
-        PathValidator.validate("blabla/index.");
-        PathValidator.validate("blabla/index./asdasd");
-        PathValidator.validate("blabla/index../asdasd");
-    }
-}
diff --git a/base/common/src/test/java/org/artifactory/util/StringInputStreamTest.java b/base/common/src/test/java/org/artifactory/util/StringInputStreamTest.java
deleted file mode 100644
index 6e1a107..0000000
--- a/base/common/src/test/java/org/artifactory/util/StringInputStreamTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import org.apache.commons.io.IOUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.util.List;
-
-/**
- * Tests the StringInputStream.
- *
- * @author Yossi Shaul
- */
- at Test
-public class StringInputStreamTest {
-
-    @SuppressWarnings({"unchecked"})
-    public void readOneLineString() throws IOException {
-        StringInputStream in = new StringInputStream("a string");
-        List<String> lines = IOUtils.readLines(in);
-        Assert.assertEquals(lines.size(), 1, "Expecting only one line");
-        Assert.assertEquals(lines.get(0), "a string", "Unexpected content: " + lines.get(0));
-    }
-
-    @SuppressWarnings({"unchecked"})
-    public void readMultiLineString() throws IOException {
-        StringInputStream in = new StringInputStream("line 1\nline2\nline   3");
-        List<String> lines = IOUtils.readLines(in);
-        Assert.assertEquals(lines.size(), 3, "Expecting 3 lines");
-        Assert.assertEquals(lines.get(0), "line 1", "Unexpected content");
-        Assert.assertEquals(lines.get(1), "line2", "Unexpected content");
-    }
-
-}
diff --git a/base/common/src/test/java/org/artifactory/util/TimeUnitFormatTest.java b/base/common/src/test/java/org/artifactory/util/TimeUnitFormatTest.java
deleted file mode 100644
index c8baf69..0000000
--- a/base/common/src/test/java/org/artifactory/util/TimeUnitFormatTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import org.testng.annotations.Test;
-
-import java.util.concurrent.TimeUnit;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Unit tests for the {@link TimeUnitFormat} class.
- *
- * @author Yossi Shaul
- */
- at Test
-public class TimeUnitFormatTest {
-
-    public void stillNanos() {
-        assertEquals(TimeUnitFormat.getTimeString(2345), "2345 nanos");
-        assertEquals(TimeUnitFormat.getTimeString(999_999), "999999 nanos");
-    }
-
-    public void toMillis() {
-        assertEquals(TimeUnitFormat.getTimeString(TimeUnit.MILLISECONDS.toNanos(1)), "1 millis");
-        assertEquals(TimeUnitFormat.getTimeString(1_100_000), "1.1 millis");
-    }
-
-    public void toSeconds() {
-        assertEquals(TimeUnitFormat.getTimeString(TimeUnit.SECONDS.toNanos(1)), "1 secs");
-        assertEquals(TimeUnitFormat.getTimeString(9_755_461_234L), "9.76 secs");
-    }
-
-    public void toMinutes() {
-        assertEquals(TimeUnitFormat.getTimeString(TimeUnit.MINUTES.toNanos(1)), "1 minutes");
-        assertEquals(TimeUnitFormat.getTimeString(1_456_000L * 1000 * 60 * 10), "14.56 minutes");
-    }
-
-    public void toSecondsWithMillisecondTimeUnit() {
-        assertEquals(TimeUnitFormat.getTimeString(1000, TimeUnit.MILLISECONDS), "1 secs");
-        assertEquals(TimeUnitFormat.getTimeString(TimeUnit.NANOSECONDS.toMillis(9_755_461_234L),
-                TimeUnit.MILLISECONDS), "9.76 secs");
-    }
-
-}
diff --git a/base/common/src/test/java/org/artifactory/util/UrlValidatorTest.java b/base/common/src/test/java/org/artifactory/util/UrlValidatorTest.java
deleted file mode 100644
index 9e32c18..0000000
--- a/base/common/src/test/java/org/artifactory/util/UrlValidatorTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-/**
- * Tests {@link org.artifactory.util.UrlValidator}.
- *
- * @author Michael Pasternak
- */
- at Test
-public class UrlValidatorTest {
-
-    @SuppressWarnings({"unchecked"})
-    @BeforeMethod
-    protected void setUp() throws Exception {
-    }
-
-    public void httpIp() throws UrlValidator.UrlValidationException {
-        UrlValidator validator = new UrlValidator("http");
-        validator.validate("http://127.0.0.1/test");
-    }
-
-    public void httpHostname() throws UrlValidator.UrlValidationException {
-        UrlValidator validator = new UrlValidator("http", "https", "ldap");
-        validator.validate("ldap://localhost/test/123456");
-    }
-
-    public void httpHostnameWithUnderscore() throws UrlValidator.UrlValidationException {
-        UrlValidator validator = new UrlValidator("http", "https", "ftp");
-        validator.validate("https://with_underscore/any");
-    }
-
-    @Test(expectedExceptions = {UrlValidator.UrlValidationException.class})
-    public void illegalSchema() throws UrlValidator.UrlValidationException {
-        UrlValidator validator = new UrlValidator("http", "ftp");
-        validator.validate("https://localhost/test");
-    }
-
-    @Test(expectedExceptions = {UrlValidator.UrlValidationException.class})
-    public void invalidSchema() throws UrlValidator.UrlValidationException {
-        UrlValidator validator = new UrlValidator("http", "ftp");
-        validator.validate("htddd://localhost/test");
-    }
-
-    @Test(expectedExceptions = {UrlValidator.UrlValidationException.class})
-    public void invalidHostname() throws UrlValidator.UrlValidationException {
-        UrlValidator validator = new UrlValidator("http", "ftp");
-        validator.validate("https://no host/test");
-    }
-}
diff --git a/base/common/src/test/java/org/artifactory/util/ZipUtilsTest.java b/base/common/src/test/java/org/artifactory/util/ZipUtilsTest.java
deleted file mode 100644
index 1afbe49..0000000
--- a/base/common/src/test/java/org/artifactory/util/ZipUtilsTest.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.SystemUtils;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-import org.testng.reporters.*;
-import org.testng.reporters.Files;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.List;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the {@link ZipUtils} class.
- *
- * @author Yossi Shaul
- */
- at Test
-public class ZipUtilsTest extends ArtifactoryHomeBoundTest {
-    private File zipFile;
-    private File archiveWithSymLinks;
-    private ZipInputStream zis;
-
-    // the zip test contains: file.txt, folder/another.txt
-
-    @BeforeClass
-    public void setup() {
-        zipFile = ResourceUtils.getResourceAsFile("/ziptest.zip");
-        archiveWithSymLinks = ResourceUtils.getResourceAsFile("/zip-with-symlinks.tar.gz");
-    }
-
-    @BeforeMethod
-    public void openStream() throws FileNotFoundException {
-        zis = new ZipInputStream(new FileInputStream(zipFile));
-    }
-
-    @AfterMethod
-    public void closeStream() throws FileNotFoundException {
-        IOUtils.closeQuietly(zis);
-    }
-
-    public void locateExistingEntry() throws Exception {
-        ZipEntry zipEntry = ZipUtils.locateEntry(zis, "file.txt", null);
-        assertNotNull(zipEntry, "Couldn't find zip entry");
-    }
-
-    public void locateMissingEntry() throws Exception {
-        ZipEntry zipEntry = ZipUtils.locateEntry(zis, "nosuchfile.txt", null);
-        assertNull(zipEntry, "Shouldn't have found zip entry");
-    }
-
-    public void testExtractZipFile() throws Exception {
-        File tempExtractedDir = extract(zipFile);
-        assertExtractedFiles(tempExtractedDir);
-    }
-
-
-    @Test // RTFACT-7596
-    public void testExtractingSymLinks() throws Exception {
-        File tempExtractedDir = extract(archiveWithSymLinks);
-        assertExtractedSymlinks(new File(tempExtractedDir.getPath() + File.separator + "zip-with-symlinks"));
-    }
-
-    public void testExtractTarFile() throws Exception {
-        File tarFile = ResourceUtils.getResourceAsFile("/tartest.tar");
-        File tempExtractedDir = extract(tarFile);
-        assertExtractedFiles(tempExtractedDir);
-    }
-
-    public void testExtractTarGzFile() throws Exception {
-        File gzipFile = ResourceUtils.getResourceAsFile("/gziptest.tar.gz");
-        File tempExtractedDir = extract(gzipFile);
-        assertExtractedFiles(tempExtractedDir);
-    }
-
-    public void testExtractTgzFile() throws Exception {
-        File tgzFile = ResourceUtils.getResourceAsFile("/tgztest.tgz");
-        File tempExtractedDir = extract(tgzFile);
-        assertExtractedFiles(tempExtractedDir);
-    }
-
-    @Test(expectedExceptions = RuntimeException.class,
-            expectedExceptionsMessageRegExp = "(.*)Unsupported(.*)archive(.*)extension(.*)")
-    public void testUnsupportedArchive() throws Exception {
-        File unsupportedFile = ResourceUtils.getResourceAsFile("/unsupported.ar");
-        extract(unsupportedFile);
-    }
-
-    private File extract(File fileToExtract) throws Exception {
-        File tempExtractedDir = new File(fileToExtract.getParentFile(), "temp");
-        FileUtils.deleteDirectory(tempExtractedDir);
-        FileUtils.forceMkdir(tempExtractedDir);
-        ZipUtils.extract(fileToExtract, tempExtractedDir);
-        return tempExtractedDir;
-    }
-
-    private void assertExtractedFiles(File tempExtractedDir) {
-        List<String> files = Lists.newArrayList(tempExtractedDir.list());
-        assertEquals(files.size(), 2, "Unexpected files size");
-        assertTrue(files.contains("file.txt"), "Unexpected file name");
-        assertTrue(files.contains("folder"), "Unexpected folder name");
-    }
-
-    private void assertExtractedSymlinks(File extractedDir) throws IOException {
-        List<String> files = Lists.newArrayList(extractedDir.list());
-        if (SystemUtils.IS_OS_WINDOWS) {
-            assertEquals(files.size(), 4, "Unexpected files size for windows");
-        } else {
-            assertEquals(files.size(), 5, "Unexpected files size");
-            assertTrue(files.contains("chopper_ico.bmp"), "Missing file");
-            assertTrue(files.contains("chopper_ico.bmp-hlink"), "Missing file");
-            assertTrue(files.contains("chopper_ico.spr"), "Missing file");
-            assertTrue(files.contains("chopper_ico.spr-slnk"), "Missing file");
-            assertTrue(files.contains("chopper_top.bmp"), "Missing file");
-
-            String file1 = Files.readFile(new File(extractedDir + File.separator + "chopper_ico.spr"));
-            String linkToFile1 = Files.readFile(new File(extractedDir + File.separator + "chopper_ico.spr-slnk"));
-
-            String file2 = Files.readFile(new File(extractedDir + File.separator + "chopper_ico.bmp"));
-            String linkToFile2 = Files.readFile(new File(extractedDir + File.separator + "chopper_ico.bmp-hlink"));
-
-            assertEquals(file1, linkToFile1, "Soft links reconstruction has failed");
-            assertEquals(file2, linkToFile2, "Hard links reconstruction has failed");
-        }
-    }
-}
diff --git a/base/common/src/test/resources/converters/templates/cluster/3.1.0/artifactory.properties b/base/common/src/test/resources/converters/templates/cluster/3.1.0/artifactory.properties
deleted file mode 100644
index 9fe595c..0000000
--- a/base/common/src/test/resources/converters/templates/cluster/3.1.0/artifactory.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-artifactory.version=2.6.5
-artifactory.revision=2147483647
-artifactory.release=1356889752941
diff --git a/base/common/src/test/resources/converters/templates/cluster/3.1.0/logback.xml b/base/common/src/test/resources/converters/templates/cluster/3.1.0/logback.xml
deleted file mode 100644
index feceba2..0000000
--- a/base/common/src/test/resources/converters/templates/cluster/3.1.0/logback.xml
+++ /dev/null
@@ -1,173 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ This file is part of Artifactory.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-<configuration debug="false">
-    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%date [%thread] [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
-        </layout>
-    </appender>
-    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/artifactory.log</File>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/artifactory.%i.log.zip</FileNamePattern>
-            <MinIndex>1</MinIndex>
-            <MaxIndex>9</MaxIndex>
-        </rollingPolicy>
-
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>5MB</MaxFileSize>
-        </triggeringPolicy>
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%date [%thread] [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
-        </layout>
-    </appender>
-    <appender name="ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/access.log</File>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/access.%i.log.zip</FileNamePattern>
-            <MinIndex>1</MinIndex>
-            <MaxIndex>9</MaxIndex>
-        </rollingPolicy>
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%d %m%n</pattern>
-        </layout>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>5MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="IMPORT.EXPORT" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/import.export.log</File>
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%date [%-5level] \(%logger{32}:%line\) %message%n</pattern>
-        </layout>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/import.export.%i.log.zip</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>10MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="TRAFFIC" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/traffic</File>
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%message%n</pattern>
-        </layout>
-        <rollingPolicy class="org.artifactory.traffic.policy.TrafficTimeBasedRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/traffic.%d{yyyyMM}</FileNamePattern>
-        </rollingPolicy>
-    </appender>
-    <appender name="REQUEST" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/request.log</File>
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%message%n</pattern>
-        </layout>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/request.%i.log</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>10MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <root>
-        <level value="WARN"/>
-        <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="FILE"/>
-    </root>
-    <logger name="org.artifactory">
-        <level value="INFO"/>
-    </logger>
-    <logger name="org.artifactory.repo.index">
-        <level value="ERROR"/>
-    </logger>
-    <logger name="org.artifactory.info.InfoWriter">
-        <level value="WARN"/>
-    </logger>
-    <logger name="org.artifactory.security.AccessLogger" additivity="false">
-        <level value="INFO"/>
-        <appender-ref ref="ACCESS"/>
-    </logger>
-    <logger name="org.artifactory.api.common.StatusHolder" additivity="false">
-        <level value="DEBUG"/>
-        <appender-ref ref="IMPORT.EXPORT"/>
-    </logger>
-    <logger name="org.artifactory.traffic.TrafficLogger" additivity="false">
-        <level value="INFO"/>
-        <appender-ref ref="TRAFFIC"/>
-    </logger>
-    <logger name="org.artifactory.traffic.RequestLogger" additivity="false">
-        <level value="INFO"/>
-        <appender-ref ref="REQUEST"/>
-    </logger>
-
-    <!-- third party loggers -->
-    <logger name="org.apache.wicket">
-        <level value="ERROR"/>
-    </logger>
-    <logger name="org.apache.jasper">
-        <level value="INFO"/>
-    </logger>
-    <logger name="httpclient.wire">
-        <level value="INFO"/>
-    </logger>
-    <logger name="org.apache.jackrabbit">
-        <level value="WARN"/>
-    </logger>
-    <logger name="org.mortbay">
-        <level value="INFO"/>
-    </logger>
-    <logger name="org.apache.commons.httpclient">
-        <level value="INFO"/>
-    </logger>
-    <logger name="org.springframework">
-        <level value="WARN"/>
-    </logger>
-    <logger name="org.apache.jackrabbit.extractor.XMLTextExtractor">
-        <level value="ERROR"/>
-    </logger>
-
-    <!--
-    <logger name="org.artifactory.webapp.servlet.RepoFilter">
-        <level value="DEBUG"/>
-    </logger>
-    <logger name="org.artifactory.jcr.lock.SessionLockEntry">
-        <level value="TRACE"/>
-    </logger>
-    <logger name="org.artifactory.repo.jcr.JcrRepoBase">
-        <level value="DEBUG"/>
-    </logger>
-    <logger name="org.artifactory.webapp.servlet.ArtifactoryResponseBase">
-        <level value="DEBUG"/>
-    </logger>
-    -->
-    <!--
-    <logger name="org.artifactory.jcr.lock.InternalLockManager">
-        <level value="TRACE"/>
-    </logger>
-    -->
-
-    <!--Added by Artifactory update (Thu Feb 04 11:15:06 IST 2010)-->
-    <logger name="org.apache.jackrabbit.core.persistence.bundle.BundleDbPersistenceManager">
-        <level value="INFO"/>
-    </logger>
-    <!--Added by Artifactory update (Thu Feb 04 11:15:06 IST 2010)-->
-    <logger name="org.apache.jackrabbit.core.query.lucene.MultiIndex">
-        <level value="INFO"/>
-    </logger>
-</configuration>
diff --git a/base/common/src/test/resources/converters/templates/cluster/3.1.0/mimetypes.xml b/base/common/src/test/resources/converters/templates/cluster/3.1.0/mimetypes.xml
deleted file mode 100644
index 79eaad8..0000000
--- a/base/common/src/test/resources/converters/templates/cluster/3.1.0/mimetypes.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2010 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><!--
-    This file configures Artifactory's known mime types. A list of registered
-    media types can be found in http://www.iana.org/assignments/media-types/ and common ones in
-    http://www.webmaster-toolkit.com/mime-types.shtml
-    Each mime type may have the following attributes:
-        type - The mime entry unique name (mandatory)
-        extensions - Comma separated list of file extensions mapped to this mime type (mandatory)
-        viewable - True if this mime type can be viewed as text file
-        xml - True if this mime type is an xml and should be indexed for searching
-        archive - True if this mime type is a browsable archive
-        syntax - The UI highlighter syntax to for this mime type (only relevant if this is a viewable type)
-        css - The css class of a display icon for this mime type
--->
-<mimetypes version="4">
-
-    <mimetype type="text/plain" extensions="txt, properties, mf, asc" viewable="true" syntax="plain"/>
-    <mimetype type="text/html" extensions="htm, html" viewable="true" syntax="xml"/>
-    <mimetype type="text/css" extensions="css" viewable="true" syntax="css"/>
-    <mimetype type="text/xsl" extensions="xsl" viewable="true" syntax="xml"/>
-    <mimetype type="text/xslt" extensions="xslt" viewable="true" syntax="xml"/>
-    <mimetype type="text/x-java-source" extensions="java" viewable="true" syntax="java"/>
-    <mimetype type="text/x-javafx-source" extensions="fx" viewable="true" syntax="javafx"/>
-    <mimetype type="text/x-groovy-source" extensions="groovy, gradle" viewable="true" syntax="groovy"/>
-    <mimetype type="text/x-c" extensions="c, cc, cpp" viewable="true" syntax="groovy"/>
-
-    <mimetype type="application/xml-dtd" extensions="dtd" viewable="true"/>
-    <mimetype type="application/xml-schema" extensions="xsd" viewable="true" syntax="xml" index="false" css="xml"/>
-    <mimetype type="application/xml-external-parsed-entity" extensions="ent" viewable="true"/>
-    <mimetype type="application/xhtml+xml" extensions="xhtml" viewable="true" syntax="xml"/>
-
-    <mimetype type="application/x-java-pack200" extensions="jar.pack.gz" archive="true" css="jar" index="true"/>
-    <mimetype type="application/x-java-archive-diff" extensions="jardiff" archive="false"/>
-    <mimetype type="application/zip" extensions="zip" archive="true" css="jar" index="true"/>
-    <mimetype type="application/x-rar-compressed" extensions="rar" archive="false" css="jar"/>
-
-    <!-- not registered -->
-    <mimetype type="text/x-scala-source" extensions="scala" viewable="true" syntax="scala"/>
-    <mimetype type="text/x-ruby-source" extensions="rb" viewable="true" syntax="ruby"/>
-    <mimetype type="text/x-script.sh" extensions="sh" viewable="true" syntax="shell"/>
-    <mimetype type="text/x-csharp.sh" extensions="cs" viewable="true" syntax="csharp"/>
-
-    <!--
-        NOTE: The following mime types are required for a proper functioning of certain features in Artifactory 
-         DO NOT change them unless you really know what you are doing
-    -->
-    <mimetype type="application/xml" extensions="xml, xsl, xsi" viewable="true" syntax="xml" index="false" css="xml"/>
-    <mimetype type="application/x-maven-pom+xml" extensions="pom" viewable="true" syntax="xml" index="true" css="pom"/>
-    <mimetype type="application/x-ivy+xml" extensions="ivy" viewable="true" syntax="xml" index="true" css="xml"/>
-    <mimetype type="application/x-java-jnlp-file" extensions="jnlp" viewable="true" syntax="xml" index="false"
-              css="jnlp"/>
-    <mimetype type="application/x-checksum" extensions="sha1, md5" viewable="true" syntax="plain"/>
-    <mimetype type="application/java-archive" extensions="jar, war, ear, sar, har" archive="true" css="jar"
-              index="true"/>
-
-    <mimetype type="application/x-nupkg" extensions="nupkg" archive="true" index="true" css="nupkg"/>
-    <mimetype type="application/x-nuspec+xml" extensions="nuspec" viewable="true" syntax="xml" css="xml"/>
-</mimetypes>
diff --git a/base/common/src/test/resources/converters/templates/home/3.0.1/artifactory.properties b/base/common/src/test/resources/converters/templates/home/3.0.1/artifactory.properties
deleted file mode 100644
index de45590..0000000
--- a/base/common/src/test/resources/converters/templates/home/3.0.1/artifactory.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-artifactory.version=3.0.1
-artifactory.revision=30008
-artifactory.release=1368450633313
diff --git a/base/common/src/test/resources/converters/templates/home/3.0.1/logback.xml b/base/common/src/test/resources/converters/templates/home/3.0.1/logback.xml
deleted file mode 100644
index 7eb5ffc..0000000
--- a/base/common/src/test/resources/converters/templates/home/3.0.1/logback.xml
+++ /dev/null
@@ -1,163 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<configuration debug="false">
-    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"/>
-    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
-            <layout class="org.artifactory.logging.layout.BackTracePatternLayout">
-                <pattern>%date ${artifactory.contextId}[%thread] [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
-            </layout>
-        </encoder>
-    </appender>
-    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/artifactory.log</File>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/artifactory.%i.log.zip</FileNamePattern>
-            <MinIndex>1</MinIndex>
-            <MaxIndex>9</MaxIndex>
-        </rollingPolicy>
-
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>25MB</MaxFileSize>
-        </triggeringPolicy>
-        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
-            <layout class="org.artifactory.logging.layout.BackTracePatternLayout">
-                <pattern>%date [%thread] [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
-            </layout>
-        </encoder>
-    </appender>
-    <appender name="ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/access.log</File>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/access.%i.log.zip</FileNamePattern>
-            <MinIndex>1</MinIndex>
-            <MaxIndex>9</MaxIndex>
-        </rollingPolicy>
-        <encoder>
-            <pattern>%d %m%n</pattern>
-        </encoder>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>25MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="IMPORT.EXPORT" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/import.export.log</File>
-        <encoder>
-            <pattern>%date [%-5level] \(%logger{32}:%line\) %message%n</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/import.export.%i.log.zip</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>25MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="TRAFFIC" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/traffic</File>
-        <encoder>
-            <pattern>%message%n</pattern>
-        </encoder>
-        <rollingPolicy class="org.artifactory.traffic.policy.TrafficTimeBasedRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/traffic.%d{yyyyMMdd}</FileNamePattern>
-        </rollingPolicy>
-    </appender>
-    <appender name="REQUEST" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/request.log</File>
-        <encoder>
-            <pattern>%message%n</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/request.%i.log</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>25MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="REQUEST_TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/request_trace.log</File>
-        <encoder>
-            <pattern>%date %message%n</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/request_trace.%i.log</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>25MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <root>
-        <level value="warn"/>
-        <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="FILE"/>
-    </root>
-    <logger name="org.artifactory">
-        <level value="info"/>
-    </logger>
-    <logger name="org.artifactory.security.AccessLogger" additivity="false">
-        <level value="info"/>
-        <appender-ref ref="ACCESS"/>
-    </logger>
-    <logger name="org.artifactory.api.common.BasicStatusHolder" additivity="false">
-        <level value="DEBUG"/>
-        <appender-ref ref="IMPORT.EXPORT"/>
-    </logger>
-    <logger name="org.artifactory.traffic.TrafficLogger" additivity="false">
-        <level value="info"/>
-        <appender-ref ref="TRAFFIC"/>
-    </logger>
-    <logger name="org.artifactory.traffic.RequestLogger" additivity="false">
-        <level value="info"/>
-        <appender-ref ref="REQUEST"/>
-    </logger>
-    <logger name="org.artifactory.request.RequestTraceLogger" additivity="false">
-        <level value="info"/>
-        <appender-ref ref="REQUEST_TRACE"/>
-    </logger>
-
-    <!-- third party loggers -->
-    <logger name="com.atlassian.crowd.integration.service.soap.client.ClientPropertiesImpl">
-        <level value="warn"/>
-    </logger>
-
-    <logger name="org.apache.wicket">
-        <level value="error"/>
-    </logger>
-    <logger name="org.eclipse.jetty">
-        <level value="info"/>
-    </logger>
-    <logger name="com.sun.jersey">
-        <level value="warn"/>
-    </logger>
-    <logger name="org.apache.commons.httpclient">
-        <level value="info"/>
-    </logger>
-    <logger name="httpclient.wire">
-        <level value="info"/>
-    </logger>
-    <logger name="org.springframework">
-        <level value="warn"/>
-    </logger>
-    <logger name="org.apache.cxf">
-        <level value="error"/>
-    </logger>
-</configuration>
\ No newline at end of file
diff --git a/base/common/src/test/resources/converters/templates/home/3.0.1/mimetypes.xml b/base/common/src/test/resources/converters/templates/home/3.0.1/mimetypes.xml
deleted file mode 100644
index 2394768..0000000
--- a/base/common/src/test/resources/converters/templates/home/3.0.1/mimetypes.xml
+++ /dev/null
@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-<!--
-    This file configures Artifactory's known mime types. A list of registered
-    media types can be found in http://www.iana.org/assignments/media-types/ and common ones in
-    http://www.webmaster-toolkit.com/mime-types.shtml
-    Each mime type may have the following attributes:
-        type - The mime entry unique name (mandatory)
-        extensions - Comma separated list of file extensions mapped to this mime type (mandatory)
-        viewable - True if this mime type can be viewed as text file
-        index - True if this mime type should be indexed for searching (valid only for xml and archive files)
-        archive - True if this mime type is a browsable archive
-        syntax - The UI highlighter syntax to for this mime type (only relevant if this is a viewable type)
-        css - The css class of a display icon for this mime type
--->
-<mimetypes version="4">
-
-    <mimetype type="text/plain" extensions="txt, properties, mf, asc" viewable="true" syntax="plain"/>
-    <mimetype type="text/html" extensions="htm, html" viewable="true" syntax="xml"/>
-    <mimetype type="text/css" extensions="css" viewable="true" syntax="css"/>
-    <mimetype type="text/xsl" extensions="xsl" viewable="true" syntax="xml"/>
-    <mimetype type="text/xslt" extensions="xslt" viewable="true" syntax="xml"/>
-    <mimetype type="text/x-java-source" extensions="java" viewable="true" syntax="java"/>
-    <mimetype type="text/x-javafx-source" extensions="fx" viewable="true" syntax="javafx"/>
-    <mimetype type="text/x-groovy-source" extensions="groovy, gradle" viewable="true" syntax="groovy"/>
-    <mimetype type="text/x-c" extensions="h, c, cc, cpp" viewable="true" syntax="cpp"/>
-
-    <mimetype type="application/xml-dtd" extensions="dtd" viewable="true"/>
-    <mimetype type="application/xml-schema" extensions="xsd" viewable="true" syntax="xml" css="xml"/>
-    <mimetype type="application/xml-external-parsed-entity" extensions="ent" viewable="true"/>
-    <mimetype type="application/xhtml+xml" extensions="xhtml" viewable="true" syntax="xml"/>
-
-    <mimetype type="application/x-java-pack200" extensions="jar.pack.gz" archive="true" index="true" css="jar"/>
-    <mimetype type="application/x-java-archive-diff" extensions="jardiff" archive="false"/>
-    <mimetype type="application/zip" extensions="zip" archive="true" index="true" css="jar"/>
-    <mimetype type="application/x-tar" extensions="tar" archive="false" index="false"/>
-    <mimetype type="application/x-gzip" extensions="tgz, tar.gz, gz" archive="false" index="false"/>
-    <mimetype type="application/x-nupkg" extensions="nupkg" archive="true" index="true" css="nupkg"/>
-    <mimetype type="application/x-rar-compressed" extensions="rar" archive="false" css="jar"/>
-    <mimetype type="application/vnd.android.package-archive" extensions="apk" archive="true" index="true" css="apk"/>
-    <mimetype type="application/x-rpm" extensions="rpm" css="rpm"/>
-
-    <!-- not registered -->
-    <mimetype type="text/x-scala-source" extensions="scala" viewable="true" syntax="scala"/>
-    <mimetype type="text/x-ruby-source" extensions="rb" viewable="true" syntax="ruby"/>
-    <mimetype type="text/x-script.sh" extensions="sh" viewable="true" syntax="shell"/>
-    <mimetype type="text/x-csharp.sh" extensions="cs" viewable="true" syntax="csharp"/>
-
-    <!--
-        NOTE: The following mime types are required for a proper functioning of certain features in Artifactory 
-         DO NOT change them unless you really know what you are doing
-    -->
-    <mimetype type="application/xml" extensions="xml, xsl, xsi" viewable="true" syntax="xml" css="xml"/>
-    <mimetype type="application/x-maven-pom+xml" extensions="pom" viewable="true" syntax="xml" index="true" css="pom"/>
-    <mimetype type="application/x-ivy+xml" extensions="ivy" viewable="true" syntax="xml" index="true" css="xml"/>
-    <mimetype type="application/x-nuspec+xml" extensions="nuspec" viewable="true" syntax="xml" css="xml"/>
-    <mimetype type="application/x-java-jnlp-file" extensions="jnlp" viewable="true" syntax="xml" css="jnlp"/>
-    <mimetype type="application/x-checksum" extensions="sha1, md5" viewable="true" syntax="plain"/>
-    <mimetype type="application/java-archive" extensions="jar, war, ear, sar, har, hpi, jpi" archive="true" index="true"
-              css="jar"/>
-
-</mimetypes>
\ No newline at end of file
diff --git a/base/common/src/test/resources/converters/templates/home/3.0.4/artifactory.properties b/base/common/src/test/resources/converters/templates/home/3.0.4/artifactory.properties
deleted file mode 100644
index 8c9d508..0000000
--- a/base/common/src/test/resources/converters/templates/home/3.0.4/artifactory.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-artifactory.version=3.0.4
-artifactory.revision=30058
-artifactory.release=1382872758304
diff --git a/base/common/src/test/resources/converters/templates/home/3.0.4/logback.xml b/base/common/src/test/resources/converters/templates/home/3.0.4/logback.xml
deleted file mode 100644
index dd90c01..0000000
--- a/base/common/src/test/resources/converters/templates/home/3.0.4/logback.xml
+++ /dev/null
@@ -1,163 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<configuration debug="false">
-    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"/>
-    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
-            <layout class="org.artifactory.logging.layout.BackTracePatternLayout">
-                <pattern>%date ${artifactory.contextId}[%thread] [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
-            </layout>
-        </encoder>
-    </appender>
-    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/artifactory.log</File>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/artifactory.%i.log.zip</FileNamePattern>
-            <MinIndex>1</MinIndex>
-            <MaxIndex>9</MaxIndex>
-        </rollingPolicy>
-
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>25MB</MaxFileSize>
-        </triggeringPolicy>
-        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
-            <layout class="org.artifactory.logging.layout.BackTracePatternLayout">
-                <pattern>%date [%thread] [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
-            </layout>
-        </encoder>
-    </appender>
-    <appender name="ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/access.log</File>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/access.%i.log.zip</FileNamePattern>
-            <MinIndex>1</MinIndex>
-            <MaxIndex>9</MaxIndex>
-        </rollingPolicy>
-        <encoder>
-            <pattern>%d %m%n</pattern>
-        </encoder>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>25MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="IMPORT.EXPORT" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/import.export.log</File>
-        <encoder>
-            <pattern>%date [%-5level] \(%logger{32}:%line\) %message%n</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/import.export.%i.log.zip</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>25MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="TRAFFIC" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/traffic</File>
-        <encoder>
-            <pattern>%message%n</pattern>
-        </encoder>
-        <rollingPolicy class="org.artifactory.traffic.policy.TrafficTimeBasedRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/traffic.%d{yyyyMMdd}</FileNamePattern>
-        </rollingPolicy>
-    </appender>
-    <appender name="REQUEST" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/request.log</File>
-        <encoder>
-            <pattern>%message%n</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/request.%i.log</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>25MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="REQUEST_TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/request_trace.log</File>
-        <encoder>
-            <pattern>%date %message%n</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/request_trace.%i.log</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>25MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <root>
-        <level value="warn"/>
-        <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="FILE"/>
-    </root>
-    <logger name="org.artifactory">
-        <level value="info"/>
-    </logger>
-    <logger name="org.artifactory.security.AccessLogger" additivity="false">
-        <level value="info"/>
-        <appender-ref ref="ACCESS"/>
-    </logger>
-    <logger name="org.artifactory.api.common.ImportExportStatusHolder" additivity="false">
-        <level value="DEBUG"/>
-        <appender-ref ref="IMPORT.EXPORT"/>
-    </logger>
-    <logger name="org.artifactory.traffic.TrafficLogger" additivity="false">
-        <level value="info"/>
-        <appender-ref ref="TRAFFIC"/>
-    </logger>
-    <logger name="org.artifactory.traffic.RequestLogger" additivity="false">
-        <level value="info"/>
-        <appender-ref ref="REQUEST"/>
-    </logger>
-    <logger name="org.artifactory.request.RequestTraceLogger" additivity="false">
-        <level value="info"/>
-        <appender-ref ref="REQUEST_TRACE"/>
-    </logger>
-
-    <!-- third party loggers -->
-    <logger name="com.atlassian.crowd.integration.service.soap.client.ClientPropertiesImpl">
-        <level value="warn"/>
-    </logger>
-
-    <logger name="org.apache.wicket">
-        <level value="error"/>
-    </logger>
-    <logger name="org.eclipse.jetty">
-        <level value="info"/>
-    </logger>
-    <logger name="com.sun.jersey">
-        <level value="warn"/>
-    </logger>
-    <logger name="org.apache.commons.httpclient">
-        <level value="info"/>
-    </logger>
-    <logger name="httpclient.wire">
-        <level value="info"/>
-    </logger>
-    <logger name="org.springframework">
-        <level value="warn"/>
-    </logger>
-    <logger name="org.apache.cxf">
-        <level value="error"/>
-    </logger>
-</configuration>
\ No newline at end of file
diff --git a/base/common/src/test/resources/converters/templates/home/3.0.4/mimetypes.xml b/base/common/src/test/resources/converters/templates/home/3.0.4/mimetypes.xml
deleted file mode 100644
index 784ba0a..0000000
--- a/base/common/src/test/resources/converters/templates/home/3.0.4/mimetypes.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-<!--
-    This file configures Artifactory's known mime types. A list of registered
-    media types can be found in http://www.iana.org/assignments/media-types/ and common ones in
-    http://www.webmaster-toolkit.com/mime-types.shtml
-    Each mime type may have the following attributes:
-        type - The mime entry unique name (mandatory)
-        extensions - Comma separated list of file extensions mapped to this mime type (mandatory)
-        index - True if this mime type should be indexed for searching (valid only for supported archive files)
-        archive - True if this mime type is a browsable archive
-        viewable - True if this mime type can be viewed as text file
-        syntax - The UI highlighter syntax to for this mime type (only relevant if this is a viewable type)
-        css - The css class of a display icon for this mime type
--->
-<mimetypes version="4">
-
-<mimetype type="text/plain" extensions="txt, properties, mf, asc" viewable="true" syntax="plain"/>
-    <mimetype type="text/html" extensions="htm, html" viewable="true" syntax="xml"/>
-    <mimetype type="text/css" extensions="css" viewable="true" syntax="css"/>
-    <mimetype type="text/xsl" extensions="xsl" viewable="true" syntax="xml"/>
-    <mimetype type="text/xslt" extensions="xslt" viewable="true" syntax="xml"/>
-    <mimetype type="text/x-java-source" extensions="java" viewable="true" syntax="java"/>
-    <mimetype type="text/x-javafx-source" extensions="fx" viewable="true" syntax="javafx"/>
-    <mimetype type="text/x-groovy-source" extensions="groovy, gradle" viewable="true" syntax="groovy"/>
-    <mimetype type="text/x-c" extensions="h, c, cc, cpp" viewable="true" syntax="cpp"/>
-
-    <mimetype type="application/xml-dtd" extensions="dtd" viewable="true"/>
-    <mimetype type="application/xml-schema" extensions="xsd" viewable="true" syntax="xml" css="xml"/>
-    <mimetype type="application/xml-external-parsed-entity" extensions="ent" viewable="true"/>
-    <mimetype type="application/xhtml+xml" extensions="xhtml" viewable="true" syntax="xml"/>
-
-    <mimetype type="application/x-java-pack200" extensions="jar.pack.gz" archive="true" index="true" css="jar"/>
-    <mimetype type="application/x-java-archive-diff" extensions="jardiff" archive="false"/>
-    <mimetype type="application/zip" extensions="zip" archive="true" index="true" css="jar"/>
-    <mimetype type="application/x-tar" extensions="tar" archive="false" index="false"/>
-    <mimetype type="application/x-gzip" extensions="tgz, tar.gz, gz" archive="false" index="false"/>
-    <mimetype type="application/x-nupkg" extensions="nupkg" archive="true" index="true" css="nupkg"/>
-    <mimetype type="application/x-rar-compressed" extensions="rar" archive="false" css="jar"/>
-    <mimetype type="application/vnd.android.package-archive" extensions="apk" archive="true" index="true" css="apk"/>
-    <mimetype type="application/x-rpm" extensions="rpm" css="rpm"/>
-    <mimetype type="application/x-rubygems" extensions="gem" css="gem"/>
-    <mimetype type="application/x-ruby-marshal" extensions="rz" css="ruby-marshal"/>
-
-    <!-- not registered -->
-    <mimetype type="text/x-scala-source" extensions="scala" viewable="true" syntax="scala"/>
-    <mimetype type="text/x-ruby-source" extensions="rb" viewable="true" syntax="ruby"/>
-    <mimetype type="text/x-script.sh" extensions="sh" viewable="true" syntax="shell"/>
-    <mimetype type="text/x-csharp.sh" extensions="cs" viewable="true" syntax="csharp"/>
-
-    <!--
-        NOTE: The following mime types are required for a proper functioning of certain features in Artifactory 
-         DO NOT change them unless you really know what you are doing
-    -->
-    <mimetype type="application/xml" extensions="xml, xsl, xsi" viewable="true" syntax="xml" css="xml"/>
-    <mimetype type="application/x-maven-pom+xml" extensions="pom" viewable="true" syntax="xml" index="true" css="pom"/>
-    <mimetype type="application/x-ivy+xml" extensions="ivy" viewable="true" syntax="xml" index="true" css="xml"/>
-    <mimetype type="application/x-nuspec+xml" extensions="nuspec" viewable="true" syntax="xml" css="xml"/>
-    <mimetype type="application/x-java-jnlp-file" extensions="jnlp" viewable="true" syntax="xml" css="jnlp"/>
-    <mimetype type="application/x-checksum" extensions="sha1, md5" viewable="true" syntax="plain"/>
-    <mimetype type="application/java-archive" extensions="jar, war, ear, sar, har, hpi, jpi" archive="true" index="true"
-              css="jar"/>
-
-</mimetypes>
\ No newline at end of file
diff --git a/base/common/src/test/resources/converters/templates/home/3.1.0/artifactory.properties b/base/common/src/test/resources/converters/templates/home/3.1.0/artifactory.properties
deleted file mode 100644
index 1712a2c..0000000
--- a/base/common/src/test/resources/converters/templates/home/3.1.0/artifactory.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-artifactory.version=3.1.0
-artifactory.revision=2147483647
-artifactory.release=1382872758304
diff --git a/base/common/src/test/resources/converters/templates/home/3.1.0/logback.xml b/base/common/src/test/resources/converters/templates/home/3.1.0/logback.xml
deleted file mode 100644
index dd90c01..0000000
--- a/base/common/src/test/resources/converters/templates/home/3.1.0/logback.xml
+++ /dev/null
@@ -1,163 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<configuration debug="false">
-    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"/>
-    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
-            <layout class="org.artifactory.logging.layout.BackTracePatternLayout">
-                <pattern>%date ${artifactory.contextId}[%thread] [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
-            </layout>
-        </encoder>
-    </appender>
-    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/artifactory.log</File>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/artifactory.%i.log.zip</FileNamePattern>
-            <MinIndex>1</MinIndex>
-            <MaxIndex>9</MaxIndex>
-        </rollingPolicy>
-
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>25MB</MaxFileSize>
-        </triggeringPolicy>
-        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
-            <layout class="org.artifactory.logging.layout.BackTracePatternLayout">
-                <pattern>%date [%thread] [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
-            </layout>
-        </encoder>
-    </appender>
-    <appender name="ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/access.log</File>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/access.%i.log.zip</FileNamePattern>
-            <MinIndex>1</MinIndex>
-            <MaxIndex>9</MaxIndex>
-        </rollingPolicy>
-        <encoder>
-            <pattern>%d %m%n</pattern>
-        </encoder>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>25MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="IMPORT.EXPORT" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/import.export.log</File>
-        <encoder>
-            <pattern>%date [%-5level] \(%logger{32}:%line\) %message%n</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/import.export.%i.log.zip</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>25MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="TRAFFIC" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/traffic</File>
-        <encoder>
-            <pattern>%message%n</pattern>
-        </encoder>
-        <rollingPolicy class="org.artifactory.traffic.policy.TrafficTimeBasedRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/traffic.%d{yyyyMMdd}</FileNamePattern>
-        </rollingPolicy>
-    </appender>
-    <appender name="REQUEST" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/request.log</File>
-        <encoder>
-            <pattern>%message%n</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/request.%i.log</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>25MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="REQUEST_TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/request_trace.log</File>
-        <encoder>
-            <pattern>%date %message%n</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/request_trace.%i.log</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>25MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <root>
-        <level value="warn"/>
-        <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="FILE"/>
-    </root>
-    <logger name="org.artifactory">
-        <level value="info"/>
-    </logger>
-    <logger name="org.artifactory.security.AccessLogger" additivity="false">
-        <level value="info"/>
-        <appender-ref ref="ACCESS"/>
-    </logger>
-    <logger name="org.artifactory.api.common.ImportExportStatusHolder" additivity="false">
-        <level value="DEBUG"/>
-        <appender-ref ref="IMPORT.EXPORT"/>
-    </logger>
-    <logger name="org.artifactory.traffic.TrafficLogger" additivity="false">
-        <level value="info"/>
-        <appender-ref ref="TRAFFIC"/>
-    </logger>
-    <logger name="org.artifactory.traffic.RequestLogger" additivity="false">
-        <level value="info"/>
-        <appender-ref ref="REQUEST"/>
-    </logger>
-    <logger name="org.artifactory.request.RequestTraceLogger" additivity="false">
-        <level value="info"/>
-        <appender-ref ref="REQUEST_TRACE"/>
-    </logger>
-
-    <!-- third party loggers -->
-    <logger name="com.atlassian.crowd.integration.service.soap.client.ClientPropertiesImpl">
-        <level value="warn"/>
-    </logger>
-
-    <logger name="org.apache.wicket">
-        <level value="error"/>
-    </logger>
-    <logger name="org.eclipse.jetty">
-        <level value="info"/>
-    </logger>
-    <logger name="com.sun.jersey">
-        <level value="warn"/>
-    </logger>
-    <logger name="org.apache.commons.httpclient">
-        <level value="info"/>
-    </logger>
-    <logger name="httpclient.wire">
-        <level value="info"/>
-    </logger>
-    <logger name="org.springframework">
-        <level value="warn"/>
-    </logger>
-    <logger name="org.apache.cxf">
-        <level value="error"/>
-    </logger>
-</configuration>
\ No newline at end of file
diff --git a/base/common/src/test/resources/converters/templates/home/3.1.0/mimetypes.xml b/base/common/src/test/resources/converters/templates/home/3.1.0/mimetypes.xml
deleted file mode 100644
index bdf7f10..0000000
--- a/base/common/src/test/resources/converters/templates/home/3.1.0/mimetypes.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-<!--
-    This file configures Artifactory's known mime types. A list of registered
-    media types can be found in http://www.iana.org/assignments/media-types/ and common ones in
-    http://www.webmaster-toolkit.com/mime-types.shtml
-    Each mime type may have the following attributes:
-        type - The mime entry unique name (mandatory)
-        extensions - Comma separated list of file extensions mapped to this mime type (mandatory)
-        index - True if this mime type should be indexed for searching (valid only for supported archive files)
-        archive - True if this mime type is a browsable archive
-        viewable - True if this mime type can be viewed as text file
-        syntax - The UI highlighter syntax to for this mime type (only relevant if this is a viewable type)
-        css - The css class of a display icon for this mime type
--->
-<mimetypes version="5">
-
-    <mimetype type="text/plain" extensions="txt, properties, mf, asc" viewable="true" syntax="plain"/>
-    <mimetype type="text/html" extensions="htm, html" viewable="true" syntax="xml"/>
-    <mimetype type="text/css" extensions="css" viewable="true" syntax="css"/>
-    <mimetype type="text/xsl" extensions="xsl" viewable="true" syntax="xml"/>
-    <mimetype type="text/xslt" extensions="xslt" viewable="true" syntax="xml"/>
-    <mimetype type="text/x-java-source" extensions="java" viewable="true" syntax="java"/>
-    <mimetype type="text/x-javafx-source" extensions="fx" viewable="true" syntax="javafx"/>
-    <mimetype type="text/x-groovy-source" extensions="groovy, gradle" viewable="true" syntax="groovy"/>
-    <mimetype type="text/x-c" extensions="h, c, cc, cpp" viewable="true" syntax="cpp"/>
-
-    <mimetype type="application/xml-dtd" extensions="dtd" viewable="true"/>
-    <mimetype type="application/xml-schema" extensions="xsd" viewable="true" syntax="xml" css="xml"/>
-    <mimetype type="application/xml-external-parsed-entity" extensions="ent" viewable="true"/>
-    <mimetype type="application/xhtml+xml" extensions="xhtml" viewable="true" syntax="xml"/>
-
-    <mimetype type="application/x-java-pack200" extensions="jar.pack.gz" archive="true" index="true" css="jar"/>
-    <mimetype type="application/x-java-archive-diff" extensions="jardiff" archive="false"/>
-    <mimetype type="application/zip" extensions="zip" archive="true" index="true" css="jar"/>
-    <mimetype type="application/x-tar" extensions="tar" archive="false" index="false"/>
-    <mimetype type="application/x-gzip" extensions="tgz, tar.gz, gz" archive="false" index="false"/>
-    <mimetype type="application/x-nupkg" extensions="nupkg" archive="true" index="true" css="nupkg"/>
-    <mimetype type="application/x-rar-compressed" extensions="rar" archive="false" css="jar"/>
-    <mimetype type="application/vnd.android.package-archive" extensions="apk" archive="true" index="true" css="apk"/>
-    <mimetype type="application/x-rpm" extensions="rpm" css="rpm"/>
-    <mimetype type="application/x-rubygems" extensions="gem" css="gem"/>
-    <mimetype type="application/x-ruby-marshal" extensions="rz" css="ruby-marshal"/>
-
-    <!-- not registered -->
-    <mimetype type="text/x-scala-source" extensions="scala" viewable="true" syntax="scala"/>
-    <mimetype type="text/x-ruby-source" extensions="rb" viewable="true" syntax="ruby"/>
-    <mimetype type="text/x-script.sh" extensions="sh" viewable="true" syntax="shell"/>
-    <mimetype type="text/x-csharp.sh" extensions="cs" viewable="true" syntax="csharp"/>
-
-    <!--
-        NOTE: The following mime types are required for a proper functioning of certain features in Artifactory 
-         DO NOT change them unless you really know what you are doing
-    -->
-    <mimetype type="application/xml" extensions="xml, xsl, xsi" viewable="true" syntax="xml" css="xml"/>
-    <mimetype type="application/x-maven-pom+xml" extensions="pom" viewable="true" syntax="xml" index="true" css="pom"/>
-    <mimetype type="application/x-ivy+xml" extensions="ivy" viewable="true" syntax="xml" index="true" css="xml"/>
-    <mimetype type="application/x-nuspec+xml" extensions="nuspec" viewable="true" syntax="xml" css="xml"/>
-    <mimetype type="application/x-java-jnlp-file" extensions="jnlp" viewable="true" syntax="xml" css="jnlp"/>
-    <mimetype type="application/x-checksum" extensions="sha1, md5" viewable="true" syntax="plain"/>
-    <mimetype type="application/java-archive" extensions="jar, war, ear, sar, har, hpi, jpi" archive="true" index="true"
-              css="jar"/>
-
-</mimetypes>
\ No newline at end of file
diff --git a/base/common/src/test/resources/gziptest.tar.gz b/base/common/src/test/resources/gziptest.tar.gz
deleted file mode 100644
index 59ca3e3..0000000
Binary files a/base/common/src/test/resources/gziptest.tar.gz and /dev/null differ
diff --git a/base/common/src/test/resources/org/artifactory/maven/maven-metadata.xml b/base/common/src/test/resources/org/artifactory/maven/maven-metadata.xml
deleted file mode 100644
index da89955..0000000
--- a/base/common/src/test/resources/org/artifactory/maven/maven-metadata.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<metadata>
-    <groupId>commons-collections</groupId>
-    <artifactId>commons-collections</artifactId>
-    <version>3.2.1</version>
-    <versioning>
-        <release>3.2.1</release>
-        <versions>
-            <version>1.0</version>
-            <version>2.0</version>
-            <version>2.1</version>
-            <version>2.1.1</version>
-            <version>3.0</version>
-            <version>3.1</version>
-            <version>3.2</version>
-            <version>3.2.1</version>
-        </versions>
-        <lastUpdated>20080415014800</lastUpdated>
-    </versioning>
-</metadata>
\ No newline at end of file
diff --git a/base/common/src/test/resources/org/artifactory/maven/maven-null-plugin.pom b/base/common/src/test/resources/org/artifactory/maven/maven-null-plugin.pom
deleted file mode 100644
index c32e2ca..0000000
--- a/base/common/src/test/resources/org/artifactory/maven/maven-null-plugin.pom
+++ /dev/null
@@ -1,8 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>maven</groupId>
-    <artifactId>maven-null-plugin</artifactId>
-    <version>1.4</version>
-    <packaging>maven-plugin</packaging>
-</project>
diff --git a/base/common/src/test/resources/org/artifactory/maven/maven3-metadata.xml b/base/common/src/test/resources/org/artifactory/maven/maven3-metadata.xml
deleted file mode 100644
index 805c518..0000000
--- a/base/common/src/test/resources/org/artifactory/maven/maven3-metadata.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<metadata modelVersion="1.1.0">
-    <groupId>version.artifactory</groupId>
-    <artifactId>deployer</artifactId>
-    <version>1.0-SNAPSHOT</version>
-    <versioning>
-        <snapshot>
-            <timestamp>20100915.095619</timestamp>
-            <buildNumber>3</buildNumber>
-        </snapshot>
-        <lastUpdated>20100915095619</lastUpdated>
-        <snapshotVersions>
-            <snapshotVersion>
-                <value>1.0-20100915.095619-3</value>
-                <updated>20100915095619</updated>
-            </snapshotVersion>
-            <snapshotVersion>
-                <classifier>sources</classifier>
-                <value>1.0-20100915.095432-2</value>
-                <updated>20100915095432</updated>
-            </snapshotVersion>
-            <snapshotVersion>
-                <classifier>tests</classifier>
-                <value>1.0-20100915.095619-3</value>
-                <updated>20100915095619</updated>
-            </snapshotVersion>
-            <snapshotVersion>
-                <classifier>jar-with-dependencies</classifier>
-                <value>1.0-20100915.095619-3</value>
-                <updated>20100915095619</updated>
-            </snapshotVersion>
-        </snapshotVersions>
-    </versioning>
-    <style/>
-</metadata>
\ No newline at end of file
diff --git a/base/common/src/test/resources/org/artifactory/maven/testng-5.11-jdk15.jar b/base/common/src/test/resources/org/artifactory/maven/testng-5.11-jdk15.jar
deleted file mode 100644
index f814c7a..0000000
--- a/base/common/src/test/resources/org/artifactory/maven/testng-5.11-jdk15.jar
+++ /dev/null
@@ -1,8 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>yourpit</groupId>
-    <artifactId>yourpit</artifactId>
-    <version>1.0.0-alpha2</version>
-    <packaging>jar</packaging>
-</project>
diff --git a/base/common/src/test/resources/org/artifactory/maven/yourpit-1.0.0-alpha2.pom b/base/common/src/test/resources/org/artifactory/maven/yourpit-1.0.0-alpha2.pom
deleted file mode 100644
index 903cd77..0000000
--- a/base/common/src/test/resources/org/artifactory/maven/yourpit-1.0.0-alpha2.pom
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>org.yourpit</groupId>
-    <artifactId>yourpit</artifactId>
-    <version>1.0.0-alpha2</version>
-    <packaging>jar</packaging>
-</project>
diff --git a/base/common/src/test/resources/tartest.tar b/base/common/src/test/resources/tartest.tar
deleted file mode 100644
index 785ad30..0000000
Binary files a/base/common/src/test/resources/tartest.tar and /dev/null differ
diff --git a/base/common/src/test/resources/tgztest.tgz b/base/common/src/test/resources/tgztest.tgz
deleted file mode 100644
index 655c2f4..0000000
Binary files a/base/common/src/test/resources/tgztest.tgz and /dev/null differ
diff --git a/base/common/src/test/resources/unsupported.ar b/base/common/src/test/resources/unsupported.ar
deleted file mode 100644
index e69de29..0000000
diff --git a/base/common/src/test/resources/zip-with-symlinks.tar.gz b/base/common/src/test/resources/zip-with-symlinks.tar.gz
deleted file mode 100644
index 88c9a5a..0000000
Binary files a/base/common/src/test/resources/zip-with-symlinks.tar.gz and /dev/null differ
diff --git a/base/common/src/test/resources/ziptest.zip b/base/common/src/test/resources/ziptest.zip
deleted file mode 100644
index eb7234a..0000000
Binary files a/base/common/src/test/resources/ziptest.zip and /dev/null differ
diff --git a/base/config/pom.xml b/base/config/pom.xml
deleted file mode 100644
index ccb1c24..0000000
--- a/base/config/pom.xml
+++ /dev/null
@@ -1,117 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0          http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>artifactory-config</artifactId>
-    <packaging>jar</packaging>
-    <name>Artifactory Configuration</name>
-
-    <parent>
-        <artifactId>artifactory-base-parent</artifactId>
-        <groupId>org.artifactory</groupId>
-        <version>4.8.0</version>
-    </parent>
-
-    <properties>
-        <project.version.prop>${project.version}</project.version.prop>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-log</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-capi</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>net.java.dev.stax-utils</groupId>
-            <artifactId>stax-utils</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-io</groupId>
-            <artifactId>commons-io</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.google.guava</groupId>
-            <artifactId>guava</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.jdom</groupId>
-            <artifactId>jdom2</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.codehaus.jackson</groupId>
-            <artifactId>jackson-jaxrs</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>commons-lang</groupId>
-            <artifactId>commons-lang</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-collections</groupId>
-            <artifactId>commons-collections</artifactId>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <!-- the only usage of the buildnumber plugin is to generate timestamp variable which we use in
-                artifactory.properties filtering -->
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>buildnumber-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>validate</phase>
-                        <goals>
-                            <goal>create</goal>
-                        </goals>
-                    </execution>
-                </executions>
-                <configuration>
-                    <doCheck>false</doCheck>
-                    <doUpdate>false</doUpdate>
-                    <format>{0,time,long}</format>
-                    <items>
-                        <item>timestamp</item>
-                    </items>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jar-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>test-jar</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/base/config/src/main/filtered-resources/META-INF/artifactory.properties b/base/config/src/main/filtered-resources/META-INF/artifactory.properties
deleted file mode 100644
index 1f3e219..0000000
--- a/base/config/src/main/filtered-resources/META-INF/artifactory.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-artifactory.version=${project.version.prop}
-artifactory.revision=${buildNumber.prop}
-artifactory.timestamp=${timestamp}
diff --git a/base/config/src/main/java/org/artifactory/addon/AddonInfo.java b/base/config/src/main/java/org/artifactory/addon/AddonInfo.java
deleted file mode 100644
index db488e0..0000000
--- a/base/config/src/main/java/org/artifactory/addon/AddonInfo.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon;
-
-import java.io.Serializable;
-import java.util.Properties;
-
-/**
- * Contains the information of an installed addon
- *
- * @author Noam Y. Tenne
- */
-public class AddonInfo implements Comparable<AddonInfo>, Serializable {
-
-    private String addonName;
-    private String addonDisplayName;
-    private String addonPath;
-    private AddonState addonState = AddonState.INACTIVATED;
-    private Properties addonProperties;
-    private long displayOrdinal;
-
-    /**
-     * Main constructor
-     *
-     * @param addonName        Name of addon
-     * @param addonDisplayName Display ame of addon
-     * @param addonPath        Path of addon xml file
-     * @param addonState       State of addon
-     * @param addonProperties  Addon properties
-     * @param displayOrdinal   The display-order weight of the addon
-     */
-    public AddonInfo(String addonName, String addonDisplayName, String addonPath, AddonState addonState,
-            Properties addonProperties, long displayOrdinal) {
-        this.addonName = addonName;
-        this.addonDisplayName = addonDisplayName;
-        this.addonPath = addonPath;
-        this.addonState = addonState;
-        this.displayOrdinal = displayOrdinal;
-        this.addonProperties = addonProperties != null ? addonProperties : new Properties();
-    }
-
-    /**
-     * Returns the name of the addon
-     *
-     * @return Addon name
-     */
-    public String getAddonName() {
-        return addonName;
-    }
-
-    /**
-     * Returns the displayable name of the addon
-     *
-     * @return Addon display name
-     */
-    public String getAddonDisplayName() {
-        return addonDisplayName;
-    }
-
-    /**
-     * Returns the path of the addon
-     *
-     * @return Addon path
-     */
-    public String getAddonPath() {
-        return addonPath;
-    }
-
-    /**
-     * Returns the state of the addon
-     *
-     * @return Addon state
-     */
-    public AddonState getAddonState() {
-        if (addonState == null) {   // sanity
-            addonState = AddonState.INACTIVATED;
-        }
-        return addonState;
-    }
-
-    /**
-     * Sets the state of the addon
-     *
-     * @param addonState State to assign to addon
-     */
-    public void setAddonState(AddonState addonState) {
-        this.addonState = addonState;
-    }
-
-    /**
-     * Returns the addon's properties object
-     *
-     * @return Addon properties
-     */
-    public Properties getAddonProperties() {
-        return addonProperties;
-    }
-
-    /**
-     * Returns the addon property that corresponds to the given key
-     *
-     * @param propertyKey Key of property to retrieve
-     * @return Property value if key was found. Null if not
-     */
-    public String getAddonProperty(String propertyKey) {
-        return addonProperties.getProperty(propertyKey);
-    }
-
-    /**
-     * Returns the addon's display-order weight
-     *
-     * @return Weight
-     */
-    public long getDisplayOrdinal() {
-        return displayOrdinal;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof AddonInfo)) {
-            return false;
-        }
-
-        AddonInfo addonInfo = (AddonInfo) o;
-
-        if (displayOrdinal != addonInfo.displayOrdinal) {
-            return false;
-        }
-        if (addonName != null ? !addonName.equals(addonInfo.addonName) : addonInfo.addonName != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = addonName != null ? addonName.hashCode() : 0;
-        result = 31 * result + (int) (displayOrdinal ^ (displayOrdinal >>> 32));
-        return result;
-    }
-
-    @Override
-    public int compareTo(AddonInfo o) {
-        if (getDisplayOrdinal() < o.getDisplayOrdinal()) {
-            return -1;
-        } else if (getDisplayOrdinal() > o.getDisplayOrdinal()) {
-            return 1;
-        }
-        return 0;
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/addon/AddonState.java b/base/config/src/main/java/org/artifactory/addon/AddonState.java
deleted file mode 100644
index 1d6ce02..0000000
--- a/base/config/src/main/java/org/artifactory/addon/AddonState.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon;
-
-/**
- * The states that an installed addon can be in
- *
- * @author Noam Y. Tenne
- */
-public enum AddonState {
-    ACTIVATED("Activated"),
-    DISABLED("Disabled"),
-    INACTIVATED("Inactivated"),
-    NOT_CONFIGURED("Not Configured"),
-    NOT_LICENSED("Not Licensed");
-
-    private String name;
-
-    /**
-     * Main constructor
-     *
-     * @param name State name
-     */
-    AddonState(String name) {
-        this.name = name;
-    }
-
-    /**
-     * Returns the name of the state
-     *
-     * @return State name
-     */
-    public String getName() {
-        return name;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/common/ArtifactoryHome.java b/base/config/src/main/java/org/artifactory/common/ArtifactoryHome.java
deleted file mode 100644
index d85fc2b..0000000
--- a/base/config/src/main/java/org/artifactory/common/ArtifactoryHome.java
+++ /dev/null
@@ -1,559 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.common;
-
-import com.google.common.base.Charsets;
-import com.google.common.io.Files;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.common.ha.ClusterProperties;
-import org.artifactory.common.ha.HaNodeProperties;
-import org.artifactory.common.property.ArtifactorySystemProperties;
-import org.artifactory.mime.MimeTypes;
-import org.artifactory.mime.MimeTypesReader;
-import org.artifactory.version.ArtifactoryVersionReader;
-import org.artifactory.version.CompoundVersionDetails;
-
-import javax.annotation.Nullable;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-/**
- * @author yoavl
- */
-public class ArtifactoryHome {
-    public static final String SYS_PROP = "artifactory.home";
-    public static final String SERVLET_CTX_ATTR = "artifactory.home.obj";
-    public static final String STORAGE_PROPS_FILE_NAME = "storage.properties";
-    public static final String MISSION_CONTROL_FILE_NAME = "mission.control.properties";
-    public static final String ARTIFACTORY_CONVERTER_OBJ = "artifactory.converter.manager.obj";
-    public static final String ARTIFACTORY_VERSION_PROVIDER_OBJ = "artifactory.version.provider.obj";
-    public static final String ARTIFACTORY_CONFIG_FILE = "artifactory.config.xml";
-    public static final String ARTIFACTORY_CONFIG_BOOTSTRAP_FILE = "artifactory.config.bootstrap.xml";
-    public static final String ARTIFACTORY_SYSTEM_PROPERTIES_FILE = "artifactory.system.properties";
-    public static final String ARTIFACTORY_PROPERTIES_FILE = "artifactory.properties";
-    public static final String LOGBACK_CONFIG_FILE_NAME = "logback.xml";
-    public static final String MIME_TYPES_FILE_NAME = "mimetypes.xml";
-    public static final String ARTIFACTORY_HA_NODE_PROPERTIES_FILE = "ha-node.properties";
-    public static final String CLUSTER_PROPS_FILE = "cluster.properties";
-    private static final String ENV_VAR = "ARTIFACTORY_HOME";
-    private static final String ARTIFACTORY_CONFIG_LATEST_FILE = "artifactory.config.latest.xml";
-    private static final String ARTIFACTORY_CONFIG_IMPORT_FILE = "artifactory.config.import.xml";
-    private static final InheritableThreadLocal<ArtifactoryHome> current = new InheritableThreadLocal<>();
-    private final File homeDir;
-    private MimeTypes mimeTypes;
-    private ArtifactorySystemProperties artifactorySystemProperties;
-    private HaNodeProperties HaNodeProperties;
-    private ClusterProperties clusterProperties;
-    private File etcDir;
-    private File dataDir;
-    private File logDir;
-    private File backupDir;
-    private File tempWorkDir;
-    private File supportDir;
-    private File tempUploadDir;
-    private File pluginsDir;
-    private File logoDir;
-
-    private File haEtcDir;
-    private File haDataDir;
-    private File haBackupDir;
-
-    /**
-     * protected constructor for testing usage only.
-     */
-    protected ArtifactoryHome() {
-        homeDir = null;
-    }
-
-    public ArtifactoryHome(SimpleLog logger) {
-        String homeDirPath = findArtifactoryHome(logger);
-        homeDir = new File(homeDirPath);
-        create();
-    }
-
-    public ArtifactoryHome(File homeDir) {
-        if (homeDir == null) {
-            throw new IllegalArgumentException("Home dir path cannot be null");
-        }
-        this.homeDir = homeDir;
-        create();
-    }
-
-    private static void checkWritableDirectory(File dir) {
-        if (!dir.exists() || !dir.isDirectory() || !dir.canWrite()) {
-            String message = "Directory '" + dir.getAbsolutePath() + "' is not writable!";
-            System.out.println(ArtifactoryHome.class.getName() + " - Warning: " + message);
-            throw new IllegalArgumentException(message);
-        }
-    }
-
-    public static boolean isBound() {
-        return current.get() != null;
-    }
-
-    public static ArtifactoryHome get() {
-        ArtifactoryHome home = current.get();
-        if (home == null) {
-            throw new IllegalStateException("Artifactory home is not bound to the current thread.");
-        }
-        return home;
-    }
-
-    public static void bind(ArtifactoryHome props) {
-        current.set(props);
-    }
-
-    public static void unbind() {
-        current.remove();
-    }
-
-    public File getHomeDir() {
-        return homeDir;
-    }
-
-    public File getDataDir() {
-        return dataDir;
-    }
-
-    public File getEtcDir() {
-        return etcDir;
-    }
-
-    public File getHaAwareEtcDir() {
-        return haEtcDir != null ? haEtcDir : etcDir;
-    }
-
-    public File getHaAwareDataDir() {
-        return haDataDir != null ? haDataDir : dataDir;
-    }
-
-    public File getHaAwareBackupDir() {
-        return haBackupDir != null ? haBackupDir : backupDir;
-    }
-
-    public File getLogDir() {
-        return logDir;
-    }
-
-    public File getBackupDir() {
-        return backupDir;
-    }
-
-    public File getTempWorkDir() {
-        return tempWorkDir;
-    }
-
-    /**
-     * @return temp directory for support content
-     */
-    public File getSupportDir() {
-        return supportDir;
-    }
-
-    public File getTempUploadDir() {
-        return tempUploadDir;
-    }
-
-    public File getPluginsDir() {
-        return pluginsDir;
-    }
-
-    public File getLogoDir() {
-        return logoDir;
-    }
-
-    public File getOrCreateSubDir(String subDirName) throws IOException {
-        return getOrCreateSubDir(getHomeDir(), subDirName);
-    }
-
-    /**
-     * @return {@code true} if {@link #ARTIFACTORY_HA_NODE_PROPERTIES_FILE} and {@link #CLUSTER_PROPS_FILE} exists
-     */
-    public boolean isHaConfigured() {
-        return HaNodeProperties != null && clusterProperties != null;
-    }
-
-    /**
-     * @return the {@link HaNodeProperties} object that represents the
-     * {@link #ARTIFACTORY_HA_NODE_PROPERTIES_FILE} contents, or null if HA was not configured properly
-     */
-    @Nullable
-    public HaNodeProperties getHaNodeProperties() {
-        return HaNodeProperties;
-    }
-
-    @Nullable
-    public ClusterProperties getClusterProperties() {
-        return clusterProperties;
-    }
-
-    private File getOrCreateSubDir(File parent, String subDirName) throws IOException {
-        File subDir = new File(parent, subDirName);
-        FileUtils.forceMkdir(subDir);
-        return subDir;
-    }
-
-    private void create() {
-        try {
-            // Create or find all the needed sub folders
-            etcDir = getOrCreateSubDir("etc");
-            dataDir = getOrCreateSubDir("data");
-            logDir = getOrCreateSubDir("logs");
-            backupDir = getOrCreateSubDir("backup");
-            supportDir = getOrCreateSubDir("support");
-
-            File tempRootDir = getOrCreateSubDir(dataDir, "tmp");
-            tempWorkDir = getOrCreateSubDir(tempRootDir, "work");
-            tempUploadDir = getOrCreateSubDir(tempRootDir, "artifactory-uploads");
-
-            //Manage the artifactory.system.properties file under etc dir
-            initAndLoadSystemPropertyFile();
-
-            //Check the write access to all directories that need it
-            checkWritableDirectory(dataDir);
-            checkWritableDirectory(logDir);
-            checkWritableDirectory(backupDir);
-            checkWritableDirectory(supportDir);
-            checkWritableDirectory(tempRootDir);
-            checkWritableDirectory(tempWorkDir);
-            checkWritableDirectory(tempUploadDir);
-
-            //If ha props exist, load the storage from cluster_home/ha-etc
-            File haPropertiesFile = getArtifactoryHaPropertiesFile();
-            if (haPropertiesFile.exists()) {
-                //load ha properties
-                HaNodeProperties = new HaNodeProperties();
-                HaNodeProperties.load(haPropertiesFile);
-
-                File haArtifactoryHome = HaNodeProperties.getClusterHome();
-                if (!haArtifactoryHome.exists()) {
-                    throw new RuntimeException(
-                            "Artifactory HA home does not exist: " + haArtifactoryHome.getAbsolutePath());
-                }
-
-                //create directory structure
-                haEtcDir = getOrCreateSubDir(haArtifactoryHome, "ha-etc");
-                haDataDir = getOrCreateSubDir(haArtifactoryHome, "ha-data");
-                haBackupDir = getOrCreateSubDir(haArtifactoryHome, "ha-backup");
-
-                checkWritableDirectory(haEtcDir);
-                checkWritableDirectory(haDataDir);
-                checkWritableDirectory(haBackupDir);
-
-                //load cluster properties
-                File clusterPropertiesFile = getArtifactoryClusterPropertiesFile();
-                clusterProperties = new ClusterProperties();
-                clusterProperties.load(clusterPropertiesFile);
-            }
-
-            pluginsDir = getOrCreateSubDir(getHaAwareEtcDir(), "plugins");
-            logoDir = getOrCreateSubDir(getHaAwareEtcDir(), "ui");
-
-            checkWritableDirectory(pluginsDir);
-
-            try {
-                //noinspection ConstantConditions
-                for (File rootTmpDirChild : tempRootDir.listFiles()) {
-                    if (rootTmpDirChild.isDirectory()) {
-                        FileUtils.cleanDirectory(rootTmpDirChild);
-                    } else {
-                        FileUtils.deleteQuietly(rootTmpDirChild);
-                    }
-                }
-            } catch (Exception e) {
-                System.out.println(ArtifactoryHome.class.getName() +
-                        " - Warning: unable to clean temporary directories. Cause: " + e.getMessage());
-            }
-
-        } catch (Exception e) {
-            throw new IllegalArgumentException(
-                    "Could not initialize artifactory home directory due to: " + e.getMessage(), e);
-        }
-    }
-
-    private String findArtifactoryHome(SimpleLog logger) {
-        String home = System.getProperty(SYS_PROP);
-        String artHomeSource = "System property";
-        if (home == null) {
-            //Try the environment var
-            home = System.getenv(ENV_VAR);
-            artHomeSource = "Environment variable";
-            if (home == null) {
-                home = new File(System.getProperty("user.home", "."), ".artifactory").getAbsolutePath();
-                artHomeSource = "Default (user home)";
-            }
-        }
-        home = home.replace('\\', '/');
-        logger.log("Using artifactory.home at '" + home + "' resolved from: " + artHomeSource);
-        return home;
-    }
-
-    /**
-     * Checks the existence of the logback configuration file under the etc directory. If the file doesn't exist this
-     * method will extract a default one from the war.
-     */
-    public File getLogbackConfig() {
-        File etcDir = new File(getHomeDir(), "etc");
-        File logbackFile = new File(etcDir, LOGBACK_CONFIG_FILE_NAME);
-        if (!logbackFile.exists()) {
-            try {
-                //Copy from default
-                URL configUrl = ArtifactoryHome.class.getResource("/META-INF/default/" + LOGBACK_CONFIG_FILE_NAME);
-                FileUtils.copyURLToFile(configUrl, logbackFile);
-            } catch (IOException e) {
-                // we don't have the logger configuration - use System.err
-                System.err.printf("Could not create default %s into %s\n", LOGBACK_CONFIG_FILE_NAME, logbackFile);
-                e.printStackTrace();
-            }
-        }
-        return logbackFile;
-    }
-
-    /**
-     * Returns the content of the artifactory.config.import.xml file
-     *
-     * @return Content of artifactory.config.import.xml if exists, null if not
-     */
-    public String getImportConfigXml() {
-        File importConfigFile = getArtifactoryConfigImportFile();
-        if (importConfigFile.exists()) {
-            try {
-                String configContent = FileUtils.readFileToString(importConfigFile, "utf-8");
-                if (StringUtils.isNotBlank(configContent)) {
-                    File bootstrapConfigFile = getArtifactoryConfigBootstrapFile();
-                    org.artifactory.util.Files.switchFiles(importConfigFile, bootstrapConfigFile);
-                    return configContent;
-                }
-            } catch (IOException e) {
-                throw new RuntimeException("Could not read data from '" + importConfigFile.getAbsolutePath() +
-                        "' file due to: " + e.getMessage(), e);
-            }
-        }
-        return null;
-    }
-
-    public String getBootstrapConfigXml() {
-        File oldLocalConfig = getArtifactoryConfigFile();
-        File newBootstrapConfig = getArtifactoryConfigBootstrapFile();
-        String result;
-        if (newBootstrapConfig.exists()) {
-            try {
-                result = FileUtils.readFileToString(newBootstrapConfig, "utf-8");
-            } catch (IOException e) {
-                throw new RuntimeException("Could not read data from '" + newBootstrapConfig.getAbsolutePath() +
-                        "' file due to: " + e.getMessage(), e);
-            }
-        } else if (oldLocalConfig.exists()) {
-            try {
-                result = FileUtils.readFileToString(oldLocalConfig, "utf-8");
-            } catch (IOException e) {
-                throw new RuntimeException("Could not read data from '" + newBootstrapConfig.getAbsolutePath() +
-                        "' file due to: " + e.getMessage(), e);
-            }
-        } else {
-            String resPath = "/META-INF/default/" + ARTIFACTORY_CONFIG_FILE;
-            InputStream is = ArtifactoryHome.class.getResourceAsStream(resPath);
-            if (is == null) {
-                throw new RuntimeException("Could read the default configuration from classpath at " + resPath);
-            }
-            try {
-                result = IOUtils.toString(is, "utf-8");
-            } catch (IOException e) {
-                throw new RuntimeException("Could not read data from '" + resPath +
-                        "' file due to: " + e.getMessage(), e);
-            }
-        }
-        return result;
-    }
-
-    public void renameInitialConfigFileIfExists() {
-        File initialConfigFile = getArtifactoryConfigFile();
-        if (initialConfigFile.isFile()) {
-            org.artifactory.util.Files.switchFiles(initialConfigFile,
-                    getArtifactoryConfigBootstrapFile());
-        }
-    }
-
-    public ArtifactorySystemProperties getArtifactoryProperties() {
-        return artifactorySystemProperties;
-    }
-
-    public MimeTypes getMimeTypes() {
-        return mimeTypes;
-    }
-
-    public File getHomeArtifactoryPropertiesFile() {
-        return new File(dataDir, ARTIFACTORY_PROPERTIES_FILE);
-    }
-
-    public File getHaArtifactoryPropertiesFile() {
-        return new File(haDataDir, ARTIFACTORY_PROPERTIES_FILE);
-    }
-
-    private URL getDefaultArtifactoryPropertiesUrl() {
-        return ArtifactoryHome.class.getResource("/META-INF/" + ARTIFACTORY_PROPERTIES_FILE);
-    }
-
-    public void writeBundledHomeArtifactoryProperties() {
-        File artifactoryPropertiesFile = getHomeArtifactoryPropertiesFile();
-        //Copy the artifactory.properties file into the data folder
-        try {
-            //Copy from default
-            FileUtils.copyURLToFile(getDefaultArtifactoryPropertiesUrl(), artifactoryPropertiesFile);
-        } catch (IOException e) {
-            throw new RuntimeException("Could not copy " + ARTIFACTORY_PROPERTIES_FILE + " to " +
-                    artifactoryPropertiesFile.getAbsolutePath(), e);
-        }
-    }
-
-    public void writeBundledHaArtifactoryProperties() {
-        File artifactoryHaPropertiesFile = getHaArtifactoryPropertiesFile();
-        //Copy the artifactory.properties file into the data folder
-        try {
-            //Copy from default
-            FileUtils.copyURLToFile(getDefaultArtifactoryPropertiesUrl(), artifactoryHaPropertiesFile);
-        } catch (IOException e) {
-            throw new RuntimeException("Could not copy " + ARTIFACTORY_PROPERTIES_FILE + " to " +
-                    artifactoryHaPropertiesFile.getAbsolutePath(), e);
-        }
-    }
-
-    public CompoundVersionDetails readRunningArtifactoryVersion() {
-        try (InputStream inputStream = ArtifactoryHome.class.getResourceAsStream(
-                "/META-INF/" + ARTIFACTORY_PROPERTIES_FILE)) {
-            CompoundVersionDetails details = ArtifactoryVersionReader.read(inputStream);
-            //Sanity check
-            if (!details.isCurrent()) {
-                throw new IllegalStateException("Running version is not the current version. " +
-                        "Running: " + details + " Current: " + details.getVersion());
-            }
-            return details;
-        } catch (IOException e) {
-            throw new RuntimeException(
-                    "Unexpected exception occurred: Fail to load artifactory.properties from class resource", e);
-        }
-    }
-
-    /**
-     * Copy the system properties file and set its data as system properties
-     */
-    public void initAndLoadSystemPropertyFile() {
-        // Expose the properties inside artifactory.system.properties
-        File systemPropertiesFile = getArtifactorySystemPropertiesFile();
-        if (!systemPropertiesFile.exists()) {
-            try {
-                //Copy from default
-                URL url = ArtifactoryHome.class.getResource("/META-INF/default/" + ARTIFACTORY_SYSTEM_PROPERTIES_FILE);
-                if (url == null) {
-                    throw new RuntimeException("Could not read classpath resource '/META-INF/default/" +
-                            ARTIFACTORY_SYSTEM_PROPERTIES_FILE +
-                            "'. Make sure Artifactory home is readable by the current user.");
-                }
-                FileUtils.copyURLToFile(url, systemPropertiesFile);
-            } catch (IOException e) {
-                throw new RuntimeException("Could not create the default '" + ARTIFACTORY_SYSTEM_PROPERTIES_FILE +
-                        "' at '" + systemPropertiesFile.getAbsolutePath() + "'.", e);
-            }
-        }
-        artifactorySystemProperties = new ArtifactorySystemProperties();
-        artifactorySystemProperties.loadArtifactorySystemProperties(systemPropertiesFile,
-                getHomeArtifactoryPropertiesFile());
-    }
-
-    public File getArtifactorySystemPropertiesFile() {
-        return new File(getHaAwareEtcDir(), ARTIFACTORY_SYSTEM_PROPERTIES_FILE);
-    }
-
-    public File getArtifactoryHaPropertiesFile() {
-        return new File(etcDir, ARTIFACTORY_HA_NODE_PROPERTIES_FILE);
-    }
-
-    public File getArtifactoryClusterPropertiesFile() {
-        return new File(haEtcDir, CLUSTER_PROPS_FILE);
-    }
-
-    public void initAndLoadMimeTypes() {
-        File mimeTypesFile = getHaAwareMimeTypesFile();
-        if (!mimeTypesFile.exists()) {
-            // Copy default mime types configuration file
-            try {
-                URL configUrl = ArtifactoryHome.class.getResource(
-                        "/META-INF/default/" + ArtifactoryHome.MIME_TYPES_FILE_NAME);
-                FileUtils.copyURLToFile(configUrl, mimeTypesFile);
-            } catch (Exception e) {
-                throw new IllegalStateException("Couldn't start Artifactory. " +
-                        "Failed to copy default mime types file: " + mimeTypesFile.getAbsolutePath(), e);
-            }
-        }
-
-        try {
-            String mimeTypesXml = Files.toString(mimeTypesFile, Charsets.UTF_8);
-            mimeTypes = new MimeTypesReader().read(mimeTypesXml);
-        } catch (Exception e) {
-            throw new RuntimeException("Failed to parse mime types file from: " + mimeTypesFile.getAbsolutePath(), e);
-        }
-    }
-
-    public File getMimeTypesFile() {
-        return new File(getEtcDir(), MIME_TYPES_FILE_NAME);
-    }
-
-    public File getHaAwareMimeTypesFile() {
-        return new File(getHaAwareEtcDir(), MIME_TYPES_FILE_NAME);
-    }
-
-    public File getStoragePropertiesFile() {
-        return new File(getHaAwareEtcDir(), STORAGE_PROPS_FILE_NAME);
-    }
-
-    public File getMissionControlPropertiesFile() {
-        return new File(getHaAwareEtcDir(), MISSION_CONTROL_FILE_NAME);
-    }
-
-    public File getArtifactoryConfigFile() {
-        return new File(getHaAwareEtcDir(), ARTIFACTORY_CONFIG_FILE);
-    }
-
-    public File getArtifactoryConfigLatestFile() {
-        return new File(getHaAwareEtcDir(), ARTIFACTORY_CONFIG_LATEST_FILE);
-    }
-
-    public File getArtifactoryConfigImportFile() {
-        return new File(getHaAwareEtcDir(), ARTIFACTORY_CONFIG_IMPORT_FILE);
-    }
-
-    public File getArtifactoryConfigBootstrapFile() {
-        return new File(getHaAwareEtcDir(), ARTIFACTORY_CONFIG_BOOTSTRAP_FILE);
-    }
-
-    public File getArtifactoryConfigNewBootstrapFile() {
-        return new File(getHaAwareEtcDir(), "new_" + ArtifactoryHome.ARTIFACTORY_CONFIG_BOOTSTRAP_FILE);
-    }
-
-    /**
-     * Missing Closure ;-)
-     */
-    public interface SimpleLog {
-        public void log(String message);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/common/ConstantValues.java b/base/config/src/main/java/org/artifactory/common/ConstantValues.java
deleted file mode 100644
index 46d9170..0000000
--- a/base/config/src/main/java/org/artifactory/common/ConstantValues.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.common;
-
-import static java.lang.Boolean.FALSE;
-import static java.lang.Boolean.TRUE;
-
-/**
- * @author freds
- * @date Oct 10, 2008
- */
- at SuppressWarnings({"EnumeratedConstantNamingConvention"})
-public enum ConstantValues {
-    test("runMode.test", FALSE), //Use and set only in specific itests - has serious performance implications
-    qa("runMode.qa", FALSE),
-    dev("runMode.dev", FALSE),
-    devHa("runMode.devHa", FALSE),
-    artifactoryVersion("version"),
-    artifactoryRevision("revision"),
-    artifactoryTimestamp("timestamp"),
-    supportUrlSessionTracking("servlet.supportUrlSessionTracking", FALSE),
-    disabledAddons("addons.disabled", ""),
-    addonsInfoUrl("addons.info.url", "http://service.jfrog.org/artifactory/addons/info/%s"),
-    addonsConfigureUrl("addons.info.url", "http://www.jfrog.com/confluence/display/RTF/%s"),
-    springConfigDir("spring.configDir"),
-    asyncCorePoolSize("async.corePoolSize", 4 * Runtime.getRuntime().availableProcessors()),
-    asyncPoolTtlSecs("async.poolTtlSecs", 60),
-    asyncPoolMaxQueueSize("async.poolMaxQueueSize", 10000),
-    versioningQueryIntervalSecs("versioningQueryIntervalSecs", Seconds.HOUR * 2),
-    logsViewRefreshRateSecs("logs.viewRefreshRateSecs", 10),
-    locksTimeoutSecs("locks.timeoutSecs", 120),
-    locksDebugTimeouts("locks.debugTimeouts", FALSE),
-    taskCompletionLockTimeoutRetries("task.completionLockTimeoutRetries", 100),
-    substituteRepoKeys("repo.key.subst."),
-    repoConcurrentDownloadSyncTimeoutSecs("repo.concurrentDownloadSyncTimeoutSecs", Seconds.MINUTE * 15),
-    downloadStatsEnabled("repo.downloadStatsEnabled", TRUE),
-    disableGlobalRepoAccess("repo.global.disabled", FALSE),
-    fsItemCacheIdleTimeSecs("fsitem.cache.idleTimeSecs", Seconds.MINUTE * 20),
-    dockerTokensCacheIdleTimeSecs("docker.tokens.cache.idleTimeSecs", Seconds.MINUTE * 4),
-    genericTokensCacheIdleTimeSecs("artifactory.tokens.cache.idleTimeSecs", Seconds.MINUTE * 5),
-    cacheFSSyncquietPeriodSecs("cacheFS.sync.quietPeriodSecs", Seconds.MINUTE * 15),
-    searchMaxResults("search.maxResults", 500),
-    searchUserQueryLimit("search.userQueryLimit", 1000),
-    searchMaxFragments("search.content.maxFragments", 500),
-    searchMaxFragmentsSize("search.content.maxFragmentsSize", 5000),
-    searchArchiveMinQueryLength("search.archive.minQueryLength", 3),
-    searchPatternTimeoutSecs("search.pattern.timeoutSecs", 30),
-    gcUseIndex("gc.useIndex", FALSE),
-    gcIntervalSecs("gc.intervalSecs", Seconds.DAY),
-    gcDelaySecs("gc.delaySecs", Seconds.HOUR * 2),
-    gcSleepBetweenNodesMillis("gc.sleepBetweenNodesMillis", 20),
-    gcScanStartSleepingThresholdMillis("gc.scanStartSleepingThresholdMillis", 20000),
-    gcScanSleepBetweenIterationsMillis("gc.scanSleepBetweenIterationsMillis", 200),
-    gcFileScanSleepIterationMillis("gc.fileScanSleepIterationMillis", 1000),
-    gcFileScanSleepMillis("gc.fileScanSleepMillis", 250),
-    gcMaxCacheEntries("gc.maxCacheEntries", 10000),
-    gcReadersMaxTimeSecs("gc.readersMaxTimeSecs", Seconds.HOUR * 3),
-    trafficCollectionActive("traffic.collectionActive", FALSE),
-    securityAuthenticationCacheInitSize("security.authentication.cache.initSize", 100),
-    securityAuthenticationCacheIdleTimeSecs("security.authentication.cache.idleTimeSecs", Seconds.MINUTE * 5),
-    userLastAccessUpdatesResolutionSecs("security.userLastAccessUpdatesResolutionSecs", 5),
-    securityAuthenticationEncryptedPasswordSurroundChars(
-            "security.authentication.encryptedPassword.surroundChars", "{}"),
-    securityUseBase64("security.useBase64", FALSE),
-    securityMasterKeyLocation("security.master.key", "security/artifactory.key"),
-    securityDisableRememberMe("security.disableRememberMe", FALSE),
-    ldapForceGroupMemberAttFullDN("security.ldap.forceGroupMemberAttFullDN", FALSE),
-    enableAqlReadCommitted("enable.aql.read.committed", FALSE),
-    mvnCentralHostPattern("mvn.central.hostPattern", ".maven.org"),
-    mvnCentralIndexerMaxQueryIntervalSecs("mvn.central.indexerMaxQueryIntervalSecs", Seconds.DAY),
-    mvnMetadataCalculationWorkers("mvn.metadata.calculation.workers", 8),
-    mvnMetadataVersionsComparator("mvn.metadataVersionsComparatorFqn"),
-    mvnMetadataSnapshotComparator("mvn.metadataSnapshotComparatorFqn"),
-    mvnDynamicMetadataCacheRetentionSecs("mvn.dynamicMetadata.cacheRetentionSecs", 10),
-    mvnMetadataVersion3Enabled("mvn.metadata.version3.enabled", TRUE),
-    mvnCustomTypes("mvn.custom.types", "tar.gz,tar.bz2"),
-    requestDisableVersionTokens("request.disableVersionTokens", FALSE),
-    requestSearchLatestReleaseByDateCreated("request.searchLatestReleaseByDateCreated", FALSE),
-    buildMaxFoldersToScanForDeletionWarnings("build.maxFoldersToScanForDeletionWarnings", 2),
-    missingBuildChecksumCacheIdeTimeSecs("build.checksum.cache.idleTimeSecs", Seconds.MINUTE * 5),
-    artifactoryUpdatesRefreshIntervalSecs("updates.refreshIntervalSecs", Seconds.HOUR * 4),
-    artifactoryUpdatesUrl("updates.url", "http://service.jfrog.org/artifactory/updates"),
-    artifactoryRequestsToGlobalCanRetrieveRemoteArtifacts(
-            "artifactoryRequestsToGlobalCanRetrieveRemoteArtifacts", FALSE),
-    uiSyntaxColoringMaxTextSizeBytes("ui.syntaxColoringMaxTextSizeBytes", 512000),
-    pluginScriptsRefreshIntervalSecs("plugin.scripts.refreshIntervalSecs", 0),
-    aolPluginSupport("plugin.aol.support", FALSE),
-    aolDedicatedServer("aol.dedicated.server", FALSE),
-    aolDisplayAccountManagementLink("aol.displayAccountManagementLink", TRUE),
-    uiChroot("ui.chroot"),
-    artifactoryLicenseDir("licenseDir"),
-    fileRollerMaxFilesToRetain("file.roller.maxFileToRetain", 10),
-    backupFileExportSleepIterationMillis("backup.fileExportSleepIterationMillis", 2000),
-    backupFileExportSleepMillis("backup.fileExportSleepMillis", 250),
-    s3backupBucket("backup.s3.bucket"),
-    s3backupFolder("backup.s3.folder"),
-    s3backupAccountId("backup.s3.accountId"),
-    s3backupAccountSecretKey("backup.s3.accountSecretKey"),
-    httpAcceptEncodingGzip("http.acceptEncoding.gzip", true),
-    httpUseExpectContinue("http.useExpectContinue", false),
-    httpForceForbiddenResponse("http.forceForbiddenResponse", FALSE),
-    enableCookieManagement("http.enableCookieManagement", false),
-    filteringResourceSizeKb("filtering.resourceSizeKb", 64),
-    searchForExistingResourceOnRemoteRequest("repo.remote.checkForExistingResourceOnRequest", TRUE),
-    versionQueryEnabled("version.query.enabled", true),
-    hostId("host.id"),
-    responseDisableContentDispositionFilename("response.disableContentDispositionFilename", FALSE),
-    yumCalculationRequestAggregationTimeWindowSecs("yum.calculationRequest.aggregationTimeWindowSecs", 60),
-    debianCalculationRequestAggregationTimeWindowSecs("debian.calculationRequest.aggregationTimeWindowSecs", 60),
-    yumCalculationRequestAggregationCycleSecs("yum.calculationRequest.aggregationCycleSecs", 60),
-    debianCalculationRequestAggregationCycleSecs("debian.calculationRequest.aggregationCycleSecs", 60),
-    debianRemoteETagSupport("debian.remote.etag", TRUE),
-    globalExcludes("repo.includeExclude.globalExcludes"),
-    archiveLicenseFileNames("archive.licenseFile.names", "license,LICENSE,license.txt,LICENSE.txt,LICENSE.TXT"),
-    uiSearchMaxRowsPerPage("ui.search.maxRowsPerPage", 20),
-    replicationChecksumDeployMinSizeKb("replication.checksumDeploy.minSizeKb", 10),
-    replicationConsumerQueueSize("replication.consumer.queueSize", 1),
-    replicationLocalIterationSleepThresholdMillis("replication.local.iteration.sleepThresholdMillis", 1000),
-    replicationLocalIterationSleepMillis("replication.local.iteration.sleepMillis", 100),
-    replicationEventQueueSize("replication.event.queue.size", 50000),
-    replicationPropertiesMaxLength("replication.properties.max.length", 100000),
-    requestExplodedArchiveExtensions("request.explodedArchiveExtensions", "zip,tar,tar.gz,tgz"),
-    jCenterUrl("bintray.jcenter.url", "http://jcenter.bintray.com"),
-    bintrayUrl("bintray.url", "https://bintray.com"),
-    bintrayApiUrl("bintray.api.url", "https://api.bintray.com"),
-    bintrayOAuthTokenExpirySeconds("bintray.token.expirySecs", 240),
-    bintrayDistributionRegexTimeoutMillis("bintray.distributionRegex.timeoutMillis", 180000),
-    bintrayUIHideUploads("bintray.ui.hideUploads", FALSE),
-    bintrayUIHideInfo("bintray.ui.hideInfo", FALSE),
-    bintrayUIHideRemoteSearch("bintray.ui.hideRemoteSearch", FALSE),
-    bintraySystemUser("bintray.system.user"),
-    bintraySystemUserApiKey("bintray.system.api.key"),
-    bintrayClientThreadPoolSize("bintray.client.threadPool.size", 5),
-    enableUiPagesInIframe("enable.ui.pages.in.Iframe", false),
-    bintrayClientRequestTimeout("bintray.client.requestTimeoutMS",150000),
-    bintrayClientDistributionRequestTimeout("bintray.client.distribution.requestTimeoutMS",15000),
-    bintrayClientSignRequestTimeout("bintray.client.signRequestTimeoutMS", 10000),
-    useUserNameAutoCompleteOnLogin("useUserNameAutoCompleteOnLogin", "on"),
-    uiHideEncryptedPassword("ui.hideEncryptedPassword", FALSE),
-    statsFlushIntervalSecs("stats.flushIntervalSecs", 30),
-    statsRemoteFlushIntervalSecs("stats.remote.flushIntervalSecs", 35),
-    statsFlushTimeoutSecs("stats.flushTimeoutSecs", 120),
-    integrationCleanupIntervalSecs("integrationCleanup.intervalSecs", 300),
-    integrationCleanupQuietPeriodSecs("integrationCleanup.quietPeriodSecs", 60),
-    folderPruningIntervalSecs("folderPruning.intervalSecs", 300),
-    folderPruningQuietPeriodSecs("folderPruning.quietPeriodSecs", 60),
-    virtualCleanupMaxAgeHours("repo.virtualCacheCleanup.maxAgeHours", 168),
-    virtualCleanupNamePattern("repo.virtualCacheCleanup.pattern", "*.pom"),
-    defaultSaltValue("security.authentication.password.salt", "CAFEBABEEBABEFAC"),
-    dbIdGeneratorFetchAmount("db.idGenerator.fetch.amount", 2000),
-    dbIdGeneratorMaxUpdateRetries("db.idGenerator.max.update.retries", 50),
-    gemsLocalIndexTaskIntervalSecs("gems.localIndexTaskIntervalSecs", 30),
-    gemsVirtualIndexTaskIntervalSecs("gems.virtualIndexTaskIntervalSecs", 300),
-    gemsIndexTaskQueueLimit("gems.gemsIndexTaskQueueLimit", 20000),
-    gemsAfterRepoInitHack("gems.gemsAfterRepoInitHack", true),
-    securityCrowdGroupStartIndex("security.authentication.crowd.group.startIndex", 0),
-    securityCrowdMaxGroupResults("security.authentication.crowd.group.maxResults", 9999),
-    uiHideChecksums("ui.hideChecksums", FALSE),
-    archiveIndexerTaskIntervalSecs("archive.indexer.intervalSecs", 60),
-    inMemoryNuGetRemoteCaches("nuget.inMemoryRemoteCaches", TRUE),
-    nuGetRequireAuthentication("nuget.forceAuthentication", FALSE),
-    nuGetAllowRootGetWithAnon("nuget.allowRootGetWithAnon", FALSE),
-    dockerForceAuthentication("docker.forceAuthentication", FALSE),
-    haHeartbeatIntervalSecs("ha.heartbeat.intervalSecs", 5),
-    haHeartbeatStaleIntervalSecs("ha.heartbeat.staleSecs", 30),
-    binaryStoreErrorNotificationsIntervalSecs("binary.store.error.notification.intervalSecs", 30),
-    binaryStoreErrorNotificationsStaleIntervalSecs("binary.store.error.notification.staleSecs", 30),
-    haMembersIntroductionIntervalSecs("ha.membersIntroduction.intervalSecs", 30),
-    haMembersIntroductionStaleIntervalSecs("ha.membersIntroduction.staleSecs", 30),
-    npmIndexQuietPeriodSecs("npm.index.quietPeriodSecs", 60),
-    npmIndexCycleSecs("npm.index.cycleSecs", 60),
-    importMaxParallelRepos("import.max.parallelRepos", Runtime.getRuntime().availableProcessors() - 1),
-    debianDistributionPath("debian.distribution.path", "dists"),
-    debianIndexQuietPeriodSecs("debian.index.quietPeriodSecs", 60),
-    debianIndexCycleSecs("debian.index.cycleSecs", 2),
-    opkgIndexQuietPeriodSecs("opkg.index.quietPeriodSecs", 60),
-    opkgIndexCycleSecs("opkg.index.cycleSecs", 2),
-    debianDefaultArchitectures("debian.default.architectures", "i386,amd64"),
-    pypiIndexQuietPeriodSecs("pypi.index.quietPeriodSecs", 60),
-    pypiIndexSleepSecs("pypi.index.sleepMilliSecs", 60),
-    dockerCleanupMaxAgeMillis("docker.cleanup.maxAgeMillis", Seconds.DAY * 1000),
-    httpRangeSupport("http.range.support", true),
-    aclDirtyReadsTimeout("acl.dirty.read.timeout", 20000),
-    allowUnauthenticatedPing("ping.allowUnauthenticated", FALSE), // in milliseconds
-    idleConnectionMonitorInterval("repo.http.idleConnectionMonitorInterval", 10),
-    disableIdleConnectionMonitoring("repo.http.disableIdleConnectionMonitoring", FALSE),
-    contentCollectionAwaitTimeout("support.core.bundle.contentCollectionAwaitTimeout", 60),
-    waitForSlotBeforeWithdraw("support.core.bundle.waitForSlotBeforeWithdraw", 600),
-    maxBundles("support.core.bundle.maxBundles", 5),
-    callHomeCron("post.jobs.callHome.cron", null),
-    binaryProviderZones("binary.provider.zones","a,b,c"),
-    binaryProviderPruneChunkSize("binary.provider.prune.chunk.size", 500),
-    useFrontCacheForBlockedUsers("security.useFrontCacheForBlockedUsers", true),
-    loginBlockDelay("security.loginBlockDelay", 500),
-    passwordExpireNotificationJobIntervalSecs("security.password.expiry.passwordExpireNotificationJobIntervalSecs", 86400),
-    passwordExpireJobIntervalSecs("security.password.expiry.passwordExpireJobIntervalSecs", 43200),
-    passwordDaysToNotifyBeforeExpiry("security.password.expiry.daysToNotifyBefore", 5),
-    httpClientMaxTotalConnections("http.client.max.total.connections", 50),
-    httpClientMaxConnectionsPerRoute("http.client.max.connections.per.route", 50),
-    hazelcastMaxLockLeaseTime("hazelcast.max.lock.lease.time.seconds", 30),
-    blockedMismatchingMimeTypes("repo.remote.blockedMismatchingMimeTypes","text/html,application/xhtml+xml");
-
-    public static final String SYS_PROP_PREFIX = "artifactory.";
-
-    private final String propertyName;
-    private final String defValue;
-
-    ConstantValues(String propertyName) {
-        this(propertyName, null);
-    }
-
-    ConstantValues(String propertyName, Object defValue) {
-        this.propertyName = SYS_PROP_PREFIX + propertyName;
-        this.defValue = defValue == null ? null : defValue.toString();
-    }
-
-    public String getPropertyName() {
-        return propertyName;
-    }
-
-    public String getDefValue() {
-        return defValue;
-    }
-
-    public String getString() {
-        return ArtifactoryHome.get().getArtifactoryProperties().getProperty(this);
-    }
-
-    public int getInt() {
-        return (int) getLong();
-    }
-
-    public long getLong() {
-        return ArtifactoryHome.get().getArtifactoryProperties().getLongProperty(this);
-    }
-
-    public boolean getBoolean() {
-        return ArtifactoryHome.get().getArtifactoryProperties().getBooleanProperty(this);
-    }
-
-    public boolean isSet() {
-        return ArtifactoryHome.get().getArtifactoryProperties().hasProperty(this);
-    }
-
-    private static class Seconds {
-        private static final int MINUTE = 60;
-        private static final int HOUR = MINUTE * 60;
-        private static final int DAY = HOUR * 24;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/common/ha/ClusterProperties.java b/base/config/src/main/java/org/artifactory/common/ha/ClusterProperties.java
deleted file mode 100644
index 2867b7e..0000000
--- a/base/config/src/main/java/org/artifactory/common/ha/ClusterProperties.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.common.ha;
-
-import org.apache.commons.lang.StringUtils;
-
-import javax.annotation.Nonnull;
-import java.io.File;
-import java.io.FileInputStream;
-import java.util.Properties;
-
-/**
- * @author yoavl
- */
-public class ClusterProperties {
-
-    public static final String SECURITY_TOKEN_PROPERTY_KEY = "security.token";
-
-    private Properties properties = new Properties();
-
-    public void load(@Nonnull File propsFile) {
-        if (propsFile.exists()) {
-            try (FileInputStream fis = new FileInputStream(propsFile)) {
-                properties.load(fis);
-                verifyPropertiesInformation();
-            } catch (Exception e) {
-                throw new RuntimeException("Could not read cluster properties from " +
-                        "'" + propsFile.getAbsolutePath() + "': " + e.getMessage(), e);
-            }
-        } else {
-            throw new RuntimeException("Could not find cluster properties in '" + propsFile.getAbsolutePath() + "'.");
-        }
-    }
-
-    public String getSecurityToken() {
-        return properties.getProperty(SECURITY_TOKEN_PROPERTY_KEY);
-    }
-
-    private void verifyPropertiesInformation() {
-        if (StringUtils.isBlank(getSecurityToken())) {
-            throw new RuntimeException("Bad security token found in cluster properties");
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/common/ha/HaNodeProperties.java b/base/config/src/main/java/org/artifactory/common/ha/HaNodeProperties.java
deleted file mode 100644
index aa9105d..0000000
--- a/base/config/src/main/java/org/artifactory/common/ha/HaNodeProperties.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.common.ha;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Maps;
-import org.apache.commons.lang.StringUtils;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.io.File;
-import java.io.FileInputStream;
-import java.util.Properties;
-
-/**
- * @author yoavl
- */
-public class HaNodeProperties {
-
-    public static final String PROP_NODE_ID = "node.id";
-    public static final String PROP_CLUSTER_HOME = "cluster.home";
-    public static final String PROP_CONTEXT_URL = "context.url";
-    public static final String PROP_PRIMARY = "primary";
-    public static final String PROP_MEMBERSHIP_PORT = "membership.port";
-
-    private final Properties properties = new Properties();
-
-    public void load(@Nonnull File propsFile) {
-        if (propsFile.exists()) {
-            try (FileInputStream fis = new FileInputStream(propsFile)) {
-                properties.load(fis);
-                verifyPropertiesInformation();
-            } catch (Exception e) {
-                throw new RuntimeException("Could not read ha-node properties from " +
-                        "'" + propsFile.getAbsolutePath() + "': " + e.getMessage(), e);
-            }
-        } else {
-            throw new RuntimeException("Could not find ha-node properties in '" + propsFile.getAbsolutePath() + "'.");
-        }
-    }
-
-    public String getServerId() {
-        return properties.getProperty(PROP_NODE_ID);
-    }
-
-    public File getClusterHome() {
-        return new File(properties.getProperty(PROP_CLUSTER_HOME));
-    }
-
-    public String getContextUrl() {
-        return properties.getProperty(PROP_CONTEXT_URL);
-    }
-
-    public boolean isPrimary() {
-        return Boolean.valueOf(properties.getProperty(PROP_PRIMARY));
-    }
-
-    public Properties getProperties() {
-        return properties;
-    }
-
-    @Nullable
-    public Integer getMembershipPort() {
-        String membershipPort = properties.getProperty(PROP_MEMBERSHIP_PORT);
-        return StringUtils.isNotBlank(membershipPort) ? Integer.valueOf(membershipPort) : null;
-    }
-
-    public ImmutableMap<String, String> getPropertiesMap() {
-        return Maps.fromProperties(properties);
-    }
-
-    private void verifyPropertiesInformation() {
-        if (StringUtils.isBlank(getServerId())) {
-            throw new RuntimeException(invalidProperty(PROP_NODE_ID) + ": can not be blank");
-        }
-        if (StringUtils.isBlank(properties.getProperty(PROP_CLUSTER_HOME))) {
-            throw new RuntimeException(invalidProperty(PROP_CLUSTER_HOME) + ": can not be blank");
-        }
-        if (!getClusterHome().exists()) {
-            throw new RuntimeException(invalidProperty(PROP_CLUSTER_HOME) + ": path " +
-                    getClusterHome().getAbsolutePath() + " does not exist");
-        }
-        if (StringUtils.isBlank(getContextUrl())) {
-            throw new RuntimeException(invalidProperty(PROP_CONTEXT_URL) + ": can not be blank");
-        }
-        try {
-            getMembershipPort();
-        } catch (NumberFormatException e) {
-            throw new RuntimeException(invalidProperty(PROP_MEMBERSHIP_PORT) + ": not a valid number");
-        }
-    }
-
-    private String invalidProperty(String propertyName) {
-        return "Invalid property " + propertyName + " in ha-node properties";
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/common/property/ArtifactoryConverter.java b/base/config/src/main/java/org/artifactory/common/property/ArtifactoryConverter.java
deleted file mode 100644
index 2e28a87..0000000
--- a/base/config/src/main/java/org/artifactory/common/property/ArtifactoryConverter.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.artifactory.common.property;
-
-import org.artifactory.version.CompoundVersionDetails;
-
-/**
- * Author: gidis
- */
-public interface ArtifactoryConverter {
-    /**
-     * Run any necessary conversions to bring the system from the source version to the target version.
-     * This method is called before {@link org.artifactory.spring.ReloadableBean#init()} and in the order of
-     * dependencies between the services as declared in {@link org.artifactory.spring.Reloadable#initAfter()}.
-     */
-    void convert(CompoundVersionDetails source, CompoundVersionDetails target);
-}
diff --git a/base/config/src/main/java/org/artifactory/common/property/ArtifactorySystemProperties.java b/base/config/src/main/java/org/artifactory/common/property/ArtifactorySystemProperties.java
deleted file mode 100644
index 1820ee3..0000000
--- a/base/config/src/main/java/org/artifactory/common/property/ArtifactorySystemProperties.java
+++ /dev/null
@@ -1,317 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.common.property;
-
-import com.google.common.collect.ImmutableMap;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.log.BootstrapLogger;
-
-import javax.annotation.Nullable;
-import java.io.File;
-import java.io.FileInputStream;
-import java.util.EnumMap;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-
-/**
- * @author yoavl
- */
-public class ArtifactorySystemProperties {
-
-    private static final ImmutableMap<String, PropertyMapper> DEPRECATED =
-            ImmutableMap.<String, PropertyMapper>builder()
-                    .put("artifactory.authenticationCacheIdleTimeSecs",
-                            new SamePropertyMapper("artifactory.authentication.cache.idleTimeSecs"))
-                    .put("artifactory.maven.suppressPomConsistencyChecks", new NullPropertyMapper())
-                    .put("artifactory.metadataCacheIdleTimeSecs", new NullPropertyMapper())
-                    .put("artifactory.logs.refreshrate.secs",
-                            new SamePropertyMapper("artifactory.logs.viewRefreshRateSecs"))
-                    .put("artifactory.spring.configPath", new SamePropertyMapper("artifactory.spring.configDir"))
-                    .put("artifactory.lockTimeoutSecs", new SamePropertyMapper("artifactory.locks.timeoutSecs"))
-                    .put("artifactory.xmlAdditionalMimeTypeExtensions", new NullPropertyMapper())
-                    .put("repo.cleanup.intervalHours", new NullPropertyMapper())
-                    .put("bintray.system.user", new MovedToConfigPropertyMapper
-                            ("The bintray config section in the admin page"))
-                    .put("bintray.system.api.key", new MovedToConfigPropertyMapper
-                            ("The bintray config section in the admin page"))
-                    .build();
-    /**
-     * The combined properties of System, artifactory.system.properties file and artifactory.properties file. All system
-     * properties starting with 'artifactory.' will be included.
-     */
-    private Properties nonEnumArtifactoryProperties = new Properties();
-    private EnumMap<ConstantValues, String> artifactoryProperties = new EnumMap<>(ConstantValues.class);
-
-    /**
-     * Caching parseLong values from the properties above
-     */
-    private EnumMap<ConstantValues, Long> artifactoryLongProperties = new EnumMap<>(ConstantValues.class);
-    private EnumMap<ConstantValues, Boolean> artifactoryBooleanProperties = new EnumMap<>(ConstantValues.class);
-    /**
-     * A map of substitute repo keys (oldKey:newKey) for supporting old repository keys (that are invalid xml ids).
-     */
-    private Map<String, String> substituteRepoKeys = new HashMap<>();
-
-    private static void loadSystemProperties(Properties result) {
-        Properties properties = System.getProperties();
-        for (Object key : properties.keySet()) {
-            String sKey = (String) key;
-            if (sKey.startsWith(ConstantValues.SYS_PROP_PREFIX)) {
-                result.put(sKey, properties.getProperty(sKey));
-            }
-        }
-    }
-
-    private static void validateConstants(Properties artProps) {
-        String chrootPropertyName = ConstantValues.uiChroot.getPropertyName();
-        String chroot = (String) artProps.get(chrootPropertyName);
-        if (StringUtils.isNotBlank(chroot)) {
-            if (!new File(chroot).exists()) {
-                artProps.remove(chrootPropertyName);
-                BootstrapLogger.error("Selected chroot '" + chroot + "' does not exist. Ignoring property value!");
-            }
-        }
-    }
-
-    private static void handleDeprecatedProps(Properties artProps) {
-        //Test the deprecated props against the current props
-        Properties autoReplaced = new Properties();
-        for (Object key : artProps.keySet()) {
-            String prop = (String) key;
-            if (DEPRECATED.containsKey(prop)) {
-                PropertyMapper mapper = DEPRECATED.get(prop);
-                String newProp = mapper.getNewPropertyName();
-                String suggestion = newProp == null ? "this property is no longer in use." :
-                        "please use: '" + newProp + "' instead.";
-                BootstrapLogger.warn(
-                        "Usage of deprecated artifactory system property detected: '" + prop + "' - " + suggestion);
-                //Check if property can be automatically replaced
-                String value = (String) artProps.get(prop);
-                String newValue = mapper.map(value);
-                if (newProp == null) {
-                    newProp = prop;
-                }
-                if (newValue != null) {
-                    autoReplaced.put(newProp, newValue);
-                    BootstrapLogger.warn(
-                            "Deprecated artifactory system property '" + prop + "=" + value + "' auto-replaced with '" +
-                                    newProp + "=" + newValue + "'.");
-                }
-            }
-        }
-        artProps.putAll(autoReplaced);
-    }
-
-    private static Map<String, String> fillRepoKeySubstitute(Properties artProps) {
-        Map<String, String> result = new HashMap<>();
-        String prefix = ConstantValues.substituteRepoKeys.getPropertyName();
-        for (Object o : artProps.keySet()) {
-            String key = (String) o;
-            if (key.startsWith(prefix)) {
-                String oldRepoKey = key.substring(prefix.length());
-                String newRepoKey = (String) artProps.get(key);
-                result.put(oldRepoKey, newRepoKey);
-            }
-        }
-        // Remove the keys used
-        for (String key : result.keySet()) {
-            artProps.remove(prefix + key);
-        }
-        return result;
-    }
-
-    public String getProperty(ConstantValues key) {
-        String result = artifactoryProperties.get(key);
-        if (result == null) {
-            return key.getDefValue();
-        }
-        return result;
-    }
-
-    public boolean hasProperty(ConstantValues key) {
-        return artifactoryProperties.containsKey(key);
-    }
-
-    public String getProperty(String key, @Nullable String defaultValue) {
-        return nonEnumArtifactoryProperties.getProperty(key, defaultValue);
-    }
-
-    public Long getLongProperty(ConstantValues key) {
-        Long result = artifactoryLongProperties.get(key);
-        if (result == null) {
-            String strValue = getProperty(key);
-            if (strValue == null) {
-                result = 0l;
-            } else {
-                result = Long.parseLong(strValue.trim());
-            }
-            artifactoryLongProperties.put(key, result);
-        }
-        return result;
-    }
-
-    public Boolean getBooleanProperty(ConstantValues key) {
-        Boolean result = artifactoryBooleanProperties.get(key);
-        if (result == null) {
-            String strValue = getProperty(key);
-            if (strValue == null) {
-                result = Boolean.FALSE;
-            } else {
-                result = Boolean.parseBoolean(strValue);
-            }
-            artifactoryBooleanProperties.put(key, result);
-        }
-        return result;
-    }
-
-    public Map<String, String> getSubstituteRepoKeys() {
-        return substituteRepoKeys;
-    }
-
-    public void loadArtifactorySystemProperties(File systemPropertiesFile, File artifactoryPropertiesFile) {
-        Properties combinedProperties = new Properties();
-        if (systemPropertiesFile != null && systemPropertiesFile.exists()) {
-            FileInputStream fis = null;
-            try {
-                fis = new FileInputStream(systemPropertiesFile);
-                combinedProperties.load(fis);
-            } catch (Exception e) {
-                throw new RuntimeException("Could not read default system properties from '" +
-                        systemPropertiesFile.getAbsolutePath() + "'.", e);
-            } finally {
-                IOUtils.closeQuietly(fis);
-            }
-        }
-
-        // load artifactory.properties (version and revision properties)
-        if (artifactoryPropertiesFile != null && artifactoryPropertiesFile.exists()) {
-            FileInputStream fis = null;
-            try {
-                // Load from file than override from the system props
-                fis = new FileInputStream(artifactoryPropertiesFile);
-                combinedProperties.load(fis);
-            } catch (Exception e) {
-                throw new RuntimeException("Could not read artifactory.properties from '" +
-                        artifactoryPropertiesFile.getAbsolutePath() + "'.", e);
-            } finally {
-                IOUtils.closeQuietly(fis);
-            }
-        }
-
-        // Override with System properties
-        loadSystemProperties(combinedProperties);
-
-        Set<String> setAsSystemProp = new HashSet<>();
-        //Cleanup all non-artifactory system properties and set them as system properties
-        for (Object key : combinedProperties.keySet()) {
-            String propName = (String) key;
-            String propValue = combinedProperties.getProperty(propName);
-            if (!propName.startsWith(ConstantValues.SYS_PROP_PREFIX)) {
-                // TODO: mainly for derby db properties, find another way of doing it
-                System.setProperty(propName, propValue);
-                setAsSystemProp.add(propName);
-            }
-        }
-        for (String key : setAsSystemProp) {
-            combinedProperties.remove(key);
-        }
-
-        substituteRepoKeys = fillRepoKeySubstitute(combinedProperties);
-
-        //Test for deprecated properties and warn
-        handleDeprecatedProps(combinedProperties);
-
-        validateConstants(combinedProperties);
-
-        // Use the EnumMap as much as possible
-        EnumMap<ConstantValues, String> newArtifactoryProperties = new EnumMap<>(ConstantValues.class);
-        for (ConstantValues constVal : ConstantValues.values()) {
-            Object val = combinedProperties.remove(constVal.getPropertyName());
-            if (val != null) {
-                newArtifactoryProperties.put(constVal, (String) val);
-            }
-        }
-        artifactoryProperties = newArtifactoryProperties;
-        // TODO: Print a message when combined props is not empty as this should not happen.
-        // It's probably a typo! But it's used for special security access values not declared in ConstantValues
-        nonEnumArtifactoryProperties = combinedProperties;
-        artifactoryBooleanProperties.clear();
-        artifactoryLongProperties.clear();
-    }
-
-    /**
-     * Returns the propertiesCopy object
-     *
-     * @return Properties - The copy of the artifactoryProperties object
-     */
-    public Properties getPropertiesCopy() {
-        Properties propertiesCopy = new Properties();
-        for (Map.Entry<ConstantValues, String> entry : artifactoryProperties.entrySet()) {
-            propertiesCopy.put(entry.getKey().getPropertyName(), entry.getValue());
-        }
-        propertiesCopy.putAll(nonEnumArtifactoryProperties);
-        return propertiesCopy;
-    }
-
-    /**
-     * Set the value of the given key
-     *
-     * @param propertyName Property key
-     * @param value        Property value
-     */
-    public void setProperty(String propertyName, String value) {
-        ConstantValues key = null;
-        for (ConstantValues val : ConstantValues.values()) {
-            if (val.getPropertyName().equals(propertyName)) {
-                key = val;
-                break;
-            }
-        }
-        if (key != null) {
-            artifactoryProperties.put(key, value);
-            //Update the caches too. Only ConstantValues have a cache entry
-            if (artifactoryLongProperties.containsKey(key)) {
-                artifactoryLongProperties.put(key, Long.valueOf(value));
-            }
-            if (artifactoryBooleanProperties.containsKey(key)) {
-                artifactoryBooleanProperties.put(key, Boolean.valueOf(value));
-            }
-        } else {
-            nonEnumArtifactoryProperties.put(propertyName, value);
-        }
-    }
-
-    /**
-     * Removes the value of the given key
-     *
-     * @param key Property constant values enum entry
-     * @return the prev value or null
-     */
-    public String removeProperty(ConstantValues key) {
-        artifactoryBooleanProperties.remove(key);
-        artifactoryLongProperties.remove(key);
-        return artifactoryProperties.remove(key);
-    }
-
-}
diff --git a/base/config/src/main/java/org/artifactory/common/property/FatalConversionException.java b/base/config/src/main/java/org/artifactory/common/property/FatalConversionException.java
deleted file mode 100644
index faa0957..0000000
--- a/base/config/src/main/java/org/artifactory/common/property/FatalConversionException.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.common.property;
-
-/**
- * @author freds
- */
-public class FatalConversionException extends RuntimeException {
-
-    public FatalConversionException(String message) {
-        super(message);
-    }
-
-    public FatalConversionException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/common/property/MinutesToSecondsPropertyMapper.java b/base/config/src/main/java/org/artifactory/common/property/MinutesToSecondsPropertyMapper.java
deleted file mode 100644
index 6b83421..0000000
--- a/base/config/src/main/java/org/artifactory/common/property/MinutesToSecondsPropertyMapper.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.common.property;
-
-import org.artifactory.log.BootstrapLogger;
-
-/**
- * Maps the value of a property from minutes to its counterpart in seconds
- *
- * @author Tomer Cohen
- */
-public class MinutesToSecondsPropertyMapper extends PropertyMapperBase {
-
-    public MinutesToSecondsPropertyMapper(String origPropertyName) {
-        super(origPropertyName);
-    }
-
-    @Override
-    public String map(String origValue) {
-        int valueInMinutes;
-        try {
-            valueInMinutes = Integer.parseInt(origValue);
-        } catch (NumberFormatException e) {
-            String msg = "'" + origValue + "' is an illegal value.";
-            BootstrapLogger.error(msg);
-            throw new IllegalArgumentException(msg, e);
-        }
-        return String.valueOf(valueInMinutes * 60);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/common/property/MovedToConfigPropertyMapper.java b/base/config/src/main/java/org/artifactory/common/property/MovedToConfigPropertyMapper.java
deleted file mode 100644
index e58c622..0000000
--- a/base/config/src/main/java/org/artifactory/common/property/MovedToConfigPropertyMapper.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.artifactory.common.property;
-
-/**
- * @author Dan Feldman
- */
-class MovedToConfigPropertyMapper extends PropertyMapperBase {
-
-    protected MovedToConfigPropertyMapper(String origPropertyName) {
-        super(origPropertyName);
-    }
-
-    @Override
-    public String map(String origValue) {
-        return null;
-    }
-
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/common/property/NoopPropertyMapper.java b/base/config/src/main/java/org/artifactory/common/property/NoopPropertyMapper.java
deleted file mode 100644
index fa3c1d7..0000000
--- a/base/config/src/main/java/org/artifactory/common/property/NoopPropertyMapper.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.common.property;
-
-/**
- * @author Yoav Landman
- */
-class SamePropertyMapper extends PropertyMapperBase {
-    protected SamePropertyMapper(String origPropertyName) {
-        super(origPropertyName);
-    }
-
-    @Override
-    public String map(String origValue) {
-        return origValue;
-    }
-
-}
diff --git a/base/config/src/main/java/org/artifactory/common/property/NullPropertyMapper.java b/base/config/src/main/java/org/artifactory/common/property/NullPropertyMapper.java
deleted file mode 100644
index 59cf900..0000000
--- a/base/config/src/main/java/org/artifactory/common/property/NullPropertyMapper.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.common.property;
-
-/**
- * @author Yoav Landman
- */
-class NullPropertyMapper extends PropertyMapperBase {
-
-    protected NullPropertyMapper() {
-        super(null);
-    }
-
-    @Override
-    public String map(String origValue) {
-        return null;
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/common/property/PropertyMapper.java b/base/config/src/main/java/org/artifactory/common/property/PropertyMapper.java
deleted file mode 100644
index 77ebcc8..0000000
--- a/base/config/src/main/java/org/artifactory/common/property/PropertyMapper.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.common.property;
-
-/**
- * @author Yoav Landman
- */
-public interface PropertyMapper {
-    /**
-     * Map a property value of an olde property to a new one
-     *
-     * @param origValue
-     * @return
-     */
-    String map(String origValue);
-
-    String getNewPropertyName();
-}
diff --git a/base/config/src/main/java/org/artifactory/common/property/PropertyMapperBase.java b/base/config/src/main/java/org/artifactory/common/property/PropertyMapperBase.java
deleted file mode 100644
index 412b251..0000000
--- a/base/config/src/main/java/org/artifactory/common/property/PropertyMapperBase.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.common.property;
-
-/**
- * @author Yoav Landman
- */
-abstract class PropertyMapperBase implements PropertyMapper {
-    private String newPropertyName;
-
-    protected PropertyMapperBase(String newPropertyName) {
-        this.newPropertyName = newPropertyName;
-    }
-
-    @Override
-    public String getNewPropertyName() {
-        return newPropertyName;
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/converters/ArtifactoryConverterAdapter.java b/base/config/src/main/java/org/artifactory/converters/ArtifactoryConverterAdapter.java
deleted file mode 100644
index f32e2dd..0000000
--- a/base/config/src/main/java/org/artifactory/converters/ArtifactoryConverterAdapter.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.artifactory.converters;
-
-import org.artifactory.common.property.ArtifactoryConverter;
-import org.artifactory.version.CompoundVersionDetails;
-
-/**
- * @author Gidi Shabat
- */
-public interface ArtifactoryConverterAdapter extends ArtifactoryConverter {
-
-    boolean isInterested(CompoundVersionDetails source, CompoundVersionDetails target);
-
-    void revert();
-
-    void backup();
-
-    void clean();
-}
diff --git a/base/config/src/main/java/org/artifactory/converters/ConverterManager.java b/base/config/src/main/java/org/artifactory/converters/ConverterManager.java
deleted file mode 100644
index de87e59..0000000
--- a/base/config/src/main/java/org/artifactory/converters/ConverterManager.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.artifactory.converters;
-
-
-import org.artifactory.common.property.ArtifactoryConverter;
-
-public interface ConverterManager {
-
-    void convertHomes();
-
-    void beforeInits();
-
-    void serviceConvert(ArtifactoryConverter artifactoryConverter);
-
-    void afterAllInits();
-
-    void afterContextReady();
-
-    boolean isConverting();
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/converters/LoggingConverter.java b/base/config/src/main/java/org/artifactory/converters/LoggingConverter.java
deleted file mode 100644
index e2eae22..0000000
--- a/base/config/src/main/java/org/artifactory/converters/LoggingConverter.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.converters;
-
-import org.apache.commons.io.FileUtils;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.property.FatalConversionException;
-import org.artifactory.logging.version.LoggingVersion;
-import org.artifactory.version.CompoundVersionDetails;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-
-/**
- * @author Gidi Shabat
- */
-public class LoggingConverter implements ArtifactoryConverterAdapter {
-    private static final Logger log = LoggerFactory.getLogger(LoggingConverter.class);
-    private File path;
-
-    public LoggingConverter(File path) {
-        this.path = path;
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-        try {
-            // Perform the logback conversion here because if we do it after configuration is loaded, we must wait 'till
-            // the changes are detected by the watchdog (possibly missing out on important log messages)
-            //Might be first run, protect
-            if (path.exists()) {
-                LoggingVersion.convert(source.getVersion(), target.getVersion(), path);
-            }
-        } catch (FatalConversionException e) {
-            //When a fatal conversion happens fail the context loading
-            log.error(
-                    "Conversion failed with fatal status.\n" +
-                            "You should analyze the error and retry launching " +
-                            "Artifactory. Error is: {}", e.getMessage());
-            throw e;
-        } catch (Exception e) {
-            //When conversion fails - report and continue - don't fail
-            log.error("Failed to execute logging conversion.", e);
-        }
-    }
-
-    @Override
-    public boolean isInterested(CompoundVersionDetails source, CompoundVersionDetails target) {
-        return source != null && !source.isCurrent();
-    }
-
-    @Override
-    public void backup() {
-        File loginFile = new File(path, ArtifactoryHome.LOGBACK_CONFIG_FILE_NAME);
-        File loginBackupFile = new File(path, ArtifactoryHome.LOGBACK_CONFIG_FILE_NAME + ".back");
-        try {
-            if (loginBackupFile.exists()) {
-                FileUtils.forceDelete(loginBackupFile);
-            }
-            FileUtils.copyFile(loginFile, loginBackupFile);
-        } catch (Exception e) {
-            throw new RuntimeException(
-                    "Fail to save backup file '" + loginBackupFile.getAbsolutePath() + "' from the login file: '" + loginFile.getAbsolutePath() + "'",
-                    e);
-        }
-    }
-
-    @Override
-    public void clean() {
-        File loginBackupFile = new File(path, ArtifactoryHome.LOGBACK_CONFIG_FILE_NAME + ".back");
-        try {
-            if (loginBackupFile.exists()) {
-                FileUtils.forceDelete(loginBackupFile);
-            }
-        } catch (Exception e) {
-            throw new RuntimeException(
-                    "Fail to clean backup file '" + loginBackupFile.getAbsolutePath() +
-                            "' after success conversion'", e);
-        }
-    }
-
-    @Override
-    public void revert() {
-        File loginFile = new File(path, ArtifactoryHome.LOGBACK_CONFIG_FILE_NAME);
-        File loginBackupFile = new File(path, ArtifactoryHome.LOGBACK_CONFIG_FILE_NAME + ".back");
-        try {
-            if (loginBackupFile.exists()) {
-                if (loginFile.exists()) {
-                    FileUtils.forceDelete(loginFile);
-                }
-                FileUtils.moveFile(loginBackupFile, loginFile);
-            }
-        } catch (Exception e) {
-            throw new RuntimeException("Fail to revert conversion", e);
-        }
-    }
-}
-
diff --git a/base/config/src/main/java/org/artifactory/converters/MimeTypeConverter.java b/base/config/src/main/java/org/artifactory/converters/MimeTypeConverter.java
deleted file mode 100644
index 89992c6..0000000
--- a/base/config/src/main/java/org/artifactory/converters/MimeTypeConverter.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.converters;
-
-import com.google.common.base.Charsets;
-import com.google.common.io.Files;
-import org.apache.commons.io.FileUtils;
-import org.artifactory.mime.version.MimeTypesVersion;
-import org.artifactory.version.CompoundVersionDetails;
-
-import java.io.File;
-
-/**
- * @author Gidi Shabat
- */
-public class MimeTypeConverter implements ArtifactoryConverterAdapter {
-    private final File path;
-
-    public MimeTypeConverter(File path) {
-        this.path = path;
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-        if (!path.exists()) {
-            throw new RuntimeException(
-                    "Couldn't start Artifactory. Mime types file is missing: " + path.getAbsolutePath());
-        }
-
-        try {
-            String mimeTypesXml = Files.toString(path, Charsets.UTF_8);
-            MimeTypesVersion mimeTypesVersion = MimeTypesVersion.findVersion(mimeTypesXml);
-            if (!mimeTypesVersion.isCurrent()) {
-                String result = mimeTypesVersion.convert(mimeTypesXml);
-                Files.write(result, path, Charsets.UTF_8);
-            }
-        } catch (Exception e) {
-            throw new RuntimeException("Failed to execute mimetypes conversion", e);
-        }
-    }
-
-    @Override
-    public boolean isInterested(CompoundVersionDetails source, CompoundVersionDetails target) {
-        if (!path.exists()) {
-            return false;
-        }
-        try {
-            String mimeTypesXml = Files.toString(path, Charsets.UTF_8);
-            MimeTypesVersion mimeTypesVersion = MimeTypesVersion.findVersion(mimeTypesXml);
-            return !mimeTypesVersion.isCurrent();
-        } catch (Exception e) {
-            throw new RuntimeException("Failed to execute mimetypes conversion", e);
-
-        }
-    }
-
-    @Override
-    public void backup() {
-        File mimeTypeFile = path;
-        File mimeTypeBackupFile = new File(path.getAbsolutePath() + ".back");
-        try {
-            if (mimeTypeBackupFile.exists()) {
-                FileUtils.forceDelete(mimeTypeBackupFile);
-            }
-            FileUtils.copyFile(mimeTypeFile, mimeTypeBackupFile);
-        } catch (Exception e) {
-            throw new RuntimeException(
-                    "Fail to save backup file '" + mimeTypeBackupFile.getAbsolutePath() + "' from the login file: '" + mimeTypeFile.getAbsolutePath() + "'",
-                    e);
-        }
-    }
-
-    @Override
-    public void clean() {
-        File mimeTypeBackupFile = new File(path.getAbsolutePath() + ".back");
-        try {
-            if (mimeTypeBackupFile.exists()) {
-                FileUtils.forceDelete(mimeTypeBackupFile);
-            }
-        } catch (Exception e) {
-            throw new RuntimeException(
-                    "Fail to clean backup file '" + mimeTypeBackupFile.getAbsolutePath() +
-                            "' after success conversion'", e);
-        }
-    }
-
-    @Override
-    public void revert() {
-        File mimeTypeFile = path;
-        File mimeTypeBackupFile = new File(path.getAbsolutePath() + ".back");
-        try {
-            if (mimeTypeBackupFile.exists()) {
-                if (mimeTypeFile.exists()) {
-                    FileUtils.forceDelete(mimeTypeFile);
-                }
-                FileUtils.moveFile(mimeTypeBackupFile, mimeTypeFile);
-            }
-        } catch (Exception e) {
-            throw new RuntimeException("Fail to revert conversion", e);
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/converters/VersionProvider.java b/base/config/src/main/java/org/artifactory/converters/VersionProvider.java
deleted file mode 100644
index 7756767..0000000
--- a/base/config/src/main/java/org/artifactory/converters/VersionProvider.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.converters;
-
-import org.artifactory.version.CompoundVersionDetails;
-
-/**
- * @author Gidi Shabat
- */
-public interface VersionProvider {
-    public CompoundVersionDetails getRunning();
-
-    CompoundVersionDetails getOriginalHa();
-
-    CompoundVersionDetails getOriginalHome();
-
-    CompoundVersionDetails getOriginalDatabaseVersion();
-
-    public boolean isOriginalDatabaseVersionReady();
-
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/Descriptor.java b/base/config/src/main/java/org/artifactory/descriptor/Descriptor.java
deleted file mode 100644
index cf92776..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/Descriptor.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor;
-
-import java.io.Serializable;
-
-/**
- * @author yoavl
- */
-public interface Descriptor extends Serializable {
-    String NS = "http://artifactory.jfrog.org/xsd/1.7.4";
-    String LOCATION = "http://www.jfrog.org/xsd/artifactory-v1_7_4.xsd";
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/DescriptorAware.java b/base/config/src/main/java/org/artifactory/descriptor/DescriptorAware.java
deleted file mode 100644
index 24351f9..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/DescriptorAware.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor;
-
-/**
- * @author Yoav Landman
- */
-public interface DescriptorAware<T extends Descriptor> {
-
-    void setDescriptor(T descriptor);
-
-    T getDescriptor();
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/TaskDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/TaskDescriptor.java
deleted file mode 100644
index c35f6d6..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/TaskDescriptor.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor;
-
-/**
- * User: freds
- * Date: 7/10/11
- * Time: 5:08 PM
- */
-public interface TaskDescriptor extends Descriptor {
-    boolean sameTaskDefinition(TaskDescriptor otherDescriptor);
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/addon/AddonSettings.java b/base/config/src/main/java/org/artifactory/descriptor/addon/AddonSettings.java
deleted file mode 100644
index 33974dd..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/addon/AddonSettings.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.addon;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * The descriptor of the mail server configuration
- */
- at XmlType(name = "AddonsType", propOrder = {"showAddonsInfo", "showAddonsInfoCookie"},
-        namespace = Descriptor.NS)
-public class AddonSettings implements Descriptor {
-
-    private boolean showAddonsInfo;
-    private String showAddonsInfoCookie;
-
-    public AddonSettings() {
-        showAddonsInfo = true;
-        showAddonsInfoCookie = System.currentTimeMillis() + "";
-    }
-
-    public boolean isShowAddonsInfo() {
-        return showAddonsInfo;
-    }
-
-    public void setShowAddonsInfo(boolean showAddonsInfo) {
-        this.showAddonsInfo = showAddonsInfo;
-    }
-
-    public String getShowAddonsInfoCookie() {
-        return showAddonsInfoCookie;
-    }
-
-    public void setShowAddonsInfoCookie(String showAddonsInfoCookie) {
-        this.showAddonsInfoCookie = showAddonsInfoCookie;
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/addon/package-info.java b/base/config/src/main/java/org/artifactory/descriptor/addon/package-info.java
deleted file mode 100644
index fde5c0e..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/addon/package-info.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
- at XmlSchema(namespace = Descriptor.NS,
-        elementFormDefault = XmlNsForm.QUALIFIED)
- at XmlAccessorType(XmlAccessType.FIELD) package org.artifactory.descriptor.addon;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlNsForm;
-import javax.xml.bind.annotation.XmlSchema;
diff --git a/base/config/src/main/java/org/artifactory/descriptor/backup/BackupDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/backup/BackupDescriptor.java
deleted file mode 100644
index afce977..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/backup/BackupDescriptor.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.backup;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.descriptor.TaskDescriptor;
-import org.artifactory.descriptor.repo.RealRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlID;
-import javax.xml.bind.annotation.XmlIDREF;
-import javax.xml.bind.annotation.XmlType;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
- at XmlType(name = "BackupType", propOrder = {"key", "enabled", "dir", "cronExp", "retentionPeriodHours", "createArchive",
-        "excludedRepositories", "sendMailOnError", "excludeBuilds", "excludeNewRepositories"},
-        namespace = Descriptor.NS)
-public class BackupDescriptor implements TaskDescriptor {
-
-    private static final long serialVersionUID = 1L;
-
-    public static final int DEFAULT_RETENTION_PERIOD_HOURS = 168;//7 days
-
-    @XmlID
-    @XmlElement(required = true)
-    private String key;
-
-    @XmlElement(defaultValue = "true")
-    private boolean enabled = true;
-
-    @XmlElement(required = true)
-    private String cronExp;
-
-    private File dir;
-
-    @XmlElement(defaultValue = DEFAULT_RETENTION_PERIOD_HOURS + "")
-    private int retentionPeriodHours = DEFAULT_RETENTION_PERIOD_HOURS;
-
-    @XmlElement(defaultValue = "false")
-    private boolean createArchive;
-
-    @XmlIDREF
-    @XmlElementWrapper(name = "excludedRepositories")
-    @XmlElement(name = "repositoryRef", type = RealRepoDescriptor.class, required = false)
-    private List<RealRepoDescriptor> excludedRepositories = new ArrayList<>();
-
-    @XmlElement(defaultValue = "true")
-    private boolean sendMailOnError = true;
-
-    @XmlElement(defaultValue = "false")
-    private boolean excludeBuilds = false;
-
-    @XmlElement(defaultValue = "false")
-    private boolean excludeNewRepositories = false;
-
-    public String getKey() {
-        return key;
-    }
-
-    public void setKey(String key) {
-        this.key = key;
-    }
-
-    public boolean isEnabled() {
-        return enabled;
-    }
-
-    public void setEnabled(boolean enabled) {
-        this.enabled = enabled;
-    }
-
-    public File getDir() {
-        return dir;
-    }
-
-    public void setDir(File dir) {
-        this.dir = dir;
-    }
-
-    public String getCronExp() {
-        return cronExp;
-    }
-
-    public void setCronExp(String cronExp) {
-        this.cronExp = cronExp;
-    }
-
-    public int getRetentionPeriodHours() {
-        return retentionPeriodHours;
-    }
-
-    public void setRetentionPeriodHours(int retentionPeriodHours) {
-        this.retentionPeriodHours = retentionPeriodHours;
-    }
-
-    public boolean isCreateArchive() {
-        return createArchive;
-    }
-
-    public void setCreateArchive(boolean createArchive) {
-        this.createArchive = createArchive;
-    }
-
-    @SuppressWarnings({"unchecked"})
-    public List<RealRepoDescriptor> getExcludedRepositories() {
-        /**
-         * Even though there should not be any virtual repos in the list, it is checked again as a safety net
-         * ATTENTION: Don't use generics list it will generate a ClassCastException
-         */
-        List erased = new ArrayList(excludedRepositories);
-        for (int i = 0; i < erased.size(); i++) {
-            Object anErased = erased.get(i);
-            RepoDescriptor descriptorToCheck = (RepoDescriptor) anErased;
-            if (!descriptorToCheck.isReal()) {
-                String virtualRepoKey = descriptorToCheck.getKey();
-                List<RepoDescriptor> repositories = ((VirtualRepoDescriptor) descriptorToCheck).getRepositories();
-                for (RepoDescriptor descriptor : repositories) {
-                    if ((descriptor.isReal()) || (virtualRepoKey.contains(descriptor.getKey()))) {
-                        excludedRepositories.set(i, (RealRepoDescriptor) descriptor);
-                    }
-                }
-            }
-        }
-        return excludedRepositories;
-    }
-
-    public void setExcludedRepositories(List<RealRepoDescriptor> excludedRepositories) {
-        this.excludedRepositories = excludedRepositories;
-    }
-
-    public boolean removeExcludedRepository(RealRepoDescriptor realRepo) {
-        return excludedRepositories.remove(realRepo);
-    }
-
-    public boolean addExcludedRepository(RealRepoDescriptor realRepo) {
-        return excludeNewRepositories && excludedRepositories.add(realRepo);
-    }
-
-    public boolean isIncremental() {
-        return (retentionPeriodHours <= 0) && !isCreateArchive();
-    }
-
-    public boolean isSendMailOnError() {
-        return sendMailOnError;
-    }
-
-    public void setSendMailOnError(boolean sendMailOnError) {
-        this.sendMailOnError = sendMailOnError;
-    }
-
-    public boolean isExcludeBuilds() {
-        return excludeBuilds;
-    }
-
-    public void setExcludeBuilds(boolean excludeBuilds) {
-        this.excludeBuilds = excludeBuilds;
-    }
-
-    public boolean isExcludeNewRepositories() {
-        return excludeNewRepositories;
-    }
-
-    public void setExcludeNewRepositories(boolean excludeNewRepositories) {
-        this.excludeNewRepositories = excludeNewRepositories;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof BackupDescriptor)) {
-            return false;
-        }
-
-        BackupDescriptor that = (BackupDescriptor) o;
-
-        if (key != null ? !key.equals(that.key) : that.key != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return key != null ? key.hashCode() : 0;
-    }
-
-    @Override
-    public boolean sameTaskDefinition(TaskDescriptor otherDescriptor) {
-        if (otherDescriptor == null || !(otherDescriptor instanceof BackupDescriptor)) {
-            throw new IllegalArgumentException("Cannot compare backup descriptor " + this + " with " + otherDescriptor);
-        }
-        BackupDescriptor backupDesc = (BackupDescriptor) otherDescriptor;
-        return backupDesc.enabled == this.enabled &&
-                StringUtils.equals(backupDesc.key, this.key) &&
-                StringUtils.equals(backupDesc.cronExp, this.cronExp);
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/backup/package-info.java b/base/config/src/main/java/org/artifactory/descriptor/backup/package-info.java
deleted file mode 100644
index 8113640..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/backup/package-info.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
- at XmlSchema(namespace = Descriptor.NS,
-        elementFormDefault = XmlNsForm.QUALIFIED)
- at XmlAccessorType(XmlAccessType.FIELD) package org.artifactory.descriptor.backup;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlNsForm;
-import javax.xml.bind.annotation.XmlSchema;
diff --git a/base/config/src/main/java/org/artifactory/descriptor/bintray/BintrayConfigDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/bintray/BintrayConfigDescriptor.java
deleted file mode 100644
index 9450fbd..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/bintray/BintrayConfigDescriptor.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.artifactory.descriptor.bintray;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * The Bintray global(default) user descriptor
- *
- * @author Dan Feldman
- */
- at XmlType(name = "BintrayConfigType", propOrder = {"userName", "apiKey", "fileUploadLimit"}, namespace = Descriptor.NS)
-public class BintrayConfigDescriptor implements Descriptor {
-
-    @XmlElement(required = true)
-    private String userName;
-    @XmlElement(required = true)
-    private String apiKey;
-    @XmlElement(required = true, defaultValue = "200")
-    private int fileUploadLimit = 200;
-
-
-    public String getUserName() {
-        return userName;
-    }
-
-    public void setUserName(String userName) {
-        this.userName = userName;
-    }
-
-    public String getApiKey() {
-        return apiKey;
-    }
-
-    public void setApiKey(String apiKey) {
-        this.apiKey = apiKey;
-    }
-
-    public String getBintrayAuth() {
-        if (StringUtils.isNotBlank(userName) && StringUtils.isNotBlank(apiKey)) {
-            return userName + ":" + apiKey;
-        }
-        return null;
-    }
-
-    public int getFileUploadLimit() {
-        return fileUploadLimit;
-    }
-
-    public void setFileUploadLimit(int fileUploadLimit) {
-        this.fileUploadLimit = fileUploadLimit;
-    }
-
-    public boolean globalCredentialsExist() {
-        return (StringUtils.isNotEmpty(userName)) && (StringUtils.isNotEmpty(apiKey));
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/bintray/package-info.java b/base/config/src/main/java/org/artifactory/descriptor/bintray/package-info.java
deleted file mode 100644
index 3cf78e4..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/bintray/package-info.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
- at XmlSchema(namespace = Descriptor.NS, elementFormDefault = XmlNsForm.QUALIFIED)
- at XmlAccessorType(XmlAccessType.FIELD) package org.artifactory.descriptor.bintray;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlNsForm;
-import javax.xml.bind.annotation.XmlSchema;
diff --git a/base/config/src/main/java/org/artifactory/descriptor/cleanup/CleanupConfigDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/cleanup/CleanupConfigDescriptor.java
deleted file mode 100644
index c7fcb35..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/cleanup/CleanupConfigDescriptor.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.cleanup;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.descriptor.TaskDescriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * Descriptor for the cleanup task
- *
- * @author Shay Yaakov
- */
- at XmlType(name = "CleanupConfigType", propOrder = {"cronExp"}, namespace = Descriptor.NS)
-public class CleanupConfigDescriptor implements TaskDescriptor {
-
-    @XmlElement(required = true)
-    private String cronExp;
-
-    public String getCronExp() {
-        return cronExp;
-    }
-
-    public void setCronExp(String cronExp) {
-        this.cronExp = cronExp;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof CleanupConfigDescriptor)) {
-            return false;
-        }
-
-        CleanupConfigDescriptor that = (CleanupConfigDescriptor) o;
-
-        if (!cronExp.equals(that.cronExp)) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return cronExp.hashCode();
-    }
-
-    @Override
-    public boolean sameTaskDefinition(TaskDescriptor otherDescriptor) {
-        if (otherDescriptor == null || !(otherDescriptor instanceof CleanupConfigDescriptor)) {
-            throw new IllegalArgumentException(
-                    "Cannot compare cleanup config descriptor " + this + " with " + otherDescriptor);
-        }
-        CleanupConfigDescriptor cleanupConfigDescriptor = (CleanupConfigDescriptor) otherDescriptor;
-        return StringUtils.equals(cleanupConfigDescriptor.cronExp, this.cronExp);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/cleanup/package-info.java b/base/config/src/main/java/org/artifactory/descriptor/cleanup/package-info.java
deleted file mode 100644
index 37c06a2..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/cleanup/package-info.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
- at XmlSchema(namespace = Descriptor.NS,
-        elementFormDefault = XmlNsForm.QUALIFIED,
-        location = Descriptor.LOCATION)
- at XmlAccessorType(XmlAccessType.FIELD) package org.artifactory.descriptor.cleanup;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlNsForm;
-import javax.xml.bind.annotation.XmlSchema;
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/config/CentralConfigDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/config/CentralConfigDescriptor.java
deleted file mode 100644
index fd7f8d0..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/config/CentralConfigDescriptor.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.config;
-
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.descriptor.addon.AddonSettings;
-import org.artifactory.descriptor.backup.BackupDescriptor;
-import org.artifactory.descriptor.bintray.BintrayConfigDescriptor;
-import org.artifactory.descriptor.cleanup.CleanupConfigDescriptor;
-import org.artifactory.descriptor.download.FolderDownloadConfigDescriptor;
-import org.artifactory.descriptor.external.ExternalProvidersDescriptor;
-import org.artifactory.descriptor.gc.GcConfigDescriptor;
-import org.artifactory.descriptor.index.IndexerDescriptor;
-import org.artifactory.descriptor.mail.MailServerDescriptor;
-import org.artifactory.descriptor.message.SystemMessageDescriptor;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.descriptor.quota.QuotaConfigDescriptor;
-import org.artifactory.descriptor.replication.GlobalReplicationsConfigDescriptor;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.replication.RemoteReplicationDescriptor;
-import org.artifactory.descriptor.repo.*;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.descriptor.repo.distribution.rule.DistributionRule;
-import org.artifactory.descriptor.security.SecurityDescriptor;
-import org.artifactory.descriptor.trashcan.TrashcanConfigDescriptor;
-
-import javax.annotation.Nonnull;
-import java.util.List;
-import java.util.Map;
-import java.util.TimeZone;
-
-/**
- * Immutable interface for the central config.
- *
- * @author Yossi Shaul
- */
-public interface CentralConfigDescriptor extends Descriptor {
-    TimeZone UTC_TIME_ZONE = TimeZone.getTimeZone("UTC");
-
-    Map<String, LocalRepoDescriptor> getLocalRepositoriesMap();
-
-    Map<String, RemoteRepoDescriptor> getRemoteRepositoriesMap();
-
-    Map<String, VirtualRepoDescriptor> getVirtualRepositoriesMap();
-
-    Map<String, DistributionRepoDescriptor> getDistributionRepositoriesMap();
-
-    List<ProxyDescriptor> getProxies();
-
-    ProxyDescriptor getProxy(String proxyKey);
-
-    List<ReverseProxyDescriptor> getReverseProxies();
-
-    ReverseProxyDescriptor getReverseProxy(String key);
-
-    ReverseProxyDescriptor getCurrentReverseProxy();
-
-    String getDateFormat();
-
-    int getFileUploadMaxSizeMb();
-
-    List<BackupDescriptor> getBackups();
-
-    IndexerDescriptor getIndexer();
-
-    String getServerName();
-
-    @Nonnull
-    SecurityDescriptor getSecurity();
-
-    /**
-     * @return true if the global offline mode is set.
-     */
-    boolean isOfflineMode();
-
-    boolean isHelpLinksEnabled();
-
-    ProxyDescriptor getDefaultProxy();
-
-    MailServerDescriptor getMailServer();
-
-    List<PropertySet> getPropertySets();
-
-    String getUrlBase();
-
-    AddonSettings getAddons();
-
-    String getLogo();
-
-    SystemMessageDescriptor getSystemMessageConfig();
-
-    FolderDownloadConfigDescriptor getFolderDownloadConfig();
-
-    TrashcanConfigDescriptor getTrashcanConfig();
-
-    String getFooter();
-
-    List<RepoLayout> getRepoLayouts();
-
-    RepoLayout getRepoLayout(String repoLayoutName);
-
-    List<RemoteReplicationDescriptor> getRemoteReplications();
-
-    List<LocalReplicationDescriptor> getLocalReplications();
-
-    RemoteReplicationDescriptor getRemoteReplication(String replicatedRepoKey);
-
-    LocalReplicationDescriptor getLocalReplication(String replicatedRepoKey, String replicateRepoUrl);
-
-    LocalReplicationDescriptor getLocalReplication(String replicatedRepoKey);
-
-    LocalReplicationDescriptor getEnabledLocalReplication(String replicatedRepoKey);
-
-    int getTotalNumOfActiveLocalReplication(String replicatedRepoKey);
-
-    GcConfigDescriptor getGcConfig();
-
-    boolean isMultiPushConfigureForThisRepo(String repoKey);
-
-    /**
-     * Normalizes the Artifactory's server URL set in the mail server config; falls back to the server URL set in the
-     * general config if none is defined under the mail settings. For use within the contents of e-mails
-     *
-     * @return Artifactory server URL
-     */
-    String getServerUrlForEmail();
-
-    CleanupConfigDescriptor getCleanupConfig();
-
-    CleanupConfigDescriptor getVirtualCacheCleanupConfig();
-
-    QuotaConfigDescriptor getQuotaConfig();
-
-    Map<String, LocalReplicationDescriptor> getLocalReplicationsMap();
-
-    Map<String, LocalReplicationDescriptor> getSingleReplicationPerRepoMap();
-
-    Map<String, LocalReplicationDescriptor> getLocalReplicationsPerRepoMap(String repoName);
-
-    Map<String, RemoteReplicationDescriptor> getRemoteReplicationsPerRepoMap(String repoName);
-
-    List<String> getLocalReplicationsUniqueKeyForProperty(String repoName);
-
-    ExternalProvidersDescriptor getExternalProvidersDescriptor();
-
-    BintrayConfigDescriptor getBintrayConfig();
-
-    List<LocalReplicationDescriptor> getMultiLocalReplications(String repoKey);
-
-    GlobalReplicationsConfigDescriptor getReplicationsConfig();
-
-    Map<String, BintrayApplicationConfig> getBintrayApplications();
-
-    BintrayApplicationConfig getBintrayApplication(String bintrayApplicationKey);
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/config/CentralConfigDescriptorImpl.java b/base/config/src/main/java/org/artifactory/descriptor/config/CentralConfigDescriptorImpl.java
deleted file mode 100644
index 1de9eae..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/config/CentralConfigDescriptorImpl.java
+++ /dev/null
@@ -1,1348 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.config;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.descriptor.addon.AddonSettings;
-import org.artifactory.descriptor.backup.BackupDescriptor;
-import org.artifactory.descriptor.bintray.BintrayConfigDescriptor;
-import org.artifactory.descriptor.cleanup.CleanupConfigDescriptor;
-import org.artifactory.descriptor.download.FolderDownloadConfigDescriptor;
-import org.artifactory.descriptor.external.BlackDuckSettingsDescriptor;
-import org.artifactory.descriptor.external.ExternalProvidersDescriptor;
-import org.artifactory.descriptor.gc.GcConfigDescriptor;
-import org.artifactory.descriptor.index.IndexerDescriptor;
-import org.artifactory.descriptor.mail.MailServerDescriptor;
-import org.artifactory.descriptor.message.SystemMessageDescriptor;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.descriptor.quota.QuotaConfigDescriptor;
-import org.artifactory.descriptor.replication.GlobalReplicationsConfigDescriptor;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.replication.RemoteReplicationDescriptor;
-import org.artifactory.descriptor.replication.ReplicationBaseDescriptor;
-import org.artifactory.descriptor.repo.*;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.descriptor.repo.jaxb.*;
-import org.artifactory.descriptor.security.SecurityDescriptor;
-import org.artifactory.descriptor.trashcan.TrashcanConfigDescriptor;
-import org.artifactory.util.*;
-import org.artifactory.util.stream.BiOptional;
-
-import javax.annotation.Nullable;
-import javax.xml.bind.annotation.*;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import java.util.*;
-
- at XmlRootElement(name = "config")
- at XmlType(name = "CentralConfigType",
-        propOrder = {"serverName", "offlineMode", "helpLinksEnabled", "fileUploadMaxSizeMb", "dateFormat", "addons", "mailServer",
-                "bintrayConfig", "security", "backups", "indexer", "localRepositoriesMap", "remoteRepositoriesMap",
-                "virtualRepositoriesMap", "distributionRepositoriesMap", "proxies", "reverseProxies", "propertySets",
-                "urlBase", "logo", "footer", "repoLayouts", "remoteReplications", "localReplications", "gcConfig",
-                "cleanupConfig", "virtualCacheCleanupConfig", "quotaConfig", "externalProviders", "systemMessageConfig",
-                "folderDownloadConfig", "trashcanConfig", "replicationsConfig", "bintrayApplications"},
-        namespace = Descriptor.NS)
- at XmlAccessorType(XmlAccessType.FIELD)
-public class CentralConfigDescriptorImpl implements MutableCentralConfigDescriptor {
-
-    public static final String DEFAULT_DATE_FORMAT = "dd-MM-yy HH:mm:ss z";
-
-    @XmlElement(name = "localRepositories", required = true)
-    @XmlJavaTypeAdapter(LocalRepositoriesMapAdapter.class)
-    private Map<String, LocalRepoDescriptor> localRepositoriesMap = Maps.newLinkedHashMap();
-
-    @XmlElement(name = "remoteRepositories", required = false)
-    @XmlJavaTypeAdapter(RemoteRepositoriesMapAdapter.class)
-    private Map<String, RemoteRepoDescriptor> remoteRepositoriesMap = Maps.newLinkedHashMap();
-
-    @XmlElement(name = "virtualRepositories", required = false)
-    @XmlJavaTypeAdapter(VirtualRepositoriesMapAdapter.class)
-    private Map<String, VirtualRepoDescriptor> virtualRepositoriesMap = Maps.newLinkedHashMap();
-
-    @XmlElement(name = "distributionRepositories", required = false)
-    @XmlJavaTypeAdapter(DistributionRepositoriesMapAdapter.class)
-    private Map<String, DistributionRepoDescriptor> distributionRepositoriesMap = Maps.newLinkedHashMap();
-
-    @XmlElementWrapper(name = "proxies")
-    @XmlElement(name = "proxy", required = false)
-    private List<ProxyDescriptor> proxies = new ArrayList<>();
-
-    @XmlElementWrapper(name = "reverseProxies")
-    @XmlElement(name = "reverseProxy", required = false)
-    private List<ReverseProxyDescriptor> reverseProxies = new ArrayList<>();
-
-    @XmlElement(defaultValue = DEFAULT_DATE_FORMAT)
-    private String dateFormat = DEFAULT_DATE_FORMAT;
-
-    @XmlElement(defaultValue = "100", required = false)
-    private int fileUploadMaxSizeMb = 100;
-
-    @XmlElementWrapper(name = "backups")
-    @XmlElement(name = "backup", required = false)
-    private List<BackupDescriptor> backups = new ArrayList<>();
-
-    private IndexerDescriptor indexer;
-
-    @XmlElement
-    private GlobalReplicationsConfigDescriptor replicationsConfig = new GlobalReplicationsConfigDescriptor();
-
-    /**
-     * A name uniquely identifying this artifactory server instance
-     */
-    @XmlElement
-    private String serverName;
-
-    /**
-     * if this flag is set all the remote repos will work in offline mode
-     */
-    @XmlElement(defaultValue = "false", required = false)
-    private boolean offlineMode;
-
-    @XmlElement
-    private boolean helpLinksEnabled = true;
-
-    private AddonSettings addons = new AddonSettings();
-
-    private MailServerDescriptor mailServer;
-
-    /**
-     * security might not be present in the xml but we always want to create it
-     */
-    @XmlElement
-    private SecurityDescriptor security = new SecurityDescriptor();
-
-    @XmlElementWrapper(name = "propertySets")
-    @XmlElement(name = "propertySet", required = false)
-    private List<PropertySet> propertySets = new ArrayList<>();
-
-    @XmlElement
-    private String urlBase;
-
-    @XmlElement
-    private String logo;
-
-    @XmlElement
-    private SystemMessageDescriptor systemMessageConfig;
-
-    @XmlElement
-    private FolderDownloadConfigDescriptor folderDownloadConfig;
-
-    @XmlElement
-    private String footer;
-
-    @XmlElementWrapper(name = "repoLayouts")
-    @XmlElement(name = "repoLayout", required = false)
-    private List<RepoLayout> repoLayouts = Lists.newArrayList();
-
-    @XmlElementWrapper(name = "remoteReplications")
-    @XmlElement(name = "remoteReplication", required = false)
-    private List<RemoteReplicationDescriptor> remoteReplications = Lists.newArrayList();
-
-    @XmlElementWrapper(name = "localReplications")
-    @XmlElement(name = "localReplication", required = false)
-    private List<LocalReplicationDescriptor> localReplications = Lists.newArrayList();
-
-    @XmlElement
-    private GcConfigDescriptor gcConfig;
-
-    @XmlElement
-    private CleanupConfigDescriptor cleanupConfig;
-
-    @XmlElement
-    private CleanupConfigDescriptor virtualCacheCleanupConfig;
-
-    @XmlElement
-    private ExternalProvidersDescriptor externalProviders;
-
-    @XmlElement
-    private BintrayConfigDescriptor bintrayConfig;
-
-    private QuotaConfigDescriptor quotaConfig;
-
-    @XmlElement
-    private TrashcanConfigDescriptor trashcanConfig = new TrashcanConfigDescriptor();
-
-    @XmlJavaTypeAdapter(BintrayApplicationConfigsMapAdapter.class)
-    @XmlElement(name = "bintrayApplications", required = false)
-    private Map<String, BintrayApplicationConfig> bintrayApplications = new HashMap<>();
-
-    @Override
-    public Map<String, LocalRepoDescriptor> getLocalRepositoriesMap() {
-        return localRepositoriesMap;
-    }
-
-    @Override
-    public void setLocalRepositoriesMap(Map<String, LocalRepoDescriptor> localRepositoriesMap) {
-        this.localRepositoriesMap = localRepositoriesMap;
-    }
-
-    @Override
-    public Map<String, RemoteRepoDescriptor> getRemoteRepositoriesMap() {
-        return remoteRepositoriesMap;
-    }
-
-    @Override
-    public void setRemoteRepositoriesMap(Map<String, RemoteRepoDescriptor> remoteRepositoriesMap) {
-        this.remoteRepositoriesMap = remoteRepositoriesMap;
-    }
-
-    @Override
-    public Map<String, VirtualRepoDescriptor> getVirtualRepositoriesMap() {
-        return virtualRepositoriesMap;
-    }
-
-    @Override
-    public void setVirtualRepositoriesMap(Map<String, VirtualRepoDescriptor> virtualRepositoriesMap) {
-        this.virtualRepositoriesMap = virtualRepositoriesMap;
-    }
-
-    @Override
-    public Map<String, DistributionRepoDescriptor> getDistributionRepositoriesMap() {
-        return distributionRepositoriesMap;
-    }
-
-    @Override
-    public void setDistributionRepositoriesMap(Map<String, DistributionRepoDescriptor> distributionRepositoriesMap) {
-        this.distributionRepositoriesMap = distributionRepositoriesMap;
-    }
-
-    @Override
-    public List<ProxyDescriptor> getProxies() {
-        return proxies;
-    }
-
-    @Override
-    public void setProxies(List<ProxyDescriptor> proxies) {
-        this.proxies = proxies;
-    }
-
-    @Override
-    public List<ReverseProxyDescriptor> getReverseProxies() {
-        return reverseProxies;
-    }
-
-    @Override
-    public void setReverseProxies(List<ReverseProxyDescriptor> reverseProxies) {
-        this.reverseProxies = reverseProxies;
-    }
-
-    @Override
-    public ProxyDescriptor getDefaultProxy() {
-        for (ProxyDescriptor proxy : proxies) {
-            if (proxy.isDefaultProxy()) {
-                return proxy;
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public String getDateFormat() {
-        return dateFormat;
-    }
-
-    @Override
-    public void setDateFormat(String dateFormat) {
-        this.dateFormat = dateFormat;
-    }
-
-    @Override
-    public int getFileUploadMaxSizeMb() {
-        return fileUploadMaxSizeMb;
-    }
-
-    @Override
-    public void setFileUploadMaxSizeMb(int fileUploadMaxSizeMb) {
-        this.fileUploadMaxSizeMb = fileUploadMaxSizeMb;
-    }
-
-    @Override
-    public List<BackupDescriptor> getBackups() {
-        return backups;
-    }
-
-    @Override
-    public void setBackups(List<BackupDescriptor> backups) {
-        this.backups = backups;
-    }
-
-    @Override
-    public IndexerDescriptor getIndexer() {
-        return indexer;
-    }
-
-    @Override
-    public void setIndexer(IndexerDescriptor mavenIndexer) {
-        this.indexer = mavenIndexer;
-    }
-
-    @Override
-    public String getServerName() {
-        return serverName;
-    }
-
-    @Override
-    public void setServerName(String serverName) {
-        this.serverName = StringUtils.stripToNull(serverName);
-    }
-
-    @Override
-    public SecurityDescriptor getSecurity() {
-        return security;
-    }
-
-    @Override
-    public void setSecurity(SecurityDescriptor security) {
-        if (security == null) {
-            security = new SecurityDescriptor();
-        }
-        this.security = security;
-    }
-
-    @Override
-    public AddonSettings getAddons() {
-        return addons;
-    }
-
-    @Override
-    public void setAddons(AddonSettings addons) {
-        this.addons = addons;
-    }
-
-    @Override
-    public MailServerDescriptor getMailServer() {
-        return mailServer;
-    }
-
-    @Override
-    public void setMailServer(MailServerDescriptor mailServer) {
-        this.mailServer = mailServer;
-    }
-
-    @Override
-    public List<PropertySet> getPropertySets() {
-        return propertySets;
-    }
-
-    @Override
-    public void setPropertySets(List<PropertySet> propertySets) {
-        this.propertySets = propertySets;
-    }
-
-    @Override
-    public String getUrlBase() {
-        return urlBase;
-    }
-
-    @Override
-    public void setUrlBase(String urlBase) {
-        this.urlBase = PathUtils.trimTrailingSlashes(urlBase);
-    }
-
-    @Override
-    public RepoDescriptor removeRepository(String repoKey) {
-        // first remove the repository itself
-        RepoDescriptor removedRepo = localRepositoriesMap.remove(repoKey);
-        if (removedRepo == null) {
-            removedRepo = remoteRepositoriesMap.remove(repoKey);
-        }
-        if (removedRepo == null) {
-            removedRepo = virtualRepositoriesMap.remove(repoKey);
-        }
-        if (removedRepo == null) {
-            removedRepo = distributionRepositoriesMap.remove(repoKey);
-        }
-        if (removedRepo == null) {
-            // not found - finish
-            return null;
-        }
-
-        // remove from any virtual repository
-        for (VirtualRepoDescriptor virtualRepoDescriptor : virtualRepositoriesMap.values()) {
-            virtualRepoDescriptor.removeRepository(removedRepo);
-        }
-
-        if (removedRepo instanceof RealRepoDescriptor) {
-            // remove the repository from any backup exclude list
-            for (BackupDescriptor backup : getBackups()) {
-                backup.removeExcludedRepository((RealRepoDescriptor) removedRepo);
-            }
-        }
-
-        if (removedRepo instanceof RepoBaseDescriptor) {
-            // remove from the indexer include list
-            IndexerDescriptor indexer = getIndexer();
-            if (indexer != null) {
-                indexer.removeIncludedRepository((RepoBaseDescriptor) removedRepo);
-            }
-        }
-
-        if (removedRepo instanceof HttpRepoDescriptor) {
-            RemoteReplicationDescriptor existingReplication = getRemoteReplication(removedRepo.getKey());
-            if (existingReplication != null) {
-                removeRemoteReplication(existingReplication);
-            }
-        }
-
-        if (removedRepo instanceof LocalRepoDescriptor) {
-            List<LocalReplicationDescriptor> existingReplications = getMultiLocalReplications(removedRepo.getKey());
-            if (existingReplications != null && !existingReplications.isEmpty()) {
-                existingReplications.forEach(replication -> removeLocalReplication(replication));
-            }
-        }
-
-        //Remove this repo's Bintray OAuth App config from descriptor if it's not used by any other repo.
-        if (removedRepo instanceof DistributionRepoDescriptor) {
-            BintrayApplicationConfig btAppConfig = ((DistributionRepoDescriptor) removedRepo).getBintrayApplication();
-            if (btAppConfig != null) {
-                String btConfigKey = btAppConfig.getKey();
-                BiOptional.of(distributionRepositoriesMap.values().stream()
-                        .map(DistributionRepoDescriptor::getBintrayApplication)
-                        .filter(Objects::nonNull)
-                        .filter(btApp -> btConfigKey.equals(btApp.getKey()))
-                        .findAny())
-                        .ifNotPresent(() -> bintrayApplications.remove(btConfigKey));
-            }
-        }
-
-        //Remove repo's reverse proxy config
-        getReverseProxies().stream()
-                .forEach(reverseProxyDescriptor -> reverseProxyDescriptor.deleteReverseProxyConfig(repoKey));
-
-        return removedRepo;
-    }
-
-
-    @Override
-    public String getFooter() {
-        return footer;
-    }
-
-    public void setFooter(String footer) {
-        this.footer = footer;
-    }
-
-    @Override
-    public boolean isKeyAvailable(String key) {
-        return !(VirtualRepoDescriptor.GLOBAL_VIRTUAL_REPO_KEY.equals(key) ||
-                isRepositoryExists(key) ||
-                isProxyExists(key) ||
-                isBackupExists(key) ||
-                isLdapExists(key) ||
-                isPropertySetExists(key) ||
-                isRepoLayoutExists(key));
-    }
-
-    @Override
-    public boolean isRepositoryExists(String repoKey) {
-        return containsKeyIgnoreCase(localRepositoriesMap, repoKey)
-                || containsKeyIgnoreCase(remoteRepositoriesMap, repoKey)
-                || containsKeyIgnoreCase(virtualRepositoriesMap, repoKey)
-                || containsKeyIgnoreCase(distributionRepositoriesMap, repoKey);
-    }
-
-    private boolean containsKeyIgnoreCase(Map map, String repoKey) {
-
-        Set<String> keys = map.keySet();
-        for (String key : keys) {
-            if (key.compareToIgnoreCase(repoKey) == 0) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    @Override
-    public void addLocalRepository(LocalRepoDescriptor localRepoDescriptor)
-            throws AlreadyExistsException {
-        String repoKey = localRepoDescriptor.getKey();
-        //Case insenesitive check was added to RestAddonImpl when getting request to create repo
-        //  repoKeyExists(repoKey, false);
-        checkIfKeyLowerCase(localRepoDescriptor);
-        localRepositoriesMap.put(repoKey, localRepoDescriptor);
-    }
-
-    @Override
-    public void addRemoteRepository(RemoteRepoDescriptor remoteRepoDescriptor) {
-        String repoKey = remoteRepoDescriptor.getKey();
-        //Case insenesitive check was added to RestAddonImpl when getting request to create repo
-        //    repoKeyExists(repoKey, false);
-        checkIfKeyLowerCase(remoteRepoDescriptor);
-        remoteRepositoriesMap.put(repoKey, remoteRepoDescriptor);
-        conditionallyAddToBackups(remoteRepoDescriptor);
-    }
-
-    @Override
-    public void addDistributionRepository(DistributionRepoDescriptor distributionRepoDescriptor)
-            throws AlreadyExistsException {
-        String repoKey = distributionRepoDescriptor.getKey();
-        repoKeyExists(repoKey, false);
-        distributionRepositoriesMap.put(repoKey, distributionRepoDescriptor);
-    }
-
-    @Override
-    public void conditionallyAddToBackups(RealRepoDescriptor remoteRepoDescriptor) {
-        // Conditionally add the repository to any backup exclude list
-        for (BackupDescriptor backup : getBackups()) {
-            backup.addExcludedRepository(remoteRepoDescriptor);
-        }
-    }
-
-    @Override
-    public void addVirtualRepository(VirtualRepoDescriptor virtualRepoDescriptor) {
-        String repoKey = virtualRepoDescriptor.getKey();
-        //Case insenesitive check was added to RestAddonImpl when getting request to create repo
-        //   repoKeyExists(repoKey, false);
-        checkIfKeyLowerCase(virtualRepoDescriptor);
-        virtualRepositoriesMap.put(repoKey, virtualRepoDescriptor);
-    }
-
-    private void checkIfKeyLowerCase(RepoBaseDescriptor descriptor) {
-        //docker repository key must be lower case in order it will work with reverse proxy
-        if (descriptor.getType().equals(RepoType.Docker)) {
-            String repoKey = descriptor.getKey();
-            if (!repoKey.equals(repoKey.toLowerCase())) {
-                throw new InvalidNameException("Docker Repository " + repoKey + " must be in lower case");
-            }
-        }
-    }
-
-    @Override
-    public boolean isProxyExists(String proxyKey) {
-        return getProxy(proxyKey) != null;
-    }
-
-    @Override
-    public void addProxy(ProxyDescriptor proxyDescriptor, boolean defaultForAllRemoteRepo) {
-        String proxyKey = proxyDescriptor.getKey();
-        if (isProxyExists(proxyKey)) {
-            throw new AlreadyExistsException("Proxy " + proxyKey + " already exists");
-        }
-        if (proxyDescriptor.isDefaultProxy()) {
-            proxyChanged(proxyDescriptor, defaultForAllRemoteRepo);
-            // remove default flag from other existing proxy if exist
-            for (ProxyDescriptor proxy : proxies) {
-                proxy.setDefaultProxy(false);
-            }
-        }
-        proxies.add(proxyDescriptor);
-    }
-
-    @Override
-    public ProxyDescriptor removeProxy(String proxyKey) {
-        ProxyDescriptor proxyDescriptor = getProxy(proxyKey);
-        if (proxyDescriptor == null) {
-            return null;
-        }
-
-        // remove the proxy from the proxies list
-        proxies.remove(proxyDescriptor);
-
-        // remove references from all remote repositories
-        for (RemoteRepoDescriptor remoteRepo : remoteRepositoriesMap.values()) {
-            if (remoteRepo instanceof HttpRepoDescriptor) {
-                if (((HttpRepoDescriptor) remoteRepo).getProxy() != null
-                        && ((HttpRepoDescriptor) remoteRepo).getProxy().getKey().equals(proxyKey)) {
-                    ((HttpRepoDescriptor) remoteRepo).setProxy(null);
-                }
-            }
-        }
-
-        for (LocalReplicationDescriptor localReplication : localReplications) {
-            localReplication.setProxy(null);
-        }
-
-        ExternalProvidersDescriptor externalProvidersDescriptor = getExternalProvidersDescriptor();
-        if (externalProvidersDescriptor != null) {
-            BlackDuckSettingsDescriptor blackDuckSettingsDescriptor = externalProvidersDescriptor.getBlackDuckSettingsDescriptor();
-            if (blackDuckSettingsDescriptor != null && blackDuckSettingsDescriptor.getProxy() != null
-                    && blackDuckSettingsDescriptor.getProxy().getKey().equals(proxyKey)) {
-                blackDuckSettingsDescriptor.setProxy(null);
-            }
-        }
-
-        return proxyDescriptor;
-    }
-
-    @Override
-    public boolean isReverseProxyExists(String key) {
-        return getReverseProxy(key) != null;
-    }
-
-    @Override
-    public void addReverseProxy(ReverseProxyDescriptor descriptor) {
-        String proxyKey = descriptor.getKey();
-        if (isReverseProxyExists(proxyKey)) {
-            throw new AlreadyExistsException("Reverse Proxy " + proxyKey + " already exists");
-        }
-        reverseProxies.add(descriptor);
-    }
-
-    @Override
-    public void updateReverseProxy(ReverseProxyDescriptor descriptor) {
-        if (descriptor != null) {
-            removeCurrentReverseProxy();
-            addReverseProxy(descriptor);
-        }
-    }
-
-    @Override
-    public ReverseProxyDescriptor removeReverseProxy(String key) {
-        ReverseProxyDescriptor reverseProxy = getReverseProxy(key);
-        if (reverseProxy == null) {
-            return null;
-        }
-
-        reverseProxies.remove(reverseProxy);
-        return reverseProxy;
-    }
-
-    @Override
-    public void removeCurrentReverseProxy() {
-        if (!reverseProxies.isEmpty()) {
-            reverseProxies.clear();
-        }
-    }
-
-    @Override
-    public void proxyChanged(ProxyDescriptor proxy, boolean updateExistingRepos) {
-        if (proxy.isDefaultProxy()) {
-            if (updateExistingRepos) {
-                updateExistingRepos(proxy);
-                updateExistingLocalReplications(proxy);
-            }
-            //Unset the previous default if any
-            for (ProxyDescriptor proxyDescriptor : proxies) {
-                if (!proxy.equals(proxyDescriptor)) {
-                    proxyDescriptor.setDefaultProxy(false);
-                }
-            }
-        }
-    }
-
-    private void updateExistingRepos(ProxyDescriptor proxy) {
-        ProxyDescriptor previousDefaultProxy = findPreviousProxyDescriptor(proxy);
-        for (RemoteRepoDescriptor remoteRepoDescriptor : remoteRepositoriesMap.values()) {
-            if (remoteRepoDescriptor instanceof HttpRepoDescriptor) {
-                HttpRepoDescriptor httpRepoDescriptor = (HttpRepoDescriptor) remoteRepoDescriptor;
-                ProxyDescriptor existingRepoProxy = httpRepoDescriptor.getProxy();
-                // if the repo doesn't have a proxy, or it is the previous default proxy configured then override it.
-                if (existingRepoProxy == null || existingRepoProxy.equals(previousDefaultProxy)) {
-                    httpRepoDescriptor.setProxy(proxy);
-                }
-            }
-        }
-        for (DistributionRepoDescriptor distRepoDescriptor : distributionRepositoriesMap.values()) {
-            ProxyDescriptor existingRepoProxy = distRepoDescriptor.getProxy();
-            // if the repo doesn't have a proxy, or it is the previous default proxy configured then override it.
-            if (existingRepoProxy == null || existingRepoProxy.equals(previousDefaultProxy)) {
-                distRepoDescriptor.setProxy(proxy);
-            }
-        }
-    }
-
-    private void updateExistingLocalReplications(ProxyDescriptor proxy) {
-        ProxyDescriptor previousDefaultProxy = findPreviousProxyDescriptor(proxy);
-        for (LocalReplicationDescriptor localReplication : localReplications) {
-            ProxyDescriptor existingProxy = localReplication.getProxy();
-            if (existingProxy == null || existingProxy.equals(previousDefaultProxy)) {
-                localReplication.setProxy(proxy);
-            }
-        }
-    }
-
-    private ProxyDescriptor findPreviousProxyDescriptor(final ProxyDescriptor proxyDescriptor) {
-        return Iterables.find(proxies, new Predicate<ProxyDescriptor>() {
-            @Override
-            public boolean apply(@Nullable ProxyDescriptor input) {
-                return (input != null) && input.isDefaultProxy() && !input.getKey().equals(proxyDescriptor.getKey());
-            }
-        }, null);
-    }
-
-    @Override
-    public boolean isBackupExists(String backupKey) {
-        return getBackup(backupKey) != null;
-    }
-
-
-    @Override
-    public String getLogo() {
-        return logo;
-    }
-
-    @Override
-    public void setLogo(String logo) {
-        this.logo = logo;
-    }
-
-    @Override
-    public SystemMessageDescriptor getSystemMessageConfig() {
-        return systemMessageConfig;
-    }
-
-    public void setSystemMessageConfig(SystemMessageDescriptor systemMessageConfig) {
-        this.systemMessageConfig = systemMessageConfig;
-    }
-
-    @Override
-    public FolderDownloadConfigDescriptor getFolderDownloadConfig() {
-        return folderDownloadConfig;
-    }
-
-    @Override
-    public TrashcanConfigDescriptor getTrashcanConfig() {
-        return trashcanConfig;
-    }
-
-    @Override
-    public void setFolderDownloadConfig(FolderDownloadConfigDescriptor folderDownloadConfig) {
-        this.folderDownloadConfig = folderDownloadConfig;
-    }
-
-    @Override
-    public void setTrashcanConfig(TrashcanConfigDescriptor trashcanConfig) {
-        this.trashcanConfig = trashcanConfig;
-    }
-
-    @Override
-    public void addBackup(BackupDescriptor backupDescriptor) {
-        String backupKey = backupDescriptor.getKey();
-        if (isBackupExists(backupKey)) {
-            throw new AlreadyExistsException("Backup " + backupKey + " already exists");
-        }
-        backups.add(backupDescriptor);
-    }
-
-    @Override
-    public BackupDescriptor removeBackup(String backupKey) {
-        BackupDescriptor backupDescriptor = getBackup(backupKey);
-        if (backupDescriptor == null) {
-            return null;
-        }
-
-        // remove the backup from the backups list
-        backups.remove(backupDescriptor);
-
-        return backupDescriptor;
-    }
-
-    @Override
-    public boolean isPropertySetExists(String propertySetName) {
-        return getPropertySet(propertySetName) != null;
-    }
-
-    @Override
-    public void addPropertySet(PropertySet propertySet) {
-        String propertySetName = propertySet.getName();
-        if (isPropertySetExists(propertySetName)) {
-            throw new AlreadyExistsException("Property set " + propertySetName + " already exists");
-        }
-        propertySets.add(propertySet);
-    }
-
-    @Override
-    public PropertySet removePropertySet(String propertySetName) {
-        PropertySet propertySet = getPropertySet(propertySetName);
-        if (propertySet == null) {
-            return null;
-        }
-
-        //Remove the property set from the property sets list
-        propertySets.remove(propertySet);
-
-        //Remove the property set from any local repo which is associated with it
-        Collection<LocalRepoDescriptor> localRepoDescriptorCollection = localRepositoriesMap.values();
-        for (LocalRepoDescriptor localRepoDescriptor : localRepoDescriptorCollection) {
-            localRepoDescriptor.removePropertySet(propertySetName);
-        }
-
-        //Remove the property set from any remote repo which is associated with it
-        Collection<RemoteRepoDescriptor> remoteRepoDescriptors = remoteRepositoriesMap.values();
-        for (RemoteRepoDescriptor remoteRepoDescriptor : remoteRepoDescriptors) {
-            remoteRepoDescriptor.removePropertySet(propertySetName);
-        }
-
-        //Remove the property set from any distribution repo which is associated with it
-        distributionRepositoriesMap.values().stream()
-                .forEach(distRepo -> distRepo.removePropertySet(propertySetName));
-
-        return propertySet;
-    }
-
-    @Override
-    public boolean isOfflineMode() {
-        return offlineMode;
-    }
-
-    @Override
-    public void setOfflineMode(boolean offlineMode) {
-        this.offlineMode = offlineMode;
-    }
-
-    @Override
-    public boolean isHelpLinksEnabled() {
-        return helpLinksEnabled;
-    }
-
-    @Override
-    public void setHelpLinksEnabled(boolean helpLinksEnabled) {
-        this.helpLinksEnabled = helpLinksEnabled;
-    }
-
-    @Override
-    public ProxyDescriptor defaultProxyDefined() {
-        for (ProxyDescriptor proxyDescriptor : proxies) {
-            if (proxyDescriptor.isDefaultProxy()) {
-                return proxyDescriptor;
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public ProxyDescriptor getProxy(String proxyKey) {
-        for (ProxyDescriptor proxy : proxies) {
-            if (proxy.getKey().equals(proxyKey)) {
-                return proxy;
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public ReverseProxyDescriptor getReverseProxy(String key) {
-        for (ReverseProxyDescriptor reverseProxy : reverseProxies) {
-            if (reverseProxy.getKey().equals(key)) {
-                return reverseProxy;
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public ReverseProxyDescriptor getCurrentReverseProxy() {
-        if (reverseProxies != null && !reverseProxies.isEmpty()) {
-            return reverseProxies.get(0);
-        }
-        return null;
-    }
-
-    @Override
-    public BackupDescriptor getBackup(String backupKey) {
-        for (BackupDescriptor backup : backups) {
-            if (backup.getKey().equals(backupKey)) {
-                return backup;
-            }
-        }
-        return null;
-    }
-
-    private PropertySet getPropertySet(String propertySetName) {
-        for (PropertySet propertySet : propertySets) {
-            if (propertySet.getName().equals(propertySetName)) {
-                return propertySet;
-            }
-        }
-
-        return null;
-    }
-
-    private boolean isLdapExists(String key) {
-        return security != null && security.isLdapExists(key);
-    }
-
-    private void repoKeyExists(String repoKey, boolean shouldExist) {
-        boolean exists = isRepositoryExists(repoKey);
-        if (exists && !shouldExist) {
-            throw new AlreadyExistsException("Repository " + repoKey + " already exists");
-        }
-
-        if (!exists && shouldExist) {
-            throw new DoesNotExistException("Repository " + repoKey + " does not exist");
-        }
-    }
-
-    @Override
-    public List<RepoLayout> getRepoLayouts() {
-        return repoLayouts;
-    }
-
-    @Override
-    public void setRepoLayouts(List<RepoLayout> repoLayouts) {
-        this.repoLayouts = repoLayouts;
-    }
-
-    @Override
-    public boolean isRepoLayoutExists(String repoLayoutName) {
-        for (RepoLayout repoLayout : repoLayouts) {
-            if (repoLayout.getName().equals(repoLayoutName)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    @Override
-    public void addRepoLayout(RepoLayout repoLayout) {
-        String repoLayoutName = repoLayout.getName();
-        if (isRepoLayoutExists(repoLayoutName)) {
-            throw new AlreadyExistsException("Repo Layout " + repoLayoutName + " already exists");
-        }
-        repoLayouts.add(repoLayout);
-    }
-
-    @Override
-    public RepoLayout removeRepoLayout(String repoLayoutName) {
-        RepoLayout repoLayout = getRepoLayout(repoLayoutName);
-        if (repoLayout == null) {
-            return null;
-        }
-
-        repoLayouts.remove(repoLayout);
-
-
-        Collection<LocalRepoDescriptor> localRepoDescriptorCollection = localRepositoriesMap.values();
-        for (LocalRepoDescriptor localRepoDescriptor : localRepoDescriptorCollection) {
-            if (repoLayout.equals(localRepoDescriptor.getRepoLayout())) {
-                localRepoDescriptor.setRepoLayout(RepoLayoutUtils.MAVEN_2_DEFAULT);
-            }
-        }
-
-        Collection<RemoteRepoDescriptor> remoteRepoDescriptors = remoteRepositoriesMap.values();
-        for (RemoteRepoDescriptor remoteRepoDescriptor : remoteRepoDescriptors) {
-            if (repoLayout.equals(remoteRepoDescriptor.getRepoLayout())) {
-                remoteRepoDescriptor.setRepoLayout(RepoLayoutUtils.MAVEN_2_DEFAULT);
-            }
-            if (repoLayout.equals(remoteRepoDescriptor.getRemoteRepoLayout())) {
-                remoteRepoDescriptor.setRemoteRepoLayout(null);
-            }
-        }
-
-        Collection<VirtualRepoDescriptor> virtualRepoDescriptors = virtualRepositoriesMap.values();
-        for (VirtualRepoDescriptor virtualRepoDescriptor : virtualRepoDescriptors) {
-            if (repoLayout.equals(virtualRepoDescriptor.getRepoLayout())) {
-                virtualRepoDescriptor.setRepoLayout(null);
-            }
-        }
-
-        //TODO [by dan]: ok for dist repo to be without layout?
-        distributionRepositoriesMap.values().stream()
-                .filter(distRepo -> repoLayout.equals(distRepo.getRepoLayout()))
-                .forEach(distRepo -> distRepo.setRepoLayout(null));
-
-        return repoLayout;
-    }
-
-    @Override
-    public RepoLayout getRepoLayout(String repoLayoutName) {
-        for (RepoLayout repoLayout : repoLayouts) {
-            if (repoLayout.getName().equals(repoLayoutName)) {
-                return repoLayout;
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public boolean isRemoteReplicationExists(RemoteReplicationDescriptor descriptor) {
-        return remoteReplications.contains(descriptor);
-    }
-
-    @Override
-    public boolean isLocalReplicationExists(LocalReplicationDescriptor descriptor) {
-        return localReplications.contains(descriptor);
-    }
-
-    @Override
-    public List<RemoteReplicationDescriptor> getRemoteReplications() {
-        return remoteReplications;
-    }
-
-    @Override
-    public void setRemoteReplications(List<RemoteReplicationDescriptor> replicationDescriptors) {
-        remoteReplications = replicationDescriptors;
-    }
-
-    @Override
-    public List<LocalReplicationDescriptor> getLocalReplications() {
-        return localReplications;
-    }
-
-    @Override
-    public void setLocalReplications(List<LocalReplicationDescriptor> localReplications) {
-        this.localReplications = localReplications;
-    }
-
-    @Override
-    public RemoteReplicationDescriptor getRemoteReplication(String replicatedRepoKey) {
-
-        return getReplication(replicatedRepoKey, remoteReplications);
-    }
-
-    @Override
-    public LocalReplicationDescriptor getLocalReplication(String replicatedRepoKey) {
-        return getReplication(replicatedRepoKey, localReplications);
-    }
-
-    @Override
-    public LocalReplicationDescriptor getEnabledLocalReplication(String replicatedRepoKey) {
-        return get1stEnableLocalReplication(replicatedRepoKey, localReplications);
-    }
-
-    @Override
-    public int getTotalNumOfActiveLocalReplication(String replicatedRepoKey) {
-        return getNumOfActiveLocalReplication(replicatedRepoKey, localReplications);
-    }
-
-    @Override
-    public boolean isMultiPushConfigureForThisRepo(String repoKey) {
-        return getNumOfActiveLocalReplication(repoKey, localReplications) > 1;
-    }
-
-
-    @Override
-    public LocalReplicationDescriptor getLocalReplication(String replicatedRepoKey, String replicateRepoUrl) {
-        return getSpecificLocalReplication(replicatedRepoKey, replicateRepoUrl, localReplications);
-    }
-
-    @Override
-    public void addRemoteReplication(RemoteReplicationDescriptor replicationDescriptor) {
-        addReplication(replicationDescriptor, remoteReplications);
-    }
-
-    @Override
-    public void addLocalReplication(LocalReplicationDescriptor replicationDescriptor) {
-        addLocalReplication(replicationDescriptor, localReplications);
-    }
-
-    @Override
-    public void removeRemoteReplication(RemoteReplicationDescriptor replicationDescriptor) {
-        removeReplication(replicationDescriptor, remoteReplications);
-    }
-
-    @Override
-    public void removeLocalReplication(LocalReplicationDescriptor replicationDescriptor) {
-        removeReplication(replicationDescriptor, localReplications);
-    }
-
-    @Override
-    public void setGlobalReplicationConfig(GlobalReplicationsConfigDescriptor globalReplicationConfig) {
-        this.replicationsConfig = globalReplicationConfig;
-    }
-
-    @Override
-    public String getServerUrlForEmail() {
-        String serverUrl = "";
-        if (mailServer != null) {
-            String artifactoryUrl = mailServer.getArtifactoryUrl();
-            if (StringUtils.isNotBlank(artifactoryUrl)) {
-                serverUrl = artifactoryUrl;
-            }
-        }
-
-        if (StringUtils.isBlank(serverUrl) && StringUtils.isNotBlank(urlBase)) {
-            serverUrl = urlBase;
-        }
-
-        if (StringUtils.isNotBlank(serverUrl) && !serverUrl.endsWith("/")) {
-            serverUrl += "/";
-        }
-
-        return serverUrl;
-    }
-
-    @Override
-    public GcConfigDescriptor getGcConfig() {
-        return gcConfig;
-    }
-
-    @Override
-    public void setGcConfig(GcConfigDescriptor gcConfig) {
-        this.gcConfig = gcConfig;
-    }
-
-    @Override
-    public CleanupConfigDescriptor getCleanupConfig() {
-        return cleanupConfig;
-    }
-
-    @Override
-    public void setCleanupConfig(CleanupConfigDescriptor cleanupConfigDescriptor) {
-        this.cleanupConfig = cleanupConfigDescriptor;
-    }
-
-    @Override
-    public QuotaConfigDescriptor getQuotaConfig() {
-        return quotaConfig;
-    }
-
-    @Override
-    public void setQuotaConfig(QuotaConfigDescriptor descriptor) {
-        this.quotaConfig = descriptor;
-    }
-
-    @Override
-    public Map<String, LocalReplicationDescriptor> getLocalReplicationsMap() {
-        Map<String, LocalReplicationDescriptor> localReplicationsMap = Maps.newHashMap();
-        for (LocalReplicationDescriptor localReplication : localReplications) {
-            localReplicationsMap.put(localReplication.getRepoKey(), localReplication);
-        }
-
-        return localReplicationsMap;
-    }
-
-    @Override
-    public Map<String, LocalReplicationDescriptor> getSingleReplicationPerRepoMap() {
-        Map<String, LocalReplicationDescriptor> localReplicationsMap = Maps.newHashMap();
-        for (LocalReplicationDescriptor localReplication : localReplications) {
-            localReplicationsMap.put(localReplication.getRepoKey(), localReplication);
-        }
-        return localReplicationsMap;
-    }
-
-    @Override
-    public Map<String, LocalReplicationDescriptor> getLocalReplicationsPerRepoMap(String repoName) {
-        Map<String, LocalReplicationDescriptor> localReplicationsMap = new HashMap();
-        for (LocalReplicationDescriptor localReplication : localReplications) {
-            if (localReplication.getRepoKey().equals(repoName)) {
-                localReplicationsMap.put(localReplication.getUrl(), localReplication);
-            }
-        }
-        return localReplicationsMap;
-    }
-
-    @Override
-    public Map<String, RemoteReplicationDescriptor> getRemoteReplicationsPerRepoMap(String repoName) {
-        Map<String, RemoteReplicationDescriptor> localReplicationsMap = new HashMap();
-        for (RemoteReplicationDescriptor remoteReplication : remoteReplications) {
-            if (remoteReplication.getRepoKey().equals(repoName)) {
-                localReplicationsMap.put(remoteReplication.getRepoKey(), remoteReplication);
-            }
-        }
-        return localReplicationsMap;
-    }
-
-    @Override
-    public List<String> getLocalReplicationsUniqueKeyForProperty(String repoName) {
-        List<String> localReplicationsList = new ArrayList<>();
-        for (LocalReplicationDescriptor localReplication : localReplications) {
-            if (localReplication.getRepoKey().equals(repoName)) {
-                String uniqueKey = localReplication.getUrl().replaceAll("^(http|https)://", "_").replaceAll("/|:", "_");
-                localReplicationsList.add(uniqueKey);
-            }
-        }
-        return localReplicationsList;
-    }
-
-    @Override
-    public CleanupConfigDescriptor getVirtualCacheCleanupConfig() {
-        return virtualCacheCleanupConfig;
-    }
-
-    @Override
-    public void setVirtualCacheCleanupConfig(CleanupConfigDescriptor virtualCacheCleanupConfig) {
-        this.virtualCacheCleanupConfig = virtualCacheCleanupConfig;
-    }
-
-    private <T extends ReplicationBaseDescriptor> void addReplication(T replicationDescriptor,
-            List<T> replications) {
-        if (replications.contains(replicationDescriptor)) {
-            throw new AlreadyExistsException("Replication for '" + replicationDescriptor.getRepoKey() +
-                    "' already exists");
-        }
-        replications.add(replicationDescriptor);
-    }
-
-    /**
-     * update if exist / add (new) local replication descriptor
-     *
-     * @param replicationDescriptor - new or update local replication descriptor
-     * @param replications          - all replication descriptors
-     * @param <T>
-     */
-    private <T extends ReplicationBaseDescriptor> void addLocalReplication(T replicationDescriptor,
-            List<T> replications) {
-        if (replications.contains(replicationDescriptor)) {
-            replications.remove(replicationDescriptor);
-        }
-        replications.add(replicationDescriptor);
-    }
-
-    private <T extends ReplicationBaseDescriptor> T getReplication(String replicatedRepoKey, List<T> replications) {
-        if (StringUtils.isNotBlank(replicatedRepoKey)) {
-            for (T replication : replications) {
-                if (replicatedRepoKey.equals(replication.getRepoKey())) {
-                    return replication;
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * get specific Local Replication based on replicate repo key and repo url
-     *
-     * @param replicatedRepoKey - repository key
-     * @param replicateRepoUrl  - repository url
-     * @param replications      - all replication in artifactory
-     * @param <T>
-     * @return
-     */
-    private <T extends ReplicationBaseDescriptor> T getSpecificLocalReplication(String replicatedRepoKey,
-            String replicateRepoUrl, List<T> replications) {
-        if (StringUtils.isNotBlank(replicatedRepoKey)) {
-            for (T replication : replications) {
-
-                if (replicatedRepoKey.equals(replication.getRepoKey()) && replicateRepoUrl.equals(
-                        ((LocalReplicationDescriptor) replication).getUrl())) {
-                    return replication;
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * get specific Local Replication based on replicate repo key and repo url
-     *
-     * @param replicatedRepoKey - repository key
-     * @param replications      - all replication in artifactory
-     * @return
-     */
-    private <T extends ReplicationBaseDescriptor> T get1stEnableLocalReplication(String replicatedRepoKey,
-            List<T> replications) {
-        if (StringUtils.isNotBlank(replicatedRepoKey)) {
-            for (T replication : replications) {
-                if (replicatedRepoKey.equals(replication.getRepoKey()) && replication.isEnabled()) {
-                    return replication;
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * get specific Local Replication based on replicate repo key and repo url
-     *
-     * @param replicatedRepoKey - repository key
-     * @param replications      - all replication in artifactory
-     * @return
-     */
-    private <T extends ReplicationBaseDescriptor> int getNumOfActiveLocalReplication(String replicatedRepoKey,
-            List<T> replications) {
-        int replicationCounter = 0;
-        if (StringUtils.isNotBlank(replicatedRepoKey)) {
-            for (T replication : replications) {
-                if (replicatedRepoKey.equals(replication.getRepoKey()) && replication.isEnabled()) {
-                    replicationCounter++;
-                }
-            }
-        }
-        return replicationCounter;
-    }
-
-    private <T extends ReplicationBaseDescriptor> void removeReplication(T replicationDescriptor,
-            List<T> replications) {
-        replications.remove(replicationDescriptor);
-    }
-
-    @Override
-    public ExternalProvidersDescriptor getExternalProvidersDescriptor() {
-        return externalProviders;
-    }
-
-    @Override
-    public void setExternalProvidersDescriptor(ExternalProvidersDescriptor externalProvidersDescriptor) {
-        this.externalProviders = externalProvidersDescriptor;
-    }
-
-    @Override
-    public BintrayConfigDescriptor getBintrayConfig() {
-        return bintrayConfig;
-    }
-
-    @Override
-    public void setBintrayConfig(BintrayConfigDescriptor bintrayConfigDescriptor) {
-        this.bintrayConfig = bintrayConfigDescriptor;
-    }
-
-    public GlobalReplicationsConfigDescriptor getReplicationsConfig() {
-        return replicationsConfig;
-    }
-
-    public void setReplicationsConfig(GlobalReplicationsConfigDescriptor replications) {
-        this.replicationsConfig = replications;
-    }
-
-    @Override
-    public List<LocalReplicationDescriptor> getMultiLocalReplications(String repoKey) {
-        return getMultiLocalReplications(repoKey, localReplications);
-    }
-
-    private <T extends ReplicationBaseDescriptor> List<T> getMultiLocalReplications(String replicatedRepoKey, List<T> replications) {
-        List<T> localReplicationList = new ArrayList<>();
-        if (StringUtils.isNotBlank(replicatedRepoKey)) {
-            for (T replication : replications) {
-                if (replicatedRepoKey.equals(replication.getRepoKey()))
-                    localReplicationList.add(replication);
-            }
-        }
-        return localReplicationList;
-    }
-
-    @Override
-    public Map<String, BintrayApplicationConfig> getBintrayApplications() {
-        return bintrayApplications;
-    }
-
-    @Override
-    public BintrayApplicationConfig getBintrayApplication(String bintrayApplicationKey) {
-        return bintrayApplications.get(bintrayApplicationKey);
-    }
-
-    @Override
-    public void setBintrayApplications(Map<String, BintrayApplicationConfig> bintrayApplications) {
-        this.bintrayApplications = bintrayApplications;
-    }
-
-    @Override
-    public void addBintrayApplication(BintrayApplicationConfig bintrayApplicationConfig) throws AlreadyExistsException {
-        String key = bintrayApplicationConfig.getKey();
-        if (bintrayApplications.containsKey(key)) {
-            throw new AlreadyExistsException("Bintray Application config '" + key + "' already exists");
-        }
-        bintrayApplications.put(key, bintrayApplicationConfig);
-    }
-
-    @Override
-    public BintrayApplicationConfig removeBintrayApplication(String appConfigKey) {
-        return bintrayApplications.remove(appConfigKey);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/config/MutableCentralConfigDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/config/MutableCentralConfigDescriptor.java
deleted file mode 100644
index 5fc88b5..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/config/MutableCentralConfigDescriptor.java
+++ /dev/null
@@ -1,317 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.config;
-
-import org.artifactory.descriptor.addon.AddonSettings;
-import org.artifactory.descriptor.backup.BackupDescriptor;
-import org.artifactory.descriptor.bintray.BintrayConfigDescriptor;
-import org.artifactory.descriptor.cleanup.CleanupConfigDescriptor;
-import org.artifactory.descriptor.download.FolderDownloadConfigDescriptor;
-import org.artifactory.descriptor.external.ExternalProvidersDescriptor;
-import org.artifactory.descriptor.gc.GcConfigDescriptor;
-import org.artifactory.descriptor.index.IndexerDescriptor;
-import org.artifactory.descriptor.mail.MailServerDescriptor;
-import org.artifactory.descriptor.message.SystemMessageDescriptor;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.descriptor.quota.QuotaConfigDescriptor;
-import org.artifactory.descriptor.replication.GlobalReplicationsConfigDescriptor;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.replication.RemoteReplicationDescriptor;
-import org.artifactory.descriptor.repo.*;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.descriptor.repo.distribution.rule.DistributionRule;
-import org.artifactory.descriptor.security.SecurityDescriptor;
-import org.artifactory.descriptor.trashcan.TrashcanConfigDescriptor;
-import org.artifactory.util.AlreadyExistsException;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * Mutable interface for the central config.
- *
- * @author Yossi Shaul
- */
-public interface MutableCentralConfigDescriptor extends CentralConfigDescriptor {
-    void setLocalRepositoriesMap(Map<String, LocalRepoDescriptor> localRepositoriesMap);
-
-    void setRemoteRepositoriesMap(Map<String, RemoteRepoDescriptor> remoteRepositoriesMap);
-
-    void setVirtualRepositoriesMap(Map<String, VirtualRepoDescriptor> virtualRepositoriesMap);
-
-    void setDistributionRepositoriesMap(Map<String, DistributionRepoDescriptor> distributionRepositoriesMap);
-
-    void setProxies(List<ProxyDescriptor> proxies);
-
-    void setReverseProxies(List<ReverseProxyDescriptor> proxies);
-
-    void setDateFormat(String dateFormat);
-
-    void setFileUploadMaxSizeMb(int fileUploadMaxSizeMb);
-
-    void setBackups(List<BackupDescriptor> backups);
-
-    void setIndexer(IndexerDescriptor descriptor);
-
-    void setServerName(String serverName);
-
-    void setSecurity(SecurityDescriptor security);
-
-    void setOfflineMode(boolean offlineMode);
-
-    void setHelpLinksEnabled(boolean helpLinksEnabled);
-
-    /**
-     * Removes the repository with the specified key from the repositories list. Will also remove any references to this
-     * repositories from virtual repos, the backup and the indexer. The repository might be of any type (local, remote
-     * or virtual).
-     *
-     * @param repoKey The key of the repository to remove.
-     * @return The removed repository descripto or null if not found.
-     */
-    RepoDescriptor removeRepository(String repoKey);
-
-    /**
-     * @param repoKey The repository key to check.
-     * @return True if a repository with the input key exists.
-     */
-    boolean isRepositoryExists(String repoKey);
-
-    /**
-     * Adds the local repository to local repos map.
-     *
-     * @param localRepoDescriptor The local repo to add.
-     */
-    void addLocalRepository(LocalRepoDescriptor localRepoDescriptor);
-
-    /**
-     * Adds the remote repository to remote repos map.
-     *
-     * @param remoteRepoDescriptor The remote repo to add.
-     */
-    void addRemoteRepository(RemoteRepoDescriptor remoteRepoDescriptor);
-
-    /**
-     * Adds the virtual repository to virtual repos map.
-     *
-     * @param virtualRepoDescriptor The virtual repo to add.
-     */
-    void addVirtualRepository(VirtualRepoDescriptor virtualRepoDescriptor);
-
-    /**
-     * Adds the distribution repository to distribution repos map.
-     *
-     * @param distributionRepoDescriptor The distribution repo to add.
-     */
-    void addDistributionRepository(DistributionRepoDescriptor distributionRepoDescriptor);
-
-    /**
-     * This methods checks if the key is used by any descriptor. This check is importans since all the descriptors keys
-     * are defined as XmlIds and must be inique in the xml file.
-     *
-     * @param key The key to check.
-     * @return True if the key is not used by any other descriptor.
-     */
-    boolean isKeyAvailable(String key);
-
-    /**
-     * @param proxyKey The proxy key to check.
-     * @return True if a proxy with the input key exists.
-     */
-    boolean isProxyExists(String proxyKey);
-
-    /**
-     * Adds the proxy to the proxies list.
-     *
-     * @param proxyDescriptor         The new proxy to add.
-     * @param defaultForAllRemoteRepo
-     */
-    void addProxy(ProxyDescriptor proxyDescriptor, boolean defaultForAllRemoteRepo);
-
-    /**
-     * Removes the proxy with the specified key from the proxies list. Will also remove any references to this proxy
-     * from remote repos
-     *
-     * @param proxyKey The proxy key to check.
-     * @return The removed proxy descriptor or null if not found.
-     */
-    ProxyDescriptor removeProxy(String proxyKey);
-
-    /**
-     * Checks if the given reverse proxy exists by key
-     *
-     * @param key The reverse proxy key to check
-     * @return True if the reverse proxy with the given key exists, false otherwise
-     */
-    boolean isReverseProxyExists(String key);
-
-    /**
-     * Adds the reverse proxy to the list
-     *
-     * @param descriptor The new reverse proxy to add
-     */
-    void addReverseProxy(ReverseProxyDescriptor descriptor);
-
-    /**
-     * Adds the reverse proxy to the list
-     *
-     * @param descriptor The new reverse proxy to add
-     */
-    void updateReverseProxy(ReverseProxyDescriptor descriptor);
-
-    /**
-     * Removes the reverse proxy with the specified key from the list.
-     *
-     * @param key The reverse proxy key to remove
-     * @return The removed reverse proxy descriptor or null if not found
-     */
-    ReverseProxyDescriptor removeReverseProxy(String key);
-
-
-    /**
-     * Removes the reverse proxy with the specified key from the list.
-     *
-     * @return The removed reverse proxy descriptor or null if not found
-     */
-    void removeCurrentReverseProxy();
-
-    /**
-     * Changes the default proxy. Will also set the default proxies in already existing repositories if flag is set to
-     * true
-     *
-     * @param proxy                      The proxy descriptor to add
-     * @param replaceDefaultProxyInRepos Flag whether to replace the existing default proxy in existing repositories.
-     */
-    void proxyChanged(ProxyDescriptor proxy, boolean replaceDefaultProxyInRepos);
-
-    /**
-     * Checks if there is a proxy which is defined as the default proxy.
-     *
-     * @return The default proxy descriptor if exists
-     */
-    ProxyDescriptor defaultProxyDefined();
-
-    /**
-     * @param backupKey The backup key to check.
-     * @return True if a backup with the input key exists.
-     */
-    boolean isBackupExists(String backupKey);
-
-    /**
-     * Adds the backup to the backups list.
-     *
-     * @param backupDescriptor The new backup to add.
-     */
-    void addBackup(BackupDescriptor backupDescriptor);
-
-    /**
-     * Removes the backup with the specified key from the backups list. Will also remove any references to this backup
-     * from remote repos
-     *
-     * @param backupKey The backup key to check.
-     * @return The removed backup descriptor or null if not found.
-     */
-    BackupDescriptor removeBackup(String backupKey);
-
-    /**
-     * @param propertySetName The property set name to check
-     * @return True if a property set with the given name exists
-     */
-    boolean isPropertySetExists(String propertySetName);
-
-    /**
-     * Adds the property set to the property sets list
-     *
-     * @param propertySet The new property set to add.
-     */
-    void addPropertySet(PropertySet propertySet);
-
-    /**
-     * Removes the property set with the specified name from the property sets list. Will also remove any references to
-     * this property set from local repos
-     *
-     * @param propertySetName The property set name to check.
-     * @return The removed property set descriptor or null if not found.
-     */
-    PropertySet removePropertySet(String propertySetName);
-
-    void setMailServer(MailServerDescriptor mailServer);
-
-    void setPropertySets(List<PropertySet> propertySets);
-
-    void setUrlBase(String baseUrl);
-
-    void setAddons(AddonSettings addonSettings);
-
-    void setLogo(String logo);
-
-    void setSystemMessageConfig(SystemMessageDescriptor systemMessage);
-
-    void setFolderDownloadConfig(FolderDownloadConfigDescriptor folderDownloadConfig);
-
-    void setTrashcanConfig(TrashcanConfigDescriptor trashcanConfig);
-
-    boolean isRepoLayoutExists(String repoLayoutName);
-
-    void addRepoLayout(RepoLayout repoLayout);
-
-    RepoLayout removeRepoLayout(String repoLayoutName);
-
-    void setRepoLayouts(List<RepoLayout> repoLayouts);
-
-    boolean isRemoteReplicationExists(RemoteReplicationDescriptor descriptor);
-
-    boolean isLocalReplicationExists(LocalReplicationDescriptor descriptor);
-
-    void addRemoteReplication(RemoteReplicationDescriptor replicationDescriptor);
-
-    void addLocalReplication(LocalReplicationDescriptor replicationDescriptor);
-
-    void removeRemoteReplication(RemoteReplicationDescriptor replicationDescriptor);
-
-    void removeLocalReplication(LocalReplicationDescriptor replicationDescriptor);
-
-    void setGlobalReplicationConfig(GlobalReplicationsConfigDescriptor globalReplicationConfig);
-
-    void setRemoteReplications(List<RemoteReplicationDescriptor> replicationDescriptors);
-
-    void setLocalReplications(List<LocalReplicationDescriptor> localReplications);
-
-    void setGcConfig(GcConfigDescriptor gcConfigDescriptor);
-
-    void setCleanupConfig(CleanupConfigDescriptor cleanupConfigDescriptor);
-
-    void setVirtualCacheCleanupConfig(CleanupConfigDescriptor virtualCacheCleanupConfig);
-
-    void setQuotaConfig(QuotaConfigDescriptor descriptor);
-
-    void setExternalProvidersDescriptor(ExternalProvidersDescriptor externalProvidersDescriptor);
-
-    void setBintrayConfig(BintrayConfigDescriptor bintrayConfigDescriptor);
-
-    BackupDescriptor getBackup(String backupKey);
-
-    void conditionallyAddToBackups(RealRepoDescriptor remoteRepoDescriptor);
-
-    void setBintrayApplications(Map<String, BintrayApplicationConfig> bintrayApplications);
-
-    void addBintrayApplication(BintrayApplicationConfig bintrayApplicationConfig) throws AlreadyExistsException;
-
-    BintrayApplicationConfig removeBintrayApplication(String appConfigKey);
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/config/package-info.java b/base/config/src/main/java/org/artifactory/descriptor/config/package-info.java
deleted file mode 100644
index bcd6927..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/config/package-info.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
- at XmlSchema(namespace = Descriptor.NS,
-        elementFormDefault = XmlNsForm.QUALIFIED,
-        location = Descriptor.LOCATION)
- at XmlAccessorType(XmlAccessType.FIELD) package org.artifactory.descriptor.config;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlNsForm;
-import javax.xml.bind.annotation.XmlSchema;
diff --git a/base/config/src/main/java/org/artifactory/descriptor/delegation/ContentSynchronisation.java b/base/config/src/main/java/org/artifactory/descriptor/delegation/ContentSynchronisation.java
deleted file mode 100644
index 1e080d2..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/delegation/ContentSynchronisation.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.delegation;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
-* Delegation definitions container
-*
- * @author Michael Pasternak
-*/
- at XmlType(name = "ContentSynchronisation",
-        propOrder = {"enabled", "statistics", "properties", "source"},
-        namespace = Descriptor.NS
-)
-public class ContentSynchronisation implements Descriptor {
-
-    @XmlElement(name = "enabled", required = true, namespace = Descriptor.NS)
-    private boolean enabled = false;
-    @XmlElement(name = "statistics", required = true, namespace = Descriptor.NS)
-    private StatisticsContent statistics;
-    @XmlElement(name = "properties", required = true, namespace = Descriptor.NS)
-    private PropertiesContent properties;
-    @XmlElement(name = "source", required = true, namespace = Descriptor.NS)
-    private SourceContent source;
-
-    public ContentSynchronisation() {
-        this.statistics = new StatisticsContent();
-        this.properties = new PropertiesContent();
-        this.source = new SourceContent();
-    }
-
-    /**
-     * Enables delegation when SmartRepo discovered
-     */
-    public void enable() {
-        enabled = true;
-    }
-
-    /**
-     * Disables delegation
-     */
-    public void disable() {
-        enabled = false;
-    }
-
-    /**
-     * Checks whether delegation is enabled on container level
-     *
-     * @return boolean
-     */
-    public boolean isEnabled() {
-        return enabled;
-    }
-
-    /**
-     * Returns delegate representing statistics
-     *
-     * @return {@link StatisticsContent}
-     */
-    public StatisticsContent getStatistics() {
-        return statistics;
-    }
-
-    /**
-     * Returns delegate representing properties
-     *
-     * @return {@link PropertiesContent}
-     */
-    public PropertiesContent getProperties() {
-        return properties;
-    }
-
-    /**
-     * Returns delegate representing source remote content
-     *
-     * @return {@link SourceContent}
-     */
-    public SourceContent getSource() {
-        return source;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        ContentSynchronisation that = (ContentSynchronisation) o;
-
-        if (enabled != that.enabled) {
-            return false;
-        }
-        if (properties != null ? !properties.equals(that.properties) : that.properties != null) {
-            return false;
-        }
-        if (statistics != null ? !statistics.equals(that.statistics) : that.statistics != null) {
-            return false;
-        }
-        if (source != null ? !source.equals(that.source) : that.source != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = (enabled ? 1 : 0);
-        result = 13 * result + (statistics != null ? statistics.hashCode() : 0);
-        result = 17 * result + (properties != null ? properties.hashCode() : 0);
-        result = 31 * result + (source != null ? source.hashCode() : 0);
-        return result;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/delegation/PropertiesContent.java b/base/config/src/main/java/org/artifactory/descriptor/delegation/PropertiesContent.java
deleted file mode 100644
index 7010e61..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/delegation/PropertiesContent.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.delegation;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * Properties descriptor
- *
- * @author Michael Pasternak
-*/
- at XmlType(name = "PropertiesContent", propOrder = {"enabled"},
-        namespace = Descriptor.NS)
-public class PropertiesContent implements Descriptor {
-
-    public PropertiesContent() {
-        super();
-    }
-
-    @XmlElement(name = "enabled", required = true, namespace = Descriptor.NS)
-    private boolean enabled = false;
-
-    /**
-     * Checks whether delegation is enabled
-     *
-     * @return boolean
-     */
-    public boolean isEnabled() {
-        return this.enabled;
-    }
-
-    /**
-     * Disables delegation
-     */
-    public void disable() {
-        this.enabled = false;
-    }
-
-    /**
-     * Enables delegation
-     */
-    public void enable() {
-        this.enabled = true;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        PropertiesContent that = (PropertiesContent) o;
-
-        if (enabled != that.enabled) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return (enabled ? 1 : 0);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/delegation/SourceContent.java b/base/config/src/main/java/org/artifactory/descriptor/delegation/SourceContent.java
deleted file mode 100644
index fff9429..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/delegation/SourceContent.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.delegation;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * Properties descriptor
- *
- * @author Michael Pasternak
-*/
- at XmlType(name = "SourceContent", propOrder = {"originAbsenceDetection"},
-        namespace = Descriptor.NS)
-public class SourceContent implements Descriptor {
-
-    public SourceContent() {
-        super();
-    }
-
-    @XmlElement(name = "originAbsenceDetection", required = true, namespace = Descriptor.NS)
-    private boolean originAbsenceDetection = false;
-
-    /**
-    * Checks whether remote content absence check is enabled
-    *
-    * @return boolean
-    */
-    public boolean isOriginAbsenceDetection() {
-        return originAbsenceDetection;
-    }
-
-    /**
-     * Sets whether remote content absence check is enabled
-     *
-     * @param originAbsenceDetection
-     */
-    public void setOriginAbsenceDetection(boolean originAbsenceDetection) {
-        this.originAbsenceDetection = originAbsenceDetection;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        SourceContent that = (SourceContent) o;
-
-        if (originAbsenceDetection != that.originAbsenceDetection) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return (originAbsenceDetection ? 1 : 0);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/delegation/StatisticsContent.java b/base/config/src/main/java/org/artifactory/descriptor/delegation/StatisticsContent.java
deleted file mode 100644
index d471bfb..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/delegation/StatisticsContent.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.delegation;
-
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.descriptor.repo.HttpRepoDescriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-
-/**
- * Statistics delegation context
- *
- * @author Michael Pasternak
-*/
- at XmlType(name = "StatisticsContent", propOrder = {"enabled"},
-        namespace = Descriptor.NS)
-public class StatisticsContent implements Descriptor {
-
-    public StatisticsContent() {
-        super();
-    }
-
-    @XmlElement(name = "enabled", required = true, namespace = Descriptor.NS)
-    private boolean enabled = false;
-
-    /**
-     * Checks whether delegation is enabled
-     *
-     * @return boolean
-     */
-    public boolean isEnabled() {
-        return this.enabled;
-    }
-
-    /**
-     * Disables delegation
-     */
-    public void disable() {
-        this.enabled = false;
-    }
-
-    /**
-     * Enables delegation
-     */
-    public void enable() {
-        this.enabled = true;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        StatisticsContent that = (StatisticsContent) o;
-
-        if (enabled != that.enabled) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return (enabled ? 1 : 0);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/delegation/package-info.java b/base/config/src/main/java/org/artifactory/descriptor/delegation/package-info.java
deleted file mode 100644
index d91ac32..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/delegation/package-info.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
- at XmlSchema(namespace = Descriptor.NS, elementFormDefault = XmlNsForm.QUALIFIED)
- at XmlAccessorType(XmlAccessType.FIELD) package org.artifactory.descriptor.delegation;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlNsForm;
-import javax.xml.bind.annotation.XmlSchema;
diff --git a/base/config/src/main/java/org/artifactory/descriptor/download/FolderDownloadConfigDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/download/FolderDownloadConfigDescriptor.java
deleted file mode 100644
index 8c10384..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/download/FolderDownloadConfigDescriptor.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.download;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * Descriptor for the system message
- *
- * @author Dan Feldman
- */
- at XmlType(name = "FolderDownloadConfigType", propOrder = {"enabled", "maxDownloadSizeMb", "maxFiles",
-        "maxConcurrentRequests"}, namespace = Descriptor.NS)
-public class FolderDownloadConfigDescriptor implements Descriptor {
-
-    @XmlElement
-    private boolean enabled = false;
-
-    @XmlElement
-    private int maxDownloadSizeMb = 1024; //1GB
-
-    @XmlElement
-    private long maxFiles = 5000;
-
-    @XmlElement
-    private int maxConcurrentRequests = 10;
-
-    public boolean isEnabled() {
-        return enabled;
-    }
-
-    public void setEnabled(boolean enabled) {
-        this.enabled = enabled;
-    }
-
-    public int getMaxDownloadSizeMb() {
-        return maxDownloadSizeMb;
-    }
-
-    public void setMaxDownloadSizeMb(int maxDownloadSizeMb) {
-        this.maxDownloadSizeMb = maxDownloadSizeMb;
-    }
-
-    public long getMaxFiles() {
-        return maxFiles;
-    }
-
-    public void setMaxFiles(long maxFiles) {
-        this.maxFiles = maxFiles;
-    }
-
-    public int getMaxConcurrentRequests() {
-        return maxConcurrentRequests;
-    }
-
-    public void setMaxConcurrentRequests(int maxConcurrentRequests) {
-        this.maxConcurrentRequests = maxConcurrentRequests;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof FolderDownloadConfigDescriptor)) {
-            return false;
-        }
-
-        FolderDownloadConfigDescriptor that = (FolderDownloadConfigDescriptor) o;
-
-        if (isEnabled() != that.isEnabled()) {
-            return false;
-        }
-        if (getMaxDownloadSizeMb() != that.getMaxDownloadSizeMb()) {
-            return false;
-        }
-        if (getMaxFiles() != that.getMaxFiles()) {
-            return false;
-        }
-        return getMaxConcurrentRequests() == that.getMaxConcurrentRequests();
-
-    }
-
-    @Override
-    public int hashCode() {
-        int result = (isEnabled() ? 1 : 0);
-        result = 31 * result + getMaxDownloadSizeMb();
-        result = 31 * result + (int) (getMaxFiles() ^ (getMaxFiles() >>> 32));
-        result = 31 * result + getMaxConcurrentRequests();
-        return result;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/download/package-info.java b/base/config/src/main/java/org/artifactory/descriptor/download/package-info.java
deleted file mode 100644
index 33d3705..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/download/package-info.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
- at XmlSchema(namespace = Descriptor.NS, elementFormDefault = XmlNsForm.QUALIFIED)
- at XmlAccessorType(XmlAccessType.FIELD) package org.artifactory.descriptor.download;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlNsForm;
-import javax.xml.bind.annotation.XmlSchema;
diff --git a/base/config/src/main/java/org/artifactory/descriptor/external/BlackDuckSettingsDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/external/BlackDuckSettingsDescriptor.java
deleted file mode 100644
index c451705..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/external/BlackDuckSettingsDescriptor.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.external;
-
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.codehaus.jackson.annotate.JsonProperty;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlIDREF;
-import javax.xml.bind.annotation.XmlType;
-
- at XmlType(name = "BlackDuckSettingsType",
-        namespace = Descriptor.NS,
-        propOrder = {"enableIntegration", "serverUri", "username", "password", "connectionTimeoutMillis", "proxy"})
-public class BlackDuckSettingsDescriptor implements Descriptor {
-
-    @XmlElement(defaultValue = "false")
-    private boolean enableIntegration = false;
-
-    @XmlElement(required = true)
-    private String serverUri;
-
-    @XmlElement(required = true)
-    private String username;
-
-    @XmlElement(required = true)
-    private String password;
-
-    @XmlElement
-    private Long connectionTimeoutMillis;
-
-    @XmlIDREF
-    @XmlElement(name = "proxyRef")
-    @JsonProperty("proxyRef")
-    private ProxyDescriptor proxy;
-
-    public boolean isEnableIntegration() {
-        return enableIntegration;
-    }
-
-    public void setEnableIntegration(boolean enableIntegration) {
-        this.enableIntegration = enableIntegration;
-    }
-
-    public String getServerUri() {
-        return serverUri;
-    }
-
-    public void setServerUri(String serverUri) {
-        this.serverUri = serverUri;
-    }
-
-    public String getUsername() {
-        return username;
-    }
-
-    public void setUsername(String username) {
-        this.username = username;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public void setPassword(String password) {
-        this.password = password;
-    }
-
-    public Long getConnectionTimeoutMillis() {
-        return connectionTimeoutMillis;
-    }
-
-    public void setConnectionTimeoutMillis(Long connectionTimeoutMillis) {
-        this.connectionTimeoutMillis = connectionTimeoutMillis;
-    }
-
-    public ProxyDescriptor getProxy() {
-        return proxy;
-    }
-
-    public void setProxy(ProxyDescriptor proxy) {
-        this.proxy = proxy;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        BlackDuckSettingsDescriptor that = (BlackDuckSettingsDescriptor) o;
-
-        if (enableIntegration != that.enableIntegration) {
-            return false;
-        }
-        if (connectionTimeoutMillis != null ? !connectionTimeoutMillis.equals(that.connectionTimeoutMillis) :
-                that.connectionTimeoutMillis != null) {
-            return false;
-        }
-        if (password != null ? !password.equals(that.password) : that.password != null) {
-            return false;
-        }
-        if (serverUri != null ? !serverUri.equals(that.serverUri) : that.serverUri != null) {
-            return false;
-        }
-        if (username != null ? !username.equals(that.username) : that.username != null) {
-            return false;
-        }
-        if (proxy != null ? !proxy.equals(that.proxy) : that.proxy != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = (enableIntegration ? 1 : 0);
-        result = 31 * result + (serverUri != null ? serverUri.hashCode() : 0);
-        result = 31 * result + (username != null ? username.hashCode() : 0);
-        result = 31 * result + (password != null ? password.hashCode() : 0);
-        result = 31 * result + (connectionTimeoutMillis != null ? connectionTimeoutMillis.hashCode() : 0);
-        result = 31 * result + (proxy != null ? proxy.hashCode() : 0);
-        return result;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/external/ExternalProvidersDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/external/ExternalProvidersDescriptor.java
deleted file mode 100644
index 41aacd3..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/external/ExternalProvidersDescriptor.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.external;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * @author mamo
- */
- at XmlType(name = "ExternalProvidersType", namespace = Descriptor.NS, propOrder = {"blackDuckSettingsDescriptor"})
-public class ExternalProvidersDescriptor implements Descriptor {
-
-    @XmlElement(name = "blackduck", required = false)
-    private BlackDuckSettingsDescriptor blackDuckSettingsDescriptor;
-
-    public BlackDuckSettingsDescriptor getBlackDuckSettingsDescriptor() {
-        return blackDuckSettingsDescriptor;
-    }
-
-    public void setBlackDuckSettingsDescriptor(BlackDuckSettingsDescriptor blackDuckSettingsDescriptor) {
-        this.blackDuckSettingsDescriptor = blackDuckSettingsDescriptor;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/external/package-info.java b/base/config/src/main/java/org/artifactory/descriptor/external/package-info.java
deleted file mode 100644
index 9de2747..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/external/package-info.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
- at XmlSchema(namespace = Descriptor.NS,
-        elementFormDefault = XmlNsForm.QUALIFIED,
-        location = Descriptor.LOCATION)
- at XmlAccessorType(XmlAccessType.FIELD) package org.artifactory.descriptor.external;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlNsForm;
-import javax.xml.bind.annotation.XmlSchema;
diff --git a/base/config/src/main/java/org/artifactory/descriptor/gc/GcConfigDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/gc/GcConfigDescriptor.java
deleted file mode 100644
index 8c9b20d..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/gc/GcConfigDescriptor.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.gc;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.descriptor.TaskDescriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * @author Noam Y. Tenne
- */
- at XmlType(name = "GcConfigType", propOrder = {"cronExp"}, namespace = Descriptor.NS)
-public class GcConfigDescriptor implements TaskDescriptor {
-
-    @XmlElement(required = true)
-    private String cronExp;
-
-    public String getCronExp() {
-        return cronExp;
-    }
-
-    public void setCronExp(String cronExp) {
-        this.cronExp = cronExp;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof GcConfigDescriptor)) {
-            return false;
-        }
-
-        GcConfigDescriptor that = (GcConfigDescriptor) o;
-
-        if (!cronExp.equals(that.cronExp)) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return cronExp.hashCode();
-    }
-
-    @Override
-    public boolean sameTaskDefinition(TaskDescriptor otherDescriptor) {
-        if (otherDescriptor == null || !(otherDescriptor instanceof GcConfigDescriptor)) {
-            throw new IllegalArgumentException(
-                    "Cannot compare GC config descriptor " + this + " with " + otherDescriptor);
-        }
-        GcConfigDescriptor gcConfigDescriptor = (GcConfigDescriptor) otherDescriptor;
-        return StringUtils.equals(gcConfigDescriptor.cronExp, this.cronExp);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/gc/package-info.java b/base/config/src/main/java/org/artifactory/descriptor/gc/package-info.java
deleted file mode 100644
index 01dd1b2..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/gc/package-info.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
- at XmlSchema(namespace = Descriptor.NS,
-        elementFormDefault = XmlNsForm.QUALIFIED,
-        location = Descriptor.LOCATION)
- at XmlAccessorType(XmlAccessType.FIELD) package org.artifactory.descriptor.gc;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlNsForm;
-import javax.xml.bind.annotation.XmlSchema;
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/index/IndexerDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/index/IndexerDescriptor.java
deleted file mode 100644
index a80f418..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/index/IndexerDescriptor.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.index;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.descriptor.TaskDescriptor;
-import org.artifactory.descriptor.repo.RepoBaseDescriptor;
-
-import javax.annotation.Nullable;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlIDREF;
-import javax.xml.bind.annotation.XmlType;
-import java.util.SortedSet;
-
- at XmlType(name = "IndexerType", propOrder = {"enabled", "cronExp", "includedRepositories"},
-        namespace = Descriptor.NS)
-public class IndexerDescriptor implements TaskDescriptor {
-
-    private static final long serialVersionUID = 1L;
-
-    private boolean enabled;
-
-    private String cronExp;
-
-    @XmlIDREF
-    @XmlElementWrapper(name = "includedRepositories")
-    @XmlElement(name = "repositoryRef", type = RepoBaseDescriptor.class, required = false)
-    private SortedSet<? extends RepoBaseDescriptor> includedRepositories;
-
-    public IndexerDescriptor() {
-        // By Default index once a day at 05:23AM
-        this.cronExp = "0 23 5 * * ?";
-    }
-
-    public boolean isEnabled() {
-        return enabled;
-    }
-
-    public void setEnabled(boolean enabled) {
-        this.enabled = enabled;
-    }
-
-    public String getCronExp() {
-        return cronExp;
-    }
-
-    public void setCronExp(String cronExp) {
-        this.cronExp = cronExp;
-    }
-
-    @Nullable
-    public SortedSet<? extends RepoBaseDescriptor> getIncludedRepositories() {
-        return includedRepositories;
-    }
-
-    public void setIncludedRepositories(
-            SortedSet<? extends RepoBaseDescriptor> includedRepositories) {
-        this.includedRepositories = includedRepositories;
-    }
-
-    public void removeIncludedRepository(RepoBaseDescriptor repoBaseDescriptor) {
-        if (includedRepositories != null) {
-            includedRepositories.remove(repoBaseDescriptor);
-        }
-    }
-
-    @Override
-    public boolean sameTaskDefinition(TaskDescriptor otherDescriptor) {
-        if (otherDescriptor == null || !(otherDescriptor instanceof IndexerDescriptor)) {
-            throw new IllegalArgumentException(
-                    "Cannot compare indexer descriptor " + this + " with " + otherDescriptor);
-        }
-        IndexerDescriptor indexerDesc = (IndexerDescriptor) otherDescriptor;
-        return indexerDesc.enabled == this.enabled &&
-                StringUtils.equals(indexerDesc.cronExp, this.cronExp);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        IndexerDescriptor that = (IndexerDescriptor) o;
-
-        if (enabled != that.enabled) {
-            return false;
-        }
-        if(cronExp != null ? !cronExp.equals(that.cronExp) : that.cronExp != null) {
-            return false;
-        }
-        if (includedRepositories != null ? !includedRepositories.equals(that.includedRepositories) :
-                that.includedRepositories != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = (enabled ? 1 : 0);
-        result = 31 * result + (cronExp != null ? cronExp.hashCode() : 0);
-        result = 31 * result + (includedRepositories != null ? includedRepositories.hashCode() : 0);
-        return result;
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/index/package-info.java b/base/config/src/main/java/org/artifactory/descriptor/index/package-info.java
deleted file mode 100644
index 92f7b89..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/index/package-info.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
- at XmlSchema(namespace = Descriptor.NS,
-        elementFormDefault = XmlNsForm.QUALIFIED)
- at XmlAccessorType(XmlAccessType.FIELD) package org.artifactory.descriptor.index;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlNsForm;
-import javax.xml.bind.annotation.XmlSchema;
diff --git a/base/config/src/main/java/org/artifactory/descriptor/mail/MailServerDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/mail/MailServerDescriptor.java
deleted file mode 100644
index 44b7a6b..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/mail/MailServerDescriptor.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.mail;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * The descriptor of the mail server configuration
- */
- at XmlType(name = "MailServerType", propOrder = {"enabled", "host", "port", "username", "password", "from",
-        "subjectPrefix", "tls", "ssl", "artifactoryUrl"}, namespace = Descriptor.NS)
-public class MailServerDescriptor implements Descriptor {
-
-    @XmlElement(defaultValue = "true")
-    private boolean enabled = true;
-    private String host;
-    private int port = 25;
-    private String username;
-    private String password;
-    private String from;
-    private String subjectPrefix = "[Artifactory]";
-    private String artifactoryUrl;
-    private boolean tls;
-    private boolean ssl;
-    public static final String MAIL_BASE_URL_NOT_CONFIGURED_LINK = "/artifactory_url_not_set_in_mail_config";
-    public static final String MAIL_BASE_URL_NOT_CONFIGURED_TITLE = "\"Artifactory Url not set in mail config\"";
-
-    public boolean isEnabled() {
-        return enabled;
-    }
-
-    public void setEnabled(boolean enabled) {
-        this.enabled = enabled;
-    }
-
-    public String getHost() {
-        return host;
-    }
-
-    public void setHost(String host) {
-        this.host = host;
-    }
-
-    public int getPort() {
-        return port;
-    }
-
-    public void setPort(int port) {
-        this.port = port;
-    }
-
-    public String getUsername() {
-        return username;
-    }
-
-    public void setUsername(String username) {
-        this.username = username;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public void setPassword(String password) {
-        this.password = password;
-    }
-
-    public String getFrom() {
-        return from;
-    }
-
-    public void setFrom(String from) {
-        this.from = from;
-    }
-
-    public String getSubjectPrefix() {
-        return subjectPrefix;
-    }
-
-    public void setSubjectPrefix(String subjectPrefix) {
-        this.subjectPrefix = subjectPrefix;
-    }
-
-    public boolean isTls() {
-        return tls;
-    }
-
-    public void setTls(boolean tls) {
-        this.tls = tls;
-    }
-
-    public boolean isSsl() {
-        return ssl;
-    }
-
-    public void setSsl(boolean ssl) {
-        this.ssl = ssl;
-    }
-
-    /**
-     * Artifactory URL that will be used <b>exclusively<b/> in <b>EMAILS ONLY!<b/>
-     *
-     * @return The Artifactory URL.
-     */
-    public String getArtifactoryUrl() {
-        return artifactoryUrl;
-    }
-
-    public void setArtifactoryUrl(String artifactoryUrl) {
-        this.artifactoryUrl = artifactoryUrl;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/mail/package-info.java b/base/config/src/main/java/org/artifactory/descriptor/mail/package-info.java
deleted file mode 100644
index 4034cb7..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/mail/package-info.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
- at XmlSchema(namespace = Descriptor.NS,
-        elementFormDefault = XmlNsForm.QUALIFIED)
- at XmlAccessorType(XmlAccessType.FIELD) package org.artifactory.descriptor.mail;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlNsForm;
-import javax.xml.bind.annotation.XmlSchema;
diff --git a/base/config/src/main/java/org/artifactory/descriptor/message/SystemMessageDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/message/SystemMessageDescriptor.java
deleted file mode 100644
index 5fc1d84..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/message/SystemMessageDescriptor.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.message;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * Descriptor for the system message
- *
- * @author Dan Feldman
- */
- at XmlType(name = "SystemMessageType", propOrder = {"enabled", "title", "titleColor", "message", "showOnAllPages"},
-        namespace = Descriptor.NS)
-public class SystemMessageDescriptor implements Descriptor {
-
-    @XmlElement
-    private boolean enabled;
-
-    @XmlElement
-    private String title;
-
-    @XmlElement
-    private String titleColor = "#429f46";
-
-    @XmlElement
-    private String message;
-
-    @XmlElement
-    private boolean showOnAllPages;
-
-    public boolean isEnabled() {
-        return enabled;
-    }
-
-    public void setEnabled(boolean enabled) {
-        this.enabled = enabled;
-    }
-
-    public String getTitle() {
-        return title;
-    }
-
-    public void setTitle(String title) {
-        this.title = title;
-    }
-
-    public String getTitleColor() {
-        return titleColor;
-    }
-
-    public void setTitleColor(String titleColor) {
-        this.titleColor = titleColor;
-    }
-
-    public String getMessage() {
-        return message;
-    }
-
-    public void setMessage(String message) {
-        this.message = message;
-    }
-
-    public boolean isShowOnAllPages() {
-        return showOnAllPages;
-    }
-
-    public void setShowOnAllPages(boolean showOnAllPages) {
-        this.showOnAllPages = showOnAllPages;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof SystemMessageDescriptor)) {
-            return false;
-        }
-
-        SystemMessageDescriptor that = (SystemMessageDescriptor) o;
-
-        if (isEnabled() != that.isEnabled()) {
-            return false;
-        }
-        if (isShowOnAllPages() != that.isShowOnAllPages()) {
-            return false;
-        }
-        if (getTitle() != null ? !getTitle().equals(that.getTitle()) : that.getTitle() != null) {
-            return false;
-        }
-        if (getTitleColor() != null ? !getTitleColor().equals(that.getTitleColor()) : that.getTitleColor() != null) {
-            return false;
-        }
-        return !(getMessage() != null ? !getMessage().equals(that.getMessage()) : that.getMessage() != null);
-
-    }
-
-    @Override
-    public int hashCode() {
-        int result = (isEnabled() ? 1 : 0);
-        result = 31 * result + (getTitle() != null ? getTitle().hashCode() : 0);
-        result = 31 * result + (getTitleColor() != null ? getTitleColor().hashCode() : 0);
-        result = 31 * result + (getMessage() != null ? getMessage().hashCode() : 0);
-        result = 31 * result + (isShowOnAllPages() ? 1 : 0);
-        return result;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/message/package-info.java b/base/config/src/main/java/org/artifactory/descriptor/message/package-info.java
deleted file mode 100644
index 68e6987..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/message/package-info.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
- at XmlSchema(namespace = Descriptor.NS, elementFormDefault = XmlNsForm.QUALIFIED)
- at XmlAccessorType(XmlAccessType.FIELD) package org.artifactory.descriptor.message;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlNsForm;
-import javax.xml.bind.annotation.XmlSchema;
diff --git a/base/config/src/main/java/org/artifactory/descriptor/property/PredefinedValue.java b/base/config/src/main/java/org/artifactory/descriptor/property/PredefinedValue.java
deleted file mode 100644
index cbb0498..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/property/PredefinedValue.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.property;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * @author Yoav Landman
- */
- at XmlType(name = "PredefinedValueType", propOrder = {"value", "defaultValue"}, namespace = Descriptor.NS)
-public class PredefinedValue implements Descriptor {
-    private String value;
-    private boolean defaultValue;
-
-    public PredefinedValue() {
-    }
-
-    public PredefinedValue(String value, boolean defaultValue) {
-        this.value = value;
-        this.defaultValue = defaultValue;
-    }
-
-    public String getValue() {
-        return value;
-    }
-
-    public void setValue(String value) {
-        this.value = value;
-    }
-
-    public boolean isDefaultValue() {
-        return defaultValue;
-    }
-
-    public void setDefaultValue(boolean defaultValue) {
-        this.defaultValue = defaultValue;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof PredefinedValue)) {
-            return false;
-        }
-
-        PredefinedValue value1 = (PredefinedValue) o;
-
-        if (value != null ? !value.equals(value1.value) : value1.value != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return value != null ? value.hashCode() : 0;
-    }
-
-    @Override
-    public String toString() {
-        return value;
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/property/Property.java b/base/config/src/main/java/org/artifactory/descriptor/property/Property.java
deleted file mode 100644
index 2c0f94f..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/property/Property.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.property;
-
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.util.AlreadyExistsException;
-import org.artifactory.util.DoesNotExistException;
-import org.codehaus.jackson.annotate.JsonIgnore;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlTransient;
-import javax.xml.bind.annotation.XmlType;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Yoav Landman
- */
- at XmlType(name = "PropertyType", propOrder = {"name", "closedPredefinedValues", "multipleChoice", "predefinedValues"},
-        namespace = Descriptor.NS)
-public class Property implements Descriptor {
-    private String name;
-    private boolean closedPredefinedValues;
-    private boolean multipleChoice;
-    //private String propertyType;
-
-    @XmlElementWrapper(name = "predefinedValues")
-    @XmlElement(name = "predefinedValue", required = false)
-    private List<PredefinedValue> predefinedValues = new ArrayList<>();
-
-    public Property() {
-    }
-
-    public Property(String name) {
-        this.name = name;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public boolean isClosedPredefinedValues() {
-        return closedPredefinedValues;
-    }
-
-    public void setClosedPredefinedValues(boolean closedPredefinedValues) {
-        this.closedPredefinedValues = closedPredefinedValues;
-    }
-
-    public boolean isMultipleChoice() {
-        return multipleChoice;
-    }
-
-    public void setMultipleChoice(boolean multipleChoice) {
-        this.multipleChoice = multipleChoice;
-    }
-
-    public List<PredefinedValue> getPredefinedValues() {
-        return predefinedValues;
-    }
-
-    @JsonIgnore
-    public String getFormattedValues() {
-        StringBuilder builder = new StringBuilder();
-        for (PredefinedValue predefinedValue : predefinedValues) {
-            builder.append(", \"").append(predefinedValue.getValue()).append("\"");
-            if (predefinedValue.isDefaultValue()) {
-                builder.append(" (default)");
-            }
-        }
-
-        if (builder.length() == 0) {
-            return "";
-        }
-        return builder.substring(2);
-    }
-
-    public void setPredefinedValues(List<PredefinedValue> predefinedValues) {
-        this.predefinedValues = predefinedValues;
-    }
-
-    private PredefinedValue getPredefinedValue(String value) {
-        for (PredefinedValue predefinedValue : predefinedValues) {
-            if (predefinedValue.getValue().equals(value)) {
-                return predefinedValue;
-            }
-        }
-
-        return null;
-    }
-
-    public void updatePredefinedValue(PredefinedValue predefinedValue) {
-        int index = predefinedValues.indexOf(predefinedValue);
-        if (index == -1) {
-            throw new DoesNotExistException("Predefined Value " + predefinedValue.getValue() + " does not exist");
-        }
-        predefinedValues.set(index, predefinedValue);
-    }
-
-    public boolean isPredefinedValueExists(String value) {
-        return getPredefinedValue(value) != null;
-    }
-
-    public int getValueCount() {
-        return predefinedValues.size();
-    }
-
-    public void addPredefinedValue(PredefinedValue predefinedValue) {
-        String predefinedValueName = predefinedValue.getValue();
-        if (isPredefinedValueExists(predefinedValueName)) {
-            throw new AlreadyExistsException("Predefined Value " + predefinedValueName + " already exists");
-        }
-        predefinedValues.add(predefinedValue);
-    }
-
-    public PredefinedValue removePredefinedValue(String value) {
-        PredefinedValue predefinedValue = getPredefinedValue(value);
-        if (predefinedValue == null) {
-            return null;
-        }
-
-        //Remove the property set from the property sets list
-        predefinedValues.remove(predefinedValue);
-
-        return predefinedValue;
-    }
-
-    @XmlTransient
-    public PropertyType getPropertyType() {
-        if (!isClosedPredefinedValues()) {
-            return PropertyType.ANY_VALUE;
-        }
-        if (isMultipleChoice()) {
-            return PropertyType.MULTI_SELECT;
-        }
-        return PropertyType.SINGLE_SELECT;
-    }
-
-    public void setPropertyType(String propertyType) {
-        switch (propertyType) {
-            case "ANY_VALUE": {
-                closedPredefinedValues = false;
-                multipleChoice = false;
-                break;
-            }
-            case "MULTI_SELECT": {
-                closedPredefinedValues = true;
-                multipleChoice = true;
-                break;
-            }
-            case "SINGLE_SELECT": {
-                closedPredefinedValues = true;
-                multipleChoice = false;
-                break;
-            }
-            default: {
-                closedPredefinedValues = false;
-                multipleChoice = false;
-                break;
-            }
-        }
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof Property)) {
-            return false;
-        }
-
-        Property property = (Property) o;
-
-        return !(name != null ? !name.equals(property.name) : property.name != null);
-    }
-
-    @Override
-    public int hashCode() {
-        return name != null ? name.hashCode() : 0;
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/property/PropertySet.java b/base/config/src/main/java/org/artifactory/descriptor/property/PropertySet.java
deleted file mode 100644
index 1d3aacd..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/property/PropertySet.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.property;
-
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.util.AlreadyExistsException;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlID;
-import javax.xml.bind.annotation.XmlType;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A collection of tag definitions, which will be eventually instantiated as properties.
- *
- * @author Yoav Landman
- */
- at XmlType(name = "PropertySetType", propOrder = {"name", "visible", "properties"}, namespace = Descriptor.NS)
-public class PropertySet implements Descriptor {
-
-    public static final String ARTIFACTORY_RESERVED_PROP_SET = "artifactory";
-    @XmlID
-    @XmlElement(required = true)
-    private String name;
-
-    @XmlElement(defaultValue = "true")
-    private boolean visible = true;
-
-    @XmlElementWrapper(name = "properties")
-    @XmlElement(name = "property", required = false)
-    private List<Property> properties = new ArrayList<>();
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public boolean isVisible() {
-        return visible;
-    }
-
-    public void setVisible(boolean visible) {
-        this.visible = visible;
-    }
-
-    public List<Property> getProperties() {
-        return properties;
-    }
-
-    public void setProperties(List<Property> properties) {
-        this.properties = properties;
-    }
-
-    public Property getProperty(String propertyName) {
-        for (Property property : properties) {
-            if (property.getName().equals(propertyName)) {
-                return property;
-            }
-        }
-
-        return null;
-    }
-
-    public boolean isPropertyExists(String propertyName) {
-        return getProperty(propertyName) != null;
-    }
-
-    public void addProperty(Property property) {
-        String propertyName = property.getName();
-        if (isPropertyExists(propertyName)) {
-            throw new AlreadyExistsException("Property " + property + " already exists");
-        }
-        properties.add(property);
-    }
-
-    public Property removeProperty(String propertyName) {
-        Property property = getProperty(propertyName);
-        if (property == null) {
-            return null;
-        }
-
-        //Remove the property from the property list
-        properties.remove(property);
-
-        return property;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof PropertySet)) {
-            return false;
-        }
-
-        PropertySet set = (PropertySet) o;
-
-        if (name != null ? !name.equals(set.name) : set.name != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return name != null ? name.hashCode() : 0;
-    }
-
-    @Override
-    public String toString() {
-        return name;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/property/PropertyType.java b/base/config/src/main/java/org/artifactory/descriptor/property/PropertyType.java
deleted file mode 100644
index 168324a..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/property/PropertyType.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.property;
-
-/**
- * @author Yoav Aharoni
- */
-public enum PropertyType {
-    ANY_VALUE(false, false),
-    SINGLE_SELECT(true, false),
-    MULTI_SELECT(true, true);
-
-    private boolean closedList;
-    private boolean multipleChoice;
-
-    PropertyType(boolean closedList, boolean multipleChoice) {
-        this.closedList = closedList;
-        this.multipleChoice = multipleChoice;
-    }
-
-    public boolean isClosedList() {
-        return closedList;
-    }
-
-    public boolean isMultipleChoice() {
-        return multipleChoice;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/property/package-info.java b/base/config/src/main/java/org/artifactory/descriptor/property/package-info.java
deleted file mode 100644
index e6c0ebb..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/property/package-info.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
- at XmlSchema(namespace = Descriptor.NS, elementFormDefault = XmlNsForm.QUALIFIED)
- at XmlAccessorType(XmlAccessType.FIELD) package org.artifactory.descriptor.property;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlNsForm;
-import javax.xml.bind.annotation.XmlSchema;
diff --git a/base/config/src/main/java/org/artifactory/descriptor/quota/QuotaConfigDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/quota/QuotaConfigDescriptor.java
deleted file mode 100644
index 780e472..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/quota/QuotaConfigDescriptor.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.quota;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * Descriptor for the disk space quota management
- *
- * @author Shay Yaakov
- */
- at XmlType(name = "QuotaConfigType", propOrder = {"enabled", "diskSpaceLimitPercentage", "diskSpaceWarningPercentage"},
-        namespace = Descriptor.NS)
-public class QuotaConfigDescriptor implements Descriptor {
-
-    private boolean enabled;
-    private int diskSpaceLimitPercentage;
-    private int diskSpaceWarningPercentage;
-
-    public boolean isEnabled() {
-        return enabled;
-    }
-
-    public void setEnabled(boolean enabled) {
-        this.enabled = enabled;
-    }
-
-    public int getDiskSpaceLimitPercentage() {
-        return diskSpaceLimitPercentage;
-    }
-
-    public void setDiskSpaceLimitPercentage(int diskSpaceLimitPercentage) {
-        this.diskSpaceLimitPercentage = diskSpaceLimitPercentage;
-    }
-
-    public int getDiskSpaceWarningPercentage() {
-        return diskSpaceWarningPercentage;
-    }
-
-    public void setDiskSpaceWarningPercentage(int diskSpaceWarningPercentage) {
-        this.diskSpaceWarningPercentage = diskSpaceWarningPercentage;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        QuotaConfigDescriptor that = (QuotaConfigDescriptor) o;
-
-        if (enabled != that.enabled) {
-            return false;
-        }
-
-        if (diskSpaceLimitPercentage != that.diskSpaceLimitPercentage) {
-            return false;
-        }
-
-        if (diskSpaceWarningPercentage != that.diskSpaceWarningPercentage) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = (enabled ? 1 : 0);
-        result = 31 * result + diskSpaceLimitPercentage;
-        result = 31 * result + diskSpaceWarningPercentage;
-        return result;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/quota/package-info.java b/base/config/src/main/java/org/artifactory/descriptor/quota/package-info.java
deleted file mode 100644
index d36aba9..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/quota/package-info.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
- at XmlSchema(namespace = Descriptor.NS, elementFormDefault = XmlNsForm.QUALIFIED)
- at XmlAccessorType(XmlAccessType.FIELD) package org.artifactory.descriptor.quota;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlNsForm;
-import javax.xml.bind.annotation.XmlSchema;
diff --git a/base/config/src/main/java/org/artifactory/descriptor/reader/CentralConfigReader.java b/base/config/src/main/java/org/artifactory/descriptor/reader/CentralConfigReader.java
deleted file mode 100644
index afb1e9c..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/reader/CentralConfigReader.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.reader;
-
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.jaxb.JaxbHelper;
-import org.artifactory.util.Files;
-import org.artifactory.version.ArtifactoryConfigVersion;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-
-/**
- * Reads and converts on-the-fly artifactory config xml files. This should be the only class who reads the artifactory
- * config xml files.
- *
- * @author Tomer Cohen
- */
-public class CentralConfigReader {
-    private static final Logger log = LoggerFactory.getLogger(CentralConfigReader.class);
-
-    /**
-     * @see CentralConfigReader#read(String)
-     */
-    public CentralConfigDescriptor read(File configFile) {
-        return read(Files.readFileToString(configFile));
-    }
-
-    /**
-     * Read an artifactory.config.xml and determine if it is up to date. If not convert it.
-     *
-     * @param artifactoryConfigXml The artifactory config xml to be read.
-     * @return The up to date artifactory config xml after conversion (if needed).
-     */
-    public CentralConfigDescriptor read(String artifactoryConfigXml) {
-        ArtifactoryConfigVersion configVersion = verifyCurrentConfigVersion(artifactoryConfigXml);
-        if (!configVersion.isCurrent()) {
-            log.info("Converting artifactory.config.xml version from '{}' to '{}'",
-                    configVersion.toString(), ArtifactoryConfigVersion.getCurrent());
-            artifactoryConfigXml = configVersion.convert(artifactoryConfigXml);
-        }
-        return JaxbHelper.readConfig(artifactoryConfigXml);
-    }
-
-
-    /**
-     * Sanity check the config file version, in case it was determined that the installed version is current or no
-     * conversions were run for other reasons, but the file still has versioning problems.
-     *
-     * @param configXmlString The all XML data as a string
-     */
-    private ArtifactoryConfigVersion verifyCurrentConfigVersion(String configXmlString) {
-        if (!configXmlString.contains(Descriptor.NS)) {
-            String msg = "The current Artifactory config schema namespace is '" + Descriptor.NS +
-                    "' The provided config does not seem to be compliant with it.";
-            if (log.isDebugEnabled()) {
-                log.debug(msg + "\n" + configXmlString);
-            } else {
-                log.info(msg);
-            }
-            ArtifactoryConfigVersion guessedConfigVersion = ArtifactoryConfigVersion.getConfigVersion(configXmlString);
-            if (guessedConfigVersion == null) {
-                throw new RuntimeException(msg +
-                        "\nThe auto discovery of Artifactory configuration version " +
-                        "did not find any valid version for the artifactory.config.xml file.\n" +
-                        "Please fix this file manually!");
-
-            } else if (guessedConfigVersion == ArtifactoryConfigVersion.getCurrent()) {
-                throw new RuntimeException(msg +
-                        "\nThe auto discovery of Artifactory configuration version found that the " +
-                        "artifactory.config.xml file is up to date but does not have the right schema.\n" +
-                        "Please fix this file manually!");
-            } else {
-                return ArtifactoryConfigVersion.getConfigVersion(configXmlString);
-            }
-        } else {
-            return ArtifactoryConfigVersion.getConfigVersion(configXmlString);
-        }
-    }
-
-}
-
-
diff --git a/base/config/src/main/java/org/artifactory/descriptor/replication/GlobalReplicationsConfigDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/replication/GlobalReplicationsConfigDescriptor.java
deleted file mode 100644
index 4cb30e5..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/replication/GlobalReplicationsConfigDescriptor.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.artifactory.descriptor.replication;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * @author gidis
- */
- at XmlType(name = "replicationsConfigType", propOrder = {"blockPushReplications", "blockPullReplications"}, namespace = Descriptor.NS)
-public class GlobalReplicationsConfigDescriptor implements Descriptor {
-
-    private boolean blockPullReplications;
-
-    private boolean blockPushReplications;
-
-    public boolean isBlockPullReplications() {
-        return blockPullReplications;
-    }
-
-    public void setBlockPullReplications(boolean blockPullReplications) {
-        this.blockPullReplications = blockPullReplications;
-    }
-
-    public boolean isBlockPushReplications() {
-        return blockPushReplications;
-    }
-
-    public void setBlockPushReplications(boolean blockPushReplications) {
-        this.blockPushReplications = blockPushReplications;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/replication/LocalReplicationDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/replication/LocalReplicationDescriptor.java
deleted file mode 100644
index e11c5a3..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/replication/LocalReplicationDescriptor.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.replication;
-
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlIDREF;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * @author Noam Y. Tenne
- */
- at XmlType(name = "LocalReplicationType", propOrder = {"url", "proxy", "socketTimeoutMillis", "username", "password",
-        "enableEventReplication"}, namespace = Descriptor.NS)
-public class LocalReplicationDescriptor extends ReplicationBaseDescriptor {
-
-    @XmlElement(required = false)
-    private String url;
-
-    @XmlIDREF
-    @XmlElement(name = "proxyRef", required = false)
-    private ProxyDescriptor proxy;
-
-    @XmlElement(defaultValue = "15000", required = false)
-    private int socketTimeoutMillis = 15000;//Default socket timeout
-
-    @XmlElement(required = false)
-    private String username;
-
-    @XmlElement(required = false)
-    private String password;
-
-    @XmlElement(defaultValue = "true")
-    private boolean enableEventReplication = false;
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    public ProxyDescriptor getProxy() {
-        return proxy;
-    }
-
-    public void setProxy(ProxyDescriptor proxy) {
-        this.proxy = proxy;
-    }
-
-    public int getSocketTimeoutMillis() {
-        return socketTimeoutMillis;
-    }
-
-    public void setSocketTimeoutMillis(int socketTimeoutMillis) {
-        this.socketTimeoutMillis = socketTimeoutMillis;
-    }
-
-    public String getUsername() {
-        return username;
-    }
-
-    public void setUsername(String username) {
-        this.username = username;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public void setPassword(String password) {
-        this.password = password;
-    }
-
-    public boolean isEnableEventReplication() {
-        return enableEventReplication;
-    }
-
-    public void setEnableEventReplication(boolean enableEventReplication) {
-        this.enableEventReplication = enableEventReplication;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        if (!super.equals(o)) {
-            return false;
-        }
-
-        LocalReplicationDescriptor that = (LocalReplicationDescriptor) o;
-
-        if (enableEventReplication != that.enableEventReplication) {
-            return false;
-        }
-        if (socketTimeoutMillis != that.socketTimeoutMillis) {
-            return false;
-        }
-        if (password != null ? !password.equals(that.password) : that.password != null) {
-            return false;
-        }
-        if (proxy != null ? !proxy.equals(that.proxy) : that.proxy != null) {
-            return false;
-        }
-        if (!url.equals(that.url)) {
-            return false;
-        }
-        if (username != null ? !username.equals(that.username) : that.username != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = super.hashCode();
-        result = 31 * result + url.hashCode();
-        result = 31 * result + (proxy != null ? proxy.hashCode() : 0);
-        result = 31 * result + socketTimeoutMillis;
-        result = 31 * result + (username != null ? username.hashCode() : 0);
-        result = 31 * result + (password != null ? password.hashCode() : 0);
-        result = 31 * result + (enableEventReplication ? 1 : 0);
-        return result;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/replication/RemoteReplicationDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/replication/RemoteReplicationDescriptor.java
deleted file mode 100644
index aa9b140..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/replication/RemoteReplicationDescriptor.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.replication;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * @author Noam Y. Tenne
- */
- at XmlType(name = "RemoteReplicationType", namespace = Descriptor.NS)
-public class RemoteReplicationDescriptor extends ReplicationBaseDescriptor {
-
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/replication/ReplicationBaseDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/replication/ReplicationBaseDescriptor.java
deleted file mode 100644
index 7539598..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/replication/ReplicationBaseDescriptor.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.replication;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.descriptor.TaskDescriptor;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * @author Noam Y. Tenne
- */
- at XmlType(name = "ReplicationBaseType", propOrder = {"enabled", "cronExp", "syncDeletes", "syncProperties", "pathPrefix",
-        "repoKey"}, namespace = Descriptor.NS)
-public abstract class ReplicationBaseDescriptor implements TaskDescriptor {
-
-    @XmlElement(defaultValue = "false")
-    private boolean enabled;
-
-    @XmlElement(required = false)
-    private String cronExp;
-
-    @XmlElement(defaultValue = "true")
-    private boolean syncDeletes = false;
-
-    @XmlElement(defaultValue = "true")
-    private boolean syncProperties = true;
-
-    @XmlElement(required = false)
-    private String pathPrefix;
-
-    @XmlElement(required = true)
-    private String repoKey;
-
-    public boolean isEnabled() {
-        return enabled;
-    }
-
-    public void setEnabled(boolean enabled) {
-        this.enabled = enabled;
-    }
-
-    public String getCronExp() {
-        return cronExp;
-    }
-
-    public void setCronExp(String cronExp) {
-        this.cronExp = cronExp;
-    }
-
-    public boolean isSyncDeletes() {
-        return syncDeletes;
-    }
-
-    public void setSyncDeletes(boolean syncDeletes) {
-        this.syncDeletes = syncDeletes;
-    }
-
-    public boolean isSyncProperties() {
-        return syncProperties;
-    }
-
-    public void setSyncProperties(boolean syncProperties) {
-        this.syncProperties = syncProperties;
-    }
-
-    public String getPathPrefix() {
-        return pathPrefix;
-    }
-
-    public void setPathPrefix(String pathPrefix) {
-        this.pathPrefix = pathPrefix;
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    public RepoPath getRepoPath() {
-        return InternalRepoPathFactory.create(repoKey, pathPrefix);
-    }
-
-    @Override
-    public boolean sameTaskDefinition(TaskDescriptor otherDescriptor) {
-        if (otherDescriptor == null || !(otherDescriptor instanceof ReplicationBaseDescriptor)) {
-            throw new IllegalArgumentException(
-                    "Cannot compare replication descriptor " + this + " with " + otherDescriptor);
-        }
-        ReplicationBaseDescriptor replicationDescriptor = (ReplicationBaseDescriptor) otherDescriptor;
-        return replicationDescriptor.enabled == this.enabled &&
-                StringUtils.equals(replicationDescriptor.repoKey, this.repoKey) &&
-                StringUtils.equals(replicationDescriptor.cronExp, this.cronExp);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof ReplicationBaseDescriptor)) {
-            return false;
-        }
-
-        ReplicationBaseDescriptor that = (ReplicationBaseDescriptor) o;
-
-        if (enabled != that.enabled) {
-            return false;
-        }
-        if (syncDeletes != that.syncDeletes) {
-            return false;
-        }
-        if (syncProperties != that.syncProperties) {
-            return false;
-        }
-        if (cronExp != null ? !cronExp.equals(that.cronExp) : that.cronExp != null) {
-            return false;
-        }
-        if (pathPrefix != null ? !pathPrefix.equals(that.pathPrefix) : that.pathPrefix != null) {
-            return false;
-        }
-        if (repoKey != null ? !repoKey.equals(that.repoKey) : that.repoKey != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = (enabled ? 1 : 0);
-        result = 31 * result + (cronExp != null ? cronExp.hashCode() : 0);
-        result = 31 * result + (syncDeletes ? 1 : 0);
-        result = 31 * result + (syncProperties ? 1 : 0);
-        result = 31 * result + (pathPrefix != null ? pathPrefix.hashCode() : 0);
-        result = 31 * result + (repoKey != null ? repoKey.hashCode() : 0);
-        return result;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/replication/package-info.java b/base/config/src/main/java/org/artifactory/descriptor/replication/package-info.java
deleted file mode 100644
index 078b24f..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/replication/package-info.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
- at XmlSchema(namespace = Descriptor.NS,
-        elementFormDefault = XmlNsForm.QUALIFIED)
- at XmlAccessorType(XmlAccessType.FIELD) package org.artifactory.descriptor.replication;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlNsForm;
-import javax.xml.bind.annotation.XmlSchema;
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/BintrayApplicationConfig.java b/base/config/src/main/java/org/artifactory/descriptor/repo/BintrayApplicationConfig.java
deleted file mode 100644
index d872f1c..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/BintrayApplicationConfig.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlID;
-import javax.xml.bind.annotation.XmlType;
-
- at XmlType(name = "BintrayApplicationType",
-        propOrder = {"key", "clientId", "secret", "org", "scope", "refreshToken"})
-public class BintrayApplicationConfig implements Descriptor {
-
-    @XmlID
-    @XmlElement(required = true)
-    private String key;
-
-    @XmlElement(required = true)
-    private String clientId;
-
-    @XmlElement(required = true)
-    private String secret;
-
-    @XmlElement(required = true)
-    private String org;
-
-    @XmlElement(required = true)
-    private String scope;
-
-    @XmlElement(required = false)
-    private String refreshToken;
-
-    public BintrayApplicationConfig() {
-
-    }
-
-    public BintrayApplicationConfig(String key, String clientId, String secret, String org, String scope) {
-        this.key = key;
-        this.clientId = clientId;
-        this.secret = secret;
-        this.org = org;
-        this.scope = scope;
-    }
-
-    public String getKey() {
-        return key;
-    }
-
-    public void setKey(String key) {
-        this.key = key;
-    }
-
-    public String getClientId() {
-        return clientId;
-    }
-
-    public void setClientId(String clientId) {
-        this.clientId = clientId;
-    }
-
-    public String getSecret() {
-        return secret;
-    }
-
-    public void setSecret(String secret) {
-        this.secret = secret;
-    }
-
-    public String getOrg() {
-        return org;
-    }
-
-    public void setOrg(String org) {
-        this.org = org;
-    }
-
-    public String getScope() {
-        return scope;
-    }
-
-    public void setScope(String scope) {
-        this.scope = scope;
-    }
-
-    public String getRefreshToken() {
-        return refreshToken;
-    }
-
-    public void setRefreshToken(String refreshToken) {
-        this.refreshToken = refreshToken;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        BintrayApplicationConfig that = (BintrayApplicationConfig) o;
-        return key.equals(that.key);
-    }
-
-    @Override
-    public int hashCode() {
-        return key.hashCode();
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/BowerConfiguration.java b/base/config/src/main/java/org/artifactory/descriptor/repo/BowerConfiguration.java
deleted file mode 100644
index 25a1593..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/BowerConfiguration.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.artifactory.descriptor.repo;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * @author Shay Yaakov
- */
- at XmlType(name = "BowerConfigurationType", propOrder = {"bowerRegistryUrl"}, namespace = Descriptor.NS)
-public class BowerConfiguration implements Descriptor {
-
-    @XmlElement(defaultValue = "https://bower.herokuapp.com", required = false)
-    private String bowerRegistryUrl = "https://bower.herokuapp.com";
-
-    public String getBowerRegistryUrl() {
-        return bowerRegistryUrl;
-    }
-
-    public void setBowerRegistryUrl(String bowerRegistryUrl) {
-        this.bowerRegistryUrl = bowerRegistryUrl;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/ChecksumPolicyType.java b/base/config/src/main/java/org/artifactory/descriptor/repo/ChecksumPolicyType.java
deleted file mode 100644
index 9c3adc2..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/ChecksumPolicyType.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import javax.xml.bind.annotation.XmlEnum;
-import javax.xml.bind.annotation.XmlEnumValue;
-
-/**
- * Enum of the checksum policies for repositories.
- *
- * @author Yossi Shaul
- */
- at XmlEnum(String.class)
-public enum ChecksumPolicyType {
-    @XmlEnumValue("generate-if-absent")GEN_IF_ABSENT("generate-if-absent"),
-    @XmlEnumValue("fail")FAIL("fail"),
-    @XmlEnumValue("ignore-and-generate")IGNORE_AND_GEN("ignore-and-generate"),
-    @XmlEnumValue("pass-thru")PASS_THRU("pass-thru");
-
-    String message;
-
-    ChecksumPolicyType(String message) {
-        this.message = message;
-    }
-
-    public String getMessage() {
-        return message;
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/CocoaPodsConfiguration.java b/base/config/src/main/java/org/artifactory/descriptor/repo/CocoaPodsConfiguration.java
deleted file mode 100644
index 5df51c9..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/CocoaPodsConfiguration.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.descriptor.repo;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * @author Dan Feldman
- */
- at XmlType(name = "CocoaPodsConfigurationType", propOrder = {"cocoaPodsSpecsRepoUrl", "specRepoProvider"},
-        namespace = Descriptor.NS)
-public class CocoaPodsConfiguration implements Descriptor {
-
-    @XmlElement(defaultValue = "https://github.com/CocoaPods/Specs", required = false)
-    private String cocoaPodsSpecsRepoUrl = "https://github.com/CocoaPods/Specs";
-
-    @XmlElement(name = "specRepoProvider")
-    private VcsGitConfiguration specRepoProvider = new VcsGitConfiguration();
-
-    public String getCocoaPodsSpecsRepoUrl() {
-        return cocoaPodsSpecsRepoUrl;
-    }
-
-    public void setCocoaPodsSpecsRepoUrl(String cocoaPodsSpecsRepoUrl) {
-        this.cocoaPodsSpecsRepoUrl = cocoaPodsSpecsRepoUrl;
-    }
-
-    public VcsGitConfiguration getSpecRepoProvider() {
-        return specRepoProvider;
-    }
-
-    public void setSpecRepoProvider(VcsGitConfiguration specRepoProvider) {
-        this.specRepoProvider = specRepoProvider;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/DockerApiVersion.java b/base/config/src/main/java/org/artifactory/descriptor/repo/DockerApiVersion.java
deleted file mode 100644
index 0364748..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/DockerApiVersion.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import javax.xml.bind.annotation.XmlEnum;
-import javax.xml.bind.annotation.XmlEnumValue;
-
-/**
- * @author Shay Yaakov
- */
- at XmlEnum(value = String.class)
-public enum DockerApiVersion {
-    @XmlEnumValue("V1")V1("V1"),
-    @XmlEnumValue("V2")V2("V2");
-
-    private final String val;
-
-    DockerApiVersion(String val) {
-        this.val = val;
-    }
-
-    public String toString() {
-        return val;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/EmptyVirtualResolverFilter.java b/base/config/src/main/java/org/artifactory/descriptor/repo/EmptyVirtualResolverFilter.java
deleted file mode 100644
index 4da1c66..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/EmptyVirtualResolverFilter.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import java.io.Serializable;
-
-/**
- * Default implementation of virtual resolver filter which never filters any virtual.
- *
- * @author Shay Yaakov
- */
-public class EmptyVirtualResolverFilter implements VirtualResolverFilter, Serializable {
-
-    @Override
-    public boolean accepts(VirtualRepoDescriptor descriptor) {
-        return true;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/ExternalDependenciesConfig.java b/base/config/src/main/java/org/artifactory/descriptor/repo/ExternalDependenciesConfig.java
deleted file mode 100644
index 7366c28..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/ExternalDependenciesConfig.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlIDREF;
-import javax.xml.bind.annotation.XmlType;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Shay Yaakov
- */
- at XmlType(name = "ExternalDependenciesConfigType", propOrder = {"enabled", "patterns", "remoteRepo"}, namespace = Descriptor.NS)
-public class ExternalDependenciesConfig implements Descriptor {
-
-    @XmlElement(defaultValue = "false", required = false)
-    private boolean enabled = false;
-
-    @XmlElementWrapper(name = "patterns")
-    @XmlElement(name = "pattern", type = String.class, required = false)
-    private List<String> patterns = new ArrayList<>();
-
-    @XmlIDREF
-    @XmlElement(name = "remoteRepo", type = RemoteRepoDescriptor.class, required = true)
-    private RemoteRepoDescriptor remoteRepo;
-
-    public boolean isEnabled() {
-        return enabled;
-    }
-
-    public void setEnabled(boolean enabled) {
-        this.enabled = enabled;
-    }
-
-    public List<String> getPatterns() {
-        return patterns;
-    }
-
-    public void setPatterns(List<String> patterns) {
-        this.patterns = patterns;
-    }
-
-    public RemoteRepoDescriptor getRemoteRepo() {
-        return remoteRepo;
-    }
-
-    public void setRemoteRepo(RemoteRepoDescriptor remoteRepo) {
-        this.remoteRepo = remoteRepo;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/HttpRepoDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/repo/HttpRepoDescriptor.java
deleted file mode 100644
index ee39a96..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/HttpRepoDescriptor.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlIDREF;
-import javax.xml.bind.annotation.XmlType;
-
- at XmlType(name = "RemoteRepoType",
-        propOrder = {"username", "password", "allowAnyHostAuth", "socketTimeoutMillis", "enableCookieManagement",
-                "enableTokenAuthentication", "localAddress", "proxy", "queryParams", "propagateQueryParams"},
-        namespace = Descriptor.NS)
-public class HttpRepoDescriptor extends RemoteRepoDescriptor {
-
-    private String username;
-
-    private String password;
-
-    private boolean allowAnyHostAuth;
-
-    @XmlElement(defaultValue = "15000", required = false)
-    private int socketTimeoutMillis = 15000;//Default socket timeout
-
-    private boolean enableCookieManagement;
-
-    private boolean enableTokenAuthentication;
-
-    private String localAddress;
-    @XmlIDREF
-    @XmlElement(name = "proxyRef")
-    private ProxyDescriptor proxy;
-
-    private String queryParams;
-
-    private boolean propagateQueryParams;
-
-    public String getUsername() {
-        return username;
-    }
-
-    public void setUsername(String username) {
-        this.username = username;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public void setPassword(String password) {
-        this.password = password;
-    }
-
-
-    public boolean isAllowAnyHostAuth() {
-        return allowAnyHostAuth;
-    }
-
-    public void setAllowAnyHostAuth(boolean allowAnyHostAuth) {
-        this.allowAnyHostAuth = allowAnyHostAuth;
-    }
-
-    public int getSocketTimeoutMillis() {
-        return socketTimeoutMillis;
-    }
-
-    public void setSocketTimeoutMillis(int socketTimeoutMillis) {
-        this.socketTimeoutMillis = socketTimeoutMillis;
-    }
-
-    public String getLocalAddress() {
-        return localAddress;
-    }
-
-    public void setLocalAddress(String localAddress) {
-        this.localAddress = localAddress;
-    }
-
-    public ProxyDescriptor getProxy() {
-        return proxy;
-    }
-
-    public void setProxy(ProxyDescriptor proxy) {
-        this.proxy = proxy;
-    }
-
-    public String getQueryParams() {
-        return StringUtils.removeStart(queryParams, "?");
-    }
-
-    public void setQueryParams(String queryParams) {
-        this.queryParams = queryParams;
-    }
-
-    public boolean isEnableCookieManagement() {
-        return enableCookieManagement;
-    }
-
-    public void setEnableCookieManagement(boolean enableCookieManagement) {
-        this.enableCookieManagement = enableCookieManagement;
-    }
-
-    public boolean isEnableTokenAuthentication() {
-        return enableTokenAuthentication;
-    }
-
-    public void setEnableTokenAuthentication(boolean enableTokenAuthentication) {
-        this.enableTokenAuthentication = enableTokenAuthentication;
-    }
-
-    public boolean isPropagateQueryParams() {
-        return propagateQueryParams;
-    }
-
-    public void setPropagateQueryParams(boolean propagateQueryParams) {
-        this.propagateQueryParams = propagateQueryParams;
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/LocalCacheRepoDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/repo/LocalCacheRepoDescriptor.java
deleted file mode 100644
index 01c8c9f..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/LocalCacheRepoDescriptor.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import org.artifactory.descriptor.TaskDescriptor;
-import org.artifactory.descriptor.property.PropertySet;
-
-import javax.xml.bind.annotation.XmlTransient;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-/**
- * A non-serialized in-memory descriptor of local cache repositories.
- */
-public class LocalCacheRepoDescriptor extends LocalRepoDescriptor implements TaskDescriptor {
-    public static final String PATH_SUFFIX = "-cache";
-
-    @XmlTransient
-    private RemoteRepoDescriptor remoteRepo;
-
-    public RemoteRepoDescriptor getRemoteRepo() {
-        return remoteRepo;
-    }
-
-    public void setRemoteRepo(RemoteRepoDescriptor remoteRepo) {
-        this.remoteRepo = remoteRepo;
-    }
-
-    @Override
-    public boolean isLocal() {
-        return true;
-    }
-
-    @Override
-    public boolean isCache() {
-        return true;
-    }
-
-    @Override
-    public RepoType getType() {
-        return remoteRepo.getType();
-    }
-
-    @Override
-    public boolean isBlackedOut() {
-        return remoteRepo.isBlackedOut();
-    }
-
-    @Override
-    public String getIncludesPattern() {
-        return remoteRepo.getIncludesPattern();
-    }
-
-    @Override
-    public String getExcludesPattern() {
-        return remoteRepo.getExcludesPattern();
-    }
-
-    @Override
-    public boolean isHandleReleases() {
-        return remoteRepo.isHandleReleases();
-    }
-
-    @Override
-    public boolean isHandleSnapshots() {
-        return remoteRepo.isHandleSnapshots();
-    }
-
-    @Override
-    public int getMaxUniqueSnapshots() {
-        return remoteRepo.getMaxUniqueSnapshots();
-    }
-
-    @Override
-    public List<PropertySet> getPropertySets() {
-        return remoteRepo.getPropertySets();
-    }
-
-    @Override
-    public void setPropertySets(List<PropertySet> propertySets) {
-        remoteRepo.setPropertySets(propertySets);
-    }
-
-    @Override
-    public boolean isPropertySetExists(String propertySetName) {
-        return remoteRepo.isPropertySetExists(propertySetName);
-    }
-
-    @Override
-    public void addPropertySet(PropertySet propertySet) {
-        remoteRepo.addPropertySet(propertySet);
-    }
-
-    @Override
-    public void updatePropertySet(PropertySet propertySet) {
-        remoteRepo.updatePropertySet(propertySet);
-    }
-
-    @Override
-    public PropertySet removePropertySet(String propertySetName) {
-        return remoteRepo.removePropertySet(propertySetName);
-    }
-
-    @Override
-    public PropertySet getPropertySet(String propertySetName) {
-        return remoteRepo.getPropertySet(propertySetName);
-    }
-
-    @Override
-    public boolean isArchiveBrowsingEnabled() {
-        return remoteRepo.isArchiveBrowsingEnabled();
-    }
-
-    @Override
-    public void setArchiveBrowsingEnabled(boolean archiveBrowsingEnabled) {
-        remoteRepo.setArchiveBrowsingEnabled(archiveBrowsingEnabled);
-    }
-
-    @Override
-    public boolean isForceDockerAuthentication() {
-        return remoteRepo.isForceDockerAuthentication();
-    }
-
-    @Override
-    public void setForceDockerAuthentication(boolean forceDockerAuthentication) {
-        remoteRepo.setForceDockerAuthentication(forceDockerAuthentication);
-    }
-
-    @Override
-    public boolean isForceNugetAuthentication() {
-        return remoteRepo.isForceNugetAuthentication();
-    }
-
-    @Override
-    public void setForceNugetAuthentication(boolean forceNugetAuthentication) {
-        remoteRepo.setForceNugetAuthentication(forceNugetAuthentication);
-    }
-
-    /*@Override
-    public void setReverseProxy(ReverseProxyRepoConfig reverseProxy) {
-        remoteRepo.setReverseProxy(reverseProxy);
-    }*/
-
-    @Override
-    public boolean sameTaskDefinition(TaskDescriptor otherDescriptor) {
-        if (otherDescriptor == null || !(otherDescriptor instanceof LocalCacheRepoDescriptor)) {
-            throw new IllegalArgumentException("Cannot compare backup dexcriptor " + this + " with " + otherDescriptor);
-        }
-        LocalCacheRepoDescriptor localCacheRepoDesc = (LocalCacheRepoDescriptor) otherDescriptor;
-        return localCacheRepoDesc.isBlackedOut() == this.isBlackedOut() &&
-                localCacheRepoDesc.getKey().equals(this.getKey()) &&
-                localCacheRepoDesc.remoteRepo.getUnusedArtifactsCleanupPeriodHours() == this.remoteRepo.getUnusedArtifactsCleanupPeriodHours();
-    }
-
-    public long getRetrievalCachePeriodMillis() {
-        return TimeUnit.SECONDS.toMillis(remoteRepo.getRetrievalCachePeriodSecs());
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/LocalRepoAlphaComparator.java b/base/config/src/main/java/org/artifactory/descriptor/repo/LocalRepoAlphaComparator.java
deleted file mode 100644
index 74f3246..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/LocalRepoAlphaComparator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import java.io.Serializable;
-import java.util.Comparator;
-
-/**
- * Sorts local repo descriptors in an alphabetical order with ordinary locals preceding caches
- *
- * @author Noam Y. Tenne
- */
-public class LocalRepoAlphaComparator implements Comparator<LocalRepoDescriptor>, Serializable {
-    @Override
-    public int compare(LocalRepoDescriptor repo1, LocalRepoDescriptor repo2) {
-        boolean repo1IsCache = repo1.isCache();
-        boolean repo2IsCache = repo2.isCache();
-
-        if (repo1IsCache && !repo2IsCache) {
-            return 1;
-        } else if (!repo1IsCache && repo2IsCache) {
-            return -1;
-        }
-        return repo1.getKey().compareTo(repo2.getKey());
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/LocalRepoChecksumPolicyType.java b/base/config/src/main/java/org/artifactory/descriptor/repo/LocalRepoChecksumPolicyType.java
deleted file mode 100644
index adefc62..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/LocalRepoChecksumPolicyType.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import javax.xml.bind.annotation.XmlEnum;
-import javax.xml.bind.annotation.XmlEnumValue;
-
-/**
- * Checksum policy of local non-cache repositories, determines which value to return when client requests checksum.
- *
- * @author Yossi Shaul
- */
- at XmlEnum(String.class)
-public enum LocalRepoChecksumPolicyType {
-    @XmlEnumValue("client-checksums")CLIENT("client-checksums"),
-    @XmlEnumValue("server-generated-checksums")SERVER("server-generated-checksums");
-
-    String message;
-
-    LocalRepoChecksumPolicyType(String message) {
-        this.message = message;
-    }
-
-    public String getMessage() {
-        return message;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/LocalRepoDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/repo/LocalRepoDescriptor.java
deleted file mode 100644
index a82da95..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/LocalRepoDescriptor.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
- at XmlType(name = "LocalRepoType",
-        propOrder = {"snapshotVersionBehavior", "checksumPolicyType", "calculateYumMetadata", "yumRootDepth",
-                     "yumGroupFileNames", "debianTrivialLayout"},
-        namespace = Descriptor.NS)
-public class LocalRepoDescriptor extends RealRepoDescriptor {
-
-    @XmlElement(defaultValue = "unique", required = false)
-    private SnapshotVersionBehavior snapshotVersionBehavior = SnapshotVersionBehavior.UNIQUE;
-
-    @XmlElement(name = "localRepoChecksumPolicyType", defaultValue = "client-checksums", required = false)
-    private LocalRepoChecksumPolicyType checksumPolicyType = LocalRepoChecksumPolicyType.CLIENT;
-
-    private boolean calculateYumMetadata;
-
-    private int yumRootDepth;
-
-    private String yumGroupFileNames;
-
-    private boolean debianTrivialLayout = false;
-
-    public SnapshotVersionBehavior getSnapshotVersionBehavior() {
-        return snapshotVersionBehavior;
-    }
-
-    public void setSnapshotVersionBehavior(SnapshotVersionBehavior snapshotVersionBehavior) {
-        this.snapshotVersionBehavior = snapshotVersionBehavior;
-    }
-
-    @Override
-    public boolean isLocal() {
-        return true;
-    }
-
-    @Override
-    public boolean isCache() {
-        return false;
-    }
-
-    public LocalRepoChecksumPolicyType getChecksumPolicyType() {
-        return checksumPolicyType;
-    }
-
-    public void setChecksumPolicyType(LocalRepoChecksumPolicyType checksumPolicyType) {
-        this.checksumPolicyType = checksumPolicyType;
-    }
-
-    public boolean isCalculateYumMetadata() {
-        return calculateYumMetadata;
-    }
-
-    public void setCalculateYumMetadata(boolean calculateYumMetadata) {
-        this.calculateYumMetadata = calculateYumMetadata;
-    }
-
-    public int getYumRootDepth() {
-        return yumRootDepth;
-    }
-
-    public void setYumRootDepth(int yumRootDepth) {
-        this.yumRootDepth = yumRootDepth;
-    }
-
-    public String getYumGroupFileNames() {
-        return yumGroupFileNames;
-    }
-
-    public void setYumGroupFileNames(String yumGroupFileNames) {
-        this.yumGroupFileNames = yumGroupFileNames;
-    }
-
-    public boolean isDebianTrivialLayout() {
-        return debianTrivialLayout;
-    }
-
-    public void setDebianTrivialLayout(boolean debianTrivialLayout) {
-        this.debianTrivialLayout = debianTrivialLayout;
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/NuGetConfiguration.java b/base/config/src/main/java/org/artifactory/descriptor/repo/NuGetConfiguration.java
deleted file mode 100644
index 4e73fbf..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/NuGetConfiguration.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * @author Noam Y. Tenne
- */
- at XmlType(name = "NuGetConfigurationType", propOrder = {"feedContextPath", "downloadContextPath"},
-        namespace = Descriptor.NS)
-public class NuGetConfiguration implements Descriptor {
-
-    @XmlElement(defaultValue = "", required = false)
-    private String feedContextPath = "";
-
-    @XmlElement(defaultValue = "", required = false)
-    private String downloadContextPath = "";
-
-    public String getFeedContextPath() {
-        return feedContextPath;
-    }
-
-    public void setFeedContextPath(String feedContextPath) {
-        if (feedContextPath == null) {
-            feedContextPath = "";
-        }
-        this.feedContextPath = feedContextPath;
-    }
-
-    public String getDownloadContextPath() {
-        return downloadContextPath;
-    }
-
-    public void setDownloadContextPath(String downloadContextPath) {
-        this.downloadContextPath = downloadContextPath;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/P2Configuration.java b/base/config/src/main/java/org/artifactory/descriptor/repo/P2Configuration.java
deleted file mode 100644
index a4c39f7..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/P2Configuration.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlType;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Date: 9/25/11
- * Time: 3:39 PM
- *
- * @author Fred Simon
- */
- at XmlType(name = "P2ConfigurationType", propOrder = {"urls"}, namespace = Descriptor.NS)
-public class P2Configuration implements Descriptor {
-
-    @XmlElementWrapper(name = "urls")
-    @XmlElement(name = "url", type = String.class, required = false)
-    private List<String> urls = new ArrayList<>();
-
-    public List<String> getUrls() {
-        return urls;
-    }
-
-    public void setUrls(List<String> urls) {
-        this.urls = urls;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/PomCleanupPolicy.java b/base/config/src/main/java/org/artifactory/descriptor/repo/PomCleanupPolicy.java
deleted file mode 100644
index 38dde2a..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/PomCleanupPolicy.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import javax.xml.bind.annotation.XmlEnum;
-import javax.xml.bind.annotation.XmlEnumValue;
-
-/**
- * @author Eli Givoni
- */
- at XmlEnum(String.class)
-public enum PomCleanupPolicy {
-    @XmlEnumValue("discard_active_reference")discard_active_reference("Discard Active Reference"),
-    @XmlEnumValue("discard_any_reference")discard_any_reference("Discard Any Reference"),
-    @XmlEnumValue("nothing")nothing("Nothing");
-
-    private String message;
-
-    PomCleanupPolicy(String message) {
-        this.message = message;
-    }
-
-    public String getMessage() {
-        return message;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/ProxyDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/repo/ProxyDescriptor.java
deleted file mode 100644
index 942511a..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/ProxyDescriptor.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.Descriptor;
-
-import javax.annotation.Nullable;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlID;
-import javax.xml.bind.annotation.XmlType;
-
- at XmlType(name = "ProxyType",
-        propOrder = {"key", "host", "port", "username", "password", "ntHost", "domain", "defaultProxy", "redirectedToHosts"})
-public class ProxyDescriptor implements Descriptor {
-
-    @XmlID
-    @XmlElement(required = true)
-    private String key;
-
-    @XmlElement(required = true)
-    private String host;
-
-    @XmlElement(required = true)
-    private int port;
-
-    private String username;
-    private String password;
-    private String ntHost;
-    private String domain;
-    private boolean defaultProxy;
-    /**
-     * New line or comma separated host names that the proxy might redirect requests to.
-     */
-    private String redirectedToHosts;
-
-    public String getKey() {
-        return key;
-    }
-
-    public void setKey(String key) {
-        this.key = key;
-    }
-
-    public String getHost() {
-        return host;
-    }
-
-    public void setHost(String host) {
-        this.host = host;
-    }
-
-    public int getPort() {
-        return port;
-    }
-
-    public void setPort(int port) {
-        this.port = port;
-    }
-
-    public String getUsername() {
-        return username;
-    }
-
-    public void setUsername(String username) {
-        this.username = username;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public void setPassword(String password) {
-        this.password = password;
-    }
-
-    public String getNtHost() {
-        return ntHost;
-    }
-
-    public void setNtHost(String ntHost) {
-        this.ntHost = ntHost;
-    }
-
-    public String getDomain() {
-        return domain;
-    }
-
-    public void setDomain(String domain) {
-        this.domain = domain;
-    }
-
-    public boolean isDefaultProxy() {
-        return defaultProxy;
-    }
-
-    public void setDefaultProxy(boolean defaultProxy) {
-        this.defaultProxy = defaultProxy;
-    }
-
-    /**
-     * Returns new line or comma separated host names that the proxy might redirect requests to.
-     * Use {@link ProxyDescriptor#getRedirectedToHostsList()} to get a list of host names.
-     */
-    @Nullable
-    public String getRedirectedToHosts() {
-        return redirectedToHosts;
-    }
-
-    @Nullable
-    public String[] getRedirectedToHostsList() {
-        // split by newline, space, comma or semi-colon
-        return StringUtils.split(redirectedToHosts, "\n,; ");
-    }
-
-    public void setRedirectedToHosts(@Nullable String redirectedToHosts) {
-        this.redirectedToHosts = StringUtils.trim(redirectedToHosts);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        ProxyDescriptor that = (ProxyDescriptor) o;
-        return key.equals(that.key);
-    }
-
-    @Override
-    public int hashCode() {
-        return key.hashCode();
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/PypiConfiguration.java b/base/config/src/main/java/org/artifactory/descriptor/repo/PypiConfiguration.java
deleted file mode 100644
index 1a6c1be..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/PypiConfiguration.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.descriptor.repo;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.annotation.Nonnull;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * @author Yoav Luft
- */
- at XmlType(name = "PypiConfigurationType", propOrder = {"indexContextPath", "packagesContextPath"})
-public class PypiConfiguration implements Descriptor {
-
-    @XmlElement(defaultValue = "", required = false)
-    private String indexContextPath;
-
-    @XmlElement(defaultValue = "", required = false)
-    private String packagesContextPath;
-
-    public String getPackagesContextPath() {
-        return packagesContextPath;
-    }
-
-    public void setPackagesContextPath(@Nonnull String packagesContextPath) {
-        this.packagesContextPath = packagesContextPath;
-    }
-
-    public String getIndexContextPath() {
-        return indexContextPath;
-    }
-
-    public void setIndexContextPath(@Nonnull String indexContextPath) {
-        this.indexContextPath = indexContextPath;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/RealRepoDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/repo/RealRepoDescriptor.java
deleted file mode 100644
index d9bdaf7..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/RealRepoDescriptor.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.util.AlreadyExistsException;
-import org.artifactory.util.DoesNotExistException;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlIDREF;
-import javax.xml.bind.annotation.XmlType;
-import java.util.ArrayList;
-import java.util.List;
-
- at XmlType(name = "RealRepoType", propOrder = {"blackedOut", "handleReleases", "handleSnapshots",
-        "maxUniqueSnapshots", "suppressPomConsistencyChecks", "propertySets", "archiveBrowsingEnabled"},
-        namespace = Descriptor.NS)
-public abstract class RealRepoDescriptor extends RepoBaseDescriptor {
-
-    @XmlElement(defaultValue = "false", required = false)
-    private boolean blackedOut;
-
-    @XmlElement(defaultValue = "true", required = false)
-    private boolean handleReleases = true;
-
-    @XmlElement(defaultValue = "true", required = false)
-    private boolean handleSnapshots = true;
-
-    @XmlElement(defaultValue = "0", required = false)
-    private int maxUniqueSnapshots;
-
-    @XmlElement(defaultValue = "true", required = false)
-    private boolean suppressPomConsistencyChecks = true;
-
-    @XmlElement(defaultValue = "false", required = false)
-    private boolean archiveBrowsingEnabled;
-
-    @XmlIDREF
-    @XmlElementWrapper(name = "propertySets")
-    @XmlElement(name = "propertySetRef", type = PropertySet.class, required = false)
-    private List<PropertySet> propertySets = new ArrayList<>();
-
-    public boolean isHandleReleases() {
-        return handleReleases;
-    }
-
-    public void setHandleReleases(boolean handleReleases) {
-        this.handleReleases = handleReleases;
-    }
-
-    public boolean isHandleSnapshots() {
-        return handleSnapshots;
-    }
-
-    public void setHandleSnapshots(boolean handleSnapshots) {
-        this.handleSnapshots = handleSnapshots;
-    }
-
-
-    public boolean isBlackedOut() {
-        return blackedOut;
-    }
-
-    public void setBlackedOut(boolean blackedOut) {
-        this.blackedOut = blackedOut;
-    }
-
-    public int getMaxUniqueSnapshots() {
-        return maxUniqueSnapshots;
-    }
-
-    public void setMaxUniqueSnapshots(int maxUniqueSnapshots) {
-        this.maxUniqueSnapshots = maxUniqueSnapshots;
-    }
-
-    public boolean isSuppressPomConsistencyChecks() {
-        return suppressPomConsistencyChecks;
-    }
-
-    public void setSuppressPomConsistencyChecks(boolean suppressPomConsistencyChecks) {
-        this.suppressPomConsistencyChecks = suppressPomConsistencyChecks;
-    }
-
-    public List<PropertySet> getPropertySets() {
-        return propertySets;
-    }
-
-    public void setPropertySets(List<PropertySet> propertySets) {
-        this.propertySets = propertySets;
-    }
-
-    public boolean isPropertySetExists(String propertySetName) {
-        return getPropertySet(propertySetName) != null;
-    }
-
-    public void addPropertySet(PropertySet propertySet) {
-        String propertySetName = propertySet.getName();
-        if (isPropertySetExists(propertySetName)) {
-            throw new AlreadyExistsException("Property set " + propertySetName + " already exists");
-        }
-        propertySets.add(propertySet);
-    }
-
-    public void updatePropertySet(PropertySet propertySet) {
-        int index = propertySets.indexOf(propertySet);
-        if (index == -1) {
-            throw new DoesNotExistException("Property set " + propertySet.getName() + " does not exist");
-        }
-        propertySets.set(index, propertySet);
-    }
-
-    public PropertySet removePropertySet(String propertySetName) {
-        PropertySet propertySet = getPropertySet(propertySetName);
-        if (propertySet == null) {
-            return null;
-        }
-        //Remove the property set from the property sets list
-        while (propertySets.contains(propertySet)) {
-            boolean removed = propertySets.remove(propertySet);
-            //Sanity check
-            if (!removed) {
-                throw new RuntimeException("Property set: '" + propertySet.getName() + "' could be removed from " +
-                        "repository: '" + getKey() + "'");
-            }
-        }
-        return propertySet;
-    }
-
-    public PropertySet getPropertySet(String propertySetName) {
-        for (PropertySet propertySet : propertySets) {
-            if (propertySet.getName().equals(propertySetName)) {
-                return propertySet;
-            }
-        }
-        return null;
-    }
-
-    public boolean isArchiveBrowsingEnabled() {
-        return archiveBrowsingEnabled;
-    }
-
-    public void setArchiveBrowsingEnabled(boolean archiveBrowsingEnabled) {
-        this.archiveBrowsingEnabled = archiveBrowsingEnabled;
-    }
-
-    @Override
-    public boolean isReal() {
-        return true;
-    }
-
-    public abstract boolean isLocal();
-
-    public abstract boolean isCache();
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/RemoteRepoDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/repo/RemoteRepoDescriptor.java
deleted file mode 100644
index 19975f7..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/RemoteRepoDescriptor.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.descriptor.delegation.ContentSynchronisation;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlIDREF;
-import javax.xml.bind.annotation.XmlType;
-
- at XmlType(name = "RemoteRepoBaseType", propOrder = {"url", "offline", "hardFail", "storeArtifactsLocally",
-        "fetchJarsEagerly", "fetchSourcesEagerly", "retrievalCachePeriodSecs", "assumedOfflinePeriodSecs",
-        "missedRetrievalCachePeriodSecs", "checksumPolicyType",
-        "unusedArtifactsCleanupPeriodHours", "shareConfiguration", "synchronizeProperties", "listRemoteFolderItems",
-        "remoteRepoLayout", "rejectInvalidJars", "nuget", "pypi", "bower", "cocoaPods", "p2OriginalUrl", "vcs",
-        "contentSynchronisation", "blockMismatchingMimeTypes", "mismatchingMimeTypesOverrideList"},
-        namespace = Descriptor.NS)
-public abstract class RemoteRepoDescriptor extends RealRepoDescriptor {
-
-    @XmlElement(defaultValue = "true", required = false)
-    protected boolean storeArtifactsLocally = true;
-    @XmlElement(defaultValue = "false", required = false)
-    protected boolean fetchJarsEagerly = false;
-    @XmlElement(defaultValue = "false", required = false)
-    protected boolean fetchSourcesEagerly = false;
-    @XmlElement(defaultValue = "false", required = false)
-    protected boolean shareConfiguration = false;
-    @XmlElement(required = true)
-    private String url;
-    @XmlElement(defaultValue = "false", required = false)
-    private boolean hardFail;
-    @XmlElement(defaultValue = "false", required = false)
-    private boolean offline;
-    @XmlElement(defaultValue = "600", required = false)
-    private long retrievalCachePeriodSecs = 600;//10 min.
-    @XmlElement(defaultValue = "300", required = false)
-    private long assumedOfflinePeriodSecs = 300;   //5 minutes
-    @XmlElement(defaultValue = "1800", required = false)
-    private long missedRetrievalCachePeriodSecs = 1800;//30 min.
-    @XmlElement(name = "remoteRepoChecksumPolicyType", defaultValue = "generate-if-absent", required = false)
-    private ChecksumPolicyType checksumPolicyType = ChecksumPolicyType.GEN_IF_ABSENT;
-    @XmlElement(defaultValue = "0", required = false)
-    private int unusedArtifactsCleanupPeriodHours = 0;
-    @XmlElement(defaultValue = "false", required = false)
-    private boolean synchronizeProperties;
-    @XmlElement(defaultValue = "true", required = false)
-    private boolean listRemoteFolderItems = true;
-
-    @XmlIDREF
-    @XmlElement(name = "remoteRepoLayoutRef")
-    private RepoLayout remoteRepoLayout;
-
-    @XmlElement(defaultValue = "false", required = false)
-    private boolean rejectInvalidJars;
-
-    @XmlElement(required = false)
-    private String p2OriginalUrl;
-
-    private NuGetConfiguration nuget;
-
-    private PypiConfiguration pypi;
-
-    private VcsConfiguration vcs;
-
-    private BowerConfiguration bower;
-
-    private CocoaPodsConfiguration cocoaPods;
-
-    @XmlElement(name = "contentSynchronisation", required = false)
-    private ContentSynchronisation contentSynchronisation;
-
-    @XmlElement(defaultValue = "true", required = true)
-    private boolean blockMismatchingMimeTypes = true;
-
-    @XmlElement(required = false)
-    private String mismatchingMimeTypesOverrideList;
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    public boolean isHardFail() {
-        return hardFail;
-    }
-
-    public void setHardFail(boolean hardFail) {
-        this.hardFail = hardFail;
-    }
-
-    public boolean isOffline() {
-        return offline;
-    }
-
-    public void setOffline(boolean offline) {
-        this.offline = offline;
-    }
-
-    public long getRetrievalCachePeriodSecs() {
-        return retrievalCachePeriodSecs;
-    }
-
-    public void setRetrievalCachePeriodSecs(long retrievalCachePeriodSecs) {
-        this.retrievalCachePeriodSecs = retrievalCachePeriodSecs;
-    }
-
-    public long getAssumedOfflinePeriodSecs() {
-        return assumedOfflinePeriodSecs;
-    }
-
-    public void setAssumedOfflinePeriodSecs(long assumedOfflinePeriodSecs) {
-        this.assumedOfflinePeriodSecs = assumedOfflinePeriodSecs;
-    }
-
-    public long getMissedRetrievalCachePeriodSecs() {
-        return missedRetrievalCachePeriodSecs;
-    }
-
-    public void setMissedRetrievalCachePeriodSecs(long missedRetrievalCachePeriodSecs) {
-        this.missedRetrievalCachePeriodSecs = missedRetrievalCachePeriodSecs;
-    }
-
-    public boolean isStoreArtifactsLocally() {
-        return storeArtifactsLocally;
-    }
-
-    public void setStoreArtifactsLocally(boolean storeArtifactsLocally) {
-        this.storeArtifactsLocally = storeArtifactsLocally;
-    }
-
-    public boolean isFetchJarsEagerly() {
-        return fetchJarsEagerly;
-    }
-
-    public void setFetchJarsEagerly(boolean fetchJarsEagerly) {
-        this.fetchJarsEagerly = fetchJarsEagerly;
-    }
-
-    public boolean isFetchSourcesEagerly() {
-        return fetchSourcesEagerly;
-    }
-
-    public void setFetchSourcesEagerly(boolean fetchSourcesEagerly) {
-        this.fetchSourcesEagerly = fetchSourcesEagerly;
-    }
-
-    public ChecksumPolicyType getChecksumPolicyType() {
-        return checksumPolicyType;
-    }
-
-    public void setChecksumPolicyType(ChecksumPolicyType checksumPolicyType) {
-        this.checksumPolicyType = checksumPolicyType;
-    }
-
-    public int getUnusedArtifactsCleanupPeriodHours() {
-        return unusedArtifactsCleanupPeriodHours;
-    }
-
-    public void setUnusedArtifactsCleanupPeriodHours(int unusedArtifactsCleanupPeriodHours) {
-        this.unusedArtifactsCleanupPeriodHours = unusedArtifactsCleanupPeriodHours;
-    }
-
-    public boolean isShareConfiguration() {
-        return shareConfiguration;
-    }
-
-    public void setShareConfiguration(boolean shareConfiguration) {
-        this.shareConfiguration = shareConfiguration;
-    }
-
-    public boolean isSynchronizeProperties() {
-        return synchronizeProperties;
-    }
-
-    public void setSynchronizeProperties(boolean synchronizeProperties) {
-        this.synchronizeProperties = synchronizeProperties;
-    }
-
-    public boolean isListRemoteFolderItems() {
-        return listRemoteFolderItems;
-    }
-
-    public void setListRemoteFolderItems(boolean listRemoteFolderItems) {
-        this.listRemoteFolderItems = listRemoteFolderItems;
-    }
-
-    public RepoLayout getRemoteRepoLayout() {
-        return remoteRepoLayout;
-    }
-
-    public void setRemoteRepoLayout(RepoLayout remoteRepoLayout) {
-        this.remoteRepoLayout = remoteRepoLayout;
-    }
-
-    public boolean isRejectInvalidJars() {
-        return rejectInvalidJars;
-    }
-
-    public void setRejectInvalidJars(boolean rejectInvalidJars) {
-        this.rejectInvalidJars = rejectInvalidJars;
-    }
-
-    public String getP2OriginalUrl() {
-        return p2OriginalUrl;
-    }
-
-    public void setP2OriginalUrl(String p2OriginalUrl) {
-        this.p2OriginalUrl = p2OriginalUrl;
-    }
-
-    public NuGetConfiguration getNuget() {
-        return nuget;
-    }
-
-    public void setNuget(NuGetConfiguration nuget) {
-        this.nuget = nuget;
-    }
-
-    public PypiConfiguration getPypi() {
-        return pypi;
-    }
-
-    public void setPypi(PypiConfiguration pypi) {
-        this.pypi = pypi;
-    }
-
-    public VcsConfiguration getVcs() {
-        return vcs;
-    }
-
-    public void setVcs(VcsConfiguration vcs) {
-        this.vcs = vcs;
-    }
-
-    public BowerConfiguration getBower() {
-        return bower;
-    }
-
-    public void setBower(BowerConfiguration bower) {
-        this.bower = bower;
-    }
-
-    public CocoaPodsConfiguration getCocoaPods() {
-        return cocoaPods;
-    }
-
-    public void setCocoaPods(CocoaPodsConfiguration cocoaPods) {
-        this.cocoaPods = cocoaPods;
-    }
-
-    @Override
-    public boolean isLocal() {
-        return false;
-    }
-
-    @Override
-    public boolean isCache() {
-        return false;
-    }
-
-    /**
-     * Returns ContentForwarding configuration
-     *
-     * @return {@link ContentSynchronisation}
-     */
-    public ContentSynchronisation getContentSynchronisation() {
-        if(contentSynchronisation == null) {
-            contentSynchronisation = new ContentSynchronisation();
-        }
-        return contentSynchronisation;
-    }
-
-    /**
-     * Sets {@link ContentSynchronisation} configuration (used for UI mapping purposes)
-     */
-    public void setContentSynchronisation(ContentSynchronisation contentSynchronisation) {
-        this.contentSynchronisation = contentSynchronisation;
-    }
-
-    /**
-     * A list of blocked mime types that overrides the defaults set in the system properties
-     */
-    public String getMismatchingMimeTypesOverrideList() {
-        return mismatchingMimeTypesOverrideList;
-    }
-
-    public void setMismatchingMimeTypesOverrideList(String mismatchingMimeTypesOverrideList) {
-        this.mismatchingMimeTypesOverrideList = mismatchingMimeTypesOverrideList;
-    }
-
-    /**
-     * This repo blocks all mimetypes that are set in the system properties in cases where the requested mime type
-     * varies from the one returned by the remote. i.e. the client requested application/json but remote returns
-     * text/html --> the download will be blocked.
-     */
-    public boolean isBlockMismatchingMimeTypes() {
-        return blockMismatchingMimeTypes;
-    }
-
-    public void setBlockMismatchingMimeTypes(boolean blockMismatchingMimeTypes) {
-        this.blockMismatchingMimeTypes = blockMismatchingMimeTypes;
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/RepoBaseDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/repo/RepoBaseDescriptor.java
deleted file mode 100644
index db07176..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/RepoBaseDescriptor.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.util.RepoLayoutUtils;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlID;
-import javax.xml.bind.annotation.XmlIDREF;
-import javax.xml.bind.annotation.XmlType;
-
- at XmlType(name = "RepoType", propOrder = {"key", "type", "description", "notes", "includesPattern", "excludesPattern",
-        "repoLayout", "dockerApiVersion", "forceDockerAuthentication", "forceNugetAuthentication"},
-        namespace = Descriptor.NS)
-public abstract class RepoBaseDescriptor implements RepoDescriptor {
-
-    @XmlID
-    @XmlElement(required = true)
-    private String key;
-
-    @XmlElement(required = true)
-    private RepoType type = RepoType.Generic;
-
-    @XmlElement(required = false)
-    private String description;
-
-    @XmlElement(required = false)
-    private String notes;
-
-    @XmlElement(defaultValue = "**/*", required = false)
-    private String includesPattern = "**/*";
-
-    @XmlElement(defaultValue = "", required = false)
-    private String excludesPattern;
-
-    @XmlIDREF
-    @XmlElement(name = "repoLayoutRef")
-    private RepoLayout repoLayout;
-
-    @XmlElement(defaultValue = "V2", required = false)
-    private DockerApiVersion dockerApiVersion = DockerApiVersion.V2;
-
-    private boolean forceDockerAuthentication;
-
-    private boolean forceNugetAuthentication;
-
-    @Override
-    public String getKey() {
-        return key;
-    }
-
-    public void setKey(String key) {
-        this.key = key;
-    }
-
-    @Override
-    public RepoType getType() {
-        return type;
-    }
-
-    public void setType(RepoType type) {
-        this.type = type;
-    }
-
-    @Override
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    @Override
-    public String getNotes() {
-        return notes;
-    }
-
-    public void setNotes(String notes) {
-        this.notes = notes;
-    }
-
-    @Override
-    public String getIncludesPattern() {
-        return includesPattern;
-    }
-
-    public void setIncludesPattern(String includesPattern) {
-        this.includesPattern = includesPattern;
-    }
-
-    @Override
-    public String getExcludesPattern() {
-        return excludesPattern;
-    }
-
-    public void setExcludesPattern(String excludesPattern) {
-        this.excludesPattern = excludesPattern;
-    }
-
-    @Override
-    public RepoLayout getRepoLayout() {
-        return repoLayout;
-    }
-
-    public void setRepoLayout(RepoLayout repoLayout) {
-        this.repoLayout = repoLayout;
-    }
-
-    @Override
-    public DockerApiVersion getDockerApiVersion() {
-        return dockerApiVersion;
-    }
-
-    public void setDockerApiVersion(String dockerApiVersion) {
-        this.dockerApiVersion = DockerApiVersion.valueOf(dockerApiVersion);
-    }
-
-    @Override
-    public boolean isForceDockerAuthentication() {
-        return forceDockerAuthentication;
-    }
-
-    public void setForceDockerAuthentication(boolean forceDockerAuthentication) {
-        this.forceDockerAuthentication = forceDockerAuthentication;
-    }
-
-    @Override
-    public boolean isForceNugetAuthentication() {
-        return forceNugetAuthentication;
-    }
-
-    public void setForceNugetAuthentication(boolean forceNugetAuthentication) {
-        this.forceNugetAuthentication = forceNugetAuthentication;
-    }
-
-    @Override
-    public boolean isMavenRepoLayout() {
-        return RepoLayoutUtils.isDefaultM2(repoLayout);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof RepoBaseDescriptor)) {
-            return false;
-        }
-        RepoBaseDescriptor that = (RepoBaseDescriptor) o;
-        return key.equals(that.key);
-    }
-
-    @Override
-    public int hashCode() {
-        return key.hashCode();
-    }
-
-    @Override
-    public String toString() {
-        return key;
-    }
-
-    @Override
-    public int compareTo(Object o) {
-        if (o instanceof RepoDescriptor) {
-            return key.compareTo(((RepoDescriptor) o).getKey());
-        } else {
-            return key.compareTo(o.toString());
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/RepoDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/repo/RepoDescriptor.java
deleted file mode 100644
index 8a20fc0..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/RepoDescriptor.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import org.artifactory.descriptor.Descriptor;
-
-/**
- * @author yoavl
- */
-public interface RepoDescriptor extends Descriptor, Comparable {
-    String getKey();
-
-    RepoType getType();
-
-    String getDescription();
-
-    String getNotes();
-
-    /**
-     * @return A comma separated list of artifact patterns to include when evaluating requests.
-     */
-    String getIncludesPattern();
-
-    /**
-     * @return A comma separated list of artifact patterns to exclude when evaluating requests.
-     */
-    String getExcludesPattern();
-
-    /**
-     * @return True if not a virtual repository (for example remote cached or local)
-     */
-    boolean isReal();
-
-    RepoLayout getRepoLayout();
-
-    boolean isMavenRepoLayout();
-
-    DockerApiVersion getDockerApiVersion();
-
-    boolean isForceDockerAuthentication();
-
-    boolean isForceNugetAuthentication();
-
-    //ReverseProxyRepoConfig getReverseProxy();
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/RepoLayout.java b/base/config/src/main/java/org/artifactory/descriptor/repo/RepoLayout.java
deleted file mode 100644
index a7e2861..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/RepoLayout.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlID;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * Defines the repository storage pattern
- *
- * @author Noam Y. Tenne
- */
- at XmlType(name = "RepoLayoutType", propOrder = {"name", "artifactPathPattern", "distinctiveDescriptorPathPattern",
-        "descriptorPathPattern", "folderIntegrationRevisionRegExp", "fileIntegrationRevisionRegExp"},
-        namespace = Descriptor.NS)
-public class RepoLayout implements Descriptor {
-
-    @XmlID
-    @XmlElement(required = true)
-    private String name;
-
-    @XmlElement(required = true)
-    private String artifactPathPattern;
-
-    @XmlElement(required = true)
-    private boolean distinctiveDescriptorPathPattern;
-
-    @XmlElement(required = false)
-    private String descriptorPathPattern;
-
-    @XmlElement(required = false)
-    private String folderIntegrationRevisionRegExp;
-
-    @XmlElement(required = false)
-    private String fileIntegrationRevisionRegExp;
-
-    public RepoLayout() {
-    }
-
-    public RepoLayout(RepoLayout copy) {
-        this.name = copy.getName();
-        this.artifactPathPattern = copy.getArtifactPathPattern();
-        this.distinctiveDescriptorPathPattern = copy.isDistinctiveDescriptorPathPattern();
-        this.descriptorPathPattern = copy.getDescriptorPathPattern();
-        this.folderIntegrationRevisionRegExp = copy.getFolderIntegrationRevisionRegExp();
-        this.fileIntegrationRevisionRegExp = copy.getFileIntegrationRevisionRegExp();
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getArtifactPathPattern() {
-        return artifactPathPattern;
-    }
-
-    public void setArtifactPathPattern(String artifactPathPattern) {
-        this.artifactPathPattern = artifactPathPattern;
-    }
-
-    public boolean isDistinctiveDescriptorPathPattern() {
-        return distinctiveDescriptorPathPattern;
-    }
-
-    public void setDistinctiveDescriptorPathPattern(boolean distinctiveDescriptorPathPattern) {
-        this.distinctiveDescriptorPathPattern = distinctiveDescriptorPathPattern;
-    }
-
-    public String getDescriptorPathPattern() {
-        return descriptorPathPattern;
-    }
-
-    public void setDescriptorPathPattern(String descriptorPathPattern) {
-        this.descriptorPathPattern = descriptorPathPattern;
-    }
-
-    public String getFolderIntegrationRevisionRegExp() {
-        return folderIntegrationRevisionRegExp;
-    }
-
-    public void setFolderIntegrationRevisionRegExp(String folderIntegrationRevisionRegExp) {
-        this.folderIntegrationRevisionRegExp = folderIntegrationRevisionRegExp;
-    }
-
-    public String getFileIntegrationRevisionRegExp() {
-        return fileIntegrationRevisionRegExp;
-    }
-
-    public void setFileIntegrationRevisionRegExp(String fileIntegrationRevisionRegExp) {
-        this.fileIntegrationRevisionRegExp = fileIntegrationRevisionRegExp;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof RepoLayout)) {
-            return false;
-        }
-
-        RepoLayout that = (RepoLayout) o;
-
-        if (name != null ? !name.equals(that.name) : that.name != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return name != null ? name.hashCode() : 0;
-    }
-
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/RepoLayoutBuilder.java b/base/config/src/main/java/org/artifactory/descriptor/repo/RepoLayoutBuilder.java
deleted file mode 100644
index 70f373c..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/RepoLayoutBuilder.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import java.io.Serializable;
-
-/**
- * @author Noam Y. Tenne
- */
-public class RepoLayoutBuilder implements Serializable {
-
-    private String name;
-
-    private String artifactPathPattern;
-
-    private boolean distinctiveDescriptorPathPattern;
-
-    private String descriptorPathPattern;
-
-    private String folderIntegrationRevisionRegExp;
-
-    private String fileIntegrationRevisionRegExp;
-
-    public RepoLayoutBuilder name(String name) {
-        this.name = name;
-        return this;
-    }
-
-    public RepoLayoutBuilder artifactPathPattern(String artifactPathPattern) {
-        this.artifactPathPattern = artifactPathPattern;
-        return this;
-    }
-
-    public RepoLayoutBuilder distinctiveDescriptorPathPattern(boolean distinctiveDescriptorPathPattern) {
-        this.distinctiveDescriptorPathPattern = distinctiveDescriptorPathPattern;
-        return this;
-    }
-
-    public RepoLayoutBuilder descriptorPathPattern(String descriptorPathPattern) {
-        this.descriptorPathPattern = descriptorPathPattern;
-        return this;
-    }
-
-    public RepoLayoutBuilder folderIntegrationRevisionRegExp(String folderIntegrationRevisionRegExp) {
-        this.folderIntegrationRevisionRegExp = folderIntegrationRevisionRegExp;
-        return this;
-    }
-
-    public RepoLayoutBuilder fileIntegrationRevisionRegExp(String fileIntegrationRevisionRegExp) {
-        this.fileIntegrationRevisionRegExp = fileIntegrationRevisionRegExp;
-        return this;
-    }
-
-    public RepoLayout build() {
-        RepoLayout repoLayout = new RepoLayout();
-        repoLayout.setName(name);
-        repoLayout.setArtifactPathPattern(artifactPathPattern);
-        repoLayout.setDistinctiveDescriptorPathPattern(distinctiveDescriptorPathPattern);
-        repoLayout.setDescriptorPathPattern(descriptorPathPattern);
-        repoLayout.setFolderIntegrationRevisionRegExp(folderIntegrationRevisionRegExp);
-        repoLayout.setFileIntegrationRevisionRegExp(fileIntegrationRevisionRegExp);
-
-        return repoLayout;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/RepoType.java b/base/config/src/main/java/org/artifactory/descriptor/repo/RepoType.java
deleted file mode 100644
index 0531610..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/RepoType.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import javax.xml.bind.annotation.XmlEnum;
-import javax.xml.bind.annotation.XmlEnumValue;
-
-/**
- * @author Shay Yaakov
- */
- at XmlEnum(value = String.class)
-public enum RepoType {
-    @XmlEnumValue("maven")Maven("maven"),
-    @XmlEnumValue("gradle")Gradle("gradle"),
-    @XmlEnumValue("ivy")Ivy("ivy"),
-    @XmlEnumValue("sbt")SBT("sbt"),
-    @XmlEnumValue("nuget")NuGet("nuget"),
-    @XmlEnumValue("gems")Gems("gems"),
-    @XmlEnumValue("npm")Npm("npm"),
-    @XmlEnumValue("bower")Bower("bower"),
-    @XmlEnumValue("debian")Debian("debian"),
-    @XmlEnumValue("pypi")Pypi("pypi"),
-    @XmlEnumValue("docker")Docker("docker"),
-    @XmlEnumValue("vagrant")Vagrant("vagrant"),
-    @XmlEnumValue("gitlfs")GitLfs("gitlfs"),
-    @XmlEnumValue("yum")YUM("yum"),
-    @XmlEnumValue("vcs")VCS("vcs"),
-    @XmlEnumValue("p2")P2("p2"),
-    @XmlEnumValue("generic")Generic("generic"),
-    @XmlEnumValue("opkg")Opkg("opkg"),
-    @XmlEnumValue("cocoapods")CocoaPods("cocoapods"),
-    @XmlEnumValue("distribution")Distribution("distribution");
-
-    private String type;
-
-    RepoType(String type) {
-        this.type = type;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public boolean isMavenGroup() {
-        return this == Maven || this == Ivy || this == Gradle || this == P2 || this == SBT;
-    }
-
-    public static RepoType fromType(String type) {
-        for (RepoType repoType : values()) {
-            if (type.equalsIgnoreCase(repoType.type)) {
-                return repoType;
-            }
-        }
-        return Generic;
-    }
-
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/ReverseProxyDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/repo/ReverseProxyDescriptor.java
deleted file mode 100644
index 28d31e9..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/ReverseProxyDescriptor.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlID;
-import javax.xml.bind.annotation.XmlType;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
- at XmlType(name = "ReverseProxyType",
-        propOrder = {"key", "webServerType", "artifactoryAppContext", "publicAppContext", "serverName",
-                "serverNameExpression", "sslCertificate", "sslKey", "dockerReverseProxyMethod", "useHttps","useHttp",
-                "sslPort", "httpPort","reverseProxyRepoConfigs", "artifactoryServerName","upStreamName", "artifactoryPort"})
-public class ReverseProxyDescriptor implements Descriptor {
-
-    @XmlID
-    @XmlElement(required = true)
-    private String key = "nginx";
-    @XmlElement(name = "webServerType", required = true)
-    private WebServerType webServerType;
-    private String artifactoryAppContext;
-    @XmlElement(name = "publicAppContext", required = true)
-    private String publicAppContext;
-    @XmlElement(name = "serverName", required = true)
-    private String serverName;
-    @XmlElement(name = "serverNameExpression", nillable = true)
-    private String serverNameExpression;
-    @XmlElementWrapper(name = "reverseProxyRepositories" ,nillable = true)
-    @XmlElement(name = "reverseProxyRepoConfigs", required = false)
-    private List<ReverseProxyRepoConfig> reverseProxyRepoConfigs = new ArrayList<>();
-    @XmlElement(name = "artifactoryServerName", required = true)
-    private String artifactoryServerName;
-    @XmlElement(name = "upStreamName", nillable = true)
-    private String upStreamName;
-    private int artifactoryPort = 8081;
-    @XmlElement(name = "sslCertificate", nillable = true)
-    private String sslCertificate;
-    @XmlElement(name = "sslKey", nillable = true)
-    private String sslKey;
-    @XmlElement(name = "dockerReverseProxyMethod", required = true)
-    private ReverseProxyMethod dockerReverseProxyMethod;
-    private boolean useHttps = false;
-    private boolean useHttp = true;
-    private int sslPort = 443;
-    private int httpPort= 80;
-
-    public String getKey() {
-        return key;
-    }
-
-    public void setKey(String key) {
-        this.key = key;
-    }
-
-    public WebServerType getWebServerType() {
-        return webServerType;
-    }
-
-    public void setWebServerType(WebServerType webServerType) {
-        this.webServerType = webServerType;
-    }
-
-    public String getArtifactoryAppContext() {
-        return artifactoryAppContext;
-    }
-
-
-    public List<ReverseProxyRepoConfig> getReverseProxyRepoConfigs() {
-        return reverseProxyRepoConfigs;
-    }
-
-    public ReverseProxyRepoConfig getReverseProxyRepoConfig(String repoKey) {
-        return reverseProxyRepoConfigs.stream()
-                .filter(reverseProxyConfig -> reverseProxyConfig.getRepoRef().getKey().equals(repoKey))
-                .findAny()
-                .orElse(null);
-    }
-
-    public void setReverseProxyRepoConfigs(List<ReverseProxyRepoConfig> reverseProxyRepoConfigs) {
-        this.reverseProxyRepoConfigs = reverseProxyRepoConfigs;
-    }
-
-    public void setArtifactoryAppContext(String artifactoryAppContext) {
-        this.artifactoryAppContext = artifactoryAppContext;
-    }
-
-    public void deleteReverseProxyConfig(String repoKey) {
-        Iterator<ReverseProxyRepoConfig> iterator = reverseProxyRepoConfigs.iterator();
-        while (iterator.hasNext()){
-            ReverseProxyRepoConfig nextReverseProxyConfig = iterator.next();
-            if (nextReverseProxyConfig.getRepoRef().getKey().equals(repoKey)){
-                iterator.remove();
-            }
-        }
-    }
-
-    public String getPublicAppContext() {
-        return publicAppContext;
-    }
-
-    public void setPublicAppContext(String publicAppContext) {
-        this.publicAppContext = publicAppContext;
-    }
-
-    public String getServerName() {
-        return serverName;
-    }
-
-    public void setServerName(String serverName) {
-        this.serverName = serverName;
-    }
-
-    public String getServerNameExpression() {
-        return serverNameExpression;
-    }
-
-    public void setServerNameExpression(String serverNameExpression) {
-        this.serverNameExpression = serverNameExpression;
-    }
-
-    public String getSslCertificate() {
-        return sslCertificate;
-    }
-
-    public void setSslCertificate(String sslCertificate) {
-        this.sslCertificate = sslCertificate;
-    }
-
-    public String getSslKey() {
-        return sslKey;
-    }
-
-    public void setSslKey(String sslKey) {
-        this.sslKey = sslKey;
-    }
-
-    public ReverseProxyMethod getDockerReverseProxyMethod() {
-        return dockerReverseProxyMethod;
-    }
-
-    public void setDockerReverseProxyMethod(ReverseProxyMethod dockerReverseProxyMethod) {
-        this.dockerReverseProxyMethod = dockerReverseProxyMethod;
-    }
-
-    public boolean isUseHttps() {
-        return useHttps;
-    }
-
-    public void setUseHttps(boolean useHttps) {
-        this.useHttps = useHttps;
-    }
-
-    public int getSslPort() {
-        return sslPort;
-    }
-
-    public void setSslPort(int sslPort) {
-        this.sslPort = sslPort;
-    }
-
-    public int getHttpPort() {
-        return httpPort;
-    }
-
-    public void setHttpPort(int httpPort) {
-        this.httpPort = httpPort;
-    }
-
-    public String getUpStreamName() {
-        return upStreamName;
-    }
-
-    public void setUpStreamName(String upStreamName) {
-        this.upStreamName = upStreamName;
-    }
-
-    public String getArtifactoryServerName() {
-        return artifactoryServerName;
-    }
-
-    public void setArtifactoryServerName(String artifactoryServerName) {
-        this.artifactoryServerName = artifactoryServerName;
-    }
-
-    public int getArtifactoryPort() {
-        return artifactoryPort;
-    }
-
-    public void setArtifactoryPort(int artifactoryPort) {
-        this.artifactoryPort = artifactoryPort;
-    }
-
-    public boolean isUseHttp() {
-        return useHttp;
-    }
-
-    public void setUseHttp(boolean useHttp) {
-        this.useHttp = useHttp;
-    }
-
-    public void addReverseProxyRepoConfig(ReverseProxyRepoConfig reverseProxyRepoConfig){
-        deleteReverseProxyConfig(reverseProxyRepoConfig.getRepoRef().getKey());
-        reverseProxyRepoConfigs.add(reverseProxyRepoConfig);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        ReverseProxyDescriptor that = (ReverseProxyDescriptor) o;
-        return key.equals(that.key);
-    }
-
-    @Override
-    public int hashCode() {
-        return key.hashCode();
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/ReverseProxyMethod.java b/base/config/src/main/java/org/artifactory/descriptor/repo/ReverseProxyMethod.java
deleted file mode 100644
index dc260ea..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/ReverseProxyMethod.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import javax.xml.bind.annotation.XmlEnum;
-import javax.xml.bind.annotation.XmlEnumValue;
-
-/**
- * @author Shay Yaakov
- */
- at XmlEnum(String.class)
-public enum ReverseProxyMethod {
-
-    @XmlEnumValue("subDomain")SUBDOMAIN("subDomain"),
-    @XmlEnumValue("portPerRepo")PORTPERREPO("portPerRepo"),
-    @XmlEnumValue("noValue")NOVALUE("noValue");
-
-    private final String val;
-
-    ReverseProxyMethod(String val) {
-        this.val = val;
-    }
-
-    public String toString() {
-        return val;
-    }
-
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/ReverseProxyRepoConfig.java b/base/config/src/main/java/org/artifactory/descriptor/repo/ReverseProxyRepoConfig.java
deleted file mode 100644
index a7fcaab..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/ReverseProxyRepoConfig.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.artifactory.descriptor.repo;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlIDREF;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * @author Shay Yaakov
- */
- at XmlType(name = "ReverseProxyRepoConfigType", propOrder = {"repoRef", "serverName", "port"},
-        namespace = Descriptor.NS)
-public class ReverseProxyRepoConfig implements Descriptor {
-
-    @XmlIDREF
-    @XmlElement(name = "repoRef",required = false)
-    private RepoBaseDescriptor repoRef;
-
-    @XmlElement(name = "serverName",required = false)
-    private String serverName;
-    private int port = -1;
-
-    public RepoBaseDescriptor getRepoRef() {
-        return repoRef;
-    }
-
-    public void setRepoRef(RepoBaseDescriptor repoRef) {
-        this.repoRef = repoRef;
-    }
-
-    public String getServerName() {
-        return serverName;
-    }
-
-    public void setServerName(String serverName) {
-        this.serverName = serverName;
-    }
-
-    public int getPort() {
-        return port;
-    }
-
-    public void setPort(int port) {
-        this.port = port;
-    }
-
-    public void setPort(Integer port) {
-        if (port != null) {
-            this.port = port;
-        } else {
-            this.port = -1;
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/SnapshotVersionBehavior.java b/base/config/src/main/java/org/artifactory/descriptor/repo/SnapshotVersionBehavior.java
deleted file mode 100644
index 9fa4eff..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/SnapshotVersionBehavior.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import javax.xml.bind.annotation.XmlEnum;
-import javax.xml.bind.annotation.XmlEnumValue;
-
-/**
- * @author Yoav Landman
- */
- at XmlEnum(String.class)
-public enum SnapshotVersionBehavior {
-    @XmlEnumValue("unique")UNIQUE("Unique"),
-    @XmlEnumValue("non-unique")NONUNIQUE("Non-unique"),
-    @XmlEnumValue("deployer")DEPLOYER("Deployer");
-
-    //The name to display when used in different components
-    private String displayName;
-
-    /**
-     * Sets the display name of the element
-     *
-     * @param displayName The display name
-     */
-    SnapshotVersionBehavior(String displayName) {
-        this.displayName = displayName;
-    }
-
-    /**
-     * Returns the display name of the element
-     *
-     * @return String - Element display name
-     */
-    public String getDisplayName() {
-        return displayName;
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/SslType.java b/base/config/src/main/java/org/artifactory/descriptor/repo/SslType.java
deleted file mode 100644
index 7f4b253..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/SslType.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import javax.xml.bind.annotation.XmlEnum;
-import javax.xml.bind.annotation.XmlEnumValue;
-
-/**
- * @author Shay Yaakov
- */
- at XmlEnum(String.class)
-public enum SslType {
-
-    @XmlEnumValue("self-signed")SELFSIGNED("self-signed"),
-    @XmlEnumValue("ca-signed")CASIGNED("ca-signed"),
-    @XmlEnumValue("no-ssl")NOSSL("no-ssl");
-
-    private final String val;
-
-    SslType(String val) {
-        this.val = val;
-    }
-
-    public String toString() {
-        return val;
-    }
-
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/TrashRepoDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/repo/TrashRepoDescriptor.java
deleted file mode 100644
index 67355a5..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/TrashRepoDescriptor.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-/**
- * @author Shay Yaakov
- */
-public class TrashRepoDescriptor extends LocalRepoDescriptor {
-
-    public TrashRepoDescriptor(String repoKey, RepoLayout simpleLayout) {
-        setKey(repoKey);
-        setType(RepoType.Generic);
-        setRepoLayout(simpleLayout);
-    }
-
-    @Override
-    public boolean isLocal() {
-        return true;
-    }
-
-    @Override
-    public boolean isCache() {
-        return false;
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/VcsConfiguration.java b/base/config/src/main/java/org/artifactory/descriptor/repo/VcsConfiguration.java
deleted file mode 100644
index d70698a..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/VcsConfiguration.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.descriptor.repo;
-
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.descriptor.repo.vcs.VcsType;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * @author Yoav Luft
- */
- at XmlType(name = "VcsType", propOrder = {"type", "git"})
-public class VcsConfiguration implements Descriptor {
-
-    @XmlElement(name = "type", defaultValue = "git")
-    private VcsType type = VcsType.GIT;
-
-    @XmlElement(name = "git")
-    private VcsGitConfiguration git = new VcsGitConfiguration();
-
-    public VcsConfiguration() {
-    }
-
-    public VcsType getType() {
-        return type;
-    }
-
-    public void setType(VcsType type) {
-        this.type = type;
-    }
-
-    public VcsGitConfiguration getGit() {
-        return git;
-    }
-
-    public void setGit(VcsGitConfiguration git) {
-        this.git = git;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/VcsGitConfiguration.java b/base/config/src/main/java/org/artifactory/descriptor/repo/VcsGitConfiguration.java
deleted file mode 100644
index bc2e71e..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/VcsGitConfiguration.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.artifactory.descriptor.repo;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.descriptor.repo.vcs.VcsGitProvider;
-import org.artifactory.descriptor.repo.vcs.VcsUrlBuilder;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * @author Yoav Luft
- */
- at XmlType(name = "VcsGitType", propOrder = {"provider", "downloadUrl"})
-public class VcsGitConfiguration implements Descriptor {
-
-    @XmlElement(name = "provider")
-    private VcsGitProvider provider = VcsGitProvider.GITHUB;
-
-    @XmlElement(name = "downloadUrl")
-    private String downloadUrl;
-
-    public VcsGitConfiguration() {
-    }
-
-    public VcsGitProvider getProvider() {
-        return provider;
-    }
-
-    public void setProvider(VcsGitProvider provider) {
-        this.provider = provider;
-    }
-
-    public String getDownloadUrl() {
-        return downloadUrl;
-    }
-
-    public void setDownloadUrl(String downloadUrl) {
-        this.downloadUrl = downloadUrl;
-    }
-
-    /**
-     * Constructs ResourceDownloadUrl
-     *
-     * @param user git user
-     * @param repository git repository
-     * @param file a file to download
-     * @param version content branch/tag
-     *
-     * @return ResourceDownloadUrl
-     */
-    public String buildResourceDownloadUrl(String user, String repository, String file, String version) {
-        return VcsUrlBuilder.resourceDownloadUrl(provider, user, repository, file, version);
-    }
-
-    /**
-     * Constructs ResourceDownloadUrl
-     *
-     * @param user git user
-     * @param repository git repository
-     * @param version content branch/tag
-     *
-     * @return ResourceDownloadUrl
-     */
-    public String buildReleaseDownloadUrl(String user, String repository, String version, String ballType) {
-        return VcsUrlBuilder.releaseDownloadUrl(provider, user, repository, version, ballType);
-    }
-
-    /**
-     * Constructs RepositoryDownloadUrl
-     *
-     * @param gitOrg git user
-     * @param gitRepo git repository
-     * @param version content branch/tag
-     * @param fileExt file ext
-     *
-     * @return RepositoryDownloadUrl
-     */
-    public String buildRepositoryDownloadUrl(String gitOrg, String gitRepo, String version, String fileExt) {
-        String url = StringUtils.isNotBlank(downloadUrl) ? downloadUrl : provider.getRepositoryDownloadUrl();
-        return VcsUrlBuilder.repositoryDownloadUrl(url, gitOrg, gitRepo, version, fileExt);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/VirtualRepoDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/repo/VirtualRepoDescriptor.java
deleted file mode 100644
index 2fbfd14..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/VirtualRepoDescriptor.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlIDREF;
-import javax.xml.bind.annotation.XmlType;
-import java.util.ArrayList;
-import java.util.List;
-
- at XmlType(name = "VirtualRepoType", propOrder = {"artifactoryRequestsCanRetrieveRemoteArtifacts", "repositories",
-        "keyPair", "pomRepositoryReferencesCleanupPolicy", "p2", "defaultDeploymentRepo", "externalDependencies"},
-        namespace = Descriptor.NS)
-public class VirtualRepoDescriptor extends RepoBaseDescriptor {
-
-    public static final String GLOBAL_VIRTUAL_REPO_KEY = "repo";
-
-    @XmlIDREF
-    @XmlElementWrapper(name = "repositories")
-    @XmlElement(name = "repositoryRef", type = RepoBaseDescriptor.class, required = false)
-    private List<RepoDescriptor> repositories = new ArrayList<>();
-
-    @XmlElement(defaultValue = "false", required = false)
-    private boolean artifactoryRequestsCanRetrieveRemoteArtifacts;
-
-    @XmlElement(required = true)
-    private String keyPair;
-
-    @XmlElement(defaultValue = "discard_active_reference", required = true)
-    private PomCleanupPolicy pomRepositoryReferencesCleanupPolicy = PomCleanupPolicy.discard_active_reference;
-
-    @XmlElement(required = false)
-    private P2Configuration p2;
-
-    @XmlIDREF
-    @XmlElement(name = "defaultDeploymentRepo", type = LocalRepoDescriptor.class, required = false)
-    private LocalRepoDescriptor defaultDeploymentRepo;
-
-    @XmlElement(required = false)
-    private ExternalDependenciesConfig externalDependencies;
-
-    public List<RepoDescriptor> getRepositories() {
-        return repositories;
-    }
-
-    public void setRepositories(List<RepoDescriptor> repositories) {
-        this.repositories = repositories;
-    }
-
-    public boolean isArtifactoryRequestsCanRetrieveRemoteArtifacts() {
-        return artifactoryRequestsCanRetrieveRemoteArtifacts;
-    }
-
-    public void setArtifactoryRequestsCanRetrieveRemoteArtifacts(
-            boolean artifactoryRequestsCanRetrieveRemoteArtifacts) {
-        this.artifactoryRequestsCanRetrieveRemoteArtifacts = artifactoryRequestsCanRetrieveRemoteArtifacts;
-    }
-
-    public String getKeyPair() {
-        return keyPair;
-    }
-
-    public void setKeyPair(String keyPair) {
-        this.keyPair = keyPair;
-    }
-
-    @Override
-    public boolean isReal() {
-        return false;
-    }
-
-    public boolean removeRepository(RepoDescriptor repo) {
-        return repositories.remove(repo);
-    }
-
-    public void removeKeyPair() {
-        keyPair = null;
-    }
-
-    public PomCleanupPolicy getPomRepositoryReferencesCleanupPolicy() {
-        return pomRepositoryReferencesCleanupPolicy;
-    }
-
-    public void setPomRepositoryReferencesCleanupPolicy(PomCleanupPolicy pomRepositoryReferencesCleanupPolicy) {
-        this.pomRepositoryReferencesCleanupPolicy = pomRepositoryReferencesCleanupPolicy;
-    }
-
-    public P2Configuration getP2() {
-        return p2;
-    }
-
-    public void setP2(P2Configuration p2) {
-        this.p2 = p2;
-    }
-
-    public LocalRepoDescriptor getDefaultDeploymentRepo() {
-        return defaultDeploymentRepo;
-    }
-
-    public void setDefaultDeploymentRepo(LocalRepoDescriptor defaultDeploymentRepo) {
-        this.defaultDeploymentRepo = defaultDeploymentRepo;
-    }
-
-    public ExternalDependenciesConfig getExternalDependencies() {
-        return externalDependencies;
-    }
-
-    public void setExternalDependencies(ExternalDependenciesConfig externalDependencies) {
-        this.externalDependencies = externalDependencies;
-    }
-
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/VirtualRepoResolver.java b/base/config/src/main/java/org/artifactory/descriptor/repo/VirtualRepoResolver.java
deleted file mode 100644
index f550e64..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/VirtualRepoResolver.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import com.google.common.collect.Lists;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Resolved recursively the search order of the virtual repositories. The resolving is done according to the virtual
- * repository repositories list order. Local repositories are always placed first. If the virtual repo has cycles (one
- * or more virtual repos appear more than once) the resolver will skip the repeated virtual repo.
- *
- * @author Yossi Shaul
- */
-public class VirtualRepoResolver implements Serializable {
-    private static final Logger log = LoggerFactory.getLogger(VirtualRepoResolver.class);
-
-    private VirtualResolverFilter filter;
-
-    private List<LocalRepoDescriptor> localRepos;
-    private List<RemoteRepoDescriptor> remoteRepos;
-
-    private boolean hasCycle = false;
-
-    public VirtualRepoResolver(VirtualRepoDescriptor virtual) {
-        filter = new EmptyVirtualResolverFilter();
-        update(virtual);
-    }
-
-    public VirtualRepoResolver(VirtualRepoDescriptor virtual, VirtualResolverFilter filter) {
-        this.filter = filter;
-        update(virtual);
-    }
-
-    public void update(VirtualRepoDescriptor virtual) {
-        localRepos = Lists.newArrayList();
-        remoteRepos = Lists.newArrayList();
-        hasCycle = false;
-        resolve(virtual, new ArrayList<VirtualRepoDescriptor>());
-    }
-
-    private void resolve(VirtualRepoDescriptor virtualRepo, List<VirtualRepoDescriptor> visitedVirtualRepos) {
-        if (visitedVirtualRepos.contains(virtualRepo)) {
-            // don't visit twice the same virtual repo to prevent cycles
-            log.debug("Virtual repo {} already visited.", visitedVirtualRepos);
-            hasCycle = true;
-            return;
-        }
-
-        // First filter the current virtual repo
-        if (!filter.accepts(virtualRepo)) {
-            return;
-        }
-
-        visitedVirtualRepos.add(virtualRepo);
-        List<RepoDescriptor> repos = virtualRepo.getRepositories();
-        for (RepoDescriptor repo : repos) {
-            if (repo instanceof LocalRepoDescriptor) {
-                LocalRepoDescriptor localRepo = (LocalRepoDescriptor) repo;
-                if (!localRepos.contains(localRepo)) {
-                    localRepos.add(localRepo);
-                }
-            } else if (repo instanceof RemoteRepoDescriptor) {
-                RemoteRepoDescriptor remoteRepo = (RemoteRepoDescriptor) repo;
-                if (!remoteRepos.contains(remoteRepo)) {
-                    remoteRepos.add(remoteRepo);
-                }
-            } else if (repo instanceof VirtualRepoDescriptor) {
-                // resolve recursively
-                VirtualRepoDescriptor virtualRepoDescriptor = (VirtualRepoDescriptor) repo;
-                if (filter.accepts(virtualRepoDescriptor)) {
-                    resolve(virtualRepoDescriptor, visitedVirtualRepos);
-                }
-            } else {
-                log.warn("Unexpected repository of type '{}'.", repo.getClass());
-            }
-        }
-    }
-
-    /**
-     * @return List of all the detected local repositories.
-     */
-    public List<LocalRepoDescriptor> getLocalRepos() {
-        return localRepos;
-    }
-
-    /**
-     * @return List of all the detected remote repositories.
-     */
-    public List<RemoteRepoDescriptor> getRemoteRepos() {
-        return remoteRepos;
-    }
-
-    /**
-     * @return List with all the resolved local and remote repositories ordered correctly.
-     */
-    public List<RealRepoDescriptor> getOrderedRepos() {
-        List<RealRepoDescriptor> orderedRepos =
-                new ArrayList<>(localRepos.size() + remoteRepos.size());
-        orderedRepos.addAll(localRepos);
-        orderedRepos.addAll(remoteRepos);
-        return orderedRepos;
-    }
-
-    /**
-     * @return True if the virtual repository contains a cycle (virtual repo that appears more than once).
-     */
-    public boolean hasCycle() {
-        return hasCycle;
-    }
-
-    /**
-     * Returns a boolean value which represents if the given repo descriptor is associated with the virtual repo which
-     * has been resolved. Please note, that the current version of the resolver does not support caches. To check if a
-     * cache is associated, Supply it's remote repo instead.
-     *
-     * @param descriptor A repository descriptor
-     * @return boolean - True if the supplied repo is associated with the resolved virtual repo. False if not.
-     */
-    @SuppressWarnings({"SuspiciousMethodCalls"})
-    public boolean contains(RepoDescriptor descriptor) {
-        boolean contains = false;
-        if (descriptor instanceof LocalRepoDescriptor) {
-            contains = localRepos.contains(descriptor);
-        } else if (descriptor instanceof RemoteRepoDescriptor) {
-            contains = remoteRepos.contains(descriptor);
-        }
-        return contains;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/VirtualResolverFilter.java b/base/config/src/main/java/org/artifactory/descriptor/repo/VirtualResolverFilter.java
deleted file mode 100644
index 706e103..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/VirtualResolverFilter.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-/**
- * Determines if a virtual repo should be filtered and not processed by the virtual repo resolution.
- *
- * @author Shay Yaakov
- * @see org.artifactory.descriptor.repo.VirtualRepoResolver
- */
-public interface VirtualResolverFilter {
-
-    /**
-     * @param descriptor The virtual repo to check for filtering
-     * @return True if the filter accepts the virtual repo according to the filter rules
-     */
-    boolean accepts(VirtualRepoDescriptor descriptor);
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/WebServerType.java b/base/config/src/main/java/org/artifactory/descriptor/repo/WebServerType.java
deleted file mode 100644
index 2ea47fe..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/WebServerType.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import javax.xml.bind.annotation.XmlEnum;
-import javax.xml.bind.annotation.XmlEnumValue;
-
-/**
- * @author Shay Yaakov
- */
- at XmlEnum(String.class)
-public enum WebServerType {
-
-    @XmlEnumValue("nginx")NGINX("nginx"),
-    @XmlEnumValue("apache")APACHE("apache"),
-    @XmlEnumValue("haproxy")HAPROXY("haproxy");
-
-    private final String val;
-
-    WebServerType(String val) {
-        this.val = val;
-    }
-
-    public String toString() {
-        return val;
-    }
-
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/distribution/DistributionCoordinates.java b/base/config/src/main/java/org/artifactory/descriptor/repo/distribution/DistributionCoordinates.java
deleted file mode 100644
index 25f0670..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/distribution/DistributionCoordinates.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package org.artifactory.descriptor.repo.distribution;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-import static org.artifactory.util.distribution.DistributionConstants.PATH_TOKEN;
-
-/**
- * Coordinates that are used when distributing artifacts to Bintray to specify exactly where the artifact goes.
- * Each coordinate is a string that can be a 'hardcoded' user input, the set of distribution rule tokens available to
- * the rule or a combination of both.
- *
- * @author Dan Feldman
- */
- at XmlType(name = "DistributionCoordinatesType", propOrder = {"repo", "pkg", "version", "path"}, namespace = Descriptor.NS)
-public class DistributionCoordinates implements Descriptor {
-
-    @XmlElement(required = true)
-    protected String repo;
-
-    @XmlElement(required = true)
-    protected String pkg;
-
-    @XmlElement(required = true)
-    protected String version;
-
-    @XmlElement(required = true)
-    protected String path = PATH_TOKEN;
-
-    public DistributionCoordinates() {
-
-    }
-
-    public DistributionCoordinates(String repo, String pkg, String version, String path) {
-        this.repo = repo;
-        this.pkg = pkg;
-        this.version = version;
-        this.path = path;
-    }
-
-    public DistributionCoordinates(DistributionCoordinates copy) {
-        this.repo = copy.repo;
-        this.pkg = copy.pkg;
-        this.version = copy.version;
-        this.path = copy.path;
-    }
-
-    public String getRepo() {
-        return repo;
-    }
-
-    public void setRepo(String repo) {
-        this.repo = repo;
-    }
-
-    public String getPkg() {
-        return pkg;
-    }
-
-    public void setPkg(String pkg) {
-        this.pkg = pkg;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof DistributionCoordinates)) return false;
-
-        DistributionCoordinates that = (DistributionCoordinates) o;
-
-        if (getRepo() != null ? !getRepo().equals(that.getRepo()) : that.getRepo() != null) return false;
-        if (getPkg() != null ? !getPkg().equals(that.getPkg()) : that.getPkg() != null) return false;
-        if (getVersion() != null ? !getVersion().equals(that.getVersion()) : that.getVersion() != null) return false;
-        return getPath() != null ? getPath().equals(that.getPath()) : that.getPath() == null;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = getRepo() != null ? getRepo().hashCode() : 0;
-        result = 31 * result + (getPkg() != null ? getPkg().hashCode() : 0);
-        result = 31 * result + (getVersion() != null ? getVersion().hashCode() : 0);
-        result = 31 * result + (getPath() != null ? getPath().hashCode() : 0);
-        return result;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/distribution/DistributionRepoDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/repo/distribution/DistributionRepoDescriptor.java
deleted file mode 100644
index b5c43c4..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/distribution/DistributionRepoDescriptor.java
+++ /dev/null
@@ -1,162 +0,0 @@
-package org.artifactory.descriptor.repo.distribution;
-
-import com.google.common.collect.Lists;
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.descriptor.repo.BintrayApplicationConfig;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.descriptor.repo.distribution.rule.DistributionRule;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlIDREF;
-import javax.xml.bind.annotation.XmlType;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
- at XmlType(name = "DistributionRepoType",
-        propOrder = {"bintrayApplication", "rules", "proxy", "productName", "defaultNewRepoPrivate",
-                "defaultNewRepoPremium", "defaultLicenses", "defaultVcsUrl", "whiteListedProperties",
-                "gpgSign", "gpgPassPhrase"},
-        namespace = Descriptor.NS)
-public class DistributionRepoDescriptor extends LocalRepoDescriptor {
-
-    @XmlIDREF
-    @XmlElement(name = "bintrayApplicationRef")
-    private BintrayApplicationConfig bintrayApplication;
-
-    @XmlElement(name = "rule")
-    @XmlElementWrapper(name = "rules")
-    private List<DistributionRule> rules = Lists.newArrayList();
-
-    @XmlIDREF
-    @XmlElement(name = "proxyRef")
-    private ProxyDescriptor proxy;
-
-    @XmlElement
-    private String productName;
-
-    @XmlElement
-    private boolean defaultNewRepoPrivate = true;
-
-    @XmlElement
-    private boolean defaultNewRepoPremium = true;
-
-    @XmlElement(name = "license")
-    @XmlElementWrapper(name = "defaultLicenses")
-    private Set<String> defaultLicenses = new HashSet<>();
-
-    @XmlElement
-    private String defaultVcsUrl;
-
-    @XmlElement(name = "property")
-    @XmlElementWrapper(name = "whiteListedProperties")
-    private Set<String> whiteListedProperties = new HashSet<>();
-
-    @XmlElement
-    private boolean gpgSign;
-
-    @XmlElement
-    private String gpgPassPhrase;
-
-    @Override
-    public boolean isHandleReleases() {
-        return true;
-    }
-
-    @Override
-    public boolean isHandleSnapshots() {
-        return false;
-    }
-
-    public BintrayApplicationConfig getBintrayApplication() {
-        return bintrayApplication;
-    }
-
-    public void setBintrayApplication(BintrayApplicationConfig bintrayApplication) {
-        this.bintrayApplication = bintrayApplication;
-    }
-
-    public List<DistributionRule> getRules() {
-        return rules;
-    }
-
-    public void setRules(List<DistributionRule> rules) {
-        this.rules = rules;
-    }
-
-    public ProxyDescriptor getProxy() {
-        return proxy;
-    }
-
-    public void setProxy(ProxyDescriptor proxy) {
-        this.proxy = proxy;
-    }
-
-    public String getProductName() {
-        return productName;
-    }
-
-    public void setProductName(String productName) {
-        this.productName = productName;
-    }
-
-    public boolean getDefaultNewRepoPrivate() {
-        return defaultNewRepoPrivate;
-    }
-
-    public void setDefaultNewRepoPrivate(boolean defaultNewRepoPrivate) {
-        this.defaultNewRepoPrivate = defaultNewRepoPrivate;
-    }
-
-    public boolean getDefaultNewRepoPremium() {
-        return defaultNewRepoPremium;
-    }
-
-    public void setDefaultNewRepoPremium(boolean defaultNewRepoPremium) {
-        this.defaultNewRepoPremium = defaultNewRepoPremium;
-    }
-
-    public Set<String> getDefaultLicenses() {
-        return defaultLicenses;
-    }
-
-    public void setDefaultLicenses(Set<String> defaultLicenses) {
-        this.defaultLicenses = defaultLicenses;
-    }
-
-
-    public String getDefaultVcsUrl() {
-        return defaultVcsUrl;
-    }
-
-    public void setDefaultVcsUrl(String defaultVcsUrl) {
-        this.defaultVcsUrl = defaultVcsUrl;
-    }
-
-    public Set<String> getWhiteListedProperties() {
-        return whiteListedProperties;
-    }
-
-    public void setWhiteListedProperties(Set<String> whiteListedProperties) {
-        this.whiteListedProperties = whiteListedProperties;
-    }
-
-    public boolean isGpgSign() {
-        return gpgSign;
-    }
-
-    public void setGpgSign(boolean gpgSign) {
-        this.gpgSign = gpgSign;
-    }
-
-    public String getGpgPassPhrase() {
-        return gpgPassPhrase;
-    }
-
-    public void setGpgPassPhrase(String gpgPassPhrase) {
-        this.gpgPassPhrase = gpgPassPhrase;
-    }
-
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/distribution/package-info.java b/base/config/src/main/java/org/artifactory/descriptor/repo/distribution/package-info.java
deleted file mode 100644
index d018560..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/distribution/package-info.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
- at XmlSchema(namespace = Descriptor.NS, elementFormDefault = XmlNsForm.QUALIFIED)
- at XmlAccessorType(XmlAccessType.FIELD) package org.artifactory.descriptor.repo.distribution;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlNsForm;
-import javax.xml.bind.annotation.XmlSchema;
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/distribution/rule/DefaultDistributionRules.java b/base/config/src/main/java/org/artifactory/descriptor/repo/distribution/rule/DefaultDistributionRules.java
deleted file mode 100644
index 6ab5f2c..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/distribution/rule/DefaultDistributionRules.java
+++ /dev/null
@@ -1,118 +0,0 @@
-package org.artifactory.descriptor.repo.distribution.rule;
-
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.descriptor.repo.distribution.DistributionCoordinates;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.function.Predicate;
-import java.util.stream.Collectors;
-
-import static org.artifactory.util.distribution.DistributionConstants.*;
-
-/**
- * Forgive me for going over the right margin, this was getting unreadable.
- * @author Dan Feldman
- */
-public enum DefaultDistributionRules {
-
-    Bower(() -> new DistributionRule("Bower-default", RepoType.Bower, "", "",
-            new DistributionCoordinates(DEFAULT_GENERIC_REPO_NAME, PACKAGE_NAME_TOKEN, PACKAGE_VERSION_TOKEN, PATH_TOKEN))),
-
-    BowerProduct(() -> new DistributionRule("Bower-product-default", RepoType.Bower,  "",  "",
-            new DistributionCoordinates(PRODUCT_NAME_TOKEN + "-" + DEFAULT_GENERIC_REPO_NAME, PACKAGE_NAME_TOKEN, PACKAGE_VERSION_TOKEN, PATH_TOKEN))),
-
-    CocoaPods(() -> new DistributionRule("CocoaPods-default", RepoType.CocoaPods,  "",  "",
-            new DistributionCoordinates(DEFAULT_GENERIC_REPO_NAME, PACKAGE_NAME_TOKEN, PACKAGE_VERSION_TOKEN, PATH_TOKEN))),
-
-    CocoaPodsProduct(() -> new DistributionRule("CocoaPods-product-default", RepoType.CocoaPods,  "",  "",
-            new DistributionCoordinates(PRODUCT_NAME_TOKEN + "-" + DEFAULT_GENERIC_REPO_NAME, PACKAGE_NAME_TOKEN, PACKAGE_VERSION_TOKEN, PATH_TOKEN))),
-
-    Debian(() -> new DistributionRule("Debian-default", RepoType.Debian,  "",  "",
-            new DistributionCoordinates(DEFAULT_DEB_REPO_NAME, PACKAGE_NAME_TOKEN, PACKAGE_VERSION_TOKEN, PATH_TOKEN))),
-
-    DebianProduct(() -> new DistributionRule("Debian-product-default", RepoType.Debian,  "",  "",
-            new DistributionCoordinates(PRODUCT_NAME_TOKEN + "-" + DEFAULT_DEB_REPO_NAME, PACKAGE_NAME_TOKEN, PACKAGE_VERSION_TOKEN, PATH_TOKEN))),
-
-    Docker(() -> new DistributionRule("Docker-default", RepoType.Docker,  "",  "",
-            new DistributionCoordinates(DEFAULT_DOCKER_REPO_NAME, DOCKER_IMAGE_TOKEN, DOCKER_TAG_TOKEN, PATH_TOKEN))),
-
-    DockerProduct(() -> new DistributionRule("Docker-product-default", RepoType.Docker,  "",  "",
-            new DistributionCoordinates(PRODUCT_NAME_TOKEN + "-" + DEFAULT_DOCKER_REPO_NAME, DOCKER_IMAGE_TOKEN, DOCKER_TAG_TOKEN, PATH_TOKEN))),
-
-    Gradle(() -> new DistributionRule("Gradle-default", RepoType.Gradle,  "",  "",
-            new DistributionCoordinates(DEFAULT_MAVEN_REPO_NAME, MODULE_TOKEN, BASE_REV_TOKEN, PATH_TOKEN))),
-
-    GradleProduct(() -> new DistributionRule("Gradle-product-default", RepoType.Gradle,  "",  "",
-            new DistributionCoordinates(PRODUCT_NAME_TOKEN + "-" + DEFAULT_MAVEN_REPO_NAME, MODULE_TOKEN, BASE_REV_TOKEN, PATH_TOKEN))),
-
-    Ivy(() -> new DistributionRule("Ivy-default", RepoType.Ivy,  "",  "",
-            new DistributionCoordinates(DEFAULT_MAVEN_REPO_NAME, MODULE_TOKEN, BASE_REV_TOKEN, PATH_TOKEN))),
-
-    IvyProduct(() -> new DistributionRule("Ivy-product-default", RepoType.Ivy,  "",  "",
-            new DistributionCoordinates(PRODUCT_NAME_TOKEN + "-" + DEFAULT_MAVEN_REPO_NAME, MODULE_TOKEN, BASE_REV_TOKEN, PATH_TOKEN))),
-
-    Maven(() -> new DistributionRule("Maven-default", RepoType.Maven,  "",  "",
-            new DistributionCoordinates(DEFAULT_MAVEN_REPO_NAME, MODULE_TOKEN, BASE_REV_TOKEN, PATH_TOKEN))),
-
-    MavenProduct(() -> new DistributionRule("Maven-product-default", RepoType.Maven,  "",  "",
-            new DistributionCoordinates(PRODUCT_NAME_TOKEN + "-" + DEFAULT_MAVEN_REPO_NAME, MODULE_TOKEN, BASE_REV_TOKEN, PATH_TOKEN))),
-
-    Npm(() -> new DistributionRule("Npm-default", RepoType.Npm,  "",  "",
-            new DistributionCoordinates(DEFAULT_GENERIC_REPO_NAME, PACKAGE_NAME_TOKEN, PACKAGE_VERSION_TOKEN, PATH_TOKEN))),
-
-    NpmProduct(() -> new DistributionRule("Npm-product-default", RepoType.Npm,  "",  "",
-            new DistributionCoordinates(PRODUCT_NAME_TOKEN + "-" + DEFAULT_GENERIC_REPO_NAME, PACKAGE_NAME_TOKEN, PACKAGE_VERSION_TOKEN, PATH_TOKEN))),
-
-    NuGet(() -> new DistributionRule("NuGet-default", RepoType.NuGet,  "",  "",
-            new DistributionCoordinates(DEFAULT_NUGET_REPO_NAME, PACKAGE_NAME_TOKEN, PACKAGE_VERSION_TOKEN, PATH_TOKEN))),
-
-    NuGetProduct(() -> new DistributionRule("NuGet-product-default", RepoType.NuGet,  "",  "",
-            new DistributionCoordinates(PRODUCT_NAME_TOKEN + "-" + DEFAULT_NUGET_REPO_NAME, PACKAGE_NAME_TOKEN, PACKAGE_VERSION_TOKEN, PATH_TOKEN))),
-
-    Opkg(() -> new DistributionRule("Opkg-default", RepoType.Opkg,  "",  "",
-            new DistributionCoordinates(DEFAULT_OPKG_REPO_NAME, PACKAGE_NAME_TOKEN+"-"+ARCHITECTURE_TOKEN, PACKAGE_VERSION_TOKEN, PATH_TOKEN))),
-
-    OpkgProduct(() -> new DistributionRule("Opkg-product-default", RepoType.Opkg,  "",  "",
-            new DistributionCoordinates(PRODUCT_NAME_TOKEN + "-" + DEFAULT_OPKG_REPO_NAME, PACKAGE_NAME_TOKEN+"-"+ARCHITECTURE_TOKEN, PACKAGE_VERSION_TOKEN, PATH_TOKEN))),
-
-    Rpm(() -> new DistributionRule("Yum-default", RepoType.YUM,  "",  "",
-            new DistributionCoordinates(DEFAULT_RPM_REPO_NAME, PACKAGE_NAME_TOKEN, PACKAGE_VERSION_TOKEN, PATH_TOKEN))),
-
-    RpmProduct(() -> new DistributionRule("Yum-product-default", RepoType.YUM,  "",  "",
-            new DistributionCoordinates(PRODUCT_NAME_TOKEN + "-" + DEFAULT_RPM_REPO_NAME, PACKAGE_NAME_TOKEN, PACKAGE_VERSION_TOKEN, PATH_TOKEN))),
-
-    Sbt(() -> new DistributionRule("Sbt-default", RepoType.SBT,  "",  "",
-            new DistributionCoordinates(DEFAULT_MAVEN_REPO_NAME, MODULE_TOKEN, BASE_REV_TOKEN, PATH_TOKEN))),
-
-    SbtProduct(() -> new DistributionRule("Sbt-product-default", RepoType.SBT,  "",  "",
-            new DistributionCoordinates(PRODUCT_NAME_TOKEN + "-" + DEFAULT_MAVEN_REPO_NAME, MODULE_TOKEN, BASE_REV_TOKEN, PATH_TOKEN))),
-
-    Vagrant(() -> new DistributionRule("Vagrant-default", RepoType.Vagrant,  "",  "",
-            new DistributionCoordinates(DEFAULT_VAGRANT_REPO_NAME, PACKAGE_NAME_TOKEN, PACKAGE_VERSION_TOKEN, PATH_TOKEN))),
-
-    VagrantProduct(() -> new DistributionRule("Vagrant-product-default", RepoType.Vagrant,  "",  "",
-            new DistributionCoordinates(PRODUCT_NAME_TOKEN + "-" + DEFAULT_VAGRANT_REPO_NAME, PACKAGE_NAME_TOKEN, PACKAGE_VERSION_TOKEN, PATH_TOKEN)));
-
-    private final DistributionRuleFactory ruleFactory;
-
-    DistributionRule getRule() {
-        return ruleFactory.create();
-    }
-
-    DefaultDistributionRules(DistributionRuleFactory ruleFactory) {
-        this.ruleFactory = ruleFactory;
-    }
-
-    public static List<DistributionRule> getDefaultRules() {
-        return collectRules(defaultRule -> !defaultRule.name().endsWith("Product"));
-    }
-
-    public static List<DistributionRule> getDefaultProductRules() {
-        return collectRules(defaultRule -> defaultRule.name().endsWith("Product"));
-    }
-
-    public static List<DistributionRule> collectRules(Predicate<DefaultDistributionRules> predicate) {
-        return Arrays.stream(values()).filter(predicate).map(DefaultDistributionRules::getRule).collect(Collectors.toList());
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/distribution/rule/DistributionRule.java b/base/config/src/main/java/org/artifactory/descriptor/repo/distribution/rule/DistributionRule.java
deleted file mode 100644
index 9227af6..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/distribution/rule/DistributionRule.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo.distribution.rule;
-
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.descriptor.repo.distribution.DistributionCoordinates;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlID;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * A Distribution rule used to map an artifacts to its distribution coordinates in Bintray
- *
- * @author Dan Feldman
- */
- at XmlType(name = "DistributionRuleType", propOrder = {"name", "type", "repoFilter", "pathFilter", "distributionCoordinates"},
-        namespace = Descriptor.NS)
-public class DistributionRule implements Descriptor {
-
-    @XmlID
-    @XmlElement(required = true)
-    protected String name;
-
-    @XmlElement(required = true)
-    protected RepoType type;
-
-    @XmlElement(required = false)
-    protected String repoFilter;
-
-    @XmlElement(required = false)
-    protected String pathFilter;
-
-    @XmlElement(required = true)
-    protected DistributionCoordinates distributionCoordinates = new DistributionCoordinates();
-
-    public DistributionRule() {
-    }
-
-    public DistributionRule(DistributionRule copy) {
-        this.name = copy.name;
-        this.type = copy.type;
-        this.repoFilter = copy.repoFilter;
-        this.pathFilter = copy.pathFilter;
-        this.distributionCoordinates = copy.distributionCoordinates;
-    }
-
-    public DistributionRule(String name, RepoType type, String repoFilter, String pathFilter, DistributionCoordinates coordinates) {
-        this.name = name;
-        this.type = type;
-        this.repoFilter = repoFilter;
-        this.pathFilter = pathFilter;
-        this.distributionCoordinates = coordinates;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public RepoType getType() {
-        return type;
-    }
-
-    public void setType(RepoType type) {
-        this.type = type;
-    }
-
-    public String getRepoFilter() {
-        return repoFilter;
-    }
-
-    public void setRepoFilter(String repoFilter) {
-        this.repoFilter = repoFilter;
-    }
-
-    public String getPathFilter() {
-        return pathFilter;
-    }
-
-    public void setPathFilter(String pathFilter) {
-        this.pathFilter = pathFilter;
-    }
-
-    public DistributionCoordinates getDistributionCoordinates() {
-        return distributionCoordinates;
-    }
-
-    public void setDistributionCoordinates(DistributionCoordinates distributionCoordinates) {
-        this.distributionCoordinates = distributionCoordinates;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof DistributionRule)) return false;
-        DistributionRule that = (DistributionRule) o;
-        return getName() != null ? getName().equals(that.getName()) : that.getName() == null;
-    }
-
-    @Override
-    public int hashCode() {
-        return getName() != null ? getName().hashCode() : 0;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/distribution/rule/DistributionRuleFactory.java b/base/config/src/main/java/org/artifactory/descriptor/repo/distribution/rule/DistributionRuleFactory.java
deleted file mode 100644
index a9f572e..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/distribution/rule/DistributionRuleFactory.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.artifactory.descriptor.repo.distribution.rule;
-
-/**
- * <p>Created on 18/05/16
- *
- * @author Yinon Avraham
- */
-public interface DistributionRuleFactory {
-    DistributionRule create();
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/distribution/rule/package-info.java b/base/config/src/main/java/org/artifactory/descriptor/repo/distribution/rule/package-info.java
deleted file mode 100644
index 4784c58..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/distribution/rule/package-info.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
- at XmlSchema(namespace = Descriptor.NS, elementFormDefault = XmlNsForm.QUALIFIED)
- at XmlAccessorType(XmlAccessType.FIELD) package org.artifactory.descriptor.repo.distribution.rule;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlNsForm;
-import javax.xml.bind.annotation.XmlSchema;
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/jaxb/BintrayApplicationConfigsMapAdapter.java b/base/config/src/main/java/org/artifactory/descriptor/repo/jaxb/BintrayApplicationConfigsMapAdapter.java
deleted file mode 100644
index 99a3772..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/jaxb/BintrayApplicationConfigsMapAdapter.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.artifactory.descriptor.repo.jaxb;
-
-import com.google.common.collect.Maps;
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.descriptor.repo.BintrayApplicationConfig;
-import org.artifactory.util.PathUtils;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.XmlAdapter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-/**
- * @author Dan Feldman
- */
-public class BintrayApplicationConfigsMapAdapter
-        extends XmlAdapter<BintrayApplicationConfigsMapAdapter.Wrapper, Map<String, BintrayApplicationConfig>> {
-
-    @Override
-    public Map<String, BintrayApplicationConfig> unmarshal(Wrapper wrapper) throws Exception {
-        Map<String, BintrayApplicationConfig> bintrayAppConfigsMap = Maps.newLinkedHashMap();
-        List<String> duplicateRepos = wrapper.getList().stream()
-                .map(appConfig -> bintrayAppConfigsMap.put(appConfig.getKey(), appConfig))
-                .filter(duplicateAppConfig -> duplicateAppConfig != null)
-                .map(BintrayApplicationConfig::getKey)
-                .collect(Collectors.toList());
-
-        if (!duplicateRepos.isEmpty()) {
-            //Throw an error since jaxb swallows exceptions
-            throw new Error("Duplicate Bintray OAUth Application in configuration: "
-                    + PathUtils.collectionToDelimitedString(duplicateRepos) + ".");
-        }
-        return bintrayAppConfigsMap;
-    }
-
-    @Override
-    public Wrapper marshal(Map<String, BintrayApplicationConfig> map) throws Exception {
-        return new Wrapper(map);
-    }
-
-    @XmlType(name = "BintrayApplicationsType", namespace = Descriptor.NS)
-    public static class Wrapper {
-        @XmlElement(name = "bintrayApplication", required = true, namespace = Descriptor.NS)
-        private List<BintrayApplicationConfig> list = new ArrayList<>();
-
-        public Wrapper() {
-        }
-
-        public Wrapper(Map<String, BintrayApplicationConfig> map) {
-            list.addAll(map.values().stream().collect(Collectors.toList()));
-        }
-
-        public List<BintrayApplicationConfig> getList() {
-            return list;
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/jaxb/DistributionRepositoriesMapAdapter.java b/base/config/src/main/java/org/artifactory/descriptor/repo/jaxb/DistributionRepositoriesMapAdapter.java
deleted file mode 100644
index 8ff9e2b..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/jaxb/DistributionRepositoriesMapAdapter.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.artifactory.descriptor.repo.jaxb;
-
-import com.google.common.collect.Maps;
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.util.PathUtils;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.XmlAdapter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-/**
- * @author Dan Feldman
- */
-public class DistributionRepositoriesMapAdapter
-        extends XmlAdapter<DistributionRepositoriesMapAdapter.Wrapper, Map<String, DistributionRepoDescriptor>> {
-
-    @Override
-    public Map<String, DistributionRepoDescriptor> unmarshal(Wrapper wrapper) throws Exception {
-        Map<String, DistributionRepoDescriptor> distributionRepositoriesMap = Maps.newLinkedHashMap();
-        List<String> duplicateRepos = wrapper.getList().stream()
-                .map(repo -> distributionRepositoriesMap.put(repo.getKey(), repo))
-                .filter(duplicateRepo -> duplicateRepo != null)
-                .map(DistributionRepoDescriptor::getKey)
-                .collect(Collectors.toList());
-
-        if (!duplicateRepos.isEmpty()) {
-            //Throw an error since jaxb swallows exceptions
-            throw new Error("Duplicate repository keys in configuration: "
-                            + PathUtils.collectionToDelimitedString(duplicateRepos) + ".");
-        }
-        return distributionRepositoriesMap;
-    }
-
-    @Override
-    public Wrapper marshal(Map<String, DistributionRepoDescriptor> map) throws Exception {
-        return new Wrapper(map);
-    }
-
-    @XmlType(name = "DistributionRepositoriesType", namespace = Descriptor.NS)
-    public static class Wrapper {
-        @XmlElement(name = "distributionRepository", required = true, namespace = Descriptor.NS)
-        private List<DistributionRepoDescriptor> list = new ArrayList<>();
-
-        public Wrapper() {
-        }
-
-        public Wrapper(Map<String, DistributionRepoDescriptor> map) {
-            list.addAll(map.values().stream().collect(Collectors.toList()));
-        }
-
-        public List<DistributionRepoDescriptor> getList() {
-            return list;
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/jaxb/LocalRepositoriesMapAdapter.java b/base/config/src/main/java/org/artifactory/descriptor/repo/jaxb/LocalRepositoriesMapAdapter.java
deleted file mode 100644
index 325c571..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/jaxb/LocalRepositoriesMapAdapter.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo.jaxb;
-
-import com.google.common.collect.Maps;
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.XmlAdapter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Yoav Landman
- */
-public class LocalRepositoriesMapAdapter extends
-        XmlAdapter<LocalRepositoriesMapAdapter.Wrappper, Map<String, LocalRepoDescriptor>> {
-
-    @Override
-    public Map<String, LocalRepoDescriptor> unmarshal(Wrappper wrapper) throws Exception {
-        Map<String, LocalRepoDescriptor> localRepositoriesMap = Maps.newLinkedHashMap();
-        for (LocalRepoDescriptor repository : wrapper.getList()) {
-            String key = repository.getKey();
-            LocalRepoDescriptor repo = localRepositoriesMap.put(key, repository);
-            //Test for repositories with the same key
-            if (repo != null) {
-                //Throw an error since jaxb swallows exceptions
-                throw new Error(
-                        "Duplicate repository key in configuration: " + key + ".");
-            }
-        }
-        return localRepositoriesMap;
-    }
-
-    @Override
-    public Wrappper marshal(Map<String, LocalRepoDescriptor> map) throws Exception {
-        return new Wrappper(map);
-    }
-
-    @XmlType(name = "LocalRepositoriesType", namespace = Descriptor.NS)
-    public static class Wrappper {
-        @XmlElement(name = "localRepository", required = true, namespace = Descriptor.NS)
-        private List<LocalRepoDescriptor> list = new ArrayList<>();
-
-        public Wrappper() {
-        }
-
-        public Wrappper(Map<String, LocalRepoDescriptor> map) {
-            for (LocalRepoDescriptor repo : map.values()) {
-                list.add(repo);
-            }
-        }
-
-        public List<LocalRepoDescriptor> getList() {
-            return list;
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/jaxb/RemoteRepositoriesMapAdapter.java b/base/config/src/main/java/org/artifactory/descriptor/repo/jaxb/RemoteRepositoriesMapAdapter.java
deleted file mode 100644
index 50584dd..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/jaxb/RemoteRepositoriesMapAdapter.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo.jaxb;
-
-import com.google.common.collect.Maps;
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.descriptor.repo.HttpRepoDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.XmlAdapter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Yoav Landman
- */
-public class RemoteRepositoriesMapAdapter extends
-        XmlAdapter<RemoteRepositoriesMapAdapter.Wrappper, Map<String, RemoteRepoDescriptor>> {
-
-
-    @Override
-    public Map<String, RemoteRepoDescriptor> unmarshal(Wrappper wrapper)
-            throws Exception {
-        Map<String, RemoteRepoDescriptor> remoteRepositoriesMap = Maps.newLinkedHashMap();
-        for (RemoteRepoDescriptor repository : wrapper.getList()) {
-            String key = repository.getKey();
-            RemoteRepoDescriptor repo = remoteRepositoriesMap.put(key, repository);
-            //Test for repositories with the same key
-            if (repo != null) {
-                //Throw an error since jaxb swallows exceptions
-                throw new Error(
-                        "Duplicate repository key in configuration: " + key + ".");
-            }
-        }
-        return remoteRepositoriesMap;
-    }
-
-    @Override
-    public RemoteRepositoriesMapAdapter.Wrappper marshal(
-            Map<String, RemoteRepoDescriptor> map)
-            throws Exception {
-        return new RemoteRepositoriesMapAdapter.Wrappper(map);
-    }
-
-
-    @XmlType(name = "RemoteRepositoriesType", namespace = Descriptor.NS)
-    public static class Wrappper {
-        @XmlElement(name = "remoteRepository", required = true, namespace = Descriptor.NS)
-        private List<HttpRepoDescriptor> list = new ArrayList<>();
-
-
-        public Wrappper() {
-        }
-
-        public Wrappper(Map<String, RemoteRepoDescriptor> map) {
-            for (RemoteRepoDescriptor repo : map.values()) {
-                list.add((HttpRepoDescriptor) repo);
-            }
-        }
-
-        public List<HttpRepoDescriptor> getList() {
-            return list;
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/jaxb/RepositoriesListAdapter.java b/base/config/src/main/java/org/artifactory/descriptor/repo/jaxb/RepositoriesListAdapter.java
deleted file mode 100644
index e316a78..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/jaxb/RepositoriesListAdapter.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo.jaxb;
-
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.descriptor.repo.RepoBaseDescriptor;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlIDREF;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.XmlAdapter;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * The sole purpose of this adapter is to make jaxb call the setter: org.artifactory.repo.virtual.VirtualRepo#setRepositories(java.util.Set<org.artifactory.repo.Repo>)
- * (see: com.sun.xml.bind.v2.runtime.reflect.Lister.CollectionLister#endPacking(T, BeanT,
- * com.sun.xml.bind.v2.runtime.reflect.Accessor<BeanT,T>))
- *
- * @author yoavl
- */
-public class RepositoriesListAdapter
-        extends XmlAdapter<RepositoriesListAdapter.Wrappper, List<RepoDescriptor>> {
-
-    @Override
-    public List<RepoDescriptor> unmarshal(Wrappper wrappper) throws Exception {
-        return wrappper.getList();
-    }
-
-    @Override
-    public Wrappper marshal(List<RepoDescriptor> list) throws Exception {
-        return new RepositoriesListAdapter.Wrappper(list);
-    }
-
-    @XmlType(name = "RepositoryRefsType", namespace = Descriptor.NS)
-    public static class Wrappper {
-        //TODO: There seems to be a bug of referencing an ID from within an ID - this does not work
-        //(list always empty)
-        @XmlIDREF
-        @XmlElement(name = "repositoryRef", type = RepoBaseDescriptor.class,
-                namespace = Descriptor.NS)
-        private List<RepoDescriptor> list = new ArrayList<>();
-
-        public Wrappper() {
-        }
-
-        public Wrappper(List<RepoDescriptor> list) {
-            this.list = list;
-        }
-
-        public List<RepoDescriptor> getList() {
-            return list;
-        }
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/jaxb/VirtualRepositoriesMapAdapter.java b/base/config/src/main/java/org/artifactory/descriptor/repo/jaxb/VirtualRepositoriesMapAdapter.java
deleted file mode 100644
index 0272dd6..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/jaxb/VirtualRepositoriesMapAdapter.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo.jaxb;
-
-import com.google.common.collect.Maps;
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-import javax.xml.bind.annotation.adapters.XmlAdapter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Yoav Landman
- */
-public class VirtualRepositoriesMapAdapter
-        extends XmlAdapter<VirtualRepositoriesMapAdapter.Wrappper, Map<String, VirtualRepoDescriptor>> {
-
-    @Override
-    public Map<String, VirtualRepoDescriptor> unmarshal(Wrappper wrapper)
-            throws Exception {
-        Map<String, VirtualRepoDescriptor> virtualRepositoriesMap = Maps.newLinkedHashMap();
-        for (VirtualRepoDescriptor repository : wrapper.getList()) {
-            String key = repository.getKey();
-            VirtualRepoDescriptor repo = virtualRepositoriesMap.put(key, repository);
-            //Test for repositories with the same key
-            if (repo != null) {
-                //Throw an error since jaxb swallows exceptions
-                throw new Error(
-                        "Duplicate virtual repository key in configuration: " + key + ".");
-            }
-        }
-        return virtualRepositoriesMap;
-    }
-
-    @Override
-    public VirtualRepositoriesMapAdapter.Wrappper marshal(Map<String, VirtualRepoDescriptor> map) throws Exception {
-        return new VirtualRepositoriesMapAdapter.Wrappper(map);
-    }
-
-
-    @XmlType(name = "VirtualRepositoriesType", namespace = Descriptor.NS)
-    public static class Wrappper {
-        @XmlElement(name = "virtualRepository", required = true, namespace = Descriptor.NS)
-        private List<VirtualRepoDescriptor> list = new ArrayList<>();
-
-
-        public Wrappper() {
-        }
-
-        public Wrappper(Map<String, VirtualRepoDescriptor> map) {
-            for (VirtualRepoDescriptor repo : map.values()) {
-                list.add(repo);
-            }
-        }
-
-        public List<VirtualRepoDescriptor> getList() {
-            return list;
-        }
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/package-info.java b/base/config/src/main/java/org/artifactory/descriptor/repo/package-info.java
deleted file mode 100644
index f96a474..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/package-info.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
- at XmlSchema(namespace = Descriptor.NS,
-        elementFormDefault = XmlNsForm.QUALIFIED)
- at XmlAccessorType(XmlAccessType.FIELD) package org.artifactory.descriptor.repo;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlNsForm;
-import javax.xml.bind.annotation.XmlSchema;
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/AbstractVcsProviderConfiguration.java b/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/AbstractVcsProviderConfiguration.java
deleted file mode 100644
index 0462803..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/AbstractVcsProviderConfiguration.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.descriptor.repo.vcs;
-
-import java.util.Map;
-
-/**
- * Created by michaelp on 6/28/15.
- */
-public abstract class AbstractVcsProviderConfiguration implements VcsProviderConfiguration {
-
-    private final String prettyText;
-    private final String refsPrefix;
-    private final String repositoryDownloadUrl;
-    private final String resourceDownloadUrl;
-    private final Map<String, String> headers;
-    private final String releaseDownloadUrl;
-
-    AbstractVcsProviderConfiguration(String prettyText, String refsPrefix, String repositoryDownloadUrl) {
-        this.prettyText = prettyText;
-        this.refsPrefix = refsPrefix;
-        this.repositoryDownloadUrl = repositoryDownloadUrl;
-        this.resourceDownloadUrl = null;
-        this.headers = null;
-        this.releaseDownloadUrl = null;
-    }
-
-    AbstractVcsProviderConfiguration(String prettyText, String refsPrefix, String repositoryDownloadUrl,
-            String resourceDownloadUrl) {
-        this.prettyText = prettyText;
-        this.refsPrefix = refsPrefix;
-        this.repositoryDownloadUrl = repositoryDownloadUrl;
-        this.resourceDownloadUrl = resourceDownloadUrl;
-        this.headers = null;
-        this.releaseDownloadUrl = null;
-    }
-
-    AbstractVcsProviderConfiguration(String prettyText, String refsPrefix, String repositoryDownloadUrl,
-                                     String resourceDownloadUrl, Map<String, String> headers, String releaseDownloadUrl) {
-        this.prettyText = prettyText;
-        this.refsPrefix = refsPrefix;
-        this.repositoryDownloadUrl = repositoryDownloadUrl;
-        this.resourceDownloadUrl = resourceDownloadUrl;
-        this.releaseDownloadUrl = releaseDownloadUrl;
-        this.headers = headers;
-    }
-
-    @Override
-    public String getPrettyText() {
-        return prettyText;
-    }
-
-    @Override
-    public String getRefsPrefix() {
-        return refsPrefix;
-    }
-
-    @Override
-    public String getRepositoryDownloadUrl() {
-        return repositoryDownloadUrl;
-    }
-
-    @Override
-    public String getResourceDownloadUrl() {
-        return resourceDownloadUrl;
-    }
-
-    @Override
-    public String getReleaseDownloadUrl() {
-        return releaseDownloadUrl;
-    }
-
-    @Override
-    public Map<String, String> getHeaders() {
-        return headers;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsArtifactoryProviderConfiguration.java b/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsArtifactoryProviderConfiguration.java
deleted file mode 100644
index 6339870..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsArtifactoryProviderConfiguration.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.descriptor.repo.vcs;
-
-import java.util.HashMap;
-
-/**
- * Created by michaelp on 6/28/15.
- */
-public class VcsArtifactoryProviderConfiguration extends AbstractVcsProviderConfiguration {
-
-    public VcsArtifactoryProviderConfiguration() {
-        super(
-                "Artifactory",
-                "",
-                "{0}/{1}/{2}?ext={3}"
-        );
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsBitbucketProviderConfiguration.java b/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsBitbucketProviderConfiguration.java
deleted file mode 100644
index 332423f..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsBitbucketProviderConfiguration.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.descriptor.repo.vcs;
-
-/**
- * Created by michaelp on 6/28/15.
- */
-public class VcsBitbucketProviderConfiguration extends AbstractVcsProviderConfiguration {
-
-    public VcsBitbucketProviderConfiguration() {
-        super("Bitbucket",
-                "",
-                "{0}/{1}/get/{2}.{3}",
-                "https://bitbucket.org/api/1.0/repositories/{0}/{1}/raw/{3}/{2}"
-        );
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsCustomProviderConfiguration.java b/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsCustomProviderConfiguration.java
deleted file mode 100644
index eda47d0..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsCustomProviderConfiguration.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.descriptor.repo.vcs;
-
-/**
- * Created by michaelp on 6/28/15.
- */
-public class VcsCustomProviderConfiguration extends AbstractVcsProviderConfiguration {
-
-    public VcsCustomProviderConfiguration() {
-        super("Custom", "", "");
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsGitProvider.java b/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsGitProvider.java
deleted file mode 100644
index d05efa8..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsGitProvider.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo.vcs;
-
-import javax.xml.bind.annotation.XmlEnum;
-import javax.xml.bind.annotation.XmlEnumValue;
-import java.util.Map;
-
-/**
- * Enum of the VCS Git repository type.
- *
- * @author Shay Yaakov
- */
- at XmlEnum(String.class)
-public enum VcsGitProvider {
-
-    @XmlEnumValue("github")
-    GITHUB(new VcsGitProviderConfiguration()),
-
-    @XmlEnumValue("bitbucket")
-    BITBUCKET(new VcsBitbucketProviderConfiguration()),
-    @XmlEnumValue("stash")
-    STASH(new VcsStashProviderConfiguration()),
-
-    @XmlEnumValue("artifactory")
-    ARTIFACTORY(new VcsArtifactoryProviderConfiguration()),
-
-    @XmlEnumValue("custom")
-    CUSTOM(new VcsCustomProviderConfiguration());
-
-    VcsGitProvider(VcsProviderConfiguration configuration) {
-        this.configuration = configuration;
-    }
-
-    VcsProviderConfiguration configuration;
-
-    public String getPrettyText() {
-        return configuration.getPrettyText();
-    }
-
-    public String getRefsPrefix() {
-        return configuration.getRefsPrefix();
-    }
-
-    public String getRepositoryDownloadUrl() {
-        return configuration.getRepositoryDownloadUrl();
-    }
-
-    public String getResourceDownloadUrl() {
-        return configuration.getResourceDownloadUrl();
-    }
-
-    public String getReleaseDownloadUrl() {
-        return configuration.getReleaseDownloadUrl();
-    }
-
-    public Map<String, String> getHeaders() {
-        return configuration.getHeaders();
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsGitProviderConfiguration.java b/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsGitProviderConfiguration.java
deleted file mode 100644
index de56b3b..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsGitProviderConfiguration.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.descriptor.repo.vcs;
-
-import java.util.HashMap;
-
-/**
- * Created by michaelp on 6/28/15.
- */
-public class VcsGitProviderConfiguration extends AbstractVcsProviderConfiguration {
-
-    public VcsGitProviderConfiguration() {
-        super(
-                "GitHub",
-                "",
-                "{0}/{1}/archive/{2}.{3}",
-                "https://api.github.com/repos/{0}/{1}/contents/{2}?ref={3}",
-                new HashMap<String, String>(){{put("Accept", "application/vnd.github.v3.raw");}}
-                , "https://api.github.com/repos/{0}/{1}/{2}/{3}"
-        );
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsProviderConfiguration.java b/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsProviderConfiguration.java
deleted file mode 100644
index 92a727f..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsProviderConfiguration.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.descriptor.repo.vcs;
-
-import java.util.Map;
-
-/**
- * Created by michaelp on 6/28/15.
- */
-public interface VcsProviderConfiguration {
-    String getPrettyText();
-
-    String getRefsPrefix();
-
-    String getRepositoryDownloadUrl();
-
-    String getResourceDownloadUrl();
-
-    Map<String, String> getHeaders();
-
-    String getReleaseDownloadUrl();
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsStashProviderConfiguration.java b/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsStashProviderConfiguration.java
deleted file mode 100644
index 293d603..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsStashProviderConfiguration.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.descriptor.repo.vcs;
-
-/**
- * Created by michaelp on 6/28/15.
- */
-public class VcsStashProviderConfiguration extends AbstractVcsProviderConfiguration {
-
-    public VcsStashProviderConfiguration() {
-        super(
-                "Stash",
-                "scm/",
-                "plugins/servlet/archive/projects/{0}/repos/{1}?at={2}&format={3}"
-        );
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsType.java b/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsType.java
deleted file mode 100644
index 485559a..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsType.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo.vcs;
-
-import javax.xml.bind.annotation.XmlEnum;
-import javax.xml.bind.annotation.XmlEnumValue;
-
-/**
- * Enum of the VCS type support for remote repositories.
- *
- * @author Shay Yaakov
- */
- at XmlEnum(String.class)
-public enum VcsType {
-    @XmlEnumValue("git")GIT("git");
-
-    private final String val;
-
-    VcsType(String val) {
-        this.val = val;
-    }
-
-    public String toString() {
-        return val;
-    }
-
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsUrlBuilder.java b/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsUrlBuilder.java
deleted file mode 100644
index 61cf22f..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/repo/vcs/VcsUrlBuilder.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.descriptor.repo.vcs;
-
-import com.google.common.base.Strings;
-
-import java.text.MessageFormat;
-
-/**
- * Created by michaelp on 6/28/15.
- */
-public class VcsUrlBuilder {
-
-    /**
-     * Formats single resource download URL based on
-     * VcsGitProvider url definition
-     *
-     * @param provider
-     * @param user
-     * @param repository
-     * @param file
-     * @param branch
-     *
-     * @return formatted url
-     */
-    public static String resourceDownloadUrl(VcsGitProvider provider, String user, String repository, String file, String branch) {
-        if(!Strings.isNullOrEmpty(provider.getResourceDownloadUrl())) {
-            String[] values = new String[] {user, repository, file, branch};
-            return MessageFormat.format(provider.getResourceDownloadUrl(), values);
-        }
-        return null;
-    }
-
-    /**
-     * Formats single resource download URL based on
-     * VcsGitProvider url definition
-     *
-     * @param provider
-     * @param user
-     * @param repository
-     * @param release
-     *
-     * @return formatted url
-     */
-    public static String releaseDownloadUrl(VcsGitProvider provider, String user, String repository, String release, String ballType) {
-        if (!Strings.isNullOrEmpty(provider.getReleaseDownloadUrl())) {
-            String[] values = new String[]{user, repository, ballType, release};
-            return MessageFormat.format(provider.getReleaseDownloadUrl(), values);
-        }
-        return null;
-    }
-
-    /**
-     * Formats repository download URL based on
-     * VcsGitProvider url definition
-     *
-     * @param urlTemplate
-     * @param gitOrg
-     * @param gitRepo
-     * @param version
-     * @param fileExt
-     *
-     * @return formatted url
-     */
-    public static String repositoryDownloadUrl(String urlTemplate, String gitOrg, String gitRepo, String version, String fileExt) {
-        if(!Strings.isNullOrEmpty(urlTemplate)) {
-            String[] values = new String[] {gitOrg, gitRepo, version, fileExt};
-            return MessageFormat.format(urlTemplate, values);
-        }
-        return null;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/security/EncryptionPolicy.java b/base/config/src/main/java/org/artifactory/descriptor/security/EncryptionPolicy.java
deleted file mode 100644
index a5a86c4..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/security/EncryptionPolicy.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.security;
-
-import javax.xml.bind.annotation.XmlEnumValue;
-
-/**
- * Password encryption policy types.
- *
- * @author Yossi Shaul
- */
-public enum EncryptionPolicy {
-    @XmlEnumValue("supported")SUPPORTED,
-    @XmlEnumValue("required")REQUIRED,
-    @XmlEnumValue("unsupported")UNSUPPORTED
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/security/PasswordExpirationPolicy.java b/base/config/src/main/java/org/artifactory/descriptor/security/PasswordExpirationPolicy.java
deleted file mode 100644
index 7aad850..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/security/PasswordExpirationPolicy.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.descriptor.security;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * Password expiration configuration
- *
- * @author Michael Pasternak
- */
-
- at XmlType(name = "PasswordExpirationPolicyType",
-        propOrder = {"enabled", "passwordMaxAge", "notifyByEmail", "currentPasswordValidFor"},
-        namespace = Descriptor.NS
-)
-public class PasswordExpirationPolicy implements Descriptor {
-
-    @XmlElement(defaultValue = "false", required = false)
-    private Boolean enabled = false;
-
-    @XmlElement(defaultValue = "60", required = false)
-    private Integer passwordMaxAge = 60;
-
-    @XmlElement(defaultValue = "true", required = false)
-    private Boolean notifyByEmail = true;
-
-    @XmlElement(required = false)
-    private Integer currentPasswordValidFor;
-
-    public Boolean isEnabled() {
-        return enabled;
-    }
-
-    public void setEnabled(Boolean enabled) {
-        this.enabled = enabled;
-    }
-
-    /**
-     * @return number of days for password to get expired (general password live time)
-     */
-    public Integer getPasswordMaxAge() {
-        return passwordMaxAge;
-    }
-
-    /**
-     * @param passwordMaxAge number of days for password to get expired (general password live time)
-     */
-    public void setPasswordMaxAge(Integer passwordMaxAge) {
-        this.passwordMaxAge = passwordMaxAge;
-    }
-
-    public Boolean isNotifyByEmail() {
-        return notifyByEmail;
-    }
-
-    public void setNotifyByEmail(Boolean notifyByEmail) {
-        this.notifyByEmail = notifyByEmail;
-    }
-
-    /**
-     * @return number of days till password should be changed
-     */
-    public Integer getCurrentPasswordValidFor() {
-        return currentPasswordValidFor;
-    }
-
-    /**
-     * @param currentPasswordValidFor number of days till password should be changed
-     */
-    public void setCurrentPasswordValidFor(Integer currentPasswordValidFor) {
-        this.currentPasswordValidFor = currentPasswordValidFor;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        PasswordExpirationPolicy that = (PasswordExpirationPolicy) o;
-
-        if (enabled != null ? !enabled.equals(that.enabled) : that.enabled != null) return false;
-        if (passwordMaxAge != null ? !passwordMaxAge.equals(that.passwordMaxAge) : that.passwordMaxAge != null)
-            return false;
-        if (notifyByEmail != null ? !notifyByEmail.equals(that.notifyByEmail) : that.notifyByEmail != null)
-            return false;
-        return currentPasswordValidFor != null ? currentPasswordValidFor.equals(that.currentPasswordValidFor) : that.currentPasswordValidFor == null;
-
-    }
-
-    @Override
-    public int hashCode() {
-        int result = enabled != null ? enabled.hashCode() : 0;
-        result = 31 * result + (passwordMaxAge != null ? passwordMaxAge.hashCode() : 0);
-        result = 31 * result + (notifyByEmail != null ? notifyByEmail.hashCode() : 0);
-        result = 31 * result + (currentPasswordValidFor != null ? currentPasswordValidFor.hashCode() : 0);
-        return result;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/security/PasswordSettings.java b/base/config/src/main/java/org/artifactory/descriptor/security/PasswordSettings.java
deleted file mode 100644
index f12195e..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/security/PasswordSettings.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.security;
-
-import org.artifactory.descriptor.Descriptor;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * The password policy related settings.
- *
- * @author Yossi Shaul
- */
- at XmlType(name = "PasswordSettingsType", namespace = Descriptor.NS)
- at JsonIgnoreProperties(value = {"encryptionEnabled","encryptionRequired"})
-public class PasswordSettings implements Descriptor {
-
-    @XmlElement(defaultValue = "supported", required = false)
-    private EncryptionPolicy encryptionPolicy = EncryptionPolicy.SUPPORTED;
-
-    @XmlElement(name = "expirationPolicy", required = false)
-    private PasswordExpirationPolicy expirationPolicy = new PasswordExpirationPolicy();
-
-
-    public EncryptionPolicy getEncryptionPolicy() {
-        return encryptionPolicy;
-    }
-
-    public void setEncryptionPolicy(EncryptionPolicy encryptionPolicy) {
-        this.encryptionPolicy = encryptionPolicy;
-    }
-
-    /**
-     * @return True if encryption is required.
-     */
-    public boolean isEncryptionRequired() {
-        return EncryptionPolicy.REQUIRED.equals(encryptionPolicy);
-    }
-
-    /**
-     * @return True if encryption is supported\required. False if not.
-     */
-    public boolean isEncryptionEnabled() {
-        return (EncryptionPolicy.SUPPORTED.equals(encryptionPolicy) ||
-                EncryptionPolicy.REQUIRED.equals(encryptionPolicy));
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        PasswordSettings that = (PasswordSettings) o;
-
-        if (encryptionPolicy != that.encryptionPolicy) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return encryptionPolicy != null ? encryptionPolicy.hashCode() : 0;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append("encryptionPolicy: ");
-        sb.append(encryptionPolicy);
-        sb.append("expirationPolicy: ");
-        sb.append(encryptionPolicy.toString());
-        return sb.toString();
-    }
-
-    public PasswordExpirationPolicy getExpirationPolicy() {
-        return expirationPolicy;
-    }
-
-    public void setExpirationPolicy(PasswordExpirationPolicy expirationPolicy) {
-        this.expirationPolicy = expirationPolicy;
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/security/SecurityDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/security/SecurityDescriptor.java
deleted file mode 100644
index 2926683..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/security/SecurityDescriptor.java
+++ /dev/null
@@ -1,459 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.security;
-
-import com.google.common.collect.Lists;
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.descriptor.security.debian.DebianSettings;
-import org.artifactory.descriptor.security.ldap.LdapSetting;
-import org.artifactory.descriptor.security.ldap.group.LdapGroupSetting;
-import org.artifactory.descriptor.security.oauth.OAuthSettings;
-import org.artifactory.descriptor.security.sshserver.SshServerSettings;
-import org.artifactory.descriptor.security.sso.CrowdSettings;
-import org.artifactory.descriptor.security.sso.HttpSsoSettings;
-import org.artifactory.descriptor.security.sso.SamlSettings;
-import org.artifactory.util.AlreadyExistsException;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlType;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * @author Yossi Shaul
- */
- at XmlRootElement
- at XmlType(name = "SecurityType", propOrder = {"anonAccessEnabled", "anonAccessToBuildInfosDisabled",
-        "hideUnauthorizedResources", "passwordSettings", "ldapSettings", "ldapGroupSettings", "httpSsoSettings",
-        "crowdSettings", "samlSettings", "oauthSettings", "debianSettings", "userLockPolicy", "sshServerSettings"},
-        namespace = Descriptor.NS)
-public class SecurityDescriptor implements Descriptor {
-
-    @XmlElement(defaultValue = "true")
-    private boolean anonAccessEnabled = true;
-
-    @XmlElement(defaultValue = "false")
-    private boolean anonAccessToBuildInfosDisabled = false;
-
-    /**
-     * This flag controls whether we reveal the cause when user requests a resource she is not authorize to view.
-     */
-    @XmlElement(defaultValue = "false", required = false)
-    private boolean hideUnauthorizedResources = false;
-
-    @XmlElementWrapper(name = "ldapSettings")
-    @XmlElement(name = "ldapSetting", required = false)
-    private List<LdapSetting> ldapSettings = Lists.newArrayList();
-
-    @XmlElementWrapper(name = "ldapGroupSettings")
-    @XmlElement(name = "ldapGroupSetting", required = false)
-    private List<LdapGroupSetting> ldapGroupSettings = Lists.newArrayList();
-
-    @XmlElement(name = "passwordSettings", required = false)
-    private PasswordSettings passwordSettings = new PasswordSettings();
-
-    @XmlElement(name = "httpSsoSettings", required = false)
-    private HttpSsoSettings httpSsoSettings;
-
-    @XmlElement(name = "crowdSettings", required = false)
-    private CrowdSettings crowdSettings;
-
-    @XmlElement(name = "samlSettings", required = false)
-    private SamlSettings samlSettings;
-
-    @XmlElement(name = "debianSettings", required = false)
-    private DebianSettings debianSettings;
-
-    @XmlElement(name = "oauthSettings", required = false)
-    private OAuthSettings oauthSettings;
-
-    @XmlElement(name = "userLockPolicy", required = false)
-    private UserLockPolicy userLockPolicy = new UserLockPolicy();
-
-    @XmlElement(name = "sshServerSettings", required = false)
-    private SshServerSettings sshServerSettings;
-
-    public static boolean equalLdapLists(@Nullable List<LdapSetting> l1, @Nullable List<LdapSetting> l2) {
-        if (l1 == l2) {
-            return true;
-        }
-        if (l1 == null || l2 == null) {
-            return false;
-        }
-        if (l1.size() != l2.size()) {
-            return false;
-        }
-
-        for (int i = 0; i < l1.size(); i++) {
-            if (!l1.get(i).identicalConfiguration(l2.get(i))) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    public static boolean equalLdapGroupLists(@Nullable List<LdapGroupSetting> l1,
-            @Nullable List<LdapGroupSetting> l2) {
-        if (l1 == l2) {
-            return true;
-        }
-        if (l1 == null || l2 == null) {
-            return false;
-        }
-        if (l1.size() != l2.size()) {
-            return false;
-        }
-
-        for (int i = 0; i < l1.size(); i++) {
-            if (!l1.get(i).identicalConfiguration(l2.get(i))) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    public boolean isAnonAccessEnabled() {
-        return anonAccessEnabled;
-    }
-
-    public void setAnonAccessEnabled(boolean anonAccessEnabled) {
-        this.anonAccessEnabled = anonAccessEnabled;
-    }
-
-    public boolean isAnonAccessToBuildInfosDisabled() {
-        return anonAccessToBuildInfosDisabled;
-    }
-
-    public void setAnonAccessToBuildInfosDisabled(boolean anonAccessToBuildInfosDisabled) {
-        this.anonAccessToBuildInfosDisabled = anonAccessToBuildInfosDisabled;
-    }
-
-    /**
-     * This flag controls whether we reveal the cause when user requests a resource she is not authorize to view.
-     */
-    public boolean isHideUnauthorizedResources() {
-        return hideUnauthorizedResources;
-    }
-
-    /**
-     * This flag controls whether we reveal the cause when user requests a resource she is not authorize to view.
-     *
-     * @param hideUnauthorizedResources If true hide security reason (return 404)
-     */
-    public void setHideUnauthorizedResources(boolean hideUnauthorizedResources) {
-        this.hideUnauthorizedResources = hideUnauthorizedResources;
-    }
-
-    public List<LdapSetting> getLdapSettings() {
-        return ldapSettings;
-    }
-
-    public void setLdapSettings(List<LdapSetting> ldapSettings) {
-        if (ldapSettings != null) {
-            this.ldapSettings = ldapSettings;
-        } else {
-            this.ldapSettings = Lists.newArrayList();
-        }
-    }
-
-    public List<LdapGroupSetting> getLdapGroupSettings() {
-        return ldapGroupSettings;
-    }
-
-    private void setLdapGroupSettings(LdapGroupSetting ldapGroupSetting) {
-        if (!ldapGroupSettings.isEmpty()) {
-            int indexOfLdapGroupSetting = ldapGroupSettings.indexOf(ldapGroupSetting);
-            if (indexOfLdapGroupSetting != -1) {
-                ldapGroupSettings.set(indexOfLdapGroupSetting, ldapGroupSetting);
-            }
-        }
-    }
-
-    public void setLdapGroupSettings(List<LdapGroupSetting> ldapGroupSettings) {
-        if (ldapGroupSettings != null) {
-            this.ldapGroupSettings = ldapGroupSettings;
-        } else {
-            this.ldapGroupSettings = Lists.newArrayList();
-        }
-    }
-
-    public void addLdap(LdapSetting ldapSetting) {
-        if (ldapSettings.contains(ldapSetting)) {
-            throw new AlreadyExistsException("The LDAP configuration " + ldapSetting.getKey() + " already exists");
-        }
-        ldapSettings.add(ldapSetting);
-    }
-
-    /**
-     * When changing the LDAP settings configuration and enabling a new (or exisiting) LDAP settings, make sure the
-     * other LDAP settings are not enabled.
-     *
-     * @param ldapSetting The LDAP setting that is updated.
-     */
-    public void ldapSettingChanged(LdapSetting ldapSetting) {
-        LdapSetting setting = getLdapSettings(ldapSetting.getKey());
-        if (setting != null) {
-            int indexOfLdapSetting = ldapSettings.indexOf(ldapSetting);
-            if (indexOfLdapSetting != -1) {
-                ldapSettings.set(indexOfLdapSetting, ldapSetting);
-            }
-        }
-    }
-
-    public void ldapGroupSettingChanged(LdapGroupSetting ldapGroupSetting) {
-        LdapGroupSetting groupSettings = getLdapGroupSettings(ldapGroupSetting.getName());
-        if (groupSettings != null) {
-            setLdapGroupSettings(ldapGroupSetting);
-        }
-    }
-
-    public void addLdapGroup(LdapGroupSetting ldapGroupSetting) {
-        if (ldapGroupSettings.contains(ldapGroupSetting)) {
-            throw new AlreadyExistsException(
-                    "The LDAP configuration " + ldapGroupSetting.getName() + " already exists");
-        }
-        ldapGroupSettings.add(ldapGroupSetting);
-    }
-
-    public LdapGroupSetting removeLdapGroup(String ldapGroupName) {
-        LdapGroupSetting groupSettings = getLdapGroupSettings(ldapGroupName);
-        if (groupSettings != null) {
-            ldapGroupSettings.remove(groupSettings);
-        }
-        return groupSettings;
-    }
-
-    /**
-     * In case an LDAP settings was removed, all LDAP groups with reference to the LDAP settings need to be
-     * removed.
-     *
-     * @param ldapSettingKey The key of the LDAP settings being removed
-     */
-    public void removeLdapGroupsWithLdapSettingsKey(String ldapSettingKey) {
-        List<LdapGroupSetting> settings = getLdapGroupSettings();
-        Iterator<LdapGroupSetting> ldapGroupSettingIterator = settings.iterator();
-        while (ldapGroupSettingIterator.hasNext()) {
-            LdapGroupSetting setting = ldapGroupSettingIterator.next();
-            if (setting.getEnabledLdap().equals(ldapSettingKey)) {
-                ldapGroupSettingIterator.remove();
-            }
-        }
-    }
-
-    private LdapGroupSetting getLdapGroupSettings(String name) {
-        for (LdapGroupSetting ldapGroupSetting : ldapGroupSettings) {
-            if (ldapGroupSetting.getName().equals(name)) {
-                return ldapGroupSetting;
-            }
-        }
-        return null;
-    }
-
-    public LdapSetting removeLdap(String ldapKey) {
-        LdapSetting ldapSetting = getLdapSettings(ldapKey);
-        if (ldapSetting == null) {
-            return null;
-        }
-
-        ldapSettings.remove(ldapSetting);
-        removeLdapGroupsWithLdapSettingsKey(ldapKey);
-
-        return ldapSetting;
-    }
-
-    public LdapSetting getLdapSettings(String ldapKey) {
-        for (LdapSetting ldap : ldapSettings) {
-            if (ldap.getKey().equals(ldapKey)) {
-                return ldap;
-            }
-        }
-        return null;
-    }
-
-    public boolean isLdapExists(String key) {
-        return getLdapSettings(key) != null;
-    }
-
-    public List<LdapSetting> getEnabledLdapSettings() {
-        List<LdapSetting> result = Lists.newArrayList();
-        for (LdapSetting ldap : ldapSettings) {
-            if (ldap.isEnabled()) {
-                result.add(ldap);
-            }
-        }
-        return result;
-    }
-
-    public List<LdapGroupSetting> getEnabledLdapGroupSettings() {
-        List<LdapGroupSetting> result = Lists.newArrayList();
-        for (LdapGroupSetting groupSetting : ldapGroupSettings) {
-            if (groupSetting.isEnabled()) {
-                result.add(groupSetting);
-            }
-        }
-        return result;
-    }
-
-    public boolean isLdapEnabled() {
-        for (LdapSetting ldapSetting : ldapSettings) {
-            if (ldapSetting.isEnabled()) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Nonnull
-    public PasswordSettings getPasswordSettings() {
-        return passwordSettings;
-    }
-
-    public void setPasswordSettings(PasswordSettings passwordSettings) {
-        this.passwordSettings = passwordSettings;
-    }
-
-    public HttpSsoSettings getHttpSsoSettings() {
-        return httpSsoSettings;
-    }
-
-    public void setHttpSsoSettings(HttpSsoSettings httpSsoSettings) {
-        this.httpSsoSettings = httpSsoSettings;
-    }
-
-    public CrowdSettings getCrowdSettings() {
-        return crowdSettings;
-    }
-
-    public void setCrowdSettings(CrowdSettings crowdSettings) {
-        this.crowdSettings = crowdSettings;
-    }
-
-    public SamlSettings getSamlSettings() {
-        return samlSettings;
-    }
-
-    public void setSamlSettings(SamlSettings samlSettings) {
-        this.samlSettings = samlSettings;
-    }
-
-    public OAuthSettings getOauthSettings() {
-        return oauthSettings;
-    }
-
-    public void setOauthSettings(OAuthSettings oauthSettings) {
-        this.oauthSettings = oauthSettings;
-    }
-
-    public DebianSettings getDebianSettings() {
-        return debianSettings;
-    }
-
-    public void setDebianSettings(DebianSettings debianSettings) {
-        this.debianSettings = debianSettings;
-    }
-
-    public UserLockPolicy getUserLockPolicy() {
-        return userLockPolicy;
-    }
-
-    public void setUserLockPolicy(UserLockPolicy userLockPolicy) {
-        this.userLockPolicy = userLockPolicy;
-    }
-
-    public SshServerSettings getSshServerSettings() {
-        return sshServerSettings;
-    }
-
-    public void setSshServerSettings(SshServerSettings sshServerSettings) {
-        this.sshServerSettings = sshServerSettings;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        SecurityDescriptor that = (SecurityDescriptor) o;
-
-        if (anonAccessEnabled != that.anonAccessEnabled) {
-            return false;
-        }
-        if (anonAccessToBuildInfosDisabled != that.anonAccessToBuildInfosDisabled) {
-            return false;
-        }
-        if (hideUnauthorizedResources != that.hideUnauthorizedResources) {
-            return false;
-        }
-        if (crowdSettings != null ? !crowdSettings.equals(that.crowdSettings) : that.crowdSettings != null) {
-            return false;
-        }
-        if (httpSsoSettings != null ? !httpSsoSettings.equals(that.httpSsoSettings) : that.httpSsoSettings != null) {
-            return false;
-        }
-        if (!equalLdapGroupLists(ldapGroupSettings, that.ldapGroupSettings)) {
-            return false;
-        }
-        if (!equalLdapLists(ldapSettings, that.ldapSettings)) {
-            return false;
-        }
-        if (passwordSettings != null ? !passwordSettings.equals(that.passwordSettings) :
-                that.passwordSettings != null) {
-            return false;
-        }
-        if (samlSettings != null ? !samlSettings.equals(that.samlSettings) : that.samlSettings != null) {
-            return false;
-        }
-        if (debianSettings != null ? !debianSettings.equals(that.debianSettings) : that.debianSettings != null) {
-            return false;
-        }
-        if (userLockPolicy != null ? !userLockPolicy.equals(that.userLockPolicy) : that.userLockPolicy != null) {
-            return false;
-        }
-        if (sshServerSettings != null ? !sshServerSettings.equals(that.sshServerSettings) : that.sshServerSettings != null) {
-            return false;
-        }
-        return oauthSettings != null ? oauthSettings.equals(that.oauthSettings) : that.oauthSettings == null;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = (anonAccessEnabled ? 1 : 0);
-        result = 31 * result + (anonAccessToBuildInfosDisabled ? 1 : 0);
-        result = 31 * result + (hideUnauthorizedResources ? 1 : 0);
-        result = 31 * result + (ldapSettings != null ? ldapSettings.hashCode() : 0);
-        result = 31 * result + (ldapGroupSettings != null ? ldapGroupSettings.hashCode() : 0);
-        result = 31 * result + (passwordSettings != null ? passwordSettings.hashCode() : 0);
-        result = 31 * result + (httpSsoSettings != null ? httpSsoSettings.hashCode() : 0);
-        result = 31 * result + (crowdSettings != null ? crowdSettings.hashCode() : 0);
-        result = 31 * result + (samlSettings != null ? samlSettings.hashCode() : 0);
-        result = 31 * result + (debianSettings != null ? debianSettings.hashCode() : 0);
-        result = 31 * result + (userLockPolicy != null ? userLockPolicy.hashCode() : 0);
-        result = 31 * result + (sshServerSettings != null ? sshServerSettings.hashCode() : 0);
-        result = 31 * result + (oauthSettings != null ? oauthSettings.hashCode() : 0);
-        return result;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/security/UserLockPolicy.java b/base/config/src/main/java/org/artifactory/descriptor/security/UserLockPolicy.java
deleted file mode 100644
index f08a48d..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/security/UserLockPolicy.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.descriptor.security;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlType;
-
-import javax.xml.bind.annotation.XmlElement;
-
-/**
- * User lock configuration
- *
- * @author Michael Pasternak
- */
- at XmlType(name = "UserLockPolicyType", namespace = Descriptor.NS)
-public class UserLockPolicy implements Descriptor {
-
-    @XmlElement(defaultValue = "false", required = false)
-    private boolean enabled = false;
-
-    @XmlElement(defaultValue = "5", required = false)
-    private int loginAttempts = 5;
-
-    public boolean isEnabled() {
-        return enabled;
-    }
-
-    public int getLoginAttempts() {
-        return loginAttempts;
-    }
-
-    public void setEnabled(boolean enabled) {
-        this.enabled = enabled;
-    }
-
-    public void setLoginAttempts(int loginAttempts) {
-        this.loginAttempts = loginAttempts;
-    }
-
-    @Override
-    public boolean equals(Object other) {
-
-        if (other == null || getClass() != other.getClass()) {
-            return false;
-        }
-
-        if (this == other) {
-            return true;
-        }
-
-        UserLockPolicy that = (UserLockPolicy) other;
-
-        if (this.isEnabled() != that.isEnabled()) {
-            return false;
-        }
-
-        if (this.getLoginAttempts() != that.getLoginAttempts()) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = (enabled ? 1 : 0);
-        result = 17 * result + loginAttempts;
-        return result;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/security/debian/DebianSettings.java b/base/config/src/main/java/org/artifactory/descriptor/security/debian/DebianSettings.java
deleted file mode 100644
index 8ad22be..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/security/debian/DebianSettings.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.security.debian;
-
-/**
- * @author Gidi Shabat
- */
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlType;
-
- at XmlType(name = "DebianSettingsType",
-        propOrder = {"passphrase"},
-        namespace = Descriptor.NS)
-public class DebianSettings implements Descriptor {
-
-    private String passphrase;
-
-    public String getPassphrase() {
-        return passphrase;
-    }
-
-    public void setPassphrase(String test) {
-        this.passphrase = test;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        DebianSettings that = (DebianSettings) o;
-
-        if (passphrase != null ? !passphrase.equals(that.passphrase) : that.passphrase != null) {
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = passphrase != null ? passphrase.hashCode() : 0;
-        return result;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/security/debian/package-info.java b/base/config/src/main/java/org/artifactory/descriptor/security/debian/package-info.java
deleted file mode 100644
index 3acc8f5..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/security/debian/package-info.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
- at XmlSchema(namespace = Descriptor.NS,
-        elementFormDefault = XmlNsForm.QUALIFIED)
- at XmlAccessorType(XmlAccessType.FIELD) package org.artifactory.descriptor.security.debian;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlNsForm;
-import javax.xml.bind.annotation.XmlSchema;
diff --git a/base/config/src/main/java/org/artifactory/descriptor/security/ldap/LdapSetting.java b/base/config/src/main/java/org/artifactory/descriptor/security/ldap/LdapSetting.java
deleted file mode 100644
index d352ec2..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/security/ldap/LdapSetting.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.security.ldap;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlID;
-import javax.xml.bind.annotation.XmlType;
-
- at XmlType(name = "LdapSettingType",
-        propOrder = {"key", "enabled", "ldapUrl", "userDnPattern", "search", "autoCreateUser", "emailAttribute"},
-        namespace = Descriptor.NS)
-public class LdapSetting implements Descriptor {
-
-    @XmlID
-    @XmlElement(required = true)
-    private String key;
-
-    @XmlElement(defaultValue = "true")
-    private boolean enabled = true;
-
-    private String ldapUrl;
-
-    private String userDnPattern;
-
-    private SearchPattern search;
-
-    @XmlElement(defaultValue = "true")
-    private boolean autoCreateUser = true;
-
-    @XmlElement(defaultValue = "mail")
-    private String emailAttribute = "mail";
-
-    public LdapSetting() {
-    }
-
-    public LdapSetting(LdapSetting ldapSetting) {
-        this.key = ldapSetting.key;
-        this.enabled = ldapSetting.enabled;
-        this.ldapUrl = ldapSetting.ldapUrl;
-        this.userDnPattern = ldapSetting.userDnPattern;
-        if (ldapSetting.search != null) {
-            this.search = new SearchPattern(ldapSetting.search);
-        }
-        this.autoCreateUser = ldapSetting.autoCreateUser;
-        this.emailAttribute = ldapSetting.emailAttribute;
-    }
-
-    public String getKey() {
-        return key;
-    }
-
-    public void setKey(String key) {
-        this.key = key;
-    }
-
-    public boolean isEnabled() {
-        return enabled;
-    }
-
-    public void setEnabled(boolean enabled) {
-        this.enabled = enabled;
-    }
-
-    public String getLdapUrl() {
-        return ldapUrl;
-    }
-
-    public void setLdapUrl(String ldapUrl) {
-        this.ldapUrl = transformUrlProtocol(ldapUrl);
-    }
-
-    public String getUserDnPattern() {
-        return userDnPattern;
-    }
-
-    public void setUserDnPattern(String userDnPattern) {
-        this.userDnPattern = userDnPattern;
-    }
-
-    public SearchPattern getSearch() {
-        return search;
-    }
-
-    public void setSearch(SearchPattern search) {
-        this.search = search;
-    }
-
-    public boolean isAutoCreateUser() {
-        return autoCreateUser;
-    }
-
-    public void setAutoCreateUser(boolean autoCreateUser) {
-        this.autoCreateUser = autoCreateUser;
-    }
-
-    public String getEmailAttribute() {
-        return emailAttribute;
-    }
-
-    public void setEmailAttribute(String emailAttribute) {
-        this.emailAttribute = emailAttribute;
-    }
-
-    public void duplicate(LdapSetting ldapSetting) {
-        this.key = ldapSetting.key;
-        this.enabled = ldapSetting.enabled;
-        this.ldapUrl = ldapSetting.ldapUrl;
-        this.userDnPattern = ldapSetting.userDnPattern;
-        if (ldapSetting.search != null) {
-            if (search != null) {
-                this.search.duplicate(ldapSetting.search);
-            } else {
-                this.search = new SearchPattern(ldapSetting.search);
-            }
-        }
-        this.autoCreateUser = ldapSetting.autoCreateUser;
-        this.emailAttribute = ldapSetting.emailAttribute;
-    }
-
-    public boolean identicalConfiguration(LdapSetting that) {
-        if (this == that) {
-            return true;
-        }
-        if (that == null) {
-            return false;
-        }
-        if (autoCreateUser != that.autoCreateUser) {
-            return false;
-        }
-        if (enabled != that.enabled) {
-            return false;
-        }
-        if (emailAttribute != null ? !emailAttribute.equals(that.emailAttribute) : that.emailAttribute != null) {
-            return false;
-        }
-        if (!key.equals(that.key)) {
-            return false;
-        }
-        if (ldapUrl != null ? !ldapUrl.equals(that.ldapUrl) : that.ldapUrl != null) {
-            return false;
-        }
-        if (search != null ? !search.equals(that.search) : that.search != null) {
-            return false;
-        }
-        if (userDnPattern != null ? !userDnPattern.equals(that.userDnPattern) : that.userDnPattern != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof LdapSetting)) {
-            return false;
-        }
-
-        LdapSetting setting = (LdapSetting) o;
-
-        if (key == null || !key.equals(setting.key)) {
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        if (key == null) {
-            return super.hashCode();
-        }
-        return key.hashCode();
-    }
-
-    /**
-     * Validates the LDAP URL by assuring that the protocol specification is in lower-case letters
-     * (http://issues.jfrog.org/jira/browse/RTFACT-2036)
-     *
-     * @param url URL to validate
-     * @return Validated URL
-     */
-    private String transformUrlProtocol(String url) {
-        if ((url == null) || (url.length() == 0) || (!url.contains(":"))) {
-            return url;
-        }
-        StringBuilder builder = new StringBuilder();
-
-        String[] splitUrl = url.split(":");
-        splitUrl[0] = splitUrl[0].toLowerCase();
-
-        for (int i = 0; i < splitUrl.length; i++) {
-            builder.append(splitUrl[i]);
-            if (i < (splitUrl.length - 1)) {
-                builder.append(":");
-            }
-        }
-
-        return builder.toString();
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/security/ldap/SearchPattern.java b/base/config/src/main/java/org/artifactory/descriptor/security/ldap/SearchPattern.java
deleted file mode 100644
index eb35ecc..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/security/ldap/SearchPattern.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.security.ldap;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.annotation.Nonnull;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * @author Yossi Shaul
- */
- at XmlType(name = "SearchType",
-        propOrder = {"searchFilter", "searchBase", "searchSubTree", "managerDn", "managerPassword"},
-        namespace = Descriptor.NS)
-public class SearchPattern implements Descriptor {
-
-    private String searchFilter;
-    private String searchBase;
-
-    @XmlElement(defaultValue = "true")
-    private boolean searchSubTree = true;
-
-    private String managerDn;
-    private String managerPassword;
-
-    public SearchPattern() {
-    }
-
-    public SearchPattern(@Nonnull SearchPattern searchPattern) {
-        this.searchFilter = searchPattern.searchFilter;
-        this.searchBase = searchPattern.searchBase;
-        this.searchSubTree = searchPattern.searchSubTree;
-        this.managerDn = searchPattern.managerDn;
-        this.managerPassword = searchPattern.managerPassword;
-    }
-
-    public String getSearchFilter() {
-        return searchFilter;
-    }
-
-    public void setSearchFilter(String searchFilter) {
-        this.searchFilter = searchFilter;
-    }
-
-    public String getSearchBase() {
-        return searchBase;
-    }
-
-    public void setSearchBase(String searchBase) {
-        this.searchBase = searchBase;
-    }
-
-    public boolean isSearchSubTree() {
-        return searchSubTree;
-    }
-
-    public void setSearchSubTree(boolean searchSubTree) {
-        this.searchSubTree = searchSubTree;
-    }
-
-    public String getManagerDn() {
-        return managerDn;
-    }
-
-    public void setManagerDn(String managerDn) {
-        this.managerDn = managerDn;
-    }
-
-    public String getManagerPassword() {
-        return managerPassword;
-    }
-
-    public void setManagerPassword(String managerPassword) {
-        this.managerPassword = managerPassword;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        SearchPattern that = (SearchPattern) o;
-
-        if (searchSubTree != that.searchSubTree) {
-            return false;
-        }
-        if (managerDn != null ? !managerDn.equals(that.managerDn) : that.managerDn != null) {
-            return false;
-        }
-        if (managerPassword != null ? !managerPassword.equals(that.managerPassword) : that.managerPassword != null) {
-            return false;
-        }
-        if (searchBase != null ? !searchBase.equals(that.searchBase) : that.searchBase != null) {
-            return false;
-        }
-        if (searchFilter != null ? !searchFilter.equals(that.searchFilter) : that.searchFilter != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = searchFilter != null ? searchFilter.hashCode() : 0;
-        result = 31 * result + (searchBase != null ? searchBase.hashCode() : 0);
-        result = 31 * result + (searchSubTree ? 1 : 0);
-        result = 31 * result + (managerDn != null ? managerDn.hashCode() : 0);
-        result = 31 * result + (managerPassword != null ? managerPassword.hashCode() : 0);
-        return result;
-    }
-
-    public void duplicate(SearchPattern searchPattern) {
-        this.searchFilter = searchPattern.searchFilter;
-        this.searchBase = searchPattern.searchBase;
-        this.searchSubTree = searchPattern.searchSubTree;
-        this.managerDn = searchPattern.managerDn;
-        this.managerPassword = searchPattern.managerPassword;
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/security/ldap/group/LdapGroupPopulatorStrategies.java b/base/config/src/main/java/org/artifactory/descriptor/security/ldap/group/LdapGroupPopulatorStrategies.java
deleted file mode 100644
index 39b2441..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/security/ldap/group/LdapGroupPopulatorStrategies.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.security.ldap.group;
-
-import javax.xml.bind.annotation.XmlEnum;
-import javax.xml.bind.annotation.XmlEnumValue;
-
-/**
- * The Different LDAP strategies to populate the groups
- *
- * @author Tomer Cohen
- */
- at XmlEnum(value = String.class)
-public enum LdapGroupPopulatorStrategies {
-    @XmlEnumValue("HIERARCHICAL")HIERARCHICAL("DN hierarchy"),
-    @XmlEnumValue("STATIC")STATIC("Group contains members"),
-    @XmlEnumValue("DYNAMIC")DYNAMIC("Members contain groups");
-
-    private String description;
-
-    LdapGroupPopulatorStrategies(String description) {
-        this.description = description;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/security/ldap/group/LdapGroupSetting.java b/base/config/src/main/java/org/artifactory/descriptor/security/ldap/group/LdapGroupSetting.java
deleted file mode 100644
index 8ba931a..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/security/ldap/group/LdapGroupSetting.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.security.ldap.group;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * The descriptor which represents the LDAP group settings for integration between Artifactory and the specified LDAP
- * group.
- *
- * @author Tomer Cohen
- */
- at XmlType(name = "LdapGroupSettingType",
-        propOrder = {"name", "groupBaseDn", "groupNameAttribute", "groupMemberAttribute", "subTree", "filter",
-                "descriptionAttribute", "strategy", "enabledLdap"}, namespace = Descriptor.NS)
-public class LdapGroupSetting implements Descriptor {
-
-    private String name;
-
-    private String groupBaseDn = "";
-
-    private String groupNameAttribute = "cn";
-
-    private String groupMemberAttribute;
-
-    private boolean subTree;
-
-    private String filter;
-
-    private String descriptionAttribute;
-
-    /**
-     * The key of enabled LDAP server settings
-     */
-    private String enabledLdap = "";
-
-    @XmlElement(defaultValue = "STATIC", required = false)
-    private LdapGroupPopulatorStrategies strategy = LdapGroupPopulatorStrategies.STATIC;
-
-    public LdapGroupSetting() {
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getGroupBaseDn() {
-        return groupBaseDn == null ? "" : groupBaseDn;
-    }
-
-    public void setGroupBaseDn(String groupBaseDn) {
-        this.groupBaseDn = groupBaseDn;
-    }
-
-    public String getGroupNameAttribute() {
-        return groupNameAttribute;
-    }
-
-    public String getFilter() {
-        return filter;
-    }
-
-    public void setFilter(String filter) {
-        this.filter = filter;
-    }
-
-    public void setGroupNameAttribute(String groupNameAttribute) {
-        this.groupNameAttribute = groupNameAttribute;
-    }
-
-    public String getGroupMemberAttribute() {
-        return groupMemberAttribute;
-    }
-
-    public void setGroupMemberAttribute(String groupMemberAttribute) {
-        this.groupMemberAttribute = groupMemberAttribute;
-    }
-
-    public boolean isSubTree() {
-        return subTree;
-    }
-
-    public void setSubTree(boolean subTree) {
-        this.subTree = subTree;
-    }
-
-    public String getDescriptionAttribute() {
-        return descriptionAttribute;
-    }
-
-    public void setDescriptionAttribute(String descriptionAttribute) {
-        this.descriptionAttribute = descriptionAttribute;
-    }
-
-    public LdapGroupPopulatorStrategies getStrategy() {
-        return strategy;
-    }
-
-    public void setStrategy(LdapGroupPopulatorStrategies strategy) {
-        this.strategy = strategy;
-    }
-
-    public boolean isEnabled() {
-        return StringUtils.isNotBlank(enabledLdap);
-    }
-
-
-    public String getEnabledLdap() {
-        return enabledLdap;
-    }
-
-    public void setEnabledLdap(String enabledLdap) {
-        this.enabledLdap = enabledLdap;
-    }
-
-    public boolean identicalConfiguration(LdapGroupSetting that) {
-        if (this == that) {
-            return true;
-        }
-        if (that == null) {
-            return false;
-        }
-        if (subTree != that.subTree) {
-            return false;
-        }
-        if (descriptionAttribute != null ? !descriptionAttribute.equals(that.descriptionAttribute) :
-                that.descriptionAttribute != null) {
-            return false;
-        }
-        if (enabledLdap != null ? !enabledLdap.equals(that.enabledLdap) : that.enabledLdap != null) {
-            return false;
-        }
-        if (filter != null ? !filter.equals(that.filter) : that.filter != null) {
-            return false;
-        }
-        if (groupBaseDn != null ? !groupBaseDn.equals(that.groupBaseDn) : that.groupBaseDn != null) {
-            return false;
-        }
-        if (groupMemberAttribute != null ? !groupMemberAttribute.equals(that.groupMemberAttribute) :
-                that.groupMemberAttribute != null) {
-            return false;
-        }
-        if (groupNameAttribute != null ? !groupNameAttribute.equals(that.groupNameAttribute) :
-                that.groupNameAttribute != null) {
-            return false;
-        }
-        if (name != null ? !name.equals(that.name) : that.name != null) {
-            return false;
-        }
-        if (strategy != that.strategy) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        LdapGroupSetting that = (LdapGroupSetting) o;
-
-        return name.equals(that.name);
-
-    }
-
-    @Override
-    public int hashCode() {
-        return name.hashCode();
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/security/ldap/group/package-info.java b/base/config/src/main/java/org/artifactory/descriptor/security/ldap/group/package-info.java
deleted file mode 100644
index fe94cb8..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/security/ldap/group/package-info.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
- at XmlSchema(namespace = Descriptor.NS,
-        elementFormDefault = XmlNsForm.QUALIFIED)
- at XmlAccessorType(XmlAccessType.FIELD) package org.artifactory.descriptor.security.ldap.group;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlNsForm;
-import javax.xml.bind.annotation.XmlSchema;
diff --git a/base/config/src/main/java/org/artifactory/descriptor/security/ldap/package-info.java b/base/config/src/main/java/org/artifactory/descriptor/security/ldap/package-info.java
deleted file mode 100644
index 31a489c..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/security/ldap/package-info.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
- at XmlSchema(namespace = Descriptor.NS,
-        elementFormDefault = XmlNsForm.QUALIFIED)
- at XmlAccessorType(XmlAccessType.FIELD) package org.artifactory.descriptor.security.ldap;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlNsForm;
-import javax.xml.bind.annotation.XmlSchema;
diff --git a/base/config/src/main/java/org/artifactory/descriptor/security/oauth/OAuthProviderSettings.java b/base/config/src/main/java/org/artifactory/descriptor/security/oauth/OAuthProviderSettings.java
deleted file mode 100644
index 9137511..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/security/oauth/OAuthProviderSettings.java
+++ /dev/null
@@ -1,139 +0,0 @@
-package org.artifactory.descriptor.security.oauth;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * @author Gidi Shabat
- */
- at XmlType(name = "oauthProvidersSettingsType",
-        propOrder = {"name","enabled","providerType","id","secret","apiUrl","authUrl","tokenUrl","basicUrl","domain"},
-        namespace = Descriptor.NS)
-public class OAuthProviderSettings implements Descriptor {
-    private String name;
-    private Boolean enabled = false;
-    private String providerType;
-    private String id;
-    private String secret;
-    private String apiUrl;
-    private String authUrl;
-    private String tokenUrl;
-    private String basicUrl;
-    private String domain;
-
-    public void setEnabled(Boolean enabled) {
-        this.enabled = enabled;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public Boolean getEnabled() {
-        return enabled;
-    }
-
-    public String getProviderType() {
-        return providerType;
-    }
-
-    public void setProviderType(String providerType) {
-        this.providerType = providerType;
-    }
-
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public String getSecret() {
-        return secret;
-    }
-
-    public void setSecret(String secret) {
-        this.secret = secret;
-    }
-
-    public String getApiUrl() {
-        return apiUrl;
-    }
-
-    public void setApiUrl(String apiUrl) {
-        this.apiUrl = apiUrl;
-    }
-
-    public String getAuthUrl() {
-        return authUrl;
-    }
-
-    public void setAuthUrl(String authUrl) {
-        this.authUrl = authUrl;
-    }
-
-    public String getTokenUrl() {
-        return tokenUrl;
-    }
-
-    public void setTokenUrl(String tokenUrl) {
-        this.tokenUrl = tokenUrl;
-    }
-
-    public String getBasicUrl() {
-        return basicUrl;
-    }
-
-    public void setBasicUrl(String basicUrl) {
-        this.basicUrl = basicUrl;
-    }
-
-    public String getDomain() {
-        return domain;
-    }
-
-    public void setDomain(String domain) {
-        this.domain = domain;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof OAuthProviderSettings)) return false;
-
-        OAuthProviderSettings that = (OAuthProviderSettings) o;
-
-        if (getName() != null ? !getName().equals(that.getName()) : that.getName() != null) return false;
-        if (getEnabled() != null ? !getEnabled().equals(that.getEnabled()) : that.getEnabled() != null) return false;
-        if (getProviderType() != null ? !getProviderType().equals(that.getProviderType()) : that.getProviderType() != null) return false;
-        if (getId() != null ? !getId().equals(that.getId()) : that.getId() != null) return false;
-        if (getSecret() != null ? !getSecret().equals(that.getSecret()) : that.getSecret() != null) return false;
-        if (getApiUrl() != null ? !getApiUrl().equals(that.getApiUrl()) : that.getApiUrl() != null) return false;
-        if (getAuthUrl() != null ? !getAuthUrl().equals(that.getAuthUrl()) : that.getAuthUrl() != null) return false;
-        if (getTokenUrl() != null ? !getTokenUrl().equals(that.getTokenUrl()) : that.getTokenUrl() != null) return false;
-        if (getBasicUrl() != null ? !getBasicUrl().equals(that.getBasicUrl()) : that.getBasicUrl() != null) return false;
-        return getDomain() != null ? getDomain().equals(that.getDomain()) : that.getDomain() == null;
-
-    }
-
-    @Override
-    public int hashCode() {
-        int result = getName() != null ? getName().hashCode() : 0;
-        result = 31 * result + (getEnabled() != null ? getEnabled().hashCode() : 0);
-        result = 31 * result + (getProviderType() != null ? getProviderType().hashCode() : 0);
-        result = 31 * result + (getId() != null ? getId().hashCode() : 0);
-        result = 31 * result + (getSecret() != null ? getSecret().hashCode() : 0);
-        result = 31 * result + (getApiUrl() != null ? getApiUrl().hashCode() : 0);
-        result = 31 * result + (getAuthUrl() != null ? getAuthUrl().hashCode() : 0);
-        result = 31 * result + (getTokenUrl() != null ? getTokenUrl().hashCode() : 0);
-        result = 31 * result + (getBasicUrl() != null ? getBasicUrl().hashCode() : 0);
-        result = 31 * result + (getDomain() != null ? getDomain().hashCode() : 0);
-        return result;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/security/oauth/OAuthSettings.java b/base/config/src/main/java/org/artifactory/descriptor/security/oauth/OAuthSettings.java
deleted file mode 100644
index 77a37b8..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/security/oauth/OAuthSettings.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package org.artifactory.descriptor.security.oauth;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlType;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Gidi Shabat
- */
- at XmlType(name = "oauthSettingsType",
-        propOrder = {"enableIntegration", "allowUserToAccessProfile", "persistUsers", "defaultNpm", "oauthProvidersSettings"},
-        namespace = Descriptor.NS)
-public class OAuthSettings implements Descriptor {
-
-    private Boolean enableIntegration = false;
-    @XmlElement(defaultValue = "false")
-    private boolean allowUserToAccessProfile = false;
-    private Boolean persistUsers = false;
-    private String defaultNpm;
-
-    @XmlElementWrapper(name = "oauthProvidersSettings")
-    private List<OAuthProviderSettings> oauthProvidersSettings = Lists.newArrayList();
-
-
-    public Boolean getEnableIntegration() {
-        return enableIntegration;
-    }
-
-    public void setEnableIntegration(Boolean enableIntegration) {
-        this.enableIntegration = enableIntegration;
-    }
-
-
-    public List<OAuthProviderSettings> getOauthProvidersSettings() {
-        return oauthProvidersSettings;
-    }
-
-    public void setOauthProvidersSettings(List<OAuthProviderSettings> oauthProvidersSettings) {
-        this.oauthProvidersSettings = oauthProvidersSettings;
-    }
-
-    public String getDefaultNpm() {
-        return defaultNpm;
-    }
-
-    public void setDefaultNpm(String defaultNpm) {
-        this.defaultNpm = defaultNpm;
-    }
-
-    public Boolean getPersistUsers() {
-        return persistUsers;
-    }
-
-    public void setPersistUsers(Boolean persistUsers) {
-        this.persistUsers = persistUsers;
-    }
-
-    public boolean isAllowUserToAccessProfile() {
-        return allowUserToAccessProfile;
-    }
-
-    public void setAllowUserToAccessProfile(boolean allowUserToAccessProfile) {
-        this.allowUserToAccessProfile = allowUserToAccessProfile;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof OAuthSettings)) return false;
-
-        OAuthSettings that = (OAuthSettings) o;
-
-        if (isAllowUserToAccessProfile() != that.isAllowUserToAccessProfile()) return false;
-        if (getEnableIntegration() != null ? !getEnableIntegration().equals(that.getEnableIntegration()) : that.getEnableIntegration() != null) return false;
-        if (getPersistUsers() != null ? !getPersistUsers().equals(that.getPersistUsers()) : that.getPersistUsers() != null) return false;
-        if (getDefaultNpm() != null ? !getDefaultNpm().equals(that.getDefaultNpm()) : that.getDefaultNpm() != null) return false;
-        return oauthProviderSettingsIdentical(this.getOauthProvidersSettings(), that.getOauthProvidersSettings());
-
-    }
-
-    @Override
-    public int hashCode() {
-        int result = getEnableIntegration() != null ? getEnableIntegration().hashCode() : 0;
-        result = 31 * result + (isAllowUserToAccessProfile() ? 1 : 0);
-        result = 31 * result + (getPersistUsers() != null ? getPersistUsers().hashCode() : 0);
-        result = 31 * result + (getDefaultNpm() != null ? getDefaultNpm().hashCode() : 0);
-        result = 31 * result + (getOauthProvidersSettings() != null ? getOauthProvidersSettings().hashCode() : 0);
-        return result;
-    }
-
-    private boolean oauthProviderSettingsIdentical(List<OAuthProviderSettings> l1, List<OAuthProviderSettings> l2) {
-        if(l1 == null && l2 == null || (l1 == l2)) {
-            return true;
-        } else if (l1 == null || l2 == null) {
-            return false;
-        } else if (l1.size() != l2.size()) {
-            return false;
-        }
-        Set<OAuthProviderSettings> l1Set = Sets.newHashSet(l1);
-        return l2.stream()
-                .filter(providerSetting -> !l1Set.contains(providerSetting))
-                .count() != 0;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/security/oauth/package-info.java b/base/config/src/main/java/org/artifactory/descriptor/security/oauth/package-info.java
deleted file mode 100644
index 7496032..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/security/oauth/package-info.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
- at XmlSchema(namespace = Descriptor.NS,
-        elementFormDefault = XmlNsForm.QUALIFIED,
-        location = Descriptor.LOCATION)
- at XmlAccessorType(XmlAccessType.FIELD) package org.artifactory.descriptor.security.oauth;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlNsForm;
-import javax.xml.bind.annotation.XmlSchema;
diff --git a/base/config/src/main/java/org/artifactory/descriptor/security/package-info.java b/base/config/src/main/java/org/artifactory/descriptor/security/package-info.java
deleted file mode 100644
index c738016..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/security/package-info.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
- at XmlSchema(namespace = Descriptor.NS,
-        elementFormDefault = XmlNsForm.QUALIFIED)
- at XmlAccessorType(XmlAccessType.FIELD) package org.artifactory.descriptor.security;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlNsForm;
-import javax.xml.bind.annotation.XmlSchema;
diff --git a/base/config/src/main/java/org/artifactory/descriptor/security/sshserver/SshServerSettings.java b/base/config/src/main/java/org/artifactory/descriptor/security/sshserver/SshServerSettings.java
deleted file mode 100644
index 8c60754..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/security/sshserver/SshServerSettings.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.security.sshserver;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * The SSH Server related settings
- *
- * @author Noam Y. Tenne
- */
- at XmlType(name = "SshServerSettingsType",
-        propOrder = {"enableSshServer", "sshServerPort"}, namespace = Descriptor.NS)
-public class SshServerSettings implements Descriptor {
-
-    @XmlElement(defaultValue = "false")
-    private boolean enableSshServer = false;
-
-    @XmlElement(defaultValue = "1339")
-    private int sshServerPort = 1339;
-
-    public boolean isEnableSshServer() {
-        return enableSshServer;
-    }
-
-    public void setEnableSshServer(boolean enableSshServer) {
-        this.enableSshServer = enableSshServer;
-    }
-
-    public int getSshServerPort() {
-        return sshServerPort;
-    }
-
-    public void setSshServerPort(int sshServerPort) {
-        this.sshServerPort = sshServerPort;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        SshServerSettings that = (SshServerSettings) o;
-
-        if (enableSshServer != that.enableSshServer) {
-            return false;
-        }
-        return sshServerPort == that.sshServerPort;
-
-    }
-
-    @Override
-    public int hashCode() {
-        int result = (enableSshServer ? 1 : 0);
-        result = 31 * result + sshServerPort;
-        return result;
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/security/sshserver/package-info.java b/base/config/src/main/java/org/artifactory/descriptor/security/sshserver/package-info.java
deleted file mode 100644
index ec6d46c..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/security/sshserver/package-info.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
- at XmlSchema(namespace = Descriptor.NS,
-        elementFormDefault = XmlNsForm.QUALIFIED)
- at XmlAccessorType(XmlAccessType.FIELD) package org.artifactory.descriptor.security.sshserver;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlNsForm;
-import javax.xml.bind.annotation.XmlSchema;
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/security/sso/CrowdSettings.java b/base/config/src/main/java/org/artifactory/descriptor/security/sso/CrowdSettings.java
deleted file mode 100644
index a8b0450..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/security/sso/CrowdSettings.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.security.sso;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * Crowd connection settings descriptor
- *
- * @author Noam Y. Tenne
- */
- at XmlType(name = "CrowdSettingsType", propOrder = {"enableIntegration", "serverUrl", "applicationName", "password",
-        "sessionValidationInterval", "useDefaultProxy", "noAutoUserCreation", "customCookieTokenKey", "directAuthentication"},
-        namespace = Descriptor.NS)
-public class CrowdSettings implements Descriptor {
-
-    @XmlElement(defaultValue = "false")
-    private boolean enableIntegration = false;
-
-    private String serverUrl;
-
-    private String applicationName;
-
-    private String password;
-
-    private long sessionValidationInterval;
-
-    @XmlElement(defaultValue = "false")
-    private boolean useDefaultProxy = false;
-
-    @XmlElement(defaultValue = "true")
-    private boolean noAutoUserCreation = true;
-
-    private String customCookieTokenKey;
-
-    @XmlElement(defaultValue = "false")
-    private boolean directAuthentication = false;
-
-    public boolean isEnableIntegration() {
-        return enableIntegration;
-    }
-
-    public void setEnableIntegration(boolean enableIntegration) {
-        this.enableIntegration = enableIntegration;
-    }
-
-    public String getServerUrl() {
-        return serverUrl;
-    }
-
-    public void setServerUrl(String serverUrl) {
-        this.serverUrl = serverUrl;
-    }
-
-    public String getApplicationName() {
-        return applicationName;
-    }
-
-    public void setApplicationName(String applicationName) {
-        this.applicationName = applicationName;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public void setPassword(String password) {
-        this.password = password;
-    }
-
-    public long getSessionValidationInterval() {
-        return sessionValidationInterval;
-    }
-
-    public void setSessionValidationInterval(long sessionValidationInterval) {
-        this.sessionValidationInterval = sessionValidationInterval;
-    }
-
-    public boolean isUseDefaultProxy() {
-        return useDefaultProxy;
-    }
-
-    public void setUseDefaultProxy(boolean useDefaultProxy) {
-        this.useDefaultProxy = useDefaultProxy;
-    }
-
-    public boolean isNoAutoUserCreation() {
-        return noAutoUserCreation;
-    }
-
-    public void setNoAutoUserCreation(boolean noAutoUserCreation) {
-        this.noAutoUserCreation = noAutoUserCreation;
-    }
-
-    public boolean isDirectAuthentication() {
-        return directAuthentication;
-    }
-
-    public void setDirectAuthentication(boolean directAuthentication) {
-        this.directAuthentication = directAuthentication;
-    }
-
-    /**
-     * @deprecated We are using a REST command against Crowd to get that information
-     */
-    public String getCustomCookieTokenKey() {
-        return customCookieTokenKey;
-    }
-
-    /**
-     * @deprecated We are using a REST command against Crowd to get that information
-     */
-    public void setCustomCookieTokenKey(String customCookieTokenKey) {
-        this.customCookieTokenKey = customCookieTokenKey;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof CrowdSettings)) {
-            return false;
-        }
-
-        CrowdSettings that = (CrowdSettings) o;
-
-        if (enableIntegration != that.enableIntegration) {
-            return false;
-        }
-        if (noAutoUserCreation != that.noAutoUserCreation) {
-            return false;
-        }
-        if (sessionValidationInterval != that.sessionValidationInterval) {
-            return false;
-        }
-        if (useDefaultProxy != that.useDefaultProxy) {
-            return false;
-        }
-        if (applicationName != null ? !applicationName.equals(that.applicationName) : that.applicationName != null) {
-            return false;
-        }
-        if (password != null ? !password.equals(that.password) : that.password != null) {
-            return false;
-        }
-        if (serverUrl != null ? !serverUrl.equals(that.serverUrl) : that.serverUrl != null) {
-            return false;
-        }
-        if (customCookieTokenKey != null ? !customCookieTokenKey.equals(that.customCookieTokenKey) :
-                that.customCookieTokenKey != null) {
-            return false;
-        }
-        if (directAuthentication != that.directAuthentication) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = (enableIntegration ? 1 : 0);
-        result = 31 * result + (serverUrl != null ? serverUrl.hashCode() : 0);
-        result = 31 * result + (applicationName != null ? applicationName.hashCode() : 0);
-        result = 31 * result + (password != null ? password.hashCode() : 0);
-        result = 31 * result + (int) (sessionValidationInterval ^ (sessionValidationInterval >>> 32));
-        result = 31 * result + (useDefaultProxy ? 1 : 0);
-        result = 31 * result + (noAutoUserCreation ? 1 : 0);
-        result = 31 * result + (customCookieTokenKey != null ? customCookieTokenKey.hashCode() : 0);
-        result = 31 * result + (directAuthentication ? 1 : 0);
-        return result;
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/security/sso/HttpSsoSettings.java b/base/config/src/main/java/org/artifactory/descriptor/security/sso/HttpSsoSettings.java
deleted file mode 100644
index 0b1494f..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/security/sso/HttpSsoSettings.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.security.sso;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * The HTTP SSO related settings
- *
- * @author Noam Y. Tenne
- */
- at XmlType(name = "HttpSsoSettingsType",
-        propOrder = {"httpSsoProxied", "noAutoUserCreation", "allowUserToAccessProfile", "remoteUserRequestVariable"}, namespace = Descriptor.NS)
-public class HttpSsoSettings implements Descriptor {
-
-    @XmlElement(defaultValue = "false")
-    private boolean httpSsoProxied = false;
-
-    @XmlElement(defaultValue = "false")
-    private boolean noAutoUserCreation = false;
-
-    @XmlElement(defaultValue = "false")
-    private boolean allowUserToAccessProfile = false;
-
-    @XmlElement(defaultValue = "REMOTE_USER")
-    private String remoteUserRequestVariable = "REMOTE_USER";
-
-    public boolean isHttpSsoProxied() {
-        return httpSsoProxied;
-    }
-
-    public void setHttpSsoProxied(boolean httpSsoProxied) {
-        this.httpSsoProxied = httpSsoProxied;
-    }
-
-    public boolean isNoAutoUserCreation() {
-        return noAutoUserCreation;
-    }
-
-    public void setNoAutoUserCreation(boolean noAutoUserCreation) {
-        this.noAutoUserCreation = noAutoUserCreation;
-    }
-
-    public String getRemoteUserRequestVariable() {
-        return remoteUserRequestVariable;
-    }
-
-    public void setRemoteUserRequestVariable(String remoteUserRequestVariable) {
-        this.remoteUserRequestVariable = remoteUserRequestVariable;
-    }
-
-    public boolean isAllowUserToAccessProfile() {
-        return allowUserToAccessProfile;
-    }
-
-    public void setAllowUserToAccessProfile(boolean allowUserToAccessProfile) {
-        this.allowUserToAccessProfile = allowUserToAccessProfile;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof HttpSsoSettings)) {
-            return false;
-        }
-
-        HttpSsoSettings settings = (HttpSsoSettings) o;
-
-        if (noAutoUserCreation != settings.noAutoUserCreation) {
-            return false;
-        }
-        if (httpSsoProxied != settings.httpSsoProxied) {
-            return false;
-        }
-        if (remoteUserRequestVariable != null ? !remoteUserRequestVariable.equals(settings.remoteUserRequestVariable) :
-                settings.remoteUserRequestVariable != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = (httpSsoProxied ? 1 : 0);
-        result = 31 * result + (noAutoUserCreation ? 1 : 0);
-        result = 31 * result + (remoteUserRequestVariable != null ? remoteUserRequestVariable.hashCode() : 0);
-        return result;
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/security/sso/SamlSettings.java b/base/config/src/main/java/org/artifactory/descriptor/security/sso/SamlSettings.java
deleted file mode 100644
index 580bcd1..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/security/sso/SamlSettings.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.security.sso;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * Configuration object for the SAML settings.
- *
- * @author Gidi Shabat
- */
- at XmlType(name = "SamlSettingsType",
-        propOrder = {"enableIntegration", "loginUrl", "logoutUrl", "certificate", "serviceProviderName",
-                "noAutoUserCreation", "allowUserToAccessProfile", "autoRedirect"}, namespace = Descriptor.NS)
-public class SamlSettings implements Descriptor {
-
-    @XmlElement(defaultValue = "false")
-    private boolean enableIntegration = false;
-
-    private String loginUrl;
-
-    private String logoutUrl;
-
-    private String certificate;
-
-    private String serviceProviderName;
-
-    @XmlElement(defaultValue = "true")
-    private Boolean noAutoUserCreation = true;
-
-    @XmlElement(defaultValue = "false")
-    private boolean allowUserToAccessProfile = false;
-
-    private boolean autoRedirect;
-
-    public boolean isEnableIntegration() {
-        return enableIntegration;
-    }
-
-    public void setEnableIntegration(boolean enableIntegration) {
-        this.enableIntegration = enableIntegration;
-    }
-
-    public String getLoginUrl() {
-        return loginUrl;
-    }
-
-    public void setLoginUrl(String loginUrl) {
-        this.loginUrl = loginUrl;
-    }
-
-    public String getLogoutUrl() {
-        return logoutUrl;
-    }
-
-    public void setLogoutUrl(String logoutUrl) {
-        this.logoutUrl = logoutUrl;
-    }
-
-    public String getServiceProviderName() {
-        return serviceProviderName;
-    }
-
-    public void setServiceProviderName(String serviceProviderName) {
-        this.serviceProviderName = serviceProviderName;
-    }
-
-    public Boolean getNoAutoUserCreation() {
-        return noAutoUserCreation;
-    }
-
-    public void setNoAutoUserCreation(Boolean noAutoUserCreation) {
-        this.noAutoUserCreation = noAutoUserCreation;
-    }
-
-    public String getCertificate() {
-        return certificate;
-    }
-
-    public void setCertificate(String certificate) {
-        this.certificate = certificate;
-    }
-
-    public boolean isAllowUserToAccessProfile() {
-        return allowUserToAccessProfile;
-    }
-
-    public void setAllowUserToAccessProfile(boolean allowUserToAccessProfile) {
-        this.allowUserToAccessProfile = allowUserToAccessProfile;
-    }
-
-    public boolean isAutoRedirect() {
-        return autoRedirect;
-    }
-
-    public void setAutoRedirect(boolean autoRedirect) {
-        this.autoRedirect = autoRedirect;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        SamlSettings that = (SamlSettings) o;
-
-        if (enableIntegration != that.enableIntegration) {
-            return false;
-        }
-        if (autoRedirect != that.autoRedirect) {
-            return false;
-        }
-        if (loginUrl != null ? !loginUrl.equals(that.loginUrl) : that.loginUrl != null) {
-            return false;
-        }
-        if (logoutUrl != null ? !logoutUrl.equals(that.logoutUrl) : that.logoutUrl != null) {
-            return false;
-        }
-        if (certificate != null ? !certificate.equals(that.certificate) : that.certificate != null) {
-            return false;
-        }
-        if (serviceProviderName != null ? !serviceProviderName.equals(that.serviceProviderName) :
-                that.serviceProviderName != null) {
-            return false;
-        }
-        if (noAutoUserCreation != null ? !noAutoUserCreation.equals(that.noAutoUserCreation) :
-                that.noAutoUserCreation != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = (enableIntegration ? 1 : 0);
-        result = 31 * result + (loginUrl != null ? loginUrl.hashCode() : 0);
-        result = 31 * result + (logoutUrl != null ? logoutUrl.hashCode() : 0);
-        result = 31 * result + (certificate != null ? certificate.hashCode() : 0);
-        result = 31 * result + (serviceProviderName != null ? serviceProviderName.hashCode() : 0);
-        result = 31 * result + (autoRedirect ? 1 : 0);
-        result = 31 * result + (noAutoUserCreation != null ? noAutoUserCreation.hashCode() : 0);
-        return result;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/security/sso/package-info.java b/base/config/src/main/java/org/artifactory/descriptor/security/sso/package-info.java
deleted file mode 100644
index 30a8c0f..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/security/sso/package-info.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
- at XmlSchema(namespace = Descriptor.NS,
-        elementFormDefault = XmlNsForm.QUALIFIED)
- at XmlAccessorType(XmlAccessType.FIELD) package org.artifactory.descriptor.security.sso;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlNsForm;
-import javax.xml.bind.annotation.XmlSchema;
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/descriptor/trashcan/TrashcanConfigDescriptor.java b/base/config/src/main/java/org/artifactory/descriptor/trashcan/TrashcanConfigDescriptor.java
deleted file mode 100644
index cbede6c..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/trashcan/TrashcanConfigDescriptor.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.trashcan;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlType;
-
-/**
- * Configuration type for the global trashcan repository
- *
- * @author Shay Yaakov
- */
- at XmlType(name = "TrashcanConfigType", propOrder = {"enabled", "allowPermDeletes", "retentionPeriodDays"},
-        namespace = Descriptor.NS)
-public class TrashcanConfigDescriptor implements Descriptor {
-
-    public static final int DEFAULT_RETENTION_PERIOD_DAYS = 14;
-
-    @XmlElement(defaultValue = "true")
-    private boolean enabled = true;
-
-    @XmlElement(defaultValue = "false")
-    private boolean allowPermDeletes = false;
-
-    @XmlElement(defaultValue = DEFAULT_RETENTION_PERIOD_DAYS + "")
-    private int retentionPeriodDays = DEFAULT_RETENTION_PERIOD_DAYS;
-
-    public boolean isEnabled() {
-        return enabled;
-    }
-
-    public void setEnabled(boolean enabled) {
-        this.enabled = enabled;
-    }
-
-    public boolean isAllowPermDeletes() {
-        return allowPermDeletes;
-    }
-
-    public void setAllowPermDeletes(boolean allowPermDeletes) {
-        this.allowPermDeletes = allowPermDeletes;
-    }
-
-    public int getRetentionPeriodDays() {
-        return retentionPeriodDays;
-    }
-
-    public void setRetentionPeriodDays(int retentionPeriodDays) {
-        this.retentionPeriodDays = retentionPeriodDays;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        TrashcanConfigDescriptor that = (TrashcanConfigDescriptor) o;
-
-        if (enabled != that.enabled) return false;
-        if (allowPermDeletes != that.allowPermDeletes) return false;
-        return retentionPeriodDays == that.retentionPeriodDays;
-
-    }
-
-    @Override
-    public int hashCode() {
-        int result = (enabled ? 1 : 0);
-        result = 31 * result + (allowPermDeletes ? 1 : 0);
-        result = 31 * result + retentionPeriodDays;
-        return result;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/descriptor/trashcan/package-info.java b/base/config/src/main/java/org/artifactory/descriptor/trashcan/package-info.java
deleted file mode 100644
index f29881b..0000000
--- a/base/config/src/main/java/org/artifactory/descriptor/trashcan/package-info.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
- at XmlSchema(namespace = Descriptor.NS, elementFormDefault = XmlNsForm.QUALIFIED)
- at XmlAccessorType(XmlAccessType.FIELD) package org.artifactory.descriptor.trashcan;
-
-import org.artifactory.descriptor.Descriptor;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlNsForm;
-import javax.xml.bind.annotation.XmlSchema;
diff --git a/base/config/src/main/java/org/artifactory/info/ArtifactoryPropInfo.java b/base/config/src/main/java/org/artifactory/info/ArtifactoryPropInfo.java
deleted file mode 100644
index 3258512..0000000
--- a/base/config/src/main/java/org/artifactory/info/ArtifactoryPropInfo.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.info;
-
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Properties;
-
-/**
- * An information group for all the artifactory properties
- *
- * @author Noam Tenne
- */
-public class ArtifactoryPropInfo extends BasePropInfoGroup {
-
-    /**
-     * Returns all the info objects from the current group
-     *
-     * @return InfoObject[] - Collection of info objects from current group
-     */
-    @Override
-    public InfoObject[] getInfo() {
-        //Make a copy of the artifactory properties
-        Properties propertiesCopy = ArtifactoryHome.get().getArtifactoryProperties().getPropertiesCopy();
-        ArrayList<InfoObject> infoList = new ArrayList<>();
-        ConstantValues[] constants = ConstantValues.values();
-
-        //Returns all the properties form ConstantsValue
-        for (ConstantValues constantsValue : constants) {
-            String value = constantsValue.getString();
-            if (value != null) {
-                InfoObject infoObject =
-                        new InfoObject(constantsValue.getPropertyName(), value);
-                infoList.add(infoObject);
-                //Remove duplicates from artifactoryProperties copy
-                propertiesCopy.remove(constantsValue.getPropertyName());
-            }
-        }
-
-        //Iterate over artifactoryProperties copy to get the rest of the properties that were not in ConstantsValue
-        Enumeration keys = propertiesCopy.keys();
-        while (keys.hasMoreElements()) {
-            String propertyName = (String) keys.nextElement();
-            InfoObject infoObject =
-                    new InfoObject(propertyName, propertiesCopy.getProperty(propertyName));
-            infoList.add(infoObject);
-        }
-        return infoList.toArray(new InfoObject[infoList.size()]);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/info/BasePropInfoGroup.java b/base/config/src/main/java/org/artifactory/info/BasePropInfoGroup.java
deleted file mode 100644
index 100ecb2..0000000
--- a/base/config/src/main/java/org/artifactory/info/BasePropInfoGroup.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.info;
-
-/**
- * The base class of all the information groups
- *
- * @author Noam Tenne
- */
-public class BasePropInfoGroup implements PropInfoGroup {
-
-    /**
-     * Returns a system property via the property name
-     *
-     * @param propName The property name
-     * @return String - The property value
-     */
-    public static String getSystemProperty(String propName) {
-        if ((propName == null) || ("".equals(propName))) {
-            throw new IllegalArgumentException("Property name cannot be empty or null");
-        }
-        return System.getProperty(propName);
-    }
-
-    /**
-     * Basic implementation of the getInfo method
-     *
-     * @return InfoObject[] - An empty info object array
-     */
-    @Override
-    public InfoObject[] getInfo() {
-        return new InfoObject[]{};
-    }
-
-    /**
-     * @return whether this info group should be displayed.
-     */
-    public boolean isInUse() {
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/info/ClassPathPropInfo.java b/base/config/src/main/java/org/artifactory/info/ClassPathPropInfo.java
deleted file mode 100644
index 12a1481..0000000
--- a/base/config/src/main/java/org/artifactory/info/ClassPathPropInfo.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.info;
-
-/**
- * An information group for all the java classpath properties
- *
- * @author Noam Tenne
- */
-public class ClassPathPropInfo extends SystemPropInfoGroup {
-
-    public ClassPathPropInfo() {
-        super("sun.boot.class.path",
-                "java.library.path",
-                "java.endorsed.dirs",
-                "java.ext.dirs",
-                "java.class.path");
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/info/HaPropInfo.java b/base/config/src/main/java/org/artifactory/info/HaPropInfo.java
deleted file mode 100644
index 0bbc0c8..0000000
--- a/base/config/src/main/java/org/artifactory/info/HaPropInfo.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.artifactory.info;
-
-import com.google.common.collect.Lists;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ha.HaNodeProperties;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-/**
- * @author Yoav Luft
- */
-public class HaPropInfo extends BasePropInfoGroup {
-    @Override
-    public boolean isInUse() {
-        return ArtifactoryHome.get().isHaConfigured();
-    }
-
-    @Override
-    public InfoObject[] getInfo() {
-        if (ArtifactoryHome.get().isHaConfigured()) {
-            HaNodeProperties haNodeProperties = ArtifactoryHome.get().getHaNodeProperties();
-            if (haNodeProperties != null) {
-                Properties nodeProps = haNodeProperties.getProperties();
-                List<InfoObject> infoObjects = Lists.newArrayList();
-                for (Map.Entry<Object, Object> prop : nodeProps.entrySet()) {
-                    InfoObject infoObject = new InfoObject(prop.getKey().toString(), prop.getValue().toString());
-                    infoObjects.add(infoObject);
-                }
-                return  infoObjects.toArray(new InfoObject[infoObjects.size()]);
-            }
-        }
-        // else
-        return new InfoObject[0];
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/info/HostPropInfo.java b/base/config/src/main/java/org/artifactory/info/HostPropInfo.java
deleted file mode 100644
index c7ddb46..0000000
--- a/base/config/src/main/java/org/artifactory/info/HostPropInfo.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.info;
-
-import com.google.common.collect.Maps;
-
-import java.lang.management.ManagementFactory;
-import java.lang.management.MemoryMXBean;
-import java.lang.management.MemoryUsage;
-import java.lang.management.OperatingSystemMXBean;
-import java.util.ArrayList;
-import java.util.Set;
-import java.util.TreeMap;
-
-/**
- * An information group for all the host properties
- *
- * @author Noam Tenne
- */
-public class HostPropInfo extends BasePropInfoGroup {
-
-    /**
-     * Property map
-     */
-    private TreeMap<String, String> propertyMap;
-    /**
-     * Operating system bean
-     */
-    private OperatingSystemMXBean systemBean;
-    /**
-     * Memory bean
-     */
-    private MemoryMXBean memoryBean;
-
-    /**
-     * Main constructor
-     */
-    public HostPropInfo() {
-        //Get operating system bean
-        systemBean = ManagementFactory.getOperatingSystemMXBean();
-        //Get memory bean
-        memoryBean = ManagementFactory.getMemoryMXBean();
-        setPropertyMap();
-    }
-
-    /**
-     * Sets the map with all the host property names and values
-     */
-    private void setPropertyMap() {
-        propertyMap = Maps.newTreeMap();
-        propertyMap.put("os.arch", systemBean.getArch());
-        propertyMap.put("os.name", systemBean.getName());
-        propertyMap.put("os.version", systemBean.getVersion());
-        propertyMap
-                .put("Available Processors", Integer.toString(systemBean.getAvailableProcessors()));
-        MemoryUsage heapMemoryUsage = memoryBean.getHeapMemoryUsage();
-        propertyMap
-                .put("Heap Memory Usage-Commited", Long.toString(heapMemoryUsage.getCommitted()));
-        propertyMap.put("Heap Memory Usage-Init", Long.toString(heapMemoryUsage.getInit()));
-        propertyMap.put("Heap Memory Usage-Max", Long.toString(heapMemoryUsage.getMax()));
-        propertyMap.put("Heap Memory Usage-Used", Long.toString(heapMemoryUsage.getUsed()));
-        MemoryUsage nonHeapMemoryUsage = memoryBean.getNonHeapMemoryUsage();
-        propertyMap.put("Non-Heap Memory Usage-Commited",
-                Long.toString(nonHeapMemoryUsage.getCommitted()));
-        propertyMap.put("Non-Heap Memory Usage-Init", Long.toString(nonHeapMemoryUsage.getInit()));
-        propertyMap.put("Non-Heap Memory Usage-Max", Long.toString(nonHeapMemoryUsage.getMax()));
-        propertyMap.put("Non-Heap Memory Usage-Used", Long.toString(nonHeapMemoryUsage.getUsed()));
-    }
-
-    /**
-     * Returns all the info objects from the current group
-     *
-     * @return InfoObject[] - Collection of info objects from current group
-     */
-    @Override
-    public InfoObject[] getInfo() {
-        ArrayList<InfoObject> infoList = new ArrayList<>();
-
-        Set<String> keys = propertyMap.keySet();
-        for (String key : keys) {
-            infoList.add(new InfoObject(key, propertyMap.get(key)));
-        }
-        return infoList.toArray(new InfoObject[infoList.size()]);
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/info/InfoObject.java b/base/config/src/main/java/org/artifactory/info/InfoObject.java
deleted file mode 100644
index 5ffed76..0000000
--- a/base/config/src/main/java/org/artifactory/info/InfoObject.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.info;
-
-/**
- * An Object to hold system information in form of key and value
- *
- * @author Noam Tenne
- */
-public class InfoObject {
-
-    /**
-     * Key
-     */
-    private String propertyName;
-    /**
-     * Value
-     */
-    private String propertyValue;
-
-    /**
-     * Main constructor
-     *
-     * @param propertyName  The key
-     * @param propertyValue The value
-     */
-    public InfoObject(String propertyName, String propertyValue) {
-        this.propertyName = propertyName;
-        this.propertyValue = propertyValue;
-    }
-
-    /**
-     * Returns the key
-     *
-     * @return String - key
-     */
-    public String getPropertyName() {
-        return propertyName;
-    }
-
-    /**
-     * Returns the value
-     *
-     * @return String - value
-     */
-    public String getPropertyValue() {
-        return propertyValue;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/info/InfoWriter.java b/base/config/src/main/java/org/artifactory/info/InfoWriter.java
deleted file mode 100644
index 8195626..0000000
--- a/base/config/src/main/java/org/artifactory/info/InfoWriter.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.info;
-
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.SystemUtils;
-import org.artifactory.common.ConstantValues;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Set;
-
-
-/**
- * An enum of info groups that writes all the information to the log
- *
- * @author Noam Tenne
- */
-public enum InfoWriter {
-    user(UserPropInfo.class, "User Info"),
-    host(HostPropInfo.class, "Host Info"),
-    ha(HaPropInfo.class, "High Availability Node Info"),
-    artifactory(ArtifactoryPropInfo.class, "Artifactory Info"),
-    javaSys(JavaSysPropInfo.class, "Java System Info"),
-    classPath(ClassPathPropInfo.class, "Java Class Path Info");
-
-    private static final Logger log = LoggerFactory.getLogger(InfoWriter.class);
-
-    /**
-     * A list of property keys for which the value should be masked
-     */
-    private static final Set<String> maskedKeys = Sets.newHashSet(
-            ConstantValues.s3backupAccountId.getPropertyName(),
-            ConstantValues.s3backupAccountSecretKey.getPropertyName()
-    );
-
-    /**
-     * Info group class
-     */
-    private final Class<? extends BasePropInfoGroup> infoGroup;
-    /**
-     * Group name (used for title)
-     */
-    private final String groupName;
-    /**
-     * The format of the list to be printed
-     */
-    public static final String listFormat = "   %1$-70s| %2$s%n";
-
-    /**
-     * Main constructor
-     *
-     * @param infoGroup InfoGroupClass
-     * @param groupName Name of info group
-     */
-    InfoWriter(Class<? extends BasePropInfoGroup> infoGroup, String groupName) {
-        this.infoGroup = infoGroup;
-        this.groupName = groupName;
-    }
-
-    /**
-     * Dumps the info from all the groups in the enum to the log
-     *
-     * @throws IllegalAccessException
-     * @throws InstantiationException
-     */
-    public static void writeInfo() throws IllegalAccessException, InstantiationException {
-        if (log.isInfoEnabled()) {
-            log.info(getInfo());
-        }
-    }
-
-    /**
-     * Dumps the info from all the groups in the enum to the log
-     *
-     * @throws IllegalAccessException
-     * @throws InstantiationException
-     */
-    public static String getInfo() throws IllegalAccessException, InstantiationException {
-        return getInfoString();
-    }
-
-    public static String getInfoString() throws InstantiationException, IllegalAccessException {
-        StringBuilder sb = new StringBuilder();
-        sb.append(String.format("%n%n SYSTEM INFORMATION DUMP%n"));
-        sb.append(String.format(" =======================%n"));
-        for (InfoWriter writer : InfoWriter.values()) {
-            BasePropInfoGroup group = writer.infoGroup.newInstance();
-            if (!group.isInUse()) {
-                continue;
-            }
-            //Create group title
-            sb.append(String.format("%n ")).append(writer.groupName).append(String.format("%n"));
-            sb.append(String.format(" ========================%n"));
-            //Iterate over all info objects
-            for (InfoObject infoObject : group.getInfo()) {
-                String propertyName = infoObject.getPropertyName();
-                String value = infoObject.getPropertyValue();
-                if (shouldMaskValue(propertyName)) {
-                    value = org.artifactory.util.Strings.mask(value);
-                } else if (writer.equals(javaSys) && shouldMaskValue(value)) {
-                    value = org.artifactory.util.Strings.maskKeyValue(value);
-                }
-                if (propertyName.matches(".*class\\.?path.*")) {
-                    splitLine(sb, propertyName, value);
-                } else {
-                    sb.append(String.format(listFormat,  propertyName , value));
-                }
-            }
-        }
-
-        //Dump the info to the log
-        return sb.toString();
-    }
-
-    private static void splitLine(StringBuilder sb, String propertyName, String value) {
-        String multiValueSeparator = SystemUtils.IS_OS_WINDOWS ? ";" : ":";
-        String[] separateValues = value.split(multiValueSeparator);
-        for (int i = 0; i < separateValues.length; i++) {
-            String separateValue = separateValues[i];
-            sb.append(String.format(listFormat, (i == 0) ? propertyName : "", separateValue));
-        }
-    }
-
-    public static boolean shouldMaskValue(String propertyKey) {
-        String propKeyLower = propertyKey.toLowerCase();
-        return propKeyLower.contains("password")
-                || propKeyLower.contains("secret")
-                || propKeyLower.contains("key")
-                || maskedKeys.contains(propertyKey);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/info/JavaSysPropInfo.java b/base/config/src/main/java/org/artifactory/info/JavaSysPropInfo.java
deleted file mode 100644
index 159c000..0000000
--- a/base/config/src/main/java/org/artifactory/info/JavaSysPropInfo.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.info;
-
-import com.google.common.collect.Lists;
-
-import java.lang.management.ManagementFactory;
-import java.lang.management.RuntimeMXBean;
-import java.util.List;
-
-/**
- * An information group for all the java system properties
- *
- * @author Noam Tenne
- */
-public class JavaSysPropInfo extends BasePropInfoGroup {
-
-    private SystemPropInfoGroup systemPropInfoGroup;
-
-    private RuntimeMXBean runtimeMXBean;
-
-    public JavaSysPropInfo() {
-        systemPropInfoGroup = new SystemPropInfoGroup("java.class.version",
-                "java.home",
-                "java.io.tmpdir",
-                "java.runtime.name",
-                "java.runtime.version",
-                "java.specification.name",
-                "java.specification.vendor",
-                "java.specification.version",
-                "java.vendor",
-                "java.vendor.url",
-                "java.vendor.url.bug",
-                "java.version",
-                "java.vm.info",
-                "java.vm.name",
-                "java.vm.specification.name",
-                "java.vm.specification.vendor",
-                "java.vm.specification.version",
-                "java.vm.vendor",
-                "java.vm.version",
-                "sun.arch.data.model",
-                "sun.boot.library.path",
-                "sun.cpu.endian",
-                "sun.cpu.isalist",
-                "sun.io.unicode.encoding",
-                "sun.java.launcher",
-                "sun.jnu.encoding",
-                "sun.management.compiler",
-                "sun.os.patch.level");
-        runtimeMXBean = ManagementFactory.getRuntimeMXBean();
-    }
-
-    @Override
-    public InfoObject[] getInfo() {
-        List<InfoObject> infoObjects = Lists.newArrayList(systemPropInfoGroup.getInfo());
-
-        List<String> inputArguments = runtimeMXBean.getInputArguments();
-
-        boolean addedFirstValue = false;
-        String key = "JVM Input arguments";
-        for (String inputArgument : inputArguments) {
-            infoObjects.add(new InfoObject(key, inputArgument));
-            if (!addedFirstValue) {
-                addedFirstValue = true;
-                key = "";
-            }
-        }
-
-        return infoObjects.toArray(new InfoObject[infoObjects.size()]);
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/info/PropInfoGroup.java b/base/config/src/main/java/org/artifactory/info/PropInfoGroup.java
deleted file mode 100644
index 4e0edbc..0000000
--- a/base/config/src/main/java/org/artifactory/info/PropInfoGroup.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.info;
-
-/**
- * The main interface for the information groups of properties
- *
- * @author Noam Tenne
- */
-public interface PropInfoGroup {
-
-    /**
-     * Returns all the info objects from the current group
-     *
-     * @return InfoObject[] - Collection of info objects from current group
-     */
-    public InfoObject[] getInfo();
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/info/SystemPropInfoGroup.java b/base/config/src/main/java/org/artifactory/info/SystemPropInfoGroup.java
deleted file mode 100644
index c255303..0000000
--- a/base/config/src/main/java/org/artifactory/info/SystemPropInfoGroup.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.info;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A base class for all information groups that use system properties
- *
- * @author Noam Tenne
- */
-public class SystemPropInfoGroup extends BasePropInfoGroup {
-
-    /**
-     * Property names
-     */
-    private String[] properties;
-
-    /**
-     * Main constructor
-     *
-     * @param properties A collection of property names
-     */
-    public SystemPropInfoGroup(String... properties) {
-        this.properties = properties;
-    }
-
-    public SystemPropInfoGroup() {
-    }
-
-    /**
-     * Receives property names and sets them in the global variable
-     *
-     * @param properties
-     */
-    public void setProperties(String... properties) {
-        this.properties = properties;
-    }
-
-    /**
-     * Returns all the info objects from the current group
-     *
-     * @return InfoObject[] - Collection of info objects from current group
-     */
-    @Override
-    public InfoObject[] getInfo() {
-        List<InfoObject> infoList = new ArrayList<>();
-
-        for (String prop : properties) {
-            String value = getSystemProperty(prop);
-            if (value != null) {
-                InfoObject infoObject = new InfoObject(prop, value);
-                infoList.add(infoObject);
-            }
-        }
-
-        return infoList.toArray(new InfoObject[infoList.size()]);
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/info/UserPropInfo.java b/base/config/src/main/java/org/artifactory/info/UserPropInfo.java
deleted file mode 100644
index 3cef329..0000000
--- a/base/config/src/main/java/org/artifactory/info/UserPropInfo.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.info;
-
-/**
- * An information group for all the user info properties
- *
- * @author Noam Tenne
- */
-public class UserPropInfo extends SystemPropInfoGroup {
-
-    public UserPropInfo() {
-        super("user.country",
-                "user.dir",
-                "user.home",
-                "user.language",
-                "user.name",
-                "user.timezone");
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/jaxb/JaxbHelper.java b/base/config/src/main/java/org/artifactory/jaxb/JaxbHelper.java
deleted file mode 100644
index a90eb40..0000000
--- a/base/config/src/main/java/org/artifactory/jaxb/JaxbHelper.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.jaxb;
-
-import com.google.common.base.Charsets;
-import com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationException;
-import com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException;
-import org.apache.commons.io.IOUtils;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.config.CentralConfigDescriptorImpl;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.xml.XMLConstants;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.Marshaller;
-import javax.xml.bind.SchemaOutputResolver;
-import javax.xml.bind.Unmarshaller;
-import javax.xml.bind.annotation.XmlSchema;
-import javax.xml.transform.Result;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.validation.Schema;
-import javax.xml.validation.SchemaFactory;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.io.UnsupportedEncodingException;
-import java.net.URL;
-import java.util.List;
-
-/**
- * @author yoavl
- */
-public class JaxbHelper<T> {
-    private static final Logger log = LoggerFactory.getLogger(JaxbHelper.class);
-    public static CentralConfigDescriptorImpl readConfig(String configXmlString) {
-        URL schemaUrl = CentralConfigDescriptorImpl.class.getClassLoader().getResource("artifactory.xsd");
-        if (schemaUrl == null) {
-            throw new RuntimeException("Cannot load artifactory.xsd schema file from classpath.\n" +
-                    "Please make sure the artifactory.war contains it.");
-        }
-        CentralConfigDescriptorImpl descriptor =
-                new JaxbHelper<CentralConfigDescriptorImpl>().read(new ByteArrayInputStream(
-                        configXmlString.getBytes(Charsets.UTF_8)),
-                        CentralConfigDescriptorImpl.class, schemaUrl);
-        return descriptor;
-    }
-
-    public static void writeConfig(CentralConfigDescriptor descriptor, File configFile) {
-        try {
-            PrintStream ps = new PrintStream(configFile, Charsets.UTF_8.name());
-            new JaxbHelper<CentralConfigDescriptor>().write(ps, descriptor);
-        } catch (FileNotFoundException e) {
-            throw new RuntimeException("File " + configFile.getAbsolutePath() + " cannot be written to!", e);
-        } catch (UnsupportedEncodingException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    public static String toXml(CentralConfigDescriptor descriptor) {
-        try {
-            ByteArrayOutputStream bos = new ByteArrayOutputStream();
-            new JaxbHelper<CentralConfigDescriptor>().write(bos, descriptor);
-            return bos.toString("utf-8");
-        } catch (IOException e) {
-            throw new RuntimeException("Configuration could be converted to string!", e);
-        }
-    }
-
-    public static <T> String toXml(T object) {
-        try {
-            ByteArrayOutputStream bos = new ByteArrayOutputStream();
-            new JaxbHelper<T>().write(bos, object);
-            return bos.toString("utf-8");
-        } catch (IOException e) {
-            throw new RuntimeException("Object could be converted to string!", e);
-        }
-    }
-
-    public void write(OutputStream stream, T object) {
-        try {
-            JAXBContext context = JAXBContext.newInstance(object.getClass());
-            Marshaller marshaller = context.createMarshaller();
-            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
-            XmlSchema schemaAnnotation = object.getClass().getPackage().getAnnotation(XmlSchema.class);
-            if (schemaAnnotation != null && schemaAnnotation.location() != null) {
-                marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, schemaAnnotation.location());
-                // TODO: May just this ArtifactoryConfigVersion.getCurrent().getXsdLocation());
-            }
-            marshaller.marshal(object, stream);
-        } catch (Exception e) {
-            throw new RuntimeException("Failed to write object to stream.", e);
-        } finally {
-            IOUtils.closeQuietly(stream);
-        }
-    }
-
-    @SuppressWarnings({"unchecked"})
-    public T read(InputStream stream, Class clazz, URL schemaUrl) {
-        T o = null;
-        try {
-            JAXBContext context = JAXBContext.newInstance(clazz);
-            Unmarshaller unmarshaller = context.createUnmarshaller();
-            if (schemaUrl != null) {
-                SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
-                Schema schema = sf.newSchema(schemaUrl);
-                unmarshaller.setSchema(schema);
-            }
-            o = (T) unmarshaller.unmarshal(stream);
-        } catch (Throwable t) {
-            // The following code resolves the errors from JAXB result.
-            // Just throwing new RuntimeException doesn't shows the root cause of the failure and it is almost impossible
-            // to conclude it without this log.
-            if(t instanceof IllegalAnnotationsException){
-                List<IllegalAnnotationException> errors = ((IllegalAnnotationsException) t).getErrors();
-                if(errors!=null){
-                    for (IllegalAnnotationException error : errors) {
-                        log.error("Failed to read object from stream, error:", error);
-                    }
-                }
-            }
-            throw new RuntimeException("Failed to read object from stream", t);
-        } finally {
-            IOUtils.closeQuietly(stream);
-        }
-        return o;
-    }
-
-    public void generateSchema(final OutputStream stream, final Class<T> clazz, final String namespace) {
-        try {
-            JAXBContext context = JAXBContext.newInstance(clazz);
-            context.generateSchema(new SchemaOutputResolver() {
-                @Override
-                public Result createOutput(String namespaceUri, String suggestedFileName)
-                        throws IOException {
-                    StreamResult result = new StreamResult(stream);
-                    result.setSystemId(namespace);
-                    return result;
-                }
-            });
-        } catch (Exception e) {
-            throw new RuntimeException("Failed to write object to stream.", e);
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/logging/version/LoggingVersion.java b/base/config/src/main/java/org/artifactory/logging/version/LoggingVersion.java
deleted file mode 100644
index c4c97bd..0000000
--- a/base/config/src/main/java/org/artifactory/logging/version/LoggingVersion.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.logging.version;
-
-import org.apache.commons.io.FileUtils;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.logging.version.v1.LogbackConfigSwapper;
-import org.artifactory.logging.version.v3.LogbackJFrogInfoConverter;
-import org.artifactory.version.ArtifactoryVersion;
-import org.artifactory.version.SubConfigElementVersion;
-import org.artifactory.version.VersionComparator;
-import org.artifactory.version.XmlConverterUtils;
-import org.artifactory.version.converter.XmlConverter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Keeps track of the logging configuration versions
- *
- * @author Noam Y. Tenne
- */
-public enum LoggingVersion implements SubConfigElementVersion {
-    v1(ArtifactoryVersion.v122rc0, ArtifactoryVersion.v304, new LogbackConfigSwapper()),
-    v2(ArtifactoryVersion.v310, ArtifactoryVersion.v331, null),
-    v3(ArtifactoryVersion.v340, ArtifactoryVersion.v421, new LogbackJFrogInfoConverter()),
-    v4(ArtifactoryVersion.v422, ArtifactoryVersion.getCurrent(), new LogbackConfigSwapper());
-
-    private static final Logger log = LoggerFactory.getLogger(LoggingVersion.class);
-
-    private final VersionComparator comparator;
-    private XmlConverter xmlConverter;
-
-    /**
-     * Main constructor
-     *
-     * @param from         Start version
-     * @param until        End version
-     * @param xmlConverter XML converter required for the specified range
-     */
-    LoggingVersion(ArtifactoryVersion from, ArtifactoryVersion until, XmlConverter xmlConverter) {
-        this.xmlConverter = xmlConverter;
-        this.comparator = new VersionComparator(from, until);
-        ArtifactoryVersion.addSubConfigElementVersion(this, comparator);
-    }
-
-    /**
-     * Run the needed conversions
-     *
-     * @param srcEtcDir the directory in which resides the logback file to convert
-     */
-    public void convert(File srcEtcDir, File targetEtcDir) throws IOException {
-        // First create the list of converters to apply
-        List<XmlConverter> converters = new ArrayList<>();
-
-        // All converters of versions above me needs to be executed in sequence
-        LoggingVersion[] versions = LoggingVersion.values();
-        for (LoggingVersion version : versions) {
-            if (version.ordinal() >= ordinal() && version.xmlConverter != null) {
-                converters.add(version.xmlConverter);
-            }
-        }
-
-        if (!converters.isEmpty()) {
-            File logbackConfigFile = new File(srcEtcDir, ArtifactoryHome.LOGBACK_CONFIG_FILE_NAME);
-            try {
-                String result =
-                        XmlConverterUtils.convert(converters, FileUtils.readFileToString(logbackConfigFile, "utf-8"));
-                backupAndSaveLogback(result, targetEtcDir);
-            } catch (IOException e) {
-                log.error("Error occurred while converting logback config for conversion: {}.", e.getMessage());
-                log.debug("Error occurred while converting logback config for conversion", e);
-                throw e;
-            }
-        }
-    }
-
-    @Override
-    public VersionComparator getComparator() {
-        return comparator;
-    }
-
-    /**
-     * Creates a backup of the existing logback configuration file and proceeds to save post-conversion content
-     *
-     * @param result Conversion result
-     * @param etcDir directory to which to save the conversion result
-     */
-    public void backupAndSaveLogback(String result, File etcDir) throws IOException {
-        File logbackConfigFile = new File(etcDir, ArtifactoryHome.LOGBACK_CONFIG_FILE_NAME);
-        if (logbackConfigFile.exists()) {
-            File originalBackup = new File(etcDir, "logback.original.xml");
-            if (originalBackup.exists()) {
-                FileUtils.deleteQuietly(originalBackup);
-            }
-            FileUtils.moveFile(logbackConfigFile, originalBackup);
-        }
-
-        FileUtils.writeStringToFile(logbackConfigFile, result, "utf-8");
-    }
-
-    public static void convert(ArtifactoryVersion from, ArtifactoryVersion target, File path)
-            throws IOException {
-        boolean foundConversion = false;
-        // All converters of versions above me needs to be executed in sequence
-        LoggingVersion[] versions = LoggingVersion.values();
-        for (LoggingVersion version : versions) {
-            if (version.comparator.isAfter(from) && !version.comparator.supports(from)) {
-                version.convert(path, path);
-            }
-        }
-        // Write to log only if conversion has been executed
-        if (foundConversion) {
-            log.info("Ending database conversion from " + from + " to " + target);
-        }
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/logging/version/v1/LogbackConfigSwapper.java b/base/config/src/main/java/org/artifactory/logging/version/v1/LogbackConfigSwapper.java
deleted file mode 100644
index b220f19..0000000
--- a/base/config/src/main/java/org/artifactory/logging/version/v1/LogbackConfigSwapper.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.logging.version.v1;
-
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.util.XmlUtils;
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.InputStream;
-
-/**
- * TO BE USED ONLY UP TO v210<p/> Early logback config "converter". Replaces the existing config to keep it up to date
- * With different changes.
- *
- * @author Noam Tenne
- */
-public class LogbackConfigSwapper implements XmlConverter {
-
-    private static final Logger log = LoggerFactory.getLogger(LogbackConfigSwapper.class);
-
-    /**
-     * Replaces the content of the given logback configuration with the content of the latest
-     *
-     * @param doc Logback configuration
-     */
-    @Override
-    public void convert(Document doc) {
-        //Get the updated config
-        InputStream newConfigFile =
-                getClass().getResourceAsStream("/META-INF/default/" + ArtifactoryHome.LOGBACK_CONFIG_FILE_NAME);
-        if (newConfigFile == null) {
-            log.error("Replacement logback configuration file was not found in '/META-INF/default/'.");
-            return;
-        }
-
-        doc.detachRootElement();
-        doc.setRootElement(XmlUtils.parse(newConfigFile).detachRootElement());
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/logging/version/v3/LogbackJFrogInfoConverter.java b/base/config/src/main/java/org/artifactory/logging/version/v3/LogbackJFrogInfoConverter.java
deleted file mode 100644
index 462b876..0000000
--- a/base/config/src/main/java/org/artifactory/logging/version/v3/LogbackJFrogInfoConverter.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.logging.version.v3;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-
-import java.util.List;
-
-/**
- * Adds org.jfrog package as info level to the logback.xml file.
- *
- * @author Shay Yaakov
- */
-public class LogbackJFrogInfoConverter implements XmlConverter {
-
-    @Override
-    public void convert(Document doc) {
-        Element root = doc.getRootElement();
-        Namespace ns = root.getNamespace();
-
-        List<Element> loggers = root.getChildren("logger", ns);
-        for (Element logger : loggers) {
-            if (StringUtils.equals(logger.getAttributeValue("name", ns), "org.jfrog")) {
-                return;
-            }
-        }
-
-        // Did not find org.jfrog, let's add it
-        Element logger = new Element("logger", ns);
-        logger.setAttribute("name", "org.jfrog");
-        Element level = new Element("level", ns);
-        level.setAttribute("value", "info");
-        logger.addContent(level);
-        root.addContent(logger);
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/mime/DebianNaming.java b/base/config/src/main/java/org/artifactory/mime/DebianNaming.java
deleted file mode 100644
index 0b8f429..0000000
--- a/base/config/src/main/java/org/artifactory/mime/DebianNaming.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime;
-
-/**
- * @author Gidi Shabat
- */
-public class DebianNaming {
-
-    public static final String RELEASE = "Release";
-    public static final String INRELEASE = "InRelease";
-    public static final String RELEASE_GPG = "Release.gpg";
-    public static final String PACKAGES = "Packages";
-    public static final String PACKAGES_GZ = "Packages.gz";
-    public static final String PACKAGES_BZ2 = "Packages.bz2";
-    public static final String SOURCES = "Sources";
-    public static final String SOURCES_BZ2 = "Sources.bz2";
-    public static final String SOURCES_GZ = "Sources.gz";
-    public static final String CONTENTS_PREFIX = "Contents";
-    public static final String DISTS_PATH = "dists";
-
-    public static final String distribution = "deb.distribution";
-    public static final String component = "deb.component";
-    public static final String architecture = "deb.architecture";
-    public static final String packageType = "deb.type";
-
-    public static final String DEBIAN_NAME = "deb.name";
-    public static final String DEBIAN_VERSION = "deb.version";
-    public static final String DEBIAN_MAINTAINER = "deb.maintainer";
-    public static final String DEBIAN_PRIORITY = "deb.priority";
-    public static final String DEBIAN_SECTION = "deb.section";
-    public static final String DEBIAN_WEBSITE = "deb.website";
-
-    public static boolean isIndexFile(String fileName) {
-        return isPackagesIndex(fileName) || isReleaseIndex(fileName) || isContentIndex(fileName);
-    }
-
-    public static boolean isSupportedIndex(String fileName) {
-        return isReleaseIndex(fileName) || isPackagesIndex(fileName);
-    }
-
-    public static boolean isExpirable(String fileName) {
-        return isReleaseIndex(fileName) || isSigningFile(fileName) || isPackagesIndex(fileName)
-                || isSourcesIndex(fileName) || isTranslationIndex(fileName) || isContentIndex(fileName);
-    }
-
-    public static boolean isReleaseIndex(String fileName) {
-        return fileName.equalsIgnoreCase(RELEASE) || fileName.equalsIgnoreCase(INRELEASE);
-    }
-
-    public static boolean isPackagesIndex(String fileName) {
-        return fileName.equalsIgnoreCase(PACKAGES)
-                || fileName.equalsIgnoreCase(PACKAGES_GZ)
-                || fileName.equalsIgnoreCase(PACKAGES_BZ2);
-    }
-
-    public static boolean isSourcesIndex(String fileName) {
-        return fileName.equalsIgnoreCase(SOURCES) || fileName.equalsIgnoreCase(SOURCES_GZ) || fileName.equalsIgnoreCase(SOURCES_BZ2);
-    }
-
-    public static boolean isTranslationIndex(String fileName) {
-        return fileName.startsWith("Translation-") || fileName.startsWith("translation-");
-    }
-
-    public static boolean isSigningFile(String fileName) {
-        return fileName.equalsIgnoreCase(RELEASE_GPG);
-    }
-
-    public static boolean isInRelease(String fileName) {
-        return fileName.equalsIgnoreCase(INRELEASE);
-    }
-
-    //Contents or Contents-<arch>.<gz\bz\bz2>
-    public static boolean isContentIndex(String fileName) {
-        fileName = fileName.toLowerCase();
-        return fileName.startsWith(CONTENTS_PREFIX.toLowerCase() + "-");
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/mime/MavenNaming.java b/base/config/src/main/java/org/artifactory/mime/MavenNaming.java
deleted file mode 100644
index 52c0ffc..0000000
--- a/base/config/src/main/java/org/artifactory/mime/MavenNaming.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime;
-
-import org.apache.commons.io.FilenameUtils;
-import org.artifactory.util.Pair;
-import org.artifactory.util.PathUtils;
-
-import java.io.File;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * @author yoavl
- */
-public abstract class MavenNaming {
-    // Matcher for unique snapshot names of the form artifactId-version-date.time-buildNumber.type
-    // for example: artifactory-1.0-20081214.090217-4.pom
-    // groups: 1: artifactId-version, 2. artifactId 3. base version (without the snapshot part) 4. date.time-buildNumber
-    // 5. date.time 6. buildNumber
-    private static final Pattern UNIQUE_SNAPSHOT_NAME_PATTERN =
-            Pattern.compile("^((.+)-(.+))-(([0-9]{8}.[0-9]{6})-([0-9]+))[\\.-].+$");
-
-    public static final String MAVEN_METADATA_NAME = "maven-metadata.xml";
-    public static final String SNAPSHOT = "SNAPSHOT";
-    public static final String SNAPSHOT_SUFFIX = "-" + SNAPSHOT;
-    public static final String NEXUS_INDEX_DIR = ".index";
-    public static final String NEXUS_INDEX_PREFIX = "nexus-maven-repository-index";
-    public static final String NEXUS_INDEX_ZIP = NEXUS_INDEX_PREFIX + ".zip";
-    public static final String NEXUS_INDEX_GZ = NEXUS_INDEX_PREFIX + ".gz";
-    public static final String NEXUS_INDEX_PROPERTIES = NEXUS_INDEX_PREFIX + ".properties";
-    public static final String NEXUS_INDEX_ZIP_PATH = NEXUS_INDEX_DIR + "/" + NEXUS_INDEX_ZIP;
-    public static final String NEXUS_INDEX_GZ_PATH = NEXUS_INDEX_DIR + "/" + NEXUS_INDEX_GZ;
-    public static final String NEXUS_INDEX_PROPERTIES_PATH = NEXUS_INDEX_DIR + "/" + NEXUS_INDEX_PROPERTIES;
-
-    private MavenNaming() {
-        // utility class
-    }
-
-    /**
-     * @param version String representing the maven version
-     * @return True if the version is a non-unique snapshot version (ie, ends with -SNAPSHOT)
-     */
-    public static boolean isNonUniqueSnapshotVersion(String version) {
-        return version.endsWith(SNAPSHOT_SUFFIX);
-    }
-
-    /**
-     * @param path Path to a file
-     * @return True if the path is of a non-unique snapshot version file
-     */
-    public static boolean isNonUniqueSnapshot(String path) {
-        int idx = path.indexOf(SNAPSHOT_SUFFIX + ".");
-        if (idx < 0) {
-            idx = path.indexOf(SNAPSHOT_SUFFIX + "-");
-        }
-        return idx > 0 && idx > path.lastIndexOf('/');
-    }
-
-    public static boolean isUniqueSnapshot(String path) {
-        int versionIdx = path.indexOf(SNAPSHOT_SUFFIX + "/");
-        if (versionIdx > 0) {
-            String fileName = PathUtils.getFileName(path);
-            return isUniqueSnapshotFileName(fileName);
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * @param path A path to file or directory
-     * @return True if the path is for a snapshot file or folder (either unique or non-unique snapshots)
-     */
-    public static boolean isSnapshot(String path) {
-        boolean result = isNonUniqueSnapshot(path);
-        if (!result) {
-            result = isUniqueSnapshot(path);
-        }
-        //A path ending with just the version dir
-        if (!result) {
-            int versionIdx = path.indexOf(SNAPSHOT_SUFFIX + "/");
-            result = versionIdx > 0 && path.lastIndexOf('/') == versionIdx + 8;
-        }
-        if (!result) {
-            result = path.endsWith(SNAPSHOT_SUFFIX);
-        }
-        return result;
-    }
-
-    public static boolean isChecksum(String path) {
-        return NamingUtils.isChecksum(path);
-    }
-
-    public static boolean isChecksum(File path) {
-        return isChecksum(path.getName());
-    }
-
-    /**
-     * @param path Path to test
-     * @return True if this path points to nexus index file.
-     */
-    public static boolean isIndex(String path) {
-        String name = PathUtils.getFileName(path);
-        return name.startsWith(NEXUS_INDEX_PREFIX);
-    }
-
-    public static boolean isMavenMetadata(String path) {
-        String fileName = PathUtils.getFileName(path);
-        return isMavenMetadataFileName(fileName);
-    }
-
-    /**
-     * @param path The maven metadata full path
-     * @return True if the path points to maven metadata under a snapshot folder
-     */
-    public static boolean isSnapshotMavenMetadata(String path) {
-        Pair<String, String> nameAndParent = NamingUtils.getMetadataNameAndParent(path);
-        String name = nameAndParent.getFirst();
-        String parent = nameAndParent.getSecond();
-        return parent != null && parent.endsWith(SNAPSHOT_SUFFIX) && isMavenMetadataFileName(name);
-    }
-
-    /**
-     * Converts a path to maven 1 path. For example org/apache/commons/commons-email/1.1/commons-email-1.1.jar will
-     * result in org.apache.commons/jars/commons-email-1.1.jar
-     *
-     * @param path Path to convert
-     * @return A Maven 1 repository path
-     */
-    public static String toMaven1Path(String path) {
-        String[] pathElements = path.split("/");
-        String name = pathElements[pathElements.length - 1];
-        String fileExt;
-        if (isChecksum(path)) {
-            int lastPeriodIndex = name.lastIndexOf('.');
-            fileExt = name.substring(name.lastIndexOf('.', lastPeriodIndex - 1) + 1,
-                    lastPeriodIndex);
-        } else {
-            fileExt = name.substring(name.lastIndexOf('.') + 1);
-        }
-
-        // Get the group path (the path up until the artifact id)
-        StringBuilder groupPath = new StringBuilder(pathElements[0]);
-        for (int i = 1; i < pathElements.length - 3; i++) {
-            groupPath.append(".").append(pathElements[i]);
-        }
-        return groupPath.toString().replace('/', '.') + "/" + fileExt + "s/" + name;
-    }
-
-    public static boolean isMavenMetadataFileName(String fileName) {
-        return MAVEN_METADATA_NAME.equals(fileName) ||
-                fileName.endsWith(NamingUtils.METADATA_PREFIX + MAVEN_METADATA_NAME);
-    }
-
-    /**
-     * @param path Path to a file (absolute or relative)
-     * @return True if the path points to Maven pom file
-     */
-    public static boolean isPom(String path) {
-        return NamingUtils.isPom(path);
-    }
-
-    public static boolean isClientOrServerPom(String path) {
-        return isPom(path) || isClientPom(path);
-    }
-
-    public static boolean isClientPom(String path) {
-        String name = FilenameUtils.getName(path);
-        return "pom.xml".equalsIgnoreCase(name);
-    }
-
-    /**
-     * @param fileName The file name to test if is a unique snapshot
-     * @return True if the file name is of the form artifactId-version-date.time-buildNumber.type
-     * <p/>
-     * For example: artifactory-1.0-20081214.090217-4.pom
-     */
-    public static boolean isUniqueSnapshotFileName(String fileName) {
-        Matcher matcher = UNIQUE_SNAPSHOT_NAME_PATTERN.matcher(fileName);
-        return matcher.matches();
-    }
-
-    /**
-     * @param uniqueVersion A file name representing a valid unique snapshot version.
-     * @return The timestamp of the unique snapshot version
-     */
-    public static String getUniqueSnapshotVersionTimestamp(String uniqueVersion) {
-        Matcher matcher = matchUniqueSnapshotVersion(uniqueVersion);
-        return matcher.group(5);
-    }
-
-    /**
-     * @param uniqueVersion A file name representing a valid unique snapshot version.
-     * @return The timestamp-buildNumber of the unique snapshot version
-     */
-    public static String getUniqueSnapshotVersionTimestampAndBuildNumber(String uniqueVersion) {
-        Matcher matcher = matchUniqueSnapshotVersion(uniqueVersion);
-        return matcher.group(4);
-    }
-
-    /**
-     * @param uniqueVersion A file name representing a valid unique snapshot version.
-     * @return The buildNumber of the unique snapshot version
-     */
-    public static int getUniqueSnapshotVersionBuildNumber(String uniqueVersion) {
-        Matcher matcher = matchUniqueSnapshotVersion(uniqueVersion);
-        return Integer.parseInt(matcher.group(6));
-    }
-
-    /**
-     * Returns the base build number of the unique snapshot version.<p/> For example, the base version of
-     * 'artifact-5.4-20090623.090500-2.pom' is 5.4.
-     *
-     * @param uniqueVersion A file name representing a valid unique snapshot version.
-     * @return The base build number of the unique snapshot version
-     * @deprecated The base version detection is not accurate and will not work if the version contains dashes
-     */
-    @Deprecated
-    public static String getUniqueSnapshotVersionBaseVersion(String uniqueVersion) {
-        Matcher matcher = matchUniqueSnapshotVersion(uniqueVersion);
-        return matcher.group(3);
-    }
-
-    private static Matcher matchUniqueSnapshotVersion(String uniqueVersion) {
-        Matcher matcher = UNIQUE_SNAPSHOT_NAME_PATTERN.matcher(uniqueVersion);
-        if (!matcher.matches()) {
-            throw new IllegalArgumentException("Not a valid maven unique snapshot version: " + uniqueVersion);
-        }
-        return matcher;
-    }
-
-    public static boolean isMavenMetadataChecksum(String path) {
-        if (NamingUtils.isChecksum(path)) {
-            String checksumTargetFile = PathUtils.stripExtension(path);
-            return isMavenMetadata(checksumTargetFile);
-        } else {
-            return false;
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/mime/MimeType.java b/base/config/src/main/java/org/artifactory/mime/MimeType.java
deleted file mode 100644
index 8d72e85..0000000
--- a/base/config/src/main/java/org/artifactory/mime/MimeType.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime;
-
-import com.google.common.collect.ImmutableSet;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
-
-import java.io.Serializable;
-
-/**
- * Represents a mime type with additional properties.
- *
- * @author Yossi Shaul
- */
- at XStreamAlias("mimetype")
-public class MimeType implements Serializable {
-    // commonly used mime types
-    public static final String applicationXml = "application/xml";
-    public static final String checksum = "application/x-checksum";
-    public static final String javaSource = "text/x-java-source";
-    public static final String javaArchive = "application/java-archive";
-
-    public static final MimeType def = new MimeType("application/octet-stream", ImmutableSet.<String>of(),
-            false, false, false, null, "doc");
-
-    /**
-     * The unique string representation of the mime type (eg, plain/text)
-     */
-    @XStreamAsAttribute
-    private final String type;
-    /**
-     * List of file extensions mapped to this mime type
-     */
-    @XStreamAsAttribute
-    private final ImmutableSet<String> extensions;
-    /**
-     * True if this mime type can be viewed as text file
-     */
-    @XStreamAsAttribute
-    private final boolean viewable;
-    /**
-     * True if this mime type should be indexed (applies to xml and archive files)
-     */
-    @XStreamAsAttribute
-    private final boolean index;
-    /**
-     * True if this mime type is a browsable archive (currently zip/jar variants are supported)
-     */
-    @XStreamAsAttribute
-    private final boolean archive;
-    /**
-     * The UI highlighter syntax to for this mime type (only relevant if this is a viewable type)
-     */
-    @XStreamAsAttribute
-    private final String syntax;
-    /**
-     * The css class of a display icon for this mime type
-     */
-    @XStreamAsAttribute
-    private final String css;
-
-    protected MimeType(String type, ImmutableSet<String> extensions, boolean viewable, boolean index, boolean archive,
-            String syntax, String css) {
-        this.type = type;
-        this.extensions = extensions;
-        this.viewable = viewable;
-        this.index = index;
-        this.archive = archive;
-        this.syntax = syntax;
-        this.css = css;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public ImmutableSet<String> getExtensions() {
-        return extensions;
-    }
-
-    public boolean isViewable() {
-        return viewable;
-    }
-
-    public boolean isIndex() {
-        return index;
-    }
-
-    public boolean isArchive() {
-        return archive;
-    }
-
-    public String getSyntax() {
-        return syntax;
-    }
-
-    public String getCss() {
-        return css;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        MimeType mimeType = (MimeType) o;
-
-        if (!type.equals(mimeType.type)) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return type.hashCode();
-    }
-
-    @Override
-    public String toString() {
-        return type;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/mime/MimeTypeBuilder.java b/base/config/src/main/java/org/artifactory/mime/MimeTypeBuilder.java
deleted file mode 100644
index 859cae3..0000000
--- a/base/config/src/main/java/org/artifactory/mime/MimeTypeBuilder.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime;
-
-import com.google.common.collect.ImmutableSet;
-import org.apache.commons.lang.StringUtils;
-
-/**
- * Builder for {@link MimeType}.
- *
- * @author Yossi Shaul
- */
-public class MimeTypeBuilder {
-    // @formatter:off
-    /** The unique string representation of the mime type (eg, plain/text) */
-    private String type;
-    /** List of file extensions mapped to this mime type */
-    private String[] extensions;
-    /** True if this mime type can be viewed as text file */
-    private boolean viewable;
-    /** True if this mime type should be indexed (applies to xml and archive files) */
-    private boolean index;
-    /** True if this mime type is a browsable archive (currently zip/jar variants are supported) */
-    private boolean archive;
-    /** The UI highlighter syntax to for this mime type (only relevant if this is a viewable type) */
-    private String syntax;
-    /** The css class of a display icon for this mime type */
-    private String css;
-    // @formatter:on
-
-
-    public MimeTypeBuilder(String type) {
-        this.type = type;
-    }
-
-    public MimeType build() {
-        if (StringUtils.isBlank(type)) {
-            throw new IllegalArgumentException("Type cannot be empty");
-        }
-        return new MimeType(type, ImmutableSet.copyOf(extensions), viewable, index, archive, syntax, css);
-    }
-
-    public MimeTypeBuilder extensions(String... extensions) {
-        this.extensions = extensions;
-        return this;
-    }
-
-    public MimeTypeBuilder viewable(boolean viewable) {
-        this.viewable = viewable;
-        return this;
-    }
-
-    public MimeTypeBuilder index(boolean index) {
-        this.index = index;
-        return this;
-    }
-
-    public MimeTypeBuilder archive(boolean archive) {
-        this.archive = archive;
-        return this;
-    }
-
-    public MimeTypeBuilder syntax(String syntax) {
-        this.syntax = syntax;
-        return this;
-    }
-
-    public MimeTypeBuilder css(String css) {
-        this.css = css;
-        return this;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/mime/MimeTypes.java b/base/config/src/main/java/org/artifactory/mime/MimeTypes.java
deleted file mode 100644
index 5d20348..0000000
--- a/base/config/src/main/java/org/artifactory/mime/MimeTypes.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime;
-
-import com.google.common.collect.ImmutableSet;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
-import com.thoughtworks.xstream.annotations.XStreamImplicit;
-
-import javax.annotation.Nullable;
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Holds a list of mime entries.
- *
- * @author Yossi Shaul
- */
- at XStreamAlias("mimetypes")
-public class MimeTypes implements Serializable {
-    /**
-     * The xml version (controlled by the converters only)
-     */
-    @XStreamAsAttribute
-    private String version;
-
-    @XStreamImplicit
-    private final Set<MimeType> mimeTypes;
-
-    transient private Map<String, MimeType> typeByExtension;
-
-    protected MimeTypes(ImmutableSet<MimeType> mimeTypes) {
-        this.mimeTypes = mimeTypes;
-    }
-
-    public Set<MimeType> getMimeTypes() {
-        return mimeTypes;
-    }
-
-    @Nullable
-    public MimeType getByMime(String type) {
-        for (MimeType mimeType : mimeTypes) {
-            if (mimeType.getType().equals(type)) {
-                return mimeType;
-            }
-        }
-        return null;
-    }
-
-    @Nullable
-    public MimeType getByExtension(String extension) {
-        if (extension == null) {
-            return null;
-        }
-        if (typeByExtension == null) {
-            initializeTypeByExtensionIfNeeded();
-        }
-        return typeByExtension.get(extension.toLowerCase());
-    }
-
-    private synchronized void initializeTypeByExtensionIfNeeded() {
-        if (typeByExtension == null) {
-            typeByExtension = new HashMap<>(mimeTypes.size());
-            for (MimeType mimeType : mimeTypes) {
-                for (String extension : mimeType.getExtensions()) {
-                    typeByExtension.put(extension, mimeType);
-                }
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/mime/MimeTypesReader.java b/base/config/src/main/java/org/artifactory/mime/MimeTypesReader.java
deleted file mode 100644
index 76cdd5c..0000000
--- a/base/config/src/main/java/org/artifactory/mime/MimeTypesReader.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime;
-
-import com.google.common.collect.ImmutableSet;
-import com.sun.xml.internal.ws.api.streaming.XMLStreamWriterFactory;
-import com.thoughtworks.xstream.XStream;
-import com.thoughtworks.xstream.converters.SingleValueConverter;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.mime.version.MimeTypesVersion;
-import org.artifactory.util.PrettyStaxDriver;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * A reader of mimetypes configuration file.
- *
- * @author Yossi Shaul
- */
-public class MimeTypesReader {
-    private static final Logger log = LoggerFactory.getLogger(MimeTypesReader.class);
-
-    public MimeTypes read(File mimeTypesFile) {
-        FileInputStream fis = null;
-        try {
-            fis = new FileInputStream(mimeTypesFile);
-            return read(fis);
-        } catch (FileNotFoundException e) {
-            throw new RuntimeException("File not found: " + e.getMessage());
-        } finally {
-            IOUtils.closeQuietly(fis);
-        }
-    }
-
-    public MimeTypes read(InputStream is) {
-        String xmlContent;
-        try {
-            xmlContent = IOUtils.toString(is, "utf-8");
-        } catch (IOException e) {
-            throw new RuntimeException("Failed to read file content: " + e.getMessage(), e);
-        }
-
-        return read(xmlContent);
-    }
-
-    public MimeTypes read(String xmlContent) {
-        MimeTypesVersion mimeTypesVersion = MimeTypesVersion.findVersion(xmlContent);
-        if (!mimeTypesVersion.isCurrent()) {
-            log.info("Converting mimetypes.xml version from '{}' to '{}'", mimeTypesVersion,
-                    MimeTypesVersion.getCurrent());
-            xmlContent = mimeTypesVersion.convert(xmlContent);
-        }
-
-        XStream xStream = new XStream(new PrettyStaxDriver(null));
-        xStream.processAnnotations(new Class[]{MimeTypes.class, MimeType.class});
-        xStream.registerLocalConverter(MimeType.class, "extensions", new StringToListAttributeConverter());
-        MimeTypes mimeTypes = ((MimeTypes) xStream.fromXML(xmlContent));
-        return mimeTypes;
-    }
-
-    private static class StringToListAttributeConverter implements SingleValueConverter {
-        /**
-         * Converts a comma separated string to a list of strings.
-         *
-         * @param str A comma separated list of strings
-         */
-        @Override
-        public ImmutableSet<String> fromString(String str) {
-            if (StringUtils.isBlank(str)) {
-                return ImmutableSet.of();
-            }
-
-            ImmutableSet.Builder<String> builder = ImmutableSet.builder();
-            String[] extensions = str.split(",");
-            for (String extension : extensions) {
-                extension = StringUtils.trim(extension);
-                if (StringUtils.isNotBlank(extension)) {
-                    builder.add(extension);
-                }
-            }
-            return builder.build();
-        }
-
-        @Override
-        public String toString(Object obj) {
-            throw new UnsupportedOperationException("Marshaling is not supported");
-        }
-
-        @Override
-        public boolean canConvert(Class type) {
-            throw new UnsupportedOperationException("This method should not be called on a local converter");
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/mime/NamingUtils.java b/base/config/src/main/java/org/artifactory/mime/NamingUtils.java
deleted file mode 100644
index fcb50d8..0000000
--- a/base/config/src/main/java/org/artifactory/mime/NamingUtils.java
+++ /dev/null
@@ -1,308 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime;
-
-import org.apache.commons.io.FilenameUtils;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.util.PathUtils;
-import org.artifactory.util.SerializablePair;
-
-import javax.annotation.Nonnull;
-import java.io.File;
-
-/**
- * Used when deploying manually to artifactory, and classifying pom files. Only jar are queried to contain a pom file.
- *
- * @author freds
- * @author yoavl
- */
-public abstract class NamingUtils {
-    public static final String METADATA_PREFIX = ":";
-
-    private NamingUtils() {
-        // utility class
-    }
-
-    /**
-     * @param path A file path
-     * @return The content type for the path. Will return default content type if not mapped.
-     */
-    @Nonnull
-    public static MimeType getMimeType(String path) {
-        String extension = PathUtils.getExtension(path);
-        return getMimeTypeByExtension(extension);
-    }
-
-    @Nonnull
-    public static MimeType getMimeTypeByExtension(String extension) {
-        MimeType result = null;
-        if (extension != null) {
-            result = ArtifactoryHome.get().getMimeTypes().getByExtension(extension);
-        }
-
-        return result != null ? result : MimeType.def;
-    }
-
-    public static String getMimeTypeByPathAsString(String path) {
-        MimeType ct = getMimeType(path);
-        return ct.getType();
-    }
-
-    public static boolean isChecksum(String path) {
-        MimeType ct = getMimeType(path);
-        return MimeType.checksum.equalsIgnoreCase(ct.getType());
-    }
-
-    public static boolean isJarVariant(String path) {
-        MimeType ct = getMimeType(path);
-        return MimeType.javaArchive.equalsIgnoreCase(ct.getType());
-    }
-
-    /**
-     * @param path Path to a file (absolute or relative)
-     * @return True if the path points to Maven pom file
-     */
-    public static boolean isPom(String path) {
-        MimeType ct = NamingUtils.getMimeType(path);
-        return "application/x-maven-pom+xml".equalsIgnoreCase(ct.getType());
-    }
-
-    public static boolean isNuPkgFile(String fileName) {
-        MimeType mimeType = getMimeType(fileName);
-        return "application/x-nupkg".equalsIgnoreCase(mimeType.getType());
-    }
-
-    public static boolean isRpmFile(String fileName) {
-        return fileName.endsWith(".rpm");
-    }
-
-    public static boolean isGemFile(String fileName) {
-        MimeType mimeType = NamingUtils.getMimeType(fileName);
-        return "application/x-rubygems".equalsIgnoreCase(mimeType.getType());
-    }
-
-    public static boolean isNpmFile(String fileName) {
-        return fileName.endsWith(".tgz");
-    }
-
-    /**
-     * @param path Files path
-     * @return True if the file syntax is xml
-     */
-    public static boolean isXml(String path) {
-        MimeType ct = NamingUtils.getMimeType(path);
-        return "xml".equalsIgnoreCase(ct.getSyntax());
-    }
-
-    public static SerializablePair<String, String> getMetadataNameAndParent(String path) {
-        int mdPrefixIdx = path.lastIndexOf(METADATA_PREFIX);
-        String name = null;
-        String parent = null;
-        if (mdPrefixIdx >= 0) {
-            name = path.substring(mdPrefixIdx + METADATA_PREFIX.length());
-            parent = path.substring(0, mdPrefixIdx);
-        } else {
-            //Fallback to checking maven metadata
-            final File file = new File(path);
-            if (MavenNaming.MAVEN_METADATA_NAME.equals(file.getName())) {
-                name = MavenNaming.MAVEN_METADATA_NAME;
-                parent = file.getParent();
-            }
-        }
-        return new SerializablePair<>(name, parent);
-    }
-
-    public static boolean isMetadata(String path) {
-        String fileName = PathUtils.getFileName(path);
-        if (fileName == null || fileName.length() == 0) {
-            return false;
-        }
-        //First check for the metadata pattern of x/y/z/resourceName:metadataName
-        if (fileName.contains(METADATA_PREFIX)) {
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Returns true if the path points to the deprecated properties path (i.e., ends with :properties)
-     *
-     * @param path The path to check
-     * @return True if this is a properties path
-     */
-    public static boolean isProperties(String path) {
-        String fileName = PathUtils.getFileName(path);
-        if (fileName == null || fileName.length() == 0) {
-            return false;
-        }
-        if (fileName.endsWith(METADATA_PREFIX + "properties")) {
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * @param path The path to check
-     * @return True if the path represents a checksum for metadata (ie metadata path and ends with checksum file
-     * extension)
-     */
-    public static boolean isMetadataChecksum(String path) {
-        if (isChecksum(path)) {
-            String checksumTargetFile = PathUtils.stripExtension(path);
-            return isMetadata(checksumTargetFile);
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * @return True if the path points to a system file (e.g., maven index)
-     */
-    public static boolean isSystem(String path) {
-        return MavenNaming.isIndex(path) || path.endsWith(".index");
-    }
-
-    /**
-     * Return the name of the requested metadata. Should be called on a path after determining that it is indeed a
-     * metadata path.
-     * <pre>
-     * getMetadataName("x/y/z/resourceName#file-info") = "file-info"
-     * getMetadataName("x/y/z/resourceName/maven-metadata.xml") = "maven-metadata.xmlo"
-     * </pre>
-     *
-     * @param path A metadata path in the pattern of x/y/z/resourceName#metadataName or a path that ends with
-     *             maven-metadata.xml.
-     * @return The metadata name from the path. Null if not valid.
-     */
-    public static String getMetadataName(String path) {
-        //First check for the metadata pattern of x/y/z/resourceName#metadataName
-        int mdPrefixIdx = path.lastIndexOf(METADATA_PREFIX);
-        String name = null;
-        if (mdPrefixIdx >= 0) {
-            name = path.substring(mdPrefixIdx + METADATA_PREFIX.length());
-        } else {
-            //TODO: [by YS] remove maven metadata from here
-            //Fallback to checking maven metadata
-            String fileName = PathUtils.getFileName(path);
-            if (MavenNaming.isMavenMetadataFileName(fileName)) {
-                name = MavenNaming.MAVEN_METADATA_NAME;
-            }
-        }
-        return name;
-    }
-
-    public static String stripMetadataFromPath(String path) {
-        int metadataPrefixIdx = path.lastIndexOf(NamingUtils.METADATA_PREFIX);
-        if (metadataPrefixIdx >= 0) {
-            path = path.substring(0, metadataPrefixIdx);
-        }
-        return path;
-    }
-
-    /**
-     * Get the path of the metadata container. Assumes we already verified that this is a metadataPath.
-     *
-     * @param path
-     * @return
-     */
-    public static String getMetadataParentPath(String path) {
-        String metadataName = getMetadataName(path);
-        // the root repository may have metadata checksums (i.e. repo1), and it will not have a parent.
-        // if it doesn't check the relative path without stripping.
-        int index = path.lastIndexOf(metadataName) - 1;
-        if (index < 0) {
-            return metadataName;
-        }
-        return path.substring(0, index);
-    }
-
-    @SuppressWarnings({"UnusedDeclaration"})
-    private static String getParameter(String path, String paramName) {
-        String fileName = PathUtils.getFileName(path);
-        String paramQueryPrefix = paramName + "=";
-        int mdStart = fileName.lastIndexOf(paramQueryPrefix);
-        if (mdStart > 0) {
-            int mdEnd = fileName.indexOf('&', mdStart);
-            String paramValue = fileName.substring(mdStart + paramQueryPrefix.length(),
-                    mdEnd > 0 ? mdEnd : fileName.length());
-            return paramValue;
-        }
-        return null;
-    }
-
-    /**
-     * Recieves a metadata container path (/a/b/c.pom) and a metadata name (maven-metadata.xml) and returns the whole
-     * path - "/a/b/c.pom:maven-metadata.xml".
-     *
-     * @param containerPath Path of metadata container
-     * @param metadataName  Name of metadata item
-     * @return String - complete path to metadata
-     */
-    @Deprecated
-    public static String getMetadataPath(String containerPath, String metadataName) {
-        if ((containerPath == null) || (metadataName == null)) {
-            throw new IllegalArgumentException("Container path and metadata name cannot be null.");
-        }
-        String metadataPath = containerPath + METADATA_PREFIX + metadataName;
-        return metadataPath;
-    }
-
-    /**
-     * @param classFilePath Path to a java class file (ends with .class)
-     * @return Path of the matching java source path (.java).
-     */
-    public static String javaSourceNameFromClassName(String classFilePath) {
-        String classFileName = FilenameUtils.getName(classFilePath);
-        if (!"class".equals(FilenameUtils.getExtension(classFileName))) {
-            return classFilePath;
-        }
-
-        String javaFileName;
-        if (classFileName.indexOf('$') > 0) {
-            // it's a subclass, take the first part (the main class name)
-            javaFileName = classFileName.substring(0, classFileName.indexOf('$')) + ".java";
-        } else {
-            javaFileName = classFileName.replace(".class", ".java");
-        }
-
-        String javaFilePath = FilenameUtils.getFullPath(classFilePath) + javaFileName;
-        return javaFilePath;
-    }
-
-    /**
-     * @param fileName The file name
-     * @return True if the filename represents a viewable file (ie, text based)
-     */
-    public static boolean isViewable(String fileName) {
-        MimeType contentType = NamingUtils.getMimeType(fileName);
-        return contentType.isViewable();
-    }
-
-    public static RepoPath getLockingTargetRepoPath(RepoPath repoPath) {
-        String path = repoPath.getPath();
-        if (isMetadata(path)) {
-            String fsItemPath = getMetadataParentPath(path);
-            return InternalRepoPathFactory.create(repoPath.getRepoKey(), fsItemPath);
-        } else {
-            return repoPath;
-        }
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/mime/version/MimeTypesVersion.java b/base/config/src/main/java/org/artifactory/mime/version/MimeTypesVersion.java
deleted file mode 100644
index 1ec8cd4..0000000
--- a/base/config/src/main/java/org/artifactory/mime/version/MimeTypesVersion.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime.version;
-
-import com.google.common.collect.Lists;
-import org.artifactory.mime.version.converter.LatestVersionConverter;
-import org.artifactory.mime.version.converter.v1.XmlIndexedConverter;
-import org.artifactory.mime.version.converter.v2.AscMimeTypeConverter;
-import org.artifactory.mime.version.converter.v3.ArchivesIndexConverter;
-import org.artifactory.mime.version.converter.v3.NuPkgMimeTypeConverter;
-import org.artifactory.mime.version.converter.v4.GemMimeTypeConverter;
-import org.artifactory.mime.version.converter.v5.JsonMimeTypeConverter;
-import org.artifactory.mime.version.converter.v6.DebianMimeTypeConverter;
-import org.artifactory.mime.version.converter.v7.ArchiveMimeTypeConverter;
-import org.artifactory.version.ArtifactoryVersion;
-import org.artifactory.version.SubConfigElementVersion;
-import org.artifactory.version.VersionComparator;
-import org.artifactory.version.XmlConverterUtils;
-import org.artifactory.version.converter.XmlConverter;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * A mimetypes.xml version.
- *
- * @author Yossi Shaul
- */
-public enum MimeTypesVersion implements SubConfigElementVersion {
-    v1(ArtifactoryVersion.v223, ArtifactoryVersion.v225, new XmlIndexedConverter()),
-    v2(ArtifactoryVersion.v230, ArtifactoryVersion.v242, new AscMimeTypeConverter()),
-    v3(ArtifactoryVersion.v250, ArtifactoryVersion.v250, new ArchivesIndexConverter(), new NuPkgMimeTypeConverter()),
-    v4(ArtifactoryVersion.v251, ArtifactoryVersion.v302, new GemMimeTypeConverter()),
-    v5(ArtifactoryVersion.v303, ArtifactoryVersion.v3111, new JsonMimeTypeConverter()),
-    v6(ArtifactoryVersion.v320, ArtifactoryVersion.v322, new DebianMimeTypeConverter()),
-    v7(ArtifactoryVersion.v330, ArtifactoryVersion.v402, new ArchiveMimeTypeConverter()),
-    v8(ArtifactoryVersion.v410, ArtifactoryVersion.getCurrent());
-
-    private final XmlConverter[] converters;
-
-    /**
-     * @param start      First Artifactory version that this version was supported.
-     * @param end        Last Artifactory version that this version was support.
-     * @param converters List of converters to apply for conversion to the next config version.
-     */
-    MimeTypesVersion(ArtifactoryVersion start, ArtifactoryVersion end, XmlConverter... converters) {
-        this.converters = converters;
-    }
-
-    /**
-     * Convert an xml string to this instance mime type version.
-     *
-     * @param mimeTypesXmlAsString The mime types xml string to convert
-     * @return XML string converted to this version
-     */
-    public String convert(String mimeTypesXmlAsString) {
-        // First create the list of converters to apply
-        List<XmlConverter> converters = Lists.newArrayList();
-
-        // All converters of versions above me needs to be executed in sequence
-        MimeTypesVersion[] versions = MimeTypesVersion.values();
-        for (MimeTypesVersion version : versions) {
-            if (version.ordinal() >= ordinal() && version.converters != null) {
-                converters.addAll(Arrays.asList(version.converters));
-            }
-        }
-        // Always add the converter that changes the version string
-        converters.add(new LatestVersionConverter());
-
-        return XmlConverterUtils.convert(converters, mimeTypesXmlAsString);
-    }
-
-    @Override
-    public VersionComparator getComparator() {
-        throw new UnsupportedOperationException("stop being lazy and implement me");
-    }
-
-    /**
-     * @param mimeTypesXmlAsString The string representation of the mimetypes.xml file
-     * @return The {@link MimeTypesVersion} matching the xml content.
-     */
-    public static MimeTypesVersion findVersion(String mimeTypesXmlAsString) {
-        final String VERSION_ATT = "<mimetypes version=\"";
-        int versionIdx = mimeTypesXmlAsString.indexOf(VERSION_ATT);
-        if (versionIdx < 0) {
-            throw new IllegalArgumentException("Unidentified mimetypes configuration");
-        }
-
-        int versionStartIndex = versionIdx + VERSION_ATT.length();
-        int versionEndIndex = getVersionEndIndex(mimeTypesXmlAsString, versionStartIndex);
-        int version = Integer.parseInt(mimeTypesXmlAsString.substring(versionStartIndex, versionEndIndex));
-        if (MimeTypesVersion.values().length < version) {
-            throw new IllegalArgumentException("Version " + version + " no found.");
-        }
-        return MimeTypesVersion.values()[version - 1];
-    }
-
-    /**
-     * Having version start index, locates version end index
-     * in mimeTypesXmlAsString
-     *
-     * @param mimeTypesXmlAsString
-     * @param pointer version start index
-     *
-     * @return version end index
-     *
-     * @throws IllegalArgumentException if pointer reaches size of mimeTypesXmlAsString
-     *                                  without finding version closing '>' character
-     */
-    private static int getVersionEndIndex(String mimeTypesXmlAsString, int pointer) {
-        while(mimeTypesXmlAsString.charAt(pointer) != '>') {
-            pointer++;
-            if (pointer >= mimeTypesXmlAsString.length())
-                throw new IllegalArgumentException("MimeTypes version in malformed");
-        }
-        return --pointer;
-    }
-
-    public static MimeTypesVersion getCurrent() {
-        MimeTypesVersion[] versions = MimeTypesVersion.values();
-        return versions[versions.length - 1];
-    }
-
-    public boolean isCurrent() {
-        return this == getCurrent();
-    }
-
-    /**
-     * @return The version string associated to this version (the one written in the xml file)
-     */
-    public String versionString() {
-        return name().substring(1);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/mime/version/converter/LatestVersionConverter.java b/base/config/src/main/java/org/artifactory/mime/version/converter/LatestVersionConverter.java
deleted file mode 100644
index 63082a0..0000000
--- a/base/config/src/main/java/org/artifactory/mime/version/converter/LatestVersionConverter.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime.version.converter;
-
-import org.artifactory.mime.version.MimeTypesVersion;
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-
-/**
- * This converter changes the version of the miemetypes.xml file. This is a special converter which should execute
- * at the end of conversion from any version.
- *
- * @author Yossi Shaul
- */
-public class LatestVersionConverter implements XmlConverter {
-    @Override
-    public void convert(Document doc) {
-        Element rootElement = doc.getRootElement();
-        // take the latest version from the current mime type version
-        rootElement.setAttribute("version", MimeTypesVersion.getCurrent().versionString());
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/mime/version/converter/MimeTypeConverterBase.java b/base/config/src/main/java/org/artifactory/mime/version/converter/MimeTypeConverterBase.java
deleted file mode 100644
index ae55823..0000000
--- a/base/config/src/main/java/org/artifactory/mime/version/converter/MimeTypeConverterBase.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime.version.converter;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.mime.MimeType;
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Base class for mime types converters.
- *
- * @author Yossi Shaul
- */
-public abstract class MimeTypeConverterBase implements XmlConverter {
-
-    protected void addIfNotExist(Document doc, MimeType newType) {
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        List mimetypes = rootElement.getChildren("mimetype", namespace);
-        if (mimetypes == null) {
-            return;
-        }
-
-        Element typeElement = getByType(mimetypes, namespace, newType.getType());
-        if (typeElement == null) {
-            typeElement = new Element("mimetype", namespace);
-            typeElement.setAttribute("type", newType.getType());
-            typeElement.setAttribute("extensions", buildExtensionsString(newType));
-            if (StringUtils.isNotBlank(newType.getCss())) {
-                typeElement.setAttribute("css", newType.getCss());
-            }
-            if (newType.isArchive()) {
-                typeElement.setAttribute("archive", newType.isArchive() + "");
-            }
-            if (newType.isIndex()) {
-                typeElement.setAttribute("index", newType.isIndex() + "");
-            }
-            if (newType.isViewable()) {
-                typeElement.setAttribute("viewable", newType.isViewable() + "");
-            }
-            rootElement.addContent(typeElement);
-        }
-    }
-
-    private String buildExtensionsString(MimeType newType) {
-        StringBuilder sb = new StringBuilder();
-        Iterator<String> extIter = newType.getExtensions().iterator();
-        while (extIter.hasNext()) {
-            sb.append(extIter.next());
-            if (extIter.hasNext()) {
-                sb.append(", ");
-            }
-        }
-        return sb.toString();
-    }
-
-    private Element getByType(List mimetypes, Namespace namespace, String type) {
-        for (Object mimetype : mimetypes) {
-            Element mimeTypeElement = (Element) mimetype;
-            String typeValue = mimeTypeElement.getAttributeValue("type", namespace);
-            if (type.equals(typeValue)) {
-                return mimeTypeElement;
-            }
-        }
-        return null;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/mime/version/converter/v1/XmlIndexedConverter.java b/base/config/src/main/java/org/artifactory/mime/version/converter/v1/XmlIndexedConverter.java
deleted file mode 100644
index 49c4bce..0000000
--- a/base/config/src/main/java/org/artifactory/mime/version/converter/v1/XmlIndexedConverter.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime.version.converter.v1;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Attribute;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-
-import java.util.List;
-
-/**
- * This converter renames the "xml" attribute to "index" and changes the new property value to false for all files
- * except pom and ivy files (this is the default as of version 2 of the mime types file).
- *
- * @author Yossi Shaul
- */
-public class XmlIndexedConverter implements XmlConverter {
-
-    @Override
-    public void convert(Document doc) {
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        List mimetypes = rootElement.getChildren("mimetype", namespace);
-        // make sure there are no more 'xml' attributes
-        for (Object mimetype : mimetypes) {
-            Element mimeTypeElement = (Element) mimetype;
-            Attribute xmlAttribute = mimeTypeElement.getAttribute("xml", namespace);
-            if (xmlAttribute != null) {
-                // rename to index
-                xmlAttribute.setName("index");
-                // change to false unless maven of ivy
-                String type = mimeTypeElement.getAttributeValue("type");
-                if (!"application/x-maven-pom+xml".equals(type) && !"application/x-ivy+xml".equals(type)) {
-                    xmlAttribute.setValue("false");
-                }
-            }
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/mime/version/converter/v2/AscMimeTypeConverter.java b/base/config/src/main/java/org/artifactory/mime/version/converter/v2/AscMimeTypeConverter.java
deleted file mode 100644
index 3c60877..0000000
--- a/base/config/src/main/java/org/artifactory/mime/version/converter/v2/AscMimeTypeConverter.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime.version.converter.v2;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-
-import java.util.List;
-
-/**
- * This converter adds the .asc extension to the "text/plain" mimetype
- *
- * @author Shay Yaakov
- */
-public class AscMimeTypeConverter implements XmlConverter {
-
-    @Override
-    public void convert(Document doc) {
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        List mimetypes = rootElement.getChildren("mimetype", namespace);
-        // find "text/plain" mimetype
-        if (mimetypes != null) {
-            for (Object mimetype : mimetypes) {
-                Element mimeTypeElement = (Element) mimetype;
-                String type = mimeTypeElement.getAttributeValue("type");
-                if ("text/plain".equals(type)) {
-                    String extensions = mimeTypeElement.getAttributeValue("extensions", namespace);
-                    if (StringUtils.isBlank(extensions)) {
-                        extensions = "";
-                    } else {
-                        if (!extensions.endsWith(",") && !extensions.endsWith(", ")) {
-                            extensions += ", ";
-                        }
-                    }
-                    mimeTypeElement.setAttribute("extensions", extensions + "asc");
-                    break;
-                }
-            }
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/mime/version/converter/v3/ArchivesIndexConverter.java b/base/config/src/main/java/org/artifactory/mime/version/converter/v3/ArchivesIndexConverter.java
deleted file mode 100644
index 0fd0726..0000000
--- a/base/config/src/main/java/org/artifactory/mime/version/converter/v3/ArchivesIndexConverter.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime.version.converter.v3;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-
-import java.util.List;
-
-/**
- * Adds 'index="true"' attribute to all the mime types that marked as archive.
- *
- * @author Yossi Shaul
- */
-public class ArchivesIndexConverter implements XmlConverter {
-    @Override
-    public void convert(Document doc) {
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        List mimetypes = rootElement.getChildren("mimetype", namespace);
-        for (Object mimetype : mimetypes) {
-            Element mimeTypeElement = (Element) mimetype;
-            String archiveValue = mimeTypeElement.getAttributeValue("archive", namespace);
-            if ("true".equals(archiveValue)) {
-                // add index attribute
-                mimeTypeElement.setAttribute("index", "true", namespace);
-            }
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/mime/version/converter/v3/NuPkgMimeTypeConverter.java b/base/config/src/main/java/org/artifactory/mime/version/converter/v3/NuPkgMimeTypeConverter.java
deleted file mode 100644
index 2ebb917..0000000
--- a/base/config/src/main/java/org/artifactory/mime/version/converter/v3/NuPkgMimeTypeConverter.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime.version.converter.v3;
-
-import org.artifactory.mime.MimeType;
-import org.artifactory.mime.MimeTypeBuilder;
-import org.artifactory.mime.version.converter.MimeTypeConverterBase;
-import org.jdom2.Document;
-
-/**
- * Adds the following entries to the mimetypes file if they don't exist:
- * <pre>
- *   <mimetype type="application/x-nupkg" extensions="nupkg" archive="true" index="true" css="nupkg"/>
- *   <mimetype type="application/x-nuspec+xml" extensions="nuspec" viewable="true" syntax="xml" css="xml"/>
- * </pre>
- *
- * @author Yossi Shaul
- */
-public class NuPkgMimeTypeConverter extends MimeTypeConverterBase {
-    @Override
-    public void convert(Document doc) {
-
-        MimeType nupkg = new MimeTypeBuilder("application/x-nupkg")
-                .extensions("nupkg").css("nupkg").archive(true).index(true).build();
-        addIfNotExist(doc, nupkg);
-
-        MimeType nupspec = new MimeTypeBuilder("application/x-nuspec+xml")
-                .extensions("nuspec").css("xml").syntax("xml").viewable(true).build();
-        addIfNotExist(doc, nupspec);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/mime/version/converter/v4/GemMimeTypeConverter.java b/base/config/src/main/java/org/artifactory/mime/version/converter/v4/GemMimeTypeConverter.java
deleted file mode 100644
index b65ca57..0000000
--- a/base/config/src/main/java/org/artifactory/mime/version/converter/v4/GemMimeTypeConverter.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime.version.converter.v4;
-
-import org.artifactory.mime.MimeType;
-import org.artifactory.mime.MimeTypeBuilder;
-import org.artifactory.mime.version.converter.MimeTypeConverterBase;
-import org.jdom2.Document;
-
-/**
- * Adds the following entries to the mimetypes file if they don't exist:
- * <pre>
- *    <mimetype type="application/x-rubygems" extensions="gem" css="gem"/>
- *    <mimetype type="application/x-ruby-marshal" extensions="rz" css="ruby-marshal"/>
- * </pre>
- *
- * @author Yossi Shaul
- */
-public class GemMimeTypeConverter extends MimeTypeConverterBase {
-    @Override
-    public void convert(Document doc) {
-        MimeType gemType = new MimeTypeBuilder("application/x-rubygems").extensions("gem").css("gem").build();
-        addIfNotExist(doc, gemType);
-
-        MimeType rzType = new MimeTypeBuilder("application/x-ruby-marshal").extensions("rz").build();
-        addIfNotExist(doc, rzType);
-    }
-
-}
diff --git a/base/config/src/main/java/org/artifactory/mime/version/converter/v5/JsonMimeTypeConverter.java b/base/config/src/main/java/org/artifactory/mime/version/converter/v5/JsonMimeTypeConverter.java
deleted file mode 100644
index 29bbb91..0000000
--- a/base/config/src/main/java/org/artifactory/mime/version/converter/v5/JsonMimeTypeConverter.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime.version.converter.v5;
-
-import org.artifactory.mime.MimeType;
-import org.artifactory.mime.MimeTypeBuilder;
-import org.artifactory.mime.version.converter.MimeTypeConverterBase;
-import org.jdom2.Document;
-
-/**
- * Adds the following entries to the mimetypes file if they don't exist:
- * <pre>
- *     <mimetype type="application/json" extensions="json" viewable="true" syntax="javascript"/>
- * </pre>
- *
- * @author Yossi Shaul
- */
-public class JsonMimeTypeConverter extends MimeTypeConverterBase {
-    @Override
-    public void convert(Document doc) {
-        MimeType json = new MimeTypeBuilder("application/json").extensions("json").viewable(true).syntax("javascript")
-                .build();
-        addIfNotExist(doc, json);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/mime/version/converter/v6/DebianMimeTypeConverter.java b/base/config/src/main/java/org/artifactory/mime/version/converter/v6/DebianMimeTypeConverter.java
deleted file mode 100644
index 7286265..0000000
--- a/base/config/src/main/java/org/artifactory/mime/version/converter/v6/DebianMimeTypeConverter.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime.version.converter.v6;
-
-import org.artifactory.mime.MimeType;
-import org.artifactory.mime.MimeTypeBuilder;
-import org.artifactory.mime.version.converter.MimeTypeConverterBase;
-import org.jdom2.Document;
-
-/**
- * Adds the following entries to the mimetypes file if they don't exist:
- * <pre>
- *         <mimetype type="application/x-debian-package" extensions="deb" css="deb"/>
- * </pre>
- *
- * @author Yossi Shaul
- */
-public class DebianMimeTypeConverter extends MimeTypeConverterBase {
-    @Override
-    public void convert(Document doc) {
-        MimeType json = new MimeTypeBuilder("application/x-debian-package").extensions("deb").css("deb")
-                .build();
-        addIfNotExist(doc, json);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/mime/version/converter/v7/ArchiveMimeTypeConverter.java b/base/config/src/main/java/org/artifactory/mime/version/converter/v7/ArchiveMimeTypeConverter.java
deleted file mode 100644
index 1078329..0000000
--- a/base/config/src/main/java/org/artifactory/mime/version/converter/v7/ArchiveMimeTypeConverter.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime.version.converter.v7;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- * Adds the following entries to the mimetypes file if they don't exist:
- * <pre>
- *         <mimetype type="application/x-gzip" extensions="tgz" css="gz"/>
- * </pre>
- * ג
- *
- * @author Chen Keinan
- */
-public class ArchiveMimeTypeConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(ArchiveMimeTypeConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        List mimetypes = rootElement.getChildren("mimetype", namespace);
-        log.info("updating mime-types:  application/x-gzip and application/x-tar , setting archive value to true");
-        for (Object mimetype : mimetypes) {
-            Element mimeTypeElement = (Element) mimetype;
-            String type = mimeTypeElement.getAttributeValue("type", namespace);
-            // update gzip and tar archive attribute to true
-            if ("application/x-gzip".equals(type) || "application/x-tar".equals(type)) {
-                // set archive attribute to true
-                mimeTypeElement.getAttribute("archive").setValue("true");
-            }
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/spring/SpringConfigPaths.java b/base/config/src/main/java/org/artifactory/spring/SpringConfigPaths.java
deleted file mode 100644
index ccc7aeb..0000000
--- a/base/config/src/main/java/org/artifactory/spring/SpringConfigPaths.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.spring;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import org.artifactory.addon.AddonInfo;
-import org.artifactory.addon.AddonState;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Yoav Landman
- */
-public class SpringConfigPaths {
-
-    private static final Logger log = LoggerFactory.getLogger(SpringConfigPaths.class);
-
-    private final ImmutableList<String> paths;
-    private final ImmutableMap<String, AddonInfo> installedAddonPaths;
-
-    public SpringConfigPaths(List<String> paths, Map<String, AddonInfo> installedAddonPaths) {
-        this.paths = ImmutableList.copyOf(paths);
-        this.installedAddonPaths = ImmutableMap.copyOf(installedAddonPaths);
-    }
-
-    public ImmutableMap<String, AddonInfo> getInstalledAddonPaths() {
-        return installedAddonPaths;
-    }
-
-    /**
-     * @return An array of all the spring xml configuration paths. This includes the standard configuration paths and
-     * the enabled addons configuration paths.
-     */
-    public String[] getAllPaths() {
-        List<String> allPaths = new ArrayList<>();
-        allPaths.addAll(paths);
-        for (AddonInfo info : installedAddonPaths.values()) {
-            AddonState addonState = info.getAddonState();
-            if (addonState.equals(AddonState.ACTIVATED) || addonState.equals(AddonState.INACTIVATED)) {
-                allPaths.add(info.getAddonPath());
-            }
-        }
-        String[] pathsToReturn = allPaths.toArray(new String[allPaths.size()]);
-        log.debug("Spring configuration paths: " + Arrays.toString(pathsToReturn));
-        return pathsToReturn;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/spring/SpringConfigResourceLoader.java b/base/config/src/main/java/org/artifactory/spring/SpringConfigResourceLoader.java
deleted file mode 100644
index 7c43040..0000000
--- a/base/config/src/main/java/org/artifactory/spring/SpringConfigResourceLoader.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.spring;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonInfo;
-import org.artifactory.addon.AddonState;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.common.property.ArtifactorySystemProperties;
-import org.artifactory.util.PathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.TreeMap;
-
-/**
- * This class acts as a resource locator for the spring configuration files. It recieves a request for the resources
- * paths and returns it (if found). It will first check if a path is specified in the ConstantsValue class, and if it
- * cannot find it there, (not specified, bad path, non-existent file, etc.) it will try to find it in the resources
- * folder (META-INF/spring).
- *
- * @author Noam Tenne
- */
-public abstract class SpringConfigResourceLoader {
-    private static final Logger log = LoggerFactory.getLogger(SpringConfigResourceLoader.class);
-
-    private static final String FORWARD_SLASH = "/";
-    private static final String FILE_PREFIX = "file:";
-
-    private SpringConfigResourceLoader() {
-        // utility class
-    }
-
-    /**
-     * Returns a String[] of the spring configuration files urls.
-     *
-     * @param artifactoryHome Artifactory home holding the config directory
-     * @return String[] - Spring configuration files urls
-     */
-    public static SpringConfigPaths getConfigurationPaths(ArtifactoryHome artifactoryHome) {
-        //Load the default config locations
-        String[] springConfigs = {"applicationContext.xml", "scheduling.xml", "security.xml",
-                "addons.xml", "interceptors.xml"};
-        List<String> paths = new ArrayList<>();
-
-        for (String springConfig : springConfigs) {
-            String path = getPath(springConfig, artifactoryHome);
-            paths.add(path);
-        }
-        Collections.sort(paths);
-
-        Map<String, AddonInfo> addonContextPaths = loadEnabledAddons(artifactoryHome.getArtifactoryProperties());
-
-        SpringConfigPaths configPaths = new SpringConfigPaths(paths, addonContextPaths);
-        return configPaths;
-    }
-
-    private static Map<String, AddonInfo> loadEnabledAddons(ArtifactorySystemProperties props) {
-        List<String> disabledAddons = Lists.newArrayList();
-        if (StringUtils.isNotBlank(props.getProperty(ConstantValues.disabledAddons))) {
-            String[] disabledAddonsArr = props.getProperty(ConstantValues.disabledAddons).split(",");
-            disabledAddons = Lists.newArrayListWithCapacity(disabledAddonsArr.length);
-            for (String disabledAddon : disabledAddonsArr) {
-                disabledAddons.add(disabledAddon.trim());
-            }
-            log.info("{}={}", ConstantValues.disabledAddons.getPropertyName(), disabledAddons);
-        }
-
-        // disable HA addon when HA is not configured
-        if (!ArtifactoryHome.get().isHaConfigured() && !disabledAddons.contains("ha")) {
-            disabledAddons.add("ha");
-            log.debug("Disabling HA addon because environment is not configured properly");
-        }
-
-        try {
-            Enumeration<URL> addonsPropsUrls =
-                    Thread.currentThread().getContextClassLoader().getResources("META-INF/addon.properties");
-            Map<String, AddonInfo> addonsContextPathsByAddonName = new TreeMap<>();
-            while (addonsPropsUrls.hasMoreElements()) {
-                URL addonPropsUrl = addonsPropsUrls.nextElement();
-                log.debug("Inspecting addon properties: {}", addonPropsUrl.toExternalForm());
-                Properties addonProperties = new Properties();
-                addonProperties.load(addonPropsUrl.openStream());
-                String addonName = addonProperties.getProperty("name");
-                String addonDisplayName = addonProperties.getProperty("display.name");
-                long displayOrdinal = -1;
-                try {
-                    String property = addonProperties.getProperty("display.ordinal");
-                    if (StringUtils.isNotBlank(property)) {
-                        displayOrdinal = Long.parseLong(property);
-                    }
-                } catch (Exception e) {
-                    log.debug("Unable to resolve 'display.ordinal' property of the addon '" + addonName + "'.", e);
-                    displayOrdinal = -1;
-                }
-
-                if (addonName != null) {
-                    String enabledAddon = PathUtils.getParent(addonPropsUrl.toExternalForm()) + "/addon.xml";
-                    AddonState state;
-                    if (!disabledAddons.contains(addonName)) {
-                        // addon is enabled, add it's addon.xml to the spring context
-                        log.debug("Adding enabled addon: {}", addonName);
-                        state = AddonState.INACTIVATED; //  if license is installed it will be activated by the manager
-                    } else if ("ha".equals(addonName) && !ArtifactoryHome.get().isHaConfigured()) {
-                        log.debug("Adding not configured HA addon");
-                        state = AddonState.NOT_CONFIGURED;
-                    } else {
-                        log.debug("Adding disabled addon: {}", addonName);
-                        state = AddonState.DISABLED;
-                    }
-                    addonsContextPathsByAddonName.put(addonName, new AddonInfo(addonName, addonDisplayName,
-                            enabledAddon, state, addonProperties, displayOrdinal));
-                }
-            }
-            return addonsContextPathsByAddonName;
-        } catch (IOException e) {
-            throw new RuntimeException("Failed to load addons", e);
-        }
-    }
-
-    /**
-     * Returns a resources URL via name. Will look in path specified in ConstantsValue (if specified) Or in
-     * META-INF/spring
-     *
-     * @param resourceName    The name of the wanted resource
-     * @param artifactoryHome Artifactory home instance
-     * @return String - The url of the resource
-     */
-    private static String getPath(String resourceName, ArtifactoryHome artifactoryHome) {
-        String springConfPath = artifactoryHome.getArtifactoryProperties().getProperty(ConstantValues.springConfigDir);
-        if (PathUtils.hasText(springConfPath)) {
-            springConfPath = springConfPath.trim();
-
-            if ((!springConfPath.startsWith(FORWARD_SLASH)) &&
-                    (!springConfPath.startsWith(FILE_PREFIX))) {
-                springConfPath = artifactoryHome.getEtcDir().getAbsoluteFile() + FORWARD_SLASH + springConfPath;
-            }
-
-            File requestedResource = new File(springConfPath, resourceName);
-            if (requestedResource.exists()) {
-                try {
-                    URL url = requestedResource.toURI().toURL();
-                    if (url != null) {
-                        return url.toExternalForm();
-                    }
-                } catch (MalformedURLException e) {
-                    throw new RuntimeException(
-                            "Given url at: " + requestedResource.getAbsolutePath() + " is malformed");
-                }
-            }
-        }
-
-        return "/META-INF/spring/" + resourceName;
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/util/AlreadyExistsException.java b/base/config/src/main/java/org/artifactory/util/AlreadyExistsException.java
deleted file mode 100644
index 6b32d06..0000000
--- a/base/config/src/main/java/org/artifactory/util/AlreadyExistsException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-/**
- * Thrown when calling a create/add method and the target object already exists.
- *
- * @author Yossi Shaul
- */
-public class AlreadyExistsException extends ExistenceException {
-    public AlreadyExistsException(String message) {
-        super(message);
-    }
-
-    public AlreadyExistsException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/util/DoesNotExistException.java b/base/config/src/main/java/org/artifactory/util/DoesNotExistException.java
deleted file mode 100644
index 1c96878..0000000
--- a/base/config/src/main/java/org/artifactory/util/DoesNotExistException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-/**
- * Thrown when calling an update method and the target object does not exist.
- *
- * @author Noam Tenne
- */
-public class DoesNotExistException extends ExistenceException {
-    public DoesNotExistException(String message) {
-        super(message);
-    }
-
-    public DoesNotExistException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/util/EmailException.java b/base/config/src/main/java/org/artifactory/util/EmailException.java
deleted file mode 100644
index b14405c..0000000
--- a/base/config/src/main/java/org/artifactory/util/EmailException.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-/**
- * Thrown when an error occurs while trying to send an e-mail
- *
- * @author Noam Tenne
- */
-public class EmailException extends RuntimeException {
-
-    public EmailException(String message) {
-        super(message);
-    }
-
-    public EmailException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/util/ExceptionUtils.java b/base/config/src/main/java/org/artifactory/util/ExceptionUtils.java
deleted file mode 100644
index fee8613..0000000
--- a/base/config/src/main/java/org/artifactory/util/ExceptionUtils.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-/**
- * @author Yoav Landman
- */
-public abstract class ExceptionUtils {
-    private ExceptionUtils() {
-        // utility class
-    }
-
-    /**
-     * Unwrap an exception
-     *
-     * @param throwable     the throwable to unwrap
-     * @param typesToUnwrap the types to keep unwrapping
-     * @return The wrapped cause
-     */
-    public static Throwable unwrapThrowablesOfTypes(Throwable throwable,
-            Class<? extends Throwable>... typesToUnwrap) {
-        if (!isTypeOf(throwable, typesToUnwrap)) {
-            return throwable;
-        }
-        Throwable cause = throwable.getCause();
-        if (cause != null) {
-            cause = unwrapThrowablesOfTypes(cause, typesToUnwrap);
-        } else {
-            cause = throwable;
-        }
-        return cause;
-    }
-
-    /**
-     * Unwrap an exception
-     *
-     * @param throwable  the throwable to examine
-     * @param causeTypes the desired cause types to find
-     * @return The wrapped cause or null if not found
-     */
-    public static Throwable getCauseOfTypes(Throwable throwable, Class<? extends Throwable>... causeTypes) {
-        if (throwable != null) {
-            if (isTypeOf(throwable, causeTypes)) {
-                return throwable;
-            } else {
-                return getCauseOfTypes(throwable.getCause(), causeTypes);
-            }
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * Returns the root cause of the exception. If the input throwable has no cause will return the input.
-     *
-     * @param throwable the throwable to examine
-     * @return The root cause or itself if has no cause
-     */
-    public static Throwable getRootCause(Throwable throwable) {
-        Throwable cause = throwable;
-        while (cause.getCause() != null) {
-            cause = cause.getCause();
-        }
-        return cause;
-    }
-
-    public static CharSequence getStackTrace(Thread thread) {
-        StringBuilder b = new StringBuilder();
-        StackTraceElement[] elements = thread.getStackTrace();
-        for (StackTraceElement element : elements) {
-            b.append(element.toString()).append('\n');
-        }
-        return b;
-    }
-
-    private static boolean isTypeOf(Throwable source, Class<? extends Throwable>... targetTypes) {
-        Class<? extends Throwable> sourceType = source.getClass();
-        for (Class<? extends Throwable> targetType : targetTypes) {
-            if (targetType.isAssignableFrom(sourceType)) {
-                return true;
-            }
-        }
-        return false;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/util/ExistenceException.java b/base/config/src/main/java/org/artifactory/util/ExistenceException.java
deleted file mode 100644
index b41ef23..0000000
--- a/base/config/src/main/java/org/artifactory/util/ExistenceException.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-/**
- * Base class for existence exceptions
- *
- * @author Noam Tenne
- */
-public abstract class ExistenceException extends RuntimeException {
-
-    public ExistenceException(String message) {
-        super(message);
-    }
-
-    public ExistenceException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/util/Files.java b/base/config/src/main/java/org/artifactory/util/Files.java
deleted file mode 100644
index 524314a..0000000
--- a/base/config/src/main/java/org/artifactory/util/Files.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import com.google.common.collect.Lists;
-import org.artifactory.common.ConstantValues;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Path;
-import java.util.Collections;
-import java.util.List;
-import java.util.Random;
-
-/**
- * User: freds Date: Jun 25, 2008 Time: 12:11:46 AM
- */
-public abstract class Files {
-    private static final Logger log = LoggerFactory.getLogger(Files.class);
-    private static final Random intGenerator = new Random(System.currentTimeMillis());
-
-    private Files() {
-        // utility class
-    }
-
-    public static String getDecodedFileUrl(File file) {
-        return "file:" + file.toURI().getPath();
-    }
-
-    /**
-     * Rename the oldFile to oldFileName.original.XX.extension, where XX is a rolling number for files with identical
-     * names in the oldFile.getParent() directory. Then Rename the newFile to oldFile.
-     *
-     * @param oldFile
-     * @param newdFile
-     */
-    public static void switchFiles(File oldFile, File newdFile) {
-        String exceptionMsg = "Cannot switch files '" + oldFile.getAbsolutePath() + "' to '" +
-                newdFile.getAbsolutePath() + "'. '";
-        if (!oldFile.isFile()) {
-            throw new IllegalArgumentException(exceptionMsg + oldFile.getAbsolutePath() + "' is not a file.");
-        }
-        if (!newdFile.exists()) {
-            // Just rename the new file to the old name
-            try {
-                org.apache.commons.io.FileUtils.moveFile(oldFile, newdFile);
-            } catch (IOException e) {
-                log.warn("Cannot rename {} to {}: {}", oldFile, newdFile, e.getMessage());
-            }
-            return;
-        }
-        if (!newdFile.isFile()) {
-            //renameTo() of open files does not work on windows (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6213298)
-            throw new IllegalArgumentException(exceptionMsg + newdFile.getAbsolutePath() + "' is not a file.");
-        }
-        //Else is
-        File dir = newdFile.getParentFile();
-        String fileName = newdFile.getName();
-        int lastDot = fileName.lastIndexOf('.');
-        final String extension;
-        final String fileNameNoExt;
-        if (lastDot <= 0) {
-            extension = "";
-            fileNameNoExt = fileName;
-        } else {
-            extension = fileName.substring(lastDot + 1);
-            fileNameNoExt = fileName.substring(0, lastDot);
-        }
-
-        final String fileNameNoNumber = fileNameNoExt + ".";
-        File backupOrigFileName = new File(dir, fileNameNoNumber + extension);
-        if (backupOrigFileName.exists()) {
-            // Rolling files
-            String[] allOrigFiles = dir.list(new FilenameFilter() {
-                @Override
-                public boolean accept(File dir, String name) {
-                    return name.startsWith(fileNameNoExt) && name.endsWith(extension) &&
-                            name.length() > fileNameNoNumber.length() + extension.length();
-                }
-            });
-            int maxNb = 1;
-            for (String origFile : allOrigFiles) {
-                try {
-                    String middle = origFile.substring(fileNameNoNumber.length(),
-                            origFile.length() - extension.length() - 1);
-                    int value = Integer.parseInt(middle);
-                    if (value >= maxNb) {
-                        maxNb = value + 1;
-                    }
-                } catch (Exception e) {
-                    log.warn("Minor issue in file name '" + origFile + "':" + e.getMessage());
-                }
-            }
-            backupOrigFileName = new File(dir, fileNameNoNumber + maxNb + ".xml");
-        }
-        File destFile = new File(dir, fileName);
-        try {
-            org.apache.commons.io.FileUtils.moveFile(newdFile, backupOrigFileName);
-            org.apache.commons.io.FileUtils.moveFile(oldFile, destFile);
-        } catch (IOException e) {
-            log.warn("Cannot rename {} to {} or {} to {}: {}",
-                    newdFile, backupOrigFileName, oldFile, destFile, e.getMessage());
-        }
-    }
-
-    public static File createRandomDir(File parentDir, String prefix) {
-        File dir = new File(parentDir, prefix + intGenerator.nextInt());
-        if (dir.exists()) {
-            //Either we did not clean up or are VERY unlucky
-            throw new RuntimeException("Directory " + dir.getAbsolutePath() + " already exists!");
-        }
-        if (!dir.mkdirs()) {
-            throw new RuntimeException("Failed to create directory '" + dir.getPath() + "'.");
-        }
-        return dir;
-    }
-
-    /**
-     * Deletes all empty directories (directories that don't contain any files) under the input directory. The input
-     * directory will not be deleted.
-     *
-     * @param directory The directory to cleanup
-     */
-    public static void cleanupEmptyDirectories(File directory) {
-        cleanupEmptyDirectories(directory, false);
-    }
-
-    /**
-     * Deletes all empty directories (directories that don't contain any files) under the input directory.
-     *
-     * @param directory            The directory to cleanup
-     * @param includeBaseDirectory if true the input directory will also be deleted if it is empty
-     */
-    private static void cleanupEmptyDirectories(File directory, boolean includeBaseDirectory) {
-        if (!directory.exists()) {
-            log.warn("{} does not exist", directory);
-            return;
-        }
-
-        if (!directory.isDirectory()) {
-            log.warn("{} is not a directory", directory);
-            return;
-        }
-
-        File[] files = directory.listFiles();
-        if (files == null) {  // null if security restricted
-            log.warn("Failed to list contents of {}: {}", directory, readFailReason(directory));
-            return;
-        }
-
-        for (File file : files) {
-            if (file.isDirectory()) {
-                cleanupEmptyDirectories(file, true);  // recursive call always include new base directory
-            }
-        }
-
-        // all other directories scanned - now check if this direcotry should be deleted
-        if (includeBaseDirectory && directory.listFiles().length == 0) {
-            // empty directory - delete and return
-            boolean deleted = directory.delete();
-            if (!deleted) {
-                log.warn("Failed to delete empty directory {}", directory);
-            }
-        }
-
-    }
-
-    public static boolean removeFile(File file) {
-        if (file != null && file.exists()) {
-            //Try to delete the file
-            if (!remove(file)) {
-                log.warn("Unable to remove " + file.getAbsolutePath());
-                return false;
-            }
-        }
-        return true;
-    }
-
-    private static boolean remove(final File file) {
-        if (!file.delete()) {
-            // NOTE: fix for java/win bug. see:
-            // http://forum.java.sun.com/thread.jsp?forum=4&thread=158689&tstart=0&trange=15
-            System.gc();
-            try {
-                Thread.sleep(100);
-            } catch (InterruptedException e) {
-                // nop
-            }
-
-            // Try one more time to delete the file
-            return file.delete();
-        }
-        return true;
-    }
-
-    public static String readFileToString(File file) {
-        try {
-            return org.apache.commons.io.FileUtils.readFileToString(file, "utf-8");
-        } catch (IOException e) {
-            throw new RuntimeException("Couldn't read text file from " + file.getAbsolutePath(), e);
-        }
-    }
-
-    /**
-     * Writes the content to the given file while maintaining a rolling file policy.<br> The file's last-modified
-     * timestamp will be appended to each file that is rolled.<br> The amount of rolled files to retain can be defined
-     * in {@link org.artifactory.common.ConstantValues.fileRollerMaxFilesToRetain}
-     *
-     * @param content    Content to write to the file
-     * @param targetFile Target file
-     */
-    public static void writeContentToRollingFile(String content, File targetFile) throws IOException {
-        if (!targetFile.exists()) {
-
-            targetFile.createNewFile();
-        } else {
-            File parentDir = targetFile.getParentFile();
-
-            final String fileNameWithNoExtension = PathUtils.stripExtension(targetFile.getName());
-            final String fileExtension = PathUtils.getExtension(targetFile.getName());
-            String newTargetFileName = fileNameWithNoExtension + "." + targetFile.lastModified() + "." + fileExtension;
-            org.apache.commons.io.FileUtils.copyFile(targetFile, new File(parentDir, newTargetFileName));
-
-            List<File> existingFileList = Lists.newArrayList(parentDir.listFiles(new FilenameFilter() {
-                @Override
-                public boolean accept(File dir, String name) {
-                    return name.startsWith(fileNameWithNoExtension) && name.endsWith(fileExtension);
-                }
-            }));
-            Collections.sort(existingFileList);
-
-            int maxFiles = ConstantValues.fileRollerMaxFilesToRetain.getInt();
-            if (maxFiles < 0) {
-                log.warn("A negative integer value '{}' was provided for '{}'. Ignoring and falling back to '{}'.",
-                        maxFiles, ConstantValues.fileRollerMaxFilesToRetain.getPropertyName(),
-                        ConstantValues.fileRollerMaxFilesToRetain.getDefValue());
-                maxFiles = Integer.parseInt(ConstantValues.fileRollerMaxFilesToRetain.getDefValue());
-            }
-
-            while (existingFileList.size() > maxFiles) {
-                File toRemove = existingFileList.remove(0);
-                org.apache.commons.io.FileUtils.deleteQuietly(toRemove);
-            }
-        }
-
-        org.apache.commons.io.FileUtils.writeStringToFile(targetFile, content);
-    }
-
-    public static long writeToFileAndClose(InputStream in, File file) throws IOException {
-        try {
-            org.apache.commons.io.FileUtils.copyInputStreamToFile(in, file);
-        } catch (IOException e) {
-            try {
-                String msg = "Could not fill content in file '" + file.getAbsolutePath()
-                        + "' due to " + e.getMessage() + "\n. Deleting it if possible!";
-                if (log.isDebugEnabled()) {
-                    log.error(msg, e);
-                } else {
-                    log.error(msg);
-                }
-                if (file.exists()) {
-                    if (!file.delete()) {
-                        log.error("Could not delete wrong file '" + file.getAbsolutePath() + "'!");
-                    }
-                }
-            } catch (Exception ignore) {
-                // Ignore all exception here, to throw back the original failure
-                log.debug("Fail to remove file after failed fill data", ignore);
-            }
-            throw e;
-        }
-        return file.length();
-    }
-
-    /**
-     * Tries to determine why the file could not be read.
-     * NOTICE: This method doesn't determine whether the file is accessible or not, just provides pretty reason string
-     * @param file to test
-     * @return A string describing why the file cannot be read.
-     */
-    public static String readFailReason(File file) {
-        Path asPath = file.toPath();
-
-        if (!java.nio.file.Files.notExists(asPath)) {
-            return "File not found";
-        } else if (!java.nio.file.Files.isReadable(asPath)) {
-            return "Access denied";
-        } else {
-            return "Unknown error";
-        }
-
-    }
-
-    public static long nextLong(long n) {
-        if (n <= 0) {
-            throw new IllegalArgumentException("n must be positive");
-        }
-        // error checking and 2^x checking removed for simplicity.
-        long bits, val;
-        do {
-            bits = (intGenerator.nextLong() << 1) >>> 1;
-            val = bits % n;
-        } while (bits - val + (n - 1) < 0L);
-        return val;
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/util/InvalidNameException.java b/base/config/src/main/java/org/artifactory/util/InvalidNameException.java
deleted file mode 100644
index 1049e7a..0000000
--- a/base/config/src/main/java/org/artifactory/util/InvalidNameException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-/**
- * Thrown when the given name is invalid
- *
- * @author Ofer Cohen
- */
-public class InvalidNameException extends ExistenceException {
-    public InvalidNameException(String message) {
-        super(message);
-    }
-
-    public InvalidNameException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/util/PrettyStaxDriver.java b/base/config/src/main/java/org/artifactory/util/PrettyStaxDriver.java
deleted file mode 100644
index 804a81a..0000000
--- a/base/config/src/main/java/org/artifactory/util/PrettyStaxDriver.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.artifactory.util;
-
-import com.thoughtworks.xstream.io.naming.NameCoder;
-import com.thoughtworks.xstream.io.xml.QNameMap;
-import com.thoughtworks.xstream.io.xml.StaxDriver;
-import javanet.staxutils.StaxUtilsXMLOutputFactory;
-
-import javax.xml.stream.XMLInputFactory;
-import javax.xml.stream.XMLOutputFactory;
-
-/**
- * Stax driver configured to pretty print
- */
-public class PrettyStaxDriver extends StaxDriver {
-    private XMLOutputFactory outputFactory;
-
-    public PrettyStaxDriver(QNameMap qNameMap) {
-        super((qNameMap == null) ? new QNameMap() : qNameMap);
-    }
-
-    public PrettyStaxDriver(QNameMap qNameMap, NameCoder nameCoder) {
-        super((qNameMap == null) ? new QNameMap() : qNameMap, nameCoder);
-    }
-
-    @Override
-    public XMLOutputFactory getOutputFactory() {
-        if (outputFactory == null) {
-            //Decorate the original output factory - make it pretty print
-            outputFactory = new StaxUtilsXMLOutputFactory(super.getOutputFactory()) {
-                @Override
-                public Object getProperty(String name) throws IllegalArgumentException {
-                    //noinspection SimplifiableIfStatement
-                    if (XMLOutputFactory.IS_REPAIRING_NAMESPACES.equals(name)) {
-                        //Avoid delegating to the parent XOF, since may result in IAE (RTFACT-2193).
-                        return false;
-                    }
-                    return super.getProperty(name);
-                }
-            };
-            outputFactory.setProperty(StaxUtilsXMLOutputFactory.INDENTING, true);
-        }
-        return outputFactory;
-    }
-
-    @Override
-    protected XMLInputFactory createInputFactory() {
-        XMLInputFactory inputFactory = super.createInputFactory();
-        inputFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false);
-        inputFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
-        return inputFactory;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/util/RemoteCommandException.java b/base/config/src/main/java/org/artifactory/util/RemoteCommandException.java
deleted file mode 100644
index 88d27bf..0000000
--- a/base/config/src/main/java/org/artifactory/util/RemoteCommandException.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-/**
- * Used by the CLI to pass exception which are related to remote activity
- *
- * @author Noam Tenne
- */
-public class RemoteCommandException extends RuntimeException {
-    public RemoteCommandException() {
-    }
-
-    public RemoteCommandException(String message) {
-        super(message);
-    }
-
-    public RemoteCommandException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-    public RemoteCommandException(Throwable cause) {
-        super(cause);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/util/RepoLayoutUtils.java b/base/config/src/main/java/org/artifactory/util/RepoLayoutUtils.java
deleted file mode 100644
index 2fc26c3..0000000
--- a/base/config/src/main/java/org/artifactory/util/RepoLayoutUtils.java
+++ /dev/null
@@ -1,583 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.descriptor.repo.RepoLayoutBuilder;
-import org.artifactory.util.layouts.token.BaseTokenFilter;
-import org.artifactory.util.layouts.token.OrganizationPathTokenFilter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.*;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * @author Noam Y. Tenne
- */
-public abstract class RepoLayoutUtils {
-    private static final Logger log = LoggerFactory.getLogger(RepoLayoutUtils.class);
-
-    /**
-     * LAYOUT PRESETS
-     */
-    public static final String MAVEN_2_DEFAULT_NAME = "maven-2-default";
-    public static final String MAVEN_1_DEFAULT_NAME = "maven-1-default";
-    public static final String IVY_DEFAULT_NAME = "ivy-default";
-    public static final String GRADLE_DEFAULT_NAME = "gradle-default";
-    public static final String NUGET_DEFAULT_NAME = "nuget-default";
-    public static final String SBT_DEFAULT_NAME = "sbt-default";
-    public static final String NPM_DEFAULT_NAME = "npm-default";
-    public static final String BOWER_DEFAULT_NAME = "bower-default";
-    public static final String VSC_DEFAULT_NAME = "vcs-default";
-    public static final String SIMPLE_DEFAULT_NAME = "simple-default";
-
-    public static List<String> DEFAULT_LAYOUTS = new LinkedList<String>() {{
-        add(MAVEN_2_DEFAULT_NAME);
-        add(MAVEN_1_DEFAULT_NAME);
-        add(IVY_DEFAULT_NAME);
-        add(GRADLE_DEFAULT_NAME);
-        add(NUGET_DEFAULT_NAME);
-        add(SBT_DEFAULT_NAME);
-        add(NPM_DEFAULT_NAME);
-        add(BOWER_DEFAULT_NAME);
-        add(VSC_DEFAULT_NAME);
-        add(SIMPLE_DEFAULT_NAME);
-    }};
-
-    public static final RepoLayout MAVEN_2_DEFAULT = new RepoLayoutBuilder()
-            .name(MAVEN_2_DEFAULT_NAME)
-            .artifactPathPattern("[orgPath]/[module]/[baseRev](-[folderItegRev])/" +
-                    "[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]")
-            .distinctiveDescriptorPathPattern(true)
-            .descriptorPathPattern("[orgPath]/[module]/[baseRev](-[folderItegRev])/" +
-                    "[module]-[baseRev](-[fileItegRev])(-[classifier]).pom")
-            .folderIntegrationRevisionRegExp("SNAPSHOT")
-            .fileIntegrationRevisionRegExp("SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))")
-            .build();
-    public static final RepoLayout IVY_DEFAULT = new RepoLayoutBuilder()
-            .name(IVY_DEFAULT_NAME)
-            .artifactPathPattern("[org]/[module]/[baseRev](-[folderItegRev])/[type]s/" +
-                    "[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]")
-            .distinctiveDescriptorPathPattern(true)
-            .descriptorPathPattern("[org]/[module]/[baseRev](-[folderItegRev])/[type]s/" +
-                    "ivy-[baseRev](-[fileItegRev]).xml")
-            .folderIntegrationRevisionRegExp("\\d{14}")
-            .fileIntegrationRevisionRegExp("\\d{14}")
-            .build();
-    public static final RepoLayout GRADLE_DEFAULT = new RepoLayoutBuilder()
-            .name(GRADLE_DEFAULT_NAME)
-            .artifactPathPattern("[org]/[module]/[baseRev](-[folderItegRev])/" +
-                    "[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]")
-            .distinctiveDescriptorPathPattern(true)
-            .descriptorPathPattern("[org]/[module]/ivy-[baseRev](-[fileItegRev]).xml")
-            .folderIntegrationRevisionRegExp("\\d{14}")
-            .fileIntegrationRevisionRegExp("\\d{14}")
-            .build();
-    public static final RepoLayout MAVEN_1_DEFAULT = new RepoLayoutBuilder()
-            .name(MAVEN_1_DEFAULT_NAME)
-            .artifactPathPattern("[org]/[type]s/[module]-[baseRev](-[fileItegRev])" +
-                    "(-[classifier]).[ext]")
-            .distinctiveDescriptorPathPattern(true)
-            .descriptorPathPattern("[org]/[type]s/[module]-[baseRev](-[fileItegRev]).pom")
-            .folderIntegrationRevisionRegExp(".+")
-            .fileIntegrationRevisionRegExp(".+")
-            .build();
-
-    /**
-     * LAYOUT TOKENS
-     */
-    public static final String ORGANIZATION = "org";
-    public static final String ORGANIZATION_PATH = "orgPath";
-    public static final String MODULE = "module";
-    public static final String BASE_REVISION = "baseRev";
-    public static final String FOLDER_INTEGRATION_REVISION = "folderItegRev";
-    public static final String FILE_INTEGRATION_REVISION = "fileItegRev";
-    public static final String CLASSIFIER = "classifier";
-    public static final String EXT = "ext";
-    public static final String TYPE = "type";
-    public static final String RELEASE = "RELEASE";
-
-    public static final Set<String> TOKENS = Sets.newHashSet(ORGANIZATION, ORGANIZATION_PATH, MODULE, BASE_REVISION,
-            FOLDER_INTEGRATION_REVISION, FILE_INTEGRATION_REVISION, CLASSIFIER, EXT, TYPE, RELEASE);
-
-    public static final Map<String, BaseTokenFilter> TOKEN_FILTERS;
-
-    private static final Set<Character> REGEX_SPECIAL_TOKENS = Sets.newHashSet('.', '+', '?', '*', '{', '}', '^', '$');
-    private static final Pattern OPTIONAL_AREA_PATTERN = Pattern.compile("\\([^\\(]*\\)");
-    private static final Pattern REPLACED_OPTIONAL_TOKEN_PATTERN = Pattern.compile("\\([^\\[\\(]*\\)");
-    private static final String CUSTOM_TOKEN_REGEX = "<[^<]*>";
-    private static final Pattern CUSTOM_TOKEN_PATTERN = Pattern.compile(CUSTOM_TOKEN_REGEX);
-    private static final Pattern TOKEN_PATTERN = Pattern.compile("\\[([^\\[].[^\\]]*)\\]");
-
-    static {
-        Map<String, BaseTokenFilter> temp = Maps.newHashMap();
-        temp.put(RepoLayoutUtils.ORGANIZATION_PATH, OrganizationPathTokenFilter.getInstance());
-        TOKEN_FILTERS = Collections.unmodifiableMap(temp);
-    }
-
-    private RepoLayoutUtils() {
-    }
-
-    public static boolean isReservedName(String layoutName) {
-        return DEFAULT_LAYOUTS.contains(layoutName);
-    }
-
-    public static boolean isDefaultM2(RepoLayout repoLayout) {
-        return MAVEN_2_DEFAULT.equals(repoLayout);
-    }
-
-    public static boolean isDefaultSimple(RepoLayout repoLayout) {
-        if (repoLayout == null) {
-            return false;
-        }
-        String name = repoLayout.getName();
-        return StringUtils.equals(name, "simple-default") || StringUtils.equals(name, "art-simple-default");
-    }
-
-    public static boolean isDefaultIvy(RepoLayout repoLayout) {
-        return IVY_DEFAULT.equals(repoLayout);
-    }
-
-    public static boolean isDefaultGradle(RepoLayout repoLayout) {
-        return GRADLE_DEFAULT.equals(repoLayout);
-    }
-
-    /**
-     * Indicates whether the given layout contains the orgPath token, equal to Ivy's M2 compatibility,
-     *
-     * @param repoLayout Layout to check
-     * @return True if the layout contains the orgPath token
-     */
-    public static boolean layoutContainsOrgPathToken(RepoLayout repoLayout) {
-        if (repoLayout == null) {
-            throw new IllegalArgumentException("Cannot check a null layout for token existence.");
-        }
-
-        String artifactPathPattern = repoLayout.getArtifactPathPattern();
-        String descriptorPathPattern = repoLayout.getDescriptorPathPattern();
-
-        return ((artifactPathPattern != null) && artifactPathPattern.contains(ORGANIZATION_PATH)) ||
-                (repoLayout.isDistinctiveDescriptorPathPattern() && (descriptorPathPattern != null) &&
-                        descriptorPathPattern.contains(ORGANIZATION_PATH));
-    }
-
-    /**
-     * Find all optional areas that their token values were provided and remove the "optional" brackets that surround
-     * them.
-     *
-     * @param itemPathTemplate     Item path template to modify
-     * @param removeBracketContent True if the content of the optional bracket should be disposed
-     * @return Modified item path template
-     */
-    public static String removeReplacedTokenOptionalBrackets(String itemPathTemplate, boolean removeBracketContent) {
-        Matcher matcher = REPLACED_OPTIONAL_TOKEN_PATTERN.matcher(itemPathTemplate);
-
-        int latestGroupEnd = 0;
-        StringBuilder newPathBuilder = new StringBuilder();
-
-        while (matcher.find()) {
-            int replacedOptionalTokenAreaStart = matcher.start();
-            int replacedOptionalTokenAreaEnd = matcher.end();
-            String replacedOptionalTokenValue = matcher.group(0);
-
-            newPathBuilder.append(itemPathTemplate.substring(latestGroupEnd, replacedOptionalTokenAreaStart));
-
-            if (!removeBracketContent) {
-                newPathBuilder.append(replacedOptionalTokenValue.replaceAll("[\\(\\)]", ""));
-            }
-
-            //Path after optional area
-            latestGroupEnd = replacedOptionalTokenAreaEnd;
-        }
-
-        if ((latestGroupEnd != 0) && latestGroupEnd < itemPathTemplate.length()) {
-            newPathBuilder.append(itemPathTemplate.substring(latestGroupEnd));
-        }
-
-        if (newPathBuilder.length() == 0) {
-            return itemPathTemplate;
-        }
-
-        return newPathBuilder.toString();
-    }
-
-    /**
-     * Find all remaining optional areas that were left with un-replaced tokens and remove them completely
-     *
-     * @param itemPathTemplate Item path template to modify
-     * @return Modified item path template
-     */
-    public static String removeUnReplacedTokenOptionalBrackets(String itemPathTemplate) {
-        Matcher matcher = OPTIONAL_AREA_PATTERN.matcher(itemPathTemplate);
-
-        int latestGroupEnd = 0;
-        StringBuilder newPathBuilder = new StringBuilder();
-
-        while (matcher.find()) {
-            int optionalAreaStart = matcher.start();
-            int optionalAreaEnd = matcher.end();
-            String optionalAreaValue = matcher.group(0);
-
-            if (optionalAreaValue.contains("[")) {
-                newPathBuilder.append(itemPathTemplate.substring(latestGroupEnd, optionalAreaStart));
-                latestGroupEnd = optionalAreaEnd;
-            }
-        }
-
-        if ((latestGroupEnd != 0) && latestGroupEnd < itemPathTemplate.length()) {
-            newPathBuilder.append(itemPathTemplate.substring(latestGroupEnd));
-        }
-
-        if (newPathBuilder.length() == 0) {
-            return itemPathTemplate;
-        }
-
-        return newPathBuilder.toString();
-    }
-
-    /**
-     * Creates a regular expression based on the given path pattern and layout
-     *
-     * @param repoLayout   Repo layout to target
-     * @param patternToUse Pattern to translate
-     * @return Regular expression of given path
-     */
-    public static String generateRegExpFromPattern(RepoLayout repoLayout, String patternToUse) {
-        return generateRegExpFromPattern(repoLayout, patternToUse, false, false);
-    }
-
-    /**
-     * Creates a regular expression based on the given path pattern and layout
-     * the pattern may contain version tokens ([RELEASE] or [INTEGRATION])
-     *
-     * @param repoLayout         Repo layout to target
-     * @param patternToUse       Pattern to translate
-     * @param failOnUnknownToken Throw exception if the pattern contains an unknown token (neither reserved nor custom)
-     * @return Regular expression of given path
-     */
-    public static String generateRegExpFromPattern(RepoLayout repoLayout, String patternToUse,
-            boolean failOnUnknownToken) {
-        return generateRegExpFromPattern(repoLayout, patternToUse, failOnUnknownToken, false);
-    }
-
-    /**
-     * Creates a regular expression based on the given path pattern and layout
-     *
-     * @param repoLayout         Repo layout to target
-     * @param patternToUse       Pattern to translate
-     * @param failOnUnknownToken Throw exception if the pattern contains an unknown token (neither reserved nor custom)
-     * @param hasVersionTokens   indicates if the pattern contains version tokens
-     * @return Regular expression of given path
-     */
-    public static String generateRegExpFromPattern(RepoLayout repoLayout, String patternToUse,
-            boolean failOnUnknownToken, boolean hasVersionTokens) {
-        List<String> tokenAppearance = Lists.newArrayList();
-        StringBuilder itemPathPatternRegExpBuilder = new StringBuilder();
-
-        boolean withinToken = false;
-        boolean withinCustomToken = false;
-        StringBuilder currentTokenBuilder = new StringBuilder();
-        StringBuilder customRegExTokenBuilder = new StringBuilder();
-        for (char c : patternToUse.toCharArray()) {
-            if (('[' == c) && !withinToken && !withinCustomToken) {
-                withinToken = true;
-            } else if ((']' == c) && withinToken && !withinCustomToken) {
-                withinToken = false;
-                String currentToken = currentTokenBuilder.toString();
-                currentTokenBuilder.delete(0, currentTokenBuilder.length());
-                if (isReservedToken(currentToken)) {
-                    appendToken(itemPathPatternRegExpBuilder, currentToken, tokenAppearance,
-                            getTokenRegExp(currentToken, repoLayout, hasVersionTokens));
-                } else if (customRegExTokenBuilder.length() != 0) {
-                    appendToken(itemPathPatternRegExpBuilder, currentToken, tokenAppearance,
-                            customRegExTokenBuilder.toString());
-                    customRegExTokenBuilder.delete(0, customRegExTokenBuilder.length());
-                } else {
-                    String errorMessage = "The token '[" + currentToken + "]' is unknown. If this is not intended, " +
-                            "please verify the token name for correctness or add a mapping for this token using the " +
-                            "'[$NAME<REGEXP>]' syntax.";
-                    if (log.isDebugEnabled()) {
-                        log.debug("Error occurred while generating regular expressions from the repository layout " +
-                                "pattern '{}': {}", patternToUse, errorMessage);
-                    }
-                    if (failOnUnknownToken) {
-                        throw new IllegalArgumentException(errorMessage);
-                    }
-                }
-            } else if ('<' == c) {
-                withinCustomToken = true;
-            } else if ('>' == c) {
-                withinCustomToken = false;
-            } else if (withinCustomToken) {
-                customRegExTokenBuilder.append(c);
-            } else if (!withinToken) {
-                appendNonReservedToken(itemPathPatternRegExpBuilder, Character.toString(c));
-            } else {
-                currentTokenBuilder.append(c);
-            }
-        }
-        return itemPathPatternRegExpBuilder.toString();
-    }
-
-    /**
-     * Indicates whether the given token has a value filter assigned to it
-     *
-     * @param tokenName Name of token check
-     * @return True if the token relies on a filter
-     */
-    public static boolean tokenHasFilter(String tokenName) {
-        return TOKEN_FILTERS.containsKey(tokenName);
-    }
-
-    /**
-     * Returns the Ivy pattern representation of the layout's artifact patten
-     *
-     * @param repoLayout Layout to "translate"
-     * @return Ivy pattern
-     */
-    public static String getArtifactLayoutAsIvyPattern(RepoLayout repoLayout) {
-        return getItemLayoutAsIvyPattern(repoLayout, false);
-    }
-
-    /**
-     * Returns the Ivy pattern representation of the layout's descriptor patten
-     *
-     * @param repoLayout Layout to "translate"
-     * @return Ivy pattern
-     */
-    public static String getDescriptorLayoutAsIvyPattern(RepoLayout repoLayout) {
-        return getItemLayoutAsIvyPattern(repoLayout, true);
-    }
-
-    /**
-     * Wraps the given keyword with the token parentheses ('[', ']')
-     *
-     * @param keyword Keyword to wrap
-     * @return Wrapped keyword
-     */
-    public static String wrapKeywordAsToken(String keyword) {
-        return "[" + keyword + "]";
-    }
-
-    /**
-     * Indicates whether the compared layouts are fully compatible (don't miss any tokens when crossed)
-     *
-     * @param first  Layout to compare
-     * @param second Layout to compare
-     * @return True if no tokens are missed between the layouts
-     */
-    public static boolean layoutsAreCompatible(RepoLayout first, RepoLayout second) {
-        String firstArtifactPathPattern = first.getArtifactPathPattern();
-        String secondArtifactPathPattern = second.getArtifactPathPattern();
-
-        if (foundMissingTokens(firstArtifactPathPattern, secondArtifactPathPattern)) {
-            return false;
-        }
-        if (foundMissingTokens(secondArtifactPathPattern, firstArtifactPathPattern)) {
-            return false;
-        }
-
-        if (first.isDistinctiveDescriptorPathPattern() && second.isDistinctiveDescriptorPathPattern()) {
-
-            String firstDescriptorPathPattern = first.getDescriptorPathPattern();
-            String secondDescriptorPathPattern = second.getDescriptorPathPattern();
-
-            if (foundMissingTokens(firstDescriptorPathPattern, secondDescriptorPathPattern)) {
-                return false;
-            }
-            if (foundMissingTokens(secondDescriptorPathPattern, firstDescriptorPathPattern)) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    public static String clearCustomTokenRegEx(String path) {
-        return CUSTOM_TOKEN_PATTERN.matcher(path).replaceAll("");
-    }
-
-    /**
-     * @return a {@link Set<String>} of all token names in this {@param layout}
-     */
-    public static List<String> getLayoutTokens(RepoLayout layout) {
-        Set<String> tokens = Sets.newHashSet();
-        String artifactPattern = layout.getArtifactPathPattern();
-        String descriptorPattern = layout.getDescriptorPathPattern();
-
-        if (StringUtils.isNotBlank(artifactPattern)) {
-            artifactPattern = artifactPattern.replaceAll(CUSTOM_TOKEN_REGEX, "");
-            addAllTokensFromPattern(TOKEN_PATTERN, artifactPattern, tokens);
-        }
-
-        if (StringUtils.isNotBlank(descriptorPattern)) {
-            descriptorPattern = descriptorPattern.replaceAll(CUSTOM_TOKEN_REGEX, "");
-            addAllTokensFromPattern(TOKEN_PATTERN, descriptorPattern, tokens);
-        }
-        return Lists.newArrayList(tokens);
-    }
-
-    private static void addAllTokensFromPattern(Pattern tokenPattern, String layoutPattern, Set<String> tokens) {
-        Matcher tokenMatcher = tokenPattern.matcher(layoutPattern);
-        while (tokenMatcher.find()) {
-            tokens.add(tokenMatcher.group(0));
-        }
-    }
-
-    private static void appendNonReservedToken(StringBuilder itemPathPatternRegExpBuilder,
-            String itemPathPatternElement) {
-        char[] splitPathPatternElement = itemPathPatternElement.toCharArray();
-        for (char elementToken : splitPathPatternElement) {
-            // Escaping special regex characters
-            if (REGEX_SPECIAL_TOKENS.contains(elementToken)) {
-                itemPathPatternRegExpBuilder.append("\\");
-            }
-
-            itemPathPatternRegExpBuilder.append(elementToken);
-
-            if ('(' == elementToken) {
-                itemPathPatternRegExpBuilder.append("?:");
-            }
-
-            //Append the '?' character to the end of the parenthesis - optional group
-            if (')' == elementToken) {
-                itemPathPatternRegExpBuilder.append("?");
-            }
-        }
-    }
-
-    private static boolean isReservedToken(String pathElement) {
-        return TOKENS.contains(pathElement);
-    }
-
-    private static String getTokenRegExp(String tokenName, RepoLayout repoLayout, boolean hasVersionTokens) {
-        if (ORGANIZATION.equals(tokenName)) {
-            return "[^/]+?";
-        } else if (ORGANIZATION_PATH.equals(tokenName)) {
-            return ".+?";
-        } else if (MODULE.equals(tokenName)) {
-            return "[^/]+";
-        } else if (BASE_REVISION.equals(tokenName)) {
-            return "[^/]+?";
-        } else if (FOLDER_INTEGRATION_REVISION.equals(tokenName)) {
-            String regExp = repoLayout.getFolderIntegrationRevisionRegExp();
-            if (hasVersionTokens) {
-                regExp = regExp + "|\\[INTEGRATION\\]" + "|\\[RELEASE\\]";
-            }
-            return regExp;
-        } else if (FILE_INTEGRATION_REVISION.equals(tokenName)) {
-            String regExp = repoLayout.getFileIntegrationRevisionRegExp();
-            if (hasVersionTokens) {
-                regExp = regExp + "|\\[INTEGRATION\\]" + "|\\[RELEASE\\]";
-            }
-            return regExp;
-        } else if (CLASSIFIER.equals(tokenName)) {
-            return "[^/]+?";
-        } else if (EXT.equals(tokenName)) {
-            return "(?:(?!\\d))[^\\-/]+|7z";
-        } else if (TYPE.equals(tokenName)) {
-            return "[^/]+?";
-        } else if (hasVersionTokens && RELEASE.equals(tokenName)) {
-            return "[^/]+?";
-        }
-        return null;
-    }
-
-    private static String getItemLayoutAsIvyPattern(RepoLayout repoLayout, boolean descriptor) {
-        if (repoLayout == null) {
-            throw new IllegalArgumentException("Cannot translate a null layout.");
-        }
-
-        String layoutToTranslate;
-
-        if (descriptor && repoLayout.isDistinctiveDescriptorPathPattern()) {
-            layoutToTranslate = repoLayout.getDescriptorPathPattern();
-        } else {
-            layoutToTranslate = repoLayout.getArtifactPathPattern();
-        }
-
-        String organizationToken = wrapKeywordAsToken("organization");
-        layoutToTranslate = layoutToTranslate.replaceAll("\\[" + ORGANIZATION_PATH + "\\]", organizationToken);
-        layoutToTranslate = layoutToTranslate.replaceAll("\\[" + ORGANIZATION + "\\]", organizationToken);
-        layoutToTranslate = layoutToTranslate.replaceAll("\\[" + BASE_REVISION + "\\]", wrapKeywordAsToken("revision"));
-        layoutToTranslate = layoutToTranslate.replaceAll("\\[" + FOLDER_INTEGRATION_REVISION + "\\]", "");
-        layoutToTranslate = layoutToTranslate.replaceAll("\\[" + FILE_INTEGRATION_REVISION + "\\]", "");
-        layoutToTranslate = removeReplacedTokenOptionalBrackets(layoutToTranslate, true);
-
-        return layoutToTranslate;
-    }
-
-    private static boolean foundMissingTokens(String firstPattern, String secondPattern) {
-        boolean withinToken = false;
-        boolean withinCustomToken = false;
-        StringBuilder currentTokenValue = new StringBuilder();
-        for (char c : firstPattern.toCharArray()) {
-            if (('[' == c) && !withinCustomToken) {
-                currentTokenValue.append("[");
-                withinToken = true;
-            } else if ((']' == c) && !withinCustomToken) {
-                withinToken = false;
-                currentTokenValue.append("]");
-                String currentToken = currentTokenValue.toString();
-                currentTokenValue.delete(0, currentTokenValue.length());
-                if (!secondPattern.contains(currentToken)) {
-
-                    /**
-                     * If the unfound token is orgPath but org is found, or the opposite, don't consider as missing,
-                     * they are interchangeable
-                     */
-                    if ((wrapKeywordAsToken(ORGANIZATION_PATH).equals(currentToken) &&
-                            secondPattern.contains(wrapKeywordAsToken(ORGANIZATION))) ||
-                            (wrapKeywordAsToken(ORGANIZATION).equals(currentToken) &&
-                                    secondPattern.contains(wrapKeywordAsToken(ORGANIZATION_PATH)))) {
-                        continue;
-                    }
-                    return true;
-                }
-            } else if (('<' == c) && withinToken) {
-                withinCustomToken = true;
-                currentTokenValue.append("<");
-            } else if (('>' == c) && withinToken) {
-                withinCustomToken = false;
-                currentTokenValue.append(">");
-            } else if (withinToken) {
-                currentTokenValue.append(c);
-            }
-        }
-
-        return false;
-    }
-
-    private static void appendToken(StringBuilder itemPathPatternRegExpBuilder, String tokenName,
-            List<String> tokenAppearance, String tokenValue) {
-        itemPathPatternRegExpBuilder.append("(?<").append(tokenName).append(">");
-        if (tokenAppearance.contains(tokenName)) {
-            itemPathPatternRegExpBuilder.append("\\").append(tokenAppearance.indexOf(tokenName) + 1);
-        } else {
-            itemPathPatternRegExpBuilder.append(tokenValue);
-            tokenAppearance.add(tokenName);
-        }
-        itemPathPatternRegExpBuilder.append(")");
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/util/ResourceUtils.java b/base/config/src/main/java/org/artifactory/util/ResourceUtils.java
deleted file mode 100644
index efabe93..0000000
--- a/base/config/src/main/java/org/artifactory/util/ResourceUtils.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URL;
-
-/**
- * @author yoavl
- */
-public abstract class ResourceUtils {
-    private ResourceUtils() {
-        // utility class
-    }
-
-    public static void copyResource(String resourcePath, File outputFile) throws IOException {
-        copyResource(resourcePath, outputFile, null, null);
-    }
-
-    public static void copyResource(String resourcePath, File outputFile, InputStreamManipulator manipulator)
-            throws IOException {
-        copyResource(resourcePath, outputFile, manipulator, null);
-    }
-
-    public static void copyResource(String resourcePath, File outputFile, Class clazz) throws IOException {
-        copyResource(resourcePath, outputFile, null, clazz);
-    }
-
-    public static void copyResource(String resourcePath, File outputFile, InputStreamManipulator manipulator,
-            Class clazz) throws IOException {
-        OutputStream os = null;
-        try {
-            os = new BufferedOutputStream(FileUtils.openOutputStream(outputFile));
-            copyResource(resourcePath, os, manipulator, clazz);
-        } finally {
-            IOUtils.closeQuietly(os);
-        }
-    }
-
-    public static void copyResource(String resourcePath, OutputStream outputStream, InputStreamManipulator manipulator,
-            Class clazz) throws IOException {
-        InputStream origInputStream = null;
-        InputStream usedInputStream = null;
-        try {
-            origInputStream = clazz != null ?
-                    clazz.getResourceAsStream(resourcePath) :
-                    Thread.currentThread().getContextClassLoader().getResourceAsStream(resourcePath);
-            assertResourceNotNull(resourcePath, origInputStream);
-            if (manipulator != null) {
-                InputStream mip = manipulator.manipulate(origInputStream);
-                if (mip == null) {
-                    throw new RuntimeException("Received a null stream from stream manipulation");
-                }
-                usedInputStream = mip;
-            } else {
-                usedInputStream = origInputStream;
-            }
-            IOUtils.copy(usedInputStream, outputStream);
-        } finally {
-            IOUtils.closeQuietly(outputStream);
-            IOUtils.closeQuietly(usedInputStream);
-            IOUtils.closeQuietly(origInputStream);
-        }
-    }
-
-    /**
-     * Returns the specified resource input stream. Throws an exception if the resource is not found int the class path.
-     *
-     * @param path The resource path
-     * @return The classpath resource input stream
-     * @see Class#getResourceAsStream(java.lang.String)
-     */
-    public static InputStream getResource(String path) {
-        InputStream is = ResourceUtils.class.getResourceAsStream(path);
-        assertResourceNotNull(path, is);
-        return is;
-    }
-
-    public static boolean resourceExists(String path) {
-        return ResourceUtils.class.getResource(path) != null;
-    }
-
-    public static File getResourceAsFile(String path) {
-        URL resource = ResourceUtils.class.getResource(path);
-        assertResourceNotNull(path, resource);
-        return new File(resource.getFile());
-    }
-
-    public static String getResourceAsString(String path) {
-        InputStream is = null;
-        try {
-            is = getResource(path);
-            return IOUtils.toString(is, "utf-8");
-        } catch (IOException e) {
-            throw new RuntimeException("Failed to transform resource at '" + path + "'to string", e);
-        } finally {
-            IOUtils.closeQuietly(is);
-        }
-    }
-
-    public interface InputStreamManipulator {
-        InputStream manipulate(InputStream origStream) throws IOException;
-    }
-
-    private static void assertResourceNotNull(String resourcePath, Object resourceHandle) {
-        if (resourceHandle == null) {
-            throw new IllegalArgumentException("Could not find the classpath resource at: " + resourcePath + ".");
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/util/Strings.java b/base/config/src/main/java/org/artifactory/util/Strings.java
deleted file mode 100644
index b8c771f..0000000
--- a/base/config/src/main/java/org/artifactory/util/Strings.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
-/**
- * Collection of string utils not found in 3rd party libraries.
- *
- * @author Yossi Shaul
- */
-public abstract class Strings {
-    private Strings() {
-        // utility class
-    }
-
-    /**
-     * Replaces all the characters of the string with asterisks ('*').
-     * <pre>
-     * mask("acb") = "***"
-     * mask("") = ""
-     * mask(null) = ""
-     * </pre>
-     *
-     * @param toMask The string to mask
-     * @return The masked string
-     */
-    @Nonnull
-    public static String mask(@Nullable String toMask) {
-        if (toMask == null) {
-            return "";
-        }
-        StringBuilder sb = new StringBuilder(toMask.length());
-        for (int i = 0; i < toMask.length(); i++) {
-            sb.append('*');
-        }
-        return sb.toString();
-    }
-
-    /**
-     * Replaces all the characters of the value with asterisks ('*'). The value is considered to be all the characters
-     * after the first equals ('=') character. If there's none the same string is returned.
-     * <pre>
-     * mask("acb") = "abs"
-     * mask("password=123") = "password=***"
-     * mask("") = ""
-     * mask(null) = ""
-     * </pre>
-     *
-     * @param toMask A string to mask its value
-     * @return The masked string.
-     */
-    @Nonnull
-    public static String maskKeyValue(@Nullable String toMask) {
-        if (toMask == null) {
-            return "";
-        }
-        int equalsIndex = toMask.indexOf('=');
-        if (equalsIndex <= 0) {
-            return toMask;
-        }
-
-        String key = toMask.substring(0, equalsIndex + 1);
-        String value = toMask.substring(equalsIndex + 1, toMask.length());
-        StringBuilder sb = new StringBuilder(key);
-        for (int i = 0; i < value.length(); i++) {
-            sb.append('*');
-        }
-        return sb.toString();
-    }
-
-    /**
-     * Returns {@code true} if the given string is null or is the empty string.
-     *
-     * @param string a string reference to check
-     * @return {@code true} if the string is null or is the empty string
-     */
-    public static boolean isNullOrEmpty(@Nullable String string) {
-        return com.google.common.base.Strings.isNullOrEmpty(string);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/util/XmlUtils.java b/base/config/src/main/java/org/artifactory/util/XmlUtils.java
deleted file mode 100644
index 1d67141..0000000
--- a/base/config/src/main/java/org/artifactory/util/XmlUtils.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import com.google.common.base.Charsets;
-import org.jdom2.Document;
-import org.jdom2.input.SAXBuilder;
-import org.jdom2.input.sax.XMLReaders;
-import org.jdom2.output.XMLOutputter;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.StringReader;
-
-/**
- * @author yoavl
- */
-public abstract class XmlUtils {
-    private XmlUtils() {
-        // utility class
-    }
-
-    public static String outputString(Document doc) {
-        String convertedXml = new XMLOutputter().outputString(doc);
-        return convertedXml;
-    }
-
-    public static Document parse(String xmlContent) {
-        SAXBuilder sb = createSaxBuilder();
-        try {
-            return sb.build(new StringReader(xmlContent));
-        } catch (Exception e) {
-            throw new RuntimeException("Failed to build dom document", e);
-        }
-    }
-
-    public static Document parse(File input) {
-        SAXBuilder sb = createSaxBuilder();
-        try {
-            return sb.build(new BufferedReader(new InputStreamReader(new FileInputStream(input), Charsets.UTF_8)));
-        } catch (Exception e) {
-            throw new RuntimeException("Failed to build dom document", e);
-        }
-    }
-
-    public static Document parse(InputStream in) {
-        SAXBuilder sb = createSaxBuilder();
-        try {
-            return sb.build(in);
-        } catch (Exception e) {
-            throw new RuntimeException("Failed to build dom document", e);
-        }
-    }
-
-    public static SAXBuilder createSaxBuilder() {
-        SAXBuilder sb = new SAXBuilder();
-        // don't validate and don't load dtd
-        sb.setXMLReaderFactory(XMLReaders.NONVALIDATING);
-        sb.setFeature("http://xml.org/sax/features/validation", false);
-        sb.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
-        sb.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
-        // JNLP needs DOCTYPE
-        //sb.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
-        sb.setFeature("http://xml.org/sax/features/external-general-entities", false);
-        sb.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
-        return sb;
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/util/distribution/DistributionConstants.java b/base/config/src/main/java/org/artifactory/util/distribution/DistributionConstants.java
deleted file mode 100644
index 48c6781..0000000
--- a/base/config/src/main/java/org/artifactory/util/distribution/DistributionConstants.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.artifactory.util.distribution;
-
-import java.util.regex.Pattern;
-
-/**
- * @author Dan Feldman
- */
-public abstract class DistributionConstants {
-
-    //Default Bintray repo names
-    public static final String DEFAULT_DEB_REPO_NAME = "deb";
-    public static final String DEFAULT_OPKG_REPO_NAME = "opkg";
-    public static final String DEFAULT_VAGRANT_REPO_NAME = "boxes";
-    public static final String DEFAULT_MAVEN_REPO_NAME = "maven";
-    public static final String DEFAULT_NUGET_REPO_NAME = "nuget";
-    public static final String DEFAULT_DOCKER_REPO_NAME = "registry";
-    public static final String DEFAULT_RPM_REPO_NAME = "rpm";
-    public static final String DEFAULT_GENERIC_REPO_NAME = "generic";
-
-    //Default tokens
-    public static final String PATH_TOKEN = wrapToken("artifactPath");
-    public static final String PRODUCT_NAME_TOKEN = wrapToken("productName");
-    public static final String PACKAGE_NAME_TOKEN = wrapToken("packageName");
-    public static final String PACKAGE_VERSION_TOKEN = wrapToken("packageVersion");
-    public static final String ARCHITECTURE_TOKEN = wrapToken("architecture");
-    public static final String DOCKER_IMAGE_TOKEN = wrapToken("dockerImage");
-    public static final String DOCKER_TAG_TOKEN = wrapToken("dockerTag");
-    public static final String MODULE_TOKEN = wrapToken("module");
-    public static final String BASE_REV_TOKEN = wrapToken("baseRev");
-    public static final String VCS_TAG_TOKEN = wrapToken("vcsTag");
-    public static final String VCS_REPO_TOKEN = wrapToken("vcsRepo");
-    //Used internally to piggy-back the product name on the prop rule token
-    public static final String PRODUCT_NAME_DUMMY_PROP = "internal.descriptor.product.name";
-    public static final String ARTIFACT_TYPE_OVERRIDE_PROP = "distribution.package.type";
-    public static final String MANIFEST_FILENAME = "manifest.json";
-
-    public static final Pattern TOKEN_PATTERN = Pattern.compile("\\$\\{[a-zA-Z]+\\}");
-
-    public static String wrapToken(String key) {
-        return "${" + key + "}";
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/util/layouts/token/BaseTokenFilter.java b/base/config/src/main/java/org/artifactory/util/layouts/token/BaseTokenFilter.java
deleted file mode 100644
index 0760195..0000000
--- a/base/config/src/main/java/org/artifactory/util/layouts/token/BaseTokenFilter.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util.layouts.token;
-
-/**
- * @author Noam Y. Tenne
- */
-public class BaseTokenFilter implements ModuleInfoTokenFilter {
-
-    @Override
-    public String forPath(String tokenValue) {
-        return tokenValue;
-    }
-
-    @Override
-    public String fromPath(String tokenValue) {
-        return tokenValue;
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/util/layouts/token/ModuleInfoTokenFilter.java b/base/config/src/main/java/org/artifactory/util/layouts/token/ModuleInfoTokenFilter.java
deleted file mode 100644
index ac7fb6f..0000000
--- a/base/config/src/main/java/org/artifactory/util/layouts/token/ModuleInfoTokenFilter.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util.layouts.token;
-
-import java.io.Serializable;
-
-/**
- * @author Noam Y. Tenne
- */
-public interface ModuleInfoTokenFilter extends Serializable {
-
-    public String forPath(String tokenValue);
-
-    public String fromPath(String tokenValue);
-}
diff --git a/base/config/src/main/java/org/artifactory/util/layouts/token/OrganizationPathTokenFilter.java b/base/config/src/main/java/org/artifactory/util/layouts/token/OrganizationPathTokenFilter.java
deleted file mode 100644
index 8363389..0000000
--- a/base/config/src/main/java/org/artifactory/util/layouts/token/OrganizationPathTokenFilter.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util.layouts.token;
-
-import org.apache.commons.lang.StringUtils;
-
-/**
- * @author Noam Y. Tenne
- */
-public class OrganizationPathTokenFilter extends BaseTokenFilter {
-
-    private static OrganizationPathTokenFilter INSTANCE = new OrganizationPathTokenFilter();
-
-    private OrganizationPathTokenFilter() {
-    }
-
-    public static OrganizationPathTokenFilter getInstance() {
-        return INSTANCE;
-    }
-
-    @Override
-    public String forPath(String tokenValue) {
-        return StringUtils.replaceChars(tokenValue, '.', '/');
-    }
-
-    @Override
-    public String fromPath(String tokenValue) {
-        return StringUtils.replaceChars(tokenValue, '/', '.');
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/util/stream/BiOptional.java b/base/config/src/main/java/org/artifactory/util/stream/BiOptional.java
deleted file mode 100644
index edb3b74..0000000
--- a/base/config/src/main/java/org/artifactory/util/stream/BiOptional.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.artifactory.util.stream;
-
-import java.util.Optional;
-import java.util.function.Consumer;
-
-/**
- * A "Bi-Directional" Optional to serve both ifPresent and ifNotPresent calls (i.e. if \ else kinda)
- * for that extra functional punch you never knew you needed.
- * <p>
- * NOTE: {@link java.util.Optional} is not inheritable, therefore this stupid hack.
- * Java 9 should improve this: https://bugs.openjdk.java.net/browse/JDK-8071670
- *
- * @author Dan Feldman
- */
-public class BiOptional<T> {
-
-    private Optional<T> optional;
-
-    private BiOptional(Optional<T> optional) {
-        this.optional = optional;
-    }
-
-    public static <T> BiOptional<T> of(Optional<T> optional) {
-        return new BiOptional<>(optional);
-    }
-
-    public Optional<T> get() {
-        return optional;
-    }
-
-    public BiOptional<T> ifPresent(Consumer<T> c) {
-        optional.ifPresent(c);
-        return this;
-    }
-
-    public BiOptional<T> ifPresent(Runnable r) {
-        if (optional.isPresent()) {
-            r.run();
-        }
-        return this;
-    }
-
-    public BiOptional<T> ifNotPresent(Runnable r) {
-        if (!optional.isPresent())
-            r.run();
-        return this;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/ArtifactoryConfigVersion.java b/base/config/src/main/java/org/artifactory/version/ArtifactoryConfigVersion.java
deleted file mode 100644
index a1f640b..0000000
--- a/base/config/src/main/java/org/artifactory/version/ArtifactoryConfigVersion.java
+++ /dev/null
@@ -1,400 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version;
-
-import org.artifactory.version.converter.NamespaceConverter;
-import org.artifactory.version.converter.SnapshotUniqueVersionConverter;
-import org.artifactory.version.converter.XmlConverter;
-import org.artifactory.version.converter.v100.BackupToElementConverter;
-import org.artifactory.version.converter.v100.RepositoriesKeysConverter;
-import org.artifactory.version.converter.v110.SnapshotNonUniqueValueConverter;
-import org.artifactory.version.converter.v120.AnonAccessNameConverter;
-import org.artifactory.version.converter.v130.AnnonAccessUnderSecurityConverter;
-import org.artifactory.version.converter.v130.BackupListConverter;
-import org.artifactory.version.converter.v130.LdapSettings130Converter;
-import org.artifactory.version.converter.v131.LdapAuthenticationPatternsConverter;
-import org.artifactory.version.converter.v132.BackupKeyConverter;
-import org.artifactory.version.converter.v132.LdapListConverter;
-import org.artifactory.version.converter.v134.BackupExcludedVirtualRepoConverter;
-import org.artifactory.version.converter.v135.ProxyNTHostConverter;
-import org.artifactory.version.converter.v136.IndexerCronRemoverConverter;
-import org.artifactory.version.converter.v136.RepositoryTypeConverter;
-import org.artifactory.version.converter.v141.ProxyDefaultConverter;
-import org.artifactory.version.converter.v1410.GcSystemPropertyConverter;
-import org.artifactory.version.converter.v1412.IndexerCronExpPropertyConverter;
-import org.artifactory.version.converter.v1414.ArchiveBrowsingConverter;
-import org.artifactory.version.converter.v1414.AssumedOfflineConverter;
-import org.artifactory.version.converter.v1414.CleanupConfigConverter;
-import org.artifactory.version.converter.v142.RepoIncludeExcludePatternsConverter;
-import org.artifactory.version.converter.v143.RemoteChecksumPolicyConverter;
-import org.artifactory.version.converter.v144.MultiLdapXmlConverter;
-import org.artifactory.version.converter.v144.ServerIdXmlConverter;
-import org.artifactory.version.converter.v147.DefaultRepoLayoutConverter;
-import org.artifactory.version.converter.v147.JfrogRemoteRepoUrlConverter;
-import org.artifactory.version.converter.v147.UnusedArtifactCleanupSwitchConverter;
-import org.artifactory.version.converter.v149.ReplicationElementNameConverter;
-import org.artifactory.version.converter.v152.BlackDuckProxyConverter;
-import org.artifactory.version.converter.v153.VirtualCacheCleanupConverter;
-import org.artifactory.version.converter.v160.AddonsDefaultLayoutConverter;
-import org.artifactory.version.converter.v160.MavenIndexerConverter;
-import org.artifactory.version.converter.v160.SingleRepoTypeConverter;
-import org.artifactory.version.converter.v160.SuppressConsitencyConverter;
-import org.artifactory.version.converter.v162.FolderDownloadConfigConverter;
-import org.artifactory.version.converter.v166.SourceDeletedDetectionConverter;
-import org.artifactory.version.converter.v167.TrashcanConfigConverter;
-import org.artifactory.version.converter.v167.UserLockConfigConverter;
-import org.artifactory.version.converter.v168.PasswordPolicyConverter;
-import org.artifactory.version.converter.v169.PasswordMaxAgeConverter;
-import org.artifactory.version.converter.v171.SimpleLayoutConverter;
-import org.artifactory.version.converter.v172.BlockMismatchingMimeTypesConverter;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * @author freds
- * @author Yossi Shaul
- */
-public enum ArtifactoryConfigVersion implements SubConfigElementVersion {
-    v100("http://artifactory.jfrog.org/xsd/1.0.0",
-            "http://www.jfrog.org/xsd/artifactory-v1_0_0.xsd",
-            ArtifactoryVersion.v122rc0,
-            ArtifactoryVersion.v125rc6,
-            new SnapshotUniqueVersionConverter(),
-            new BackupToElementConverter(),
-            new RepositoriesKeysConverter()),
-    v110("http://artifactory.jfrog.org/xsd/1.1.0",
-            "http://www.jfrog.org/xsd/artifactory-v1_1_0.xsd",
-            ArtifactoryVersion.v125,
-            ArtifactoryVersion.v125,
-            new SnapshotNonUniqueValueConverter()),
-    v120("http://artifactory.jfrog.org/xsd/1.2.0",
-            "http://www.jfrog.org/xsd/artifactory-v1_2_0.xsd",
-            ArtifactoryVersion.v125u1,
-            ArtifactoryVersion.v125u1,
-            new AnonAccessNameConverter()),
-    v130("http://artifactory.jfrog.org/xsd/1.3.0",
-            "http://www.jfrog.org/xsd/artifactory-v1_3_0.xsd",
-            ArtifactoryVersion.v130beta1,
-            ArtifactoryVersion.v130beta2,
-            new BackupListConverter(), new AnnonAccessUnderSecurityConverter(),
-            new LdapSettings130Converter()),
-    v131("http://artifactory.jfrog.org/xsd/1.3.1",
-            "http://www.jfrog.org/xsd/artifactory-v1_3_1.xsd",
-            ArtifactoryVersion.v130beta3,
-            ArtifactoryVersion.v130beta3,
-            new LdapAuthenticationPatternsConverter()),
-    v132("http://artifactory.jfrog.org/xsd/1.3.2",
-            "http://www.jfrog.org/xsd/artifactory-v1_3_2.xsd",
-            ArtifactoryVersion.v130beta4,
-            ArtifactoryVersion.v130beta4,
-            new BackupKeyConverter(), new LdapListConverter()),
-    v133("http://artifactory.jfrog.org/xsd/1.3.3",
-            "http://www.jfrog.org/xsd/artifactory-v1_3_3.xsd",
-            ArtifactoryVersion.v130beta5,
-            ArtifactoryVersion.v130beta61),
-    v134("http://artifactory.jfrog.org/xsd/1.3.4",
-            "http://www.jfrog.org/xsd/artifactory-v1_3_4.xsd",
-            ArtifactoryVersion.v130rc1,
-            ArtifactoryVersion.v130rc1,
-            new BackupExcludedVirtualRepoConverter()),
-    v135("http://artifactory.jfrog.org/xsd/1.3.5",
-            "http://www.jfrog.org/xsd/artifactory-v1_3_5.xsd",
-            ArtifactoryVersion.v130rc2,
-            ArtifactoryVersion.v205,
-            new ProxyNTHostConverter()),
-    v136("http://artifactory.jfrog.org/xsd/1.3.6",
-            "http://www.jfrog.org/xsd/artifactory-v1_3_6.xsd",
-            ArtifactoryVersion.v206,
-            ArtifactoryVersion.v208,
-            new IndexerCronRemoverConverter(), new RepositoryTypeConverter()),
-    v140("http://artifactory.jfrog.org/xsd/1.4.0",
-            "http://www.jfrog.org/xsd/artifactory-v1_4_0.xsd",
-            ArtifactoryVersion.v210,
-            ArtifactoryVersion.v210, new ProxyDefaultConverter()),
-    v141("http://artifactory.jfrog.org/xsd/1.4.1",
-            "http://www.jfrog.org/xsd/artifactory-v1_4_1.xsd",
-            ArtifactoryVersion.v211,
-            ArtifactoryVersion.v212,
-            new RepoIncludeExcludePatternsConverter()),
-    v142("http://artifactory.jfrog.org/xsd/1.4.2",
-            "http://www.jfrog.org/xsd/artifactory-v1_4_2.xsd",
-            ArtifactoryVersion.v213,
-            ArtifactoryVersion.v221,
-            new RemoteChecksumPolicyConverter()),
-    v143("http://artifactory.jfrog.org/xsd/1.4.3",
-            "http://www.jfrog.org/xsd/artifactory-v1_4_3.xsd",
-            ArtifactoryVersion.v222,
-            ArtifactoryVersion.v223,
-            new MultiLdapXmlConverter(), new ServerIdXmlConverter()),
-    v144("http://artifactory.jfrog.org/xsd/1.4.4",
-            "http://www.jfrog.org/xsd/artifactory-v1_4_4.xsd",
-            ArtifactoryVersion.v224,
-            ArtifactoryVersion.v225),
-    v145("http://artifactory.jfrog.org/xsd/1.4.5",
-            "http://www.jfrog.org/xsd/artifactory-v1_4_5.xsd",
-            ArtifactoryVersion.v230,
-            ArtifactoryVersion.v230),
-    v146("http://artifactory.jfrog.org/xsd/1.4.6",
-            "http://www.jfrog.org/xsd/artifactory-v1_4_6.xsd",
-            ArtifactoryVersion.v231,
-            ArtifactoryVersion.v231, new JfrogRemoteRepoUrlConverter(), new DefaultRepoLayoutConverter(),
-            new UnusedArtifactCleanupSwitchConverter()),
-    v147("http://artifactory.jfrog.org/xsd/1.4.7",
-            "http://www.jfrog.org/xsd/artifactory-v1_4_7.xsd",
-            ArtifactoryVersion.v232,
-            ArtifactoryVersion.v232),
-    v148("http://artifactory.jfrog.org/xsd/1.4.8",
-            "http://www.jfrog.org/xsd/artifactory-v1_4_8.xsd",
-            ArtifactoryVersion.v233,
-            ArtifactoryVersion.v2331, new ReplicationElementNameConverter()),
-    v149("http://artifactory.jfrog.org/xsd/1.4.9",
-            "http://www.jfrog.org/xsd/artifactory-v1_4_9.xsd",
-            ArtifactoryVersion.v234,
-            ArtifactoryVersion.v2341, new GcSystemPropertyConverter()),
-    v1410("http://artifactory.jfrog.org/xsd/1.4.10",
-            "http://www.jfrog.org/xsd/artifactory-v1_4_10.xsd",
-            ArtifactoryVersion.v240,
-            ArtifactoryVersion.v242),
-    v1411("http://artifactory.jfrog.org/xsd/1.4.11",
-            "http://www.jfrog.org/xsd/artifactory-v1_4_11.xsd",
-            ArtifactoryVersion.v250,
-            ArtifactoryVersion.v250, new IndexerCronExpPropertyConverter()),
-    v1412("http://artifactory.jfrog.org/xsd/1.4.12",
-            "http://www.jfrog.org/xsd/artifactory-v1_4_12.xsd",
-            ArtifactoryVersion.v251,
-            ArtifactoryVersion.v2511),
-    v1413("http://artifactory.jfrog.org/xsd/1.4.13",
-            "http://www.jfrog.org/xsd/artifactory-v1_4_13.xsd",
-            ArtifactoryVersion.v252,
-            ArtifactoryVersion.v252, new CleanupConfigConverter(), new AssumedOfflineConverter(),
-            new ArchiveBrowsingConverter()),
-    v1414("http://artifactory.jfrog.org/xsd/1.4.14",
-            "http://www.jfrog.org/xsd/artifactory-v1_4_14.xsd",
-            ArtifactoryVersion.v260,
-            ArtifactoryVersion.v261),
-    v1415("http://artifactory.jfrog.org/xsd/1.4.15",
-            "http://www.jfrog.org/xsd/artifactory-v1_4_15.xsd",
-            ArtifactoryVersion.v262,
-            ArtifactoryVersion.v263),
-    v1416("http://artifactory.jfrog.org/xsd/1.4.16",
-            "http://www.jfrog.org/xsd/artifactory-v1_4_16.xsd",
-            ArtifactoryVersion.v264,
-            ArtifactoryVersion.v264),
-    v1417("http://artifactory.jfrog.org/xsd/1.4.17",
-            "http://www.jfrog.org/xsd/artifactory-v1_4_17.xsd",
-            ArtifactoryVersion.v265,
-            ArtifactoryVersion.v265),
-    v1418("http://artifactory.jfrog.org/xsd/1.4.18",
-            "http://www.jfrog.org/xsd/artifactory-v1_4_18.xsd",
-            ArtifactoryVersion.v266,
-            ArtifactoryVersion.v2671),
-    v150("http://artifactory.jfrog.org/xsd/1.5.0",
-            "http://www.jfrog.org/xsd/artifactory-v1_5_0.xsd",
-            ArtifactoryVersion.v300,
-            ArtifactoryVersion.v302),
-    v151("http://artifactory.jfrog.org/xsd/1.5.1",
-            "http://www.jfrog.org/xsd/artifactory-v1_5_1.xsd",
-            ArtifactoryVersion.v3021,
-            ArtifactoryVersion.v303),
-    v152("http://artifactory.jfrog.org/xsd/1.5.2",
-            "http://www.jfrog.org/xsd/artifactory-v1_5_2.xsd",
-            ArtifactoryVersion.v304,
-            ArtifactoryVersion.v304, new BlackDuckProxyConverter()),
-    v153("http://artifactory.jfrog.org/xsd/1.5.3",
-            "http://www.jfrog.org/xsd/artifactory-v1_5_3.xsd",
-            ArtifactoryVersion.v310,
-            ArtifactoryVersion.v3111, new VirtualCacheCleanupConverter()),
-    v154("http://artifactory.jfrog.org/xsd/1.5.4",
-            "http://www.jfrog.org/xsd/artifactory-v1_5_4.xsd",
-            ArtifactoryVersion.v320,
-            ArtifactoryVersion.v322),
-    v155("http://artifactory.jfrog.org/xsd/1.5.5",
-            "http://www.jfrog.org/xsd/artifactory-v1_5_5.xsd",
-            ArtifactoryVersion.v330,
-            ArtifactoryVersion.v331),
-    v156("http://artifactory.jfrog.org/xsd/1.5.6",
-            "http://www.jfrog.org/xsd/artifactory-v1_5_6.xsd",
-            ArtifactoryVersion.v340,
-            ArtifactoryVersion.v341),
-    v157("http://artifactory.jfrog.org/xsd/1.5.7",
-            "http://www.jfrog.org/xsd/artifactory-v1_5_7.xsd",
-            ArtifactoryVersion.v342,
-            ArtifactoryVersion.v342),
-    v158("http://artifactory.jfrog.org/xsd/1.5.8",
-            "http://www.jfrog.org/xsd/artifactory-v1_5_8.xsd",
-            ArtifactoryVersion.v350,
-            ArtifactoryVersion.v350),
-    v159("http://artifactory.jfrog.org/xsd/1.5.9",
-            "http://www.jfrog.org/xsd/artifactory-v1_5_9.xsd",
-            ArtifactoryVersion.v351,
-            ArtifactoryVersion.v353),
-    v1510("http://artifactory.jfrog.org/xsd/1.5.10",
-            "http://www.jfrog.org/xsd/artifactory-v1_5_10.xsd",
-            ArtifactoryVersion.v360,
-            ArtifactoryVersion.v360),
-    v1511("http://artifactory.jfrog.org/xsd/1.5.11",
-            "http://www.jfrog.org/xsd/artifactory-v1_5_11.xsd",
-            ArtifactoryVersion.v370,
-            ArtifactoryVersion.v370),
-    v1512("http://artifactory.jfrog.org/xsd/1.5.12",
-            "http://www.jfrog.org/xsd/artifactory-v1_5_12.xsd",
-            ArtifactoryVersion.v380,
-            ArtifactoryVersion.v380),
-    v1513("http://artifactory.jfrog.org/xsd/1.5.13",
-            "http://www.jfrog.org/xsd/artifactory-v1_5_13.xsd",
-            ArtifactoryVersion.v390,
-            ArtifactoryVersion.v395, new AddonsDefaultLayoutConverter(), new SingleRepoTypeConverter(),
-            new SuppressConsitencyConverter(),new MavenIndexerConverter()),
-    v160("http://artifactory.jfrog.org/xsd/1.6.0",
-            "http://www.jfrog.org/xsd/artifactory-v1_6_0.xsd",
-            ArtifactoryVersion.v400,
-            ArtifactoryVersion.v400),
-    v161("http://artifactory.jfrog.org/xsd/1.6.1",
-            "http://www.jfrog.org/xsd/artifactory-v1_6_1.xsd",
-            ArtifactoryVersion.v401,
-            ArtifactoryVersion.v402, new FolderDownloadConfigConverter()),
-    v162("http://artifactory.jfrog.org/xsd/1.6.2",
-            "http://www.jfrog.org/xsd/artifactory-v1_6_2.xsd",
-            ArtifactoryVersion.v410,
-            ArtifactoryVersion.v412),
-    v163("http://artifactory.jfrog.org/xsd/1.6.3",
-            "http://www.jfrog.org/xsd/artifactory-v1_6_3.xsd",
-            ArtifactoryVersion.v413,
-            ArtifactoryVersion.v422),
-    v164("http://artifactory.jfrog.org/xsd/1.6.4",
-            "http://www.jfrog.org/xsd/artifactory-v1_6_4.xsd",
-            ArtifactoryVersion.v430,
-            ArtifactoryVersion.v430),
-    v165("http://artifactory.jfrog.org/xsd/1.6.5",
-            "http://www.jfrog.org/xsd/artifactory-v1_6_5.xsd",
-            ArtifactoryVersion.v431,
-            ArtifactoryVersion.v432, new SourceDeletedDetectionConverter()),
-    v166("http://artifactory.jfrog.org/xsd/1.6.6",
-            "http://www.jfrog.org/xsd/artifactory-v1_6_6.xsd",
-            ArtifactoryVersion.v433,
-            ArtifactoryVersion.v433, new UserLockConfigConverter(), new TrashcanConfigConverter()),
-    v167("http://artifactory.jfrog.org/xsd/1.6.7",
-            "http://www.jfrog.org/xsd/artifactory-v1_6_7.xsd",
-            ArtifactoryVersion.v440,
-            ArtifactoryVersion.v440, new PasswordPolicyConverter()),
-    v168("http://artifactory.jfrog.org/xsd/1.6.8",
-            "http://www.jfrog.org/xsd/artifactory-v1_6_8.xsd",
-            ArtifactoryVersion.v441,
-            ArtifactoryVersion.v441, new PasswordMaxAgeConverter()),
-    v169("http://artifactory.jfrog.org/xsd/1.6.9",
-            "http://www.jfrog.org/xsd/artifactory-v1_6_9.xsd",
-            ArtifactoryVersion.v442,
-            ArtifactoryVersion.v442),
-    v170("http://artifactory.jfrog.org/xsd/1.7.0",
-            "http://www.jfrog.org/xsd/artifactory-v1_7_0.xsd",
-            ArtifactoryVersion.v443,
-            ArtifactoryVersion.v452, new SimpleLayoutConverter()),
-    v171("http://artifactory.jfrog.org/xsd/1.7.1",
-            "http://www.jfrog.org/xsd/artifactory-v1_7_1.xsd",
-            ArtifactoryVersion.v460,
-            ArtifactoryVersion.v460,  new BlockMismatchingMimeTypesConverter()),
-    v172("http://artifactory.jfrog.org/xsd/1.7.2",
-            "http://www.jfrog.org/xsd/artifactory-v1_7_2.xsd",
-            ArtifactoryVersion.v461,
-            ArtifactoryVersion.v470),
-    v173("http://artifactory.jfrog.org/xsd/1.7.3",
-                 "http://www.jfrog.org/xsd/artifactory-v1_7_3.xsd",
-            ArtifactoryVersion.v471,
-            ArtifactoryVersion.v477),
-    v174("http://artifactory.jfrog.org/xsd/1.7.4",
-            "http://www.jfrog.org/xsd/artifactory-v1_7_4.xsd",
-            ArtifactoryVersion.v480,
-            ArtifactoryVersion.getCurrent());
-
-    private final String xsdUri;
-    private final String xsdLocation;
-    private final VersionComparator comparator;
-    private final XmlConverter[] converters;
-
-    /**
-     * @param from       The artifactory version this config version was first used
-     * @param until      The artifactory version this config was last used in (inclusive)
-     * @param converters A list of converters to use to move from <b>this</b> config version to the <b>next</b> config
-     *                   version
-     */
-    ArtifactoryConfigVersion(String xsdUri, String xsdLocation, ArtifactoryVersion from, ArtifactoryVersion until,
-            XmlConverter... converters) {
-        this.comparator = new VersionComparator(from, until);
-        this.xsdUri = xsdUri;
-        this.xsdLocation = xsdLocation;
-        this.converters = converters;
-    }
-
-    public static ArtifactoryConfigVersion getCurrent() {
-        ArtifactoryConfigVersion[] versions = ArtifactoryConfigVersion.values();
-        return versions[versions.length - 1];
-    }
-
-    public boolean isCurrent() {
-        return comparator.isCurrent();
-    }
-
-    public String convert(String in) {
-        // First create the list of converters to apply
-        List<XmlConverter> converters = new ArrayList<>();
-
-        // First thing to do is to change the namespace and schema location
-        converters.add(new NamespaceConverter());
-
-        // All converters of versions above me needs to be executed in sequence
-        ArtifactoryConfigVersion[] versions = ArtifactoryConfigVersion.values();
-        for (ArtifactoryConfigVersion version : versions) {
-            if (version.ordinal() >= ordinal() && version.getConverters() != null) {
-                converters.addAll(Arrays.asList(version.getConverters()));
-            }
-        }
-
-        return XmlConverterUtils.convert(converters, in);
-    }
-
-    public String getXsdUri() {
-        return xsdUri;
-    }
-
-    public String getXsdLocation() {
-        return xsdLocation;
-    }
-
-    public XmlConverter[] getConverters() {
-        return converters;
-    }
-
-    @Override
-    public VersionComparator getComparator() {
-        return comparator;
-    }
-
-    public static ArtifactoryConfigVersion getConfigVersion(String configXml) {
-        // Find correct version by schema URI
-        ArtifactoryConfigVersion[] configVersions = values();
-        for (ArtifactoryConfigVersion configVersion : configVersions) {
-            if (configXml.contains("\"" + configVersion.getXsdUri() + "\"")) {
-                return configVersion;
-            }
-        }
-        return null;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/ArtifactoryVersion.java b/base/config/src/main/java/org/artifactory/version/ArtifactoryVersion.java
deleted file mode 100644
index 872ba27..0000000
--- a/base/config/src/main/java/org/artifactory/version/ArtifactoryVersion.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * User: freds Date: May 29, 2008 Time: 10:15:59 AM
- */
-public enum ArtifactoryVersion {
-    v122rc0("1.2.2-rc0", 804),
-    v122rc1("1.2.2-rc1", 819),
-    v122rc2("1.2.2-rc2", 826),
-    v122("1.2.2", 836),
-    v125rc0("1.2.5-rc0", 970),
-    v125rc1("1.2.5-rc1", 1015),
-    v125rc2("1.2.5-rc2", 1082),
-    v125rc3("1.2.5-rc3", 1087),
-    v125rc4("1.2.5-rc4", 1104),
-    v125rc5("1.2.5-rc5", 1115),
-    v125rc6("1.2.5-rc6", 1136),
-    v125("1.2.5", 1154),
-    v125u1("1.2.5u1", 1174),
-    v130beta1("1.3.0-beta-1", 1501),
-    v130beta2("1.3.0-beta-2", 1509),
-    v130beta3("1.3.0-beta-3", 1992),
-    v130beta4("1.3.0-beta-4", 2065),
-    v130beta5("1.3.0-beta-5", 2282),
-    v130beta6("1.3.0-beta-6", 2862),
-    v130beta61("1.3.0-beta-6.1", 2897),
-    v130rc1("1.3.0-rc-1", 3148),
-    v130rc2("1.3.0-rc-2", 3392),
-    v200("2.0.0", 3498),
-    v201("2.0.1", 3768),
-    v202("2.0.2", 3947),
-    v203("2.0.3", 4468),
-    v204("2.0.4", 4781),
-    v205("2.0.5", 4903),
-    v206("2.0.6", 5625),
-    v207("2.0.7", 7453),
-    v208("2.0.8", 7829),
-    v210("2.1.0", 8350),
-    v211("2.1.1", 8514),
-    v212("2.1.2", 8706),
-    v213("2.1.3", 9204),
-    v220("2.2.0", 9932),
-    v221("2.2.1", 10024),
-    v222("2.2.2", 10427),
-    v223("2.2.3", 10588),
-    v224("2.2.4", 11256),
-    v225("2.2.5", 11524),
-    v230("2.3.0", 12450),
-    v231("2.3.1", 12714),
-    v232("2.3.2", 13005),
-    v233("2.3.3", 13011),
-    v2331("2.3.3.1", 13012),
-    v234("2.3.4", 13017),
-    v2341("2.3.4.1", 13021),
-    v240("2.4.0", 13048),
-    v241("2.4.1", 13050),
-    v242("2.4.2", 13059),
-    v250("2.5.0", 13086),
-    v251("2.5.1", 13089),
-    v2511("2.5.1.1", 13098),
-    v252("2.5.2", 13110),
-    v260("2.6.0", 13119),
-    v261("2.6.1", 13124),
-    v262("2.6.2", 13147),
-    v263("2.6.3", 13148),
-    v264("2.6.4", 13153),
-    v265("2.6.5", 13174),
-    v266("2.6.6", 13183),
-    v267("2.6.7", 13201),
-    v2671("2.6.7.1", 13243),
-    v300("3.0.0", 30001),
-    v301("3.0.1", 30008),
-    v302("3.0.2", 30017),
-    v3021("3.0.2.1", 30034),
-    v303("3.0.3", 30044),
-    v304("3.0.4", 30058),
-    v310("3.1.0", 30062),
-    v311("3.1.1", 30072),
-    v3111("3.1.1.1", 30080),
-    v320("3.2.0", 30088),
-    v321("3.2.1", 30093),
-    v3211("3.2.1.1", 30094),
-    v322("3.2.2", 30097),
-    v330("3.3.0", 30104),
-    v3301("3.3.0.1", 30106),
-    v331("3.3.1", 30120),
-    v340("3.4.0", 30125),
-    v3401("3.4.0.1",30126),
-    v341("3.4.1", 30130),
-    v342("3.4.2", 30140),
-    v350("3.5.0", 30150),
-    v351("3.5.1", 30152),
-    v352("3.5.2", 30159),
-    v3521("3.5.2.1", 30160),
-    v353("3.5.3", 30172),
-	v360("3.6.0", 30178),
-    v370("3.7.0", 30185),
-    v380("3.8.0", 30190),
-    v390("3.9.0", 30199),
-    v391("3.9.1", 30200),
-    v392("3.9.2", 30204),
-    v393("3.9.3", 30224),
-    v394("3.9.4", 30226),
-    v395("3.9.5", 30242),
-    v400("4.0.0", 40005),
-    v401("4.0.1", 40008),
-    v402("4.0.2", 40009),
-    v410("4.1.0", 40011),
-    v411("4.1.1", 40016),
-    v412("4.1.2", 40017),
-    v413("4.1.3", 40020),
-    v420("4.2.0", 40030),
-    v421("4.2.1", 40045),
-    v422("4.2.2", 40049),
-    v430("4.3.0", 40057),
-    v431("4.3.1", 40062),
-    v432("4.3.2", 40063),
-    v433("4.3.3", 40071),
-    v440("4.4.0", 40080),
-    v441("4.4.1", 40089),
-    v442("4.4.2", 40093),
-    v443("4.4.3", 40110),
-    v450("4.5.0", 40115),
-    v451("4.5.1", 40117),
-    v452("4.5.2", 40121),
-    v460("4.6.0", 40135),
-    v461("4.6.1", 40143),
-    v470("4.7.0", 40155),
-    v471("4.7.1", 40159),
-    v472("4.7.2", 40162),
-    v473("4.7.3", 40167),
-    v474("4.7.4", 40169),
-    v475("4.7.5", 40176),
-    v476("4.7.6", 40195),
-    v477("4.7.7", 40199),
-    v480("4.8.0", Integer.MAX_VALUE);
-
-    public static ArtifactoryVersion getCurrent() {
-        ArtifactoryVersion[] versions = ArtifactoryVersion.values();
-        return versions[versions.length - 1];
-    }
-
-    private final String value;
-    private final int revision;
-    private final Map<String, SubConfigElementVersion> subConfigElementVersionsByClass =
-            new HashMap<>();
-
-    ArtifactoryVersion(String value, int revision) {
-        this.value = value;
-        this.revision = revision;
-    }
-
-    public static <T extends SubConfigElementVersion> void addSubConfigElementVersion(T scev,
-            VersionComparator versionComparator) {
-        ArtifactoryVersion[] versions = values();
-        for (ArtifactoryVersion version : versions) {
-            if (versionComparator.supports(version)) {
-                version.subConfigElementVersionsByClass.put(scev.getClass().getName(), scev);
-            }
-        }
-    }
-
-    @SuppressWarnings({"unchecked"})
-    public <T extends SubConfigElementVersion> T getSubConfigElementVersion(Class<T> subConfigElementVersion) {
-        return (T) subConfigElementVersionsByClass.get(subConfigElementVersion.getName());
-    }
-
-    public String getValue() {
-        return value;
-    }
-
-    public long getRevision() {
-        return revision;
-    }
-
-    public boolean isCurrent() {
-        return this == getCurrent();
-    }
-
-    /**
-     * @param otherVersion The other ArtifactoryVersion
-     * @return returns true if this version is before the other version
-     */
-    public boolean before(ArtifactoryVersion otherVersion) {
-        return this.compareTo(otherVersion) < 0;
-    }
-
-    /**
-     * @param otherVersion The other ArtifactoryVersion
-     * @return returns true if this version is after the other version
-     */
-    public boolean after(ArtifactoryVersion otherVersion) {
-        return this.compareTo(otherVersion) > 0;
-    }
-
-    /**
-     * @param otherVersion The other ArtifactoryVersion
-     * @return returns true if this version is before or equal to the other version
-     */
-    public boolean beforeOrEqual(ArtifactoryVersion otherVersion) {
-        return this == otherVersion || this.compareTo(otherVersion) < 0;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/ArtifactoryVersionReader.java b/base/config/src/main/java/org/artifactory/version/ArtifactoryVersionReader.java
deleted file mode 100644
index 891216c..0000000
--- a/base/config/src/main/java/org/artifactory/version/ArtifactoryVersionReader.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version;
-
-import org.apache.commons.io.IOUtils;
-import org.artifactory.common.ConstantValues;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Properties;
-
-/**
- * Returns ArtifactoryVersion object from a properties stream/file.
- *
- * @author Yossi Shaul
- */
-public class ArtifactoryVersionReader {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryVersionReader.class);
-
-    public static CompoundVersionDetails read(InputStream inputStream) {
-        if (inputStream == null) {
-            throw new IllegalArgumentException("Artifactory properties input stream cannot be null");
-        }
-        Properties props = new Properties();
-        try {
-            props.load(inputStream);
-        } catch (IOException e) {
-            throw new RuntimeException("Cannot read input property stream", e);
-        } finally {
-            IOUtils.closeQuietly(inputStream);
-        }
-        String versionString = props.getProperty(ConstantValues.artifactoryVersion.getPropertyName());
-        String revisionString = props.getProperty(ConstantValues.artifactoryRevision.getPropertyName());
-        String timestampString = props.getProperty(ConstantValues.artifactoryTimestamp.getPropertyName());
-
-        return getCompoundVersionDetails(versionString, revisionString, timestampString);
-    }
-
-    public static CompoundVersionDetails getCompoundVersionDetails(String versionString, String revisionString,
-            String timestampString) {
-        ArtifactoryVersion matchedVersion = null;
-        // If current version or development version=${project.version.prop} or revision=${buildNumber}
-        if (ArtifactoryVersion.getCurrent().getValue().equals(versionString) ||
-                versionString.startsWith("${") ||
-                versionString.endsWith("-SNAPSHOT") ||
-                revisionString.startsWith("${")) {
-            // Just return the current version
-            matchedVersion = ArtifactoryVersion.getCurrent();
-        }
-
-        long timestamp;
-        try {
-            timestamp = Long.parseLong(timestampString);
-        } catch (Exception e) {
-            timestamp = 0;
-        }
-
-        if (matchedVersion == null) {
-            matchedVersion = findByVersionString(versionString, revisionString);
-            if (matchedVersion != null) {
-                log.warn("Closest matched version: {}", matchedVersion.getValue());
-            }
-        }
-        if (matchedVersion == null) {
-            matchedVersion = findClosestMatch(versionString, revisionString);
-            if (matchedVersion != null) {
-                log.warn("Closest matched version: {}", matchedVersion.getValue());
-            }
-        }
-
-        if (matchedVersion == null) {
-            throw new IllegalStateException("No version declared is higher than " + revisionString);
-        }
-
-        return new CompoundVersionDetails(matchedVersion, versionString, revisionString, timestamp);
-    }
-
-    private static ArtifactoryVersion findByVersionString(String versionString, String revisionString) {
-        int artifactoryRevision = Integer.parseInt(revisionString);
-        for (ArtifactoryVersion version : ArtifactoryVersion.values()) {
-            if (version.getValue().equals(versionString)) {
-                if (artifactoryRevision != version.getRevision()) {
-                    log.warn("Version found is " + version + " but the revision " +
-                            artifactoryRevision + " is not the one supported!\n" +
-                            "Reading the folder may work with this version.\n" +
-                            "For Information: Using the Command Line Tool is preferable in this case.");
-                }
-                return version;
-            }
-        }
-        return null;
-    }
-
-    private static ArtifactoryVersion findClosestMatch(String versionString, String revisionString) {
-        int artifactoryRevision = Integer.parseInt(revisionString);
-        log.warn("Version " + versionString + " is not an official release version. " +
-                "The closest released revision to " + artifactoryRevision + " will be used to determine the current " +
-                "version.\nWarning: This version is unsupported! Reading backup data may not work!\n");
-        ArtifactoryVersion[] values = ArtifactoryVersion.values();
-        for (int i = values.length - 1; i >= 0; i--) {
-            ArtifactoryVersion version = values[i];
-            if (artifactoryRevision >= version.getRevision()) {
-                return version;
-            }
-        }
-        return null;
-    }
-
-    public static CompoundVersionDetails read(File propertiesFile) {
-        if (propertiesFile == null) {
-            throw new IllegalArgumentException("Null properties file is not allowed");
-        }
-        try {
-            return read(new FileInputStream(propertiesFile));
-        } catch (FileNotFoundException e) {
-            throw new RuntimeException("Properties file " + propertiesFile.getName() + " doesn't exist");
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/CompoundVersionDetails.java b/base/config/src/main/java/org/artifactory/version/CompoundVersionDetails.java
deleted file mode 100644
index a2bc57d..0000000
--- a/base/config/src/main/java/org/artifactory/version/CompoundVersionDetails.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version;
-
-import org.apache.commons.lang.StringUtils;
-
-/**
- * Holds all the version data about Artifactory. version name, and revision from the properties file and
- * ArtifactoryVersion that matches those values.
- *
- * @author Yossi Shaul
- */
-public class CompoundVersionDetails {
-    private final ArtifactoryVersion version;
-    private final String versionName;
-    private final String revision;
-    private final long timestamp;
-
-    public CompoundVersionDetails(ArtifactoryVersion version, String versionName, String revision, long timestamp) {
-        this.version = version;
-        this.versionName = versionName;
-        this.revision = revision;
-        this.timestamp = timestamp;
-    }
-
-    /**
-     * @return The closest matched version for the input stream/file
-     */
-    public ArtifactoryVersion getVersion() {
-        return version;
-    }
-
-    /**
-     * @return The raw version string as read from the input stream/file
-     */
-    public String getVersionName() {
-        return versionName;
-    }
-
-    /**
-     * @return The raw revision string as read from the input stream/file
-     */
-    public String getRevision() {
-        return revision;
-    }
-
-    /**
-     * @return Artifactory release timestamp
-     */
-    public long getTimestamp() {
-        return timestamp;
-    }
-
-    public boolean isCurrent() {
-        return version.isCurrent();
-    }
-
-    public int getRevisionInt() {
-        int rev = 0;
-        if (StringUtils.isNotBlank(revision) && StringUtils.isNumeric(revision) &&
-                !("" + Integer.MAX_VALUE).equals(revision)) {
-            rev = Integer.valueOf(revision);
-        }
-        return rev;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        CompoundVersionDetails details = (CompoundVersionDetails) o;
-        return revision.equals(details.revision) && version == details.version &&
-                versionName.equals(details.versionName);
-
-    }
-
-    @Override
-    public int hashCode() {
-        int result = version.hashCode();
-        result = 31 * result + versionName.hashCode();
-        result = 31 * result + revision.hashCode();
-        return result;
-    }
-
-    @Override
-    public String toString() {
-        return "version='" + versionName + '\'' +
-                ", revision='" + revision + '\'' +
-                ", released version=" + version;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/ConfigVersion.java b/base/config/src/main/java/org/artifactory/version/ConfigVersion.java
deleted file mode 100644
index 40102bd..0000000
--- a/base/config/src/main/java/org/artifactory/version/ConfigVersion.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version;
-
-/**
- * Holds the various Artifactory configuration versions. Each configuration version represents a range of versions that
- * use the same underlying sub-config versions (of metadata, security etc.). Config versions can be used to determine if
- * conversion from one version to another is needed (different sub config elements), if such conversion is possible, and
- * whether it can be done automatically.
- *
- * @author Yossi Shaul
- */
-public enum ConfigVersion implements SubConfigElementVersion {
-    v1(ArtifactoryVersion.v122rc0, ArtifactoryVersion.v130beta2, false),
-    v2(ArtifactoryVersion.v130beta3, ArtifactoryVersion.v130beta5, false),
-    v3(ArtifactoryVersion.v130beta6, ArtifactoryVersion.v130beta61, false),
-    v4(ArtifactoryVersion.v130rc1, ArtifactoryVersion.v208),
-    v5(ArtifactoryVersion.v210, ArtifactoryVersion.getCurrent());
-
-    private final VersionComparator comparator;
-    private final boolean autoUpdateCapable;
-
-    ConfigVersion(ArtifactoryVersion from, ArtifactoryVersion until) {
-        this(from, until, true);
-    }
-
-    ConfigVersion(ArtifactoryVersion from, ArtifactoryVersion until, boolean autoUpdateCapable) {
-        this.comparator = new VersionComparator( from, until);
-        this.autoUpdateCapable = autoUpdateCapable;
-    }
-
-    public boolean isAutoUpdateCapable() {
-        return autoUpdateCapable;
-    }
-
-    public boolean isCurrent() {
-        return comparator.isCurrent();
-    }
-
-    public boolean isCompatibleWith(ArtifactoryVersion version) {
-        return comparator.supports(version);
-    }
-
-    public boolean isBefore(ArtifactoryVersion version) {
-        return comparator.isBefore(version);
-    }
-
-    public boolean isAfter(ArtifactoryVersion version) {
-        return comparator.isAfter(version);
-    }
-
-    @Override
-    public VersionComparator getComparator() {
-        return comparator;
-    }
-
-    public static ConfigVersion findCompatibleVersion(ArtifactoryVersion version) {
-        for (ConfigVersion configVersion : values()) {
-            if (configVersion.isCompatibleWith(version)) {
-                return configVersion;
-            }
-        }
-        throw new IllegalArgumentException(
-                "No compatible storage version found for exiting Artifactory storage version: " + version + ".");
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/SubConfigElementVersion.java b/base/config/src/main/java/org/artifactory/version/SubConfigElementVersion.java
deleted file mode 100644
index 23b41ef..0000000
--- a/base/config/src/main/java/org/artifactory/version/SubConfigElementVersion.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version;
-
-/**
- * Version of a configuration element that is part of the global ArtifactoryVersion
- *
- * @author Noam Tenne
- */
-public interface SubConfigElementVersion {
-    VersionComparator getComparator();
-}
diff --git a/base/config/src/main/java/org/artifactory/version/VersionComparator.java b/base/config/src/main/java/org/artifactory/version/VersionComparator.java
deleted file mode 100644
index b6734c2..0000000
--- a/base/config/src/main/java/org/artifactory/version/VersionComparator.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version;
-
-/**
- * @author freds
- * @date Nov 18, 2008
- */
-public class VersionComparator {
-    private final ArtifactoryVersion from;
-    private final ArtifactoryVersion until;
-
-    public VersionComparator(ArtifactoryVersion from, ArtifactoryVersion until) {
-        this.from = from;
-        this.until = until;
-    }
-
-    public boolean isCurrent() {
-        return until.isCurrent();
-    }
-
-    public boolean isBefore(ArtifactoryVersion version) {
-        return until.before(version);
-    }
-
-    public boolean isAfter(ArtifactoryVersion version) {
-        return from.after(version);
-    }
-
-    public boolean supports(ArtifactoryVersion version) {
-        return from.beforeOrEqual(version) && version.beforeOrEqual(until);
-    }
-
-    public boolean supports(int revision) {
-        return from.getRevision() <= revision && revision <= until.getRevision();
-    }
-
-    public ArtifactoryVersion getFrom() {
-        return from;
-    }
-
-    public ArtifactoryVersion getUntil() {
-        return until;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/XmlConverterUtils.java b/base/config/src/main/java/org/artifactory/version/XmlConverterUtils.java
deleted file mode 100644
index 72ef6e9..0000000
--- a/base/config/src/main/java/org/artifactory/version/XmlConverterUtils.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version;
-
-import org.artifactory.util.XmlUtils;
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-
-import java.util.List;
-
-/**
- * @author freds
- * @date Nov 9, 2008
- */
-public abstract class XmlConverterUtils {
-    // ATTENTION: NO LOGGER IN HERE SINCE IT IS CALLED BY LOGGER CONVERTER => STACK OVERFLOW
-
-    private XmlConverterUtils() {
-        // utility class
-    }
-
-    public static String convert(List<XmlConverter> converters, String in) {
-        // If no converters nothing to do
-        if (converters.isEmpty()) {
-            return in;
-        }
-        Document doc = XmlUtils.parse(in);
-        for (XmlConverter converter : converters) {
-            converter.convert(doc);
-        }
-        return XmlUtils.outputString(doc);
-    }
-
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/ConfigurationConverter.java b/base/config/src/main/java/org/artifactory/version/converter/ConfigurationConverter.java
deleted file mode 100644
index 06886f3..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/ConfigurationConverter.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter;
-
-/**
- * Marker interface for your friendly converters
- *
- * @author Noam Tenne
- */
-public interface ConfigurationConverter<T> {
-    void convert(T config);
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/NamespaceConverter.java b/base/config/src/main/java/org/artifactory/version/converter/NamespaceConverter.java
deleted file mode 100644
index d3851cc..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/NamespaceConverter.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter;
-
-import org.artifactory.version.ArtifactoryConfigVersion;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-
-import java.util.List;
-
-/**
- * Changes the namespace and the schema location to the latest.
- *
- * @author Yossi Shaul
- */
-public class NamespaceConverter implements XmlConverter {
-    @Override
-    @SuppressWarnings({"unchecked"})
-    public void convert(Document doc) {
-        // change the xsd uri and schema location
-        String currentXsdUri = ArtifactoryConfigVersion.getCurrent().getXsdUri();
-        String currentXsdLocation = ArtifactoryConfigVersion.getCurrent().getXsdLocation();
-        Namespace ns = Namespace.getNamespace(currentXsdUri);
-        Element root = doc.getRootElement();
-        // Check that schema instance namespace is there before adding schema location...
-        Namespace schemaInstanceNS = Namespace.getNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
-        List<Namespace> namespaces = root.getAdditionalNamespaces();
-        boolean hasSchemaInstanceNS = false;
-        for (Namespace namespace : namespaces) {
-            // The equality is only on URI so hardcoded prefix does not impact
-            if (namespace.equals(schemaInstanceNS)) {
-                hasSchemaInstanceNS = true;
-            }
-        }
-        if (!hasSchemaInstanceNS) {
-            root.addNamespaceDeclaration(schemaInstanceNS);
-        }
-        root.setAttribute("schemaLocation", currentXsdUri + " " + currentXsdLocation, schemaInstanceNS);
-
-        changeNameSpace(root, ns);
-    }
-
-    private void changeNameSpace(Element element, Namespace ns) {
-        element.setNamespace(ns);
-        for (Object childElements : element.getChildren()) {
-            changeNameSpace((Element) childElements, ns);
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/SnapshotUniqueVersionConverter.java b/base/config/src/main/java/org/artifactory/version/converter/SnapshotUniqueVersionConverter.java
deleted file mode 100644
index e4980f7..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/SnapshotUniqueVersionConverter.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter;
-
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- * <pre>
- * Convert
- * <useSnapshotUniqueVersions>true</useSnapshotUniqueVersions>
- * to
- * <snapshotVersionBehavior>deployer</snapshotVersionBehavior>
- * and
- * <useSnapshotUniqueVersions>false</useSnapshotUniqueVersions>
- * to
- * <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
- * </pre>
- * Rename the element "useSnapshotUniqueVersions" to "snapshotVersionBehavior" and change the values "true" to
- * "deployer" and "false" to "non-unique".
- * <p/>
- * The element might appear under the localRepo element. Was valid only in version 1.0.0 of the schema.
- *
- * @author Yossi Shaul
- */
-public class SnapshotUniqueVersionConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(SnapshotUniqueVersionConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        Element root = doc.getRootElement();
-        Namespace ns = root.getNamespace();
-
-        List localRepos = root.getChild("localRepositories", ns).getChildren();
-        for (Object localRepo1 : localRepos) {
-            Element localRepo = (Element) localRepo1;
-            Element snapshotBehavior = localRepo.getChild("useSnapshotUniqueVersions", ns);
-            if (snapshotBehavior != null) {
-                // rename the element
-                snapshotBehavior.setName("snapshotVersionBehavior");
-                String repoKey = localRepo.getChildText("key", ns);
-                log.debug("Renamed element 'useSnapshotUniqueVersions' to " +
-                        "'snapshotVersionBehavior' for repo {}", repoKey);
-
-                // change the element value
-                if (snapshotBehavior.getText().equals("true")) {
-                    log.debug("Changed value 'true' to 'deployer' for repo {}", repoKey);
-                    snapshotBehavior.setText("deployer");
-                } else if (snapshotBehavior.getText().equals("false")) {
-                    log.debug("Changed value 'false' to 'non-unique' for repo {}", repoKey);
-                    snapshotBehavior.setText("non-unique");
-                }
-            }
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/XmlConverter.java b/base/config/src/main/java/org/artifactory/version/converter/XmlConverter.java
deleted file mode 100644
index 7e105d6..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/XmlConverter.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter;
-
-import org.jdom2.Document;
-
-/**
- * An XmlConverter converts one xml to another one so it will adhere to a new schema.
- *
- * @author Yossi Shaul
- */
-public interface XmlConverter extends ConfigurationConverter<Document> {
-    @Override
-    void convert(Document doc);
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v100/BackupToElementConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v100/BackupToElementConverter.java
deleted file mode 100644
index bfb872a..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v100/BackupToElementConverter.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v100;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * <pre>
- * Convers
- *    <backupDir>XX</backupDir>
- *    <backupCronExp>YY</backupCronExp>
- * to:
- *    <backup>
- *        <dir>XX</dir>
- *        <cronExp>YY</cronExp>
- *    </backup>
- * </pre>
- * <p/>
- * Those backup elements were directly under the root in version 1.0.0 of the schema. The new backup element should be
- * placed before the localRepositories element.
- *
- * @author Yossi Shaul
- */
-public class BackupToElementConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(BackupToElementConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        Element root = doc.getRootElement();
-        Namespace ns = root.getNamespace();
-
-        Element backupDir = root.getChild("backupDir", ns);
-        if (backupDir != null) {
-            root.removeContent(backupDir);
-            backupDir.setName("dir");
-            log.debug("Renamed 'backupDir' to 'dir'");
-        }
-
-        Element backupCron = root.getChild("backupCronExp", ns);
-        if (backupCron != null) {
-            root.removeContent(backupCron);
-            backupCron.setName("cronExp");
-            log.debug("Renamed 'backupCronExp' to 'cronExp'");
-        }
-
-        if (backupDir != null && backupCron != null) {
-            // create the new <backup> element and place before the localRepositories
-            Element backup = new Element("backup", ns);
-            backup.addContent(backupDir);
-            backup.addContent(backupCron);
-            int localReposLocation = root.indexOf(root.getChild("localRepositories", ns));
-            root.addContent(localReposLocation, backup);
-        } else {
-            log.debug("No backup elements found");
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v100/RepositoriesKeysConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v100/RepositoriesKeysConverter.java
deleted file mode 100644
index 88a4e93..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v100/RepositoriesKeysConverter.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v100;
-
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Converts repositories key values. This converter is neccessary for repository keys starting with numbers since
- * starting with 1.1.0 the repo keys are xml ids. The keys to replace should pass as system properties and filled in
- * ArtifactoryConstants.
- *
- * @author Yossi Shaul
- */
-public class RepositoriesKeysConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(RepositoriesKeysConverter.class);
-
-    @Override
-    @SuppressWarnings({"unchecked"})
-    public void convert(Document doc) {
-        Element root = doc.getRootElement();
-        Namespace ns = root.getNamespace();
-
-        // get all local repositories
-        Element localReposWrapper = root.getChild("localRepositories", ns);
-        List localRepos = localReposWrapper.getChildren();
-        List repos = new ArrayList(localRepos);
-
-        // and add all remote repositories if any
-        Element remoteReposWrapper = root.getChild("remoteRepositories", ns);
-        if (remoteReposWrapper != null) {
-            List remoteRepos = remoteReposWrapper.getChildren();
-            if (remoteRepos != null) {
-                repos.addAll(remoteRepos);
-            }
-        }
-
-        for (Object repo : repos) {
-            Element localRepo = (Element) repo;
-            Element keyElement = localRepo.getChild("key", ns);
-            String key = keyElement.getText();
-            Map<String, String> keys = ArtifactoryHome.get().getArtifactoryProperties().getSubstituteRepoKeys();
-            if (keys.containsKey(key)) {
-                String newKey = keys.get(key);
-                log.debug("Changing repository key from {} to {}", key, newKey);
-                keyElement.setText(newKey);
-            }
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v110/SnapshotNonUniqueValueConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v110/SnapshotNonUniqueValueConverter.java
deleted file mode 100644
index 9b31f57..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v110/SnapshotNonUniqueValueConverter.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v110;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- * <pre>
- * Converts:
- * <snapshotVersionBehavior>nonunique</snapshotVersionBehavior>
- * Into:
- * <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
- * </pre>
- * <p/>
- * The element snapshotVersionBehavior might appear under a localRepository element. Was valid until version 1.1.0 of
- * the schema.
- *
- * @author Yossi Shaul
- */
-public class SnapshotNonUniqueValueConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(SnapshotNonUniqueValueConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        Element root = doc.getRootElement();
-        Namespace ns = root.getNamespace();
-
-        List localRepos = root.getChild("localRepositories", ns).getChildren();
-        for (Object localRepo1 : localRepos) {
-            Element localRepo = (Element) localRepo1;
-            Element snapshotBehavior = localRepo.getChild("snapshotVersionBehavior", ns);
-            if (snapshotBehavior != null && "nonunique".equals(snapshotBehavior.getText())) {
-                log.debug("Changing value 'nonunique' to 'non-unique' for repo {}",
-                        localRepo.getChildText("key", ns));
-                snapshotBehavior.setText("non-unique");
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v120/AnonAccessNameConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v120/AnonAccessNameConverter.java
deleted file mode 100644
index 71df841..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v120/AnonAccessNameConverter.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v120;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Renames the element "anonDownloadsAllowed" to "anonAccessEnabled". This element was directly under the root element.
- * Was valid until version 1.2.0 of the schema.
- *
- * @author Yossi Shaul
- */
-public class AnonAccessNameConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(AnonAccessNameConverter.class);
-
-    private static final String OLD_ANNON = "anonDownloadsAllowed";
-    private static final String NEW_ANNON = "anonAccessEnabled";
-
-    @Override
-    public void convert(Document doc) {
-        Element root = doc.getRootElement();
-        Element oldAnnon = root.getChild(OLD_ANNON, root.getNamespace());
-        if (oldAnnon != null) {
-            oldAnnon.setName(NEW_ANNON);
-            log.debug("Element {} found and converted", OLD_ANNON);
-        } else {
-            log.debug("Element {} not found", OLD_ANNON);
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v130/AnnonAccessUnderSecurityConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v130/AnnonAccessUnderSecurityConverter.java
deleted file mode 100644
index e892b25..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v130/AnnonAccessUnderSecurityConverter.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v130;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * <pre>
- * Convert:
- * <anonAccessEnabled>XXX</anonAccessEnabled>
- * to:
- * <security>
- *     <anonAccessEnabled>XXX</anonAccessEnabled>
- *     .....
- * </security>
- * </pre>
- * <p/>
- * anonAccessEnabled and security were not mandatory so need to check for nulls. Was valid until version 1.3.0 of the
- * schema.
- *
- * @author Yossi Shaul
- */
-public class AnnonAccessUnderSecurityConverter implements XmlConverter {
-    private static final Logger log =
-            LoggerFactory.getLogger(AnnonAccessUnderSecurityConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-
-        Element root = doc.getRootElement();
-        Namespace ns = root.getNamespace();
-        Element annonAccess = root.getChild("anonAccessEnabled", ns);
-        if (annonAccess == null) {
-            log.debug("Element anonAccessEnabled not found");
-            return;
-        }
-
-        root.removeContent(annonAccess);
-
-        Element security = root.getChild("security", ns);
-        if (security == null) {
-            security = new Element("security", ns);
-            security.addContent(annonAccess);
-            // serverName, anonAccessEnabled, fileUploadMaxSizeMb, dateFormat
-            int location = findLastLocation(root,
-                    "serverName", "anonAccessEnabled", "fileUploadMaxSizeMb", "dateFormat");
-            root.addContent(location + 1, security);
-        } else {
-            security.addContent(0, annonAccess);
-        }
-    }
-
-    private int findLastLocation(Element parent, String... elements) {
-        for (int i = elements.length - 1; i >= 0; i--) {
-            Element child = parent.getChild(elements[i], parent.getNamespace());
-            if (child != null) {
-                return parent.indexOf(child);
-            }
-        }
-        return -1;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v130/BackupListConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v130/BackupListConverter.java
deleted file mode 100644
index 941c1b7..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v130/BackupListConverter.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v130;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-
-/**
- * <pre>
- * Converts:
- *   <backup>...</backup>
- * into:
- *   <backups>
- *     <backup>...</backup>
- *   </backups>
- * </pre>
- * The backup element was directly under the root element. Was valid until version 1.3.0 of the schema.
- *
- * @author Yossi Shaul
- */
-public class BackupListConverter implements XmlConverter {
-
-    @Override
-    public void convert(Document doc) {
-        Element root = doc.getRootElement();
-        Namespace ns = root.getNamespace();
-
-        Element backup = root.getChild("backup", ns);
-        if (backup != null) {
-            int location = root.indexOf(backup);
-            root.removeContent(location);
-            Element backups = new Element("backups", ns);
-            backups.addContent(backup);
-            root.addContent(location, backups);
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v130/LdapSettings130Converter.java b/base/config/src/main/java/org/artifactory/version/converter/v130/LdapSettings130Converter.java
deleted file mode 100644
index 0d2eba4..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v130/LdapSettings130Converter.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v130;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Schema version 1.3.1 removed the authenticationMethod and searchAuthPasswordAttributeName from the ldap settings
- * element.
- *
- * @author Yossi Shaul
- */
-public class LdapSettings130Converter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(LdapSettings130Converter.class);
-
-    @Override
-    public void convert(Document doc) {
-        Element root = doc.getRootElement();
-        Namespace ns = root.getNamespace();
-        Element security = root.getChild("security", ns);
-        if (security == null) {
-            log.debug("no security settings");
-            return;
-        }
-
-        Element ldap = security.getChild("ldapSettings", ns);
-        if (ldap == null) {
-            log.debug("no ldap settings");
-            return;
-        }
-
-        ldap.removeChild("authenticationMethod", ns);
-        ldap.removeChild("searchAuthPasswordAttributeName", ns);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v131/LdapAuthenticationPatternsConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v131/LdapAuthenticationPatternsConverter.java
deleted file mode 100644
index 87e3808..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v131/LdapAuthenticationPatternsConverter.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v131;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * <pre>
- * Converts:
- *   <ldapSettings>
- *       ...
- *       <userDnPattern>...</userDnPattern>
- *   </ldapSettings>
- * into:
- *  <authenticationPatterns><authenticationPattern>
- *      <userDnPattern>...</userDnPattern>
- *  </authenticationPattern></authenticationPatterns>
- * </pre>
- * <p/>
- * Was valid until version 1.3.1 of the schema.
- *
- * @author Yossi Shaul
- */
-public class LdapAuthenticationPatternsConverter implements XmlConverter {
-    private static final Logger log =
-            LoggerFactory.getLogger(LdapAuthenticationPatternsConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        Element root = doc.getRootElement();
-        Namespace ns = root.getNamespace();
-        Element security = root.getChild("security", ns);
-        if (security != null) {
-            Element ldapSettings = security.getChild("ldapSettings", ns);
-            if (ldapSettings != null) {
-                Element userDn = ldapSettings.getChild("userDnPattern", ns);
-                if (userDn != null) {
-                    log.debug("Moving userDnPattern under authenticationPatterns");
-                    int location = ldapSettings.indexOf(userDn);
-                    ldapSettings.removeContent(userDn);
-                    Element authPatterns = new Element("authenticationPatterns", ns);
-                    Element authPattern = new Element("authenticationPattern", ns);
-                    authPattern.addContent(userDn);
-                    authPatterns.addContent(authPattern);
-                    ldapSettings.addContent(location, authPatterns);
-                }
-            } else {
-                log.debug("No ldap settings found");
-            }
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v132/BackupKeyConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v132/BackupKeyConverter.java
deleted file mode 100644
index 40580b0..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v132/BackupKeyConverter.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v132;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Add a key to the backup elements and remove backups without cronExp. This change is from schema 1.3.2 to 1.3.3.
- *
- * @author Yossi Shaul
- */
-public class BackupKeyConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(BackupKeyConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        Element root = doc.getRootElement();
-        Namespace ns = root.getNamespace();
-
-        Element backupsElement = root.getChild("backups", ns);
-        List backups = null;
-        if (backupsElement != null) {
-            backups = backupsElement.getChildren("backup", ns);
-            int generatedKeyIndex = 1;
-            Iterator iterator = backups.iterator();
-            while (iterator.hasNext()) {
-                Element backup = (Element) iterator.next();
-                Element cronExp = backup.getChild("cronExp", ns);
-                if (cronExp == null) {
-                    log.debug("Removing a backup without cron expression");
-                    iterator.remove();
-                    //backupsElement.removeContent(backup);
-                } else {
-                    // generate backup unique key and add to the backup element
-                    String key = "backup" + generatedKeyIndex++;
-                    Element keyElement = new Element("key", ns);
-                    keyElement.setText(key);
-                    backup.addContent(0, keyElement);
-                    log.debug("Generated key '{}' for backup element", key);
-                }
-            }
-        }
-
-        if (backupsElement == null || backups.isEmpty()) {
-            log.debug("No backups found");
-        }
-
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v132/LdapListConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v132/LdapListConverter.java
deleted file mode 100644
index 2f94a7e..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v132/LdapListConverter.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v132;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- * Convert:
- * <pre>
- *     <ldapSettings>
- *         <ldapUrl>ldap://mydomain:389/dc=jfrog,dc=org</ldapUrl>
- *         <authenticationPatterns>
- *             <authenticationPattern>
- *                 <userDnPattern>uid={0}, ou=People</userDnPattern>
- *             </authenticationPattern>
- *         </authenticationPatterns>
- *         <managerDn>ZZZ</managerDn>
- *         <managerPassword>YYY</managerPassword>
- *      </ldapSettings>
- * </pre>
- * To:
- * <pre>
- *     <ldapSettings>
- *         <ldapSetting>
- *             <key>ldap1</key>
- *             <enabled>true</enabled>
- *             <ldapUrl>ldap://mydomain:389/dc=jfrog,dc=org</ldapUrl>
- *             <userDnPattern>uid={0}, ou=People</userDnPattern>
- *             <search>
- *                 <searchFilter>uid={0}</searchFilter>
- *                 <managerDn>ZZZ</managerDn>
- *                 <managerPassword>YYY</managerPassword>
- *             </search>
- *         </ldapSetting>
- *     </ldapSettings>
- * </pre>
- * <p/>
- * Version 1.3.3 added support for multiple ldap settings, each might contains userDn and one search pattern. If
- * multiple authenticationPattern exist, we convert each one to ldapSetting.
- *
- * @author Yossi Shaul
- */
-public class LdapListConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(LdapListConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        Element root = doc.getRootElement();
-        Namespace ns = root.getNamespace();
-
-        Element security = root.getChild("security", ns);
-        if (security == null) {
-            log.debug("No security settings defned");
-            return;
-        }
-
-        Element oldLdapSettings = security.getChild("ldapSettings", ns);
-        if (oldLdapSettings == null) {
-            log.debug("No ldap settings configured");
-            return;
-        }
-
-        int location = security.indexOf(oldLdapSettings);
-        security.removeContent(oldLdapSettings);
-
-        Element ldapSettings = new Element("ldapSettings", ns);
-        security.addContent(location, ldapSettings);
-
-        String ldapUrl = oldLdapSettings.getChildText("ldapUrl", ns);
-
-        // manager dn and password only relevant for search based authentications
-        String managerDn = oldLdapSettings.getChildText("managerDn", ns);
-        String managerPassword = oldLdapSettings.getChildText("managerPassword", ns);
-
-        // convert authentication patterns
-        Element authPatternsElement = oldLdapSettings.getChild("authenticationPatterns", ns);
-        List authPatterns = authPatternsElement.getChildren("authenticationPattern", ns);
-        log.debug("Found {} patterns to convert" + authPatterns.size());
-
-        // create new ldap setting for each authentication pattern
-        int ldapKeyIndex = 1;
-        for (Object pattern : authPatterns) {
-            Element authPattern = (Element) pattern;
-
-            Element ldapSetting = new Element("ldapSetting", ns);
-            ldapSettings.addContent(ldapSetting);
-
-            // add the key
-            ldapSetting.addContent(createTextElement("key", ns, "ldap" + ldapKeyIndex++));
-
-            // set enabled true
-            ldapSetting.addContent(createTextElement("enabled", ns, "true"));
-
-            // add the ldap url
-            ldapSetting.addContent(createTextElement("ldapUrl", ns, ldapUrl));
-
-            // add user dn if not empty
-            String userDn = authPattern.getChildText("userDnPattern", ns);
-            if (userDn != null) {
-                ldapSetting.addContent(createTextElement("userDnPattern", ns, userDn));
-            }
-
-            // create and add search element if search filter exists
-            String searchFilter = authPattern.getChildText("searchFilter", ns);
-            if (searchFilter != null) {
-                Element search = new Element("search", ns);
-                ldapSetting.addContent(search);
-
-                search.addContent(createTextElement("searchFilter", ns, searchFilter));
-
-                String searchBase = authPattern.getChildText("searchBase", ns);
-                if (searchBase != null) {
-                    search.addContent(createTextElement("searchBase", ns, searchBase));
-                }
-
-                String searchSubTree = authPattern.getChildText("searchSubTree", ns);
-                if (searchSubTree != null) {
-                    search.addContent(createTextElement("searchSubTree", ns, searchSubTree));
-                }
-
-                if (managerDn != null) {
-                    search.addContent(createTextElement("managerDn", ns, managerDn));
-                }
-
-                if (managerPassword != null) {
-                    search.addContent(createTextElement("managerPassword", ns, managerPassword));
-                }
-            }
-        }
-    }
-
-    private Element createTextElement(String name, Namespace ns, String value) {
-        Element userDnElement = new Element(name, ns);
-        userDnElement.setText(value);
-        return userDnElement;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v134/BackupExcludedVirtualRepoConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v134/BackupExcludedVirtualRepoConverter.java
deleted file mode 100644
index a64a983..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v134/BackupExcludedVirtualRepoConverter.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v134;
-
-import com.google.common.collect.Sets;
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Checks and removes in reference of a virtual repository from the backup's excluded repository list
- *
- * @author Noam Y. Tenne
- */
-public class BackupExcludedVirtualRepoConverter implements XmlConverter {
-
-    @Override
-    public void convert(Document doc) {
-        Element root = doc.getRootElement();
-        Namespace ns = root.getNamespace();
-
-        Set<Object> virtualRepoKeys = Sets.newHashSet();
-
-        Element virtualRepositories = root.getChild("virtualRepositories", ns);
-        if (virtualRepositories != null) {
-            List repos = virtualRepositories.getChildren("virtualRepository", ns);
-            for (Object repo : repos) {
-                Element repoElem = (Element) repo;
-                Element key = repoElem.getChild("key", ns);
-                virtualRepoKeys.add(key.getText());
-            }
-        }
-
-        Element backups = root.getChild("backups", ns);
-        if (backups != null) {
-            List backupsList = backups.getChildren("backup", ns);
-            for (Object backup : backupsList) {
-                Element backupElement = (Element) backup;
-                Element excludedRepositories = backupElement.getChild("excludedRepositories", ns);
-                if (excludedRepositories != null) {
-                    List excludedRepoList = excludedRepositories.getChildren("repositoryRef", ns);
-                    Iterator excludedRepoIterator = excludedRepoList.iterator();
-                    while (excludedRepoIterator.hasNext()) {
-                        Element excludedRepo = (Element) excludedRepoIterator.next();
-                        if (virtualRepoKeys.contains(excludedRepo.getText())) {
-                            excludedRepoIterator.remove();
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v135/ProxyNTHostConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v135/ProxyNTHostConverter.java
deleted file mode 100644
index 8b8223c..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v135/ProxyNTHostConverter.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v135;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.List;
-
-/**
- * Sets the ntHost element to be the localhost name if the proxy domain is set.
- *
- * @author Yossi Shaul
- */
-public class ProxyNTHostConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(ProxyNTHostConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        Element root = doc.getRootElement();
-        Namespace ns = root.getNamespace();
-
-        Element proxiesElement = root.getChild("proxies", ns);
-        if (proxiesElement != null) {
-            List proxies = proxiesElement.getChildren("proxy", ns);
-            for (Object proxyObj : proxies) {
-                Element proxy = (Element) proxyObj;
-                Element domain = proxy.getChild("domain", ns);
-                if (domain != null) {
-                    Element ntHost = new Element("ntHost", ns);
-                    ntHost.setText(getHostName());
-                    // insert the ntHost element right before the domain element 
-                    proxy.addContent(proxy.indexOf(domain), ntHost);
-                }
-            }
-        }
-    }
-
-    private String getHostName() {
-        try {
-            return InetAddress.getLocalHost().getHostName();
-        } catch (UnknownHostException e) {
-            log.error("Failed to get host name");
-            return "unknown";
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v136/IndexerCronRemoverConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v136/IndexerCronRemoverConverter.java
deleted file mode 100644
index 02962c7..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v136/IndexerCronRemoverConverter.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v136;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Replace the cronExp for the indexer with an interval. Applies for upgrading from schema 1.3.5 to 1.3.6.
- *
- * @author yoavl
- */
-public class IndexerCronRemoverConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(IndexerCronRemoverConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        Element root = doc.getRootElement();
-        Namespace ns = root.getNamespace();
-
-        /*
-        <indexer>
-            <cronExp>0 /1 * * * ?</cronExp>
-        </indexer>
-        to:
-        <indexer>
-            <indexingIntervalHours>24</indexingIntervalHours>
-        </indexer>
-         */
-        Element indexerElement = root.getChild("indexer", ns);
-        if (indexerElement != null) {
-            log.debug("Removing indexer cron expression.");
-            indexerElement.removeContent();
-            log.debug("Adding default indexer interval.");
-            Element intervalElement = new Element("indexingIntervalHours", ns);
-            intervalElement.setText("24");
-            indexerElement.addContent(0, intervalElement);
-        }
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v136/RepositoryTypeConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v136/RepositoryTypeConverter.java
deleted file mode 100644
index a6c234e..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v136/RepositoryTypeConverter.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v136;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- * Relocates the key element of the remote repositories. Applies for upgrading from schema 1.3.5 to 1.3.6.
- *
- * @author yossis
- */
-public class RepositoryTypeConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(RepositoryTypeConverter.class);
-
-    /**
-     * Convert a <type> on a remote repository to a <type> on any repo - move the type after the description
-     * if it exists.
-     *
-     * @param doc
-     */
-    @Override
-    @SuppressWarnings({"unchecked"})
-    public void convert(Document doc) {
-        Element root = doc.getRootElement();
-        Namespace ns = root.getNamespace();
-
-        Element remoteRepositories = root.getChild("remoteRepositories", ns);
-        if (remoteRepositories != null) {
-            List repos = remoteRepositories.getChildren("remoteRepository", ns);
-            for (Object repo : repos) {
-                Element repoElem = (Element) repo;
-                Element type = repoElem.getChild("type", ns);
-                if (type != null) {
-                    log.debug("Relocating type...");
-                    repoElem.removeChild("type", ns);
-                    //Try to place it first after the decription if exists, else after the key
-                    Element sibling = repoElem.getChild("description", ns);
-                    if (sibling == null) {
-                        sibling = repoElem.getChild("key", ns);
-                    }
-                    if (sibling != null) {
-                        repoElem.addContent(repoElem.indexOf(sibling) + 1, type);
-                        log.debug("Type relocated.");
-                    } else {
-                        log.warn("Type could be relocated - cannot determine proper location.");
-                    }
-                }
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v141/ProxyDefaultConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v141/ProxyDefaultConverter.java
deleted file mode 100644
index 454d204..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v141/ProxyDefaultConverter.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v141;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- * @author Tomer Cohen
- */
-public class ProxyDefaultConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(ProxyDefaultConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        Element root = doc.getRootElement();
-        Namespace ns = root.getNamespace();
-
-        Element proxiesElement = root.getChild("proxies", ns);
-        if (proxiesElement == null || proxiesElement.getChildren().isEmpty()) {
-            log.debug("No proxies found");
-            return;
-        }
-        List proxies = proxiesElement.getChildren();
-
-        Element repositoriesElement = root.getChild("remoteRepositories", ns);
-        List remoteRepos = repositoriesElement.getChildren();
-        if (remoteRepos == null || remoteRepos.size() == 0) {
-            log.debug("No remote repos found");
-            return;
-        }
-
-        Element defaultCandidate = null;
-        for (Object remoteRepoObj : remoteRepos) {
-            Element remoteRepo = (Element) remoteRepoObj;
-            Element remoteRepoProxy = remoteRepo.getChild("proxyRef", ns);
-            if (remoteRepoProxy == null) {
-                //If the remote repository does not have a proxy, we can stop right here.
-                return;
-            }
-            if (defaultCandidate != null && !remoteRepoProxy.getText().equals(defaultCandidate.getText())) {
-                return;
-            }
-            if (defaultCandidate == null) {
-                defaultCandidate = remoteRepoProxy;
-            }
-        }
-
-        for (Object proxyObj : proxies) {
-            Element proxy = (Element) proxyObj;
-            Element proxyKey = proxy.getChild("key", ns);
-            if (proxyKey.getText().equals(defaultCandidate.getText())) {
-                if (proxy.getChild("defaultProxy", ns) == null) {   // RTFACT-2450
-                    Element element = new Element("defaultProxy", ns);
-                    element.setText("true");
-                    proxy.addContent(element);
-                }
-                break;
-            }
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v1410/GcSystemPropertyConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v1410/GcSystemPropertyConverter.java
deleted file mode 100644
index cc05e94..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v1410/GcSystemPropertyConverter.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v1410;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Converts the gc.interval.secs system property to a cron expression.
- *
- * @author Noam Y. Tenne
- */
-public class GcSystemPropertyConverter implements XmlConverter {
-
-    private static final Logger log = LoggerFactory.getLogger(GcSystemPropertyConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        log.info("Converting garbage collector system property to a cron expression based configuration descriptor.");
-
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        Element gcConfigCronExpElement = new Element("cronExp", namespace);
-        gcConfigCronExpElement.setText("0 0 /4 * * ?");
-
-        Element gcConfigElement = new Element("gcConfig", namespace);
-        gcConfigElement.addContent(gcConfigCronExpElement);
-
-        rootElement.addContent(gcConfigElement);
-
-        log.info("Finished converting the garbage collector system property.");
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v1412/IndexerCronExpPropertyConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v1412/IndexerCronExpPropertyConverter.java
deleted file mode 100644
index 11382e6..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v1412/IndexerCronExpPropertyConverter.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v1412;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Converts the indexer intervalByHours property to a cron expression.
- *
- * @author Shay Yaakov
- */
-public class IndexerCronExpPropertyConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(IndexerCronExpPropertyConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        log.info("Converting indexer indexingIntervalHours property to a cron expression based " +
-                "configuration descriptor.");
-
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        Element indexerElement = rootElement.getChild("indexer", namespace);
-        if (indexerElement != null) {
-            // Remove indexingIntervalHours property
-            Element indexingIntervalHours = indexerElement.getChild("indexingIntervalHours", namespace);
-            int intervalElementIndex = indexerElement.indexOf(indexingIntervalHours);
-            if (indexingIntervalHours != null) {
-                indexingIntervalHours.detach();
-
-                // Add cron expression property
-                Element cronExpElement = new Element("cronExp", namespace);
-                cronExpElement.setText("0 23 5 * * ?");
-                indexerElement.addContent(intervalElementIndex, cronExpElement);
-            }
-        }
-
-        log.info("Finished converting the indexer indexingIntervalHours property.");
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v1414/ArchiveBrowsingConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v1414/ArchiveBrowsingConverter.java
deleted file mode 100644
index 413274c..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v1414/ArchiveBrowsingConverter.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v1414;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-
-/**
- * Removes the archiveBrowsingEnabled element, we now use it for each repository separately.
- *
- * @author Shay Yaakov
- */
-public class ArchiveBrowsingConverter implements XmlConverter {
-
-    @Override
-    public void convert(Document doc) {
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        Element securityElement = rootElement.getChild("security", namespace);
-        if (securityElement != null) {
-            Element archiveBrowsingEnabledElement = securityElement.getChild("archiveBrowsingEnabled", namespace);
-            if (archiveBrowsingEnabledElement != null) {
-                archiveBrowsingEnabledElement.detach();
-            }
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v1414/AssumedOfflineConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v1414/AssumedOfflineConverter.java
deleted file mode 100644
index 56a27d1..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v1414/AssumedOfflineConverter.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v1414;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- * Renames the failedRetrievalCachePeriodSecs element in remote repo and changes the value to 300 seconds.
- *
- * @author Yossi Shaul
- */
-public class AssumedOfflineConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(AssumedOfflineConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        log.debug("Converting failedRetrievalCachePeriodSecs");
-
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        Element remoteRepositoriesElement = rootElement.getChild("remoteRepositories", namespace);
-        if (remoteRepositoriesElement == null) {
-            log.debug("No remote repository exists");
-            return;
-        }
-
-        List remoteRepositories = remoteRepositoriesElement.getChildren();
-        for (Object o : remoteRepositories) {
-            Element remoteRepo = (Element) o;
-            Element failedRetrievalElement = remoteRepo.getChild("failedRetrievalCachePeriodSecs", namespace);
-            if (failedRetrievalElement != null) {
-                failedRetrievalElement.setName("assumedOfflinePeriodSecs");
-                failedRetrievalElement.setText("300");
-            }
-        }
-
-        log.debug("Finished converting failedRetrievalCachePeriodSecs");
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v1414/CleanupConfigConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v1414/CleanupConfigConverter.java
deleted file mode 100644
index 12f62ea..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v1414/CleanupConfigConverter.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v1414;
-
-import org.apache.commons.lang.math.RandomUtils;
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Converts the repo.cleanup.intervalHours system property to a cron expression,
- * Using a random hour between 04:00-05:59 so each AOL client will run on a different time
- *
- * @author Shay Yaakov
- */
-public class CleanupConfigConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(CleanupConfigConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        log.debug("Converting artifacts cleanup system property to a cron expression based configuration descriptor.");
-
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        // Create cron expression element with random times from 04:00AM to 05:59AM
-        Element cronExpElement = new Element("cronExp", namespace);
-        int minutes = RandomUtils.nextInt(60); // 0-59
-        int hours = RandomUtils.nextInt(2) + 4; // 4-5
-        cronExpElement.setText("0 " + minutes + " " + hours + " * * ?");
-
-        Element cleanupElement = new Element("cleanupConfig", namespace);
-        cleanupElement.addContent(cronExpElement);
-
-        rootElement.addContent(cleanupElement);
-
-        log.debug("Finished converting the artifacts cleanup system property.");
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v142/RepoIncludeExcludePatternsConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v142/RepoIncludeExcludePatternsConverter.java
deleted file mode 100644
index 4e01ce6..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v142/RepoIncludeExcludePatternsConverter.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v142;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-
-import java.util.List;
-
-/**
- * @author Eli Givoni
- */
-public class RepoIncludeExcludePatternsConverter implements XmlConverter {
-
-    @Override
-    public void convert(Document doc) {
-        Element root = doc.getRootElement();
-        Namespace ns = root.getNamespace();
-        Element localReposElement = root.getChild("localRepositories", ns);
-        List localRepos = localReposElement == null ? null : localReposElement.getChildren("localRepository", ns);
-
-        Element remotelReposElement = root.getChild("remoteRepositories", ns);
-        List remoteRepos = remotelReposElement == null ? null : remotelReposElement.getChildren("remoteRepository", ns);
-
-        movePatternsElements(localRepos, ns);
-        movePatternsElements(remoteRepos, ns);
-    }
-
-    private void movePatternsElements(List repos, Namespace ns) {
-        if (repos != null) {
-            for (Object repo : repos) {
-                Element repoElement = (Element) repo;
-
-                Element includesPattern = repoElement.getChild("includesPattern", ns);
-                Element excludePattern = repoElement.getChild("excludesPattern", ns);
-
-                setPatternsElements(repoElement, includesPattern, ns);
-                setPatternsElements(repoElement, excludePattern, ns);
-            }
-        }
-    }
-
-    private void setPatternsElements(Element repoElement, Element patternElement, Namespace ns) {
-        if (patternElement == null) {
-            return;
-        }
-        repoElement.removeContent(patternElement);
-        int location;
-        Element lookForElement = repoElement.getChild("includesPattern", ns);
-        if (lookForElement != null) {
-            location = repoElement.indexOf(lookForElement);
-            repoElement.addContent(location + 1, patternElement);
-            return;
-        }
-        lookForElement = repoElement.getChild("type", ns);
-        if (lookForElement != null) {
-            location = repoElement.indexOf(lookForElement);
-            repoElement.addContent(location + 1, patternElement);
-            return;
-        }
-
-        lookForElement = repoElement.getChild("description", ns);
-        if (lookForElement != null) {
-            location = repoElement.indexOf(lookForElement);
-            repoElement.addContent(location + 1, patternElement);
-            return;
-        }
-
-        lookForElement = repoElement.getChild("key", ns);
-        location = repoElement.indexOf(lookForElement);
-        repoElement.addContent(location + 1, patternElement);
-    }
-}
-
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v143/RemoteChecksumPolicyConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v143/RemoteChecksumPolicyConverter.java
deleted file mode 100644
index 11aadbf..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v143/RemoteChecksumPolicyConverter.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v143;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-
-import java.util.List;
-
-/**
- * Renamed the checksum policy tag of remote repositories:<p/>
- * This:<p/>
- * <checksumPolicyType>generate-if-absent</checksumPolicyType>
- * <p/>Will become:<p/>
- * <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
- *
- * @author Yossi Shaul
- */
-public class RemoteChecksumPolicyConverter implements XmlConverter {
-    @Override
-    public void convert(Document doc) {
-        Element root = doc.getRootElement();
-        Namespace ns = root.getNamespace();
-
-        Element remoteReposElement = root.getChild("remoteRepositories", ns);
-        if (remoteReposElement != null) {
-            List remoteRepos = remoteReposElement.getChildren("remoteRepository", ns);
-            for (Object remoteRepoObj : remoteRepos) {
-                Element remoteRepo = (Element) remoteRepoObj;
-                Element checksumPolicy = remoteRepo.getChild("checksumPolicyType", ns);
-                if (checksumPolicy != null) {
-                    checksumPolicy.setName("remoteRepoChecksumPolicyType");
-                }
-            }
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v144/MultiLdapXmlConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v144/MultiLdapXmlConverter.java
deleted file mode 100644
index 5e05881..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v144/MultiLdapXmlConverter.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v144;
-
-import org.artifactory.descriptor.security.ldap.group.LdapGroupSetting;
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-
-import java.util.List;
-
-/**
- * Convert the {@link LdapGroupSetting} descriptor with the appropriate
- * LDAP setting to use. <p/>
- * The converter tries to find an enabled {@link org.artifactory.descriptor.security.ldap.LdapSetting}, if such a
- * setting does not exist, the converter will use the first found {@link org.artifactory.descriptor.security.ldap.LdapSetting#key}
- *
- * @author Tomer Cohen
- */
-public class MultiLdapXmlConverter implements XmlConverter {
-
-    @Override
-    public void convert(Document doc) {
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        Element securityElement = rootElement.getChild("security", namespace);
-        if (securityElement != null) {
-            Element ldapSettings = securityElement.getChild("ldapSettings", namespace);
-            if (ldapSettings != null) {
-                String firstLdapKey = null;
-                String ldapKeyToUse = null;
-                List ldapSettingList = ldapSettings.getChildren("ldapSetting", namespace);
-                if (ldapSettingList != null && !ldapSettingList.isEmpty()) {
-                    for (Object ldapSettingObject : ldapSettingList) {
-                        Element ldapSetting = (Element) ldapSettingObject;
-                        Element key = ldapSetting.getChild("key", namespace);
-                        if (firstLdapKey == null) {
-                            firstLdapKey = key.getValue();
-                        }
-                        Element enabledElement = ldapSetting.getChild("enabled", namespace);
-                        if (Boolean.parseBoolean(enabledElement.getValue())) {
-                            ldapKeyToUse = ldapSetting.getChild("key", namespace).getValue();
-                        }
-                    }
-                }
-                if (ldapKeyToUse == null && firstLdapKey != null) {
-                    ldapKeyToUse = firstLdapKey;
-                }
-                if (ldapKeyToUse != null) {
-                    Element ldapGroupSettings = securityElement.getChild("ldapGroupSettings", namespace);
-                    if (ldapGroupSettings != null) {
-                        List ldapGroupList = ldapGroupSettings.getChildren("ldapGroupSetting", namespace);
-                        if (ldapGroupList != null && !ldapGroupList.isEmpty()) {
-                            for (Object ldapGroupSettingObject : ldapGroupList) {
-                                Element ldapGroupSetting = (Element) ldapGroupSettingObject;
-                                Element enabledLdapElement = new Element("enabledLdap", namespace);
-                                enabledLdapElement.setText(ldapKeyToUse);
-                                Element enabledContent = ldapGroupSetting.getChild("enabled", namespace);
-                                int index = ldapGroupSetting.indexOf(enabledContent);
-                                ldapGroupSetting.addContent(index, enabledLdapElement);
-                                ldapGroupSetting.removeContent(enabledContent);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v144/ServerIdXmlConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v144/ServerIdXmlConverter.java
deleted file mode 100644
index fcec860..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v144/ServerIdXmlConverter.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v144;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-
-/**
- * Removed the serverId tag (replaced by external license key).
- *
- * @author Yossi Shaul
- */
-public class ServerIdXmlConverter implements XmlConverter {
-
-    @Override
-    public void convert(Document doc) {
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        Element addons = rootElement.getChild("addons", namespace);
-        if (addons != null) {
-            Element serverId = addons.getChild("serverId", namespace);
-            if (serverId != null) {
-                serverId.detach();
-            }
-        }
-    }
-
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v147/DefaultRepoLayoutConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v147/DefaultRepoLayoutConverter.java
deleted file mode 100644
index d696b00..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v147/DefaultRepoLayoutConverter.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v147;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.util.RepoLayoutUtils;
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- * @author Noam Y. Tenne
- */
-public class DefaultRepoLayoutConverter implements XmlConverter {
-
-    private static final Logger log = LoggerFactory.getLogger(DefaultRepoLayoutConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        log.info("Starting the default repository layout conversion");
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        log.debug("Adding default global layouts");
-        Element repoLayoutsElement = new Element("repoLayouts", namespace);
-        repoLayoutsElement.addContent(getMaven2DefaultLayout(namespace));
-        repoLayoutsElement.addContent(getIvyDefaultLayout(namespace));
-        repoLayoutsElement.addContent(getGradleDefaultLayout(namespace));
-        repoLayoutsElement.addContent(getMaven1DefaultLayout(namespace));
-        rootElement.addContent(repoLayoutsElement);
-
-        log.debug("Converting local repositories");
-        Element localRepositoriesElement = rootElement.getChild("localRepositories", namespace);
-        if (localRepositoriesElement != null) {
-            List<Element> localRepositoryElements = localRepositoriesElement.getChildren("localRepository", namespace);
-            if (localRepositoryElements != null && !localRepositoryElements.isEmpty()) {
-
-                for (Element localRepositoryElement : localRepositoryElements) {
-                    appendRepoLayoutRef(localRepositoryElement, namespace);
-                    removeRepoType(localRepositoryElement, false, namespace);
-                }
-            }
-        }
-
-        log.debug("Converting remote repositories");
-        Element remoteRepositoriesElement = rootElement.getChild("remoteRepositories", namespace);
-        if (remoteRepositoriesElement != null) {
-            List<Element> remoteRepositoryElements =
-                    remoteRepositoriesElement.getChildren("remoteRepository", namespace);
-            if (remoteRepositoryElements != null && !remoteRepositoryElements.isEmpty()) {
-
-                for (Element remoteRepositoryElement : remoteRepositoryElements) {
-                    appendRepoLayoutRef(remoteRepositoryElement, namespace);
-                    removeRepoType(remoteRepositoryElement, true, namespace);
-                }
-            }
-        }
-
-        log.debug("Converting virtual repositories");
-        Element virtualRepositoriesElement = rootElement.getChild("virtualRepositories", namespace);
-        if (virtualRepositoriesElement != null) {
-            List<Element> virtualRepositoryElements =
-                    virtualRepositoriesElement.getChildren("virtualRepository", namespace);
-            if (virtualRepositoryElements != null && !virtualRepositoryElements.isEmpty()) {
-
-                for (Element virtualRepositoryElement : virtualRepositoryElements) {
-                    removeRepoType(virtualRepositoryElement, false, namespace);
-                }
-            }
-        }
-
-        log.info("Ending the default repository layout conversion.");
-    }
-
-    private Element getMaven2DefaultLayout(Namespace namespace) {
-        return getRepoLayoutElement(namespace,
-                RepoLayoutUtils.MAVEN_2_DEFAULT.getName(),
-                RepoLayoutUtils.MAVEN_2_DEFAULT.getArtifactPathPattern(),
-                Boolean.toString(RepoLayoutUtils.MAVEN_2_DEFAULT.isDistinctiveDescriptorPathPattern()),
-                RepoLayoutUtils.MAVEN_2_DEFAULT.getDescriptorPathPattern(),
-                RepoLayoutUtils.MAVEN_2_DEFAULT.getFolderIntegrationRevisionRegExp(),
-                RepoLayoutUtils.MAVEN_2_DEFAULT.getFileIntegrationRevisionRegExp());
-    }
-
-    private Element getIvyDefaultLayout(Namespace namespace) {
-        return getRepoLayoutElement(namespace,
-                RepoLayoutUtils.IVY_DEFAULT.getName(),
-                RepoLayoutUtils.IVY_DEFAULT.getArtifactPathPattern(),
-                Boolean.toString(RepoLayoutUtils.IVY_DEFAULT.isDistinctiveDescriptorPathPattern()),
-                RepoLayoutUtils.IVY_DEFAULT.getDescriptorPathPattern(),
-                RepoLayoutUtils.IVY_DEFAULT.getFolderIntegrationRevisionRegExp(),
-                RepoLayoutUtils.IVY_DEFAULT.getFileIntegrationRevisionRegExp());
-    }
-
-    private Element getGradleDefaultLayout(Namespace namespace) {
-        return getRepoLayoutElement(namespace,
-                RepoLayoutUtils.GRADLE_DEFAULT.getName(),
-                RepoLayoutUtils.GRADLE_DEFAULT.getArtifactPathPattern(),
-                Boolean.toString(RepoLayoutUtils.GRADLE_DEFAULT.isDistinctiveDescriptorPathPattern()),
-                RepoLayoutUtils.GRADLE_DEFAULT.getDescriptorPathPattern(),
-                RepoLayoutUtils.GRADLE_DEFAULT.getFolderIntegrationRevisionRegExp(),
-                RepoLayoutUtils.GRADLE_DEFAULT.getFileIntegrationRevisionRegExp());
-    }
-
-    private Element getMaven1DefaultLayout(Namespace namespace) {
-        return getRepoLayoutElement(namespace,
-                RepoLayoutUtils.MAVEN_1_DEFAULT.getName(),
-                RepoLayoutUtils.MAVEN_1_DEFAULT.getArtifactPathPattern(),
-                Boolean.toString(RepoLayoutUtils.MAVEN_1_DEFAULT.isDistinctiveDescriptorPathPattern()),
-                RepoLayoutUtils.MAVEN_1_DEFAULT.getDescriptorPathPattern(),
-                RepoLayoutUtils.MAVEN_1_DEFAULT.getFolderIntegrationRevisionRegExp(),
-                RepoLayoutUtils.MAVEN_1_DEFAULT.getFileIntegrationRevisionRegExp());
-    }
-
-    public Element getRepoLayoutElement(Namespace namespace, String name, String artifactPathPattern,
-            String distinctiveDescriptorPathPattern, String descriptorPathPattern,
-            String folderIntegrationRevisionRegExp, String fileIntegrationRevisionRegExp) {
-
-        Element repoLayoutElement = new Element("repoLayout", namespace);
-
-        Element nameElement = new Element("name", namespace);
-        nameElement.setText(name);
-        repoLayoutElement.addContent(nameElement);
-
-        Element artifactPathPatternElement = new Element("artifactPathPattern", namespace);
-        artifactPathPatternElement.setText(artifactPathPattern);
-        repoLayoutElement.addContent(artifactPathPatternElement);
-
-        Element distinctiveDescriptorPathPatternElement = new Element("distinctiveDescriptorPathPattern", namespace);
-        distinctiveDescriptorPathPatternElement.setText(distinctiveDescriptorPathPattern);
-        repoLayoutElement.addContent(distinctiveDescriptorPathPatternElement);
-
-        Element descriptorPathPatternElement = new Element("descriptorPathPattern", namespace);
-        descriptorPathPatternElement.setText(descriptorPathPattern);
-        repoLayoutElement.addContent(descriptorPathPatternElement);
-
-        if (StringUtils.isNotBlank(folderIntegrationRevisionRegExp)) {
-            Element folderIntegrationRevisionRegExpElement = new Element("folderIntegrationRevisionRegExp", namespace);
-            folderIntegrationRevisionRegExpElement.setText(folderIntegrationRevisionRegExp);
-            repoLayoutElement.addContent(folderIntegrationRevisionRegExpElement);
-        }
-
-        if (StringUtils.isNotBlank(fileIntegrationRevisionRegExp)) {
-            Element fileIntegrationRevisionRegExpElement = new Element("fileIntegrationRevisionRegExp", namespace);
-            fileIntegrationRevisionRegExpElement.setText(fileIntegrationRevisionRegExp);
-            repoLayoutElement.addContent(fileIntegrationRevisionRegExpElement);
-        }
-
-        return repoLayoutElement;
-    }
-
-    private void appendRepoLayoutRef(Element repositoryElement, Namespace namespace) {
-        Element repoLayoutRefElement = new Element("repoLayoutRef", namespace);
-        repoLayoutRefElement.setText(RepoLayoutUtils.MAVEN_2_DEFAULT_NAME);
-
-        log.debug("Appending default layout reference to '{}'", repositoryElement.getChild("key", namespace).getText());
-        appendElementAfter(repositoryElement, repoLayoutRefElement, namespace, "excludesPattern", "includesPattern",
-                "notes", "type", "description", "key");
-    }
-
-    private void removeRepoType(Element repositoryElement, boolean isRemote, Namespace namespace) {
-        Element typeElement = repositoryElement.getChild("type", namespace);
-        if (typeElement != null) {
-
-            String repoKey = repositoryElement.getChild("key", namespace).getText();
-            log.debug("Removing repository type definition from '{}'", repoKey);
-            repositoryElement.removeChild("type", namespace);
-
-            if (isRemote && "maven1".equals(typeElement.getText())) {
-
-                Element remoteRepoLayoutRefElement = new Element("remoteRepoLayoutRef", namespace);
-                remoteRepoLayoutRefElement.setText(RepoLayoutUtils.MAVEN_1_DEFAULT_NAME);
-
-                log.debug("Appending Maven 1 remote repository layout reference to '{}'", repoKey);
-                appendElementAfter(repositoryElement, remoteRepoLayoutRefElement, namespace,
-                        "listRemoteFolderItems", "synchronizeProperties", "shareConfiguration",
-                        "unusedArtifactsCleanupPeriodHours", "unusedArtifactsCleanupEnabled",
-                        "remoteRepoChecksumPolicyType", "missedRetrievalCachePeriodSecs",
-                        "failedRetrievalCachePeriodSecs", "retrievalCachePeriodSecs", "fetchSourcesEagerly",
-                        "fetchJarsEagerly", "storeArtifactsLocally", "hardFail", "offline", "url");
-            }
-        }
-    }
-
-    private void appendElementAfter(Element appendTo, Element toAppend, Namespace namespace,
-            String... elementNamesToAppendAfter) {
-        int indexToAppendAfter = getIndexOfFirstFoundElement(appendTo, namespace, elementNamesToAppendAfter);
-
-        appendTo.addContent(indexToAppendAfter + 1, toAppend);
-    }
-
-    private int getIndexOfFirstFoundElement(Element repositoryElement, Namespace namespace, String... elementNames) {
-        for (String elementName : elementNames) {
-            Element child = repositoryElement.getChild(elementName, namespace);
-            if (child != null) {
-                return repositoryElement.indexOf(child);
-            }
-        }
-
-        return -1;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v147/JfrogRemoteRepoUrlConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v147/JfrogRemoteRepoUrlConverter.java
deleted file mode 100644
index 1088b12..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v147/JfrogRemoteRepoUrlConverter.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v147;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-
-import java.util.List;
-
-/**
- * Converter which fixes the JFrog libs and JFrog plugins URLs that came bundled in Artifactory 2.3.1 that are pointing
- * to the wrong URL on repo.jfrog.org
- *
- * @author Tomer Cohen
- */
-public class JfrogRemoteRepoUrlConverter implements XmlConverter {
-
-    private static final String OLD_JFROG_LIBS = "http://repo.jfrog.org/artifactory/libs-release-local";
-    private static final String NEW_JFROG_LIBS = "http://repo.jfrog.org/artifactory/libs-releases-local";
-    private static final String OLD_JFROG_PLUGINS = "http://repo.jfrog.org/artifactory/plugins-release-local";
-    private static final String NEW_JFROG_PLUGINS = "http://repo.jfrog.org/artifactory/plugins-releases-local";
-
-    @Override
-    public void convert(Document doc) {
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        Element repositories = rootElement.getChild("remoteRepositories", namespace);
-        if (repositories != null) {
-            List remoteRepos = repositories.getChildren("remoteRepository", namespace);
-            if (remoteRepos != null && !remoteRepos.isEmpty()) {
-                for (Object remoteRepo : remoteRepos) {
-                    Element remoteRepoElement = (Element) remoteRepo;
-                    Element url = remoteRepoElement.getChild("url", namespace);
-                    if (url != null) {
-                        String urlText = url.getText();
-                        if (OLD_JFROG_LIBS.equals(urlText)) {
-                            url.setText(NEW_JFROG_LIBS);
-                        } else if (OLD_JFROG_PLUGINS.equals(urlText)) {
-                            url.setText(NEW_JFROG_PLUGINS);
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v147/UnusedArtifactCleanupSwitchConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v147/UnusedArtifactCleanupSwitchConverter.java
deleted file mode 100644
index 8d432c2..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v147/UnusedArtifactCleanupSwitchConverter.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v147;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- * @author Noam Y. Tenne
- */
-public class UnusedArtifactCleanupSwitchConverter implements XmlConverter {
-
-    @SuppressWarnings({"UnusedDeclaration"})
-    private static final Logger log = LoggerFactory.getLogger(UnusedArtifactCleanupSwitchConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        log.info("Starting the unused artifact cleanup switch conversion");
-
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        log.debug("Converting remote repositories");
-        Element remoteRepositoriesElement = rootElement.getChild("remoteRepositories", namespace);
-        if (remoteRepositoriesElement != null) {
-            List<Element> remoteRepositoryElements =
-                    remoteRepositoriesElement.getChildren("remoteRepository", namespace);
-            if (remoteRepositoryElements != null && !remoteRepositoryElements.isEmpty()) {
-
-                for (Element remoteRepositoryElement : remoteRepositoryElements) {
-                    log.debug("Removing unused artifact cleanup switch from '{}'",
-                            remoteRepositoryElement.getChild("key", namespace).getText());
-
-                    remoteRepositoryElement.removeChild("unusedArtifactsCleanupEnabled", namespace);
-                }
-            }
-        }
-
-        log.info("Ending the unused artifact cleanup switch conversion");
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v149/ReplicationElementNameConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v149/ReplicationElementNameConverter.java
deleted file mode 100644
index 00d1327..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v149/ReplicationElementNameConverter.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v149;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- * Converts the remote repo replication element names that have changed between v148 and v149 (introduction of local
- * repo replication)
- *
- * @author Noam Y. Tenne
- */
-public class ReplicationElementNameConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(ReplicationElementNameConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        log.info("Starting to convert old remote repository replication configurations.");
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        Element replications = rootElement.getChild("replications", namespace);
-        if (replications != null) {
-            replications.setName("remoteReplications");
-
-            List<Element> replicationList = replications.getChildren("replication", namespace);
-            if (replicationList != null) {
-                for (Element replication : replicationList) {
-                    replication.setName("remoteReplication");
-                }
-            }
-        }
-        log.info("Finished converting old remote repository replication configurations.");
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v152/BlackDuckProxyConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v152/BlackDuckProxyConverter.java
deleted file mode 100644
index a0e93d4..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v152/BlackDuckProxyConverter.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v152;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Converts the blackduck settings section to schema 1.5.3 by adding the default proxy, if such exists.
- *
- * @author Yoav Luft
- */
-public class BlackDuckProxyConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(BlackDuckProxyConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        log.info("Converting BlackDuck intergration proxy settings");
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        Element defaultProxy = findDefaultProxy(rootElement, namespace);
-        Element externalProviders = rootElement.getChild("externalProviders", namespace);
-        if (externalProviders == null) {
-            return;
-        }
-        Element blackDuckConf = externalProviders.getChild("blackduck", namespace);
-        if (defaultProxy != null && blackDuckConf != null) {
-            if (blackDuckConf.getChild("proxyRef") != null) {
-                return;
-            }
-            Element proxyTag = new Element("proxyRef", namespace);
-            proxyTag.setText(defaultProxy.getChildText("key", namespace));
-            blackDuckConf.addContent(proxyTag);
-        }
-    }
-
-    private Element findDefaultProxy(Element rootElement, Namespace namespace) {
-        Element proxies = rootElement.getChild("proxies", namespace);
-        if (proxies != null) {
-            for (Object proxy : proxies.getChildren("proxy", namespace)) {
-                if (proxy instanceof Element) {
-                    Element proxyElement = (Element) proxy;
-                    if ("true".equalsIgnoreCase(proxyElement.getChildText("defaultProxy", namespace))) {
-                        return proxyElement;
-                    }
-                }
-            }
-        }
-        return null;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v153/VirtualCacheCleanupConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v153/VirtualCacheCleanupConverter.java
deleted file mode 100644
index 52ba3ed..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v153/VirtualCacheCleanupConverter.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v153;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * @author Yoav Luft
- */
-public class VirtualCacheCleanupConverter implements XmlConverter {
-
-    private static final Logger log = LoggerFactory.getLogger(VirtualCacheCleanupConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        log.info("Adding default virtual cache cleanup");
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        if (rootElement.getChild("virtualCacheCleanupConfig") != null) return;
-        Element cleanupConfig = rootElement.getChild("cleanupConfig", namespace);
-        Element virtualCacheCleanupConfig = new Element("virtualCacheCleanupConfig", namespace);
-        Element cronExp = new Element("cronExp", namespace);
-        cronExp.setText("0 12 5 * * ?");
-        virtualCacheCleanupConfig.addContent(cronExp);
-        rootElement.addContent(rootElement.indexOf(cleanupConfig) + 1, virtualCacheCleanupConfig);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v160/AddonsDefaultLayoutConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v160/AddonsDefaultLayoutConverter.java
deleted file mode 100644
index 9dfc8e3..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v160/AddonsDefaultLayoutConverter.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v160;
-
-import org.apache.commons.lang.RandomStringUtils;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * @author Shay Yaakov
- */
-public class AddonsDefaultLayoutConverter implements XmlConverter {
-
-    private static final Logger log = LoggerFactory.getLogger(AddonsDefaultLayoutConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        log.info("Starting the default addons repository layout conversion");
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        log.debug("Adding default addons global layouts");
-        Element repoLayoutsElement = rootElement.getChild("repoLayouts", namespace);
-        addNuGetDefaultLayout(repoLayoutsElement, namespace);
-        addNpmDefaultLayout(repoLayoutsElement, namespace);
-        addBowerDefaultLayout(repoLayoutsElement, namespace);
-        addVcsDefaultLayout(repoLayoutsElement, namespace);
-        addSbtDefaultLayout(repoLayoutsElement, namespace);
-        addSimpleDefaultLayout(repoLayoutsElement, namespace);
-
-        log.info("Ending the default addons repository layout conversion");
-    }
-
-    private void addNuGetDefaultLayout(Element repoLayoutsElement, Namespace namespace) {
-        repoLayoutsElement.addContent(getRepoLayoutElement(repoLayoutsElement, namespace,
-                "nuget-default",
-                "[orgPath]/[module]/[module].[baseRev](-[fileItegRev]).nupkg",
-                "false", null,
-                ".*",
-                ".*"));
-    }
-
-    private void addNpmDefaultLayout(Element repoLayoutsElement, Namespace namespace) {
-        repoLayoutsElement.addContent(getRepoLayoutElement(repoLayoutsElement, namespace,
-                "npm-default",
-                "[orgPath]/[module]/[module]-[baseRev](-[fileItegRev]).tgz",
-                "false", null,
-                ".*",
-                ".*"));
-    }
-
-    private void addBowerDefaultLayout(Element repoLayoutsElement, Namespace namespace) {
-        repoLayoutsElement.addContent(getRepoLayoutElement(repoLayoutsElement, namespace,
-                "bower-default",
-                "[orgPath]/[module]/[module]-[baseRev](-[fileItegRev]).[ext]",
-                "false", null,
-                ".*",
-                ".*"));
-    }
-
-    private void addVcsDefaultLayout(Element repoLayoutsElement, Namespace namespace) {
-        repoLayoutsElement.addContent(getRepoLayoutElement(repoLayoutsElement, namespace,
-                "vcs-default",
-                "[orgPath]/[module]/[refs<tags|branches>]/[baseRev]/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]",
-                "false", null,
-                ".*",
-                "[a-zA-Z0-9]{40}"));
-    }
-
-    private void addSbtDefaultLayout(Element repoLayoutsElement, Namespace namespace) {
-        repoLayoutsElement.addContent(getRepoLayoutElement(repoLayoutsElement, namespace,
-                "sbt-default",
-                "[org]/[module]/(scala_[scalaVersion<.+>])/(sbt_[sbtVersion<.+>])/[baseRev]/[type]s/[module](-[classifier]).[ext]",
-                "true",
-                "[org]/[module]/(scala_[scalaVersion<.+>])/(sbt_[sbtVersion<.+>])/[baseRev]/[type]s/ivy.xml",
-                "\\d{14}",
-                "\\d{14}"));
-    }
-
-    private void addSimpleDefaultLayout(Element repoLayoutsElement, Namespace namespace) {
-        repoLayoutsElement.addContent(getRepoLayoutElement(repoLayoutsElement, namespace,
-                "simple-default",
-                "[orgPath]/[module]/[module]-[baseRev](-[fileItegRev]).[ext]",
-                "false", null,
-                ".*",
-                ".*"));
-    }
-
-    public Element getRepoLayoutElement(Element repoLayoutsElement, Namespace namespace, String name, String artifactPathPattern,
-                                        String distinctiveDescriptorPathPattern, String descriptorPathPattern,
-                                        String folderIntegrationRevisionRegExp, String fileIntegrationRevisionRegExp) {
-
-        // Maybe the user already configured *-default, if so randomize the name
-        for (Element repoLayoutElement : repoLayoutsElement.getChildren()) {
-            if (name.equals(repoLayoutElement.getChild("name", namespace).getText())) {
-                if (repoLayoutsElement.getChild("art-" + name, namespace) != null) {
-                    name += RandomStringUtils.randomNumeric(3);
-                } else {
-                    name = "art-" + name;
-                }
-            }
-        }
-
-        Element repoLayoutElement = new Element("repoLayout", namespace);
-
-        Element nameElement = new Element("name", namespace);
-        nameElement.setText(name);
-        repoLayoutElement.addContent(nameElement);
-
-        Element artifactPathPatternElement = new Element("artifactPathPattern", namespace);
-        artifactPathPatternElement.setText(artifactPathPattern);
-        repoLayoutElement.addContent(artifactPathPatternElement);
-
-        Element distinctiveDescriptorPathPatternElement = new Element("distinctiveDescriptorPathPattern", namespace);
-        distinctiveDescriptorPathPatternElement.setText(distinctiveDescriptorPathPattern);
-        repoLayoutElement.addContent(distinctiveDescriptorPathPatternElement);
-
-        if (StringUtils.isNotBlank(descriptorPathPattern)) {
-            Element descriptorPathPatternElement = new Element("descriptorPathPattern", namespace);
-            descriptorPathPatternElement.setText(descriptorPathPattern);
-            repoLayoutElement.addContent(descriptorPathPatternElement);
-        }
-
-        if (StringUtils.isNotBlank(folderIntegrationRevisionRegExp)) {
-            Element folderIntegrationRevisionRegExpElement = new Element("folderIntegrationRevisionRegExp", namespace);
-            folderIntegrationRevisionRegExpElement.setText(folderIntegrationRevisionRegExp);
-            repoLayoutElement.addContent(folderIntegrationRevisionRegExpElement);
-        }
-
-        if (StringUtils.isNotBlank(fileIntegrationRevisionRegExp)) {
-            Element fileIntegrationRevisionRegExpElement = new Element("fileIntegrationRevisionRegExp", namespace);
-            fileIntegrationRevisionRegExpElement.setText(fileIntegrationRevisionRegExp);
-            repoLayoutElement.addContent(fileIntegrationRevisionRegExpElement);
-        }
-
-        return repoLayoutElement;
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v160/MavenIndexerConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v160/MavenIndexerConverter.java
deleted file mode 100644
index de10195..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v160/MavenIndexerConverter.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v160;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.jdom2.Text;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * Convert the maven indexer from excluded repositories to hold included repositories
- *
- * @author Shay Yaakov
- */
-public class MavenIndexerConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(MavenIndexerConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        log.info("Converting maven indexer to included repositories");
-
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        Element indexer = rootElement.getChild("indexer", namespace);
-        if (indexer != null) {
-            Element excludedRepositories = indexer.getChild("excludedRepositories", namespace);
-            if (excludedRepositories != null) {
-                replaceExcludedWithIncluded(rootElement, namespace, indexer, excludedRepositories);
-            }
-        }
-
-        log.info("Finished converting maven indexer to included repositories");
-    }
-
-    private void replaceExcludedWithIncluded(Element rootElement, Namespace namespace, Element indexer,
-            Element excludedRepositories) {
-        List<String> excluded = excludedRepositories.getChildren()
-                .stream()
-                .map(Element::getText)
-                .collect(Collectors.toList());
-
-
-        if (StringUtils.equals(indexer.getChildText("enabled", namespace), "true")) {
-            Element includedRepositories = new Element("includedRepositories", namespace);
-            collectRepositories(rootElement, namespace)
-                    .stream()
-                    .filter(repo -> !excluded.contains(repo))
-                    .forEach(repo -> {
-                        Element repositoryRef = new Element("repositoryRef", namespace);
-                        repositoryRef.setText(repo);
-                        includedRepositories.addContent(repositoryRef);
-                    });
-            indexer.addContent(new Text("\n        "));
-            indexer.addContent(includedRepositories);
-        }
-
-        indexer.removeContent(excludedRepositories);
-    }
-
-    private List<String> collectRepositories(Element rootElement, Namespace namespace) {
-        List<String> repoKeys = Lists.newArrayList();
-
-        Element localRepos = rootElement.getChild("localRepositories", namespace);
-        collectRepoKeys(repoKeys, namespace, localRepos);
-
-        Element remoteRepos = rootElement.getChild("remoteRepositories", namespace);
-        collectRepoKeys(repoKeys, namespace, remoteRepos);
-
-        Element virtualRepos = rootElement.getChild("virtualRepositories", namespace);
-        collectRepoKeys(repoKeys, namespace, virtualRepos);
-
-        return repoKeys;
-    }
-
-    private void collectRepoKeys(List<String> repoKeys, Namespace namespace, Element repos) {
-        if (repos != null) {
-            List<Element> children = repos.getChildren();
-            if (children != null) {
-                children
-                        .stream()
-                        .filter(element -> {
-                            boolean isMavenLayout = StringUtils.equals("maven-2-default",
-                                    element.getChildText("repoLayoutRef", namespace));
-                            boolean isMavenType = RepoType.fromType(element.getChildText("type", namespace)).isMavenGroup();
-                            return isMavenLayout && isMavenType;
-                        })
-                        .forEach(element -> repoKeys.add(element.getChildText("key", namespace)));
-            }
-        }
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v160/SingleRepoTypeConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v160/SingleRepoTypeConverter.java
deleted file mode 100644
index 1484264..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v160/SingleRepoTypeConverter.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v160;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.jdom2.Text;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- * @author Shay Yaakov
- */
-public class SingleRepoTypeConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(SingleRepoTypeConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        log.info("Converting repositories to a single package type");
-
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        Element localRepos = rootElement.getChild("localRepositories", namespace);
-        if (localRepos != null) {
-            convertLocalRepos(localRepos.getChildren());
-        }
-
-        Element remoteRepos = rootElement.getChild("remoteRepositories", namespace);
-        if (remoteRepos != null) {
-            convertRemoteRepos(remoteRepos.getChildren());
-        }
-
-        Element virtualRepos = rootElement.getChild("virtualRepositories", namespace);
-        if (virtualRepos != null) {
-            convertVirtualRepos(virtualRepos.getChildren());
-        }
-
-        log.info("Finished Converting repositories to a single package type");
-    }
-
-    private void convertLocalRepos(List<Element> repos) {
-        if (repos == null || repos.isEmpty()) {
-            return;
-        }
-
-        for (Element repo : repos) {
-            List<RepoType> repoTypes = Lists.newArrayList();
-            fillSharedTypes(repoTypes, repo, false);
-            addType(repoTypes, repo, RepoType.YUM, false);
-            String repoKey = repo.getChildText("key", repo.getNamespace());
-            convertToSingleRepoType(repo, repoKey, repoTypes, false);
-        }
-
-    }
-
-    private void convertRemoteRepos(List<Element> repos) {
-        if (repos == null || repos.isEmpty()) {
-            return;
-        }
-
-        for (Element repo : repos) {
-            List<RepoType> repoTypes = Lists.newArrayList();
-            fillSharedTypes(repoTypes, repo, false);
-            if (!repoTypes.contains(RepoType.Bower)) {
-                // Bower + VCS = Bower repository
-                addType(repoTypes, repo, RepoType.VCS, false);
-            }
-            String repoKey = repo.getChildText("key", repo.getNamespace());
-            convertToSingleRepoType(repo, repoKey, repoTypes, false);
-        }
-    }
-
-    private void convertVirtualRepos(List<Element> repos) {
-        if (repos == null || repos.isEmpty()) {
-            return;
-        }
-
-        for (Element repo : repos) {
-            List<RepoType> repoTypes = Lists.newArrayList();
-            fillSharedTypes(repoTypes, repo, true);
-            Element p2 = repo.getChild("p2", repo.getNamespace());
-            if (p2 != null) {
-                if (StringUtils.equals(p2.getChildText("enabled", p2.getNamespace()), "true")) {
-                    addType(repoTypes, p2, RepoType.P2, true);
-                }
-            }
-
-            String repoKey = repo.getChildText("key", repo.getNamespace());
-            convertToSingleRepoType(repo, repoKey, repoTypes, true);
-        }
-    }
-
-    private void convertToSingleRepoType(Element repo, String repoKey, List<RepoType> repoTypes, boolean virtualRepo) {
-        if (repoTypes.size() >= 1) {
-            repoTypes
-                    .stream()
-                    .skip(1) // First one is used as the final repository type
-                    .forEach(repoType -> log.error("Disabling package '{}' for repo '{}' " +
-                            "since only one packaging type is allowed!", repoType, repoKey));
-        } else {
-            String layoutRef = repo.getChildText("repoLayoutRef", repo.getNamespace());
-            if (StringUtils.equals(layoutRef, "ivy-default")) {
-                repoTypes.add(RepoType.Ivy);
-            } else if (StringUtils.equals(layoutRef, "gradle-default")) {
-                repoTypes.add(RepoType.Gradle);
-            } else {
-                repoTypes.add(RepoType.Maven);
-            }
-        }
-
-        // Set the final decided repo type
-        RepoType repoType = repoTypes.get(0);
-        log.info("Setting repository '{}' to type {}", repoKey, repoType);
-        Element typeElement = new Element("type", repo.getNamespace());
-        typeElement.setText(String.valueOf(repoType).toLowerCase());
-        repo.addContent(2, new Text("\n            "));
-        repo.addContent(3, typeElement); // add the type after the key property
-        removeEnabledFieldsFromRepo(repo, virtualRepo);
-    }
-
-    private void removeEnabledFieldsFromRepo(Element repo, boolean virtualRepo) {
-        for (RepoType repoType : RepoType.values()) {
-            if (repoType.equals(RepoType.P2)) {
-                Element p2 = repo.getChild("p2", repo.getNamespace());
-                if (p2 != null) {
-                    if (p2.getChild("enabled", p2.getNamespace()) != null) {
-                        p2.removeChild("enabled", p2.getNamespace());
-                    }
-                }
-            } else if (!repoType.equals(RepoType.YUM)) {
-                //Special handle for YUM config as a repo can still be chosen to be of YUM type but with auto-calc off
-                String field = resolveFieldName(repoType, virtualRepo);
-                if (repo.getChild(field, repo.getNamespace()) != null) {
-                    repo.removeChild(field, repo.getNamespace());
-                }
-            } else {
-                // If the repo type is YUM then we shouldn't remove any field
-            }
-        }
-    }
-
-    private String resolveFieldName(RepoType repoType, boolean virtualRepo) {
-        if (virtualRepo) {
-            return repoType.getVirtualField();
-        } else {
-            return repoType.getLocalAndRemoteField();
-        }
-    }
-
-    private void fillSharedTypes(List<RepoType> repoTypes, Element element, boolean virtualRepo) {
-        addType(repoTypes, element, RepoType.NuGet, virtualRepo);
-        addType(repoTypes, element, RepoType.Gems, virtualRepo);
-        addType(repoTypes, element, RepoType.Npm, virtualRepo);
-        addType(repoTypes, element, RepoType.Bower, virtualRepo);
-        addType(repoTypes, element, RepoType.Debian, virtualRepo);
-        addType(repoTypes, element, RepoType.Pypi, virtualRepo);
-        addType(repoTypes, element, RepoType.Docker, virtualRepo);
-        addType(repoTypes, element, RepoType.Vagrant, virtualRepo);
-        addType(repoTypes, element, RepoType.GitLfs, virtualRepo);
-        addType(repoTypes, element, RepoType.P2, virtualRepo);
-        addType(repoTypes, element, RepoType.YUM, virtualRepo);
-        if (!virtualRepo && !repoTypes.contains(RepoType.YUM)) {
-            addYumForLegacy(repoTypes, element);
-        }
-    }
-
-    private void addYumForLegacy(List<RepoType> repoTypes, Element element) {
-        String depth = element.getChildText("yumRootDepth", element.getNamespace());
-        String groupNames = element.getChildText("yumGroupFileNames", element.getNamespace());
-        try {
-            if ((StringUtils.isNotBlank(depth) && Integer.valueOf(depth) > 0) || StringUtils.isNotBlank(groupNames)) {
-                repoTypes.add(RepoType.YUM);
-            }
-        } catch (NumberFormatException e) {
-            log.warn("Unresolvable YUM configuration, YUM metadata root depth is {}. ", depth);
-        }
-    }
-
-    private void addType(List<RepoType> repoTypes, Element element, RepoType type, boolean virtualRepo) {
-        String fieldName = resolveFieldName(type, virtualRepo);
-        boolean isEnabled = Boolean.valueOf(element.getChildText(fieldName, element.getNamespace()));
-        if (isEnabled) {
-            repoTypes.add(type);
-        }
-    }
-
-private enum RepoType {
-    NuGet("enableNuGetSupport", "enableNuGetSupport"),
-    Gems("enableGemsSupport", "enableGemsSupport"),
-    Npm("enableNpmSupport", "enableNpmSupport"),
-    Bower("enableBowerSupport", "enableBowerSupport"),
-    Debian("enableDebianSupport", "enableDebianSupport"),
-    Pypi("enablePypiSupport", "enablePypiSupport"),
-    Docker("enableDockerSupport", "enableDockerSupport"),
-    Vagrant("enableVagrantSupport", "enableVagrantSupport"),
-    GitLfs("enableGitLfsSupport", "enableGitLfsSupport"),
-    YUM("calculateYumMetadata", "calculateYumMetadata"),
-    VCS("enableVcsSupport", "enableVcsSupport"),
-    P2("p2Support", "enabled"),
-    Maven("", ""),
-    Gradle("", ""),
-    Ivy("", ""),
-    Generic("", "");
-
-    private String localAndRemoteField;
-    private String virtualField;
-
-    RepoType(String localAndRemoteField, String virtualField) {
-        this.virtualField = virtualField;
-        this.localAndRemoteField = localAndRemoteField;
-    }
-
-    public String getLocalAndRemoteField() {
-        return localAndRemoteField;
-    }
-
-    public String getVirtualField() {
-        return virtualField;
-    }
-
-    public boolean isMavenGroup() {
-        return this == Maven || this == Ivy || this == Gradle || this == P2;
-    }
-}
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v160/SuppressConsitencyConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v160/SuppressConsitencyConverter.java
deleted file mode 100644
index d8de2b6..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v160/SuppressConsitencyConverter.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package org.artifactory.version.converter.v160;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.jdom2.Text;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class SuppressConsitencyConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(SingleRepoTypeConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        log.info("Finished Converting repositories to a suppress consistency");
-
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        Element localRepos = rootElement.getChild("localRepositories", namespace);
-        if (localRepos != null) {
-            convertLocalRepos(localRepos.getChildren());
-        }
-
-        Element remoteRepos = rootElement.getChild("remoteRepositories", namespace);
-        if (remoteRepos != null) {
-            convertRemoteRepos(remoteRepos.getChildren());
-        }
-
-
-        log.info("Finished Converting repositories to a suppress consistency");
-    }
-
-    private void convertLocalRepos(List<Element> repos) {
-        if (repos == null || repos.isEmpty()) {
-            return;
-        }
-
-        for (Element repo : repos) {
-            convertSuppressConsistency(repo);
-        }
-    }
-
-    private void convertRemoteRepos(List<Element> repos) {
-        if (repos == null || repos.isEmpty()) {
-            return;
-        }
-
-        for (Element repo : repos) {
-            convertSuppressConsistency(repo);
-        }
-    }
-
-    private void convertSuppressConsistency(Element repo) {
-        Element type = repo.getChild("type", repo.getNamespace());
-        RepoType repoType = RepoType.fromType(type.getText());
-        if (repoType.isMavenGroup()) {
-            Element suppress= repo.getChild("suppressPomConsistencyChecks", repo.getNamespace());
-            String pomConsistencyValue = repo.getChildText("suppressPomConsistencyChecks", repo.getNamespace());
-            if (suppress==null ){
-                suppress=new Element("suppressPomConsistencyChecks", repo.getNamespace());
-                int lastLocation = findSuppressLocation(repo);
-                repo.addContent(lastLocation + 1, new Text("\n            "));
-                repo.addContent(lastLocation + 2, suppress);
-            }
-            if(StringUtils.isBlank(suppress.getText())) {
-                pomConsistencyValue = "false";
-            }
-            suppress.setText(pomConsistencyValue);
-        }
-    }
-
-    private int findSuppressLocation(Element repo) {
-        return findLastLocation(repo, "maxUniqueSnapshots",
-                        "handleSnapshots",
-                        "handleReleases",
-                        "blackedOut",
-                        "dockerApiVersion",
-                        "repoLayoutRef",
-                        "excludesPattern",
-                        "includesPattern",
-                        "notes",
-                        "description",
-                        "type");
-    }
-
-    private int findLastLocation(Element parent, String... elements) {
-        for (int i = 0; i < elements.length; i++) {
-            Element child = parent.getChild(elements[i], parent.getNamespace());
-            if (child != null) {
-                return parent.indexOf(child);
-            }
-        }
-        return -1;
-    }
-
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v162/FolderDownloadConfigConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v162/FolderDownloadConfigConverter.java
deleted file mode 100644
index c8b901b..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v162/FolderDownloadConfigConverter.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v162;
-
-import com.google.common.collect.Lists;
-import org.artifactory.descriptor.download.FolderDownloadConfigDescriptor;
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-
-/**
- * Adds the Folder Download config section with default value where applicable
- *
- * @author Dan Feldman
- */
-public class FolderDownloadConfigConverter implements XmlConverter {
-
-    private static final Logger log = LoggerFactory.getLogger(FolderDownloadConfigConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        log.info("Starting add default Folder Download config conversion");
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        Element folderDownloadConfigElement = rootElement.getChild("folderDownloadConfig", namespace);
-        if (folderDownloadConfigElement == null) {
-            log.info("No folder download config found - adding default one");
-            addDefaultConfig(rootElement, namespace);
-        }
-        log.info("Finished add default Folder Download config conversion");
-    }
-
-    private void addDefaultConfig(Element rootElement, Namespace namespace) {
-        //Use defaults from descriptor
-        FolderDownloadConfigDescriptor descriptor = new FolderDownloadConfigDescriptor();
-        Element folderDownload = new Element("folderDownloadConfig", namespace);
-        Namespace folderConfigNs = folderDownload.getNamespace();
-        ArrayList<Element> elements = Lists.newArrayList();
-        elements.add(new Element("enabled", folderConfigNs).setText(String.valueOf(descriptor.isEnabled())));
-        elements.add(new Element("maxDownloadSizeMb", folderConfigNs).setText(
-                String.valueOf(descriptor.getMaxDownloadSizeMb())));
-        elements.add(new Element("maxFiles", folderConfigNs).setText(String.valueOf(descriptor.getMaxFiles())));
-        elements.add(new Element("maxConcurrentRequests", folderConfigNs).setText(
-                String.valueOf(descriptor.getMaxConcurrentRequests())));
-        folderDownload.addContent(elements);
-        rootElement.addContent(rootElement.getContentSize(), folderDownload);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v166/SourceDeletedDetectionConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v166/SourceDeletedDetectionConverter.java
deleted file mode 100644
index 16952b7..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v166/SourceDeletedDetectionConverter.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v166;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- * @author Michael Pasternak
- */
-public class SourceDeletedDetectionConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(SourceDeletedDetectionConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        log.info("Converting repositories for SourceDeletedDetection support");
-
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        Element localRepos = rootElement.getChild("localRepositories", namespace);
-        if (localRepos != null) {
-            convertLocalRepos(localRepos.getChildren());
-        }
-
-        Element remoteRepos = rootElement.getChild("remoteRepositories", namespace);
-        if (remoteRepos != null) {
-            convertRemoteRepos(remoteRepos.getChildren());
-        }
-
-        Element virtualRepos = rootElement.getChild("virtualRepositories", namespace);
-        if (virtualRepos != null) {
-            convertVirtualRepos(virtualRepos.getChildren());
-        }
-
-        log.info("Finished Converting repositories for SourceDeletedDetection support");
-    }
-
-    private void convertLocalRepos(List<Element> repos) {
-        if (repos == null || repos.isEmpty()) {
-            return;
-        }
-
-        convertRepositories(repos);
-    }
-
-    private void convertRemoteRepos(List<Element> repos) {
-        if (repos == null || repos.isEmpty()) {
-            return;
-        }
-
-        convertRepositories(repos);
-    }
-
-    private void convertVirtualRepos(List<Element> repos) {
-        if (repos == null || repos.isEmpty()) {
-            return;
-        }
-
-        convertRepositories(repos);
-    }
-
-    private void convertRepositories(List<Element> repos) {
-        for (Element repo : repos) {
-            Element contentSynchronisation = repo.getChild("contentSynchronisation", repo.getNamespace());
-            if (contentSynchronisation != null &&
-                    contentSynchronisation.getChild("source", contentSynchronisation.getNamespace()) == null) {
-                addOriginAbsenceDetectionElement(contentSynchronisation);
-            }
-        }
-    }
-
-    private void addOriginAbsenceDetectionElement(Element contentSynchronisation) {
-        Element source = new Element("source", contentSynchronisation.getNamespace());
-        Element originAbsenceDetection = new Element("originAbsenceDetection", source.getNamespace());
-        originAbsenceDetection.addContent("false");
-        source.addContent(source.getContentSize(), originAbsenceDetection);
-        contentSynchronisation.addContent(contentSynchronisation.getContentSize(), source);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v167/TrashcanConfigConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v167/TrashcanConfigConverter.java
deleted file mode 100644
index 424776b..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v167/TrashcanConfigConverter.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v167;
-
-import com.google.common.collect.Lists;
-import org.artifactory.descriptor.trashcan.TrashcanConfigDescriptor;
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-
-/**
- * Adds the trashcan config section with default value where applicable
- *
- * @author Shay Yaakov
- */
-public class TrashcanConfigConverter implements XmlConverter {
-
-    private static final Logger log = LoggerFactory.getLogger(TrashcanConfigConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        log.info("Starting default trashcan config conversion");
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        Element trashcanConfigElement = rootElement.getChild("trashcanConfig", namespace);
-        if (trashcanConfigElement == null) {
-            log.info("No trashcan config found - adding default one");
-            addDefaultConfig(rootElement, namespace);
-        }
-        log.info("Finished default trashcan config conversion");
-    }
-
-    private void addDefaultConfig(Element rootElement, Namespace namespace) {
-        TrashcanConfigDescriptor descriptor = new TrashcanConfigDescriptor();
-        Element trashcan = new Element("trashcanConfig", namespace);
-        Namespace trashcanConfigNs = trashcan.getNamespace();
-        ArrayList<Element> elements = Lists.newArrayList();
-        elements.add(new Element("enabled", trashcanConfigNs).setText(String.valueOf(descriptor.isEnabled())));
-        elements.add(new Element("retentionPeriodDays", trashcanConfigNs).setText(String.valueOf(descriptor.getRetentionPeriodDays())));
-        trashcan.addContent(elements);
-        rootElement.addContent(rootElement.getContentSize(), trashcan);
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v167/UserLockConfigConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v167/UserLockConfigConverter.java
deleted file mode 100644
index 4538bdb..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v167/UserLockConfigConverter.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.version.converter.v167;
-
-import com.google.common.collect.Lists;
-import org.artifactory.descriptor.security.UserLockPolicy;
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-
-/**
- * Adds user lock configuration
- *
- * @author Michael Pasternak
- */
-public class UserLockConfigConverter implements XmlConverter {
-
-    private static final Logger log = LoggerFactory.getLogger(UserLockConfigConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        log.info("Starting default 'user locking' conversion");
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        Element securityConfigElement = rootElement.getChild("security", namespace);
-        if (securityConfigElement == null ||
-                rootElement.getChild("userLockPolicy", namespace) == null) {
-            addDefaultConfig(rootElement, namespace);
-        }
-        log.info("Finished default 'user locking' conversion");
-    }
-
-    private void addDefaultConfig(Element rootElement, Namespace namespace) {
-
-        Element securityConfigElement = rootElement.getChild("security", namespace);
-        if(securityConfigElement == null ||
-                securityConfigElement.getChild("userLockPolicy", namespace) != null) {
-            return;
-        }
-
-        Element userLockPolicyElement = securityConfigElement.getChild("userLockPolicy", namespace);
-        if(userLockPolicyElement == null) {
-            UserLockPolicy userLockPolicy = new UserLockPolicy();
-            userLockPolicyElement = new Element("userLockPolicy", namespace);
-
-            Namespace passwordConfigNs = userLockPolicyElement.getNamespace();
-            ArrayList<Element> elements = Lists.newArrayList();
-            elements.add(new Element("enabled", passwordConfigNs)
-                    .setText(String.valueOf(userLockPolicy.isEnabled())));
-            elements.add(new Element("loginAttempts", passwordConfigNs)
-                    .setText(String.valueOf(userLockPolicy.getLoginAttempts())));
-
-            userLockPolicyElement.addContent(userLockPolicyElement.getContentSize(), elements);
-            securityConfigElement.addContent(securityConfigElement.getContentSize(), userLockPolicyElement);
-        }
-    }
-}
-
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v168/PasswordPolicyConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v168/PasswordPolicyConverter.java
deleted file mode 100644
index 902ad6d..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v168/PasswordPolicyConverter.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v168;
-
-import com.google.common.collect.Lists;
-import org.artifactory.descriptor.security.PasswordExpirationPolicy;
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-
-/**
- * Adds password policy config section with default value where applicable
- *
- * @author Michael Pasternak
- */
-public class PasswordPolicyConverter implements XmlConverter {
-
-    private static final Logger log = LoggerFactory.getLogger(PasswordPolicyConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        log.info("Starting user PasswordPolicyConverter conversion");
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        Element securityConfigElement = rootElement.getChild("security", namespace);
-        if (securityConfigElement == null) {
-            securityConfigElement = new Element("security", namespace);
-        }
-
-        Element passwordSettings = securityConfigElement.getChild("passwordSettings", namespace);
-        if (passwordSettings == null) {
-            return;
-        }
-
-        Element expirationPolicy = passwordSettings.getChild("expirationPolicy", passwordSettings.getNamespace());
-        if(expirationPolicy == null) {
-            expirationPolicy = new Element("expirationPolicy", passwordSettings.getNamespace());
-
-            Namespace expirationPolicyNs = expirationPolicy.getNamespace();
-
-            PasswordExpirationPolicy passwordExpirationPolicy = new PasswordExpirationPolicy();
-
-            ArrayList<Element> elements = Lists.newArrayList();
-            elements.add(new Element("enabled", expirationPolicyNs)
-                    .setText(String.valueOf(passwordExpirationPolicy.isEnabled())));
-            elements.add(new Element("passwordMaxAge", expirationPolicyNs)
-                    .setText(String.valueOf(passwordExpirationPolicy.getPasswordMaxAge())));
-            elements.add(new Element("notifyByEmail", expirationPolicyNs)
-                    .setText(String.valueOf(passwordExpirationPolicy.isNotifyByEmail())));
-
-            expirationPolicy.addContent(expirationPolicy.getContentSize(), elements);
-            passwordSettings.addContent(passwordSettings.getContentSize(), expirationPolicy);
-        }
-        log.info("Finished PasswordPolicyConverter conversion");
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v169/PasswordMaxAgeConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v169/PasswordMaxAgeConverter.java
deleted file mode 100644
index 1dfe5a0..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v169/PasswordMaxAgeConverter.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v169;
-
-import org.artifactory.descriptor.security.PasswordExpirationPolicy;
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Change the password expiration config field from expiresIn to passwordMaxAge
- *
- * @author Shay Yaakov
- */
-public class PasswordMaxAgeConverter implements XmlConverter {
-
-    private static final Logger log = LoggerFactory.getLogger(PasswordMaxAgeConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        log.info("Starting user PasswordMaxAgeConverter conversion");
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        Element securityConfigElement = rootElement.getChild("security", namespace);
-        if (securityConfigElement != null) {
-            Element passwordSettings = securityConfigElement.getChild("passwordSettings", namespace);
-            if (passwordSettings != null) {
-                Element expirationPolicy = passwordSettings.getChild("expirationPolicy", namespace);
-                if (expirationPolicy != null) {
-                    String passwordMaxAge = String.valueOf(new PasswordExpirationPolicy().getPasswordMaxAge());
-                    if (expirationPolicy.getChild("expiresIn", namespace) != null) {
-                        passwordMaxAge = expirationPolicy.getChildText("expiresIn", namespace);
-                        expirationPolicy.removeChild("expiresIn", namespace);
-                    }
-                    if (expirationPolicy.getChild("passwordMaxAge", namespace) == null) {
-                        expirationPolicy.addContent(3, new Element("passwordMaxAge", namespace).setText(passwordMaxAge));
-                    }
-                }
-            }
-        }
-        log.info("Finished PasswordMaxAgeConverter conversion");
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v171/SimpleLayoutConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v171/SimpleLayoutConverter.java
deleted file mode 100644
index b5ba722..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v171/SimpleLayoutConverter.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v171;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Removes the (-[fileItegRev]) section from the default simple layout
- *
- * @author Shay Yaakov
- */
-public class SimpleLayoutConverter implements XmlConverter {
-
-    private static final Logger log = LoggerFactory.getLogger(SimpleLayoutConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        log.info("Starting simple layout conversion");
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        Element repoLayouts = rootElement.getChild("repoLayouts", namespace);
-        if (repoLayouts != null) {
-            for (Element repoLayout : repoLayouts.getChildren()) {
-                String layoutName = repoLayout.getChild("name", namespace).getText();
-                if (StringUtils.equals(layoutName, "simple-default")) {
-                    Element patternElement = repoLayout.getChild("artifactPathPattern", namespace);
-                    if (StringUtils.equals(patternElement.getText(), "[orgPath]/[module]/[module]-[baseRev](-[fileItegRev]).[ext]")) {
-                        patternElement.setText("[orgPath]/[module]/[module]-[baseRev].[ext]");
-                        break;
-                    }
-                }
-            }
-        }
-        log.info("Finished simple layout conversion");
-    }
-}
diff --git a/base/config/src/main/java/org/artifactory/version/converter/v172/BlockMismatchingMimeTypesConverter.java b/base/config/src/main/java/org/artifactory/version/converter/v172/BlockMismatchingMimeTypesConverter.java
deleted file mode 100644
index 0613f4e..0000000
--- a/base/config/src/main/java/org/artifactory/version/converter/v172/BlockMismatchingMimeTypesConverter.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package org.artifactory.version.converter.v172;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.jdom2.Text;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Adds the 'Block Mismatching Mime Types' flag (on) as default for all remote repositories
- *
- * @author Dan Feldman
- */
-public class BlockMismatchingMimeTypesConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(BlockMismatchingMimeTypesConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        log.info("Starting conversion: add 'Block mismatching mime type' flag, on by default, to all remote repos ");
-        Element rootElement = doc.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        Element remoteRepos = rootElement.getChild("remoteRepositories", namespace);
-        if (remoteRepos != null && !remoteRepos.getChildren().isEmpty()) {
-            remoteRepos.getChildren().forEach(this::addDefaultBlockMimeTypes);
-        }
-        log.info("Finished mismatching mime types conversion.");
-    }
-
-    private void addDefaultBlockMimeTypes(Element repo) {
-        Element blockMime = repo.getChild("blockMismatchingMimeTypes", repo.getNamespace());
-        if (blockMime == null) {
-            blockMime = new Element("blockMismatchingMimeTypes", repo.getNamespace());
-            int lastLocation = findLocationToInsert(repo);
-            repo.addContent(lastLocation + 1, new Text("\n            "));
-            repo.addContent(lastLocation + 2, blockMime);
-            blockMime.setText("true");
-        }
-    }
-
-    private int findLocationToInsert(Element repo) {
-        return findLastLocation(repo, "contentSynchronisation",
-                "vcs",
-                "p2OriginalUrl",
-                "cocoaPods",
-                "bower",
-                "pypi",
-                "nuget",
-                "p2Support",
-                "rejectInvalidJars",
-                "remoteRepoLayoutRef",
-                "listRemoteFolderItems",
-                "synchronizeProperties",
-                "shareConfiguration",
-                "unusedArtifactsCleanupPeriodHours",
-                "remoteRepoChecksumPolicyType",
-                "missedRetrievalCachePeriodSecs",
-                "assumedOfflinePeriodSecs",
-                "retrievalCachePeriodSecs",
-                "fetchSourcesEagerly",
-                "fetchJarsEagerly",
-                "storeArtifactsLocally",
-                "hardFail",
-                "offline",
-                "url");
-    }
-
-    private int findLastLocation(Element parent, String... elements) {
-        for (String element : elements) {
-            Element child = parent.getChild(element, parent.getNamespace());
-            if (child != null) {
-                return parent.indexOf(child);
-            }
-        }
-        return -1;
-    }
-}
diff --git a/base/config/src/main/resources/META-INF/default/artifactory.config.xml b/base/config/src/main/resources/META-INF/default/artifactory.config.xml
deleted file mode 100644
index 6de5314..0000000
--- a/base/config/src/main/resources/META-INF/default/artifactory.config.xml
+++ /dev/null
@@ -1,300 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- // @formatter:off -->
-
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2014 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.7.3"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.7.3
-        http://www.jfrog.org/xsd/artifactory-v1_7_3.xsd">
-<!--
-    enable/disable anonymous downloads
-    -->
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-        <anonAccessToBuildInfosDisabled>false</anonAccessToBuildInfosDisabled>
-        <hideUnauthorizedResources>false</hideUnauthorizedResources>
-        <passwordSettings>
-            <encryptionPolicy>supported</encryptionPolicy>
-            <expirationPolicy>
-                <enabled>false</enabled>
-                <passwordMaxAge>60</passwordMaxAge>
-                <notifyByEmail>true</notifyByEmail>
-            </expirationPolicy>
-        </passwordSettings>
-        <ldapSettings/>
-        <ldapGroupSettings/>
-        <userLockPolicy>
-            <enabled>false</enabled>
-            <loginAttempts>5</loginAttempts>
-        </userLockPolicy>
-    </security>
-    <backups>
-        <backup>
-            <key>backup-daily</key>
-            <!-- backup Monday to Friday at 2:00 AM -->
-            <cronExp>0 0 2 ? * MON-FRI</cronExp>
-            <!-- Always backup to a "current" dir (incremental backups) -->
-            <retentionPeriodHours>0</retentionPeriodHours>
-            <!-- exclude certain repositories from being backed up -->
-            <excludedRepositories>
-                <repositoryRef>jcenter</repositoryRef>
-            </excludedRepositories>
-        </backup>
-        <backup>
-            <key>backup-weekly</key>
-            <enabled>false</enabled>
-            <!-- backup on Saturday at 2:00 AM -->
-            <cronExp>0 0 2 ? * SAT</cronExp>
-            <!-- keep backups for 2 weeks. -->
-            <retentionPeriodHours>336</retentionPeriodHours>
-            <!-- exclude certain repositories from being backed up -->
-            <excludedRepositories>
-                <repositoryRef>jcenter</repositoryRef>
-            </excludedRepositories>
-        </backup>
-    </backups>
-
-    <!-- The interval at which to activate the maven indexer. -->
-    <indexer>
-        <!-- By Default index once a day at 05:23AM -->
-        <cronExp>0 23 5 * * ?</cronExp>
-    </indexer>
-
-    <localRepositories>
-        <localRepository>
-            <key>libs-release-local</key>
-            <type>maven</type>
-            <description>Local repository for in-house libraries</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshot-local</key>
-            <type>maven</type>
-            <description>Local repository for in-house snapshots</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-        </localRepository>
-        <localRepository>
-            <key>plugins-release-local</key>
-            <type>maven</type>
-            <description>Local repository for plugins</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshot-local</key>
-            <type>maven</type>
-            <description>Local repository for plugins snapshots</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-        </localRepository>
-        <localRepository>
-            <key>ext-release-local</key>
-            <type>maven</type>
-            <description>Local repository for third party libraries</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshot-local</key>
-            <type>maven</type>
-            <description>Local repository for third party snapshots</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-        </localRepository>
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>jcenter</key>
-            <type>maven</type>
-            <description>Bintray Central Java repository</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <url>http://jcenter.bintray.com</url>
-            <blockMismatchingMimeTypes>true</blockMismatchingMimeTypes>
-        </remoteRepository>
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <!-- This repository will be available at the url:
-        http://<host>:<port>/artifactory/snapshots-only/
-        (note the trailing slash!)
-        -->
-        <virtualRepository>
-            <key>remote-repos</key>
-            <type>maven</type>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>jcenter</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-release</key>
-            <type>maven</type>
-            <repositories>
-                <repositoryRef>libs-release-local</repositoryRef>
-                <repositoryRef>ext-release-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-release</key>
-            <type>maven</type>
-            <repositories>
-                <repositoryRef>plugins-release-local</repositoryRef>
-                <repositoryRef>ext-release-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshot</key>
-            <type>maven</type>
-            <repositories>
-                <repositoryRef>libs-snapshot-local</repositoryRef>
-                <repositoryRef>ext-snapshot-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshot</key>
-            <type>maven</type>
-            <repositories>
-                <repositoryRef>plugins-snapshot-local</repositoryRef>
-                <repositoryRef>ext-snapshot-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-    </virtualRepositories>
-
-    <repoLayouts>
-        <repoLayout>
-            <name>maven-2-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>SNAPSHOT</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>ivy-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>gradle-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>maven-1-default</name>
-            <artifactPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.+</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.+</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>nuget-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[module].[baseRev](-[fileItegRev]).nupkg</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>false</distinctiveDescriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.*</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.*</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>npm-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[module]-[baseRev](-[fileItegRev]).tgz</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>false</distinctiveDescriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.*</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.*</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>bower-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[module]-[baseRev](-[fileItegRev]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>false</distinctiveDescriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.*</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.*</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>vcs-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[refs<tags|branches>]/[baseRev]/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>false</distinctiveDescriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.*</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>[a-zA-Z0-9]{40}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>sbt-default</name>
-            <artifactPathPattern>[org]/[module]/(scala_[scalaVersion<.+>])/(sbt_[sbtVersion<.+>])/[baseRev]/[type]s/[module](-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/(scala_[scalaVersion<.+>])/(sbt_[sbtVersion<.+>])/[baseRev]/[type]s/ivy.xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>simple-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[module]-[baseRev].[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>false</distinctiveDescriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.*</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.*</fileIntegrationRevisionRegExp>
-        </repoLayout>
-    </repoLayouts>
-    <gcConfig>
-        <cronExp>0 0 /4 * * ?</cronExp>
-    </gcConfig>
-    <cleanupConfig>
-        <!-- by default cleanup once a day at 05:12AM -->
-        <cronExp>0 12 5 * * ?</cronExp>
-    </cleanupConfig>
-    <virtualCacheCleanupConfig>
-        <!-- by default cleanup once a day at 05:00AM -->
-        <cronExp>0 12 0 * * ?</cronExp>
-    </virtualCacheCleanupConfig>
-    <folderDownloadConfig>
-        <enabled>false</enabled>
-        <maxDownloadSizeMb>1024</maxDownloadSizeMb>
-        <maxFiles>5000</maxFiles>
-        <maxConcurrentRequests>10</maxConcurrentRequests>
-    </folderDownloadConfig>
-    <trashcanConfig>
-        <enabled>true</enabled>
-        <allowPermDeletes>false</allowPermDeletes>
-        <retentionPeriodDays>14</retentionPeriodDays>
-    </trashcanConfig>
-</config>
diff --git a/base/config/src/main/resources/META-INF/default/artifactory.system.properties b/base/config/src/main/resources/META-INF/default/artifactory.system.properties
deleted file mode 100644
index ffea0bb..0000000
--- a/base/config/src/main/resources/META-INF/default/artifactory.system.properties
+++ /dev/null
@@ -1,275 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-###############################################################################
-#  Use this file to override system-level properties used by artifactory.     #
-#  Artifactory-specific properties beginning with the "artifactory." prefix   #
-#  will be handled internally by artifactory - you should change them only if #
-#  you know what you are doing.                                               #
-#  All other properties will become normal (jvm-wide) system properties, so   #
-#  this file can be used as an alternative for specifying command-line         #
-#  -Dparam=val parameters.                                                    #
-###############################################################################
-
-## Comma separated list of disabled addons
-#artifactory.addons.disabled=
-
-## Name of alternate application context class to use
-#artifactory.applicationContextClass=null
-
-# Enable adding the session id to the URL
-#artifactory.servlet.supportUrlSessionTracking=false
-
-## Indicates whether a different instance of Artifactory can request remote artifacts from this instance
-#artifactory.artifactoryRequestsToGlobalCanRetrieveRemoteArtifacts=false
-
-## Disable the download access to the global 'repo'
-artifactory.repo.global.disabled=true
-
-## Number of seconds for fs items to idle in the cache
-#artifactory.fsitem.cache.idleTimeSecs=1200
-
-## Number of seconds to wait between running the storage garbage collector. Use the UI to configure as cron exp
-#artifactory.gc.intervalSecs=14400
-
-## Number of milliseconds the garbage collector should wait between the scanning of each node
-#artifactory.gc.sleepBetweenNodesMillis=20
-
-## Number of milliseconds to wait before starting to sleep between garbage collector node scanning iterations
-#artifactory.gc.scanStartSleepingThresholdMillis=20000
-
-## Number of milliseconds to sleep between garbage collector node scanning iterations
-#artifactory.gc.scanSleepBetweenIterationsMillis=200
-
-## Number of milliseconds to work between garbage collector datastore file scanning sleep invocations
-#artifactory.gc.fileScanSleepIterationMillis=1000
-
-## Number of milliseconds to sleep during lengthy garbage collector datastore file scanning
-#artifactory.gc.fileScanSleepMillis=250
-
-## The maximum binary record cache entries. Apllicable only for v2 gc
-#artifactory.gc.maxCacheEntries=10000
-
-## Number of seconds to wait until timing out while waiting for an item lock to be acquired
-#artifactory.locks.timeoutSecs=120
-
-## Whether to print detailed debug information on lock timeouts
-#artifactory.locks.debugTimeouts=false
-
-## Number of seconds to wait between each refresh of the system logs viewer
-#artifactory.logs.viewRefreshRateSecs=10
-
-## The maximum number of seconds to wait when blocking on a concurrent download from the same repository, before
-## starting a parallel download
-# artifactory.repo.concurrentDownloadSyncTimeoutSecs=900
-
-## Indicates if all stored archives should be indexed (even if already done) upon system startup
-#artifactory.search.content.forceArchiveIndexing=false
-
-## Maximum number of excerpt fragments to return for each result when searching archive content through the UI
-#artifactory.search.content.maxFragments=500
-
-## Maximum number of characters for each fragment
-#artifactory.search.content.maxFragmentsSize=5000
-
-## Maximum number of results to return when searching through the UI
-#artifactory.search.maxResults=500
-
-## The backend limit of maximum results to return from sql queries issued by users. Should be higher than maxResults.
-#artifactory.search.userQueryLimit=1000
-
-## The minimum number of characters allowed for an archive content query.
-#artifactory.search.archive.minQueryLength=3
-
-## The maximum number of seconds that should be spent on a pattern search
-#artifactory.search.pattern.timeoutSecs=30
-
-## Number of seconds for authentications to idle in the cache
-#artifactory.security.authentication.cache.idleTimeSecs=300
-
-## Minimal number of seconds that should be the difference between each user last access timestamp 
-#artifactory.security.userLastAccessUpdatesResolutionSecs=60
-
-## If Login Remember Me should be disabled and users will have to input their credentials on each login.
-#artifactory.security.disableRememberMe=false
-
-## Caches blocked user in sake of performance improvement
-## and takes load off authentication mechanism/db
-#artifactory.security.useFrontCacheForBlockedUsers=true
-
-## Login dynamically blocked for increasing amount of time
-## since third incorrect login, algorithm is:
-## (INCORRECT_ATTEMPTS-3) * loginBlockDelay (millis)
-##
-## note: delay may not exceed 5000 (5 seconds)
-##
-#artifactory.security.loginBlockDelay=500
-
-## Path to alternate Spring configuration file
-#artifactory.spring.configDir=null
-
-## Number of lock timeouts to retry while waiting for a task to complete
-#artifactory.task.completionLockTimeoutRetries=100
-
-## Whether logging and processing of traffic is active  
-#artifactory.traffic.collectionActive=false
-
-## Number of seconds to wait between each version information update query
-#artifactory.versioningQueryIntervalSecs=43200
-
-## The substring by which a remote host is identified as Maven''s central host
-#artifactory.mvn.central.hostPattern=.maven.org
-
-## The maximum frequency in seconds that a remote index on Maven central host can be queried for updates
-#artifactory.mvn.central.indexerMaxQueryIntervalSecs=86400
-## Maximum concurrent workers to calculate maven metadata
-#artifactory.mvn.metadata.calculation.workers=8
-
-## Fully qualified name of a maven metadata version comparator to determine the latest and release versions
-#artifactory.mvn.metadataVersionsComparatorFqn=org.artifactory.maven.versioning.VersionNameMavenMetadataVersionComparator
-
-## Disable requests with version tokens (SNAPSHOT, [RELEASE], [INTEGRATION] which retrieves the latest unique if exists
-#artifactory.request.disableVersionTokens=false
-
-## Determine if should sort and retrieve the latest [RELEASE] version by files date created (default is by version string comparator)
-#artifactory.request.searchLatestReleaseByDateCreated=false
-
-## Add additional xml mime type file extensions (*.myextension). Separated by ","
-#artifactory.xmlAdditionalMimeTypeExtensions=myextension1,myextension2
-
-## Max number of folders to scan deeply for items used as build artifact or dependencies before deleting to warn of
-#artifactory.build.maxFoldersToScanForDeletionWarnings=2
-
-## Size for the derby page cache
-derby.storage.pageCacheSize=500
-
-## Disable the Derby JMX management service
-derby.module.mgmt.jmx=org.apache.derby.impl.services.jmxnone.NoManagementService
-
-## Log all errors/messages of any severity (will list deadlocks)
-derby.stream.error.logSeverityLevel=0
-
-## Log all executed statements along with their txid
-derby.language.logStatementText=false
-
-## Log all deadlocks
-#derby.locks.monitor=true
-
-## Writes a stack trace of all threads involved in lock problems # -- (not just the victims) to the log
-#derby.locks.deadlockTrace=true
-
-## Threshold for the number rows touched above which to auto-escalate to table-level locking from row-level locking
-#derby.locks.escalationThreshold=5000
-
-## Defines the maximum size of text to parse through the text highlighting script
-#artifactory.ui.syntaxColoringMaxTextSizeBytes=512000
-
-## Defines the default chroot for UI file\dir selectors that browse machine Artifactory was installed on
-#artifactory.ui.chroot=/home/bob
-
-## Defines the maximum number of files to retain when maintaining a rolling file policy
-#artifactory.file.roller.maxFileToRetain=10
-
-## Number of milliseconds to work between system backup file export sleep invocations
-#artifactory.backup.fileExportSleepIterationMillis=2000
-
-## Number of milliseconds to sleep during lengthy system backup file exports
-#artifactory.backup.fileExportSleepMillis=250
-
-## Number of seconds to check for updates of plugin script files (0 - do not refresh updates scripts)
-#artifactory.plugin.scripts.refreshIntervalSecs=0
-
-## Send the Accept-Encoding:gzip header to remote repositories and handle gzip stream responses
-#artifactory.http.acceptEncoding.gzip=true
-
-# use the Expect continue directive
-#artifactory.http.useExpectContinue=false
-
-# The lower-limit of a filtered resource size for which a performance warning will be displayed
-#filtering.resourceSizeKb=64
-
-# Whether to search for an an existing resource under a different name before requesting a remote artifact
-#artifactory.repo.remote.checkForExistingResourceOnRequest=true
-
-# Comma separated list of global excludes to apply on all repositories
-#artifactory.repo.includeExclude.globalExcludes=**/*~,**/#*#,**/.#*,**/%*%,**/._*,**/CVS,**/CVS/**,**/.cvsignore,**/SCCS,**/SCCS/**,**/vssver.scc,**/.svn,**/.svn/**,**/.DS_Store
-
-## A list of archive file names that may contain textual license information.\
-#artifactory.archive.licenseFile.names=license,LICENSE,license.txt,LICENSE.txt,LICENSE.TXT
-
-## Number of seconds for dynamic metadata to be cached
-#artifactory.mvn.dynamicMetadata.cacheRetentionSecs=10
-
-## A list of custom types (custom file extensions) to use when resolving maven artifacts
-#artifactory.mvn.custom.types=tar.gz,tar.bz2
-
-## Determines the maximum number of rows to display per result page
-#artifactory.ui.search.maxRowsPerPage=20
-
-## Maximum number of results to return when performing NuGet searches without specifying a limit
-#artifactory.nuget.search.maxResults=100
-
-## If true, all requests to the NuGet API require authentication even if anonymous access is enabled.
-#artifactory.nuget.forceAuthentication=false
-
-## Disable filename token in response Content-Disposition header
-#artifactory.response.disableContentDispositionFilename=false
-
-## Comma separated list of supported archive extensions for archive bundled deploy
-#artifactory.request.explodedArchiveExtensions=zip,tar,tar.gz,tgz
-
-## Disable \ enable the username auto complete in the login page  (values : "off" "on").
-#artifactory.useUserNameAutoCompleteOnLogin=on
-
-## The interval, in seconds, for flushing aggregated statistics to the storage
-#artifactory.stats.flushIntervalSecs=30
-
-## The amount of indices to pre fetch by IdGenerator
-#artifactory.db.idGenerator.fetch.amount=1000
-
-## Hides push to Bintray button both for artifacts as well as for builds
-#artifactory.bintray.ui.hideUploads=true
-
-## Hides the encrypted password field and the maven settings snippet from the profile page
-#artifactory.ui.hideEncryptedPassword=true
-
-## Hides checksum files in simple and list browsing
-#artifactory.ui.hideChecksums=true
-
-## Maximum number repositories to import in parallel (default is one less than the available processors)
-#artifactory.import.max.parallelRepos
-
-## Idle connection monitor interval (in seconds)
-#artifactory.repo.http.idleConnectionMonitorInterval=10
-
-## Disables idle HTTP connections monitoring (idle connections are closed automatically when #idleConnectionMonitorInterval expires)
-#artifactory.repo.http.disableIdleConnectionMonitoring=false
-
-## Time to wait for content collection accomplishing (in minutes)
-#artifactory.support.core.bundle.contentCollectionAwaitTimeout=60
-
-## Artifactory by default blocks concurrent execution of Support content collection,
-## however one can configure time to wait for next available execution slot before
-## withdraw (in seconds)
-#artifactory.support.core.bundle.waitForSlotBeforeWithdraw=600
-
-## Max (previously created) bundles to keep
-#artifactory.support.core.bundle.maxBundles=5
-
-
-
diff --git a/base/config/src/main/resources/META-INF/default/db/derby.properties b/base/config/src/main/resources/META-INF/default/db/derby.properties
deleted file mode 100644
index 7d9e689..0000000
--- a/base/config/src/main/resources/META-INF/default/db/derby.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-type=derby
-url=jdbc:derby:{db.home};create=true
-driver=org.apache.derby.jdbc.EmbeddedDriver
-
-## Determines where the actual artifacts binaries are stored. Available options:
-## filesystem - binaries are stored in the filesystem (recommended, default)
-## fullDb     - binaries are stored as blobs in the db, filesystem is used for caching
-## cachedFS   - binaries are stored in the filesystem, but a front cache (with faster access) is added
-## IMPORTANT NOTE: This property should not be change after the initial setup. To change binaries storage you have to export and import
-#binary.provider.type=filesystem
-
-## Determines the maximum filesystem cache size in bytes when using binary provider type fullDb or cachedFS. Default is 5GB
-## Supported units are TB (terabytes), GB (gigabytes), MB (megabytes) and KB (kilobytes)
-#binary.provider.cache.maxSize=5GB
\ No newline at end of file
diff --git a/base/config/src/main/resources/META-INF/default/logback.xml b/base/config/src/main/resources/META-INF/default/logback.xml
deleted file mode 100644
index bbefb2b..0000000
--- a/base/config/src/main/resources/META-INF/default/logback.xml
+++ /dev/null
@@ -1,170 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2014 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<configuration debug="false">
-    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"/>
-    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
-            <layout class="org.artifactory.logging.layout.BackTracePatternLayout">
-                <pattern>%date ${artifactory.contextId}[%thread] [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
-            </layout>
-        </encoder>
-    </appender>
-    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/artifactory.log</File>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/artifactory.%i.log.zip</FileNamePattern>
-            <MinIndex>1</MinIndex>
-            <MaxIndex>9</MaxIndex>
-        </rollingPolicy>
-
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>25MB</MaxFileSize>
-        </triggeringPolicy>
-        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
-            <layout class="org.artifactory.logging.layout.BackTracePatternLayout">
-                <pattern>%date [%thread] [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
-            </layout>
-        </encoder>
-    </appender>
-    <appender name="ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/access.log</File>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/access.%i.log.zip</FileNamePattern>
-            <MinIndex>1</MinIndex>
-            <MaxIndex>9</MaxIndex>
-        </rollingPolicy>
-        <encoder>
-            <pattern>%d %m%n</pattern>
-        </encoder>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>25MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="IMPORT.EXPORT" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/import.export.log</File>
-        <encoder>
-            <pattern>%date [%-5level] \(%logger{32}:%line\) %message%n</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/import.export.%i.log.zip</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>25MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="TRAFFIC" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/traffic</File>
-        <encoder>
-            <pattern>%message%n</pattern>
-        </encoder>
-        <rollingPolicy class="org.artifactory.traffic.policy.TrafficTimeBasedRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/traffic.%d{yyyyMMdd}</FileNamePattern>
-        </rollingPolicy>
-    </appender>
-    <appender name="REQUEST" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/request.log</File>
-        <encoder>
-            <pattern>%message%n</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/request.%i.log</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>25MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="REQUEST_TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/request_trace.log</File>
-        <encoder>
-            <pattern>%date %message%n</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/request_trace.%i.log</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>25MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="SUPPORT" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/support.log</File>
-        <encoder>
-            <pattern>%date ${artifactory.contextId}[%thread] [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/support.%i.log</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>10MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <root>
-        <level value="warn"/>
-        <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="FILE"/>
-    </root>
-    <logger name="org.artifactory">
-        <level value="info"/>
-    </logger>
-    <logger name="org.jfrog">
-        <level value="info"/>
-    </logger>
-    <logger name="org.artifactory.support">
-        <level value="info"/>
-        <appender-ref ref="SUPPORT"/>
-    </logger>
-    <logger name="org.artifactory.security.AccessLogger" additivity="false">
-        <level value="info"/>
-        <appender-ref ref="ACCESS"/>
-    </logger>
-    <logger name="org.artifactory.api.common.ImportExportStatusHolder" additivity="false">
-        <level value="DEBUG"/>
-        <appender-ref ref="IMPORT.EXPORT"/>
-    </logger>
-    <logger name="org.artifactory.traffic.TrafficLogger" additivity="false">
-        <level value="info"/>
-        <appender-ref ref="TRAFFIC"/>
-    </logger>
-    <logger name="org.artifactory.traffic.RequestLogger" additivity="false">
-        <level value="info"/>
-        <appender-ref ref="REQUEST"/>
-    </logger>
-    <logger name="org.artifactory.request.RequestTraceLogger" additivity="false">
-        <level value="info"/>
-        <appender-ref ref="REQUEST_TRACE"/>
-    </logger>
-
-    <!-- third party loggers -->
-    <logger name="com.sun.jersey">
-        <level value="warn"/>
-    </logger>
-    <logger name="org.springframework">
-        <level value="warn"/>
-    </logger>
-    <logger name="org.apache.cxf">
-        <level value="error"/>
-    </logger>
-    <logger name="com.jfrog.bintray">
-        <level value="info"/>
-    </logger>
-</configuration>
\ No newline at end of file
diff --git a/base/config/src/main/resources/META-INF/default/mimetypes.xml b/base/config/src/main/resources/META-INF/default/mimetypes.xml
deleted file mode 100644
index ecd5c93..0000000
--- a/base/config/src/main/resources/META-INF/default/mimetypes.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2015 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-<!--
-    This file configures Artifactory's known mime types. A list of registered
-    media types can be found in http://www.iana.org/assignments/media-types/ and common ones in
-    http://www.webmaster-toolkit.com/mime-types.shtml
-    Each mime type may have the following attributes:
-        type - The mime entry unique name (mandatory)
-        extensions - Comma separated list of file extensions mapped to this mime type (mandatory)
-        index - True if this mime type should be indexed for searching (valid only for supported archive files)
-        archive - True if this mime type is a browsable archive
-        viewable - True if this mime type can be viewed as text file
-        syntax - The UI highlighter syntax to for this mime type (only relevant if this is a viewable type)
-        css - The css class of a display icon for this mime type
--->
-<mimetypes version="8">
-
-    <mimetype type="text/plain" extensions="txt, properties, mf, asc" viewable="true" syntax="plain"/>
-    <mimetype type="text/html" extensions="htm, html" viewable="true" syntax="xml"/>
-    <mimetype type="text/css" extensions="css" viewable="true" syntax="css"/>
-    <mimetype type="text/xsl" extensions="xsl" viewable="true" syntax="xml"/>
-    <mimetype type="text/xslt" extensions="xslt" viewable="true" syntax="xml"/>
-    <mimetype type="text/x-java-source" extensions="java" viewable="true" syntax="java"/>
-    <mimetype type="text/x-javafx-source" extensions="fx" viewable="true" syntax="javafx"/>
-    <mimetype type="text/x-groovy-source" extensions="groovy, gradle" viewable="true" syntax="groovy"/>
-    <mimetype type="text/x-c" extensions="h, c, cc, cpp" viewable="true" syntax="cpp"/>
-
-    <mimetype type="application/xml-dtd" extensions="dtd" viewable="true"/>
-    <mimetype type="application/xml-schema" extensions="xsd" viewable="true" syntax="xml" css="xml"/>
-    <mimetype type="application/xml-external-parsed-entity" extensions="ent" viewable="true"/>
-    <mimetype type="application/xhtml+xml" extensions="xhtml" viewable="true" syntax="xml"/>
-    <mimetype type="application/json" extensions="json" viewable="true" syntax="javascript"/>
-
-    <mimetype type="application/x-java-pack200" extensions="jar.pack.gz" archive="true" index="true" css="jar"/>
-    <mimetype type="application/x-java-archive-diff" extensions="jardiff" archive="false"/>
-    <mimetype type="application/zip" extensions="zip" archive="true" index="true" css="jar"/>
-    <mimetype type="application/x-tar" extensions="tar" archive="true" index="false"/>
-    <mimetype type="application/x-gzip" extensions="tgz, tar.gz, gz" archive="true" index="false"/>
-    <mimetype type="application/x-nupkg" extensions="nupkg" archive="true" index="true" css="nupkg"/>
-    <mimetype type="application/x-rar-compressed" extensions="rar" archive="false" css="jar"/>
-    <mimetype type="application/vnd.android.package-archive" extensions="apk" archive="true" index="true" css="apk"/>
-    <mimetype type="application/x-rpm" extensions="rpm" css="rpm"/>
-    <mimetype type="application/x-rubygems" extensions="gem" css="gem"/>
-    <mimetype type="application/x-ruby-marshal" extensions="rz" css="ruby-marshal"/>
-    <mimetype type="application/x-debian-package" extensions="deb" css="deb"/>
-    <mimetype type="application/x-vagrant-box" extensions="box" css="box"/>
-
-    <!-- not registered -->
-    <mimetype type="text/x-scala-source" extensions="scala" viewable="true" syntax="scala"/>
-    <mimetype type="text/x-ruby-source" extensions="rb" viewable="true" syntax="ruby"/>
-    <mimetype type="text/x-script.sh" extensions="sh" viewable="true" syntax="shell"/>
-    <mimetype type="text/x-csharp.sh" extensions="cs" viewable="true" syntax="csharp"/>
-
-    <!--
-        NOTE: The following mime types are required for a proper functioning of certain features in Artifactory 
-         DO NOT change them unless you really know what you are doing
-    -->
-    <mimetype type="application/xml" extensions="xml, xsl, xsi" viewable="true" syntax="xml" css="xml"/>
-    <mimetype type="application/x-maven-pom+xml" extensions="pom" viewable="true" syntax="xml" css="pom"/>
-    <mimetype type="application/x-ivy+xml" extensions="ivy" viewable="true" syntax="xml" css="xml"/>
-    <mimetype type="application/x-nuspec+xml" extensions="nuspec" viewable="true" syntax="xml" css="xml"/>
-    <mimetype type="application/x-java-jnlp-file" extensions="jnlp" viewable="true" syntax="xml" css="jnlp"/>
-    <mimetype type="application/x-checksum" extensions="sha1, md5" viewable="true" syntax="plain"/>
-    <mimetype type="application/java-archive" extensions="jar, war, ear, sar, har, hpi, jpi" archive="true" index="true"
-              css="jar"/>
-
-</mimetypes>
\ No newline at end of file
diff --git a/base/config/src/main/resources/artifactory.xsd b/base/config/src/main/resources/artifactory.xsd
deleted file mode 100644
index fa56c1d..0000000
--- a/base/config/src/main/resources/artifactory.xsd
+++ /dev/null
@@ -1,3500 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2013 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0"
-           targetNamespace="http://artifactory.jfrog.org/xsd/1.7.4"
-           xmlns="http://artifactory.jfrog.org/xsd/1.7.4"
-           elementFormDefault="qualified">
-
-    <xs:element name="config" type="CentralConfigType"/>
-
-    <xs:complexType name="CentralConfigType">
-        <xs:sequence>
-            <xs:element name="serverName" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        A name uniquely identifying this artifactory server instance across the network.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="offlineMode" type="xs:boolean" default="false" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        If marked, Artifactory never tries to fetch artifacts remotely.
-                        Only cached and local artifacts are served.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="helpLinksEnabled" type="xs:boolean" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Determines whether help links are shown in the UI.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="fileUploadMaxSizeMb" type="xs:int" default="100" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The maximum size in megabytes for artifact files uploaded through the web UI. Set to '0' for
-                        unlimited size.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="dateFormat" type="xs:string" default="dd-MM-yy HH:mm:ss z" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The format used for displaying dates.
-                        For a detailed explanation see: <a href="http://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html" target="_blank">Joda DateTimeFormat</a>
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="addons" type="AddonsType" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Add-ons-related configuration.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="mailServer" type="MailServerType" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Mail server-related configuration.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="bintrayConfig" type="BintrayConfigType" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Default (globally used) Bintray credentials configuration.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="security" type="SecurityType" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Security-related configuration used in authentication and authorization.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="backups" type="BackupsType" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of backup configurations.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="indexer" type="IndexerType" minOccurs="0"/>
-            <xs:element name="localRepositories" type="LocalRepositoriesType">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of locally installed repositories.
-                        NOTE! that when using the default global virtual repository (repo) the order of the local
-                        repositories resolution is determined by the order they appear in this list.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="remoteRepositories" type="RemoteRepositoriesType" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of remote proxied (normally cached) repositories.
-                        NOTE! that when using the default global virtual repository (repo) the order of the cache and
-                        remote repositories resolution is determined by the order they appear in this list.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="virtualRepositories" type="VirtualRepositoriesType" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of virtual repositories aggregating regular local and remote repositories.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="distributionRepositories" type="DistributionRepositoriesType" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of distribution repositories which are used to distribute products and packages
-                        to Bintray.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="proxies" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of reusable proxy definitions. Proxies can be used by remote repositories by associating a
-                        proxy definition with a remote repository.
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:complexType>
-                    <xs:sequence>
-                        <xs:element name="proxy" type="ProxyType" maxOccurs="unbounded" minOccurs="0"/>
-                    </xs:sequence>
-                </xs:complexType>
-            </xs:element>
-            <xs:element name="reverseProxies" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of reusable reverse proxy definitions.
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:complexType>
-                    <xs:sequence>
-                        <xs:element name="reverseProxy" type="ReverseProxyType" maxOccurs="unbounded" minOccurs="0"/>
-                    </xs:sequence>
-                </xs:complexType>
-            </xs:element>
-            <xs:element name="propertySets" type="PropertySetsType" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Define property sets to group together properties of the same category (e.g. QA). Then, define
-                        properties and their respective possible values (e.g. performance:{poor,acceptable,good} and
-                        qaStaffComment:[any]).
-                        Once property sets and their properties are defined, you can associate them with repositories,
-                        in order to be able to easily set, update and search for predefined property values on hosted
-                        repository items.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="urlBase" type="xs:string" default="" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A hard-coded URL prefix used by Artifactory for calculating relative URLs.
-                        Use this only if you must override the default URL base (similar to the Servlet context URL
-                        - e.g. http://myhost.com/artifactory).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="logo" type="xs:string" default="" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The remote URL of a logo image.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="footer" type="xs:string" default="" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Additional custom text to appear in the page footer.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="repoLayouts" minOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Define reusable repository storage layouts used for identifying modules (module artifacts and
-                        module descriptors).
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:complexType>
-                    <xs:sequence>
-                        <xs:element name="repoLayout" type="RepoLayoutType" maxOccurs="unbounded" minOccurs="0" />
-                    </xs:sequence>
-                </xs:complexType>
-            </xs:element>
-            <xs:element name="remoteReplications" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Configure scheduled remote repository replications.
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:complexType>
-                    <xs:sequence>
-                        <xs:element name="remoteReplication" type="RemoteReplicationType" maxOccurs="unbounded"
-                                    minOccurs="0"/>
-                    </xs:sequence>
-                </xs:complexType>
-            </xs:element>
-            <xs:element name="localReplications" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Configure scheduled local repository replications.
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:complexType>
-                    <xs:sequence>
-                        <xs:element name="localReplication" type="LocalReplicationType" maxOccurs="unbounded"
-                                    minOccurs="0"/>
-                    </xs:sequence>
-                </xs:complexType>
-            </xs:element>
-            <xs:element name="gcConfig" type="GcConfigType" minOccurs="1"/>
-            <xs:element name="cleanupConfig" type="CleanupConfigType" minOccurs="1"/>
-            <xs:element name="virtualCacheCleanupConfig" type="CleanupConfigType" minOccurs="1"/>
-            <xs:element name="quotaConfig" type="QuotaConfigType" minOccurs="0"/>
-            <xs:element name="externalProviders" type="ExternalProvidersType" minOccurs="0"/>
-            <xs:element name="systemMessageConfig" type="SystemMessageType" minOccurs="0"/>
-            <xs:element name="folderDownloadConfig" type="FolderDownloadConfigType" minOccurs="1" maxOccurs="1"/>
-            <xs:element name="trashcanConfig" type="TrashcanConfigType" minOccurs="1" maxOccurs="1"/>
-            <xs:element name="replicationsConfig" type="replicationsConfigType" minOccurs="0"  maxOccurs="1"/>
-            <xs:element name="bintrayApplications" type="BintrayApplicationsType" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of reusable Bintray OAuth applications used by the Distribution Repository.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="LocalRepositoriesType">
-        <xs:sequence>
-            <xs:element name="localRepository" type="LocalRepoType" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="LocalRepoType">
-        <xs:complexContent>
-            <xs:extension base="RealRepoType">
-                <xs:sequence>
-                    <xs:element name="snapshotVersionBehavior" default="unique" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether to use time-based version numbers for the name of SNAPSHOTs,
-                                or to use a non-unique, self-overriding naming pattern of
-                                artifactId-version-SNAPSHOT.type (default), or to respect the
-                                deployer settings coming from the Maven client.
-                            </xs:documentation>
-                        </xs:annotation>
-                        <xs:simpleType>
-                            <xs:restriction base="xs:string">
-                                <xs:enumeration value="deployer"/>
-                                <xs:enumeration value="non-unique"/>
-                                <xs:enumeration value="unique"/>
-                            </xs:restriction>
-                        </xs:simpleType>
-                    </xs:element>
-                    <xs:element name="localRepoChecksumPolicyType" default="client-checksums" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Checksum policy determines how Artifactory behaves when a client checksum for a deployed
-                                resource is missing or conflicts with the locally calculated checksum (bad checksum).
-                                Checking checksums effectively verifies the integrity of the deployed resource.
-                                The options are:
-                                (1) Verify against client checksums (default) - Until a client has sent a valid checksum
-                                for a deployed artifact matching the server's locally calculated checksum, the
-                                artifact's checksum is not available and returns 404 (not found).
-                                If the client has sent a checksum conflicting with the one calculated on the server a
-                                409 (conflict) is returned until a valid checksum is deployed.
-                                (2) Trust server generated checksums - Do not verify against checksums sent by clients
-                                and trust the store server's locally calculated checksums. An uploaded artifact is
-                                available for consumption immediately, but integrity might be compromised.
-                            </xs:documentation>
-                        </xs:annotation>
-                        <xs:simpleType>
-                            <xs:restriction base="xs:string">
-                                <xs:enumeration value="client-checksums"/>
-                                <xs:enumeration value="server-generated-checksums"/>
-                            </xs:restriction>
-                        </xs:simpleType>
-                    </xs:element>
-                    <xs:element name="calculateYumMetadata" type="xs:boolean" default="false" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                A-synchronously calculate YUM repository metadata upon RPM deployment and removal.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="yumRootDepth" type="xs:int" default="0" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The depth, relative to the repository's root folder, where YUM metadata is created.
-                                This is useful when your repository contains multiple YUM repositories under parallel
-                                hierarchies.
-                                For example, if your RPMs are stored under 'fedora/linux/$releasever/$basearch', specify
-                                a depth of 4.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="yumGroupFileNames" type="xs:string" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                A comma-separated list of xml file names containing YUM group component definitions.
-                                Artifactory includes the group definitions as part of the calculated YUM metadata,
-                                as well as automatically generating a gzipped version of the group files, if required.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="debianTrivialLayout" type="xs:boolean" default="true" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The default Debian architecture is "Automatic", to change the Debian architecture to
-                                'Trivial' (which is deprecated) and generate the indices in the root directory,
-                                set the Trivial Layout checkbox.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="DistributionRepositoriesType">
-        <xs:sequence>
-            <xs:element name="distributionRepository" type="DistributionRepoType" minOccurs="0" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="DistributionRepoType">
-        <xs:complexContent>
-            <xs:extension base="LocalRepoType">
-                <xs:sequence>
-                    <xs:element name="bintrayApplicationRef" type="xs:IDREF" minOccurs="0" maxOccurs="1">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Bintray Application assigned to this Distribution Repo.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="rules" type="DistributionRulesType" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                List of distribution rules used by this repository.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="proxyRef" type="xs:IDREF" minOccurs="0" maxOccurs="1">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Network proxy reference.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="productName" type="xs:string" minOccurs="0" maxOccurs="1">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Optional product name this repo will distribute to.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="defaultNewRepoPrivate" type="xs:boolean" default="true" minOccurs="0" maxOccurs="1">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Default visibility for newly created Bintray repositories (private/public).
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="defaultNewRepoPremium" type="xs:boolean" default="true" minOccurs="0" maxOccurs="1">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Default type of new distributions - governs the type of repositories Artifactory
-                                creates in Bintray (Premium/OSS).
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="defaultLicenses" minOccurs="0" maxOccurs="1">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Default set of licenses that are attached to newly created packages.
-                            </xs:documentation>
-                        </xs:annotation>
-                        <xs:complexType>
-                            <xs:sequence>
-                                <xs:element name="license" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
-                            </xs:sequence>
-                        </xs:complexType>
-                    </xs:element>
-                    <xs:element name="defaultVcsUrl" type="xs:string" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Default VCS url that will be set on newly created packages.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="whiteListedProperties" minOccurs="0" maxOccurs="1">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Approved property keys that will be set as attributes on newly created packages.
-                            </xs:documentation>
-                        </xs:annotation>
-                        <xs:complexType>
-                            <xs:sequence>
-                                <xs:element name="property" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
-                            </xs:sequence>
-                        </xs:complexType>
-                    </xs:element>
-                    <xs:element name="gpgSign" type="xs:boolean" minOccurs="0" maxOccurs="1">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Indicates whether Artifactory will automatically invoke signing of distributed content
-                                by Bintray, using the gpg keys you uploaded.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="gpgPassPhrase" type="xs:string" minOccurs="0" maxOccurs="1">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The passphrase to use when invoking gpg signing of distributed content.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="RealRepoType" abstract="true">
-        <xs:complexContent>
-            <xs:extension base="RepoType">
-                <xs:sequence>
-                    <xs:element name="blackedOut" type="xs:boolean" default="false" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether the repository is blacked-out. A blacked-out repository or its local cache do
-                                not
-                                participate in artifact resolution.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="handleReleases" type="xs:boolean" default="true" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether the repository handles release artifacts.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="handleSnapshots" type="xs:boolean" default="true" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether the repository handles snapshot artifacts.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="maxUniqueSnapshots" type="xs:int" default="0" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The maximum number of unique snapshots (of the same artifact) to store.
-                                Any number of snapshots above the max are automatically removed by age.
-                                A value of 0 (the default) indicates no limits on unique snapshots number (thus
-                                no automatic cleanup).
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="suppressPomConsistencyChecks" type="xs:boolean" default="true" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether the repository should suppress POM consistency checks.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="propertySets" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The property sets that you are able to use of items hosted under this repository.
-                                As property sets are purely assistive and not enforcing, setting this on a repository
-                                only affects the list of predefined properties in the user interface properties tab for
-                                items under the repository. You are still be able to attach arbitrary properties to
-                                repository items.
-                            </xs:documentation>
-                        </xs:annotation>
-                        <xs:complexType>
-                            <xs:sequence>
-                                <xs:element name="propertySetRef" type="xs:IDREF" minOccurs="0" maxOccurs="unbounded">
-                                    <xs:annotation>
-                                        <xs:documentation source="description">
-                                            A property set usable by this repository.
-                                        </xs:documentation>
-                                    </xs:annotation>
-                                </xs:element>
-                            </xs:sequence>
-                        </xs:complexType>
-                    </xs:element>
-                    <xs:element name="archiveBrowsingEnabled" type="xs:boolean" minOccurs="0" default="false">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                <![CDATA[
-                        Allow Unsafe Content and Archive Browsing -
-                        Determines whether viewing content (e.g., html files, Javadoc browsing) directly from Artifactory is allowed.
-                        Allowing content browsing requires strict content moderation in order to make sure malicious users do not
-                        upload content that is used to compromise security. For example, to conduct cross-site scripting attacks.
-                        ]]>
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="RepoType" abstract="true">
-        <xs:sequence>
-            <xs:element name="key" type="xs:ID">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Repository unique ID.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="type" type="xs:string" minOccurs="1"/>
-            <xs:element name="description" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Textual description of the repository.
-                        This description also appears when selecting the repository in the Tree Browser.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="notes" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Optional notes about this repository.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="includesPattern" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Comma-separated list of artifact patterns to include when evaluating
-                        artifact requests, in the form of x/y/**/z/*. When used, only requests
-                        matching one of the include patterns are served.
-                        By default all artifacts are included (**/*).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="excludesPattern" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Comma-separated list of artifact patterns to exclude when evaluating
-                        artifact requests, in the form of x/y/**/z/*.
-                        By default no artifacts are excluded.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="repoLayoutRef" type="xs:IDREF" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Select the layout that the repository should use for storing and identifying modules.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="dockerApiVersion" default="V1" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Docker API version.
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:simpleType>
-                    <xs:restriction base="xs:string">
-                        <xs:enumeration value="V1"/>
-                        <xs:enumeration value="V2"/>
-                    </xs:restriction>
-                </xs:simpleType>
-            </xs:element>
-            <xs:element name="forceDockerAuthentication" type="xs:boolean" default="false" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Force basic authentication credentials in order to use this repository.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="forceNugetAuthentication" type="xs:boolean" default="false" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Force basic authentication credentials in order to use this repository.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="RemoteRepositoriesType">
-        <xs:sequence>
-            <xs:element name="remoteRepository" type="RemoteRepoType"
-                        minOccurs="0" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="RemoteRepoType">
-        <xs:complexContent>
-            <xs:extension base="RemoteRepoBaseType">
-                <xs:sequence>
-                    <xs:element name="username" type="xs:string" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                HTTP authentication username.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="password" type="xs:string" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                HTTP authentication password.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="allowAnyHostAuth" type="xs:boolean" default="false" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Allow credentials of this repository to be used on requests redirected to any other
-                                host.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="socketTimeoutMillis" type="xs:int" default="15000"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Network timeout in milliseconds to use both for connection
-                                establishment and for unanswered requests.
-                                Timing out on a network operation is considered as a retrieval
-                                failure.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="enableCookieManagement" type="xs:boolean" default="false" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Enable cookie management if the remote repo uses cookies to manage client state.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="enableTokenAuthentication" type="xs:boolean" default="false" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Enable token (Bearer) based authentication
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="localAddress" type="xs:string" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The local address to be used when creating connections.
-                                Useful for specifying the interface to use on systems with multiple network interfaces.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="proxyRef" type="xs:IDREF" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Network proxy reference.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="queryParams" type="xs:string" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                <![CDATA[
-                                Custom HTTP query parameters that will be automatically included in all remote resource requests.
-                                For example: param1=val1&param2=val2&param3=val3
-                                ]]>
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="propagateQueryParams" type="xs:boolean" default="false" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                <![CDATA[
-                                If original query parameters should be included in remote requests
-                                ]]>
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="RemoteRepoBaseType" abstract="true">
-        <xs:complexContent>
-            <xs:extension base="RealRepoType">
-                <xs:sequence>
-                    <xs:element name="url" type="xs:string">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The URL for the remote repository. Currently only HTTP/S URLs are
-                                supported.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="offline" type="xs:boolean" default="false" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                When marked, only already-cached artifacts are retrieved and
-                                fetching remote artifacts is not attempted.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="hardFail" type="xs:boolean" default="false" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether failing to communicate with this repository returns an
-                                error to the client that fails the build.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="storeArtifactsLocally" type="xs:boolean" default="true" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether the repository should store cached artifacts locally or not. When not storing
-                                artifacts locally, direct repository-to-client streaming is used. This can be useful for
-                                multi-server setups over a high-speed LAN, with one Artifactory caching certain data
-                                on a central storage and streaming it directly to satellite pass-though Artifactory
-                                servers.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="fetchJarsEagerly" type="xs:boolean" default="true" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                When marked, the repository attempts to eagerly fetch the jar in the background
-                                each time a POM is requested.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="fetchSourcesEagerly" type="xs:boolean" default="true" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                When marked, the repository attempts to eagerly fetch the source jar in the
-                                background each time a jar is requested.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="retrievalCachePeriodSecs" type="xs:long" default="600" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The number of seconds to cache artifact look-up results.
-                                A value of 0 indicates no caching.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="assumedOfflinePeriodSecs" type="xs:long" default="30" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The number of seconds the repository stays in assumed offline state after a connection
-                                error. At the end of this time an online check is attempted in order to reset the
-                                offline status.
-                                A value of 0 means the repository is never assumed offline.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="missedRetrievalCachePeriodSecs" type="xs:long" default="1800" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The number of seconds to cache artifact retrieval misses (artifact not found).
-                                A value of 0 indicates no caching.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="remoteRepoChecksumPolicyType" default="generate-if-absent" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Checksum policy determines how Artifactory behaves when a checksum for a remote resource
-                                is missing or conflicts with the locally calculated checksum (bad checksum).
-                                Checksum checking effectively verifies the integrity of the remote resource.
-                                The options are:
-                                1) Generate if absent (by default) - A bad remote checksum fails the resource
-                                request. If, however, a remote checksum could not be found Artifactory automatically
-                                generates one.
-                                2) Fail: A bad or missing remote checksum fails the resource request.
-                                3) Ignore and generate: Artifactory locally generates a checksum for both bad or
-                                missing remote checksum. Remote resource retrieval never fails, but integrity might
-                                be compromised.
-                                4) Pass-thru: Artifactory stores and passes-thorugh all remote checksums including
-                                bad ones and locally generates a checksum for a missing remote checksum that cannot be
-                                found. Remote resource retrieval never fails, but integrity might be compromised and
-                                client-side checksum validation (such as the one performed by Maven) fails.
-                            </xs:documentation>
-                        </xs:annotation>
-                        <xs:simpleType>
-                            <xs:restriction base="xs:string">
-                                <xs:enumeration value="generate-if-absent"/>
-                                <xs:enumeration value="fail"/>
-                                <xs:enumeration value="ignore-and-generate"/>
-                                <xs:enumeration value="pass-thru"/>
-                            </xs:restriction>
-                        </xs:simpleType>
-                    </xs:element>
-                    <xs:element name="unusedArtifactsCleanupPeriodHours" type="xs:int" default="0" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The number of hours to wait before an artifact is deemed "unused" and eligible for
-                                cleanup from the repository.
-                                A value of 0 means automatic cleanup of cached artifacts is disabled.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="shareConfiguration" type="xs:boolean" default="false" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether or not the configuration details of this remote repository can be publicly
-                                shared with remote clients, such as other Artifactory servers.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="synchronizeProperties" type="xs:boolean" default="false" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether to synchronize properties of artifacts retrieved from a remote instance of
-                                Artifactory.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="listRemoteFolderItems" type="xs:boolean" default="true" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Lists the items of remote folders in simple and list browsing. Required for dynamic
-                                resolution that depends on remote folder content information, such as remote Ivy version
-                                lookups. The remote content is cached according to the value of the
-                                'Retrieval Cache Period'
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="remoteRepoLayoutRef" type="xs:IDREF" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Select the layout that best matches the layout used by remote repository for storing and
-                                identifying modules.
-                                Path-mapping takes place if the remote layout is different from the local layout -
-                                remote module artifacts and descriptors is stored according to the local repository
-                                layout (e.g., Maven 1->Maven 2, or Maven 2->Ivy).
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="rejectInvalidJars" type="xs:boolean" default="false" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Reject the caching of jar files that are found to be invalid. For example, pseudo jars
-                                retrieved behind a "captive portal".
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="p2Support" type="xs:boolean" default="false" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Support remote P2 metadata updates.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="nuget" type="NuGetConfigurationType" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Proxy and cache NuGet libraries from the remote repository.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="pypi" type="PypiConfigurationType" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Proxy and cache NuGet libraries from the remote repository.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="bower" type="BowerConfigurationType" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Proxy and cache Bower libraries from the remote repository.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="cocoaPods" type="CocoaPodsConfigurationType" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Proxy and cache CocoaPods libraries from the remote repository.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="p2OriginalUrl" type="xs:string" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The URL for the original P2 repository. Currently only HTTP/S URLs are
-                                supported.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="vcs" type="VcsType" minOccurs="0"/>
-                    <xs:element name="contentSynchronisation" type="ContentSynchronisation" minOccurs="0" maxOccurs="1">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Content synchronisation to another artifactory repository
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="blockMismatchingMimeTypes" type="xs:boolean" default="true" minOccurs="0" maxOccurs="1">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                If set, artifacts will fail to download if a mismatch is detected between requested and
-                                received mimetype according to the list specified in the system properties file under
-                                blockedMismatchingMimeTypes. You can override by adding mimetypes to the override list below.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="mismatchingMimeTypesOverrideList" type="xs:string" minOccurs="0" maxOccurs="1">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                A comma separated list of mime types that will be blocked by this repo if the original
-                                request was for a different mime type.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="ContentSynchronisation">
-        <xs:sequence>
-            <xs:element name="enabled" type="xs:boolean" form="qualified" default="false"  minOccurs="1" maxOccurs="1"/>
-            <xs:element name="statistics" type="StatisticsContent" form="qualified"  minOccurs="1" maxOccurs="1"/>
-            <xs:element name="properties" type="PropertiesContent" form="qualified"  minOccurs="1" maxOccurs="1"/>
-            <xs:element name="source" type="SourceContent" form="qualified" minOccurs="1" maxOccurs="1"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="StatisticsContent">
-        <xs:complexContent>
-            <xs:extension base="AbstractRemoteRepoDelegate">
-                <xs:sequence/>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="PropertiesContent">
-        <xs:complexContent>
-            <xs:extension base="AbstractRemoteRepoDelegate">
-                <xs:sequence/>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="SourceContent">
-        <xs:sequence>
-            <xs:element name="originAbsenceDetection" type="xs:boolean" form="qualified" default="false" minOccurs="1" maxOccurs="1"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="AbstractRemoteRepoDelegate" abstract="true">
-        <xs:sequence>
-            <xs:element name="enabled" type="xs:boolean" form="qualified" default="false"  minOccurs="1" maxOccurs="1"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="VirtualRepositoriesType">
-        <xs:sequence>
-            <xs:element name="virtualRepository" type="VirtualRepoType" minOccurs="0" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="VirtualRepoType">
-        <xs:complexContent>
-            <xs:extension base="RepoType">
-                <xs:sequence>
-                    <xs:element name="artifactoryRequestsCanRetrieveRemoteArtifacts" type="xs:boolean" minOccurs="0"
-                                default="false">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Determines whether artifact requests coming from other Artifactories
-                                can be fulfilled by accessing this virtual repository's remote repositories
-                                or by only accessing its caches (by default).
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="repositories" type="RepositoryRefsType" maxOccurs="1" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                A set of local and remote repository references to include in a
-                                virtual repository.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="keyPair" type="xs:string" minOccurs="0" maxOccurs="1">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                A named key-pair to use for automatically signing artifacts.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="pomRepositoryReferencesCleanupPolicy" default="discard_active_reference"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                (1) Discard Active References - Removes repository elements that are declared
-                                directly under project or under a profile in the same POM that is activeByDefault.
-                                (2)Discard Any References - Removes all repository elements regardless of whether
-                                they are included in an active profile or not.
-                                (3)Nothing - Does not remove any repository elements declared in the POM.
-                            </xs:documentation>
-                        </xs:annotation>
-                        <xs:simpleType>
-                            <xs:restriction base="xs:string">
-                                <xs:enumeration value="discard_active_reference"/>
-                                <xs:enumeration value="discard_any_reference"/>
-                                <xs:enumeration value="nothing"/>
-                            </xs:restriction>
-                        </xs:simpleType>
-                    </xs:element>
-                    <xs:element name="p2" type="P2ConfigurationType" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Configuration for automatic P2 handling
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="defaultDeploymentRepo" type="xs:IDREF" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Local repository reference (key).
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="externalDependencies" type="ExternalDependenciesConfigType" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Configuration for fetching external depenednecies
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="P2ConfigurationType">
-        <xs:sequence>
-            <xs:element name="urls" type="P2UrlsType" maxOccurs="1" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of local and remote P2 repository URLs to aggregate under this virtual repository.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="ExternalDependenciesConfigType">
-        <xs:sequence>
-            <xs:element name="enabled" type="xs:boolean" minOccurs="1" maxOccurs="1" default="false">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Enable filtering of external dependencies
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="patterns" type="ExternalDependenciesPatternsType" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of ant patterns to match for external dependencies.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="remoteRepo" type="xs:IDREF" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Remote repo used to cache external dependencies
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="ExternalDependenciesPatternsType">
-        <xs:sequence>
-            <xs:element name="pattern" type="xs:string" minOccurs="0" maxOccurs="unbounded">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The pattern to match for external dependency
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="NuGetConfigurationType">
-        <xs:sequence>
-            <xs:element name="feedContextPath" type="xs:string" default="api/v2" minOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The context path prefix through which the NuGet feeds are served.
-                        For example, the NuGet Gallery feed URL is 'https://nuget.org/api/v2', so the repository URL should
-                        be configured as 'https://nuget.org' and the feed context path should be configured as 'api/v2'.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="downloadContextPath" type="xs:string" default="api/v2/package" minOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The context path prefix through which NuGet downloads are served.
-                        For example, the NuGet Gallery download URL is 'https://nuget.org/api/v2/package', so the repository
-                        URL should be configured as 'https://nuget.org' and the download context path should be configured
-                        as 'api/v2/package'.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="PypiConfigurationType">
-        <xs:sequence>
-            <xs:element name="indexContextPath" type="xs:string" default="simple/" minOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The context path to the remote server's simple index.
-                        For example, for 'https://pypi.python.org/' it is 'simple/'
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="packagesContextPath" type="xs:string" default="packages/" minOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The context path to where packages are stored at the remote server.
-                        For example, for 'https://pypi.python.org/' it is 'packages/'
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="BowerConfigurationType">
-        <xs:sequence>
-            <xs:element name="bowerRegistryUrl" type="xs:string" default="https://bower.herokuapp.com" minOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The Bower registry URL to communicate with.
-                        Usually should be left as a default for 'https://bower.herokuapp.com' unless the remote
-                        is an Artifactory instance of which the value should match the remote repository URL.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="CocoaPodsConfigurationType">
-        <xs:sequence>
-            <xs:element name="cocoaPodsSpecsRepoUrl" type="xs:string" default="https://github.com/CocoaPods/Specs" minOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The CocoaPods Specs Repo URL to communicate with.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="specRepoProvider" type="VcsGitType" minOccurs="0" maxOccurs="1"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="P2UrlsType">
-        <xs:sequence>
-            <xs:element name="url" type="xs:string" minOccurs="0" maxOccurs="unbounded">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The URL of the target P2 repository. This URL should contain a P2 metadata descriptor
-                        (composite, content or artifacts).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="RepositoryRefsType">
-        <xs:sequence>
-            <xs:element name="repositoryRef" type="xs:IDREF" minOccurs="0" maxOccurs="unbounded">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Local, remote or virtual repository reference (key).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="ProxyType">
-        <xs:sequence>
-            <xs:element name="key" type="xs:ID">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy Unique ID.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="host" type="xs:string">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy host name.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="port" type="xs:int">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy port number.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="username" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy username.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="password" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy password.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="ntHost" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The computer name of this machine (that is connected to the NTLM proxy).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="domain" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy domain/realm name.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="defaultProxy" type="xs:boolean" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Make this proxy the default for new remote repositories and for internal HTTP requests.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="redirectedToHosts" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        An optional list of newline or comma separated host names to which the proxy may redirect
-                        requests.
-                        The credentials of the proxy are reused by requests redirected to any of these hosts.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="ReverseProxyType">
-        <xs:sequence>
-            <xs:element name="key" type="xs:ID">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Reverse Proxy Unique ID.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="webServerType" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The web server type for this reverse proxy
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:simpleType>
-                    <xs:restriction base="xs:string">
-                        <xs:enumeration value="nginx"/>
-                        <xs:enumeration value="apache"/>
-                    </xs:restriction>
-                </xs:simpleType>
-            </xs:element>
-            <xs:element name="artifactoryAppContext" type="xs:string"/>
-            <xs:element name="publicAppContext" type="xs:string"/>
-            <xs:element name="serverName" type="xs:string"/>
-            <xs:element name="serverNameExpression" type="xs:string" nillable="true"/>
-            <xs:element name="sslType" minOccurs="0" maxOccurs="1">
-                <xs:simpleType>
-                    <xs:restriction base="xs:string">
-                        <xs:enumeration value="self-signed"/>
-                        <xs:enumeration value="ca-signed"/>
-                        <xs:enumeration value="no-ssl"/>
-                    </xs:restriction>
-                </xs:simpleType>
-            </xs:element>
-            <xs:element name="sslCertificate" type="xs:string" nillable="true"/>
-            <xs:element name="sslKey" type="xs:string" nillable="true"/>
-            <xs:element name="dockerReverseProxyMethod" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        method to use for reverse proxy
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:simpleType>
-                    <xs:restriction base="xs:string">
-                        <xs:enumeration value="portPerRepo"/>
-                        <xs:enumeration value="subDomain"/>
-                        <xs:enumeration value="noValue"/>
-                    </xs:restriction>
-                </xs:simpleType>
-            </xs:element>
-            <xs:element name="useHttps" type="xs:boolean" />
-            <xs:element name="useHttp" type="xs:boolean" />
-            <xs:element name="sslPort" type="xs:int"/>
-            <xs:element name="httpPort" type="xs:int"/>
-            <xs:element name="reverseProxyRepositories" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of reusable reverse proxy repositories.
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:complexType>
-                    <xs:sequence>
-                        <xs:element name="reverseProxyRepoConfigs" type="ReverseProxyRepoConfigType" maxOccurs="unbounded" minOccurs="0"/>
-                    </xs:sequence>
-                </xs:complexType>
-            </xs:element>
-            <xs:element name="artifactoryServerName" type="xs:string"/>
-            <xs:element name="upStreamName" type="xs:string" nillable="true"/>
-            <xs:element name="artifactoryPort" type="xs:int"/>
-        </xs:sequence>
-    </xs:complexType>
-    <xs:complexType name="ReverseProxyRepoConfigType">
-        <xs:sequence>
-            <xs:element name="repoRef" type="xs:IDREF"/>
-            <xs:element name="serverName" type="xs:string"/>
-            <xs:element name="port" type="xs:int"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="BackupsType">
-        <xs:sequence>
-            <xs:element name="backup" type="BackupType" maxOccurs="unbounded" minOccurs="0"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="BackupType">
-        <xs:sequence>
-            <xs:element name="key" type="xs:ID">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Backup Unique ID.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="enabled" type="xs:boolean" minOccurs="0" default="true">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Determines whether this backup is enabled or disabled.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="dir" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The directory to which backup local repository data as files.
-                        The default is $ARTIFACTORY_HOME/backup/[backup_key]
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="cronExp" type="xs:string">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The Cron expression by which backup frequency is determined. For detailed information see: <a href="http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html" target="_blank">The CronTrigger Tutorial</a>
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="retentionPeriodHours" type="xs:int" default="168" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The maximum number of hours to keep old backups in the destination dir.
-                        Marking the "Incremental" checkbox, indicates that backups are incrementally (delta only)
-                        written to the same directory: ${backupDir}/current. This "in place" backup type is suitable
-                        for file-system based backup support, and cleanup of old backups is inactive in this mode.
-                        The default is 168 hours = 7 days.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="createArchive" type="xs:boolean" minOccurs="0" default="false">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Determines whether the backup output should be a zip archive or a
-                        directory (the default).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="excludedRepositories" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of repository references to exclude from backup.
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:complexType>
-                    <xs:sequence>
-                        <xs:element name="repositoryRef" type="xs:IDREF" minOccurs="0" maxOccurs="unbounded">
-                            <xs:annotation>
-                                <xs:documentation source="description">
-                                    Local or remote repository reference (key).
-                                </xs:documentation>
-                            </xs:annotation>
-                        </xs:element>
-                    </xs:sequence>
-                </xs:complexType>
-            </xs:element>
-            <xs:element name="sendMailOnError" type="xs:boolean" minOccurs="0" default="true">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Send email notifications to admin users if errors are encountered during the backup process
-                        (requires properly configured email settings and valid email addresses for admin users).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="excludeBuilds" type="xs:boolean" minOccurs="0" default="false">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Exclude all builds from the backup.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="excludeNewRepositories" type="xs:boolean" minOccurs="0" default="false">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Automatically exclude new repositories from the backup.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="IndexerType">
-        <xs:annotation>
-            <xs:documentation source="description">
-                Configuration for the indexer creating Maven indexes downloadable by IDEs.
-            </xs:documentation>
-        </xs:annotation>
-        <xs:sequence>
-            <xs:element name="enabled" type="xs:boolean" default="false" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Determines whether the indexer service is enabled and should be run.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="cronExp" type="xs:string" default="0 23 5 * * ?" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The Cron expression by which indexer frequency is determined to recalculate
-                        new Maven indexes on selected repositories. For detailed information see: <a href="http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html" target="_blank">The CronTrigger Tutorial</a>
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-
-            <xs:element name="includedRepositories" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of repository references to index.
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:complexType>
-                    <xs:sequence>
-                        <xs:element name="repositoryRef" type="xs:IDREF" minOccurs="0" maxOccurs="unbounded">
-                            <xs:annotation>
-                                <xs:documentation source="description">
-                                    Repository reference (key).
-                                </xs:documentation>
-                            </xs:annotation>
-                        </xs:element>
-                    </xs:sequence>
-                </xs:complexType>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="AddonsType">
-        <xs:sequence>
-            <xs:element name="showAddonsInfo" type="xs:boolean" minOccurs="0" maxOccurs="1" default="true">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        When selected, info about available Add-ons is displayed in the Artifactory user interface.
-                        Enabling add-ons info display resets any user-specific info-hiding preference.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="showAddonsInfoCookie" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A variable used for calculating the path for a user cookie storing their personal add-on
-                        info showing preferences.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="MailServerType">
-        <xs:sequence>
-            <xs:element name="enabled" type="xs:boolean" default="true" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The activity state of the configuration.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="host" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The host name of the mail server.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="port" type="xs:int" default="25" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The mail server port.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="username" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The authentication username.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="password" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The authentication password.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="from" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The "from" address header to use in all outgoing mails. Can be left blank.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="subjectPrefix" type="xs:string" minOccurs="0" default="[Artifactory]">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A prefix to use for the subject of all outgoing mails.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="tls" type="xs:boolean" minOccurs="0" default="false">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Determines whether to use transport layer security when connecting to the mail server.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="ssl" type="xs:boolean" minOccurs="0" default="false">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Determines whether to use SSL when connecting to the mail server.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="artifactoryUrl" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The Artifactory URL to use in all outgoing mails to denote links to Artifactory. Can be left
-                        blank.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="BintrayConfigType">
-        <xs:annotation>
-            <xs:documentation source="description">
-                The default Bintray Credentials that will be used by Artifactory in cases where an Artifactory
-                user doesn't have Bintray credentials defined.
-            </xs:documentation>
-        </xs:annotation>
-        <xs:sequence>
-            <xs:element name="userName" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The default Bintray user name that will be used by Artifactory in cases where an Artifactory
-                        user doesn't have Bintray credentials defined.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="apiKey" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The default Bintray API Key that will be used by Artifactory in cases where an Artifactory
-                        user doesn't have Bintray credentials defined.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="fileUploadLimit" type="xs:int" default="200" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The maximum number of files that a user is allowed to push to Bintray in a single operation.
-                        Set to '0' for unlimited.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="SecurityType">
-        <xs:sequence>
-            <xs:element name="anonAccessEnabled" type="xs:boolean" minOccurs="0" default="true">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Determines whether anonymous access to the repository and the UI is permitted.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="anonAccessToBuildInfosDisabled" type="xs:boolean" minOccurs="0" default="false">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Determines whether anonymous users can view build related information.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="hideUnauthorizedResources" type="xs:boolean" minOccurs="0" default="false">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        When marked, Artifactory hides the existence of unauthorized resources by sending a 404
-                        response (not found) to requests for resources that are not accessible by the user. Otherwise,
-                        the response implies that the resource exists but is protected - by requesting authentication
-                        for anonymous requests (401) or by denying an authenticated request for unauthorized users.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="passwordSettings" type="PasswordSettingsType" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Password policy settings (credentials encryption etc.).
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="ldapSettings" type="LdapSettingsType" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Security settings specific to LDAP.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="ldapGroupSettings" type="LdapGroupSettingsType" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Security settings specific to LDAP Groups.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="httpSsoSettings" type="HttpSsoSettingsType" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Security settings specific to HTTP SSO.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="crowdSettings" type="CrowdSettingsType" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Security settings specific to Atlassian Crowd.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="samlSettings" type="SamlSettingsType" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Security settings specific to SAML.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="oauthSettings" type="oauthSettingsType" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Security settings specific to OAuth.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="debianSettings" type="DebianSettingsType" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Security settings specific to GPG signing
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="userLockPolicy" type="UserLockPolicyType" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                         User locking policy settings.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="sshServerSettings" type="SshServerSettingsType" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Security settings specific to SSH.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="PasswordSettingsType">
-        <xs:sequence>
-            <xs:element name="encryptionPolicy" default="supported" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Determines the password requirements from users identified to Artifactory from a remote
-                        client, such as Maven.
-                        The options are:
-                        (1) Supported (by default) - Users can authenticate using both secure encrypted
-                        passwords or clear-text passwords.
-                        (2) Required: Users must authenticate using secure encrypted passwords. Clear-text
-                        authentication fails.
-                        (3) Unsupported: Only clear-text passwords can be used for authentication.
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:simpleType>
-                    <xs:restriction base="xs:string">
-                        <xs:enumeration value="supported"/>
-                        <xs:enumeration value="required"/>
-                        <xs:enumeration value="unsupported"/>
-                    </xs:restriction>
-                </xs:simpleType>
-            </xs:element>
-            <xs:element name="expirationPolicy" type="PasswordExpirationPolicyType" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                         Password expiration policy.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="UserLockPolicyType">
-        <xs:sequence>
-            <xs:element name="enabled" type="xs:boolean" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                Whether user can be locked up on incorrect login attempt.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="loginAttempts" type="xs:int" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                The number of incorrect login attempts that will lock user.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="PasswordExpirationPolicyType">
-        <xs:sequence>
-            <xs:element name="enabled" type="xs:boolean" minOccurs="0" maxOccurs="1" default="false">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                Whether user password can expire.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="passwordMaxAge" type="xs:int" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                The number of days for password to get expired.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="notifyByEmail" type="xs:boolean" minOccurs="0" maxOccurs="1" default="true">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                Whether users should be notified by email about password expiration.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="HttpSsoSettingsType">
-        <xs:sequence>
-            <xs:element name="httpSsoProxied" type="xs:boolean" minOccurs="0" default="false">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                Artifactory trusts incoming requests and reuses the remote user originally set on the
-request by the SSO of the HTTP server.
-
-This is useful if you want to use existing enterprise SSO integrations, such as the powerful authentication
-schemes provided by Apache (mod_auth_ldap, mod_auth_ntlm, mod_auth_kerb, etc.).
-
-When Artifactory is deployed as a webapp on Tomcat behind Apache:
-If using mod_proxy_ajp, ensure to set tomcatAuthentication="false" on the AJP connector.
-If using mod_jk, ensure to use the "JkEnvVar REMOTE_USER" directive in Apache's configuration.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="noAutoUserCreation" type="xs:boolean" minOccurs="0" default="false">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        When automatic user creation is off, authenticated users are not automatically created
-                        inside Artifactory. Instead, for every request from an SSO user, the user is temporarily
-                        associated with default groups (if such groups are defined), and the permissions for these
-                        groups apply.
-                        Without auto-user creation, you must manually create the user inside Artifactory to manage 
-						user permissions not attached to their default groups.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="allowUserToAccessProfile" type="xs:boolean" minOccurs="0" default="false">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                When automatic user creation is off, authenticated users are not automatically created
-                        inside Artifactory. Instead, for every request from a SAML user, the user is temporarily
-                        associated with default groups (if such groups are defined), and the permissions for these
-                        groups apply.
-                        Without auto-user creation, you must manually create the user inside Artifactory to manage
-						user permissions not attached to their default groups.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="remoteUserRequestVariable" type="xs:string" minOccurs="0" default="REMOTE_USER">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                The name of the HTTP request variable to use for extracting the user identity.
-                                Default is: REMOTE_USER.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-    <xs:complexType name="SshServerSettingsType">
-        <xs:sequence>
-            <xs:element name="enableSshServer" type="xs:boolean" minOccurs="0" default="false">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                SSH n stuff
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="sshServerPort" type="xs:int" default="1337" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        SSH server port number.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-    <xs:complexType name="CrowdSettingsType">
-        <xs:sequence>
-            <xs:element name="enableIntegration" type="xs:boolean" minOccurs="0" default="false">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                Enable security integration with Atlassian Crowd.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="serverUrl" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                The full URL of the Crowd server to use.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="applicationName" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                The application name configured for Artifactory in Crowd.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="password" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                The application password configured for Artifactory in Crowd.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="sessionValidationInterval" type="xs:long" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                The time window, in minutes, in which the session does not need to be revalidated.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="useDefaultProxy" type="xs:boolean" minOccurs="0" default="false">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        If a default proxy definition exists, it is used to pass through to the Crowd Server.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="noAutoUserCreation" type="xs:boolean" minOccurs="0" default="true">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        When automatic user creation is off, authenticated users are not automatically created
-                        inside Artifactory. Instead, for every request from a Crowd user, the user is temporarily
-                        associated with default groups (if such groups are defined), and the permissions for these
-                        groups apply.
-                        Without auto-user creation, you must manually create the user inside Artifactory to manage 
-						user permissions not attached to their default groups.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="customCookieTokenKey" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                Specify the SSO custom cookie name. Out-of-the-box Crowd uses the 'crowd.token_key' cookie name for all Crowd-connected applications.
-                                You can override the default value with your own cookie name. This is useful in environments with multiple Crowd servers.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="directAuthentication" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                Authenticate using credentials instead of the default session, token-based authentication. This is required for use with JIRA User Server.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="SamlSettingsType">
-        <xs:sequence>
-            <xs:element name="enableIntegration" type="xs:boolean" minOccurs="0" default="false">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                Enable security integration with SAML.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="loginUrl" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                The identity provider login URL (when you try to login, the service provider redirects to this URL).
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="logoutUrl" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                The identity provider logout URL (when you try to logout, the service provider redirects to this URL).
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="certificate" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                The certificate for SAML Authentication. NOTE! that the certificate must contain the public key to allow Artifactory to verify sign-in requests.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="serviceProviderName" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                SAML service provider name: this is the Artifactory name in the SAML federation.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="noAutoUserCreation" type="xs:boolean" minOccurs="0" default="true">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                When automatic user creation is off, authenticated users are not automatically created
-                        inside Artifactory. Instead, for every request from a SAML user, the user is temporarily
-                        associated with default groups (if such groups are defined), and the permissions for these
-                        groups apply.
-                        Without auto-user creation, you must manually create the user inside Artifactory to manage 
-						user permissions not attached to their default groups.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="allowUserToAccessProfile" type="xs:boolean" minOccurs="0" default="false">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                When automatic user creation is off, authenticated users are not automatically created
-                        inside Artifactory. Instead, for every request from a SAML user, the user is temporarily
-                        associated with default groups (if such groups are defined), and the permissions for these
-                        groups apply.
-                        Without auto-user creation, you must manually create the user inside Artifactory to manage
-						user permissions not attached to their default groups.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="autoRedirect" type="xs:boolean" minOccurs="0" default="false">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                Auto redirect the login page link to the identity provider URL.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-    <xs:complexType name="oauthSettingsType">
-        <xs:sequence>
-            <xs:element name="enableIntegration" type="xs:boolean" minOccurs="0" maxOccurs="1" default="false">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                Enable security integration with OAuth.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="allowUserToAccessProfile" type="xs:boolean" minOccurs="0" default="false">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                When automatic user creation is off, authenticated users are not automatically created
-                        inside Artifactory. Instead, for every request from a SAML user, the user is temporarily
-                        associated with default groups (if such groups are defined), and the permissions for these
-                        groups apply.
-                        Without auto-user creation, you must manually create the user inside Artifactory to manage
-						user permissions not attached to their default groups.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="persistUsers" type="xs:boolean" minOccurs="0" maxOccurs="1" default="false">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                Persist new users.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="defaultNpm" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                Default NPM provider.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="oauthProvidersSettings" type="oauthProvidersSettingsType" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Security settings specific to LDAP Groups.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-    <xs:complexType name="oauthProvidersSettingsType">
-        <xs:sequence>
-            <xs:element name="oauthProvidersSettings" type="oauthProviderSettingsType" minOccurs="0" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-    <xs:complexType name="oauthProviderSettingsType">
-        <xs:sequence>
-            <xs:element name="name" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                Provider unique name.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="enabled" type="xs:boolean" minOccurs="0" default="false">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                Provider type.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="providerType" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                Provider type.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="id" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                Provider id.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="secret" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                Provider secret.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="apiUrl" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                Provider url.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="authUrl" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                Provider authenticationUrl.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="tokenUrl" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                Provider token URL.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="basicUrl" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                Provider basic URL.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="domain" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                                Provider domain.
-                                ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-    <xs:complexType name="DebianSettingsType">
-        <xs:sequence>
-            <xs:element name="passphrase" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[ Passphrase for GPG signing. ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="LdapSettingsType">
-        <xs:sequence>
-            <xs:element name="ldapSetting" type="LdapSettingType" minOccurs="0" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="LdapGroupSettingsType">
-        <xs:sequence>
-            <xs:element name="ldapGroupSetting" type="LdapGroupSettingType" minOccurs="0" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="LdapSettingType">
-        <xs:sequence>
-            <xs:element name="key" type="xs:ID">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        LDAP setting Unique ID.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="enabled" type="xs:boolean" minOccurs="0" default="true">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Determines whether this LDAP is enabled or disabled.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="ldapUrl" type="xs:string" minOccurs="1" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Location of the LDAP server in the form of:
-                        ldap://myserver:myport/dc=sampledomain,dc=com
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="userDnPattern" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        A DN pattern that can be used to login users directlyto LDAP.
-                        This pattern is used for creating a DN string for 'direct' user
-                        authentication, where the pattern is relative to the base DN in the LDAP URL.
-                        The pattern argument {0} is replaced with the username.
-                        This works only if anonymous binding is allowed and a direct user DN can
-                        be used, which is not the default case for Active Directory (use User DN
-                        search filter instead).
-                        Example: uid={0},ou=People
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="search" type="SearchType" minOccurs="0" maxOccurs="1"/>
-            <xs:element name="autoCreateUser" type="xs:boolean" minOccurs="0" default="true">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Determines whether users should be auto-created when using LDAP, otherwise they are transient
-                        and associated with auto-join groups defined in Artifactory.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="emailAttribute" type="xs:string" default="mail" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        An attribute that can be used to map a user's email to a user created
-                        automatically in Artifactory.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="LdapGroupSettingType">
-        <xs:sequence>
-            <xs:element name="name" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        LDAP group setting search base.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="groupBaseDn" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        LDAP group setting search base.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="groupNameAttribute" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The group name attribute.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="groupMemberAttribute" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The group member attribute.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="subTree" type="xs:boolean" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Mark if you want to check the full subtree when searching.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="filter" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The filter to search for in the group.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="descriptionAttribute" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The group description.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="strategy" default="STATIC" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The group description.
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:simpleType>
-                    <xs:restriction base="xs:string">
-                        <xs:enumeration value="HIERARCHICAL"/>
-                        <xs:enumeration value="STATIC"/>
-                        <xs:enumeration value="DYNAMIC"/>
-                    </xs:restriction>
-                </xs:simpleType>
-            </xs:element>
-            <xs:element name="enabledLdap" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A reference to the LDAP setting to retrieve this group.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="SearchType">
-        <xs:annotation>
-            <xs:documentation source="description">
-                <![CDATA[
-                An authentication pattern can include either a userDnPattern for "direct"
-                authentication or searchFilter for user "search" (after binding with a manager DN)
-                and then authentication of the found user.
-                The managerDn and managerPassword are not used for "direct" DN authentication.
-                ]]>
-            </xs:documentation>
-        </xs:annotation>
-        <xs:sequence>
-            <xs:element name="searchFilter" type="xs:string" minOccurs="1" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        A filter expression used to search for the user DN used in LDAP
-                        authentication.
-                        This is an LDAP search filter (as defined in 'RFC 2254') with optional
-                        arguments. In this case, the username is the only argument, denoted by '{0}'.
-                        Possible examples are:
-                        (uid={0}) - this searches for a username match on the attribute.
-                        Authentication to LDAP is performed from the DN found, if successful.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="searchBase" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Context name to search in, relative to the base DN in the LDAP URL. ex: ou=users
-                        With LDAP Group Add-on enabled, it is possible to enter multiple search base entries
-                        separated by the '|' sign. ex: ou=internalUsers,ou=hq|ou=externalUsers
-                        This parameter is optional.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="searchSubTree" type="xs:boolean" minOccurs="0" maxOccurs="1" default="true">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Enables deep search through the sub tree of the LDAP URL + search base. True by default.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="managerDn" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Used only with "search" authentication method.
-                        It is the full DN of the user that binds to the LDAP server to perform user searches.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="managerPassword" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Used only with "search" authentication method.
-                        It is the password of the user that binds to the LDAP server to perform the search.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="PropertySetsType">
-        <xs:sequence>
-            <xs:element name="propertySet" type="PropertySetType" minOccurs="0" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="PropertySetType">
-        <xs:sequence>
-            <xs:element name="name" type="xs:ID">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A unique name identifying the property set.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="visible" type="xs:boolean">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Whether this property set is visible in the properties management user interface, or is
-                        intended for internal use.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="properties" type="PropertiesType" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The list of properties grouped under this property set.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="PropertiesType">
-        <xs:sequence>
-            <xs:element name="property" type="PropertyType" minOccurs="0" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="PropertyType">
-        <xs:sequence>
-            <xs:element name="name" type="xs:string">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A unique name identifying the property.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="closedPredefinedValues" type="xs:boolean">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Whether the values of the property shall come from a predefined closed list of values.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="multipleChoice" type="xs:boolean">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Whether the property supports multiple values.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="predefinedValues" type="PredefinedValuesType" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A list of predefined values to select from for the property value(s).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="PredefinedValuesType">
-        <xs:sequence>
-            <xs:element name="predefinedValue" type="PredefinedValueType" minOccurs="0" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="PredefinedValueType">
-        <xs:sequence>
-            <xs:element name="value" type="xs:string">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The actual value.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="defaultValue" type="xs:boolean">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Whether or not this value is a default/pre-selected one (multiple choice properties support
-                        multiple default values).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="RepoLayoutType">
-        <xs:sequence>
-            <xs:element name="name" type="xs:ID">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A unique name identifying the layout.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="artifactPathPattern" type="xs:string">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[(HTML)
-                        <div class="legend-surrownding-text">
-                            The path pattern that matches the storage path of artifacts.<br/>
-                            The path pattern is composed of literals (including path separators) and any of the following tokens:<br/>
-                            <i>org, orgPath, baseRev, fileIntegRev, folderIntegRev, module, classifier, ext, type.</i>
-                        </div>
-                        <table class="legend">
-                            <thead>
-                                <tr>
-                                    <th>Token</th>
-                                    <th>Description</th>
-                                    <th>Example Value</th>
-                                </tr>
-                            </thead>
-                            <tbody>
-                                <tr>
-                                    <td class="token">[org]</td>
-                                    <td class="desc">
-                                        Identifies the artifact's organization.
-                                        Equivalent to Ivy's 'organization'.
-                                    </td>
-                                    <td class="example">
-                                        <span class="e-value">'org.apache.derby'</span>
-                                    </td>
-                                </tr>
-                                <tr>
-                                    <td class="token">[orgPath]</td>
-                                    <td class="desc">
-                                        Identifies the artifact's organization where dots ('.') are replaced by path separators ('/'). Equivalent to Maven's 'groupId'.
-                                    </td>
-                                    <td class="example">
-                                        <span class="e-value">'org/apache/derby'</span>
-                                    </td>
-                                </tr>
-                                <tr>
-                                    <td class="token">[module]</td>
-                                    <td class="desc">
-                                        Identifies the artifact's module.
-                                    </td>
-                                    <td class="example">
-                                        <span class="e-value">'hibernate'</span>
-                                    </td>
-                                </tr>
-                                <tr>
-                                    <td class="token">[baseRev]</td>
-                                    <td class="desc">
-                                       Identifies the base revision part of the artifact version, excluding any integration information
-                                    </td>
-                                    <td class="example">
-                                        <span class="e-value">'2.1.1'</span> which may be part of the full version '2.1.1-SNAPSHOT' or '2.1.1-build.1099'.
-                                    </td>
-                                </tr>
-                                <tr>
-                                    <td class="token">[folderItegRev]</td>
-                                    <td class="desc">
-                                        Identifies the integration revision part used in folder names in the artifact's path, excluding the base revision.
-                                    </td>
-                                    <td class="example">
-                                        <span class="e-value">'SNAPSHOT'</span> or <span class="e-value">'build.1099'</span> which may be part of the folder name '2.1.1-SNAPSHOT' or '2.1.1-build.1099', respectively.
-                                    </td>
-                                </tr>
-                                <tr>
-                                    <td class="token">[fileItegRev]</td>
-                                    <td class="desc">
-                                        Identifies the integration revision part in the artifact's file name, excluding the base revision.
-                                    </td>
-                                    <td class="example">
-                                        <span class="e-value">'20110113.145509-8'</span> or <span class="e-value">'build.1099'</span> which may be part of the file name '2.1.1-20110113.145509-8' or '2.1.1-build.1099', respectively.
-                                    </td>
-                                </tr>
-                                <tr>
-                                    <td class="token">[classifier]</td>
-                                    <td class="desc">
-                                        Identifies the artifact's classifier.
-                                    </td>
-                                    <td class="example">
-                                        <span class="e-value">'sources'</span>
-                                    </td>
-                                </tr>
-                                <tr>
-                                    <td class="token">[ext]</td>
-                                    <td class="desc">
-                                        Identifies the artifact's extension.
-                                    </td>
-                                    <td class="example">
-                                        <span class="e-value">'jar'</span>
-                                    </td>
-                                </tr>
-                                <tr>
-                                    <td class="token">[type]</td>
-                                    <td class="desc">
-                                        Identifies the artifact's type. Typically used when the artifact's extension cannot be reused as the artifact's type.
-                                    </td>
-                                    <td class="example">
-                                        <span class="e-value">'javadoc'</span> (that can have the 'jar' extension) or 'ivy' (that can have the 'xml' extension).
-                                    </td>
-                                </tr>
-                                <tr>
-                                    <td class="token">[customToken<regex>]</td>
-                                    <td class="desc">
-                                        A custom regex token. Can be used to create a new type of token when the provided defaults don't suffice.
-                                    </td>
-                                    <td class="example">
-                                        <span class="e-value">'[timestamp<\d{8}>]'</span> a new timestamp custom token that has 8 digits.
-                                    </td>
-                                </tr>
-                            </tbody>
-                        </table>
-                        <div class="legend-surrownding-text">
-                            For Artifactory to be able to construct meaningful module information the following tokens have to be used at the minimum:<br/>
-                            <i>org or orgPath, baseRev and module.</i>
-                        </div>
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="distinctiveDescriptorPathPattern" type="xs:boolean">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[(HTML)
-                        <p>
-                            Check this if the repository layout uses separate path patterns for artifacts and descriptors
-                            (such as Ivy descriptor files). Otherwise, the artifact path pattern will be used to match
-                            descriptors.
-                        </p>
-                        <p>
-                            The descriptor path pattern matches the storage path of module descriptors and uses the same
-                            format as of the artifact path pattern.
-                        </p>
-                        <table class="legend">
-                            <thead>
-                                <tr>
-                                    <th>Token</th>
-                                    <th>Description</th>
-                                    <th>Example Value</th>
-                                </tr>
-                            </thead>
-                            <tbody>
-                                <tr>
-                                    <td class="token">[org]</td>
-                                    <td class="desc">
-                                        Identifies the artifact's organization.
-                                        Equivalent to Ivy's 'organization'.
-                                    </td>
-                                    <td class="example">
-                                        <span class="e-value">'org.apache.derby'</span>
-                                    </td>
-                                </tr>
-                                <tr>
-                                    <td class="token">[orgPath]</td>
-                                    <td class="desc">
-                                        Identifies the artifact's organization where dots ('.') are replaced by path separators ('/'). Equivalent to Maven's 'groupId'.
-                                    </td>
-                                    <td class="example">
-                                        <span class="e-value">'org/apache/derby'</span>
-                                    </td>
-                                </tr>
-                                <tr>
-                                    <td class="token">[baseRev]</td>
-                                    <td class="desc">
-                                       Identifies the base revision part of the artifact version, excluding any integration information
-                                    </td>
-                                    <td class="example">
-                                        <span class="e-value">'2.1.1'</span> which may be part of the full version '2.1.1-SNAPSHOT' or '2.1.1-build.1099'.
-                                    </td>
-                                </tr>
-                                <tr>
-                                    <td class="token">[fileItegRev]</td>
-                                    <td class="desc">
-                                        Identifies the integration revision part in the artifact's file name, excluding the base revision.
-                                    </td>
-                                    <td class="example">
-                                        <span class="e-value">'20110113.145509-8'</span> or <span class="e-value">'build.1099'</span> which may be part of the file name '2.1.1-20110113.145509-8' or '2.1.1-build.1099', respectively.
-                                    </td>
-                                </tr>
-                                <tr>
-                                    <td class="token">[folderItegRev]</td>
-                                    <td class="desc">
-                                        Identifies the integration revision part used in folder names in the artifact's path, excluding the base revision.
-                                    </td>
-                                    <td class="example">
-                                        <span class="e-value">'SNAPSHOT'</span> or <span class="e-value">'build.1099'</span> which may be part of the folder name '2.1.1-SNAPSHOT' or '2.1.1-build.1099', respectively.
-                                    </td>
-                                </tr>
-                                <tr>
-                                    <td class="token">[module]</td>
-                                    <td class="desc">
-                                        Identifies the artifact's module.
-                                    </td>
-                                    <td class="example">
-                                        <span class="e-value">'hibernate'</span>
-                                    </td>
-                                </tr>
-                                <tr>
-                                    <td class="token">[classifier]</td>
-                                    <td class="desc">
-                                        Identifies the artifact's classifier.
-                                    </td>
-                                    <td class="example">
-                                        <span class="e-value">'sources'</span>
-                                    </td>
-                                </tr>
-                                <tr>
-                                    <td class="token">[ext]</td>
-                                    <td class="desc">
-                                        Identifies the artifact's extension.
-                                    </td>
-                                    <td class="example">
-                                        <span class="e-value">'jar'</span>
-                                    </td>
-                                </tr>
-                                <tr>
-                                    <td class="token">[type]</td>
-                                    <td class="desc">
-                                        Identifies the artifact's type. Typically used when the artifact's extension cannot be reused as the artifact's type.
-                                    </td>
-                                    <td class="example">
-                                        <span class="e-value">'javadoc'</span> (that can have the 'jar' extension) or 'ivy' (that can have the 'xml' extension).
-                                    </td>
-                                </tr>
-                                <tr>
-                                    <td class="token">[customToken<regex>]</td>
-                                    <td class="desc">
-                                        A custom regex token. Can be used to create a new type of token when the provided defaults don't suffice.
-                                    </td>
-                                    <td class="example">
-                                        <span class="e-value">'[timestamp<\d{8}>]'</span> a new timestamp custom token that has 8 digits.
-                                    </td>
-                                </tr>
-                            </tbody>
-                        </table>
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="descriptorPathPattern" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The path pattern matching the storage path of module descriptors.
-                        Uses the same format as the artifact path pattern.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="folderIntegrationRevisionRegExp" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A regular expression matching the integration revision string appearing in a folder name
-                        as part of the artifact's path. For example, 'SNAPSHOT', in Maven.
-                        Note! that you must ensure not to introduce any regexp capturing groups within this expression.
-                        If not applicable use '.*'.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="fileIntegrationRevisionRegExp" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A regular expression matching the integration revision string appearing in a file name
-                        as part of the artifact's path. For example, 'SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))',
-                        in Maven.
-                        Note! that you must ensure not to introduce any regexp capturing groups within this expression.
-                        If not applicable use '.*'.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="ReplicationBaseType">
-        <xs:sequence>
-            <xs:element name="enabled" type="xs:boolean">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Enable active replication of this repository.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="cronExp" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The Cron expression by which replication frequency is determined. For detailed information see: <a href="http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html" target="_blank">The CronTrigger Tutorial</a>
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="syncDeletes" type="xs:boolean">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Delete artifacts and folders that no longer exist in the source repository.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="syncProperties" type="xs:boolean">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Include metadata properties of files and folders as part of the replication.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="pathPrefix" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A subpath within the source repository to limit replication to.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="repoKey" type="xs:string" minOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The replicated repository key.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="RemoteReplicationType">
-        <xs:complexContent>
-            <xs:extension base="ReplicationBaseType">
-                <xs:sequence>
-                    <xs:element name="socketTimeoutMillis" type="xs:int" default="15000" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Network timeout in milliseconds to use for remote file listing query.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="LocalReplicationType">
-        <xs:complexContent>
-            <xs:extension base="ReplicationBaseType">
-                <xs:sequence>
-                    <xs:element name="url" type="xs:string" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The URL of the target local repository on a remote Artifactory server.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="proxyRef" type="xs:IDREF" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Network proxy reference.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="socketTimeoutMillis" type="xs:int" default="15000" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Network timeout in milliseconds to use both for connection
-                                establishment and for unanswered requests.
-                                Timing out on a network operation is considered as a retrieval
-                                failure.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="username" type="xs:string" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                HTTP authentication username.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="password" type="xs:string" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                HTTP authentication password.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="enableEventReplication" type="xs:boolean" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Replicate additions and modifications as they occur.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-    <xs:complexType name="GcConfigType">
-        <xs:annotation>
-            <xs:documentation source="description">
-                GC config.
-            </xs:documentation>
-        </xs:annotation>
-        <xs:sequence>
-            <xs:element name="cronExp" type="xs:string" default="* * 4 * * ?" minOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The Cron expression by which garbage collection frequency is determined. For detailed information see: <a href="http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html" target="_blank">The CronTrigger Tutorial </a>
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-    <xs:complexType name="CleanupConfigType">
-        <xs:annotation>
-            <xs:documentation source="description">
-                Cleanup config.
-            </xs:documentation>
-        </xs:annotation>
-        <xs:sequence>
-            <xs:element name="cronExp" type="xs:string" default="0 12 5 * * ?" minOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The Cron expression by which artifacts cleanup frequency is determined. For detailed information
-                        see: <a href="http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html" target="_blank">The CronTrigger Tutorial</a>
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-    <xs:complexType name="QuotaConfigType">
-        <xs:annotation>
-            <xs:documentation source="description">
-                Quota management configuration.
-            </xs:documentation>
-        </xs:annotation>
-        <xs:sequence>
-            <xs:element name="enabled" type="xs:boolean" default="false" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Enable control over the size of storage space used for binaries to avoid running out of disk
-                        space.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="diskSpaceLimitPercentage" type="xs:int" default="0" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The maximum disk usage allowed by percentage, of the partition containing the binaries folder.
-                        Once this limit has been reached, deployments are rejected with a 413 error (request entity
-                        too large) and an error message is displayed in the UI (visible to admin users only).
-                        With a filesystem storage the partition checked is the one containing the
-                        '$ARTIFACTORY_HOME/data/filestore' directory.
-                        With a database BLOB storage the partition checked is the one containing the
-                        '$ARTIFACTORY_HOME/data/cache' directory.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="diskSpaceWarningPercentage" type="xs:int" default="0" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The maximum warning-level of disk usage, by percentage, of the partition containing the binaries
-                        folder.
-                        Once this limit is reached a warning is logged and a warning message is displayed in the UI
-                        (visible to admin users only).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="ExternalProvidersType">
-        <xs:sequence>
-            <xs:element name="blackduck" type="BlackDuckSettingsType" minOccurs="0"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="BlackDuckSettingsType">
-        <xs:sequence>
-            <xs:element name="enableIntegration" type="xs:boolean" minOccurs="0" default="false">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Enable Black Duck Code Center integration with Artifactory.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:sequence>
-                <xs:element name="serverUri" type="xs:string">
-                    <xs:annotation>
-                        <xs:documentation source="description">
-                            Black Duck Code Center server URI.
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:element>
-                <xs:element name="username" type="xs:string">
-                    <xs:annotation>
-                        <xs:documentation source="description">
-                            Black Duck Code Center authentication username.
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:element>
-                <xs:element name="password" type="xs:string">
-                    <xs:annotation>
-                        <xs:documentation source="description">
-                            Black Duck Code Center authentication password.
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:element>
-                <xs:element name="connectionTimeoutMillis" type="xs:long" default="20000" minOccurs="0">
-                    <xs:annotation>
-                        <xs:documentation source="description">
-                            Network timeout in milliseconds to use both for connection
-                            establishment and for unanswered requests.
-                            Timing-out on a network operation is considered as a retrieval
-                            failure. Defaults to 20000 milliseconds.
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:element>
-                <xs:element name="proxyRef" type="xs:IDREF" minOccurs="0">
-                    <xs:annotation>
-                        <xs:documentation source="description">
-                            Proxy configuration to use for accessing Black Duck Code Center.
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:element>
-            </xs:sequence>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="SystemMessageType">
-        <xs:annotation>
-            <xs:documentation source="description">
-                Configuration for the system message that can be displayed in the Artifactory UI.
-            </xs:documentation>
-        </xs:annotation>
-        <xs:sequence>
-            <xs:element name="enabled" type="xs:boolean" default="false" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Determines whether the system message is displayed.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="title" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Title for the system message.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="titleColor" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Color for the system message's title, in rgb format (i.e. #00ec00)
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="message" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The message that will be displayed
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="showOnAllPages" type="xs:boolean" default="false" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Determines whether the system message is displayed in all pages or just the home page.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="FolderDownloadConfigType">
-        <xs:annotation>
-            <xs:documentation source="description">
-                Configuration for the ability to download folders from the UI.
-            </xs:documentation>
-        </xs:annotation>
-        <xs:sequence>
-            <xs:element name="enabled" type="xs:boolean" default="false" minOccurs="1" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Determines whether downloading folders is allowed.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="maxDownloadSizeMb" type="xs:int" minOccurs="1" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Max allowed size of all uncompressed files under a tree to download in a single request, in MB.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="maxFiles" type="xs:long" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Max allowed number of files to download in a single request.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="maxConcurrentRequests" type="xs:int" minOccurs="1" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Maximum number of folder download requests that will be treated concurrently before being
-                        queued.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="TrashcanConfigType">
-        <xs:annotation>
-            <xs:documentation source="description">
-                Configuration for the global trashcan repository.
-            </xs:documentation>
-        </xs:annotation>
-        <xs:sequence>
-            <xs:element name="enabled" type="xs:boolean" default="true" minOccurs="1" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Determines whether trashcan is enabled.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="allowPermDeletes" type="xs:boolean" default="false" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Allow users with delete permission to optionally skip the trash upon deletion.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="retentionPeriodDays" type="xs:int" default="30" minOccurs="1" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The maximum number of days to keep deleted artifacts in the trashcan.
-                        The default is 30 days.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="BintrayApplicationsType">
-        <xs:sequence>
-            <xs:element name="bintrayApplication" type="BintrayApplicationType" minOccurs="0" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="BintrayApplicationType">
-        <xs:sequence>
-            <xs:element name="key" type="xs:ID">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Unique ID for this Bintray application
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="clientId" type="xs:string">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Client ID that was assigned to this application.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="secret" type="xs:string">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Client secret that was assigned to this application.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="org" type="xs:string">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Bintray organization associated with this application.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="scope" type="xs:string">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Bintray authorization scope for this application.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="refreshToken" type="xs:string">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        OAuth refresh token generated by Bintray for this application.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="DistributionRulesType">
-        <xs:sequence>
-            <xs:element name="rule" type="DistributionRuleType" minOccurs="0" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="DistributionRuleType">
-        <xs:sequence>
-            <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A unique name identifying the rule.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="type" type="xs:string" minOccurs="1" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Type of this rule (one of the package types)
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="repoFilter" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Optional regex filter that will be applied to an artifact's repo key to specify if it's valid
-                        for this rule - if capturing groups are used they can be used as tokens (according to the
-                        group's number) in the resolution rule
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="pathFilter" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Optional regex filter that will be applied to an artifact's path to specify if it's valid
-                        for this rule - if capturing groups are used they can be used as tokens (according to the
-                        group's number) in the resolution rule
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="distributionCoordinates" type="DistributionCoordinatesType" minOccurs="1" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The Bintray coordinates (repo, package, version, and artifact path) that this rule will map
-                        to when applied to an artifact.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="DistributionCoordinatesType">
-        <xs:sequence>
-            <xs:element name="repo" type="xs:string" minOccurs="1" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The repository the artifact will be distributed to.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="pkg" type="xs:string" minOccurs="1" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The package the artifact will be distributed to.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="version" type="xs:string" minOccurs="1" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The version the artifact will be distributed to.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="path" type="xs:string" minOccurs="1" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The path the artifact will reside in under the above coordinates.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="VcsType">
-        <xs:sequence>
-            <xs:element name="type">
-                <xs:simpleType>
-                    <xs:restriction base="xs:string">
-                        <xs:enumeration value="git"/>
-                    </xs:restriction>
-                </xs:simpleType>
-            </xs:element>
-            <xs:element name="git" type="VcsGitType"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="VcsGitType">
-        <xs:sequence>
-            <xs:element name="provider" minOccurs="1" maxOccurs="1">
-                <xs:simpleType>
-                    <xs:restriction base="xs:string">
-                        <xs:enumeration value="github"/>
-                        <xs:enumeration value="bitbucket"/>
-                        <xs:enumeration value="stash"/>
-                        <xs:enumeration value="artifactory"/>
-                        <xs:enumeration value="custom"/>
-                    </xs:restriction>
-                </xs:simpleType>
-            </xs:element>
-            <xs:element name="downloadUrl" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[(HTML)
-                        <div class="legend-surrownding-text">
-                            The download pattern which matches the remote repository tarballs URLs.<br/>
-                            The download pattern is composed of literals (including path separators) and placeholders for the following tokens:<br/>
-                            <i>userOrg, repo, refName, fileExtension.</i><br/>
-                        </div>
-                        <table class="legend">
-                            <thead>
-                                <tr>
-                                    <th>Token</th>
-                                    <th>Description</th>
-                                </tr>
-                            </thead>
-                            <tbody>
-                                <tr>
-                                    <td class="token">{0}</td>
-                                    <td class="desc">
-                                        Identifies the username or organization name.
-                                    </td>
-                                </tr>
-                                <tr>
-                                    <td class="token">{1}</td>
-                                    <td class="desc">
-                                        Identifies the repository name.
-                                    </td>
-                                </tr>
-                                <tr>
-                                    <td class="token">{2}</td>
-                                    <td class="desc">
-                                        Identifies the branch or tag name.
-                                    </td>
-                                </tr>
-                                <tr>
-                                    <td class="token">{3}</td>
-                                    <td class="desc">
-                                        Identifies the file extension to download.
-                                    </td>
-                                </tr>
-                            </tbody>
-                        </table>
-                        <div class="legend-surrownding-text">
-                            For example, GitHub uses the following pattern to download tarballs: https://github.com/{userOrg}/{repo}/archive/{refName}.{fileExt}<br/>
-                            So to be able to download from any repository in GitHub, the composed download pattern should be {0}/{1}/archive/{2}.{3}.<br/>
-                        </div>
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="replicationsConfigType">
-        <xs:annotation>
-            <xs:documentation source="description">
-                Global replication configuration.
-            </xs:documentation>
-        </xs:annotation>
-        <xs:sequence>
-            <xs:element name="blockPushReplications" type="xs:boolean" default="false" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Globally disable the push replication.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="blockPullReplications" type="xs:boolean" default="false" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Globally disable the pull replication.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-</xs:schema>
diff --git a/base/config/src/main/resources/features/smartrepo-features.xml b/base/config/src/main/resources/features/smartrepo-features.xml
deleted file mode 100644
index 24252b3..0000000
--- a/base/config/src/main/resources/features/smartrepo-features.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<versionFeatures>
-    <features>
-        <feature>
-            <name>SYNC_PROPERTIES</name>
-            <availableFrom>
-                <version>4.1</version>
-            </availableFrom>
-        </feature>
-        <feature>
-            <name>LIST_CONTENT</name>
-            <availableFrom>
-                <version>4.1</version>
-            </availableFrom>
-        </feature>
-        <feature>
-            <name>SYNC_STATISTICS</name>
-            <availableFrom>
-                <version>4.2</version>
-            </availableFrom>
-        </feature>
-        <feature>
-            <name>DETECT_ORIGIN_ABSENCE</name>
-            <availableFrom>
-                <version>4.3.3</version>
-            </availableFrom>
-        </feature>
-    </features>
-</versionFeatures>
\ No newline at end of file
diff --git a/base/config/src/test/java/org/artifactory/DefaultConfigLayoutTest.java b/base/config/src/test/java/org/artifactory/DefaultConfigLayoutTest.java
deleted file mode 100644
index 3cdc9f4..0000000
--- a/base/config/src/test/java/org/artifactory/DefaultConfigLayoutTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory;
-
-import org.artifactory.util.ResourceUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * Makes sure that the repo layouts configuration block (in the config) was not auto-formatted
- *
- * @author Noam Y. Tenne
- */
- at Test
-public class DefaultConfigLayoutTest {
-
-    public void testDefaultConfigXmlNotAutoFormatted() {
-        testLayoutsNotAutoFormatted("/META-INF/default/artifactory.config.xml");
-    }
-
-    public void testConfigV147NotAutoFormatted() {
-        testLayoutsNotAutoFormatted("/config/install/config.1.4.7.xml");
-    }
-
-    public void testConfigV148NotAutoFormatted() {
-        testLayoutsNotAutoFormatted("/config/test/config.1.4.8_old_replication.xml");
-    }
-
-    public void testConfigV149NotAutoFormatted() {
-        testLayoutsNotAutoFormatted("/config/test/config.1.4.9.no.gc.xml");
-    }
-
-    private void testLayoutsNotAutoFormatted(String resourcePath) {
-        String configString = ResourceUtils.getResourceAsString(resourcePath);
-        Assert.assertTrue(configString.contains("<artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/" +
-                "[type]s/[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]</artifactPathPattern>"),
-                "It looks like the repo layouts have been auto formatted.");
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/common/ArtifactoryPropertiesTest.java b/base/config/src/test/java/org/artifactory/common/ArtifactoryPropertiesTest.java
deleted file mode 100644
index 7ac6265..0000000
--- a/base/config/src/test/java/org/artifactory/common/ArtifactoryPropertiesTest.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.common;
-
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.artifactory.util.ResourceUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.net.URISyntaxException;
-
-import static java.lang.Integer.parseInt;
-import static org.testng.Assert.assertEquals;
-
-/**
- * @author freds
- * @date Oct 12, 2008
- */
-public class ArtifactoryPropertiesTest extends ArtifactoryHomeBoundTest {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryPropertiesTest.class);
-
-    @AfterMethod
-    public void clearArtifactoryProperties() {
-        // clear any property that might have been set in a test
-        for (ConstantValues constantsValue : ConstantValues.values()) {
-            System.clearProperty(constantsValue.getPropertyName());
-        }
-    }
-
-    @Test
-    public void printArtifactorySystemFile() {
-        ConstantValues[] constantsValues = ConstantValues.values();
-        StringBuilder builder = new StringBuilder("Default Properties:\n");
-        for (ConstantValues value : constantsValues) {
-            builder.append("#").append(value.getPropertyName()).append("=").append(value.getDefValue()).append("\n");
-        }
-        log.info(builder.toString());
-    }
-
-    @Test
-    public void testLoadProps() throws URISyntaxException {
-        File file = ResourceUtils.getResourceAsFile("/config/system/artifactory.system.1.properties");
-        ArtifactoryHome.get().getArtifactoryProperties().loadArtifactorySystemProperties(file, null);
-        assertEquals(ConstantValues.logsViewRefreshRateSecs.getInt(), 1000);
-        assertEquals(ConstantValues.locksTimeoutSecs.getInt(),
-                parseInt(ConstantValues.locksTimeoutSecs.getDefValue()));
-        assertEquals(ConstantValues.securityAuthenticationCacheIdleTimeSecs.getInt(), 50);
-        assertEquals(ConstantValues.searchMaxResults.getInt(),
-                parseInt(ConstantValues.searchMaxResults.getDefValue()));
-    }
-
-    @Test
-    public void testSystemProps() throws URISyntaxException {
-        File file = ResourceUtils.getResourceAsFile("/config/system/artifactory.system.1.properties");
-        System.setProperty(ConstantValues.securityAuthenticationCacheIdleTimeSecs.getPropertyName(), "800");
-
-        ArtifactoryHome.get().getArtifactoryProperties().loadArtifactorySystemProperties(file, null);
-        assertEquals(ConstantValues.logsViewRefreshRateSecs.getInt(), 1000);
-        assertEquals(ConstantValues.locksTimeoutSecs.getInt(), 120);
-        assertEquals(ConstantValues.securityAuthenticationCacheIdleTimeSecs.getInt(), 800);
-        assertEquals(ConstantValues.searchMaxResults.getInt(),
-                parseInt(ConstantValues.searchMaxResults.getDefValue()));
-    }
-
-    @Test
-    public void defaultArtifactoryVersion() throws URISyntaxException {
-        ArtifactoryHome.get().getArtifactoryProperties().loadArtifactorySystemProperties(null, null);
-        Assert.assertNull(ConstantValues.artifactoryVersion.getString(), "Expected null but was " +
-                ConstantValues.artifactoryVersion.getString());
-        Assert.assertNull(ConstantValues.artifactoryRevision.getString(), "Expected null but was " +
-                ConstantValues.artifactoryRevision.getString());
-    }
-
-    @Test
-    public void artifactoryVersion() throws URISyntaxException {
-        File file = ResourceUtils.getResourceAsFile("/config/system/artifactory.properties");
-        ArtifactoryHome.get().getArtifactoryProperties().loadArtifactorySystemProperties(null, file);
-        assertEquals(ConstantValues.artifactoryVersion.getString(), "10.3");
-        assertEquals(ConstantValues.artifactoryRevision.getInt(), 12345);
-    }
-
-    @Test
-    public void systemPropsOverrideArtifactoryProperties() throws URISyntaxException {
-        System.setProperty(ConstantValues.artifactoryVersion.getPropertyName(), "3.0");
-        System.setProperty(ConstantValues.artifactoryRevision.getPropertyName(), "5555");
-
-        File file = ResourceUtils.getResourceAsFile("/config/system/artifactory.properties");
-        ArtifactoryHome.get().getArtifactoryProperties().loadArtifactorySystemProperties(null, file);
-        assertEquals(ConstantValues.artifactoryVersion.getString(), "3.0");
-        assertEquals(ConstantValues.artifactoryRevision.getInt(), 5555);
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/convert/XmlConverterTest.java b/base/config/src/test/java/org/artifactory/convert/XmlConverterTest.java
deleted file mode 100644
index dece353..0000000
--- a/base/config/src/test/java/org/artifactory/convert/XmlConverterTest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.convert;
-
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.artifactory.util.ResourceUtils;
-import org.artifactory.util.XmlUtils;
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.InputStream;
-
-/**
- * Base class for the xml converters (version, security, metadata, etc.)
- *
- * @author Yossi Shaul
- */
-public abstract class XmlConverterTest extends ArtifactoryHomeBoundTest {
-    private static final Logger log = LoggerFactory.getLogger(XmlConverterTest.class);
-
-    protected Document convertXml(String resourcePath, XmlConverter converter) throws Exception {
-        InputStream is = ResourceUtils.getResource(resourcePath);
-        Document doc = XmlUtils.parse(is);
-        converter.convert(doc);
-        return doc;
-    }
-
-    protected void debugContent(Document doc) {
-        log.debug(XmlUtils.outputString(doc));
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/descriptor/backup/BackupDescriptorTest.java b/base/config/src/test/java/org/artifactory/descriptor/backup/BackupDescriptorTest.java
deleted file mode 100644
index ddf6816..0000000
--- a/base/config/src/test/java/org/artifactory/descriptor/backup/BackupDescriptorTest.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.backup;
-
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RealRepoDescriptor;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-
-/**
- * Tests the BackupDescriptor.
- *
- * @author Yossi Shaul
- */
- at Test
-public class BackupDescriptorTest {
-
-    public void defaultConstructor() {
-        BackupDescriptor backup = new BackupDescriptor();
-        Assert.assertNull(backup.getKey(), "Key should be null by default");
-        Assert.assertTrue(backup.isEnabled(), "Backup should be enabled by default");
-        Assert.assertNull(backup.getCronExp(), "Cron expression should be null by default");
-        Assert.assertNull(backup.getDir(), "Dir should be null by default");
-        Assert.assertTrue(backup.getExcludedRepositories().isEmpty(),
-                "Excluded repositories should be empty by default");
-        Assert.assertEquals(backup.getRetentionPeriodHours(),
-                BackupDescriptor.DEFAULT_RETENTION_PERIOD_HOURS,
-                "Retention period should be {} by default");
-        Assert.assertFalse(backup.isCreateArchive(), "Is create archive should be false by default");
-        //Assert.assertFalse(backup.isIncrementalBackup(), "Is incremental backup should be false by default");
-    }
-
-    public void testSameTaskDefinition() {
-        BackupDescriptor backup1 = new BackupDescriptor();
-        String backupKey = "test";
-        backup1.setKey(backupKey);
-        backup1.setEnabled(true);
-        backup1.setCronExp("* * * invalid");
-        backup1.setCreateArchive(false);
-        backup1.setRetentionPeriodHours(100);
-        backup1.setSendMailOnError(false);
-        backup1.setExcludedRepositories(new ArrayList<RealRepoDescriptor>(1) {{
-            add(new LocalRepoDescriptor());
-        }});
-        BackupDescriptor backup2 = new BackupDescriptor();
-        backup2.setKey(backupKey);
-        backup2.setEnabled(true);
-        backup2.setCronExp("* * * invalid");
-        backup2.setCreateArchive(false);
-        backup2.setRetentionPeriodHours(100);
-        backup2.setSendMailOnError(false);
-        backup2.setExcludedRepositories(new ArrayList<RealRepoDescriptor>(1) {{
-            add(new LocalRepoDescriptor());
-        }});
-
-        Assert.assertTrue(backup1.sameTaskDefinition(backup2), "Backups should have same task definition");
-        backup2.setCreateArchive(false);
-        Assert.assertTrue(backup1.sameTaskDefinition(backup2), "Backups should have same task definition");
-        backup2.setRetentionPeriodHours(200);
-        Assert.assertTrue(backup1.sameTaskDefinition(backup2), "Backups should have same task definition");
-        backup2.setSendMailOnError(true);
-        Assert.assertTrue(backup1.sameTaskDefinition(backup2), "Backups should have same task definition");
-        backup2.setExcludedRepositories(null);
-        Assert.assertTrue(backup1.sameTaskDefinition(backup2), "Backups should have same task definition");
-        backup2.setEnabled(false);
-        Assert.assertFalse(backup1.sameTaskDefinition(backup2), "Backups should NOT have same task definition");
-        backup2.setEnabled(true);
-        backup2.setKey("wrong");
-        Assert.assertFalse(backup1.sameTaskDefinition(backup2), "Backups should NOT have same task definition");
-        backup2.setKey(backupKey);
-        backup2.setCronExp("* * * another invalid");
-        Assert.assertFalse(backup1.sameTaskDefinition(backup2), "Backups should NOT have same task definition");
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/descriptor/config/CentralConfigDescriptorImplTest.java b/base/config/src/test/java/org/artifactory/descriptor/config/CentralConfigDescriptorImplTest.java
deleted file mode 100644
index 0ea9f4f..0000000
--- a/base/config/src/test/java/org/artifactory/descriptor/config/CentralConfigDescriptorImplTest.java
+++ /dev/null
@@ -1,423 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.config;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-import org.artifactory.descriptor.backup.BackupDescriptor;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.replication.RemoteReplicationDescriptor;
-import org.artifactory.descriptor.repo.*;
-import org.artifactory.descriptor.security.SecurityDescriptor;
-import org.artifactory.util.AlreadyExistsException;
-import org.artifactory.util.InvalidNameException;
-import org.artifactory.util.RepoLayoutUtils;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import java.util.List;
-import java.util.Map;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the MutableCentralConfigDescriptorImpl class.
- *
- * @author Yossi Shaul
- */
- at Test
-public class CentralConfigDescriptorImplTest {
-    private CentralConfigDescriptorImpl cc;
-
-    @BeforeMethod
-    public void initCentralConfig() {
-        cc = new CentralConfigDescriptorImpl();
-
-        LocalRepoDescriptor local1 = new LocalRepoDescriptor();
-        local1.setKey("local1");
-        cc.addLocalRepository(local1);
-        LocalRepoDescriptor local2 = new LocalRepoDescriptor();
-        local2.setKey("local2");
-        cc.addLocalRepository(local2);
-
-        RemoteRepoDescriptor remote1 = new HttpRepoDescriptor();
-        remote1.setKey("remote1");
-        cc.addRemoteRepository(remote1);
-
-        VirtualRepoDescriptor virtual1 = new VirtualRepoDescriptor();
-        virtual1.setKey("virtual1");
-        cc.addVirtualRepository(virtual1);
-
-
-        ProxyDescriptor proxy1 = new ProxyDescriptor();
-        proxy1.setKey("proxy1");
-        cc.addProxy(proxy1, false);
-
-        ProxyDescriptor proxy2 = new ProxyDescriptor();
-        proxy2.setKey("proxy2");
-        cc.addProxy(proxy2, false);
-
-        BackupDescriptor backup1 = new BackupDescriptor();
-        backup1.setKey("backup1");
-        cc.addBackup(backup1);
-
-        BackupDescriptor backup2 = new BackupDescriptor();
-        backup2.setKey("backup2");
-        cc.addBackup(backup2);
-
-        BackupDescriptor backup3 = new BackupDescriptor();
-        backup3.setKey("backup3");
-        backup3.setExcludeNewRepositories(true);
-        cc.addBackup(backup3);
-
-        PropertySet set1 = new PropertySet();
-        set1.setName("set1");
-        cc.addPropertySet(set1);
-
-        PropertySet set2 = new PropertySet();
-        set2.setName("set2");
-        cc.addPropertySet(set2);
-
-        RepoLayout repoLayout1 = new RepoLayout();
-        repoLayout1.setName("layout1");
-        cc.addRepoLayout(repoLayout1);
-
-        RepoLayout repoLayout2 = new RepoLayout();
-        repoLayout2.setName("layout2");
-        cc.addRepoLayout(repoLayout2);
-
-        RemoteReplicationDescriptor remoteReplication1 = new RemoteReplicationDescriptor();
-        remoteReplication1.setCronExp("0 0/5 * * * ?");
-        remoteReplication1.setRepoKey("remote1");
-        cc.addRemoteReplication(remoteReplication1);
-
-        RemoteReplicationDescriptor remoteReplication2 = new RemoteReplicationDescriptor();
-        remoteReplication2.setCronExp("0 0/6 * * * ?");
-        remoteReplication2.setRepoKey("remote2");
-        cc.addRemoteReplication(remoteReplication2);
-
-        LocalReplicationDescriptor localReplication1 = new LocalReplicationDescriptor();
-        localReplication1.setCronExp("0 0/7 * * * ?");
-        localReplication1.setRepoKey("local1");
-        localReplication1.setUrl("http://momo.com");
-        localReplication1.setUsername("user1");
-        localReplication1.setPassword("password1");
-        localReplication1.setEnableEventReplication(true);
-        cc.addLocalReplication(localReplication1);
-
-        LocalReplicationDescriptor localReplication2 = new LocalReplicationDescriptor();
-        localReplication2.setCronExp("0 0/8 * * * ?");
-        localReplication2.setRepoKey("local2");
-        localReplication2.setUrl("http://popo.com");
-        localReplication2.setUsername("user2");
-        localReplication2.setPassword("password2");
-        localReplication1.setEnableEventReplication(true);
-        cc.addLocalReplication(localReplication2);
-    }
-
-    public void defaultsTest() {
-        CentralConfigDescriptorImpl cc = new CentralConfigDescriptorImpl();
-        assertNotNull(cc.getLocalRepositoriesMap(), "Local repos map should not be null");
-        assertNotNull(cc.getRemoteRepositoriesMap(), "Remote repos map should not be null");
-        assertNotNull(cc.getVirtualRepositoriesMap(), "Virtual repos map should not be null");
-        assertNotNull(cc.getBackups(), "Backups list should not be null");
-        assertNotNull(cc.getProxies(), "Proxies list should not be null");
-        assertNotNull(cc.getPropertySets(), "Property sets list should not be null");
-        assertNull(cc.getIndexer(), "Indexer should not be null");
-        assertNotNull(cc.getSecurity(), "Security should not be null");
-        assertNull(cc.getServerName(), "Server name should not be null");
-        assertNotNull(cc.getDateFormat(), "Date format should not be null");
-        assertTrue(cc.getFileUploadMaxSizeMb() > 50,
-                "Default max file upload size should be bigger than 50mb");
-        assertFalse(cc.isOfflineMode(), "Offline mode should be false by default");
-        assertNotNull(cc.getRepoLayouts(), "Repo layouts list should not be null");
-        assertNotNull(cc.getRemoteReplications(), "Remote replication list should not be null");
-        assertNotNull(cc.getLocalReplications(), "Local replication list should not be null");
-    }
-
-    public void uniqueKeyExistence() {
-        assertFalse(cc.isKeyAvailable("local1"));
-        assertFalse(cc.isRepositoryExists("backup2"));
-        assertFalse(cc.isRepositoryExists("proxy2"));
-
-        assertTrue(cc.isKeyAvailable("proxy22"));
-        cc.setSecurity(new SecurityDescriptor());
-        assertTrue(cc.isKeyAvailable("ldap1"));
-
-        assertFalse(cc.isKeyAvailable("repo"));
-
-        assertTrue(cc.isPropertySetExists("set2"));
-
-        assertFalse(cc.isKeyAvailable("layout1"));
-        assertTrue(cc.isRepoLayoutExists("layout2"));
-    }
-
-    public void repositoriesExistence() {
-        assertEquals(cc.getLocalRepositoriesMap().size(), 2, "Local repos count mismatch");
-        assertEquals(cc.getRemoteRepositoriesMap().size(), 1, "Remote repos count mismatch");
-        assertEquals(cc.getVirtualRepositoriesMap().size(), 1,
-                "Virtual repos count mismatch");
-        assertTrue(cc.isRepositoryExists("local1"));
-        assertTrue(cc.isRepositoryExists("local2"));
-        assertTrue(cc.isRepositoryExists("remote1"));
-        assertTrue(cc.isRepositoryExists("virtual1"));
-    }
-
-    @Test
-    public void dockerLocalLowerCase() {
-        LocalRepoDescriptor dockerLocalLower = new LocalRepoDescriptor();
-        dockerLocalLower.setKey("docker-local");
-        dockerLocalLower.setType(RepoType.Docker);
-        cc.addLocalRepository(dockerLocalLower);
-        assertTrue(cc.isRepositoryExists("docker-local"));
-
-    }
-
-    @Test(expectedExceptions = InvalidNameException.class)
-    public void dockerLocalWithUpperCase() {
-        LocalRepoDescriptor dockerLocalWithUpper = new LocalRepoDescriptor();
-        dockerLocalWithUpper.setKey("Docker-Local");
-        dockerLocalWithUpper.setType(RepoType.Docker);
-        cc.addLocalRepository(dockerLocalWithUpper);
-    }
-
-    @Test(expectedExceptions = InvalidNameException.class)
-    public void dockerRemoteWithUpperCase() {
-        RemoteRepoDescriptor dockerRemoteWithUpper = new HttpRepoDescriptor();
-        dockerRemoteWithUpper.setKey("Docker-Remote");
-        dockerRemoteWithUpper.setType(RepoType.Docker);
-        cc.addRemoteRepository(dockerRemoteWithUpper);
-    }
-
-    public void proxyExistence() {
-        assertEquals(cc.getProxies().size(), 2, "Proxies count mismatch");
-        assertTrue(cc.isProxyExists("proxy1"));
-        assertTrue(cc.isProxyExists("proxy2"));
-    }
-
-    public void removeProxy() {
-        assertTrue(cc.isProxyExists("proxy2"));
-        ProxyDescriptor removedProxy = cc.removeProxy("proxy2");
-        assertEquals(removedProxy.getKey(), "proxy2");
-        assertEquals(cc.getProxies().size(), 1, "Only one proxy expected");
-        assertFalse(cc.isProxyExists("proxy2"));
-    }
-
-    public void removeReferencedProxy() {
-        ProxyDescriptor proxy = new ProxyDescriptor();
-        proxy.setKey("referencedProxy");
-        cc.addProxy(proxy, false);
-
-        HttpRepoDescriptor remoteRepo =
-                (HttpRepoDescriptor) cc.getRemoteRepositoriesMap().get("remote1");
-        remoteRepo.setProxy(proxy);
-
-        assertNotNull(remoteRepo.getProxy(), "Just checking ...");
-
-        LocalReplicationDescriptor localReplication = cc.getLocalReplication("local1");
-        localReplication.setProxy(proxy);
-
-        cc.removeProxy("referencedProxy");
-
-        assertNull(remoteRepo.getProxy(), "Proxy should have been removed from the remote repo");
-        assertNull(localReplication.getProxy(), "Proxy should have been removed from the local replication.");
-    }
-
-    public void defaultProxyChanged() {
-        ProxyDescriptor proxy = new ProxyDescriptor();
-        proxy.setKey("defaultProxy");
-        proxy.setDefaultProxy(true);
-        cc.addProxy(proxy, false);
-        addDefaultProxyToRemoteRepositories(proxy);
-        LocalReplicationDescriptor localReplication = cc.getLocalReplication("local1");
-        localReplication.setProxy(proxy);
-
-        ProxyDescriptor newDefaultProxy = new ProxyDescriptor();
-        newDefaultProxy.setKey("newDefaultProxy");
-        cc.addProxy(newDefaultProxy, false);
-        newDefaultProxy.setDefaultProxy(true);
-        cc.proxyChanged(newDefaultProxy, true);
-        HttpRepoDescriptor remoteRepo = (HttpRepoDescriptor) cc.getRemoteRepositoriesMap().get("remote1");
-
-        assertNotNull(remoteRepo.getProxy(), "Remote repo should have a proxy");
-        assertEquals(remoteRepo.getProxy().getKey(), "newDefaultProxy", "Proxy name does not match");
-
-        assertNotNull(localReplication.getProxy(), "Local replication should have a proxy");
-        assertEquals(localReplication.getProxy().getKey(), "newDefaultProxy", "Proxy name does not match");
-
-        assertFalse(proxy.isDefaultProxy(), "Original proxy should now be false");
-
-        proxy.setDefaultProxy(true);
-        cc.proxyChanged(proxy, false);
-
-        assertNotNull(remoteRepo.getProxy(), "Remote repo should have a proxy");
-        assertEquals(remoteRepo.getProxy().getKey(), "newDefaultProxy", "Proxy name does not match");
-
-        assertNotNull(localReplication.getProxy(), "Remote repo should have a proxy");
-        assertEquals(localReplication.getProxy().getKey(), "newDefaultProxy", "Proxy name does not match");
-    }
-
-    public void backupExistence() {
-        assertEquals(cc.getBackups().size(), 3, "Backups count mismatch");
-        assertTrue(cc.isBackupExists("backup1"));
-        assertTrue(cc.isBackupExists("backup2"));
-        assertTrue(cc.isBackupExists("backup3"));
-
-    }
-
-    public void removeBackup() {
-        assertTrue(cc.isBackupExists("backup2"));
-        BackupDescriptor removedBackup = cc.removeBackup("backup2");
-        assertEquals(removedBackup.getKey(), "backup2");
-        assertEquals(cc.getBackups().size(), 2, "Only 2 backups expected");
-        assertFalse(cc.isBackupExists("backup2"));
-    }
-
-    public void excludeNewRepoFromBackup() {
-        LocalRepoDescriptor newLocal = new LocalRepoDescriptor();
-        newLocal.setKey("newLocal");
-        cc.addLocalRepository(newLocal);
-        cc.conditionallyAddToBackups(newLocal);
-        RemoteRepoDescriptor newRemote = new HttpRepoDescriptor();
-        newRemote.setKey("newRemote");
-        cc.addRemoteRepository(newRemote);
-
-        assertTrue(cc.isBackupExists("backup1"));
-        BackupDescriptor backup1 = Iterables.tryFind(cc.getBackups(), new Predicate<BackupDescriptor>() {
-            @Override
-            public boolean apply(BackupDescriptor input) {
-                return "backup1".equals(input.getKey());
-            }
-        }).orNull();
-        assertNotNull(backup1, "Should find backup1");
-        assertEquals(backup1.getExcludedRepositories().size(), 0);
-
-        assertTrue(cc.isBackupExists("backup3"));
-        BackupDescriptor backup3 = Iterables.tryFind(cc.getBackups(), new Predicate<BackupDescriptor>() {
-            @Override
-            public boolean apply(BackupDescriptor input) {
-                return "backup3".equals(input.getKey());
-            }
-        }).orNull();
-        assertNotNull(backup3, "Should find backup3");
-
-        List<RealRepoDescriptor> excludedRepositories = backup3.getExcludedRepositories();
-        assertEquals(excludedRepositories.size(), 2);
-        assertTrue(excludedRepositories.contains(newLocal));
-        assertTrue(excludedRepositories.contains(newRemote));
-    }
-
-    public void propertySetExistence() {
-        assertEquals(cc.getPropertySets().size(), 2, "The config should contain 2 property sets");
-        assertTrue(cc.isPropertySetExists("set1"), "The config should contain the property set: 'set1'");
-        assertTrue(cc.isPropertySetExists("set2"), "The config should contain the property set: 'set2'");
-    }
-
-    public void removePropertySet() {
-        PropertySet setToRemove = new PropertySet();
-        String setName = "toRemove";
-        setToRemove.setName(setName);
-        cc.addPropertySet(setToRemove);
-
-        LocalRepoDescriptor localDescriptor = cc.getLocalRepositoriesMap().get("local1");
-        localDescriptor.addPropertySet(setToRemove);
-
-        RemoteRepoDescriptor remoteDescriptor = cc.getRemoteRepositoriesMap().get("remote1");
-        remoteDescriptor.addPropertySet(setToRemove);
-
-        //Sanity check
-        assertNotNull(localDescriptor.getPropertySet(setName), "The descriptor should contain the added " +
-                "property set.");
-
-        assertNotNull(cc.removePropertySet(setName), "The property set should have been removed from the central " +
-                "config descriptor.");
-
-        assertNull(localDescriptor.getPropertySet(setName), "The property set should have been removed from the " +
-                "local repo descriptor.");
-
-        assertNull(remoteDescriptor.getPropertySet(setName),
-                "The property set should have been removed from the " +
-                        "remote repo descriptor.");
-    }
-
-    public void repoLayoutExistence() {
-        assertEquals(cc.getRepoLayouts().size(), 2, "The config should contain 2 repository layouts");
-        assertTrue(cc.isRepoLayoutExists("layout1"), "The config should contain the repo layout: 'layout1'");
-        assertTrue(cc.isRepoLayoutExists("layout2"), "The config should contain the repo layout: 'layout2'");
-    }
-
-    public void removeRepoLayout() {
-        RepoLayout layoutToRemove = new RepoLayout();
-        String name = "toRemove";
-        layoutToRemove.setName(name);
-        cc.addRepoLayout(layoutToRemove);
-
-        LocalRepoDescriptor localDescriptor = cc.getLocalRepositoriesMap().get("local1");
-        localDescriptor.setRepoLayout(layoutToRemove);
-
-        RemoteRepoDescriptor remoteDescriptor = cc.getRemoteRepositoriesMap().get("remote1");
-        remoteDescriptor.setRepoLayout(layoutToRemove);
-
-        VirtualRepoDescriptor virtualDescriptor = cc.getVirtualRepositoriesMap().get("virtual1");
-        virtualDescriptor.setRepoLayout(layoutToRemove);
-
-        assertNotNull(localDescriptor.getRepoLayout(), "The descriptor should contain the added repo layout");
-
-        assertNotNull(cc.removeRepoLayout(name), "The repo layout should have been removed from the central " +
-                "config descriptor.");
-
-        assertEquals(localDescriptor.getRepoLayout(), RepoLayoutUtils.MAVEN_2_DEFAULT,
-                "The repo layout should have defaulted.");
-
-        assertEquals(remoteDescriptor.getRepoLayout(), RepoLayoutUtils.MAVEN_2_DEFAULT,
-                "The repo layout should have defaulted.");
-
-        assertNull(virtualDescriptor.getRepoLayout(), "The repo layout should have defaulted to null.");
-    }
-
-    public void replicationsExistence() {
-        assertNotNull(cc.getRemoteReplication("remote1"));
-        assertNotNull(cc.getRemoteReplication("remote2"));
-        assertNotNull(cc.getLocalReplication("local1"));
-        assertNotNull(cc.getLocalReplication("local2"));
-    }
-
-    public void removeReplicationUpdates() {
-        RemoteReplicationDescriptor remoteReplication = cc.getRemoteReplication("remote2");
-        assertNotNull(remoteReplication, "Expected to find second remote replication.");
-        cc.removeRemoteReplication(remoteReplication);
-        assertNull(cc.getRemoteReplication("remote2"), "Second remote replication should have been removed.");
-
-        LocalReplicationDescriptor localReplication = cc.getLocalReplication("local2");
-        assertNotNull(localReplication, "Expected to find second local replication.");
-        cc.removeLocalReplication(localReplication);
-        assertNull(cc.getLocalReplication("local2"), "Second local replication should have been removed.");
-    }
-
-    private void addDefaultProxyToRemoteRepositories(ProxyDescriptor proxyDescriptor) {
-        Map<String, RemoteRepoDescriptor> descriptorOrderedMap = cc.getRemoteRepositoriesMap();
-        for (RemoteRepoDescriptor descriptor : descriptorOrderedMap.values()) {
-            if (descriptor instanceof HttpRepoDescriptor) {
-                HttpRepoDescriptor httpRepoDescriptor = (HttpRepoDescriptor) descriptor;
-                httpRepoDescriptor.setProxy(proxyDescriptor);
-            }
-        }
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/descriptor/config/CentralConfigReadWriteTest.java b/base/config/src/test/java/org/artifactory/descriptor/config/CentralConfigReadWriteTest.java
deleted file mode 100644
index 334d071..0000000
--- a/base/config/src/test/java/org/artifactory/descriptor/config/CentralConfigReadWriteTest.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.config;
-
-import com.google.common.collect.Maps;
-import org.artifactory.descriptor.Descriptor;
-import org.artifactory.descriptor.backup.BackupDescriptor;
-import org.artifactory.descriptor.cleanup.CleanupConfigDescriptor;
-import org.artifactory.descriptor.download.FolderDownloadConfigDescriptor;
-import org.artifactory.descriptor.gc.GcConfigDescriptor;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.descriptor.reader.CentralConfigReader;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.descriptor.security.SecurityDescriptor;
-import org.artifactory.descriptor.security.ldap.LdapSetting;
-import org.artifactory.descriptor.trashcan.TrashcanConfigDescriptor;
-import org.artifactory.jaxb.JaxbHelper;
-import org.artifactory.util.Files;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.PrintStream;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the read and write of CentralConfig using the JaxbHelper.
- */
- at Test
-public class CentralConfigReadWriteTest {
-    private static final Logger log = LoggerFactory.getLogger(CentralConfigReadWriteTest.class);
-
-    private File testDir;
-
-    @BeforeTest
-    public void createTestOutputDir() {
-        testDir = new File("target/config-test");
-        if (!testDir.exists()) {
-            testDir.mkdirs();
-        }
-    }
-
-    public void writeCentralConfig() throws Exception {
-        MutableCentralConfigDescriptor desc = new CentralConfigDescriptorImpl();
-        desc.setServerName("mymy");
-        desc.setDateFormat("dd-MM-yy HH:mm:ss z");
-
-        RepoLayout repoLayout = new RepoLayout();
-        repoLayout.setName("layout");
-        repoLayout.setArtifactPathPattern("artifactPathPattern");
-        repoLayout.setDistinctiveDescriptorPathPattern(true);
-        repoLayout.setDescriptorPathPattern("descriptorPathPattern");
-        desc.addRepoLayout(repoLayout);
-
-        LocalRepoDescriptor local1 = new LocalRepoDescriptor();
-        local1.setKey("local1");
-        local1.setRepoLayout(repoLayout);
-        local1.setBlackedOut(false);
-        local1.setDescription("local repo 1");
-        local1.setNotes("note1");
-        local1.setExcludesPattern("");
-        local1.setIncludesPattern("**/*");
-        local1.setHandleReleases(true);
-        local1.setHandleSnapshots(true);
-
-        LocalRepoDescriptor local2 = new LocalRepoDescriptor();
-        local2.setKey("local2");
-        local2.setRepoLayout(repoLayout);
-        local2.setBlackedOut(false);
-        local2.setDescription("local repo 2");
-        local2.setNotes("note2");
-        local2.setExcludesPattern("**/*");
-        local2.setIncludesPattern("**/*");
-        local2.setHandleReleases(true);
-        local2.setHandleSnapshots(true);
-        local2.setSuppressPomConsistencyChecks(true);
-
-        Map<String, LocalRepoDescriptor> localRepositoriesMap = Maps.newLinkedHashMap();
-        localRepositoriesMap.put(local1.getKey(), local1);
-        localRepositoriesMap.put(local2.getKey(), local2);
-        desc.setLocalRepositoriesMap(localRepositoriesMap);
-
-        // security
-        SecurityDescriptor securityDescriptor = new SecurityDescriptor();
-        securityDescriptor.setAnonAccessEnabled(true);
-        desc.setSecurity(securityDescriptor);
-
-        // ldap settings
-        LdapSetting ldap = new LdapSetting();
-        ldap.setKey("ldap1");
-        ldap.setLdapUrl("ldap://blabla");
-        securityDescriptor.setLdapSettings(Arrays.asList(ldap));
-
-        // backups
-        BackupDescriptor backup = new BackupDescriptor();
-        backup.setKey("backup1");
-        backup.setEnabled(false);
-        backup.setCronExp("* * * * *");
-        desc.setBackups(Arrays.asList(backup));
-
-        // proxy
-        ProxyDescriptor proxy = new ProxyDescriptor();
-        proxy.setKey("proxy1");
-        proxy.setHost("localhost");
-        proxy.setUsername("1111");
-        proxy.setPassword("1111");
-        proxy.setNtHost("nthost");
-        desc.addProxy(proxy, false);
-
-        //Property sets
-        PropertySet propertySet1 = new PropertySet();
-        propertySet1.setName("propertySet1");
-        propertySet1.setVisible(true);
-        desc.addPropertySet(propertySet1);
-
-        PropertySet propertySet2 = new PropertySet();
-        propertySet2.setName("propertySet2");
-        propertySet2.setVisible(false);
-        desc.addPropertySet(propertySet2);
-
-        LocalReplicationDescriptor localReplication = new LocalReplicationDescriptor();
-        localReplication.setEnabled(true);
-        localReplication.setCronExp("0 0/7 * * * ?");
-        localReplication.setRepoKey("local1");
-        localReplication.setUrl("http://momo.com");
-        localReplication.setUsername("user1");
-        localReplication.setPassword("password1");
-        localReplication.setEnableEventReplication(true);
-        desc.addLocalReplication(localReplication);
-
-        GcConfigDescriptor gcConfigDescriptor = new GcConfigDescriptor();
-        gcConfigDescriptor.setCronExp("0 0 4 * * ?");
-        desc.setGcConfig(gcConfigDescriptor);
-
-        CleanupConfigDescriptor cleanupConfigDescriptor = new CleanupConfigDescriptor();
-        cleanupConfigDescriptor.setCronExp("0 12 5 * * ?");
-        desc.setCleanupConfig(cleanupConfigDescriptor);
-
-        CleanupConfigDescriptor virtualCleanupConfigDescriptor = new CleanupConfigDescriptor();
-        virtualCleanupConfigDescriptor.setCronExp("0 12 5 * * ?");
-        desc.setVirtualCacheCleanupConfig(virtualCleanupConfigDescriptor);
-
-        FolderDownloadConfigDescriptor folderDownloadConfigDescriptor = new FolderDownloadConfigDescriptor();
-        desc.setFolderDownloadConfig(folderDownloadConfigDescriptor);
-
-        TrashcanConfigDescriptor trashcanConfigDescriptor = new TrashcanConfigDescriptor();
-        desc.setTrashcanConfig(trashcanConfigDescriptor);
-
-        File outputConfig = new File(testDir, "central.config.test.xml");
-        JaxbHelper.writeConfig(desc, outputConfig);
-    }
-
-    @Test(dependsOnMethods = "writeCentralConfig")
-    public void readWrittenCentralConfig() {
-        File outputConfig = new File(testDir, "central.config.test.xml");
-        // This needs to be here because this is for a test of writing and re-reading configs.
-        CentralConfigDescriptor cc = JaxbHelper.readConfig(Files.readFileToString(outputConfig));
-
-        assertEquals(cc.getServerName(), "mymy");
-        assertTrue(cc.getSecurity().isAnonAccessEnabled());
-
-        assertEquals(cc.getLocalRepositoriesMap().size(), 2,
-                "Expecting 2 local repositories");
-
-        List<BackupDescriptor> backups = cc.getBackups();
-        assertEquals(backups.size(), 1, "Expecting 1 backup");
-        assertEquals(backups.get(0).getKey(), "backup1");
-        assertFalse(backups.get(0).isEnabled());
-
-        Map<String, LocalRepoDescriptor> localRepos = cc.getLocalRepositoriesMap();
-        assertTrue(localRepos.get("local1").isSuppressPomConsistencyChecks());
-        assertTrue(cc.getLocalRepositoriesMap().get("local2").isSuppressPomConsistencyChecks());
-
-        assertEquals(cc.getProxies().size(), 1);
-
-        List<PropertySet> propertySets = cc.getPropertySets();
-        assertEquals(propertySets.size(), 2, "The config should contain 2 property sets.");
-
-        PropertySet propertySet1 = propertySets.get(0);
-        assertEquals(propertySet1.getName(), "propertySet1", "The first property set in the list should be named " +
-                "'propertySet1'.");
-        assertTrue(propertySet1.isVisible(), "The first property set in the list should be visible.");
-
-        PropertySet propertySet2 = propertySets.get(1);
-        assertEquals(propertySet2.getName(), "propertySet2", "The second property set in the list should be named " +
-                "'propertySet2'.");
-        assertFalse(propertySet2.isVisible(), "The second property set in the list should not be visible.");
-
-        List<LocalReplicationDescriptor> localReplications = cc.getLocalReplications();
-        assertEquals(localReplications.size(), 1, "Expected only 1 replication.");
-        assertEquals(localReplications.get(0).getRepoKey(), "local1", "Unexpected replication repo key association.");
-        assertTrue(localReplications.get(0).isEnabled(), "Expected the replication to be enabled.");
-
-        GcConfigDescriptor gcConfig = cc.getGcConfig();
-        assertNotNull(gcConfig, "Expected to find the GC configuration descriptor.");
-        assertEquals(gcConfig.getCronExp(), "0 0 4 * * ?", "Unexpected GC cron");
-
-        log.debug("config = " + cc);
-    }
-
-    public void defaultConfigElements() throws FileNotFoundException {
-        CentralConfigDescriptorImpl cc = new CentralConfigDescriptorImpl();
-
-        RepoLayout repoLayout = new RepoLayout();
-        repoLayout.setName("repoLayout");
-        repoLayout.setArtifactPathPattern("artifactPathPattern");
-        repoLayout.setDistinctiveDescriptorPathPattern(true);
-        repoLayout.setDescriptorPathPattern("descriptorPathPattern");
-        cc.addRepoLayout(repoLayout);
-
-        // at least one local repository
-        LocalRepoDescriptor localRepo = new LocalRepoDescriptor();
-        localRepo.setKey("abc");
-        localRepo.setRepoLayout(repoLayout);
-        cc.addLocalRepository(localRepo);
-
-        GcConfigDescriptor gcConfigDescriptor = new GcConfigDescriptor();
-        gcConfigDescriptor.setCronExp("tyrtrsg");
-        cc.setGcConfig(gcConfigDescriptor);
-
-        CleanupConfigDescriptor cleanupConfigDescriptor = new CleanupConfigDescriptor();
-        cleanupConfigDescriptor.setCronExp("sdfsdf");
-        cc.setCleanupConfig(cleanupConfigDescriptor);
-
-        CleanupConfigDescriptor virtualCleanupConfigDescriptor = new CleanupConfigDescriptor();
-        virtualCleanupConfigDescriptor.setCronExp("sdfsdf");
-        cc.setVirtualCacheCleanupConfig(virtualCleanupConfigDescriptor);
-
-        FolderDownloadConfigDescriptor folderDownloadConfigDescriptor = new FolderDownloadConfigDescriptor();
-        cc.setFolderDownloadConfig(folderDownloadConfigDescriptor);
-
-        TrashcanConfigDescriptor trashcanConfigDescriptor = new TrashcanConfigDescriptor();
-        cc.setTrashcanConfig(trashcanConfigDescriptor);
-
-        File outputConfig = new File(testDir, "config.defaults.test.xml");
-        JaxbHelper.writeConfig(cc, outputConfig);
-
-        CentralConfigDescriptor descriptor =
-                new CentralConfigReader().read(outputConfig);
-        assertNotNull(descriptor.getSecurity(), "Security setting should not be null");
-        assertTrue(descriptor.getSecurity().isAnonAccessEnabled(),
-                "Annonymous access should be enabled by default");
-    }
-
-    public void writeW3cSchema() throws FileNotFoundException {
-        JaxbHelper<CentralConfigDescriptorImpl> helper =
-                new JaxbHelper<CentralConfigDescriptorImpl>();
-        helper.generateSchema(new PrintStream(new File(testDir, "schema.test.xsd")),
-                CentralConfigDescriptorImpl.class, Descriptor.NS);
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/descriptor/property/PredefinedValueTest.java b/base/config/src/test/java/org/artifactory/descriptor/property/PredefinedValueTest.java
deleted file mode 100644
index 872683a..0000000
--- a/base/config/src/test/java/org/artifactory/descriptor/property/PredefinedValueTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.property;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * Unit test for the PredefinedValue object
- *
- * @author Noam Tenne
- */
- at Test
-public class PredefinedValueTest {
-
-    public void defaultConstructor() {
-        PredefinedValue predefinedValue = new PredefinedValue();
-        Assert.assertNull(predefinedValue.getValue(), "Default predefined value name should be null.");
-        Assert.assertFalse(predefinedValue.isDefaultValue(), "Value should not be default.");
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/descriptor/property/PropertySetTest.java b/base/config/src/test/java/org/artifactory/descriptor/property/PropertySetTest.java
deleted file mode 100644
index ba569e6..0000000
--- a/base/config/src/test/java/org/artifactory/descriptor/property/PropertySetTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.property;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * Unit test for the PropertySet object
- *
- * @author Noam Tenne
- */
- at Test
-public class PropertySetTest {
-
-    public void defaultConstructor() {
-        PropertySet propertySet = new PropertySet();
-        Assert.assertNull(propertySet.getName(), "Default property set name should be null.");
-        Assert.assertTrue(propertySet.isVisible(), "Property set should be visible by default.");
-        Assert.assertTrue(propertySet.getProperties().isEmpty(), "Property list should be empty be default.");
-    }
-
-    /**
-     * Test equals method with 2 equal property set objects
-     */
-    public void testEqual() {
-        PropertySet moo1 = new PropertySet();
-        PropertySet moo2 = new PropertySet();
-        moo1.setName("moo");
-        moo2.setName("moo");
-
-        Assert.assertTrue(moo1.equals(moo2), "Property sets should be equal.");
-    }
-
-    /**
-     * Test equals method with 2 unequal property set objects
-     */
-    public void testUnequal() {
-        PropertySet propertySetMoo = new PropertySet();
-        propertySetMoo.setName("moo");
-
-        PropertySet propertySetBoo = new PropertySet();
-        propertySetBoo.setName("boo");
-
-        Assert.assertFalse(propertySetMoo.equals(propertySetBoo), "Property sets should not be equal.");
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/descriptor/property/PropertyTest.java b/base/config/src/test/java/org/artifactory/descriptor/property/PropertyTest.java
deleted file mode 100644
index 1a9110a..0000000
--- a/base/config/src/test/java/org/artifactory/descriptor/property/PropertyTest.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.property;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * Unit test for the Property object
- *
- * @author Noam Tenne
- */
- at Test
-public class PropertyTest {
-
-    public void defaultConstructor() {
-        Property property = new Property();
-        Assert.assertNull(property.getName(), "Default property name should be null.");
-        Assert.assertFalse(property.isClosedPredefinedValues(), "Property predefined values should not be closed by" +
-                " default.");
-        Assert.assertTrue(property.getPredefinedValues().isEmpty(), "Property predefined value list should be empty" +
-                " by default.");
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/descriptor/reader/CentralConfigReaderTest.java b/base/config/src/test/java/org/artifactory/descriptor/reader/CentralConfigReaderTest.java
deleted file mode 100644
index f3c831a..0000000
--- a/base/config/src/test/java/org/artifactory/descriptor/reader/CentralConfigReaderTest.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.reader;
-
-import org.apache.commons.io.FileUtils;
-import org.artifactory.common.property.ArtifactorySystemProperties;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.jaxb.JaxbHelper;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.artifactory.test.TestUtils;
-import org.artifactory.util.ResourceUtils;
-import org.artifactory.version.ArtifactoryConfigVersion;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.util.Collection;
-import java.util.Map;
-import java.util.Properties;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-
-import static org.artifactory.common.ConstantValues.substituteRepoKeys;
-import static org.testng.Assert.*;
-
-/**
- * Test the {@link CentralConfigReader}
- *
- * @author Tomer Cohen
- */
- at Test
-
-public class CentralConfigReaderTest extends ArtifactoryHomeBoundTest {
-
-    private String failureMessage;
-
-    public void readV7Config() throws Exception {
-        File oldConfigFile = ResourceUtils.getResourceAsFile("/config/install/config.1.4.7.xml");
-        CentralConfigDescriptor newConfig =
-                new CentralConfigReader().read(oldConfigFile);
-        Map<String, RemoteRepoDescriptor> descriptorOrderedMap = newConfig.getRemoteRepositoriesMap();
-        Assert.assertEquals(descriptorOrderedMap.size(), 12, "Should contain 12 remote repository");
-    }
-
-    public void readAllConfigFiles() throws Exception {
-        Properties propTest = new Properties();
-        propTest.setProperty(substituteRepoKeys.getPropertyName() + "3rdp-releases", "third-party-releases");
-        propTest.setProperty(substituteRepoKeys.getPropertyName() + "3rdp-snapshots", "third-party-snapshots");
-        propTest.setProperty(substituteRepoKeys.getPropertyName() + "3rd-party", "third-party");
-        // load the repo key substitute
-        Map<String, String> subs = (Map<String, String>) TestUtils.invokeStaticMethod(
-                ArtifactorySystemProperties.class, "fillRepoKeySubstitute",
-                new Class[]{Properties.class}, new Object[]{propTest});
-        assertEquals(subs.size(), 3);
-        TestUtils.setField(getBound().getArtifactoryProperties(), "substituteRepoKeys", subs);
-        File backupDirs = ResourceUtils.getResourceAsFile("/config");
-        Collection<File> oldArtifactoryConfigs = FileUtils.listFiles(backupDirs, new String[]{"xml"}, true);
-        assertTrue(oldArtifactoryConfigs.size() > 10, "Where are all my test files??");
-
-        // run in parallel for better speed
-        ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
-        for (File oldArtifactoryConfig : oldArtifactoryConfigs) {
-            executorService.submit(new ConfigReadWriteTester(oldArtifactoryConfig));
-        }
-        executorService.shutdown();
-        //executorService.awaitTermination(15, TimeUnit.SECONDS);
-        executorService.awaitTermination(1500, TimeUnit.SECONDS);
-
-        assertNull(failureMessage, failureMessage);
-    }
-
-    private class ConfigReadWriteTester implements Runnable {
-        private final File configFile;
-
-        private ConfigReadWriteTester(File configFile) {
-            this.configFile = configFile;
-        }
-
-        @Override
-        public void run() {
-            try {
-                CentralConfigReader centralConfigReader = new CentralConfigReader();
-                CentralConfigDescriptor newConfig = centralConfigReader.read(configFile);
-                ArtifactoryConfigVersion configVersion =
-                        ArtifactoryConfigVersion.getConfigVersion(JaxbHelper.toXml(newConfig));
-                assertNotNull(configVersion,
-                        "Null value returned from config reader for file " + configFile.getAbsolutePath());
-                assertTrue(configVersion.isCurrent(), "Artifactory config version is not up to date");
-            } catch (Throwable t) {
-                t.printStackTrace();
-                failureMessage = "Failed to convert " + configFile + ": " + t.getMessage();
-            }
-        }
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/descriptor/replication/LocalReplicationDescriptorTest.java b/base/config/src/test/java/org/artifactory/descriptor/replication/LocalReplicationDescriptorTest.java
deleted file mode 100644
index 6bc8386..0000000
--- a/base/config/src/test/java/org/artifactory/descriptor/replication/LocalReplicationDescriptorTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.replication;
-
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * @author Noam Y. Tenne
- */
- at Test
-public class LocalReplicationDescriptorTest extends ReplicationBaseDescriptorTest<LocalReplicationDescriptor> {
-
-    @Test
-    public void testDefaultValues() throws Exception {
-        LocalReplicationDescriptor replicationDescriptor = constructDescriptor();
-        assertNull(replicationDescriptor.getUrl(), "Unexpected default local replication URL.");
-        assertNull(replicationDescriptor.getProxy(), "Unexpected default local replication proxy.");
-        assertEquals(replicationDescriptor.getSocketTimeoutMillis(), 15000,
-                "Unexpected default local replication timeout.");
-        assertNull(replicationDescriptor.getUsername(), "Unexpected default local replication username.");
-        assertNull(replicationDescriptor.getPassword(), "Unexpected default local replication password.");
-        assertFalse(replicationDescriptor.isEnableEventReplication(),
-                "Unexpected default enabled event replication state.");
-    }
-
-    @Test
-    public void testSetters() throws Exception {
-        LocalReplicationDescriptor replicationDescriptor = constructDescriptor();
-        replicationDescriptor.setUrl("http://asfaf.com");
-
-        ProxyDescriptor proxy = new ProxyDescriptor();
-        replicationDescriptor.setProxy(proxy);
-        replicationDescriptor.setSocketTimeoutMillis(545454);
-        replicationDescriptor.setUsername("momo");
-        replicationDescriptor.setPassword("popo");
-        replicationDescriptor.setEnableEventReplication(true);
-
-        assertEquals(replicationDescriptor.getUrl(), "http://asfaf.com", "Unexpected local replication URL.");
-        assertEquals(replicationDescriptor.getProxy(), proxy, "Unexpected local replication proxy.");
-        assertEquals(replicationDescriptor.getSocketTimeoutMillis(), 545454, "Unexpected local replication timeout.");
-        assertEquals(replicationDescriptor.getUsername(), "momo", "Unexpected local replication username.");
-        assertEquals(replicationDescriptor.getPassword(), "popo", "Unexpected local replication password.");
-        assertTrue(replicationDescriptor.isEnableEventReplication(), "Unexpected enabled event replication state.");
-    }
-
-    @Override
-    protected LocalReplicationDescriptor constructDescriptor() {
-        return new LocalReplicationDescriptor();
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/descriptor/replication/RemoteReplicationDescriptorTest.java b/base/config/src/test/java/org/artifactory/descriptor/replication/RemoteReplicationDescriptorTest.java
deleted file mode 100644
index 197f2f2..0000000
--- a/base/config/src/test/java/org/artifactory/descriptor/replication/RemoteReplicationDescriptorTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.replication;
-
-import org.testng.annotations.Test;
-
-/**
- * @author Noam Y. Tenne
- */
- at Test
-public class RemoteReplicationDescriptorTest extends ReplicationBaseDescriptorTest<RemoteReplicationDescriptor> {
-
-    @Override
-    protected RemoteReplicationDescriptor constructDescriptor() {
-        return new RemoteReplicationDescriptor();
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/descriptor/replication/ReplicationBaseDescriptorTest.java b/base/config/src/test/java/org/artifactory/descriptor/replication/ReplicationBaseDescriptorTest.java
deleted file mode 100644
index cff7668..0000000
--- a/base/config/src/test/java/org/artifactory/descriptor/replication/ReplicationBaseDescriptorTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.replication;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * @author Noam Y. Tenne
- */
- at Test
-public abstract class ReplicationBaseDescriptorTest<T extends ReplicationBaseDescriptor> {
-
-    @Test
-    public void testDefaultBaseValues() throws Exception {
-        T replicationDescriptor = constructDescriptor();
-        assertFalse(replicationDescriptor.isEnabled(), "Default enabled state should be false.");
-        assertNull(replicationDescriptor.getCronExp(), "Default cron exp should be null.");
-        assertFalse(replicationDescriptor.isSyncDeletes(), "Default replication deletes state should be true.");
-        assertTrue(replicationDescriptor.isSyncProperties(), "Default replication properties state should be true.");
-        assertNull(replicationDescriptor.getPathPrefix(), "Default path prefix should be null.");
-        assertNull(replicationDescriptor.getRepoKey(), "Default repo key should be null.");
-    }
-
-    @Test
-    public void testBaseSetters() throws Exception {
-        T replicationDescriptor = constructDescriptor();
-        replicationDescriptor.setEnabled(true);
-        replicationDescriptor.setCronExp("0 0/5 * * * ?");
-        replicationDescriptor.setSyncDeletes(false);
-        replicationDescriptor.setSyncProperties(false);
-        replicationDescriptor.setPathPrefix("jojo");
-        replicationDescriptor.setRepoKey("koko");
-
-        assertTrue(replicationDescriptor.isEnabled(), "Unexpected enabled state.");
-        assertEquals(replicationDescriptor.getCronExp(), "0 0/5 * * * ?", "Unexpected cron exp.");
-        assertFalse(replicationDescriptor.isSyncDeletes(), "Unexpected replication deletes state.");
-        assertFalse(replicationDescriptor.isSyncProperties(), "Unexpected replication properties state.");
-        assertEquals(replicationDescriptor.getPathPrefix(), "jojo", "Unexpected path prefix.");
-        assertEquals(replicationDescriptor.getRepoKey(), "koko", "Unexpected repo key.");
-    }
-
-    protected abstract T constructDescriptor();
-}
diff --git a/base/config/src/test/java/org/artifactory/descriptor/repo/LocalRepoDescriptorTest.java b/base/config/src/test/java/org/artifactory/descriptor/repo/LocalRepoDescriptorTest.java
deleted file mode 100644
index 6aa7248..0000000
--- a/base/config/src/test/java/org/artifactory/descriptor/repo/LocalRepoDescriptorTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the LocalRepoDescriptor.
- *
- * @author Yossi Shaul
- */
- at Test
-public class LocalRepoDescriptorTest {
-
-    public void defaultConstructor() {
-        LocalRepoDescriptor localRepo = new LocalRepoDescriptor();
-        assertNull(localRepo.getKey(), "Key should be null");
-        assertNull(localRepo.getDescription(), "Description should be null");
-        assertEquals(localRepo.getIncludesPattern(), "**/*", "Includes pattern should be **/*");
-        assertNull(localRepo.getExcludesPattern(), "Excludes pattern should be null");
-        assertNull(localRepo.getRepoLayout(), "Repo layout should be null");
-        assertEquals(localRepo.getMaxUniqueSnapshots(), 0, "Max unique snapshot should be 0 by default");
-        assertEquals(localRepo.getSnapshotVersionBehavior(), SnapshotVersionBehavior.UNIQUE,
-                "SnapshotVersionBehavior should be non-unique by default");
-        assertTrue(localRepo.isSuppressPomConsistencyChecks(), "Default should suppress pom consistency checks");
-        assertNotNull(localRepo.getPropertySets(), "Property sets list should not be null");
-        assertEquals(localRepo.getChecksumPolicyType(), LocalRepoChecksumPolicyType.CLIENT,
-                "Client checksum should be the default");
-        assertEquals(localRepo.getYumRootDepth(), 0, "The default YUM calculation depth should be zero.");
-        assertNotEquals(localRepo.getType(), RepoType.YUM, "YUM calculation should be off by default.");
-        assertNotEquals(localRepo.getType(), RepoType.NuGet, "NuGet should be off by default.");
-        assertEquals(localRepo.getDockerApiVersion(), DockerApiVersion.V2, "Docker API version should be V2 by default.");
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/descriptor/repo/ProxyDescriptorTest.java b/base/config/src/test/java/org/artifactory/descriptor/repo/ProxyDescriptorTest.java
deleted file mode 100644
index 85dcd4b..0000000
--- a/base/config/src/test/java/org/artifactory/descriptor/repo/ProxyDescriptorTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import org.testng.annotations.Test;
-import org.testng.internal.Utils;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the ProxyDescriptor.
- *
- * @author Yossi Shaul
- */
- at Test
-public class ProxyDescriptorTest {
-
-    public void defaultConstructor() {
-        ProxyDescriptor proxy = new ProxyDescriptor();
-        assertNull(proxy.getKey());
-        assertNull(proxy.getHost());
-        assertEquals(proxy.getPort(), 0);
-        assertNull(proxy.getUsername());
-        assertNull(proxy.getPassword());
-        assertNull(proxy.getDomain());
-    }
-
-    public void redirectedToHosts() {
-        ProxyDescriptor proxy = new ProxyDescriptor();
-        String redirectedToHosts = "a,b;c\nd e";
-        proxy.setRedirectedToHosts(redirectedToHosts);
-        assertNotNull(proxy.getRedirectedToHosts());
-        assertEquals(proxy.getRedirectedToHosts(), redirectedToHosts);
-        String[] hostsList = proxy.getRedirectedToHostsList();
-        assertNotNull(hostsList);
-        assertEquals(hostsList.length, 5, "Unexpected redirect host list: " + Utils.arrayToString(hostsList));
-        assertEquals(hostsList[2], "c");
-    }
-
-}
diff --git a/base/config/src/test/java/org/artifactory/descriptor/repo/RemoteRepoDescriptorTest.java b/base/config/src/test/java/org/artifactory/descriptor/repo/RemoteRepoDescriptorTest.java
deleted file mode 100644
index 6e6fb0d..0000000
--- a/base/config/src/test/java/org/artifactory/descriptor/repo/RemoteRepoDescriptorTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the RemoteRepoDescriptor class.
- *
- * @author Yossi Shaul
- */
- at Test
-public class RemoteRepoDescriptorTest {
-    public void defaultConstructor() {
-        RemoteRepoDescriptor remote = new RemoteRepoDescriptor() {
-        };
-        assertNull(remote.getKey());
-        assertEquals(remote.getIncludesPattern(), "**/*");
-        assertNull(remote.getExcludesPattern());
-        assertNull(remote.getDescription());
-        assertNull(remote.getRepoLayout());
-        assertEquals(remote.getAssumedOfflinePeriodSecs(), 300);
-        assertEquals(remote.getMaxUniqueSnapshots(), 0);
-        assertEquals(remote.getMissedRetrievalCachePeriodSecs(), 1800);
-        assertEquals(remote.getRetrievalCachePeriodSecs(), 600);
-        assertEquals(remote.getChecksumPolicyType(), ChecksumPolicyType.GEN_IF_ABSENT);
-        assertNull(remote.getUrl());
-        assertNull(remote.getRemoteRepoLayout());
-        assertFalse(remote.isOffline());
-        assertFalse(remote.isBlackedOut());
-        assertFalse(remote.isCache());
-        assertFalse(remote.isLocal());
-        assertFalse(remote.isHardFail());
-        assertTrue(remote.isStoreArtifactsLocally());
-        assertFalse(remote.isFetchJarsEagerly());
-        assertFalse(remote.isFetchSourcesEagerly());
-        assertTrue(remote.isSuppressPomConsistencyChecks(),
-                "Default should not supress pom consistency checks");
-        assertEquals(remote.getUnusedArtifactsCleanupPeriodHours(), 0);
-        assertFalse(remote.isShareConfiguration());
-        assertNotNull(remote.getPropertySets(), "Property sets list should not be null");
-        assertFalse(remote.isRejectInvalidJars());
-        assertNotEquals(remote.getType(), RepoType.NuGet, "NuGet should be off by default.");
-        assertEquals(remote.getDockerApiVersion(), DockerApiVersion.V2, "Docker API version should be V2 by default.");
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/descriptor/repo/RepoLayoutTest.java b/base/config/src/test/java/org/artifactory/descriptor/repo/RepoLayoutTest.java
deleted file mode 100644
index a3f70f2..0000000
--- a/base/config/src/test/java/org/artifactory/descriptor/repo/RepoLayoutTest.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.artifactory.util.RepoLayoutUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * @author Noam Y. Tenne
- */
- at Test
-public class RepoLayoutTest {
-
-    public void testDefaultConstructor() {
-        RepoLayout repoLayout = new RepoLayout();
-        assertNull(repoLayout.getName(), "Default name should be null.");
-        assertNull(repoLayout.getArtifactPathPattern(), "Default artifact path should be null.");
-        Assert.assertFalse(repoLayout.isDistinctiveDescriptorPathPattern(),
-                "Default separate descriptor path usage should be null.");
-        assertNull(repoLayout.getDescriptorPathPattern(), "Default descriptor path should be null.");
-        assertNull(repoLayout.getFolderIntegrationRevisionRegExp(),
-                "Default path snapshot integration should be null.");
-        assertNull(repoLayout.getFileIntegrationRevisionRegExp(),
-                "Default artifact snapshot integration should be null.");
-    }
-
-    public void testCopyConstructor() {
-        RepoLayout repoLayout = new RepoLayout();
-        repoLayout.setName("name");
-        repoLayout.setArtifactPathPattern("artifactPath");
-        repoLayout.setDistinctiveDescriptorPathPattern(true);
-        repoLayout.setDescriptorPathPattern("descriptorPath");
-        repoLayout.setFolderIntegrationRevisionRegExp("pathSnapshotIntegrationRegexp");
-        repoLayout.setFileIntegrationRevisionRegExp("artifactSnapshotIntegrationRegexp");
-
-        RepoLayout copy = new RepoLayout(repoLayout);
-        Assert.assertTrue(EqualsBuilder.reflectionEquals(repoLayout, copy),
-                "Copy constructor did not produce an equal object.");
-    }
-
-    public void testM2Constants() {
-        assertEquals(RepoLayoutUtils.MAVEN_2_DEFAULT_NAME, "maven-2-default",
-                "Unexpected default maven 2 layout name");
-
-        assertEquals(RepoLayoutUtils.MAVEN_2_DEFAULT.getName(), RepoLayoutUtils.MAVEN_2_DEFAULT_NAME,
-                "Unexpected default maven 2 layout name");
-        assertEquals(RepoLayoutUtils.MAVEN_2_DEFAULT.getArtifactPathPattern(), "[orgPath]/[module]/" +
-                "[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])"
-                + "(-[classifier]).[ext]", "Unexpected default maven 2 layout artifact path");
-        assertTrue(RepoLayoutUtils.MAVEN_2_DEFAULT.isDistinctiveDescriptorPathPattern(),
-                "Default maven 2 layout descriptor path should be true");
-        assertEquals(RepoLayoutUtils.MAVEN_2_DEFAULT.getDescriptorPathPattern(), "[orgPath]/[module]/" +
-                "[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])" +
-                "(-[classifier]).pom",
-                "Unexpected default maven 2 layout descriptor path");
-        assertEquals(RepoLayoutUtils.MAVEN_2_DEFAULT.getFolderIntegrationRevisionRegExp(), "SNAPSHOT",
-                "Unexpected default maven 2 layout path snapshot integration reg exp");
-        assertEquals(RepoLayoutUtils.MAVEN_2_DEFAULT.getFileIntegrationRevisionRegExp(),
-                "SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))",
-                "Unexpected default maven 2 layout artifact snapshot integration reg exp");
-    }
-
-    public void testIvyConstants() {
-        assertEquals(RepoLayoutUtils.IVY_DEFAULT_NAME, "ivy-default", "Unexpected default ivy layout name");
-
-        assertEquals(RepoLayoutUtils.IVY_DEFAULT.getName(), RepoLayoutUtils.IVY_DEFAULT_NAME,
-                "Unexpected default ivy layout name");
-        assertEquals(RepoLayoutUtils.IVY_DEFAULT.getArtifactPathPattern(), "[org]/[module]/" +
-                "[baseRev](-[folderItegRev])/[type]s/[module](-[classifier])-[baseRev]" +
-                "(-[fileItegRev]).[ext]", "Unexpected default ivy layout artifact path");
-        assertTrue(RepoLayoutUtils.IVY_DEFAULT.isDistinctiveDescriptorPathPattern(),
-                "Default ivy layout descriptor path should be true");
-        assertEquals(RepoLayoutUtils.IVY_DEFAULT.getDescriptorPathPattern(), "[org]/[module]/" +
-                "[baseRev](-[folderItegRev])/[type]s/ivy-[baseRev]" +
-                "(-[fileItegRev]).xml", "Unexpected default ivy layout descriptor path");
-        assertEquals(RepoLayoutUtils.IVY_DEFAULT.getFolderIntegrationRevisionRegExp(), "\\d{14}",
-                "Unexpected default ivy layout path snapshot integration reg exp");
-        assertEquals(RepoLayoutUtils.IVY_DEFAULT.getFileIntegrationRevisionRegExp(), "\\d{14}",
-                "Unexpected default ivy layout artifact snapshot integration reg exp");
-    }
-
-    public void testGradleConstants() {
-        assertEquals(RepoLayoutUtils.GRADLE_DEFAULT_NAME, "gradle-default",
-                "Unexpected default gradle layout name");
-
-        assertEquals(RepoLayoutUtils.GRADLE_DEFAULT.getName(), RepoLayoutUtils.GRADLE_DEFAULT_NAME,
-                "Unexpected default gradle layout name");
-        assertEquals(RepoLayoutUtils.GRADLE_DEFAULT.getArtifactPathPattern(), "[org]/[module]/" +
-                "[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])" +
-                "(-[classifier]).[ext]", "Unexpected default gradle layout artifact path");
-        assertTrue(RepoLayoutUtils.GRADLE_DEFAULT.isDistinctiveDescriptorPathPattern(),
-                "Default gradle layout descriptor path should be true");
-        assertEquals(RepoLayoutUtils.GRADLE_DEFAULT.getDescriptorPathPattern(), "[org]/[module]/ivy-[baseRev]" +
-                "(-[fileItegRev]).xml", "Unexpected default gradle layout descriptor path");
-        assertEquals(RepoLayoutUtils.GRADLE_DEFAULT.getFolderIntegrationRevisionRegExp(), "\\d{14}",
-                "Unexpected default gradle layout path snapshot integration reg exp");
-        assertEquals(RepoLayoutUtils.GRADLE_DEFAULT.getFileIntegrationRevisionRegExp(), "\\d{14}",
-                "Unexpected default gradle layout artifact snapshot integration reg exp");
-    }
-
-    public void testM1Constants() {
-        assertEquals(RepoLayoutUtils.MAVEN_1_DEFAULT_NAME, "maven-1-default",
-                "Unexpected default maven 1 layout name");
-
-        assertEquals(RepoLayoutUtils.MAVEN_1_DEFAULT.getName(), RepoLayoutUtils.MAVEN_1_DEFAULT_NAME,
-                "Unexpected default maven 1 layout name");
-        assertEquals(RepoLayoutUtils.MAVEN_1_DEFAULT.getArtifactPathPattern(),
-                "[org]/[type]s/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]",
-                "Unexpected default maven 1 layout artifact path");
-        assertTrue(RepoLayoutUtils.MAVEN_1_DEFAULT.isDistinctiveDescriptorPathPattern(),
-                "Default maven 1 layout descriptor path should be true");
-        assertEquals(RepoLayoutUtils.MAVEN_1_DEFAULT.getDescriptorPathPattern(),
-                "[org]/[type]s/[module]-[baseRev](-[fileItegRev]).pom",
-                "Unexpected default maven 1 layout descriptor path");
-        assertEquals(RepoLayoutUtils.MAVEN_1_DEFAULT.getFolderIntegrationRevisionRegExp(), ".+",
-                "Unexpected default maven 1 layout path snapshot integration reg exp");
-        assertEquals(RepoLayoutUtils.MAVEN_1_DEFAULT.getFileIntegrationRevisionRegExp(), ".+",
-                "Unexpected default maven 1 layout artifact snapshot integration reg exp");
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/descriptor/repo/VirtualRepoDescriptorTest.java b/base/config/src/test/java/org/artifactory/descriptor/repo/VirtualRepoDescriptorTest.java
deleted file mode 100644
index 28dba8d..0000000
--- a/base/config/src/test/java/org/artifactory/descriptor/repo/VirtualRepoDescriptorTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the VirtualRepoDescriptor.
- *
- * @author Yossi Shaul
- */
- at Test
-public class VirtualRepoDescriptorTest {
-
-    public void defaultConstructor() {
-        VirtualRepoDescriptor virtualRepo = new VirtualRepoDescriptor();
-        assertNull(virtualRepo.getKey());
-        assertNull(virtualRepo.getRepoLayout());
-        assertNull(virtualRepo.getKeyPair());
-        assertTrue(virtualRepo.getRepositories().isEmpty());
-        assertNotEquals(virtualRepo.getType(), RepoType.NuGet, "NuGet should be off by default.");
-        assertEquals(virtualRepo.getDockerApiVersion(), DockerApiVersion.V2, "Docker API version should be V2 by default.");
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/descriptor/repo/VirtualRepoResolverTest.java b/base/config/src/test/java/org/artifactory/descriptor/repo/VirtualRepoResolverTest.java
deleted file mode 100644
index 4b5f848..0000000
--- a/base/config/src/test/java/org/artifactory/descriptor/repo/VirtualRepoResolverTest.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.repo;
-
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the VirtualRepoResolver.
- *
- * @author Yossi Shaul
- */
- at Test
-public class VirtualRepoResolverTest {
-    private final HttpRepoDescriptor remote1 = new HttpRepoDescriptor();
-    private final HttpRepoDescriptor remote2 = new HttpRepoDescriptor();
-    private final HttpRepoDescriptor remote3 = new HttpRepoDescriptor();
-    private final LocalRepoDescriptor local1 = new LocalRepoDescriptor();
-    private final LocalRepoDescriptor local2 = new LocalRepoDescriptor();
-    private final LocalRepoDescriptor local3 = new LocalRepoDescriptor();
-
-    @BeforeMethod
-    public void initTestRepos() {
-        remote1.setKey("remote1");
-        remote2.setKey("remote2");
-        remote3.setKey("remote3");
-        local1.setKey("local1");
-        local2.setKey("local2");
-        local3.setKey("local3");
-    }
-
-    public void virtualWithLocalAndRemote() {
-        VirtualRepoDescriptor virtual = new VirtualRepoDescriptor();
-        virtual.setKey("virtual");
-        List<RepoDescriptor> reposList = getRepoList(remote1, local1, remote2, local2, local3);
-        virtual.setRepositories(reposList);
-
-        VirtualRepoResolver resolver = new VirtualRepoResolver(virtual);
-
-        List<LocalRepoDescriptor> localRepos = resolver.getLocalRepos();
-        List<RemoteRepoDescriptor> remoteRepos = resolver.getRemoteRepos();
-        List<RealRepoDescriptor> orderedRepos = resolver.getOrderedRepos();
-        assertNotNull(localRepos, "Local repo list should not be null");
-        assertNotNull(remoteRepos, "Remote repo list should not be null");
-        assertNotNull(orderedRepos, "Ordered repo list should not be null");
-        assertEquals(localRepos.size(), 3, "Expecting 3 local repositories");
-        assertEquals(remoteRepos.size(), 2, "Expecting 2 remote repositories");
-        assertEquals(orderedRepos.size(), 5, "Expecting 5 repositories");
-
-        // check the order in each list
-        assertSame(localRepos.get(0), local1);
-        assertSame(localRepos.get(1), local2);
-        assertSame(localRepos.get(2), local3);
-
-        assertSame(remoteRepos.get(0), remote1);
-        assertSame(remoteRepos.get(1), remote2);
-
-        assertSame(orderedRepos.get(0), local1);
-        assertSame(orderedRepos.get(1), local2);
-        assertSame(orderedRepos.get(2), local3);
-        assertSame(orderedRepos.get(3), remote1);
-        assertSame(orderedRepos.get(4), remote2);
-
-    }
-
-    public void virtualWithinVirtualNoCycles() {
-        VirtualRepoDescriptor virtual1 = new VirtualRepoDescriptor();
-        virtual1.setKey("virtual1");
-        virtual1.setRepositories(getRepoList(remote2, local2));
-
-        VirtualRepoDescriptor virtualToTest = new VirtualRepoDescriptor();
-        virtualToTest.setKey("virtualToTest");
-        virtualToTest.setRepositories(getRepoList(remote1, virtual1, local1));
-
-        VirtualRepoResolver resolver = new VirtualRepoResolver(virtualToTest);
-
-        List<LocalRepoDescriptor> localRepos = resolver.getLocalRepos();
-        List<RemoteRepoDescriptor> remoteRepos = resolver.getRemoteRepos();
-        List<RealRepoDescriptor> orderedRepos = resolver.getOrderedRepos();
-        assertEquals(localRepos.size(), 2, "Expecting 2 local repositories");
-        assertEquals(remoteRepos.size(), 2, "Expecting 2 remote repositories");
-        assertEquals(orderedRepos.size(), 4, "Expecting 4 repositories");
-
-        // excpect [local2, local1, remote1, remote2]
-        assertSame(orderedRepos.get(0), local2);
-        assertSame(orderedRepos.get(1), local1);
-        assertSame(orderedRepos.get(2), remote1);
-        assertSame(orderedRepos.get(3), remote2);
-        assertFalse(resolver.hasCycle(), "This configuration doesn't contains a cycle");
-    }
-
-    public void sameRepoInTwoVirtualRepos() {
-        VirtualRepoDescriptor virtual1 = new VirtualRepoDescriptor();
-        virtual1.setKey("virtual1");
-        virtual1.setRepositories(getRepoList(remote2, local2));
-
-        VirtualRepoDescriptor virtual2 = new VirtualRepoDescriptor();
-        virtual2.setKey("virtual2");
-        virtual2.setRepositories(getRepoList(remote2, local2, local1));
-
-        VirtualRepoDescriptor virtualToTest = new VirtualRepoDescriptor();
-        virtualToTest.setKey("virtualToTest");
-        virtualToTest.setRepositories(getRepoList(virtual1, virtual2));
-
-        VirtualRepoResolver resolver = new VirtualRepoResolver(virtualToTest);
-
-        List<RealRepoDescriptor> orderedRepos = resolver.getOrderedRepos();
-        assertEquals(orderedRepos.size(), 3, "Expecting 3 repositories");
-
-        // excpect [local2, local1, remote2]
-        assertSame(orderedRepos.get(0), local2);
-        assertSame(orderedRepos.get(1), local1);
-        assertSame(orderedRepos.get(2), remote2);
-    }
-
-    public void virtualInVirtualWithCycles() {
-        VirtualRepoDescriptor virtual1 = new VirtualRepoDescriptor();
-        virtual1.setKey("virtual1");
-        VirtualRepoDescriptor virtual2 = new VirtualRepoDescriptor();
-        virtual2.setKey("virtual2");
-
-        virtual1.setRepositories(getRepoList(local2, virtual1));
-        virtual2.setRepositories(getRepoList(remote2, local2, virtual2));
-
-        VirtualRepoDescriptor virtualToTest = new VirtualRepoDescriptor();
-        virtualToTest.setKey("virtualToTest");
-        virtualToTest.setRepositories(getRepoList(virtual1, virtual2));
-
-        VirtualRepoResolver resolver = new VirtualRepoResolver(virtualToTest);
-
-        List<RealRepoDescriptor> orderedRepos = resolver.getOrderedRepos();
-        assertTrue(resolver.hasCycle(), "This configuration contains a cycle");
-        assertEquals(orderedRepos.size(), 2, "Expecting 2 repositories");
-
-        // excpect [local2, remote2]
-        assertSame(orderedRepos.get(0), local2);
-        assertSame(orderedRepos.get(1), remote2);
-    }
-
-    private List<RepoDescriptor> getRepoList(RepoDescriptor... repos) {
-        return Arrays.asList(repos);
-    }
-
-}
diff --git a/base/config/src/test/java/org/artifactory/descriptor/repo/distribution/rule/DefaultDistributionRulesTest.java b/base/config/src/test/java/org/artifactory/descriptor/repo/distribution/rule/DefaultDistributionRulesTest.java
deleted file mode 100644
index d6559b6..0000000
--- a/base/config/src/test/java/org/artifactory/descriptor/repo/distribution/rule/DefaultDistributionRulesTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.artifactory.descriptor.repo.distribution.rule;
-
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * @author Shay Yaakov
- */
- at Test
-public class DefaultDistributionRulesTest {
-
-    public void testDefaultRules() throws Exception {
-        List<DistributionRule> defaultRules = DefaultDistributionRules.getDefaultRules();
-        assertEquals(defaultRules.size(), 13);
-        assertEquals(defaultRules.get(0).name, "Bower-default");
-        assertEquals(defaultRules.get(1).name, "CocoaPods-default");
-        assertEquals(defaultRules.get(2).name, "Debian-default");
-        assertEquals(defaultRules.get(3).name, "Docker-default");
-        assertEquals(defaultRules.get(4).name, "Gradle-default");
-        assertEquals(defaultRules.get(5).name, "Ivy-default");
-        assertEquals(defaultRules.get(6).name, "Maven-default");
-        assertEquals(defaultRules.get(7).name, "Npm-default");
-        assertEquals(defaultRules.get(8).name, "NuGet-default");
-        assertEquals(defaultRules.get(9).name, "Opkg-default");
-        assertEquals(defaultRules.get(10).name, "Yum-default");
-        assertEquals(defaultRules.get(11).name, "Sbt-default");
-        assertEquals(defaultRules.get(12).name, "Vagrant-default");
-    }
-
-    public void testDefaultProductRules() throws Exception {
-        List<DistributionRule> defaultProductRules = DefaultDistributionRules.getDefaultProductRules();
-        assertEquals(defaultProductRules.size(), 13);
-        assertEquals(defaultProductRules.get(0).name, "Bower-product-default");
-        assertEquals(defaultProductRules.get(1).name, "CocoaPods-product-default");
-        assertEquals(defaultProductRules.get(2).name, "Debian-product-default");
-        assertEquals(defaultProductRules.get(3).name, "Docker-product-default");
-        assertEquals(defaultProductRules.get(4).name, "Gradle-product-default");
-        assertEquals(defaultProductRules.get(5).name, "Ivy-product-default");
-        assertEquals(defaultProductRules.get(6).name, "Maven-product-default");
-        assertEquals(defaultProductRules.get(7).name, "Npm-product-default");
-        assertEquals(defaultProductRules.get(8).name, "NuGet-product-default");
-        assertEquals(defaultProductRules.get(9).name, "Opkg-product-default");
-        assertEquals(defaultProductRules.get(10).name, "Yum-product-default");
-        assertEquals(defaultProductRules.get(11).name, "Sbt-product-default");
-        assertEquals(defaultProductRules.get(12).name, "Vagrant-product-default");
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/test/java/org/artifactory/descriptor/security/PasswordSettingsTest.java b/base/config/src/test/java/org/artifactory/descriptor/security/PasswordSettingsTest.java
deleted file mode 100644
index c7e412c..0000000
--- a/base/config/src/test/java/org/artifactory/descriptor/security/PasswordSettingsTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.security;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * Tests the PasswordSettings.
- *
- * @author Yossi Shaul
- */
- at Test
-public class PasswordSettingsTest {
-
-    public void defaultConstructor() {
-        PasswordSettings passwordSettings = new PasswordSettings();
-        EncryptionPolicy policy = passwordSettings.getEncryptionPolicy();
-        Assert.assertEquals(policy, EncryptionPolicy.SUPPORTED);
-        Assert.assertTrue(passwordSettings.isEncryptionEnabled());
-    }
-
-    public void encryptionEnabled() {
-        PasswordSettings passwordSettings = new PasswordSettings();
-        Assert.assertTrue(passwordSettings.isEncryptionEnabled());
-        passwordSettings.setEncryptionPolicy(EncryptionPolicy.REQUIRED);
-        Assert.assertTrue(passwordSettings.isEncryptionEnabled());
-        passwordSettings.setEncryptionPolicy(EncryptionPolicy.UNSUPPORTED);
-        Assert.assertFalse(passwordSettings.isEncryptionEnabled());
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/descriptor/security/SecurityDescriptorTest.java b/base/config/src/test/java/org/artifactory/descriptor/security/SecurityDescriptorTest.java
deleted file mode 100644
index 888e269..0000000
--- a/base/config/src/test/java/org/artifactory/descriptor/security/SecurityDescriptorTest.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.security;
-
-import org.artifactory.descriptor.security.ldap.LdapSetting;
-import org.artifactory.descriptor.security.ldap.group.LdapGroupSetting;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the SecurityDescriptor.
- *
- * @author Yossi Shaul
- */
- at Test
-public class SecurityDescriptorTest {
-
-    public void defaultConstructor() {
-        SecurityDescriptor security = new SecurityDescriptor();
-
-        assertTrue(security.isAnonAccessEnabled(),
-                "Annon access should be enabled by default");
-        assertNotNull(security.getLdapSettings(), "LDAP settings list should not be null");
-        assertNotNull(security.getPasswordSettings(), "Password settings list should not be null");
-    }
-
-    public void addLdap() {
-        SecurityDescriptor security = new SecurityDescriptor();
-        LdapSetting ldap = new LdapSetting();
-        ldap.setKey("ldap1");
-        security.addLdap(ldap);
-
-        assertNotNull(security.getLdapSettings());
-        assertEquals(security.getLdapSettings().size(), 1);
-    }
-
-    public void isLdapExists() {
-        SecurityDescriptor security = new SecurityDescriptor();
-        LdapSetting ldap = new LdapSetting();
-        ldap.setKey("ldap1");
-        security.addLdap(ldap);
-
-        assertTrue(security.isLdapExists("ldap1"));
-        assertFalse(security.isLdapExists("ldap2"));
-    }
-
-    public void removeLdap() {
-        SecurityDescriptor security = new SecurityDescriptor();
-        LdapSetting ldap1 = new LdapSetting();
-        ldap1.setKey("ldap1");
-        security.addLdap(ldap1);
-        LdapSetting ldap2 = new LdapSetting();
-        ldap2.setKey("ldap2");
-        security.addLdap(ldap2);
-
-        LdapSetting removedLdap = security.removeLdap("ldap1");
-        assertEquals(ldap1, removedLdap);
-        assertEquals(security.getLdapSettings().size(), 1);
-    }
-
-    public void removeLastLdap() {
-        SecurityDescriptor security = new SecurityDescriptor();
-        LdapSetting ldap = new LdapSetting();
-        ldap.setKey("ldap1");
-        security.addLdap(ldap);
-
-        security.removeLdap("ldap1");
-        assertEquals(security.getLdapSettings().size(), 0,
-                "If no ldap configured the ldap settings list should be empty");
-    }
-
-    public void addTwoEnabledLdaps() {
-        SecurityDescriptor security = new SecurityDescriptor();
-        LdapSetting ldap = new LdapSetting();
-        ldap.setKey("ldap1");
-        security.addLdap(ldap);
-        assertEquals(security.getEnabledLdapSettings().size(), 1);
-        assertEquals(security.getEnabledLdapSettings().get(0), ldap);
-        LdapSetting ldap2 = new LdapSetting();
-        ldap.setKey("ldap2");
-        security.addLdap(ldap2);
-        assertEquals(security.getEnabledLdapSettings().size(), 2);
-        assertEquals(security.getEnabledLdapSettings().get(0), ldap);
-        assertEquals(security.getEnabledLdapSettings().get(1), ldap2);
-        ldap.setEnabled(false);
-        assertEquals(security.getEnabledLdapSettings().size(), 1);
-        assertEquals(security.getEnabledLdapSettings().get(0), ldap2);
-    }
-
-    public void removeLdapSetting() {
-        SecurityDescriptor securityDescriptor = new SecurityDescriptor();
-        LdapSetting ldap = new LdapSetting();
-        ldap.setKey("ldap1");
-        securityDescriptor.addLdap(ldap);
-        LdapGroupSetting ldapGroupSetting = new LdapGroupSetting();
-        ldapGroupSetting.setName("ldapgroup1");
-        ldapGroupSetting.setEnabledLdap("ldap1");
-        securityDescriptor.addLdapGroup(ldapGroupSetting);
-
-        assertEquals(securityDescriptor.getLdapSettings().size(), 1);
-        assertEquals(securityDescriptor.getLdapGroupSettings().size(), 1);
-
-        securityDescriptor.removeLdap("ldap1");
-
-        assertEquals(securityDescriptor.getLdapGroupSettings().size(), 0);
-        assertEquals(securityDescriptor.getLdapSettings().size(), 0);
-    }
-    /*
-    public void switchEnabledLdap() {
-        SecurityDescriptor security = new SecurityDescriptor();
-        LdapSetting ldap = new LdapSetting();
-        ldap.setKey("ldap1");
-        security.addLdap(ldap);
-        LdapSetting ldap2 = new LdapSetting();
-        ldap2.setKey("ldap2");
-        security.addLdap(ldap2);
-
-        assertFalse(ldap.isEnabled(), "ldap1 should be disabled since ldap2 took its place");
-
-        ldap.setEnabled(true);
-        security.ldapSettingChanged(ldap);
-
-        assertTrue(ldap.isEnabled(), "ldap1 should be enabled");
-
-        ldap.setEnabled(false);
-        security.ldapSettingChanged(ldap);
-
-        assertFalse(ldap.isEnabled(), "ldap1 should be disabled");
-        assertFalse(ldap2.isEnabled(), "ldap2 should be disabled");
-
-        ldap2.setEnabled(true);
-        security.ldapSettingChanged(ldap2);
-
-        assertTrue(ldap2.isEnabled(), "ldap2 should be enabled");
-        assertFalse(ldap.isEnabled(), "ldap1 should be disabled");
-    }
-    */
-}
\ No newline at end of file
diff --git a/base/config/src/test/java/org/artifactory/descriptor/security/ldap/LdapSettingTest.java b/base/config/src/test/java/org/artifactory/descriptor/security/ldap/LdapSettingTest.java
deleted file mode 100644
index 4e74012..0000000
--- a/base/config/src/test/java/org/artifactory/descriptor/security/ldap/LdapSettingTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.security.ldap;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * Tests the LdapSetting.
- *
- * @author Yossi Shaul
- */
- at Test
-public class LdapSettingTest {
-
-    public void defaultConstructor() {
-        LdapSetting ldap = new LdapSetting();
-
-        Assert.assertNull(ldap.getKey());
-        Assert.assertNull(ldap.getLdapUrl());
-        Assert.assertNull(ldap.getUserDnPattern());
-        Assert.assertNull(ldap.getSearch());
-    }
-
-    /**
-     * Tests the URL protocol lower-case transformer
-     */
-    public void testUrlProtocolTransformer() {
-        testLdapUrl("", "", "Empty LDAP URL should have remained unchanged");
-
-        testLdapUrl("invalidLDAPURL", "invalidLDAPURL", "Inavlid LDAP URL should have remained unchanged");
-
-        testLdapUrl("LDAP://url", "ldap://url", "Upper-cased LDAP URL should have been transformed to lower case");
-
-        testLdapUrl("LDAP://URL", "ldap://URL", "Upper-cased LDAP URL should have been transformed to lower case");
-
-        testLdapUrl("ldap://url", "ldap://url", "Valid LDAP URL should have remained unchanged");
-
-        testLdapUrl("ldap://URL", "ldap://URL", "Valid LDAP URL should have remained unchanged");
-
-        testLdapUrl("ldap://URL:30/moo=MOO", "ldap://URL:30/moo=MOO", "Valid LDAP URL should have remained unchanged");
-
-        testLdapUrl("ldap://URL:30/moo=MOO,maa=MAA", "ldap://URL:30/moo=MOO,maa=MAA",
-                "Valid LDAP URL should have remained unchanged");
-    }
-
-    /**
-     * Tests the LDAP URL getter & setter (needed since URL is being transformed)
-     *
-     * @param inputUrl     URL to supply to setter
-     * @param outputUrl    URL to compare with results from getter
-     * @param errorMessage Message to print on unexpected result
-     */
-    private void testLdapUrl(String inputUrl, String outputUrl, String errorMessage) {
-        LdapSetting ldap = new LdapSetting();
-        ldap.setLdapUrl(inputUrl);
-        Assert.assertEquals(ldap.getLdapUrl(), outputUrl, errorMessage);
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/descriptor/security/sso/HttpSsoSettingsTest.java b/base/config/src/test/java/org/artifactory/descriptor/security/sso/HttpSsoSettingsTest.java
deleted file mode 100644
index 46054f2..0000000
--- a/base/config/src/test/java/org/artifactory/descriptor/security/sso/HttpSsoSettingsTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.descriptor.security.sso;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertFalse;
-
-/**
- * Tests the behavior of the HTTP SSO settings descriptor
- *
- * @author Noam Y. Tenne
- */
- at Test
-public class HttpSsoSettingsTest {
-
-    /**
-     * Tests the validity of the default values
-     */
-    public void testDefaultConstructor() {
-        HttpSsoSettings httpSsoSettings = new HttpSsoSettings();
-        assertFalse(httpSsoSettings.isHttpSsoProxied(), "Proxying should not be enabled by default.");
-        assertFalse(httpSsoSettings.isNoAutoUserCreation(), "No Auto user creation should not be enabled by default.");
-        Assert.assertEquals(httpSsoSettings.getRemoteUserRequestVariable(), "REMOTE_USER",
-                "Default remote user request variable should be 'REMOTE_USER'.");
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/test/java/org/artifactory/logging/version/LoggingVersionTest.java b/base/config/src/test/java/org/artifactory/logging/version/LoggingVersionTest.java
deleted file mode 100644
index c21bc24..0000000
--- a/base/config/src/test/java/org/artifactory/logging/version/LoggingVersionTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.logging.version;
-
-import org.artifactory.version.SubConfigElementVersion;
-import org.artifactory.version.VersionTest;
-
-/**
- * Tests the LoggingVersion.
- *
- * @author Yossi Shaul
- */
-public class LoggingVersionTest extends VersionTest {
-    @Override
-    protected SubConfigElementVersion[] getVersions() {
-        return LoggingVersion.values();
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/logging/version/v1/LogbackConfigSwapperTest.java b/base/config/src/test/java/org/artifactory/logging/version/v1/LogbackConfigSwapperTest.java
deleted file mode 100644
index 945548a..0000000
--- a/base/config/src/test/java/org/artifactory/logging/version/v1/LogbackConfigSwapperTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.logging.version.v1;
-
-import org.artifactory.convert.XmlConverterTest;
-import org.jdom2.Attribute;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.assertTrue;
-
-/**
- * Tests the Logback configuration swapper
- *
- * @author Noam Y. Tenne
- */
- at Test
-public class LogbackConfigSwapperTest extends XmlConverterTest {
-
-    /**
-     * Tests that the swap succeeded and that the new config is up to date
-     */
-    @Test
-    public void testSwap() throws Exception {
-        Document doc = convertXml("/org/artifactory/logging/version/v1/logback.xml", new LogbackConfigSwapper());
-
-        Element docRoot = doc.getRootElement();
-        Namespace rootNamespace = docRoot.getNamespace();
-
-        @SuppressWarnings({"unchecked"})
-        List<Element> appenders = docRoot.getChildren("appender", rootNamespace);
-
-        boolean importExportAppenderExists = false;
-        boolean trafficAppenderExists = false;
-        boolean requestAppenderExists = false;
-
-        for (Element appender : appenders) {
-            Attribute nameAttribute = appender.getAttribute("name", rootNamespace);
-
-            Assert.assertNotNull(nameAttribute, "Found appender null 'name' attribute.");
-
-            if (!importExportAppenderExists && "IMPORT.EXPORT".equals(nameAttribute.getValue())) {
-                importExportAppenderExists = true;
-                continue;
-            }
-            if (!trafficAppenderExists && "TRAFFIC".equals(nameAttribute.getValue())) {
-                trafficAppenderExists = true;
-                continue;
-            }
-            if (!requestAppenderExists && "REQUEST".equals(nameAttribute.getValue())) {
-                requestAppenderExists = true;
-            }
-        }
-
-        assertTrue(importExportAppenderExists,
-                "Import export appender should exist in the logback config after conversion.");
-        assertTrue(trafficAppenderExists, "Traffic appender should exist in the logback config after conversion.");
-        assertTrue(requestAppenderExists, "Request appender should exist in the logback config after conversion.");
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/test/java/org/artifactory/logging/version/v3/LogbackJFrogInfoConverterTest.java b/base/config/src/test/java/org/artifactory/logging/version/v3/LogbackJFrogInfoConverterTest.java
deleted file mode 100644
index b2c9cb4..0000000
--- a/base/config/src/test/java/org/artifactory/logging/version/v3/LogbackJFrogInfoConverterTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.artifactory.logging.version.v3;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.convert.XmlConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNull;
-
-public class LogbackJFrogInfoConverterTest extends XmlConverterTest {
-
-    @Test
-    public void loggerIsMissing() throws Exception {
-        Document doc = convertXml("/org/artifactory/logging/version/v4/logback.xml", new LogbackJFrogInfoConverter());
-        Element root = doc.getRootElement();
-        Namespace ns = root.getNamespace();
-
-        int count = 0;
-        List<Element> loggers = root.getChildren("logger", ns);
-        for (Element logger : loggers) {
-            if (StringUtils.equals(logger.getAttributeValue("name", ns), "org.jfrog")) {
-                count++;
-                assertNull(logger.getAttributeValue("value"));
-                assertEquals(logger.getChild("level", ns).getAttributeValue("value", ns), "info");
-            }
-        }
-
-        assertEquals(count, 1);
-    }
-
-    @Test
-    public void loggerExists() throws Exception {
-        Document doc = convertXml("/org/artifactory/logging/version/v5/logback.xml", new LogbackJFrogInfoConverter());
-        Element root = doc.getRootElement();
-        Namespace ns = root.getNamespace();
-
-        int count = 0;
-        List<Element> loggers = root.getChildren("logger", ns);
-        for (Element logger : loggers) {
-            if (StringUtils.equals(logger.getAttributeValue("name", ns), "org.jfrog")) {
-                count++;
-            }
-        }
-
-        assertEquals(count, 1);
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/test/java/org/artifactory/mapper/MinutesToSecondsPropertyMapperTest.java b/base/config/src/test/java/org/artifactory/mapper/MinutesToSecondsPropertyMapperTest.java
deleted file mode 100644
index 6df1086..0000000
--- a/base/config/src/test/java/org/artifactory/mapper/MinutesToSecondsPropertyMapperTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mapper;
-
-import org.artifactory.common.property.MinutesToSecondsPropertyMapper;
-import org.artifactory.common.property.PropertyMapper;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.Properties;
-
-/**
- * @author Tomer Cohen
- */
- at Test
-public class MinutesToSecondsPropertyMapperTest {
-
-    public void minutesToSecondsPropertyMapper() {
-        Properties properties = System.getProperties();
-        properties.put("artifactory.gc.intervalMins", "1");
-        PropertyMapper propertyMapper = new MinutesToSecondsPropertyMapper("artifactory.gc.intervalSecs");
-        String result = propertyMapper.map(properties.get("artifactory.gc.intervalMins").toString());
-
-        Assert.assertEquals(result, "60");
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/mime/MimeTypesReaderTest.java b/base/config/src/test/java/org/artifactory/mime/MimeTypesReaderTest.java
deleted file mode 100644
index 2e4a9c0..0000000
--- a/base/config/src/test/java/org/artifactory/mime/MimeTypesReaderTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime;
-
-import org.apache.commons.io.filefilter.SuffixFileFilter;
-import org.artifactory.util.ResourceUtils;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.FileFilter;
-import java.util.Set;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the {@link MimeTypesReader}
- *
- * @author Yossi Shaul
- */
- at SuppressWarnings("ConstantConditions")
- at Test
-public class MimeTypesReaderTest {
-    private MimeTypes mimeTypes;
-
-    @BeforeClass
-    public void setup() {
-        MimeTypesReader reader = new MimeTypesReader();
-        mimeTypes = reader.read(ResourceUtils.getResourceAsFile("/org/artifactory/mime/mimetypes-test.xml"));
-        assertNotNull(mimeTypes, "Should not return null");
-        assertEquals(mimeTypes.getMimeTypes().size(), 5, "Unexpected count of mime types");
-    }
-
-    public void checkArchiveMime() throws Exception {
-        MimeType archive = mimeTypes.getByMime(MimeType.javaArchive);
-        assertNotNull(archive, "Couldn't find application/java-archive mime");
-        assertEquals(archive.getExtensions().size(), 5, "Unexpected file extensions count");
-        assertFalse(archive.isViewable(), "Should not be viewable");
-        assertFalse(archive.isIndex(), "Should be marked as indexed");
-        assertFalse(archive.isArchive(), "Should be marked as archive");
-        assertNull(archive.getSyntax(), "No syntax configured for this type");
-        assertNull(archive.getCss(), "No css class configured for this type");
-    }
-
-    public void trimmedFileExtensions() throws Exception {
-        // the file extensions list is usually with spaces that should be trimmed
-        MimeType archive = mimeTypes.getByMime(MimeType.javaArchive);
-        Set<String> extensions = archive.getExtensions();
-        assertTrue(extensions.contains("war"), "war extension not found in: " + extensions);
-        assertTrue(extensions.contains("jar"), "jar extension not found in: " + extensions);
-    }
-
-    public void readConvertVersion1() {
-        File versionsDirectory = ResourceUtils.getResourceAsFile("/org/artifactory/mime/version/mimetypes-v1.xml");
-        MimeTypes result = new MimeTypesReader().read(versionsDirectory);
-        assertFalse(result.getByExtension("xml").isIndex());
-        assertTrue(result.getByExtension("pom").isIndex());
-        assertTrue(result.getByExtension("ivy").isIndex());
-    }
-
-    public void readConvertVersion5() {
-        File versionsDirectory = ResourceUtils.getResourceAsFile("/org/artifactory/mime/version/mimetypes-v5.xml");
-        MimeTypes result = new MimeTypesReader().read(versionsDirectory);
-        MimeType json = result.getByExtension("json");
-        assertNotNull(json, "Expected new json mime type not found");
-        assertTrue(json.isViewable());
-    }
-
-    public void versionsRead() {
-        File versionsDirectory = ResourceUtils.getResourceAsFile(
-                "/org/artifactory/mime/version/mimetypes-v1.xml").getParentFile();
-        File[] mimeTypeFiles = versionsDirectory.listFiles((FileFilter) new SuffixFileFilter("xml"));
-        assertTrue(mimeTypeFiles.length > 0, "Couldn't find mime types files under "
-                + versionsDirectory.getAbsolutePath());
-        for (File mimeTypeFile : mimeTypeFiles) {
-            MimeTypesReader reader = new MimeTypesReader();
-            reader.read(mimeTypeFile);  // will throw an exception on error
-        }
-    }
-
-}
diff --git a/base/config/src/test/java/org/artifactory/mime/MimeTypesTest.java b/base/config/src/test/java/org/artifactory/mime/MimeTypesTest.java
deleted file mode 100644
index b49dfd2..0000000
--- a/base/config/src/test/java/org/artifactory/mime/MimeTypesTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime;
-
-import com.google.common.collect.ImmutableSet;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests {@link MimeTypes}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class MimeTypesTest {
-    private final MimeType TEXT_PLAIN = new MimeType("text/plain", ImmutableSet.of("txt"), true, false, false, "text",
-            null);
-    private MimeTypes holder;
-
-    @BeforeMethod
-    public void setup() {
-        ImmutableSet<MimeType> types = ImmutableSet.of(
-                TEXT_PLAIN,
-                new MimeType("text/xml", ImmutableSet.of("xml"), true, false, false, "xml", "xml"),
-                new MimeType("text/dup1", ImmutableSet.of("duplicate"), true, false, false, null, null),
-                new MimeType("text/dup2", ImmutableSet.of("duplicate"), true, false, false, null, null)
-        );
-
-        holder = new MimeTypes(types);
-        assertEquals(holder.getMimeTypes().size(), 4);
-    }
-
-
-    public void getByMimeEntryName() {
-        assertNull(holder.getByMime("text/nothere"), "Unexpected mime entry was found");
-        assertNotNull(holder.getByMime("text/plain"), "Expected mime entry text/plain not found");
-    }
-
-    public void getForUnknownExtension() {
-        assertNull(holder.getByExtension("text"), "Unexpected mime entry was found");
-    }
-
-    public void getByExtension() {
-        assertEquals(holder.getByExtension("txt"), TEXT_PLAIN, "Unexpected mime type was found");
-        assertEquals(holder.getByExtension("duplicate").getType(), "text/dup2",
-                "Should have taken the second duplicate");
-    }
-
-    public void getByExtensionUpperCase() {
-        assertNotNull(holder.getByExtension("TXT"), "Couldn't find mime type when using different caps");
-        assertEquals(holder.getByExtension("TXT"), TEXT_PLAIN, "Unexpected mime type was found");
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/mime/version/MimeTypesVersionTest.java b/base/config/src/test/java/org/artifactory/mime/version/MimeTypesVersionTest.java
deleted file mode 100644
index c75b5c3..0000000
--- a/base/config/src/test/java/org/artifactory/mime/version/MimeTypesVersionTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime.version;
-
-import org.artifactory.mime.MimeType;
-import org.artifactory.mime.MimeTypes;
-import org.artifactory.mime.MimeTypesReader;
-import org.artifactory.util.ResourceUtils;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests {@link MimeTypesVersion}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class MimeTypesVersionTest {
-
-    public void findVersion1() {
-        String version1 = ResourceUtils.getResourceAsString("/org/artifactory/mime/version/mimetypes-v1.xml");
-
-        MimeTypesVersion version = MimeTypesVersion.findVersion(version1);
-        assertNotNull(version);
-        assertEquals(version, MimeTypesVersion.v1);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void findNonExistentVersion() {
-        String fakeVersion = ResourceUtils.getResourceAsString("/org/artifactory/mime/version/mimetypes-v1.xml");
-        fakeVersion = fakeVersion.replace("version=\"1\"", "version=\"9789456\"");
-        MimeTypesVersion.findVersion(fakeVersion);
-    }
-
-    public void versionString() {
-        assertEquals(MimeTypesVersion.v1.versionString(), "1");
-        assertEquals(MimeTypesVersion.v2.versionString(), "2");
-    }
-
-    public void convertVersion1() {
-        String version1 = ResourceUtils.getResourceAsString("/org/artifactory/mime/version/mimetypes-v1.xml");
-
-        String latest = MimeTypesVersion.v1.convert(version1);
-
-        assertEquals(MimeTypesVersion.findVersion(latest), MimeTypesVersion.getCurrent(), "Not current version");
-        assertTrue(latest.contains("<mimetypes version=\"" + MimeTypesVersion.getCurrent().versionString()
-                + "\">"), "Unexpected converted string: " + latest);
-
-        //make sure the result is readable
-        MimeTypes mimeTypes = new MimeTypesReader().read(latest);
-        assertNotNull(mimeTypes);
-    }
-
-    public void convertVersion2() {
-        String xml = ResourceUtils.getResourceAsString("/org/artifactory/mime/version/mimetypes-v2.xml");
-        MimeTypesVersion version2 = MimeTypesVersion.findVersion(xml);
-        String latest = version2.convert(xml);
-
-        assertEquals(MimeTypesVersion.findVersion(latest), MimeTypesVersion.getCurrent(), "Not current version");
-        assertTrue(latest.contains("<mimetypes version=\"" + MimeTypesVersion.getCurrent().versionString() + "\">"),
-                "Unexpected converted string: " + latest);
-
-        MimeTypes mimeTypes = new MimeTypesReader().read(latest);
-        assertNotNull(mimeTypes);
-
-        MimeType zip = mimeTypes.getByMime("application/zip");
-        assertNotNull(zip, "Zip entry not found");
-        assertTrue(zip.isIndex(), "Zip should have been converted to indexed");
-
-        MimeType nupkg = mimeTypes.getByMime("application/x-nupkg");
-        assertNotNull(nupkg, "NuPkg entry not found");
-        assertTrue(nupkg.isArchive(), "NuPkg not created as archive");
-        assertTrue(nupkg.isIndex(), "NuPkg not created as indexed");
-
-        MimeType nuspec = mimeTypes.getByMime("application/x-nuspec+xml");
-        assertNotNull(nuspec, "Nuspec entry not found");
-        assertTrue(nuspec.isViewable(), "Nuspec not created as viewable");
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/mime/version/converter/LatestVersionConverterTest.java b/base/config/src/test/java/org/artifactory/mime/version/converter/LatestVersionConverterTest.java
deleted file mode 100644
index dabc177..0000000
--- a/base/config/src/test/java/org/artifactory/mime/version/converter/LatestVersionConverterTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime.version.converter;
-
-import org.artifactory.convert.XmlConverterTest;
-import org.artifactory.mime.version.MimeTypesVersion;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Tests the {@link LatestVersionConverter}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class LatestVersionConverterTest extends XmlConverterTest {
-    public void convert() throws Exception {
-        Document document = convertXml("/org/artifactory/mime/version/mimetypes-v1.xml", new LatestVersionConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        String version = rootElement.getAttributeValue("version", namespace);
-        String latestVersion = MimeTypesVersion.getCurrent().versionString();
-        assertEquals(version, latestVersion, "Expected converter to change version to the latest");
-    }
-
-}
diff --git a/base/config/src/test/java/org/artifactory/mime/version/converter/MimeTypeConverterTest.java b/base/config/src/test/java/org/artifactory/mime/version/converter/MimeTypeConverterTest.java
deleted file mode 100644
index 85342f8..0000000
--- a/base/config/src/test/java/org/artifactory/mime/version/converter/MimeTypeConverterTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime.version.converter;
-
-import org.artifactory.convert.XmlConverterTest;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-
-import java.util.List;
-
-import static org.testng.Assert.fail;
-
-/**
- * Base class for mimetype conversion tests.
- *
- * @author Yossi Shaul
- */
-public abstract class MimeTypeConverterTest extends XmlConverterTest {
-    protected Element getType(List mimetypes, Namespace namespace, String name) {
-        for (Object mimetype : mimetypes) {
-            Element mimeTypeElement = (Element) mimetype;
-            String type = mimeTypeElement.getAttributeValue("type", namespace);
-            if (name.equals(type)) {
-                return mimeTypeElement;
-            }
-        }
-        fail("Mime type '" + name + "' not found");
-        return null;
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/mime/version/converter/v1/XmlIndexedConverterTest.java b/base/config/src/test/java/org/artifactory/mime/version/converter/v1/XmlIndexedConverterTest.java
deleted file mode 100644
index 1ed48c8..0000000
--- a/base/config/src/test/java/org/artifactory/mime/version/converter/v1/XmlIndexedConverterTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime.version.converter.v1;
-
-import org.artifactory.mime.version.converter.MimeTypeConverterTest;
-import org.jdom2.Attribute;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNull;
-
-/**
- * Tests {@link XmlIndexedConverter}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class XmlIndexedConverterTest extends MimeTypeConverterTest {
-
-    public void convert() throws Exception {
-        Document document = convertXml("/org/artifactory/mime/version/mimetypes-v1.xml", new XmlIndexedConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        List mimetypes = rootElement.getChildren("mimetype", namespace);
-        // make sure there are no more 'xml' attributes
-        for (Object mimetype : mimetypes) {
-            Element mimeTypeElement = (Element) mimetype;
-            Attribute empty = mimeTypeElement.getAttribute("xml", namespace);
-            assertNull(empty, "'xml' attribute should have been replaced with 'index'");
-        }
-
-        // check specific mime types
-        Element applicationXml = getType(mimetypes, namespace, "application/xml");
-        assertEquals("false", applicationXml.getAttributeValue("index"));
-
-        Element pom = getType(mimetypes, namespace, "application/x-maven-pom+xml");
-        assertEquals("true", pom.getAttributeValue("index"));
-
-        Element ivy = getType(mimetypes, namespace, "application/x-ivy+xml");
-        assertEquals("true", ivy.getAttributeValue("index"));
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/mime/version/converter/v2/AscMimeTypeConverterTest.java b/base/config/src/test/java/org/artifactory/mime/version/converter/v2/AscMimeTypeConverterTest.java
deleted file mode 100644
index f3e6d24..0000000
--- a/base/config/src/test/java/org/artifactory/mime/version/converter/v2/AscMimeTypeConverterTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime.version.converter.v2;
-
-import org.artifactory.mime.version.converter.MimeTypeConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.assertTrue;
-
-/**
- * Tests {@link AscMimeTypeConverter}.
- *
- * @author Shay Yaakov
- */
- at Test
-public class AscMimeTypeConverterTest extends MimeTypeConverterTest {
-
-    public void convert() throws Exception {
-        Document document = convertXml("/org/artifactory/mime/version/mimetypes-v2.xml", new AscMimeTypeConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        List mimetypes = rootElement.getChildren("mimetype", namespace);
-        Element textPlain = getType(mimetypes, namespace, "text/plain");
-        assertTrue(textPlain.getAttributeValue("extensions").contains("asc"), "Should find .asc extension");
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/mime/version/converter/v3/ArchivesIndexConverterTest.java b/base/config/src/test/java/org/artifactory/mime/version/converter/v3/ArchivesIndexConverterTest.java
deleted file mode 100644
index 5f3b86b..0000000
--- a/base/config/src/test/java/org/artifactory/mime/version/converter/v3/ArchivesIndexConverterTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime.version.converter.v3;
-
-import org.artifactory.mime.version.converter.MimeTypeConverterTest;
-import org.jdom2.Attribute;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-
-/**
- * Tests {@link IndexArchivesMimeTypeConverter}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class ArchivesIndexConverterTest extends MimeTypeConverterTest {
-    public void convert() throws Exception {
-        Document document = convertXml("/org/artifactory/mime/version/mimetypes-v2.xml", new ArchivesIndexConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        List mimetypes = rootElement.getChildren("mimetype", namespace);
-        // make sure every archive has the 'index' attribute with value of 'true'
-        for (Object mimetype : mimetypes) {
-            Element mimeTypeElement = (Element) mimetype;
-            String isArchive = mimeTypeElement.getAttributeValue("archive", namespace);
-            if ("true".equals(isArchive)) {
-                Attribute index = mimeTypeElement.getAttribute("index", namespace);
-                assertNotNull(index, "'index' should exist for the archive");
-                assertEquals(index.getBooleanValue(), true, "Index property value should be true");
-            }
-        }
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/mime/version/converter/v3/NuPkgMimeTypeConverterTest.java b/base/config/src/test/java/org/artifactory/mime/version/converter/v3/NuPkgMimeTypeConverterTest.java
deleted file mode 100644
index 5279b99..0000000
--- a/base/config/src/test/java/org/artifactory/mime/version/converter/v3/NuPkgMimeTypeConverterTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime.version.converter.v3;
-
-import org.artifactory.mime.version.converter.MimeTypeConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests {@link NuPkgMimeTypeConverter}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class NuPkgMimeTypeConverterTest extends MimeTypeConverterTest {
-
-    public void convert() throws Exception {
-        Document document = convertXml("/org/artifactory/mime/version/mimetypes-v2.xml", new NuPkgMimeTypeConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        List mimetypes = rootElement.getChildren("mimetype", namespace);
-        Element nupkg = getType(mimetypes, namespace, "application/x-nupkg");
-        assertNotNull(nupkg);
-        assertEquals(nupkg.getAttributeValue("archive"), "true", "Unexpected mimetype: " + nupkg);
-        assertNull(nupkg.getAttribute("index"), "Index attribute should not exist");
-
-        Element nuspec = getType(mimetypes, namespace, "application/x-nuspec+xml");
-        assertNotNull(nuspec);
-        assertEquals(nuspec.getAttributeValue("extensions"), "nuspec", "Unexpected mimetype: " + nuspec);
-        assertNull(nuspec.getAttributeValue("archive"), "Archive attribute should not exist");
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/mime/version/converter/v4/GemMimeTypeConverterTest.java b/base/config/src/test/java/org/artifactory/mime/version/converter/v4/GemMimeTypeConverterTest.java
deleted file mode 100644
index db5f28b..0000000
--- a/base/config/src/test/java/org/artifactory/mime/version/converter/v4/GemMimeTypeConverterTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime.version.converter.v4;
-
-import org.artifactory.mime.version.converter.MimeTypeConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertNull;
-
-/**
- * Tests {@link GemMimeTypeConverter}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class GemMimeTypeConverterTest extends MimeTypeConverterTest {
-
-    public void convert() throws Exception {
-        Document document = convertXml("/org/artifactory/mime/version/mimetypes-v4.xml", new GemMimeTypeConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        List mimetypes = rootElement.getChildren("mimetype", namespace);
-        Element gem = getType(mimetypes, namespace, "application/x-rubygems");
-        assertNotNull(gem);
-        assertNull(gem.getAttributeValue("archive"), "Index attribute should not exist");
-        assertNull(gem.getAttribute("index"), "Index attribute should not exist");
-
-        Element marshal = getType(mimetypes, namespace, "application/x-ruby-marshal");
-        assertNotNull(marshal);
-        assertNull(marshal.getAttributeValue("archive"), "Index attribute should not exist");
-        assertNull(marshal.getAttribute("index"), "Index attribute should not exist");
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/mime/version/converter/v5/JsonMimeTypeConverterTest.java b/base/config/src/test/java/org/artifactory/mime/version/converter/v5/JsonMimeTypeConverterTest.java
deleted file mode 100644
index cc6b943..0000000
--- a/base/config/src/test/java/org/artifactory/mime/version/converter/v5/JsonMimeTypeConverterTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime.version.converter.v5;
-
-import org.artifactory.mime.version.converter.MimeTypeConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests {@link JsonMimeTypeConverter}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class JsonMimeTypeConverterTest extends MimeTypeConverterTest {
-
-    public void convert() throws Exception {
-        Document document = convertXml("/org/artifactory/mime/version/mimetypes-v5.xml", new JsonMimeTypeConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        List mimetypes = rootElement.getChildren("mimetype", namespace);
-        Element json = getType(mimetypes, namespace, "application/json");
-        assertNotNull(json);
-        assertTrue(Boolean.parseBoolean(json.getAttributeValue("viewable")));
-        assertEquals(json.getAttributeValue("extensions"), "json");
-        assertNull(json.getAttributeValue("archive"), "Index attribute should not exist");
-        assertNull(json.getAttribute("index"), "Index attribute should not exist");
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/mime/version/converter/v7/ArchiveMimeTypeConverterTest.java b/base/config/src/test/java/org/artifactory/mime/version/converter/v7/ArchiveMimeTypeConverterTest.java
deleted file mode 100644
index 8488405..0000000
--- a/base/config/src/test/java/org/artifactory/mime/version/converter/v7/ArchiveMimeTypeConverterTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.mime.version.converter.v7;
-
-import org.artifactory.mime.version.converter.MimeTypeConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertTrue;
-
-/**
- * Tests {@link ArchiveMimeTypeConverter}.
- *
- * @author Chen Keinan
- */
- at Test
-public class ArchiveMimeTypeConverterTest extends MimeTypeConverterTest {
-
-    /**
-     * update gzip mime type archive to true
-     *
-     * @throws Exception
-     */
-    public void convert() throws Exception {
-        Document document = convertXml("/org/artifactory/mime/version/mimetypes-v4.xml",
-                new ArchiveMimeTypeConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        List mimetypes = rootElement.getChildren("mimetype", namespace);
-        // check gz type
-        Element gZip = getType(mimetypes, namespace, "application/x-gzip");
-        assertNotNull(gZip);
-        assertTrue(Boolean.valueOf(gZip.getAttributeValue("archive")));
-        // check tar type
-        Element tar = getType(mimetypes, namespace, "application/x-tar");
-        assertNotNull(tar);
-        assertTrue(Boolean.valueOf(tar.getAttributeValue("archive")));
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/test/ArtifactoryHomeBoundTest.java b/base/config/src/test/java/org/artifactory/test/ArtifactoryHomeBoundTest.java
deleted file mode 100644
index 8d84987..0000000
--- a/base/config/src/test/java/org/artifactory/test/ArtifactoryHomeBoundTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.test;
-
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.mime.MimeTypes;
-import org.artifactory.mime.MimeTypesReader;
-import org.artifactory.util.ResourceUtils;
-import org.artifactory.version.ArtifactoryVersion;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-
-import java.io.InputStream;
-
-/**
- * A convenience class for tests that require bind/unbind of {@link ArtifactoryHome} (usually for system
- * properties and mime types).
- *
- * @author Yossi Shaul
- */
-public class ArtifactoryHomeBoundTest {
-    protected MimeTypes mimeTypes;
-    private ArtifactoryHomeStub homeStub;
-
-    @BeforeClass
-    public void readMimeTypes() {
-        // read and keep the default mime types
-        InputStream mimeTypesFile = ResourceUtils.getResource(
-                "/META-INF/default/" + ArtifactoryHome.MIME_TYPES_FILE_NAME);
-        mimeTypes = new MimeTypesReader().read(mimeTypesFile);
-    }
-
-    @BeforeMethod
-    public void bindArtifactoryHome() {
-        ArtifactoryHomeStub artifactory = getOrCreateArtifactoryHomeStub();
-        ArtifactoryHome.bind(artifactory);
-    }
-
-    protected ArtifactoryHomeStub getOrCreateArtifactoryHomeStub() {
-        if (homeStub == null) {
-            homeStub = new ArtifactoryHomeStub();
-            homeStub.setMimeTypes(mimeTypes);
-            loadAndBindArtifactoryProperties(homeStub);
-        }
-        return homeStub;
-    }
-
-    private void loadAndBindArtifactoryProperties(ArtifactoryHomeStub artifactory) {
-        artifactory.loadSystemProperties();
-        artifactory.setProperty(ConstantValues.artifactoryVersion, ArtifactoryVersion.getCurrent().getValue());
-    }
-
-    @AfterMethod
-    public void unbindArtifactoryHome() {
-        ArtifactoryHome.unbind();
-    }
-
-    protected ArtifactoryHomeStub getBound() {
-        return (ArtifactoryHomeStub) ArtifactoryHomeStub.get();
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/test/ArtifactoryHomeStub.java b/base/config/src/test/java/org/artifactory/test/ArtifactoryHomeStub.java
deleted file mode 100644
index 344a3e9..0000000
--- a/base/config/src/test/java/org/artifactory/test/ArtifactoryHomeStub.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.test;
-
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.common.property.ArtifactorySystemProperties;
-import org.artifactory.mime.MimeTypes;
-
-import java.io.File;
-
-/**
- * A stub of {@link ArtifactoryHome} for testing.
- *
- * @author Yossi Shaul
- */
-public class ArtifactoryHomeStub extends ArtifactoryHome {
-
-    public ArtifactoryHomeStub() {
-        super(new File("./target/test/testhome"));
-        setArtifactorySystemProperties(new ArtifactorySystemProperties());
-    }
-
-    public void setMimeTypes(MimeTypes mimeTypes) {
-        TestUtils.setField(this, "mimeTypes", mimeTypes);
-    }
-
-    /**
-     * Load artifactory system properties from java system properties and set on this configuration.
-     */
-    public ArtifactoryHomeStub loadSystemProperties() {
-        ArtifactorySystemProperties props = new ArtifactorySystemProperties();
-        props.loadArtifactorySystemProperties(null, null);
-        setArtifactorySystemProperties(props);
-        return this;
-    }
-
-    public ArtifactoryHomeStub bind() {
-        ArtifactoryHome.bind(this);
-        return this;
-    }
-
-    public ArtifactoryHomeStub setProperty(ConstantValues constant, String value) {
-        return setProperty(constant.getPropertyName(), value);
-    }
-
-    public ArtifactoryHomeStub setProperty(String key, String value) {
-        getArtifactoryProperties().setProperty(key, value);
-        return this;
-    }
-
-    private void setArtifactorySystemProperties(ArtifactorySystemProperties props) {
-        TestUtils.setField(this, "artifactorySystemProperties", props);
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/test/TestUtils.java b/base/config/src/test/java/org/artifactory/test/TestUtils.java
deleted file mode 100644
index 69dbcef..0000000
--- a/base/config/src/test/java/org/artifactory/test/TestUtils.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.test;
-
-import ch.qos.logback.classic.Level;
-import ch.qos.logback.classic.LoggerContext;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-
-/**
- * Helper methods for testing.
- *
- * @author Yossi Shaul
- */
-public class TestUtils {
-
-    public static Object invokeStaticMethod(Class<?> clazz, String methodName, Class[] paramTypes, Object[] params) {
-        try {
-            Method method = clazz.getDeclaredMethod(methodName, paramTypes);
-            method.setAccessible(true);
-            Object result = method.invoke(null, params);
-            return result;
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    public static Object invokeStaticMethodNoArgs(Class<?> clazz, String methodName) {
-        return invokeStaticMethod(clazz, methodName, null, null);
-    }
-
-    public static Object invokeMethodNoArgs(Object target, String methodName) {
-        try {
-            Method method = target.getClass().getDeclaredMethod(methodName);
-            method.setAccessible(true);
-            Object result = method.invoke(target);
-            return result;
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    /**
-     * Set the {@link java.lang.reflect.Field field} with the given <code>name</code> on the
-     * provided {@link Object target object} to the supplied <code>value</code>.
-     * <p/>
-     * Assumes the field is declared in the specified target class.
-     *
-     * @param target the target object on which to set the field
-     * @param name   the name of the field to set
-     * @param value  the value to set
-     */
-    public static void setField(Object target, String name, Object value) {
-        try {
-            Field field = findField(target.getClass(), name);
-            if (field == null) {
-                throw new IllegalArgumentException("Could not find field [" + name + "] on target [" + target + "]");
-            }
-            field.setAccessible(true);
-            field.set(target, value);
-        } catch (IllegalAccessException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    /**
-     * Get the {@link java.lang.reflect.Field field} with the given <code>name</code> on the
-     * provided {@link Object target object}.
-     * <p/>
-     * Assumes the field is declared in the specified target class.
-     *
-     * @param target the target object on which to set the field
-     * @param name   the name of the field to get
-     */
-    @SuppressWarnings("unchecked")
-    public static <T> T getField(Object target, String name, Class<T> type) {
-        try {
-            Field field = findField(target.getClass(), name);
-            if (field == null) {
-                throw new IllegalArgumentException("Could not find field [" + name + "] on target [" + target + "]");
-            }
-            field.setAccessible(true);
-            return (T) field.get(target);
-        } catch (IllegalAccessException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    /**
-     * Attempt to find a {@link Field field} on the supplied {@link Class} with
-     * the supplied <code>name</code>. Searches all
-     * superclasses up to {@link Object}.
-     *
-     * @param clazz the class to introspect
-     * @param name  the name of the field (may be <code>null</code> if type is specified)
-     * @return the corresponding Field object, or <code>null</code> if not found
-     */
-    public static Field findField(Class<?> clazz, String name) {
-        Class<?> searchType = clazz;
-        while (searchType != null) {
-            Field[] fields = searchType.getDeclaredFields();
-            for (Field field : fields) {
-                if ((name == null || name.equals(field.getName()))) {
-                    return field;
-                }
-            }
-            searchType = searchType.getSuperclass();
-        }
-        return null;
-    }
-
-    public static void setLoggingLevel(Class clazz, Level level) {
-        setLoggingLevel(clazz.getName(), level);
-    }
-
-    public static void setLoggingLevel(String name, Level level) {
-        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
-        lc.getLogger(name).setLevel(level);
-    }
-
-    @Nonnull
-    public static String extractHost(@Nullable String host) {
-        return (host == null || "0.0.0.0".equals(host)) ? "127.0.0.1" : host;
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/util/ExceptionUtilsTest.java b/base/config/src/test/java/org/artifactory/util/ExceptionUtilsTest.java
deleted file mode 100644
index 5217296..0000000
--- a/base/config/src/test/java/org/artifactory/util/ExceptionUtilsTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-
-/**
- * Tests the ExceptionUtils.
- *
- * @author Yossi Shaul
- */
- at SuppressWarnings({"ThrowableInstanceNeverThrown"})
-public class ExceptionUtilsTest {
-    @Test
-    public void testUnwrapThrowablesOfTypes() {
-        IOException ioException = new IOException();
-        IllegalArgumentException e = new IllegalArgumentException((new RuntimeException(ioException)));
-        Throwable cause = ExceptionUtils.unwrapThrowablesOfTypes(e, IOException.class);
-        Assert.assertSame(cause, cause, "Nothing should be wrapped");
-        Throwable ioCause = ExceptionUtils.unwrapThrowablesOfTypes(e, RuntimeException.class);
-        Assert.assertSame(ioCause, ioException, "Should have unwrapped any runtime exceptions");
-    }
-
-    @Test
-    public void testGetCauseOfTypes() {
-        IOException ioException = new IOException();
-        IllegalArgumentException e = new IllegalArgumentException((new RuntimeException(ioException)));
-        Throwable ioCause = ExceptionUtils.getCauseOfTypes(e, IOException.class);
-        Assert.assertSame(ioCause, ioException, "Should return the same wrapped io exception");
-        Throwable notFound = ExceptionUtils.getCauseOfTypes(e, IllegalStateException.class);
-        Assert.assertNull(notFound, "Should not have found this type of exception");
-    }
-
-    @Test
-    public void testGetRootCauseNotNested() {
-        IOException ioException = new IOException();
-        Throwable rootCause = ExceptionUtils.getRootCause(ioException);
-        Assert.assertSame(rootCause, ioException, "Should return the same io exception");
-    }
-
-    @Test
-    public void testGetRootCauseNested() {
-        IOException ioException = new IOException();
-        Throwable rootCause = ExceptionUtils.getRootCause(ioException);
-        Assert.assertSame(rootCause, ioException, "Should return the io exception");
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/util/FilesTest.java b/base/config/src/test/java/org/artifactory/util/FilesTest.java
deleted file mode 100644
index 9244a46..0000000
--- a/base/config/src/test/java/org/artifactory/util/FilesTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Arrays;
-
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-/**
- * @author Yossi Shaul
- */
- at Test
-public class FilesTest {
-    private File baseTestDir;
-
-    @BeforeMethod
-    public void createTempDir() {
-        baseTestDir = new File(System.getProperty("java.io.tmpdir"), "fileutilstest");
-        baseTestDir.mkdirs();
-        assertTrue(baseTestDir.exists(), "Failed to create base test dir");
-    }
-
-    @AfterMethod
-    public void dleteTempDir() throws IOException {
-        org.apache.commons.io.FileUtils.deleteDirectory(baseTestDir);
-    }
-
-    public void cleanupEmptyDirectoriesNonExistentDir() {
-        File nonExistentFile = new File("pampam123");
-        assertFalse(nonExistentFile.exists());
-        Files.cleanupEmptyDirectories(nonExistentFile);
-    }
-
-    public void cleanupEmptyDirectoriesEmptyDir() {
-        Files.cleanupEmptyDirectories(baseTestDir);
-        assertTrue(baseTestDir.exists(), "Method should not delete base directory");
-        Assert.assertEquals(baseTestDir.listFiles().length, 0, "Expected empty directory");
-    }
-
-    public void cleanupEmptyDirectoriesDirWithEmptyNestedDirectories() {
-        File nested1 = createNestedDirectory("org/test");
-        File nested2 = createNestedDirectory("org/apache");
-        createNestedDirectory("org/apache/empty");
-
-        Files.cleanupEmptyDirectories(baseTestDir);
-
-        assertTrue(baseTestDir.exists(), "Method should not delete base directory");
-        assertFalse(nested1.exists() || nested2.exists(), "Nested empty directory wasn't deleted");
-        File[] files = baseTestDir.listFiles();
-        Assert.assertEquals(files.length, 0, "Expected empty directory but received: " + Arrays.asList(files));
-    }
-
-    public void cleanupEmptyDirectoriesDirWithFiles() throws IOException {
-        File nested1 = createNestedDirectory("org/test");
-        File nested2 = createNestedDirectory("org/apache");
-        // create empty file
-        File file = new File(nested2, "emptyfile");
-        org.apache.commons.io.FileUtils.touch(file);
-
-        Files.cleanupEmptyDirectories(baseTestDir);
-
-        assertTrue(baseTestDir.exists(), "Method should not delete base directory");
-        assertFalse(nested1.exists(), "Nested empty directory wasn't deleted");
-        assertTrue(nested2.exists(), "Nested directory was deleted but wasn't empty");
-        Assert.assertEquals(nested2.listFiles().length, 1, "One file expected");
-        Assert.assertEquals(nested2.listFiles()[0], file, "Unexpected file found " + file);
-        File[] files = baseTestDir.listFiles();
-        Assert.assertEquals(files.length, 1, "Expected 1 directory but received: " + Arrays.asList(files));
-    }
-
-    private File createNestedDirectory(String relativePath) {
-        File nested = new File(baseTestDir, relativePath);
-        assertTrue(nested.mkdirs(), "Failed to create nested directory" + nested);
-        return nested;
-    }
-
-}
diff --git a/base/config/src/test/java/org/artifactory/util/PathUtilsTest.java b/base/config/src/test/java/org/artifactory/util/PathUtilsTest.java
deleted file mode 100644
index aa984dc..0000000
--- a/base/config/src/test/java/org/artifactory/util/PathUtilsTest.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the PathUtils.
- *
- * @author Yossi Shaul
- */
- at Test
-public class PathUtilsTest {
-
-    public void formatSimplePath() {
-        String formatted = PathUtils.formatPath("\\this\\is\\a/path");
-        assertEquals(formatted, "/this/is/a/path");
-    }
-
-    public void formatFormattedPath() {
-        String formatted = PathUtils.formatPath("/this/is/a/path");
-        assertEquals(formatted, "/this/is/a/path");
-    }
-
-    public void formatNullPath() {
-        String formatted = PathUtils.formatPath(null);
-        assertEquals(formatted, "");
-    }
-
-    public void stripExtensionSimple() {
-        String result = PathUtils.stripExtension("file.ext");
-        assertEquals(result, "file");
-    }
-
-    public void stripExtensionMultipleExtensions() {
-        String result = PathUtils.stripExtension("file.ext.ext2");
-        assertEquals(result, "file.ext");
-    }
-
-    public void stripExtensionPathWithNoExtension() {
-        String result = PathUtils.stripExtension("file");
-        assertEquals(result, "file");
-    }
-
-    public void stripExtensionPathWithDotAtEnd() {
-        String result = PathUtils.stripExtension("file.");
-        assertEquals(result, "file");
-    }
-
-    public void stripExtensionNullPath() {
-        String result = PathUtils.stripExtension(null);
-        assertNull(result);
-    }
-
-    public void stripExtensionEmptyPath() {
-        String result = PathUtils.stripExtension("");
-        assertEquals(result, "");
-    }
-
-    public void injectStringInMiddle() {
-        String result = PathUtils.injectString("Arttory", "ifac", 3);
-        assertEquals(result, "Artifactory");
-    }
-
-    public void injectStringAtTheBeginning() {
-        String result = PathUtils.injectString("rtifactory", "A", 0);
-        assertEquals(result, "Artifactory");
-    }
-
-    public void injectStringAtTheEnd() {
-        String result = PathUtils.injectString("Artifactor", "y", 10);
-        assertEquals(result, "Artifactory");
-    }
-
-    public void injectStringEmpty() {
-        String result = PathUtils.injectString("Artifactory", "", 15);
-        assertEquals(result, "Artifactory");
-    }
-
-    public void injectStringNull() {
-        String result = PathUtils.injectString("Artifactory", null, 9);
-        assertEquals(result, "Artifactory");
-    }
-
-    public void parentPathOfPathWithParent() {
-        String result = PathUtils.getParent("/a/b/c");
-        assertEquals(result, "/a/b");
-    }
-
-    public void parentPathOfRoot() {
-        String result = PathUtils.getParent("/");
-        assertEquals(result, "");
-    }
-
-    public void parentPathOfEmptyString() {
-        String result = PathUtils.getParent("");
-        assertEquals(result, "");
-    }
-
-    public void getPathElementsAbsolutePath() {
-        String[] result = PathUtils.getPathElements("/a/b/c");
-        assertEquals(result, new String[]{"a", "b", "c"});
-    }
-
-    public void getPathElementsRelativePath() {
-        String[] result = PathUtils.getPathElements("a/b/c");
-        assertEquals(result, new String[]{"a", "b", "c"});
-    }
-
-    public void getPathElementsPathWithTrailingSlash() {
-        String[] result = PathUtils.getPathElements("a/b/");
-        assertEquals(result, new String[]{"a", "b"});
-    }
-
-    public void getPathElementsRootPath() {
-        String[] result = PathUtils.getPathElements("/");
-        assertEquals(result, new String[]{""});
-    }
-
-    public void getPathElementsEmptyPath() {
-        String[] result = PathUtils.getPathElements("");
-        assertEquals(result, new String[]{""});
-    }
-
-    public void getPathElementsNullPath() {
-        String[] result = PathUtils.getPathElements(null);
-        assertEquals(result, new String[0]);
-    }
-
-    public void getFirstPathElementsAbsolutePath() {
-        String result = PathUtils.getFirstPathElement("/a/b/c");
-        assertEquals(result, "a");
-    }
-
-    public void getFirstPathElementsRelativePath() {
-        String result = PathUtils.getFirstPathElement("a/b/c");
-        assertEquals(result, "a");
-    }
-
-    public void getFirstPathElementsRootPath() {
-        String result = PathUtils.getFirstPathElement("/");
-        assertEquals(result, "");
-    }
-
-    public void getFirstPathElementsEmptyPath() {
-        String result = PathUtils.getFirstPathElement("");
-        assertEquals(result, "");
-    }
-
-    public void getFirstPathElementsNullPath() {
-        String result = PathUtils.getFirstPathElement(null);
-        assertNull(result);
-    }
-
-    public void trimLeadingSlashes() {
-        String result = PathUtils.trimLeadingSlashes("////a/b/c");
-        assertEquals(result, "a/b/c");
-    }
-
-    public void trimTrailingSlashes() {
-        String result = PathUtils.trimTrailingSlashes("a/b/c///");
-        assertEquals(result, "a/b/c");
-    }
-
-    public void trimTrailingSlashesChars() {
-        CharSequence sequence = PathUtils.trimTrailingSlashesChars("a/b/c///");
-        assertNotNull(sequence);
-        assertEquals(sequence.toString(), "a/b/c");
-    }
-
-    public void trimLeadingSlashesChars() {
-        CharSequence sequence = PathUtils.trimLeadingSlashChars("////a/b/c");
-        assertNotNull(sequence);
-        assertEquals(sequence.toString(), "a/b/c");
-    }
-
-    public void stripFirstPathElement() {
-        assertEquals(PathUtils.stripFirstPathElement("/a/b/c"), "b/c");
-        assertEquals(PathUtils.stripFirstPathElement("a/b/c/"), "b/c/");
-        assertEquals(PathUtils.stripFirstPathElement("/a"), "");
-        assertEquals(PathUtils.stripFirstPathElement("/"), "");
-        assertEquals(PathUtils.stripFirstPathElement(""), "");
-        assertNull(PathUtils.stripFirstPathElement(null));
-    }
-
-    public void addTrailingSlash() {
-        assertEquals(PathUtils.addTrailingSlash("abc"), "abc/");
-        assertEquals(PathUtils.addTrailingSlash("/a/b/c/"), "/a/b/c/");
-        assertEquals(PathUtils.addTrailingSlash("  a/b  "), "a/b/");
-        assertEquals(PathUtils.addTrailingSlash(""), "/");
-        assertEquals(PathUtils.addTrailingSlash(null), null);
-    }
-
-    public void normalizeSlashes() {
-        assertEquals(PathUtils.normalizeSlashes("a//b/c///d"), "a/b/c/d");
-        assertEquals(PathUtils.normalizeSlashes("/a///////b///c///"), "/a/b/c/");
-        assertEquals(PathUtils.normalizeSlashes("///a///////b///c/"), "/a/b/c/");
-        assertNull(PathUtils.normalizeSlashes(null));
-    }
-
-    public void checksumTargetFile() {
-        assertEquals(PathUtils.stripExtension("/a/b/c.jar.sha1"), "/a/b/c.jar");
-        assertEquals(PathUtils.stripExtension("a.pom.md5"), "a.pom");
-        assertEquals(PathUtils.stripExtension("/a/b/c.jar"), "/a/b/c");
-        assertEquals(PathUtils.stripExtension("/a/b/c"), "/a/b/c");
-    }
-
-}
diff --git a/base/config/src/test/java/org/artifactory/util/RepoLayoutUtilsTest.java b/base/config/src/test/java/org/artifactory/util/RepoLayoutUtilsTest.java
deleted file mode 100644
index 1d53b62..0000000
--- a/base/config/src/test/java/org/artifactory/util/RepoLayoutUtilsTest.java
+++ /dev/null
@@ -1,423 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.descriptor.repo.RepoLayoutBuilder;
-import org.artifactory.util.layouts.token.OrganizationPathTokenFilter;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the repository layouts utility methods and constants
- *
- * @author Noam Y. Tenne
- */
- at Test
-public class RepoLayoutUtilsTest {
-
-    public void testDefaultLayoutNames() {
-        testDefaultLayoutName(RepoLayoutUtils.MAVEN_2_DEFAULT_NAME, "maven-2-default");
-        testDefaultLayoutName(RepoLayoutUtils.IVY_DEFAULT_NAME, "ivy-default");
-        testDefaultLayoutName(RepoLayoutUtils.GRADLE_DEFAULT_NAME, "gradle-default");
-        testDefaultLayoutName(RepoLayoutUtils.MAVEN_1_DEFAULT_NAME, "maven-1-default");
-    }
-
-    public void testDefaultLayouts() {
-        testDefaultLayout(RepoLayoutUtils.MAVEN_2_DEFAULT,
-                "[orgPath]/[module]/[baseRev](-[folderItegRev])/" +
-                        "[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]",
-                true,
-                "[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).pom",
-                "SNAPSHOT", "SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))");
-
-        testDefaultLayout(RepoLayoutUtils.IVY_DEFAULT,
-                "[org]/[module]/[baseRev](-[folderItegRev])/[type]s/" +
-                        "[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]",
-                true,
-                "[org]/[module]/[baseRev](-[folderItegRev])/[type]s/ivy-[baseRev](-[fileItegRev]).xml",
-                "\\d{14}", "\\d{14}");
-
-        testDefaultLayout(RepoLayoutUtils.GRADLE_DEFAULT,
-                "[org]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]",
-                true,
-                "[org]/[module]/ivy-[baseRev](-[fileItegRev]).xml",
-                "\\d{14}", "\\d{14}");
-
-        testDefaultLayout(RepoLayoutUtils.MAVEN_1_DEFAULT,
-                "[org]/[type]s/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]",
-                true,
-                "[org]/[type]s/[module]-[baseRev](-[fileItegRev]).pom",
-                ".+", ".+");
-    }
-
-    public void testDefaultTokenValues() {
-        assertEquals(RepoLayoutUtils.ORGANIZATION, "org", "Unexpected default 'organization' token value.");
-        assertEquals(RepoLayoutUtils.ORGANIZATION_PATH, "orgPath",
-                "Unexpected default 'organization path' token value.");
-        assertEquals(RepoLayoutUtils.MODULE, "module", "Unexpected default 'module' token value.");
-        assertEquals(RepoLayoutUtils.BASE_REVISION, "baseRev", "Unexpected default 'base revision' token value.");
-        assertEquals(RepoLayoutUtils.FOLDER_INTEGRATION_REVISION, "folderItegRev",
-                "Unexpected default 'folder integration revision' token value.");
-        assertEquals(RepoLayoutUtils.FILE_INTEGRATION_REVISION, "fileItegRev",
-                "Unexpected default 'file integration revision' token value.");
-        assertEquals(RepoLayoutUtils.CLASSIFIER, "classifier", "Unexpected default 'classifier' token value.");
-        assertEquals(RepoLayoutUtils.EXT, "ext", "Unexpected default 'extension' token value.");
-        assertEquals(RepoLayoutUtils.TYPE, "type", "Unexpected default 'type' token value.");
-    }
-
-    public void testDefaultTokenSet() {
-        assertEquals(RepoLayoutUtils.TOKENS.size(), 10, "Unexpected size of layout token set.");
-        assertTokenSetContents(RepoLayoutUtils.ORGANIZATION, RepoLayoutUtils.ORGANIZATION_PATH,
-                RepoLayoutUtils.MODULE, RepoLayoutUtils.BASE_REVISION, RepoLayoutUtils.FOLDER_INTEGRATION_REVISION,
-                RepoLayoutUtils.FILE_INTEGRATION_REVISION, RepoLayoutUtils.CLASSIFIER, RepoLayoutUtils.EXT,
-                RepoLayoutUtils.TYPE, RepoLayoutUtils.RELEASE);
-    }
-
-    public void testDefaultTokenFilterMap() {
-        assertEquals(RepoLayoutUtils.TOKEN_FILTERS.size(), 1, "Unexpected size of default token filter map.");
-        assertTrue(RepoLayoutUtils.TOKEN_FILTERS.containsKey(RepoLayoutUtils.ORGANIZATION_PATH),
-                "Default token filter map should contain a filter for 'orgPath'.");
-        assertEquals(RepoLayoutUtils.TOKEN_FILTERS.get(RepoLayoutUtils.ORGANIZATION_PATH),
-                OrganizationPathTokenFilter.getInstance(), "Unexpected filter found for 'orgPath'.");
-    }
-
-    public void testReservedRepoLayoutNames() {
-        testReservedRepoLayoutName(RepoLayoutUtils.MAVEN_2_DEFAULT_NAME);
-        testReservedRepoLayoutName(RepoLayoutUtils.IVY_DEFAULT_NAME);
-        testReservedRepoLayoutName(RepoLayoutUtils.GRADLE_DEFAULT_NAME);
-        testReservedRepoLayoutName(RepoLayoutUtils.MAVEN_1_DEFAULT_NAME);
-        assertFalse(RepoLayoutUtils.isReservedName("momo"), "Unexpected reserved layout name.");
-    }
-
-    public void testIsDefaultM2Layout() {
-        assertTrue(RepoLayoutUtils.isDefaultM2(RepoLayoutUtils.MAVEN_2_DEFAULT), "Default M2 layout isn't recognized.");
-        assertFalse(RepoLayoutUtils.isDefaultM2(RepoLayoutUtils.IVY_DEFAULT),
-                "Default Ivy layout should not be recognized as default M2.");
-        assertFalse(RepoLayoutUtils.isDefaultM2(RepoLayoutUtils.GRADLE_DEFAULT),
-                "Default Gradle layout should not be recognized as default M2.");
-        assertFalse(RepoLayoutUtils.isDefaultM2(RepoLayoutUtils.MAVEN_1_DEFAULT),
-                "Default M1 layout should not be recognized as default M2.");
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = "(.*)null layout for token existence(.*)")
-    public void testNullLayoutContainsOrgPathToken() {
-        RepoLayoutUtils.layoutContainsOrgPathToken(null);
-    }
-
-    public void testLayoutContainsOrgPathToken() {
-        RepoLayoutBuilder repoLayoutBuilder = new RepoLayoutBuilder().artifactPathPattern(null).descriptorPathPattern(
-                null);
-
-        assertFalse(RepoLayoutUtils.layoutContainsOrgPathToken(repoLayoutBuilder.build()),
-                "Null paths shouldn't contain the 'orgPath' token.");
-
-        repoLayoutBuilder.artifactPathPattern("[orgPath]");
-        assertTrue(RepoLayoutUtils.layoutContainsOrgPathToken(repoLayoutBuilder.build()),
-                "Expected to find the 'orgPath' token");
-
-        repoLayoutBuilder.artifactPathPattern(null);
-        repoLayoutBuilder.distinctiveDescriptorPathPattern(true);
-        repoLayoutBuilder.descriptorPathPattern("[orgPath]");
-        assertTrue(RepoLayoutUtils.layoutContainsOrgPathToken(repoLayoutBuilder.build()),
-                "Expected to find the 'orgPath' token");
-
-        repoLayoutBuilder.artifactPathPattern("[orgPath]");
-        assertTrue(RepoLayoutUtils.layoutContainsOrgPathToken(repoLayoutBuilder.build()),
-                "Expected to find the 'orgPath' token");
-    }
-
-    public void testRemoveReplacedTokenOptionalBrackets() {
-        assertEquals(RepoLayoutUtils.removeReplacedTokenOptionalBrackets("", false), "");
-        assertEquals(RepoLayoutUtils.removeReplacedTokenOptionalBrackets("", true), "");
-
-        assertEquals(RepoLayoutUtils.removeReplacedTokenOptionalBrackets("[org]-momo", false), "[org]-momo");
-        assertEquals(RepoLayoutUtils.removeReplacedTokenOptionalBrackets("[org]-momo", true), "[org]-momo");
-
-        assertEquals(RepoLayoutUtils.removeReplacedTokenOptionalBrackets("[popo<[^\\].+?>]-momo", false),
-                "[popo<[^\\].+?>]-momo");
-        assertEquals(RepoLayoutUtils.removeReplacedTokenOptionalBrackets("[popo<[^\\].+?>]-momo", true),
-                "[popo<[^\\].+?>]-momo");
-
-        assertEquals(RepoLayoutUtils.removeReplacedTokenOptionalBrackets("[org](-[momo])", false), "[org](-[momo])");
-        assertEquals(RepoLayoutUtils.removeReplacedTokenOptionalBrackets("[org](-[momo])", true), "[org](-[momo])");
-
-        assertEquals(RepoLayoutUtils.removeReplacedTokenOptionalBrackets("[org](-[momo<[^\\][.+]>])", false),
-                "[org](-[momo<[^\\][.+]>])");
-        assertEquals(RepoLayoutUtils.removeReplacedTokenOptionalBrackets("[org](-[momo<[^\\][.+]>])", true),
-                "[org](-[momo<[^\\][.+]>])");
-
-        assertEquals(RepoLayoutUtils.removeReplacedTokenOptionalBrackets("[org](-momo)", false), "[org]-momo");
-        assertEquals(RepoLayoutUtils.removeReplacedTokenOptionalBrackets("[org](-momo)", true), "[org]");
-    }
-
-    public void testRemoveUnReplacedTokenOptionalBrackets() {
-        assertEquals(RepoLayoutUtils.removeUnReplacedTokenOptionalBrackets(""), "");
-
-        assertEquals(RepoLayoutUtils.removeUnReplacedTokenOptionalBrackets("[org]-momo"), "[org]-momo");
-
-        assertEquals(RepoLayoutUtils.removeUnReplacedTokenOptionalBrackets("[org<[^\\](.+)>]-momo"), "[org<[^\\](.+)>]-momo");
-
-        assertEquals(RepoLayoutUtils.removeUnReplacedTokenOptionalBrackets("[org](-[momo])"), "[org]");
-
-        assertEquals(RepoLayoutUtils.removeUnReplacedTokenOptionalBrackets("[org](-[momo<[^\\][.+]>])"), "[org]");
-
-        assertEquals(RepoLayoutUtils.removeUnReplacedTokenOptionalBrackets("[org](-momo)"), "[org](-momo)");
-
-        assertEquals(RepoLayoutUtils.removeUnReplacedTokenOptionalBrackets("[org<[^\\].+>](-momo)"), "[org<[^\\].+>](-momo)");
-    }
-
-    public void testGenerateRegExpFromPatternOfDefaultLayouts() {
-        testGeneratedPatternRegExp(RepoLayoutUtils.MAVEN_2_DEFAULT,
-                RepoLayoutUtils.MAVEN_2_DEFAULT.getArtifactPathPattern(),
-                "(?<orgPath>.+?)/(?<module>[^/]+)/(?<baseRev>[^/]+?)(?:-(?<folderItegRev>SNAPSHOT))?/" +
-                        "(?<module>\\2)-(?<baseRev>\\3)(?:-(?<fileItegRev>SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-" +
-                        "(?:[0-9]+))))?(?:-(?<classifier>[^/]+?))?\\.(?<ext>(?:(?!\\d))[^\\-/]+|7z)");
-        testGeneratedPatternRegExp(RepoLayoutUtils.MAVEN_2_DEFAULT,
-                RepoLayoutUtils.MAVEN_2_DEFAULT.getDescriptorPathPattern(),
-                "(?<orgPath>.+?)/(?<module>[^/]+)/(?<baseRev>[^/]+?)(?:-(?<folderItegRev>SNAPSHOT))?/" +
-                        "(?<module>\\2)-(?<baseRev>\\3)(?:-(?<fileItegRev>SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-" +
-                        "(?:[0-9]+))))?(?:-(?<classifier>[^/]+?))?\\.pom");
-
-        testGeneratedPatternRegExp(RepoLayoutUtils.IVY_DEFAULT,
-                RepoLayoutUtils.IVY_DEFAULT.getArtifactPathPattern(),
-                "(?<org>[^/]+?)/(?<module>[^/]+)/(?<baseRev>[^/]+?)(?:-(?<folderItegRev>\\d{14}))?/" +
-                        "(?<type>[^/]+?)s/(?<module>\\2)(?:-(?<classifier>[^/]+?))?-" +
-                        "(?<baseRev>\\3)(?:-(?<fileItegRev>\\d{14}))?\\.(?<ext>(?:(?!\\d))[^\\-/]+|7z)");
-        testGeneratedPatternRegExp(RepoLayoutUtils.IVY_DEFAULT,
-                RepoLayoutUtils.IVY_DEFAULT.getDescriptorPathPattern(),
-                "(?<org>[^/]+?)/(?<module>[^/]+)/(?<baseRev>[^/]+?)(?:-(?<folderItegRev>\\d{14}))?/" +
-                        "(?<type>[^/]+?)s/ivy-(?<baseRev>\\3)(?:-(?<fileItegRev>\\d{14}))?\\.xml");
-
-        testGeneratedPatternRegExp(RepoLayoutUtils.GRADLE_DEFAULT,
-                RepoLayoutUtils.GRADLE_DEFAULT.getArtifactPathPattern(),
-                "(?<org>[^/]+?)/(?<module>[^/]+)/(?<baseRev>[^/]+?)(?:-(?<folderItegRev>\\d{14}))?/" +
-                        "(?<module>\\2)-(?<baseRev>\\3)(?:-(?<fileItegRev>\\d{14}))?(?:-" +
-                        "(?<classifier>[^/]+?))?\\.(?<ext>(?:(?!\\d))[^\\-/]+|7z)");
-        testGeneratedPatternRegExp(RepoLayoutUtils.GRADLE_DEFAULT,
-                RepoLayoutUtils.GRADLE_DEFAULT.getDescriptorPathPattern(),
-                "(?<org>[^/]+?)/(?<module>[^/]+)/ivy-(?<baseRev>[^/]+?)(?:-(?<fileItegRev>\\d{14}))?\\.xml");
-        // Test patterns that contain regex special characters
-    }
-
-    public void testDefaultTokenRegExpValues() {
-        testGeneratedPatternRegExp(RepoLayoutUtils.MAVEN_2_DEFAULT,
-                RepoLayoutUtils.wrapKeywordAsToken(RepoLayoutUtils.ORGANIZATION), "(?<org>[^/]+?)");
-        testGeneratedPatternRegExp(RepoLayoutUtils.MAVEN_2_DEFAULT,
-                RepoLayoutUtils.wrapKeywordAsToken(RepoLayoutUtils.ORGANIZATION_PATH), "(?<orgPath>.+?)");
-        testGeneratedPatternRegExp(RepoLayoutUtils.MAVEN_2_DEFAULT,
-                RepoLayoutUtils.wrapKeywordAsToken(RepoLayoutUtils.MODULE), "(?<module>[^/]+)");
-        testGeneratedPatternRegExp(RepoLayoutUtils.MAVEN_2_DEFAULT,
-                RepoLayoutUtils.wrapKeywordAsToken(RepoLayoutUtils.BASE_REVISION), "(?<baseRev>[^/]+?)");
-        testGeneratedPatternRegExp(RepoLayoutUtils.MAVEN_2_DEFAULT,
-                RepoLayoutUtils.wrapKeywordAsToken(RepoLayoutUtils.CLASSIFIER), "(?<classifier>[^/]+?)");
-        testGeneratedPatternRegExp(RepoLayoutUtils.MAVEN_2_DEFAULT,
-                RepoLayoutUtils.wrapKeywordAsToken(RepoLayoutUtils.EXT), "(?<ext>(?:(?!\\d))[^\\-/]+|7z)");
-        testGeneratedPatternRegExp(RepoLayoutUtils.MAVEN_2_DEFAULT,
-                RepoLayoutUtils.wrapKeywordAsToken(RepoLayoutUtils.TYPE), "(?<type>[^/]+?)");
-
-        //Integration revisions
-        testGeneratedPatternRegExp(RepoLayoutUtils.MAVEN_2_DEFAULT,
-                RepoLayoutUtils.wrapKeywordAsToken(RepoLayoutUtils.FOLDER_INTEGRATION_REVISION),
-                "(?<folderItegRev>SNAPSHOT)");
-        testGeneratedPatternRegExp(RepoLayoutUtils.MAVEN_2_DEFAULT,
-                RepoLayoutUtils.wrapKeywordAsToken(RepoLayoutUtils.FILE_INTEGRATION_REVISION),
-                "(?<fileItegRev>SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+)))");
-        testGeneratedPatternRegExp(RepoLayoutUtils.IVY_DEFAULT,
-                RepoLayoutUtils.wrapKeywordAsToken(RepoLayoutUtils.FOLDER_INTEGRATION_REVISION),
-                "(?<folderItegRev>\\d{14})");
-        testGeneratedPatternRegExp(RepoLayoutUtils.IVY_DEFAULT,
-                RepoLayoutUtils.wrapKeywordAsToken(RepoLayoutUtils.FILE_INTEGRATION_REVISION),
-                "(?<fileItegRev>\\d{14})");
-        testGeneratedPatternRegExp(RepoLayoutUtils.GRADLE_DEFAULT,
-                RepoLayoutUtils.wrapKeywordAsToken(RepoLayoutUtils.FOLDER_INTEGRATION_REVISION),
-                "(?<folderItegRev>\\d{14})");
-        testGeneratedPatternRegExp(RepoLayoutUtils.GRADLE_DEFAULT,
-                RepoLayoutUtils.wrapKeywordAsToken(RepoLayoutUtils.FILE_INTEGRATION_REVISION),
-                "(?<fileItegRev>\\d{14})");
-        testGeneratedPatternRegExp(RepoLayoutUtils.MAVEN_1_DEFAULT,
-                RepoLayoutUtils.wrapKeywordAsToken(RepoLayoutUtils.FOLDER_INTEGRATION_REVISION),
-                "(?<folderItegRev>.+)");
-        testGeneratedPatternRegExp(RepoLayoutUtils.MAVEN_1_DEFAULT,
-                RepoLayoutUtils.wrapKeywordAsToken(RepoLayoutUtils.FILE_INTEGRATION_REVISION), "(?<fileItegRev>.+)");
-    }
-
-    public void testCustomTokenRegExpValues() {
-        testGeneratedPatternRegExp(RepoLayoutUtils.MAVEN_2_DEFAULT, "[momo<.+>]", "(?<momo>.+)");
-        testGeneratedPatternRegExp(RepoLayoutUtils.IVY_DEFAULT, "[popo<[^/]+?>]", "(?<popo>[^/]+?)");
-        testGeneratedPatternRegExp(RepoLayoutUtils.GRADLE_DEFAULT,
-                "[moo<SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))>]",
-                "(?<moo>SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+)))");
-        testGeneratedPatternRegExp(RepoLayoutUtils.MAVEN_1_DEFAULT, "[popo<\\d{14}>]", "(?<popo>\\d{14})");
-    }
-
-    public void testCustomTokenWithSpecialCharacters() {
-        testGeneratedPatternRegExp(RepoLayoutUtils.GRADLE_DEFAULT,
-                "^$Blah.special?{yes!}[moo<SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))>]",
-                "\\^\\$Blah\\.special\\?\\{yes!\\}(?<moo>SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+)))");
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = ".*[momo].*unknown.*")
-    public void testFailOnUnknownCustomToken() {
-        testGeneratedPatternRegExp(RepoLayoutUtils.MAVEN_2_DEFAULT, "[momo]", "", true);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = ".*[koko].*unknown.*")
-    public void testFailCustomTokenWithNoRegEx() {
-        testGeneratedPatternRegExp(RepoLayoutUtils.MAVEN_2_DEFAULT, "[koko<>]", "", true);
-    }
-
-    public void testIgnoreUnknownTokens() {
-        testGeneratedPatternRegExp(RepoLayoutUtils.MAVEN_2_DEFAULT, "[momo]", "");
-        testGeneratedPatternRegExp(RepoLayoutUtils.MAVEN_2_DEFAULT, "[koko<>]", "");
-    }
-
-    public void testTokenHasFilter() {
-        testTokenFilterAssociation(RepoLayoutUtils.ORGANIZATION, false);
-        testTokenFilterAssociation(RepoLayoutUtils.ORGANIZATION_PATH, true);
-        testTokenFilterAssociation(RepoLayoutUtils.MODULE, false);
-        testTokenFilterAssociation(RepoLayoutUtils.BASE_REVISION, false);
-        testTokenFilterAssociation(RepoLayoutUtils.FOLDER_INTEGRATION_REVISION, false);
-        testTokenFilterAssociation(RepoLayoutUtils.FILE_INTEGRATION_REVISION, false);
-        testTokenFilterAssociation(RepoLayoutUtils.CLASSIFIER, false);
-        testTokenFilterAssociation(RepoLayoutUtils.EXT, false);
-        testTokenFilterAssociation(RepoLayoutUtils.TYPE, false);
-    }
-
-    public void testGetArtifactLayoutAsIvyPattern() {
-        testArtifactLayoutAsIvyPattern(RepoLayoutUtils.MAVEN_2_DEFAULT, "[organization]/[module]/[revision]/" +
-                "[module]-[revision](-[classifier]).[ext]");
-        testArtifactLayoutAsIvyPattern(RepoLayoutUtils.IVY_DEFAULT, "[organization]/[module]/[revision]/[type]s/" +
-                "[module](-[classifier])-[revision].[ext]");
-        testArtifactLayoutAsIvyPattern(RepoLayoutUtils.GRADLE_DEFAULT, "[organization]/[module]/[revision]/" +
-                "[module]-[revision](-[classifier]).[ext]");
-        testArtifactLayoutAsIvyPattern(RepoLayoutUtils.MAVEN_1_DEFAULT, "[organization]/[type]s/[module]-[revision]" +
-                "(-[classifier]).[ext]");
-    }
-
-    public void testGetDescriptorLayoutAsIvyPattern() {
-        testDescriptorLayoutAsIvyPattern(RepoLayoutUtils.MAVEN_2_DEFAULT, "[organization]/[module]/[revision]/" +
-                "[module]-[revision](-[classifier]).pom");
-        testDescriptorLayoutAsIvyPattern(RepoLayoutUtils.IVY_DEFAULT, "[organization]/[module]/[revision]/[type]s/" +
-                "ivy-[revision].xml");
-        testDescriptorLayoutAsIvyPattern(RepoLayoutUtils.GRADLE_DEFAULT, "[organization]/[module]/ivy-[revision].xml");
-        testDescriptorLayoutAsIvyPattern(RepoLayoutUtils.MAVEN_1_DEFAULT, "[organization]/[type]s/" +
-                "[module]-[revision].pom");
-    }
-
-    public void testWrapKeywordAsToken() {
-        testWrappedKeywords(null, "[null]");
-        testWrappedKeywords("", "[]");
-        testWrappedKeywords(" ", "[ ]");
-
-        for (String defaultToken : RepoLayoutUtils.TOKENS) {
-            testWrappedKeywords(defaultToken, String.format("[%s]", defaultToken));
-        }
-
-        testWrappedKeywords("momo", "[momo]");
-        testWrappedKeywords("popo", "[popo]");
-    }
-
-    public void testLayoutsAreCompatible() {
-        RepoLayout[] repoLayouts = {RepoLayoutUtils.MAVEN_2_DEFAULT, RepoLayoutUtils.IVY_DEFAULT,
-                RepoLayoutUtils.GRADLE_DEFAULT, RepoLayoutUtils.MAVEN_1_DEFAULT, new RepoLayoutBuilder().
-                artifactPathPattern("[org](-[momo<[^\\](.+)>])").descriptorPathPattern("[org](-[momo<[^\\](.+)>])").
-                build()};
-
-        for (RepoLayout firstLayout : repoLayouts) {
-
-            for (RepoLayout secondLayout : repoLayouts) {
-
-                boolean layoutsAreCompatible = RepoLayoutUtils.layoutsAreCompatible(firstLayout, secondLayout);
-                if (firstLayout.equals(secondLayout)) {
-                    assertTrue(layoutsAreCompatible, "Expected layouts to be fully compatible.");
-                } else {
-                    assertFalse(layoutsAreCompatible, "Expected layouts to be incompatible.");
-                }
-            }
-        }
-    }
-
-    private void testDefaultLayoutName(String actualName, String expectedName) {
-        assertEquals(actualName, expectedName, "Unexpected default layout name.");
-    }
-
-    private void testDefaultLayout(RepoLayout repoLayout, String artifactPathPattern,
-            boolean distinctiveDescriptorPathPattern, String descriptorPathPattern,
-            String folderIntegrationRevisionRegExp, String fileIntegrationRevisionRegExp) {
-        assertEquals(repoLayout.getArtifactPathPattern(), artifactPathPattern,
-                "Unexpected default artifact path pattern.");
-        assertEquals(repoLayout.isDistinctiveDescriptorPathPattern(), distinctiveDescriptorPathPattern,
-                "Unexpected default distinctive descriptor path pattern.");
-        assertEquals(repoLayout.getDescriptorPathPattern(), descriptorPathPattern,
-                "Unexpected default descriptor path pattern.");
-        assertEquals(repoLayout.getFolderIntegrationRevisionRegExp(), folderIntegrationRevisionRegExp,
-                "Unexpected default folder integration revision regular expression.");
-        assertEquals(repoLayout.getFileIntegrationRevisionRegExp(), fileIntegrationRevisionRegExp,
-                "Unexpected default filer integration revision regular expression.");
-    }
-
-    private void assertTokenSetContents(String... expectedContents) {
-        for (String expectedContent : expectedContents) {
-            assertTrue(RepoLayoutUtils.TOKENS.contains(expectedContent),
-                    "Default layout token set should contain '" + expectedContent + "'");
-        }
-    }
-
-    private void testReservedRepoLayoutName(String expectedName) {
-        assertTrue(RepoLayoutUtils.isReservedName(expectedName), "'" + expectedName +
-                "' should be a reserved layout name.");
-    }
-
-    private void testGeneratedPatternRegExp(RepoLayout repoLayout, String pattern, String expectedRegExp) {
-        testGeneratedPatternRegExp(repoLayout, pattern, expectedRegExp, false);
-    }
-
-    private void testGeneratedPatternRegExp(RepoLayout repoLayout, String pattern, String expectedRegExp,
-            boolean failOnUnknownToken) {
-        assertEquals(RepoLayoutUtils.generateRegExpFromPattern(repoLayout, pattern, failOnUnknownToken), expectedRegExp,
-                "Unexpected converted path pattern regular expression.");
-    }
-
-    private void testTokenFilterAssociation(String token, boolean shouldHaveFilter) {
-        boolean tokenHasFilter = RepoLayoutUtils.tokenHasFilter(token);
-        if (shouldHaveFilter) {
-            assertTrue(tokenHasFilter, "Expected token to have a filter.");
-        } else {
-            assertFalse(tokenHasFilter, "Unexpected token filter.");
-        }
-    }
-
-    private void testArtifactLayoutAsIvyPattern(RepoLayout repoLayout, String expectedPattern) {
-        assertEquals(RepoLayoutUtils.getArtifactLayoutAsIvyPattern(repoLayout), expectedPattern,
-                "Unexpected converted ivy pattern.");
-    }
-
-    private void testDescriptorLayoutAsIvyPattern(RepoLayout repoLayout, String expectedPattern) {
-        assertEquals(RepoLayoutUtils.getDescriptorLayoutAsIvyPattern(repoLayout), expectedPattern,
-                "Unexpected converted ivy pattern.");
-    }
-
-    private void testWrappedKeywords(String keywordToWrapped, String expectedWrappedValue) {
-        assertEquals(RepoLayoutUtils.wrapKeywordAsToken(keywordToWrapped), expectedWrappedValue,
-                "Unexpected wrapped token value.");
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/util/StringsTest.java b/base/config/src/test/java/org/artifactory/util/StringsTest.java
deleted file mode 100644
index 053d27c..0000000
--- a/base/config/src/test/java/org/artifactory/util/StringsTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Tests {@link org.artifactory.util.Strings}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class StringsTest {
-    public void maskString() {
-        assertEquals(Strings.mask("dogs"), "****");
-    }
-
-    public void maskNull() {
-        assertEquals(Strings.mask(null), "");
-    }
-
-    public void maskEmpty() {
-        assertEquals(Strings.mask(""), "");
-    }
-
-    public void maskKeyValue() {
-        assertEquals(Strings.maskKeyValue("good=freedom"), "good=*******");
-    }
-
-    public void maskKeyValueNoEquals() {
-        assertEquals(Strings.maskKeyValue("dogs"), "dogs");
-    }
-
-    public void maskKeyValueNull() {
-        assertEquals(Strings.maskKeyValue(null), "");
-    }
-
-    public void maskKeyValueEmpty() {
-        assertEquals(Strings.maskKeyValue(""), "");
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/version/ArtifactoryConfigVersionTest.java b/base/config/src/test/java/org/artifactory/version/ArtifactoryConfigVersionTest.java
deleted file mode 100644
index 46ba580..0000000
--- a/base/config/src/test/java/org/artifactory/version/ArtifactoryConfigVersionTest.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version;
-
-/**
- * Tests the ArtifactoryConfigVersion.
- *
- * @author Yossi Shaul
- */
-public class ArtifactoryConfigVersionTest extends VersionTest {
-    @Override
-    protected SubConfigElementVersion[] getVersions() {
-        return ArtifactoryConfigVersion.values();
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/version/ArtifactoryVersionReaderTest.java b/base/config/src/test/java/org/artifactory/version/ArtifactoryVersionReaderTest.java
deleted file mode 100644
index 5ba2edc..0000000
--- a/base/config/src/test/java/org/artifactory/version/ArtifactoryVersionReaderTest.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version;
-
-import ch.qos.logback.classic.Level;
-import org.artifactory.test.TestUtils;
-import org.testng.Assert;
-import org.testng.annotations.AfterTest;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.InputStream;
-import java.net.URL;
-
-/**
- * Tests the ArtifactoryVersionReader.
- *
- * @author Yossi Shaul
- */
- at Test
-public class ArtifactoryVersionReaderTest {
-
-    public void readFromFileNoTimestamp() {
-        URL resource = getClass().getResource("/version/artifactory1.2.5.properties");
-        String fileName = resource.getFile();
-        CompoundVersionDetails version = ArtifactoryVersionReader.read(new File(fileName));
-        Assert.assertNotNull(version, "Version should have been resolved");
-        Assert.assertEquals(version.getVersion(), ArtifactoryVersion.v125, "Unexpected version");
-        Assert.assertEquals(version.getTimestamp(), 0, "Unexpected timestamp");
-    }
-
-    public void readFromStreamNoTimestamp() {
-        InputStream propertiesFileStream = getClass().getResourceAsStream("/version/artifactory1.2.5.properties");
-        CompoundVersionDetails version = ArtifactoryVersionReader.read(propertiesFileStream);
-        Assert.assertNotNull(version, "Version should have been resolved");
-        Assert.assertEquals(version.getVersion(), ArtifactoryVersion.v125, "Unexpected version");
-    }
-
-    public void readFromStreamWithTimestamp() {
-        InputStream in = createInputStream("9.5", 123456, 789456);
-        CompoundVersionDetails version = ArtifactoryVersionReader.read(in);
-        Assert.assertNotNull(version, "Version should have been resolved");
-        ArtifactoryVersion[] versions = ArtifactoryVersion.values();
-        Assert.assertEquals(version.getVersion(), versions[versions.length - 2], "Unexpected version");
-        Assert.assertEquals(version.getTimestamp(), 789456, "Unexpected version");
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void failIfNullStream() {
-        ArtifactoryVersionReader.read((File) null);
-    }
-
-    public void readCurrentVersion() {
-        ArtifactoryVersion current = ArtifactoryVersion.getCurrent();
-        InputStream in = createInputStream(current.getValue(), current.getRevision());
-        CompoundVersionDetails result = ArtifactoryVersionReader.read(in);
-        Assert.assertEquals(result.getVersion(), current);
-    }
-
-    public void readDevelopmentVersion() {
-        InputStream in = createInputStream("${project.version}", 123);
-        CompoundVersionDetails result = ArtifactoryVersionReader.read(in);
-        Assert.assertEquals(result.getVersion(), ArtifactoryVersion.getCurrent(),
-                "Development version should always be the current version");
-    }
-
-    public void notExistingFutureVersion() {
-        InputStream in = createInputStream("6.7.8.8", 123789);
-        CompoundVersionDetails result = ArtifactoryVersionReader.read(in);
-        Assert.assertNotNull(result, "Got null result but expected the one before current version to be returned");
-        ArtifactoryVersion[] versions = ArtifactoryVersion.values();
-        Assert.assertEquals(result.getVersion(), versions[versions.length - 2],
-                "Expected the latest released version to be returned");
-    }
-
-    private InputStream createInputStream(String version, long revision) {
-        return new ByteArrayInputStream(String.format("artifactory.version=%s%n" +
-                "artifactory.revision=%s%n", version, revision).getBytes());
-    }
-
-    private InputStream createInputStream(String version, int revision, long timestamp) {
-        return new ByteArrayInputStream(String.format(
-                "artifactory.version=%s%n" +
-                        "artifactory.revision=%s%n" +
-                        "artifactory.timestamp=%s%n", version, revision, timestamp).getBytes());
-    }
-
-    @BeforeClass
-    public void setup() {
-        TestUtils.setLoggingLevel(ArtifactoryVersionReader.class, Level.ERROR);
-    }
-
-    @AfterTest
-    public void tearDown() {
-        TestUtils.setLoggingLevel(ArtifactoryVersionReader.class, Level.INFO);
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/version/ConfigVersionTest.java b/base/config/src/test/java/org/artifactory/version/ConfigVersionTest.java
deleted file mode 100644
index 09ceb1b..0000000
--- a/base/config/src/test/java/org/artifactory/version/ConfigVersionTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version;
-
-import org.testng.annotations.Test;
-
-/**
- * @author freds
- * @date Nov 23, 2008
- */
- at Test
-public class ConfigVersionTest extends VersionTest {
-
-    @Override
-    protected SubConfigElementVersion[] getVersions() {
-        return ConfigVersion.values();
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/version/ConfigXmlConversionTest.java b/base/config/src/test/java/org/artifactory/version/ConfigXmlConversionTest.java
deleted file mode 100644
index 5e446b5..0000000
--- a/base/config/src/test/java/org/artifactory/version/ConfigXmlConversionTest.java
+++ /dev/null
@@ -1,454 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.property.ArtifactorySystemProperties;
-import org.artifactory.descriptor.backup.BackupDescriptor;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.config.CentralConfigDescriptorImpl;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.descriptor.repo.*;
-import org.artifactory.descriptor.security.EncryptionPolicy;
-import org.artifactory.descriptor.security.PasswordSettings;
-import org.artifactory.descriptor.security.SecurityDescriptor;
-import org.artifactory.descriptor.security.ldap.LdapSetting;
-import org.artifactory.descriptor.security.ldap.SearchPattern;
-import org.artifactory.descriptor.security.ldap.group.LdapGroupSetting;
-import org.artifactory.test.ArtifactoryHomeStub;
-import org.artifactory.test.TestUtils;
-import org.artifactory.util.RepoLayoutUtils;
-import org.artifactory.version.converter.XmlConverter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.Test;
-
-import javax.xml.XMLConstants;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.Unmarshaller;
-import javax.xml.validation.Schema;
-import javax.xml.validation.SchemaFactory;
-import java.io.InputStream;
-import java.io.StringReader;
-import java.net.InetAddress;
-import java.net.URL;
-import java.net.UnknownHostException;
-import java.util.*;
-
-import static org.artifactory.common.ConstantValues.substituteRepoKeys;
-import static org.artifactory.version.ArtifactoryConfigVersion.*;
-import static org.testng.Assert.*;
-
-/**
- * @author freds
- * @author Yossi Shaul
- */
- at Test
-public class ConfigXmlConversionTest /** Don't extend ArtHomeBoundTest */
-{
-    private static final Logger log = LoggerFactory.getLogger(ConfigXmlConversionTest.class);
-
-    public void convert100() throws Exception {
-        ArtifactoryHomeStub artifactory = new ArtifactoryHomeStub();
-        ArtifactoryHome.bind(artifactory);
-
-        Properties propTest = new Properties();
-        propTest.setProperty(substituteRepoKeys.getPropertyName() + "3rdp-releases", "third-party-releases");
-        propTest.setProperty(substituteRepoKeys.getPropertyName() + "3rdp-snapshots", "third-party-snapshots");
-        propTest.setProperty(substituteRepoKeys.getPropertyName() + "3rd-party", "third-party");
-        // load the repo key substitute
-        Map<String, String> subs = (Map<String, String>) TestUtils.invokeStaticMethod(
-                ArtifactorySystemProperties.class, "fillRepoKeySubstitute",
-                new Class[]{Properties.class}, new Object[]{propTest});
-        assertEquals(subs.size(), 3);
-        TestUtils.setField(artifactory.getArtifactoryProperties(), "substituteRepoKeys", subs);
-
-        // convert the default config
-        CentralConfigDescriptor cc = transform("/config/install/config.1.0.0.xml", v100);
-        assertNotNull(cc.getSecurity());
-        assertTrue(cc.getSecurity().isAnonAccessEnabled(), "Annon access should be enabled by default");
-
-        // convert custom config
-        cc = transform("/config/test/config.1.0.0.xml", v100);
-        assertFalse(cc.getSecurity().isAnonAccessEnabled());
-        Map<String, LocalRepoDescriptor> localRepos = cc.getLocalRepositoriesMap();
-
-        LocalRepoDescriptor frogReleases = localRepos.get("frog-releases");
-        assertEquals(frogReleases.getSnapshotVersionBehavior(), SnapshotVersionBehavior.DEPLOYER,
-                "Should have been converted from 'true' to 'deployer'");
-
-        LocalRepoDescriptor frogSnapshots = localRepos.get("frog-snapshots");
-        assertEquals(frogSnapshots.getSnapshotVersionBehavior(), SnapshotVersionBehavior.NONUNIQUE,
-                "Should have been converted from 'false' to 'non-unique'");
-
-        LocalRepoDescriptor pluginsReleases = localRepos.get("plugins-releases");
-        assertEquals(pluginsReleases.getSnapshotVersionBehavior(), SnapshotVersionBehavior.UNIQUE,
-                "Should have kept the default");
-        ArtifactoryHome.unbind();
-    }
-
-    public void convert100NoBackupCron() throws Exception {
-        ArtifactoryHome.bind(new ArtifactoryHomeStub());
-        CentralConfigDescriptor cc = transform("/config/test/config.1.0.0_no-backup-cron.xml", v100);
-        assertNotNull(cc.getBackups());
-        assertTrue(cc.getBackups().isEmpty());
-        ArtifactoryHome.unbind();
-    }
-
-    public void convert110() throws Exception {
-        ArtifactoryHome.bind(new ArtifactoryHomeStub());
-        CentralConfigDescriptor cc =
-                transform("/config/install/config.1.1.0.xml", v110);
-        assertNotNull(cc.getSecurity());
-        assertTrue(cc.getSecurity().isAnonAccessEnabled());
-        cc = transform("/config/test/config.1.1.0.xml", v110);
-        assertTrue(cc.getSecurity().isAnonAccessEnabled());
-        ArtifactoryHome.unbind();
-    }
-
-    public void convert120() throws Exception {
-        ArtifactoryHome.bind(new ArtifactoryHomeStub());
-        CentralConfigDescriptor cc = transform("/config/install/config.1.2.0.xml", v120);
-        assertFalse(cc.getSecurity().isAnonAccessEnabled());
-        cc = transform("/config/test/config.1.2.0.xml", v120);
-        assertTrue(cc.getSecurity().isAnonAccessEnabled());
-        ArtifactoryHome.unbind();
-    }
-
-    public void convert130() throws Exception {
-        ArtifactoryHome.bind(new ArtifactoryHomeStub());
-        CentralConfigDescriptor cc = transform("/config/install/config.1.3.0.xml", v130);
-        assertFalse(cc.getSecurity().isAnonAccessEnabled());
-        cc = transform("/config/test/config.1.3.0.xml", v130);
-        assertNotNull(cc.getSecurity());
-        assertTrue(cc.getSecurity().isAnonAccessEnabled());
-        ArtifactoryHome.unbind();
-    }
-
-    public void convert131() throws Exception {
-        ArtifactoryHome.bind(new ArtifactoryHomeStub());
-        CentralConfigDescriptor cc = transform("/config/install/config.1.3.1.xml", v131);
-        assertTrue(cc.getSecurity().isAnonAccessEnabled());
-        assertNotNull(cc.getSecurity().getLdapSettings());
-
-        cc = transform("/config/test/config.1.3.1.xml", v131);
-        assertFalse(cc.getSecurity().isAnonAccessEnabled());
-        assertNotNull(cc.getSecurity().getLdapSettings());
-        assertEquals(cc.getSecurity().getLdapSettings().size(), 1);
-        ArtifactoryHome.unbind();
-    }
-
-    public void convert132Install() throws Exception {
-        ArtifactoryHome.bind(new ArtifactoryHomeStub());
-        CentralConfigDescriptor cc = transform("/config/install/config.1.3.2.xml", v132);
-        List<BackupDescriptor> backups = cc.getBackups();
-        assertEquals(backups.size(), 1);
-
-        // check backups conversion
-        BackupDescriptor backup = backups.get(0);
-        assertEquals(backup.getKey(), "backup1", "Unexpected backup key generated");
-        assertTrue(backup.isEnabled(), "All existing backups should be enabled");
-        ArtifactoryHome.unbind();
-    }
-
-    public void convert132Custom() throws Exception {
-        ArtifactoryHome.bind(new ArtifactoryHomeStub());
-        CentralConfigDescriptor cc = transform("/config/test/config.1.3.2.xml", v132);
-
-        // check backups conversion
-        List<BackupDescriptor> backups = cc.getBackups();
-        assertEquals(backups.size(), 1, "Should have removed the second backup (no cronExp)");
-        BackupDescriptor backup = backups.get(0);
-        assertEquals(backup.getKey(), "backup1", "Unexpected backup key generated");
-        assertTrue(backup.isEnabled(), "All existing backups should be enabled");
-
-        // check ldap settings conversion
-        List<LdapSetting> ldaps = cc.getSecurity().getLdapSettings();
-        assertNotNull(ldaps);
-        assertEquals(ldaps.size(), 3);
-        LdapSetting ldap1 = ldaps.get(0);
-        assertEquals(ldap1.getKey(), "ldap1");
-        assertEquals(ldap1.getLdapUrl(), "ldap://mydomain:389/dc=jfrog,dc=org");
-        assertEquals(ldap1.getUserDnPattern(), "uid={0}, ou=People");
-        assertNull(ldap1.getSearch());
-
-        LdapSetting ldap3 = ldaps.get(2);
-        assertEquals(ldap3.getKey(), "ldap3");
-        assertEquals(ldap3.getLdapUrl(), "ldap://mydomain:389/dc=jfrog,dc=org");
-        assertEquals(ldap3.getLdapUrl(), "ldap://mydomain:389/dc=jfrog,dc=org");
-        assertNull(ldap3.getUserDnPattern());
-        SearchPattern search = ldap3.getSearch();
-        assertNotNull(search);
-        assertEquals(search.getSearchFilter(), "uid");
-        assertEquals(search.getSearchBase(), "ou=Mice");
-        assertFalse(search.isSearchSubTree());
-        assertEquals(search.getManagerDn(), "koko");
-        assertEquals(search.getManagerPassword(), "loko");
-        ArtifactoryHome.unbind();
-    }
-
-    public void convert132WithNoSchemaLocation() throws Exception {
-        ArtifactoryHome.bind(new ArtifactoryHomeStub());
-        CentralConfigDescriptor cc = transform("/config/test/config.1.3.2_no-location.xml", v132);
-        assertTrue(cc.getSecurity().isAnonAccessEnabled());
-        assertEquals(cc.getFileUploadMaxSizeMb(), 100);
-        ArtifactoryHome.unbind();
-    }
-
-    public void convert134Install() throws Exception {
-        ArtifactoryHome.bind(new ArtifactoryHomeStub());
-        CentralConfigDescriptor cc = transform("/config/install/config.1.3.4.xml", v134);
-
-        // PasswordSettings were added in 1.3.5 - no converter was needed as this is not
-        // a required tag and we can use the default
-        PasswordSettings passwordSettings = cc.getSecurity().getPasswordSettings();
-        assertNotNull(passwordSettings, "Passwords settings should not be null");
-        assertEquals(passwordSettings.getEncryptionPolicy(), EncryptionPolicy.SUPPORTED,
-                "If the default was changed, a converter needs to do it!");
-        ArtifactoryHome.unbind();
-    }
-
-    public void convert135Install() throws Exception {
-        ArtifactoryHome.bind(new ArtifactoryHomeStub());
-        CentralConfigDescriptor cc = transform("/config/install/config.1.3.5.xml", v135);
-
-        // PropertySets were added in 1.3.6 - no converter was needed as this is not
-        // a required tag and we can use the default
-        List<PropertySet> propertySets = cc.getPropertySets();
-        assertNotNull(propertySets, "Property sets should not be null.");
-        assertTrue(propertySets.isEmpty(), "Property sets list should be empty by default.");
-
-        // keypair (no conversion needed)
-        VirtualRepoDescriptor virtualRepo = cc.getVirtualRepositoriesMap().values().iterator().next();
-        assertNull(virtualRepo.getKeyPair(), "Keypair should be null");
-        ArtifactoryHome.unbind();
-    }
-
-    public void convert135ProxyWithDomain() throws Exception {
-        ArtifactoryHome.bind(new ArtifactoryHomeStub());
-        CentralConfigDescriptor cc = transform("/config/test/config.1.3.5_proxy-with-domain.xml", v135);
-
-        List<ProxyDescriptor> proxies = cc.getProxies();
-        ProxyDescriptor proxy = proxies.get(0);
-        if (!"nt-proxy".equals(proxy.getKey())) {
-            proxy = proxies.get(1);
-        }
-        try {
-            assertEquals(proxy.getNtHost(), InetAddress.getLocalHost().getHostName(), "Wrong hostname");
-        } catch (UnknownHostException e) {
-            // in some cases (missing entry /etc/hosts) getLocalHost throws exception. prefer to ignore here
-        }
-        ArtifactoryHome.unbind();
-    }
-
-    public void convert140DefaultProxy() throws Exception {
-        ArtifactoryHome.bind(new ArtifactoryHomeStub());
-        CentralConfigDescriptor cc = transform("/config/test/config.1.4.0_default-proxy.xml", v140);
-
-        List<ProxyDescriptor> proxies = cc.getProxies();
-        ProxyDescriptor proxy = proxies.get(0);
-        assertTrue(proxy.isDefaultProxy(), "Proxy not default");
-        ArtifactoryHome.unbind();
-    }
-
-    public void convert141() throws Exception {
-        ArtifactoryHome.bind(new ArtifactoryHomeStub());
-        CentralConfigDescriptor cc = transform("/config/install/config.1.4.1.xml", v141);
-        assertNull(cc.getLocalRepositoriesMap().get("libs-releases-local").getExcludesPattern());
-        assertEquals(cc.getRemoteRepositoriesMap().get("java.net.m2").getExcludesPattern(), "commons-*,org/apache/**");
-        assertEquals(cc.getRemoteRepositoriesMap().get("java.net.m2").getIncludesPattern(), "**/*");
-        assertEquals(cc.getRemoteRepositoriesMap().get("codehaus").getIncludesPattern(), "org/**,com/**,net/**");
-        assertEquals(cc.getRemoteRepositoriesMap().get("codehaus").getExcludesPattern(),
-                "org/apache/**,commons-*,org/artifactory/**,org/jfrog/**");
-        assertEquals(cc.getVirtualRepositoriesMap().get("libs-releases").getIncludesPattern(), "**/*");
-        assertNull(cc.getVirtualRepositoriesMap().get("libs-releases").getExcludesPattern());
-        ArtifactoryHome.unbind();
-    }
-
-    public void convert141Custom() throws Exception {
-        ArtifactoryHome.bind(new ArtifactoryHomeStub());
-        CentralConfigDescriptor cc =
-                transform("/config/test/config.1.4.1_with_type.xml", v141);
-
-        assertEquals(cc.getLocalRepositoriesMap().get("libs-snapshots-local").getIncludesPattern(), "org/jfrog/**");
-        assertNull(cc.getLocalRepositoriesMap().get("libs-snapshots-local").getExcludesPattern());
-        assertEquals(cc.getRemoteRepositoriesMap().get("jfrog-libs").getExcludesPattern(), "org/apache/maven/**");
-        ArtifactoryHome.unbind();
-    }
-
-    public void convert142Custom() throws Exception {
-        ArtifactoryHome.bind(new ArtifactoryHomeStub());
-        CentralConfigDescriptor cc = transform("/config/test/config.1.4.2_with_checksum_policy.xml",
-                v142);
-        assertEquals(cc.getRemoteRepositoriesMap().get("repo1").getChecksumPolicyType(),
-                ChecksumPolicyType.GEN_IF_ABSENT);
-        ArtifactoryHome.unbind();
-    }
-
-
-    public void convert143() throws Exception {
-        ArtifactoryHome.bind(new ArtifactoryHomeStub());
-        CentralConfigDescriptor cc = transform("/config/install/config.1.4.3.xml", v143);
-        SecurityDescriptor securityDescriptor = cc.getSecurity();
-        List<LdapSetting> ldapSettings = securityDescriptor.getLdapSettings();
-        assertEquals(ldapSettings.size(), 0, "Should not have any LDAP settings configured");
-
-        List<LdapGroupSetting> ldapGroupSettings = securityDescriptor.getLdapGroupSettings();
-        assertEquals(ldapGroupSettings.size(), 0, "Should not have any LDAP group settings configured");
-        ArtifactoryHome.unbind();
-    }
-
-    public void convert143custom() throws Exception {
-        ArtifactoryHome.bind(new ArtifactoryHomeStub());
-        CentralConfigDescriptor cc = transform("/config/test/config.1.4.3_without_multildap.xml", v143);
-        List<LdapGroupSetting> ldapGroupSettings = cc.getSecurity().getLdapGroupSettings();
-        for (LdapGroupSetting ldapGroupSetting : ldapGroupSettings) {
-            assertEquals(ldapGroupSetting.getEnabledLdap(), "myldap");
-        }
-        ArtifactoryHome.unbind();
-    }
-
-    public void convert143WithServerId() throws Exception {
-        ArtifactoryHome.bind(new ArtifactoryHomeStub());
-        // just removes an element, so if it passes it's ok
-        transform("/config/test/config.1.4.3_with_serverId.xml", v143);
-        ArtifactoryHome.unbind();
-    }
-
-    public void convert146() throws Exception {
-        ArtifactoryHome.bind(new ArtifactoryHomeStub());
-        CentralConfigDescriptor descriptor = transform("/config/test/config.1.4.6_wrong_url.xml", v146);
-
-        //Checks global repo layout definitions were added
-        List<RepoLayout> globalRepoLayouts = descriptor.getRepoLayouts();
-        assertNotNull(globalRepoLayouts, "Expected to find default global repo layouts after the conversion.");
-        assertFalse(globalRepoLayouts.isEmpty(), "Expected to find default global repo layouts after the conversion.");
-
-        assertTrue(EqualsBuilder.reflectionEquals(globalRepoLayouts.get(0), RepoLayoutUtils.MAVEN_2_DEFAULT),
-                "Expected first global repo layout to be Maven 2 default.");
-
-        assertTrue(EqualsBuilder.reflectionEquals(globalRepoLayouts.get(1), RepoLayoutUtils.IVY_DEFAULT),
-                "Expected second global repo layout to be Ivy default.");
-
-        assertTrue(EqualsBuilder.reflectionEquals(globalRepoLayouts.get(2), RepoLayoutUtils.GRADLE_DEFAULT),
-                "Expected third global repo layout to be Gradle default.");
-
-        assertTrue(EqualsBuilder.reflectionEquals(globalRepoLayouts.get(3), RepoLayoutUtils.MAVEN_1_DEFAULT),
-                "Expected fourth global repo layout to be Maven 1 default.");
-
-        //Checks local repo layout definitions were added
-        for (Map.Entry<String, LocalRepoDescriptor> localEntry : descriptor.getLocalRepositoriesMap().entrySet()) {
-            assertTrue(EqualsBuilder.reflectionEquals(localEntry.getValue().getRepoLayout(),
-                    RepoLayoutUtils.MAVEN_2_DEFAULT), "Expected default repo ('" + localEntry.getKey() +
-                    "') layout to be Maven 2 default.");
-        }
-
-        //Checks remote repo layout definitions were added
-        for (Map.Entry<String, RemoteRepoDescriptor> remoteEntry : descriptor.getRemoteRepositoriesMap().entrySet()) {
-            String repoKey = remoteEntry.getKey();
-            RemoteRepoDescriptor remoteDescriptor = remoteEntry.getValue();
-            assertTrue(EqualsBuilder.reflectionEquals(remoteDescriptor.getRepoLayout(),
-                    RepoLayoutUtils.MAVEN_2_DEFAULT), "Expected default repo ('" + repoKey +
-                    "') layout to be Maven 2 default.");
-
-            if ("java.net.m1".equals(repoKey)) {
-                assertTrue(EqualsBuilder.reflectionEquals(remoteDescriptor.getRemoteRepoLayout(),
-                        RepoLayoutUtils.MAVEN_1_DEFAULT), "Expected default remote repo ('" + repoKey +
-                        "') layout to be Maven 1 default.");
-            }
-        }
-        ArtifactoryHome.unbind();
-    }
-
-    // TORE: rename the method and config - they aren't for 1.5.0
-    public void convert150custom() throws Exception {
-        ArtifactoryHome.bind(new ArtifactoryHomeStub());
-        CentralConfigDescriptor cc = transform("/config/test/config.1.5.0_indexing.xml", v1411);
-        assertEquals(cc.getIndexer().getCronExp(), "0 23 5 * * ?");
-        ArtifactoryHome.unbind();
-    }
-
-    public void convert1412custom() throws Exception {
-        ArtifactoryHome.bind(new ArtifactoryHomeStub());
-        CentralConfigDescriptor cc = transform("/config/test/config.1.4.12_failed_retrieval_cache.xml", v1412);
-        RemoteRepoDescriptor repo = cc.getRemoteRepositoriesMap().get("java.net.m2");
-        assertEquals(repo.getAssumedOfflinePeriodSecs(), 300);
-        ArtifactoryHome.unbind();
-    }
-
-    public void configVersionSanityCheck() {
-        ArtifactoryHome.bind(new ArtifactoryHomeStub());
-        ArtifactoryConfigVersion[] versions = values();
-        Set<XmlConverter> allConversions = new HashSet<XmlConverter>();
-        ArtifactoryConfigVersion configVersionTest = null;
-        for (ArtifactoryConfigVersion configVersion : versions) {
-            XmlConverter[] versionConversions = configVersion.getConverters();
-            for (XmlConverter converter : versionConversions) {
-                assertFalse(allConversions.contains(converter), "XML Converter element can only be used once!\n" +
-                        "XML Converter " + converter + " is used in " + configVersion + " but was already used.");
-                allConversions.add(converter);
-            }
-            configVersionTest = configVersion;
-        }
-
-        boolean configNotCurrent = configVersionTest != getCurrentVersion();
-        assertFalse(configNotCurrent, "The last config version " + configVersionTest +
-                " is not the current one " + getCurrentVersion());
-
-        // The last should not have any conversion
-        XmlConverter[] currentConversions = getCurrentVersion().getConverters();
-        boolean noConversionsLeft = (currentConversions != null) && (currentConversions.length > 0);
-        assertFalse(noConversionsLeft, "The last config version " + configVersionTest +
-                " should not have any conversions declared");
-        ArtifactoryHome.unbind();
-    }
-
-    /**
-     * @param textXml The configuration as string
-     * @param version Version of the passed configuration
-     * @return Result central config
-     */
-    private CentralConfigDescriptor transform(String textXml, ArtifactoryConfigVersion version)
-            throws Exception {
-        InputStream is = getClass().getResourceAsStream(textXml);
-        String originalXmlString = IOUtils.toString(is, "utf-8");
-        ArtifactoryConfigVersion foundConfigVersion = getConfigVersion(originalXmlString);
-        assertEquals(version, foundConfigVersion);
-        String finalConfigXml = version.convert(originalXmlString);
-        log.debug("Converted:\n{}\nto:\n{}", originalXmlString, finalConfigXml);
-        return getConfigValid(finalConfigXml);
-    }
-
-    private CentralConfigDescriptor getConfigValid(String configXml) throws Exception {
-        JAXBContext context = JAXBContext.newInstance(CentralConfigDescriptorImpl.class);
-        Unmarshaller unmarshaller = context.createUnmarshaller();
-        SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
-        URL xsdUrl = getClass().getResource("/artifactory.xsd");
-        Schema schema = sf.newSchema(xsdUrl);
-        unmarshaller.setSchema(schema);
-        return (CentralConfigDescriptor) unmarshaller.unmarshal(new StringReader(configXml));
-    }
-
-    private ArtifactoryConfigVersion getCurrentVersion() {
-        ArtifactoryConfigVersion[] artifactoryConfigVersions = values();
-        return artifactoryConfigVersions[artifactoryConfigVersions.length - 1];
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/version/VersionTest.java b/base/config/src/test/java/org/artifactory/version/VersionTest.java
deleted file mode 100644
index 3dc139f..0000000
--- a/base/config/src/test/java/org/artifactory/version/VersionTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Base class for tests shared by all SubConfigElementVersions.
- *
- * @author Yossi Shaul
- */
-public abstract class VersionTest {
-
-    @Test
-    public void versionsCoverage() {
-        // Check that all Artifactory versions are covered by a DB version
-        SubConfigElementVersion[] versions = getVersions();
-        Assert.assertTrue(versions.length > 0);
-        assertEquals(versions[0].getComparator().getFrom(), getFirstSupportedArtifactoryVersion(),
-                "First version should start at first supported Artifactory version");
-        assertEquals(versions[versions.length - 1].getComparator().getUntil(), ArtifactoryVersion.getCurrent(),
-                "Last version should be the current one");
-        for (int i = 0; i < versions.length; i++) {
-            SubConfigElementVersion version = versions[i];
-            if (i + 1 < versions.length) {
-                assertEquals(version.getComparator().getUntil().ordinal(),
-                        versions[i + 1].getComparator().getFrom().ordinal() - 1,
-                        "Versions should have full coverage and leave no holes in the list of Artifactory versions");
-            }
-        }
-    }
-
-    protected ArtifactoryVersion getFirstSupportedArtifactoryVersion() {
-        return ArtifactoryVersion.v122rc0;
-    }
-
-    protected abstract SubConfigElementVersion[] getVersions();
-}
diff --git a/base/config/src/test/java/org/artifactory/version/converter/v135/ProxyNTHostConverterTest.java b/base/config/src/test/java/org/artifactory/version/converter/v135/ProxyNTHostConverterTest.java
deleted file mode 100644
index 4bbde23..0000000
--- a/base/config/src/test/java/org/artifactory/version/converter/v135/ProxyNTHostConverterTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v135;
-
-import org.artifactory.convert.XmlConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import java.net.InetAddress;
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the ProxyNTHostConverter.
- *
- * @author Yossi Shaul
- */
- at Test
-public class ProxyNTHostConverterTest extends XmlConverterTest {
-
-    public void convertConfigWithProxyDomain() throws Exception {
-        Document doc = convertXml("/config/test/config.1.3.5_proxy-with-domain.xml",
-                new ProxyNTHostConverter());
-
-        Element root = doc.getRootElement();
-        Namespace ns = root.getNamespace();
-
-        List proxies = root.getChild("proxies", ns).getChildren();
-        Element proxyWithoutDomain = (Element) proxies.get(0);
-        assertNull(proxyWithoutDomain.getChild("ntHost"), "NTHost element should not exist");
-
-        Element proxyWithDomain = (Element) proxies.get(1);
-        Element ntHost = proxyWithDomain.getChild("ntHost", ns);
-        assertNotNull(ntHost, "NTHost element should have been added");
-        assertEquals(ntHost.getText(), InetAddress.getLocalHost().getHostName(),
-                "Should have set the hostname to localhost");
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/version/converter/v141/ProxyDefaultConverterTest.java b/base/config/src/test/java/org/artifactory/version/converter/v141/ProxyDefaultConverterTest.java
deleted file mode 100644
index 53f371e..0000000
--- a/base/config/src/test/java/org/artifactory/version/converter/v141/ProxyDefaultConverterTest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v141;
-
-import org.artifactory.convert.XmlConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-/**
- * @author Tomer Cohen
- */
-public class ProxyDefaultConverterTest extends XmlConverterTest {
-
-    @Test
-    public void covertRemoteRepositoriesWithDefaultProxy() throws Exception {
-        Document doc = convertXml("/config/test/config.1.4.0_default-proxy.xml",
-                new ProxyDefaultConverter());
-        Element root = doc.getRootElement();
-        Namespace ns = root.getNamespace();
-        Element proxies = root.getChild("proxies", ns);
-        List proxy = proxies.getChildren();
-        Element defaultProxy = (Element) proxy.get(0);
-        Element isDefaultProxy = defaultProxy.getChild("defaultProxy", ns);
-        Assert.assertNotNull(isDefaultProxy);
-        Assert.assertEquals(isDefaultProxy.getText(), "true");
-    }
-
-}
diff --git a/base/config/src/test/java/org/artifactory/version/converter/v1410/GcSystemPropertyConverterTest.java b/base/config/src/test/java/org/artifactory/version/converter/v1410/GcSystemPropertyConverterTest.java
deleted file mode 100644
index b10e35e..0000000
--- a/base/config/src/test/java/org/artifactory/version/converter/v1410/GcSystemPropertyConverterTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v1410;
-
-import org.artifactory.convert.XmlConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-
-/**
- * @author Noam Y. Tenne
- */
-public class GcSystemPropertyConverterTest extends XmlConverterTest {
-
-    @Test
-    public void testCreateDefaultGcInterval() throws Exception {
-        Document document = convertXml("/config/test/config.1.4.9.no.gc.xml", new GcSystemPropertyConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        Element gcConfigElement = rootElement.getChild("gcConfig", namespace);
-
-        assertNotNull(gcConfigElement, "Expected to find a GC configuration element.");
-
-        String cronExp = gcConfigElement.getChildText("cronExp", namespace);
-        assertEquals(cronExp, "0 0 /4 * * ?", "Unexpected default GC cron exp");
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/version/converter/v1412/IndexerCronExpPropertyConverterTest.java b/base/config/src/test/java/org/artifactory/version/converter/v1412/IndexerCronExpPropertyConverterTest.java
deleted file mode 100644
index 8be0b02..0000000
--- a/base/config/src/test/java/org/artifactory/version/converter/v1412/IndexerCronExpPropertyConverterTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v1412;
-
-import org.artifactory.convert.XmlConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests indexer cron expression config property converter
- *
- * @author Shay Yaakov
- */
-public class IndexerCronExpPropertyConverterTest extends XmlConverterTest {
-
-    @Test
-    public void testReplacingIntervalByCronExp() throws Exception {
-        Document document = convertXml("/config/test/config.1.4.9.no.gc.xml", new IndexerCronExpPropertyConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        Element indexerElement = rootElement.getChild("indexer", namespace);
-        assertNotNull(indexerElement, "Expected to find an indexer configuration element.");
-
-        Element cronExpElement = indexerElement.getChild("cronExp", namespace);
-        assertNotNull(cronExpElement, "Expected to find cron expression 'cronExp' element.");
-
-        String cronExp = cronExpElement.getValue();
-        assertEquals(cronExp, "0 23 5 * * ?", "Unexpected default indexer cron exp");
-
-        Element intervalElement = indexerElement.getChild("indexingIntervalHours", namespace);
-        assertNull(intervalElement, "Expected interval hours element to be deleted.");
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/version/converter/v1414/ArchiveBrowsingConverterTest.java b/base/config/src/test/java/org/artifactory/version/converter/v1414/ArchiveBrowsingConverterTest.java
deleted file mode 100644
index bdadc8f..0000000
--- a/base/config/src/test/java/org/artifactory/version/converter/v1414/ArchiveBrowsingConverterTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v1414;
-
-import org.artifactory.convert.XmlConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertNull;
-
-/**
- * Tests the conversion done by {@link org.artifactory.version.converter.v1414.ArchiveBrowsingConverter}.
- *
- * @author Shay Yaakov
- */
- at Test
-public class ArchiveBrowsingConverterTest extends XmlConverterTest {
-
-    public void convertWithArchiveBrowsing() throws Exception {
-        Document document = convertXml("/config/test/config.1.4.13_with_archive_browsing.xml",
-                new ArchiveBrowsingConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        Element securityElement = rootElement.getChild("security", namespace);
-        assertNull(securityElement.getChild("archiveBrowsingEnabled", namespace),
-                "archiveBrowsingEnabled tag should have been removed");
-    }
-
-    public void convertDefault() throws Exception {
-        // the default doesn't contain archiveBrowsingEnabled tag
-        Document document = convertXml("/config/install/config.1.4.3.xml", new ArchiveBrowsingConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        Element securityElement = rootElement.getChild("security", namespace);
-        assertNull(securityElement.getChild("archiveBrowsingEnabled", namespace));
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/version/converter/v1414/AssumedOfflineConverterTest.java b/base/config/src/test/java/org/artifactory/version/converter/v1414/AssumedOfflineConverterTest.java
deleted file mode 100644
index 648d519..0000000
--- a/base/config/src/test/java/org/artifactory/version/converter/v1414/AssumedOfflineConverterTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v1414;
-
-import org.artifactory.convert.XmlConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the conversion done by {@link org.artifactory.version.converter.v1414.AssumedOfflineConverter}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class AssumedOfflineConverterTest extends XmlConverterTest {
-
-    public void defaultConfigTest() throws Exception {
-        Document document = convertXml("/config/install/config.1.4.12.xml", new AssumedOfflineConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        List remoteRepos = rootElement.getChild("remoteRepositories", namespace).getChildren();
-
-        for (Object o : remoteRepos) {
-            Element remoteRepo = (Element) o;
-            assertNull(remoteRepo.getChild("assumedOfflinePeriodSecs", namespace),
-                    "Should not add element if failed not exist");
-        }
-    }
-
-    public void withFailedRetrievalCache() throws Exception {
-        Document document = convertXml("/config/test/config.1.4.12_failed_retrieval_cache.xml",
-                new AssumedOfflineConverter());
-        debugContent(document);
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        List remoteRepos = rootElement.getChild("remoteRepositories", namespace).getChildren();
-
-        Element remote1Element = (Element) remoteRepos.get(0);
-        assertNull(remote1Element.getChild("assumedOfflinePeriodSecs", namespace),
-                "Should not add element if failed not exist");
-
-        Element remote2Element = (Element) remoteRepos.get(1);
-        assertNull(remote2Element.getChild("failedRetrievalCachePeriodSecs"), "Old element name should not exist");
-        Element assumedOfflinePeriod = remote2Element.getChild("assumedOfflinePeriodSecs", namespace);
-        assertNotNull(assumedOfflinePeriod, "Expected to find the converted element.");
-        assertEquals(assumedOfflinePeriod.getValue(), "300", "Unexpected default value");
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/version/converter/v1414/CleanupConfigConverterTest.java b/base/config/src/test/java/org/artifactory/version/converter/v1414/CleanupConfigConverterTest.java
deleted file mode 100644
index ad3ff32..0000000
--- a/base/config/src/test/java/org/artifactory/version/converter/v1414/CleanupConfigConverterTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v1414;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.convert.XmlConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertTrue;
-
-/**
- * Tests the unused artifacts cleanup converter
- *
- * @author Shay Yaakov
- */
- at Test
-public class CleanupConfigConverterTest extends XmlConverterTest {
-
-    public void testCreateCleanupCronExp() throws Exception {
-        Document document = convertXml("/config/test/config.1.4.9.no.gc.xml", new CleanupConfigConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        Element cleanupConfigElement = rootElement.getChild("cleanupConfig", namespace);
-
-        assertNotNull(cleanupConfigElement, "Expected to find a cleanup configuration element.");
-
-        String cronExp = cleanupConfigElement.getChildText("cronExp", namespace);
-        assertTrue(!StringUtils.isBlank(cronExp), "Expected cron exp field to have a valid value");
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/version/converter/v143/RemoteChecksumPolicyConverterTest.java b/base/config/src/test/java/org/artifactory/version/converter/v143/RemoteChecksumPolicyConverterTest.java
deleted file mode 100644
index 1ac9b73..0000000
--- a/base/config/src/test/java/org/artifactory/version/converter/v143/RemoteChecksumPolicyConverterTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v143;
-
-import org.artifactory.convert.XmlConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the {@link RemoteChecksumPolicyConverter}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class RemoteChecksumPolicyConverterTest extends XmlConverterTest {
-    public void convertConfigWithNoChecksumPolicyTags() throws Exception {
-        // just call the convert, nothing is expected to get changed
-        convertXml("/config/install/config.1.4.2.xml", new RemoteChecksumPolicyConverter());
-    }
-
-    public void convertConfigWithChecksumPolicyTags() throws Exception {
-        // just call the convert, nothing is expected to get changed
-        Document doc = convertXml("/config/test/config.1.4.2_with_checksum_policy.xml",
-                new RemoteChecksumPolicyConverter());
-
-        Element root = doc.getRootElement();
-        Namespace ns = root.getNamespace();
-
-        List repositories = root.getChild("remoteRepositories", ns).getChildren();
-        Element repoWithPolicy = (Element) repositories.get(0);
-        assertNull(repoWithPolicy.getChild("checksumPolicyType", ns), "checksumPolicyType element should not exist");
-        Element policyTypeElement = repoWithPolicy.getChild("remoteRepoChecksumPolicyType", ns);
-        assertNotNull(policyTypeElement, "Renamed tag not found");
-        assertEquals(policyTypeElement.getText(), "generate-if-absent");
-    }
-
-}
diff --git a/base/config/src/test/java/org/artifactory/version/converter/v144/MultiLdapXmlConverterTest.java b/base/config/src/test/java/org/artifactory/version/converter/v144/MultiLdapXmlConverterTest.java
deleted file mode 100644
index 9021c62..0000000
--- a/base/config/src/test/java/org/artifactory/version/converter/v144/MultiLdapXmlConverterTest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v144;
-
-import org.artifactory.convert.XmlConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-/**
- * Test the {@link org.artifactory.version.converter.v144.MultiLdapXmlConverter}
- *
- * @author Tomer Cohen
- */
- at Test
-public class MultiLdapXmlConverterTest extends XmlConverterTest {
-
-    public void convert() throws Exception {
-        Document document = convertXml("/config/test/config.1.4.3_without_multildap.xml", new MultiLdapXmlConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        List ldapGroupSettings = rootElement.getChildren("ldapGroupSettings", namespace);
-        for (Object ldapGroupSetting : ldapGroupSettings) {
-            Element ldapGroupSettingElement = (Element) ldapGroupSetting;
-            Element enabledLdap = ldapGroupSettingElement.getChild("enabledLdap");
-            Assert.assertEquals(enabledLdap.getValue(), "ldap1");
-        }
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/version/converter/v144/ServerIdXmlConverterTest.java b/base/config/src/test/java/org/artifactory/version/converter/v144/ServerIdXmlConverterTest.java
deleted file mode 100644
index 95cde1e..0000000
--- a/base/config/src/test/java/org/artifactory/version/converter/v144/ServerIdXmlConverterTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v144;
-
-import org.artifactory.convert.XmlConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertNull;
-
-/**
- * Tests {@link ServerIdXmlConverter}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class ServerIdXmlConverterTest extends XmlConverterTest {
-
-    public void convertWithServerId() throws Exception {
-        Document document = convertXml("/config/test/config.1.4.3_with_serverId.xml", new ServerIdXmlConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        Element addons = rootElement.getChild("addons", namespace);
-        assertNull(addons.getChild("serverId", namespace), "serverId tag should have been removed");
-    }
-
-    public void convertDefault() throws Exception {
-        // the default doesn't contain server id tag (no addons tag either)
-        Document document = convertXml("/config/install/config.1.4.3.xml", new ServerIdXmlConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        assertNull(rootElement.getChild("addons", namespace));
-    }
-
-}
diff --git a/base/config/src/test/java/org/artifactory/version/converter/v147/DefaultRepoLayoutConverterTest.java b/base/config/src/test/java/org/artifactory/version/converter/v147/DefaultRepoLayoutConverterTest.java
deleted file mode 100644
index 19bcf56..0000000
--- a/base/config/src/test/java/org/artifactory/version/converter/v147/DefaultRepoLayoutConverterTest.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v147;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.convert.XmlConverterTest;
-import org.artifactory.util.RepoLayoutUtils;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-/**
- * @author Noam Y. Tenne
- */
- at Test
-public class DefaultRepoLayoutConverterTest extends XmlConverterTest {
-
-    public void convert() throws Exception {
-        Document document = convertXml("/config/test/config.1.4.6_wrong_url.xml", new DefaultRepoLayoutConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        Element repoLayoutsElement = rootElement.getChild("repoLayouts", namespace);
-        assertNotNull(repoLayoutsElement, "Converted configuration should contain default repo layouts.");
-        checkForDefaultLayouts(repoLayoutsElement, namespace);
-
-        Element localRepositoriesElement = rootElement.getChild("localRepositories", namespace);
-        if (localRepositoriesElement != null) {
-            List<Element> localRepositoryElements = localRepositoriesElement.getChildren("localRepository", namespace);
-            if (localRepositoryElements != null && !localRepositoryElements.isEmpty()) {
-
-                for (Element localRepositoryElement : localRepositoryElements) {
-                    checkRepoHasDefaultLayoutAndNoType(localRepositoryElement, namespace);
-                }
-            }
-        }
-
-        Element remoteRepositoriesElement = rootElement.getChild("remoteRepositories", namespace);
-        if (remoteRepositoriesElement != null) {
-            List<Element> remoteRepositoryElements =
-                    remoteRepositoriesElement.getChildren("remoteRepository", namespace);
-            if (remoteRepositoryElements != null && !remoteRepositoryElements.isEmpty()) {
-
-                for (Element remoteRepositoryElement : remoteRepositoryElements) {
-                    checkRepoHasDefaultLayoutAndNoType(remoteRepositoryElement, namespace);
-                }
-            }
-        }
-
-        Element virtualRepositoriesElement = rootElement.getChild("virtualRepositories", namespace);
-        if (virtualRepositoriesElement != null) {
-            List<Element> virtualRepositoryElements =
-                    virtualRepositoriesElement.getChildren("virtualRepository", namespace);
-            if (virtualRepositoryElements != null && !virtualRepositoryElements.isEmpty()) {
-
-                for (Element virtualRepositoryElement : virtualRepositoryElements) {
-                    String repoKey = assertAndGetRepoKey(virtualRepositoryElement, namespace);
-                    assertNoType(repoKey, virtualRepositoryElement);
-                }
-            }
-        }
-    }
-
-    private void checkRepoHasDefaultLayoutAndNoType(Element repositoryElement, Namespace namespace) {
-        String repoKey = assertAndGetRepoKey(repositoryElement, namespace);
-
-        Element repoLayoutRefElement = repositoryElement.getChild("repoLayoutRef", namespace);
-        assertNotNull(repoLayoutRefElement, "Couldn't find a repository layout reference in: " + repoKey);
-
-        String repoLayout = repoLayoutRefElement.getText();
-        assertEquals(repoLayout, RepoLayoutUtils.MAVEN_2_DEFAULT_NAME, "Unexpected default repo layout reference.");
-
-        assertNoType(repoKey, repositoryElement);
-
-        if ("java.net.m1".equals(repoKey)) {
-            Element remoteRepoLayoutRefElement = repositoryElement.getChild("remoteRepoLayoutRef", namespace);
-            assertNotNull(remoteRepoLayoutRefElement, "Couldn't find a remote repository layout reference in: " +
-                    repoKey);
-
-            String remoteRepoLayout = remoteRepoLayoutRefElement.getText();
-            assertEquals(remoteRepoLayout, RepoLayoutUtils.MAVEN_1_DEFAULT_NAME,
-                    "Unexpected default remote repo layout reference.");
-        }
-    }
-
-    private String assertAndGetRepoKey(Element repositoryElement, Namespace namespace) {
-        Element repoKeyElement = repositoryElement.getChild("key", namespace);
-        assertNotNull(repoKeyElement, "Couldn't find a repository key element.");
-
-        String repoKey = repoKeyElement.getText();
-        assertTrue(StringUtils.isNotBlank(repoKey), "Couldn't find a repository key value.");
-        return repoKey;
-    }
-
-    private void assertNoType(String repoKey, Element repositoryElement) {
-        assertNull(repositoryElement.getChild("type"),
-                "Repository type definition should have been removed from: " + repoKey);
-    }
-
-    private void checkForDefaultLayouts(Element repoLayoutsElement, Namespace namespace) {
-        List<Element> repoLayoutElements = repoLayoutsElement.getChildren();
-
-        assertNotNull(repoLayoutElements, "Converted configuration should contain default repo layouts.");
-        assertFalse(repoLayoutElements.isEmpty(),
-                "Converted configuration should contain default repo layouts.");
-
-        checkForDefaultM2Layout(repoLayoutElements, namespace);
-        checkForDefaultIvyLayout(repoLayoutElements, namespace);
-        checkForDefaultGradleLayout(repoLayoutElements, namespace);
-        checkForDefaultM1Layout(repoLayoutElements, namespace);
-    }
-
-    private void checkForDefaultM2Layout(List<Element> repoLayoutElements, Namespace namespace) {
-        checkLayout(repoLayoutElements, namespace, RepoLayoutUtils.MAVEN_2_DEFAULT.getName(),
-                RepoLayoutUtils.MAVEN_2_DEFAULT.getArtifactPathPattern(),
-                Boolean.toString(RepoLayoutUtils.MAVEN_2_DEFAULT.isDistinctiveDescriptorPathPattern()),
-                RepoLayoutUtils.MAVEN_2_DEFAULT.getDescriptorPathPattern(),
-                RepoLayoutUtils.MAVEN_2_DEFAULT.getFolderIntegrationRevisionRegExp(),
-                RepoLayoutUtils.MAVEN_2_DEFAULT.getFileIntegrationRevisionRegExp());
-    }
-
-    private void checkForDefaultIvyLayout(List<Element> repoLayoutElements, Namespace namespace) {
-        checkLayout(repoLayoutElements, namespace, RepoLayoutUtils.IVY_DEFAULT.getName(),
-                RepoLayoutUtils.IVY_DEFAULT.getArtifactPathPattern(),
-                Boolean.toString(RepoLayoutUtils.IVY_DEFAULT.isDistinctiveDescriptorPathPattern()),
-                RepoLayoutUtils.IVY_DEFAULT.getDescriptorPathPattern(),
-                RepoLayoutUtils.IVY_DEFAULT.getFolderIntegrationRevisionRegExp(),
-                RepoLayoutUtils.IVY_DEFAULT.getFileIntegrationRevisionRegExp());
-    }
-
-    private void checkForDefaultGradleLayout(List<Element> repoLayoutElements, Namespace namespace) {
-        checkLayout(repoLayoutElements, namespace, RepoLayoutUtils.GRADLE_DEFAULT.getName(),
-                RepoLayoutUtils.GRADLE_DEFAULT.getArtifactPathPattern(),
-                Boolean.toString(RepoLayoutUtils.GRADLE_DEFAULT.isDistinctiveDescriptorPathPattern()),
-                RepoLayoutUtils.GRADLE_DEFAULT.getDescriptorPathPattern(),
-                RepoLayoutUtils.GRADLE_DEFAULT.getFolderIntegrationRevisionRegExp(),
-                RepoLayoutUtils.GRADLE_DEFAULT.getFileIntegrationRevisionRegExp());
-    }
-
-    private void checkForDefaultM1Layout(List<Element> repoLayoutElements, Namespace namespace) {
-        checkLayout(repoLayoutElements, namespace, RepoLayoutUtils.MAVEN_1_DEFAULT.getName(),
-                RepoLayoutUtils.MAVEN_1_DEFAULT.getArtifactPathPattern(),
-                Boolean.toString(RepoLayoutUtils.MAVEN_1_DEFAULT.isDistinctiveDescriptorPathPattern()),
-                RepoLayoutUtils.MAVEN_1_DEFAULT.getDescriptorPathPattern(),
-                RepoLayoutUtils.MAVEN_1_DEFAULT.getFolderIntegrationRevisionRegExp(),
-                RepoLayoutUtils.MAVEN_1_DEFAULT.getFolderIntegrationRevisionRegExp());
-    }
-
-    private void checkLayout(List<Element> repoLayoutElements, Namespace namespace, String layoutName,
-            String artifactPathPattern, String distinctiveDescriptorPathPattern, String descriptorPathPattern,
-            String folderIntegrationRevisionRegExp, String fileIntegrationRevisionRegExp) {
-
-        boolean foundLayout = false;
-        for (Element repoLayoutElement : repoLayoutElements) {
-            if (layoutName.equals(repoLayoutElement.getChild("name", namespace).getText())) {
-                checkLayoutElement(repoLayoutElement, namespace, layoutName, artifactPathPattern,
-                        distinctiveDescriptorPathPattern, descriptorPathPattern, folderIntegrationRevisionRegExp,
-                        fileIntegrationRevisionRegExp);
-                foundLayout = true;
-            }
-        }
-        assertTrue(foundLayout, "Could not find the default layout: " + layoutName);
-    }
-
-    private void checkLayoutElement(Element repoLayoutElement, Namespace namespace, String layoutName,
-            String artifactPathPattern, String distinctiveDescriptorPathPattern, String descriptorPathPattern,
-            String folderIntegrationRevisionRegExp, String fileIntegrationRevisionRegExp) {
-
-        checkLayoutField(repoLayoutElement, namespace, layoutName, "artifactPathPattern", artifactPathPattern,
-                "artifact path pattern");
-
-        checkLayoutField(repoLayoutElement, namespace, layoutName, "distinctiveDescriptorPathPattern",
-                distinctiveDescriptorPathPattern, "distinctive descriptor path pattern");
-
-        checkLayoutField(repoLayoutElement, namespace, layoutName, "descriptorPathPattern", descriptorPathPattern,
-                "descriptor path pattern");
-
-        checkLayoutField(repoLayoutElement, namespace, layoutName, "folderIntegrationRevisionRegExp",
-                folderIntegrationRevisionRegExp, "folder integration revision reg exp");
-
-        checkLayoutField(repoLayoutElement, namespace, layoutName, "fileIntegrationRevisionRegExp",
-                fileIntegrationRevisionRegExp, "file integration revision reg exp");
-    }
-
-    private void checkLayoutField(Element repoLayoutElement, Namespace namespace, String layoutName, String childName,
-            String expectedChildValue, String childDisplayName) {
-        Element childElement = repoLayoutElement.getChild(childName, namespace);
-        assertNotNull(childElement, "Could not find " + childDisplayName + " element in default repo layout: " +
-                layoutName);
-        assertEquals(childElement.getText(), expectedChildValue, "Unexpected " + childDisplayName +
-                " in default repo layout: " + layoutName);
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/version/converter/v147/JfrogRemoteRepoUrlConverterTest.java b/base/config/src/test/java/org/artifactory/version/converter/v147/JfrogRemoteRepoUrlConverterTest.java
deleted file mode 100644
index 092db15..0000000
--- a/base/config/src/test/java/org/artifactory/version/converter/v147/JfrogRemoteRepoUrlConverterTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v147;
-
-import org.artifactory.convert.XmlConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Test {@link JfrogRemoteRepoUrlConverter}
- *
- * @author Tomer Cohen
- */
- at Test
-public class JfrogRemoteRepoUrlConverterTest extends XmlConverterTest {
-
-    public void convert() throws Exception {
-        Document document = convertXml("/config/test/config.1.4.6_wrong_url.xml", new JfrogRemoteRepoUrlConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        Element repositories = rootElement.getChild("remoteRepositories", namespace);
-        List remoteRepos = repositories.getChildren("remoteRepository", namespace);
-        for (Object remoteRepo : remoteRepos) {
-            Element remoteRepoElement = (Element) remoteRepo;
-            Element key = remoteRepoElement.getChild("key", namespace);
-            if ("jfrog-libs".equals(key.getText())) {
-                Element url = remoteRepoElement.getChild("url", namespace);
-                assertEquals("http://repo.jfrog.org/artifactory/libs-releases-local", url.getText());
-            } else if ("jfrog-plugins".equals(key.getText())) {
-                Element url = remoteRepoElement.getChild("url", namespace);
-                assertEquals("http://repo.jfrog.org/artifactory/plugins-releases-local", url.getText());
-            }
-        }
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/version/converter/v147/UnusedArtifactCleanupSwitchConverterTest.java b/base/config/src/test/java/org/artifactory/version/converter/v147/UnusedArtifactCleanupSwitchConverterTest.java
deleted file mode 100644
index 12f5e21..0000000
--- a/base/config/src/test/java/org/artifactory/version/converter/v147/UnusedArtifactCleanupSwitchConverterTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v147;
-
-import org.artifactory.convert.XmlConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-/**
- * @author Noam Y. Tenne
- */
- at Test
-public class UnusedArtifactCleanupSwitchConverterTest extends XmlConverterTest {
-
-    public void convert() throws Exception {
-        Document document = convertXml("/config/test/config.1.4.6_wrong_url.xml",
-                new UnusedArtifactCleanupSwitchConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        Element remoteRepositoriesElement = rootElement.getChild("remoteRepositories", namespace);
-        if (remoteRepositoriesElement != null) {
-            List<Element> remoteRepositoryElements =
-                    remoteRepositoriesElement.getChildren("remoteRepository", namespace);
-            if (remoteRepositoryElements != null && !remoteRepositoryElements.isEmpty()) {
-
-                for (Element remoteRepositoryElement : remoteRepositoryElements) {
-
-                    Assert.assertNull(remoteRepositoryElement.getChild("unusedArtifactsCleanupEnabled", namespace),
-                            "The 'unusedArtifactsCleanupEnabled' field was not removed from: " +
-                                    remoteRepositoryElement.getChild("key", namespace).getText());
-                }
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/test/java/org/artifactory/version/converter/v149/ReplicationElementNameConverterTest.java b/base/config/src/test/java/org/artifactory/version/converter/v149/ReplicationElementNameConverterTest.java
deleted file mode 100644
index 8d23684..0000000
--- a/base/config/src/test/java/org/artifactory/version/converter/v149/ReplicationElementNameConverterTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v149;
-
-import org.artifactory.convert.XmlConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests {@link org.artifactory.version.converter.v149.ReplicationElementNameConverter}
- *
- * @author Noam Y. Tenne
- */
- at Test
-public class ReplicationElementNameConverterTest extends XmlConverterTest {
-
-    public void convert() throws Exception {
-        Document document = convertXml("/config/test/config.1.4.8_old_replication.xml",
-                new ReplicationElementNameConverter());
-
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        assertNull(rootElement.getChild("replications", namespace),
-                "Found the old replication configuration name the was supposed to be converted");
-
-        Element replications = rootElement.getChild("remoteReplications", namespace);
-        assertNotNull(replications, "Expected to find the converted remote replications element");
-
-        assertTrue(replications.getChildren("replication", namespace).isEmpty(),
-                "Found the old replication configuration name the was supposed to be converted");
-
-        List<Element> remoteReplicationList = replications.getChildren("remoteReplication", namespace);
-        assertNotNull(remoteReplicationList, "Expected to find replication configurations");
-        assertFalse(remoteReplicationList.isEmpty(), "Expected to find replication configurations");
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/version/converter/v152/BlackduckConverterTest.java b/base/config/src/test/java/org/artifactory/version/converter/v152/BlackduckConverterTest.java
deleted file mode 100644
index 35a9f15..0000000
--- a/base/config/src/test/java/org/artifactory/version/converter/v152/BlackduckConverterTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.version.converter.v152;
-
-import org.artifactory.convert.XmlConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * @author Yoav Luft
- */
- at Test
-public class BlackduckConverterTest extends XmlConverterTest {
-
-    public void addDefaultProxyTest() throws Exception {
-        Document document = convertXml("/config/test/config-1.5.2-blackduck_default_proxy.xml",
-                new BlackDuckProxyConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        Element externalProviders = rootElement.getChild("externalProviders", namespace);
-        Element blackduckConfig = externalProviders.getChild("blackduck", namespace);
-        Assert.assertEquals(blackduckConfig.getChildText("proxyRef", namespace), "Charles",
-                "Expected proxyRef element to be \"Charles\"");
-    }
-
-    public void dontAddIfNoDefaultProxy() throws Exception {
-        Document document = convertXml("/config/test/config-1.5.2-blackduck_no_default_proxy.xml",
-                new BlackDuckProxyConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        Element externalProviders = rootElement.getChild("externalProviders", namespace);
-        Element blackduckConfig = externalProviders.getChild("blackduck", namespace);
-        Assert.assertNull(blackduckConfig.getChild("proxyRef", namespace), "There should be no proxy configurations");
-    }
-
-    /**
-     * We expect in this test that no exception will be thrown if the blackduck section is missing
-     *
-     * @throws Exception
-     */
-    public void noBlackduckSection() throws Exception {
-        Document document = convertXml("/config/test/config-1.5.2-blackduck_no_settings.xml",
-                new BlackDuckProxyConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        Element externalProviders = rootElement.getChild("externalProviders", namespace);
-        Element blackduckConfig = externalProviders.getChild("blackduck", namespace);
-        Assert.assertNull(blackduckConfig, "Blackduck section should no appear");
-    }
-}
diff --git a/base/config/src/test/java/org/artifactory/version/converter/v160/AddonsDefaultLayoutConverterTest.java b/base/config/src/test/java/org/artifactory/version/converter/v160/AddonsDefaultLayoutConverterTest.java
deleted file mode 100644
index 32f117f..0000000
--- a/base/config/src/test/java/org/artifactory/version/converter/v160/AddonsDefaultLayoutConverterTest.java
+++ /dev/null
@@ -1,180 +0,0 @@
-package org.artifactory.version.converter.v160;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.convert.XmlConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-/**
- * @author Shay Yaakov
- */
- at Test
-public class AddonsDefaultLayoutConverterTest extends XmlConverterTest {
-
-    public void convert() throws Exception {
-        Document document = convertXml("/config/test/config-1.5.13-no_addons_layouts.xml", new AddonsDefaultLayoutConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        Element repoLayoutsElement = rootElement.getChild("repoLayouts", namespace);
-        assertNotNull(repoLayoutsElement, "Converted configuration should contain default repo layouts.");
-        checkForDefaultLayouts(repoLayoutsElement, namespace);
-    }
-
-    public void convertExisting() throws Exception {
-        Document document = convertXml("/config/test/config-1.5.13-existing_addon_layout.xml", new AddonsDefaultLayoutConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        Element repoLayoutsElement = rootElement.getChild("repoLayouts", namespace);
-        assertNotNull(repoLayoutsElement, "Converted configuration should contain default repo layouts.");
-        checkForDefaultLayouts(repoLayoutsElement, namespace);
-
-        checkLayout(repoLayoutsElement.getChildren(), namespace, "art-nuget-default",
-                "[orgPath]/[module]/[module].[baseRev](-[fileItegRev]).nupkg",
-                "false",
-                null,
-                ".*",
-                ".*");
-    }
-
-    public void convertExistingRandom() throws Exception {
-        Document document = convertXml("/config/test/config-1.5.13-random_addon_layout.xml", new AddonsDefaultLayoutConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        Element repoLayoutsElement = rootElement.getChild("repoLayouts", namespace);
-        assertNotNull(repoLayoutsElement, "Converted configuration should contain default repo layouts.");
-        checkForDefaultLayouts(repoLayoutsElement, namespace);
-
-        long nugetLayoutsCount = repoLayoutsElement.getChildren()
-                .stream()
-                .filter(element -> element.getChild("name", namespace).getText().contains("nuget"))
-                .count();
-        assertEquals(nugetLayoutsCount, 3);
-    }
-
-    private void checkForDefaultLayouts(Element repoLayoutsElement, Namespace namespace) {
-        List<Element> repoLayoutElements = repoLayoutsElement.getChildren();
-
-        assertNotNull(repoLayoutElements, "Converted configuration should contain default repo layouts.");
-        assertFalse(repoLayoutElements.isEmpty(),
-                "Converted configuration should contain default repo layouts.");
-
-        checkForDefaultNuGetLayout(repoLayoutElements, namespace);
-        checkForDefaultNpmLayout(repoLayoutElements, namespace);
-        checkForDefaultBowerLayout(repoLayoutElements, namespace);
-        checkForDefaultVcsLayout(repoLayoutElements, namespace);
-        checkForDefaultSbtLayout(repoLayoutElements, namespace);
-        checkForDefaultSimpleLayout(repoLayoutElements, namespace);
-    }
-
-    private void checkForDefaultNuGetLayout(List<Element> repoLayoutElements, Namespace namespace) {
-        checkLayout(repoLayoutElements, namespace, "nuget-default",
-                "[orgPath]/[module]/[module].[baseRev](-[fileItegRev]).nupkg",
-                "false",
-                null,
-                ".*",
-                ".*");
-    }
-
-    private void checkForDefaultNpmLayout(List<Element> repoLayoutElements, Namespace namespace) {
-        checkLayout(repoLayoutElements, namespace, "npm-default",
-                "[orgPath]/[module]/[module]-[baseRev](-[fileItegRev]).tgz",
-                "false",
-                null,
-                ".*",
-                ".*");
-    }
-
-    private void checkForDefaultBowerLayout(List<Element> repoLayoutElements, Namespace namespace) {
-        checkLayout(repoLayoutElements, namespace, "bower-default",
-                "[orgPath]/[module]/[module]-[baseRev](-[fileItegRev]).[ext]",
-                "false",
-                null,
-                ".*",
-                ".*");
-    }
-
-    private void checkForDefaultVcsLayout(List<Element> repoLayoutElements, Namespace namespace) {
-        checkLayout(repoLayoutElements, namespace, "vcs-default",
-                "[orgPath]/[module]/[refs<tags|branches>]/[baseRev]/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]",
-                "false",
-                null,
-                ".*",
-                "[a-zA-Z0-9]{40}");
-    }
-
-    private void checkForDefaultSbtLayout(List<Element> repoLayoutElements, Namespace namespace) {
-        checkLayout(repoLayoutElements, namespace, "sbt-default",
-                "[org]/[module]/(scala_[scalaVersion<.+>])/(sbt_[sbtVersion<.+>])/[baseRev]/[type]s/[module](-[classifier]).[ext]",
-                "true",
-                "[org]/[module]/(scala_[scalaVersion<.+>])/(sbt_[sbtVersion<.+>])/[baseRev]/[type]s/ivy.xml",
-                "\\d{14}",
-                "\\d{14}");
-    }
-
-    private void checkForDefaultSimpleLayout(List<Element> repoLayoutElements, Namespace namespace) {
-        checkLayout(repoLayoutElements, namespace, "simple-default",
-                "[orgPath]/[module]/[module]-[baseRev](-[fileItegRev]).[ext]",
-                "false",
-                null,
-                ".*",
-                ".*");
-    }
-
-    private void checkLayout(List<Element> repoLayoutElements, Namespace namespace, String layoutName,
-                             String artifactPathPattern, String distinctiveDescriptorPathPattern, String descriptorPathPattern,
-                             String folderIntegrationRevisionRegExp, String fileIntegrationRevisionRegExp) {
-
-        boolean foundLayout = false;
-        for (Element repoLayoutElement : repoLayoutElements) {
-            if (layoutName.equals(repoLayoutElement.getChild("name", namespace).getText())) {
-                checkLayoutElement(repoLayoutElement, namespace, layoutName, artifactPathPattern,
-                        distinctiveDescriptorPathPattern, descriptorPathPattern, folderIntegrationRevisionRegExp,
-                        fileIntegrationRevisionRegExp);
-                foundLayout = true;
-            }
-        }
-        assertTrue(foundLayout, "Could not find the default layout: " + layoutName);
-    }
-
-    private void checkLayoutElement(Element repoLayoutElement, Namespace namespace, String layoutName,
-                                    String artifactPathPattern, String distinctiveDescriptorPathPattern, String descriptorPathPattern,
-                                    String folderIntegrationRevisionRegExp, String fileIntegrationRevisionRegExp) {
-
-        checkLayoutField(repoLayoutElement, namespace, layoutName, "artifactPathPattern", artifactPathPattern,
-                "artifact path pattern");
-
-        checkLayoutField(repoLayoutElement, namespace, layoutName, "distinctiveDescriptorPathPattern",
-                distinctiveDescriptorPathPattern, "distinctive descriptor path pattern");
-
-        if (StringUtils.isNotBlank(descriptorPathPattern)) {
-            checkLayoutField(repoLayoutElement, namespace, layoutName, "descriptorPathPattern", descriptorPathPattern,
-                    "descriptor path pattern");
-        } else {
-            assertNull(repoLayoutElement.getChild("descriptorPathPattern"));
-        }
-
-        checkLayoutField(repoLayoutElement, namespace, layoutName, "folderIntegrationRevisionRegExp",
-                folderIntegrationRevisionRegExp, "folder integration revision reg exp");
-
-        checkLayoutField(repoLayoutElement, namespace, layoutName, "fileIntegrationRevisionRegExp",
-                fileIntegrationRevisionRegExp, "file integration revision reg exp");
-    }
-
-    private void checkLayoutField(Element repoLayoutElement, Namespace namespace, String layoutName, String childName,
-                                  String expectedChildValue, String childDisplayName) {
-        Element childElement = repoLayoutElement.getChild(childName, namespace);
-        assertNotNull(childElement, "Could not find " + childDisplayName + " element in default repo layout: " +
-                layoutName);
-        assertEquals(childElement.getText(), expectedChildValue, "Unexpected " + childDisplayName +
-                " in default repo layout: " + layoutName);
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/test/java/org/artifactory/version/converter/v160/MavenIndexerConverterTest.java b/base/config/src/test/java/org/artifactory/version/converter/v160/MavenIndexerConverterTest.java
deleted file mode 100644
index c8d80d5..0000000
--- a/base/config/src/test/java/org/artifactory/version/converter/v160/MavenIndexerConverterTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.artifactory.version.converter.v160;
-
-import com.google.common.collect.Lists;
-import org.artifactory.convert.XmlConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import java.util.stream.Collectors;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNull;
-
-/**
- * @author Shay Yaakov
- */
- at Test
-public class MavenIndexerConverterTest extends XmlConverterTest {
-
-    @Test
-    public void convertIndexerEnabled() throws Exception {
-        Document document = convertXml("/config/test/config-1.5.13-maven_indexer_enabled.xml",
-                new SingleRepoTypeConverter());
-        new MavenIndexerConverter().convert(document);
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        Element indexer = rootElement.getChild("indexer", namespace);
-        assertNull(indexer.getChild("excludedRepositories", namespace));
-        Element includedRepositories = indexer.getChild("includedRepositories", namespace);
-        assertEquals(includedRepositories.getChildren().stream().map(Element::getText).collect(Collectors.toList()),
-                Lists.newArrayList("local2", "remote1", "virtual1"));
-    }
-
-    @Test
-    public void convertNoExcludedRepos() throws Exception {
-        Document document = convertXml("/config/test/config-1.5.13-maven_indexer_no_excluded.xml",
-                new MavenIndexerConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        Element indexer = rootElement.getChild("indexer", namespace);
-        assertNull(indexer.getChild("excludedRepositories", namespace));
-        assertNull(indexer.getChild("includedRepositories", namespace));
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/test/java/org/artifactory/version/converter/v160/SingleRepoTypeConverterTest.java b/base/config/src/test/java/org/artifactory/version/converter/v160/SingleRepoTypeConverterTest.java
deleted file mode 100644
index bd148b4..0000000
--- a/base/config/src/test/java/org/artifactory/version/converter/v160/SingleRepoTypeConverterTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package org.artifactory.version.converter.v160;
-
-import org.artifactory.convert.XmlConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNull;
-
-/**
- * @author Shay Yaakov
- */
- at Test
-public class SingleRepoTypeConverterTest extends XmlConverterTest {
-
-    @Test
-    public void convert() throws Exception {
-        Document document = convertXml("/config/test/config-1.5.13-multi_repo_type.xml", new SingleRepoTypeConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-
-        validateLocalRepos(rootElement, namespace);
-        validateRemoteRepos(rootElement, namespace);
-        validateVirtualRepos(rootElement, namespace);
-    }
-
-    private void validateLocalRepos(Element rootElement, Namespace namespace) {
-        Element localRepos = rootElement.getChild("localRepositories", namespace);
-        for (Element repo : localRepos.getChildren()) {
-            switch (repo.getChildText("key", namespace)) {
-                case "maven-local":
-                    assertEquals(repo.getChildText("type", namespace), "maven");
-                    break;
-                case "gradle-local":
-                    assertEquals(repo.getChildText("type", namespace), "gradle");
-                    break;
-                case "ivy-local":
-                    assertEquals(repo.getChildText("type", namespace), "ivy");
-                    break;
-                case "npm-local":
-                    assertEquals(repo.getChildText("type", namespace), "npm");
-                    break;
-                case "bower-local":
-                    assertEquals(repo.getChildText("type", namespace), "bower");
-                    break;
-                case "docker-local":
-                    assertEquals(repo.getChildText("type", namespace), "docker");
-                    break;
-                case "vagrant-local":
-                    assertEquals(repo.getChildText("type", namespace), "vagrant");
-                    break;
-                case "gems-local":
-                    assertEquals(repo.getChildText("type", namespace), "gems");
-                    break;
-                case "debian-local":
-                    assertEquals(repo.getChildText("type", namespace), "debian");
-                    break;
-                case "gitlfs-local":
-                    assertEquals(repo.getChildText("type", namespace), "gitlfs");
-                    break;
-                case "nuget-local":
-                    assertEquals(repo.getChildText("type", namespace), "nuget");
-            }
-            assertNull(repo.getChildText("enableNuGetSupport", namespace));
-            assertNull(repo.getChildText("enableGemsSupport", namespace));
-            assertNull(repo.getChildText("enableNpmSupport", namespace));
-            assertNull(repo.getChildText("enableBowerSupport", namespace));
-            assertNull(repo.getChildText("enableDebianSupport", namespace));
-            assertNull(repo.getChildText("enablePypiSupport", namespace));
-            assertNull(repo.getChildText("enableDockerSupport", namespace));
-            assertNull(repo.getChildText("enableVagrantSupport", namespace));
-            assertNull(repo.getChildText("enableGitLfsSupport", namespace));
-        }
-    }
-
-    private void validateRemoteRepos(Element rootElement, Namespace namespace) {
-        Element localRepos = rootElement.getChild("remoteRepositories", namespace);
-        for (Element repo : localRepos.getChildren()) {
-            switch (repo.getChildText("key", namespace)) {
-                case "p2-remote":
-                    assertEquals(repo.getChildText("type", namespace), "maven");
-                    break;
-                case "vcs-remote":
-                    assertEquals(repo.getChildText("type", namespace), "vcs");
-                    assertNull(repo.getChildText("enableVcsSupport", namespace));
-                    break;
-            }
-        }
-    }
-
-    private void validateVirtualRepos(Element rootElement, Namespace namespace) {
-        Element virtualRepos = rootElement.getChild("virtualRepositories", namespace);
-        for (Element repo : virtualRepos.getChildren()) {
-            switch (repo.getChildText("key", namespace)) {
-                case "p2-virtual":
-                    assertEquals(repo.getChildText("type", namespace), "p2");
-                    break;
-                case "pypi-virtual":
-                    assertEquals(repo.getChildText("type", namespace), "pypi");
-                    break;
-            }
-            assertNull(repo.getChild("p2", namespace).getChildText("enabled", namespace));
-        }
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/test/java/org/artifactory/version/converter/v162/FolderDownloadConfigConverterTest.java b/base/config/src/test/java/org/artifactory/version/converter/v162/FolderDownloadConfigConverterTest.java
deleted file mode 100644
index 53ca8d4..0000000
--- a/base/config/src/test/java/org/artifactory/version/converter/v162/FolderDownloadConfigConverterTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.version.converter.v162;
-
-import org.artifactory.convert.XmlConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
-
-/**
- * @author Dan Feldman
- */
- at Test
-public class FolderDownloadConfigConverterTest extends XmlConverterTest {
-
-    @Test
-    public void convert() throws Exception {
-        Document document = convertXml("/config/test/config-1.5.13-multi_repo_type.xml",
-                new FolderDownloadConfigConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        validateDefaultsAdded(rootElement, namespace);
-    }
-
-    private void validateDefaultsAdded(Element rootElement, Namespace namespace) {
-        Element folderDownloadConfig = rootElement.getChild("folderDownloadConfig", namespace);
-        assertTrue(folderDownloadConfig != null, "Expected to find 'folderDownloadConfig' section");
-        Namespace folderConfigNamespace = folderDownloadConfig.getNamespace();
-        assertEquals(folderDownloadConfig.getChildText("enabled", folderConfigNamespace), "false");
-        assertEquals(folderDownloadConfig.getChildText("maxDownloadSizeMb", folderConfigNamespace), "1024");
-        assertEquals(folderDownloadConfig.getChildText("maxFiles", folderConfigNamespace), "5000");
-        assertEquals(folderDownloadConfig.getChildText("maxConcurrentRequests", folderConfigNamespace), "10");
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/test/java/org/artifactory/version/converter/v167/TrashcanConfigConverterTest.java b/base/config/src/test/java/org/artifactory/version/converter/v167/TrashcanConfigConverterTest.java
deleted file mode 100644
index dd58898..0000000
--- a/base/config/src/test/java/org/artifactory/version/converter/v167/TrashcanConfigConverterTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.artifactory.version.converter.v167;
-
-import org.artifactory.convert.XmlConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-
-/**
- * @author Shay Yaakov
- */
- at Test
-public class TrashcanConfigConverterTest extends XmlConverterTest {
-
-    @Test
-    public void convert() throws Exception {
-        Document document = convertXml("/config/test/config-1.5.13-multi_repo_type.xml", new TrashcanConfigConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        validateDefaultsAdded(rootElement, namespace);
-    }
-
-    private void validateDefaultsAdded(Element rootElement, Namespace namespace) {
-        Element trashcanConfig = rootElement.getChild("trashcanConfig", namespace);
-        assertNotNull(trashcanConfig);
-        Namespace trashcanConfigNamespace = trashcanConfig.getNamespace();
-        assertEquals(trashcanConfig.getChildText("enabled", trashcanConfigNamespace), "true");
-        assertEquals(trashcanConfig.getChildText("retentionPeriodDays", trashcanConfigNamespace), "14");
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/test/java/org/artifactory/version/converter/v169/PasswordMaxAgeConverterTest.java b/base/config/src/test/java/org/artifactory/version/converter/v169/PasswordMaxAgeConverterTest.java
deleted file mode 100644
index 8ae33cb..0000000
--- a/base/config/src/test/java/org/artifactory/version/converter/v169/PasswordMaxAgeConverterTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.artifactory.version.converter.v169;
-
-import org.artifactory.convert.XmlConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-
-/**
- * @author Shay Yaakov
- */
-public class PasswordMaxAgeConverterTest extends XmlConverterTest {
-
-    @Test
-    public void convert() throws Exception {
-        Document document = convertXml("/config/test/config-1.6.8-expires_in.xml", new PasswordMaxAgeConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        Element child = rootElement.getChild("security", namespace).getChild("passwordSettings", namespace)
-                .getChild("expirationPolicy", namespace);
-        assertNotNull(child);
-        assertEquals(child.getChildText("passwordMaxAge", namespace), "60");
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/test/java/org/artifactory/version/converter/v171/SimpleLayoutConverterTest.java b/base/config/src/test/java/org/artifactory/version/converter/v171/SimpleLayoutConverterTest.java
deleted file mode 100644
index 4d34088..0000000
--- a/base/config/src/test/java/org/artifactory/version/converter/v171/SimpleLayoutConverterTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.artifactory.version.converter.v171;
-
-import org.artifactory.convert.XmlConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
-
-/**
- * @author Shay Yaakov
- */
-public class SimpleLayoutConverterTest extends XmlConverterTest {
-
-    @Test
-    public void convert() throws Exception {
-        Document document = convertXml("/config/test/config-1.6.8-expires_in.xml", new SimpleLayoutConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        List<Element> repoLayouts = rootElement.getChild("repoLayouts", namespace).getChildren();
-        boolean foundSimpleLayout = false;
-        for (Element repoLayout : repoLayouts) {
-            String layoutName = repoLayout.getChild("name", namespace).getText();
-            if (layoutName.equals("simple-default")) {
-                foundSimpleLayout = true;
-                String pattern = repoLayout.getChild("artifactPathPattern", namespace).getText();
-                assertEquals(pattern, "[orgPath]/[module]/[module]-[baseRev].[ext]");
-                break;
-            }
-        }
-        assertTrue(foundSimpleLayout);
-    }
-}
\ No newline at end of file
diff --git a/base/config/src/test/java/org/artifactory/version/converter/v172/BlockMismatchingMimeTypesConverterTest.java b/base/config/src/test/java/org/artifactory/version/converter/v172/BlockMismatchingMimeTypesConverterTest.java
deleted file mode 100644
index 24e9d1b..0000000
--- a/base/config/src/test/java/org/artifactory/version/converter/v172/BlockMismatchingMimeTypesConverterTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.artifactory.version.converter.v172;
-
-import org.artifactory.convert.XmlConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertTrue;
-
-/**
- * @author Dan Feldman
- */
-public class BlockMismatchingMimeTypesConverterTest extends XmlConverterTest {
-
-    @Test
-    public void convert() throws Exception {
-        Document document = convertXml("/config/test/config-1.6.8-expires_in.xml", new BlockMismatchingMimeTypesConverter());
-        Element rootElement = document.getRootElement();
-        Namespace namespace = rootElement.getNamespace();
-        rootElement.getChild("remoteRepositories", namespace).getChildren().stream()
-                .forEach(remoteRepo -> {
-                    String blockMime = remoteRepo.getChild("blockMismatchingMimeTypes", namespace).getText();
-                    assertTrue(blockMime.equals("true"));
-                });
-    }
-}
diff --git a/base/config/src/test/resources/META-INF/default/logback.xml b/base/config/src/test/resources/META-INF/default/logback.xml
deleted file mode 100644
index 4a4c742..0000000
--- a/base/config/src/test/resources/META-INF/default/logback.xml
+++ /dev/null
@@ -1,145 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<!-- This file is used by LogbackConfigSwapperTest -->
-<configuration debug="false">
-    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"/>
-    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%date [%thread] [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
-        </layout>
-    </appender>
-    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/artifactory.log</File>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/artifactory.%i.log.zip</FileNamePattern>
-            <MinIndex>1</MinIndex>
-            <MaxIndex>9</MaxIndex>
-        </rollingPolicy>
-
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>5MB</MaxFileSize>
-        </triggeringPolicy>
-        <encoder>
-            <pattern>%date [%thread] [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
-        </encoder>
-    </appender>
-    <appender name="ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/access.log</File>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/access.%i.log.zip</FileNamePattern>
-            <MinIndex>1</MinIndex>
-            <MaxIndex>9</MaxIndex>
-        </rollingPolicy>
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%d %m%n</pattern>
-        </layout>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>5MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="IMPORT.EXPORT" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/import.export.log</File>
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%date [%-5level] \(%logger{32}:%line\) %message%n</pattern>
-        </layout>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/import.export.%i.log.zip</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>10MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="TRAFFIC" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/traffic</File>
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%message%n</pattern>
-        </layout>
-        <rollingPolicy class="org.artifactory.traffic.policy.TrafficTimeBasedRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/traffic.%d{yyyyMMdd}</FileNamePattern>
-        </rollingPolicy>
-    </appender>
-    <appender name="REQUEST" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/request.log</File>
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%message%n</pattern>
-        </layout>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/request.%i.log</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>10MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <root>
-        <level value="warn"/>
-        <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="FILE"/>
-    </root>
-    <logger name="org.artifactory">
-        <level value="info"/>
-    </logger>
-    <logger name="org.artifactory.repo.index">
-        <level value="error"/>
-    </logger>
-    <logger name="org.artifactory.info.InfoWriter">
-        <level value="warn"/>
-    </logger>
-    <logger name="org.artifactory.security.AccessLogger" additivity="false">
-        <level value="info"/>
-        <appender-ref ref="ACCESS"/>
-    </logger>
-    <logger name="org.artifactory.api.common.ImportExportStatusHolder" additivity="false">
-        <level value="debug"/>
-        <appender-ref ref="IMPORT.EXPORT"/>
-    </logger>
-    <logger name="org.artifactory.traffic.TrafficLogger" additivity="false">
-        <level value="info"/>
-        <appender-ref ref="TRAFFIC"/>
-    </logger>
-    <logger name="org.artifactory.traffic.RequestLogger" additivity="false">
-        <level value="info"/>
-        <appender-ref ref="REQUEST"/>
-    </logger>
-
-    <!-- third party loggers -->
-    <logger name="com.sun.jersey">
-        <level value="warn"/>
-    </logger>
-    <logger name="org.springframework">
-        <level value="warn"/>
-    </logger>
-    <logger name="org.apache.http.impl.client">
-        <level value="info"/>
-    </logger>
-    <logger name="org.apache.http.headers">
-        <level value="info"/>
-    </logger>
-    <logger name="org.apache.http.wire">
-        <level value="info"/>
-    </logger>
-    <logger name="org.apache.wicket">
-        <level value="error"/>
-    </logger>
-    <logger name="org.apache.cxf">
-        <level value="error"/>
-    </logger>
-</configuration>
\ No newline at end of file
diff --git a/base/config/src/test/resources/config/install/config.1.0.0.xml b/base/config/src/test/resources/config/install/config.1.0.0.xml
deleted file mode 100644
index 1031511..0000000
--- a/base/config/src/test/resources/config/install/config.1.0.0.xml
+++ /dev/null
@@ -1,121 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.0.0"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.0.0
-        http://www.jfrog.org/xsd/artifactory-v1_0_0.xsd">
-    <!-- Backup every 12 hours -->
-    <!--<backupCronExp>0 0 /12 * * ?</backupCronExp>-->
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases</key>
-            <description>Local Repository for Applications Releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots</key>
-            <description>Local Repository for Applications Snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases</key>
-            <description>Local Repository for Plugins Releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots</key>
-            <description>Local Repository for Plugins Snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>3rdp-releases</key>
-            <description>Local Repository for Third party libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>3rdp-snapshots</key>
-            <description>Local Repository for Third party snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://repo1.maven.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus-snapshots</key>
-            <blackedOut>true</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://snapshots.repository.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net</key>
-            <description>java.net</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://download.java.net/maven/2</url>
-        </remoteRepository>
-        <!--<remoteRepository>
-            <key>codehaus</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://dist.codehaus.org</url>
-        </remoteRepository>-->
-        <!--<remoteRepository>
-            <key>ibiblio</key>
-            <excludesPattern>org/artifactory/**</excludesPattern>
-            <url>http://www.ibiblio.org/maven2</url>
-        </remoteRepository>-->
-        <!--<remoteRepository>
-            <key>apache-m2-snapshots</key>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://people.apache.org/repo/m2-snapshot-repository</url>
-            <proxyRef>unused-proxy</proxyRef>
-        </remoteRepository>-->
-    </remoteRepositories>
-
-    <proxies>
-        <proxy>
-            <key>unused-proxy</key>
-            <host>host</host>
-            <port>8080</port>
-            <username>un</username>
-            <password>pw</password>
-            <domain>domain</domain>
-        </proxy>
-    </proxies>
-
-</config>
diff --git a/base/config/src/test/resources/config/install/config.1.1.0.xml b/base/config/src/test/resources/config/install/config.1.1.0.xml
deleted file mode 100644
index aa9bcef..0000000
--- a/base/config/src/test/resources/config/install/config.1.1.0.xml
+++ /dev/null
@@ -1,237 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.1.0"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.1.0
-        http://www.jfrog.org/xsd/artifactory-v1_1_0.xsd">
-    <!--
-    enable/disable anonymous downloads
-    -->
-    <!-- OK try me
-    <anonDownloadsAllowed>false</anonDownloadsAllowed>
-    -->
-    <fileUploadMaxSizeMb>20</fileUploadMaxSizeMb>
-    <backup>
-        <!--
-        alternative backup dir
-        -->
-        <!--<dir></dir>-->
-        <!--
-        backup every 12 hours
-        -->
-        <cronExp>0 0 /12 * * ?</cronExp>
-        <!--
-        keep backups for a week
-        -->
-        <retentionPeriodHours>168</retentionPeriodHours>
-        <!--
-        exclude certain repositories from being backed up
-        -->
-        <excludedRepositories>
-            <repositoryRef>repo1</repositoryRef>
-            <repositoryRef>codehaus-snapshots</repositoryRef>
-            <repositoryRef>java.net</repositoryRef>
-        </excludedRepositories>
-    </backup>
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases</key>
-            <description>Local repository for in-house libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots</key>
-            <description>Local repository for in-house snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases</key>
-            <description>Local repository for plugins</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots</key>
-            <description>Local repository for plugins snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-releases</key>
-            <description>Local repository for third party libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshots</key>
-            <description>Local repository for third party snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <snapshotVersionBehavior>nonunique</snapshotVersionBehavior>
-        </localRepository>
-
-        <!--
-        A sample local repository with all possible settings
-        -->
-        <!--<localRepository>-->
-        <!--<key>local-sample</key>-->
-        <!--<description>Sample local repository</description>-->
-        <!--<blackedOut>false</blackedOut>-->
-        <!--<handleReleases>true</handleReleases>-->
-        <!--<handleSnapshots>true</handleSnapshots>-->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--<maxUniqueSnapshots>3</maxUniqueSnapshots>-->
-        <!--<includesPattern>*/**</includesPattern>-->
-        <!--<excludesPattern>com/mycompany/**</excludesPattern>-->
-        <!--
-        centrally control unique snapshots behavior (nonunique|unique|deployer)
-        -->
-        <!--<snapshotVersionBehavior>nonunique</snapshotVersionBehavior>-->
-        <!--</localRepository>-->
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://repo1.maven.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus-snapshots</key>
-            <blackedOut>true</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://snapshots.repository.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net</key>
-            <description>java.net</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://download.java.net/maven/2</url>
-        </remoteRepository>
-        <!--<remoteRepository>
-            <key>codehaus</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://dist.codehaus.org</url>
-        </remoteRepository>-->
-        <!--<remoteRepository>
-            <key>ibiblio</key>
-            <excludesPattern>org/artifactory/**</excludesPattern>
-            <url>http://www.ibiblio.org/maven2</url>
-        </remoteRepository>-->
-        <!--<remoteRepository>
-            <key>apache-m2-snapshots</key>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://people.apache.org/repo/m2-snapshot-repository</url>
-            <proxyRef>unused-proxy</proxyRef>
-        </remoteRepository>-->
-
-        <!-- A sample remote repository with all possible tunings -->
-        <!--<remoteRepository>-->
-        <!--<key>remote-sample</key>-->
-        <!--<description>Sample remote repository</description>-->
-        <!--
-        blok the usgae of this repository
-        -->
-        <!--<blackedOut>false</blackedOut>-->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--<maxUniqueSnapshots>3</maxUniqueSnapshots>-->
-        <!--<includesPattern>*/**</includesPattern>-->
-        <!--<excludesPattern>com/mycompany/**</excludesPattern>-->
-        <!--<url>http://maven.repo/repository</url>-->
-        <!--
-        put offline to use only the cache and not send remote requests
-        -->
-        <!--<offline>false</offline>-->
-        <!--<hardFail>true</hardFail>-->
-        <!--
-        cache remotely retrieved artifacts (you'd want 'true')
-        -->
-        <!--<storeArtifactsLocally>true</storeArtifactsLocally>-->
-        <!--
-        number of seconds to cache artifact lookup results
-        -->
-        <!--<retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to cache artifact retrieval failures (normally communication errors)
-        -->
-        <!--<failedRetrievalCachePeriodSecs>30</failedRetrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to remember artifact retrieval misses (artifact not found)
-        -->
-        <!--<missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>-->
-        <!--
-        ttp authentication details
-        -->
-        <!--<username>un</username>-->
-        <!--<password>pw</password>-->
-        <!--
-        network timeout for both connection establishment failures and unanswered requests
-        -->
-        <!--<socketTimeoutMillis>2000</socketTimeoutMillis>-->
-        <!--
-        proxy reference
-        -->
-        <!--<proxyRef>unused-proxy</proxyRef>-->
-        <!--</remoteRepository>-->
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <!-- This repositoy will be available at the url:
-        http://<host>:<port>/artifactory/snapshots-only/
-        (note the trailing slash!)
-        -->
-        <virtualRepository>
-            <key>snapshots-only</key>
-            <repositories>
-                <repositoryRef>libs-snapshots</repositoryRef>
-                <repositoryRef>plugins-snapshots</repositoryRef>
-                <repositoryRef>ext-snapshots</repositoryRef>
-                <repositoryRef>codehaus-snapshots</repositoryRef>
-            </repositories>
-        </virtualRepository>
-    </virtualRepositories>
-
-    <proxies>
-        <proxy>
-            <key>unused-proxy</key>
-            <host>host</host>
-            <port>8080</port>
-            <username>un</username>
-            <password>pw</password>
-            <domain>mydomain</domain>
-        </proxy>
-    </proxies>
-
-</config>
diff --git a/base/config/src/test/resources/config/install/config.1.2.0.xml b/base/config/src/test/resources/config/install/config.1.2.0.xml
deleted file mode 100644
index 8e002fb..0000000
--- a/base/config/src/test/resources/config/install/config.1.2.0.xml
+++ /dev/null
@@ -1,243 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.2.0"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.2.0
-        http://www.jfrog.org/xsd/artifactory-v1_2_0.xsd">
-    <!--
-    enable/disable anonymous downloads
-    -->
-    <anonDownloadsAllowed>false</anonDownloadsAllowed>
-    <!--security>
-        <ldapSettings>
-            <authenticationMethod>bind-anonymous</authenticationMethod>
-            <ldapUrl>ldap://mydomain:389/dc=mycompany,dc=com</ldapUrl>
-            <userDnPattern>uid={0},ou=People</userDnPattern>
-            <managerDn></managerDn>
-            <managerPassword></managerPassword>
-            <searchAuthPasswordAttributeName>userPassword</searchAuthPasswordAttributeName>
-        </ldapSettings>
-    </security-->
-    <backup>
-        <!--
-        alternative backup dir
-        -->
-        <!--<dir></dir>-->
-        <!--
-        backup every 12 hours
-        -->
-        <cronExp>0 0 /12 * * ?</cronExp>
-        <!--
-        keep backups for a week
-        -->
-        <retentionPeriodHours>168</retentionPeriodHours>
-        <!--
-        exclude certain repositories from being backed up
-        -->
-        <excludedRepositories>
-            <repositoryRef>repo1</repositoryRef>
-            <repositoryRef>codehaus-snapshots</repositoryRef>
-            <repositoryRef>java.net</repositoryRef>
-        </excludedRepositories>
-    </backup>
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases</key>
-            <description>Local repository for in-house libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots</key>
-            <description>Local repository for in-house snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases</key>
-            <description>Local repository for plugins</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots</key>
-            <description>Local repository for plugins snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-releases</key>
-            <description>Local repository for third party libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshots</key>
-            <description>Local repository for third party snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-
-        <!--
-        A sample local repository with all possible settings
-        -->
-        <!--<localRepository>-->
-        <!--<key>local-sample</key>-->
-        <!--<description>Sample local repository</description>-->
-        <!--<blackedOut>false</blackedOut>-->
-        <!--<handleReleases>true</handleReleases>-->
-        <!--<handleSnapshots>true</handleSnapshots>-->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--<maxUniqueSnapshots>3</maxUniqueSnapshots>-->
-        <!--<includesPattern>*/**</includesPattern>-->
-        <!--<excludesPattern>com/mycompany/**</excludesPattern>-->
-        <!--
-        centrally control unique snapshots behavior (nonunique|unique|deployer)
-        -->
-        <!--<snapshotVersionBehavior>nonunique</snapshotVersionBehavior>-->
-        <!--</localRepository>-->
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://repo1.maven.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus-snapshots</key>
-            <blackedOut>true</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://snapshots.repository.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net</key>
-            <description>java.net</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://download.java.net/maven/2</url>
-        </remoteRepository>
-        <!--<remoteRepository>
-            <key>codehaus</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://dist.codehaus.org</url>
-        </remoteRepository>-->
-        <!--<remoteRepository>
-            <key>ibiblio</key>
-            <excludesPattern>org/artifactory/**</excludesPattern>
-            <url>http://www.ibiblio.org/maven2</url>
-        </remoteRepository>-->
-        <!--<remoteRepository>
-            <key>apache-m2-snapshots</key>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://people.apache.org/repo/m2-snapshot-repository</url>
-            <proxyRef>unused-proxy</proxyRef>
-        </remoteRepository>-->
-
-        <!-- A sample remote repository with all possible tunings -->
-        <!--<remoteRepository>-->
-        <!--<key>remote-sample</key>-->
-        <!--<description>Sample remote repository</description>-->
-        <!--
-        blok the usgae of this repository
-        -->
-        <!--<blackedOut>false</blackedOut>-->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--<maxUniqueSnapshots>3</maxUniqueSnapshots>-->
-        <!--<includesPattern>*/**</includesPattern>-->
-        <!--<excludesPattern>com/mycompany/**</excludesPattern>-->
-        <!--<url>http://maven.repo/repository</url>-->
-        <!--
-        put offline to use only the cache and not send remote requests
-        -->
-        <!--<offline>false</offline>-->
-        <!--<hardFail>true</hardFail>-->
-        <!--
-        cache remotely retrieved artifacts (you'd want 'true')
-        -->
-        <!--<storeArtifactsLocally>true</storeArtifactsLocally>-->
-        <!--
-        number of seconds to cache artifact lookup results
-        -->
-        <!--<retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to cache artifact retrieval failures (normally communication errors)
-        -->
-        <!--<failedRetrievalCachePeriodSecs>30</failedRetrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to remember artifact retrieval misses (artifact not found)
-        -->
-        <!--<missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>-->
-        <!--
-        ttp authentication details
-        -->
-        <!--<username>un</username>-->
-        <!--<password>pw</password>-->
-        <!--
-        network timeout for both connection establishment failures and unanswered requests
-        -->
-        <!--<socketTimeoutMillis>2000</socketTimeoutMillis>-->
-        <!--
-        proxy reference
-        -->
-        <!--<proxyRef>unused-proxy</proxyRef>-->
-        <!--</remoteRepository>-->
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <!-- This repositoy will be available at the url:
-        http://<host>:<port>/artifactory/snapshots-only/
-        (note the trailing slash!)
-        -->
-        <virtualRepository>
-            <key>snapshots-only</key>
-            <repositories>
-                <repositoryRef>libs-snapshots</repositoryRef>
-                <repositoryRef>plugins-snapshots</repositoryRef>
-                <repositoryRef>ext-snapshots</repositoryRef>
-                <repositoryRef>codehaus-snapshots</repositoryRef>
-            </repositories>
-        </virtualRepository>
-    </virtualRepositories>
-
-    <proxies>
-        <proxy>
-            <key>unused-proxy</key>
-            <host>host</host>
-            <port>8080</port>
-            <username>un</username>
-            <password>pw</password>
-            <domain>mydomain</domain>
-        </proxy>
-    </proxies>
-
-</config>
diff --git a/base/config/src/test/resources/config/install/config.1.3.0.xml b/base/config/src/test/resources/config/install/config.1.3.0.xml
deleted file mode 100644
index 1b4bd17..0000000
--- a/base/config/src/test/resources/config/install/config.1.3.0.xml
+++ /dev/null
@@ -1,305 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.3.0"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.3.0
-        http://www.jfrog.org/xsd/artifactory-v1_3_0.xsd">
-    <!--
-    enable/disable anonymous downloads
-    -->
-    <anonAccessEnabled>false</anonAccessEnabled>
-    <security>
-        <ldapSettings>
-            <authenticationMethod>bind-anonymous</authenticationMethod>
-            <ldapUrl>ldap://mydomain:389/dc=mycompany,dc=com</ldapUrl>
-            <userDnPattern>uid={0},ou=People</userDnPattern>
-            <managerDn></managerDn>
-            <managerPassword></managerPassword>
-            <searchAuthPasswordAttributeName>userPassword</searchAuthPasswordAttributeName>
-        </ldapSettings>
-    </security>
-    <backup>
-        <!--
-        alternative backup dir
-        -->
-        <!--<dir></dir>-->
-        <!--
-        backup every 12 hours
-        -->
-        <cronExp>0 0 /12 * * ?</cronExp>
-        <!--
-        keep backups for a week.
-        Set to 0 in order to always backup to a "current" dir (useful for incremental FS backups).
-        -->
-        <retentionPeriodHours>168</retentionPeriodHours>
-        <!--
-        exclude certain repositories from being backed up
-        -->
-        <excludedRepositories>
-            <repositoryRef>repo1</repositoryRef>
-            <repositoryRef>codehaus-snapshots</repositoryRef>
-            <repositoryRef>java.net.m2</repositoryRef>
-            <repositoryRef>java.net.m1</repositoryRef>
-        </excludedRepositories>
-    </backup>
-    <!-- The cron definition to control the activation of the m2 eclipse indexer. Default every full hour. -->
-    <!--
-    <indexer>
-        <cronExp>0 /1 * * * ?</cronExp>
-    </indexer>
-    -->
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases-local</key>
-            <description>Local repository for plugins</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-releases-local</key>
-            <description>Local repository for third party libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshots-local</key>
-            <description>Local repository for third party snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-
-        <!--
-        A sample local repository with all possible settings
-        -->
-        <!--
-        <localRepository>
-            <key>local-sample</key>
-            <description>Sample local repository</description>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            -->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--
-        <maxUniqueSnapshots>3</maxUniqueSnapshots>
-        <includesPattern>*/**</includesPattern>
-        <excludesPattern>com/mycompany/**</excludesPattern>
-        -->
-        <!--
-        centrally control unique snapshots behavior (non-unique|unique|deployer)
-        -->
-        <!--
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-        </localRepository>
-        -->
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://repo1.maven.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus-snapshots</key>
-            <blackedOut>true</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://snapshots.repository.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m2</key>
-            <description>java.net Maven2 Format</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://download.java.net/maven/2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m1</key>
-            <description>java.net Maven1 Format</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <type>maven1</type>
-            <url>http://download.java.net/maven/1</url>
-        </remoteRepository>
-        <!--
-        <remoteRepository>
-            <key>codehaus</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://dist.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>ibiblio</key>
-            <excludesPattern>org/artifactory/**</excludesPattern>
-            <url>http://www.ibiblio.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>apache-m2-snapshots</key>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://people.apache.org/repo/m2-snapshot-repository</url>
-            <proxyRef>unused-proxy</proxyRef>
-        </remoteRepository>
-        -->
-
-        <!-- A sample remote repository with all possible tunings -->
-        <!--
-        <remoteRepository>
-        <key>remote-sample</key>
-        <description>Sample remote repository</description>
-        -->
-        <!--
-        blok the usage of this repository
-        -->
-        <!--<blackedOut>false</blackedOut>-->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--<maxUniqueSnapshots>3</maxUniqueSnapshots>-->
-        <!--<includesPattern>*/**</includesPattern>-->
-        <!--<excludesPattern>com/mycompany/**</excludesPattern>-->
-        <!--<url>http://maven.repo/repository</url>-->
-        <!--
-        put offline to use only the cache and not send remote requests
-        -->
-        <!--<offline>false</offline>-->
-        <!--<hardFail>true</hardFail>-->
-        <!--
-        cache remotely retrieved artifacts (you'd want 'true')
-        -->
-        <!--<storeArtifactsLocally>true</storeArtifactsLocally>-->
-        <!--
-        number of seconds to cache artifact lookup results
-        -->
-        <!--<retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to cache artifact retrieval failures (normally communication errors)
-        -->
-        <!--<failedRetrievalCachePeriodSecs>30</failedRetrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to remember artifact retrieval misses (artifact not found)
-        -->
-        <!--<missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>-->
-        <!--
-        ttp authentication details
-        -->
-        <!--<username>un</username>-->
-        <!--<password>pw</password>-->
-        <!--
-        network timeout for both connection establishment failures and unanswered requests
-        -->
-        <!--<socketTimeoutMillis>2000</socketTimeoutMillis>-->
-        <!--
-        proxy reference
-        -->
-        <!--<proxyRef>unused-proxy</proxyRef>-->
-        <!--</remoteRepository>-->
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <!-- This repositoy will be available at the url:
-        http://<host>:<port>/artifactory/snapshots-only/
-        (note the trailing slash!)
-        -->
-        <virtualRepository>
-            <key>remote-repos</key>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-releases</key>
-            <repositories>
-                <repositoryRef>libs-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-releases</key>
-            <repositories>
-                <repositoryRef>plugins-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshots</key>
-            <repositories>
-                <repositoryRef>libs-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-                <repositoryRef>codehaus-snapshots</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshots</key>
-            <repositories>
-                <repositoryRef>plugins-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-                <repositoryRef>codehaus-snapshots</repositoryRef>
-            </repositories>
-        </virtualRepository>
-    </virtualRepositories>
-
-    <!--
-        <proxies>
-            <proxy>
-                <key>unused-proxy</key>
-                <host>host</host>
-                <port>8080</port>
-                <username>un</username>
-                <password>pw</password>
-                <domain>mydomain</domain>
-            </proxy>
-        </proxies>
-    -->
-
-</config>
diff --git a/base/config/src/test/resources/config/install/config.1.3.1.xml b/base/config/src/test/resources/config/install/config.1.3.1.xml
deleted file mode 100644
index cba30b3..0000000
--- a/base/config/src/test/resources/config/install/config.1.3.1.xml
+++ /dev/null
@@ -1,305 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.3.1"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.3.1
-        http://www.jfrog.org/xsd/artifactory-v1_3_1.xsd">
-    <!--
-    enable/disable anonymous downloads
-    -->
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-        <!--<ldapSettings>
-            <ldapUrl>ldap://mydomain:389/dc=jfrog,dc=org</ldapUrl>
-            <userDnPattern>uid={0}, ou=People</userDnPattern>
-            <managerDn></managerDn>
-            <managerPassword></managerPassword>
-        </ldapSettings>-->
-    </security>
-    <backups>
-        <backup>
-            <!--
-            alternative backup dir
-            -->
-            <!--<dir></dir>-->
-            <!--
-            backup every 12 hours
-            -->
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <!--
-            keep backups for a week.
-            Set to 0 in order to always backup to a "current" dir (useful for incremental FS backups).
-            -->
-            <retentionPeriodHours>168</retentionPeriodHours>
-            <!--
-            exclude certain repositories from being backed up
-            -->
-            <excludedRepositories>
-                <repositoryRef>repo1</repositoryRef>
-                <repositoryRef>codehaus-snapshots</repositoryRef>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-            </excludedRepositories>
-        </backup>
-    </backups>
-    <!-- The cron definition to control the activation of the m2 eclipse indexer. Default every full hour. -->
-    <!--
-    <indexer>
-        <cronExp>0 /1 * * * ?</cronExp>
-    </indexer>
-    -->
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases-local</key>
-            <description>Local repository for plugins</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-releases-local</key>
-            <description>Local repository for third party libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshots-local</key>
-            <description>Local repository for third party snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-
-        <!--
-        A sample local repository with all possible settings
-        -->
-        <!--
-        <localRepository>
-            <key>local-sample</key>
-            <description>Sample local repository</description>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            -->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--
-        <maxUniqueSnapshots>3</maxUniqueSnapshots>
-        <includesPattern>*/**</includesPattern>
-        <excludesPattern>com/mycompany/**</excludesPattern>
-        -->
-        <!--
-        centrally control unique snapshots behavior (non-unique|unique|deployer)
-        -->
-        <!--
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-        </localRepository>
-        -->
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://repo1.maven.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus-snapshots</key>
-            <blackedOut>true</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://snapshots.repository.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m2</key>
-            <description>java.net Maven2 Format</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://download.java.net/maven/2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m1</key>
-            <description>java.net Maven1 Format</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <type>maven1</type>
-            <url>http://download.java.net/maven/1</url>
-        </remoteRepository>
-        <!--
-        <remoteRepository>
-            <key>codehaus</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://dist.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>ibiblio</key>
-            <excludesPattern>org/artifactory/**</excludesPattern>
-            <url>http://www.ibiblio.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>apache-m2-snapshots</key>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://people.apache.org/repo/m2-snapshot-repository</url>
-            <proxyRef>unused-proxy</proxyRef>
-        </remoteRepository>
-        -->
-
-        <!-- A sample remote repository with all possible tunings -->
-        <!--
-        <remoteRepository>
-        <key>remote-sample</key>
-        <description>Sample remote repository</description>
-        -->
-        <!--
-        blok the usage of this repository
-        -->
-        <!--<blackedOut>false</blackedOut>-->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--<maxUniqueSnapshots>3</maxUniqueSnapshots>-->
-        <!--<includesPattern>*/**</includesPattern>-->
-        <!--<excludesPattern>com/mycompany/**</excludesPattern>-->
-        <!--<url>http://maven.repo/repository</url>-->
-        <!--
-        put offline to use only the cache and not send remote requests
-        -->
-        <!--<offline>false</offline>-->
-        <!--<hardFail>true</hardFail>-->
-        <!--
-        cache remotely retrieved artifacts (you'd want 'true')
-        -->
-        <!--<storeArtifactsLocally>true</storeArtifactsLocally>-->
-        <!--
-        number of seconds to cache artifact lookup results
-        -->
-        <!--<retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to cache artifact retrieval failures (normally communication errors)
-        -->
-        <!--<failedRetrievalCachePeriodSecs>30</failedRetrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to remember artifact retrieval misses (artifact not found)
-        -->
-        <!--<missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>-->
-        <!--
-        ttp authentication details
-        -->
-        <!--<username>un</username>-->
-        <!--<password>pw</password>-->
-        <!--
-        network timeout for both connection establishment failures and unanswered requests
-        -->
-        <!--<socketTimeoutMillis>2000</socketTimeoutMillis>-->
-        <!--
-        proxy reference
-        -->
-        <!--<proxyRef>unused-proxy</proxyRef>-->
-        <!--</remoteRepository>-->
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <!-- This repositoy will be available at the url:
-        http://<host>:<port>/artifactory/snapshots-only/
-        (note the trailing slash!)
-        -->
-        <virtualRepository>
-            <key>remote-repos</key>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-releases</key>
-            <repositories>
-                <repositoryRef>libs-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-releases</key>
-            <repositories>
-                <repositoryRef>plugins-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshots</key>
-            <repositories>
-                <repositoryRef>libs-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-                <repositoryRef>codehaus-snapshots</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshots</key>
-            <repositories>
-                <repositoryRef>plugins-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-                <repositoryRef>codehaus-snapshots</repositoryRef>
-            </repositories>
-        </virtualRepository>
-    </virtualRepositories>
-
-    <!--
-        <proxies>
-            <proxy>
-                <key>unused-proxy</key>
-                <host>host</host>
-                <port>8080</port>
-                <username>un</username>
-                <password>pw</password>
-                <domain>mydomain</domain>
-            </proxy>
-        </proxies>
-    -->
-
-</config>
diff --git a/base/config/src/test/resources/config/install/config.1.3.2.xml b/base/config/src/test/resources/config/install/config.1.3.2.xml
deleted file mode 100644
index 97023a6..0000000
--- a/base/config/src/test/resources/config/install/config.1.3.2.xml
+++ /dev/null
@@ -1,311 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.3.2"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.3.2
-        http://www.jfrog.org/xsd/artifactory-v1_3_2.xsd">
-    <!--
-    enable/disable anonymous downloads
-    -->
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-        <!--
-        <ldapSettings>
-            <ldapUrl>ldap://mydomain:389/dc=jfrog,dc=org</ldapUrl>
-            <authenticationPatterns>
-                <authenticationPattern>
-                    <userDnPattern>uid={0}, ou=People</userDnPattern>
-                </authenticationPattern>
-            </authenticationPatterns>
-            <managerDn></managerDn>
-            <managerPassword></managerPassword>
-        </ldapSettings>
-        -->
-    </security>
-    <backups>
-        <backup>
-            <!--
-            alternative backup dir
-            -->
-            <!--<dir></dir>-->
-            <!--
-            backup every 12 hours
-            -->
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <!--
-            keep backups for a week.
-            Set to 0 in order to always backup to a "current" dir (useful for incremental FS backups).
-            -->
-            <retentionPeriodHours>168</retentionPeriodHours>
-            <!--
-            exclude certain repositories from being backed up
-            -->
-            <excludedRepositories>
-                <repositoryRef>repo1</repositoryRef>
-                <repositoryRef>codehaus-snapshots</repositoryRef>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-            </excludedRepositories>
-        </backup>
-    </backups>
-    <!-- The cron definition to control the activation of the m2 eclipse indexer. Default every full hour. -->
-    <!--
-    <indexer>
-        <cronExp>0 /1 * * * ?</cronExp>
-    </indexer>
-    -->
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases-local</key>
-            <description>Local repository for plugins</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-releases-local</key>
-            <description>Local repository for third party libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshots-local</key>
-            <description>Local repository for third party snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-
-        <!--
-        A sample local repository with all possible settings
-        -->
-        <!--
-        <localRepository>
-            <key>local-sample</key>
-            <description>Sample local repository</description>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            -->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--
-        <maxUniqueSnapshots>3</maxUniqueSnapshots>
-        <includesPattern>*/**</includesPattern>
-        <excludesPattern>com/mycompany/**</excludesPattern>
-        -->
-        <!--
-        centrally control unique snapshots behavior (non-unique|unique|deployer)
-        -->
-        <!--
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-        </localRepository>
-        -->
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://repo1.maven.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus-snapshots</key>
-            <blackedOut>true</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://snapshots.repository.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m2</key>
-            <description>java.net Maven2 Format</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://download.java.net/maven/2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m1</key>
-            <description>java.net Maven1 Format</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <type>maven1</type>
-            <url>http://download.java.net/maven/1</url>
-        </remoteRepository>
-        <!--
-        <remoteRepository>
-            <key>codehaus</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://dist.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>ibiblio</key>
-            <excludesPattern>org/artifactory/**</excludesPattern>
-            <url>http://www.ibiblio.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>apache-m2-snapshots</key>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://people.apache.org/repo/m2-snapshot-repository</url>
-            <proxyRef>unused-proxy</proxyRef>
-        </remoteRepository>
-        -->
-
-        <!-- A sample remote repository with all possible tunings -->
-        <!--
-        <remoteRepository>
-        <key>remote-sample</key>
-        <description>Sample remote repository</description>
-        -->
-        <!--
-        blok the usage of this repository
-        -->
-        <!--<blackedOut>false</blackedOut>-->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--<maxUniqueSnapshots>3</maxUniqueSnapshots>-->
-        <!--<includesPattern>*/**</includesPattern>-->
-        <!--<excludesPattern>com/mycompany/**</excludesPattern>-->
-        <!--<url>http://maven.repo/repository</url>-->
-        <!--
-        put offline to use only the cache and not send remote requests
-        -->
-        <!--<offline>false</offline>-->
-        <!--<hardFail>true</hardFail>-->
-        <!--
-        cache remotely retrieved artifacts (you'd want 'true')
-        -->
-        <!--<storeArtifactsLocally>true</storeArtifactsLocally>-->
-        <!--
-        number of seconds to cache artifact lookup results
-        -->
-        <!--<retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to cache artifact retrieval failures (normally communication errors)
-        -->
-        <!--<failedRetrievalCachePeriodSecs>30</failedRetrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to remember artifact retrieval misses (artifact not found)
-        -->
-        <!--<missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>-->
-        <!--
-        ttp authentication details
-        -->
-        <!--<username>un</username>-->
-        <!--<password>pw</password>-->
-        <!--
-        network timeout for both connection establishment failures and unanswered requests
-        -->
-        <!--<socketTimeoutMillis>2000</socketTimeoutMillis>-->
-        <!--
-        proxy reference
-        -->
-        <!--<proxyRef>unused-proxy</proxyRef>-->
-        <!--</remoteRepository>-->
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <!-- This repositoy will be available at the url:
-        http://<host>:<port>/artifactory/snapshots-only/
-        (note the trailing slash!)
-        -->
-        <virtualRepository>
-            <key>remote-repos</key>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-releases</key>
-            <repositories>
-                <repositoryRef>libs-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-releases</key>
-            <repositories>
-                <repositoryRef>plugins-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshots</key>
-            <repositories>
-                <repositoryRef>libs-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-                <repositoryRef>codehaus-snapshots</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshots</key>
-            <repositories>
-                <repositoryRef>plugins-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-                <repositoryRef>codehaus-snapshots</repositoryRef>
-            </repositories>
-        </virtualRepository>
-    </virtualRepositories>
-
-    <!--
-        <proxies>
-            <proxy>
-                <key>unused-proxy</key>
-                <host>host</host>
-                <port>8080</port>
-                <username>un</username>
-                <password>pw</password>
-                <domain>mydomain</domain>
-            </proxy>
-        </proxies>
-    -->
-
-</config>
diff --git a/base/config/src/test/resources/config/install/config.1.3.4.xml b/base/config/src/test/resources/config/install/config.1.3.4.xml
deleted file mode 100644
index c60795e..0000000
--- a/base/config/src/test/resources/config/install/config.1.3.4.xml
+++ /dev/null
@@ -1,304 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.3.4"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.3.4
-        http://www.jfrog.org/xsd/artifactory-v1_3_4.xsd">
-    <!--
-    enable/disable anonymous downloads
-    -->
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-        <!--<ldapSettings>
-            <ldapSetting>
-                <key>ldap1</key>
-                <enabled>true</enabled>
-                <ldapUrl>ldap://mydomain:389/dc=mycompany,dc=com</ldapUrl>
-                <userDnPattern>uid={0}, ou=People</userDnPattern>
-            </ldapSetting>
-        </ldapSettings>-->
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <!--
-            alternative backup dir
-            -->
-            <!--<dir></dir>-->
-            <!--
-            backup every 12 hours
-            -->
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <!--
-            keep backups for a week.
-            Set to 0 in order to always backup to a "current" dir (useful for incremental FS backups).
-            -->
-            <retentionPeriodHours>168</retentionPeriodHours>
-            <!--
-            exclude certain repositories from being backed up
-            -->
-            <excludedRepositories>
-                <repositoryRef>repo1</repositoryRef>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                <repositoryRef>codehaus</repositoryRef>
-            </excludedRepositories>
-        </backup>
-    </backups>
-    <!-- The cron definition to control the activation of the m2eclipse indexer. -->
-    <indexer>
-        <!-- By Default index every 5 hours -->
-        <cronExp>0 0 /5 * * ?</cronExp>
-    </indexer>
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases-local</key>
-            <description>Local repository for plugins</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-releases-local</key>
-            <description>Local repository for third party libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshots-local</key>
-            <description>Local repository for third party snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-
-        <!--
-        A sample local repository with all possible settings
-        -->
-        <!--
-        <localRepository>
-            <key>local-sample</key>
-            <description>Sample local repository</description>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            -->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--
-        <maxUniqueSnapshots>3</maxUniqueSnapshots>
-        <includesPattern>*/**</includesPattern>
-        <excludesPattern>com/mycompany/**</excludesPattern>
-        -->
-        <!--
-        centrally control unique snapshots behavior (non-unique|unique|deployer)
-        -->
-        <!--
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-        </localRepository>
-        -->
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://repo1.maven.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m2</key>
-            <description>java.net Maven2 Format</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://download.java.net/maven/2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m1</key>
-            <description>java.net Maven1 Format</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <type>maven1</type>
-            <url>http://download.java.net/maven/1</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://repository.codehaus.org</url>
-        </remoteRepository>
-        <!--
-        <remoteRepository>
-            <key>codehaus</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://dist.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>ibiblio</key>
-            <excludesPattern>org/artifactory/**</excludesPattern>
-            <url>http://www.ibiblio.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>apache-m2-snapshots</key>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://people.apache.org/repo/m2-snapshot-repository</url>
-            <proxyRef>unused-proxy</proxyRef>
-        </remoteRepository>
-        -->
-
-        <!-- A sample remote repository with all possible tunings -->
-        <!--
-        <remoteRepository>
-        <key>remote-sample</key>
-        <description>Sample remote repository</description>
-        -->
-        <!--
-        blok the usage of this repository
-        -->
-        <!--<blackedOut>false</blackedOut>-->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--<maxUniqueSnapshots>3</maxUniqueSnapshots>-->
-        <!--<includesPattern>*/**</includesPattern>-->
-        <!--<excludesPattern>com/mycompany/**</excludesPattern>-->
-        <!--<url>http://maven.repo/repository</url>-->
-        <!--
-        put offline to use only the cache and not send remote requests
-        -->
-        <!--<offline>false</offline>-->
-        <!--<hardFail>true</hardFail>-->
-        <!--
-        cache remotely retrieved artifacts (you'd want 'true')
-        -->
-        <!--<storeArtifactsLocally>true</storeArtifactsLocally>-->
-        <!--
-        number of seconds to cache artifact lookup results
-        -->
-        <!--<retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to cache artifact retrieval failures (normally communication errors)
-        -->
-        <!--<failedRetrievalCachePeriodSecs>30</failedRetrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to remember artifact retrieval misses (artifact not found)
-        -->
-        <!--<missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>-->
-        <!--
-        ttp authentication details
-        -->
-        <!--<username>un</username>-->
-        <!--<password>pw</password>-->
-        <!--
-        network timeout for both connection establishment failures and unanswered requests
-        -->
-        <!--<socketTimeoutMillis>2000</socketTimeoutMillis>-->
-        <!--
-        proxy reference
-        -->
-        <!--<proxyRef>unused-proxy</proxyRef>-->
-        <!--</remoteRepository>-->
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <!-- This repositoy will be available at the url:
-        http://<host>:<port>/artifactory/snapshots-only/
-        (note the trailing slash!)
-        -->
-        <virtualRepository>
-            <key>remote-repos</key>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-releases</key>
-            <repositories>
-                <repositoryRef>libs-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-releases</key>
-            <repositories>
-                <repositoryRef>plugins-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshots</key>
-            <repositories>
-                <repositoryRef>libs-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshots</key>
-            <repositories>
-                <repositoryRef>plugins-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-    </virtualRepositories>
-
-    <!--
-        <proxies>
-            <proxy>
-                <key>unused-proxy</key>
-                <host>host</host>
-                <port>8080</port>
-                <username>un</username>
-                <password>pw</password>
-                <domain>mydomain</domain>
-            </proxy>
-        </proxies>
-    -->
-
-</config>
diff --git a/base/config/src/test/resources/config/install/config.1.3.5.xml b/base/config/src/test/resources/config/install/config.1.3.5.xml
deleted file mode 100644
index 2975646..0000000
--- a/base/config/src/test/resources/config/install/config.1.3.5.xml
+++ /dev/null
@@ -1,304 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.3.5"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.3.5
-        http://www.jfrog.org/xsd/artifactory-v1_3_5.xsd">
-    <!--
-    enable/disable anonymous downloads
-    -->
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-        <!--<ldapSettings>
-            <ldapSetting>
-                <key>ldap1</key>
-                <enabled>true</enabled>
-                <ldapUrl>ldap://mydomain:389/dc=mycompany,dc=com</ldapUrl>
-                <userDnPattern>uid={0}, ou=People</userDnPattern>
-            </ldapSetting>
-        </ldapSettings>-->
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <!--
-            alternative backup dir
-            -->
-            <!--<dir></dir>-->
-            <!--
-            backup every 12 hours
-            -->
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <!--
-            keep backups for a week.
-            Set to 0 in order to always backup to a "current" dir (useful for incremental FS backups).
-            -->
-            <retentionPeriodHours>168</retentionPeriodHours>
-            <!--
-            exclude certain repositories from being backed up
-            -->
-            <excludedRepositories>
-                <repositoryRef>repo1</repositoryRef>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                <repositoryRef>codehaus</repositoryRef>
-            </excludedRepositories>
-        </backup>
-    </backups>
-    <!-- The cron definition to control the activation of the m2eclipse indexer. -->
-    <indexer>
-        <!-- By Default index every 5 hours -->
-        <cronExp>0 0 /5 * * ?</cronExp>
-    </indexer>
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases-local</key>
-            <description>Local repository for plugins</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-releases-local</key>
-            <description>Local repository for third party libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshots-local</key>
-            <description>Local repository for third party snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-
-        <!--
-        A sample local repository with all possible settings
-        -->
-        <!--
-        <localRepository>
-            <key>local-sample</key>
-            <description>Sample local repository</description>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            -->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--
-        <maxUniqueSnapshots>3</maxUniqueSnapshots>
-        <includesPattern>*/**</includesPattern>
-        <excludesPattern>com/mycompany/**</excludesPattern>
-        -->
-        <!--
-        centrally control unique snapshots behavior (non-unique|unique|deployer)
-        -->
-        <!--
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-        </localRepository>
-        -->
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://repo1.maven.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m2</key>
-            <description>java.net Maven2 Format</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://download.java.net/maven/2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m1</key>
-            <description>java.net Maven1 Format</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <type>maven1</type>
-            <url>http://download.java.net/maven/1</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://repository.codehaus.org</url>
-        </remoteRepository>
-        <!--
-        <remoteRepository>
-            <key>codehaus</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://dist.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>ibiblio</key>
-            <excludesPattern>org/artifactory/**</excludesPattern>
-            <url>http://www.ibiblio.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>apache-m2-snapshots</key>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://people.apache.org/repo/m2-snapshot-repository</url>
-            <proxyRef>unused-proxy</proxyRef>
-        </remoteRepository>
-        -->
-
-        <!-- A sample remote repository with all possible tunings -->
-        <!--
-        <remoteRepository>
-        <key>remote-sample</key>
-        <description>Sample remote repository</description>
-        -->
-        <!--
-        blok the usage of this repository
-        -->
-        <!--<blackedOut>false</blackedOut>-->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--<maxUniqueSnapshots>3</maxUniqueSnapshots>-->
-        <!--<includesPattern>*/**</includesPattern>-->
-        <!--<excludesPattern>com/mycompany/**</excludesPattern>-->
-        <!--<url>http://maven.repo/repository</url>-->
-        <!--
-        put offline to use only the cache and not send remote requests
-        -->
-        <!--<offline>false</offline>-->
-        <!--<hardFail>true</hardFail>-->
-        <!--
-        cache remotely retrieved artifacts (you'd want 'true')
-        -->
-        <!--<storeArtifactsLocally>true</storeArtifactsLocally>-->
-        <!--
-        number of seconds to cache artifact lookup results
-        -->
-        <!--<retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to cache artifact retrieval failures (normally communication errors)
-        -->
-        <!--<failedRetrievalCachePeriodSecs>30</failedRetrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to remember artifact retrieval misses (artifact not found)
-        -->
-        <!--<missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>-->
-        <!--
-        ttp authentication details
-        -->
-        <!--<username>un</username>-->
-        <!--<password>pw</password>-->
-        <!--
-        network timeout for both connection establishment failures and unanswered requests
-        -->
-        <!--<socketTimeoutMillis>2000</socketTimeoutMillis>-->
-        <!--
-        proxy reference
-        -->
-        <!--<proxyRef>unused-proxy</proxyRef>-->
-        <!--</remoteRepository>-->
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <!-- This repositoy will be available at the url:
-        http://<host>:<port>/artifactory/snapshots-only/
-        (note the trailing slash!)
-        -->
-        <virtualRepository>
-            <key>remote-repos</key>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-releases</key>
-            <repositories>
-                <repositoryRef>libs-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-releases</key>
-            <repositories>
-                <repositoryRef>plugins-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshots</key>
-            <repositories>
-                <repositoryRef>libs-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshots</key>
-            <repositories>
-                <repositoryRef>plugins-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-    </virtualRepositories>
-
-    <!--
-        <proxies>
-            <proxy>
-                <key>unused-proxy</key>
-                <host>host</host>
-                <port>8080</port>
-                <username>un</username>
-                <password>pw</password>
-                <domain>mydomain</domain>
-            </proxy>
-        </proxies>
-    -->
-
-</config>
diff --git a/base/config/src/test/resources/config/install/config.1.4.0.xml b/base/config/src/test/resources/config/install/config.1.4.0.xml
deleted file mode 100644
index 6ba39fb..0000000
--- a/base/config/src/test/resources/config/install/config.1.4.0.xml
+++ /dev/null
@@ -1,171 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns="http://artifactory.jfrog.org/xsd/1.4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.4.0 http://www.jfrog.org/xsd/artifactory-v1_4_0.xsd">
-
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <enabled>false</enabled>
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <retentionPeriodHours>0</retentionPeriodHours>
-            <excludedRepositories>
-                <repositoryRef>remote-repo</repositoryRef>
-            </excludedRepositories>
-        </backup>
-    </backups>
-    <!-- The interval at which to activate the m2eclipse indexer. -->
-    <!--
-    <indexer>
-        <indexingIntervalHours>24</indexingIntervalHours>
-    </indexer>
-    -->
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases-local</key>
-            <description>Local repository for plugins</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-releases-local</key>
-            <description>Local repository for third party libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshots-local</key>
-            <description>Local repository for third party snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>UNIQUE</key>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>5</maxUniqueSnapshots>
-            <includesPattern>**/*</includesPattern>
-            <snapshotVersionBehavior>unique</snapshotVersionBehavior>
-        </localRepository>
-        <localRepository>
-            <key>NONUNIQUE</key>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <includesPattern>**/*</includesPattern>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-        </localRepository>
-        <localRepository>
-            <key>DEPLOYER</key>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>5</maxUniqueSnapshots>
-            <includesPattern>**/*</includesPattern>
-            <snapshotVersionBehavior>deployer</snapshotVersionBehavior>
-        </localRepository>
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>remote-repo</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://repo.jfrog.org/artifactory/remote-repos</url>
-            <!--<url>http://repo1.maven.org/maven2</url>-->
-        </remoteRepository>
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <!-- This repositoy will be available at the url:
-        http://<host>:<port>/artifactory/snapshots-only/
-        (note the trailing slash!)
-        -->
-        <virtualRepository>
-            <key>remote-repos</key>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>remote-repo</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-releases</key>
-            <repositories>
-                <repositoryRef>libs-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>UNIQUE</repositoryRef>
-                <repositoryRef>NONUNIQUE</repositoryRef>
-                <repositoryRef>DEPLOYER</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-releases</key>
-            <repositories>
-                <repositoryRef>plugins-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshots</key>
-            <repositories>
-                <repositoryRef>libs-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>UNIQUE</repositoryRef>
-                <repositoryRef>NONUNIQUE</repositoryRef>
-                <repositoryRef>DEPLOYER</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshots</key>
-            <repositories>
-                <repositoryRef>plugins-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-    </virtualRepositories>
-</config>
diff --git a/base/config/src/test/resources/config/install/config.1.4.1.xml b/base/config/src/test/resources/config/install/config.1.4.1.xml
deleted file mode 100644
index d7529d7..0000000
--- a/base/config/src/test/resources/config/install/config.1.4.1.xml
+++ /dev/null
@@ -1,421 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.4.1"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.4.1
-        http://www.jfrog.org/xsd/artifactory-v1_4_1.xsd">
-    <!--
-    enable/disable anonymous downloads
-    -->
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-        <!--<ldapSettings>
-            <ldapSetting>
-                <key>ldap1</key>
-                <enabled>true</enabled>
-                <ldapUrl>ldap://mydomain:389/dc=mycompany,dc=com</ldapUrl>
-                <userDnPattern>uid={0}, ou=People</userDnPattern>
-            </ldapSetting>
-        </ldapSettings>-->
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <!--
-            alternative backup dir
-            -->
-            <!--<dir></dir>-->
-            <!--
-            backup every 12 hours
-            -->
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <!--
-            keep backups for a week.
-            Set to 0 in order to always backup to a "current" dir (useful for incremental FS backups).
-            -->
-            <retentionPeriodHours>168</retentionPeriodHours>
-            <!--
-            exclude certain repositories from being backed up
-            -->
-            <excludedRepositories>
-                <repositoryRef>codehaus</repositoryRef>
-                <repositoryRef>jboss</repositoryRef>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-                <repositoryRef>jfrog-libs</repositoryRef>
-                <repositoryRef>jfrog-plugins</repositoryRef>
-                <repositoryRef>spring-bundles-milestone</repositoryRef>
-                <repositoryRef>spring-bundles-snapshots</repositoryRef>
-                <repositoryRef>spring-bundles</repositoryRef>
-                <repositoryRef>spring-bundles-external</repositoryRef>
-                <repositoryRef>google-code</repositoryRef>
-                <repositoryRef>terracotta</repositoryRef>
-                <repositoryRef>scala-tools</repositoryRef>
-                <repositoryRef>atlassian</repositoryRef>
-            </excludedRepositories>
-        </backup>
-    </backups>
-    <!-- The interval at which to activate the m2eclipse indexer. -->
-    <indexer>
-        <!-- By Default index every 24 hours -->
-        <indexingIntervalHours>24</indexingIntervalHours>
-    </indexer>
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases-local</key>
-            <description>Local repository for plugins</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-releases-local</key>
-            <description>Local repository for third party libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshots-local</key>
-            <description>Local repository for third party snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-
-        <!--
-        A sample local repository with all possible settings
-        -->
-        <!--
-        <localRepository>
-            <key>local-sample</key>
-            <description>Sample local repository</description>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            -->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--
-        <includesPattern>*/**</includesPattern>
-        <excludesPattern>com/mycompany/**</excludesPattern>
-        <maxUniqueSnapshots>3</maxUniqueSnapshots>
-        -->
-        <!--
-        centrally control unique snapshots behavior (non-unique|unique|deployer)
-        -->
-        <!--
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-        </localRepository>
-        -->
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <description>Central Maven 2 repository</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo1.maven.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m2</key>
-            <description>java.net Maven2 Format</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>commons-*,org/apache/**</excludesPattern>
-            <url>http://download.java.net/maven/2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m1</key>
-            <description>java.net Maven1 Format</description>
-            <type>maven1</type>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://download.java.net/maven/1</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-libs</key>
-            <description>JFrog libraries releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/apache/maven/**</excludesPattern>
-            <url>http://repo.jfrog.org/artifactory/libs-releases-local</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-plugins</key>
-            <description>JFrog plugins releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <includesPattern>org/jfrog/**</includesPattern>
-            <url>http://repo.jfrog.org/artifactory/plugins-releases-local</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jboss</key>
-            <description>JBoss Maven2 releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <includesPattern>org/jboss/**,org/hibernate/**,org/richfaces/**,org/drools/**</includesPattern>
-            <url>http://repository.jboss.com/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus</key>
-            <description>Codehaus Maven2 releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <includesPattern>org/**,com/**,net/**</includesPattern>
-            <excludesPattern>org/apache/**,commons-*,org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://repository.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-bundles-milestone</key>
-            <description>SpringSource bundles in milestone version</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <includesPattern>org/springframework/**</includesPattern>
-            <url>http://repository.springsource.com/maven/bundles/milestone</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-bundles-snapshots</key>
-            <description>SpringSource bundles in snapshot stage</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <includesPattern>org/springframework/**</includesPattern>
-            <url>http://repository.springsource.com/maven/bundles/snapshot</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-bundles</key>
-            <description>SpringSource bundles releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <includesPattern>org/springframework/**</includesPattern>
-            <url>http://repository.springsource.com/maven/bundles/release</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-bundles-external</key>
-            <description>External artifacts needed by SpringSource bundles</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <includesPattern>**/com.springsource*/**</includesPattern>
-            <url>http://repository.springsource.com/maven/bundles/external</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>open-qa</key>
-            <description>OpenQA (Selenium) releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <includesPattern>org/openqa/**,org/seleniumhq/**</includesPattern>
-            <url>http://nexus.openqa.org/content/repositories/releases</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>terracotta</key>
-            <description>Terracotta releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <includesPattern>org/terracotta/**,net/sf/ehcache/**</includesPattern>
-            <url>http://repo.terracotta.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>google-code</key>
-            <description>Google's open source releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <includesPattern>com/google/**</includesPattern>
-            <url>http://google-maven-repository.googlecode.com/svn/repository</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>scala-tools</key>
-            <description>Scala-Tools.org releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <includesPattern>org/scala*/**</includesPattern>
-            <url>http://scala-tools.org/repo</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>atlassian</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <includesPattern>atlassian*/**,seraph/**,com/atlassian/**,com/adaptavist/**</includesPattern>
-            <url>http://maven.atlassian.com/repository/public</url>
-        </remoteRepository>
-
-
-        <!--
-        <remoteRepository>
-            <key>codehaus-snapshots</key>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://snapshots.repository.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>apache-m2-snapshots</key>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://people.apache.org/repo/m2-snapshot-repository</url>
-            <proxyRef>unused-proxy</proxyRef>
-        </remoteRepository>
-        -->
-
-        <!-- A sample remote repository with all possible tunings -->
-        <!--
-        <remoteRepository>
-        <key>remote-sample</key>
-        <description>Sample remote repository</description>
-        -->
-        <!--
-        blok the usage of this repository
-        -->
-        <!--<blackedOut>false</blackedOut>-->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--<maxUniqueSnapshots>3</maxUniqueSnapshots>-->
-        <!--<includesPattern>*/**</includesPattern>-->
-        <!--<excludesPattern>com/mycompany/**</excludesPattern>-->
-        <!--<url>http://maven.repo/repository</url>-->
-        <!--
-        put offline to use only the cache and not send remote requests
-        -->
-        <!--<offline>false</offline>-->
-        <!--<hardFail>true</hardFail>-->
-        <!--
-        cache remotely retrieved artifacts (you'd want 'true')
-        -->
-        <!--<storeArtifactsLocally>true</storeArtifactsLocally>-->
-        <!--
-        number of seconds to cache artifact lookup results
-        -->
-        <!--<retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to cache artifact retrieval failures (normally communication errors)
-        -->
-        <!--<failedRetrievalCachePeriodSecs>30</failedRetrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to remember artifact retrieval misses (artifact not found)
-        -->
-        <!--<missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>-->
-        <!--
-        ttp authentication details
-        -->
-        <!--<username>un</username>-->
-        <!--<password>pw</password>-->
-        <!--
-        network timeout for both connection establishment failures and unanswered requests
-        -->
-        <!--<socketTimeoutMillis>2000</socketTimeoutMillis>-->
-        <!--
-        proxy reference
-        -->
-        <!--<proxyRef>unused-proxy</proxyRef>-->
-        <!--</remoteRepository>-->
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <!-- This repositoy will be available at the url:
-        http://<host>:<port>/artifactory/snapshots-only/
-        (note the trailing slash!)
-        -->
-        <virtualRepository>
-            <key>remote-repos</key>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>codehaus</repositoryRef>
-                <repositoryRef>jboss</repositoryRef>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-                <repositoryRef>jfrog-libs</repositoryRef>
-                <repositoryRef>jfrog-plugins</repositoryRef>
-                <repositoryRef>spring-bundles-milestone</repositoryRef>
-                <repositoryRef>spring-bundles-snapshots</repositoryRef>
-                <repositoryRef>spring-bundles</repositoryRef>
-                <repositoryRef>spring-bundles-external</repositoryRef>
-                <repositoryRef>google-code</repositoryRef>
-                <repositoryRef>terracotta</repositoryRef>
-                <repositoryRef>scala-tools</repositoryRef>
-                <repositoryRef>atlassian</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-releases</key>
-            <repositories>
-                <repositoryRef>libs-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-releases</key>
-            <repositories>
-                <repositoryRef>plugins-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshots</key>
-            <repositories>
-                <repositoryRef>libs-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshots</key>
-            <repositories>
-                <repositoryRef>plugins-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-    </virtualRepositories>
-
-    <!--
-        <proxies>
-            <proxy>
-                <key>unused-proxy</key>
-                <host>host</host>
-                <port>8080</port>
-                <username>un</username>
-                <password>pw</password>
-                <domain>mydomain</domain>
-            </proxy>
-        </proxies>
-    -->
-
-</config>
diff --git a/base/config/src/test/resources/config/install/config.1.4.12.xml b/base/config/src/test/resources/config/install/config.1.4.12.xml
deleted file mode 100644
index f79b59e..0000000
--- a/base/config/src/test/resources/config/install/config.1.4.12.xml
+++ /dev/null
@@ -1,439 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.4.12"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.4.12
-        http://www.jfrog.org/xsd/artifactory-v1_4_12.xsd">
-    <!--
-    enable/disable anonymous downloads
-    -->
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-        <!--<ldapSettings>
-            <ldapSetting>
-                <key>ldap1</key>
-                <enabled>true</enabled>
-                <ldapUrl>ldap://mydomain:389/dc=mycompany,dc=com</ldapUrl>
-                <userDnPattern>uid={0}, ou=People</userDnPattern>
-            </ldapSetting>
-        </ldapSettings>-->
-    </security>
-    <backups>
-        <backup>
-            <key>backup-daily</key>
-            <!--
-            backup Monday to Friday at 2:00 AM
-            -->
-            <cronExp>0 0 2 ? * MON-FRI</cronExp>
-            <!--
-            Always backup to a "current" dir (incremental backups)
-            -->
-            <retentionPeriodHours>0</retentionPeriodHours>
-            <!--
-            exclude certain repositories from being backed up
-            -->
-            <excludedRepositories>
-                <repositoryRef>repo1</repositoryRef>
-            </excludedRepositories>
-        </backup>
-        <backup>
-            <key>backup-weekly</key>
-            <!--
-            backup on Saturday at 2:00 AM
-            -->
-            <cronExp>0 0 2 ? * SAT</cronExp>
-            <!--
-            keep backups for 2 weeks.
-            -->
-            <retentionPeriodHours>336</retentionPeriodHours>
-            <!--
-            exclude certain repositories from being backed up
-            -->
-            <excludedRepositories>
-                <repositoryRef>repo1</repositoryRef>
-            </excludedRepositories>
-        </backup>
-    </backups>
-
-    <!-- The interval at which to activate the maven indexer. -->
-    <indexer>
-        <!-- By Default index once a day at 05:23AM -->
-        <cronExp>0 23 5 * * ?</cronExp>
-    </indexer>
-
-    <localRepositories>
-        <localRepository>
-            <key>libs-release-local</key>
-            <description>Local repository for in-house libraries</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshot-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-release-local</key>
-            <description>Local repository for plugins</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshot-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-release-local</key>
-            <description>Local repository for third party libraries</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshot-local</key>
-            <description>Local repository for third party snapshots</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-
-        <!--
-        A sample local repository with all possible settings
-        -->
-        <!--
-        <localRepository>
-            <key>local-sample</key>
-            <description>Sample local repository</description>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            -->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--
-        <maxUniqueSnapshots>3</maxUniqueSnapshots>
-        <includesPattern>*/**</includesPattern>
-        <excludesPattern>com/mycompany/**</excludesPattern>
-        -->
-        <!--
-        centrally control unique snapshots behavior (non-unique|unique|deployer)
-        -->
-        <!--
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-        </localRepository>
-        -->
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <description>Central Maven 2 repository</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo1.maven.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m2</key>
-            <description>java.net Maven2 Format</description>
-            <excludesPattern>commons-*,org/apache/**</excludesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://download.java.net/maven/2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m1</key>
-            <description>java.net Maven1 Format</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://download.java.net/maven/1</url>
-            <remoteRepoLayoutRef>maven-1-default</remoteRepoLayoutRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-libs</key>
-            <description>JFrog libraries releases</description>
-            <excludesPattern>org/apache/maven/**</excludesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo.jfrog.org/artifactory/libs-releases-local</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-plugins</key>
-            <description>JFrog plugins releases</description>
-            <includesPattern>org/jfrog/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo.jfrog.org/artifactory/plugins-releases-local</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jboss</key>
-            <description>JBoss Maven2 releases</description>
-            <includesPattern>org/jboss/**,org/hibernate/**,org/richfaces/**,org/drools/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repository.jboss.org/nexus/content/groups/public-jboss</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus</key>
-            <description>Codehaus Maven2 releases</description>
-            <includesPattern>org/**,com/**,net/**</includesPattern>
-            <excludesPattern>org/apache/**,commons-*,org/artifactory/**,org/jfrog/**</excludesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repository.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-milestone</key>
-            <description>SpringSource in milestone version</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://maven.springframework.org/milestone</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-release</key>
-            <description>SpringSource releases</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://maven.springframework.org/release</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>google-code</key>
-            <description>Google's open source releases</description>
-            <includesPattern>com/google/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://google-maven-repository.googlecode.com/svn/repository</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>gradle-libs</key>
-            <description>Gradle libraries</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://gradle.artifactoryonline.com/gradle/libs</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>gradle-plugins</key>
-            <description>Gradle plugins</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://gradle.artifactoryonline.com/gradle/plugins</url>
-        </remoteRepository>
-
-        <!-- A sample remote repository with all possible tunings -->
-        <!--
-        <remoteRepository>
-        <key>remote-sample</key>
-        <description>Sample remote repository</description>
-        -->
-        <!--
-        blok the usage of this repository
-        -->
-        <!--<blackedOut>false</blackedOut>-->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--<maxUniqueSnapshots>3</maxUniqueSnapshots>-->
-        <!--<includesPattern>*/**</includesPattern>-->
-        <!--<excludesPattern>com/mycompany/**</excludesPattern>-->
-        <!--<url>http://maven.repo/repository</url>-->
-        <!--
-        put offline to use only the cache and not send remote requests
-        -->
-        <!--<offline>false</offline>-->
-        <!--<hardFail>true</hardFail>-->
-        <!--
-        cache remotely retrieved artifacts (you'd want 'true')
-        -->
-        <!--<storeArtifactsLocally>true</storeArtifactsLocally>-->
-        <!--
-        number of seconds to cache artifact lookup results
-        -->
-        <!--<retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to cache artifact retrieval failures (normally communication errors)
-        -->
-        <!--<failedRetrievalCachePeriodSecs>30</failedRetrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to remember artifact retrieval misses (artifact not found)
-        -->
-        <!--<missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>-->
-        <!--
-        ttp authentication details
-        -->
-        <!--<username>un</username>-->
-        <!--<password>pw</password>-->
-        <!--
-        network timeout for both connection establishment failures and unanswered requests
-        -->
-        <!--<socketTimeoutMillis>2000</socketTimeoutMillis>-->
-        <!--
-        proxy reference
-        -->
-        <!--<proxyRef>unused-proxy</proxyRef>-->
-        <!--</remoteRepository>-->
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <!-- This repository will be available at the url:
-        http://<host>:<port>/artifactory/snapshots-only/
-        (note the trailing slash!)
-        -->
-        <virtualRepository>
-            <key>remote-repos</key>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>codehaus</repositoryRef>
-                <repositoryRef>jboss</repositoryRef>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-                <repositoryRef>jfrog-libs</repositoryRef>
-                <repositoryRef>jfrog-plugins</repositoryRef>
-                <repositoryRef>spring-milestone</repositoryRef>
-                <repositoryRef>spring-release</repositoryRef>
-                <repositoryRef>google-code</repositoryRef>
-                <repositoryRef>gradle-libs</repositoryRef>
-                <repositoryRef>gradle-plugins</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-release</key>
-            <repositories>
-                <repositoryRef>libs-release-local</repositoryRef>
-                <repositoryRef>ext-release-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-release</key>
-            <repositories>
-                <repositoryRef>plugins-release-local</repositoryRef>
-                <repositoryRef>ext-release-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshot</key>
-            <repositories>
-                <repositoryRef>libs-snapshot-local</repositoryRef>
-                <repositoryRef>ext-snapshot-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshot</key>
-            <repositories>
-                <repositoryRef>plugins-snapshot-local</repositoryRef>
-                <repositoryRef>ext-snapshot-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-    </virtualRepositories>
-
-    <!--
-        <proxies>
-            <proxy>
-                <key>unused-proxy</key>
-                <host>host</host>
-                <port>8080</port>
-                <username>un</username>
-                <password>pw</password>
-                <domain>mydomain</domain>
-            </proxy>
-        </proxies>
-    -->
-
-    <repoLayouts>
-        <repoLayout>
-            <name>maven-2-default</name>
-            <artifactPathPattern>
-                [orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]
-            </artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>
-                [orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).pom
-            </descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>SNAPSHOT</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>ivy-default</name>
-            <artifactPathPattern>
-                [org]/[module]/[baseRev](-[folderItegRev])/[type]s/[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]
-            </artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>
-                [org]/[module]/[baseRev](-[folderItegRev])/[type]s/ivy-[baseRev](-[fileItegRev]).xml
-            </descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>gradle-default</name>
-            <artifactPathPattern>
-                [org]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]
-            </artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>maven-1-default</name>
-            <artifactPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]
-            </artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.+</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.+</fileIntegrationRevisionRegExp>
-        </repoLayout>
-    </repoLayouts>
-    <gcConfig>
-        <cronExp>0 0 /4 * * ?</cronExp>
-    </gcConfig>
-</config>
diff --git a/base/config/src/test/resources/config/install/config.1.4.2.xml b/base/config/src/test/resources/config/install/config.1.4.2.xml
deleted file mode 100644
index 5913150..0000000
--- a/base/config/src/test/resources/config/install/config.1.4.2.xml
+++ /dev/null
@@ -1,351 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.4.2"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.4.2
-        http://www.jfrog.org/xsd/artifactory-v1_4_2.xsd">
-    <!--
-    enable/disable anonymous downloads
-    -->
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-        <!--<ldapSettings>
-            <ldapSetting>
-                <key>ldap1</key>
-                <enabled>true</enabled>
-                <ldapUrl>ldap://mydomain:389/dc=mycompany,dc=com</ldapUrl>
-                <userDnPattern>uid={0}, ou=People</userDnPattern>
-            </ldapSetting>
-        </ldapSettings>-->
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <!--
-            alternative backup dir
-            -->
-            <!--<dir></dir>-->
-            <!--
-            backup every 12 hours
-            -->
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <!--
-            keep backups for a week.
-            Set to 0 in order to always backup to a "current" dir (useful for incremental FS backups).
-            -->
-            <retentionPeriodHours>168</retentionPeriodHours>
-            <!--
-            exclude certain repositories from being backed up
-            -->
-            <excludedRepositories>
-                <repositoryRef>repo1</repositoryRef>
-            </excludedRepositories>
-        </backup>
-    </backups>
-    <!-- The interval at which to activate the m2eclipse indexer. -->
-    <indexer>
-        <!-- By Default index every 24 hours -->
-        <indexingIntervalHours>24</indexingIntervalHours>
-    </indexer>
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases-local</key>
-            <description>Local repository for plugins</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-releases-local</key>
-            <description>Local repository for third party libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshots-local</key>
-            <description>Local repository for third party snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-
-        <!--
-        A sample local repository with all possible settings
-        -->
-        <!--
-        <localRepository>
-            <key>local-sample</key>
-            <description>Sample local repository</description>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            -->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--
-        <maxUniqueSnapshots>3</maxUniqueSnapshots>
-        <includesPattern>*/**</includesPattern>
-        <excludesPattern>com/mycompany/**</excludesPattern>
-        -->
-        <!--
-        centrally control unique snapshots behavior (non-unique|unique|deployer)
-        -->
-        <!--
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-        </localRepository>
-        -->
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <description>Central Maven 2 repository</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo1.maven.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m2</key>
-            <description>java.net Maven2 Format</description>
-            <excludesPattern>commons-*,org/apache/**</excludesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://download.java.net/maven/2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m1</key>
-            <description>java.net Maven1 Format</description>
-            <type>maven1</type>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://download.java.net/maven/1</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-libs</key>
-            <description>JFrog libraries releases</description>
-            <excludesPattern>org/apache/maven/**</excludesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo.jfrog.org/artifactory/libs-releases-local</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-plugins</key>
-            <description>JFrog plugins releases</description>
-            <includesPattern>org/jfrog/**</includesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo.jfrog.org/artifactory/plugins-releases-local</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jboss</key>
-            <description>JBoss Maven2 releases</description>
-            <includesPattern>org/jboss/**,org/hibernate/**,org/richfaces/**,org/drools/**</includesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repository.jboss.com/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus</key>
-            <description>Codehaus Maven2 releases</description>
-            <includesPattern>org/**,com/**,net/**</includesPattern>
-            <excludesPattern>org/apache/**,commons-*,org/artifactory/**,org/jfrog/**</excludesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repository.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-milestone</key>
-            <description>SpringSource in milestone version</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://maven.springframework.org/milestone</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-snapshots</key>
-            <description>SpringSource in snapshot stage</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://maven.springframework.org/snapshot</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-release</key>
-            <description>SpringSource releases</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://maven.springframework.org/release</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>google-code</key>
-            <description>Google's open source releases</description>
-            <includesPattern>com/google/**</includesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://google-maven-repository.googlecode.com/svn/repository</url>
-        </remoteRepository>
-
-
-        <!-- A sample remote repository with all possible tunings -->
-        <!--
-        <remoteRepository>
-        <key>remote-sample</key>
-        <description>Sample remote repository</description>
-        -->
-        <!--
-        blok the usage of this repository
-        -->
-        <!--<blackedOut>false</blackedOut>-->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--<maxUniqueSnapshots>3</maxUniqueSnapshots>-->
-        <!--<includesPattern>*/**</includesPattern>-->
-        <!--<excludesPattern>com/mycompany/**</excludesPattern>-->
-        <!--<url>http://maven.repo/repository</url>-->
-        <!--
-        put offline to use only the cache and not send remote requests
-        -->
-        <!--<offline>false</offline>-->
-        <!--<hardFail>true</hardFail>-->
-        <!--
-        cache remotely retrieved artifacts (you'd want 'true')
-        -->
-        <!--<storeArtifactsLocally>true</storeArtifactsLocally>-->
-        <!--
-        number of seconds to cache artifact lookup results
-        -->
-        <!--<retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to cache artifact retrieval failures (normally communication errors)
-        -->
-        <!--<failedRetrievalCachePeriodSecs>30</failedRetrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to remember artifact retrieval misses (artifact not found)
-        -->
-        <!--<missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>-->
-        <!--
-        ttp authentication details
-        -->
-        <!--<username>un</username>-->
-        <!--<password>pw</password>-->
-        <!--
-        network timeout for both connection establishment failures and unanswered requests
-        -->
-        <!--<socketTimeoutMillis>2000</socketTimeoutMillis>-->
-        <!--
-        proxy reference
-        -->
-        <!--<proxyRef>unused-proxy</proxyRef>-->
-        <!--</remoteRepository>-->
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <!-- This repository will be available at the url:
-        http://<host>:<port>/artifactory/snapshots-only/
-        (note the trailing slash!)
-        -->
-        <virtualRepository>
-            <key>remote-repos</key>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>codehaus</repositoryRef>
-                <repositoryRef>jboss</repositoryRef>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-                <repositoryRef>jfrog-libs</repositoryRef>
-                <repositoryRef>jfrog-plugins</repositoryRef>
-                <repositoryRef>spring-milestone</repositoryRef>
-                <repositoryRef>spring-snapshots</repositoryRef>
-                <repositoryRef>spring-release</repositoryRef>
-                <repositoryRef>google-code</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-releases</key>
-            <repositories>
-                <repositoryRef>libs-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-releases</key>
-            <repositories>
-                <repositoryRef>plugins-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshots</key>
-            <repositories>
-                <repositoryRef>libs-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshots</key>
-            <repositories>
-                <repositoryRef>plugins-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-    </virtualRepositories>
-
-    <!--
-        <proxies>
-            <proxy>
-                <key>unused-proxy</key>
-                <host>host</host>
-                <port>8080</port>
-                <username>un</username>
-                <password>pw</password>
-                <domain>mydomain</domain>
-            </proxy>
-        </proxies>
-    -->
-
-</config>
diff --git a/base/config/src/test/resources/config/install/config.1.4.3.xml b/base/config/src/test/resources/config/install/config.1.4.3.xml
deleted file mode 100644
index 171a0e8..0000000
--- a/base/config/src/test/resources/config/install/config.1.4.3.xml
+++ /dev/null
@@ -1,352 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.4.3"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.4.3
-        http://www.jfrog.org/xsd/artifactory-v1_4_3.xsd">
-    <!--
-    enable/disable anonymous downloads
-    -->
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-        <!--<ldapSettings>
-            <ldapSetting>
-                <key>ldap1</key>
-                <enabled>true</enabled>
-                <ldapUrl>ldap://mydomain:389/dc=mycompany,dc=com</ldapUrl>
-                <userDnPattern>uid={0}, ou=People</userDnPattern>
-            </ldapSetting>
-        </ldapSettings>-->
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <!--
-            alternative backup dir
-            -->
-            <!--<dir></dir>-->
-            <!--
-            backup every 12 hours
-            -->
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <!--
-            keep backups for a week.
-            Set to 0 in order to always backup to a "current" dir (useful for incremental FS backups).
-            -->
-            <retentionPeriodHours>168</retentionPeriodHours>
-            <!--
-            exclude certain repositories from being backed up
-            -->
-            <excludedRepositories>
-                <repositoryRef>repo1</repositoryRef>
-            </excludedRepositories>
-        </backup>
-    </backups>
-    <!-- The interval at which to activate the m2eclipse indexer. -->
-    <indexer>
-        <!-- By Default index every 24 hours -->
-        <indexingIntervalHours>24</indexingIntervalHours>
-    </indexer>
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases-local</key>
-            <description>Local repository for plugins</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-releases-local</key>
-            <description>Local repository for third party libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshots-local</key>
-            <description>Local repository for third party snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-
-        <!--
-        A sample local repository with all possible settings
-        -->
-        <!--
-        <localRepository>
-            <key>local-sample</key>
-            <description>Sample local repository</description>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            -->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--
-        <maxUniqueSnapshots>3</maxUniqueSnapshots>
-        <includesPattern>*/**</includesPattern>
-        <excludesPattern>com/mycompany/**</excludesPattern>
-        -->
-        <!--
-        centrally control unique snapshots behavior (non-unique|unique|deployer)
-        -->
-        <!--
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-        </localRepository>
-        -->
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <description>Central Maven 2 repository</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo1.maven.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m2</key>
-            <description>java.net Maven2 Format</description>
-            <excludesPattern>commons-*,org/apache/**</excludesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://download.java.net/maven/2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m1</key>
-            <description>java.net Maven1 Format</description>
-            <type>maven1</type>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://download.java.net/maven/1</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-libs</key>
-            <description>JFrog libraries releases</description>
-            <excludesPattern>org/apache/maven/**</excludesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo.jfrog.org/artifactory/libs-releases-local</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-plugins</key>
-            <description>JFrog plugins releases</description>
-            <includesPattern>org/jfrog/**</includesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo.jfrog.org/artifactory/plugins-releases-local</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jboss</key>
-            <description>JBoss Maven2 releases</description>
-            <includesPattern>org/jboss/**,org/hibernate/**,org/richfaces/**,org/drools/**</includesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repository.jboss.com/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus</key>
-            <description>Codehaus Maven2 releases</description>
-            <includesPattern>org/**,com/**,net/**</includesPattern>
-            <excludesPattern>org/apache/**,commons-*,org/artifactory/**,org/jfrog/**</excludesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repository.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-milestone</key>
-            <description>SpringSource in milestone version</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://maven.springframework.org/milestone</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-snapshots</key>
-            <description>SpringSource in snapshot stage</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://maven.springframework.org/snapshot</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-release</key>
-            <description>SpringSource releases</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://maven.springframework.org/release</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>google-code</key>
-            <description>Google's open source releases</description>
-            <includesPattern>com/google/**</includesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://google-maven-repository.googlecode.com/svn/repository</url>
-        </remoteRepository>
-
-
-        <!-- A sample remote repository with all possible tunings -->
-        <!--
-        <remoteRepository>
-        <key>remote-sample</key>
-        <description>Sample remote repository</description>
-        -->
-        <!--
-        blok the usage of this repository
-        -->
-        <!--<blackedOut>false</blackedOut>-->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--<maxUniqueSnapshots>3</maxUniqueSnapshots>-->
-        <!--<includesPattern>*/**</includesPattern>-->
-        <!--<excludesPattern>com/mycompany/**</excludesPattern>-->
-        <!--<url>http://maven.repo/repository</url>-->
-        <!--
-        put offline to use only the cache and not send remote requests
-        -->
-        <!--<offline>false</offline>-->
-        <!--<hardFail>true</hardFail>-->
-        <!--
-        cache remotely retrieved artifacts (you'd want 'true')
-        -->
-        <!--<storeArtifactsLocally>true</storeArtifactsLocally>-->
-        <!--
-        number of seconds to cache artifact lookup results
-        -->
-        <!--<retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to cache artifact retrieval failures (normally communication errors)
-        -->
-        <!--<failedRetrievalCachePeriodSecs>30</failedRetrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to remember artifact retrieval misses (artifact not found)
-        -->
-        <!--<missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>-->
-        <!--
-        ttp authentication details
-        -->
-        <!--<username>un</username>-->
-        <!--<password>pw</password>-->
-        <!--
-        network timeout for both connection establishment failures and unanswered requests
-        -->
-        <!--<socketTimeoutMillis>2000</socketTimeoutMillis>-->
-        <!--
-        proxy reference
-        -->
-        <!--<proxyRef>unused-proxy</proxyRef>-->
-        <!--</remoteRepository>-->
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <!-- This repository will be available at the url:
-        http://<host>:<port>/artifactory/snapshots-only/
-        (note the trailing slash!)
-        -->
-        <virtualRepository>
-            <key>remote-repos</key>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>codehaus</repositoryRef>
-                <repositoryRef>jboss</repositoryRef>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-                <repositoryRef>jfrog-libs</repositoryRef>
-                <repositoryRef>jfrog-plugins</repositoryRef>
-                <repositoryRef>spring-milestone</repositoryRef>
-                <repositoryRef>spring-snapshots</repositoryRef>
-                <repositoryRef>spring-release</repositoryRef>
-                <repositoryRef>google-code</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-releases</key>
-            <repositories>
-                <repositoryRef>libs-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-releases</key>
-            <repositories>
-                <repositoryRef>plugins-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshots</key>
-            <repositories>
-                <repositoryRef>libs-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshots</key>
-            <repositories>
-                <repositoryRef>plugins-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-    </virtualRepositories>
-
-    <!--
-        <proxies>
-            <proxy>
-                <key>unused-proxy</key>
-                <host>host</host>
-                <port>8080</port>
-                <username>un</username>
-                <password>pw</password>
-                <domain>mydomain</domain>
-            </proxy>
-        </proxies>
-    -->
-
-</config>
-
diff --git a/base/config/src/test/resources/config/install/config.1.4.7.xml b/base/config/src/test/resources/config/install/config.1.4.7.xml
deleted file mode 100644
index 156c893..0000000
--- a/base/config/src/test/resources/config/install/config.1.4.7.xml
+++ /dev/null
@@ -1,411 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.4.7"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.4.7
-        http://www.jfrog.org/xsd/artifactory-v1_4_7.xsd">
-    <!--
-    enable/disable anonymous downloads
-    -->
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-        <!--<ldapSettings>
-            <ldapSetting>
-                <key>ldap1</key>
-                <enabled>true</enabled>
-                <ldapUrl>ldap://mydomain:389/dc=mycompany,dc=com</ldapUrl>
-                <userDnPattern>uid={0}, ou=People</userDnPattern>
-            </ldapSetting>
-        </ldapSettings>-->
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <!--
-            alternative backup dir
-            -->
-            <!--<dir></dir>-->
-            <!--
-            backup every 12 hours
-            -->
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <!--
-            keep backups for a week.
-            Set to 0 in order to always backup to a "current" dir (useful for incremental FS backups).
-            -->
-            <retentionPeriodHours>168</retentionPeriodHours>
-            <!--
-            exclude certain repositories from being backed up
-            -->
-            <excludedRepositories>
-                <repositoryRef>repo1</repositoryRef>
-            </excludedRepositories>
-        </backup>
-    </backups>
-    <!-- The interval at which to activate the m2eclipse indexer. -->
-    <indexer>
-        <!-- By Default index every 24 hours -->
-        <indexingIntervalHours>24</indexingIntervalHours>
-    </indexer>
-    <localRepositories>
-        <localRepository>
-            <key>libs-release-local</key>
-            <description>Local repository for in-house libraries</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshot-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-release-local</key>
-            <description>Local repository for plugins</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshot-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-release-local</key>
-            <description>Local repository for third party libraries</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshot-local</key>
-            <description>Local repository for third party snapshots</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-
-        <!--
-        A sample local repository with all possible settings
-        -->
-        <!--
-        <localRepository>
-            <key>local-sample</key>
-            <description>Sample local repository</description>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            -->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--
-        <maxUniqueSnapshots>3</maxUniqueSnapshots>
-        <includesPattern>*/**</includesPattern>
-        <excludesPattern>com/mycompany/**</excludesPattern>
-        -->
-        <!--
-        centrally control unique snapshots behavior (non-unique|unique|deployer)
-        -->
-        <!--
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-        </localRepository>
-        -->
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <description>Central Maven 2 repository</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo1.maven.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m2</key>
-            <description>java.net Maven2 Format</description>
-            <excludesPattern>commons-*,org/apache/**</excludesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://download.java.net/maven/2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m1</key>
-            <description>java.net Maven1 Format</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://download.java.net/maven/1</url>
-            <remoteRepoLayoutRef>maven-1-default</remoteRepoLayoutRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-libs</key>
-            <description>JFrog libraries releases</description>
-            <excludesPattern>org/apache/maven/**</excludesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo.jfrog.org/artifactory/libs-releases-local</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-plugins</key>
-            <description>JFrog plugins releases</description>
-            <includesPattern>org/jfrog/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo.jfrog.org/artifactory/plugins-releases-local</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jboss</key>
-            <description>JBoss Maven2 releases</description>
-            <includesPattern>org/jboss/**,org/hibernate/**,org/richfaces/**,org/drools/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repository.jboss.org/nexus/content/groups/public-jboss</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus</key>
-            <description>Codehaus Maven2 releases</description>
-            <includesPattern>org/**,com/**,net/**</includesPattern>
-            <excludesPattern>org/apache/**,commons-*,org/artifactory/**,org/jfrog/**</excludesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repository.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-milestone</key>
-            <description>SpringSource in milestone version</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repository.springsource.com/maven/bundles/milestone</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-release</key>
-            <description>SpringSource releases</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repository.springsource.com/maven/bundles/release</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>google-code</key>
-            <description>Google's open source releases</description>
-            <includesPattern>com/google/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://google-maven-repository.googlecode.com/svn/repository</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>gradle-libs</key>
-            <description>Gradle libraries</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>ivy-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://gradle.artifactoryonline.com/gradle/libs</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>gradle-plugins</key>
-            <description>Gradle plugins</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>ivy-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://gradle.artifactoryonline.com/gradle/plugins</url>
-        </remoteRepository>
-
-        <!-- A sample remote repository with all possible tunings -->
-        <!--
-        <remoteRepository>
-        <key>remote-sample</key>
-        <description>Sample remote repository</description>
-        -->
-        <!--
-        blok the usage of this repository
-        -->
-        <!--<blackedOut>false</blackedOut>-->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--<maxUniqueSnapshots>3</maxUniqueSnapshots>-->
-        <!--<includesPattern>*/**</includesPattern>-->
-        <!--<excludesPattern>com/mycompany/**</excludesPattern>-->
-        <!--<url>http://maven.repo/repository</url>-->
-        <!--
-        put offline to use only the cache and not send remote requests
-        -->
-        <!--<offline>false</offline>-->
-        <!--<hardFail>true</hardFail>-->
-        <!--
-        cache remotely retrieved artifacts (you'd want 'true')
-        -->
-        <!--<storeArtifactsLocally>true</storeArtifactsLocally>-->
-        <!--
-        number of seconds to cache artifact lookup results
-        -->
-        <!--<retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to cache artifact retrieval failures (normally communication errors)
-        -->
-        <!--<failedRetrievalCachePeriodSecs>30</failedRetrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to remember artifact retrieval misses (artifact not found)
-        -->
-        <!--<missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>-->
-        <!--
-        ttp authentication details
-        -->
-        <!--<username>un</username>-->
-        <!--<password>pw</password>-->
-        <!--
-        network timeout for both connection establishment failures and unanswered requests
-        -->
-        <!--<socketTimeoutMillis>2000</socketTimeoutMillis>-->
-        <!--
-        proxy reference
-        -->
-        <!--<proxyRef>unused-proxy</proxyRef>-->
-        <!--</remoteRepository>-->
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <!-- This repository will be available at the url:
-        http://<host>:<port>/artifactory/snapshots-only/
-        (note the trailing slash!)
-        -->
-        <virtualRepository>
-            <key>remote-repos</key>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>codehaus</repositoryRef>
-                <repositoryRef>jboss</repositoryRef>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-                <repositoryRef>jfrog-libs</repositoryRef>
-                <repositoryRef>jfrog-plugins</repositoryRef>
-                <repositoryRef>spring-milestone</repositoryRef>
-                <repositoryRef>spring-release</repositoryRef>
-                <repositoryRef>google-code</repositoryRef>
-                <repositoryRef>gradle-libs</repositoryRef>
-                <repositoryRef>gradle-plugins</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-release</key>
-            <repositories>
-                <repositoryRef>libs-release-local</repositoryRef>
-                <repositoryRef>ext-release-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-release</key>
-            <repositories>
-                <repositoryRef>plugins-release-local</repositoryRef>
-                <repositoryRef>ext-release-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshot</key>
-            <repositories>
-                <repositoryRef>libs-snapshot-local</repositoryRef>
-                <repositoryRef>ext-snapshot-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshot</key>
-            <repositories>
-                <repositoryRef>plugins-snapshot-local</repositoryRef>
-                <repositoryRef>ext-snapshot-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-    </virtualRepositories>
-
-    <!--
-        <proxies>
-            <proxy>
-                <key>unused-proxy</key>
-                <host>host</host>
-                <port>8080</port>
-                <username>un</username>
-                <password>pw</password>
-                <domain>mydomain</domain>
-            </proxy>
-        </proxies>
-    -->
-
-    <repoLayouts>
-        <repoLayout>
-            <name>maven-2-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>SNAPSHOT</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>ivy-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>gradle-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>maven-1-default</name>
-            <artifactPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.+</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.+</fileIntegrationRevisionRegExp>
-        </repoLayout>
-    </repoLayouts>
-</config>
\ No newline at end of file
diff --git a/base/config/src/test/resources/config/system/artifactory.properties b/base/config/src/test/resources/config/system/artifactory.properties
deleted file mode 100644
index 687a5f0..0000000
--- a/base/config/src/test/resources/config/system/artifactory.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-artifactory.version=10.3
-artifactory.revision=12345
\ No newline at end of file
diff --git a/base/config/src/test/resources/config/system/artifactory.system.1.properties b/base/config/src/test/resources/config/system/artifactory.system.1.properties
deleted file mode 100644
index eed9a00..0000000
--- a/base/config/src/test/resources/config/system/artifactory.system.1.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-artifactory.logs.viewRefreshRateSecs=1000
-#artifactory.locks.timeoutSecs=12
-artifactory.security.authentication.cache.idleTimeSecs=50
-#artifactory.search.maxResults=500
diff --git a/base/config/src/test/resources/config/test/config-1.5.13-existing_addon_layout.xml b/base/config/src/test/resources/config/test/config-1.5.13-existing_addon_layout.xml
deleted file mode 100644
index 1354a89..0000000
--- a/base/config/src/test/resources/config/test/config-1.5.13-existing_addon_layout.xml
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<config xmlns="http://artifactory.jfrog.org/xsd/1.5.13" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-    <offlineMode>false</offlineMode>
-    <fileUploadMaxSizeMb>100</fileUploadMaxSizeMb>
-    <dateFormat>dd-MM-yy HH:mm:ss z</dateFormat>
-    <addons>
-        <showAddonsInfo>true</showAddonsInfo>
-        <showAddonsInfoCookie>1434884306580</showAddonsInfoCookie>
-    </addons>
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-        <anonAccessToBuildInfosDisabled>false</anonAccessToBuildInfosDisabled>
-        <hideUnauthorizedResources>false</hideUnauthorizedResources>
-        <passwordSettings>
-            <encryptionPolicy>supported</encryptionPolicy>
-        </passwordSettings>
-        <ldapSettings/>
-        <ldapGroupSettings/>
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <enabled>false</enabled>
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <retentionPeriodHours>0</retentionPeriodHours>
-            <createArchive>false</createArchive>
-            <excludedRepositories/>
-            <sendMailOnError>true</sendMailOnError>
-            <excludeBuilds>false</excludeBuilds>
-            <excludeNewRepositories>false</excludeNewRepositories>
-        </backup>
-    </backups>
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>true</suppressPomConsistencyChecks>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-        </localRepository>
-    </localRepositories>
-    <remoteRepositories/>
-    <virtualRepositories/>
-    <proxies/>
-    <propertySets/>
-    <repoLayouts>
-        <repoLayout>
-            <name>maven-2-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>SNAPSHOT</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>ivy-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>gradle-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>maven-1-default</name>
-            <artifactPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.+</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.+</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>nuget-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[module].[baseRev](-[fileItegRev]).nupkg</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>false</distinctiveDescriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.*</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.*</fileIntegrationRevisionRegExp>
-        </repoLayout>
-    </repoLayouts>
-    <remoteReplications/>
-    <localReplications/>
-    <gcConfig>
-        <cronExp>0 0 /4 * * ?</cronExp>
-    </gcConfig>
-    <cleanupConfig>
-        <cronExp>0 12 5 * * ?</cronExp>
-    </cleanupConfig>
-    <virtualCacheCleanupConfig>
-        <cronExp>0 12 5 * * ?</cronExp>
-    </virtualCacheCleanupConfig>
-</config>
\ No newline at end of file
diff --git a/base/config/src/test/resources/config/test/config-1.5.13-maven_indexer_enabled.xml b/base/config/src/test/resources/config/test/config-1.5.13-maven_indexer_enabled.xml
deleted file mode 100644
index 0fbf1fd..0000000
--- a/base/config/src/test/resources/config/test/config-1.5.13-maven_indexer_enabled.xml
+++ /dev/null
@@ -1,150 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<config xmlns="http://artifactory.jfrog.org/xsd/1.5.13">
-    <offlineMode>false</offlineMode>
-    <fileUploadMaxSizeMb>100</fileUploadMaxSizeMb>
-    <dateFormat>dd-MM-yy HH:mm:ss z</dateFormat>
-    <addons>
-        <showAddonsInfo>true</showAddonsInfo>
-        <showAddonsInfoCookie>1434884306580</showAddonsInfoCookie>
-    </addons>
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-        <anonAccessToBuildInfosDisabled>false</anonAccessToBuildInfosDisabled>
-        <hideUnauthorizedResources>false</hideUnauthorizedResources>
-        <passwordSettings>
-            <encryptionPolicy>supported</encryptionPolicy>
-        </passwordSettings>
-        <ldapSettings/>
-        <ldapGroupSettings/>
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <enabled>false</enabled>
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <retentionPeriodHours>0</retentionPeriodHours>
-            <createArchive>false</createArchive>
-            <excludedRepositories/>
-            <sendMailOnError>true</sendMailOnError>
-            <excludeBuilds>false</excludeBuilds>
-            <excludeNewRepositories>false</excludeNewRepositories>
-        </backup>
-    </backups>
-    <indexer>
-        <enabled>true</enabled>
-        <cronExp>0 0  5 * * ?</cronExp>
-        <excludedRepositories>
-            <repositoryRef>local1</repositoryRef>
-        </excludedRepositories>
-    </indexer>
-    <localRepositories>
-        <localRepository>
-            <key>local1</key>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-        </localRepository>
-        <localRepository>
-            <key>local2</key>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-        </localRepository>
-    </localRepositories>
-    <remoteRepositories>
-        <remoteRepository>
-            <key>remote1</key>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <url>http://blabla</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>7200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-        </remoteRepository>
-        <remoteRepository>
-            <key>remote2</key>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <url>http://blabla</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>7200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <enableVcsSupport>true</enableVcsSupport>
-        </remoteRepository>
-    </remoteRepositories>
-    <virtualRepositories>
-        <virtualRepository>
-            <key>virtual1</key>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-        </virtualRepository>
-        <virtualRepository>
-            <key>virtual2</key>
-            <repoLayoutRef>nuget-default</repoLayoutRef>
-        </virtualRepository>
-    </virtualRepositories>
-    <proxies/>
-    <propertySets/>
-    <repoLayouts>
-        <repoLayout>
-            <name>maven-2-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>SNAPSHOT</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>ivy-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>gradle-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>maven-1-default</name>
-            <artifactPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.+</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.+</fileIntegrationRevisionRegExp>
-        </repoLayout>
-    </repoLayouts>
-    <remoteReplications/>
-    <localReplications/>
-    <gcConfig>
-        <cronExp>0 0 /4 * * ?</cronExp>
-    </gcConfig>
-    <cleanupConfig>
-        <cronExp>0 12 5 * * ?</cronExp>
-    </cleanupConfig>
-    <virtualCacheCleanupConfig>
-        <cronExp>0 12 5 * * ?</cronExp>
-    </virtualCacheCleanupConfig>
-</config>
\ No newline at end of file
diff --git a/base/config/src/test/resources/config/test/config-1.5.13-maven_indexer_no_excluded.xml b/base/config/src/test/resources/config/test/config-1.5.13-maven_indexer_no_excluded.xml
deleted file mode 100644
index b55ea4f..0000000
--- a/base/config/src/test/resources/config/test/config-1.5.13-maven_indexer_no_excluded.xml
+++ /dev/null
@@ -1,138 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<config xmlns="http://artifactory.jfrog.org/xsd/1.5.13">
-    <offlineMode>false</offlineMode>
-    <fileUploadMaxSizeMb>100</fileUploadMaxSizeMb>
-    <dateFormat>dd-MM-yy HH:mm:ss z</dateFormat>
-    <addons>
-        <showAddonsInfo>true</showAddonsInfo>
-        <showAddonsInfoCookie>1434884306580</showAddonsInfoCookie>
-    </addons>
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-        <anonAccessToBuildInfosDisabled>false</anonAccessToBuildInfosDisabled>
-        <hideUnauthorizedResources>false</hideUnauthorizedResources>
-        <passwordSettings>
-            <encryptionPolicy>supported</encryptionPolicy>
-        </passwordSettings>
-        <ldapSettings/>
-        <ldapGroupSettings/>
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <enabled>false</enabled>
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <retentionPeriodHours>0</retentionPeriodHours>
-            <createArchive>false</createArchive>
-            <excludedRepositories/>
-            <sendMailOnError>true</sendMailOnError>
-            <excludeBuilds>false</excludeBuilds>
-            <excludeNewRepositories>false</excludeNewRepositories>
-        </backup>
-    </backups>
-    <indexer>
-        <enabled>false</enabled>
-        <cronExp>0 0  5 * * ?</cronExp>
-    </indexer>
-    <localRepositories>
-        <localRepository>
-            <key>local1</key>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-        </localRepository>
-        <localRepository>
-            <key>local2</key>
-            <repoLayoutRef>gradle-default</repoLayoutRef>
-        </localRepository>
-    </localRepositories>
-    <remoteRepositories>
-        <remoteRepository>
-            <key>remote1</key>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <url>http://blabla</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>7200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-        </remoteRepository>
-        <remoteRepository>
-            <key>remote2</key>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <url>http://blabla</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>7200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <enableVcsSupport>true</enableVcsSupport>
-        </remoteRepository>
-    </remoteRepositories>
-    <virtualRepositories/>
-    <proxies/>
-    <propertySets/>
-    <repoLayouts>
-        <repoLayout>
-            <name>maven-2-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>SNAPSHOT</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>ivy-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>gradle-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>maven-1-default</name>
-            <artifactPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.+</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.+</fileIntegrationRevisionRegExp>
-        </repoLayout>
-    </repoLayouts>
-    <remoteReplications/>
-    <localReplications/>
-    <gcConfig>
-        <cronExp>0 0 /4 * * ?</cronExp>
-    </gcConfig>
-    <cleanupConfig>
-        <cronExp>0 12 5 * * ?</cronExp>
-    </cleanupConfig>
-    <virtualCacheCleanupConfig>
-        <cronExp>0 12 5 * * ?</cronExp>
-    </virtualCacheCleanupConfig>
-</config>
\ No newline at end of file
diff --git a/base/config/src/test/resources/config/test/config-1.5.13-multi_repo_type.xml b/base/config/src/test/resources/config/test/config-1.5.13-multi_repo_type.xml
deleted file mode 100644
index 1627c00..0000000
--- a/base/config/src/test/resources/config/test/config-1.5.13-multi_repo_type.xml
+++ /dev/null
@@ -1,191 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<config xmlns="http://artifactory.jfrog.org/xsd/1.5.13" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-    <offlineMode>false</offlineMode>
-    <fileUploadMaxSizeMb>100</fileUploadMaxSizeMb>
-    <dateFormat>dd-MM-yy HH:mm:ss z</dateFormat>
-    <addons>
-        <showAddonsInfo>true</showAddonsInfo>
-        <showAddonsInfoCookie>1434884306580</showAddonsInfoCookie>
-    </addons>
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-        <anonAccessToBuildInfosDisabled>false</anonAccessToBuildInfosDisabled>
-        <hideUnauthorizedResources>false</hideUnauthorizedResources>
-        <passwordSettings>
-            <encryptionPolicy>supported</encryptionPolicy>
-        </passwordSettings>
-        <ldapSettings/>
-        <ldapGroupSettings/>
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <enabled>false</enabled>
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <retentionPeriodHours>0</retentionPeriodHours>
-            <createArchive>false</createArchive>
-            <excludedRepositories/>
-            <sendMailOnError>true</sendMailOnError>
-            <excludeBuilds>false</excludeBuilds>
-            <excludeNewRepositories>false</excludeNewRepositories>
-        </backup>
-    </backups>
-    <localRepositories>
-        <localRepository>
-            <key>maven-local</key>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-        </localRepository>
-        <localRepository>
-            <key>gradle-local</key>
-            <repoLayoutRef>gradle-default</repoLayoutRef>
-        </localRepository>
-        <localRepository>
-            <key>ivy-local</key>
-            <repoLayoutRef>ivy-default</repoLayoutRef>
-        </localRepository>
-        <localRepository>
-            <key>nuget-local</key>
-            <repoLayoutRef>ivy-default</repoLayoutRef>
-            <enableNuGetSupport>true</enableNuGetSupport>
-            <enableNpmSupport>true</enableNpmSupport>
-            <enablePypiSupport>true</enablePypiSupport>
-        </localRepository>
-        <localRepository>
-            <key>npm-local</key>
-            <enableNpmSupport>true</enableNpmSupport>
-        </localRepository>
-        <localRepository>
-            <key>bower-local</key>
-            <enableBowerSupport>true</enableBowerSupport>
-        </localRepository>
-        <localRepository>
-            <key>docker-local</key>
-            <enableDockerSupport>true</enableDockerSupport>
-        </localRepository>
-        <localRepository>
-            <key>vagrant-local</key>
-            <enableVagrantSupport>true</enableVagrantSupport>
-        </localRepository>
-        <localRepository>
-            <key>gems-local</key>
-            <enableGemsSupport>true</enableGemsSupport>
-        </localRepository>
-        <localRepository>
-            <key>debian-local</key>
-            <enableDebianSupport>true</enableDebianSupport>
-        </localRepository>
-        <localRepository>
-            <key>gitlfs-local</key>
-            <enableGitLfsSupport>true</enableGitLfsSupport>
-        </localRepository>
-    </localRepositories>
-    <remoteRepositories>
-        <remoteRepository>
-            <key>p2-remote</key>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <url>http://blabla</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>7200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-        </remoteRepository>
-        <remoteRepository>
-            <key>vcs-remote</key>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <url>http://blabla</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>7200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <enableVcsSupport>true</enableVcsSupport>
-        </remoteRepository>
-    </remoteRepositories>
-    <virtualRepositories>
-        <virtualRepository>
-            <key>p2-virtual</key>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <p2>
-                <enabled>true</enabled>
-                <urls/>
-            </p2>
-        </virtualRepository>
-        <virtualRepository>
-            <key>pypi-virtual</key>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enablePypiSupport>true</enablePypiSupport>
-            <p2>
-                <enabled>true</enabled>
-                <urls/>
-            </p2>
-        </virtualRepository>
-    </virtualRepositories>
-    <proxies/>
-    <propertySets/>
-    <repoLayouts>
-        <repoLayout>
-            <name>maven-2-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>SNAPSHOT</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>ivy-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>gradle-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>maven-1-default</name>
-            <artifactPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.+</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.+</fileIntegrationRevisionRegExp>
-        </repoLayout>
-    </repoLayouts>
-    <remoteReplications/>
-    <localReplications/>
-    <gcConfig>
-        <cronExp>0 0 /4 * * ?</cronExp>
-    </gcConfig>
-    <cleanupConfig>
-        <cronExp>0 12 5 * * ?</cronExp>
-    </cleanupConfig>
-    <virtualCacheCleanupConfig>
-        <cronExp>0 12 5 * * ?</cronExp>
-    </virtualCacheCleanupConfig>
-</config>
\ No newline at end of file
diff --git a/base/config/src/test/resources/config/test/config-1.5.13-no_addons_layouts.xml b/base/config/src/test/resources/config/test/config-1.5.13-no_addons_layouts.xml
deleted file mode 100644
index 6eee369..0000000
--- a/base/config/src/test/resources/config/test/config-1.5.13-no_addons_layouts.xml
+++ /dev/null
@@ -1,100 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<config xmlns="http://artifactory.jfrog.org/xsd/1.5.13" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-    <offlineMode>false</offlineMode>
-    <fileUploadMaxSizeMb>100</fileUploadMaxSizeMb>
-    <dateFormat>dd-MM-yy HH:mm:ss z</dateFormat>
-    <addons>
-        <showAddonsInfo>true</showAddonsInfo>
-        <showAddonsInfoCookie>1434884306580</showAddonsInfoCookie>
-    </addons>
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-        <anonAccessToBuildInfosDisabled>false</anonAccessToBuildInfosDisabled>
-        <hideUnauthorizedResources>false</hideUnauthorizedResources>
-        <passwordSettings>
-            <encryptionPolicy>supported</encryptionPolicy>
-        </passwordSettings>
-        <ldapSettings/>
-        <ldapGroupSettings/>
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <enabled>false</enabled>
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <retentionPeriodHours>0</retentionPeriodHours>
-            <createArchive>false</createArchive>
-            <excludedRepositories/>
-            <sendMailOnError>true</sendMailOnError>
-            <excludeBuilds>false</excludeBuilds>
-            <excludeNewRepositories>false</excludeNewRepositories>
-        </backup>
-    </backups>
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>true</suppressPomConsistencyChecks>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-        </localRepository>
-    </localRepositories>
-    <remoteRepositories/>
-    <virtualRepositories/>
-    <proxies/>
-    <propertySets/>
-    <repoLayouts>
-        <repoLayout>
-            <name>maven-2-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>SNAPSHOT</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>ivy-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>gradle-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>maven-1-default</name>
-            <artifactPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.+</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.+</fileIntegrationRevisionRegExp>
-        </repoLayout>
-    </repoLayouts>
-    <remoteReplications/>
-    <localReplications/>
-    <gcConfig>
-        <cronExp>0 0 /4 * * ?</cronExp>
-    </gcConfig>
-    <cleanupConfig>
-        <cronExp>0 12 5 * * ?</cronExp>
-    </cleanupConfig>
-    <virtualCacheCleanupConfig>
-        <cronExp>0 12 5 * * ?</cronExp>
-    </virtualCacheCleanupConfig>
-</config>
\ No newline at end of file
diff --git a/base/config/src/test/resources/config/test/config-1.5.13-random_addon_layout.xml b/base/config/src/test/resources/config/test/config-1.5.13-random_addon_layout.xml
deleted file mode 100644
index e12875b..0000000
--- a/base/config/src/test/resources/config/test/config-1.5.13-random_addon_layout.xml
+++ /dev/null
@@ -1,114 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<config xmlns="http://artifactory.jfrog.org/xsd/1.5.13" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-    <offlineMode>false</offlineMode>
-    <fileUploadMaxSizeMb>100</fileUploadMaxSizeMb>
-    <dateFormat>dd-MM-yy HH:mm:ss z</dateFormat>
-    <addons>
-        <showAddonsInfo>true</showAddonsInfo>
-        <showAddonsInfoCookie>1434884306580</showAddonsInfoCookie>
-    </addons>
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-        <anonAccessToBuildInfosDisabled>false</anonAccessToBuildInfosDisabled>
-        <hideUnauthorizedResources>false</hideUnauthorizedResources>
-        <passwordSettings>
-            <encryptionPolicy>supported</encryptionPolicy>
-        </passwordSettings>
-        <ldapSettings/>
-        <ldapGroupSettings/>
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <enabled>false</enabled>
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <retentionPeriodHours>0</retentionPeriodHours>
-            <createArchive>false</createArchive>
-            <excludedRepositories/>
-            <sendMailOnError>true</sendMailOnError>
-            <excludeBuilds>false</excludeBuilds>
-            <excludeNewRepositories>false</excludeNewRepositories>
-        </backup>
-    </backups>
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>true</suppressPomConsistencyChecks>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-        </localRepository>
-    </localRepositories>
-    <remoteRepositories/>
-    <virtualRepositories/>
-    <proxies/>
-    <propertySets/>
-    <repoLayouts>
-        <repoLayout>
-            <name>maven-2-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>SNAPSHOT</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>ivy-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>gradle-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>maven-1-default</name>
-            <artifactPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.+</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.+</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>nuget-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[module].[baseRev](-[fileItegRev]).nupkg</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>false</distinctiveDescriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.*</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.*</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>art-nuget-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[module].[baseRev](-[fileItegRev]).nupkg</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>false</distinctiveDescriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.*</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.*</fileIntegrationRevisionRegExp>
-        </repoLayout>
-    </repoLayouts>
-    <remoteReplications/>
-    <localReplications/>
-    <gcConfig>
-        <cronExp>0 0 /4 * * ?</cronExp>
-    </gcConfig>
-    <cleanupConfig>
-        <cronExp>0 12 5 * * ?</cronExp>
-    </cleanupConfig>
-    <virtualCacheCleanupConfig>
-        <cronExp>0 12 5 * * ?</cronExp>
-    </virtualCacheCleanupConfig>
-</config>
\ No newline at end of file
diff --git a/base/config/src/test/resources/config/test/config-1.5.2-blackduck_default_proxy.xml b/base/config/src/test/resources/config/test/config-1.5.2-blackduck_default_proxy.xml
deleted file mode 100644
index 82aa6c5..0000000
--- a/base/config/src/test/resources/config/test/config-1.5.2-blackduck_default_proxy.xml
+++ /dev/null
@@ -1,1089 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<config xmlns="http://artifactory.jfrog.org/xsd/1.5.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-    <offlineMode>false</offlineMode>
-    <fileUploadMaxSizeMb>100</fileUploadMaxSizeMb>
-    <dateFormat>dd-MM-yy HH:mm:ss z</dateFormat>
-    <addons>
-        <showAddonsInfo>true</showAddonsInfo>
-        <showAddonsInfoCookie>1380704308724</showAddonsInfoCookie>
-    </addons>
-    <security>
-        <anonAccessEnabled>false</anonAccessEnabled>
-        <hideUnauthorizedResources>false</hideUnauthorizedResources>
-        <passwordSettings>
-            <encryptionPolicy>supported</encryptionPolicy>
-        </passwordSettings>
-        <ldapSettings/>
-        <ldapGroupSettings/>
-        <crowdSettings>
-            <enableIntegration>true</enableIntegration>
-            <serverUrl>http://localhost:8095/crowd/</serverUrl>
-            <applicationName>artifactory</applicationName>
-            <password>password</password>
-            <sessionValidationInterval>0</sessionValidationInterval>
-            <useDefaultProxy>false</useDefaultProxy>
-            <noAutoUserCreation>false</noAutoUserCreation>
-            <directAuthentication>false</directAuthentication>
-        </crowdSettings>
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <enabled>true</enabled>
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <retentionPeriodHours>168</retentionPeriodHours>
-            <createArchive>false</createArchive>
-            <excludedRepositories>
-                <repositoryRef>repo1</repositoryRef>
-            </excludedRepositories>
-            <sendMailOnError>true</sendMailOnError>
-            <excludeBuilds>false</excludeBuilds>
-        </backup>
-    </backups>
-    <indexer>
-        <enabled>false</enabled>
-        <cronExp>0 23 5 * * ?</cronExp>
-        <excludedRepositories>
-            <repositoryRef>codehaus</repositoryRef>
-            <repositoryRef>google-code</repositoryRef>
-            <repositoryRef>java.net.m1</repositoryRef>
-            <repositoryRef>java.net.m2</repositoryRef>
-            <repositoryRef>jboss</repositoryRef>
-            <repositoryRef>jfrog-libs</repositoryRef>
-            <repositoryRef>jfrog-plugins</repositoryRef>
-            <repositoryRef>libs-releases</repositoryRef>
-            <repositoryRef>libs-snapshots</repositoryRef>
-            <repositoryRef>plugins-releases</repositoryRef>
-            <repositoryRef>plugins-snapshots</repositoryRef>
-            <repositoryRef>remote-repos</repositoryRef>
-            <repositoryRef>repo1</repositoryRef>
-            <repositoryRef>spring-milestone</repositoryRef>
-            <repositoryRef>spring-release</repositoryRef>
-            <repositoryRef>spring-snapshots</repositoryRef>
-        </excludedRepositories>
-    </indexer>
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>true</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases-local</key>
-            <description>Local repository for plugins</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-        </localRepository>
-        <localRepository>
-            <key>ext-releases-local</key>
-            <description>Local repository for third party libraries</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshots-local</key>
-            <description>Local repository for third party snapshots</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-        </localRepository>
-    </localRepositories>
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <description>Central Maven 2 repository</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://repo1.maven.org/maven2</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m2</key>
-            <description>java.net Maven2 Format</description>
-            <includesPattern>**/*</includesPattern>
-            <excludesPattern>commons-*,org/apache/**</excludesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://download.java.net/maven/2</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m1</key>
-            <description>java.net Maven1 Format</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://download.java.net/maven/1</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <remoteRepoLayoutRef>maven-1-default</remoteRepoLayoutRef>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-libs</key>
-            <description>JFrog libraries releases</description>
-            <includesPattern>**/*</includesPattern>
-            <excludesPattern>org/apache/maven/**</excludesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://repo.jfrog.org/artifactory/libs-releases-local</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-plugins</key>
-            <description>JFrog plugins releases</description>
-            <includesPattern>org/jfrog/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://repo.jfrog.org/artifactory/plugins-releases-local</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jboss</key>
-            <description>JBoss Maven2 releases</description>
-            <includesPattern>org/jboss/**,org/hibernate/**,org/richfaces/**,org/drools/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://repository.jboss.com/maven2</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus</key>
-            <description>Codehaus Maven2 releases</description>
-            <includesPattern>org/**,com/**,net/**</includesPattern>
-            <excludesPattern>org/apache/**,commons-*,org/artifactory/**,org/jfrog/**</excludesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://repository.codehaus.org</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-milestone</key>
-            <description>SpringSource in milestone version</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://maven.springframework.org/milestone</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-snapshots</key>
-            <description>SpringSource in snapshot stage</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://maven.springframework.org/snapshot</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-release</key>
-            <description>SpringSource releases</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://maven.springframework.org/release</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>google-code</key>
-            <description>Google's open source releases</description>
-            <includesPattern>com/google/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://google-maven-repository.googlecode.com/svn/repository</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-    </remoteRepositories>
-    <virtualRepositories>
-        <virtualRepository>
-            <key>remote-repos</key>
-            <includesPattern>**/*</includesPattern>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>codehaus</repositoryRef>
-                <repositoryRef>jboss</repositoryRef>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-                <repositoryRef>jfrog-libs</repositoryRef>
-                <repositoryRef>jfrog-plugins</repositoryRef>
-                <repositoryRef>spring-milestone</repositoryRef>
-                <repositoryRef>spring-snapshots</repositoryRef>
-                <repositoryRef>spring-release</repositoryRef>
-                <repositoryRef>google-code</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-releases</key>
-            <includesPattern>**/*</includesPattern>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>false</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>libs-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-releases</key>
-            <includesPattern>**/*</includesPattern>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>false</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>plugins-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshots</key>
-            <includesPattern>**/*</includesPattern>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>false</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>libs-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshots</key>
-            <includesPattern>**/*</includesPattern>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>false</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>plugins-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-    </virtualRepositories>
-    <proxies>
-        <proxy>
-            <key>Charles</key>
-            <host>localhost</host>
-            <port>8888</port>
-            <defaultProxy>true</defaultProxy>
-        </proxy>
-    </proxies>
-    <propertySets>
-        <propertySet>
-            <name>artifactory</name>
-            <visible>false</visible>
-            <properties>
-                <property>
-                    <name>licenses</name>
-                    <closedPredefinedValues>true</closedPredefinedValues>
-                    <multipleChoice>true</multipleChoice>
-                    <predefinedValues>
-                        <predefinedValue>
-                            <value>AFL-3.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>AGPL-V3</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>APL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Apache-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Apache-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Apache-1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>APSL-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Artistic-License-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Attribution</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>BSL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CA-TOSL-1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CDDL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CDDL-1.0.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CDDL-1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Codehaus</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CCAG-2.5</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CPAL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CUAOFFICE-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Day</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Day-Addendum</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Bouncy-Castle</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>EUDATAGRID</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Enovi</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CPL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>LGPL-2.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>LGPL-3.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Historical</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>HSQLDB</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>IBMPL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>IPAFont-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>ISC</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Lucent-1.02</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>MirOS</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>MS-PL</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>MS-RL</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>JA-SIG</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>BSD</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>MIT</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>JSON</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Motosoto-0.9.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Eclipse-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>ECL2</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Eiffel-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>JTidy</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>JTA-Specification-1.0.1B</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Entessa-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>EUPL-1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Fair</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Frameworx-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>GPL-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>GPL-2.0+CE</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>GPL-3.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Mozilla-1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Multics</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>NASA-1.3</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>NTP</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>NAUMEN</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Nethack</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Nokia-1.0a</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>NOSL-3.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>OCLC-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Openfont-1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Opengroup</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>OpenSymphony</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>OSL-3.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>PHP-3.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>PostgreSQL</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Public Domain</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Public Domain - SUN</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>PythonPL</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>PythonSoftFoundation</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>QTPL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Real-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>RPL-1.5</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>RicohPL</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>SimPL-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Sleepycat</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>SUNPublic-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Sybase-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>TMate</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>UoI-NCSA</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>IU-Extreme-1.1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>VovidaPL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>W3C</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>wxWindows</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Xnet</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>ZPL-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>ZLIB</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Unknown</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                    </predefinedValues>
-                </property>
-            </properties>
-        </propertySet>
-    </propertySets>
-    <repoLayouts>
-        <repoLayout>
-            <name>maven-2-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>SNAPSHOT</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>ivy-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>gradle-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>maven-1-default</name>
-            <artifactPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.+</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.+</fileIntegrationRevisionRegExp>
-        </repoLayout>
-    </repoLayouts>
-    <remoteReplications/>
-    <localReplications/>
-    <gcConfig>
-        <cronExp>0 0 /4 * * ?</cronExp>
-    </gcConfig>
-    <cleanupConfig>
-        <cronExp>0 17 5 * * ?</cronExp>
-    </cleanupConfig>
-    <externalProviders>
-        <blackduck>
-            <enableIntegration>true</enableIntegration>
-            <serverUri>asdfblk</serverUri>
-            <username>asdf</username>
-            <password>asdf</password>
-            <connectionTimeoutMillis>20000</connectionTimeoutMillis>
-        </blackduck>
-    </externalProviders>
-</config>
\ No newline at end of file
diff --git a/base/config/src/test/resources/config/test/config-1.5.2-blackduck_no_default_proxy.xml b/base/config/src/test/resources/config/test/config-1.5.2-blackduck_no_default_proxy.xml
deleted file mode 100644
index ef75bac..0000000
--- a/base/config/src/test/resources/config/test/config-1.5.2-blackduck_no_default_proxy.xml
+++ /dev/null
@@ -1,1089 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<config xmlns="http://artifactory.jfrog.org/xsd/1.5.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-    <offlineMode>false</offlineMode>
-    <fileUploadMaxSizeMb>100</fileUploadMaxSizeMb>
-    <dateFormat>dd-MM-yy HH:mm:ss z</dateFormat>
-    <addons>
-        <showAddonsInfo>true</showAddonsInfo>
-        <showAddonsInfoCookie>1380704308724</showAddonsInfoCookie>
-    </addons>
-    <security>
-        <anonAccessEnabled>false</anonAccessEnabled>
-        <hideUnauthorizedResources>false</hideUnauthorizedResources>
-        <passwordSettings>
-            <encryptionPolicy>supported</encryptionPolicy>
-        </passwordSettings>
-        <ldapSettings/>
-        <ldapGroupSettings/>
-        <crowdSettings>
-            <enableIntegration>true</enableIntegration>
-            <serverUrl>http://localhost:8095/crowd/</serverUrl>
-            <applicationName>artifactory</applicationName>
-            <password>password</password>
-            <sessionValidationInterval>0</sessionValidationInterval>
-            <useDefaultProxy>false</useDefaultProxy>
-            <noAutoUserCreation>false</noAutoUserCreation>
-            <directAuthentication>false</directAuthentication>
-        </crowdSettings>
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <enabled>true</enabled>
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <retentionPeriodHours>168</retentionPeriodHours>
-            <createArchive>false</createArchive>
-            <excludedRepositories>
-                <repositoryRef>repo1</repositoryRef>
-            </excludedRepositories>
-            <sendMailOnError>true</sendMailOnError>
-            <excludeBuilds>false</excludeBuilds>
-        </backup>
-    </backups>
-    <indexer>
-        <enabled>false</enabled>
-        <cronExp>0 23 5 * * ?</cronExp>
-        <excludedRepositories>
-            <repositoryRef>codehaus</repositoryRef>
-            <repositoryRef>google-code</repositoryRef>
-            <repositoryRef>java.net.m1</repositoryRef>
-            <repositoryRef>java.net.m2</repositoryRef>
-            <repositoryRef>jboss</repositoryRef>
-            <repositoryRef>jfrog-libs</repositoryRef>
-            <repositoryRef>jfrog-plugins</repositoryRef>
-            <repositoryRef>libs-releases</repositoryRef>
-            <repositoryRef>libs-snapshots</repositoryRef>
-            <repositoryRef>plugins-releases</repositoryRef>
-            <repositoryRef>plugins-snapshots</repositoryRef>
-            <repositoryRef>remote-repos</repositoryRef>
-            <repositoryRef>repo1</repositoryRef>
-            <repositoryRef>spring-milestone</repositoryRef>
-            <repositoryRef>spring-release</repositoryRef>
-            <repositoryRef>spring-snapshots</repositoryRef>
-        </excludedRepositories>
-    </indexer>
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>true</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases-local</key>
-            <description>Local repository for plugins</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-        </localRepository>
-        <localRepository>
-            <key>ext-releases-local</key>
-            <description>Local repository for third party libraries</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshots-local</key>
-            <description>Local repository for third party snapshots</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-        </localRepository>
-    </localRepositories>
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <description>Central Maven 2 repository</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://repo1.maven.org/maven2</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m2</key>
-            <description>java.net Maven2 Format</description>
-            <includesPattern>**/*</includesPattern>
-            <excludesPattern>commons-*,org/apache/**</excludesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://download.java.net/maven/2</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m1</key>
-            <description>java.net Maven1 Format</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://download.java.net/maven/1</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <remoteRepoLayoutRef>maven-1-default</remoteRepoLayoutRef>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-libs</key>
-            <description>JFrog libraries releases</description>
-            <includesPattern>**/*</includesPattern>
-            <excludesPattern>org/apache/maven/**</excludesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://repo.jfrog.org/artifactory/libs-releases-local</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-plugins</key>
-            <description>JFrog plugins releases</description>
-            <includesPattern>org/jfrog/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://repo.jfrog.org/artifactory/plugins-releases-local</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jboss</key>
-            <description>JBoss Maven2 releases</description>
-            <includesPattern>org/jboss/**,org/hibernate/**,org/richfaces/**,org/drools/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://repository.jboss.com/maven2</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus</key>
-            <description>Codehaus Maven2 releases</description>
-            <includesPattern>org/**,com/**,net/**</includesPattern>
-            <excludesPattern>org/apache/**,commons-*,org/artifactory/**,org/jfrog/**</excludesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://repository.codehaus.org</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-milestone</key>
-            <description>SpringSource in milestone version</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://maven.springframework.org/milestone</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-snapshots</key>
-            <description>SpringSource in snapshot stage</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://maven.springframework.org/snapshot</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-release</key>
-            <description>SpringSource releases</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://maven.springframework.org/release</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>google-code</key>
-            <description>Google's open source releases</description>
-            <includesPattern>com/google/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://google-maven-repository.googlecode.com/svn/repository</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-    </remoteRepositories>
-    <virtualRepositories>
-        <virtualRepository>
-            <key>remote-repos</key>
-            <includesPattern>**/*</includesPattern>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>codehaus</repositoryRef>
-                <repositoryRef>jboss</repositoryRef>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-                <repositoryRef>jfrog-libs</repositoryRef>
-                <repositoryRef>jfrog-plugins</repositoryRef>
-                <repositoryRef>spring-milestone</repositoryRef>
-                <repositoryRef>spring-snapshots</repositoryRef>
-                <repositoryRef>spring-release</repositoryRef>
-                <repositoryRef>google-code</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-releases</key>
-            <includesPattern>**/*</includesPattern>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>false</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>libs-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-releases</key>
-            <includesPattern>**/*</includesPattern>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>false</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>plugins-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshots</key>
-            <includesPattern>**/*</includesPattern>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>false</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>libs-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshots</key>
-            <includesPattern>**/*</includesPattern>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>false</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>plugins-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-    </virtualRepositories>
-    <proxies>
-        <proxy>
-            <key>Charles</key>
-            <host>localhost</host>
-            <port>8888</port>
-            <defaultProxy>false</defaultProxy>
-        </proxy>
-    </proxies>
-    <propertySets>
-        <propertySet>
-            <name>artifactory</name>
-            <visible>false</visible>
-            <properties>
-                <property>
-                    <name>licenses</name>
-                    <closedPredefinedValues>true</closedPredefinedValues>
-                    <multipleChoice>true</multipleChoice>
-                    <predefinedValues>
-                        <predefinedValue>
-                            <value>AFL-3.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>AGPL-V3</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>APL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Apache-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Apache-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Apache-1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>APSL-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Artistic-License-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Attribution</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>BSL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CA-TOSL-1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CDDL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CDDL-1.0.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CDDL-1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Codehaus</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CCAG-2.5</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CPAL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CUAOFFICE-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Day</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Day-Addendum</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Bouncy-Castle</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>EUDATAGRID</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Enovi</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CPL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>LGPL-2.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>LGPL-3.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Historical</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>HSQLDB</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>IBMPL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>IPAFont-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>ISC</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Lucent-1.02</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>MirOS</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>MS-PL</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>MS-RL</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>JA-SIG</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>BSD</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>MIT</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>JSON</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Motosoto-0.9.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Eclipse-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>ECL2</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Eiffel-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>JTidy</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>JTA-Specification-1.0.1B</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Entessa-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>EUPL-1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Fair</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Frameworx-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>GPL-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>GPL-2.0+CE</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>GPL-3.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Mozilla-1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Multics</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>NASA-1.3</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>NTP</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>NAUMEN</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Nethack</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Nokia-1.0a</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>NOSL-3.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>OCLC-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Openfont-1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Opengroup</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>OpenSymphony</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>OSL-3.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>PHP-3.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>PostgreSQL</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Public Domain</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Public Domain - SUN</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>PythonPL</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>PythonSoftFoundation</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>QTPL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Real-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>RPL-1.5</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>RicohPL</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>SimPL-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Sleepycat</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>SUNPublic-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Sybase-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>TMate</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>UoI-NCSA</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>IU-Extreme-1.1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>VovidaPL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>W3C</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>wxWindows</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Xnet</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>ZPL-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>ZLIB</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Unknown</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                    </predefinedValues>
-                </property>
-            </properties>
-        </propertySet>
-    </propertySets>
-    <repoLayouts>
-        <repoLayout>
-            <name>maven-2-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>SNAPSHOT</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>ivy-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>gradle-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>maven-1-default</name>
-            <artifactPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.+</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.+</fileIntegrationRevisionRegExp>
-        </repoLayout>
-    </repoLayouts>
-    <remoteReplications/>
-    <localReplications/>
-    <gcConfig>
-        <cronExp>0 0 /4 * * ?</cronExp>
-    </gcConfig>
-    <cleanupConfig>
-        <cronExp>0 17 5 * * ?</cronExp>
-    </cleanupConfig>
-    <externalProviders>
-        <blackduck>
-            <enableIntegration>true</enableIntegration>
-            <serverUri>asdfblk</serverUri>
-            <username>asdf</username>
-            <password>asdf</password>
-            <connectionTimeoutMillis>20000</connectionTimeoutMillis>
-        </blackduck>
-    </externalProviders>
-</config>
\ No newline at end of file
diff --git a/base/config/src/test/resources/config/test/config-1.5.2-blackduck_no_settings.xml b/base/config/src/test/resources/config/test/config-1.5.2-blackduck_no_settings.xml
deleted file mode 100644
index 7d93d7a..0000000
--- a/base/config/src/test/resources/config/test/config-1.5.2-blackduck_no_settings.xml
+++ /dev/null
@@ -1,1082 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<config xmlns="http://artifactory.jfrog.org/xsd/1.5.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-    <offlineMode>false</offlineMode>
-    <fileUploadMaxSizeMb>100</fileUploadMaxSizeMb>
-    <dateFormat>dd-MM-yy HH:mm:ss z</dateFormat>
-    <addons>
-        <showAddonsInfo>true</showAddonsInfo>
-        <showAddonsInfoCookie>1380704308724</showAddonsInfoCookie>
-    </addons>
-    <security>
-        <anonAccessEnabled>false</anonAccessEnabled>
-        <hideUnauthorizedResources>false</hideUnauthorizedResources>
-        <passwordSettings>
-            <encryptionPolicy>supported</encryptionPolicy>
-        </passwordSettings>
-        <ldapSettings/>
-        <ldapGroupSettings/>
-        <crowdSettings>
-            <enableIntegration>true</enableIntegration>
-            <serverUrl>http://localhost:8095/crowd/</serverUrl>
-            <applicationName>artifactory</applicationName>
-            <password>password</password>
-            <sessionValidationInterval>0</sessionValidationInterval>
-            <useDefaultProxy>false</useDefaultProxy>
-            <noAutoUserCreation>false</noAutoUserCreation>
-            <directAuthentication>false</directAuthentication>
-        </crowdSettings>
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <enabled>true</enabled>
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <retentionPeriodHours>168</retentionPeriodHours>
-            <createArchive>false</createArchive>
-            <excludedRepositories>
-                <repositoryRef>repo1</repositoryRef>
-            </excludedRepositories>
-            <sendMailOnError>true</sendMailOnError>
-            <excludeBuilds>false</excludeBuilds>
-        </backup>
-    </backups>
-    <indexer>
-        <enabled>false</enabled>
-        <cronExp>0 23 5 * * ?</cronExp>
-        <excludedRepositories>
-            <repositoryRef>codehaus</repositoryRef>
-            <repositoryRef>google-code</repositoryRef>
-            <repositoryRef>java.net.m1</repositoryRef>
-            <repositoryRef>java.net.m2</repositoryRef>
-            <repositoryRef>jboss</repositoryRef>
-            <repositoryRef>jfrog-libs</repositoryRef>
-            <repositoryRef>jfrog-plugins</repositoryRef>
-            <repositoryRef>libs-releases</repositoryRef>
-            <repositoryRef>libs-snapshots</repositoryRef>
-            <repositoryRef>plugins-releases</repositoryRef>
-            <repositoryRef>plugins-snapshots</repositoryRef>
-            <repositoryRef>remote-repos</repositoryRef>
-            <repositoryRef>repo1</repositoryRef>
-            <repositoryRef>spring-milestone</repositoryRef>
-            <repositoryRef>spring-release</repositoryRef>
-            <repositoryRef>spring-snapshots</repositoryRef>
-        </excludedRepositories>
-    </indexer>
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>true</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases-local</key>
-            <description>Local repository for plugins</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-        </localRepository>
-        <localRepository>
-            <key>ext-releases-local</key>
-            <description>Local repository for third party libraries</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshots-local</key>
-            <description>Local repository for third party snapshots</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-        </localRepository>
-    </localRepositories>
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <description>Central Maven 2 repository</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://repo1.maven.org/maven2</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m2</key>
-            <description>java.net Maven2 Format</description>
-            <includesPattern>**/*</includesPattern>
-            <excludesPattern>commons-*,org/apache/**</excludesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://download.java.net/maven/2</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m1</key>
-            <description>java.net Maven1 Format</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://download.java.net/maven/1</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <remoteRepoLayoutRef>maven-1-default</remoteRepoLayoutRef>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-libs</key>
-            <description>JFrog libraries releases</description>
-            <includesPattern>**/*</includesPattern>
-            <excludesPattern>org/apache/maven/**</excludesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://repo.jfrog.org/artifactory/libs-releases-local</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-plugins</key>
-            <description>JFrog plugins releases</description>
-            <includesPattern>org/jfrog/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://repo.jfrog.org/artifactory/plugins-releases-local</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jboss</key>
-            <description>JBoss Maven2 releases</description>
-            <includesPattern>org/jboss/**,org/hibernate/**,org/richfaces/**,org/drools/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://repository.jboss.com/maven2</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus</key>
-            <description>Codehaus Maven2 releases</description>
-            <includesPattern>org/**,com/**,net/**</includesPattern>
-            <excludesPattern>org/apache/**,commons-*,org/artifactory/**,org/jfrog/**</excludesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://repository.codehaus.org</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-milestone</key>
-            <description>SpringSource in milestone version</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://maven.springframework.org/milestone</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-snapshots</key>
-            <description>SpringSource in snapshot stage</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://maven.springframework.org/snapshot</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-release</key>
-            <description>SpringSource releases</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://maven.springframework.org/release</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>google-code</key>
-            <description>Google's open source releases</description>
-            <includesPattern>com/google/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://google-maven-repository.googlecode.com/svn/repository</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <p2Support>false</p2Support>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <proxyRef>Charles</proxyRef>
-        </remoteRepository>
-    </remoteRepositories>
-    <virtualRepositories>
-        <virtualRepository>
-            <key>remote-repos</key>
-            <includesPattern>**/*</includesPattern>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>codehaus</repositoryRef>
-                <repositoryRef>jboss</repositoryRef>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-                <repositoryRef>jfrog-libs</repositoryRef>
-                <repositoryRef>jfrog-plugins</repositoryRef>
-                <repositoryRef>spring-milestone</repositoryRef>
-                <repositoryRef>spring-snapshots</repositoryRef>
-                <repositoryRef>spring-release</repositoryRef>
-                <repositoryRef>google-code</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-releases</key>
-            <includesPattern>**/*</includesPattern>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>false</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>libs-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-releases</key>
-            <includesPattern>**/*</includesPattern>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>false</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>plugins-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshots</key>
-            <includesPattern>**/*</includesPattern>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>false</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>libs-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshots</key>
-            <includesPattern>**/*</includesPattern>
-            <enableNuGetSupport>false</enableNuGetSupport>
-            <enableGemsSupport>false</enableGemsSupport>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>false</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>plugins-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-    </virtualRepositories>
-    <proxies>
-        <proxy>
-            <key>Charles</key>
-            <host>localhost</host>
-            <port>8888</port>
-            <defaultProxy>true</defaultProxy>
-        </proxy>
-    </proxies>
-    <propertySets>
-        <propertySet>
-            <name>artifactory</name>
-            <visible>false</visible>
-            <properties>
-                <property>
-                    <name>licenses</name>
-                    <closedPredefinedValues>true</closedPredefinedValues>
-                    <multipleChoice>true</multipleChoice>
-                    <predefinedValues>
-                        <predefinedValue>
-                            <value>AFL-3.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>AGPL-V3</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>APL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Apache-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Apache-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Apache-1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>APSL-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Artistic-License-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Attribution</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>BSL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CA-TOSL-1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CDDL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CDDL-1.0.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CDDL-1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Codehaus</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CCAG-2.5</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CPAL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CUAOFFICE-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Day</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Day-Addendum</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Bouncy-Castle</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>EUDATAGRID</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Enovi</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CPL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>LGPL-2.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>LGPL-3.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Historical</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>HSQLDB</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>IBMPL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>IPAFont-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>ISC</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Lucent-1.02</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>MirOS</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>MS-PL</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>MS-RL</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>JA-SIG</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>BSD</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>MIT</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>JSON</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Motosoto-0.9.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Eclipse-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>ECL2</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Eiffel-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>JTidy</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>JTA-Specification-1.0.1B</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Entessa-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>EUPL-1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Fair</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Frameworx-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>GPL-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>GPL-2.0+CE</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>GPL-3.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Mozilla-1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Multics</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>NASA-1.3</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>NTP</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>NAUMEN</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Nethack</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Nokia-1.0a</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>NOSL-3.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>OCLC-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Openfont-1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Opengroup</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>OpenSymphony</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>OSL-3.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>PHP-3.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>PostgreSQL</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Public Domain</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Public Domain - SUN</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>PythonPL</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>PythonSoftFoundation</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>QTPL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Real-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>RPL-1.5</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>RicohPL</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>SimPL-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Sleepycat</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>SUNPublic-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Sybase-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>TMate</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>UoI-NCSA</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>IU-Extreme-1.1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>VovidaPL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>W3C</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>wxWindows</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Xnet</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>ZPL-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>ZLIB</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Unknown</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                    </predefinedValues>
-                </property>
-            </properties>
-        </propertySet>
-    </propertySets>
-    <repoLayouts>
-        <repoLayout>
-            <name>maven-2-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>SNAPSHOT</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>ivy-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>gradle-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>maven-1-default</name>
-            <artifactPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.+</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.+</fileIntegrationRevisionRegExp>
-        </repoLayout>
-    </repoLayouts>
-    <remoteReplications/>
-    <localReplications/>
-    <gcConfig>
-        <cronExp>0 0 /4 * * ?</cronExp>
-    </gcConfig>
-    <cleanupConfig>
-        <cronExp>0 17 5 * * ?</cronExp>
-    </cleanupConfig>
-    <externalProviders>
-    </externalProviders>
-</config>
\ No newline at end of file
diff --git a/base/config/src/test/resources/config/test/config-1.6.8-expires_in.xml b/base/config/src/test/resources/config/test/config-1.6.8-expires_in.xml
deleted file mode 100644
index 75ac1ca..0000000
--- a/base/config/src/test/resources/config/test/config-1.6.8-expires_in.xml
+++ /dev/null
@@ -1,822 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<config xmlns="http://artifactory.jfrog.org/xsd/1.6.8" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-    <offlineMode>false</offlineMode>
-    <helpLinksEnabled>true</helpLinksEnabled>
-    <fileUploadMaxSizeMb>100</fileUploadMaxSizeMb>
-    <dateFormat>dd-MM-yy HH:mm:ss z</dateFormat>
-    <addons>
-        <showAddonsInfo>true</showAddonsInfo>
-        <showAddonsInfoCookie>1452782266375</showAddonsInfoCookie>
-    </addons>
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-        <anonAccessToBuildInfosDisabled>false</anonAccessToBuildInfosDisabled>
-        <hideUnauthorizedResources>false</hideUnauthorizedResources>
-        <passwordSettings>
-            <encryptionPolicy>supported</encryptionPolicy>
-            <expirationPolicy>
-                <enabled>false</enabled>
-                <expiresIn>60</expiresIn>
-                <notifyByEmail>true</notifyByEmail>
-            </expirationPolicy>
-        </passwordSettings>
-        <ldapSettings/>
-        <ldapGroupSettings/>
-        <userLockPolicy>
-            <enabled>false</enabled>
-            <loginAttempts>5</loginAttempts>
-        </userLockPolicy>
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <enabled>false</enabled>
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <retentionPeriodHours>0</retentionPeriodHours>
-            <createArchive>false</createArchive>
-            <excludedRepositories>
-                <repositoryRef>remote-repo</repositoryRef>
-            </excludedRepositories>
-            <sendMailOnError>true</sendMailOnError>
-            <excludeBuilds>false</excludeBuilds>
-            <excludeNewRepositories>false</excludeNewRepositories>
-        </backup>
-    </backups>
-    <localRepositories>
-        <localRepository>
-            <key>libs-release-local</key>
-            <type>maven</type>
-            <description>Local repository for in-house libraries</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <dockerApiVersion>V1</dockerApiVersion>
-            <forceDockerAuthentication>false</forceDockerAuthentication>
-            <forceNugetAuthentication>false</forceNugetAuthentication>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-            <debianTrivialLayout>false</debianTrivialLayout>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshot-local</key>
-            <type>maven</type>
-            <description>Local repository for in-house snapshots</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <dockerApiVersion>V1</dockerApiVersion>
-            <forceDockerAuthentication>false</forceDockerAuthentication>
-            <forceNugetAuthentication>false</forceNugetAuthentication>
-            <blackedOut>false</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-            <debianTrivialLayout>false</debianTrivialLayout>
-        </localRepository>
-        <localRepository>
-            <key>plugins-release-local</key>
-            <type>maven</type>
-            <description>Local repository for plugins</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <dockerApiVersion>V1</dockerApiVersion>
-            <forceDockerAuthentication>false</forceDockerAuthentication>
-            <forceNugetAuthentication>false</forceNugetAuthentication>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-            <debianTrivialLayout>false</debianTrivialLayout>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshot-local</key>
-            <type>maven</type>
-            <description>Local repository for plugins snapshots</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <dockerApiVersion>V1</dockerApiVersion>
-            <forceDockerAuthentication>false</forceDockerAuthentication>
-            <forceNugetAuthentication>false</forceNugetAuthentication>
-            <blackedOut>false</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-            <debianTrivialLayout>false</debianTrivialLayout>
-        </localRepository>
-        <localRepository>
-            <key>ext-release-local</key>
-            <type>maven</type>
-            <description>Local repository for third party libraries</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <dockerApiVersion>V1</dockerApiVersion>
-            <forceDockerAuthentication>false</forceDockerAuthentication>
-            <forceNugetAuthentication>false</forceNugetAuthentication>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-            <debianTrivialLayout>false</debianTrivialLayout>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshot-local</key>
-            <type>maven</type>
-            <description>Local repository for third party snapshots</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <dockerApiVersion>V1</dockerApiVersion>
-            <forceDockerAuthentication>false</forceDockerAuthentication>
-            <forceNugetAuthentication>false</forceNugetAuthentication>
-            <blackedOut>false</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <snapshotVersionBehavior>unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-            <calculateYumMetadata>false</calculateYumMetadata>
-            <yumRootDepth>0</yumRootDepth>
-            <debianTrivialLayout>false</debianTrivialLayout>
-        </localRepository>
-    </localRepositories>
-    <remoteRepositories>
-        <remoteRepository>
-            <key>jcenter</key>
-            <type>maven</type>
-            <description>Bintray Central Java repository</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <dockerApiVersion>V1</dockerApiVersion>
-            <forceDockerAuthentication>false</forceDockerAuthentication>
-            <forceNugetAuthentication>false</forceNugetAuthentication>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://jcenter.bintray.com</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>600</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>1800</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <allowAnyHostAuth>false</allowAnyHostAuth>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <enableCookieManagement>false</enableCookieManagement>
-            <enableTokenAuthentication>false</enableTokenAuthentication>
-            <propagateQueryParams>false</propagateQueryParams>
-        </remoteRepository>
-        <remoteRepository>
-            <key>remote-repo</key>
-            <type>maven</type>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <dockerApiVersion>V1</dockerApiVersion>
-            <forceDockerAuthentication>false</forceDockerAuthentication>
-            <forceNugetAuthentication>false</forceNugetAuthentication>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets>
-                <propertySetRef>artifactory</propertySetRef>
-            </propertySets>
-            <archiveBrowsingEnabled>false</archiveBrowsingEnabled>
-            <url>http://repo.jfrog.org/artifactory/remote-repos</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>600</retrievalCachePeriodSecs>
-            <assumedOfflinePeriodSecs>300</assumedOfflinePeriodSecs>
-            <missedRetrievalCachePeriodSecs>1800</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <allowAnyHostAuth>false</allowAnyHostAuth>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-            <enableCookieManagement>false</enableCookieManagement>
-            <enableTokenAuthentication>false</enableTokenAuthentication>
-            <propagateQueryParams>false</propagateQueryParams>
-        </remoteRepository>
-    </remoteRepositories>
-    <virtualRepositories>
-        <virtualRepository>
-            <key>remote-repos</key>
-            <type>maven</type>
-            <includesPattern>**/*</includesPattern>
-            <dockerApiVersion>V1</dockerApiVersion>
-            <forceDockerAuthentication>false</forceDockerAuthentication>
-            <forceNugetAuthentication>false</forceNugetAuthentication>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>jcenter</repositoryRef>
-                <repositoryRef>remote-repo</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-release</key>
-            <type>maven</type>
-            <includesPattern>**/*</includesPattern>
-            <dockerApiVersion>V1</dockerApiVersion>
-            <forceDockerAuthentication>false</forceDockerAuthentication>
-            <forceNugetAuthentication>false</forceNugetAuthentication>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>false</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>libs-release-local</repositoryRef>
-                <repositoryRef>ext-release-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-release</key>
-            <type>maven</type>
-            <includesPattern>**/*</includesPattern>
-            <dockerApiVersion>V1</dockerApiVersion>
-            <forceDockerAuthentication>false</forceDockerAuthentication>
-            <forceNugetAuthentication>false</forceNugetAuthentication>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>false</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>plugins-release-local</repositoryRef>
-                <repositoryRef>ext-release-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshot</key>
-            <type>maven</type>
-            <includesPattern>**/*</includesPattern>
-            <dockerApiVersion>V1</dockerApiVersion>
-            <forceDockerAuthentication>false</forceDockerAuthentication>
-            <forceNugetAuthentication>false</forceNugetAuthentication>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>false</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>libs-snapshot-local</repositoryRef>
-                <repositoryRef>ext-snapshot-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshot</key>
-            <type>maven</type>
-            <includesPattern>**/*</includesPattern>
-            <dockerApiVersion>V1</dockerApiVersion>
-            <forceDockerAuthentication>false</forceDockerAuthentication>
-            <forceNugetAuthentication>false</forceNugetAuthentication>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>false</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>plugins-snapshot-local</repositoryRef>
-                <repositoryRef>ext-snapshot-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-    </virtualRepositories>
-    <proxies/>
-    <reverseProxies/>
-    <propertySets>
-        <propertySet>
-            <name>artifactory</name>
-            <visible>false</visible>
-            <properties>
-                <property>
-                    <name>licenses</name>
-                    <closedPredefinedValues>true</closedPredefinedValues>
-                    <multipleChoice>true</multipleChoice>
-                    <predefinedValues>
-                        <predefinedValue>
-                            <value>AFL-3.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>AGPL-V3</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>APL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Apache-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Apache-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Apache-1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>APSL-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Artistic-License-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Attribution</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>BSL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CA-TOSL-1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CDDL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CDDL-1.0.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CDDL-1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Codehaus</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CCAG-2.5</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CPAL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CUAOFFICE-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Day</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Day-Addendum</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Bouncy-Castle</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>EUDATAGRID</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Enovi</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>CPL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>LGPL-2.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>LGPL-3.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Historical</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>HSQLDB</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>IBMPL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>IPAFont-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>ISC</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Lucent-1.02</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>MirOS</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>MS-PL</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>MS-RL</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>JA-SIG</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>BSD</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>MIT</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>JSON</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Motosoto-0.9.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Eclipse-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>ECL2</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Eiffel-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>JTidy</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>JTA-Specification-1.0.1B</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Entessa-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>EUPL-1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Fair</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Frameworx-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>GPL-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>GPL-2.0+CE</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>GPL-3.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Mozilla-1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Multics</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>NASA-1.3</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>NTP</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>NAUMEN</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Nethack</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Nokia-1.0a</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>NOSL-3.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>OCLC-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Openfont-1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Opengroup</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>OpenSymphony</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>OSL-3.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>PHP-3.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>PostgreSQL</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Public Domain</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Public Domain - SUN</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>PythonPL</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>PythonSoftFoundation</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>QTPL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Real-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>RPL-1.5</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>RicohPL</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>SimPL-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Sleepycat</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>SUNPublic-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Sybase-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>TMate</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>UoI-NCSA</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>IU-Extreme-1.1.1</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>VovidaPL-1.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>W3C</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>wxWindows</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Xnet</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>ZPL-2.0</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>ZLIB</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>TPL</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                        <predefinedValue>
-                            <value>Not Searched</value>
-                            <defaultValue>false</defaultValue>
-                        </predefinedValue>
-                    </predefinedValues>
-                </property>
-            </properties>
-        </propertySet>
-    </propertySets>
-    <repoLayouts>
-        <repoLayout>
-            <name>maven-2-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>SNAPSHOT</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>ivy-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>gradle-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>maven-1-default</name>
-            <artifactPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.+</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.+</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>nuget-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[module].[baseRev](-[fileItegRev]).nupkg</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>false</distinctiveDescriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.*</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.*</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>npm-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[module]-[baseRev](-[fileItegRev]).tgz</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>false</distinctiveDescriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.*</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.*</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>bower-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[module]-[baseRev](-[fileItegRev]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>false</distinctiveDescriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.*</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.*</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>vcs-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[refs<tags|branches>]/[baseRev]/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>false</distinctiveDescriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.*</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>[a-zA-Z0-9]{40}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>sbt-default</name>
-            <artifactPathPattern>[org]/[module]/(scala_[scalaVersion<.+>])/(sbt_[sbtVersion<.+>])/[baseRev]/[type]s/[module](-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/(scala_[scalaVersion<.+>])/(sbt_[sbtVersion<.+>])/[baseRev]/[type]s/ivy.xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>simple-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[module]-[baseRev](-[fileItegRev]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>false</distinctiveDescriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.*</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.*</fileIntegrationRevisionRegExp>
-        </repoLayout>
-    </repoLayouts>
-    <remoteReplications/>
-    <localReplications/>
-    <gcConfig>
-        <cronExp>0 0 /4 * * ?</cronExp>
-    </gcConfig>
-    <cleanupConfig>
-        <cronExp>0 12 5 * * ?</cronExp>
-    </cleanupConfig>
-    <virtualCacheCleanupConfig>
-        <cronExp>0 12 5 * * ?</cronExp>
-    </virtualCacheCleanupConfig>
-    <folderDownloadConfig>
-        <enabled>false</enabled>
-        <maxDownloadSizeMb>1024</maxDownloadSizeMb>
-        <maxFiles>5000</maxFiles>
-        <maxConcurrentRequests>10</maxConcurrentRequests>
-    </folderDownloadConfig>
-    <trashcanConfig>
-        <enabled>true</enabled>
-        <allowPermDeletes>false</allowPermDeletes>
-        <retentionPeriodDays>14</retentionPeriodDays>
-    </trashcanConfig>
-</config>
diff --git a/base/config/src/test/resources/config/test/config.1.0.0.xml b/base/config/src/test/resources/config/test/config.1.0.0.xml
deleted file mode 100644
index 2c281a6..0000000
--- a/base/config/src/test/resources/config/test/config.1.0.0.xml
+++ /dev/null
@@ -1,167 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.0.0"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.0.0
-        http://artifactory.jfrog.org/xsd/artifactory-v1_0_0.xsd">
-
-    <anonDownloadsAllowed>false</anonDownloadsAllowed>
-    <!-- Backup every 2 hours-->
-    <backupDir>/backups/artifactory/</backupDir>
-    <backupCronExp>0 0 0 * * ?</backupCronExp>
-
-    <localRepositories>
-        <localRepository>
-            <key>frog-releases</key>
-            <description>IDI Releases Repoitory</description>
-            <includesPattern>com/frog/**,com/myc/**</includesPattern>
-            <useSnapshotUniqueVersions>true</useSnapshotUniqueVersions>
-        </localRepository>
-        <localRepository>
-            <key>frog-snapshots</key>
-            <description>IDI Snapshots Repository</description>
-            <includesPattern>com/frog/**</includesPattern>
-            <useSnapshotUniqueVersions>false</useSnapshotUniqueVersions>
-        </localRepository>
-        <localRepository>
-            <key>3rd-party</key>
-            <description>3rd Party artifacts Repository</description>
-            <excludesPattern>com/frog/**</excludesPattern>
-            <!-- no useSnapshotUniqueVersions element -->
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases</key>
-            <description>Maven Plugins releases</description>
-            <includesPattern>org/jfrog/**,com/frog/**,com/myc/**</includesPattern>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots</key>
-            <description>Maven Plugins Snapshots</description>
-            <includesPattern>org/jfrog/**,com/frog/**,com/myc/**</includesPattern>
-        </localRepository>
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>jfrog</key>
-            <includesPattern>org/jfrog/**</includesPattern>
-            <url>http://www.jfrog.org/artifactory/plugins-releases</url>
-            <proxyRef>ntlmaps</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>repo1</key>
-            <excludesPattern>org/jfrog/**,com/frog/**,com/myc/**</excludesPattern>
-            <url>http://repo1.maven.org/maven2</url>
-            <socketTimeoutMillis>10000</socketTimeoutMillis>
-            <proxyRef>ntlmaps</proxyRef>
-        </remoteRepository>
-        <!--remoteRepository>
-            <key>codehaus</key>
-            <excludesPattern>com/frog/**</excludesPattern>
-            <url>http://repository.codehaus.org</url>
-            <socketTimeoutMillis>10000</socketTimeoutMillis>
-            <proxyRef>ntlmaps</proxyRef>
-        </remoteRepository-->
-        <remoteRepository>
-            <key>jboss</key>
-            <excludesPattern>org/jfrog/**,com/frog/**,com/myc/**</excludesPattern>
-            <url>http://repository.jboss.com/maven2</url>
-            <socketTimeoutMillis>10000</socketTimeoutMillis>
-            <proxyRef>ntlmaps</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring</key>
-            <excludesPattern>org/jfrog/**,com/frog/**,com/myc/**</excludesPattern>
-            <url>http://spring-rich-c.sourceforge.net/maven2repository</url>
-            <socketTimeoutMillis>10000</socketTimeoutMillis>
-            <proxyRef>ntlmaps</proxyRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>openqa</key>
-            <excludesPattern>org/jfrog/**,com/frog/**,com/myc/**</excludesPattern>
-            <url>http://archiva.openqa.org/repository/releases</url>
-            <socketTimeoutMillis>10000</socketTimeoutMillis>
-            <proxyRef>ntlmaps</proxyRef>
-        </remoteRepository>
-    </remoteRepositories>
-
-    <!--
-            <remoteRepository>
-                <key>repo1</key>
-                <handleReleases>true</handleReleases>
-                <handleSnapshots>false</handleSnapshots>
-                <excludesPattern>org/artifactory/**</excludesPattern>
-                <url>http://repo1.maven.org/maven2</url>
-            </remoteRepository>
-            <remoteRepository>
-                <key>codehaus</key>
-                <handleReleases>true</handleReleases>
-                <handleSnapshots>false</handleSnapshots>
-                <url>http://dist.codehaus.org</url>
-            </remoteRepository>
-            <remoteRepository>
-                <key>codehaus-snapshots</key>
-                <handleReleases>false</handleReleases>
-                <handleSnapshots>true</handleSnapshots>
-                <url>http://snapshots.repository.codehaus.org</url>
-            </remoteRepository>
-            <remoteRepository>
-                <key>ibiblio</key>
-                <excludesPattern>org/artifactory/**</excludesPattern>
-                <url>http://www.ibiblio.org/maven2</url>
-            </remoteRepository>
-            <remoteRepository>
-                <key>apache-m2-snapshots</key>
-                <handleReleases>false</handleReleases>
-                <handleSnapshots>true</handleSnapshots>
-                <url>http://people.apache.org/repo/m2-snapshot-repository</url>
-            </remoteRepository>
-
-            <remoteRepository>
-                <key>java.net</key>
-                <description>java.net repo</description>
-                <blackedOut>true</blackedOut>
-                <includesPattern>*/**</includesPattern>
-                <excludesPattern></excludesPattern>
-                <url>https://maven-repository.dev.java.net/nonav/repository</url>
-                <hardFail>true</hardFail>
-                <storeArtifactsLocally>true</storeArtifactsLocally>
-                <cacheRetrievalFailures>true</cacheRetrievalFailures>
-                <cacheRetrievalMisses>true</cacheRetrievalMisses>
-                <username>un</username>
-                <password>pw</password>
-                <socketTimeoutMillis>2000</socketTimeoutMillis>
-                <proxyRef>proxy1</proxyRef>
-            </remoteRepository>
-        </remoteRepositories>
-    -->
-
-    <proxies>
-        <proxy>
-            <key>ntlmaps</key>
-            <host>myproxy</host>
-            <port>5865</port>
-            <username></username>
-            <password></password>
-            <domain></domain>
-        </proxy>
-    </proxies>
-
-</config>
diff --git a/base/config/src/test/resources/config/test/config.1.0.0_no-backup-cron.xml b/base/config/src/test/resources/config/test/config.1.0.0_no-backup-cron.xml
deleted file mode 100644
index e7b64b2..0000000
--- a/base/config/src/test/resources/config/test/config.1.0.0_no-backup-cron.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.0.0"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.0.0
-        http://artifactory.jfrog.org/xsd/artifactory-v1_0_0.xsd">
-
-    <anonDownloadsAllowed>false</anonDownloadsAllowed>
-    <!-- Backup every 2 hours-->
-    <backupDir>/backups/artifactory/</backupDir>
-
-    <localRepositories>
-        <localRepository>
-            <key>frog-releases</key>
-            <description>IDI Releases Repoitory</description>
-            <includesPattern>com/frog/**,com/myc/**</includesPattern>
-            <useSnapshotUniqueVersions>true</useSnapshotUniqueVersions>
-        </localRepository>
-    </localRepositories>
-</config>
diff --git a/base/config/src/test/resources/config/test/config.1.1.0.xml b/base/config/src/test/resources/config/test/config.1.1.0.xml
deleted file mode 100644
index d6599cb..0000000
--- a/base/config/src/test/resources/config/test/config.1.1.0.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.1.0"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.1.0
-        http://www.jfrog.org/xsd/artifactory-v1_1_0.xsd">
-    <serverName>Dev Server</serverName>
-    <anonDownloadsAllowed>true</anonDownloadsAllowed>
-    <fileUploadMaxSizeMb>10</fileUploadMaxSizeMb>
-    <backup>
-        <!--<dir></dir>-->
-        <!--Backup every 12 hours -->
-        <!--<cronExp>0 0 /12 * * ?</cronExp>-->
-        <!--Backup every 1 minute -->
-        <!--<cronExp>0 /1 * * * ?</cronExp>-->
-        <!--<retentionPeriodHours>168</retentionPeriodHours>-->
-        <excludedRepositories>
-            <repositoryRef>repo1</repositoryRef>
-            <repositoryRef>ext-snapshots</repositoryRef>
-            <repositoryRef>codehaus-snapshots</repositoryRef>
-        </excludedRepositories>
-    </backup>
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases</key>
-            <description>Local Repository for Applications Releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots</key>
-            <description>Local Repository for Applications Snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>3</maxUniqueSnapshots>
-            <snapshotVersionBehavior>deployer</snapshotVersionBehavior>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-deployer</key>
-            <description>Local Repository for Applications Snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <snapshotVersionBehavior>deployer</snapshotVersionBehavior>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases</key>
-            <description>Local Repository for Plugins Releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots</key>
-            <description>Local Repository for Plugins Snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-unique</key>
-            <description>Local Repository for Plugins Snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <snapshotVersionBehavior>unique</snapshotVersionBehavior>
-        </localRepository>
-        <localRepository>
-            <key>ext-releases</key>
-            <description>Local Repository for Third party libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshots</key>
-            <description>Local Repository for Third party snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://repo1.maven.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus-snapshots</key>
-            <blackedOut>true</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://snapshots.repository.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m2</key>
-            <description>java.net repo</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://download.java.net/maven/2</url>
-            <!--<offline>true</offline>-->
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m1</key>
-            <description>java.net</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <type>maven1</type>
-            <url>http://download.java.net/maven/1</url>
-        </remoteRepository>
-
-        <!--<remoteRepository>
-            <key>codehaus</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://dist.codehaus.org</url>
-        </remoteRepository>-->
-        <!--<remoteRepository>
-            <key>ibiblio</key>
-            <excludesPattern>org/artifactory/**</excludesPattern>
-            <url>http://www.ibiblio.org/maven2</url>
-        </remoteRepository>-->
-        <!--<remoteRepository>
-            <key>apache-m2-snapshots</key>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://people.apache.org/repo/m2-snapshot-repository</url>
-        </remoteRepository>-->
-
-        <!--<remoteRepository>
-            <key>java.net</key>
-            <description>java.net repo</description>
-            <blackedOut>true</blackedOut>
-            <includesPattern>*/**</includesPattern>
-            <excludesPattern></excludesPattern>
-            <url>https://maven-repository.dev.java.net/nonav/repository</url>
-            <hardFail>true</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <cacheRetrievalFailures>true</cacheRetrievalFailures>
-            <cacheRetrievalMisses>true</cacheRetrievalMisses>
-            <username>un</username>
-            <password>pw</password>
-            <socketTimeoutMillis>2000</socketTimeoutMillis>
-            <proxyRef>proxy1</proxyRef>
-        </remoteRepository>-->
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <virtualRepository>
-            <key>development</key>
-            <repositories>
-                <repositoryRef>libs-snapshots</repositoryRef>
-                <repositoryRef>plugins-releases</repositoryRef>
-                <repositoryRef>plugins-snapshots</repositoryRef>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-            </repositories>
-        </virtualRepository>
-    </virtualRepositories>
-
-</config>
diff --git a/base/config/src/test/resources/config/test/config.1.2.0.xml b/base/config/src/test/resources/config/test/config.1.2.0.xml
deleted file mode 100644
index 5506a49..0000000
--- a/base/config/src/test/resources/config/test/config.1.2.0.xml
+++ /dev/null
@@ -1,188 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.2.0"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.2.0
-        http://www.jfrog.org/xsd/artifactory-v1_2_0.xsd">
-    <serverName>Dev Server</serverName>
-    <anonDownloadsAllowed>true</anonDownloadsAllowed>
-    <fileUploadMaxSizeMb>10</fileUploadMaxSizeMb>
-    <security>
-        <ldapSettings>
-            <authenticationMethod>bind-anonymous</authenticationMethod>
-            <ldapUrl>ldap://mydomain:389/dc=mycompany,dc=com</ldapUrl>
-            <userDnPattern>uid={0},ou=People</userDnPattern>
-            <managerDn></managerDn>
-            <managerPassword></managerPassword>
-            <searchAuthPasswordAttributeName>userPassword</searchAuthPasswordAttributeName>
-        </ldapSettings>
-    </security>
-    <backup>
-        <!--<dir></dir>-->
-        <!--Backup every 12 hours -->
-        <!--<cronExp>0 0 /12 * * ?</cronExp>-->
-        <!--Backup every 1 minute -->
-        <!--<cronExp>0 /1 * * * ?</cronExp>-->
-        <!--<retentionPeriodHours>168</retentionPeriodHours>-->
-        <excludedRepositories>
-            <repositoryRef>repo1</repositoryRef>
-            <repositoryRef>ext-snapshots</repositoryRef>
-            <repositoryRef>codehaus-snapshots</repositoryRef>
-        </excludedRepositories>
-    </backup>
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases</key>
-            <description>Local Repository for Applications Releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots</key>
-            <description>Local Repository for Applications Snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>3</maxUniqueSnapshots>
-            <snapshotVersionBehavior>unique</snapshotVersionBehavior>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-deployer</key>
-            <description>Local Repository for Applications Snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <snapshotVersionBehavior>deployer</snapshotVersionBehavior>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases</key>
-            <description>Local Repository for Plugins Releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots</key>
-            <description>Local Repository for Plugins Snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-unique</key>
-            <description>Local Repository for Plugins Snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <snapshotVersionBehavior>unique</snapshotVersionBehavior>
-        </localRepository>
-        <localRepository>
-            <key>ext-releases</key>
-            <description>Local Repository for Third party libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshots</key>
-            <description>Local Repository for Third party snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://repo1.maven.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus-snapshots</key>
-            <blackedOut>true</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://snapshots.repository.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m2</key>
-            <description>java.net repo</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://download.java.net/maven/2</url>
-            <!--<offline>true</offline>-->
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m1</key>
-            <description>java.net</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <type>maven1</type>
-            <url>http://download.java.net/maven/1</url>
-        </remoteRepository>
-
-        <!--<remoteRepository>
-            <key>codehaus</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://dist.codehaus.org</url>
-        </remoteRepository>-->
-        <!--<remoteRepository>
-            <key>ibiblio</key>
-            <excludesPattern>org/artifactory/**</excludesPattern>
-            <url>http://www.ibiblio.org/maven2</url>
-        </remoteRepository>-->
-        <!--<remoteRepository>
-            <key>apache-m2-snapshots</key>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://people.apache.org/repo/m2-snapshot-repository</url>
-        </remoteRepository>-->
-
-        <!--<remoteRepository>
-            <key>java.net</key>
-            <description>java.net repo</description>
-            <blackedOut>true</blackedOut>
-            <includesPattern>*/**</includesPattern>
-            <excludesPattern></excludesPattern>
-            <url>https://maven-repository.dev.java.net/nonav/repository</url>
-            <hardFail>true</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <cacheRetrievalFailures>true</cacheRetrievalFailures>
-            <cacheRetrievalMisses>true</cacheRetrievalMisses>
-            <username>un</username>
-            <password>pw</password>
-            <socketTimeoutMillis>2000</socketTimeoutMillis>
-            <proxyRef>proxy1</proxyRef>
-        </remoteRepository>-->
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <virtualRepository>
-            <key>development</key>
-            <repositories>
-                <repositoryRef>libs-snapshots</repositoryRef>
-                <repositoryRef>plugins-releases</repositoryRef>
-                <repositoryRef>plugins-snapshots</repositoryRef>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-            </repositories>
-        </virtualRepository>
-    </virtualRepositories>
-
-</config>
diff --git a/base/config/src/test/resources/config/test/config.1.3.0.xml b/base/config/src/test/resources/config/test/config.1.3.0.xml
deleted file mode 100644
index a28403b..0000000
--- a/base/config/src/test/resources/config/test/config.1.3.0.xml
+++ /dev/null
@@ -1,180 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns="http://artifactory.jfrog.org/xsd/1.3.0"
-        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.3.0
-            http://www.jfrog.org/xsd/artifactory-v1_3_0.xsd">
-    <backup>
-        <cronExp>0 0 /12 * * ?</cronExp>
-        <retentionPeriodHours>168</retentionPeriodHours>
-        <excludedRepositories>
-            <repositoryRef>repo1</repositoryRef>
-            <repositoryRef>codehaus-snapshots</repositoryRef>
-            <repositoryRef>java.net.m2</repositoryRef>
-            <repositoryRef>java.net.m1</repositoryRef>
-        </excludedRepositories>
-    </backup>
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases-local</key>
-            <description>Local repository for plugins</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-releases-local</key>
-            <description>Local repository for third party libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshots-local</key>
-            <description>Local repository for third party snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <!-- Tests repos -->
-        <localRepository>
-            <key>libs-snapshots-deployer</key>
-            <description>Local Repository for Applications Snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <snapshotVersionBehavior>deployer</snapshotVersionBehavior>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-unique</key>
-            <description>Local Repository for Plugins Snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <snapshotVersionBehavior>unique</snapshotVersionBehavior>
-        </localRepository>
-    </localRepositories>
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://repo1.maven.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus-snapshots</key>
-            <blackedOut>true</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://snapshots.repository.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m2</key>
-            <description>java.net Maven2 format</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://download.java.net/maven/2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m1</key>
-            <description>java.net Maven1 format</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <type>maven1</type>
-            <url>http://download.java.net/maven/1</url>
-        </remoteRepository>
-    </remoteRepositories>
-    <virtualRepositories>
-        <virtualRepository>
-            <key>remote-repos</key>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-releases</key>
-            <repositories>
-                <repositoryRef>libs-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-releases</key>
-            <repositories>
-                <repositoryRef>plugins-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshots</key>
-            <repositories>
-                <repositoryRef>libs-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-                <repositoryRef>codehaus-snapshots</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshots</key>
-            <repositories>
-                <repositoryRef>plugins-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-                <repositoryRef>codehaus-snapshots</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>recursive</key>
-            <repositories>
-                <repositoryRef>libs-releases-local</repositoryRef>
-                <repositoryRef>recursive2</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>recursive2</key>
-            <repositories>
-                <repositoryRef>plugins-snapshots-local</repositoryRef>
-                <repositoryRef>recursive</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-    </virtualRepositories>
-</config>
diff --git a/base/config/src/test/resources/config/test/config.1.3.1.xml b/base/config/src/test/resources/config/test/config.1.3.1.xml
deleted file mode 100644
index 7c5c1ae..0000000
--- a/base/config/src/test/resources/config/test/config.1.3.1.xml
+++ /dev/null
@@ -1,161 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.3.1"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.3.1
-        http://www.jfrog.org/xsd/artifactory-v1_3_1.xsd">
-
-    <serverName>Local Test</serverName>
-
-    <security>
-        <!--
-        enable/disable anonymous downloads
-        -->
-        <anonAccessEnabled>false</anonAccessEnabled>
-        <ldapSettings>
-            <ldapUrl>ldap://127.0.0.1:10389/dc=jfrog,dc=org</ldapUrl>
-            <userDnPattern>uid={0}, ou=People</userDnPattern>
-            <managerDn></managerDn>
-            <managerPassword></managerPassword>
-        </ldapSettings>
-    </security>
-    <!--
-     <backups>
-          <backup>
-
-    alternative backup dir
-    -->
-    <!--<dir></dir>-->
-    <!--
-    backup every 12 hours
-    -->
-    <!--
-                <cronExp>0 0 /12 * * ?</cronExp>
-    -->
-    <!--
-    keep backups for a week.
-    Set to 0 in order to always backup to a "current" dir (useful for incremental FS backups).
-    -->
-    <!--
-                <retentionPeriodHours>168</retentionPeriodHours>
-    -->
-    <!--
-    exclude certain repositories from being backed up
-    -->
-    <!--            <excludedRepositories>
-               <repositoryRef>remote-repo</repositoryRef>
-           </excludedRepositories>
-       </backup>
-   </backups>
-   -->
-
-    <!-- The cron definition to control the activation of the m2 eclipse indexer. Default every full hour. -->
-    <indexer>
-        <cronExp>0 0 /1 * * ?</cronExp>
-    </indexer>
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases-local</key>
-            <description>Local repository for plugins</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-releases-local</key>
-            <description>Local repository for third party libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshots-local</key>
-            <description>Local repository for third party snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>remote-repo</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <!--<url>http://10.0.0.13:8081/artifactory/remote-repos/</url>-->
-            <!--<url>http://swamp.jfrog.org:8081/artifactory/remote-repos/</url>-->
-            <url>http://repo.jfrog.org/artifactory/remote-repos</url>
-            <!--<offline>true</offline>-->
-        </remoteRepository>
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <virtualRepository>
-            <key>libs-releases</key>
-            <repositories>
-                <repositoryRef>libs-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repo</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-releases</key>
-            <repositories>
-                <repositoryRef>plugins-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repo</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshots</key>
-            <repositories>
-                <repositoryRef>libs-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repo</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshots</key>
-            <repositories>
-                <repositoryRef>plugins-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repo</repositoryRef>
-            </repositories>
-        </virtualRepository>
-    </virtualRepositories>
-
-</config>
diff --git a/base/config/src/test/resources/config/test/config.1.3.2.xml b/base/config/src/test/resources/config/test/config.1.3.2.xml
deleted file mode 100644
index 58d0095..0000000
--- a/base/config/src/test/resources/config/test/config.1.3.2.xml
+++ /dev/null
@@ -1,311 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.3.2"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.3.2
-        http://www.jfrog.org/xsd/artifactory-v1_3_2.xsd">
-    <!--
-    enable/disable anonymous downloads
-    -->
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-        <ldapSettings>
-            <ldapUrl>ldap://mydomain:389/dc=jfrog,dc=org</ldapUrl>
-            <authenticationPatterns>
-                <authenticationPattern>
-                    <userDnPattern>uid={0}, ou=People</userDnPattern>
-                </authenticationPattern>
-                <authenticationPattern>
-                    <userDnPattern>uid={0}, ou=Developers</userDnPattern>
-                </authenticationPattern>
-                <authenticationPattern>
-                    <searchFilter>uid</searchFilter>
-                    <searchBase>ou=Mice</searchBase>
-                    <searchSubTree>false</searchSubTree>
-                </authenticationPattern>
-            </authenticationPatterns>
-            <managerDn>koko</managerDn>
-            <managerPassword>loko</managerPassword>
-        </ldapSettings>
-    </security>
-    <backups>
-        <backup>
-            <!-- converter should add a key -->
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <retentionPeriodHours>168</retentionPeriodHours>
-            <excludedRepositories>
-                <repositoryRef>repo1</repositoryRef>
-                <repositoryRef>codehaus-snapshots</repositoryRef>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-            </excludedRepositories>
-        </backup>
-        <backup>
-            <!-- backup without cron expression should be removed -->
-            <retentionPeriodHours>168</retentionPeriodHours>
-            <excludedRepositories>
-                <repositoryRef>repo1</repositoryRef>
-            </excludedRepositories>
-        </backup>
-    </backups>
-    <!-- The cron definition to control the activation of the m2 eclipse indexer. Default every full hour. -->
-    <!--
-    <indexer>
-        <cronExp>0 /1 * * * ?</cronExp>
-    </indexer>
-    -->
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases-local</key>
-            <description>Local repository for plugins</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-releases-local</key>
-            <description>Local repository for third party libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshots-local</key>
-            <description>Local repository for third party snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-
-        <!--
-        A sample local repository with all possible settings
-        -->
-        <!--
-        <localRepository>
-            <key>local-sample</key>
-            <description>Sample local repository</description>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            -->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--
-        <maxUniqueSnapshots>3</maxUniqueSnapshots>
-        <includesPattern>*/**</includesPattern>
-        <excludesPattern>com/mycompany/**</excludesPattern>
-        -->
-        <!--
-        centrally control unique snapshots behavior (non-unique|unique|deployer)
-        -->
-        <!--
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-        </localRepository>
-        -->
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://repo1.maven.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus-snapshots</key>
-            <blackedOut>true</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://snapshots.repository.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m2</key>
-            <description>java.net Maven2 Format</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://download.java.net/maven/2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m1</key>
-            <description>java.net Maven1 Format</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <type>maven1</type>
-            <url>http://download.java.net/maven/1</url>
-        </remoteRepository>
-        <!--
-        <remoteRepository>
-            <key>codehaus</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://dist.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>ibiblio</key>
-            <excludesPattern>org/artifactory/**</excludesPattern>
-            <url>http://www.ibiblio.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>apache-m2-snapshots</key>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://people.apache.org/repo/m2-snapshot-repository</url>
-            <proxyRef>unused-proxy</proxyRef>
-        </remoteRepository>
-        -->
-
-        <!-- A sample remote repository with all possible tunings -->
-        <!--
-        <remoteRepository>
-        <key>remote-sample</key>
-        <description>Sample remote repository</description>
-        -->
-        <!--
-        blok the usage of this repository
-        -->
-        <!--<blackedOut>false</blackedOut>-->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--<maxUniqueSnapshots>3</maxUniqueSnapshots>-->
-        <!--<includesPattern>*/**</includesPattern>-->
-        <!--<excludesPattern>com/mycompany/**</excludesPattern>-->
-        <!--<url>http://maven.repo/repository</url>-->
-        <!--
-        put offline to use only the cache and not send remote requests
-        -->
-        <!--<offline>false</offline>-->
-        <!--<hardFail>true</hardFail>-->
-        <!--
-        cache remotely retrieved artifacts (you'd want 'true')
-        -->
-        <!--<storeArtifactsLocally>true</storeArtifactsLocally>-->
-        <!--
-        number of seconds to cache artifact lookup results
-        -->
-        <!--<retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to cache artifact retrieval failures (normally communication errors)
-        -->
-        <!--<failedRetrievalCachePeriodSecs>30</failedRetrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to remember artifact retrieval misses (artifact not found)
-        -->
-        <!--<missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>-->
-        <!--
-        ttp authentication details
-        -->
-        <!--<username>un</username>-->
-        <!--<password>pw</password>-->
-        <!--
-        network timeout for both connection establishment failures and unanswered requests
-        -->
-        <!--<socketTimeoutMillis>2000</socketTimeoutMillis>-->
-        <!--
-        proxy reference
-        -->
-        <!--<proxyRef>unused-proxy</proxyRef>-->
-        <!--</remoteRepository>-->
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <!-- This repositoy will be available at the url:
-        http://<host>:<port>/artifactory/snapshots-only/
-        (note the trailing slash!)
-        -->
-        <virtualRepository>
-            <key>remote-repos</key>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-releases</key>
-            <repositories>
-                <repositoryRef>libs-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-releases</key>
-            <repositories>
-                <repositoryRef>plugins-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshots</key>
-            <repositories>
-                <repositoryRef>libs-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-                <repositoryRef>codehaus-snapshots</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshots</key>
-            <repositories>
-                <repositoryRef>plugins-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-                <repositoryRef>codehaus-snapshots</repositoryRef>
-            </repositories>
-        </virtualRepository>
-    </virtualRepositories>
-
-    <!--
-        <proxies>
-            <proxy>
-                <key>unused-proxy</key>
-                <host>host</host>
-                <port>8080</port>
-                <username>un</username>
-                <password>pw</password>
-                <domain>mydomain</domain>
-            </proxy>
-        </proxies>
-    -->
-
-</config>
diff --git a/base/config/src/test/resources/config/test/config.1.3.2_no-location.xml b/base/config/src/test/resources/config/test/config.1.3.2_no-location.xml
deleted file mode 100644
index d792237..0000000
--- a/base/config/src/test/resources/config/test/config.1.3.2_no-location.xml
+++ /dev/null
@@ -1,180 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns="http://artifactory.jfrog.org/xsd/1.3.2">
-    <serverName>tadpole.jfrog.org</serverName>
-
-    <fileUploadMaxSizeMb>100</fileUploadMaxSizeMb>
-    <dateFormat>dd-MM-yy HH:mm:ssZ</dateFormat>
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-    </security>
-    <backups>
-        <backup>
-            <dir>/opt/artifactory/current/backup</dir>
-            <cronExp>0 0 2 * * ?</cronExp>
-            <retentionPeriodHours>48</retentionPeriodHours>
-            <excludedRepositories>
-                <repositoryRef>repo1</repositoryRef>
-                <repositoryRef>codehaus-snapshots</repositoryRef>
-                <!-- keep java.net repo jars never know and small
-                <repositoryRef>java.net</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                -->
-            </excludedRepositories>
-        </backup>
-    </backups>
-
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local Repository for Applications Releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-local</key>
-            <description>Local Repository for Applications Snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases-local</key>
-            <description>Local Repository for Plugins Releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-local</key>
-            <description>Local Repository for Plugins Snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>third-party-releases-local</key>
-            <description>Local Repository for third party libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>third-party-snapshots-local</key>
-            <description>Local Repository for third party snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-    </localRepositories>
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://repo1.maven.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus-snapshots</key>
-            <blackedOut>true</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://snapshots.repository.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net</key>
-            <description>java.net</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://download.java.net/maven/2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m1</key>
-            <description>java.net Maven1 format</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <type>maven1</type>
-            <url>http://download.java.net/maven/1</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>nexus-indexer</key>
-            <description>The nexus repo for the m2eclipse indexer</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <includesPattern>org/sonatype/**</includesPattern>
-            <url>http://repository.sonatype.org:8081/nexus/content/repositories/releases</url>
-        </remoteRepository>
-    </remoteRepositories>
-    <virtualRepositories>
-        <virtualRepository>
-            <key>remote-repos</key>
-            <repositories>
-                <repositoryRef>nexus-indexer</repositoryRef>
-                <repositoryRef>java.net</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>third-party-releases</key>
-            <repositories>
-                <repositoryRef>third-party-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-releases</key>
-            <repositories>
-                <repositoryRef>plugins-releases-local</repositoryRef>
-                <repositoryRef>third-party-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>third-party-snapshots</key>
-            <repositories>
-                <repositoryRef>third-party-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshots</key>
-            <repositories>
-                <repositoryRef>plugins-snapshots-local</repositoryRef>
-                <repositoryRef>third-party-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshots</key>
-            <repositories>
-                <repositoryRef>libs-snapshots-local</repositoryRef>
-                <repositoryRef>third-party-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-releases</key>
-            <repositories>
-                <repositoryRef>libs-releases-local</repositoryRef>
-                <repositoryRef>third-party-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-    </virtualRepositories>
-</config>
diff --git a/base/config/src/test/resources/config/test/config.1.3.5_proxy-with-domain.xml b/base/config/src/test/resources/config/test/config.1.3.5_proxy-with-domain.xml
deleted file mode 100644
index 56d9280..0000000
--- a/base/config/src/test/resources/config/test/config.1.3.5_proxy-with-domain.xml
+++ /dev/null
@@ -1,311 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.3.5"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.3.5
-        http://www.jfrog.org/xsd/artifactory-v1_3_5.xsd">
-    <!--
-    enable/disable anonymous downloads
-    -->
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-        <!--<ldapSettings>
-            <ldapSetting>
-                <key>ldap1</key>
-                <enabled>true</enabled>
-                <ldapUrl>ldap://mydomain:389/dc=mycompany,dc=com</ldapUrl>
-                <userDnPattern>uid={0}, ou=People</userDnPattern>
-            </ldapSetting>
-        </ldapSettings>-->
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <!--
-            alternative backup dir
-            -->
-            <!--<dir></dir>-->
-            <!--
-            backup every 12 hours
-            -->
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <!--
-            keep backups for a week.
-            Set to 0 in order to always backup to a "current" dir (useful for incremental FS backups).
-            -->
-            <retentionPeriodHours>168</retentionPeriodHours>
-            <!--
-            exclude certain repositories from being backed up
-            -->
-            <excludedRepositories>
-                <repositoryRef>repo1</repositoryRef>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                <repositoryRef>codehaus</repositoryRef>
-            </excludedRepositories>
-        </backup>
-    </backups>
-    <!-- The cron definition to control the activation of the m2eclipse indexer. -->
-    <indexer>
-        <!-- By Default index every 5 hours -->
-        <cronExp>0 0 /5 * * ?</cronExp>
-    </indexer>
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases-local</key>
-            <description>Local repository for plugins</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-releases-local</key>
-            <description>Local repository for third party libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshots-local</key>
-            <description>Local repository for third party snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-
-        <!--
-        A sample local repository with all possible settings
-        -->
-        <!--
-        <localRepository>
-            <key>local-sample</key>
-            <description>Sample local repository</description>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            -->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--
-        <maxUniqueSnapshots>3</maxUniqueSnapshots>
-        <includesPattern>*/**</includesPattern>
-        <excludesPattern>com/mycompany/**</excludesPattern>
-        -->
-        <!--
-        centrally control unique snapshots behavior (non-unique|unique|deployer)
-        -->
-        <!--
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-        </localRepository>
-        -->
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://repo1.maven.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m2</key>
-            <description>java.net Maven2 Format</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://download.java.net/maven/2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m1</key>
-            <description>java.net Maven1 Format</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <type>maven1</type>
-            <url>http://download.java.net/maven/1</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://repository.codehaus.org</url>
-        </remoteRepository>
-        <!--
-        <remoteRepository>
-            <key>codehaus</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://dist.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>ibiblio</key>
-            <excludesPattern>org/artifactory/**</excludesPattern>
-            <url>http://www.ibiblio.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>apache-m2-snapshots</key>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://people.apache.org/repo/m2-snapshot-repository</url>
-            <proxyRef>unused-proxy</proxyRef>
-        </remoteRepository>
-        -->
-
-        <!-- A sample remote repository with all possible tunings -->
-        <!--
-        <remoteRepository>
-        <key>remote-sample</key>
-        <description>Sample remote repository</description>
-        -->
-        <!--
-        blok the usage of this repository
-        -->
-        <!--<blackedOut>false</blackedOut>-->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--<maxUniqueSnapshots>3</maxUniqueSnapshots>-->
-        <!--<includesPattern>*/**</includesPattern>-->
-        <!--<excludesPattern>com/mycompany/**</excludesPattern>-->
-        <!--<url>http://maven.repo/repository</url>-->
-        <!--
-        put offline to use only the cache and not send remote requests
-        -->
-        <!--<offline>false</offline>-->
-        <!--<hardFail>true</hardFail>-->
-        <!--
-        cache remotely retrieved artifacts (you'd want 'true')
-        -->
-        <!--<storeArtifactsLocally>true</storeArtifactsLocally>-->
-        <!--
-        number of seconds to cache artifact lookup results
-        -->
-        <!--<retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to cache artifact retrieval failures (normally communication errors)
-        -->
-        <!--<failedRetrievalCachePeriodSecs>30</failedRetrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to remember artifact retrieval misses (artifact not found)
-        -->
-        <!--<missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>-->
-        <!--
-        ttp authentication details
-        -->
-        <!--<username>un</username>-->
-        <!--<password>pw</password>-->
-        <!--
-        network timeout for both connection establishment failures and unanswered requests
-        -->
-        <!--<socketTimeoutMillis>2000</socketTimeoutMillis>-->
-        <!--
-        proxy reference
-        -->
-        <!--<proxyRef>unused-proxy</proxyRef>-->
-        <!--</remoteRepository>-->
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <!-- This repositoy will be available at the url:
-        http://<host>:<port>/artifactory/snapshots-only/
-        (note the trailing slash!)
-        -->
-        <virtualRepository>
-            <key>remote-repos</key>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-releases</key>
-            <repositories>
-                <repositoryRef>libs-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-releases</key>
-            <repositories>
-                <repositoryRef>plugins-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshots</key>
-            <repositories>
-                <repositoryRef>libs-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshots</key>
-            <repositories>
-                <repositoryRef>plugins-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-    </virtualRepositories>
-
-    <proxies>
-        <!-- one without domain -->
-        <proxy>
-            <key>proxy</key>
-            <host>host</host>
-            <port>8080</port>
-            <username>un</username>
-            <password>pw</password>
-        </proxy>
-        <!-- and one with domain -->
-        <proxy>
-            <key>nt-proxy</key>
-            <host>host</host>
-            <port>8080</port>
-            <username>un</username>
-            <password>pw</password>
-            <domain>mydomain</domain>
-        </proxy>
-    </proxies>
-
-</config>
diff --git a/base/config/src/test/resources/config/test/config.1.4.0_default-proxy.xml b/base/config/src/test/resources/config/test/config.1.4.0_default-proxy.xml
deleted file mode 100644
index f9b49cd..0000000
--- a/base/config/src/test/resources/config/test/config.1.4.0_default-proxy.xml
+++ /dev/null
@@ -1,195 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns="http://artifactory.jfrog.org/xsd/1.4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.4.0 http://www.jfrog.org/xsd/artifactory-v1_4_0.xsd">
-
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <enabled>false</enabled>
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <retentionPeriodHours>0</retentionPeriodHours>
-            <excludedRepositories>
-                <repositoryRef>remote-repo</repositoryRef>
-            </excludedRepositories>
-        </backup>
-    </backups>
-    <!-- The interval at which to activate the m2eclipse indexer. -->
-    <!--
-    <indexer>
-        <indexingIntervalHours>24</indexingIntervalHours>
-    </indexer>
-    -->
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases-local</key>
-            <description>Local repository for plugins</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-releases-local</key>
-            <description>Local repository for third party libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshots-local</key>
-            <description>Local repository for third party snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>UNIQUE</key>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>5</maxUniqueSnapshots>
-            <includesPattern>**/*</includesPattern>
-            <snapshotVersionBehavior>unique</snapshotVersionBehavior>
-        </localRepository>
-        <localRepository>
-            <key>NONUNIQUE</key>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <includesPattern>**/*</includesPattern>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-        </localRepository>
-        <localRepository>
-            <key>DEPLOYER</key>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>5</maxUniqueSnapshots>
-            <includesPattern>**/*</includesPattern>
-            <snapshotVersionBehavior>deployer</snapshotVersionBehavior>
-        </localRepository>
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>remote-repo</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://repo.jfrog.org/artifactory/remote-repos</url>
-            <proxyRef>proxy1</proxyRef>
-            <!--<url>http://repo1.maven.org/maven2</url>-->
-        </remoteRepository>
-        <remoteRepository>
-            <key>remote-repo2</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://repo.jfrog.org/artifactory/remote-repos</url>
-            <proxyRef>proxy1</proxyRef>
-            <!--<url>http://repo1.maven.org/maven2</url>-->
-        </remoteRepository>
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <!-- This repositoy will be available at the url:
-        http://<host>:<port>/artifactory/snapshots-only/
-        (note the trailing slash!)
-        -->
-        <virtualRepository>
-            <key>remote-repos</key>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>remote-repo</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-releases</key>
-            <repositories>
-                <repositoryRef>libs-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>UNIQUE</repositoryRef>
-                <repositoryRef>NONUNIQUE</repositoryRef>
-                <repositoryRef>DEPLOYER</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-releases</key>
-            <repositories>
-                <repositoryRef>plugins-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshots</key>
-            <repositories>
-                <repositoryRef>libs-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>UNIQUE</repositoryRef>
-                <repositoryRef>NONUNIQUE</repositoryRef>
-                <repositoryRef>DEPLOYER</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshots</key>
-            <repositories>
-                <repositoryRef>plugins-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-    </virtualRepositories>
-
-    <proxies>
-        <proxy>
-            <key>proxy1</key>
-            <host>www.jfrog.org</host>
-            <port>80</port>
-        </proxy>
-        <proxy>
-            <key>proxy2</key>
-            <host>www.artifactoryonline.com</host>
-            <port>80</port>
-        </proxy>
-    </proxies>
-
-</config>
diff --git a/base/config/src/test/resources/config/test/config.1.4.12_failed_retrieval_cache.xml b/base/config/src/test/resources/config/test/config.1.4.12_failed_retrieval_cache.xml
deleted file mode 100644
index 6a071a5..0000000
--- a/base/config/src/test/resources/config/test/config.1.4.12_failed_retrieval_cache.xml
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.4.12"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.4.12
-        http://www.jfrog.org/xsd/artifactory-v1_4_12.xsd">
-
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-    </security>
-
-    <localRepositories>
-        <localRepository>
-            <key>libs-release-local</key>
-            <description>Local repository for in-house libraries</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <description>Central Maven 2 repository</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo1.maven.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m2</key>
-            <description>java.net Maven2 Format</description>
-            <excludesPattern>commons-*,org/apache/**</excludesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://download.java.net/maven/2</url>
-            <failedRetrievalCachePeriodSecs>45</failedRetrievalCachePeriodSecs>
-        </remoteRepository>
-    </remoteRepositories>
-
-    <repoLayouts>
-        <repoLayout>
-            <name>maven-2-default</name>
-            <artifactPathPattern>
-                [orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]
-            </artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>
-                [orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).pom
-            </descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>SNAPSHOT</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>ivy-default</name>
-            <artifactPathPattern>
-                [org]/[module]/[baseRev](-[folderItegRev])/[type]s/[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]
-            </artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>
-                [org]/[module]/[baseRev](-[folderItegRev])/[type]s/ivy-[baseRev](-[fileItegRev]).xml
-            </descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>gradle-default</name>
-            <artifactPathPattern>
-                [org]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]
-            </artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>maven-1-default</name>
-            <artifactPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]
-            </artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.+</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.+</fileIntegrationRevisionRegExp>
-        </repoLayout>
-    </repoLayouts>
-    <gcConfig>
-        <cronExp>0 0 /4 * * ?</cronExp>
-    </gcConfig>
-</config>
diff --git a/base/config/src/test/resources/config/test/config.1.4.13_with_archive_browsing.xml b/base/config/src/test/resources/config/test/config.1.4.13_with_archive_browsing.xml
deleted file mode 100644
index 6b097a1..0000000
--- a/base/config/src/test/resources/config/test/config.1.4.13_with_archive_browsing.xml
+++ /dev/null
@@ -1,439 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.4.12"
-        >
-    <!--
-    enable/disable anonymous downloads
-    -->
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-        <!--<ldapSettings>
-            <ldapSetting>
-                <key>ldap1</key>
-                <enabled>true</enabled>
-                <ldapUrl>ldap://mydomain:389/dc=mycompany,dc=com</ldapUrl>
-                <userDnPattern>uid={0}, ou=People</userDnPattern>
-            </ldapSetting>
-        </ldapSettings>-->
-        <archiveBrowsingEnabled>true</archiveBrowsingEnabled>
-    </security>
-    <backups>
-        <backup>
-            <key>backup-daily</key>
-            <!--
-            backup Monday to Friday at 2:00 AM
-            -->
-            <cronExp>0 0 2 ? * MON-FRI</cronExp>
-            <!--
-            Always backup to a "current" dir (incremental backups)
-            -->
-            <retentionPeriodHours>0</retentionPeriodHours>
-            <!--
-            exclude certain repositories from being backed up
-            -->
-            <excludedRepositories>
-                <repositoryRef>repo1</repositoryRef>
-            </excludedRepositories>
-        </backup>
-        <backup>
-            <key>backup-weekly</key>
-            <!--
-            backup on Saturday at 2:00 AM
-            -->
-            <cronExp>0 0 2 ? * SAT</cronExp>
-            <!--
-            keep backups for 2 weeks.
-            -->
-            <retentionPeriodHours>336</retentionPeriodHours>
-            <!--
-            exclude certain repositories from being backed up
-            -->
-            <excludedRepositories>
-                <repositoryRef>repo1</repositoryRef>
-            </excludedRepositories>
-        </backup>
-    </backups>
-
-    <!-- The interval at which to activate the maven indexer. -->
-    <indexer>
-        <!-- By Default index once a day at 05:23AM -->
-        <cronExp>0 23 5 * * ?</cronExp>
-    </indexer>
-
-    <localRepositories>
-        <localRepository>
-            <key>libs-release-local</key>
-            <description>Local repository for in-house libraries</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshot-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-release-local</key>
-            <description>Local repository for plugins</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshot-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-release-local</key>
-            <description>Local repository for third party libraries</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshot-local</key>
-            <description>Local repository for third party snapshots</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-
-        <!--
-        A sample local repository with all possible settings
-        -->
-        <!--
-        <localRepository>
-            <key>local-sample</key>
-            <description>Sample local repository</description>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            -->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--
-        <maxUniqueSnapshots>3</maxUniqueSnapshots>
-        <includesPattern>*/**</includesPattern>
-        <excludesPattern>com/mycompany/**</excludesPattern>
-        -->
-        <!--
-        centrally control unique snapshots behavior (non-unique|unique|deployer)
-        -->
-        <!--
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-        </localRepository>
-        -->
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <description>Central Maven 2 repository</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo1.maven.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m2</key>
-            <description>java.net Maven2 Format</description>
-            <excludesPattern>commons-*,org/apache/**</excludesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://download.java.net/maven/2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m1</key>
-            <description>java.net Maven1 Format</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://download.java.net/maven/1</url>
-            <remoteRepoLayoutRef>maven-1-default</remoteRepoLayoutRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-libs</key>
-            <description>JFrog libraries releases</description>
-            <excludesPattern>org/apache/maven/**</excludesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo.jfrog.org/artifactory/libs-releases-local</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-plugins</key>
-            <description>JFrog plugins releases</description>
-            <includesPattern>org/jfrog/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo.jfrog.org/artifactory/plugins-releases-local</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jboss</key>
-            <description>JBoss Maven2 releases</description>
-            <includesPattern>org/jboss/**,org/hibernate/**,org/richfaces/**,org/drools/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repository.jboss.org/nexus/content/groups/public-jboss</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus</key>
-            <description>Codehaus Maven2 releases</description>
-            <includesPattern>org/**,com/**,net/**</includesPattern>
-            <excludesPattern>org/apache/**,commons-*,org/artifactory/**,org/jfrog/**</excludesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repository.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-milestone</key>
-            <description>SpringSource in milestone version</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://maven.springframework.org/milestone</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-release</key>
-            <description>SpringSource releases</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://maven.springframework.org/release</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>google-code</key>
-            <description>Google's open source releases</description>
-            <includesPattern>com/google/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://google-maven-repository.googlecode.com/svn/repository</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>gradle-libs</key>
-            <description>Gradle libraries</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://gradle.artifactoryonline.com/gradle/libs</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>gradle-plugins</key>
-            <description>Gradle plugins</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://gradle.artifactoryonline.com/gradle/plugins</url>
-        </remoteRepository>
-
-        <!-- A sample remote repository with all possible tunings -->
-        <!--
-        <remoteRepository>
-        <key>remote-sample</key>
-        <description>Sample remote repository</description>
-        -->
-        <!--
-        blok the usage of this repository
-        -->
-        <!--<blackedOut>false</blackedOut>-->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--<maxUniqueSnapshots>3</maxUniqueSnapshots>-->
-        <!--<includesPattern>*/**</includesPattern>-->
-        <!--<excludesPattern>com/mycompany/**</excludesPattern>-->
-        <!--<url>http://maven.repo/repository</url>-->
-        <!--
-        put offline to use only the cache and not send remote requests
-        -->
-        <!--<offline>false</offline>-->
-        <!--<hardFail>true</hardFail>-->
-        <!--
-        cache remotely retrieved artifacts (you'd want 'true')
-        -->
-        <!--<storeArtifactsLocally>true</storeArtifactsLocally>-->
-        <!--
-        number of seconds to cache artifact lookup results
-        -->
-        <!--<retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to cache artifact retrieval failures (normally communication errors)
-        -->
-        <!--<failedRetrievalCachePeriodSecs>30</failedRetrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to remember artifact retrieval misses (artifact not found)
-        -->
-        <!--<missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>-->
-        <!--
-        ttp authentication details
-        -->
-        <!--<username>un</username>-->
-        <!--<password>pw</password>-->
-        <!--
-        network timeout for both connection establishment failures and unanswered requests
-        -->
-        <!--<socketTimeoutMillis>2000</socketTimeoutMillis>-->
-        <!--
-        proxy reference
-        -->
-        <!--<proxyRef>unused-proxy</proxyRef>-->
-        <!--</remoteRepository>-->
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <!-- This repository will be available at the url:
-        http://<host>:<port>/artifactory/snapshots-only/
-        (note the trailing slash!)
-        -->
-        <virtualRepository>
-            <key>remote-repos</key>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>codehaus</repositoryRef>
-                <repositoryRef>jboss</repositoryRef>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-                <repositoryRef>jfrog-libs</repositoryRef>
-                <repositoryRef>jfrog-plugins</repositoryRef>
-                <repositoryRef>spring-milestone</repositoryRef>
-                <repositoryRef>spring-release</repositoryRef>
-                <repositoryRef>google-code</repositoryRef>
-                <repositoryRef>gradle-libs</repositoryRef>
-                <repositoryRef>gradle-plugins</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-release</key>
-            <repositories>
-                <repositoryRef>libs-release-local</repositoryRef>
-                <repositoryRef>ext-release-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-release</key>
-            <repositories>
-                <repositoryRef>plugins-release-local</repositoryRef>
-                <repositoryRef>ext-release-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshot</key>
-            <repositories>
-                <repositoryRef>libs-snapshot-local</repositoryRef>
-                <repositoryRef>ext-snapshot-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshot</key>
-            <repositories>
-                <repositoryRef>plugins-snapshot-local</repositoryRef>
-                <repositoryRef>ext-snapshot-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-    </virtualRepositories>
-
-    <!--
-        <proxies>
-            <proxy>
-                <key>unused-proxy</key>
-                <host>host</host>
-                <port>8080</port>
-                <username>un</username>
-                <password>pw</password>
-                <domain>mydomain</domain>
-            </proxy>
-        </proxies>
-    -->
-
-    <repoLayouts>
-        <repoLayout>
-            <name>maven-2-default</name>
-            <artifactPathPattern>
-                [orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]
-            </artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>
-                [orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).pom
-            </descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>SNAPSHOT</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>ivy-default</name>
-            <artifactPathPattern>
-                [org]/[module]/[baseRev](-[folderItegRev])/[type]s/[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]
-            </artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>
-                [org]/[module]/[baseRev](-[folderItegRev])/[type]s/ivy-[baseRev](-[fileItegRev]).xml
-            </descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>gradle-default</name>
-            <artifactPathPattern>
-                [org]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]
-            </artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>maven-1-default</name>
-            <artifactPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]
-            </artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.+</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.+</fileIntegrationRevisionRegExp>
-        </repoLayout>
-    </repoLayouts>
-    <gcConfig>
-        <cronExp>0 0 /4 * * ?</cronExp>
-    </gcConfig>
-</config>
diff --git a/base/config/src/test/resources/config/test/config.1.4.1_with_type.xml b/base/config/src/test/resources/config/test/config.1.4.1_with_type.xml
deleted file mode 100644
index f637ebe..0000000
--- a/base/config/src/test/resources/config/test/config.1.4.1_with_type.xml
+++ /dev/null
@@ -1,238 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.4.1"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.4.1
-        http://www.jfrog.org/xsd/artifactory-v1_4_1.xsd">
-    <!--
-    enable/disable anonymous downloads
-    -->
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-        <!--<ldapSettings>
-            <ldapSetting>
-                <key>ldap1</key>
-                <enabled>true</enabled>
-                <ldapUrl>ldap://mydomain:389/dc=mycompany,dc=com</ldapUrl>
-                <userDnPattern>uid={0}, ou=People</userDnPattern>
-            </ldapSetting>
-        </ldapSettings>-->
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <!--
-            alternative backup dir
-            -->
-            <!--<dir></dir>-->
-            <!--
-            backup every 12 hours
-            -->
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <!--
-            keep backups for a week.
-            Set to 0 in order to always backup to a "current" dir (useful for incremental FS backups).
-            -->
-            <retentionPeriodHours>168</retentionPeriodHours>
-            <!--
-            exclude certain repositories from being backed up
-            -->
-        </backup>
-    </backups>
-    <!-- The interval at which to activate the m2eclipse indexer. -->
-    <indexer>
-        <!-- By Default index every 24 hours -->
-        <indexingIntervalHours>24</indexingIntervalHours>
-    </indexer>
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <includesPattern>org/jfrog/**</includesPattern>
-        </localRepository>
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>java.net.m2</key>
-            <description>java.net Maven2 Format</description>
-            <type>maven2</type>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>commons-*,org/apache/**</excludesPattern>
-            <url>http://download.java.net/maven/2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m1</key>
-            <type>maven1</type>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://download.java.net/maven/1</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-libs</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/apache/maven/**</excludesPattern>
-            <url>http://repo.jfrog.org/artifactory/libs-releases-local</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-plugins</key>
-            <description>JFrog plugins releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <includesPattern>org/jfrog/**</includesPattern>
-            <url>http://repo.jfrog.org/artifactory/plugins-releases-local</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jboss</key>
-            <description>JBoss Maven2 releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <includesPattern>org/jboss/**,org/hibernate/**,org/richfaces/**,org/drools/**</includesPattern>
-            <url>http://repository.jboss.com/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus</key>
-            <description>Codehaus Maven2 releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <includesPattern>org/**,com/**,net/**</includesPattern>
-            <excludesPattern>org/apache/**,commons-*,org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://repository.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-bundles-milestone</key>
-            <description>SpringSource bundles in milestone version</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <includesPattern>org/springframework/**</includesPattern>
-            <url>http://repository.springsource.com/maven/bundles/milestone</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-bundles-snapshots</key>
-            <description>SpringSource bundles in snapshot stage</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <includesPattern>org/springframework/**</includesPattern>
-            <url>http://repository.springsource.com/maven/bundles/snapshot</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-bundles</key>
-            <description>SpringSource bundles releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <includesPattern>org/springframework/**</includesPattern>
-            <url>http://repository.springsource.com/maven/bundles/release</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-bundles-external</key>
-            <description>External artifacts needed by SpringSource bundles</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <includesPattern>**/com.springsource*/**</includesPattern>
-            <url>http://repository.springsource.com/maven/bundles/external</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>open-qa</key>
-            <description>OpenQA (Selenium) releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <includesPattern>org/openqa/**,org/seleniumhq/**</includesPattern>
-            <url>http://nexus.openqa.org/content/repositories/releases</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>terracotta</key>
-            <description>Terracotta releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <includesPattern>org/terracotta/**,net/sf/ehcache/**</includesPattern>
-            <url>http://repo.terracotta.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>google-code</key>
-            <description>Google's open source releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <includesPattern>com/google/**</includesPattern>
-            <url>http://google-maven-repository.googlecode.com/svn/repository</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>scala-tools</key>
-            <description>Scala-Tools.org releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <includesPattern>org/scala*/**</includesPattern>
-            <url>http://scala-tools.org/repo</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>atlassian</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <includesPattern>atlassian*/**,seraph/**,com/atlassian/**,com/adaptavist/**</includesPattern>
-            <url>http://maven.atlassian.com/repository/public</url>
-        </remoteRepository>
-
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <virtualRepository>
-            <key>remote-repos</key>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>codehaus</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-releases</key>
-            <repositories>
-                <repositoryRef>libs-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-releases</key>
-            <repositories>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshots</key>
-            <repositories>
-                <repositoryRef>libs-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshots</key>
-            <repositories>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-    </virtualRepositories>
-</config>
diff --git a/base/config/src/test/resources/config/test/config.1.4.2_with_checksum_policy.xml b/base/config/src/test/resources/config/test/config.1.4.2_with_checksum_policy.xml
deleted file mode 100644
index 3ca4259..0000000
--- a/base/config/src/test/resources/config/test/config.1.4.2_with_checksum_policy.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.4.2"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.4.2
-        http://www.jfrog.org/xsd/artifactory-v1_4_2.xsd">
-    <!--
-    enable/disable anonymous downloads
-    -->
-    <!-- The interval at which to activate the m2eclipse indexer. -->
-    <indexer>
-        <!-- By Default index every 24 hours -->
-        <indexingIntervalHours>24</indexingIntervalHours>
-    </indexer>
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <description>Central Maven 2 repository</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo1.maven.org/maven2</url>
-            <checksumPolicyType>generate-if-absent</checksumPolicyType>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m2</key>
-            <description>java.net Maven2 Format</description>
-            <excludesPattern>commons-*,org/apache/**</excludesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://download.java.net/maven/2</url>
-        </remoteRepository>
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <virtualRepository>
-            <key>plugins-snapshots</key>
-            <repositories>
-                <repositoryRef>repo1</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-    </virtualRepositories>
-</config>
diff --git a/base/config/src/test/resources/config/test/config.1.4.3_with_serverId.xml b/base/config/src/test/resources/config/test/config.1.4.3_with_serverId.xml
deleted file mode 100644
index b5f39db..0000000
--- a/base/config/src/test/resources/config/test/config.1.4.3_with_serverId.xml
+++ /dev/null
@@ -1,348 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.4.3"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.4.3
-        http://www.jfrog.org/xsd/artifactory-v1_4_3.xsd">
-    <addons>
-        <serverId>JDKSJD</serverId>
-        <showAddonsInfo>true</showAddonsInfo>
-    </addons>
-    <!--
-    enable/disable anonymous downloads
-    -->
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <!--
-            alternative backup dir
-            -->
-            <!--<dir></dir>-->
-            <!--
-            backup every 12 hours
-            -->
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <!--
-            keep backups for a week.
-            Set to 0 in order to always backup to a "current" dir (useful for incremental FS backups).
-            -->
-            <retentionPeriodHours>168</retentionPeriodHours>
-            <!--
-            exclude certain repositories from being backed up
-            -->
-            <excludedRepositories>
-                <repositoryRef>repo1</repositoryRef>
-            </excludedRepositories>
-        </backup>
-    </backups>
-    <!-- The interval at which to activate the m2eclipse indexer. -->
-    <indexer>
-        <!-- By Default index every 24 hours -->
-        <indexingIntervalHours>24</indexingIntervalHours>
-    </indexer>
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases-local</key>
-            <description>Local repository for plugins</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-releases-local</key>
-            <description>Local repository for third party libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshots-local</key>
-            <description>Local repository for third party snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-
-        <!--
-        A sample local repository with all possible settings
-        -->
-        <!--
-        <localRepository>
-            <key>local-sample</key>
-            <description>Sample local repository</description>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            -->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--
-        <maxUniqueSnapshots>3</maxUniqueSnapshots>
-        <includesPattern>*/**</includesPattern>
-        <excludesPattern>com/mycompany/**</excludesPattern>
-        -->
-        <!--
-        centrally control unique snapshots behavior (non-unique|unique|deployer)
-        -->
-        <!--
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-        </localRepository>
-        -->
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <description>Central Maven 2 repository</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo1.maven.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m2</key>
-            <description>java.net Maven2 Format</description>
-            <excludesPattern>commons-*,org/apache/**</excludesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://download.java.net/maven/2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m1</key>
-            <description>java.net Maven1 Format</description>
-            <type>maven1</type>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://download.java.net/maven/1</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-libs</key>
-            <description>JFrog libraries releases</description>
-            <excludesPattern>org/apache/maven/**</excludesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo.jfrog.org/artifactory/libs-releases-local</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-plugins</key>
-            <description>JFrog plugins releases</description>
-            <includesPattern>org/jfrog/**</includesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo.jfrog.org/artifactory/plugins-releases-local</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jboss</key>
-            <description>JBoss Maven2 releases</description>
-            <includesPattern>org/jboss/**,org/hibernate/**,org/richfaces/**,org/drools/**</includesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repository.jboss.com/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus</key>
-            <description>Codehaus Maven2 releases</description>
-            <includesPattern>org/**,com/**,net/**</includesPattern>
-            <excludesPattern>org/apache/**,commons-*,org/artifactory/**,org/jfrog/**</excludesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repository.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-milestone</key>
-            <description>SpringSource in milestone version</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://maven.springframework.org/milestone</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-snapshots</key>
-            <description>SpringSource in snapshot stage</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://maven.springframework.org/snapshot</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-release</key>
-            <description>SpringSource releases</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://maven.springframework.org/release</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>google-code</key>
-            <description>Google's open source releases</description>
-            <includesPattern>com/google/**</includesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://google-maven-repository.googlecode.com/svn/repository</url>
-        </remoteRepository>
-
-
-        <!-- A sample remote repository with all possible tunings -->
-        <!--
-        <remoteRepository>
-        <key>remote-sample</key>
-        <description>Sample remote repository</description>
-        -->
-        <!--
-        blok the usage of this repository
-        -->
-        <!--<blackedOut>false</blackedOut>-->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--<maxUniqueSnapshots>3</maxUniqueSnapshots>-->
-        <!--<includesPattern>*/**</includesPattern>-->
-        <!--<excludesPattern>com/mycompany/**</excludesPattern>-->
-        <!--<url>http://maven.repo/repository</url>-->
-        <!--
-        put offline to use only the cache and not send remote requests
-        -->
-        <!--<offline>false</offline>-->
-        <!--<hardFail>true</hardFail>-->
-        <!--
-        cache remotely retrieved artifacts (you'd want 'true')
-        -->
-        <!--<storeArtifactsLocally>true</storeArtifactsLocally>-->
-        <!--
-        number of seconds to cache artifact lookup results
-        -->
-        <!--<retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to cache artifact retrieval failures (normally communication errors)
-        -->
-        <!--<failedRetrievalCachePeriodSecs>30</failedRetrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to remember artifact retrieval misses (artifact not found)
-        -->
-        <!--<missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>-->
-        <!--
-        ttp authentication details
-        -->
-        <!--<username>un</username>-->
-        <!--<password>pw</password>-->
-        <!--
-        network timeout for both connection establishment failures and unanswered requests
-        -->
-        <!--<socketTimeoutMillis>2000</socketTimeoutMillis>-->
-        <!--
-        proxy reference
-        -->
-        <!--<proxyRef>unused-proxy</proxyRef>-->
-        <!--</remoteRepository>-->
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <!-- This repository will be available at the url:
-        http://<host>:<port>/artifactory/snapshots-only/
-        (note the trailing slash!)
-        -->
-        <virtualRepository>
-            <key>remote-repos</key>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>codehaus</repositoryRef>
-                <repositoryRef>jboss</repositoryRef>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-                <repositoryRef>jfrog-libs</repositoryRef>
-                <repositoryRef>jfrog-plugins</repositoryRef>
-                <repositoryRef>spring-milestone</repositoryRef>
-                <repositoryRef>spring-snapshots</repositoryRef>
-                <repositoryRef>spring-release</repositoryRef>
-                <repositoryRef>google-code</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-releases</key>
-            <repositories>
-                <repositoryRef>libs-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-releases</key>
-            <repositories>
-                <repositoryRef>plugins-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshots</key>
-            <repositories>
-                <repositoryRef>libs-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshots</key>
-            <repositories>
-                <repositoryRef>plugins-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-    </virtualRepositories>
-
-    <!--
-        <proxies>
-            <proxy>
-                <key>unused-proxy</key>
-                <host>host</host>
-                <port>8080</port>
-                <username>un</username>
-                <password>pw</password>
-                <domain>mydomain</domain>
-            </proxy>
-        </proxies>
-    -->
-
-</config>
-
diff --git a/base/config/src/test/resources/config/test/config.1.4.3_without_multildap.xml b/base/config/src/test/resources/config/test/config.1.4.3_without_multildap.xml
deleted file mode 100644
index 5217a8f..0000000
--- a/base/config/src/test/resources/config/test/config.1.4.3_without_multildap.xml
+++ /dev/null
@@ -1,288 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<config xmlns="http://artifactory.jfrog.org/xsd/1.4.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xsi:schemaLocation="http://www.jfrog.org/xsd/artifactory-v1_4_3.xsd">
-    <offlineMode>false</offlineMode>
-    <fileUploadMaxSizeMb>100</fileUploadMaxSizeMb>
-    <dateFormat>dd-MM-yy HH:mm:ss z</dateFormat>
-    <addons>
-        <serverId>LHI4173</serverId>
-        <showAddonsInfo>true</showAddonsInfo>
-        <showAddonsInfoCookie>1271953082969</showAddonsInfoCookie>
-    </addons>
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-        <passwordSettings>
-            <encryptionPolicy>supported</encryptionPolicy>
-        </passwordSettings>
-        <ldapSettings>
-            <ldapSetting>
-                <key>ldap1</key>
-                <enabled>false</enabled>
-                <ldapUrl>ldap://localhost:10389/ou=system</ldapUrl>
-                <search>
-                    <searchFilter>uid={0}</searchFilter>
-                    <searchBase></searchBase>
-                    <searchSubTree>true</searchSubTree>
-                    <managerDn>uid=admin, ou=system</managerDn>
-                    <managerPassword>secret</managerPassword>
-                </search>
-                <autoCreateUser>true</autoCreateUser>
-            </ldapSetting>
-            <ldapSetting>
-                <key>myldap</key>
-                <enabled>true</enabled>
-                <ldapUrl>ldap://safd</ldapUrl>
-                <userDnPattern>sd</userDnPattern>
-                <autoCreateUser>true</autoCreateUser>
-            </ldapSetting>
-        </ldapSettings>
-        <ldapGroupSettings>
-            <ldapGroupSetting>
-                <name>myldap2</name>
-                <groupBaseDn></groupBaseDn>
-                <groupNameAttribute>cn</groupNameAttribute>
-                <groupMemberAttribute>uniqueMember</groupMemberAttribute>
-                <subTree>true</subTree>
-                <filter>(objectClass=groupOfNames)</filter>
-                <descriptionAttribute>description</descriptionAttribute>
-                <strategy>STATIC</strategy>
-                <enabled>true</enabled>
-            </ldapGroupSetting>
-        </ldapGroupSettings>
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <enabled>false</enabled>
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <retentionPeriodHours>0</retentionPeriodHours>
-            <createArchive>false</createArchive>
-            <excludedRepositories>
-                <repositoryRef>remote-repo</repositoryRef>
-            </excludedRepositories>
-            <sendMailOnError>true</sendMailOnError>
-        </backup>
-    </backups>
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <type>maven2</type>
-            <includesPattern>**/*</includesPattern>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets/>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <type>maven2</type>
-            <includesPattern>**/*</includesPattern>
-            <blackedOut>false</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets/>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases-local</key>
-            <description>Local repository for plugins</description>
-            <type>maven2</type>
-            <includesPattern>**/*</includesPattern>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets/>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <type>maven2</type>
-            <includesPattern>**/*</includesPattern>
-            <blackedOut>false</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets/>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-        </localRepository>
-        <localRepository>
-            <key>ext-releases-local</key>
-            <description>Local repository for third party libraries</description>
-            <type>maven2</type>
-            <includesPattern>**/*</includesPattern>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets/>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshots-local</key>
-            <description>Local repository for third party snapshots</description>
-            <type>maven2</type>
-            <includesPattern>**/*</includesPattern>
-            <blackedOut>false</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets/>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-        </localRepository>
-        <localRepository>
-            <key>UNIQUE</key>
-            <type>maven2</type>
-            <includesPattern>**/*</includesPattern>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>5</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets/>
-            <snapshotVersionBehavior>unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-        </localRepository>
-        <localRepository>
-            <key>NONUNIQUE</key>
-            <type>maven2</type>
-            <includesPattern>**/*</includesPattern>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets/>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-        </localRepository>
-        <localRepository>
-            <key>DEPLOYER</key>
-            <type>maven2</type>
-            <includesPattern>**/*</includesPattern>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>5</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets/>
-            <snapshotVersionBehavior>deployer</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-        </localRepository>
-    </localRepositories>
-    <remoteRepositories>
-        <remoteRepository>
-            <key>remote-repo</key>
-            <type>maven2</type>
-            <includesPattern>**/*</includesPattern>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <propertySets/>
-            <url>http://repo.jfrog.org/artifactory/remote-repos</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <failedRetrievalCachePeriodSecs>30</failedRetrievalCachePeriodSecs>
-            <missedRetrievalCachePeriodSecs>7200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupEnabled>false</unusedArtifactsCleanupEnabled>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-        </remoteRepository>
-    </remoteRepositories>
-    <virtualRepositories>
-        <virtualRepository>
-            <key>remote-repos</key>
-            <type>maven2</type>
-            <includesPattern>**/*</includesPattern>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>remote-repo</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-releases</key>
-            <type>maven2</type>
-            <includesPattern>**/*</includesPattern>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>false</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>libs-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>UNIQUE</repositoryRef>
-                <repositoryRef>NONUNIQUE</repositoryRef>
-                <repositoryRef>DEPLOYER</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-releases</key>
-            <type>maven2</type>
-            <includesPattern>**/*</includesPattern>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>false</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>plugins-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshots</key>
-            <type>maven2</type>
-            <includesPattern>**/*</includesPattern>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>false</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>libs-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>UNIQUE</repositoryRef>
-                <repositoryRef>NONUNIQUE</repositoryRef>
-                <repositoryRef>DEPLOYER</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshots</key>
-            <type>maven2</type>
-            <includesPattern>**/*</includesPattern>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>false</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>plugins-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-    </virtualRepositories>
-    <proxies/>
-    <propertySets/>
-</config>
diff --git a/base/config/src/test/resources/config/test/config.1.4.6_wrong_url.xml b/base/config/src/test/resources/config/test/config.1.4.6_wrong_url.xml
deleted file mode 100644
index d6fbca9..0000000
--- a/base/config/src/test/resources/config/test/config.1.4.6_wrong_url.xml
+++ /dev/null
@@ -1,363 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.4.6"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.4.6
-        http://www.jfrog.org/xsd/artifactory-v1_4_6.xsd">
-    <!--
-    enable/disable anonymous downloads
-    -->
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-        <!--<ldapSettings>
-            <ldapSetting>
-                <key>ldap1</key>
-                <enabled>true</enabled>
-                <ldapUrl>ldap://mydomain:389/dc=mycompany,dc=com</ldapUrl>
-                <userDnPattern>uid={0}, ou=People</userDnPattern>
-            </ldapSetting>
-        </ldapSettings>-->
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <!--
-            alternative backup dir
-            -->
-            <!--<dir></dir>-->
-            <!--
-            backup every 12 hours
-            -->
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <!--
-            keep backups for a week.
-            Set to 0 in order to always backup to a "current" dir (useful for incremental FS backups).
-            -->
-            <retentionPeriodHours>168</retentionPeriodHours>
-            <!--
-            exclude certain repositories from being backed up
-            -->
-            <excludedRepositories>
-                <repositoryRef>repo1</repositoryRef>
-            </excludedRepositories>
-        </backup>
-    </backups>
-    <!-- The interval at which to activate the m2eclipse indexer. -->
-    <indexer>
-        <!-- By Default index every 24 hours -->
-        <indexingIntervalHours>24</indexingIntervalHours>
-    </indexer>
-    <localRepositories>
-        <localRepository>
-            <key>libs-release-local</key>
-            <description>Local repository for in-house libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshot-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-release-local</key>
-            <description>Local repository for plugins</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshot-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-release-local</key>
-            <description>Local repository for third party libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshot-local</key>
-            <description>Local repository for third party snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-
-        <!--
-        A sample local repository with all possible settings
-        -->
-        <!--
-        <localRepository>
-            <key>local-sample</key>
-            <description>Sample local repository</description>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            -->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--
-        <maxUniqueSnapshots>3</maxUniqueSnapshots>
-        <includesPattern>*/**</includesPattern>
-        <excludesPattern>com/mycompany/**</excludesPattern>
-        -->
-        <!--
-        centrally control unique snapshots behavior (non-unique|unique|deployer)
-        -->
-        <!--
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-        </localRepository>
-        -->
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <description>Central Maven 2 repository</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo1.maven.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m2</key>
-            <description>java.net Maven2 Format</description>
-            <excludesPattern>commons-*,org/apache/**</excludesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://download.java.net/maven/2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m1</key>
-            <description>java.net Maven1 Format</description>
-            <type>maven1</type>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://download.java.net/maven/1</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-libs</key>
-            <description>JFrog libraries releases</description>
-            <excludesPattern>org/apache/maven/**</excludesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo.jfrog.org/artifactory/libs-release-local</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-plugins</key>
-            <description>JFrog plugins releases</description>
-            <includesPattern>org/jfrog/**</includesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo.jfrog.org/artifactory/plugins-release-local</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jboss</key>
-            <description>JBoss Maven2 releases</description>
-            <includesPattern>org/jboss/**,org/hibernate/**,org/richfaces/**,org/drools/**</includesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repository.jboss.org/nexus/content/groups/public-jboss</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus</key>
-            <description>Codehaus Maven2 releases</description>
-            <includesPattern>org/**,com/**,net/**</includesPattern>
-            <excludesPattern>org/apache/**,commons-*,org/artifactory/**,org/jfrog/**</excludesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repository.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-milestone</key>
-            <description>SpringSource in milestone version</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repository.springsource.com/maven/bundles/milestone</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-release</key>
-            <description>SpringSource releases</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repository.springsource.com/maven/bundles/release</url>
-            <unusedArtifactsCleanupEnabled>false</unusedArtifactsCleanupEnabled>
-        </remoteRepository>
-        <remoteRepository>
-            <key>google-code</key>
-            <description>Google's open source releases</description>
-            <includesPattern>com/google/**</includesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://google-maven-repository.googlecode.com/svn/repository</url>
-            <unusedArtifactsCleanupEnabled>true</unusedArtifactsCleanupEnabled>
-        </remoteRepository>
-        <remoteRepository>
-            <key>gradle-libs</key>
-            <description>Gradle libraries</description>
-            <includesPattern>**/*</includesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://gradle.artifactoryonline.com/gradle/libs</url>
-            <unusedArtifactsCleanupEnabled>true</unusedArtifactsCleanupEnabled>
-        </remoteRepository>
-        <remoteRepository>
-            <key>gradle-plugins</key>
-            <description>Gradle plugins</description>
-            <includesPattern>**/*</includesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://gradle.artifactoryonline.com/gradle/plugins</url>
-            <unusedArtifactsCleanupEnabled>false</unusedArtifactsCleanupEnabled>
-        </remoteRepository>
-
-        <!-- A sample remote repository with all possible tunings -->
-        <!--
-        <remoteRepository>
-        <key>remote-sample</key>
-        <description>Sample remote repository</description>
-        -->
-        <!--
-        blok the usage of this repository
-        -->
-        <!--<blackedOut>false</blackedOut>-->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--<maxUniqueSnapshots>3</maxUniqueSnapshots>-->
-        <!--<includesPattern>*/**</includesPattern>-->
-        <!--<excludesPattern>com/mycompany/**</excludesPattern>-->
-        <!--<url>http://maven.repo/repository</url>-->
-        <!--
-        put offline to use only the cache and not send remote requests
-        -->
-        <!--<offline>false</offline>-->
-        <!--<hardFail>true</hardFail>-->
-        <!--
-        cache remotely retrieved artifacts (you'd want 'true')
-        -->
-        <!--<storeArtifactsLocally>true</storeArtifactsLocally>-->
-        <!--
-        number of seconds to cache artifact lookup results
-        -->
-        <!--<retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to cache artifact retrieval failures (normally communication errors)
-        -->
-        <!--<failedRetrievalCachePeriodSecs>30</failedRetrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to remember artifact retrieval misses (artifact not found)
-        -->
-        <!--<missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>-->
-        <!--
-        ttp authentication details
-        -->
-        <!--<username>un</username>-->
-        <!--<password>pw</password>-->
-        <!--
-        network timeout for both connection establishment failures and unanswered requests
-        -->
-        <!--<socketTimeoutMillis>2000</socketTimeoutMillis>-->
-        <!--
-        proxy reference
-        -->
-        <!--<proxyRef>unused-proxy</proxyRef>-->
-        <!--</remoteRepository>-->
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <!-- This repository will be available at the url:
-        http://<host>:<port>/artifactory/snapshots-only/
-        (note the trailing slash!)
-        -->
-        <virtualRepository>
-            <key>remote-repos</key>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>codehaus</repositoryRef>
-                <repositoryRef>jboss</repositoryRef>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-                <repositoryRef>jfrog-libs</repositoryRef>
-                <repositoryRef>jfrog-plugins</repositoryRef>
-                <repositoryRef>spring-milestone</repositoryRef>
-                <repositoryRef>spring-release</repositoryRef>
-                <repositoryRef>google-code</repositoryRef>
-                <repositoryRef>gradle-libs</repositoryRef>
-                <repositoryRef>gradle-plugins</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-release</key>
-            <repositories>
-                <repositoryRef>libs-release-local</repositoryRef>
-                <repositoryRef>ext-release-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-release</key>
-            <repositories>
-                <repositoryRef>plugins-release-local</repositoryRef>
-                <repositoryRef>ext-release-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshot</key>
-            <repositories>
-                <repositoryRef>libs-snapshot-local</repositoryRef>
-                <repositoryRef>ext-snapshot-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshot</key>
-            <repositories>
-                <repositoryRef>plugins-snapshot-local</repositoryRef>
-                <repositoryRef>ext-snapshot-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-    </virtualRepositories>
-
-    <!--
-        <proxies>
-            <proxy>
-                <key>unused-proxy</key>
-                <host>host</host>
-                <port>8080</port>
-                <username>un</username>
-                <password>pw</password>
-                <domain>mydomain</domain>
-            </proxy>
-        </proxies>
-    -->
-
-</config>
diff --git a/base/config/src/test/resources/config/test/config.1.4.8_old_replication.xml b/base/config/src/test/resources/config/test/config.1.4.8_old_replication.xml
deleted file mode 100644
index 11087f3..0000000
--- a/base/config/src/test/resources/config/test/config.1.4.8_old_replication.xml
+++ /dev/null
@@ -1,165 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns="http://artifactory.jfrog.org/xsd/1.4.8" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-    <!--
-    enable/disable anonymous downloads
-    -->
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-        <!--<ldapSettings>
-            <ldapSetting>
-                <key>ldap1</key>
-                <enabled>true</enabled>
-                <ldapUrl>ldap://mydomain:389/dc=mycompany,dc=com</ldapUrl>
-                <userDnPattern>uid={0}, ou=People</userDnPattern>
-            </ldapSetting>
-        </ldapSettings>-->
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <!--
-            alternative backup dir
-            -->
-            <!--<dir></dir>-->
-            <!--
-            backup every 12 hours
-            -->
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <!--
-            keep backups for a week.
-            Set to 0 in order to always backup to a "current" dir (useful for incremental FS backups).
-            -->
-            <retentionPeriodHours>168</retentionPeriodHours>
-            <!--
-            exclude certain repositories from being backed up
-            -->
-            <excludedRepositories>
-                <repositoryRef>repo1</repositoryRef>
-            </excludedRepositories>
-        </backup>
-    </backups>
-    <!-- The interval at which to activate the m2eclipse indexer. -->
-    <indexer>
-        <!-- By Default index every 24 hours -->
-        <indexingIntervalHours>24</indexingIntervalHours>
-    </indexer>
-    <localRepositories>
-        <localRepository>
-            <key>libs-release-local</key>
-            <description>Local repository for in-house libraries</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <snapshotVersionBehavior>unique</snapshotVersionBehavior>
-            <localRepoChecksumPolicyType>client-checksums</localRepoChecksumPolicyType>
-        </localRepository>
-    </localRepositories>
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <description>Central Maven 2 repository</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <suppressPomConsistencyChecks>false</suppressPomConsistencyChecks>
-            <url>http://repo1.maven.org/maven2</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <fetchJarsEagerly>false</fetchJarsEagerly>
-            <fetchSourcesEagerly>false</fetchSourcesEagerly>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <failedRetrievalCachePeriodSecs>30</failedRetrievalCachePeriodSecs>
-            <missedRetrievalCachePeriodSecs>7200</missedRetrievalCachePeriodSecs>
-            <remoteRepoChecksumPolicyType>generate-if-absent</remoteRepoChecksumPolicyType>
-            <unusedArtifactsCleanupPeriodHours>0</unusedArtifactsCleanupPeriodHours>
-            <shareConfiguration>false</shareConfiguration>
-            <synchronizeProperties>false</synchronizeProperties>
-            <listRemoteFolderItems>true</listRemoteFolderItems>
-            <rejectInvalidJars>false</rejectInvalidJars>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-        </remoteRepository>
-    </remoteRepositories>
-    <virtualRepositories>
-        <virtualRepository>
-            <key>remote-repos</key>
-            <includesPattern>**/*</includesPattern>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>repo1</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-    </virtualRepositories>
-    <proxies/>
-    <propertySets/>
-    <repoLayouts>
-        <repoLayout>
-            <name>maven-2-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>SNAPSHOT</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>ivy-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>gradle-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>maven-1-default</name>
-            <artifactPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.+</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.+</fileIntegrationRevisionRegExp>
-        </repoLayout>
-    </repoLayouts>
-    <replications>
-        <replication>
-            <enabled>true</enabled>
-            <cronExp>0 0/5 * * * ? 2011</cronExp>
-            <syncDeletes>true</syncDeletes>
-            <syncProperties>true</syncProperties>
-            <pathPrefix>bob/mcbob</pathPrefix>
-            <repoKey>repo1</repoKey>
-        </replication>
-    </replications>
-</config>
\ No newline at end of file
diff --git a/base/config/src/test/resources/config/test/config.1.4.9.no.gc.xml b/base/config/src/test/resources/config/test/config.1.4.9.no.gc.xml
deleted file mode 100644
index ecc1eb6..0000000
--- a/base/config/src/test/resources/config/test/config.1.4.9.no.gc.xml
+++ /dev/null
@@ -1,411 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.4.9"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.4.9
-        http://www.jfrog.org/xsd/artifactory-v1_4_9.xsd">
-    <!--
-    enable/disable anonymous downloads
-    -->
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-        <!--<ldapSettings>
-            <ldapSetting>
-                <key>ldap1</key>
-                <enabled>true</enabled>
-                <ldapUrl>ldap://mydomain:389/dc=mycompany,dc=com</ldapUrl>
-                <userDnPattern>uid={0}, ou=People</userDnPattern>
-            </ldapSetting>
-        </ldapSettings>-->
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <!--
-            alternative backup dir
-            -->
-            <!--<dir></dir>-->
-            <!--
-            backup every 12 hours
-            -->
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <!--
-            keep backups for a week.
-            Set to 0 in order to always backup to a "current" dir (useful for incremental FS backups).
-            -->
-            <retentionPeriodHours>168</retentionPeriodHours>
-            <!--
-            exclude certain repositories from being backed up
-            -->
-            <excludedRepositories>
-                <repositoryRef>repo1</repositoryRef>
-            </excludedRepositories>
-        </backup>
-    </backups>
-    <!-- The interval at which to activate the m2eclipse indexer. -->
-    <indexer>
-        <!-- By Default index every 24 hours -->
-        <indexingIntervalHours>24</indexingIntervalHours>
-    </indexer>
-    <localRepositories>
-        <localRepository>
-            <key>libs-release-local</key>
-            <description>Local repository for in-house libraries</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshot-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-release-local</key>
-            <description>Local repository for plugins</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshot-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-release-local</key>
-            <description>Local repository for third party libraries</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshot-local</key>
-            <description>Local repository for third party snapshots</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-
-        <!--
-        A sample local repository with all possible settings
-        -->
-        <!--
-        <localRepository>
-            <key>local-sample</key>
-            <description>Sample local repository</description>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            -->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--
-        <maxUniqueSnapshots>3</maxUniqueSnapshots>
-        <includesPattern>*/**</includesPattern>
-        <excludesPattern>com/mycompany/**</excludesPattern>
-        -->
-        <!--
-        centrally control unique snapshots behavior (non-unique|unique|deployer)
-        -->
-        <!--
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-        </localRepository>
-        -->
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <description>Central Maven 2 repository</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo1.maven.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m2</key>
-            <description>java.net Maven2 Format</description>
-            <excludesPattern>commons-*,org/apache/**</excludesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://download.java.net/maven/2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m1</key>
-            <description>java.net Maven1 Format</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://download.java.net/maven/1</url>
-            <remoteRepoLayoutRef>maven-1-default</remoteRepoLayoutRef>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-libs</key>
-            <description>JFrog libraries releases</description>
-            <excludesPattern>org/apache/maven/**</excludesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo.jfrog.org/artifactory/libs-releases-local</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-plugins</key>
-            <description>JFrog plugins releases</description>
-            <includesPattern>org/jfrog/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo.jfrog.org/artifactory/plugins-releases-local</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jboss</key>
-            <description>JBoss Maven2 releases</description>
-            <includesPattern>org/jboss/**,org/hibernate/**,org/richfaces/**,org/drools/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repository.jboss.org/nexus/content/groups/public-jboss</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus</key>
-            <description>Codehaus Maven2 releases</description>
-            <includesPattern>org/**,com/**,net/**</includesPattern>
-            <excludesPattern>org/apache/**,commons-*,org/artifactory/**,org/jfrog/**</excludesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repository.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-milestone</key>
-            <description>SpringSource in milestone version</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repository.springsource.com/maven/bundles/milestone</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>spring-release</key>
-            <description>SpringSource releases</description>
-            <includesPattern>org/springframework/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repository.springsource.com/maven/bundles/release</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>google-code</key>
-            <description>Google's open source releases</description>
-            <includesPattern>com/google/**</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://google-maven-repository.googlecode.com/svn/repository</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>gradle-libs</key>
-            <description>Gradle libraries</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://gradle.artifactoryonline.com/gradle/libs</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>gradle-plugins</key>
-            <description>Gradle plugins</description>
-            <includesPattern>**/*</includesPattern>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://gradle.artifactoryonline.com/gradle/plugins</url>
-        </remoteRepository>
-
-        <!-- A sample remote repository with all possible tunings -->
-        <!--
-        <remoteRepository>
-        <key>remote-sample</key>
-        <description>Sample remote repository</description>
-        -->
-        <!--
-        blok the usage of this repository
-        -->
-        <!--<blackedOut>false</blackedOut>-->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--<maxUniqueSnapshots>3</maxUniqueSnapshots>-->
-        <!--<includesPattern>*/**</includesPattern>-->
-        <!--<excludesPattern>com/mycompany/**</excludesPattern>-->
-        <!--<url>http://maven.repo/repository</url>-->
-        <!--
-        put offline to use only the cache and not send remote requests
-        -->
-        <!--<offline>false</offline>-->
-        <!--<hardFail>true</hardFail>-->
-        <!--
-        cache remotely retrieved artifacts (you'd want 'true')
-        -->
-        <!--<storeArtifactsLocally>true</storeArtifactsLocally>-->
-        <!--
-        number of seconds to cache artifact lookup results
-        -->
-        <!--<retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to cache artifact retrieval failures (normally communication errors)
-        -->
-        <!--<failedRetrievalCachePeriodSecs>30</failedRetrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to remember artifact retrieval misses (artifact not found)
-        -->
-        <!--<missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>-->
-        <!--
-        ttp authentication details
-        -->
-        <!--<username>un</username>-->
-        <!--<password>pw</password>-->
-        <!--
-        network timeout for both connection establishment failures and unanswered requests
-        -->
-        <!--<socketTimeoutMillis>2000</socketTimeoutMillis>-->
-        <!--
-        proxy reference
-        -->
-        <!--<proxyRef>unused-proxy</proxyRef>-->
-        <!--</remoteRepository>-->
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <!-- This repository will be available at the url:
-        http://<host>:<port>/artifactory/snapshots-only/
-        (note the trailing slash!)
-        -->
-        <virtualRepository>
-            <key>remote-repos</key>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>codehaus</repositoryRef>
-                <repositoryRef>jboss</repositoryRef>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-                <repositoryRef>jfrog-libs</repositoryRef>
-                <repositoryRef>jfrog-plugins</repositoryRef>
-                <repositoryRef>spring-milestone</repositoryRef>
-                <repositoryRef>spring-release</repositoryRef>
-                <repositoryRef>google-code</repositoryRef>
-                <repositoryRef>gradle-libs</repositoryRef>
-                <repositoryRef>gradle-plugins</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-release</key>
-            <repositories>
-                <repositoryRef>libs-release-local</repositoryRef>
-                <repositoryRef>ext-release-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-release</key>
-            <repositories>
-                <repositoryRef>plugins-release-local</repositoryRef>
-                <repositoryRef>ext-release-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshot</key>
-            <repositories>
-                <repositoryRef>libs-snapshot-local</repositoryRef>
-                <repositoryRef>ext-snapshot-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshot</key>
-            <repositories>
-                <repositoryRef>plugins-snapshot-local</repositoryRef>
-                <repositoryRef>ext-snapshot-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-    </virtualRepositories>
-
-    <!--
-        <proxies>
-            <proxy>
-                <key>unused-proxy</key>
-                <host>host</host>
-                <port>8080</port>
-                <username>un</username>
-                <password>pw</password>
-                <domain>mydomain</domain>
-            </proxy>
-        </proxies>
-    -->
-
-    <repoLayouts>
-        <repoLayout>
-            <name>maven-2-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>SNAPSHOT</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>ivy-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>gradle-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>maven-1-default</name>
-            <artifactPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.+</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.+</fileIntegrationRevisionRegExp>
-        </repoLayout>
-    </repoLayouts>
-</config>
diff --git a/base/config/src/test/resources/config/test/config.1.5.0_indexing.xml b/base/config/src/test/resources/config/test/config.1.5.0_indexing.xml
deleted file mode 100644
index 6d347fb..0000000
--- a/base/config/src/test/resources/config/test/config.1.5.0_indexing.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.4.11"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.4.11
-        http://www.jfrog.org/xsd/artifactory-v1_4_11.xsd">
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-    </security>
-    <backups>
-        <backup>
-            <key>backup-daily</key>
-            <cronExp>0 0 2 ? * MON-FRI</cronExp>
-            <retentionPeriodHours>0</retentionPeriodHours>
-        </backup>
-    </backups>
-
-    <indexer>
-        <enabled>true</enabled>
-        <indexingIntervalHours>24</indexingIntervalHours>
-        <excludedRepositories></excludedRepositories>
-    </indexer>
-
-    <localRepositories>
-        <localRepository>
-            <key>libs-release-local</key>
-            <description>Local repository for in-house libraries</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-    </localRepositories>
-
-    <repoLayouts>
-        <repoLayout>
-            <name>maven-2-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>SNAPSHOT</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>ivy-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>gradle-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>maven-1-default</name>
-            <artifactPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.+</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.+</fileIntegrationRevisionRegExp>
-        </repoLayout>
-    </repoLayouts>
-    <gcConfig>
-        <cronExp>0 0 /4 * * ?</cronExp>
-    </gcConfig>
-</config>
diff --git a/base/config/src/test/resources/logback-test.xml b/base/config/src/test/resources/logback-test.xml
deleted file mode 100644
index 819c372..0000000
--- a/base/config/src/test/resources/logback-test.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<!-- This file is used when unit tests are executed -->
-<configuration>
-    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"/>
-    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-        <encoder>
-            <pattern>%-30(%d{HH:mm:ss.SSS} [%thread]) [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
-        </encoder>
-    </appender>
-    <logger name="org.artifactory">
-        <level value="warn"/>
-    </logger>
-    <logger name="org.artifactory.schedule.TaskBase">
-        <level value="error"/>
-    </logger>
-    <logger name="org.artifactory.schedule.TaskCallback">
-        <level value="error"/>
-    </logger>
-    <logger name="org.artifactory.schedule.TaskServiceImpl">
-        <level value="error"/>
-    </logger>
-    <root>
-        <level value="warn"/>
-        <appender-ref ref="CONSOLE"/>
-    </root>
-</configuration>
diff --git a/base/config/src/test/resources/org/artifactory/logging/version/v1/logback.xml b/base/config/src/test/resources/org/artifactory/logging/version/v1/logback.xml
deleted file mode 100644
index 6b85f76..0000000
--- a/base/config/src/test/resources/org/artifactory/logging/version/v1/logback.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<configuration>
-    <root>
-        <level value="WARN"/>
-        <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="FILE"/>
-    </root>
-    <logger name="org.apache.jasper">
-        <level value="INFO"/>
-    </logger>
-    <logger name="httpclient.wire">
-        <level value="INFO"/>
-    </logger>
-    <logger name="org.eclipse.jetty">
-        <level value="INFO"/>
-    </logger>
-    <logger name="org.artifactory">
-        <level value="INFO"/>
-    </logger>
-    <logger name="org.artifactory.security.AccessLogger" additivity="false">
-        <level value="INFO"/>
-        <appender-ref ref="ACCESS"/>
-    </logger>
-    <logger name="org.apache.commons.httpclient">
-        <level value="INFO"/>
-    </logger>
-    <appender name="ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/access.log</File>
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%d %m%n</pattern>
-        </layout>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>5MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%d [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
-        </layout>
-    </appender>
-    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/artifactory.log</File>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/artifactory.%i.log.zip</FileNamePattern>
-            <MinIndex>1</MinIndex>
-            <MaxIndex>9</MaxIndex>
-        </rollingPolicy>
-
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>5MB</MaxFileSize>
-        </triggeringPolicy>
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%d [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
-        </layout>
-    </appender>
-</configuration>
\ No newline at end of file
diff --git a/base/config/src/test/resources/org/artifactory/logging/version/v2/logback.xml b/base/config/src/test/resources/org/artifactory/logging/version/v2/logback.xml
deleted file mode 100644
index bf9d829..0000000
--- a/base/config/src/test/resources/org/artifactory/logging/version/v2/logback.xml
+++ /dev/null
@@ -1,140 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<configuration debug="false">
-    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%date [%thread] [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
-        </layout>
-    </appender>
-    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/artifactory.log</File>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/artifactory.%i.log.zip</FileNamePattern>
-            <MinIndex>1</MinIndex>
-            <MaxIndex>9</MaxIndex>
-        </rollingPolicy>
-
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>5MB</MaxFileSize>
-        </triggeringPolicy>
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%date [%thread] [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
-        </layout>
-    </appender>
-    <appender name="ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/access.log</File>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/access.%i.log.zip</FileNamePattern>
-            <MinIndex>1</MinIndex>
-            <MaxIndex>9</MaxIndex>
-        </rollingPolicy>
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%d %m%n</pattern>
-        </layout>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>5MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="IMPORT.EXPORT" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/import.export.log</File>
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%date [%-5level] \(%logger{32}:%line\) %message%n</pattern>
-        </layout>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/import.export.%i.log.zip</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>10MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="TRAFFIC" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/traffic</File>
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%message%n</pattern>
-        </layout>
-        <rollingPolicy class="org.artifactory.traffic.policy.TrafficTimeBasedRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/traffic.%d{yyyyMMdd}</FileNamePattern>
-        </rollingPolicy>
-    </appender>
-    <appender name="REQUEST" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/request.log</File>
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%message%n</pattern>
-        </layout>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/request.%i.log</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>10MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <root>
-        <level value="WARN"/>
-        <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="FILE"/>
-    </root>
-    <logger name="org.artifactory">
-        <level value="INFO"/>
-    </logger>
-    <logger name="org.artifactory.repo.index">
-        <level value="ERROR"/>
-    </logger>
-    <logger name="org.artifactory.info.InfoWriter">
-        <level value="WARN"/>
-    </logger>
-    <logger name="org.artifactory.security.AccessLogger" additivity="false">
-        <level value="INFO"/>
-        <appender-ref ref="ACCESS"/>
-    </logger>
-    <logger name="org.artifactory.api.common.StatusHolder" additivity="false">
-        <level value="DEBUG"/>
-        <appender-ref ref="IMPORT.EXPORT"/>
-    </logger>
-    <logger name="org.artifactory.traffic.TrafficLogger" additivity="false">
-        <level value="INFO"/>
-        <appender-ref ref="TRAFFIC"/>
-    </logger>
-    <logger name="org.artifactory.traffic.RequestLogger" additivity="false">
-        <level value="INFO"/>
-        <appender-ref ref="REQUEST"/>
-    </logger>
-
-    <!-- third party loggers -->
-    <logger name="org.apache.wicket">
-        <level value="ERROR"/>
-    </logger>
-    <logger name="org.apache.jasper">
-        <level value="INFO"/>
-    </logger>
-    <logger name="httpclient.wire">
-        <level value="INFO"/>
-    </logger>
-    <logger name="org.eclipse.jetty">
-        <level value="INFO"/>
-    </logger>
-    <logger name="org.apache.commons.httpclient">
-        <level value="INFO"/>
-    </logger>
-    <logger name="org.springframework">
-        <level value="WARN"/>
-    </logger>
-</configuration>
\ No newline at end of file
diff --git a/base/config/src/test/resources/org/artifactory/logging/version/v4/logback.xml b/base/config/src/test/resources/org/artifactory/logging/version/v4/logback.xml
deleted file mode 100644
index bf9d829..0000000
--- a/base/config/src/test/resources/org/artifactory/logging/version/v4/logback.xml
+++ /dev/null
@@ -1,140 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<configuration debug="false">
-    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%date [%thread] [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
-        </layout>
-    </appender>
-    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/artifactory.log</File>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/artifactory.%i.log.zip</FileNamePattern>
-            <MinIndex>1</MinIndex>
-            <MaxIndex>9</MaxIndex>
-        </rollingPolicy>
-
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>5MB</MaxFileSize>
-        </triggeringPolicy>
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%date [%thread] [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
-        </layout>
-    </appender>
-    <appender name="ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/access.log</File>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/access.%i.log.zip</FileNamePattern>
-            <MinIndex>1</MinIndex>
-            <MaxIndex>9</MaxIndex>
-        </rollingPolicy>
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%d %m%n</pattern>
-        </layout>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>5MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="IMPORT.EXPORT" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/import.export.log</File>
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%date [%-5level] \(%logger{32}:%line\) %message%n</pattern>
-        </layout>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/import.export.%i.log.zip</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>10MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="TRAFFIC" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/traffic</File>
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%message%n</pattern>
-        </layout>
-        <rollingPolicy class="org.artifactory.traffic.policy.TrafficTimeBasedRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/traffic.%d{yyyyMMdd}</FileNamePattern>
-        </rollingPolicy>
-    </appender>
-    <appender name="REQUEST" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/request.log</File>
-        <layout class="ch.qos.logback.classic.PatternLayout">
-            <pattern>%message%n</pattern>
-        </layout>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/request.%i.log</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>10MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <root>
-        <level value="WARN"/>
-        <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="FILE"/>
-    </root>
-    <logger name="org.artifactory">
-        <level value="INFO"/>
-    </logger>
-    <logger name="org.artifactory.repo.index">
-        <level value="ERROR"/>
-    </logger>
-    <logger name="org.artifactory.info.InfoWriter">
-        <level value="WARN"/>
-    </logger>
-    <logger name="org.artifactory.security.AccessLogger" additivity="false">
-        <level value="INFO"/>
-        <appender-ref ref="ACCESS"/>
-    </logger>
-    <logger name="org.artifactory.api.common.StatusHolder" additivity="false">
-        <level value="DEBUG"/>
-        <appender-ref ref="IMPORT.EXPORT"/>
-    </logger>
-    <logger name="org.artifactory.traffic.TrafficLogger" additivity="false">
-        <level value="INFO"/>
-        <appender-ref ref="TRAFFIC"/>
-    </logger>
-    <logger name="org.artifactory.traffic.RequestLogger" additivity="false">
-        <level value="INFO"/>
-        <appender-ref ref="REQUEST"/>
-    </logger>
-
-    <!-- third party loggers -->
-    <logger name="org.apache.wicket">
-        <level value="ERROR"/>
-    </logger>
-    <logger name="org.apache.jasper">
-        <level value="INFO"/>
-    </logger>
-    <logger name="httpclient.wire">
-        <level value="INFO"/>
-    </logger>
-    <logger name="org.eclipse.jetty">
-        <level value="INFO"/>
-    </logger>
-    <logger name="org.apache.commons.httpclient">
-        <level value="INFO"/>
-    </logger>
-    <logger name="org.springframework">
-        <level value="WARN"/>
-    </logger>
-</configuration>
\ No newline at end of file
diff --git a/base/config/src/test/resources/org/artifactory/logging/version/v5/logback.xml b/base/config/src/test/resources/org/artifactory/logging/version/v5/logback.xml
deleted file mode 100644
index ce8654b..0000000
--- a/base/config/src/test/resources/org/artifactory/logging/version/v5/logback.xml
+++ /dev/null
@@ -1,153 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2014 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<configuration debug="false">
-    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"/>
-    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
-            <layout class="org.artifactory.logging.layout.BackTracePatternLayout">
-                <pattern>%date ${artifactory.contextId}[%thread] [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
-            </layout>
-        </encoder>
-    </appender>
-    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/artifactory.log</File>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/artifactory.%i.log.zip</FileNamePattern>
-            <MinIndex>1</MinIndex>
-            <MaxIndex>9</MaxIndex>
-        </rollingPolicy>
-
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>25MB</MaxFileSize>
-        </triggeringPolicy>
-        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
-            <layout class="org.artifactory.logging.layout.BackTracePatternLayout">
-                <pattern>%date [%thread] [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
-            </layout>
-        </encoder>
-    </appender>
-    <appender name="ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/access.log</File>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/access.%i.log.zip</FileNamePattern>
-            <MinIndex>1</MinIndex>
-            <MaxIndex>9</MaxIndex>
-        </rollingPolicy>
-        <encoder>
-            <pattern>%d %m%n</pattern>
-        </encoder>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>25MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="IMPORT.EXPORT" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/import.export.log</File>
-        <encoder>
-            <pattern>%date [%-5level] \(%logger{32}:%line\) %message%n</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/import.export.%i.log.zip</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>25MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="TRAFFIC" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/traffic</File>
-        <encoder>
-            <pattern>%message%n</pattern>
-        </encoder>
-        <rollingPolicy class="org.artifactory.traffic.policy.TrafficTimeBasedRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/traffic.%d{yyyyMMdd}</FileNamePattern>
-        </rollingPolicy>
-    </appender>
-    <appender name="REQUEST" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/request.log</File>
-        <encoder>
-            <pattern>%message%n</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/request.%i.log</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>25MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="REQUEST_TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/request_trace.log</File>
-        <encoder>
-            <pattern>%date %message%n</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/request_trace.%i.log</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>25MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <root>
-        <level value="warn"/>
-        <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="FILE"/>
-    </root>
-    <logger name="org.artifactory">
-        <level value="info"/>
-    </logger>
-    <logger name="org.jfrog">
-        <level value="info"/>
-    </logger>
-    <logger name="org.artifactory.security.AccessLogger" additivity="false">
-        <level value="info"/>
-        <appender-ref ref="ACCESS"/>
-    </logger>
-    <logger name="org.artifactory.api.common.ImportExportStatusHolder" additivity="false">
-        <level value="DEBUG"/>
-        <appender-ref ref="IMPORT.EXPORT"/>
-    </logger>
-    <logger name="org.artifactory.traffic.TrafficLogger" additivity="false">
-        <level value="info"/>
-        <appender-ref ref="TRAFFIC"/>
-    </logger>
-    <logger name="org.artifactory.traffic.RequestLogger" additivity="false">
-        <level value="info"/>
-        <appender-ref ref="REQUEST"/>
-    </logger>
-    <logger name="org.artifactory.request.RequestTraceLogger" additivity="false">
-        <level value="info"/>
-        <appender-ref ref="REQUEST_TRACE"/>
-    </logger>
-
-    <!-- third party loggers -->
-    <logger name="com.sun.jersey">
-        <level value="warn"/>
-    </logger>
-    <logger name="org.springframework">
-        <level value="warn"/>
-    </logger>
-    <logger name="org.apache.wicket">
-        <level value="error"/>
-    </logger>
-    <logger name="org.apache.cxf">
-        <level value="error"/>
-    </logger>
-</configuration>
\ No newline at end of file
diff --git a/base/config/src/test/resources/org/artifactory/mime/mimetypes-test.xml b/base/config/src/test/resources/org/artifactory/mime/mimetypes-test.xml
deleted file mode 100644
index 14c0cf4..0000000
--- a/base/config/src/test/resources/org/artifactory/mime/mimetypes-test.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<mimetypes version="7">
-<!-- duplicate entries - only one will be taken -->
-    <mimetype type="text/plain" extensions="txt" viewable="true" syntaxt="text"/>
-    <mimetype type="text/plain" extensions="properties" viewable="true" syntaxt="text"/>
-
-    <mimetype type="text/xml" extensions="xml" viewable="true" syntaxt="xml" index="true" css="xml"/>
-
-    <!-- entry with multiple extensions -->
-    <mimetype type="application/java-archive" extensions="jar,  war , ear, sar, har"/>
-
-    <!-- file extension in two different mime types - allowed, but when asking by file extension only one will be returned -->
-    <mimetype type="application/simple-1" extensions="ha"/>
-    <mimetype type="application/simple-2" extensions="ha"/>
-</mimetypes>
\ No newline at end of file
diff --git a/base/config/src/test/resources/org/artifactory/mime/version/mimetypes-v1.xml b/base/config/src/test/resources/org/artifactory/mime/version/mimetypes-v1.xml
deleted file mode 100644
index fa9c758..0000000
--- a/base/config/src/test/resources/org/artifactory/mime/version/mimetypes-v1.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<!--
-    This file configures Artifactory's known mime types. A list of registered
-    media types can be found in http://www.iana.org/assignments/media-types/ and common ones in
-    http://www.webmaster-toolkit.com/mime-types.shtml
-    Each mime type may have the following attributes:
-        type - The mime entry unique name (mandatory)
-        extensions - Comma separated list of file extensions mapped to this mime type (mandatory)
-        viewable - True if this mime type can be viewed as text file
-        xml - True if this mime type is an xml that should be indexed for searching
-        archive - True if this mime type is a browsable archive
-        syntax - The UI highlighter syntax to for this mime type (only relevant if this is a viewable type)
-        css - The css class of a display icon for this mime type
--->
-<mimetypes version="1">
-
-    <mimetype type="text/plain" extensions="txt, properties, mf" viewable="true" syntax="plain"/>
-    <mimetype type="text/html" extensions="htm, html" viewable="true" syntax="xml"/>
-    <mimetype type="text/css" extensions="css" viewable="true" syntax="css"/>
-    <mimetype type="text/xsl" extensions="xsl" viewable="true" syntax="xml"/>
-    <mimetype type="text/xslt" extensions="xslt" viewable="true" syntax="xml"/>
-    <mimetype type="text/x-java-source" extensions="java" viewable="true" syntax="java"/>
-    <mimetype type="text/x-javafx-source" extensions="fx" viewable="true" syntax="javafx"/>
-    <mimetype type="text/x-groovy-source" extensions="groovy, gradle" viewable="true" syntax="groovy"/>
-    <mimetype type="text/x-c" extensions="c, cc, cpp" viewable="true" syntax="groovy"/>
-
-    <mimetype type="application/xml-dtd" extensions="dtd" viewable="true"/>
-    <mimetype type="application/xml-schema" extensions="xsd" viewable="true" syntax="xml" xml="true" css="xml"/>
-    <mimetype type="application/xml-external-parsed-entity" extensions="ent" viewable="true"/>
-    <mimetype type="application/xhtml+xml" extensions="xhtml" viewable="true" syntax="xml"/>
-
-    <mimetype type="application/x-java-pack200" extensions="jar.pack.gz" archive="true" css="jar"/>
-    <mimetype type="application/x-java-archive-diff" extensions="jardiff" archive="false"/>
-    <mimetype type="application/zip" extensions="zip" archive="true" css="jar"/>
-    <mimetype type="application/x-rar-compressed" extensions="rar" archive="false" css="jar"/>
-
-    <!-- not registered -->
-    <mimetype type="text/x-scala-source" extensions="scala" viewable="true" syntax="scala"/>
-    <mimetype type="text/x-ruby-source" extensions="rb" viewable="true" syntax="ruby"/>
-    <mimetype type="text/x-script.sh" extensions="sh" viewable="true" syntax="shell"/>
-    <mimetype type="text/x-csharp.sh" extensions="cs" viewable="true" syntax="csharp"/>
-
-    <!--
-        NOTE: The following mime types are required for a proper functioning of certain features in Artifactory 
-         DO NOT change them unless you really know what you are doing
-    -->
-    <mimetype type="application/xml" extensions="xml, xsl, xsi" viewable="true" syntax="xml" xml="true" css="xml"/>
-    <mimetype type="application/x-maven-pom+xml" extensions="pom" viewable="true" syntax="xml" xml="true" css="pom"/>
-    <mimetype type="application/x-ivy+xml" extensions="ivy" viewable="true" syntax="xml" xml="true" css="xml"/>
-    <mimetype type="application/x-java-jnlp-file" extensions="jnlp" viewable="true" syntax="xml" xml="true" css="jnlp"/>
-    <mimetype type="application/x-checksum" extensions="sha1, md5" viewable="true" syntax="plain"/>
-    <mimetype type="application/java-archive" extensions="jar, war, ear, sar, har" archive="true" css="jar"/>
-
-</mimetypes>
\ No newline at end of file
diff --git a/base/config/src/test/resources/org/artifactory/mime/version/mimetypes-v2.xml b/base/config/src/test/resources/org/artifactory/mime/version/mimetypes-v2.xml
deleted file mode 100644
index 27c6e59..0000000
--- a/base/config/src/test/resources/org/artifactory/mime/version/mimetypes-v2.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-<!--
-    This file configures Artifactory's known mime types. A list of registered
-    media types can be found in http://www.iana.org/assignments/media-types/ and common ones in
-    http://www.webmaster-toolkit.com/mime-types.shtml
-    Each mime type may have the following attributes:
-        type - The mime entry unique name (mandatory)
-        extensions - Comma separated list of file extensions mapped to this mime type (mandatory)
-        viewable - True if this mime type can be viewed as text file
-        index - True if this mime type should be indexed for searching (valid only for xml files)
-        archive - True if this mime type is a browsable archive
-        syntax - The UI highlighter syntax to for this mime type (only relevant if this is a viewable type)
-        css - The css class of a display icon for this mime type
--->
-<mimetypes version="2">
-
-    <mimetype type="text/plain" extensions="txt, properties, mf" viewable="true" syntax="plain"/>
-    <mimetype type="text/html" extensions="htm, html" viewable="true" syntax="xml"/>
-    <mimetype type="text/css" extensions="css" viewable="true" syntax="css"/>
-    <mimetype type="text/xsl" extensions="xsl" viewable="true" syntax="xml"/>
-    <mimetype type="text/xslt" extensions="xslt" viewable="true" syntax="xml"/>
-    <mimetype type="text/x-java-source" extensions="java" viewable="true" syntax="java"/>
-    <mimetype type="text/x-javafx-source" extensions="fx" viewable="true" syntax="javafx"/>
-    <mimetype type="text/x-groovy-source" extensions="groovy, gradle" viewable="true" syntax="groovy"/>
-    <mimetype type="text/x-c" extensions="c, cc, cpp" viewable="true" syntax="groovy"/>
-
-    <mimetype type="application/xml-dtd" extensions="dtd" viewable="true"/>
-    <mimetype type="application/xml-schema" extensions="xsd" viewable="true" syntax="xml" css="xml"/>
-    <mimetype type="application/xml-external-parsed-entity" extensions="ent" viewable="true"/>
-    <mimetype type="application/xhtml+xml" extensions="xhtml" viewable="true" syntax="xml"/>
-
-    <mimetype type="application/x-java-pack200" extensions="jar.pack.gz" archive="true" css="jar"/>
-    <mimetype type="application/x-java-archive-diff" extensions="jardiff" archive="false"/>
-    <mimetype type="application/zip" extensions="zip" archive="true" css="jar"/>
-    <mimetype type="application/x-nupkg" extensions="nupkg" archive="true" css="nupkg"/>
-    <mimetype type="application/x-rar-compressed" extensions="rar" archive="false" css="jar"/>
-    <mimetype type="application/vnd.android.package-archive" extensions="apk" archive="true" css="apk"/>
-
-    <!-- not registered -->
-    <mimetype type="text/x-scala-source" extensions="scala" viewable="true" syntax="scala"/>
-    <mimetype type="text/x-ruby-source" extensions="rb" viewable="true" syntax="ruby"/>
-    <mimetype type="text/x-script.sh" extensions="sh" viewable="true" syntax="shell"/>
-    <mimetype type="text/x-csharp.sh" extensions="cs" viewable="true" syntax="csharp"/>
-
-    <!--
-        NOTE: The following mime types are required for a proper functioning of certain features in Artifactory 
-         DO NOT change them unless you really know what you are doing
-    -->
-    <mimetype type="application/xml" extensions="xml, xsl, xsi" viewable="true" syntax="xml" css="xml"/>
-    <mimetype type="application/x-maven-pom+xml" extensions="pom" viewable="true" syntax="xml" index="true" css="pom"/>
-    <mimetype type="application/x-ivy+xml" extensions="ivy" viewable="true" syntax="xml" index="true" css="xml"/>
-    <mimetype type="application/x-java-jnlp-file" extensions="jnlp" viewable="true" syntax="xml" css="jnlp"/>
-    <mimetype type="application/x-checksum" extensions="sha1, md5" viewable="true" syntax="plain"/>
-    <mimetype type="application/java-archive" extensions="jar, war, ear, sar, har" archive="true" css="jar"/>
-
-</mimetypes>
\ No newline at end of file
diff --git a/base/config/src/test/resources/org/artifactory/mime/version/mimetypes-v4.xml b/base/config/src/test/resources/org/artifactory/mime/version/mimetypes-v4.xml
deleted file mode 100644
index 2394768..0000000
--- a/base/config/src/test/resources/org/artifactory/mime/version/mimetypes-v4.xml
+++ /dev/null
@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-<!--
-    This file configures Artifactory's known mime types. A list of registered
-    media types can be found in http://www.iana.org/assignments/media-types/ and common ones in
-    http://www.webmaster-toolkit.com/mime-types.shtml
-    Each mime type may have the following attributes:
-        type - The mime entry unique name (mandatory)
-        extensions - Comma separated list of file extensions mapped to this mime type (mandatory)
-        viewable - True if this mime type can be viewed as text file
-        index - True if this mime type should be indexed for searching (valid only for xml and archive files)
-        archive - True if this mime type is a browsable archive
-        syntax - The UI highlighter syntax to for this mime type (only relevant if this is a viewable type)
-        css - The css class of a display icon for this mime type
--->
-<mimetypes version="4">
-
-    <mimetype type="text/plain" extensions="txt, properties, mf, asc" viewable="true" syntax="plain"/>
-    <mimetype type="text/html" extensions="htm, html" viewable="true" syntax="xml"/>
-    <mimetype type="text/css" extensions="css" viewable="true" syntax="css"/>
-    <mimetype type="text/xsl" extensions="xsl" viewable="true" syntax="xml"/>
-    <mimetype type="text/xslt" extensions="xslt" viewable="true" syntax="xml"/>
-    <mimetype type="text/x-java-source" extensions="java" viewable="true" syntax="java"/>
-    <mimetype type="text/x-javafx-source" extensions="fx" viewable="true" syntax="javafx"/>
-    <mimetype type="text/x-groovy-source" extensions="groovy, gradle" viewable="true" syntax="groovy"/>
-    <mimetype type="text/x-c" extensions="h, c, cc, cpp" viewable="true" syntax="cpp"/>
-
-    <mimetype type="application/xml-dtd" extensions="dtd" viewable="true"/>
-    <mimetype type="application/xml-schema" extensions="xsd" viewable="true" syntax="xml" css="xml"/>
-    <mimetype type="application/xml-external-parsed-entity" extensions="ent" viewable="true"/>
-    <mimetype type="application/xhtml+xml" extensions="xhtml" viewable="true" syntax="xml"/>
-
-    <mimetype type="application/x-java-pack200" extensions="jar.pack.gz" archive="true" index="true" css="jar"/>
-    <mimetype type="application/x-java-archive-diff" extensions="jardiff" archive="false"/>
-    <mimetype type="application/zip" extensions="zip" archive="true" index="true" css="jar"/>
-    <mimetype type="application/x-tar" extensions="tar" archive="false" index="false"/>
-    <mimetype type="application/x-gzip" extensions="tgz, tar.gz, gz" archive="false" index="false"/>
-    <mimetype type="application/x-nupkg" extensions="nupkg" archive="true" index="true" css="nupkg"/>
-    <mimetype type="application/x-rar-compressed" extensions="rar" archive="false" css="jar"/>
-    <mimetype type="application/vnd.android.package-archive" extensions="apk" archive="true" index="true" css="apk"/>
-    <mimetype type="application/x-rpm" extensions="rpm" css="rpm"/>
-
-    <!-- not registered -->
-    <mimetype type="text/x-scala-source" extensions="scala" viewable="true" syntax="scala"/>
-    <mimetype type="text/x-ruby-source" extensions="rb" viewable="true" syntax="ruby"/>
-    <mimetype type="text/x-script.sh" extensions="sh" viewable="true" syntax="shell"/>
-    <mimetype type="text/x-csharp.sh" extensions="cs" viewable="true" syntax="csharp"/>
-
-    <!--
-        NOTE: The following mime types are required for a proper functioning of certain features in Artifactory 
-         DO NOT change them unless you really know what you are doing
-    -->
-    <mimetype type="application/xml" extensions="xml, xsl, xsi" viewable="true" syntax="xml" css="xml"/>
-    <mimetype type="application/x-maven-pom+xml" extensions="pom" viewable="true" syntax="xml" index="true" css="pom"/>
-    <mimetype type="application/x-ivy+xml" extensions="ivy" viewable="true" syntax="xml" index="true" css="xml"/>
-    <mimetype type="application/x-nuspec+xml" extensions="nuspec" viewable="true" syntax="xml" css="xml"/>
-    <mimetype type="application/x-java-jnlp-file" extensions="jnlp" viewable="true" syntax="xml" css="jnlp"/>
-    <mimetype type="application/x-checksum" extensions="sha1, md5" viewable="true" syntax="plain"/>
-    <mimetype type="application/java-archive" extensions="jar, war, ear, sar, har, hpi, jpi" archive="true" index="true"
-              css="jar"/>
-
-</mimetypes>
\ No newline at end of file
diff --git a/base/config/src/test/resources/org/artifactory/mime/version/mimetypes-v5.xml b/base/config/src/test/resources/org/artifactory/mime/version/mimetypes-v5.xml
deleted file mode 100644
index bdf7f10..0000000
--- a/base/config/src/test/resources/org/artifactory/mime/version/mimetypes-v5.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-<!--
-    This file configures Artifactory's known mime types. A list of registered
-    media types can be found in http://www.iana.org/assignments/media-types/ and common ones in
-    http://www.webmaster-toolkit.com/mime-types.shtml
-    Each mime type may have the following attributes:
-        type - The mime entry unique name (mandatory)
-        extensions - Comma separated list of file extensions mapped to this mime type (mandatory)
-        index - True if this mime type should be indexed for searching (valid only for supported archive files)
-        archive - True if this mime type is a browsable archive
-        viewable - True if this mime type can be viewed as text file
-        syntax - The UI highlighter syntax to for this mime type (only relevant if this is a viewable type)
-        css - The css class of a display icon for this mime type
--->
-<mimetypes version="5">
-
-    <mimetype type="text/plain" extensions="txt, properties, mf, asc" viewable="true" syntax="plain"/>
-    <mimetype type="text/html" extensions="htm, html" viewable="true" syntax="xml"/>
-    <mimetype type="text/css" extensions="css" viewable="true" syntax="css"/>
-    <mimetype type="text/xsl" extensions="xsl" viewable="true" syntax="xml"/>
-    <mimetype type="text/xslt" extensions="xslt" viewable="true" syntax="xml"/>
-    <mimetype type="text/x-java-source" extensions="java" viewable="true" syntax="java"/>
-    <mimetype type="text/x-javafx-source" extensions="fx" viewable="true" syntax="javafx"/>
-    <mimetype type="text/x-groovy-source" extensions="groovy, gradle" viewable="true" syntax="groovy"/>
-    <mimetype type="text/x-c" extensions="h, c, cc, cpp" viewable="true" syntax="cpp"/>
-
-    <mimetype type="application/xml-dtd" extensions="dtd" viewable="true"/>
-    <mimetype type="application/xml-schema" extensions="xsd" viewable="true" syntax="xml" css="xml"/>
-    <mimetype type="application/xml-external-parsed-entity" extensions="ent" viewable="true"/>
-    <mimetype type="application/xhtml+xml" extensions="xhtml" viewable="true" syntax="xml"/>
-
-    <mimetype type="application/x-java-pack200" extensions="jar.pack.gz" archive="true" index="true" css="jar"/>
-    <mimetype type="application/x-java-archive-diff" extensions="jardiff" archive="false"/>
-    <mimetype type="application/zip" extensions="zip" archive="true" index="true" css="jar"/>
-    <mimetype type="application/x-tar" extensions="tar" archive="false" index="false"/>
-    <mimetype type="application/x-gzip" extensions="tgz, tar.gz, gz" archive="false" index="false"/>
-    <mimetype type="application/x-nupkg" extensions="nupkg" archive="true" index="true" css="nupkg"/>
-    <mimetype type="application/x-rar-compressed" extensions="rar" archive="false" css="jar"/>
-    <mimetype type="application/vnd.android.package-archive" extensions="apk" archive="true" index="true" css="apk"/>
-    <mimetype type="application/x-rpm" extensions="rpm" css="rpm"/>
-    <mimetype type="application/x-rubygems" extensions="gem" css="gem"/>
-    <mimetype type="application/x-ruby-marshal" extensions="rz" css="ruby-marshal"/>
-
-    <!-- not registered -->
-    <mimetype type="text/x-scala-source" extensions="scala" viewable="true" syntax="scala"/>
-    <mimetype type="text/x-ruby-source" extensions="rb" viewable="true" syntax="ruby"/>
-    <mimetype type="text/x-script.sh" extensions="sh" viewable="true" syntax="shell"/>
-    <mimetype type="text/x-csharp.sh" extensions="cs" viewable="true" syntax="csharp"/>
-
-    <!--
-        NOTE: The following mime types are required for a proper functioning of certain features in Artifactory 
-         DO NOT change them unless you really know what you are doing
-    -->
-    <mimetype type="application/xml" extensions="xml, xsl, xsi" viewable="true" syntax="xml" css="xml"/>
-    <mimetype type="application/x-maven-pom+xml" extensions="pom" viewable="true" syntax="xml" index="true" css="pom"/>
-    <mimetype type="application/x-ivy+xml" extensions="ivy" viewable="true" syntax="xml" index="true" css="xml"/>
-    <mimetype type="application/x-nuspec+xml" extensions="nuspec" viewable="true" syntax="xml" css="xml"/>
-    <mimetype type="application/x-java-jnlp-file" extensions="jnlp" viewable="true" syntax="xml" css="jnlp"/>
-    <mimetype type="application/x-checksum" extensions="sha1, md5" viewable="true" syntax="plain"/>
-    <mimetype type="application/java-archive" extensions="jar, war, ear, sar, har, hpi, jpi" archive="true" index="true"
-              css="jar"/>
-
-</mimetypes>
\ No newline at end of file
diff --git a/base/config/src/test/resources/org/artifactory/mime/version/mimetypes-v7.xml b/base/config/src/test/resources/org/artifactory/mime/version/mimetypes-v7.xml
deleted file mode 100644
index 3fb05a2..0000000
--- a/base/config/src/test/resources/org/artifactory/mime/version/mimetypes-v7.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2015 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-<!--
-    This file configures Artifactory's known mime types. A list of registered
-    media types can be found in http://www.iana.org/assignments/media-types/ and common ones in
-    http://www.webmaster-toolkit.com/mime-types.shtml
-    Each mime type may have the following attributes:
-        type - The mime entry unique name (mandatory)
-        extensions - Comma separated list of file extensions mapped to this mime type (mandatory)
-        index - True if this mime type should be indexed for searching (valid only for supported archive files)
-        archive - True if this mime type is a browsable archive
-        viewable - True if this mime type can be viewed as text file
-        syntax - The UI highlighter syntax to for this mime type (only relevant if this is a viewable type)
-        css - The css class of a display icon for this mime type
--->
-<mimetypes version="7">
-
-    <mimetype type="text/plain" extensions="txt, properties, mf, asc" viewable="true" syntax="plain"/>
-    <mimetype type="text/html" extensions="htm, html" viewable="true" syntax="xml"/>
-    <mimetype type="text/css" extensions="css" viewable="true" syntax="css"/>
-    <mimetype type="text/xsl" extensions="xsl" viewable="true" syntax="xml"/>
-    <mimetype type="text/xslt" extensions="xslt" viewable="true" syntax="xml"/>
-    <mimetype type="text/x-java-source" extensions="java" viewable="true" syntax="java"/>
-    <mimetype type="text/x-javafx-source" extensions="fx" viewable="true" syntax="javafx"/>
-    <mimetype type="text/x-groovy-source" extensions="groovy, gradle" viewable="true" syntax="groovy"/>
-    <mimetype type="text/x-c" extensions="h, c, cc, cpp" viewable="true" syntax="cpp"/>
-
-    <mimetype type="application/xml-dtd" extensions="dtd" viewable="true"/>
-    <mimetype type="application/xml-schema" extensions="xsd" viewable="true" syntax="xml" css="xml"/>
-    <mimetype type="application/xml-external-parsed-entity" extensions="ent" viewable="true"/>
-    <mimetype type="application/xhtml+xml" extensions="xhtml" viewable="true" syntax="xml"/>
-    <mimetype type="application/json" extensions="json" viewable="true" syntax="javascript"/>
-
-    <mimetype type="application/x-java-pack200" extensions="jar.pack.gz" archive="true" index="true" css="jar"/>
-    <mimetype type="application/x-java-archive-diff" extensions="jardiff" archive="false"/>
-    <mimetype type="application/zip" extensions="zip" archive="true" index="true" css="jar"/>
-    <mimetype type="application/x-tar" extensions="tar" archive="false" index="false"/>
-    <mimetype type="application/x-gzip" extensions="tgz, tar.gz, gz" archive="false" index="false"/>
-    <mimetype type="application/x-nupkg" extensions="nupkg" archive="true" index="true" css="nupkg"/>
-    <mimetype type="application/x-rar-compressed" extensions="rar" archive="false" css="jar"/>
-    <mimetype type="application/vnd.android.package-archive" extensions="apk" archive="true" index="true" css="apk"/>
-    <mimetype type="application/x-rpm" extensions="rpm" css="rpm"/>
-    <mimetype type="application/x-rubygems" extensions="gem" css="gem"/>
-    <mimetype type="application/x-ruby-marshal" extensions="rz" css="ruby-marshal"/>
-    <mimetype type="application/x-debian-package" extensions="deb" css="deb"/>
-    <mimetype type="application/x-vagrant-box" extensions="box" css="box"/>
-
-    <!-- not registered -->
-    <mimetype type="text/x-scala-source" extensions="scala" viewable="true" syntax="scala"/>
-    <mimetype type="text/x-ruby-source" extensions="rb" viewable="true" syntax="ruby"/>
-    <mimetype type="text/x-script.sh" extensions="sh" viewable="true" syntax="shell"/>
-    <mimetype type="text/x-csharp.sh" extensions="cs" viewable="true" syntax="csharp"/>
-
-    <!--
-        NOTE: The following mime types are required for a proper functioning of certain features in Artifactory 
-         DO NOT change them unless you really know what you are doing
-    -->
-    <mimetype type="application/xml" extensions="xml, xsl, xsi" viewable="true" syntax="xml" css="xml"/>
-    <mimetype type="application/x-maven-pom+xml" extensions="pom" viewable="true" syntax="xml" css="pom"/>
-    <mimetype type="application/x-ivy+xml" extensions="ivy" viewable="true" syntax="xml" css="xml"/>
-    <mimetype type="application/x-nuspec+xml" extensions="nuspec" viewable="true" syntax="xml" css="xml"/>
-    <mimetype type="application/x-java-jnlp-file" extensions="jnlp" viewable="true" syntax="xml" css="jnlp"/>
-    <mimetype type="application/x-checksum" extensions="sha1, md5" viewable="true" syntax="plain"/>
-    <mimetype type="application/java-archive" extensions="jar, war, ear, sar, har, hpi, jpi" archive="true" index="true"
-              css="jar"/>
-
-</mimetypes>
\ No newline at end of file
diff --git a/base/config/src/test/resources/version/artifactory1.2.5.properties b/base/config/src/test/resources/version/artifactory1.2.5.properties
deleted file mode 100644
index b0c08de..0000000
--- a/base/config/src/test/resources/version/artifactory1.2.5.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-# test file with valid version data to test the ArtifactoryVersionReader
-artifactory.version=1.2.5
-artifactory.revision=1154
\ No newline at end of file
diff --git a/base/log/pom.xml b/base/log/pom.xml
deleted file mode 100644
index 543965a..0000000
--- a/base/log/pom.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0          http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <artifactId>artifactory-base-parent</artifactId>
-        <groupId>org.artifactory</groupId>
-        <version>4.8.0</version>
-    </parent>
-
-    <artifactId>artifactory-log</artifactId>
-    <packaging>jar</packaging>
-    <name>Artifactory Logging Support</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>ch.qos.logback</groupId>
-            <artifactId>logback-classic</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>jcl-over-slf4j</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>jul-to-slf4j</artifactId>
-        </dependency>
-
-    </dependencies>
-</project>
diff --git a/base/log/src/main/java/org/artifactory/log/BootstrapLogger.java b/base/log/src/main/java/org/artifactory/log/BootstrapLogger.java
deleted file mode 100644
index b1e6a5e..0000000
--- a/base/log/src/main/java/org/artifactory/log/BootstrapLogger.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.log;
-
-/**
- * @author Yoav Landman
- */
-public abstract class BootstrapLogger {
-    private BootstrapLogger() {
-        // utility class
-    }
-
-    public static void info(String msg) {
-        log("INFO", msg);
-    }
-
-    public static void warn(String msg) {
-        log("WARN", msg);
-    }
-
-    public static void error(String msg) {
-        log("ERROR", msg);
-    }
-
-    private static void log(String level, String msg) {
-        System.out.print("[ARTIFACTORY] ");
-        System.out.print("[" + level + "] ");
-        System.out.println(msg);
-    }
-}
\ No newline at end of file
diff --git a/base/log/src/main/java/org/artifactory/logging/converter/BackTraceLineOfCallerConverter.java b/base/log/src/main/java/org/artifactory/logging/converter/BackTraceLineOfCallerConverter.java
deleted file mode 100644
index 3ee7d5f..0000000
--- a/base/log/src/main/java/org/artifactory/logging/converter/BackTraceLineOfCallerConverter.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.logging.converter;
-
-import ch.qos.logback.classic.pattern.LineOfCallerConverter;
-import ch.qos.logback.classic.spi.ILoggingEvent;
-
-/**
- * Special converter to get the line number of the caller class. Since we sometimes pass the logger into another class
- * and print the message from there, the default implementation of getting the first element out of the stacktrace no
- * longer works and we have to dig deeper in the stacktrace to get the correct element.
- *
- * @author Tomer Cohen
- * @see ch.qos.logback.classic.pattern.LineOfCallerConverter
- */
-public class BackTraceLineOfCallerConverter extends LineOfCallerConverter {
-    /**
-     * An override of the original logback implementation to get the line number of the calling class.
-     *
-     * @param event The logging event.
-     * @return The calling classe's line number
-     */
-    @Override
-    public String convert(ILoggingEvent event) {
-        // we assume the logger name is the FQN of the class which it belongs to
-        String originalLoggerCallerClassName = event.getLoggerName();
-        StackTraceElement[] callerData = event.getCallerData();
-        if (callerData != null && callerData.length > 0) {
-            // dig into the stacktrace to find the correct class name from which to get the line number from.
-            for (StackTraceElement element : callerData) {
-                String stackClass = element.getClassName();
-                if (stackClass != null && stackClass.startsWith(originalLoggerCallerClassName)) {
-                    return Integer.toString(element.getLineNumber());
-                }
-            }
-        }
-        // In case we didn't find the right line number from the caller, fall back to logback's solution.
-        return super.convert(event);
-    }
-}
diff --git a/base/log/src/main/java/org/artifactory/logging/layout/BackTracePatternLayout.java b/base/log/src/main/java/org/artifactory/logging/layout/BackTracePatternLayout.java
deleted file mode 100644
index 7830870..0000000
--- a/base/log/src/main/java/org/artifactory/logging/layout/BackTracePatternLayout.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.logging.layout;
-
-import ch.qos.logback.classic.PatternLayout;
-import org.artifactory.logging.converter.BackTraceLineOfCallerConverter;
-
-import java.util.Map;
-
-/**
- * Use a custom pattern layout when for the logger that replaces the default {@code LineOfCallerConverter} with {@code
- * ArtifactoryLineOfCallerConverter} to extract the correct line number
- *
- * @author Tomer Cohen
- */
-public class BackTracePatternLayout extends PatternLayout {
-
-    /**
-     * Get the default converter map and replace the line number attribute (namely "L" and "line") from the default
-     * converter to Artifactory's
-     *
-     * @return The default modified converter map.
-     */
-    @Override
-    public Map<String, String> getDefaultConverterMap() {
-        Map<String, String> map = super.getDefaultConverterMap();
-        map.put("L", BackTraceLineOfCallerConverter.class.getName());
-        map.put("line", BackTraceLineOfCallerConverter.class.getName());
-        return map;
-    }
-}
diff --git a/base/log/src/main/resources/logback.xml b/base/log/src/main/resources/logback.xml
deleted file mode 100644
index 84369d1..0000000
--- a/base/log/src/main/resources/logback.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<!--
-    Minimal settings required to startup jetty with.
-    Other appenders and categories are reconfigured later using the logback configurer.
-    Needs to be in a module not shared with CLI, or multiple config warnings will be emmitted.
--->
-<configuration debug="false">
-    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
-            <layout class="org.artifactory.logging.layout.BackTracePatternLayout">
-                <pattern>%date [%-5level] \(%-20c{3}:%L\) %message%n</pattern>
-            </layout>
-        </encoder>
-    </appender>
-
-    <logger name="/artifactory">
-        <level value="INFO"/>
-        <appender-ref ref="CONSOLE"/>
-    </logger>
-    <logger name="org.eclipse.jetty">
-        <level value="WARN"/>
-        <appender-ref ref="CONSOLE"/>
-    </logger>
-</configuration>
\ No newline at end of file
diff --git a/base/papi/pom.xml b/base/papi/pom.xml
deleted file mode 100644
index f7e4638..0000000
--- a/base/papi/pom.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0          http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>artifactory-papi</artifactId>
-    <packaging>jar</packaging>
-    <name>Artifactory Public API</name>
-
-    <parent>
-        <artifactId>artifactory-base-parent</artifactId>
-        <groupId>org.artifactory</groupId>
-        <version>4.8.0</version>
-    </parent>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-log</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.jfrog.buildinfo</groupId>
-            <artifactId>build-info-api</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.testng</groupId>
-            <artifactId>testng</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-javadoc-plugin</artifactId>
-                <configuration>
-                    <skip>false</skip>
-                    <doctitle>${project.name} ${project.version}</doctitle>
-                    <windowtitle>${project.name} ${project.version}</windowtitle>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/base/papi/src/main/java/org/artifactory/addon/plugin/InfoEnabledPlugin.java b/base/papi/src/main/java/org/artifactory/addon/plugin/InfoEnabledPlugin.java
deleted file mode 100644
index 4ece2d5..0000000
--- a/base/papi/src/main/java/org/artifactory/addon/plugin/InfoEnabledPlugin.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin;
-
-import javax.annotation.Nonnull;
-import java.util.List;
-
-/**
- * @author Noam Y. Tenne
- */
-public interface InfoEnabledPlugin {
-
-    @Nonnull
-    List<PluginInfo> getPluginInfo();
-
-    @Nonnull
-    String getType();
-}
diff --git a/base/papi/src/main/java/org/artifactory/addon/plugin/Plugin.java b/base/papi/src/main/java/org/artifactory/addon/plugin/Plugin.java
deleted file mode 100644
index ec95aa5..0000000
--- a/base/papi/src/main/java/org/artifactory/addon/plugin/Plugin.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin;
-
-import java.io.Serializable;
-
-/**
- * Marker interface for all plugins
- *
- * @author yoav
- */
-public interface Plugin<T> extends Serializable {
-}
\ No newline at end of file
diff --git a/base/papi/src/main/java/org/artifactory/addon/plugin/PluginInfo.java b/base/papi/src/main/java/org/artifactory/addon/plugin/PluginInfo.java
deleted file mode 100644
index 07cdc3f..0000000
--- a/base/papi/src/main/java/org/artifactory/addon/plugin/PluginInfo.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin;
-
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Basic user plugin info
- *
- * @author Noam Y. Tenne
- */
-public class PluginInfo implements Serializable {
-
-    private String name;
-    private String version = "undefined";
-    private String description;
-    private Set<String> permittedUsers = Sets.newHashSet();
-    private Set<String> permittedGroups = Sets.newHashSet();
-    private Map params = Maps.newHashMap();
-    private String httpMethod = "POST";
-
-    /**
-     * @param name                Name of plugin (applicable to executions and jobs)
-     * @param pluginClosureParams Parameters given to the closure constructor
-     */
-    public PluginInfo(String name, Map pluginClosureParams) {
-        this.name = name;
-        if ((pluginClosureParams != null) && !pluginClosureParams.isEmpty()) {
-            if (pluginClosureParams.containsKey("version")) {
-                version = pluginClosureParams.get("version").toString();
-            }
-            if (pluginClosureParams.containsKey("description")) {
-                description = pluginClosureParams.get("description").toString();
-            }
-            if (pluginClosureParams.containsKey("httpMethod")) {
-                httpMethod = pluginClosureParams.get("httpMethod").toString();
-            }
-            if (pluginClosureParams.containsKey("users")) {
-                Object users = pluginClosureParams.get("users");
-                if (users instanceof Collection) {
-                    permittedUsers.addAll(((Collection) users));
-                } else {
-                    permittedUsers.add(users.toString());
-                }
-            }
-            if (pluginClosureParams.containsKey("groups")) {
-                Object groups = pluginClosureParams.get("groups");
-                if (groups instanceof Collection) {
-                    permittedGroups.addAll(((Collection) groups));
-                } else {
-                    permittedGroups.add(groups.toString());
-                }
-            }
-            if (pluginClosureParams.containsKey("params")) {
-                Object paramsFromClosureConfig = pluginClosureParams.get("params");
-                params.putAll((Map) paramsFromClosureConfig);
-            }
-        }
-    }
-
-    public String getHttpMethod() {
-        return httpMethod;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public boolean isUserPermitted(String user) {
-        return permittedUsers.contains(user);
-    }
-
-    public boolean isGroupPermitted(String group) {
-        return permittedGroups.contains(group);
-    }
-
-    public Map getParams() {
-        return params;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof PluginInfo)) {
-            return false;
-        }
-
-        PluginInfo that = (PluginInfo) o;
-
-        if (description != null ? !description.equals(that.description) : that.description != null) {
-            return false;
-        }
-        if (httpMethod != null ? !httpMethod.equals(that.httpMethod) : that.httpMethod != null) {
-            return false;
-        }
-        if (name != null ? !name.equals(that.name) : that.name != null) {
-            return false;
-        }
-        if (params != null ? !params.equals(that.params) : that.params != null) {
-            return false;
-        }
-        if (permittedGroups != null ? !permittedGroups.equals(that.permittedGroups) : that.permittedGroups != null) {
-            return false;
-        }
-        if (permittedUsers != null ? !permittedUsers.equals(that.permittedUsers) : that.permittedUsers != null) {
-            return false;
-        }
-        if (version != null ? !version.equals(that.version) : that.version != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = name != null ? name.hashCode() : 0;
-        result = 31 * result + (version != null ? version.hashCode() : 0);
-        result = 31 * result + (description != null ? description.hashCode() : 0);
-        result = 31 * result + (httpMethod != null ? httpMethod.hashCode() : 0);
-        result = 31 * result + (permittedUsers != null ? permittedUsers.hashCode() : 0);
-        result = 31 * result + (permittedGroups != null ? permittedGroups.hashCode() : 0);
-        result = 31 * result + (params != null ? params.hashCode() : 0);
-        return result;
-    }
-}
diff --git a/base/papi/src/main/java/org/artifactory/build/Artifact.java b/base/papi/src/main/java/org/artifactory/build/Artifact.java
deleted file mode 100644
index 3cf62d1..0000000
--- a/base/papi/src/main/java/org/artifactory/build/Artifact.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.build;
-
-import org.artifactory.fs.FileInfo;
-import org.jfrog.build.api.builder.ArtifactBuilder;
-
-import javax.annotation.Nonnull;
-
-/**
- * A basic build run info holder
- *
- * @author Noam Y. Tenne
- */
-public final class Artifact extends BuildFile {
-
-    private org.jfrog.build.api.Artifact artifact;
-
-    Artifact(@Nonnull org.jfrog.build.api.Artifact artifact) {
-        super(artifact);
-        this.artifact = artifact;
-    }
-
-    public Artifact(@Nonnull FileInfo fileInfo, @Nonnull String type) {
-        this(new ArtifactBuilder(fileInfo.getName()).md5(fileInfo.getMd5()).sha1(fileInfo.getSha1()).type(type)
-                .build());
-    }
-
-    public String getName() {
-        return artifact.getName();
-    }
-
-    @Nonnull
-    org.jfrog.build.api.Artifact getBuildArtifact() {
-        return artifact;
-    }
-}
\ No newline at end of file
diff --git a/base/papi/src/main/java/org/artifactory/build/ArtifactList.java b/base/papi/src/main/java/org/artifactory/build/ArtifactList.java
deleted file mode 100644
index dfac1ae..0000000
--- a/base/papi/src/main/java/org/artifactory/build/ArtifactList.java
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.build;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-
-/**
- * @author Noam Y. Tenne
- */
-public class ArtifactList implements List<Artifact> {
-
-    private List<org.jfrog.build.api.Artifact> artifactList;
-
-    ArtifactList(List<org.jfrog.build.api.Artifact> artifactList) {
-        this.artifactList = artifactList;
-    }
-
-    @Override
-    public int size() {
-        return artifactList.size();
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return artifactList.isEmpty();
-    }
-
-    @Override
-    public boolean contains(Object o) {
-        return artifactList.contains(((Artifact) o).getBuildArtifact());
-    }
-
-    @Override
-    public Iterator<Artifact> iterator() {
-        final Iterator<org.jfrog.build.api.Artifact> iterator = artifactList.iterator();
-        return new Iterator<Artifact>() {
-
-            @Override
-            public boolean hasNext() {
-                return iterator.hasNext();
-            }
-
-            @Override
-            public Artifact next() {
-                return new Artifact(iterator.next());
-            }
-
-            @Override
-            public void remove() {
-                iterator.remove();
-            }
-        };
-    }
-
-    @Override
-    public Object[] toArray() {
-        Object[] array = new Object[artifactList.size()];
-        for (int i = 0; i < artifactList.size(); i++) {
-            array[i] = new Artifact(artifactList.get(i));
-        }
-        return array;
-    }
-
-    @Override
-    public <T> T[] toArray(T[] a) {
-        Object[] array = toArray();
-        for (int i = 0; i < array.length; i++) {
-            a[i] = ((T) array[i]);
-        }
-        return a;
-    }
-
-    @Override
-    public boolean add(Artifact artifact) {
-        return artifactList.add(artifact.getBuildArtifact());
-    }
-
-    @Override
-    public boolean remove(Object o) {
-        return artifactList.remove(((Artifact) o).getBuildArtifact());
-    }
-
-    @Override
-    public boolean containsAll(Collection<?> c) {
-        return artifactList.containsAll(Lists.newArrayList(Iterables.transform(c, new Function<Object, Object>() {
-            @Override
-            public Object apply(Object input) {
-                return ((Artifact) input).getBuildArtifact();
-            }
-        })));
-    }
-
-    @Override
-    public boolean addAll(Collection<? extends Artifact> c) {
-        return artifactList.addAll(Lists.newArrayList(Iterables.transform(c,
-                new Function<Object, org.jfrog.build.api.Artifact>() {
-                    @Override
-                    public org.jfrog.build.api.Artifact apply(Object input) {
-                        return ((Artifact) input).getBuildArtifact();
-                    }
-                })));
-    }
-
-    @Override
-    public boolean addAll(int index, Collection<? extends Artifact> c) {
-        return artifactList.addAll(index, Lists.newArrayList(Iterables.transform(c,
-                new Function<Object, org.jfrog.build.api.Artifact>() {
-                    @Override
-                    public org.jfrog.build.api.Artifact apply(Object input) {
-                        return ((Artifact) input).getBuildArtifact();
-                    }
-                })));
-    }
-
-    @Override
-    public boolean removeAll(Collection<?> c) {
-        return artifactList.removeAll(Lists.newArrayList(Iterables.transform(c, new Function<Object, Object>() {
-            @Override
-            public Object apply(Object input) {
-                return ((Artifact) input).getBuildArtifact();
-            }
-        })));
-    }
-
-    @Override
-    public boolean retainAll(Collection<?> c) {
-        return artifactList.retainAll(Lists.newArrayList(Iterables.transform(c, new Function<Object, Object>() {
-            @Override
-            public Object apply(Object input) {
-                return ((Artifact) input).getBuildArtifact();
-            }
-        })));
-    }
-
-    @Override
-    public void clear() {
-        artifactList.clear();
-    }
-
-    @Override
-    public Artifact get(int index) {
-        return new Artifact(artifactList.get(index));
-    }
-
-    @Override
-    public Artifact set(int index, Artifact element) {
-        org.jfrog.build.api.Artifact artifact = artifactList.set(index, element.getBuildArtifact());
-        if (artifact == null) {
-            return null;
-        }
-        return new Artifact(artifact);
-    }
-
-    @Override
-    public void add(int index, Artifact element) {
-        artifactList.add(index, element.getBuildArtifact());
-    }
-
-    @Override
-    public Artifact remove(int index) {
-        org.jfrog.build.api.Artifact removed = artifactList.remove(index);
-        if (removed == null) {
-            return null;
-        }
-        return new Artifact(removed);
-    }
-
-    @Override
-    public int indexOf(Object o) {
-        return artifactList.indexOf(((Artifact) o).getBuildArtifact());
-    }
-
-    @Override
-    public int lastIndexOf(Object o) {
-        return artifactList.lastIndexOf(((Artifact) o).getBuildArtifact());
-    }
-
-    @Override
-    public ListIterator<Artifact> listIterator() {
-        return new ArtifactListIterator(artifactList.listIterator());
-    }
-
-    @Override
-    public ListIterator<Artifact> listIterator(int index) {
-        return new ArtifactListIterator(artifactList.listIterator(index));
-    }
-
-    @Override
-    public List<Artifact> subList(int fromIndex, int toIndex) {
-        return Lists.newArrayList(Iterables.transform(artifactList.subList(fromIndex, toIndex),
-                new Function<org.jfrog.build.api.Artifact, Artifact>() {
-                    @Override
-                    public Artifact apply(org.jfrog.build.api.Artifact input) {
-                        return new Artifact(input);
-                    }
-                }));
-    }
-
-    private class ArtifactListIterator implements ListIterator<Artifact> {
-
-        private ListIterator<org.jfrog.build.api.Artifact> artifactListIterator;
-
-        public ArtifactListIterator(ListIterator<org.jfrog.build.api.Artifact> artifactListIterator) {
-            this.artifactListIterator = artifactListIterator;
-        }
-
-        @Override
-        public boolean hasNext() {
-            return artifactListIterator.hasNext();
-        }
-
-        @Override
-        public Artifact next() {
-            return new Artifact(artifactListIterator.next());
-        }
-
-        @Override
-        public boolean hasPrevious() {
-            return artifactListIterator.hasPrevious();
-        }
-
-        @Override
-        public Artifact previous() {
-            return new Artifact(artifactListIterator.previous());
-        }
-
-        @Override
-        public int nextIndex() {
-            return artifactListIterator.nextIndex();
-        }
-
-        @Override
-        public int previousIndex() {
-            return artifactListIterator.previousIndex();
-        }
-
-        @Override
-        public void remove() {
-            artifactListIterator.remove();
-        }
-
-        @Override
-        public void set(Artifact artifact) {
-            artifactListIterator.set(artifact.getBuildArtifact());
-        }
-
-        @Override
-        public void add(Artifact artifact) {
-            artifactListIterator.add(artifact.getBuildArtifact());
-        }
-    }
-}
diff --git a/base/papi/src/main/java/org/artifactory/build/BuildFile.java b/base/papi/src/main/java/org/artifactory/build/BuildFile.java
deleted file mode 100644
index 17b7138..0000000
--- a/base/papi/src/main/java/org/artifactory/build/BuildFile.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.build;
-
-import org.jfrog.build.api.BaseBuildFileBean;
-
-import java.io.Serializable;
-
-/**
- * A basic build run info holder
- *
- * @author Noam Y. Tenne
- */
-abstract class BuildFile implements Serializable {
-
-    private BaseBuildFileBean buildFile;
-
-    protected BuildFile(BaseBuildFileBean buildFile) {
-        this.buildFile = buildFile;
-    }
-
-    public String getType() {
-        return buildFile.getType();
-    }
-
-    public String getSha1() {
-        return buildFile.getSha1();
-    }
-
-    public String getMd5() {
-        return buildFile.getMd5();
-    }
-}
\ No newline at end of file
diff --git a/base/papi/src/main/java/org/artifactory/build/BuildRun.java b/base/papi/src/main/java/org/artifactory/build/BuildRun.java
deleted file mode 100644
index 1c49448..0000000
--- a/base/papi/src/main/java/org/artifactory/build/BuildRun.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.build;
-
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * A basic build run info holder
- *
- * @author Noam Y. Tenne
- */
-public interface BuildRun extends Serializable {
-
-    String getName();
-
-    String getNumber();
-
-    String getStarted();
-
-    Date getStartedDate();
-
-    String getCiUrl();
-
-    String getReleaseStatus();
-
-    @Override
-    String toString();
-}
\ No newline at end of file
diff --git a/base/papi/src/main/java/org/artifactory/build/Builds.java b/base/papi/src/main/java/org/artifactory/build/Builds.java
deleted file mode 100644
index 5b51d89..0000000
--- a/base/papi/src/main/java/org/artifactory/build/Builds.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.build;
-
-import org.artifactory.common.StatusHolder;
-import org.artifactory.fs.FileInfo;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Noam Y. Tenne
- */
-public interface Builds {
-
-    /**
-     * @return a list of the names of all builds deployed to Artifactory
-     */
-    List<String> getBuildNames();
-
-    /**
-     * Retrieve builds
-     *
-     * @param name    Builds name
-     * @param number  An optional build number - can be null to retrieve all builds
-     * @param started An optional start time
-     * @return
-     */
-    @Nonnull
-    List<BuildRun> getBuilds(@Nonnull String name, @Nullable String number, @Nullable String started);
-
-    /**
-     * @param buildRun A lightweight build run
-     * @return Detailed build run details
-     */
-    @Nullable
-    DetailedBuildRun getDetailedBuild(@Nonnull BuildRun buildRun);
-
-    /**
-     * Removes the build of the given details. Build artifacts or dependencies are not removed.
-     *
-     * @param buildRun Build info details
-     * @return Operation status holder
-     */
-    @Nonnull
-    StatusHolder deleteBuild(@Nonnull BuildRun buildRun);
-
-    /**
-     * Locates the file info objects of all the given build's produced artifacts
-     *
-     * @param buildRun Build run to locate artifacts of
-     * @return All found artifact file infos
-     */
-    @Nonnull
-    Set<FileInfo> getArtifactFiles(@Nonnull BuildRun buildRun);
-
-    /**
-     * Saves or updates the given build configuration
-     *
-     * @param detailedBuildRun Build configuration to save
-     */
-    void saveBuild(@Nonnull DetailedBuildRun detailedBuildRun);
-}
diff --git a/base/papi/src/main/java/org/artifactory/build/Dependency.java b/base/papi/src/main/java/org/artifactory/build/Dependency.java
deleted file mode 100644
index 611cc93..0000000
--- a/base/papi/src/main/java/org/artifactory/build/Dependency.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.build;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.util.PathUtils;
-import org.jfrog.build.api.builder.DependencyBuilder;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.Set;
-
-/**
- * A basic build run info holder
- *
- * @author Noam Y. Tenne
- */
-public final class Dependency extends BuildFile {
-
-    private org.jfrog.build.api.Dependency dependency;
-
-    Dependency(@Nonnull org.jfrog.build.api.Dependency dependency) {
-        super(dependency);
-        this.dependency = dependency;
-    }
-
-    public Dependency(@Nonnull String id, @Nonnull FileInfo fileInfo, @Nonnull Set<String> scopes,
-            @Nullable String type) {
-        this(new DependencyBuilder().id(id).md5(fileInfo.getMd5()).sha1(fileInfo.getSha1()).scopes(scopes)
-                .type(StringUtils.isNotBlank(type) ? type : PathUtils.getExtension(fileInfo.getName())).build());
-    }
-
-    public String getId() {
-        return dependency.getId();
-    }
-
-    public Set<String> getScopes() {
-        return dependency.getScopes();
-    }
-
-    @Nonnull
-    org.jfrog.build.api.Dependency getBuildDependency() {
-        return dependency;
-    }
-}
\ No newline at end of file
diff --git a/base/papi/src/main/java/org/artifactory/build/DependencyList.java b/base/papi/src/main/java/org/artifactory/build/DependencyList.java
deleted file mode 100644
index 49f1cbe..0000000
--- a/base/papi/src/main/java/org/artifactory/build/DependencyList.java
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.build;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-
-/**
- * @author Noam Y. Tenne
- */
-public class DependencyList implements List<Dependency> {
-
-    private List<org.jfrog.build.api.Dependency> dependencyList;
-
-    DependencyList(List<org.jfrog.build.api.Dependency> dependencyList) {
-        this.dependencyList = dependencyList;
-    }
-
-    @Override
-    public int size() {
-        return dependencyList.size();
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return dependencyList.isEmpty();
-    }
-
-    @Override
-    public boolean contains(Object o) {
-        return dependencyList.contains(((Dependency) o).getBuildDependency());
-    }
-
-    @Override
-    public Iterator<Dependency> iterator() {
-        final Iterator<org.jfrog.build.api.Dependency> iterator = dependencyList.iterator();
-        return new Iterator<Dependency>() {
-
-            @Override
-            public boolean hasNext() {
-                return iterator.hasNext();
-            }
-
-            @Override
-            public Dependency next() {
-                return new Dependency(iterator.next());
-            }
-
-            @Override
-            public void remove() {
-                iterator.remove();
-            }
-        };
-    }
-
-    @Override
-    public Object[] toArray() {
-        Object[] array = new Object[dependencyList.size()];
-        for (int i = 0; i < dependencyList.size(); i++) {
-            array[i] = new Dependency(dependencyList.get(i));
-        }
-        return array;
-    }
-
-    @Override
-    public <T> T[] toArray(T[] a) {
-        Object[] array = toArray();
-        for (int i = 0; i < array.length; i++) {
-            a[i] = ((T) array[i]);
-        }
-        return a;
-    }
-
-    @Override
-    public boolean add(Dependency dependency) {
-        return dependencyList.add(dependency.getBuildDependency());
-    }
-
-    @Override
-    public boolean remove(Object o) {
-        return dependencyList.remove(((Dependency) o).getBuildDependency());
-    }
-
-    @Override
-    public boolean containsAll(Collection<?> c) {
-        return dependencyList.containsAll(Lists.newArrayList(Iterables.transform(c, new Function<Object, Object>() {
-            @Override
-            public Object apply(Object input) {
-                return ((Dependency) input).getBuildDependency();
-            }
-        })));
-    }
-
-    @Override
-    public boolean addAll(Collection<? extends Dependency> c) {
-        return dependencyList.addAll(Lists.newArrayList(Iterables.transform(c,
-                new Function<Object, org.jfrog.build.api.Dependency>() {
-                    @Override
-                    public org.jfrog.build.api.Dependency apply(Object input) {
-                        return ((Dependency) input).getBuildDependency();
-                    }
-                })));
-    }
-
-    @Override
-    public boolean addAll(int index, Collection<? extends Dependency> c) {
-        return dependencyList.addAll(index, Lists.newArrayList(Iterables.transform(c,
-                new Function<Object, org.jfrog.build.api.Dependency>() {
-                    @Override
-                    public org.jfrog.build.api.Dependency apply(Object input) {
-                        return ((Dependency) input).getBuildDependency();
-                    }
-                })));
-    }
-
-    @Override
-    public boolean removeAll(Collection<?> c) {
-        return dependencyList.removeAll(Lists.newArrayList(Iterables.transform(c, new Function<Object, Object>() {
-            @Override
-            public Object apply(Object input) {
-                return ((Dependency) input).getBuildDependency();
-            }
-        })));
-    }
-
-    @Override
-    public boolean retainAll(Collection<?> c) {
-        return dependencyList.retainAll(Lists.newArrayList(Iterables.transform(c, new Function<Object, Object>() {
-            @Override
-            public Object apply(Object input) {
-                return ((Dependency) input).getBuildDependency();
-            }
-        })));
-    }
-
-    @Override
-    public void clear() {
-        dependencyList.clear();
-    }
-
-    @Override
-    public Dependency get(int index) {
-        return new Dependency(dependencyList.get(index));
-    }
-
-    @Override
-    public Dependency set(int index, Dependency element) {
-        org.jfrog.build.api.Dependency dependency = dependencyList.set(index, element.getBuildDependency());
-        if (dependency == null) {
-            return null;
-        }
-        return new Dependency(dependency);
-    }
-
-    @Override
-    public void add(int index, Dependency element) {
-        dependencyList.add(index, element.getBuildDependency());
-    }
-
-    @Override
-    public Dependency remove(int index) {
-        org.jfrog.build.api.Dependency removed = dependencyList.remove(index);
-        if (removed == null) {
-            return null;
-        }
-        return new Dependency(removed);
-    }
-
-    @Override
-    public int indexOf(Object o) {
-        return dependencyList.indexOf(((Dependency) o).getBuildDependency());
-    }
-
-    @Override
-    public int lastIndexOf(Object o) {
-        return dependencyList.lastIndexOf(((Dependency) o).getBuildDependency());
-    }
-
-    @Override
-    public ListIterator<Dependency> listIterator() {
-        return new DependencyListIterator(dependencyList.listIterator());
-    }
-
-    @Override
-    public ListIterator<Dependency> listIterator(int index) {
-        return new DependencyListIterator(dependencyList.listIterator(index));
-    }
-
-    @Override
-    public List<Dependency> subList(int fromIndex, int toIndex) {
-        return Lists.newArrayList(Iterables.transform(dependencyList.subList(fromIndex, toIndex),
-                new Function<org.jfrog.build.api.Dependency, Dependency>() {
-                    @Override
-                    public Dependency apply(org.jfrog.build.api.Dependency input) {
-                        return new Dependency(input);
-                    }
-                }));
-    }
-
-    private class DependencyListIterator implements ListIterator<Dependency> {
-
-        private ListIterator<org.jfrog.build.api.Dependency> dependencyListIterator;
-
-        public DependencyListIterator(ListIterator<org.jfrog.build.api.Dependency> dependencyListIterator) {
-            this.dependencyListIterator = dependencyListIterator;
-        }
-
-        @Override
-        public boolean hasNext() {
-            return dependencyListIterator.hasNext();
-        }
-
-        @Override
-        public Dependency next() {
-            return new Dependency(dependencyListIterator.next());
-        }
-
-        @Override
-        public boolean hasPrevious() {
-            return dependencyListIterator.hasPrevious();
-        }
-
-        @Override
-        public Dependency previous() {
-            return new Dependency(dependencyListIterator.previous());
-        }
-
-        @Override
-        public int nextIndex() {
-            return dependencyListIterator.nextIndex();
-        }
-
-        @Override
-        public int previousIndex() {
-            return dependencyListIterator.previousIndex();
-        }
-
-        @Override
-        public void remove() {
-            dependencyListIterator.remove();
-        }
-
-        @Override
-        public void set(Dependency dependency) {
-            dependencyListIterator.set(dependency.getBuildDependency());
-        }
-
-        @Override
-        public void add(Dependency dependency) {
-            dependencyListIterator.add(dependency.getBuildDependency());
-        }
-    }
-}
diff --git a/base/papi/src/main/java/org/artifactory/build/DetailedBuildRun.java b/base/papi/src/main/java/org/artifactory/build/DetailedBuildRun.java
deleted file mode 100644
index d26f411..0000000
--- a/base/papi/src/main/java/org/artifactory/build/DetailedBuildRun.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.build;
-
-import javax.annotation.Nonnull;
-import java.util.List;
-
-/**
- * A detailed build run info holder
- *
- * @author Noam Y. Tenne
- */
-public interface DetailedBuildRun extends BuildRun {
-    String getBuildAgent();
-
-    String getAgent();
-
-    long getDurationMillis();
-
-    String getPrincipal();
-
-    String getArtifactoryPrincipal();
-
-    String getUrl();
-
-    String getParentName();
-
-    String getParentNumber();
-
-    String getVcsRevision();
-
-    @Nonnull
-    List<Module> getModules();
-
-    /**
-     * Copies a build
-     *
-     * @param buildNumber
-     * @return
-     */
-    @Nonnull
-    DetailedBuildRun copy();
-
-    /**
-     * Copies a build with a new build number
-     *
-     * @param buildNumber
-     * @return
-     */
-    @Nonnull
-    DetailedBuildRun copy(String buildNumber);
-
-    List<ReleaseStatus> getReleaseStatuses();
-}
diff --git a/base/papi/src/main/java/org/artifactory/build/Module.java b/base/papi/src/main/java/org/artifactory/build/Module.java
deleted file mode 100644
index 0d21794..0000000
--- a/base/papi/src/main/java/org/artifactory/build/Module.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.build;
-
-
-import com.google.common.collect.Lists;
-
-import javax.annotation.Nonnull;
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * A build module holder. Contains artifacts and dependencies.
- *
- * @author Noam Y. Tenne
- */
-public final class Module implements Serializable {
-
-    private org.jfrog.build.api.Module module;
-
-    public Module(@Nonnull org.jfrog.build.api.Module module) {
-        this.module = module;
-    }
-
-    public String getId() {
-        return module.getId();
-    }
-
-    public void setId(String id) {
-        module.setId(id);
-    }
-
-    @Nonnull
-    public List<Artifact> getArtifacts() {
-        List<org.jfrog.build.api.Artifact> moduleArtifacts = module.getArtifacts();
-        if (moduleArtifacts == null) {
-            moduleArtifacts = Lists.newArrayList();
-            module.setArtifacts(moduleArtifacts);
-        }
-        return new ArtifactList(moduleArtifacts);
-    }
-
-    @Nonnull
-    public List<Dependency> getDependencies() {
-        List<org.jfrog.build.api.Dependency> moduleDependencies = module.getDependencies();
-        if (moduleDependencies == null) {
-            moduleDependencies = Lists.newArrayList();
-            module.setDependencies(moduleDependencies);
-        }
-        return new DependencyList(moduleDependencies);
-    }
-}
\ No newline at end of file
diff --git a/base/papi/src/main/java/org/artifactory/build/ReleaseStatus.java b/base/papi/src/main/java/org/artifactory/build/ReleaseStatus.java
deleted file mode 100644
index bd24bee..0000000
--- a/base/papi/src/main/java/org/artifactory/build/ReleaseStatus.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.build;
-
-import org.jfrog.build.api.builder.PromotionStatusBuilder;
-import org.jfrog.build.api.release.PromotionStatus;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * @author Noam Y. Tenne
- */
-public class ReleaseStatus implements Serializable {
-
-    private PromotionStatus promotionStatus;
-
-    public ReleaseStatus(@Nonnull String status, @Nullable String comment, @Nullable String repository,
-            @Nullable String ciUser, @Nullable String artifactoryUser) {
-        this(new PromotionStatusBuilder(status).timestampDate(new Date()).comment(comment).repository(repository)
-                .ciUser(ciUser).user(artifactoryUser).build());
-    }
-
-    ReleaseStatus(PromotionStatus promotionStatus) {
-        this.promotionStatus = promotionStatus;
-    }
-
-    @Nonnull
-    public String getStatus() {
-        return promotionStatus.getStatus();
-    }
-
-    @Nonnull
-    public String getTimestamp() {
-        return promotionStatus.getTimestamp();
-    }
-
-    @Nonnull
-    public Date getTimestampDate() {
-        return promotionStatus.getTimestampDate();
-    }
-
-    @Nullable
-    public String getComment() {
-        return promotionStatus.getComment();
-    }
-
-    @Nullable
-    public String getRepository() {
-        return promotionStatus.getRepository();
-    }
-
-    @Nullable
-    public String getCiUser() {
-        return promotionStatus.getCiUser();
-    }
-
-    @Nullable
-    public String getArtifactoryUser() {
-        return promotionStatus.getUser();
-    }
-
-    @Nonnull
-    PromotionStatus getPromotionStatus() {
-        return promotionStatus;
-    }
-}
diff --git a/base/papi/src/main/java/org/artifactory/build/ReleaseStatusList.java b/base/papi/src/main/java/org/artifactory/build/ReleaseStatusList.java
deleted file mode 100644
index 3457c4e..0000000
--- a/base/papi/src/main/java/org/artifactory/build/ReleaseStatusList.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.build;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import org.jfrog.build.api.release.PromotionStatus;
-
-import javax.annotation.Nullable;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-
-/**
- * @author Noam Y. Tenne
- */
-public class ReleaseStatusList implements List<ReleaseStatus> {
-
-    private List<PromotionStatus> promotionStatusList;
-
-    ReleaseStatusList(List<PromotionStatus> promotionStatusList) {
-        this.promotionStatusList = promotionStatusList;
-    }
-
-    @Override
-    public int size() {
-        return promotionStatusList.size();
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return promotionStatusList.isEmpty();
-    }
-
-    @Override
-    public boolean contains(Object o) {
-        return promotionStatusList.contains(((ReleaseStatus) o).getPromotionStatus());
-    }
-
-    @Override
-    public Iterator<ReleaseStatus> iterator() {
-        final Iterator<PromotionStatus> iterator = promotionStatusList.iterator();
-        return new Iterator<ReleaseStatus>() {
-
-            @Override
-            public boolean hasNext() {
-                return iterator.hasNext();
-            }
-
-            @Override
-            public ReleaseStatus next() {
-                return new ReleaseStatus(iterator.next());
-            }
-
-            @Override
-            public void remove() {
-                iterator.remove();
-            }
-        };
-    }
-
-    @Override
-    public Object[] toArray() {
-        Object[] array = new Object[promotionStatusList.size()];
-        for (int i = 0; i < promotionStatusList.size(); i++) {
-            array[i] = new ReleaseStatus(promotionStatusList.get(i));
-        }
-        return array;
-    }
-
-    @Override
-    public <T> T[] toArray(T[] a) {
-        Object[] array = toArray();
-        for (int i = 0; i < array.length; i++) {
-            a[i] = ((T) array[i]);
-        }
-        return a;
-    }
-
-    @Override
-    public boolean add(ReleaseStatus releaseStatus) {
-        return promotionStatusList.add(releaseStatus.getPromotionStatus());
-    }
-
-    @Override
-    public boolean remove(Object o) {
-        return promotionStatusList.remove(((ReleaseStatus) o).getPromotionStatus());
-    }
-
-    @Override
-    public boolean containsAll(Collection<?> c) {
-        return promotionStatusList.containsAll(
-                Lists.newArrayList(Iterables.transform(c, new Function<Object, Object>() {
-                    @Override
-                    public Object apply(Object input) {
-                        return ((ReleaseStatus) input).getPromotionStatus();
-                    }
-                })));
-    }
-
-    @Override
-    public boolean addAll(Collection<? extends ReleaseStatus> c) {
-        return promotionStatusList.addAll(Lists.newArrayList(Iterables.transform(c,
-                new Function<Object, PromotionStatus>() {
-                    @Override
-                    public PromotionStatus apply(Object input) {
-                        return ((ReleaseStatus) input).getPromotionStatus();
-                    }
-                })));
-    }
-
-    @Override
-    public boolean addAll(int index, Collection<? extends ReleaseStatus> c) {
-        return promotionStatusList.addAll(index, Lists.newArrayList(Iterables.transform(c,
-                new Function<Object, PromotionStatus>() {
-                    @Override
-                    public PromotionStatus apply(Object input) {
-                        return ((ReleaseStatus) input).getPromotionStatus();
-                    }
-                })));
-    }
-
-    @Override
-    public boolean removeAll(Collection<?> c) {
-        return promotionStatusList.removeAll(Lists.newArrayList(Iterables.transform(c, new Function<Object, Object>() {
-            @Override
-            public Object apply(Object input) {
-                return ((ReleaseStatus) input).getPromotionStatus();
-            }
-        })));
-    }
-
-    @Override
-    public boolean retainAll(Collection<?> c) {
-        return promotionStatusList.retainAll(Lists.newArrayList(Iterables.transform(c, new Function<Object, Object>() {
-            @Override
-            public Object apply(Object input) {
-                return ((ReleaseStatus) input).getPromotionStatus();
-            }
-        })));
-    }
-
-    @Override
-    public void clear() {
-        promotionStatusList.clear();
-    }
-
-    @Override
-    public ReleaseStatus get(int index) {
-        return new ReleaseStatus(promotionStatusList.get(index));
-    }
-
-    @Override
-    public ReleaseStatus set(int index, ReleaseStatus element) {
-        PromotionStatus promotionStatus = promotionStatusList.set(index, element.getPromotionStatus());
-        if (promotionStatus == null) {
-            return null;
-        }
-        return new ReleaseStatus(promotionStatus);
-    }
-
-    @Override
-    public void add(int index, ReleaseStatus element) {
-        promotionStatusList.add(index, element.getPromotionStatus());
-    }
-
-    @Override
-    public ReleaseStatus remove(int index) {
-        PromotionStatus removed = promotionStatusList.remove(index);
-        if (removed == null) {
-            return null;
-        }
-        return new ReleaseStatus(removed);
-    }
-
-    @Override
-    public int indexOf(Object o) {
-        return promotionStatusList.indexOf(((ReleaseStatus) o).getPromotionStatus());
-    }
-
-    @Override
-    public int lastIndexOf(Object o) {
-        return promotionStatusList.lastIndexOf(((ReleaseStatus) o).getPromotionStatus());
-    }
-
-    @Override
-    public ListIterator<ReleaseStatus> listIterator() {
-        return new ReleaseStatusListIterator(promotionStatusList.listIterator());
-    }
-
-    @Override
-    public ListIterator<ReleaseStatus> listIterator(int index) {
-        return new ReleaseStatusListIterator(promotionStatusList.listIterator(index));
-    }
-
-    @Override
-    public List<ReleaseStatus> subList(int fromIndex, int toIndex) {
-        return Lists.newArrayList(Iterables.transform(promotionStatusList.subList(fromIndex, toIndex),
-                new Function<PromotionStatus, ReleaseStatus>() {
-                    @Override
-                    public ReleaseStatus apply(@Nullable PromotionStatus input) {
-                        return new ReleaseStatus(input);
-                    }
-                }));
-    }
-
-    private class ReleaseStatusListIterator implements ListIterator<ReleaseStatus> {
-
-        private ListIterator<PromotionStatus> promotionStatusListIterator;
-
-        public ReleaseStatusListIterator(ListIterator<PromotionStatus> promotionStatusListIterator) {
-            this.promotionStatusListIterator = promotionStatusListIterator;
-        }
-
-        @Override
-        public boolean hasNext() {
-            return promotionStatusListIterator.hasNext();
-        }
-
-        @Override
-        public ReleaseStatus next() {
-            return new ReleaseStatus(promotionStatusListIterator.next());
-        }
-
-        @Override
-        public boolean hasPrevious() {
-            return promotionStatusListIterator.hasPrevious();
-        }
-
-        @Override
-        public ReleaseStatus previous() {
-            return new ReleaseStatus(promotionStatusListIterator.previous());
-        }
-
-        @Override
-        public int nextIndex() {
-            return promotionStatusListIterator.nextIndex();
-        }
-
-        @Override
-        public int previousIndex() {
-            return promotionStatusListIterator.previousIndex();
-        }
-
-        @Override
-        public void remove() {
-            promotionStatusListIterator.remove();
-        }
-
-        @Override
-        public void set(ReleaseStatus releaseStatus) {
-            promotionStatusListIterator.set(releaseStatus.getPromotionStatus());
-        }
-
-        @Override
-        public void add(ReleaseStatus releaseStatus) {
-            promotionStatusListIterator.add(releaseStatus.getPromotionStatus());
-        }
-    }
-}
diff --git a/base/papi/src/main/java/org/artifactory/build/promotion/PromotionConfig.java b/base/papi/src/main/java/org/artifactory/build/promotion/PromotionConfig.java
deleted file mode 100644
index b459c66..0000000
--- a/base/papi/src/main/java/org/artifactory/build/promotion/PromotionConfig.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.build.promotion;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.io.Serializable;
-
-/**
- * @author Noam Y. Tenne
- */
-public class PromotionConfig implements Serializable {
-
-    private String targetRepository;
-    private String comment;
-    private String status;
-
-    public PromotionConfig(@Nonnull String targetRepository) {
-        this.targetRepository = targetRepository;
-    }
-
-    public PromotionConfig() {
-    }
-
-    @Nullable
-    public String getTargetRepository() {
-        return targetRepository;
-    }
-
-    public void setTargetRepository(@Nonnull String targetRepository) {
-        this.targetRepository = targetRepository;
-    }
-
-    @Nullable
-    public String getComment() {
-        return comment;
-    }
-
-    public void setComment(@Nullable String comment) {
-        this.comment = comment;
-    }
-
-    @Nullable
-    public String getStatus() {
-        return status;
-    }
-
-    public void setStatus(@Nullable String status) {
-        this.status = status;
-    }
-}
diff --git a/base/papi/src/main/java/org/artifactory/build/staging/BuildStagingStrategy.java b/base/papi/src/main/java/org/artifactory/build/staging/BuildStagingStrategy.java
deleted file mode 100644
index e335d8c..0000000
--- a/base/papi/src/main/java/org/artifactory/build/staging/BuildStagingStrategy.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.build.staging;
-
-import org.artifactory.build.promotion.PromotionConfig;
-
-import javax.annotation.Nullable;
-import java.io.Serializable;
-import java.util.Map;
-
-/**
- * @author Noam Y. Tenne
- */
-public class BuildStagingStrategy implements Serializable {
-
-    private Map<String, ModuleVersion> moduleVersionsMap;
-    private ModuleVersion defaultModuleVersion;
-    private VcsConfig vcsConfig;
-    private PromotionConfig promotionConfig;
-
-    @Nullable
-    public Map<String, ModuleVersion> getModuleVersionsMap() {
-        return moduleVersionsMap;
-    }
-
-    public void setModuleVersionsMap(@Nullable Map<String, ModuleVersion> moduleVersionsMap) {
-        this.moduleVersionsMap = moduleVersionsMap;
-    }
-
-    @Nullable
-    public ModuleVersion getDefaultModuleVersion() {
-        return defaultModuleVersion;
-    }
-
-    public void setDefaultModuleVersion(@Nullable ModuleVersion defaultModuleVersion) {
-        this.defaultModuleVersion = defaultModuleVersion;
-    }
-
-    @Nullable
-    public VcsConfig getVcsConfig() {
-        return vcsConfig;
-    }
-
-    public void setVcsConfig(@Nullable VcsConfig vcsConfig) {
-        this.vcsConfig = vcsConfig;
-    }
-
-    @Nullable
-    public PromotionConfig getPromotionConfig() {
-        return promotionConfig;
-    }
-
-    public void setPromotionConfig(@Nullable PromotionConfig promotionConfig) {
-        this.promotionConfig = promotionConfig;
-    }
-}
diff --git a/base/papi/src/main/java/org/artifactory/build/staging/ModuleVersion.java b/base/papi/src/main/java/org/artifactory/build/staging/ModuleVersion.java
deleted file mode 100644
index bb1d2a3..0000000
--- a/base/papi/src/main/java/org/artifactory/build/staging/ModuleVersion.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.build.staging;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.io.Serializable;
-
-/**
- * @author Noam Y. Tenne
- */
-public class ModuleVersion implements Serializable {
-
-    private String moduleId;
-    private String nextRelease;
-    private String nextDevelopment;
-
-    public ModuleVersion(@Nonnull String moduleId, @Nonnull String nextRelease, @Nonnull String nextDevelopment) {
-        this.moduleId = moduleId;
-        this.nextRelease = nextRelease;
-        this.nextDevelopment = nextDevelopment;
-    }
-
-    public ModuleVersion() {
-    }
-
-    @Nullable
-    public String getModuleId() {
-        return moduleId;
-    }
-
-    public void setModuleId(@Nonnull String moduleId) {
-        this.moduleId = moduleId;
-    }
-
-    @Nullable
-    public String getNextRelease() {
-        return nextRelease;
-    }
-
-    public void setNextRelease(@Nonnull String nextRelease) {
-        this.nextRelease = nextRelease;
-    }
-
-    @Nullable
-    public String getNextDevelopment() {
-        return nextDevelopment;
-    }
-
-    public void setNextDevelopment(@Nonnull String nextDevelopment) {
-        this.nextDevelopment = nextDevelopment;
-    }
-}
diff --git a/base/papi/src/main/java/org/artifactory/build/staging/VcsConfig.java b/base/papi/src/main/java/org/artifactory/build/staging/VcsConfig.java
deleted file mode 100644
index c42dbcf..0000000
--- a/base/papi/src/main/java/org/artifactory/build/staging/VcsConfig.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.build.staging;
-
-import javax.annotation.Nullable;
-import java.io.Serializable;
-
-/**
- * @author Noam Y. Tenne
- */
-public class VcsConfig implements Serializable {
-
-    private boolean useReleaseBranch;
-    private String releaseBranchName;
-    private boolean createTag;
-    private String tagUrlOrName;
-    private String tagComment;
-    private String nextDevelopmentVersionComment;
-
-    public boolean isUseReleaseBranch() {
-        return useReleaseBranch;
-    }
-
-    public void setUseReleaseBranch(boolean useReleaseBranch) {
-        this.useReleaseBranch = useReleaseBranch;
-    }
-
-    @Nullable
-    public String getReleaseBranchName() {
-        return releaseBranchName;
-    }
-
-    public void setReleaseBranchName(@Nullable String releaseBranchName) {
-        this.releaseBranchName = releaseBranchName;
-    }
-
-    public boolean isCreateTag() {
-        return createTag;
-    }
-
-    public void setCreateTag(boolean createTag) {
-        this.createTag = createTag;
-    }
-
-    @Nullable
-    public String getTagUrlOrName() {
-        return tagUrlOrName;
-    }
-
-    public void setTagUrlOrName(@Nullable String tagUrlOrName) {
-        this.tagUrlOrName = tagUrlOrName;
-    }
-
-    @Nullable
-    public String getTagComment() {
-        return tagComment;
-    }
-
-    public void setTagComment(@Nullable String tagComment) {
-        this.tagComment = tagComment;
-    }
-
-    @Nullable
-    public String getNextDevelopmentVersionComment() {
-        return nextDevelopmentVersionComment;
-    }
-
-    public void setNextDevelopmentVersionComment(@Nullable String nextDevelopmentVersionComment) {
-        this.nextDevelopmentVersionComment = nextDevelopmentVersionComment;
-    }
-}
diff --git a/base/papi/src/main/java/org/artifactory/checksum/ChecksumInfo.java b/base/papi/src/main/java/org/artifactory/checksum/ChecksumInfo.java
deleted file mode 100644
index 95e3af3..0000000
--- a/base/papi/src/main/java/org/artifactory/checksum/ChecksumInfo.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.checksum;
-
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-
-import java.io.Serializable;
-
-/**
- * Holds original and calculated values of a checksum.
- *
- * @author Yossi Shaul
- */
- at XStreamAlias("checksum")
-public class ChecksumInfo implements Serializable {
-
-    // marks a checksum type with no original checksum to be safe.
-    // this marker is used when a file is deployed and we don't have the remote
-    // checksum but we have the actual file
-    public static final String TRUSTED_FILE_MARKER = "NO_ORIG";
-
-    private final ChecksumType type;
-    private final String original;
-    private final String actual;
-
-    public ChecksumInfo(ChecksumType type, String original, String actual) {
-        this.type = type;
-        if (actual != null && !type.isValid(actual)) {
-            throw new IllegalStateException(
-                    "Actual checksum invalid " + actual + " : " + original + " for type " + type);
-        }
-        // The original checksum comes from remote servers which we can't control their formats, therefore we have to
-        // normalize the original checksum value.
-        this.original = normalize(original);
-        this.actual = actual;
-    }
-
-    public ChecksumType getType() {
-        return type;
-    }
-
-    /**
-     * @return The client (original) checksum or the actual if the checksum is marked as trusted
-     */
-    public String getOriginal() {
-        if (isMarkedAsTrusted()) {
-            return getActual();
-        } else {
-            return original;
-        }
-    }
-
-    /**
-     * @return Always returns the client (original) recorded checksum, even if it is org.artifactory.checksum.ChecksumInfo#TRUSTED_FILE_MARKER
-     */
-    public String getOriginalOrNoOrig() {
-        return original;
-    }
-
-    public String getActual() {
-        return actual;
-    }
-
-    public boolean checksumsMatch() {
-        return original != null && actual != null && (isMarkedAsTrusted() || actual.equals(original));
-    }
-
-    /**
-     * Normalize checksum value.
-     * Checksum comparisons shouldn't be case sensitive therefore we have to normalize the original checksum to lower case.
-     */
-    private String normalize(String candidate) {
-        return type.isValid(candidate) ? candidate.toLowerCase() : candidate;
-    }
-
-    /**
-     * Checks if the checksum is marked as trusted by Artifactory.
-     * <p/>
-     * For internal use only.
-     */
-    //TODO: [by yl] Remove from papi
-    public boolean isMarkedAsTrusted() {
-        return TRUSTED_FILE_MARKER.equals(original);
-    }
-
-    /**
-     * Compares checksum by type and value.
-     */
-    public boolean isIdentical(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        ChecksumInfo info = (ChecksumInfo) o;
-        if (type != info.type) {
-            return false;
-        }
-        if (actual != null ? !actual.equals(info.actual) : info.actual != null) {
-            return false;
-        }
-        if (original != null ? !original.equals(info.original) : info.original != null) {
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * Compares checksum by type only
-     */
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        ChecksumInfo info = (ChecksumInfo) o;
-        return type == info.type;
-    }
-
-    @Override
-    public int hashCode() {
-        return type.hashCode();
-    }
-
-    @Override
-    public String toString() {
-        return "ChecksumInfo{" +
-                "type=" + type +
-                ", original='" + original + '\'' +
-                ", actual='" + actual + '\'' +
-                '}';
-    }
-}
\ No newline at end of file
diff --git a/base/papi/src/main/java/org/artifactory/checksum/ChecksumType.java b/base/papi/src/main/java/org/artifactory/checksum/ChecksumType.java
deleted file mode 100644
index 9b8eb69..0000000
--- a/base/papi/src/main/java/org/artifactory/checksum/ChecksumType.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.checksum;
-
-/**
- * @author Yoav Landman
- */
-public enum ChecksumType {
-    sha1("SHA-1", ".sha1", 40),
-    md5("MD5", ".md5", 32),
-    sha256("SHA-256", ".sha256", 64);
-
-    public static final ChecksumType[] BASE_CHECKSUM_TYPES = new ChecksumType[]{sha1, md5};
-
-    private final String alg;
-    private final String ext;
-    private final int length;    // length of the hexadecimal string representation of the checksum
-    private final String validationRegex;
-
-    ChecksumType(String alg, String ext, int length) {
-        this.alg = alg;
-        this.ext = ext;
-        this.length = length;
-        this.validationRegex = "[a-fA-F0-9]{" + length + "}";
-    }
-
-    public String alg() {
-        return alg;
-    }
-
-    /**
-     * @return The filename extension of the checksum, including the dot prefix.
-     */
-    public String ext() {
-        return ext;
-    }
-
-    /**
-     * @return The length of a valid checksum for this checksum type.
-     */
-    public int length() {
-        return length;
-    }
-
-    /**
-     * @param candidate Checksum candidate
-     * @return True if this string is a checksum value for this type
-     */
-    @SuppressWarnings({"SimplifiableIfStatement"})
-    public boolean isValid(String candidate) {
-        if (candidate == null || candidate.length() != length) {
-            return false;
-        }
-        return candidate.matches(validationRegex);
-    }
-
-    /**
-     * @param filePath The checksum file path (assumed to end with the checksum extension).
-     * @return Checksum type for the given file path. Null if not found.
-     */
-    public static ChecksumType forFilePath(String filePath) {
-        if (filePath == null) {
-            return null;
-        }
-        if (filePath.endsWith(sha1.ext)) {
-            return sha1;
-        } else if (filePath.endsWith(sha256.ext)) {
-            return sha256;
-        } else if (filePath.endsWith(md5.ext)) {
-            return md5;
-        } else {
-            return null;
-        }
-    }
-
-    @Override
-    public String toString() {
-        return alg;
-    }
-
-    public static ChecksumType forAlgorithm(String algorithm) {
-        for (ChecksumType type : values()) {
-            if (type.alg.equalsIgnoreCase(algorithm)) {
-                return type;
-            }
-        }
-        throw new IllegalArgumentException("No checksum type exists for algorithm '" + algorithm + "'");
-    }
-}
diff --git a/base/papi/src/main/java/org/artifactory/checksum/ChecksumsInfo.java b/base/papi/src/main/java/org/artifactory/checksum/ChecksumsInfo.java
deleted file mode 100644
index 56a4352..0000000
--- a/base/papi/src/main/java/org/artifactory/checksum/ChecksumsInfo.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.checksum;
-
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-
-import java.io.Serializable;
-import java.util.EnumMap;
-import java.util.HashSet;
-import java.util.Set;
-
-import static org.artifactory.checksum.ChecksumInfo.TRUSTED_FILE_MARKER;
-
-/**
- * A container class to manage a collection of checksums, with isIdentical and other equals, hashCode goodies.
- *
- * @author Yoav Landman
- * @author Fred Simon
- */
- at XStreamAlias("checksumsInfo")
-public class ChecksumsInfo implements Serializable {
-
-    private final EnumMap<ChecksumType, ChecksumInfo> checksums =
-            new EnumMap<>(ChecksumType.class);
-
-    public ChecksumsInfo() {
-        // default empty constructor
-    }
-
-    public ChecksumsInfo(ChecksumsInfo other) {
-        // create a defensive copy. ChecksumInfo is immutable no need to copy.
-        if (!other.isEmpty()) {
-            for (ChecksumInfo checksum : other.getChecksums()) {
-                addChecksumInfo(checksum);
-            }
-        }
-    }
-
-    public boolean isEmpty() {
-        return checksums.isEmpty();
-    }
-
-    public int size() {
-        return checksums.size();
-    }
-
-    /**
-     * @return The actual MD5 checksum or null if not found
-     */
-    public String getMd5() {
-        ChecksumInfo md5 = getChecksumInfo(ChecksumType.md5);
-        return md5 == null ? null : md5.getActual();
-    }
-
-    /**
-     * @return The actual SHA1 checksum or null if not found
-     */
-    public String getSha1() {
-        ChecksumInfo sha1 = getChecksumInfo(ChecksumType.sha1);
-        return sha1 == null ? null : sha1.getActual();
-    }
-
-    /**
-     * @return The actual SHA256 checksum or null if not found
-     */
-    public String getSha256() {
-        ChecksumInfo sha256 = getChecksumInfo(ChecksumType.sha256);
-        return sha256 == null ? null : sha256.getActual();
-    }
-
-    public void setChecksums(Set<ChecksumInfo> checksums) {
-        if (checksums == null) {
-            throw new IllegalArgumentException("Checksums cannot be null.");
-        }
-        this.checksums.clear();
-        for (ChecksumInfo checksum : checksums) {
-            addChecksumInfo(checksum);
-        }
-    }
-
-    public Set<ChecksumInfo> getChecksums() {
-        return new HashSet<>(checksums.values());
-    }
-
-    public ChecksumInfo getChecksumInfo(ChecksumType type) {
-        return checksums.get(type);
-    }
-
-    /**
-     * Adds new checksum info. If checksum of the same type already exists it will be overridden.
-     *
-     * @param checksumInfo The checksum info to add
-     */
-    public void addChecksumInfo(ChecksumInfo checksumInfo) {
-        if (checksumInfo == null) {
-            throw new IllegalArgumentException("Nulls are not allowed");
-        }
-        checksums.put(checksumInfo.getType(), checksumInfo);
-    }
-
-    /**
-     * Replaces all checksums with null checksum values that are marked as trusted by Artifactory.
-     * <p/>
-     * For internal use only.
-     */
-    //TODO: [by yl] Remove from papi
-    public void createTrustedChecksums() {
-        for (ChecksumType type : ChecksumType.BASE_CHECKSUM_TYPES) {
-            addChecksumInfo(new ChecksumInfo(type, TRUSTED_FILE_MARKER, null));
-        }
-    }
-
-    /**
-     * Compares checksums by type and values.
-     *
-     * @param info
-     * @return
-     */
-    public boolean isIdentical(ChecksumsInfo info) {
-        if (this.checksums == info.checksums) {
-            return true;
-        }
-        if (this.checksums == null || info.checksums == null) {
-            return false;
-        }
-        // TODO: Should be this
-        //return this.checksums.equals(info.checksums);
-        if (checksums.size() != info.checksums.size()) {
-            return false;
-        }
-
-        for (ChecksumInfo other : checksums.values()) {
-            ChecksumInfo mine = info.getChecksumInfo(other.getType());
-            if (!other.isIdentical(mine)) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Compares checksums by type only.
-     *
-     * @param o
-     * @return
-     */
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        ChecksumsInfo that = (ChecksumsInfo) o;
-
-        if (checksums != null ? !checksums.equals(that.checksums) : that.checksums != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return checksums != null ? checksums.hashCode() : 0;
-    }
-
-    @Override
-    public String toString() {
-        return new StringBuilder("ChecksumsInfo").append("{checksums=").append(checksums).append('}').toString();
-    }
-}
\ No newline at end of file
diff --git a/base/papi/src/main/java/org/artifactory/common/Info.java b/base/papi/src/main/java/org/artifactory/common/Info.java
deleted file mode 100644
index 2f4a56c..0000000
--- a/base/papi/src/main/java/org/artifactory/common/Info.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.common;
-
-import java.io.Serializable;
-
-/**
- * Marker interface for serializable info objects
- */
-public interface Info extends Serializable {
-}
diff --git a/base/papi/src/main/java/org/artifactory/common/StatusEntry.java b/base/papi/src/main/java/org/artifactory/common/StatusEntry.java
deleted file mode 100644
index df8aac9..0000000
--- a/base/papi/src/main/java/org/artifactory/common/StatusEntry.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.common;
-
-import java.io.Serializable;
-
-/**
- * @author freds
- * @date Sep 25, 2008
- */
-public class StatusEntry implements Serializable {
-    private final int statusCode;
-    private final StatusEntryLevel level;
-    private final String message;
-    private final Throwable exception;
-
-    public StatusEntry(int statusCode, String message) {
-        this(statusCode, StatusEntryLevel.INFO, message, null);
-    }
-
-    public StatusEntry(int statusCode, String message, Throwable exception) {
-        this(statusCode, StatusEntryLevel.ERROR, message, exception);
-    }
-
-    public StatusEntry(int statusCode, StatusEntryLevel level, String message,
-            Throwable exception) {
-        if (level == null) {
-            throw new IllegalArgumentException("Cannot create status entry '" + message + "' with null level");
-        }
-        this.statusCode = statusCode;
-        this.level = level;
-        this.message = message;
-        this.exception = exception;
-    }
-
-    public int getStatusCode() {
-        return statusCode;
-    }
-
-    public String getMessage() {
-        return message;
-    }
-
-    public Throwable getException() {
-        return exception;
-    }
-
-    public boolean isWarning() {
-        return level.isWarning();
-    }
-
-    public boolean isError() {
-        return level.isError();
-    }
-
-    public boolean isDebug() {
-        return level.isDebug();
-    }
-
-    public boolean isInfo() {
-        return level.isInfo();
-    }
-
-    public StatusEntryLevel getLevel() {
-        return level;
-    }
-
-    @Override
-    public String toString() {
-        return "StatusMessage{" +
-                "statusCode=" + statusCode +
-                ", level=" + level.name() +
-                ", statusMsg='" + message + '\'' +
-                ", exception=" + exception +
-                '}';
-    }
-}
diff --git a/base/papi/src/main/java/org/artifactory/common/StatusEntryLevel.java b/base/papi/src/main/java/org/artifactory/common/StatusEntryLevel.java
deleted file mode 100644
index 6f32f1b..0000000
--- a/base/papi/src/main/java/org/artifactory/common/StatusEntryLevel.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.common;
-
-/**
- * @author freds
- * @date Nov 6, 2008
- */
-public enum StatusEntryLevel {
-    DEBUG, INFO, WARNING, ERROR;
-
-    public boolean isError() {
-        return this == ERROR;
-    }
-
-    public boolean isDebug() {
-        return this == DEBUG;
-    }
-
-    public boolean isInfo() {
-        return this == INFO;
-    }
-
-    public boolean isWarning() {
-        return this == WARNING;
-    }
-}
diff --git a/base/papi/src/main/java/org/artifactory/common/StatusHolder.java b/base/papi/src/main/java/org/artifactory/common/StatusHolder.java
deleted file mode 100644
index 8fc7736..0000000
--- a/base/papi/src/main/java/org/artifactory/common/StatusHolder.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.common;
-
-import org.artifactory.exception.CancelException;
-
-import java.io.Serializable;
-
-/**
- * @author Yoav Landman
- */
-public interface StatusHolder extends Serializable {
-
-    String getStatusMsg();
-
-    boolean isError();
-
-    StatusEntry getLastError();
-    StatusEntry getLastWarning();
-    StatusEntry getLastStatusEntry();
-
-    Throwable getException();
-
-    CancelException getCancelException();
-
-    int getStatusCode();
-
-    boolean isVerbose();
-}
diff --git a/base/papi/src/main/java/org/artifactory/exception/CancelException.java b/base/papi/src/main/java/org/artifactory/exception/CancelException.java
deleted file mode 100644
index c52f009..0000000
--- a/base/papi/src/main/java/org/artifactory/exception/CancelException.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.exception;
-
-/**
- * An exception used to indicate cancellation of an action with an appropriate status error code to return.
- * <p/>
- * Primarily used to reject deployment or retrieval of an item.
- *
- * @author Yoav Landman
- */
-public class CancelException extends RuntimeException {
-
-    private final int status;
-
-    public CancelException(String message, int status) {
-        this(message, null, status);
-    }
-
-    public CancelException(String message, Throwable cause, int status) {
-        super(message, cause);
-        this.status = status;
-    }
-
-
-    /**
-     * Returns the HTTP error code associated with the cancellation.
-     *
-     * @return HTTP error code
-     */
-    public int getErrorCode() {
-        return status;
-    }
-}
\ No newline at end of file
diff --git a/base/papi/src/main/java/org/artifactory/fs/FileInfo.java b/base/papi/src/main/java/org/artifactory/fs/FileInfo.java
deleted file mode 100644
index 2a7e551..0000000
--- a/base/papi/src/main/java/org/artifactory/fs/FileInfo.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.fs;
-
-import org.artifactory.checksum.ChecksumsInfo;
-import org.artifactory.resource.RepoResourceInfo;
-
-/**
- * Date: 8/1/11 Time: 7:12 PM
- *
- * @author Fred Simon
- */
-public interface FileInfo extends ItemInfo, RepoResourceInfo {
-    String ROOT = "artifactory-file";
-
-    long getAge();
-
-    String getMimeType();
-
-    @Override
-    ChecksumsInfo getChecksumsInfo();
-
-}
diff --git a/base/papi/src/main/java/org/artifactory/fs/FileLayoutInfo.java b/base/papi/src/main/java/org/artifactory/fs/FileLayoutInfo.java
deleted file mode 100644
index bb21aeb..0000000
--- a/base/papi/src/main/java/org/artifactory/fs/FileLayoutInfo.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.fs;
-
-import java.io.Serializable;
-import java.util.Map;
-
-/**
- * Module related information (group, artifact, version, etc.) for a file, as it was extracted according to the layout
- * of the repository the file is part of.
- *
- * @author Yoav Landman
- */
-public interface FileLayoutInfo extends Serializable {
-
-    String getOrganization();
-
-    String getModule();
-
-    String getBaseRevision();
-
-    String getFolderIntegrationRevision();
-
-    String getFileIntegrationRevision();
-
-    String getClassifier();
-
-    String getExt();
-
-    String getType();
-
-    Map<String, String> getCustomFields();
-
-    String getCustomField(String tokenName);
-
-    boolean isValid();
-
-    String getPrettyModuleId();
-
-    boolean isIntegration();
-}
diff --git a/base/papi/src/main/java/org/artifactory/fs/FolderInfo.java b/base/papi/src/main/java/org/artifactory/fs/FolderInfo.java
deleted file mode 100644
index d20818a..0000000
--- a/base/papi/src/main/java/org/artifactory/fs/FolderInfo.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.fs;
-
-/**
- * @author Yoav Landman
- */
-public interface FolderInfo extends ItemInfo {
-    String ROOT = "artifactory-folder";
-}
diff --git a/base/papi/src/main/java/org/artifactory/fs/ItemInfo.java b/base/papi/src/main/java/org/artifactory/fs/ItemInfo.java
deleted file mode 100644
index e968c14..0000000
--- a/base/papi/src/main/java/org/artifactory/fs/ItemInfo.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.fs;
-
-import org.artifactory.common.Info;
-import org.artifactory.repo.RepoPath;
-
-/**
- * Date: 8/1/11
- * Time: 7:13 PM
- *
- * @author Fred Simon
- */
-public interface ItemInfo extends Info, Comparable<ItemInfo> {
-    RepoPath getRepoPath();
-
-    boolean isFolder();
-
-    /**
-     * @return The file/folder name of this item
-     * @see org.artifactory.repo.RepoPath#getName()
-     */
-    String getName();
-
-    String getRepoKey();
-
-    String getRelPath();
-
-    long getCreated();
-
-    long getLastModified();
-
-    String getModifiedBy();
-
-    String getCreatedBy();
-
-    long getLastUpdated();
-
-    boolean isIdentical(ItemInfo info);
-}
diff --git a/base/papi/src/main/java/org/artifactory/fs/StatsInfo.java b/base/papi/src/main/java/org/artifactory/fs/StatsInfo.java
deleted file mode 100644
index 7ba249b..0000000
--- a/base/papi/src/main/java/org/artifactory/fs/StatsInfo.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.fs;
-
-import org.artifactory.common.Info;
-
-/**
- * Date: 8/3/11
- * Time: 1:24 PM
- *
- * @author Fred Simon
- */
-public interface StatsInfo extends Info {
-    String ROOT = "artifactory.stats";
-
-    long getDownloadCount();
-    long getLastDownloaded();
-    String getLastDownloadedBy();
-
-    long getRemoteDownloadCount();
-    long getRemoteLastDownloaded();
-    String getRemoteLastDownloadedBy();
-
-    String getPath();
-    String getOrigin();
-}
diff --git a/base/papi/src/main/java/org/artifactory/md/MetadataInfo.java b/base/papi/src/main/java/org/artifactory/md/MetadataInfo.java
deleted file mode 100644
index 1103cc5..0000000
--- a/base/papi/src/main/java/org/artifactory/md/MetadataInfo.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-import org.artifactory.resource.RepoResourceInfo;
-
-/**
- * Date: 8/1/11
- * Time: 7:08 PM
- *
- * @author Fred Simon
- */
-public interface MetadataInfo extends RepoResourceInfo {
-
-    long getCreated();
-
-    String getLastModifiedBy();
-}
diff --git a/base/papi/src/main/java/org/artifactory/md/MutablePropertiesInfo.java b/base/papi/src/main/java/org/artifactory/md/MutablePropertiesInfo.java
deleted file mode 100644
index ed5dc8d..0000000
--- a/base/papi/src/main/java/org/artifactory/md/MutablePropertiesInfo.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.Set;
-
-/**
- * Date: 8/1/11
- * Time: 7:34 PM
- *
- * @author Fred Simon
- */
-public interface MutablePropertiesInfo extends PropertiesInfo {
-    boolean putAll(@Nullable String key, Iterable<? extends String> values);
-    boolean putAll(@Nullable String key, String[] values);
-
-    @Nullable
-    Set<? extends String> replaceValues(@Nonnull String key, Iterable<? extends String> values);
-
-    void clear();
-
-    Set<String> removeAll(@Nullable Object key);
-
-    boolean put(String key, String value);
-}
diff --git a/base/papi/src/main/java/org/artifactory/md/Properties.java b/base/papi/src/main/java/org/artifactory/md/Properties.java
deleted file mode 100644
index 7dd6394..0000000
--- a/base/papi/src/main/java/org/artifactory/md/Properties.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-import com.google.common.collect.Multimap;
-import com.google.common.collect.Multiset;
-
-/**
- * A map of stringified keys and values, used for storing arbitrary key-value metadata on repository items.
- *
- * @author Yoav Landman
- */
-public interface Properties extends MutablePropertiesInfo {
-    String MATRIX_PARAMS_SEP = ";";
-    /**
-     * A mandatory property is stored as key+=val
-     */
-    String MANDATORY_SUFFIX = "+";
-
-    boolean putAll(Multimap<? extends String, ? extends String> multimap);
-
-    Multiset<String> keys();
-
-    /**
-     * @return True if there is a property with a mandatory key
-     * @see Properties#MANDATORY_SUFFIX
-     */
-    boolean hasMandatoryProperty();
-
-    MatchResult matchQuery(Properties queryProperties);
-
-    public enum MatchResult {
-        MATCH,
-        NO_MATCH,
-        CONFLICT
-    }
-}
\ No newline at end of file
diff --git a/base/papi/src/main/java/org/artifactory/md/PropertiesFactory.java b/base/papi/src/main/java/org/artifactory/md/PropertiesFactory.java
deleted file mode 100644
index d3ddaa5..0000000
--- a/base/papi/src/main/java/org/artifactory/md/PropertiesFactory.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.lang.reflect.Constructor;
-
-/**
- * A factory for creating Properties objects.
- * <p/>
- * Has runtime dependency on the core.
- *
- * @author Yoav Landman
- */
-public class PropertiesFactory {
-    private static final Logger log = LoggerFactory.getLogger(PropertiesFactory.class);
-
-    private static Constructor<?> ctor;
-
-    static {
-        try {
-            Class<?> clazz =
-                    PropertiesFactory.class.getClassLoader().loadClass(
-                            "org.artifactory.model.xstream.fs.PropertiesImpl");
-            ctor = clazz.getConstructor();
-        } catch (Exception e) {
-            log.error("Error creating the properties factory.", e);
-        }
-    }
-
-    /**
-     * @return A new empty properties instance
-     */
-    public static Properties create() {
-        try {
-            return (Properties) ctor.newInstance();
-        } catch (Exception e) {
-            throw new RuntimeException("Could create properties.", e);
-        }
-    }
-}
\ No newline at end of file
diff --git a/base/papi/src/main/java/org/artifactory/md/PropertiesInfo.java b/base/papi/src/main/java/org/artifactory/md/PropertiesInfo.java
deleted file mode 100644
index 6571914..0000000
--- a/base/papi/src/main/java/org/artifactory/md/PropertiesInfo.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-import org.artifactory.common.Info;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.Collection;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Date: 8/1/11
- * Time: 7:06 PM
- *
- * @author Fred Simon
- */
-public interface PropertiesInfo extends Info {
-    String ROOT = "properties";
-
-    int size();
-
-    @Nullable
-    Set<String> get(@Nonnull String key);
-
-    Collection<String> values();
-
-    Set<Map.Entry<String, String>> entries();
-
-    Set<String> keySet();
-
-    boolean isEmpty();
-
-    boolean containsKey(String key);
-
-    /**
-     * Returns the first value of the given key
-     *
-     * @param key Key of value
-     * @return First found value of key; null if has no values at all
-     */
-    @Nullable
-    String getFirst(@Nonnull String key);
-}
diff --git a/base/papi/src/main/java/org/artifactory/repo/HttpRepositoryConfiguration.java b/base/papi/src/main/java/org/artifactory/repo/HttpRepositoryConfiguration.java
deleted file mode 100644
index c0a098a..0000000
--- a/base/papi/src/main/java/org/artifactory/repo/HttpRepositoryConfiguration.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import java.util.List;
-
-/**
- * @author Yoav Landman
- */
-public interface HttpRepositoryConfiguration extends RepositoryConfiguration {
-    String TYPE = "remote";
-
-    int getMaxUniqueSnapshots();
-
-    boolean isSuppressPomConsistencyChecks();
-
-    boolean isHandleReleases();
-
-    boolean isHandleSnapshots();
-
-    String getUrl();
-
-    boolean isBlackedOut();
-
-    long getAssumedOfflinePeriodSecs();
-
-    boolean isFetchJarsEagerly();
-
-    boolean isFetchSourcesEagerly();
-
-    boolean isHardFail();
-
-    String getLocalAddress();
-
-    long getMissedRetrievalCachePeriodSecs();
-
-    boolean isOffline();
-
-    String getPassword();
-
-    List<String> getPropertySets();
-
-    String getProxy();
-
-    String getRemoteRepoChecksumPolicyType();
-
-    long getRetrievalCachePeriodSecs();
-
-    boolean isShareConfiguration();
-
-    int getSocketTimeoutMillis();
-
-    boolean isStoreArtifactsLocally();
-
-    boolean isSynchronizeProperties();
-
-    int getUnusedArtifactsCleanupPeriodHours();
-
-    String getUsername();
-
-    String getRemoteRepoLayoutRef();
-
-    boolean isArchiveBrowsingEnabled();
-
-    boolean isListRemoteFolderItems();
-
-    boolean isRejectInvalidJars();
-
-    boolean isAllowAnyHostAuth();
-
-    boolean isEnableCookieManagement();
-
-    boolean isEnableTokenAuthentication();
-
-    String getQueryParams();
-
-    String getBowerRegistryUrl();
-
-    String getPodsSpecsRepoUrl();
-
-    String getVcsType();
-
-    String getVcsGitProvider();
-
-    String getVcsGitDownloadUrl();
-
-    boolean isBlockMismatchingMimeTypes();
-
-    String getMismatchingMimeTypesOverrideList();
-}
diff --git a/base/papi/src/main/java/org/artifactory/repo/LocalRepositoryConfiguration.java b/base/papi/src/main/java/org/artifactory/repo/LocalRepositoryConfiguration.java
deleted file mode 100644
index 96d42a8..0000000
--- a/base/papi/src/main/java/org/artifactory/repo/LocalRepositoryConfiguration.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import java.util.List;
-
-/**
- * @author Yoav Landman
- */
-public interface LocalRepositoryConfiguration extends RepositoryConfiguration {
-    String TYPE = "local";
-
-    boolean isBlackedOut();
-
-    String getChecksumPolicyType();
-
-    boolean isHandleReleases();
-
-    boolean isHandleSnapshots();
-
-    int getMaxUniqueSnapshots();
-
-    List<String> getPropertySets();
-
-    String getSnapshotVersionBehavior();
-
-    boolean isSuppressPomConsistencyChecks();
-
-    boolean isArchiveBrowsingEnabled();
-
-    boolean isCalculateYumMetadata();
-
-    int getYumRootDepth();
-
-    String getYumGroupFileNames();
-
-}
diff --git a/base/papi/src/main/java/org/artifactory/repo/RemoteRepoPath.java b/base/papi/src/main/java/org/artifactory/repo/RemoteRepoPath.java
deleted file mode 100644
index 1b0b3a0..0000000
--- a/base/papi/src/main/java/org/artifactory/repo/RemoteRepoPath.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-/**
- * Represents RemoteRepoPath by obligating to RepoPath
- * contract and adding remote Origin in to the context
- */
-public interface RemoteRepoPath extends RepoPath {
-    /**
-     * @return remote origin
-     */
-    String getOrigin();
-
-    /**
-     * @return {@link RepoPath} on remote host
-     */
-    RepoPath getActualRepoPath();
-}
\ No newline at end of file
diff --git a/base/papi/src/main/java/org/artifactory/repo/RepoPath.java b/base/papi/src/main/java/org/artifactory/repo/RepoPath.java
deleted file mode 100644
index e0519e2..0000000
--- a/base/papi/src/main/java/org/artifactory/repo/RepoPath.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import org.artifactory.common.Info;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
-/**
- * Holds a compound path of a repository key and a path within that repository, separated by a ':'
- */
-public interface RepoPath extends Info {
-    char REPO_PATH_SEP = ':';
-    char ARCHIVE_SEP = '!';
-    String REMOTE_CACHE_SUFFIX = "-cache";
-
-    /**
-     * @return The repository key
-     */
-    @Nonnull
-    String getRepoKey();
-
-    /**
-     * @return The path inside the repository
-     */
-    String getPath();
-
-    /**
-     * @return The full repository path, like "repoKey:path/to"
-     */
-    String getId();
-
-    /**
-     * A path composed of the repository key and path.
-     * <pre>
-     * repoKey = "key", path = "path/to" returns "key/path/to"
-     * repoKey = "key", name = "" returns "key/"
-     * </pre>
-     *
-     * @return A path composed of the repository key and path
-     */
-    String toPath();
-
-    /**
-     * @return The name of the path as if it were a file (the string after the last '/' or '\')
-     */
-    String getName();
-
-    /**
-     * @return The repo path of the parent folder to this path. Null if this is the root path of the repository.
-     */
-    @Nullable
-    RepoPath getParent();
-
-    /**
-     * @return True if this repo path is the root path of the repository (i.e., the path part is empty)
-     */
-    boolean isRoot();
-
-    /**
-     * Whether this repo path is a path to a file, rather than a folder.
-     *
-     * Note that this function does not query Artifactory for this information,
-     * but will usually instead just look at the way the path is formatted: if
-     * path ends with a '/' character, it is considered a folder, and if not,
-     * it is considered a file.
-     *
-     * @return True if this repo path represents a file
-     */
-    boolean isFile();
-
-    /**
-     * Whether this repo path is a path to a folder, rather than a file.
-     *
-     * Note that this function does not query Artifactory for this information,
-     * but will usually instead just look at the way the path is formatted: if
-     * path ends with a '/' character, it is considered a folder, and if not,
-     * it is considered a file.
-     *
-     * @return True if this repo path represents a folder
-     */
-    boolean isFolder();
-}
diff --git a/base/papi/src/main/java/org/artifactory/repo/RepoPathFactory.java b/base/papi/src/main/java/org/artifactory/repo/RepoPathFactory.java
deleted file mode 100644
index 2a57dd4..0000000
--- a/base/papi/src/main/java/org/artifactory/repo/RepoPathFactory.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import org.artifactory.util.PathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.lang.reflect.Constructor;
-
-/**
- * A factory for creating RepoPath objects.
- * <p/>
- * Has runtime dependency on the core.
- *
- * @author Yoav Landman
- */
-public class RepoPathFactory {
-    private static final Logger log = LoggerFactory.getLogger(RepoPathFactory.class);
-
-    private static Constructor<?> ctor;
-
-    static {
-        try {
-            Class<?> clazz =
-                    RepoPathFactory.class.getClassLoader().loadClass("org.artifactory.model.common.RepoPathImpl");
-            ctor = clazz.getConstructor(String.class, String.class);
-        } catch (Exception e) {
-            log.error("Error creating the repoPath factory.", e);
-        }
-    }
-
-    /**
-     * Constructs a RepoPath from the input repo key and optional path.
-     * Paths that end with slash ('/') are considered as paths pointing to folder ({@link org.artifactory.repo.RepoPath#isFolder()} will return true)
-     *
-     * @param repoKey The key of any repo
-     * @param path    The relative path inside the repo (empty for root repo path)
-     */
-    public static RepoPath create(String repoKey, String path) {
-        try {
-            return (RepoPath) ctor.newInstance(repoKey, path);
-        } catch (Exception e) {
-            throw new RuntimeException("Could not create repoPath.", e);
-        }
-    }
-
-    /**
-     * Constructs a RepoPath from a path containing both repo key and the relative path in the repo.
-     * Paths that end with slash ('/') are considered as paths pointing to folder ({@link org.artifactory.repo.RepoPath#isFolder()} will return true)
-     *
-     * @param rpp - {repoKey}/{itemRelativePath}
-     * @return Matching repo path
-     */
-    public static RepoPath create(String rpp) {
-        if (rpp == null || rpp.length() == 0) {
-            throw new IllegalArgumentException("Path cannot be empty.");
-        }
-        rpp = PathUtils.trimLeadingSlashes(PathUtils.formatPath(rpp));
-        int idx = rpp.indexOf('/');
-        String repoKey;
-        String path;
-        if (idx < 0) {
-            //Just a repo name with no rel path
-            repoKey = rpp;
-            path = "";
-        } else {
-            repoKey = rpp.substring(0, idx);
-            path = rpp.substring(idx + 1);
-        }
-        return create(repoKey, path);
-    }
-}
\ No newline at end of file
diff --git a/base/papi/src/main/java/org/artifactory/repo/Repositories.java b/base/papi/src/main/java/org/artifactory/repo/Repositories.java
deleted file mode 100644
index 60a5033..0000000
--- a/base/papi/src/main/java/org/artifactory/repo/Repositories.java
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import org.artifactory.common.StatusHolder;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.FileLayoutInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.fs.StatsInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.resource.ResourceStreamHandle;
-
-import javax.annotation.Nullable;
-import java.io.InputStream;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Public API for working with repositories
- */
- at SuppressWarnings("UnusedDeclaration")
-public interface Repositories {
-
-    /**
-     * Returns a list of keys of local repositories
-     *
-     * @return keys of local repositories
-     */
-    public List<String> getLocalRepositories();
-
-    /**
-     * Returns a list of keys of remote repositories
-     *
-     * @return keys of remote repositories
-     */
-    public List<String> getRemoteRepositories();
-
-    /**
-     * Returns a list of keys of virtual repositories
-     *
-     * @return keys of virtual repositories
-     */
-    public List<String> getVirtualRepositories();
-
-    RepositoryConfiguration getRepositoryConfiguration(String repoKey);
-
-    /**
-     * @param repoPath Repository path of the item
-     * @return Folder or file info. Throws exception if the path doesn't exist.
-     */
-    ItemInfo getItemInfo(RepoPath repoPath);
-
-    /**
-     * @param repoPath Repository path of the file
-     * @return The file info. Throws exception if the path doesn't exist or it doesn't point to a file.
-     */
-    FileInfo getFileInfo(RepoPath repoPath);
-
-    List<ItemInfo> getChildren(RepoPath repoPath);
-
-    /**
-     * Get the content of a file as a string
-     *
-     * @param fileInfo
-     * @return The file's content as string
-     * @deprecated Use {@link #getStringContent(RepoPath)} ()}
-     */
-    @Deprecated
-    String getStringContent(FileInfo fileInfo);
-
-    /**
-     * Get the content of a file as a string
-     *
-     * @param repoPath The repoPath of the file
-     * @return The file's content as string
-     * @since 2.4.0
-     */
-    String getStringContent(RepoPath repoPath);
-
-    /**
-     * Get a stream handle for the file content
-     *
-     * @param repoPath The repoPath of the file
-     * @return The content stream handle for an existing file or a null-stream handler for a non exiting one.<br/> Note:
-     *         The user <i>must</i> manually call {@link ResourceStreamHandle#close()} on the resourceStreamHandle after
-     *         usage, to avoid leaking resources!
-     * @since 2.4.0
-     */
-    ResourceStreamHandle getContent(RepoPath repoPath);
-
-    Properties getProperties(RepoPath repoPath);
-
-    boolean hasProperty(RepoPath repoPath, String propertyName);
-
-    public Set<String> getPropertyValues(RepoPath repoPath, String propertyName);
-
-    public String getProperty(RepoPath repoPath, String propertyName);
-
-    Properties setProperty(RepoPath repoPath, String propertyName, String... values);
-
-    Properties setPropertyRecursively(RepoPath repoPath, String propertyName, String... values);
-
-    /**
-     * Deletes the property from the item.
-     *
-     * @param repoPath     The item repo path
-     * @param propertyName Property name to delete
-     */
-    void deleteProperty(RepoPath repoPath, String propertyName);
-
-
-    boolean exists(RepoPath repoPath);
-
-    /**
-     * Deploy an artifact
-     *
-     * @param repoPath
-     * @param inputStream
-     * @return The result status for the deploy operation
-     */
-    StatusHolder deploy(RepoPath repoPath, InputStream inputStream);
-
-    /**
-     * Deletes the specified repoPath. Directories are deleted recursively in multiple transactions.
-     *
-     * @param repoPath The repository path to delete
-     * @return Deletion status
-     * @since 3.7.0
-     */
-    StatusHolder delete(RepoPath repoPath);
-
-    /**
-     * Deletes the specified repoPath. Directories are deleted recursively in a single transaction, which might be
-     * resource intensive when deleting very large directories.
-     *
-     * @param repoPath The repository path to delete
-     * @return Deletion status
-     * @since 2.4.0
-     */
-    StatusHolder deleteAtomic(RepoPath repoPath);
-
-    /**
-     * @param repoPath The repository path to delete
-     * @return Result of the undeploy operation
-     * @deprecated Use {@link #deleteAtomic(RepoPath)} or {@link #delete(RepoPath)} instead
-     */
-    @Deprecated
-    StatusHolder undeploy(RepoPath repoPath);
-
-    /**
-     * Checks if the specified repoPath is handled by the snapshot(integration)/release policy of the repoPath's
-     * repository.
-     *
-     * @param repoPath
-     * @return True if repoPath is handled by the snapshot(integration)/release policy of the repoPath's repository
-     */
-    boolean isRepoPathHandled(RepoPath repoPath);
-
-    /**
-     * @deprecated Use {@link #isRepoPathHandled(RepoPath)} ()}
-     */
-    @Deprecated
-    boolean isLcoalRepoPathHandled(RepoPath repoPath);
-
-    /**
-     * Checks if the specified repoPath is accepted by the include/exclude rules of the repoPath's repository.
-     *
-     * @param repoPath
-     * @return True if the specified repoPath is accepted by the include/exclude rules of the repoPath's repository
-     */
-    boolean isRepoPathAccepted(RepoPath repoPath);
-
-
-    /**
-     * @deprecated Use {@link #isRepoPathAccepted(RepoPath)} ()}
-     */
-    @Deprecated
-    boolean isLocalRepoPathAccepted(RepoPath repoPath);
-
-    /**
-     * Moves the source repoPath to the targetRepoPath
-     *
-     * @param source - A source repository path
-     * @param target - A target repository path
-     * @return The result status for the move operation
-     */
-    StatusHolder move(RepoPath source, RepoPath target);
-
-    /**
-     * Moves the source repoPath to the targetRepoPath , Directories are moved recursively in a single transaction, which might be
-     * resource intensive when moving very large directories.
-     *
-     * @param source - A source repository path
-     * @param target - A target repository path
-     * @return The result status for the move operation
-     */
-    StatusHolder moveAtomic(RepoPath source, RepoPath target);
-
-
-    /**
-     * Copies the source repoPath to the targetRepoPath
-     *
-     * @param source - A source repository path
-     * @param target - A target repository path
-     * @return The result status for the copy operation
-     */
-    StatusHolder copy(RepoPath source, RepoPath target);
-
-    /**
-     * Copies the source repoPath to the targetRepoPath , Directories are copied recursively in a single transaction, which might be
-     * resource intensive when copying very large directories.
-     *
-     * @param source - A source repository path
-     * @param target - A target repository path
-     * @return The result status for the copy operation
-     */
-    StatusHolder copyAtomic(RepoPath source, RepoPath target);
-
-    /**
-     * Returns module related information (group, artifact, version, etc.) for given file, as it was extracted according
-     * to the layout of the repository the file is part of.
-     * * @param repoPath the file path
-     *
-     * @return the file layout information, which can be empty in case of incorrect repoPath or when the layout can't be determined
-     */
-    public FileLayoutInfo getLayoutInfo(RepoPath repoPath);
-
-    /**
-     * Translates the path of a file from source repository layout to target's one.
-     *
-     * @param source        the source repository path
-     * @param targetRepoKey the target repository key
-     * @return the file path according to target repository layout
-     */
-    String translateFilePath(RepoPath source, String targetRepoKey);
-
-    /**
-     * Returns actual repository path for layout information (group, artifact, version, etc.) of an artifact
-     * as it is built according to the layout of the repository.
-     *
-     * @param layoutInfo the layout information to build the path from
-     * @param repoKey    the repository the path will be in
-     * @return the repository path to the file
-     */
-    RepoPath getArtifactRepoPath(FileLayoutInfo layoutInfo, String repoKey);
-
-    /**
-     * Returns actual repository path for layout information (group, artifact, version, etc.) of a descriptor
-     * as it is built according to the layout of the repository.
-     *
-     * @param layoutInfo the layout information to build the path from
-     * @param repoKey    the repository the path will be in
-     * @return the repository path to the file
-     */
-    RepoPath getDescriptorRepoPath(FileLayoutInfo layoutInfo, String repoKey);
-
-    /**
-     * Returns the total number of file artifacts under the provided directory repo path. Repository root repo path will
-     * return the total number of artifacts in the given repository.
-     *
-     * @param repoPath Repo path to count artifacts under
-     * @return Total number of artifacts under the given repo path.
-     */
-    long getArtifactsCount(RepoPath repoPath);
-
-    /**
-     * Returns the total storage size of the file artifacts under the given directory repo path.
-     *
-     * @param repoPath Repo path to return total storage under
-     * @return Total size (in bytes) of the artifacts under the given repo path
-     */
-    long getArtifactsSize(RepoPath repoPath);
-
-    /**
-     * Returns statistics for the {@code repoPath}, which include downloads count, last download time and last
-     * downloader's name.
-     * @param repoPath to return downloads statistics for
-     * @return {@link StatsInfo} which provides data about downloads, may be null
-     */
-    @Nullable
-    StatsInfo getStats(RepoPath repoPath);
-}
diff --git a/base/papi/src/main/java/org/artifactory/repo/RepositoryConfiguration.java b/base/papi/src/main/java/org/artifactory/repo/RepositoryConfiguration.java
deleted file mode 100644
index befc7d3..0000000
--- a/base/papi/src/main/java/org/artifactory/repo/RepositoryConfiguration.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-/**
- * @author Yoav Landman
- */
-public interface RepositoryConfiguration {
-
-    String TYPE_KEY = "rclass";
-
-    String getKey();
-
-    String getPackageType();
-
-    String getType();
-
-    String getDescription();
-
-    String getExcludesPattern();
-
-    String getIncludesPattern();
-
-    String getNotes();
-
-    String getRepoLayoutRef();
-
-    boolean isEnableNuGetSupport();
-
-    boolean isEnableGemsSupport();
-
-    boolean isEnableNpmSupport();
-
-    boolean isEnableBowerSupport();
-
-    boolean isEnableCocoaPodsSupport();
-
-    boolean isEnableDebianSupport();
-
-    boolean isDebianTrivialLayout();
-
-    boolean isEnableDistRepoSupport();
-
-    boolean isEnablePypiSupport();
-
-    boolean isEnableDockerSupport();
-
-    String getDockerApiVersion();
-
-    boolean isForceDockerAuthentication();
-
-    boolean isEnableVagrantSupport();
-
-    boolean isEnableGitLfsSupport();
-
-    boolean isForceNugetAuthentication();
-}
diff --git a/base/papi/src/main/java/org/artifactory/repo/VirtualRepositoryConfiguration.java b/base/papi/src/main/java/org/artifactory/repo/VirtualRepositoryConfiguration.java
deleted file mode 100644
index 3bd41eb..0000000
--- a/base/papi/src/main/java/org/artifactory/repo/VirtualRepositoryConfiguration.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import java.util.List;
-
-/**
- * @author Yoav Landman
- */
-public interface VirtualRepositoryConfiguration extends RepositoryConfiguration {
-    String TYPE = "virtual";
-
-    boolean isArtifactoryRequestsCanRetrieveRemoteArtifacts();
-
-    String getKeyPair();
-
-    String getPomRepositoryReferencesCleanupPolicy();
-
-    String getDefaultDeploymentRepo();
-
-    List<String> getRepositories();
-
-    boolean isExternalDependenciesEnabled();
-
-    String getExternalDependenciesRemoteRepo();
-
-    List<String> getExternalDependenciesPatterns();
-}
diff --git a/base/papi/src/main/java/org/artifactory/request/Request.java b/base/papi/src/main/java/org/artifactory/request/Request.java
deleted file mode 100644
index 7d22683..0000000
--- a/base/papi/src/main/java/org/artifactory/request/Request.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.request;
-
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Enumeration;
-import java.util.Map;
-
-public interface Request {
-
-    RepoPath getRepoPath();
-
-    boolean isChecksum();
-
-    /**
-     * Checks if the request originated from another Artifactory
-     *
-     * @return True if the request originated from another Artifactory.
-     */
-    boolean isFromAnotherArtifactory();
-
-    boolean isHeadOnly();
-
-    long getLastModified();
-
-    long getIfModifiedSince();
-
-    public boolean hasIfModifiedSince();
-
-    boolean isNewerThan(long time);
-
-    String getHeader(String headerName);
-
-    Enumeration getHeaders(String headerName);
-
-    Map<String, String> getHeaders();
-
-    String getServletContextUrl();
-
-    String getUri();
-
-    Properties getProperties();
-
-    boolean hasProperties();
-
-    Map<String, String[]> getParameters();
-
-    String getParameter(String name);
-
-    String[] getParameterValues(String name);
-
-    InputStream getInputStream() throws IOException;
-
-    /**
-     * @return an integer containing the length in bytes of the request body or -1 if the length is not known
-     */
-    long getContentLength();
-
-    /**
-     * Get the address of the client that triggered the request.
-     *
-     * @return The client IP address as a string.
-     */
-    String getClientAddress();
-
-    /**
-     * Returns the internal zip resource path if such existed in the request.<p/> For example if the request path is
-     * /path/to/zip!/path/to/resource/in/zip the method will return the zip resource path: '/path/to/zip' as the root
-     * path.
-     *
-     * @return The zip resource path. Null or empty is such doesn't exist in the request path.
-     */
-    String getZipResourcePath();
-
-    /**
-     * @return True is the request is for internal zip resource
-     * @see org.artifactory.request.Request#getZipResourcePath()
-     */
-    boolean isZipResourceRequest();
-
-    /**
-     * Checks whether an entity with the provided etag does not already exist by comparing it to the request's
-     * If-None-Match
-     *
-     * @param etag
-     * @return
-     */
-    boolean isNoneMatch(String etag);
-
-    /**
-     * Checks whether the request has an If-None-Match header specified
-     *
-     * @return Request has non-null If-None-Match
-     */
-    boolean hasIfNoneMatch();
-}
diff --git a/base/papi/src/main/java/org/artifactory/request/RequestContext.java b/base/papi/src/main/java/org/artifactory/request/RequestContext.java
deleted file mode 100644
index 38a67f6..0000000
--- a/base/papi/src/main/java/org/artifactory/request/RequestContext.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.request;
-
-import org.artifactory.md.Properties;
-
-/**
- * Request context that might be passed to the repository when requesting for info.
- *
- * @author Yossi Shaul
- */
-public interface RequestContext {
-    boolean isFromAnotherArtifactory();
-
-    String getResourcePath();
-
-    String getServletContextUrl();
-
-    Properties getProperties();
-
-    /**
-     * Return the client request. This might be null when doing internal requests.
-     *
-     * @return The request or null if not set.
-     */
-    Request getRequest();
-
-    void setAttribute(String name, String value);
-
-    String getAttribute(String name);
-}
diff --git a/base/papi/src/main/java/org/artifactory/request/RequestResponseInfo.java b/base/papi/src/main/java/org/artifactory/request/RequestResponseInfo.java
deleted file mode 100644
index c444392..0000000
--- a/base/papi/src/main/java/org/artifactory/request/RequestResponseInfo.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.request;
-
-import org.artifactory.repo.RepoPath;
-
-import java.io.Serializable;
-
-/**
- * NOTE: INTERNAL USE ONLY - NOT PART OF THE PUBLIC API!
- *
- * @author yoavl
- */
-public interface RequestResponseInfo extends Serializable {
-
-    RequestContext getRequestContext();
-
-    /**
-     * @return The resource repository path. This path might be virtual and is usually represent the path from the
-     *         request.
-     */
-    RepoPath getRequestRepoPath();
-
-    /**
-     * @return The actual repo path the resource came from. Might be different from the request repo path. For example
-     *         when a request is made on a virtual repository, the response repo path should point to the actual
-     *         repository containing this resource.
-     */
-    RepoPath getResponseRepoPath();
-
-    String getRemoteRepoUrl();
-
-    boolean isFound();
-
-    boolean isExactQueryMatch();
-
-    boolean isExpired();
-
-    boolean isMetadata();
-
-    long getCacheAge();
-
-    String getMimeType();
-
-    String getName();
-
-    long getLastModified();
-
-    long getSize();
-
-    void setSize(long size);
-
-    String getSha1();
-
-    String getMd5();
-}
diff --git a/base/papi/src/main/java/org/artifactory/resource/RepoResourceInfo.java b/base/papi/src/main/java/org/artifactory/resource/RepoResourceInfo.java
deleted file mode 100644
index 5c67685..0000000
--- a/base/papi/src/main/java/org/artifactory/resource/RepoResourceInfo.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.resource;
-
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumsInfo;
-import org.artifactory.common.Info;
-import org.artifactory.repo.RepoPath;
-
-import java.util.Set;
-
-/**
- * Date: 8/1/11
- * Time: 7:09 PM
- *
- * @author Fred Simon
- */
-public interface RepoResourceInfo extends Info {
-    RepoPath getRepoPath();
-
-    String getName();
-
-    long getLastModified();
-
-    long getSize();
-
-    /**
-     * @return The actual sha1 checksum of the file. Null if not determined yet.
-     */
-    String getSha1();
-
-    /**
-     * @return The actual md5 checksum of the file. Null if not determined yet.
-     */
-    String getMd5();
-
-    ChecksumsInfo getChecksumsInfo();
-
-    /**
-     * @return Set of checksum infos
-     * @deprecated Should use the container getter
-     */
-    @Deprecated
-    Set<ChecksumInfo> getChecksums();
-}
diff --git a/base/papi/src/main/java/org/artifactory/resource/ResourceStreamHandle.java b/base/papi/src/main/java/org/artifactory/resource/ResourceStreamHandle.java
deleted file mode 100644
index a410e23..0000000
--- a/base/papi/src/main/java/org/artifactory/resource/ResourceStreamHandle.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.resource;
-
-import java.io.Closeable;
-import java.io.InputStream;
-
-/**
- * A handle object that will be used for sending back a resource as stream.
- * <p/>
- * The stream close() method is typically called back automatically by the caller so the handle creator only needs to
- * provide the close() implementation.
- *
- * @author Yoav Landman
- */
-public interface ResourceStreamHandle extends Closeable {
-    /**
-     * @return The input stream of this handle
-     */
-    InputStream getInputStream();
-
-    /**
-     * @return The size of the stream or -1 if unknown
-     */
-    long getSize();
-
-    /**
-     * Closes the underlying input stream
-     */
-    @Override
-    void close();
-}
diff --git a/base/papi/src/main/java/org/artifactory/search/Searches.java b/base/papi/src/main/java/org/artifactory/search/Searches.java
deleted file mode 100644
index ca41924..0000000
--- a/base/papi/src/main/java/org/artifactory/search/Searches.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.search;
-
-import com.google.common.collect.SetMultimap;
-import org.artifactory.build.BuildRun;
-import org.artifactory.repo.RepoPath;
-
-import javax.annotation.Nullable;
-import java.util.Calendar;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Public API for executing searches
- *
- * @author Yoav Landman
- */
-public interface Searches {
-
-    /**
-     * Find artifacts by name
-     *
-     * @param query        The search query term for the artifact name
-     * @param repositories A list of repositories to search in. Can be null to search all repositories
-     * @return Artifacts found by the search, empty list if nothing was found
-     */
-    List<RepoPath> artifactsByName(String query, String... repositories);
-
-    /**
-     * Find artifacts by properties
-     *
-     * @param properties   A set of key-value properties to search for on artifacts or folders. All specified properties
-     *                     need to exist on found items. If multiple values are used a contains() semantic is applied
-     * @param repositories A list of repositories to search in. Can be null to search all repositories.
-     * @return Artifacts matching the criteria
-     */
-    List<RepoPath> itemsByProperties(SetMultimap<String, String> properties, String... repositories);
-
-    /**
-     * Search the content of jar/zip archives
-     *
-     * @param query        The search term for the archive of the entry
-     * @param repositories A list of repositories to search in. Can be null to search all repositories.
-     * @return List of zip resources repo path matching the criteria
-     */
-    List<RepoPath> archiveEntriesByName(String query, String... repositories);
-
-    List<RepoPath> artifactsByGavc(@Nullable String groupId, @Nullable String artifactId,
-            @Nullable String version, @Nullable String classifier, String... repositories);
-
-    /**
-     * Find artifacts by their checksum values
-     *
-     * @param sha1         The sha1 checksum of the artifact
-     * @param repositories A list of repositories to search in. Can be null to search all repositories
-     * @return Set of repo paths that comply with the given checksums
-     */
-    Set<RepoPath> artifactsBySha1(String sha1, String... repositories);
-
-    /**
-     * Find artifacts created or modified within a date range
-     *
-     * @param from         The time to start the search exclusive (eg, >). If empty will start from 1st Jan 1970
-     * @param to           The time to end search inclusive (eg, <=), If null, will not use current time as the limit
-     * @param repositories A list of repositories to search in. Can be null to search all repositories.
-     * @return List of file repo paths that were created or modified between the input time range and the date the file
-     *         was modified.
-     */
-    List<RepoPath> artifactsCreatedOrModifiedInRange(
-            @Nullable Calendar from, @Nullable Calendar to, String... repositories);
-
-    /**
-     * Find artifacts not downloaded since the specified date
-     *
-     * @param since         The time to start the search exclusive (eg, >). If null will start from 1st Jan 1970
-     * @param createdBefore Only include artifacts created before the specified time. If null will default to the value
-     *                      of since.
-     * @param repositories  A list of repositories to search in. Can be null to search all repositories
-     * @return List of file repo paths that were not downloaded since the specified date
-     */
-    List<RepoPath> artifactsNotDownloadedSince(@Nullable Calendar since, @Nullable Calendar createdBefore,
-            String... repositories);
-
-    /**
-     * Find all build runs that produced the artifact with the provided sha1 checksum
-     *
-     * @param sha1 The sha1 cheksum of the build dependency to search
-     * @return A list of BuildRuns (may be empty)
-     */
-    Set<BuildRun> buildsByArtifactSha1(String sha1);
-
-    /**
-     * Find all build runs that used a dependency with the provided sha1 checksum
-     *
-     * @param sha1 The sha1 cheksum of the build dependency to search
-     * @return A list of BuildRuns (may be empty)
-     */
-    Set<BuildRun> buildsByDependencySha1(String sha1);
-}
diff --git a/base/papi/src/main/java/org/artifactory/security/RealmPolicy.java b/base/papi/src/main/java/org/artifactory/security/RealmPolicy.java
deleted file mode 100644
index a49c024..0000000
--- a/base/papi/src/main/java/org/artifactory/security/RealmPolicy.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.security;
-
-/**
- * Defines the plugin realm authentication policy
- *
- * @author Shay Yaakov
- * @since 4.1.0
- */
-public enum RealmPolicy {
-
-    /**
-     * Executed in the start of the authentication chain before any other built-in authentication realms (Ldap, Internal etc.)
-     * When authentication succeeds, all other built-in realms are skipped. This is the default behavior
-     */
-    SUFFICIENT,
-
-    /**
-     * Executed additionally if at least one of the previous authentication provider has succeeded
-     */
-    ADDITIVE
-}
\ No newline at end of file
diff --git a/base/papi/src/main/java/org/artifactory/security/Security.java b/base/papi/src/main/java/org/artifactory/security/Security.java
deleted file mode 100644
index 67220f8..0000000
--- a/base/papi/src/main/java/org/artifactory/security/Security.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import org.artifactory.repo.RepoPath;
-import org.artifactory.security.groups.CrowdGroupsSettings;
-import org.artifactory.security.groups.LdapGroupsSettings;
-import org.artifactory.security.groups.RealmAwareGroupsSettings;
-
-/**
- * These are the usage of security data and logged in user methods.
- */
-public interface Security {
-
-    /**
-     * @return True if the current user can update her profile.
-     */
-    boolean isUpdatableProfile();
-
-    /**
-     * @return True if anonymous access is allowed.
-     */
-    boolean isAnonAccessEnabled();
-
-    /**
-     * @return True if the current user can read the specified path.
-     */
-    boolean canRead(RepoPath path);
-
-    /**
-     * @return True if the current user can annotate the specified path.
-     */
-    boolean canAnnotate(RepoPath repoPath);
-
-    /**
-     * @return True if the current user can delete the specified path.
-     */
-    boolean canDelete(RepoPath path);
-
-    /**
-     * @return True if the current user can deploy to the specified path.
-     */
-    boolean canDeploy(RepoPath path);
-
-    /**
-     * @return True if the current user has admin permissions on a target info that includes this path..
-     * @deprecated Use {@link #canManage()} instead
-     */
-    @Deprecated
-    boolean canAdmin(RepoPath path);
-
-    /**
-     * @return True if the current user has manage permissions on a target info that includes this path..
-     */
-    boolean canManage(RepoPath path);
-
-    /**
-     * @return The current logged-in user name.
-     * @since 2.3.3
-     */
-    String getCurrentUsername();
-
-    /**
-     * The current logged in-user name.
-     *
-     * @return The current logged in-user name
-     * @deprecated Use  {@link #getCurrentUsername()} instead
-     */
-    @Deprecated
-    String currentUsername();
-
-
-    /**
-     * The group names for the current logged-in user.
-     *
-     * @return A list of group names associated with the current user.
-     * @since 2.3.3
-     */
-    String[] getCurrentUserGroupNames();
-
-    /**
-     * Retrieves the groups of the current user according to the given realm settings
-     * Available realms are {@link LdapGroupsSettings} and {@link CrowdGroupsSettings}
-     *
-     * @param settings Realm specific settings
-     * @return A list of group names associated with the current user with the relevant realm.
-     * @since 4.1.0
-     */
-    String[] getCurrentUserGroupNames(RealmAwareGroupsSettings settings);
-
-    /**
-     * @return True if the current is a system administrator.
-     */
-    boolean isAdmin();
-
-    /**
-     * @return True if the current user is a anonymous.
-     */
-    boolean isAnonymous();
-
-    /**
-     * @return True if a user (anonymous and system are also users) is logged in.
-     */
-    boolean isAuthenticated();
-
-    /**
-     * @return The encrypted password of the current user
-     */
-    String getEncryptedPassword();
-
-    /**
-     * @return The encrypted password of the current user properly escaped for inclusion in xml settings
-     */
-    String getEscapedEncryptedPassword();
-
-    /**
-     * @return The current logged in user, the anonymous user or null if no authentication details present.
-     */
-    User currentUser();
-
-    /**
-     * Accessible only if current user is an admin.
-     *
-     * @return The user with the given username if exists or null.
-     * @throws SecurityException if the current user is not an admin user
-     */
-    User findUser(String username);
-
-    /**
-     * Attaches all the user properties to the given user
-     *
-     * @param user The user to attach properties to
-     */
-    void populateUserProperties(User user);
-
-    /**
-     * Update the user with the same username as the user.getUsername() passed.<br/>
-     * NOTE: Only updatable fields will be updated.<br/>
-     * The user object cannot be null, and user.getUsername() should represent an existing non-anonymous or system user.
-     * Here are the fields that will be updated and the conditions:<br/><ul>
-     * <li>user.getEmail() will be updated if not null</li>
-     * <li>user.isAdmin() will be updated</li>
-     * <li>user.isEnabled() will be updated</li>
-     * <li>user.isUpdatableProfile() will be updated</li>
-     * <li>user.getPrivateKey() will be updated if not null</li>
-     * <li>user.getPublicKey() will be updated if not null</li>
-     * <li>user.isTransientUser() will be updated</li>
-     * <li>user.getGroups() will be updated if not null and all group name exists</li>
-     * <li>user.getBintrayAuth() will be updated if not null</li>
-     * </ul>
-     *
-     * @param user the user with all the fields to update
-     * @return the new updated user data
-     * @throws SecurityException                        if the current user is not an admin user, if the user passed is the anonymous user,
-     *                                                  if one of the group passed does not exists
-     * @throws org.artifactory.storage.StorageException if the user could not updated
-     */
-    void updateUser(User user);
-}
diff --git a/base/papi/src/main/java/org/artifactory/security/User.java b/base/papi/src/main/java/org/artifactory/security/User.java
deleted file mode 100644
index 767ae12..0000000
--- a/base/papi/src/main/java/org/artifactory/security/User.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.security;
-
-import java.util.Map;
-
-/**
- * Available fields from the user in Artifactory DB,
- * or object provided by authenticate realms override to set user info data.
- */
-public interface User {
-    String getUsername();
-
-    String getEmail();
-
-    boolean isAdmin();
-
-    boolean isEnabled();
-
-    boolean isUpdatableProfile();
-
-    String getRealm();
-
-    String getPrivateKey();
-
-    String getPublicKey();
-
-    boolean isTransientUser();
-
-    String[] getGroups();
-
-    String getBintrayAuth();
-
-    long getLastLoginTimeMillis();
-
-    String getLastLoginClientIp();
-
-    String getUserProperty(String key);
-
-    boolean isAnonymous();
-
-    Map<String, String> getUserProperties();
-
-    void setEmail(String email);
-
-    void setAdmin(Boolean admin);
-
-    void setEnabled(Boolean enabled);
-
-    void setUpdatableProfile(Boolean updatableProfile);
-
-    void setPrivateKey(String privateKey);
-
-    void setPublicKey(String publicKey);
-
-    void setBintrayAuth(String bintrayAuth);
-
-    void setGroups(String[] groups);
-
-    void setUserProperty(String key, String value);
-
-    void setUserProperties(Map<String, String> userProperties);
-}
diff --git a/base/papi/src/main/java/org/artifactory/security/groups/CrowdGroupsSettings.java b/base/papi/src/main/java/org/artifactory/security/groups/CrowdGroupsSettings.java
deleted file mode 100644
index ef4d349..0000000
--- a/base/papi/src/main/java/org/artifactory/security/groups/CrowdGroupsSettings.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.artifactory.security.groups;
-
-/**
- * @author Shay Yaakov
- */
-public class CrowdGroupsSettings implements RealmAwareGroupsSettings {
-}
diff --git a/base/papi/src/main/java/org/artifactory/security/groups/LdapGroupsSettings.java b/base/papi/src/main/java/org/artifactory/security/groups/LdapGroupsSettings.java
deleted file mode 100644
index ddae90f..0000000
--- a/base/papi/src/main/java/org/artifactory/security/groups/LdapGroupsSettings.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.artifactory.security.groups;
-
-/**
- * @author Shay Yaakov
- */
-public class LdapGroupsSettings implements RealmAwareGroupsSettings {
-
-    public String ldapGroupSettingsName;
-}
diff --git a/base/papi/src/main/java/org/artifactory/security/groups/RealmAwareGroupsSettings.java b/base/papi/src/main/java/org/artifactory/security/groups/RealmAwareGroupsSettings.java
deleted file mode 100644
index 222bf12..0000000
--- a/base/papi/src/main/java/org/artifactory/security/groups/RealmAwareGroupsSettings.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.artifactory.security.groups;
-
-/**
- * @author Shay Yaakov
- */
-public interface RealmAwareGroupsSettings {
-}
diff --git a/base/papi/src/main/java/org/artifactory/util/PathUtils.java b/base/papi/src/main/java/org/artifactory/util/PathUtils.java
deleted file mode 100644
index cd7029b..0000000
--- a/base/papi/src/main/java/org/artifactory/util/PathUtils.java
+++ /dev/null
@@ -1,570 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.repo.RepoPath;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.regex.Pattern;
-
-/**
- * Path utils
- * <p/>
- * NOTE: INTERNAL USE ONLY - NOT PART OF THE PUBLIC API!
- * <p/>
- * User: freds Date: Aug 3, 2008 Time: 5:42:55 PM
- */
-public class PathUtils {
-
-    private static final Pattern PATTERN_SLASHES = Pattern.compile("/+");
-
-    /**
-     * Check that the given CharSequence is neither <code>null</code> nor of length 0. Note: Will return
-     * <code>true</code> for a CharSequence that purely consists of whitespace.
-     * <p><pre>
-     * StringUtils.hasLength(null) = false
-     * StringUtils.hasLength("") = false
-     * StringUtils.hasLength(" ") = true
-     * StringUtils.hasLength("Hello") = true
-     * </pre>
-     *
-     * @param str the CharSequence to check (may be <code>null</code>)
-     * @return <code>true</code> if the CharSequence is not null and has length
-     * @see #hasText(String)
-     */
-    public static boolean hasLength(String str) {
-        return (str != null && str.length() > 0);
-    }
-
-    /**
-     * Check whether the given CharSequence has actual text. More specifically, returns <code>true</code> if the string
-     * not <code>null</code>, its length is greater than 0, and it contains at least one non-whitespace character.
-     * <p><pre>
-     * StringUtils.hasText(null) = false
-     * StringUtils.hasText("") = false
-     * StringUtils.hasText(" ") = false
-     * StringUtils.hasText("12345") = true
-     * StringUtils.hasText(" 12345 ") = true
-     * </pre>
-     *
-     * @param str the CharSequence to check (may be <code>null</code>)
-     * @return <code>true</code> if the CharSequence is not <code>null</code>, its length is greater than 0, and it does
-     *         not contain whitespace only
-     * @see java.lang.Character#isWhitespace
-     */
-    public static boolean hasText(String str) {
-        if (!hasLength(str)) {
-            return false;
-        }
-        int strLen = str.length();
-        for (int i = 0; i < strLen; i++) {
-            if (!Character.isWhitespace(str.charAt(i))) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Trim leading and trailing whitespace from the given String.
-     *
-     * @param str the String to check
-     * @return the trimmed String
-     * @see java.lang.Character#isWhitespace
-     */
-    public static String trimWhitespace(String str) {
-        if (!hasLength(str)) {
-            return str;
-        }
-        StringBuffer buf = new StringBuffer(str);
-        while (buf.length() > 0 && Character.isWhitespace(buf.charAt(0))) {
-            buf.deleteCharAt(0);
-        }
-        while (buf.length() > 0 && Character.isWhitespace(buf.charAt(buf.length() - 1))) {
-            buf.deleteCharAt(buf.length() - 1);
-        }
-        return buf.toString();
-    }
-
-    /**
-     * @param path A file like path.
-     * @return The name of the file from the path)
-     */
-    public static String getFileName(String path) {
-        if (path == null) {
-            return null;
-        }
-        path = normalizePath(path);
-        if (path.length() == 0) {
-            return "";
-        }
-        int index = path.lastIndexOf("/");// returns -1 if n '/' exists
-        return path.substring(index + 1);
-    }
-
-    public static String normalizePath(String path) {
-        if (path == null) {
-            return null;
-        }
-        path = replaceBackslashesWithSlashes(path);
-        path = PathUtils.trimSlashes(path).toString();
-        path = removeDuplicateSlashes(path);
-        return path;
-    }
-
-    public static String removeDuplicateSlashes(String pathname) {
-        if (pathname == null) {
-            return null;
-        }
-
-        while (pathname.contains("//")) {
-            pathname = pathname.replace("//", "/");
-        }
-        return pathname;
-    }
-
-    public static String replaceBackslashesWithSlashes(String path) {
-        if (path == null) {
-            return null;
-        }
-        return StringUtils.replace(path, "\\", "/");
-    }
-
-    /**
-     * @param path A file path
-     * @return Parent path of the input path as if it was a file. Empty string if the path has no parent.
-     */
-    public static String getParent(String path) {
-        if (path == null) {
-            return null;
-        }
-        File dummy = new File(path);
-        return formatPath(dummy.getParent());
-    }
-
-    /**
-     * @param path The path (usually of a file)
-     * @return The file extension. Null if file name has no extension. For example 'file.xml' will return xml, 'file'
-     *         will return null.
-     */
-    public static String getExtension(String path) {
-        if (path == null) {
-            return null;
-        }
-        // TODO: check there is no slash after this dot
-        int dotPos = path.lastIndexOf('.');
-        if (dotPos < 0) {
-            return null;
-        }
-        return path.substring(dotPos + 1);
-    }
-
-    /**
-     * @param path The path (usually of a file)
-     * @return The path without the extension. If the path has no extension the same path will be returned.
-     *         <p/>
-     *         For example 'file.xml' will return 'file', 'file' will return 'file'.
-     */
-    public static String stripExtension(String path) {
-        String result = path;
-        String extension = getExtension(path);
-        if (extension != null) {
-            result = path.substring(0, path.length() - extension.length() - 1);
-        }
-        return result;
-    }
-
-    public static String collectionToDelimitedString(Iterable<String> iterable) {
-        return collectionToDelimitedString(iterable, ",");
-    }
-
-    public static String collectionToDelimitedString(Iterable<String> iterable, String delim) {
-        if (iterable == null) {
-            return "";
-        }
-        Iterator<String> it = iterable.iterator();
-        if (it == null || !it.hasNext()) {
-            return "";
-        }
-        StringBuilder sb = new StringBuilder();
-        while (it.hasNext()) {
-            String next = it.next();
-            String str = next != null ? next : null;
-            if (str == null) {
-                continue;
-            }
-            str = str.trim();
-            if (str.length() == 0) {
-                continue;
-            }
-            sb.append(str);
-            if (it.hasNext()) {
-                sb.append(delim);
-            }
-        }
-        return sb.toString();
-    }
-
-    public static List<String> includesExcludesPatternToStringList(String str) {
-        return delimitedListToStringList(str, ",", "\r\n\f ");
-    }
-
-    public static List<String> delimitedListToStringList(String str, String delimiter) {
-        return delimitedListToStringList(str, delimiter, "\r\n\f\t ");
-    }
-
-    public static List<String> delimitedListToStringList(String str, String delimiter, String charsToDelete) {
-        List<String> result = new ArrayList<>();
-        if (str == null) {
-            return result;
-        }
-        if (delimiter == null) {
-            result.add(str);
-            return result;
-        }
-        if ("".equals(delimiter)) {
-            for (int i = 0; i < str.length(); i++) {
-                result.add(deleteAny(str.substring(i, i + 1), charsToDelete));
-            }
-        } else {
-            int pos = 0;
-            int delPos;
-            while ((delPos = str.indexOf(delimiter, pos)) != -1) {
-                result.add(deleteAny(str.substring(pos, delPos), charsToDelete));
-                pos = delPos + delimiter.length();
-            }
-            if (str.length() > 0 && pos <= str.length()) {
-                // Add rest of String, but not in case of empty input.
-                result.add(deleteAny(str.substring(pos), charsToDelete));
-            }
-        }
-        return result;
-    }
-
-    public static String deleteAny(String inString, String charsToDelete) {
-        if (!hasLength(inString) || !hasLength(charsToDelete)) {
-            return inString;
-        }
-        StringBuffer out = new StringBuffer();
-        for (int i = 0; i < inString.length(); i++) {
-            char c = inString.charAt(i);
-            if (charsToDelete.indexOf(c) == -1) {
-                out.append(c);
-            }
-        }
-        return out.toString();
-    }
-
-    public static String formatRelativePath(String path) {
-        path = formatPath(path);
-        //Trim leading (caused by webdav requests) and trailing '/''s
-        CharSequence trimmed = trimSlashes(path);
-        return trimmed != null ? trimmed.toString() : null;
-    }
-
-    /**
-     * Replaces all backslashes in the path to slashes.
-     *
-     * @param path A path to format
-     * @return The input path with all backslashes replaced with slashes. Return empty string if the input path is
-     *         null.
-     */
-    public static String formatPath(String path) {
-        if (PathUtils.hasText(path)) {
-            path = path.replace('\\', '/');
-            return normalizeSlashes(path).toString();
-        } else {
-            return "";
-        }
-    }
-
-    // todo: change to return string
-    public static CharSequence trimSlashes(CharSequence path) {
-        if (path == null) {
-            return null;
-        }
-        path = trimLeadingSlashChars(path);
-        path = trimTrailingSlashesChars(path);
-        return path;
-    }
-
-    public static String trimLeadingSlashes(CharSequence path) {
-        CharSequence res = trimLeadingSlashChars(path);
-        return res != null ? res.toString() : null;
-    }
-
-    /**
-     * Convert any sequence of slashses to a single slash (/)
-     *
-     * @param path
-     * @return The normalized path
-     */
-    public static CharSequence normalizeSlashes(CharSequence path) {
-        if (path == null) {
-            return null;
-        }
-        return PATTERN_SLASHES.matcher(path).replaceAll("/");
-    }
-
-    public static CharSequence trimLeadingSlashChars(CharSequence path) {
-        if (path == null) {
-            return null;
-        }
-        //Trim leading '/' (caused by webdav requests)
-        if (path.length() > 0 && path.charAt(0) == '/') {
-            path = path.subSequence(1, path.length());
-            return trimLeadingSlashChars(path);
-        }
-        return path;
-    }
-
-    public static String trimTrailingSlashes(CharSequence path) {
-        CharSequence res = trimTrailingSlashesChars(path);
-        return res != null ? res.toString() : null;
-    }
-
-    public static CharSequence trimTrailingSlashesChars(CharSequence path) {
-        if (path == null) {
-            return null;
-        }
-        if (path.length() > 0 && path.charAt(path.length() - 1) == '/') {
-            path = path.subSequence(0, path.length() - 1);
-            return trimTrailingSlashes(path);
-        }
-        return path;
-    }
-
-    /**
-     * Adds a slash to the end of the path if it doesn't already end with a slash. Whitespaces are also removed with
-     * {@link org.artifactory.util.PathUtils#trimWhitespace(String)}.
-     * <pre>
-     * addTrailingSlash("/acb") = "abc/"
-     * addTrailingSlash("/acb   ") = "abc/"
-     * addTrailingSlash("/acb/") = "/abc/"
-     * addTrailingSlash("") = "/"
-     * addTrailingSlash(null) = null
-     * </pre>
-     *
-     * @param path The path to add the trailing slash
-     * @return A path with trailing slash at the end
-     */
-    public static String addTrailingSlash(String path) {
-        if (path == null) {
-            return null;
-        }
-
-        path = trimWhitespace(path);
-        return path.endsWith("/") ? path : path + "/";
-    }
-
-    @SuppressWarnings({"StringEquality"})
-    public static boolean safeStringEquals(String s1, String s2) {
-        return s1 == s2 || (s1 != null && s1.equals(s2));
-    }
-
-    public static String getRelativePath(String parentPath, String childPath) {
-        if (childPath.startsWith("/")) {
-            childPath = childPath.substring(1);
-        }
-        childPath = childPath.substring(parentPath.length(), childPath.length());
-        childPath = formatRelativePath(childPath);
-        return childPath;
-    }
-
-    /**
-     * Inhects a string into another string at the specified location.
-     * <pre>
-     * injectString("Arttory", "ifac", 3) = "Artifactory"
-     * injectString("rtifactory", "A", 0) = "Artifactory"
-     * injectString("Artifactor", "y", 10) = "Artifactory"
-     * injectString("Artifactory", "", 15) = "Artifactory"
-     * </pre>
-     *
-     * @param str            the string to insert another string to
-     * @param toInject       string to inject
-     * @param injectionIndex where
-     * @return The resulting string
-     */
-    public static String injectString(String str, String toInject, int injectionIndex) {
-        if (!hasText(str) || !hasText(toInject)) {
-            return str;
-        }
-
-        return str.substring(0, injectionIndex) + toInject + str.substring(injectionIndex);
-    }
-
-    /**
-     * Returns the path elements of the input path.
-     * <pre>
-     * getPathElements("/a/b/c") = [a, b, c]
-     * getPathElements("a/b/c") = [a, b, c]
-     * getPathElements("a/b/c/") = [a, b, c]
-     * getPathElements("a") = [a]
-     * getPathElements("") = []
-     * </pre>
-     *
-     * @param path The path to parse (can be absolute or relative)
-     * @return The path's path elements
-     */
-    public static String[] getPathElements(String path) {
-        if (path == null) {
-            return new String[0];
-        }
-        if (path.startsWith("/")) {
-            // we don't want to return empty string as a path element so remove the leading slash
-            path = path.substring(1);
-        }
-
-        return path.split("/");
-    }
-
-    /**
-     * Get the ancesstor path based on the specified depth
-     *
-     * @param path  The path to compute the ncesstor for
-     * @param depth The depth
-     * @return The ancesstor path
-     * @throws IllegalArgumentException If depth is bigger than the number of path compponents
-     */
-    public static String getAncesstor(String path, int depth) {
-        String[] elements = getPathElements(path);
-        if (elements.length < depth) {
-            throw new IllegalArgumentException("Ancesstor of level " + depth + " does not exist for " + path + ".");
-        }
-        StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < elements.length - depth; i++) {
-            String element = elements[i];
-            if (sb.length() > 0) {
-                sb.append('/');
-            }
-            sb.append(element);
-        }
-        if (path.startsWith("/")) {
-            sb.insert(0, '/');
-        }
-        return sb.toString();
-    }
-
-    /**
-     * Returns the first path element of the input path.
-     * <pre>
-     * getFirstPathElement("/a/b/c") = "a"
-     * getFirstPathElement("a/b/c") = "a"
-     * getFirstPathElement("a") = "a"
-     * getFirstPathElement("") = ""
-     * </pre>
-     *
-     * @param path The path to parse (can be absolute or relative)
-     * @return The path's path elements
-     */
-    public static String getFirstPathElement(String path) {
-        if (path == null) {
-            return null;
-        }
-        String[] elements = getPathElements(path);
-        if (elements.length > 0) {
-            return elements[0];
-        } else {
-            return "";
-        }
-    }
-
-    /**
-     * Returns the last path element of the input path.
-     * <pre>
-     * getFirstPathElement("/a/b/c") = "c"
-     * getFirstPathElement("a/b/c") = "c"
-     * getFirstPathElement("a") = "a"
-     * getFirstPathElement("") = ""
-     * </pre>
-     *
-     * @param path The path to parse (can be absolute or relative)
-     * @return The path's path elements
-     */
-    public static String getLastPathElement(String path) {
-        if (path == null) {
-            return null;
-        }
-        String[] elements = getPathElements(path);
-        if (elements.length > 0) {
-            return elements[elements.length - 1];
-        } else {
-            return "";
-        }
-    }
-
-    /**
-     * Strips the first path element from the input path.
-     * <pre>
-     * stripFirstPathElement("/a/b/c") = "b/c"
-     * stripFirstPathElement("a/b/c/") = "b/c/"
-     * stripFirstPathElement("a") = ""
-     * stripFirstPathElement("/") = ""
-     * stripFirstPathElement("") = ""
-     * stripFirstPathElement(null) = null
-     * </pre>
-     *
-     * @param path The path to strip from (can be absolute or relative)
-     * @return The path without the first path element
-     */
-    public static String stripFirstPathElement(String path) {
-        if (path == null) {
-            return null;
-        }
-
-        path = trimLeadingSlashes(path);
-        int indexOfFirstSlash = path.indexOf('/');
-        if (indexOfFirstSlash < 0) {
-            return "";
-        } else {
-            return path.substring(indexOfFirstSlash + 1);
-        }
-    }
-
-    public static boolean isDirectoryPath(String path) {
-        return StringUtils.isEmpty(path) || path.matches(".*[/\\\\]$");
-    }
-
-    public static String[] splitZipResourcePathIfExist(String path, boolean recursive) {
-        int zipResourceStart = path.indexOf(RepoPath.ARCHIVE_SEP);
-        if (zipResourceStart > 0) {
-            String zipResourcePath = path.substring(zipResourceStart + 1, path.length());
-            if (zipResourcePath.startsWith("/")) {
-                // all paths are relative inside the zip, so remove the '/' from the beginning
-                zipResourcePath = zipResourcePath.substring(1, zipResourcePath.length());
-            }
-            String[] subSplit;
-            if (recursive) {
-                subSplit = splitZipResourcePathIfExist(zipResourcePath, true);
-            } else {
-                subSplit = new String[]{zipResourcePath};
-            }
-            String[] result = new String[subSplit.length + 1];
-            // remove the zip resource sub path from the main path
-            result[0] = path.substring(0, zipResourceStart);
-            System.arraycopy(subSplit, 0, result, 1, result.length - 1);
-            return result;
-        }
-        return new String[]{path};
-    }
-}
diff --git a/base/papi/src/main/java/org/artifactory/util/StringInputStream.java b/base/papi/src/main/java/org/artifactory/util/StringInputStream.java
deleted file mode 100644
index 87414c9..0000000
--- a/base/papi/src/main/java/org/artifactory/util/StringInputStream.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import com.google.common.base.Charsets;
-
-import java.io.ByteArrayInputStream;
-import java.io.UnsupportedEncodingException;
-
-/**
- * Creates an input stream from a string.
- *
- * @author Yossi Shaul
- */
-public class StringInputStream extends ByteArrayInputStream {
-
-    private int length;
-
-    public StringInputStream(String string) throws UnsupportedEncodingException {
-        this(string, Charsets.UTF_8.displayName());
-    }
-
-    public StringInputStream(String string, String encoding) throws UnsupportedEncodingException {
-        super(string.getBytes(encoding));
-        this.length = super.buf.length;
-    }
-
-    /**
-     * @return The length, in bytes, of the input stream
-     */
-    public int getLength() {
-        return length;
-    }
-}
diff --git a/base/papi/src/test/java/org/artifactory/addon/plugin/PluginInfoTest.java b/base/papi/src/test/java/org/artifactory/addon/plugin/PluginInfoTest.java
deleted file mode 100644
index d81223b..0000000
--- a/base/papi/src/test/java/org/artifactory/addon/plugin/PluginInfoTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.plugin;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import org.testng.annotations.Test;
-
-import java.util.List;
-import java.util.Map;
-
-import static org.testng.Assert.*;
-
-/**
- * @author Noam Y. Tenne
- */
- at Test
-public class PluginInfoTest {
-
-    @Test
-    public void testConstructorWithNoClosureMap() throws Exception {
-        PluginInfo info = new PluginInfo("name", null);
-        assertEquals(info.getName(), "name");
-        assertNull(info.getDescription());
-        assertTrue(info.getParams().isEmpty());
-        assertEquals(info.getVersion(), "undefined");
-        assertFalse(info.isGroupPermitted("any"));
-        assertFalse(info.isUserPermitted("any"));
-    }
-
-    @Test
-    public void testConstructor() throws Exception {
-        Map<String, Object> paramMap = Maps.newHashMap();
-        paramMap.put("version", "1.0");
-        paramMap.put("description", "desc");
-
-        List<String> userList = Lists.newArrayList("user1", "user2");
-        paramMap.put("users", userList);
-
-        List<String> groupList = Lists.newArrayList("group1", "group2");
-        paramMap.put("groups", groupList);
-
-        Map<Object,Object> infoParams = Maps.newHashMap();
-        paramMap.put("params", infoParams);
-        PluginInfo info = new PluginInfo("name", paramMap);
-
-        assertEquals(info.getName(), "name");
-        assertEquals(info.getVersion(), "1.0");
-        assertEquals(info.getDescription(), "desc");
-        assertEquals(info.getParams(), infoParams);
-        assertTrue(info.isGroupPermitted("group1"));
-        assertTrue(info.isGroupPermitted("group2"));
-        assertFalse(info.isGroupPermitted("group3"));
-        assertTrue(info.isUserPermitted("user1"));
-        assertTrue(info.isUserPermitted("user2"));
-        assertFalse(info.isUserPermitted("user3"));
-    }
-}
diff --git a/base/papi/src/test/java/org/artifactory/util/PathUtilTest.java b/base/papi/src/test/java/org/artifactory/util/PathUtilTest.java
deleted file mode 100644
index 1fef782..0000000
--- a/base/papi/src/test/java/org/artifactory/util/PathUtilTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * Tests for PathUtil
- *
- * @author Gidi Shabat
- */
- at Test
-public class PathUtilTest {
-    //
-    @Test
-    public void getPathNameTest() {
-        Assert.assertEquals(PathUtils.getFileName("a"), "a");
-        Assert.assertEquals(PathUtils.getFileName("//a"), "a");
-        Assert.assertEquals(PathUtils.getFileName("a://a"), "a");
-        Assert.assertEquals(PathUtils.getFileName("a/b/c"), "c");
-        Assert.assertEquals(PathUtils.getFileName("a/b/////c"), "c");
-        Assert.assertEquals(PathUtils.getFileName("//a/b/////c//"), "c");
-        Assert.assertEquals(PathUtils.getFileName("//a/b/////?//"), "?");
-        Assert.assertEquals(PathUtils.getFileName("//a/b/////.//"), ".");
-        Assert.assertEquals(PathUtils.getFileName("a:properties"), "a:properties");
-        Assert.assertEquals(PathUtils.getFileName("///a:properties"), "a:properties");
-        Assert.assertEquals(PathUtils.getFileName("///a/b/c:properties"), "c:properties");
-        Assert.assertEquals(PathUtils.getFileName("///a\\b\\c"), "c");
-        Assert.assertEquals(PathUtils.getFileName("///a\\b\\\\c"), "c");
-        Assert.assertEquals(PathUtils.getFileName("text.txt"), "text.txt");
-        Assert.assertEquals(PathUtils.getFileName("a/b/text.txt"), "text.txt");
-        Assert.assertEquals(PathUtils.getFileName("a/b/text.txt\\"), "text.txt");
-    }
-}
diff --git a/base/pom.xml b/base/pom.xml
deleted file mode 100644
index 70898ef..0000000
--- a/base/pom.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0          http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.artifactory</groupId>
-        <artifactId>artifactory-parent</artifactId>
-        <version>4.8.0</version>
-    </parent>
-
-    <artifactId>artifactory-base-parent</artifactId>
-    <packaging>pom</packaging>
-    <name>Artifactory Base Parent</name>
-
-    <modules>
-        <module>capi</module>
-        <module>papi</module>
-        <module>config</module>
-        <module>api</module>
-        <module>common</module>
-        <module>log</module>
-    </modules>
-
-</project>
diff --git a/distribution/standalone/src/main/install/bin/artifactory-service.exe b/bin/artifactory-service.exe
similarity index 100%
rename from distribution/standalone/src/main/install/bin/artifactory-service.exe
rename to bin/artifactory-service.exe
diff --git a/distribution/standalone/src/main/install/bin/artifactory.bat b/bin/artifactory.bat
similarity index 100%
rename from distribution/standalone/src/main/install/bin/artifactory.bat
rename to bin/artifactory.bat
diff --git a/bin/artifactory.default b/bin/artifactory.default
new file mode 100755
index 0000000..51cc4f5
--- /dev/null
+++ b/bin/artifactory.default
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+#Default values
+#export ARTIFACTORY_HOME=/var/opt/jfrog/artifactory
+#export ARTIFACTORY_USER=artifactory
+#export JAVA_HOME=/opt/java/1.8.0
+
+export TOMCAT_HOME=$ARTIFACTORY_HOME/tomcat
+export ARTIFACTORY_PID=$ARTIFACTORY_HOME/run/artifactory.pid
+
+export JAVA_OPTIONS="-server -Xms512m -Xmx2g -Xss256k -XX:+UseG1GC -XX:OnOutOfMemoryError=\"kill -9 %p\""
+export JAVA_OPTIONS="$JAVA_OPTIONS -Djruby.compile.invokedynamic=false -Dfile.encoding=UTF8 -Dartdist=zip -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true -Djava.security.egd=file:/dev/./urandom"
+
+# Timeout waiting for artifactory to start
+# START_TMO=60
diff --git a/bin/artifactory.sh b/bin/artifactory.sh
new file mode 100755
index 0000000..7c71d01
--- /dev/null
+++ b/bin/artifactory.sh
@@ -0,0 +1,190 @@
+#!/bin/bash
+#
+# Startup script for Artifactory in Tomcat Servlet Engine
+#
+
+#
+errorArtHome() {
+    echo
+    echo -e "\033[31m** $1\033[0m"
+    echo
+    exit 1
+}
+
+checkArtHome() {
+    if [ -z "$ARTIFACTORY_HOME" ] || [ ! -d "$ARTIFACTORY_HOME" ]; then
+        errorArtHome "ERROR: Artifactory home folder not defined or does not exists at $ARTIFACTORY_HOME"
+    fi
+}
+
+checkTomcatHome() {
+    if [ -z "$TOMCAT_HOME" ] || [ ! -d "$TOMCAT_HOME" ]; then
+        errorArtHome "ERROR: Tomcat Artifactory folder not defined or does not exists at $TOMCAT_HOME"
+    fi
+    export CATALINA_HOME="$TOMCAT_HOME"
+}
+
+createLogsLink() {
+    mkdir -p $ARTIFACTORY_HOME/logs/catalina || errorArtHome "Could not create dir $ARTIFACTORY_HOME/logs/catalina"
+    if [ ! -L "$TOMCAT_HOME/logs" ];
+    then
+        ln -s $ARTIFACTORY_HOME/logs/catalina $TOMCAT_HOME/logs || \
+            errorArtHome "Could not create link from $TOMCAT_HOME/logs to $ARTIFACTORY_HOME/logs/catalina"
+    fi
+}
+
+findShutdownPort() {
+
+    SHUTDOWN_PORT=`netstat -vatn|grep LISTEN|grep $CATALINA_MGNT_PORT|wc -l`
+}
+
+isAlive() {
+    pidValue=""
+    javaPs=""
+    if [ -e "$ARTIFACTORY_PID" ]; then
+        pidValue=`cat $ARTIFACTORY_PID`
+        if [ -n "$pidValue" ]; then
+            javaPs="`ps -p $pidValue | grep java`"
+        fi
+    fi
+}
+
+stop() {
+echo finding
+    # The default CATALINA_MGNT_PORT is 8015
+    CATALINA_MGNT_PORT=8015
+    echo "Using the default catalina management port ($CATALINA_MGNT_PORT) to test shutdown"
+    isAlive
+    findShutdownPort
+    if [ $SHUTDOWN_PORT -eq 0 ] && [ -z "$javaPs" ]; then
+        echo "Artifactory Tomcat already stopped"
+        RETVAL=0
+    else
+        echo "Stopping Artifactory Tomcat..."
+        if [ $SHUTDOWN_PORT -ne 0 ]; then
+            $TOMCAT_HOME/bin/shutdown.sh
+            RETVAL=$?
+        else
+            RETVAL=1
+        fi
+        killed=false
+        if [ $RETVAL -ne 0 ]; then
+            echo "WARN: Artifactory Tomcat server shutdown script failed. Sending kill signal to $pidValue"
+            if [ -n "$pidValue" ]; then
+                killed=true
+                kill $pidValue
+                RETVAL=$?
+            fi
+        fi
+        # Wait 2 seconds for process to die
+        sleep 2
+        findShutdownPort
+        isAlive
+        nbSeconds=1
+        while [ $SHUTDOWN_PORT -ne 0 ] || [ -n "$javaPs" ] && [ $nbSeconds -lt 30 ]; do
+            if [ $nbSeconds -eq 10 ] && [ -n "$pidValue" ]; then
+                # After 10 seconds try to kill the process
+                echo "WARN: Artifactory Tomcat server shutdown not done after 10 seconds. Sending kill signal"
+                kill $pidValue
+                RETVAL=$?
+            fi
+            if [ $nbSeconds -eq 25 ] && [ -n "$pidValue" ]; then
+                # After 25 seconds try to kill -9 the process
+                echo "WARN: Artifactory Tomcat server shutdown not done after 25 seconds. Sending kill -9 signal"
+                kill -9 $pidValue
+                RETVAL=$?
+            fi
+            sleep 1
+            let "nbSeconds = $nbSeconds + 1"
+            findShutdownPort
+            isAlive
+        done
+        if [ $SHUTDOWN_PORT -eq 0 ] && [ -z "$javaPs" ]; then
+           echo "Artifactory Tomcat stopped"
+        else
+           echo "ERROR: Artifactory Tomcat did not stop"
+           RETVAL=1
+        fi
+    fi
+    [ $RETVAL=0 ] && rm -f "$ARTIFACTORY_PID"
+}
+
+start() {
+    export CATALINA_OPTS="$JAVA_OPTIONS -Dartifactory.home=$ARTIFACTORY_HOME -Dfile.encoding=UTF8 -Djruby.compile.invokedynamic=false"
+    export CATALINA_PID="$ARTIFACTORY_PID"
+    [ -x $TOMCAT_HOME/bin/catalina.sh ] || chmod +x $TOMCAT_HOME/bin/*.sh
+    if [ -z "$@" ];
+    then
+        #default to catalina.sh run
+        $TOMCAT_HOME/bin/catalina.sh run
+    else
+        #create $ARTIFACTORY_HOME/run
+        if [ -n "$ARTIFACTORY_PID" ];
+        then
+            mkdir -p $(dirname "$ARTIFACTORY_PID") || \
+                errorArtHome "Could not create dir for $ARTIFACTORY_PID";
+        fi
+        if [ "$@" == "stop" ];
+        then
+            stop
+        else
+            $TOMCAT_HOME/bin/catalina.sh "$@"
+        fi
+    fi
+}
+
+check() {
+    if [ -f $ARTIFACTORY_PID ]; then
+        echo "Artifactory is running, on pid="`cat $ARTIFACTORY_PID`
+        echo ""
+        exit 0
+    fi
+
+    echo "Checking arguments to Artifactory: "
+    echo "ARTIFACTORY_HOME     =  $ARTIFACTORY_HOME"
+    echo "TOMCAT_HOME          =  $TOMCAT_HOME"
+    echo "ARTIFACTORY_PID      =  $ARTIFACTORY_PID"
+    echo "JAVA_HOME            =  $JAVA_HOME"
+    echo "JAVA_OPTIONS         =  $JAVA_OPTIONS"
+    echo
+
+    exit 1
+}
+
+checkJavaVersion(){
+    if [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]];  then
+        echo "Found java executable in JAVA_HOME ($JAVA_HOME)"
+        _java="$JAVA_HOME/bin/java"
+    elif type -p java; then
+        _java=java
+    else
+        echo "No java found"
+    fi
+
+    if [[ "$_java" ]]; then
+        "$_java" -version 2>&1| \
+        awk -F\" '/version/{\
+            if ($2 < 1.8) {\
+                printf "%s is too old must be at least java 1.8\n", $2;\
+                exit 0;\
+            } else exit 1}' && exit 99
+    fi
+}
+
+#
+artBinDir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+export ARTIFACTORY_HOME="$(cd "$(dirname "${artBinDir}")" && pwd)"
+artDefaultFile="$artBinDir/artifactory.default"
+
+. $artDefaultFile || errorArtHome "ERROR: $artDefaultFile does not exist or not executable"
+
+if [ "x$1" = "xcheck" ]; then
+    check
+fi
+
+checkJavaVersion
+checkArtHome
+checkTomcatHome
+createLogsLink
+
+start "$@"
diff --git a/distribution/standalone/src/main/install/bin/artifactoryctl b/bin/artifactoryctl
similarity index 100%
rename from distribution/standalone/src/main/install/bin/artifactoryctl
rename to bin/artifactoryctl
diff --git a/distribution/standalone/src/main/install/bin/configure.mysql.sh b/bin/configure.mysql.sh
similarity index 100%
rename from distribution/standalone/src/main/install/bin/configure.mysql.sh
rename to bin/configure.mysql.sh
diff --git a/distribution/standalone/src/main/install/bin/installService.bat b/bin/installService.bat
similarity index 100%
rename from distribution/standalone/src/main/install/bin/installService.bat
rename to bin/installService.bat
diff --git a/bin/installService.sh b/bin/installService.sh
new file mode 100755
index 0000000..36e35e1
--- /dev/null
+++ b/bin/installService.sh
@@ -0,0 +1,245 @@
+#!/bin/bash
+
+#
+errorArtHome() {
+    echo
+    echo -e "\033[31m** ERROR: $1\033[0m"
+    echo
+    exit 1
+}
+
+checkRoot() {
+    curUser=
+    if [ -x "/usr/xpg4/bin/id" ]
+    then
+        curUser=`/usr/xpg4/bin/id -nu`
+    else
+        curUser=`id -nu`
+    fi
+    if [ "$curUser" != "root" ]
+    then
+        errorArtHome "Only root user can install artifactory as a service"
+    fi
+
+    if [ "$0" = "." ] || [ "$0" = "source" ]; then
+        errorArtHome "Cannot execute script with source $0"
+    fi
+}
+
+getArtUser() {
+    if [ -n "$1" ]; then
+        ARTIFACTORY_USER=$1
+    fi
+    if [ -z "$ARTIFACTORY_USER" ]; then
+        ARTIFACTORY_USER=artifactory
+    fi
+}
+
+createArtUser() {
+    echo -n "Creating user ${ARTIFACTORY_USER}..."
+    artifactoryUsername=`getent passwd ${ARTIFACTORY_USER} | awk -F: '{print $1}'`
+    if [ "$artifactoryUsername" = "${ARTIFACTORY_USER}" ]; then
+        echo -n "already exists..."
+    else
+        echo -n "creating..."
+        useradd -M -s /usr/sbin/nologin ${ARTIFACTORY_USER}
+        if [ ! $? ]; then
+            errorArtHome "Could not create user ${ARTIFACTORY_USER}"
+        fi
+    fi
+    echo " DONE"
+}
+
+getArtGroup() {
+    if [ -n "$1" ]; then
+        ARTIFACTORY_GROUP=$1
+    fi
+}
+
+createArtGroup() {
+    [ "${ARTIFACTORY_GROUP}" == "" ] && return 0;
+    echo -n "Creating Group ${ARTIFACTORY_GROUP}..."
+    artifactoryGroupname=`getent group ${ARTIFACTORY_GROUP} | awk -F: '{print $1}'`
+    if [ "$artifactoryGroupname" = "${ARTIFACTORY_GROUP}" ]; then
+        echo -n "already exists..."
+    else
+        echo -n "creating..."
+        groupadd ${ARTIFACTORY_GROUP}
+        if [ ! $? ]; then
+            errorArtHome "Could not create Group ${ARTIFACTORY_GROUP}"
+        fi
+    fi
+    echo " DONE"
+}
+
+createArtEtc() {
+    echo
+    echo -n "Checking configuration link and files in $artEtcDir..."
+    if [ -L ${ARTIFACTORY_HOME}/etc ]; then
+        echo -n "already exists, no change..."
+    else
+        echo
+        echo -n "Moving configuration dir $artExtractDir/etc $artExtractDir/etc.original..."
+        mv $artExtractDir/etc $artExtractDir/etc.original || \
+            errorArtHome "Could not move $artExtractDir/etc $artExtractDir/etc.original"
+        if [ ! -d $artEtcDir ]; then
+            mkdir -p $artEtcDir || errorArtHome "Could not create $artEtcDir"
+        fi
+        echo -n "creating the link and updating dir..."
+        ln -s $artEtcDir $ARTIFACTORY_HOME/etc && \
+        cp -R $artExtractDir/etc.original/* $artEtcDir && \
+        etcOK=true
+        [ $etcOK ] || errorArtHome "Could not create $artEtcDir"
+    fi
+    echo -e " DONE"
+}
+
+createArtDefault() {
+    echo -n "Creating environment file $artDefaultFile..."
+    if [ -e $artDefaultFile ]; then
+        echo -n "already exists, no change..."
+    else
+        # Populating the /etc/opt/jfrog/artifactory/default with ARTIFACTORY_HOME and ARTIFACTORY_USER
+        echo -n "creating..."
+        cat ${ARTIFACTORY_HOME}/bin/artifactory.default > $artDefaultFile && \
+        echo "" >> $artDefaultFile
+
+        sed --in-place -e "
+            s,#export ARTIFACTORY_HOME=.*,export ARTIFACTORY_HOME=${ARTIFACTORY_HOME},g;
+            s,#export ARTIFACTORY_USER=.*,export ARTIFACTORY_USER=${ARTIFACTORY_USER},g;
+            s,export TOMCAT_HOME=.*,export TOMCAT_HOME=${TOMCAT_HOME},g;
+            s,export $ARTIFACTORY_PID=.*,export $ARTIFACTORY_PID=${artRunDir}/artifactory.pid,g;" $artDefaultFile || \
+                errorArtHome "Could not change values in $artDefaultFile"
+    fi
+    echo -e " DONE"
+    echo -e "\033[33m** INFO: Please edit the files in $artEtcDir to set the correct environment\033[0m"
+    echo -e "\033[33mEspecially $artDefaultFile that defines ARTIFACTORY_HOME, JAVA_HOME and JAVA_OPTIONS\033[0m"
+}
+
+createArtRun() {
+    # Since tomcat 6.0.24 the PID file cannot be created before running catalina.sh. Using /var/opt/jfrog/artifactory/run folder.
+    if [ ! -d "$artRunDir" ]; then
+        mkdir -p "$artRunDir" || errorArtHome "Could not create $artRunDir"
+    fi
+}
+
+installService() {
+    serviceName=$(basename $artServiceFile)
+    serviceFiles=$artBinDir/../misc/service
+    if [ -e "$artServiceFile" ]; then
+        cp -f $artServiceFile $serviceFiles/$serviceName.init.backup
+    fi
+    cp -f $serviceFiles/artifactory $artServiceFile
+    chmod a+x $artServiceFile
+
+    #change pidfile and default location if needed
+    sed --in-place -e "
+     /processname:/ s%artifactory%$serviceName%g;
+     /Provides:/ s%artifactory%$serviceName%g;
+     s%# pidfile: .*%# pidfile: $artRunDir/artifactory.pid%g;
+     s%/etc/opt/jfrog/artifactory/default%$artEtcDir/default%g;
+     " $artServiceFile || errorArtHome "Could not change values in $artServiceFile"
+
+    # Try update-rc.d for debian/ubuntu else use chkconfig
+    if [ -x /usr/sbin/update-rc.d ]; then
+        echo
+        echo -n "Initializing artifactory service with update-rc.d..."
+        update-rc.d $serviceName defaults && \
+        chkconfigOK=true
+    elif [ -x /usr/sbin/chkconfig ] || [ -x /sbin/chkconfig ]; then
+        echo
+        echo -n "Initializing $serviceName service with chkconfig..."
+        chkconfig --add $serviceName && \
+        chkconfig $serviceName on && \
+        chkconfig --list $serviceName && \
+        chkconfigOK=true
+    else
+        ln -s $artServiceFile /etc/rc3.d/S99$serviceName && \
+        chkconfigOK=true
+    fi
+    [ $chkconfigOK ] || errorArtHome "Could not install service"
+    echo -e " DONE"
+}
+
+prepareTomcat() {
+    cp $serviceFiles/setenv.sh $TOMCAT_HOME/bin/setenv.sh && \
+     sed --in-place -e "
+      s%/etc/opt/jfrog/artifactory/default%$artEtcDir/default%g;
+      " $TOMCAT_HOME/bin/setenv.sh && \
+      chmod a+x $TOMCAT_HOME/bin/* || errorArtHome "Could not set the $TOMCAT_HOME/bin/setenv.sh"
+
+    if [ ! -L "$TOMCAT_HOME/logs" ]; then
+        if [ -d $TOMCAT_HOME/logs ]; then
+            mv $TOMCAT_HOME/logs $TOMCAT_HOME/logs.original
+            mkdir $TOMCAT_HOME/logs
+        fi
+        mkdir -p $artLogDir/catalina || errorArtHome "Could not create dir $artLogDir/catalina"
+        ln -s $artLogDir/catalina $TOMCAT_HOME/logs && \
+        chmod -R u+w $TOMCAT_HOME/logs && \
+        logOK=true
+        [ logOK ] || errorArtHome "Could not create link from $TOMCAT_HOME/logs to $artLogDir/catalina"
+    fi
+    if [ ! -d $TOMCAT_HOME/temp ];then
+        mkdir $TOMCAT_HOME/temp
+    fi
+    chmod -R u+w ${TOMCAT_HOME}/work
+}
+
+setPermissions() {
+    echo
+    echo -n "Setting file permissions..."
+    chown -RL ${ARTIFACTORY_USER}:${ARTIFACTORY_GROUP} ${ARTIFACTORY_HOME} || errorArtHome "Could not set permissions"
+    echo -e " DONE"
+}
+
+##
+checkRoot
+
+artBinDir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+artExtractDir="$(cd "$(dirname "$artBinDir")" && pwd)"
+
+ARTIFACTORY_HOME="$artExtractDir"
+[ -n "$artEtcDir" ] || artEtcDir="/etc/opt/jfrog/artifactory"
+TOMCAT_HOME="$ARTIFACTORY_HOME/tomcat"
+artLogDir="$ARTIFACTORY_HOME/logs"
+artRunDir="$ARTIFACTORY_HOME/run"
+[ -n "$artServiceFile" ] || artServiceFile="/etc/init.d/artifactory"
+artDefaultFile="$artEtcDir/default"
+
+getArtUser "$1"
+getArtGroup "$2"
+
+echo
+echo "Installing artifactory as a Unix service that will run as user ${ARTIFACTORY_USER}${ARTIFACTORY_GROUP:+ and group $ARTIFACTORY_GROUP}"
+echo "Installing artifactory with home ${ARTIFACTORY_HOME}"
+
+createArtUser
+
+createArtGroup
+
+createArtEtc
+
+createArtDefault
+
+createArtRun
+
+installService
+
+prepareTomcat
+
+setPermissions
+
+echo
+echo -e "\033[33m************ SUCCESS ****************\033[0m"
+echo -e "\033[33mInstallation of Artifactory completed\033[0m"
+echo
+echo "Please check $artEtcDir, $TOMCAT_HOME and $ARTIFACTORY_HOME folders"
+echo "Please check $artServiceFile startup script"
+echo
+echo "you can now check installation by running:"
+echo "> service artifactory check (or $artServiceFile check)"
+echo
+echo "Then activate artifactory with:"
+echo "> service artifactory start (or $artServiceFile start)"
+echo
+
diff --git a/distribution/standalone/src/main/install/bin/uninstallService.bat b/bin/uninstallService.bat
similarity index 100%
rename from distribution/standalone/src/main/install/bin/uninstallService.bat
rename to bin/uninstallService.bat
diff --git a/bin/uninstallService.sh b/bin/uninstallService.sh
new file mode 100755
index 0000000..d4fa144
--- /dev/null
+++ b/bin/uninstallService.sh
@@ -0,0 +1,150 @@
+#!/bin/bash
+
+error() {
+    echo -e "\n\033[31m** ERROR: $1\033[0m\n" && exit 1
+}
+
+checkRoot() {
+    curUser=
+    if [ -x "/usr/xpg4/bin/id" ]
+    then
+        curUser=`/usr/xpg4/bin/id -nu`
+    else
+        curUser=`id -nu`
+    fi
+    if [ "$curUser" != "root" ]
+    then
+        error "Only root user can install artifactory as a service"
+    fi
+
+    if [ "$0" = "." ] || [ "$0" = "source" ]; then
+        error "Cannot execute script with source $0"
+    fi
+}
+
+shutdown() {
+  if [ -f $artServiceFile ]; then
+    SERVICE_STATUS="`$artServiceFile status`"
+    if [[ ! "$artServiceFile" =~ .*[sS]topped.* ]]; then
+      echo
+      echo "Stopping the artifactory service..."
+      $artServiceFile stop || exit $?
+      echo -e " DONE"
+    fi
+  fi
+}
+
+uninstallService() {
+  serviceName=$(basename $artServiceFile)
+
+  echo
+  echo -n "Removing the artifactory service from auto-start..."
+  if [ -x /usr/sbin/update-rc.d ]; then
+    /usr/sbin/update-rc.d -f $serviceName remove && removeOk=true
+  elif [ -x /usr/sbin/chkconfig ]; then
+    /usr/sbin/chkconfig --del $serviceName && removeOk=true
+  elif [ -x /sbin/chkconfig ]; then
+    /sbin/chkconfig --del $serviceName && removeOk=true
+  fi
+
+  [ $removeOk ] || error "Could not uninstall service"
+
+  removeOk=
+  if [ -x $artServiceFile ]; then
+    rm $artServiceFile && removeOk=true
+  fi
+
+  [ $removeOk ] || error "Could not delete $artServiceFile"
+
+  removeOk=
+  rm $TOMCAT_HOME/bin/setenv.sh && removeOk=true
+
+  [ $removeOk ] || error "Could not delete $TOMCAT_HOME/bin/setenv.sh"
+
+  echo -e " DONE"
+}
+
+createBackup() {
+  # if some files in data move them to a backup folder
+  if [ -d "$ARTIFACTORY_HOME/data" ]; then
+    TIMESTAMP=`echo "$(date '+%T')" | tr -d ":"`
+    CURRENT_TIME="$(date '+%Y%m%d').$TIMESTAMP"
+    BACKUP_DIR="$ARTIFACTORY_HOME/artifactory.backup.${CURRENT_TIME}"
+
+    echo -n "Creating a backup of the artifactory home folder in ${BACKUP_DIR}..."
+    mkdir -p "${BACKUP_DIR}" && \
+    mv $artEtcDir "${BACKUP_DIR}/etc" && \
+    mv $ARTIFACTORY_HOME/data "${BACKUP_DIR}/data" && \
+    mv $ARTIFACTORY_HOME/logs "${BACKUP_DIR}/logs" && \
+    rm -rf "${BACKUP_DIR}/data/tmp" && \
+    rm -rf "${BACKUP_DIR}/data/work" || exit $?
+    if [ -e $TOMCAT_HOME/lib/mysql-connector-java*.jar ]; then
+      echo "MySQL connector found"
+      mv $TOMCAT_HOME/lib/mysql-connector-java* "${BACKUP_DIR}" || exit $?
+    fi
+    if [ -e $ARTIFACTORY_HOME/backup ]; then
+      mv $ARTIFACTORY_HOME/backup "${BACKUP_DIR}/backup" || exit $?
+    fi
+    echo -e " DONE"
+  fi
+}
+
+removeArtUser() {
+  echo -n "Logging off user $ARTIFACTORY_USER..."
+  pkill -KILL -u $ARTIFACTORY_USER
+
+  rm -rf $ARTIFACTORY_HOME/work/* || exit $?
+
+  # Ignoring user folders since the home dir is deleted already by the RPM spec
+  echo -n "Removing user $ARTIFACTORY_USER..."
+  userdel $ARTIFACTORY_USER || exit $?
+
+  EXISTING_GROUP="`grep $artGroup /etc/group | awk -F ':' '{ print $1 }' 2>/dev/null`"
+  if [ "$EXISTING_GROUP" == "$artGroup" ]; then
+    echo "Removing group $artGroup"
+    groupdel $artGroup
+  fi
+  echo -e " DONE"
+}
+
+removeResources() {
+  rm -rf $artEtcDir && \
+  rm $ARTIFACTORY_HOME/etc && \
+  mv $ARTIFACTORY_HOME/etc.original $ARTIFACTORY_HOME/etc && \
+  removeOk=true
+
+  [ removeOk ] || error "Could not restore etc directory"
+
+  rm -rf $TOMCAT_HOME/logs
+  if [ -d $TOMCAT_HOME/logs.original ]; then
+    mv $TOMCAT_HOME/logs.original $TOMCAT_HOME/logs
+  fi
+}
+
+#
+artBinDir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+artExtractDir="$(cd "$(dirname "$artBinDir")" && pwd)"
+[ -n "$artServiceFile" ] || artServiceFile="/etc/init.d/artifactory"
+artDefaultFile="/etc/opt/jfrog/artifactory/default"
+[ -n "$artEtcDir" ] || artEtcDir="/etc/opt/jfrog/artifactory"
+
+checkRoot
+
+. $artDefaultFile || error "$artDefaultFile does not exist or not executable"
+[ -x $artServiceFile ] || error "Could not find artifactory service file at $artServiceFile. Nothing to uninstall."
+
+artGroup="$ARTIFACTORY_USER"
+
+shutdown
+
+uninstallService
+
+createBackup
+
+removeArtUser
+
+removeResources
+
+echo
+echo -e "\033[33mUninstallation of Artifactory completed\033[0m"
+echo -e "Please change the premissions of $ARTIFACTORY_HOME"
diff --git a/distribution/deb/CHANGES.txt b/distribution/deb/CHANGES.txt
deleted file mode 100644
index 4006955..0000000
--- a/distribution/deb/CHANGES.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-release date=09:20 08.07.2015,version=4.0,urgency=low,by=Jay Denebeim <jayd at jfrog.com>,distribution=deb
- * initial packaging
diff --git a/distribution/deb/pom.xml b/distribution/deb/pom.xml
deleted file mode 100644
index f903338..0000000
--- a/distribution/deb/pom.xml
+++ /dev/null
@@ -1,311 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>org.artifactory.oss.deb</groupId>
-    <artifactId>jfrog-artifactory-oss</artifactId>
-    <packaging>deb</packaging>
-    <name>Artifactory Oss deb</name>
-
-    <parent>
-        <groupId>org.artifactory.oss</groupId>
-        <artifactId>artifactory-distribution-parent</artifactId>
-        <version>4.8.0</version>
-    </parent>
-
-    <properties>
-        <artifactory>artifactory</artifactory>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-        <username>artifactory</username>
-        <group_name>artifactory</group_name>
-
-        <target_jfrog_home>/opt/jfrog</target_jfrog_home>
-        <target_artifactory_install>${target_jfrog_home}/${artifactory}</target_artifactory_install>
-        <target_jfrog_doc>${target_jfrog_home}/doc/${artifactory}-${project.version}</target_jfrog_doc>
-        <target_tomcat_home>${target_artifactory_install}/tomcat</target_tomcat_home>
-        <target_etc_dir>/etc</target_etc_dir>
-        <target_var_dir>/var${target_jfrog_home}</target_var_dir>
-        <target_artifactory_home>${target_var_dir}/${artifactory}</target_artifactory_home>
-
-    </properties>
-    <build>
-        <extensions>
-            <!-- Add support for the "deb" packaging -->
-            <extension>
-                <groupId>org.vafer</groupId>
-                <artifactId>jdeb</artifactId>
-                <version>1.4</version>
-            </extension>
-        </extensions>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>deb</id>
-            <dependencies>
-                <dependency>
-                    <groupId>${project.parent.groupId}</groupId>
-                    <artifactId>${zipFilename}</artifactId>
-                    <version>${project.version}</version>
-                    <type>zip</type>
-                </dependency>
-            </dependencies>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <version>2.9</version>
-                        <executions>
-                            <execution>
-                                <id>unpack</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>unpack</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>${project.parent.groupId}</groupId>
-                                            <artifactId>${zipFilename}</artifactId>
-                                            <version>${project.version}</version>
-                                            <type>zip</type>
-                                            <overWrite>true</overWrite>
-                                            <outputDirectory>${project.build.directory}</outputDirectory>
-                                        </artifactItem>
-                                    </artifactItems>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>com.google.code.maven-replacer-plugin</groupId>
-                        <artifactId>replacer</artifactId>
-                        <version>1.5.3</version>
-                        <executions>
-                            <execution>
-
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>replace</goal>
-                                </goals>
-
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <file>
-                                ${project.build.directory}/${zipDirname}-${project.version}/bin/artifactory.default
-                            </file>
-                            <outputFile>
-                                ${project.build.directory}/${zipDirname}-${project.version}/${target_etc_dir}/default
-                            </outputFile>
-                            <regex>true</regex>
-                            <variableTokenValueMap>
-                                export TOMCAT_HOME\=.*=export TOMCAT_HOME\=${target_tomcat_home},
-                                [#]*export ARTIFACTORY_USER\=.*=export ARTIFACTORY_USER\=${username},
-                                export ARTIFACTORY_PID\=.*=export ARTIFACTORY_PID\=${target_var_dir}/run/artifactory.pid,
-                                [#]*export ARTIFACTORY_HOME\=.*=export ARTIFACTORY_HOME\=${target_artifactory_home},
-                                -Dartdist\=zip=-Dartdist\=deb
-                            </variableTokenValueMap>
-                        </configuration>
-                    </plugin>
-                    <plugin>
-                        <artifactId>jdeb</artifactId>
-                        <groupId>org.vafer</groupId>
-                        <version>1.4</version>
-                        <executions>
-                            <execution>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>jdeb</goal>
-                                </goals>
-                                <configuration>
-                                    <verbose>true</verbose>
-                                    <snapshotExpand>false</snapshotExpand>
-                                    <!-- expand "SNAPSHOT" to what is in the "USER" env variable -->
-                                    <snapshotEnv>USER</snapshotEnv>
-                                    <controlDir>${basedir}/src/deb/control</controlDir>
-                                    <dataSet>
-
-                                        <data>
-                                            <type>template</type>
-                                            <paths>
-                                                <path>/opt/jfrog</path>
-                                                <path>${target_var_dir}</path>
-                                                <path>/etc/opt/jfrog</path>
-                                                <path>${target_jfrog_doc}</path>
-                                            </paths>
-                                            <mapper>
-                                                <type>perm</type>
-                                                <user>root</user>
-                                                <group>root</group>
-                                            </mapper>
-                                        </data>
-                                        <data>
-                                            <type>template</type>
-                                            <paths>
-                                                <path>${target_artifactory_install}</path>
-                                                <path>/etc${target_artifactory_install}</path>
-                                                <path>${target_var_dir}/run</path>
-                                                <path>${target_artifactory_home}</path>
-                                                <path>${target_artifactory_home}/logs/catalina</path>
-                                                <path>${target_tomcat_home}</path>
-                                            </paths>
-                                            <mapper>
-                                                <type>perm</type>
-                                                <user>${username}</user>
-                                                <group>${group_name}</group>
-                                            </mapper>
-                                        </data>
-                                        <data>
-                                            <!--src>${project.build.directory}/${project.build.finalName}</src-->
-                                            <src>${project.build.directory}/${zipDirname}-${project.version}
-                                            </src>
-                                            <type>directory</type>
-                                            <mapper>
-                                                <type>perm</type>
-                                                <prefix>${target_artifactory_install}</prefix>
-                                                <user>root</user>
-                                                <group>root</group>
-                                                <filemode>755</filemode>
-                                            </mapper>
-                                            <includes>**/bin/**</includes>
-                                            <excludes>
-                                                **/etc/**,*,**/*.bat,**/*.exe,tomcat,tomcat/temp,tomcat/webapps/**,tomcat/work
-                                            </excludes>
-                                        </data>
-                                        <data>
-                                            <!--src>${project.build.directory}/${project.build.finalName}</src-->
-                                            <src>${project.build.directory}/${zipDirname}-${project.version}
-                                            </src>
-                                            <type>directory</type>
-                                            <mapper>
-                                                <type>perm</type>
-                                                <prefix>${target_artifactory_install}</prefix>
-                                                <user>root</user>
-                                                <group>root</group>
-                                            </mapper>
-                                            <excludes>
-                                                **/etc/**,*,**/*.bat,**/*.exe,**/bin/**,tomcat,tomcat/temp,tomcat/webapps/**,tomcat/work
-                                            </excludes>
-                                        </data>
-                                        <data>
-                                            <!--src>${project.build.directory}/${project.build.finalName}</src-->
-                                            <src>${project.build.directory}/${zipDirname}-${project.version}
-                                            </src>
-                                            <type>directory</type>
-                                            <mapper>
-                                                <type>perm</type>
-                                                <prefix>${target_artifactory_install}</prefix>
-                                                <user>${username}</user>
-                                                <group>${group_name}</group>
-                                            </mapper>
-                                            <includes>tomcat/webapps/**</includes>
-                                        </data>
-                                        <data>
-                                            <!--src>${project.build.directory}/${project.build.finalName}</src-->
-                                            <src>
-                                                ${project.build.directory}/${zipDirname}-${project.version}/etc
-                                            </src>
-                                            <type>directory</type>
-                                            <conffile>true</conffile>
-                                            <mapper>
-                                                <type>perm</type>
-                                                <prefix>/etc${target_artifactory_install}</prefix>
-                                                <user>${username}</user>
-                                                <group>${group_name}</group>
-                                            </mapper>
-                                        </data>
-
-                                        <data>
-                                            <src>
-                                                ${project.build.directory}/${zipDirname}-${project.version}/misc/service/artifactory
-                                            </src>
-                                            <type>file</type>
-                                            <mapper>
-                                                <type>perm</type>
-                                                <prefix>/etc/init.d/</prefix>
-                                                <filemode>755</filemode>
-                                            </mapper>
-                                        </data>
-                                        <data>
-                                            <src>
-                                                ${project.build.directory}/${zipDirname}-${project.version}/misc/service/setenv.sh
-                                            </src>
-                                            <type>file</type>
-                                            <mapper>
-                                                <type>perm</type>
-                                                <prefix>${target_tomcat_home}/bin</prefix>
-                                                <filemode>755</filemode>
-                                            </mapper>
-                                        </data>
-                                        <data>
-                                            <type>files</type>
-                                            <paths>
-                                                <path>${project.build.directory}/${zipDirname}-${project.version}/Third-Parties-Usage-About-Box.html</path>
-                                                <path>${project.build.directory}/${zipDirname}-${project.version}/COPYING</path>
-                                                <path>${project.build.directory}/${zipDirname}-${project.version}/COPYING.LESSER</path>
-                                                <path>${project.build.directory}/${zipDirname}-${project.version}/README.txt</path>
-                                            </paths>
-                                            <dst>${target_jfrog_doc}</dst>
-                                        </data>
-                                        <data>
-                                            <type>link</type>
-                                            <symlink>true</symlink>
-                                            <linkName>${target_artifactory_home}/etc</linkName>
-                                            <linkTarget>/etc${target_artifactory_install}</linkTarget>
-                                        </data>
-
-                                        <data>
-                                            <type>link</type>
-                                            <symlink>true</symlink>
-                                            <linkName>${target_artifactory_home}/misc</linkName>
-                                            <linkTarget>${target_artifactory_install}/misc</linkTarget>
-                                        </data>
-
-                                        <data>
-                                            <type>link</type>
-                                            <symlink>true</symlink>
-                                            <linkName>${target_artifactory_home}/tomcat</linkName>
-                                            <linkTarget>${target_tomcat_home}</linkTarget>
-                                        </data>
-
-                                        <data>
-                                            <type>link</type>
-                                            <symlink>true</symlink>
-                                            <linkName>${target_artifactory_home}/webapps</linkName>
-                                            <linkTarget>${target_artifactory_install}/webapps</linkTarget>
-                                        </data>
-
-                                        <data>
-                                            <type>link</type>
-                                            <symlink>true</symlink>
-                                            <linkTarget>${target_artifactory_home}/logs/catalina</linkTarget>
-                                            <linkName>${target_tomcat_home}/logs</linkName>
-                                        </data>
-                                    </dataSet>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-</project>
diff --git a/distribution/deb/src/deb/control/control b/distribution/deb/src/deb/control/control
deleted file mode 100644
index f557c5d..0000000
--- a/distribution/deb/src/deb/control/control
+++ /dev/null
@@ -1,10 +0,0 @@
-Package: [[artifactId]]
-Version: [[version]]
-Section: misc
-Priority: low
-Architecture: all
-Description: [[description]]
-Maintainer: dev at jfrog.com
-Depends: net-tools
-Provides: artifactory
-Conflicts: jfrog-artifactory-pro, jfrog-artifactory-vrcs
diff --git a/distribution/deb/src/deb/control/postinst b/distribution/deb/src/deb/control/postinst
deleted file mode 100644
index 40b516d..0000000
--- a/distribution/deb/src/deb/control/postinst
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/usr/bin/env bash
-
-action=$1
-version=$2
-
-if [ "$action" = "configure" ]; then
-  echo "Adding the artifactory service to auto-start"
-  /usr/sbin/update-rc.d artifactory defaults >/dev/null || $?
-
-  echo
-  echo "The installation of Artifactory has completed successfully."
-  echo
-  echo "PLEASE NOTE: You can recover a backup done with Artifactory packages 3.0 and above using '/opt/jfrog/artifactory/bin/recover.backup.sh'. For upgrading from previous version of Artifactory please refer to the wiki http://wiki.jfrog.org/confluence/display/RTF/Upgrading+Artifactory"
-  echo "PLEASE NOTE: It is highly recommended to use Artifactory in conjunction with MySQL. You can easily configure this setup using '/opt/jfrog/artifactory/bin/configure.mysql.sh'."
-  echo
-fi
diff --git a/distribution/deb/src/deb/control/postrm b/distribution/deb/src/deb/control/postrm
deleted file mode 100644
index 23de557..0000000
--- a/distribution/deb/src/deb/control/postrm
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/usr/bin/env bash
-
-action=$1
-version=$2
-
-echo post uninstall [[name]] \$1 = $1 >>/tmp/rpminst
-
-if [ "$action" == "remove" ] || [ "$action" == "purge" ]; then
-  # It's an un-installation
-
-  getent passwd "[[username]]" 2>&1 1>/dev/null
-  if [ $? == 0 ]; then
-    echo "Logging off user [[username]]"
-    /usr/bin/pkill -KILL -u [[username]] 2>&1 1>/dev/null
-  fi
-
-  rm -rf [[target_artifactory_home]]/work [[target_artifactory_home]]/temp 2>/dev/null
-
-  # Ignoring user folders since the home dir is deleted already by the RPM spec
-  echo "Removing local user [[username]]"
-  ( grep -q [[username]] /etc/passwd &&
-  /usr/sbin/userdel [[username]] 2>/dev/null)
-
-  EXISTING_GROUP="`grep [[group_name]] /etc/group | awk -F ':' '{ print $1 }' 2>/dev/null`"
-  if [ "$EXISTING_GROUP" == "[[group_name]]" ]; then
-    echo "Removing group [[group_name]]"
-    /usr/sbin/groupdel [[group_name]]
-  fi
-
-  if [ "$action" == "purge" ]; then
-    echo "Purging artifactory"
-    rm -rf /etc/opt/jfrog/* /var/opt/jfrog/* [[target_tomcat_home]]/webapps [[target_tomcat_home]]/work
-  fi
-
-fi
-exit 0
\ No newline at end of file
diff --git a/distribution/deb/src/deb/control/preinst b/distribution/deb/src/deb/control/preinst
deleted file mode 100644
index 0c8db0a..0000000
--- a/distribution/deb/src/deb/control/preinst
+++ /dev/null
@@ -1,72 +0,0 @@
-#!/usr/bin/env bash
-
-action=$1
-version=$2
-
-CURRENT_USER=`id -nu`
-if [ "$CURRENT_USER" != "root" ]; then
-    echo
-    echo "ERROR: Please install Artifactory using root."
-    echo
-    exit 1
-fi
-
-SERVICE_FILE="/etc/init.d/[[artifactory]]"
-if [ -e "$SERVICE_FILE" ]; then
-    # Checking same layout. If not fails upgrade
-    if [ -z "`grep "/etc/opt/jfrog/artifactory/default" "$SERVICE_FILE"`" ]; then
-        echo "ERROR: The currently installed Artifactory version does not have the same layout as this DEB!"
-        echo "NOTE: To upgrade follow these instructions:"
-        echo "NOTE: - Uninstall the previous DEB (dpkg -r artifactory),"
-        echo "NOTE: - Then install this one (dpkg -i this_deb),"
-        echo "NOTE: - And finally recover from backup (/opt/jfrog/artifactory/bin/recover.backup.sh)"
-        exit 1
-    fi
-
-    # Shutting down the artifactory service if running
-    SERVICE_STATUS="`$SERVICE_FILE status`"
-    if [[ ! "$SERVICE_STATUS" =~ .*[sS]topped.* ]]; then
-        echo "Stopping the artifactory service..."
-        $SERVICE_FILE stop || exit $?
-    fi
-fi
-
-[ -e /etc/opt/jfrog/artifactory ] && read uid gid <<<$(stat -c '%u %g' /etc/opt/jfrog/artifactory)
-
-echo "Checking if group [[group_name]] exists..."
-getent group "[[group_name]]" 2>&1 1>/dev/null
-if [ $? != 0  ]; then
-  echo "Group [[group_name]] doesn't exist. Creating ..."
-  /usr/sbin/groupadd -r [[group_name]] ${gid:+-g} $gid|| exit $?
-else
-  echo "Group [[group_name]] exists."
-fi
-
-echo "Checking if user [[username]] exists..."
-
-getent passwd "[[username]]" 2>&1 1>/dev/null
-if [ $? != 0 ]; then
-  echo "User [[username]] doesn't exist. Creating ..."
-  /usr/sbin/useradd [[username]] -g [[username]] -d [[target_artifactory_home]] ${uid:+-u} $uid || exit $?
-else
-  echo "User [[username]] exists."
-fi
-
-echo "Checking if ARTIFACTORY_HOME exists"
-if [ ! -d "[[target_artifactory_home]]" ]; then
-  mkdir -p [[target_artifactory_home]]
-  chown -R [[username]]: [[target_artifactory_home]] || exit $?
-fi
-
-# Cleaning the artifactory webapp and work folder
-
-echo "Removing tomcat work directory"
-if [ -d [[target_tomcat_home]]/work ]; then
-  rm -rf [[target_tomcat_home]]/work || exit $?
-fi
-
-if [ -d [[target_tomcat_home]]/webapps/[[artifactory]] ]; then
-  echo "Removing Artifactory's exploded WAR directory"
-  rm -rf [[target_tomcat_home]]/webapps/[[artifactory]] || exit $?
-fi
-exit 0
diff --git a/distribution/deb/src/deb/control/prerm b/distribution/deb/src/deb/control/prerm
deleted file mode 100644
index e528442..0000000
--- a/distribution/deb/src/deb/control/prerm
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/usr/bin/env bash
-
-action=$1
-version=$2
-
-if [ "$action" == "remove" ]; then
-  # It's an un-installation
-
-  CURRENT_USER=`id -nu`
-  if [ "$CURRENT_USER" != "root" ]; then
-    echo
-    echo "ERROR: Please un-install Artifactory using root."
-    echo
-    exit 1
-  fi
-
-  SERVICE_FILE=/etc/init.d/artifactory
-
-  if [ -f $SERVICE_FILE ]; then
-    SERVICE_STATUS="`$SERVICE_FILE status`"
-    if [[ ! "$SERVICE_STATUS" =~ .*[sS]topped.* ]]; then
-      echo "Stopping the artifactory service..."
-      $SERVICE_FILE stop || exit $?
-    fi
-  fi
-
-  echo "Removing the artifactory service from auto-start"
-  # /sbin/chkconfig --del artifactory 2>/dev/null
-
-  # Create backups
-  echo "Creating a backup of the artifactory home folder in ${BACKUP_DIR}"
-  TIMESTAMP=`echo "$(date '+%T')" | tr -d ":"`
-  CURRENT_TIME="$(date '+%Y%m%d').$TIMESTAMP"
-  BACKUP_DIR="[[target_var_dir]]/artifactory.backup.${CURRENT_TIME}"
-
-  # ignore any failures or the package will be left in an inconsistent state
-  mkdir -p "${BACKUP_DIR}" && \
-  cp -a [[target_etc_dir]] "${BACKUP_DIR}/etc" && \
-  mv [[target_artifactory_home]]/logs "${BACKUP_DIR}/logs" 2>&1 1>/dev/null
-
-  if [ -d "[[target_artifactory_home]]/data" ]; then
-    rm -rf "[[target_artifactory_home]]/data/tmp" 2>&1 1>/dev/null
-    rm -rf "[[target_artifactory_home]]/data/work" 2>&1 1>/dev/null
-
-    if [ $(stat -c "%d" [[target_artifactory_home]]/data/) -eq $(stat -c "%d" ${BACKUP_DIR}) ]; then
-      echo "Backup [[target_artifactory_home]]/data to ${BACKUP_DIR}/data"
-      cp -a [[target_artifactory_home]]/data "${BACKUP_DIR}/data" 2>/dev/null
-    else
-      echo "PLEASE NOTE: Skipped creating a backup of the Artifactory data folder because source and target are not in the same drive [[[target_artifactory_home]]/data, ${BACKUP_DIR}/data/]"
-      cp -pr [[target_artifactory_home]]/data ${BACKUP_DIR}/data
-    fi
-  fi
-
-  if [ -e [[target_tomcat_home]]/lib/mysql-connector-java*.jar ]; then
-    echo "MySQL connector found"
-    cp [[target_tomcat_home]]/lib/mysql-connector-java* "${BACKUP_DIR}" 2>/dev/null
-  fi
-  if [ -e [[target_artifactory_home]]/backup ]; then
-    mv [[target_artifactory_home]]/backup "${BACKUP_DIR}/backup" 2>/dev/null
-  fi
-fi
-
-exit 0
diff --git a/distribution/pom.xml b/distribution/pom.xml
deleted file mode 100644
index a607686..0000000
--- a/distribution/pom.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0          http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.artifactory</groupId>
-        <artifactId>artifactory-parent</artifactId>
-        <version>4.8.0</version>
-    </parent>
-
-    <properties>
-        <zipDirname>artifactory-oss</zipDirname>
-        <zipFilename>jfrog-${zipDirname}</zipFilename>
-    </properties>
-
-    <groupId>org.artifactory.oss</groupId>
-    <artifactId>artifactory-distribution-parent</artifactId>
-    <packaging>pom</packaging>
-    <name>Artifactory Distribution Parent</name>
-
-    <modules>
-        <module>standalone</module>
-        <module>rpm</module>
-        <module>deb</module>
-    </modules>
-
-</project>
diff --git a/distribution/rpm/artifactory-oss.spec b/distribution/rpm/artifactory-oss.spec
deleted file mode 100644
index 40f47b3..0000000
--- a/distribution/rpm/artifactory-oss.spec
+++ /dev/null
@@ -1,339 +0,0 @@
-Name:           jfrog-artifactory-oss
-Provides:       artifactory = %{artifactory_version}
-Obsoletes:      artifactory >= 3.6.0
-Conflicts:      jfrog-artifactory-pro jfrog-artifactory-vrcs artifactory < 3.6.0
-Version:        %{artifactory_version}
-Release:        %{artifactory_release}
-Summary:        Binary Repository Manager
-Vendor:         JFrog Ltd.
-Group:          Development/Tools
-License:        LGPL
-URL:            http://www.jfrog.org
-Source0:        standalone.zip
-BuildRoot:      %{_tmppath}/build-%{name}-%{version}
-BuildArch:      noarch
-Requires:       %{_sbindir}/useradd, %{_sbindir}/groupadd, %{_bindir}/pkill, %{_bindir}/rsync net-tools
-
-%define username artifactory
-%define group_name artifactory
-%define extracted_standalone %{_sourcedir}/*artifactory*
-%define extracted_tomcat %{extracted_standalone}/tomcat
-
-#% define _rpmfilename %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm
-%define _rpmfilename %{filename_prefix}-%{full_version}.rpm
-
-%define target_jfrog_home /opt/jfrog
-%define target_artifactory_install %{target_jfrog_home}/artifactory
-%define target_jfrog_doc %{target_jfrog_home}/doc/artifactory-%{full_version}
-%define	target_tomcat_home %{target_artifactory_install}/tomcat
-%define target_etc_dir /etc%{target_artifactory_install}
-%define target_var_dir /var%{target_jfrog_home}
-%define target_artifactory_home %{target_var_dir}/artifactory
-
-%description
-The best binary repository manager around.
-
-%prep
-%setup -q -T -c
-%{__unzip} "%{SOURCE0}" -d "%{_sourcedir}"
-
-%build
-
-%install
-%__rm -rf %{buildroot}
-
-# Install and copy the files in the install dir (opt) directories
-%__install -d "%{buildroot}%{target_jfrog_home}"
-%__install -d "%{buildroot}%{target_artifactory_install}/bin"
-%__install -d "%{buildroot}%{target_artifactory_install}/misc"
-%__install -d "%{buildroot}%{target_tomcat_home}/webapps"
-
-# The war file is in Artifactory not tomcat webapps
-%__install -D %{extracted_standalone}/webapps/artifactory.war "%{buildroot}%{target_artifactory_install}/webapps/artifactory.war"
-
-%__cp -r %{extracted_standalone}/bin/* "%{buildroot}%{target_artifactory_install}/bin/"
-%__cp -r %{extracted_standalone}/misc/* "%{buildroot}%{target_artifactory_install}/misc/"
-rsync -r --exclude 'work' --exclude 'temp'  %{extracted_tomcat}/* "%{buildroot}%{target_tomcat_home}/"
-%__cp %{extracted_standalone}/misc/service/setenv.sh "%{buildroot}%{target_tomcat_home}/bin/"
-
-# Copy the etc dir to the from the build dir to the build root (currently contains default script)
-%__install -d "%{buildroot}%{target_etc_dir}"
-
-# Copy the contents of the standalone etc to the artifactory etc dir
-%__cp -r %{extracted_standalone}/etc/* "%{buildroot}%{target_etc_dir}"
-%__install -D %{extracted_standalone}/bin/artifactory.default "%{buildroot}%{target_etc_dir}/default"
-%__install -D %{extracted_standalone}/misc/service/artifactory "%{buildroot}%{_sysconfdir}/init.d/artifactory"
-
-# Replace the vars in the init and default scripts
-%__sed -r --in-place "s%#export ARTIFACTORY_HOME=.*%export ARTIFACTORY_HOME=%{target_artifactory_home}%g;" "%{buildroot}%{target_etc_dir}/default"
-%__sed -r --in-place "s%export TOMCAT_HOME=.*%export TOMCAT_HOME=%{target_tomcat_home}%g;" "%{buildroot}%{target_etc_dir}/default"
-%__sed -r --in-place "s/#export ARTIFACTORY_USER=.*/export ARTIFACTORY_USER=%{username}/g;" "%{buildroot}%{target_etc_dir}/default"
-%__sed -r --in-place "s%export ARTIFACTORY_PID=.*%export ARTIFACTORY_PID=%{target_var_dir}/run/artifactory.pid%g;" "%{buildroot}%{target_etc_dir}/default"
-%__sed -r --in-place "s%Dartdist=zip%Dartdist=rpm%g;" "%{buildroot}%{target_etc_dir}/default"
-
-# Create artifactory home dir (var) and symlinks to install dir (opt)
-%__install -d "%{buildroot}%{target_artifactory_home}"
-%__install -d "%{buildroot}%{target_var_dir}/run"
-
-# Link the folders
-%__ln_s "%{target_artifactory_install}/webapps" "%{buildroot}%{target_artifactory_home}/webapps"
-%__ln_s "%{target_artifactory_home}/temp" "%{buildroot}%{target_tomcat_home}/temp"
-%__ln_s "%{target_artifactory_home}/work" "%{buildroot}%{target_tomcat_home}/work"
-%__ln_s "/etc/opt/jfrog/artifactory" "%{buildroot}/var/opt/jfrog/artifactory/etc"
-%__ln_s "%{target_artifactory_install}/misc" "%{buildroot}%{target_artifactory_home}/misc"
-%__ln_s "%{target_artifactory_install}/tomcat" "%{buildroot}%{target_artifactory_home}/tomcat"
-
-# log directories installation
-%__ln_s "%{target_artifactory_home}/logs/catalina" "%{buildroot}%{target_tomcat_home}/logs"
-
-# Fill the documentation
-%__install -d "%{buildroot}%{target_jfrog_doc}"
-%__cp %{extracted_standalone}/Third-Parties-Usage-About-Box.html "%{buildroot}%{target_jfrog_doc}"
-%__cp %{extracted_standalone}/COPYING "%{buildroot}%{target_jfrog_doc}"
-%__cp %{extracted_standalone}/COPYING.LESSER "%{buildroot}%{target_jfrog_doc}"
-%__cp %{extracted_standalone}/README.txt "%{buildroot}%{target_jfrog_doc}"
-
-%clean
-%__rm -rf %{_builddir}/artifactory-%{version}
-
-%pre
-
-CURRENT_USER=`id -nu`
-if [ "$CURRENT_USER" != "root" ]; then
-    echo
-    echo "ERROR: Please install Artifactory using root."
-    echo
-    exit 1
-fi
-
-SERVICE_FILE="%{_sysconfdir}/init.d/artifactory"
-if [ -e "$SERVICE_FILE" ]; then
-    # Checking same layout. If not fails upgrade
-    if [ -z "`grep "%{target_etc_dir}/default" "$SERVICE_FILE"`" ]; then
-        echo "ERROR: The currently installed Artifactory version does not have the same layout as this RPM!"
-        echo "NOTE: To upgrade follow these instructions:"
-        echo "NOTE: - Uninstall the previous RPM (rpm -e artifactory),"
-        echo "NOTE: - Then install this one (rpm -i this_rpm),"
-        echo "NOTE: - And finally recover from backup (/opt/jfrog/artifactory/bin/recover.backup.sh)"
-        exit 1
-    fi
-
-    # Shutting down the artifactory service if running
-    SERVICE_STATUS="`$SERVICE_FILE status`"
-    if [[ ! "$SERVICE_STATUS" =~ .*[sS]topped.* ]]; then
-        echo "Stopping the artifactory service..."
-        $SERVICE_FILE stop || exit $?
-    fi
-fi
-
-[ -e /etc/opt/jfrog/artifactory ] && read uid gid <<<$(stat -c '%u %g' /etc/opt/jfrog/artifactory)
-
-echo "Checking if group %{group_name} exists..."
-getent group "%{group_name}" 2>&1 1>/dev/null
-if [ $? != 0  ]; then
-  echo "Group %{group_name} doesn't exist. Creating ..."
-  %{_sbindir}/groupadd -r %{group_name} ${gid:+-g} $gid|| exit $?
-else
-  echo "Group %{group_name} exists."
-fi
-
-echo "Checking if ARTIFACTORY_HOME exists"
-if [ ! -d "%{target_artifactory_home}" ]; then
-  %__mkdir_p %{target_artifactory_home}
-fi
-
-echo "Checking if user %{username} exists..."
-
-getent passwd "%{username}" 2>&1 1>/dev/null
-if [ $? != 0 ]; then
-  echo "User %{username} doesn't exist. Creating ..."
-  %{_sbindir}/useradd %{username} -g %{username} -d %{target_artifactory_home} ${uid:+-u} $uid || exit $?
-  chown %{username} %{target_artifactory_home} || exit $?
-else
-  echo "User %{username} exists."
-fi
-
-# Cleaning the artifactory webapp and work folder
-
-echo "Removing tomcat work directory"
-if [ -d %{target_tomcat_home}/work ]; then
-  %__rm -rf %{target_tomcat_home}/work || exit $?
-fi
-
-if [ -d %{target_tomcat_home}/webapps/artifactory ]; then
-  echo "Removing Artifactory's exploded WAR directory"
-  %__rm -rf %{target_tomcat_home}/webapps/artifactory || exit $?
-fi
-exit 0
-
-%post
-
-if [ "$1" = "1" ]; then
-  echo "Adding the artifactory service to auto-start"
-  /sbin/chkconfig --add artifactory || $?
-
-  echo
-  echo "The installation of Artifactory has completed successfully."
-  echo
-  echo "PLEASE NOTE: You can recover a backup done with Artifactory RPM 3.0 and above using '/opt/jfrog/artifactory/bin/recover.backup.sh'. For upgrading from previous version of Artifactory please refer to the wiki http://wiki.jfrog.org/confluence/display/RTF/Upgrading+Artifactory"
-  echo "PLEASE NOTE: It is highly recommended to use Artifactory in conjunction with MySQL. You can easily configure this setup using '/opt/jfrog/artifactory/bin/configure.mysql.sh'."
-  echo
-elif [ "$1" = "2" ]; then
-  echo "The upgrade of Artifactory has completed successfully."
-fi
-
-%preun
-if [ "$1" = "0" ]; then
-  # It's an un-installation
-
-  CURRENT_USER=`id -nu`
-  if [ "$CURRENT_USER" != "root" ]; then
-    echo
-    echo "ERROR: Please un-install Artifactory using root."
-    echo
-    exit 1
-  fi
-
-  SERVICE_FILE=%{_sysconfdir}/init.d/artifactory
-
-  if [ -f $SERVICE_FILE ]; then
-    SERVICE_STATUS="`$SERVICE_FILE status`"
-    if [[ ! "$SERVICE_STATUS" =~ .*[sS]topped.* ]]; then
-      echo "Stopping the artifactory service..."
-      $SERVICE_FILE stop || exit $?
-    fi
-  fi
-
-  echo "Removing the artifactory service from auto-start"
-  /sbin/chkconfig --del artifactory 2>/dev/null
-
-  # Create backups
-  echo "Creating a backup of the artifactory home folder in ${BACKUP_DIR}"
-  TIMESTAMP=`echo "$(date '+%T')" | tr -d ":"`
-  CURRENT_TIME="$(date '+%Y%m%d').$TIMESTAMP"
-  BACKUP_DIR="%{target_var_dir}/artifactory.backup.${CURRENT_TIME}"
-
-  # ignore any failures or the package will be left in an inconsistent state
-  %__mkdir_p "${BACKUP_DIR}" && \
-  %__cp -a %{target_etc_dir} "${BACKUP_DIR}/etc" && \
-  %__mv %{target_artifactory_home}/logs "${BACKUP_DIR}/logs" 2>&1 1>/dev/null
-
-  %__rm -rf "%{target_artifactory_home}/data/tmp" 2>&1 1>/dev/null
-  %__rm -rf "%{target_artifactory_home}/data/work" 2>&1 1>/dev/null
-
-  if [ -e %{target_tomcat_home}/lib/mysql-connector-java*.jar ]; then
-    echo "MySQL connector found"
-    %__cp %{target_tomcat_home}/lib/mysql-connector-java* "${BACKUP_DIR}" 2>/dev/null
-  fi
-  if [ -e %{target_artifactory_home}/backup ]; then
-    %__mv %{target_artifactory_home}/backup "${BACKUP_DIR}/backup" 2>/dev/null
-  fi
-fi
-
-exit 0
-
-%postun
-if [ "$1" = "0" ]; then
-  # It's an un-installation
-
-  echo "Logging off user %{username}"
-  %{_bindir}/pkill -KILL -u %{username}
-
-  %__rm -rf %{target_artifactory_home}/{work,temp} 2>/dev/null
-
-  # Ignoring user folders since the home dir is deleted already by the RPM spec
-  echo "Removing local user %{username}"
-  ( grep -q %{username} /etc/passwd &&
-  %{_sbindir}/userdel %{username} 2>/dev/null) || echo $?
-
-  EXISTING_GROUP="`grep %{group_name} /etc/group | awk -F ':' '{ print $1 }' 2>/dev/null`"
-  if [ "$EXISTING_GROUP" == "%{group_name}" ]; then
-    echo "Removing group %{group_name}"
-    %{_sbindir}/groupdel %{group_name}
-  fi
-
-fi
-exit 0
-
-%posttrans
-echo post transaction %{name} \$1 = $1 >>/tmp/rpminst
-[ -e /etc/opt/jfrog/artifactory ] && read uid gid <<<$(stat -c '%u %g' /etc/opt/jfrog/artifactory)
-
-echo "Checking if group %{group_name} exists..."
-getent group "%{group_name}" 2>&1 1>/dev/null
-if [ $? != 0  ]; then
-  echo "Group %{group_name} doesn't exist. Creating ..."
-  %{_sbindir}/groupadd -r %{group_name} ${gid:+-g} $gid|| exit $?
-else
-  echo "Group %{group_name} exists."
-fi
-
-echo "Checking if ARTIFACTORY_HOME exists"
-if [ ! -d "%{target_artifactory_home}" ]; then
-  %__mkdir_p %{target_artifactory_home}
-fi
-
-echo "Checking if user %{username} exists..."
-
-getent passwd "%{username}" 2>&1 1>/dev/null
-if [ $? != 0 ]; then
-  echo "User %{username} doesn't exist. Creating ..."
-  %{_sbindir}/useradd %{username} -g %{username} -d %{target_artifactory_home} ${uid:+-u} $uid || exit $?
-  chown %{username} %{target_artifactory_home} || exit $?
-else
-  echo "User %{username} exists."
-fi
-
-/sbin/chkconfig --list artifactory 2>&1 1>/dev/null || \
-( /sbin/chkconfig --add artifactory && \
-echo "Adding the artifactory service to auto-start" )
-
-exit 0
-
-%triggerpostun -- artifactory
-echo trigger post uninstall %{name} \$1 = $1 >>/tmp/rpminst
-exit 0
-
-%triggerun -- artifactory
-echo trigger uninstall %{name} \$1 = $1 >>/tmp/rpminst
-exit 0
-
-%files
-%dir %{target_jfrog_home}
-%dir %{target_jfrog_doc}
-%dir %{target_artifactory_install}
-%dir %{target_jfrog_home}/doc
-%attr(775,root,root) %config %{_sysconfdir}/init.d/artifactory
-%attr(775,root,root) %dir %{target_jfrog_home}
-%attr(775,root,root) %config %{target_artifactory_install}/bin
-%config %{target_artifactory_install}/misc
-%config %{target_artifactory_install}/webapps
-%attr(774,root,root) %{target_jfrog_doc}/Third-Parties-Usage-About-Box.html
-%attr(774,root,root) %{target_jfrog_doc}/COPYING
-%attr(774,root,root) %{target_jfrog_doc}/COPYING.LESSER
-%attr(774,root,root) %{target_jfrog_doc}/README.txt
-%attr(775,artifactory,artifactory) %dir %{target_tomcat_home}
-%attr(775,root,root) %config %{target_tomcat_home}/bin
-%attr(775,root,root) %config %{target_tomcat_home}/conf
-%attr(775,root,root) %{target_tomcat_home}/lib
-%{target_tomcat_home}/logs
-%{target_tomcat_home}/temp
-%{target_tomcat_home}/work
-%attr(775,artifactory,artifactory) %{target_artifactory_home}
-%attr(775,artifactory,artifactory) %{target_tomcat_home}/webapps
-%attr(774,root,root) %{target_tomcat_home}/LICENSE
-%attr(774,root,root) %{target_tomcat_home}/NOTICE
-%attr(774,root,root) %{target_tomcat_home}/RELEASE-NOTES
-%attr(774,root,root) %{target_tomcat_home}/RUNNING.txt
-
-%defattr(770,%{username}, %{group_name}, -)
-%{target_var_dir}/run
-%dir %{target_etc_dir}
-%dir /etc/opt/jfrog
-%config(noreplace) %{target_etc_dir}/artifactory.system.properties
-%config(missingok) %{target_etc_dir}/artifactory.config.xml
-%config(noreplace) %{target_etc_dir}/default
-%config(noreplace) %{target_etc_dir}/logback.xml
-%config %{target_etc_dir}/mimetypes.xml
-
-%doc
diff --git a/distribution/rpm/build.rpm.sh b/distribution/rpm/build.rpm.sh
deleted file mode 100755
index 9d09852..0000000
--- a/distribution/rpm/build.rpm.sh
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/bin/bash -e
-set -x
-if [ -z "$4" ]; then
-
-    echo
-    echo "Error: Usage is $0 productName fullVersion releaseNumber outBuildDir"
-    exit 1
-fi
-FILENAME_PREFIX="$1"
-FULL_VERSION="$2"
-RELEASE_NUMBER="$3"
-OUT_BUILD_DIR="$4"
-
-curDir="`dirname $0`"
-curDir="`cd $curDir; pwd`"
-RPM_SOURCES_DIR="$OUT_BUILD_DIR/SOURCES"
-
-if [ -z "$OUT_BUILD_DIR" ] || [ ! -d "$OUT_BUILD_DIR" ]; then
-    echo
-    echo "Error: The output directory $OUT_BUILD_DIR does not exists!"
-    exit 1
-fi
-
-echo
-ARTIFACTORY_VERSION=`echo "$FULL_VERSION" | sed 's/SNAPSHOT/devel/g; s/-/./g;'`
-
-cd $curDir && rpmbuild -bb \
---define="_tmppath $OUT_BUILD_DIR/tmp" \
---define="_topdir $PWD" \
---define="_rpmdir $OUT_BUILD_DIR" \
---define="buildroot $OUT_BUILD_DIR/BUILDROOT" \
---define="_sourcedir $RPM_SOURCES_DIR" \
---define="artifactory_version $ARTIFACTORY_VERSION" \
---define="artifactory_release $RELEASE_NUMBER" \
---define="filename_prefix $FILENAME_PREFIX" \
---define="full_version $FULL_VERSION" \
-SPECS/artifactory-oss.spec
diff --git a/distribution/rpm/pom.xml b/distribution/rpm/pom.xml
deleted file mode 100644
index c22d826..0000000
--- a/distribution/rpm/pom.xml
+++ /dev/null
@@ -1,152 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>org.artifactory.oss.rpm</groupId>
-    <artifactId>jfrog-artifactory-oss</artifactId>
-    <packaging>pom</packaging>
-    <name>Artifactory OSS RPM</name>
-
-    <parent>
-        <groupId>org.artifactory.oss</groupId>
-        <artifactId>artifactory-distribution-parent</artifactId>
-        <version>4.8.0</version>
-    </parent>
-
-    <properties>
-        <rpmbuild.dir>${project.build.directory}/rpmbuild</rpmbuild.dir>
-        <!-- Should be overridden by the build server and release process -->
-        <buildNumber.prop>devel</buildNumber.prop>
-    </properties>
-
-    <profiles>
-        <profile>
-            <id>rpm</id>
-            <dependencies>
-                <dependency>
-                    <groupId>org.artifactory.oss</groupId>
-                    <artifactId>${zipFilename}</artifactId>
-                    <version>${project.version}</version>
-                    <type>zip</type>
-                </dependency>
-            </dependencies>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-antrun-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <phase>package</phase>
-                                <configuration>
-                                    <target>
-                                        <exec dir="${project.basedir}" executable="mkdir">
-                                            <arg line="-p ${project.build.directory}/rpmbuild/BUILD            ${project.build.directory}/rpmbuild/BUILDROOT            ${project.build.directory}/rpmbuild/SOURCES            ${project.build.directory}/rpmbuild/SPECS            ${project.build.directory}/rpmbuild/SRPMS" />
-                                        </exec>
-                                        <exec dir="${project.basedir}" executable="cp">
-                                            <arg line="build.rpm.sh ${project.build.directory}/rpmbuild" />
-                                        </exec>
-                                        <exec dir="${project.basedir}" executable="cp">
-                                            <arg line="artifactory-oss.spec ${project.build.directory}/rpmbuild/SPECS" />
-                                        </exec>
-                                    </target>
-                                </configuration>
-                                <goals>
-                                    <goal>run</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>copy-zip</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>copy</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>org.artifactory.oss</groupId>
-                                            <artifactId>${zipFilename}</artifactId>
-                                            <version>${project.version}</version>
-                                            <type>zip</type>
-                                            <overWrite>true</overWrite>
-                                            <outputDirectory>${project.build.directory}/SOURCES</outputDirectory>
-                                            <destFileName>standalone.zip</destFileName>
-                                        </artifactItem>
-                                    </artifactItems>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>exec-maven-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>build-rpm</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>exec</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <executable>bash</executable>
-                            <workingDirectory>${rpmbuild.dir}</workingDirectory>
-                            <arguments>
-                                <argument>build.rpm.sh</argument>
-                                <argument>${project.artifactId}</argument>
-                                <argument>${project.version}</argument>
-                                <argument>${buildNumber.prop}</argument>
-                                <argument>${project.build.directory}</argument>
-                            </arguments>
-                        </configuration>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>build-helper-maven-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>attach-rpm</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>attach-artifact</goal>
-                                </goals>
-                                <configuration>
-                                    <artifacts>
-                                        <artifact>
-                                            <file>
-                                                ${project.build.directory}/${project.artifactId}-${project.version}.rpm
-                                            </file>
-                                            <type>rpm</type>
-                                        </artifact>
-                                    </artifacts>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-</project>
diff --git a/distribution/standalone/pom.xml b/distribution/standalone/pom.xml
deleted file mode 100644
index a0c06ae..0000000
--- a/distribution/standalone/pom.xml
+++ /dev/null
@@ -1,164 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>jfrog-artifactory-oss</artifactId>
-    <packaging>jar</packaging>
-    <name>Artifactory OSS Standalone</name>
-
-    <parent>
-        <groupId>org.artifactory.oss</groupId>
-        <artifactId>artifactory-distribution-parent</artifactId>
-        <version>4.8.0</version>
-    </parent>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jar-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>test-jar</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-web-war</artifactId>
-            <type>war</type>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.tomcat.embed</groupId>
-            <artifactId>tomcat-embed-core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.tomcat.embed</groupId>
-            <artifactId>tomcat-embed-logging-juli</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.tomcat.embed</groupId>
-            <artifactId>tomcat-embed-jasper</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-server</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-xml</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-webapp</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-ajp</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>mysql</groupId>
-            <artifactId>mysql-connector-java</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.oracle</groupId>
-            <artifactId>ojdbc6</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>postgresql</groupId>
-            <artifactId>postgresql</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.microsoft.sqlserver</groupId>
-            <artifactId>sqljdbc4</artifactId>
-        </dependency>
-        <!-- support running dev mode artifactory -->
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-web-application</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-    <profiles>
-        <profile>
-            <id>release</id>
-            <dependencies>
-                <dependency>
-                    <groupId>org.apache.tomcat</groupId>
-                    <artifactId>tomcat</artifactId>
-                    <type>zip</type>
-                </dependency>
-            </dependencies>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-dependency-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unpack</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>unpack</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>org.apache.tomcat</groupId>
-                                            <artifactId>tomcat</artifactId>
-                                            <type>zip</type>
-                                            <outputDirectory>${project.build.directory}/tomcat-extract</outputDirectory>
-                                        </artifactItem>
-                                    </artifactItems>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <artifactId>maven-assembly-plugin</artifactId>
-                        <configuration>
-                            <descriptors>
-                                <descriptor>src/assemble/assembly.xml</descriptor>
-                            </descriptors>
-                            <appendAssemblyId>false</appendAssemblyId>
-                        </configuration>
-                        <executions>
-                            <execution>
-                                <id>make-assembly</id>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>single</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-</project>
diff --git a/distribution/standalone/src/assemble/assembly.xml b/distribution/standalone/src/assemble/assembly.xml
deleted file mode 100644
index 3f413df..0000000
--- a/distribution/standalone/src/assemble/assembly.xml
+++ /dev/null
@@ -1,221 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
-          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
-    <id>standalone</id>
-    <formats>
-        <format>zip</format>
-    </formats>
-    <includeBaseDirectory>true</includeBaseDirectory>
-    <baseDirectory>${zipDirname}-${project.version}</baseDirectory>
-    <fileSets>
-        <!-- Removing the default annoying permissions of 777 -->
-        <fileSet>
-            <outputDirectory>/</outputDirectory>
-            <includes>
-                <include>./</include>
-            </includes>
-            <directoryMode>755</directoryMode>
-        </fileSet>
-        <fileSet>
-            <outputDirectory>/bin</outputDirectory>
-            <includes>
-                <include>./</include>
-            </includes>
-            <directoryMode>755</directoryMode>
-        </fileSet>
-        <fileSet>
-            <outputDirectory>/misc</outputDirectory>
-            <directoryMode>755</directoryMode>
-            <includes>
-                <include>./</include>
-            </includes>
-        </fileSet>
-        <fileSet>
-            <outputDirectory>/webapps</outputDirectory>
-            <directoryMode>755</directoryMode>
-            <includes>
-                <include>./</include>
-            </includes>
-        </fileSet>
-        <fileSet>
-            <outputDirectory>/logs</outputDirectory>
-            <directoryMode>755</directoryMode>
-            <includes>
-                <include>./</include>
-            </includes>
-        </fileSet>
-        <!-- add the root install directory excluding directories with special treatment below -->
-        <fileSet>
-            <directory>${project.basedir}/src/main/install</directory>
-            <outputDirectory>/</outputDirectory>
-            <excludes>
-                <exclude>bin/**</exclude>
-                <exclude>misc/**</exclude>
-                <exclude>tomcat/**</exclude>
-            </excludes>
-            <directoryMode>755</directoryMode>
-            <fileMode>644</fileMode>
-        </fileSet>
-        <fileSet>
-            <directory>${project.basedir}/src/main/install/bin</directory>
-            <outputDirectory>bin</outputDirectory>
-            <includes>
-                <include>**/*.bat</include>
-            </includes>
-            <lineEnding>dos</lineEnding>
-            <fileMode>644</fileMode>
-        </fileSet>
-        <fileSet>
-            <directory>${project.basedir}/src/main/install/bin</directory>
-            <outputDirectory>bin</outputDirectory>
-            <includes>
-                <include>*.sh</include>
-                <include>artifactoryctl</include>
-                <include>artifactory.default</include>
-            </includes>
-            <lineEnding>unix</lineEnding>
-            <fileMode>755</fileMode>
-        </fileSet>
-        <fileSet>
-            <directory>${project.basedir}/src/main/install/bin</directory>
-            <outputDirectory>bin</outputDirectory>
-            <includes>
-                <include>**/*.conf</include>
-                <include>**/*.exe</include>
-            </includes>
-            <fileMode>644</fileMode>
-        </fileSet>
-        <fileSet>
-            <directory>${project.basedir}/src/main/install/misc</directory>
-            <outputDirectory>misc</outputDirectory>
-            <filtered>true</filtered>
-            <directoryMode>755</directoryMode>
-            <fileMode>644</fileMode>
-        </fileSet>
-        <fileSet>
-            <directory>${project.basedir}/../../base/config/src/main/resources/META-INF/default</directory>
-            <outputDirectory>etc</outputDirectory>
-            <directoryMode>755</directoryMode>
-            <fileMode>644</fileMode>
-            <excludes>
-                <!-- default derby.properties is copied in runtime -->
-                <exclude>db/**</exclude>
-            </excludes>
-        </fileSet>
-        <fileSet>
-            <directory>${project.basedir}/target/tomcat-extract/apache-tomcat-${tomcat.version}</directory>
-            <outputDirectory>tomcat</outputDirectory>
-            <excludes>
-                <exclude>bin/*.sh</exclude>
-                <exclude>conf/server.xml</exclude>
-                <exclude>conf/logging.properties</exclude>
-                <exclude>conf/web.xml</exclude>
-                <exclude>conf/tomcat-users.xsd</exclude>
-                <exclude>logs</exclude>
-                <exclude>temp/safeToDelete.tmp</exclude>
-                <exclude>webapps/**</exclude>
-
-                <!--minimal tomcat-->
-                <exclude>conf/tomcat-users.xml</exclude>
-                <exclude>conf/context.xml</exclude>
-                <exclude>lib/catalina-ant.jar</exclude>
-                <exclude>lib/catalina-ha.jar</exclude>
-                <exclude>lib/catalina-storeconfig.jar</exclude>
-                <exclude>lib/catalina-tribes.jar</exclude>
-                <exclude>lib/ecj-*.jar</exclude>
-                <exclude>lib/jsp-api.jar</exclude>
-                <exclude>lib/jasper-el.jar</exclude>
-                <exclude>lib/jasper.jar</exclude>
-                <exclude>lib/jsp-api.jar</exclude>
-                <exclude>lib/tomcat-dbcp.jar</exclude>
-                <exclude>lib/tomcat-i18n-es.jar</exclude>
-                <exclude>lib/tomcat-i18n-fr.jar</exclude>
-                <exclude>lib/tomcat-i18n-ja.jar</exclude>
-                <exclude>lib/tomcat-jdbc.jar</exclude>
-                <exclude>lib/tomcat-websocket.jar</exclude>
-                <exclude>lib/websocket-api.jar</exclude>
-            </excludes>
-            <directoryMode>755</directoryMode>
-        </fileSet>
-        <fileSet>
-            <directory>${project.basedir}/target/tomcat-extract/apache-tomcat-${tomcat.version}</directory>
-            <outputDirectory>tomcat</outputDirectory>
-            <includes>
-                <include>bin/*.sh</include>
-            </includes>
-            <lineEnding>unix</lineEnding>
-            <fileMode>755</fileMode>
-        </fileSet>
-        <fileSet>
-            <directory>${project.basedir}/src/main/install/misc/tomcat</directory>
-            <outputDirectory>tomcat/conf</outputDirectory>
-            <includes>
-                <include>server.xml</include>
-            </includes>
-            <directoryMode>755</directoryMode>
-        </fileSet>
-        <fileSet>
-            <directory>${project.basedir}/src/main/install/misc/tomcat</directory>
-            <outputDirectory>tomcat/conf</outputDirectory>
-            <includes>
-                <include>logging.properties</include>
-                <include>web.xml</include>
-            </includes>
-            <directoryMode>755</directoryMode>
-        </fileSet>
-        <fileSet>
-            <directory>${project.basedir}/src/main/install/misc/tomcat</directory>
-            <outputDirectory>tomcat/conf/Catalina/localhost</outputDirectory>
-            <includes>
-                <include>artifactory.xml</include>
-            </includes>
-            <directoryMode>755</directoryMode>
-        </fileSet>
-        <fileSet>
-            <directory>${project.basedir}/src/main/install/misc/tomcat</directory>
-            <outputDirectory>tomcat/webapps/ROOT/</outputDirectory>
-            <includes>
-                <include>index.html</include>
-            </includes>
-            <directoryMode>755</directoryMode>
-        </fileSet>
-        <!-- Always leave this at the end since the assembly set 777 on it for all kind of bad reasons :(-->
-        <fileSet>
-            <outputDirectory>/</outputDirectory>
-            <includes>
-                <include>./</include>
-            </includes>
-            <directoryMode>755</directoryMode>
-        </fileSet>
-    </fileSets>
-    <dependencySets>
-        <!-- add the artifactory war file to the webapp dir -->
-        <dependencySet>
-            <outputDirectory>webapps</outputDirectory>
-            <outputFileNameMapping>artifactory.war</outputFileNameMapping>
-            <useStrictFiltering>true</useStrictFiltering>
-            <includes>
-                <include>org.artifactory:artifactory-web-war</include>
-            </includes>
-            <directoryMode>755</directoryMode>
-        </dependencySet>
-    </dependencySets>
-</assembly>
diff --git a/distribution/standalone/src/main/install/COPYING b/distribution/standalone/src/main/install/COPYING
deleted file mode 100644
index 94a9ed0..0000000
--- a/distribution/standalone/src/main/install/COPYING
+++ /dev/null
@@ -1,674 +0,0 @@
-                    GNU GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                            Preamble
-
-  The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
-  The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works.  By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users.  We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors.  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
-  To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights.  Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received.  You must make sure that they, too, receive
-or can get the source code.  And you must show them these terms so they
-know their rights.
-
-  Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
-  For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software.  For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
-  Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so.  This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software.  The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable.  Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products.  If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
-  Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary.  To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-                       TERMS AND CONDITIONS
-
-  0. Definitions.
-
-  "This License" refers to version 3 of the GNU General Public License.
-
-  "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
-  "The Program" refers to any copyrightable work licensed under this
-License.  Each licensee is addressed as "you".  "Licensees" and
-"recipients" may be individuals or organizations.
-
-  To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy.  The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
-  A "covered work" means either the unmodified Program or a work based
-on the Program.
-
-  To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy.  Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
-  To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies.  Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
-  An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License.  If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
-  1. Source Code.
-
-  The "source code" for a work means the preferred form of the work
-for making modifications to it.  "Object code" means any non-source
-form of a work.
-
-  A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
-  The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form.  A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
-  The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities.  However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work.  For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
-  The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
-  The Corresponding Source for a work in source code form is that
-same work.
-
-  2. Basic Permissions.
-
-  All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met.  This License explicitly affirms your unlimited
-permission to run the unmodified Program.  The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work.  This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
-  You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force.  You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright.  Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
-  Conveying under any other circumstances is permitted solely under
-the conditions stated below.  Sublicensing is not allowed; section 10
-makes it unnecessary.
-
-  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
-  No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
-  When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
-  4. Conveying Verbatim Copies.
-
-  You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
-  You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
-  5. Conveying Modified Source Versions.
-
-  You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
-    a) The work must carry prominent notices stating that you modified
-    it, and giving a relevant date.
-
-    b) The work must carry prominent notices stating that it is
-    released under this License and any conditions added under section
-    7.  This requirement modifies the requirement in section 4 to
-    "keep intact all notices".
-
-    c) You must license the entire work, as a whole, under this
-    License to anyone who comes into possession of a copy.  This
-    License will therefore apply, along with any applicable section 7
-    additional terms, to the whole of the work, and all its parts,
-    regardless of how they are packaged.  This License gives no
-    permission to license the work in any other way, but it does not
-    invalidate such permission if you have separately received it.
-
-    d) If the work has interactive user interfaces, each must display
-    Appropriate Legal Notices; however, if the Program has interactive
-    interfaces that do not display Appropriate Legal Notices, your
-    work need not make them do so.
-
-  A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit.  Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
-  6. Conveying Non-Source Forms.
-
-  You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
-    a) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by the
-    Corresponding Source fixed on a durable physical medium
-    customarily used for software interchange.
-
-    b) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by a
-    written offer, valid for at least three years and valid for as
-    long as you offer spare parts or customer support for that product
-    model, to give anyone who possesses the object code either (1) a
-    copy of the Corresponding Source for all the software in the
-    product that is covered by this License, on a durable physical
-    medium customarily used for software interchange, for a price no
-    more than your reasonable cost of physically performing this
-    conveying of source, or (2) access to copy the
-    Corresponding Source from a network server at no charge.
-
-    c) Convey individual copies of the object code with a copy of the
-    written offer to provide the Corresponding Source.  This
-    alternative is allowed only occasionally and noncommercially, and
-    only if you received the object code with such an offer, in accord
-    with subsection 6b.
-
-    d) Convey the object code by offering access from a designated
-    place (gratis or for a charge), and offer equivalent access to the
-    Corresponding Source in the same way through the same place at no
-    further charge.  You need not require recipients to copy the
-    Corresponding Source along with the object code.  If the place to
-    copy the object code is a network server, the Corresponding Source
-    may be on a different server (operated by you or a third party)
-    that supports equivalent copying facilities, provided you maintain
-    clear directions next to the object code saying where to find the
-    Corresponding Source.  Regardless of what server hosts the
-    Corresponding Source, you remain obligated to ensure that it is
-    available for as long as needed to satisfy these requirements.
-
-    e) Convey the object code using peer-to-peer transmission, provided
-    you inform other peers where the object code and Corresponding
-    Source of the work are being offered to the general public at no
-    charge under subsection 6d.
-
-  A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
-  A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling.  In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage.  For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product.  A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
-  "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source.  The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
-  If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information.  But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
-  The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed.  Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
-  Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
-  7. Additional Terms.
-
-  "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law.  If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
-  When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it.  (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.)  You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
-  Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
-    a) Disclaiming warranty or limiting liability differently from the
-    terms of sections 15 and 16 of this License; or
-
-    b) Requiring preservation of specified reasonable legal notices or
-    author attributions in that material or in the Appropriate Legal
-    Notices displayed by works containing it; or
-
-    c) Prohibiting misrepresentation of the origin of that material, or
-    requiring that modified versions of such material be marked in
-    reasonable ways as different from the original version; or
-
-    d) Limiting the use for publicity purposes of names of licensors or
-    authors of the material; or
-
-    e) Declining to grant rights under trademark law for use of some
-    trade names, trademarks, or service marks; or
-
-    f) Requiring indemnification of licensors and authors of that
-    material by anyone who conveys the material (or modified versions of
-    it) with contractual assumptions of liability to the recipient, for
-    any liability that these contractual assumptions directly impose on
-    those licensors and authors.
-
-  All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10.  If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term.  If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
-  If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
-  Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
-  8. Termination.
-
-  You may not propagate or modify a covered work except as expressly
-provided under this License.  Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
-  However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
-  Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
-  Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License.  If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
-  9. Acceptance Not Required for Having Copies.
-
-  You are not required to accept this License in order to receive or
-run a copy of the Program.  Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance.  However,
-nothing other than this License grants you permission to propagate or
-modify any covered work.  These actions infringe copyright if you do
-not accept this License.  Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
-  10. Automatic Licensing of Downstream Recipients.
-
-  Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License.  You are not responsible
-for enforcing compliance by third parties with this License.
-
-  An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations.  If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
-  You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License.  For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
-  11. Patents.
-
-  A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based.  The
-work thus licensed is called the contributor's "contributor version".
-
-  A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version.  For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
-  Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
-  In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement).  To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
-  If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients.  "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
-  If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
-  A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License.  You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
-  Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
-  12. No Surrender of Others' Freedom.
-
-  If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all.  For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
-  13. Use with the GNU Affero General Public License.
-
-  Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work.  The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
-  14. Revised Versions of this License.
-
-  The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-  Each version is given a distinguishing version number.  If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation.  If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
-  If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
-  Later license versions may give you additional or different
-permissions.  However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
-  15. Disclaimer of Warranty.
-
-  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. Limitation of Liability.
-
-  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
-  17. Interpretation of Sections 15 and 16.
-
-  If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
-                     END OF TERMS AND CONDITIONS
-
-            How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
-  If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
-    <program>  Copyright (C) <year>  <name of author>
-    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
-  You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-<http://www.gnu.org/licenses/>.
-
-  The GNU General Public License does not permit incorporating your program
-into proprietary programs.  If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library.  If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.  But first, please read
-<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/distribution/standalone/src/main/install/COPYING.LESSER b/distribution/standalone/src/main/install/COPYING.LESSER
deleted file mode 100644
index cca7fc2..0000000
--- a/distribution/standalone/src/main/install/COPYING.LESSER
+++ /dev/null
@@ -1,165 +0,0 @@
-		   GNU LESSER GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-
-  This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
-  0. Additional Definitions.
-
-  As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
-
-  "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
-  An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
-  A "Combined Work" is a work produced by combining or linking an
-Application with the Library.  The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
-
-  The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
-  The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
-  1. Exception to Section 3 of the GNU GPL.
-
-  You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
-  2. Conveying Modified Versions.
-
-  If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
-   a) under this License, provided that you make a good faith effort to
-   ensure that, in the event an Application does not supply the
-   function or data, the facility still operates, and performs
-   whatever part of its purpose remains meaningful, or
-
-   b) under the GNU GPL, with none of the additional permissions of
-   this License applicable to that copy.
-
-  3. Object Code Incorporating Material from Library Header Files.
-
-  The object code form of an Application may incorporate material from
-a header file that is part of the Library.  You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
-   a) Give prominent notice with each copy of the object code that the
-   Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the object code with a copy of the GNU GPL and this license
-   document.
-
-  4. Combined Works.
-
-  You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
-   a) Give prominent notice with each copy of the Combined Work that
-   the Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the Combined Work with a copy of the GNU GPL and this license
-   document.
-
-   c) For a Combined Work that displays copyright notices during
-   execution, include the copyright notice for the Library among
-   these notices, as well as a reference directing the user to the
-   copies of the GNU GPL and this license document.
-
-   d) Do one of the following:
-
-       0) Convey the Minimal Corresponding Source under the terms of this
-       License, and the Corresponding Application Code in a form
-       suitable for, and under terms that permit, the user to
-       recombine or relink the Application with a modified version of
-       the Linked Version to produce a modified Combined Work, in the
-       manner specified by section 6 of the GNU GPL for conveying
-       Corresponding Source.
-
-       1) Use a suitable shared library mechanism for linking with the
-       Library.  A suitable mechanism is one that (a) uses at run time
-       a copy of the Library already present on the user's computer
-       system, and (b) will operate properly with a modified version
-       of the Library that is interface-compatible with the Linked
-       Version.
-
-   e) Provide Installation Information, but only if you would otherwise
-   be required to provide such information under section 6 of the
-   GNU GPL, and only to the extent that such information is
-   necessary to install and execute a modified version of the
-   Combined Work produced by recombining or relinking the
-   Application with a modified version of the Linked Version. (If
-   you use option 4d0, the Installation Information must accompany
-   the Minimal Corresponding Source and Corresponding Application
-   Code. If you use option 4d1, you must provide the Installation
-   Information in the manner specified by section 6 of the GNU GPL
-   for conveying Corresponding Source.)
-
-  5. Combined Libraries.
-
-  You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
-   a) Accompany the combined library with a copy of the same work based
-   on the Library, uncombined with any other library facilities,
-   conveyed under the terms of this License.
-
-   b) Give prominent notice with the combined library that part of it
-   is a work based on the Library, and explaining where to find the
-   accompanying uncombined form of the same work.
-
-  6. Revised Versions of the GNU Lesser General Public License.
-
-  The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
-  Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
-  If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
-Library.
diff --git a/distribution/standalone/src/main/install/Third-Parties-Usage-About-Box.html b/distribution/standalone/src/main/install/Third-Parties-Usage-About-Box.html
deleted file mode 100644
index 72355ae..0000000
--- a/distribution/standalone/src/main/install/Third-Parties-Usage-About-Box.html
+++ /dev/null
@@ -1,1041 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-    <base target="_top">
-    <title>3rd party licenses</title></head>
-<body>
-<div>
-    <div align="center"><b>Artifactory - Third Parties - Usage - About Box</b></div>
-    <p/>
-    <b>This software includes the following UNMODIFIED third party software:</b>
-
-    <p/>
-    <table border="1">
-        <tr>
-            <td width="33%"><b>Third party software</b></td>
-            <td width="33%"><b>Third party URL</b></td>
-            <td width="33%"><b>Licensed under</b></td>
-        </tr>
-        <tr>
-            <td>Apache Tomcat 8<br/> Apache Tomcat is an open source software implementation of the Java Servlet and
-                JavaServer
-                Pages technologies
-            </td>
-            <td><p><a href="https://tomcat.apache.org/index.html">https://tomcat.apache.org/index.html</a></p></td>
-            <td>Apache License, Version 2.0 <p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-        <tr>
-            <td>PrettyTime<br/> Elapsed Timestamp Formatting and Conversion for Java</td>
-            <td><p><a href="http://ocpsoft.com/prettytime">http://ocpsoft.com/prettytime</a></p></td>
-            <td>Apache License, Version 2.0 <p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-        <tr>
-            <td>AOP alliance</td>
-            <td><p><a href="http://aopalliance.sourceforge.net">http://aopalliance.sourceforge.net</a></p></td>
-            <td>Public Domain</td>
-        </tr>
-        <tr>
-            <td>Apache Santuario</td>
-            <td><p><a href="http://santuario.apache.org/index.html">http://santuario.apache.org/index.html</a></p></td>
-            <td>Apache License, Version 2.0 <p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-        </tr>
-        <tr>
-            <td>JSR-250 - Common Annotations for the JavaTM Platform</td>
-            <td><p><a href="http://jcp.org/aboutJava/communityprocess/pfd/jsr250/index.html">http://jcp.org/aboutJava/communityprocess/pfd/jsr250/index.html</a>
-            </p></td>
-            <td><p>CDDL Version 1.0 1.
-
-                <p><a href="https://glassfish.dev.java.net/public/CDDLv1.0.html">https://glassfish.dev.java.net/public/CDDLv1.0.html</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>Streaming API for XML</td>
-            <td><p><a href=http://jcp.org/en/jsr/detail?id=17>http://jcp.org/en/jsr/detail?id=17 </a></p></td>
-            <td>CDDL Version 1.0 1. <p><a href=https://glassfish.dev.java.net/public/CDDLv1.0.html>https://glassfish.dev.java.net/public/CDDLv1.0.html</a>
-            </p></td>
-        </tr>
-        <tr>
-            <td>Ssh Server</td>
-            <td><p><a href=http://mina.apache.org/sshd-project/>http://mina.apache.org/sshd-project/</a></p></td>
-            <td>Apache License, Version 2.0<p><a
-                    href=http://www.apache.org/licenses/>http://www.apache.org/licenses/</a>
-            </p></td>
-        </tr>
-        <tr>
-            <td>JSR-311 - Java API for RESTful Web Services</td>
-            <td><p><a href=https://jsr311.dev.java.net/>https://jsr311.dev.java.net/</a></p></td>
-            <td>CDDL Version 1.0 1. <p><a href=https://glassfish.dev.java.net/public/CDDLv1.0.html>https://glassfish.dev.java.net/public/CDDLv1.0.html</a>
-            </p></td>
-        </tr>
-        <tr>
-            <td>Logback Logging framework</td>
-            <td><p><a href=http://logback.qos.ch/>http://logback.qos.ch/</a></p></td>
-            <td>Dual-licensed under EPL v1.0 and the LGPL 2.1 <p><a href=http://logback.qos.ch/license.html>http://logback.qos.ch/license.html</a>
-            </p></td>
-        </tr>
-        <tr>
-            <td>Stax2 API</td>
-            <td><p><a href=https://github.com/FasterXML/stax2-api>https://github.com/FasterXML/stax2-api</a></p></td>
-            <td>BSD License <p><a href=http://www.opensource.org/licenses/bsd-license.php>http://www.opensource.org/licenses/bsd-license.php</a>
-            </p></td>
-        </tr>
-        <tr>
-            <td>Stax Utils</td>
-            <td><p><a href=https://stax-utils.dev.java.net/>https://stax-utils.dev.java.net/</a></p></td>
-            <td>BSD License <p><a href=http://www.opensource.org/licenses/bsd-license.php>http://www.opensource.org/licenses/bsd-license.php</a>
-            </p></td>
-        </tr>
-        <tr>
-            <td>XStream Core</td>
-            <td><p><a href=https://github.com/codehaus/xstream>https://github.com/codehaus/xstream</a></p></td>
-            <td>BSD License <p><a href=http://www.opensource.org/licenses/bsd-license.php>http://www.opensource.org/licenses/bsd-license.php</a>
-            </p></td>
-        </tr>
-        <tr>
-            <td>Ivy</td>
-            <td><p><a href=http://ant.apache.org/ivy/>http://ant.apache.org/ivy/</a></p></td>
-            <td>Apache License, Version 2.0<p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p>
-            </td>
-        </tr>
-        <tr>
-            <td>Jersey</td>
-            <td><p><a href=https://jersey.dev.java.net/>https://jersey.dev.java.net/</a></p></td>
-            <td>CDDL Version 1.1 <p><a href="http://glassfish.java.net/public/CDDL+GPL_1_1.html">http://glassfish.java.net/public/CDDL+GPL_1_1.html</a>
-            </p></td>
-        </tr>
-        <tr>
-            <td>Plexus</td>
-            <td><p><a href=https://github.com/codehaus/plexus>https://github.com/codehaus/plexus</a></p></td>
-            <td>Apache License, Version 2.0 <p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-        <tr>
-            <td>Joda time</td>
-            <td><p><a href=http://joda-time.sourceforge.net/>http://joda-time.sourceforge.net/</a></p></td>
-            <td>Apache License, Version 2.0 <p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-        <tr>
-            <td>Commons BeanUtils</td>
-            <td><p><a href=http://commons.apache.org/beanutils/>http://commons.apache.org/beanutils/</a></p></td>
-            <td>Apache License, Version 2.0 <p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-        <tr>
-            <td>Commons Codec</td>
-            <td><p><a href=http://commons.apache.org/codec/>http://commons.apache.org/codec/</a></p></td>
-            <td>Apache License, Version 2.0 <p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-        <tr>
-            <td>Commons Collections</td>
-            <td><p><a href=http://commons.apache.org/collections/>http://commons.apache.org/collections/</a></p></td>
-            <td>Apache License, Version 2.0 <p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>Commons HttpClient</td>
-            <td><p><a href=http://hc.apache.org/index.html>http://hc.apache.org/index.html</a>
-            </p></td>
-            <td>Apache License, Version 2.0
-
-                <p>
-                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>Commons IO</td>
-            <td><p><a href=http://commons.apache.org/io/>http://commons.apache.org/io/</a></p></td>
-            <td>Apache License, Version 2.0
-
-                <p>
-                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>Commons Lang</td>
-            <td><p><a href=http://commons.apache.org/lang/>http://commons.apache.org/lang/</a></p>
-            </td>
-            <td>Apache License, Version 2.0
-
-                <p>
-                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-                </p></td>
-        </tr>
-        <td>Commons DButils</td>
-        <td><p><a href=http://commons.apache.org/dbutils/>http://commons.apache.org/dbutils/</a></p>
-        </td>
-        <td>Apache License, Version 2.0
-
-            <p>
-                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-        <tr>
-            <td>Google Guava Library</td>
-            <td><p><a href=http://code.google.com/p/guava-libraries/>http://code.google.com/p/guava-libraries/</a>
-            </p></td>
-            <td>Apache License, Version 2.0
-                <p>
-                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>Jackson</td>
-            <td><p><a href=https://github.com/codehaus/jackson>https://github.com/codehaus/jackson</a></p></td>
-            <td>Apache License, Version 2.0
-
-                <p>
-                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>Maven</td>
-            <td><p><a href=http://maven.apache.org/>http://maven.apache.org/</a></p></td>
-            <td>Apache License, Version 2.0
-
-                <p>
-                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>Wagon Provider API</td>
-            <td><p><a href=http://maven.apache.org/wagon/wagon-provider-api/index.html>http://maven.apache.org/wagon/wagon-provider-api/index.html</a>
-            </p></td>
-            <td>Apache License, Version 2.0
-
-                <p>
-                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>Plexus</td>
-            <td><p><a href=https://github.com/codehaus/plexus>https://github.com/codehaus/plexus</a></p></td>
-            <td>Apache License, Version 2.0
-
-                <p>
-                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>Spring</td>
-            <td><p><a href="0">http://www.springsource.org/</a></p></td>
-            <td>Apache License, Version 2.0
-
-                <p>
-                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>Spring Security</td>
-            <td><p><a
-                    href=http://static.springsource.org/spring-security/>http://static.springsource.org/spring-security/</a>
-            </p></td>
-            <td>Apache License, Version 2.0
-
-                <p>
-                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>Spring LDAP</td>
-            <td><p><a href=http://www.springsource.org/ldap>http://www.springsource.org/ldap</a></p></td>
-            <td>Apache License, Version 2.0
-
-                <p>
-                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>Apache derby</td>
-            <td><p><a href=http://db.apache.org/derby/>http://db.apache.org/derby/</a></p></td>
-            <td>Apache License, Version 2.0
-
-                <p>
-                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>Quartz</td>
-            <td><p><a href=http://www.quartz-scheduler.org/>http://www.quartz-scheduler.org/</a></p>
-            </td>
-            <td>Apache License, Version 2.0
-
-                <p>
-                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>Xml Pull Parser 3rd Edition (XPP3)</td>
-            <td><p><a
-                    href=http://www.extreme.indiana.edu/xgws/xsoap/xpp/>http://www.extreme.indiana.edu/xgws/xsoap/xpp/</a>
-            </p></td>
-            <td>LICENSE FOR THE Extreme! Lab PullParser
-
-                <p><a href=http://www.extreme.indiana.edu/xgws/xsoap/xpp/download/PullParser2/LICENSE.txt>http://www.extreme.indiana.edu/xgws/xsoap/xpp/download/PullParser2/LICENSE.txt</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>slf4j</td>
-            <td><p><a href=http://www.slf4j.org/>http://www.slf4j.org/</a></p></td>
-            <td>MIT License
-
-                <p>
-                    <a href=http://opensource.org/licenses/MIT>http://opensource.org/licenses/MIT</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>Woodstox
-
-                high-performance validating namespace-aware StAX-compliant (JSR-173) Open Source XML-processor written
-                in Java
-            </td>
-            <td><p><a href=https://github.com/codehaus/woodstox>https://github.com/codehaus/woodstox</a></p></td>
-            <td>Apache License, Version 2.0
-
-                <p>
-                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-                </p></td>
-        </tr>
-
-        <tr>
-            <td>JDom</td>
-            <td><p><a href=http://www.jdom.org/>http://www.jdom.org/</a></p></td>
-            <td>JDOM is available under an Apache-style open source license
-
-                <p>
-                    <a href=http://www.jdom.org/docs/faq.html#a0030>http://www.jdom.org/docs/faq.html#a0030</a>
-                </p>
-
-                Copyright (C) 2000-2012 Jason Hunter & Brett McLaughlin.<br> <a
-                        href="https://github.com/hunterhacker/jdom/blob/JDOM-2.0.5/LICENSE.txt">https://github.com/hunterhacker/jdom/blob/JDOM-2.0.5/LICENSE.txt</a>
-            </td>
-        </tr>
-        <tr>
-            <td>Classworlds</td>
-            <td><p><a href=https://github.com/codehaus/classworlds/tree/master/classworlds>https://github.com/codehaus/classworlds/tree/master/classworlds</a>
-            </p>
-            </td>
-            <td>Copyright 2002 (C) The Codehaus.
-
-                <p>
-                    <a href=https://github.com/codehaus/classworlds/blob/master/classworlds/LICENSE.txt>https://github.com/codehaus/classworlds/blob/master/classworlds/LICENSE.txt</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>JavaMail</td>
-            <td><p><a href=https://glassfish.dev.java.net/javaee5/mail/>https://glassfish.dev.java.net/javaee5/mail/</a>
-            </p></td>
-            <td>CDDL Version 1.0 1.
-                <p><a href=https://glassfish.dev.java.net/public/CDDLv1.0.html>https://glassfish.dev.java.net/public/CDDLv1.0.html</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>Lucene Core</td>
-            <td><p><a href=http://lucene.apache.org/>http://lucene.apache.org/</a>
-            </p></td>
-            <td>Apache License, Version 2.0
-
-                <p>
-                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>Dojo Toolkit</td>
-            <td><p><a href="http://www.dojotoolkit.org">http://www.dojotoolkit.org</a>
-            </p></td>
-            <td>Modified BSD
-                <p>
-                    <a href="http://o.dojotoolkit.org/license">http://o.dojotoolkit.org/license</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>Syntax Highlighter</td>
-            <td><p><a
-                    href="http://alexgorbatchev.com/SyntaxHighlighter/">http://alexgorbatchev.com/SyntaxHighlighter/</a>
-            </p></td>
-            <td>MIT
-                <p>
-                    <a href="http://alexgorbatchev.com/SyntaxHighlighter/about.html">http://alexgorbatchev.com/SyntaxHighlighter/about.html</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>Versions Maven Plugin</td>
-            <td><p><a href="http://www.mojohaus.org/">http://www.mojohaus.org/</a>
-            </p></td>
-            <td>Apache License, Version 2.0<p><a
-                    href="https://github.com/mojohaus/versions-maven-plugin/blob/master/LICENSE.txt">https://github.com/mojohaus/versions-maven-plugin/blob/master/LICENSE.txt</a>
-            </p></td>
-        </tr>
-        <tr>
-            <td>Atlassian Crowd REST Client</td>
-            <td><p><a href="https://bitbucket.org/atlassian/crowd-rest-client/overview">https://bitbucket.org/atlassian/crowd-rest-client/overview</a>
-            </p></td>
-            <td>Apache License, Version 2.0<p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-        <tr>
-            <td>The Web Services Description Language for Java Toolkit (WSDL4J)</td>
-            <td><p><a href="http://sourceforge.net/projects/wsdl4j">http://sourceforge.net/projects/wsdl4j</a>
-            </p></td>
-            <td>Common Public License 1.0<p><a href="http://www.opensource.org/licenses/cpl1.0.php">http://www.opensource.org/licenses/cpl1.0.php</a>
-            </p></td>
-        </tr>
-        <tr>
-            <td>atinject - JSR-330: Dependency Injection for Java</td>
-            <td><p><a href="http://code.google.com/p/atinject/">http://code.google.com/p/atinject/</a>
-            </p></td>
-            <td>Apache License, Version 2.0<p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-        <tr>
-            <td>Groovy - An agile dynamic language for the Java Platform</td>
-            <td><p><a href="http://www.groovy-lang.org/">http://www.groovy-lang.org/</a>
-            </p></td>
-            <td>Apache License, Version 2.0<p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-        <tr>
-            <td>Maven Indexer</td>
-            <td><p><a href="http://maven.apache.org/maven-indexer">http://maven.apache.org/maven-indexer</a>
-            </p></td>
-            <td>Apache License, Version 2.0
-                <p>
-                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>Aether API</td>
-            <td><p><a href="http://www.sonatype.org/aether/">http://maven.apache.org/maven-indexer</a>
-            </p></td>
-            <td>Eclipse Public License version 1.0
-                <p>
-                    <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>Aether Util</td>
-            <td><p><a href="http://www.sonatype.org/aether/">http://maven.apache.org/maven-indexer</a>
-            </p></td>
-            <td>Eclipse Public License version 1.0
-                <p>
-                    <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>JSR 330 - atinject</td>
-            <td><p><a href="https://code.google.com/p/atinject/">https://code.google.com/p/atinject/</a>
-            </p></td>
-            <td>Apache License, Version 2.0
-                <p>
-                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>Redline</td>
-            <td><p><a href="http://code.google.com/p/redline-rpm">http://code.google.com/p/redline-rpm</a>
-            </p></td>
-            <td>MIT License
-                <p>
-                    <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>Mimepull</td>
-            <td><p><a href="http://java.net/projects/mimepull">http://java.net/projects/mimepull</a>
-            </p></td>
-            <td>CDDL Version 1.1
-                <p>
-                    <a href="http://glassfish.java.net/public/CDDL+GPL_1_1.html">http://glassfish.java.net/public/CDDL+GPL_1_1.html</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>Bouncy Castle</td>
-            <td><p><a href="http://www.bouncycastle.org">http://www.bouncycastle.org</a>
-            </p></td>
-            <td>Bouncy Castle (adaptation of the MIT X11 License)
-                <p>
-                    <a href="http://www.bouncycastle.org/licence.html">http://www.bouncycastle.org/licence.html</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>Commons Compress</td>
-            <td><p><a href=http://commons.apache.org/compress/>http://commons.apache.org/compress/</a></p></td>
-            <td>Apache License, Version 2.0
-                <p>
-                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-                </p></td>
-        </tr>
-
-        <tr>
-            <td>Opensaml</td>
-            <td><p><a href="https://shibboleth.net/products/opensaml-java.html">https://shibboleth.net/products/opensaml-java.html</a>
-            </p></td>
-            <td>Apache License, Version 2.0
-                <p>
-                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-                </p></td>
-        </tr>
-
-        <tr>
-            <td>Xmltooling</td>
-            <td><p><a href="https://shibboleth.net/products/opensaml-java.html">https://shibboleth.net/products/opensaml-java.html</a>
-            </p></td>
-            <td>Apache License, Version 2.0
-                <p>
-                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-                </p></td>
-        </tr>
-
-        <tr>
-            <td>Openws</td>
-            <td><p><a href="https://shibboleth.net/products/opensaml-java.html">https://shibboleth.net/products/opensaml-java.html</a>
-            </p></td>
-            <td>Apache License, Version 2.0
-                <p>
-                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-                </p></td>
-        </tr>
-        <tr>
-            <td>Not Yet Commons SSL</td>
-            <td><p><a href="http://juliusdavies.ca/commons-ssl">http://juliusdavies.ca/commons-ssl/</a></p></td>
-            <td>Apache License, Version 2.0
-                <p>
-                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-                </p></td>
-        </tr>
-
-        <tr>
-            <td>Apache Velocity</td>
-            <td><p><a href=http://velocity.apache.org>http://velocity.apache.org/</a></p></td>
-            <td>Apache License, Version 2.0
-                <p>
-                    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-                </p></td>
-        </tr>
-
-        <tr>
-            <td>Owasp Esapi</td>
-            <td><p><a href="http://code.google.com/p/owasp-esapi-java/">http://code.google.com/p/owasp-esapi-java/</a>
-            </p></td>
-            <td>BSD-3-Clause
-                <p>
-                    <a href=http://opensource.org/licenses/BSD-3-Clause>http://opensource.org/licenses/BSD-3-Clause</a>
-                </p></td>
-        </tr>
-
-        <tr>
-            <td>JRuby</td>
-            <td><p><a href=http://jruby.org/>http://jruby.org/</a></p></td>
-            <td>Eclipse Public License version 1.0
-                <p>
-                    <a href=http://www.eclipse.org/legal/epl-v10.html>http://www.eclipse.org/legal/epl-v10.html</a>
-                </p></td>
-        </tr>
-
-        <tr>
-            <td>jnr-posix</td>
-            <td><p><a href=http://github.com/jnr>http://github.com/jnr</a></p></td>
-            <td>Common Public License 1.0<p><a href="http://www.opensource.org/licenses/cpl1.0.php">http://www.opensource.org/licenses/cpl1.0.php</a>
-        </tr>
-
-        <tr>
-            <td>jnr-ffi</td>
-            <td><p><a href=http://github.com/jnr-ffi>http://github.com/jnr-ffi</a></p></td>
-            <td>Apache License, Version 2.0 <p>
-                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>jnr-constants</td>
-            <td><p><a href=http://github.com/jnr-constants>http://github.com/jnr-constants</a></p></td>
-            <td>Apache License, Version 2.0 <p>
-                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>JZlib</td>
-            <td><p><a href="http://www.jcraft.com/jzlib"/>http://www.jcraft.com/jzlib/</a></p></td>
-            <td>BSD Style License<p>
-                <a href="http://www.jcraft.com/jzlib/LICENSE.txt">http://www.jcraft.com/jzlib/LICENSE.txt</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>SnakeYaml</td>
-            <td><p><a href=https://code.google.com/p/snakeyaml/>https://code.google.com/p/snakeyaml/</a></p></td>
-            <td>Apache License, Version 2.0 <p>
-                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>ioStreams</td>
-            <td><p><a href="https://github.com/yoshaul/iostreams">https://github.com/yoshaul/iostreams</a></p></td>
-            <td>Apache License, Version 2.0 <p>
-                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>Hazelcast</td>
-            <td><p><a href="http://www.hazelcast.com">http://www.hazelcast.com</a></p></td>
-            <td>Apache License, Version 2.0 <p>
-                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>Tomcat JDBC Connection Pool</td>
-            <td><p><a href="https://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html">https://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html</a>
-            </p></td>
-            <td>Apache License, Version 2.0 <p>
-                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>Java SemVer</td>
-            <td><p><a href="https://github.com/zafarkhaja/java-semver">https://github.com/zafarkhaja/java-semver</a></p>
-            </td>
-            <td>MIT License <p>
-                <a href=http://opensource.org/licenses/MIT>http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>Apache jclouds</td>
-            <td><p><a href="https://jclouds.apache.org/">https://jclouds.apache.org/</a></p></td>
-            <td>Apache License, Version 2.0 <p>
-                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>JetS3t</td>
-            <td><p><a href="http://www.jets3t.org/">http://www.jets3t.org/</a></p></td>
-            <td>Apache License, Version 2.0 <p>
-                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>Java-xmlbuilder</td>
-            <td><p><a href="https://github.com/jmurty/java-xmlbuilder/">https://github.com/jmurty/java-xmlbuilder</a></p></td>
-            <td>Apache License, Version 2.0 <p>
-                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>Google Guice</td>
-            <td><p><a href="https://github.com/google/guice">https://github.com/google/guice</a></p></td>
-            <td>Apache License, Version 2.0 <p>
-                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>Gson</td>
-            <td><p><a href="https://github.com/google-gson/google-gson">https://github.com/google-gson/google-gson</a>
-            </p>
-            </td>
-            <td>Apache License, Version 2.0 <p>
-                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>Rocoto</td>
-            <td><p><a href="http://99soft.github.io/rocoto/">http://99soft.github.io/rocoto/</a></p></td>
-            <td>Apache License, Version 2.0 <p>
-                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>Apache CXF</td>
-            <td><p><a href="https://cxf.apache.org/">https://cxf.apache.org/</a></p></td>
-            <td>Apache License, Version 2.0 <p>
-                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>xml-resolver</td>
-            <td><p><a href="http://xerces.apache.org/xml-commons/components/resolver/">http://xerces.apache.org/xml-commons/components/resolver/</a></p></td>
-            <td>Apache License, Version 2.0 <p>
-                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-
-        <!-- Apache Web Services includes several different libraries under the same roof and license -->
-        <!-- Included in Artifactory Pro are the following: Neethi, WSS4J, XmlSchema -->
-        <tr>
-            <td>Apache Web Services</td>
-            <td><p><a href="https://ws.apache.org/">https://ws.apache.org/</a></p></td>
-            <td>Apache License, Version 2.0 <p>
-                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>Xalan + Xalan Serializer</td>
-            <td><p><a href="http://xml.apache.org/xalan-j/index.html">http://xml.apache.org/xalan-j/index.html</a></p></td>
-            <td>Apache License, Version 2.0 <p>
-                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>SSAJ</td>
-            <td><p><a href="https://saaj.java.net/">https://saaj.java.net/</a></p></td>
-            <td>CDDL Version 1.1 <p><a href="http://glassfish.java.net/public/CDDL+GPL_1_1.html">http://glassfish.java.net/public/CDDL+GPL_1_1.html</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td colspan="3"><b>FRONTEND LIBRARIES</b></td>
-        </tr>
-
-        <tr>
-            <td>AngularJS</td>
-            <td><p><a href="https://angularjs.org/"/>https://angularjs.org/</a></p></td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-
-        <!--<tr>
-            <td>angular-mocks</td>
-            <td><p><a href="https://github.com/angular/bower-angular-mocks"/>https://github.com/angular/bower-angular-mocks</a></p></td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>SANITIZER?</td>
-            <td><p><a href="https://angularjs.org/"/>https://angularjs.org/</a></p></td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>-->
-
-        <tr>
-            <td>AngularUI Router</td>
-            <td><p><a href="https://github.com/angular-ui/ui-router"/>https://github.com/angular-ui/ui-router</a></p>
-            </td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>Bootstrap</td>
-            <td><p><a href="http://getbootstrap.com"/>http://getbootstrap.com</a></p></td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>Angular Bootstrap</td>
-            <td><p><a href="https://github.com/angular-ui/bootstrap-bower"/>https://github.com/angular-ui/bootstrap-bower</a>
-            </p></td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>Animate.css</td>
-            <td><p><a href=github.com/daneden/animate.css/>github.com/daneden/animate.css</a></p></td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>AngularJS-Toaster</td>
-            <td><p><a href="https://github.com/jirikavi/AngularJS-Toaster"/>https://github.com/jirikavi/AngularJS-Toaster</a>
-            </p></td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>jQuery</td>
-            <td><p><a href="https://jquery.com/"/>https://jquery.com/</a></p></td>
-            <td>MIT License <p>
-                <a href="https://jquery.org/license/">https://jquery.org/license/</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>jQuery UI</td>
-            <td><p><a href="http://jqueryui.com/"/>http://jqueryui.com/</a></p></td>
-            <td>MIT License <p>
-                <a href="https://jquery.org/license/">https://jquery.org/license/</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>lodash</td>
-            <td><p><a href="https://lodash.com/"/>https://lodash.com/</a></p></td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>x2js</td>
-            <td><p><a href="https://code.google.com/p/x2js/"/>https://code.google.com/p/x2js/</a></p></td>
-            <td>Apache License, Version 2.0<p>
-                <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>CodeMirror</td>
-            <td><p><a href="https://codemirror.net/"/>https://codemirror.net/</a></p></td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>UI.Codemirror</td>
-            <td><p><a
-                    href="https://github.com/angular-ui/ui-codemirror"/>https://github.com/angular-ui/ui-codemirror</a>
-            </p></td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>AngularJS hotkeys</td>
-            <td><p><a href="https://github.com/drahak/angular-hotkeys"/>https://github.com/drahak/angular-hotkeys</a>
-            </p></td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>AngularJS ui-select</td>
-            <td><p><a href="https://github.com/angular-ui/ui-select"/>https://github.com/angular-ui/ui-select</a></p>
-            </td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>LessFonts: Open Sans</td>
-            <td><p><a href="https://github.com/sethlilly/lessfonts-open-sans"/>https://github.com/sethlilly/lessfonts-open-sans</a>
-            </p></td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>selectize.js</td>
-            <td><p><a
-                    href="https://github.com/brianreavis/selectize.js"/>https://github.com/brianreavis/selectize.js</a>
-            </p></td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>ZeroClipboard</td>
-            <td><p><a href="http://zeroclipboard.org/"/>http://zeroclipboard.org/</a></p></td>
-            <td>MIT License <p>
-                <a href="https://github.com/zeroclipboard/zeroclipboard/blob/master/LICENSE">https://github.com/zeroclipboard/zeroclipboard/blob/master/LICENSE</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>ngClip</td>
-            <td><p><a href="https://github.com/asafdav/ng-clip"/>https://github.com/asafdav/ng-clip</a></p></td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>Angular File Upload</td>
-            <td><p><a href="https://github.com/nervgh/angular-file-upload"/>https://github.com/nervgh/angular-file-upload</a>
-            </p></td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>UI.Utils</td>
-            <td><p><a href="https://github.com/angular-ui/ui-utils"/>https://github.com/angular-ui/ui-utils</a></p></td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>Later</td>
-            <td><p><a href="http://bunkat.github.io/later/"/>http://bunkat.github.io/later/</a></p></td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>Font Awesome</td>
-            <td><p><a href="http://fontawesome.io/"/>http://fontawesome.io/</a></p></td>
-            <td>SIL OFL 1.1 <p>
-                <a href="http://fontawesome.io/license/">http://fontawesome.io/license/</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>ng-password-strength</td>
-            <td><p><a href="https://github.com/subarroca/ng-password-strength"/>https://github.com/subarroca/ng-password-strength</a>
-            </p></td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>Tooltipster</td>
-            <td><p><a href="https://github.com/iamceege/tooltipster"/>https://github.com/iamceege/tooltipster</a></p>
-            </td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>ui-grid-draggable-rows</td>
-            <td><p><a href=https://github.com/cdwv/ui-grid-draggable-rows/>https://github.com/cdwv/ui-grid-draggable-rows</a>
-            </p></td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>angular-color-picker</td>
-            <td><p><a href=https://github.com/ruhley/angular-color-picker/>https://github.com/ruhley/angular-color-picker</a>
-            </p></td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-        <tr>
-            <td>jQuery-contextMenu</td>
-            <td><p><a href=https://github.com/swisnl/jQuery-contextMenu>https://github.com/swisnl/jQuery-contextMenu</a>
-            </p></td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-        <tr>
-            <td>deep-diff</td>
-            <td><p><a href=https://github.com/flitbit/diff>https://github.com/flitbit/diff</a>
-            </p></td>
-            <td>MIT License<p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-        <tr>
-            <td>clipboard.js</td>
-            <td><p><a href="https://github.com/lgarron/clipboard.js">https://github.com/lgarron/clipboard.js</a>
-            </p></td>
-            <td>MIT License<p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-        <tr>
-            <td>Commons Httpc Client</td>
-            <td><p><a href=http://hc.apache.org/httpclient-3.x/>http://hc.apache.org/httpclient-3.x/</a></p></td>
-            <td>Apache License, Version 2.0 <p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-
-
-
-     </table>
-    <br/>
-
-    <b>This software includes the following MODIFIED third party software:</b><br>
-
-    <p/>
-    <table border="1" width="100%">
-        <tr>
-            <td width="33%"><b>Third party software</b></td>
-            <td width="33%"><b>Third party URL</b></td>
-            <td width="33%"><b>Licensed under</b></td>
-        </tr>
-        <tr>
-            <td>odata4j<br/> An OData framework for Java</td>
-            <td><p><a href="http://odata4j.org"/>http://odata4j.org</a></p></td>
-            <td>Apache License, Version 2.0 <p><a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
-            </p></td>
-        </tr>
-        <tr>
-            <td colspan="3"><b>FRONTEND LIBRARIES</b></td>
-        </tr>
-
-        <tr>
-            <td>UI.Layout</td>
-            <td><p><a href="http://angular-ui.github.io/ui-layout/"/>http://angular-ui.github.io/ui-layout/</a></p></td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>Angula UI-Grid</td>
-            <td><p><a href="https://github.com/angular-ui/ui-grid.git"/>https://github.com/angular-ui/ui-grid</a></p>
-            </td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>jsTree</td>
-            <td><p><a href="http://www.jstree.com/"/>http://www.jstree.com/</a></p></td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-
-        <tr>
-            <td>angular-selectize</td>
-            <td><p><a href="https://github.com/machineboy2045/angular-selectize"/>https://github.com/machineboy2045/angular-selectize</a>
-            </p></td>
-            <td>MIT License <p>
-                <a href="http://opensource.org/licenses/MIT">http://opensource.org/licenses/MIT</a>
-            </p></td>
-        </tr>
-    </table>
-
-
-
-    <p><br> <br> You can contact us via <b><i><a href="mailto:info at jfrog.com">info at jfrog.com</a></i></b> for any further
-        information. </p></div>
-<br></body>
-</html>
diff --git a/distribution/standalone/src/main/install/bin/artifactory.default b/distribution/standalone/src/main/install/bin/artifactory.default
deleted file mode 100755
index dc15aff..0000000
--- a/distribution/standalone/src/main/install/bin/artifactory.default
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/sh
-
-#Default values
-#export ARTIFACTORY_HOME=/var/opt/jfrog/artifactory
-#export ARTIFACTORY_USER=artifactory
-#export JAVA_HOME=/opt/java/1.8.0
-
-export TOMCAT_HOME=$ARTIFACTORY_HOME/tomcat
-export ARTIFACTORY_PID=$ARTIFACTORY_HOME/run/artifactory.pid
-
-export JAVA_OPTIONS="-server -Xms512m -Xmx2g -Xss256k -XX:+UseG1GC"
-export JAVA_OPTIONS="$JAVA_OPTIONS -Djruby.compile.invokedynamic=false -Dfile.encoding=UTF8 -Dartdist=zip -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true"
-
-# Timeout waiting for artifactory to start
-# START_TMO=60
diff --git a/distribution/standalone/src/main/install/bin/artifactory.sh b/distribution/standalone/src/main/install/bin/artifactory.sh
deleted file mode 100755
index 2b0eb09..0000000
--- a/distribution/standalone/src/main/install/bin/artifactory.sh
+++ /dev/null
@@ -1,190 +0,0 @@
-#!/bin/bash
-#
-# Startup script for Artifactory in Tomcat Servlet Engine
-#
-
-#
-errorArtHome() {
-    echo
-    echo -e "\033[31m** $1\033[0m"
-    echo
-    exit 1
-}
-
-checkArtHome() {
-    if [ -z "$ARTIFACTORY_HOME" ] || [ ! -d "$ARTIFACTORY_HOME" ]; then
-        errorArtHome "ERROR: Artifactory home folder not defined or does not exists at $ARTIFACTORY_HOME"
-    fi
-}
-
-checkTomcatHome() {
-    if [ -z "$TOMCAT_HOME" ] || [ ! -d "$TOMCAT_HOME" ]; then
-        errorArtHome "ERROR: Tomcat Artifactory folder not defined or does not exists at $TOMCAT_HOME"
-    fi
-    export CATALINA_HOME="$TOMCAT_HOME"
-}
-
-createLogsLink() {
-    mkdir -p $ARTIFACTORY_HOME/logs/catalina || errorArtHome "Could not create dir $ARTIFACTORY_HOME/logs/catalina"
-    if [ ! -L "$TOMCAT_HOME/logs" ];
-    then
-        ln -s $ARTIFACTORY_HOME/logs/catalina $TOMCAT_HOME/logs || \
-            errorArtHome "Could not create link from $TOMCAT_HOME/logs to $ARTIFACTORY_HOME/logs/catalina"
-    fi
-}
-
-findShutdownPort() {
-
-    SHUTDOWN_PORT=`netstat -vatn|grep LISTEN|grep $CATALINA_MGNT_PORT|wc -l`
-}
-
-isAlive() {
-    pidValue=""
-    javaPs=""
-    if [ -e "$ARTIFACTORY_PID" ]; then
-        pidValue=`cat $ARTIFACTORY_PID`
-        if [ -n "$pidValue" ]; then
-            javaPs="`ps -p $pidValue | grep java`"
-        fi
-    fi
-}
-
-stop() {
-echo finding
-    # The default CATALINA_MGNT_PORT is 8015
-    CATALINA_MGNT_PORT=8015
-    echo "Using the default catalina management port ($CATALINA_MGNT_PORT) to test shutdown"
-    isAlive
-    findShutdownPort
-    if [ $SHUTDOWN_PORT -eq 0 ] && [ -z "$javaPs" ]; then
-        echo "Artifactory Tomcat already stopped"
-        RETVAL=0
-    else
-        echo "Stopping Artifactory Tomcat..."
-        if [ $SHUTDOWN_PORT -ne 0 ]; then
-            $TOMCAT_HOME/bin/shutdown.sh
-            RETVAL=$?
-        else
-            RETVAL=1
-        fi
-        killed=false
-        if [ $RETVAL -ne 0 ]; then
-            echo "WARN: Artifactory Tomcat server shutdown script failed. Sending kill signal to $pidValue"
-            if [ -n "$pidValue" ]; then
-                killed=true
-                kill $pidValue
-                RETVAL=$?
-            fi
-        fi
-        # Wait 2 seconds for process to die
-        sleep 2
-        findShutdownPort
-        isAlive
-        nbSeconds=1
-        while [ $SHUTDOWN_PORT -ne 0 ] || [ -n "$javaPs" ] && [ $nbSeconds -lt 30 ]; do
-            if [ $nbSeconds -eq 10 ] && [ -n "$pidValue" ]; then
-                # After 10 seconds try to kill the process
-                echo "WARN: Artifactory Tomcat server shutdown not done after 10 seconds. Sending kill signal"
-                kill $pidValue
-                RETVAL=$?
-            fi
-            if [ $nbSeconds -eq 25 ] && [ -n "$pidValue" ]; then
-                # After 25 seconds try to kill -9 the process
-                echo "WARN: Artifactory Tomcat server shutdown not done after 25 seconds. Sending kill -9 signal"
-                kill -9 $pidValue
-                RETVAL=$?
-            fi
-            sleep 1
-            let "nbSeconds = $nbSeconds + 1"
-            findShutdownPort
-            isAlive
-        done
-        if [ $SHUTDOWN_PORT -eq 0 ] && [ -z "$javaPs" ]; then
-           echo "Artifactory Tomcat stopped"
-        else
-           echo "ERROR: Artifactory Tomcat did not stop"
-           RETVAL=1
-        fi
-    fi
-    [ $RETVAL=0 ] && rm -f "$ARTIFACTORY_PID"
-}
-
-start() {
-    export CATALINA_OPTS="$JAVA_OPTIONS -Dartifactory.home=$ARTIFACTORY_HOME -Dfile.encoding=UTF8 -Djruby.compile.invokedynamic=false"
-    export CATALINA_PID="$ARTIFACTORY_PID"
-    [ -x $TOMCAT_HOME/bin/catalina.sh ] || chmod +x $TOMCAT_HOME/bin/*.sh
-    if [ -z "$@" ];
-    then
-        #default to catalina.sh run
-        $TOMCAT_HOME/bin/catalina.sh run
-    else
-        #create $ARTIFACTORY_HOME/run
-        if [ -n "$ARTIFACTORY_PID" ];
-        then
-            mkdir -p $(dirname "$ARTIFACTORY_PID") || \
-                errorArtHome "Could not create dir for $ARTIFACTORY_PID";
-        fi
-        if [ "$@" == "stop" ];
-        then
-            stop
-        else
-            $TOMCAT_HOME/bin/catalina.sh "$@"
-        fi
-    fi
-}
-
-check() {
-    if [ -f $ARTIFACTORY_PID ]; then
-        echo "Artifactory is running, on pid="`cat $ARTIFACTORY_PID`
-        echo ""
-        exit 0
-    fi
-
-    echo "Checking arguments to Artifactory: "
-    echo "ARTIFACTORY_HOME     =  $ARTIFACTORY_HOME"
-    echo "TOMCAT_HOME          =  $TOMCAT_HOME"
-    echo "ARTIFACTORY_PID      =  $ARTIFACTORY_PID"
-    echo "JAVA_HOME            =  $JAVA_HOME"
-    echo "JAVA_OPTIONS         =  $JAVA_OPTIONS"
-    echo
-
-    exit 1
-}
-
-checkJavaVersion(){
-    if [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]];  then
-        echo found java executable in JAVA_HOME
-        _java="$JAVA_HOME/bin/java"
-    elif type -p java; then
-        _java=java
-    else
-        echo "no java"
-    fi
-
-    if [[ "$_java" ]]; then
-        "$_java" -version 2>&1| \
-        awk -F\" '/version/{\
-            if ($2 < 1.8) {\
-                printf "%s is too old must be at least java 1.8\n", $2;\
-                exit 0;\
-            } else exit 1}' && exit 99
-    fi
-}
-
-#
-artBinDir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-export ARTIFACTORY_HOME="$(cd "$(dirname "${artBinDir}")" && pwd)"
-artDefaultFile="$artBinDir/artifactory.default"
-
-. $artDefaultFile || errorArtHome "ERROR: $artDefaultFile does not exist or not executable"
-
-if [ "x$1" = "xcheck" ]; then
-    check
-fi
-
-checkJavaVersion
-checkArtHome
-checkTomcatHome
-createLogsLink
-
-start "$@"
diff --git a/distribution/standalone/src/main/install/bin/installService.sh b/distribution/standalone/src/main/install/bin/installService.sh
deleted file mode 100644
index ced1422..0000000
--- a/distribution/standalone/src/main/install/bin/installService.sh
+++ /dev/null
@@ -1,245 +0,0 @@
-#!/bin/bash
-
-#
-errorArtHome() {
-    echo
-    echo -e "\033[31m** ERROR: $1\033[0m"
-    echo
-    exit 1
-}
-
-checkRoot() {
-    curUser=
-    if [ -x "/usr/xpg4/bin/id" ]
-    then
-        curUser=`/usr/xpg4/bin/id -nu`
-    else
-        curUser=`id -nu`
-    fi
-    if [ "$curUser" != "root" ]
-    then
-        errorArtHome "Only root user can install artifactory as a service"
-    fi
-
-    if [ "$0" = "." ] || [ "$0" = "source" ]; then
-        errorArtHome "Cannot execute script with source $0"
-    fi
-}
-
-getArtUser() {
-    if [ -n "$1" ]; then
-        ARTIFACTORY_USER=$1
-    fi
-    if [ -z "$ARTIFACTORY_USER" ]; then
-        ARTIFACTORY_USER=artifactory
-    fi
-}
-
-createArtUser() {
-    echo -n "Creating user ${ARTIFACTORY_USER}..."
-    artifactoryUsername=`getent passwd ${ARTIFACTORY_USER} | awk -F: '{print $1}'`
-    if [ "$artifactoryUsername" = "${ARTIFACTORY_USER}" ]; then
-        echo -n "already exists..."
-    else
-        echo -n "creating..."
-        useradd -m -s `which bash` ${ARTIFACTORY_USER}
-        if [ ! $? ]; then
-            errorArtHome "Could not create user ${ARTIFACTORY_USER}"
-        fi
-    fi
-    echo " DONE"
-}
-
-getArtGroup() {
-    if [ -n "$1" ]; then
-        ARTIFACTORY_GROUP=$1
-    fi
-}
-
-createArtGroup() {
-    [ "${ARTIFACTORY_GROUP}" == "" ] && return 0;
-    echo -n "Creating Group ${ARTIFACTORY_GROUP}..."
-    artifactoryGroupname=`getent group ${ARTIFACTORY_GROUP} | awk -F: '{print $1}'`
-    if [ "$artifactoryGroupname" = "${ARTIFACTORY_GROUP}" ]; then
-        echo -n "already exists..."
-    else
-        echo -n "creating..."
-        groupadd ${ARTIFACTORY_GROUP}
-        if [ ! $? ]; then
-            errorArtHome "Could not create Group ${ARTIFACTORY_GROUP}"
-        fi
-    fi
-    echo " DONE"
-}
-
-createArtEtc() {
-    echo
-    echo -n "Checking configuration link and files in $artEtcDir..."
-    if [ -L ${ARTIFACTORY_HOME}/etc ]; then
-        echo -n "already exists, no change..."
-    else
-        echo
-        echo -n "Moving configuration dir $artExtractDir/etc $artExtractDir/etc.original..."
-        mv $artExtractDir/etc $artExtractDir/etc.original || \
-            errorArtHome "Could not move $artExtractDir/etc $artExtractDir/etc.original"
-        if [ ! -d $artEtcDir ]; then
-            mkdir -p $artEtcDir || errorArtHome "Could not create $artEtcDir"
-        fi
-        echo -n "creating the link and updating dir..."
-        ln -s $artEtcDir $ARTIFACTORY_HOME/etc && \
-        cp -R $artExtractDir/etc.original/* $artEtcDir && \
-        etcOK=true
-        [ $etcOK ] || errorArtHome "Could not create $artEtcDir"
-    fi
-    echo -e " DONE"
-}
-
-createArtDefault() {
-    echo -n "Creating environment file $artDefaultFile..."
-    if [ -e $artDefaultFile ]; then
-        echo -n "already exists, no change..."
-    else
-        # Populating the /etc/opt/jfrog/artifactory/default with ARTIFACTORY_HOME and ARTIFACTORY_USER
-        echo -n "creating..."
-        cat ${ARTIFACTORY_HOME}/bin/artifactory.default > $artDefaultFile && \
-        echo "" >> $artDefaultFile
-
-        sed --in-place -e "
-            s,#export ARTIFACTORY_HOME=.*,export ARTIFACTORY_HOME=${ARTIFACTORY_HOME},g;
-            s,#export ARTIFACTORY_USER=.*,export ARTIFACTORY_USER=${ARTIFACTORY_USER},g;
-            s,export TOMCAT_HOME=.*,export TOMCAT_HOME=${TOMCAT_HOME},g;
-            s,export $ARTIFACTORY_PID=.*,export $ARTIFACTORY_PID=${artRunDir}/artifactory.pid,g;" $artDefaultFile || \
-                errorArtHome "Could not change values in $artDefaultFile"
-    fi
-    echo -e " DONE"
-    echo -e "\033[33m** INFO: Please edit the files in $artEtcDir to set the correct environment\033[0m"
-    echo -e "\033[33mEspecially $artDefaultFile that defines ARTIFACTORY_HOME, JAVA_HOME and JAVA_OPTIONS\033[0m"
-}
-
-createArtRun() {
-    # Since tomcat 6.0.24 the PID file cannot be created before running catalina.sh. Using /var/opt/jfrog/artifactory/run folder.
-    if [ ! -d "$artRunDir" ]; then
-        mkdir -p "$artRunDir" || errorArtHome "Could not create $artRunDir"
-    fi
-}
-
-installService() {
-    serviceName=$(basename $artServiceFile)
-    serviceFiles=$artBinDir/../misc/service
-    if [ -e "$artServiceFile" ]; then
-        cp -f $artServiceFile $serviceFiles/$serviceName.init.backup
-    fi
-    cp -f $serviceFiles/artifactory $artServiceFile
-    chmod a+x $artServiceFile
-
-    #change pidfile and default location if needed
-    sed --in-place -e "
-     /processname:/ s%artifactory%$serviceName%g;
-     /Provides:/ s%artifactory%$serviceName%g;
-     s%# pidfile: .*%# pidfile: $artRunDir/artifactory.pid%g;
-     s%/etc/opt/jfrog/artifactory/default%$artEtcDir/default%g;
-     " $artServiceFile || errorArtHome "Could not change values in $artServiceFile"
-
-    # Try update-rc.d for debian/ubuntu else use chkconfig
-    if [ -x /usr/sbin/update-rc.d ]; then
-        echo
-        echo -n "Initializing artifactory service with update-rc.d..."
-        update-rc.d $serviceName defaults && \
-        chkconfigOK=true
-    elif [ -x /usr/sbin/chkconfig ] || [ -x /sbin/chkconfig ]; then
-        echo
-        echo -n "Initializing $serviceName service with chkconfig..."
-        chkconfig --add $serviceName && \
-        chkconfig $serviceName on && \
-        chkconfig --list $serviceName && \
-        chkconfigOK=true
-    else
-        ln -s $artServiceFile /etc/rc3.d/S99$serviceName && \
-        chkconfigOK=true
-    fi
-    [ $chkconfigOK ] || errorArtHome "Could not install service"
-    echo -e " DONE"
-}
-
-prepareTomcat() {
-    cp $serviceFiles/setenv.sh $TOMCAT_HOME/bin/setenv.sh && \
-     sed --in-place -e "
-      s%/etc/opt/jfrog/artifactory/default%$artEtcDir/default%g;
-      " $TOMCAT_HOME/bin/setenv.sh && \
-      chmod a+x $TOMCAT_HOME/bin/* || errorArtHome "Could not set the $TOMCAT_HOME/bin/setenv.sh"
-
-    if [ ! -L "$TOMCAT_HOME/logs" ]; then
-        if [ -d $TOMCAT_HOME/logs ]; then
-            mv $TOMCAT_HOME/logs $TOMCAT_HOME/logs.original
-            mkdir $TOMCAT_HOME/logs
-        fi
-        mkdir -p $artLogDir/catalina || errorArtHome "Could not create dir $artLogDir/catalina"
-        ln -s $artLogDir/catalina $TOMCAT_HOME/logs && \
-        chmod -R u+w $TOMCAT_HOME/logs && \
-        logOK=true
-        [ logOK ] || errorArtHome "Could not create link from $TOMCAT_HOME/logs to $artLogDir/catalina"
-    fi
-    if [ ! -d $TOMCAT_HOME/temp ];then
-        mkdir $TOMCAT_HOME/temp
-    fi
-    chmod -R u+w ${TOMCAT_HOME}/work
-}
-
-setPermissions() {
-    echo
-    echo -n "Setting file permissions..."
-    chown -RL ${ARTIFACTORY_USER}:${ARTIFACTORY_GROUP} ${ARTIFACTORY_HOME} || errorArtHome "Could not set permissions"
-    echo -e " DONE"
-}
-
-##
-checkRoot
-
-artBinDir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-artExtractDir="$(cd "$(dirname "$artBinDir")" && pwd)"
-
-ARTIFACTORY_HOME="$artExtractDir"
-[ -n "$artEtcDir" ] || artEtcDir="/etc/opt/jfrog/artifactory"
-TOMCAT_HOME="$ARTIFACTORY_HOME/tomcat"
-artLogDir="$ARTIFACTORY_HOME/logs"
-artRunDir="$ARTIFACTORY_HOME/run"
-[ -n "$artServiceFile" ] || artServiceFile="/etc/init.d/artifactory"
-artDefaultFile="$artEtcDir/default"
-
-getArtUser "$1"
-getArtGroup "$2"
-
-echo
-echo "Installing artifactory as a Unix service that will run as user ${ARTIFACTORY_USER}${ARTIFACTORY_GROUP:+ and group $ARTIFACTORY_GROUP}"
-echo "Installing artifactory with home ${ARTIFACTORY_HOME}"
-
-createArtUser
-
-createArtGroup
-
-createArtEtc
-
-createArtDefault
-
-createArtRun
-
-installService
-
-prepareTomcat
-
-setPermissions
-
-echo
-echo -e "\033[33m************ SUCCESS ****************\033[0m"
-echo -e "\033[33mInstallation of Artifactory completed\033[0m"
-echo
-echo "Please check $artEtcDir, $TOMCAT_HOME and $ARTIFACTORY_HOME folders"
-echo "Please check $artServiceFile startup script"
-echo
-echo "you can now check installation by running:"
-echo "> service artifactory check (or $artServiceFile check)"
-echo
-echo "Then activate artifactory with:"
-echo "> service artifactory start (or $artServiceFile start)"
-echo
-
diff --git a/distribution/standalone/src/main/install/bin/recover.backup.sh b/distribution/standalone/src/main/install/bin/recover.backup.sh
deleted file mode 100755
index ac8e82f..0000000
--- a/distribution/standalone/src/main/install/bin/recover.backup.sh
+++ /dev/null
@@ -1,219 +0,0 @@
-#!/bin/bash
-
-TIMESTAMP=`echo "$(date '+%T')" | tr -d ":"`
-CURRENT_TIME="$(date '+%Y%m%d').$TIMESTAMP"
-
-# Check root user
-CURRENT_USER=`id -nu`
-if [ "$CURRENT_USER" != "root" ]; then
-    echo
-    echo "ERROR: This tool can only be used when logged in as root."
-    echo
-    exit 1
-fi
-
-# Check the installation
-checkCurrentInstall() {
-    ARTIFACTORY_RPM_NAME=`rpm -qa artifactory`
-
-    if [ $ARTIFACTORY_RPM_NAME ]; then
-        echo "INFO: $ARTIFACTORY_RPM_NAME found. Checking for FHS or standard layout."
-        if [ ! -x "/etc/init.d/artifactory" ]; then
-            echo "ERROR: Artifactory RPM $ARTIFACTORY_RPM_NAME installed but init script /etc/init.d/artifactory not executable!"
-            exit 1
-        fi
-        FHS_SCRIPT="`grep "/etc/opt/jfrog/artifactory/default" "/etc/init.d/artifactory"`"
-        if [ -n "$FHS_SCRIPT" ]; then
-            echo "INFO: Artifactory FHS installed!"
-            isFhs=true
-            ARTIFACTORY_HOME="/var/opt/jfrog/artifactory"
-            ARTIFACTORY_BIN_HOME="/opt/jfrog/artifactory"
-            ETC_FOLDER="/etc/opt/jfrog/artifactory"
-        else
-            echo "INFO: Original Artifactory with no FHS installed!"
-            isFhs=false
-            ARTIFACTORY_HOME="/var/lib/artifactory"
-            ARTIFACTORY_BIN_HOME="/opt/artifactory"
-            ETC_FOLDER="/etc/artifactory"
-        fi
-    else
-        echo "ERROR: Artifactory needs to be installed in your system."
-        exit 1
-    fi
-}
-
-# List backups available
-listCurrentBackups() {
-    NO_FHS_BACKUP_FOLDER="/var/lib"
-    OLD_FHS_BACKUP_FOLDER="/var/opt"
-    FHS_BACKUP_FOLDER="/var/opt/jfrog"
-    NO_FHS_BACKUP_FOLDERS=`'ls' --format=single-column $NO_FHS_BACKUP_FOLDER | grep artifactory.backup`
-    OLD_FHS_BACKUP_FOLDERS=`'ls' --format=single-column $OLD_FHS_BACKUP_FOLDER | grep jfrog.artifactory.backup`
-    FHS_BACKUP_FOLDERS=`'ls' --format=single-column $FHS_BACKUP_FOLDER | grep artifactory.backup`
-    if [ -n "$NO_FHS_BACKUP_FOLDERS" ] || [ -n "$FHS_BACKUP_FOLDERS" ]; then
-        echo "INFO: Backups available: "
-        echo ""
-        C=1
-        for i in $NO_FHS_BACKUP_FOLDERS; do
-            FILE_LIST[$C]="$NO_FHS_BACKUP_FOLDER/$i"
-            echo "$C) ${FILE_LIST[$C]}"
-            let C=$C+1
-        done
-        FHS_NUMBER=$C
-        for j in $OLD_FHS_BACKUP_FOLDERS; do
-            FILE_LIST[$C]="$OLD_FHS_BACKUP_FOLDER/$j"
-            echo "$C) ${FILE_LIST[$C]}"
-            let C=$C+1
-        done
-        for j in $FHS_BACKUP_FOLDERS; do
-            FILE_LIST[$C]="$FHS_BACKUP_FOLDER/$j"
-            echo "$C) ${FILE_LIST[$C]}"
-            let C=$C+1
-        done
-    else
-        echo "ERROR: Seems that you don't have backups to restore."
-        exit 1
-    fi
-}
-
-# Choosing the backup
-chooseBackup() {
-    BACKUP_DIR_NUMBER=""
-    echo
-    read -p "Please enter the number of the backup to restore: " BACKUP_DIR_NUMBER
-
-    if [ -z "$BACKUP_DIR_NUMBER" ] || [ $BACKUP_DIR_NUMBER -le 0 ] || [ $BACKUP_DIR_NUMBER -ge $C ]; then
-        echo "ERROR: You did not choose a correct backup number"
-        exit 1
-    fi
-
-    if [ $BACKUP_DIR_NUMBER -ge $FHS_NUMBER ]; then
-        if [ ! $isFhs ]; then
-            echo "ERROR: Cannot recover FHS backup into a non FHS Artifactory RPM"
-            exit 1
-        fi
-        needsEtcConversion=false
-    else
-        if $isFhs; then
-            needsEtcConversion=true
-        else
-            needsEtcConversion=false
-        fi
-    fi
-
-    BACKUP_DIR="${FILE_LIST[$BACKUP_DIR_NUMBER]}"
-    if [ -z "$BACKUP_DIR" ] || [ ! -d "$BACKUP_DIR" ]; then
-        echo "ERROR: Backup number $BACKUP_DIR_NUMBER provide directory $BACKUP_DIR which does not exists!"
-        exit 1
-    fi
-
-    if [ ! -d "$BACKUP_DIR/data" ] || [ ! -d "$BACKUP_DIR/etc" ]; then
-        echo "ERROR: Data and conf directories $BACKUP_DIR/data, $BACKUP_DIR/etc not found. Nothing to recover!"
-        exit 0
-    fi
-
-    # Check if it is a 2.5.2 backup
-    if [ -L "$BACKUP_DIR/etc" ] || [ -L "$BACKUP_DIR/tomcat" ]; then
-        echo "INFO: Backup of Artifactory previous to 2.5.x detected."
-        echo "ERROR: Cannot restore from Artifactory 2.5.x version backups."
-        exit 1
-    fi
-}
-
-checkServiceStatus() {
-    service artifactory status
-    if [ $? -eq 0 ]; then
-        echo "Please notice: Need to stop running Artifactory service before recovering backup."
-        read -p "Continue [Y/n]? " CONTINUE_INSTALL
-        if [[ "${CONTINUE_INSTALL}" =~ [nN] ]]; then
-            echo
-            echo "Please make sure to stop Artifactory process before retrying backup recovery."
-            echo "Press enter to quit..."
-            read
-            exit 0
-        fi
-        service artifactory stop || exit $?
-    fi
-}
-
-moveData() {
-    BACKUP_DATA_FOLDER=""
-    DATA_FOLDER="$ARTIFACTORY_HOME/data"
-    if [ -d "$DATA_FOLDER" ]; then
-        echo
-        echo "Please notice: An existing Artifactory data folder has been found at '${DATA_FOLDER}' and can be kept aside."
-        read -p "Continue [Y/n]? " CONTINUE_INSTALL
-        if [[ "${CONTINUE_INSTALL}" =~ [nN] ]]; then
-            echo
-            echo "Please make sure to move aside the current data folder before continuing."
-            echo "Press enter to quit..."
-            read
-            exit 0
-        fi
-        BACKUP_DATA_FOLDER=${DATA_FOLDER}.${CURRENT_TIME}
-        echo
-        echo "INFO: Moving the Artifactory data folder to '${BACKUP_DATA_FOLDER}'. You may remove it later."
-        mv $DATA_FOLDER $DATA_FOLDER.$CURRENT_TIME || exit $?
-    fi
-
-    echo "INFO: Moving $BACKUP_DIR/data into $DATA_FOLDER"
-    mv $BACKUP_DIR/data $DATA_FOLDER || exit $?
-
-    if [ `ls $BACKUP_DIR | grep mysql-connector` ]; then
-        echo "INFO: Restoring MySQL connector"
-        'cp' $BACKUP_DIR/mysql-connector* $ARTIFACTORY_BIN_HOME/tomcat/lib || exit $?
-    fi
-
-    # Ownership
-    chown -R artifactory. $ARTIFACTORY_HOME || exit $?
-}
-
-moveEtc() {
-    if [ -d "$ETC_FOLDER" ]; then
-        if [ -z "$BACKUP_DATA_FOLDER" ]; then
-            BACKUP_ETC_FOLDER=/tmp/artifactory.etc.${CURRENT_TIME}
-            echo
-            echo "INFO: No original Data folder found. Current Artifactory etc folder will be moved to temp folder '${BACKUP_ETC_FOLDER}'."
-            mv $ETC_FOLDER $ETC_FOLDER.$CURRENT_TIME || exit $?
-        else
-            echo
-            echo "Please notice: An existing Artifactory etc folder has been found at '${ETC_FOLDER}' and can be kept aside."
-            read -p "Continue [Y/n]? " CONTINUE_INSTALL
-            if [[ "${CONTINUE_INSTALL}" =~ [nN] ]]; then
-                echo
-                echo "Please make sure to move aside the current etc folder before retrying backup recovery."
-                echo "Press enter to quit..."
-                read
-                exit 0
-            fi
-            BACKUP_ETC_FOLDER=${ETC_FOLDER}.${CURRENT_TIME}
-            echo
-            echo "INFO: Moving the Artifactory etc folder to '${BACKUP_ETC_FOLDER}'. You may remove it later."
-            mv $ETC_FOLDER $ETC_FOLDER.$CURRENT_TIME || exit $?
-        fi
-    fi
-
-    echo "INFO: Restoring $BACKUP_DIR/etc into $ETC_FOLDER"
-    'cp' -r $BACKUP_DIR/etc $ETC_FOLDER || exit $?
-    if $needsEtcConversion; then
-        echo "INFO: Converting etc path values to FHS layout"
-        sed --in-place -e "
-            s#/var/lib/artifactory/run#/var/opt/jfrog/run#g;
-            s#/var/lib/artifactory#$ARTIFACTORY_HOME#g;
-            s#/opt/artifactory#$ARTIFACTORY_BIN_HOME#g;
-            " $ETC_FOLDER/default || exit $?
-    fi
-    chown -R artifactory. $ETC_FOLDER || exit $?
-}
-
-# Run them all!
-checkCurrentInstall && listCurrentBackups && chooseBackup && \
-checkServiceStatus && moveData && moveEtc
-
-echo
-echo "The recovery process was completed successfully!"
-echo "You can now start Artifactory."
-echo "Press enter to exit..."
-read
-exit 0
-
diff --git a/distribution/standalone/src/main/install/bin/uninstallService.sh b/distribution/standalone/src/main/install/bin/uninstallService.sh
deleted file mode 100644
index 8d70249..0000000
--- a/distribution/standalone/src/main/install/bin/uninstallService.sh
+++ /dev/null
@@ -1,150 +0,0 @@
-#!/bin/bash
-
-error() {
-    echo -e "\n\033[31m** ERROR: $1\033[0m\n" && exit 1
-}
-
-checkRoot() {
-    curUser=
-    if [ -x "/usr/xpg4/bin/id" ]
-    then
-        curUser=`/usr/xpg4/bin/id -nu`
-    else
-        curUser=`id -nu`
-    fi
-    if [ "$curUser" != "root" ]
-    then
-        error "Only root user can install artifactory as a service"
-    fi
-
-    if [ "$0" = "." ] || [ "$0" = "source" ]; then
-        error "Cannot execute script with source $0"
-    fi
-}
-
-shutdown() {
-  if [ -f $artServiceFile ]; then
-    SERVICE_STATUS="`$artServiceFile status`"
-    if [[ ! "$artServiceFile" =~ .*[sS]topped.* ]]; then
-      echo
-      echo "Stopping the artifactory service..."
-      $artServiceFile stop || exit $?
-      echo -e " DONE"
-    fi
-  fi
-}
-
-uninstallService() {
-  serviceName=$(basename $artServiceFile)
-
-  echo
-  echo -n "Removing the artifactory service from auto-start..."
-  if [ -x /usr/sbin/update-rc.d ]; then
-    /usr/sbin/update-rc.d -f $serviceName remove && removeOk=true
-  elif [ -x /usr/sbin/chkconfig ]; then
-    /usr/sbin/chkconfig --del $serviceName && removeOk=true
-  elif [ -x /sbin/chkconfig ]; then
-    /sbin/chkconfig --del $serviceName && removeOk=true
-  fi
-
-  [ $removeOk ] || error "Could not uninstall service"
-
-  removeOk=
-  if [ -x $artServiceFile ]; then
-    rm $artServiceFile && removeOk=true
-  fi
-
-  [ $removeOk ] || error "Could not delete $artServiceFile"
-
-  removeOk=
-  rm $TOMCAT_HOME/bin/setenv.sh && removeOk=true
-
-  [ $removeOk ] || error "Could not delete $TOMCAT_HOME/bin/setenv.sh"
-
-  echo -e " DONE"
-}
-
-createBackup() {
-  # if some files in data move them to a backup folder
-  if [ -d "$ARTIFACTORY_HOME/data" ]; then
-    TIMESTAMP=`echo "$(date '+%T')" | tr -d ":"`
-    CURRENT_TIME="$(date '+%Y%m%d').$TIMESTAMP"
-    BACKUP_DIR="$ARTIFACTORY_HOME/artifactory.backup.${CURRENT_TIME}"
-
-    echo -n "Creating a backup of the artifactory home folder in ${BACKUP_DIR}..."
-    mkdir -p "${BACKUP_DIR}" && \
-    mv $artEtcDir "${BACKUP_DIR}/etc" && \
-    mv $ARTIFACTORY_HOME/data "${BACKUP_DIR}/data" && \
-    mv $ARTIFACTORY_HOME/logs "${BACKUP_DIR}/logs" && \
-    rm -rf "${BACKUP_DIR}/data/tmp" && \
-    rm -rf "${BACKUP_DIR}/data/work" || exit $?
-    if [ -e $TOMCAT_HOME/lib/mysql-connector-java*.jar ]; then
-      echo "MySQL connector found"
-      mv $TOMCAT_HOME/lib/mysql-connector-java* "${BACKUP_DIR}" || exit $?
-    fi
-    if [ -e $ARTIFACTORY_HOME/backup ]; then
-      mv $ARTIFACTORY_HOME/backup "${BACKUP_DIR}/backup" || exit $?
-    fi
-    echo -e " DONE"
-  fi
-}
-
-removeArtUser() {
-  echo -n "Logging off user $ARTIFACTORY_USER..."
-  pkill -KILL -u $ARTIFACTORY_USER
-
-  rm -rf $ARTIFACTORY_HOME/work/* || exit $?
-
-  # Ignoring user folders since the home dir is deleted already by the RPM spec
-  echo -n "Removing user $ARTIFACTORY_USER..."
-  userdel -r $ARTIFACTORY_USER || exit $?
-
-  EXISTING_GROUP="`grep $artGroup /etc/group | awk -F ':' '{ print $1 }' 2>/dev/null`"
-  if [ "$EXISTING_GROUP" == "$artGroup" ]; then
-    echo "Removing group $artGroup"
-    groupdel $artGroup
-  fi
-  echo -e " DONE"
-}
-
-removeResources() {
-  rm -rf $artEtcDir && \
-  rm $ARTIFACTORY_HOME/etc && \
-  mv $ARTIFACTORY_HOME/etc.original $ARTIFACTORY_HOME/etc && \
-  removeOk=true
-
-  [ removeOk ] || error "Could not restore etc directory"
-
-  rm -rf $TOMCAT_HOME/logs
-  if [ -d $TOMCAT_HOME/logs.original ]; then
-    mv $TOMCAT_HOME/logs.original $TOMCAT_HOME/logs
-  fi
-}
-
-#
-artBinDir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-artExtractDir="$(cd "$(dirname "$artBinDir")" && pwd)"
-[ -n "$artServiceFile" ] || artServiceFile="/etc/init.d/artifactory"
-artDefaultFile="/etc/opt/jfrog/artifactory/default"
-[ -n "$artEtcDir" ] || artEtcDir="/etc/opt/jfrog/artifactory"
-
-checkRoot
-
-. $artDefaultFile || error "$artDefaultFile does not exist or not executable"
-[ -x $artServiceFile ] || error "Could not find artifactory service file at $artServiceFile. Nothing to uninstall."
-
-artGroup="$ARTIFACTORY_USER"
-
-shutdown
-
-uninstallService
-
-createBackup
-
-removeArtUser
-
-removeResources
-
-echo
-echo -e "\033[33mUninstallation of Artifactory completed\033[0m"
-echo -e "Please change the premissions of $ARTIFACTORY_HOME"
diff --git a/distribution/standalone/src/main/install/misc/db/mssql.properties b/distribution/standalone/src/main/install/misc/db/mssql.properties
deleted file mode 100644
index 4641e59..0000000
--- a/distribution/standalone/src/main/install/misc/db/mssql.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-type=mssql
-driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
-url=jdbc:sqlserver://localhost:1433;databaseName=artifactory;sendStringParametersAsUnicode=false;applicationName=Artifactory Binary Repository
-username=artifactory
-password=password
-
-## Determines where the actual artifacts binaries are stored. Available options:
-## filesystem - binaries are stored in the filesystem (recommended, default)
-## fullDb     - binaries are stored as blobs in the db, filesystem is used for caching
-## cachedFS   - binaries are stored in the filesystem, but a front cache (with faster access) is added
-## IMPORTANT NOTE: This property should not be change after the initial setup. To change binaries storage you have to export and import
-#binary.provider.type=filesystem
-
-## Determines the maximum filesystem cache size in bytes when using binary provider type fullDb or cachedFS. Default is 5GB
-## Supported units are TB (terabytes), GB (gigabytes), MB (megabytes) and KB (kilobytes)
-#binary.provider.cache.maxSize=5GB
\ No newline at end of file
diff --git a/distribution/standalone/src/main/install/misc/db/mysql.properties b/distribution/standalone/src/main/install/misc/db/mysql.properties
deleted file mode 100644
index cc97d1c..0000000
--- a/distribution/standalone/src/main/install/misc/db/mysql.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-type=mysql
-driver=com.mysql.jdbc.Driver
-url=jdbc:mysql://localhost:3306/artdb?characterEncoding=UTF-8&elideSetAutoCommits=true
-username=artifactory
-password=password
-
-## Determines where the actual artifacts binaries are stored. Available options:
-## filesystem - binaries are stored in the filesystem (recommended, default)
-## fullDb     - binaries are stored as blobs in the db, filesystem is used for caching
-## cachedFS   - binaries are stored in the filesystem, but a front cache (with faster access) is added
-## IMPORTANT NOTE: This property should not be change after the initial setup. To change binaries storage you have to export and import
-#binary.provider.type=filesystem
-
-## Determines the maximum filesystem cache size in bytes when using binary provider type fullDb or cachedFS. Default is 5GB
-## Supported units are TB (terabytes), GB (gigabytes), MB (megabytes) and KB (kilobytes)
-#binary.provider.cache.maxSize=5GB
\ No newline at end of file
diff --git a/distribution/standalone/src/main/install/misc/db/oracle.properties b/distribution/standalone/src/main/install/misc/db/oracle.properties
deleted file mode 100644
index 9164578..0000000
--- a/distribution/standalone/src/main/install/misc/db/oracle.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-type=oracle
-driver=oracle.jdbc.OracleDriver
-url=jdbc:oracle:thin:@localhost:1521:ORCL
-username=artifactory
-password=password
-
-## Determines where the actual artifacts binaries are stored. Available options:
-## filesystem - binaries are stored in the filesystem (recommended, default)
-## fullDb     - binaries are stored as blobs in the db, filesystem is used for caching
-## cachedFS   - binaries are stored in the filesystem, but a front cache (with faster access) is added
-## IMPORTANT NOTE: This property should not be change after the initial setup. To change binaries storage you have to export and import
-#binary.provider.type=filesystem
-
-## Determines the maximum filesystem cache size in bytes when using binary provider type fullDb or cachedFS. Default is 5GB
-## Supported units are TB (terabytes), GB (gigabytes), MB (megabytes) and KB (kilobytes)
-#binary.provider.cache.maxSize=5GB
\ No newline at end of file
diff --git a/distribution/standalone/src/main/install/misc/db/postgresql.properties b/distribution/standalone/src/main/install/misc/db/postgresql.properties
deleted file mode 100644
index 3205234..0000000
--- a/distribution/standalone/src/main/install/misc/db/postgresql.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-type=postgresql
-driver=org.postgresql.Driver
-url=jdbc:postgresql://localhost:5432/artifactory
-username=artifactory
-password=password
-
-## Determines where the actual artifacts binaries are stored. Available options:
-## filesystem - binaries are stored in the filesystem (recommended, default)
-## fullDb     - binaries are stored as blobs in the db, filesystem is used for caching
-## cachedFS   - binaries are stored in the filesystem, but a front cache (with faster access) is added
-## IMPORTANT NOTE: Due to limitations of the PostgreSQL driver, full DB mode is not recommended. Read more on our wiki
-## IMPORTANT NOTE: This property should not be change after the initial setup. To change binaries storage you have to export and import
-#binary.provider.type=filesystem
-
-## Determines the maximum filesystem cache size in bytes when using binary provider type fullDb or cachedFS. Default is 5GB
-## Supported units are TB (terabytes), GB (gigabytes), MB (megabytes) and KB (kilobytes)
-#binary.provider.cache.maxSize=5GB
\ No newline at end of file
diff --git a/distribution/standalone/src/main/install/misc/ha/ha-node.properties.template b/distribution/standalone/src/main/install/misc/ha/ha-node.properties.template
deleted file mode 100644
index bb77056..0000000
--- a/distribution/standalone/src/main/install/misc/ha/ha-node.properties.template
+++ /dev/null
@@ -1,17 +0,0 @@
-## This is a template file for ha-node.properties. ##
-## Once edited properly, it should be located under the etc/ folder of an Artifactory HA instance ##
-
-# Unique descriptive name of this server.
-node.id=art1
-
-# The location of $CLUSTER_HOME that you set up on your NFS.
-cluster.home=/mnt/shared/artifactory/clusterhome
-
-# The context url that should be used to communicate with this server within the cluster.
-context.url=http://10.0.0.121:8081/artifactory/
-
-# The port that should be used to communicate with this server within the cluster. (Optional)
-membership.port=10001
-
-# Indicates if this is the primary server. (Optional)
-primary=true
\ No newline at end of file
diff --git a/distribution/standalone/src/main/install/misc/service/artifactory b/distribution/standalone/src/main/install/misc/service/artifactory
deleted file mode 100755
index 5bc58da..0000000
--- a/distribution/standalone/src/main/install/misc/service/artifactory
+++ /dev/null
@@ -1,316 +0,0 @@
-#!/bin/bash
-#
-# Startup script for Artifactory in Tomcat Servlet Engine
-#
-# chkconfig: 345 86 14
-# description: Artifactory Tomcat Servlet Engine
-# processname: artifactory
-# pidfile: /var/opt/jfrog/run/artifactory.pid
-#
-### BEGIN INIT INFO
-# Provides:          artifactory
-# Required-Start:    $remote_fs $syslog $network
-# Required-Stop:     $remote_fs $syslog $network
-# Default-Start:     3 4 5
-# Default-Stop:      0 1 6
-# Short-Description: Start Artifactory on Tomcat
-# Description:       Manages the services needed to run Artifactory on a dedicated Tomcat
-### END INIT INFO
-#
-
-errorArtHome() {
-    echo
-    echo -e "\033[31m** ERROR: $1\033[0m"
-    echo
-    exit 1
-}
-
-checkArtHome() {
-    if [ -z "$ARTIFACTORY_HOME" ] || [ ! -d "$ARTIFACTORY_HOME" ]; then
-        errorArtHome "Artifactory home folder not defined or does not exists at $ARTIFACTORY_HOME"
-    fi
-}
-
-checkArtPid() {
-    if [ -z "$ARTIFACTORY_PID" ]; then
-        errorArtHome "Artifactory pid destination ARTIFACTORY_PID was not set in $artDefaultFile ! Please add it!"
-    fi
-}
-
-checkTomcatHome() {
-    if [ -z "$TOMCAT_HOME" ] || [ ! -d "$TOMCAT_HOME" ]; then
-        errorArtHome "Tomcat Artifactory folder not defined or does not exists at $TOMCAT_HOME"
-    fi
-}
-
-checkArtUser() {
-    # User under which tomcat will run
-    if [ -z "$ARTIFACTORY_USER" ]; then
-        # Will run as current user (may be root!!!)
-        ARTIFACTORY_USER=$USER
-    fi
-}
-
-findShutdownPort() {
-    SHUTDOWN_PORT=`netstat -vatn|grep LISTEN|grep $CATALINA_MGNT_PORT|wc -l`
-}
-
-isAlive() {
-    pidValue=""
-    javaPs=""
-    if [ -e "$ARTIFACTORY_PID" ]; then
-        pidValue=`cat $ARTIFACTORY_PID`
-        if [ -n "$pidValue" ]; then
-            javaPs="`ps -p $pidValue | grep java`"
-        fi
-    fi
-}
-
-start() {
-    # Start Tomcat in normal mode
-    isAlive
-    findShutdownPort
-    if [ $SHUTDOWN_PORT -ne 0 ] || [ -n "$javaPs" ]; then
-        echo "Artifactory Tomcat already started"
-    else
-        echo "Starting Artifactory tomcat as user $ARTIFACTORY_USER..."
-        noFileVal=`ulimit -n`
-        minNoFileMax=32000
-        if [ "$noFileVal" != "unlimited" ] && [ $noFileVal -lt $minNoFileMax ]; then
-            ulimit -n $minNoFileMax || echo "WARNING: Max number of open files $noFileVal is too small!
-You should add:
-artifactory soft nofile $minNoFileMax
-artifactory hard nofile $minNoFileMax
-to your /etc/security/limits.conf file."
-        fi
-
-        #
-        minNbProcess=1024
-        nbProcess=`ulimit -u`
-        if [ "$nbProcess" != "unlimited" ] && [ $nbProcess -lt $minNbProcess ]; then
-            ulimit -u $minNbProcess || echo "WARNING: Number of processes $nbProcess is too small!
-You should add:
-artifactory soft nproc $minNbProcess
-artifactory hard nproc $minNbProcess
-to your /etc/security/limits.conf file."
-        fi
-        su -l $ARTIFACTORY_USER -c "export JAVA_HOME='$JAVA_HOME'; $TOMCAT_HOME/bin/startup.sh"
-        RETVAL=$?
-        if [ $RETVAL -ne 0 ]; then
-            errorArtHome "Artifactory Tomcat server did not start. Please check the logs"
-        fi
-        findShutdownPort
-        nbSeconds=1
-        START_TMO=${START_TMO:-60}
-        while [ $SHUTDOWN_PORT -eq 0 ] && [ $nbSeconds -lt $START_TMO ]; do
-            sleep 1
-            let "nbSeconds = $nbSeconds + 1"
-            findShutdownPort
-        done
-        if [ $SHUTDOWN_PORT -eq 0 ]; then
-            errorArtHome "Artifactory Tomcat server did not start in 60 seconds. Please check the logs"
-        fi
-        echo "Artifactory Tomcat started in normal mode"
-        [ $RETVAL=0 ] && touch $CATALINA_LOCK_FILE
-    fi
-}
-
-stop() {
-    isAlive
-    findShutdownPort
-    if [ $SHUTDOWN_PORT -eq 0 ] && [ -z "$javaPs" ]; then
-        echo "Artifactory Tomcat already stopped"
-        RETVAL=0
-    else
-        echo "Stopping Artifactory Tomcat..."
-        if [ $SHUTDOWN_PORT -ne 0 ]; then
-            su -l $ARTIFACTORY_USER -c "export JAVA_HOME='$JAVA_HOME'; $TOMCAT_HOME/bin/shutdown.sh"
-            RETVAL=$?
-        else
-            RETVAL=1
-        fi
-        killed=false
-        if [ $RETVAL -ne 0 ]; then
-            echo "WARN: Artifactory Tomcat server shutdown script failed. Sending kill signal to $pidValue"
-            if [ -n "$pidValue" ]; then
-                killed=true
-                kill $pidValue
-                RETVAL=$?
-            fi
-        fi
-        # Wait 2 seconds for process to die
-        sleep 2
-        findShutdownPort
-        isAlive
-        nbSeconds=1
-        while [ $SHUTDOWN_PORT -ne 0 ] || [ -n "$javaPs" ] && [ $nbSeconds -lt 30 ]; do
-            if [ $nbSeconds -eq 10 ] && [ -n "$pidValue" ]; then
-                # After 10 seconds try to kill the process
-                echo "WARN: Artifactory Tomcat server shutdown not done after 10 seconds. Sending kill signal"
-                kill $pidValue
-                RETVAL=$?
-            fi
-            if [ $nbSeconds -eq 25 ] && [ -n "$pidValue" ]; then
-                # After 25 seconds try to kill -9 the process
-                echo "WARN: Artifactory Tomcat server shutdown not done after 25 seconds. Sending kill -9 signal"
-                kill -9 $pidValue
-                RETVAL=$?
-            fi
-            sleep 1
-            let "nbSeconds = $nbSeconds + 1"
-            findShutdownPort
-            isAlive
-        done
-        if [ $SHUTDOWN_PORT -eq 0 ] && [ -z "$javaPs" ]; then
-           echo "Artifactory Tomcat stopped"
-        else
-           echo "ERROR: Artifactory Tomcat did not stop"
-           RETVAL=1
-        fi
-    fi
-    [ $RETVAL=0 ] && rm -f "$CATALINA_LOCK_FILE" "$ARTIFACTORY_PID"
-}
-
-start_and_wait() {
-    start
-    if [ -e $ARTIFACTORY_PID ]; then
-	PID=$(cat $ARTIFACTORY_PID)
-	while [ ! -e ~artifactory/logs/artifactory.log ]; do
-	    sleep 10
-	done
-	tail -f ~artifactory/logs/artifactory.log &
-	terminating() {
-	    echo received stop
-	    stop
-	    while [ -e $ARTIFACTORY_PID ] || [ ps $PID >/dev/null 2>&1 ]; do
-		sleep 1
-	    done
-	    exit 0
-	}
-	trap terminating SIGINT SIGTERM
-	while :; do
-	    sleep 5
-	done
-    fi
-    echo Something went wrong $PID $?
-}
-
-status() {
-    findShutdownPort
-    if [ $SHUTDOWN_PORT -eq 0 ]; then
-        if [ -e "$ARTIFACTORY_PID" ]; then
-            echo "ERROR: Artifactory is stopped but the pid file $ARTIFACTORY_PID still exist"
-            RETVAL=1
-        else
-            if [ -e "$CATALINA_LOCK_FILE" ]; then
-                echo "ERROR: Artifactory is stopped but the lock file $CATALINA_LOCK_FILE still exist"
-                RETVAL=2
-            else
-                echo "Artifactory Tomcat stopped"
-                RETVAL=3
-            fi
-        fi
-    else
-        echo "Artifactory Tomcat running"
-        RETVAL=0
-    fi
-}
-
-check() {
-    if [ -f $ARTIFACTORY_PID ]; then
-        echo "Artifactory is running, on pid="`cat $ARTIFACTORY_PID`
-        echo ""
-        exit 0
-    fi
-
-    echo "Checking arguments to Artifactory: "
-    echo "ARTIFACTORY_HOME     =  $ARTIFACTORY_HOME"
-    echo "ARTIFACTORY_USER     =  $ARTIFACTORY_USER"
-    echo "TOMCAT_HOME          =  $TOMCAT_HOME"
-    echo "ARTIFACTORY_PID      =  $ARTIFACTORY_PID"
-    echo "JAVA_HOME            =  $JAVA_HOME"
-    echo "JAVA_OPTIONS         =  $JAVA_OPTIONS"
-    echo
-
-    checkJavaVersion
-
-    exit 1
-}
-
-checkJavaVersion(){
-    if [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]];  then
-        echo found java executable in JAVA_HOME
-        _java="$JAVA_HOME/bin/java"
-    elif type -p java; then
-        _java=java
-    else
-        echo "no java"
-    fi
-
-    if [[ "$_java" ]]; then
-        "$_java" -version 2>&1| \
-        awk -F\" '/version/{\
-            if ($2 < 1.8) {\
-                printf "%s is too old must be at least java 1.8\n", $2;\
-                exit 0;\
-            } else exit 1}' && exit 99
-    fi
-}
-
-#
-ARTIFACTORY_PID=""
-artDefaultFile="/etc/opt/jfrog/artifactory/default"
-
-if [ ! -e $artDefaultFile ]; then
-    sed '/ARTIFACTORY/s/^#//;/ARTIFACTORY_PID/s-$ARTIFACTORY_HOME-/var/opt/jfrog-' </opt/jfrog/artifactory/bin/artifactory.default >$artDefaultFile
-fi
-
-. $artDefaultFile || errorArtHome "ERROR: $artDefaultFile does not exist or not executable"
-
-checkArtHome
-
-checkArtPid
-
-checkTomcatHome
-
-# Basic variables used
-CATALINA_MGNT_PORT=8015
-CATALINA_PID_FOLDER="$(dirname "$ARTIFACTORY_PID")"
-CATALINA_LOCK_FILE=$CATALINA_PID_FOLDER/lock
-RETVAL=0
-
-checkArtUser
-
-case "$1" in
-  start)
-        checkJavaVersion
-        start
-        ;;
-  wait)
-        checkJavaVersion
-	    start_and_wait
-	    ;;
-  stop)
-        stop
-        ;;
-  restart)
-        stop
-        start
-        ;;
-  redebug)
-        stop
-        debug
-        ;;
-  status)
-        status
-        ;;
-  check)
-        check
-        ;;
-  *)
-        echo "Usage: $0 {start|stop|restart|redebug|status|check}"
-        exit 1
-        ;;
-esac
-
-exit $RETVAL
diff --git a/distribution/standalone/src/main/install/misc/tomcat/web.xml b/distribution/standalone/src/main/install/misc/tomcat/web.xml
deleted file mode 100644
index b79d39e..0000000
--- a/distribution/standalone/src/main/install/misc/tomcat/web.xml
+++ /dev/null
@@ -1,4612 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one or more
-  contributor license agreements.  See the NOTICE file distributed with
-  this work for additional information regarding copyright ownership.
-  The ASF licenses this file to You under the Apache License, Version 2.0
-  (the "License"); you may not use this file except in compliance with
-  the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<web-app xmlns="http://java.sun.com/xml/ns/javaee"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
-                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
-  version="3.0">
-
-  <!-- ======================== Introduction ============================== -->
-  <!-- This document defines default values for *all* web applications      -->
-  <!-- loaded into this instance of Tomcat.  As each application is         -->
-  <!-- deployed, this file is processed, followed by the                    -->
-  <!-- "/WEB-INF/web.xml" deployment descriptor from your own               -->
-  <!-- applications.                                                        -->
-  <!--                                                                      -->
-  <!-- WARNING:  Do not configure application-specific resources here!      -->
-  <!-- They should go in the "/WEB-INF/web.xml" file in your application.   -->
-
-
-  <!-- ================== Built In Servlet Definitions ==================== -->
-
-
-  <!-- The default servlet for all web applications, that serves static     -->
-  <!-- resources.  It processes all requests that are not mapped to other   -->
-  <!-- servlets with servlet mappings (defined either here or in your own   -->
-  <!-- web.xml file).  This servlet supports the following initialization   -->
-  <!-- parameters (default values are in square brackets):                  -->
-  <!--                                                                      -->
-  <!--   debug               Debugging detail level for messages logged     -->
-  <!--                       by this servlet.  [0]                          -->
-  <!--                                                                      -->
-  <!--   fileEncoding        Encoding to be used to read static resources   -->
-  <!--                       [platform default]                             -->
-  <!--                                                                      -->
-  <!--   input               Input buffer size (in bytes) when reading      -->
-  <!--                       resources to be served.  [2048]                -->
-  <!--                                                                      -->
-  <!--   listings            Should directory listings be produced if there -->
-  <!--                       is no welcome file in this directory?  [false] -->
-  <!--                       WARNING: Listings for directories with many    -->
-  <!--                       entries can be slow and may consume            -->
-  <!--                       significant proportions of server resources.   -->
-  <!--                                                                      -->
-  <!--   output              Output buffer size (in bytes) when writing     -->
-  <!--                       resources to be served.  [2048]                -->
-  <!--                                                                      -->
-  <!--   readonly            Is this context "read only", so HTTP           -->
-  <!--                       commands like PUT and DELETE are               -->
-  <!--                       rejected?  [true]                              -->
-  <!--                                                                      -->
-  <!--   readmeFile          File to display together with the directory    -->
-  <!--                       contents. [null]                               -->
-  <!--                                                                      -->
-  <!--   sendfileSize        If the connector used supports sendfile, this  -->
-  <!--                       represents the minimal file size in KB for     -->
-  <!--                       which sendfile will be used. Use a negative    -->
-  <!--                       value to always disable sendfile.  [48]        -->
-  <!--                                                                      -->
-  <!--   useAcceptRanges     Should the Accept-Ranges header be included    -->
-  <!--                       in responses where appropriate? [true]         -->
-  <!--                                                                      -->
-  <!--  For directory listing customization. Checks localXsltFile, then     -->
-  <!--  globalXsltFile, then defaults to original behavior.                 -->
-  <!--                                                                      -->
-  <!--   localXsltFile       Make directory listings an XML doc and         -->
-  <!--                       pass the result to this style sheet residing   -->
-  <!--                       in that directory. This overrides              -->
-  <!--                       contextXsltFile and globalXsltFile[null]       -->
-  <!--                                                                      -->
-  <!--   contextXsltFile     Make directory listings an XML doc and         -->
-  <!--                       pass the result to this style sheet which is   -->
-  <!--                       relative to the context root. This overrides   -->
-  <!--                       globalXsltFile[null]                           -->
-  <!--                                                                      -->
-  <!--   globalXsltFile      Site wide configuration version of             -->
-  <!--                       localXsltFile This argument is expected        -->
-  <!--                       to be a physical file. [null]                  -->
-  <!--                                                                      -->
-  <!--                                                                      -->
-
-    <servlet>
-        <servlet-name>default</servlet-name>
-        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
-        <init-param>
-            <param-name>debug</param-name>
-            <param-value>0</param-value>
-        </init-param>
-        <init-param>
-            <param-name>listings</param-name>
-            <param-value>false</param-value>
-        </init-param>
-        <load-on-startup>1</load-on-startup>
-    </servlet>
-
-
-  <!-- The JSP page compiler and execution servlet, which is the mechanism  -->
-  <!-- used by Tomcat to support JSP pages.  Traditionally, this servlet    -->
-  <!-- is mapped to the URL pattern "*.jsp".  This servlet supports the     -->
-  <!-- following initialization parameters (default values are in square    -->
-  <!-- brackets):                                                           -->
-  <!--                                                                      -->
-  <!--   checkInterval       If development is false and checkInterval is   -->
-  <!--                       greater than zero, background compilations are -->
-  <!--                       enabled. checkInterval is the time in seconds  -->
-  <!--                       between checks to see if a JSP page (and its   -->
-  <!--                       dependent files) needs to  be recompiled. [0]  -->
-  <!--                                                                      -->
-  <!--   classdebuginfo      Should the class file be compiled with         -->
-  <!--                       debugging information?  [true]                 -->
-  <!--                                                                      -->
-  <!--   classpath           What class path should I use while compiling   -->
-  <!--                       generated servlets?  [Created dynamically      -->
-  <!--                       based on the current web application]          -->
-  <!--                                                                      -->
-  <!--   compiler            Which compiler Ant should use to compile JSP   -->
-  <!--                       pages.  See the jasper documentation for more  -->
-  <!--                       information.                                   -->
-  <!--                                                                      -->
-  <!--   compilerSourceVM    Compiler source VM. [1.6]                      -->
-  <!--                                                                      -->
-  <!--   compilerTargetVM    Compiler target VM. [1.6]                      -->
-  <!--                                                                      -->
-  <!--   development         Is Jasper used in development mode? If true,   -->
-  <!--                       the frequency at which JSPs are checked for    -->
-  <!--                       modification may be specified via the          -->
-  <!--                       modificationTestInterval parameter. [true]     -->
-  <!--                                                                      -->
-  <!--   displaySourceFragment                                              -->
-  <!--                       Should a source fragment be included in        -->
-  <!--                       exception messages? [true]                     -->
-  <!--                                                                      -->
-  <!--   dumpSmap            Should the SMAP info for JSR45 debugging be    -->
-  <!--                       dumped to a file? [false]                      -->
-  <!--                       False if suppressSmap is true                  -->
-  <!--                                                                      -->
-  <!--   enablePooling       Determines whether tag handler pooling is      -->
-  <!--                       enabled. This is a compilation option. It will -->
-  <!--                       not alter the behaviour of JSPs that have      -->
-  <!--                       already been compiled. [true]                  -->
-  <!--                                                                      -->
-  <!--   engineOptionsClass  Allows specifying the Options class used to    -->
-  <!--                       configure Jasper. If not present, the default  -->
-  <!--                       EmbeddedServletOptions will be used.           -->
-  <!--                                                                      -->
-  <!--   errorOnUseBeanInvalidClassAttribute                                -->
-  <!--                       Should Jasper issue an error when the value of -->
-  <!--                       the class attribute in an useBean action is    -->
-  <!--                       not a valid bean class?  [true]                -->
-  <!--                                                                      -->
-  <!--   fork                Tell Ant to fork compiles of JSP pages so that -->
-  <!--                       a separate JVM is used for JSP page compiles   -->
-  <!--                       from the one Tomcat is running in. [true]      -->
-  <!--                                                                      -->
-  <!--   genStringAsCharArray                                               -->
-  <!--                       Should text strings be generated as char       -->
-  <!--                       arrays, to improve performance in some cases?  -->
-  <!--                       [false]                                        -->
-  <!--                                                                      -->
-  <!--   ieClassId           The class-id value to be sent to Internet      -->
-  <!--                       Explorer when using <jsp:plugin> tags.         -->
-  <!--                       [clsid:8AD9C840-044E-11D1-B3E9-00805F499D93]   -->
-  <!--                                                                      -->
-  <!--   javaEncoding        Java file encoding to use for generating java  -->
-  <!--                       source files. [UTF8]                           -->
-  <!--                                                                      -->
-  <!--   keepgenerated       Should we keep the generated Java source code  -->
-  <!--                       for each page instead of deleting it? [true]   -->
-  <!--                                                                      -->
-  <!--   mappedfile          Should we generate static content with one     -->
-  <!--                       print statement per input line, to ease        -->
-  <!--                       debugging?  [true]                             -->
-  <!--                                                                      -->
-  <!--   maxLoadedJsps       The maximum number of JSPs that will be loaded -->
-  <!--                       for a web application. If more than this       -->
-  <!--                       number of JSPs are loaded, the least recently  -->
-  <!--                       used JSPs will be unloaded so that the number  -->
-  <!--                       of JSPs loaded at any one time does not exceed -->
-  <!--                       this limit. A value of zero or less indicates  -->
-  <!--                       no limit. [-1]                                 -->
-  <!--                                                                      -->
-  <!--   jspIdleTimeout      The amount of time in seconds a JSP can be     -->
-  <!--                       idle before it is unloaded. A value of zero    -->
-  <!--                       or less indicates never unload. [-1]           -->
-  <!--                                                                      -->
-  <!--   modificationTestInterval                                           -->
-  <!--                       Causes a JSP (and its dependent files) to not  -->
-  <!--                       be checked for modification during the         -->
-  <!--                       specified time interval (in seconds) from the  -->
-  <!--                       last time the JSP was checked for              -->
-  <!--                       modification. A value of 0 will cause the JSP  -->
-  <!--                       to be checked on every access.                 -->
-  <!--                       Used in development mode only. [4]             -->
-  <!--                                                                      -->
-  <!--   recompileOnFail     If a JSP compilation fails should the          -->
-  <!--                       modificationTestInterval be ignored and the    -->
-  <!--                       next access trigger a re-compilation attempt?  -->
-  <!--                       Used in development mode only and is disabled  -->
-  <!--                       by default as compilation may be expensive and -->
-  <!--                       could lead to excessive resource usage.        -->
-  <!--                       [false]                                        -->
-  <!--                                                                      -->
-  <!--   scratchdir          What scratch directory should we use when      -->
-  <!--                       compiling JSP pages?  [default work directory  -->
-  <!--                       for the current web application]               -->
-  <!--                                                                      -->
-  <!--   suppressSmap        Should the generation of SMAP info for JSR45   -->
-  <!--                       debugging be suppressed?  [false]              -->
-  <!--                                                                      -->
-  <!--   trimSpaces          Should white spaces in template text between   -->
-  <!--                       actions or directives be trimmed?  [false]     -->
-  <!--                                                                      -->
-  <!--   xpoweredBy          Determines whether X-Powered-By response       -->
-  <!--                       header is added by generated servlet.  [false] -->
-
-<!--
-    <servlet>
-        <servlet-name>jsp</servlet-name>
-        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
-        <init-param>
-            <param-name>fork</param-name>
-            <param-value>false</param-value>
-        </init-param>
-        <init-param>
-            <param-name>xpoweredBy</param-name>
-            <param-value>false</param-value>
-        </init-param>
-        <load-on-startup>3</load-on-startup>
-    </servlet>
--->
-
-  <!-- NOTE: An SSI Filter is also available as an alternative SSI          -->
-  <!-- implementation. Use either the Servlet or the Filter but NOT both.   -->
-  <!--                                                                      -->
-  <!-- Server Side Includes processing servlet, which processes SSI         -->
-  <!-- directives in HTML pages consistent with similar support in web      -->
-  <!-- servers like Apache.  Traditionally, this servlet is mapped to the   -->
-  <!-- URL pattern "*.shtml".  This servlet supports the following          -->
-  <!-- initialization parameters (default values are in square brackets):   -->
-  <!--                                                                      -->
-  <!--   buffered            Should output from this servlet be buffered?   -->
-  <!--                       (0=false, 1=true)  [0]                         -->
-  <!--                                                                      -->
-  <!--   debug               Debugging detail level for messages logged     -->
-  <!--                       by this servlet.  [0]                          -->
-  <!--                                                                      -->
-  <!--   expires             The number of seconds before a page with SSI   -->
-  <!--                       directives will expire.  [No default]          -->
-  <!--                                                                      -->
-  <!--   isVirtualWebappRelative                                            -->
-  <!--                       Should "virtual" paths be interpreted as       -->
-  <!--                       relative to the context root, instead of       -->
-  <!--                       the server root? [false]                       -->
-  <!--                                                                      -->
-  <!--   inputEncoding       The encoding to assume for SSI resources if    -->
-  <!--                       one is not available from the resource.        -->
-  <!--                       [Platform default]                             -->
-  <!--                                                                      -->
-  <!--   outputEncoding      The encoding to use for the page that results  -->
-  <!--                       from the SSI processing. [UTF-8]               -->
-  <!--                                                                      -->
-  <!--   allowExec           Is use of the exec command enabled? [false]    -->
-
-<!--
-    <servlet>
-        <servlet-name>ssi</servlet-name>
-        <servlet-class>
-          org.apache.catalina.ssi.SSIServlet
-        </servlet-class>
-        <init-param>
-          <param-name>buffered</param-name>
-          <param-value>1</param-value>
-        </init-param>
-        <init-param>
-          <param-name>debug</param-name>
-          <param-value>0</param-value>
-        </init-param>
-        <init-param>
-          <param-name>expires</param-name>
-          <param-value>666</param-value>
-        </init-param>
-        <init-param>
-          <param-name>isVirtualWebappRelative</param-name>
-          <param-value>false</param-value>
-        </init-param>
-        <load-on-startup>4</load-on-startup>
-    </servlet>
--->
-
-
-  <!-- Common Gateway Includes (CGI) processing servlet, which supports     -->
-  <!-- execution of external applications that conform to the CGI spec      -->
-  <!-- requirements.  Typically, this servlet is mapped to the URL pattern  -->
-  <!-- "/cgi-bin/*", which means that any CGI applications that are         -->
-  <!-- executed must be present within the web application.  This servlet   -->
-  <!-- supports the following initialization parameters (default values     -->
-  <!-- are in square brackets):                                             -->
-  <!--                                                                      -->
-  <!--   cgiPathPrefix        The CGI search path will start at             -->
-  <!--                        webAppRootDir + File.separator + this prefix. -->
-  <!--                        [WEB-INF/cgi]                                 -->
-  <!--                                                                      -->
-  <!--   debug                Debugging detail level for messages logged    -->
-  <!--                        by this servlet.  [0]                         -->
-  <!--                                                                      -->
-  <!--   executable           Name of the executable used to run the        -->
-  <!--                        script. [perl]                                -->
-  <!--                                                                      -->
-  <!--   parameterEncoding    Name of parameter encoding to be used with    -->
-  <!--                        CGI servlet.                                  -->
-  <!--                        [System.getProperty("file.encoding","UTF-8")] -->
-  <!--                                                                      -->
-  <!--   passShellEnvironment Should the shell environment variables (if    -->
-  <!--                        any) be passed to the CGI script? [false]     -->
-  <!--                                                                      -->
-  <!--   stderrTimeout        The time (in milliseconds) to wait for the    -->
-  <!--                        reading of stderr to complete before          -->
-  <!--                        terminating the CGI process. [2000]           -->
-
-<!--
-    <servlet>
-        <servlet-name>cgi</servlet-name>
-        <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
-        <init-param>
-          <param-name>debug</param-name>
-          <param-value>0</param-value>
-        </init-param>
-        <init-param>
-          <param-name>cgiPathPrefix</param-name>
-          <param-value>WEB-INF/cgi</param-value>
-        </init-param>
-         <load-on-startup>5</load-on-startup>
-    </servlet>
--->
-
-
-  <!-- ================ Built In Servlet Mappings ========================= -->
-
-
-  <!-- The servlet mappings for the built in servlets defined above.  Note  -->
-  <!-- that, by default, the CGI and SSI servlets are *not* mapped.  You    -->
-  <!-- must uncomment these mappings (or add them to your application's own -->
-  <!-- web.xml deployment descriptor) to enable these services              -->
-
-    <!-- The mapping for the default servlet -->
-    <servlet-mapping>
-        <servlet-name>default</servlet-name>
-        <url-pattern>/</url-pattern>
-    </servlet-mapping>
-
-    <!-- The mappings for the JSP servlet -->
-<!--
-    <servlet-mapping>
-        <servlet-name>jsp</servlet-name>
-        <url-pattern>*.jsp</url-pattern>
-        <url-pattern>*.jspx</url-pattern>
-    </servlet-mapping>
--->
-
-    <!-- The mapping for the SSI servlet -->
-<!--
-    <servlet-mapping>
-        <servlet-name>ssi</servlet-name>
-        <url-pattern>*.shtml</url-pattern>
-    </servlet-mapping>
--->
-
-    <!-- The mapping for the CGI Gateway servlet -->
-
-<!--
-    <servlet-mapping>
-        <servlet-name>cgi</servlet-name>
-        <url-pattern>/cgi-bin/*</url-pattern>
-    </servlet-mapping>
--->
-
-
-  <!-- ================== Built In Filter Definitions ===================== -->
-
-  <!-- A filter that sets character encoding that is used to decode -->
-  <!-- parameters in a POST request -->
-<!--
-    <filter>
-        <filter-name>setCharacterEncodingFilter</filter-name>
-        <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
-        <init-param>
-            <param-name>encoding</param-name>
-            <param-value>UTF-8</param-value>
-        </init-param>
-        <async-supported>true</async-supported>
-    </filter>
--->
-
-  <!-- A filter that triggers request parameters parsing and rejects the    -->
-  <!-- request if some parameters were skipped because of parsing errors or -->
-  <!-- request size limitations.                                            -->
-<!--
-    <filter>
-        <filter-name>failedRequestFilter</filter-name>
-        <filter-class>
-          org.apache.catalina.filters.FailedRequestFilter
-        </filter-class>
-        <async-supported>true</async-supported>
-    </filter>
--->
-
-
-  <!-- NOTE: An SSI Servlet is also available as an alternative SSI         -->
-  <!-- implementation. Use either the Servlet or the Filter but NOT both.   -->
-  <!--                                                                      -->
-  <!-- Server Side Includes processing filter, which processes SSI          -->
-  <!-- directives in HTML pages consistent with similar support in web      -->
-  <!-- servers like Apache.  Traditionally, this filter is mapped to the    -->
-  <!-- URL pattern "*.shtml", though it can be mapped to "*" as it will     -->
-  <!-- selectively enable/disable SSI processing based on mime types. For   -->
-  <!-- this to work you will need to uncomment the .shtml mime type         -->
-  <!-- definition towards the bottom of this file.                          -->
-  <!-- The contentType init param allows you to apply SSI processing to JSP -->
-  <!-- pages, javascript, or any other content you wish.  This filter       -->
-  <!-- supports the following initialization parameters (default values are -->
-  <!-- in square brackets):                                                 -->
-  <!--                                                                      -->
-  <!--   contentType         A regex pattern that must be matched before    -->
-  <!--                       SSI processing is applied.                     -->
-  <!--                       [text/x-server-parsed-html(;.*)?]              -->
-  <!--                                                                      -->
-  <!--   debug               Debugging detail level for messages logged     -->
-  <!--                       by this servlet.  [0]                          -->
-  <!--                                                                      -->
-  <!--   expires             The number of seconds before a page with SSI   -->
-  <!--                       directives will expire.  [No default]          -->
-  <!--                                                                      -->
-  <!--   isVirtualWebappRelative                                            -->
-  <!--                       Should "virtual" paths be interpreted as       -->
-  <!--                       relative to the context root, instead of       -->
-  <!--                       the server root? [false]                       -->
-  <!--                                                                      -->
-  <!--   allowExec           Is use of the exec command enabled? [false]    -->
-
-<!--
-    <filter>
-        <filter-name>ssi</filter-name>
-        <filter-class>
-          org.apache.catalina.ssi.SSIFilter
-        </filter-class>
-        <init-param>
-          <param-name>contentType</param-name>
-          <param-value>text/x-server-parsed-html(;.*)?</param-value>
-        </init-param>
-        <init-param>
-          <param-name>debug</param-name>
-          <param-value>0</param-value>
-        </init-param>
-        <init-param>
-          <param-name>expires</param-name>
-          <param-value>666</param-value>
-        </init-param>
-        <init-param>
-          <param-name>isVirtualWebappRelative</param-name>
-          <param-value>false</param-value>
-        </init-param>
-    </filter>
--->
-
-
-  <!-- ==================== Built In Filter Mappings ====================== -->
-
-  <!-- The mapping for the Set Character Encoding Filter -->
-<!--
-    <filter-mapping>
-        <filter-name>setCharacterEncodingFilter</filter-name>
-        <url-pattern>/*</url-pattern>
-    </filter-mapping>
--->
-
-  <!-- The mapping for the Failed Request Filter -->
-<!--
-    <filter-mapping>
-        <filter-name>failedRequestFilter</filter-name>
-        <url-pattern>/*</url-pattern>
-    </filter-mapping>
--->
-
-  <!-- The mapping for the SSI Filter -->
-<!--
-    <filter-mapping>
-        <filter-name>ssi</filter-name>
-        <url-pattern>*.shtml</url-pattern>
-    </filter-mapping>
--->
-
-
-  <!-- ==================== Default Session Configuration ================= -->
-  <!-- You can set the default session timeout (in minutes) for all newly   -->
-  <!-- created sessions by modifying the value below.                       -->
-
-    <session-config>
-        <session-timeout>30</session-timeout>
-    </session-config>
-
-
-  <!-- ===================== Default MIME Type Mappings =================== -->
-  <!-- When serving static resources, Tomcat will automatically generate    -->
-  <!-- a "Content-Type" header based on the resource's filename extension,  -->
-  <!-- based on these mappings.  Additional mappings can be added here (to  -->
-  <!-- apply to all web applications), or in your own application's web.xml -->
-  <!-- deployment descriptor.                                               -->
-
-    <mime-mapping>
-        <extension>123</extension>
-        <mime-type>application/vnd.lotus-1-2-3</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>3dml</extension>
-        <mime-type>text/vnd.in3d.3dml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>3ds</extension>
-        <mime-type>image/x-3ds</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>3g2</extension>
-        <mime-type>video/3gpp2</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>3gp</extension>
-        <mime-type>video/3gpp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>7z</extension>
-        <mime-type>application/x-7z-compressed</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>aab</extension>
-        <mime-type>application/x-authorware-bin</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>aac</extension>
-        <mime-type>audio/x-aac</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>aam</extension>
-        <mime-type>application/x-authorware-map</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>aas</extension>
-        <mime-type>application/x-authorware-seg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>abs</extension>
-        <mime-type>audio/x-mpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>abw</extension>
-        <mime-type>application/x-abiword</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ac</extension>
-        <mime-type>application/pkix-attr-cert</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>acc</extension>
-        <mime-type>application/vnd.americandynamics.acc</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ace</extension>
-        <mime-type>application/x-ace-compressed</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>acu</extension>
-        <mime-type>application/vnd.acucobol</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>acutc</extension>
-        <mime-type>application/vnd.acucorp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>adp</extension>
-        <mime-type>audio/adpcm</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>aep</extension>
-        <mime-type>application/vnd.audiograph</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>afm</extension>
-        <mime-type>application/x-font-type1</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>afp</extension>
-        <mime-type>application/vnd.ibm.modcap</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ahead</extension>
-        <mime-type>application/vnd.ahead.space</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ai</extension>
-        <mime-type>application/postscript</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>aif</extension>
-        <mime-type>audio/x-aiff</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>aifc</extension>
-        <mime-type>audio/x-aiff</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>aiff</extension>
-        <mime-type>audio/x-aiff</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>aim</extension>
-        <mime-type>application/x-aim</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>air</extension>
-        <mime-type>application/vnd.adobe.air-application-installer-package+zip</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ait</extension>
-        <mime-type>application/vnd.dvb.ait</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ami</extension>
-        <mime-type>application/vnd.amiga.ami</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>anx</extension>
-        <mime-type>application/annodex</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>apk</extension>
-        <mime-type>application/vnd.android.package-archive</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>appcache</extension>
-        <mime-type>text/cache-manifest</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>application</extension>
-        <mime-type>application/x-ms-application</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>apr</extension>
-        <mime-type>application/vnd.lotus-approach</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>arc</extension>
-        <mime-type>application/x-freearc</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>art</extension>
-        <mime-type>image/x-jg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>asc</extension>
-        <mime-type>application/pgp-signature</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>asf</extension>
-        <mime-type>video/x-ms-asf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>asm</extension>
-        <mime-type>text/x-asm</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>aso</extension>
-        <mime-type>application/vnd.accpac.simply.aso</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>asx</extension>
-        <mime-type>video/x-ms-asf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>atc</extension>
-        <mime-type>application/vnd.acucorp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>atom</extension>
-        <mime-type>application/atom+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>atomcat</extension>
-        <mime-type>application/atomcat+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>atomsvc</extension>
-        <mime-type>application/atomsvc+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>atx</extension>
-        <mime-type>application/vnd.antix.game-component</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>au</extension>
-        <mime-type>audio/basic</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>avi</extension>
-        <mime-type>video/x-msvideo</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>avx</extension>
-        <mime-type>video/x-rad-screenplay</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>aw</extension>
-        <mime-type>application/applixware</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>axa</extension>
-        <mime-type>audio/annodex</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>axv</extension>
-        <mime-type>video/annodex</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>azf</extension>
-        <mime-type>application/vnd.airzip.filesecure.azf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>azs</extension>
-        <mime-type>application/vnd.airzip.filesecure.azs</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>azw</extension>
-        <mime-type>application/vnd.amazon.ebook</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>bat</extension>
-        <mime-type>application/x-msdownload</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>bcpio</extension>
-        <mime-type>application/x-bcpio</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>bdf</extension>
-        <mime-type>application/x-font-bdf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>bdm</extension>
-        <mime-type>application/vnd.syncml.dm+wbxml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>bed</extension>
-        <mime-type>application/vnd.realvnc.bed</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>bh2</extension>
-        <mime-type>application/vnd.fujitsu.oasysprs</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>bin</extension>
-        <mime-type>application/octet-stream</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>blb</extension>
-        <mime-type>application/x-blorb</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>blorb</extension>
-        <mime-type>application/x-blorb</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>bmi</extension>
-        <mime-type>application/vnd.bmi</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>bmp</extension>
-        <mime-type>image/bmp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>body</extension>
-        <mime-type>text/html</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>book</extension>
-        <mime-type>application/vnd.framemaker</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>box</extension>
-        <mime-type>application/vnd.previewsystems.box</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>boz</extension>
-        <mime-type>application/x-bzip2</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>bpk</extension>
-        <mime-type>application/octet-stream</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>btif</extension>
-        <mime-type>image/prs.btif</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>bz</extension>
-        <mime-type>application/x-bzip</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>bz2</extension>
-        <mime-type>application/x-bzip2</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>c</extension>
-        <mime-type>text/x-c</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>c11amc</extension>
-        <mime-type>application/vnd.cluetrust.cartomobile-config</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>c11amz</extension>
-        <mime-type>application/vnd.cluetrust.cartomobile-config-pkg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>c4d</extension>
-        <mime-type>application/vnd.clonk.c4group</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>c4f</extension>
-        <mime-type>application/vnd.clonk.c4group</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>c4g</extension>
-        <mime-type>application/vnd.clonk.c4group</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>c4p</extension>
-        <mime-type>application/vnd.clonk.c4group</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>c4u</extension>
-        <mime-type>application/vnd.clonk.c4group</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cab</extension>
-        <mime-type>application/vnd.ms-cab-compressed</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>caf</extension>
-        <mime-type>audio/x-caf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cap</extension>
-        <mime-type>application/vnd.tcpdump.pcap</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>car</extension>
-        <mime-type>application/vnd.curl.car</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cat</extension>
-        <mime-type>application/vnd.ms-pki.seccat</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cb7</extension>
-        <mime-type>application/x-cbr</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cba</extension>
-        <mime-type>application/x-cbr</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cbr</extension>
-        <mime-type>application/x-cbr</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cbt</extension>
-        <mime-type>application/x-cbr</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cbz</extension>
-        <mime-type>application/x-cbr</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cc</extension>
-        <mime-type>text/x-c</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cct</extension>
-        <mime-type>application/x-director</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ccxml</extension>
-        <mime-type>application/ccxml+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cdbcmsg</extension>
-        <mime-type>application/vnd.contact.cmsg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cdf</extension>
-        <mime-type>application/x-cdf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cdkey</extension>
-        <mime-type>application/vnd.mediastation.cdkey</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cdmia</extension>
-        <mime-type>application/cdmi-capability</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cdmic</extension>
-        <mime-type>application/cdmi-container</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cdmid</extension>
-        <mime-type>application/cdmi-domain</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cdmio</extension>
-        <mime-type>application/cdmi-object</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cdmiq</extension>
-        <mime-type>application/cdmi-queue</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cdx</extension>
-        <mime-type>chemical/x-cdx</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cdxml</extension>
-        <mime-type>application/vnd.chemdraw+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cdy</extension>
-        <mime-type>application/vnd.cinderella</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cer</extension>
-        <mime-type>application/pkix-cert</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cfs</extension>
-        <mime-type>application/x-cfs-compressed</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cgm</extension>
-        <mime-type>image/cgm</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>chat</extension>
-        <mime-type>application/x-chat</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>chm</extension>
-        <mime-type>application/vnd.ms-htmlhelp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>chrt</extension>
-        <mime-type>application/vnd.kde.kchart</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cif</extension>
-        <mime-type>chemical/x-cif</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cii</extension>
-        <mime-type>application/vnd.anser-web-certificate-issue-initiation</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cil</extension>
-        <mime-type>application/vnd.ms-artgalry</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cla</extension>
-        <mime-type>application/vnd.claymore</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>class</extension>
-        <mime-type>application/java</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>clkk</extension>
-        <mime-type>application/vnd.crick.clicker.keyboard</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>clkp</extension>
-        <mime-type>application/vnd.crick.clicker.palette</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>clkt</extension>
-        <mime-type>application/vnd.crick.clicker.template</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>clkw</extension>
-        <mime-type>application/vnd.crick.clicker.wordbank</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>clkx</extension>
-        <mime-type>application/vnd.crick.clicker</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>clp</extension>
-        <mime-type>application/x-msclip</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cmc</extension>
-        <mime-type>application/vnd.cosmocaller</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cmdf</extension>
-        <mime-type>chemical/x-cmdf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cml</extension>
-        <mime-type>chemical/x-cml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cmp</extension>
-        <mime-type>application/vnd.yellowriver-custom-menu</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cmx</extension>
-        <mime-type>image/x-cmx</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cod</extension>
-        <mime-type>application/vnd.rim.cod</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>com</extension>
-        <mime-type>application/x-msdownload</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>conf</extension>
-        <mime-type>text/plain</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cpio</extension>
-        <mime-type>application/x-cpio</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cpp</extension>
-        <mime-type>text/x-c</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cpt</extension>
-        <mime-type>application/mac-compactpro</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>crd</extension>
-        <mime-type>application/x-mscardfile</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>crl</extension>
-        <mime-type>application/pkix-crl</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>crt</extension>
-        <mime-type>application/x-x509-ca-cert</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cryptonote</extension>
-        <mime-type>application/vnd.rig.cryptonote</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>csh</extension>
-        <mime-type>application/x-csh</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>csml</extension>
-        <mime-type>chemical/x-csml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>csp</extension>
-        <mime-type>application/vnd.commonspace</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>css</extension>
-        <mime-type>text/css</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cst</extension>
-        <mime-type>application/x-director</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>csv</extension>
-        <mime-type>text/csv</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cu</extension>
-        <mime-type>application/cu-seeme</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>curl</extension>
-        <mime-type>text/vnd.curl</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cww</extension>
-        <mime-type>application/prs.cww</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cxt</extension>
-        <mime-type>application/x-director</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>cxx</extension>
-        <mime-type>text/x-c</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dae</extension>
-        <mime-type>model/vnd.collada+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>daf</extension>
-        <mime-type>application/vnd.mobius.daf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dart</extension>
-        <mime-type>application/vnd.dart</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dataless</extension>
-        <mime-type>application/vnd.fdsn.seed</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>davmount</extension>
-        <mime-type>application/davmount+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dbk</extension>
-        <mime-type>application/docbook+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dcr</extension>
-        <mime-type>application/x-director</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dcurl</extension>
-        <mime-type>text/vnd.curl.dcurl</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dd2</extension>
-        <mime-type>application/vnd.oma.dd2+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ddd</extension>
-        <mime-type>application/vnd.fujixerox.ddd</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>deb</extension>
-        <mime-type>application/x-debian-package</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>def</extension>
-        <mime-type>text/plain</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>deploy</extension>
-        <mime-type>application/octet-stream</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>der</extension>
-        <mime-type>application/x-x509-ca-cert</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dfac</extension>
-        <mime-type>application/vnd.dreamfactory</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dgc</extension>
-        <mime-type>application/x-dgc-compressed</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dib</extension>
-        <mime-type>image/bmp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dic</extension>
-        <mime-type>text/x-c</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dir</extension>
-        <mime-type>application/x-director</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dis</extension>
-        <mime-type>application/vnd.mobius.dis</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dist</extension>
-        <mime-type>application/octet-stream</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>distz</extension>
-        <mime-type>application/octet-stream</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>djv</extension>
-        <mime-type>image/vnd.djvu</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>djvu</extension>
-        <mime-type>image/vnd.djvu</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dll</extension>
-        <mime-type>application/x-msdownload</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dmg</extension>
-        <mime-type>application/x-apple-diskimage</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dmp</extension>
-        <mime-type>application/vnd.tcpdump.pcap</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dms</extension>
-        <mime-type>application/octet-stream</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dna</extension>
-        <mime-type>application/vnd.dna</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>doc</extension>
-        <mime-type>application/msword</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>docm</extension>
-        <mime-type>application/vnd.ms-word.document.macroenabled.12</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>docx</extension>
-        <mime-type>application/vnd.openxmlformats-officedocument.wordprocessingml.document</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dot</extension>
-        <mime-type>application/msword</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dotm</extension>
-        <mime-type>application/vnd.ms-word.template.macroenabled.12</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dotx</extension>
-        <mime-type>application/vnd.openxmlformats-officedocument.wordprocessingml.template</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dp</extension>
-        <mime-type>application/vnd.osgi.dp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dpg</extension>
-        <mime-type>application/vnd.dpgraph</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dra</extension>
-        <mime-type>audio/vnd.dra</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dsc</extension>
-        <mime-type>text/prs.lines.tag</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dssc</extension>
-        <mime-type>application/dssc+der</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dtb</extension>
-        <mime-type>application/x-dtbook+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dtd</extension>
-        <mime-type>application/xml-dtd</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dts</extension>
-        <mime-type>audio/vnd.dts</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dtshd</extension>
-        <mime-type>audio/vnd.dts.hd</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dump</extension>
-        <mime-type>application/octet-stream</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dv</extension>
-        <mime-type>video/x-dv</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dvb</extension>
-        <mime-type>video/vnd.dvb.file</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dvi</extension>
-        <mime-type>application/x-dvi</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dwf</extension>
-        <mime-type>model/vnd.dwf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dwg</extension>
-        <mime-type>image/vnd.dwg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dxf</extension>
-        <mime-type>image/vnd.dxf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dxp</extension>
-        <mime-type>application/vnd.spotfire.dxp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>dxr</extension>
-        <mime-type>application/x-director</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ecelp4800</extension>
-        <mime-type>audio/vnd.nuera.ecelp4800</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ecelp7470</extension>
-        <mime-type>audio/vnd.nuera.ecelp7470</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ecelp9600</extension>
-        <mime-type>audio/vnd.nuera.ecelp9600</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ecma</extension>
-        <mime-type>application/ecmascript</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>edm</extension>
-        <mime-type>application/vnd.novadigm.edm</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>edx</extension>
-        <mime-type>application/vnd.novadigm.edx</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>efif</extension>
-        <mime-type>application/vnd.picsel</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ei6</extension>
-        <mime-type>application/vnd.pg.osasli</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>elc</extension>
-        <mime-type>application/octet-stream</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>emf</extension>
-        <mime-type>application/x-msmetafile</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>eml</extension>
-        <mime-type>message/rfc822</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>emma</extension>
-        <mime-type>application/emma+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>emz</extension>
-        <mime-type>application/x-msmetafile</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>eol</extension>
-        <mime-type>audio/vnd.digital-winds</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>eot</extension>
-        <mime-type>application/vnd.ms-fontobject</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>eps</extension>
-        <mime-type>application/postscript</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>epub</extension>
-        <mime-type>application/epub+zip</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>es3</extension>
-        <mime-type>application/vnd.eszigno3+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>esa</extension>
-        <mime-type>application/vnd.osgi.subsystem</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>esf</extension>
-        <mime-type>application/vnd.epson.esf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>et3</extension>
-        <mime-type>application/vnd.eszigno3+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>etx</extension>
-        <mime-type>text/x-setext</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>eva</extension>
-        <mime-type>application/x-eva</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>evy</extension>
-        <mime-type>application/x-envoy</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>exe</extension>
-        <mime-type>application/octet-stream</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>exi</extension>
-        <mime-type>application/exi</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ext</extension>
-        <mime-type>application/vnd.novadigm.ext</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ez</extension>
-        <mime-type>application/andrew-inset</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ez2</extension>
-        <mime-type>application/vnd.ezpix-album</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ez3</extension>
-        <mime-type>application/vnd.ezpix-package</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>f</extension>
-        <mime-type>text/x-fortran</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>f4v</extension>
-        <mime-type>video/x-f4v</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>f77</extension>
-        <mime-type>text/x-fortran</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>f90</extension>
-        <mime-type>text/x-fortran</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>fbs</extension>
-        <mime-type>image/vnd.fastbidsheet</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>fcdt</extension>
-        <mime-type>application/vnd.adobe.formscentral.fcdt</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>fcs</extension>
-        <mime-type>application/vnd.isac.fcs</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>fdf</extension>
-        <mime-type>application/vnd.fdf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>fe_launch</extension>
-        <mime-type>application/vnd.denovo.fcselayout-link</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>fg5</extension>
-        <mime-type>application/vnd.fujitsu.oasysgp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>fgd</extension>
-        <mime-type>application/x-director</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>fh</extension>
-        <mime-type>image/x-freehand</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>fh4</extension>
-        <mime-type>image/x-freehand</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>fh5</extension>
-        <mime-type>image/x-freehand</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>fh7</extension>
-        <mime-type>image/x-freehand</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>fhc</extension>
-        <mime-type>image/x-freehand</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>fig</extension>
-        <mime-type>application/x-xfig</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>flac</extension>
-        <mime-type>audio/flac</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>fli</extension>
-        <mime-type>video/x-fli</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>flo</extension>
-        <mime-type>application/vnd.micrografx.flo</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>flv</extension>
-        <mime-type>video/x-flv</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>flw</extension>
-        <mime-type>application/vnd.kde.kivio</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>flx</extension>
-        <mime-type>text/vnd.fmi.flexstor</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>fly</extension>
-        <mime-type>text/vnd.fly</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>fm</extension>
-        <mime-type>application/vnd.framemaker</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>fnc</extension>
-        <mime-type>application/vnd.frogans.fnc</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>for</extension>
-        <mime-type>text/x-fortran</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>fpx</extension>
-        <mime-type>image/vnd.fpx</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>frame</extension>
-        <mime-type>application/vnd.framemaker</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>fsc</extension>
-        <mime-type>application/vnd.fsc.weblaunch</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>fst</extension>
-        <mime-type>image/vnd.fst</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ftc</extension>
-        <mime-type>application/vnd.fluxtime.clip</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>fti</extension>
-        <mime-type>application/vnd.anser-web-funds-transfer-initiation</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>fvt</extension>
-        <mime-type>video/vnd.fvt</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>fxp</extension>
-        <mime-type>application/vnd.adobe.fxp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>fxpl</extension>
-        <mime-type>application/vnd.adobe.fxp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>fzs</extension>
-        <mime-type>application/vnd.fuzzysheet</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>g2w</extension>
-        <mime-type>application/vnd.geoplan</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>g3</extension>
-        <mime-type>image/g3fax</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>g3w</extension>
-        <mime-type>application/vnd.geospace</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gac</extension>
-        <mime-type>application/vnd.groove-account</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gam</extension>
-        <mime-type>application/x-tads</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gbr</extension>
-        <mime-type>application/rpki-ghostbusters</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gca</extension>
-        <mime-type>application/x-gca-compressed</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gdl</extension>
-        <mime-type>model/vnd.gdl</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>geo</extension>
-        <mime-type>application/vnd.dynageo</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gex</extension>
-        <mime-type>application/vnd.geometry-explorer</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ggb</extension>
-        <mime-type>application/vnd.geogebra.file</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ggt</extension>
-        <mime-type>application/vnd.geogebra.tool</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ghf</extension>
-        <mime-type>application/vnd.groove-help</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gif</extension>
-        <mime-type>image/gif</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gim</extension>
-        <mime-type>application/vnd.groove-identity-message</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gml</extension>
-        <mime-type>application/gml+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gmx</extension>
-        <mime-type>application/vnd.gmx</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gnumeric</extension>
-        <mime-type>application/x-gnumeric</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gph</extension>
-        <mime-type>application/vnd.flographit</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gpx</extension>
-        <mime-type>application/gpx+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gqf</extension>
-        <mime-type>application/vnd.grafeq</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gqs</extension>
-        <mime-type>application/vnd.grafeq</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gram</extension>
-        <mime-type>application/srgs</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gramps</extension>
-        <mime-type>application/x-gramps-xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gre</extension>
-        <mime-type>application/vnd.geometry-explorer</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>grv</extension>
-        <mime-type>application/vnd.groove-injector</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>grxml</extension>
-        <mime-type>application/srgs+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gsf</extension>
-        <mime-type>application/x-font-ghostscript</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gtar</extension>
-        <mime-type>application/x-gtar</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gtm</extension>
-        <mime-type>application/vnd.groove-tool-message</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gtw</extension>
-        <mime-type>model/vnd.gtw</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gv</extension>
-        <mime-type>text/vnd.graphviz</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gxf</extension>
-        <mime-type>application/gxf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gxt</extension>
-        <mime-type>application/vnd.geonext</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>gz</extension>
-        <mime-type>application/x-gzip</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>h</extension>
-        <mime-type>text/x-c</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>h261</extension>
-        <mime-type>video/h261</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>h263</extension>
-        <mime-type>video/h263</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>h264</extension>
-        <mime-type>video/h264</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>hal</extension>
-        <mime-type>application/vnd.hal+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>hbci</extension>
-        <mime-type>application/vnd.hbci</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>hdf</extension>
-        <mime-type>application/x-hdf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>hh</extension>
-        <mime-type>text/x-c</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>hlp</extension>
-        <mime-type>application/winhlp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>hpgl</extension>
-        <mime-type>application/vnd.hp-hpgl</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>hpid</extension>
-        <mime-type>application/vnd.hp-hpid</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>hps</extension>
-        <mime-type>application/vnd.hp-hps</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>hqx</extension>
-        <mime-type>application/mac-binhex40</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>htc</extension>
-        <mime-type>text/x-component</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>htke</extension>
-        <mime-type>application/vnd.kenameaapp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>htm</extension>
-        <mime-type>text/html</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>html</extension>
-        <mime-type>text/html</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>hvd</extension>
-        <mime-type>application/vnd.yamaha.hv-dic</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>hvp</extension>
-        <mime-type>application/vnd.yamaha.hv-voice</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>hvs</extension>
-        <mime-type>application/vnd.yamaha.hv-script</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>i2g</extension>
-        <mime-type>application/vnd.intergeo</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>icc</extension>
-        <mime-type>application/vnd.iccprofile</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ice</extension>
-        <mime-type>x-conference/x-cooltalk</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>icm</extension>
-        <mime-type>application/vnd.iccprofile</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ico</extension>
-        <mime-type>image/x-icon</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ics</extension>
-        <mime-type>text/calendar</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ief</extension>
-        <mime-type>image/ief</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ifb</extension>
-        <mime-type>text/calendar</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ifm</extension>
-        <mime-type>application/vnd.shana.informed.formdata</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>iges</extension>
-        <mime-type>model/iges</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>igl</extension>
-        <mime-type>application/vnd.igloader</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>igm</extension>
-        <mime-type>application/vnd.insors.igm</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>igs</extension>
-        <mime-type>model/iges</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>igx</extension>
-        <mime-type>application/vnd.micrografx.igx</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>iif</extension>
-        <mime-type>application/vnd.shana.informed.interchange</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>imp</extension>
-        <mime-type>application/vnd.accpac.simply.imp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ims</extension>
-        <mime-type>application/vnd.ms-ims</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>in</extension>
-        <mime-type>text/plain</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ink</extension>
-        <mime-type>application/inkml+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>inkml</extension>
-        <mime-type>application/inkml+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>install</extension>
-        <mime-type>application/x-install-instructions</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>iota</extension>
-        <mime-type>application/vnd.astraea-software.iota</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ipfix</extension>
-        <mime-type>application/ipfix</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ipk</extension>
-        <mime-type>application/vnd.shana.informed.package</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>irm</extension>
-        <mime-type>application/vnd.ibm.rights-management</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>irp</extension>
-        <mime-type>application/vnd.irepository.package+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>iso</extension>
-        <mime-type>application/x-iso9660-image</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>itp</extension>
-        <mime-type>application/vnd.shana.informed.formtemplate</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ivp</extension>
-        <mime-type>application/vnd.immervision-ivp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ivu</extension>
-        <mime-type>application/vnd.immervision-ivu</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>jad</extension>
-        <mime-type>text/vnd.sun.j2me.app-descriptor</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>jam</extension>
-        <mime-type>application/vnd.jam</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>jar</extension>
-        <mime-type>application/java-archive</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>java</extension>
-        <mime-type>text/x-java-source</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>jisp</extension>
-        <mime-type>application/vnd.jisp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>jlt</extension>
-        <mime-type>application/vnd.hp-jlyt</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>jnlp</extension>
-        <mime-type>application/x-java-jnlp-file</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>joda</extension>
-        <mime-type>application/vnd.joost.joda-archive</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>jpe</extension>
-        <mime-type>image/jpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>jpeg</extension>
-        <mime-type>image/jpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>jpg</extension>
-        <mime-type>image/jpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>jpgm</extension>
-        <mime-type>video/jpm</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>jpgv</extension>
-        <mime-type>video/jpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>jpm</extension>
-        <mime-type>video/jpm</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>js</extension>
-        <mime-type>application/javascript</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>jsf</extension>
-        <mime-type>text/plain</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>json</extension>
-        <mime-type>application/json</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>jsonml</extension>
-        <mime-type>application/jsonml+json</mime-type>
-    </mime-mapping>
-<!--
-    <mime-mapping>
-        <extension>jspf</extension>
-        <mime-type>text/plain</mime-type>
-    </mime-mapping>
--->
-    <mime-mapping>
-        <extension>kar</extension>
-        <mime-type>audio/midi</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>karbon</extension>
-        <mime-type>application/vnd.kde.karbon</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>kfo</extension>
-        <mime-type>application/vnd.kde.kformula</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>kia</extension>
-        <mime-type>application/vnd.kidspiration</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>kml</extension>
-        <mime-type>application/vnd.google-earth.kml+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>kmz</extension>
-        <mime-type>application/vnd.google-earth.kmz</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>kne</extension>
-        <mime-type>application/vnd.kinar</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>knp</extension>
-        <mime-type>application/vnd.kinar</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>kon</extension>
-        <mime-type>application/vnd.kde.kontour</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>kpr</extension>
-        <mime-type>application/vnd.kde.kpresenter</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>kpt</extension>
-        <mime-type>application/vnd.kde.kpresenter</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>kpxx</extension>
-        <mime-type>application/vnd.ds-keypoint</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ksp</extension>
-        <mime-type>application/vnd.kde.kspread</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ktr</extension>
-        <mime-type>application/vnd.kahootz</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ktx</extension>
-        <mime-type>image/ktx</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ktz</extension>
-        <mime-type>application/vnd.kahootz</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>kwd</extension>
-        <mime-type>application/vnd.kde.kword</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>kwt</extension>
-        <mime-type>application/vnd.kde.kword</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>lasxml</extension>
-        <mime-type>application/vnd.las.las+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>latex</extension>
-        <mime-type>application/x-latex</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>lbd</extension>
-        <mime-type>application/vnd.llamagraphics.life-balance.desktop</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>lbe</extension>
-        <mime-type>application/vnd.llamagraphics.life-balance.exchange+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>les</extension>
-        <mime-type>application/vnd.hhe.lesson-player</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>lha</extension>
-        <mime-type>application/x-lzh-compressed</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>link66</extension>
-        <mime-type>application/vnd.route66.link66+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>list</extension>
-        <mime-type>text/plain</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>list3820</extension>
-        <mime-type>application/vnd.ibm.modcap</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>listafp</extension>
-        <mime-type>application/vnd.ibm.modcap</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>lnk</extension>
-        <mime-type>application/x-ms-shortcut</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>log</extension>
-        <mime-type>text/plain</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>lostxml</extension>
-        <mime-type>application/lost+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>lrf</extension>
-        <mime-type>application/octet-stream</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>lrm</extension>
-        <mime-type>application/vnd.ms-lrm</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ltf</extension>
-        <mime-type>application/vnd.frogans.ltf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>lvp</extension>
-        <mime-type>audio/vnd.lucent.voice</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>lwp</extension>
-        <mime-type>application/vnd.lotus-wordpro</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>lzh</extension>
-        <mime-type>application/x-lzh-compressed</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>m13</extension>
-        <mime-type>application/x-msmediaview</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>m14</extension>
-        <mime-type>application/x-msmediaview</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>m1v</extension>
-        <mime-type>video/mpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>m21</extension>
-        <mime-type>application/mp21</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>m2a</extension>
-        <mime-type>audio/mpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>m2v</extension>
-        <mime-type>video/mpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>m3a</extension>
-        <mime-type>audio/mpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>m3u</extension>
-        <mime-type>audio/x-mpegurl</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>m3u8</extension>
-        <mime-type>application/vnd.apple.mpegurl</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>m4a</extension>
-        <mime-type>audio/mp4</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>m4b</extension>
-        <mime-type>audio/mp4</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>m4r</extension>
-        <mime-type>audio/mp4</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>m4u</extension>
-        <mime-type>video/vnd.mpegurl</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>m4v</extension>
-        <mime-type>video/mp4</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ma</extension>
-        <mime-type>application/mathematica</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mac</extension>
-        <mime-type>image/x-macpaint</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mads</extension>
-        <mime-type>application/mads+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mag</extension>
-        <mime-type>application/vnd.ecowin.chart</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>maker</extension>
-        <mime-type>application/vnd.framemaker</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>man</extension>
-        <mime-type>text/troff</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mar</extension>
-        <mime-type>application/octet-stream</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mathml</extension>
-        <mime-type>application/mathml+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mb</extension>
-        <mime-type>application/mathematica</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mbk</extension>
-        <mime-type>application/vnd.mobius.mbk</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mbox</extension>
-        <mime-type>application/mbox</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mc1</extension>
-        <mime-type>application/vnd.medcalcdata</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mcd</extension>
-        <mime-type>application/vnd.mcd</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mcurl</extension>
-        <mime-type>text/vnd.curl.mcurl</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mdb</extension>
-        <mime-type>application/x-msaccess</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mdi</extension>
-        <mime-type>image/vnd.ms-modi</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>me</extension>
-        <mime-type>text/troff</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mesh</extension>
-        <mime-type>model/mesh</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>meta4</extension>
-        <mime-type>application/metalink4+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>metalink</extension>
-        <mime-type>application/metalink+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mets</extension>
-        <mime-type>application/mets+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mfm</extension>
-        <mime-type>application/vnd.mfmp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mft</extension>
-        <mime-type>application/rpki-manifest</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mgp</extension>
-        <mime-type>application/vnd.osgeo.mapguide.package</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mgz</extension>
-        <mime-type>application/vnd.proteus.magazine</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mid</extension>
-        <mime-type>audio/midi</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>midi</extension>
-        <mime-type>audio/midi</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mie</extension>
-        <mime-type>application/x-mie</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mif</extension>
-        <mime-type>application/x-mif</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mime</extension>
-        <mime-type>message/rfc822</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mj2</extension>
-        <mime-type>video/mj2</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mjp2</extension>
-        <mime-type>video/mj2</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mk3d</extension>
-        <mime-type>video/x-matroska</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mka</extension>
-        <mime-type>audio/x-matroska</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mks</extension>
-        <mime-type>video/x-matroska</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mkv</extension>
-        <mime-type>video/x-matroska</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mlp</extension>
-        <mime-type>application/vnd.dolby.mlp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mmd</extension>
-        <mime-type>application/vnd.chipnuts.karaoke-mmd</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mmf</extension>
-        <mime-type>application/vnd.smaf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mmr</extension>
-        <mime-type>image/vnd.fujixerox.edmics-mmr</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mng</extension>
-        <mime-type>video/x-mng</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mny</extension>
-        <mime-type>application/x-msmoney</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mobi</extension>
-        <mime-type>application/x-mobipocket-ebook</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mods</extension>
-        <mime-type>application/mods+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mov</extension>
-        <mime-type>video/quicktime</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>movie</extension>
-        <mime-type>video/x-sgi-movie</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mp1</extension>
-        <mime-type>audio/mpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mp2</extension>
-        <mime-type>audio/mpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mp21</extension>
-        <mime-type>application/mp21</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mp2a</extension>
-        <mime-type>audio/mpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mp3</extension>
-        <mime-type>audio/mpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mp4</extension>
-        <mime-type>video/mp4</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mp4a</extension>
-        <mime-type>audio/mp4</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mp4s</extension>
-        <mime-type>application/mp4</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mp4v</extension>
-        <mime-type>video/mp4</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mpa</extension>
-        <mime-type>audio/mpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mpc</extension>
-        <mime-type>application/vnd.mophun.certificate</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mpe</extension>
-        <mime-type>video/mpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mpeg</extension>
-        <mime-type>video/mpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mpega</extension>
-        <mime-type>audio/x-mpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mpg</extension>
-        <mime-type>video/mpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mpg4</extension>
-        <mime-type>video/mp4</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mpga</extension>
-        <mime-type>audio/mpeg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mpkg</extension>
-        <mime-type>application/vnd.apple.installer+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mpm</extension>
-        <mime-type>application/vnd.blueice.multipass</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mpn</extension>
-        <mime-type>application/vnd.mophun.application</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mpp</extension>
-        <mime-type>application/vnd.ms-project</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mpt</extension>
-        <mime-type>application/vnd.ms-project</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mpv2</extension>
-        <mime-type>video/mpeg2</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mpy</extension>
-        <mime-type>application/vnd.ibm.minipay</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mqy</extension>
-        <mime-type>application/vnd.mobius.mqy</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mrc</extension>
-        <mime-type>application/marc</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mrcx</extension>
-        <mime-type>application/marcxml+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ms</extension>
-        <mime-type>text/troff</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mscml</extension>
-        <mime-type>application/mediaservercontrol+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mseed</extension>
-        <mime-type>application/vnd.fdsn.mseed</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mseq</extension>
-        <mime-type>application/vnd.mseq</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>msf</extension>
-        <mime-type>application/vnd.epson.msf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>msh</extension>
-        <mime-type>model/mesh</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>msi</extension>
-        <mime-type>application/x-msdownload</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>msl</extension>
-        <mime-type>application/vnd.mobius.msl</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>msty</extension>
-        <mime-type>application/vnd.muvee.style</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mts</extension>
-        <mime-type>model/vnd.mts</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mus</extension>
-        <mime-type>application/vnd.musician</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>musicxml</extension>
-        <mime-type>application/vnd.recordare.musicxml+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mvb</extension>
-        <mime-type>application/x-msmediaview</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mwf</extension>
-        <mime-type>application/vnd.mfer</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mxf</extension>
-        <mime-type>application/mxf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mxl</extension>
-        <mime-type>application/vnd.recordare.musicxml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mxml</extension>
-        <mime-type>application/xv+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mxs</extension>
-        <mime-type>application/vnd.triscape.mxs</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>mxu</extension>
-        <mime-type>video/vnd.mpegurl</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>n-gage</extension>
-        <mime-type>application/vnd.nokia.n-gage.symbian.install</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>n3</extension>
-        <mime-type>text/n3</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>nb</extension>
-        <mime-type>application/mathematica</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>nbp</extension>
-        <mime-type>application/vnd.wolfram.player</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>nc</extension>
-        <mime-type>application/x-netcdf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ncx</extension>
-        <mime-type>application/x-dtbncx+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>nfo</extension>
-        <mime-type>text/x-nfo</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ngdat</extension>
-        <mime-type>application/vnd.nokia.n-gage.data</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>nitf</extension>
-        <mime-type>application/vnd.nitf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>nlu</extension>
-        <mime-type>application/vnd.neurolanguage.nlu</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>nml</extension>
-        <mime-type>application/vnd.enliven</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>nnd</extension>
-        <mime-type>application/vnd.noblenet-directory</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>nns</extension>
-        <mime-type>application/vnd.noblenet-sealer</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>nnw</extension>
-        <mime-type>application/vnd.noblenet-web</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>npx</extension>
-        <mime-type>image/vnd.net-fpx</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>nsc</extension>
-        <mime-type>application/x-conference</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>nsf</extension>
-        <mime-type>application/vnd.lotus-notes</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ntf</extension>
-        <mime-type>application/vnd.nitf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>nzb</extension>
-        <mime-type>application/x-nzb</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>oa2</extension>
-        <mime-type>application/vnd.fujitsu.oasys2</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>oa3</extension>
-        <mime-type>application/vnd.fujitsu.oasys3</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>oas</extension>
-        <mime-type>application/vnd.fujitsu.oasys</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>obd</extension>
-        <mime-type>application/x-msbinder</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>obj</extension>
-        <mime-type>application/x-tgif</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>oda</extension>
-        <mime-type>application/oda</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <!-- OpenDocument Database -->
-        <extension>odb</extension>
-        <mime-type>application/vnd.oasis.opendocument.database</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <!-- OpenDocument Chart -->
-        <extension>odc</extension>
-        <mime-type>application/vnd.oasis.opendocument.chart</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <!-- OpenDocument Formula -->
-        <extension>odf</extension>
-        <mime-type>application/vnd.oasis.opendocument.formula</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>odft</extension>
-        <mime-type>application/vnd.oasis.opendocument.formula-template</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <!-- OpenDocument Drawing -->
-        <extension>odg</extension>
-        <mime-type>application/vnd.oasis.opendocument.graphics</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <!-- OpenDocument Image -->
-        <extension>odi</extension>
-        <mime-type>application/vnd.oasis.opendocument.image</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <!-- OpenDocument Master Document -->
-        <extension>odm</extension>
-        <mime-type>application/vnd.oasis.opendocument.text-master</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <!-- OpenDocument Presentation -->
-        <extension>odp</extension>
-        <mime-type>application/vnd.oasis.opendocument.presentation</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <!-- OpenDocument Spreadsheet -->
-        <extension>ods</extension>
-        <mime-type>application/vnd.oasis.opendocument.spreadsheet</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <!-- OpenDocument Text -->
-        <extension>odt</extension>
-        <mime-type>application/vnd.oasis.opendocument.text</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>oga</extension>
-        <mime-type>audio/ogg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ogg</extension>
-        <mime-type>audio/ogg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ogv</extension>
-        <mime-type>video/ogg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <!-- xiph mime types -->
-        <extension>ogx</extension>
-        <mime-type>application/ogg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>omdoc</extension>
-        <mime-type>application/omdoc+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>onepkg</extension>
-        <mime-type>application/onenote</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>onetmp</extension>
-        <mime-type>application/onenote</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>onetoc</extension>
-        <mime-type>application/onenote</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>onetoc2</extension>
-        <mime-type>application/onenote</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>opf</extension>
-        <mime-type>application/oebps-package+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>opml</extension>
-        <mime-type>text/x-opml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>oprc</extension>
-        <mime-type>application/vnd.palm</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>org</extension>
-        <mime-type>application/vnd.lotus-organizer</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>osf</extension>
-        <mime-type>application/vnd.yamaha.openscoreformat</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>osfpvg</extension>
-        <mime-type>application/vnd.yamaha.openscoreformat.osfpvg+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>otc</extension>
-        <mime-type>application/vnd.oasis.opendocument.chart-template</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>otf</extension>
-        <mime-type>application/x-font-otf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <!-- OpenDocument Drawing Template -->
-        <extension>otg</extension>
-        <mime-type>application/vnd.oasis.opendocument.graphics-template</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <!-- HTML Document Template -->
-        <extension>oth</extension>
-        <mime-type>application/vnd.oasis.opendocument.text-web</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>oti</extension>
-        <mime-type>application/vnd.oasis.opendocument.image-template</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <!-- OpenDocument Presentation Template -->
-        <extension>otp</extension>
-        <mime-type>application/vnd.oasis.opendocument.presentation-template</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <!-- OpenDocument Spreadsheet Template -->
-        <extension>ots</extension>
-        <mime-type>application/vnd.oasis.opendocument.spreadsheet-template</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <!-- OpenDocument Text Template -->
-        <extension>ott</extension>
-        <mime-type>application/vnd.oasis.opendocument.text-template</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>oxps</extension>
-        <mime-type>application/oxps</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>oxt</extension>
-        <mime-type>application/vnd.openofficeorg.extension</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>p</extension>
-        <mime-type>text/x-pascal</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>p10</extension>
-        <mime-type>application/pkcs10</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>p12</extension>
-        <mime-type>application/x-pkcs12</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>p7b</extension>
-        <mime-type>application/x-pkcs7-certificates</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>p7c</extension>
-        <mime-type>application/pkcs7-mime</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>p7m</extension>
-        <mime-type>application/pkcs7-mime</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>p7r</extension>
-        <mime-type>application/x-pkcs7-certreqresp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>p7s</extension>
-        <mime-type>application/pkcs7-signature</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>p8</extension>
-        <mime-type>application/pkcs8</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pas</extension>
-        <mime-type>text/x-pascal</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>paw</extension>
-        <mime-type>application/vnd.pawaafile</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pbd</extension>
-        <mime-type>application/vnd.powerbuilder6</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pbm</extension>
-        <mime-type>image/x-portable-bitmap</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pcap</extension>
-        <mime-type>application/vnd.tcpdump.pcap</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pcf</extension>
-        <mime-type>application/x-font-pcf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pcl</extension>
-        <mime-type>application/vnd.hp-pcl</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pclxl</extension>
-        <mime-type>application/vnd.hp-pclxl</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pct</extension>
-        <mime-type>image/pict</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pcurl</extension>
-        <mime-type>application/vnd.curl.pcurl</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pcx</extension>
-        <mime-type>image/x-pcx</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pdb</extension>
-        <mime-type>application/vnd.palm</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pdf</extension>
-        <mime-type>application/pdf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pfa</extension>
-        <mime-type>application/x-font-type1</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pfb</extension>
-        <mime-type>application/x-font-type1</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pfm</extension>
-        <mime-type>application/x-font-type1</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pfr</extension>
-        <mime-type>application/font-tdpfr</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pfx</extension>
-        <mime-type>application/x-pkcs12</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pgm</extension>
-        <mime-type>image/x-portable-graymap</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pgn</extension>
-        <mime-type>application/x-chess-pgn</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pgp</extension>
-        <mime-type>application/pgp-encrypted</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pic</extension>
-        <mime-type>image/pict</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pict</extension>
-        <mime-type>image/pict</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pkg</extension>
-        <mime-type>application/octet-stream</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pki</extension>
-        <mime-type>application/pkixcmp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pkipath</extension>
-        <mime-type>application/pkix-pkipath</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>plb</extension>
-        <mime-type>application/vnd.3gpp.pic-bw-large</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>plc</extension>
-        <mime-type>application/vnd.mobius.plc</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>plf</extension>
-        <mime-type>application/vnd.pocketlearn</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pls</extension>
-        <mime-type>audio/x-scpls</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pml</extension>
-        <mime-type>application/vnd.ctc-posml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>png</extension>
-        <mime-type>image/png</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pnm</extension>
-        <mime-type>image/x-portable-anymap</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pnt</extension>
-        <mime-type>image/x-macpaint</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>portpkg</extension>
-        <mime-type>application/vnd.macports.portpkg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pot</extension>
-        <mime-type>application/vnd.ms-powerpoint</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>potm</extension>
-        <mime-type>application/vnd.ms-powerpoint.template.macroenabled.12</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>potx</extension>
-        <mime-type>application/vnd.openxmlformats-officedocument.presentationml.template</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ppam</extension>
-        <mime-type>application/vnd.ms-powerpoint.addin.macroenabled.12</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ppd</extension>
-        <mime-type>application/vnd.cups-ppd</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ppm</extension>
-        <mime-type>image/x-portable-pixmap</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pps</extension>
-        <mime-type>application/vnd.ms-powerpoint</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ppsm</extension>
-        <mime-type>application/vnd.ms-powerpoint.slideshow.macroenabled.12</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ppsx</extension>
-        <mime-type>application/vnd.openxmlformats-officedocument.presentationml.slideshow</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ppt</extension>
-        <mime-type>application/vnd.ms-powerpoint</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pptm</extension>
-        <mime-type>application/vnd.ms-powerpoint.presentation.macroenabled.12</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pptx</extension>
-        <mime-type>application/vnd.openxmlformats-officedocument.presentationml.presentation</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pqa</extension>
-        <mime-type>application/vnd.palm</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>prc</extension>
-        <mime-type>application/x-mobipocket-ebook</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pre</extension>
-        <mime-type>application/vnd.lotus-freelance</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>prf</extension>
-        <mime-type>application/pics-rules</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ps</extension>
-        <mime-type>application/postscript</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>psb</extension>
-        <mime-type>application/vnd.3gpp.pic-bw-small</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>psd</extension>
-        <mime-type>image/vnd.adobe.photoshop</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>psf</extension>
-        <mime-type>application/x-font-linux-psf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pskcxml</extension>
-        <mime-type>application/pskc+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ptid</extension>
-        <mime-type>application/vnd.pvi.ptid1</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pub</extension>
-        <mime-type>application/x-mspublisher</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pvb</extension>
-        <mime-type>application/vnd.3gpp.pic-bw-var</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pwn</extension>
-        <mime-type>application/vnd.3m.post-it-notes</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pya</extension>
-        <mime-type>audio/vnd.ms-playready.media.pya</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>pyv</extension>
-        <mime-type>video/vnd.ms-playready.media.pyv</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>qam</extension>
-        <mime-type>application/vnd.epson.quickanime</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>qbo</extension>
-        <mime-type>application/vnd.intu.qbo</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>qfx</extension>
-        <mime-type>application/vnd.intu.qfx</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>qps</extension>
-        <mime-type>application/vnd.publishare-delta-tree</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>qt</extension>
-        <mime-type>video/quicktime</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>qti</extension>
-        <mime-type>image/x-quicktime</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>qtif</extension>
-        <mime-type>image/x-quicktime</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>qwd</extension>
-        <mime-type>application/vnd.quark.quarkxpress</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>qwt</extension>
-        <mime-type>application/vnd.quark.quarkxpress</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>qxb</extension>
-        <mime-type>application/vnd.quark.quarkxpress</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>qxd</extension>
-        <mime-type>application/vnd.quark.quarkxpress</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>qxl</extension>
-        <mime-type>application/vnd.quark.quarkxpress</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>qxt</extension>
-        <mime-type>application/vnd.quark.quarkxpress</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ra</extension>
-        <mime-type>audio/x-pn-realaudio</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ram</extension>
-        <mime-type>audio/x-pn-realaudio</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rar</extension>
-        <mime-type>application/x-rar-compressed</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ras</extension>
-        <mime-type>image/x-cmu-raster</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rcprofile</extension>
-        <mime-type>application/vnd.ipunplugged.rcprofile</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rdf</extension>
-        <mime-type>application/rdf+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rdz</extension>
-        <mime-type>application/vnd.data-vision.rdz</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rep</extension>
-        <mime-type>application/vnd.businessobjects</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>res</extension>
-        <mime-type>application/x-dtbresource+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rgb</extension>
-        <mime-type>image/x-rgb</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rif</extension>
-        <mime-type>application/reginfo+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rip</extension>
-        <mime-type>audio/vnd.rip</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ris</extension>
-        <mime-type>application/x-research-info-systems</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rl</extension>
-        <mime-type>application/resource-lists+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rlc</extension>
-        <mime-type>image/vnd.fujixerox.edmics-rlc</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rld</extension>
-        <mime-type>application/resource-lists-diff+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rm</extension>
-        <mime-type>application/vnd.rn-realmedia</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rmi</extension>
-        <mime-type>audio/midi</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rmp</extension>
-        <mime-type>audio/x-pn-realaudio-plugin</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rms</extension>
-        <mime-type>application/vnd.jcp.javame.midlet-rms</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rmvb</extension>
-        <mime-type>application/vnd.rn-realmedia-vbr</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rnc</extension>
-        <mime-type>application/relax-ng-compact-syntax</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>roa</extension>
-        <mime-type>application/rpki-roa</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>roff</extension>
-        <mime-type>text/troff</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rp9</extension>
-        <mime-type>application/vnd.cloanto.rp9</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rpss</extension>
-        <mime-type>application/vnd.nokia.radio-presets</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rpst</extension>
-        <mime-type>application/vnd.nokia.radio-preset</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rq</extension>
-        <mime-type>application/sparql-query</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rs</extension>
-        <mime-type>application/rls-services+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rsd</extension>
-        <mime-type>application/rsd+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rss</extension>
-        <mime-type>application/rss+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rtf</extension>
-        <mime-type>application/rtf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>rtx</extension>
-        <mime-type>text/richtext</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>s</extension>
-        <mime-type>text/x-asm</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>s3m</extension>
-        <mime-type>audio/s3m</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>saf</extension>
-        <mime-type>application/vnd.yamaha.smaf-audio</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sbml</extension>
-        <mime-type>application/sbml+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sc</extension>
-        <mime-type>application/vnd.ibm.secure-container</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>scd</extension>
-        <mime-type>application/x-msschedule</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>scm</extension>
-        <mime-type>application/vnd.lotus-screencam</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>scq</extension>
-        <mime-type>application/scvp-cv-request</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>scs</extension>
-        <mime-type>application/scvp-cv-response</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>scurl</extension>
-        <mime-type>text/vnd.curl.scurl</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sda</extension>
-        <mime-type>application/vnd.stardivision.draw</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sdc</extension>
-        <mime-type>application/vnd.stardivision.calc</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sdd</extension>
-        <mime-type>application/vnd.stardivision.impress</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sdkd</extension>
-        <mime-type>application/vnd.solent.sdkm+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sdkm</extension>
-        <mime-type>application/vnd.solent.sdkm+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sdp</extension>
-        <mime-type>application/sdp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sdw</extension>
-        <mime-type>application/vnd.stardivision.writer</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>see</extension>
-        <mime-type>application/vnd.seemail</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>seed</extension>
-        <mime-type>application/vnd.fdsn.seed</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sema</extension>
-        <mime-type>application/vnd.sema</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>semd</extension>
-        <mime-type>application/vnd.semd</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>semf</extension>
-        <mime-type>application/vnd.semf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ser</extension>
-        <mime-type>application/java-serialized-object</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>setpay</extension>
-        <mime-type>application/set-payment-initiation</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>setreg</extension>
-        <mime-type>application/set-registration-initiation</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sfd-hdstx</extension>
-        <mime-type>application/vnd.hydrostatix.sof-data</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sfs</extension>
-        <mime-type>application/vnd.spotfire.sfs</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sfv</extension>
-        <mime-type>text/x-sfv</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sgi</extension>
-        <mime-type>image/sgi</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sgl</extension>
-        <mime-type>application/vnd.stardivision.writer-global</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sgm</extension>
-        <mime-type>text/sgml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sgml</extension>
-        <mime-type>text/sgml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sh</extension>
-        <mime-type>application/x-sh</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>shar</extension>
-        <mime-type>application/x-shar</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>shf</extension>
-        <mime-type>application/shf+xml</mime-type>
-    </mime-mapping>
-    <!--
-    <mime-mapping>
-        <extension>shtml</extension>
-        <mime-type>text/x-server-parsed-html</mime-type>
-    </mime-mapping>
-    -->
-    <mime-mapping>
-        <extension>sid</extension>
-        <mime-type>image/x-mrsid-image</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sig</extension>
-        <mime-type>application/pgp-signature</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sil</extension>
-        <mime-type>audio/silk</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>silo</extension>
-        <mime-type>model/mesh</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sis</extension>
-        <mime-type>application/vnd.symbian.install</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sisx</extension>
-        <mime-type>application/vnd.symbian.install</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sit</extension>
-        <mime-type>application/x-stuffit</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sitx</extension>
-        <mime-type>application/x-stuffitx</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>skd</extension>
-        <mime-type>application/vnd.koan</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>skm</extension>
-        <mime-type>application/vnd.koan</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>skp</extension>
-        <mime-type>application/vnd.koan</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>skt</extension>
-        <mime-type>application/vnd.koan</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sldm</extension>
-        <mime-type>application/vnd.ms-powerpoint.slide.macroenabled.12</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sldx</extension>
-        <mime-type>application/vnd.openxmlformats-officedocument.presentationml.slide</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>slt</extension>
-        <mime-type>application/vnd.epson.salt</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sm</extension>
-        <mime-type>application/vnd.stepmania.stepchart</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>smf</extension>
-        <mime-type>application/vnd.stardivision.math</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>smi</extension>
-        <mime-type>application/smil+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>smil</extension>
-        <mime-type>application/smil+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>smv</extension>
-        <mime-type>video/x-smv</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>smzip</extension>
-        <mime-type>application/vnd.stepmania.package</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>snd</extension>
-        <mime-type>audio/basic</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>snf</extension>
-        <mime-type>application/x-font-snf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>so</extension>
-        <mime-type>application/octet-stream</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>spc</extension>
-        <mime-type>application/x-pkcs7-certificates</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>spf</extension>
-        <mime-type>application/vnd.yamaha.smaf-phrase</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>spl</extension>
-        <mime-type>application/x-futuresplash</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>spot</extension>
-        <mime-type>text/vnd.in3d.spot</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>spp</extension>
-        <mime-type>application/scvp-vp-response</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>spq</extension>
-        <mime-type>application/scvp-vp-request</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>spx</extension>
-        <mime-type>audio/ogg</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sql</extension>
-        <mime-type>application/x-sql</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>src</extension>
-        <mime-type>application/x-wais-source</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>srt</extension>
-        <mime-type>application/x-subrip</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sru</extension>
-        <mime-type>application/sru+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>srx</extension>
-        <mime-type>application/sparql-results+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ssdl</extension>
-        <mime-type>application/ssdl+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sse</extension>
-        <mime-type>application/vnd.kodak-descriptor</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ssf</extension>
-        <mime-type>application/vnd.epson.ssf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ssml</extension>
-        <mime-type>application/ssml+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>st</extension>
-        <mime-type>application/vnd.sailingtracker.track</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>stc</extension>
-        <mime-type>application/vnd.sun.xml.calc.template</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>std</extension>
-        <mime-type>application/vnd.sun.xml.draw.template</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>stf</extension>
-        <mime-type>application/vnd.wt.stf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sti</extension>
-        <mime-type>application/vnd.sun.xml.impress.template</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>stk</extension>
-        <mime-type>application/hyperstudio</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>stl</extension>
-        <mime-type>application/vnd.ms-pki.stl</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>str</extension>
-        <mime-type>application/vnd.pg.format</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>stw</extension>
-        <mime-type>application/vnd.sun.xml.writer.template</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sub</extension>
-        <mime-type>text/vnd.dvb.subtitle</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sus</extension>
-        <mime-type>application/vnd.sus-calendar</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>susp</extension>
-        <mime-type>application/vnd.sus-calendar</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sv4cpio</extension>
-        <mime-type>application/x-sv4cpio</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sv4crc</extension>
-        <mime-type>application/x-sv4crc</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>svc</extension>
-        <mime-type>application/vnd.dvb.service</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>svd</extension>
-        <mime-type>application/vnd.svd</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>svg</extension>
-        <mime-type>image/svg+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>svgz</extension>
-        <mime-type>image/svg+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>swa</extension>
-        <mime-type>application/x-director</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>swf</extension>
-        <mime-type>application/x-shockwave-flash</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>swi</extension>
-        <mime-type>application/vnd.aristanetworks.swi</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sxc</extension>
-        <mime-type>application/vnd.sun.xml.calc</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sxd</extension>
-        <mime-type>application/vnd.sun.xml.draw</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sxg</extension>
-        <mime-type>application/vnd.sun.xml.writer.global</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sxi</extension>
-        <mime-type>application/vnd.sun.xml.impress</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sxm</extension>
-        <mime-type>application/vnd.sun.xml.math</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>sxw</extension>
-        <mime-type>application/vnd.sun.xml.writer</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>t</extension>
-        <mime-type>text/troff</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>t3</extension>
-        <mime-type>application/x-t3vm-image</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>taglet</extension>
-        <mime-type>application/vnd.mynfc</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>tao</extension>
-        <mime-type>application/vnd.tao.intent-module-archive</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>tar</extension>
-        <mime-type>application/x-tar</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>tcap</extension>
-        <mime-type>application/vnd.3gpp2.tcap</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>tcl</extension>
-        <mime-type>application/x-tcl</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>teacher</extension>
-        <mime-type>application/vnd.smart.teacher</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>tei</extension>
-        <mime-type>application/tei+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>teicorpus</extension>
-        <mime-type>application/tei+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>tex</extension>
-        <mime-type>application/x-tex</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>texi</extension>
-        <mime-type>application/x-texinfo</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>texinfo</extension>
-        <mime-type>application/x-texinfo</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>text</extension>
-        <mime-type>text/plain</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>tfi</extension>
-        <mime-type>application/thraud+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>tfm</extension>
-        <mime-type>application/x-tex-tfm</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>tga</extension>
-        <mime-type>image/x-tga</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>thmx</extension>
-        <mime-type>application/vnd.ms-officetheme</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>tif</extension>
-        <mime-type>image/tiff</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>tiff</extension>
-        <mime-type>image/tiff</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>tmo</extension>
-        <mime-type>application/vnd.tmobile-livetv</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>torrent</extension>
-        <mime-type>application/x-bittorrent</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>tpl</extension>
-        <mime-type>application/vnd.groove-tool-template</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>tpt</extension>
-        <mime-type>application/vnd.trid.tpt</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>tr</extension>
-        <mime-type>text/troff</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>tra</extension>
-        <mime-type>application/vnd.trueapp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>trm</extension>
-        <mime-type>application/x-msterminal</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>tsd</extension>
-        <mime-type>application/timestamped-data</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>tsv</extension>
-        <mime-type>text/tab-separated-values</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ttc</extension>
-        <mime-type>application/x-font-ttf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ttf</extension>
-        <mime-type>application/x-font-ttf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ttl</extension>
-        <mime-type>text/turtle</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>twd</extension>
-        <mime-type>application/vnd.simtech-mindmapper</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>twds</extension>
-        <mime-type>application/vnd.simtech-mindmapper</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>txd</extension>
-        <mime-type>application/vnd.genomatix.tuxedo</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>txf</extension>
-        <mime-type>application/vnd.mobius.txf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>txt</extension>
-        <mime-type>text/plain</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>u32</extension>
-        <mime-type>application/x-authorware-bin</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>udeb</extension>
-        <mime-type>application/x-debian-package</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ufd</extension>
-        <mime-type>application/vnd.ufdl</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ufdl</extension>
-        <mime-type>application/vnd.ufdl</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ulw</extension>
-        <mime-type>audio/basic</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ulx</extension>
-        <mime-type>application/x-glulx</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>umj</extension>
-        <mime-type>application/vnd.umajin</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>unityweb</extension>
-        <mime-type>application/vnd.unity</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uoml</extension>
-        <mime-type>application/vnd.uoml+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uri</extension>
-        <mime-type>text/uri-list</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uris</extension>
-        <mime-type>text/uri-list</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>urls</extension>
-        <mime-type>text/uri-list</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>ustar</extension>
-        <mime-type>application/x-ustar</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>utz</extension>
-        <mime-type>application/vnd.uiq.theme</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uu</extension>
-        <mime-type>text/x-uuencode</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uva</extension>
-        <mime-type>audio/vnd.dece.audio</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvd</extension>
-        <mime-type>application/vnd.dece.data</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvf</extension>
-        <mime-type>application/vnd.dece.data</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvg</extension>
-        <mime-type>image/vnd.dece.graphic</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvh</extension>
-        <mime-type>video/vnd.dece.hd</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvi</extension>
-        <mime-type>image/vnd.dece.graphic</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvm</extension>
-        <mime-type>video/vnd.dece.mobile</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvp</extension>
-        <mime-type>video/vnd.dece.pd</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvs</extension>
-        <mime-type>video/vnd.dece.sd</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvt</extension>
-        <mime-type>application/vnd.dece.ttml+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvu</extension>
-        <mime-type>video/vnd.uvvu.mp4</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvv</extension>
-        <mime-type>video/vnd.dece.video</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvva</extension>
-        <mime-type>audio/vnd.dece.audio</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvvd</extension>
-        <mime-type>application/vnd.dece.data</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvvf</extension>
-        <mime-type>application/vnd.dece.data</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvvg</extension>
-        <mime-type>image/vnd.dece.graphic</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvvh</extension>
-        <mime-type>video/vnd.dece.hd</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvvi</extension>
-        <mime-type>image/vnd.dece.graphic</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvvm</extension>
-        <mime-type>video/vnd.dece.mobile</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvvp</extension>
-        <mime-type>video/vnd.dece.pd</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvvs</extension>
-        <mime-type>video/vnd.dece.sd</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvvt</extension>
-        <mime-type>application/vnd.dece.ttml+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvvu</extension>
-        <mime-type>video/vnd.uvvu.mp4</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvvv</extension>
-        <mime-type>video/vnd.dece.video</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvvx</extension>
-        <mime-type>application/vnd.dece.unspecified</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvvz</extension>
-        <mime-type>application/vnd.dece.zip</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvx</extension>
-        <mime-type>application/vnd.dece.unspecified</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>uvz</extension>
-        <mime-type>application/vnd.dece.zip</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>vcard</extension>
-        <mime-type>text/vcard</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>vcd</extension>
-        <mime-type>application/x-cdlink</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>vcf</extension>
-        <mime-type>text/x-vcard</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>vcg</extension>
-        <mime-type>application/vnd.groove-vcard</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>vcs</extension>
-        <mime-type>text/x-vcalendar</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>vcx</extension>
-        <mime-type>application/vnd.vcx</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>vis</extension>
-        <mime-type>application/vnd.visionary</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>viv</extension>
-        <mime-type>video/vnd.vivo</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>vob</extension>
-        <mime-type>video/x-ms-vob</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>vor</extension>
-        <mime-type>application/vnd.stardivision.writer</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>vox</extension>
-        <mime-type>application/x-authorware-bin</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>vrml</extension>
-        <mime-type>model/vrml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>vsd</extension>
-        <mime-type>application/vnd.visio</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>vsf</extension>
-        <mime-type>application/vnd.vsf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>vss</extension>
-        <mime-type>application/vnd.visio</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>vst</extension>
-        <mime-type>application/vnd.visio</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>vsw</extension>
-        <mime-type>application/vnd.visio</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>vtu</extension>
-        <mime-type>model/vnd.vtu</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>vxml</extension>
-        <mime-type>application/voicexml+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>w3d</extension>
-        <mime-type>application/x-director</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wad</extension>
-        <mime-type>application/x-doom</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wav</extension>
-        <mime-type>audio/x-wav</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wax</extension>
-        <mime-type>audio/x-ms-wax</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <!-- Wireless Bitmap -->
-        <extension>wbmp</extension>
-        <mime-type>image/vnd.wap.wbmp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wbs</extension>
-        <mime-type>application/vnd.criticaltools.wbs+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wbxml</extension>
-        <mime-type>application/vnd.wap.wbxml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wcm</extension>
-        <mime-type>application/vnd.ms-works</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wdb</extension>
-        <mime-type>application/vnd.ms-works</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wdp</extension>
-        <mime-type>image/vnd.ms-photo</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>weba</extension>
-        <mime-type>audio/webm</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>webm</extension>
-        <mime-type>video/webm</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>webp</extension>
-        <mime-type>image/webp</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wg</extension>
-        <mime-type>application/vnd.pmi.widget</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wgt</extension>
-        <mime-type>application/widget</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wks</extension>
-        <mime-type>application/vnd.ms-works</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wm</extension>
-        <mime-type>video/x-ms-wm</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wma</extension>
-        <mime-type>audio/x-ms-wma</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wmd</extension>
-        <mime-type>application/x-ms-wmd</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wmf</extension>
-        <mime-type>application/x-msmetafile</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <!-- WML Source -->
-        <extension>wml</extension>
-        <mime-type>text/vnd.wap.wml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <!-- Compiled WML -->
-        <extension>wmlc</extension>
-        <mime-type>application/vnd.wap.wmlc</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <!-- WML Script Source -->
-        <extension>wmls</extension>
-        <mime-type>text/vnd.wap.wmlscript</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <!-- Compiled WML Script -->
-        <extension>wmlsc</extension>
-        <mime-type>application/vnd.wap.wmlscriptc</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wmv</extension>
-        <mime-type>video/x-ms-wmv</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wmx</extension>
-        <mime-type>video/x-ms-wmx</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wmz</extension>
-        <mime-type>application/x-msmetafile</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>woff</extension>
-        <mime-type>application/x-font-woff</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wpd</extension>
-        <mime-type>application/vnd.wordperfect</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wpl</extension>
-        <mime-type>application/vnd.ms-wpl</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wps</extension>
-        <mime-type>application/vnd.ms-works</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wqd</extension>
-        <mime-type>application/vnd.wqd</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wri</extension>
-        <mime-type>application/x-mswrite</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wrl</extension>
-        <mime-type>model/vrml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wsdl</extension>
-        <mime-type>application/wsdl+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wspolicy</extension>
-        <mime-type>application/wspolicy+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wtb</extension>
-        <mime-type>application/vnd.webturbo</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>wvx</extension>
-        <mime-type>video/x-ms-wvx</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>x32</extension>
-        <mime-type>application/x-authorware-bin</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>x3d</extension>
-        <mime-type>model/x3d+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>x3db</extension>
-        <mime-type>model/x3d+binary</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>x3dbz</extension>
-        <mime-type>model/x3d+binary</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>x3dv</extension>
-        <mime-type>model/x3d+vrml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>x3dvz</extension>
-        <mime-type>model/x3d+vrml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>x3dz</extension>
-        <mime-type>model/x3d+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xaml</extension>
-        <mime-type>application/xaml+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xap</extension>
-        <mime-type>application/x-silverlight-app</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xar</extension>
-        <mime-type>application/vnd.xara</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xbap</extension>
-        <mime-type>application/x-ms-xbap</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xbd</extension>
-        <mime-type>application/vnd.fujixerox.docuworks.binder</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xbm</extension>
-        <mime-type>image/x-xbitmap</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xdf</extension>
-        <mime-type>application/xcap-diff+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xdm</extension>
-        <mime-type>application/vnd.syncml.dm+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xdp</extension>
-        <mime-type>application/vnd.adobe.xdp+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xdssc</extension>
-        <mime-type>application/dssc+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xdw</extension>
-        <mime-type>application/vnd.fujixerox.docuworks</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xenc</extension>
-        <mime-type>application/xenc+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xer</extension>
-        <mime-type>application/patch-ops-error+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xfdf</extension>
-        <mime-type>application/vnd.adobe.xfdf</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xfdl</extension>
-        <mime-type>application/vnd.xfdl</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xht</extension>
-        <mime-type>application/xhtml+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xhtml</extension>
-        <mime-type>application/xhtml+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xhvml</extension>
-        <mime-type>application/xv+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xif</extension>
-        <mime-type>image/vnd.xiff</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xla</extension>
-        <mime-type>application/vnd.ms-excel</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xlam</extension>
-        <mime-type>application/vnd.ms-excel.addin.macroenabled.12</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xlc</extension>
-        <mime-type>application/vnd.ms-excel</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xlf</extension>
-        <mime-type>application/x-xliff+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xlm</extension>
-        <mime-type>application/vnd.ms-excel</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xls</extension>
-        <mime-type>application/vnd.ms-excel</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xlsb</extension>
-        <mime-type>application/vnd.ms-excel.sheet.binary.macroenabled.12</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xlsm</extension>
-        <mime-type>application/vnd.ms-excel.sheet.macroenabled.12</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xlsx</extension>
-        <mime-type>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xlt</extension>
-        <mime-type>application/vnd.ms-excel</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xltm</extension>
-        <mime-type>application/vnd.ms-excel.template.macroenabled.12</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xltx</extension>
-        <mime-type>application/vnd.openxmlformats-officedocument.spreadsheetml.template</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xlw</extension>
-        <mime-type>application/vnd.ms-excel</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xm</extension>
-        <mime-type>audio/xm</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xml</extension>
-        <mime-type>application/xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xo</extension>
-        <mime-type>application/vnd.olpc-sugar</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xop</extension>
-        <mime-type>application/xop+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xpi</extension>
-        <mime-type>application/x-xpinstall</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xpl</extension>
-        <mime-type>application/xproc+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xpm</extension>
-        <mime-type>image/x-xpixmap</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xpr</extension>
-        <mime-type>application/vnd.is-xpr</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xps</extension>
-        <mime-type>application/vnd.ms-xpsdocument</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xpw</extension>
-        <mime-type>application/vnd.intercon.formnet</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xpx</extension>
-        <mime-type>application/vnd.intercon.formnet</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xsl</extension>
-        <mime-type>application/xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xslt</extension>
-        <mime-type>application/xslt+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xsm</extension>
-        <mime-type>application/vnd.syncml+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xspf</extension>
-        <mime-type>application/xspf+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xul</extension>
-        <mime-type>application/vnd.mozilla.xul+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xvm</extension>
-        <mime-type>application/xv+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xvml</extension>
-        <mime-type>application/xv+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xwd</extension>
-        <mime-type>image/x-xwindowdump</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xyz</extension>
-        <mime-type>chemical/x-xyz</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>xz</extension>
-        <mime-type>application/x-xz</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>yang</extension>
-        <mime-type>application/yang</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>yin</extension>
-        <mime-type>application/yin+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>z</extension>
-        <mime-type>application/x-compress</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>Z</extension>
-        <mime-type>application/x-compress</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>z1</extension>
-        <mime-type>application/x-zmachine</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>z2</extension>
-        <mime-type>application/x-zmachine</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>z3</extension>
-        <mime-type>application/x-zmachine</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>z4</extension>
-        <mime-type>application/x-zmachine</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>z5</extension>
-        <mime-type>application/x-zmachine</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>z6</extension>
-        <mime-type>application/x-zmachine</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>z7</extension>
-        <mime-type>application/x-zmachine</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>z8</extension>
-        <mime-type>application/x-zmachine</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>zaz</extension>
-        <mime-type>application/vnd.zzazz.deck+xml</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>zip</extension>
-        <mime-type>application/zip</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>zir</extension>
-        <mime-type>application/vnd.zul</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>zirz</extension>
-        <mime-type>application/vnd.zul</mime-type>
-    </mime-mapping>
-    <mime-mapping>
-        <extension>zmm</extension>
-        <mime-type>application/vnd.handheld-entertainment+xml</mime-type>
-    </mime-mapping>
-
-  <!-- ==================== Default Welcome File List ===================== -->
-  <!-- When a request URI refers to a directory, the default servlet looks  -->
-  <!-- for a "welcome file" within that directory and, if present, to the   -->
-  <!-- corresponding resource URI for display.                              -->
-  <!-- If no welcome files are present, the default servlet either serves a -->
-  <!-- directory listing (see default servlet configuration on how to       -->
-  <!-- customize) or returns a 404 status, depending on the value of the    -->
-  <!-- listings setting.                                                    -->
-  <!--                                                                      -->
-  <!-- If you define welcome files in your own application's web.xml        -->
-  <!-- deployment descriptor, that list *replaces* the list configured      -->
-  <!-- here, so be sure to include any of the default values that you wish  -->
-  <!-- to use within your application.                                       -->
-
-    <welcome-file-list>
-        <welcome-file>index.html</welcome-file>
-        <welcome-file>index.htm</welcome-file>
-<!--        <welcome-file>index.jsp</welcome-file> -->
-    </welcome-file-list>
-
-</web-app>
diff --git a/distribution/standalone/src/site/site.xml b/distribution/standalone/src/site/site.xml
deleted file mode 100644
index 5cafb87..0000000
--- a/distribution/standalone/src/site/site.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0"?>
-
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<project name="Standalone">
-    <skin>
-        <groupId>org.jfrog.maven.skins</groupId>
-        <artifactId>jfrog-sf</artifactId>
-        <version>1.1.0</version>
-    </skin>
-    <body>
-        <breadcrumbs>
-            <item href="http://www.jfrog.org/sites/artifactory/1.3/artifactory-standalone"
-                  name="Artifactory Standalone"/>
-        </breadcrumbs>
-
-        <menu name="Overview">
-            <item name="Introduction" href="../introduction.html"/>
-            <item name="Configuration Help" href="../configuration.html"/>
-        </menu>
-        <menu name="Modules">
-            <item name="Artifactory Core" href="../artifactory-core/index.html"/>
-            <item name="Artifactory Webapp" href="../artifactory-webapp/index.html"/>
-            <item name="Artifactory Standalone" href="../artifactory-standalone/index.html"/>
-            <!--<item name="Artifactory Wagon" href="../artifactory-wagon/index.html"/>-->
-        </menu>
-        ${reports}
-    </body>
-</project>
diff --git a/distribution/standalone/src/test/etc/artifactory.config.xml b/distribution/standalone/src/test/etc/artifactory.config.xml
deleted file mode 100644
index 9c99c53..0000000
--- a/distribution/standalone/src/test/etc/artifactory.config.xml
+++ /dev/null
@@ -1,184 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2013 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns="http://artifactory.jfrog.org/xsd/1.5.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.5.0 http://www.jfrog.org/xsd/artifactory-v1_5_0.xsd">
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <enabled>false</enabled>
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <retentionPeriodHours>0</retentionPeriodHours>
-            <excludedRepositories>
-                <repositoryRef>remote-repo</repositoryRef>
-            </excludedRepositories>
-        </backup>
-    </backups>
-    <localRepositories>
-        <localRepository>
-            <key>libs-release-local</key>
-            <description>Local repository for in-house libraries</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshot-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-release-local</key>
-            <description>Local repository for plugins</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshot-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-release-local</key>
-            <description>Local repository for third party libraries</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshot-local</key>
-            <description>Local repository for third party snapshots</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>jcenter</key>
-            <description>Bintray Central Java repository</description>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://jcenter.bintray.com</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>remote-repo</key>
-            <repoLayoutRef>maven-2-default</repoLayoutRef>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo.jfrog.org/artifactory/remote-repos</url>
-        </remoteRepository>
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <virtualRepository>
-            <key>remote-repos</key>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>jcenter</repositoryRef>
-                <repositoryRef>remote-repo</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-release</key>
-            <repositories>
-                <repositoryRef>libs-release-local</repositoryRef>
-                <repositoryRef>ext-release-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-release</key>
-            <repositories>
-                <repositoryRef>plugins-release-local</repositoryRef>
-                <repositoryRef>ext-release-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshot</key>
-            <repositories>
-                <repositoryRef>libs-snapshot-local</repositoryRef>
-                <repositoryRef>ext-snapshot-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshot</key>
-            <repositories>
-                <repositoryRef>plugins-snapshot-local</repositoryRef>
-                <repositoryRef>ext-snapshot-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-    </virtualRepositories>
-
-    <repoLayouts>
-        <repoLayout>
-            <name>maven-2-default</name>
-            <artifactPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>SNAPSHOT</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>ivy-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>gradle-default</name>
-            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[module]/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
-        </repoLayout>
-        <repoLayout>
-            <name>maven-1-default</name>
-            <artifactPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
-            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
-            <descriptorPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev]).pom</descriptorPathPattern>
-            <folderIntegrationRevisionRegExp>.+</folderIntegrationRevisionRegExp>
-            <fileIntegrationRevisionRegExp>.+</fileIntegrationRevisionRegExp>
-        </repoLayout>
-    </repoLayouts>
-    <localReplications/>
-    <gcConfig>
-        <cronExp>0 0 /4 * * ?</cronExp>
-    </gcConfig>
-    <cleanupConfig>
-        <cronExp>0 12 5 * * ?</cronExp>
-    </cleanupConfig>
-</config>
diff --git a/distribution/standalone/src/test/etc/artifactory.system.properties b/distribution/standalone/src/test/etc/artifactory.system.properties
deleted file mode 100644
index c4af439..0000000
--- a/distribution/standalone/src/test/etc/artifactory.system.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-
-## Comma separated list of disabled addons
-artifactory.addons.disabled=aol
-
-## shorter refresh interval in dev mode
-artifactory.plugin.scripts.refreshIntervalSecs=5
-
-## Whether to print detailed debug information on lock timeouts
-artifactory.locks.debugTimeouts=true
-
-## Size for the derby page cache
-derby.storage.pageCacheSize=500
-
-## Disable the Derby JMX management service
-derby.module.mgmt.jmx=org.apache.derby.impl.services.jmxnone.NoManagementService
-
-## Log all errors/messages of any severity (will list deadlocks)
-derby.stream.error.logSeverityLevel=0
-
-## Log all executed statements along with their txid
-derby.language.logStatementText=false
diff --git a/distribution/standalone/src/test/etc/jetty.xml b/distribution/standalone/src/test/etc/jetty.xml
deleted file mode 100644
index b5e023a..0000000
--- a/distribution/standalone/src/test/etc/jetty.xml
+++ /dev/null
@@ -1,164 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
-
-<!-- =============================================================== -->
-<!-- Configure the Jetty Server                                      -->
-<!-- =============================================================== -->
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
-
-    <!-- =========================================================== -->
-    <!-- Server Thread Pool                                          -->
-    <!-- =========================================================== -->
-    <Set name="ThreadPool">
-        <!--<New class="org.mortbay.thread.QueuedThreadPool">
-            <Set name="minThreads">10</Set>
-            <Set name="maxThreads">100</Set>
-        </New>-->
-        <New class="org.eclipse.jetty.util.thread.ExecutorThreadPool"/>
-    </Set>
-
-    <!-- ==============po============================================= -->
-    <!-- Set connectors                                              -->
-    <!-- =========================================================== -->
-    <!-- One of each type!                                           -->
-    <!-- =========================================================== -->
-    <Call name="addConnector">
-        <Arg>
-            <New class="org.eclipse.jetty.server.nio.SelectChannelConnector">
-                <Set name="host">
-                    <SystemProperty name="jetty.host"/>
-                </Set>
-                <Set name="port">
-                    <SystemProperty name="jetty.port" default="8080"/>
-                </Set>
-                <Set name="forwarded">true</Set>
-                <Set name="maxIdleTime">30000</Set>
-                <Set name="Acceptors">1</Set>
-                <Set name="lowResourceMaxIdleTime">3000</Set>
-                <!--
-                On Windows uncomment the following line to improve performance.
-                See: http://docs.codehaus.org/display/JETTY/Slow+Win2003
-                -->
-                <!--<Set name="responseBufferSize">512</Set>-->
-            </New>
-        </Arg>
-    </Call>
-
-    <!-- AJP13 Connector configuration -->
-    <!--<Call name="addConnector">
-        <Arg>
-            <New class="org.eclipse.jetty.ajp.Ajp13SocketConnector">
-                <Set name="port">8010</Set>
-            </New>
-        </Arg>
-    </Call>-->
-
-    <!-- ======================================================= -->
-    <!-- Configure a Context                                     -->
-    <!-- ======================================================= -->
-    <New class="org.eclipse.jetty.webapp.WebAppContext" id="artifactory">
-        <Set name="defaultsDescriptor">../open/distribution/standalone/src/test/etc/webdefault.xml</Set>
-        <Call name="setContextPath">
-            <Arg>/artifactory</Arg>
-        </Call>
-        <Call name="setWar">
-            <!-- Careful not to reformat the following line - may break jetty -->
-            <Arg><SystemProperty name="jetty.home" default="."/>./open/web/war/src/main/webapp
-            </Arg>
-        </Call>
-        <Get name="SessionHandler">
-            <Set name="SessionManager">
-                <New class="org.eclipse.jetty.server.session.HashSessionManager">
-                    <Set name="sessionIdPathParameterName">none</Set>
-                </New>
-            </Set>
-        </Get>
-    </New>
-
-    <!-- =========================================================== -->
-    <!-- Set handler Collection Structure                            -->
-    <!-- =========================================================== -->
-    <Set name="handler">
-        <New id="handlers" class="org.eclipse.jetty.server.handler.HandlerCollection">
-            <Set name="handlers">
-                <Array type="org.eclipse.jetty.server.Handler">
-                    <Item>
-                        <New id="contexts"
-                             class="org.eclipse.jetty.server.handler.ContextHandlerCollection">
-                            <Call name="addHandler">
-                                <Arg>
-                                    <Ref id="artifactory">
-                                        <Set name="configurationClasses">
-                                            <!--
-                                            Use a custom list that omits org.eclipse.jetty.webapp.TagLibConfiguration
-                                            to save time on redundant TLD scanning.
-                                            -->
-                                            <Array type="java.lang.String">
-                                                <Item>org.eclipse.jetty.webapp.WebInfConfiguration</Item>
-                                                <Item>org.eclipse.jetty.webapp.WebXmlConfiguration</Item>
-                                                <Item>org.eclipse.jetty.webapp.MetaInfConfiguration</Item>
-                                                <Item>org.eclipse.jetty.webapp.FragmentConfiguration</Item>
-                                                <Item>org.eclipse.jetty.webapp.JettyWebXmlConfiguration</Item>
-                                            </Array>
-                                        </Set>
-                                    </Ref>
-                                </Arg>
-                            </Call>
-                        </New>
-                    </Item>
-                    <Item>
-                        <New id="defaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler"/>
-                    </Item>
-                    <Item>
-                        <New id="requestLog" class="org.eclipse.jetty.server.handler.RequestLogHandler"/>
-                    </Item>
-                </Array>
-            </Set>
-        </New>
-    </Set>
-
-    <!-- =========================================================== -->
-    <!-- Configure Request Log                                       -->
-    <!-- =========================================================== -->
-    <Ref id="requestLog">
-        <Set name="requestLog">
-            <New id="requestLogImpl" class="org.eclipse.jetty.server.NCSARequestLog">
-                <Arg>
-                    <SystemProperty name="jetty.home" default="."/>./devenv/.artifactory/logs/yyyy_mm_dd.request.log
-                </Arg>
-                <Set name="retainDays">90</Set>
-                <Set name="append">true</Set>
-                <Set name="extended">false</Set>
-                <Set name="LogTimeZone">GMT</Set>
-            </New>
-        </Set>
-    </Ref>
-
-    <!-- =========================================================== -->
-    <!-- extra options                                               -->
-    <!-- =========================================================== -->
-    <Set name="stopAtShutdown">true</Set>
-    <Set name="gracefulShutdown">1000</Set>
-    <!-- ensure/prevent Server: header being sent to browsers        -->
-    <Set name="sendServerVersion">true</Set>
-    <!--<Set name="sendDateHeader">true</Set>-->
-
-</Configure>
diff --git a/distribution/standalone/src/test/etc/logback.xml b/distribution/standalone/src/test/etc/logback.xml
deleted file mode 100644
index b73594e..0000000
--- a/distribution/standalone/src/test/etc/logback.xml
+++ /dev/null
@@ -1,153 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-<configuration debug="false">
-    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"/>
-    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
-            <layout class="org.artifactory.logging.layout.BackTracePatternLayout">
-                <pattern>%d [%thread] [%-5level] \(%-20c{3}:%L\) %message%n</pattern>
-            </layout>
-        </encoder>
-    </appender>
-    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/artifactory.log</File>
-        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
-            <layout class="org.artifactory.logging.layout.BackTracePatternLayout">
-                <pattern>%date [%thread] [%-5level] \(%-20c{3}:%L\) %message%n</pattern>
-            </layout>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/artifactory.%i.log.zip</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>5MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/access.log</File>
-        <encoder>
-            <pattern>%date [%-5level] \(%logger{32}:%line\) %message%n</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/access.%i.log.zip</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>5MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="IMPORT.EXPORT" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/import.export.log</File>
-        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
-            <layout class="org.artifactory.logging.layout.BackTracePatternLayout">
-                <pattern>%date [%-5level] \(%logger{32}:%line\) %message%n</pattern>
-            </layout>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/import.export.%i.log.zip</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>10MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <appender name="TRAFFIC" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/traffic</File>
-        <encoder>
-            <pattern>%message%n</pattern>
-        </encoder>
-        <rollingPolicy class="org.artifactory.traffic.policy.TrafficTimeBasedRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/traffic.%d{yyyyMMdd}</FileNamePattern>
-        </rollingPolicy>
-    </appender>
-    <appender name="REQUEST" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${artifactory.home}/logs/request.log</File>
-        <encoder>
-            <pattern>%message%n</pattern>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-            <FileNamePattern>${artifactory.home}/logs/request.%i.log</FileNamePattern>
-            <maxIndex>13</maxIndex>
-        </rollingPolicy>
-        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-            <MaxFileSize>10MB</MaxFileSize>
-        </triggeringPolicy>
-    </appender>
-    <root>
-        <level value="info"/>
-        <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="FILE"/>
-    </root>
-    <logger name="org.artifactory">
-        <level value="info"/>
-    </logger>
-    <logger name="org.artifactory.storage.db">
-        <level value="info"/>
-    </logger>
-    <logger name="org.artifactory.webapp.servlet.RepoFilter">
-        <level value="info"/>
-    </logger>
-    <logger name="org.artifactory.request.ArtifactoryResponseBase">
-        <level value="info"/>
-    </logger>
-    <logger name="org.artifactory.webapp.main.StartArtifactoryDev">
-        <level value="info"/>
-    </logger>
-    <logger name="org.artifactory.info.InfoWriter">
-        <level value="warn"/>
-    </logger>
-    <logger name="org.artifactory.security.AccessLogger" additivity="false">
-        <level value="debug"/>
-        <appender-ref ref="ACCESS"/>
-    </logger>
-    <logger name="org.artifactory.api.common.ImportExportStatusHolder" additivity="false">
-        <level value="debug"/>
-        <appender-ref ref="IMPORT.EXPORT"/>
-    </logger>
-    <logger name="org.artifactory.traffic.TrafficLogger" additivity="false">
-        <level value="debug"/>
-        <appender-ref ref="TRAFFIC"/>
-    </logger>
-    <logger name="org.artifactory.traffic.RequestLogger" additivity="false">
-        <level value="debug"/>
-        <appender-ref ref="REQUEST"/>
-    </logger>
-    <logger name="org.apache.http.impl.client">
-        <level value="info"/>
-    </logger>
-    <logger name="org.apache.http.wire">
-        <level value="info"/>
-    </logger>
-    <logger name="com.sun.jersey">
-        <level value="warn"/>
-    </logger>
-    <logger name="org.springframework">
-        <level value="warn"/>
-    </logger>
-    <logger name="org.quartz">
-        <level value="warn"/>
-    </logger>
-    <logger name="org.eclipse.jetty">
-        <level value="warn"/>
-    </logger>
-    <logger name="org.apache.cxf">
-        <level value="error"/>
-    </logger>
-</configuration>
diff --git a/distribution/standalone/src/test/etc/webdefault.xml b/distribution/standalone/src/test/etc/webdefault.xml
deleted file mode 100644
index f0f1259..0000000
--- a/distribution/standalone/src/test/etc/webdefault.xml
+++ /dev/null
@@ -1,517 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-  <!-- ===================================================================== -->
-  <!-- This file was modified to prevent file locking under windows          -->
-  <!-- (useFileMappedBuffer = false)                                         -->
-  <!-- ===================================================================== -->
-
-
-
-  <!-- ===================================================================== -->
-  <!-- This file contains the default descriptor for web applications.       -->
-  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-  <!-- The intent of this descriptor is to include jetty specific or common  -->
-  <!-- configuration for all webapps.   If a context has a webdefault.xml    -->
-  <!-- descriptor, it is applied before the contexts own web.xml file        -->
-  <!--                                                                       -->
-  <!-- A context may be assigned a default descriptor by:                    -->
-  <!--  + Calling WebApplicationContext.setDefaultsDescriptor                -->
-  <!--  + Passed an arg to addWebApplications                                -->
-  <!--                                                                       -->
-  <!-- This file is used both as the resource within the jetty.jar (which is -->
-  <!-- used as the default if no explicit defaults descriptor is set) and it -->
-  <!-- is copied to the etc directory of the Jetty distro and explicitly     -->
-  <!-- by the jetty.xml file.                                                -->
-  <!--                                                                       -->
-  <!-- ===================================================================== -->
-<web-app
-  xmlns="http://java.sun.com/xml/ns/javaee"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
-  metadata-complete="true"
-  version="2.5"
->
-
-  <description>
-    Default web.xml file.
-    This file is applied to a Web application before it's own WEB_INF/web.xml file
-  </description>
-
-
-  <!-- ==================================================================== -->
-  <!-- Context params to control Session Cookies                            -->
-  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
-  <!--
-    UNCOMMENT TO ACTIVATE <context-param> <param-name>org.eclipse.jetty.servlet.SessionDomain</param-name> <param-value>127.0.0.1</param-value> </context-param> <context-param>
-    <param-name>org.eclipse.jetty.servlet.SessionPath</param-name> <param-value>/</param-value> </context-param> <context-param> <param-name>org.eclipse.jetty.servlet.MaxAge</param-name>
-    <param-value>-1</param-value> </context-param>
-  -->
-
-
-  <!-- ==================================================================== -->
-  <!-- The default servlet.                                                 -->
-  <!-- This servlet, normally mapped to /, provides the handling for static -->
-  <!-- content, OPTIONS and TRACE methods for the context.                  -->
-  <!-- The following initParameters are supported:                          -->
-  <!--                                                                      -->
-  <!--   aliases          If true, aliases like symlinks are allowed. Note  -->
-  <!--                    that security constraints might be bypassed by    -->
-  <!--                    aliases static content.                           -->
-  <!--                                                                      -->
-  <!--   acceptRanges     If true, range requests and responses are         -->
-  <!--                    supported                                         -->
-  <!--                                                                      -->
-  <!--   dirAllowed       If true, directory listings are returned if no    -->
-  <!--                    welcome file is found. Else 403 Forbidden.        -->
-  <!--                                                                      -->
-  <!--   welcomeServlets  If true, attempt to dispatch to welcome files     -->
-  <!--                    that are servlets, if no matching static          -->
-  <!--                    resources can be found.                           -->
-  <!--                                                                      -->
-  <!--   redirectWelcome  If true, redirect welcome file requests           -->
-  <!--                    else use request dispatcher forwards              -->
-  <!--                                                                      -->
-  <!--   gzip             If set to true, then static content will be served-->
-  <!--                    as gzip content encoded if a matching resource is -->
-  <!--                    found ending with ".gz"                           -->
-  <!--                                                                      -->
-  <!--   resoureBase      Can be set to replace the context resource base   -->
-  <!--                                                                      -->
-  <!--   relativeResourceBase                                               -->
-  <!--                    Set with a pathname relative to the base of the   -->
-  <!--                    servlet context root. Useful for only serving     -->
-  <!--                    static content from only specific subdirectories. -->
-  <!--                                                                      -->
-  <!--   useFileMappedBuffer                                                -->
-  <!--                    If set to true (the default), a  memory mapped    -->
-  <!--                    file buffer will be used to serve static content  -->
-  <!--                    when using an NIO connector. Setting this value   -->
-  <!--                    to false means that a direct buffer will be used  -->
-  <!--                    instead. If you are having trouble with Windows   -->
-  <!--                    file locking, set this to false.                  -->
-  <!--                                                                      -->
-  <!--  cacheControl      If set, all static content will have this value   -->
-  <!--                    set as the cache-control header.                  -->
-  <!--                                                                      -->
-  <!--  maxCacheSize      Maximum size of the static resource cache         -->
-  <!--                                                                      -->
-  <!--  maxCachedFileSize Maximum size of any single file in the cache      -->
-  <!--                                                                      -->
-  <!--  maxCachedFiles    Maximum number of files in the cache              -->
-  <!--                                                                      -->
-  <!--  cacheType         "nio", "bio" or "both" to determine the type(s)   -->
-  <!--                    of resource cache. A bio cached buffer may be used-->
-  <!--                    by nio but is not as efficient as a nio buffer.   -->
-  <!--                    An nio cached buffer may not be used by bio.      -->
-  <!--                                                                      -->
-  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
-  <servlet>
-    <servlet-name>default</servlet-name>
-    <servlet-class>org.eclipse.jetty.servlet.DefaultServlet</servlet-class>
-    <init-param>
-      <param-name>aliases</param-name>
-      <param-value>false</param-value>
-    </init-param>
-    <init-param>
-      <param-name>acceptRanges</param-name>
-      <param-value>true</param-value>
-    </init-param>
-    <init-param>
-      <param-name>dirAllowed</param-name>
-      <param-value>true</param-value>
-    </init-param>
-    <init-param>
-      <param-name>welcomeServlets</param-name>
-      <param-value>false</param-value>
-    </init-param>
-    <init-param>
-      <param-name>redirectWelcome</param-name>
-      <param-value>false</param-value>
-    </init-param>
-    <init-param>
-      <param-name>maxCacheSize</param-name>
-      <param-value>256000000</param-value>
-    </init-param>
-    <init-param>
-      <param-name>maxCachedFileSize</param-name>
-      <param-value>10000000</param-value>
-    </init-param>
-    <init-param>
-      <param-name>maxCachedFiles</param-name>
-      <param-value>1000</param-value>
-    </init-param>
-    <init-param>
-      <param-name>cacheType</param-name>
-      <param-value>both</param-value>
-    </init-param>
-    <init-param>
-      <param-name>gzip</param-name>
-      <param-value>true</param-value>
-    </init-param>
-    <!-- prevent file locking under Windows -->
-    <init-param>
-      <param-name>useFileMappedBuffer</param-name>
-      <param-value>false</param-value>
-    </init-param>
-    <!--
-    <init-param>
-      <param-name>cacheControl</param-name>
-      <param-value>max-age=3600,public</param-value>
-    </init-param>
-    -->
-    <load-on-startup>0</load-on-startup>
-  </servlet>
-
-  <servlet-mapping>
-    <servlet-name>default</servlet-name>
-    <url-pattern>/</url-pattern>
-  </servlet-mapping>
-
-
-  <!-- ==================================================================== -->
-  <!-- JSP Servlet                                                          -->
-  <!-- This is the jasper JSP servlet from the jakarta project              -->
-  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
-  <!-- The JSP page compiler and execution servlet, which is the mechanism  -->
-  <!-- used by Glassfish to support JSP pages.  Traditionally, this servlet -->
-  <!-- is mapped to URL patterh "*.jsp".  This servlet supports the         -->
-  <!-- following initialization parameters (default values are in square    -->
-  <!-- brackets):                                                           -->
-  <!--                                                                      -->
-  <!--   checkInterval       If development is false and reloading is true, -->
-  <!--                       background compiles are enabled. checkInterval -->
-  <!--                       is the time in seconds between checks to see   -->
-  <!--                       if a JSP page needs to be recompiled. [300]    -->
-  <!--                                                                      -->
-  <!--   compiler            Which compiler Ant should use to compile JSP   -->
-  <!--                       pages.  See the Ant documenation for more      -->
-  <!--                       information. [javac]                           -->
-  <!--                                                                      -->
-  <!--   classdebuginfo      Should the class file be compiled with         -->
-  <!--                       debugging information?  [true]                 -->
-  <!--                                                                      -->
-  <!--   classpath           What class path should I use while compiling   -->
-  <!--                       generated servlets?  [Created dynamically      -->
-  <!--                       based on the current web application]          -->
-  <!--                       Set to ? to make the container explicitly set  -->
-  <!--                       this parameter.                                -->
-  <!--                                                                      -->
-  <!--   development         Is Jasper used in development mode (will check -->
-  <!--                       for JSP modification on every access)?  [true] -->
-  <!--                                                                      -->
-  <!--   enablePooling       Determines whether tag handler pooling is      -->
-  <!--                       enabled  [true]                                -->
-  <!--                                                                      -->
-  <!--   fork                Tell Ant to fork compiles of JSP pages so that -->
-  <!--                       a separate JVM is used for JSP page compiles   -->
-  <!--                       from the one Tomcat is running in. [true]      -->
-  <!--                                                                      -->
-  <!--   ieClassId           The class-id value to be sent to Internet      -->
-  <!--                       Explorer when using <jsp:plugin> tags.         -->
-  <!--                       [clsid:8AD9C840-044E-11D1-B3E9-00805F499D93]   -->
-  <!--                                                                      -->
-  <!--   javaEncoding        Java file encoding to use for generating java  -->
-  <!--                       source files. [UTF-8]                          -->
-  <!--                                                                      -->
-  <!--   keepgenerated       Should we keep the generated Java source code  -->
-  <!--                       for each page instead of deleting it? [true]   -->
-  <!--                                                                      -->
-  <!--   logVerbosityLevel   The level of detailed messages to be produced  -->
-  <!--                       by this servlet.  Increasing levels cause the  -->
-  <!--                       generation of more messages.  Valid values are -->
-  <!--                       FATAL, ERROR, WARNING, INFORMATION, and DEBUG. -->
-  <!--                       [WARNING]                                      -->
-  <!--                                                                      -->
-  <!--   mappedfile          Should we generate static content with one     -->
-  <!--                       print statement per input line, to ease        -->
-  <!--                       debugging?  [false]                            -->
-  <!--                                                                      -->
-  <!--                                                                      -->
-  <!--   reloading           Should Jasper check for modified JSPs?  [true] -->
-  <!--                                                                      -->
-  <!--   suppressSmap        Should the generation of SMAP info for JSR45   -->
-  <!--                       debugging be suppressed?  [false]              -->
-  <!--                                                                      -->
-  <!--   dumpSmap            Should the SMAP info for JSR45 debugging be    -->
-  <!--                       dumped to a file? [false]                      -->
-  <!--                       False if suppressSmap is true                  -->
-  <!--                                                                      -->
-  <!--   scratchdir          What scratch directory should we use when      -->
-  <!--                       compiling JSP pages?  [default work directory  -->
-  <!--                       for the current web application]               -->
-  <!--                                                                      -->
-  <!--   tagpoolMaxSize      The maximum tag handler pool size  [5]         -->
-  <!--                                                                      -->
-  <!--   xpoweredBy          Determines whether X-Powered-By response       -->
-  <!--                       header is added by generated servlet  [false]  -->
-  <!--                                                                      -->
-  <!-- If you wish to use Jikes to compile JSP pages:                       -->
-  <!--   Set the init parameter "compiler" to "jikes".  Define              -->
-  <!--   the property "-Dbuild.compiler.emacs=true" when starting Jetty     -->
-  <!--   to cause Jikes to emit error messages in a format compatible with  -->
-  <!--   Jasper.                                                            -->
-  <!--   If you get an error reporting that jikes can't use UTF-8 encoding, -->
-  <!--   try setting the init parameter "javaEncoding" to "ISO-8859-1".     -->
-  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
-  <servlet
-    id="jsp"
-  >
-    <servlet-name>jsp</servlet-name>
-    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
-    <init-param>
-      <param-name>logVerbosityLevel</param-name>
-      <param-value>DEBUG</param-value>
-    </init-param>
-    <init-param>
-      <param-name>fork</param-name>
-      <param-value>false</param-value>
-    </init-param>
-    <init-param>
-      <param-name>xpoweredBy</param-name>
-      <param-value>false</param-value>
-    </init-param>
-    <!--
-    <init-param>
-        <param-name>classpath</param-name>
-        <param-value>?</param-value>
-    </init-param>
-    -->
-    <load-on-startup>0</load-on-startup>
-  </servlet>
-
-  <servlet-mapping>
-    <servlet-name>jsp</servlet-name>
-    <url-pattern>*.jsp</url-pattern>
-    <url-pattern>*.jspf</url-pattern>
-    <url-pattern>*.jspx</url-pattern>
-    <url-pattern>*.xsp</url-pattern>
-    <url-pattern>*.JSP</url-pattern>
-    <url-pattern>*.JSPF</url-pattern>
-    <url-pattern>*.JSPX</url-pattern>
-    <url-pattern>*.XSP</url-pattern>
-  </servlet-mapping>
-
-  <!-- ==================================================================== -->
-  <!-- Dynamic Servlet Invoker.                                             -->
-  <!-- This servlet invokes anonymous servlets that have not been defined   -->
-  <!-- in the web.xml or by other means. The first element of the pathInfo  -->
-  <!-- of a request passed to the envoker is treated as a servlet name for  -->
-  <!-- an existing servlet, or as a class name of a new servlet.            -->
-  <!-- This servlet is normally mapped to /servlet/*                        -->
-  <!-- This servlet support the following initParams:                       -->
-  <!--                                                                      -->
-  <!--  nonContextServlets       If false, the invoker can only load        -->
-  <!--                           servlets from the contexts classloader.    -->
-  <!--                           This is false by default and setting this  -->
-  <!--                           to true may have security implications.    -->
-  <!--                                                                      -->
-  <!--  verbose                  If true, log dynamic loads                 -->
-  <!--                                                                      -->
-  <!--  *                        All other parameters are copied to the     -->
-  <!--                           each dynamic servlet as init parameters    -->
-  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
-  <!--
-    Uncomment for dynamic invocation <servlet> <servlet-name>invoker</servlet-name> <servlet-class>org.eclipse.jetty.servlet.Invoker</servlet-class> <init-param> <param-name>verbose</param-name>
-    <param-value>false</param-value> </init-param> <init-param> <param-name>nonContextServlets</param-name> <param-value>false</param-value> </init-param> <init-param>
-    <param-name>dynamicParam</param-name> <param-value>anyValue</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>invoker</servlet-name>
-    <url-pattern>/servlet/*</url-pattern> </servlet-mapping>
-  -->
-
-
-
-  <!-- ==================================================================== -->
-  <session-config>
-    <session-timeout>30</session-timeout>
-  </session-config>
-
-  <!-- ==================================================================== -->
-  <!-- Default MIME mappings                                                -->
-  <!-- The default MIME mappings are provided by the mime.properties        -->
-  <!-- resource in the org.eclipse.jetty.server.jar file.  Additional or modified  -->
-  <!-- mappings may be specified here                                       -->
-  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
-  <!-- UNCOMMENT TO ACTIVATE
-  <mime-mapping>
-    <extension>mysuffix</extension>
-    <mime-type>mymime/type</mime-type>
-  </mime-mapping>
-  -->
-
-  <!-- ==================================================================== -->
-  <welcome-file-list>
-    <welcome-file>index.html</welcome-file>
-    <welcome-file>index.htm</welcome-file>
-    <welcome-file>index.jsp</welcome-file>
-  </welcome-file-list>
-
-  <!-- ==================================================================== -->
-  <locale-encoding-mapping-list>
-    <locale-encoding-mapping>
-      <locale>ar</locale>
-      <encoding>ISO-8859-6</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>be</locale>
-      <encoding>ISO-8859-5</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>bg</locale>
-      <encoding>ISO-8859-5</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>ca</locale>
-      <encoding>ISO-8859-1</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>cs</locale>
-      <encoding>ISO-8859-2</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>da</locale>
-      <encoding>ISO-8859-1</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>de</locale>
-      <encoding>ISO-8859-1</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>el</locale>
-      <encoding>ISO-8859-7</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>en</locale>
-      <encoding>ISO-8859-1</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>es</locale>
-      <encoding>ISO-8859-1</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>et</locale>
-      <encoding>ISO-8859-1</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>fi</locale>
-      <encoding>ISO-8859-1</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>fr</locale>
-      <encoding>ISO-8859-1</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>hr</locale>
-      <encoding>ISO-8859-2</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>hu</locale>
-      <encoding>ISO-8859-2</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>is</locale>
-      <encoding>ISO-8859-1</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>it</locale>
-      <encoding>ISO-8859-1</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>iw</locale>
-      <encoding>ISO-8859-8</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>ja</locale>
-      <encoding>Shift_JIS</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>ko</locale>
-      <encoding>EUC-KR</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>lt</locale>
-      <encoding>ISO-8859-2</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>lv</locale>
-      <encoding>ISO-8859-2</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>mk</locale>
-      <encoding>ISO-8859-5</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>nl</locale>
-      <encoding>ISO-8859-1</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>no</locale>
-      <encoding>ISO-8859-1</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>pl</locale>
-      <encoding>ISO-8859-2</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>pt</locale>
-      <encoding>ISO-8859-1</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>ro</locale>
-      <encoding>ISO-8859-2</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>ru</locale>
-      <encoding>ISO-8859-5</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>sh</locale>
-      <encoding>ISO-8859-5</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>sk</locale>
-      <encoding>ISO-8859-2</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>sl</locale>
-      <encoding>ISO-8859-2</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>sq</locale>
-      <encoding>ISO-8859-2</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>sr</locale>
-      <encoding>ISO-8859-5</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>sv</locale>
-      <encoding>ISO-8859-1</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>tr</locale>
-      <encoding>ISO-8859-9</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>uk</locale>
-      <encoding>ISO-8859-5</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>zh</locale>
-      <encoding>GB2312</encoding>
-    </locale-encoding-mapping>
-    <locale-encoding-mapping>
-      <locale>zh_TW</locale>
-      <encoding>Big5</encoding>
-    </locale-encoding-mapping>
-  </locale-encoding-mapping-list>
-
-  <security-constraint>
-    <web-resource-collection>
-      <web-resource-name>Disable TRACE</web-resource-name>
-      <url-pattern>/</url-pattern>
-      <http-method>TRACE</http-method>
-    </web-resource-collection>
-    <auth-constraint/>
-  </security-constraint>
-
-</web-app>
-
diff --git a/distribution/standalone/src/test/ha-etc/cluster.properties b/distribution/standalone/src/test/ha-etc/cluster.properties
deleted file mode 100644
index ab9de73..0000000
--- a/distribution/standalone/src/test/ha-etc/cluster.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-# URLs that enable direct communication with nodes (behind the load balancer): server.[serverId].contextUrl
-security.token=76b07383dcda344979681e01efa5ac50
\ No newline at end of file
diff --git a/distribution/standalone/src/test/ha-etc/storage.properties b/distribution/standalone/src/test/ha-etc/storage.properties
deleted file mode 100644
index 66d6500..0000000
--- a/distribution/standalone/src/test/ha-etc/storage.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-type=derby
-url=jdbc:derby:{db.home};create=true
-driver=org.apache.derby.jdbc.EmbeddedDriver
\ No newline at end of file
diff --git a/distribution/standalone/src/test/java/org/artifactory/webapp/main/StartArtifactoryDev.java b/distribution/standalone/src/test/java/org/artifactory/webapp/main/StartArtifactoryDev.java
deleted file mode 100644
index 1efcb09..0000000
--- a/distribution/standalone/src/test/java/org/artifactory/webapp/main/StartArtifactoryDev.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.webapp.main;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.filefilter.AbstractFileFilter;
-import org.apache.commons.io.filefilter.FileFilterUtils;
-import org.apache.commons.io.filefilter.IOFileFilter;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.util.PathUtils;
-import org.artifactory.util.ResourceUtils;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.webapp.WebAppContext;
-import org.eclipse.jetty.xml.XmlConfiguration;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-
-/**
- * @author yoavl
- */
-public class StartArtifactoryDev {
-
-    public static final String DEFAULT_PREFIX = "..";
-
-    /**
-     * Main function, starts the jetty server.
-     */
-    public static void main(String... args) throws IOException {
-        System.setProperty("java.net.preferIPv4Stack", "true");
-
-        String prefix = args.length == 0 ? DEFAULT_PREFIX : args[0];
-
-        String homeProperty = System.getProperty("artifactory.home");
-        File devArtHome = new File(
-                homeProperty != null ? homeProperty : prefix + "/devenv/.artifactory").getCanonicalFile();
-        if (!devArtHome.exists() && !devArtHome.mkdirs()) {
-            throw new RuntimeException("Failed to create home dir: " + devArtHome.getAbsolutePath());
-        }
-        System.setProperty(ArtifactoryHome.SYS_PROP, devArtHome.getAbsolutePath());
-
-        File standaloneSrcDir = new File(prefix + "/open/distribution/standalone/src").getCanonicalFile();
-        File devEtcDir = new File(standaloneSrcDir, "test/etc");
-
-        copyNewerDevResources(devEtcDir, devArtHome);
-
-        // set the logback.xml
-        System.setProperty("logback.configurationFile", new File(devArtHome + "/etc/logback.xml").getAbsolutePath());
-
-        //Manually set the selector (needed explicitly here before any logger kicks in)
-        // create the logger only after artifactory.home is set
-        Server server = null;
-        try {
-            File etcDir = new File(devArtHome, "etc");
-            URL configUrl = new URL("file:" + etcDir + "/jetty.xml");
-            XmlConfiguration xmlConfiguration = new XmlConfiguration(configUrl);
-            WebAppContext appContext = new WebAppContext();
-            appContext.setServer(server);
-            appContext.getSessionHandler().getSessionManager().setSessionIdPathParameterName("none");
-            server = new Server();
-            xmlConfiguration.configure(server);
-            server.start();
-        } catch (Exception e) {
-            System.err.println("Could not start the Jetty server: " + e);
-            if (server != null) {
-                try {
-                    server.stop();
-                } catch (Exception e1) {
-                    System.err.println("Unable to stop the jetty server: " + e1);
-                }
-            }
-        }
-    }
-
-    /**
-     * Copy newer files from the standalone dir to the working artifactory home dir
-     */
-    private static void copyNewerDevResources(File devEtcDir, File artHome) throws IOException {
-        File homeEtcDir = new File(artHome, "etc");
-        IOFileFilter fileFilter = new NewerFileFilter(devEtcDir, homeEtcDir);
-        fileFilter = FileFilterUtils.makeSVNAware(fileFilter);
-        FileUtils.copyDirectory(devEtcDir, homeEtcDir, fileFilter, true);
-        updateDefaultMimetypes(homeEtcDir);
-        deleteHaProps(homeEtcDir);
-        /**
-         * If the bootstrap already exists, it means it's not the first startup, so don't keep the original config file
-         * or the etc folder will flood with bootstrap files
-         */
-        if (new File(homeEtcDir, ArtifactoryHome.ARTIFACTORY_CONFIG_BOOTSTRAP_FILE).exists()) {
-            new File(homeEtcDir, ArtifactoryHome.ARTIFACTORY_CONFIG_FILE).delete();
-        }
-    }
-
-    static void deleteHaProps(File homeEtcDir) throws IOException {
-        if (!Boolean.parseBoolean(System.getProperty(ConstantValues.devHa.getPropertyName()))) {
-            File haProps = new File(homeEtcDir, "artifactory.ha.properties");
-            if (haProps.exists()) {
-                FileUtils.forceDelete(haProps);
-            }
-        }
-    }
-
-    private static void updateDefaultMimetypes(File devEtcDir) {
-        File defaultMimeTypes = ResourceUtils.getResourceAsFile("/META-INF/default/mimetypes.xml");
-        File devMimeTypes = new File(devEtcDir, "mimetypes.xml");
-        if (!devMimeTypes.exists() || defaultMimeTypes.lastModified() > devMimeTypes.lastModified()) {
-            // override developer mimetypes file with newer default mimetypes file
-            try {
-                FileUtils.copyFile(defaultMimeTypes, devMimeTypes);
-            } catch (IOException e) {
-                System.err.println("Failed to copy default mime types file: " + e.getMessage());
-            }
-        }
-    }
-
-    private static class NewerFileFilter extends AbstractFileFilter {
-        private final File srcDir;
-        private final File destDir;
-
-        public NewerFileFilter(File srcDir, File destDir) {
-            this.srcDir = srcDir;
-            this.destDir = destDir;
-        }
-
-        @Override
-        public boolean accept(File srcFile) {
-            if (srcFile.isDirectory()) {
-                return true;    // don't exclude directories
-            }
-            String relativePath = PathUtils.getRelativePath(srcDir.getAbsolutePath(), srcFile.getAbsolutePath());
-            File destFile = new File(destDir, relativePath);
-            if (!destFile.exists() || srcFile.lastModified() > destFile.lastModified()) {
-                return true;
-            }
-            return false;
-        }
-    }
-}
diff --git a/distribution/standalone/src/test/java/org/artifactory/webapp/main/StartArtifactoryTomcatDev.java b/distribution/standalone/src/test/java/org/artifactory/webapp/main/StartArtifactoryTomcatDev.java
deleted file mode 100644
index 220a32b..0000000
--- a/distribution/standalone/src/test/java/org/artifactory/webapp/main/StartArtifactoryTomcatDev.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.webapp.main;
-
-import org.apache.catalina.startup.Tomcat;
-import org.apache.catalina.valves.RemoteIpValve;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.filefilter.AbstractFileFilter;
-import org.apache.commons.io.filefilter.FileFilterUtils;
-import org.apache.commons.io.filefilter.IOFileFilter;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.util.PathUtils;
-import org.artifactory.util.ResourceUtils;
-
-import java.io.File;
-import java.io.IOException;
-
-/**
- * @author yoavl
- */
-public class StartArtifactoryTomcatDev {
-
-    public static final String DEFAULT_PREFIX = "..";
-
-    /**
-     * Main function, starts the Tomcat server.
-     */
-    public static void main(String... args) throws IOException {
-        System.setProperty("java.net.preferIPv4Stack", "true");
-
-        String prefix = args.length == 0 ? DEFAULT_PREFIX : args[0];
-
-        // set home dir - dev mode only!
-        // System.setProperty(ConstantValues.dev.getPropertyName(), "true");
-        //In dev mod check for plugin updates frequently
-        System.setProperty(ConstantValues.pluginScriptsRefreshIntervalSecs.getPropertyName(), "20");
-
-        String homeProperty = System.getProperty("artifactory.home");
-        File devArtHome = new File(
-                homeProperty != null ? homeProperty : prefix + "/devenv/.artifactory").getCanonicalFile();
-        if (!devArtHome.exists() && !devArtHome.mkdirs()) {
-            throw new RuntimeException("Failed to create home dir: " + devArtHome.getAbsolutePath());
-        }
-        System.setProperty(ArtifactoryHome.SYS_PROP, devArtHome.getAbsolutePath());
-
-        File standaloneSrcDir = new File(prefix + "/open/distribution/standalone/src").getCanonicalFile();
-        File devEtcDir = new File(standaloneSrcDir, "test/etc");
-        updateMimetypes(devEtcDir);
-        copyNewerDevResources(devEtcDir, devArtHome);
-
-        File devHaEtcDir = new File(standaloneSrcDir, "test/ha-etc");
-        copyNewerHaDevResources(devHaEtcDir, devArtHome);
-
-        // set the logback.xml
-        System.setProperty("logback.configurationFile", new File(devArtHome + "/etc/logback.xml").getAbsolutePath());
-
-        //Manually set the selector (needed explicitly here before any logger kicks in)
-        // create the logger only after artifactory.home is set
-        Tomcat tomcat = null;
-        try {
-            tomcat = new Tomcat();
-            tomcat.setBaseDir(devArtHome + "/work");
-            tomcat.addWebapp("/artifactory", new File(prefix, "./open/web/war/src/main/webapp").getAbsolutePath());
-            RemoteIpValve valve = new RemoteIpValve();
-            valve.setProtocolHeader("X-Forwarded-Proto");
-            tomcat.getEngine().getPipeline().addValve(valve);
-            tomcat.start();
-            tomcat.getServer().await();
-        } catch (Exception e) {
-            System.err.println("Could not start the Tomcat server: " + e);
-            if (tomcat != null) {
-                try {
-                    tomcat.stop();
-                } catch (Exception e1) {
-                    System.err.println("Unable to stop the Tomcat server: " + e1);
-                }
-            }
-        }
-    }
-
-    static void copyNewerHaDevResources(File devHaEtcDir, File devArtHome) throws IOException {
-        updateHaEtc(devHaEtcDir, devArtHome);
-    }
-
-    static void updateHaEtc(File devHaEtcDir, File devArtHome) throws IOException {
-        File homeHaEtcDir = new File(devArtHome, "ha-etc");
-        IOFileFilter fileFilter = new NewerFileFilter(devHaEtcDir, homeHaEtcDir);
-        FileUtils.copyDirectory(devHaEtcDir, homeHaEtcDir, fileFilter, true);
-    }
-
-    /**
-     * Copy newer files from the standalone dir to the working artifactory home dir
-     */
-    static void copyNewerDevResources(File devEtcDir, File artHome) throws IOException {
-        File homeEtcDir = updateArtEtc(devEtcDir, new File(artHome, "etc"));
-        createConfigBootstrap(homeEtcDir);
-    }
-
-    static void createConfigBootstrap(File homeEtcDir) {
-        /**
-         * If the bootstrap already exists, it means it's not the first startup, so don't keep the original config file
-         * or the etc folder will flood with bootstrap files
-         */
-        if (new File(homeEtcDir, ArtifactoryHome.ARTIFACTORY_CONFIG_BOOTSTRAP_FILE).exists()) {
-            new File(homeEtcDir, ArtifactoryHome.ARTIFACTORY_CONFIG_FILE).delete();
-        }
-    }
-
-    static File updateArtEtc(File devEtcDir, File artEtc) throws IOException {
-        IOFileFilter fileFilter = new NewerFileFilter(devEtcDir, artEtc);
-        fileFilter = FileFilterUtils.makeSVNAware(fileFilter);
-        FileUtils.copyDirectory(devEtcDir, artEtc, fileFilter, true);
-        return artEtc;
-    }
-
-    static void updateMimetypes(File devEtcDir) {
-        File defaultMimeTypes = ResourceUtils.getResourceAsFile("/META-INF/default/mimetypes.xml");
-        File devMimeTypes = new File(devEtcDir, "mimetypes.xml");
-        if (!devMimeTypes.exists() || defaultMimeTypes.lastModified() > devMimeTypes.lastModified()) {
-            // override developer mimetypes file with newer default mimetypes file
-            try {
-                FileUtils.copyFile(defaultMimeTypes, devMimeTypes);
-            } catch (IOException e) {
-                System.err.println("Failed to copy default mime types file: " + e.getMessage());
-            }
-        }
-    }
-
-    private static class NewerFileFilter extends AbstractFileFilter {
-        private final File srcDir;
-        private final File destDir;
-
-        public NewerFileFilter(File srcDir, File destDir) {
-            this.srcDir = srcDir;
-            this.destDir = destDir;
-        }
-
-        @Override
-        public boolean accept(File srcFile) {
-            if (srcFile.isDirectory()) {
-                return true;    // don't exclude directories
-            }
-            String relativePath = PathUtils.getRelativePath(srcDir.getAbsolutePath(), srcFile.getAbsolutePath());
-            File destFile = new File(destDir, relativePath);
-            if (!destFile.exists() || srcFile.lastModified() > destFile.lastModified()) {
-                return true;
-            }
-            return false;
-        }
-    }
-}
diff --git a/etc/artifactory.config.xml b/etc/artifactory.config.xml
new file mode 100644
index 0000000..2b7bce6
--- /dev/null
+++ b/etc/artifactory.config.xml
@@ -0,0 +1,203 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- // @formatter:off -->
+
+<!--
+  ~ Artifactory is a binaries repository manager.
+  ~ Copyright (C) 2017 JFrog Ltd.
+  ~
+  ~ Artifactory is free software: you can redistribute it and/or modify
+  ~ it under the terms of the GNU Affero General Public License as published by
+  ~ the Free Software Foundation, either version 3 of the License, or
+  ~ (at your option) any later version.
+  ~
+  ~ Artifactory is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
+  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  ~ GNU Affero General Public License for more details.
+  ~
+  ~ You should have received a copy of the GNU Affero General Public License
+  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
+  -->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xmlns="http://artifactory.jfrog.org/xsd/2.0.2"
+        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/2.0.2
+        http://www.jfrog.org/xsd/artifactory-v2_0_2.xsd">
+<!--
+    enable/disable anonymous downloads
+    -->
+    <security>
+        <anonAccessEnabled>true</anonAccessEnabled>
+        <anonAccessToBuildInfosDisabled>false</anonAccessToBuildInfosDisabled>
+        <hideUnauthorizedResources>false</hideUnauthorizedResources>
+        <passwordSettings>
+            <encryptionPolicy>supported</encryptionPolicy>
+            <expirationPolicy>
+                <enabled>false</enabled>
+                <passwordMaxAge>60</passwordMaxAge>
+                <notifyByEmail>true</notifyByEmail>
+            </expirationPolicy>
+        </passwordSettings>
+        <ldapSettings/>
+        <ldapGroupSettings/>
+        <userLockPolicy>
+            <enabled>false</enabled>
+            <loginAttempts>5</loginAttempts>
+        </userLockPolicy>
+    </security>
+    <backups>
+        <backup>
+            <key>backup-daily</key>
+            <!-- backup Monday to Friday at 2:00 AM -->
+            <cronExp>0 0 2 ? * MON-FRI</cronExp>
+            <!-- Always backup to a "current" dir (incremental backups) -->
+            <retentionPeriodHours>0</retentionPeriodHours>
+            <!-- exclude certain repositories from being backed up -->
+        </backup>
+        <backup>
+            <key>backup-weekly</key>
+            <enabled>false</enabled>
+            <!-- backup on Saturday at 2:00 AM -->
+            <cronExp>0 0 2 ? * SAT</cronExp>
+            <!-- keep backups for 2 weeks. -->
+            <retentionPeriodHours>336</retentionPeriodHours>
+            <!-- exclude certain repositories from being backed up -->
+        </backup>
+    </backups>
+
+    <!-- The interval at which to activate the maven indexer. -->
+    <indexer>
+        <!-- By Default index once a day at 05:23AM -->
+        <cronExp>0 23 5 * * ?</cronExp>
+    </indexer>
+    <localRepositories>
+        <localRepository>
+            <key>example-repo-local</key>
+            <type>generic</type>
+            <description>Example artifactory repository</description>
+            <repoLayoutRef>simple-default</repoLayoutRef>
+            <handleReleases>true</handleReleases>
+            <handleSnapshots>true</handleSnapshots>
+            <suppressPomConsistencyChecks>true</suppressPomConsistencyChecks>
+        </localRepository>
+    </localRepositories>
+    <repoLayouts>
+        <repoLayout>
+            <name>maven-2-default</name>
+            <artifactPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
+            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
+            <descriptorPathPattern>[orgPath]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).pom</descriptorPathPattern>
+            <folderIntegrationRevisionRegExp>SNAPSHOT</folderIntegrationRevisionRegExp>
+            <fileIntegrationRevisionRegExp>SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))</fileIntegrationRevisionRegExp>
+        </repoLayout>
+        <repoLayout>
+            <name>ivy-default</name>
+            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/[module](-[classifier])-[baseRev](-[fileItegRev]).[ext]</artifactPathPattern>
+            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
+            <descriptorPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[type]s/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
+            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
+            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
+        </repoLayout>
+        <repoLayout>
+            <name>gradle-default</name>
+            <artifactPathPattern>[org]/[module]/[baseRev](-[folderItegRev])/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
+            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
+            <descriptorPathPattern>[org]/[module]/ivy-[baseRev](-[fileItegRev]).xml</descriptorPathPattern>
+            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
+            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
+        </repoLayout>
+        <repoLayout>
+            <name>maven-1-default</name>
+            <artifactPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
+            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
+            <descriptorPathPattern>[org]/[type]s/[module]-[baseRev](-[fileItegRev]).pom</descriptorPathPattern>
+            <folderIntegrationRevisionRegExp>.+</folderIntegrationRevisionRegExp>
+            <fileIntegrationRevisionRegExp>.+</fileIntegrationRevisionRegExp>
+        </repoLayout>
+        <repoLayout>
+            <name>nuget-default</name>
+            <artifactPathPattern>[orgPath]/[module]/[module].[baseRev](-[fileItegRev]).nupkg</artifactPathPattern>
+            <distinctiveDescriptorPathPattern>false</distinctiveDescriptorPathPattern>
+            <folderIntegrationRevisionRegExp>.*</folderIntegrationRevisionRegExp>
+            <fileIntegrationRevisionRegExp>.*</fileIntegrationRevisionRegExp>
+        </repoLayout>
+        <repoLayout>
+            <name>npm-default</name>
+            <artifactPathPattern>[orgPath]/[module]/[module]-[baseRev](-[fileItegRev]).tgz</artifactPathPattern>
+            <distinctiveDescriptorPathPattern>false</distinctiveDescriptorPathPattern>
+            <folderIntegrationRevisionRegExp>.*</folderIntegrationRevisionRegExp>
+            <fileIntegrationRevisionRegExp>.*</fileIntegrationRevisionRegExp>
+        </repoLayout>
+        <repoLayout>
+            <name>bower-default</name>
+            <artifactPathPattern>[orgPath]/[module]/[module]-[baseRev](-[fileItegRev]).[ext]</artifactPathPattern>
+            <distinctiveDescriptorPathPattern>false</distinctiveDescriptorPathPattern>
+            <folderIntegrationRevisionRegExp>.*</folderIntegrationRevisionRegExp>
+            <fileIntegrationRevisionRegExp>.*</fileIntegrationRevisionRegExp>
+        </repoLayout>
+        <repoLayout>
+            <name>vcs-default</name>
+            <artifactPathPattern>[orgPath]/[module]/[refs<tags|branches>]/[baseRev]/[module]-[baseRev](-[fileItegRev])(-[classifier]).[ext]</artifactPathPattern>
+            <distinctiveDescriptorPathPattern>false</distinctiveDescriptorPathPattern>
+            <folderIntegrationRevisionRegExp>.*</folderIntegrationRevisionRegExp>
+            <fileIntegrationRevisionRegExp>[a-zA-Z0-9]{40}</fileIntegrationRevisionRegExp>
+        </repoLayout>
+        <repoLayout>
+            <name>sbt-default</name>
+            <artifactPathPattern>[org]/[module]/(scala_[scalaVersion<.+>])/(sbt_[sbtVersion<.+>])/[baseRev]/[type]s/[module](-[classifier]).[ext]</artifactPathPattern>
+            <distinctiveDescriptorPathPattern>true</distinctiveDescriptorPathPattern>
+            <descriptorPathPattern>[org]/[module]/(scala_[scalaVersion<.+>])/(sbt_[sbtVersion<.+>])/[baseRev]/[type]s/ivy.xml</descriptorPathPattern>
+            <folderIntegrationRevisionRegExp>\d{14}</folderIntegrationRevisionRegExp>
+            <fileIntegrationRevisionRegExp>\d{14}</fileIntegrationRevisionRegExp>
+        </repoLayout>
+        <repoLayout>
+            <name>simple-default</name>
+            <artifactPathPattern>[orgPath]/[module]/[module]-[baseRev].[ext]</artifactPathPattern>
+            <distinctiveDescriptorPathPattern>false</distinctiveDescriptorPathPattern>
+            <folderIntegrationRevisionRegExp>.*</folderIntegrationRevisionRegExp>
+            <fileIntegrationRevisionRegExp>.*</fileIntegrationRevisionRegExp>
+        </repoLayout>
+        <repoLayout>
+            <name>composer-default</name>
+            <artifactPathPattern>[orgPath]/[module]/[module]-[baseRev](-[fileItegRev]).[ext]</artifactPathPattern>
+            <distinctiveDescriptorPathPattern>false</distinctiveDescriptorPathPattern>
+            <folderIntegrationRevisionRegExp>.*</folderIntegrationRevisionRegExp>
+            <fileIntegrationRevisionRegExp>.*</fileIntegrationRevisionRegExp>
+        </repoLayout>
+        <repoLayout>
+            <name>conan-default</name>
+            <artifactPathPattern>[module]/[baseRev]/[org]/[channel<[^/]+>][remainder<(?:.*)>]</artifactPathPattern>
+            <distinctiveDescriptorPathPattern>false</distinctiveDescriptorPathPattern>
+            <folderIntegrationRevisionRegExp>.*</folderIntegrationRevisionRegExp>
+            <fileIntegrationRevisionRegExp>.*</fileIntegrationRevisionRegExp>
+        </repoLayout>
+        <repoLayout>
+            <name>puppet-default</name>
+            <artifactPathPattern>[orgPath]/[module]/[orgPath]-[module]-[baseRev].tar.gz</artifactPathPattern>
+            <distinctiveDescriptorPathPattern>false</distinctiveDescriptorPathPattern>
+            <folderIntegrationRevisionRegExp>.*</folderIntegrationRevisionRegExp>
+            <fileIntegrationRevisionRegExp>.*</fileIntegrationRevisionRegExp>
+        </repoLayout>
+    </repoLayouts>
+    <gcConfig>
+        <cronExp>0 0 /4 * * ?</cronExp>
+    </gcConfig>
+    <cleanupConfig>
+        <!-- by default cleanup once a day at 05:12AM -->
+        <cronExp>0 12 5 * * ?</cronExp>
+    </cleanupConfig>
+    <virtualCacheCleanupConfig>
+        <!-- by default cleanup once a day at 05:00AM -->
+        <cronExp>0 12 0 * * ?</cronExp>
+    </virtualCacheCleanupConfig>
+    <folderDownloadConfig>
+        <enabled>false</enabled>
+        <maxDownloadSizeMb>1024</maxDownloadSizeMb>
+        <maxFiles>5000</maxFiles>
+        <maxConcurrentRequests>10</maxConcurrentRequests>
+    </folderDownloadConfig>
+    <trashcanConfig>
+        <enabled>true</enabled>
+        <allowPermDeletes>false</allowPermDeletes>
+        <retentionPeriodDays>14</retentionPeriodDays>
+    </trashcanConfig>
+</config>
diff --git a/etc/artifactory.system.properties b/etc/artifactory.system.properties
new file mode 100644
index 0000000..3111dd7
--- /dev/null
+++ b/etc/artifactory.system.properties
@@ -0,0 +1,279 @@
+#
+#
+# Artifactory is a binaries repository manager.
+# Copyright (C) 2016 JFrog Ltd.
+#
+# Artifactory is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+#  (at your option) any later version.
+#
+# Artifactory is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
+#
+#
+
+###############################################################################
+#  Use this file to override system-level properties used by artifactory.     #
+#  Artifactory-specific properties beginning with the "artifactory." prefix   #
+#  will be handled internally by artifactory - you should change them only if #
+#  you know what you are doing.                                               #
+#  All other properties will become normal (jvm-wide) system properties, so   #
+#  this file can be used as an alternative for specifying command-line         #
+#  -Dparam=val parameters.                                                    #
+###############################################################################
+
+## Comma separated list of disabled addons
+#artifactory.addons.disabled=
+
+## Name of alternate application context class to use
+#artifactory.applicationContextClass=null
+
+# Enable adding the session id to the URL
+#artifactory.servlet.supportUrlSessionTracking=false
+
+## Indicates whether a different instance of Artifactory can request remote artifacts from this instance
+#artifactory.artifactoryRequestsToGlobalCanRetrieveRemoteArtifacts=false
+
+## Disable the download access to the global 'repo'
+artifactory.repo.global.disabled=true
+
+## Number of seconds for fs items to idle in the cache
+#artifactory.fsitem.cache.idleTimeSecs=1200
+
+## Number of seconds to wait between running the storage garbage collector. Use the UI to configure as cron exp
+#artifactory.gc.intervalSecs=14400
+
+## Number of milliseconds the garbage collector should wait between the scanning of each node
+#artifactory.gc.sleepBetweenNodesMillis=20
+
+## Number of milliseconds to wait before starting to sleep between garbage collector node scanning iterations
+#artifactory.gc.scanStartSleepingThresholdMillis=20000
+
+## Number of milliseconds to sleep between garbage collector node scanning iterations
+#artifactory.gc.scanSleepBetweenIterationsMillis=200
+
+## Number of milliseconds to work between garbage collector datastore file scanning sleep invocations
+#artifactory.gc.fileScanSleepIterationMillis=1000
+
+## Number of milliseconds to sleep during lengthy garbage collector datastore file scanning
+#artifactory.gc.fileScanSleepMillis=250
+
+## The maximum binary record cache entries. Apllicable only for v2 gc
+#artifactory.gc.maxCacheEntries=10000
+
+## Number of seconds to wait until timing out while waiting for an item lock to be acquired
+#artifactory.locks.timeoutSecs=120
+
+## Whether to print detailed debug information on lock timeouts
+#artifactory.locks.debugTimeouts=false
+
+## Number of seconds to wait between each refresh of the system logs viewer
+#artifactory.logs.viewRefreshRateSecs=10
+
+## The maximum number of seconds to wait when blocking on a concurrent download from the same repository, before
+## starting a parallel download
+# artifactory.repo.concurrentDownloadSyncTimeoutSecs=900
+
+## Indicates if all stored archives should be indexed (even if already done) upon system startup
+#artifactory.search.content.forceArchiveIndexing=false
+
+## Maximum number of excerpt fragments to return for each result when searching archive content through the UI
+#artifactory.search.content.maxFragments=500
+
+## Maximum number of characters for each fragment
+#artifactory.search.content.maxFragmentsSize=5000
+
+## Maximum number of results to return when searching through the UI
+#artifactory.search.maxResults=500
+
+## The backend limit of maximum results to return from sql queries issued by users. Should be higher than maxResults.
+#artifactory.search.userQueryLimit=1000
+
+## The minimum number of characters allowed for an archive content query.
+#artifactory.search.archive.minQueryLength=3
+
+## The maximum number of seconds that should be spent on a pattern search
+#artifactory.search.pattern.timeoutSecs=30
+
+## Number of seconds for authentications to idle in the cache
+#artifactory.security.authentication.cache.idleTimeSecs=300
+
+## Minimal number of seconds that should be the difference between each user last access timestamp 
+#artifactory.security.userLastAccessUpdatesResolutionSecs=60
+
+## If Login Remember Me should be disabled and users will have to input their credentials on each login.
+#artifactory.security.disableRememberMe=false
+
+## Caches blocked user in sake of performance improvement
+## and takes load off authentication mechanism/db
+#artifactory.security.useFrontCacheForBlockedUsers=true
+
+## Login dynamically blocked for increasing amount of time
+## since third incorrect login, algorithm is:
+## (INCORRECT_ATTEMPTS-3) * loginBlockDelay (millis)
+##
+## note: delay may not exceed 5000 (5 seconds)
+##
+#artifactory.security.loginBlockDelay=500
+
+## Path to alternate Spring configuration file
+#artifactory.spring.configDir=null
+
+## Number of lock timeouts to retry while waiting for a task to complete
+#artifactory.task.completionLockTimeoutRetries=100
+
+## Whether logging and processing of traffic is active  
+#artifactory.traffic.collectionActive=false
+
+## Number of seconds to wait between each version information update query
+#artifactory.versioningQueryIntervalSecs=43200
+
+## The substring by which a remote host is identified as Maven''s central host
+#artifactory.mvn.central.hostPattern=.maven.org
+
+## The maximum frequency in seconds that a remote index on Maven central host can be queried for updates
+#artifactory.mvn.central.indexerMaxQueryIntervalSecs=86400
+## Maximum concurrent workers to calculate maven metadata
+#artifactory.mvn.metadata.calculation.workers=8
+
+## Fully qualified name of a maven metadata version comparator to determine the latest and release versions
+#artifactory.mvn.metadataVersionsComparatorFqn=org.artifactory.maven.versioning.VersionNameMavenMetadataVersionComparator
+
+## Disable requests with version tokens (SNAPSHOT, [RELEASE], [INTEGRATION] which retrieves the latest unique if exists
+#artifactory.request.disableVersionTokens=false
+
+## Determine if should sort and retrieve the latest [RELEASE] version by files date created (default is by version string comparator)
+#artifactory.request.searchLatestReleaseByDateCreated=false
+
+## Add additional xml mime type file extensions (*.myextension). Separated by ","
+#artifactory.xmlAdditionalMimeTypeExtensions=myextension1,myextension2
+
+## Max number of folders to scan deeply for items used as build artifact or dependencies before deleting to warn of
+#artifactory.build.maxFoldersToScanForDeletionWarnings=2
+
+## Size for the derby page cache
+derby.storage.pageCacheSize=500
+
+## Disable the Derby JMX management service
+derby.module.mgmt.jmx=org.apache.derby.impl.services.jmxnone.NoManagementService
+
+## Log all errors/messages of any severity (will list deadlocks)
+derby.stream.error.logSeverityLevel=0
+
+## Log all executed statements along with their txid
+derby.language.logStatementText=false
+
+## Log all deadlocks
+#derby.locks.monitor=true
+
+## Writes a stack trace of all threads involved in lock problems # -- (not just the victims) to the log
+#derby.locks.deadlockTrace=true
+
+## Threshold for the number rows touched above which to auto-escalate to table-level locking from row-level locking
+#derby.locks.escalationThreshold=5000
+
+## Defines the maximum size of text to parse through the text highlighting script
+#artifactory.ui.syntaxColoringMaxTextSizeBytes=512000
+
+## Defines the default chroot for UI file\dir selectors that browse machine Artifactory was installed on
+#artifactory.ui.chroot=/home/bob
+
+## Defines the maximum number of files to retain when maintaining a rolling file policy
+#artifactory.file.roller.maxFileToRetain=10
+
+## Number of milliseconds to work between system backup file export sleep invocations
+#artifactory.backup.fileExportSleepIterationMillis=2000
+
+## Number of milliseconds to sleep during lengthy system backup file exports
+#artifactory.backup.fileExportSleepMillis=250
+
+## Number of seconds to check for updates of plugin script files (0 - do not refresh updates scripts)
+#artifactory.plugin.scripts.refreshIntervalSecs=0
+
+## Send the Accept-Encoding:gzip header to remote repositories and handle gzip stream responses
+#artifactory.http.acceptEncoding.gzip=true
+
+# use the Expect continue directive
+#artifactory.http.useExpectContinue=false
+
+# The lower-limit of a filtered resource size for which a performance warning will be displayed
+#filtering.resourceSizeKb=64
+
+# Whether to search for an an existing resource under a different name before requesting a remote artifact
+#artifactory.repo.remote.checkForExistingResourceOnRequest=true
+
+# Comma separated list of global excludes to apply on all repositories
+#artifactory.repo.includeExclude.globalExcludes=**/*~,**/#*#,**/.#*,**/%*%,**/._*,**/CVS,**/CVS/**,**/.cvsignore,**/SCCS,**/SCCS/**,**/vssver.scc,**/.svn,**/.svn/**,**/.DS_Store
+
+## A list of archive file names that may contain textual license information.\
+#artifactory.archive.licenseFile.names=license,LICENSE,license.txt,LICENSE.txt,LICENSE.TXT
+
+## Number of seconds for dynamic metadata to be cached
+#artifactory.mvn.dynamicMetadata.cacheRetentionSecs=10
+
+## A list of custom types (custom file extensions) to use when resolving maven artifacts
+#artifactory.mvn.custom.types=tar.gz,tar.bz2
+
+## Determines the maximum number of rows to display per result page
+#artifactory.ui.search.maxRowsPerPage=20
+
+## Maximum number of results to return when performing NuGet searches without specifying a limit
+#artifactory.nuget.search.maxResults=100
+
+## If true, all requests to the NuGet API require authentication even if anonymous access is enabled.
+#artifactory.nuget.forceAuthentication=false
+
+## Disable filename token in response Content-Disposition header
+#artifactory.response.disableContentDispositionFilename=false
+
+## Comma separated list of supported archive extensions for archive bundled deploy
+#artifactory.request.explodedArchiveExtensions=zip,tar,tar.gz,tgz
+
+## Disable \ enable the username auto complete in the login page  (values : "off" "on").
+#artifactory.useUserNameAutoCompleteOnLogin=on
+
+## The interval, in seconds, for flushing aggregated statistics to the storage
+#artifactory.stats.flushIntervalSecs=30
+
+## The amount of indices to pre fetch by IdGenerator
+#artifactory.db.idGenerator.fetch.amount=1000
+
+## Hides push to Bintray button both for artifacts as well as for builds
+#artifactory.bintray.ui.hideUploads=true
+
+## Hides the encrypted password field and the maven settings snippet from the profile page
+#artifactory.ui.hideEncryptedPassword=true
+
+## Hides checksum files in simple and list browsing
+#artifactory.ui.hideChecksums=true
+
+## Maximum number repositories to import in parallel (default is one less than the available processors)
+#artifactory.import.max.parallelRepos
+
+## Idle connection monitor interval (in seconds)
+#artifactory.repo.http.idleConnectionMonitorInterval=10
+
+## Disables idle HTTP connections monitoring (idle connections are closed automatically when #idleConnectionMonitorInterval expires)
+#artifactory.repo.http.disableIdleConnectionMonitoring=false
+
+## Time to wait for content collection accomplishing (in minutes)
+#artifactory.support.core.bundle.contentCollectionAwaitTimeout=60
+
+## Artifactory by default blocks concurrent execution of Support content collection,
+## however one can configure time to wait for next available execution slot before
+## withdraw (in seconds)
+#artifactory.support.core.bundle.waitForSlotBeforeWithdraw=600
+
+## Max (previously created) bundles to keep
+#artifactory.support.core.bundle.maxBundles=5
+
+## The latest deployed npm package will be tag with the 'latest' tag
+#artifactory.npm.tag.tagLatestByPublish=true
+
+
diff --git a/etc/binarystore.xml b/etc/binarystore.xml
new file mode 100644
index 0000000..5792a5b
--- /dev/null
+++ b/etc/binarystore.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Artifactory is a binaries repository manager.
+  ~ Copyright (C) 2016 JFrog Ltd.
+  ~
+  ~ Artifactory is free software: you can redistribute it and/or modify
+  ~ it under the terms of the GNU Affero General Public License as published by
+  ~ the Free Software Foundation, either version 3 of the License, or
+  ~ (at your option) any later version.
+  ~
+  ~ Artifactory is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
+  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  ~ GNU Affero General Public License for more details.
+  ~
+  ~ You should have received a copy of the GNU Affero General Public License
+  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
+  -->
+<!--
+    This file configures Artifactory's binary provider
+-->
+
+<!--
+  ~ TAKE CARE! Making changes to this file may result in losing binaries stored in Artifactory!
+  ~ If you are not sure of what you are doing, please contact JFrog Support for assistance.
+  -->
+
+<config version="1">
+    <chain template="file-system"/>
+</config>
\ No newline at end of file
diff --git a/etc/logback.xml b/etc/logback.xml
new file mode 100644
index 0000000..30ae230
--- /dev/null
+++ b/etc/logback.xml
@@ -0,0 +1,210 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Artifactory is a binaries repository manager.
+  ~ Copyright (C) 2016 JFrog Ltd.
+  ~
+  ~ Artifactory is free software: you can redistribute it and/or modify
+  ~ it under the terms of the GNU Affero General Public License as published by
+  ~ the Free Software Foundation, either version 3 of the License, or
+  ~ (at your option) any later version.
+  ~
+  ~ Artifactory is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
+  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  ~ GNU Affero General Public License for more details.
+  ~
+  ~ You should have received a copy of the GNU Affero General Public License
+  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
+  -->
+
+<configuration debug="false">
+    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"/>
+    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
+            <layout class="org.artifactory.logging.layout.BackTracePatternLayout">
+                <pattern>%date ${artifactory.contextId}[%thread] [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
+            </layout>
+        </encoder>
+    </appender>
+    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <File>${artifactory.home}/logs/artifactory.log</File>
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+            <FileNamePattern>${artifactory.home}/logs/artifactory.%i.log.zip</FileNamePattern>
+            <MinIndex>1</MinIndex>
+            <MaxIndex>9</MaxIndex>
+        </rollingPolicy>
+
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+            <MaxFileSize>25MB</MaxFileSize>
+        </triggeringPolicy>
+        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
+            <layout class="org.artifactory.logging.layout.BackTracePatternLayout">
+                <pattern>%date [%thread] [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
+            </layout>
+        </encoder>
+    </appender>
+    <appender name="ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <File>${artifactory.home}/logs/access.log</File>
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+            <FileNamePattern>${artifactory.home}/logs/access.%i.log.zip</FileNamePattern>
+            <MinIndex>1</MinIndex>
+            <MaxIndex>9</MaxIndex>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%d %m%n</pattern>
+        </encoder>
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+            <MaxFileSize>25MB</MaxFileSize>
+        </triggeringPolicy>
+    </appender>
+    <appender name="IMPORT.EXPORT" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <File>${artifactory.home}/logs/import.export.log</File>
+        <encoder>
+            <pattern>%date [%-5level] \(%logger{32}:%line\) %message%n</pattern>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+            <FileNamePattern>${artifactory.home}/logs/import.export.%i.log.zip</FileNamePattern>
+            <maxIndex>13</maxIndex>
+        </rollingPolicy>
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+            <MaxFileSize>25MB</MaxFileSize>
+        </triggeringPolicy>
+    </appender>
+    <appender name="TRAFFIC" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <File>${artifactory.home}/logs/traffic</File>
+        <encoder>
+            <pattern>%message%n</pattern>
+        </encoder>
+        <rollingPolicy class="org.artifactory.traffic.policy.TrafficTimeBasedRollingPolicy">
+            <FileNamePattern>${artifactory.home}/logs/traffic.%d{yyyyMMdd}</FileNamePattern>
+        </rollingPolicy>
+    </appender>
+    <appender name="REQUEST" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <File>${artifactory.home}/logs/request.log</File>
+        <encoder>
+            <pattern>%message%n</pattern>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+            <FileNamePattern>${artifactory.home}/logs/request.%i.log</FileNamePattern>
+            <maxIndex>13</maxIndex>
+        </rollingPolicy>
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+            <MaxFileSize>25MB</MaxFileSize>
+        </triggeringPolicy>
+    </appender>
+    <appender name="REQUEST_TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <File>${artifactory.home}/logs/request_trace.log</File>
+        <encoder>
+            <pattern>%date %message%n</pattern>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+            <FileNamePattern>${artifactory.home}/logs/request_trace.%i.log</FileNamePattern>
+            <maxIndex>13</maxIndex>
+        </rollingPolicy>
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+            <MaxFileSize>25MB</MaxFileSize>
+        </triggeringPolicy>
+    </appender>
+
+    <!--JFrog Access appenders -->
+    <appender name="JFROG_ACCESS_CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
+            <layout class="org.artifactory.logging.layout.BackTracePatternLayout">
+                <pattern>%date ${artifactory.contextId}[%thread] [JFrog-Access] [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
+            </layout>
+        </encoder>
+    </appender>
+    <appender name="JFROG_ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <File>${artifactory.home}/access/logs/jfrog_access.log</File>
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+            <FileNamePattern>${artifactory.home}/access/logs/jfrog_access.%i.log.zip</FileNamePattern>
+            <MinIndex>1</MinIndex>
+            <MaxIndex>9</MaxIndex>
+        </rollingPolicy>
+
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+            <MaxFileSize>25MB</MaxFileSize>
+        </triggeringPolicy>
+        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
+            <layout class="org.artifactory.logging.layout.BackTracePatternLayout">
+                <pattern>%date [%thread] [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
+            </layout>
+        </encoder>
+    </appender>
+    <appender name="JFROG_ACCESS_AUDIT" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <File>${artifactory.home}/access/logs/audit.log</File>
+        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
+            <layout class="org.artifactory.logging.layout.BackTracePatternLayout">
+                <pattern>%date %message%n</pattern>
+            </layout>
+        </encoder>
+        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+            <FileNamePattern>${artifactory.home}/access/logs/audit.%i.log.zip</FileNamePattern>
+            <maxIndex>13</maxIndex>
+        </rollingPolicy>
+        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+            <MaxFileSize>25MB</MaxFileSize>
+        </triggeringPolicy>
+    </appender>
+
+    <root>
+        <level value="warn"/>
+        <appender-ref ref="CONSOLE"/>
+        <appender-ref ref="FILE"/>
+    </root>
+    <logger name="org.artifactory">
+        <level value="info"/>
+    </logger>
+    <logger name="org.jfrog">
+        <level value="info"/>
+    </logger>
+    <logger name="org.artifactory.support">
+        <level value="info"/>
+    </logger>
+    <logger name="org.artifactory.security.AccessLogger" additivity="false">
+        <level value="info"/>
+        <appender-ref ref="ACCESS"/>
+    </logger>
+    <logger name="org.artifactory.api.common.ImportExportStatusHolder" additivity="false">
+        <level value="DEBUG"/>
+        <appender-ref ref="IMPORT.EXPORT"/>
+    </logger>
+    <logger name="org.artifactory.traffic.TrafficLogger" additivity="false">
+        <level value="info"/>
+        <appender-ref ref="TRAFFIC"/>
+    </logger>
+    <logger name="org.artifactory.traffic.RequestLogger" additivity="false">
+        <level value="info"/>
+        <appender-ref ref="REQUEST"/>
+    </logger>
+    <logger name="org.artifactory.request.RequestTraceLogger" additivity="false">
+        <level value="info"/>
+        <appender-ref ref="REQUEST_TRACE"/>
+    </logger>
+
+    <!-- JFrog-Access loggers -->
+    <logger name="com.jfrog.access" additivity="false">
+        <level value="info"/>
+        <appender-ref ref="JFROG_ACCESS"/>
+        <appender-ref ref="JFROG_ACCESS_CONSOLE"/>
+    </logger>
+    <logger name="com.jfrog.access.server.audit.TokenAuditor" additivity="false">
+        <level value="info"/>
+        <appender-ref ref="JFROG_ACCESS_AUDIT"/>
+        <appender-ref ref="JFROG_ACCESS_CONSOLE"/>
+    </logger>
+
+    <!-- third party loggers -->
+    <logger name="com.sun.jersey">
+        <level value="warn"/>
+    </logger>
+    <logger name="org.springframework">
+        <level value="warn"/>
+    </logger>
+    <logger name="org.apache.cxf">
+        <level value="error"/>
+    </logger>
+    <logger name="com.jfrog.bintray">
+        <level value="info"/>
+    </logger>
+</configuration>
\ No newline at end of file
diff --git a/etc/mimetypes.xml b/etc/mimetypes.xml
new file mode 100644
index 0000000..387c508
--- /dev/null
+++ b/etc/mimetypes.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Artifactory is a binaries repository manager.
+  ~ Copyright (C) 2016 JFrog Ltd.
+  ~
+  ~ Artifactory is free software: you can redistribute it and/or modify
+  ~ it under the terms of the GNU Affero General Public License as published by
+  ~ the Free Software Foundation, either version 3 of the License, or
+  ~ (at your option) any later version.
+  ~
+  ~ Artifactory is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
+  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  ~ GNU Affero General Public License for more details.
+  ~
+  ~ You should have received a copy of the GNU Affero General Public License
+  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
+  -->
+<!--
+    This file configures Artifactory's known mime types. A list of registered
+    media types can be found in http://www.iana.org/assignments/media-types/ and common ones in
+    http://www.webmaster-toolkit.com/mime-types.shtml
+    Each mime type may have the following attributes:
+        type - The mime entry unique name (mandatory)
+        extensions - Comma separated list of file extensions mapped to this mime type (mandatory)
+        index - True if this mime type should be indexed for searching (valid only for supported archive files)
+        archive - True if this mime type is a browsable archive
+        viewable - True if this mime type can be viewed as text file
+        syntax - The UI highlighter syntax to for this mime type (only relevant if this is a viewable type)
+        css - The css class of a display icon for this mime type
+-->
+<mimetypes version="9">
+
+    <mimetype type="text/plain" extensions="txt, properties, mf, asc" viewable="true" syntax="plain"/>
+    <mimetype type="text/html" extensions="htm, html" viewable="true" syntax="xml"/>
+    <mimetype type="text/css" extensions="css" viewable="true" syntax="css"/>
+    <mimetype type="text/xsl" extensions="xsl" viewable="true" syntax="xml"/>
+    <mimetype type="text/xslt" extensions="xslt" viewable="true" syntax="xml"/>
+    <mimetype type="text/x-java-source" extensions="java" viewable="true" syntax="java"/>
+    <mimetype type="text/x-javafx-source" extensions="fx" viewable="true" syntax="javafx"/>
+    <mimetype type="text/x-groovy-source" extensions="groovy, gradle" viewable="true" syntax="groovy"/>
+    <mimetype type="text/x-c" extensions="h, c, cc, cpp" viewable="true" syntax="cpp"/>
+
+    <mimetype type="application/xml-dtd" extensions="dtd" viewable="true"/>
+    <mimetype type="application/xml-schema" extensions="xsd" viewable="true" syntax="xml" css="xml"/>
+    <mimetype type="application/xml-external-parsed-entity" extensions="ent" viewable="true"/>
+    <mimetype type="application/xhtml+xml" extensions="xhtml" viewable="true" syntax="xml"/>
+    <mimetype type="application/json" extensions="json" viewable="true" syntax="javascript"/>
+    <mimetype type="text/x-python" extensions="py" viewable="true" syntax="python" css="python"/>
+
+    <mimetype type="application/x-java-pack200" extensions="jar.pack.gz" archive="true" index="true" css="jar"/>
+    <mimetype type="application/x-java-archive-diff" extensions="jardiff" archive="false"/>
+    <mimetype type="application/zip" extensions="zip" archive="true" index="true" css="jar"/>
+    <mimetype type="application/x-tar" extensions="tar" archive="true" index="false"/>
+    <mimetype type="application/x-gzip" extensions="tgz, tar.gz, gz" archive="true" index="false"/>
+    <mimetype type="application/x-nupkg" extensions="nupkg" archive="true" index="true" css="nupkg"/>
+    <mimetype type="application/x-rar-compressed" extensions="rar" archive="false" css="jar"/>
+    <mimetype type="application/vnd.android.package-archive" extensions="apk" archive="true" index="true" css="apk"/>
+    <mimetype type="application/x-rpm" extensions="rpm" css="rpm"/>
+    <mimetype type="application/x-rubygems" extensions="gem" css="gem"/>
+    <mimetype type="application/x-ruby-marshal" extensions="rz" css="ruby-marshal"/>
+    <mimetype type="application/x-debian-package" extensions="deb" css="deb"/>
+    <mimetype type="application/x-vagrant-box" extensions="box" css="box"/>
+
+    <!-- not registered -->
+    <mimetype type="text/x-scala-source" extensions="scala" viewable="true" syntax="scala"/>
+    <mimetype type="text/x-ruby-source" extensions="rb" viewable="true" syntax="ruby"/>
+    <mimetype type="text/x-script.sh" extensions="sh" viewable="true" syntax="shell"/>
+    <mimetype type="text/x-csharp.sh" extensions="cs" viewable="true" syntax="csharp"/>
+
+    <!--
+        NOTE: The following mime types are required for a proper functioning of certain features in Artifactory 
+         DO NOT change them unless you really know what you are doing
+    -->
+    <mimetype type="application/xml" extensions="xml, xsl, xsi" viewable="true" syntax="xml" css="xml"/>
+    <mimetype type="application/x-maven-pom+xml" extensions="pom" viewable="true" syntax="xml" css="pom"/>
+    <mimetype type="application/x-ivy+xml" extensions="ivy" viewable="true" syntax="xml" css="xml"/>
+    <mimetype type="application/x-nuspec+xml" extensions="nuspec" viewable="true" syntax="xml" css="xml"/>
+    <mimetype type="application/x-java-jnlp-file" extensions="jnlp" viewable="true" syntax="xml" css="jnlp"/>
+    <mimetype type="application/x-checksum" extensions="sha1, md5" viewable="true" syntax="plain"/>
+    <mimetype type="application/java-archive" extensions="jar, war, ear, sar, har, hpi, jpi" archive="true" index="true"
+              css="jar"/>
+
+</mimetypes>
\ No newline at end of file
diff --git a/misc/artifactory.config.template.yml b/misc/artifactory.config.template.yml
new file mode 100644
index 0000000..8462150
--- /dev/null
+++ b/misc/artifactory.config.template.yml
@@ -0,0 +1,85 @@
+---
+version: 1
+## This file is complementary to the JFrog Artifactory startup wizard, and may be used to specify the initial basic
+## settings for a new Artifactory installation, namely:
+## * License Key(s)
+## * Base URL
+## * Proxy
+## * Default repositories
+##
+##
+## HOW TO USE THIS FILE:
+##
+## To import these settings when bootstrapping Artifactory, save this file as artifactory.config.import.yml under Artifactory’s /etc folder
+## Artifactory will load this file if all of the following conditions are met:
+## - no repositories have been created
+## - a proxy has not been set up, or you did set up a proxy externally, but did not configure proxy setup through this file
+## - the base URL has not been set up, or you did set up the base URL externally, but did not configure the base URL setup through this file
+## - Artifactory has not been activated with a license, or Artifactory has been activated with a license, and you did not specify a license in this file
+##
+## To have any of these parameters automatically configured when you bootstrap an Artifactory instance using this file,
+## simply uncomment the relevant sections below, and where required, provide values.
+
+
+##################################################################################
+#                           General Configurations                               #
+##################################################################################
+GeneralConfiguration:
+
+  ## License key to import in onboarding
+  licenseKey : "Enter your license key"
+  ## If you are using this file to configure an HA cluster, please use the "licenseKeys" tag instead
+  #licenseKeys :
+  #- lic1
+  #- lic2
+  #- ...
+
+
+  ## Setup the Artifactory base URL
+  ## For more information about the Artifactory base URL, please refer to
+  ## https://www.jfrog.com/confluence/display/RTF/Configuring+Artifactory#ConfiguringArtifactory-GeneralSettings
+  ## Uncomment the line below to set the Artifactory base URL
+  #baseUrl : "https://mycomp.arti.co"
+
+
+  ## Configure proxies for artifactory
+  ## For more information on configuring a proxy in Artifactory, please refer to
+  ## https://www.jfrog.com/confluence/display/RTF/Managing+Proxies
+  ## Uncomment the lines below to setup a proxy
+  #proxies :
+  # -  key : "proxy1"
+  #    host : "https://proxy.mycomp.io"
+  #    port : 443
+  #    userName : "admin"
+  #    password : "password"
+  #    defaultProxy : true
+  # -  key : "proxy2"
+  #    ...
+
+##################################################################################
+#                         Onboarding Configurations                              #
+##################################################################################
+OnboardingConfiguration:
+
+  ## Uncomment the package types for which you want to create default repositories
+  repoTypes :
+  # - bower
+  # - cocoapods
+  # - conan
+  # - debian
+  # - docker
+  # - gems
+  # - generic
+  # - gradle
+  # - ivy
+  # - maven
+  # - npm
+  # - nuget
+  # - opkg
+  # - composer
+  # - puppet
+  # - pypi
+  # - sbt
+  # - vagrant
+  # - yum
+  # - gitlfs
diff --git a/distribution/standalone/src/main/install/misc/db/createdb/createdb_mssql.sql b/misc/db/createdb/createdb_mssql.sql
similarity index 100%
rename from distribution/standalone/src/main/install/misc/db/createdb/createdb_mssql.sql
rename to misc/db/createdb/createdb_mssql.sql
diff --git a/distribution/standalone/src/main/install/misc/db/createdb/createdb_mssqlBlob.sql b/misc/db/createdb/createdb_mssqlBlob.sql
similarity index 100%
rename from distribution/standalone/src/main/install/misc/db/createdb/createdb_mssqlBlob.sql
rename to misc/db/createdb/createdb_mssqlBlob.sql
diff --git a/distribution/standalone/src/main/install/misc/db/createdb/createdb_mssqlRecreateBlob.sql b/misc/db/createdb/createdb_mssqlRecreateBlob.sql
similarity index 100%
rename from distribution/standalone/src/main/install/misc/db/createdb/createdb_mssqlRecreateBlob.sql
rename to misc/db/createdb/createdb_mssqlRecreateBlob.sql
diff --git a/distribution/standalone/src/main/install/misc/db/createdb/createdb_mysql.sql b/misc/db/createdb/createdb_mysql.sql
similarity index 100%
rename from distribution/standalone/src/main/install/misc/db/createdb/createdb_mysql.sql
rename to misc/db/createdb/createdb_mysql.sql
diff --git a/misc/db/mssql.properties b/misc/db/mssql.properties
new file mode 100644
index 0000000..3826ae9
--- /dev/null
+++ b/misc/db/mssql.properties
@@ -0,0 +1,25 @@
+#
+#
+# Artifactory is a binaries repository manager.
+# Copyright (C) 2016 JFrog Ltd.
+#
+# Artifactory is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+#  (at your option) any later version.
+#
+# Artifactory is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
+#
+#
+
+type=mssql
+driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
+url=jdbc:sqlserver://localhost:1433;databaseName=artifactory;sendStringParametersAsUnicode=false;applicationName=Artifactory Binary Repository
+username=artifactory
+password=password
diff --git a/misc/db/mysql.properties b/misc/db/mysql.properties
new file mode 100644
index 0000000..3165ad5
--- /dev/null
+++ b/misc/db/mysql.properties
@@ -0,0 +1,25 @@
+#
+#
+# Artifactory is a binaries repository manager.
+# Copyright (C) 2016 JFrog Ltd.
+#
+# Artifactory is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+#  (at your option) any later version.
+#
+# Artifactory is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
+#
+#
+
+type=mysql
+driver=com.mysql.jdbc.Driver
+url=jdbc:mysql://localhost:3306/artdb?characterEncoding=UTF-8&elideSetAutoCommits=true
+username=artifactory
+password=password
diff --git a/misc/db/oracle.properties b/misc/db/oracle.properties
new file mode 100644
index 0000000..e725c2b
--- /dev/null
+++ b/misc/db/oracle.properties
@@ -0,0 +1,25 @@
+#
+#
+# Artifactory is a binaries repository manager.
+# Copyright (C) 2016 JFrog Ltd.
+#
+# Artifactory is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+#  (at your option) any later version.
+#
+# Artifactory is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
+#
+#
+
+type=oracle
+driver=oracle.jdbc.OracleDriver
+url=jdbc:oracle:thin:@localhost:1521:ORCL
+username=artifactory
+password=password
diff --git a/misc/db/postgresql.properties b/misc/db/postgresql.properties
new file mode 100644
index 0000000..d4db350
--- /dev/null
+++ b/misc/db/postgresql.properties
@@ -0,0 +1,25 @@
+#
+#
+# Artifactory is a binaries repository manager.
+# Copyright (C) 2016 JFrog Ltd.
+#
+# Artifactory is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+#  (at your option) any later version.
+#
+# Artifactory is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
+#
+#
+
+type=postgresql
+driver=org.postgresql.Driver
+url=jdbc:postgresql://localhost:5432/artifactory
+username=artifactory
+password=password
diff --git a/misc/ha/ha-node.properties.template b/misc/ha/ha-node.properties.template
new file mode 100644
index 0000000..c381570
--- /dev/null
+++ b/misc/ha/ha-node.properties.template
@@ -0,0 +1,20 @@
+## This is a template file for ha-node.properties. ##
+## Once edited properly, it should be located under the etc/ folder of an Artifactory HA instance ##
+
+# Unique descriptive name of this server.
+node.id=art1
+
+# If using NFS mount this property provides the full path to the root directory of your NFS binary storage. (Optional)
+#artifactory.ha.data.dir=/var/opt/jfrog/artifactory-ha
+
+# If using NFS mount this property provides the full path to the root directory of your NFS back up data. (Optional)
+#artifactory.ha.backup.dir=/var/opt/jfrog/artifactory-backup
+
+# The context url that should be used to communicate with this server within the cluster.
+context.url=http://10.0.0.121:8081/artifactory/
+
+# The port that should be used to communicate with this server within the cluster. (Optional)
+membership.port=10001
+
+# Indicates if this is the primary server. (Optional)
+primary=true
\ No newline at end of file
diff --git a/misc/service/artifactory b/misc/service/artifactory
new file mode 100644
index 0000000..770ad67
--- /dev/null
+++ b/misc/service/artifactory
@@ -0,0 +1,316 @@
+#!/bin/bash
+#
+# Startup script for Artifactory in Tomcat Servlet Engine
+#
+# chkconfig: 345 86 14
+# description: Artifactory Tomcat Servlet Engine
+# processname: artifactory
+# pidfile: /var/opt/jfrog/run/artifactory.pid
+#
+### BEGIN INIT INFO
+# Provides:          artifactory
+# Required-Start:    $remote_fs $syslog $network
+# Required-Stop:     $remote_fs $syslog $network
+# Default-Start:     3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: Start Artifactory on Tomcat
+# Description:       Manages the services needed to run Artifactory on a dedicated Tomcat
+### END INIT INFO
+#
+
+errorArtHome() {
+    echo
+    echo -e "\033[31m** ERROR: $1\033[0m"
+    echo
+    exit 1
+}
+
+checkArtHome() {
+    if [ -z "$ARTIFACTORY_HOME" ] || [ ! -d "$ARTIFACTORY_HOME" ]; then
+        errorArtHome "Artifactory home folder not defined or does not exists at $ARTIFACTORY_HOME"
+    fi
+}
+
+checkArtPid() {
+    if [ -z "$ARTIFACTORY_PID" ]; then
+        errorArtHome "Artifactory pid destination ARTIFACTORY_PID was not set in $artDefaultFile ! Please add it!"
+    fi
+}
+
+checkTomcatHome() {
+    if [ -z "$TOMCAT_HOME" ] || [ ! -d "$TOMCAT_HOME" ]; then
+        errorArtHome "Tomcat Artifactory folder not defined or does not exists at $TOMCAT_HOME"
+    fi
+}
+
+checkArtUser() {
+    # User under which tomcat will run
+    if [ -z "$ARTIFACTORY_USER" ]; then
+        # Will run as current user (may be root!!!)
+        ARTIFACTORY_USER=$USER
+    fi
+}
+
+findShutdownPort() {
+    SHUTDOWN_PORT=`netstat -vatn|grep LISTEN|grep $CATALINA_MGNT_PORT|wc -l`
+}
+
+isAlive() {
+    pidValue=""
+    javaPs=""
+    if [ -e "$ARTIFACTORY_PID" ]; then
+        pidValue=`cat $ARTIFACTORY_PID`
+        if [ -n "$pidValue" ]; then
+            javaPs="`ps -p $pidValue | grep java`"
+        fi
+    fi
+}
+
+start() {
+    # Start Tomcat in normal mode
+    isAlive
+    findShutdownPort
+    if [ $SHUTDOWN_PORT -ne 0 ] || [ -n "$javaPs" ]; then
+        echo "Artifactory Tomcat already started"
+    else
+        echo "Starting Artifactory tomcat as user $ARTIFACTORY_USER..."
+        noFileVal=`ulimit -n`
+        minNoFileMax=32000
+        if [ "$noFileVal" != "unlimited" ] && [ $noFileVal -lt $minNoFileMax ]; then
+            ulimit -n $minNoFileMax || echo "WARNING: Max number of open files $noFileVal is too small!
+You should add:
+artifactory soft nofile $minNoFileMax
+artifactory hard nofile $minNoFileMax
+to your /etc/security/limits.conf file."
+        fi
+
+        #
+        minNbProcess=1024
+        nbProcess=`ulimit -u`
+        if [ "$nbProcess" != "unlimited" ] && [ $nbProcess -lt $minNbProcess ]; then
+            ulimit -u $minNbProcess || echo "WARNING: Number of processes $nbProcess is too small!
+You should add:
+artifactory soft nproc $minNbProcess
+artifactory hard nproc $minNbProcess
+to your /etc/security/limits.conf file."
+        fi
+        su -s "/bin/sh" $ARTIFACTORY_USER -c "export JAVA_HOME='$JAVA_HOME'; $TOMCAT_HOME/bin/startup.sh"
+        RETVAL=$?
+        if [ $RETVAL -ne 0 ]; then
+            errorArtHome "Artifactory Tomcat server did not start. Please check the logs"
+        fi
+        findShutdownPort
+        nbSeconds=1
+        START_TMO=${START_TMO:-60}
+        while [ $SHUTDOWN_PORT -eq 0 ] && [ $nbSeconds -lt $START_TMO ]; do
+            sleep 1
+            let "nbSeconds = $nbSeconds + 1"
+            findShutdownPort
+        done
+        if [ $SHUTDOWN_PORT -eq 0 ]; then
+            errorArtHome "Artifactory Tomcat server did not start in 60 seconds. Please check the logs"
+        fi
+        echo "Artifactory Tomcat started in normal mode"
+        [ $RETVAL=0 ] && touch $CATALINA_LOCK_FILE
+    fi
+}
+
+stop() {
+    isAlive
+    findShutdownPort
+    if [ $SHUTDOWN_PORT -eq 0 ] && [ -z "$javaPs" ]; then
+        echo "Artifactory Tomcat already stopped"
+        RETVAL=0
+    else
+        echo "Stopping Artifactory Tomcat..."
+        if [ $SHUTDOWN_PORT -ne 0 ]; then
+            su -s "/bin/sh" $ARTIFACTORY_USER -c "export JAVA_HOME='$JAVA_HOME'; $TOMCAT_HOME/bin/shutdown.sh"
+            RETVAL=$?
+        else
+            RETVAL=1
+        fi
+        killed=false
+        if [ $RETVAL -ne 0 ]; then
+            echo "WARN: Artifactory Tomcat server shutdown script failed. Sending kill signal to $pidValue"
+            if [ -n "$pidValue" ]; then
+                killed=true
+                kill $pidValue
+                RETVAL=$?
+            fi
+        fi
+        # Wait 2 seconds for process to die
+        sleep 2
+        findShutdownPort
+        isAlive
+        nbSeconds=1
+        while [ $SHUTDOWN_PORT -ne 0 ] || [ -n "$javaPs" ] && [ $nbSeconds -lt 30 ]; do
+            if [ $nbSeconds -eq 10 ] && [ -n "$pidValue" ]; then
+                # After 10 seconds try to kill the process
+                echo "WARN: Artifactory Tomcat server shutdown not done after 10 seconds. Sending kill signal"
+                kill $pidValue
+                RETVAL=$?
+            fi
+            if [ $nbSeconds -eq 25 ] && [ -n "$pidValue" ]; then
+                # After 25 seconds try to kill -9 the process
+                echo "WARN: Artifactory Tomcat server shutdown not done after 25 seconds. Sending kill -9 signal"
+                kill -9 $pidValue
+                RETVAL=$?
+            fi
+            sleep 1
+            let "nbSeconds = $nbSeconds + 1"
+            findShutdownPort
+            isAlive
+        done
+        if [ $SHUTDOWN_PORT -eq 0 ] && [ -z "$javaPs" ]; then
+           echo "Artifactory Tomcat stopped"
+        else
+           echo "ERROR: Artifactory Tomcat did not stop"
+           RETVAL=1
+        fi
+    fi
+    [ $RETVAL=0 ] && rm -f "$CATALINA_LOCK_FILE" "$ARTIFACTORY_PID"
+}
+
+start_and_wait() {
+    start
+    if [ -e $ARTIFACTORY_PID ]; then
+	PID=$(cat $ARTIFACTORY_PID)
+	while [ ! -e ~artifactory/logs/artifactory.log ]; do
+	    sleep 10
+	done
+	tail -f ~artifactory/logs/artifactory.log &
+	terminating() {
+	    echo received stop
+	    stop
+	    while [ -e $ARTIFACTORY_PID ] || [ ps $PID >/dev/null 2>&1 ]; do
+		sleep 1
+	    done
+	    exit 0
+	}
+	trap terminating SIGINT SIGTERM
+	while :; do
+	    sleep 5
+	done
+    fi
+    echo Something went wrong $PID $?
+}
+
+status() {
+    findShutdownPort
+    if [ $SHUTDOWN_PORT -eq 0 ]; then
+        if [ -e "$ARTIFACTORY_PID" ]; then
+            echo "ERROR: Artifactory is stopped but the pid file $ARTIFACTORY_PID still exist"
+            RETVAL=1
+        else
+            if [ -e "$CATALINA_LOCK_FILE" ]; then
+                echo "ERROR: Artifactory is stopped but the lock file $CATALINA_LOCK_FILE still exist"
+                RETVAL=2
+            else
+                echo "Artifactory Tomcat stopped"
+                RETVAL=3
+            fi
+        fi
+    else
+        echo "Artifactory Tomcat running"
+        RETVAL=0
+    fi
+}
+
+check() {
+    if [ -f $ARTIFACTORY_PID ]; then
+        echo "Artifactory is running, on pid="`cat $ARTIFACTORY_PID`
+        echo ""
+        exit 0
+    fi
+
+    echo "Checking arguments to Artifactory: "
+    echo "ARTIFACTORY_HOME     =  $ARTIFACTORY_HOME"
+    echo "ARTIFACTORY_USER     =  $ARTIFACTORY_USER"
+    echo "TOMCAT_HOME          =  $TOMCAT_HOME"
+    echo "ARTIFACTORY_PID      =  $ARTIFACTORY_PID"
+    echo "JAVA_HOME            =  $JAVA_HOME"
+    echo "JAVA_OPTIONS         =  $JAVA_OPTIONS"
+    echo
+
+    checkJavaVersion
+
+    exit 1
+}
+
+checkJavaVersion(){
+    if [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]];  then
+        echo found java executable in JAVA_HOME
+        _java="$JAVA_HOME/bin/java"
+    elif type -p java; then
+        _java=java
+    else
+        echo "no java"
+    fi
+
+    if [[ "$_java" ]]; then
+        "$_java" -version 2>&1| \
+        awk -F\" '/version/{\
+            if ($2 < 1.8) {\
+                printf "%s is too old must be at least java 1.8\n", $2;\
+                exit 0;\
+            } else exit 1}' && exit 99
+    fi
+}
+
+#
+ARTIFACTORY_PID=""
+artDefaultFile="/etc/opt/jfrog/artifactory/default"
+
+if [ ! -e $artDefaultFile ]; then
+    sed '/ARTIFACTORY/s/^#//;/ARTIFACTORY_PID/s-$ARTIFACTORY_HOME-/var/opt/jfrog-' </opt/jfrog/artifactory/bin/artifactory.default >$artDefaultFile
+fi
+
+. $artDefaultFile || errorArtHome "ERROR: $artDefaultFile does not exist or not executable"
+
+checkArtHome
+
+checkArtPid
+
+checkTomcatHome
+
+# Basic variables used
+CATALINA_MGNT_PORT=8015
+CATALINA_PID_FOLDER="$(dirname "$ARTIFACTORY_PID")"
+CATALINA_LOCK_FILE=$CATALINA_PID_FOLDER/lock
+RETVAL=0
+
+checkArtUser
+
+case "$1" in
+  start)
+        checkJavaVersion
+        start
+        ;;
+  wait)
+        checkJavaVersion
+	    start_and_wait
+	    ;;
+  stop)
+        stop
+        ;;
+  restart)
+        stop
+        start
+        ;;
+  redebug)
+        stop
+        debug
+        ;;
+  status)
+        status
+        ;;
+  check)
+        check
+        ;;
+  *)
+        echo "Usage: $0 {start|stop|restart|redebug|status|check}"
+        exit 1
+        ;;
+esac
+
+exit $RETVAL
diff --git a/distribution/standalone/src/main/install/misc/service/setenv.sh b/misc/service/setenv.sh
similarity index 100%
rename from distribution/standalone/src/main/install/misc/service/setenv.sh
rename to misc/service/setenv.sh
diff --git a/distribution/standalone/src/main/install/misc/tomcat/NGNIX.txt b/misc/tomcat/NGNIX.txt
similarity index 100%
rename from distribution/standalone/src/main/install/misc/tomcat/NGNIX.txt
rename to misc/tomcat/NGNIX.txt
diff --git a/distribution/standalone/src/main/install/misc/tomcat/artifactory.httpd.conf b/misc/tomcat/artifactory.httpd.conf
similarity index 100%
rename from distribution/standalone/src/main/install/misc/tomcat/artifactory.httpd.conf
rename to misc/tomcat/artifactory.httpd.conf
diff --git a/distribution/standalone/src/main/install/misc/tomcat/artifactory.xml b/misc/tomcat/artifactory.xml
similarity index 100%
copy from distribution/standalone/src/main/install/misc/tomcat/artifactory.xml
copy to misc/tomcat/artifactory.xml
diff --git a/distribution/standalone/src/main/install/misc/tomcat/index.html b/misc/tomcat/index.html
similarity index 100%
copy from distribution/standalone/src/main/install/misc/tomcat/index.html
copy to misc/tomcat/index.html
diff --git a/distribution/standalone/src/main/install/misc/tomcat/logging.properties b/misc/tomcat/logging.properties
similarity index 100%
copy from distribution/standalone/src/main/install/misc/tomcat/logging.properties
copy to misc/tomcat/logging.properties
diff --git a/distribution/standalone/src/main/install/misc/tomcat/server.xml b/misc/tomcat/server.xml
similarity index 100%
copy from distribution/standalone/src/main/install/misc/tomcat/server.xml
copy to misc/tomcat/server.xml
diff --git a/misc/tomcat/web.xml b/misc/tomcat/web.xml
new file mode 100644
index 0000000..c0b5459
--- /dev/null
+++ b/misc/tomcat/web.xml
@@ -0,0 +1,4612 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<web-app xmlns="http://java.sun.com/xml/ns/javaee"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
+                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
+         version="3.0">
+
+    <!-- ======================== Introduction ============================== -->
+    <!-- This document defines default values for *all* web applications      -->
+    <!-- loaded into this instance of Tomcat.  As each application is         -->
+    <!-- deployed, this file is processed, followed by the                    -->
+    <!-- "/WEB-INF/web.xml" deployment descriptor from your own               -->
+    <!-- applications.                                                        -->
+    <!--                                                                      -->
+    <!-- WARNING:  Do not configure application-specific resources here!      -->
+    <!-- They should go in the "/WEB-INF/web.xml" file in your application.   -->
+
+
+    <!-- ================== Built In Servlet Definitions ==================== -->
+
+
+    <!-- The default servlet for all web applications, that serves static     -->
+    <!-- resources.  It processes all requests that are not mapped to other   -->
+    <!-- servlets with servlet mappings (defined either here or in your own   -->
+    <!-- web.xml file).  This servlet supports the following initialization   -->
+    <!-- parameters (default values are in square brackets):                  -->
+    <!--                                                                      -->
+    <!--   debug               Debugging detail level for messages logged     -->
+    <!--                       by this servlet.  [0]                          -->
+    <!--                                                                      -->
+    <!--   fileEncoding        Encoding to be used to read static resources   -->
+    <!--                       [platform default]                             -->
+    <!--                                                                      -->
+    <!--   input               Input buffer size (in bytes) when reading      -->
+    <!--                       resources to be served.  [2048]                -->
+    <!--                                                                      -->
+    <!--   listings            Should directory listings be produced if there -->
+    <!--                       is no welcome file in this directory?  [false] -->
+    <!--                       WARNING: Listings for directories with many    -->
+    <!--                       entries can be slow and may consume            -->
+    <!--                       significant proportions of server resources.   -->
+    <!--                                                                      -->
+    <!--   output              Output buffer size (in bytes) when writing     -->
+    <!--                       resources to be served.  [2048]                -->
+    <!--                                                                      -->
+    <!--   readonly            Is this context "read only", so HTTP           -->
+    <!--                       commands like PUT and DELETE are               -->
+    <!--                       rejected?  [true]                              -->
+    <!--                                                                      -->
+    <!--   readmeFile          File to display together with the directory    -->
+    <!--                       contents. [null]                               -->
+    <!--                                                                      -->
+    <!--   sendfileSize        If the connector used supports sendfile, this  -->
+    <!--                       represents the minimal file size in KB for     -->
+    <!--                       which sendfile will be used. Use a negative    -->
+    <!--                       value to always disable sendfile.  [48]        -->
+    <!--                                                                      -->
+    <!--   useAcceptRanges     Should the Accept-Ranges header be included    -->
+    <!--                       in responses where appropriate? [true]         -->
+    <!--                                                                      -->
+    <!--  For directory listing customization. Checks localXsltFile, then     -->
+    <!--  globalXsltFile, then defaults to original behavior.                 -->
+    <!--                                                                      -->
+    <!--   localXsltFile       Make directory listings an XML doc and         -->
+    <!--                       pass the result to this style sheet residing   -->
+    <!--                       in that directory. This overrides              -->
+    <!--                       contextXsltFile and globalXsltFile[null]       -->
+    <!--                                                                      -->
+    <!--   contextXsltFile     Make directory listings an XML doc and         -->
+    <!--                       pass the result to this style sheet which is   -->
+    <!--                       relative to the context root. This overrides   -->
+    <!--                       globalXsltFile[null]                           -->
+    <!--                                                                      -->
+    <!--   globalXsltFile      Site wide configuration version of             -->
+    <!--                       localXsltFile This argument is expected        -->
+    <!--                       to be a physical file. [null]                  -->
+    <!--                                                                      -->
+    <!--                                                                      -->
+
+    <servlet>
+        <servlet-name>default</servlet-name>
+        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
+        <init-param>
+            <param-name>debug</param-name>
+            <param-value>0</param-value>
+        </init-param>
+        <init-param>
+            <param-name>listings</param-name>
+            <param-value>false</param-value>
+        </init-param>
+        <load-on-startup>1</load-on-startup>
+    </servlet>
+
+
+    <!-- The JSP page compiler and execution servlet, which is the mechanism  -->
+    <!-- used by Tomcat to support JSP pages.  Traditionally, this servlet    -->
+    <!-- is mapped to the URL pattern "*.jsp".  This servlet supports the     -->
+    <!-- following initialization parameters (default values are in square    -->
+    <!-- brackets):                                                           -->
+    <!--                                                                      -->
+    <!--   checkInterval       If development is false and checkInterval is   -->
+    <!--                       greater than zero, background compilations are -->
+    <!--                       enabled. checkInterval is the time in seconds  -->
+    <!--                       between checks to see if a JSP page (and its   -->
+    <!--                       dependent files) needs to  be recompiled. [0]  -->
+    <!--                                                                      -->
+    <!--   classdebuginfo      Should the class file be compiled with         -->
+    <!--                       debugging information?  [true]                 -->
+    <!--                                                                      -->
+    <!--   classpath           What class path should I use while compiling   -->
+    <!--                       generated servlets?  [Created dynamically      -->
+    <!--                       based on the current web application]          -->
+    <!--                                                                      -->
+    <!--   compiler            Which compiler Ant should use to compile JSP   -->
+    <!--                       pages.  See the jasper documentation for more  -->
+    <!--                       information.                                   -->
+    <!--                                                                      -->
+    <!--   compilerSourceVM    Compiler source VM. [1.6]                      -->
+    <!--                                                                      -->
+    <!--   compilerTargetVM    Compiler target VM. [1.6]                      -->
+    <!--                                                                      -->
+    <!--   development         Is Jasper used in development mode? If true,   -->
+    <!--                       the frequency at which JSPs are checked for    -->
+    <!--                       modification may be specified via the          -->
+    <!--                       modificationTestInterval parameter. [true]     -->
+    <!--                                                                      -->
+    <!--   displaySourceFragment                                              -->
+    <!--                       Should a source fragment be included in        -->
+    <!--                       exception messages? [true]                     -->
+    <!--                                                                      -->
+    <!--   dumpSmap            Should the SMAP info for JSR45 debugging be    -->
+    <!--                       dumped to a file? [false]                      -->
+    <!--                       False if suppressSmap is true                  -->
+    <!--                                                                      -->
+    <!--   enablePooling       Determines whether tag handler pooling is      -->
+    <!--                       enabled. This is a compilation option. It will -->
+    <!--                       not alter the behaviour of JSPs that have      -->
+    <!--                       already been compiled. [true]                  -->
+    <!--                                                                      -->
+    <!--   engineOptionsClass  Allows specifying the Options class used to    -->
+    <!--                       configure Jasper. If not present, the default  -->
+    <!--                       EmbeddedServletOptions will be used.           -->
+    <!--                                                                      -->
+    <!--   errorOnUseBeanInvalidClassAttribute                                -->
+    <!--                       Should Jasper issue an error when the value of -->
+    <!--                       the class attribute in an useBean action is    -->
+    <!--                       not a valid bean class?  [true]                -->
+    <!--                                                                      -->
+    <!--   fork                Tell Ant to fork compiles of JSP pages so that -->
+    <!--                       a separate JVM is used for JSP page compiles   -->
+    <!--                       from the one Tomcat is running in. [true]      -->
+    <!--                                                                      -->
+    <!--   genStringAsCharArray                                               -->
+    <!--                       Should text strings be generated as char       -->
+    <!--                       arrays, to improve performance in some cases?  -->
+    <!--                       [false]                                        -->
+    <!--                                                                      -->
+    <!--   ieClassId           The class-id value to be sent to Internet      -->
+    <!--                       Explorer when using <jsp:plugin> tags.         -->
+    <!--                       [clsid:8AD9C840-044E-11D1-B3E9-00805F499D93]   -->
+    <!--                                                                      -->
+    <!--   javaEncoding        Java file encoding to use for generating java  -->
+    <!--                       source files. [UTF8]                           -->
+    <!--                                                                      -->
+    <!--   keepgenerated       Should we keep the generated Java source code  -->
+    <!--                       for each page instead of deleting it? [true]   -->
+    <!--                                                                      -->
+    <!--   mappedfile          Should we generate static content with one     -->
+    <!--                       print statement per input line, to ease        -->
+    <!--                       debugging?  [true]                             -->
+    <!--                                                                      -->
+    <!--   maxLoadedJsps       The maximum number of JSPs that will be loaded -->
+    <!--                       for a web application. If more than this       -->
+    <!--                       number of JSPs are loaded, the least recently  -->
+    <!--                       used JSPs will be unloaded so that the number  -->
+    <!--                       of JSPs loaded at any one time does not exceed -->
+    <!--                       this limit. A value of zero or less indicates  -->
+    <!--                       no limit. [-1]                                 -->
+    <!--                                                                      -->
+    <!--   jspIdleTimeout      The amount of time in seconds a JSP can be     -->
+    <!--                       idle before it is unloaded. A value of zero    -->
+    <!--                       or less indicates never unload. [-1]           -->
+    <!--                                                                      -->
+    <!--   modificationTestInterval                                           -->
+    <!--                       Causes a JSP (and its dependent files) to not  -->
+    <!--                       be checked for modification during the         -->
+    <!--                       specified time interval (in seconds) from the  -->
+    <!--                       last time the JSP was checked for              -->
+    <!--                       modification. A value of 0 will cause the JSP  -->
+    <!--                       to be checked on every access.                 -->
+    <!--                       Used in development mode only. [4]             -->
+    <!--                                                                      -->
+    <!--   recompileOnFail     If a JSP compilation fails should the          -->
+    <!--                       modificationTestInterval be ignored and the    -->
+    <!--                       next access trigger a re-compilation attempt?  -->
+    <!--                       Used in development mode only and is disabled  -->
+    <!--                       by default as compilation may be expensive and -->
+    <!--                       could lead to excessive resource usage.        -->
+    <!--                       [false]                                        -->
+    <!--                                                                      -->
+    <!--   scratchdir          What scratch directory should we use when      -->
+    <!--                       compiling JSP pages?  [default work directory  -->
+    <!--                       for the current web application]               -->
+    <!--                                                                      -->
+    <!--   suppressSmap        Should the generation of SMAP info for JSR45   -->
+    <!--                       debugging be suppressed?  [false]              -->
+    <!--                                                                      -->
+    <!--   trimSpaces          Should white spaces in template text between   -->
+    <!--                       actions or directives be trimmed?  [false]     -->
+    <!--                                                                      -->
+    <!--   xpoweredBy          Determines whether X-Powered-By response       -->
+    <!--                       header is added by generated servlet.  [false] -->
+
+    <!--
+        <servlet>
+            <servlet-name>jsp</servlet-name>
+            <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
+            <init-param>
+                <param-name>fork</param-name>
+                <param-value>false</param-value>
+            </init-param>
+            <init-param>
+                <param-name>xpoweredBy</param-name>
+                <param-value>false</param-value>
+            </init-param>
+            <load-on-startup>3</load-on-startup>
+        </servlet>
+    -->
+
+    <!-- NOTE: An SSI Filter is also available as an alternative SSI          -->
+    <!-- implementation. Use either the Servlet or the Filter but NOT both.   -->
+    <!--                                                                      -->
+    <!-- Server Side Includes processing servlet, which processes SSI         -->
+    <!-- directives in HTML pages consistent with similar support in web      -->
+    <!-- servers like Apache.  Traditionally, this servlet is mapped to the   -->
+    <!-- URL pattern "*.shtml".  This servlet supports the following          -->
+    <!-- initialization parameters (default values are in square brackets):   -->
+    <!--                                                                      -->
+    <!--   buffered            Should output from this servlet be buffered?   -->
+    <!--                       (0=false, 1=true)  [0]                         -->
+    <!--                                                                      -->
+    <!--   debug               Debugging detail level for messages logged     -->
+    <!--                       by this servlet.  [0]                          -->
+    <!--                                                                      -->
+    <!--   expires             The number of seconds before a page with SSI   -->
+    <!--                       directives will expire.  [No default]          -->
+    <!--                                                                      -->
+    <!--   isVirtualWebappRelative                                            -->
+    <!--                       Should "virtual" paths be interpreted as       -->
+    <!--                       relative to the context root, instead of       -->
+    <!--                       the server root? [false]                       -->
+    <!--                                                                      -->
+    <!--   inputEncoding       The encoding to assume for SSI resources if    -->
+    <!--                       one is not available from the resource.        -->
+    <!--                       [Platform default]                             -->
+    <!--                                                                      -->
+    <!--   outputEncoding      The encoding to use for the page that results  -->
+    <!--                       from the SSI processing. [UTF-8]               -->
+    <!--                                                                      -->
+    <!--   allowExec           Is use of the exec command enabled? [false]    -->
+
+    <!--
+        <servlet>
+            <servlet-name>ssi</servlet-name>
+            <servlet-class>
+              org.apache.catalina.ssi.SSIServlet
+            </servlet-class>
+            <init-param>
+              <param-name>buffered</param-name>
+              <param-value>1</param-value>
+            </init-param>
+            <init-param>
+              <param-name>debug</param-name>
+              <param-value>0</param-value>
+            </init-param>
+            <init-param>
+              <param-name>expires</param-name>
+              <param-value>666</param-value>
+            </init-param>
+            <init-param>
+              <param-name>isVirtualWebappRelative</param-name>
+              <param-value>false</param-value>
+            </init-param>
+            <load-on-startup>4</load-on-startup>
+        </servlet>
+    -->
+
+
+    <!-- Common Gateway Includes (CGI) processing servlet, which supports     -->
+    <!-- execution of external applications that conform to the CGI spec      -->
+    <!-- requirements.  Typically, this servlet is mapped to the URL pattern  -->
+    <!-- "/cgi-bin/*", which means that any CGI applications that are         -->
+    <!-- executed must be present within the web application.  This servlet   -->
+    <!-- supports the following initialization parameters (default values     -->
+    <!-- are in square brackets):                                             -->
+    <!--                                                                      -->
+    <!--   cgiPathPrefix        The CGI search path will start at             -->
+    <!--                        webAppRootDir + File.separator + this prefix. -->
+    <!--                        [WEB-INF/cgi]                                 -->
+    <!--                                                                      -->
+    <!--   debug                Debugging detail level for messages logged    -->
+    <!--                        by this servlet.  [0]                         -->
+    <!--                                                                      -->
+    <!--   executable           Name of the executable used to run the        -->
+    <!--                        script. [perl]                                -->
+    <!--                                                                      -->
+    <!--   parameterEncoding    Name of parameter encoding to be used with    -->
+    <!--                        CGI servlet.                                  -->
+    <!--                        [System.getProperty("file.encoding","UTF-8")] -->
+    <!--                                                                      -->
+    <!--   passShellEnvironment Should the shell environment variables (if    -->
+    <!--                        any) be passed to the CGI script? [false]     -->
+    <!--                                                                      -->
+    <!--   stderrTimeout        The time (in milliseconds) to wait for the    -->
+    <!--                        reading of stderr to complete before          -->
+    <!--                        terminating the CGI process. [2000]           -->
+
+    <!--
+        <servlet>
+            <servlet-name>cgi</servlet-name>
+            <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
+            <init-param>
+              <param-name>debug</param-name>
+              <param-value>0</param-value>
+            </init-param>
+            <init-param>
+              <param-name>cgiPathPrefix</param-name>
+              <param-value>WEB-INF/cgi</param-value>
+            </init-param>
+             <load-on-startup>5</load-on-startup>
+        </servlet>
+    -->
+
+
+    <!-- ================ Built In Servlet Mappings ========================= -->
+
+
+    <!-- The servlet mappings for the built in servlets defined above.  Note  -->
+    <!-- that, by default, the CGI and SSI servlets are *not* mapped.  You    -->
+    <!-- must uncomment these mappings (or add them to your application's own -->
+    <!-- web.xml deployment descriptor) to enable these services              -->
+
+    <!-- The mapping for the default servlet -->
+    <servlet-mapping>
+        <servlet-name>default</servlet-name>
+        <url-pattern>/</url-pattern>
+    </servlet-mapping>
+
+    <!-- The mappings for the JSP servlet -->
+    <!--
+        <servlet-mapping>
+            <servlet-name>jsp</servlet-name>
+            <url-pattern>*.jsp</url-pattern>
+            <url-pattern>*.jspx</url-pattern>
+        </servlet-mapping>
+    -->
+
+    <!-- The mapping for the SSI servlet -->
+    <!--
+        <servlet-mapping>
+            <servlet-name>ssi</servlet-name>
+            <url-pattern>*.shtml</url-pattern>
+        </servlet-mapping>
+    -->
+
+    <!-- The mapping for the CGI Gateway servlet -->
+
+    <!--
+        <servlet-mapping>
+            <servlet-name>cgi</servlet-name>
+            <url-pattern>/cgi-bin/*</url-pattern>
+        </servlet-mapping>
+    -->
+
+
+    <!-- ================== Built In Filter Definitions ===================== -->
+
+    <!-- A filter that sets character encoding that is used to decode -->
+    <!-- parameters in a POST request -->
+    <!--
+        <filter>
+            <filter-name>setCharacterEncodingFilter</filter-name>
+            <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
+            <init-param>
+                <param-name>encoding</param-name>
+                <param-value>UTF-8</param-value>
+            </init-param>
+            <async-supported>true</async-supported>
+        </filter>
+    -->
+
+    <!-- A filter that triggers request parameters parsing and rejects the    -->
+    <!-- request if some parameters were skipped because of parsing errors or -->
+    <!-- request size limitations.                                            -->
+    <!--
+        <filter>
+            <filter-name>failedRequestFilter</filter-name>
+            <filter-class>
+              org.apache.catalina.filters.FailedRequestFilter
+            </filter-class>
+            <async-supported>true</async-supported>
+        </filter>
+    -->
+
+
+    <!-- NOTE: An SSI Servlet is also available as an alternative SSI         -->
+    <!-- implementation. Use either the Servlet or the Filter but NOT both.   -->
+    <!--                                                                      -->
+    <!-- Server Side Includes processing filter, which processes SSI          -->
+    <!-- directives in HTML pages consistent with similar support in web      -->
+    <!-- servers like Apache.  Traditionally, this filter is mapped to the    -->
+    <!-- URL pattern "*.shtml", though it can be mapped to "*" as it will     -->
+    <!-- selectively enable/disable SSI processing based on mime types. For   -->
+    <!-- this to work you will need to uncomment the .shtml mime type         -->
+    <!-- definition towards the bottom of this file.                          -->
+    <!-- The contentType init param allows you to apply SSI processing to JSP -->
+    <!-- pages, javascript, or any other content you wish.  This filter       -->
+    <!-- supports the following initialization parameters (default values are -->
+    <!-- in square brackets):                                                 -->
+    <!--                                                                      -->
+    <!--   contentType         A regex pattern that must be matched before    -->
+    <!--                       SSI processing is applied.                     -->
+    <!--                       [text/x-server-parsed-html(;.*)?]              -->
+    <!--                                                                      -->
+    <!--   debug               Debugging detail level for messages logged     -->
+    <!--                       by this servlet.  [0]                          -->
+    <!--                                                                      -->
+    <!--   expires             The number of seconds before a page with SSI   -->
+    <!--                       directives will expire.  [No default]          -->
+    <!--                                                                      -->
+    <!--   isVirtualWebappRelative                                            -->
+    <!--                       Should "virtual" paths be interpreted as       -->
+    <!--                       relative to the context root, instead of       -->
+    <!--                       the server root? [false]                       -->
+    <!--                                                                      -->
+    <!--   allowExec           Is use of the exec command enabled? [false]    -->
+
+    <!--
+        <filter>
+            <filter-name>ssi</filter-name>
+            <filter-class>
+              org.apache.catalina.ssi.SSIFilter
+            </filter-class>
+            <init-param>
+              <param-name>contentType</param-name>
+              <param-value>text/x-server-parsed-html(;.*)?</param-value>
+            </init-param>
+            <init-param>
+              <param-name>debug</param-name>
+              <param-value>0</param-value>
+            </init-param>
+            <init-param>
+              <param-name>expires</param-name>
+              <param-value>666</param-value>
+            </init-param>
+            <init-param>
+              <param-name>isVirtualWebappRelative</param-name>
+              <param-value>false</param-value>
+            </init-param>
+        </filter>
+    -->
+
+
+    <!-- ==================== Built In Filter Mappings ====================== -->
+
+    <!-- The mapping for the Set Character Encoding Filter -->
+    <!--
+        <filter-mapping>
+            <filter-name>setCharacterEncodingFilter</filter-name>
+            <url-pattern>/*</url-pattern>
+        </filter-mapping>
+    -->
+
+    <!-- The mapping for the Failed Request Filter -->
+    <!--
+        <filter-mapping>
+            <filter-name>failedRequestFilter</filter-name>
+            <url-pattern>/*</url-pattern>
+        </filter-mapping>
+    -->
+
+    <!-- The mapping for the SSI Filter -->
+    <!--
+        <filter-mapping>
+            <filter-name>ssi</filter-name>
+            <url-pattern>*.shtml</url-pattern>
+        </filter-mapping>
+    -->
+
+
+    <!-- ==================== Default Session Configuration ================= -->
+    <!-- You can set the default session timeout (in minutes) for all newly   -->
+    <!-- created sessions by modifying the value below.                       -->
+
+    <session-config>
+        <session-timeout>30</session-timeout>
+    </session-config>
+
+
+    <!-- ===================== Default MIME Type Mappings =================== -->
+    <!-- When serving static resources, Tomcat will automatically generate    -->
+    <!-- a "Content-Type" header based on the resource's filename extension,  -->
+    <!-- based on these mappings.  Additional mappings can be added here (to  -->
+    <!-- apply to all web applications), or in your own application's web.xml -->
+    <!-- deployment descriptor.                                               -->
+
+    <mime-mapping>
+        <extension>123</extension>
+        <mime-type>application/vnd.lotus-1-2-3</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>3dml</extension>
+        <mime-type>text/vnd.in3d.3dml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>3ds</extension>
+        <mime-type>image/x-3ds</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>3g2</extension>
+        <mime-type>video/3gpp2</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>3gp</extension>
+        <mime-type>video/3gpp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>7z</extension>
+        <mime-type>application/x-7z-compressed</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>aab</extension>
+        <mime-type>application/x-authorware-bin</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>aac</extension>
+        <mime-type>audio/x-aac</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>aam</extension>
+        <mime-type>application/x-authorware-map</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>aas</extension>
+        <mime-type>application/x-authorware-seg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>abs</extension>
+        <mime-type>audio/x-mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>abw</extension>
+        <mime-type>application/x-abiword</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ac</extension>
+        <mime-type>application/pkix-attr-cert</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>acc</extension>
+        <mime-type>application/vnd.americandynamics.acc</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ace</extension>
+        <mime-type>application/x-ace-compressed</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>acu</extension>
+        <mime-type>application/vnd.acucobol</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>acutc</extension>
+        <mime-type>application/vnd.acucorp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>adp</extension>
+        <mime-type>audio/adpcm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>aep</extension>
+        <mime-type>application/vnd.audiograph</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>afm</extension>
+        <mime-type>application/x-font-type1</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>afp</extension>
+        <mime-type>application/vnd.ibm.modcap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ahead</extension>
+        <mime-type>application/vnd.ahead.space</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ai</extension>
+        <mime-type>application/postscript</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>aif</extension>
+        <mime-type>audio/x-aiff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>aifc</extension>
+        <mime-type>audio/x-aiff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>aiff</extension>
+        <mime-type>audio/x-aiff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>aim</extension>
+        <mime-type>application/x-aim</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>air</extension>
+        <mime-type>application/vnd.adobe.air-application-installer-package+zip</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ait</extension>
+        <mime-type>application/vnd.dvb.ait</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ami</extension>
+        <mime-type>application/vnd.amiga.ami</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>anx</extension>
+        <mime-type>application/annodex</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>apk</extension>
+        <mime-type>application/vnd.android.package-archive</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>appcache</extension>
+        <mime-type>text/cache-manifest</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>application</extension>
+        <mime-type>application/x-ms-application</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>apr</extension>
+        <mime-type>application/vnd.lotus-approach</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>arc</extension>
+        <mime-type>application/x-freearc</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>art</extension>
+        <mime-type>image/x-jg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>asc</extension>
+        <mime-type>application/pgp-signature</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>asf</extension>
+        <mime-type>video/x-ms-asf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>asm</extension>
+        <mime-type>text/x-asm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>aso</extension>
+        <mime-type>application/vnd.accpac.simply.aso</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>asx</extension>
+        <mime-type>video/x-ms-asf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>atc</extension>
+        <mime-type>application/vnd.acucorp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>atom</extension>
+        <mime-type>application/atom+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>atomcat</extension>
+        <mime-type>application/atomcat+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>atomsvc</extension>
+        <mime-type>application/atomsvc+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>atx</extension>
+        <mime-type>application/vnd.antix.game-component</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>au</extension>
+        <mime-type>audio/basic</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>avi</extension>
+        <mime-type>video/x-msvideo</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>avx</extension>
+        <mime-type>video/x-rad-screenplay</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>aw</extension>
+        <mime-type>application/applixware</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>axa</extension>
+        <mime-type>audio/annodex</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>axv</extension>
+        <mime-type>video/annodex</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>azf</extension>
+        <mime-type>application/vnd.airzip.filesecure.azf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>azs</extension>
+        <mime-type>application/vnd.airzip.filesecure.azs</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>azw</extension>
+        <mime-type>application/vnd.amazon.ebook</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>bat</extension>
+        <mime-type>application/x-msdownload</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>bcpio</extension>
+        <mime-type>application/x-bcpio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>bdf</extension>
+        <mime-type>application/x-font-bdf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>bdm</extension>
+        <mime-type>application/vnd.syncml.dm+wbxml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>bed</extension>
+        <mime-type>application/vnd.realvnc.bed</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>bh2</extension>
+        <mime-type>application/vnd.fujitsu.oasysprs</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>bin</extension>
+        <mime-type>application/octet-stream</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>blb</extension>
+        <mime-type>application/x-blorb</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>blorb</extension>
+        <mime-type>application/x-blorb</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>bmi</extension>
+        <mime-type>application/vnd.bmi</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>bmp</extension>
+        <mime-type>image/bmp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>body</extension>
+        <mime-type>text/html</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>book</extension>
+        <mime-type>application/vnd.framemaker</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>box</extension>
+        <mime-type>application/vnd.previewsystems.box</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>boz</extension>
+        <mime-type>application/x-bzip2</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>bpk</extension>
+        <mime-type>application/octet-stream</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>btif</extension>
+        <mime-type>image/prs.btif</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>bz</extension>
+        <mime-type>application/x-bzip</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>bz2</extension>
+        <mime-type>application/x-bzip2</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>c</extension>
+        <mime-type>text/x-c</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>c11amc</extension>
+        <mime-type>application/vnd.cluetrust.cartomobile-config</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>c11amz</extension>
+        <mime-type>application/vnd.cluetrust.cartomobile-config-pkg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>c4d</extension>
+        <mime-type>application/vnd.clonk.c4group</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>c4f</extension>
+        <mime-type>application/vnd.clonk.c4group</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>c4g</extension>
+        <mime-type>application/vnd.clonk.c4group</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>c4p</extension>
+        <mime-type>application/vnd.clonk.c4group</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>c4u</extension>
+        <mime-type>application/vnd.clonk.c4group</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cab</extension>
+        <mime-type>application/vnd.ms-cab-compressed</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>caf</extension>
+        <mime-type>audio/x-caf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cap</extension>
+        <mime-type>application/vnd.tcpdump.pcap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>car</extension>
+        <mime-type>application/vnd.curl.car</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cat</extension>
+        <mime-type>application/vnd.ms-pki.seccat</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cb7</extension>
+        <mime-type>application/x-cbr</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cba</extension>
+        <mime-type>application/x-cbr</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cbr</extension>
+        <mime-type>application/x-cbr</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cbt</extension>
+        <mime-type>application/x-cbr</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cbz</extension>
+        <mime-type>application/x-cbr</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cc</extension>
+        <mime-type>text/x-c</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cct</extension>
+        <mime-type>application/x-director</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ccxml</extension>
+        <mime-type>application/ccxml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cdbcmsg</extension>
+        <mime-type>application/vnd.contact.cmsg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cdf</extension>
+        <mime-type>application/x-cdf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cdkey</extension>
+        <mime-type>application/vnd.mediastation.cdkey</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cdmia</extension>
+        <mime-type>application/cdmi-capability</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cdmic</extension>
+        <mime-type>application/cdmi-container</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cdmid</extension>
+        <mime-type>application/cdmi-domain</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cdmio</extension>
+        <mime-type>application/cdmi-object</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cdmiq</extension>
+        <mime-type>application/cdmi-queue</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cdx</extension>
+        <mime-type>chemical/x-cdx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cdxml</extension>
+        <mime-type>application/vnd.chemdraw+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cdy</extension>
+        <mime-type>application/vnd.cinderella</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cer</extension>
+        <mime-type>application/pkix-cert</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cfs</extension>
+        <mime-type>application/x-cfs-compressed</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cgm</extension>
+        <mime-type>image/cgm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>chat</extension>
+        <mime-type>application/x-chat</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>chm</extension>
+        <mime-type>application/vnd.ms-htmlhelp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>chrt</extension>
+        <mime-type>application/vnd.kde.kchart</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cif</extension>
+        <mime-type>chemical/x-cif</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cii</extension>
+        <mime-type>application/vnd.anser-web-certificate-issue-initiation</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cil</extension>
+        <mime-type>application/vnd.ms-artgalry</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cla</extension>
+        <mime-type>application/vnd.claymore</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>class</extension>
+        <mime-type>application/java</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>clkk</extension>
+        <mime-type>application/vnd.crick.clicker.keyboard</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>clkp</extension>
+        <mime-type>application/vnd.crick.clicker.palette</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>clkt</extension>
+        <mime-type>application/vnd.crick.clicker.template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>clkw</extension>
+        <mime-type>application/vnd.crick.clicker.wordbank</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>clkx</extension>
+        <mime-type>application/vnd.crick.clicker</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>clp</extension>
+        <mime-type>application/x-msclip</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cmc</extension>
+        <mime-type>application/vnd.cosmocaller</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cmdf</extension>
+        <mime-type>chemical/x-cmdf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cml</extension>
+        <mime-type>chemical/x-cml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cmp</extension>
+        <mime-type>application/vnd.yellowriver-custom-menu</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cmx</extension>
+        <mime-type>image/x-cmx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cod</extension>
+        <mime-type>application/vnd.rim.cod</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>com</extension>
+        <mime-type>application/x-msdownload</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>conf</extension>
+        <mime-type>text/plain</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cpio</extension>
+        <mime-type>application/x-cpio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cpp</extension>
+        <mime-type>text/x-c</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cpt</extension>
+        <mime-type>application/mac-compactpro</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>crd</extension>
+        <mime-type>application/x-mscardfile</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>crl</extension>
+        <mime-type>application/pkix-crl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>crt</extension>
+        <mime-type>application/x-x509-ca-cert</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cryptonote</extension>
+        <mime-type>application/vnd.rig.cryptonote</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>csh</extension>
+        <mime-type>application/x-csh</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>csml</extension>
+        <mime-type>chemical/x-csml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>csp</extension>
+        <mime-type>application/vnd.commonspace</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>css</extension>
+        <mime-type>text/css</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cst</extension>
+        <mime-type>application/x-director</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>csv</extension>
+        <mime-type>text/csv</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cu</extension>
+        <mime-type>application/cu-seeme</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>curl</extension>
+        <mime-type>text/vnd.curl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cww</extension>
+        <mime-type>application/prs.cww</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cxt</extension>
+        <mime-type>application/x-director</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cxx</extension>
+        <mime-type>text/x-c</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dae</extension>
+        <mime-type>model/vnd.collada+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>daf</extension>
+        <mime-type>application/vnd.mobius.daf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dart</extension>
+        <mime-type>application/vnd.dart</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dataless</extension>
+        <mime-type>application/vnd.fdsn.seed</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>davmount</extension>
+        <mime-type>application/davmount+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dbk</extension>
+        <mime-type>application/docbook+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dcr</extension>
+        <mime-type>application/x-director</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dcurl</extension>
+        <mime-type>text/vnd.curl.dcurl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dd2</extension>
+        <mime-type>application/vnd.oma.dd2+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ddd</extension>
+        <mime-type>application/vnd.fujixerox.ddd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>deb</extension>
+        <mime-type>application/x-debian-package</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>def</extension>
+        <mime-type>text/plain</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>deploy</extension>
+        <mime-type>application/octet-stream</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>der</extension>
+        <mime-type>application/x-x509-ca-cert</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dfac</extension>
+        <mime-type>application/vnd.dreamfactory</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dgc</extension>
+        <mime-type>application/x-dgc-compressed</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dib</extension>
+        <mime-type>image/bmp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dic</extension>
+        <mime-type>text/x-c</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dir</extension>
+        <mime-type>application/x-director</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dis</extension>
+        <mime-type>application/vnd.mobius.dis</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dist</extension>
+        <mime-type>application/octet-stream</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>distz</extension>
+        <mime-type>application/octet-stream</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>djv</extension>
+        <mime-type>image/vnd.djvu</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>djvu</extension>
+        <mime-type>image/vnd.djvu</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dll</extension>
+        <mime-type>application/x-msdownload</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dmg</extension>
+        <mime-type>application/x-apple-diskimage</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dmp</extension>
+        <mime-type>application/vnd.tcpdump.pcap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dms</extension>
+        <mime-type>application/octet-stream</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dna</extension>
+        <mime-type>application/vnd.dna</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>doc</extension>
+        <mime-type>application/msword</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>docm</extension>
+        <mime-type>application/vnd.ms-word.document.macroenabled.12</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>docx</extension>
+        <mime-type>application/vnd.openxmlformats-officedocument.wordprocessingml.document</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dot</extension>
+        <mime-type>application/msword</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dotm</extension>
+        <mime-type>application/vnd.ms-word.template.macroenabled.12</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dotx</extension>
+        <mime-type>application/vnd.openxmlformats-officedocument.wordprocessingml.template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dp</extension>
+        <mime-type>application/vnd.osgi.dp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dpg</extension>
+        <mime-type>application/vnd.dpgraph</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dra</extension>
+        <mime-type>audio/vnd.dra</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dsc</extension>
+        <mime-type>text/prs.lines.tag</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dssc</extension>
+        <mime-type>application/dssc+der</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dtb</extension>
+        <mime-type>application/x-dtbook+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dtd</extension>
+        <mime-type>application/xml-dtd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dts</extension>
+        <mime-type>audio/vnd.dts</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dtshd</extension>
+        <mime-type>audio/vnd.dts.hd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dump</extension>
+        <mime-type>application/octet-stream</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dv</extension>
+        <mime-type>video/x-dv</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dvb</extension>
+        <mime-type>video/vnd.dvb.file</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dvi</extension>
+        <mime-type>application/x-dvi</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dwf</extension>
+        <mime-type>model/vnd.dwf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dwg</extension>
+        <mime-type>image/vnd.dwg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dxf</extension>
+        <mime-type>image/vnd.dxf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dxp</extension>
+        <mime-type>application/vnd.spotfire.dxp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dxr</extension>
+        <mime-type>application/x-director</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ecelp4800</extension>
+        <mime-type>audio/vnd.nuera.ecelp4800</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ecelp7470</extension>
+        <mime-type>audio/vnd.nuera.ecelp7470</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ecelp9600</extension>
+        <mime-type>audio/vnd.nuera.ecelp9600</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ecma</extension>
+        <mime-type>application/ecmascript</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>edm</extension>
+        <mime-type>application/vnd.novadigm.edm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>edx</extension>
+        <mime-type>application/vnd.novadigm.edx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>efif</extension>
+        <mime-type>application/vnd.picsel</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ei6</extension>
+        <mime-type>application/vnd.pg.osasli</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>elc</extension>
+        <mime-type>application/octet-stream</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>emf</extension>
+        <mime-type>application/x-msmetafile</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>eml</extension>
+        <mime-type>message/rfc822</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>emma</extension>
+        <mime-type>application/emma+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>emz</extension>
+        <mime-type>application/x-msmetafile</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>eol</extension>
+        <mime-type>audio/vnd.digital-winds</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>eot</extension>
+        <mime-type>application/vnd.ms-fontobject</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>eps</extension>
+        <mime-type>application/postscript</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>epub</extension>
+        <mime-type>application/epub+zip</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>es3</extension>
+        <mime-type>application/vnd.eszigno3+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>esa</extension>
+        <mime-type>application/vnd.osgi.subsystem</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>esf</extension>
+        <mime-type>application/vnd.epson.esf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>et3</extension>
+        <mime-type>application/vnd.eszigno3+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>etx</extension>
+        <mime-type>text/x-setext</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>eva</extension>
+        <mime-type>application/x-eva</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>evy</extension>
+        <mime-type>application/x-envoy</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>exe</extension>
+        <mime-type>application/octet-stream</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>exi</extension>
+        <mime-type>application/exi</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ext</extension>
+        <mime-type>application/vnd.novadigm.ext</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ez</extension>
+        <mime-type>application/andrew-inset</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ez2</extension>
+        <mime-type>application/vnd.ezpix-album</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ez3</extension>
+        <mime-type>application/vnd.ezpix-package</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>f</extension>
+        <mime-type>text/x-fortran</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>f4v</extension>
+        <mime-type>video/x-f4v</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>f77</extension>
+        <mime-type>text/x-fortran</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>f90</extension>
+        <mime-type>text/x-fortran</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fbs</extension>
+        <mime-type>image/vnd.fastbidsheet</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fcdt</extension>
+        <mime-type>application/vnd.adobe.formscentral.fcdt</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fcs</extension>
+        <mime-type>application/vnd.isac.fcs</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fdf</extension>
+        <mime-type>application/vnd.fdf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fe_launch</extension>
+        <mime-type>application/vnd.denovo.fcselayout-link</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fg5</extension>
+        <mime-type>application/vnd.fujitsu.oasysgp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fgd</extension>
+        <mime-type>application/x-director</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fh</extension>
+        <mime-type>image/x-freehand</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fh4</extension>
+        <mime-type>image/x-freehand</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fh5</extension>
+        <mime-type>image/x-freehand</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fh7</extension>
+        <mime-type>image/x-freehand</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fhc</extension>
+        <mime-type>image/x-freehand</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fig</extension>
+        <mime-type>application/x-xfig</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>flac</extension>
+        <mime-type>audio/flac</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fli</extension>
+        <mime-type>video/x-fli</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>flo</extension>
+        <mime-type>application/vnd.micrografx.flo</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>flv</extension>
+        <mime-type>video/x-flv</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>flw</extension>
+        <mime-type>application/vnd.kde.kivio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>flx</extension>
+        <mime-type>text/vnd.fmi.flexstor</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fly</extension>
+        <mime-type>text/vnd.fly</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fm</extension>
+        <mime-type>application/vnd.framemaker</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fnc</extension>
+        <mime-type>application/vnd.frogans.fnc</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>for</extension>
+        <mime-type>text/x-fortran</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fpx</extension>
+        <mime-type>image/vnd.fpx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>frame</extension>
+        <mime-type>application/vnd.framemaker</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fsc</extension>
+        <mime-type>application/vnd.fsc.weblaunch</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fst</extension>
+        <mime-type>image/vnd.fst</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ftc</extension>
+        <mime-type>application/vnd.fluxtime.clip</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fti</extension>
+        <mime-type>application/vnd.anser-web-funds-transfer-initiation</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fvt</extension>
+        <mime-type>video/vnd.fvt</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fxp</extension>
+        <mime-type>application/vnd.adobe.fxp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fxpl</extension>
+        <mime-type>application/vnd.adobe.fxp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fzs</extension>
+        <mime-type>application/vnd.fuzzysheet</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>g2w</extension>
+        <mime-type>application/vnd.geoplan</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>g3</extension>
+        <mime-type>image/g3fax</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>g3w</extension>
+        <mime-type>application/vnd.geospace</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gac</extension>
+        <mime-type>application/vnd.groove-account</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gam</extension>
+        <mime-type>application/x-tads</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gbr</extension>
+        <mime-type>application/rpki-ghostbusters</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gca</extension>
+        <mime-type>application/x-gca-compressed</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gdl</extension>
+        <mime-type>model/vnd.gdl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>geo</extension>
+        <mime-type>application/vnd.dynageo</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gex</extension>
+        <mime-type>application/vnd.geometry-explorer</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ggb</extension>
+        <mime-type>application/vnd.geogebra.file</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ggt</extension>
+        <mime-type>application/vnd.geogebra.tool</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ghf</extension>
+        <mime-type>application/vnd.groove-help</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gif</extension>
+        <mime-type>image/gif</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gim</extension>
+        <mime-type>application/vnd.groove-identity-message</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gml</extension>
+        <mime-type>application/gml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gmx</extension>
+        <mime-type>application/vnd.gmx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gnumeric</extension>
+        <mime-type>application/x-gnumeric</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gph</extension>
+        <mime-type>application/vnd.flographit</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gpx</extension>
+        <mime-type>application/gpx+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gqf</extension>
+        <mime-type>application/vnd.grafeq</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gqs</extension>
+        <mime-type>application/vnd.grafeq</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gram</extension>
+        <mime-type>application/srgs</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gramps</extension>
+        <mime-type>application/x-gramps-xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gre</extension>
+        <mime-type>application/vnd.geometry-explorer</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>grv</extension>
+        <mime-type>application/vnd.groove-injector</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>grxml</extension>
+        <mime-type>application/srgs+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gsf</extension>
+        <mime-type>application/x-font-ghostscript</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gtar</extension>
+        <mime-type>application/x-gtar</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gtm</extension>
+        <mime-type>application/vnd.groove-tool-message</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gtw</extension>
+        <mime-type>model/vnd.gtw</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gv</extension>
+        <mime-type>text/vnd.graphviz</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gxf</extension>
+        <mime-type>application/gxf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gxt</extension>
+        <mime-type>application/vnd.geonext</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gz</extension>
+        <mime-type>application/x-gzip</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>h</extension>
+        <mime-type>text/x-c</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>h261</extension>
+        <mime-type>video/h261</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>h263</extension>
+        <mime-type>video/h263</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>h264</extension>
+        <mime-type>video/h264</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>hal</extension>
+        <mime-type>application/vnd.hal+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>hbci</extension>
+        <mime-type>application/vnd.hbci</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>hdf</extension>
+        <mime-type>application/x-hdf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>hh</extension>
+        <mime-type>text/x-c</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>hlp</extension>
+        <mime-type>application/winhlp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>hpgl</extension>
+        <mime-type>application/vnd.hp-hpgl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>hpid</extension>
+        <mime-type>application/vnd.hp-hpid</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>hps</extension>
+        <mime-type>application/vnd.hp-hps</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>hqx</extension>
+        <mime-type>application/mac-binhex40</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>htc</extension>
+        <mime-type>text/x-component</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>htke</extension>
+        <mime-type>application/vnd.kenameaapp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>htm</extension>
+        <mime-type>text/html</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>html</extension>
+        <mime-type>text/html</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>hvd</extension>
+        <mime-type>application/vnd.yamaha.hv-dic</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>hvp</extension>
+        <mime-type>application/vnd.yamaha.hv-voice</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>hvs</extension>
+        <mime-type>application/vnd.yamaha.hv-script</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>i2g</extension>
+        <mime-type>application/vnd.intergeo</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>icc</extension>
+        <mime-type>application/vnd.iccprofile</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ice</extension>
+        <mime-type>x-conference/x-cooltalk</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>icm</extension>
+        <mime-type>application/vnd.iccprofile</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ico</extension>
+        <mime-type>image/x-icon</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ics</extension>
+        <mime-type>text/calendar</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ief</extension>
+        <mime-type>image/ief</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ifb</extension>
+        <mime-type>text/calendar</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ifm</extension>
+        <mime-type>application/vnd.shana.informed.formdata</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>iges</extension>
+        <mime-type>model/iges</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>igl</extension>
+        <mime-type>application/vnd.igloader</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>igm</extension>
+        <mime-type>application/vnd.insors.igm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>igs</extension>
+        <mime-type>model/iges</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>igx</extension>
+        <mime-type>application/vnd.micrografx.igx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>iif</extension>
+        <mime-type>application/vnd.shana.informed.interchange</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>imp</extension>
+        <mime-type>application/vnd.accpac.simply.imp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ims</extension>
+        <mime-type>application/vnd.ms-ims</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>in</extension>
+        <mime-type>text/plain</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ink</extension>
+        <mime-type>application/inkml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>inkml</extension>
+        <mime-type>application/inkml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>install</extension>
+        <mime-type>application/x-install-instructions</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>iota</extension>
+        <mime-type>application/vnd.astraea-software.iota</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ipfix</extension>
+        <mime-type>application/ipfix</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ipk</extension>
+        <mime-type>application/vnd.shana.informed.package</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>irm</extension>
+        <mime-type>application/vnd.ibm.rights-management</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>irp</extension>
+        <mime-type>application/vnd.irepository.package+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>iso</extension>
+        <mime-type>application/x-iso9660-image</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>itp</extension>
+        <mime-type>application/vnd.shana.informed.formtemplate</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ivp</extension>
+        <mime-type>application/vnd.immervision-ivp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ivu</extension>
+        <mime-type>application/vnd.immervision-ivu</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jad</extension>
+        <mime-type>text/vnd.sun.j2me.app-descriptor</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jam</extension>
+        <mime-type>application/vnd.jam</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jar</extension>
+        <mime-type>application/java-archive</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>java</extension>
+        <mime-type>text/x-java-source</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jisp</extension>
+        <mime-type>application/vnd.jisp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jlt</extension>
+        <mime-type>application/vnd.hp-jlyt</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jnlp</extension>
+        <mime-type>application/x-java-jnlp-file</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>joda</extension>
+        <mime-type>application/vnd.joost.joda-archive</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jpe</extension>
+        <mime-type>image/jpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jpeg</extension>
+        <mime-type>image/jpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jpg</extension>
+        <mime-type>image/jpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jpgm</extension>
+        <mime-type>video/jpm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jpgv</extension>
+        <mime-type>video/jpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jpm</extension>
+        <mime-type>video/jpm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>js</extension>
+        <mime-type>application/javascript</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jsf</extension>
+        <mime-type>text/plain</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>json</extension>
+        <mime-type>application/json</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jsonml</extension>
+        <mime-type>application/jsonml+json</mime-type>
+    </mime-mapping>
+    <!--
+        <mime-mapping>
+            <extension>jspf</extension>
+            <mime-type>text/plain</mime-type>
+        </mime-mapping>
+    -->
+    <mime-mapping>
+        <extension>kar</extension>
+        <mime-type>audio/midi</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>karbon</extension>
+        <mime-type>application/vnd.kde.karbon</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>kfo</extension>
+        <mime-type>application/vnd.kde.kformula</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>kia</extension>
+        <mime-type>application/vnd.kidspiration</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>kml</extension>
+        <mime-type>application/vnd.google-earth.kml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>kmz</extension>
+        <mime-type>application/vnd.google-earth.kmz</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>kne</extension>
+        <mime-type>application/vnd.kinar</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>knp</extension>
+        <mime-type>application/vnd.kinar</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>kon</extension>
+        <mime-type>application/vnd.kde.kontour</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>kpr</extension>
+        <mime-type>application/vnd.kde.kpresenter</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>kpt</extension>
+        <mime-type>application/vnd.kde.kpresenter</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>kpxx</extension>
+        <mime-type>application/vnd.ds-keypoint</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ksp</extension>
+        <mime-type>application/vnd.kde.kspread</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ktr</extension>
+        <mime-type>application/vnd.kahootz</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ktx</extension>
+        <mime-type>image/ktx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ktz</extension>
+        <mime-type>application/vnd.kahootz</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>kwd</extension>
+        <mime-type>application/vnd.kde.kword</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>kwt</extension>
+        <mime-type>application/vnd.kde.kword</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>lasxml</extension>
+        <mime-type>application/vnd.las.las+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>latex</extension>
+        <mime-type>application/x-latex</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>lbd</extension>
+        <mime-type>application/vnd.llamagraphics.life-balance.desktop</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>lbe</extension>
+        <mime-type>application/vnd.llamagraphics.life-balance.exchange+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>les</extension>
+        <mime-type>application/vnd.hhe.lesson-player</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>lha</extension>
+        <mime-type>application/x-lzh-compressed</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>link66</extension>
+        <mime-type>application/vnd.route66.link66+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>list</extension>
+        <mime-type>text/plain</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>list3820</extension>
+        <mime-type>application/vnd.ibm.modcap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>listafp</extension>
+        <mime-type>application/vnd.ibm.modcap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>lnk</extension>
+        <mime-type>application/x-ms-shortcut</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>log</extension>
+        <mime-type>text/plain</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>lostxml</extension>
+        <mime-type>application/lost+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>lrf</extension>
+        <mime-type>application/octet-stream</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>lrm</extension>
+        <mime-type>application/vnd.ms-lrm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ltf</extension>
+        <mime-type>application/vnd.frogans.ltf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>lvp</extension>
+        <mime-type>audio/vnd.lucent.voice</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>lwp</extension>
+        <mime-type>application/vnd.lotus-wordpro</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>lzh</extension>
+        <mime-type>application/x-lzh-compressed</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m13</extension>
+        <mime-type>application/x-msmediaview</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m14</extension>
+        <mime-type>application/x-msmediaview</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m1v</extension>
+        <mime-type>video/mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m21</extension>
+        <mime-type>application/mp21</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m2a</extension>
+        <mime-type>audio/mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m2v</extension>
+        <mime-type>video/mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m3a</extension>
+        <mime-type>audio/mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m3u</extension>
+        <mime-type>audio/x-mpegurl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m3u8</extension>
+        <mime-type>application/vnd.apple.mpegurl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m4a</extension>
+        <mime-type>audio/mp4</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m4b</extension>
+        <mime-type>audio/mp4</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m4r</extension>
+        <mime-type>audio/mp4</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m4u</extension>
+        <mime-type>video/vnd.mpegurl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m4v</extension>
+        <mime-type>video/mp4</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ma</extension>
+        <mime-type>application/mathematica</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mac</extension>
+        <mime-type>image/x-macpaint</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mads</extension>
+        <mime-type>application/mads+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mag</extension>
+        <mime-type>application/vnd.ecowin.chart</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>maker</extension>
+        <mime-type>application/vnd.framemaker</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>man</extension>
+        <mime-type>text/troff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mar</extension>
+        <mime-type>application/octet-stream</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mathml</extension>
+        <mime-type>application/mathml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mb</extension>
+        <mime-type>application/mathematica</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mbk</extension>
+        <mime-type>application/vnd.mobius.mbk</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mbox</extension>
+        <mime-type>application/mbox</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mc1</extension>
+        <mime-type>application/vnd.medcalcdata</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mcd</extension>
+        <mime-type>application/vnd.mcd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mcurl</extension>
+        <mime-type>text/vnd.curl.mcurl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mdb</extension>
+        <mime-type>application/x-msaccess</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mdi</extension>
+        <mime-type>image/vnd.ms-modi</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>me</extension>
+        <mime-type>text/troff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mesh</extension>
+        <mime-type>model/mesh</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>meta4</extension>
+        <mime-type>application/metalink4+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>metalink</extension>
+        <mime-type>application/metalink+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mets</extension>
+        <mime-type>application/mets+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mfm</extension>
+        <mime-type>application/vnd.mfmp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mft</extension>
+        <mime-type>application/rpki-manifest</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mgp</extension>
+        <mime-type>application/vnd.osgeo.mapguide.package</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mgz</extension>
+        <mime-type>application/vnd.proteus.magazine</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mid</extension>
+        <mime-type>audio/midi</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>midi</extension>
+        <mime-type>audio/midi</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mie</extension>
+        <mime-type>application/x-mie</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mif</extension>
+        <mime-type>application/x-mif</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mime</extension>
+        <mime-type>message/rfc822</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mj2</extension>
+        <mime-type>video/mj2</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mjp2</extension>
+        <mime-type>video/mj2</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mk3d</extension>
+        <mime-type>video/x-matroska</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mka</extension>
+        <mime-type>audio/x-matroska</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mks</extension>
+        <mime-type>video/x-matroska</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mkv</extension>
+        <mime-type>video/x-matroska</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mlp</extension>
+        <mime-type>application/vnd.dolby.mlp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mmd</extension>
+        <mime-type>application/vnd.chipnuts.karaoke-mmd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mmf</extension>
+        <mime-type>application/vnd.smaf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mmr</extension>
+        <mime-type>image/vnd.fujixerox.edmics-mmr</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mng</extension>
+        <mime-type>video/x-mng</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mny</extension>
+        <mime-type>application/x-msmoney</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mobi</extension>
+        <mime-type>application/x-mobipocket-ebook</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mods</extension>
+        <mime-type>application/mods+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mov</extension>
+        <mime-type>video/quicktime</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>movie</extension>
+        <mime-type>video/x-sgi-movie</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mp1</extension>
+        <mime-type>audio/mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mp2</extension>
+        <mime-type>audio/mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mp21</extension>
+        <mime-type>application/mp21</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mp2a</extension>
+        <mime-type>audio/mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mp3</extension>
+        <mime-type>audio/mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mp4</extension>
+        <mime-type>video/mp4</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mp4a</extension>
+        <mime-type>audio/mp4</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mp4s</extension>
+        <mime-type>application/mp4</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mp4v</extension>
+        <mime-type>video/mp4</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpa</extension>
+        <mime-type>audio/mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpc</extension>
+        <mime-type>application/vnd.mophun.certificate</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpe</extension>
+        <mime-type>video/mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpeg</extension>
+        <mime-type>video/mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpega</extension>
+        <mime-type>audio/x-mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpg</extension>
+        <mime-type>video/mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpg4</extension>
+        <mime-type>video/mp4</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpga</extension>
+        <mime-type>audio/mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpkg</extension>
+        <mime-type>application/vnd.apple.installer+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpm</extension>
+        <mime-type>application/vnd.blueice.multipass</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpn</extension>
+        <mime-type>application/vnd.mophun.application</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpp</extension>
+        <mime-type>application/vnd.ms-project</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpt</extension>
+        <mime-type>application/vnd.ms-project</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpv2</extension>
+        <mime-type>video/mpeg2</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpy</extension>
+        <mime-type>application/vnd.ibm.minipay</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mqy</extension>
+        <mime-type>application/vnd.mobius.mqy</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mrc</extension>
+        <mime-type>application/marc</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mrcx</extension>
+        <mime-type>application/marcxml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ms</extension>
+        <mime-type>text/troff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mscml</extension>
+        <mime-type>application/mediaservercontrol+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mseed</extension>
+        <mime-type>application/vnd.fdsn.mseed</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mseq</extension>
+        <mime-type>application/vnd.mseq</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>msf</extension>
+        <mime-type>application/vnd.epson.msf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>msh</extension>
+        <mime-type>model/mesh</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>msi</extension>
+        <mime-type>application/x-msdownload</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>msl</extension>
+        <mime-type>application/vnd.mobius.msl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>msty</extension>
+        <mime-type>application/vnd.muvee.style</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mts</extension>
+        <mime-type>model/vnd.mts</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mus</extension>
+        <mime-type>application/vnd.musician</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>musicxml</extension>
+        <mime-type>application/vnd.recordare.musicxml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mvb</extension>
+        <mime-type>application/x-msmediaview</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mwf</extension>
+        <mime-type>application/vnd.mfer</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mxf</extension>
+        <mime-type>application/mxf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mxl</extension>
+        <mime-type>application/vnd.recordare.musicxml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mxml</extension>
+        <mime-type>application/xv+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mxs</extension>
+        <mime-type>application/vnd.triscape.mxs</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mxu</extension>
+        <mime-type>video/vnd.mpegurl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>n-gage</extension>
+        <mime-type>application/vnd.nokia.n-gage.symbian.install</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>n3</extension>
+        <mime-type>text/n3</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>nb</extension>
+        <mime-type>application/mathematica</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>nbp</extension>
+        <mime-type>application/vnd.wolfram.player</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>nc</extension>
+        <mime-type>application/x-netcdf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ncx</extension>
+        <mime-type>application/x-dtbncx+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>nfo</extension>
+        <mime-type>text/x-nfo</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ngdat</extension>
+        <mime-type>application/vnd.nokia.n-gage.data</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>nitf</extension>
+        <mime-type>application/vnd.nitf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>nlu</extension>
+        <mime-type>application/vnd.neurolanguage.nlu</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>nml</extension>
+        <mime-type>application/vnd.enliven</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>nnd</extension>
+        <mime-type>application/vnd.noblenet-directory</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>nns</extension>
+        <mime-type>application/vnd.noblenet-sealer</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>nnw</extension>
+        <mime-type>application/vnd.noblenet-web</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>npx</extension>
+        <mime-type>image/vnd.net-fpx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>nsc</extension>
+        <mime-type>application/x-conference</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>nsf</extension>
+        <mime-type>application/vnd.lotus-notes</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ntf</extension>
+        <mime-type>application/vnd.nitf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>nzb</extension>
+        <mime-type>application/x-nzb</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>oa2</extension>
+        <mime-type>application/vnd.fujitsu.oasys2</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>oa3</extension>
+        <mime-type>application/vnd.fujitsu.oasys3</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>oas</extension>
+        <mime-type>application/vnd.fujitsu.oasys</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>obd</extension>
+        <mime-type>application/x-msbinder</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>obj</extension>
+        <mime-type>application/x-tgif</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>oda</extension>
+        <mime-type>application/oda</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- OpenDocument Database -->
+        <extension>odb</extension>
+        <mime-type>application/vnd.oasis.opendocument.database</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- OpenDocument Chart -->
+        <extension>odc</extension>
+        <mime-type>application/vnd.oasis.opendocument.chart</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- OpenDocument Formula -->
+        <extension>odf</extension>
+        <mime-type>application/vnd.oasis.opendocument.formula</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>odft</extension>
+        <mime-type>application/vnd.oasis.opendocument.formula-template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- OpenDocument Drawing -->
+        <extension>odg</extension>
+        <mime-type>application/vnd.oasis.opendocument.graphics</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- OpenDocument Image -->
+        <extension>odi</extension>
+        <mime-type>application/vnd.oasis.opendocument.image</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- OpenDocument Master Document -->
+        <extension>odm</extension>
+        <mime-type>application/vnd.oasis.opendocument.text-master</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- OpenDocument Presentation -->
+        <extension>odp</extension>
+        <mime-type>application/vnd.oasis.opendocument.presentation</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- OpenDocument Spreadsheet -->
+        <extension>ods</extension>
+        <mime-type>application/vnd.oasis.opendocument.spreadsheet</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- OpenDocument Text -->
+        <extension>odt</extension>
+        <mime-type>application/vnd.oasis.opendocument.text</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>oga</extension>
+        <mime-type>audio/ogg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ogg</extension>
+        <mime-type>audio/ogg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ogv</extension>
+        <mime-type>video/ogg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- xiph mime types -->
+        <extension>ogx</extension>
+        <mime-type>application/ogg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>omdoc</extension>
+        <mime-type>application/omdoc+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>onepkg</extension>
+        <mime-type>application/onenote</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>onetmp</extension>
+        <mime-type>application/onenote</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>onetoc</extension>
+        <mime-type>application/onenote</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>onetoc2</extension>
+        <mime-type>application/onenote</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>opf</extension>
+        <mime-type>application/oebps-package+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>opml</extension>
+        <mime-type>text/x-opml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>oprc</extension>
+        <mime-type>application/vnd.palm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>org</extension>
+        <mime-type>application/vnd.lotus-organizer</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>osf</extension>
+        <mime-type>application/vnd.yamaha.openscoreformat</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>osfpvg</extension>
+        <mime-type>application/vnd.yamaha.openscoreformat.osfpvg+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>otc</extension>
+        <mime-type>application/vnd.oasis.opendocument.chart-template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>otf</extension>
+        <mime-type>application/x-font-otf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- OpenDocument Drawing Template -->
+        <extension>otg</extension>
+        <mime-type>application/vnd.oasis.opendocument.graphics-template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- HTML Document Template -->
+        <extension>oth</extension>
+        <mime-type>application/vnd.oasis.opendocument.text-web</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>oti</extension>
+        <mime-type>application/vnd.oasis.opendocument.image-template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- OpenDocument Presentation Template -->
+        <extension>otp</extension>
+        <mime-type>application/vnd.oasis.opendocument.presentation-template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- OpenDocument Spreadsheet Template -->
+        <extension>ots</extension>
+        <mime-type>application/vnd.oasis.opendocument.spreadsheet-template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- OpenDocument Text Template -->
+        <extension>ott</extension>
+        <mime-type>application/vnd.oasis.opendocument.text-template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>oxps</extension>
+        <mime-type>application/oxps</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>oxt</extension>
+        <mime-type>application/vnd.openofficeorg.extension</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>p</extension>
+        <mime-type>text/x-pascal</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>p10</extension>
+        <mime-type>application/pkcs10</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>p12</extension>
+        <mime-type>application/x-pkcs12</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>p7b</extension>
+        <mime-type>application/x-pkcs7-certificates</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>p7c</extension>
+        <mime-type>application/pkcs7-mime</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>p7m</extension>
+        <mime-type>application/pkcs7-mime</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>p7r</extension>
+        <mime-type>application/x-pkcs7-certreqresp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>p7s</extension>
+        <mime-type>application/pkcs7-signature</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>p8</extension>
+        <mime-type>application/pkcs8</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pas</extension>
+        <mime-type>text/x-pascal</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>paw</extension>
+        <mime-type>application/vnd.pawaafile</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pbd</extension>
+        <mime-type>application/vnd.powerbuilder6</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pbm</extension>
+        <mime-type>image/x-portable-bitmap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pcap</extension>
+        <mime-type>application/vnd.tcpdump.pcap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pcf</extension>
+        <mime-type>application/x-font-pcf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pcl</extension>
+        <mime-type>application/vnd.hp-pcl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pclxl</extension>
+        <mime-type>application/vnd.hp-pclxl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pct</extension>
+        <mime-type>image/pict</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pcurl</extension>
+        <mime-type>application/vnd.curl.pcurl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pcx</extension>
+        <mime-type>image/x-pcx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pdb</extension>
+        <mime-type>application/vnd.palm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pdf</extension>
+        <mime-type>application/pdf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pfa</extension>
+        <mime-type>application/x-font-type1</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pfb</extension>
+        <mime-type>application/x-font-type1</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pfm</extension>
+        <mime-type>application/x-font-type1</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pfr</extension>
+        <mime-type>application/font-tdpfr</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pfx</extension>
+        <mime-type>application/x-pkcs12</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pgm</extension>
+        <mime-type>image/x-portable-graymap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pgn</extension>
+        <mime-type>application/x-chess-pgn</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pgp</extension>
+        <mime-type>application/pgp-encrypted</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pic</extension>
+        <mime-type>image/pict</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pict</extension>
+        <mime-type>image/pict</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pkg</extension>
+        <mime-type>application/octet-stream</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pki</extension>
+        <mime-type>application/pkixcmp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pkipath</extension>
+        <mime-type>application/pkix-pkipath</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>plb</extension>
+        <mime-type>application/vnd.3gpp.pic-bw-large</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>plc</extension>
+        <mime-type>application/vnd.mobius.plc</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>plf</extension>
+        <mime-type>application/vnd.pocketlearn</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pls</extension>
+        <mime-type>audio/x-scpls</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pml</extension>
+        <mime-type>application/vnd.ctc-posml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>png</extension>
+        <mime-type>image/png</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pnm</extension>
+        <mime-type>image/x-portable-anymap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pnt</extension>
+        <mime-type>image/x-macpaint</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>portpkg</extension>
+        <mime-type>application/vnd.macports.portpkg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pot</extension>
+        <mime-type>application/vnd.ms-powerpoint</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>potm</extension>
+        <mime-type>application/vnd.ms-powerpoint.template.macroenabled.12</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>potx</extension>
+        <mime-type>application/vnd.openxmlformats-officedocument.presentationml.template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ppam</extension>
+        <mime-type>application/vnd.ms-powerpoint.addin.macroenabled.12</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ppd</extension>
+        <mime-type>application/vnd.cups-ppd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ppm</extension>
+        <mime-type>image/x-portable-pixmap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pps</extension>
+        <mime-type>application/vnd.ms-powerpoint</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ppsm</extension>
+        <mime-type>application/vnd.ms-powerpoint.slideshow.macroenabled.12</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ppsx</extension>
+        <mime-type>application/vnd.openxmlformats-officedocument.presentationml.slideshow</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ppt</extension>
+        <mime-type>application/vnd.ms-powerpoint</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pptm</extension>
+        <mime-type>application/vnd.ms-powerpoint.presentation.macroenabled.12</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pptx</extension>
+        <mime-type>application/vnd.openxmlformats-officedocument.presentationml.presentation</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pqa</extension>
+        <mime-type>application/vnd.palm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>prc</extension>
+        <mime-type>application/x-mobipocket-ebook</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pre</extension>
+        <mime-type>application/vnd.lotus-freelance</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>prf</extension>
+        <mime-type>application/pics-rules</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ps</extension>
+        <mime-type>application/postscript</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>psb</extension>
+        <mime-type>application/vnd.3gpp.pic-bw-small</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>psd</extension>
+        <mime-type>image/vnd.adobe.photoshop</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>psf</extension>
+        <mime-type>application/x-font-linux-psf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pskcxml</extension>
+        <mime-type>application/pskc+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ptid</extension>
+        <mime-type>application/vnd.pvi.ptid1</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pub</extension>
+        <mime-type>application/x-mspublisher</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pvb</extension>
+        <mime-type>application/vnd.3gpp.pic-bw-var</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pwn</extension>
+        <mime-type>application/vnd.3m.post-it-notes</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pya</extension>
+        <mime-type>audio/vnd.ms-playready.media.pya</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pyv</extension>
+        <mime-type>video/vnd.ms-playready.media.pyv</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>qam</extension>
+        <mime-type>application/vnd.epson.quickanime</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>qbo</extension>
+        <mime-type>application/vnd.intu.qbo</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>qfx</extension>
+        <mime-type>application/vnd.intu.qfx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>qps</extension>
+        <mime-type>application/vnd.publishare-delta-tree</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>qt</extension>
+        <mime-type>video/quicktime</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>qti</extension>
+        <mime-type>image/x-quicktime</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>qtif</extension>
+        <mime-type>image/x-quicktime</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>qwd</extension>
+        <mime-type>application/vnd.quark.quarkxpress</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>qwt</extension>
+        <mime-type>application/vnd.quark.quarkxpress</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>qxb</extension>
+        <mime-type>application/vnd.quark.quarkxpress</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>qxd</extension>
+        <mime-type>application/vnd.quark.quarkxpress</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>qxl</extension>
+        <mime-type>application/vnd.quark.quarkxpress</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>qxt</extension>
+        <mime-type>application/vnd.quark.quarkxpress</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ra</extension>
+        <mime-type>audio/x-pn-realaudio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ram</extension>
+        <mime-type>audio/x-pn-realaudio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rar</extension>
+        <mime-type>application/x-rar-compressed</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ras</extension>
+        <mime-type>image/x-cmu-raster</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rcprofile</extension>
+        <mime-type>application/vnd.ipunplugged.rcprofile</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rdf</extension>
+        <mime-type>application/rdf+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rdz</extension>
+        <mime-type>application/vnd.data-vision.rdz</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rep</extension>
+        <mime-type>application/vnd.businessobjects</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>res</extension>
+        <mime-type>application/x-dtbresource+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rgb</extension>
+        <mime-type>image/x-rgb</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rif</extension>
+        <mime-type>application/reginfo+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rip</extension>
+        <mime-type>audio/vnd.rip</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ris</extension>
+        <mime-type>application/x-research-info-systems</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rl</extension>
+        <mime-type>application/resource-lists+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rlc</extension>
+        <mime-type>image/vnd.fujixerox.edmics-rlc</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rld</extension>
+        <mime-type>application/resource-lists-diff+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rm</extension>
+        <mime-type>application/vnd.rn-realmedia</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rmi</extension>
+        <mime-type>audio/midi</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rmp</extension>
+        <mime-type>audio/x-pn-realaudio-plugin</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rms</extension>
+        <mime-type>application/vnd.jcp.javame.midlet-rms</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rmvb</extension>
+        <mime-type>application/vnd.rn-realmedia-vbr</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rnc</extension>
+        <mime-type>application/relax-ng-compact-syntax</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>roa</extension>
+        <mime-type>application/rpki-roa</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>roff</extension>
+        <mime-type>text/troff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rp9</extension>
+        <mime-type>application/vnd.cloanto.rp9</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rpss</extension>
+        <mime-type>application/vnd.nokia.radio-presets</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rpst</extension>
+        <mime-type>application/vnd.nokia.radio-preset</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rq</extension>
+        <mime-type>application/sparql-query</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rs</extension>
+        <mime-type>application/rls-services+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rsd</extension>
+        <mime-type>application/rsd+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rss</extension>
+        <mime-type>application/rss+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rtf</extension>
+        <mime-type>application/rtf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rtx</extension>
+        <mime-type>text/richtext</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>s</extension>
+        <mime-type>text/x-asm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>s3m</extension>
+        <mime-type>audio/s3m</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>saf</extension>
+        <mime-type>application/vnd.yamaha.smaf-audio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sbml</extension>
+        <mime-type>application/sbml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sc</extension>
+        <mime-type>application/vnd.ibm.secure-container</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>scd</extension>
+        <mime-type>application/x-msschedule</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>scm</extension>
+        <mime-type>application/vnd.lotus-screencam</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>scq</extension>
+        <mime-type>application/scvp-cv-request</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>scs</extension>
+        <mime-type>application/scvp-cv-response</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>scurl</extension>
+        <mime-type>text/vnd.curl.scurl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sda</extension>
+        <mime-type>application/vnd.stardivision.draw</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sdc</extension>
+        <mime-type>application/vnd.stardivision.calc</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sdd</extension>
+        <mime-type>application/vnd.stardivision.impress</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sdkd</extension>
+        <mime-type>application/vnd.solent.sdkm+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sdkm</extension>
+        <mime-type>application/vnd.solent.sdkm+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sdp</extension>
+        <mime-type>application/sdp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sdw</extension>
+        <mime-type>application/vnd.stardivision.writer</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>see</extension>
+        <mime-type>application/vnd.seemail</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>seed</extension>
+        <mime-type>application/vnd.fdsn.seed</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sema</extension>
+        <mime-type>application/vnd.sema</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>semd</extension>
+        <mime-type>application/vnd.semd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>semf</extension>
+        <mime-type>application/vnd.semf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ser</extension>
+        <mime-type>application/java-serialized-object</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>setpay</extension>
+        <mime-type>application/set-payment-initiation</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>setreg</extension>
+        <mime-type>application/set-registration-initiation</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sfd-hdstx</extension>
+        <mime-type>application/vnd.hydrostatix.sof-data</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sfs</extension>
+        <mime-type>application/vnd.spotfire.sfs</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sfv</extension>
+        <mime-type>text/x-sfv</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sgi</extension>
+        <mime-type>image/sgi</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sgl</extension>
+        <mime-type>application/vnd.stardivision.writer-global</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sgm</extension>
+        <mime-type>text/sgml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sgml</extension>
+        <mime-type>text/sgml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sh</extension>
+        <mime-type>application/x-sh</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>shar</extension>
+        <mime-type>application/x-shar</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>shf</extension>
+        <mime-type>application/shf+xml</mime-type>
+    </mime-mapping>
+    <!--
+    <mime-mapping>
+        <extension>shtml</extension>
+        <mime-type>text/x-server-parsed-html</mime-type>
+    </mime-mapping>
+    -->
+    <mime-mapping>
+        <extension>sid</extension>
+        <mime-type>image/x-mrsid-image</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sig</extension>
+        <mime-type>application/pgp-signature</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sil</extension>
+        <mime-type>audio/silk</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>silo</extension>
+        <mime-type>model/mesh</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sis</extension>
+        <mime-type>application/vnd.symbian.install</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sisx</extension>
+        <mime-type>application/vnd.symbian.install</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sit</extension>
+        <mime-type>application/x-stuffit</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sitx</extension>
+        <mime-type>application/x-stuffitx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>skd</extension>
+        <mime-type>application/vnd.koan</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>skm</extension>
+        <mime-type>application/vnd.koan</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>skp</extension>
+        <mime-type>application/vnd.koan</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>skt</extension>
+        <mime-type>application/vnd.koan</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sldm</extension>
+        <mime-type>application/vnd.ms-powerpoint.slide.macroenabled.12</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sldx</extension>
+        <mime-type>application/vnd.openxmlformats-officedocument.presentationml.slide</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>slt</extension>
+        <mime-type>application/vnd.epson.salt</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sm</extension>
+        <mime-type>application/vnd.stepmania.stepchart</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>smf</extension>
+        <mime-type>application/vnd.stardivision.math</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>smi</extension>
+        <mime-type>application/smil+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>smil</extension>
+        <mime-type>application/smil+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>smv</extension>
+        <mime-type>video/x-smv</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>smzip</extension>
+        <mime-type>application/vnd.stepmania.package</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>snd</extension>
+        <mime-type>audio/basic</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>snf</extension>
+        <mime-type>application/x-font-snf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>so</extension>
+        <mime-type>application/octet-stream</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>spc</extension>
+        <mime-type>application/x-pkcs7-certificates</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>spf</extension>
+        <mime-type>application/vnd.yamaha.smaf-phrase</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>spl</extension>
+        <mime-type>application/x-futuresplash</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>spot</extension>
+        <mime-type>text/vnd.in3d.spot</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>spp</extension>
+        <mime-type>application/scvp-vp-response</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>spq</extension>
+        <mime-type>application/scvp-vp-request</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>spx</extension>
+        <mime-type>audio/ogg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sql</extension>
+        <mime-type>application/x-sql</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>src</extension>
+        <mime-type>application/x-wais-source</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>srt</extension>
+        <mime-type>application/x-subrip</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sru</extension>
+        <mime-type>application/sru+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>srx</extension>
+        <mime-type>application/sparql-results+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ssdl</extension>
+        <mime-type>application/ssdl+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sse</extension>
+        <mime-type>application/vnd.kodak-descriptor</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ssf</extension>
+        <mime-type>application/vnd.epson.ssf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ssml</extension>
+        <mime-type>application/ssml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>st</extension>
+        <mime-type>application/vnd.sailingtracker.track</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>stc</extension>
+        <mime-type>application/vnd.sun.xml.calc.template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>std</extension>
+        <mime-type>application/vnd.sun.xml.draw.template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>stf</extension>
+        <mime-type>application/vnd.wt.stf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sti</extension>
+        <mime-type>application/vnd.sun.xml.impress.template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>stk</extension>
+        <mime-type>application/hyperstudio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>stl</extension>
+        <mime-type>application/vnd.ms-pki.stl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>str</extension>
+        <mime-type>application/vnd.pg.format</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>stw</extension>
+        <mime-type>application/vnd.sun.xml.writer.template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sub</extension>
+        <mime-type>text/vnd.dvb.subtitle</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sus</extension>
+        <mime-type>application/vnd.sus-calendar</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>susp</extension>
+        <mime-type>application/vnd.sus-calendar</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sv4cpio</extension>
+        <mime-type>application/x-sv4cpio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sv4crc</extension>
+        <mime-type>application/x-sv4crc</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>svc</extension>
+        <mime-type>application/vnd.dvb.service</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>svd</extension>
+        <mime-type>application/vnd.svd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>svg</extension>
+        <mime-type>image/svg+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>svgz</extension>
+        <mime-type>image/svg+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>swa</extension>
+        <mime-type>application/x-director</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>swf</extension>
+        <mime-type>application/x-shockwave-flash</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>swi</extension>
+        <mime-type>application/vnd.aristanetworks.swi</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sxc</extension>
+        <mime-type>application/vnd.sun.xml.calc</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sxd</extension>
+        <mime-type>application/vnd.sun.xml.draw</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sxg</extension>
+        <mime-type>application/vnd.sun.xml.writer.global</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sxi</extension>
+        <mime-type>application/vnd.sun.xml.impress</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sxm</extension>
+        <mime-type>application/vnd.sun.xml.math</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sxw</extension>
+        <mime-type>application/vnd.sun.xml.writer</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>t</extension>
+        <mime-type>text/troff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>t3</extension>
+        <mime-type>application/x-t3vm-image</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>taglet</extension>
+        <mime-type>application/vnd.mynfc</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tao</extension>
+        <mime-type>application/vnd.tao.intent-module-archive</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tar</extension>
+        <mime-type>application/x-tar</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tcap</extension>
+        <mime-type>application/vnd.3gpp2.tcap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tcl</extension>
+        <mime-type>application/x-tcl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>teacher</extension>
+        <mime-type>application/vnd.smart.teacher</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tei</extension>
+        <mime-type>application/tei+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>teicorpus</extension>
+        <mime-type>application/tei+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tex</extension>
+        <mime-type>application/x-tex</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>texi</extension>
+        <mime-type>application/x-texinfo</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>texinfo</extension>
+        <mime-type>application/x-texinfo</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>text</extension>
+        <mime-type>text/plain</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tfi</extension>
+        <mime-type>application/thraud+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tfm</extension>
+        <mime-type>application/x-tex-tfm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tga</extension>
+        <mime-type>image/x-tga</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>thmx</extension>
+        <mime-type>application/vnd.ms-officetheme</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tif</extension>
+        <mime-type>image/tiff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tiff</extension>
+        <mime-type>image/tiff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tmo</extension>
+        <mime-type>application/vnd.tmobile-livetv</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>torrent</extension>
+        <mime-type>application/x-bittorrent</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tpl</extension>
+        <mime-type>application/vnd.groove-tool-template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tpt</extension>
+        <mime-type>application/vnd.trid.tpt</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tr</extension>
+        <mime-type>text/troff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tra</extension>
+        <mime-type>application/vnd.trueapp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>trm</extension>
+        <mime-type>application/x-msterminal</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tsd</extension>
+        <mime-type>application/timestamped-data</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tsv</extension>
+        <mime-type>text/tab-separated-values</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ttc</extension>
+        <mime-type>application/x-font-ttf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ttf</extension>
+        <mime-type>application/x-font-ttf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ttl</extension>
+        <mime-type>text/turtle</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>twd</extension>
+        <mime-type>application/vnd.simtech-mindmapper</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>twds</extension>
+        <mime-type>application/vnd.simtech-mindmapper</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>txd</extension>
+        <mime-type>application/vnd.genomatix.tuxedo</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>txf</extension>
+        <mime-type>application/vnd.mobius.txf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>txt</extension>
+        <mime-type>text/plain</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>u32</extension>
+        <mime-type>application/x-authorware-bin</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>udeb</extension>
+        <mime-type>application/x-debian-package</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ufd</extension>
+        <mime-type>application/vnd.ufdl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ufdl</extension>
+        <mime-type>application/vnd.ufdl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ulw</extension>
+        <mime-type>audio/basic</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ulx</extension>
+        <mime-type>application/x-glulx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>umj</extension>
+        <mime-type>application/vnd.umajin</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>unityweb</extension>
+        <mime-type>application/vnd.unity</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uoml</extension>
+        <mime-type>application/vnd.uoml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uri</extension>
+        <mime-type>text/uri-list</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uris</extension>
+        <mime-type>text/uri-list</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>urls</extension>
+        <mime-type>text/uri-list</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ustar</extension>
+        <mime-type>application/x-ustar</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>utz</extension>
+        <mime-type>application/vnd.uiq.theme</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uu</extension>
+        <mime-type>text/x-uuencode</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uva</extension>
+        <mime-type>audio/vnd.dece.audio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvd</extension>
+        <mime-type>application/vnd.dece.data</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvf</extension>
+        <mime-type>application/vnd.dece.data</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvg</extension>
+        <mime-type>image/vnd.dece.graphic</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvh</extension>
+        <mime-type>video/vnd.dece.hd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvi</extension>
+        <mime-type>image/vnd.dece.graphic</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvm</extension>
+        <mime-type>video/vnd.dece.mobile</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvp</extension>
+        <mime-type>video/vnd.dece.pd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvs</extension>
+        <mime-type>video/vnd.dece.sd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvt</extension>
+        <mime-type>application/vnd.dece.ttml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvu</extension>
+        <mime-type>video/vnd.uvvu.mp4</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvv</extension>
+        <mime-type>video/vnd.dece.video</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvva</extension>
+        <mime-type>audio/vnd.dece.audio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvvd</extension>
+        <mime-type>application/vnd.dece.data</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvvf</extension>
+        <mime-type>application/vnd.dece.data</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvvg</extension>
+        <mime-type>image/vnd.dece.graphic</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvvh</extension>
+        <mime-type>video/vnd.dece.hd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvvi</extension>
+        <mime-type>image/vnd.dece.graphic</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvvm</extension>
+        <mime-type>video/vnd.dece.mobile</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvvp</extension>
+        <mime-type>video/vnd.dece.pd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvvs</extension>
+        <mime-type>video/vnd.dece.sd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvvt</extension>
+        <mime-type>application/vnd.dece.ttml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvvu</extension>
+        <mime-type>video/vnd.uvvu.mp4</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvvv</extension>
+        <mime-type>video/vnd.dece.video</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvvx</extension>
+        <mime-type>application/vnd.dece.unspecified</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvvz</extension>
+        <mime-type>application/vnd.dece.zip</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvx</extension>
+        <mime-type>application/vnd.dece.unspecified</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvz</extension>
+        <mime-type>application/vnd.dece.zip</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vcard</extension>
+        <mime-type>text/vcard</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vcd</extension>
+        <mime-type>application/x-cdlink</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vcf</extension>
+        <mime-type>text/x-vcard</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vcg</extension>
+        <mime-type>application/vnd.groove-vcard</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vcs</extension>
+        <mime-type>text/x-vcalendar</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vcx</extension>
+        <mime-type>application/vnd.vcx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vis</extension>
+        <mime-type>application/vnd.visionary</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>viv</extension>
+        <mime-type>video/vnd.vivo</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vob</extension>
+        <mime-type>video/x-ms-vob</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vor</extension>
+        <mime-type>application/vnd.stardivision.writer</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vox</extension>
+        <mime-type>application/x-authorware-bin</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vrml</extension>
+        <mime-type>model/vrml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vsd</extension>
+        <mime-type>application/vnd.visio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vsf</extension>
+        <mime-type>application/vnd.vsf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vss</extension>
+        <mime-type>application/vnd.visio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vst</extension>
+        <mime-type>application/vnd.visio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vsw</extension>
+        <mime-type>application/vnd.visio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vtu</extension>
+        <mime-type>model/vnd.vtu</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vxml</extension>
+        <mime-type>application/voicexml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>w3d</extension>
+        <mime-type>application/x-director</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wad</extension>
+        <mime-type>application/x-doom</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wav</extension>
+        <mime-type>audio/x-wav</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wax</extension>
+        <mime-type>audio/x-ms-wax</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- Wireless Bitmap -->
+        <extension>wbmp</extension>
+        <mime-type>image/vnd.wap.wbmp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wbs</extension>
+        <mime-type>application/vnd.criticaltools.wbs+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wbxml</extension>
+        <mime-type>application/vnd.wap.wbxml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wcm</extension>
+        <mime-type>application/vnd.ms-works</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wdb</extension>
+        <mime-type>application/vnd.ms-works</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wdp</extension>
+        <mime-type>image/vnd.ms-photo</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>weba</extension>
+        <mime-type>audio/webm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>webm</extension>
+        <mime-type>video/webm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>webp</extension>
+        <mime-type>image/webp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wg</extension>
+        <mime-type>application/vnd.pmi.widget</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wgt</extension>
+        <mime-type>application/widget</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wks</extension>
+        <mime-type>application/vnd.ms-works</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wm</extension>
+        <mime-type>video/x-ms-wm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wma</extension>
+        <mime-type>audio/x-ms-wma</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wmd</extension>
+        <mime-type>application/x-ms-wmd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wmf</extension>
+        <mime-type>application/x-msmetafile</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- WML Source -->
+        <extension>wml</extension>
+        <mime-type>text/vnd.wap.wml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- Compiled WML -->
+        <extension>wmlc</extension>
+        <mime-type>application/vnd.wap.wmlc</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- WML Script Source -->
+        <extension>wmls</extension>
+        <mime-type>text/vnd.wap.wmlscript</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- Compiled WML Script -->
+        <extension>wmlsc</extension>
+        <mime-type>application/vnd.wap.wmlscriptc</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wmv</extension>
+        <mime-type>video/x-ms-wmv</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wmx</extension>
+        <mime-type>video/x-ms-wmx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wmz</extension>
+        <mime-type>application/x-msmetafile</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>woff</extension>
+        <mime-type>application/x-font-woff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wpd</extension>
+        <mime-type>application/vnd.wordperfect</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wpl</extension>
+        <mime-type>application/vnd.ms-wpl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wps</extension>
+        <mime-type>application/vnd.ms-works</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wqd</extension>
+        <mime-type>application/vnd.wqd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wri</extension>
+        <mime-type>application/x-mswrite</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wrl</extension>
+        <mime-type>model/vrml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wsdl</extension>
+        <mime-type>application/wsdl+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wspolicy</extension>
+        <mime-type>application/wspolicy+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wtb</extension>
+        <mime-type>application/vnd.webturbo</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wvx</extension>
+        <mime-type>video/x-ms-wvx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>x32</extension>
+        <mime-type>application/x-authorware-bin</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>x3d</extension>
+        <mime-type>model/x3d+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>x3db</extension>
+        <mime-type>model/x3d+binary</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>x3dbz</extension>
+        <mime-type>model/x3d+binary</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>x3dv</extension>
+        <mime-type>model/x3d+vrml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>x3dvz</extension>
+        <mime-type>model/x3d+vrml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>x3dz</extension>
+        <mime-type>model/x3d+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xaml</extension>
+        <mime-type>application/xaml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xap</extension>
+        <mime-type>application/x-silverlight-app</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xar</extension>
+        <mime-type>application/vnd.xara</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xbap</extension>
+        <mime-type>application/x-ms-xbap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xbd</extension>
+        <mime-type>application/vnd.fujixerox.docuworks.binder</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xbm</extension>
+        <mime-type>image/x-xbitmap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xdf</extension>
+        <mime-type>application/xcap-diff+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xdm</extension>
+        <mime-type>application/vnd.syncml.dm+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xdp</extension>
+        <mime-type>application/vnd.adobe.xdp+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xdssc</extension>
+        <mime-type>application/dssc+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xdw</extension>
+        <mime-type>application/vnd.fujixerox.docuworks</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xenc</extension>
+        <mime-type>application/xenc+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xer</extension>
+        <mime-type>application/patch-ops-error+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xfdf</extension>
+        <mime-type>application/vnd.adobe.xfdf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xfdl</extension>
+        <mime-type>application/vnd.xfdl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xht</extension>
+        <mime-type>application/xhtml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xhtml</extension>
+        <mime-type>application/xhtml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xhvml</extension>
+        <mime-type>application/xv+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xif</extension>
+        <mime-type>image/vnd.xiff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xla</extension>
+        <mime-type>application/vnd.ms-excel</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xlam</extension>
+        <mime-type>application/vnd.ms-excel.addin.macroenabled.12</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xlc</extension>
+        <mime-type>application/vnd.ms-excel</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xlf</extension>
+        <mime-type>application/x-xliff+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xlm</extension>
+        <mime-type>application/vnd.ms-excel</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xls</extension>
+        <mime-type>application/vnd.ms-excel</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xlsb</extension>
+        <mime-type>application/vnd.ms-excel.sheet.binary.macroenabled.12</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xlsm</extension>
+        <mime-type>application/vnd.ms-excel.sheet.macroenabled.12</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xlsx</extension>
+        <mime-type>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xlt</extension>
+        <mime-type>application/vnd.ms-excel</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xltm</extension>
+        <mime-type>application/vnd.ms-excel.template.macroenabled.12</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xltx</extension>
+        <mime-type>application/vnd.openxmlformats-officedocument.spreadsheetml.template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xlw</extension>
+        <mime-type>application/vnd.ms-excel</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xm</extension>
+        <mime-type>audio/xm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xml</extension>
+        <mime-type>application/xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xo</extension>
+        <mime-type>application/vnd.olpc-sugar</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xop</extension>
+        <mime-type>application/xop+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xpi</extension>
+        <mime-type>application/x-xpinstall</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xpl</extension>
+        <mime-type>application/xproc+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xpm</extension>
+        <mime-type>image/x-xpixmap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xpr</extension>
+        <mime-type>application/vnd.is-xpr</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xps</extension>
+        <mime-type>application/vnd.ms-xpsdocument</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xpw</extension>
+        <mime-type>application/vnd.intercon.formnet</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xpx</extension>
+        <mime-type>application/vnd.intercon.formnet</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xsl</extension>
+        <mime-type>application/xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xslt</extension>
+        <mime-type>application/xslt+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xsm</extension>
+        <mime-type>application/vnd.syncml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xspf</extension>
+        <mime-type>application/xspf+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xul</extension>
+        <mime-type>application/vnd.mozilla.xul+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xvm</extension>
+        <mime-type>application/xv+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xvml</extension>
+        <mime-type>application/xv+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xwd</extension>
+        <mime-type>image/x-xwindowdump</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xyz</extension>
+        <mime-type>chemical/x-xyz</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xz</extension>
+        <mime-type>application/x-xz</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>yang</extension>
+        <mime-type>application/yang</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>yin</extension>
+        <mime-type>application/yin+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>z</extension>
+        <mime-type>application/x-compress</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>Z</extension>
+        <mime-type>application/x-compress</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>z1</extension>
+        <mime-type>application/x-zmachine</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>z2</extension>
+        <mime-type>application/x-zmachine</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>z3</extension>
+        <mime-type>application/x-zmachine</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>z4</extension>
+        <mime-type>application/x-zmachine</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>z5</extension>
+        <mime-type>application/x-zmachine</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>z6</extension>
+        <mime-type>application/x-zmachine</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>z7</extension>
+        <mime-type>application/x-zmachine</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>z8</extension>
+        <mime-type>application/x-zmachine</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>zaz</extension>
+        <mime-type>application/vnd.zzazz.deck+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>zip</extension>
+        <mime-type>application/zip</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>zir</extension>
+        <mime-type>application/vnd.zul</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>zirz</extension>
+        <mime-type>application/vnd.zul</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>zmm</extension>
+        <mime-type>application/vnd.handheld-entertainment+xml</mime-type>
+    </mime-mapping>
+
+    <!-- ==================== Default Welcome File List ===================== -->
+    <!-- When a request URI refers to a directory, the default servlet looks  -->
+    <!-- for a "welcome file" within that directory and, if present, to the   -->
+    <!-- corresponding resource URI for display.                              -->
+    <!-- If no welcome files are present, the default servlet either serves a -->
+    <!-- directory listing (see default servlet configuration on how to       -->
+    <!-- customize) or returns a 404 status, depending on the value of the    -->
+    <!-- listings setting.                                                    -->
+    <!--                                                                      -->
+    <!-- If you define welcome files in your own application's web.xml        -->
+    <!-- deployment descriptor, that list *replaces* the list configured      -->
+    <!-- here, so be sure to include any of the default values that you wish  -->
+    <!-- to use within your application.                                       -->
+
+    <welcome-file-list>
+        <welcome-file>index.html</welcome-file>
+        <welcome-file>index.htm</welcome-file>
+        <!--        <welcome-file>index.jsp</welcome-file> -->
+    </welcome-file-list>
+
+</web-app>
diff --git a/pom.xml b/pom.xml
deleted file mode 100644
index 37585ce..0000000
--- a/pom.xml
+++ /dev/null
@@ -1,2149 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0          http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>org.artifactory</groupId>
-    <artifactId>artifactory-parent</artifactId>
-    <packaging>pom</packaging>
-    <version>4.8.0</version>
-    <name>Artifactory Parent</name>
-    <url>http://artifactory.jfrog.org/</url>
-
-    <scm>
-        <connection>scm:svn:http://subversion.jfrog.org/artifactory/trunk</connection>
-        <developerConnection>scm:svn:http://subversion.jfrog.org/artifactory/trunk</developerConnection>
-        <url>http://subversion.jfrog.org/artifactory</url>
-    </scm>
-
-    <issueManagement>
-        <system>jira</system>
-        <url>http://issues.jfrog.org/jira/browse/RTFACT</url>
-    </issueManagement>
-
-    <licenses>
-        <license>
-            <name>GNU Lesser General Public License, Version 3</name>
-            <url>http://www.gnu.org/licenses/lgpl-3.0.txt</url>
-            <distribution>repo</distribution>
-        </license>
-    </licenses>
-
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <sourceforgeId>175347</sourceforgeId>
-        <sourceforgeName>artifactory</sourceforgeName>
-        <binarystore.version>1.0.0</binarystore.version>
-        <spring.version>4.1.5.RELEASE</spring.version>
-        <spring.security.version>3.2.0.RELEASE</spring.security.version>
-        <build.info.version>2.5.3</build.info.version>
-        <jetty.version>7.0.2.v20100331</jetty.version>
-        <tomcat.version>8.0.32</tomcat.version>
-        <maven.version>3.0.4</maven.version>
-        <jersey.version>1.19</jersey.version>
-        <slf4j.version>1.7.5</slf4j.version>
-        <jackson.version>1.9.5</jackson.version>
-        <sonar.java.source>1.8</sonar.java.source>
-        <sonar.java.target>1.8</sonar.java.target>
-        <javaHomeClasses>${java.home}/lib</javaHomeClasses>
-        <javaRtJar>${java.home}/lib/rt.jar</javaRtJar>
-    </properties>
-
-    <mailingLists>
-        <mailingList>
-            <name>Artifactory Users List</name>
-            <subscribe>https://lists.sourceforge.net/lists/listinfo/artifactory-users</subscribe>
-            <archive>http://forums.jfrog.org/Artifactory-Users-f2377369.html</archive>
-        </mailingList>
-    </mailingLists>
-
-    <developers>
-        <developer>
-            <id>ylandman</id>
-            <name>Yoav Landman</name>
-            <email>ylandman at gmail dot com</email>
-            <roles>
-                <role>Lead Developer</role>
-            </roles>
-        </developer>
-        <developer>
-            <id>freddy33</id>
-            <name>Frederic Simon</name>
-            <email>frederic.simon at gmail.com</email>
-            <roles>
-                <role>Developer</role>
-            </roles>
-        </developer>
-        <developer>
-            <id>yossis</id>
-            <name>Yossi Shaul</name>
-            <email>yoshaul at gmail.com</email>
-            <roles>
-                <role>Developer</role>
-            </roles>
-        </developer>
-    </developers>
-
-    <prerequisites>
-        <maven>3.0.4</maven>
-    </prerequisites>
-
-    <description>
-        Artifactory is an enterprise repository for binaries. It offers advanced artifacts proxying, caching and
-        management facilities to provide a robust, reproducible and independent build environment when using Maven 2/3,
-        Gradle and Ant/Ivy.
-    </description>
-
-    <modules>
-        <module>base</module>
-        <module>storage</module>
-        <module>support</module>
-        <module>backend</module>
-        <module>web</module>
-        <module>distribution</module>
-    </modules>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.testng</groupId>
-            <artifactId>testng</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.google.code.findbugs</groupId>
-            <artifactId>jsr305</artifactId>
-        </dependency>
-    </dependencies>
-
-    <dependencyManagement>
-        <dependencies>
-            <!-- internal dependencies management -->
-            <dependency>
-                <groupId>org.artifactory</groupId>
-                <artifactId>artifactory-config</artifactId>
-                <version>4.8.0</version>
-            </dependency>
-            <dependency>
-                <groupId>org.artifactory</groupId>
-                <artifactId>artifactory-config</artifactId>
-                <version>4.8.0</version>
-                <type>test-jar</type>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.artifactory</groupId>
-                <artifactId>artifactory-common</artifactId>
-                <version>4.8.0</version>
-            </dependency>
-            <dependency>
-                <groupId>org.artifactory</groupId>
-                <artifactId>artifactory-capi</artifactId>
-                <version>4.8.0</version>
-            </dependency>
-            <dependency>
-                <groupId>org.artifactory</groupId>
-                <artifactId>artifactory-papi</artifactId>
-                <version>4.8.0</version>
-            </dependency>
-            <dependency>
-                <groupId>org.artifactory</groupId>
-                <artifactId>artifactory-api</artifactId>
-                <version>4.8.0</version>
-            </dependency>
-            <dependency>
-                <groupId>org.artifactory</groupId>
-                <artifactId>artifactory-storage-common</artifactId>
-                <version>4.8.0</version>
-            </dependency>
-            <dependency>
-                <groupId>org.artifactory</groupId>
-                <artifactId>artifactory-storage-core</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.artifactory</groupId>
-                <artifactId>artifactory-support-core</artifactId>
-                <version>4.8.0</version>
-            </dependency>
-            <dependency>
-                <groupId>org.artifactory</groupId>
-                <artifactId>artifactory-storage-config</artifactId>
-                <version>4.8.0</version>
-            </dependency>
-            <dependency>
-                <groupId>org.artifactory</groupId>
-                <artifactId>artifactory-storage-config</artifactId>
-                <version>4.8.0</version>
-                <type>test-jar</type>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.artifactory</groupId>
-                <artifactId>artifactory-traffic</artifactId>
-                <version>4.8.0</version>
-            </dependency>
-            <dependency>
-                <groupId>org.artifactory</groupId>
-                <artifactId>artifactory-log</artifactId>
-                <version>4.8.0</version>
-            </dependency>
-            <dependency>
-                <groupId>org.artifactory</groupId>
-                <artifactId>artifactory-core</artifactId>
-                <version>4.8.0</version>
-            </dependency>
-            <dependency>
-                <groupId>org.artifactory</groupId>
-                <artifactId>artifactory-update</artifactId>
-                <version>4.8.0</version>
-            </dependency>
-            <dependency>
-                <groupId>org.artifactory</groupId>
-                <artifactId>artifactory-rest-common</artifactId>
-                <version>4.8.0</version>
-            </dependency>
-            <dependency>
-                <groupId>org.artifactory</groupId>
-                <artifactId>artifactory-rest</artifactId>
-                <version>4.8.0</version>
-            </dependency>
-            <dependency>
-                <groupId>org.artifactory</groupId>
-                <artifactId>artifactory-rest-ui</artifactId>
-                <version>4.8.0</version>
-            </dependency>
-            <dependency>
-                <groupId>org.artifactory</groupId>
-                <artifactId>artifactory-angular-web</artifactId>
-                <version>4.8.0</version>
-            </dependency>
-            <dependency>
-                <groupId>org.artifactory</groupId>
-                <artifactId>artifactory-web-application</artifactId>
-                <version>4.8.0</version>
-            </dependency>
-            <dependency>
-                <groupId>org.artifactory</groupId>
-                <artifactId>artifactory-web-common</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.artifactory</groupId>
-                <artifactId>artifactory-web-war</artifactId>
-                <version>4.8.0</version>
-                <type>war</type>
-            </dependency>
-
-            <!-- JFrog Binary Store dependencies -->
-            <dependency>
-                <groupId>org.jfrog.storage</groupId>
-                <artifactId>binary-store-api</artifactId>
-                <version>${binarystore.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.jfrog.storage</groupId>
-                <artifactId>binary-store-core</artifactId>
-                <version>${binarystore.version}</version>
-            </dependency>
-
-            <!-- JFrog Package Indexer dependencies -->
-            <dependency>
-                <groupId>org.jfrog.metadata</groupId>
-                <artifactId>repomd</artifactId>
-                <version>4.3.1</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.jfrog.metadata</groupId>
-                <artifactId>rpm-indexer</artifactId>
-                <version>4.3.0</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.jfrog.metadata</groupId>
-                <artifactId>rpm-extractor</artifactId>
-                <version>4.3.0</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.jfrog.metadata</groupId>
-                <artifactId>rpm-writer</artifactId>
-                <version>4.3.0</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.jfrog.metadata</groupId>
-                <artifactId>gems-extractor</artifactId>
-                <version>4.1.0</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.jfrog.metadata</groupId>
-                <artifactId>npm</artifactId>
-                <version>4.3.0</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.jfrog.metadata</groupId>
-                <artifactId>bower</artifactId>
-                <version>4.2.6</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.jfrog.metadata</groupId>
-                <artifactId>cocoapods</artifactId>
-                <version>4.2.2</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.jfrog.metadata</groupId>
-                <artifactId>dpkg-common</artifactId>
-                <version>4.3.3</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.jfrog.metadata</groupId>
-                <artifactId>deb</artifactId>
-                <version>4.3.3</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.jfrog.metadata</groupId>
-                <artifactId>opkg</artifactId>
-                <version>4.3.3</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.jfrog.metadata</groupId>
-                <artifactId>docker</artifactId>
-                <version>4.2.7</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.jfrog.metadata</groupId>
-                <artifactId>pypi</artifactId>
-                <version>4.3.2</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.jfrog.metadata</groupId>
-                <artifactId>vagrant</artifactId>
-                <version>4.1.0</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.jfrog.metadata</groupId>
-                <artifactId>nuget</artifactId>
-                <version>4.3.1</version>
-            </dependency>
-
-            <!-- JFrog Build Info dependencies -->
-            <dependency>
-                <groupId>org.jfrog.buildinfo</groupId>
-                <artifactId>build-info-api</artifactId>
-                <version>${build.info.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>commons-logging</groupId>
-                        <artifactId>commons-logging</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <!-- Embedded Tomcat version set here -->
-            <dependency>
-                <groupId>org.apache.tomcat</groupId>
-                <artifactId>tomcat</artifactId>
-                <version>${tomcat.version}</version>
-                <type>zip</type>
-            </dependency>
-
-            <!-- force provided scope (for transitive dependencies) -->
-            <dependency>
-                <groupId>javax.servlet</groupId>
-                <artifactId>servlet-api</artifactId>
-                <version>2.5</version>
-                <scope>provided</scope>
-            </dependency>
-
-            <dependency>
-                <groupId>javax.servlet</groupId>
-                <artifactId>javax.servlet-api</artifactId>
-                <version>3.1.0</version>
-                <scope>provided</scope>
-            </dependency>
-
-            <dependency>
-                <groupId>com.sun.jersey</groupId>
-                <artifactId>jersey-core</artifactId>
-                <version>${jersey.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>com.sun.jersey</groupId>
-                <artifactId>jersey-server</artifactId>
-                <version>${jersey.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>com.sun.jersey</groupId>
-                <artifactId>jersey-client</artifactId>
-                <version>${jersey.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>com.sun.jersey.contribs</groupId>
-                <artifactId>jersey-spring</artifactId>
-                <version>${jersey.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-webmvc</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>com.sun.jersey.contribs</groupId>
-                <artifactId>jersey-multipart</artifactId>
-                <version>${jersey.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.codehaus.groovy</groupId>
-                <artifactId>groovy-all</artifactId>
-                <version>2.4.5</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>asm</groupId>
-                        <artifactId>asm</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>org.codehaus.gpars</groupId>
-                <artifactId>gpars</artifactId>
-                <version>0.12</version>
-                <scope>test</scope>
-            </dependency>
-
-            <dependency>
-                <groupId>org.apache.tomcat.embed</groupId>
-                <artifactId>tomcat-embed-core</artifactId>
-                <version>${tomcat.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.apache.tomcat.embed</groupId>
-                <artifactId>tomcat-embed-jasper</artifactId>
-                <version>${tomcat.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.apache.tomcat.embed</groupId>
-                <artifactId>tomcat-embed-logging-juli</artifactId>
-                <version>${tomcat.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-server</artifactId>
-                <version>${jetty.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-xml</artifactId>
-                <version>${jetty.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-webapp</artifactId>
-                <version>${jetty.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-ajp</artifactId>
-                <version>${jetty.version}</version>
-                <optional>true</optional>
-            </dependency>
-
-            <dependency>
-                <groupId>org.codehaus.jackson</groupId>
-                <artifactId>jackson-jaxrs</artifactId>
-                <version>${jackson.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.codehaus.jackson</groupId>
-                <artifactId>jackson-xc</artifactId>
-                <version>${jackson.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.codehaus.jackson</groupId>
-                <artifactId>jackson-mapper-asl</artifactId>
-                <version>${jackson.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.slf4j</groupId>
-                <artifactId>slf4j-api</artifactId>
-                <version>${slf4j.version}</version>
-                <scope>compile</scope>
-            </dependency>
-
-            <!-- bridge from apache commons logging to slf4j -->
-            <dependency>
-                <groupId>org.slf4j</groupId>
-                <artifactId>jcl-over-slf4j</artifactId>
-                <version>${slf4j.version}</version>
-                <scope>runtime</scope>
-            </dependency>
-
-            <!-- bridge from java utils logging to slf4j -->
-            <dependency>
-                <groupId>org.slf4j</groupId>
-                <artifactId>jul-to-slf4j</artifactId>
-                <version>${slf4j.version}</version>
-                <scope>runtime</scope>
-            </dependency>
-
-            <!-- bridge from log4j to slf4j -->
-            <dependency>
-                <groupId>org.slf4j</groupId>
-                <artifactId>log4j-over-slf4j</artifactId>
-                <version>${slf4j.version}</version>
-                <scope>compile</scope>
-            </dependency>
-
-            <dependency>
-                <groupId>ch.qos.logback</groupId>
-                <artifactId>logback-core</artifactId>
-                <version>1.0.10</version>
-            </dependency>
-
-            <dependency>
-                <groupId>ch.qos.logback</groupId>
-                <artifactId>logback-classic</artifactId>
-                <version>1.0.10</version>
-            </dependency>
-
-            <dependency>
-                <groupId>com.google.guava</groupId>
-                <artifactId>guava</artifactId>
-                <version>18.0</version>
-            </dependency>
-
-            <dependency>
-                <groupId>commons-collections</groupId>
-                <artifactId>commons-collections</artifactId>
-                <version>3.2.2</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.apache.httpcomponents</groupId>
-                <artifactId>httpclient</artifactId>
-                <version>4.5.1</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>commons-logging</groupId>
-                        <artifactId>commons-logging</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>org.apache.httpcomponents</groupId>
-                <artifactId>httpclient-cache</artifactId>
-                <version>4.3.5</version>
-            </dependency>
-
-            <!-- for multipart requests -->
-            <dependency>
-                <groupId>org.apache.httpcomponents</groupId>
-                <artifactId>httpmime</artifactId>
-                <version>4.3.3</version>
-                <scope>test</scope>
-            </dependency>
-
-            <dependency>
-                <groupId>commons-io</groupId>
-                <artifactId>commons-io</artifactId>
-                <version>2.4</version>
-            </dependency>
-
-            <dependency>
-                <groupId>commons-lang</groupId>
-                <artifactId>commons-lang</artifactId>
-                <version>2.6</version>
-            </dependency>
-
-            <dependency>
-                <groupId>commons-codec</groupId>
-                <artifactId>commons-codec</artifactId>
-                <version>1.9</version>
-            </dependency>
-
-            <dependency>
-                <groupId>commons-digester</groupId>
-                <artifactId>commons-digester</artifactId>
-                <version>2.0</version>
-            </dependency>
-
-            <dependency>
-                <groupId>javax.annotation</groupId>
-                <artifactId>jsr250-api</artifactId>
-                <version>1.0</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.codehaus.plexus</groupId>
-                <artifactId>plexus-utils</artifactId>
-                <version>2.0.5</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.codehaus.plexus</groupId>
-                <artifactId>plexus-component-annotations</artifactId>
-                <version>1.2.1</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.apache.maven</groupId>
-                <artifactId>maven-artifact</artifactId>
-                <version>${maven.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.apache.maven</groupId>
-                <artifactId>maven-artifact-manager</artifactId>
-                <version>2.2.1</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.apache.maven.wagon</groupId>
-                <artifactId>wagon-provider-api</artifactId>
-                <version>1.0-beta-6</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.apache.maven</groupId>
-                <artifactId>maven-repository-metadata</artifactId>
-                <version>${maven.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.apache.maven</groupId>
-                <artifactId>maven-settings</artifactId>
-                <version>${maven.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.codehaus.plexus</groupId>
-                        <artifactId>plexus-interpolation</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>org.apache.maven</groupId>
-                <artifactId>maven-plugin-descriptor</artifactId>
-                <version>2.2.1</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.apache.maven</groupId>
-                <artifactId>maven-project</artifactId>
-                <version>2.2.1</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.apache.maven</groupId>
-                        <artifactId>maven-profile</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.maven</groupId>
-                        <artifactId>maven-plugin-registry</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.codehaus.plexus</groupId>
-                        <artifactId>plexus-interpolation</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>versions-maven-plugin</artifactId>
-                <version>1.3.1</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.apache.maven</groupId>
-                        <artifactId>maven-core</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.maven.reporting</groupId>
-                        <artifactId>maven-reporting-api</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.maven.reporting</groupId>
-                        <artifactId>maven-reporting-impl</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.maven.shared</groupId>
-                        <artifactId>maven-common-artifact-filters</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.maven.wagon</groupId>
-                        <artifactId>wagon-file</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.maven.doxia</groupId>
-                        <artifactId>doxia-sink-api</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.maven.doxia</groupId>
-                        <artifactId>doxia-site-renderer</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.codehaus.plexus</groupId>
-                        <artifactId>plexus-i18n</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.codehaus.woodstox</groupId>
-                        <artifactId>wstx-asl</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>stax</groupId>
-                        <artifactId>stax-api</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>org.apache.derby</groupId>
-                <artifactId>derby</artifactId>
-                <version>10.11.1.1</version>
-                <scope>runtime</scope>
-            </dependency>
-
-            <dependency>
-                <groupId>commons-beanutils</groupId>
-                <artifactId>commons-beanutils</artifactId>
-                <version>1.8.3</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>commons-logging</groupId>
-                        <artifactId>commons-logging</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-core</artifactId>
-                <version>${spring.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>commons-logging</groupId>
-                        <artifactId>commons-logging</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-beans</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-expression</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-context</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-tx</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-aop</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-
-            <!-- required for spring security web -->
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-web</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-aspects</artifactId>
-                <version>${spring.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.aspectj</groupId>
-                        <artifactId>aspectjrt</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.aspectj</groupId>
-                        <artifactId>aspectjweaver</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <!-- required for scheduling -->
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-context-support</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>aopalliance</groupId>
-                <artifactId>aopalliance</artifactId>
-                <version>1.0</version>
-                <scope>compile</scope>
-            </dependency>
-
-            <dependency>
-                <groupId>org.quartz-scheduler</groupId>
-                <artifactId>quartz</artifactId>
-                <version>2.2.1</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>c3p0</groupId>
-                        <artifactId>c3p0</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>javax.transaction</groupId>
-                <artifactId>jta</artifactId>
-                <version>1.0.1B</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.springframework.security</groupId>
-                <artifactId>spring-security-core</artifactId>
-                <version>${spring.security.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-dao</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.aspectj</groupId>
-                        <artifactId>aspectjrt</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.aspectj</groupId>
-                        <artifactId>aspectjweaver</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>org.springframework.security</groupId>
-                <artifactId>spring-security-config</artifactId>
-                <version>${spring.security.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.springframework.security</groupId>
-                <artifactId>spring-security-acl</artifactId>
-                <version>${spring.security.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.springframework</groupId>
-                        <artifactId>spring-jdbc</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>org.springframework.security</groupId>
-                <artifactId>spring-security-ldap</artifactId>
-                <version>${spring.security.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.springframework.security</groupId>
-                <artifactId>spring-security-web</artifactId>
-                <version>${spring.security.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>com.thoughtworks.xstream</groupId>
-                <artifactId>xstream</artifactId>
-                <version>1.4.9</version>
-            </dependency>
-
-            <!--StaX-->
-            <dependency>
-                <groupId>org.codehaus.woodstox</groupId>
-                <artifactId>woodstox-core-asl</artifactId>
-                <version>4.2.0</version>
-                <scope>runtime</scope>
-                <exclusions>
-                    <exclusion>
-                        <groupId>javax.xml.stream</groupId>
-                        <artifactId>stax-api</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>org.apache.maven.indexer</groupId>
-                <artifactId>indexer-core</artifactId>
-                <version>5.1.0</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.apache.lucene</groupId>
-                        <artifactId>lucene-highlighter</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>apache-slide</groupId>
-                <artifactId>webdavlib</artifactId>
-                <version>2.0</version>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>junit</groupId>
-                <artifactId>junit</artifactId>
-                <version>3.8.1</version>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.testng</groupId>
-                <artifactId>testng</artifactId>
-                <version>6.8.5</version>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.easymock</groupId>
-                <artifactId>easymock</artifactId>
-                <version>3.1</version>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.mockito</groupId>
-                <artifactId>mockito-core</artifactId>
-                <version>1.9.0</version>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.spockframework</groupId>
-                <artifactId>spock-core</artifactId>
-                <version>0.7-groovy-2.0</version>
-                <scope>test</scope>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.codehaus.groovy</groupId>
-                        <artifactId>groovy-all</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-test</artifactId>
-                <version>${spring.version}</version>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.easytesting</groupId>
-                <artifactId>fest-assert</artifactId>
-                <version>1.4</version>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>mysql</groupId>
-                <artifactId>mysql-connector-java</artifactId>
-                <version>5.1.27</version>
-                <scope>test</scope>
-                <optional>true</optional>
-            </dependency>
-            <dependency>
-                <groupId>com.oracle</groupId>
-                <artifactId>ojdbc6</artifactId>
-                <version>11.2.0.3</version>
-                <scope>test</scope>
-                <optional>true</optional>
-            </dependency>
-            <dependency>
-                <groupId>postgresql</groupId>
-                <artifactId>postgresql</artifactId>
-                <version>9.2-1002.jdbc4</version>
-                <scope>test</scope>
-                <optional>true</optional>
-            </dependency>
-            <dependency>
-                <groupId>com.microsoft.sqlserver</groupId>
-                <artifactId>sqljdbc4</artifactId>
-                <version>4.0</version>
-                <scope>test</scope>
-                <optional>true</optional>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.ivy</groupId>
-                <artifactId>ivy</artifactId>
-                <version>2.2.0</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>ant</groupId>
-                        <artifactId>ant</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>ant</groupId>
-                        <artifactId>ant-nodeps</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>ant</groupId>
-                        <artifactId>ant-trax</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>oro</groupId>
-                        <artifactId>oro</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>commons-vfs</groupId>
-                        <artifactId>commons-vfs</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>com.jcraft</groupId>
-                        <artifactId>jsch</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>org.jdom</groupId>
-                <artifactId>jdom2</artifactId>
-                <version>2.0.5</version>
-                <exclusions>
-                    <!-- xpath features -->
-                    <exclusion>
-                        <groupId>jaxen</groupId>
-                        <artifactId>jaxen</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>javax.mail</groupId>
-                <artifactId>mail</artifactId>
-                <version>1.4.7</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>javax.activation</groupId>
-                        <artifactId>activation</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>com.google.code.atinject</groupId>
-                <artifactId>atinject</artifactId>
-                <version>1.0.0-rev3</version>
-            </dependency>
-
-            <dependency>
-                <groupId>com.google.code.findbugs</groupId>
-                <artifactId>jsr305</artifactId>
-                <version>2.0.0</version>
-            </dependency>
-
-            <dependency>
-                <groupId>net.java.dev.stax-utils</groupId>
-                <artifactId>stax-utils</artifactId>
-                <version>20060502</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>com.bea.xml</groupId>
-                        <artifactId>jsr173-ri</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>org.ocpsoft.prettytime</groupId>
-                <artifactId>prettytime</artifactId>
-                <version>3.0.2.Final</version>
-            </dependency>
-
-            <dependency>
-                <groupId>joda-time</groupId>
-                <artifactId>joda-time</artifactId>
-                <version>2.2</version>
-            </dependency>
-
-            <dependency>
-                <groupId>com.atlassian.crowd.client</groupId>
-                <artifactId>atlassian-crowd-rest-client</artifactId>
-                <version>1.2</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.freemarker</groupId>
-                <artifactId>freemarker</artifactId>
-                <version>2.3.18</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.bouncycastle</groupId>
-               <artifactId>bcprov-jdk15on</artifactId>
-                <version>1.53</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.bouncycastle</groupId>
-                <artifactId>bcpg-jdk15on</artifactId>
-                <version>1.53</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.apache.commons</groupId>
-                <artifactId>commons-compress</artifactId>
-                <version>1.10</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.tukaani</groupId>
-                        <artifactId>xz</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>org.opensaml</groupId>
-                <artifactId>opensaml</artifactId>
-                <version>2.6.4</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>xerces</groupId>
-                        <artifactId>xercesImpl</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>xerces</groupId>
-                        <artifactId>xml-apis</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>xml-apis</groupId>
-                        <artifactId>xml-apis</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.bouncycastle</groupId>
-                        <artifactId>bcprov-jdk15</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>net.jcip</groupId>
-                        <artifactId>jcip-annotations</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>xml-resolver</groupId>
-                        <artifactId>xml-resolver</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>xalan</groupId>
-                        <artifactId>serializer</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>xalan</groupId>
-                        <artifactId>xalan</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.velocity</groupId>
-                        <artifactId>velocity</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>commons-codec</groupId>
-                        <artifactId>commons-codec</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>joda-time</groupId>
-                        <artifactId>joda-time</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.santuario</groupId>
-                        <artifactId>xmlsec</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>commons-logging</groupId>
-                        <artifactId>commons-logging</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>com.github.zafarkhaja</groupId>
-                <artifactId>java-semver</artifactId>
-                <version>0.9.0</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.artifactory</groupId>
-                <artifactId>artifactory-storage-db</artifactId>
-                <version>4.8.0</version>
-            </dependency>
-            <dependency>
-                <groupId>org.artifactory</groupId>
-                <artifactId>artifactory-storage-db</artifactId>
-                <version>4.8.0</version>
-                <type>test-jar</type>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.tomcat</groupId>
-                <artifactId>tomcat-jdbc</artifactId>
-                <version>8.0.32</version>
-            </dependency>
-
-            <dependency>
-                <groupId>commons-dbutils</groupId>
-                <artifactId>commons-dbutils</artifactId>
-                <version>1.4</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-jdbc</artifactId>
-                <version>${spring.version}</version>
-            </dependency>
-
-            <!--blackduck-->
-            <dependency>
-                <groupId>xalan</groupId>
-                <artifactId>xalan</artifactId>
-                <version>2.7.2</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.santuario</groupId>
-                <artifactId>xmlsec</artifactId>
-                <version>1.5.7</version>
-                <scope>runtime</scope>
-                <exclusions>
-                    <exclusion>
-                        <groupId>commons-logging</groupId>
-                        <artifactId>commons-logging</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.ws.security</groupId>
-                <artifactId>wss4j</artifactId>
-                <version>1.6.12</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>commons-logging</groupId>
-                        <artifactId>commons-logging</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>xml-apis</groupId>
-                        <artifactId>xml-apis</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.santuario</groupId>
-                        <artifactId>xmlsec</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.cxf</groupId>
-                <artifactId>cxf-rt-frontend-jaxws</artifactId>
-                <version>2.7.6</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.apache.geronimo.specs</groupId>
-                        <artifactId>geronimo-javamail_1.4_spec</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.geronimo.specs</groupId>
-                        <artifactId>geronimo-activation_1.1_spec</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.geronimo.specs</groupId>
-                        <artifactId>geronimo-annotation_1.0_spec</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <artifactId>commons-logging</artifactId>
-                        <groupId>commons-logging</groupId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>javax.xml.bind</groupId>
-                        <artifactId>jaxb-api</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>com.sun.xml.bind</groupId>
-                        <artifactId>jaxb-impl</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>asm</groupId>
-                        <artifactId>asm</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.cxf</groupId>
-                <artifactId>cxf-rt-ws-security</artifactId>
-                <version>2.7.6</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.bouncycastle</groupId>
-                        <artifactId>bcprov-jdk15</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.geronimo.specs</groupId>
-                        <artifactId>geronimo-annotation_1.0_spec</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>javax.xml.bind</groupId>
-                        <artifactId>jaxb-api</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>commons-logging</groupId>
-                        <artifactId>commons-logging</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.cxf</groupId>
-                <artifactId>cxf-rt-transports-http</artifactId>
-                <version>2.7.6</version>
-            </dependency>
-            <dependency>
-                <groupId>com.blackducksoftware.codecenter.sdkclient</groupId>
-                <artifactId>codecenter-sdk-utilities</artifactId>
-                <version>6.7.0</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>commons-logging</groupId>
-                        <artifactId>commons-logging</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.santuario</groupId>
-                        <artifactId>xmlsec</artifactId>
-                    </exclusion>
-					<exclusion>
-                        <groupId>javax.xml.bind</groupId>
-                        <artifactId>jaxb-api</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>com.sun.xml.bind</groupId>
-                        <artifactId>jaxb-impl</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>com.blackducksoftware.codecenter.sdkclient</groupId>
-                <artifactId>codecenter-sdk-client</artifactId>
-                <version>6.7.0</version>
-				<exclusions>
-					<exclusion>
-                        <groupId>javax.xml.bind</groupId>
-                        <artifactId>jaxb-api</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>com.sun.xml.bind</groupId>
-                        <artifactId>jaxb-impl</artifactId>
-                    </exclusion>
-				</exclusions>
-            </dependency>
-           <!-- <dependency>
-                <groupId>com.blackducksoftware.codecenter.integration</groupId>
-                <artifactId>codecenter-integration-utilities</artifactId>
-                <version>6.5.0.1</version>
-            </dependency>-->
-            <dependency>
-                <groupId>com.blackducksoftware.codecenter.integration</groupId>
-                <artifactId>codecenter-integration-client</artifactId>
-                <version>6.7.0</version>
-            </dependency>
-            <dependency>
-                <groupId>com.blackducksoftware.codecenter.cxf</groupId>
-                <artifactId>blackduck-cxf-utilities</artifactId>
-                <version>1.1</version>
-            </dependency>
-            <!--jruby-->
-            <dependency>
-                <groupId>org.jruby</groupId>
-                <artifactId>jruby-core</artifactId>
-                <version>1.7.4</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>com.github.jnr</groupId>
-                        <artifactId>jnr-netdb</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>com.github.jnr</groupId>
-                        <artifactId>jnr-enxio</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>com.github.jnr</groupId>
-                        <artifactId>jnr-unixsocket</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>com.github.jnr</groupId>
-                        <artifactId>jffi</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>com.github.jnr</groupId>
-                        <artifactId>jnr-x86asm</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.jruby</groupId>
-                        <artifactId>joni</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>jline</groupId>
-                        <artifactId>jline</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>com.headius</groupId>
-                        <artifactId>invokebinder</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>org.yaml</groupId>
-                <artifactId>snakeyaml</artifactId>
-                <version>1.11</version>
-            </dependency>
-
-            <!--NuGet OData-->
-            <!-- Release build of odata4j from git revision 7d5e79cfc27135499b8525c451e790cc110a26a7 -->
-            <dependency>
-                <groupId>org.odata4j</groupId>
-                <artifactId>odata4j-core-jfrog</artifactId>
-                <version>0.8.0</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.eclipse.persistence</groupId>
-                        <artifactId>javax.persistence</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.eclipse.persistence</groupId>
-                        <artifactId>eclipselink</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>javax.ws.rs</groupId>
-                        <artifactId>jsr311-api</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>org.iostreams</groupId>
-                <artifactId>iostreams</artifactId>
-                <version>0.2</version>
-            </dependency>
-
-            <dependency>
-                <groupId>com.hazelcast</groupId>
-                <artifactId>hazelcast</artifactId>
-                <version>3.6.1</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>com.eclipsesource.minimal-json</groupId>
-                        <!-- should be excluded in the client, but just in case -->
-                        <artifactId>minimal-json</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>net.sourceforge.findbugs</groupId>
-                        <!-- should be excluded in the client, but just in case -->
-                        <artifactId>annotations</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>com.jfrog.bintray.client</groupId>
-                <artifactId>bintray-client-java-service</artifactId>
-                <version>0.9.0</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.codehaus.groovy</groupId>
-                        <artifactId>groovy</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.slf4j</groupId>
-                        <artifactId>slf4j-api</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.slf4j</groupId>
-                        <artifactId>log4j-over-slf4j</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.slf4j</groupId>
-                        <artifactId>jcl-over-slf4j</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>ch.qos.logback</groupId>
-                        <artifactId>logback-classic</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>ch.qos.logback</groupId>
-                        <artifactId>logback-core</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.httpcomponents</groupId>
-                        <artifactId>httpclient</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.httpcomponents</groupId>
-                        <artifactId>httpcomponents-core</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>com.jamesmurty.utils</groupId>
-                <artifactId>java-xmlbuilder</artifactId>
-                <version>1.1</version>
-            </dependency>
-
-            <dependency>
-                <groupId>net.java.dev.jets3t</groupId>
-                <artifactId>jets3t</artifactId>
-                <version>0.9.4</version>
-                <exclusions>
-                   <!-- <exclusion>
-                        <groupId>org.bouncycastle</groupId>
-                        <artifactId>bcprov-jdk15on</artifactId>
-                    </exclusion>-->
-                    <exclusion>
-                        <groupId>com.jamesmurty.utils</groupId>
-                        <artifactId>ava-xmlbuilder</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.httpcomponents</groupId>
-                        <artifactId>httpcore</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.codehaus.jackson</groupId>
-                        <artifactId>jackson-core-asl</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>javax.activation</groupId>
-                        <artifactId>activation</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.codehaus.jackson</groupId>
-                        <artifactId>jackson-core-asl</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>commons-logging</groupId>
-                        <artifactId>commons-logging</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>net.iharder</groupId>
-                        <artifactId>base64</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>org.apache.jclouds</groupId>
-                <artifactId>jclouds-allblobstore</artifactId>
-                <version>1.9.1</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.yaml</groupId>
-                        <artifactId>snakeyaml</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.testng</groupId>
-                        <artifactId>junit</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>com.jamesmurty.utils</groupId>
-                        <artifactId>java-xmlbuilder</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.jclouds.api</groupId>
-                        <artifactId>atmos</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.jclouds.provider</groupId>
-                        <artifactId>azureblob</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.jclouds.api</groupId>
-                        <artifactId>atmos</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>javax.inject</groupId>
-                        <artifactId>javax.inject</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>javax.annotation</groupId>
-                        <artifactId>jsr250-api</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.jclouds.provider</groupId>
-                        <artifactId>hpcloud-objectstorage</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.jclouds.api</groupId>
-                        <artifactId>filesystem</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.jclouds.provider</groupId>
-                        <artifactId>cloudfiles-us</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.jclouds.provider</groupId>
-                        <artifactId>cloudfiles-uk</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.jclouds.api</groupId>
-                        <artifactId>openstack</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.jclouds.api</groupId>
-                        <artifactId>cloudfiles</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.jclouds.api</groupId>
-                        <artifactId>openstack-keystone</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.jclouds.common</groupId>
-                        <artifactId>openstack-common</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.jclouds.api</groupId>
-                        <artifactId>swift</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.jclouds.api</groupId>
-                        <artifactId>openstack-swift</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.jclouds.provider</groupId>
-                        <artifactId>rackspace-cloudfiles-us</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.jclouds.provider</groupId>
-                        <artifactId>rackspace-cloudfiles-uk</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>javax.ws.rs</groupId>
-                        <artifactId>jsr311-api</artifactId>
-                    </exclusion>
-
-
-                    <!-- All what's needed for S3 stays
-                    <exclusion>
-                        <groupId>com.google.inject</groupId>
-                        <artifactId>guice</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.jclouds.api</groupId>
-                        <artifactId>sts</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.jclouds</groupId>
-                        <artifactId>jclouds-core</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>com.google.inject.extensions</groupId>
-                        <artifactId>guice-assistedinject</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>com.google.code.gson</groupId>
-                        <artifactId>gson</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.99soft.guice</groupId>
-                        <artifactId>rocoto</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.jclouds.provider</groupId>
-                        <artifactId>aws-s3</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>org.apache.jclouds</groupId>
-                        <artifactId>jclouds-blobstore</artifactId>
-                    </exclusion>
-                    -->
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.jclouds</groupId>
-                <artifactId>jclouds-core</artifactId>
-                <version>1.9.1</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>javax.ws.rs</groupId>
-                        <artifactId>jsr311-api</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>javax.inject</groupId>
-                        <artifactId>javax.inject</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>javax.annotation</groupId>
-                        <artifactId>jsr250-api</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.jclouds.labs</groupId>
-                <artifactId>google-cloud-storage-jfrog</artifactId>
-                <version>1.9.1</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.apache.sshd</groupId>
-                <artifactId>sshd-core</artifactId>
-                <version>0.14.0</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.bouncycastle</groupId>
-                <artifactId>bcpkix-jdk15on</artifactId>
-                <version>1.53</version>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
-    <build>
-        <resources>
-            <resource>
-                <filtering>false</filtering>
-                <directory>src/main/java</directory>
-                <includes>
-                    <include>**/*</include>
-                </includes>
-                <excludes>
-                    <exclude>**/*.java</exclude>
-                </excludes>
-            </resource>
-            <resource>
-                <filtering>false</filtering>
-                <directory>src/main/resources</directory>
-                <includes>
-                    <include>**/*</include>
-                </includes>
-                <excludes>
-                    <exclude>**/*.java</exclude>
-                </excludes>
-            </resource>
-            <resource>
-                <filtering>true</filtering>
-                <directory>src/main/filtered-resources</directory>
-            </resource>
-        </resources>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-enforcer-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>enforce</goal>
-                        </goals>
-                        <configuration>
-                            <rules>
-                                <bannedDependencies>
-                                    <excludes>
-                                        <!-- we use org.jdom:jdom -->
-                                        <exclude>jdom:jdom</exclude>
-                                        <!-- we use cglib:cglib-nodep -->
-                                        <exclude>cglib:cglib</exclude>
-                                        <!-- avoid the full spring jar -->
-                                        <exclude>org.springframework:spring</exclude>
-                                        <!-- don't need xerces for jdk 5+ -->
-                                        <exclude>xerces:*</exclude>
-                                        <!-- wrong group id -->
-                                        <exclude>org.apache.commons:commons-io</exclude>
-                                        <!-- Not needed for jdk5+ (can cause classloading issues) -->
-                                        <exclude>xml-apis:xml-apis</exclude>
-                                        <!-- stax-api is included in java 6 -->
-                                        <exclude>stax:stax-api</exclude>
-                                        <exclude>javax.xml.stream:stax-api</exclude>
-                                        <!-- included in java 6 -->
-                                        <exclude>javax.xml.bind:jaxb-api</exclude>
-                                        <exclude>com.sun.xml.bind:jaxb-impl</exclude>
-                                        <!-- google-collections cannot co-exist with guava -->
-                                        <exclude>com.google.collections:google-collections</exclude>
-                                        <!--we use log4j over slf4j -->
-                                        <exclude>log4j:log4j</exclude>
-                                        <!--we use jcl over slf4j -->
-                                        <exclude>commons-logging:commons-logging</exclude>
-                                        <!-- we use the jdk15on version -->
-                                      <exclude>org.bouncycastle:bcprov-jdk15</exclude>
-                                        <!-- jersey already packages those classes -->
-                                        <exclude>javax.ws.rs:javax.ws.rs</exclude>
-                                        <!-- newer library has a different package Id -->
-                                        <exclude>org.apache.ws.commons:XmlSchema</exclude>
-                                        <!-- cxf has these dependencies, but we use the conventional javax for mail, activation and annotation -->
-                                        <exclude>org.apache.geronimo.specs:geronimo-javamail_1.4_spec</exclude>
-                                        <exclude>org.apache.geronimo.specs:geronimo-activation_1.1_spec</exclude>
-                                        <exclude>org.apache.geronimo.specs:geronimo-annotation_1.0_spec</exclude>
-                                        <!-- package changed to com.google.code.findbugs -->
-                                        <exclude>net.sourceforge.findbugs:jsr305</exclude>
-                                        <!-- compatibility with Java 8 (version < 5) -->
-                                        <exclude>asm:asm</exclude>
-                                        <!-- we use groovy-all -->
-                                        <exclude>org.codehaus.groovy:groovy</exclude>
-                                        <!-- Artifact id changed to javax-servlet-api in servlet api v3-->
-                                        <exclude>javax.servlet:servlet-api:*:*:compile:*</exclude>
-                                        <!-- JAF is included in JDK 6+ -->
-                                        <exclude>javax.activation:activation</exclude>
-                                    </excludes>
-                                </bannedDependencies>
-                                <requireJavaVersion>
-                                    <version>[1.8.0-1,)</version>
-                                </requireJavaVersion>
-                                <requireMavenVersion>
-                                    <version>3.2.0</version>
-                                </requireMavenVersion>
-                            </rules>
-                            <fail>true</fail>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-        <pluginManagement>
-            <plugins>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-source-plugin</artifactId>
-                    <version>2.2.1</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-clean-plugin</artifactId>
-                    <version>2.6.1</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-resources-plugin</artifactId>
-                    <version>2.6</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-compiler-plugin</artifactId>
-                    <version>3.1</version>
-                    <configuration>
-                        <compilerId>groovy-eclipse-compiler</compilerId>
-                        <source>1.8</source>
-                        <target>1.8</target>
-                    </configuration>
-                    <dependencies>
-                        <dependency>
-                            <groupId>org.codehaus.groovy</groupId>
-                            <artifactId>groovy-eclipse-compiler</artifactId>
-                            <version>2.9.1-01</version>
-                        </dependency>
-                        <dependency>
-                            <groupId>org.codehaus.groovy</groupId>
-                            <artifactId>groovy-eclipse-batch</artifactId>
-                            <version>2.3.7-01</version>
-                        </dependency>
-                    </dependencies>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-install-plugin</artifactId>
-                    <version>2.5.2</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-deploy-plugin</artifactId>
-                    <version>2.8.1</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-war-plugin</artifactId>
-                    <version>2.4</version>
-                    <configuration>
-                        <recompressZippedFiles>true</recompressZippedFiles>
-                    </configuration>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-jar-plugin</artifactId>
-                    <version>2.5</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-surefire-plugin</artifactId>
-                    <version>2.16</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-assembly-plugin</artifactId>
-                    <version>2.5.1</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-dependency-plugin</artifactId>
-                    <version>2.10</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-enforcer-plugin</artifactId>
-                    <version>1.3.1</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.codehaus.mojo</groupId>
-                    <artifactId>buildnumber-maven-plugin</artifactId>
-                    <version>1.0</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.codehaus.mojo</groupId>
-                    <artifactId>build-helper-maven-plugin</artifactId>
-                    <version>1.8</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-verifier-plugin</artifactId>
-                    <version>1.0</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.spockframework</groupId>
-                    <artifactId>spock-maven</artifactId>
-                    <version>0.7-groovy-2.0</version>
-                    <executions>
-                        <execution>
-                            <goals>
-                                <goal>find-specs</goal>
-                            </goals>
-                        </execution>
-                    </executions>
-                </plugin>
-                <!-- reporting plugins -->
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-site-plugin</artifactId>
-                    <version>3.3</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-surefire-report-plugin</artifactId>
-                    <version>2.16</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-project-info-reports-plugin</artifactId>
-                    <version>2.7</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.codehaus.mojo</groupId>
-                    <artifactId>cobertura-maven-plugin</artifactId>
-                    <version>2.7</version>
-                    <configuration>
-                        <formats>
-                            <format>html</format>
-                            <format>xml</format>
-                        </formats>
-                    </configuration>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-javadoc-plugin</artifactId>
-                    <version>2.10.3</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-jxr-plugin</artifactId>
-                    <version>2.3</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.codehaus.mojo</groupId>
-                    <artifactId>findbugs-maven-plugin</artifactId>
-                    <version>2.5.2</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.codehaus.mojo</groupId>
-                    <artifactId>dashboard-maven-plugin</artifactId>
-                    <version>1.0.0-beta-1</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-pmd-plugin</artifactId>
-                    <version>3.0.1</version>
-                    <configuration>
-                        <targetJdk>1.8</targetJdk>
-                    </configuration>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-checkstyle-plugin</artifactId>
-                    <version>2.13</version>
-                    <configuration>
-                        <configLocation>${project.basedir}/../devenv/checkstyle.xml</configLocation>
-                        <encoding>UTF-8</encoding>
-                    </configuration>
-                </plugin>
-                <plugin>
-                    <groupId>org.codehaus.sonar</groupId>
-                    <artifactId>sonar-maven3-plugin</artifactId>
-                    <version>5.1</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-antrun-plugin</artifactId>
-                    <version>1.8</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.codehaus.mojo</groupId>
-                    <artifactId>exec-maven-plugin</artifactId>
-                    <version>1.2.1</version>
-                </plugin>
-                <plugin>
-                    <groupId>com.github.wvengen</groupId>
-                    <artifactId>proguard-maven-plugin</artifactId>
-                    <version>2.0.8</version>
-                </plugin>
-            </plugins>
-        </pluginManagement>
-    </build>
-
-    <reporting>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-project-info-reports-plugin</artifactId>
-                <version>2.7</version>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>cobertura-maven-plugin</artifactId>
-                <version>2.7</version>
-                <reportSets>
-                    <reportSet>
-                        <reports>
-                            <report>cobertura-integration-test</report>
-                        </reports>
-                    </reportSet>
-                  </reportSets>
-              </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-javadoc-plugin</artifactId>
-                <version>2.10.3</version>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jxr-plugin</artifactId>
-                <version>2.2</version>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-report-plugin</artifactId>
-                <version>2.16</version>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>findbugs-maven-plugin</artifactId>
-                <version>2.5.2</version>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>dashboard-maven-plugin</artifactId>
-                <version>1.0.0-beta-1</version>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-pmd-plugin</artifactId>
-                <version>3.0.1</version>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-checkstyle-plugin</artifactId>
-                <version>2.13</version>
-            </plugin>
-        </plugins>
-    </reporting>
-
-    <profiles>
-        <profile>
-            <id>release</id>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-source-plugin</artifactId>
-                        <configuration>
-                            <includePom>true</includePom>
-                        </configuration>
-                        <executions>
-                            <execution>
-                                <id>attach-sources</id>
-                                <goals>
-                                    <goal>jar-no-fork</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-
-        <profile>
-            <id>reporting</id>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-javadoc-plugin</artifactId>
-                        <configuration>
-                            <skip>true</skip>
-                            <additionalparam>-Xdoclint:none</additionalparam>
-                        </configuration>
-                        <executions>
-                            <execution>
-                                <id>attach-javadocs</id>
-                                <goals>
-                                    <goal>jar</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-</project>
diff --git a/storage/common/pom.xml b/storage/common/pom.xml
deleted file mode 100644
index ed5c02d..0000000
--- a/storage/common/pom.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0          http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>artifactory-storage-common</artifactId>
-    <packaging>jar</packaging>
-    <name>Artifactory Storage Common</name>
-
-    <parent>
-        <artifactId>artifactory-storage-parent</artifactId>
-        <groupId>org.artifactory</groupId>
-        <version>4.8.0</version>
-    </parent>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-log</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-capi</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-common</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.codehaus.woodstox</groupId>
-            <artifactId>woodstox-core-asl</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>net.java.dev.stax-utils</groupId>
-            <artifactId>stax-utils</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-tx</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.quartz-scheduler</groupId>
-            <artifactId>quartz</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-io</groupId>
-            <artifactId>commons-io</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-lang</groupId>
-            <artifactId>commons-lang</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-config</artifactId>
-            <type>test-jar</type>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.santuario</groupId>
-            <artifactId>xmlsec</artifactId>
-        </dependency>
-    </dependencies>
-
-</project>
diff --git a/storage/common/src/main/java/org/artifactory/backup/FileExportInfoImpl.java b/storage/common/src/main/java/org/artifactory/backup/FileExportInfoImpl.java
deleted file mode 100644
index 2380c8b..0000000
--- a/storage/common/src/main/java/org/artifactory/backup/FileExportInfoImpl.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.backup;
-
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.sapi.common.FileExportInfo;
-
-import java.io.File;
-
-/**
- * Date: 12/12/11
- * Time: 11:29
- *
- * @author Dror Bereznitsky
- */
-public class FileExportInfoImpl implements FileExportInfo {
-    private FolderInfo parentInfo;
-    private FileInfo fileInfo;
-    private File targetPath;
-    private FileExportStatus status;
-
-    public FileExportInfoImpl(FileInfo fileInfo, File targetPath, FileExportStatus status) {
-        this.fileInfo = fileInfo;
-        this.targetPath = targetPath;
-        this.status = status;
-    }
-
-    public FileExportInfoImpl(FolderInfo parentInfo, File targetPath, FileExportStatus status) {
-        this.parentInfo = parentInfo;
-        this.targetPath = targetPath;
-        this.status = status;
-    }
-
-    @Override
-    public FileInfo getFileInfo() {
-        return fileInfo;
-    }
-
-    @Override
-    public FolderInfo getParentInfo() {
-        return parentInfo;
-    }
-
-    @Override
-    public File getTargetPath() {
-        return targetPath;
-    }
-
-    @Override
-    public FileExportStatus status() {
-        return status;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/factory/common/AbstractInfoFactory.java b/storage/common/src/main/java/org/artifactory/factory/common/AbstractInfoFactory.java
deleted file mode 100644
index 1ae1ae9..0000000
--- a/storage/common/src/main/java/org/artifactory/factory/common/AbstractInfoFactory.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.factory.common;
-
-import org.artifactory.factory.InfoFactory;
-import org.artifactory.md.MutableMetadataInfo;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.model.xstream.security.ImmutableAclInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.security.SecurityConstants;
-import org.artifactory.security.AceInfo;
-import org.artifactory.security.AclInfo;
-import org.artifactory.security.MutableAceInfo;
-import org.artifactory.security.MutableAclInfo;
-import org.artifactory.security.MutableGroupInfo;
-import org.artifactory.security.MutablePermissionTargetInfo;
-import org.artifactory.security.MutableUserInfo;
-import org.artifactory.security.PermissionTargetInfo;
-import org.artifactory.security.UserGroupInfo;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Date: 8/3/11
- * Time: 9:51 AM
- *
- * @author Fred Simon
- */
-public abstract class AbstractInfoFactory implements InfoFactory {
-
-    @Override
-    public MutablePermissionTargetInfo createPermissionTarget(String permName, List<String> repoKeys) {
-        MutablePermissionTargetInfo permissionTarget = createPermissionTarget();
-        permissionTarget.setName(permName);
-        permissionTarget.setRepoKeys(repoKeys);
-        return permissionTarget;
-    }
-
-    @Override
-    public MutableAceInfo createAce(String principal, boolean group, int mask) {
-        MutableAceInfo aceInfo = createAce();
-        aceInfo.setPrincipal(principal);
-        aceInfo.setGroup(group);
-        aceInfo.setMask(mask);
-        return aceInfo;
-    }
-
-    @Override
-    public Set<UserGroupInfo> createGroups(Set<String> names) {
-        if (names == null) {
-            return null;
-        }
-        //Create a list of default groups
-        Set<UserGroupInfo> userGroupInfos = new HashSet<>(names.size());
-        for (String name : names) {
-            UserGroupInfo userGroupInfo = createUserGroup(name);
-            userGroupInfos.add(userGroupInfo);
-        }
-        return userGroupInfos;
-    }
-
-    @Override
-    public MutableGroupInfo createGroup(String groupName) {
-        MutableGroupInfo group = createGroup();
-        group.setGroupName(groupName);
-        group.setRealm(SecurityConstants.DEFAULT_REALM);
-        return group;
-    }
-
-    @Override
-    public MutableUserInfo createUser(String userName) {
-        MutableUserInfo user = createUser();
-        user.setUsername(userName);
-        return user;
-    }
-
-    @Override
-    public MutableAclInfo createAcl(PermissionTargetInfo permissionTarget) {
-        MutableAclInfo acl = createAcl();
-        acl.setPermissionTarget(permissionTarget);
-        return acl;
-    }
-
-    @Override
-    public AclInfo createAcl(PermissionTargetInfo permissionTarget, Set<AceInfo> aces, String updatedBy) {
-        return new ImmutableAclInfo(permissionTarget, aces, updatedBy);
-    }
-
-    @Override
-    public MutableMetadataInfo createMetadata(RepoPath repoPath, String metadataName) {
-        return createMetadata(new RepoPathImpl(repoPath.getRepoKey(),
-                NamingUtils.getMetadataPath(repoPath.getPath(), metadataName)));
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/factory/xstream/ChecksumsInfoConverter.java b/storage/common/src/main/java/org/artifactory/factory/xstream/ChecksumsInfoConverter.java
deleted file mode 100644
index f24f3a3..0000000
--- a/storage/common/src/main/java/org/artifactory/factory/xstream/ChecksumsInfoConverter.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.factory.xstream;
-
-import com.thoughtworks.xstream.converters.ConversionException;
-import com.thoughtworks.xstream.converters.Converter;
-import com.thoughtworks.xstream.converters.MarshallingContext;
-import com.thoughtworks.xstream.converters.UnmarshallingContext;
-import com.thoughtworks.xstream.io.HierarchicalStreamReader;
-import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumsInfo;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Date: 8/6/11
- * Time: 5:28 PM
- *
- * @author Fred Simon
- */
-public class ChecksumsInfoConverter implements Converter {
-
-    private static final String CHECKSUMS_FIELD_NAME = "checksums";
-
-    @Override
-    public boolean canConvert(Class type) {
-        return type.equals(ChecksumsInfo.class);
-    }
-
-    @Override
-    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
-        ChecksumsInfo checksumsInfo = (ChecksumsInfo) source;
-        writer.startNode(CHECKSUMS_FIELD_NAME);
-        context.convertAnother(checksumsInfo.getChecksums());
-        writer.endNode();
-    }
-
-    @Override
-    @SuppressWarnings({"unchecked"})
-    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
-        reader.moveDown();
-        if (!CHECKSUMS_FIELD_NAME.equals(reader.getNodeName())) {
-            throw new ConversionException("ChecksumsInfo field should contains a checksums entry!");
-        }
-        ChecksumsInfo result = new ChecksumsInfo();
-        Set<ChecksumInfo> checksums = (Set<ChecksumInfo>) context.convertAnother(result, HashSet.class);
-        result.setChecksums(checksums);
-        reader.moveUp();
-        return result;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/factory/xstream/PropertiesConverter.java b/storage/common/src/main/java/org/artifactory/factory/xstream/PropertiesConverter.java
deleted file mode 100644
index a05360f..0000000
--- a/storage/common/src/main/java/org/artifactory/factory/xstream/PropertiesConverter.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.factory.xstream;
-
-import com.thoughtworks.xstream.converters.Converter;
-import com.thoughtworks.xstream.converters.MarshallingContext;
-import com.thoughtworks.xstream.converters.UnmarshallingContext;
-import com.thoughtworks.xstream.io.HierarchicalStreamReader;
-import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
-import org.artifactory.md.Properties;
-import org.artifactory.model.xstream.fs.PropertiesImpl;
-
-import java.util.Map;
-
-/**
- * Converts a map of key-vals to the format:
- * <pre>
- * <properties>
- *     <key1>val1</key1>
- *     <key2>val2</key2>
- * </properties>
- * </pre >
- *
- * @author Yoav Landman
- */
-public class PropertiesConverter implements Converter {
-    @Override
-    public boolean canConvert(Class type) {
-        return type.equals(PropertiesImpl.class);
-    }
-
-    @Override
-    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
-        Properties map = (Properties) source;
-        for (Map.Entry<String, String> entry : map.entries()) {
-            //Start a node with the key name
-            writer.startNode(entry.getKey());
-            //Write the value in
-            String val = entry.getValue();
-            if (val != null) {
-                writer.setValue(val);
-            } else {
-                writer.startNode("null");
-                writer.endNode();
-            }
-            writer.endNode();
-        }
-    }
-
-    @Override
-    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
-        Properties map = new PropertiesImpl();
-        while (reader.hasMoreChildren()) {
-            reader.moveDown();
-            String key = reader.getNodeName();
-            String val;
-            if (reader.hasMoreChildren()) {
-                //Handle nulls
-                val = null;
-            } else {
-                val = reader.getValue();
-            }
-            map.put(key, val);
-            reader.moveUp();
-        }
-        return map;
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/factory/xstream/RepoPathConverter.java b/storage/common/src/main/java/org/artifactory/factory/xstream/RepoPathConverter.java
deleted file mode 100644
index efe5b55..0000000
--- a/storage/common/src/main/java/org/artifactory/factory/xstream/RepoPathConverter.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.factory.xstream;
-
-import com.thoughtworks.xstream.converters.Converter;
-import com.thoughtworks.xstream.converters.MarshallingContext;
-import com.thoughtworks.xstream.converters.UnmarshallingContext;
-import com.thoughtworks.xstream.io.HierarchicalStreamReader;
-import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author Yoav Landman
- */
-public class RepoPathConverter implements Converter {
-    private static final String REPO_KEY = "repoKey";
-    private static final String PATH = "path";
-
-    @Override
-    public boolean canConvert(Class type) {
-        return type.equals(RepoPath.class);
-    }
-
-    @Override
-    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
-        RepoPath repoPath = (RepoPath) source;
-        //Key
-        writer.startNode(REPO_KEY);
-        writeValueOrNull(writer, repoPath.getRepoKey());
-        writer.endNode();
-        //Key
-        writer.startNode(PATH);
-        writeValueOrNull(writer, repoPath.getPath());
-        writer.endNode();
-    }
-
-    @Override
-    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
-        String repoKey = null;
-        String path = null;
-        while (reader.hasMoreChildren()) {
-            reader.moveDown();
-            if (REPO_KEY.equalsIgnoreCase(reader.getNodeName())) {
-                repoKey = readValueOrNull(reader);
-            } else if (PATH.equalsIgnoreCase(reader.getNodeName())) {
-                path = readValueOrNull(reader);
-            }
-            reader.moveUp();
-        }
-        return InfoFactoryHolder.get().createRepoPath(repoKey, path);
-    }
-
-    private String readValueOrNull(HierarchicalStreamReader reader) {
-        String val;
-        if (reader.hasMoreChildren()) {
-            //Handle nulls
-            val = null;
-        } else {
-            val = reader.getValue();
-        }
-        return val;
-    }
-
-    private static void writeValueOrNull(HierarchicalStreamWriter writer, String val) {
-        if (val != null) {
-            writer.setValue(val);
-        } else {
-            writer.startNode("null");
-            writer.endNode();
-        }
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/factory/xstream/UserGroupInfoConverter.java b/storage/common/src/main/java/org/artifactory/factory/xstream/UserGroupInfoConverter.java
deleted file mode 100644
index 47ac374..0000000
--- a/storage/common/src/main/java/org/artifactory/factory/xstream/UserGroupInfoConverter.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.factory.xstream;
-
-import com.thoughtworks.xstream.converters.basic.AbstractSingleValueConverter;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.security.UserGroupInfo;
-
-/**
- * Converts the UserInfo.UserGroupInfo object to a simple string
- *
- * @author Yoav Landman
- */
-public class UserGroupInfoConverter extends AbstractSingleValueConverter {
-
-    @Override
-    public boolean canConvert(Class type) {
-        return UserGroupInfo.class.isAssignableFrom(type);
-    }
-
-    @Override
-    public Object fromString(String str) {
-        return InfoFactoryHolder.get().createUserGroup(str);
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/factory/xstream/XStreamFactory.java b/storage/common/src/main/java/org/artifactory/factory/xstream/XStreamFactory.java
deleted file mode 100644
index 39c2c7f..0000000
--- a/storage/common/src/main/java/org/artifactory/factory/xstream/XStreamFactory.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.factory.xstream;
-
-import com.thoughtworks.xstream.XStream;
-import com.thoughtworks.xstream.io.HierarchicalStreamDriver;
-import com.thoughtworks.xstream.io.xml.QNameMap;
-import com.thoughtworks.xstream.io.xml.StaxDriver;
-import com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder;
-import com.thoughtworks.xstream.mapper.MapperWrapper;
-import com.thoughtworks.xstream.security.ArrayTypePermission;
-import com.thoughtworks.xstream.security.NoTypePermission;
-import com.thoughtworks.xstream.security.NullPermission;
-import com.thoughtworks.xstream.security.PrimitiveTypePermission;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.util.PrettyStaxDriver;
-
-import javax.annotation.Nullable;
-import java.util.Collection;
-
-/**
- * @author Yoav Landman
- */
-public abstract class XStreamFactory {
-    private XStreamFactory() {
-        // utility class
-    }
-
-    public static XStream create(Class... annotatedClassesToProcess) {
-        return createXStream(null, false, annotatedClassesToProcess);
-    }
-
-    public static XStream create(@Nullable QNameMap qNameMap, Class... annotatedClassesToProcess) {
-        return createXStream(qNameMap, false, annotatedClassesToProcess);
-    }
-
-    /**
-     * Creates a missing field tolerating instance of XStream
-     *
-     * @param annotatedClassesToProcess Classes to process
-     * @return XStream instance
-     */
-    public static XStream createMissingFieldTolerating(Class... annotatedClassesToProcess) {
-        return createXStream(null, true, annotatedClassesToProcess);
-    }
-
-    /**
-     * Creates XStream not escaping single underscores
-     */
-    public static XStream createWithUnderscoreFriendly(Class... annotatedClassesToProcess) {
-        return createXStream1(true, new PrettyStaxDriver(null, new XmlFriendlyNameCoder("_-", "_")),
-                annotatedClassesToProcess);
-    }
-
-    /**
-     * Creates an XStream instance
-     *
-     * @param qNameMap                  Optional map
-     * @param ignoreMissingMembers      True if missing fields should be ignored
-     * @param annotatedClassesToProcess Classes to process
-     * @return XStream instance
-     */
-    private static XStream createXStream(@Nullable QNameMap qNameMap, boolean ignoreMissingMembers,
-            Class... annotatedClassesToProcess) {
-        return createXStream1(ignoreMissingMembers, new PrettyStaxDriver(qNameMap), annotatedClassesToProcess);
-    }
-
-    private static XStream createXStream1(boolean ignoreMissingMembers, StaxDriver staxDriver,
-            Class... annotatedClassesToProcess) {
-        XStream xstream = new ResilientXStream(ignoreMissingMembers, staxDriver);
-        xstream.registerConverter(new RepoPathConverter());
-        xstream.registerConverter(new PropertiesConverter());
-        xstream.registerConverter(new ChecksumsInfoConverter());
-        xstream.registerConverter(new UserGroupInfoConverter());
-        for (Class annotatedClass : annotatedClassesToProcess) {
-            xstream.processAnnotations(annotatedClass);
-        }
-        xstream.alias("repoPath", RepoPath.class, RepoPathImpl.class);
-
-        // clear out existing permissions and set own ones
-        xstream.addPermission(NoTypePermission.NONE);
-        // allow some basics
-        xstream.addPermission(NullPermission.NULL);
-        xstream.addPermission(PrimitiveTypePermission.PRIMITIVES);
-        xstream.addPermission(ArrayTypePermission.ARRAYS);
-        xstream.allowTypeHierarchy(Collection.class);
-        xstream.allowTypeHierarchy(String.class);
-        // allow any type from the same package
-        xstream.allowTypesByWildcard(new String[]{"org.artifactory.**", "org.jfrog.**"});
-
-        return xstream;
-    }
-
-    /**
-     * XStream instance that can optionally ignore missing fields
-     */
-    private static class ResilientXStream extends XStream {
-
-        private boolean ignoreMissingMembers;
-
-        private ResilientXStream(boolean ignoreMissingMembers, HierarchicalStreamDriver driver) {
-            super(driver);
-            this.ignoreMissingMembers = ignoreMissingMembers;
-        }
-
-        @Override
-        protected MapperWrapper wrapMapper(MapperWrapper next) {
-            return new MapperWrapper(next) {
-
-                @Override
-                public boolean shouldSerializeMember(Class definedIn, String fieldName) {
-                    return (!ignoreMissingMembers || (definedIn != Object.class)) ?
-                            super.shouldSerializeMember(definedIn, fieldName) : false;
-                }
-            };
-        }
-    }
-
-}
diff --git a/storage/common/src/main/java/org/artifactory/factory/xstream/XStreamInfoFactory.java b/storage/common/src/main/java/org/artifactory/factory/xstream/XStreamInfoFactory.java
deleted file mode 100644
index 0ee7af8..0000000
--- a/storage/common/src/main/java/org/artifactory/factory/xstream/XStreamInfoFactory.java
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.factory.xstream;
-
-import com.thoughtworks.xstream.XStream;
-import org.apache.commons.compress.archivers.ArchiveEntry;
-import org.artifactory.checksum.ChecksumsInfo;
-import org.artifactory.factory.common.AbstractInfoFactory;
-import org.artifactory.fs.*;
-import org.artifactory.md.MetadataInfo;
-import org.artifactory.md.MutableMetadataInfo;
-import org.artifactory.md.MutablePropertiesInfo;
-import org.artifactory.md.PropertiesInfo;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.model.xstream.fs.*;
-import org.artifactory.model.xstream.security.*;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.resource.MutableRepoResourceInfo;
-import org.artifactory.resource.RepoResourceInfo;
-import org.artifactory.security.*;
-import org.artifactory.util.Tree;
-
-import java.util.List;
-import java.util.zip.ZipEntry;
-
-/**
- * Date: 8/1/11
- * Time: 10:01 PM
- *
- * @author Fred Simon
- */
- at SuppressWarnings({"UnusedDeclaration"})
-public class XStreamInfoFactory extends AbstractInfoFactory {
-
-    private XStream securityXStream;
-    private XStream fileSystemXStream;
-
-    @Override
-    public RepoPath createRepoPathFromId(String repoPathId) {
-        return InternalRepoPathFactory.createRepoPath(repoPathId);
-    }
-
-    @Override
-    public RepoPath createRepoPath(String repoKey, String path) {
-        return new RepoPathImpl(repoKey, path);
-    }
-
-    @Override
-    public RepoPath createRepoPath(RepoPath parent, String relPath) {
-        return new RepoPathImpl(parent, relPath);
-    }
-
-    @Override
-    public RepoPath createRepoPath(String repoKey, String path, boolean folder) {
-        return new RepoPathImpl(repoKey, path, folder);
-    }
-
-    @Override
-    public MutableRepoResourceInfo copyRepoResource(RepoResourceInfo repoResourceInfo) {
-        if (repoResourceInfo == null) {
-            return null;
-        }
-        if (repoResourceInfo instanceof InternalFileInfo) {
-            return new FileInfoImpl((InternalFileInfo) repoResourceInfo);
-        } else if (repoResourceInfo instanceof MetadataInfo) {
-            return new MetadataInfoImpl((MetadataInfo) repoResourceInfo);
-        } else if (repoResourceInfo instanceof ZipEntryResourceInfo) {
-            throw new IllegalArgumentException(
-                    "Cannot copy " + repoResourceInfo + " since zip entries cannot be modified!");
-        } else {
-            throw new IllegalArgumentException(
-                    "Cannot copy " + repoResourceInfo + " of class " + repoResourceInfo.getClass().getName());
-        }
-    }
-
-    @Override
-    public MutableItemInfo copyItemInfo(ItemInfo itemInfo) {
-        if (itemInfo == null) {
-            return null;
-        }
-        if (itemInfo instanceof InternalFileInfo) {
-            return new FileInfoImpl((InternalFileInfo) itemInfo);
-        } else if (itemInfo instanceof InternalFolderInfo) {
-            return new FolderInfoImpl((InternalFolderInfo) itemInfo);
-        } else if (itemInfo instanceof ZipEntryResourceInfo) {
-            throw new IllegalArgumentException(
-                    "Cannot copy " + itemInfo + " since zip entries cannot be modified!");
-        } else if (itemInfo instanceof MutableItemInfo) {
-            return (MutableItemInfo) itemInfo;
-        } else {
-            throw new IllegalArgumentException(
-                    "Cannot copy " + itemInfo + " of class " + itemInfo.getClass().getName());
-        }
-    }
-
-    @Override
-    public MutableFileInfo createFileInfo(RepoPath repoPath) {
-        return new FileInfoImpl(repoPath);
-    }
-
-    @Override
-    public MutableFileInfo copyFileInfo(FileInfo fileInfo) {
-        // TODO: Really implement it
-        return new FileInfoImpl((InternalFileInfo) fileInfo);
-    }
-
-    @Override
-    public MutableFolderInfo createFolderInfo(RepoPath repoPath) {
-        return new FolderInfoImpl(repoPath);
-    }
-
-    @Override
-    public MutableFolderInfo copyFolderInfo(FolderInfo folderInfo) {
-        // TODO: Really implement it
-        return new FolderInfoImpl((InternalFolderInfo) folderInfo);
-    }
-
-    @Override
-    public MutablePropertiesInfo createProperties() {
-        return new PropertiesImpl();
-    }
-
-    @Override
-    public MutablePropertiesInfo copyProperties(PropertiesInfo copy) {
-        return new PropertiesImpl(copy);
-    }
-
-    @Override
-    public MutablePermissionTargetInfo createPermissionTarget() {
-        return new PermissionTargetImpl();
-    }
-
-    @Override
-    public MutablePermissionTargetInfo copyPermissionTarget(PermissionTargetInfo copy) {
-        return new PermissionTargetImpl(copy);
-    }
-
-    @Override
-    public MutableUserInfo createUser() {
-        return new UserImpl();
-    }
-
-    @Override
-    public MutableUserInfo copyUser(UserInfo copy) {
-        return new UserImpl(copy);
-    }
-
-    @Override
-    public UserGroupInfo createUserGroup(String groupName) {
-        return new UserGroupImpl(groupName);
-    }
-
-    @Override
-    public UserGroupInfo createUserGroup(String groupName, String realm) {
-        return new UserGroupImpl(groupName, realm);
-    }
-
-    @Override
-    public MutableGroupInfo createGroup() {
-        return new GroupImpl();
-    }
-
-    @Override
-    public MutableGroupInfo copyGroup(GroupInfo copy) {
-        return new GroupImpl(copy);
-    }
-
-    @Override
-    public MutableAclInfo createAcl() {
-        return new AclImpl();
-    }
-
-    @Override
-    public MutableAclInfo copyAcl(AclInfo copy) {
-        return new AclImpl(copy);
-    }
-
-    @Override
-    public MutableAceInfo createAce() {
-        return new AceImpl();
-    }
-
-    @Override
-    public MutableAceInfo copyAce(AceInfo copy) {
-        return new AceImpl(copy);
-    }
-
-    @Override
-    public SecurityInfo createSecurityInfo(List<UserInfo> users, List<GroupInfo> groups, List<AclInfo> acls) {
-        return new SecurityDataImpl(users, groups, acls);
-    }
-
-    @Override
-    public XStream getSecurityXStream() {
-        if (securityXStream == null) {
-            securityXStream = XStreamFactory.create(SecurityDataImpl.class,
-                    PermissionTargetImpl.class,
-                    AclImpl.class,
-                    AceImpl.class,
-                    UserImpl.class,
-                    UserProperty.class,
-                    UserGroupImpl.class,
-                    GroupImpl.class
-            );
-        }
-        return securityXStream;
-    }
-
-    @Override
-    public XStream getFileSystemXStream() {
-        if (fileSystemXStream == null) {
-            fileSystemXStream = XStreamFactory.create(FileInfoImpl.class,
-                    FileAdditionalInfo.class,
-                    FolderInfoImpl.class,
-                    FolderAdditionalInfo.class,
-                    StatsImpl.class,
-                    PropertiesImpl.class,
-                    WatchersImpl.class,
-                    WatcherImpl.class);
-        }
-        return fileSystemXStream;
-    }
-
-    @Override
-    public MutableStatsInfo createStats() {
-        return new StatsImpl();
-    }
-
-    @Override
-    public MutableStatsInfo copyStats(StatsInfo copy) {
-        return new StatsImpl(copy);
-    }
-
-    @Override
-    public MutableWatchersInfo createWatchers() {
-        return new WatchersImpl();
-    }
-
-    @Override
-    public MutableWatcherInfo createWatcher(String watcherUsername, long watchCreationDate) {
-        return new WatcherImpl(watcherUsername, watchCreationDate);
-    }
-
-    @Override
-    public MetadataEntryInfo createMetadataEntry(String metadataName, String xmlContent) {
-        return new MetadataEntry(metadataName, xmlContent);
-    }
-
-    @Override
-    public MutableWatchersInfo copyWatchers(WatchersInfo copy) {
-        return new WatchersImpl(copy);
-    }
-
-    @Override
-    public Tree<ZipEntryInfo> createZipEntriesTree() {
-        return new ZipEntriesTree();
-    }
-
-    @Override
-    public ZipEntryInfo createZipEntry(ZipEntry... zipEntries) {
-        return new ZipEntryImpl(zipEntries);
-    }
-
-    @Override
-    public ZipEntryInfo createArchiveEntry(ArchiveEntry... archiveEntries) {
-        return new ArchiveEntryImpl(archiveEntries);
-    }
-
-    @Override
-    public ZipEntryResourceInfo createZipEntryResource(FileInfo info, ZipEntryInfo zipEntryInfo, long actualSize,
-            ChecksumsInfo checksumsInfo) {
-        return new ZipEntryResourceImpl(info, zipEntryInfo, actualSize, checksumsInfo);
-    }
-
-    @Override
-    public MutableMetadataInfo createMetadata(RepoPath repoPath) {
-        return new MetadataInfoImpl(repoPath);
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/io/ClasspathResourceLoader.java b/storage/common/src/main/java/org/artifactory/io/ClasspathResourceLoader.java
deleted file mode 100644
index fbf43ea..0000000
--- a/storage/common/src/main/java/org/artifactory/io/ClasspathResourceLoader.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.io;
-
-import org.artifactory.resource.ResourceStreamHandle;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * User: freds Date: Jun 1, 2008 Time: 8:39:25 PM
- */
-public class ClasspathResourceLoader implements ResourceStreamHandle {
-    private final String resourceName;
-    private InputStream is;
-
-    public ClasspathResourceLoader(String resourceName) {
-        this.resourceName = resourceName;
-    }
-
-    @Override
-    public InputStream getInputStream() {
-        if (is == null) {
-            is = getClass().getResourceAsStream(resourceName);
-            if (is == null) {
-                throw new RuntimeException(
-                        "Did not find resource " + resourceName + " in the classpath");
-            }
-        }
-        return is;
-    }
-
-    @Override
-    public long getSize() {
-        return -1;
-    }
-
-    @Override
-    public void close() {
-        try {
-            if (is != null) {
-                is.close();
-            }
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        } finally {
-            is = null;
-        }
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/io/NonClosingInputStream.java b/storage/common/src/main/java/org/artifactory/io/NonClosingInputStream.java
deleted file mode 100644
index 36c2e19..0000000
--- a/storage/common/src/main/java/org/artifactory/io/NonClosingInputStream.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.io;
-
-import org.apache.commons.io.input.ProxyInputStream;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * @author Yoav Landman
- */
-public class NonClosingInputStream extends ProxyInputStream {
-
-    public NonClosingInputStream(InputStream proxy) {
-        super(proxy);
-    }
-
-    /**
-     * Does nothing!
-     *
-     * @throws IOException
-     */
-    @Override
-    public void close() throws IOException {
-        //Do not close the stream, since we need to continue processing it -
-        //it will be close by the caller
-    }
-
-    /**
-     * Forces the stream to be closed
-     *
-     * @throws IOException
-     */
-    public void forceClose() throws IOException {
-        super.close();
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/io/NullResourceStreamHandle.java b/storage/common/src/main/java/org/artifactory/io/NullResourceStreamHandle.java
deleted file mode 100644
index a77467f..0000000
--- a/storage/common/src/main/java/org/artifactory/io/NullResourceStreamHandle.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.io;
-
-import org.artifactory.resource.ResourceStreamHandle;
-
-import java.io.InputStream;
-
-/**
- * @author Yoav Landman
- */
-public class NullResourceStreamHandle implements ResourceStreamHandle {
-
-    @Override
-    public InputStream getInputStream() {
-        return null;
-    }
-
-    @Override
-    public long getSize() {
-        return -1;
-    }
-
-    @Override
-    public void close() {
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/io/RemoteResourceStreamHandle.java b/storage/common/src/main/java/org/artifactory/io/RemoteResourceStreamHandle.java
deleted file mode 100644
index d257442..0000000
--- a/storage/common/src/main/java/org/artifactory/io/RemoteResourceStreamHandle.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.io;
-
-import org.artifactory.resource.ResourceStreamHandle;
-
-/**
- * @author Noam Y. Tenne
- */
-public abstract class RemoteResourceStreamHandle implements ResourceStreamHandle {
-
-    private Throwable throwable;
-
-    public Throwable getThrowable() {
-        return throwable;
-    }
-
-    public void setThrowable(Throwable throwable) {
-        this.throwable = throwable;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/io/SimpleResourceStreamHandle.java b/storage/common/src/main/java/org/artifactory/io/SimpleResourceStreamHandle.java
deleted file mode 100644
index 080a338..0000000
--- a/storage/common/src/main/java/org/artifactory/io/SimpleResourceStreamHandle.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.io;
-
-import org.apache.commons.io.IOUtils;
-import org.artifactory.resource.ResourceStreamHandle;
-
-import java.io.InputStream;
-
-/**
- * @author Yoav Landman
- */
-public class SimpleResourceStreamHandle implements ResourceStreamHandle {
-    private final InputStream is;
-    private final long size;
-
-    public SimpleResourceStreamHandle(InputStream is) {
-        this(is, -1);
-    }
-
-    public SimpleResourceStreamHandle(InputStream is, long size) {
-        this.is = is;
-        this.size = size;
-    }
-
-    @Override
-    public InputStream getInputStream() {
-        return is;
-    }
-
-    @Override
-    public long getSize() {
-        return size;
-    }
-
-    @Override
-    public void close() {
-        IOUtils.closeQuietly(is);
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/io/StringResourceStreamHandle.java b/storage/common/src/main/java/org/artifactory/io/StringResourceStreamHandle.java
deleted file mode 100644
index 1fab3ed..0000000
--- a/storage/common/src/main/java/org/artifactory/io/StringResourceStreamHandle.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.io;
-
-import org.artifactory.resource.ResourceStreamHandle;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * @author yoavl
- */
-public class StringResourceStreamHandle implements ResourceStreamHandle {
-    private final byte[] buf;
-
-    public StringResourceStreamHandle(String string) throws IOException {
-        this.buf = string.getBytes("utf-8");
-    }
-
-    @Override
-    public InputStream getInputStream() {
-        return new ByteArrayInputStream(buf);
-    }
-
-    @Override
-    public void close() {
-    }
-
-    @Override
-    public long getSize() {
-        return buf.length;
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/io/TempFileStreamHandle.java b/storage/common/src/main/java/org/artifactory/io/TempFileStreamHandle.java
deleted file mode 100644
index 3b2217c..0000000
--- a/storage/common/src/main/java/org/artifactory/io/TempFileStreamHandle.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.io;
-
-import org.apache.commons.io.IOUtils;
-import org.artifactory.resource.ResourceStreamHandle;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-
-/**
- * @author Yoav Landman
- */
-public class TempFileStreamHandle implements ResourceStreamHandle {
-    private static final Logger log = LoggerFactory.getLogger(NonClosingInputStream.class);
-
-    private final File tmpFile;
-    private final InputStream is;
-
-    public TempFileStreamHandle(File tmpFile) throws FileNotFoundException {
-        this.tmpFile = tmpFile;
-        this.is = new BufferedInputStream(new FileInputStream(tmpFile));
-    }
-
-    @Override
-    public InputStream getInputStream() {
-        return is;
-    }
-
-    @Override
-    public long getSize() {
-        return -1;
-    }
-
-    @Override
-    public void close() {
-        IOUtils.closeQuietly(is);
-        boolean deleted = tmpFile.delete();
-        if (!deleted) {
-            log.warn("Failed to delete temporary file '" + tmpFile.getPath() + "'.");
-        }
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/io/ZipResourceStreamHandle.java b/storage/common/src/main/java/org/artifactory/io/ZipResourceStreamHandle.java
deleted file mode 100644
index 10438e3..0000000
--- a/storage/common/src/main/java/org/artifactory/io/ZipResourceStreamHandle.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.io;
-
-import org.apache.commons.compress.archivers.ArchiveEntry;
-import org.apache.commons.compress.archivers.ArchiveInputStream;
-import org.apache.commons.io.IOUtils;
-import org.artifactory.fs.RepoResource;
-import org.artifactory.fs.ZipEntryRepoResource;
-import org.artifactory.resource.ResourceStreamHandle;
-import org.artifactory.util.PathUtils;
-import org.artifactory.util.ZipUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * This stream handle encapsulates a stream of zip file and returns the input stream of a one resource inside the zip.
- *
- * @author Yossi Shaul
- */
-public class ZipResourceStreamHandle implements ResourceStreamHandle {
-    private static final Logger log = LoggerFactory.getLogger(ZipResourceStreamHandle.class);
-
-    private final ZipEntryRepoResource zipResource;
-    private final InputStream stream;
-    private final ArchiveInputStream[] zipStreams;
-
-    public ZipResourceStreamHandle(ZipEntryRepoResource zipResource, InputStream stream) throws IOException {
-        this.zipResource = zipResource;
-        this.stream = stream;
-        String[] zipEntryNames = PathUtils.splitZipResourcePathIfExist(this.zipResource.getEntryPath(), true);
-        String name = zipResource.getInfo().getName();
-        zipStreams = ZipUtils.getArchiveInputStreamArray(name, zipEntryNames.length);
-        try {
-            for (int i = 0; i < zipEntryNames.length; i++) {
-                String zipEntryName = zipEntryNames[i];
-                if (i == 0) {
-                    zipStreams[i] = ZipUtils.returnArchiveInputStream(stream, name);
-                } else {
-                    zipStreams[i] = ZipUtils.returnArchiveInputStream(zipStreams[i - 1], name);
-                }
-                ArchiveEntry zipEntry = ZipUtils.locateArchiveEntry(zipStreams[i], zipEntryName);
-                if (zipEntry == null) {
-                    throw new IOException(String.format("Zip resource '%s' not found in '%s'",
-                            zipEntryName, zipResource.getRepoPath()));
-                }
-            }
-        } catch (IOException e) {
-            close();    // close stream now
-            log.error(String.format("Failed to retrieve zip resource '%s' from '%s'",
-                    this.zipResource.getEntryPath(), zipResource.getRepoPath()), e);
-            throw e;
-        }
-
-    }
-
-    @Override
-    public InputStream getInputStream() {
-        // the zip stream is in a state where it points to the start of the requested entry. calling getInputStream will
-        // return the stream of the requested entry (not of the zip file)
-        return zipStreams[zipStreams.length - 1];
-    }
-
-    @Override
-    public long getSize() {
-        return zipResource.getSize();
-    }
-
-    @Override
-    public void close() {
-        for (ArchiveInputStream zipStream : zipStreams) {
-            IOUtils.closeQuietly(zipStream);
-        }
-        IOUtils.closeQuietly(stream);   // in case the zip stream creation failed
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/io/checksum/ChecksumPathInfo.java b/storage/common/src/main/java/org/artifactory/io/checksum/ChecksumPathInfo.java
deleted file mode 100644
index 00b991e..0000000
--- a/storage/common/src/main/java/org/artifactory/io/checksum/ChecksumPathInfo.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.artifactory.io.checksum;
-
-import java.io.Serializable;
-
-/**
- * @author Yoav Landman
- */
-public class ChecksumPathInfo implements Serializable {
-    private final String path;
-    private final String checksum;
-    private final long size;
-    private final String binaryNodeId;
-    private final long timestamp;
-
-    public ChecksumPathInfo(String path, String checksum, long size, String binaryNodeId) {
-        this(path, checksum, size, binaryNodeId, -1);
-    }
-
-    public ChecksumPathInfo(String path, String checksum, long size, String binaryNodeId, long timestamp) {
-        this.path = path;
-        this.checksum = checksum;
-        this.size = size;
-        this.binaryNodeId = binaryNodeId;
-        this.timestamp = timestamp;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public String getChecksum() {
-        return checksum;
-    }
-
-    public long getSize() {
-        return size;
-    }
-
-    public String getBinaryNodeId() {
-        return binaryNodeId;
-    }
-
-    public long getTimestamp() {
-        return timestamp;
-    }
-
-    @Override
-    public String toString() {
-        return "ChecksumPathInfo{" +
-                "path='" + path + '\'' +
-                ", checksum='" + checksum + '\'' +
-                ", size=" + size +
-                ", binaryNodeId='" + binaryNodeId + '\'' +
-                ", created=" + timestamp +
-                '}';
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        ChecksumPathInfo info = (ChecksumPathInfo) o;
-
-        if (timestamp != info.timestamp) {
-            return false;
-        }
-        if (!binaryNodeId.equals(info.binaryNodeId)) {
-            return false;
-        }
-        if (checksum != null ? !checksum.equals(info.checksum) : info.checksum != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = checksum != null ? checksum.hashCode() : 0;
-        result = 31 * result + binaryNodeId.hashCode();
-        result = 31 * result + (int) (timestamp ^ (timestamp >>> 32));
-        return result;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/io/checksum/ChecksumPaths.java b/storage/common/src/main/java/org/artifactory/io/checksum/ChecksumPaths.java
deleted file mode 100644
index bb3e827..0000000
--- a/storage/common/src/main/java/org/artifactory/io/checksum/ChecksumPaths.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.io.checksum;
-
-import com.google.common.collect.ImmutableCollection;
-import org.artifactory.spring.ReloadableBean;
-import org.artifactory.storage.binstore.service.GarbageCollectorInfo;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.List;
-
-/**
- * An interface for a cheksum->repo path values cache
- *
- * @author Yoav Landman
- */
-public interface ChecksumPaths extends ReloadableBean {
-
-    void addChecksumPath(ChecksumPathInfo info);
-
-    /**
-     * Clears the checksum paths (marks it deleted)
-     *
-     * @param binaryNodeId An arbitrary string identifier used to locate the checksum path to clear
-     */
-    void deleteChecksumPath(String binaryNodeId);
-
-    /**
-     * Update the checksum path. This method is called when node with binary data is moved leaving the old path
-     * obsolete.
-     *
-     * @param newChecksumInfo Checksum info of the moved binary node, with the new path.
-     */
-    void updateChecksumPath(ChecksumPathInfo newChecksumInfo);
-
-    /**
-     * Clean up internal deleted entries at the current point in time and return a holder of all binaries checksums that
-     * need to be removed.
-     *
-     * @return
-     */
-    GarbageCollectorInfo cleanupDeleted();
-
-    ImmutableCollection<ChecksumPathInfo> getChecksumPaths(String checksum);
-
-    /**
-     * Begin a tx if none active on the current thread
-     *
-     * @return true if a tx has begun by this call
-     */
-    boolean txBegin();
-
-    void txEnd(boolean commit);
-
-    /**
-     * Get all files containing the like query expressions. The files that returned are guaranteed to exist at the time
-     * the query was executed. For repository files prefix the path expressions with '/repositories/.
-     *
-     * @param fileExpressions SQL expression for the file names
-     * @param pathExpressions SQL expression for the file paths
-     * @return A list of paths for found files
-     */
-    ImmutableCollection<String> getFileOrPathsLike(@Nullable List<String> fileExpressions,
-            @Nullable List<String> pathExpressions);
-
-    /**
-     * @return Gets the active checksum paths for the given checksum
-     */
-    ImmutableCollection<ChecksumPathInfo> getActiveChecksumPaths(@Nonnull String checksum);
-
-    /**
-     * @return Get all non-deleted (but maybe in trash) paths in the system
-     */
-    ImmutableCollection<ChecksumPathInfo> getAllActiveChecksumPaths();
-
-    long getActiveSize();
-
-    /**
-     * <b>Intended for testing purposes only!</b><p/>
-     * Prints the checksum paths table content. Logger must be in trace mode.
-     */
-    void dumpChecksumPathsTable();
-}
diff --git a/storage/common/src/main/java/org/artifactory/io/checksum/ChecksumUtil.java b/storage/common/src/main/java/org/artifactory/io/checksum/ChecksumUtil.java
deleted file mode 100644
index 47a4018..0000000
--- a/storage/common/src/main/java/org/artifactory/io/checksum/ChecksumUtil.java
+++ /dev/null
@@ -1,174 +0,0 @@
-package org.artifactory.io.checksum;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.checksum.ChecksumsInfo;
-import org.artifactory.util.Pair;
-import org.jfrog.storage.binstore.utils.Checksum;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public abstract class ChecksumUtil {
-    private static final Logger log = LoggerFactory.getLogger(ChecksumUtil.class);
-
-    /**
-     * Reads and formats the checksum value from the given stream of a checksum file
-     *
-     * @param inputStream The input stream of a checksum file
-     * @return Extracted checksum value
-     * @throws IOException If failed to read from the input stream
-     */
-    @SuppressWarnings({"unchecked"})
-    public static String checksumStringFromStream(InputStream inputStream) throws IOException {
-        List<String> lineList = IOUtils.readLines(inputStream, "utf-8");
-        for (String line : lineList) {
-            //Make sure the line isn't blank or commented out
-            if (StringUtils.isNotBlank(line) && !line.startsWith("//")) {
-                //Remove white spaces at the end
-                line = line.trim();
-                //Check for 'MD5 (name) = CHECKSUM'
-                int prefixPos = line.indexOf(")= ");
-                if (prefixPos != -1) {
-                    line = line.substring(prefixPos + 3);
-                }
-                //We don't simply return the file content since some checksum files have more
-                //characters at the end of the checksum file.
-                return StringUtils.split(line)[0];
-            }
-        }
-        return "";
-    }
-
-    /**
-     * Calculate a single checksum for the input stream
-     *
-     * @param inputStream  The input stream to calculate the checkum value of
-     * @param checksumType The type of checksum to calculate
-     * @return The hexadecimal string of the checksum
-     */
-    public static String getChecksum(InputStream inputStream, ChecksumType checksumType) {
-        Checksum checksum = createFromType(checksumType);
-        try {
-            byte[] dataBytes = new byte[1024];
-            int nread;
-            while ((nread = inputStream.read(dataBytes)) != -1) {
-                checksum.update(dataBytes, 0, nread);
-            }
-        } catch (IOException e) {
-            log.error("Could not calculate checksum " + checksumType.name() + " due to: " + e.getMessage(), e);
-        } finally {
-            IOUtils.closeQuietly(inputStream);
-        }
-        checksum.calc();
-        return checksum.getChecksum();
-    }
-
-    public static ChecksumsInfo getChecksumsInfo(File file) throws IOException {
-        return getChecksumsInfo(calculate(file, ChecksumType.BASE_CHECKSUM_TYPES));
-    }
-
-    public static ChecksumsInfo getChecksumsInfo(InputStream in) throws IOException {
-        return getSizeAndChecksumsInfo(in).getSecond();
-    }
-
-    public static Pair<Long, ChecksumsInfo> getSizeAndChecksumsInfo(InputStream in) throws IOException {
-        ChecksumType[] types = ChecksumType.BASE_CHECKSUM_TYPES;
-        return getSizeAndChecksumsInfo(in, types);
-    }
-
-    public static Pair<Long, ChecksumsInfo> getSizeAndChecksumsInfo(InputStream in, ChecksumType[] types) throws IOException {
-        Pair<Long, Checksum[]> sizeAndChecksums = calculateWithLength(in, types);
-        return new Pair<>(sizeAndChecksums.getFirst(), getChecksumsInfo(sizeAndChecksums.getSecond()));
-    }
-
-    private static ChecksumsInfo getChecksumsInfo(Checksum[] checksums) {
-        ChecksumsInfo result = new ChecksumsInfo();
-        for (Checksum checksum : checksums) {
-            ChecksumType checksumType = ChecksumType.forAlgorithm(checksum.getAlgorithm());
-            String calculatedChecksum = checksum.getChecksum();
-            ChecksumInfo missingChecksumInfo = new ChecksumInfo(checksumType, calculatedChecksum, calculatedChecksum);
-            result.addChecksumInfo(missingChecksumInfo);
-        }
-        return result;
-    }
-
-    private static Checksum createFromType(ChecksumType type) {
-        return new Checksum(type.alg(), type.length());
-    }
-
-    /**
-     * Calculate checksums for all the input types. Closes the input stream when done.
-     *
-     * @param in    Input streams for which checksums are calculated
-     * @param types Checksum types to calculate
-     * @return Pair where the first element is the amount of bytes read and the second is array of all computed
-     * checksums
-     * @throws IOException On any exception reading from the stream
-     */
-    private static Pair<Long, Checksum[]> calculateWithLength(InputStream in, ChecksumType... types) throws IOException {
-        Checksum[] checksums = new Checksum[types.length];
-        for (int i = 0; i < types.length; i++) {
-            checksums[i] = createFromType(types[i]);
-        }
-
-        long bytesRead = 0L;
-        try {
-            byte[] bytes = new byte[1024];
-            int nread;
-            while ((nread = in.read(bytes)) != -1) {
-                bytesRead += nread;
-                for (Checksum checksum : checksums) {
-                    checksum.update(bytes, 0, nread);
-                }
-            }
-        } finally {
-            IOUtils.closeQuietly(in);
-            for (Checksum checksum : checksums) {
-                checksum.calc();
-            }
-        }
-        return new Pair<>(bytesRead, checksums);
-    }
-
-    /**
-     * Calculate checksums for all the input types. Closes the input stream when done.
-     *
-     * @param in    Input streams for which checksums are calculated
-     * @param types Checksum types to calculate
-     * @return Array of all computed checksums
-     * @throws IOException On any exception reading from the stream
-     */
-    private static Checksum[] calculate(InputStream in, ChecksumType... types) throws IOException {
-        return calculateWithLength(in, types).getSecond();
-    }
-
-    /**
-     * Calculate checksums for all the input types.
-     *
-     * @param file  File for which checksums are calculated
-     * @param types Checksum types to calculate
-     * @return Array of all computed checksums
-     * @throws IOException On any exception reading from the file
-     */
-    private static Checksum[] calculate(File file, ChecksumType[] types) throws IOException {
-        FileInputStream fileInputStream = null;
-        try {
-            fileInputStream = new FileInputStream(file);
-            return calculate(fileInputStream, types);
-        } finally {
-            IOUtils.closeQuietly(fileInputStream);
-        }
-    }
-
-}
diff --git a/storage/common/src/main/java/org/artifactory/io/checksum/CleanedChecksumPathsInfo.java b/storage/common/src/main/java/org/artifactory/io/checksum/CleanedChecksumPathsInfo.java
deleted file mode 100644
index 5f38494..0000000
--- a/storage/common/src/main/java/org/artifactory/io/checksum/CleanedChecksumPathsInfo.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.artifactory.io.checksum;
-
-import com.google.common.collect.ImmutableCollection;
-
-import java.io.Serializable;
-
-/**
- * @author Yoav Landman
- */
-public class CleanedChecksumPathsInfo implements Serializable {
-    private final ImmutableCollection<String> checksums;
-    private final long size;
-
-    public CleanedChecksumPathsInfo(ImmutableCollection<String> checksums, long size) {
-        this.checksums = checksums;
-        this.size = size;
-    }
-
-    public ImmutableCollection<String> getChecksums() {
-        return checksums;
-    }
-
-    public long getSize() {
-        return size;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/io/checksum/policy/ChecksumPolicy.java b/storage/common/src/main/java/org/artifactory/io/checksum/policy/ChecksumPolicy.java
deleted file mode 100644
index 9e32e0e..0000000
--- a/storage/common/src/main/java/org/artifactory/io/checksum/policy/ChecksumPolicy.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.io.checksum.policy;
-
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.repo.RepoPath;
-
-import java.util.Set;
-
-/**
- * A checksum policy is responsible to handle any problem related to mismatches between the original checksum and the
- * one calculated by Artifactory.
- *
- * @author Yossi Shaul
- */
-public interface ChecksumPolicy {
-    /**
-     * Processes the checksums info and possibly changes the checksum info.
-     *
-     * @param checksumInfos The checksums to process and update.
-     * @return True if the checksums are valid according to this policy.
-     */
-    boolean verify(Set<ChecksumInfo> checksumInfos);
-
-    /**
-     * Returns the checksum value by type. Actual implementation will decide if to return the original, calculated or
-     * something else.
-     *
-     * @param checksumType The checksum type
-     * @return Checksum value for the checksum type
-     */
-    String getChecksum(ChecksumType checksumType, Set<ChecksumInfo> checksumInfos);
-
-    /**
-     * Returns the checksum value by type. Actual implementation will decide if to return the original, calculated or
-     * something else. The repo path might also be used by the policy.
-     *
-     * @param checksumType The checksum type
-     * @param repoPath     The repo path of the resource the checksum is requested upon
-     * @return Checksum value for the checksum type
-     */
-    String getChecksum(ChecksumType checksumType, Set<ChecksumInfo> checksumInfos, RepoPath repoPath);
-}
diff --git a/storage/common/src/main/java/org/artifactory/io/checksum/policy/ChecksumPolicyBase.java b/storage/common/src/main/java/org/artifactory/io/checksum/policy/ChecksumPolicyBase.java
deleted file mode 100644
index 1bf572f..0000000
--- a/storage/common/src/main/java/org/artifactory/io/checksum/policy/ChecksumPolicyBase.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.io.checksum.policy;
-
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.checksum.ChecksumsInfo;
-import org.artifactory.descriptor.repo.ChecksumPolicyType;
-import org.artifactory.repo.RepoPath;
-
-import java.io.Serializable;
-import java.util.Set;
-
-/**
- * Base abstract implementation of the ChecksumPolicy.
- *
- * @author Yossi Shaul
- */
-public abstract class ChecksumPolicyBase implements ChecksumPolicy, Serializable {
-    abstract boolean verifyChecksum(ChecksumInfo checksumInfo);
-
-    abstract String getChecksum(ChecksumInfo checksumInfo);
-
-    @Override
-    public boolean verify(Set<ChecksumInfo> checksumInfos) {
-        for (ChecksumInfo checksumInfo : checksumInfos) {
-            // call the actual implementation to do its job
-            if (verifyChecksum(checksumInfo)) {
-                // by default if one checksum passes the file is ok
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public String getChecksum(ChecksumType checksumType, Set<ChecksumInfo> checksumInfos) {
-        ChecksumInfo info = getChecksumInfo(checksumType, checksumInfos);
-        if (info != null) {
-            return getChecksum(info);
-
-        }
-        return null;
-    }
-
-    // TODO: Need to change the API to receive the container class not a Set
-    public String getGoodChecksum(ChecksumType checksumType, ChecksumsInfo checksumInfos, RepoPath repoPath) {
-        // remote checksum policies don't care about the repo path
-        return getChecksum(checksumInfos.getChecksumInfo(checksumType));
-    }
-
-    @Override
-    public String getChecksum(ChecksumType checksumType, Set<ChecksumInfo> checksumInfos, RepoPath repoPath) {
-        // remote checksum policies don't care about the repo path
-        return getChecksum(checksumType, checksumInfos);
-    }
-
-    private ChecksumInfo getChecksumInfo(ChecksumType type, Set<ChecksumInfo> infos) {
-        for (ChecksumInfo info : infos) {
-            if (type.equals(info.getType())) {
-                return info;
-            }
-        }
-        return null;
-    }
-
-    public static ChecksumPolicy getByType(ChecksumPolicyType type) {
-        switch (type) {
-            case GEN_IF_ABSENT:
-                return new ChecksumPolicyGenerateIfAbsent();
-            case FAIL:
-                return new ChecksumPolicyFail();
-            case IGNORE_AND_GEN:
-                return new ChecksumPolicyIgnoreAndGenerate();
-            case PASS_THRU:
-                return new ChecksumPolicyPassThru();
-            default:
-                throw new IllegalArgumentException("No checksum policy found for type " + type);
-        }
-    }
-
-    /**
-     * @return The checksum policy type this checksum policy implements.
-     */
-    abstract ChecksumPolicyType getChecksumPolicyType();
-
-    @Override
-    public String toString() {
-        return getChecksumPolicyType().toString();
-    }
-
-}
diff --git a/storage/common/src/main/java/org/artifactory/io/checksum/policy/ChecksumPolicyException.java b/storage/common/src/main/java/org/artifactory/io/checksum/policy/ChecksumPolicyException.java
deleted file mode 100644
index a0557c1..0000000
--- a/storage/common/src/main/java/org/artifactory/io/checksum/policy/ChecksumPolicyException.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.io.checksum.policy;
-
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.checksum.ChecksumsInfo;
-import org.artifactory.repo.RepoPath;
-
-/**
- * Thrown when checksum policy doesn't allow saving a certain file.
- *
- * @author Yossi Shaul
- */
-public class ChecksumPolicyException extends RepoRejectException {
-    public ChecksumPolicyException(ChecksumPolicy policy, ChecksumsInfo checksums, RepoPath repoPath) {
-        super("Checksum policy '" + policy + "' rejected the artifact '" + repoPath + "'. " +
-                "Checksums info: " + checksums);
-    }
-
-    @Override
-    public int getErrorCode() {
-        return 409;
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/io/checksum/policy/ChecksumPolicyFail.java b/storage/common/src/main/java/org/artifactory/io/checksum/policy/ChecksumPolicyFail.java
deleted file mode 100644
index 9e328c5..0000000
--- a/storage/common/src/main/java/org/artifactory/io/checksum/policy/ChecksumPolicyFail.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.io.checksum.policy;
-
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.descriptor.repo.ChecksumPolicyType;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * This checksum policy doesn't allow mismatches between the original and the calculated checksums.
- *
- * @author Yossi Shaul
- */
-public class ChecksumPolicyFail extends ChecksumPolicyBase {
-    private static final Logger log = LoggerFactory.getLogger(ChecksumPolicyFail.class);
-
-    @Override
-    boolean verifyChecksum(ChecksumInfo checksumInfo) {
-        String original = checksumInfo.getOriginal();
-        if (original == null) {
-            log.warn("Rejecting original {} null checksum", checksumInfo.getType());
-            return false;
-        }
-        if (!checksumInfo.checksumsMatch()) {
-            log.warn("Checksum mismatch: {}", checksumInfo);
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    String getChecksum(ChecksumInfo checksumInfo) {
-        return checksumInfo.getActual();
-    }
-
-    @Override
-    ChecksumPolicyType getChecksumPolicyType() {
-        return ChecksumPolicyType.FAIL;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/io/checksum/policy/ChecksumPolicyGenerateIfAbsent.java b/storage/common/src/main/java/org/artifactory/io/checksum/policy/ChecksumPolicyGenerateIfAbsent.java
deleted file mode 100644
index 8dbf025..0000000
--- a/storage/common/src/main/java/org/artifactory/io/checksum/policy/ChecksumPolicyGenerateIfAbsent.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.io.checksum.policy;
-
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.descriptor.repo.ChecksumPolicyType;
-
-/**
- * This checksum policy ignores missing original checksums, but fails if original exist but not equals to the actual.
- *
- * @author Yossi Shaul
- */
-public class ChecksumPolicyGenerateIfAbsent extends ChecksumPolicyBase {
-
-    @Override
-    boolean verifyChecksum(ChecksumInfo checksumInfo) {
-        if (checksumInfo.getOriginal() == null) {
-            return true;
-        } else if (!checksumInfo.checksumsMatch()) {
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    String getChecksum(ChecksumInfo checksumInfo) {
-        return checksumInfo.getActual();
-    }
-
-    @Override
-    ChecksumPolicyType getChecksumPolicyType() {
-        return ChecksumPolicyType.GEN_IF_ABSENT;
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/io/checksum/policy/ChecksumPolicyIgnoreAndGenerate.java b/storage/common/src/main/java/org/artifactory/io/checksum/policy/ChecksumPolicyIgnoreAndGenerate.java
deleted file mode 100644
index 62cb535..0000000
--- a/storage/common/src/main/java/org/artifactory/io/checksum/policy/ChecksumPolicyIgnoreAndGenerate.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.io.checksum.policy;
-
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.descriptor.repo.ChecksumPolicyType;
-
-/**
- * This checksum policy ignores checksums errors.
- *
- * @author Yossi Shaul
- */
-public class ChecksumPolicyIgnoreAndGenerate extends ChecksumPolicyBase {
-
-    @Override
-    boolean verifyChecksum(ChecksumInfo checksumInfo) {
-        // we don't care if it passes or not
-        return true;
-    }
-
-    @Override
-    String getChecksum(ChecksumInfo checksumInfo) {
-        return checksumInfo.getActual();
-    }
-
-    @Override
-    ChecksumPolicyType getChecksumPolicyType() {
-        return ChecksumPolicyType.IGNORE_AND_GEN;
-    }
-
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/io/checksum/policy/ChecksumPolicyPassThru.java b/storage/common/src/main/java/org/artifactory/io/checksum/policy/ChecksumPolicyPassThru.java
deleted file mode 100644
index fccc1eb..0000000
--- a/storage/common/src/main/java/org/artifactory/io/checksum/policy/ChecksumPolicyPassThru.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.io.checksum.policy;
-
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.descriptor.repo.ChecksumPolicyType;
-
-/**
- * This checksum policy always passes verification and return the original value when asked.
- *
- * @author Yossi Shaul
- */
-public class ChecksumPolicyPassThru extends ChecksumPolicyBase {
-
-    @Override
-    boolean verifyChecksum(ChecksumInfo checksumInfo) {
-        return true;
-    }
-
-    @Override
-    String getChecksum(ChecksumInfo checksumInfo) {
-        return checksumInfo.getOriginal();
-    }
-
-    @Override
-    ChecksumPolicyType getChecksumPolicyType() {
-        return ChecksumPolicyType.PASS_THRU;
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/io/checksum/policy/LocalRepoChecksumPolicy.java b/storage/common/src/main/java/org/artifactory/io/checksum/policy/LocalRepoChecksumPolicy.java
deleted file mode 100644
index 3e30a25..0000000
--- a/storage/common/src/main/java/org/artifactory/io/checksum/policy/LocalRepoChecksumPolicy.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.io.checksum.policy;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.descriptor.repo.LocalRepoChecksumPolicyType;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.repo.RepoPath;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.Serializable;
-import java.util.Set;
-
-/**
- * This is the checksum policy used by local non-cache repositories. This class is not supposed to be used by the cache
- * repositories.
- *
- * @author Yossi Shaul
- */
-public class LocalRepoChecksumPolicy implements ChecksumPolicy, Serializable {
-    private static final Logger log = LoggerFactory.getLogger(LocalRepoChecksumPolicy.class);
-
-    private LocalRepoChecksumPolicyType policyType = LocalRepoChecksumPolicyType.CLIENT;
-
-    /**
-     * Verify client (original) checksums vs. calculated checksums when the original is not null. This method usually
-     * called while saving file to the storage (just after the actual checksums are calculated). This check is only
-     * applied if there are original checksums (ie, the client sends the checksum info with the deployed file).
-     *
-     * @param checksums The resource checksums
-     * @return True if it the checksums are ok according to the policy.
-     */
-    @Override
-    public boolean verify(Set<ChecksumInfo> checksums) {
-        boolean checksumsMatch = true;
-        for (ChecksumInfo checksum : checksums) {
-            // check only if the client checksum info exist
-            if (StringUtils.isNotBlank(checksum.getOriginal())) {
-                checksumsMatch &= checksum.checksumsMatch();
-            }
-        }
-
-        // fail only if there's real mismatch and the policy is client checksums
-        if (!checksumsMatch) {
-            if (LocalRepoChecksumPolicyType.CLIENT == policyType) {
-                return false;
-            } else {
-                log.debug("Checksum mismatch: %s", checksums);
-            }
-        }
-        return true;
-    }
-
-
-    @Override
-    public String getChecksum(ChecksumType checksumType, Set<ChecksumInfo> checksums) {
-        return getChecksum(checksumType, checksums, null);
-    }
-
-    @Override
-    public String getChecksum(ChecksumType checksumType, Set<ChecksumInfo> checksums, RepoPath repoPath) {
-        ChecksumInfo checksumInfo = getByType(checksumType, checksums);
-        if (checksumInfo == null) {
-            return null;
-        }
-
-        if (repoPath != null && MavenNaming.isMavenMetadata(repoPath.getPath())) {
-            return checksumInfo.getActual();  // maven metadata checksums are always the "server" checksum
-        }
-
-        if (LocalRepoChecksumPolicyType.CLIENT == policyType) {
-            return checksumInfo.getOriginal();  // the "client" checksum
-        } else {
-            return checksumInfo.getActual();    // the "server" (actual file) checksum
-        }
-    }
-
-    public void setPolicyType(LocalRepoChecksumPolicyType policyType) {
-        if (policyType != null) {
-            this.policyType = policyType;
-        }
-    }
-
-    private ChecksumInfo getByType(ChecksumType checksumType, Set<ChecksumInfo> checksums) {
-        for (ChecksumInfo info : checksums) {
-            if (checksumType.equals(info.getType())) {
-                return info;
-            }
-        }
-        return null;
-    }
-
-    public LocalRepoChecksumPolicyType getPolicyType() {
-        return policyType;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        LocalRepoChecksumPolicy that = (LocalRepoChecksumPolicy) o;
-
-        if (policyType != that.policyType) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return policyType.hashCode();
-    }
-
-    @Override
-    public String toString() {
-        return "LocalRepoChecksumPolicy: " + policyType;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/md/AbstractMetadataPersistenceHandler.java b/storage/common/src/main/java/org/artifactory/md/AbstractMetadataPersistenceHandler.java
deleted file mode 100644
index 55722a9..0000000
--- a/storage/common/src/main/java/org/artifactory/md/AbstractMetadataPersistenceHandler.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-/**
- * @author freds
- */
-public abstract class AbstractMetadataPersistenceHandler<T, M> extends AbstractPersistenceHandler<T, M> {
-
-    protected AbstractMetadataPersistenceHandler(XmlMetadataProvider<T, M> xmlProvider) {
-        super(xmlProvider);
-    }
-
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/md/AbstractPersistenceHandler.java b/storage/common/src/main/java/org/artifactory/md/AbstractPersistenceHandler.java
deleted file mode 100644
index 8c08e95..0000000
--- a/storage/common/src/main/java/org/artifactory/md/AbstractPersistenceHandler.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.storage.spring.StorageContextHelper;
-
-/**
- * @author freds
- */
-public abstract class AbstractPersistenceHandler<T, M> implements MetadataPersistenceHandler<T, M> {
-
-    private AuthorizationService authService;
-    private final XmlMetadataProvider<T, M> xmlProvider;
-
-    protected AbstractPersistenceHandler(XmlMetadataProvider<T, M> xmlProvider) {
-        this.xmlProvider = xmlProvider;
-    }
-
-    protected String getMetadataName() {
-        return xmlProvider.getMetadataName();
-    }
-
-    protected AuthorizationService getAuthorizationService() {
-        if (authService == null) {
-            authService = StorageContextHelper.get().getAuthorizationService();
-        }
-        return authService;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/md/AbstractXmlContentPersistenceHandler.java b/storage/common/src/main/java/org/artifactory/md/AbstractXmlContentPersistenceHandler.java
deleted file mode 100644
index 28872b9..0000000
--- a/storage/common/src/main/java/org/artifactory/md/AbstractXmlContentPersistenceHandler.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-/**
- * @author freds
- */
-public abstract class AbstractXmlContentPersistenceHandler<T, M> extends AbstractMetadataPersistenceHandler<T, M> {
-
-    protected AbstractXmlContentPersistenceHandler(XmlMetadataProvider<T, M> xmlProvider) {
-        super(xmlProvider);
-    }
-
-}
diff --git a/storage/common/src/main/java/org/artifactory/md/FileInfoPersistenceHandler.java b/storage/common/src/main/java/org/artifactory/md/FileInfoPersistenceHandler.java
deleted file mode 100644
index 5f553b0..0000000
--- a/storage/common/src/main/java/org/artifactory/md/FileInfoPersistenceHandler.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.MutableFileInfo;
-
-/**
- * @author freds
- */
-public class FileInfoPersistenceHandler extends AbstractPersistenceHandler<FileInfo, MutableFileInfo> {
-
-    public FileInfoPersistenceHandler(XmlMetadataProvider<FileInfo, MutableFileInfo> xmlProvider) {
-        super(xmlProvider);
-    }
-
-    @Override
-    public MutableFileInfo copy(FileInfo original) {
-        return InfoFactoryHolder.get().copyFileInfo(original);
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/md/FileInfoXmlProvider.java b/storage/common/src/main/java/org/artifactory/md/FileInfoXmlProvider.java
deleted file mode 100644
index a3d9fdb..0000000
--- a/storage/common/src/main/java/org/artifactory/md/FileInfoXmlProvider.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.MutableFileInfo;
-
-/**
- * @author freds
- */
-public class FileInfoXmlProvider extends XStreamMetadataProvider<FileInfo, MutableFileInfo> {
-
-    public FileInfoXmlProvider() {
-        super(FileInfo.ROOT);
-    }
-
-    @Override
-    public MutableFileInfo fromXml(String xmlData) {
-        return (MutableFileInfo) getXstream().fromXML(xmlData);
-    }
-
-    @Override
-    public String toXml(FileInfo metadata) {
-        return getXstream().toXML(metadata);
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/md/FolderInfoPersistenceHandler.java b/storage/common/src/main/java/org/artifactory/md/FolderInfoPersistenceHandler.java
deleted file mode 100644
index 0d3833b..0000000
--- a/storage/common/src/main/java/org/artifactory/md/FolderInfoPersistenceHandler.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.fs.MutableFolderInfo;
-
-/**
- * @author freds
- */
-public class FolderInfoPersistenceHandler extends AbstractPersistenceHandler<FolderInfo, MutableFolderInfo> {
-
-    public FolderInfoPersistenceHandler(XmlMetadataProvider<FolderInfo, MutableFolderInfo> xmlProvider) {
-        super(xmlProvider);
-    }
-
-    @Override
-    public MutableFolderInfo copy(FolderInfo original) {
-        return InfoFactoryHolder.get().copyFolderInfo(original);
-    }
-
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/md/FolderInfoXmlProvider.java b/storage/common/src/main/java/org/artifactory/md/FolderInfoXmlProvider.java
deleted file mode 100644
index 448ca9b..0000000
--- a/storage/common/src/main/java/org/artifactory/md/FolderInfoXmlProvider.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.fs.MutableFolderInfo;
-
-/**
- * @author freds
- */
-public class FolderInfoXmlProvider extends XStreamMetadataProvider<FolderInfo, MutableFolderInfo> {
-
-    public FolderInfoXmlProvider() {
-        super(FolderInfo.ROOT);
-    }
-
-    @Override
-    public MutableFolderInfo fromXml(String xmlData) {
-        return (MutableFolderInfo) getXstream().fromXML(xmlData);
-    }
-
-    @Override
-    public String toXml(FolderInfo metadata) {
-        return getXstream().toXML(metadata);
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/md/GenericPersistenceHandler.java b/storage/common/src/main/java/org/artifactory/md/GenericPersistenceHandler.java
deleted file mode 100644
index 4bd1629..0000000
--- a/storage/common/src/main/java/org/artifactory/md/GenericPersistenceHandler.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-/**
- * @author freds
- */
-public class GenericPersistenceHandler extends AbstractXmlContentPersistenceHandler<String, String> {
-
-    public GenericPersistenceHandler(XmlMetadataProvider<String, String> xmlProvider) {
-        super(xmlProvider);
-    }
-
-    @Override
-    public String copy(String original) {
-        return original;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/md/GenericXmlProvider.java b/storage/common/src/main/java/org/artifactory/md/GenericXmlProvider.java
deleted file mode 100644
index 2429f33..0000000
--- a/storage/common/src/main/java/org/artifactory/md/GenericXmlProvider.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-/**
- * @author freds
- */
-public class GenericXmlProvider implements XmlMetadataProvider<String, String> {
-
-    private final String metadataName;
-
-    public GenericXmlProvider(String metadataName) {
-        this.metadataName = metadataName;
-    }
-
-    @Override
-    public String getMetadataName() {
-        return metadataName;
-    }
-
-    @Override
-    public String fromXml(String xmlData) {
-        return xmlData;
-    }
-
-    @Override
-    public String toXml(String metadata) {
-        return metadata;
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/md/MetadataDefinition.java b/storage/common/src/main/java/org/artifactory/md/MetadataDefinition.java
deleted file mode 100644
index dc1b1ea..0000000
--- a/storage/common/src/main/java/org/artifactory/md/MetadataDefinition.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-import java.io.Serializable;
-
-/**
- * @author freds
- * @date Sep 3, 2008
- */
-public class MetadataDefinition<T, MT> implements Serializable {
-    /**
-     * A Java class that can be marshall/unmarshall this metadata XML stream.
-     */
-    private final XmlMetadataProvider<T, MT> xmlProvider;
-    /**
-     * A Java class that can read and save this metadata to the underlying storage.
-     */
-    private final MetadataPersistenceHandler<T, MT> persistenceHandler;
-    /**
-     * If true this metadata will not be display as part of metadata names for an fs item.
-     */
-    private final boolean internal;
-
-    public MetadataDefinition(XmlMetadataProvider<T, MT> xmlProvider,
-            MetadataPersistenceHandler<T, MT> persistenceHandler, boolean internal) {
-        this.xmlProvider = xmlProvider;
-        this.persistenceHandler = persistenceHandler;
-        this.internal = internal;
-    }
-
-    public XmlMetadataProvider<T, MT> getXmlProvider() {
-        return xmlProvider;
-    }
-
-    public MetadataPersistenceHandler<T, MT> getPersistenceHandler() {
-        return persistenceHandler;
-    }
-
-    public String getMetadataName() {
-        return xmlProvider.getMetadataName();
-    }
-
-    public boolean isInternal() {
-        return internal;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        MetadataDefinition that = (MetadataDefinition) o;
-        return getMetadataName().equals(that.getMetadataName());
-    }
-
-    @Override
-    public int hashCode() {
-        return getMetadataName().hashCode();
-    }
-
-    @Override
-    public String toString() {
-        return "MetadataDefinition{" +
-                "metadataName='" + getMetadataName() + '\'' +
-                ", persistentClass=" + persistenceHandler.getClass().getName() +
-                ", xmlProviderClass=" + xmlProvider.getClass().getName() +
-                '}';
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/md/MetadataDefinitionFactory.java b/storage/common/src/main/java/org/artifactory/md/MetadataDefinitionFactory.java
deleted file mode 100644
index c088b94..0000000
--- a/storage/common/src/main/java/org/artifactory/md/MetadataDefinitionFactory.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.fs.MutableFileInfo;
-import org.artifactory.fs.MutableFolderInfo;
-
-import java.util.Set;
-
-/**
- * @author freds
- */
-public interface MetadataDefinitionFactory {
-    <T, MT> MetadataDefinition<T, MT> getMetadataDefinition(Class<T> clazz);
-
-    MetadataDefinition getMetadataDefinition(String metadataName, boolean createIfEmpty);
-
-    Set<MetadataDefinition<?, ?>> getAllMetadataDefinitions(boolean includeInternal);
-
-    MetadataDefinition<FileInfo, MutableFileInfo> getFileInfoMd();
-
-    MetadataDefinition<FolderInfo, MutableFolderInfo> getFolderInfoMd();
-}
diff --git a/storage/common/src/main/java/org/artifactory/md/MetadataDefinitionService.java b/storage/common/src/main/java/org/artifactory/md/MetadataDefinitionService.java
deleted file mode 100644
index ead59d6..0000000
--- a/storage/common/src/main/java/org/artifactory/md/MetadataDefinitionService.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-import org.artifactory.spring.ReloadableBean;
-
-/**
- * @author freds
- * @date Sep 3, 2008
- */
-public interface MetadataDefinitionService extends MetadataDefinitionFactory, ReloadableBean {
-}
diff --git a/storage/common/src/main/java/org/artifactory/md/MetadataDefinitionServiceImpl.java b/storage/common/src/main/java/org/artifactory/md/MetadataDefinitionServiceImpl.java
deleted file mode 100644
index cf6602e..0000000
--- a/storage/common/src/main/java/org/artifactory/md/MetadataDefinitionServiceImpl.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-import com.google.common.collect.Maps;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.fs.MutableFileInfo;
-import org.artifactory.fs.MutableFolderInfo;
-import org.artifactory.fs.MutableStatsInfo;
-import org.artifactory.fs.MutableWatchersInfo;
-import org.artifactory.fs.StatsInfo;
-import org.artifactory.fs.WatchersInfo;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.version.CompoundVersionDetails;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author freds
- * @date Sep 3, 2008
- */
- at Service
- at Reloadable(beanClass = MetadataDefinitionService.class)
-public class MetadataDefinitionServiceImpl implements MetadataDefinitionService {
-    private static final Logger log = LoggerFactory.getLogger(MetadataDefinitionServiceImpl.class);
-
-    private final Map<Class, MetadataDefinition> mdDefsByClass = Maps.newHashMap();
-    private final Map<String, MetadataDefinition> mdDefsByName = Maps.newHashMap();
-
-    @Override
-    public void init() {
-        // Internal metadata
-        FolderInfoXmlProvider folderInfoXmlProvider = new FolderInfoXmlProvider();
-        createMetadataDefinition(FolderInfo.class, MutableFolderInfo.class,
-                folderInfoXmlProvider,
-                new FolderInfoPersistenceHandler(folderInfoXmlProvider), true);
-        FileInfoXmlProvider fileInfoXmlProvider = new FileInfoXmlProvider();
-        createMetadataDefinition(FileInfo.class, MutableFileInfo.class,
-                fileInfoXmlProvider,
-                new FileInfoPersistenceHandler(fileInfoXmlProvider), true);
-        WatchersXmlProvider watchersXmlProvider = new WatchersXmlProvider();
-        createMetadataDefinition(WatchersInfo.class, MutableWatchersInfo.class,
-                watchersXmlProvider,
-                new WatchersPersistenceHandler(watchersXmlProvider), true);
-
-        // Additional persistent metadata
-        StatsInfoXmlProvider statsInfoXmlProvider = new StatsInfoXmlProvider();
-        createMetadataDefinition(StatsInfo.class, MutableStatsInfo.class,
-                statsInfoXmlProvider,
-                new StatsInfoPersistenceHandler(statsInfoXmlProvider), false);
-        PropertiesXmlProvider propertiesXmlProvider = new PropertiesXmlProvider();
-        createMetadataDefinition(PropertiesInfo.class, MutablePropertiesInfo.class,
-                propertiesXmlProvider,
-                new PropertiesPersistenceHandler(propertiesXmlProvider), false,
-                Properties.class);
-        GenericXmlProvider mavenMetadataXmlProvider = new GenericXmlProvider(MavenNaming.MAVEN_METADATA_NAME);
-        createMetadataDefinition(String.class, String.class,
-                mavenMetadataXmlProvider,
-                new GenericPersistenceHandler(mavenMetadataXmlProvider), false);
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-    }
-
-    @Override
-    public void destroy() {
-        mdDefsByClass.clear();
-        mdDefsByName.clear();
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-    }
-
-    @Override
-    @SuppressWarnings({"unchecked"})
-    public <T, MT> MetadataDefinition<T, MT> getMetadataDefinition(Class<T> clazz) {
-        MetadataDefinition<T, MT> definition = mdDefsByClass.get(clazz);
-        if (definition == null) {
-            throw new IllegalArgumentException("Creating new Metadata on the fly for: '" + clazz +
-                    "'. Should have been initialized!");
-        }
-        return definition;
-    }
-
-    @Override
-    public MetadataDefinition getMetadataDefinition(String metadataName, boolean createIfEmpty) {
-        if (StringUtils.isBlank(metadataName)) {
-            throw new IllegalArgumentException("Metadata type name to locate cannot be null.");
-        }
-
-        MetadataDefinition definition = mdDefsByName.get(metadataName);
-        if (definition == null && createIfEmpty) {
-            log.debug("Creating new Metadata definition on demand for '{}'.", metadataName);
-            GenericXmlProvider xmlProvider = new GenericXmlProvider(metadataName);
-            definition = new MetadataDefinition<>(xmlProvider,
-                    new GenericPersistenceHandler(xmlProvider), false);
-        }
-        return definition;
-    }
-
-    @Override
-    public Set<MetadataDefinition<?, ?>> getAllMetadataDefinitions(boolean includeInternal) {
-        Set<MetadataDefinition<?, ?>> result = new HashSet<>();
-        Collection<MetadataDefinition> mdDefColl = mdDefsByName.values();
-        for (MetadataDefinition definition : mdDefColl) {
-            if (includeInternal || !definition.isInternal()) {
-                result.add(definition);
-            }
-        }
-        return result;
-    }
-
-    @Override
-    public MetadataDefinition<FileInfo, MutableFileInfo> getFileInfoMd() {
-        return mdDefsByClass.get(FileInfo.class);
-    }
-
-    @Override
-    public MetadataDefinition<FolderInfo, MutableFolderInfo> getFolderInfoMd() {
-        return mdDefsByClass.get(FolderInfo.class);
-    }
-
-    private <T, MT> MetadataDefinition createMetadataDefinition(
-            Class<T> clazz,
-            Class<MT> mClazz,
-            XmlMetadataProvider<T, MT> xmlProvider,
-            MetadataPersistenceHandler<T, MT> persistenceHandler,
-            boolean internal, Class... extraClassKeys) {
-        MetadataDefinition definition = new MetadataDefinition<>(xmlProvider, persistenceHandler, internal);
-        if (clazz != String.class) {
-            mdDefsByClass.put(clazz, definition);
-        }
-        if (mClazz != String.class) {
-            mdDefsByClass.put(mClazz, definition);
-        }
-        for (Class extraClassKey : extraClassKeys) {
-            mdDefsByClass.put(extraClassKey, definition);
-        }
-        mdDefsByName.put(definition.getMetadataName(), definition);
-        return definition;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/md/MetadataPersistenceHandler.java b/storage/common/src/main/java/org/artifactory/md/MetadataPersistenceHandler.java
deleted file mode 100644
index b394886..0000000
--- a/storage/common/src/main/java/org/artifactory/md/MetadataPersistenceHandler.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-/**
- * For each metadata class the implementation of this interface will provide a way to read and save the data to DB.
- *
- * @author freds
- */
-public interface MetadataPersistenceHandler<T, MT> {
-
-    MT copy(T original);
-}
diff --git a/storage/common/src/main/java/org/artifactory/md/PropertiesPersistenceHandler.java b/storage/common/src/main/java/org/artifactory/md/PropertiesPersistenceHandler.java
deleted file mode 100644
index 847e836..0000000
--- a/storage/common/src/main/java/org/artifactory/md/PropertiesPersistenceHandler.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-import org.artifactory.factory.InfoFactoryHolder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * @author freds
- */
-public class PropertiesPersistenceHandler
-        extends AbstractMetadataPersistenceHandler<PropertiesInfo, MutablePropertiesInfo> {
-    private static final Logger log = LoggerFactory.getLogger(PropertiesPersistenceHandler.class);
-
-    public PropertiesPersistenceHandler(XmlMetadataProvider<PropertiesInfo, MutablePropertiesInfo> xmlProvider) {
-        super(xmlProvider);
-    }
-
-    @Override
-    public MutablePropertiesInfo copy(PropertiesInfo original) {
-        return InfoFactoryHolder.get().copyProperties(original);
-    }
-
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/md/PropertiesXmlProvider.java b/storage/common/src/main/java/org/artifactory/md/PropertiesXmlProvider.java
deleted file mode 100644
index f6e336a..0000000
--- a/storage/common/src/main/java/org/artifactory/md/PropertiesXmlProvider.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-/**
- * @author freds
- */
-public class PropertiesXmlProvider extends XStreamMetadataProvider<PropertiesInfo, MutablePropertiesInfo> {
-
-    public PropertiesXmlProvider() {
-        super(PropertiesInfo.ROOT);
-    }
-
-    @Override
-    public MutablePropertiesInfo fromXml(String xmlData) {
-        return (MutablePropertiesInfo) getXstream().fromXML(xmlData);
-    }
-
-    @Override
-    public String toXml(PropertiesInfo metadata) {
-        return getXstream().toXML(metadata);
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/md/StatsInfoPersistenceHandler.java b/storage/common/src/main/java/org/artifactory/md/StatsInfoPersistenceHandler.java
deleted file mode 100644
index 48bae24..0000000
--- a/storage/common/src/main/java/org/artifactory/md/StatsInfoPersistenceHandler.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.MutableStatsInfo;
-import org.artifactory.fs.StatsInfo;
-
-/**
- * @author freds
- */
-public class StatsInfoPersistenceHandler extends AbstractMetadataPersistenceHandler<StatsInfo, MutableStatsInfo> {
-
-    public StatsInfoPersistenceHandler(XmlMetadataProvider<StatsInfo, MutableStatsInfo> xmlProvider) {
-        super(xmlProvider);
-    }
-
-    @Override
-    public MutableStatsInfo copy(StatsInfo original) {
-        return InfoFactoryHolder.get().copyStats(original);
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/md/StatsInfoXmlProvider.java b/storage/common/src/main/java/org/artifactory/md/StatsInfoXmlProvider.java
deleted file mode 100644
index a764bc1..0000000
--- a/storage/common/src/main/java/org/artifactory/md/StatsInfoXmlProvider.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-import org.artifactory.fs.MutableStatsInfo;
-import org.artifactory.fs.StatsInfo;
-
-/**
- * @author freds
- */
-public class StatsInfoXmlProvider extends XStreamMetadataProvider<StatsInfo, MutableStatsInfo> {
-
-    public StatsInfoXmlProvider() {
-        super(StatsInfo.ROOT);
-    }
-
-    @Override
-    public MutableStatsInfo fromXml(String xmlData) {
-        return (MutableStatsInfo) getXstream().fromXML(xmlData);
-    }
-
-    @Override
-    public String toXml(StatsInfo metadata) {
-        return getXstream().toXML(metadata);
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/md/WatchersPersistenceHandler.java b/storage/common/src/main/java/org/artifactory/md/WatchersPersistenceHandler.java
deleted file mode 100644
index cae288a..0000000
--- a/storage/common/src/main/java/org/artifactory/md/WatchersPersistenceHandler.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.MutableWatchersInfo;
-import org.artifactory.fs.WatchersInfo;
-
-/**
- * @author freds
- */
-public class WatchersPersistenceHandler
-        extends AbstractXmlContentPersistenceHandler<WatchersInfo, MutableWatchersInfo> {
-
-    public WatchersPersistenceHandler(WatchersXmlProvider xmlProvider) {
-        super(xmlProvider);
-    }
-
-    @Override
-    public MutableWatchersInfo copy(WatchersInfo original) {
-        return InfoFactoryHolder.get().copyWatchers(original);
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/md/WatchersXmlProvider.java b/storage/common/src/main/java/org/artifactory/md/WatchersXmlProvider.java
deleted file mode 100644
index 4d59c30..0000000
--- a/storage/common/src/main/java/org/artifactory/md/WatchersXmlProvider.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-import org.artifactory.fs.MutableWatchersInfo;
-import org.artifactory.fs.WatchersInfo;
-
-/**
- * @author freds
- */
-public class WatchersXmlProvider extends XStreamMetadataProvider<WatchersInfo, MutableWatchersInfo> {
-
-    public WatchersXmlProvider() {
-        super(WatchersInfo.ROOT);
-    }
-
-    @Override
-    public MutableWatchersInfo fromXml(String xmlData) {
-        return (MutableWatchersInfo) getXstream().fromXML(xmlData);
-    }
-
-    @Override
-    public String toXml(WatchersInfo metadata) {
-        return getXstream().toXML(metadata);
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/md/XStreamMetadataProvider.java b/storage/common/src/main/java/org/artifactory/md/XStreamMetadataProvider.java
deleted file mode 100644
index 8c6f973..0000000
--- a/storage/common/src/main/java/org/artifactory/md/XStreamMetadataProvider.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-import com.thoughtworks.xstream.XStream;
-import org.artifactory.factory.InfoFactoryHolder;
-
-/**
- * @author freds
- */
-public abstract class XStreamMetadataProvider<T, MT> implements XmlMetadataProvider<T, MT> {
-
-    private final XStream xstream;
-    private final String metadataName;
-
-    public XStreamMetadataProvider(String metadataName) {
-        if (metadataName == null) {
-            throw new IllegalArgumentException("Metadata name mandatory");
-        }
-        this.xstream = InfoFactoryHolder.get().getFileSystemXStream();
-        this.metadataName = metadataName;
-    }
-
-    public XStream getXstream() {
-        return xstream;
-    }
-
-    @Override
-    public String getMetadataName() {
-        return metadataName;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/md/XmlMetadataProvider.java b/storage/common/src/main/java/org/artifactory/md/XmlMetadataProvider.java
deleted file mode 100644
index fb44265..0000000
--- a/storage/common/src/main/java/org/artifactory/md/XmlMetadataProvider.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.md;
-
-/**
- * For each metadata class an implementation of this interface will provide the Marshall/Unmarshall methods to and from
- * an XML reader object.
- *
- * @author freds
- */
-public interface XmlMetadataProvider<T, MT> {
-    MT fromXml(String xmlData);
-
-    String toXml(T metadata);
-
-    String getMetadataName();
-}
diff --git a/storage/common/src/main/java/org/artifactory/model/WatcherRepoPathInfo.java b/storage/common/src/main/java/org/artifactory/model/WatcherRepoPathInfo.java
deleted file mode 100644
index dd41901..0000000
--- a/storage/common/src/main/java/org/artifactory/model/WatcherRepoPathInfo.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model;
-
-import org.artifactory.fs.WatcherInfo;
-import org.artifactory.repo.RepoPath;
-
-/**
- * Simple data objects that holds the {@link org.artifactory.repo.RepoPath} in addition to the
- * {@link org.artifactory.fs.WatcherInfo}.
- *
- * @author Yossi Shaul
- */
-public class WatcherRepoPathInfo {
-
-    private final RepoPath repoPath;
-    private final WatcherInfo info;
-
-    public WatcherRepoPathInfo(RepoPath repoPath, WatcherInfo info) {
-        this.repoPath = repoPath;
-        this.info = info;
-    }
-
-    public RepoPath getRepoPath() {
-        return repoPath;
-    }
-
-    public WatcherInfo getInfo() {
-        return info;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/model/common/RemoteRepoPathImpl.java b/storage/common/src/main/java/org/artifactory/model/common/RemoteRepoPathImpl.java
deleted file mode 100644
index 0644e8d..0000000
--- a/storage/common/src/main/java/org/artifactory/model/common/RemoteRepoPathImpl.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.common;
-
-import com.google.common.base.Strings;
-import org.artifactory.repo.RemoteRepoPath;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
-/**
- * Represents RemoteRepoPath implementation which obligates to RepoPath
- * contract and adding remote Origin in to the context
- */
-public class RemoteRepoPathImpl implements RemoteRepoPath {
-
-    private final String origin;
-    private final RepoPath repoPath;
-
-    /**
-     * @param origin origin host
-     * @param repoPath {@link RepoPath}
-     */
-    public RemoteRepoPathImpl(String origin, RepoPath repoPath) {
-        assert !Strings.isNullOrEmpty(origin) : "Origin cannot be empty";
-        assert repoPath != null : "RepoPath cannot be empty";
-
-        this.origin = origin;
-        this.repoPath = repoPath;
-    }
-
-    public static RemoteRepoPathImpl newInstance(String origin, String repoPath) {
-        RepoPath path = RepoPathFactory.create(repoPath);
-        return new RemoteRepoPathImpl(origin, path);
-    }
-
-    public static RemoteRepoPathImpl newInstance(String origin, RepoPath path) {
-        return new RemoteRepoPathImpl(origin, path);
-    }
-
-    @Nonnull
-    @Override
-    public String getRepoKey() {
-        return repoPath.getRepoKey();
-    }
-
-    @Override
-    public String getPath() {
-        return repoPath.getPath();
-    }
-
-    @Override
-    public String getId() {
-        return repoPath.getId();
-    }
-
-    @Override
-    public String toPath() {
-        return  repoPath.toPath();
-    }
-
-    @Override
-    public String getName() {
-        return repoPath.getName();
-    }
-
-    @Nullable
-    @Override
-    public RepoPath getParent() {
-        return repoPath.getParent();
-    }
-
-    @Override
-    public boolean isRoot() {
-        return repoPath.isRoot();
-    }
-
-    @Override
-    public boolean isFile() {
-        return repoPath.isFile();
-    }
-
-    @Override
-    public boolean isFolder() {
-        return repoPath.isFolder();
-    }
-
-    /**
-     * @return remote origin
-     */
-    @Override
-    public String getOrigin() {
-        return origin;
-    }
-
-    /**
-     * @return {@link RepoPath} on remote host
-     */
-    @Override
-    public RepoPath getActualRepoPath() {
-        return repoPath;
-    }
-
-    @Override
-    public boolean equals(Object other) {
-        if (this == other) {
-            return true;
-        }
-        if (other == null || this.getClass() != other.getClass()) {
-            return false;
-        }
-        return repoPath.equals(other) &&
-                this.getOrigin().equals(((RemoteRepoPath) other).getOrigin());
-    }
-
-    @Override
-    public int hashCode() {
-        int result;
-        result = getActualRepoPath().hashCode();
-        result = 31 * result + getOrigin().hashCode();
-        return result;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/model/common/RepoPathImpl.java b/storage/common/src/main/java/org/artifactory/model/common/RepoPathImpl.java
deleted file mode 100644
index 51b9775..0000000
--- a/storage/common/src/main/java/org/artifactory/model/common/RepoPathImpl.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.common;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.util.PathUtils;
-
-import javax.annotation.Nullable;
-
-/**
- * An object identity that represents a repository and a path inside the repository
- * <p/>
- *
- * @author Yoav Landman
- */
-public final class RepoPathImpl implements RepoPath {
-
-    private final String repoKey;
-    private final String path;
-    private boolean folder; // true if file false otherwise /
-
-
-    /**
-     * @param repoKey The key of any repo
-     * @param path    The relative path inside the repo
-     */
-    public RepoPathImpl(String repoKey, String path) {
-        this(repoKey, path, path != null && path.endsWith("/"));
-    }
-
-    /**
-     * Create a repo path representing the child of parent
-     *
-     * @param parent the repo path of the parent folder
-     * @param child  the child name
-     */
-    public RepoPathImpl(RepoPath parent, String child) {
-        this(parent.getRepoKey(), parent.getPath() + "/" + child);
-    }
-
-    public RepoPathImpl(String repoKey, String path, boolean folder) {
-        this.repoKey = StringUtils.trimToNull(repoKey);
-        if (this.repoKey == null) {
-            throw new IllegalArgumentException("Repo key cannot be empty. Path: " + path);
-        }
-        this.path = PathUtils.trimSlashes(StringUtils.trimToEmpty(path)).toString();
-        this.folder = folder;
-    }
-
-    @Override
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    @Override
-    public String getPath() {
-        return path;
-    }
-
-    @Override
-    public String getId() {
-        return repoKey + REPO_PATH_SEP + path;
-    }
-
-    @Override
-    public String getName() {
-        return NamingUtils.stripMetadataFromPath(PathUtils.getFileName(getPath()));
-    }
-
-    @Override
-    public String toPath() {
-        return repoKey + "/" + path + (isFolder() && !isRoot() ? "/" : "");
-    }
-
-    /**
-     * @return Parent of this repo path. Null if has no parent
-     */
-    @Override
-    @Nullable
-    public RepoPath getParent() {
-        if (isRoot()) {
-            return null;
-        } else {
-            return new RepoPathImpl(repoKey, PathUtils.getParent(path), true);
-        }
-    }
-
-    /**
-     * @return True if this path is the root (ie, getPath() is empty string)
-     */
-    @Override
-    public boolean isRoot() {
-        return StringUtils.isBlank(getPath());
-    }
-
-    @Override
-    public boolean isFile() {
-        return !folder;
-    }
-
-    @Override
-    public boolean isFolder() {
-        return folder || isRoot();
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        RepoPath repoPath = (RepoPath) o;
-        return path.equals(repoPath.getPath()) && repoKey.equals(repoPath.getRepoKey());
-    }
-
-    @Override
-    public int hashCode() {
-        int result;
-        result = repoKey.hashCode();
-        result = 31 * result + path.hashCode();
-        return result;
-    }
-
-    @Override
-    public String toString() {
-        return getId();
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/fs/ArchiveEntryImpl.java b/storage/common/src/main/java/org/artifactory/model/xstream/fs/ArchiveEntryImpl.java
deleted file mode 100644
index a056b79..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/fs/ArchiveEntryImpl.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.fs;
-
-import org.apache.commons.compress.archivers.ArchiveEntry;
-import org.artifactory.fs.ZipEntryInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.util.PathUtils;
-
-import javax.annotation.Nonnull;
-import java.io.Serializable;
-
-/**
- * Simple serializable object with zip entry information.
- *
- * @author Chen Keinan
- */
-public class ArchiveEntryImpl implements Serializable, ZipEntryInfo {
-    final private String path;    // full path of the entry
-    final private String name;    // entry name
-    final private long time;    // modification time (in DOS time)
-    private long crc = 0;        // crc-32 of entry data
-    final private long size;    // uncompressed size of entry data
-    private long compressedSize = 0;   // compressed size of entry data
-    private String comment = null;        // optional comment string for entry
-    final private boolean directory;    // is this entry a directory
-
-    /**
-     * Builds a directory entry with just a name (some jar files doesn't contain ZipEntry for directories).
-     *
-     * @param path      The full path of the entry
-     * @param directory
-     */
-    public ArchiveEntryImpl(@Nonnull String path, boolean directory) {
-        this.path = path;
-        this.name = PathUtils.getFileName(path);
-        this.time = 0;
-        this.size = 0;
-        this.compressedSize = 0;
-        this.comment = null;
-        this.crc = 0;
-        this.directory = directory;
-    }
-
-    public ArchiveEntryImpl(@Nonnull ArchiveEntry... entries) {
-        if (entries.length == 0) {
-            throw new IllegalArgumentException("Cannot create ZipEntryInfo without a ZipEntry!");
-        }
-
-        ArchiveEntry entry = entries[entries.length - 1];
-
-        if (entries.length > 1) {
-            StringBuilder fullPath = new StringBuilder();
-            for (int i = 0; i < entries.length; i++) {
-                fullPath.append(entries[i].getName());
-                if (i != entries.length - 1) {
-                    fullPath.append(RepoPath.ARCHIVE_SEP).append('/');
-                }
-            }
-            this.path = fullPath.toString();
-        } else {
-            this.path = entry.getName();
-        }
-        this.name = PathUtils.getFileName(entry.getName());
-        this.time = entry.getLastModifiedDate().getTime();
-        this.size = entry.getSize();
-        this.directory = entry.isDirectory();
-    }
-
-    @Override
-    public String getPath() {
-        return path;
-    }
-
-    @Override
-    public String getName() {
-        return name;
-    }
-
-    @Override
-    public long getTime() {
-        return time;
-    }
-
-    @Override
-    public long getCrc() {
-        return crc;
-    }
-
-    @Override
-    public long getSize() {
-        return size;
-    }
-
-    @Override
-    public long getCompressedSize() {
-        return compressedSize;
-    }
-
-    @Override
-    public String getComment() {
-        return comment;
-    }
-
-    @Override
-    public boolean isDirectory() {
-        return directory;
-    }
-
-    @Override
-    public String toString() {
-        return path;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        ArchiveEntryImpl zipEntry = (ArchiveEntryImpl) o;
-
-        if (directory != zipEntry.directory) {
-            return false;
-        }
-        if (!path.equals(zipEntry.path)) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = path.hashCode();
-        result = 31 * result + (directory ? 1 : 0);
-        return result;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/fs/FileAdditionalInfo.java b/storage/common/src/main/java/org/artifactory/model/xstream/fs/FileAdditionalInfo.java
deleted file mode 100644
index 9b7d44d..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/fs/FileAdditionalInfo.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.fs;
-
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.checksum.ChecksumsInfo;
-
-import javax.annotation.Nonnull;
-import java.util.Set;
-
-/**
- * @author freds
- * @date Oct 12, 2008
- */
- at XStreamAlias(FileAdditionalInfo.ROOT)
-public class FileAdditionalInfo extends ItemAdditionalInfo {
-    public static final String ROOT = "artifactory-file-ext";
-
-    private ChecksumsInfo checksumsInfo;
-
-    public FileAdditionalInfo() {
-        super();
-        this.checksumsInfo = new ChecksumsInfo();
-    }
-
-    public FileAdditionalInfo(ChecksumsInfo checksumsInfo) {
-        super();
-        this.checksumsInfo = new ChecksumsInfo(checksumsInfo);
-    }
-
-    public FileAdditionalInfo(FileAdditionalInfo additionalInfo) {
-        super(additionalInfo);
-        this.checksumsInfo = new ChecksumsInfo(additionalInfo.getChecksumsInfo());
-    }
-
-    @Nonnull
-    public ChecksumsInfo getChecksumsInfo() {
-        if (checksumsInfo == null) {
-            this.checksumsInfo = new ChecksumsInfo();
-        }
-        return checksumsInfo;
-    }
-
-    @Override
-    public boolean isIdentical(ItemAdditionalInfo other) {
-        if (!(other instanceof FileAdditionalInfo)) {
-            return false;
-        }
-        if (!super.isIdentical(other)) {
-            return false;
-        }
-
-        FileAdditionalInfo fileExtraInfo = (FileAdditionalInfo) other;
-        if (this.checksumsInfo != null ? !this.checksumsInfo.isIdentical(fileExtraInfo.checksumsInfo)
-                : fileExtraInfo.checksumsInfo != null) {
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public boolean merge(ItemAdditionalInfo additionalInfo) {
-        boolean modified = super.merge(additionalInfo);
-        if (additionalInfo instanceof FileAdditionalInfo) {
-            FileAdditionalInfo fileAdditionalInfo = (FileAdditionalInfo) additionalInfo;
-            if (!fileAdditionalInfo.isIdentical(this)) {
-                ChecksumsInfo otherChecksumInfo = fileAdditionalInfo.getChecksumsInfo();
-                if (!otherChecksumInfo.isEmpty()) {
-                    if (getChecksumsInfo().isEmpty()) {
-                        checksumsInfo = new ChecksumsInfo();
-                        checksumsInfo.setChecksums(otherChecksumInfo.getChecksums());
-                        modified = true;
-                    } else {
-                        for (ChecksumType type : ChecksumType.BASE_CHECKSUM_TYPES) {
-                            ChecksumInfo other = otherChecksumInfo.getChecksumInfo(type);
-                            ChecksumInfo mine = this.checksumsInfo.getChecksumInfo(type);
-                            if (mine == null) {
-                                addChecksumInfo(other);
-                                modified = true;
-                            } else if (!other.isIdentical(mine)) {
-                                modified = true;
-                                this.checksumsInfo.addChecksumInfo(other);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        return modified;
-    }
-
-    public String getSha1() {
-        return checksumsInfo.getSha1();
-    }
-
-    public String getMd5() {
-        return checksumsInfo.getMd5();
-    }
-
-    public Set<ChecksumInfo> getChecksums() {
-        return checksumsInfo.getChecksums();
-    }
-
-    public void createTrustedChecksums() {
-        checksumsInfo.createTrustedChecksums();
-    }
-
-    public void setChecksums(Set<ChecksumInfo> checksums) {
-        checksumsInfo.setChecksums(checksums);
-    }
-
-    public void addChecksumInfo(ChecksumInfo info) {
-        checksumsInfo.addChecksumInfo(info);
-    }
-
-    @Override
-    public String toString() {
-        return "FileAdditionalInfo{" + super.toString() + "}";
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/fs/FileInfoImpl.java b/storage/common/src/main/java/org/artifactory/model/xstream/fs/FileInfoImpl.java
deleted file mode 100644
index 6a4979b..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/fs/FileInfoImpl.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.fs;
-
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumsInfo;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.fs.MutableFileInfo;
-import org.artifactory.fs.MutableItemInfo;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.util.PathUtils;
-
-import javax.annotation.Nonnull;
-import java.util.Set;
-
-/**
- * Basic information about the file. Internally not stored as XML but as node properties
- *
- * @author yoavl
- */
- at XStreamAlias(org.artifactory.fs.FileInfo.ROOT)
-public class FileInfoImpl extends ItemInfoImpl implements InternalFileInfo {
-
-    private long size;
-    private String mimeType;
-    private FileAdditionalInfo additionalInfo;
-
-    public FileInfoImpl(RepoPath repoPath) {
-        super(repoPath);
-        this.size = 0;
-        //Force a mime type
-        setMimeType(null);
-        this.additionalInfo = new FileAdditionalInfo();
-    }
-
-    public FileInfoImpl(InternalFileInfo info) {
-        super(info);
-        this.size = info.getSize();
-        setMimeType(info.getMimeType());
-        this.additionalInfo = new FileAdditionalInfo(info.getAdditionalInfo());
-    }
-
-    /**
-     * Required by xstream
-     *
-     * @param info
-     */
-    protected FileInfoImpl(FileInfoImpl info) {
-        this((InternalFileInfo) info);
-    }
-
-    @Override
-    public boolean isFolder() {
-        return false;
-    }
-
-    @Override
-    public long getSize() {
-        return size;
-    }
-
-    @Override
-    public void setSize(long size) {
-        this.size = size;
-    }
-
-    @Override
-    public long getAge() {
-        return getLastModified() != 0 ? System.currentTimeMillis() - getLastModified() : -1;
-    }
-
-    @Override
-    public String getMimeType() {
-        if (this.mimeType == null) {
-            this.mimeType = NamingUtils.getMimeTypeByPathAsString(getRelPath());
-        }
-        return mimeType;
-    }
-
-    @Override
-    public void setMimeType(String mimeType) {
-        this.mimeType = mimeType;
-    }
-
-    @Override
-    public String getSha1() {
-        return additionalInfo.getSha1();
-    }
-
-    @Override
-    public String getMd5() {
-        return additionalInfo.getMd5();
-    }
-
-    @Override
-    @Nonnull
-    public ChecksumsInfo getChecksumsInfo() {
-        return additionalInfo.getChecksumsInfo();
-    }
-
-    @Override
-    public String toString() {
-        return "FileInfo{" +
-                super.toString() +
-                ", size=" + size +
-                ", mimeType='" + mimeType + '\'' +
-                ", extension=" + additionalInfo +
-                '}';
-    }
-
-    @Override
-    public boolean isIdentical(ItemInfo info) {
-        if (!super.isIdentical(info)) {
-            return false;
-        }
-
-        FileInfoImpl fileInfo = (FileInfoImpl) info;
-
-        if (this.size != fileInfo.size || !PathUtils.safeStringEquals(this.mimeType, fileInfo.mimeType)) {
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    @Deprecated
-    public FileAdditionalInfo getAdditionalInfo() {
-        return additionalInfo;
-    }
-
-    /**
-     * Should not be called by clients - for internal use
-     *
-     * @return
-     */
-    @Override
-    public void setAdditionalInfo(FileAdditionalInfo additionalInfo) {
-        this.additionalInfo = additionalInfo;
-    }
-
-    @Override
-    public Set<ChecksumInfo> getChecksums() {
-        return additionalInfo.getChecksums();
-    }
-
-    @Override
-    public void setChecksums(Set<ChecksumInfo> checksums) {
-        additionalInfo.setChecksums(checksums);
-    }
-
-    @Override
-    public void createTrustedChecksums() {
-        this.additionalInfo.createTrustedChecksums();
-    }
-
-    @Override
-    public void addChecksumInfo(org.artifactory.checksum.ChecksumInfo info) {
-        additionalInfo.addChecksumInfo(info);
-    }
-
-    @Override
-    public boolean merge(MutableItemInfo itemInfo) {
-        boolean modified = super.merge(itemInfo);
-        if (itemInfo instanceof MutableFileInfo) {
-            FileInfo fileInfo = (FileInfo) itemInfo;
-            if (fileInfo.getSize() > 0 && this.size != fileInfo.getSize()) {
-                this.size = fileInfo.getSize();
-                modified = true;
-            }
-            String mt = fileInfo.getMimeType();
-            if (PathUtils.hasText(mt) && !PathUtils.safeStringEquals(mt, mimeType)) {
-                this.mimeType = mt;
-                modified = true;
-            }
-        }
-        return modified;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/fs/FolderAdditionalInfo.java b/storage/common/src/main/java/org/artifactory/model/xstream/fs/FolderAdditionalInfo.java
deleted file mode 100644
index 4ae8b8c..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/fs/FolderAdditionalInfo.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.fs;
-
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-
-/**
- * @author freds
- * @date Oct 12, 2008
- */
- at XStreamAlias(FolderAdditionalInfo.ROOT)
-public class FolderAdditionalInfo extends ItemAdditionalInfo {
-    public static final String ROOT = "artifactory-folder-ext";
-
-    public FolderAdditionalInfo() {
-        super();
-    }
-
-    public FolderAdditionalInfo(FolderAdditionalInfo extension) {
-        super(extension);
-    }
-
-    @Override
-    public String toString() {
-        return "FolderAdditionalInfo{" + super.toString() + "}";
-    }
-
-    @Override
-    public boolean isIdentical(ItemAdditionalInfo additionalInfo) {
-        return additionalInfo instanceof FolderAdditionalInfo && super.isIdentical(additionalInfo);
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/fs/FolderInfoImpl.java b/storage/common/src/main/java/org/artifactory/model/xstream/fs/FolderInfoImpl.java
deleted file mode 100644
index 1adc606..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/fs/FolderInfoImpl.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.fs;
-
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author yoavl
- */
- at XStreamAlias(FolderInfo.ROOT)
-public class FolderInfoImpl extends ItemInfoImpl implements InternalFolderInfo {
-
-    private FolderAdditionalInfo additionalInfo;
-
-    public FolderInfoImpl(RepoPath repoPath) {
-        super(repoPath);
-        additionalInfo = new FolderAdditionalInfo();
-    }
-
-    public FolderInfoImpl(InternalFolderInfo info) {
-        super(info);
-        additionalInfo = new FolderAdditionalInfo(info.getAdditionalInfo());
-    }
-
-    /**
-     * Required by xstream
-     *
-     * @param info
-     */
-    protected FolderInfoImpl(FolderInfoImpl info) {
-        this(((InternalFolderInfo) info));
-    }
-
-    /**
-     * Should not be called by clients - for internal use
-     *
-     * @return
-     */
-    @Override
-    public void setAdditionalInfo(FolderAdditionalInfo additionalInfo) {
-        this.additionalInfo = additionalInfo;
-    }
-
-    @Override
-    public boolean isFolder() {
-        return true;
-    }
-
-    @Override
-    public String toString() {
-        return "FolderInfo{" + super.toString() + ", extension=" + additionalInfo + '}';
-    }
-
-    @Override
-    public boolean isIdentical(org.artifactory.fs.ItemInfo info) {
-        return super.isIdentical(info);
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * @return
-     */
-    @Override
-    @Deprecated
-    public FolderAdditionalInfo getAdditionalInfo() {
-        return additionalInfo;
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/fs/InternalFileInfo.java b/storage/common/src/main/java/org/artifactory/model/xstream/fs/InternalFileInfo.java
deleted file mode 100644
index cc2e649..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/fs/InternalFileInfo.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.fs;
-
-import org.artifactory.fs.MutableFileInfo;
-
-/**
- * @author Yoav Landman
- */
-public interface InternalFileInfo extends InternalItemInfo, MutableFileInfo {
-
-    void setAdditionalInfo(FileAdditionalInfo additionalInfo);
-
-    @Override
-    FileAdditionalInfo getAdditionalInfo();
-}
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/fs/InternalFolderInfo.java b/storage/common/src/main/java/org/artifactory/model/xstream/fs/InternalFolderInfo.java
deleted file mode 100644
index 4307847..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/fs/InternalFolderInfo.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.fs;
-
-import org.artifactory.fs.MutableFolderInfo;
-
-/**
- * @author Yoav Landman
- */
-public interface InternalFolderInfo extends InternalItemInfo, MutableFolderInfo {
-    void setAdditionalInfo(FolderAdditionalInfo additionalInfo);
-
-    @Override
-    FolderAdditionalInfo getAdditionalInfo();
-}
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/fs/InternalItemInfo.java b/storage/common/src/main/java/org/artifactory/model/xstream/fs/InternalItemInfo.java
deleted file mode 100644
index 63b0de4..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/fs/InternalItemInfo.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.fs;
-
-import org.artifactory.fs.MutableItemInfo;
-
-/**
- * @author Yoav Landman
- */
-public interface InternalItemInfo extends MutableItemInfo {
-
-    /**
-     * Should not be called by clients - always use direct accessors
-     *
-     * @return
-     */
-    ItemAdditionalInfo getAdditionalInfo();
-
-}
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/fs/ItemAdditionalInfo.java b/storage/common/src/main/java/org/artifactory/model/xstream/fs/ItemAdditionalInfo.java
deleted file mode 100644
index 72d77a7..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/fs/ItemAdditionalInfo.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.fs;
-
-import org.artifactory.util.PathUtils;
-
-import java.io.Serializable;
-
-/**
- * @author freds
- * @date Oct 12, 2008
- */
-public class ItemAdditionalInfo implements Serializable {
-    private String createdBy;
-    private String modifiedBy;
-    /**
-     * The last time the (cached) resource has been updated from it's remote location.
-     */
-    private long lastUpdated;
-
-    public ItemAdditionalInfo() {
-        this.lastUpdated = System.currentTimeMillis();
-    }
-
-    public ItemAdditionalInfo(ItemAdditionalInfo extension) {
-        this.createdBy = extension.createdBy;
-        this.modifiedBy = extension.modifiedBy;
-        this.lastUpdated = extension.lastUpdated;
-    }
-
-    public String getCreatedBy() {
-        return createdBy;
-    }
-
-    public void setCreatedBy(String createdBy) {
-        this.createdBy = createdBy;
-    }
-
-    public String getModifiedBy() {
-        return modifiedBy;
-    }
-
-    public void setModifiedBy(String modifiedBy) {
-        this.modifiedBy = modifiedBy;
-    }
-
-    public long getLastUpdated() {
-        return lastUpdated;
-    }
-
-    public void setLastUpdated(long lastUpdated) {
-        this.lastUpdated = lastUpdated;
-    }
-
-    @Override
-    public String toString() {
-        return "ItemAdditionalInfo{" +
-                "createdBy='" + createdBy + '\'' +
-                ", modifiedBy='" + modifiedBy + '\'' +
-                ", lastUpdated=" + lastUpdated +
-                '}';
-    }
-
-    public boolean isIdentical(ItemAdditionalInfo additionalInfo) {
-        return this.lastUpdated == additionalInfo.lastUpdated &&
-                PathUtils.safeStringEquals(this.modifiedBy, additionalInfo.modifiedBy) &&
-                PathUtils.safeStringEquals(this.createdBy, additionalInfo.createdBy);
-    }
-
-    public boolean merge(ItemAdditionalInfo additionalInfo) {
-        if (this == additionalInfo || this.isIdentical(additionalInfo)) {
-            // already the same
-            return false;
-        }
-        boolean modified = false;
-        if (additionalInfo.lastUpdated > 0) {
-            this.lastUpdated = additionalInfo.lastUpdated;
-            modified = true;
-        }
-        if (PathUtils.hasText(additionalInfo.modifiedBy)) {
-            this.modifiedBy = additionalInfo.modifiedBy;
-            modified = true;
-        }
-        if (PathUtils.hasText(additionalInfo.createdBy)) {
-            this.createdBy = additionalInfo.createdBy;
-            modified = true;
-        }
-        return modified;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/fs/ItemInfoImpl.java b/storage/common/src/main/java/org/artifactory/model/xstream/fs/ItemInfoImpl.java
deleted file mode 100644
index 13b54d6..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/fs/ItemInfoImpl.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.fs;
-
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.fs.MutableItemInfo;
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author yoavl
- */
-public abstract class ItemInfoImpl implements InternalItemInfo {
-
-    private final RepoPath repoPath;
-    private final String name;
-    private long created;
-    protected long lastModified;
-
-    protected ItemInfoImpl(RepoPath repoPath) {
-        if (repoPath == null) {
-            throw new IllegalArgumentException("RepoPath cannot be null");
-        }
-        this.repoPath = repoPath;
-        this.name = repoPath.getName();
-        this.created = System.currentTimeMillis();
-        this.lastModified = this.created;
-    }
-
-    protected ItemInfoImpl(org.artifactory.fs.ItemInfo info) {
-        this(info.getRepoPath());
-        this.created = info.getCreated();
-        setLastModified(info.getLastModified());
-    }
-
-    protected ItemInfoImpl(ItemInfo info, RepoPath repoPath) {
-        this(repoPath);
-        this.created = info.getCreated();
-        this.lastModified = info.getLastModified();
-    }
-
-    @Override
-    public RepoPath getRepoPath() {
-        return repoPath;
-    }
-
-    @Override
-    public String getName() {
-        return name;
-    }
-
-    @Override
-    public String getRepoKey() {
-        return repoPath.getRepoKey();
-    }
-
-    /**
-     * @return The path part of the repo path of this item (ie, path without the repository key).
-     */
-    @Override
-    public String getRelPath() {
-        return repoPath.getPath();
-    }
-
-    @Override
-    public long getCreated() {
-        return created;
-    }
-
-    @Override
-    public void setCreated(long created) {
-        this.created = created;
-    }
-
-    @Override
-    public long getLastModified() {
-        return lastModified;
-    }
-
-    @Override
-    public final void setLastModified(long lastModified) {
-        if (lastModified > 0L) {
-            this.lastModified = lastModified;
-        } else {
-            this.lastModified = this.created;
-        }
-    }
-
-    @Override
-    public String getModifiedBy() {
-        return getAdditionalInfo().getModifiedBy();
-    }
-
-    @Override
-    public void setModifiedBy(String name) {
-        getAdditionalInfo().setModifiedBy(name);
-    }
-
-    @Override
-    public String getCreatedBy() {
-        return getAdditionalInfo().getCreatedBy();
-    }
-
-    @Override
-    public void setCreatedBy(String name) {
-        getAdditionalInfo().setCreatedBy(name);
-    }
-
-    @Override
-    public long getLastUpdated() {
-        return getAdditionalInfo().getLastUpdated();
-    }
-
-    @Override
-    public void setLastUpdated(long lastUpdated) {
-        getAdditionalInfo().setLastUpdated(lastUpdated);
-    }
-
-    @Override
-    public boolean isIdentical(ItemInfo info) {
-        return this.getClass() == info.getClass() &&
-                this.lastModified == info.getLastModified() &&
-                this.created == info.getCreated() &&
-                this.repoPath.equals(info.getRepoPath()) &&
-                this.name.equals(info.getName()) &&
-                this.getAdditionalInfo().isIdentical(((InternalItemInfo) info).getAdditionalInfo());
-    }
-
-    @Override
-    public boolean merge(MutableItemInfo itemInfo) {
-        if (this == itemInfo || this.isIdentical(itemInfo)) {
-            // They are equal nothing to do
-            return false;
-        }
-        boolean modified = false;
-        if (itemInfo.getLastModified() > 0) {
-            this.lastModified = itemInfo.getLastModified();
-            modified = true;
-        }
-        if (itemInfo.getCreated() > 0 && itemInfo.getCreated() < getCreated()) {
-            this.created = itemInfo.getCreated();
-            modified = true;
-        }
-        modified |= this.getAdditionalInfo().merge(((InternalItemInfo) itemInfo).getAdditionalInfo());
-        return modified;
-    }
-
-    @Override
-    public int compareTo(ItemInfo item) {
-        return getName().compareTo(item.getName());
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        ItemInfoImpl info = (ItemInfoImpl) o;
-        return repoPath.equals(info.repoPath);
-    }
-
-    @Override
-    public int hashCode() {
-        return repoPath.hashCode();
-    }
-
-    @Override
-    public String toString() {
-        return "ItemInfo{" +
-                "repoPath=" + repoPath +
-                ", created=" + created +
-                ", lastModified=" + lastModified +
-                '}';
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/fs/MetadataEntry.java b/storage/common/src/main/java/org/artifactory/model/xstream/fs/MetadataEntry.java
deleted file mode 100644
index e6d629c..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/fs/MetadataEntry.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.fs;
-
-import org.artifactory.fs.MetadataEntryInfo;
-
-/**
- * @author freds
- * @date Nov 11, 2008
- */
-public class MetadataEntry implements MetadataEntryInfo {
-    private final String metadataName;
-    private final String xmlContent;
-
-    public MetadataEntry(String metadataName, String xmlContent) {
-        if (metadataName == null) {
-            throw new IllegalArgumentException("Metadata name cannot be null!");
-        }
-        this.metadataName = metadataName;
-        this.xmlContent = xmlContent;
-    }
-
-    @Override
-    public String getMetadataName() {
-        return metadataName;
-    }
-
-    @Override
-    public String getXmlContent() {
-        return xmlContent;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/fs/MetadataInfoImpl.java b/storage/common/src/main/java/org/artifactory/model/xstream/fs/MetadataInfoImpl.java
deleted file mode 100644
index d9cea7d..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/fs/MetadataInfoImpl.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.fs;
-
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumsInfo;
-import org.artifactory.md.MetadataInfo;
-import org.artifactory.md.MutableMetadataInfo;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Set;
-
-/**
- * @author yoavl
- */
-public class MetadataInfoImpl implements MutableMetadataInfo {
-    private static final Logger log = LoggerFactory.getLogger(MetadataInfoImpl.class);
-
-    private final RepoPath repoPath;
-    private String name;
-    private long created;
-    private long lastModified;
-    private String lastModifiedBy;
-    private long size;
-    private ChecksumsInfo checksumsInfo;
-
-    public MetadataInfoImpl(RepoPath parentRepoPath, String metadataName) {
-        this.repoPath = getMetadataRepoPath(parentRepoPath, metadataName);
-        this.name = metadataName;
-        this.checksumsInfo = new ChecksumsInfo();
-    }
-
-    public MetadataInfoImpl(RepoPath repoPath) {
-        this.repoPath = repoPath;
-        this.name = NamingUtils.getMetadataName(repoPath.getPath());
-        this.checksumsInfo = new ChecksumsInfo();
-    }
-
-    public MetadataInfoImpl(MetadataInfo copy) {
-        this.repoPath = copy.getRepoPath();
-        this.name = copy.getName();
-        this.created = copy.getCreated();
-        this.lastModified = copy.getLastModified();
-        this.lastModifiedBy = copy.getLastModifiedBy();
-        this.size = copy.getSize();
-        this.checksumsInfo = new ChecksumsInfo(copy.getChecksumsInfo());
-    }
-
-    @Override
-    public RepoPath getRepoPath() {
-        return repoPath;
-    }
-
-    @Override
-    public ChecksumsInfo getChecksumsInfo() {
-        return checksumsInfo;
-    }
-
-    @Override
-    public String getName() {
-        return name;
-    }
-
-    @Override
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    @Override
-    public long getCreated() {
-        return created;
-    }
-
-    @Override
-    public void setCreated(long created) {
-        this.created = created;
-    }
-
-    @Override
-    public long getLastModified() {
-        return lastModified;
-    }
-
-    @Override
-    public void setLastModified(long lastModified) {
-        this.lastModified = lastModified;
-    }
-
-    @Override
-    public String getLastModifiedBy() {
-        return lastModifiedBy;
-    }
-
-    @Override
-    public void setLastModifiedBy(String lastModifiedBy) {
-        this.lastModifiedBy = lastModifiedBy;
-    }
-
-    @Override
-    public String getSha1() {
-        return checksumsInfo.getSha1();
-    }
-
-    @Override
-    public String getMd5() {
-        return checksumsInfo.getMd5();
-    }
-
-    @Override
-    public Set<ChecksumInfo> getChecksums() {
-        return checksumsInfo.getChecksums();
-    }
-
-    @Override
-    public void setChecksums(Set<ChecksumInfo> checksums) {
-        checksumsInfo.setChecksums(checksums);
-    }
-
-    @Override
-    public long getSize() {
-        return size;
-    }
-
-    @Override
-    public void setSize(long size) {
-        this.size = size;
-    }
-
-    @Override
-    public String toString() {
-        return "MetadataInfo{repoPath=" + repoPath + '}';
-    }
-
-    private RepoPath getMetadataRepoPath(RepoPath parentRepoPath, String metadataName) {
-        String path = parentRepoPath.getPath();
-        boolean alreadyMetadataPath = NamingUtils.isMetadata(path);
-        if (alreadyMetadataPath) {
-            log.warn("Path {} is already a metadata path.", path);
-        }
-        //TODO: [by yl] Evaluate the impact of normalizing the path to use the standard metadata format (a.jar#mdname)
-
-        return InternalRepoPathFactory.create(parentRepoPath.getRepoKey(),
-                alreadyMetadataPath ? path : NamingUtils.getMetadataPath(path, metadataName));
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/fs/PropertiesImpl.java b/storage/common/src/main/java/org/artifactory/model/xstream/fs/PropertiesImpl.java
deleted file mode 100644
index 7daa3b4..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/fs/PropertiesImpl.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.fs;
-
-import com.google.common.collect.*;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.md.Properties;
-import org.artifactory.md.PropertiesInfo;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.*;
-
-/**
- * A map of stringified keys and values, used for storing arbitrary key-value metadata on repository items.
- *
- * @author Yoav Landman
- */
- at XStreamAlias(Properties.ROOT)
-public class PropertiesImpl implements Properties {
-    private static final Logger log = LoggerFactory.getLogger(PropertiesImpl.class);
-
-    private final SetMultimap<String, String> props;
-
-    public PropertiesImpl() {
-        props = LinkedHashMultimap.create();
-    }
-
-    public PropertiesImpl(PropertiesInfo m) {
-        //props = LinkedHashMultimap.create( m.props);
-        props = LinkedHashMultimap.create();
-        Set<Map.Entry<String, String>> entries = m.entries();
-        for (Map.Entry<String, String> entry : entries) {
-            props.put(entry.getKey(), entry.getValue());
-        }
-    }
-
-    @Override
-    public int size() {
-        return props.size();
-    }
-
-    @Override
-    @Nullable
-    public Set<String> get(@Nonnull String key) {
-        return props.get(key);
-    }
-
-    @Override
-    @Nullable
-    public String getFirst(@Nonnull String key) {
-        Set<String> propertyValues = props.get(key);
-        if (propertyValues != null) {
-            Iterator<String> iterator = propertyValues.iterator();
-            if (iterator.hasNext()) {
-                return iterator.next();
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public boolean putAll(@Nonnull String key, Iterable<? extends String> values) {
-        return props.putAll(key, values);
-    }
-
-    @Override
-    public boolean putAll(@Nullable String key, String[] values) {
-        Set<String> valuesSet = new HashSet<String>();
-        Collections.addAll(valuesSet, values);
-        return props.putAll(key, valuesSet);
-    }
-
-    @Override
-    public boolean putAll(Multimap<? extends String, ? extends String> multimap) {
-        return props.putAll(multimap);
-    }
-
-    @Override
-    public Set<? extends String> replaceValues(@Nonnull String key, Iterable<? extends String> values) {
-        return  props.replaceValues(key, values);
-    }
-
-    @Override
-    public void clear() {
-        props.clear();
-    }
-
-    @Override
-    public Set<String> removeAll(@Nonnull Object key) {
-        return props.removeAll(key);
-    }
-
-    @Override
-    public boolean put(String key, String value) {
-        return props.put(key, value);
-    }
-
-    @Override
-    public Collection<String> values() {
-        return props.values();
-    }
-
-    @Override
-    public Set<Map.Entry<String, String>> entries() {
-        return props.entries();
-    }
-
-    @Override
-    public Multiset<String> keys() {
-        return props.keys();
-    }
-
-    @Override
-    public Set<String> keySet() {
-        return props.keySet();
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return props.isEmpty();
-    }
-
-    @Override
-    public boolean hasMandatoryProperty() {
-        for (String qPropKey : props.keySet()) {
-            if (qPropKey != null && qPropKey.endsWith(MANDATORY_SUFFIX)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public boolean containsKey(String key) {
-        return props.containsKey(key);
-    }
-
-    @Override
-    public MatchResult matchQuery(Properties queryProperties) {
-        if (queryProperties == null) {
-            return MatchResult.NO_MATCH;
-        }
-        for (String qPropKey : queryProperties.keySet()) {
-            //Hack - need to model query properties together with their control flags
-            boolean mandatory = false;
-            String propKey = qPropKey;
-            if (qPropKey != null && qPropKey.endsWith(MANDATORY_SUFFIX)) {
-                mandatory = true;
-                propKey = qPropKey.substring(0, qPropKey.length() - MANDATORY_SUFFIX.length());
-            }
-
-            //If the key given from the query must exist
-            if (mandatory) {
-
-                //If the current properties contain the given key
-                if (containsKey(propKey)) {
-
-                    Set<String> queryPropertyValues = clearBlankAndReturnPropertyValues(queryProperties.get(qPropKey));
-
-                    //Only check the current property values if the request property was given with values
-                    if (!queryPropertyValues.isEmpty()) {
-
-                        //The given query properties have a value, so we should try to match
-                        Set<String> currentPropertyValue = clearBlankAndReturnPropertyValues(get(propKey));
-                        if (!queryPropertyValues.equals(currentPropertyValue)) {
-
-                            //The properties don't match
-                            return MatchResult.CONFLICT;
-                        }
-                    }
-                } else {
-                    //Conflict since the key given from the properties is mandatory and doesn't exist in the current properties
-                    return MatchResult.CONFLICT;
-                }
-            } else {
-
-                Set<String> queryPropertyValues = clearBlankAndReturnPropertyValues(queryProperties.get(qPropKey));
-
-                if (!queryPropertyValues.isEmpty()) {
-                    //If the current properties contain the given query property key
-                    if (containsKey(propKey)) {
-
-                        //The given query properties have a value, so we should try to match
-                        Set<String> currentPropertyValue = clearBlankAndReturnPropertyValues(get(propKey));
-
-                        if (!queryPropertyValues.equals(currentPropertyValue)) {
-
-                            //The properties conflict
-                            return MatchResult.CONFLICT;
-                        }
-                    } else {
-                        //The current property doesn't have the given query property, so it does not conflict either
-                        return MatchResult.NO_MATCH;
-                    }
-                }
-            }
-        }
-        return MatchResult.MATCH;
-    }
-
-    @Override
-    public boolean equals(@Nullable Object that) {
-        if (that instanceof PropertiesImpl) {
-            PropertiesImpl otherProps = (PropertiesImpl) that;
-            return this.props.equals(otherProps.props);
-        } else {
-            return false;
-        }
-    }
-
-    @Override
-    public int hashCode() {
-        return props.hashCode();
-    }
-
-    @Override
-    public String toString() {
-        return props.toString();
-    }
-
-    /**
-     * Returns a copy of the given property value set after clearing any blank\null values it might contain
-     *
-     * @param propertyValues Property value set. Can be null
-     * @return Copy of given set without the null\blank values or an Empty set if given a null set
-     */
-    private Set<String> clearBlankAndReturnPropertyValues(Set<String> propertyValues) {
-        Set<String> clearedPropertyValues = Sets.newHashSet();
-        if (propertyValues == null) {
-            return clearedPropertyValues;
-        }
-
-        for (String propertyValue : propertyValues) {
-            if (StringUtils.isNotBlank(propertyValue)) {
-                clearedPropertyValues.add(propertyValue);
-            }
-        }
-
-        return clearedPropertyValues;
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/fs/StatsImpl.java b/storage/common/src/main/java/org/artifactory/model/xstream/fs/StatsImpl.java
deleted file mode 100644
index e6e11c5..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/fs/StatsImpl.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.fs;
-
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import org.artifactory.fs.MutableStatsInfo;
-import org.artifactory.fs.StatsInfo;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author Yoav Landman
- */
- at XStreamAlias(StatsImpl.ROOT)
-public class StatsImpl implements MutableStatsInfo {
-
-    private long downloadCount;
-    private long lastDownloaded;
-    private String lastDownloadedBy;
-
-    private long remoteDownloadCount;
-    private long remoteLastDownloaded;
-    private String remoteLastDownloadedBy;
-
-    private String repoPath;
-    private String path;
-    private String origin;
-
-    public StatsImpl() {
-    }
-
-    public StatsImpl(StatsInfo statsInfo) {
-        if (statsInfo == null) return;
-
-        this.downloadCount = statsInfo.getDownloadCount();
-        this.lastDownloaded = statsInfo.getLastDownloaded();
-        this.lastDownloadedBy = statsInfo.getLastDownloadedBy();
-
-        this.remoteDownloadCount = statsInfo.getRemoteDownloadCount();
-        this.remoteLastDownloaded = statsInfo.getRemoteLastDownloaded();
-        this.remoteLastDownloadedBy = statsInfo.getRemoteLastDownloadedBy();
-
-        this.path = statsInfo.getPath();
-        this.origin = statsInfo.getOrigin();
-    }
-
-    @Override
-    public long getDownloadCount() {
-        return downloadCount;
-    }
-
-    @Override
-    public void setDownloadCount(long downloadCount) {
-        this.downloadCount = downloadCount;
-    }
-
-    @Override
-    public long getLastDownloaded() {
-        return lastDownloaded;
-    }
-
-    @Override
-    public void setLastDownloaded(long lastDownloaded) {
-        this.lastDownloaded = lastDownloaded;
-    }
-
-    @Override
-    public String getLastDownloadedBy() {
-        return lastDownloadedBy;
-    }
-
-    @Override
-    public void setLastDownloadedBy(String lastDownloadedBy) {
-        this.lastDownloadedBy = lastDownloadedBy;
-    }
-
-    @Override
-    public void setRemoteDownloadCount(long remoteDownloadCount) {
-        this.remoteDownloadCount = remoteDownloadCount;
-    }
-
-    @Override
-    public void setRemoteLastDownloaded(long remoteLastDownloaded) {
-        this.remoteLastDownloaded = remoteLastDownloaded;
-    }
-
-    @Override
-    public void setRemoteLastDownloadedBy(String remoteLastDownloadedBy) {
-        this.remoteLastDownloadedBy = remoteLastDownloadedBy;
-    }
-
-    public String getRepoPath() {
-        return repoPath;
-    }
-
-    public void setRepoPath(String repoPath) {
-        this.repoPath = repoPath;
-    }
-
-    @Override
-    public String getPath() {
-        return path;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    public void setOrigin(String origin) {
-        this.origin = origin;
-    }
-
-    @Override
-    public String getOrigin() {
-        return origin;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        StatsImpl stats = (StatsImpl) o;
-
-        if (downloadCount != stats.downloadCount) {
-            return false;
-        }
-        if (lastDownloaded != stats.lastDownloaded) {
-            return false;
-        }
-        if (lastDownloadedBy != null ? !lastDownloadedBy.equals(stats.lastDownloadedBy) :
-                stats.lastDownloadedBy != null) {
-            return false;
-        }
-
-        if (remoteDownloadCount != stats.remoteDownloadCount) {
-            return false;
-        }
-        if (remoteLastDownloaded != stats.remoteLastDownloaded) {
-            return false;
-        }
-        if (remoteLastDownloadedBy != null ? !remoteLastDownloadedBy.equals(stats.remoteLastDownloadedBy) :
-                stats.remoteLastDownloadedBy != null) {
-            return false;
-        }
-
-
-        if (repoPath != null ? !repoPath.equals(stats.repoPath) :
-                stats.repoPath != null) {
-            return false;
-        }
-        if (path != null ? !path.equals(stats.path) :
-                stats.path != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-
-        int result = (int) (downloadCount ^ (downloadCount >>> 32));
-        result = 31 * result + (int) (lastDownloaded ^ (lastDownloaded >>> 32));
-        result = 31 * result + (lastDownloadedBy != null ? lastDownloadedBy.hashCode() : 0);
-
-        result = 31 * result + (int) (remoteDownloadCount ^ (remoteDownloadCount >>> 32));
-        result = 31 * result + (int) (remoteLastDownloaded ^ (remoteLastDownloaded >>> 32));
-        result = 31 * result + (remoteLastDownloadedBy != null ? remoteLastDownloadedBy.hashCode() : 0);
-
-        result = 31 * result + (repoPath != null ? repoPath.hashCode() : 0);
-        result = 31 * result + (path != null ? path.hashCode() : 0);
-
-        return result;
-    }
-
-    @Override
-    public long getRemoteDownloadCount() {
-        return remoteDownloadCount;
-    }
-
-    @Override
-    public long getRemoteLastDownloaded() {
-        return remoteLastDownloaded;
-    }
-
-    @Override
-    public String getRemoteLastDownloadedBy() {
-        return remoteLastDownloadedBy;
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/fs/WatcherImpl.java b/storage/common/src/main/java/org/artifactory/model/xstream/fs/WatcherImpl.java
deleted file mode 100644
index 72172de..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/fs/WatcherImpl.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.fs;
-
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import org.artifactory.fs.MutableWatcherInfo;
-import org.artifactory.fs.WatcherInfo;
-
-import java.util.Date;
-
-/**
- * Item watcher metadata object
- *
- * @author Noam Tenne
- */
- at XStreamAlias(WatcherInfo.ROOT)
-public class WatcherImpl implements Comparable, MutableWatcherInfo {
-
-    private String username;
-    private long watchingSinceTime;
-
-    /**
-     * Default constructor
-     *
-     * @param username          Username of watcher
-     * @param watchingSinceTime The time the user has begun watching the item
-     */
-    public WatcherImpl(String username, long watchingSinceTime) {
-        this.username = username;
-        this.watchingSinceTime = watchingSinceTime;
-    }
-
-    /**
-     * Copy constructor
-     *
-     * @param watcher Watcher object to copy
-     */
-    public WatcherImpl(WatcherInfo watcher) {
-        username = watcher.getUsername();
-        watchingSinceTime = watcher.getWatchingSinceTime();
-    }
-
-    /**
-     * Returns the user name
-     *
-     * @return Username
-     */
-    @Override
-    public String getUsername() {
-        return username;
-    }
-
-    /**
-     * Sets the username
-     *
-     * @param username Username
-     */
-    @Override
-    public void setUsername(String username) {
-        this.username = username;
-    }
-
-    /**
-     * Returns the time the user has began watching the item
-     *
-     * @return Watching since time
-     */
-    @Override
-    public long getWatchingSinceTime() {
-        return watchingSinceTime;
-    }
-
-    /**
-     * Returns the date the user has began watching the item
-     *
-     * @return Watching since date
-     */
-    @Override
-    public Date getWatchingSinceDate() {
-        return new Date(watchingSinceTime);
-    }
-
-    /**
-     * Sets the time the user has began watching the item
-     *
-     * @param watchingSinceTime Watching since time
-     */
-    @Override
-    public void setWatchingSinceTime(long watchingSinceTime) {
-        this.watchingSinceTime = watchingSinceTime;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof WatcherInfo)) {
-            return false;
-        }
-
-        WatcherImpl watcher = (WatcherImpl) o;
-
-        if (watchingSinceTime != watcher.watchingSinceTime) {
-            return false;
-        }
-        if (username != null ? !username.equals(watcher.username) : watcher.username != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = username != null ? username.hashCode() : 0;
-        result = 31 * result + (int) (watchingSinceTime ^ (watchingSinceTime >>> 32));
-        return result;
-    }
-
-    @Override
-    public int compareTo(Object o) {
-        if (o instanceof WatcherInfo) {
-            WatcherImpl other = (WatcherImpl) o;
-            return (watchingSinceTime < other.watchingSinceTime ? -1 :
-                    (watchingSinceTime == other.watchingSinceTime ? 0 : 1));
-        }
-        return 0;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/fs/WatchersImpl.java b/storage/common/src/main/java/org/artifactory/model/xstream/fs/WatchersImpl.java
deleted file mode 100644
index 798a3ae..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/fs/WatchersImpl.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.fs;
-
-import com.google.common.collect.ImmutableSet;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import org.artifactory.fs.MutableWatchersInfo;
-import org.artifactory.fs.WatcherInfo;
-import org.artifactory.fs.WatchersInfo;
-import org.artifactory.repo.RepoPath;
-
-import java.util.LinkedHashSet;
-import java.util.Set;
-import java.util.TreeSet;
-
-/**
- * Item watchers metadata object
- *
- * @author Noam Tenne
- */
- at XStreamAlias(WatchersInfo.ROOT)
-public class WatchersImpl implements MutableWatchersInfo {
-
-    /**
-     * @deprecated Repo path is not needed and shouldn't be saved within the metadata. Removing this field requires
-     *             creating a converter that will process "watch" type metadata on each item that annotates it.
-     */
-    @Deprecated
-    private RepoPath repoPath;
-
-    /**
-     * Watchers list
-     */
-    private final Set<WatcherImpl> watchers;
-
-    /**
-     * Default constructor for xstream
-     */
-    public WatchersImpl() {
-        watchers = new LinkedHashSet<>();
-    }
-
-    /**
-     * Copy constructor
-     *
-     * @param watchersObject Object to copy
-     */
-    public WatchersImpl(WatchersInfo copy) {
-        watchers = new LinkedHashSet<WatcherImpl>((Set) copy.getWatchers());
-    }
-
-    /**
-     * Returns the set of watchers
-     *
-     * @return A set object of watchers
-     */
-    @Override
-    public Set<WatcherInfo> getWatchers() {
-        return ImmutableSet.<WatcherInfo>copyOf(watchers);
-    }
-
-    /**
-     * Returns the given user's watcher object (if watching)
-     *
-     * @param username Username of watcher to search
-     * @return Watcher object if give user is a watcher. Null if not
-     */
-    @Override
-    public WatcherInfo getWatcher(String username) {
-        for (WatcherImpl watcher : watchers) {
-            if (watcher.getUsername().equals(username)) {
-                return watcher;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Check is the given user is listed as a watcher for this object
-     *
-     * @param username Name of user to check
-     * @return True if the given user is watching. False if not
-     */
-    @Override
-    public boolean isUserWatching(String username) {
-        for (WatcherImpl watcher : watchers) {
-            if (watcher.getUsername().equals(username)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Adds the given watcher
-     *
-     * @param watcher Watcher object to add
-     */
-    @Override
-    public void addWatcher(WatcherInfo watcher) {
-        if (!isUserWatching(watcher.getUsername())) {
-            watchers.add(new WatcherImpl(watcher));
-        }
-    }
-
-    /**
-     * Removes the given username from the watcher list
-     *
-     * @param username Name of user to remove
-     * @return True if the user has been moved. False if not
-     */
-    @Override
-    public void removeWatcher(String username) {
-        Set<WatcherInfo> watchersCopy = new TreeSet<WatcherInfo>(watchers);
-        for (WatcherInfo watcher : watchersCopy) {
-            if (watcher.getUsername().equals(username)) {
-                watchers.remove(watcher);
-            }
-        }
-    }
-
-    /**
-     * Indicates if the watcher set is empty
-     *
-     * @return True if the set is empty, False if not
-     */
-    @Override
-    public boolean isEmpty() {
-        return watchers.isEmpty();
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof WatchersInfo)) {
-            return false;
-        }
-
-        WatchersImpl watchers1 = (WatchersImpl) o;
-
-        if (watchers != null ? !watchers.equals(watchers1.watchers) : watchers1.watchers != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return watchers != null ? watchers.hashCode() : 0;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/fs/ZipEntriesTree.java b/storage/common/src/main/java/org/artifactory/model/xstream/fs/ZipEntriesTree.java
deleted file mode 100644
index 1b59af0..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/fs/ZipEntriesTree.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.fs;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.fs.ZipEntryInfo;
-import org.artifactory.util.Tree;
-
-/**
- * A tree representation of a zip file content.
- *
- * @author Yossi Shaul
- */
-public class ZipEntriesTree implements Tree<ZipEntryInfo> {
-
-    ZipTreeNode root;
-
-    public ZipEntriesTree() {
-        this.root = new ZipTreeNode("", true);
-    }
-
-    @Override
-    public ZipTreeNode getRoot() {
-        return root;
-    }
-
-    @Override
-    public ZipTreeNode insert(ZipEntryInfo entry) {
-        String[] pathElements = entry.getPath().split("/");
-        ZipTreeNode parent = root;
-        // get or create parent nodes
-        for (int i = 0; i < pathElements.length - 1; i++) {
-            parent = getOrCreateNode(parent, pathElements[i], true);
-        }
-        // create node for current entry
-        ZipTreeNode entryNode = getOrCreateNode(parent, pathElements[pathElements.length - 1], entry.isDirectory());
-        entryNode.setZipEntry(entry);
-        return parent;
-    }
-
-    private ZipTreeNode getOrCreateNode(ZipTreeNode parent, String pathElement, boolean directory) {
-        ZipTreeNode child = parent.getChild(pathElement);
-        if (child == null) {
-            String path = StringUtils.isNotBlank(parent.getPath()) ? parent.getPath() + "/" + pathElement : pathElement;
-            child = new ZipTreeNode(path, directory);
-            parent.addChild(child);
-        }
-        return child;
-    }
-
-}
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/fs/ZipEntryImpl.java b/storage/common/src/main/java/org/artifactory/model/xstream/fs/ZipEntryImpl.java
deleted file mode 100644
index 3eb7921..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/fs/ZipEntryImpl.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.fs;
-
-import org.artifactory.fs.ZipEntryInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.util.PathUtils;
-
-import javax.annotation.Nonnull;
-import java.io.Serializable;
-import java.util.zip.ZipEntry;
-
-/**
- * Simple serializable object with zip entry information.
- *
- * @author Yossi Shaul
- */
-public class ZipEntryImpl implements Serializable, ZipEntryInfo {
-    final private String path;    // full path of the entry
-    final private String name;    // entry name
-    final private long time;    // modification time (in DOS time)
-    final private long crc;        // crc-32 of entry data
-    final private long size;    // uncompressed size of entry data
-    final private long compressedSize;   // compressed size of entry data
-    final private String comment;        // optional comment string for entry
-    final private boolean directory;    // is this entry a directory
-
-    /**
-     * Builds a directory entry with just a name (some jar files doesn't contain ZipEntry for directories).
-     *
-     * @param path      The full path of the entry
-     * @param directory
-     */
-    public ZipEntryImpl(@Nonnull String path, boolean directory) {
-        this.path = path;
-        this.name = PathUtils.getFileName(path);
-        this.time = 0;
-        this.size = 0;
-        this.compressedSize = 0;
-        this.comment = null;
-        this.crc = 0;
-        this.directory = directory;
-    }
-
-    public ZipEntryImpl(@Nonnull ZipEntry... entries) {
-        if (entries.length == 0) {
-            throw new IllegalArgumentException("Cannot create ZipEntryInfo without a ZipEntry!");
-        }
-
-        ZipEntry entry = entries[entries.length - 1];
-
-        if (entries.length > 1) {
-            StringBuilder fullPath = new StringBuilder();
-            for (int i = 0; i < entries.length; i++) {
-                fullPath.append(entries[i].getName());
-                if (i != entries.length - 1) {
-                    fullPath.append(RepoPath.ARCHIVE_SEP).append('/');
-                }
-            }
-            this.path = fullPath.toString();
-        } else {
-            this.path = entry.getName();
-        }
-        this.name = PathUtils.getFileName(entry.getName());
-        this.time = entry.getTime();
-        this.size = entry.getSize();
-        this.compressedSize = entry.getCompressedSize();
-        this.comment = entry.getComment();
-        this.crc = entry.getCrc();
-        this.directory = entry.isDirectory();
-    }
-
-    @Override
-    public String getPath() {
-        return path;
-    }
-
-    @Override
-    public String getName() {
-        return name;
-    }
-
-    @Override
-    public long getTime() {
-        return time;
-    }
-
-    @Override
-    public long getCrc() {
-        return crc;
-    }
-
-    @Override
-    public long getSize() {
-        return size;
-    }
-
-    @Override
-    public long getCompressedSize() {
-        return compressedSize;
-    }
-
-    @Override
-    public String getComment() {
-        return comment;
-    }
-
-    @Override
-    public boolean isDirectory() {
-        return directory;
-    }
-
-    @Override
-    public String toString() {
-        return path;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        ZipEntryImpl zipEntry = (ZipEntryImpl) o;
-
-        if (directory != zipEntry.directory) {
-            return false;
-        }
-        if (!path.equals(zipEntry.path)) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = path.hashCode();
-        result = 31 * result + (directory ? 1 : 0);
-        return result;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/fs/ZipEntryResourceImpl.java b/storage/common/src/main/java/org/artifactory/model/xstream/fs/ZipEntryResourceImpl.java
deleted file mode 100644
index 54716e3..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/fs/ZipEntryResourceImpl.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.fs;
-
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumsInfo;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.ZipEntryInfo;
-import org.artifactory.fs.ZipEntryResourceInfo;
-import org.artifactory.mime.MimeType;
-import org.artifactory.mime.NamingUtils;
-
-import javax.annotation.Nonnull;
-import java.util.Set;
-
-/**
- * Holds zip entry info for consumption by the download process. This resource exists inside a zip file.
- *
- * @author Yossi Shaul
- */
-public class ZipEntryResourceImpl extends ItemInfoImpl implements ZipEntryResourceInfo {
-    /**
-     * The file info concerning the zip file that contains this zip entry
-     */
-    private final FileInfo zipFileInfo;
-    /**
-     * Basic information about the zip entry
-     */
-    private final ZipEntryInfo zipEntryInfo;
-    /**
-     * The actual size of the zip entry computed during checksum calculation. This is required since because the java
-     * zip input stream doesn't always know how to read this data.
-     */
-    private final long actualSize;
-    /**
-     * Checksum information
-     */
-    private FileAdditionalInfo additionalInfo;
-
-    public ZipEntryResourceImpl(FileInfo zipFileInfo, ZipEntryInfo zipEntryInfo, long actualSize,
-            ChecksumsInfo checksums) {
-        super(zipFileInfo);
-        //super(RepoPathFactory.archiveResourceRepoPath(zipFileInfo.getRepoPath(), zipEntryInfo.getPath()));
-        this.zipFileInfo = zipFileInfo;
-        this.zipEntryInfo = zipEntryInfo;
-        this.actualSize = actualSize;
-        additionalInfo = new FileAdditionalInfo(checksums);
-    }
-
-    public ZipEntryResourceImpl(ZipEntryResourceInfo info) {
-        super(info.getZipFileInfo());
-        this.zipFileInfo = info.getZipFileInfo();
-        this.zipEntryInfo = info.getZipEntryInfo();
-        this.actualSize = info.getSize();
-        additionalInfo = new FileAdditionalInfo((FileAdditionalInfo) ((InternalItemInfo) info).getAdditionalInfo());
-    }
-
-    @Override
-    public FileInfo getZipFileInfo() {
-        return zipFileInfo;
-    }
-
-    @Override
-    public ZipEntryInfo getZipEntryInfo() {
-        return zipEntryInfo;
-    }
-
-    /**
-     * @return The name of the zip entry
-     */
-    @Override
-    public String getEntryPath() {
-        return zipEntryInfo.getPath();
-    }
-
-    @Override
-    public ItemAdditionalInfo getAdditionalInfo() {
-        return additionalInfo;
-    }
-
-    @Override
-    public boolean isFolder() {
-        return false;
-    }
-
-    @Override
-    public long getAge() {
-        return zipFileInfo.getAge();
-    }
-
-    @Override
-    public String getMimeType() {
-        MimeType contentType = NamingUtils.getMimeType(zipEntryInfo.getName());
-        return contentType.getType();
-    }
-
-    @Override
-    @Nonnull
-    public ChecksumsInfo getChecksumsInfo() {
-        return additionalInfo.getChecksumsInfo();
-    }
-
-    @Override
-    public long getSize() {
-        return actualSize;
-    }
-
-    @Override
-    public String getSha1() {
-        return getChecksumsInfo().getSha1();
-    }
-
-    @Override
-    public String getMd5() {
-        return getChecksumsInfo().getMd5();
-    }
-
-    @Override
-    public Set<ChecksumInfo> getChecksums() {
-        return getChecksumsInfo().getChecksums();
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/fs/ZipTreeNode.java b/storage/common/src/main/java/org/artifactory/model/xstream/fs/ZipTreeNode.java
deleted file mode 100644
index acedb0d..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/fs/ZipTreeNode.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.fs;
-
-import org.artifactory.fs.ZipEntryInfo;
-import org.artifactory.util.TreeNode;
-
-import java.io.Serializable;
-import java.util.Set;
-import java.util.TreeSet;
-
-/**
- * A tree node representing ZipEntry.
- *
- * @author Yossi Shaul
- */
-public class ZipTreeNode implements TreeNode<ZipEntryInfo>, Serializable, Comparable<ZipTreeNode> {
-
-    // TODO: Should be final
-    private /*final*/ ZipEntryInfo zipEntry;
-    private Set<ZipTreeNode> children;
-
-    public ZipTreeNode(String entryPath, boolean directory) {
-        zipEntry = new ZipEntryImpl(entryPath, directory);
-    }
-
-    @Override
-    public Set<ZipTreeNode> getChildren() {
-        return children;
-    }
-
-    @Override
-    public ZipEntryInfo getData() {
-        return zipEntry;
-    }
-
-    @Override
-    public boolean hasChildren() {
-        return children != null && !children.isEmpty();
-    }
-
-    @Override
-    public boolean isLeaf() {
-        return !hasChildren();
-    }
-
-    public boolean isDirectory() {
-        return zipEntry.isDirectory();
-    }
-
-    @Override
-    public ZipTreeNode getChild(ZipEntryInfo data) {
-        if (!data.getPath().startsWith(zipEntry.getPath())) {
-            return null;
-        }
-
-        return getChild(data.getName());
-    }
-
-    public String getPath() {
-        return zipEntry.getPath();
-    }
-
-    public String getName() {
-        return zipEntry.getName();
-    }
-
-    ZipTreeNode getChild(String relativePath) {
-        if (children != null) {
-            for (ZipTreeNode child : children) {
-                if (child.getName().equals(relativePath)) {
-                    return child;
-                }
-            }
-        }
-        return null;
-    }
-
-    public void addChild(ZipTreeNode child) {
-        if (!zipEntry.isDirectory()) {
-            throw new IllegalStateException("Cannot add children to a leaf node");
-        }
-        if (children == null) {
-            children = new TreeSet<>();
-        }
-        children.add(child);
-    }
-
-    public void setZipEntry(ZipEntryInfo zipEntry) {
-        this.zipEntry = zipEntry;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        ZipTreeNode that = (ZipTreeNode) o;
-
-        if (!zipEntry.equals(that.zipEntry)) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return zipEntry.hashCode();
-    }
-
-    @Override
-    public int compareTo(ZipTreeNode o) {
-        if (o.isDirectory() && !isDirectory()) {
-            return 1;
-        }
-        if (!o.isDirectory() && isDirectory()) {
-            return -1;
-        }
-        return getName().compareTo(o.getName());
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/security/AceImpl.java b/storage/common/src/main/java/org/artifactory/model/xstream/security/AceImpl.java
deleted file mode 100644
index 6372c0a..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/security/AceImpl.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.security;
-
-import com.google.common.collect.Sets;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import org.artifactory.security.AceInfo;
-import org.artifactory.security.ArtifactoryPermission;
-import org.artifactory.security.MutableAceInfo;
-
-import java.util.Set;
-
- at XStreamAlias("ace")
-public class AceImpl implements MutableAceInfo {
-    private String principal;
-    private boolean group;
-    private int mask;
-
-    public AceImpl() {
-    }
-
-    public AceImpl(String principal, boolean group, int mask) {
-        this.principal = principal;
-        this.group = group;
-        this.mask = mask;
-    }
-
-    public AceImpl(AceInfo copy) {
-        this(copy.getPrincipal(), copy.isGroup(), copy.getMask());
-    }
-
-    @Override
-    public String getPrincipal() {
-        return principal;
-    }
-
-    @Override
-    public void setPrincipal(String principal) {
-        this.principal = principal;
-    }
-
-    @Override
-    public boolean isGroup() {
-        return group;
-    }
-
-    @Override
-    public void setGroup(boolean group) {
-        this.group = group;
-    }
-
-    @Override
-    public int getMask() {
-        return mask;
-    }
-
-    @Override
-    public void setMask(int mask) {
-        this.mask = mask;
-    }
-
-    @Override
-    public boolean canManage() {
-        return (getMask() & ArtifactoryPermission.MANAGE.getMask()) > 0;
-    }
-
-    @Override
-    public void setManage(boolean manage) {
-        if (manage) {
-            setMask(getMask() | ArtifactoryPermission.MANAGE.getMask());
-        } else {
-            setMask(getMask() & ~ArtifactoryPermission.MANAGE.getMask());
-        }
-    }
-
-    @Override
-    public boolean canDelete() {
-        return (getMask() & ArtifactoryPermission.DELETE.getMask()) > 0;
-    }
-
-    @Override
-    public void setDelete(boolean delete) {
-        if (delete) {
-            setMask(getMask() | ArtifactoryPermission.DELETE.getMask());
-        } else {
-            setMask(getMask() & ~ArtifactoryPermission.DELETE.getMask());
-        }
-    }
-
-    @Override
-    public boolean canDeploy() {
-        return (getMask() & ArtifactoryPermission.DEPLOY.getMask()) > 0;
-    }
-
-    @Override
-    public void setDeploy(boolean deploy) {
-        if (deploy) {
-            setMask(getMask() | ArtifactoryPermission.DEPLOY.getMask());
-        } else {
-            setMask(getMask() & ~ArtifactoryPermission.DEPLOY.getMask());
-        }
-    }
-
-    @Override
-    public boolean canAnnotate() {
-        return (getMask() & ArtifactoryPermission.ANNOTATE.getMask()) > 0;
-    }
-
-    @Override
-    public void setAnnotate(boolean annotate) {
-        if (annotate) {
-            setMask(getMask() | ArtifactoryPermission.ANNOTATE.getMask());
-        } else {
-            setMask(getMask() & ~ArtifactoryPermission.ANNOTATE.getMask());
-        }
-    }
-
-    @Override
-    public boolean canRead() {
-        return (getMask() & ArtifactoryPermission.READ.getMask()) > 0;
-    }
-
-    @Override
-    public void setRead(boolean read) {
-        if (read) {
-            setMask(getMask() | ArtifactoryPermission.READ.getMask());
-        } else {
-            setMask(getMask() & ~ArtifactoryPermission.READ.getMask());
-        }
-    }
-
-    @Override
-    public Set<String> getPermissionsAsString() {
-        Set<String> permissionsAsString = Sets.newHashSet();
-        for (ArtifactoryPermission artifactoryPermission : ArtifactoryPermission.values()) {
-            if ((getMask() & artifactoryPermission.getMask()) > 0) {
-                permissionsAsString.add(artifactoryPermission.getString());
-            }
-        }
-        return permissionsAsString;
-    }
-
-    @Override
-    public void setPermissionsFromString(Set<String> permissionStrings) {
-        for (ArtifactoryPermission artifactoryPermission : ArtifactoryPermission.values()) {
-            if (permissionStrings.contains(artifactoryPermission.getString())) {
-                setMask(getMask() | artifactoryPermission.getMask());
-            } else {
-                setMask(getMask() & ~artifactoryPermission.getMask());
-            }
-        }
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        AceImpl aceInfo = (AceImpl) o;
-        return group == aceInfo.group &&
-                !(principal != null ? !principal.equals(aceInfo.principal) :
-                        aceInfo.principal != null);
-    }
-
-    @Override
-    public int hashCode() {
-        int result;
-        result = (principal != null ? principal.hashCode() : 0);
-        result = 31 * result + (group ? 1 : 0);
-        return result;
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/security/AclImpl.java b/storage/common/src/main/java/org/artifactory/model/xstream/security/AclImpl.java
deleted file mode 100644
index 20ad6e2..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/security/AclImpl.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.security;
-
-import com.google.common.collect.ImmutableSet;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import org.artifactory.security.AceInfo;
-import org.artifactory.security.AclInfo;
-import org.artifactory.security.MutableAceInfo;
-import org.artifactory.security.MutableAclInfo;
-import org.artifactory.security.PermissionTargetInfo;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * @author Yoav Landman
- */
- at XStreamAlias("acl")
-public class AclImpl implements MutableAclInfo {
-
-    private PermissionTargetImpl permissionTarget;
-    // TODO: verify it's a clean HashSet implementation on all sets
-    private Set<AceImpl> aces;
-    private String updatedBy;
-
-    public AclImpl() {
-        this.permissionTarget = new PermissionTargetImpl();
-        this.aces = new HashSet<>();
-    }
-
-    public AclImpl(AclInfo copy) {
-        this(new PermissionTargetImpl(copy.getPermissionTarget()),
-                new HashSet<AceInfo>(), copy.getUpdatedBy());
-        for (AceInfo aceInfo : copy.getAces()) {
-            aces.add(new AceImpl(aceInfo));
-        }
-    }
-
-    public AclImpl(PermissionTargetInfo permissionTarget) {
-        this.permissionTarget = new PermissionTargetImpl(permissionTarget);
-        this.aces = new HashSet<>();
-    }
-
-    public AclImpl(PermissionTargetInfo permissionTarget, Set<AceInfo> aces, String updatedBy) {
-        this.permissionTarget = new PermissionTargetImpl(permissionTarget);
-        this.aces = new HashSet<>();
-        for (AceInfo ace : aces) {
-            this.aces.add(new AceImpl(ace));
-        }
-        this.updatedBy = updatedBy;
-    }
-
-    @Override
-    public PermissionTargetInfo getPermissionTarget() {
-        return permissionTarget;
-    }
-
-    @Override
-    public void setPermissionTarget(PermissionTargetInfo permissionTarget) {
-        this.permissionTarget = new PermissionTargetImpl(permissionTarget);
-    }
-
-    @Override
-    @SuppressWarnings({"unchecked"})
-    public Set<AceInfo> getAces() {
-        return ImmutableSet.<AceInfo>copyOf((Set) aces);
-    }
-
-    @Override
-    @SuppressWarnings({"unchecked", "RedundantCast"})
-    public Set<MutableAceInfo> getMutableAces() {
-        return (Set<MutableAceInfo>) ((Set) aces);
-    }
-
-    @Override
-    public void setAces(Set<AceInfo> aces) {
-        this.aces.clear();
-        if (aces != null) {
-            for (AceInfo ace : aces) {
-                this.aces.add(new AceImpl(ace));
-            }
-        }
-    }
-
-    @Override
-    public String getUpdatedBy() {
-        return updatedBy;
-    }
-
-    @Override
-    public void setUpdatedBy(String updatedBy) {
-        this.updatedBy = updatedBy;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || !(o instanceof AclInfo)) {
-            return false;
-        }
-
-        AclInfo info = (AclInfo) o;
-
-        return !(permissionTarget != null ? !permissionTarget.equals(info.getPermissionTarget()) :
-                info.getPermissionTarget() != null);
-    }
-
-    @Override
-    public int hashCode() {
-        return (permissionTarget != null ? permissionTarget.hashCode() : 0);
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/security/GroupImpl.java b/storage/common/src/main/java/org/artifactory/model/xstream/security/GroupImpl.java
deleted file mode 100644
index 32ed7f9..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/security/GroupImpl.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.security;
-
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import org.artifactory.sapi.security.SecurityConstants;
-import org.artifactory.security.GroupInfo;
-import org.artifactory.security.MutableGroupInfo;
-
-/**
- * Holds information about user groups.
- *
- * @author Yossi Shaul
- */
- at XStreamAlias("group")
-public class GroupImpl implements MutableGroupInfo {
-    private String groupName;
-    private String description;
-
-    /**
-     * indicates if this group should automatically be added to newly created users
-     */
-    private boolean newUserDefault;
-
-    private String realm;
-
-    private String realmAttributes;
-
-    public GroupImpl() {
-        this.realm = SecurityConstants.DEFAULT_REALM;
-    }
-
-    public GroupImpl(String groupName) {
-        this.groupName = groupName;
-        this.realm = SecurityConstants.DEFAULT_REALM;
-    }
-
-    public GroupImpl(String groupName, String description, boolean newUserDefault) {
-        this.groupName = groupName;
-        this.description = description;
-        this.newUserDefault = newUserDefault;
-        this.realm = SecurityConstants.DEFAULT_REALM;
-    }
-
-    public GroupImpl(String groupName, String description, String realm) {
-        this.groupName = groupName;
-        this.description = description;
-        this.realm = realm != null ? realm : SecurityConstants.DEFAULT_REALM;
-    }
-
-    public GroupImpl(String groupName, String description,
-            boolean newUserDefault, String realm,
-            String realmAttributes) {
-        this.groupName = groupName;
-        this.description = description;
-        this.newUserDefault = newUserDefault;
-        this.realm = realm != null ? realm : SecurityConstants.DEFAULT_REALM;
-        this.realmAttributes = realmAttributes;
-    }
-
-    /**
-     * A copy constructor.
-     *
-     * @param groupInfo Original group info.
-     */
-    public GroupImpl(GroupInfo groupInfo) {
-        this(groupInfo.getGroupName(),
-                groupInfo.getDescription(),
-                groupInfo.isNewUserDefault(),
-                groupInfo.getRealm(),
-                groupInfo.getRealmAttributes());
-    }
-
-    @Override
-    public String getGroupName() {
-        return groupName;
-    }
-
-    @Override
-    public void setGroupName(String groupName) {
-        this.groupName = groupName;
-    }
-
-    @Override
-    public String getDescription() {
-        return description;
-    }
-
-    @Override
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    /**
-     * @return True if this group should automatically be added to newly created users.
-     */
-    @Override
-    public boolean isNewUserDefault() {
-        return newUserDefault;
-    }
-
-    @Override
-    public void setNewUserDefault(boolean newUserDefault) {
-        this.newUserDefault = newUserDefault;
-    }
-
-    @Override
-    public boolean isExternal() {
-        return realm != null && !SecurityConstants.DEFAULT_REALM.equals(realm);
-    }
-
-    @Override
-    public String getRealm() {
-        return realm;
-    }
-
-    @Override
-    public void setRealm(String realm) {
-        this.realm = realm != null ? realm : SecurityConstants.DEFAULT_REALM;
-    }
-
-    @Override
-    public String getRealmAttributes() {
-        return realmAttributes;
-    }
-
-    @Override
-    public void setRealmAttributes(String realmAttributes) {
-        this.realmAttributes = realmAttributes;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        GroupImpl info = (GroupImpl) o;
-
-        return !(groupName != null ? !groupName.equals(info.groupName) : info.groupName != null);
-
-    }
-
-    @Override
-    public int hashCode() {
-        return (groupName != null ? groupName.hashCode() : 0);
-    }
-
-    @Override
-    public String toString() {
-        return (groupName != null ? groupName : "Group name not set");
-    }
-
-}
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/security/ImmutableAclInfo.java b/storage/common/src/main/java/org/artifactory/model/xstream/security/ImmutableAclInfo.java
deleted file mode 100644
index 5a4e03b..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/security/ImmutableAclInfo.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.security;
-
-import com.google.common.collect.ImmutableSet;
-import org.artifactory.security.AceInfo;
-import org.artifactory.security.AclInfo;
-import org.artifactory.security.PermissionTargetInfo;
-
-import java.util.Set;
-
-/**
- * @author Fred Simon
- */
-public class ImmutableAclInfo implements AclInfo {
-
-    private final PermissionTargetInfo permissionTarget;
-    private final ImmutableSet<AceInfo> aces;
-    private final String updatedBy;
-
-    public ImmutableAclInfo(PermissionTargetInfo permissionTarget, Set<AceInfo> aces, String updatedBy) {
-        this.permissionTarget = permissionTarget;
-        this.aces = ImmutableSet.copyOf(aces);
-        this.updatedBy = updatedBy;
-    }
-
-    @Override
-    public PermissionTargetInfo getPermissionTarget() {
-        return permissionTarget;
-    }
-
-    @Override
-    public Set<AceInfo> getAces() {
-        return aces;
-    }
-
-    @Override
-    public String getUpdatedBy() {
-        return updatedBy;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || !(o instanceof AclInfo)) {
-            return false;
-        }
-
-        AclInfo info = (AclInfo) o;
-
-        return !(permissionTarget != null ? !permissionTarget.equals(info.getPermissionTarget()) :
-                info.getPermissionTarget() != null);
-    }
-
-    @Override
-    public int hashCode() {
-        return (permissionTarget != null ? permissionTarget.hashCode() : 0);
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/security/PermissionTargetImpl.java b/storage/common/src/main/java/org/artifactory/model/xstream/security/PermissionTargetImpl.java
deleted file mode 100644
index 5e3739a..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/security/PermissionTargetImpl.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.security;
-
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import org.artifactory.security.MutablePermissionTargetInfo;
-import org.artifactory.security.PermissionTargetInfo;
-import org.artifactory.util.PathUtils;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
- at XStreamAlias("target")
-public class PermissionTargetImpl implements MutablePermissionTargetInfo {
-
-    private static final String DELIMITER = ",";
-
-    private String name;
-    private List<String> repoKeys = new ArrayList<>();
-    private List<String> includes = new ArrayList<>();
-    private List<String> excludes = new ArrayList<>();
-
-    public PermissionTargetImpl() {
-        this("", Arrays.asList(ANY_REPO));
-    }
-
-    public PermissionTargetImpl(String name) {
-        this(name, Arrays.asList(ANY_REPO));
-    }
-
-    public PermissionTargetImpl(String name, List<String> repoKeys) {
-        this.name = name;
-        this.repoKeys = new ArrayList<>(repoKeys);
-        this.includes.add(ANY_PATH);
-    }
-
-    public PermissionTargetImpl(String name, List<String> repoKeys, List<String> includes, List<String> excludes) {
-        this.name = name;
-        this.repoKeys = repoKeys;
-        this.includes = includes;
-        this.excludes = excludes;
-    }
-
-    public PermissionTargetImpl(PermissionTargetInfo copy) {
-        this(copy.getName(),
-                new ArrayList<>(copy.getRepoKeys()),
-                new ArrayList<>(copy.getIncludes()),
-                new ArrayList<>(copy.getExcludes())
-        );
-    }
-
-    public PermissionTargetImpl(String name, List<String> repoKeys, String includes, String excludes) {
-        this(name, repoKeys);
-        setIncludesPattern(includes);
-        setExcludesPattern(excludes);
-    }
-
-    @Override
-    public String getName() {
-        return name;
-    }
-
-    @Override
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    @Override
-    public List<String> getRepoKeys() {
-        return repoKeys;
-    }
-
-    @Override
-    public void setRepoKeys(List<String> repoKeys) {
-        this.repoKeys = new ArrayList<>(repoKeys);
-        Collections.sort(this.repoKeys);
-    }
-
-    @Override
-    public List<String> getIncludes() {
-        return includes;
-    }
-
-    @Override
-    public void setIncludes(List<String> includes) {
-        this.includes = includes;
-    }
-
-    @Override
-    public List<String> getExcludes() {
-        return excludes;
-    }
-
-    @Override
-    public void setExcludes(List<String> excludes) {
-        this.excludes = excludes;
-    }
-
-    @Override
-    public String getIncludesPattern() {
-        return PathUtils.collectionToDelimitedString(includes, DELIMITER);
-    }
-
-    @Override
-    public void setIncludesPattern(String includesPattern) {
-        this.includes = PathUtils.includesExcludesPatternToStringList(includesPattern);
-    }
-
-    @Override
-    public String getExcludesPattern() {
-        return PathUtils.collectionToDelimitedString(excludes, DELIMITER);
-    }
-
-    @Override
-    public void setExcludesPattern(String excludesPattern) {
-        this.excludes = PathUtils.includesExcludesPatternToStringList(excludesPattern);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        PermissionTargetImpl info = (PermissionTargetImpl) o;
-
-        return !(name != null ? !name.equals(info.name) : info.name != null);
-    }
-
-    @Override
-    public int hashCode() {
-        return (name != null ? name.hashCode() : 0);
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/security/SecurityDataImpl.java b/storage/common/src/main/java/org/artifactory/model/xstream/security/SecurityDataImpl.java
deleted file mode 100644
index 6080bac..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/security/SecurityDataImpl.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.security;
-
-import com.google.common.collect.ImmutableList;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
-import org.artifactory.security.AclInfo;
-import org.artifactory.security.GroupInfo;
-import org.artifactory.security.SecurityInfo;
-import org.artifactory.security.UserInfo;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * User: freds Date: Jun 12, 2008 Time: 1:57:29 PM
- */
- at XStreamAlias("security")
-public class SecurityDataImpl implements SecurityInfo {
-    @XStreamAsAttribute
-    private String version;
-    private List<UserImpl> users;
-    private List<GroupImpl> groups;
-    private List<AclImpl> acls;
-
-    public SecurityDataImpl(List<UserInfo> users, List<GroupInfo> groups, List<AclInfo> acls) {
-        if (users != null) {
-            this.users = new ArrayList<>(users.size());
-            for (UserInfo user : users) {
-                this.users.add(new UserImpl(user));
-            }
-        }
-        if (groups != null) {
-            this.groups = new ArrayList<>(groups.size());
-            for (GroupInfo group : groups) {
-                this.groups.add(new GroupImpl(group));
-            }
-        }
-        if (acls != null) {
-            this.acls = new ArrayList<>(acls.size());
-            for (AclInfo acl : acls) {
-                this.acls.add(new AclImpl(acl));
-            }
-        }
-    }
-
-    @Override
-    public String getVersion() {
-        return version;
-    }
-
-    @Override
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    @Override
-    public List<UserInfo> getUsers() {
-        if (users == null) {
-            return null;
-        }
-        return ImmutableList.<UserInfo>copyOf(users);
-    }
-
-    @Override
-    public List<GroupInfo> getGroups() {
-        if (groups == null) {
-            return null;
-        }
-        return ImmutableList.<GroupInfo>copyOf(groups);
-    }
-
-    @Override
-    public List<AclInfo> getAcls() {
-        if (acls == null) {
-            return null;
-        }
-        return ImmutableList.<AclInfo>copyOf(acls);
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/security/UserGroupImpl.java b/storage/common/src/main/java/org/artifactory/model/xstream/security/UserGroupImpl.java
deleted file mode 100644
index a8ebfcc..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/security/UserGroupImpl.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.security;
-
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import com.thoughtworks.xstream.annotations.XStreamOmitField;
-import org.artifactory.sapi.security.SecurityConstants;
-import org.artifactory.security.UserGroupInfo;
-
-import java.io.Serializable;
-
-/**
- * An object representing the resolved groups of a user, including the external realm the group may belong to
- */
- at XStreamAlias("userGroup")
-public class UserGroupImpl implements Serializable, UserGroupInfo {
-
-    final String groupName;
-
-    @XStreamOmitField
-    String realm = SecurityConstants.DEFAULT_REALM;
-
-    public UserGroupImpl(String groupName) {
-        this(groupName, SecurityConstants.DEFAULT_REALM);
-    }
-
-    public UserGroupImpl(String groupName, String realm) {
-        this.groupName = groupName;
-        this.realm = realm;
-    }
-
-    @Override
-    public String getGroupName() {
-        return groupName;
-    }
-
-    @Override
-    public String getRealm() {
-        return realm;
-    }
-
-    @Override
-    public boolean isExternal() {
-        return !SecurityConstants.DEFAULT_REALM.equals(realm);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        UserGroupImpl info = (UserGroupImpl) o;
-        return groupName.equals(info.groupName);
-    }
-
-    @Override
-    public int hashCode() {
-        return groupName.hashCode();
-    }
-
-    @Override
-    public String toString() {
-        return groupName;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/security/UserImpl.java b/storage/common/src/main/java/org/artifactory/model/xstream/security/UserImpl.java
deleted file mode 100644
index 6ae2954..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/security/UserImpl.java
+++ /dev/null
@@ -1,501 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.security;
-
-import com.google.common.collect.ImmutableSet;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import org.artifactory.sapi.security.SecurityConstants;
-import org.artifactory.security.*;
-
-import java.util.HashSet;
-import java.util.Set;
-
- at XStreamAlias("user")
-public class UserImpl implements MutableUserInfo {
-
-    private String username;
-    private String password;
-    private String email;
-    private String salt;
-    private String genPasswordKey;
-    private boolean admin;
-    private boolean enabled;
-    private boolean updatableProfile;
-    private boolean accountNonExpired;
-    private boolean credentialsExpired;
-    private boolean credentialsNonExpired;
-    private boolean accountNonLocked;
-
-    private String realm;
-    private String privateKey;
-    private String publicKey;
-    private boolean transientUser;
-
-    private Set<UserGroupInfo> groups = new HashSet<>(1);
-    private Set<UserPropertyInfo> userPropertyInfos = new HashSet<>();
-
-    private long lastLoginTimeMillis;
-    private String lastLoginClientIp;
-
-    private long lastAccessTimeMillis;
-    private String lastAccessClientIp;
-
-    private String bintrayAuth;
-
-    private boolean locked;
-
-    public UserImpl() {
-    }
-
-    public UserImpl(String username) {
-        this.username = username;
-    }
-
-    public UserImpl(UserInfo user) {
-        this.username = user.getUsername();
-        this.password = user.getPassword();
-        this.salt = user.getSalt();
-        this.email = user.getEmail();
-        this.admin = user.isAdmin();
-        this.enabled = user.isEnabled();
-        this.updatableProfile = user.isUpdatableProfile();
-        this.accountNonExpired = user.isAccountNonExpired();
-        this.credentialsExpired = user.isCredentialsExpired();
-        this.credentialsNonExpired = user.isCredentialsNonExpired();
-        this.accountNonLocked = user.isAccountNonLocked();
-        this.transientUser = user.isTransientUser();
-        this.realm = user.getRealm();
-
-        Set<UserGroupInfo> groups = user.getGroups();
-        if (groups != null) {
-            this.groups = new HashSet<>(groups);
-        } else {
-            this.groups = new HashSet<>(1);
-        }
-
-        Set<UserPropertyInfo> userPropertyInfos = user.getUserProperties();
-        if (userPropertyInfos != null) {
-            this.userPropertyInfos = new HashSet<>(userPropertyInfos);
-        } else {
-            this.userPropertyInfos = new HashSet<>();
-        }
-
-        setPrivateKey(user.getPrivateKey());
-        setPublicKey(user.getPublicKey());
-        setGenPasswordKey(user.getGenPasswordKey());
-        setLastLoginClientIp(user.getLastLoginClientIp());
-        setLastLoginTimeMillis(user.getLastLoginTimeMillis());
-        setBintrayAuth(user.getBintrayAuth());
-        setLocked(user.isLocked());
-        setCredentialsExpired(user.isCredentialsExpired());
-        setCredentialsNonExpired(isCredentialsNonExpired());
-    }
-
-    public boolean isCredentialsNonExpired() {
-        return credentialsNonExpired;
-    }
-
-    public void setCredentialsNonExpired(boolean credentialsNonExpired) {
-        this.credentialsNonExpired = credentialsNonExpired;
-    }
-
-    @Override
-    public String getUsername() {
-        return username;
-    }
-
-    @Override
-    public void setUsername(String username) {
-        this.username = username;
-    }
-
-    @Override
-    public String getPassword() {
-        return password;
-    }
-
-    @Override
-    public void setPassword(SaltedPassword saltedPassword) {
-        this.password = saltedPassword.getPassword();
-        this.salt = saltedPassword.getSalt();
-    }
-
-    @Override
-    public String getSalt() {
-        return salt;
-    }
-
-    @Override
-    public String getEmail() {
-        return email;
-    }
-
-    @Override
-    public void setEmail(String email) {
-        this.email = email;
-    }
-
-    @Override
-    public String getPrivateKey() {
-        return privateKey;
-    }
-
-    @Override
-    public void setPrivateKey(String privateKey) {
-        this.privateKey = privateKey;
-    }
-
-    @Override
-    public String getPublicKey() {
-        return publicKey;
-    }
-
-    @Override
-    public void setPublicKey(String publicKey) {
-        this.publicKey = publicKey;
-    }
-
-    @Override
-    public String getGenPasswordKey() {
-        return genPasswordKey;
-    }
-
-    @Override
-    public void setGenPasswordKey(String genPasswordKey) {
-        this.genPasswordKey = genPasswordKey;
-    }
-
-    @Override
-    public boolean isAdmin() {
-        return admin;
-    }
-
-    @Override
-    public void setAdmin(boolean admin) {
-        this.admin = admin;
-    }
-
-    @Override
-    public boolean isEnabled() {
-        return enabled;
-    }
-
-    @Override
-    public void setEnabled(boolean enabled) {
-        this.enabled = enabled;
-    }
-
-    @Override
-    public boolean isUpdatableProfile() {
-        return updatableProfile;
-    }
-
-    @Override
-    public void setUpdatableProfile(boolean updatableProfile) {
-        this.updatableProfile = updatableProfile;
-    }
-
-    @Override
-    public boolean isAccountNonExpired() {
-        return accountNonExpired;
-    }
-
-    @Override
-    public void setAccountNonExpired(boolean accountNonExpired) {
-        this.accountNonExpired = accountNonExpired;
-    }
-
-    @Override
-    public boolean isAccountNonLocked() {
-        return accountNonLocked;
-    }
-
-    @Override
-    public void setAccountNonLocked(boolean accountNonLocked) {
-        this.accountNonLocked = accountNonLocked;
-    }
-
-    @Override
-    public boolean isTransientUser() {
-        return transientUser;
-    }
-
-    @Override
-    public void setTransientUser(boolean transientUser) {
-        this.transientUser = transientUser;
-    }
-
-    @Override
-    public String getRealm() {
-        return realm;
-    }
-
-    @Override
-    public boolean isExternal() {
-        return !SecurityConstants.DEFAULT_REALM.equals(realm);
-    }
-
-    @Override
-    public void setRealm(String realm) {
-        this.realm = realm;
-    }
-
-    @Override
-    public boolean isCredentialsExpired() {
-        return credentialsExpired;
-    }
-
-    @Override
-    public void setCredentialsExpired(boolean credentialsExpired) {
-        this.credentialsExpired = credentialsExpired;
-    }
-
-    @Override
-    public boolean isAnonymous() {
-        return (username != null && username.equalsIgnoreCase(ANONYMOUS));
-    }
-
-    @Override
-    public boolean isInGroup(String groupName) {
-        //Use the equals() behavior with a dummy userGroupInfo
-        UserGroupInfo userGroupInfo = getDummyGroup(groupName);
-        return getGroups().contains(userGroupInfo);
-    }
-
-    @Override
-    public void addGroup(String groupName) {
-        addGroup(groupName, SecurityConstants.DEFAULT_REALM);
-    }
-
-    @Override
-    public void addGroup(String groupName, String realm) {
-        UserGroupInfo userGroupInfo = new UserGroupImpl(groupName, realm);
-        // group equality is currently using group name only, so make sure to remove existing group with the same name
-        _groups().remove(userGroupInfo);
-        _groups().add(userGroupInfo);
-    }
-
-    @Override
-    public void removeGroup(String groupName) {
-        //Use the equals() behavior with a dummy userGroupInfo
-        UserGroupInfo userGroupInfo = getDummyGroup(groupName);
-        _groups().remove(userGroupInfo);
-    }
-
-    /**
-     * @return The _groups() names this user belongs to. Empty list if none.
-     */
-    @Override
-    public Set<UserGroupInfo> getGroups() {
-        return ImmutableSet.copyOf(_groups());
-    }
-
-    @Override
-    public Set<UserPropertyInfo> getUserProperties() {
-        if (userPropertyInfos == null) {
-            this.userPropertyInfos = new HashSet();
-        }
-        return userPropertyInfos;
-    }
-
-    // Needed because XStream inject nulls :(
-    private Set<UserGroupInfo> _groups() {
-        if (groups == null) {
-            this.groups = new HashSet<>(1);
-        }
-        return groups;
-    }
-
-    @Override
-    public void setGroups(Set<UserGroupInfo> groups) {
-        if (groups == null) {
-            this.groups = new HashSet<>(1);
-        } else {
-            this.groups = new HashSet<>(groups);
-        }
-    }
-
-    @Override
-    public void setUserProperties(Set<UserPropertyInfo> userProperties) {
-        userPropertyInfos = userProperties;
-    }
-
-    @Override
-    public void putUserProperty(String key, String val) {
-        userPropertyInfos.add(new UserProperty(key, val));
-    }
-
-    @Override
-    public void setInternalGroups(Set<String> groups) {
-        if (groups == null) {
-            this.groups = new HashSet<>(1);
-            return;
-        }
-        //Add groups with the default internal realm
-        _groups().clear();
-        for (String group : groups) {
-            addGroup(group);
-        }
-    }
-
-    @Override
-    public long getLastLoginTimeMillis() {
-        return lastLoginTimeMillis;
-    }
-
-    @Override
-    public void setLastLoginTimeMillis(long lastLoginTimeMillis) {
-        this.lastLoginTimeMillis = lastLoginTimeMillis;
-    }
-
-    @Override
-    public String getLastLoginClientIp() {
-        return lastLoginClientIp;
-    }
-
-    @Override
-    public void setLastLoginClientIp(String lastLoginClientIp) {
-        this.lastLoginClientIp = lastLoginClientIp;
-    }
-
-    @Override
-    @Deprecated
-    public long getLastAccessTimeMillis() {
-        return lastAccessTimeMillis;
-    }
-
-    @Override
-    @Deprecated
-    public void setLastAccessTimeMillis(long lastAccessTimeMillis) {
-        this.lastAccessTimeMillis = lastAccessTimeMillis;
-    }
-
-    @Override
-    @Deprecated
-    public String getLastAccessClientIp() {
-        return lastAccessClientIp;
-    }
-
-    @Override
-    @Deprecated
-    public void setLastAccessClientIp(String lastAccessClientIp) {
-        this.lastAccessClientIp = lastAccessClientIp;
-    }
-
-    @Override
-    public void setBintrayAuth(String bintrayAuth) {
-        this.bintrayAuth = bintrayAuth;
-    }
-
-    @Override
-    public String getBintrayAuth() {
-        return bintrayAuth;
-    }
-
-    /**
-     * Compare the groups and login flags of the users to know if a force re-login is needed.
-     *
-     * @return true if users have same flags and groups, false otherwise.
-     */
-    @Override
-    public boolean hasSameAuthorizationContext(UserInfo o) {
-        if (o == null) {
-            return false;
-        }
-        return isAdmin() == o.isAdmin()
-                && isEnabled() == o.isEnabled()
-                && hasSamePassword(o)
-                && isAccountNonLocked() == o.isAccountNonLocked()
-                && isCredentialsExpired() == o.isCredentialsExpired()
-                && equalGroupsSet(getGroups(), o.getGroups());
-    }
-
-    private boolean hasSamePassword(UserInfo user) {
-        if (password != null ? !password.equals(user.getPassword()) : user.getPassword() != null) {
-            return false;
-        }
-        return true;
-    }
-
-    private static boolean equalGroupsSet(Set<UserGroupInfo> s1, Set<UserGroupInfo> s2) {
-        if (s1 == s2) {
-            return true;
-        }
-        if (s1 == null || s2 == null) {
-            return false;
-        }
-        if (s1.equals(s2)) {
-            return true;
-        }
-        if (s1.size() != s2.size()) {
-            return false;
-        }
-        for (UserGroupInfo g1 : s1) {
-            if (!s2.contains(g1)) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        UserImpl info = (UserImpl) o;
-
-        return !(username != null ? !username.equals(info.username) : info.username != null);
-    }
-
-    @Override
-    public int hashCode() {
-        return (username != null ? username.hashCode() : 0);
-    }
-
-    private static UserGroupInfo getDummyGroup(String groupName) {
-        UserGroupInfo userGroupInfo = new UserGroupImpl(groupName, "whatever");
-        return userGroupInfo;
-    }
-
-    @Override
-    public boolean hasInvalidPassword() {
-        return INVALID_PASSWORD.equals(getPassword());
-    }
-
-    /**
-     * @param locked whether given user is locked
-     */
-    @Override
-    public void setLocked(boolean locked) {
-        this.locked = locked;
-    }
-
-    /**
-     * @return whether given user is locked
-     */
-    @Override
-    public boolean isLocked() {
-        return locked;
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/model/xstream/security/UserProperty.java b/storage/common/src/main/java/org/artifactory/model/xstream/security/UserProperty.java
deleted file mode 100644
index defa930..0000000
--- a/storage/common/src/main/java/org/artifactory/model/xstream/security/UserProperty.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.model.xstream.security;
-
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import org.artifactory.security.UserPropertyInfo;
-
-/**
- * @author Gidi Shabat
- */
- at XStreamAlias("userProperty")
-public class UserProperty implements UserPropertyInfo {
-
-    private final String propKey;
-    private final String propValue;
-
-    public UserProperty(String propKey, String propValue) {
-        this.propKey = propKey;
-        this.propValue = propValue;
-    }
-
-    @Override
-    public String getPropKey() {
-        return propKey;
-    }
-
-    @Override
-    public String getPropValue() {
-        return propValue;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        UserProperty that = (UserProperty) o;
-
-        return propKey != null ? propKey.equals(that.propKey) : that.propKey == null;
-
-    }
-
-    @Override
-    public int hashCode() {
-        return propKey != null ? propKey.hashCode() : 0;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/repo/SaveResourceContext.java b/storage/common/src/main/java/org/artifactory/repo/SaveResourceContext.java
deleted file mode 100644
index a25ad68..0000000
--- a/storage/common/src/main/java/org/artifactory/repo/SaveResourceContext.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import org.artifactory.fs.RepoResource;
-import org.artifactory.io.RemoteResourceStreamHandle;
-import org.artifactory.md.Properties;
-import org.artifactory.resource.ResourceStreamHandle;
-import org.artifactory.storage.binstore.service.BinaryInfo;
-
-import java.io.InputStream;
-
-/**
- * @author Noam Y. Tenne
- */
-public class SaveResourceContext {
-
-    private final RepoResource repoResource;
-    private final ResourceStreamHandle handle;
-    private final InputStream inputStream;
-    private final Properties properties;
-    private final long created;
-    private final String createBy;
-    private final String modifiedBy;
-    /**
-     * Optional existing binary info. If this field is not null, the content is already in the binary store and there's
-     * no need to re-read the input stream.
-     */
-    private final BinaryInfo binaryInfo;
-
-    public SaveResourceContext(RepoResource repoResource, ResourceStreamHandle handle, InputStream inputStream,
-            Properties properties, long created, String createBy, String modifiedBy, BinaryInfo binaryInfo) {
-        this.repoResource = repoResource;
-        this.handle = handle;
-        this.inputStream = inputStream;
-        this.properties = properties;
-        this.created = created;
-        this.createBy = createBy;
-        this.modifiedBy = modifiedBy;
-        this.binaryInfo = binaryInfo;
-    }
-
-    public RepoResource getRepoResource() {
-        return repoResource;
-    }
-
-    public InputStream getInputStream() {
-        return inputStream;
-    }
-
-    public Properties getProperties() {
-        return properties;
-    }
-
-    public long getCreated() {
-        return created;
-    }
-
-    public String getCreateBy() {
-        return createBy;
-    }
-
-    public String getModifiedBy() {
-        return modifiedBy;
-    }
-
-    public void setException(Throwable throwable) {
-        if (handle instanceof RemoteResourceStreamHandle) {
-            ((RemoteResourceStreamHandle) handle).setThrowable(throwable);
-        }
-    }
-
-    public BinaryInfo getBinaryInfo() {
-        return binaryInfo;
-    }
-
-    public static class Builder {
-
-        private RepoResource repoResource;
-        private InputStream inputStream;
-        private Properties properties;
-        private long created;
-        private String createBy;
-        private String modifiedBy;
-        private ResourceStreamHandle handle;
-        private BinaryInfo binaryInfo;
-
-        public Builder(RepoResource repoResource, ResourceStreamHandle handle) {
-            this(repoResource, handle.getInputStream());
-            this.handle = handle;
-        }
-
-        public Builder(RepoResource repoResource, InputStream inputStream) {
-            this.repoResource = repoResource;
-            this.inputStream = inputStream;
-        }
-
-        public Builder(SaveResourceContext other) {
-            repoResource = other.repoResource;
-            inputStream = other.inputStream;
-            handle = other.handle;
-            properties = other.properties;
-            createBy = other.createBy;
-            created = other.created;
-            modifiedBy = other.modifiedBy;
-            binaryInfo = other.binaryInfo;
-        }
-
-        public Builder properties(Properties properties) {
-            this.properties = properties;
-            return this;
-        }
-
-        public Builder created(long created) {
-            this.created = created;
-            return this;
-        }
-
-        public Builder createdBy(String createBy) {
-            this.createBy = createBy;
-            return this;
-        }
-
-        public Builder modifiedBy(String modifiedBy) {
-            this.modifiedBy = modifiedBy;
-            return this;
-        }
-
-        public Builder binaryInfo(BinaryInfo binaryInfo) {
-            this.binaryInfo = binaryInfo;
-            return this;
-        }
-
-        public SaveResourceContext build() {
-            return new SaveResourceContext(repoResource, handle, inputStream, properties, created, createBy,
-                    modifiedBy, binaryInfo);
-        }
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/repo/snapshot/MavenSnapshotVersionAdapter.java b/storage/common/src/main/java/org/artifactory/repo/snapshot/MavenSnapshotVersionAdapter.java
deleted file mode 100644
index 915fa6d..0000000
--- a/storage/common/src/main/java/org/artifactory/repo/snapshot/MavenSnapshotVersionAdapter.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.snapshot;
-
-/**
- * A snapshot version adapter is used in local repositories and is the implementation of the {@link
- * org.artifactory.descriptor.repo.SnapshotVersionBehavior}.
- *
- * @author Yossi Shaul
- */
-public interface MavenSnapshotVersionAdapter {
-
-    String adaptSnapshotPath(MavenSnapshotVersionAdapterContext context);
-}
diff --git a/storage/common/src/main/java/org/artifactory/repo/snapshot/MavenSnapshotVersionAdapterContext.java b/storage/common/src/main/java/org/artifactory/repo/snapshot/MavenSnapshotVersionAdapterContext.java
deleted file mode 100644
index f33af92..0000000
--- a/storage/common/src/main/java/org/artifactory/repo/snapshot/MavenSnapshotVersionAdapterContext.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo.snapshot;
-
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.repo.RepoPath;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * A pass to value for the {@link MavenSnapshotVersionAdapter}.
- *
- * @author Yossi Shaul
- */
-public class MavenSnapshotVersionAdapterContext {
-    private static final Logger log = LoggerFactory.getLogger(MavenSnapshotVersionAdapterContext.class);
-
-    private RepoPath repoPath;
-    private ModuleInfo moduleInfo;
-    private long timestamp;
-
-    public MavenSnapshotVersionAdapterContext(RepoPath repoPath, ModuleInfo moduleInfo) {
-        this.repoPath = repoPath;
-        this.moduleInfo = moduleInfo;
-    }
-
-    public RepoPath getRepoPath() {
-        return repoPath;
-    }
-
-    public ModuleInfo getModuleInfo() {
-        return moduleInfo;
-    }
-
-    /**
-     * @return A timestamp attached to the artifact deployed. Can be used by the adapter.
-     */
-    public long getTimestamp() {
-        return timestamp;
-    }
-
-    public void setTimestamp(String timestamp) {
-        try {
-            this.timestamp = Long.parseLong(timestamp);
-        } catch (NumberFormatException e) {
-            log.error("Timestamp is not a valid long: " + timestamp);
-        }
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/schedule/ArtifactoryConcurrentExecutor.java b/storage/common/src/main/java/org/artifactory/schedule/ArtifactoryConcurrentExecutor.java
deleted file mode 100644
index 7ce7945..0000000
--- a/storage/common/src/main/java/org/artifactory/schedule/ArtifactoryConcurrentExecutor.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-import org.artifactory.api.context.ArtifactoryContextThreadBinder;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.storage.spring.ArtifactoryStorageContext;
-import org.artifactory.storage.spring.StorageContextHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.scheduling.concurrent.CustomizableThreadFactory;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-
-import java.util.concurrent.Executor;
-import java.util.concurrent.Future;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.RejectedExecutionException;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
-/**
- * @author Yossi Shaul
- * @author Fred Simon
- */
-public class ArtifactoryConcurrentExecutor implements Executor {
-
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryConcurrentExecutor.class);
-
-    private final ArtifactoryStorageContext storageContext;
-    private final ThreadPoolExecutor executor;
-
-    ArtifactoryConcurrentExecutor() {
-        CustomizableThreadFactory threadFactory = new CustomizableThreadFactory("art-exec-");
-        threadFactory.setThreadPriority(Thread.NORM_PRIORITY);
-        executor = new ThreadPoolExecutor(
-                ConstantValues.asyncCorePoolSize.getInt(),
-                ConstantValues.asyncCorePoolSize.getInt(),
-                ConstantValues.asyncPoolTtlSecs.getInt(),
-                TimeUnit.SECONDS,
-                new LinkedBlockingQueue<Runnable>(ConstantValues.asyncPoolMaxQueueSize.getInt()),
-                threadFactory);
-        executor.allowCoreThreadTimeOut(true);
-        storageContext = StorageContextHelper.get();
-    }
-
-    @Override
-    public void execute(Runnable task) {
-        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
-        task = new RunnableWrapper(task, authentication);
-        try {
-            executor.execute(task);
-        } catch (RejectedExecutionException e) {
-            log.warn("Task {} was rejected by scheduler: {}", task.toString(), e.getMessage());
-            throw e;
-        }
-    }
-
-    <T> Future<T> submit(Runnable task, T result) {
-        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
-        task = new RunnableWrapper(task, authentication);
-        return executor.submit(task, result);
-    }
-
-    void shutdown() {
-        executor.shutdown();
-    }
-
-    class RunnableWrapper implements Runnable {
-        private final Runnable delegate;
-        private final Authentication authentication;
-
-
-        RunnableWrapper(Runnable delegate, Authentication authentication) {
-            this.delegate = delegate;
-            this.authentication = authentication;
-        }
-
-        @Override
-        public void run() {
-            try {
-                ArtifactoryContextThreadBinder.bind(storageContext);
-                ArtifactoryHome.bind(storageContext.getArtifactoryHome());
-                SecurityContextHolder.getContext().setAuthentication(authentication);
-                delegate.run();
-            } finally {
-                // in case an async operation is fired while shutdown (i.e gc) the context holder strategy is
-                // cleared and NPE can happen after the async finished (or is finishing). see RTFACT-2812
-                if (storageContext.isReady()) {
-                    SecurityContextHolder.clearContext();
-                }
-                ArtifactoryContextThreadBinder.unbind();
-                ArtifactoryHome.unbind();
-            }
-        }
-    }
-
-    public int getActiveCount() {
-        return executor.getActiveCount();
-    }
-
-    public long getCompletedTaskCount() {
-        return executor.getCompletedTaskCount();
-    }
-
-    public int getCorePoolSize() {
-        return executor.getCorePoolSize();
-    }
-
-    public int getLargestPoolSize() {
-        return executor.getLargestPoolSize();
-    }
-
-    public int getMaximumPoolSize() {
-        return executor.getMaximumPoolSize();
-    }
-
-    public long getTaskCount() {
-        return executor.getTaskCount();
-    }
-
-    public void setCorePoolSize(int corePoolSize) {
-        executor.setCorePoolSize(corePoolSize);
-    }
-
-    public void setMaximumPoolSize(int maximumPoolSize) {
-        executor.setMaximumPoolSize(maximumPoolSize);
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/schedule/ArtifactorySingleThreadExecutor.java b/storage/common/src/main/java/org/artifactory/schedule/ArtifactorySingleThreadExecutor.java
deleted file mode 100644
index 90a65fc..0000000
--- a/storage/common/src/main/java/org/artifactory/schedule/ArtifactorySingleThreadExecutor.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-import com.google.common.util.concurrent.ThreadFactoryBuilder;
-import org.artifactory.api.context.ArtifactoryContextThreadBinder;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.storage.spring.ArtifactoryStorageContext;
-import org.artifactory.storage.spring.StorageContextHelper;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-
-import java.util.List;
-import java.util.concurrent.AbstractExecutorService;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Fixed size execution service with bounded authentication
- *
- * @author Shay Yaakov
- */
-public class ArtifactorySingleThreadExecutor extends AbstractExecutorService {
-
-    private final ArtifactoryStorageContext storageContext;
-    private final ExecutorService executor;
-
-    public ArtifactorySingleThreadExecutor() {
-        ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("art-fixed-%s").build();
-        executor = new ThreadPoolExecutor(1, 1,
-                0L, TimeUnit.MILLISECONDS,
-                new LinkedBlockingQueue<>(),
-                threadFactory);
-        storageContext = StorageContextHelper.get();
-    }
-
-    @Override
-    public void shutdown() {
-        executor.shutdown();
-    }
-
-    @Override
-    public List<Runnable> shutdownNow() {
-        return executor.shutdownNow();
-    }
-
-    @Override
-    public boolean isShutdown() {
-        return executor.isShutdown();
-    }
-
-    @Override
-    public boolean isTerminated() {
-        return executor.isTerminated();
-    }
-
-    @Override
-    public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException {
-        return executor.isShutdown();
-    }
-
-    @Override
-    public void execute(Runnable task) {
-        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
-        task = new RunnableWrapper(task, authentication);
-        executor.execute(task);
-    }
-
-    class RunnableWrapper implements Runnable {
-        private final Runnable delegate;
-        private final Authentication authentication;
-
-        RunnableWrapper(Runnable delegate, Authentication authentication) {
-            this.delegate = delegate;
-            this.authentication = authentication;
-        }
-
-        @Override
-        public void run() {
-            try {
-                ArtifactoryContextThreadBinder.bind(storageContext);
-                ArtifactoryHome.bind(storageContext.getArtifactoryHome());
-                SecurityContextHolder.getContext().setAuthentication(authentication);
-                delegate.run();
-            } finally {
-                // in case an async operation is fired while shutdown (i.e gc) the context holder strategy is
-                // cleared and NPE can happen after the async finished (or is finishing). see RTFACT-2812
-                if (storageContext.isReady()) {
-                    SecurityContextHolder.clearContext();
-                }
-                ArtifactoryContextThreadBinder.unbind();
-                ArtifactoryHome.unbind();
-            }
-        }
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/schedule/CachedThreadPoolTaskExecutor.java b/storage/common/src/main/java/org/artifactory/schedule/CachedThreadPoolTaskExecutor.java
deleted file mode 100644
index 266d986..0000000
--- a/storage/common/src/main/java/org/artifactory/schedule/CachedThreadPoolTaskExecutor.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-
-import org.springframework.scheduling.concurrent.ConcurrentTaskExecutor;
-
-import java.util.concurrent.Future;
-
-/**
- * @author Yoav Landman
- */
-public class CachedThreadPoolTaskExecutor extends ConcurrentTaskExecutor {
-
-    public CachedThreadPoolTaskExecutor() {
-        super(new ArtifactoryConcurrentExecutor());
-    }
-
-    private ArtifactoryConcurrentExecutor getArtifactoryExecutor() {
-        return (ArtifactoryConcurrentExecutor) getConcurrentExecutor();
-    }
-
-    public void destroy() {
-        getArtifactoryExecutor().shutdown();
-    }
-
-    public <T> Future<T> submit(Runnable task, T result) {
-        return getArtifactoryExecutor().submit(task, result);
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/schedule/DummyExecutorService.java b/storage/common/src/main/java/org/artifactory/schedule/DummyExecutorService.java
deleted file mode 100644
index c619cb7..0000000
--- a/storage/common/src/main/java/org/artifactory/schedule/DummyExecutorService.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-/**
- * Date: 11/6/12
- * Time: 11:24 AM
- *
- * @author freds
- */
-public class DummyExecutorService implements ExecutorService {
-    final CachedThreadPoolTaskExecutor taskExecutor;
-
-    public DummyExecutorService(CachedThreadPoolTaskExecutor taskExecutor) {
-        this.taskExecutor = taskExecutor;
-    }
-
-    @Override
-    public <T> Future<T> submit(Callable<T> task) {
-        return this.taskExecutor.submit(task);
-    }
-
-    @Override
-    public void shutdown() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public List<Runnable> shutdownNow() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public boolean isShutdown() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public boolean isTerminated() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public <T> Future<T> submit(Runnable task, T result) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public Future<?> submit(Runnable task) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
-            throws InterruptedException {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
-            throws InterruptedException, ExecutionException, TimeoutException {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public void execute(Runnable command) {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/schedule/DummyJob.java b/storage/common/src/main/java/org/artifactory/schedule/DummyJob.java
deleted file mode 100644
index 958302e..0000000
--- a/storage/common/src/main/java/org/artifactory/schedule/DummyJob.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.artifactory.schedule;
-
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.springframework.security.core.Authentication;
-
-/**
- * @author Chen Keinan
- */
-
-/**
- *  this job is the default job to be used as default on Stop Command annotation
- */
-public class DummyJob extends TaskCallback {
-    @Override
-    protected String triggeringTaskTokenFromWorkContext(JobExecutionContext workContext) {
-        return null;
-    }
-
-    @Override
-    protected Authentication getAuthenticationFromWorkContext(JobExecutionContext callbackContext) {
-        return null;
-    }
-
-    @Override
-    protected boolean isRunOnlyOnMaster(JobExecutionContext jobContext) {
-        return false;
-    }
-
-    @Override
-    protected void onExecute(JobExecutionContext callbackContext) throws JobExecutionException {
-
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/schedule/JobCommand.java b/storage/common/src/main/java/org/artifactory/schedule/JobCommand.java
deleted file mode 100644
index 0028973..0000000
--- a/storage/common/src/main/java/org/artifactory/schedule/JobCommand.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * User: freds Date: 7/6/11 Time: 4:34 PM
- */
- at Target({ElementType.TYPE})
- at Retention(RetentionPolicy.RUNTIME)
- at Inherited
- at Documented
-public @interface JobCommand {
-    boolean singleton() default false;
-
-    TaskUser schedulerUser() default TaskUser.INVALID;
-
-    /**
-     * Set to allow manual activation and provide strategy for finding authentication token.
-     */
-    TaskUser manualUser() default TaskUser.INVALID;
-
-    StopCommand[] commandsToStop() default {};
-
-    String[] keyAttributes() default {};
-
-    boolean runOnlyOnPrimary() default TaskBase.DEFAULT_TASK_RUN_ONLY_ON_PRIMARY;
-
-    /**
-     * Short optional description of the job.
-     */
-    String description() default "";
-}
-
diff --git a/storage/common/src/main/java/org/artifactory/schedule/ScheduleJobEnum.java b/storage/common/src/main/java/org/artifactory/schedule/ScheduleJobEnum.java
deleted file mode 100644
index 2b2f4ce..0000000
--- a/storage/common/src/main/java/org/artifactory/schedule/ScheduleJobEnum.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.artifactory.schedule;
-
-/**
- * @author Chen Keinan
- */
-public enum ScheduleJobEnum {
-
-    DUMMY_JOB ("org.artifactory.schedule.DummyJob"),
-    ARCHIVE_INDEXER_JOB("org.artifactory.search.archive.ArchiveIndexerImpl$ArchiveIndexJob");
-
-    public String jobName;
-
-    ScheduleJobEnum(String keyName) {
-        this.jobName = keyName;
-         }
-    }
diff --git a/storage/common/src/main/java/org/artifactory/schedule/StopCommand.java b/storage/common/src/main/java/org/artifactory/schedule/StopCommand.java
deleted file mode 100644
index 7fa903b..0000000
--- a/storage/common/src/main/java/org/artifactory/schedule/StopCommand.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-import static org.artifactory.schedule.ScheduleJobEnum.DUMMY_JOB;
-
-/**
- * Date: 9/4/11 Time: 5:54 PM
- *
- * @author Fred Simon
- */
- at Retention(RetentionPolicy.RUNTIME)
-public @interface StopCommand {
-    Class<? extends TaskCallback> command() default DummyJob.class;
-
-    ScheduleJobEnum commandName() default DUMMY_JOB;
-
-    StopStrategy strategy();
-
-    boolean useKey() default false;
-}
diff --git a/storage/common/src/main/java/org/artifactory/schedule/StopStrategy.java b/storage/common/src/main/java/org/artifactory/schedule/StopStrategy.java
deleted file mode 100644
index 753cc8f..0000000
--- a/storage/common/src/main/java/org/artifactory/schedule/StopStrategy.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-/**
- * User: freds Date: 7/10/11 Time: 8:19 PM
- */
-public enum StopStrategy {
-    STOP, IMPOSSIBLE, PAUSE
-}
diff --git a/storage/common/src/main/java/org/artifactory/schedule/Task.java b/storage/common/src/main/java/org/artifactory/schedule/Task.java
deleted file mode 100644
index 962efbb..0000000
--- a/storage/common/src/main/java/org/artifactory/schedule/Task.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-import org.artifactory.concurrent.StateAware;
-
-/**
- * Represents the control unit over execution (as opposed to the actual work callback). Has a state that can be
- * controlled through the {@link TaskService}.
- * <p/>
- *
- * @author Yoav Landman
- */
-public interface Task extends StateAware {
-    String TASK_TOKEN = "TASK_TOKEN";
-    String TASK_AUTHENTICATION = "TASK_AUTHENTICATION";
-    String TASK_RUN_ONLY_ON_PRIMARY = "TASK_RUN_ONLY_ON_PRIMARY";
-    String REPO_KEY = "repoKey";
-    String PUSH_REPLICATION_URL = "repoUrl";
-
-    boolean DEFAULT_TASK_RUN_ONLY_ON_PRIMARY = true; //default is run only on master
-
-    Class getType();
-
-    String getToken();
-
-    boolean isRunning();
-
-    Object getAttribute(String key);
-
-    boolean keyEquals(Object... keyValues);
-
-    boolean keyEquals(Task task);
-
-    Object[] getKeyValues();
-}
diff --git a/storage/common/src/main/java/org/artifactory/schedule/TaskBase.java b/storage/common/src/main/java/org/artifactory/schedule/TaskBase.java
deleted file mode 100644
index 49c36a9..0000000
--- a/storage/common/src/main/java/org/artifactory/schedule/TaskBase.java
+++ /dev/null
@@ -1,671 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-import org.artifactory.common.ConstantValues;
-import org.artifactory.concurrent.LockingException;
-import org.artifactory.concurrent.State;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.locks.Condition;
-import java.util.concurrent.locks.ReentrantLock;
-
-/**
- * @author Yoav Landman
- */
-public abstract class TaskBase implements Task {
-    private static final Logger log = LoggerFactory.getLogger(TaskBase.class);
-
-    private TaskState state;
-    //TODO: [by fsi] should use StateManager
-    private final ReentrantLock stateSync;
-    private final Condition stateChanged;
-    private final Condition completed;
-    private boolean executed;
-
-    // Initialized from JobCommand annotation
-    private boolean singleton;
-    private boolean manuallyActivated;
-
-    /**
-     * Prevents resuming a task until all stoppers/pausers have resumed it
-     */
-    private int resumeBarriersCount;
-    private final Class<? extends TaskCallback> callbackType;
-    // last time in millis this task was started. set whenever this task start running
-    private long lastStarted;
-
-    @SuppressWarnings({"unchecked"})
-    protected TaskBase(Class<? extends TaskCallback> callbackType) {
-        state = TaskState.VIRGIN;
-        stateSync = new ReentrantLock();
-        stateChanged = stateSync.newCondition();
-        completed = stateSync.newCondition();
-        executed = false;
-        resumeBarriersCount = 0;
-        this.callbackType = callbackType;
-    }
-
-    @Override
-    public State getInitialState() {
-        return TaskState.VIRGIN;
-    }
-
-    public boolean waitingForProcess() {
-        return state == TaskState.PAUSING || state == TaskState.STOPPING;
-    }
-
-    @Override
-    public boolean isRunning() {
-        return state == TaskState.RUNNING || waitingForProcess();
-    }
-
-    public boolean processActive() {
-        return isRunning() || state == TaskState.PAUSED;
-    }
-
-    void schedule(boolean waitForRunning) {
-        lockState();
-        try {
-            scheduleTask();
-            guardedTransitionToState(TaskState.SCHEDULED, waitForRunning);
-        } finally {
-            unlockState();
-        }
-    }
-
-    void cancel(boolean wait) {
-        lockState();
-        try {
-            log.trace("Entering cancel with state {} on {}", state, this);
-            if (processActive() && !wait) {
-                throw new IllegalStateException("Cannot cancel immediately an active task " + this);
-            }
-
-            if (processActive()) {
-                log.trace("Waiting for active task: {} to finish.", this);
-                if (waitingForProcess()) {
-                    guardedWaitForNextStep();
-                }
-                if (processActive()) {
-                    guardedTransitionToState(TaskState.STOPPING, wait);
-                }
-            }
-            if (state == TaskState.CANCELED) {
-                log.info("Task {} already canceled.", this);
-            } else {
-                log.debug("Canceling task: {}.", this);
-                guardedSetState(TaskState.CANCELED);
-            }
-            cancelTask();
-        } finally {
-            unlockState();
-        }
-    }
-
-    void pause(boolean wait) {
-        lockState();
-        try {
-            log.trace("Entering pause with state {} on {}", state, this);
-            if (state == TaskState.VIRGIN) {
-                throw new IllegalStateException("Cannot stop a virgin task.");
-            } else if (state == TaskState.RUNNING) {
-                if (!wait) {
-                    throw new IllegalStateException("Cannot pause immediately a running task " + this);
-                }
-                resumeBarriersCount++;
-                log.trace("resumeBarriersCount++ to {} after pause while running on {}", resumeBarriersCount, this);
-                guardedTransitionToState(TaskState.PAUSING, wait);
-            } else if (state == TaskState.STOPPING) {
-                // Already stopping, waiting for stop
-                if (!wait) {
-                    throw new IllegalStateException("Cannot pause immediately a stopping task " + this);
-                }
-                resumeBarriersCount++;
-                log.trace("resumeBarriersCount++ to {} after pause while stopping on {}", resumeBarriersCount, this);
-                guardedWaitForNextStep();
-            } else if (state == TaskState.PAUSED || state == TaskState.PAUSING) {
-                // Already paused, just count the barrier
-                resumeBarriersCount++;
-                log.trace("resumeBarriersCount++ to {} after pause already paused on {}", resumeBarriersCount, this);
-            } else if (state == TaskState.CANCELED) {
-                // Task canceled, forget it => do nothing
-            } else {
-                // Not running, just count the barrier, and set to stop
-                resumeBarriersCount++;
-                log.trace("resumeBarriersCount++ to {} after pause on {}", resumeBarriersCount, this);
-                if (state != TaskState.STOPPED) {
-                    guardedSetState(TaskState.STOPPED);
-                }
-            }
-        } finally {
-            unlockState();
-        }
-    }
-
-    /**
-     * Stops but does not unschedule the task (can transition back to running state)
-     *
-     * @param wait
-     */
-    void stop(boolean wait) {
-        lockState();
-        try {
-            log.trace("Entering stop with state {} on {}", state, this);
-            if (state == TaskState.VIRGIN) {
-                throw new IllegalStateException("Cannot stop a virgin task.");
-            } else if (state == TaskState.RUNNING || state == TaskState.PAUSING) {
-                if (!wait) {
-                    throw new IllegalStateException("Cannot stop immediately a running task " + this);
-                }
-                //Stop
-                resumeBarriersCount++;
-                log.trace("resumeBarriersCount++ to {} after stop on {}", resumeBarriersCount, this);
-                guardedTransitionToState(TaskState.STOPPING, wait);
-            } else if (state == TaskState.CANCELED) {
-                // Task canceled, forget it => do nothing
-            } else if (state == TaskState.STOPPED || state == TaskState.STOPPING) {
-                // Already stopped, just count the barrier
-                resumeBarriersCount++;
-                log.trace("resumeBarriersCount++ to {} after stop already stopped on {}", resumeBarriersCount, this);
-                if (state == TaskState.STOPPING) {
-                    guardedWaitForNextStep();
-                }
-            } else {
-                //For both stop and pause
-                resumeBarriersCount++;
-                log.trace("resumeBarriersCount++ to {} after stop on {}", resumeBarriersCount, this);
-                guardedSetState(TaskState.STOPPED);
-            }
-        } finally {
-            unlockState();
-        }
-    }
-
-    boolean resume() {
-        lockState();
-        try {
-            if (state == TaskState.CANCELED) {
-                throw new IllegalStateException("Cannot resume a canceled task.");
-            }
-            if (resumeBarriersCount > 0) {
-                resumeBarriersCount--;
-            } else {
-                log.info("Skipping resume since there are no active resume barriers " +
-                        "(probably invoked resume() more than needed).");
-                return true;
-            }
-            log.trace("resumeBarriersCount-- to {} after resume on {}", resumeBarriersCount, this);
-            if (resumeBarriersCount > 0) {
-                log.debug("Cannot resume while there are still {} resume barriers.", resumeBarriersCount);
-                return false;
-            }
-            if (state == TaskState.PAUSED || state == TaskState.PAUSING) {
-                guardedSetState(TaskState.RUNNING);
-            } else if (state == TaskState.STOPPED || state == TaskState.STOPPING) {
-                //Nothing to do for single execution - either resume from pause or reached stopped
-                //if resume by a different thread
-                if (!isSingleExecution()) {
-                    guardedSetState(TaskState.SCHEDULED);
-                }
-            }
-            return true;
-        } finally {
-            unlockState();
-        }
-    }
-
-    @Override
-    public Class<? extends TaskCallback> getType() {
-        return callbackType;
-    }
-
-    /**
-     * @return Unique token of this task.
-     */
-    public abstract String getToken();
-
-    /**
-     * @return Optional task description.
-     */
-    public abstract String getDescription();
-
-    /**
-     * Starts or schedules the task
-     */
-    protected abstract void scheduleTask();
-
-    /**
-     * Stops or unschedules the task
-     */
-    protected abstract void cancelTask();
-
-    /**
-     * Needs to be called from the execution loop of the task that wants to check if to pause or to stop
-     *
-     * @return
-     */
-    public boolean blockIfPausedAndShouldBreak() {
-        lockState();
-        //if running continue, if pausing transition to pause else exit
-        try {
-            if (state == TaskState.PAUSING) {
-                guardedSetState(TaskState.PAUSED);
-            }
-            try {
-                log.trace("Entering wait for out of paused on: {}", this);
-                int tries = ConstantValues.taskCompletionLockTimeoutRetries.getInt();
-                long timeout = ConstantValues.locksTimeoutSecs.getLong();
-                while (state == TaskState.PAUSED) {
-                    stateChanged.await(timeout, TimeUnit.SECONDS);
-                    tries--;
-                    if (tries <= 0) {
-                        throw new LockingException("Task " + this + " paused for more than " +
-                                ConstantValues.taskCompletionLockTimeoutRetries.getInt() + " times.");
-                    }
-                    log.trace("One wait for out of paused from on {}", this);
-                }
-            } catch (InterruptedException e) {
-                catchInterrupt(TaskState.PAUSED);
-            }
-            return state != TaskState.RUNNING;
-        } finally {
-            unlockState();
-        }
-    }
-
-    /**
-     * Whether this task is non-cyclic one and is canceled after a single execution
-     *
-     * @return
-     */
-    public boolean isSingleExecution() {
-        return false;
-    }
-
-    /**
-     * Weather the task with this callback type should be unique on the task service.
-     * i.e., not other task with the same type should ever be running.
-     *
-     * @return True if this task should be unique
-     */
-    public boolean isSingleton() {
-        return singleton;
-    }
-
-    public void setSingleton(boolean singleton) {
-        this.singleton = singleton;
-    }
-
-    public boolean isManuallyActivated() {
-        return manuallyActivated;
-    }
-
-    public void setManuallyActivated(boolean manuallyActivated) {
-        this.manuallyActivated = manuallyActivated;
-    }
-
-    public boolean wasCompleted() {
-        if (!isSingleExecution()) {
-            throw new UnsupportedOperationException("Does not support waitForCompletion on cyclic tasks.");
-        }
-        return executed && (state == TaskState.STOPPED || state == TaskState.CANCELED);
-    }
-
-    /**
-     * Wait for the task to stop running
-     *
-     * @return
-     */
-    boolean waitForCompletion(long timeout) {
-        if (!isSingleExecution()) {
-            throw new UnsupportedOperationException("Does not support waitForCompletion on cyclic tasks.");
-        }
-        if (!isRunning()) {
-            // The task may have already complete
-            return true;
-        }
-        boolean completed = false;
-        lockState();
-        try {
-            try {
-                //Wait forever (tries * lock timeout) until it finished the current execution
-                if (timeout == 0) {
-                    timeout = ConstantValues.locksTimeoutSecs.getLong() * ConstantValues.taskCompletionLockTimeoutRetries.getInt();
-                }
-                long start = System.currentTimeMillis();
-                while (true) {
-                    // If already executed (passed to running state) and now stooped or canceled
-                    //   => It means already completed
-                    if (executed) {
-                        if (state == TaskState.STOPPED || state == TaskState.CANCELED) {
-                            completed = true;
-                            break;
-                        }
-                    }
-                    // Waiting on the completed condition
-                    boolean success = this.completed.await(ConstantValues.locksTimeoutSecs.getLong(), TimeUnit.SECONDS);
-                    if (success) {
-                        completed = true;
-                        break;
-                    }
-                    if (start + timeout >= System.currentTimeMillis()) {
-                        throw new LockingException("Waited for task " + this + " more than " + timeout + "ms.");
-                    }
-                }
-            } catch (InterruptedException e) {
-                catchInterrupt(state);
-            }
-        } finally {
-            unlockState();
-        }
-        return completed;
-    }
-
-    boolean started() {
-        boolean shouldExecute = false;
-        lockState();
-        //Check if should run
-        try {
-            if (state == TaskState.SCHEDULED) {
-                guardedSetState(TaskState.RUNNING);
-                shouldExecute = true;
-            }
-        } finally {
-            unlockState();
-        }
-        return shouldExecute;
-    }
-
-    void completed() {
-        lockState();
-        try {
-            if (state == TaskState.STOPPED) {
-                //Do nothing
-                return;
-            }
-            if (state == TaskState.PAUSED || state == TaskState.STOPPING || state == TaskState.PAUSING) {
-                guardedSetState(TaskState.STOPPED);
-            } else if (state != TaskState.CANCELED) {
-                if (isSingleExecution()) {
-                    guardedSetState(TaskState.STOPPED);
-                } else if (state != TaskState.SCHEDULED) {
-                    //Could be on SCHEDULED if resumed after stopped
-                    guardedSetState(TaskState.SCHEDULED);
-                }
-            }
-            completed.signal();
-        } finally {
-            unlockState();
-        }
-    }
-
-    private <V> V guardedTransitionToState(TaskState newState, boolean waitForNextStep) {
-        V result = null;
-        if (state == newState) {
-            return result;
-        }
-        guardedSetState(newState);
-        if (waitForNextStep) {
-            guardedWaitForNextStep();
-        }
-        return result;
-    }
-
-    private TaskState guardedWaitForNextStep() {
-        long timeout = ConstantValues.locksTimeoutSecs.getLong();
-        return guardedWaitForNextStep(timeout);
-    }
-
-    private TaskState guardedWaitForNextStep(long timeout) {
-        TaskState oldState = state;
-        TaskState newState = oldState;
-        try {
-            log.trace("Entering wait for next step from {} on: {}", oldState, this);
-            while (state == oldState) {
-                boolean success = stateChanged.await(timeout, TimeUnit.SECONDS);
-                if (!success) {
-                    throw new LockingException(
-                            "Timeout after " + timeout + " seconds when trying to wait for next state in '" + oldState +
-                                    "'."
-                    );
-                }
-                newState = state;
-                log.trace("Exiting wait for next step from {} to {} on {}", oldState, newState, this);
-            }
-        } catch (InterruptedException e) {
-            catchInterrupt(oldState);
-        }
-        return newState;
-    }
-
-    private void guardedSetState(TaskState newState) {
-        boolean validNewState = state.canTransitionTo(newState);
-        if (!validNewState) {
-            throw new IllegalArgumentException("Cannot transition from " + this.state + " to " + newState + ".");
-        }
-        log.trace("Changing state: {}: {}-->{}", this.toString(), this.state, newState);
-        state = newState;
-        if (state == TaskState.RUNNING) {
-            executed = true;
-            lastStarted = System.currentTimeMillis();
-        } else if (state == TaskState.SCHEDULED) {
-            executed = false;
-        }
-        stateChanged.signal();
-    }
-
-    private void lockState() {
-        try {
-            int holdCount = stateSync.getHoldCount();
-            log.trace("Thread {} trying lock (activeLocks={}) on {}",
-                    Thread.currentThread(), holdCount, this);
-            if (holdCount > 0) {
-                //Clean all and throw
-                while (holdCount > 0) {
-                    stateSync.unlock();
-                    holdCount--;
-                }
-                throw new LockingException("Locking an already locked task state: " +
-                        this + " active lock(s) already active!");
-            }
-            boolean success = stateSync.tryLock() ||
-                    stateSync.tryLock(getStateLockTimeOut(), TimeUnit.SECONDS);
-            if (!success) {
-                throw new LockingException(
-                        "Could not acquire state lock in " + getStateLockTimeOut() + " secs");
-            }
-        } catch (InterruptedException e) {
-            log.warn("Interrupted while trying to lock {}.", this);
-        }
-    }
-
-    private long getStateLockTimeOut() {
-        return ConstantValues.locksTimeoutSecs.getLong();
-    }
-
-    private void unlockState() {
-        log.trace("Unlocking {}", this);
-        stateSync.unlock();
-    }
-
-    private static void catchInterrupt(TaskState state) {
-        log.warn("Interrupted during state wait from '{}'.", state);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof TaskBase)) {
-            return false;
-        }
-        TaskBase base = (TaskBase) o;
-        return getToken().equals(base.getToken());
-    }
-
-    @Override
-    public int hashCode() {
-        return getToken().hashCode();
-    }
-
-    @Override
-    public String toString() {
-        return getToken();
-    }
-
-    public abstract void addAttribute(String key, Object value);
-
-    @Override
-    public boolean keyEquals(Object... keyValues) {
-        JobCommand jobCommand = this.getType().getAnnotation(JobCommand.class);
-        String[] keys = jobCommand.keyAttributes();
-        if (keyValues.length != keys.length) {
-            throw new IllegalArgumentException("Cannot compare key values for task " + getType() + "\n" +
-                    "Received " + Arrays.toString(keyValues) + " and expected values for " + Arrays.toString(keys));
-        }
-        for (int i = 0; i < keys.length; i++) {
-            Object attribute = getAttribute(keys[i]);
-            if (attribute == null) {
-                log.warn("Task attribute is NULL: {}, given keyValues: {}", keys[i], keyValues);
-                return false;
-            }
-            if (!attribute.equals(keyValues[i])) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    @Override
-    public boolean keyEquals(Task task) {
-        JobCommand otherJobCommand = (JobCommand) task.getType().getAnnotation(JobCommand.class);
-        JobCommand myJobCommand = this.getType().getAnnotation(JobCommand.class);
-        String[] myKeys = myJobCommand.keyAttributes();
-        String[] otherKeys = otherJobCommand.keyAttributes();
-        if (!Arrays.equals(myKeys, otherKeys)) {
-            throw new IllegalArgumentException(
-                    "Cannot compare key values between task " + this + " and task " + task + "\n" +
-                            "Keys " + Arrays.toString(myKeys) + " not equals to " + Arrays.toString(otherKeys)
-            );
-        }
-        for (String key : myKeys) {
-            if (!getAttribute(key).equals(task.getAttribute(key))) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    @Override
-    public Object[] getKeyValues() {
-        JobCommand myJobCommand = this.getType().getAnnotation(JobCommand.class);
-        String[] myKeys = myJobCommand.keyAttributes();
-        Object[] result = new Object[myKeys.length];
-        for (int i = 0; i < myKeys.length; i++) {
-            result[i] = getAttribute(myKeys[i]);
-        }
-        return result;
-    }
-
-    public long getLastStarted() {
-        return lastStarted;
-    }
-
-    public TaskState getCurrentState() {
-        return state;
-    }
-
-    public enum TaskState implements State {
-        VIRGIN,
-        SCHEDULED,
-        RUNNING,
-        PAUSING,
-        STOPPING,
-        STOPPED, //Will not start if refired by the scheduler
-        PAUSED, //Blocked by executions thread (and will not start if refired by scheduler)
-        CANCELED;
-
-        @Override
-        @SuppressWarnings({"SuspiciousMethodCalls"})
-        public boolean canTransitionTo(State newState) {
-            Set<TaskState> states = getPossibleTransitionStates(this);
-            return states.contains(newState);
-        }
-
-        @SuppressWarnings({"OverlyComplexMethod"})
-        private static Set<TaskState> getPossibleTransitionStates(TaskState oldState) {
-            HashSet<TaskState> states = new HashSet<>();
-            switch (oldState) {
-                case VIRGIN:
-                    states.add(TaskState.SCHEDULED);
-                    states.add(TaskState.CANCELED);
-                    return states;
-                case SCHEDULED:
-                    states.add(TaskState.RUNNING);
-                    states.add(TaskState.PAUSING);
-                    states.add(TaskState.STOPPING);
-                    states.add(TaskState.STOPPED);
-                    states.add(TaskState.CANCELED);
-                    return states;
-                case RUNNING:
-                    states.add(TaskState.PAUSING);
-                    states.add(TaskState.STOPPING);
-                    states.add(TaskState.STOPPED);
-                    states.add(TaskState.CANCELED);
-                    states.add(TaskState.SCHEDULED);
-                    return states;
-                case PAUSING:
-                    states.add(TaskState.PAUSED);
-                    states.add(TaskState.RUNNING);
-                    states.add(TaskState.STOPPING);
-                    states.add(TaskState.STOPPED);
-                    states.add(TaskState.CANCELED);
-                    return states;
-                case PAUSED:
-                    states.add(TaskState.RUNNING);
-                    states.add(TaskState.STOPPING);
-                    states.add(TaskState.STOPPED);
-                    states.add(TaskState.CANCELED);
-                    return states;
-                case STOPPING:
-                    states.add(TaskState.CANCELED);
-                case STOPPED:
-                    states.add(TaskState.STOPPED);
-                    states.add(TaskState.RUNNING);
-                    states.add(TaskState.SCHEDULED);
-                    states.add(TaskState.CANCELED);
-                    return states;
-                case CANCELED:
-                    //Unscheduled
-                    return states;
-                default:
-                    throw new IllegalArgumentException(
-                            "No transitions defined for state: " + oldState);
-            }
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/schedule/TaskCallback.java b/storage/common/src/main/java/org/artifactory/schedule/TaskCallback.java
deleted file mode 100644
index fd27f60..0000000
--- a/storage/common/src/main/java/org/artifactory/schedule/TaskCallback.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-import com.google.common.collect.Lists;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.storage.spring.ArtifactoryStorageContext;
-import org.artifactory.storage.spring.StorageContextHelper;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-
-import java.util.List;
-
-/**
- * A callback for doing the actual work of a scheduled {@link Task}, with some typed work context
- *
- * @author yoavl
- */
-public abstract class TaskCallback<C extends JobExecutionContext> {
-    private static final Logger log = LoggerFactory.getLogger(TaskCallback.class);
-
-    private static final InheritableThreadLocal<String> currentTaskToken = new InheritableThreadLocal<>();
-
-    public static String currentTaskToken() {
-        return currentTaskToken.get();
-    }
-
-    private TaskBase activeTask;
-    private List<String> tasksStopped = Lists.newArrayList();
-
-    protected abstract String triggeringTaskTokenFromWorkContext(C workContext);
-
-    protected abstract Authentication getAuthenticationFromWorkContext(C callbackContext);
-
-    protected abstract boolean isRunOnlyOnMaster(C jobContext);
-
-    protected boolean beforeExecute(C callbackContext) {
-        ArtifactoryStorageContext context = StorageContextHelper.get();
-        if (context == null || !context.isReady()) {
-            log.debug("Task {} was requested to execute before context {} completed initialization and will be skipped",
-                    this, context);
-            return false;
-        }
-        String taskToken = triggeringTaskTokenFromWorkContext(callbackContext);
-        currentTaskToken.set(taskToken);
-        Authentication authentication = getAuthenticationFromWorkContext(callbackContext);
-        SecurityContextHolder.getContext().setAuthentication(authentication);
-        TaskService taskService = getTaskService();
-        activeTask = taskService.getInternalActiveTask(taskToken, true);
-        if (activeTask == null) {
-            log.warn("Before execute: Could not locate active task with token {}. Task {} may have been canceled.",
-                    taskToken, this);
-            return false;
-        }
-        this.tasksStopped.clear();
-        try {
-            taskService.stopRelatedTasks(activeTask.getType(), this.tasksStopped, activeTask.getKeyValues());
-        } catch (TaskImpossibleToStartException e) {
-            log.debug("Task " + taskToken + " prohibited from running: " + e.getMessage(), e);
-            return false;
-        } catch (Exception e) {
-            log.warn("Couldn't start task " + taskToken + ": " + e.getMessage());
-            log.debug("Couldn't start task " + taskToken + ": " + e.getMessage(), e);
-            return false;
-        }
-
-        //check for HA
-        if (isRunOnlyOnMaster(callbackContext)) {
-            HaCommonAddon haCommonAddon = context.beanForType(AddonsManager.class).addonByType(HaCommonAddon.class);
-            if (!haCommonAddon.isPrimary()) {
-                log.debug("Could not start task {}: the task can only run on master", taskToken);
-                return false;
-            }
-        }
-
-        return activeTask.started();
-    }
-
-    protected abstract void onExecute(C callbackContext) throws JobExecutionException;
-
-    protected void afterExecute() {
-        try {
-            String token = currentTaskToken();
-            if (token == null) {
-                //We were not started (probably deferred due to context not being ready)
-                return;
-            }
-            //Notify listeners that we are done
-            if (activeTask != null) {
-                activeTask.completed();
-                if (activeTask.isSingleExecution()) {
-                    TaskService taskService = getTaskService();
-                    //Cancel the active task
-                    taskService.cancelTask(token, true);
-                }
-            } else {
-                log.warn("After execute: Could not locate active task with token {}. Task may have been canceled.",
-                        token);
-            }
-            log.debug("Finished task {}.", token);
-        } finally {
-            if (!tasksStopped.isEmpty()) {
-                try {
-                    TaskService taskService = getTaskService();
-                    for (String taskToken : tasksStopped) {
-                        try {
-                            taskService.resumeTask(taskToken);
-                        } catch (Exception e) {
-                            log.warn("After execute: Could not locate reactive task with token {}", taskToken);
-                        }
-                    }
-                } finally {
-                    tasksStopped.clear();
-                }
-            }
-            SecurityContextHolder.getContext().setAuthentication(null);
-            activeTask = null;
-            currentTaskToken.remove();
-        }
-    }
-
-    protected static TaskService getTaskService() {
-        return StorageContextHelper.get().getTaskService();
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/schedule/TaskImpossibleToStartException.java b/storage/common/src/main/java/org/artifactory/schedule/TaskImpossibleToStartException.java
deleted file mode 100644
index 248651b..0000000
--- a/storage/common/src/main/java/org/artifactory/schedule/TaskImpossibleToStartException.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-/**
- * Indicates that a task is prohibited from running by the task execution strategy
- *
- * @author Yoav Luft
- */
-public class TaskImpossibleToStartException extends RuntimeException {
-
-    public TaskImpossibleToStartException(String message) {
-        super(message);
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/schedule/TaskInterruptedException.java b/storage/common/src/main/java/org/artifactory/schedule/TaskInterruptedException.java
deleted file mode 100644
index d26503b..0000000
--- a/storage/common/src/main/java/org/artifactory/schedule/TaskInterruptedException.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-/**
- * Thrown by a running job when it is interrupted and it needs to throw an exception to break the operation.
- *
- * @author Yossi Shaul
- */
-public class TaskInterruptedException extends RuntimeException {
-
-    public TaskInterruptedException() {
-        super("Task " + TaskCallback.currentTaskToken() + " interrupted.");
-    }
-
-    public TaskInterruptedException(String message) {
-        super(message);
-    }
-
-    public TaskInterruptedException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/schedule/TaskService.java b/storage/common/src/main/java/org/artifactory/schedule/TaskService.java
deleted file mode 100644
index 857163f..0000000
--- a/storage/common/src/main/java/org/artifactory/schedule/TaskService.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.spring.ReloadableBean;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.List;
-import java.util.function.Predicate;
-
-/**
- * @author yoavl
- */
-public interface TaskService extends ReloadableBean {
-
-    /**
-     * Schedules a tasks and returns its unique token
-     *
-     * @param task  The task to add to the scheduler
-     * @param waitForRunning    If true, the method will return only after the task has started executing
-     * @return The unique token of this task
-     */
-    String startTask(TaskBase task, boolean waitForRunning);
-
-    /**
-     * Starts a task and returns its token
-     *
-     * @param task
-     * @param waitForRunning
-     * @param propagateToMaster propagate to master on HA environment when job is
-     *                          configured to {@link JobCommand#runOnlyOnPrimary()} and current member is not the master
-     * @return the token of this task
-     */
-    String startTask(TaskBase task, boolean waitForRunning, boolean propagateToMaster);
-
-    /**
-     * Cancels and stops the task
-     *
-     * @param token The task token
-     * @param wait  Whether to return immediately or wait for the tesk to be stopped
-     * @return true if the task is actually stopped, false if already stopped
-     */
-    void stopTask(String token, boolean wait);
-
-    /**
-     * Pause a task
-     *
-     * @param token
-     * @param wait
-     */
-    void pauseTask(String token, boolean wait);
-
-    /**
-     * If the task has been canceled (unscheduled) returns true to signal the caller that it needs to break from the
-     * task's execution loop. If the task has been paused will simply pause the caller (and thus, the caller's execution
-     * loop).
-     *
-     * @return true if the caller needs break from the task's callback execution loop
-     */
-    boolean pauseOrBreak();
-
-    /**
-     * Cancels and stops all active tasks of the specified type
-     *
-     * @param callbackType
-     * @return true if tasks were stops, false if all already stopped
-     */
-    List<String> stopTasks(Class<? extends TaskCallback> callbackType);
-
-    /**
-     * Resume a paused task
-     *
-     * @param token
-     * @return true if managed to resume, false if there are additional stop/pause holders
-     */
-    boolean resumeTask(String token);
-
-    /**
-     * Cancels (unschedules) a task
-     *
-     * @param wait
-     */
-    void cancelTask(String token, boolean wait);
-
-    /**
-     * Cancels all tasks of a certain type
-     *
-     * @param callbackType
-     */
-    void cancelTasks(@Nonnull Class<? extends TaskCallback> callbackType, boolean wait);
-
-    /**
-     * Cancels all tasks
-     */
-    void cancelAllTasks(boolean wait);
-
-    /**
-     * Awaits task execution to be finished
-     *
-     * @param token
-     * @return true if execution completed, otherwise false if completed outside the execution loop
-     */
-    boolean waitForTaskCompletion(String token);
-
-    /**
-     * Returns the actual task object.
-     * <p/>
-     * THIS SHOULD BE CALLED BY PRIVATE API ONLY!
-     * <p/>
-     * Only exists since spring jdk-proxies with which the internal api works are interfaces.
-     *
-     * @param token
-     * @param warnIfMissing
-     */
-    TaskBase getInternalActiveTask(String token, boolean warnIfMissing);
-
-    /**
-     * @param callbackType Type of callback to check if exists
-     * @return True if a task with the callback type already exists
-     */
-    boolean hasTaskOfType(Class<? extends TaskCallback> callbackType);
-
-    void cancelTasks(@Nullable Predicate<Task> predicate, boolean wait);
-
-    List<TaskBase> getActiveTasks(@Nonnull Predicate<Task> predicate);
-
-    void checkCanStartManualTask(Class<? extends TaskCallback> typeToRun, MutableStatusHolder statusHolder,
-            Object... keyValues);
-
-    void stopRelatedTasks(Class<? extends TaskCallback> typeToRun, List<String> tokenStopped, Object... keyValues);
-
-    boolean waitForTaskCompletion(String token, long timeout);
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/schedule/TaskUser.java b/storage/common/src/main/java/org/artifactory/schedule/TaskUser.java
deleted file mode 100644
index 3c04405..0000000
--- a/storage/common/src/main/java/org/artifactory/schedule/TaskUser.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule;
-
-/**
- * User: freds Date: 7/6/11 Time: 5:31 PM
- */
-public enum TaskUser {
-    INVALID, SYSTEM, CURRENT, ANONYMOUS
-}
diff --git a/storage/common/src/main/java/org/artifactory/schedule/mbean/ManagedExecutor.java b/storage/common/src/main/java/org/artifactory/schedule/mbean/ManagedExecutor.java
deleted file mode 100644
index e2af022..0000000
--- a/storage/common/src/main/java/org/artifactory/schedule/mbean/ManagedExecutor.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.artifactory.schedule.mbean;
-
-import org.artifactory.schedule.ArtifactoryConcurrentExecutor;
-
-/**
- * MBean wrapper for {@link org.artifactory.schedule.ArtifactoryConcurrentExecutor}
- *
- * @author mamo
- */
-public class ManagedExecutor implements ManagedExecutorMBean {
-
-    private final ArtifactoryConcurrentExecutor artifactoryConcurrentExecutor;
-
-    public ManagedExecutor(ArtifactoryConcurrentExecutor artifactoryConcurrentExecutor) {
-        this.artifactoryConcurrentExecutor = artifactoryConcurrentExecutor;
-    }
-
-    @Override
-    public int getActiveCount() {
-        return artifactoryConcurrentExecutor.getActiveCount();
-    }
-
-    @Override
-    public long getCompletedTaskCount() {
-        return artifactoryConcurrentExecutor.getCompletedTaskCount();
-    }
-
-    @Override
-    public int getCorePoolSize() {
-        return artifactoryConcurrentExecutor.getCorePoolSize();
-    }
-
-    @Override
-    public int getLargestPoolSize() {
-        return artifactoryConcurrentExecutor.getLargestPoolSize();
-    }
-
-    @Override
-    public int getMaximumPoolSize() {
-        return artifactoryConcurrentExecutor.getMaximumPoolSize();
-    }
-
-    @Override
-    public long getTaskCount() {
-        return artifactoryConcurrentExecutor.getTaskCount();
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/schedule/mbean/ManagedExecutorMBean.java b/storage/common/src/main/java/org/artifactory/schedule/mbean/ManagedExecutorMBean.java
deleted file mode 100644
index 297fbf1..0000000
--- a/storage/common/src/main/java/org/artifactory/schedule/mbean/ManagedExecutorMBean.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.schedule.mbean;
-
-/**
- * MBean wrapper for {@link org.artifactory.schedule.ArtifactoryConcurrentExecutor}
- *
- * @author mamo
- */
-public interface ManagedExecutorMBean {
-
-    int getActiveCount();
-
-    long getCompletedTaskCount();
-
-    int getCorePoolSize();
-
-    int getLargestPoolSize();
-
-    int getMaximumPoolSize();
-
-    long getTaskCount();
-}
diff --git a/storage/common/src/main/java/org/artifactory/schedule/quartz/QuartzCommand.java b/storage/common/src/main/java/org/artifactory/schedule/quartz/QuartzCommand.java
deleted file mode 100644
index 39ac5b3..0000000
--- a/storage/common/src/main/java/org/artifactory/schedule/quartz/QuartzCommand.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.schedule.quartz;
-
-import org.artifactory.schedule.Task;
-import org.artifactory.schedule.TaskCallback;
-import org.quartz.DisallowConcurrentExecution;
-import org.quartz.Job;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.quartz.PersistJobDataAfterExecution;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.core.Authentication;
-
-/**
- * @author yoavl
- */
- at PersistJobDataAfterExecution
- at DisallowConcurrentExecution
-public abstract class QuartzCommand extends TaskCallback<JobExecutionContext> implements Job {
-    private static final Logger log = LoggerFactory.getLogger(QuartzCommand.class);
-
-    @Override
-    public final void execute(final JobExecutionContext jobContext) throws JobExecutionException {
-        try {
-            boolean shouldExecute = beforeExecute(jobContext);
-            String token = currentTaskToken();
-            String taskName = getClass().getName();
-            if (!shouldExecute) {
-                log.debug("Skipping execution of task {} for token {}.", taskName, token);
-            } else {
-                log.debug("Executing task {} for token {}.", taskName, token);
-                onExecute(jobContext);
-                log.debug("Finished execution of task {} for token {}.", taskName, token);
-            }
-        } finally {
-            afterExecute();
-        }
-    }
-
-    @Override
-    protected String triggeringTaskTokenFromWorkContext(JobExecutionContext jobContext) {
-        String token = jobContext.getMergedJobDataMap().getString(Task.TASK_TOKEN);
-        return token;
-    }
-
-    @Override
-    protected Authentication getAuthenticationFromWorkContext(JobExecutionContext jobContext) {
-        Authentication authentication =
-                (Authentication) jobContext.getMergedJobDataMap().get(Task.TASK_AUTHENTICATION);
-        return authentication;
-    }
-
-    @Override
-    protected boolean isRunOnlyOnMaster(JobExecutionContext jobContext) {
-        return jobContext.getMergedJobDataMap().getBoolean(Task.TASK_RUN_ONLY_ON_PRIMARY);
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/storage/BinaryInsertRetryException.java b/storage/common/src/main/java/org/artifactory/storage/BinaryInsertRetryException.java
deleted file mode 100644
index bbdf8ef..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/BinaryInsertRetryException.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage;
-
-import org.artifactory.storage.binstore.service.BinaryInfo;
-
-/**
- * Exception used for indicating a failure to update storage due to the binary already stored.
- *
- * @author Fred Simon
- */
-public class BinaryInsertRetryException extends StorageException {
-    private final BinaryInfo binaryInfo;
-
-    public BinaryInsertRetryException(BinaryInfo binaryInfo, Throwable cause) {
-        super("Insertion of " + binaryInfo + " failed. Auto retry exception", cause);
-        this.binaryInfo = binaryInfo;
-    }
-
-    public BinaryInfo getBinaryInfo() {
-        return binaryInfo;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/DBEntityNotFoundException.java b/storage/common/src/main/java/org/artifactory/storage/DBEntityNotFoundException.java
deleted file mode 100644
index 94f8d07..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/DBEntityNotFoundException.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.artifactory.storage;
-
-/**
- * Exception for DB entities which are not found
- * @author Shay Bagants
- */
-public class DBEntityNotFoundException extends StorageException {
-    public DBEntityNotFoundException(String message) {
-        super(message);
-    }
-
-    public DBEntityNotFoundException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-    public DBEntityNotFoundException(Throwable cause) {
-        super(cause);
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/StorageException.java b/storage/common/src/main/java/org/artifactory/storage/StorageException.java
deleted file mode 100644
index feb0b95..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/StorageException.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage;
-
-/**
- * Base exception for storage exceptions. Can be used as general storage exception.
- *
- * @author Yossi Shaul
- */
-public class StorageException extends RuntimeException {
-    public StorageException(String message) {
-        super(message);
-    }
-
-    public StorageException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-    public StorageException(Throwable cause) {
-        super(cause);
-    }
-
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/binstore/service/BinaryInfo.java b/storage/common/src/main/java/org/artifactory/storage/binstore/service/BinaryInfo.java
deleted file mode 100644
index e5b1951..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/binstore/service/BinaryInfo.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.binstore.service;
-
-import java.io.Serializable;
-
-/**
- * Date: 11/26/12
- * Time: 10:24 AM
- *
- * @author freds
- */
-public interface BinaryInfo extends Serializable {
-    String getSha1();
-
-    String getMd5();
-
-    long getLength();
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/binstore/service/BinaryService.java b/storage/common/src/main/java/org/artifactory/storage/binstore/service/BinaryService.java
deleted file mode 100644
index 3f99c73..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/binstore/service/BinaryService.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.binstore.service;
-
-import org.artifactory.api.storage.BinariesInfo;
-import org.artifactory.storage.StorageException;
-import org.jfrog.storage.binstore.exceptions.BinaryNotFoundException;
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Manages binaries stored with SHA1 checksum as key.
- *
- * @author Yossi Shaul
- */
-public interface BinaryService {
-
-    /**
-     * Retrieve the readable stream with the bytes associated with the provided SHA1 checksum.
-     *
-     * @param sha1 the checksum key
-     * @return the stream that should be closed by the user
-     * @throws BinaryNotFoundException If the checksum does not exists in this store
-     */
-    InputStream getBinary(String sha1) throws BinaryNotFoundException;
-
-    /**
-     * Retrieve a dummy InputStream that will lock the sha1 for deletion until close is called.
-     * It will also check for the real existence of the sha1 stream.
-     * @param bi The full binary info
-     * @return The dummy stream or null if sha1 does not exists in the binary provider
-     * @throws BinaryNotFoundException if file being deleted
-     */
-    InputStream getBinary(BinaryInfo bi) throws BinaryNotFoundException;
-
-    /**
-     * Retrieve all the information (MD5, length) for this SHA1 key.
-     *
-     * @param sha1 the checksum key
-     * @return The info if exists, null otherwise
-     * @throws StorageException if an error happen accessing the binary store
-     */
-    @Nullable
-    BinaryInfo findBinary(String sha1);
-
-    /**
-     * Retrieve a collection of binary information stored in this binary store,
-     * based on a list of checksums keys.
-     * The checksum type, SHA1 or MD5, will be determined by validation.
-     * Any value that are invalid for all checksum type will be ignored.
-     *
-     * @param checksums list of checksum keys to look for
-     * @return A distinct set of binaries information found, may be empty if nothing found
-     * @throws StorageException if an error happen accessing the binary store
-     */
-    @Nonnull
-    Set<BinaryInfo> findBinaries(@Nullable Collection<String> checksums);
-
-    /**
-     * Add the whole content of the input stream in the binary store and close the input stream.
-     * If the checksum for the whole stream already exists, the existing entry will be used.
-     * The reference string is used for the reference count of this binary store.
-     * Transitionally, the calling transaction will be suspended and all action on filesystem
-     * will be done without DB TX opened. Then when binary data will need insert normal TX will be
-     * done internally to this method call.
-     * The input stream will not be consumed if the type is coming from here and the checksum is known.
-     *
-     * @param in the stream with all the bytes for the binary store
-     * @return The info object for this binary entry
-     * @throws java.io.IOException if the bytes cannot be read from the stream or saved in binary store
-     */
-    @Nonnull
-    @Transactional(propagation = Propagation.NOT_SUPPORTED)
-    BinaryInfo addBinary(InputStream in) throws IOException;
-
-    /**
-     * Check the sanity of this binary store.
-     * DB, Filesystem or network access depending on the implementation.
-     * Will throw exceptions if this binary store is not in full healthy state.
-     */
-    void ping();
-
-    BinariesInfo getBinariesInfo();
-
-    /**
-     * Return the total size managed by this binary store.
-     *
-     * @return The total size or -1 if the binary does not supports fetch of the full size.
-     */
-    long getStorageSize();
-
-    boolean isActivelyUsed(String sha1);
-
-    List<String> getAndManageErrors();
-
-    /**
-     * Force optimization once even if there is no need for optimization (For immigration).
-     */
-    void forceOptimizationOnce();
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/binstore/service/BinaryStoreGarbageCollectorJob.java b/storage/common/src/main/java/org/artifactory/storage/binstore/service/BinaryStoreGarbageCollectorJob.java
deleted file mode 100644
index 9a0f7db..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/binstore/service/BinaryStoreGarbageCollectorJob.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.binstore.service;
-
-import org.artifactory.schedule.JobCommand;
-import org.artifactory.schedule.ScheduleJobEnum;
-import org.artifactory.schedule.StopCommand;
-import org.artifactory.schedule.TaskUser;
-import org.artifactory.schedule.quartz.QuartzCommand;
-import org.artifactory.storage.spring.StorageContextHelper;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import static org.artifactory.schedule.StopStrategy.PAUSE;
-
-/**
- * Date: 11/26/12
- * Time: 9:53 PM
- *
- * @author freds
- */
-
- at JobCommand(singleton = true, schedulerUser = TaskUser.SYSTEM, manualUser = TaskUser.SYSTEM,
-        description = "Binaries Garbage Collector",
-        commandsToStop = {
-                //todo consider have group of index jobs/maintenance jobs/import-export jobs
-                @StopCommand(strategy = PAUSE,commandName = ScheduleJobEnum.ARCHIVE_INDEXER_JOB),
-        })
-public class BinaryStoreGarbageCollectorJob extends QuartzCommand {
-    private static final Logger log = LoggerFactory.getLogger(BinaryStoreGarbageCollectorJob.class);
-
-    @Override
-    protected void onExecute(JobExecutionContext callbackContext) throws JobExecutionException {
-        try {
-            log.debug("Triggered BinaryStoreGarbageCollectorJob started");
-            StorageContextHelper.get().beanForType(InternalBinaryService.class).garbageCollect();
-            log.debug("Triggered BinaryStoreGarbageCollectorJob finished");
-        } catch (Exception e) {
-            throw new JobExecutionException(e);
-        }
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/binstore/service/GarbageCollectorInfo.java b/storage/common/src/main/java/org/artifactory/storage/binstore/service/GarbageCollectorInfo.java
deleted file mode 100644
index f2045fa..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/binstore/service/GarbageCollectorInfo.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.binstore.service;
-
-import org.artifactory.api.storage.StorageUnit;
-import org.artifactory.util.TimeUnitFormat;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.concurrent.TimeUnit;
-
-import static org.artifactory.util.NumberFormatter.formatLong;
-
-/**
- * Holds the garbage collection information
- *
- * @author Noam Y. Tenne
- */
-public class GarbageCollectorInfo {
-    private static final Logger log = LoggerFactory.getLogger(GarbageCollectorInfo.class);
-
-    private final long gcStartTime;
-    public long gcEndTime;
-    public long stopScanTimestamp;
-    public int candidatesForDeletion;
-    public long initialSize;
-    public long initialCount;
-    public int checksumsCleaned;// checksum entries cleaned from the binaries table
-    public int binariesCleaned; // either files from the filestore or blobs from the database (usually same as checksumsCleaned)
-    public long totalSizeCleaned;
-    public int archivePathsCleaned; // the amount of unique archive paths cleaned
-    public int archiveNamesCleaned; // the amount of unique archive names cleaned
-
-    public GarbageCollectorInfo() {
-        gcStartTime = System.currentTimeMillis();
-    }
-
-    /**
-     * Prints a summary of the collected info to the log
-     *
-     * @param dataStoreSize The measured size of the datastore
-     */
-    public void printCollectionInfo(long dataStoreSize) {
-        String duration = TimeUnitFormat.getTimeString((gcEndTime - gcStartTime), TimeUnit.MILLISECONDS);
-        StringBuilder msg = new StringBuilder("Storage garbage collector report:\n").append(
-                "Number of binaries:      ").append(formatLong(initialCount)).append("\n").append(
-                "Total execution time:    ").append(duration).append("\n").append(
-                "Candidates for deletion: ").append(formatLong(candidatesForDeletion)).append("\n").append(
-                "Checksums deleted:       ").append(formatLong(checksumsCleaned)).append("\n").append(
-                "Binaries deleted:        ").append(formatLong(binariesCleaned)).append("\n").append(
-                "Total size freed:        ").append(StorageUnit.toReadableString(totalSizeCleaned));
-
-        if (log.isDebugEnabled()) {
-            msg.append("\n").append("Unique paths deleted:    ").append(formatLong(archivePathsCleaned));
-            msg.append("\n").append("Unique names deleted:    ").append(formatLong(archiveNamesCleaned));
-        }
-
-        if (dataStoreSize >= 0) {
-            msg.append("\n").append("Current total size:      ").append(StorageUnit.toReadableString(dataStoreSize));
-        }
-
-        log.info(msg.toString());
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/storage/binstore/service/GarbageCollectorListener.java b/storage/common/src/main/java/org/artifactory/storage/binstore/service/GarbageCollectorListener.java
deleted file mode 100644
index f538b5d..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/binstore/service/GarbageCollectorListener.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.artifactory.storage.binstore.service;
-
-
-/**
- * Listener interface used in Binary Store to get event during Artifactory File store GC steps.
- *
- * @author Gidi Shabat
- */
-public interface GarbageCollectorListener {
-    /**
-     * The garbage collection is starting.
-     * Called at the very beginning of the process.
-     */
-    void start();
-
-    /**
-     * Once all deletion was done this is called with result data object.
-     */
-    void finished();
-
-    /**
-     * Called when Artifactory server is going down.
-     * all resources should be cleaned after this call.
-     */
-    void destroy();
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/binstore/service/InternalBinaryService.java b/storage/common/src/main/java/org/artifactory/storage/binstore/service/InternalBinaryService.java
deleted file mode 100644
index 4987a3b..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/binstore/service/InternalBinaryService.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.binstore.service;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.storage.StorageException;
-import org.jfrog.storage.binstore.exceptions.BinaryNotFoundException;
-import org.jfrog.storage.binstore.ifc.BinaryProviderManager;
-import org.jfrog.storage.binstore.ifc.ProviderConnectMode;
-import org.jfrog.storage.binstore.ifc.UsageTracking;
-import org.jfrog.storage.binstore.ifc.model.BinaryTreeElement;
-import org.jfrog.storage.binstore.ifc.model.StorageInfo;
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.io.File;
-import java.util.Collection;
-import java.util.Map;
-
-/**
- * Date: 12/11/12
- * Time: 2:13 PM
- *
- * @author freds
- */
-public interface InternalBinaryService extends BinaryService, UsageTracking {
-
-    /**
-     * Add the binary data line to this data store based on all params after verification
-     * from binary provider delegate.
-     * Verification steps depends on configuration and delegates answers.
-     * Method will returns null if no binary object with specified info is found,
-     * or no filestore delegate was configured.
-     *
-     * @param sha1   The SHA1 key value
-     * @param md5    The md5 of this new entry
-     * @param length The length of the binary
-     * @return The full binary info object created and stored, or null if no object
-     * @throws BinaryNotFoundException if verification failed
-     */
-    @Nullable
-    BinaryInfo addBinaryRecord(String sha1, String md5, long length) throws BinaryNotFoundException;
-
-    /**
-     * Create the entry in DB for this binary if it does not exists already.
-     * Returns the actual entry created.
-     * Open and close a DB TX specifically for this.
-     *
-     * @param sha1
-     * @param md5
-     * @param length
-     * @return the actual entry in DB matching the inputs
-     * @throws StorageException
-     */
-    @Nonnull
-    @Transactional(propagation = Propagation.REQUIRES_NEW)
-    BinaryInfo insertRecordInDb(String sha1, String md5, long length) throws StorageException;
-
-    /**
-     * Activate Garbage Collection for this binary store
-     *
-     * @return The results of the GC process
-     */
-    GarbageCollectorInfo garbageCollect();
-
-    /**
-     * Delete all left over folders and files in the binaries directory that are not declared
-     * at all in this binary store.
-     *
-     * @param statusHolder A status holder of the process messages
-     */
-    void prune(BasicStatusHolder statusHolder);
-
-    /**
-     * The actual local directory where checksum binary files will be stored.
-     *
-     * @return the folder for this binary store
-     * @deprecated Cannot be used anymore
-     */
-    @Nullable
-    @Deprecated
-    File getBinariesDir();
-
-    /**
-     * Map each file provider to it's filestore folder
-     *;
-     * @return A map of each filestore folder mapped to it's provider
-     */
-    StorageInfo getStorageInfoSummary();
-
-    BinaryTreeElement<Map<String, String>> getBinaryProvidersInfo();
-
-    BinaryProviderManager getBinaryProviderManager();
-
-    void addGCListener(GarbageCollectorListener garbageCollectorListener);
-
-    /**
-     * Add an external checksum filestore that can be used in read only mode.
-     * This will create an external filestore binary provider
-     * at the end of binary provider chain. So, if no binary found it will be used
-     * in read only mode to provide the data stream.
-     * The root directory provided should have the Artifactory checksum filestore layout:
-     * [2 first characters of the sha1]/[the full sha1]
-     * <p>
-     * No files will be deleted from the external filestore except if the connectMode
-     * is specified to MOVE mode.
-     *
-     * @param externalDir The root directory of the files respecting a checksum filestore
-     * @param connectMode Define the way the streams and files of the external filestore
-     *                    should be handled by this binary store
-     */
-    void addExternalFileStore(File externalDir, ProviderConnectMode connectMode);
-
-    /**
-     * This will disconnect from the chain an existing external filestore added or configured.
-     * Before being disconnected, the disconnectMode is going to be used to copy or move
-     * all the files from the external filestore to this binary store.
-     *
-     * @param externalDir    The exact same root directory used previously to add the external filestore
-     * @param disconnectMode The mode of disconnection to manage all the files
-     *                       needed by this binary store and present in the external filestore
-     * @param statusHolder   A collection of messages about the status of the disconnection
-     */
-    void disconnectExternalFilestore(File externalDir, ProviderConnectMode disconnectMode,
-                                     BasicStatusHolder statusHolder);
-
-    Collection<BinaryInfo> findAllBinaries();
-
-    /**
-     * Deletes unreferenced archive paths. Shared archive paths might not be used after a binary is deleted.
-     */
-    @Transactional
-    int deleteUnusedArchivePaths();
-
-    /**
-     * Deletes unreferenced archive names. Shared archive names might not be used after a binary is deleted.
-     */
-    @Transactional
-    int deleteUnusedArchiveNames();
-
-    /**
-     * Increments the active users of a certain binary to prevent deletion while still in usage.
-     *
-     * @param sha1 The sha1 checksum to protect
-     */
-    @Override
-    int incrementNoDeleteLock(String sha1);
-
-    /**
-     * Decrements the active users of a certain binary. Indicates that the active usage was ended.
-     *
-     * @param sha1 The sha1 checksum to remove protection from
-     */
-    @Override
-    void decrementNoDeleteLock(String sha1);
-
-
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/build/service/BuildSearchCriteria.java b/storage/common/src/main/java/org/artifactory/storage/build/service/BuildSearchCriteria.java
deleted file mode 100644
index 440a870..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/build/service/BuildSearchCriteria.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.build.service;
-
-/**
- * Date: 11/27/12
- * Time: 10:15 AM
- *
- * @author freds
- */
-public enum BuildSearchCriteria {
-    IN_ARTIFACTS, IN_DEPENDENCIES, IN_BOTH;
-
-    public final boolean searchInArtifacts() {
-        return this == IN_ARTIFACTS || this == IN_BOTH;
-    }
-
-    public final boolean searchInDependencies() {
-        return this == IN_DEPENDENCIES || this == IN_BOTH;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/build/service/BuildStoreService.java b/storage/common/src/main/java/org/artifactory/storage/build/service/BuildStoreService.java
deleted file mode 100644
index b4478cd..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/build/service/BuildStoreService.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.build.service;
-
-import org.artifactory.api.build.*;
-import org.artifactory.api.build.diff.BuildParams;
-import org.artifactory.build.BuildRun;
-import org.artifactory.checksum.ChecksumType;
-import org.jfrog.build.api.Build;
-import org.jfrog.build.api.release.PromotionStatus;
-
-import java.sql.SQLException;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Date: 11/14/12
- * Time: 12:40 PM
- *
- * @author freds
- */
-public interface BuildStoreService {
-    void addBuild(String buildJson);
-
-    void addBuild(Build build);
-
-    /**
-     * Locates and fills in missing checksums of all the modules of a build
-     *
-     * @param build the build with modules to fill checksums
-     */
-    void populateMissingChecksums(Build build);
-
-    BuildRun getBuildRun(String buildName, String buildNumber, String buildStarted);
-
-    String getBuildAsJson(BuildRun buildRun);
-
-    Build getLatestBuild(String buildName, String buildNumber);
-
-    Set<BuildRun> findBuildsByName(String buildName);
-
-    Set<BuildRun> findBuildsByNameAndNumber(String buildName, String buildNumber);
-
-    List<String> getAllBuildNames();
-
-    ImportableExportableBuild getExportableBuild(BuildRun buildRun);
-
-    void deleteAllBuilds(String buildName);
-
-    void deleteBuild(BuildRun buildRun);
-
-    Set<BuildRun> getLatestBuildsPaging(String offset ,String orderBy,String direction,String limit);
-
-    void deleteBuild(String buildName, String buildNumber, String buildStarted);
-
-    void deleteAllBuilds();
-
-    Set<BuildRun> getLatestBuildsByName();
-
-    List<GeneralBuild> getBuildForNamePaging(String buildName, String orderBy, String direction, String offset, String limit) throws SQLException;
-
-    int getBuildForNameTotalCount(String buildName) throws SQLException;
-
-    Build getBuildJson(BuildRun buildRun);
-
-    void renameBuild(BuildRun originalBuildRun, Build renamedBuild, String currentUser);
-
-    void addPromotionStatus(Build build, PromotionStatus promotion, String currentUser);
-
-    Set<BuildRun> findBuildsForChecksum(BuildSearchCriteria criteria, ChecksumType type, String checksum);
-
-    List<PublishedModule> getPublishedModules(String buildName, String date, String orderBy, String direction, String offset, String limit);
-
-    int  getPublishedModulesCounts(String buildName, String date);
-
-    List<ModuleArtifact> getModuleArtifact(String buildName,String buildNumber, String moduleId,String date, String orderBy, String direction, String offset, String limit);
-
-    int getModuleArtifactCount(String buildNumber, String moduleId,String date);
-
-    List<ModuleDependency> getModuleDependency(String buildNumber, String moduleId,String date, String orderBy, String direction, String offset, String limit);
-
-     int getModuleDependenciesCount(String buildNumber, String moduleId,String date);
-
-    List<ModuleArtifact> getModuleArtifactsForDiffWithPaging(BuildParams buildParams, String offset, String limit);
-
-    int getModuleArtifactsForDiffCount(BuildParams buildParams, String offset, String limit);
-
-    List<ModuleDependency> getModuleDependencyForDiffWithPaging(BuildParams buildParams, String offset, String limit);
-
-    int getModuleDependencyForDiffCount(BuildParams buildParams, String offset, String limit);
-
-    List<GeneralBuild> getPrevBuildsList(String buildName, String buildDate);
-
-    List<BuildProps> getBuildProps(BuildParams buildParams, String offset, String limit);
-
-    int getPropsDiffCount(BuildParams buildParams);
-
-    List<BuildProps> getBuildPropsData(BuildParams buildParams, String offset, String limit, String orderBy);
-
-    long getBuildPropsCounts(BuildParams buildParams);
-    }
diff --git a/storage/common/src/main/java/org/artifactory/storage/db/DbService.java b/storage/common/src/main/java/org/artifactory/storage/db/DbService.java
deleted file mode 100644
index 12f3531..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/db/DbService.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.spring.ReloadableBean;
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.concurrent.Callable;
-
-/**
- * @author Yossi Shaul
- */
-public interface DbService extends ReloadableBean {
-
-    /**
-     * A marker for an invalid database id. Should be used to mark non-persisted entities and as the return id an
-     * entity is not found in the database
-     */
-    int NO_DB_ID = -1;
-
-    /**
-     * @return Next unique id that can be used to use as row id in any of the tables.
-     */
-    long nextId();
-
-    /**
-     * @return The database type used by Artifactory.
-     */
-    DbType getDatabaseType();
-
-    /**
-     * Compresses the derby database files.
-     *
-     * @param statusHolder
-     */
-    void compressDerbyDb(BasicStatusHolder statusHolder);
-
-    /**
-     * Enforce a new separate transaction to execute the given callable statement.
-     *
-     * @param <T>             The return type
-     * @param transactionName Symbolic name of the transaction
-     * @param execute         The Callable statement execute inside the NEW TX
-     * @return Whatever the callable returned
-     */
-    @Transactional(propagation = Propagation.REQUIRES_NEW)
-    <T> T invokeInTransaction(String transactionName, Callable<T> execute);
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/db/properties/service/ArtifactoryDbPropertiesService.java b/storage/common/src/main/java/org/artifactory/storage/db/properties/service/ArtifactoryDbPropertiesService.java
deleted file mode 100644
index ceb5a7a..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/db/properties/service/ArtifactoryDbPropertiesService.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.properties.service;
-
-import org.artifactory.sapi.common.Lock;
-import org.artifactory.storage.db.properties.model.DbProperties;
-
-import java.util.List;
-
-
-/**
- * @author Gidi Shabat
- */
-public interface ArtifactoryDbPropertiesService {
-    @Lock
-    void updateDbProperties(DbProperties dbProperties);
-
-    DbProperties getDbProperties();
-
-    public boolean isDbPropertiesTableExists();
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/db/servers/service/ArtifactoryServersService.java b/storage/common/src/main/java/org/artifactory/storage/db/servers/service/ArtifactoryServersService.java
deleted file mode 100644
index 66574ec..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/db/servers/service/ArtifactoryServersService.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.artifactory.storage.db.servers.service;
-
-import org.artifactory.state.ArtifactoryServerState;
-import org.artifactory.storage.db.servers.model.ArtifactoryServer;
-import org.artifactory.storage.db.servers.model.ArtifactoryServerRole;
-import org.springframework.transaction.annotation.Transactional;
-
-import javax.annotation.Nullable;
-import java.util.List;
-
-/**
- * A service to interact with the artifactory servers table.
- *
- * @author Yossi Shaul
- */
-public interface ArtifactoryServersService {
-    List<ArtifactoryServer> getAllArtifactoryServers();
-
-    /**
-     * Get the {@link ArtifactoryServer} instance from storage with the given {@code serverId}
-     *
-     * @param nodeId The unique server id
-     * @return {@link ArtifactoryServer} if exists, otherwise null
-     */
-    @Nullable
-    ArtifactoryServer getArtifactoryServer(String nodeId);
-
-    @Transactional
-    int createArtifactoryServer(ArtifactoryServer artifactoryServer);
-
-    @Transactional
-    int updateArtifactoryServer(ArtifactoryServer artifactoryServer);
-
-    @Transactional
-    int updateArtifactoryServerState(String serverId, ArtifactoryServerState newState);
-
-    @Transactional
-    int updateArtifactoryServerRole(String serverId, ArtifactoryServerRole newRole);
-
-    @Transactional
-    int updateArtifactoryJoinPort(String serverId, int port);
-
-    @Transactional
-    boolean removeServer(String serverId);
-
-    @Transactional
-    int updateArtifactoryServerHeartbeat(String serverId, long heartbeat);
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/StorageTx.java b/storage/common/src/main/java/org/artifactory/storage/fs/StorageTx.java
deleted file mode 100644
index e94211b..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/StorageTx.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Opens a transaction tuned for the storage layer.
- *
- * @author Yossi Shaul
- */
- at Target({ElementType.METHOD, ElementType.TYPE})
- at Retention(RetentionPolicy.RUNTIME)
-//@Transactional
-public @interface StorageTx {
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/VfsArchiveFile.java b/storage/common/src/main/java/org/artifactory/storage/fs/VfsArchiveFile.java
deleted file mode 100644
index 1df460e..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/VfsArchiveFile.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs;
-
-import org.apache.commons.compress.archivers.ArchiveEntry;
-import org.apache.commons.compress.archivers.ArchiveInputStream;
-import org.apache.commons.io.IOUtils;
-import org.artifactory.sapi.fs.VfsFile;
-import org.artifactory.util.ZipUtils;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.zip.ZipEntry;
-
-/**
- * A wrapper on a zip resource around a vfs file. This class is non tread safe.
- */
-public class VfsArchiveFile implements Closeable {
-
-    private VfsFile vfsFile;
-    private List<ArchiveEntry> entries;
-    private List<InputStream> streams = new ArrayList<>();
-
-    public VfsArchiveFile(VfsFile vfsFile) {
-        this.vfsFile = vfsFile;
-    }
-
-    public ArchiveEntry getEntry(String name) throws IOException {
-        List<? extends ArchiveEntry> entries = entries();
-        for (ArchiveEntry entry : entries) {
-            if (name.equals(entry.getName())) {
-                return entry;
-            }
-        }
-        return null;
-    }
-
-    public InputStream getInputStream(ZipEntry entry) throws IOException {
-        ArchiveInputStream zis = getArchiveInputStream();
-        ArchiveEntry currentEntry;
-        while ((currentEntry = zis.getNextEntry()) != null) {
-            if (currentEntry.getName().equals(entry.getName())) {
-                return zis;
-            }
-        }
-        throw new IOException("Failed to read zip entry '" + entry.getName() + "' from '" + getName() + "'.");
-    }
-
-    public String getName() {
-        return vfsFile.getName();
-    }
-
-    public List<? extends ArchiveEntry> entries() throws IOException {
-        if (entries == null) {
-            ArchiveInputStream zis = null;
-            entries = new ArrayList<>();
-            zis = getArchiveInputStream();
-            ArchiveEntry entry;
-            while ((entry = zis.getNextEntry()) != null) {
-                entries.add(entry);
-            }
-        }
-        return entries;
-    }
-
-    @Override
-    public void close() throws IOException {
-        for (InputStream stream : streams) {
-            IOUtils.closeQuietly(stream);
-        }
-    }
-
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof VfsArchiveFile)) {
-            return false;
-        }
-        VfsArchiveFile file = (VfsArchiveFile) o;
-        return vfsFile.equals(file.vfsFile);
-
-    }
-
-    public int hashCode() {
-        return vfsFile.hashCode();
-    }
-
-    private ArchiveInputStream getArchiveInputStream() throws IOException {
-        ArchiveInputStream archiveInputStream;
-        archiveInputStream = ZipUtils.getArchiveInputStream(vfsFile);
-        streams.add(archiveInputStream);
-        return archiveInputStream;
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/VfsException.java b/storage/common/src/main/java/org/artifactory/storage/fs/VfsException.java
deleted file mode 100644
index c0dbcec..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/VfsException.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs;
-
-import org.artifactory.storage.StorageException;
-
-/**
- * Signals an error with a virtual file system operation.
- *
- * @author Yossi Shaul
- */
-public class VfsException extends StorageException {
-    public VfsException(String message) {
-        super(message);
-    }
-
-    public VfsException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-    public VfsException(Throwable cause) {
-        super(cause);
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/VfsFileProvider.java b/storage/common/src/main/java/org/artifactory/storage/fs/VfsFileProvider.java
deleted file mode 100644
index 3642605..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/VfsFileProvider.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs;
-
-import org.artifactory.sapi.fs.MutableVfsFile;
-import org.artifactory.sapi.fs.VfsFile;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
-/**
- * Provider of VFS files.
- *
- * @author Yossi Shaul
- */
-public interface VfsFileProvider {
-    @Nullable
-    VfsFile getImmutableFile();
-
-    @Nullable
-    MutableVfsFile getMutableFile();
-
-    @Nonnull
-    MutableVfsFile getOrCreMutableFile();
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/VfsFolderProvider.java b/storage/common/src/main/java/org/artifactory/storage/fs/VfsFolderProvider.java
deleted file mode 100644
index 1213777..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/VfsFolderProvider.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs;
-
-import org.artifactory.sapi.fs.MutableVfsFolder;
-import org.artifactory.sapi.fs.VfsFolder;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
-/**
- * Provider of VFS folders.
- *
- * @author Yossi Shaul
- */
-public interface VfsFolderProvider {
-    @Nullable
-    VfsFolder getImmutableFolder();
-
-    @Nullable
-    MutableVfsFolder getMutableFolder();
-
-    @Nonnull
-    MutableVfsFolder getOrCreMutableFolder();
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/VfsItemFactory.java b/storage/common/src/main/java/org/artifactory/storage/fs/VfsItemFactory.java
deleted file mode 100644
index e9661aa..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/VfsItemFactory.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs;
-
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.io.checksum.policy.ChecksumPolicy;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.fs.MutableVfsFile;
-import org.artifactory.sapi.fs.MutableVfsFolder;
-import org.artifactory.sapi.fs.MutableVfsItem;
-import org.artifactory.sapi.fs.VfsFile;
-import org.artifactory.sapi.fs.VfsFolder;
-import org.artifactory.sapi.fs.VfsItem;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
-/**
- * @author freds
- * @date Nov 17, 2008
- */
-//TORE: [by YS] move some methods to other interfaces and rename this interface
-public interface VfsItemFactory {
-    String getKey();
-
-    boolean isLocal();
-
-    boolean isReal();
-
-    boolean isCache();
-
-    boolean isSuppressPomConsistencyChecks();
-
-    ModuleInfo getItemModuleInfo(String relativePath);
-
-    ChecksumPolicy getChecksumPolicy();
-
-    boolean itemExists(String subPath);
-
-    @Nonnull
-    MutableVfsFile createOrGetFile(RepoPath repoPath);
-
-    @Nullable
-    VfsItem getImmutableFsItem(RepoPath repoPath);
-
-    @Nullable
-    MutableVfsFile getMutableFile(RepoPath repoPath);
-
-    @Nullable
-    MutableVfsItem getMutableFsItem(RepoPath repoPath);
-
-    @Nullable
-    VfsFile getImmutableFile(RepoPath repoPath);
-
-    @Nonnull
-    MutableVfsFolder createOrGetFolder(RepoPath repoPath);
-
-    @Nullable
-    VfsFolder getImmutableFolder(RepoPath repoPath);
-
-    @Nullable
-    MutableVfsFolder getMutableFolder(RepoPath repoPath);
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/VfsItemNotFoundException.java b/storage/common/src/main/java/org/artifactory/storage/fs/VfsItemNotFoundException.java
deleted file mode 100644
index e9d8f00..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/VfsItemNotFoundException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs;
-
-/**
- * Thrown when vfs item (file/folder) is explicitly requested by path but it is not found in the VFS.
- *
- * @author Yossi Shaul
- */
-public class VfsItemNotFoundException extends VfsException {
-    public VfsItemNotFoundException(String message) {
-        super(message);
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/VfsItemProvider.java b/storage/common/src/main/java/org/artifactory/storage/fs/VfsItemProvider.java
deleted file mode 100644
index a276acf..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/VfsItemProvider.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs;
-
-import org.artifactory.sapi.fs.MutableVfsItem;
-import org.artifactory.sapi.fs.VfsItem;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
-/**
- * Provider for read/write locked fs items.
- *
- * @author Yossi Shaul
- */
-public interface VfsItemProvider {
-    @Nullable
-    VfsItem getImmutableFsItem();
-
-    @Nullable
-    MutableVfsItem getMutableFsItem();
-
-    @Nonnull
-    MutableVfsItem getOrCreateMutableFsItem();
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/VfsItemProviderFactory.java b/storage/common/src/main/java/org/artifactory/storage/fs/VfsItemProviderFactory.java
deleted file mode 100644
index 35c12fe..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/VfsItemProviderFactory.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs;
-
-import org.artifactory.repo.RepoPath;
-import org.artifactory.storage.fs.lock.FsItemsVault;
-import org.artifactory.storage.fs.repo.StoringRepo;
-
-/**
- * A factory {@link VfsItemProvider}.
- *
- * @author Yossi Shaul
- */
-public interface VfsItemProviderFactory {
-    VfsItemProvider createItemProvider(StoringRepo storingRepo, RepoPath repoPath, FsItemsVault fsItemsVault);
-
-    VfsFileProvider createFileProvider(StoringRepo storingRepo, RepoPath repoPath, FsItemsVault fsItemsVault);
-
-    VfsFolderProvider createFolderProvider(StoringRepo storingRepo, RepoPath repoPath, FsItemsVault fsItemsVault);
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/lock/FsItemLockEntry.java b/storage/common/src/main/java/org/artifactory/storage/fs/lock/FsItemLockEntry.java
deleted file mode 100644
index 368c3e9..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/lock/FsItemLockEntry.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.lock;
-
-import org.artifactory.sapi.fs.MutableVfsItem;
-
-/**
- * @author Yossi Shaul
- */
-public interface FsItemLockEntry {
-
-    MutableVfsItem getMutableFsItem();
-
-    void setWriteFsItem(MutableVfsItem mutableItem);
-
-    void unlock();
-
-    void save();
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/lock/FsItemsVault.java b/storage/common/src/main/java/org/artifactory/storage/fs/lock/FsItemsVault.java
deleted file mode 100644
index 1a69c1c..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/lock/FsItemsVault.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.artifactory.storage.fs.lock;
-
-import org.artifactory.repo.RepoPath;
-
-import javax.annotation.Nonnull;
-
-/**
- * @author mamo
- */
-public interface FsItemsVault {
-    @Nonnull
-    LockEntryId getLock(RepoPath repoPath);
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/lock/FsItemsVaultCacheImpl.java b/storage/common/src/main/java/org/artifactory/storage/fs/lock/FsItemsVaultCacheImpl.java
deleted file mode 100644
index 0591177..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/lock/FsItemsVaultCacheImpl.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.lock;
-
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.storage.fs.lock.provider.LockProvider;
-import org.artifactory.storage.fs.lock.provider.LockWrapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nonnull;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Holds all the fs item locks for a single storing repository.
- *
- * @author Yossi Shaul
- */
-public class FsItemsVaultCacheImpl implements FsItemsVault {
-    private static final Logger log = LoggerFactory.getLogger(FsItemsVaultCacheImpl.class);
-
-    private LoadingCache<RepoPath, LockWrapper> locks;
-
-    public FsItemsVaultCacheImpl(final LockProvider lockProvider) {
-        locks = CacheBuilder.newBuilder().initialCapacity(2000).softValues()
-                .expireAfterAccess(ConstantValues.fsItemCacheIdleTimeSecs.getLong(), TimeUnit.SECONDS)
-                .build(new CacheLoader<RepoPath, LockWrapper>() {
-                    @Override
-                    public LockWrapper load(RepoPath key) throws Exception {
-                        return lockProvider.getLock(key);
-                    }
-                });
-    }
-
-    /**
-     * Returns a new lock entry id. Creates a lock object if not already exist.
-     * This method doesn't lock anything, it will just create new lock object if not already exist.
-     *
-     * @param repoPath Repo path to create lock entry for
-     * @return A new {@link org.artifactory.storage.fs.lock.LockEntryId}
-     */
-    @Override
-    @Nonnull
-    public LockEntryId getLock(RepoPath repoPath) {
-        try {
-            log.trace("Getting lock for " + repoPath);
-            return new LockEntryId(locks.get(repoPath), repoPath);
-        } catch (ExecutionException e) {
-            throw new RuntimeException("Could not get lock from vault for " + repoPath, e);
-        }
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/lock/LockEntryId.java b/storage/common/src/main/java/org/artifactory/storage/fs/lock/LockEntryId.java
deleted file mode 100644
index db9b499..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/lock/LockEntryId.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.lock;
-
-import org.artifactory.repo.RepoPath;
-import org.artifactory.storage.fs.lock.provider.LockWrapper;
-
-/**
- * An immutable lock holder - holds a RWLock per a certain repo fsItem. RW-locks are managed (shared) per storing repo
- * and are passed to each session's InternalLockManager. On the InternalLockManager each session performs read-write
- * lock/release operations on the saved locks.
- *
- * @author freds
- * @date Oct 19, 2008
- */
-public class LockEntryId {
-    /**
-     * The unique lock from the lock maps for the repo path of the items
-     */
-    private final LockWrapper lock;
-    private final RepoPath repoPath;
-
-    public LockEntryId(LockWrapper lock, RepoPath repoPath) {
-        if (lock == null) {
-            throw new IllegalArgumentException("Cannot create lock entry with no lock object for " + repoPath);
-        }
-        this.lock = lock;
-        this.repoPath = repoPath;
-    }
-
-    public RepoPath getRepoPath() {
-        return repoPath;
-    }
-
-    public LockWrapper getLock() {
-        return lock;
-    }
-
-    @Override
-    public String toString() {
-        return "LockEntryId " + repoPath;
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/lock/LockingDebugUtils.java b/storage/common/src/main/java/org/artifactory/storage/fs/lock/LockingDebugUtils.java
deleted file mode 100644
index 2a560ef..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/lock/LockingDebugUtils.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.lock;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Collection;
-
-/**
- * Debug logger for vfs locking issues.
- *
- * @author Yossi Shaul
- */
-public class LockingDebugUtils {
-    private static final Logger log = LoggerFactory.getLogger(LockingDebugUtils.class);
-
-    public static synchronized void debugLocking(LockEntryId entry, StringBuilder message) {
-        message.append("\nCurrent thread: ").append(Thread.currentThread().getName());
-        Collection<Thread> queuedWriters = entry.getLock().getQueuedThreads();
-        message.append("\nQueued writers: ");
-        for (Thread queuedWriter : queuedWriters) {
-            message.append(queuedWriter.getName()).append(' ');
-        }
-        ThreadDumpUtils.dumpThreads(message);
-
-        log.trace(message.toString());
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/lock/LockingHelper.java b/storage/common/src/main/java/org/artifactory/storage/fs/lock/LockingHelper.java
deleted file mode 100644
index a35f958..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/lock/LockingHelper.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.lock;
-
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.common.Lock;
-import org.artifactory.sapi.fs.MutableVfsItem;
-import org.artifactory.storage.fs.session.StorageSession;
-import org.artifactory.storage.fs.session.StorageSessionHolder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
-/**
- * @author Yossi Shaul
- */
-public class LockingHelper {
-    private static final Logger log = LoggerFactory.getLogger(LockingHelper.class);
-
-    @Nonnull
-    private static StorageSession getSession() {
-        StorageSession session = StorageSessionHolder.getSession();
-        if (session == null) {
-            IllegalStateException exception = new IllegalStateException(
-                    "Artifactory Storage Session doesn't exist in get session method call." +
-                    " Please add the " + Lock.class.getName() + " annotation to your method.");
-            log.error(exception.getMessage(), exception);
-            throw exception;
-        }
-        return session;
-    }
-
-    public static FsItemLockEntry writeLock(LockEntryId lockEntryId) {
-        //log.trace("Acquiring write lock on {} in lm={}", lockEntryId, this.hashCode());
-        return getSession().writeLock(lockEntryId);
-    }
-
-    /**
-     * Removes the lock entry the current thread is holding on the repo path (doesn't care if it's read or write lock).
-     *
-     * @param repoPath The repository path to release the lock from
-     */
-    public static void removeLockEntry(RepoPath repoPath) {
-        getSession().removeLockEntry(repoPath);
-    }
-
-    @Nullable
-    public static FsItemLockEntry getLockEntry(RepoPath repoPath) {
-        return getSession().getLockEntry(repoPath);
-    }
-
-    /**
-     * This method returns a mutable item only if an active session and the item is write locked by the current thread.
-     * It is safe to call it without an active session (in suck case null is returned).
-     *
-     * @param repoPath The repository path to check
-     * @return Mutable item if there's one locked by the current thread
-     */
-    @Nullable
-    public static MutableVfsItem getIfWriteLockedByMe(RepoPath repoPath) {
-        StorageSession session = StorageSessionHolder.getSession();
-        if (session == null) {
-            return null;
-        }
-        SessionLockEntry lockEntry = session.getLockEntry(repoPath);
-        if (lockEntry == null) {
-            return null;
-        }
-        return lockEntry.getMutableFsItem();
-    }
-
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/lock/MonitoringReentrantLock.java b/storage/common/src/main/java/org/artifactory/storage/fs/lock/MonitoringReentrantLock.java
deleted file mode 100644
index 9b88643..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/lock/MonitoringReentrantLock.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.lock;
-
-import java.util.Collection;
-import java.util.concurrent.locks.ReentrantLock;
-
-/**
- * A ReentrantLock that exposes information about the owner thread
- *
- * @author Yossi Shaul
- */
-public class MonitoringReentrantLock extends ReentrantLock {
-
-    @Override
-    public final Collection<Thread> getQueuedThreads() {
-        return super.getQueuedThreads();
-    }
-
-    @Override
-    public String toString() {
-        Thread owner = getOwner();
-        return super.toString() + (owner == null ? "" : " Owner: " + owner.getName() + " Id=" + owner.getId());
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/lock/SessionLockEntry.java b/storage/common/src/main/java/org/artifactory/storage/fs/lock/SessionLockEntry.java
deleted file mode 100644
index 908fe88..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/lock/SessionLockEntry.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.lock;
-
-import org.artifactory.common.ConstantValues;
-import org.artifactory.concurrent.LockingException;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.fs.MutableVfsItem;
-import org.artifactory.storage.fs.lock.provider.LockWrapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.concurrent.TimeUnit;
-
-/**
- * A session bound lock entry for a single {@link org.artifactory.repo.RepoPath}.
- *
- * @author Yossi Shaul
- */
-public class SessionLockEntry implements FsItemLockEntry {
-    private static final Logger log = LoggerFactory.getLogger(SessionLockEntry.class);
-
-    private final LockEntryId lockEntryId;
-    private MutableVfsItem mutableItem;
-
-    public SessionLockEntry(LockEntryId lockEntryId) {
-        this.lockEntryId = lockEntryId;
-    }
-
-    @Override
-    public MutableVfsItem getMutableFsItem() {
-        return mutableItem;
-    }
-
-    @Override
-    public void setWriteFsItem(MutableVfsItem mutableItem) {
-        this.mutableItem = mutableItem;
-    }
-
-    @Override
-    public void unlock() {
-        releaseWriteLock();
-    }
-
-    @Override
-    public void save() {
-        log.trace("Saving lock entry {}", getRepoPath());
-        if (!isWriteLockedByMe()) {
-            throw new LockingException("Cannot save item " + lockEntryId + " which not locked by me!");
-        }
-        if (mutableItem == null) {
-            throw new IllegalStateException("Cannot save item " + lockEntryId + ". Mutable item is null.");
-        }
-        if (mutableItem.hasPendingChanges()) {
-            log.debug("Saving item: {}", getRepoPath());
-            mutableItem.save();
-        } else {
-            log.trace("Item {} has no pending changes", getRepoPath());
-        }
-    }
-
-    public void acquireWriteLock() {
-        log.trace("Acquiring WRITE lock on {}", lockEntryId);
-        if (isWriteLockedByMe()) {
-            // current thread already holds the write lock
-            return;
-        }
-
-        acquire();
-    }
-
-    private void acquire() {
-        LockWrapper lock = lockEntryId.getLock();
-        try {
-            boolean success = lock.tryLock(ConstantValues.locksTimeoutSecs.getLong(), TimeUnit.SECONDS);
-            if (!success) {
-                StringBuilder messageBuilder =
-                        new StringBuilder().append("Lock on ").append(lockEntryId)
-                                .append(" not acquired in ").append(ConstantValues.locksTimeoutSecs.getLong())
-                                .append(" seconds. Lock info: ").append(lock).append(".");
-                if (ConstantValues.locksDebugTimeouts.getBoolean()) {
-                    LockingDebugUtils.debugLocking(lockEntryId, messageBuilder);
-                }
-                throw new LockingException(messageBuilder.toString());
-            }
-        } catch (InterruptedException e) {
-            throw new LockingException("Lock on " + lockEntryId + " not acquired!", e);
-        }
-    }
-
-    public boolean releaseWriteLock() {
-        log.trace("Releasing WRITE lock on {}", lockEntryId);
-        if (isWriteLockedByMe()) {
-            if (mutableItem != null) {
-                mutableItem.releaseResources();
-                if (mutableItem.hasPendingChanges()) {
-                    // local modification will be discarded
-                    log.warn("Mutable item '{}' has local modifications that will be discarded.", mutableItem);
-                }
-            }
-            mutableItem = null;
-            lockEntryId.getLock().unlock();
-            return true;
-        }
-        return false;
-    }
-
-    public boolean isWriteLockedByMe() {
-        return lockEntryId.getLock().isHeldByCurrentThread();
-    }
-
-    private RepoPath getRepoPath() {
-        return lockEntryId.getRepoPath();
-    }
-
-    public boolean isDeleted() {
-        return isWriteLockedByMe() && mutableItem.isDeleted();
-    }
-
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/lock/ThreadDumpUtils.java b/storage/common/src/main/java/org/artifactory/storage/fs/lock/ThreadDumpUtils.java
deleted file mode 100644
index 3ca99fe..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/lock/ThreadDumpUtils.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.lock;
-
-import org.artifactory.mbean.ThreadDumper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * @author Yoav Landman
- */
-public abstract class ThreadDumpUtils {
-
-    private static final Logger log = LoggerFactory.getLogger(ThreadDumpUtils.class);
-
-    public static void dumpThreads(StringBuilder msg) {
-        try {
-            log.info("Printing locking debug information...");
-            CharSequence dump = new ThreadDumper().dumpThreads();
-            msg.append("\n").append(dump);
-        } catch (Exception e) {
-            log.info("Could not dump threads", e);
-        }
-    }
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/lock/aop/LockingAdvice.java b/storage/common/src/main/java/org/artifactory/storage/fs/lock/aop/LockingAdvice.java
deleted file mode 100644
index 28bfdb9..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/lock/aop/LockingAdvice.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.lock.aop;
-
-import org.aopalliance.intercept.MethodInterceptor;
-import org.aopalliance.intercept.MethodInvocation;
-import org.artifactory.sapi.common.Lock;
-import org.artifactory.storage.fs.session.StorageSession;
-import org.artifactory.storage.fs.session.StorageSessionHolder;
-import org.artifactory.storage.spring.StorageContextHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.transaction.support.TransactionSynchronizationManager;
-
-/**
- * @author freds
- * @author Yossi Shaul
- */
-public class LockingAdvice implements MethodInterceptor {
-    private static final Logger log = LoggerFactory.getLogger(LockingAdvice.class);
-
-    private MethodInterceptor alwaysOnTxInterceptor;
-
-    public LockingAdvice() {
-        log.debug("Creating locking advice interceptor");
-    }
-
-    @Override
-    public Object invoke(MethodInvocation invocation) throws Throwable {
-        boolean createTransaction = true;
-        if (isSynchronizationActive()) {
-            log.trace("Tx already active on {} - no need starting a new one.", invocation.getMethod());
-            createTransaction = false;
-        }
-
-        boolean currentInvocationCreatedSession = false;
-        if (StorageSessionHolder.getSession() == null) {
-            if (isActualTransactionActive()) {
-                IllegalStateException exception = new IllegalStateException(
-                        "Artifactory Storage Session doesn't exist in Lock annotated method." +
-                        "Please add the " + Lock.class.getName() +
-                        " annotation to your method before the " + Transactional.class.getName() + " one.");
-                log.error(exception.getMessage(), exception);
-                throw exception;
-            }
-            currentInvocationCreatedSession = true;
-            createTransaction = true;
-        }
-
-        try {
-            if (log.isDebugEnabled()) {
-                log.debug("Activating locking interceptor on {} with create tx {}",
-                        invocation.getMethod(), createTransaction);
-            }
-            if (createTransaction) {
-                log.debug("Tx init by: {}", invocation.getMethod());
-                return getAlwaysOnTxInterceptor().invoke(invocation);
-            } else {
-                return invocation.proceed();
-            }
-        } catch (Exception e) {
-            log.debug("Received exception on method invocation: " + invocation, e);
-            throw e;
-        } finally {
-            if (currentInvocationCreatedSession) {
-                StorageSession session = StorageSessionHolder.getSession();
-                if (session != null) {
-                    try {
-                        log.error("Session exist after completion: {}", session);
-                        session.releaseResources();
-                    } finally {
-                        StorageSessionHolder.removeSession();
-                    }
-                }
-            }
-        }
-    }
-
-    public static boolean isActualTransactionActive() {
-        return TransactionSynchronizationManager.isActualTransactionActive();
-    }
-
-    public static boolean isSynchronizationActive() {
-        return TransactionSynchronizationManager.isSynchronizationActive();
-    }
-
-    private MethodInterceptor getAlwaysOnTxInterceptor() {
-        if (alwaysOnTxInterceptor == null) {
-            alwaysOnTxInterceptor = (MethodInterceptor) StorageContextHelper.get().getBean("alwaysOnTxInterceptor");
-            log.debug("Locking interceptor has Tx advice {}", alwaysOnTxInterceptor);
-        }
-        return alwaysOnTxInterceptor;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/lock/aop/LockingAdvisor.java b/storage/common/src/main/java/org/artifactory/storage/fs/lock/aop/LockingAdvisor.java
deleted file mode 100644
index 28d31a3..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/lock/aop/LockingAdvisor.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.lock.aop;
-
-import org.springframework.aop.support.ComposablePointcut;
-import org.springframework.aop.support.DefaultPointcutAdvisor;
-
-/**
- * @author freds
- * @date Oct 27, 2008
- */
-public class LockingAdvisor extends DefaultPointcutAdvisor {
-    public LockingAdvisor() {
-        super(new ComposablePointcut(new LockingMethodMatcher()), new LockingAdvice());
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/lock/aop/LockingMethodMatcher.java b/storage/common/src/main/java/org/artifactory/storage/fs/lock/aop/LockingMethodMatcher.java
deleted file mode 100644
index c5bbf7e..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/lock/aop/LockingMethodMatcher.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.artifactory.storage.fs.lock.aop;
-
-import org.artifactory.sapi.common.Lock;
-import org.springframework.aop.support.AopUtils;
-import org.springframework.aop.support.StaticMethodMatcher;
-
-import java.lang.reflect.Method;
-
-/**
- * Date: 8/5/11
- * Time: 12:17 PM
- *
- * @author Fred Simon
- */
-public class LockingMethodMatcher extends StaticMethodMatcher {
-
-    public LockingMethodMatcher() {
-    }
-
-    @Override
-    public boolean matches(Method method, Class targetClass) {
-        if (method.isAnnotationPresent(Lock.class)) {
-            return true;
-        }
-        // The method may be on an interface, so let's check on the target class as well.
-        Method specificMethod = AopUtils.getMostSpecificMethod(method, targetClass);
-        if (specificMethod != method && (specificMethod.isAnnotationPresent(Lock.class))) {
-            System.err.println("FOUND ONLY IN SPECIFIC METHOD FOR " + method.toGenericString());
-            return true;
-        }
-        return false;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/lock/map/JVMLockingMap.java b/storage/common/src/main/java/org/artifactory/storage/fs/lock/map/JVMLockingMap.java
deleted file mode 100644
index a6ad89c..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/lock/map/JVMLockingMap.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.artifactory.storage.fs.lock.map;
-
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-/**
- * @author Shay Yaakov
- */
-public class JVMLockingMap implements LockingMap {
-
-    private final Map<String, String> locks = new HashMap<>();
-
-    @Override
-    public boolean tryAddAndLock(String path, long timeout, TimeUnit timeUnit) throws InterruptedException {
-        long startTime = System.currentTimeMillis();
-        while (true) {
-            synchronized (locks) {
-                if (locks.containsKey(path)) {
-                    long userTimeout = timeUnit.toMillis(timeout);
-                    locks.wait(userTimeout);
-                    long endTime = System.currentTimeMillis();
-                    if (endTime - startTime >= userTimeout) {
-                        return false;
-                    }
-                } else {
-                    locks.put(path, path);
-                    return true;
-                }
-            }
-        }
-    }
-
-    public static void main(String[] args) {
-        long l = TimeUnit.MILLISECONDS.toMillis(5000);
-        System.out.println(l);
-    }
-    @Override
-    public void removeAndUnlock(String path) {
-        synchronized (locks) {
-            locks.remove(path);
-            locks.notifyAll();
-        }
-    }
-
-    @Override
-    public void removeAndForceUnlock(String path) {
-        removeAndUnlock(path);
-    }
-
-    @Override
-    public boolean isLocked(String path) {
-        synchronized (locks) {
-            return locks.containsKey(path);
-        }
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/lock/map/LockingMap.java b/storage/common/src/main/java/org/artifactory/storage/fs/lock/map/LockingMap.java
deleted file mode 100644
index 1e0fd52..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/lock/map/LockingMap.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.artifactory.storage.fs.lock.map;
-
-import java.util.concurrent.TimeUnit;
-
-/**
- * A data structure which allows only one concurrent writer and many readers.
- *
- * @author Shay Yaakov
- */
-public interface LockingMap {
-
-    /**
-     * Adds a path to the map while locking other threads from writing the same path concurrently.
-     *
-     * @param path     The path to add
-     * @param timeout  the maximum time to wait for the lock
-     * @param timeUnit the time unit of the {@code time} argument
-     * @return {@code true} if the lock was acquired and {@code false}
-     * if the waiting time elapsed before the lock was acquired
-     * @throws InterruptedException if the current thread is interrupted
-     *                              while acquiring the lock (and interruption of lock
-     *                              acquisition is supported)
-     */
-    boolean tryAddAndLock(String path, long timeout, TimeUnit timeUnit) throws InterruptedException;
-
-    /**
-     * Removes the path from the map and releases it's lock.
-     *
-     * @param path The path to remove
-     */
-    void removeAndUnlock(String path);
-
-
-    /**
-     * Removes the path from the map and releases it's lock regardless the thread owner.
-     *
-     * @param path The path to remove
-     */
-    void removeAndForceUnlock(String path);
-
-    /**
-     * checks if the path is locked.
-     *
-     * @param path The path to remove
-     */
-    boolean isLocked(String path);
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/lock/provider/JVMLockProvider.java b/storage/common/src/main/java/org/artifactory/storage/fs/lock/provider/JVMLockProvider.java
deleted file mode 100644
index f4d7d89..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/lock/provider/JVMLockProvider.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.lock.provider;
-
-import org.artifactory.repo.RepoPath;
-import org.artifactory.storage.fs.lock.MonitoringReentrantLock;
-
-/**
- * @author Shay Yaakov
- */
-public class JVMLockProvider implements LockProvider {
-
-    @Override
-    public LockWrapper getLock(RepoPath repoPath) {
-        return new JVMLockWrapper(new MonitoringReentrantLock());
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/lock/provider/JVMLockWrapper.java b/storage/common/src/main/java/org/artifactory/storage/fs/lock/provider/JVMLockWrapper.java
deleted file mode 100644
index 151782d..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/lock/provider/JVMLockWrapper.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.lock.provider;
-
-import org.artifactory.storage.fs.lock.MonitoringReentrantLock;
-
-import java.util.Collection;
-import java.util.concurrent.TimeUnit;
-
-/**
- * @author Shay Yaakov
- */
-public class JVMLockWrapper implements LockWrapper {
-
-    private MonitoringReentrantLock delegate;
-
-    public JVMLockWrapper(MonitoringReentrantLock delegate) {
-        this.delegate = delegate;
-    }
-
-    @Override
-    public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException {
-        return delegate.tryLock(timeout, unit);
-    }
-
-    @Override
-    public void unlock() {
-        delegate.unlock();
-    }
-
-    @Override
-    public boolean isLocked() {
-        return delegate.isLocked();
-    }
-
-    @Override
-    public boolean isHeldByCurrentThread() {
-        return delegate.isHeldByCurrentThread();
-    }
-
-    @Override
-    public Collection<Thread> getQueuedThreads() {
-        return delegate.getQueuedThreads();
-    }
-
-    @Override
-    public void destroy() {
-        //noop
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/lock/provider/LockProvider.java b/storage/common/src/main/java/org/artifactory/storage/fs/lock/provider/LockProvider.java
deleted file mode 100644
index 1246ef2..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/lock/provider/LockProvider.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.lock.provider;
-
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author Shay Yaakov
- */
-public interface LockProvider {
-
-    public LockWrapper getLock(RepoPath repoPath);
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/lock/provider/LockWrapper.java b/storage/common/src/main/java/org/artifactory/storage/fs/lock/provider/LockWrapper.java
deleted file mode 100644
index c9840e3..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/lock/provider/LockWrapper.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.lock.provider;
-
-import java.util.Collection;
-import java.util.concurrent.TimeUnit;
-
-/**
- * @author Shay Yaakov
- */
-public interface LockWrapper {
-
-    boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException;
-
-    void unlock();
-
-    boolean isLocked();
-
-    boolean isHeldByCurrentThread();
-
-    Collection<Thread> getQueuedThreads();
-
-    void destroy();
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/repo/RepoStorageSummary.java b/storage/common/src/main/java/org/artifactory/storage/fs/repo/RepoStorageSummary.java
deleted file mode 100644
index 6a9e5c7..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/repo/RepoStorageSummary.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.repo;
-
-import javax.annotation.Nonnull;
-
-/**
- * Represents a repository nodes summary.
- *
- * @author Yossi Shaul
- */
-public class RepoStorageSummary {
-
-    private final String repoKey;
-    private final long foldersCount;
-    private final long filesCount;
-    private final long usedSpace;
-
-    /**
-     * Creates a new empty repository summary.
-     *
-     * @param repoKey      The repository key
-     * @param foldersCount Folders count of this repository
-     * @param filesCount   Files count of this repository
-     * @param usedSpace    Space, in bytes, used by the files in this repository
-     */
-    public RepoStorageSummary(@Nonnull String repoKey, long foldersCount, long filesCount, long usedSpace) {
-        this.repoKey = repoKey;
-        this.filesCount = filesCount;
-        this.foldersCount = foldersCount;
-        this.usedSpace = usedSpace;
-    }
-
-    /**
-     * @return The repository key
-     */
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    /**
-     * @return Folders count of this repository (the repository folder itself is not included)
-     */
-    public long getFoldersCount() {
-        return foldersCount;
-    }
-
-    /**
-     * @return Files count of this repository
-     */
-    public long getFilesCount() {
-        return filesCount;
-    }
-
-    /**
-     * @return Space used by the files in this repository. In bytes.
-     */
-    public long getUsedSpace() {
-        return usedSpace;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        RepoStorageSummary that = (RepoStorageSummary) o;
-
-        if (!repoKey.equals(that.repoKey)) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return repoKey.hashCode();
-    }
-
-    @Override
-    public String toString() {
-        final StringBuilder sb = new StringBuilder("RepoSummary{");
-        sb.append("repoKey='").append(repoKey).append('\'');
-        sb.append(", filesCount=").append(filesCount);
-        sb.append(", foldersCount=").append(foldersCount);
-        sb.append(", usedSpace=").append(usedSpace);
-        sb.append('}');
-        return sb.toString();
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/repo/StoringRepo.java b/storage/common/src/main/java/org/artifactory/storage/fs/repo/StoringRepo.java
deleted file mode 100644
index 437937b..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/repo/StoringRepo.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.repo;
-
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.fs.MutableVfsFolder;
-import org.artifactory.sapi.fs.MutableVfsItem;
-import org.artifactory.sapi.fs.VfsFolder;
-import org.artifactory.sapi.fs.VfsItem;
-
-import java.util.List;
-
-/**
- * Interface for repositories that store real artifacts.
- *
- * @author Yossi Shaul
- */
-public interface StoringRepo {
-
-    /**
-     * @return The repository key
-     */
-    public String getKey();
-
-    /**
-     * @param mutableFolder The mutable folder
-     * @return A mutable (write locked) list of direct descendants of the current mutable folder
-     */
-    List<MutableVfsItem> getMutableChildren(MutableVfsFolder mutableFolder);
-
-    /**
-     * @return True if an item with this relative path exists in this storing repository.
-     */
-    boolean itemExists(String relativePath);
-
-    List<VfsItem> getImmutableChildren(VfsFolder folder);
-
-    boolean hasChildren(VfsFolder vfsFolder);
-
-    VfsFolder getImmutableFolder(RepoPath repoPath);
-
-    boolean isWriteLocked(RepoPath repoPath);
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/service/ArchiveEntriesService.java b/storage/common/src/main/java/org/artifactory/storage/fs/service/ArchiveEntriesService.java
deleted file mode 100644
index 9209bf5..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/service/ArchiveEntriesService.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.service;
-
-import org.artifactory.fs.ZipEntryInfo;
-
-import javax.annotation.Nonnull;
-import java.util.Set;
-
-/**
- * A business service to interact with the archive entries table.
- *
- * @author Yossi Shaul
- */
-public interface ArchiveEntriesService {
-
-    /**
-     * @param archiveSha1 The checksum of the indexed archive
-     * @return Set of the indexed entries for the given sha1
-     */
-    @Nonnull
-    Set<ZipEntryInfo> getArchiveEntries(String archiveSha1);
-
-    /**
-     * @param archiveSha1 Checksum to check entries for
-     * @return True if there are entries for the given sha1 checksum
-     */
-    boolean isIndexed(String archiveSha1);
-
-    /**
-     * Create new archive entries for the given sha1 checksum
-     *
-     * @param archiveSha1 The checksum of the indexed archive
-     * @param entries     The entries to add
-     */
-    void addArchiveEntries(String archiveSha1, Set<? extends ZipEntryInfo> entries);
-
-    /**
-     * @param archiveSha1 The checksum to delete entries for
-     * @return True if any entries were deleted
-     */
-    boolean deleteArchiveEntries(String archiveSha1);
-
-    /**
-     * Deletes all the unreferenced archive entry paths. Archive entry paths used in a many-to-many relationship and
-     * should be cleaned up periodically.
-     */
-    int deleteUnusedPathIds();
-
-    /**
-     * Deletes all the unreferenced archive entry names. Archive entry names used in a many-to-many relationship and
-     * should be cleaned up periodically.
-     */
-    int deleteUnusedNameIds();
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/service/ConfigsService.java b/storage/common/src/main/java/org/artifactory/storage/fs/service/ConfigsService.java
deleted file mode 100644
index 230cd71..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/service/ConfigsService.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.service;
-
-import org.artifactory.sapi.common.Lock;
-
-import java.io.InputStream;
-
-/**
- * Manages config files stored in Artifactory.
- *
- * @author Yossi Shaul
- */
-public interface ConfigsService {
-
-    /**
-     * @param name Name of the config
-     * @return The config data if the specified config exists
-     */
-    String getConfig(String name);
-
-    /**
-     * @param name Name of the config
-     * @return True if config with the specified name exists
-     */
-    boolean hasConfig(String name);
-
-    /**
-     * Adds a new config to the storage. This method will throw {@link IllegalStateException} if the config already
-     * exist.
-     *
-     * @param name Unique name of the config
-     * @param data The data to save
-     */
-    @Lock
-    void addConfig(String name, String data);
-
-    /**
-     * Updates the data of an existing config. This method will throw {@link IllegalStateException} if the config
-     * doesn't already exist.
-     *
-     * @param name The name of the config to update
-     * @param data The new data to set
-     */
-    @Lock
-    void updateConfig(String name, String data);
-
-    /**
-     * Adds new config or updates an existing one with the input data.
-     *
-     * @param name The name of the config to add or update
-     * @param data The data to set for this config
-     * @return True is new record was created, false the record was updated
-     */
-    @Lock
-    boolean addOrUpdateConfig(String name, String data);
-
-    @Lock
-    boolean addOrUpdateConfig(String name, InputStream data, long length);
-
-    InputStream getStreamConfig(String name);
-
-    @Lock
-    void deleteConfig(String name);
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/service/FileService.java b/storage/common/src/main/java/org/artifactory/storage/fs/service/FileService.java
deleted file mode 100644
index f26867b..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/service/FileService.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.service;
-
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.fs.VfsItem;
-import org.artifactory.storage.fs.VfsException;
-import org.artifactory.storage.fs.VfsItemNotFoundException;
-import org.artifactory.storage.fs.repo.RepoStorageSummary;
-import org.artifactory.storage.fs.repo.StoringRepo;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Yossi Shaul
- */
- at SuppressWarnings("DuplicateThrows")
-public interface FileService {
-
-    boolean exists(RepoPath repoPath) throws VfsException;
-
-    @Nonnull
-    ItemInfo loadItem(RepoPath repoPath) throws VfsItemNotFoundException, VfsException;
-
-    ItemInfo loadItem(long id);
-
-    int getFilesCount() throws VfsException;
-
-    int getFilesCount(RepoPath repoPath) throws VfsException;
-
-    int getNodesCount(RepoPath repoPath) throws VfsException;
-
-    List<ItemInfo> loadChildren(RepoPath repoPath) throws VfsException;
-
-    VfsItem loadVfsItem(StoringRepo storingRepo, RepoPath repoPath) throws VfsItemNotFoundException, VfsException;
-
-    long createFolder(FolderInfo folder) throws VfsException;
-
-    int updateFolder(long id, FolderInfo folder);
-
-    long createFile(FileInfo file);
-
-    int updateFile(long id, FileInfo file);
-
-    boolean deleteItem(long id);
-
-    /**
-     * @param repoPath Repo path to check for children
-     * @return True if the repo path exists and has children. False otherwise.
-     */
-    boolean hasChildren(RepoPath repoPath);
-
-    void debugNodeStructure(RepoPath repoPath) throws VfsException;
-
-    void printNodesTable();
-
-    long getNodeId(RepoPath repoPath);
-
-    /**
-     * Returns the node ID if path exists and points to a file
-     *
-     * @param repoPath
-     * @return the nodeID
-     */
-    long getFileNodeId(RepoPath repoPath);
-
-    /**
-     * A convenience method to return the actual sha1 checksum of a file node. Will return null if the node doesn't
-     * exist or is not a file.
-     *
-     * @param repoPath The repo path of the node
-     * @return Actual Sha1 checksum of the file node or null if not found or not a file node
-     */
-    @Nullable
-    String getNodeSha1(RepoPath repoPath);
-
-    List<FileInfo> searchFilesByProperty(String repo, String propKey, String propValue);
-
-    /**
-     * Searches for pom files two levels deep (grandchild) from the input path.
-     *
-     * @param repoPath Path of the node to search grandchild poms
-     * @return List of grandchild poms
-     */
-    List<FileInfo> searchGrandchildPoms(RepoPath repoPath);
-
-    /**
-     * Search for all files with bad checksums of the given checksum type (SHA-1 or MD5)
-     *
-     * @param type The checksum type to search for, we support SHA-1 or MD5
-     */
-    List<FileInfo> searchFilesWithBadChecksum(ChecksumType type);
-
-    long getFilesTotalSize(RepoPath repoPath);
-
-    Set<RepoStorageSummary> getRepositoriesStorageSummary();
-
-    List<ItemInfo> getOrphanItems(RepoPath repoPath);
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/service/InternalWatchesService.java b/storage/common/src/main/java/org/artifactory/storage/fs/service/InternalWatchesService.java
deleted file mode 100644
index ebedabc..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/service/InternalWatchesService.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.artifactory.storage.fs.service;
-
-import org.artifactory.fs.WatcherInfo;
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author mamo
- */
-public interface InternalWatchesService {
-    //
-    int internalAddWatch(long nodeId, WatcherInfo watchInfo);
-
-    void internalDeleteAllWatchesForRepoPath(RepoPath repoPath);
-
-    void internalDeleteUserWatchesFromCache(RepoPath repoPath, String username);
-
-    void internalDeleteAllUserWatchesFromCache(String username);
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/service/ItemMetaInfo.java b/storage/common/src/main/java/org/artifactory/storage/fs/service/ItemMetaInfo.java
deleted file mode 100644
index 38b9318..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/service/ItemMetaInfo.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.service;
-
-/**
- * Holds an fs item meta info.
- *
- * @author Yossi Shaul
- */
-public class ItemMetaInfo {
-
-    // last modification date (millis)
-    private final long propsModified;
-    // username of the user last modified the properties
-    private final String propsModifiedBy;
-
-    public ItemMetaInfo(long propsModified, String propsModifiedBy) {
-        this.propsModified = propsModified;
-        this.propsModifiedBy = propsModifiedBy;
-    }
-
-    public long getPropsModified() {
-        return propsModified;
-    }
-
-    public String getPropsModifiedBy() {
-        return propsModifiedBy;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/service/NodeMetaInfoService.java b/storage/common/src/main/java/org/artifactory/storage/fs/service/NodeMetaInfoService.java
deleted file mode 100644
index 0d7b092..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/service/NodeMetaInfoService.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.service;
-
-import org.artifactory.repo.RepoPath;
-
-import javax.annotation.Nullable;
-
-/**
- * A service to retrieve metadata on nodes.
- *
- * @author Yossi Shaul
- */
-public interface NodeMetaInfoService {
-    /**
-     * @param repoPath Repo path to retrieve meta info.
-     * @return The meta info of the specified repo path. Null if none exist.
-     */
-    @Nullable
-    ItemMetaInfo getNodeMetaInfo(RepoPath repoPath);
-
-    /**
-     * Creates or updates the metadata info of the given node.
-     *
-     * @param nodeId   The node id
-     * @param metaInfo The new meta info
-     */
-    void createOrUpdateNodeMetaInfo(long nodeId, ItemMetaInfo metaInfo);
-
-    /**
-     * Deletes the meta info of the specified repo path.
-     *
-     * @param repoPath The repo path to delete meta info from
-     */
-    void deleteMetaInfo(RepoPath repoPath);
-
-    void deleteMetaInfo(long nodeId);
-
-    /**
-     * @param repoPath The item repo path
-     * @return True if the specified repo path has meta info. False if doesn't not exist.
-     */
-    boolean hasNodeMetadata(RepoPath repoPath);
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/service/PropertiesService.java b/storage/common/src/main/java/org/artifactory/storage/fs/service/PropertiesService.java
deleted file mode 100644
index f88afe1..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/service/PropertiesService.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.service;
-
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-
-import javax.annotation.Nonnull;
-
-/**
- * A business service to interact with the node properties table.
- *
- * @author Yossi Shaul
- */
-public interface PropertiesService {
-
-    //TODO: [by YS] use properties info
-
-    @Nonnull
-    Properties getProperties(RepoPath repoPath);
-
-    @Nonnull
-    Properties loadProperties(long nodeId);
-
-    boolean hasProperties(RepoPath repoPath);
-
-    /**
-     * Sets the given properties on the node id. Existing properties are overridden. An empty object will cause a
-     * removal of all the properties on this node.
-     *
-     * @param nodeId     Id of the node to set properties on
-     * @param properties The properties to set
-     */
-    void setProperties(long nodeId, Properties properties);
-
-    /**
-     * Sets the given properties on the node id. Existing properties are overridden. An empty object will cause a
-     * removal of all the properties on this node.
-     *
-     * @param repoPath RepoPath of the node
-     * @param properties The properties to set
-     */
-    void setProperties(RepoPath repoPath, Properties properties);
-
-    int deleteProperties(long nodeId);
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/service/StatsService.java b/storage/common/src/main/java/org/artifactory/storage/fs/service/StatsService.java
deleted file mode 100644
index 2bb4f7a..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/service/StatsService.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.service;
-
-import org.artifactory.fs.StatsInfo;
-import org.artifactory.repo.RepoPath;
-
-import javax.annotation.Nullable;
-
-/**
- * A business service to interact with file statistics.
- *
- * @author Yossi Shaul
- */
-public interface StatsService {
-
-    /**
-     * @param repoPath The file repo path to get stats on
-     * @return The {@link org.artifactory.fs.StatsInfo} of this node. Null if non exist
-     */
-    @Nullable
-    StatsInfo getStats(RepoPath repoPath);
-
-    /**
-     * Update the download stats and increment the count by one. The storage update is not immediate.
-     *
-     * @param repoPath       The file repo path to set/update stats
-     * @param downloadedBy   User who downloaded the file
-     * @param downloadedTime Time the file was downloaded
-     * @param fromAnotherArtifactory specifying whether request comes fromAnotherArtifactory
-     */
-    void fileDownloaded(RepoPath repoPath, String downloadedBy, long downloadedTime, boolean fromAnotherArtifactory);
-
-    /**
-     * Update the download (performed at remote artifactory instance) stats and increment the count by one.
-     * The storage update is not immediate.
-     *
-     * @param origin           The remote host the download was triggered by
-     * @param path             The round trip of download request
-     * @param repoPath         The file repo path to set/update stats
-     * @param downloadedBy     User who downloaded the file
-     * @param downloadedTime   Time the file was downloaded
-     * @param count            Amount of performed downloads
-     */
-    void fileDownloadedRemotely(String origin, String path, RepoPath repoPath, String downloadedBy, long downloadedTime, long count);
-
-    /**
-     * Sets the stats details on the given node. Existing statistics on this node are overridden.
-     *
-     * @param nodeId    The node id to set stats on.
-     * @param statsInfo The stats info
-     * @return Updates rows count. Any value other than 1 is an error
-     */
-    int setStats(long nodeId, StatsInfo statsInfo);
-
-    /**
-     * Deletes statistics info for the specified noe.
-     *
-     * @param nodeId The node id
-     * @return True if statistics were deleted from the database/ False otherwise (node doesn't exist or has no stats).
-     */
-    boolean deleteStats(long nodeId);
-
-    /**
-     * @param repoPath The repo path to check
-     * @return True if the item represented by this item has stats info. Folders never have stats info
-     */
-    boolean hasStats(RepoPath repoPath);
-
-    /**
-     * Flushes the collected statistics event from the memory to the backing storage.
-     */
-    void flushStats();
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/service/TasksService.java b/storage/common/src/main/java/org/artifactory/storage/fs/service/TasksService.java
deleted file mode 100644
index 4e650d9..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/service/TasksService.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.service;
-
-import org.artifactory.repo.RepoPath;
-
-import javax.annotation.Nonnull;
-import java.util.Set;
-
-/**
- * A business service to interact with the tasks table.
- *
- * @author Yossi Shaul
- */
-public interface TasksService {
-
-    /**
-     * Unique name of the archive indexing task type
-     */
-    String TASK_TYPE_INDEX = "INDEX";
-
-    /**
-     * @return All the repo paths currently pending for indexing.
-     */
-    @Nonnull
-    Set<RepoPath> getIndexTasks();
-
-    /**
-     * @param repoPath The repo path to check
-     * @return True if there is a pending index request for this checksum
-     */
-    boolean hasIndexTask(RepoPath repoPath);
-
-    /**
-     * Adds an index task for the given repo path.
-     *
-     * @param repoPath The repo path to index
-     */
-    void addIndexTask(RepoPath repoPath);
-
-    /**
-     * Removes an index task.
-     *
-     * @param repoPath The repo path to remove
-     * @return True if removed from the database.
-     */
-    boolean removeIndexTask(RepoPath repoPath);
-
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/service/WatchesService.java b/storage/common/src/main/java/org/artifactory/storage/fs/service/WatchesService.java
deleted file mode 100644
index 2ed888c..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/service/WatchesService.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.service;
-
-import org.artifactory.fs.WatcherInfo;
-import org.artifactory.fs.WatchersInfo;
-import org.artifactory.model.WatcherRepoPathInfo;
-import org.artifactory.repo.RepoPath;
-
-import javax.annotation.Nonnull;
-import java.util.List;
-
-/**
- * A business service to interact with the node watches table.
- *
- * @author Yossi Shaul
- */
-public interface WatchesService {
-    @Nonnull
-    WatchersInfo getWatches(RepoPath repoPath);
-
-    boolean hasWatches(RepoPath repoPath);
-
-    @Nonnull
-    int addWatch(long nodeId, WatcherInfo watchInfo);
-
-    //void setWatches(long nodeId, List<WatcherInfo> watches);
-
-    int deleteWatches(long nodeId);
-
-    /**
-     * Deletes the user watches of this node. Normally, user has at most one watch on the node.
-     *
-     * @param repoPath The repo path to delete user watches from
-     * @param username The username with the watch
-     * @return Number of watches deleted
-     */
-    int deleteUserWatches(RepoPath repoPath, String username);
-
-    /**
-     * Deletes all the user watches.
-     *
-     * @param username The username with the watch
-     * @return Number of watches deleted
-     */
-    int deleteAllUserWatches(String username);
-
-    /**
-     * Adds watches to this node.
-     *
-     * @param nodeId  The node id to set watches on.
-     * @param watches The watches to add.
-     */
-    void addWatches(long nodeId, List<WatcherInfo> watches);
-
-    @Nonnull
-    List<WatcherRepoPathInfo> loadWatches();
-
-    /**
-     * check if user is currently watching this repo path
-     * @param repoPath - repo path
-     * @param userName - user Name
-     * @return if true , user is watching
-     */
-    boolean isUserWatchingRepoPath(RepoPath repoPath,String userName);
-
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/session/StorageSession.java b/storage/common/src/main/java/org/artifactory/storage/fs/session/StorageSession.java
deleted file mode 100644
index ec10025..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/session/StorageSession.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.session;
-
-import org.artifactory.repo.RepoPath;
-import org.artifactory.storage.fs.lock.FsItemLockEntry;
-import org.artifactory.storage.fs.lock.LockEntryId;
-import org.artifactory.storage.fs.lock.SessionLockEntry;
-import org.artifactory.storage.tx.SessionResource;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
-/**
- * Represents a thread bound storage session in a context of a transaction.
- *
- * @author Yossi Shaul
- */
-public interface StorageSession {
-
-    /**
-     * Saves the changes to the underlying storage. Save is called before a transaction is committed.
-     */
-    void save();
-
-    /**
-     * Releases all the resources held by this session. This includes releasing locks.
-     */
-    void releaseResources();
-
-    /**
-     * Acquire a write lock on the entry if not already locked in the current session.
-     *
-     * @param lockEntryId The lock entry id holding the lock and the repo path
-     * @return A write locked item entry
-     */
-    @Nonnull
-    FsItemLockEntry writeLock(LockEntryId lockEntryId);
-
-    /**
-     * Removes and unlocks the entry for this repo path.
-     *
-     * @param repoPath The repo path to unlock
-     * @return True if the session held a lock entry on this repo path
-     */
-    boolean removeLockEntry(RepoPath repoPath);
-
-    /**
-     * Returns the session lock entry for the given repo path.
-     *
-     * @param repoPath The repo path to get the lock entry for
-     * @return The session lock entry for the given repo path. Null if non exist
-     */
-    @Nullable
-    SessionLockEntry getLockEntry(RepoPath repoPath);
-
-    <T extends SessionResource> T getOrCreateResource(Class<T> resourceClass);
-
-    void afterCompletion(boolean success);
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/session/StorageSessionFactory.java b/storage/common/src/main/java/org/artifactory/storage/fs/session/StorageSessionFactory.java
deleted file mode 100644
index 89ab262..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/session/StorageSessionFactory.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.session;
-
-/**
- * @author Yossi Shaul
- */
-public interface StorageSessionFactory {
-    StorageSession create();
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/session/StorageSessionHolder.java b/storage/common/src/main/java/org/artifactory/storage/fs/session/StorageSessionHolder.java
deleted file mode 100644
index 1975bb1..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/session/StorageSessionHolder.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.session;
-
-/**
- * {@link ThreadLocal} based session holder.
- *
- * @author Yossi Shaul
- */
-public class StorageSessionHolder {
-
-    private static final ThreadLocal<StorageSession> sessionHolder = new ThreadLocal<>();
-
-    public static StorageSession getSession() {
-        return sessionHolder.get();
-    }
-
-    public static void setSession(StorageSession session) {
-        sessionHolder.set(session);
-    }
-
-    public static void removeSession() {
-        sessionHolder.remove();
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/tree/FileNode.java b/storage/common/src/main/java/org/artifactory/storage/fs/tree/FileNode.java
deleted file mode 100644
index 610741a..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/tree/FileNode.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.tree;
-
-import org.artifactory.api.repo.RootNodesFilterResult;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.ItemInfo;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * A file node is a file system node with {@link org.artifactory.fs.FileInfo} as its data.
- * The node is detached from the database and may not exist anymore.
- *
- * @author Yossi Shaul
- */
-public class FileNode extends ItemNode {
-    public FileNode(FileInfo itemInfo) {
-        super(itemInfo);
-    }
-
-    @Override
-    public List<ItemNode> getChildren() {
-        return Collections.emptyList();
-    }
-
-    @Override
-    public List<ItemNode> getChildren(boolean returnAcceptedNode,RootNodesFilterResult rootNodesFilterResult) {
-        return Collections.emptyList();
-    }
-
-    @Override
-    public List<ItemInfo> getChildrenInfo() {
-        return Collections.emptyList();
-    }
-
-    @Override
-    public boolean hasChildren() {
-        return false;
-    }
-
-    @Override
-    public FileInfo getItemInfo() {
-        return (FileInfo) super.getItemInfo();
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/tree/FilterAccepted.java b/storage/common/src/main/java/org/artifactory/storage/fs/tree/FilterAccepted.java
deleted file mode 100644
index f2c3909..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/tree/FilterAccepted.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.artifactory.storage.fs.tree;
-
-/**
- * @Author Chen Keinan
- */
-public interface FilterAccepted {
-
-    boolean isNodeAcceptCanRead();
-
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/tree/FolderNode.java b/storage/common/src/main/java/org/artifactory/storage/fs/tree/FolderNode.java
deleted file mode 100644
index 6793b4f..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/tree/FolderNode.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.tree;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Lists;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RootNodesFilterResult;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.storage.fs.service.FileService;
-import org.artifactory.storage.fs.tree.file.NodeItemFilterHolder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * A folder node is a virtual file system node with {@link org.artifactory.fs.FolderInfo} as its data.
- * The node is detached from the database and may not exist anymore.
- *
- * @author Yossi Shaul
- */
-public class FolderNode extends ItemNode{
-    private static final Logger log = LoggerFactory.getLogger(FolderNode.class);
-    private final TreeBrowsingCriteria criteria;
-    private List<ItemNode> cachedChildrenNodes;
-
-    public FolderNode(FolderInfo itemInfo, TreeBrowsingCriteria criteria) {
-        super(itemInfo);
-        this.criteria = criteria;
-    }
-
-    @Override
-    public List<ItemNode> getChildren() {
-      return getChildrenItemNode(false,null);
-    }
-
-    @Override
-    public List<ItemNode> getChildren(boolean updateRootNodesFilterFlag,RootNodesFilterResult rootNodesFilterResult) {
-        return getChildrenItemNode(updateRootNodesFilterFlag,rootNodesFilterResult);
-    }
-
-    /**
-     * if nodes accepted by filters (include/exclude , canRead and etc) , node is added to list
-     * @param updateRootNodesFilterFlag - if true , filter acceptance flag will be monitored
-     * @param rootNodesFilterResult - hold canRead flag in case list is empty due to permission issue
-     * @return list of child nodes
-     */
-    private List<ItemNode> getChildrenItemNode(boolean updateRootNodesFilterFlag,RootNodesFilterResult rootNodesFilterResult) {
-        if (cachedChildrenNodes != null) {
-            return cachedChildrenNodes;
-        }
-        List<ItemInfo> children = getFileService().loadChildren(itemInfo.getRepoPath());
-        List<ItemNode> childrenNodes = Lists.newArrayListWithCapacity(children.size());
-        sort(children);
-        boolean localAcceptanceFlag = true;
-        for (ItemInfo child : children) {
-            NodeItemFilterHolder nodeItemFilterHolder = accepts(child);
-            boolean isChildAccepted = nodeItemFilterHolder.isAccepted();
-            if (isChildAccepted) {
-                addChildToList(childrenNodes, child);
-            }
-            else{
-                localAcceptanceFlag = updateAcceptedLocalFlag(localAcceptanceFlag,nodeItemFilterHolder);
-            }
-        }
-        updateCachedChildrenNodes(childrenNodes);
-
-        updateBrowsableItemAcceptedHolderCanReadFlag(updateRootNodesFilterFlag, rootNodesFilterResult,
-                childrenNodes, localAcceptanceFlag);
-        return childrenNodes;
-    }
-
-    /**
-     * update child cache and browsableItemAccept can read flag when list is empty duw to file access permission
-     * @param updateRootNodesFilterFlag - if true update the browsableItemAccept canRead flag
-     * @param rootNodesFilterResult - object hold the empty list canRead flag
-     * @param childrenNodes  - list of child nodes
-     * @param localAcceptanceFlag - local can read flag , if false child node read permission isn't accepted
-     */
-    private void updateBrowsableItemAcceptedHolderCanReadFlag(boolean updateRootNodesFilterFlag,
-            RootNodesFilterResult rootNodesFilterResult, List<ItemNode> childrenNodes,
-            boolean localAcceptanceFlag) {
-         if(childrenNodes.isEmpty() && updateRootNodesFilterFlag && !localAcceptanceFlag){
-             rootNodesFilterResult.setAllItemNodesCanRead(false);
-        }
-    }
-
-    /**
-     * update cache children nodes
-     * @param childrenNodes - list of children nodes
-     */
-    private void updateCachedChildrenNodes(List<ItemNode> childrenNodes) {
-        if (criteria.isCacheChildren()) {
-            cachedChildrenNodes = childrenNodes;
-        }
-    }
-
-    /**
-     * update the local can read flag , if flag is false meaning , at least one node has read permission issue
-     * @param localAcceptanceFlag accepted local flag
-     * @param acceptedChild - filter instance which hold the acceptance result
-     * @return it false , meaning one of the note items didn't passed the canRead filter
-     */
-    private boolean updateAcceptedLocalFlag(boolean localAcceptanceFlag, NodeItemFilterHolder nodeItemFilterHolder) {
-        ItemNodeFilter acceptedFilter = nodeItemFilterHolder.getItemNodeFilter();
-        if (localAcceptanceFlag && acceptedFilter instanceof FilterAccepted){
-            localAcceptanceFlag = ((FilterAccepted)acceptedFilter).isNodeAcceptCanRead();
-        }
-        return localAcceptanceFlag;
-    }
-
-    /**
-     * add child nodes to list if accepted
-     * @param childrenNodes - child node list
-     * @param child - node that has been accepted
-     */
-    private void addChildToList(List<ItemNode> childrenNodes, ItemInfo child) {
-        if (child.isFolder()) {
-            childrenNodes.add(new FolderNode((FolderInfo) child, criteria));
-        } else {
-            childrenNodes.add(new FileNode((FileInfo) child));
-        }
-    }
-
-    @Override
-    public List<ItemInfo> getChildrenInfo() {
-        List<ItemNode> children = getChildren();
-        return Lists.transform(children, new Function<ItemNode, ItemInfo>() {
-            @Override
-            public ItemInfo apply(ItemNode input) {
-                return input.getItemInfo();
-            }
-        });
-    }
-
-    public NodeItemFilterHolder accepts(ItemInfo child) {
-        NodeItemFilterHolder itemNodeFilterAccepted;
-        if (criteria.getFilters() == null) {
-            itemNodeFilterAccepted = new NodeItemFilterHolder(true);
-            return itemNodeFilterAccepted;
-        }
-        for (ItemNodeFilter filter : criteria.getFilters()) {
-            if (!filter.accepts(child)) {
-                log.debug("Filter {} rejected {}", filter, child);
-                itemNodeFilterAccepted = new NodeItemFilterHolder(false,filter);
-                return  itemNodeFilterAccepted;
-            }
-        }
-        // all filters accepted the item
-        itemNodeFilterAccepted = new NodeItemFilterHolder(true);
-        return itemNodeFilterAccepted;
-    }
-
-    private void sort(List<ItemInfo> children) {
-        if (criteria.getComparator() == null) {
-            return;
-        }
-        Collections.sort(children, criteria.getComparator());
-    }
-
-    @Override
-    public boolean hasChildren() {
-        if (cachedChildrenNodes != null) {
-            return !cachedChildrenNodes.isEmpty();
-        } else {
-            return getFileService().hasChildren(itemInfo.getRepoPath());
-        }
-    }
-
-    @Override
-    public FolderInfo getItemInfo() {
-        return (FolderInfo) super.getItemInfo();
-    }
-
-    private FileService getFileService() {
-        return ContextHelper.get().beanForType(FileService.class);
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/tree/ItemNode.java b/storage/common/src/main/java/org/artifactory/storage/fs/tree/ItemNode.java
deleted file mode 100644
index 7a31e84..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/tree/ItemNode.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.tree;
-
-import org.artifactory.api.repo.RootNodesFilterResult;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.RepoPath;
-
-import java.util.List;
-
-/**
- * A detached item info node.
- *
- * @author Yossi Shaul
- */
-public abstract class ItemNode {
-
-    protected final ItemInfo itemInfo;
-
-    public ItemNode(ItemInfo itemInfo) {
-        this.itemInfo = itemInfo;
-    }
-
-    /**
-     * @return The item info represented by this node
-     */
-    public ItemInfo getItemInfo() {
-        return itemInfo;
-    }
-
-    /**
-     * @return The repository path of the item held by this node
-     */
-    public RepoPath getRepoPath() {
-        return itemInfo.getRepoPath();
-    }
-
-    /**
-     * @return The file/folder name of this item node
-     * @see org.artifactory.repo.RepoPath#getName()
-     */
-    public String getName() {
-        return itemInfo.getName();
-    }
-
-    /**
-     * @return True if this node represents a folder
-     */
-    public boolean isFolder() {
-        return itemInfo.isFolder();
-    }
-
-    @Override
-    public String toString() {
-        return getClass().getSimpleName() + "[" + getRepoPath() + "]";
-    }
-
-    public abstract List<ItemNode> getChildren();
-
-    public abstract List<ItemNode> getChildren(boolean returnAcceptedNode,RootNodesFilterResult browsableItemAccept);
-
-    public abstract List<ItemInfo> getChildrenInfo();
-
-    public abstract boolean hasChildren();
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/tree/ItemNodeFilter.java b/storage/common/src/main/java/org/artifactory/storage/fs/tree/ItemNodeFilter.java
deleted file mode 100644
index 2b4e194..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/tree/ItemNodeFilter.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.tree;
-
-import org.artifactory.fs.ItemInfo;
-
-import javax.annotation.Nonnull;
-
-/**
- * A filter of {@link org.artifactory.fs.ItemInfo}.
- * <p/>
- * This filter may be passed to the {@link ItemTree} and
- * {@link FolderNode}.
- *
- * @author Yossi Shaul
- */
-public interface ItemNodeFilter {
-
-    /**
-     * Checks whether this filter accepts the given item info.
-     *
-     * @param itemInfo Item info to check
-     * @return True if the filter accepts this item.
-     */
-    boolean accepts(@Nonnull ItemInfo itemInfo);
-
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/tree/ItemTree.java b/storage/common/src/main/java/org/artifactory/storage/fs/tree/ItemTree.java
deleted file mode 100644
index 4a2be88..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/tree/ItemTree.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.tree;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.storage.fs.VfsItemNotFoundException;
-import org.artifactory.storage.fs.service.FileService;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.List;
-
-/**
- * A tree representation of the vfs file system. The item tree holds no storage locks and represents the state of the
- * database in the time the tree is created.
- *
- * @author Yossi Shaul
- */
-public class ItemTree {
-
-    private final RepoPath rootRepoPath;
-    private final TreeBrowsingCriteria criteria;
-
-    /**
-     * Create an items tree with the repo path as root node.
-     *
-     * @param root Repo path of the root node.
-     */
-    public ItemTree(RepoPath root) {
-        this(root, (ItemNodeFilter) null);
-    }
-
-    /**
-     * Create an items tree with the repo path as root node. The filter is optional and affects only decedents.
-     *
-     * @param root   Repo path of the root node.
-     * @param filter Optional filter for child nodes
-     */
-    public ItemTree(RepoPath root, @Nullable ItemNodeFilter filter) {
-        this(root, new TreeBrowsingCriteriaBuilder().addFilter(filter).build());
-    }
-
-    /**
-     * Create an items tree with detailed criteria.
-     *
-     * @param root     Repo path of the root node.
-     * @param criteria Criteria for the tree browsing
-     */
-    public ItemTree(RepoPath root, @Nonnull TreeBrowsingCriteria criteria) {
-        rootRepoPath = root;
-        this.criteria = criteria;
-    }
-
-    /**
-     * @return The root node of the tree or null if the root repo path doesn't exist in the storage.
-     */
-    @Nullable
-    public ItemNode getRootNode() {
-        ItemInfo rootItemInfo;
-        try {
-            FileService fileService = ContextHelper.get().beanForType(FileService.class);
-            rootItemInfo = fileService.loadItem(rootRepoPath);
-        } catch (VfsItemNotFoundException e) {
-            // nobody promised the root exists
-            return null;
-        }
-        if (rootItemInfo.isFolder()) {
-            return new FolderNode((FolderInfo) rootItemInfo, criteria);
-        } else {
-            return new FileNode((FileInfo) rootItemInfo);
-        }
-    }
-
-    /**
-     * Builds the tree and caches all the nodes. Children caching must be enabled (true by default).
-     *
-     * @return The root node of the tree
-     */
-    @Nullable
-    public ItemNode buildTree() {
-        if (!criteria.isCacheChildren()) {
-            throw new IllegalStateException("Can't build tree for " + rootRepoPath
-                    + " with children caching off");
-        }
-        ItemNode rootNode = getRootNode();
-        buildTree(rootNode);
-        return rootNode;
-    }
-
-    private void buildTree(ItemNode currentNode) {
-        if (currentNode == null) {
-            return;
-        }
-
-        if (currentNode.itemInfo.isFolder()) {
-            List<ItemNode> children = currentNode.getChildren();
-            for (ItemNode child : children) {
-                buildTree(child);
-            }
-        }
-    }
-
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/tree/TreeBrowsingCriteria.java b/storage/common/src/main/java/org/artifactory/storage/fs/tree/TreeBrowsingCriteria.java
deleted file mode 100644
index caf40e2..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/tree/TreeBrowsingCriteria.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.tree;
-
-import org.artifactory.fs.ItemInfo;
-
-import javax.annotation.Nullable;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * A criteria fo browsing the tree of nodes.
- *
- * @author Yossi Shaul
- */
-public class TreeBrowsingCriteria {
-
-    private boolean cacheChildren;
-    private List<ItemNodeFilter> filters;
-    private Comparator<ItemInfo> comparator;
-
-    public TreeBrowsingCriteria(boolean cacheChildren,
-            List<ItemNodeFilter> filters, Comparator<ItemInfo> comparator) {
-        this.cacheChildren = cacheChildren;
-        this.filters = filters;
-        this.comparator = comparator;
-    }
-
-    public boolean isCacheChildren() {
-        return cacheChildren;
-    }
-
-    @Nullable
-    public List<ItemNodeFilter> getFilters() {
-        return filters;
-    }
-
-    @Nullable
-    public Comparator<ItemInfo> getComparator() {
-        return comparator;
-    }
-
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/tree/TreeBrowsingCriteriaBuilder.java b/storage/common/src/main/java/org/artifactory/storage/fs/tree/TreeBrowsingCriteriaBuilder.java
deleted file mode 100644
index 9248139..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/tree/TreeBrowsingCriteriaBuilder.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.tree;
-
-import com.google.common.collect.Lists;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.RepoPath;
-
-import javax.annotation.Nonnull;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * Criteria builder for tree browsing.
- *
- * @author Yossi Shaul
- */
-public class TreeBrowsingCriteriaBuilder {
-
-    private boolean cacheChildren = true;
-    private List<ItemNodeFilter> filters;
-    private Comparator<ItemInfo> comparator;
-
-    public TreeBrowsingCriteria build() {
-        return new TreeBrowsingCriteria(cacheChildren, filters, comparator);
-    }
-
-    public TreeBrowsingCriteriaBuilder cacheChildren(boolean cache) {
-        cacheChildren = cache;
-        return this;
-    }
-
-    public TreeBrowsingCriteriaBuilder addFilter(ItemNodeFilter filter) {
-        if (filter == null) {
-            return this;
-        }
-        if (filters == null) {
-            filters = Lists.newArrayList();
-        }
-        filters.add(filter);
-        return this;
-    }
-
-    public TreeBrowsingCriteriaBuilder sortAlphabetically() {
-        comparator = new Comparator<ItemInfo>() {
-            @Override
-            public int compare(ItemInfo a, ItemInfo b) {
-                if (a.getName().equals(b.getName())) {
-                    return 0;
-                }
-                if (a.isFolder() && !b.isFolder()) {
-                    return -1;
-                }
-                if (!a.isFolder() && b.isFolder()) {
-                    return 1;
-                }
-                return a.getName().compareTo(b.getName());
-            }
-        };
-        return this;
-    }
-
-    public TreeBrowsingCriteriaBuilder sortBy(Comparator<ItemInfo> comparator) {
-        this.comparator = comparator;
-        return this;
-    }
-
-    public TreeBrowsingCriteriaBuilder applySecurity() {
-        addFilter(new ItemNodeSecurityFilter(ContextHelper.get().getAuthorizationService()));
-        return this;
-    }
-
-    public TreeBrowsingCriteriaBuilder applyRepoIncludeExclude() {
-        addFilter(new ItemNodeRepoIncludeExcludeFilter(ContextHelper.get().getRepositoryService()));
-        return this;
-    }
-
-    private static class ItemNodeSecurityFilter implements ItemNodeFilter,FilterAccepted {
-        private final AuthorizationService authService;
-        private boolean canRead = true;
-
-        public ItemNodeSecurityFilter(AuthorizationService authService) {
-            this.authService = authService;
-        }
-
-        @Override
-        public boolean accepts(@Nonnull ItemInfo itemInfo) {
-            canRead =  authService.canRead(itemInfo.getRepoPath());
-            return canRead;
-        }
-
-        @Override
-        public boolean isNodeAcceptCanRead() {
-            return canRead;
-        }
-    }
-
-    private static class ItemNodeRepoIncludeExcludeFilter implements ItemNodeFilter,FilterAccepted {
-        private final RepositoryService repoService;
-
-        public ItemNodeRepoIncludeExcludeFilter(RepositoryService repoService) {
-            this.repoService = repoService;
-        }
-
-        @Override
-        public boolean accepts(@Nonnull ItemInfo itemInfo) {
-            RepoPath repoPath = itemInfo.getRepoPath();
-            return repoService.isRepoPathAccepted(repoPath);
-        }
-
-        @Override
-        public boolean isNodeAcceptCanRead() {
-            return true;
-        }
-    }
-}
-
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/tree/file/JavaIOFileAdapter.java b/storage/common/src/main/java/org/artifactory/storage/fs/tree/file/JavaIOFileAdapter.java
deleted file mode 100644
index 2830acb..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/tree/file/JavaIOFileAdapter.java
+++ /dev/null
@@ -1,378 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.tree.file;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.storage.binstore.service.BinaryService;
-import org.artifactory.storage.fs.tree.ItemNode;
-import org.artifactory.util.PathUtils;
-
-import javax.annotation.Nullable;
-import java.io.*;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URL;
-import java.util.List;
-
-/**
- * A read only adapter for frameworks that expect to work with {@link java.io.File}.
- * This class is backed by {@link org.artifactory.storage.fs.tree.ItemTree} and keeps reference to its parent.
- *
- * @author Yossi Shaul
- */
-public class JavaIOFileAdapter extends File {
-
-    /**
-     * Parent file of the current file. Null if this is the root node.
-     */
-    private final JavaIOFileAdapter parent;
-
-    private final String absolutePath;
-    private final ItemNode itemNode;
-    private final ItemInfo info;
-
-    public JavaIOFileAdapter(ItemNode itemNode) {
-        this(itemNode, null);
-    }
-
-    public JavaIOFileAdapter(ItemNode itemNode, JavaIOFileAdapter parent) {
-        super(itemNode.getRepoPath().toPath());
-        this.itemNode = itemNode;
-        this.parent = parent;
-        this.absolutePath = super.getPath();
-        info = itemNode.getItemInfo();
-    }
-
-    public ItemInfo getInfo() {
-        return info;
-    }
-
-    public FileInfo getFileInfo() {
-        assert isFile();
-        return (FileInfo) info;
-    }
-
-    public RepoPath getRepoPath() {
-        return info.getRepoPath();
-    }
-
-    public InputStream getStream() {
-        assert isFile();
-        return ContextHelper.get().beanForType(BinaryService.class).getBinary(getFileInfo().getSha1());
-    }
-
-    public JavaIOFileAdapter getChild(String name) {
-        if (!isDirectory()) {
-            return null;
-        }
-
-        JavaIOFileAdapter[] children = listFiles();
-        if (children != null) {
-            for (JavaIOFileAdapter child : children) {
-                if (child.getName().equals(name)) {
-                    return child;
-                }
-            }
-        }
-        return null;
-    }
-
-    public JavaIOFileAdapter getSibling(String name) {
-        JavaIOFileAdapter parentFile = getParentFile();
-        if (parentFile == null) {
-            return null;
-        }
-
-        return parentFile.getChild(name);
-    }
-
-    @Override
-    public String getName() {
-        return info.getName();
-    }
-
-    @Override
-    public String getAbsolutePath() {
-        return absolutePath;
-    }
-
-    /**
-     * @return Parent folder of the current file or null if current file is the root
-     */
-    @Override
-    @Nullable
-    public JavaIOFileAdapter getParentFile() {
-        return parent;
-    }
-
-    @Override
-    public String getParent() {
-        return PathUtils.getParent(getAbsolutePath());
-    }
-
-    @Override
-    public boolean isAbsolute() {
-        return true;
-    }
-
-    @Override
-    public File getAbsoluteFile() {
-        return this;
-    }
-
-    @Override
-    public String getCanonicalPath() throws IOException {
-        return getAbsolutePath();
-    }
-
-    @Override
-    public File getCanonicalFile() throws IOException {
-        return this;
-    }
-
-    @Override
-    public boolean canRead() {
-        return getAuthorizationService().canRead(getRepoPath());
-    }
-
-    @Override
-    public boolean canWrite() {
-        return false;   // this is a read only adapter
-    }
-
-    @Override
-    public boolean exists() {
-        return true;    // exists at the time of construction
-    }
-
-    @Override
-    public boolean isFile() {
-        return !isDirectory();
-    }
-
-    @Override
-    public boolean isHidden() {
-        return getName().startsWith(".");
-    }
-
-    @Override
-    public boolean canExecute() {
-        return false;
-    }
-
-    @Override
-    public int compareTo(File item) {
-        //TODO: [by YS] why name and not abs path?
-        return getName().compareTo(item.getName());
-    }
-
-    @Override
-    public String getPath() {
-        return getAbsolutePath();
-    }
-
-    @Override
-    public final long lastModified() {
-        return info.getLastModified();
-    }
-
-    @Override
-    public boolean isDirectory() {
-        return info.isFolder();
-    }
-
-    @Override
-    public long length() {
-        if (isDirectory()) {
-            return 0;
-        } else {
-            return getFileInfo().getSize();
-        }
-    }
-
-    @Override
-    public String[] list() {
-        if (!isDirectory()) {
-            return null;
-        } else {
-            List<ItemNode> children = itemNode.getChildren();
-            String[] childrenNames = new String[children.size()];
-            for (int i = 0; i < childrenNames.length; i++) {
-                childrenNames[i] = children.get(i).getName();
-            }
-            return childrenNames;
-        }
-    }
-
-    @Override
-    public JavaIOFileAdapter[] listFiles() {
-        if (!isDirectory()) {
-            return null;
-        } else {
-            List<ItemNode> children = itemNode.getChildren();
-            JavaIOFileAdapter[] childrenFiles = new JavaIOFileAdapter[children.size()];
-            for (int i = 0; i < childrenFiles.length; i++) {
-                childrenFiles[i] = new JavaIOFileAdapter(children.get(i), this);
-            }
-            return childrenFiles;
-        }
-    }
-
-    @Override
-    public String toString() {
-        return getAbsolutePath();
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof JavaIOFileAdapter)) {
-            return false;
-        }
-        JavaIOFileAdapter item = (JavaIOFileAdapter) o;
-        return item.getAbsolutePath().equals(item.getAbsolutePath());
-    }
-
-    @Override
-    public int hashCode() {
-        return getAbsolutePath().hashCode();
-    }
-
-    @Override
-    public boolean setReadOnly() {
-        return false;
-    }
-
-    @Override
-    public boolean setWritable(boolean writable, boolean ownerOnly) {
-        return false;
-    }
-
-    @Override
-    public boolean setWritable(boolean writable) {
-        return false;
-    }
-
-    @Override
-    public boolean setReadable(boolean readable, boolean ownerOnly) {
-        return false;
-    }
-
-    @Override
-    public boolean setReadable(boolean readable) {
-        return false;
-    }
-
-    @Override
-    public boolean setExecutable(boolean executable, boolean ownerOnly) {
-        return false;
-    }
-
-    @Override
-    public boolean setExecutable(boolean executable) {
-        return false;
-    }
-
-    @Override
-    public String[] list(FilenameFilter filter) {
-        throw new UnsupportedOperationException("list(FilenameFilter) is not supported in VFS.");
-    }
-
-    @Override
-    public File[] listFiles(FilenameFilter filter) {
-        throw new UnsupportedOperationException("listFiles() is not supported in VFS.");
-    }
-
-    @Override
-    public File[] listFiles(FileFilter filter) {
-        throw new UnsupportedOperationException("listFiles(FileFilter) is not supported in VFS.");
-    }
-
-    @SuppressWarnings({"deprecation"})
-    @Override
-    @Deprecated
-    public URL toURL() throws MalformedURLException {
-        throw new UnsupportedOperationException("toURL() is not supported in VFS.");
-    }
-
-    @Override
-    public URI toURI() {
-        throw new UnsupportedOperationException("toURI() is not supported in VFS.");
-    }
-
-    @Override
-    public final boolean setLastModified(long time) {
-        throw new UnsupportedOperationException("setLastModified() is not supported on VFS");
-    }
-
-    @Override
-    public boolean mkdir() {
-        throw new UnsupportedOperationException("mkdir() is not supported in VFS.");
-    }
-
-    @Override
-    public boolean mkdirs() {
-        throw new UnsupportedOperationException("mkdirs() is not supported in VFS.");
-    }
-
-    @Override
-    public boolean delete() {
-        throw new UnsupportedOperationException("delete() is not supported in VFS.");
-    }
-
-    @Override
-    public boolean createNewFile() throws IOException {
-        throw new UnsupportedOperationException("createNewFile() is not supported in VFS.");
-    }
-
-    @Override
-    public void deleteOnExit() {
-        throw new UnsupportedOperationException("deleteOnExit() is not supported in VFS.");
-    }
-
-    @Override
-    public boolean renameTo(File dest) {
-        throw new UnsupportedOperationException("renameTo() is not supported in VFS.");
-    }
-
-    @Override
-    public long getTotalSpace() {
-        throw new UnsupportedOperationException("getTotalSpace() is not supported in VFS.");
-    }
-
-    @Override
-    public long getFreeSpace() {
-        throw new UnsupportedOperationException("getFreeSpace() is not supported in VFS.");
-    }
-
-    @Override
-    public long getUsableSpace() {
-        throw new UnsupportedOperationException("getUsableSpace() is not supported in VFS.");
-    }
-
-    private AuthorizationService getAuthorizationService() {
-        return ContextHelper.get().getAuthorizationService();
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/fs/tree/file/NodeItemFilterHolder.java b/storage/common/src/main/java/org/artifactory/storage/fs/tree/file/NodeItemFilterHolder.java
deleted file mode 100644
index 7bace4d..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/fs/tree/file/NodeItemFilterHolder.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.artifactory.storage.fs.tree.file;
-
-import org.artifactory.storage.fs.tree.ItemNodeFilter;
-
-/**
- * @author Chen Keinan
- */
-public class NodeItemFilterHolder {
-
-    private ItemNodeFilter itemNodeFilter;
-    private boolean accepted = true;
-
-    public NodeItemFilterHolder(boolean accepted){
-        this.accepted= accepted;
-    }
-
-    public NodeItemFilterHolder(boolean accepted, ItemNodeFilter itemNodeFilter){
-        this.itemNodeFilter = itemNodeFilter;
-        this.accepted= accepted;
-    }
-
-    public ItemNodeFilter getItemNodeFilter() {
-        return itemNodeFilter;
-    }
-
-    public boolean isAccepted() {
-        return accepted;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/model/FileBinaryProviderInfo.java b/storage/common/src/main/java/org/artifactory/storage/model/FileBinaryProviderInfo.java
deleted file mode 100644
index 8c681bb..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/model/FileBinaryProviderInfo.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.artifactory.storage.model;
-
-import java.io.File;
-
-/**
- * @author gidis
- */
-public class FileBinaryProviderInfo {
-    private File tempDir;
-    private File fileStoreDir;
-    private String type;
-
-    public FileBinaryProviderInfo(File tempDir, File fileStoreDir, String type) {
-        this.tempDir = tempDir;
-        this.fileStoreDir = fileStoreDir;
-        this.type = type;
-    }
-
-    public File getTempDir() {
-        return tempDir;
-    }
-
-    public File getFileStoreDir() {
-        return fileStoreDir;
-    }
-
-    public String getType() {
-        return type;
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/security/service/AclStoreService.java b/storage/common/src/main/java/org/artifactory/storage/security/service/AclStoreService.java
deleted file mode 100644
index 57f54f4..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/security/service/AclStoreService.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.security.service;
-
-import org.artifactory.sapi.common.Lock;
-import org.artifactory.security.AclInfo;
-import org.artifactory.security.GroupInfo;
-import org.artifactory.security.MutableAclInfo;
-import org.artifactory.security.UserInfo;
-
-import java.util.Collection;
-
-/**
- * Date: 9/3/12
- * Time: 4:13 PM
- *
- * @author freds
- */
-public interface AclStoreService {
-
-    /**
-     * @return Returns all the AclInfos
-     */
-    Collection<AclInfo> getAllAcls();
-
-    @Lock
-    void createAcl(AclInfo entity);
-
-    @Lock
-    void updateAcl(MutableAclInfo acl);
-
-    @Lock
-    void deleteAcl(String permTargetName);
-
-    AclInfo getAcl(String permTargetName);
-
-    boolean permissionTargetExists(String permTargetName);
-
-    boolean userHasPermissions(String username);
-
-    @Lock
-    void removeAllUserAces(String username);
-
-    @Lock
-    void createDefaultSecurityEntities(UserInfo anonUser, GroupInfo readersGroup, String currentUsername);
-
-    @Lock
-    void deleteAllAcls();
-
-    void removeAllGroupAces(String groupName);
-
-    int promoteAclsDbVersion();
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/security/service/UserGroupStoreService.java b/storage/common/src/main/java/org/artifactory/storage/security/service/UserGroupStoreService.java
deleted file mode 100644
index d69ddba..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/security/service/UserGroupStoreService.java
+++ /dev/null
@@ -1,386 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.security.service;
-
-import java.sql.SQLException;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
-import org.artifactory.api.security.PasswordExpiryUser;
-import org.artifactory.common.Info;
-import org.artifactory.md.Properties;
-import org.artifactory.sapi.common.Lock;
-import org.artifactory.security.*;
-
-/**
- * Date: 8/27/12
- * Time: 2:44 PM
- *
- * @author freds
- */
-public interface UserGroupStoreService {
-
-    /**
-     * @param username The unique username
-     * @return UserInfo if user with the input username exists, null otherwise
-     */
-    @Nullable
-    UserInfo findUser(String username);
-
-    @Lock
-    void updateUser(MutableUserInfo user);
-
-    /**
-     * Updates user access details
-     *
-     * @param userName
-     * @param clientIp
-     * @param accessTimeMillis
-     */
-    void updateUserAccess(String userName, String clientIp, long accessTimeMillis);
-
-    @Lock
-    boolean createUser(UserInfo user);
-
-    @Lock
-    boolean createUserWithProperties(UserInfo user, boolean addUserProperties);
-
-    @Lock
-    void deleteUser(String username);
-
-    List<UserInfo> getAllUsers(boolean includeAdmins);
-
-    /**
-     * Deletes the group from the database including any group membership users have to this group.
-     *
-     * @param groupName The group name to delete
-     * @return True if the group and/or membership in this group was deleted
-     */
-    @Lock
-    boolean deleteGroup(String groupName);
-
-    List<GroupInfo> getAllGroups();
-
-    /**
-     * @return A set of all the groups that should be added by default to newly created users.
-     */
-    List<GroupInfo> getNewUserDefaultGroups();
-
-    /**
-     * @return A list of all groups that are of an external realm
-     */
-    List<GroupInfo> getAllExternalGroups();
-
-    /**
-     * @return A list of <b>internal</b> groups only
-     */
-    List<GroupInfo> getInternalGroups();
-
-    /**
-     * @return A set of all the groups names that should be added by default to newly created users.
-     */
-    Set<String> getNewUserDefaultGroupsNames();
-
-    /**
-     * Updates a users group. Group name update is not allowed.
-     *
-     * @param groupInfo The updated group info
-     */
-    @Lock
-    void updateGroup(MutableGroupInfo groupInfo);
-
-    @Lock
-    boolean createGroup(GroupInfo groupInfo);
-
-    /**
-     * Adds a list of users to a group.
-     *
-     * @param groupName The group's unique name.
-     * @param usernames The list of usernames.
-     */
-    @Lock
-    void addUsersToGroup(String groupName, List<String> usernames);
-
-    /**
-     * Deletes the user's membership of a group.
-     *
-     * @param groupName The group name
-     * @param usernames The list of usernames
-     */
-    @Lock
-    void removeUsersFromGroup(String groupName, List<String> usernames);
-
-    /**
-     * Locates the users who are members of a group
-     *
-     * @param groupName the group whose members are required
-     * @return the usernames of the group members
-     */
-    List<UserInfo> findUsersInGroup(String groupName);
-
-    /**
-     * Find the group info object for this group name
-     *
-     * @param groupName The name of the group to find
-     * @return the group information if group with name found, null otherwise
-     */
-    @Nullable
-    GroupInfo findGroup(String groupName);
-
-    @Lock
-    void deleteAllGroupsAndUsers();
-
-    boolean adminUserExists();
-
-    boolean userExists(String username);
-
-    /**
-     * get user groups paging
-     *
-     * @param includeAdmins include admin
-     * @return list
-     */
-    Collection<Info> getUsersGroupsPaging(boolean includeAdmins, String orderBy,
-                                          String startOffset, String limit, String direction);
-
-    /**
-     * get all users and groups count
-     *
-     * @param includeAdmins include admin
-     * @return num of records
-     */
-    long getAllUsersGroupsCount(boolean includeAdmins);
-
-    /**
-     * Find the user associated with the given external user datum
-     *
-     * @param key The key associated with this datum
-     * @param val The value to search for
-     * @return The user, or null if no user was found
-     */
-    @Nullable
-    UserInfo findUserByProperty(String key, String val);
-
-
-    /**
-     * Find the datum associated with the given user
-     *
-     * @param username The user holding this datum
-     * @param key      The key associated with this datum
-     * @return The datum, or null if no datum was found
-     */
-    @Nullable
-    String findUserProperty(String username, String key);
-
-    /**
-     * Add or alter an external user datum
-     *
-     * @param username The name of the user to alter
-     * @param key      The key associated with this datum
-     * @param val      The value to write
-     * @return True if the write succeeded, false otherwise
-     */
-    @Lock
-    boolean addUserProperty(String username, String key, String val);
-
-    /**
-     * Delete an external user datum
-     *
-     * @param username The name of the user to alter
-     * @param key      The key associated with this datum
-     * @return True if the delete succeeded, false otherwise
-     */
-    boolean deleteUserProperty(String username, String key);
-
-    Properties findPropertiesForUser(String username);
-
-    void deletePropertyFromAllUsers(String propertyKey);
-
-    /**
-     * Locks user upon incorrect login attempt
-     *
-     * @param userName
-     */
-    @Lock
-    void lockUser(String userName);
-
-    /**
-     * Unlocks locked out user
-     *
-     * @param userName
-     */
-    @Lock
-    void unlockUser(String userName);
-
-    /**
-     * Unlocks all locked out users
-     */
-    @Lock
-    void unlockAllUsers();
-
-    /**
-     * Unlocks all locked out admin users
-     */
-    void unlockAdminUsers();
-
-    /**
-     * Registers incorrect login attempt
-     *
-     * @param userName
-     */
-    void registerIncorrectLoginAttempt(String userName);
-
-    /**
-     * Resets logon failures
-     *
-     * @param userName
-     */
-    void resetIncorrectLoginAttempts(String userName);
-
-    /**
-     * @param userName
-     * @return incorrect login attempts for user
-     */
-    int getIncorrectLoginAttempts(String userName);
-
-    /**
-     * @return List of locked in users
-     */
-    Set<String> getLockedUsers();
-
-    /**
-     * Checks whether given user is locked
-     * <p>
-     * note: this method using caching in sake
-     * of DB load preventing
-     *
-     * @param userName
-     * @return boolean
-     */
-    boolean isUserLocked(String userName);
-
-    /**
-     * Calculates next login if user previously
-     * failed to login due to incorrect credentials
-     * and now have to wait before trying to login again
-     *
-     * @param userName
-     * @return login delay or -1 if user login should
-     * not be delayed (e.g last login was successful)
-     */
-    long getNextLogin(String userName);
-
-    /**
-     * Calculates next login if user previously
-     * failed to login due to incorrect credentials
-     * and now have to wait before trying to login again
-     *
-     * @param incorrectLoginAttempts
-     * @param lastAccessTimeMillis
-     * @return login delay or -1 if user login should
-     * not be delayed (e.g last login was successful)
-     */
-    long getNextLogin(int incorrectLoginAttempts, long lastAccessTimeMillis);
-
-    /**
-     * Changes user password
-     *
-     * @param user
-     * @param saltedPassword
-     *
-     * @return sucess/failure
-     */
-    @Lock
-    void changePassword(@Nonnull UserInfo user, SaltedPassword saltedPassword);
-
-    /**
-     * Makes user password expired
-     *
-     * @param userName
-     */
-    @Lock
-    void expireUserPassword(String userName);
-
-    /**
-     * Makes user password not expired
-     *
-     * @param userName
-     */
-    @Lock
-    void revalidatePassword(String userName);
-
-    /**
-     * Makes all users passwords expired
-     *
-     */
-    @Lock
-    void expirePasswordForAllUsers();
-
-    /**
-     * Makes all users passwords not expired
-     *
-     */
-    @Lock
-    void revalidatePasswordForAllUsers();
-
-    /**
-     * Fetches users which password is about to expire
-     *
-     * @param daysToNotifyBefore           days before password expiry to notify users
-     * @param daysToKeepPassword           after what period password should be changed
-     * @return list of users
-     */
-    Set<PasswordExpiryUser> getUsersWhichPasswordIsAboutToExpire(int daysToNotifyBefore, int daysToKeepPassword);
-
-    /**
-     * Checks whether user password is expired
-     *
-     * @param userName a user name
-     * @param expireIn days for password to stay valid after creation
-     *
-     * @return boolean
-     */
-    boolean isUserPasswordExpired(String userName, int expireIn);
-
-
-    /**
-     * Marks user.credentialsExpired=True where password has expired
-     *
-     * @param daysToKeepPassword after what period password should be changed
-     * @return List of users that were expired
-     */
-    List<String> markUsersCredentialsExpired(int daysToKeepPassword);
-
-    /**
-     * Expires a batch of user ids <b>in a single transaction</b>
-     * @param userIds       user ids to expire password for
-     * @throws SQLException
-     */
-    @Lock
-    void expirePasswordForUserIds(Set<Long> userIds) throws SQLException;
-
-    /**
-     * @param userName
-     * @return the date when last password was created
-     */
-    Long getUserPasswordCreationTime(String userName);
-}
\ No newline at end of file
diff --git a/storage/common/src/main/java/org/artifactory/storage/spring/ArtifactoryStorageContext.java b/storage/common/src/main/java/org/artifactory/storage/spring/ArtifactoryStorageContext.java
deleted file mode 100644
index aabbcc4..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/spring/ArtifactoryStorageContext.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.artifactory.storage.spring;
-
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.schedule.TaskService;
-import org.artifactory.storage.binstore.service.BinaryService;
-
-/**
- * Date: 8/4/11 Time: 6:01 PM
- *
- * @author Fred Simon
- */
-public interface ArtifactoryStorageContext extends ArtifactoryContext {
-    BinaryService getBinaryStore();
-
-    boolean isReady();
-
-    TaskService getTaskService();
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/spring/StorageContextHelper.java b/storage/common/src/main/java/org/artifactory/storage/spring/StorageContextHelper.java
deleted file mode 100644
index 9e4e5eb..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/spring/StorageContextHelper.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.artifactory.storage.spring;
-
-import org.artifactory.api.context.ContextHelper;
-
-/**
- * Date: 8/4/11
- * Time: 6:05 PM
- *
- * @author Fred Simon
- */
-public abstract class StorageContextHelper {
-    private StorageContextHelper() {
-    }
-
-    public static ArtifactoryStorageContext get() {
-        return (ArtifactoryStorageContext) ContextHelper.get();
-    }
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/tx/SessionResource.java b/storage/common/src/main/java/org/artifactory/storage/tx/SessionResource.java
deleted file mode 100644
index 8ef5eed..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/tx/SessionResource.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.tx;
-
-/**
- * @author freds
- * @date Sep 22, 2008
- */
-public interface SessionResource {
-
-    void onSessionSave();
-
-    void afterCompletion(boolean commit);
-
-    /**
-     * @return True if this session resource has job pending
-     */
-    boolean hasPendingResources();
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/tx/SessionResourceManager.java b/storage/common/src/main/java/org/artifactory/storage/tx/SessionResourceManager.java
deleted file mode 100644
index ab05175..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/tx/SessionResourceManager.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.tx;
-
-import java.util.List;
-
-/**
- * @author freds
- * @date Sep 22, 2008
- */
-public interface SessionResourceManager extends SessionResource {
-
-    /**
-     * Gets or creates by reflection a new session attached managed resource.
-     *
-     * @param resourceClass The class of the resource to create
-     */
-    <T extends SessionResource> T getOrCreateResource(Class<T> resourceClass);
-
-    /**
-     * @return A list of {@link SessionResource} with pending job. Useful for debugging.
-     */
-    List<SessionResource> pendingResources();
-}
diff --git a/storage/common/src/main/java/org/artifactory/storage/tx/SessionResourceManagerImpl.java b/storage/common/src/main/java/org/artifactory/storage/tx/SessionResourceManagerImpl.java
deleted file mode 100644
index 876ede5..0000000
--- a/storage/common/src/main/java/org/artifactory/storage/tx/SessionResourceManagerImpl.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.tx;
-
-import com.google.common.collect.Lists;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Per-session single threaded session resources (listeners) manager
- *
- * @author freds
- * @date Sep 22, 2008
- */
-public class SessionResourceManagerImpl implements SessionResourceManager {
-    private static final Logger log = LoggerFactory.getLogger(SessionResourceManagerImpl.class);
-
-    private final Map<Class, SessionResource> resources = new HashMap<>();
-
-    @Override
-    @SuppressWarnings({"unchecked"})
-    public <T extends SessionResource> T getOrCreateResource(Class<T> resourceClass) {
-        T result = (T) resources.get(resourceClass);
-        if (result == null) {
-            try {
-                result = resourceClass.newInstance();
-                resources.put(resourceClass, result);
-            } catch (InstantiationException e) {
-                throw new RuntimeException(e);
-            } catch (IllegalAccessException e) {
-                throw new RuntimeException(e);
-            }
-        }
-        return result;
-    }
-
-    @Override
-    public void onSessionSave() {
-        for (SessionResource resource : resources.values()) {
-            resource.onSessionSave();
-        }
-    }
-
-    @Override
-    public void afterCompletion(boolean commit) {
-        RuntimeException ex = null;
-        for (SessionResource resource : resources.values()) {
-            try {
-                //Always call after completion on resources
-                resource.afterCompletion(commit);
-            } catch (RuntimeException e) {
-                if (log.isDebugEnabled()) {
-                    log.debug("Error while releasing resources " + resource + " : " + e.getMessage(), e);
-                }
-                ex = e;
-            }
-        }
-        if (ex != null) {
-            throw ex;
-        }
-    }
-
-    @Override
-    public boolean hasPendingResources() {
-        for (SessionResource resource : resources.values()) {
-            if (resource.hasPendingResources()) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public List<SessionResource> pendingResources() {
-        List<SessionResource> pending = Lists.newArrayList();
-        for (SessionResource resource : resources.values()) {
-            if (resource.hasPendingResources()) {
-                pending.add(resource);
-            }
-        }
-        return pending;
-    }
-}
diff --git a/storage/common/src/test/java/org/artifactory/api/fs/FileAdditionalInfoTest.java b/storage/common/src/test/java/org/artifactory/api/fs/FileAdditionalInfoTest.java
deleted file mode 100644
index e2396f4..0000000
--- a/storage/common/src/test/java/org/artifactory/api/fs/FileAdditionalInfoTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.fs;
-
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.model.xstream.fs.FileAdditionalInfo;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-import java.util.HashSet;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests FileAdditionalInfo class.
- *
- * @author Yossi Shaul
- */
- at Test
-public class FileAdditionalInfoTest {
-    public static final String DUMMY_SHA1 = "1234567890123456789012345678901234567890";
-    public static final String DUMMY2_SHA1 = "3234567890123456789012345678901234567890";
-
-    public static final String DUMMY_MD5 = "12345678901234567890123456789012";
-    public static final String DUMMY2_MD5 = "32345678901234567890123456789012";
-
-    private FileAdditionalInfo info;
-    private ChecksumInfo sha1;
-    private ChecksumInfo md5;
-
-    @BeforeMethod
-    public void setup() {
-        info = new FileAdditionalInfo();
-        sha1 = new ChecksumInfo(ChecksumType.sha1, DUMMY_SHA1, DUMMY2_SHA1);
-        md5 = new ChecksumInfo(ChecksumType.md5, DUMMY_MD5, DUMMY_MD5);
-        HashSet<org.artifactory.checksum.ChecksumInfo> checksums = new HashSet<ChecksumInfo>(Arrays.asList(sha1, md5));
-        info.setChecksums(checksums);
-    }
-
-    public void defaultConstructor() {
-        FileAdditionalInfo info = new FileAdditionalInfo();
-        assertNotNull(info.getChecksums(), "Checksums should not be null by default");
-        assertNull(info.getSha1(), "Sha1 should be null by default");
-        assertNull(info.getMd5(), "md5 should be null by default");
-    }
-
-    public void settingChecksums() {
-        //Assert.assertEquals(info.getChecksums(), new HashSet<ChecksumInfo>(Arrays.asList(md5, sha1)));
-        assertEquals(info.getSha1(), sha1.getActual());
-        assertEquals(info.getMd5(), md5.getActual());
-    }
-
-    public void testIsIdentical() {
-        FileAdditionalInfo copy = new FileAdditionalInfo(info);
-        assertTrue(EqualsBuilder.reflectionEquals(info, copy), "Orig and copy differ");
-        assertTrue(info.isIdentical(copy), "Orig and copy differ");
-    }
-
-    public void testNotIdentical() {
-        FileAdditionalInfo copy = new FileAdditionalInfo(info);
-        copy.getChecksumsInfo().addChecksumInfo(
-                new ChecksumInfo(ChecksumType.md5, md5.getOriginal(), DUMMY_MD5.replace('3', 'a')));
-        assertFalse(info.isIdentical(copy), "Orig and copy should differ");
-    }
-
-    public void copyConstructor() {
-        ChecksumInfo checksum = new ChecksumInfo(ChecksumType.sha1, DUMMY2_SHA1, DUMMY_SHA1);
-        FileAdditionalInfo orig = new FileAdditionalInfo();
-        orig.addChecksumInfo(checksum);
-        FileAdditionalInfo copy = new FileAdditionalInfo(orig);
-
-        assertTrue(EqualsBuilder.reflectionEquals(orig, copy), "Orig and copy differ");
-        assertTrue(orig.isIdentical(copy), "Orig and copy differ");
-        assertNotSame(orig.getChecksumsInfo(), copy.getChecksumsInfo(),
-                "Should have made a copy, not use the same object");
-    }
-}
diff --git a/storage/common/src/test/java/org/artifactory/api/fs/FileInfoImplTest.java b/storage/common/src/test/java/org/artifactory/api/fs/FileInfoImplTest.java
deleted file mode 100644
index 8eb1652..0000000
--- a/storage/common/src/test/java/org/artifactory/api/fs/FileInfoImplTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.fs;
-
-import com.google.common.collect.Sets;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.model.xstream.fs.FileInfoImpl;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertFalse;
-
-/**
- * Unit tests for the FileInfoImpl.
- *
- * @author Yossi Shaul
- */
- at Test
-public class FileInfoImplTest extends ArtifactoryHomeBoundTest {
-    public static final String DUMMY_SHA1 = "1234567890123456789012345678901234567890";
-    public static final String DUMMY2_SHA1 = "3234567890123456789012345678901234567890";
-
-    public void differentChecksumNotIdentical() {
-        RepoPath path = new RepoPathImpl("repo", "test.jar");
-
-        FileInfoImpl fileInfo1 = new FileInfoImpl(path);
-        fileInfo1.setChecksums(
-                Sets.newHashSet(new org.artifactory.checksum.ChecksumInfo(ChecksumType.sha1, null, DUMMY_SHA1)));
-
-        FileInfoImpl fileInfo2 = new FileInfoImpl(path);
-        fileInfo2.setChecksums(Sets.newHashSet(new ChecksumInfo(ChecksumType.sha1, "originalchecksum", DUMMY2_SHA1)));
-
-        assertFalse(fileInfo1.isIdentical(fileInfo2), "Should not be identical - checksum info is not");
-    }
-}
diff --git a/storage/common/src/test/java/org/artifactory/api/fs/ZipEntriesTreeTest.java b/storage/common/src/test/java/org/artifactory/api/fs/ZipEntriesTreeTest.java
deleted file mode 100644
index 7b2bbca..0000000
--- a/storage/common/src/test/java/org/artifactory/api/fs/ZipEntriesTreeTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.fs;
-
-import com.google.common.collect.Lists;
-import org.artifactory.fs.ZipEntryInfo;
-import org.artifactory.model.xstream.fs.ZipEntriesTree;
-import org.artifactory.model.xstream.fs.ZipEntryImpl;
-import org.artifactory.model.xstream.fs.ZipTreeNode;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.List;
-import java.util.zip.ZipEntry;
-
-import static org.testng.Assert.assertNotNull;
-
-/**
- * Tests the {@link ZipEntriesTree}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class ZipEntriesTreeTest {
-
-    public void buildTree() {
-        ZipEntriesTree tree = new ZipEntriesTree();
-
-        String[] paths = {
-                "a/", "b/", "a/b/", "a/b/c", "b/c"
-        };
-
-        List<ZipEntryInfo> entries = Lists.newArrayList();
-        for (String path : paths) {
-            entries.add(new ZipEntryImpl(new ZipEntry(path)));
-        }
-
-        for (ZipEntryInfo entry : entries) {
-            tree.insert(entry);
-        }
-
-
-        ZipTreeNode root = tree.getRoot();
-        Assert.assertEquals(root.getChildren().size(), 2);
-        assertNotNull(root.getChild(entries.get(2)));   // a/b
-        Assert.assertEquals(root.getChild(entries.get(2)).getChildren().size(), 1);
-    }
-
-}
diff --git a/storage/common/src/test/java/org/artifactory/api/security/AceInfoTest.java b/storage/common/src/test/java/org/artifactory/api/security/AceInfoTest.java
deleted file mode 100644
index 4ec26de..0000000
--- a/storage/common/src/test/java/org/artifactory/api/security/AceInfoTest.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.security;
-
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.artifactory.model.xstream.security.AceImpl;
-import org.artifactory.security.AceInfo;
-import org.artifactory.security.ArtifactoryPermission;
-import org.artifactory.security.MutableAceInfo;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * AceInfo unit tests.
- *
- * @author Yossi Shaul
- */
- at Test
-public class AceInfoTest {
-
-    public void adminMaskOnly() {
-        MutableAceInfo aceInfo = new AceImpl();
-        aceInfo.setManage(true);
-        assertOnlyManage(aceInfo);
-
-        aceInfo = new AceImpl();
-        aceInfo.setPermissionsFromString(Sets.<String>newHashSet("m"));
-        assertOnlyManage(aceInfo);
-    }
-
-    public void readerMaskOnly() {
-        MutableAceInfo aceInfo = new AceImpl();
-        aceInfo.setRead(true);
-
-        assertOnlyRead(aceInfo);
-
-        aceInfo = new AceImpl();
-        aceInfo.setPermissionsFromString(Sets.<String>newHashSet("r"));
-        assertOnlyRead(aceInfo);
-    }
-
-    public void deployerMaskOnly() {
-        MutableAceInfo aceInfo = new AceImpl();
-        aceInfo.setDeploy(true);
-        assertOnlyDeploy(aceInfo);
-
-        aceInfo = new AceImpl();
-        aceInfo.setPermissionsFromString(Sets.<String>newHashSet("w"));
-        assertOnlyDeploy(aceInfo);
-    }
-
-    public void deleterMaskOnly() {
-        MutableAceInfo aceInfo = new AceImpl();
-        aceInfo.setDelete(true);
-        assertOnlyDelete(aceInfo);
-
-        aceInfo = new AceImpl();
-        aceInfo.setPermissionsFromString(Sets.<String>newHashSet("d"));
-        assertOnlyDelete(aceInfo);
-    }
-
-    public void annotatorMaskOnly() {
-        MutableAceInfo aceInfo = new AceImpl();
-        aceInfo.setAnnotate(true);
-        assertOnlyAnnotate(aceInfo);
-
-        aceInfo = new AceImpl();
-        aceInfo.setPermissionsFromString(Sets.<String>newHashSet("n"));
-        assertOnlyAnnotate(aceInfo);
-    }
-
-    public void allMasks() {
-        MutableAceInfo aceInfo = new AceImpl();
-        aceInfo.setManage(true);
-        aceInfo.setDeploy(true);
-        aceInfo.setRead(true);
-        aceInfo.setDelete(true);
-        aceInfo.setAnnotate(true);
-
-        assertTrue(aceInfo.canManage(), "Should have all roles");
-        assertTrue(aceInfo.canRead(), "Should have all roles");
-        assertTrue(aceInfo.canDeploy(), "Should have all roles");
-        assertTrue(aceInfo.canDelete(), "Should have all roles");
-        assertTrue(aceInfo.canAnnotate(), "Should have all roles");
-        assertEquals(aceInfo.getPermissionsAsString(), Sets.newHashSet("m", "n", "d", "w", "r"));
-    }
-
-    public void copyConstructor() {
-        MutableAceInfo orig = new AceImpl("koko", true, ArtifactoryPermission.MANAGE.getMask());
-        AceInfo copy = new AceImpl(orig);
-
-        assertEquals(orig.getPrincipal(), copy.getPrincipal());
-        assertEquals(orig.getMask(), copy.getMask());
-        assertEquals(orig.isGroup(), copy.isGroup());
-        assertEquals(orig.getPermissionsAsString(), copy.getPermissionsAsString());
-    }
-
-    public void copyConstructorReflectionEquality() {
-        MutableAceInfo orig = new AceImpl("koko", true, ArtifactoryPermission.MANAGE.getMask());
-        AceInfo copy = new AceImpl(orig);
-
-        assertTrue(EqualsBuilder.reflectionEquals(orig, copy), "Orig and copy differ");
-    }
-
-    private void assertOnlyManage(MutableAceInfo aceInfo) {
-        assertTrue(aceInfo.canManage(), "Should be a manager");
-        assertFalse(aceInfo.canRead(), "Shouldn't be a reader");
-        assertFalse(aceInfo.canDeploy(), "Shouldn't be a deployer");
-        assertFalse(aceInfo.canDelete(), "Shouldn't be a deleter");
-        assertFalse(aceInfo.canAnnotate(), "Shouldn't be an annotator");
-
-        assertEquals(aceInfo.getPermissionsAsString(), Sets.newHashSet("m"), "Should be admin permission string");
-    }
-
-    private void assertOnlyRead(MutableAceInfo aceInfo) {
-        assertFalse(aceInfo.canManage(), "Shouldn't be a manager");
-        assertTrue(aceInfo.canRead(), "Should be a reader");
-        assertFalse(aceInfo.canDeploy(), "Shouldn't be a deployer");
-        assertFalse(aceInfo.canDelete(), "Shouldn't be a deleter");
-        assertFalse(aceInfo.canAnnotate(), "Shouldn't be an annotator");
-
-        assertEquals(aceInfo.getPermissionsAsString(), Sets.newHashSet("r"), "Should be a reader permission string");
-    }
-
-    private void assertOnlyDeploy(MutableAceInfo aceInfo) {
-        assertFalse(aceInfo.canManage(), "Shouldn't be a manager");
-        assertFalse(aceInfo.canRead(), "Shouldn't be a reader");
-        assertTrue(aceInfo.canDeploy(), "Should be a deployer");
-        assertFalse(aceInfo.canDelete(), "Shouldn't be a deleter");
-        assertFalse(aceInfo.canAnnotate(), "Shouldn't be an annotator");
-
-        assertEquals(aceInfo.getPermissionsAsString(), Sets.newHashSet("w"), "Should be a deploy permission string");
-    }
-
-    private void assertOnlyDelete(MutableAceInfo aceInfo) {
-        assertFalse(aceInfo.canManage(), "Shouldn't be a manager");
-        assertFalse(aceInfo.canRead(), "Shouldn't be a reader");
-        assertFalse(aceInfo.canDeploy(), "Shouldn't be a deployer");
-        assertTrue(aceInfo.canDelete(), "Should be a deleter");
-        assertFalse(aceInfo.canAnnotate(), "Shouldn't be an annotator");
-
-        assertEquals(aceInfo.getPermissionsAsString(), Sets.newHashSet("d"), "Should be a delete permission string");
-    }
-
-    private void assertOnlyAnnotate(MutableAceInfo aceInfo) {
-        assertFalse(aceInfo.canManage(), "Shouldn't be a manager");
-        assertFalse(aceInfo.canRead(), "Shouldn't be a reader");
-        assertFalse(aceInfo.canDeploy(), "Shouldn't be a deployer");
-        assertFalse(aceInfo.canDelete(), "Shouldn't be a deleter");
-        assertTrue(aceInfo.canAnnotate(), "Should be an annotator");
-
-        assertEquals(aceInfo.getPermissionsAsString(), Sets.newHashSet("n"), "Should be a annotate permission string");
-    }
-}
diff --git a/storage/common/src/test/java/org/artifactory/api/security/GroupInfoTest.java b/storage/common/src/test/java/org/artifactory/api/security/GroupInfoTest.java
deleted file mode 100644
index 9a4de58..0000000
--- a/storage/common/src/test/java/org/artifactory/api/security/GroupInfoTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.security;
-
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.artifactory.model.xstream.security.GroupImpl;
-import org.artifactory.security.GroupInfo;
-import org.artifactory.security.MutableGroupInfo;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * Tests the GroupInfo class.
- *
- * @author Yossi Shaul
- */
- at Test
-public class GroupInfoTest {
-
-    public void defaultConstructor() {
-        GroupInfo info = new GroupImpl();
-        Assert.assertNull(info.getGroupName(), "Group name should be null by default");
-        Assert.assertNull(info.getDescription(), "Group description should be null by default");
-        Assert.assertFalse(info.isNewUserDefault(), "Group should not be added by default");
-    }
-
-    public void copyConstructor() {
-        MutableGroupInfo orig = new GroupImpl("name", "bla bla", false);
-        GroupInfo copy = new GroupImpl(orig);
-        Assert.assertTrue(EqualsBuilder.reflectionEquals(orig, copy), "Orig and copy differ");
-
-        orig.setNewUserDefault(true);
-        copy = new GroupImpl(orig);
-        Assert.assertTrue(EqualsBuilder.reflectionEquals(orig, copy), "Orig and copy differ");
-    }
-
-}
diff --git a/storage/common/src/test/java/org/artifactory/api/security/PermissionTargetInfoTest.java b/storage/common/src/test/java/org/artifactory/api/security/PermissionTargetInfoTest.java
deleted file mode 100644
index 38f0aea..0000000
--- a/storage/common/src/test/java/org/artifactory/api/security/PermissionTargetInfoTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.security;
-
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.artifactory.model.xstream.security.PermissionTargetImpl;
-import org.artifactory.security.PermissionTargetInfo;
-import org.testng.annotations.Test;
-
-import java.util.Arrays;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
-
-/**
- * PermissionTargetInfo unit tests.
- *
- * @author Yossi Shaul
- */
- at Test
-public class PermissionTargetInfoTest {
-
-    public void testDefaultConstructor() {
-        PermissionTargetInfo pmi = new PermissionTargetImpl();
-
-        assertEquals(pmi.getName(), "");
-        assertEquals(pmi.getRepoKeys(), Arrays.asList(PermissionTargetInfo.ANY_REPO));
-        assertEquals(pmi.getIncludesPattern(), PermissionTargetInfo.ANY_PATH);
-        assertEquals(pmi.getIncludes().size(), 1);
-        assertEquals(pmi.getExcludesPattern(), "");
-        assertEquals(pmi.getExcludes().size(), 0);
-    }
-
-    public void createWithNoIncluesExcludesPatterns() {
-        PermissionTargetInfo pmi = new PermissionTargetImpl("permissionName", Arrays.asList("aRepo"));
-
-        assertEquals(pmi.getName(), "permissionName");
-        assertEquals(pmi.getRepoKeys(), Arrays.asList("aRepo"));
-        assertEquals(pmi.getIncludesPattern(), PermissionTargetInfo.ANY_PATH);
-        assertEquals(pmi.getIncludes().size(), 1);
-        assertEquals(pmi.getExcludesPattern(), "");
-        assertEquals(pmi.getExcludes().size(), 0);
-    }
-
-    public void createWithIncluesAndExcludesPatterns() {
-        String includes = "**/*-sources.*,**/*-SNAPSHOT/**";
-        String excludes = "**/secretjars/**";
-        PermissionTargetInfo pmi = new PermissionTargetImpl(
-                "permissionName", Arrays.asList("repoKey1", "repoKey2"), includes, excludes);
-
-        assertEquals(pmi.getName(), "permissionName");
-        assertEquals(pmi.getRepoKeys(), Arrays.asList("repoKey1", "repoKey2"));
-        assertEquals(pmi.getIncludesPattern(), includes);
-        assertEquals(pmi.getIncludes().size(), 2);
-        assertEquals(pmi.getExcludesPattern(), excludes);
-        assertEquals(pmi.getExcludes().size(), 1);
-    }
-
-    public void copyConstructor() {
-        PermissionTargetInfo orig = new PermissionTargetImpl(
-                "permissionName", Arrays.asList("repoKey1", "repoKey2"), "**/*-sources.*,**/*-SNAPSHOT/**",
-                "**/secretjars/**");
-
-        PermissionTargetInfo copy = new PermissionTargetImpl(orig);
-        assertEquals(copy.getName(), orig.getName());
-        assertEquals(copy.getRepoKeys(), orig.getRepoKeys());
-        assertEquals(copy.getExcludes(), orig.getExcludes());
-        assertEquals(copy.getExcludesPattern(), orig.getExcludesPattern());
-        assertEquals(copy.getIncludes(), orig.getIncludes());
-        assertEquals(copy.getIncludesPattern(), orig.getIncludesPattern());
-    }
-
-    public void copyConstructorReflectionEquality() {
-        PermissionTargetInfo orig = new PermissionTargetImpl(
-                "permissionName", Arrays.asList("repoKey1", "repoKey2"), "**/*-sources.*,**/*-SNAPSHOT/**",
-                "**/secretjars/**");
-        PermissionTargetInfo copy = new PermissionTargetImpl(orig);
-
-        assertTrue(EqualsBuilder.reflectionEquals(orig, copy), "Orig and copy differ");
-    }
-}
diff --git a/storage/common/src/test/java/org/artifactory/api/security/UserInfoTest.java b/storage/common/src/test/java/org/artifactory/api/security/UserInfoTest.java
deleted file mode 100644
index 3dfb06b..0000000
--- a/storage/common/src/test/java/org/artifactory/api/security/UserInfoTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.api.security;
-
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.artifactory.model.xstream.security.UserGroupImpl;
-import org.artifactory.model.xstream.security.UserImpl;
-import org.artifactory.security.MutableUserInfo;
-import org.artifactory.security.UserInfo;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Tests the UserInfo.
- *
- * @author Yossi Shaul
- */
- at Test
-public class UserInfoTest {
-
-    public void copyConstructor() {
-        MutableUserInfo orig = new UserImpl("momo");
-        orig.setGenPasswordKey("blablablablabla");
-        UserInfo copy = new UserImpl(orig);
-        Assert.assertTrue(EqualsBuilder.reflectionEquals(orig, copy), "Orig and copy differ");
-
-        orig.setPrivateKey("myprivatekey");
-        orig.setPublicKey("mypublickey");
-        copy = new UserImpl(orig);
-        Assert.assertTrue(EqualsBuilder.reflectionEquals(orig, copy),
-                "Orig and copy differ after setting public/private keys");
-    }
-
-    public void addRemoveGroup() {
-        MutableUserInfo userInfo = new UserImpl("momo");
-        userInfo.addGroup("mygroup");
-        Assert.assertTrue(userInfo.getGroups().contains(new UserGroupImpl("mygroup")));
-        userInfo.removeGroup("mygroup");
-        Assert.assertTrue(userInfo.getGroups().isEmpty(), "groups should now be empty");
-
-        Set<String> strings = new HashSet<String>();
-        strings.add("mygroup2");
-        userInfo.setInternalGroups(strings);
-        Assert.assertTrue(userInfo.getGroups().contains(new UserGroupImpl("mygroup2")));
-    }
-}
diff --git a/storage/common/src/test/java/org/artifactory/factory/xstream/ChecksumsInfoConverterTest.java b/storage/common/src/test/java/org/artifactory/factory/xstream/ChecksumsInfoConverterTest.java
deleted file mode 100644
index b955401..0000000
--- a/storage/common/src/test/java/org/artifactory/factory/xstream/ChecksumsInfoConverterTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.factory.xstream;
-
-import com.thoughtworks.xstream.XStream;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.checksum.ChecksumsInfo;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * @author Yoav Landman
- */
-public class ChecksumsInfoConverterTest {
-    public static final String DUMMY_SHA1 = "1234567890123456789012345678901234567890";
-    public static final String DUMMY_MD5 = "12345678901234567890123456789012";
-
-    @Test
-    public void testConversion() {
-        ChecksumsInfo checksumsInfo = new ChecksumsInfo();
-        checksumsInfo.addChecksumInfo(new ChecksumInfo(ChecksumType.sha1, null, DUMMY_SHA1));
-        checksumsInfo.addChecksumInfo(new ChecksumInfo(ChecksumType.md5, "md5Orig", DUMMY_MD5));
-        XStream xstream = XStreamFactory.create();
-        xstream.processAnnotations(ChecksumsInfo.class);
-        xstream.processAnnotations(ChecksumInfo.class);
-        String xml = xstream.toXML(checksumsInfo);
-        Object deserializedMap = xstream.fromXML(xml);
-        Assert.assertEquals(deserializedMap, checksumsInfo);
-    }
-}
diff --git a/storage/common/src/test/java/org/artifactory/factory/xstream/PropertiesConverterTest.java b/storage/common/src/test/java/org/artifactory/factory/xstream/PropertiesConverterTest.java
deleted file mode 100644
index 9fae96c..0000000
--- a/storage/common/src/test/java/org/artifactory/factory/xstream/PropertiesConverterTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.factory.xstream;
-
-import com.thoughtworks.xstream.XStream;
-import org.artifactory.md.Properties;
-import org.artifactory.model.xstream.fs.PropertiesImpl;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * @author Yoav Landman
- */
-public class PropertiesConverterTest {
-    @Test
-    public void testConversion() {
-        Properties properties = new PropertiesImpl();
-        properties.put("a", "aye");
-        properties.put("a", "aye2");
-        properties.put("b", "bee");
-        properties.put("c", "cee");
-        properties.put("empty", "");
-        properties.put("null", null);
-        properties.put("xml", "<xml></xml>");
-        XStream xstream = XStreamFactory.create();
-        String xml = xstream.toXML(properties);
-        Object deserializedMap = xstream.fromXML(xml);
-        Assert.assertEquals(deserializedMap, properties);
-    }
-}
diff --git a/storage/common/src/test/java/org/artifactory/model/common/RepoPathTest.java b/storage/common/src/test/java/org/artifactory/model/common/RepoPathTest.java
deleted file mode 100644
index b4ffa4b..0000000
--- a/storage/common/src/test/java/org/artifactory/model/common/RepoPathTest.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.common;
-
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the RepoPath class.
- *
- * @author Yossi Shaul
- */
- at Test
-public class RepoPathTest {
-
-    public void getParentRepoPathWithParent() {
-        RepoPath child = new RepoPathImpl("repo", "a/b/c");
-        RepoPath parent = child.getParent();
-        Assert.assertEquals(parent, new RepoPathImpl("repo", "/a/b"));
-    }
-
-    public void getParentRepoPathLastParent() {
-        RepoPath child = new RepoPathImpl("repo", "a/");
-        RepoPath parent = child.getParent();
-        Assert.assertEquals(parent, new RepoPathImpl("repo", ""));
-    }
-
-    public void getParentRepoPathForRoot() {
-        RepoPath child = new RepoPathImpl("repo", "/");
-        RepoPath parent = child.getParent();
-        assertNull(parent);
-    }
-
-    public void getParentRepoPathWithNoParent() {
-        RepoPath child = new RepoPathImpl("repo", "");
-        RepoPath parent = child.getParent();
-        assertNull(parent);
-    }
-
-    public void repoRootPath() {
-        RepoPath repoPath = InternalRepoPathFactory.repoRootPath("repokey");
-        assertEquals(repoPath.getRepoKey(), "repokey");
-        assertEquals("", repoPath.getPath(), "Repository root path should be an empty string");
-        assertTrue(repoPath.isRoot());
-    }
-
-    public void rootPath() {
-        assertFalse(new RepoPathImpl("1", "2").isRoot());
-        assertTrue(new RepoPathImpl("1", "").isRoot());
-        assertTrue(new RepoPathImpl("1", "     ").isRoot());
-        assertTrue(new RepoPathImpl("1", "     ").isRoot());
-        assertTrue(new RepoPathImpl("1", null).isRoot());
-        nullRepoKey();
-    }
-
-    private void nullRepoKey() {
-        try {
-            // Should throw exception repoKey can't be null
-            new RepoPathImpl((String) null, "");
-            fail();
-        } catch (IllegalArgumentException e) {
-            //We expected failure during RepoPath creation  (repo key can't be null);
-        }
-    }
-
-    public void archiveResourcePath() {
-        RepoPathImpl archivePath = new RepoPathImpl("key", "file.jar");
-        RepoPath resourcePath = InternalRepoPathFactory.archiveResourceRepoPath(archivePath, "path/to/resource");
-        Assert.assertEquals(resourcePath.getRepoKey(), archivePath.getRepoKey());
-        assertEquals(resourcePath.getPath(), "file.jar!/path/to/resource");
-    }
-
-    public void archiveResourcePathLeadingSlash() {
-        RepoPathImpl archivePath = new RepoPathImpl("key", "folder");
-        RepoPath resourcePath = InternalRepoPathFactory.archiveResourceRepoPath(archivePath, "/path/to/resource");
-        Assert.assertEquals(resourcePath.getRepoKey(), archivePath.getRepoKey());
-        assertEquals(resourcePath.getPath(), "folder!/path/to/resource");
-    }
-
-    public void toPathWithRelativePath() {
-        RepoPathImpl repoPath = new RepoPathImpl("key", "path/to/");
-        assertEquals(repoPath.toPath(), "key/path/to/");
-    }
-
-    public void toPathRootRepoPath() {
-        RepoPathImpl repoPath = new RepoPathImpl("key", "");
-        assertEquals(repoPath.toPath(), "key/");
-    }
-}
diff --git a/storage/common/src/test/java/org/artifactory/model/xstream/fs/PropertiesImplTest.java b/storage/common/src/test/java/org/artifactory/model/xstream/fs/PropertiesImplTest.java
deleted file mode 100644
index 549f00a..0000000
--- a/storage/common/src/test/java/org/artifactory/model/xstream/fs/PropertiesImplTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.fs;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-/**
- * Tests the {@link org.artifactory.model.xstream.fs.PropertiesImpl}.
- * Note: The tested class requires changes which are undefined yet and had no tests. Here will just test few important
- * parts until the content is defined.
- *
- * @author Yossi Shaul
- */
- at Test
-public class PropertiesImplTest {
-
-    public void isEmpty() {
-        assertTrue(new PropertiesImpl().isEmpty());
-    }
-
-    public void isEmptyAndNormalProperty() {
-        PropertiesImpl props = new PropertiesImpl();
-        props.put("test", "name");
-        assertFalse(props.isEmpty());
-    }
-
-}
diff --git a/storage/common/src/test/java/org/artifactory/model/xstream/security/UserImplTest.java b/storage/common/src/test/java/org/artifactory/model/xstream/security/UserImplTest.java
deleted file mode 100644
index 245bdfc..0000000
--- a/storage/common/src/test/java/org/artifactory/model/xstream/security/UserImplTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.model.xstream.security;
-
-import org.artifactory.security.SaltedPassword;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-/**
- * Tests the {@link UserImpl}
- *
- * @author Yossi Shaul
- */
- at Test
-public class UserImplTest {
-
-    public void sameAuthContextForSameInstance() {
-        UserImpl paul = new UserImpl("paul");
-        paul.setPassword(new SaltedPassword("atreides", "000"));
-        assertTrue(paul.hasSameAuthorizationContext(paul));
-    }
-
-    public void authContextDifferentIfPasswordIfDifferent() {
-        UserImpl leto = new UserImpl("leto");
-        leto.setPassword(new SaltedPassword("atreides", "000"));
-
-        UserImpl letoWithNewPass = new UserImpl("leto");
-        leto.setPassword(new SaltedPassword("tyrant", "000"));
-
-        assertFalse(leto.hasSameAuthorizationContext(letoWithNewPass));
-    }
-
-    public void sameAuthContextUserWithNoPassword() {
-        UserImpl paul = new UserImpl("paul");
-        assertTrue(paul.hasSameAuthorizationContext(paul));
-    }
-
-}
\ No newline at end of file
diff --git a/storage/common/src/test/java/org/artifactory/repo/InternalRepoPathFactoryTest.java b/storage/common/src/test/java/org/artifactory/repo/InternalRepoPathFactoryTest.java
deleted file mode 100644
index 292bfd5..0000000
--- a/storage/common/src/test/java/org/artifactory/repo/InternalRepoPathFactoryTest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.repo;
-
-import org.testng.annotations.Test;
-
-import static org.artifactory.repo.InternalRepoPathFactory.*;
-import static org.testng.Assert.assertEquals;
-
-/**
- * Tests {@link InternalRepoPathFactory}.
- * This test cannot be in the capi module because it has runtime dependencies on the storage-common.
- *
- * @author Shay Yaakov
- */
- at Test
-public class InternalRepoPathFactoryTest {
-
-    public void cacheRepoPathFromRemote() throws Exception {
-        RepoPath cacheRepoPath = cacheRepoPath(create("repo", "boo"));
-        assertEquals(cacheRepoPath, create("repo-cache", "boo"));
-    }
-
-    public void cacheRepoPathFromCache() throws Exception {
-        RepoPath cacheRepoPath = cacheRepoPath(create("test-cache", "la/la/la"));
-        assertEquals(cacheRepoPath, create("test-cache-cache", "la/la/la"));
-    }
-
-    public void cacheRepoPathFromRootRepoPath() throws Exception {
-        RepoPath cacheRepoPath = cacheRepoPath(repoRootPath("rootrepo"));
-        assertEquals(cacheRepoPath, create("rootrepo-cache"));
-    }
-}
diff --git a/storage/common/src/test/java/org/artifactory/storage/StoragePropertiesEncryptDecryptTest.java b/storage/common/src/test/java/org/artifactory/storage/StoragePropertiesEncryptDecryptTest.java
deleted file mode 100644
index 3c50923..0000000
--- a/storage/common/src/test/java/org/artifactory/storage/StoragePropertiesEncryptDecryptTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-package org.artifactory.storage;
-
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.artifactory.util.ResourceUtils;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
-
-/**
- * Unit tests for the storage properties encrypt decrypt
- *
- * @author Chen Keinan
- */
-
-public class StoragePropertiesEncryptDecryptTest extends ArtifactoryHomeBoundTest {
-    StorageProperties sp;
-
-    @BeforeMethod
-    public void loadProperties() throws IOException {
-        String filePath = "/storage/storagepostgres.properties";
-        sp = new StorageProperties(ResourceUtils.getResourceAsFile(filePath));
-    }
-
-    @Test
-    public void propertiesPasswordEncryptionTest() throws IOException {
-        String filePath = "/storage/storagepostgres.properties";
-        if (!CryptoHelper.hasMasterKey()) {
-            CryptoHelper.createMasterKeyFile();
-        }
-        String pass = sp.getProperty(StorageProperties.Key.password);
-        assertTrue(!CryptoHelper.isPasswordEncrypted(pass));
-        pass = CryptoHelper.encryptIfNeeded(pass);
-        int numOfLineBeforeEncryptAndSaving = getFileNumOfLines(filePath);
-        int passwordLinePositionBeforeEncryptAndSave = getKeyPositionLine(filePath, "password");
-        sp.setPassword(pass);
-        sp.updateStoragePropertiesFile(getPropertiesStorageFile(filePath));
-        int numOfLineAfterEncryptAndSaving = getFileNumOfLines(filePath);
-        int passwordLinePositionAfterEncryptAndSave = getKeyPositionLine(filePath, "password");
-        // check that comments are maintain
-        assertEquals(numOfLineBeforeEncryptAndSaving, numOfLineAfterEncryptAndSaving);
-        // check that order is maintain
-        assertEquals(passwordLinePositionBeforeEncryptAndSave, passwordLinePositionAfterEncryptAndSave);
-    }
-
-    @Test
-    public void propertiesS3CredentialEncryptionTest() throws IOException {
-        String filePath = "/storage/storagepostgres.properties";
-        if (!CryptoHelper.hasMasterKey()) {
-            CryptoHelper.createMasterKeyFile();
-        }
-        String pass = sp.getProperty(StorageProperties.Key.binaryProviderS3Credential);
-        assertTrue(!CryptoHelper.isPasswordEncrypted(pass));
-        pass = CryptoHelper.encryptIfNeeded(pass);
-        int numOfLineBeforeEncryptAndSaving = getFileNumOfLines(filePath);
-        int passwordLinePositionBeforeEncryptAndSave = getKeyPositionLine(filePath, "binary.provider.s3.credential");
-        sp.setS3Credential(pass);
-        sp.updateStoragePropertiesFile(getPropertiesStorageFile(filePath));
-        int numOfLineAfterEncryptAndSaving = getFileNumOfLines(filePath);
-        int passwordLinePositionAfterEncryptAndSave = getKeyPositionLine(filePath,"binary.provider.s3.credential");
-        // check that comments are maintain
-        assertEquals(numOfLineBeforeEncryptAndSaving, numOfLineAfterEncryptAndSaving);
-        // check that order is maintain
-        assertEquals(passwordLinePositionBeforeEncryptAndSave, passwordLinePositionAfterEncryptAndSave);
-    }
-
-    @Test
-    public void propertiesS3ProxyCredentialEncryptionTest() throws IOException {
-        String filePath = "/storage/storagepostgres.properties";
-        if (!CryptoHelper.hasMasterKey()) {
-            CryptoHelper.createMasterKeyFile();
-        }
-        String pass = sp.getProperty(StorageProperties.Key.binaryProviderS3ProxyCredential);
-        assertTrue(!CryptoHelper.isPasswordEncrypted(pass));
-        pass = CryptoHelper.encryptIfNeeded(pass);
-        int numOfLineBeforeEncryptAndSaving = getFileNumOfLines(filePath);
-        int passwordLinePositionBeforeEncryptAndSave = getKeyPositionLine(filePath, "binary.provider.s3.proxy.credential");
-        sp.setS3ProxyCredential(pass);
-        sp.updateStoragePropertiesFile(getPropertiesStorageFile(filePath));
-        int numOfLineAfterEncryptAndSaving = getFileNumOfLines(filePath);
-        int passwordLinePositionAfterEncryptAndSave = getKeyPositionLine(filePath,"binary.provider.s3.proxy.credential");
-        // check that comments are maintain
-        assertEquals(numOfLineBeforeEncryptAndSaving, numOfLineAfterEncryptAndSaving);
-        // check that order is maintain
-        assertEquals(passwordLinePositionBeforeEncryptAndSave, passwordLinePositionAfterEncryptAndSave);
-    }
-
-    private File getPropertiesStorageFile(String filePath) {
-        File storagePropsFile = ResourceUtils.getResourceAsFile(filePath);
-        return storagePropsFile;
-    }
-
-    private int getFileNumOfLines(String filePath) {
-        int lineCount = 0;
-        try {
-            BufferedReader br = new BufferedReader(new FileReader(ResourceUtils.getResourceAsFile(filePath)));
-            while ((br.readLine()) != null) {
-                lineCount++;
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return lineCount;
-    }
-
-    private int getKeyPositionLine(String filePath,String key) {
-        int lineCount = 0;
-        try {
-            String line;
-            BufferedReader br = new BufferedReader(new FileReader((ResourceUtils.getResourceAsFile(filePath))));
-            while ((line = br.readLine()) != null) {
-                if (line.startsWith(key)) {
-                    lineCount++;
-                    return lineCount;
-                }
-                lineCount++;
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return lineCount;
-    }
-}
diff --git a/storage/common/src/test/java/org/artifactory/storage/StoragePropertiesTest.java b/storage/common/src/test/java/org/artifactory/storage/StoragePropertiesTest.java
deleted file mode 100644
index ba64d3f..0000000
--- a/storage/common/src/test/java/org/artifactory/storage/StoragePropertiesTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage;
-
-import org.artifactory.storage.db.DbType;
-import org.artifactory.util.ResourceUtils;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-
-import static org.testng.Assert.*;
-
-/**
- * Unit tests for the {@link org.artifactory.storage.StorageProperties} class.
- *
- * @author Yossi Shaul
- */
- at Test
-public class StoragePropertiesTest {
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = ".*Space.*")
-    public void failUnsupportedDatabaseType() throws IOException {
-        new StorageProperties(ResourceUtils.getResourceAsFile("/storage/unsupported.properties"));
-    }
-
-    public void minimalPropertiesFile() throws IOException {
-        StorageProperties sp = new StorageProperties(
-                ResourceUtils.getResourceAsFile("/storage/minimalstorage.properties"));
-
-        assertEquals(sp.getDbType(), DbType.DERBY);
-        assertEquals(sp.getConnectionUrl(), "jdbc:to:somewhere");
-        assertEquals(sp.getDriverClass(), "some.driver");
-        assertNull(sp.getUsername());
-        assertNull(sp.getPassword());
-        assertEquals(sp.getMaxActiveConnections(), StorageProperties.DEFAULT_MAX_ACTIVE_CONNECTIONS);
-        assertEquals(sp.getMaxIdleConnections(), StorageProperties.DEFAULT_MAX_IDLE_CONNECTIONS);
-        assertEquals(sp.getCacheProviderMaxSize(), 5368709120L);
-    }
-
-    public void minimalWithCacheSize() throws IOException {
-        StorageProperties sp = new StorageProperties(
-                ResourceUtils.getResourceAsFile("/storage/gigscachesize.properties"));
-
-        assertEquals(sp.getDbType(), DbType.DERBY);
-        assertEquals(sp.getConnectionUrl(), "jdbc:to:somewhere");
-        assertEquals(sp.getDriverClass(), "some.driver");
-        assertNull(sp.getUsername());
-        assertNull(sp.getPassword());
-        assertEquals(sp.getMaxActiveConnections(), StorageProperties.DEFAULT_MAX_ACTIVE_CONNECTIONS);
-        assertEquals(sp.getMaxIdleConnections(), StorageProperties.DEFAULT_MAX_IDLE_CONNECTIONS);
-        assertEquals(sp.getCacheProviderMaxSize(), 1073741824L); // 1g
-    }
-
-    public void valuesWithSpaces() throws IOException {
-        StorageProperties sp = new StorageProperties(ResourceUtils.getResourceAsFile("/storage/trim.properties"));
-
-        assertEquals(sp.getDbType(), DbType.DERBY);
-        assertEquals(sp.getConnectionUrl(), "jdbc:to:removespaces");
-        assertEquals(sp.getDriverClass(), "some.driver");
-        assertEquals(sp.getProperty("binary.provider.filesystem.dir", ""), "a/b/c");
-        assertEquals(sp.getProperty("empty", ""), "");
-        assertEquals(sp.getProperty("emptySpaces", ""), "");
-    }
-
-    public void isDerby() throws IOException {
-        StorageProperties sp = new StorageProperties(
-                ResourceUtils.getResourceAsFile("/storage/minimalstorage.properties"));
-        assertTrue(sp.isDerby());
-        assertEquals(sp.getDbType(), DbType.DERBY);
-    }
-
-    public void isPostgres() throws IOException {
-        StorageProperties sp = new StorageProperties(
-                ResourceUtils.getResourceAsFile("/storage/storagepostgres.properties"));
-        assertTrue(sp.isPostgres());
-        assertEquals(sp.getDbType(), DbType.POSTGRESQL);
-    }
-
-}
diff --git a/storage/common/src/test/java/org/artifactory/storage/db/DbTypeTest.java b/storage/common/src/test/java/org/artifactory/storage/db/DbTypeTest.java
deleted file mode 100644
index 6649a72..0000000
--- a/storage/common/src/test/java/org/artifactory/storage/db/DbTypeTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Unit tests for {@link org.artifactory.storage.db.DbType}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class DbTypeTest {
-
-    public void parseSupported() {
-        assertEquals(DbType.DERBY, DbType.parse("derby"));
-    }
-
-    public void parseSupportedCapitals() {
-        assertEquals(DbType.ORACLE, DbType.parse("ORACLE"));
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void parseNull() {
-        DbType.parse(null);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void parseEmpty() {
-        DbType.parse("");
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = ".*nosql.*")
-    public void parseNotSupported() {
-        DbType.parse("nosql");
-    }
-}
diff --git a/storage/common/src/test/java/org/artifactory/storage/fs/tree/file/JavaIOFileAdapterTest.java b/storage/common/src/test/java/org/artifactory/storage/fs/tree/file/JavaIOFileAdapterTest.java
deleted file mode 100644
index 1dc76bd..0000000
--- a/storage/common/src/test/java/org/artifactory/storage/fs/tree/file/JavaIOFileAdapterTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.fs.tree.file;
-
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.model.xstream.fs.FileInfoImpl;
-import org.artifactory.model.xstream.fs.FolderInfoImpl;
-import org.artifactory.storage.fs.tree.FileNode;
-import org.artifactory.storage.fs.tree.FolderNode;
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-import static org.testng.Assert.*;
-
-/**
- * Units tests for the {@link org.artifactory.storage.fs.tree.file.JavaIOFileAdapter}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class JavaIOFileAdapterTest {
-
-    public void fileInfoAdapter() {
-        FileInfoImpl fileInfo = new FileInfoImpl(new RepoPathImpl("repoX", "test/file.txt"));
-        JavaIOFileAdapter fileAdapter = new JavaIOFileAdapter(new FileNode(fileInfo));
-
-        assertFalse(fileAdapter.isDirectory());
-        assertTrue(fileAdapter.isFile());
-        assertEquals(fileAdapter.getRepoPath(), fileInfo.getRepoPath());
-        assertEquals(fileAdapter.getFileInfo(), fileInfo);
-        assertEquals(fileAdapter.getAbsolutePath(), new File("repoX/test/file.txt").getPath());
-        assertFalse(fileAdapter.canWrite());
-    }
-
-    public void folderInfoAdapter() {
-        FolderInfoImpl folderInfo = new FolderInfoImpl(new RepoPathImpl("repoX", "test/folder/"));
-        JavaIOFileAdapter folderAdapter = new JavaIOFileAdapter(new FolderNode(folderInfo, null));
-
-        assertTrue(folderAdapter.isDirectory());
-        assertFalse(folderAdapter.isFile());
-        assertEquals(folderAdapter.getRepoPath(), folderInfo.getRepoPath());
-        assertEquals(folderAdapter.getInfo(), folderInfo);
-        assertEquals(folderAdapter.getAbsolutePath(), new File("repoX/test/folder").getPath());
-    }
-
-}
diff --git a/storage/common/src/test/java/org/artifactory/util/RepoPathUtilsTest.java b/storage/common/src/test/java/org/artifactory/util/RepoPathUtilsTest.java
deleted file mode 100644
index 25f0801..0000000
--- a/storage/common/src/test/java/org/artifactory/util/RepoPathUtilsTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.util;
-
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNull;
-
-/**
- * Tests the {@link org.artifactory.util.RepoPathUtils}.
- * This test is here because it has runtime dependency on {@link org.artifactory.model.common.RepoPathImpl}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class RepoPathUtilsTest {
-
-    public void getAncestorParent() {
-        RepoPath path = RepoPathFactory.create("test", "1/2");
-        assertEquals(RepoPathUtils.getAncestor(path, 1), path.getParent());
-    }
-
-    public void getAncestorGrandParent() {
-        RepoPath path = RepoPathFactory.create("test", "1/2");
-        assertEquals(RepoPathUtils.getAncestor(path, 2), path.getParent().getParent());
-    }
-
-    public void getAncestorOfRoot() {
-        RepoPath path = RepoPathFactory.create("test", "");
-        assertNull(RepoPathUtils.getAncestor(path, 1));
-    }
-
-    public void getAncestorBeyondRoot() {
-        RepoPath path = RepoPathFactory.create("test", "1/2");
-        assertNull(RepoPathUtils.getAncestor(path, 3));
-    }
-}
diff --git a/storage/common/src/test/resources/storage/gigscachesize.properties b/storage/common/src/test/resources/storage/gigscachesize.properties
deleted file mode 100644
index cc5c857..0000000
--- a/storage/common/src/test/resources/storage/gigscachesize.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-type=derby
-url=jdbc:to:somewhere
-driver=some.driver
-
-binary.provider.cache.maxSize=1g
\ No newline at end of file
diff --git a/storage/common/src/test/resources/storage/minimalstorage.properties b/storage/common/src/test/resources/storage/minimalstorage.properties
deleted file mode 100644
index 62697fc..0000000
--- a/storage/common/src/test/resources/storage/minimalstorage.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-type=derby
-url=jdbc:to:somewhere
-driver=some.driver
\ No newline at end of file
diff --git a/storage/common/src/test/resources/storage/storagepostgres.properties b/storage/common/src/test/resources/storage/storagepostgres.properties
deleted file mode 100644
index f5bdcc8..0000000
--- a/storage/common/src/test/resources/storage/storagepostgres.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-#line 0
-type=postgresql
-#line 1
-driver=org.postgresql.Driver
-#Line 2
-url=jdbc:postgresql://localhost:5432/artdbtest
-#Line 3
-username=artifactory
-#Line 4
-password=password
-#Line 5
-binary.provider.s3.identity=AKIAIQKSNWN5FBM7L6DQ
-#Line 6
-binary.provider.s3.credential=orzT0nSPFIkAfNeSetIkb7Arq2luP9KYcOZISUR+
-#line 7
-binary.provider.s3.proxy.host=orzT0nSPFIkAfNeSetIkb7Arq2luP9KYcOZISUR+
-#Line 8
-binary.provider.s3.proxy.credential=orzT0nSPFIkAfNeSetIkb7Arq2luP9KYcOZISUR+
-#Line 9
-binary.provider.s3.param.jclouds.endpoint=http://s3.amazonaws.com
diff --git a/storage/common/src/test/resources/storage/trim.properties b/storage/common/src/test/resources/storage/trim.properties
deleted file mode 100644
index 8164158..0000000
--- a/storage/common/src/test/resources/storage/trim.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-# values with spaces
-type= derby
-url= jdbc:to:removespaces 
-driver=  some.driver
-
-empty=
-emptySpace=  
-
-binary.provider.cache.maxSize=1g   
-
-binary.provider.filesystem.dir = a/b/c
-
diff --git a/storage/common/src/test/resources/storage/unsupported.properties b/storage/common/src/test/resources/storage/unsupported.properties
deleted file mode 100644
index f1f3d04..0000000
--- a/storage/common/src/test/resources/storage/unsupported.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-type=Space
-url=jdbc:to:somewhere
-driver=some.driver
\ No newline at end of file
diff --git a/storage/config/pom.xml b/storage/config/pom.xml
deleted file mode 100644
index ee409b9..0000000
--- a/storage/config/pom.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2014 JFrog Ltd. All rights reserved.
-  ~ JFROG PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
---><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0          http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <artifactId>artifactory-storage-parent</artifactId>
-        <groupId>org.artifactory</groupId>
-        <version>4.8.0</version>
-    </parent>
-
-    <artifactId>artifactory-storage-config</artifactId>
-    <packaging>jar</packaging>
-    <name>ArtifactoryStorage Config</name>
-    <dependencies>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-        </dependency>
-    </dependencies>
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jar-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>test-jar</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/storage/db/pom.xml b/storage/db/pom.xml
deleted file mode 100644
index 3aaac4e..0000000
--- a/storage/db/pom.xml
+++ /dev/null
@@ -1,157 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0          http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>artifactory-storage-db</artifactId>
-    <name>Artifactory Storage SQL</name>
-    <packaging>jar</packaging>
-
-    <parent>
-        <artifactId>artifactory-storage-parent</artifactId>
-        <groupId>org.artifactory</groupId>
-        <version>4.8.0</version>
-    </parent>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.jfrog.storage</groupId>
-            <artifactId>binary-store-core</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-storage-common</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.tomcat</groupId>
-            <artifactId>tomcat-jdbc</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>commons-dbutils</groupId>
-            <artifactId>commons-dbutils</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-lang</groupId>
-            <artifactId>commons-lang</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.derby</groupId>
-            <artifactId>derby</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-jdbc</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.iostreams</groupId>
-            <artifactId>iostreams</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-config</artifactId>
-            <type>test-jar</type>
-        </dependency>
-
-        <dependency>
-            <groupId>org.codehaus.mojo</groupId>
-            <artifactId>versions-maven-plugin</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-test</artifactId>
-            <version>${spring.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.mockito</groupId>
-            <artifactId>mockito-core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.easytesting</groupId>
-            <artifactId>fest-assert</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>mysql</groupId>
-            <artifactId>mysql-connector-java</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.oracle</groupId>
-            <artifactId>ojdbc6</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>postgresql</groupId>
-            <artifactId>postgresql</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.microsoft.sqlserver</groupId>
-            <artifactId>sqljdbc4</artifactId>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <!-- override default test -->
-                        <id>default-test</id>
-                        <goals>
-                            <goal>test</goal>
-                        </goals>
-                        <configuration>
-                            <excludes>
-                                <exclude>**/itest/**</exclude>
-                            </excludes>
-                        </configuration>
-                    </execution>
-                    <execution>
-                        <id>integration-tests</id>
-                        <goals>
-                            <goal>test</goal>
-                        </goals>
-                        <configuration>
-                            <suiteXmlFiles>
-                                <suiteXmlFile>${project.basedir}/src/test/resources/testng-db.xml</suiteXmlFile>
-                            </suiteXmlFiles>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jar-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>test-jar</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/DbServiceImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/DbServiceImpl.java
deleted file mode 100644
index 3ba1bdb..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/DbServiceImpl.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.tomcat.jdbc.pool.jmx.ConnectionPool;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.mbean.MBeanRegistrationService;
-import org.artifactory.spring.Reloadable;
-import org.artifactory.storage.StorageProperties;
-import org.artifactory.storage.db.fs.dao.NodesDao;
-import org.artifactory.storage.db.mbean.ManagedDataSource;
-import org.artifactory.storage.db.properties.model.DbProperties;
-import org.artifactory.storage.db.properties.service.ArtifactoryDbPropertiesService;
-import org.artifactory.storage.db.spring.ArtifactoryDataSource;
-import org.artifactory.storage.db.spring.ArtifactoryTomcatDataSource;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.IdGenerator;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.artifactory.storage.db.version.ArtifactoryDBVersion;
-import org.artifactory.util.ResourceUtils;
-import org.artifactory.version.CompoundVersionDetails;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.stereotype.Repository;
-import org.springframework.transaction.support.TransactionSynchronizationManager;
-
-import javax.annotation.PostConstruct;
-import javax.sql.DataSource;
-import java.io.IOException;
-import java.io.InputStream;
-import java.sql.Connection;
-import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.concurrent.Callable;
-
-/**
- * @author Yossi Shaul
- */
- at Repository
- at Reloadable(beanClass = DbService.class)
-public class DbServiceImpl implements DbService {
-    private static final Logger log = LoggerFactory.getLogger(DbServiceImpl.class);
-
-    private static final double MYSQL_MIN_VERSION = 5.5;
-
-    @Autowired
-    private JdbcHelper jdbcHelper;
-
-    @Autowired
-    @Qualifier("storageProperties")
-    private StorageProperties storageProperties;
-
-    @Autowired
-    private IdGenerator idGenerator;
-
-    @Autowired
-    private ArtifactoryDbPropertiesService dbPropertiesService;
-
-    @PostConstruct
-    private void initDb() throws Exception {
-        printConnectionInfo();
-
-        // check if db tables exist and initialize if not
-        if (!isSchemaExist()) {
-            try (Connection con = jdbcHelper.getDataSource().getConnection()) {
-
-                // if using mySQL, check version compatibility
-                if (storageProperties.getDbType() == DbType.MYSQL) {
-                    checkMySqlMinVersion();
-                }
-
-                // read ddl from file and execute
-                log.info("***Creating database schema***");
-                DbUtils.executeSqlStream(con, getDbSchemaSql());
-                updateDbProperties();
-
-
-            }
-        }
-
-        // initialize id generator
-        initializeIdGenerator();
-    }
-
-    private void updateDbProperties() {
-        // Update DBProperties
-        long installTime = System.currentTimeMillis();
-        CompoundVersionDetails versionDetails = ArtifactoryHome.get().readRunningArtifactoryVersion();
-        String versionStr = versionDetails.getVersion().getValue();
-        long timestamp = versionDetails.getTimestamp();
-        int revisionInt = versionDetails.getRevisionInt();
-        dbPropertiesService.updateDbProperties(new DbProperties(installTime, versionStr, revisionInt, timestamp));
-    }
-
-    @Override
-    public void init() {
-        registerDataSourceMBean();
-    }
-
-    @Override
-    public DbType getDatabaseType() {
-        return storageProperties.getDbType();
-    }
-
-    @Override
-    public long nextId() {
-        return idGenerator.nextId();
-    }
-
-    @Override
-    public void compressDerbyDb(BasicStatusHolder statusHolder) {
-        DerbyUtils.compress(statusHolder);
-    }
-
-    @Override
-    public <T> T invokeInTransaction(String transactionName, Callable<T> execute) {
-        if (StringUtils.isNotBlank(transactionName)) {
-            TransactionSynchronizationManager.setCurrentTransactionName(transactionName);
-        }
-        try {
-            return execute.call();
-        } catch (Exception e) {
-            if (e instanceof RuntimeException) {
-                throw (RuntimeException) e;
-            }
-            throw new RuntimeException(e);
-        }
-    }
-
-    //used via reflection by DbBaseTest
-    public void initializeIdGenerator() throws SQLException {
-        idGenerator.initializeIdGenerator();
-    }
-
-    private InputStream getDbSchemaSql() throws IOException {
-        String dbTypeName = storageProperties.getDbType().toString();
-        String resourcePath = "/" + dbTypeName + "/" + dbTypeName + ".sql";
-        InputStream resource = ResourceUtils.getResource(resourcePath);
-        if (resource == null) {
-            throw new IOException("Database DDL resource not found at: '" + resourcePath + "'");
-        }
-        return resource;
-    }
-
-    private boolean isSchemaExist() throws SQLException {
-        log.debug("Checking for database schema existence");
-        try (Connection con = jdbcHelper.getDataSource().getConnection()) {
-            DatabaseMetaData metaData = con.getMetaData();
-            return tableExists(metaData, NodesDao.TABLE_NAME);
-        }
-    }
-
-    public static boolean tableExists(DatabaseMetaData metaData, String tableName) throws SQLException {
-        return DbUtils.tableExists(metaData, tableName);
-    }
-
-    private void printConnectionInfo() throws SQLException {
-        Connection connection = jdbcHelper.getDataSource().getConnection();
-        try {
-            DatabaseMetaData meta = connection.getMetaData();
-            log.info("Database: {} {}. Driver: {} {}", meta.getDatabaseProductName(), meta.getDatabaseProductVersion(),
-                    meta.getDriverName(), meta.getDriverVersion());
-            log.info("Connection URL: {}", meta.getURL());
-        } catch (SQLException e) {
-            log.warn("Can not retrieve database and driver name / version", e);
-        } finally {
-            DbUtils.close(connection);
-        }
-    }
-
-    private void registerDataSourceMBean() {
-        DataSource dataSource = jdbcHelper.getDataSource();
-        if (dataSource instanceof ArtifactoryDataSource) {
-            ContextHelper.get().beanForType(MBeanRegistrationService.class).register(
-                    new ManagedDataSource((ArtifactoryDataSource) dataSource, jdbcHelper), "Storage", "Data Source");
-        }
-        if (dataSource instanceof ArtifactoryTomcatDataSource) {
-            // register the Tomcat JDBC pool JMX if enabled
-            ArtifactoryTomcatDataSource tomcatDataSource = (ArtifactoryTomcatDataSource) dataSource;
-            if (tomcatDataSource.isJmxEnabled()) {
-                ConnectionPool jmxPool = tomcatDataSource.getPool().getJmxPool();
-                ContextHelper.get().beanForType(MBeanRegistrationService.class)
-                        .register(jmxPool, "Storage", "Connection Pool");
-
-            }
-        }
-    }
-
-    private boolean checkMySqlMinVersion() {
-        log.debug("Checking MySQL version compatibility");
-        ResultSet rs = null;
-        try {
-            rs = jdbcHelper.executeSelect("SELECT VERSION();");
-            if (rs.next()) {
-                String versionString = rs.getString(1);
-                int i = StringUtils.ordinalIndexOf(versionString, ".", 2);
-                if (i == -1) {
-                    i = versionString.length();
-                }
-                Double mysqlVersion = Double.valueOf(versionString.substring(0, i));
-                if (mysqlVersion >= MYSQL_MIN_VERSION) {
-                    return true;
-                } else {
-                    log.error("Unsupported MySQL version found [" + versionString + "]. " +
-                            "Minimum version required is " + MYSQL_MIN_VERSION + ". " +
-                            "Please follow the requirements on the wiki page.");
-                    return false;
-                }
-            }
-        } catch (Exception e) {
-            log.error("Could not determine MySQL version due to an exception", e);
-        } finally {
-            DbUtils.close(rs);
-        }
-        log.error("Could not determine MySQL version. Minimum version should be " + MYSQL_MIN_VERSION + " and above.");
-        return false;
-    }
-
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-        ArtifactoryDBVersion.convert(source.getVersion(), jdbcHelper, storageProperties.getDbType());
-        updateDbProperties();
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-    }
-
-    @Override
-    public void destroy() {
-        jdbcHelper.destroy();
-    }
-
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/DerbyUtils.java b/storage/db/src/main/java/org/artifactory/storage/db/DerbyUtils.java
deleted file mode 100644
index 7d2a2f4..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/DerbyUtils.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.artifactory.storage.spring.StorageContextHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.sql.CallableStatement;
-import java.sql.Connection;
-import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-
-/**
- * @author yoavl
- */
-public abstract class DerbyUtils {
-    private static final Logger log = LoggerFactory.getLogger(DerbyUtils.class);
-
-    /**
-     * http://db.apache.org/derby/docs/10.2/ref/rrefaltertablecompress.html
-     */
-    private static final String CALL_COMPRESS = "CALL SYSCS_UTIL.SYSCS_COMPRESS_TABLE(?, ?, ?)";
-
-    /**
-     * http://db.apache.org/derby/docs/10.2/ref/rrefproceduresinplacecompress.html
-     */
-    private static final String CALL_COMPRESS_INPLACE = "CALL SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE(?, ?, ?, ?, ?)";
-
-    public static void compress(BasicStatusHolder holder) {
-        try {
-            compressDataStore();
-        } catch (Exception e) {
-            holder.error("Could not compress storage", e, log);
-        }
-    }
-
-    /**
-     * Compresses the datastore tables (holding the blobs).
-     */
-    private static void compressDataStore() throws Exception {
-        log.info("Compressing derby binaries table...");
-
-        JdbcHelper jdbcHelper = StorageContextHelper.get().beanForType(JdbcHelper.class);
-
-        Connection con = null;
-        try {
-            con = jdbcHelper.getDataSource().getConnection();
-            con.setAutoCommit(true);
-
-            DatabaseMetaData dbMetadata = con.getMetaData();
-            ResultSet rs = dbMetadata.getTables(null, null, null, new String[]{"TABLE"});
-
-            String binariesTableName = ("binaries").toUpperCase();
-
-            while (rs.next()) {
-                String currentSchemaName = rs.getString("TABLE_SCHEM").toUpperCase();
-                String currentTableName = rs.getString("TABLE_NAME").toUpperCase();
-                if (currentTableName.equals(binariesTableName)) {
-                    executeCall(con, CALL_COMPRESS, currentSchemaName, currentTableName, 1);
-                    executeCall(con, CALL_COMPRESS_INPLACE, currentSchemaName, currentTableName, 3);
-                    log.debug("Datastore compressed successfully");
-                }
-            }
-        } finally {
-            DbUtils.close(con);
-        }
-    }
-
-    /**
-     * Executes the given call (does not commit)
-     *
-     * @param connection  Database connection
-     * @param command     Command to execute
-     * @param schemaName  Name of selected schema
-     * @param tableName   Name of selected table
-     * @param paramLength Length of short params needed for the command
-     * @throws SQLException
-     */
-    private static void executeCall(Connection connection, String command, String schemaName, String tableName,
-            int paramLength) throws SQLException {
-        CallableStatement cs = connection.prepareCall(command);
-        cs.setString(1, schemaName);
-        cs.setString(2, tableName);
-        paramLength += 3;
-        for (int i = 3; i < paramLength; i++) {
-            cs.setShort(i, (short) 1);
-        }
-        cs.execute();
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/dao/AqlDao.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/dao/AqlDao.java
deleted file mode 100644
index 64aa4a6..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/dao/AqlDao.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package org.artifactory.storage.db.aql.dao;
-
-import org.artifactory.aql.AqlException;
-import org.artifactory.aql.model.AqlPermissionProvider;
-import org.artifactory.aql.result.AqlLazyResult;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.db.DbType;
-import org.artifactory.storage.db.aql.sql.builder.query.sql.SqlQuery;
-import org.artifactory.storage.db.aql.sql.result.AqlEagerResultImpl;
-import org.artifactory.storage.db.aql.sql.result.AqlLazyResultImpl;
-import org.artifactory.storage.db.util.BaseDao;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.artifactory.storage.db.util.TxHelper;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Repository;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-
-/**
- * @author Gidi Shabat
- */
- at Repository
-public class AqlDao extends BaseDao {
-
-    @Autowired
-    private DbService dbService;
-
-    @Autowired
-    public AqlDao(JdbcHelper jdbcHelper) {
-        super(jdbcHelper);
-    }
-
-    /**
-     * Execute the AQL query ant fetch the results eagerly
-     * Note that it is recommended to use the executeQueryLazy which consumes less memory and allow minimal waiting time.
-     */
-    public AqlEagerResultImpl executeQueryEager(SqlQuery sqlQuery) {
-        ResultSet resultSet = null;
-        try {
-            if (allowReadCommitted()) {
-                resultSet = jdbcHelper.executeSelect(sqlQuery.getQueryString(), sqlQuery.getQueryParams());
-            } else {
-                resultSet = jdbcHelper.executeSelect(sqlQuery.getQueryString(), true, sqlQuery.getQueryParams());
-            }
-            AqlEagerResultImpl aqlQueryResult = new AqlEagerResultImpl(resultSet, sqlQuery);
-            return aqlQueryResult;
-        } catch (Exception e) {
-            throw new AqlException("Failed to execute the following sql query" + sqlQuery, e);
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    private boolean allowReadCommitted() {
-        return dbService.getDatabaseType().equals(DbType.ORACLE) || dbService.getDatabaseType().equals(DbType.POSTGRESQL) ||
-                ConstantValues.enableAqlReadCommitted.getBoolean() || TxHelper.isInTransaction();
-    }
-
-    /**
-     * Execute the AQL query and fetch the results lazy
-     * Unlike the Eager mode which loads all the results into memory and only then return it to the caller.
-     * The lazy mode dynamically fills the result into stream, actually the AqlQueryStreamResult role is is kind of
-     * broker between the database and the client
-     */
-    public AqlLazyResult executeQueryLazy(SqlQuery sqlQuery, AqlPermissionProvider aqlPermissionProvider) {
-        ResultSet resultSet;
-        try {
-            if (allowReadCommitted()) {
-                resultSet = jdbcHelper.executeSelect(sqlQuery.getQueryString(), sqlQuery.getQueryParams());
-            } else {
-                resultSet = jdbcHelper.executeSelect(sqlQuery.getQueryString(), true, sqlQuery.getQueryParams());
-            }
-        } catch (SQLException e) {
-            throw new AqlException("Failed to execute the following sql query" + sqlQuery, e);
-        }
-        AqlLazyResult aqlQueryResult = new AqlLazyResultImpl(resultSet, sqlQuery, aqlPermissionProvider);
-        return aqlQueryResult;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/AqlParser.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/AqlParser.java
deleted file mode 100644
index da6bd5a..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/AqlParser.java
+++ /dev/null
@@ -1,163 +0,0 @@
-package org.artifactory.storage.db.aql.parser;
-
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.aql.AqlParserException;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.high.level.basic.language.*;
-import org.artifactory.storage.db.aql.parser.elements.high.level.basic.language.BuildPromotionsDomainsElement;
-import org.artifactory.storage.db.aql.parser.elements.high.level.basic.language.BuildPromotionsFieldsElement;
-import org.artifactory.storage.db.aql.parser.elements.high.level.basic.language.BuildPromotionsStarElement;
-import org.artifactory.storage.db.aql.parser.elements.high.level.basic.language.BuildPromotionsValuesElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalEmptyElement;
-
-import java.util.Set;
-
-/**
- * Parse the Aql string query into parser result which is a list of parser elements
- * The parser does not have state therefore a single instance can be used on single JVM
- *
- * @author Gidi Shabat
- */
-public class AqlParser {
-    public static final String[] DELIMITERS = {"<=", ">=", "!=", " ", "<", ">", "(", ")", "[", "]", "{", "}", "=", "'", ".", ":", "\"", ":"};
-    public static final String[] USED_KEYS = {"$mt", "$lt", "$eq", "and", "not", "or", "artifacts"};
-    public static final DotElement dot = new DotElement();
-    public static final CommaElement comma = new CommaElement();
-    public static final StarElement star = new StarElement();
-    public static final QuotedComparator quotedComparator = new QuotedComparator();
-    public static final QuotedRelativeDateComparator quotedRelativeDateComparator = new QuotedRelativeDateComparator();
-    public static final ComparatorElement comparator = new ComparatorElement();
-    public static final RelativeDateComparatorElement relativeDateComparator = new RelativeDateComparatorElement();
-    public static final QuotesElement quotes = new QuotesElement();
-    public static final ColonElement colon = new ColonElement();
-    public static final ValueNumberNullElement valueOrNumberOrNull = new ValueNumberNullElement();
-    public static final ValueElement value = new ValueElement();
-    public static final NumberElement number = new NumberElement();
-    public static final NullElement nullElement = new NullElement();
-    public static final FieldElement field = new FieldElement();
-    public static final OpenParenthesisElement openParenthesis = new OpenParenthesisElement();
-    public static final CloseParenthesisElement closeParenthesis = new CloseParenthesisElement();
-    public static final OpenCurlyBracketsElement openCurlyBrackets = new OpenCurlyBracketsElement();
-    public static final CloseCurlyBracketsElement closedCurlyBrackets = new CloseCurlyBracketsElement();
-    public static final OpenBracketsElement openBrackets = new OpenBracketsElement();
-    public static final CloseBracketsElement closeBrackets = new CloseBracketsElement();
-    public static final InternalEmptyElement empty = new InternalEmptyElement();
-    public static final SortTypeElement sortType = new SortTypeElement();
-    public static final LimitValueElement limitValue = new LimitValueElement();
-    public static final OffsetValueElement offsetValue = new OffsetValueElement();
-
-    public static final BuildPromotionsDomainsElement buildPromotionsDomains = new BuildPromotionsDomainsElement();
-    public static final StatisticsDomainsElement statisticsDomains = new StatisticsDomainsElement();
-    public static final BuildDomainsElement buildDomains = new BuildDomainsElement();
-    public static final BuildPropertyDomainsElement buildPropertiesDomains = new BuildPropertyDomainsElement();
-    public static final BuildModulePropertyDomainsElement buildModulePropertiesDomains = new BuildModulePropertyDomainsElement();
-    public static final BuildModuleDomainsElement buildModuleDomains = new BuildModuleDomainsElement();
-    public static final BuildDependenciesDomainsElement buildDependenciesDomains = new BuildDependenciesDomainsElement();
-    public static final BuildArtifactDomainsElement buildArtifactDomains = new BuildArtifactDomainsElement();
-    public static final PropertyDomainsElement propertiesDomains = new PropertyDomainsElement();
-    public static final ArchiveEntriesDomainsElement entriesDomains = new ArchiveEntriesDomainsElement();
-    public static final ArchiveDomainsElement archiveDomains = new ArchiveDomainsElement();
-    public static final ItemDomainsElement itemDomains = new ItemDomainsElement();
-
-    public static final BuildPromotionsStarElement buildPromotionsStar = new BuildPromotionsStarElement();
-    public static final StatisticsStarElement statisticsStar = new StatisticsStarElement();
-    public static final BuildStarElement buildStar = new BuildStarElement();
-    public static final BuildPropertyStarElement buildPropertiesStar = new BuildPropertyStarElement();
-    public static final BuildModulePropertyStarElement buildModulePropertiesStar = new BuildModulePropertyStarElement();
-    public static final BuildModuleStarElement buildModuleStar = new BuildModuleStarElement();
-    public static final BuildDependenciesStarElement buildDependenciesStar = new BuildDependenciesStarElement();
-    public static final BuildArtifactStarElement buildArtifactStar = new BuildArtifactStarElement();
-    public static final PropertyStarElement propertiesStar = new PropertyStarElement();
-    public static final ArchiveEntriesStarElement entriesStar = new ArchiveEntriesStarElement();
-    public static final ArchiveStarElement archiveStar = new ArchiveStarElement();
-    public static final ItemStarElement itemStar = new ItemStarElement();
-
-    public static final BuildPromotionsValuesElement buildPromotionsValues = new BuildPromotionsValuesElement();
-    public static final StatisticsValuesElement statisticsValues = new StatisticsValuesElement();
-    public static final BuildValuesElement buildValues = new BuildValuesElement();
-    public static final BuildPropertyValuesElement buildPropertiesValues = new BuildPropertyValuesElement();
-    public static final BuildModulePropertyValuesElement buildModulePropertiesValues = new BuildModulePropertyValuesElement();
-    public static final BuildModuleValuesElement buildModuleValues = new BuildModuleValuesElement();
-    public static final BuildDependenciesValuesElement buildDependenciesValues = new BuildDependenciesValuesElement();
-    public static final BuildArtifactValuesElement buildArtifactValues = new BuildArtifactValuesElement();
-    public static final PropertyValuesElement propertiesValues = new PropertyValuesElement();
-    public static final ArchiveEntriesValuesElement entriesValues = new ArchiveEntriesValuesElement();
-    public static final ArchiveValuesElement archiveValues = new ArchiveValuesElement();
-    public static final ItemValuesElement itemValues = new ItemValuesElement();
-
-    public static final BuildPromotionsFieldsElement buildPromotionsFields = new BuildPromotionsFieldsElement();
-    public static final StatisticsFieldsElement statisticsFields = new StatisticsFieldsElement();
-    public static final BuildFieldsElement buildFields = new BuildFieldsElement();
-    public static final BuildPropertyFieldsElement buildPropertiesFields = new BuildPropertyFieldsElement();
-    public static final BuildModulePropertyFieldsElement buildModulePropertiesFields = new BuildModulePropertyFieldsElement();
-    public static final BuildModuleFieldsElement buildModuleFields = new BuildModuleFieldsElement();
-    public static final BuildDependenciesFieldsElement buildDependenciesFields = new BuildDependenciesFieldsElement();
-    public static final BuildArtifactFieldsElement buildArtifactFields = new BuildArtifactFieldsElement();
-    public static final PropertyFieldsElement propertiesFields = new PropertyFieldsElement();
-    public static final ArchiveEntryFieldsElement entriesFields = new ArchiveEntryFieldsElement();
-    public static final ArchiveFieldsElement archiveFields = new ArchiveFieldsElement();
-    public static final ItemFieldsElement itemFields = new ItemFieldsElement();
-
-    public static final OffsetElement offset = new OffsetElement();
-    public static final LimitElement limit = new LimitElement();
-    public static final RootElement root = new RootElement();
-
-    /**
-     * Init once during the class initialisation.
-     * All the parser instances will use the same parser elements instances
-     */
-    static {
-        root.initialize();
-    }
-
-    /**
-     * Initialize the parser process starting from the root element which represent the entire language
-     *
-     * @param query The AQL query string
-     * @return Parsing result
-     * @throws AqlParserException If query parsing fails
-     */
-    public ParserElementResultContainer parse(String query) {
-        AqlParserContext parserContext = new AqlParserContext();
-        ParserElementResultContainer[] parserElementResultContainers = root.peelOff(query, parserContext);
-        for (ParserElementResultContainer parserElementResultContainer : parserElementResultContainers) {
-            if (StringUtils.isBlank(parserElementResultContainer.getQueryRemainder())) {
-                return parserElementResultContainer;
-            }
-        }
-        String subQuery = parserContext.getQueryRemainder() != null ?
-                parserContext.getQueryRemainder().trim() : query.trim();
-        throw new AqlParserException(String.format("Fail to parse query: %s, it looks like there is syntax error near" +
-                " the following sub-query: %s", query, subQuery));
-    }
-
-    /**
-     * Initialize the parser process starting from the root element which represent the entire language and unlike the parse method
-     * return the available possibilities to accept the next key word
-     * This method is important for the new advance UI search.
-     * <p/>
-     * Examples:
-     * 1. The String "items.find" will return "("
-     * 2. The String "items.find(" will return {"(","\""}
-     * 3. The String "items.find()" will return {"<empty>","."}
-     * 3. The String "items.find()." will return {"sort","limit","include"}
-     *
-     * @param query The AQL query string
-     * @return available possibilities to accept the next key word
-     */
-    public Set<String> predictNextKeyWord(String query) {
-        AqlParserContext parserContext = new AqlParserContext();
-        root.peelOff(query, parserContext);
-        Set<String> result = Sets.newHashSet();
-        for (ParserElement element : parserContext.getElements()) {
-            for (String s : element.next()) {
-                result.add(s);
-}
-        }
-        System.out.println(result);
-        return result;
-    }
-}
-
-
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/AqlParserContext.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/AqlParserContext.java
deleted file mode 100644
index 0c297c0..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/AqlParserContext.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.storage.db.aql.parser;
-
-import com.google.common.collect.Lists;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-
-import java.util.List;
-
-/**
- * This context is being used in case of parser syntax error it provide an accurate location of the syntax error.
- *
- * @author Gidi Shabat
- */
-public class AqlParserContext {
-    private String queryRemainder;
-    private List<ParserElement> elements = Lists.newArrayList();
-
-    /**
-     * Each time a parser element success(matches sub string), the parser peels off the relevant sub string from the string query
-     * and update the context with the remaining query
-     * @param query
-     */
-    public void update(String query) {
-        if (this.queryRemainder == null || query.length() < this.queryRemainder.length()) {
-            this.queryRemainder = query;
-        }
-    }
-
-    public String getQueryRemainder() {
-        return queryRemainder;
-    }
-
-    public void addElement(ParserElement element) {
-        elements.add(element);
-    }
-
-    public List<ParserElement> getElements() {
-        return elements;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/ParserElementResultContainer.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/ParserElementResultContainer.java
deleted file mode 100644
index 6588b94..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/ParserElementResultContainer.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.storage.db.aql.parser;
-
-import com.google.common.collect.Lists;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.util.Pair;
-
-import java.util.List;
-
-/**
- * Each element in The parser peels off a part from the query string.
- * The ParserElementResultContainer contains the the leftover part of the query string
- * and the components that has been used to peel of the query string until this element
- *
- * @author Gidi Shabat
- */
-public class ParserElementResultContainer {
-    /**
-     * Remainder of the original query strong to parse.
-     */
-    private final String queryRemainder;
-    /**
-     * The current element peeled off (can be empty)
-     */
-    private final String element;
-    /**
-     * The query element path leading to this intermediate result. In reverse order.
-     */
-    private final List<Pair<ParserElement, String>> list = Lists.newArrayList();
-
-    public ParserElementResultContainer(String queryRemainder, String element) {
-        this.queryRemainder = queryRemainder;
-        this.element = element;
-    }
-
-    public String getQueryRemainder() {
-        return queryRemainder;
-    }
-
-    public String getElement() {
-        return element;
-    }
-
-    public void add(ParserElement element, String part) {
-        list.add(new Pair<>(element, part));
-    }
-
-    public List<Pair<ParserElement, String>> getAll() {
-        return list;
-    }
-
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/ParserElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/ParserElement.java
deleted file mode 100644
index 0f20f34..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/ParserElement.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements;
-
-
-import org.artifactory.storage.db.aql.parser.AqlParserContext;
-import org.artifactory.storage.db.aql.parser.ParserElementResultContainer;
-
-import java.util.List;
-
-/**
- * The parser is actually group of parser elements that represent the language possibilities tree.
- * Each element represent intersection and its sub-tree in the possibilities tree.
- *
- * @author Gidi Shabat
- */
-public interface ParserElement {
-
-
-    /**
-     * Returns possible matches between the queryRemainder to this parserElement.
-     *
-     * @param queryRemainder The left over for other parser elements to parse
-     * @param context        Path resolution context
-     * @return Possible parsing paths
-     */
-    ParserElementResultContainer[] peelOff(String queryRemainder, AqlParserContext context);
-
-    /**
-     * One time initialization of the parsing tree.
-     * TODO: should be internal only
-     */
-    void initialize();
-
-    /**
-     * Returns the next possibilities
-     *
-     * @return Possible parsing elements
-     */
-    List<String> next();
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ArchiveDomainsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ArchiveDomainsElement.java
deleted file mode 100644
index 51e5562..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ArchiveDomainsElement.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.archives;
-import static org.artifactory.aql.model.AqlDomainEnum.entries;
-import static org.artifactory.aql.model.AqlDomainEnum.items;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-import static org.artifactory.storage.db.aql.parser.AqlParser.entriesDomains;
-import static org.artifactory.storage.db.aql.parser.AqlParser.itemDomains;
-
-/**
- * @author Gidi Shabat
- */
-public class ArchiveDomainsElement extends LazyParserElement implements DomainProviderElement {
-
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomains(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomains(List<ParserElement> list) {
-        list.add(new IncludeDomainElement(archives));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(items.signatue),
-                fork(new EmptyIncludeDomainElement(items), forward(dot, itemDomains))));
-        list.add(forward(new InternalNameElement(entries.signatue),
-                fork(new EmptyIncludeDomainElement(entries), forward(dot, entriesDomains))));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return archives;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ArchiveEntriesDomainsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ArchiveEntriesDomainsElement.java
deleted file mode 100644
index 2d51c9b..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ArchiveEntriesDomainsElement.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.archives;
-import static org.artifactory.aql.model.AqlDomainEnum.entries;
-import static org.artifactory.storage.db.aql.parser.AqlParser.archiveDomains;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-
-/**
- * @author Gidi Shabat
- */
-public class ArchiveEntriesDomainsElement extends LazyParserElement implements DomainProviderElement {
-
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomains(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomains(List<ParserElement> list) {
-        list.add(new IncludeDomainElement(entries));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(archives.signatue),
-                fork(new EmptyIncludeDomainElement(archives), forward(dot, archiveDomains))));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return entries;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ArchiveEntriesStarElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ArchiveEntriesStarElement.java
deleted file mode 100644
index dd36394..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ArchiveEntriesStarElement.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.archives;
-import static org.artifactory.aql.model.AqlDomainEnum.entries;
-import static org.artifactory.storage.db.aql.parser.AqlParser.archiveStar;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-
-/**
- * @author Gidi Shabat
- */
-public class ArchiveEntriesStarElement extends LazyParserElement implements DomainProviderElement {
-
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(forward(new InternalNameElement(archives.signatue), forward(dot, archiveStar))));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return entries;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ArchiveEntriesValuesElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ArchiveEntriesValuesElement.java
deleted file mode 100644
index 962db86..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ArchiveEntriesValuesElement.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.archives;
-import static org.artifactory.aql.model.AqlDomainEnum.entries;
-import static org.artifactory.storage.db.aql.parser.AqlParser.archiveValues;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-
-/**
- * @author Gidi Shabat
- */
-public class ArchiveEntriesValuesElement extends LazyParserElement implements DomainProviderElement {
-
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(forward(new InternalNameElement(archives.signatue), forward(dot, archiveValues))));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return entries;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ArchiveEntryFieldsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ArchiveEntryFieldsElement.java
deleted file mode 100644
index 8512107..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ArchiveEntryFieldsElement.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.archives;
-import static org.artifactory.aql.model.AqlDomainEnum.entries;
-import static org.artifactory.storage.db.aql.parser.AqlParser.archiveFields;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-
-/**
- * @author Gidi Shabat
- */
-public class ArchiveEntryFieldsElement  extends LazyParserElement implements DomainProviderElement {
-
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomainFields(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        AqlFieldEnum[] fields = AqlFieldEnum.getFieldByDomain(entries);
-        for (AqlFieldEnum field : fields) {
-            list.add(new RealFieldElement(field.signature, entries));
-        }
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(archives.signatue), dot, archiveFields));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return entries;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ArchiveFieldsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ArchiveFieldsElement.java
deleted file mode 100644
index c29cc9d..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ArchiveFieldsElement.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.archives;
-import static org.artifactory.aql.model.AqlDomainEnum.entries;
-import static org.artifactory.aql.model.AqlDomainEnum.items;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- *         Acepts the archive fields and its sub domain
- */
-public class ArchiveFieldsElement extends LazyParserElement implements DomainProviderElement {
-
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomainFields(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(items.signatue), dot, itemFields));
-        list.add(forward(new InternalNameElement(entries.signatue), dot, entriesFields));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return archives;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ArchiveStarElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ArchiveStarElement.java
deleted file mode 100644
index 80af04d..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ArchiveStarElement.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.archives;
-import static org.artifactory.aql.model.AqlDomainEnum.entries;
-import static org.artifactory.aql.model.AqlDomainEnum.items;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-import static org.artifactory.storage.db.aql.parser.AqlParser.entriesStar;
-import static org.artifactory.storage.db.aql.parser.AqlParser.itemStar;
-
-/**
- * @author Gidi Shabat
- */
-public class ArchiveStarElement extends LazyParserElement implements DomainProviderElement {
-
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(forward(new InternalNameElement(items.signatue), forward(dot, itemStar))));
-        list.add(forward(forward(new InternalNameElement(entries.signatue), forward(dot, entriesStar))));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return archives;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ArchiveValuesElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ArchiveValuesElement.java
deleted file mode 100644
index 00b4778..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ArchiveValuesElement.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.archives;
-import static org.artifactory.aql.model.AqlDomainEnum.entries;
-import static org.artifactory.aql.model.AqlDomainEnum.items;
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class ArchiveValuesElement extends LazyParserElement implements DomainProviderElement {
-
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(forward(new InternalNameElement(items.signatue), forward(dot, itemValues))));
-        list.add(forward(forward(new InternalNameElement(entries.signatue), forward(dot, entriesValues))));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return archives;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildArtifactDomainsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildArtifactDomainsElement.java
deleted file mode 100644
index 726c2af..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildArtifactDomainsElement.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.*;
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class BuildArtifactDomainsElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomainFields(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        list.add(new IncludeDomainElement(artifacts));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(items.signatue),
-                fork(new EmptyIncludeDomainElement(items), forward(dot, itemDomains))));
-        list.add(forward(new InternalNameElement(modules.signatue),
-                fork(new EmptyIncludeDomainElement(modules), forward(dot, buildModuleDomains))));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return artifacts;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildArtifactFieldsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildArtifactFieldsElement.java
deleted file mode 100644
index 075617f..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildArtifactFieldsElement.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.*;
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- *         Acepts the artifacts fields and its sub domain
- */
-public class BuildArtifactFieldsElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomainFields(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        AqlFieldEnum[] fields = AqlFieldEnum.getFieldByDomain(artifacts);
-        for (AqlFieldEnum field1 : fields) {
-            list.add(new RealFieldElement(field1.signature, artifacts));
-        }
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(items.signatue), dot, itemFields));
-        list.add(forward(new InternalNameElement(modules.signatue), dot, buildModuleFields));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return artifacts;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildArtifactStarElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildArtifactStarElement.java
deleted file mode 100644
index 0d4f825..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildArtifactStarElement.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.*;
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class BuildArtifactStarElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(items.signatue), dot, itemStar));
-        list.add(forward(new InternalNameElement(modules.signatue), dot, buildModuleStar));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return artifacts;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildArtifactValuesElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildArtifactValuesElement.java
deleted file mode 100644
index 1e27eb6..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildArtifactValuesElement.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.*;
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class BuildArtifactValuesElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(items.signatue), dot, itemValues));
-        list.add(forward(new InternalNameElement(modules.signatue), dot, buildModuleValues));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return artifacts;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildDependenciesDomainsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildDependenciesDomainsElement.java
deleted file mode 100644
index 2c9dd0d..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildDependenciesDomainsElement.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.*;
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class BuildDependenciesDomainsElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomainFields(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        list.add(new IncludeDomainElement(dependencies));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(items.signatue),
-                fork(new EmptyIncludeDomainElement(items), forward(dot, itemDomains))));
-        list.add(forward(new InternalNameElement(modules.signatue),
-                fork(new EmptyIncludeDomainElement(modules), forward(dot, buildModuleDomains))));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return dependencies;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildDependenciesFieldsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildDependenciesFieldsElement.java
deleted file mode 100644
index 6c07160..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildDependenciesFieldsElement.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.*;
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- *         Acepts the dependencies fields and its sub domain
- */
-public class BuildDependenciesFieldsElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomainFields(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        AqlFieldEnum[] fields = AqlFieldEnum.getFieldByDomain(dependencies);
-        for (AqlFieldEnum field1 : fields) {
-            list.add(new RealFieldElement(field1.signature, dependencies));
-        }
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(items.signatue), dot, itemFields));
-        list.add(forward(new InternalNameElement(modules.signatue), dot, buildModuleFields));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return dependencies;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildDependenciesStarElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildDependenciesStarElement.java
deleted file mode 100644
index f01a29e..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildDependenciesStarElement.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.*;
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class BuildDependenciesStarElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(items.signatue), dot, itemStar));
-        list.add(forward(new InternalNameElement(modules.signatue), dot, buildModuleStar));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return dependencies;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildDependenciesValuesElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildDependenciesValuesElement.java
deleted file mode 100644
index 72e3352..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildDependenciesValuesElement.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.*;
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class BuildDependenciesValuesElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(items.signatue), dot, itemValues));
-        list.add(forward(new InternalNameElement(modules.signatue), dot, buildModuleValues));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return dependencies;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildDomainsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildDomainsElement.java
deleted file mode 100644
index a785dba..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildDomainsElement.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.*;
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class BuildDomainsElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomains(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomains(List<ParserElement> list) {
-        list.add(new IncludeDomainElement(builds));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(buildProperties.signatue),
-                fork(new EmptyIncludeDomainElement(buildProperties), forward(dot, buildPropertiesDomains))));
-        list.add(forward(new InternalNameElement(modules.signatue),
-                fork(new EmptyIncludeDomainElement(modules), forward(dot, buildModuleDomains))));
-        list.add(forward(new InternalNameElement(buildPromotions.signatue),
-                fork(new EmptyIncludeDomainElement(buildPromotions), forward(dot, buildPromotionsDomains))));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return builds;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildFieldsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildFieldsElement.java
deleted file mode 100644
index 8fef6c3..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildFieldsElement.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.*;
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- *         Acepts the builds fields and its sub domain
- */
-public class BuildFieldsElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomainFields(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        AqlFieldEnum[] fields = AqlFieldEnum.getFieldByDomain(builds);
-        for (AqlFieldEnum field1 : fields) {
-            list.add(new RealFieldElement(field1.signature, builds));
-        }
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(buildProperties.signatue), dot, buildPropertiesFields));
-        list.add(forward(new InternalNameElement(buildPromotions.signatue), dot, buildPromotionsFields));
-        list.add(forward(new InternalNameElement(modules.signatue), dot, buildModuleFields));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return builds;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildModuleDomainsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildModuleDomainsElement.java
deleted file mode 100644
index 0e6dd10..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildModuleDomainsElement.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.*;
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class BuildModuleDomainsElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomainFields(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        list.add(new IncludeDomainElement(modules));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(builds.signatue),
-                fork(new EmptyIncludeDomainElement(builds), forward(dot, buildDomains))));
-        list.add(forward(new InternalNameElement(artifacts.signatue),
-                fork(new EmptyIncludeDomainElement(artifacts), forward(dot, buildArtifactDomains))));
-        list.add(forward(new InternalNameElement(dependencies.signatue),
-                fork(new EmptyIncludeDomainElement(dependencies), forward(dot, buildDependenciesDomains))));
-        list.add(forward(new InternalNameElement(moduleProperties.signatue),
-                fork(new EmptyIncludeDomainElement(moduleProperties), forward(dot, buildModulePropertiesDomains))));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return modules;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildModuleFieldsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildModuleFieldsElement.java
deleted file mode 100644
index 09c9f76..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildModuleFieldsElement.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.*;
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- *         Acepts the modules fields and its sub domain
- */
-public class BuildModuleFieldsElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomainFields(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        AqlFieldEnum[] fields = AqlFieldEnum.getFieldByDomain(modules);
-        for (AqlFieldEnum field1 : fields) {
-            list.add(new RealFieldElement(field1.signature, modules));
-        }
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(builds.signatue), dot, buildFields));
-        list.add(forward(new InternalNameElement(artifacts.signatue), dot, buildArtifactFields));
-        list.add(forward(new InternalNameElement(dependencies.signatue), dot, buildDependenciesFields));
-        list.add(forward(new InternalNameElement(moduleProperties.signatue), dot, buildModulePropertiesFields));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return modules;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildModulePropertyDomainsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildModulePropertyDomainsElement.java
deleted file mode 100644
index 424eb38..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildModulePropertyDomainsElement.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.*;
-import static org.artifactory.storage.db.aql.parser.AqlParser.buildModuleDomains;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-
-/**
- * @author Gidi Shabat
- */
-public class BuildModulePropertyDomainsElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomainFields(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        list.add(new IncludeDomainElement(moduleProperties));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(modules.signatue),
-                fork(new EmptyIncludeDomainElement(modules), forward(dot, buildModuleDomains))));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return moduleProperties;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildModulePropertyFieldsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildModulePropertyFieldsElement.java
deleted file mode 100644
index 83138b1..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildModulePropertyFieldsElement.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.*;
-import static org.artifactory.storage.db.aql.parser.AqlParser.buildModuleFields;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-
-/**
- * @author Gidi Shabat
- */
-public class BuildModulePropertyFieldsElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomainFields(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        AqlFieldEnum[] fields = AqlFieldEnum.getFieldByDomain(moduleProperties);
-        for (AqlFieldEnum field : fields) {
-            list.add(new RealFieldElement(field.signature, moduleProperties));
-        }
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(modules.signatue), dot, buildModuleFields));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return moduleProperties;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildModulePropertyStarElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildModulePropertyStarElement.java
deleted file mode 100644
index e6ddde7..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildModulePropertyStarElement.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.AqlParser;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.moduleProperties;
-import static org.artifactory.aql.model.AqlDomainEnum.modules;
-import static org.artifactory.storage.db.aql.parser.AqlParser.buildModuleStar;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-
-/**
- * @author Gidi Shabat
- */
-public class BuildModulePropertyStarElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomainFields(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        list.add(AqlParser.star);
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(modules.signatue), dot, buildModuleStar));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return moduleProperties;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildModulePropertyValuesElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildModulePropertyValuesElement.java
deleted file mode 100644
index 1ab3784..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildModulePropertyValuesElement.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.AqlParser;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.moduleProperties;
-import static org.artifactory.aql.model.AqlDomainEnum.modules;
-import static org.artifactory.storage.db.aql.parser.AqlParser.buildModuleValues;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-
-/**
- * @author Gidi Shabat
- */
-public class BuildModulePropertyValuesElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomainFields(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        list.add(AqlParser.value);
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(modules.signatue), dot, buildModuleValues));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return moduleProperties;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildModuleStarElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildModuleStarElement.java
deleted file mode 100644
index 0e09917..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildModuleStarElement.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalSignElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.*;
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class BuildModuleStarElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(builds.signatue), dot, buildStar));
-        list.add(forward(new InternalNameElement(artifacts.signatue), dot, buildArtifactStar));
-        list.add(forward(new InternalNameElement(dependencies.signatue), dot, buildDependenciesStar));
-        list.add(forward(new InternalSignElement("@"), buildModulePropertiesStar));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return modules;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildModuleValuesElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildModuleValuesElement.java
deleted file mode 100644
index 05c2c06..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildModuleValuesElement.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalSignElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.*;
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class BuildModuleValuesElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(builds.signatue), dot, buildValues));
-        list.add(forward(new InternalNameElement(artifacts.signatue), dot, buildArtifactValues));
-        list.add(forward(new InternalNameElement(dependencies.signatue), dot, buildDependenciesValues));
-        list.add(forward(new InternalSignElement("@"), buildModulePropertiesValues));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return modules;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildPromotionsDomainsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildPromotionsDomainsElement.java
deleted file mode 100644
index e352c0f..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildPromotionsDomainsElement.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.builds;
-import static org.artifactory.aql.model.AqlDomainEnum.buildPromotions;
-import static org.artifactory.storage.db.aql.parser.AqlParser.buildDomains;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-
-/**
- * @author gidis
- */
-public class BuildPromotionsDomainsElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomainFields(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        list.add(new IncludeDomainElement(buildPromotions));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(builds.signatue),
-                fork(new EmptyIncludeDomainElement(builds), forward(dot, buildDomains))));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return buildPromotions;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildPromotionsFieldsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildPromotionsFieldsElement.java
deleted file mode 100644
index 3c875df..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildPromotionsFieldsElement.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.builds;
-import static org.artifactory.aql.model.AqlDomainEnum.buildPromotions;
-import static org.artifactory.storage.db.aql.parser.AqlParser.buildFields;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-
-/**
- * @author gidis
- */
-public class BuildPromotionsFieldsElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomainFields(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        AqlFieldEnum[] fields = AqlFieldEnum.getFieldByDomain(buildPromotions);
-        for (AqlFieldEnum field : fields) {
-            list.add(new RealFieldElement(field.signature, buildPromotions));
-        }
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(builds.signatue), dot, buildFields));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return AqlDomainEnum.buildPromotions;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildPromotionsStarElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildPromotionsStarElement.java
deleted file mode 100644
index 36cbaad..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildPromotionsStarElement.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.AqlParser;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.builds;
-import static org.artifactory.storage.db.aql.parser.AqlParser.buildStar;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-
-/**
- * @author gidis
- */
-public class BuildPromotionsStarElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomainFields(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        list.add(AqlParser.star);
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(builds.signatue), dot, buildStar));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return AqlDomainEnum.buildPromotions;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildPromotionsValuesElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildPromotionsValuesElement.java
deleted file mode 100644
index ab88b85..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildPromotionsValuesElement.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.AqlParser;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.builds;
-import static org.artifactory.storage.db.aql.parser.AqlParser.buildValues;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-
-/**
- * @author gidis
- */
-public class BuildPromotionsValuesElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomainFields(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        list.add(AqlParser.value);
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(builds.signatue), dot, buildValues));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return AqlDomainEnum.buildPromotions;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildPropertyDomainsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildPropertyDomainsElement.java
deleted file mode 100644
index 48820be..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildPropertyDomainsElement.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.buildProperties;
-import static org.artifactory.aql.model.AqlDomainEnum.builds;
-import static org.artifactory.storage.db.aql.parser.AqlParser.buildDomains;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-
-/**
- * @author Gidi Shabat
- */
-public class BuildPropertyDomainsElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomainFields(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        list.add(new IncludeDomainElement(buildProperties));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(builds.signatue),
-                fork(new EmptyIncludeDomainElement(builds), forward(dot, buildDomains))));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return buildProperties;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildPropertyFieldsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildPropertyFieldsElement.java
deleted file mode 100644
index f318d78..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildPropertyFieldsElement.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.buildProperties;
-import static org.artifactory.aql.model.AqlDomainEnum.builds;
-import static org.artifactory.storage.db.aql.parser.AqlParser.buildFields;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-
-/**
- * @author Gidi Shabat
- *         Acepts the buildProperties fields and its sub domain
- */
-public class BuildPropertyFieldsElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomainFields(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        AqlFieldEnum[] fields = AqlFieldEnum.getFieldByDomain(buildProperties);
-        for (AqlFieldEnum field : fields) {
-            list.add(new RealFieldElement(field.signature, buildProperties));
-        }
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(builds.signatue), dot, buildFields));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return buildProperties;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildPropertyStarElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildPropertyStarElement.java
deleted file mode 100644
index 502d96a..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildPropertyStarElement.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.AqlParser;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalSignElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.buildProperties;
-import static org.artifactory.aql.model.AqlDomainEnum.builds;
-import static org.artifactory.storage.db.aql.parser.AqlParser.buildStar;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-
-/**
- * @author Gidi Shabat
- */
-public class BuildPropertyStarElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomainFields(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        list.add(AqlParser.star);
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(builds.signatue), dot, buildStar));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return buildProperties;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildPropertyValuesElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildPropertyValuesElement.java
deleted file mode 100644
index 9bdeb9d..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildPropertyValuesElement.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.AqlParser;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalSignElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.buildProperties;
-import static org.artifactory.aql.model.AqlDomainEnum.builds;
-import static org.artifactory.storage.db.aql.parser.AqlParser.buildValues;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-
-/**
- * @author Gidi Shabat
- */
-public class BuildPropertyValuesElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomainFields(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        list.add(AqlParser.value);
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(builds.signatue), dot, buildValues));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return buildProperties;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildStarElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildStarElement.java
deleted file mode 100644
index affa7df..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildStarElement.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalSignElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.*;
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class BuildStarElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(modules.signatue), dot, buildModuleStar));
-        list.add(forward(new InternalNameElement(buildPromotions.signatue), dot, buildPromotionsStar));
-        list.add(forward(new InternalSignElement("@"), buildPropertiesStar));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return builds;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildValuesElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildValuesElement.java
deleted file mode 100644
index 9ad51b7..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/BuildValuesElement.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalSignElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.*;
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class BuildValuesElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(modules.signatue), dot, buildModuleValues));
-        list.add(forward(new InternalNameElement(buildPromotions.signatue), dot, buildPromotionsValues));
-        list.add(forward(new InternalSignElement("@"), buildPropertiesValues));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return builds;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/CloseBracketsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/CloseBracketsElement.java
deleted file mode 100644
index 83f9288..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/CloseBracketsElement.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalSignElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class CloseBracketsElement extends LazyParserElement {
-    @Override
-    protected ParserElement init() {
-        return new InternalSignElement(")");
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/CloseCurlyBracketsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/CloseCurlyBracketsElement.java
deleted file mode 100644
index a532fa2..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/CloseCurlyBracketsElement.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalSignElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class CloseCurlyBracketsElement extends LazyParserElement {
-    @Override
-    protected ParserElement init() {
-        return new InternalSignElement("}");
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/CloseParenthesisElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/CloseParenthesisElement.java
deleted file mode 100644
index 1dbfe83..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/CloseParenthesisElement.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalSignElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class CloseParenthesisElement extends LazyParserElement {
-    @Override
-    protected ParserElement init() {
-        return new InternalSignElement("]");
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ColonElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ColonElement.java
deleted file mode 100644
index 6689916..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ColonElement.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalSignElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class ColonElement extends LazyParserElement {
-    @Override
-    protected ParserElement init() {
-        return new InternalSignElement(":");
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/CommaElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/CommaElement.java
deleted file mode 100644
index 9f0ead0..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/CommaElement.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalSignElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class CommaElement extends LazyParserElement {
-    @Override
-    protected ParserElement init() {
-        return new InternalSignElement(",");
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ComparatorElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ComparatorElement.java
deleted file mode 100644
index 7a5aa5b..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ComparatorElement.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlComparatorEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class ComparatorElement extends LazyParserElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> result = Lists.newArrayList();
-        AqlComparatorEnum[] values = AqlComparatorEnum.values();
-        for (AqlComparatorEnum value : values) {
-            result.add(forward(new InternalNameElement(value.signature, true)));
-        }
-        ParserElement[] array = new ParserElement[result.size()];
-        return fork(result.toArray(array));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/DomainProviderElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/DomainProviderElement.java
deleted file mode 100644
index 52d5eab..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/DomainProviderElement.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.aql.model.AqlDomainEnum;
-
-/**
- * @author Gidi Shabat
- */
-public interface DomainProviderElement {
-    AqlDomainEnum getDomain();
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/DomainSubPathElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/DomainSubPathElement.java
deleted file mode 100644
index d8abdc5..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/DomainSubPathElement.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class DomainSubPathElement extends LazyParserElement {
-    private String domainSubPhat;
-
-    public DomainSubPathElement(String domainSubPhat) {
-        this.domainSubPhat = domainSubPhat;
-    }
-
-    @Override
-    protected ParserElement init() {
-        return new InternalNameElement(domainSubPhat);
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/DotElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/DotElement.java
deleted file mode 100644
index 0eb3607..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/DotElement.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalSignElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class DotElement extends LazyParserElement {
-    @Override
-    protected ParserElement init() {
-        return new InternalSignElement(".");
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/EmptyIncludeDomainElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/EmptyIncludeDomainElement.java
deleted file mode 100644
index db98aa4..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/EmptyIncludeDomainElement.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import static org.artifactory.storage.db.aql.parser.AqlParser.empty;
-
-/**
- * @author Gidi Shabat
- */
-public class EmptyIncludeDomainElement extends LazyParserElement implements DomainProviderElement {
-    // The Field domain represent the domain that contains the field
-    // Example the fieldDomain of "repo" is "item" but the fieldDomain of name might be "item","archive","artifact"...
-    // Please note that the fieldDomain is not the query domain which is declared in the beginning of the query
-    private AqlDomainEnum domain;
-
-    public EmptyIncludeDomainElement(AqlDomainEnum domain) {
-        this.domain = domain;
-    }
-
-    @Override
-    protected ParserElement init() {
-        return empty;
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return domain;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/FieldElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/FieldElement.java
deleted file mode 100644
index 2fdb541..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/FieldElement.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalFieldElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class FieldElement extends LazyParserElement {
-    @Override
-    protected ParserElement init() {
-        return forward(new InternalFieldElement());
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/IncludeDomainElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/IncludeDomainElement.java
deleted file mode 100644
index 7a4c3aa..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/IncludeDomainElement.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalSignElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class IncludeDomainElement extends LazyParserElement implements DomainProviderElement {
-    // The Field domain represent the domain that contains the field
-    // Example the fieldDomain of "repo" is "item" but the fieldDomain of name might be "item","archive","artifact"...
-    // Please note that the fieldDomain is not the query domain which is declared in the beginning of the query
-    private AqlDomainEnum domain;
-
-    public IncludeDomainElement(AqlDomainEnum domain) {
-        this.domain = domain;
-    }
-
-    @Override
-    protected ParserElement init() {
-        return new InternalSignElement("*");
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return domain;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/IncludeTypeElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/IncludeTypeElement.java
deleted file mode 100644
index 5aa91fd..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/IncludeTypeElement.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class IncludeTypeElement extends LazyParserElement {
-    private String name;
-
-    public IncludeTypeElement(String name) {
-        this.name = name;
-    }
-
-    @Override
-    protected ParserElement init() {
-        return forward(new InternalNameElement(name));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ItemDomainsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ItemDomainsElement.java
deleted file mode 100644
index 88ae44b..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ItemDomainsElement.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.*;
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class ItemDomainsElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomainFields(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        list.add(new IncludeDomainElement(items));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(archives.signatue),
-                fork(new EmptyIncludeDomainElement(archives), forward(dot, archiveDomains))));
-        list.add(forward(new InternalNameElement(artifacts.signatue),
-                fork(new EmptyIncludeDomainElement(artifacts), forward(dot, buildArtifactDomains))));
-        list.add(forward(new InternalNameElement(dependencies.signatue),
-                fork(new EmptyIncludeDomainElement(dependencies), forward(dot, buildDependenciesDomains))));
-        list.add(forward(new InternalNameElement(statistics.signatue),
-                fork(new EmptyIncludeDomainElement(statistics), forward(dot, statisticsDomains))));
-        list.add(forward(new InternalNameElement(properties.signatue),
-                fork(new EmptyIncludeDomainElement(properties), forward(dot, propertiesDomains))));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return items;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ItemFieldsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ItemFieldsElement.java
deleted file mode 100644
index 2cd5d7f..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ItemFieldsElement.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.*;
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- *         Acepts the items fields and its sub domain
- */
-public class ItemFieldsElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomainFields(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        AqlFieldEnum[] fields = AqlFieldEnum.getFieldByDomain(items);
-        for (AqlFieldEnum field1 : fields) {
-            list.add(new RealFieldElement(field1.signature, items));
-        }
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(archives.signatue), dot, archiveFields));
-        list.add(forward(new InternalNameElement(artifacts.signatue), dot, buildArtifactFields));
-        list.add(forward(new InternalNameElement(dependencies.signatue), dot, buildDependenciesFields));
-        list.add(forward(new InternalNameElement(statistics.signatue), dot, statisticsFields));
-        list.add(forward(new InternalNameElement(properties.signatue), dot, propertiesFields));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return items;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ItemStarElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ItemStarElement.java
deleted file mode 100644
index 2fab078..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ItemStarElement.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalSignElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.*;
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class ItemStarElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(archives.signatue), dot, archiveStar));
-        list.add(forward(new InternalNameElement(artifacts.signatue), dot, buildArtifactStar));
-        list.add(forward(new InternalNameElement(dependencies.signatue), dot, buildDependenciesStar));
-        list.add(forward(new InternalNameElement(statistics.signatue), dot, statisticsStar));
-        list.add(forward(new InternalSignElement("@"), propertiesStar));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return items;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ItemValuesElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ItemValuesElement.java
deleted file mode 100644
index 5eae83e..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ItemValuesElement.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalSignElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.*;
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class ItemValuesElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(archives.signatue), dot, archiveValues));
-        list.add(forward(new InternalNameElement(artifacts.signatue), dot, buildArtifactValues));
-        list.add(forward(new InternalNameElement(dependencies.signatue), dot, buildDependenciesValues));
-        list.add(forward(new InternalNameElement(statistics.signatue), dot, statisticsValues));
-        list.add(forward(new InternalSignElement("@"), propertiesValues));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return items;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/LimitElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/LimitElement.java
deleted file mode 100644
index 25b9e2b..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/LimitElement.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class LimitElement extends LazyParserElement {
-    @Override
-    protected ParserElement init() {
-        return forward(new InternalNameElement("limit"), openBrackets, limitValue, closeBrackets);
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return false;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/LimitValueElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/LimitValueElement.java
deleted file mode 100644
index b85993a..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/LimitValueElement.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNumberElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class LimitValueElement extends LazyParserElement {
-    @Override
-    protected ParserElement init() {
-        return forward(new InternalNumberElement());
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/NullElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/NullElement.java
deleted file mode 100644
index 87ed01b..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/NullElement.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class NullElement extends LazyParserElement {
-    @Override
-    protected ParserElement init() {
-        return fork(new InternalNameElement("null"), new InternalNameElement("NULL"));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/NumberElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/NumberElement.java
deleted file mode 100644
index b0319f5..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/NumberElement.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNumberElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class NumberElement extends LazyParserElement {
-    @Override
-    protected ParserElement init() {
-        return new InternalNumberElement();
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/OffsetElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/OffsetElement.java
deleted file mode 100644
index 3d09039..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/OffsetElement.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class OffsetElement extends LazyParserElement {
-    @Override
-    protected ParserElement init() {
-        return forward(new InternalNameElement("offset"), openBrackets, offsetValue, closeBrackets);
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return false;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/OffsetValueElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/OffsetValueElement.java
deleted file mode 100644
index 7cc51bc..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/OffsetValueElement.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNumberElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class OffsetValueElement extends LazyParserElement {
-    @Override
-    protected ParserElement init() {
-        return forward(new InternalNumberElement());
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/OpenBracketsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/OpenBracketsElement.java
deleted file mode 100644
index b892692..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/OpenBracketsElement.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalSignElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class OpenBracketsElement extends LazyParserElement {
-    @Override
-    protected ParserElement init() {
-        return new InternalSignElement("(");
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/OpenCurlyBracketsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/OpenCurlyBracketsElement.java
deleted file mode 100644
index e08d1ac..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/OpenCurlyBracketsElement.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalSignElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class OpenCurlyBracketsElement extends LazyParserElement {
-    @Override
-    protected ParserElement init() {
-        return new InternalSignElement("{");
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/OpenParenthesisElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/OpenParenthesisElement.java
deleted file mode 100644
index 3239646..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/OpenParenthesisElement.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalSignElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class OpenParenthesisElement extends LazyParserElement {
-    @Override
-    protected ParserElement init() {
-        return new InternalSignElement("[");
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/PropertyDomainsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/PropertyDomainsElement.java
deleted file mode 100644
index b987838..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/PropertyDomainsElement.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.items;
-import static org.artifactory.aql.model.AqlDomainEnum.properties;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-import static org.artifactory.storage.db.aql.parser.AqlParser.itemDomains;
-
-/**
- * @author Gidi Shabat
- */
-public class PropertyDomainsElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomainFields(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        list.add(new IncludeDomainElement(properties));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(items.signatue),
-                fork(new EmptyIncludeDomainElement(items), forward(dot, itemDomains))));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return properties;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/PropertyFieldsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/PropertyFieldsElement.java
deleted file mode 100644
index fbf24e2..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/PropertyFieldsElement.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.items;
-import static org.artifactory.aql.model.AqlDomainEnum.properties;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-import static org.artifactory.storage.db.aql.parser.AqlParser.itemFields;
-
-/**
- * @author Gidi Shabat
- *         Acepts the properties fields and its sub domain
- */
-public class PropertyFieldsElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomainFields(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        AqlFieldEnum[] fields = AqlFieldEnum.getFieldByDomain(AqlDomainEnum.properties);
-        for (AqlFieldEnum field : fields) {
-            list.add(new RealFieldElement(field.signature, properties));
-        }
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(items.signatue), dot, itemFields));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return properties;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/PropertyStarElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/PropertyStarElement.java
deleted file mode 100644
index 8bbb48b..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/PropertyStarElement.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.AqlParser;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.items;
-import static org.artifactory.aql.model.AqlDomainEnum.properties;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-import static org.artifactory.storage.db.aql.parser.AqlParser.itemStar;
-
-/**
- * @author Gidi Shabat
- */
-public class PropertyStarElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithSubDomains(list);
-        fillWithDomainFields(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        list.add(AqlParser.star);
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(items.signatue), dot, itemStar));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return properties;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/PropertyValuesElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/PropertyValuesElement.java
deleted file mode 100644
index 343c3cc..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/PropertyValuesElement.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.AqlParser;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.items;
-import static org.artifactory.aql.model.AqlDomainEnum.properties;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-import static org.artifactory.storage.db.aql.parser.AqlParser.itemValues;
-
-/**
- * @author Gidi Shabat
- */
-public class PropertyValuesElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithSubDomains(list);
-        fillWithDomainFields(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        list.add(AqlParser.value);
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(items.signatue), dot, itemValues));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return properties;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/QuotedComparator.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/QuotedComparator.java
deleted file mode 100644
index 0b0a504..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/QuotedComparator.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import static org.artifactory.storage.db.aql.parser.AqlParser.comparator;
-import static org.artifactory.storage.db.aql.parser.AqlParser.quotes;
-
-/**
- * @author Gidi Shabat
- */
-public class QuotedComparator extends LazyParserElement {
-    @Override
-    protected ParserElement init() {
-        return forward(quotes, comparator, quotes);
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/QuotedRelativeDateComparator.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/QuotedRelativeDateComparator.java
deleted file mode 100644
index ac6680b..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/QuotedRelativeDateComparator.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import static org.artifactory.storage.db.aql.parser.AqlParser.quotes;
-import static org.artifactory.storage.db.aql.parser.AqlParser.relativeDateComparator;
-
-/**
- * @author gidis
- */
-public class QuotedRelativeDateComparator extends LazyParserElement {
-    @Override
-    protected ParserElement init() {
-        return forward(quotes, relativeDateComparator, quotes);
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/QuotesElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/QuotesElement.java
deleted file mode 100644
index ae4c78c..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/QuotesElement.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalSignElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class QuotesElement extends LazyParserElement {
-    @Override
-    protected ParserElement init() {
-        return new InternalSignElement("\"");
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/RealFieldElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/RealFieldElement.java
deleted file mode 100644
index 6f7a4ed..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/RealFieldElement.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class RealFieldElement extends LazyParserElement implements DomainProviderElement {
-    private String signature;
-    // The Field domain represent the domain that contains the field
-    // Example the fieldDomain of "repo" is "item" but the fieldDomain of name might be "item","archive","artifact"...
-    // Please note that the fieldDomain is not the query domain which is declared in the beginning of the query
-    private AqlDomainEnum fieldDomain;
-
-    public RealFieldElement(String signature, AqlDomainEnum domain) {
-        this.signature = signature;
-        this.fieldDomain = domain;
-    }
-
-    @Override
-    protected ParserElement init() {
-        return new InternalNameElement(signature);
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return fieldDomain;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/RelativeDateComparatorElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/RelativeDateComparatorElement.java
deleted file mode 100644
index d194883..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/RelativeDateComparatorElement.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlRelativeDateComparatorEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-/**
- * @author gidis
- */
-public class RelativeDateComparatorElement extends LazyParserElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> result = Lists.newArrayList();
-        AqlRelativeDateComparatorEnum[] values = AqlRelativeDateComparatorEnum.values();
-        for (AqlRelativeDateComparatorEnum value : values) {
-            result.add(forward(new InternalNameElement(value.signature, true)));
-        }
-        ParserElement[] array = new ParserElement[result.size()];
-        return fork(result.toArray(array));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/RootElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/RootElement.java
deleted file mode 100644
index 712a2c0..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/RootElement.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive.DomainElement;
-import org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive.ParserElementsProvider;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import static org.artifactory.aql.model.AqlDomainEnum.*;
-
-
-/**
- * Represent the AQL Language structure
- *
- * @author Gidi Shabat
- */
-public class RootElement extends LazyParserElement {
-
-    @Override
-    protected ParserElement init() {
-        ParserElementsProvider provider = new ParserElementsProvider();
-        return fork(
-                provider.provide(DomainElement.class, items),
-                provider.provide(DomainElement.class, archives),
-                provider.provide(DomainElement.class, entries),
-                provider.provide(DomainElement.class, properties),
-                provider.provide(DomainElement.class, statistics),
-                provider.provide(DomainElement.class, artifacts),
-                provider.provide(DomainElement.class, dependencies),
-                provider.provide(DomainElement.class, modules),
-                provider.provide(DomainElement.class, moduleProperties),
-                provider.provide(DomainElement.class, buildProperties),
-                provider.provide(DomainElement.class, buildPromotions),
-                provider.provide(DomainElement.class, builds));
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/SectionEndElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/SectionEndElement.java
deleted file mode 100644
index 50eacbd..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/SectionEndElement.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalEmptyElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class SectionEndElement extends LazyParserElement {
-
-
-    @Override
-    protected ParserElement init() {
-        return new InternalEmptyElement();
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/SortTypeElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/SortTypeElement.java
deleted file mode 100644
index 2113b9d..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/SortTypeElement.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.aql.model.AqlSortTypeEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class SortTypeElement extends LazyParserElement {
-    @Override
-    protected ParserElement init() {
-        AqlSortTypeEnum[] values = AqlSortTypeEnum.values();
-        ParserElement[] parserElements = new ParserElement[values.length];
-        for (int i = 0; i < parserElements.length; i++) {
-            parserElements[i] = new InternalNameElement(values[i].getAqlName(), true);
-        }
-        return fork(parserElements);
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/StarElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/StarElement.java
deleted file mode 100644
index f53ad85..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/StarElement.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalSignElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class StarElement extends LazyParserElement {
-    @Override
-    protected ParserElement init() {
-        return new InternalSignElement("*");
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/StatisticsDomainsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/StatisticsDomainsElement.java
deleted file mode 100644
index 6497d21..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/StatisticsDomainsElement.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.items;
-import static org.artifactory.aql.model.AqlDomainEnum.statistics;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-import static org.artifactory.storage.db.aql.parser.AqlParser.itemDomains;
-
-/**
- * @author Gidi Shabat
- */
-public class StatisticsDomainsElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomain(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomain(List<ParserElement> list) {
-        list.add(new IncludeDomainElement(statistics));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(new InternalNameElement(items.signatue),
-                fork(new EmptyIncludeDomainElement(items), forward(dot, itemDomains))));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return statistics;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/StatisticsFieldsElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/StatisticsFieldsElement.java
deleted file mode 100644
index 291bfc5..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/StatisticsFieldsElement.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.items;
-import static org.artifactory.aql.model.AqlDomainEnum.statistics;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-import static org.artifactory.storage.db.aql.parser.AqlParser.itemFields;
-
-/**
- * @author Gidi Shabat
- *         Acepts the statistics fields and its sub domain
- */
-public class StatisticsFieldsElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithDomainFields(list);
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithDomainFields(List<ParserElement> list) {
-        AqlFieldEnum[] fields = AqlFieldEnum.getFieldByDomain(AqlDomainEnum.statistics);
-        for (AqlFieldEnum field : fields) {
-            list.add(new RealFieldElement(field.signature, statistics));
-        }
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(forward(new InternalNameElement(items.signatue), dot, itemFields)));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return statistics;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/StatisticsStarElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/StatisticsStarElement.java
deleted file mode 100644
index a3ab6b4..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/StatisticsStarElement.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.items;
-import static org.artifactory.aql.model.AqlDomainEnum.statistics;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-import static org.artifactory.storage.db.aql.parser.AqlParser.itemStar;
-
-/**
- * @author Gidi Shabat
- */
-public class StatisticsStarElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(forward(new InternalNameElement(items.signatue), dot, itemStar)));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return statistics;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/StatisticsValuesElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/StatisticsValuesElement.java
deleted file mode 100644
index 1e7140f..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/StatisticsValuesElement.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlDomainEnum.items;
-import static org.artifactory.aql.model.AqlDomainEnum.statistics;
-import static org.artifactory.storage.db.aql.parser.AqlParser.dot;
-import static org.artifactory.storage.db.aql.parser.AqlParser.itemValues;
-
-/**
- * @author Gidi Shabat
- */
-public class StatisticsValuesElement extends LazyParserElement implements DomainProviderElement {
-    @Override
-    protected ParserElement init() {
-        List<ParserElement> list = Lists.newArrayList();
-        fillWithSubDomains(list);
-        return fork(list.toArray(new ParserElement[list.size()]));
-    }
-
-    private void fillWithSubDomains(List<ParserElement> list) {
-        list.add(forward(forward(new InternalNameElement(items.signatue), dot, itemValues)));
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return statistics;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ValueElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ValueElement.java
deleted file mode 100644
index 518e3df..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ValueElement.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalValueElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class ValueElement extends LazyParserElement {
-    @Override
-    protected ParserElement init() {
-        return new InternalValueElement();
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ValueNumberNullElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ValueNumberNullElement.java
deleted file mode 100644
index 68c5f5d..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/basic/language/ValueNumberNullElement.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.basic.language;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class ValueNumberNullElement extends LazyParserElement {
-    @Override
-    protected ParserElement init() {
-        return fork(forward(quotes, value, quotes), number, nullElement);
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/CriteriaDefaultPropertyElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/CriteriaDefaultPropertyElement.java
deleted file mode 100644
index ae968cc..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/CriteriaDefaultPropertyElement.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class CriteriaDefaultPropertyElement extends DomainSensitiveParserElement {
-    @Override
-    protected ParserElement init() {
-        return forward(quotes, provide(DynamicValue.class), quotes, colon, openCurlyBrackets, quotedComparator,
-                colon, valueOrNumberOrNull, closedCurlyBrackets);
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/CriteriaEqualsKeyPropertyElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/CriteriaEqualsKeyPropertyElement.java
deleted file mode 100644
index e0b7e34..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/CriteriaEqualsKeyPropertyElement.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class CriteriaEqualsKeyPropertyElement extends DomainSensitiveParserElement {
-
-    @Override
-    protected ParserElement init() {
-        return forward(quotes, provide(DynamicValue.class), quotes, colon, quotes, star, quotes);
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/CriteriaEqualsPropertyElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/CriteriaEqualsPropertyElement.java
deleted file mode 100644
index 8aab05c..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/CriteriaEqualsPropertyElement.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class CriteriaEqualsPropertyElement extends DomainSensitiveParserElement {
-
-    @Override
-    protected ParserElement init() {
-        return forward(quotes, provide(DynamicValue.class), quotes, colon, quotes, value, quotes);
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/CriteriaEqualsValuePropertyElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/CriteriaEqualsValuePropertyElement.java
deleted file mode 100644
index 3e0f2d3..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/CriteriaEqualsValuePropertyElement.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class CriteriaEqualsValuePropertyElement extends DomainSensitiveParserElement {
-
-    @Override
-    protected ParserElement init() {
-        return forward(quotes, provide(DynamicStar.class), quotes, colon, quotes, value, quotes);
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/CriteriaKeyPropertyElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/CriteriaKeyPropertyElement.java
deleted file mode 100644
index a2854be..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/CriteriaKeyPropertyElement.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class CriteriaKeyPropertyElement extends DomainSensitiveParserElement {
-    @Override
-    protected ParserElement init() {
-        return forward(quotes, provide(DynamicValue.class), quotes, colon, openCurlyBrackets, quotedComparator,
-                colon, quotes, star, quotes, closedCurlyBrackets);
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/CriteriaRelativeDateElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/CriteriaRelativeDateElement.java
deleted file mode 100644
index 0fcf105..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/CriteriaRelativeDateElement.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author gidis
- */
-public class CriteriaRelativeDateElement extends DomainSensitiveParserElement {
-    @Override
-    protected ParserElement init() {
-        return forward(quotes, provide(DynamicField.class), quotes, colon, openCurlyBrackets, quotedRelativeDateComparator,
-                colon, quotes,value,quotes, closedCurlyBrackets);
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/CriteriaValuePropertyElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/CriteriaValuePropertyElement.java
deleted file mode 100644
index 2b9a690..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/CriteriaValuePropertyElement.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class CriteriaValuePropertyElement extends DomainSensitiveParserElement {
-    @Override
-    protected ParserElement init() {
-        return forward(quotes, provide(DynamicStar.class), quotes, colon, openCurlyBrackets, quotedComparator,
-                colon, valueOrNumberOrNull, closedCurlyBrackets);
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/DefaultCriteriaElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/DefaultCriteriaElement.java
deleted file mode 100644
index ab2804f..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/DefaultCriteriaElement.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class DefaultCriteriaElement extends DomainSensitiveParserElement {
-
-    @Override
-    protected ParserElement init() {
-        return forward(quotes, provide(DynamicField.class), quotes, colon, openCurlyBrackets, quotedComparator, colon,
-                valueOrNumberOrNull, closedCurlyBrackets);
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/DomainElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/DomainElement.java
deleted file mode 100644
index 0223c34..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/DomainElement.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.high.level.basic.language.DomainSubPathElement;
-import org.artifactory.storage.db.aql.parser.elements.high.level.basic.language.SectionEndElement;
-
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class DomainElement extends DomainSensitiveParserElement {
-
-    @Override
-    protected ParserElement init() {
-        ParserElement tail = forward(
-                fork(empty, forward(dot, provide(FindElement.class), new SectionEndElement())),
-                fork(empty, forward(dot, provide(IncludeExtensionElement.class), new SectionEndElement())),
-                fork(empty, forward(dot, provide(SortExtensionElement.class), new SectionEndElement())),
-                fork(empty, forward(dot, offset), new SectionEndElement()),
-                fork(empty, forward(dot, limit), new SectionEndElement()));
-        return createDomainParserElement(domain, tail);
-    }
-
-    private ParserElement createDomainParserElement(AqlDomainEnum value, ParserElement tail) {
-        String[] domainSubPaths = value.subDomains;
-        ParserElement[] domainNameElement = new ParserElement[domainSubPaths.length * 2];
-        for (int j = 0; j < domainSubPaths.length; j++) {
-            ParserElement parserElement = new DomainSubPathElement(domainSubPaths[j]);
-            domainNameElement[j * 2] = parserElement;
-            domainNameElement[j * 2 + 1] = dot;
-        }
-        domainNameElement[domainNameElement.length - 1] = tail;
-        return forward(domainNameElement);
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/DomainSensitiveParserElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/DomainSensitiveParserElement.java
deleted file mode 100644
index c1ec23c..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/DomainSensitiveParserElement.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.parser.elements.low.level.LazyParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public abstract class DomainSensitiveParserElement extends LazyParserElement {
-    private ParserElementsProvider provider;
-    protected AqlDomainEnum domain;
-
-    protected <T extends DomainSensitiveParserElement> T provide(Class<T> elementClass) {
-        return provider.provide(elementClass, domain);
-    }
-
-    public void setDomain(AqlDomainEnum domain) {
-        this.domain = domain;
-    }
-
-    public void setProvider(ParserElementsProvider provider) {
-        this.provider = provider;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/DynamicDomain.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/DynamicDomain.java
deleted file mode 100644
index d3c16e4..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/DynamicDomain.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.storage.db.aql.parser.AqlParser;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class DynamicDomain extends DomainSensitiveParserElement {
-
-    @Override
-    protected ParserElement init() {
-        switch (domain) {
-            case items: {
-                return AqlParser.itemDomains;
-            }
-            case archives: {
-                return AqlParser.archiveDomains;
-            }
-            case entries: {
-                return AqlParser.entriesDomains;
-            }
-            case properties: {
-                return AqlParser.propertiesDomains;
-            }
-            case statistics: {
-                return AqlParser.statisticsDomains;
-            }
-            case artifacts: {
-                return AqlParser.buildArtifactDomains;
-            }
-            case dependencies: {
-                return AqlParser.buildDependenciesDomains;
-            }
-            case builds: {
-                return AqlParser.buildDomains;
-            }
-            case modules: {
-                return AqlParser.buildModuleDomains;
-            }
-            case moduleProperties: {
-                return AqlParser.buildModulePropertiesDomains;
-            }
-            case buildPromotions: {
-                return AqlParser.buildPromotionsDomains;
-            }
-            case buildProperties: {
-                return AqlParser.buildPropertiesDomains;
-            }
-        }
-        throw new UnsupportedOperationException("Unsupported domain :" + domain);
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/DynamicField.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/DynamicField.java
deleted file mode 100644
index 1212e63..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/DynamicField.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.storage.db.aql.parser.AqlParser;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class DynamicField extends DomainSensitiveParserElement {
-
-    @Override
-    protected ParserElement init() {
-        switch (domain) {
-            case items: {
-                return AqlParser.itemFields;
-            }
-            case archives: {
-                return AqlParser.archiveFields;
-            }
-            case entries: {
-                return AqlParser.entriesFields;
-            }
-            case properties: {
-                return AqlParser.propertiesFields;
-            }
-            case statistics: {
-                return AqlParser.statisticsFields;
-            }
-            case artifacts: {
-                return AqlParser.buildArtifactFields;
-            }
-            case dependencies: {
-                return AqlParser.buildDependenciesFields;
-            }
-            case builds: {
-                return AqlParser.buildFields;
-            }
-            case modules: {
-                return AqlParser.buildModuleFields;
-            }
-            case moduleProperties: {
-                return AqlParser.buildModulePropertiesFields;
-            }
-            case buildProperties: {
-                return AqlParser.buildPropertiesFields;
-            }case buildPromotions: {
-                return AqlParser.buildPromotionsFields;
-            }
-        }
-        throw new UnsupportedOperationException("Unsupported domain :" + domain);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/DynamicFieldTrail.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/DynamicFieldTrail.java
deleted file mode 100644
index 68100f2..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/DynamicFieldTrail.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class DynamicFieldTrail extends DomainSensitiveParserElement {
-
-    @Override
-    protected ParserElement init() {
-        return fork(empty,
-                forward(comma, quotes, provide(DynamicField.class), quotes, provide(DynamicFieldTrail.class)));
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/DynamicStar.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/DynamicStar.java
deleted file mode 100644
index 74bf4d0..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/DynamicStar.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.storage.db.aql.parser.AqlParser;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class DynamicStar extends DomainSensitiveParserElement {
-
-    @Override
-    protected ParserElement init() {
-        switch (domain) {
-            case items: {
-                return AqlParser.itemStar;
-            }
-            case archives: {
-                return AqlParser.archiveStar;
-            }
-            case entries: {
-                return AqlParser.entriesStar;
-            }
-            case properties: {
-                return AqlParser.propertiesStar;
-            }
-            case statistics: {
-                return AqlParser.statisticsStar;
-            }
-            case artifacts: {
-                return AqlParser.buildArtifactStar;
-            }
-            case dependencies: {
-                return AqlParser.buildDependenciesStar;
-            }
-            case builds: {
-                return AqlParser.buildStar;
-            }
-            case modules: {
-                return AqlParser.buildModuleStar;
-            }
-            case moduleProperties: {
-                return AqlParser.buildModulePropertiesStar;
-            }
-            case buildPromotions: {
-                return AqlParser.buildPromotionsStar;
-            }
-            case buildProperties: {
-                return AqlParser.buildPropertiesStar;
-            }
-        }
-        throw new UnsupportedOperationException("Unsupported domain :" + domain);
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/DynamicValue.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/DynamicValue.java
deleted file mode 100644
index 205feda..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/DynamicValue.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.storage.db.aql.parser.AqlParser;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class DynamicValue extends DomainSensitiveParserElement {
-
-    @Override
-    protected ParserElement init() {
-        switch (domain) {
-            case items: {
-                return AqlParser.itemValues;
-            }
-            case archives: {
-                return AqlParser.archiveValues;
-            }
-            case entries: {
-                return AqlParser.entriesValues;
-            }
-            case properties: {
-                return AqlParser.propertiesValues;
-            }
-            case statistics: {
-                return AqlParser.statisticsValues;
-            }
-            case artifacts: {
-                return AqlParser.buildArtifactValues;
-            }
-            case dependencies: {
-                return AqlParser.buildDependenciesValues;
-            }
-            case builds: {
-                return AqlParser.buildValues;
-            }
-            case modules: {
-                return AqlParser.buildModuleValues;
-            }
-            case moduleProperties: {
-                return AqlParser.buildModulePropertiesValues;
-            }
-            case buildPromotions: {
-                return AqlParser.buildPromotionsValues;
-            }
-            case buildProperties: {
-                return AqlParser.buildPropertiesValues;
-            }
-        }
-        throw new UnsupportedOperationException("Unsupported domain :" + domain);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/EqualsCriteriaElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/EqualsCriteriaElement.java
deleted file mode 100644
index 9a13463..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/EqualsCriteriaElement.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class EqualsCriteriaElement extends DomainSensitiveParserElement {
-
-    @Override
-    protected ParserElement init() {
-        return forward(quotes, provide(DynamicField.class), quotes, colon, valueOrNumberOrNull);
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/FilterComplexElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/FilterComplexElement.java
deleted file mode 100644
index 413c75d..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/FilterComplexElement.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-
-import static org.artifactory.storage.db.aql.parser.AqlParser.closedCurlyBrackets;
-import static org.artifactory.storage.db.aql.parser.AqlParser.openCurlyBrackets;
-
-/**
- * @author Gidi Shabat
- */
-public class FilterComplexElement extends DomainSensitiveParserElement {
-
-    @Override
-    protected ParserElement init() {
-        FilterTailElement filterTail = provide(FilterTailElement.class);
-        FilterElement filter = provide(FilterElement.class);
-        return fork(forward(openCurlyBrackets, fork(forward(filter, filterTail)), closedCurlyBrackets));
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/FilterComplexTailElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/FilterComplexTailElement.java
deleted file mode 100644
index 764302f..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/FilterComplexTailElement.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-
-import static org.artifactory.storage.db.aql.parser.AqlParser.comma;
-import static org.artifactory.storage.db.aql.parser.AqlParser.empty;
-
-/**
- * @author Gidi Shabat
- */
-public class FilterComplexTailElement extends DomainSensitiveParserElement {
-    @Override
-    protected ParserElement init() {
-        return fork(empty,
-                forward(comma, provide(FilterComplexElement.class), provide(FilterComplexTailElement.class)));
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/FilterElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/FilterElement.java
deleted file mode 100644
index bd832a2..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/FilterElement.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class FilterElement extends DomainSensitiveParserElement {
-
-    @Override
-    protected ParserElement init() {
-        return fork(provide(CriteriaEqualsKeyPropertyElement.class), provide(CriteriaEqualsValuePropertyElement.class),
-                provide(CriteriaKeyPropertyElement.class), provide(CriteriaValuePropertyElement.class),
-                provide(EqualsCriteriaElement.class), provide(DefaultCriteriaElement.class),
-                provide(CriteriaEqualsPropertyElement.class), provide(CriteriaDefaultPropertyElement.class),
-                provide(CriteriaRelativeDateElement.class),provide(FunctionExtensionElement.class));
-    }
-
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/FilterTailElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/FilterTailElement.java
deleted file mode 100644
index 52b5d7d..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/FilterTailElement.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-
-import static org.artifactory.storage.db.aql.parser.AqlParser.comma;
-import static org.artifactory.storage.db.aql.parser.AqlParser.empty;
-
-/**
- * @author Gidi Shabat
- */
-public class FilterTailElement extends DomainSensitiveParserElement {
-    @Override
-    protected ParserElement init() {
-        return fork(empty, forward(comma, provide(FilterElement.class), provide(FilterTailElement.class)));
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/FindElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/FindElement.java
deleted file mode 100644
index 990b254..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/FindElement.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.ForkParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class FindElement extends DomainSensitiveParserElement {
-    @Override
-    protected ParserElement init() {
-        FilterComplexElement filterComplexElement = provide(FilterComplexElement.class);
-        FilterComplexTailElement complexTailElement = provide(FilterComplexTailElement.class);
-        ForkParserElement filter = fork(empty, forward(filterComplexElement, complexTailElement));
-        return forward(new InternalNameElement("find"), openBrackets, filter, closeBrackets);
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/FunctionElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/FunctionElement.java
deleted file mode 100644
index b68a9a3..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/FunctionElement.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.aql.model.AqlOperatorEnum;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-
-/**
- * @author Gidi Shabat
- */
-public class FunctionElement extends DomainSensitiveParserElement {
-    @Override
-    protected ParserElement init() {
-        AqlOperatorEnum[] values = AqlOperatorEnum.values();
-        ParserElement[] parserElements = new ParserElement[values.length];
-        for (int i = 0; i < parserElements.length; i++) {
-            parserElements[i] = forward(new InternalNameElement(values[i].signature));
-        }
-        return fork(parserElements);
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/FunctionExtensionElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/FunctionExtensionElement.java
deleted file mode 100644
index 1014e17..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/FunctionExtensionElement.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class FunctionExtensionElement extends DomainSensitiveParserElement {
-
-    @Override
-    protected ParserElement init() {
-        FilterComplexTailElement filterComplexTail = provide(FilterComplexTailElement.class);
-        FilterComplexElement filterComplex = provide(FilterComplexElement.class);
-        return forward(quotes, provide(FunctionElement.class), quotes, colon, openParenthesis,
-                fork(filterComplex, forward(filterComplex, filterComplexTail)), closeParenthesis);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/IncludeExtensionElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/IncludeExtensionElement.java
deleted file mode 100644
index 1642cfa..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/IncludeExtensionElement.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-
-import static org.artifactory.storage.db.aql.parser.AqlParser.closeBrackets;
-import static org.artifactory.storage.db.aql.parser.AqlParser.openBrackets;
-
-/**
- * @author Gidi Shabat
- */
-public class IncludeExtensionElement extends DomainSensitiveParserElement {
-    @Override
-    protected ParserElement init() {
-        IncludeField includeField = provide(IncludeField.class);
-        IncludeFieldTrail includeFieldTrail = provide(IncludeFieldTrail.class);
-        ParserElement includeFields = forward(includeField,includeFieldTrail);
-        return forward(new InternalNameElement("include"), openBrackets, includeFields, closeBrackets);
-    }
-
-    @Override
-    public boolean isVisibleInResult() {
-        return true;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/IncludeField.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/IncludeField.java
deleted file mode 100644
index b9a5733..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/IncludeField.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.storage.db.aql.parser.AqlParser;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class IncludeField extends DomainSensitiveParserElement {
-
-    @Override
-    protected ParserElement init() {
-        DynamicField dynamicField = provide(DynamicField.class);
-        DynamicDomain dynamicDomain = provide(DynamicDomain.class);
-        DynamicValue dynamicValue = provide(DynamicValue.class);
-        return forward(AqlParser.quotes, fork(dynamicField, dynamicDomain, dynamicValue), AqlParser.quotes);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/IncludeFieldTrail.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/IncludeFieldTrail.java
deleted file mode 100644
index b3e2537..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/IncludeFieldTrail.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.storage.db.aql.parser.AqlParser;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-
-/**
- * @author Gidi Shabat
- */
-public class IncludeFieldTrail extends DomainSensitiveParserElement {
-
-    @Override
-    protected ParserElement init() {
-        return fork(AqlParser.empty, forward(AqlParser.comma, provide(IncludeField.class), this));
-    }
-
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/ParserElementsProvider.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/ParserElementsProvider.java
deleted file mode 100644
index 6e51481..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/ParserElementsProvider.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.aql.AqlParserException;
-import org.artifactory.aql.model.AqlDomainEnum;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author Gidi Shabat
- */
-public class ParserElementsProvider {
-    private Map<AqlDomainEnum, Map<Class, DomainSensitiveParserElement>> domainMap = new HashMap<>();
-
-    public <T extends DomainSensitiveParserElement> T provide(Class<T> elementClass, AqlDomainEnum domain) {
-        try {
-            Map<Class, DomainSensitiveParserElement> map = domainMap.get(domain);
-            if (map == null) {
-                map = new HashMap<>();
-                domainMap.put(domain, map);
-            }
-            T parserElement = (T) map.get(elementClass);
-            if (parserElement == null) {
-
-                parserElement = elementClass.newInstance();
-
-                parserElement.setDomain(domain);
-                parserElement.setProvider(this);
-                map.put(elementClass, parserElement);
-            }
-            return parserElement;
-        } catch (Exception e) {
-            throw new AqlParserException("Fail to init the parser", e);
-        }
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/SortExtensionElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/SortExtensionElement.java
deleted file mode 100644
index 8b329a4..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/high/level/domain/sensitive/SortExtensionElement.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalNameElement;
-
-import static org.artifactory.storage.db.aql.parser.AqlParser.*;
-
-/**
- * @author Gidi Shabat
- */
-public class SortExtensionElement extends DomainSensitiveParserElement {
-
-    @Override
-    protected ParserElement init() {
-        DynamicField dynamicField = provide(DynamicField.class);
-        DynamicFieldTrail dynamicFieldTrail = provide(DynamicFieldTrail.class);
-        ParserElement json = forward(quotes, sortType, quotes, colon, openParenthesis,
-                forward(quotes, dynamicField, quotes, dynamicFieldTrail), closeParenthesis);
-        return forward(new InternalNameElement("sort"), openBrackets, openCurlyBrackets, json, closedCurlyBrackets,
-                closeBrackets);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/ForkParserElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/ForkParserElement.java
deleted file mode 100644
index e7ec2df..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/ForkParserElement.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.low.level;
-
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.storage.db.aql.parser.AqlParserContext;
-import org.artifactory.storage.db.aql.parser.ParserElementResultContainer;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class ForkParserElement implements ParserElement {
-
-    private final List<ParserElement> elements = Lists.newArrayList();
-
-    public ForkParserElement(ParserElement... elements) {
-        Collections.addAll(this.elements, elements);
-    }
-
-    @Override
-    public void initialize() {
-        for (ParserElement element : elements) {
-            element.initialize();
-        }
-    }
-
-    @Override
-    public List<String> next() {
-        List<String> list = Lists.newArrayList();
-        for (ParserElement element : elements) {
-            List<String> next = element.next();
-            if (next.size() > 0) {
-                list.addAll(next);
-            }
-        }
-        return list;
-    }
-
-    @Override
-    public ParserElementResultContainer[] peelOff(String queryRemainder, AqlParserContext context) {
-        List<ParserElementResultContainer> results = Lists.newArrayList();
-        for (ParserElement element : elements) {
-            ParserElementResultContainer[] parserResults = element.peelOff(queryRemainder, context);
-            for (ParserElementResultContainer parserResult : parserResults) {
-                if (StringUtils.isBlank(parserResult.getQueryRemainder())) {
-                    return new ParserElementResultContainer[]{parserResult};
-                } else {
-                    results.add(parserResult);
-                }
-            }
-        }
-        if (results.isEmpty()) {
-            return new ParserElementResultContainer[0];
-        } else {
-            return results.toArray(new ParserElementResultContainer[results.size()]);
-        }
-    }
-
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/ForwardElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/ForwardElement.java
deleted file mode 100644
index 6ba156e..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/ForwardElement.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.low.level;
-
-import com.google.common.collect.Lists;
-import org.artifactory.storage.db.aql.parser.AqlParserContext;
-import org.artifactory.storage.db.aql.parser.ParserElementResultContainer;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.util.Pair;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Represents an ordered list of sub elements that must appear in the query string in the same order.
- *
- * @author Gidi Shabat
- */
-public class ForwardElement implements ParserElement {
-    private List<ParserElement> elements = Lists.newArrayList();
-
-    public ForwardElement(ParserElement... elements) {
-        Collections.addAll(this.elements, elements);
-    }
-
-    @Override
-    public void initialize() {
-        for (ParserElement element : elements) {
-            element.initialize();
-        }
-    }
-
-    @Override
-    public List<String> next() {
-        List<String> list = Lists.newArrayList();
-        for (ParserElement element : elements) {
-            List<String> next = element.next();
-            if (next.size() > 0) {
-                list.addAll(next);
-                return list;
-            }
-        }
-        return list;
-    }
-
-    @Override
-    public ParserElementResultContainer[] peelOff(String queryRemainder, AqlParserContext context) {
-        List<ParserElement> tempElements = Lists.newArrayList(elements);
-        ParserElementResultContainer[] results = peelOffRecursive(tempElements, new ParserElementResultContainer(
-                queryRemainder, ""), context);
-        return results;
-    }
-
-    private ParserElementResultContainer[] peelOffRecursive(List<ParserElement> elements,
-            ParserElementResultContainer query,
-            AqlParserContext context) {
-        ParserElement element = elements.remove(0);
-        // In order to support next letter prediction we should collect elements that successfully reached to the end of string
-        if (query.getQueryRemainder().isEmpty()) {
-            context.addElement(element);
-        }
-        ParserElementResultContainer[] results = element.peelOff(query.getQueryRemainder(), context);
-        if (results.length > 0) {
-            if (elements.size() == 0) {
-                return results;
-            }
-            List<ParserElementResultContainer> tempQueries = Lists.newArrayList();
-            for (ParserElementResultContainer tempQuery : results) {
-                ArrayList<ParserElement> tempElements = Lists.newArrayList(elements);
-                ParserElementResultContainer[] internalResults = peelOffRecursive(tempElements, tempQuery, context);
-                for (ParserElementResultContainer internalResult : internalResults) {
-                    for (Pair<ParserElement, String> pair : tempQuery.getAll()) {
-                        ParserElement parserElement = pair.getFirst();
-                        String value = pair.getSecond();
-                        //if (parserElement.isAddable()) {
-                        internalResult.add(parserElement, value);
-                        //}
-                    }
-                }
-                Collections.addAll(tempQueries, internalResults);
-            }
-            return tempQueries.toArray(new ParserElementResultContainer[tempQueries.size()]);
-        } else {
-            return results;
-        }
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/InternalEmptyElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/InternalEmptyElement.java
deleted file mode 100644
index f0c777a..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/InternalEmptyElement.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.low.level;
-
-
-import com.google.common.collect.Lists;
-import org.artifactory.storage.db.aql.parser.AqlParserContext;
-import org.artifactory.storage.db.aql.parser.ParserElementResultContainer;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class InternalEmptyElement extends InternalParserElement {
-
-    @Override
-    public ParserElementResultContainer[] peelOff(String queryRemainder, AqlParserContext context) {
-        context.update(queryRemainder);
-        return new ParserElementResultContainer[]{new ParserElementResultContainer(queryRemainder, "")};
-    }
-
-    @Override
-    public List<String> next() {
-        return Lists.newArrayList("<empty>");
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/InternalFieldElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/InternalFieldElement.java
deleted file mode 100644
index aeaf8d8..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/InternalFieldElement.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.low.level;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.aql.AqlFieldResolver;
-import org.artifactory.aql.model.AqlComparatorEnum;
-import org.artifactory.aql.model.AqlField;
-import org.artifactory.aql.model.AqlOperatorEnum;
-import org.artifactory.storage.db.aql.parser.AqlParserContext;
-import org.artifactory.storage.db.aql.parser.ParserElementResultContainer;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class InternalFieldElement extends InternalParserElement {
-
-    @Override
-    public ParserElementResultContainer[] peelOff(String queryRemainder, AqlParserContext context) {
-        String string;
-        int index = StringUtils.indexOf(queryRemainder, "\"");
-        if (index >= 0) {
-            string = queryRemainder.substring(0, index);
-            if (AqlComparatorEnum.value(string) != null) {
-                return new ParserElementResultContainer[0];
-            }
-            if (AqlOperatorEnum.value(string) != null) {
-                return new ParserElementResultContainer[0];
-            }
-            if (!(AqlFieldResolver.resolve(string.toLowerCase()) instanceof AqlField)) {
-                return new ParserElementResultContainer[0];
-            }
-            String trim = StringUtils.replaceOnce(queryRemainder, string, "").trim();
-            context.update(trim);
-            return new ParserElementResultContainer[]{new ParserElementResultContainer(trim, string)};
-        } else {
-            return new ParserElementResultContainer[0];
-        }
-    }
-
-    @Override
-    public List<String> next() {
-        List<String> result = Lists.newArrayList();
-        AqlOperatorEnum[] values = AqlOperatorEnum.values();
-        for (AqlOperatorEnum value : values) {
-            result.add(value.signature);
-        }
-        return result;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/InternalNameElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/InternalNameElement.java
deleted file mode 100644
index 62f79df..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/InternalNameElement.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.low.level;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.storage.db.aql.parser.AqlParser;
-import org.artifactory.storage.db.aql.parser.AqlParserContext;
-import org.artifactory.storage.db.aql.parser.ParserElementResultContainer;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class InternalNameElement extends InternalParserElement {
-
-    private String name;
-    private boolean ignoreCase;
-
-    public InternalNameElement(String name) {
-        this.name = name;
-        this.ignoreCase = false;
-    }
-
-    public InternalNameElement(String name, boolean ignoreCase) {
-        this.name = name;
-        this.ignoreCase = ignoreCase;
-    }
-
-    @Override
-    public ParserElementResultContainer[] peelOff(String queryRemainder, AqlParserContext context) {
-        int min = Integer.MAX_VALUE;
-        String string = "";
-        for (String delimiter : AqlParser.DELIMITERS) {
-            int i = queryRemainder.indexOf(delimiter);
-            if (i >= 0 && i < min) {
-                min = i;
-                if (min == 0) {
-                    string = delimiter;
-                    break;
-                }
-            }
-        }
-        if (min == Integer.MAX_VALUE && StringUtils.isBlank(queryRemainder)) {
-            return new ParserElementResultContainer[0];
-        }
-        if (min != Integer.MAX_VALUE) {
-            if (min > 0) {
-                string = queryRemainder.substring(0, min).trim();
-            }
-
-        } else {
-            string = queryRemainder.trim();
-        }
-        String cleanName = ignoreCase ? name.toLowerCase() : name;
-        String cleanString = ignoreCase ? string.toLowerCase() : string;
-        if (cleanString.equals(cleanName)) {
-            String trim = StringUtils.replaceOnce(queryRemainder, string, "").trim();
-            context.update(trim);
-            return new ParserElementResultContainer[]{new ParserElementResultContainer(trim, string)};
-        } else {
-            return new ParserElementResultContainer[0];
-        }
-    }
-
-    @Override
-    public List<String> next() {
-        List<String> result = Lists.newArrayList();
-        if (ignoreCase) {
-            result.add(name);
-        } else {
-            result.add(name.toLowerCase());
-        }
-        return result;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/InternalNumberElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/InternalNumberElement.java
deleted file mode 100644
index dfbc071..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/InternalNumberElement.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.low.level;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.storage.db.aql.parser.AqlParser;
-import org.artifactory.storage.db.aql.parser.AqlParserContext;
-import org.artifactory.storage.db.aql.parser.ParserElementResultContainer;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class InternalNumberElement extends InternalParserElement {
-    @Override
-    public ParserElementResultContainer[] peelOff(String queryRemainder, AqlParserContext context) {
-        int min = Integer.MAX_VALUE;
-        String string;
-        // It is not string wrapped by semicolon therefore try to resolve string using delimiters
-        for (String delimiter : AqlParser.DELIMITERS) {
-            if (".".equals(delimiter)) {
-                continue;
-            }
-            int i = queryRemainder.indexOf(delimiter);
-            if (i >= 0 && i < min) {
-                min = i;
-            }
-        }
-        if ((min == Integer.MAX_VALUE && StringUtils.isBlank(queryRemainder)) || min == 0) {
-            return new ParserElementResultContainer[0];
-        }
-
-        if (min != Integer.MAX_VALUE) {
-            string = queryRemainder.substring(0, min).trim();
-
-        } else {
-            string = queryRemainder.trim();
-        }
-        for (String usedKey : AqlParser.USED_KEYS) {
-            if (string.equals(usedKey)) {
-                return new ParserElementResultContainer[0];
-            }
-        }
-        try {
-            // Just to make sure the number format is valid.
-            //noinspection ResultOfMethodCallIgnored
-            Double.parseDouble(string);
-        } catch (Exception e) {
-            return new ParserElementResultContainer[0];
-        }
-        String trim = StringUtils.replaceOnce(queryRemainder, string, "").trim();
-        context.update(trim);
-        return new ParserElementResultContainer[]{new ParserElementResultContainer(trim, string)};
-    }
-
-    @Override
-    public List<String> next() {
-        List<String> result = Lists.newArrayList();
-        result.add("<number>");
-        return result;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/InternalParserElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/InternalParserElement.java
deleted file mode 100644
index 282d28d..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/InternalParserElement.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.low.level;
-
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-
-/**
- * Base class for internal/framework elements
- *
- * @author Yossi Shaul
- */
-public abstract class InternalParserElement implements ParserElement {
-
-    /**
-     * Internal elements are the base leaf elements and does not require init.
-     */
-    @Override
-    public void initialize() {
-
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/InternalRelativeDate.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/InternalRelativeDate.java
deleted file mode 100644
index 0d466e0..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/InternalRelativeDate.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.low.level;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.storage.db.aql.parser.AqlParser;
-import org.artifactory.storage.db.aql.parser.AqlParserContext;
-import org.artifactory.storage.db.aql.parser.ParserElementResultContainer;
-import org.artifactory.storage.db.aql.parser.elements.low.level.InternalParserElement;
-
-import java.util.List;
-
-/**
- * @author gidis
- */
-public class InternalRelativeDate extends InternalParserElement {
-    @Override
-    public ParserElementResultContainer[] peelOff(String queryRemainder, AqlParserContext context) {
-        int min = Integer.MAX_VALUE;
-        String string;
-        // It is not string wrapped by semicolon therefore try to resolve string using delimiters
-        for (String delimiter : AqlParser.DELIMITERS) {
-            if (".".equals(delimiter)) {
-                continue;
-            }
-            int i = queryRemainder.indexOf(delimiter);
-            if (i >= 0 && i < min) {
-                min = i;
-            }
-        }
-        if ((min == Integer.MAX_VALUE && StringUtils.isBlank(queryRemainder)) || min == 0) {
-            return new ParserElementResultContainer[0];
-        }
-
-        if (min != Integer.MAX_VALUE) {
-            string = queryRemainder.substring(0, min).trim();
-
-        } else {
-            string = queryRemainder.trim();
-        }
-        for (String usedKey : AqlParser.USED_KEYS) {
-            if (string.equals(usedKey)) {
-                return new ParserElementResultContainer[0];
-            }
-        }
-        try {
-            // Just to make sure the number format is valid.
-            //noinspection ResultOfMethodCallIgnored
-            Double.parseDouble(string);
-        } catch (Exception e) {
-            return new ParserElementResultContainer[0];
-        }
-        String trim = StringUtils.replaceOnce(queryRemainder, string, "").trim();
-        context.update(trim);
-        return new ParserElementResultContainer[]{new ParserElementResultContainer(trim, string)};
-    }
-
-    @Override
-    public List<String> next() {
-        List<String> result = Lists.newArrayList();
-        result.add("<number>");
-        return result;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/InternalSignElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/InternalSignElement.java
deleted file mode 100644
index 0ca8893..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/InternalSignElement.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.low.level;
-
-import com.google.common.collect.Lists;
-import org.artifactory.storage.db.aql.parser.AqlParserContext;
-import org.artifactory.storage.db.aql.parser.ParserElementResultContainer;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class InternalSignElement extends InternalParserElement {
-    private String sign;
-
-    public InternalSignElement(String sign) {
-        this.sign = sign;
-    }
-
-    @Override
-    public ParserElementResultContainer[] peelOff(String queryRemainder, AqlParserContext context) {
-        if (queryRemainder.startsWith(sign)) {
-            String string;
-            if ("]".equals(sign) || "[".equals(sign) || ")".equals(sign) || "(".equals(sign)) {
-                string = queryRemainder.replaceFirst("\\" + sign, "").trim();
-            } else {
-                string = queryRemainder.replaceFirst("[" + sign + "]", "").trim();
-            }
-            context.update(string);
-            return new ParserElementResultContainer[]{new ParserElementResultContainer(string, sign)};
-        } else {
-            return new ParserElementResultContainer[0];
-        }
-    }
-
-    @Override
-    public List<String> next() {
-        List<String> result = Lists.newArrayList();
-        result.add(sign);
-        return result;
-    }
-}
-
-
-
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/InternalValueElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/InternalValueElement.java
deleted file mode 100644
index b8f7001..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/InternalValueElement.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.low.level;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.storage.db.aql.parser.AqlParserContext;
-import org.artifactory.storage.db.aql.parser.ParserElementResultContainer;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class InternalValueElement extends InternalParserElement {
-
-    @Override
-    public ParserElementResultContainer[] peelOff(String queryRemainder, AqlParserContext context) {
-        String string;
-        int index = StringUtils.indexOf(queryRemainder, "\"");
-        if (index >= 0) {
-            string = queryRemainder.substring(0, index);
-            String trim = StringUtils.replaceOnce(queryRemainder, string, "").trim();
-            context.update(trim);
-            return new ParserElementResultContainer[]{new ParserElementResultContainer(trim, string)};
-        } else {
-            return new ParserElementResultContainer[0];
-        }
-    }
-
-    @Override
-    public List<String> next() {
-        List<String> result = Lists.newArrayList();
-        result.add("<value>");
-        return result;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/LazyParserElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/LazyParserElement.java
deleted file mode 100644
index c85ea30..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/parser/elements/low/level/LazyParserElement.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.storage.db.aql.parser.elements.low.level;
-
-import org.artifactory.storage.db.aql.parser.AqlParserContext;
-import org.artifactory.storage.db.aql.parser.ParserElementResultContainer;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public abstract class LazyParserElement implements ParserElement {
-    private ParserElement element;
-
-    @Override
-    public ParserElementResultContainer[] peelOff(String queryRemainder, AqlParserContext context) {
-        ParserElementResultContainer[] possiblePaths = element.peelOff(queryRemainder, context);
-        if (isVisibleInResult()) {
-            for (ParserElementResultContainer path : possiblePaths) {
-                path.add(this, path.getElement());
-            }
-        }
-        return possiblePaths;
-    }
-
-    @Override
-    public void initialize() {
-        if (element == null) {
-            element = init();
-            element.initialize();
-        }
-    }
-
-    protected abstract ParserElement init();
-
-    public boolean isVisibleInResult() {
-        return false;
-    }
-
-    public ForkParserElement fork(ParserElement... elements) {
-        return new ForkParserElement(elements);
-    }
-
-    public ParserElement forward(ParserElement... elements) {
-        return new ForwardElement(elements);
-    }
-
-    public List<String> next() {
-        return element.next();
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/service/AqlPermissionProviderImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/service/AqlPermissionProviderImpl.java
deleted file mode 100644
index 164c010..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/service/AqlPermissionProviderImpl.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.artifactory.storage.db.aql.service;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.OssAddonsManager;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.aql.model.AqlPermissionProvider;
-import org.artifactory.repo.RepoPath;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlPermissionProviderImpl implements AqlPermissionProvider {
-
-    private AuthorizationService authorizationService;
-    private AddonsManager addonsManager;
-
-    public AuthorizationService getAuthorizationProvider() {
-        if (authorizationService == null) {
-            authorizationService = ContextHelper.get().getAuthorizationService();
-        }
-        return authorizationService;
-    }
-
-    public AddonsManager getAddonsManager() {
-        if (addonsManager == null) {
-            addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        }
-        return addonsManager;
-    }
-
-    @Override
-    public boolean canRead(RepoPath repoPath) {
-        return getAuthorizationProvider().canRead(repoPath);
-    }
-
-    @Override
-    public boolean isAdmin() {
-        return getAuthorizationProvider().isAdmin();
-    }
-
-    @Override
-    public boolean isOss() {
-        return getAddonsManager() instanceof OssAddonsManager;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/service/AqlQueryDecorator.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/service/AqlQueryDecorator.java
deleted file mode 100644
index ff16fb1..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/service/AqlQueryDecorator.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.artifactory.storage.db.aql.service;
-
-import org.artifactory.storage.db.aql.service.decorator.DecorationStrategy;
-import org.artifactory.storage.db.aql.sql.builder.query.aql.AqlQuery;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlQueryDecorator {
-
-    private DecorationStrategy[] strategies;
-
-    public AqlQueryDecorator(DecorationStrategy... strategies) {
-        this.strategies = strategies;
-    }
-
-    public void decorate(AqlQuery aqlQuery) {
-        for (DecorationStrategy strategy : strategies) {
-            strategy.decorate(aqlQuery);
-        }
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/service/AqlQueryOptimizer.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/service/AqlQueryOptimizer.java
deleted file mode 100644
index f7e9324..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/service/AqlQueryOptimizer.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.artifactory.storage.db.aql.service;
-
-import org.artifactory.storage.db.DbType;
-import org.artifactory.storage.db.aql.service.optimizer.FileTypeOptimization;
-import org.artifactory.storage.db.aql.service.optimizer.PropertyCriteriaRelatedWithOr;
-import org.artifactory.storage.db.aql.sql.builder.query.aql.AqlQuery;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlQueryOptimizer {
-    private QueryOptimizer optimizer;
-
-    public AqlQueryOptimizer(DbType dbType) {
-        // Since the optimisation in each database type is different we need to get the database type and accordingly init it relevant optimizations
-        optimizer = loadOptimizerForDatabase(dbType);
-    }
-
-    private QueryOptimizer loadOptimizerForDatabase(DbType dbType) {
-        switch (dbType) {
-            case DERBY: {
-                return new QueryOptimizer(
-                        new FileTypeOptimization(),
-                        new PropertyCriteriaRelatedWithOr()
-                );
-            }
-            case MYSQL: {
-                return new QueryOptimizer(
-                        new FileTypeOptimization(),
-                        new PropertyCriteriaRelatedWithOr()
-                );
-            }
-            case ORACLE: {
-                return new QueryOptimizer(
-                        new FileTypeOptimization(),
-                        new PropertyCriteriaRelatedWithOr()
-                );
-            }
-            case MSSQL: {
-                return new QueryOptimizer(
-                        new FileTypeOptimization(),
-                        new PropertyCriteriaRelatedWithOr()
-                );
-            }
-            case POSTGRESQL: {
-                return new QueryOptimizer(
-                        new FileTypeOptimization(),
-                        new PropertyCriteriaRelatedWithOr()
-                );
-            }
-        }
-        throw new RuntimeException("Unsupported database type" + dbType.name());
-    }
-
-
-    public void optimize(AqlQuery aqlQuery) {
-        optimizer.optimize(aqlQuery);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/service/AqlQueryValidator.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/service/AqlQueryValidator.java
deleted file mode 100644
index dbf6b16..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/service/AqlQueryValidator.java
+++ /dev/null
@@ -1,122 +0,0 @@
-package org.artifactory.storage.db.aql.service;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Lists;
-import org.artifactory.aql.AqlException;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.model.AqlPermissionProvider;
-import org.artifactory.aql.model.DomainSensitiveField;
-import org.artifactory.storage.db.aql.sql.builder.query.aql.AqlQuery;
-import org.artifactory.storage.db.aql.sql.builder.query.aql.AqlQueryElement;
-import org.artifactory.storage.db.aql.sql.builder.query.aql.Criteria;
-import org.artifactory.storage.db.aql.sql.builder.query.aql.SortDetails;
-import org.artifactory.storage.db.aql.sql.builder.query.sql.AqlToSqlQueryBuilderException;
-import org.artifactory.storage.db.aql.sql.builder.query.sql.SqlTable;
-import org.artifactory.storage.db.aql.sql.model.SqlTableEnum;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nullable;
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlFieldEnum.*;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlQueryValidator {
-    private static final Logger log = LoggerFactory.getLogger(AqlQueryValidator.class);
-
-    public void validate(AqlQuery aqlQuery, AqlPermissionProvider permissionProvider) {
-        // Assert that all the sort fields are unique
-        assertSortFieldsAreUnique(aqlQuery);
-        // Assert that all the sort fields exist in the result fields
-        assertSortFieldsInResult(aqlQuery);
-        // Assert that the result fields contains the repo, path and name fields for permissions needs
-        assertMinimalResultFields(aqlQuery, permissionProvider);
-        // Block property result filter for OSS
-        blockPropertyResultFilterForOSS(aqlQuery, permissionProvider);
-        // Block sorting for OSS
-        blockSortingForOSS(aqlQuery, permissionProvider);
-    }
-
-    private void assertMinimalResultFields(AqlQuery aqlQuery, AqlPermissionProvider permissionProvider) {
-        if (permissionProvider.isAdmin()) {
-            return;
-        }
-        if (!AqlDomainEnum.items.equals(aqlQuery.getDomain())) {
-            return;
-        }
-        List<AqlFieldEnum> resultFields = Lists.transform(aqlQuery.getResultFields(), toAqlFieldEnum);
-        List<AqlFieldEnum> minimalResultFields = Lists.newArrayList(itemRepo, itemPath, itemName);
-        for (AqlFieldEnum sortField : minimalResultFields) {
-            if (!resultFields.contains(sortField)) {
-                throw new AqlToSqlQueryBuilderException(
-                        "For permissions reasons AQL demands the following fields: repo, path and name.");
-            }
-        }
-    }
-
-    private void assertSortFieldsAreUnique(AqlQuery aqlQuery) {
-        // Assert that all the sort fields are unique
-        if (aqlQuery.getSort() != null && aqlQuery.getSort().getFields() != null) {
-            List<AqlFieldEnum> fields = aqlQuery.getSort().getFields();
-            if (fields.stream().distinct().count() != fields.size()) {
-                throw new AqlToSqlQueryBuilderException(
-                        "Duplicate fields, all the fields in the sort section should be unique.");
-            }
-        }
-    }
-
-    private void assertSortFieldsInResult(AqlQuery aqlQuery) {
-        List<AqlFieldEnum> resultFields = Lists.transform(aqlQuery.getResultFields(), toAqlFieldEnum);
-        if (aqlQuery.getSort() != null && aqlQuery.getSort().getFields() != null) {
-            List<AqlFieldEnum> sortFields = aqlQuery.getSort().getFields();
-            for (AqlFieldEnum sortField : sortFields) {
-                if (!resultFields.contains(sortField)) {
-                    throw new AqlToSqlQueryBuilderException(
-                            "Only the result fields are allowed to use in the sort section.");
-                }
-            }
-        }
-    }
-
-    private Function<DomainSensitiveField, AqlFieldEnum> toAqlFieldEnum = new Function<DomainSensitiveField, AqlFieldEnum>() {
-        @Nullable
-        @Override
-        public AqlFieldEnum apply(@Nullable DomainSensitiveField domainSensitiveField) {
-            if (domainSensitiveField != null) {
-                return domainSensitiveField.getField();
-            } else {
-                return null;
-            }
-        }
-    };
-
-    private void blockSortingForOSS(AqlQuery aqlQuery, AqlPermissionProvider permissionProvider) {
-        if (permissionProvider.isOss()) {
-            SortDetails sort = aqlQuery.getSort();
-            if (sort != null && sort.getFields() != null && sort.getFields().size() > 0) {
-                throw new AqlException("Sorting is not supported by AQL in the open source version\n");
-            }
-        }
-    }
-
-    private void blockPropertyResultFilterForOSS(AqlQuery aqlQuery, AqlPermissionProvider permissionProvider) {
-        if (permissionProvider.isOss()) {
-            List<AqlQueryElement> aqlElements = aqlQuery.getAqlElements();
-            for (AqlQueryElement aqlElement : aqlElements) {
-                if (aqlElement instanceof Criteria) {
-                    SqlTable table1 = ((Criteria) aqlElement).getTable1();
-                    if ((SqlTableEnum.node_props == table1.getTable() && table1.getId() < SqlTable.MINIMAL_DYNAMIC_TABLE_ID)||
-                            (SqlTableEnum.build_props== table1.getTable() && table1.getId() < SqlTable.MINIMAL_DYNAMIC_TABLE_ID)||
-                            (SqlTableEnum.module_props == table1.getTable() && table1.getId() < SqlTable.MINIMAL_DYNAMIC_TABLE_ID)) {
-                        throw new AqlException(
-                                "Filtering properties result is not supported by AQL in the open source version\n");
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/service/AqlServiceImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/service/AqlServiceImpl.java
deleted file mode 100644
index 73491e7..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/service/AqlServiceImpl.java
+++ /dev/null
@@ -1,160 +0,0 @@
-package org.artifactory.storage.db.aql.service;
-
-import org.artifactory.aql.AqlService;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.model.AqlPermissionProvider;
-import org.artifactory.aql.result.AqlEagerResult;
-import org.artifactory.aql.result.AqlLazyResult;
-import org.artifactory.aql.result.rows.AqlRowResult;
-import org.artifactory.storage.StorageProperties;
-import org.artifactory.storage.db.aql.dao.AqlDao;
-import org.artifactory.storage.db.aql.parser.AqlParser;
-import org.artifactory.storage.db.aql.parser.ParserElementResultContainer;
-import org.artifactory.storage.db.aql.service.decorator.DefaultSortDecorator;
-import org.artifactory.storage.db.aql.service.decorator.TrashcanDecorator;
-import org.artifactory.storage.db.aql.sql.builder.query.aql.AqlApiToAqlAdapter;
-import org.artifactory.storage.db.aql.sql.builder.query.aql.AqlQuery;
-import org.artifactory.storage.db.aql.sql.builder.query.aql.ParserToAqlAdapter;
-import org.artifactory.storage.db.aql.sql.builder.query.sql.SqlQuery;
-import org.artifactory.storage.db.aql.sql.builder.query.sql.SqlQueryBuilder;
-import org.artifactory.storage.db.aql.sql.result.AqlEagerResultImpl;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.PostConstruct;
-
-/**
- * Execute the Aql queries by processing the three Aql steps one after the other:
- * Step 1 Convert the AqlApi or the parser result into AqlQuery.
- * Step 2 Convert the AqlQuery into SqlQuery.
- * Step 3 Execute the SqlQuery and return the results.
- *
- * @author Gidi Shabat
- */
- at Service
-public class AqlServiceImpl implements AqlService {
-    private static final Logger log = LoggerFactory.getLogger(AqlServiceImpl.class);
-
-    @Autowired
-    private AqlDao aqlDao;
-    @Autowired
-    private StorageProperties storageProperties;
-
-    private AqlParser parser;
-    private ParserToAqlAdapter parserToAqlAdapter;
-    private AqlApiToAqlAdapter aqlApiToAqlAdapter;
-    private SqlQueryBuilder sqlQueryBuilder;
-    private AqlQueryOptimizer optimizer;
-    private AqlQueryValidator validator;
-    private AqlQueryDecorator externalDecorator; //Decorator used for user queries
-    private AqlQueryDecorator internalDecorator; //Decorator used for internal api queries
-    private AqlPermissionProvider permissionProvider=new AqlPermissionProviderImpl();
-
-    @PostConstruct
-    private void initDb(){
-        // The parser is constructed by many internal elements therefore we create it once and then reuse it.
-        // Please note that it doesn't really have state therefore we can use it simultaneously
-        // TODO init the parser eagerly here not lazy
-        parser = new AqlParser();
-        parserToAqlAdapter = new ParserToAqlAdapter();
-        sqlQueryBuilder = new SqlQueryBuilder();
-        aqlApiToAqlAdapter = new AqlApiToAqlAdapter();
-        optimizer = new AqlQueryOptimizer(storageProperties.getDbType());
-        validator = new AqlQueryValidator();
-        externalDecorator = new AqlQueryDecorator(new DefaultSortDecorator(), new TrashcanDecorator());
-        internalDecorator = new AqlQueryDecorator(new TrashcanDecorator());
-    }
-
-    /**
-     * Converts the Json query into SQL query and executes the query eagerly
-     */
-    @Override
-    public AqlEagerResult executeQueryEager(String query) {
-        log.debug("Processing textual AqlApi query: {}", query);
-        ParserElementResultContainer parserResult = parser.parse(query);
-        return executeQueryEager(parserResult);
-    }
-
-    /**
-     * Converts the Json query into SQL query and executes the query lazy
-     */
-    @Override
-    public AqlLazyResult executeQueryLazy(String query) {
-        log.debug("Processing textual AqlApi query: {}", query);
-        ParserElementResultContainer parserResult = parser.parse(query);
-        return executeQueryLazy(parserResult);
-    }
-
-    /**
-     * Converts the API's AqlApi query into SQL query and executes the query eagerly
-     */
-    @Override
-    public <T extends AqlRowResult> AqlEagerResult<T> executeQueryEager(AqlBase<? extends AqlBase, T> aql) {
-        log.debug("Processing API AqlApi query");
-        AqlQuery aqlQuery = aqlApiToAqlAdapter.toAqlModel(aql);
-        optimizer.optimize(aqlQuery);
-        internalDecorator.decorate(aqlQuery);
-        return (AqlEagerResultImpl<T>) getAqlQueryResult(aqlQuery);
-    }
-
-    @Override
-    public AqlLazyResult executeQueryLazy(AqlBase aql) {
-        log.debug("Processing API AqlApi query");
-        AqlQuery aqlQuery = aqlApiToAqlAdapter.toAqlModel(aql);
-        optimizer.optimize(aqlQuery);
-        internalDecorator.decorate(aqlQuery);
-        return getAqlQueryStreamResult(aqlQuery);
-    }
-
-    /**
-     * Converts the parser elements into AqlApi query, convert the AqlApi query to sql and executes the query eagerly
-     */
-    private AqlEagerResult executeQueryEager(ParserElementResultContainer parserResult) {
-        log.trace("Converting the parser result into AqlApi query");
-        AqlQuery aqlQuery = parserToAqlAdapter.toAqlModel(parserResult);
-        optimizer.optimize(aqlQuery);
-        validator.validate(aqlQuery,permissionProvider);
-        externalDecorator.decorate(aqlQuery);
-        log.trace("Successfully finished to convert the parser result into AqlApi query");
-        return getAqlQueryResult(aqlQuery);
-    }
-
-    /**
-     * Converts the parser elements into AqlApi query and executes the query lazy
-     */
-    private AqlLazyResult executeQueryLazy(ParserElementResultContainer parserResult) {
-        log.trace("Converting the parser result into AqlApi query");
-        AqlQuery aqlQuery = parserToAqlAdapter.toAqlModel(parserResult);
-        optimizer.optimize(aqlQuery);
-        validator.validate(aqlQuery,permissionProvider);
-        externalDecorator.decorate(aqlQuery);
-        log.trace("Successfully finished to convert the parser result into AqlApi query");
-        return getAqlQueryStreamResult(aqlQuery);
-    }
-
-    /**
-     * Converts the AqlApi query into SQL query and executes the query eagerly
-     */
-    private AqlEagerResult getAqlQueryResult(AqlQuery aqlQuery) {
-        log.trace("Converting the AqlApi query into SQL query: {}", aqlQuery);
-        SqlQuery sqlQuery = sqlQueryBuilder.buildQuery(aqlQuery);
-        log.trace("Successfully finished to convert the parser result into the following SQL query '{}'", sqlQuery);
-        log.trace("processing the following SQL query: {}", sqlQuery);
-        AqlEagerResultImpl aqlQueryResult = aqlDao.executeQueryEager(sqlQuery);
-        log.debug("Successfully finished to process SQL query with the following size: {}", aqlQueryResult.getSize());
-        return aqlQueryResult;
-    }
-
-    private AqlLazyResult getAqlQueryStreamResult(AqlQuery aqlQuery) {
-        log.trace("Converting the AqlApi query into SQL qury: {}", aqlQuery);
-        SqlQuery sqlQuery = sqlQueryBuilder.buildQuery(aqlQuery);
-        log.trace("Successfully finished to convert the parser result into the following SQL query '{}'", sqlQuery);
-        log.trace("processing the following SQL query: {}", sqlQuery);
-        AqlLazyResult aqlQueryStreamResult = aqlDao.executeQueryLazy(sqlQuery, permissionProvider);
-        log.debug("Successfully finished to process SQL query (lazy)");
-        return aqlQueryStreamResult;
-    }
-
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/service/QueryOptimizer.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/service/QueryOptimizer.java
deleted file mode 100644
index 95d7824..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/service/QueryOptimizer.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.storage.db.aql.service;
-
-import org.artifactory.storage.db.aql.service.optimizer.OptimizationStrategy;
-import org.artifactory.storage.db.aql.sql.builder.query.aql.AqlQuery;
-
-/**
- * @author Gidi Shabat
- */
-public class QueryOptimizer {
-    private OptimizationStrategy[] strategies;
-
-    public QueryOptimizer(OptimizationStrategy... strategies) {
-        this.strategies = strategies;
-    }
-
-    public void optimize(AqlQuery aqlQuery) {
-        for (OptimizationStrategy strategy : strategies) {
-            strategy.doJob(aqlQuery);
-        }
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/service/decorator/DecorationStrategy.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/service/decorator/DecorationStrategy.java
deleted file mode 100644
index 760b68e..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/service/decorator/DecorationStrategy.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.artifactory.storage.db.aql.service.decorator;
-
-import org.artifactory.storage.db.aql.sql.builder.query.aql.AqlQuery;
-
-/**
- * @author Shay Yaakov
- */
-public interface DecorationStrategy {
-
-    void decorate(AqlQuery aqlQuery);
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/service/decorator/DefaultSortDecorator.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/service/decorator/DefaultSortDecorator.java
deleted file mode 100644
index 7d5b502..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/service/decorator/DefaultSortDecorator.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package org.artifactory.storage.db.aql.service.decorator;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.model.AqlSortTypeEnum;
-import org.artifactory.aql.model.DomainSensitiveField;
-import org.artifactory.storage.db.aql.sql.builder.query.aql.AqlQuery;
-import org.artifactory.storage.db.aql.sql.builder.query.aql.SortDetails;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * @author Shay Yaakov
- */
-public class DefaultSortDecorator implements DecorationStrategy {
-
-    @Override
-    public void decorate(AqlQuery aqlQuery) {
-        useDefaultSortIfNeeded(aqlQuery);
-    }
-
-    private void useDefaultSortIfNeeded(AqlQuery aqlQuery) {
-        if (isMultiDomainResult(aqlQuery)) {
-            AqlDomainEnum mainDomain = aqlQuery.getDomain();
-            List<AqlFieldEnum> fieldEnums = resolveIdFieldFromDomain(aqlQuery);
-            SortDetails sort = new SortDetails();
-            sort.setSortType(AqlSortTypeEnum.asc);
-            Set<DomainSensitiveField> set = Sets.newHashSet(aqlQuery.getResultFields());
-            if (fieldEnums != null) {
-                for (AqlFieldEnum fieldEnum : fieldEnums) {
-                    if (!sort.getFields().contains(fieldEnum)) {
-                        sort.addField(fieldEnum);
-                    }
-                    boolean alreadyExist = false;
-                    for (DomainSensitiveField domainSensitiveField : set) {
-                        if (domainSensitiveField.getField() == fieldEnum) {
-                            alreadyExist = true;
-                        }
-                    }
-                    if (!alreadyExist) {
-                        set.add(new DomainSensitiveField(fieldEnum, Lists.newArrayList(mainDomain)));
-                    }
-                }
-            }
-            aqlQuery.setSort(sort);
-            aqlQuery.getResultFields().clear();
-            aqlQuery.getResultFields().addAll(set);
-        }
-    }
-
-    private boolean isMultiDomainResult(AqlQuery aqlQuery) {
-        List<DomainSensitiveField> resultFields = aqlQuery.getResultFields();
-        Set<String> set = Sets.newHashSet();
-        set.addAll(resultFields.stream().map(resultField -> resultField.getField().domainName).collect(
-                Collectors.toList()));
-        return set.size() > 1;
-    }
-
-    private List<AqlFieldEnum> resolveIdFieldFromDomain(AqlQuery aqlQuery) {
-        AqlDomainEnum domain = aqlQuery.getDomain();
-        switch (domain) {
-            case items:
-                return Lists.newArrayList(AqlFieldEnum.itemId);
-            case properties:
-                return Lists.newArrayList(AqlFieldEnum.propertyId);
-            case statistics:
-                return Lists.newArrayList(AqlFieldEnum.statId);
-            case artifacts:
-                return Lists.newArrayList(AqlFieldEnum.buildArtifactId);
-            case dependencies:
-                return Lists.newArrayList(AqlFieldEnum.buildDependencyId);
-            case modules:
-                return Lists.newArrayList(AqlFieldEnum.moduleId);
-            case moduleProperties:
-                return Lists.newArrayList(AqlFieldEnum.modulePropertyId);
-            case builds:
-                return Lists.newArrayList(AqlFieldEnum.buildId);
-            case buildProperties:
-                return Lists.newArrayList(AqlFieldEnum.buildPropertyId);
-            case buildPromotions:
-                return Lists.newArrayList(AqlFieldEnum.buildId);
-            case entries: {
-                // since archive represent two tables, in case of archive we might have two keys
-                ArrayList<AqlFieldEnum> result = Lists.newArrayList();
-                for (DomainSensitiveField field : aqlQuery.getResultFields()) {
-                    if (field.getField() == AqlFieldEnum.archiveEntryPath) {
-                        result.add(AqlFieldEnum.archiveEntryPathId);
-                    }
-                    if (field.getField() == AqlFieldEnum.archiveEntryName) {
-                        result.add(AqlFieldEnum.archiveEntryNameId);
-                    }
-                }
-                return result;
-            }
-            default:
-                return null;
-        }
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/service/decorator/TrashcanDecorator.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/service/decorator/TrashcanDecorator.java
deleted file mode 100644
index 7fe60ad..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/service/decorator/TrashcanDecorator.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package org.artifactory.storage.db.aql.service.decorator;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.AqlFieldResolver;
-import org.artifactory.aql.model.*;
-import org.artifactory.repo.trash.TrashService;
-import org.artifactory.storage.db.aql.sql.builder.links.TableLink;
-import org.artifactory.storage.db.aql.sql.builder.query.aql.*;
-import org.artifactory.storage.db.aql.sql.builder.query.sql.type.AqlTableGraph;
-import org.artifactory.storage.db.aql.sql.model.SqlTableEnum;
-
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlFieldEnum.itemRepo;
-
-/**
- * @author Shay Yaakov
- */
-public class TrashcanDecorator implements DecorationStrategy {
-
-    @Override
-    public void decorate(AqlQuery aqlQuery) {
-        filterTrashcanIfNeeded(aqlQuery);
-    }
-
-    private void filterTrashcanIfNeeded(AqlQuery aqlQuery) {
-        if (aqlQuery.getAqlElements().isEmpty()) {
-            return;
-        }
-
-        if (AqlDomainEnum.items.equals(aqlQuery.getDomain())) {
-            decorateItemsSearch(aqlQuery);
-        }else if (AqlDomainEnum.properties.equals(aqlQuery.getDomain())) {
-            decoratePropertiesSearch(aqlQuery);
-        }
-    }
-
-    private void decorateItemsSearch(AqlQuery aqlQuery) {
-        if (!repoEqualsFilterFound(aqlQuery)) {
-            // (query)AND(repo != "auto-trashcan")
-            AqlField itemRepo = AqlFieldResolver.resolve(AqlFieldEnum.itemRepo);
-            AqlVariable trashRepo = AqlFieldResolver.resolve(TrashService.TRASH_KEY, AqlVariableTypeEnum.string);
-            TableLink nodesTable = AqlTableGraph.tablesLinksMap.get(SqlTableEnum.nodes);
-            SimpleCriteria criteria = new SimpleCriteria(Lists.newArrayList(AqlDomainEnum.properties), itemRepo,
-                    nodesTable.getTable(), AqlComparatorEnum.notEquals.signature, trashRepo, nodesTable.getTable(),false);
-
-            List<AqlQueryElement> aqlElements = aqlQuery.getAqlElements();
-            aqlElements.add(0, AqlAdapter.open);
-            aqlElements.add(AqlAdapter.close);
-            aqlElements.add(AqlAdapter.and);
-            aqlElements.add(criteria);
-        }
-    }
-
-    private void decoratePropertiesSearch(AqlQuery aqlQuery) {
-        // (query)AND(trash.time not exists)
-        AqlField key = AqlFieldResolver.resolve(AqlFieldEnum.propertyKey);
-        AqlVariable trashTime = AqlFieldResolver.resolve(TrashService.PROP_TRASH_TIME, AqlVariableTypeEnum.string);
-        TableLink propsTable = AqlTableGraph.tablesLinksMap.get(SqlTableEnum.node_props);
-        SimplePropertyCriteria criteria = new SimplePropertyCriteria(Lists.newArrayList(AqlDomainEnum.properties),
-                key, propsTable.getTable(), AqlComparatorEnum.notEquals.signature, trashTime, propsTable.getTable(),false);
-
-        List<AqlQueryElement> aqlElements = aqlQuery.getAqlElements();
-        aqlElements.add(0, AqlAdapter.open);
-        aqlElements.add(AqlAdapter.close);
-        aqlElements.add(AqlAdapter.and);
-        aqlElements.add(criteria);
-    }
-
-    private boolean repoEqualsFilterFound(AqlQuery aqlQuery) {
-        List<AqlQueryElement> aqlElements = aqlQuery.getAqlElements();
-        for (AqlQueryElement aqlQueryElement : aqlElements) {
-            if (aqlQueryElement instanceof SimpleCriteria) {
-                SimpleCriteria criteria = (SimpleCriteria) aqlQueryElement;
-                if (criteriaIsRepoEquals(criteria)) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    private boolean criteriaIsRepoEquals(SimpleCriteria criteria) {
-        AqlField field = (AqlField) criteria.getVariable1();
-        boolean fieldIsRepo = itemRepo == field.getFieldEnum();
-        boolean comparatorIsEquals = AqlComparatorEnum.equals.equals(AqlComparatorEnum.value(criteria.getComparatorName()));
-        return fieldIsRepo && comparatorIsEquals;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/service/optimizer/FileTypeOptimization.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/service/optimizer/FileTypeOptimization.java
deleted file mode 100644
index 7bf1008..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/service/optimizer/FileTypeOptimization.java
+++ /dev/null
@@ -1,298 +0,0 @@
-package org.artifactory.storage.db.aql.service.optimizer;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.AqlFieldResolver;
-import org.artifactory.aql.model.*;
-import org.artifactory.storage.db.aql.sql.builder.links.TableLink;
-import org.artifactory.storage.db.aql.sql.builder.query.aql.*;
-import org.artifactory.storage.db.aql.sql.builder.query.sql.SqlTable;
-import org.artifactory.storage.db.aql.sql.builder.query.sql.type.AqlTableGraph;
-import org.artifactory.storage.db.aql.sql.model.SqlTableEnum;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlFieldEnum.itemType;
-
-/**
- * By default each node in the database can be or 0=folder or file=1, therefore a query with the file type = "all" is
- * being automatically replaced criteria with the following criterias :type=file or type=folder
- * ans since the sub query: type=file or type=folderis means all files it can be removed.
- *
- * @author Gidi Shabat
- */
-public class FileTypeOptimization extends OptimizationStrategy {
-    @Override
-    public void optimize(AqlQuery aqlQuery, String transformation) {
-        boolean change;
-        do {
-            // Remove Item type = all criterias
-            change = removeUnnecessaryItemType(aqlQuery);
-            // Remove duplicates operators
-            change = change | removeDuplicateOperators(aqlQuery);
-            // Remove last operator
-            change = change | removeLastOperator(aqlQuery);
-            // Remove first operator
-            change = change | removeFirstOperator(aqlQuery);
-            // Remove operator before close parenthesis
-            change = change | removeOperatorBeforeCloseParenthesis(aqlQuery);
-            // Remove operator after open parenthesis
-            change = change | removeOperatorAfterOpenParenthesis(aqlQuery);
-            // Remove parenthesis with operators
-            change = change | removeEmptyParenthesisWithOperator(aqlQuery);
-            // Remove empty parenthesis
-            change = change | removeEmptyParenthesis(aqlQuery);
-            // Remove single operator
-            change = change | removeSingleOperator(aqlQuery);
-        } while (change);
-    }
-
-    private boolean removeUnnecessaryItemType(AqlQuery aqlQuery) {
-        ItemTypeHandleEnum itemTypeInstances = findItemTypeInstances(aqlQuery);
-        // No need for optimization
-        if (ItemTypeHandleEnum.none == itemTypeInstances || ItemTypeHandleEnum.untuch == itemTypeInstances) {
-            return false;
-        }
-        List<AqlQueryElement> aqlElements = aqlQuery.getAqlElements();
-        int i;
-        // Find the criteria that contains "any"
-        for (i = 0; i < aqlElements.size(); i++) {
-            AqlQueryElement aqlQueryElement = aqlElements.get(i);
-            if (aqlQueryElement instanceof SimpleCriteria) {
-                AqlField field = (AqlField) ((SimpleCriteria) aqlQueryElement).getVariable1();
-                AqlValue value = (AqlValue) ((SimpleCriteria) aqlQueryElement).getVariable2();
-                if (itemType == field.getFieldEnum() && ((Integer) value.toObject()) == AqlItemTypeEnum.any.type) {
-                    break;
-                }
-            }
-        }
-        // Remove the criteria that contains "any"
-        SimpleCriteria criteria = (SimpleCriteria) aqlElements.remove(i);
-        // if we should replace it with the 'type=file or type=folder' sub query then do it
-        if (ItemTypeHandleEnum.replace == itemTypeInstances) {
-            List<AqlDomainEnum> subDomains = criteria.getSubDomains();
-            AqlField itemType = AqlFieldResolver.resolve(AqlFieldEnum.itemType);
-            AqlVariable files = AqlFieldResolver.resolve("file", AqlVariableTypeEnum.itemType);
-            AqlVariable folders = AqlFieldResolver.resolve("folder", AqlVariableTypeEnum.itemType);
-            TableLink tableLink = AqlTableGraph.tablesLinksMap.get(SqlTableEnum.nodes);
-            SqlTable table = tableLink.getTable();
-            SimpleCriteria criteria1 = new SimpleCriteria(subDomains, itemType, table,
-                    AqlComparatorEnum.equals.signature, files, table,criteria.isMspOperator());
-            SimpleCriteria criteria2 = new SimpleCriteria(subDomains, itemType, table,
-                    AqlComparatorEnum.equals.signature, folders, table,criteria.isMspOperator());
-            aqlElements.add(i, AqlAdapter.close);
-            aqlElements.add(i, criteria2);
-            aqlElements.add(i, AqlAdapter.or);
-            aqlElements.add(i, criteria1);
-            aqlElements.add(i, AqlAdapter.open);
-        }
-        return true;
-    }
-
-    private boolean removeOperatorBeforeCloseParenthesis(AqlQuery aqlQuery) {
-        boolean change = false;
-        List<AqlQueryElement> aqlElements = aqlQuery.getAqlElements();
-        ArrayList<Integer> toRemove = Lists.newArrayList();
-        AqlQueryElement prev = null;
-        AqlQueryElement current;
-        for (int i = 0; i < aqlElements.size(); i++) {
-            current = aqlElements.get(i);
-            if (current != null && prev != null) {
-                if (prev.isOperator() && current instanceof CloseParenthesisAqlElement) {
-                    // Invert the order, it will be easier to remove.
-                    toRemove.add(0, i - 1);
-                }
-            }
-            prev = current;
-        }
-        // Remove empty parenthesis from list
-        for (Integer index : toRemove) {
-            aqlElements.remove(index.intValue());
-            change = true;
-        }
-        return change;
-    }
-
-    private boolean removeOperatorAfterOpenParenthesis(AqlQuery aqlQuery) {
-        boolean change = false;
-        List<AqlQueryElement> aqlElements = aqlQuery.getAqlElements();
-        ArrayList<Integer> toRemove = Lists.newArrayList();
-        AqlQueryElement prev = null;
-        AqlQueryElement current;
-        for (int i = 0; i < aqlElements.size(); i++) {
-            current = aqlElements.get(i);
-            if (current != null && prev != null) {
-                if (prev instanceof OpenParenthesisAqlElement && current.isOperator()) {
-                    // Invert the order, it will be easier to remove.
-                    toRemove.add(0, i);
-                }
-            }
-            prev = current;
-        }
-        // Remove empty parenthesis from list
-        for (Integer index : toRemove) {
-            aqlElements.remove(index.intValue());
-            change = true;
-        }
-        return change;
-    }
-
-    private boolean removeEmptyParenthesis(AqlQuery aqlQuery) {
-        boolean change = false;
-        List<AqlQueryElement> aqlElements = aqlQuery.getAqlElements();
-        AqlQueryElement prev = null;
-        AqlQueryElement current;
-        while (true) {
-            ArrayList<Integer> toRemove = Lists.newArrayList();
-            boolean found = false;
-            for (int i = 0; i < aqlElements.size(); i++) {
-                current = aqlElements.get(i);
-                if (current != null && prev != null) {
-                    if (prev instanceof OpenParenthesisAqlElement && current instanceof CloseParenthesisAqlElement) {
-                        // Invert the order, it will be easier to remove.
-                        toRemove.add(0, i - 1);
-                        toRemove.add(0, i);
-                        found = true;
-                    }
-                }
-                prev = current;
-            }
-            if (!found) {
-                break;
-            }
-            // Remove empty parenthesis from list
-            for (Integer index : toRemove) {
-                aqlElements.remove(index.intValue());
-                change = true;
-            }
-        }
-        return change;
-    }
-
-    private boolean removeEmptyParenthesisWithOperator(AqlQuery aqlQuery) {
-        boolean change = false;
-        List<AqlQueryElement> aqlElements = aqlQuery.getAqlElements();
-        ArrayList<Integer> toRemove = Lists.newArrayList();
-        AqlQueryElement first = null;
-        AqlQueryElement second = null;
-        AqlQueryElement third;
-        for (int i = 0; i < aqlElements.size(); i++) {
-            third = aqlElements.get(i);
-            if (first != null && second != null && third != null) {
-                if (first instanceof OpenParenthesisAqlElement && second instanceof OperatorQueryElement && third instanceof CloseParenthesisAqlElement) {
-                    // Invert the order, it will be easier to remove.
-                    toRemove.add(0, i - 1);
-                }
-            }
-            first = second;
-            second = third;
-        }
-        // Remove empty parenthesis from list
-        for (Integer index : toRemove) {
-            aqlElements.remove(index.intValue());
-            change = true;
-        }
-        return change;
-    }
-
-    private boolean removeDuplicateOperators(AqlQuery aqlQuery) {
-        boolean change = false;
-        List<AqlQueryElement> aqlElements = aqlQuery.getAqlElements();
-        ArrayList<Integer> toRemove = Lists.newArrayList();
-        AqlQueryElement prev = null;
-        AqlQueryElement current;
-        for (int i = 0; i < aqlElements.size(); i++) {
-            current = aqlElements.get(i);
-            if (current != null && prev != null) {
-                if (prev.isOperator() && current.isOperator()) {
-                    // Invert the order, it will be easier to remove.
-                    toRemove.add(0, i - 1);
-                }
-            }
-            prev = current;
-        }
-        // Remove empty parenthesis from list
-        for (Integer index : toRemove) {
-            aqlElements.remove(index.intValue());
-            change = true;
-        }
-        return change;
-    }
-
-    private boolean removeLastOperator(AqlQuery aqlQuery) {
-        boolean change = false;
-        List<AqlQueryElement> aqlElements = aqlQuery.getAqlElements();
-        if (aqlElements.size() > 1) {
-            AqlQueryElement aqlQueryElement = aqlElements.get(aqlElements.size() - 1);
-            if (aqlQueryElement.isOperator()) {
-                aqlElements.remove(aqlElements.size() - 1);
-                change = true;
-            }
-        }
-        return change;
-    }
-
-    private boolean removeFirstOperator(AqlQuery aqlQuery) {
-        boolean change = false;
-        List<AqlQueryElement> aqlElements = aqlQuery.getAqlElements();
-        if (aqlElements.size() > 1) {
-            AqlQueryElement aqlQueryElement = aqlElements.get(0);
-            if (aqlQueryElement.isOperator()) {
-                aqlElements.remove(0);
-                change = true;
-            }
-        }
-        return change;
-    }
-
-    private boolean removeSingleOperator(AqlQuery aqlQuery) {
-        boolean change = false;
-        List<AqlQueryElement> aqlElements = aqlQuery.getAqlElements();
-        if (aqlElements.size() == 1) {
-            AqlQueryElement aqlQueryElement = aqlElements.get(0);
-            if (aqlQueryElement.isOperator()) {
-                aqlElements.remove(0);
-                change = true;
-            }
-        }
-        return change;
-    }
-
-    private ItemTypeHandleEnum findItemTypeInstances(AqlQuery aqlQuery) {
-        List<AqlQueryElement> aqlElements = aqlQuery.getAqlElements();
-        boolean foundFileOrFolder = false;
-        boolean foundAny = false;
-        for (AqlQueryElement aqlQueryElement : aqlElements) {
-            if (aqlQueryElement instanceof SimpleCriteria) {
-                AqlField field = (AqlField) ((SimpleCriteria) aqlQueryElement).getVariable1();
-                AqlValue value = (AqlValue) ((SimpleCriteria) aqlQueryElement).getVariable2();
-                if (itemType == field.getFieldEnum() && (((Integer) value.toObject()) == AqlItemTypeEnum.file.type ||
-                        ((Integer) value.toObject()) == AqlItemTypeEnum.folder.type)) {
-                    foundFileOrFolder = true;
-                }
-                if (itemType == field.getFieldEnum() && ((Integer) value.toObject()) == AqlItemTypeEnum.any.type) {
-                    foundAny = true;
-                }
-            }
-        }
-        return ItemTypeHandleEnum.fromFlags(foundFileOrFolder, foundAny);
-    }
-
-    private enum ItemTypeHandleEnum {
-        none, replace, untuch, remove;
-
-        public static ItemTypeHandleEnum fromFlags(boolean fileFolderFlag, boolean anyFlag) {
-            if (fileFolderFlag && anyFlag) {
-                return replace;
-            } else if (fileFolderFlag) {
-                return untuch;
-            } else if (anyFlag) {
-                return remove;
-            } else {
-                return none;
-            }
-
-
-        }
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/service/optimizer/OptimizationStrategy.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/service/optimizer/OptimizationStrategy.java
deleted file mode 100644
index bb06654..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/service/optimizer/OptimizationStrategy.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package org.artifactory.storage.db.aql.service.optimizer;
-
-import org.artifactory.aql.model.AqlField;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.model.AqlOperatorEnum;
-import org.artifactory.storage.db.aql.sql.builder.query.aql.*;
-import org.artifactory.storage.db.aql.sql.builder.query.sql.SqlTable;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public abstract class OptimizationStrategy {
-
-    public void doJob(AqlQuery aqlQuery){
-        String trasformation = transformToCharacterRepresentation(aqlQuery);
-        optimize(aqlQuery,trasformation);
-    }
-
-    public abstract void optimize(AqlQuery aqlQuery, String transformation);
-
-    /**
-     * AQL to string transformation function (method)
-     * This method transforms the AqlQuery into string representation. The "function" is being used to
-     * Detect patterns that can be optimize.
-     * <p/>
-     * Result
-     * Each Aql query element is represented by one character:
-     * SimpleCriteria on property key           =             k
-     * SimpleCriteria on property value         =             v
-     * SimpleCriteria on property key (result)  =             K
-     * SimpleCriteria on property value (result)=             V
-     * SimpleCriteria on any other field        =             c
-     * PropertyCriteria                         =             p
-     * OpenParenthesisAqlElement                =             (
-     * CloseParenthesisAqlElement               =             )
-     * OperatorQueryElement - and               =             a
-     * OperatorQueryElement - or                =             o
-     * MspAqlElement                            =             m
-     * ResultFilterAqlElement                   =             r
-     */
-    private String transformToCharacterRepresentation(AqlQuery aqlQuery) {
-        List<AqlQueryElement> aqlElements = aqlQuery.getAqlElements();
-        StringBuilder builder = new StringBuilder();
-        for (AqlQueryElement aqlElement : aqlElements) {
-            if (aqlElement instanceof ComplexPropertyCriteria) {
-                builder.append("p");
-            }
-            if (aqlElement instanceof OpenParenthesisAqlElement) {
-                builder.append("(");
-            }
-            if (aqlElement instanceof CloseParenthesisAqlElement) {
-                builder.append(")");
-            }
-            if (aqlElement instanceof ResultFilterAqlElement) {
-                builder.append("r");
-            }
-            if (aqlElement instanceof MspAqlElement) {
-                builder.append("m");
-            }
-            if (aqlElement instanceof SimpleCriteria || aqlElement instanceof SimplePropertyCriteria) {
-                AqlField field = (AqlField) ((Criteria) aqlElement).getVariable1();
-                SqlTable table1 = ((Criteria) aqlElement).getTable1();
-                if (table1.getId() >= 100) {
-                    if (AqlFieldEnum.propertyKey == field.getFieldEnum()) {
-                        builder.append("k");
-                    } else if (AqlFieldEnum.propertyValue == field.getFieldEnum()) {
-                        builder.append("v");
-                    } else {
-                        builder.append("c");
-                    }
-                } else {
-                    if (AqlFieldEnum.propertyKey == field.getFieldEnum()) {
-                        builder.append("K");
-                    } else if (AqlFieldEnum.propertyValue == field.getFieldEnum()) {
-                        builder.append("V");
-                    } else {
-                        builder.append("C");
-                    }
-                }
-            }
-            if (aqlElement instanceof OperatorQueryElement) {
-                AqlOperatorEnum operator = ((OperatorQueryElement) aqlElement).getOperatorEnum();
-                if (AqlOperatorEnum.and == operator) {
-                    builder.append("a");
-                } else {
-                    builder.append("o");
-                }
-            }
-        }
-        return builder.toString();
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/service/optimizer/PropertyCriteriaRelatedWithOr.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/service/optimizer/PropertyCriteriaRelatedWithOr.java
deleted file mode 100644
index 4649107..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/service/optimizer/PropertyCriteriaRelatedWithOr.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package org.artifactory.storage.db.aql.service.optimizer;
-
-import org.artifactory.storage.db.aql.sql.builder.query.aql.AqlQuery;
-import org.artifactory.storage.db.aql.sql.builder.query.aql.ComplexPropertyCriteria;
-import org.artifactory.storage.db.aql.sql.builder.query.aql.Criteria;
-import org.artifactory.storage.db.aql.sql.builder.query.aql.SimpleCriteria;
-import org.artifactory.storage.db.aql.sql.builder.query.aql.SimplePropertyCriteria;
-import org.artifactory.storage.db.aql.sql.builder.query.sql.SqlTable;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * @author Gidi Shabat
- */
-public class PropertyCriteriaRelatedWithOr extends OptimizationStrategy {
-    private final Pattern pattern = Pattern.compile("([c,p,k,v]o)+[c,p,k,v]");
-
-    /**
-     * Foe each sequence of criterias with properties connected with "OR" the method replaces the tables in the
-     * criterias to only one table (from the the first criteria).
-     * Note that this action is legal since we never mix tables that are separated by brackets and in AQL each block
-     * might contain one of the following combination of criterias tables
-     * 1. all property criterias are on the same table as result of "$msp" (Not include criterias in internal blocks)
-     * 2. all property criterias are on the result table as result of "$rf" (Not include criterias in internal blocks)
-     * 3. all property criterias are dynamic (contains different property tables)
-     * The only case that wil be effected by this method is case (3) and this is exactly the case that we want to optimize
-     *
-     * @param aqlQuery
-     */
-    @Override
-    public void optimize(AqlQuery aqlQuery, String transformation) {
-        // Try to find matching sub strings
-        Matcher matcher = pattern.matcher(transformation);
-        // Each match represent sub query that can be optimize
-        while (matcher.find()) {
-            // Get sub query bounds
-            int start = matcher.start();
-            int end = matcher.end();
-            // The start index must point on criteria according to the pattern
-            SqlTable table = getFirstPropertyTable(aqlQuery, transformation, start, end);
-            if (table == null) {
-                continue;
-            }
-            // Scan the sub query and replace the tables in "CRITERIAS WITH PROPERTIES" to the first table we just found
-            // Note after replacing all the tables to a single table the SQL generator will bind all criterias to a single table
-            // and no inner join will be generated for this criterias.
-            for (int i = start; i < end; i++) {
-                if (transformation.charAt(i) == 'p') {
-                    ComplexPropertyCriteria criteria = (ComplexPropertyCriteria) aqlQuery.getAqlElements().get(i);
-                    ComplexPropertyCriteria newCriteria = new ComplexPropertyCriteria(criteria.getSubDomains(),
-                            criteria.getVariable1(), table, criteria.getComparatorName(), criteria.getVariable2(),
-                            table, criteria.isMspOperator());
-                    aqlQuery.getAqlElements().remove(i);
-                    aqlQuery.getAqlElements().add(i, newCriteria);
-
-                }
-                if (transformation.charAt(i) == 'k' || transformation.charAt(i) == 'v') {
-                    Criteria criteria = (Criteria) aqlQuery.getAqlElements().get(i);
-                    Criteria newCriteria = null;
-                    if (criteria instanceof SimpleCriteria) {
-                        newCriteria = new SimpleCriteria(criteria.getSubDomains(),
-                                criteria.getVariable1(), table, criteria.getComparatorName(), criteria.getVariable2(),
-                                table,criteria.isMspOperator());
-                    }
-                    if (criteria instanceof SimplePropertyCriteria) {
-                        newCriteria = new SimplePropertyCriteria(criteria.getSubDomains(),
-                                criteria.getVariable1(), table, criteria.getComparatorName(), criteria.getVariable2(),
-                                table,criteria.isMspOperator());
-                    }
-                    aqlQuery.getAqlElements().remove(i);
-                    aqlQuery.getAqlElements().add(i, newCriteria);
-                }
-            }
-        }
-    }
-
-    private SqlTable getFirstPropertyTable(AqlQuery aqlQuery, String transformation, int start, int end) {
-        for (int i = start; i < end; i++) {
-            if (transformation.charAt(i) == 'p' || transformation.charAt(i) == 'k' || transformation.charAt(i) == 'v') {
-                Criteria criteria = (Criteria) aqlQuery.getAqlElements().get(i);
-                return criteria.getTable1();
-            }
-        }
-        return null;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/links/TableLink.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/links/TableLink.java
deleted file mode 100644
index 23b7fc0..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/links/TableLink.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.links;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlTableFieldsEnum;
-import org.artifactory.storage.db.aql.sql.builder.query.sql.SqlTable;
-import org.artifactory.storage.db.aql.sql.model.SqlTableEnum;
-
-import java.util.List;
-
-/**
- * The TableLink wraps the SqlTable object  and provides/contains the relations between the tables.
- * It is being used by the TableLinkBrowser to find the shortest route between to tables
- * @author Gidi Shabat
- */
-public class TableLink {
-    private final List<TableLinkRelation> relations = Lists.newArrayList();
-    private final SqlTable table;
-
-    public TableLink(SqlTableEnum tableEnum) {
-        this.table = new SqlTable(tableEnum);
-    }
-
-    /**
-     * Adds  link between to tables in both directions
-     * @param fromField
-     * @param toTable
-     * @param toFiled
-     */
-    public void addLink(AqlTableFieldsEnum fromField, TableLink toTable, AqlTableFieldsEnum toFiled) {
-        TableLinkRelation tableLinkRelation = new TableLinkRelation(this, fromField, toTable, toFiled);
-        relations.add(tableLinkRelation);
-        tableLinkRelation = new TableLinkRelation(toTable, toFiled, this, fromField);
-        toTable.relations.add(tableLinkRelation);
-    }
-
-    public SqlTable getTable() {
-        return table;
-    }
-
-    public SqlTableEnum getTableEnum() {
-        return table.getTable();
-    }
-
-    public List<TableLinkRelation> getRelations() {
-        return relations;
-    }
-
-    @Override
-    public String toString() {
-        return "TableLink{" +
-                "table=" + table +
-                '}';
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        TableLink tableLink = (TableLink) o;
-
-        if (!table.equals(tableLink.table)) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return table.hashCode();
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/links/TableLinkBrowser.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/links/TableLinkBrowser.java
deleted file mode 100644
index f75fe40..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/links/TableLinkBrowser.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.links;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-
-import java.util.List;
-import java.util.Set;
-
-/**
- * The TableLinkBrowser scans recursively the table objects jumping from one table to other through links provided
- * by the TableLink and find the shortest route between two tables.
- * We needs does routes in order to generate the minimal joins needed to connect between two tables
- *
- * @author Gidi Shabat
- */
-public class TableLinkBrowser {
-    private Set<TableLink> tableLinkSet = Sets.newHashSet();
-
-    /**
-     * Find the shortest route between two tables
-     *
-     * @param from
-     * @param to
-     * @param exclude
-     * @return
-     */
-    public List<TableLinkRelation> findPathTo(TableLink from, TableLink to, List<TableLink> exclude) {
-        if (tableLinkSet.contains(from) || exclude.contains(from)) {
-            return null;
-        }
-        if (to == from) {
-            List<TableLinkRelation> relations = from.getRelations();
-            for (TableLinkRelation relation : relations) {
-                if (relation.getToTable().getTable().getTable() == to.getTable().getTable()) {
-                    return Lists.newArrayList(relation);
-                }
-            }
-            return Lists.newArrayList();
-        }
-        tableLinkSet.add(from);
-        List<TableLinkRelation> relations = from.getRelations();
-        List<TableLinkRelation> list = null;
-        for (TableLinkRelation relation : relations) {
-            List<TableLinkRelation> results;
-            results = findPathTo(relation.getToTable(), to, exclude);
-            if (results != null) {
-                results.add(0, relation);
-            }
-            if (results != null && (list == null || list.size() == 0 || results.size() > 0 && list.size() > results.size())) {
-                list = results;
-            }
-        }
-        tableLinkSet.remove(from);
-        return list;
-    }
-
-    public static TableLinkBrowser create() {
-        return new TableLinkBrowser();
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/links/TableLinkRelation.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/links/TableLinkRelation.java
deleted file mode 100644
index 56ebd7c..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/links/TableLinkRelation.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.links;
-
-import org.artifactory.aql.model.AqlTableFieldsEnum;
-
-/**
- * The TableLinkRelation represent link between two tables
- *
- * @author Gidi Shabat
- */
-public class TableLinkRelation {
-    private TableLink fromTable;
-    private AqlTableFieldsEnum fromField;
-    private TableLink toTable;
-    private AqlTableFieldsEnum toFiled;
-
-    public TableLinkRelation(TableLink fromTable, AqlTableFieldsEnum fromField, TableLink toTable,
-            AqlTableFieldsEnum toFiled) {
-        this.fromTable = fromTable;
-        this.fromField = fromField;
-        this.toTable = toTable;
-        this.toFiled = toFiled;
-    }
-
-    public TableLink getFromTable() {
-        return fromTable;
-    }
-
-    public AqlTableFieldsEnum getFromField() {
-        return fromField;
-    }
-
-    public TableLink getToTable() {
-        return toTable;
-    }
-
-    @Override
-    public String toString() {
-        return "TableLinkRelation{" +
-                "fromTable=" + fromTable +
-                ", toTable=" + toTable +
-                '}';
-    }
-
-    public AqlTableFieldsEnum getToFiled() {
-        return toFiled;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        TableLinkRelation that = (TableLinkRelation) o;
-
-        if (fromField != that.fromField) {
-            return false;
-        }
-        if (fromTable != null ? !fromTable.equals(that.fromTable) : that.fromTable != null) {
-            return false;
-        }
-        if (toFiled != that.toFiled) {
-            return false;
-        }
-        if (toTable != null ? !toTable.equals(that.toTable) : that.toTable != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = fromTable != null ? fromTable.hashCode() : 0;
-        result = 31 * result + (fromField != null ? fromField.hashCode() : 0);
-        result = 31 * result + (toTable != null ? toTable.hashCode() : 0);
-        result = 31 * result + (toFiled != null ? toFiled.hashCode() : 0);
-        return result;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/AdapterContext.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/AdapterContext.java
deleted file mode 100644
index fcb6fec..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/AdapterContext.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.aql;
-
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.DomainSensitiveField;
-import org.artifactory.storage.db.aql.sql.builder.query.sql.SqlTable;
-
-import java.util.List;
-import java.util.Stack;
-
-/**
- * The context is being used by the AqlApiToAqlQuery converter and the Parser to AqlQuery converter
- * It contains the AqlQuery that is being filled and other information needed to build the AqlQuery
- *
- * @author Gidi Shabat
- */
-public class AdapterContext {
-    private AqlQuery aqlQuery = new AqlQuery();
-    private int tableId = SqlTable.MINIMAL_DYNAMIC_TABLE_ID;
-    private Stack<AqlQueryElement> functions = new Stack<>();
-
-    public void push(AqlQueryElement aqlQueryElement) {
-        functions.push(aqlQueryElement);
-    }
-
-    public void setDomain(AqlDomainEnum domainEnum) {
-        aqlQuery.setDomain(domainEnum);
-    }
-
-    public void setSort(SortDetails sortDetails) {
-        aqlQuery.setSort(sortDetails);
-    }
-
-    public void addAqlQueryElements(AqlQueryElement aqlQueryElement) {
-        aqlQuery.getAqlElements().add(aqlQueryElement);
-    }
-
-    public AqlQueryElement peek() {
-        return functions.peek();
-    }
-
-    public AqlQueryElement pop() {
-        return functions.pop();
-    }
-
-    public int provideIndex() {
-        int temp = tableId;
-        tableId = tableId + 1;
-        return temp;
-    }
-
-    public List<AqlQueryElement> getAqlQueryElements() {
-        return aqlQuery.getAqlElements();
-    }
-
-    public void addField(DomainSensitiveField field) {
-        if (!aqlQuery.getResultFields().contains(field)) {
-            aqlQuery.getResultFields().add(field);
-        }
-    }
-
-
-    public Stack<AqlQueryElement> getFunctions() {
-        return functions;
-    }
-
-    public AqlQuery getAqlQuery() {
-        return aqlQuery;
-    }
-
-    public List<DomainSensitiveField> getResultFields() {
-        return aqlQuery.getResultFields();
-    }
-
-    public void setLimit(long limit) {
-        aqlQuery.setLimit(limit);
-    }
-
-    public void setOffset(long offset) {
-        aqlQuery.setOffset(offset);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/AqlAdapter.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/AqlAdapter.java
deleted file mode 100644
index 2a666f1..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/AqlAdapter.java
+++ /dev/null
@@ -1,249 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.aql;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.AqlFieldResolver;
-import org.artifactory.aql.model.AqlComparatorEnum;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlField;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.model.AqlOperatorEnum;
-import org.artifactory.aql.model.AqlValue;
-import org.artifactory.aql.model.AqlVariable;
-import org.artifactory.aql.model.AqlVariableTypeEnum;
-import org.artifactory.storage.db.aql.sql.builder.query.sql.SqlTable;
-import org.artifactory.storage.db.aql.sql.model.AqlFieldExtensionEnum;
-import org.artifactory.storage.db.aql.sql.model.SqlTableEnum;
-import org.artifactory.util.Pair;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlComparatorEnum.equals;
-import static org.artifactory.aql.model.AqlFieldEnum.itemType;
-import static org.artifactory.aql.model.AqlItemTypeEnum.file;
-import static org.artifactory.storage.db.aql.sql.builder.query.sql.type.AqlTableGraph.tablesLinksMap;
-
-/**
- * The class contains common methods tha are being used by the AqlApiToAqlAdapter and the ParserToAqlAdapter
- * to convert the API or the parser result to AqlQuery
- *
- * @author Gidi Shabat
- */
-public abstract class AqlAdapter {
-    public static final OpenParenthesisAqlElement open = new OpenParenthesisAqlElement();
-    public static final CloseParenthesisAqlElement close = new CloseParenthesisAqlElement();
-    public static final OperatorQueryElement and = new OperatorQueryElement(AqlOperatorEnum.and);
-    public static final OperatorQueryElement or = new OperatorQueryElement(AqlOperatorEnum.or);
-
-    /**
-     * Create Simple Property criteria: A property criteria is actually two criterias on the same property table
-     * Example "key" "$matches" "license*"
-     * The above criteria is being converted to the following SQL query
-     * node_props.key equals 'license' and node_props.value like 'GPL'
-     */
-    public static Criteria createSimplePropertyCriteria(List<AqlDomainEnum> subDomains, AqlFieldEnum aqlField,
-            String name2,
-            AqlComparatorEnum comparatorEnum, AdapterContext context) {
-        Pair<AqlVariable, AqlVariable> variables = new Pair<>(new AqlField(aqlField), new AqlValue(aqlField.type, name2));
-        Pair<SqlTable, SqlTable> tables = resolveTableForSimpleCriteria(variables, context);
-        boolean mspOperator= getMspOperator(context) != null;
-        return new SimplePropertyCriteria(subDomains, variables.getFirst(), tables.getFirst(), comparatorEnum.signature,
-                variables.getSecond(), tables.getSecond(),mspOperator);
-    }
-
-    /**
-     * Create Property criteria: A property criteria is actually two criterias on the same property table
-     * Example "license" "$matches" "GPL"
-     * The above criteria is being converted to the following SQL query
-     * node_props.key equals 'license' and node_props.value like 'GPL'
-     */
-    public static Criteria createComplexPropertyCriteria(List<AqlDomainEnum> subDomains, String name1, String name2,
-                                                         AqlComparatorEnum comparatorEnum,
-                                                         AdapterContext tableReference, boolean mspOperator) {
-        AqlVariable variable1 = AqlFieldResolver.resolve(name1, AqlVariableTypeEnum.string);
-        AqlVariable variable2 = AqlFieldResolver.resolve(name2, AqlVariableTypeEnum.string);
-        Pair<SqlTable, SqlTable> tables = resolveTableForPropertyCriteria(tableReference,subDomains);
-
-        return new ComplexPropertyCriteria(subDomains, variable1, tables.getFirst(),
-                comparatorEnum.signature, variable2, tables.getSecond(),mspOperator);
-    }
-
-    /**
-     * Create Simple criteria: A simple criteria is actually single criteria constructed as following
-     * Field Comparator Value
-     * Example the "artifact_repo" "$matches" "libs-release-local"
-     * The above criteria is being converted to the following SQL query * node.repo like 'libs-release-local'
-     */
-    public static Criteria createSimpleCriteria(List<AqlDomainEnum> subDomains, AqlFieldEnum aqlField, String name2,
-            AqlComparatorEnum comparatorEnum, AdapterContext context) {
-        Pair<AqlVariable, AqlVariable> variables = new Pair<>(new AqlField(aqlField), new AqlValue(aqlField.type, name2));
-        Pair<SqlTable, SqlTable> tables = resolveTableForSimpleCriteria(variables, context);
-        boolean mspOperator = getMspOperator(context) != null;
-        return new SimpleCriteria(subDomains, variables.getFirst(), tables.getFirst(), comparatorEnum.signature,
-                variables.getSecond(), tables.getSecond(),mspOperator);
-    }
-
-    /**
-     * Resolving tables is delicate issue.
-     * The tables are provided as follow:
-     * 1. If the table is not property table then use the default tables from the tablesLinksMap.
-     * 2. if the table is property table then by default generate new table with new alias id to each property table
-     * unless the criteria is inside freezeJoin function, and in such case use the table index provided in the
-     * join operator
-     */
-    public static Pair<SqlTable, SqlTable> resolveTableForSimpleCriteria(Pair<AqlVariable, AqlVariable> variables,
-            AdapterContext context) {
-        AqlField field = (AqlField) variables.getFirst();
-        AqlFieldExtensionEnum extension = AqlFieldExtensionEnum.getExtensionFor(field.getFieldEnum());
-        SqlTableEnum tableEnum = extension.table;
-        if (SqlTableEnum.node_props == tableEnum || SqlTableEnum.build_props == tableEnum ||
-                SqlTableEnum.module_props == tableEnum) {
-            ResultFilterAqlElement resultFieldAqlElement = (ResultFilterAqlElement) getResultFilterOperator(context);
-            if (resultFieldAqlElement != null) {
-                SqlTable table = tablesLinksMap.get(tableEnum).getTable();
-                return new Pair<>(table, table);
-            }
-            MspAqlElement propertyAqlElement = (MspAqlElement) getMspOperator(context);
-            if (propertyAqlElement == null) {
-                SqlTable table = new SqlTable(tableEnum, context.provideIndex());
-                return new Pair<>(table, table);
-            }
-            SqlTable table = new SqlTable(tableEnum, propertyAqlElement.getTableId());
-            return new Pair<>(table, table);
-        } else {
-            SqlTable table = tablesLinksMap.get(tableEnum).getTable();
-            return new Pair<>(table, table);
-        }
-    }
-
-    /**
-     * Resolving tables is delicate issue, in this case we now that the tables are properties therefore
-     * by default generate new table with new alias id to each property table unless the criteria is inside freezeJoin
-     * function, and in such case use the table index provided in the
-     * join operator
-     */
-    public static Pair<SqlTable, SqlTable> resolveTableForPropertyCriteria(AdapterContext context,List<AqlDomainEnum> subDomains) {
-        ResultFilterAqlElement resultFilterElement = (ResultFilterAqlElement) getResultFilterOperator(context);
-        if (resultFilterElement != null) {
-            AqlDomainEnum aqlDomainEnum = subDomains.get(subDomains.size() - 1);
-            AqlFieldExtensionEnum extension = AqlFieldExtensionEnum.getExtensionFor(aqlDomainEnum.fields[0]);
-            SqlTable table = tablesLinksMap.get(extension.table).getTable();
-            return new Pair<>(table, table);
-        }
-        MspAqlElement propertyAqlElement = (MspAqlElement) getMspOperator(context);
-        if (propertyAqlElement == null) {
-            AqlDomainEnum aqlDomainEnum = subDomains.get(subDomains.size() - 1);
-            AqlFieldExtensionEnum extension = AqlFieldExtensionEnum.getExtensionFor(aqlDomainEnum.fields[0]);
-            SqlTable table = new SqlTable(extension.table, context.provideIndex());
-            return new Pair<>(table, table);
-        }
-        AqlDomainEnum aqlDomainEnum = subDomains.get(subDomains.size() - 1);
-        AqlFieldExtensionEnum extension = AqlFieldExtensionEnum.getExtensionFor(aqlDomainEnum.fields[0]);
-        SqlTable table = new SqlTable(extension.table, propertyAqlElement.getTableId());
-        return new Pair<>(table, table);
-    }
-
-    /**
-     * Scans the context que for leading join operators
-     */
-    protected static AqlQueryElement getMspOperator(AdapterContext context) {
-        if (context.getFunctions().isEmpty()) {
-            return null;
-        }
-        AqlQueryElement peek = context.peek();
-        if (peek instanceof MspAqlElement) {
-            return peek;
-        }
-        AqlQueryElement temp = context.pop();
-        peek = getMspOperator(context);
-        context.push(temp);
-        return peek;
-    }
-
-    /**
-     * Scans the context que for leading join operators
-     */
-    protected static AqlQueryElement getResultFilterOperator(AdapterContext context) {
-        if (context.getFunctions().isEmpty()) {
-            return null;
-        }
-        AqlQueryElement peek = context.peek();
-        if (peek instanceof ResultFilterAqlElement) {
-            return peek;
-        }
-        AqlQueryElement temp = context.pop();
-        peek = getResultFilterOperator(context);
-        context.push(temp);
-        return peek;
-    }
-
-    /**
-     * Scans the context que for leading or/and operators
-     */
-    protected static AqlQueryElement getOperator(AdapterContext context) {
-        if (context.getFunctions().isEmpty()) {
-            return null;
-        }
-        AqlQueryElement peek = context.peek();
-        if (peek.isOperator()) {
-            return peek;
-        }
-        AqlQueryElement temp = context.pop();
-        peek = getOperator(context);
-        context.push(temp);
-        return peek;
-    }
-
-    /**
-     * Adds operator to the AqlQuery if needed
-     */
-    protected static void addOperatorToAqlQueryElements(AdapterContext context) {
-        List<AqlQueryElement> currentAqlQueryElments = context.getAqlQueryElements();
-        if (!currentAqlQueryElments.isEmpty() && (currentAqlQueryElments.get(
-                currentAqlQueryElments.size() - 1) instanceof Criteria ||
-                currentAqlQueryElments.get(currentAqlQueryElments.size() - 1) instanceof CloseParenthesisAqlElement)) {
-            context.addAqlQueryElements(getOperator(context));
-        }
-    }
-
-    /**
-     * This is ugly hack that force AQL ITEMS queries to return (by default) on files by
-     * Injecting extra  (type=file) filter to the query.
-     */
-    protected void injectDefaultValues(AdapterContext context) {
-        AqlQuery aqlQuery = context.getAqlQuery();
-        AqlDomainEnum domain = aqlQuery.getDomain();
-        // Check if the user Item type in his criterias
-        boolean shouldAddDefailtItemTypeCriteria = shouldAddDefailtItemTypeCriteria(aqlQuery, domain);
-        // If the user is not using criterias with type, then add criteria to set the default type = "file"
-        if (shouldAddDefailtItemTypeCriteria) {
-            ArrayList<AqlDomainEnum> subDomains = Lists.newArrayList(domain);
-            Criteria criteria = createSimpleCriteria(subDomains, itemType, file.signature, equals, context);
-            addCriteria(context, criteria);
-        }
-    }
-
-    private boolean shouldAddDefailtItemTypeCriteria(AqlQuery aqlQuery, AqlDomainEnum domain) {
-        if (domain == AqlDomainEnum.items) {
-            for (AqlQueryElement aqlQueryElement : aqlQuery.getAqlElements()) {
-                if (aqlQueryElement instanceof SimpleCriteria) {
-                    SimpleCriteria criteria = (SimpleCriteria) aqlQueryElement;
-                    if (((AqlField) criteria.getVariable1()).getFieldEnum() == itemType) {
-                        return false;
-                    }
-                }
-            }
-            return true;
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * Adds criteria to the AqlQuery and its leading operator if needed
-     */
-    protected void addCriteria(AdapterContext context, Criteria criteria) {
-        addOperatorToAqlQueryElements(context);
-        context.addAqlQueryElements(criteria);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/AqlApiToAqlAdapter.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/AqlApiToAqlAdapter.java
deleted file mode 100644
index 4be2dcf..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/AqlApiToAqlAdapter.java
+++ /dev/null
@@ -1,221 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.aql;
-
-import org.artifactory.aql.AqlFieldResolver;
-import org.artifactory.aql.api.AqlApiElement;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlField;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.model.AqlVariable;
-import org.artifactory.aql.model.AqlVariableTypeEnum;
-import org.artifactory.aql.model.DomainSensitiveField;
-import org.artifactory.storage.db.aql.sql.builder.query.sql.SqlTable;
-import org.artifactory.util.Pair;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlApiToAqlAdapter extends AqlAdapter {
-
-    /**
-     * Converts Aql (Api) into SqlQuery
-     */
-    public AqlQuery toAqlModel(AqlBase AqlBase) {
-        // Initialize the context
-        AdapterContext context = new AdapterContext();
-        // Set the default operator that is being used if no other operator has been declared.
-        context.push(and);
-        // Recursively visit the AqlBase elements anf fill the AqlQuery
-        visitElements(AqlBase, context);
-        // Add default filters
-        injectDefaultValues(context);
-        return context.getAqlQuery();
-    }
-
-    /**
-     * Recursively visit the AqlBase parser elements and transform them into AqlQuery Object.
-     */
-    private void visitElements(AqlApiElement rootElement, AdapterContext context) {
-        List<AqlApiElement> list = rootElement.get();
-        for (AqlApiElement element : list) {
-            if (element instanceof AqlBase.SortApiElement) {
-                handleSort((AqlBase.SortApiElement) element, context);
-            }
-            if (element instanceof AqlBase.DomainApiElement) {
-                handleDomain((AqlBase.DomainApiElement) element, context);
-            }
-            if (element instanceof AqlBase.AndClause) {
-                handleAnd((AqlBase.AndClause) element, context);
-            }
-            if (element instanceof AqlBase.OrClause) {
-                handleOr((AqlBase.OrClause) element, context);
-            }
-            if (element instanceof AqlBase.FreezeJoin) {
-                handleMsp((AqlBase.FreezeJoin) element, context);
-            }
-            if (element instanceof AqlBase.PropertyResultFilterClause) {
-                handleResultFilter((AqlBase.PropertyResultFilterClause) element, context);
-            }
-            if (element instanceof AqlBase.PropertyCriteriaClause) {
-                handlePropertyCriteria((AqlBase.PropertyCriteriaClause) element, context);
-            }
-            if (element instanceof AqlBase.CriteriaClause) {
-                handleCriteria((AqlBase.CriteriaClause) element, context);
-            }
-            if (element instanceof AqlBase.LimitApiElement) {
-                handleLimit((AqlBase.LimitApiElement) element, context);
-            }
-            if (element instanceof AqlBase.OffsetApiElement) {
-                handleOffset((AqlBase.OffsetApiElement) element, context);
-            }
-            if (element instanceof AqlBase.FilterApiElement) {
-                visitElements(element, context);
-            }
-            if (element instanceof AqlBase.IncludeApiElement) {
-                handleResultInclude((AqlBase.IncludeApiElement) element, context);
-            }
-        }
-    }
-
-    private void handleResultInclude(AqlBase.IncludeApiElement element, AdapterContext context) {
-        // fill context with domain fields
-        for (DomainSensitiveField field : element.getResultFields()) {
-            context.addField(field);
-        }
-        // fill context with include fields
-        for (DomainSensitiveField field : element.getIncludeFields()) {
-            context.addField(field);
-        }
-    }
-
-    private void handleLimit(AqlBase.LimitApiElement element, AdapterContext context) {
-        //Read the limit value from the AqlBase LimitApiElement and put it in the context (AqlQuery)
-        context.setLimit(element.getLimit());
-    }
-
-    private void handleOffset(AqlBase.OffsetApiElement element, AdapterContext context) {
-        //Read the offset value from the AqlBase LimitApiElement and put it in the context (AqlQuery)
-        context.setOffset(element.getOffset());
-    }
-
-    private void handlePropertyCriteria(AqlBase.PropertyCriteriaClause element, AdapterContext context) {
-        // Converts AqlBase propertyCriteriaClause into real PropertyCriteria
-        AqlVariable variable1 = AqlFieldResolver.resolve(element.getString1(), AqlVariableTypeEnum.string);
-        AqlVariable variable2 = AqlFieldResolver.resolve(element.getString2(), AqlVariableTypeEnum.string);
-        List<AqlDomainEnum> subDomains = element.getSubDomains();
-        Pair<SqlTable, SqlTable> tables = resolveTableForPropertyCriteria(context, subDomains);
-        boolean mspOperator = getMspOperator(context) != null;
-        Criteria criteria = new ComplexPropertyCriteria(subDomains, variable1, tables.getFirst(),
-                element.getComparator().signature, variable2, tables.getSecond(),mspOperator);
-        addCriteria(context, criteria);
-    }
-
-    private void handleCriteria(AqlBase.CriteriaClause element, AdapterContext context) {
-        // Converts AqlBase CriteriaClause into real criteria
-        AqlField criteriaField = AqlFieldResolver.resolve(element.getFieldEnum());
-        AqlVariable criteriaValue = AqlFieldResolver.resolve(element.getValue(), element.getFieldEnum().type);
-        Pair<AqlVariable, AqlVariable> variables = new Pair<>(criteriaField, criteriaValue);
-        Pair<SqlTable, SqlTable> tables = resolveTableForSimpleCriteria(variables, context);
-        boolean mspOperator = getMspOperator(context) != null;
-        List<AqlDomainEnum> subDomains = element.getSubDomains();
-        Criteria criteria;
-        // Create equals criteria
-        if (AqlFieldEnum.propertyKey == element.getFieldEnum() || AqlFieldEnum.propertyValue == element.getFieldEnum()) {
-            criteria = new SimplePropertyCriteria(subDomains, criteriaField, tables.getFirst(),
-                    element.getComparator().signature, criteriaValue, tables.getSecond(),mspOperator);
-        } else {
-            criteria = new SimpleCriteria(subDomains, criteriaField, tables.getFirst(),
-                    element.getComparator().signature, criteriaValue, tables.getSecond(),mspOperator);
-        }
-        addCriteria(context, criteria);
-    }
-
-    private void handleMsp(AqlBase.FreezeJoin freezeJoin, AdapterContext context) {
-        if (freezeJoin.isEmpty()) {
-            return;
-        }
-        // Add operator if needed
-        addOperatorToAqlQueryElements(context);
-        // Push Join element that contains table index, this index will be used by in all the property tables that are
-        // being used inside this function
-        context.push(new MspAqlElement(context.provideIndex()));
-        context.addAqlQueryElements(open);
-        // Recursively visit the internal elements
-        visitElements(freezeJoin, context);
-        context.addAqlQueryElements(close);
-        // Pop the JoinAqlElement, we are getting out from the function
-        context.pop();
-    }
-
-    private void handleResultFilter(AqlBase.PropertyResultFilterClause flat, AdapterContext context) {
-        if (flat.isEmpty()) {
-            return;
-        }
-        // Add operator if needed
-        addOperatorToAqlQueryElements(context);
-        // Push Join element that contains table index, this index will be used by in all the property tables that are
-        // being used inside this function
-        context.push(new ResultFilterAqlElement());
-        context.addAqlQueryElements(open);
-        // Recursively visit the internal elements
-        visitElements(flat, context);
-        context.addAqlQueryElements(close);
-        // Pop the JoinAqlElement, we are getting out from the function
-        context.pop();
-    }
-
-    private void handleOr(AqlBase.OrClause or, AdapterContext context) {
-        if (or.isEmpty()) {
-            return;
-        }
-        // Add operator if needed
-        addOperatorToAqlQueryElements(context);
-        // Push the or operator
-        context.push(AqlAdapter.or);
-        context.addAqlQueryElements(open);
-        // Recursively visit the internal elements
-        visitElements(or, context);
-        context.addAqlQueryElements(close);
-        // Pop the OrlElement, we are getting out from the function
-        context.pop();
-    }
-
-    private void handleAnd(AqlBase.AndClause and, AdapterContext context) {
-        if (and.isEmpty()) {
-            return;
-        }
-        // Add operator if needed
-        addOperatorToAqlQueryElements(context);
-        // Push the and operator
-        context.push(AqlAdapter.and);
-        context.addAqlQueryElements(open);
-        // Recursively visit the internal elements
-        visitElements(and, context);
-        context.addAqlQueryElements(close);
-        // Pop the AndlElement, we are getting out from the function
-        context.pop();
-    }
-
-    private void handleSort(AqlBase.SortApiElement sort, AdapterContext context) {
-        // Get the Sort info from the AqlBase SortApiElement and set the info inside the new SortDetails object
-        SortDetails sortDetails = new SortDetails();
-        if (sort != null && !sort.isEmpty()) {
-            sortDetails.setSortType(sort.getSortType());
-            List<DomainSensitiveField> fields = sort.getFields();
-            for (DomainSensitiveField field : fields) {
-                sortDetails.addField(field.getField());
-                if(! context.getResultFields().contains(field)){
-                    context.getResultFields().add(field);
-                }
-            }
-        }
-        context.setSort(sortDetails);
-    }
-
-    private void handleDomain(AqlBase.DomainApiElement domain, AdapterContext context) {
-        // Get the Main domain info from the AqlBase DomainApiElement and set it in the AqlQuery
-        context.setDomain(domain.getDomain());
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/AqlQuery.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/AqlQuery.java
deleted file mode 100644
index 831d547..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/AqlQuery.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.aql;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.DomainSensitiveField;
-
-import java.util.List;
-
-/**
- * The class contains all the information that has been collected from the AqlApi or the Parser
- *
- * @author Gidi Shabat
- */
-public class AqlQuery {
-    private List<DomainSensitiveField> resultFields = Lists.newArrayList();
-    private SortDetails sort;
-    private List<AqlQueryElement> aqlElements = Lists.newArrayList();
-    private AqlDomainEnum domain;
-    private long limit = Long.MAX_VALUE;
-    private long offset = 0;
-
-    public List<DomainSensitiveField> getResultFields() {
-        return resultFields;
-    }
-
-    public SortDetails getSort() {
-        return sort;
-    }
-
-    public void setSort(SortDetails sort) {
-        this.sort = sort;
-    }
-
-    public List<AqlQueryElement> getAqlElements() {
-        return aqlElements;
-    }
-
-    public AqlDomainEnum getDomain() {
-        return domain;
-    }
-
-    public void setDomain(AqlDomainEnum domain) {
-        this.domain = domain;
-    }
-
-    public long getLimit() {
-        return limit;
-    }
-
-    public void setLimit(long limit) {
-        this.limit = limit;
-    }
-
-    public long getOffset() {
-        return offset;
-    }
-
-    public void setOffset(long offset) {
-        this.offset = offset;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/AqlQueryElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/AqlQueryElement.java
deleted file mode 100644
index ed07678..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/AqlQueryElement.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.aql;
-
-/**
- * This interface represent AqlQuery sub element.
- *
- * @author Gidi Shabat
- */
-public interface AqlQueryElement {
-    boolean isOperator();
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/CloseParenthesisAqlElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/CloseParenthesisAqlElement.java
deleted file mode 100644
index 9d022a9..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/CloseParenthesisAqlElement.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.aql;
-
-/**
- * @author Gidi Shabat
- */
-public class CloseParenthesisAqlElement implements AqlQueryElement {
-    @Override
-    public boolean isOperator() {
-        return false;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/ComplexPropertyCriteria.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/ComplexPropertyCriteria.java
deleted file mode 100644
index 69e34e5..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/ComplexPropertyCriteria.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.aql;
-
-import org.artifactory.aql.AqlException;
-import org.artifactory.aql.AqlFieldResolver;
-import org.artifactory.aql.model.AqlComparatorEnum;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.model.AqlVariable;
-import org.artifactory.storage.db.aql.sql.builder.query.sql.SqlTable;
-
-import java.util.List;
-
-import static org.artifactory.storage.db.aql.sql.model.SqlTableEnum.build_props;
-import static org.artifactory.storage.db.aql.sql.model.SqlTableEnum.node_props;
-
-/**
- * @author Gidi Shabat
- */
-public class ComplexPropertyCriteria extends Criteria {
-    public ComplexPropertyCriteria(List<AqlDomainEnum> subDomains, AqlVariable variable1, SqlTable table1,
-            String comparatorName, AqlVariable variable2, SqlTable table2, boolean mspOperator) {
-        super(subDomains, variable1, table1, comparatorName, variable2, table2,mspOperator);
-    }
-
-    /**
-     * Converts propertyCriteria to Sql criteria
-     */
-    @Override
-    public String toSql(List<Object> params) throws AqlException {
-        // Get both variable which are Values (this is property criteria)
-        AqlVariable value1 = getVariable1();
-        AqlVariable value2 = getVariable2();
-        // Get both tables which are node_props tables (this is property criteria)
-        SqlTable table1 = getTable1();
-        // SqlTable table2 = getTable2();
-        // update the Sql input param list
-        // Get the ComparatorEnum
-        AqlComparatorEnum comparatorEnum = AqlComparatorEnum.value(getComparatorName());
-        return createSqlComplexPropertyCriteria(comparatorEnum, value1, table1, value2, params);
-    }
-
-    //
-    public String createSqlComplexPropertyCriteria(AqlComparatorEnum comparatorEnum, AqlVariable variable1,
-                                                   SqlTable table1,
-                                                   AqlVariable variable2, List<Object> params) {
-        AqlVariable key = AqlFieldResolver.resolve(AqlFieldEnum.propertyKey.signature);
-        AqlVariable value = AqlFieldResolver.resolve(AqlFieldEnum.propertyValue.signature);
-        Object param1 = resolveParam(variable1);
-        Object param2 = resolveParam(variable2);
-        String index1 = table1 != null ? table1.getAlias() : "";
-        switch (comparatorEnum) {
-            case equals: {
-                return "(" + generateEqualsQuery(key, variable1, params, param1, index1) + " and " +
-                        generateEqualsQuery(value, variable2, params, param2, index1) + ")";
-            }
-            case matches: {
-                return "(" + generateEqualsQuery(key, variable1, params, param1, index1) + " and " +
-                        generateMatchQuery(value, variable2, params, param2, index1) + ")";
-            }
-            case notMatches: {
-                // In case that the query is inside MSP then use simple query without exist(...)
-                if(  isMspOperator()){
-                    return "(" + generateNotMatchQuery(key, variable1, params, param1, index1) + " or " +
-                            generateNotMatchQuery(value, variable2, params, param2, index1) + ")";
-                }else {
-                    params.add(param1);
-                    params.add(param2);
-                    String tableName = table1.getTable().name();
-                    String fieldName = node_props == table1.getTable() ? "node_id" :
-                            build_props == table1.getTable() ? "build_id" : "module_id";
-                    return "(" + index1 + fieldName + " is null or not exists (select 1 from "
-                            + tableName + " where " + index1 + fieldName + " = " + fieldName + " and prop_key = " + toSql(
-                            variable1) + " and prop_value like  " + toSql(variable2) + "))";
-                }
-            }
-            case less: {
-                return "(" + generateEqualsQuery(key, variable1, params, param1, index1) + " and " +
-                        generateLessThanQuery(value, variable2, params, param2, index1) + ")";
-            }
-            case greater: {
-                return "(" + generateEqualsQuery(key, variable1, params, param1, index1) + " and " +
-                        generateGreaterThanQuery(value, variable2, params, param2, index1) + ")";
-            }
-            case greaterEquals: {
-                return "(" + generateEqualsQuery(key, variable1, params, param1, index1) + " and " +
-                        generateGreaterEqualQuery(value, variable2, params, param2, index1) + ")";
-            }
-            case lessEquals: {
-                return "(" + generateEqualsQuery(key, variable1, params, param1, index1) + " and " +
-                        generateLessEqualsQuery(value, variable2, params, param2, index1) + ")";
-            }
-            case notEquals: {
-                // In case that the query is inside MSP then use simple query without exist(...)
-                if(  isMspOperator()){
-                    return "(" + generateNotEqualsQuery(key, variable1, params, param1, index1) + " or " +
-                            generateNotEqualsQuery(value, variable2, params, param2, index1) + ")";
-                }else {
-                    params.add(param1);
-                    params.add(param2);
-                    String tableName = table1.getTable().name();
-                    String fieldName = node_props == table1.getTable() ? "node_id" :
-                            build_props == table1.getTable() ? "build_id" : "module_id";
-                    return "(" + index1 + fieldName + " is null or not exists (select 1 from " + tableName + " where " +
-                            index1 + fieldName + " = " + fieldName + " and prop_key = " + toSql(
-                            variable1) + " and prop_value = " + toSql(variable2) + "))";
-                }
-            }
-            default:
-                throw new IllegalStateException("Should not reach to the point of code");
-        }
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/Criteria.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/Criteria.java
deleted file mode 100644
index b35d7dd..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/Criteria.java
+++ /dev/null
@@ -1,254 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.aql;
-
-import org.artifactory.aql.AqlException;
-import org.artifactory.aql.AqlFieldResolver;
-import org.artifactory.aql.model.AqlComparatorEnum;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlField;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.model.AqlValue;
-import org.artifactory.aql.model.AqlVariable;
-import org.artifactory.storage.db.aql.sql.builder.query.sql.AqlToSqlQueryBuilderException;
-import org.artifactory.storage.db.aql.sql.builder.query.sql.SqlTable;
-import org.artifactory.storage.db.aql.sql.model.AqlFieldExtensionEnum;
-
-import java.util.List;
-
-import static org.artifactory.storage.db.aql.sql.model.SqlTableEnum.build_props;
-import static org.artifactory.storage.db.aql.sql.model.SqlTableEnum.node_props;
-
-/**
- * Abstract class that represent single criteria (field comparator and value).
- *
- * @author Gidi Shabat
- */
-public abstract class Criteria implements AqlQueryElement {
-    private List<AqlDomainEnum> subDomains;
-    private AqlVariable variable1;
-    private String comparatorName;
-    private AqlVariable variable2;
-    private SqlTable table1;
-    private SqlTable table2;
-    private boolean mspOperator;
-
-    public Criteria(List<AqlDomainEnum> subDomains, AqlVariable variable1, SqlTable table1, String comparatorName,
-            AqlVariable variable2, SqlTable table2,boolean mspOperator) {
-        this.subDomains = subDomains;
-        this.variable1 = variable1;
-        this.table1 = table1;
-        this.comparatorName = comparatorName;
-        this.variable2 = variable2;
-        this.table2 = table2;
-        this.mspOperator = mspOperator;
-    }
-
-    public AqlVariable getVariable1() {
-        return variable1;
-    }
-
-    public String getComparatorName() {
-        return comparatorName;
-    }
-
-    public AqlVariable getVariable2() {
-        return variable2;
-    }
-
-    public SqlTable getTable1() {
-        return table1;
-    }
-
-    public SqlTable getTable2() {
-        return table2;
-    }
-
-    public boolean isMspOperator() {
-        return mspOperator;
-    }
-
-    public List<AqlDomainEnum> getSubDomains() {
-        return subDomains;
-    }
-
-    public abstract String toSql(List<Object> params) throws AqlException;
-
-    @Override
-    public boolean isOperator() {
-        return false;
-    }
-
-    protected String a(AqlVariable variable1, SqlTable table1, boolean not) {
-        String nullRelation = not ? " is null " : " is not null ";
-        return " " + table1.getAlias() + toSql(variable1) + nullRelation;
-    }
-
-    protected String toSql(AqlVariable variable) {
-        if (variable instanceof AqlField) {
-            AqlFieldEnum fieldEnum = ((AqlField) variable).getFieldEnum();
-            AqlFieldExtensionEnum extension = AqlFieldExtensionEnum.getExtensionFor(fieldEnum);
-            return extension.tableField.name();
-        } else {
-            return "?";
-        }
-    }
-
-    protected Object resolveParam(AqlVariable variable) throws AqlException {
-        AqlValue value = (AqlValue) variable;
-        Object param = value.toObject();
-        AqlComparatorEnum comparatorEnum = AqlComparatorEnum.value(getComparatorName());
-        if (param != null &&
-                (AqlComparatorEnum.matches.equals(comparatorEnum) ||
-                        AqlComparatorEnum.notMatches.equals(comparatorEnum))) {
-            String modifiedValue = (String) param;
-            modifiedValue = modifiedValue.replace('*', '%');
-            modifiedValue = modifiedValue.replace('?', '_');
-            param = modifiedValue;
-        }
-        return param;
-    }
-
-    public String createSqlCriteria(AqlComparatorEnum comparatorEnum, AqlVariable variable1, SqlTable table1,
-            AqlVariable variable2, List<Object> params) {
-        Object param = resolveParam(variable2);
-        String index1 = table1 != null && variable1 instanceof AqlField ? table1.getAlias() : "";
-        switch (comparatorEnum) {
-            case equals: {
-                return generateEqualsQuery(variable1, variable2, params, param, index1);
-            }
-            case matches: {
-                return generateMatchQuery(variable1, variable2, params, param, index1);
-            }
-            case notMatches: {
-                return generateNotMatchQuery(variable1, variable2, params, param, index1);
-            }
-            case less: {
-                return generateLessThanQuery(variable1, variable2, params, param, index1);
-            }
-            case greater: {
-                return generateGreaterThanQuery(variable1, variable2, params, param, index1);
-            }
-            case greaterEquals: {
-                return generateGreaterEqualQuery(variable1, variable2, params, param, index1);
-            }
-            case lessEquals: {
-                return generateLessEqualsQuery(variable1, variable2, params, param, index1);
-            }
-            case notEquals: {
-                return generateNotEqualsQuery(variable1, variable2, params, param, index1);
-            }
-            default:
-                throw new IllegalStateException("Should not reach to the point of code");
-        }
-    }
-
-
-
-    protected String generateNotEqualsQuery(AqlVariable variable1, AqlVariable variable2, List<Object> params,
-            Object param, String index1) {
-        if (param != null) {
-            params.add(param);
-            return "(" + index1 + toSql(variable1) + " != " + toSql(variable2) + " or " + index1 + toSql(
-                    variable1) + " is null)";
-        } else {
-            return " " + index1 + toSql(variable1) + " is not null";
-        }
-    }
-
-    protected String generateLessEqualsQuery(AqlVariable variable1, AqlVariable variable2, List<Object> params,
-            Object param, String index1) {
-        validateNotNullParam(param);
-        params.add(param);
-        return " " + index1 + toSql(variable1) + " <= " + toSql(variable2);
-    }
-
-    protected String generateGreaterEqualQuery(AqlVariable variable1, AqlVariable variable2, List<Object> params,
-            Object param, String index1) {
-        validateNotNullParam(param);
-        params.add(param);
-        return " " + index1 + toSql(variable1) + " >= " + toSql(variable2);
-    }
-
-    protected String generateGreaterThanQuery(AqlVariable variable1, AqlVariable variable2, List<Object> params,
-            Object param, String index1) {
-        validateNotNullParam(param);
-        params.add(param);
-        return " " + index1 + toSql(variable1) + " > " + toSql(variable2);
-    }
-
-    protected String generateLessThanQuery(AqlVariable variable1, AqlVariable variable2, List<Object> params,
-            Object param, String index1) {
-        validateNotNullParam(param);
-        params.add(param);
-        return " " + index1 + toSql(variable1) + " < " + toSql(variable2);
-    }
-
-    protected String generateNotMatchQuery(AqlVariable variable1, AqlVariable variable2, List<Object> params,
-            Object param, String index1) {
-        validateNotNullParam(param);
-        params.add(param);
-        if (variable2 instanceof AqlField) {
-            throw new AqlToSqlQueryBuilderException(
-                    "Illegal syntax the 'not match' operator is allowed only with 'value' in right side of the criteria.");
-        }
-        return "(" + index1 + toSql(variable1) + " not like " + toSql(variable2) + " or " + index1 + toSql(
-                variable1) + " is null)";
-    }
-
-    protected String generateMatchQuery(AqlVariable variable1, AqlVariable variable2, List<Object> params, Object param,
-            String index1) {
-        validateNotNullParam(param);
-        params.add(param);
-        if (variable2 instanceof AqlField) {
-            throw new AqlToSqlQueryBuilderException(
-                    "Illegal syntax the 'match' operator is allowed only with 'value' in right side of the criteria.");
-        }
-        return " " + index1 + toSql(variable1) + " like " + toSql(variable2);
-    }
-
-    protected String generateEqualsQuery(AqlVariable variable1, AqlVariable variable2, List<Object> params, Object param,
-            String index1) {
-        if (param != null) {
-            params.add(param);
-            return " " + index1 + toSql(variable1) + " = " + toSql(variable2);
-        } else {
-            return " " + index1 + toSql(variable1) + " is null";
-        }
-    }
-
-    protected String generatePropertyNotMatchQuery(AqlVariable variable1, AqlVariable variable2, List<Object> params,
-            Object param, String index1) {
-        validateNotNullParam(param);
-        params.add(param);
-        if (variable2 instanceof AqlField) {
-            throw new AqlToSqlQueryBuilderException(
-                    "Illegal syntax the 'not match' operator is allowed only with 'value' in right side of the criteria.");
-        }
-        String tableName = table1.getTable().name();
-        String fieldName = node_props == table1.getTable() ? "node_id" :
-                build_props == table1.getTable() ? "build_id" : "module_id";
-        return "(" + index1 + fieldName + " is null or not exists (select 1 from " + tableName + " where " + index1 + "node_id = " + fieldName + " and " + toSql(
-                variable1) + " like " + toSql(variable2) + "))";
-    }
-
-    protected String generatePropertyNotEqualsQuery(AqlVariable variable1, AqlVariable variable2, List<Object> params,
-            Object param, String index1) {
-        String tableName = table1.getTable().name();
-        String fieldName = node_props == table1.getTable() ? "node_id" :
-                build_props == table1.getTable() ? "build_id" : "module_id";
-        if (param != null) {
-            params.add(param);
-            return "(" + index1 + fieldName + " is null or not exists (select 1 from " + tableName + " where " + index1 + fieldName + " = " + fieldName + " and " + toSql(
-                    variable1) + " = " + toSql(variable2) + "))";
-        } else {
-            return "(" + index1 + "node_id is null or not exists ( select 1 from node_props where " + index1 + fieldName + " = " + fieldName + " and " + toSql(
-                    variable1) + " is  null))";
-        }
-    }
-
-    protected void validateNotNullParam(Object param) {
-        if (param == null) {
-            throw new AqlToSqlQueryBuilderException(
-                    "Illegal syntax the 'null' values are allowed to use only with equals and not equals operators.\n");
-        }
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/MspAqlElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/MspAqlElement.java
deleted file mode 100644
index e374d76..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/MspAqlElement.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.aql;
-
-/**
- * Represent propery criteria which is actually two criterias:
- * "_property_key" "$equals" "<some_key>" "and" "_property_value" "$equals" "<some_value>"
- *
- * @author Gidi Shabat
- */
-public class MspAqlElement implements AqlQueryElement {
-    private int tableId;
-
-    public MspAqlElement(int tableId) {
-        this.tableId = tableId;
-    }
-
-    public int getTableId() {
-        return tableId;
-    }
-
-    @Override
-    public boolean isOperator() {
-        return false;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/OpenParenthesisAqlElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/OpenParenthesisAqlElement.java
deleted file mode 100644
index d35efad..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/OpenParenthesisAqlElement.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.aql;
-
-/**
- * @author Gidi Shabat
- */
-public class OpenParenthesisAqlElement implements AqlQueryElement {
-    @Override
-    public boolean isOperator() {
-        return false;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/OperatorQueryElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/OperatorQueryElement.java
deleted file mode 100644
index 50de1f0..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/OperatorQueryElement.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.aql;
-
-import org.artifactory.aql.model.AqlOperatorEnum;
-
-/**
- * @author Gidi Shabat
- */
-public class OperatorQueryElement implements AqlQueryElement {
-
-    private final AqlOperatorEnum operatorEnum;
-
-    public OperatorQueryElement(AqlOperatorEnum operatorEnum) {
-        this.operatorEnum = operatorEnum;
-    }
-
-    public AqlOperatorEnum getOperatorEnum() {
-        return operatorEnum;
-    }
-
-    @Override
-    public boolean isOperator() {
-        return true;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/ParserToAqlAdapter.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/ParserToAqlAdapter.java
deleted file mode 100644
index 29d0a78..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/ParserToAqlAdapter.java
+++ /dev/null
@@ -1,586 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.aql;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.AqlException;
-import org.artifactory.aql.model.*;
-import org.artifactory.storage.db.aql.parser.ParserElementResultContainer;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.storage.db.aql.parser.elements.high.level.basic.language.*;
-import org.artifactory.storage.db.aql.parser.elements.high.level.domain.sensitive.*;
-import org.artifactory.storage.db.aql.sql.builder.query.sql.AqlToSqlQueryBuilderException;
-import org.artifactory.util.Pair;
-import org.joda.time.DateTime;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-
-import static org.artifactory.aql.model.AqlFieldEnum.*;
-
-/**
- * Converts the parser results into AqlQuery
- *
- * @author Gidi Shabat
- */
-public class ParserToAqlAdapter extends AqlAdapter {
-    private final ResultFilterAqlElement resultFilter = new ResultFilterAqlElement();
-
-    /**
-     * Converts the parser results into AqlQuery
-     * @throws AqlException
-     */
-    public AqlQuery toAqlModel(ParserElementResultContainer parserResult) throws AqlException {
-        // Initialize the context
-        ParserToAqlAdapterContext context = new ParserToAqlAdapterContext(parserResult.getAll());
-        // Set the default operator that is being used if no other operator has been declared.
-        context.push(and);
-        // Resolve domain inf.
-        handleDomainFields(context);
-        // Resolve include fields info.
-        handleIncludeFields(context);
-        // Resolve sort info.
-        handleSort(context);
-        // Resolve limit info.
-        handleLimit(context);
-        // Resolve offset info.
-        handleOffset(context);
-        // Resolve Filter info
-        handleFilter(context);
-        // Add default filters
-        injectDefaultValues(context);
-        // Finally the AqlQuery is ready;
-        return context.getAqlQuery();
-    }
-
-    /**
-     * Converts the Criterias from the parser results into Aql criterias
-     */
-    private void handleFilter(ParserToAqlAdapterContext context) {
-        context.resetIndex();
-        while (context.hasNext()) {
-            Pair<ParserElement, String> element = context.getElement();
-            if (element.getFirst() instanceof EqualsCriteriaElement) {
-                handleCriteriaEquals(context);
-            }
-            if (element.getFirst() instanceof DefaultCriteriaElement) {
-                handleDefaultCriteria(context);
-            }
-            if (element.getFirst() instanceof CriteriaEqualsPropertyElement) {
-                handleEqualsCriteriaProperty(context);
-            }
-            if (element.getFirst() instanceof CriteriaEqualsKeyPropertyElement) {
-                handleEqualsKeyCriteriaProperty(context);
-            }
-            if (element.getFirst() instanceof CriteriaEqualsValuePropertyElement) {
-                handleEqualsValueCriteriaProperty(context);
-            }
-            if (element.getFirst() instanceof CriteriaKeyPropertyElement) {
-                handleKeyCriteriaProperty(context);
-            }
-            if (element.getFirst() instanceof CriteriaValuePropertyElement) {
-                handleValueCriteriaProperty(context);
-            }
-            if (element.getFirst() instanceof CriteriaDefaultPropertyElement) {
-                handleDefaultCriteriaProperty(context);
-            }
-            if (element.getFirst() instanceof FunctionElement) {
-                handleFunction(context);
-            }
-            if (element.getFirst() instanceof CloseParenthesisElement) {
-                handleCloseParenthesis(context);
-            }
-            if (element.getFirst() instanceof OpenParenthesisElement) {
-                handleOpenParenthesis(context);
-            }
-            if (element.getFirst() instanceof CriteriaRelativeDateElement) {
-                handleRelativeDateCriteria(context);
-            }
-            if (element.getFirst() instanceof SectionEndElement ||
-                    element.getFirst() instanceof IncludeTypeElement) {
-                return;
-            }
-            // Promote element
-            context.decrementIndex(1);
-        }
-    }
-
-    private void handleOpenParenthesis(ParserToAqlAdapterContext context) {
-        // Add parenthesis element to the AqlQuery
-        context.addAqlQueryElements(open);
-    }
-
-    private void handleIncludeFields(ParserToAqlAdapterContext context) {
-        // Initialize the context
-        gotoElement(IncludeExtensionElement.class, context);
-        if (!context.hasNext()) {
-            return;
-        }
-        // Scan all the include domain anf fields
-        context.decrementIndex(1);
-        boolean first = false;
-        // Prepare the context for include property filter do not worry about empty parenthesis because the AqlOptimizer will clean it
-        context.push(or);
-        context.push(resultFilter);
-        context.addAqlQueryElements(open);
-        while (!(context.getElement().getFirst() instanceof SectionEndElement)) {
-            // Resolve the field sub domains
-            List<AqlDomainEnum> subDomains = resolveSubDomains(context);
-            if (context.getElement().getFirst() instanceof RealFieldElement) {
-                // Extra field
-                first = handleIncludeExtraField(context, first, subDomains);
-            } else if (context.getElement().getFirst() instanceof IncludeDomainElement ||
-                    context.getElement().getFirst() instanceof EmptyIncludeDomainElement) {
-                // Extra domain
-                handleIncludeDomain(context, subDomains);
-            } else {
-                //Extra property result filter
-                handleIncludePropertyKeyFilter(context, subDomains);
-            }
-        }
-        context.addAqlQueryElements(close);
-        context.pop();
-        context.pop();
-    }
-
-    /**
-     * If the extra field belongs to the main query domain then remove all the default fields and add only the fields from
-     * the include section.
-     * If the extra field doesn't belongs to the main domain then just add the field to the result fields.
-     */
-    private boolean handleIncludeExtraField(ParserToAqlAdapterContext context, boolean overrideFields,
-            List<AqlDomainEnum> subDomains) {
-        // If the extra field belongs to the main domain then remove all the default fields ()
-        if (!overrideFields && subDomains.size() == 1) {
-            AqlDomainEnum mainDomain = subDomains.get(0);
-            List<DomainSensitiveField> resultFields = context.getResultFields();
-            Iterator<DomainSensitiveField> iterator = resultFields.iterator();
-            while (iterator.hasNext()) {
-                DomainSensitiveField next = iterator.next();
-                AqlDomainEnum aqlDomainEnum = AqlDomainEnum.valueOf(next.getField().domainName);
-                if (aqlDomainEnum.equals(mainDomain)) {
-                    iterator.remove();
-                }
-            }
-            overrideFields = true;
-        }
-        AqlFieldEnum aqlField = resolveField(context);
-        DomainSensitiveField field = new DomainSensitiveField(aqlField, subDomains);
-        context.addField(field);
-        context.decrementIndex(1);
-        return overrideFields;
-    }
-
-    /**
-     * Special case for properties that allows to  add property key to return specific property
-     */
-    private void handleIncludePropertyKeyFilter(ParserToAqlAdapterContext context, List<AqlDomainEnum> subDomains) {
-        AqlDomainEnum aqlDomainEnum = subDomains.get(subDomains.size()-1);
-        AqlFieldEnum propKeyField=null;
-        AqlFieldEnum propValueField=null;
-        switch (aqlDomainEnum){
-            case properties:propKeyField=propertyKey;propValueField=propertyValue;break;
-            case moduleProperties:propKeyField=modulePropertyKey;propValueField=modulePropertyValue;break;
-            case buildProperties:propKeyField=buildPropertyKey;propValueField=buildPropertyValue;break;
-        }
-        context.addField(new DomainSensitiveField(propKeyField, subDomains));
-        context.addField(new DomainSensitiveField(propValueField, subDomains));
-        String value = context.getElement().getSecond();
-        AqlComparatorEnum comparatorEnum = AqlComparatorEnum.equals;
-        // Only if the user has specify property key to filter then add the filter else just add the fields.
-        if (!"*".equals(value)) {
-            Criteria criteria = createSimpleCriteria(subDomains, propKeyField, value, comparatorEnum,
-                    context);
-            addCriteria(context, criteria);
-        }
-        context.decrementIndex(1);
-    }
-
-    /**
-     * Allows to add the domain fields to the result fields
-     */
-    private void handleIncludeDomain(ParserToAqlAdapterContext context, List<AqlDomainEnum> subDomains) {
-        DomainProviderElement element = (DomainProviderElement) context.getElement().getFirst();
-        AqlDomainEnum aqlDomainEnum = element.getDomain();
-        AqlFieldEnum[] fieldByDomain = AqlFieldEnum.getFieldByDomain(aqlDomainEnum);
-        for (AqlFieldEnum aqlFieldEnum : fieldByDomain) {
-            boolean alreadyExist = false;
-            for (DomainSensitiveField domainSensitiveField : context.getResultFields()) {
-                if(domainSensitiveField.getField() == aqlFieldEnum){
-                    alreadyExist=true;
-                }
-            }
-            if( ! alreadyExist) {
-                context.addField(new DomainSensitiveField(aqlFieldEnum, subDomains));
-            }
-        }
-        context.decrementIndex(1);
-    }
-
-    /**
-     * Allows to add limit to the query in order to limit the number of rows returned
-     */
-    private void handleLimit(ParserToAqlAdapterContext context) {
-        gotoElement(LimitValueElement.class, context);
-        if (!context.hasNext()) {
-            return;
-        }
-        // Get the limit value from the element and set it in the context (AqlQuery)
-        Pair<ParserElement, String> element = context.getElement();
-        int limit = Double.valueOf(element.getSecond()).intValue();
-        context.setLimit(limit);
-    }
-
-
-    /**
-     * Allows to add limit to the query in order to limit the number of rows returned
-     */
-    private void handleOffset(ParserToAqlAdapterContext context) {
-        gotoElement(OffsetValueElement.class, context);
-        if (!context.hasNext()) {
-            return;
-        }
-        // Get the limit value from the element and set it in the context (AqlQuery)
-        Pair<ParserElement, String> element = context.getElement();
-        int offset = Double.valueOf(element.getSecond()).intValue();
-        context.setOffset(offset);
-    }
-
-    private void handleCloseParenthesis(ParserToAqlAdapterContext context) {
-        // Pop operator from operator queue
-        context.pop();
-        // Push close parenthesis element to context (AqlQuery)
-        context.addAqlQueryElements(close);
-    }
-
-    /**
-     * Handles operator "and"/"or" operators and the "freezJon"/"resultFields" functions
-     */
-    private void handleFunction(ParserToAqlAdapterContext context) {
-        Pair<ParserElement, String> element = context.getElement();
-        AqlOperatorEnum function = AqlOperatorEnum.value(element.getSecond());
-        // Add leading operator if needed
-        addOperatorToAqlQueryElements(context);
-        if (AqlOperatorEnum.freezeJoin == function) {
-            // In case of freeze join function generate new alias index for the properties tables
-            // All the criterias that uses property table inside the function will use the same table.
-            // Push freezeJoin to the operators queue
-            context.push(new MspAqlElement(context.provideIndex()));
-        } else if (AqlOperatorEnum.and == function) {
-            // Push or and the operators queue
-            context.push(and);
-        } else if (AqlOperatorEnum.or == function) {
-            // Push or to the operators queue
-            context.push(or);
-        } else if (AqlOperatorEnum.resultFilter == function) {
-            // Push or to the operators queue
-            context.push(resultFilter);
-        }
-    }
-
-
-    private void handleCriteriaEquals(ParserToAqlAdapterContext context) throws AqlException {
-        // Remove element from parser result elements
-        context.decrementIndex(1);
-        // Get the field sub domains
-        List<AqlDomainEnum> subDomain = resolveSubDomains(context);
-        // Get the criteria first variable
-        AqlFieldEnum aqlField = resolveField(context);
-        // Remove element from parser result elements
-        context.decrementIndex(1);
-        // Get the criteria second variable
-        String variable = resolveVariable(context);
-        // Create equals criteria
-        if (AqlFieldEnum.propertyKey == aqlField || AqlFieldEnum.propertyValue == aqlField||
-                AqlFieldEnum.modulePropertyKey == aqlField || AqlFieldEnum.modulePropertyValue == aqlField||
-                AqlFieldEnum.buildPropertyKey == aqlField || AqlFieldEnum.buildPropertyValue == aqlField) {
-            Criteria criteria = createSimplePropertyCriteria(subDomain, aqlField, variable, AqlComparatorEnum.equals,
-                    context);
-            addCriteria(context, criteria);
-        } else {
-            Criteria criteria = createSimpleCriteria(subDomain, aqlField, variable, AqlComparatorEnum.equals, context);
-            addCriteria(context, criteria);
-        }
-    }
-
-    private void handleDefaultCriteria(ParserToAqlAdapterContext context) throws AqlException {
-        // Remove element from parser result elements
-        context.decrementIndex(1);
-        // Get the field sub domains
-        List<AqlDomainEnum> subDomains = resolveSubDomains(context);
-        // Get the criteria first field
-        AqlFieldEnum aqlField = resolveField(context);
-        // Remove element from parser result elements
-        context.decrementIndex(1);
-        // Get the criteria comparator
-        AqlComparatorEnum comparatorEnum = AqlComparatorEnum.value(context.getElement().getSecond());
-        // Remove element from parser result elements
-        context.decrementIndex(1);
-        // Get the criteria second variable
-        String name2 = resolveVariable(context);
-        // Create criteria
-        if (AqlFieldEnum.propertyKey == aqlField || AqlFieldEnum.propertyValue == aqlField||
-                AqlFieldEnum.buildPropertyKey == aqlField || AqlFieldEnum.buildPropertyValue == aqlField||
-                AqlFieldEnum.modulePropertyKey == aqlField || AqlFieldEnum.modulePropertyValue == aqlField) {
-            Criteria criteria = createSimplePropertyCriteria(subDomains, aqlField, name2, comparatorEnum, context);
-            addCriteria(context, criteria);
-        } else {
-            Criteria criteria = createSimpleCriteria(subDomains, aqlField, name2, comparatorEnum, context);
-            addCriteria(context, criteria);
-        }
-    }
-
-    private void handleRelativeDateCriteria(ParserToAqlAdapterContext context) {
-        // Remove element from parser result elements
-        context.decrementIndex(1);
-        // Get the field sub domains
-        List<AqlDomainEnum> subDomains = resolveSubDomains(context);
-        // Get the criteria first field
-        AqlFieldEnum aqlField = resolveField(context);
-        // Remove element from parser result elements
-        context.decrementIndex(1);
-        // Get the criteria comparator
-        AqlRelativeDateComparatorEnum relativeDateComparatorEnum = AqlRelativeDateComparatorEnum.value(context.getElement().getSecond());
-        AqlComparatorEnum aqlComparatorEnum = relativeDateComparatorEnum.aqlComparatorEnum;
-        // Remove element from parser result elements
-        context.decrementIndex(1);
-        // Get the criteria second variable
-        String name2 = resolveVariable(context);
-        long dateLong = relativeDateComparatorEnum.toDate(name2);
-        if(dateLong<0){
-            throw new AqlException("Invalid relative date format for: "+name2);
-        }
-        String date = ""+ dateLong;
-        // Create criteria
-        Criteria criteria = createSimpleCriteria(subDomains, aqlField, date, aqlComparatorEnum, context);
-        addCriteria(context, criteria);
-    }
-
-    private String resolveVariable(ParserToAqlAdapterContext context) {
-        String second = context.getElement().getSecond();
-        if ("null".equals(second.toLowerCase()) && context.getElement().getFirst() instanceof NullElement) {
-            second = null;
-        }
-        return second;
-    }
-
-    private void handleDefaultCriteriaProperty(ParserToAqlAdapterContext context)
-            throws AqlException {
-        // Remove element from parser result elements
-        context.decrementIndex(1);
-        // Get the field sub domains
-        List<AqlDomainEnum> subDomains = resolveSubDomains(context);
-        // Get the criteria first variable
-        String name1 = context.getElement().getSecond();
-        // Remove element from parser result elements
-        context.decrementIndex(1);
-        // Get the criteria comparator
-        AqlComparatorEnum comparatorEnum = AqlComparatorEnum.value(context.getElement().getSecond());
-        // Remove element from parser result elements
-        context.decrementIndex(1);
-        // Get the criteria second variable
-        String name2 = context.getElement().getSecond();
-        // Create criteria
-        boolean mspOperator = getMspOperator(context) != null;
-        Criteria criteria = createComplexPropertyCriteria(subDomains, name1, name2, comparatorEnum, context,mspOperator);
-        addCriteria(context, criteria);
-    }
-
-    private void handleKeyCriteriaProperty(ParserToAqlAdapterContext context)
-            throws AqlException {
-        // Remove element from parser result elements
-        context.decrementIndex(1);
-        // Get the field sub domains
-        List<AqlDomainEnum> subDomains = resolveSubDomains(context);
-        // Get the criteria first variable
-        String name1 = context.getElement().getSecond();
-        // Remove element from parser result elements
-        context.decrementIndex(1);
-        // Get the criteria comparator
-        AqlComparatorEnum comparatorEnum = AqlComparatorEnum.value(context.getElement().getSecond());
-        // Remove element from parser result elements
-        context.decrementIndex(1);
-        AqlDomainEnum aqlDomainEnum = subDomains.get(subDomains.size()-1);
-        AqlFieldEnum propKeyField=null;
-        switch (aqlDomainEnum){
-            case properties:propKeyField=propertyKey;break;
-            case moduleProperties:propKeyField=modulePropertyKey;break;
-            case buildProperties:propKeyField=buildPropertyKey;break;
-        }
-        // Create criteria
-        Criteria criteria = createSimplePropertyCriteria(subDomains, propKeyField, name1, comparatorEnum, context);
-        addCriteria(context, criteria);
-    }
-
-    private void handleValueCriteriaProperty(ParserToAqlAdapterContext context)
-            throws AqlException {
-        // Remove element from parser result elements
-        context.decrementIndex(1);
-        // Get the field sub domains
-        List<AqlDomainEnum> subDomains = resolveSubDomains(context);
-        // Get the criteria first variable
-        context.decrementIndex(1);
-        // Get the criteria comparator
-        AqlComparatorEnum comparatorEnum = AqlComparatorEnum.value(context.getElement().getSecond());
-        // Remove element from parser result elements
-        context.decrementIndex(1);
-        // Get the criteria second variable
-        String name2 = context.getElement().getSecond();
-        AqlDomainEnum aqlDomainEnum = subDomains.get(subDomains.size()-1);
-        AqlFieldEnum propValueField=null;
-        switch (aqlDomainEnum){
-            case properties:propValueField=propertyValue;break;
-            case moduleProperties:propValueField=modulePropertyValue;break;
-            case buildProperties:propValueField=buildPropertyValue;break;
-        }
-        // Create criteria
-        Criteria criteria = createSimplePropertyCriteria(subDomains, propValueField, name2, comparatorEnum, context);
-        addCriteria(context, criteria);
-    }
-
-    private void handleEqualsCriteriaProperty(ParserToAqlAdapterContext context)
-            throws AqlException {
-
-        // Remove element from parser result elements
-        context.decrementIndex(1);
-        // Get the field sub domains
-        List<AqlDomainEnum> subDomains = resolveSubDomains(context);
-        // Get the criteria first variable
-        String name1 = context.getElement().getSecond();
-        // Remove element from parser result elements
-        context.decrementIndex(1);
-        // Get the criteria second variable
-        String name2 = context.getElement().getSecond();
-        // Create equals criteria
-        boolean mspOperator = getMspOperator(context) != null;
-        Criteria criteria = createComplexPropertyCriteria(subDomains, name1, name2, AqlComparatorEnum.equals, context, mspOperator);
-        addCriteria(context, criteria);
-    }
-
-    private void handleEqualsKeyCriteriaProperty(ParserToAqlAdapterContext context)
-            throws AqlException {
-
-        // Remove element from parser result elements
-        context.decrementIndex(1);
-        // Get the field sub domains
-        List<AqlDomainEnum> subDomains = resolveSubDomains(context);
-        // Get the criteria first variable
-        String name1 = context.getElement().getSecond();
-        // Remove element from parser result elements
-        context.decrementIndex(1);
-        AqlDomainEnum aqlDomainEnum = subDomains.get(subDomains.size()-1);
-        AqlFieldEnum propKeyField=null;
-        switch (aqlDomainEnum){
-            case properties:propKeyField=propertyKey;break;
-            case moduleProperties:propKeyField=modulePropertyKey;break;
-            case buildProperties:propKeyField=buildPropertyKey;break;
-        }
-        // Create equals criteria
-        Criteria criteria = createSimplePropertyCriteria(subDomains, propKeyField, name1, AqlComparatorEnum.equals,
-                context);
-        addCriteria(context, criteria);
-    }
-
-    private void handleEqualsValueCriteriaProperty(ParserToAqlAdapterContext context)
-            throws AqlException {
-
-        // Remove element from parser result elements
-        context.decrementIndex(1);
-        // Get the field sub domains
-        List<AqlDomainEnum> subDomains = resolveSubDomains(context);
-        // Remove element from parser result elements
-        context.decrementIndex(1);
-        // Get the criteria second variable
-        String name2 = context.getElement().getSecond();
-        AqlDomainEnum aqlDomainEnum = subDomains.get(subDomains.size()-1);
-        AqlFieldEnum propValueField=null;
-        switch (aqlDomainEnum){
-            case properties:propValueField=propertyValue;break;
-            case moduleProperties:propValueField=modulePropertyValue;break;
-            case buildProperties:propValueField=buildPropertyValue;break;
-        }
-        // Create equals criteria
-        Criteria criteria = createSimplePropertyCriteria(subDomains, propValueField, name2, AqlComparatorEnum.equals,
-                context);
-        addCriteria(context, criteria);
-    }
-
-    private void handleSort(ParserToAqlAdapterContext context) throws AqlToSqlQueryBuilderException {
-        gotoElement(SortTypeElement.class, context);
-        if (!context.hasNext()) {
-            return;
-        }
-        // Resolve the sortType from the element
-        Pair<ParserElement, String> element = context.getElement();
-        AqlSortTypeEnum sortTypeEnum = AqlSortTypeEnum.fromAql(element.getSecond());
-        SortDetails sortDetails = new SortDetails();
-        // Remove two elements from parser result elements
-        context.decrementIndex(2);
-        Pair<ParserElement, String> currentElement = context.getElement();
-        // Get all the sort elements from the following parser elements
-        while (!(currentElement.getFirst() instanceof CloseParenthesisElement)) {
-            // Resolve the sub domains just to increment the pointer to the field position
-            resolveSubDomains(context);
-            AqlFieldEnum field = resolveField(context);
-            // Remove element from parser result elements
-            context.decrementIndex(1);
-            sortDetails.addField(field);
-            // Get the current element;
-            currentElement = context.getElement();
-        }
-        sortDetails.setSortType(sortTypeEnum);
-        // Set the sort details in the context (AqlQuery)
-        context.setSort(sortDetails);
-    }
-
-    private List<AqlDomainEnum> resolveSubDomains(ParserToAqlAdapterContext context) {
-        Pair<ParserElement, String> element = context.getElement();
-        List<AqlDomainEnum> list = Lists.newArrayList();
-        while (!(element.getFirst() instanceof RealFieldElement || element.getFirst() instanceof ValueElement ||
-                element.getFirst() instanceof StarElement ||
-                element.getFirst() instanceof IncludeDomainElement
-                || element.getFirst() instanceof EmptyIncludeDomainElement)) {
-            list.add(((DomainProviderElement) element.getFirst()).getDomain());
-            context.decrementIndex(1);
-            element = context.getElement();
-        }
-        if (element.getFirst() instanceof EmptyIncludeDomainElement) {
-            list.add(((DomainProviderElement) element.getFirst()).getDomain());
-        }
-        return list;
-    }
-
-    private AqlFieldEnum resolveField(ParserToAqlAdapterContext context) {
-        Pair<ParserElement, String> element = context.getElement();
-        String fieldName = element.getSecond();
-        AqlDomainEnum domain = ((DomainProviderElement) context.getElement().getFirst()).getDomain();
-        return AqlFieldEnum.resolveFieldBySignatureAndDomain(fieldName, domain);
-    }
-
-
-    private void handleDomainFields(ParserToAqlAdapterContext context) {
-        // resolve the result fields from the domain and add the field to the context (AqlQuery)
-        gotoElement(DomainElement.class, context);
-        context.decrementIndex(1);
-        Pair<ParserElement, String> element = context.getElement();
-        ArrayList<String> subdomains = Lists.newArrayList();
-        while (element.getFirst() instanceof DomainSubPathElement) {
-            subdomains.add(element.getSecond());
-            context.decrementIndex(1);
-            element = context.getElement();
-        }
-        AqlDomainEnum domain = AqlDomainEnum.valueFromSubDomains(subdomains);
-        context.setDomain(domain);
-        for (AqlFieldEnum field : domain.fields) {
-            context.addField(new DomainSensitiveField(field, Lists.newArrayList(domain)));
-        }
-    }
-
-    private void gotoElement(Class<? extends ParserElement> domainElementClass, ParserToAqlAdapterContext context) {
-        context.resetIndex();
-        while (context.hasNext() &&
-                (!context.getElement().getFirst().getClass().equals(domainElementClass))) {
-            context.decrementIndex(1);
-        }
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/ParserToAqlAdapterContext.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/ParserToAqlAdapterContext.java
deleted file mode 100644
index a24d5d6..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/ParserToAqlAdapterContext.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.aql;
-
-import com.google.common.collect.Lists;
-import org.artifactory.storage.db.aql.parser.elements.ParserElement;
-import org.artifactory.util.Pair;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class ParserToAqlAdapterContext extends AdapterContext {
-    private int index;
-    private List<Pair<ParserElement, String>> elements = Lists.newArrayList();
-
-    public ParserToAqlAdapterContext(List<Pair<ParserElement, String>> elements) {
-        this.elements = elements;
-        index = elements.size() - 1;
-    }
-
-    public Pair<ParserElement, String> getElement() {
-        return elements.get(index);
-    }
-
-    public void decrementIndex(int i) {
-        index = index - i;
-    }
-
-    public int getIndex() {
-        return index;
-    }
-
-    public void resetIndex() {
-        index = elements.size() - 1;
-    }
-
-    public boolean hasNext() {
-        return index >= 0;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/ResultFilterAqlElement.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/ResultFilterAqlElement.java
deleted file mode 100644
index 7f2b407..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/ResultFilterAqlElement.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.aql;
-
-/**
- * @author Gidi Shabat
- */
-public class ResultFilterAqlElement implements AqlQueryElement {
-
-    @Override
-    public boolean isOperator() {
-        return false;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/SimpleCriteria.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/SimpleCriteria.java
deleted file mode 100644
index 44b537a..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/SimpleCriteria.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.aql;
-
-import org.artifactory.aql.AqlException;
-import org.artifactory.aql.model.AqlComparatorEnum;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlVariable;
-import org.artifactory.storage.db.aql.sql.builder.query.sql.SqlTable;
-
-import java.util.List;
-
-/**
- * This class represent simple criteria which contains field comparator and value
- * For example "_artifact_repo" "$equals" "libs-release-local"
- *
- * @author Gidi Shabat
- */
-public class SimpleCriteria extends Criteria {
-
-    public SimpleCriteria(List<AqlDomainEnum> subDomains, AqlVariable variable1, SqlTable table1, String comparatorName,
-            AqlVariable variable2, SqlTable table2,boolean mspOperator) {
-        super(subDomains, variable1, table1, comparatorName, variable2, table2,mspOperator);
-    }
-
-    /**
-     * Convert simpleCriteria to sql criteria
-     *
-     */
-    @Override
-    public String toSql(List<Object> params) throws AqlException {
-        // Get both variable which are Field and Value (this is simple criteria)
-        AqlVariable variable1 = getVariable1();
-        AqlVariable variable2 = getVariable2();
-        // Get both tables which are same and equals to the Field table
-        SqlTable table1 = getTable1();
-        SqlTable table2 = getTable2();
-        // Add the variables to the input params if needed
-        // Convert criteria into Sql
-        AqlComparatorEnum comparatorEnum = AqlComparatorEnum.value(getComparatorName());
-        return createSqlCriteria(comparatorEnum, variable1, table1, variable2, params);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/SimplePropertyCriteria.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/SimplePropertyCriteria.java
deleted file mode 100644
index 33e36a1..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/SimplePropertyCriteria.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.aql;
-
-import org.artifactory.aql.AqlException;
-import org.artifactory.aql.model.AqlComparatorEnum;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlField;
-import org.artifactory.aql.model.AqlVariable;
-import org.artifactory.storage.db.aql.sql.builder.query.sql.SqlTable;
-
-import java.util.List;
-
-/**
- * This class represent simple criteria which contains field comparator and value
- * For example "_artifact_repo" "$equals" "libs-release-local"
- *
- * @author Gidi Shabat
- */
-public class SimplePropertyCriteria extends Criteria {
-
-    public SimplePropertyCriteria(List<AqlDomainEnum> subDomains, AqlVariable variable1, SqlTable table1,
-            String comparatorName, AqlVariable variable2, SqlTable table2, boolean mspOperator) {
-        super(subDomains, variable1, table1, comparatorName, variable2, table2,mspOperator);
-    }
-
-    /**
-     * Convert simpleCriteria to sql criteria
-     *
-     * @throws org.artifactory.aql.AqlException
-     */
-    @Override
-    public String toSql(List<Object> params) throws AqlException {
-        // Get both variable which are Field and Value (this is simple criteria)
-        AqlVariable variable1 = getVariable1();
-        AqlVariable variable2 = getVariable2();
-        // Get both tables which are same and equals to the Field table
-        SqlTable table1 = getTable1();
-        // Add the variables to the input params if needed
-        // Convert criteria into Sql
-        AqlComparatorEnum comparatorEnum = AqlComparatorEnum.value(getComparatorName());
-        return createSqlPropertyCriteria(comparatorEnum, variable1, table1, variable2, params);
-    }
-
-    public String createSqlPropertyCriteria(AqlComparatorEnum comparatorEnum, AqlVariable variable1, SqlTable table1,
-                                            AqlVariable variable2, List<Object> params) {
-        Object param = resolveParam(variable2);
-        String index1 = table1 != null && variable1 instanceof AqlField ? table1.getAlias() : "";
-        switch (comparatorEnum) {
-            case equals: {
-                return generateEqualsQuery(variable1, variable2, params, param, index1);
-            }
-            case matches: {
-                return generateMatchQuery(variable1, variable2, params, param, index1);
-            }
-            case notMatches: {
-                if(isMspOperator()) {
-                    return generateNotMatchQuery(variable1, variable2, params, param, index1);
-                }else {
-                    return generatePropertyNotMatchQuery(variable1, variable2, params, param, index1);
-                }
-            }
-            case less: {
-                return generateLessThanQuery(variable1, variable2, params, param, index1);
-            }
-            case greater: {
-                return generateGreaterThanQuery(variable1, variable2, params, param, index1);
-            }
-            case greaterEquals: {
-                return generateGreaterEqualQuery(variable1, variable2, params, param, index1);
-            }
-            case lessEquals: {
-                return generateLessEqualsQuery(variable1, variable2, params, param, index1);
-            }
-            case notEquals: {
-                if(isMspOperator()) {
-                    return generateNotEqualsQuery(variable1, variable2, params, param, index1);
-                }else {
-                    return generatePropertyNotEqualsQuery(variable1, variable2, params, param, index1);
-                }
-            }
-            default:
-                throw new IllegalStateException("Should not reach to the point of code");
-        }
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/SortDetails.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/SortDetails.java
deleted file mode 100644
index cf7152e..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/aql/SortDetails.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.aql;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.model.AqlSortTypeEnum;
-
-import java.util.List;
-
-/**
- * Contains the sort info in the AqlQuery
- *
- * @author Gidi Shabat
- */
-public class SortDetails {
-    private AqlSortTypeEnum sortType;
-    private List<AqlFieldEnum> list = Lists.newArrayList();
-
-    public void addField(AqlFieldEnum fieldEnum) {
-        list.add(fieldEnum);
-    }
-
-    public void setSortType(AqlSortTypeEnum sortType) {
-        this.sortType = sortType;
-    }
-
-    public List<AqlFieldEnum> getFields() {
-        return list;
-    }
-
-    public AqlSortTypeEnum getSortType() {
-        return sortType;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/AqlToSqlQueryBuilderException.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/AqlToSqlQueryBuilderException.java
deleted file mode 100644
index 603a623..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/AqlToSqlQueryBuilderException.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.sql;
-
-import org.artifactory.aql.AqlException;
-
-/**
- * This exception is being thrown in case of failure in the aqlQuery to sqlQuery conversion.
- *
- * @author Gidi Shabat
- */
-public class AqlToSqlQueryBuilderException extends AqlException {
-    public AqlToSqlQueryBuilderException(String message) {
-        super(message);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/SqlQuery.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/SqlQuery.java
deleted file mode 100644
index 3d04c59..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/SqlQuery.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.sql;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.DomainSensitiveField;
-
-import java.util.List;
-
-/**
- * The class represent Sql query, it also contains some simple convenient methods that helps to build the query
- *
- * @author Gidi Shabat
- */
-public class SqlQuery {
-    private String query = "";
-    private List<Object> params = Lists.newArrayList();
-    private List<DomainSensitiveField> resultFields;
-    private long limit;
-    private long offset;
-    private AqlDomainEnum domain;
-
-    public SqlQuery(AqlDomainEnum domain) {
-        this.domain = domain;
-    }
-
-    public Object[] getQueryParams() {
-        Object[] objects = new Object[params.size()];
-        return params.toArray(objects);
-    }
-
-    public String getQueryString() {
-        return query;
-    }
-
-    @Override
-    public String toString() {
-        return "SqlQuery{" +
-                "query='" + query + '\'' +
-                ", params=" + params +
-                '}';
-    }
-
-    public List<DomainSensitiveField> getResultFields() {
-        return resultFields;
-    }
-
-    public void setResultFields(List<DomainSensitiveField> resultFields) {
-        this.resultFields = resultFields;
-    }
-
-    public long getLimit() {
-        return limit;
-    }
-
-    public void setLimit(long limit) {
-        this.limit = limit;
-    }
-
-    public long getOffset() {
-        return offset;
-    }
-
-    public void setOffset(long offset) {
-        this.offset = offset;
-    }
-
-    public AqlDomainEnum getDomain() {
-        return domain;
-    }
-
-    public void setParams(List<Object> params) {
-        this.params = params;
-    }
-
-    public void setQuery(String query) {
-        this.query = query;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/SqlQueryBuilder.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/SqlQueryBuilder.java
deleted file mode 100644
index e364207..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/SqlQueryBuilder.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.sql;
-
-import com.google.common.collect.Maps;
-import org.artifactory.aql.AqlException;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.storage.db.aql.sql.builder.query.aql.AqlQuery;
-import org.artifactory.storage.db.aql.sql.builder.query.aql.AqlQueryElement;
-import org.artifactory.storage.db.aql.sql.builder.query.aql.Criteria;
-import org.artifactory.storage.db.aql.sql.builder.query.sql.type.*;
-import org.artifactory.storage.db.util.querybuilder.QueryWriter;
-import org.artifactory.util.Pair;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * The Class converts AqlQuery into sql query
- * Basically the query is ANSI SQL except the limit and the offset
- *
- * @author Gidi Shabat
- */
-public class SqlQueryBuilder {
-    private Map<AqlDomainEnum, BasicSqlGenerator> sqlGeneratorMap;
-
-    public SqlQueryBuilder() {
-        sqlGeneratorMap = Maps.newHashMap();
-        sqlGeneratorMap.put(AqlDomainEnum.items, new ArtifactsSqlGenerator());
-        sqlGeneratorMap.put(AqlDomainEnum.properties, new PropertiesSqlGenerator());
-        sqlGeneratorMap.put(AqlDomainEnum.archives, new ArchiveSqlGenerator());
-        sqlGeneratorMap.put(AqlDomainEnum.entries, new ArchiveEntrySqlGenerator());
-        sqlGeneratorMap.put(AqlDomainEnum.statistics, new StatisticsSqlGenerator());
-        sqlGeneratorMap.put(AqlDomainEnum.artifacts, new BuildArtifactSqlGenerator());
-        sqlGeneratorMap.put(AqlDomainEnum.dependencies, new BuildDependenciesSqlGenerator());
-        sqlGeneratorMap.put(AqlDomainEnum.modules, new BuildModuleSqlGenerator());
-        sqlGeneratorMap.put(AqlDomainEnum.moduleProperties, new BuildModulePropertySqlGenerator());
-        sqlGeneratorMap.put(AqlDomainEnum.buildProperties, new BuildPropertySqlGenerator());
-        sqlGeneratorMap.put(AqlDomainEnum.buildPromotions, new BuildsPromotionsSqlGeneratot());
-        sqlGeneratorMap.put(AqlDomainEnum.builds, new BuildSqlGenerator());
-    }
-
-    private static boolean isWhereClauseExist(AqlQuery aqlQuery) {
-        List<AqlQueryElement> elements = aqlQuery.getAqlElements();
-        for (AqlQueryElement element : elements) {
-            if (element instanceof Criteria) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public SqlQuery buildQuery(AqlQuery aqlQuery) throws AqlException {
-        QueryWriter queryWriter = new QueryWriter();
-        SqlQuery sqlQuery = new SqlQuery(aqlQuery.getDomain());
-        AqlDomainEnum domainEnum = aqlQuery.getDomain();
-        BasicSqlGenerator generator = sqlGeneratorMap.get(domainEnum);
-        generateSqlQuery(aqlQuery, generator, sqlQuery, queryWriter);
-        sqlQuery.setResultFields(aqlQuery.getResultFields());
-        sqlQuery.setLimit(aqlQuery.getLimit());
-        sqlQuery.setOffset(aqlQuery.getOffset());
-        return sqlQuery;
-    }
-
-    private void generateSqlQuery(AqlQuery aqlQuery, BasicSqlGenerator handler, SqlQuery query, QueryWriter queryWriter)
-            throws AqlException {
-        // Generate the result part of the query
-        queryWriter.select(handler.results(aqlQuery));
-        queryWriter.distinct();
-        // Generate the from part of the query
-        queryWriter.from(handler.tables(aqlQuery));
-        // Add where clause if needed
-        boolean whereClause = SqlQueryBuilder.isWhereClauseExist(aqlQuery);
-        if (whereClause) {
-            Pair<String, List<Object>> filter = handler.conditions(aqlQuery);
-            queryWriter.where(filter.getFirst());
-            query.setParams(filter.getSecond());
-        }
-        // Generate the sort part of the query
-        String sort = handler.sort(aqlQuery);
-        if (sort != null) {
-            queryWriter.orderBy(sort);
-        }
-        // Generate offset and limit
-        long offset = aqlQuery.getOffset();
-        long limit = aqlQuery.getLimit();
-        queryWriter.offset(offset);
-        queryWriter.limit(limit);
-        query.setQuery(queryWriter.build());
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/SqlTable.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/SqlTable.java
deleted file mode 100644
index 6a70a50..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/SqlTable.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.sql;
-
-import org.artifactory.storage.db.aql.sql.model.SqlTableEnum;
-
-/**
- * The class represent table in the query.
- * It actually contains the table name and alias name in the query
- *
- * @author Gidi Shabat
- */
-public class SqlTable {
-    public static final int MINIMAL_DYNAMIC_TABLE_ID = 100;
-    private final SqlTableEnum table;
-    private final int id;
-
-    /**
-     * Static table instances
-     */
-    public SqlTable(SqlTableEnum table) {
-        this.table = table;
-        this.id = -1;
-    }
-
-    public SqlTable(SqlTableEnum table, int id) {
-        this.table = table;
-        this.id = id;
-    }
-    public String getTableName() {
-        return table.name();
-
-    }
-
-    public SqlTableEnum getTable() {
-        return table;
-    }
-
-    public int getId() {
-        return id;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        SqlTable table1 = (SqlTable) o;
-
-        if (id != table1.id) {
-            return false;
-        }
-        if (table != table1.table) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public String toString() {
-        return "Table{" +
-                "table=" + table +
-                '}';
-    }
-
-    @Override
-    public int hashCode() {
-        int result = table != null ? table.hashCode() : 0;
-        result = 31 * result + id;
-        return result;
-    }
-
-    public String getAlias() {
-        return getAliasDeclaration() + ".";
-    }
-
-    public String getAliasDeclaration() {
-        if (id < 0) {
-            return table.alias;
-        } else {
-            return table.alias + id;
-        }
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/AqlJoinTypeEnum.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/AqlJoinTypeEnum.java
deleted file mode 100644
index 461b2b7..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/AqlJoinTypeEnum.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.sql.type;
-
-/**
- * This enum represent the supported table join types.
- *
- * @author Gidi Shabat
- */
-public enum AqlJoinTypeEnum {
-    innerJoin("inner join"),leftOuterJoin("left outer join");
-    public String signature;
-
-    AqlJoinTypeEnum(String signature) {
-        this.signature = signature;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/AqlTableGraph.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/AqlTableGraph.java
deleted file mode 100644
index 417e46a..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/AqlTableGraph.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.sql.type;
-
-import com.google.common.collect.Maps;
-import org.artifactory.storage.db.aql.sql.builder.links.TableLink;
-import org.artifactory.storage.db.aql.sql.model.SqlTableEnum;
-
-import java.util.Map;
-
-import static org.artifactory.aql.model.AqlTableFieldsEnum.*;
-import static org.artifactory.storage.db.aql.sql.model.SqlTableEnum.*;
-
-/**
- * The class contains the relations between the tables.
- * It is being used to find the shortest path between to tables to minimize the number of joins.
- *
- * @author Gidi Shabat
- */
-public class AqlTableGraph {
-    public static final Map<SqlTableEnum, TableLink> tablesLinksMap;
-
-    static {
-        //Create Tables and links
-        TableLink nodesTable = new TableLink(SqlTableEnum.nodes);
-        TableLink statisticsTable = new TableLink(SqlTableEnum.stats);
-        TableLink nodesProps = new TableLink(SqlTableEnum.node_props);
-        TableLink archiveNames = new TableLink(SqlTableEnum.archive_names);
-        TableLink archivePaths = new TableLink(SqlTableEnum.archive_paths);
-        TableLink indexedArchives = new TableLink(SqlTableEnum.indexed_archives);
-        TableLink indexedArchiveEntries = new TableLink(SqlTableEnum.indexed_archives_entries);
-        TableLink builds = new TableLink(SqlTableEnum.builds);
-        TableLink buildsProps = new TableLink(SqlTableEnum.build_props);
-        TableLink buildsModules = new TableLink(SqlTableEnum.build_modules);
-        TableLink buildsPromotions = new TableLink(SqlTableEnum.build_promotions);
-        TableLink buildsArtifacts = new TableLink(SqlTableEnum.build_artifacts);
-        TableLink buildsDependencies = new TableLink(SqlTableEnum.build_dependencies);
-        TableLink buildModuleProperties = new TableLink(SqlTableEnum.module_props);
-        nodesTable.addLink(node_id, nodesProps, node_id);
-        nodesTable.addLink(sha1_actual, buildsArtifacts, sha1);
-        nodesTable.addLink(sha1_actual, buildsDependencies, sha1);
-        nodesTable.addLink(sha1_actual, indexedArchives, archive_sha1);
-        nodesTable.addLink(node_id, statisticsTable, node_id);
-        indexedArchives.addLink(indexed_archives_id, indexedArchiveEntries, indexed_archives_id);
-        indexedArchiveEntries.addLink(entry_name_id, archiveNames, name_id);
-        indexedArchiveEntries.addLink(entry_path_id, archivePaths, path_id);
-        buildsModules.addLink(module_id, buildsArtifacts, module_id);
-        buildsModules.addLink(module_id, buildsDependencies, module_id);
-        buildsModules.addLink(module_id, buildModuleProperties, module_id);
-        buildsModules.addLink(build_id, builds, build_id);
-        builds.addLink(build_id, buildsProps, build_id);
-        nodesProps.addLink(node_id, nodesProps, node_id);
-        buildsProps.addLink(build_id, buildsProps, build_id);
-        buildModuleProperties.addLink(module_id, buildModuleProperties, module_id);
-        builds.addLink(build_id, buildsPromotions, build_id);
-        buildsPromotions.addLink(build_id, builds, build_id);
-
-
-        //Fill the tables map
-        Map<SqlTableEnum, TableLink> map = Maps.newHashMap();
-        map.put(indexed_archives, indexedArchives);
-        map.put(indexed_archives_entries, indexedArchiveEntries);
-        map.put(archive_names, archiveNames);
-        map.put(archive_paths, archivePaths);
-        map.put(stats, statisticsTable);
-        map.put(nodes, nodesTable);
-        map.put(node_props, nodesProps);
-        map.put(build_dependencies, buildsDependencies);
-        map.put(build_artifacts, buildsArtifacts);
-        map.put(build_modules, buildsModules);
-        map.put(module_props, buildModuleProperties);
-        map.put(SqlTableEnum.builds, builds);
-        map.put(build_props, buildsProps);
-        map.put(build_promotions, buildsPromotions);
-        tablesLinksMap = map;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/ArchiveEntrySqlGenerator.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/ArchiveEntrySqlGenerator.java
deleted file mode 100644
index 0c1c176..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/ArchiveEntrySqlGenerator.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.sql.type;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.model.AqlTableFieldsEnum;
-import org.artifactory.storage.db.aql.sql.builder.links.TableLink;
-import org.artifactory.storage.db.aql.sql.builder.links.TableLinkRelation;
-import org.artifactory.storage.db.aql.sql.model.SqlTableEnum;
-
-import java.util.List;
-
-import static org.artifactory.storage.db.aql.sql.builder.query.sql.type.AqlTableGraph.tablesLinksMap;
-
-/**
- * @author Gidi Shabat
- */
-public class ArchiveEntrySqlGenerator  extends BasicSqlGenerator {
-
-    private TableLink indexedArchiveEntries;
-    private TableLinkRelation nameToIndex;
-    private TableLinkRelation pathToIndex;
-    private TableLinkRelation indexToPath;
-    private TableLinkRelation indexToName;
-    private TableLinkRelation indexToIndexArchive;
-    private TableLinkRelation indexArchiveToIndex;
-    private List<TableLinkRelation> nameToIndexToPath;
-    private List<TableLinkRelation> pathToIndexToName;
-
-
-    @Override
-    protected List<TableLink> getExclude() {
-        return Lists.newArrayList(tablesLinksMap.get(SqlTableEnum.build_dependencies));
-    }
-
-    @Override
-    protected List<TableLinkRelation> overrideRoute(List<TableLinkRelation> route) {
-        init();
-        if (nameToIndexToPath.equals(route)) {
-            return Lists.newArrayList(nameToIndex, indexToIndexArchive, indexArchiveToIndex, indexToPath);
-        }
-        if (pathToIndexToName.equals(route)) {
-            return Lists.newArrayList(pathToIndex, indexToIndexArchive, indexArchiveToIndex, indexToName);
-        }
-        return route;
-    }
-
-    private void init() {
-        if (indexedArchiveEntries == null) {
-            TableLink archivePaths = AqlTableGraph.tablesLinksMap.get(SqlTableEnum.archive_paths);
-            TableLink archiveNames = AqlTableGraph.tablesLinksMap.get(SqlTableEnum.archive_names);
-            TableLink indexedArchives = AqlTableGraph.tablesLinksMap.get(SqlTableEnum.indexed_archives);
-            indexedArchiveEntries = AqlTableGraph.tablesLinksMap.get(SqlTableEnum.indexed_archives_entries);
-            indexToPath = new TableLinkRelation(indexedArchiveEntries, AqlTableFieldsEnum.entry_path_id,
-                    archivePaths, AqlTableFieldsEnum.path_id);
-            nameToIndex = new TableLinkRelation(archiveNames, AqlTableFieldsEnum.name_id,
-                    indexedArchiveEntries, AqlTableFieldsEnum.entry_name_id);
-            nameToIndexToPath = Lists.newArrayList(nameToIndex, indexToPath);
-            indexToName = new TableLinkRelation(indexedArchiveEntries, AqlTableFieldsEnum.entry_name_id,
-                    archiveNames, AqlTableFieldsEnum.name_id);
-            pathToIndex = new TableLinkRelation(archivePaths, AqlTableFieldsEnum.path_id,
-                    indexedArchiveEntries, AqlTableFieldsEnum.entry_path_id);
-            pathToIndexToName = Lists.newArrayList(pathToIndex, indexToName);
-            indexArchiveToIndex = new TableLinkRelation(indexedArchives, AqlTableFieldsEnum.indexed_archives_id,
-                    indexedArchiveEntries, AqlTableFieldsEnum.indexed_archives_id);
-            indexToIndexArchive = new TableLinkRelation(indexedArchiveEntries, AqlTableFieldsEnum.indexed_archives_id,
-                    indexedArchives, AqlTableFieldsEnum.indexed_archives_id);
-        }
-    }
-
-    @Override
-    protected SqlTableEnum getMainTable() {
-        return SqlTableEnum.archive_names;
-    }
-
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/ArchiveSqlGenerator.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/ArchiveSqlGenerator.java
deleted file mode 100644
index e8112d9..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/ArchiveSqlGenerator.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.sql.type;
-
-import com.google.common.collect.Lists;
-import org.artifactory.storage.db.aql.sql.builder.links.TableLink;
-import org.artifactory.storage.db.aql.sql.builder.links.TableLinkRelation;
-import org.artifactory.storage.db.aql.sql.model.SqlTableEnum;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * The class contains tweaking information and optimizations for Archives queries.
- *
- * @author Gidi Shabat
- */
-public class ArchiveSqlGenerator extends BasicSqlGenerator {
-
-    @Override
-    protected List<TableLink> getExclude() {
-        return Lists.newArrayList();
-    }
-
-    @Override
-    protected List<TableLinkRelation> overrideRoute(List<TableLinkRelation> route) {
-        return new ArrayList<>();
-    }
-
-    @Override
-    protected SqlTableEnum getMainTable() {
-        return SqlTableEnum.indexed_archives;
-    }
-
-}
-
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/ArtifactsSqlGenerator.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/ArtifactsSqlGenerator.java
deleted file mode 100644
index a4ac001..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/ArtifactsSqlGenerator.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.sql.type;
-
-import com.google.common.collect.Lists;
-import org.artifactory.storage.db.aql.sql.builder.links.TableLink;
-import org.artifactory.storage.db.aql.sql.model.SqlTableEnum;
-
-import java.util.List;
-
-import static org.artifactory.storage.db.aql.sql.builder.query.sql.type.AqlTableGraph.tablesLinksMap;
-
-/**
- * * The class contains tweaking information and optimizations for Artifacts queries.
- *
- * @author Gidi Shabat
- */
-public class ArtifactsSqlGenerator extends BasicSqlGenerator {
-
-    @Override
-    protected List<TableLink> getExclude() {
-        return Lists.newArrayList(tablesLinksMap.get(SqlTableEnum.build_dependencies));
-    }
-
-    @Override
-    protected SqlTableEnum getMainTable() {
-        return SqlTableEnum.nodes;
-    }
-
-}
-
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/BasicSqlGenerator.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/BasicSqlGenerator.java
deleted file mode 100644
index 09abd4f..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/BasicSqlGenerator.java
+++ /dev/null
@@ -1,367 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.sql.type;
-
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import org.artifactory.aql.AqlException;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.model.AqlOperatorEnum;
-import org.artifactory.aql.model.AqlTableFieldsEnum;
-import org.artifactory.aql.model.DomainSensitiveField;
-import org.artifactory.storage.db.aql.sql.builder.links.TableLink;
-import org.artifactory.storage.db.aql.sql.builder.links.TableLinkBrowser;
-import org.artifactory.storage.db.aql.sql.builder.links.TableLinkRelation;
-import org.artifactory.storage.db.aql.sql.builder.query.aql.*;
-import org.artifactory.storage.db.aql.sql.builder.query.sql.SqlTable;
-import org.artifactory.storage.db.aql.sql.model.AqlFieldExtensionEnum;
-import org.artifactory.storage.db.aql.sql.model.SqlTableEnum;
-import org.artifactory.util.Pair;
-
-import javax.annotation.Nullable;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import static org.artifactory.storage.db.aql.sql.builder.query.sql.type.AqlTableGraph.tablesLinksMap;
-import static org.artifactory.storage.db.aql.sql.model.AqlFieldExtensionEnum.getExtensionFor;
-
-/**
- * This is actually the class that contains all the code that converts the AqlQuery to sqlQuery.
- *
- * @author Gidi Shabat
- */
-public abstract class BasicSqlGenerator {
-    public final Map<SqlTableEnum, Map<SqlTableEnum, List<TableLinkRelation>>> tableRouteMap;
-    Function<DomainSensitiveField, DomainSensitiveTable> toTables = new Function<DomainSensitiveField, DomainSensitiveTable>() {
-        @Nullable
-        @Override
-        public DomainSensitiveTable apply(@Nullable DomainSensitiveField input) {
-            if (input == null) {
-                return null;
-            }
-            AqlFieldExtensionEnum extension = getExtensionFor(input.getField());
-            List<SqlTableEnum> tables = generateTableListFromSubDomainAndField(input.getSubDomains());
-            SqlTable table = tablesLinksMap.get(extension.table).getTable();
-            return new DomainSensitiveTable(table, tables);
-        }
-    };
-    Function<AqlQueryElement, DomainSensitiveTable> firstTableFromCriteria = new Function<AqlQueryElement, DomainSensitiveTable>() {
-        @Nullable
-        @Override
-        public DomainSensitiveTable apply(@Nullable AqlQueryElement input) {
-            SqlTable table = input != null ? ((Criteria) input).getTable1() : null;
-            if (table != null) {
-                List<SqlTableEnum> tables = generateTableListFromSubDomainAndField(((Criteria) input).getSubDomains());
-                return new DomainSensitiveTable(table, tables);
-            }
-            return null;
-        }
-    };
-    Predicate<DomainSensitiveTable> notNull = new Predicate<DomainSensitiveTable>() {
-        @Override
-        public boolean apply(@Nullable DomainSensitiveTable input) {
-            return input != null;
-        }
-    };
-    Predicate<AqlQueryElement> criteriasOnly = new Predicate<AqlQueryElement>() {
-
-        @Override
-        public boolean apply(@Nullable AqlQueryElement input) {
-            return input instanceof Criteria;
-        }
-    };
-    Function<DomainSensitiveTable, SqlTableEnum> toTableEnum = new Function<DomainSensitiveTable, SqlTableEnum>() {
-        @Nullable
-        @Override
-        public SqlTableEnum apply(@Nullable DomainSensitiveTable input) {
-            return input != null ? input.getTable().getTable() : null;
-        }
-    };
-
-    /**
-     * The constructor scans the table schema and creates a map that contains the shortest route between to tables
-     */
-    protected BasicSqlGenerator() {
-        Map<SqlTableEnum, Map<SqlTableEnum, List<TableLinkRelation>>> routeMap = Maps.newHashMap();
-        for (TableLink from : tablesLinksMap.values()) {
-            for (TableLink to : tablesLinksMap.values()) {
-                List<TableLinkRelation> route = findShortestPathBetween(from, to);
-                Map<SqlTableEnum, List<TableLinkRelation>> toRouteMap = routeMap.get(from.getTableEnum());
-                if (toRouteMap == null) {
-                    toRouteMap = Maps.newHashMap();
-                    routeMap.put(from.getTableEnum(), toRouteMap);
-                }
-                toRouteMap.put(to.getTableEnum(), route);
-            }
-        }
-        tableRouteMap = routeMap;
-    }
-
-    /**
-     * The method generates the result part of the SQL query
-     */
-    public String results(AqlQuery aqlQuery) {
-        StringBuilder result = new StringBuilder();
-        result.append(" ");
-        Iterator<DomainSensitiveField> iterator = aqlQuery.getResultFields().iterator();
-        while (iterator.hasNext()) {
-            DomainSensitiveField nextField = iterator.next();
-            AqlFieldEnum fieldEnum = nextField.getField();
-            AqlFieldExtensionEnum next = getExtensionFor(fieldEnum);
-            SqlTable table = tablesLinksMap.get(next.table).getTable();
-            result.append(table.getAlias()).append(next.tableField);
-            result.append(" as ").append(fieldEnum.name());
-            if (iterator.hasNext()) {
-                result.append(",");
-            } else {
-                result.append(" ");
-            }
-        }
-        return result.toString();
-    }
-
-    /**
-     * This is one of the most important and complicates parts in the Aql mechanism
-     * Its task is to create the tables declaration part in the SQL query
-     * the method does this with the help "sub domains" : Each field in the result fields and in the criteria
-     * contains a list of domain that represent the route to the main domain, so basically, in order to bind one field
-     * to the other we can trace the sub domains and bind each field to the "Main Table"
-     * The problem with tracing the sub domain is that there is no injective match match between the tables and the domains
-     * therefore we use the tablesLinksMap that contain the shortest route between to tabales and help us to ensures
-     * that in "threaded form" we will bind all the tables needed from the
-     * "Field table" to the "Main table"
-     *
-     * @param aqlQuery
-     * @return
-     */
-    public String tables(AqlQuery aqlQuery) {
-        Set<SqlTable> usedTables = Sets.newHashSet();
-        StringBuilder join = new StringBuilder();
-        join.append(" ");
-        // Get all Result tables
-        Iterable<DomainSensitiveTable> resultTables = Iterables.transform(aqlQuery.getResultFields(), toTables);
-        // Find all the criterias
-        Iterable<AqlQueryElement> filter = Iterables.filter(aqlQuery.getAqlElements(), criteriasOnly);
-        // Get the tables from the criterias
-        Iterable<DomainSensitiveTable> criteriasTables = Iterables.transform(filter, firstTableFromCriteria);
-        // Concatenate the resultTables and the criteriasTables
-        Iterable<DomainSensitiveTable> allTables = Iterables.concat(resultTables, criteriasTables);
-        // Resolve  Join type (inner join or left outer join) for better performance
-        AqlJoinTypeEnum joinTypeEnum = resolveJoinType(allTables);
-        // Clean null tables if exists
-        allTables = Iterables.filter(allTables, notNull);
-        SqlTable mainTable = tablesLinksMap.get(getMainTable()).getTable();
-        // Join the main table as first table (not join)
-        joinTable(mainTable, null, null, null, usedTables, join, true, joinTypeEnum);
-        for (DomainSensitiveTable table : allTables) {
-            TableLink to;
-            // Resolve the first table : which is always the "Main Table"
-            SqlTableEnum fromTableEnum = table.getTables().get(0);
-            // Find the route to the target ("to") table and add a join for each table in the route
-            TableLink from = tablesLinksMap.get(fromTableEnum);
-            for (int i = 1; i < table.getTables().size(); i++) {
-                SqlTableEnum toTableEnum = table.getTables().get(i);
-                to = tablesLinksMap.get(toTableEnum);
-                List<TableLinkRelation> relations = tableRouteMap.get(from.getTableEnum()).get(to.getTableEnum());
-                generateJoinTables(relations, usedTables, join, joinTypeEnum);
-                from = to;
-            }
-            // Finally add a join to the field table
-            to = tablesLinksMap.get(table.getTable().getTable());
-            List<TableLinkRelation> relations = tableRouteMap.get(from.getTableEnum()).get(to.getTableEnum());
-            generateJoinTables(relations, usedTables, join, joinTypeEnum, table.getTable());
-        }
-        return join.toString()+ " ";
-    }
-
-    /**
-     * The method create the where part of the SQL query.
-     * It actually scan all the criterias and Parenthesis elements in the AQL Query
-     * and transform does elements into SQL syntax.
-     *
-     * @param aqlQuery
-     * @return
-     * @throws AqlException
-     */
-    public Pair<String, List<Object>> conditions(AqlQuery aqlQuery)
-            throws AqlException {
-        StringBuilder condition = new StringBuilder();
-        List<Object> params = Lists.newArrayList();
-        for (AqlQueryElement aqlQueryElement : aqlQuery.getAqlElements()) {
-            if (aqlQueryElement instanceof ComplexPropertyCriteria || aqlQueryElement instanceof SimpleCriteria
-                    || aqlQueryElement instanceof SimplePropertyCriteria) {
-                Criteria criteria = (Criteria) aqlQueryElement;
-                condition.append(criteria.toSql(params));
-            }
-            if (aqlQueryElement instanceof OperatorQueryElement) {
-                AqlOperatorEnum operatorEnum = ((OperatorQueryElement) aqlQueryElement).getOperatorEnum();
-                condition.append(" ").append(operatorEnum.name());
-            }
-            if (aqlQueryElement instanceof OpenParenthesisAqlElement) {
-                condition.append("(");
-            }
-            if (aqlQueryElement instanceof CloseParenthesisAqlElement) {
-                condition.append(")");
-            }
-        }
-        return new Pair(condition.toString()+" ", params);
-    }
-
-    private List<TableLinkRelation> findShortestPathBetween(TableLink from, TableLink to) {
-        List<TableLinkRelation> relations = TableLinkBrowser.create().findPathTo(from, to, getExclude());
-        if (relations == null) {
-            ArrayList<TableLink> excludes = Lists.newArrayList();
-            relations = TableLinkBrowser.create().findPathTo(from, to, excludes);
-        }
-        relations = overrideRoute(relations);
-        return relations;
-    }
-
-    protected abstract List<TableLink> getExclude();
-
-    protected List<TableLinkRelation> overrideRoute(List<TableLinkRelation> route) {
-        return route;
-    }
-
-    protected void generateJoinTables(List<TableLinkRelation> relations, Set<SqlTable> usedTables, StringBuilder join,
-            AqlJoinTypeEnum joinTypeEnum) {
-        if (relations == null) {
-            return;
-        }
-        for (TableLinkRelation relation : relations) {
-            AqlTableFieldsEnum fromField = relation.getFromField();
-            SqlTable fromTable = relation.getFromTable().getTable();
-            AqlTableFieldsEnum toFiled = relation.getToFiled();
-            SqlTable toTable = relation.getToTable().getTable();
-            joinTable(toTable, toFiled, fromTable, fromField, usedTables, join, false, joinTypeEnum);
-        }
-    }
-
-    protected void generateJoinTables(List<TableLinkRelation> relations, Set<SqlTable> usedTables, StringBuilder join,
-            AqlJoinTypeEnum joinTypeEnum, SqlTable sqlTable) {
-        if (relations == null) {
-            return;
-        }
-        for (TableLinkRelation relation : relations) {
-            AqlTableFieldsEnum fromField = relation.getFromField();
-            SqlTable fromTable = relation.getFromTable().getTable();
-            AqlTableFieldsEnum toFiled = relation.getToFiled();
-            SqlTable toTable = relation.getToTable().getTable();
-            toTable = toTable.getTable() == sqlTable.getTable() ? sqlTable : toTable;
-            joinTable(toTable, toFiled, fromTable, fromField, usedTables, join, false, joinTypeEnum);
-        }
-    }
-
-    protected void joinTable(SqlTable table, AqlTableFieldsEnum tableJoinField, SqlTable onTable,
-            AqlTableFieldsEnum onJoinFiled,
-            Set<SqlTable> declaredTables, StringBuilder join, boolean first, AqlJoinTypeEnum joinTypeEnum) {
-
-        if (!declaredTables.contains(table)) {
-            if (first) {
-                join.append(table.getTableName()).append(" ").append(table.getAliasDeclaration());
-            } else {
-                join.append(" ").append(joinTypeEnum.signature).append(" ").append(table.getTableName()).append(
-                        " ").append(
-                        table.getAliasDeclaration());
-                join.append(" on ").append(table.getAlias()).append(tableJoinField).
-                        append(" = ").append(onTable.getAlias()).append(onJoinFiled);
-            }
-        }
-        declaredTables.add(table);
-    }
-
-    public String sort(AqlQuery aqlQuery) {
-        SortDetails sortDetails = aqlQuery.getSort();
-        if (sortDetails == null || sortDetails.getFields().size() == 0) {
-            return null;
-        }
-        StringBuilder stringBuilder = new StringBuilder();
-        List<AqlFieldEnum> fields = sortDetails.getFields();
-        Iterator<AqlFieldEnum> iterator = fields.iterator();
-        while (iterator.hasNext()) {
-            AqlFieldEnum sortField = iterator.next();
-            stringBuilder.append(sortField.name());
-            stringBuilder.append(" ").append(sortDetails.getSortType().getSqlName());
-            if (iterator.hasNext()) {
-                stringBuilder.append(",");
-            }else {
-                stringBuilder.append(" ");
-            }
-        }
-        return stringBuilder.toString();
-    }
-
-    /**
-     * Query performance optimisation:
-     * In case of single table join such as multiple properties table join
-     * without the usage of any other table we can use inner join for better performance.
-     *
-     * @param allTables
-     * @return
-     */
-    private AqlJoinTypeEnum resolveJoinType(Iterable<DomainSensitiveTable> allTables) {
-        Iterable<SqlTableEnum> tables = Iterables.transform(allTables, toTableEnum);
-        HashSet<SqlTableEnum> tableEnums = Sets.newHashSet();
-        for (SqlTableEnum table : tables) {
-            if (table != null) {
-                tableEnums.add(table);
-            }
-        }
-        if (tableEnums.size() == 1) {
-            return AqlJoinTypeEnum.innerJoin;
-        } else {
-            return AqlJoinTypeEnum.leftOuterJoin;
-        }
-    }
-
-    protected abstract SqlTableEnum getMainTable();
-
-    private List<SqlTableEnum> generateTableListFromSubDomainAndField(List<AqlDomainEnum> subDomains) {
-        List<SqlTableEnum> result = Lists.newArrayList();
-        if (subDomains.size() > 1) {
-            for (int i = 0; i < subDomains.size() - 1; i++) {
-                result.add(domainToTable(subDomains.get(i)));
-            }
-        } else {
-            result.add(domainToTable(subDomains.get(0)));
-        }
-        return result;
-    }
-
-    private SqlTableEnum domainToTable(AqlDomainEnum domainEnum) {
-        switch (domainEnum) {
-            case archives:
-                return SqlTableEnum.indexed_archives;
-            case entries:
-                return SqlTableEnum.archive_names;
-            case items:
-                return SqlTableEnum.nodes;
-            case properties:
-                return SqlTableEnum.node_props;
-            case statistics:
-                return SqlTableEnum.stats;
-            case builds:
-                return SqlTableEnum.builds;
-            case buildProperties:
-                return SqlTableEnum.build_props;
-            case artifacts:
-                return SqlTableEnum.build_artifacts;
-            case dependencies:
-                return SqlTableEnum.build_dependencies;
-            case modules:
-                return SqlTableEnum.build_modules;
-            case moduleProperties:
-                return SqlTableEnum.module_props;
-            case buildPromotions:
-                return SqlTableEnum.build_promotions;
-        }
-        return null;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/BuildArtifactSqlGenerator.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/BuildArtifactSqlGenerator.java
deleted file mode 100644
index 6262a78..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/BuildArtifactSqlGenerator.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.sql.type;
-
-import com.google.common.collect.Lists;
-import org.artifactory.storage.db.aql.sql.builder.links.TableLink;
-import org.artifactory.storage.db.aql.sql.model.SqlTableEnum;
-
-import java.util.List;
-
-/**
- * The class contains tweaking information and optimizations for Build artifacts queries.
- *
- * @author Gidi Shabat
- */
-public class BuildArtifactSqlGenerator extends BasicSqlGenerator {
-
-    @Override
-    protected List<TableLink> getExclude() {
-        return Lists.newArrayList();
-    }
-
-    @Override
-    protected SqlTableEnum getMainTable() {
-        return SqlTableEnum.build_artifacts;
-    }
-
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/BuildDependenciesSqlGenerator.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/BuildDependenciesSqlGenerator.java
deleted file mode 100644
index db1453d..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/BuildDependenciesSqlGenerator.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.sql.type;
-
-import com.google.common.collect.Lists;
-import org.artifactory.storage.db.aql.sql.builder.links.TableLink;
-import org.artifactory.storage.db.aql.sql.model.SqlTableEnum;
-
-import java.util.List;
-
-import static org.artifactory.storage.db.aql.sql.builder.query.sql.type.AqlTableGraph.tablesLinksMap;
-
-/**
- * The class contains tweaking information and optimizations for Build dependencies queries.
- *
- * @author Gidi Shabat
- */
-public class BuildDependenciesSqlGenerator extends BasicSqlGenerator {
-
-    @Override
-    protected List<TableLink> getExclude() {
-        return Lists.newArrayList(tablesLinksMap.get(SqlTableEnum.build_artifacts));
-    }
-
-    @Override
-    protected SqlTableEnum getMainTable() {
-        return SqlTableEnum.build_dependencies;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/BuildModulePropertySqlGenerator.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/BuildModulePropertySqlGenerator.java
deleted file mode 100644
index 99f601e..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/BuildModulePropertySqlGenerator.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.sql.type;
-
-import com.google.common.collect.Lists;
-import org.artifactory.storage.db.aql.sql.builder.links.TableLink;
-import org.artifactory.storage.db.aql.sql.model.SqlTableEnum;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class BuildModulePropertySqlGenerator extends BasicSqlGenerator {
-
-    @Override
-    protected List<TableLink> getExclude() {
-        return Lists.newArrayList();
-    }
-
-    @Override
-    protected SqlTableEnum getMainTable() {
-        return SqlTableEnum.module_props;
-    }
-
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/BuildModuleSqlGenerator.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/BuildModuleSqlGenerator.java
deleted file mode 100644
index 04f5de8..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/BuildModuleSqlGenerator.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.sql.type;
-
-import com.google.common.collect.Lists;
-import org.artifactory.storage.db.aql.sql.builder.links.TableLink;
-import org.artifactory.storage.db.aql.sql.model.SqlTableEnum;
-
-import java.util.List;
-
-/**
- * The class contains tweaking information and optimizations for Build module .
- *
- * @author Gidi Shabat
- */
-public class BuildModuleSqlGenerator extends BasicSqlGenerator {
-    @Override
-    protected List<TableLink> getExclude() {
-        return Lists.newArrayList();
-    }
-
-    @Override
-    protected SqlTableEnum getMainTable() {
-        return SqlTableEnum.build_modules;
-    }
-
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/BuildPropertySqlGenerator.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/BuildPropertySqlGenerator.java
deleted file mode 100644
index d489bcb..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/BuildPropertySqlGenerator.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.sql.type;
-
-import com.google.common.collect.Lists;
-import org.artifactory.storage.db.aql.sql.builder.links.TableLink;
-import org.artifactory.storage.db.aql.sql.model.SqlTableEnum;
-
-import java.util.List;
-
-/**
- * The class contains tweaking information and optimizations for Build properties queries.
- *
- * @author Gidi Shabat
- */
-public class BuildPropertySqlGenerator extends BasicSqlGenerator {
-
-    @Override
-    protected List<TableLink> getExclude() {
-        return Lists.newArrayList();
-    }
-
-    @Override
-    protected SqlTableEnum getMainTable() {
-        return SqlTableEnum.build_props;
-    }
-
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/BuildSqlGenerator.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/BuildSqlGenerator.java
deleted file mode 100644
index 99f5be1..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/BuildSqlGenerator.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.sql.type;
-
-import com.google.common.collect.Lists;
-import org.artifactory.storage.db.aql.sql.builder.links.TableLink;
-import org.artifactory.storage.db.aql.sql.model.SqlTableEnum;
-
-import java.util.List;
-
-/**
- * The class contains tweaking information and optimizations for build queries.
- *
- * @author Gidi Shabat
- */
-public class BuildSqlGenerator extends BasicSqlGenerator {
-    @Override
-    protected SqlTableEnum getMainTable() {
-        return SqlTableEnum.builds;
-    }
-
-    @Override
-    protected List<TableLink> getExclude() {
-        return Lists.newArrayList();
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/BuildsPromotionsSqlGeneratot.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/BuildsPromotionsSqlGeneratot.java
deleted file mode 100644
index 4dd68fa..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/BuildsPromotionsSqlGeneratot.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.sql.type;
-
-import com.google.common.collect.Lists;
-import org.artifactory.storage.db.aql.sql.builder.links.TableLink;
-import org.artifactory.storage.db.aql.sql.model.SqlTableEnum;
-
-import java.util.List;
-
-/**
- * @author gidis
- */
-public class BuildsPromotionsSqlGeneratot extends BasicSqlGenerator {
-    @Override
-    protected List<TableLink> getExclude() {
-        return Lists.newArrayList();
-    }
-
-    @Override
-    protected SqlTableEnum getMainTable() {
-        return SqlTableEnum.build_promotions;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/DomainSensitiveTable.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/DomainSensitiveTable.java
deleted file mode 100644
index f6902f8..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/DomainSensitiveTable.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.sql.type;
-
-import org.artifactory.storage.db.aql.sql.builder.query.sql.SqlTable;
-import org.artifactory.storage.db.aql.sql.model.SqlTableEnum;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class DomainSensitiveTable {
-    private SqlTable table;
-    private List<SqlTableEnum> tables;
-
-    public DomainSensitiveTable(SqlTable table, List<SqlTableEnum> tables) {
-        this.tables = tables;
-        this.table = table;
-    }
-
-    public List<SqlTableEnum> getTables() {
-        return tables;
-    }
-
-    public SqlTable getTable() {
-        return table;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        DomainSensitiveTable that = (DomainSensitiveTable) o;
-
-        if (table != null ? !table.equals(that.table) : that.table != null) {
-            return false;
-        }
-        if (tables != null ? !tables.equals(that.tables) : that.tables != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = table != null ? table.hashCode() : 0;
-        result = 31 * result + (tables != null ? tables.hashCode() : 0);
-        return result;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/PropertiesSqlGenerator.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/PropertiesSqlGenerator.java
deleted file mode 100644
index c95e656..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/PropertiesSqlGenerator.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.sql.type;
-
-import com.google.common.collect.Lists;
-import org.artifactory.storage.db.aql.sql.builder.links.TableLink;
-import org.artifactory.storage.db.aql.sql.model.SqlTableEnum;
-
-import java.util.List;
-
-/**
- * The class contains tweaking information and optimizations for Properties queries.
- *
- * @author Gidi Shabat
- */
-public class PropertiesSqlGenerator extends BasicSqlGenerator {
-
-    @Override
-    protected List<TableLink> getExclude() {
-        return Lists.newArrayList();
-    }
-
-    @Override
-    protected SqlTableEnum getMainTable() {
-        return SqlTableEnum.node_props;
-    }
-
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/StatisticsSqlGenerator.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/StatisticsSqlGenerator.java
deleted file mode 100644
index e72d270..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/builder/query/sql/type/StatisticsSqlGenerator.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.artifactory.storage.db.aql.sql.builder.query.sql.type;
-
-import com.google.common.collect.Lists;
-import org.artifactory.storage.db.aql.sql.builder.links.TableLink;
-import org.artifactory.storage.db.aql.sql.model.SqlTableEnum;
-
-import java.util.List;
-
-/**
- * The class contains tweaking information and optimizations for Statistics queries.
- *
- * @author Gidi Shabat
- */
-public class StatisticsSqlGenerator extends BasicSqlGenerator {
-
-    @Override
-    protected List<TableLink> getExclude() {
-        return Lists.newArrayList();
-    }
-
-    @Override
-    protected SqlTableEnum getMainTable() {
-        return SqlTableEnum.stats;
-    }
-
-
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/model/AqlFieldExtensionEnum.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/model/AqlFieldExtensionEnum.java
deleted file mode 100644
index 3d0bcaf..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/model/AqlFieldExtensionEnum.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package org.artifactory.storage.db.aql.sql.model;
-
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.model.AqlTableFieldsEnum;
-
-import static org.artifactory.aql.model.AqlTableFieldsEnum.*;
-import static org.artifactory.aql.model.AqlVariableTypeEnum.date;
-import static org.artifactory.aql.model.AqlVariableTypeEnum.string;
-import static org.artifactory.storage.db.aql.sql.model.SqlTableEnum.*;
-
-/**
- * @author Gidi Shabat
- *
- * The Class extends the AqlFieldEnum.
- * The reason We split the AqlFiedEnumAnd into two parts  AqlFiedEnumAnd and AqlFieldExtensionEnum is to saparate the
- * database info from the common API.
- */
-public enum AqlFieldExtensionEnum {
-    // node
-    artifactRepo(AqlFieldEnum.itemRepo, nodes, repo, false),
-    artifactPath(AqlFieldEnum.itemPath, nodes, node_path, false),
-    artifactName(AqlFieldEnum.itemName, nodes, node_name, false),
-    artifactCreated(AqlFieldEnum.itemCreated, nodes, created, false),
-    artifactModified(AqlFieldEnum.itemModified, nodes, modified, true),
-    artifactUpdated(AqlFieldEnum.itemUpdated, nodes, updated, true),
-    artifactCreatedBy(AqlFieldEnum.itemCreatedBy, nodes, created_by, true),
-    artifactModifiedBy(AqlFieldEnum.itemModifiedBy, nodes, modified_by, true),
-    artifactType(AqlFieldEnum.itemType, nodes, node_type, false),
-    artifactDepth(AqlFieldEnum.itemDepth, nodes, depth, false),
-    artifactNodeId(AqlFieldEnum.itemId, nodes, node_id, false),
-    artifactOriginalMd5(AqlFieldEnum.itemOriginalMd5, nodes, md5_original, true),
-    artifactActualMd5(AqlFieldEnum.itemActualMd5, nodes, md5_actual, true),
-    artifactOriginalSha1(AqlFieldEnum.itemOriginalSha1, nodes, sha1_original, true),
-    artifactActualSha1(AqlFieldEnum.itemActualSha1, nodes, sha1_actual, true),
-    artifactSize(AqlFieldEnum.itemSize, nodes, bin_length, true),
-    // stats
-    artifactDownloaded(AqlFieldEnum.statDownloaded, stats, last_downloaded, true),
-    artifactDownloads(AqlFieldEnum.statDownloads, stats, download_count, true),
-    artifactDownloadedBy(AqlFieldEnum.statDownloadedBy, stats, last_downloaded_by, true),
-    statId(AqlFieldEnum.statId, stats, node_id, false),
-    // properties
-    propertyKey(AqlFieldEnum.propertyKey, node_props, prop_key, false),
-    propertyValue(AqlFieldEnum.propertyValue, node_props, prop_value, true),
-    propertyId(AqlFieldEnum.propertyId, node_props, node_id, false),
-    // archive entries
-    archiveEntryName(AqlFieldEnum.archiveEntryName, archive_names, entry_name, false),
-    archiveEntryPath(AqlFieldEnum.archiveEntryPath, archive_paths, entry_path, false),
-    archiveEntryPathId(AqlFieldEnum.archiveEntryPathId, archive_paths, path_id, false),
-    archiveEntryNameId(AqlFieldEnum.archiveEntryNameId, archive_names, name_id, false),
-    // builds
-    moduleName(AqlFieldEnum.moduleName, build_modules, module_name_id, false),
-    moduleId(AqlFieldEnum.moduleId, build_modules, module_id, false),
-    buildDependencyName(AqlFieldEnum.buildDependencyName, build_dependencies, dependency_name_id, false),
-    buildDependencyScope(AqlFieldEnum.buildDependencyScope, build_dependencies, dependency_scopes, false),
-    buildDependencyType(AqlFieldEnum.buildDependencyType, build_dependencies, dependency_type, false),
-    buildDependencySha1(AqlFieldEnum.buildDependencySha1, build_dependencies, sha1, false),
-    buildDependencyMd5(AqlFieldEnum.buildDependencyMd5, build_dependencies, md5, false),
-    buildDependencyId(AqlFieldEnum.buildDependencyId, build_dependencies, dependency_id, false),
-    buildArtifactName(AqlFieldEnum.buildArtifactName, build_artifacts, artifact_name, false),
-    buildArtifactType(AqlFieldEnum.buildArtifactType, build_artifacts, artifact_type, false),
-    buildArtifactSha1(AqlFieldEnum.buildArtifactSha1, build_artifacts, sha1, false),
-    buildArtifactMd5(AqlFieldEnum.buildArtifactMd5, build_artifacts, md5, false),
-    buildArtifactId(AqlFieldEnum.buildArtifactId, build_artifacts, artifact_id, false),
-    buildPropertyKey(AqlFieldEnum.buildPropertyKey, build_props, prop_key, false),
-    buildPropertyValue(AqlFieldEnum.buildPropertyValue, build_props, prop_value, false),
-    buildPropertyId(AqlFieldEnum.buildPropertyId, build_props, prop_id, false),
-    buildPromotionCreated(AqlFieldEnum.buildPromotionCreated,build_promotions,created,false),
-    buildPromotionCreatedBy(AqlFieldEnum.buildPromotionCreatedBy,build_promotions,created_by,true),
-    buildPromotionStatus(AqlFieldEnum.buildPromotionStatus,build_promotions,status,false),
-    buildPromotionRepo(AqlFieldEnum.buildPromotionRepo,build_promotions,repo,true),
-    buildPromotionComment(AqlFieldEnum.buildPromotionComment,build_promotions,promotion_comment,true),
-    buildPromotionUserName(AqlFieldEnum.buildPromotionUserName,build_promotions,ci_user,true),
-    modulePropertyKey(AqlFieldEnum.modulePropertyKey, module_props,prop_key,false),
-    modulePropertyValue(AqlFieldEnum.modulePropertyValue, module_props,prop_value,false),
-    modulePropertyId(AqlFieldEnum.modulePropertyId, module_props,prop_id,false),
-    buildUrl(AqlFieldEnum.buildUrl, builds, ci_url, false),
-    buildName(AqlFieldEnum.buildName, builds, build_name, false),
-    buildNumber(AqlFieldEnum.buildNumber, builds, build_number, false),
-    buildCreated(AqlFieldEnum.buildCreated, builds, created, false),
-    buildCreatedBy(AqlFieldEnum.buildCreatedBy, builds, created_by, true),
-    buildModified(AqlFieldEnum.buildModified, builds, modified, true),
-    buildModifiedBy(AqlFieldEnum.buildModifiedBy, builds, modified_by, true),
-    build_id(AqlFieldEnum.buildId, builds, AqlTableFieldsEnum.build_id, true);
-
-    public SqlTableEnum table;
-    public AqlTableFieldsEnum tableField;
-    private AqlFieldEnum aqlField;
-    private boolean nullable;
-
-    AqlFieldExtensionEnum(AqlFieldEnum aqlField, SqlTableEnum table, AqlTableFieldsEnum tableField,
-            boolean nullable) {
-        this.aqlField = aqlField;
-        this.table = table;
-        this.tableField = tableField;
-        this.nullable = nullable;
-    }
-
-    public static AqlFieldExtensionEnum getExtensionFor(AqlFieldEnum field) {
-        for (AqlFieldExtensionEnum fieldExtensionEnum : values()) {
-            if (fieldExtensionEnum.aqlField == field) {
-                return fieldExtensionEnum;
-            }
-        }
-        return null;
-    }
-
-    public boolean isNullable() {
-        return nullable;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/model/SqlTableEnum.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/model/SqlTableEnum.java
deleted file mode 100644
index dfd5e22..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/model/SqlTableEnum.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.artifactory.storage.db.aql.sql.model;
-
-
-/**
- * @author Gidi Shabat
- */
-public enum SqlTableEnum {
-    nodes("n"),
-    node_props("np"),
-    archive_paths("ap"),
-    archive_names("an"),
-    stats("s"),
-    unknown("u"),
-    indexed_archives("ia"),
-    indexed_archives_entries("iae"),
-    build_modules("bm"),
-    module_props("bmp"),
-    build_dependencies("bd"),
-    build_artifacts("ba"),
-    build_props("bp"),
-    build_promotions("bpr"),
-    builds("b");
-    public String alias;
-
-    SqlTableEnum(String alias) {
-        this.alias = alias;
-    }
-
-    public boolean isArchive() {
-        return this == indexed_archives || this == indexed_archives_entries || this == archive_names || this == archive_paths;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/result/AqlEagerResultImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/result/AqlEagerResultImpl.java
deleted file mode 100644
index 2acdb48..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/result/AqlEagerResultImpl.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package org.artifactory.storage.db.aql.sql.result;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.model.AqlItemTypeEnum;
-import org.artifactory.aql.model.DomainSensitiveField;
-import org.artifactory.aql.result.AqlEagerResult;
-import org.artifactory.aql.result.rows.AqlBaseFullRowImpl;
-import org.artifactory.aql.result.rows.AqlRowResult;
-import org.artifactory.storage.db.aql.sql.builder.query.sql.SqlQuery;
-import org.artifactory.storage.db.aql.sql.model.AqlFieldExtensionEnum;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
-/**
- * In-Memory query result
- *
- * @author Gidi Shabat
- */
-public class AqlEagerResultImpl<T extends AqlRowResult> implements AqlEagerResult {
-    private List<Map<AqlFieldEnum, Object>> rows = Lists.newArrayList();
-
-    public AqlEagerResultImpl(ResultSet resultSet, SqlQuery sqlQuery) throws SQLException {
-        long limit = sqlQuery.getLimit();
-        while (resultSet.next() && rows.size() < limit) {
-            Map<AqlFieldEnum, Object> map = Maps.newHashMap();
-            for (DomainSensitiveField field : sqlQuery.getResultFields()) {
-                AqlFieldEnum fieldEnum = field.getField();
-                switch (fieldEnum.type) {
-                    case date: {
-                        Long aLong = resultSet.getLong(fieldEnum.name());
-                        map.put(fieldEnum, aLong == 0 ? null : new Date(aLong));
-                        break;
-                    }
-                    case longInt: {
-                        map.put(fieldEnum, resultSet.getLong(fieldEnum.name()));
-                        break;
-                    }
-                    case integer: {
-                        map.put(fieldEnum, resultSet.getInt(fieldEnum.name()));
-                        break;
-                    }
-                    case string: {
-                        map.put(fieldEnum, resultSet.getString(fieldEnum.name()));
-                        break;
-                    }
-                    case itemType: {
-                        int type = resultSet.getInt(fieldEnum.name());
-                        AqlItemTypeEnum aqlItemTypeEnum = AqlItemTypeEnum.fromTypes(type);
-                        map.put(fieldEnum, aqlItemTypeEnum);
-                        break;
-                    }
-                }
-            }
-            rows.add(map);
-        }
-    }
-
-    @Override
-    public int getSize() {
-        return rows.size();
-    }
-
-    /**
-     * @return True if the result set is empty
-     */
-    public boolean isEmpty() {
-        return rows.isEmpty();
-    }
-
-    @Override
-    public T getResult(int i) {
-        return (T) new AqlBaseFullRowImpl(rows.get(i));
-    }
-
-    @Override
-    public List<T> getResults() {
-        List result = Lists.newArrayList();
-        for (Map<AqlFieldEnum, Object> row : rows) {
-            result.add(new AqlBaseFullRowImpl(row));
-        }
-        return result;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/result/AqlLazyResultImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/result/AqlLazyResultImpl.java
deleted file mode 100644
index 656003d..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/aql/sql/result/AqlLazyResultImpl.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package org.artifactory.storage.db.aql.sql.result;
-
-import com.google.common.collect.Maps;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.aql.model.AqlPermissionProvider;
-import org.artifactory.aql.model.DomainSensitiveField;
-import org.artifactory.aql.result.AqlLazyResult;
-import org.artifactory.storage.db.aql.sql.builder.query.sql.SqlQuery;
-import org.artifactory.storage.db.aql.sql.model.AqlFieldExtensionEnum;
-
-import java.sql.ResultSet;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlLazyResultImpl implements AqlLazyResult {
-    private final long limit;
-    private final long offset;
-    private final List<DomainSensitiveField> fields;
-    private ResultSet resultSet;
-    private Map<AqlFieldEnum, String> dbFieldNames;
-    private AqlDomainEnum domain;
-    private AqlPermissionProvider aqlPermissionProvider;
-
-    public AqlLazyResultImpl(ResultSet resultSet, SqlQuery sqlQuery, AqlPermissionProvider aqlPermissionProvider) {
-        this.aqlPermissionProvider = aqlPermissionProvider;
-        limit = sqlQuery.getLimit();
-        offset = sqlQuery.getOffset();
-        fields = sqlQuery.getResultFields();
-        this.resultSet = resultSet;
-        dbFieldNames = Maps.newHashMap();
-        this.domain=sqlQuery.getDomain();
-        for (DomainSensitiveField field : fields) {
-            AqlFieldEnum fieldEnum = field.getField();
-            dbFieldNames.put(fieldEnum, AqlFieldExtensionEnum.getExtensionFor(fieldEnum).tableField.name());
-        }
-    }
-
-    @Override
-    public AqlPermissionProvider getPermissionProvider() {
-        return aqlPermissionProvider;
-    }
-
-    @Override
-    public List<DomainSensitiveField> getFields() {
-        return fields;
-    }
-
-    @Override
-    public ResultSet getResultSet() {
-        return resultSet;
-    }
-
-    @Override
-    public long getLimit() {
-        return limit;
-    }
-
-    @Override
-    public long getOffset() {
-        return offset;
-    }
-
-    @Override
-    public Map<AqlFieldEnum, String> getDbFieldNames() {
-        return dbFieldNames;
-    }
-
-    @Override
-    public AqlDomainEnum getDomain() {
-        return domain;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/binstore/dao/BinariesDao.java b/storage/db/src/main/java/org/artifactory/storage/db/binstore/dao/BinariesDao.java
deleted file mode 100644
index bb1c22f..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/binstore/dao/BinariesDao.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.binstore.dao;
-
-import com.google.common.collect.Lists;
-import org.artifactory.api.storage.BinariesInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.storage.db.binstore.entity.BinaryEntity;
-import org.artifactory.storage.db.util.BaseDao;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Repository;
-
-import javax.annotation.Nullable;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * A data access object for binaries table access.
- *
- * @author Yossi Shaul
- */
- at Repository
-public class BinariesDao extends BaseDao {
-    public static final String TEMP_SHA1_PREFIX = "##";
-    private static final Logger log = LoggerFactory.getLogger(BinariesDao.class);
-
-    @Autowired
-    public BinariesDao(JdbcHelper jdbcHelper) {
-        super(jdbcHelper);
-    }
-
-    public boolean exists(String sha1) throws SQLException {
-        int count = jdbcHelper.executeSelectCount("SELECT count(1) FROM binaries WHERE sha1 = ?", sha1);
-        if (count > 1) {
-            log.warn("Unexpected binaries count for checksum: '{}' - {}", sha1, count);
-        }
-        return count > 0;
-    }
-
-    @Nullable
-    public BinaryEntity load(String sha1) throws SQLException {
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT sha1, md5, bin_length FROM binaries WHERE sha1 = ?", sha1);
-            if (resultSet.next()) {
-                return binaryFromResultSet(resultSet);
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        return null;
-    }
-
-    public Collection<BinaryEntity> findAll() throws SQLException {
-        Collection<BinaryEntity> results = Lists.newArrayList();
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT sha1, md5, bin_length FROM binaries " +
-                    " WHERE sha1 NOT LIKE '" + TEMP_SHA1_PREFIX + "%'");
-            while (resultSet.next()) {
-                results.add(binaryFromResultSet(resultSet));
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        return results;
-    }
-
-    public Collection<BinaryEntity> search(ChecksumType checksumType, Collection<String> validChecksums)
-            throws SQLException {
-        Collection<BinaryEntity> results = Lists.newArrayList();
-        if (validChecksums == null || validChecksums.isEmpty()) {
-            return results;
-        }
-
-        // Oracle limits the max elements in the IN clause to 1000. Lists bigger than max chunk value are done in
-        // multiple queries
-        List<String> checksums = Lists.newArrayList(validChecksums);
-        final int CHUNK = ConstantValues.binaryProviderPruneChunkSize.getInt();
-        // split to chunks of no more than CHUNK
-        for (int i = 0; i < validChecksums.size(); i += CHUNK) {
-            int chunkMaxIndex = Math.min(i + CHUNK, validChecksums.size());
-            List<String> chunk = checksums.subList(i, chunkMaxIndex);
-            ResultSet resultSet = null;
-            try {
-                resultSet = jdbcHelper.executeSelect("SELECT sha1, md5, bin_length FROM binaries" +
-                        " WHERE " + checksumType.name() + " IN (#)", chunk);
-                while (resultSet.next()) {
-                    results.add(binaryFromResultSet(resultSet));
-                }
-            } finally {
-                DbUtils.close(resultSet);
-            }
-        }
-
-        return results;
-    }
-
-    public Collection<BinaryEntity> findPotentialDeletion() throws SQLException {
-        Collection<BinaryEntity> results = Lists.newArrayList();
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT b.sha1, b.md5, b.bin_length FROM binaries b" +
-                    " WHERE b.sha1 NOT LIKE '" + TEMP_SHA1_PREFIX + "%'" +
-                    " AND NOT EXISTS (SELECT n.node_id FROM nodes n WHERE n.sha1_actual = b.sha1)" +
-                    " ORDER BY b.bin_length DESC");
-            while (resultSet.next()) {
-                results.add(binaryFromResultSet(resultSet));
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        return results;
-    }
-
-    public int deleteEntry(String sha1ToDelete) throws SQLException {
-        return jdbcHelper.executeUpdate("DELETE FROM binaries WHERE binaries.sha1 = ?" +
-                " AND NOT EXISTS (SELECT n.node_id FROM nodes n WHERE n.sha1_actual = ?)"
-                , sha1ToDelete, sha1ToDelete);
-    }
-
-    /**
-     * @return A pair of long values where the first is the counts of the binaries table elements and the second is the
-     * total binaries size.
-     */
-    public BinariesInfo getCountAndTotalSize() throws SQLException {
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT count(b.sha1), sum(b.bin_length) FROM binaries b" +
-                    " WHERE b.sha1 NOT LIKE '" + TEMP_SHA1_PREFIX + "%'");
-            resultSet.next();
-            return new BinariesInfo(resultSet.getLong(1), resultSet.getLong(2));
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public boolean create(BinaryEntity binaryEntity) throws SQLException {
-        int updateCount = jdbcHelper.executeUpdate("INSERT INTO binaries (sha1, md5, bin_length) VALUES(?, ?, ?)",
-                binaryEntity.getSha1(), binaryEntity.getMd5(), binaryEntity.getLength());
-        return updateCount == 1;
-    }
-
-    private BinaryEntity binaryFromResultSet(ResultSet rs) throws SQLException {
-        return new BinaryEntity(rs.getString(1), rs.getString(2), rs.getLong(3));
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/binstore/entity/BinaryEntity.java b/storage/db/src/main/java/org/artifactory/storage/db/binstore/entity/BinaryEntity.java
deleted file mode 100644
index 577abf7..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/binstore/entity/BinaryEntity.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.binstore.entity;
-
-import java.io.Serializable;
-
-/**
- * Represents a binary data entry in the database.
- *
- * @author Yossi Shaul
- */
-public class BinaryEntity implements Serializable {
-    private final String sha1;
-    private final String md5;
-    private final long length;
-
-    public BinaryEntity(String sha1, String md5, long length) {
-        this.sha1 = sha1;
-        this.md5 = md5;
-        this.length = length;
-    }
-
-    public String getSha1() {
-        return sha1;
-    }
-
-    public String getMd5() {
-        return md5;
-    }
-
-    public long getLength() {
-        return length;
-    }
-
-    @Override
-    public String toString() {
-        return "{" + sha1 + ',' + md5 + ',' + length + '}';
-    }
-
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/binstore/exceptions/PruneException.java b/storage/db/src/main/java/org/artifactory/storage/db/binstore/exceptions/PruneException.java
deleted file mode 100644
index 172e5f4..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/binstore/exceptions/PruneException.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.artifactory.storage.db.binstore.exceptions;
-
-/**
- * @author gidis
- */
-public class PruneException extends RuntimeException {
-    public PruneException(String message) {
-        super(message);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/binstore/service/BinaryEntityWithValidation.java b/storage/db/src/main/java/org/artifactory/storage/db/binstore/service/BinaryEntityWithValidation.java
deleted file mode 100644
index afca582..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/binstore/service/BinaryEntityWithValidation.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.artifactory.storage.db.binstore.service;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.storage.db.binstore.entity.BinaryEntity;
-
-/**
- * @author gidis
- */
-public class BinaryEntityWithValidation extends BinaryEntity {
-
-
-    public BinaryEntityWithValidation(String sha1, String md5, long length) {
-        super(sha1, md5, length);
-        isValid();
-    }
-
-    private void simpleValidation() {
-        if (StringUtils.isBlank(getSha1()) || getSha1().length() != ChecksumType.sha1.length()) {
-            throw new IllegalArgumentException("SHA1 value '" + getSha1() + "' is not a valid checksum");
-        }
-        if (StringUtils.isBlank(getMd5()) || getMd5().length() != ChecksumType.md5.length()) {
-            throw new IllegalArgumentException("MD5 value '" + getMd5() + "' is not a valid checksum");
-        }
-        if (getLength() < 0L) {
-            throw new IllegalArgumentException("Length " + getLength() + " is not a valid length");
-        }
-    }
-
-    public boolean isValid() {
-        simpleValidation();
-        return ChecksumType.sha1.isValid(getSha1()) && ChecksumType.md5.isValid(getMd5());
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/binstore/service/BinaryInfoImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/binstore/service/BinaryInfoImpl.java
deleted file mode 100644
index 65ea7eb..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/binstore/service/BinaryInfoImpl.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.artifactory.storage.db.binstore.service;
-
-import org.artifactory.storage.binstore.service.BinaryInfo;
-
-/**
- * @author Gidi Shabat
- */
-public class BinaryInfoImpl implements BinaryInfo {
-    private long length;
-    private String md5;
-    private String sha1;
-
-
-    @Deprecated
-    public BinaryInfoImpl(long length, String md5, String sha1) {
-        this.length = length;
-        this.md5 = md5;
-        this.sha1 = sha1;
-    }
-
-
-    public BinaryInfoImpl(String sha1, String md5, long length) {
-        this.sha1 = sha1;
-        this.md5 = md5;
-        this.length = length;
-    }
-
-    @Override
-    public String getSha1() {
-        return sha1;
-    }
-
-    @Override
-    public String getMd5() {
-        return md5;
-    }
-
-    @Override
-    public long getLength() {
-        return length;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        return sha1.equals(((BinaryInfoImpl) o).sha1);
-    }
-
-    @Override
-    public int hashCode() {
-        return sha1.hashCode();
-    }
-
-    @Override
-    public String toString() {
-        return "{" + sha1 + ',' + md5 + ',' + length + '}';
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/binstore/service/BinaryServiceImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/binstore/service/BinaryServiceImpl.java
deleted file mode 100644
index 411f83e..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/binstore/service/BinaryServiceImpl.java
+++ /dev/null
@@ -1,775 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.binstore.service;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.MapMaker;
-import com.google.common.collect.Sets;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.storage.BinariesInfo;
-import org.artifactory.api.storage.StorageUnit;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.storage.BinaryInsertRetryException;
-import org.artifactory.storage.StorageException;
-import org.artifactory.storage.StorageProperties;
-import org.artifactory.storage.binstore.service.BinaryInfo;
-import org.artifactory.storage.binstore.service.GarbageCollectorInfo;
-import org.artifactory.storage.binstore.service.GarbageCollectorListener;
-import org.artifactory.storage.binstore.service.InternalBinaryService;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.db.binstore.dao.BinariesDao;
-import org.artifactory.storage.db.binstore.entity.BinaryEntity;
-import org.artifactory.storage.db.binstore.exceptions.PruneException;
-import org.artifactory.storage.db.binstore.visitors.BinaryTreeElementScanner;
-import org.artifactory.storage.db.binstore.visitors.EssentialBinaryTreeElementHandler;
-import org.artifactory.storage.fs.service.ArchiveEntriesService;
-import org.artifactory.storage.model.FileBinaryProviderInfo;
-import org.artifactory.util.Pair;
-import org.jfrog.storage.binstore.common.BinaryProviderManagerImpl;
-import org.jfrog.storage.binstore.common.ReaderTrackingInputStream;
-import org.jfrog.storage.binstore.ifc.*;
-import org.jfrog.storage.binstore.ifc.model.BinaryElement;
-import org.jfrog.storage.binstore.ifc.model.BinaryTreeElement;
-import org.jfrog.storage.binstore.ifc.model.StorageInfo;
-import org.jfrog.storage.binstore.ifc.provider.BinaryProvider;
-import org.jfrog.storage.binstore.providers.base.StorageInfoImpl;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.ObjectInputStream;
-import java.sql.SQLException;
-import java.util.*;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-import java.util.stream.Collectors;
-
-/**
- * The main binary store of Artifactory that delegates to the BinaryProvider chain.
- *
- * @author Yossi Shaul
- */
- at Service
-public class BinaryServiceImpl implements InternalBinaryService {
-    private static final Logger log = LoggerFactory.getLogger(BinaryServiceImpl.class);
-
-    @Autowired
-    private BinariesDao binariesDao;
-
-    @Autowired
-    private ArchiveEntriesService archiveEntriesService;
-
-    @Autowired
-    private DbService dbService;
-
-    @Autowired
-    private StorageProperties storageProperties;
-
-    /**
-     * Map of delete protected sha1 checksums to the number of protections (active readers + writer count for each binary)
-     */
-    private ConcurrentMap<String, Pair<AtomicInteger, Long>> deleteProtectedBinaries;
-    private List<GarbageCollectorListener> garbageCollectorListeners;
-    private BinaryProviderManager binaryProviderManager;
-    private BinaryProviderConfig defaultValues;
-    private Lock lock = new ReentrantLock();
-    private BinaryProvider binaryProvider;
-    private boolean forceBinaryProviderOptimizationOnce = false;
-
-    @PostConstruct
-    public void initialize() {
-        garbageCollectorListeners = new CopyOnWriteArrayList<>();
-        log.debug("Initializing the ConfigurableBinaryProviderManager");
-        deleteProtectedBinaries = new MapMaker().makeMap();
-        // Generate Default values
-        defaultValues = storageProperties.toDefaultValues();
-        // Set the binarystore.xml file location
-        File haAwareEtcDir = ArtifactoryHome.get().getHaAwareEtcDir();
-        File userConfigFile = new File(haAwareEtcDir, "binarystore.xml");
-        defaultValues.setBinaryStoreXmlPath(userConfigFile.getAbsolutePath());
-        // Finally create an instancethe binary provider manager
-        binaryProviderManager = new BinaryProviderManagerImpl(defaultValues);
-        // Get the root binary provide from the binary provider manager
-        binaryProvider = binaryProviderManager.getFirstBinaryProvider();
-    }
-
-    @Override
-    public BinaryProviderManager getBinaryProviderManager() {
-        return binaryProviderManager;
-    }
-
-    @PreDestroy
-    public void destroy() {
-        notifyGCListenersOnDestroy();
-    }
-
-    @Override
-    public void addGCListener(GarbageCollectorListener garbageCollectorListener) {
-        garbageCollectorListeners.add(garbageCollectorListener);
-    }
-
-    @Override
-    public void addExternalFileStore(File externalFileDir, ProviderConnectMode connectMode) {
-        // The external binary provider works only if the file binary provider is not null
-        if (getBinariesDir() == null) {
-            return;
-        }
-        // Prepare parameters for the new External binary provider
-        String mode = connectMode.propName;
-        String externalDir = externalFileDir.getAbsolutePath();
-        String fileStoreDir = defaultValues.getParam("fileStoreDir");
-        File fileStoreFullPath = new File(new File(defaultValues.getParam("baseDataDir")), fileStoreDir);
-        // create and initialize the external binary providers.
-        binaryProviderManager.initializeExternalBinaryProvider(mode, externalDir, fileStoreFullPath.getAbsolutePath(), defaultValues);
-    }
-
-    @Override
-    public void disconnectExternalFilestore(File externalDir, ProviderConnectMode disconnectMode,
-                                            BasicStatusHolder statusHolder) {
-        ExternalBinaryProviderHelper.disconnectFromFileStore(this, externalDir, disconnectMode, statusHolder, binaryProviderManager, binariesDao, defaultValues);
-    }
-
-    @Override
-    public File getBinariesDir() {
-        // Get binary providers info tree from the manager
-        BinaryTreeElement<BinaryProviderInfo> binaryProvidersInfo = binaryProviderManager.getBinaryProvidersInfo();
-        // Collect all the file binary providers in list
-        List<FileBinaryProviderInfo> providersInfos = Lists.newArrayList();
-        collectFileBinaryProvidersDirsInternal(providersInfos, binaryProvidersInfo);
-        // Get the First binary provider
-        FileBinaryProviderInfo fileBinaryProviderInfo = providersInfos.size() > 0 ? providersInfos.get(0) : null;
-        if (fileBinaryProviderInfo != null) {
-            // We need the wrapper to avoid binary dir recalculation even if there is no file binary provider
-            return fileBinaryProviderInfo.getFileStoreDir();
-        }
-        return null;
-    }
-
-    @Override
-    public StorageInfo getStorageInfoSummary() {
-        // Get binary providers info tree from the manager
-        BinaryTreeElement<BinaryProviderInfo> binaryProvidersInfo = binaryProviderManager.getBinaryProvidersInfo();
-        // Collect all the  binary providers in list
-        List<BinaryTreeElement<BinaryProviderInfo>> providersInfos = Lists.newArrayList();
-        collectBinaryProviderInfo(providersInfos, binaryProvidersInfo);
-        // Remove the cache binary provider since it doesn't includes its next binary provider storage summary
-        Iterator<BinaryTreeElement<BinaryProviderInfo>> iterator = providersInfos.iterator();
-        while (iterator.hasNext()) {
-            BinaryTreeElement<BinaryProviderInfo> next = iterator.next();
-            if (next != null && next.getData() != null) {
-                String type = next.getData().getProperties().get("type");
-                if ("cache-fs".equals(type)) {
-                    iterator.remove();
-                }
-            }
-        }
-        if (providersInfos.size() > 0) {
-            return providersInfos.get(0).getData().getStorageInfo();
-        }
-        return new StorageInfoImpl(-1, -1, -1, -1, -1);
-    }
-
-    @Override
-    @Nullable
-    public BinaryInfo addBinaryRecord(String sha1, String md5, long length) {
-        try {
-            BinaryEntity result = binariesDao.load(sha1);
-            if (result == null) {
-                // It does not exists in the DB
-                // Let's check if in bin provider
-                if (binaryProvider.exists(sha1)) {
-                    // Good let's use it
-                    return getTransactionalMe().insertRecordInDb(sha1, md5, length);
-                }
-                return null;
-            }
-            return convertToBinaryInfo(result);
-        } catch (SQLException e) {
-            throw new StorageException("Could not reserved entry '" + sha1 + "'", e);
-        }
-    }
-
-    @Override
-    @Nonnull
-    public BinaryInfo addBinary(InputStream in) throws IOException {
-        if (in instanceof BinaryServiceInputStream) {
-            throw new IllegalStateException("Cannot add binary from checksum deploy "
-                    + ((BinaryServiceInputStream) in).getBinaryInfo());
-        }
-
-        BinaryInfo binaryInfo;
-        BinaryElement bi = binaryProvider.addStream(binaryProviderManager.createBinaryStream(in));
-        log.trace("Inserted binary {} to file store", bi.getSha1());
-        // From here we managed to create a binary record on the binary provider
-        // So, failing on the insert in DB (because saving the file took to long)
-        // can be re-tried based on the sha1
-        try {
-            binaryInfo = getTransactionalMe().insertRecordInDb(bi.getSha1(), bi.getMd5(), bi.getLength());
-        } catch (BinaryInsertRetryException e) {
-            if (log.isDebugEnabled()) {
-                log.info("Retrying add binary after receiving exception", e);
-            } else {
-                log.info("Retrying add binary after receiving exception: " + e.getMessage());
-            }
-            binaryInfo = addBinaryRecord(bi.getSha1(), bi.getMd5(), bi.getLength());
-            if (binaryInfo == null) {
-                throw new StorageException("Failed to add binary record with SHA1 " + bi.getSha1() +
-                        "during retry", e);
-            }
-        }
-        return binaryInfo;
-    }
-
-    @Override
-    public BinaryTreeElement<Map<String, String>> getBinaryProvidersInfo() {
-        // Get binary providers info tree from the binary store manager
-        BinaryTreeElement<BinaryProviderInfo> binaryProvidersInfo = binaryProviderManager.getBinaryProvidersInfo();
-        // Create sub tree that contains only essential elements (for the UI)
-        BinaryTreeElementScanner<BinaryProviderInfo, Map<String, String>> scanner = new BinaryTreeElementScanner<>();
-        EssentialBinaryTreeElementHandler handler = new EssentialBinaryTreeElementHandler();
-        return scanner.scan(binaryProvidersInfo, handler);
-    }
-
-    @Override
-    public InputStream getBinary(String sha1) {
-        return new ReaderTrackingInputStream(binaryProvider.getStream(sha1), sha1, this);
-    }
-
-    @Override
-    public InputStream getBinary(BinaryInfo bi) {
-        if (!binaryProvider.exists(bi.getSha1())) {
-            return null;
-        }
-        return new BinaryServiceInputStreamWrapper(bi, this);
-    }
-
-    class BinaryServiceInputStreamWrapper extends ReaderTrackingInputStream implements BinaryServiceInputStream {
-        private BinaryInfo bi;
-
-        public BinaryServiceInputStreamWrapper(BinaryInfo bi, UsageTracking usageTracking) {
-            super(null, bi.getSha1(), usageTracking);
-            this.bi = bi;
-        }
-
-        @Nonnull
-        @Override
-        public BinaryInfo getBinaryInfo() {
-            return bi;
-        }
-    }
-
-    @Override
-    public BinaryInfo findBinary(String sha1) {
-        try {
-            BinaryEntity result = binariesDao.load(sha1);
-            if (result != null) {
-                return convertToBinaryInfo(result);
-            }
-        } catch (SQLException e) {
-            throw new StorageException("Storage error loading checksum '" + sha1 + "'", e);
-        }
-        return null;
-    }
-
-    @Nonnull
-    @Override
-    public Set<BinaryInfo> findBinaries(@Nullable Collection<String> checksums) {
-        Set<BinaryInfo> results = Sets.newHashSet();
-        if (checksums == null || checksums.isEmpty()) {
-            return results;
-        }
-        try {
-            for (ChecksumType checksumType : ChecksumType.BASE_CHECKSUM_TYPES) {
-                Collection<String> validChecksums = extractValid(checksumType, checksums);
-                if (!validChecksums.isEmpty()) {
-                    Collection<BinaryEntity> found = binariesDao.search(checksumType, validChecksums);
-                    results.addAll(found.stream().map(this::convertToBinaryInfo).collect(Collectors.toList()));
-                }
-            }
-        } catch (SQLException e) {
-            throw new StorageException("Could not search for checksums " + checksums, e);
-        }
-        return results;
-    }
-
-    @Override
-    public GarbageCollectorInfo garbageCollect() {
-        notifyGCListenersOnStart();
-        final GarbageCollectorInfo result = new GarbageCollectorInfo();
-        Collection<BinaryEntity> binsToDelete;
-        try {
-            BinariesInfo countAndSize = binariesDao.getCountAndTotalSize();
-            result.initialCount = countAndSize.getBinariesCount();
-            result.initialSize = countAndSize.getBinariesSize();
-            binsToDelete = binariesDao.findPotentialDeletion();
-        } catch (SQLException e) {
-            throw new StorageException("Could not find potential Binaries to delete!", e);
-        }
-        result.stopScanTimestamp = System.currentTimeMillis();
-        result.candidatesForDeletion = binsToDelete.size();
-        if (result.candidatesForDeletion > 0) {
-            log.info("Found {} candidates for deletion", result.candidatesForDeletion);
-        }
-        for (BinaryEntity bd : binsToDelete) {
-            log.trace("Candidate for deletion: {}", bd);
-            dbService.invokeInTransaction("BinaryCleaner#" + bd.getSha1(), new BinaryCleaner(bd, result));
-        }
-
-        if (result.checksumsCleaned > 0) {
-            result.archivePathsCleaned = getTransactionalMe().deleteUnusedArchivePaths();
-            result.archiveNamesCleaned = getTransactionalMe().deleteUnusedArchiveNames();
-        }
-
-        result.gcEndTime = System.currentTimeMillis();
-
-        try {
-            BinariesInfo countAndSize = binariesDao.getCountAndTotalSize();
-            result.printCollectionInfo(countAndSize.getBinariesSize());
-        } catch (SQLException e) {
-            log.error("Could not list files due to " + e.getMessage());
-        }
-        boolean success = binaryProviderManager.optimize(forceBinaryProviderOptimizationOnce);
-        if (success) {
-            forceBinaryProviderOptimizationOnce = false;
-        }
-        notifyGCListenersOnFinished();
-        return result;
-    }
-
-    /**
-     * Deletes binary row and all dependent rows from the database
-     *
-     * @param sha1ToDelete Checksum to delete
-     * @return True if deleted. False if not found or error
-     */
-    private boolean deleteEntry(String sha1ToDelete) {
-        boolean hadArchiveEntries;
-        try {
-            hadArchiveEntries = archiveEntriesService.deleteArchiveEntries(sha1ToDelete);
-        } catch (Exception e) {
-            log.error("Failed to delete archive entries for " + sha1ToDelete, e);
-            return false;
-        }
-        try {
-            boolean entryDeleted = binariesDao.deleteEntry(sha1ToDelete) == 1;
-            if (!entryDeleted && hadArchiveEntries) {
-                log.error("Binary entry " + sha1ToDelete + " had archive entries that are deleted," +
-                        " but the binary line was not deleted! Re indexing of archive needed.");
-            }
-            return entryDeleted;
-        } catch (SQLException e) {
-            log.error("Could execute delete from binary store of " + sha1ToDelete, e);
-        }
-        return false;
-    }
-
-    @Override
-    public int deleteUnusedArchivePaths() {
-        try {
-            log.debug("Deleting unused archive paths");
-            return archiveEntriesService.deleteUnusedPathIds();
-        } catch (StorageException e) {
-            log.error("Failed to delete unique paths: {}", e.getMessage());
-            log.debug("Failed to delete unique paths", e);
-            return 0;
-        }
-    }
-
-    @Override
-    public int deleteUnusedArchiveNames() {
-        try {
-            log.debug("Deleting unused archive names");
-            return archiveEntriesService.deleteUnusedNameIds();
-        } catch (StorageException e) {
-            log.error("Failed to delete unique archive names: {}", e.getMessage());
-            log.debug("Failed to delete unique archive paths", e);
-            return 0;
-        }
-    }
-
-    @Override
-    public int incrementNoDeleteLock(String sha1) {
-        Pair<AtomicInteger, Long> pair = deleteProtectedBinaries.putIfAbsent(sha1, new Pair<>(new AtomicInteger(1), System.currentTimeMillis()));
-        if (pair == null) {
-            return 1;
-        } else {
-            pair.setSecond(System.currentTimeMillis());
-            return pair.getFirst().incrementAndGet();
-        }
-    }
-
-    @Override
-    public void decrementNoDeleteLock(String sha1) {
-        AtomicInteger usageCount = deleteProtectedBinaries.get(sha1).getFirst();
-        if (usageCount != null) {
-            usageCount.decrementAndGet();
-        }
-    }
-
-    @Override
-    public Collection<BinaryInfo> findAllBinaries() {
-        try {
-            Collection<BinaryEntity> allBinaries = binariesDao.findAll();
-            List<BinaryInfo> result = new ArrayList<>(allBinaries.size());
-            result.addAll(allBinaries.stream().map(this::convertToBinaryInfo).collect(Collectors.toList()));
-            return result;
-        } catch (SQLException e) {
-            throw new StorageException("Could not retrieve all binary entries", e);
-        }
-    }
-
-    @Override
-    @Nonnull
-    public BinaryInfo insertRecordInDb(String sha1, String md5, long length) throws StorageException {
-        BinaryEntityWithValidation dataRecord = new BinaryEntityWithValidation(sha1, md5, length);
-        if (!dataRecord.isValid()) {
-            throw new StorageException("Cannot insert invalid binary record: " + dataRecord);
-        }
-        try {
-            boolean binaryExists = binariesDao.exists(sha1);
-            if (!binaryExists) {
-                createDataRecord(dataRecord, sha1);
-            }
-            // Always reselect from DB before returning
-            BinaryEntity justInserted = binariesDao.load(sha1);
-            if (justInserted == null) {
-                throw new StorageException("Could not find just inserted binary record: " + dataRecord);
-            }
-            return convertToBinaryInfo(justInserted);
-        } catch (SQLException e) {
-            throw new StorageException("Failed to insert new binary record: " + e.getMessage(), e);
-        }
-    }
-
-    /**
-     * @return Number of binaries and total size stored in the binary store
-     */
-    @Override
-    public BinariesInfo getBinariesInfo() {
-        try {
-            return binariesDao.getCountAndTotalSize();
-        } catch (SQLException e) {
-            throw new StorageException("Could not calculate total size due to " + e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public long getStorageSize() {
-        return getBinariesInfo().getBinariesSize();
-    }
-
-    @Override
-    public void ping() {
-        // Ping to storage
-        binaryProviderManager.ping();
-        // Ping to DB
-        try {
-            if (binariesDao.exists("does not exists")) {
-                throw new StorageException("Select entry fails");
-            }
-        } catch (SQLException e) {
-            throw new StorageException("Accessing Binary Store DB failed with " + e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public void prune(BasicStatusHolder statusHolder) {
-        boolean locked = lock.tryLock();
-        if (locked) {
-            try {
-                pruneInternal(statusHolder);
-            } finally {
-                lock.unlock();
-            }
-        } else {
-            throw new PruneException("The prune process is already running");
-        }
-    }
-
-    /**
-     * @param sha1 sha1 checksum of the binary to check
-     * @return True if the given binary is currently used by a reader (e.g., open stream) or writer
-     */
-    @Override
-    public boolean isActivelyUsed(String sha1) {
-        Pair<AtomicInteger, Long> pair = deleteProtectedBinaries.get(sha1);
-        return pair != null && pair.getFirst().get() > 0;
-    }
-
-    private Collection<String> extractValid(ChecksumType checksumType, Collection<String> checksums) {
-        Collection<String> results = Sets.newHashSet();
-        results.addAll(checksums.stream().filter(checksumType::isValid).collect(Collectors.toList()));
-        return results;
-    }
-
-    private InternalBinaryService getTransactionalMe() {
-        return ContextHelper.get().beanForType(InternalBinaryService.class);
-    }
-
-    private BinaryInfo convertToBinaryInfo(BinaryEntity bd) {
-        return new BinaryInfoImpl(bd.getSha1(), bd.getMd5(), bd.getLength());
-    }
-
-    private void notifyGCListenersOnStart() {
-        garbageCollectorListeners.forEach(GarbageCollectorListener::start);
-    }
-
-    private void notifyGCListenersOnFinished() {
-        garbageCollectorListeners.forEach(GarbageCollectorListener::finished);
-    }
-
-    private void notifyGCListenersOnDestroy() {
-        garbageCollectorListeners.forEach(GarbageCollectorListener::destroy);
-    }
-
-    private Map<String, BinaryEntity> isInStore(Set<String> sha1List) {
-        try {
-            return binariesDao.search(ChecksumType.sha1, sha1List).stream().collect(
-                    Collectors.toMap(BinaryEntity::getSha1, (p) -> p));
-        } catch (SQLException e) {
-            throw new StorageException("Could search for checksum list!", e);
-        }
-    }
-
-    @Override
-    public List<String> getAndManageErrors() {
-        List<String> errors = binaryProviderManager.getErrors();
-        if (errors.size() > 0) {
-            forceOptimizationOnce();
-        }
-        return errors;
-    }
-
-    @Override
-    public void forceOptimizationOnce() {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        HaCommonAddon haCommonAddon = addonsManager.addonByType(HaCommonAddon.class);
-        if (haCommonAddon.isHaEnabled() && !haCommonAddon.isPrimary()) {
-            haCommonAddon.forceOptimizationOnce();
-        } else {
-            forceBinaryProviderOptimizationOnce = true;
-        }
-    }
-
-    private void createDataRecord(BinaryEntity dataRecord, String sha1) throws SQLException {
-        // insert a new binary record to the db
-        try {
-            binariesDao.create(dataRecord);
-        } catch (SQLException e) {
-            if (isDuplicatedEntryException(e)) {
-                log.debug("Simultaneous insert of binary {} detected, binary will be checked.", sha1, e);
-                throw new BinaryInsertRetryException(convertToBinaryInfo(dataRecord), e);
-            } else {
-                throw e;
-            }
-        }
-    }
-
-    private boolean isDuplicatedEntryException(SQLException exception) {
-        String message = exception.getMessage();
-        return message.contains("duplicate key") // Derby message
-                || message.contains("Duplicate entry") // MySQL message
-                || message.contains("unique constraint"); // Oracle message
-    }
-
-    private void pruneInternal(BasicStatusHolder statusHolder) {
-        long start = System.currentTimeMillis();
-        long filesMoved = 0;
-        long totalSize = 0;
-        int chunkSize = ConstantValues.binaryProviderPruneChunkSize.getInt();
-        try (ObjectInputStream stream = binaryProviderManager.getBinariesDataStream()) {
-            HashSet<BinaryElement> chunk = Sets.newHashSet();
-            while (true) {
-                BinaryElement binaryInfo = (BinaryElement) stream.readObject();
-                if (binaryInfo != null) {
-                    chunk.add(binaryInfo);
-                }
-                if (chunk.size() >= chunkSize || binaryInfo == null) {
-                    Map<String, BinaryEntity> inStore = isInStore(chunk.stream().map(BinaryElement::getSha1).collect(Collectors.toSet()));
-                    for (BinaryElement data : chunk) {
-                        if (!inStore.keySet().contains(data.getSha1())) {
-                            if (isActivelyUsed(data.getSha1())) {
-                                statusHolder.status("Skipping deletion for in-use artifact record: " + data.getSha1(), log);
-                            } else {
-                                boolean delete = binaryProvider.delete(data.getSha1());
-                                if (!delete) {
-                                    statusHolder.error("Could not delete file " + data.getSha1(), log);
-                                } else {
-                                    filesMoved++;
-                                    totalSize += data.getLength();
-                                }
-                            }
-                        }
-                    }
-                    if (binaryInfo == null) {
-                        break;
-                    } else {
-                        chunk.clear();
-                    }
-                }
-            }
-        } catch (Exception e) {
-            statusHolder.error("Failed to execute prune, cause: " + e.getMessage(), e, log);
-            log.error("Failed to execute prune, cause: ", e);
-        }
-
-        long tt = (System.currentTimeMillis() - start);
-        statusHolder.status("Removed " + filesMoved
-                + " files in total size of " + StorageUnit.toReadableString(totalSize)
-                + " (" + tt + "ms).", log);
-    }
-
-    public boolean isFileExist(String sha1) {
-        return binaryProvider.exists(sha1);
-    }
-
-    /**
-     * Deletes a single binary from the database and filesystem if not in use.
-     */
-    private class BinaryCleaner implements Callable<Void> {
-        private final GarbageCollectorInfo result;
-        private final BinaryEntity bd;
-
-        public BinaryCleaner(BinaryEntity bd, GarbageCollectorInfo result) {
-            this.result = result;
-            this.bd = bd;
-        }
-
-        @Override
-        public Void call() throws Exception {
-            String sha1 = bd.getSha1();
-            deleteProtectedBinaries.putIfAbsent(sha1, new Pair<>(new AtomicInteger(0), System.currentTimeMillis()));
-            Pair<AtomicInteger, Long> pair = deleteProtectedBinaries.get(sha1);
-            if (pair.getFirst().compareAndSet(0, -30)) {
-                log.debug("Targeting '{}' for deletion as it not seems to be used", sha1);
-                try {
-                    if (deleteEntry(sha1)) {
-                        log.trace("Deleted {} record from binaries table", sha1);
-                        result.checksumsCleaned++;
-                        if (binaryProvider.delete(sha1)) {
-                            log.trace("Deleted {} binary", sha1);
-                            result.binariesCleaned++;
-                            result.totalSizeCleaned += bd.getLength();
-                        } else {
-                            log.error("Could not delete binary '{}'", sha1);
-                        }
-                    } else {
-                        log.debug("Deleting '{}' has failed", sha1);
-                    }
-                } finally {
-                    // remove delete protection (even if delete was not successful)
-                    deleteProtectedBinaries.remove(sha1);
-                    log.debug("Cleaning '{}' from ref. counter", sha1);
-                }
-            } else {
-                Long timestamp = pair.getSecond();
-                log.info("Binary {} has {} readers with last timestamp of {}", sha1, pair.getFirst().get(), timestamp);
-                long treshTime = (System.currentTimeMillis() - timestamp) / 1000;
-                if (treshTime > ConstantValues.gcReadersMaxTimeSecs.getLong()) {
-                    log.info("Binary {} has reached it's max read time, removing it from ref. counter", sha1);
-                    deleteProtectedBinaries.remove(sha1);
-                } else {
-                    log.info("Binary {} is being read! Not deleting.", sha1);
-                }
-            }
-            return null;
-        }
-    }
-
-    /**
-     * Collects a list of file binaries providers
-     */
-    private static void collectBinaryProviderInfo(List<BinaryTreeElement<BinaryProviderInfo>> list,
-                                                  BinaryTreeElement<BinaryProviderInfo> binaryProvidersInfo) {
-        if (binaryProvidersInfo == null) {
-            return;
-        }
-        list.add(binaryProvidersInfo);
-        collectBinaryProviderInfo(list, binaryProvidersInfo.getNextBinaryTreeElement());
-        for (BinaryTreeElement<BinaryProviderInfo> elements : binaryProvidersInfo.getSubBinaryTreeElements()) {
-            collectBinaryProviderInfo(list, elements);
-        }
-    }
-
-    /**
-     * Collects a list of file binaries providers
-     */
-    private static void collectFileBinaryProvidersDirsInternal(List<FileBinaryProviderInfo> list,
-                                                               BinaryTreeElement<BinaryProviderInfo> binaryProvidersInfo) {
-        if (binaryProvidersInfo == null) {
-            return;
-        }
-        String type = binaryProvidersInfo.getData().getProperties().get("type");
-        if ("file-system".equals(type)) {
-            FileBinaryProviderInfo info = createFileBinaryProviderInfo(binaryProvidersInfo, type);
-            list.add(info);
-        }
-        if ("cache-fs".equals(type)) {
-            FileBinaryProviderInfo info = createCacheFileBinaryProviderInfo(binaryProvidersInfo, type);
-            list.add(info);
-        }
-        collectFileBinaryProvidersDirsInternal(list, binaryProvidersInfo.getNextBinaryTreeElement());
-        for (BinaryTreeElement<BinaryProviderInfo> elements : binaryProvidersInfo.getSubBinaryTreeElements()) {
-            collectFileBinaryProvidersDirsInternal(list, elements);
-        }
-    }
-
-    private static FileBinaryProviderInfo createFileBinaryProviderInfo(BinaryTreeElement<BinaryProviderInfo> binaryProvidersInfo, String type) {
-
-        String temp = binaryProvidersInfo.getData().getProperties().get("tempDir");
-        String binariesDir = binaryProvidersInfo.getData().getProperties().get("binariesDir");
-        if (new File(binariesDir).isAbsolute()) {
-            File tempDir = new File(new File(binariesDir), temp);
-            File fileStoreDir = new File(binariesDir);
-            return new FileBinaryProviderInfo(tempDir, fileStoreDir, type);
-        } else {
-            File tempDir = new File(new File(binariesDir), temp);
-            File fileStoreDir = new File(binariesDir);
-            return new FileBinaryProviderInfo(tempDir, fileStoreDir, type);
-        }
-
-    }
-
-    private static FileBinaryProviderInfo createCacheFileBinaryProviderInfo(BinaryTreeElement<BinaryProviderInfo> binaryProvidersInfo, String type) {
-        String temp = binaryProvidersInfo.getData().getProperties().get("tempDir");
-        String binariesDir = binaryProvidersInfo.getData().getProperties().get("binariesDir");
-        File tempDir = new File(new File(binariesDir), temp);
-        File fileStoreDir = new File(binariesDir);
-        return new FileBinaryProviderInfo(tempDir, fileStoreDir, type);
-    }
-
-}
-
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/binstore/service/BinaryServiceInputStream.java b/storage/db/src/main/java/org/artifactory/storage/db/binstore/service/BinaryServiceInputStream.java
deleted file mode 100644
index 43ec027..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/binstore/service/BinaryServiceInputStream.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.binstore.service;
-
-import org.artifactory.storage.binstore.service.BinaryInfo;
-
-import javax.annotation.Nonnull;
-
-/**
- * A streams that reads from the binary store. The binary itself is guaranteed to be in the binary store while this
- * stream is open.
- *
- * @author Yossi Shaul
- */
-public interface BinaryServiceInputStream {
-
-    /**
-     * @return The full Binary Info object used from checksum deploy.
-     */
-    @Nonnull
-    BinaryInfo getBinaryInfo();
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/binstore/service/BlobBinaryProvider.java b/storage/db/src/main/java/org/artifactory/storage/db/binstore/service/BlobBinaryProvider.java
deleted file mode 100644
index cbf2c1f..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/binstore/service/BlobBinaryProvider.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.binstore.service;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.RandomStringUtils;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.storage.StorageException;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.db.DbType;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.artifactory.storage.db.util.blob.BlobWrapperFactory;
-import org.jfrog.storage.binstore.annotation.BinaryProviderClassInfo;
-import org.jfrog.storage.binstore.exceptions.BinaryNotFoundException;
-import org.jfrog.storage.binstore.ifc.BinaryStream;
-import org.jfrog.storage.binstore.ifc.model.BinaryElement;
-import org.jfrog.storage.binstore.ifc.model.StorageInfo;
-import org.jfrog.storage.binstore.providers.base.BinaryProviderBase;
-import org.jfrog.storage.binstore.providers.base.StorageInfoImpl;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nonnull;
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-
-import static org.artifactory.storage.db.binstore.dao.BinariesDao.TEMP_SHA1_PREFIX;
-
-/**
- * Date: 12/12/12
- * Time: 4:29 PM
- *
- * @author freds
- */
- at BinaryProviderClassInfo(nativeName = "blob")
-public class BlobBinaryProvider extends BinaryProviderBase {
-    private static final Logger log = LoggerFactory.getLogger(BlobBinaryProvider.class);
-
-    private JdbcHelper jdbcHelper;
-    private DbType databaseType;
-    private BlobWrapperFactory blobsFactory;
-
-    @Override
-    public void initialize() {
-        ArtifactoryContext context = ContextHelper.get();
-        this.databaseType = context.beanForType(DbService.class).getDatabaseType();
-        this.blobsFactory = context.beanForType(BlobWrapperFactory.class);
-        jdbcHelper = context.beanForType(JdbcHelper.class);
-        if (jdbcHelper == null) {
-            throw new IllegalArgumentException("Cannot create Blob binary provider without JDBC Helper!");
-        }
-    }
-
-    @Override
-    public boolean exists(String sha1) {
-        try {
-            long lengthFound;
-            if (databaseType != DbType.MSSQL) {
-                lengthFound = jdbcHelper.executeSelectLong(
-                        "SELECT LENGTH(data) FROM binary_blobs where sha1 = ?", sha1);
-            } else {    // mssql use len() function
-                lengthFound = jdbcHelper.executeSelectLong("SELECT DATALENGTH(data) FROM binary_blobs where sha1 = ?", sha1);
-            }
-            if (lengthFound != DbService.NO_DB_ID) {
-                log.trace("Found sha1 {} with length {}", sha1);
-                return true;
-            }
-        } catch (SQLException e) {
-            throw new StorageException("Could not verify existence of " + sha1, e);
-        }
-        return next().exists(sha1);
-    }
-
-    @Nonnull
-    @Override
-    public InputStream getStream(String sha1) throws BinaryNotFoundException {
-        try {
-            /*if (TransactionSynchronizationManager.isSynchronizationActive()) {
-                throw new StorageException("Cannot retrieve binary data of " +
-                        sha1 + " since the datasource is in transaction!");
-            }*/
-            ResultSet rs = jdbcHelper.executeSelect("SELECT data FROM binary_blobs where sha1 = ?", sha1);
-            if (rs.next()) {
-                return new BlobStream(rs.getBinaryStream(1), rs);
-            } else {
-                DbUtils.close(rs);
-            }
-        } catch (SQLException e) {
-            throw new StorageException("Could not select content for " + sha1, e);
-        }
-        return next().getStream(sha1);
-    }
-
-    @Nonnull
-    @Override
-    public StorageInfo getStorageInfo() {
-        log.warn("Storage info is not supported in blob binary provider, returning empty storage info");
-        return new StorageInfoImpl(Long.MAX_VALUE, -Long.MAX_VALUE, -1, -1, 100);
-    }
-
-    @Nonnull
-    @Override
-    public BinaryElement addStream(BinaryStream binaryStream) throws IOException {
-        try {
-
-            // Create a dummy ID
-            String randomId = TEMP_SHA1_PREFIX + RandomStringUtils.randomAlphanumeric(40 - TEMP_SHA1_PREFIX.length());
-            int inserted = jdbcHelper.executeUpdate("INSERT INTO binary_blobs VALUES (?,?)", randomId,
-                    blobsFactory.create(binaryStream.getStream()));
-            if (inserted != 1) {
-                throw new StorageException("Stream failed with unknown reason! Total line inserted was " + inserted);
-            }
-            binaryStream.close();
-            BinaryElement bd = getCallbackService().createBinaryElement(binaryStream.getSha1(), binaryStream.getMd5(), binaryStream.getLength());
-            log.trace("Inserting {} in blob binary provider", bd);
-
-            String sha1 = bd.getSha1();
-            if (!exists(sha1)) {
-                int updated = 0;
-                try {
-                    updated = jdbcHelper.executeUpdate("UPDATE binary_blobs SET sha1 = ? WHERE sha1 = ?",
-                            sha1, randomId);
-                } catch (SQLException e) {
-                    // May get duplicate key violated on concurrent insert
-                    // TORE: [by fsi] with good SQL error handling should limit to duplicate key violation cases
-                    log.debug("Got exception moving temp blob line " + randomId + " to " + sha1, e);
-                    if (exists(sha1)) {
-                        // All is OK someone else did the job already
-                        deleteTempRow(randomId, sha1);
-                        updated = 1;
-                    }
-                }
-                if (updated != 1) {
-                    deleteTempRow(randomId, sha1);
-                    throw new StorageException(
-                            "Could not update line " + randomId + " with " + sha1
-                                    + " ! Total line updated was " + updated);
-                }
-            } else {
-                deleteTempRow(randomId, sha1);
-            }
-
-            return bd;
-        } catch (SQLException e) {
-            throw new StorageException("Could not insert Stream due to:" + e.getMessage(), e);
-        } finally {
-            IOUtils.closeQuietly(binaryStream);
-        }
-    }
-
-    private void deleteTempRow(String randomId, String sha1) throws SQLException {
-        int deleted = jdbcHelper.executeUpdate("DELETE FROM binary_blobs WHERE sha1 = ?", randomId);
-        if (deleted != 1) {
-            throw new StorageException(
-                    "Deletion of temporary line " + randomId + " which match sha1='" + sha1
-                            + "' did not return 1!\nTotal line deleted was " + deleted);
-        }
-    }
-
-    @Override
-    public boolean delete(String sha1) {
-        try {
-            int deleted = jdbcHelper.executeUpdate("DELETE FROM binary_blobs WHERE sha1 = ?", sha1);
-            if (deleted != 1) {
-                log.warn("Deletion of blob entry {} did not update any lines! Got {}", sha1, deleted);
-            }
-        } catch (SQLException e) {
-            throw new StorageException("Could not insert Stream due to:" + e.getMessage(), e);
-        }
-        return next().delete(sha1);
-    }
-
-    static class BlobStream extends FilterInputStream {
-        private final ResultSet resultSet;
-        private boolean closed = false;
-
-        BlobStream(InputStream in, ResultSet resultSet) {
-            super(in);
-            this.resultSet = resultSet;
-        }
-
-        @Override
-        public void close() throws IOException {
-            try {
-                super.close();
-            } finally {
-                if (!closed) {
-                    closed = true;
-                    DbUtils.close(resultSet);
-                }
-            }
-        }
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/binstore/service/ExternalBinaryProviderHelper.java b/storage/db/src/main/java/org/artifactory/storage/db/binstore/service/ExternalBinaryProviderHelper.java
deleted file mode 100644
index 007479c..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/binstore/service/ExternalBinaryProviderHelper.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.artifactory.storage.db.binstore.service;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.storage.StorageUnit;
-import org.artifactory.storage.db.binstore.dao.BinariesDao;
-import org.artifactory.storage.db.binstore.entity.BinaryEntity;
-import org.jfrog.storage.binstore.ifc.BinaryProviderConfig;
-import org.jfrog.storage.binstore.ifc.BinaryProviderManager;
-import org.jfrog.storage.binstore.ifc.ProviderConnectMode;
-import org.jfrog.storage.binstore.ifc.provider.ExternalWrapperBinaryProvider;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.sql.SQLException;
-import java.util.Collection;
-
-
-/**
- * @author gidis
- */
-public abstract class ExternalBinaryProviderHelper {
-    private static final Logger log = LoggerFactory.getLogger(ExternalBinaryProviderHelper.class);
-
-    public static void disconnectFromFileStore(BinaryServiceImpl binaryStore, File externalDirFile,
-                                               ProviderConnectMode disconnectMode, BasicStatusHolder statusHolder,
-                                               BinaryProviderManager manager, BinariesDao binariesDao,
-            BinaryProviderConfig defaultValues) {
-        // The external binary provider works only if the file binary provider is not null
-        if (binaryStore.getBinariesDir() == null) {
-            return;
-        }
-        // First search for the external binary store to disconnect
-        ExternalWrapperBinaryProvider wrapper = manager.getExternalWrapperBinaryProvider(externalDirFile);
-        String externalDir = externalDirFile.getAbsolutePath();
-        if (wrapper != null) {
-            wrapper.setConnectMode(disconnectMode);
-        } else {
-            String absolutePath = binaryStore.getBinariesDir().getAbsolutePath();
-            manager.initializeExternalBinaryProvider(disconnectMode.propName, externalDir, absolutePath, defaultValues);
-            wrapper = manager.getExternalWrapperBinaryProvider(externalDirFile);
-        }
-
-        // Now run fetch all on wrapper
-        try {
-            statusHolder.status("Disconnecting " + externalDir
-                    + " using mode " + disconnectMode.propName, log);
-            Collection<BinaryEntity> all = binariesDao.findAll();
-            long sizeMoved = 0L;
-            int total = all.size();
-            int checked = 0;
-            int done = 0;
-            statusHolder.status("Found " + total + " files to disconnect!", log);
-            for (BinaryEntity data : all) {
-                try {
-                    String sha1 = data.getSha1();
-                    if (wrapper.connect(sha1)) {
-                        statusHolder.debug("Activated " + disconnectMode.propName + " on " + sha1, log);
-                        done++;
-                        sizeMoved += data.getLength();
-                    } else {
-                        statusHolder.debug("File " + sha1 + " checked", log);
-                    }
-                    checked++;
-                } catch (Exception e) {
-                    statusHolder.error("Problem connecting checksum " + data, e, log);
-                }
-                if (checked % 200 == 0) {
-                    statusHolder.status("Checked " + checked + "/" + total +
-                            " files and disconnected " + done +
-                            " total size " + disconnectMode.propName +
-                            " is " + StorageUnit.toReadableString(sizeMoved), log);
-                }
-            }
-            statusHolder.status("Checked " + checked + " files out of " + total +
-                    " files and disconnected " + done +
-                    " total size " + disconnectMode.propName +
-                    " is " + StorageUnit.toReadableString(sizeMoved), log);
-        } catch (SQLException e) {
-            statusHolder.error("Could fetch all binary data from binary store", e, log);
-        }
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/binstore/visitors/BinaryTreeElementHandler.java b/storage/db/src/main/java/org/artifactory/storage/db/binstore/visitors/BinaryTreeElementHandler.java
deleted file mode 100644
index abacc1d..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/binstore/visitors/BinaryTreeElementHandler.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.artifactory.storage.db.binstore.visitors;
-
-import org.jfrog.storage.binstore.ifc.model.BinaryTreeElement;
-
-/**
- * @author gidis
- */
-public interface BinaryTreeElementHandler<T, Y> {
-    Y visit(BinaryTreeElement<T> binaryTreeElement);
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/binstore/visitors/BinaryTreeElementScanner.java b/storage/db/src/main/java/org/artifactory/storage/db/binstore/visitors/BinaryTreeElementScanner.java
deleted file mode 100644
index b1f8c0f..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/binstore/visitors/BinaryTreeElementScanner.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.artifactory.storage.db.binstore.visitors;
-
-import com.google.common.collect.Lists;
-import org.jfrog.storage.binstore.ifc.model.BinaryTreeElement;
-
-import java.util.List;
-
-/**
- * @author gidis
- */
-public class BinaryTreeElementScanner<T, Y> {
-
-    public BinaryTreeElement<Y> scan(BinaryTreeElement<T> binaryTreeElement, BinaryTreeElementHandler<T, Y> handler) {
-        BinaryTreeElement<Y> element = new BinaryTreeElement<>();
-        Y data = handler.visit(binaryTreeElement);
-        if (data != null) {
-            element.setData(data);
-            if (binaryTreeElement.getNextBinaryTreeElement() != null) {
-                element.setNextBinaryTreeElement(scan(binaryTreeElement.getNextBinaryTreeElement(), handler));
-            }
-            List<BinaryTreeElement<Y>> list = Lists.newArrayList();
-            element.setSubBinaryTreeElements(list);
-            for (BinaryTreeElement<T> subElement : binaryTreeElement.getSubBinaryTreeElements()) {
-                list.add(scan(subElement, handler));
-            }
-            return element;
-        } else {
-            if (binaryTreeElement.getNextBinaryTreeElement() != null) {
-                return scan(binaryTreeElement.getNextBinaryTreeElement(), handler);
-            }
-        }
-        return null;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/binstore/visitors/EssentialBinaryTreeElementHandler.java b/storage/db/src/main/java/org/artifactory/storage/db/binstore/visitors/EssentialBinaryTreeElementHandler.java
deleted file mode 100644
index c7a600f..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/binstore/visitors/EssentialBinaryTreeElementHandler.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.artifactory.storage.db.binstore.visitors;
-
-import org.jfrog.storage.binstore.ifc.BinaryProviderInfo;
-import org.jfrog.storage.binstore.ifc.model.BinaryTreeElement;
-import org.jfrog.storage.binstore.ifc.model.StorageInfo;
-
-import java.util.Map;
-
-/**
- * @author gidis
- */
-public class EssentialBinaryTreeElementHandler implements BinaryTreeElementHandler<BinaryProviderInfo, Map<String, String>> {
-    public static boolean isDisplayable(BinaryProviderInfo data) {
-        String type = data.getProperties().get("type");
-        switch (type) {
-            case "empty": {
-                return false;
-            }
-            case "eventual": {
-                return false;
-            }
-            case "retry": {
-                return false;
-            }
-            case "tracking": {
-                return false;
-            }
-            case "external-wrapper": {
-                return false;
-            }
-            default: {
-                return true;
-            }
-        }
-    }
-
-    @Override
-    public Map<String, String> visit(BinaryTreeElement<BinaryProviderInfo> binaryTreeElement) {
-        BinaryProviderInfo data = binaryTreeElement.getData();
-        boolean displayable = isDisplayable(data);
-        if (displayable) {
-            StorageInfo storageInfo = data.getStorageInfo();
-            data.addProperty("freeSpace", toString(storageInfo.getFreeSpace()));
-            data.addProperty("usageSpace", "" + toString(storageInfo.getUsageSpace()));
-            data.addProperty("totalSpace", "" + toString(storageInfo.getTotalSpace()));
-            data.addProperty("usageSpaceInPercent", "" + toString(storageInfo.getUsageSpaceInPercent()));
-            data.addProperty("freeSpaceInPercent", "" + toString(storageInfo.getFreeSpaceInPercent()));
-            return data.getProperties();
-        }
-        return null;
-    }
-
-    private String toString(Long number) {
-        return Long.MAX_VALUE == number ? "infinite" : -1 == number ? "unsupported" : "" + number;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/build/dao/BuildArtifactsDao.java b/storage/db/src/main/java/org/artifactory/storage/db/build/dao/BuildArtifactsDao.java
deleted file mode 100644
index 37a0989..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/build/dao/BuildArtifactsDao.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.build.dao;
-
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.storage.db.build.entity.BuildArtifact;
-import org.artifactory.storage.db.util.BaseDao;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Repository;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Date: 10/30/12
- * Time: 12:44 PM
- *
- * @author freds
- */
- at Repository
-public class BuildArtifactsDao extends BaseDao {
-
-    @Autowired
-    public BuildArtifactsDao(JdbcHelper jdbcHelper) {
-        super(jdbcHelper);
-    }
-
-    public int createBuildArtifacts(List<BuildArtifact> bas) throws SQLException {
-        int res = 0;
-        for (BuildArtifact ba : bas) {
-            // TODO: Make it big single SQL
-            res += createBuildArtifact(ba);
-        }
-        return res;
-    }
-
-    public int createBuildArtifact(BuildArtifact ba) throws SQLException {
-        return jdbcHelper.executeUpdate("INSERT INTO build_artifacts VALUES(" +
-                "?, ?," +
-                "?, ?," +
-                "?, ?)",
-                ba.getArtifactId(), ba.getModuleId(),
-                ba.getArtifactName(), ba.getArtifactType(),
-                ba.getSha1(), ba.getMd5());
-    }
-
-    public int deleteBuildArtifacts(List<Long> moduleIds) throws SQLException {
-        return jdbcHelper.executeUpdate("DELETE FROM build_artifacts WHERE module_id IN (#)", moduleIds);
-    }
-
-    public int deleteAllBuildArtifacts() throws SQLException {
-        return jdbcHelper.executeUpdate("DELETE FROM build_artifacts");
-    }
-
-    public List<BuildArtifact> findArtifactsForModules(List<Long> moduleIds) throws SQLException {
-        ResultSet rs = null;
-        List<BuildArtifact> artifacts = null;
-        try {
-            rs = jdbcHelper.executeSelect("SELECT * FROM build_artifacts WHERE module_id IN (#)", moduleIds);
-            artifacts = new ArrayList<>();
-            while (rs.next()) {
-                artifacts.add(resultSetToBuildArtifact(rs));
-            }
-        } finally {
-            DbUtils.close(rs);
-        }
-        return artifacts;
-    }
-
-    public List<BuildArtifact> findArtifactsForModule(long moduleId) throws SQLException {
-        ResultSet resultSet = null;
-        List<BuildArtifact> artifacts = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM build_artifacts WHERE module_id = ?", moduleId);
-            artifacts = new ArrayList<>();
-            while (resultSet.next()) {
-                artifacts.add(resultSetToBuildArtifact(resultSet));
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        return artifacts;
-    }
-
-    public List<BuildArtifact> findArtifactsForChecksum(ChecksumType type, String checksum)
-            throws SQLException {
-        ResultSet resultSet = null;
-        List<BuildArtifact> artifacts = null;
-        try {
-            resultSet = jdbcHelper.executeSelect(
-                    "SELECT * FROM build_artifacts WHERE " + type.name() + " = ?", checksum);
-            artifacts = new ArrayList<>();
-            while (resultSet.next()) {
-                artifacts.add(resultSetToBuildArtifact(resultSet));
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        return artifacts;
-    }
-
-    private BuildArtifact resultSetToBuildArtifact(ResultSet resultSet) throws SQLException {
-        return new BuildArtifact(resultSet.getLong(1), resultSet.getLong(2),
-                resultSet.getString(3), resultSet.getString(4),
-                resultSet.getString(5), resultSet.getString(6));
-    }
-
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/build/dao/BuildDependenciesDao.java b/storage/db/src/main/java/org/artifactory/storage/db/build/dao/BuildDependenciesDao.java
deleted file mode 100644
index 08fcc9d..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/build/dao/BuildDependenciesDao.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.build.dao;
-
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.storage.db.build.entity.BuildDependency;
-import org.artifactory.storage.db.util.BaseDao;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Repository;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Date: 10/30/12
- * Time: 12:44 PM
- *
- * @author freds
- */
- at Repository
-public class BuildDependenciesDao extends BaseDao {
-
-    @Autowired
-    public BuildDependenciesDao(JdbcHelper jdbcHelper) {
-        super(jdbcHelper);
-    }
-
-    public int createBuildDependencies(List<BuildDependency> bds) throws SQLException {
-        int res = 0;
-        for (BuildDependency bd : bds) {
-            // TODO: Make it big single SQL
-            res += createBuildDependency(bd);
-        }
-        return res;
-    }
-
-    public int createBuildDependency(BuildDependency bd) throws SQLException {
-        return jdbcHelper.executeUpdate("INSERT INTO build_dependencies VALUES(" +
-                "?, ?," +
-                "?, ?, ?," +
-                "?, ?)",
-                bd.getDependencyId(), bd.getModuleId(),
-                bd.getDependencyNameId(), bd.getDependencyScopes(), bd.getDependencyType(),
-                bd.getSha1(), bd.getMd5());
-    }
-
-    public int deleteBuildDependencies(List<Long> moduleIds) throws SQLException {
-        return jdbcHelper.executeUpdate("DELETE FROM build_dependencies WHERE module_id IN (#)", moduleIds);
-    }
-
-    public int deleteAllBuildDependencies() throws SQLException {
-        return jdbcHelper.executeUpdate("DELETE FROM build_dependencies");
-    }
-
-    public List<BuildDependency> findDependenciesForModules(List<Long> moduleIds) throws SQLException {
-        ResultSet resultSet = null;
-        List<BuildDependency> dependencies = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM build_dependencies WHERE module_id IN (#)", moduleIds);
-            dependencies = new ArrayList<>();
-            while (resultSet.next()) {
-                dependencies.add(resultSetToBuildDependency(resultSet));
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        return dependencies;
-    }
-
-    public List<BuildDependency> findDependenciesForModule(long moduleId) throws SQLException {
-        ResultSet resultSet = null;
-        List<BuildDependency> dependencies = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM build_dependencies WHERE module_id = ?", moduleId);
-            dependencies = new ArrayList<>();
-            while (resultSet.next()) {
-                dependencies.add(resultSetToBuildDependency(resultSet));
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        return dependencies;
-    }
-
-    public List<BuildDependency> findDependenciesForChecksum(ChecksumType type, String checksum)
-            throws SQLException {
-        ResultSet resultSet = null;
-        List<BuildDependency> dependencies = null;
-        try {
-            resultSet = jdbcHelper.executeSelect(
-                    "SELECT * FROM build_dependencies WHERE " + type.name() + " = ?", checksum);
-            dependencies = new ArrayList<>();
-            while (resultSet.next()) {
-                dependencies.add(resultSetToBuildDependency(resultSet));
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        return dependencies;
-    }
-
-    private BuildDependency resultSetToBuildDependency(ResultSet resultSet) throws SQLException {
-        return new BuildDependency(resultSet.getLong(1), resultSet.getLong(2),
-                resultSet.getString(3), resultSet.getString(4), resultSet.getString(5),
-                resultSet.getString(6), resultSet.getString(7));
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/build/dao/BuildModulesDao.java b/storage/db/src/main/java/org/artifactory/storage/db/build/dao/BuildModulesDao.java
deleted file mode 100644
index 34c8ab2..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/build/dao/BuildModulesDao.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.build.dao;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.storage.db.build.entity.BuildModule;
-import org.artifactory.storage.db.build.entity.ModuleProperty;
-import org.artifactory.storage.db.util.BaseDao;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Repository;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Date: 10/30/12
- * Time: 12:44 PM
- *
- * @author freds
- */
- at Repository
-public class BuildModulesDao extends BaseDao {
-
-    @Autowired
-    public BuildModulesDao(JdbcHelper jdbcHelper) {
-        super(jdbcHelper);
-    }
-
-    public int createBuildModules(List<BuildModule> bms) throws SQLException {
-        int res = 0;
-        for (BuildModule bm : bms) {
-            res += createBuildModule(bm);
-        }
-        return res;
-    }
-
-    public int createBuildModule(BuildModule bm) throws SQLException {
-        int res = jdbcHelper.executeUpdate("INSERT INTO build_modules VALUES(" +
-                "?, ?, ?)",
-                bm.getModuleId(), bm.getBuildId(), bm.getModuleNameId());
-        for (ModuleProperty bmp : bm.getProperties()) {
-            res += jdbcHelper.executeUpdate("INSERT INTO module_props VALUES(" +
-                    "?, ?, ?, ?)",
-                    bmp.getPropId(), bmp.getModuleId(), bmp.getPropKey(),
-                    StringUtils.substring(bmp.getPropValue(), 0, 2048));
-        }
-        return res;
-    }
-
-    public int deleteBuildModules(long buildId) throws SQLException {
-        List<Long> moduleIdsForBuild = findModuleIdsForBuild(buildId);
-        int res = 0;
-        if (!moduleIdsForBuild.isEmpty()) {
-            res = jdbcHelper.executeUpdate("DELETE FROM module_props WHERE module_id IN (#)", moduleIdsForBuild);
-        }
-        res += jdbcHelper.executeUpdate("DELETE FROM build_modules WHERE build_id = ?", buildId);
-        return res;
-    }
-
-    public int deleteAllBuildModules() throws SQLException {
-        int res = jdbcHelper.executeUpdate("DELETE FROM module_props");
-        res += jdbcHelper.executeUpdate("DELETE FROM build_modules");
-        return res;
-    }
-
-    public List<Long> findModuleIdsForBuild(long buildId) throws SQLException {
-        ResultSet rs = null;
-        List<Long> moduleIds = null;
-        try {
-            rs = jdbcHelper.executeSelect("SELECT module_id FROM build_modules WHERE build_id = ?", buildId);
-            moduleIds = new ArrayList<>();
-            while (rs.next()) {
-                moduleIds.add(rs.getLong(1));
-            }
-        } finally {
-            DbUtils.close(rs);
-        }
-        return moduleIds;
-    }
-
-    public List<BuildModule> findModulesForBuild(long buildId) throws SQLException {
-        ResultSet resultSet = null;
-        List<BuildModule> modules = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM build_modules WHERE build_id = ?", buildId);
-            modules = new ArrayList<>();
-            while (resultSet.next()) {
-                modules.add(resultSetToBuildModule(resultSet));
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        for (BuildModule module : modules) {
-            module.setProperties(findModuleProperties(module.getModuleId()));
-        }
-        return modules;
-    }
-
-    private Set<ModuleProperty> findModuleProperties(long moduleId) throws SQLException {
-        Set<ModuleProperty> props = new HashSet<>(3);
-        ResultSet rs = null;
-        try {
-            rs = jdbcHelper.executeSelect("SELECT * FROM module_props WHERE module_id = ?", moduleId);
-            while (rs.next()) {
-                props.add(resultSetToModuleProperty(rs));
-            }
-        } finally {
-            DbUtils.close(rs);
-        }
-        return props;
-    }
-
-    private ModuleProperty resultSetToModuleProperty(ResultSet rs) throws SQLException {
-        return new ModuleProperty(rs.getLong(1), rs.getLong(2), rs.getString(3), rs.getString(4));
-    }
-
-    private BuildModule resultSetToBuildModule(ResultSet rs) throws SQLException {
-        return new BuildModule(rs.getLong(1), rs.getLong(2), rs.getString(3));
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/build/dao/BuildQueries.java b/storage/db/src/main/java/org/artifactory/storage/db/build/dao/BuildQueries.java
deleted file mode 100644
index f980f60..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/build/dao/BuildQueries.java
+++ /dev/null
@@ -1,199 +0,0 @@
-package org.artifactory.storage.db.build.dao;
-
-/**
- * @author Chen Keinan
- */
-public class BuildQueries {
-
-    private BuildQueries() {
-    }
-
-    public static final String MODULE_DEPENDENCY_DIFF_QUERY = "select * from (\n" +
-                // get module dependencies which are in build b and not in a - removed from last build
-            "SELECT * from (\n" +
-                "                SELECT  build_dependencies.dependency_name_id ,build_dependencies.dependency_type,build_dependencies.sha1  sh,build_dependencies.dependency_scopes,'Removed'  status FROM build_dependencies\n" +
-                "                                left join build_modules on build_modules.module_id=build_dependencies.module_id\n" +
-                "                                left join builds on  build_modules.build_id = builds.build_id\n" +
-                "                              where build_dependencies.dependency_name_id not in (SELECT distinct build_dependencies.dependency_name_id   FROM build_dependencies\n" +
-                "                                left join build_modules on build_modules.module_id=build_dependencies.module_id\n" +
-                "                                left join builds on  build_modules.build_id = builds.build_id\n" +
-                "                              where builds.build_number = ? and builds.build_date = ?  and\n" +
-                "                                    build_modules.module_name_id = ?) and builds.build_number = ? and builds.build_date = ? and\n" +
-                "                                    build_modules.module_name_id = ?\n" +
-            "\n" +
-                // get module dependencies which are in build a and not in b - added to last build
-                "union\n" +
-                "        SELECT  build_dependencies.dependency_name_id ,build_dependencies.dependency_type,build_dependencies.sha1  sh,build_dependencies.dependency_scopes,'New' status FROM build_dependencies\n" +
-                "                        left join build_modules on build_modules.module_id=build_dependencies.module_id\n" +
-                "                        left join builds on  build_modules.build_id = builds.build_id\n" +
-                "                      where build_dependencies.dependency_name_id not in (SELECT distinct build_dependencies.dependency_name_id   FROM build_dependencies\n" +
-                "                        left join build_modules on build_modules.module_id=build_dependencies.module_id\n" +
-                "                        left join builds on  build_modules.build_id = builds.build_id\n" +
-                "                      where builds.build_number = ? and builds.build_date =?  and\n" +
-                "                            build_modules.module_name_id = ?) and builds.build_number = ? and builds.build_date = ?  and\n" +
-                "                            build_modules.module_name_id = ?)  x\n" +
-            "\n" +
-            "union\n" +
-                // get module dependencies which has the same sha1 on both builds - no changes
-                "        SELECT o.c,o.dependency_type,o.sh,o.dependency_scopes,o.status from (\n" +
-                "                 SELECT * from (\n" +
-                "                                 SELECT  build_dependencies.dependency_name_id c  ,build_dependencies.dependency_type ,build_dependencies.sha1 sh,build_dependencies.dependency_scopes,'Unchanged' status1 FROM build_dependencies\n" +
-                "                                   left join build_modules on build_modules.module_id=build_dependencies.module_id\n" +
-                "                                   left join builds on  build_modules.build_id = builds.build_id\n" +
-                "                                 where builds.build_number = ? and builds.build_date = ? and build_modules.module_name_id = ? )  x\n" +
-                "                   inner join (\n" +
-            "\n" +
-                "                 SELECT * from (\n" +
-                "                                SELECT  build_dependencies.dependency_name_id  b,build_dependencies.dependency_type type_x,build_dependencies.sha1 sh2,build_dependencies.dependency_scopes scope,'Unchanged' status FROM build_dependencies\n" +
-                "                                  left join build_modules on build_modules.module_id=build_dependencies.module_id\n" +
-                "                                  left join builds on  build_modules.build_id = builds.build_id\n" +
-                "                                where builds.build_number = ? and builds.build_date = ? and\n" +
-                "                                      build_modules.module_name_id = ?)  t)  v on v.sh2 = x.sh) o\n" +
-            "\n" +
-                // get module dependencies which has the diff sha1 on both builds - has changes
-                "union\n" +
-                "        SELECT o.c,o.dependency_type,o.sh,o.dependency_scopes,o.status from (\n" +
-                "             SELECT * from (\n" +
-                "                             SELECT  build_dependencies.dependency_name_id  c  ,build_dependencies.dependency_type ,build_dependencies.sha1 sh,build_dependencies.dependency_scopes,'Updated' status1 FROM build_dependencies\n" +
-                "                               left join build_modules on build_modules.module_id=build_dependencies.module_id\n" +
-                "                               left join builds on  build_modules.build_id = builds.build_id\n" +
-                "                             where builds.build_number = ? and builds.build_date = ? and build_modules.module_name_id = ? )  x\n" +
-            "\n" +
-                "               inner join (\n" +
-            "\n" +
-                "             SELECT * from (\n" +
-                "                            SELECT  build_dependencies.dependency_name_id  b,build_dependencies.dependency_type type_x,build_dependencies.sha1 sh2,build_dependencies.dependency_scopes  scop,'Updated' status FROM build_dependencies\n" +
-                "                              left join build_modules on build_modules.module_id=build_dependencies.module_id\n" +
-                "                              left join builds on  build_modules.build_id = builds.build_id\n" +
-                "                            where builds.build_number = ? and builds.build_date = ? and\n" +
-                "                                  build_modules.module_name_id = ?)  t) v on v.b = x.c where v.sh2 != x.sh) o\n" +
-                "                                  )  z  ";
-    public static final String MODULE_ARTIFACT_DIFF_QUERY = "\n" +
-            "select * from (\n" +
-                // get module artifacts which are in build b and not in a - removed from last build
-                "\n" +
-            "                SELECT * from (\n" +
-                "                                SELECT  build_artifacts.artifact_name ,build_artifacts.artifact_type,build_artifacts.sha1  sh,'Removed' status FROM build_artifacts\n" +
-            "                                  left join build_modules on build_modules.module_id=build_artifacts.module_id\n" +
-            "                                  left join builds on  build_modules.build_id = builds.build_id\n" +
-            "                                where build_artifacts.artifact_name not in (SELECT distinct build_artifacts.artifact_name   FROM build_artifacts\n" +
-            "                                  left join build_modules on build_modules.module_id=build_artifacts.module_id\n" +
-            "                                  left join builds on  build_modules.build_id = builds.build_id\n" +
-            "                                where builds.build_number = ? and builds.build_date = ?  and\n" +
-            "                                      build_modules.module_name_id = ?) and builds.build_number = ? and builds.build_date = ? and\n" +
-            "                                      build_modules.module_name_id = ?\n" +
-                // get module artifacts which are in build a and not in b - added to last build
-                "\n" +
-            "                                union\n" +
-                "                                SELECT  build_artifacts.artifact_name ,build_artifacts.artifact_type,build_artifacts.sha1  sh,'New'  status FROM build_artifacts\n" +
-            "                                  left join build_modules on build_modules.module_id=build_artifacts.module_id\n" +
-            "                                  left join builds on  build_modules.build_id = builds.build_id\n" +
-            "                                where build_artifacts.artifact_name not in (SELECT distinct build_artifacts.artifact_name   FROM build_artifacts\n" +
-            "                                  left join build_modules on build_modules.module_id=build_artifacts.module_id\n" +
-            "                                  left join builds on  build_modules.build_id = builds.build_id\n" +
-            "                                where builds.build_number = ? and builds.build_date =?  and\n" +
-            "                                      build_modules.module_name_id = ?) and builds.build_number = ? and builds.build_date = ?  and\n" +
-                "                                      build_modules.module_name_id = ?)  x\n" +
-            "\n" +
-                // get module artifacts which has the same sha1 on both builds - no changes
-                "                union\n" +
-                "                SELECT o.c,o.artifact_type,o.sh,o.status from (\n" +
-            "                                                       SELECT * from (\n" +
-                "                                                                       SELECT  build_artifacts.artifact_name  c  ,build_artifacts.artifact_type ,build_artifacts.sha1  sh,'Unchanged'  status1 FROM build_artifacts\n" +
-            "                                                                         left join build_modules on build_modules.module_id=build_artifacts.module_id\n" +
-            "                                                                         left join builds on  build_modules.build_id = builds.build_id\n" +
-            "                                                                       where builds.build_number = ? and builds.build_date = ? and build_modules.module_name_id = ? )  x\n" +
-            "                                                         inner join (\n" +
-            "\n" +
-            "                                                                      SELECT * from (\n" +
-                "                                                                                      SELECT  build_artifacts.artifact_name  b,build_artifacts.artifact_type  type_x,build_artifacts.sha1  sh2,'Unchanged'  status FROM build_artifacts\n" +
-            "                                                                                        left join build_modules on build_modules.module_id=build_artifacts.module_id\n" +
-            "                                                                                        left join builds on  build_modules.build_id = builds.build_id\n" +
-            "                                                                                      where builds.build_number = ? and builds.build_date = ? and\n" +
-                "                                                                                            build_modules.module_name_id = ?)  t)  v on v.sh2 = x.sh) o\n" +
-            "\n" +
-                // get module artifacts which has the diff sha1 on both builds - has changes
-                "                union\n" +
-                "                SELECT o.c,o.artifact_type,o.sh,o.status from (\n" +
-            "                                                       SELECT * from (\n" +
-                "                                                                       SELECT  build_artifacts.artifact_name  c  ,build_artifacts.artifact_type ,build_artifacts.sha1  sh,'Updated'  status1 FROM build_artifacts\n" +
-            "                                                                         left join build_modules on build_modules.module_id=build_artifacts.module_id\n" +
-            "                                                                         left join builds on  build_modules.build_id = builds.build_id\n" +
-            "                                                                       where builds.build_number = ? and builds.build_date = ? and build_modules.module_name_id = ? )  x\n" +
-            "\n" +
-            "                                                         inner join (\n" +
-            "\n" +
-            "                                                                      SELECT * from (\n" +
-                "                                                                                      SELECT  build_artifacts.artifact_name  b,build_artifacts.artifact_type  type_x,build_artifacts.sha1  sh2,'Updated'  status FROM build_artifacts\n" +
-            "                                                                                        left join build_modules on build_modules.module_id=build_artifacts.module_id\n" +
-            "                                                                                        left join builds on  build_modules.build_id = builds.build_id\n" +
-            "                                                                                      where builds.build_number = ? and builds.build_date = ? and\n" +
-                "                                                                                            build_modules.module_name_id = ?)  t)  v on v.b = x.c where v.sh2 != x.sh) o )  z  \n" +
-            "\n";
-
-
-    public static final String BUILD_PROPS_DIFF = "select * from (\tSELECT distinct build_props.prop_key,build_props.prop_value,'New' status,'new' new from  build_props inner join\n" +
-            "  builds on builds.build_id = build_props.build_id where build_props.prop_key not in\n" +
-            "                                                         (SELECT distinct build_props.prop_key from  build_props inner join\n" +
-            "                                                           builds on builds.build_id = build_props.build_id where builds.build_number = ? and builds.build_date = ?)  and\n" +
-            "                                                         builds.build_number = ? and builds.build_date = ?\n" +
-            "                 union\n" +
-            "                 SELECT distinct build_props.prop_key,build_props.prop_value,'Removed' status,'removed' removed from  build_props inner join\n" +
-            "                   builds on builds.build_id = build_props.build_id where build_props.prop_key not in\n" +
-            "                                                                          (SELECT distinct build_props.prop_key from  build_props inner join\n" +
-            "                                                                            builds on builds.build_id = build_props.build_id where builds.build_number = ? and builds.build_date = ?)  and\n" +
-            "                                                                          builds.build_number = ? and builds.build_date = ?\n" +
-            "                 union\n" +
-            "                 select r.c,r.v,r.st1,r.vb from (\n" +
-            "                                             select * from (\n" +
-            "                                                             SELECT distinct  build_props.prop_key c,build_props.prop_value  v,'Updated' st1 from  build_props inner join\n" +
-            "                                                               builds on builds.build_id = build_props.build_id where\n" +
-            "                                                               builds.build_number = ? and builds.build_date = ?) k\n" +
-            "                                               left  join\n" +
-            "                                               (SELECT distinct  build_props.prop_key b,build_props.prop_value vb,'Updated' status from  build_props inner join\n" +
-            "                                                 builds on builds.build_id = build_props.build_id where\n" +
-            "                                                 builds.build_number =?   and builds.build_date =? )t  on t.b = k.c where t.vb != k.v) r\n" +
-            "                 union\n" +
-            "                 select r.c,r.v,r.st1,r.v from (\n" +
-            "                                             select * from (\n" +
-            "                                                             SELECT distinct  build_props.prop_key c,build_props.prop_value v,'Unchanged' st1 from  build_props inner join\n" +
-            "                                                               builds on builds.build_id = build_props.build_id where\n" +
-            "                                                               builds.build_number = ? and builds.build_date = ?) k\n" +
-            "                                               left  join\n" +
-            "                                               (SELECT distinct  build_props.prop_key b,build_props.prop_value vb,'Unchanged' status from  build_props inner join\n" +
-            "                                                 builds on builds.build_id = build_props.build_id where\n" +
-            "                                                 builds.build_number =? and builds.build_date = ?)t  on t.b = k.c where t.vb = k.v)  r) z order by 1";
-
-    public static final String BUILD_ENV_PROPS = "\n" +
-            "SELECT distinct build_props.prop_key propsKey,build_props.prop_value propsValue from  build_props\n" +
-            "  inner join\n" +
-            "  builds on builds.build_id = build_props.build_id where builds.build_number = ?\n" +
-            "                                                         and builds.build_date = ?\n" +
-            "                                                         and build_props.prop_key like 'buildInfo.env.%'";
-
-    public static final String BUILD_SYSTEM_PROPS = "\n" +
-            "SELECT distinct build_props.prop_key propsKey,build_props.prop_value propsValue from  build_props\n" +
-            "  inner join\n" +
-            "  builds on builds.build_id = build_props.build_id where builds.build_number = ?\n" +
-            "                                                         and builds.build_date = ?\n" +
-            "                                                         and build_props.prop_key not in (  SELECT distinct build_props.prop_key from  build_props inner join\n" +
-            "                                                                                            builds on builds.build_id = build_props.build_id where builds.build_number = ?\n" +
-            "                                                                                            and builds.build_date = ?\n" +
-            "                                                                                            and build_props.prop_key like 'buildInfo.env.%' )\n";
-
-    /**
-     * all prep query below has been done as part of trying to UI support diff in db query along with db pagination
-     * currently it not removed from here and from thr code consuming it as it not finally been confirmed
-     * that we are not going to use it ,maybe should be removed later as part of code clean up when its confirm
-     * that is no longer needed
-     */
-    public static final String MODULE_DEPENDENCY_DIFF_COUNT = "module dependency diff count prep";
-    public static final String MODULE_ARTIFACT_DIFF_COUNT = "module artifact diff count prep";
-    public static final String BUILD_ARTIFACT_DIFF_QUERY = "build artifact query prep";
-    public static final String BUILD_DEPENDENCY_DIFF_QUERY = "build dependency query prep";
-    public static final String BUILD_ARTIFACT_DIFF_COUNT = "build artifact count query prep";
-    public static final String BUILD_DEPENDENCY_DIFF_COUNT = "build dependency count query prep";
-    public static final String BUILD_ENV_PROPS_COUNT = "build env count query prep";
-    public static final String BUILD_SYSTEM_PROPS_COUNT = "build system count query prep";
-    public static final String BUILD_PROPS_COUNT = "build props query prep";
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/build/dao/BuildsDao.java b/storage/db/src/main/java/org/artifactory/storage/db/build/dao/BuildsDao.java
deleted file mode 100644
index 99f2c90..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/build/dao/BuildsDao.java
+++ /dev/null
@@ -1,1328 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.build.dao;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.compress.utils.Charsets;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.build.*;
-import org.artifactory.api.build.diff.BuildParams;
-import org.artifactory.api.jackson.JacksonReader;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.repo.trash.TrashService;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.db.DbType;
-import org.artifactory.storage.db.build.entity.BuildEntity;
-import org.artifactory.storage.db.build.entity.BuildPromotionStatus;
-import org.artifactory.storage.db.build.entity.BuildProperty;
-import org.artifactory.storage.db.util.BaseDao;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.artifactory.storage.db.util.blob.BlobWrapper;
-import org.artifactory.storage.db.util.querybuilder.QueryWriter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Repository;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.*;
-
-/**
- * Date: 10/30/12
- * Time: 12:44 PM
- *
- * @author freds
- */
- at Repository
-public class BuildsDao extends BaseDao {
-    private static final Logger log = LoggerFactory.getLogger(BuildsDao.class);
-    private static final int PROP_VALUE_MAX_SIZE = 2048;
-    private static final int PROP_VALUE_MSSQL_MAX_SIZE = 900; //limit in MSSQL the maximum length of properties value
-    // to 900 characters , since MSSQL cannot have index more than 900 characters
-
-    @Autowired
-    private DbService dbService;
-
-    @Autowired
-    public BuildsDao(JdbcHelper jdbcHelper) {
-        super(jdbcHelper);
-    }
-
-    public int createBuild(BuildEntity b, BlobWrapper jsonBlob) throws SQLException {
-        int res = jdbcHelper.executeUpdate("INSERT INTO builds VALUES(" +
-                "?, " +
-                "?, ?, ?, " +
-                "?, ?, ?," +
-                "?, ?)",
-                b.getBuildId(),
-                b.getBuildName(), b.getBuildNumber(), b.getBuildDate(),
-                b.getCiUrl(), b.getCreated(), b.getCreatedBy(),
-                nullIfZero(b.getModified()), b.getModifiedBy());
-        res += jdbcHelper.executeUpdate("INSERT INTO build_jsons VALUES(?,?)", b.getBuildId(), jsonBlob);
-        int maxPropValue = PROP_VALUE_MAX_SIZE;
-        if(dbService.getDatabaseType().equals(DbType.MSSQL)){
-            maxPropValue = PROP_VALUE_MSSQL_MAX_SIZE;
-        }
-        int nbProps = b.getProperties().size();
-        if (nbProps != 0) {
-            for (BuildProperty bp : b.getProperties()) {
-                String propValue = bp.getPropValue();
-                if (propValue.length() > maxPropValue) {
-                    log.info("Trimming property value to {} characters {}",maxPropValue, bp.getPropKey());
-                    log.debug("Trimming property value to {} characters {}: {}", maxPropValue,bp.getPropKey(), bp.getPropValue());
-                    propValue = StringUtils.substring(propValue, 0, maxPropValue);
-                }
-                res += jdbcHelper.executeUpdate("INSERT INTO build_props VALUES (?,?,?,?)",
-                        bp.getPropId(), bp.getBuildId(), bp.getPropKey(), propValue);
-            }
-        }
-        int nbPromotions = b.getPromotions().size();
-        if (nbPromotions != 0) {
-            for (BuildPromotionStatus bp : b.getPromotions()) {
-                res += jdbcHelper.executeUpdate("INSERT INTO build_promotions VALUES (?,?,?,?,?,?,?)",
-                        bp.getBuildId(), bp.getCreated(), bp.getCreatedBy(),
-                        bp.getStatus(), bp.getRepository(), bp.getComment(), bp.getCiUser());
-            }
-        }
-        return res;
-    }
-
-    public int rename(long buildId, String newName, BlobWrapper jsonBlob, String currentUser, long currentTime)
-            throws SQLException {
-        int res = jdbcHelper.executeUpdate("UPDATE builds SET" +
-                " build_name = ?, modified = ?, modified_by = ?" +
-                " WHERE build_id = ?", newName, currentTime, currentUser, buildId);
-        res += jdbcHelper.executeUpdate("DELETE FROM build_jsons WHERE build_id=?", buildId);
-        res += jdbcHelper.executeUpdate("INSERT INTO build_jsons VALUES(?,?)", buildId, jsonBlob);
-        return res;
-    }
-
-    public int addPromotionStatus(long buildId, BuildPromotionStatus promotionStatus,
-            BlobWrapper jsonBlob, String currentUser, long currentTime)
-            throws SQLException {
-        int res = jdbcHelper.executeUpdate("UPDATE builds SET" +
-                " modified = ?, modified_by = ?" +
-                " WHERE build_id = ?", currentTime, currentUser, buildId);
-        res += jdbcHelper.executeUpdate("DELETE FROM build_jsons WHERE build_id=?", buildId);
-        res += jdbcHelper.executeUpdate("INSERT INTO build_jsons VALUES(?,?)", buildId, jsonBlob);
-        res += jdbcHelper.executeUpdate("INSERT INTO build_promotions VALUES (?,?,?,?,?,?,?)",
-                promotionStatus.getBuildId(),
-                promotionStatus.getCreated(),
-                promotionStatus.getCreatedBy(),
-                promotionStatus.getStatus(),
-                promotionStatus.getRepository(),
-                promotionStatus.getComment(),
-                promotionStatus.getCiUser());
-        return res;
-    }
-
-    public int deleteAllBuilds() throws SQLException {
-        int res = jdbcHelper.executeUpdate("DELETE FROM build_jsons");
-        res += jdbcHelper.executeUpdate("DELETE FROM build_props");
-        res += jdbcHelper.executeUpdate("DELETE FROM build_promotions");
-        res += jdbcHelper.executeUpdate("DELETE FROM builds");
-        return res;
-    }
-
-    public int deleteBuild(long buildId) throws SQLException {
-        int res = jdbcHelper.executeUpdate("DELETE FROM build_jsons WHERE build_id=?", buildId);
-        res += jdbcHelper.executeUpdate("DELETE FROM build_props WHERE build_id=?", buildId);
-        res += jdbcHelper.executeUpdate("DELETE FROM build_promotions WHERE build_id=?", buildId);
-        res += jdbcHelper.executeUpdate("DELETE FROM builds WHERE build_id=?", buildId);
-        return res;
-    }
-
-    public <T> T getJsonBuild(long buildId, Class<T> clazz) throws SQLException {
-        ResultSet rs = null;
-        InputStream jsonStream = null;
-        try {
-            rs = jdbcHelper.executeSelect("SELECT build_info_json FROM build_jsons WHERE" +
-                    " build_id = ?",
-                    buildId);
-            if (rs.next()) {
-                jsonStream = rs.getBinaryStream(1);
-                if (CharSequence.class.isAssignableFrom(clazz)) {
-                    //noinspection unchecked
-                    return (T) IOUtils.toString(jsonStream, Charsets.UTF_8.name());
-                }
-                return JacksonReader.streamAsClass(jsonStream, clazz);
-            }
-        } catch (IOException e) {
-            throw new SQLException("Failed to read JSON data for build '" + buildId + "' due to: " + e.getMessage(), e);
-        } finally {
-            DbUtils.close(rs);
-            IOUtils.closeQuietly(jsonStream);
-        }
-        return null;
-    }
-
-    public BuildEntity getBuild(long buildId) throws SQLException {
-        ResultSet rs = null;
-        BuildEntity build = null;
-        try {
-            rs = jdbcHelper.executeSelect("SELECT * FROM builds WHERE" +
-                    " build_id = ?",
-                    buildId);
-            if (rs.next()) {
-                build = resultSetToBuild(rs);
-            }
-        } finally {
-            DbUtils.close(rs);
-        }
-        if (build != null) {
-            build.setProperties(findBuildProperties(build.getBuildId()));
-            build.setPromotions(findBuildPromotions(build.getBuildId()));
-        }
-        return build;
-    }
-
-
-    /**
-     * return list of previous build
-     *
-     * @param buildName - current build name
-     * @param buildName - current build date
-     * @return
-     * @throws SQLException
-     */
-    public List<GeneralBuild> getPrevBuildsList(String buildName, String buildDate) {
-        ResultSet rs = null;
-        List<GeneralBuild> buildList = new ArrayList<>();
-        try {
-            String buildsQuery = "select * from builds  where build_name = ? and build_date < ?  order by build_number desc";
-            rs = jdbcHelper.executeSelect(buildsQuery, buildName, Long.parseLong(buildDate));
-            while (rs.next()) {
-                Long id = rs.getLong(1);
-                GeneralBuild buildEntity = resultSetToGeneralBuild(rs, id);
-                buildList.add(buildEntity);
-            }
-        } catch (Exception e) {
-            log.error(e.toString());
-        } finally{
-            DbUtils.close(rs);
-        }
-        return buildList;
-    }
-
-
-    public List<GeneralBuild> getBuildForName(String buildName, String orderBy, String direction, String offset, String limit) throws SQLException {
-        ResultSet rs = null;
-        List<GeneralBuild> buildList = new ArrayList<>();
-        try {
-            String buildsQuery = "select builds.* ,builds.build_id,\n" +
-                    "         '0' as module_cnt ,\n" +
-                    "         '0' as artifact_cnt,\n" +
-                    "         '0' as dependency_cnt\n" +
-                    "        ,  build_promotions.status,build_promotions.created as created2 from builds left join build_promotions on build_promotions.build_id = builds.build_id where build_name = ?";
-            rs = jdbcHelper.executeSelect(buildsQuery, buildName);
-            Map<Long, GeneralBuild> buildMap = new HashMap<>();
-            while (rs.next()) {
-                Long id = rs.getLong(1);
-                Long created = rs.getLong(15);
-                if (buildMap.get(id) == null) {
-                    GeneralBuild buildEntity = resultSetToGeneralBuild(rs, id);
-                    buildEntity.setNumOfModules(new Integer(rs.getInt(11)).toString());
-                    buildEntity.setNumOfArtifacts(new Integer(rs.getInt(12)).toString());
-                    buildEntity.setNumOfDependencies(new Integer(rs.getInt(13)).toString());
-                    buildEntity.setStatus(rs.getString(14));
-                    buildEntity.setPromotionCreated(created);
-                    buildMap.put(id, buildEntity);
-                    buildList.add(buildEntity);
-                } else {
-                    Long promotionCreated = buildMap.get(id).getPromotionCreated();
-                    if (promotionCreated != null && promotionCreated < created) {
-                        buildMap.get(id).setStatus(rs.getString(14));
-                    }
-                }
-            }
-        } finally {
-            DbUtils.close(rs);
-        }
-        return buildList;
-    }
-
-    /**
-     * get Module Artifact diff with paging
-     *
-     * @param offset - row offset
-     * @param limit  - row limit
-     * @return
-     */
-    public List<ModuleArtifact> getModuleArtifactsForDiffWithPaging(BuildParams buildParams, String offset, String limit) {
-        ResultSet rs = null;
-        List<ModuleArtifact> artifacts = new ArrayList<>();
-        Map<String, ModuleArtifact> artifactMap = new HashMap<>();
-        ResultSet rsArtCurr = null;
-        ResultSet rsArtPrev = null;
-        try {
-            Object[] diffParams = getArtifatBuildQueryParam(buildParams);
-            String buildQuery = getArtifactBuildDiffQuery(buildParams);
-            rs = jdbcHelper.executeSelect(buildQuery, diffParams);
-            while (rs.next()) {
-                ModuleArtifact artifact = new ModuleArtifact(null, null, rs.getString(1), rs.getString(2), rs.getString(3));
-                artifact.setStatus(rs.getString(4));
-                if (buildParams.isAllArtifact()) {
-                    artifact.setModule(rs.getString(5));
-                }
-                artifacts.add(artifact);
-            }
-            // update artifact repo path data
-            if (!artifacts.isEmpty()) {
-                rsArtCurr = getArtifactNodes(buildParams.getBuildName(), buildParams.getCurrBuildNum(), artifactMap);
-                if (buildParams.isAllArtifact()) {
-                    rsArtPrev = getArtifactNodes(buildParams.getBuildName(), buildParams.getComperedBuildNum(), artifactMap);
-                }
-                for (ModuleArtifact artifact : artifacts) {
-                    ModuleArtifact moduleArtifact = artifactMap.get(artifact.getSha1());
-                    if (moduleArtifact != null) {
-                        artifact.setRepoKey(moduleArtifact.getRepoKey());
-                        artifact.setPath(moduleArtifact.getPath());
-                    }
-                }
-            }
-        } catch (SQLException e) {
-            log.error(e.toString());
-        } finally {
-            DbUtils.close(rsArtCurr);
-            DbUtils.close(rsArtPrev);
-            DbUtils.close(rs);
-        }
-        return artifacts;
-    }
-
-    private String getArtifactBuildDiffQuery(BuildParams buildParams) {
-        if (!buildParams.isAllArtifact()) {
-            return BuildQueries.MODULE_ARTIFACT_DIFF_QUERY;
-        } else {
-            return BuildQueries.BUILD_ARTIFACT_DIFF_QUERY;
-        }
-    }
-
-    /**
-     * return diif param for artifact diff query
-     * @param buildParams
-     * @return
-     */
-    private Object[] getArtifatBuildQueryParam(BuildParams buildParams) {
-        if (!buildParams.isAllArtifact()) {
-            return new Object[]{buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(), buildParams.getBuildModuleId(),
-                    buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate(), buildParams.getBuildModuleId(),
-                    buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate(), buildParams.getBuildModuleId(),
-                    buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(), buildParams.getBuildModuleId(),
-                    buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(), buildParams.getBuildModuleId(),
-                    buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate(), buildParams.getBuildModuleId(),
-                    buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(), buildParams.getBuildModuleId(),
-                    buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate(), buildParams.getBuildModuleId()};
-        } else {
-            return new Object[]{buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(),
-                    buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate(),
-                    buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate(),
-                    buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(),
-                    buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(),
-                    buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate(),
-                    buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(),
-                    buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate()};
-        }
-    }
-
-    /**
-     * get Module Artifact diff total Count
-     *
-     * @param offset - row offset
-     * @param limit  - row limit
-     * @return
-     */
-    public int getModuleArtifactsForDiffCount(BuildParams buildParams, String offset, String limit) {
-        ResultSet rs = null;
-        try {
-            Object[] diffParams = getArtifactDiffCountParam(buildParams);
-            String buildQuery = getArtifactDiffCount(buildParams);
-            rs = jdbcHelper.executeSelect(buildQuery, diffParams);
-            if (rs.next()) {
-                return rs.getInt(1);
-            }
-        } catch (SQLException e) {
-            log.error(e.toString());
-        } finally {
-            DbUtils.close(rs);
-        }
-        return 0;
-    }
-
-    /**
-     * get Module Artifact diff total Count
-     *
-     * @param offset - row offset
-     * @param limit  - row limit
-     * @return
-     */
-    public List<BuildProps> getBuildProps(BuildParams buildParams,
-                                          String offset, String limit, String orderBy) {
-        ResultSet rs = null;
-        List<BuildProps> buildPropsList = new ArrayList<>();
-        try {
-            String baseQuery;
-            Object[] diffParams = getBuildPropsParam(buildParams);
-            String buildQuery = getPropsQuery(buildParams);
-            rs = jdbcHelper.executeSelect(buildQuery, diffParams);
-            while (rs.next()) {
-                buildPropsList.add(new BuildProps(rs.getString(1), rs.getString(2), null));
-            }
-        } catch (SQLException e) {
-            log.error(e.toString());
-        } finally {
-            DbUtils.close(rs);
-        }
-        return buildPropsList;
-    }
-
-
-    /**
-     * get build props row count
-     *
-     * @return
-     */
-    public long getBuildPropsCounts(BuildParams buildParams) {
-        ResultSet rs = null;
-        try {
-            Object[] diffParams = getBuildPropsParam(buildParams);
-            String buildQuery = getPropsQueryCounts(buildParams);
-            rs = jdbcHelper.executeSelect(buildQuery, diffParams);
-            if (rs.next()) {
-                return rs.getLong(1);
-            }
-        } catch (SQLException e) {
-            log.error(e.toString());
-        } finally {
-            DbUtils.close(rs);
-        }
-        return 0;
-    }
-
-    /**
-     * get build props (env or system) param to be included in sql query
-     *
-     * @param buildParams - build params
-     * @return list of build props param
-     */
-    private Object[] getBuildPropsParam(BuildParams buildParams) {
-        if (buildParams.isEnvProps()) {
-            return new Object[]{buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate()};
-        } else {
-            return new Object[]{buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(),
-                    buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate()
-            };
-        }
-    }
-
-    /**
-     * get props Env or system query
-     *
-     * @param buildParams - build Param
-     * @return build props query
-     */
-    private String getPropsQuery(BuildParams buildParams) {
-        String baseQuery;
-        if (buildParams.isEnvProps()) {
-            baseQuery = BuildQueries.BUILD_ENV_PROPS;
-        } else {
-            baseQuery = BuildQueries.BUILD_SYSTEM_PROPS;
-        }
-        return baseQuery;
-    }
-
-    /**
-     * get props Env or system query
-     *
-     * @param buildParams - build Param
-     * @return build props query
-     */
-    private String getPropsQueryCounts(BuildParams buildParams) {
-        String baseQuery;
-        if (buildParams.isEnvProps()) {
-            baseQuery = BuildQueries.BUILD_ENV_PROPS_COUNT;
-        } else {
-            baseQuery = BuildQueries.BUILD_SYSTEM_PROPS_COUNT;
-        }
-        return baseQuery;
-    }
-
-    /**
-     * get Module Artifact diff total Count
-     *
-     * @param buildParams - encapsulate build diff query param
-     * @return
-     */
-    public int getPropsDiffCount(BuildParams buildParams) {
-        ResultSet rs = null;
-        try {
-            String baseQuery;
-            Object[] diffParams = {buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(),
-                    buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(),
-                    buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate()};
-            String buildQuery = BuildQueries.BUILD_PROPS_COUNT;
-            rs = jdbcHelper.executeSelect(buildQuery, diffParams);
-            if (rs.next()) {
-                return rs.getInt(1);
-            }
-        } catch (SQLException e) {
-            log.error(e.toString());
-        } finally {
-            DbUtils.close(rs);
-        }
-        return 0;
-    }
-
-    /**
-     * get build props diff with another build
-     *
-     * @return - list of build props with diff status
-     */
-    public List<BuildProps> diffBuildProps(BuildParams buildParams, String offset, String limit) {
-        ResultSet rs = null;
-        List<BuildProps> buildPropsList = new ArrayList<>();
-        try {
-            Object[] diffParams = {buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate(),
-                    buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(),
-                    buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(),
-                    buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate(),
-                    buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(),
-                    buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate(),
-                    buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(),
-                    buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate()};
-            String buildQuery = BuildQueries.BUILD_PROPS_DIFF;
-            rs = jdbcHelper.executeSelect(buildQuery, diffParams);
-            while (rs.next()) {
-                BuildProps buildProps = new BuildProps(rs.getString(1), rs.getString(2), rs.getString(3));
-                buildProps.setPrevValue(rs.getString(4));
-                buildPropsList.add(buildProps);
-            }
-        } catch (SQLException e) {
-            log.error(e.toString());
-        } finally {
-            DbUtils.close(rs);
-        }
-        return buildPropsList;
-    }
-
-    /**
-     * get Build Artifact Diff count param array (for module artifact / all artifact)
-     *
-     * @param buildParams - build diff param for query
-     * @return - param array for diff
-     */
-    private Object[] getArtifactDiffCountParam(BuildParams buildParams) {
-        if (!buildParams.isAllArtifact()) {
-            return new Object[]{buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(), buildParams.getBuildModuleId(),
-                    buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(), buildParams.getBuildModuleId(),
-                    buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate(), buildParams.getBuildModuleId()};
-
-        } else {
-            return new Object[]{buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(),
-                    buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(),
-                    buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate()};
-        }
-    }
-
-    /**
-     * get Build Artifact Diff count query (for module artifact / all artifact)
-     * @param buildParams - build diff param for query
-     * @return - query for diff
-     */
-    private String getArtifactDiffCount(BuildParams buildParams) {
-        String baseQuery;
-        if (!buildParams.isAllArtifact()) {
-            baseQuery = BuildQueries.MODULE_ARTIFACT_DIFF_COUNT;
-        } else {
-            baseQuery = BuildQueries.BUILD_ARTIFACT_DIFF_COUNT;
-        }
-        return baseQuery;
-    }
-
-
-    /**
-     * get Module Artifact diff with paging
-     *
-     * @param offset - row offset
-     * @param limit  - row limit
-     * @return
-     */
-    public List<ModuleDependency> getModuleDependencyForDiffWithPaging(BuildParams buildParams, String offset, String limit) {
-        ResultSet rs = null;
-        ResultSet rsDep = null;
-        ResultSet rsDepCompared = null;
-        List<ModuleDependency> dependencies = new ArrayList<>();
-        Map<String, ModuleDependency> moduleDependencyMap = new HashMap<>();
-        try {
-            StringBuilder builder = new StringBuilder(getBaseDependencyQuery(buildParams));
-            Object[] diffParams = getBuildDependencyParams(buildParams);
-            /// update query with specific conditions
-            updateQueryWithSpecificConditions(buildParams, builder);
-            String buildQuery = builder.toString();
-            rs = jdbcHelper.executeSelect(buildQuery, diffParams);
-            Map<String, String> tempDependencyMap = new HashMap<>();
-            StringBuilder inClauseBuilder = new StringBuilder();
-            inClauseBuilder.append("(");
-            while (rs.next()) {
-                String sha1 = rs.getString(3);
-                if (tempDependencyMap.get(sha1) == null) {
-                    tempDependencyMap.put(sha1, sha1);
-                    ModuleDependency dependency = new ModuleDependency(null, null, rs.getString(1),
-                            rs.getString(2), rs.getString(4), sha1);
-                    dependency.setStatus(rs.getString(5));
-                    if (buildParams.isAllArtifact()) {
-                        dependency.setModule(rs.getString(6));
-                    }
-                    dependencies.add(dependency);
-                }
-                inClauseBuilder.append("'" + sha1 + "'").append(",");
-            }
-            String inClause = inClauseBuilder.toString();
-            inClause = inClause.substring(0, inClause.length() - 1);
-            inClause = inClause + ")";
-            // update dependencies repo path data
-            if (!dependencies.isEmpty()) {
-                rsDep = getModuleDependencyNodes(moduleDependencyMap, inClause);
-                if (buildParams.isAllArtifact()) {
-                    rsDepCompared = getModuleDependencyNodes(moduleDependencyMap, inClause);
-                }
-                dependencies.forEach(dependency -> {
-                    ModuleDependency moduleDependency = moduleDependencyMap.get(dependency.getSha1());
-                    if (moduleDependency != null) {
-                        dependency.setRepoKey(moduleDependency.getRepoKey());
-                        String path = moduleDependency.getPath();
-                        String name = moduleDependency.getName();
-                        if (path != null) {
-                            dependency.setPath(path.equals(".") ? name : path + "/" + name);
-                        }
-                    }
-                });
-            }
-        } catch (SQLException e) {
-            log.error(e.toString());
-        } finally {
-            DbUtils.close(rsDep);
-            DbUtils.close(rsDepCompared);
-            DbUtils.close(rs);
-        }
-        return dependencies;
-    }
-
-    /**
-     * update build with specific condition for exclude and full build diff
-     *
-     * @param buildParams - build params
-     * @param builder - build diff query writer
-     */
-    private void updateQueryWithSpecificConditions(BuildParams buildParams, StringBuilder builder) {
-        if (buildParams.isExcludeInternalDependencies()) {
-            // exclude internal dependencies
-            builder.append(" where c not in (select build_modules.module_name_id  from build_modules \n" +
-                    "inner join builds on builds.build_id = build_modules.build_id\n" +
-                    " where builds.build_number=? and builds.build_date=?)");
-        }
-    }
-
-    /**
-     * get build dependency query params for all build dependency diff or build module dependency diff
-     *
-     * @param buildParams - build diff param
-     * @return - build dependency param for diff query
-     */
-    private Object[] getBuildDependencyParams(BuildParams buildParams) {
-        // build params for all build artifact query
-        if (!buildParams.isAllArtifact()) {
-            return new Object[]{buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(), buildParams.getBuildModuleId(),
-                    buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate(), buildParams.getBuildModuleId(),
-                    buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate(), buildParams.getBuildModuleId(),
-                    buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(), buildParams.getBuildModuleId(),
-                    buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(), buildParams.getBuildModuleId(),
-                    buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate(), buildParams.getBuildModuleId(),
-                    buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(), buildParams.getBuildModuleId(),
-                    buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate(), buildParams.getBuildModuleId()};
-        } else {// build params for module build artifact query
-            if (buildParams.isExcludeInternalDependencies()) {
-                return new Object[]{buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(),
-                        buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate(),
-                        buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate(),
-                        buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(),
-                        buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(),
-                        buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate(),
-                        buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(),
-                        buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate(),
-                        buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate()};
-            } else {
-                return new Object[]{buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(),
-                        buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate(),
-                        buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate(),
-                        buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(),
-                        buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(),
-                        buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate(),
-                        buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(),
-                        buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate()};
-            }
-        }
-    }
-
-    /**
-     * get build dependency query for all build dependency diff or build module dependency diff
-     *
-     * @param buildParams - build diff param
-     * @return - build dependency query for diff query
-     */
-    private String getBaseDependencyQuery(BuildParams buildParams) {
-        String baseQuery;
-        if (!buildParams.isAllArtifact()) {
-            baseQuery = BuildQueries.MODULE_DEPENDENCY_DIFF_QUERY;
-        } else {
-            baseQuery = BuildQueries.BUILD_DEPENDENCY_DIFF_QUERY;
-        }
-        return baseQuery;
-    }
-
-    /**
-     * get Module Artifact diff total Count
-     *
-     * @param offset - row offset
-     * @param limit  - row limit
-     * @return
-     */
-    public int getModuleDependencyForDiffCount(BuildParams buildParams, String offset, String limit) {
-        ResultSet rs = null;
-        String baseQuery;
-        try {
-            baseQuery = getBuildDependencyCountQuery(buildParams);
-            Object[] diffParams = getBuildDependencyCountParam(buildParams);
-            StringBuilder builder = new StringBuilder(baseQuery);
-            if (buildParams.isExcludeInternalDependencies()) {
-                // exclude internal dependencies
-                builder.append("where dependency_name_id not in (select build_modules.module_name_id  from build_modules \n" +
-                        "inner join builds on builds.build_id = build_modules.build_id\n" +
-                        " where builds.build_number=? and builds.build_date=?)");
-            }
-            String buildQuery = builder.toString();
-            rs = jdbcHelper.executeSelect(buildQuery, diffParams);
-            if (rs.next()) {
-                return rs.getInt(1);
-            }
-        } catch (SQLException e) {
-            log.error(e.toString());
-        } finally {
-            DbUtils.close(rs);
-        }
-        return 0;
-    }
-
-    /**
-     * get Build Artifact Diff count param array (for module artifact / all artifact)
-     *
-     * @param buildParams - build diff param for query
-     * @return - param array for diff
-     */
-    private Object[] getBuildDependencyCountParam(BuildParams buildParams) {
-        if (!buildParams.isAllArtifact()) {
-            return new Object[]{buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(), buildParams.getBuildModuleId(),
-                    buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(), buildParams.getBuildModuleId(),
-                    buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate(), buildParams.getBuildModuleId()};
-        } else {
-            if (buildParams.isExcludeInternalDependencies()) {
-                return new Object[]{buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(),
-                        buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(),
-                        buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate(),
-                        buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate()};
-            } else {
-                return new Object[]{buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(),
-                        buildParams.getCurrBuildNum(), buildParams.getCurrBuildDate(),
-                        buildParams.getComperedBuildNum(), buildParams.getComperedBuildDate()};
-            }
-        }
-    }
-
-    /**
-     * get Build Artifact Diff count query (for module artifact / all artifact)
-     *
-     * @param buildParams - build diff param for query
-     * @return - query array for diff
-     */
-    private String getBuildDependencyCountQuery(BuildParams buildParams) {
-        String baseQuery;
-        if (!buildParams.isAllArtifact()) {
-            baseQuery = BuildQueries.MODULE_DEPENDENCY_DIFF_COUNT;
-        } else {
-            baseQuery = BuildQueries.BUILD_DEPENDENCY_DIFF_COUNT;
-        }
-        return baseQuery;
-    }
-
-    /**
-     * get total build counts
-     *
-     * @param buildName - build name
-     * @return
-     * @throws SQLException
-     */
-    public int getBuildForNameTotalCount(String buildName) throws SQLException {
-        ResultSet rs = null;
-        try {
-            QueryWriter queryWriter = new QueryWriter();
-            String buildsQuery = queryWriter.select(" count(*) ").from(" builds ").where(" build_name = ? ").build();
-            rs = jdbcHelper.executeSelect(buildsQuery, buildName);
-            if (rs.next()) {
-                return rs.getInt(1);
-            }
-        } finally {
-            DbUtils.close(rs);
-        }
-        return 0;
-    }
-
-    public long findBuildId(String name, String number, long startDate) throws SQLException {
-        ResultSet rs = null;
-        try {
-            rs = jdbcHelper.executeSelect("SELECT build_id FROM builds WHERE" +
-                    " build_name = ? AND build_number = ? AND build_date = ?",
-                    name, number, startDate);
-            if (rs.next()) {
-                return rs.getLong(1);
-            }
-        } finally {
-            DbUtils.close(rs);
-        }
-        return 0L;
-    }
-
-    public BuildEntity findBuild(String name, String number, long startDate) throws SQLException {
-        long buildId = findBuildId(name, number, startDate);
-        if (buildId > 0L) {
-            return getBuild(buildId);
-        }
-        return null;
-    }
-
-    public BuildEntity getLatestBuild(String buildName) throws SQLException {
-        long latestBuildDate = 0L;
-        ResultSet rs = null;
-        try {
-            rs = jdbcHelper.executeSelect("SELECT max(build_date) FROM builds WHERE build_name = ?", buildName);
-            if (rs.next()) {
-                latestBuildDate = rs.getLong(1);
-            }
-        } finally {
-            DbUtils.close(rs);
-            rs = null;
-        }
-        BuildEntity buildEntity = null;
-        if (latestBuildDate > 0L) {
-            try {
-                rs = jdbcHelper.executeSelect("SELECT * FROM builds " +
-                        "WHERE build_name = ? AND build_date = ?", buildName, latestBuildDate);
-                if (rs.next()) {
-                    buildEntity = resultSetToBuild(rs);
-                }
-            } finally {
-                DbUtils.close(rs);
-            }
-        }
-        if (buildEntity != null) {
-            buildEntity.setProperties(findBuildProperties(buildEntity.getBuildId()));
-            buildEntity.setPromotions(findBuildPromotions(buildEntity.getBuildId()));
-        }
-        return buildEntity;
-    }
-
-    public long findLatestBuildDate(String buildName, String buildNumber) throws SQLException {
-        long latestBuildDate = 0L;
-        ResultSet rs = null;
-        try {
-            rs = jdbcHelper.executeSelect("SELECT max(build_date) FROM builds WHERE" +
-                    " build_name = ? AND build_number = ?",
-                    buildName, buildNumber);
-            if (rs.next()) {
-                latestBuildDate = rs.getLong(1);
-            }
-        } finally {
-            DbUtils.close(rs);
-        }
-        return latestBuildDate;
-    }
-
-    public List<Long> findBuildIds(String buildName) throws SQLException {
-        ResultSet rs = null;
-        List<Long> buildIds = new ArrayList<>();
-        try {
-            rs = jdbcHelper.executeSelect("SELECT build_id FROM builds WHERE" +
-                    " build_name = ? ORDER BY build_date DESC",
-                    buildName);
-            while (rs.next()) {
-                buildIds.add(rs.getLong(1));
-            }
-        } finally {
-            DbUtils.close(rs);
-        }
-        return buildIds;
-    }
-
-    public List<Long> findBuildIds(String buildName, String buildNumber) throws SQLException {
-        ResultSet rs = null;
-        List<Long> buildIds = new ArrayList<>();
-        try {
-            rs = jdbcHelper.executeSelect("SELECT build_id FROM builds WHERE" +
-                    " build_name = ? AND build_number = ? ORDER BY build_date DESC",
-                    buildName, buildNumber);
-            while (rs.next()) {
-                buildIds.add(rs.getLong(1));
-            }
-        } finally {
-            DbUtils.close(rs);
-        }
-        return buildIds;
-    }
-
-    public List<String> getAllBuildNames() throws SQLException {
-        ResultSet rs = null;
-        List<String> buildNames = new ArrayList<>();
-        try {
-            rs = jdbcHelper.executeSelect(
-                    "SELECT build_name, max(build_date) d FROM builds GROUP BY build_name ORDER BY d");
-            while (rs.next()) {
-                buildNames.add(rs.getString(1));
-            }
-        } finally {
-            DbUtils.close(rs);
-        }
-        return buildNames;
-    }
-
-    /**
-     * get build modules with paging
-     * @param buildName - build name
-     * @param date - date
-     * @param orderBy - order by
-     * @param direction - direction
-     * @param offset - offset
-     * @param limit - limit
-     * @return
-     * @throws SQLException
-     */
-    public List<PublishedModule> getBuildModule(String buildName, String date, String orderBy, String direction, String offset, String limit) throws SQLException {
-        ResultSet rs = null;
-        String buildQuery = "SELECT build_modules.module_name_id,\n" +
-                "(select count(*) from build_artifacts where build_artifacts.module_id =  build_modules.module_id ) as num_of_art ,\n" +
-                "(select count(*) from build_dependencies where build_dependencies.module_id =  build_modules.module_id ) as num_of_dep FROM build_modules\n" +
-                "left join builds on builds.build_id=build_modules.build_id \n" +
-                "where  builds.build_number=? and builds.build_date=?";
-
-        List<PublishedModule> modules = new ArrayList<>();
-        try {
-            rs = jdbcHelper.executeSelect(buildQuery, buildName, Long.parseLong(date));
-            while (rs.next()) {
-                PublishedModule module = new PublishedModule();
-                module.setId(rs.getString(1));
-                module.setNumOfArtifact(rs.getString(2));
-                module.setNumOfDependencies(rs.getString(3));
-                modules.add(module);
-            }
-        } finally {
-            DbUtils.close(rs);
-        }
-        return modules;
-    }
-
-
-    /**
-     * get build modules artifact with paging
-     *
-     * @param buildNumber - build name
-     * @param date        - build date
-     * @param orderBy     - query order by
-     * @param direction   - direction (asc /desc)
-     * @param offset      - offset - start row
-     * @param limit       - limit - end row
-     * @return
-     * @throws SQLException
-     */
-    public List<ModuleArtifact> getModuleArtifact(String buildName, String buildNumber, String date,
-                                                  String moduleId, String orderBy, String direction, String offset,
-                                                  String limit) throws SQLException {
-        ResultSet rsArtifact = null;
-        ResultSet rs = null;
-        List<ModuleArtifact> artifacts = new ArrayList<>();
-        Map<String, ModuleArtifact> artifactMap = new HashMap<>();
-        try {
-            // get artifact info
-            rs = getPaginatedArtifact(buildNumber, Long.parseLong(date), moduleId, orderBy, direction, offset, limit);
-            while (rs.next()) {
-                artifacts.add(new ModuleArtifact(null, null, rs.getString(1), rs.getString(2), rs.getString(3)));
-            }
-            if (!artifacts.isEmpty()) {
-                // query for artifact nodes
-                rsArtifact = getArtifactNodes(buildName, buildNumber, artifactMap);
-                for (ModuleArtifact artifact : artifacts) {
-                    ModuleArtifact moduleArtifact = artifactMap.get(artifact.getSha1());
-                    if (moduleArtifact != null) {
-                        artifact.setRepoKey(moduleArtifact.getRepoKey());
-                        artifact.setPath(moduleArtifact.getPath());
-                    }
-                }
-            }
-
-        } finally {
-            DbUtils.close(rsArtifact);
-            DbUtils.close(rs);
-        }
-        return artifacts;
-    }
-
-    /**
-     * get module artifact info
-     *
-     * @param buildNumber - build number
-     * @param date        - build date
-     * @param moduleId    - module id
-     * @param orderBy     - order by
-     * @param direction   - direction
-     * @param offset      - offset
-     * @param limit       - limit
-     * @return query result set
-     */
-    private ResultSet getPaginatedArtifact(String buildNumber, Long date,
-                                           String moduleId, String orderBy, String direction, String offset,
-                                           String limit) throws SQLException {
-        ResultSet rs;
-        String buildQuery = "SELECT distinct build_artifacts.artifact_name as name,build_artifacts.artifact_type as type,build_artifacts.sha1 FROM build_artifacts\n" +
-                "left join build_modules on build_modules.module_id=build_artifacts.module_id\n" +
-                "left join builds on  build_modules.build_id = builds.build_id\n" +
-                "where builds.build_number = ? and builds.build_date = ? and build_modules.module_name_id = ?";
-
-        rs = jdbcHelper.executeSelect(buildQuery, buildNumber, date, moduleId);
-
-        return rs;
-    }
-
-    /**
-     * get Artifact nodes data by build name and number
-     * Note - who ever use this method must be responsible for close the result set
-     *
-     * @param buildName   - build name
-     * @param buildNumber - build number
-     * @param artifactMap - map of data , key = sha1 , value = module artifact
-     * @return query result set
-     * @throws SQLException
-     */
-    private ResultSet getArtifactNodes(String buildName, String buildNumber, Map<String, ModuleArtifact> artifactMap) throws SQLException {
-        ResultSet rsArtifact;
-        rsArtifact = jdbcHelper.executeSelect("select distinct  n.repo,n.node_path,n.node_name,n.node_id,n.depth,n.sha1_actual,n.sha1_original,n.md5_actual,n.md5_original  \n" +
-                "from  nodes n left outer join node_props np100 on np100.node_id = n.node_id left outer join node_props np101 on np101.node_id = n.node_id \n" +
-                "where (( np100.prop_key = 'build.name' and  np100.prop_value = ?) and( np101.prop_key = 'build.number' and  np101.prop_value =?)) and n.repo != '" + TrashService.TRASH_KEY + "' and n.node_type = 1", buildName, buildNumber);
-
-        while (rsArtifact.next()) {
-            String sha1 = rsArtifact.getString(6);
-            if (artifactMap.get(sha1) == null) {
-                artifactMap.put(sha1, new ModuleArtifact(rsArtifact.getString(1), rsArtifact.getString(2), rsArtifact.getString(3), null, null));
-            }
-        }
-        return rsArtifact;
-    }
-
-    /**
-     * get build modules dependencies with paging
-     *
-     * @param buildNumber - build name
-     * @param date        - date
-     * @param orderBy     - order by
-     * @param direction   - direction
-     * @param offset      - offset
-     * @param limit       - limit
-     * @return
-     * @throws SQLException
-     */
-    public List<ModuleDependency> getModuleDependency(String buildNumber, String date, String moduleId, String orderBy,
-                                                      String direction, String offset, String limit) throws SQLException {
-        ResultSet rs = null;
-        ResultSet rsDep = null;
-        Map<String, ModuleDependency> moduleDependencyMap = new HashMap<>();
-        String buildQuery = "SELECT distinct build_dependencies.dependency_name_id as id," +
-                "build_dependencies.dependency_type as type,build_dependencies.dependency_scopes as scope," +
-                "build_dependencies.sha1 FROM build_dependencies\n" +
-                "left join build_modules on build_modules.module_id=build_dependencies.module_id\n" +
-                "left join builds on  build_modules.build_id = builds.build_id\n" +
-                "where builds.build_number = ? and builds.build_date = ? and build_modules.module_name_id = ?";
-
-        List<ModuleDependency> dependencies = new ArrayList<>();
-        try {
-            rs = jdbcHelper.executeSelect(buildQuery, buildNumber, Long.parseLong(date), moduleId);
-            StringBuilder inClauseBuilder = new StringBuilder();
-            inClauseBuilder.append("(");
-            while (rs.next()) {
-                String sha1 = rs.getString(4);
-                dependencies.add(new ModuleDependency(null, null, rs.getString(1), rs.getString(2), rs.getString(3),
-                        sha1));
-                inClauseBuilder.append("'" + sha1 + "'").append(",");
-            }
-            String inClause = inClauseBuilder.toString();
-            inClause = inClause.substring(0, inClause.length() - 1);
-            inClause = inClause + ")";
-
-            if (!dependencies.isEmpty()) {
-                // get repo key and path data for dependency
-                rsDep = getModuleDependencyNodes(moduleDependencyMap, inClause);
-                dependencies.forEach(dependency -> {
-                    ModuleDependency moduleDependency = moduleDependencyMap.get(dependency.getSha1());
-                    if (moduleDependency != null) {
-                        dependency.setRepoKey(moduleDependency.getRepoKey());
-                        String path = moduleDependency.getPath();
-                        String name = moduleDependency.getName();
-                        if (path != null) {
-                            dependency.setPath(path.equals(".") ? name : path + "/" + name);
-                        }
-                    }
-                });
-            }
-        } finally {
-            DbUtils.close(rsDep);
-            DbUtils.close(rs);
-        }
-        return dependencies;
-    }
-
-    private ResultSet getModuleDependencyNodes(Map<String, ModuleDependency> moduleDependencyMap, String inClause)
-            throws SQLException {
-        ResultSet rsDep = jdbcHelper.executeSelect(
-                "SELECT distinct nodes.repo,nodes.node_path,nodes.node_name,nodes.sha1_actual FROM nodes\n" +
-                        "                where nodes.repo != '" + TrashService.TRASH_KEY + "' and nodes.sha1_actual in " + inClause);
-        while (rsDep.next()) {
-            String sha1 = rsDep.getString(4);
-            if (moduleDependencyMap.get(sha1) == null) {
-                moduleDependencyMap.put(sha1, new ModuleDependency(rsDep.getString(1), rsDep.getString(2), rsDep.getString(3), null, null, null));
-            }
-        }
-        return rsDep;
-    }
-
-
-    /**
-     * get build modules dependencies count with paging
-     *
-     * @param buildNumber - build name
-     * @param date        - date
-     * @return
-     * @throws SQLException
-     */
-    public int getModuleDependenciesCount(String buildNumber, String date, String moduleId) throws SQLException {
-        ResultSet rs = null;
-        String buildQuery = "SELECT count(*) FROM build_dependencies\n" +
-                "left join build_modules on build_modules.module_id=build_dependencies.module_id\n" +
-                "left join builds on  build_modules.build_id = builds.build_id\n" +
-                "where builds.build_number = ? and builds.build_date = ? and build_modules.module_name_id = ?";
-
-        try {
-            rs = jdbcHelper.executeSelect(buildQuery, buildNumber, date, moduleId);
-            if (rs.next()) {
-                return rs.getInt(1);
-            }
-        } finally {
-            DbUtils.close(rs);
-        }
-        return 0;
-    }
-
-    /**
-     * get build modules count with paging
-     *
-     * @param buildNumber - build name
-     * @param date        - date
-     * @return
-     * @throws SQLException
-     */
-    public int getModuleArtifactCount(String buildNumber, String date, String moduleId) throws SQLException {
-        ResultSet rs = null;
-        String buildQuery = "SELECT count(*) FROM build_artifacts\n" +
-                "left join build_modules on build_modules.module_id=build_artifacts.module_id\n" +
-                "left join builds on  build_modules.build_id = builds.build_id\n" +
-                "where builds.build_number = ? and builds.build_date = ? and build_modules.module_name_id = ?";
-
-        try {
-            rs = jdbcHelper.executeSelect(buildQuery, buildNumber, date, moduleId);
-            if (rs.next()) {
-                return rs.getInt(1);
-            }
-        } finally {
-            DbUtils.close(rs);
-        }
-        return 0;
-    }
-
-    /**
-     * get total published modules count
-     *
-     * @param buildName - build name
-     * @param date      - date
-     * @return num of total published modules
-     */
-    public int  getPublishedModulesCounts(String buildName, String date) {
-        ResultSet rs = null;
-        String buildQuery = "SELECT count(*) as cnt FROM build_modules\n" +
-                "left join builds on builds.build_id=build_modules.build_id \n" +
-                "where  builds.build_number=? and builds.build_date=?";
-         try {
-            rs = jdbcHelper.executeSelect(buildQuery,buildName,date);
-            if  (rs.next()) {
-                return rs.getInt(1);
-            }
-        } catch (SQLException e) {
-            log.error(e.toString());
-        } finally {
-            DbUtils.close(rs);
-        }
-        return 0;
-    }
-
-    public List<BuildEntity> getAllBuildNamePaging(String offset, String orderBy, String direction, String limit) throws SQLException {
-        ResultSet rs = null;
-        List<BuildEntity> buildNames = new ArrayList<>();
-        try {
-            String allBuildsQuery = "select * from (\n" +
-                    "  (SELECT build_name buildName , max(build_date) build_time\n" +
-                    "   from builds c GROUP BY build_name ) build_a\n" +
-                    "   inner join (select * from builds)  build_b on build_b.build_date = build_a.build_time) \n" +
-                    "where build_a.buildName=build_b.build_name";
-            rs = jdbcHelper.executeSelect(allBuildsQuery);
-            BuildEntity buildEntity;
-            while (rs.next()) {
-                buildEntity = new BuildEntity(rs.getInt(3), rs.getString(1), rs.getString(5), rs.getLong(2), rs.getString(7), rs.getLong(8), rs.getString(9), 0, null);
-                buildEntity.setProperties(findBuildProperties(buildEntity.getBuildId()));
-                buildEntity.setPromotions(findBuildPromotions(buildEntity.getBuildId()));
-                buildNames.add(buildEntity);
-            }
-        } catch (Exception e) {
-            log.error(e.toString());
-        } finally {
-            DbUtils.close(rs);
-        }
-        return buildNames;
-    }
-
-    public Collection<BuildEntity> findBuildsForArtifactChecksum(ChecksumType type, String checksum) throws SQLException {
-        Collection<BuildEntity> results = Lists.newArrayList();
-        ResultSet rs = null;
-        try {
-            rs = jdbcHelper.executeSelect("SELECT DISTINCT b.* FROM builds b, build_artifacts ba, build_modules bm" +
-                    " WHERE b.build_id = bm.build_id" +
-                    " AND bm.module_id = ba.module_id" +
-                    " AND ba." + type.name() + " = ?" +
-                    " AND ba.module_id = bm.module_id", checksum);
-            while (rs.next()) {
-                results.add(resultSetToBuild(rs));
-            }
-        } finally {
-            DbUtils.close(rs);
-        }
-        for (BuildEntity buildEntity : results) {
-            buildEntity.setProperties(findBuildProperties(buildEntity.getBuildId()));
-            buildEntity.setPromotions(findBuildPromotions(buildEntity.getBuildId()));
-        }
-        return results;
-    }
-
-    public Collection<BuildEntity> findBuildsForDependencyChecksum(ChecksumType type, String checksum) throws SQLException {
-        Collection<BuildEntity> results = Lists.newArrayList();
-        ResultSet rs = null;
-        try {
-            rs = jdbcHelper.executeSelect("SELECT DISTINCT b.* FROM builds b, build_dependencies bd, build_modules bm" +
-                    " WHERE b.build_id = bm.build_id" +
-                    " AND bm.module_id = bd.module_id" +
-                    " AND bd." + type.name() + " = ?" +
-                    " AND bd.module_id = bm.module_id", checksum);
-            while (rs.next()) {
-                results.add(resultSetToBuild(rs));
-            }
-        } finally {
-            DbUtils.close(rs);
-        }
-        for (BuildEntity buildEntity : results) {
-            buildEntity.setProperties(findBuildProperties(buildEntity.getBuildId()));
-            buildEntity.setPromotions(findBuildPromotions(buildEntity.getBuildId()));
-        }
-        return results;
-    }
-
-    private Set<BuildProperty> findBuildProperties(long buildId) throws SQLException {
-        ResultSet rs = null;
-        Set<BuildProperty> buildProperties = new HashSet<>();
-        try {
-            rs = jdbcHelper.executeSelect("SELECT * FROM build_props WHERE" +
-                    " build_id = ?",
-                    buildId);
-            while (rs.next()) {
-                buildProperties.add(resultSetToBuildProperty(rs));
-            }
-        } finally {
-            DbUtils.close(rs);
-        }
-        return buildProperties;
-    }
-
-    private SortedSet<BuildPromotionStatus> findBuildPromotions(long buildId) throws SQLException {
-        ResultSet rs = null;
-        SortedSet<BuildPromotionStatus> buildPromotions = new TreeSet<>();
-        try {
-            rs = jdbcHelper.executeSelect("SELECT * FROM build_promotions WHERE" +
-                    " build_id = ?",
-                    buildId);
-            while (rs.next()) {
-                buildPromotions.add(resultSetToBuildPromotion(rs));
-            }
-        } finally {
-            DbUtils.close(rs);
-        }
-        return buildPromotions;
-    }
-
-    private BuildProperty resultSetToBuildProperty(ResultSet rs) throws SQLException {
-        return new BuildProperty(rs.getLong(1), rs.getLong(2),
-                rs.getString(3), rs.getString(4));
-    }
-
-    private BuildPromotionStatus resultSetToBuildPromotion(ResultSet rs) throws SQLException {
-        return new BuildPromotionStatus(rs.getLong(1), rs.getLong(2),
-                rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6),
-                rs.getString(7));
-    }
-
-    private BuildEntity resultSetToBuild(ResultSet rs) throws SQLException {
-        return new BuildEntity(rs.getLong(1),
-                rs.getString(2), rs.getString(3), rs.getLong(4),
-                rs.getString(5), rs.getLong(6), rs.getString(7),
-                zeroIfNull(rs.getLong(8)), rs.getString(9)
-        );
-    }
-
-    private GeneralBuild resultSetToGeneralBuild(ResultSet rs, Long id) throws SQLException {
-        return new GeneralBuild(id,
-                rs.getString(2), rs.getString(3), rs.getLong(4),
-                rs.getString(5), rs.getLong(6), rs.getString(7),
-                zeroIfNull(rs.getLong(8)), rs.getString(9)
-        );
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/build/entity/BuildArtifact.java b/storage/db/src/main/java/org/artifactory/storage/db/build/entity/BuildArtifact.java
deleted file mode 100644
index 671f59d..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/build/entity/BuildArtifact.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.build.entity;
-
-import org.apache.commons.lang.StringUtils;
-
-/**
- * Date: 10/30/12
- * Time: 12:05 PM
- *
- * @author freds
- */
-public class BuildArtifact {
-    private final long artifactId;
-    private final long moduleId;
-    private final String artifactName;
-    private final String artifactType;
-    private final String sha1;
-    private final String md5;
-
-    public BuildArtifact(long artifactId, long moduleId, String artifactName, String artifactType, String sha1,
-            String md5) {
-        if (artifactId <= 0L || moduleId <= 0L) {
-            throw new IllegalArgumentException("Artifact or Module id cannot be zero or negative!");
-        }
-        if (StringUtils.isBlank(artifactName)) {
-            throw new IllegalArgumentException("Artifact name cannot be null!");
-        }
-        this.artifactId = artifactId;
-        this.moduleId = moduleId;
-        this.artifactName = artifactName;
-        this.artifactType = artifactType;
-        this.sha1 = sha1;
-        this.md5 = md5;
-    }
-
-    public long getArtifactId() {
-        return artifactId;
-    }
-
-    public long getModuleId() {
-        return moduleId;
-    }
-
-    public String getArtifactName() {
-        return artifactName;
-    }
-
-    public String getArtifactType() {
-        return artifactType;
-    }
-
-    public String getSha1() {
-        return sha1;
-    }
-
-    public String getMd5() {
-        return md5;
-    }
-
-    @Override
-    public String toString() {
-        return "BuildArtifact{" +
-                "artifactId=" + artifactId +
-                ", moduleId=" + moduleId +
-                ", artifactName='" + artifactName + '\'' +
-                ", artifactType='" + artifactType + '\'' +
-                ", sha1='" + sha1 + '\'' +
-                ", md5='" + md5 + '\'' +
-                '}';
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/build/entity/BuildDependency.java b/storage/db/src/main/java/org/artifactory/storage/db/build/entity/BuildDependency.java
deleted file mode 100644
index 6069a8e..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/build/entity/BuildDependency.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.build.entity;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.util.PathUtils;
-
-import java.util.List;
-import java.util.Set;
-
-/**
- * Date: 10/30/12
- * Time: 12:05 PM
- *
- * @author freds
- */
-public class BuildDependency {
-    private static final String DELIMITER = ",";
-
-    private final long dependencyId;
-    private final long moduleId;
-    private final String dependencyNameId;
-    private final String dependencyScopes;
-    private final String dependencyType;
-    private final String sha1;
-    private final String md5;
-
-    public BuildDependency(long dependencyId, long moduleId, String dependencyNameId, Set<String> dependencyScopes,
-            String dependencyType, String sha1, String md5) {
-        this(dependencyId, moduleId, dependencyNameId,
-                PathUtils.collectionToDelimitedString(dependencyScopes, DELIMITER), dependencyType, sha1, md5);
-    }
-
-    public BuildDependency(long dependencyId, long moduleId, String dependencyNameId, String dependencyScopes,
-            String dependencyType, String sha1, String md5) {
-        if (dependencyId <= 0L || moduleId <= 0L) {
-            throw new IllegalArgumentException("Dependency or Module id cannot be zero or negative!");
-        }
-        if (StringUtils.isBlank(dependencyNameId)) {
-            throw new IllegalArgumentException("Dependency id name cannot be null!");
-        }
-        this.dependencyId = dependencyId;
-        this.moduleId = moduleId;
-        this.dependencyNameId = dependencyNameId;
-        this.dependencyScopes = dependencyScopes;
-        this.dependencyType = dependencyType;
-        this.sha1 = sha1;
-        this.md5 = md5;
-    }
-
-    public long getDependencyId() {
-        return dependencyId;
-    }
-
-    public long getModuleId() {
-        return moduleId;
-    }
-
-    public String getDependencyNameId() {
-        return dependencyNameId;
-    }
-
-    public String getDependencyScopes() {
-        return dependencyScopes;
-    }
-
-    public List<String> getScopes() {
-        return PathUtils.includesExcludesPatternToStringList(dependencyScopes);
-    }
-
-    public String getDependencyType() {
-        return dependencyType;
-    }
-
-    public String getSha1() {
-        return sha1;
-    }
-
-    public String getMd5() {
-        return md5;
-    }
-
-    @Override
-    public String toString() {
-        return "BuildDependency{" +
-                "dependencyId=" + dependencyId +
-                ", moduleId=" + moduleId +
-                ", dependencyNameId='" + dependencyNameId + '\'' +
-                ", dependencyScopes='" + dependencyScopes + '\'' +
-                ", dependencyType='" + dependencyType + '\'' +
-                ", sha1='" + sha1 + '\'' +
-                ", md5='" + md5 + '\'' +
-                '}';
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/build/entity/BuildEntity.java b/storage/db/src/main/java/org/artifactory/storage/db/build/entity/BuildEntity.java
deleted file mode 100644
index fda6688..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/build/entity/BuildEntity.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.build.entity;
-
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSortedSet;
-import org.apache.commons.lang.StringUtils;
-
-import java.util.Collection;
-
-/**
- * Date: 10/30/12
- * Time: 12:21 PM
- *
- * @author freds
- */
-public class BuildEntity {
-    private final long buildId;
-    private final String buildName;
-    private final String buildNumber;
-    private final long buildDate;
-    private final String ciUrl;
-    private final long created;
-    private final String createdBy;
-    private final long modified;
-    private final String modifiedBy;
-
-    /**
-     * Initialized as null, and can (and should) be set only once
-     */
-    private ImmutableSet<BuildProperty> properties = null;
-
-    /**
-     * Initialized as null, and can (and should) be set only once
-     */
-    private ImmutableSortedSet<BuildPromotionStatus> promotions = null;
-
-    public BuildEntity(long buildId, String buildName, String buildNumber, long buildDate, String ciUrl, long created,
-            String createdBy, long modified, String modifiedBy) {
-        if (buildId <= 0L) {
-            throw new IllegalArgumentException("Build id cannot be zero or negative!");
-        }
-        if (StringUtils.isBlank(buildName) || StringUtils.isBlank(buildNumber) || buildDate <= 0L) {
-            throw new IllegalArgumentException("Build name, number and date cannot be empty or null!");
-        }
-        if (created <= 0L) {
-            throw new IllegalArgumentException("Created date cannot be zero or negative!");
-        }
-        this.buildId = buildId;
-        this.buildName = buildName;
-        this.buildNumber = buildNumber;
-        this.buildDate = buildDate;
-        this.ciUrl = ciUrl;
-        this.created = created;
-        this.createdBy = createdBy;
-        this.modified = modified;
-        this.modifiedBy = modifiedBy;
-    }
-
-    public long getBuildId() {
-        return buildId;
-    }
-
-    public String getBuildName() {
-        return buildName;
-    }
-
-    public String getBuildNumber() {
-        return buildNumber;
-    }
-
-    public long getBuildDate() {
-        return buildDate;
-    }
-
-    public String getCiUrl() {
-        return ciUrl;
-    }
-
-    public long getCreated() {
-        return created;
-    }
-
-    public String getCreatedBy() {
-        return createdBy;
-    }
-
-    public long getModified() {
-        return modified;
-    }
-
-    public String getModifiedBy() {
-        return modifiedBy;
-    }
-
-    public ImmutableSortedSet<BuildPromotionStatus> getPromotions() {
-        if (promotions == null) {
-            throw new IllegalStateException("Build object was not initialized correctly! Promotions missing.");
-        }
-        return promotions;
-    }
-
-    public void setPromotions(Collection<BuildPromotionStatus> promotions) {
-        if (this.promotions != null) {
-            throw new IllegalStateException("Cannot set Promotions already set!");
-        }
-        if (promotions == null) {
-            throw new IllegalArgumentException("Cannot set promotions to null");
-        }
-        this.promotions = ImmutableSortedSet.copyOf(promotions);
-    }
-
-    public ImmutableSet<BuildProperty> getProperties() {
-        if (properties == null) {
-            throw new IllegalStateException("Build object was not initialized correctly! Properties missing.");
-        }
-        return properties;
-    }
-
-    public void setProperties(Collection<BuildProperty> properties) {
-        if (this.properties != null) {
-            throw new IllegalStateException("Cannot set Properties already set!");
-        }
-        if (properties == null) {
-            throw new IllegalArgumentException("Cannot set properties to null");
-        }
-        this.properties = ImmutableSet.copyOf(properties);
-    }
-
-    public boolean isIdentical(BuildEntity b) {
-        ImmutableSet<BuildProperty> oprops = b.getProperties();
-        if (oprops.size() != getProperties().size()) {
-            return false;
-        }
-        for (BuildProperty prop : properties) {
-            boolean foundIdentical = false;
-            for (BuildProperty oprop : oprops) {
-                if (oprop.isIdentical(prop)) {
-                    foundIdentical = true;
-                }
-            }
-            if (!foundIdentical) {
-                return false;
-            }
-        }
-        return Objects.equal(promotions, b.promotions)
-                && StringUtils.equals(buildName, b.buildName)
-                && StringUtils.equals(buildNumber, b.buildNumber)
-                && buildDate == b.buildDate
-                && StringUtils.equals(ciUrl, b.ciUrl)
-                && created == b.created
-                && StringUtils.equals(createdBy, b.createdBy)
-                && modified == b.modified
-                && StringUtils.equals(modifiedBy, b.modifiedBy);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/build/entity/BuildModule.java b/storage/db/src/main/java/org/artifactory/storage/db/build/entity/BuildModule.java
deleted file mode 100644
index 80d4e35..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/build/entity/BuildModule.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.build.entity;
-
-import com.google.common.collect.ImmutableSet;
-import org.apache.commons.lang.StringUtils;
-
-import java.util.Set;
-
-/**
- * Date: 10/30/12
- * Time: 12:19 PM
- *
- * @author freds
- */
-public class BuildModule {
-    private final long moduleId;
-    private final long buildId;
-    private final String moduleNameId;
-
-    /**
-     * Initialized as null, and can (and should) be set only once
-     */
-    private ImmutableSet<ModuleProperty> properties = null;
-
-    public BuildModule(long moduleId, long buildId, String moduleNameId) {
-        if (moduleId <= 0L || buildId <= 0L) {
-            throw new IllegalArgumentException("Module or Build id cannot be zero or negative!");
-        }
-        if (StringUtils.isBlank(moduleNameId)) {
-            throw new IllegalArgumentException("Module id name cannot be null!");
-        }
-        this.moduleId = moduleId;
-        this.buildId = buildId;
-        this.moduleNameId = moduleNameId;
-    }
-
-    public long getModuleId() {
-        return moduleId;
-    }
-
-    public long getBuildId() {
-        return buildId;
-    }
-
-    public String getModuleNameId() {
-        return moduleNameId;
-    }
-
-    public ImmutableSet<ModuleProperty> getProperties() {
-        if (properties == null) {
-            throw new IllegalStateException("Build Module object was not initialized correctly! Properties missing.");
-        }
-        return properties;
-    }
-
-    public void setProperties(Set<ModuleProperty> properties) {
-        if (this.properties != null) {
-            throw new IllegalStateException("Cannot set Properties already set!");
-        }
-        if (properties == null) {
-            throw new IllegalArgumentException("Cannot set properties to null");
-        }
-        this.properties = ImmutableSet.copyOf(properties);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/build/entity/BuildPromotionStatus.java b/storage/db/src/main/java/org/artifactory/storage/db/build/entity/BuildPromotionStatus.java
deleted file mode 100644
index 8671430..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/build/entity/BuildPromotionStatus.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.build.entity;
-
-import org.apache.commons.lang.StringUtils;
-
-/**
- * Date: 11/23/12
- * Time: 8:50 AM
- *
- * @author freds
- */
-public class BuildPromotionStatus implements Comparable<BuildPromotionStatus> {
-    private final long buildId;
-    private final long created;
-    private final String createdBy;
-    private final String status;
-    private final String repository;
-    private final String comment;
-    private final String ciUser;
-
-    public BuildPromotionStatus(long buildId, long created, String createdBy, String status, String repository,
-            String comment, String ciUser) {
-        if (buildId <= 0L) {
-            throw new IllegalArgumentException("Build id cannot be zero or negative!");
-        }
-        if (StringUtils.isBlank(status)) {
-            throw new IllegalArgumentException("Promotion status cannot be empty or null!");
-        }
-        if (created <= 0L) {
-            throw new IllegalArgumentException("Created date cannot be zero or negative!");
-        }
-        this.buildId = buildId;
-        this.created = created;
-        this.createdBy = createdBy;
-        this.status = status;
-        this.repository = repository;
-        this.comment = comment;
-        this.ciUser = ciUser;
-    }
-
-    public long getBuildId() {
-        return buildId;
-    }
-
-    public long getCreated() {
-        return created;
-    }
-
-    public String getCreatedBy() {
-        return createdBy;
-    }
-
-    public String getStatus() {
-        return status;
-    }
-
-    public String getRepository() {
-        return repository;
-    }
-
-    public String getComment() {
-        return comment;
-    }
-
-    public String getCiUser() {
-        return ciUser;
-    }
-
-    public boolean isIdentical(BuildPromotionStatus o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || !this.equals(o)) {
-            return false;
-        }
-        return StringUtils.equals(createdBy, o.createdBy)
-                && StringUtils.equals(status, o.status)
-                && StringUtils.equals(repository, o.repository)
-                && StringUtils.equals(comment, o.comment)
-                && StringUtils.equals(ciUser, o.ciUser);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        BuildPromotionStatus that = (BuildPromotionStatus) o;
-
-        if (buildId != that.buildId) {
-            return false;
-        }
-        if (created != that.created) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = (int) (buildId ^ (buildId >>> 32));
-        result = 31 * result + (int) (created ^ (created >>> 32));
-        return result;
-    }
-
-    @Override
-    public int compareTo(BuildPromotionStatus o) {
-        if (buildId != o.buildId) {
-            return Long.compare(buildId, o.buildId);
-        }
-        return Long.compare(created, o.created);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/build/entity/BuildProperty.java b/storage/db/src/main/java/org/artifactory/storage/db/build/entity/BuildProperty.java
deleted file mode 100644
index 668e476..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/build/entity/BuildProperty.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.build.entity;
-
-import org.apache.commons.lang.StringUtils;
-
-/**
- * Date: 10/30/12
- * Time: 2:45 PM
- *
- * @author freds
- */
-public class BuildProperty {
-    private final long propId;
-    private final long buildId;
-    private final String propKey;
-    private final String propValue;
-
-    public BuildProperty(long propId, long buildId, String propKey, String propValue) {
-        if (propId <= 0L || buildId <= 0L) {
-            throw new IllegalArgumentException("Property or Build id cannot be zero or negative!");
-        }
-        if (StringUtils.isBlank(propKey)) {
-            throw new IllegalArgumentException("Property key cannot be empty or null!");
-        }
-        this.propId = propId;
-        this.buildId = buildId;
-        this.propKey = propKey;
-        this.propValue = propValue;
-    }
-
-    public long getPropId() {
-        return propId;
-    }
-
-    public long getBuildId() {
-        return buildId;
-    }
-
-    public String getPropKey() {
-        return propKey;
-    }
-
-    public String getPropValue() {
-        return propValue;
-    }
-
-    public boolean isIdentical(BuildProperty bp) {
-        if (this == bp) {
-            return true;
-        }
-        if (bp == null || getClass() != bp.getClass()) {
-            return false;
-        }
-        return buildId == bp.buildId
-                && StringUtils.equals(propKey, bp.propKey)
-                && StringUtils.equals(propValue, bp.propValue);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        BuildProperty that = (BuildProperty) o;
-
-        if (propId != that.propId) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return (int) (propId ^ (propId >>> 32));
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/build/entity/ModuleProperty.java b/storage/db/src/main/java/org/artifactory/storage/db/build/entity/ModuleProperty.java
deleted file mode 100644
index 91f3e6b..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/build/entity/ModuleProperty.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.build.entity;
-
-import org.apache.commons.lang.StringUtils;
-
-/**
- * Date: 10/30/12
- * Time: 2:45 PM
- *
- * @author freds
- */
-public class ModuleProperty {
-    private final long propId;
-    private final long moduleId;
-    private final String propKey;
-    private final String propValue;
-
-    public ModuleProperty(long propId, long moduleId, String propKey, String propValue) {
-        if (propId <= 0L || moduleId <= 0L) {
-            throw new IllegalArgumentException("Property or Module id cannot be zero or negative!");
-        }
-        if (StringUtils.isBlank(propKey)) {
-            throw new IllegalArgumentException("Property key cannot be null!");
-        }
-        this.propId = propId;
-        this.moduleId = moduleId;
-        this.propKey = propKey;
-        this.propValue = propValue;
-    }
-
-    public long getPropId() {
-        return propId;
-    }
-
-    public long getModuleId() {
-        return moduleId;
-    }
-
-    public String getPropKey() {
-        return propKey;
-    }
-
-    public String getPropValue() {
-        return propValue;
-    }
-
-    public boolean isIdentical(ModuleProperty mp) {
-        if (this == mp) {
-            return true;
-        }
-        if (mp == null || getClass() != mp.getClass()) {
-            return false;
-        }
-        return moduleId == mp.moduleId
-                && StringUtils.equals(propKey, mp.propKey)
-                && StringUtils.equals(propValue, mp.propValue);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        ModuleProperty that = (ModuleProperty) o;
-
-        if (propId != that.propId) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return (int) (propId ^ (propId >>> 32));
-    }
-
-    @Override
-    public String toString() {
-        return "ModuleProperty{" +
-                "propId=" + propId +
-                ", moduleId=" + moduleId +
-                ", propKey='" + propKey + '\'' +
-                ", propValue='" + propValue + '\'' +
-                '}';
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/build/service/BuildRunImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/build/service/BuildRunImpl.java
deleted file mode 100644
index 306373e..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/build/service/BuildRunImpl.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.build.service;
-
-import org.artifactory.build.BuildInfoUtils;
-import org.artifactory.build.BuildRun;
-
-import java.util.Date;
-
-/**
- * A basic build run info holder
- *
- * @author Noam Y. Tenne
- */
-public class BuildRunImpl implements BuildRun {
-
-    private final long buildId;
-    private final String name;
-    private final String number;
-    private final String started;
-    private final String ciUrl;
-    private final String releaseStatus;
-    private String numOfModules;
-    private String numOfArtifact;
-    private String numOfDependencies;
-
-    public BuildRunImpl(String name, String number, Date started) {
-        this(name, number, BuildInfoUtils.formatBuildTime(started.getTime()));
-    }
-
-    /**
-     * @param name    Build name
-     * @param number  Build number
-     * @param started Build started
-     */
-    public BuildRunImpl(String name, String number, String started) {
-        this(name, number, started, null, null);
-    }
-
-    /**
-     * @param name          Build name
-     * @param number        Build number
-     * @param started       Build started
-     * @param ciUrl         The URL of the original CI Server build
-     * @param releaseStatus Build release status
-     */
-    public BuildRunImpl(String name, String number, String started, String ciUrl, String releaseStatus) {
-        this(0L, name, number, started, ciUrl, releaseStatus);
-    }
-
-    /**
-     * @param buildId
-     * @param name
-     * @param number
-     * @param started
-     * @param ciUrl
-     * @param releaseStatus
-     */
-    public BuildRunImpl(long buildId, String name, String number, String started, String ciUrl, String releaseStatus) {
-        this.buildId = buildId;
-        this.name = name;
-        this.number = number;
-        this.started = started;
-        this.ciUrl = ciUrl;
-        this.releaseStatus = releaseStatus;
-    }
-
-    public long getBuildId() {
-        return buildId;
-    }
-
-    /**
-     * Returns the name of the build
-     *
-     * @return Build name
-     */
-    @Override
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Returns the number of the build
-     *
-     * @return Build number
-     */
-    @Override
-    public String getNumber() {
-        return number;
-    }
-
-    /**
-     * Returns the starting time of the build
-     *
-     * @return Build start time
-     */
-    @Override
-    public String getStarted() {
-        return started;
-    }
-
-    /**
-     * Returns a date representation of the build starting time
-     *
-     * @return Build started date
-     * @throws java.text.ParseException
-     */
-    @Override
-    public Date getStartedDate() {
-        return new Date(BuildInfoUtils.parseBuildTime(getStarted()));
-    }
-
-    @Override
-    public String getCiUrl() {
-        return ciUrl;
-    }
-
-    @Override
-    public String getReleaseStatus() {
-        return releaseStatus;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof BuildRun)) {
-            return false;
-        }
-
-        BuildRun run = (BuildRun) o;
-
-        if (!name.equals(run.getName())) {
-            return false;
-        }
-        if (!number.equals(run.getNumber())) {
-            return false;
-        }
-        if (started != null ? !started.equals(run.getStarted()) : run.getStarted() != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = name.hashCode();
-        result = 31 * result + number.hashCode();
-        result = 31 * result + (started != null ? started.hashCode() : 0);
-        return result;
-    }
-
-    public String getNumOfModules() {
-        return numOfModules;
-    }
-
-    public void setNumOfModules(String numOfModules) {
-        this.numOfModules = numOfModules;
-    }
-
-    public String getNumOfArtifact() {
-        return numOfArtifact;
-    }
-
-    public void setNumOfArtifact(String numOfArtifact) {
-        this.numOfArtifact = numOfArtifact;
-    }
-
-    public String getNumOfDependencies() {
-        return numOfDependencies;
-    }
-
-    public void setNumOfDependencies(String numOfDependencies) {
-        this.numOfDependencies = numOfDependencies;
-    }
-
-    @Override
-    public String toString() {
-        return "" + buildId + ' ' + name + ':' + number + ':' + started;
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/build/service/BuildStoreServiceImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/build/service/BuildStoreServiceImpl.java
deleted file mode 100644
index 908253e..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/build/service/BuildStoreServiceImpl.java
+++ /dev/null
@@ -1,710 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.build.service;
-
-import com.google.common.collect.*;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.build.*;
-import org.artifactory.api.build.diff.BuildParams;
-import org.artifactory.api.jackson.JacksonReader;
-import org.artifactory.build.BuildInfoUtils;
-import org.artifactory.build.BuildRun;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.storage.StorageException;
-import org.artifactory.storage.binstore.service.BinaryInfo;
-import org.artifactory.storage.binstore.service.BinaryService;
-import org.artifactory.storage.build.service.BuildSearchCriteria;
-import org.artifactory.storage.build.service.BuildStoreService;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.db.build.dao.BuildArtifactsDao;
-import org.artifactory.storage.db.build.dao.BuildDependenciesDao;
-import org.artifactory.storage.db.build.dao.BuildModulesDao;
-import org.artifactory.storage.db.build.dao.BuildsDao;
-import org.artifactory.storage.db.build.entity.*;
-import org.artifactory.storage.db.util.blob.BlobWrapperFactory;
-import org.jfrog.build.api.*;
-import org.jfrog.build.api.release.PromotionStatus;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.io.IOException;
-import java.nio.charset.Charset;
-import java.sql.SQLException;
-import java.util.*;
-
-/**
- * Date: 11/14/12
- * Time: 12:42 PM
- *
- * @author freds
- */
- at Service
-public class BuildStoreServiceImpl implements BuildStoreService {
-    private static final Logger log = LoggerFactory.getLogger(BuildStoreServiceImpl.class);
-
-    private static final String EXPORTABLE_BUILD_VERSION = "v2";
-
-    @Autowired
-    private DbService dbService;
-
-    @Autowired
-    private BinaryService binaryService;
-
-    @Autowired
-    private BuildsDao buildsDao;
-
-    @Autowired
-    private BuildModulesDao buildModulesDao;
-
-    @Autowired
-    private BuildArtifactsDao buildArtifactsDao;
-
-    @Autowired
-    private BuildDependenciesDao buildDependenciesDao;
-
-    @Autowired
-    private BlobWrapperFactory blobsFactory;
-
-    public static Date parseStringToDate(String dateString) {
-        return new Date(BuildInfoUtils.parseBuildTime(dateString));
-    }
-
-    public static String formatDateToString(long buildStarted) {
-        return BuildInfoUtils.formatBuildTime(buildStarted);
-    }
-
-    @Override
-    public void addBuild(String buildJson) {
-        try {
-            addBuild(JacksonReader.bytesAsClass(buildJson.getBytes(Charset.forName("UTF-8")), Build.class));
-        } catch (IOException e) {
-            throw new StorageException("Could not parse JSON build " + buildJson, e);
-        }
-    }
-
-    @Override
-    public void addBuild(Build build) {
-        try {
-            String buildStarted = build.getStarted();
-            Date parsedDate = parseStringToDate(buildStarted);
-
-            // TODO: [by fsi] we are loosing the timezone information written in the JSON
-            // Generates a big inconsistency between DB entry and JSON data
-
-            BuildEntity dbBuild = new BuildEntity(dbService.nextId(), build.getName(), build.getNumber(),
-                    parsedDate.getTime(),
-                    build.getUrl(), System.currentTimeMillis(), build.getArtifactoryPrincipal(),
-                    0L, null);
-            long buildId = dbBuild.getBuildId();
-            dbBuild.setProperties(createProperties(buildId, build));
-            dbBuild.setPromotions(createPromotions(buildId, build));
-            buildsDao.createBuild(dbBuild, blobsFactory.createJsonObjectWrapper(build));
-            insertModules(buildId, build);
-        } catch (SQLException e) {
-            throw new StorageException("Could not insert build " + build, e);
-        }
-
-    }
-
-    private ArrayList<BuildPromotionStatus> createPromotions(long buildId, Build build) {
-        List<PromotionStatus> statuses = build.getStatuses();
-        ArrayList<BuildPromotionStatus> buildPromotions;
-        if (statuses != null && !statuses.isEmpty()) {
-            buildPromotions = new ArrayList<>(statuses.size());
-            for (PromotionStatus status : statuses) {
-                buildPromotions.add(convertPromotionStatus(buildId, status));
-            }
-        } else {
-            buildPromotions = new ArrayList<>(1);
-        }
-        return buildPromotions;
-    }
-
-    private BuildPromotionStatus convertPromotionStatus(long buildId, PromotionStatus status) {
-        return new BuildPromotionStatus(buildId,
-                status.getTimestampDate().getTime(),
-                status.getUser(),
-                status.getStatus(),
-                status.getRepository(),
-                status.getComment(),
-                status.getCiUser());
-    }
-
-    private Set<BuildProperty> createProperties(long buildId, Build build) {
-        Properties properties = build.getProperties();
-        Set<BuildProperty> buildProperties;
-        if (properties != null && !properties.isEmpty()) {
-            buildProperties = new HashSet<>(properties.size());
-            for (Map.Entry<Object, Object> entry : properties.entrySet()) {
-                buildProperties.add(
-                        new BuildProperty(dbService.nextId(), buildId, entry.getKey().toString(),
-                                entry.getValue().toString())
-                );
-            }
-        } else {
-            buildProperties = new HashSet<>(1);
-        }
-        return buildProperties;
-    }
-
-    private void insertModules(long buildId, Build build) throws SQLException {
-        List<Module> modules = build.getModules();
-        if (modules == null || modules.isEmpty()) {
-            // Nothing to do here
-            return;
-        }
-        for (Module module : modules) {
-            BuildModule dbModule = new BuildModule(dbService.nextId(), buildId, module.getId());
-            Properties properties = module.getProperties();
-            Set<ModuleProperty> moduleProperties;
-            if (properties != null && !properties.isEmpty()) {
-                moduleProperties = Sets.newHashSetWithExpectedSize(properties.size());
-                for (Map.Entry<Object, Object> entry : properties.entrySet()) {
-                    moduleProperties.add(
-                            new ModuleProperty(dbService.nextId(), dbModule.getModuleId(),
-                                    entry.getKey().toString(),
-                                    entry.getValue().toString())
-                    );
-                }
-            } else {
-                moduleProperties = Sets.newHashSetWithExpectedSize(1);
-            }
-            dbModule.setProperties(moduleProperties);
-            buildModulesDao.createBuildModule(dbModule);
-
-            List<Artifact> artifacts = module.getArtifacts();
-            List<BuildArtifact> dbArtifacts;
-            if (artifacts != null && !artifacts.isEmpty()) {
-                dbArtifacts = Lists.newArrayListWithExpectedSize(artifacts.size());
-                for (Artifact artifact : artifacts) {
-                    // Artifact properties are not inserted in DB
-                    dbArtifacts.add(new BuildArtifact(dbService.nextId(), dbModule.getModuleId(),
-                            artifact.getName(), artifact.getType(), artifact.getSha1(), artifact.getMd5()));
-                }
-            } else {
-                dbArtifacts = Lists.newArrayListWithExpectedSize(1);
-            }
-            buildArtifactsDao.createBuildArtifacts(dbArtifacts);
-
-            List<Dependency> dependencies = module.getDependencies();
-            List<BuildDependency> dbDependencies;
-            if (dependencies != null && !dependencies.isEmpty()) {
-                dbDependencies = Lists.newArrayListWithExpectedSize(dependencies.size());
-                for (Dependency dependency : dependencies) {
-                    // Dependency properties are not inserted in DB
-                    dbDependencies.add(new BuildDependency(dbService.nextId(), dbModule.getModuleId(),
-                            dependency.getId(), dependency.getScopes(), dependency.getType(),
-                            dependency.getSha1(), dependency.getMd5()));
-                }
-            } else {
-                dbDependencies = Lists.newArrayListWithExpectedSize(1);
-            }
-            buildDependenciesDao.createBuildDependencies(dbDependencies);
-        }
-    }
-
-    @Override
-    public void populateMissingChecksums(Build build) {
-        List<Module> modules = build.getModules();
-        if (modules != null && !modules.isEmpty()) {
-            for (Module module : modules) {
-                handleBeanPopulation(module.getArtifacts());
-                handleBeanPopulation(module.getDependencies());
-            }
-        }
-    }
-
-    @Override
-    public BuildRun getBuildRun(String buildName, String buildNumber, String buildStarted) {
-        try {
-            Date parsedDate = parseStringToDate(buildStarted);
-            BuildEntity entity = buildsDao.findBuild(buildName, buildNumber, parsedDate.getTime());
-            if (entity != null) {
-                return getBuildRun(entity);
-            }
-        } catch (SQLException e) {
-            throw new StorageException("Could not execute find build for build" +
-                    " name='" + buildName + "' number='" + buildNumber + "' start='" + buildStarted + "'", e);
-        }
-        return null;
-    }
-
-    @Override
-    public Build getBuildJson(BuildRun buildRun) {
-        try {
-            long buildId = findIdFromBuildRun(buildRun);
-            if (buildId > 0L) {
-                return buildsDao.getJsonBuild(buildId, Build.class);
-            }
-        } catch (SQLException e) {
-            throw new StorageException("Could not execute get build JSON for build " + buildRun, e);
-        }
-        return null;
-    }
-
-    @Override
-    public void renameBuild(BuildRun originalBuildRun, Build renamedBuild, String currentUser) {
-        try {
-            long buildId = findIdFromBuildRun(originalBuildRun);
-            if (buildId > 0L) {
-                buildsDao.rename(buildId, renamedBuild.getName(), blobsFactory.createJsonObjectWrapper(renamedBuild),
-                        currentUser, System.currentTimeMillis());
-            } else {
-                throw new StorageException("Could not find build to rename " + originalBuildRun);
-            }
-        } catch (SQLException e) {
-            throw new StorageException("Could not rename build " + originalBuildRun, e);
-        }
-    }
-
-    @Override
-    public void addPromotionStatus(Build build, PromotionStatus promotion, String currentUser) {
-        BuildRun buildRun = getBuildRun(build.getName(), build.getNumber(), build.getStarted());
-        if (buildRun == null) {
-            throw new StorageException("Could not add promotion " + promotion + " to non existent build " + build);
-        }
-        try {
-            long buildId = findIdFromBuildRun(buildRun);
-            build.addStatus(promotion);
-            buildsDao.addPromotionStatus(buildId, convertPromotionStatus(buildId, promotion),
-                    blobsFactory.createJsonObjectWrapper(build), currentUser, System.currentTimeMillis());
-        } catch (SQLException e) {
-            throw new StorageException("Could not add promotion " + promotion + " for build " + buildRun, e);
-        }
-    }
-
-    @Override
-    public String getBuildAsJson(BuildRun buildRun) {
-        try {
-            long buildId = findIdFromBuildRun(buildRun);
-            if (buildId > 0L) {
-                return buildsDao.getJsonBuild(buildId, String.class);
-            }
-        } catch (SQLException e) {
-            throw new StorageException("Could not execute get JSON string for build " + buildRun, e);
-        }
-        return null;
-    }
-
-    @Override
-    public Build getLatestBuild(String buildName, String buildNumber) {
-        long buildDate;
-        String fullBuildDate = "not found";
-        try {
-            buildDate = buildsDao.findLatestBuildDate(buildName, buildNumber);
-            if (buildDate > 0L) {
-                fullBuildDate = formatDateToString(buildDate);
-                return getBuildJson(new BuildRunImpl(buildName, buildNumber, fullBuildDate));
-            }
-        } catch (SQLException e) {
-            throw new StorageException("Could not find build JSON for latest build" +
-                    " name='" + buildName + "' number='" + buildNumber + "' latest date found='" + fullBuildDate + "'",
-                    e
-            );
-        }
-        return null;
-    }
-
-    @Override
-    public ImportableExportableBuild getExportableBuild(BuildRun buildRun) {
-        try {
-            BuildEntity buildEntity = buildsDao.findBuild(buildRun.getName(), buildRun.getNumber(),
-                    buildRun.getStartedDate().getTime());
-            if (buildEntity == null) {
-                throw new StorageException("Cannot create exportable build of non existent build " + buildRun);
-            }
-            ImportableExportableBuild exportedBuild = new ImportableExportableBuild();
-            exportedBuild.setVersion(EXPORTABLE_BUILD_VERSION);
-            exportedBuild.setBuildName(buildEntity.getBuildName());
-            exportedBuild.setBuildNumber(buildEntity.getBuildNumber());
-            exportedBuild.setBuildStarted(formatDateToString(buildEntity.getBuildDate()));
-
-            String jsonString = buildsDao.getJsonBuild(buildEntity.getBuildId(), String.class);
-            exportedBuild.setJson(jsonString);
-            // TODO: Check if we need to keep checksums of the JSON ??
-            //exportedBuild.setChecksumsInfo(content.getChecksums());
-
-            exportedBuild.setCreated(buildEntity.getCreated());
-            exportedBuild.setLastModified(buildEntity.getModified());
-            exportedBuild.setCreatedBy(buildEntity.getCreatedBy());
-            exportedBuild.setLastModifiedBy(buildEntity.getModifiedBy());
-
-            return exportedBuild;
-        } catch (SQLException e) {
-            throw new StorageException("Could not create exportable build object for " + buildRun, e);
-        }
-    }
-
-    @Override
-    public void deleteAllBuilds(String buildName) {
-        try {
-            List<Long> buildIds = buildsDao.findBuildIds(buildName);
-            deleteBuilds(buildIds);
-        } catch (SQLException e) {
-            throw new StorageException("Could not delete all build with name='" + buildName + "'", e);
-        }
-    }
-
-    private void deleteBuilds(Collection<Long> buildIds) throws SQLException {
-        for (Long buildId : buildIds) {
-            List<Long> moduleIds = buildModulesDao.findModuleIdsForBuild(buildId);
-            if (!moduleIds.isEmpty()) {
-                buildArtifactsDao.deleteBuildArtifacts(moduleIds);
-                buildDependenciesDao.deleteBuildDependencies(moduleIds);
-            }
-            buildModulesDao.deleteBuildModules(buildId);
-            buildsDao.deleteBuild(buildId);
-        }
-    }
-
-    @Override
-    public void deleteBuild(BuildRun buildRun) {
-        log.debug("Deleting Build " + buildRun);
-        try {
-            long buildId = findIdFromBuildRun(buildRun);
-            if (buildId > 0L) {
-                deleteBuilds(ImmutableList.of(buildId));
-            } else {
-                log.info("Build " + buildRun + " already deleted!");
-            }
-        } catch (SQLException e) {
-            throw new StorageException("Could not delete build " + buildRun, e);
-        }
-    }
-
-    @Override
-    public void deleteBuild(String buildName, String buildNumber, String buildStarted) {
-        deleteBuild(new BuildRunImpl(buildName, buildNumber, buildStarted));
-    }
-
-    @Override
-    public void deleteAllBuilds() {
-        try {
-            buildArtifactsDao.deleteAllBuildArtifacts();
-            buildDependenciesDao.deleteAllBuildDependencies();
-            buildModulesDao.deleteAllBuildModules();
-            buildsDao.deleteAllBuilds();
-        } catch (SQLException e) {
-            throw new StorageException("Could not delete all builds", e);
-        }
-    }
-
-    @Override
-    public Set<BuildRun> findBuildsForChecksum(BuildSearchCriteria criteria, ChecksumType type, String checksum) {
-        if (!type.isValid(checksum)) {
-            log.info("Looking for invalid checksum " + type.name() + " '" + checksum + "'");
-        }
-        try {
-            Set<BuildRun> results = Sets.newHashSet();
-            if (criteria.searchInDependencies()) {
-                Collection<BuildEntity> buildEntities = buildsDao.findBuildsForDependencyChecksum(type, checksum);
-                for (BuildEntity buildEntity : buildEntities) {
-                    results.add(getBuildRun(buildEntity));
-                }
-            }
-
-            if (criteria.searchInArtifacts()) {
-                Collection<BuildEntity> buildEntities = buildsDao.findBuildsForArtifactChecksum(type, checksum);
-                for (BuildEntity buildEntity : buildEntities) {
-                    results.add(getBuildRun(buildEntity));
-                }
-            }
-
-            return results;
-        } catch (SQLException e) {
-            throw new StorageException("Could not find builds for " + type.name() + " '" + checksum + "'", e);
-        }
-    }
-
-    @Override
-    public List<PublishedModule> getPublishedModules(String buildName, String date, String orderBy, String direction, String offset, String limit) {
-        List<PublishedModule> buildModule = null;
-        try {
-             buildModule = buildsDao.getBuildModule(buildName, date, orderBy, direction, offset, limit);
-        }catch (Exception e){
-            log.error(e.toString());
-        }
-        return buildModule;
-    }
-
-    @Override
-    public  List<ModuleArtifact> getModuleArtifact(String buildName,String buildNumber, String moduleId,String date, String orderBy, String direction, String offset, String limit) {
-        List<ModuleArtifact> moduleArtifactList = null;
-        try {
-            moduleArtifactList = buildsDao.getModuleArtifact(buildName, buildNumber, date, moduleId, orderBy, direction, offset, limit);
-        }catch (Exception e){
-            log.error(e.toString());
-        }
-        return moduleArtifactList;
-    }
-
-    @Override
-    public List<ModuleDependency> getModuleDependency(String buildNumber, String moduleId, String date, String orderBy, String direction, String offset, String limit) {
-        List<ModuleDependency> moduleArtifactList = null;
-        try {
-            moduleArtifactList = buildsDao.getModuleDependency(buildNumber, date, moduleId, orderBy, direction, offset, limit);
-        } catch (Exception e) {
-            log.error(e.toString());
-        }
-        return moduleArtifactList;
-    }
-
-    @Override
-    public int getModuleDependenciesCount(String buildNumber, String moduleId, String date) {
-        int totalArtifactCount = 0;
-        try {
-            totalArtifactCount = buildsDao.getModuleDependenciesCount(buildNumber, date, moduleId);
-        } catch (Exception e) {
-            log.error(e.toString());
-        }
-        return totalArtifactCount;
-    }
-
-    @Override
-    public List<ModuleArtifact> getModuleArtifactsForDiffWithPaging(BuildParams buildParams, String offset, String limit) {
-        return buildsDao.getModuleArtifactsForDiffWithPaging(buildParams, offset, limit);
-    }
-
-    public List<GeneralBuild> getPrevBuildsList(String buildName, String buildDate) {
-        return buildsDao.getPrevBuildsList(buildName, buildDate);
-    }
-
-    @Override
-    public int getModuleArtifactsForDiffCount(BuildParams buildParams, String offset, String limit) {
-        return buildsDao.getModuleArtifactsForDiffCount(buildParams, offset, limit);
-    }
-
-    @Override
-    public List<BuildProps> getBuildPropsData(BuildParams buildParams, String offset, String limit, String orderBy) {
-        return buildsDao.getBuildProps(buildParams, offset, limit, orderBy);
-    }
-
-    @Override
-    public long getBuildPropsCounts(BuildParams buildParams) {
-        return buildsDao.getBuildPropsCounts(buildParams);
-    }
-
-    @Override
-    public int getPropsDiffCount(BuildParams buildParams) {
-        return buildsDao.getPropsDiffCount(buildParams);
-    }
-
-    @Override
-    public List<BuildProps> getBuildProps(BuildParams buildParams, String offset, String limit) {
-        return buildsDao.diffBuildProps(buildParams, offset, limit);
-    }
-
-
-    @Override
-    public List<ModuleDependency> getModuleDependencyForDiffWithPaging(BuildParams buildParams, String offset, String limit) {
-        return buildsDao.getModuleDependencyForDiffWithPaging(buildParams, offset, limit);
-    }
-
-    @Override
-    public int getModuleDependencyForDiffCount(BuildParams buildParams, String offset, String limit) {
-        return buildsDao.getModuleDependencyForDiffCount(buildParams, offset, limit);
-    }
-
-
-    @Override
-    public  int getModuleArtifactCount(String buildNumber, String moduleId,String date) {
-        int totalArtifactCount=0;
-        try {
-            totalArtifactCount =  buildsDao.getModuleArtifactCount(buildNumber, date, moduleId);
-        }catch (Exception e){
-            log.error(e.toString());
-        }
-        return totalArtifactCount;
-    }
-
-
-    @Override
-    public int  getPublishedModulesCounts(String buildName, String date) {
-
-        int  buildModuleCount = 0;
-        try {
-            buildModuleCount = buildsDao.getPublishedModulesCounts(buildName, date);
-        }catch (Exception e){
-            log.error(e.toString());
-        }
-        return buildModuleCount;
-    }
-
-    @Override
-    public Set<BuildRun> getLatestBuildsByName() {
-        try {
-            List<String> allBuildNames = buildsDao.getAllBuildNames();
-            LinkedHashSet<BuildRun> results = new LinkedHashSet<>(allBuildNames.size());
-            for (String buildName : allBuildNames) {
-                BuildEntity buildEntity = buildsDao.getLatestBuild(buildName);
-                if (buildEntity != null) {
-                    results.add(getBuildRun(buildEntity));
-                }
-            }
-            return results;
-        } catch (SQLException e) {
-            throw new StorageException("Could not list all builds by name and latest build date", e);
-        }
-    }
-
-    @Override
-    public Set<BuildRun> getLatestBuildsPaging(String offset, String orderBy, String direction, String limit) {
-        try {
-            List<BuildEntity> allBuildNames = buildsDao.getAllBuildNamePaging(offset, orderBy, direction, limit);
-            LinkedHashSet<BuildRun> results = new LinkedHashSet<>(allBuildNames.size());
-            for (BuildEntity buildEntity : allBuildNames) {
-                if (buildEntity != null) {
-                    results.add(getBuildRun(buildEntity));
-                }
-            }
-            return results;
-        } catch (SQLException e) {
-            throw new StorageException("Could not list all builds by name and latest build date", e);
-        }
-    }
-
-    @Override
-    public Set<BuildRun> findBuildsByName(String buildName) {
-        Set<BuildRun> results = Sets.newHashSet();
-        try {
-            List<Long> buildIds = buildsDao.findBuildIds(buildName);
-            for (Long buildId : buildIds) {
-                results.add(getBuildRun(buildId));
-            }
-        } catch (SQLException e) {
-            throw new StorageException("Could not search for builds with name='" + buildName + "'", e);
-        }
-        return results;
-    }
-
-    @Override
-    public Set<BuildRun> findBuildsByNameAndNumber(String buildName, String buildNumber) {
-        Set<BuildRun> results = Sets.newHashSet();
-        try {
-            List<Long> buildIds = buildsDao.findBuildIds(buildName, buildNumber);
-            for (Long buildId : buildIds) {
-                results.add(getBuildRun(buildId));
-            }
-        } catch (SQLException e) {
-            throw new StorageException(
-                    "Could not search for builds with name='" + buildName + "' and number='" + buildNumber + "'", e);
-        }
-        return results;
-    }
-
-    @Override
-    public List<String> getAllBuildNames() {
-        try {
-            return buildsDao.getAllBuildNames();
-        } catch (SQLException e) {
-            throw new StorageException("Could not retrieve the list of build names", e);
-        }
-    }
-
-    private long findIdFromBuildRun(BuildRun buildRun) throws SQLException {
-        long buildId = 0L;
-        if (buildRun instanceof BuildRunImpl) {
-            buildId = ((BuildRunImpl) buildRun).getBuildId();
-        }
-        if (buildId <= 0L) {
-            buildId = buildsDao.findBuildId(buildRun.getName(), buildRun.getNumber(),
-                    buildRun.getStartedDate().getTime());
-        }
-        return buildId;
-    }
-
-    private BuildRun getBuildRun(Long buildId) throws SQLException {
-        BuildEntity buildEntity = buildsDao.getBuild(buildId);
-        return getBuildRun(buildEntity);
-    }
-
-    @Override
-    public List<GeneralBuild> getBuildForNamePaging(String buildName, String orderBy, String direction, String offset, String limit) throws SQLException {
-        return  buildsDao.getBuildForName(buildName, orderBy, direction, offset, limit);
-    }
-
-    @Override
-    public int getBuildForNameTotalCount(String buildName) throws SQLException {
-        return buildsDao.getBuildForNameTotalCount(buildName);
-    }
-
-    private BuildRun getBuildRun(BuildEntity buildEntity) {
-        String releaseStatus = null;
-        if (!buildEntity.getPromotions().isEmpty()) {
-            releaseStatus = buildEntity.getPromotions().last().getStatus();
-        }
-        return new BuildRunImpl(buildEntity.getBuildId(), buildEntity.getBuildName(), buildEntity.getBuildNumber(),
-                formatDateToString(buildEntity.getBuildDate()), buildEntity.getCiUrl(), releaseStatus);
-    }
-
-    /**
-     * Locates and fills in missing checksums of a build file bean
-     *
-     * @param buildFiles List of build files to populate
-     */
-    private void handleBeanPopulation(List<? extends BuildFileBean> buildFiles) {
-        if (buildFiles != null && !buildFiles.isEmpty()) {
-            Set<String> checksums = Sets.newHashSet();
-            for (BuildFileBean buildFile : buildFiles) {
-                boolean sha1Exists = StringUtils.isNotBlank(buildFile.getSha1());
-                boolean md5Exists = StringUtils.isNotBlank(buildFile.getMd5());
-
-                //If the bean has both or none of the checksums, return
-                if ((sha1Exists && md5Exists) || ((!sha1Exists && !md5Exists))) {
-                    continue;
-                }
-
-                if (!sha1Exists) {
-                    checksums.add(buildFile.getMd5());
-                } else {
-                    checksums.add(buildFile.getSha1());
-                }
-            }
-            Set<BinaryInfo> binaryInfos = binaryService.findBinaries(checksums);
-            BiMap<String, String> found = HashBiMap.create(binaryInfos.size());
-            for (BinaryInfo binaryInfo : binaryInfos) {
-                found.put(binaryInfo.getSha1(), binaryInfo.getMd5());
-            }
-            for (BuildFileBean buildFile : buildFiles) {
-                boolean sha1Exists = StringUtils.isNotBlank(buildFile.getSha1());
-                boolean md5Exists = StringUtils.isNotBlank(buildFile.getMd5());
-
-                //If the bean has both or none of the checksums, return
-                if ((sha1Exists && md5Exists) || ((!sha1Exists && !md5Exists))) {
-                    continue;
-                }
-
-                if (!sha1Exists) {
-                    String newSha1 = found.inverse().get(buildFile.getMd5());
-                    if (ChecksumType.sha1.isValid(newSha1)) {
-                        buildFile.setSha1(newSha1);
-                    }
-                } else {
-                    String newMd5 = found.get(buildFile.getSha1());
-                    if (ChecksumType.md5.isValid(newMd5)) {
-                        buildFile.setMd5(newMd5);
-                    }
-                }
-            }
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/dao/ArchiveEntriesDao.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/dao/ArchiveEntriesDao.java
deleted file mode 100644
index 28c6530..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/dao/ArchiveEntriesDao.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.dao;
-
-import com.google.common.collect.Sets;
-import org.artifactory.storage.StorageProperties;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.db.fs.entity.ArchiveEntry;
-import org.artifactory.storage.db.util.BaseDao;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Repository;
-
-import javax.annotation.Nonnull;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Set;
-
-/**
- * A data access table for the archive_entries table.
- *
- * @author Yossi Shaul
- */
- at Repository
-public class ArchiveEntriesDao extends BaseDao {
-
-    private final StorageProperties storageProps;
-
-    @Autowired
-    public ArchiveEntriesDao(JdbcHelper jdbcHelper, StorageProperties storageProps) {
-        super(jdbcHelper);
-        this.storageProps = storageProps;
-    }
-
-    @Nonnull
-    public Set<ArchiveEntry> loadByChecksum(String archiveSha1) throws SQLException {
-        ResultSet resultSet = null;
-        Set<ArchiveEntry> entries = Sets.newLinkedHashSet();
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT ia.archive_sha1, ap.entry_path, an.entry_name FROM " +
-                    "indexed_archives ia, indexed_archives_entries iae, archive_paths ap , archive_names an " +
-                    "WHERE ia.indexed_archives_id=iae.indexed_archives_id " +
-                    "AND iae.entry_path_id=ap.path_id " +
-                    "AND iae.entry_name_id=an.name_id " +
-                    "AND ia.archive_sha1 = ?", archiveSha1);
-            while (resultSet.next()) {
-                entries.add(entryFromResultSet(resultSet));
-            }
-            return entries;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public boolean isIndexed(String archiveSha1) throws SQLException {
-        int count = jdbcHelper.executeSelectCount(
-                "SELECT COUNT(*) FROM indexed_archives WHERE archive_sha1 = ?", archiveSha1);
-        return count > 0;
-    }
-
-    /**
-     * Deletes the checksum entry from the indexed_archives table and from the many-to-many table
-     * indexed_archives_entries. Cleanup of additional referenced tables is taken care by the GC.
-     *
-     * @param sha1 The checksum to cleanup.
-     * @return Number of entries deleted from the many to many table
-     */
-    public int deleteByChecksum(String sha1) throws SQLException {
-        long id = findIndexedArchiveIdByChecksum(sha1);
-        if (id != DbService.NO_DB_ID) {
-            int entriesCount =
-                    jdbcHelper.executeUpdate("DELETE FROM indexed_archives_entries WHERE indexed_archives_id = ?", id);
-            jdbcHelper.executeUpdate("DELETE FROM indexed_archives WHERE indexed_archives_id = ?", id);
-            return entriesCount;
-        }
-        return 0;
-    }
-
-    public long findIndexedArchiveIdByChecksum(String sha1) throws SQLException {
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect(
-                    "SELECT indexed_archives_id FROM indexed_archives WHERE archive_sha1 = ?", sha1);
-            if (resultSet.next()) {
-                return resultSet.getLong(1);
-            }
-            return DbService.NO_DB_ID;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public boolean createIndexedArchive(String archiveSha1, long indexedArchiveId) throws SQLException {
-        int updateCount = jdbcHelper.executeUpdate("INSERT INTO indexed_archives VALUES (?, ?)",
-                archiveSha1, indexedArchiveId);
-        return updateCount > 0;
-
-    }
-
-    public boolean createArchivePath(long archivePathId, String entryPath) throws SQLException {
-        int updateCount = jdbcHelper.executeUpdate("INSERT INTO archive_paths VALUES (?, ?)",
-                archivePathId, dotIfNullOrEmpty(entryPath));
-        return updateCount > 0;
-    }
-
-    /**
-     * @param entryPath The entry path
-     * @return Unique id of the entry path if such exists, {@link org.artifactory.storage.db.DbService#NO_DB_ID} otherwise
-     */
-    public long findArchivePathId(String entryPath) throws SQLException {
-        return jdbcHelper.executeSelectLong("SELECT path_id FROM archive_paths WHERE entry_path = ?",
-                dotIfNullOrEmpty(entryPath));
-    }
-
-    public boolean createArchiveName(long archiveNameId, String entryName) throws SQLException {
-        int updateCount = jdbcHelper.executeUpdate("INSERT INTO archive_names VALUES (?, ?)",
-                archiveNameId, dotIfNullOrEmpty(entryName));
-        return updateCount > 0;
-    }
-
-    /**
-     * @param entryName The entry name
-     * @return Unique id of the entry name if such exists, {@link org.artifactory.storage.db.DbService#NO_DB_ID} otherwise
-     */
-    public long findArchiveNameId(String entryName) throws SQLException {
-        return jdbcHelper.executeSelectLong("SELECT name_id FROM archive_names WHERE entry_name = ?",
-                dotIfNullOrEmpty(entryName));
-    }
-
-    /**
-     * Creates a new record in the many-to-many table of archive to entries.
-     *
-     * @param indexedArchiveId The indexed archive unique id
-     * @param archivePathId    The archive entry path unique id
-     * @param archiveNameId    The archive entry name unique id
-     * @return True if the new entry was inserted
-     */
-    public boolean createIndexedArchivesEntries(long indexedArchiveId, long archivePathId, long archiveNameId)
-            throws SQLException {
-        int updateCount = jdbcHelper.executeUpdate("INSERT INTO indexed_archives_entries VALUES (?, ?, ?)",
-                indexedArchiveId, archivePathId, archiveNameId);
-        return updateCount > 0;
-    }
-
-    /**
-     * @return True if there's already an entry with the given ids
-     */
-    public boolean hasIndexedArchivesEntries(long indexedArchiveId, long archivePathId, long archiveNameId)
-            throws SQLException {
-        int updateCount = jdbcHelper.executeSelectCount("SELECT count(*) FROM indexed_archives_entries " +
-                "WHERE indexed_archives_id = ? AND entry_path_id = ? AND entry_name_id = ?",
-                indexedArchiveId, archivePathId, archiveNameId);
-        return updateCount > 0;
-    }
-
-    public int deleteUnusedPathIds() throws SQLException {
-        if (!storageProps.isPostgres()) {
-            return jdbcHelper.executeUpdate("DELETE FROM archive_paths WHERE path_id NOT IN " +
-                    "(SELECT entry_path_id FROM indexed_archives_entries)");
-        } else {
-            // NOT EXISTS is much faster on PostgreSQL (see RTFACT-6231)
-            return jdbcHelper.executeUpdate("DELETE FROM archive_paths WHERE NOT EXISTS " +
-                    "(SELECT 1 FROM indexed_archives_entries i WHERE i.entry_path_id = path_id)");
-        }
-    }
-
-    public int deleteUnusedNameIds() throws SQLException {
-        if (!storageProps.isPostgres()) {
-            return jdbcHelper.executeUpdate("DELETE FROM archive_names WHERE name_id NOT IN " +
-                    "(SELECT entry_name_id FROM indexed_archives_entries)");
-        } else {
-            // NOT EXISTS is much faster on PostgreSQL (see RTFACT-6231)
-            return jdbcHelper.executeUpdate("DELETE FROM archive_names WHERE NOT EXISTS " +
-                    "(SELECT 1 FROM indexed_archives_entries i WHERE i.entry_name_id = name_id)");
-        }
-    }
-
-    private ArchiveEntry entryFromResultSet(ResultSet rs) throws SQLException {
-        return new ArchiveEntry(rs.getString(1), emptyIfNullOrDot(rs.getString(2)), emptyIfNullOrDot(rs.getString(3)));
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/dao/ConfigsDao.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/dao/ConfigsDao.java
deleted file mode 100644
index a92b78a..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/dao/ConfigsDao.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.dao;
-
-import com.google.common.base.Charsets;
-import org.apache.commons.io.IOUtils;
-import org.artifactory.storage.db.util.BaseDao;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.artifactory.storage.db.util.blob.BlobWrapper;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Repository;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-
-/**
- * A data access object for configs table access.
- *
- * @author Yossi Shaul
- */
- at Repository
-public class ConfigsDao extends BaseDao {
-
-    @Autowired
-    public ConfigsDao(JdbcHelper jdbcHelper) {
-        super(jdbcHelper);
-    }
-
-    public int createConfig(String name, String data) throws SQLException, UnsupportedEncodingException {
-        BlobWrapper blobWrapper = new BlobWrapper(data);
-        return createConfig(name, blobWrapper);
-    }
-
-    public int createConfig(String name, BlobWrapper blobWrapper) throws SQLException {
-        return jdbcHelper.executeUpdate("INSERT INTO configs VALUES(?, ?)", name, blobWrapper);
-    }
-
-    public boolean hasConfig(String name) throws SQLException {
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT COUNT(1) FROM configs WHERE config_name = ?", name);
-            if (resultSet.next()) {
-                int propsCount = resultSet.getInt(1);
-                return propsCount > 0;
-            }
-            return false;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public InputStream loadStreamConfig(String name) throws SQLException {
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT data FROM configs WHERE config_name = ?", name);
-            if (resultSet.next()) {
-                InputStream binaryStream = null;
-                try {
-                    binaryStream = resultSet.getBinaryStream(1);
-                    return IOUtils.toBufferedInputStream(binaryStream);
-                } finally {
-                    IOUtils.closeQuietly(binaryStream);
-                }
-            }
-            return null;
-        } catch (IOException e) {
-            throw new SQLException("Failed to read config '" + name + "' due to: " + e.getMessage(), e);
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public String loadConfig(String name) throws SQLException {
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT data FROM configs WHERE config_name = ?", name);
-            if (resultSet.next()) {
-                InputStream binaryStream = resultSet.getBinaryStream(1);
-                return IOUtils.toString(binaryStream, Charsets.UTF_8.name());
-            }
-            return null;
-        } catch (IOException e) {
-            throw new SQLException("Failed to read config '" + name + "' due to: " + e.getMessage(), e);
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public int updateConfig(String name, String data) throws UnsupportedEncodingException, SQLException {
-        BlobWrapper blobWrapper = new BlobWrapper(data);
-        return updateConfig(name, blobWrapper);
-    }
-
-    public int updateConfig(String name, BlobWrapper blobWrapper) throws SQLException {
-        return jdbcHelper.executeUpdate("UPDATE configs SET data = ? WHERE config_name = ?",
-                blobWrapper, name);
-    }
-
-    public int deleteConfig(String name) throws SQLException {
-        return jdbcHelper.executeUpdate("DELETE FROM configs WHERE config_name = ?", name);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/dao/NodeMetaInfoDao.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/dao/NodeMetaInfoDao.java
deleted file mode 100644
index 9463838..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/dao/NodeMetaInfoDao.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.dao;
-
-import org.artifactory.storage.db.fs.entity.NodeMetaInfo;
-import org.artifactory.storage.db.util.BaseDao;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Repository;
-
-import javax.annotation.Nullable;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-
-/**
- * A data access table for the node meta infos table.
- *
- * @author Yossi Shaul
- */
- at Repository
-public class NodeMetaInfoDao extends BaseDao {
-    private static final Logger log = LoggerFactory.getLogger(NodeMetaInfoDao.class);
-
-    @Autowired
-    public NodeMetaInfoDao(JdbcHelper jdbcHelper) {
-        super(jdbcHelper);
-    }
-
-    public boolean hasNodeMetadata(long nodeId) throws SQLException {
-        return jdbcHelper.executeSelectCount("SELECT COUNT(1) FROM node_meta_infos WHERE node_id = ?", nodeId) > 0;
-    }
-
-    @Nullable
-    public NodeMetaInfo getNodeMetadata(long nodeId) throws SQLException {
-        ResultSet resultSet = null;
-        try {
-            // the child path must be the path+name of the parent
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM node_meta_infos WHERE node_id = ?", nodeId);
-            if (resultSet.next()) {
-                return metaInfosFromResultSet(resultSet);
-            }
-            return null;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public int deleteNodeMeta(long nodeId) throws SQLException {
-        return jdbcHelper.executeUpdate("DELETE FROM node_meta_infos WHERE node_id = ?", nodeId);
-    }
-
-    public int create(NodeMetaInfo metaInfo) throws SQLException {
-        return jdbcHelper.executeUpdate("INSERT INTO node_meta_infos VALUES(?, ?, ?)",
-                metaInfo.getNodeId(), metaInfo.getPropsModified(), metaInfo.getPropsModifiedBy());
-    }
-
-    public int update(NodeMetaInfo metaInfo) throws SQLException {
-        return jdbcHelper.executeUpdate("UPDATE node_meta_infos SET props_modified = ?, props_modified_by = ? " +
-                "WHERE node_id = ?", metaInfo.getPropsModified(), metaInfo.getPropsModifiedBy(), metaInfo.getNodeId());
-    }
-
-    private NodeMetaInfo metaInfosFromResultSet(ResultSet resultSet) throws SQLException {
-        long nodeId = resultSet.getLong(1);
-        long propModified = resultSet.getLong(2);
-        String propModifiedBy = resultSet.getString(3);
-        return new NodeMetaInfo(nodeId, propModified, propModifiedBy);
-    }
-
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/dao/NodesDao.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/dao/NodesDao.java
deleted file mode 100644
index a7ebcab..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/dao/NodesDao.java
+++ /dev/null
@@ -1,497 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.dao;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.storage.StorageException;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.db.fs.entity.Node;
-import org.artifactory.storage.db.fs.entity.NodePath;
-import org.artifactory.storage.db.fs.util.NodeUtils;
-import org.artifactory.storage.db.util.BaseDao;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.artifactory.storage.fs.repo.RepoStorageSummary;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Repository;
-
-import javax.annotation.Nullable;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-/**
- * A data access object for node table access.
- *
- * @author Yossi Shaul
- */
- at Repository
-public class NodesDao extends BaseDao {
-    private static final Logger log = LoggerFactory.getLogger(NodesDao.class);
-
-    public static final String TABLE_NAME = "nodes";
-    private static final String SELECT_NODE_QUERY = "SELECT * FROM nodes ";
-
-    @Autowired
-    public NodesDao(JdbcHelper jdbcHelper) {
-        super(jdbcHelper);
-    }
-
-    @Nullable
-    public Node get(NodePath path) throws SQLException {
-        ResultSet resultSet = null;
-        Node node = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM nodes " +
-                            "WHERE repo = ? AND node_path = ? AND node_name = ?",
-                    path.getRepo(), dotIfNullOrEmpty(path.getPath()), dotIfNullOrEmpty(path.getName()));
-            if (resultSet.next()) {
-                node = nodeFromResultSet(resultSet);
-            }
-            return node;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    @Nullable
-    public Node get(long id) throws SQLException {
-        ResultSet resultSet = null;
-        Node node = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM nodes WHERE node_id = ?", id);
-            if (resultSet.next()) {
-                node = nodeFromResultSet(resultSet);
-            }
-            return node;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public long getNodeId(NodePath path) throws SQLException {
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT node_id FROM nodes " +
-                            "WHERE repo = ? AND node_path = ? AND node_name = ?",
-                    path.getRepo(), dotIfNullOrEmpty(path.getPath()), dotIfNullOrEmpty(path.getName()));
-            if (resultSet.next()) {
-                return resultSet.getLong(1);
-            } else {
-                return DbService.NO_DB_ID;
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public long getFileNodeId(NodePath path) throws SQLException {
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT node_id FROM nodes " +
-                            "WHERE node_type=1 AND repo = ? AND node_path = ? AND node_name = ?",
-                    path.getRepo(), dotIfNullOrEmpty(path.getPath()), dotIfNullOrEmpty(path.getName()));
-            if (resultSet.next()) {
-                return resultSet.getLong(1);
-            } else {
-                return DbService.NO_DB_ID;
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public String getNodeSha1(NodePath path) throws SQLException {
-        ResultSet resultSet = null;
-        String sha1 = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT sha1_actual FROM nodes " +
-                            "WHERE repo = ? AND node_path = ? AND node_name = ?",
-                    path.getRepo(), dotIfNullOrEmpty(path.getPath()), dotIfNullOrEmpty(path.getName()));
-            if (resultSet.next()) {
-                sha1 = resultSet.getString(1);
-            }
-            return sha1;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public int create(Node node) throws SQLException {
-        return jdbcHelper.executeUpdate("INSERT INTO nodes VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
-                node.getNodeId(), booleanAsByte(node.isFile()), node.getRepo(),
-                dotIfNullOrEmpty(node.getPath()), dotIfNullOrEmpty(node.getName()),
-                node.getDepth(), node.getCreated(), node.getCreatedBy(), node.getModified(), node.getModifiedBy(),
-                node.getUpdated(), node.getLength(), node.getSha1Actual(), node.getSha1Original(), node.getMd5Actual(),
-                node.getMd5Original());
-    }
-
-    public int update(Node node) throws SQLException {
-        // node id and type are not updatable
-        return jdbcHelper.executeUpdate("UPDATE nodes " +
-                        "SET repo = ?,  node_path = ?, node_name = ?, " +
-                        "depth = ?, created = ?, created_by = ?, " +
-                        "modified = ?, modified_by = ?, updated = ?, " +
-                        "bin_length = ?, sha1_actual = ?, sha1_original = ?, md5_actual = ?, md5_original = ? " +
-                        "WHERE node_id = ?",
-                node.getRepo(), dotIfNullOrEmpty(node.getPath()), dotIfNullOrEmpty(node.getName()),
-                node.getDepth(), node.getCreated(), node.getCreatedBy(),
-                node.getModified(), node.getModifiedBy(), node.getUpdated(),
-                node.getLength(), node.getSha1Actual(), node.getSha1Original(), node.getMd5Actual(),
-                node.getMd5Original(), node.getNodeId());
-    }
-
-    public boolean exists(NodePath path) throws SQLException {
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT count(*) FROM nodes " +
-                            "WHERE repo = ? AND node_path = ? AND node_name = ?",
-                    path.getRepo(), dotIfNullOrEmpty(path.getPath()), dotIfNullOrEmpty(path.getName()));
-            int count = 0;
-            if (resultSet.next()) {
-                count = resultSet.getInt(1);
-                if (count > 1) {
-                    if (log.isDebugEnabled()) {
-                        StorageException bigWarning = new StorageException(
-                                "Unexpected node count for absolute path: '" + path + "' - " + count);
-                        log.warn(bigWarning.getMessage(), bigWarning);
-                    } else {
-                        log.warn("Unexpected node count for absolute path: '{}' - {}", path, count);
-                    }
-                }
-            }
-            return count > 0;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public boolean delete(long id) throws SQLException {
-        int deleted = jdbcHelper.executeUpdate("DELETE FROM nodes WHERE node_id = ?", id);
-        return deleted > 0;
-    }
-
-    public List<Node> getChildren(NodePath path) throws SQLException {
-        ResultSet resultSet = null;
-        List<Node> results = Lists.newArrayList();
-        try {
-            // the child path must be the path+name of the parent
-            String childPath = path.getPathName();
-            resultSet = jdbcHelper.executeSelect(SELECT_NODE_QUERY +
-                            "WHERE repo = ? AND node_path = ? AND depth = ?",
-                    path.getRepo(), dotIfNullOrEmpty(childPath), path.getDepth() + 1);
-            while (resultSet.next()) {
-                results.add(nodeFromResultSet(resultSet));
-            }
-            return results;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public boolean hasChildren(NodePath path) throws SQLException {
-        ResultSet resultSet = null;
-        try {
-            // the child path must be the path+name of the parent
-            String childPath = path.getPathName();
-            resultSet = jdbcHelper.executeSelect("SELECT COUNT(1) FROM nodes " +
-                            "WHERE repo = ? AND node_path = ? AND depth = ?",
-                    path.getRepo(), dotIfNullOrEmpty(childPath), path.getDepth() + 1);
-            if (resultSet.next()) {
-                int childrenCount = resultSet.getInt(1);
-                log.trace("Children count of '{}': {}", path, childrenCount);
-                return childrenCount > 0;
-            }
-            return false;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public List<? extends Node> getAllNodes() throws SQLException {
-        if (!ConstantValues.dev.getBoolean()) {
-            return Lists.newArrayList();
-        }
-
-        ResultSet resultSet = null;
-        List<Node> results = Lists.newArrayList();
-        try {
-            resultSet = jdbcHelper.executeSelect(SELECT_NODE_QUERY);
-            while (resultSet.next()) {
-                results.add(nodeFromResultSet(resultSet));
-            }
-            return results;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public List<? extends Node> getChildrenRecursively(String path) throws SQLException {
-        ResultSet resultSet = null;
-        List<Node> results = Lists.newArrayList();
-        int childDepth = NodeUtils.getDepth(path);
-        if (!path.endsWith("/")) {
-            path += "/";
-        }
-        try {
-            resultSet = jdbcHelper.executeSelect(SELECT_NODE_QUERY +
-                    "WHERE path like '" + path + "%' AND depth >= " + childDepth);
-            while (resultSet.next()) {
-                results.add(nodeFromResultSet(resultSet));
-            }
-            return results;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public int getFilesCount() throws SQLException {
-        return jdbcHelper.executeSelectCount("SELECT COUNT(*) FROM nodes WHERE node_type = 1");
-    }
-
-    public int getFilesCount(String repoKey) throws SQLException {
-        return jdbcHelper.executeSelectCount("SELECT COUNT(*) FROM nodes WHERE node_type=1 and repo = ?", repoKey);
-    }
-
-    public int getFilesCount(NodePath nodePath) throws SQLException {
-        ResultSet resultSet = null;
-        int result = 0;
-        try {
-            resultSet = jdbcHelper.executeSelect(
-                    "SELECT COUNT(*) FROM nodes WHERE node_type=1 and repo = ? and depth > ? and " +
-                            "(node_path = ? or node_path like ?)",
-                    nodePath.getRepo(), nodePath.getDepth(), nodePath.getPathName(), nodePath.getPathName() + "/%");
-            if (resultSet.next()) {
-                result = resultSet.getInt(1);
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        return result;
-    }
-
-    public long getFilesTotalSize(String repoKey) throws SQLException {
-        return jdbcHelper.executeSelectLong("SELECT SUM(bin_length) FROM nodes WHERE node_type=1 and repo = ?",
-                repoKey);
-    }
-
-    public long getFilesTotalSize(NodePath nodePath) throws SQLException {
-        return jdbcHelper.executeSelectLong(
-                "SELECT SUM(bin_length) FROM nodes WHERE node_type=1 and repo = ? and depth > ? and " +
-                        "(node_path = ? or node_path like ?)",
-                nodePath.getRepo(), nodePath.getDepth(), nodePath.getPathName(), nodePath.getPathName() + "/%");
-    }
-
-    public int getNodesCount(String repoKey) throws SQLException {
-        return jdbcHelper.executeSelectCount(
-                "SELECT COUNT(*) FROM nodes WHERE (node_type=1 or node_type=0) and repo = ?", repoKey);
-    }
-
-    public int getNodesCount(NodePath nodePath) throws SQLException {
-        return jdbcHelper.executeSelectCount(
-                "SELECT COUNT(*) FROM nodes WHERE (node_type=1 or node_type=0) and repo = ? and depth > ? and " +
-                        "(node_path = ? or node_path like ?)",
-                nodePath.getRepo(), nodePath.getDepth(), nodePath.getPathName(), nodePath.getPathName() + "/%");
-    }
-
-    public List<Node> searchFileByName(String name) throws SQLException {
-        ResultSet resultSet = null;
-        List<Node> results = new ArrayList<>();
-        try {
-            resultSet = jdbcHelper.executeSelect(SELECT_NODE_QUERY +
-                    "WHERE ftype = 1 and pname like '" + name + "'");
-            while (resultSet.next()) {
-                results.add(nodeFromResultSet(resultSet));
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        return results;
-    }
-
-    public List<Node> searchGavc(String g, String a, String v, String c) {
-        return null;
-    }
-
-    public List<Node> searchByChecksum(ChecksumType type, String checksum) throws SQLException {
-        if (!type.isValid(checksum)) {
-            throw new IllegalArgumentException(
-                    "Cannot search for invalid " + type.name() + " checksum value '" + checksum + "'");
-        }
-        List<Node> results = Lists.newArrayList();
-        ResultSet rs = null;
-        try {
-            rs = jdbcHelper.executeSelect("SELECT * FROM nodes " +
-                    "WHERE " + type.name() + "_actual = ?", checksum);
-            while (rs.next()) {
-                results.add(nodeFromResultSet(rs));
-            }
-        } finally {
-            DbUtils.close(rs);
-        }
-        return results;
-    }
-
-    public List<Node> searchBadChecksums(ChecksumType type) throws SQLException {
-        List<Node> results = Lists.newArrayList();
-        ResultSet rs = null;
-        try {
-            if (ChecksumType.sha1.equals(type)) {
-                rs = jdbcHelper.executeSelect(
-                        "SELECT * FROM nodes WHERE " +
-                                "node_type = 1 and" +
-                                "((sha1_original IS NULL) or " +
-                                "(sha1_actual IS NULL) or " +
-                                "(sha1_original != ? and sha1_original != sha1_actual))",
-                        ChecksumInfo.TRUSTED_FILE_MARKER);
-            } else {
-                rs = jdbcHelper.executeSelect(
-                        "SELECT * FROM nodes WHERE " +
-                                "node_type = 1 and" +
-                                "((md5_original IS NULL) or " +
-                                "(md5_actual IS NULL) or " +
-                                "(md5_original != ? and md5_original != md5_actual))",
-                        ChecksumInfo.TRUSTED_FILE_MARKER);
-            }
-            while (rs.next()) {
-                results.add(nodeFromResultSet(rs));
-            }
-        } finally {
-            DbUtils.close(rs);
-        }
-        return results;
-    }
-
-    //TODO: [by YS] this is a just a temp naive search for maven plugin metadata
-    public List<Node> searchFilesByProperty(String repo, String propKey, String propValue) throws SQLException {
-        ResultSet resultSet = null;
-        List<Node> results = new ArrayList<>();
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT n.* FROM nodes n " +
-                            "JOIN node_props p ON n.node_id = p.node_id " +
-                            "WHERE n.node_type = 1 and repo = ?  " +
-                            "AND p.prop_key = ? and p.prop_value = ?",
-                    repo, propKey, propValue);
-            while (resultSet.next()) {
-                results.add(nodeFromResultSet(resultSet));
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        return results;
-    }
-
-    /**
-     * Searches for pom files two levels deep (grandchild) from the input path.
-     *
-     * @param path Path of the node to search grandchild poms
-     * @return List of grandchild poms
-     */
-    public List<Node> searchGrandchildPoms(NodePath path) throws SQLException {
-        ResultSet resultSet = null;
-        List<Node> results = new ArrayList<>();
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM nodes " +
-                            "WHERE repo = ? AND node_path like ? " +
-                            "AND node_name like '%.pom' AND depth = ? AND node_type = 1",
-                    path.getRepo(), path.getPath() + "%", path.getDepth() + 2);
-            while (resultSet.next()) {
-                results.add(nodeFromResultSet(resultSet));
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        return results;
-    }
-
-    public List<Node> getOrphanNodes(NodePath path) throws SQLException {
-        ResultSet resultSet = null;
-        List<Node> results = new ArrayList<>();
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM nodes n1" +
-                            " WHERE n1.repo = ?" +
-                            " AND n1.node_path like ?" +
-                            " AND n1.node_name NOT IN" +
-                            " (SELECT n2.node_name FROM nodes n2, nodes n3" +
-                            " WHERE (n2.node_path like '%/%' AND n2.node_path like CONCAT('%/', n3.node_name))" +
-                            " OR (n2.node_path not like '%/%' AND n2.node_path like CONCAT('%', n3.node_name)))",
-                    path.getRepo(), emptyIfNullOrDot(path.getPath()) + "%");
-            while (resultSet.next()) {
-                results.add(nodeFromResultSet(resultSet));
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        return results;
-    }
-
-    public Set<RepoStorageSummary> getRepositoriesStorageSummary() throws SQLException {
-        ResultSet resultSet = null;
-        Set<RepoStorageSummary> results = Sets.newHashSet();
-        try {
-            resultSet = jdbcHelper.executeSelect(
-                    "SELECT repo, " +
-                            "SUM(CASE WHEN node_type = 0 THEN 1 ELSE 0 END) as folders, " +
-                            "SUM(CASE WHEN node_type = 1 THEN 1 ELSE 0 END) as files, " +
-                            "SUM(bin_length) " +
-                            "FROM nodes GROUP BY repo");
-            while (resultSet.next()) {
-                results.add(repoSummaryFromResultSet(resultSet));
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        return results;
-    }
-
-    private Node nodeFromResultSet(ResultSet resultSet) throws SQLException {
-        long nodeId = resultSet.getLong(1);
-        boolean isFile = resultSet.getBoolean(2);
-        String repoName = resultSet.getString(3);
-        String path = emptyIfNullOrDot(resultSet.getString(4));
-        String fileName = emptyIfNullOrDot(resultSet.getString(5));
-        short depth = resultSet.getShort(6);
-        long created = resultSet.getLong(7);
-        String createdBy = resultSet.getString(8);
-        long modified = resultSet.getLong(9);
-        String modifiedBy = resultSet.getString(10);
-        long updated = resultSet.getLong(11);
-        long length = resultSet.getLong(12);
-        String sha1Actual = resultSet.getString(13);
-        String sha1Original = resultSet.getString(14);
-        String md5Actual = resultSet.getString(15);
-        String md5Original = resultSet.getString(16);
-        Node node = new Node(nodeId, isFile, repoName, path, fileName, depth, created, createdBy,
-                modified, modifiedBy, updated, length, sha1Actual, sha1Original, md5Actual, md5Original);
-        return node;
-    }
-
-    private RepoStorageSummary repoSummaryFromResultSet(ResultSet rs) throws SQLException {
-        // don't count the repo folder itself -> folderCount - 1
-        return new RepoStorageSummary(rs.getString(1), rs.getLong(2) - 1, rs.getLong(3), rs.getLong(4));
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/dao/PropertiesDao.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/dao/PropertiesDao.java
deleted file mode 100644
index 593cda6..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/dao/PropertiesDao.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.dao;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.db.DbType;
-import org.artifactory.storage.db.fs.entity.NodeProperty;
-import org.artifactory.storage.db.util.BaseDao;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Repository;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.List;
-
-/**
- * A data access object for the properties table.
- *
- * @author Yossi Shaul
- */
- at Repository
-public class PropertiesDao extends BaseDao {
-    private static final Logger log = LoggerFactory.getLogger(PropertiesDao.class);
-    private static final int PROP_VALUE_MAX_SIZE = 4000;
-    private static final int PROP_VALUE_MSSQL_MAX_SIZE = 900; //limit in MSSQL the maximum length of properties value
-    // to 900 characters , since MSSQL cannot have index more than 900 characters
-
-    @Autowired
-    private DbService dbService;
-
-    @Autowired
-    public PropertiesDao(JdbcHelper jdbcHelper) {
-        super(jdbcHelper);
-    }
-
-    public boolean hasNodeProperties(long nodeId) throws SQLException {
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT COUNT(1) FROM node_props WHERE node_id = ?", nodeId);
-            if (resultSet.next()) {
-                int propsCount = resultSet.getInt(1);
-                return propsCount > 0;
-            }
-            return false;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public List<NodeProperty> getNodeProperties(long nodeId) throws SQLException {
-        ResultSet resultSet = null;
-        List<NodeProperty> results = Lists.newArrayList();
-        try {
-            // the child path must be the path+name of the parent
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM node_props WHERE node_id = ?", nodeId);
-            while (resultSet.next()) {
-                results.add(propertyFromResultSet(resultSet));
-            }
-            return results;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public int deleteNodeProperties(long nodeId) throws SQLException {
-        return jdbcHelper.executeUpdate("DELETE FROM node_props WHERE node_id = ?", nodeId);
-    }
-
-    public int create(NodeProperty property) throws SQLException {
-        String propValue = nullIfEmpty(property.getPropValue());
-        int maxPropValue = PROP_VALUE_MAX_SIZE;
-        if(dbService.getDatabaseType().equals(DbType.MSSQL)){
-            maxPropValue = PROP_VALUE_MSSQL_MAX_SIZE;
-        }
-        if (propValue != null && propValue.length() > maxPropValue) {
-            log.info("Trimming property value to {} characters '{}'", maxPropValue,property.getPropKey());
-            log.debug("Trimming property value to {} characters {}: {}", maxPropValue, property.getPropKey(), property.getPropValue());
-            propValue = StringUtils.substring(propValue, 0, maxPropValue);
-        }
-        return jdbcHelper.executeUpdate("INSERT INTO node_props VALUES(?, ?, ?, ?)",
-                property.getPropId(), property.getNodeId(), property.getPropKey(), propValue);
-    }
-
-    private NodeProperty propertyFromResultSet(ResultSet resultSet) throws SQLException {
-        long propId = resultSet.getLong(1);
-        long nodeId = resultSet.getLong(2);
-        String propKey = resultSet.getString(3);
-        String propValue = emptyIfNull(resultSet.getString(4));
-        return new NodeProperty(propId, nodeId, propKey, propValue);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/dao/StatsDao.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/dao/StatsDao.java
deleted file mode 100644
index 0f8fdb0..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/dao/StatsDao.java
+++ /dev/null
@@ -1,374 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.dao;
-
-import com.google.common.base.Strings;
-import org.artifactory.storage.db.fs.entity.Stat;
-import org.artifactory.storage.db.util.BaseDao;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Repository;
-
-import javax.annotation.Nullable;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-
-/**
- * A data access object for the stats table.
- *
- * @author Yossi Shaul
- */
- at Repository
-public class StatsDao extends BaseDao {
-    private static final Logger log = LoggerFactory.getLogger(StatsDao.class);
-
-    @Autowired
-    public StatsDao(JdbcHelper jdbcHelper) {
-        super(jdbcHelper);
-    }
-
-    /**
-     * Fetches all stats for specific nodeId
-     *
-     * @param nodeId - artifact identifier
-     * @param supportRemoteStats
-     *
-     * @return {@link Stat}
-     *
-     * @throws SQLException
-     */
-    @Nullable
-    public Stat getStats(long nodeId, boolean supportRemoteStats) throws SQLException {
-        Stat stat;
-
-        stat = getLocalStats(nodeId);
-        if (supportRemoteStats) {
-            stat = updateRemoteDownloadStats(nodeId, stat);
-        }
-
-        return stat;
-    }
-
-    /**
-     * Fetches local or remote stats for specific nodeId,
-     * (remote stats fetched by specific origin)
-     *
-     * @param nodeId - artifact identifier
-     * @param origin - host initiated download
-     * @param supportRemoteStats
-     *
-     * @return {@link Stat}
-     *
-     * @throws SQLException
-     */
-    @Nullable
-    public Stat getStats(long nodeId, String origin, boolean supportRemoteStats) throws SQLException {
-        ResultSet resultSet = null;
-        Stat stat = null;
-        try {
-            if(Strings.isNullOrEmpty(origin)) { // get local stats
-                return getLocalStats(nodeId);
-            } else if (supportRemoteStats) { // get remote stats
-                return getRemoteStats(nodeId, origin);
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        return stat;
-    }
-
-    /**
-     * update remote Download stats
-     * @param nodeId - node id
-     * @param localStats - stats
-     * @throws SQLException
-     */
-    private Stat updateRemoteDownloadStats(long nodeId, Stat localStats) throws SQLException {
-        Stat remoteStat = remoteStatsDownload(nodeId);
-        Stat mergedStat = merge(localStats, remoteStat);
-        if (localStats == null && mergedStat.getRemoteDownloadCount() == 0)
-            return localStats;
-        return mergedStat;
-    }
-
-    /**
-     * Merges local and remote stats
-     *
-     * @param localStats
-     * @param remoteStat
-     */
-    private Stat merge(Stat localStats, Stat remoteStat) {
-        if(localStats == null) {
-            return remoteStat;
-        }
-        if (remoteStat != null) {
-            localStats.setRemoteDownloadCount(remoteStat.getRemoteDownloadCount());
-            localStats.setRemoteLastDownloadedBy(remoteStat.getRemoteLastDownloadedBy());
-            localStats.setRemoteLastDownloaded(remoteStat.getRemoteLastDownloaded());
-            localStats.setOrigin(remoteStat.getOrigin());
-            localStats.setPath(remoteStat.getPath());
-        }
-        return localStats;
-    }
-
-    /**
-     * Fetches local stats for the given nodeId
-     *
-     * @param nodeId - node id
-
-     * @return {@link Stat}
-     *
-     * @throws SQLException
-     */
-    private Stat getLocalStats(long nodeId) throws SQLException {
-        ResultSet resultSet = null;
-        Stat stat = null;
-
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM stats WHERE node_id = ?", nodeId);
-            if (resultSet.next()) {
-                stat = statFromLocalResultSet(resultSet);
-
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        return stat;
-    }
-
-    /**
-     * Fetches remote stats for the given nodeId and origin
-     *
-     * @param nodeId - node id
-     * @param origin - host initiated download
-
-     * @return {@link Stat}
-     *
-     * @throws SQLException
-     */
-    private Stat getRemoteStats(long nodeId, String origin) throws SQLException {
-        ResultSet resultSet = null;
-        Stat stat = null;
-
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT download_count, last_downloaded, last_downloaded_by " +
-                    "FROM stats_remote WHERE node_id = ? and origin = ?", nodeId, origin);
-            if (resultSet.next()) {
-                stat = statFromRemoteResultSet(resultSet);
-            }else {
-                return null;
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        return stat;
-    }
-
-    /**
-     * Fetches remote part of the stats
-     *
-     * @param nodeId - node id
-     * @return {@link Stat}
-     *
-     * @throws SQLException
-     */
-    private Stat remoteStatsDownload(long nodeId) throws SQLException {
-        ResultSet resultSetCount = null;
-        ResultSet resultSet = null;
-        Stat stat = null;
-        try {
-            resultSetCount = jdbcHelper.executeSelect("SELECT SUM(download_count), MAX(last_downloaded) " +
-                    "FROM stats_remote WHERE node_id = ?", nodeId);
-            if (resultSetCount.next()) {
-                stat = remoteStatDownloadResultSet(resultSetCount);
-                resultSet = jdbcHelper.executeSelect("SELECT last_downloaded_by, origin, path FROM stats_remote WHERE node_id = ?" +
-                        " and last_downloaded = ?", nodeId,stat.getRemoteLastDownloaded());
-                if (resultSet.next()) {
-                    stat.setRemoteLastDownloadedBy(resultSet.getString(1));
-                    stat.setOrigin(resultSet.getString(2));
-                    stat.setPath(resultSet.getString(3));
-                }
-            }else {
-                return null;
-            }
-        } finally {
-            DbUtils.close(resultSetCount);
-            DbUtils.close(resultSet);
-        }
-        return stat;
-    }
-
-    /**
-     * check if this node had data from this specific origin (on remote_stats),
-     * this check require to determine if an update or create is require
-     * @param nodeId - node id
-     * @param origin - origin address
-     * @return - remote statistic
-     * @throws SQLException
-     */
-    @Nullable
-    private boolean isOriginExistForThisNodeId(long nodeId, String origin) throws SQLException {
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM stats_remote WHERE node_id = ? and origin = ?" , nodeId,origin);
-            if (resultSet.next()) {
-                return true;
-            }else{
-                return false;
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    /**
-     * insert new remote stats if not exist
-     * @param stats - stats to insert
-     * @return - insert action status
-     * @throws SQLException
-     */
-    private int createRemoteStats(Stat stats) throws SQLException {
-        log.debug("Creating stats {}", stats);
-        return jdbcHelper.executeUpdate("INSERT INTO stats_remote VALUES (?,?,?,?,?,?)", stats.getNodeId(),stats.getOrigin(),
-                stats.getRemoteDownloadCount(), stats.getRemoteLastDownloaded(), stats.getRemoteLastDownloadedBy(), stats.getPath()
-        );
-    }
-
-    /**
-     * delete remote stats
-     * @param nodeId - node id
-     * @return - delete action status
-     * @throws SQLException
-     */
-    private int deleteRemoteStats(long nodeId) throws SQLException {
-        log.debug("Deleting stats of node {}", nodeId);
-        return jdbcHelper.executeUpdate("DELETE FROM stats_remote WHERE node_id = ?", nodeId);
-    }
-
-    /**
-     * update remote stats
-     * @param stats - stats to delete
-     * @return - update action status
-     * @throws SQLException
-     */
-    private int updateRemoteStats(Stat stats) throws SQLException {
-        log.debug("Updating stats {}", stats);
-        return jdbcHelper.executeUpdate("UPDATE stats_remote SET " +
-                        "download_count = ?, last_downloaded = ?, last_downloaded_by = ?, path = ? " +
-                        "WHERE node_id = ? and origin = ?",
-                stats.getRemoteDownloadCount(), stats.getRemoteLastDownloaded(), stats.getRemoteLastDownloadedBy(),
-                stats.getPath(), stats.getNodeId(),stats.getOrigin()
-        );
-    }
-
-    /**
-     * Updates stats in DB
-     *
-     * @param stats {@link Stat} to write to DB
-     * @param supportRemoteStats is SmartRepo feature on
-     *
-     * @return -1 : failure, 0 : nothing changed, 1 : success
-     * @throws SQLException
-     */
-    public int updateStats(Stat stats, boolean supportRemoteStats) throws SQLException {
-        log.debug("Updating stats {}", stats);
-        if (!stats.isRemote()) { // update local stats
-            return jdbcHelper.executeUpdate("UPDATE stats SET " +
-                            "download_count = ?, last_downloaded = ?, last_downloaded_by = ? WHERE node_id = ?",
-                    stats.getLocalDownloadCount(), stats.getLocalLastDownloaded(), stats.getLocalLastDownloadedBy(),
-                    stats.getNodeId()
-            );
-        } else if (supportRemoteStats) { // create or update remote stats data
-            return createUpdateRemoteStatData(stats);
-        }
-        return 0;
-    }
-
-    /**
-     * create or update remote stats data
-     * @param stats - stats
-     * @return - update or create status
-     * @throws SQLException
-     */
-    private int createUpdateRemoteStatData(Stat stats) throws SQLException {
-        boolean isOriginExistForThisNodeId = isOriginExistForThisNodeId(stats.getNodeId(), stats.getOrigin());
-        if (!isOriginExistForThisNodeId) {
-            return createRemoteStats(stats);
-        }
-        else{
-            return updateRemoteStats(stats);
-        }
-    }
-
-    public int createStats(Stat stats, boolean supportRepoStats) throws SQLException {
-        log.debug("Creating stats {}", stats);
-
-        if (stats.isRemote()) {
-            if (supportRepoStats && !isOriginExistForThisNodeId(stats.getNodeId(), stats.getOrigin())) {
-                return createRemoteStats(stats);
-            }
-        } else {
-            return jdbcHelper.executeUpdate("INSERT INTO stats VALUES (?, ?, ?, ?)", stats.getNodeId(),
-                    stats.getLocalDownloadCount(), stats.getLocalLastDownloaded(), stats.getLocalLastDownloadedBy()
-            );
-        }
-        return 0; // no change
-    }
-
-    public int deleteStats(long nodeId, boolean supportRemoteStats) throws SQLException {
-        log.debug("Deleting stats of node {}", nodeId);
-        int remoteStatsDeleted = 0;
-        int localStatsDeleted = jdbcHelper.executeUpdate("DELETE FROM stats WHERE node_id = ?", nodeId);
-        if (supportRemoteStats) {
-            remoteStatsDeleted = deleteRemoteStats(nodeId);
-        }
-        return localStatsDeleted+remoteStatsDeleted;
-    }
-
-    public boolean hasStats(long nodeId) throws SQLException {
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT COUNT(1) FROM stats WHERE node_id = ?", nodeId);
-            if (resultSet.next()) {
-                int propsCount = resultSet.getInt(1);
-                return propsCount > 0;
-            }
-            return false;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    private Stat statFromLocalResultSet(ResultSet rs) throws SQLException {
-        return new Stat(rs.getLong(1), rs.getLong(2), rs.getLong(3),
-                rs.getString(4), 0, 0, null
-        );
-    }
-
-    private Stat remoteStatDownloadResultSet(ResultSet rs) throws SQLException {
-        return new Stat(0,0,0,null,rs.getLong(1),rs.getLong(2), null, null, null);
-    }
-
-    private Stat statFromRemoteResultSet(ResultSet rs) throws SQLException {
-        return new Stat(0,0,0,null,rs.getLong(1),rs.getLong(2), rs.getString(3), null, null);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/dao/TasksDao.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/dao/TasksDao.java
deleted file mode 100644
index 85fe8f9..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/dao/TasksDao.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.dao;
-
-import com.google.common.collect.Sets;
-import org.artifactory.storage.db.fs.entity.TaskRecord;
-import org.artifactory.storage.db.util.BaseDao;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Repository;
-
-import javax.annotation.Nonnull;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Set;
-
-/**
- * A data access table for the tasks table.
- *
- * @author Yossi Shaul
- */
- at Repository
-public class TasksDao extends BaseDao {
-
-    @Autowired
-    public TasksDao(JdbcHelper jdbcHelper) {
-        super(jdbcHelper);
-    }
-
-    @Nonnull
-    public Set<TaskRecord> load(String taskType) throws SQLException {
-        ResultSet resultSet = null;
-        Set<TaskRecord> entries = Sets.newLinkedHashSet();
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM tasks WHERE task_type = ?", taskType);
-            while (resultSet.next()) {
-                entries.add(taskFromResultSet(resultSet));
-            }
-            return entries;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public boolean exist(String taskType, String taskContext) throws SQLException {
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT COUNT(*) FROM tasks WHERE " +
-                    "task_type = ? AND task_context = ?", taskType, taskContext);
-            int count = 0;
-            if (resultSet.next()) {
-                count = resultSet.getInt(1);
-            }
-            return count > 0;
-
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public void create(String taskType, String taskContext) throws SQLException {
-        jdbcHelper.executeUpdate("INSERT INTO tasks VALUES(?, ?)", taskType, taskContext);
-    }
-
-    public boolean delete(String taskType, String taskContext) throws SQLException {
-        return jdbcHelper.executeUpdate("DELETE FROM tasks WHERE task_type = ? AND task_context = ?",
-                taskType, taskContext) > 0;
-    }
-
-    private TaskRecord taskFromResultSet(ResultSet rs) throws SQLException {
-        return new TaskRecord(rs.getString(1), rs.getString(2));
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/dao/WatchesDao.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/dao/WatchesDao.java
deleted file mode 100644
index 24c9c69..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/dao/WatchesDao.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.dao;
-
-import com.google.common.collect.Lists;
-import org.artifactory.storage.db.fs.entity.Watch;
-import org.artifactory.storage.db.util.BaseDao;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Repository;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.List;
-
-/**
- * A data access object for the watches table.
- *
- * @author Yossi Shaul
- */
- at Repository
-public class WatchesDao extends BaseDao {
-
-    @Autowired
-    public WatchesDao(JdbcHelper jdbcHelper) {
-        super(jdbcHelper);
-    }
-
-    public int create(Watch watch) throws SQLException {
-        return jdbcHelper.executeUpdate("INSERT INTO watches VALUES(?, ?, ?, ?)",
-                watch.getWatchId(), watch.getNodeId(), watch.getUsername(), watch.getSince());
-    }
-
-    public boolean hasWatches(long nodeId) throws SQLException {
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT COUNT(1) FROM watches WHERE node_id = ?", nodeId);
-            if (resultSet.next()) {
-                int propsCount = resultSet.getInt(1);
-                return propsCount > 0;
-            }
-            return false;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public List<Watch> getWatches(long nodeId) throws SQLException {
-        ResultSet resultSet = null;
-        List<Watch> results = Lists.newArrayList();
-        try {
-            // the child path must be the path+name of the parent
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM watches WHERE node_id = ?", nodeId);
-            while (resultSet.next()) {
-                results.add(watchFromResultSet(resultSet));
-            }
-            return results;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public List<Watch> getWatches() throws SQLException {
-        ResultSet resultSet = null;
-        List<Watch> results = Lists.newArrayList();
-        try {
-            // the child path must be the path+name of the parent
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM watches");
-            while (resultSet.next()) {
-                results.add(watchFromResultSet(resultSet));
-            }
-            return results;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public int deleteWatches(long nodeId) throws SQLException {
-        return jdbcHelper.executeUpdate("DELETE FROM watches WHERE node_id = ?", nodeId);
-    }
-
-    public int deleteUserWatches(long nodeId, String username) throws SQLException {
-        return jdbcHelper.executeUpdate("DELETE FROM watches WHERE node_id = ? and username = ?",
-                nodeId, username);
-    }
-
-    public int deleteAllUserWatches(String username) throws SQLException {
-        return jdbcHelper.executeUpdate("DELETE FROM watches WHERE username = ?", username);
-    }
-
-    private Watch watchFromResultSet(ResultSet resultSet) throws SQLException {
-        long watchId = resultSet.getLong(1);
-        long nodeId = resultSet.getLong(2);
-        String username = resultSet.getString(3);
-        long since = resultSet.getLong(4);
-        return new Watch(watchId, nodeId, username, since);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/ArchiveEntry.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/ArchiveEntry.java
deleted file mode 100644
index 5f1cc17..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/ArchiveEntry.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.entity;
-
-import org.apache.commons.lang.StringUtils;
-
-/**
- * Represents a resolved archive entry (the result of a join).
- *
- * @author Yossi Shaul
- */
-public class ArchiveEntry {
-
-    /**
-     * The sha1 checksum of the archive containing this entry.
-     */
-    private final String archiveSha1;
-
-    /**
-     * The path of the entry (excluding the name). Can be empty string if the entry is under the root path.
-     */
-    private final String entryPath;
-
-    /**
-     * The name of the entry.
-     */
-    private final String entryName;
-
-    public ArchiveEntry(String archiveSha1, String entryPath, String entryName) {
-        if (StringUtils.isBlank(archiveSha1)) {
-            throw new IllegalArgumentException("Archive sha1 cannot be empty");
-        }
-
-        if (StringUtils.isBlank(entryName)) {
-            throw new IllegalArgumentException("Entry name cannot be empty");
-        }
-
-        this.archiveSha1 = archiveSha1;
-        this.entryPath = StringUtils.trimToEmpty(entryPath);
-        this.entryName = entryName;
-    }
-
-    public String getArchiveSha1() {
-        return archiveSha1;
-    }
-
-    public String getEntryPath() {
-        return entryPath;
-    }
-
-    public String getEntryName() {
-        return entryName;
-    }
-
-    /**
-     * Returns the path of this entry including the name (path/name)
-     * <p><pre>
-     * path = "path", name = "name" returns "path/name"
-     * path = "", name = "name" returns "name"
-     * path = "", name = "" returns ""
-     * </pre>
-     *
-     * @return Returns the path of the entry including the name (path/name)
-     */
-    public String getPathName() {
-        if (StringUtils.isBlank(entryPath)) {
-            return entryName;
-        } else {
-            return entryPath + "/" + entryName;
-        }
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        ArchiveEntry that = (ArchiveEntry) o;
-
-        if (!archiveSha1.equals(that.archiveSha1)) {
-            return false;
-        }
-        if (!entryName.equals(that.entryName)) {
-            return false;
-        }
-        if (!entryPath.equals(that.entryPath)) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = archiveSha1.hashCode();
-        result = 31 * result + entryPath.hashCode();
-        result = 31 * result + entryName.hashCode();
-        return result;
-    }
-
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/Node.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/Node.java
deleted file mode 100644
index 8b0bb30..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/Node.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.entity;
-
-/**
- * Represents a node in the nodes table.
- *
- * @author Yossi Shaul
- */
-public class Node {
-
-    private final long nodeId;
-    private final boolean file;
-    private final String repo;
-    private final String path;
-    private final String name;
-    private final short depth;
-    private final long created;
-    private final String createdBy;
-    private final long modified;
-    private final String modifiedBy;
-    private final long updated;
-
-    // file only attributes
-    private final long length;
-    private final String sha1Actual;
-    private final String sha1Original;
-    private final String md5Actual;
-    private final String md5Original;
-
-    public Node(long nodeId, boolean file, String repo, String path, String name, short depth,
-            long created, String createdBy, long modified, String modifiedBy, long updated,
-            long length, String sha1Actual, String sha1Original, String md5Actual, String md5Original) {
-        this.nodeId = nodeId;
-        this.file = file;
-        this.repo = repo;
-        this.path = path;
-        this.name = name;
-        this.depth = depth;
-        this.created = created;
-        this.createdBy = createdBy;
-        this.modified = modified;
-        this.modifiedBy = modifiedBy;
-        this.updated = updated;
-        this.length = length;
-        this.sha1Actual = sha1Actual;
-        this.sha1Original = sha1Original;
-        this.md5Actual = md5Actual;
-        this.md5Original = md5Original;
-    }
-
-    public long getNodeId() {
-        return nodeId;
-    }
-
-    public boolean isFile() {
-        return file;
-    }
-
-    public String getRepo() {
-        return repo;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public short getDepth() {
-        return depth;
-    }
-
-    public long getCreated() {
-        return created;
-    }
-
-    public String getCreatedBy() {
-        return createdBy;
-    }
-
-    public long getModified() {
-        return modified;
-    }
-
-    public String getModifiedBy() {
-        return modifiedBy;
-    }
-
-    public long getUpdated() {
-        return updated;
-    }
-
-    public long getLength() {
-        return length;
-    }
-
-    public String getSha1Actual() {
-        return sha1Actual;
-    }
-
-    public String getSha1Original() {
-        return sha1Original;
-    }
-
-    public String getMd5Actual() {
-        return md5Actual;
-    }
-
-    public String getMd5Original() {
-        return md5Original;
-    }
-
-    public NodePath getNodePath() {
-        return new NodePath(repo, path, name, file);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        Node node = (Node) o;
-
-        if (!name.equals(node.name)) {
-            return false;
-        }
-        if (!path.equals(node.path)) {
-            return false;
-        }
-        if (!repo.equals(node.repo)) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = repo.hashCode();
-        result = 31 * result + path.hashCode();
-        result = 31 * result + name.hashCode();
-        return result;
-    }
-
-    @Override
-    public String toString() {
-        final StringBuilder sb = new StringBuilder();
-        sb.append("Node");
-        sb.append("{nodeId=").append(nodeId);
-        sb.append(", file=").append(file);
-        sb.append(", repo='").append(repo).append('\'');
-        sb.append(", path='").append(path).append('\'');
-        sb.append(", name='").append(name).append('\'');
-        sb.append('}');
-        return sb.toString();
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/NodeBuilder.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/NodeBuilder.java
deleted file mode 100644
index 7df08b5..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/NodeBuilder.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.entity;
-
-import org.artifactory.api.util.Builder;
-import org.artifactory.repo.RepoPath;
-
-import java.util.Date;
-
-/**
- * Builder for {@link org.artifactory.storage.db.fs.entity.Node}.
- *
- * @author Yossi Shaul
- */
-public class NodeBuilder implements Builder<Node> {
-
-    private long nodeId;
-    private boolean file;
-    private String repo;
-    private String path;
-    private String name;
-    private long created;
-    private String createdBy;
-    private long modified;
-    private String modifiedBy;
-    private long updated;
-
-    private NodePath nodePath;
-
-    // file only attributes
-    private long length;
-    private String sha1Actual;
-    private String sha1Original;
-    private String md5Actual;
-    private String md5Original;
-
-    public NodeBuilder() {
-        created = modified = updated = System.currentTimeMillis();
-    }
-
-    @Override
-    public Node build() {
-        if (nodeId <= 0) {
-            throw new IllegalArgumentException("nodeId = " + nodeId);
-        }
-
-        // only build if node path is not set
-        if (nodePath == null) {
-            // node path will validate and normalize the paths
-            nodePath = new NodePath(repo, path, name, file);
-        }
-
-        return new Node(nodeId, file, nodePath.getRepo(), nodePath.getPath(), nodePath.getName(), nodePath.getDepth(),
-                created, createdBy, modified, modifiedBy, updated, length, sha1Actual, sha1Original, md5Actual,
-                md5Original);
-    }
-
-    public NodeBuilder nodeId(long nodeId) {
-        this.nodeId = nodeId;
-        return this;
-    }
-
-    public NodeBuilder file(boolean file) {
-        this.file = file;
-        return this;
-    }
-
-    public NodeBuilder length(long length) {
-        this.length = length;
-        return this;
-    }
-
-    public NodeBuilder repo(String repoName) {
-        this.repo = repoName;
-        return this;
-    }
-
-    public NodeBuilder path(String path) {
-        this.path = path;
-        return this;
-    }
-
-    public NodeBuilder name(String fileName) {
-        this.name = fileName;
-        return this;
-    }
-
-    public NodeBuilder created(long created) {
-        this.created = created;
-        return this;
-    }
-
-    public NodeBuilder created(Date created) {
-        this.created = created.getTime();
-        return this;
-    }
-
-    public NodeBuilder createdBy(String createdBy) {
-        this.createdBy = createdBy;
-        return this;
-    }
-
-    public NodeBuilder modified(long modified) {
-        this.modified = modified;
-        return this;
-    }
-
-    public NodeBuilder modified(Date modified) {
-        this.modified = modified.getTime();
-        return this;
-    }
-
-    public NodeBuilder modifiedBy(String modifiedBy) {
-        this.modifiedBy = modifiedBy;
-        return this;
-    }
-
-    public NodeBuilder updated(long updated) {
-        this.updated = updated;
-        return this;
-    }
-
-    public NodeBuilder updated(Date updated) {
-        this.updated = updated.getTime();
-        return this;
-    }
-
-    public NodeBuilder sha1Actual(String sha1Actual) {
-        this.sha1Actual = sha1Actual;
-        return this;
-    }
-
-    public NodeBuilder sha1Original(String sha1Original) {
-        this.sha1Original = sha1Original;
-        return this;
-    }
-
-    public NodeBuilder md5Actual(String md5Actual) {
-        this.md5Actual = md5Actual;
-        return this;
-    }
-
-    public NodeBuilder md5Original(String md5Original) {
-        this.md5Original = md5Original;
-        return this;
-    }
-
-    /**
-     * Set the repo, path and name from the input repo path. Throws exception if the repo path is a root repo path.
-     * Needn't call other path methods if calling this one.
-     *
-     * @param repoPath The repo path. Shouldn't be a root repo path.
-     */
-    public NodeBuilder nodePath(RepoPath repoPath) {
-        nodePath = NodePath.fromRepoPath(repoPath);
-        return this;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/NodeMetaInfo.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/NodeMetaInfo.java
deleted file mode 100644
index 4ed2104..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/NodeMetaInfo.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.entity;
-
-/**
- * Represents a metadata information on a node.
- *
- * @author Yossi Shaul
- */
-public class NodeMetaInfo {
-
-    // node id
-    private final long nodeId;
-    // last modification date (millis)
-    private final long propsModified;
-    // username of the user last modified the properties
-    private final String propsModifiedBy;
-
-    public NodeMetaInfo(long nodeId, long propsModified, String propsModifiedBy) {
-        this.nodeId = nodeId;
-        this.propsModified = propsModified;
-        this.propsModifiedBy = propsModifiedBy;
-    }
-
-    public long getNodeId() {
-        return nodeId;
-    }
-
-    public long getPropsModified() {
-        return propsModified;
-    }
-
-    public String getPropsModifiedBy() {
-        return propsModifiedBy;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        NodeMetaInfo that = (NodeMetaInfo) o;
-
-        if (nodeId != that.nodeId) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return (int) (nodeId ^ (nodeId >>> 32));
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/NodePath.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/NodePath.java
deleted file mode 100644
index de4c64b..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/NodePath.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.entity;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.storage.db.fs.util.NodeUtils;
-import org.artifactory.util.PathUtils;
-
-import java.io.Serializable;
-
-/**
- * Represents a unique path of a node. The unique path is composed of (repo, path, name).
- * <p/>
- * The repo can never be empty while path and name might be. Name is empty only if the node path represents repo root
- * path.
- *
- * @author Yossi Shaul
- */
-public class NodePath implements Serializable {
-    private final String repo;
-    private final String path;
-    private final String name;
-    private final boolean file;
-
-    public NodePath(String repo, String path, String name, boolean file) {
-        if (StringUtils.isBlank(repo)) {
-            throw new IllegalArgumentException("repo cannot be empty");
-        }
-
-        if (StringUtils.isBlank(name) && StringUtils.isNotBlank(path)) {
-            throw new IllegalArgumentException("name can only be empty for root repo path");
-        }
-
-        this.repo = repo;
-        this.path = PathUtils.trimSlashes(StringUtils.trimToEmpty(path)).toString();
-        this.name = StringUtils.trimToEmpty(name);
-        this.file = file;
-    }
-
-    public String getRepo() {
-        return repo;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public boolean isFile() {
-        return file;
-    }
-
-    public boolean isFolder() {
-        return !file;
-    }
-
-    /**
-     * @return The depth of this node path. Repository root path has a depth of 0.
-     */
-    public short getDepth() {
-        int depth = isRoot() ? 0 : NodeUtils.getDepth(path) + 1;   // the +1 is for the name
-        if (depth > Short.MAX_VALUE) {
-            throw new IllegalArgumentException("Depth cannot be bigger than " + Short.MAX_VALUE);
-        }
-        return (short) depth;
-    }
-
-    /**
-     * Returns relative path to the node (the path + name)
-     * <p><pre>
-     * path = "path", name = "name" returns "path/name"
-     * path = "", name = "name" returns "name"
-     * path = "", name = "" returns ""
-     * </pre>
-     *
-     * @return Returns relative path to the node (the path + name)
-     */
-    public String getPathName() {
-        if (StringUtils.isBlank(path)) {
-            return name;
-        } else {
-            return path + "/" + name;
-        }
-    }
-
-    /**
-     * @return True if this path represents a repository roo path (ie, path and name are empty, depth is 0)
-     */
-    public boolean isRoot() {
-        return StringUtils.isBlank(path) && StringUtils.isBlank(name);
-    }
-
-
-    public RepoPath toRepoPath() {
-        String pathAndName = StringUtils.isBlank(path) ? name : path + "/" + name;
-        return new RepoPathImpl(repo, pathAndName, isFolder());
-    }
-
-    public static NodePath fromRepoPath(RepoPath repoPath) {
-        String path = PathUtils.getParent(repoPath.getPath());
-        String name = repoPath.getName();
-        return new NodePath(repoPath.getRepoKey(), path, name, repoPath.isFile());
-    }
-
-    @Override
-    public String toString() {
-        return repo + ":" + path + "/" + name;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        NodePath nodePath = (NodePath) o;
-
-        if (!name.equals(nodePath.name)) {
-            return false;
-        }
-        if (!path.equals(nodePath.path)) {
-            return false;
-        }
-        if (!repo.equals(nodePath.repo)) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = repo.hashCode();
-        result = 31 * result + path.hashCode();
-        result = 31 * result + name.hashCode();
-        return result;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/NodeProperty.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/NodeProperty.java
deleted file mode 100644
index cb5acd7..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/NodeProperty.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.entity;
-
-/**
- * Represents a property in the properties table.
- *
- * @author Yossi Shaul
- */
-public class NodeProperty {
-    private final long propId;
-    private final long nodeId;
-    private final String propKey;
-    private final String propValue;
-
-    public NodeProperty(long propId, long nodeId, String propKey, String propValue) {
-        this.propId = propId;
-        this.nodeId = nodeId;
-        this.propKey = propKey;
-        this.propValue = propValue;
-    }
-
-    public long getPropId() {
-        return propId;
-    }
-
-    public long getNodeId() {
-        return nodeId;
-    }
-
-    public String getPropKey() {
-        return propKey;
-    }
-
-    public String getPropValue() {
-        return propValue;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/Stat.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/Stat.java
deleted file mode 100644
index 8e76b23..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/Stat.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.entity;
-
-import com.google.common.base.Strings;
-
-/**
- * Represents a record in the stats table.
- *
- * @author Yossi Shaul
- */
-public class Stat {
-    private final long nodeId;
-
-    private final long downloadCount;
-    private final long lastDownloaded;
-    private final String lastDownloadedBy;
-
-    private  long remoteDownloadCount;
-    private  long remoteLastDownloaded;
-    private  String remoteLastDownloadedBy;
-
-    private String origin;
-    private String path;
-
-    public Stat(long nodeId, long downloadCount, long lastDownloaded, String lastDownloadedBy) {
-        this.nodeId = nodeId;
-
-        this.downloadCount = downloadCount;
-        this.lastDownloadedBy = lastDownloadedBy;
-        this.lastDownloaded = lastDownloaded;
-
-        this.remoteDownloadCount = 0;
-        this.remoteLastDownloaded = 0;
-        this.remoteLastDownloadedBy = null;
-
-        this.origin = null;
-        this.path = path;
-    }
-
-    public Stat(long nodeId, long downloadCount, long lastDownloaded, String lastDownloadedBy, long remoteDownloadCount,
-            long remoteLastDownloaded, String remoteLastDownloadedBy) {
-        this.nodeId = nodeId;
-        this.downloadCount = downloadCount;
-        this.lastDownloaded = lastDownloaded;
-        this.lastDownloadedBy = lastDownloadedBy;
-        this.remoteDownloadCount = remoteDownloadCount;
-        this.remoteLastDownloaded = remoteLastDownloaded;
-        this.remoteLastDownloadedBy = remoteLastDownloadedBy;
-
-        this.origin = null;
-        this.path = null;
-    }
-    public Stat(long nodeId, long downloadCount, long lastDownloaded, String lastDownloadedBy, long remoteDownloadCount,
-            long remoteLastDownloaded, String remoteLastDownloadedBy, String origin, String path) {
-        this.nodeId = nodeId;
-        this.downloadCount = downloadCount;
-        this.lastDownloaded = lastDownloaded;
-        this.lastDownloadedBy = lastDownloadedBy;
-        this.remoteDownloadCount = remoteDownloadCount;
-        this.remoteLastDownloaded = remoteLastDownloaded;
-        this.remoteLastDownloadedBy = remoteLastDownloadedBy;
-
-        this.origin = origin;
-        this.path = path;
-    }
-
-    public long getNodeId() {
-        return nodeId;
-    }
-
-    public long getLocalDownloadCount() {
-        return downloadCount;
-    }
-
-    public String getLocalLastDownloadedBy() {
-        return lastDownloadedBy;
-    }
-
-    public long getLocalLastDownloaded() {
-        return lastDownloaded;
-    }
-
-    public boolean isRemote() {
-        return !Strings.isNullOrEmpty(origin);
-    }
-
-    public long getRemoteDownloadCount() {
-        return remoteDownloadCount;
-    }
-
-    public long getRemoteLastDownloaded() {
-        return remoteLastDownloaded;
-    }
-
-    public String getRemoteLastDownloadedBy() {
-        return remoteLastDownloadedBy;
-    }
-
-    public String getOrigin() {
-        return origin;
-    }
-
-    public void setRemoteDownloadCount(long remoteDownloadCount) {
-        this.remoteDownloadCount = remoteDownloadCount;
-    }
-
-    public void setRemoteLastDownloaded(long remoteLastDownloaded) {
-        this.remoteLastDownloaded = remoteLastDownloaded;
-    }
-
-    public void setRemoteLastDownloadedBy(String remoteLastDownloadedBy) {
-        this.remoteLastDownloadedBy = remoteLastDownloadedBy;
-    }
-
-    public void setOrigin(String origin) {
-        this.origin = origin;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb =  new StringBuilder();
-        sb.append("{");
-
-        sb.append("downloadCount: ");
-        sb.append(downloadCount);
-
-        sb.append(", lastDownloaded: ");
-        sb.append(lastDownloaded);
-
-        sb.append(", lastDownloadedBy: ");
-        sb.append(lastDownloadedBy);
-
-        sb.append(", remoteDownloadCount: ");
-        sb.append(remoteDownloadCount);
-
-        sb.append(", remoteLastDownloaded: ");
-        sb.append(remoteLastDownloaded);
-
-        sb.append(", remoteLastDownloadedBy: ");
-        sb.append(remoteLastDownloadedBy);
-
-        sb.append(", path: ");
-        sb.append(path);
-
-        sb.append("}");
-
-        return sb.toString();
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/TaskRecord.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/TaskRecord.java
deleted file mode 100644
index 4bd4915..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/TaskRecord.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.entity;
-
-import org.apache.commons.lang.StringUtils;
-
-import javax.annotation.Nonnull;
-
-/**
- * Represents a record in the tasks table.
- *
- * @author Yossi Shaul
- */
-public class TaskRecord {
-
-    private final String taskType;
-    private final String taskContext;
-
-    public TaskRecord(String taskType, String taskContext) {
-        if (StringUtils.isBlank(taskType)) {
-            throw new IllegalArgumentException("Task type cannot be empty");
-        }
-        this.taskType = taskType;
-        this.taskContext = StringUtils.trimToEmpty(taskContext);
-    }
-
-    @Nonnull
-    public String getTaskType() {
-        return taskType;
-    }
-
-    @Nonnull
-    public String getTaskContext() {
-        return taskContext;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/Watch.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/Watch.java
deleted file mode 100644
index 26e4900..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/entity/Watch.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.entity;
-
-/**
- * Represents a record in the watches table.
- *
- * @author Yossi Shaul
- */
-public class Watch {
-
-    private final long watchId;
-    private final long nodeId;
-    private final String username;
-    private final long since;
-
-    public Watch(long watchId, long nodeId, String username, long since) {
-        this.watchId = watchId;
-        this.nodeId = nodeId;
-        this.username = username;
-        this.since = since;
-    }
-
-    public long getWatchId() {
-        return watchId;
-    }
-
-    public long getNodeId() {
-        return nodeId;
-    }
-
-    public String getUsername() {
-        return username;
-    }
-
-    public long getSince() {
-        return since;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbFileProvider.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbFileProvider.java
deleted file mode 100644
index 6ce9689..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbFileProvider.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.model;
-
-import org.artifactory.api.repo.exception.FileExpectedException;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.MutableFileInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.fs.MutableVfsFile;
-import org.artifactory.sapi.fs.MutableVfsItem;
-import org.artifactory.sapi.fs.VfsFile;
-import org.artifactory.sapi.fs.VfsItem;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.fs.VfsFileProvider;
-import org.artifactory.storage.fs.lock.FsItemsVault;
-import org.artifactory.storage.fs.lock.LockingHelper;
-import org.artifactory.storage.fs.repo.StoringRepo;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
-/**
- * Provider of VFS files.
- *
- * @author Yossi Shaul
- */
-public class DbFileProvider extends DbFsItemProvider implements VfsFileProvider {
-
-    public DbFileProvider(StoringRepo storingRepo, RepoPath repoPath, FsItemsVault vault) {
-        super(storingRepo, repoPath, vault);
-    }
-
-    @Override
-    @Nullable
-    public VfsFile getImmutableFile() {
-        VfsItem immutableFsItem = super.getImmutableFsItem();
-        if (immutableFsItem != null && !immutableFsItem.isFile()) {
-            throw new FileExpectedException(getRepoPath());
-        }
-        return (VfsFile) immutableFsItem;
-    }
-
-    @Override
-    @Nullable
-    public MutableVfsFile getMutableFile() {
-        MutableVfsItem mutableFsItem = super.getMutableFsItem();
-        if (mutableFsItem != null && !mutableFsItem.isFile()) {
-            LockingHelper.removeLockEntry(getRepoPath());
-            throw new FileExpectedException(getRepoPath());
-        }
-        return (MutableVfsFile) mutableFsItem;
-    }
-
-    @Override
-    @Nonnull
-    public MutableVfsFile getOrCreMutableFile() {
-        MutableVfsItem mutableFsItem = super.getOrCreateMutableFsItem();
-        if (!mutableFsItem.isFile()) {
-            LockingHelper.removeLockEntry(getRepoPath());
-            throw new FileExpectedException(getRepoPath());
-        }
-        return (MutableVfsFile) mutableFsItem;
-    }
-
-    @Override
-    protected MutableVfsFile createNewMutableItem(StoringRepo storingRepo, RepoPath repoPath) {
-        MutableFileInfo fileInfo = InfoFactoryHolder.get().createFileInfo(repoPath);
-        return new DbMutableFile(storingRepo, DbService.NO_DB_ID, fileInfo);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbFolderProvider.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbFolderProvider.java
deleted file mode 100644
index 55cd25a..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbFolderProvider.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.model;
-
-import org.artifactory.api.repo.exception.FolderExpectedException;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.MutableFolderInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.fs.MutableVfsFolder;
-import org.artifactory.sapi.fs.MutableVfsItem;
-import org.artifactory.sapi.fs.VfsFolder;
-import org.artifactory.sapi.fs.VfsItem;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.fs.VfsFolderProvider;
-import org.artifactory.storage.fs.lock.FsItemsVault;
-import org.artifactory.storage.fs.lock.LockingHelper;
-import org.artifactory.storage.fs.repo.StoringRepo;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
-/**
- * Provider of VFS files.
- *
- * @author Yossi Shaul
- */
-public class DbFolderProvider extends DbFsItemProvider implements VfsFolderProvider {
-
-    public DbFolderProvider(StoringRepo storingRepo, RepoPath repoPath, FsItemsVault vault) {
-        super(storingRepo, repoPath, vault);
-    }
-
-    @Override
-    @Nullable
-    public VfsFolder getImmutableFolder() {
-        VfsItem immutableFsItem = super.getImmutableFsItem();
-        if (immutableFsItem != null && !immutableFsItem.isFolder()) {
-            throw new FolderExpectedException(getRepoPath());
-        }
-        return (VfsFolder) immutableFsItem;
-    }
-
-    @Override
-    @Nullable
-    public MutableVfsFolder getMutableFolder() {
-        VfsItem mutableFsItem = super.getMutableFsItem();
-        if (mutableFsItem != null && !mutableFsItem.isFolder()) {
-            LockingHelper.removeLockEntry(getRepoPath());
-            throw new FolderExpectedException(getRepoPath());
-        }
-        return (MutableVfsFolder) mutableFsItem;
-    }
-
-    @Override
-    @Nonnull
-    public MutableVfsFolder getOrCreMutableFolder() {
-        MutableVfsItem mutableFsItem = super.getOrCreateMutableFsItem();
-        if (mutableFsItem.isFile()) {
-            LockingHelper.removeLockEntry(getRepoPath());
-            throw new FolderExpectedException(getRepoPath());
-        }
-        return (MutableVfsFolder) mutableFsItem;
-    }
-
-    @Override
-    protected MutableVfsFolder createNewMutableItem(StoringRepo storingRepo, RepoPath repoPath) {
-        MutableFolderInfo folderInfo = InfoFactoryHolder.get().createFolderInfo(repoPath);
-        return new DbMutableFolder(storingRepo, DbService.NO_DB_ID, folderInfo);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbFsFile.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbFsFile.java
deleted file mode 100644
index 4b09d7a..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbFsFile.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.model;
-
-import org.artifactory.fs.FileInfo;
-import org.artifactory.sapi.fs.VfsFile;
-import org.artifactory.storage.fs.repo.StoringRepo;
-
-import java.io.InputStream;
-
-/**
- * yossi
- * Virtual filesystem file backed by a database record.
- *
- * @author Yossi Shaul
- */
-public class DbFsFile extends DbFsItem<FileInfo> implements VfsFile<FileInfo> {
-
-    public DbFsFile(StoringRepo storingRepo, long id, FileInfo info) {
-        super(storingRepo, id, info);
-    }
-
-    @Override
-    public boolean isFile() {
-        return true;
-    }
-
-    @Override
-    public boolean isFolder() {
-        return false;
-    }
-
-    @Override
-    public long length() {
-        return getInfo().getSize();
-    }
-
-    @Override
-    public String getSha1() {
-        return getInfo().getSha1();
-    }
-
-    @Override
-    public String getMd5() {
-        return getInfo().getMd5();
-    }
-
-    @Override
-    public InputStream getStream() {
-        return getBinariesService().getBinary(getSha1());
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbFsFolder.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbFsFolder.java
deleted file mode 100644
index b8ffc7f..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbFsFolder.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.model;
-
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.sapi.fs.VfsFolder;
-import org.artifactory.sapi.fs.VfsItem;
-import org.artifactory.storage.fs.repo.StoringRepo;
-
-import java.util.List;
-
-/**
- * Virtual filesystem folder backed by a database record.
- *
- * @author Yossi Shaul
- */
-public class DbFsFolder extends DbFsItem<FolderInfo> implements VfsFolder<FolderInfo> {
-
-    public DbFsFolder(StoringRepo repo, long folderId, FolderInfo folderInfo) {
-        super(repo, folderId, folderInfo);
-    }
-
-    @Override
-    public boolean isFile() {
-        return false;
-    }
-
-    @Override
-    public boolean isFolder() {
-        return true;
-    }
-
-    @Override
-    public boolean hasChildren() {
-        return getRepo().hasChildren(this);
-    }
-
-    @Override
-    public List<VfsItem> getImmutableChildren() {
-        return getRepo().getImmutableChildren(this);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbFsItem.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbFsItem.java
deleted file mode 100644
index 709bb58..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbFsItem.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.model;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.fs.VfsItem;
-import org.artifactory.storage.binstore.service.BinaryService;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.fs.repo.StoringRepo;
-import org.artifactory.storage.fs.service.FileService;
-import org.artifactory.storage.fs.service.PropertiesService;
-import org.artifactory.storage.fs.service.WatchesService;
-
-/**
- * Represents a virtual file/folder backed by database entry.
- *
- * @author Yossi Shaul
- */
-public abstract class DbFsItem<T extends ItemInfo> implements VfsItem<T> {
-
-    /**
-     * The repository that contains this item.
-     */
-    private final StoringRepo repo;
-
-    /**
-     * Unique database identifier. {@link org.artifactory.storage.db.DbService#NO_DB_ID} if not persisted yet.
-     */
-    protected long id = DbService.NO_DB_ID;
-
-    protected final T info;
-
-    protected DbFsItem(StoringRepo repo, long id, T info) {
-        this.repo = repo;
-        this.id = id;
-        this.info = info;
-    }
-
-    @Override
-    public long getId() {
-        return id;
-    }
-
-    @Override
-    public T getInfo() {
-        return info;
-    }
-
-    public StoringRepo getRepo() {
-        return repo;
-    }
-
-    @Override
-    public String getName() {
-        return info.getName();
-    }
-
-    @Override
-    public long getCreated() {
-        return info.getCreated();
-    }
-
-    @Override
-    public RepoPath getRepoPath() {
-        return info.getRepoPath();
-    }
-
-    @Override
-    public String getRepoKey() {
-        return info.getRepoKey();
-    }
-
-    @Override
-    public String getPath() {
-        return info.getRelPath();
-    }
-
-    @Override
-    public Properties getProperties() {
-        return getPropertiesService().getProperties(getRepoPath());
-    }
-
-    @Override
-    public String toString() {
-        return getRepoPath().toString();
-    }
-
-    protected FileService getFileService() {
-        return ContextHelper.get().beanForType(FileService.class);
-    }
-
-    protected RepositoryService getRepositoryService() {
-        return ContextHelper.get().beanForType(RepositoryService.class);
-    }
-
-    protected BinaryService getBinariesService() {
-        return ContextHelper.get().beanForType(BinaryService.class);
-    }
-
-    protected PropertiesService getPropertiesService() {
-        return ContextHelper.get().beanForType(PropertiesService.class);
-    }
-
-    protected WatchesService getWatchesService() {
-        return ContextHelper.get().beanForType(WatchesService.class);
-    }
-
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbFsItemProvider.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbFsItemProvider.java
deleted file mode 100644
index c4fb654..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbFsItemProvider.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.model;
-
-import com.google.common.collect.Lists;
-import org.apache.http.HttpStatus;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.common.StatusHolder;
-import org.artifactory.exception.CancelException;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.fs.MutableFolderInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.interceptor.StorageInterceptors;
-import org.artifactory.sapi.fs.MutableVfsFolder;
-import org.artifactory.sapi.fs.MutableVfsItem;
-import org.artifactory.sapi.fs.VfsItem;
-import org.artifactory.storage.StorageException;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.fs.VfsItemNotFoundException;
-import org.artifactory.storage.fs.VfsItemProvider;
-import org.artifactory.storage.fs.lock.FsItemLockEntry;
-import org.artifactory.storage.fs.lock.FsItemsVault;
-import org.artifactory.storage.fs.lock.LockEntryId;
-import org.artifactory.storage.fs.lock.LockingHelper;
-import org.artifactory.storage.fs.repo.StoringRepo;
-import org.artifactory.storage.fs.service.FileService;
-import org.artifactory.storage.fs.session.StorageSessionHolder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.List;
-
-/**
- * The exclusive provider of vfs items.
- *
- * @author Yossi Shaul
- */
-public class DbFsItemProvider implements VfsItemProvider {
-    private static final Logger log = LoggerFactory.getLogger(DbFsItemProvider.class);
-
-    private final StoringRepo storingRepo;
-    private final RepoPath repoPath;
-    private final FsItemsVault vault;
-
-    public DbFsItemProvider(StoringRepo storingRepo, RepoPath repoPath, FsItemsVault vault) {
-        if (!storingRepo.getKey().equals(repoPath.getRepoKey())) {
-            throw new IllegalArgumentException(
-                    "Attempt to lock '" + repoPath + "' with repository '" + storingRepo.getKey());
-        }
-        this.storingRepo = storingRepo;
-        this.vault = vault;
-        this.repoPath = repoPath;
-    }
-
-    /**
-     * Returns an read locked immutable VFS item or null if the item with this repo path doesn't exist.
-     * If the item already write locked by the current thread, no read lock is acquired.
-     *
-     * @return Read locked VFS item or null if not found
-     */
-    @Override
-    @Nullable
-    public VfsItem getImmutableFsItem() {
-        if (StorageSessionHolder.getSession() != null) {
-            // try first the mutable item - it might contain changes done by current thread in a previous method
-            FsItemLockEntry sessionLockEntry = LockingHelper.getLockEntry(repoPath);
-            if (sessionLockEntry != null) {
-                if (sessionLockEntry.getMutableFsItem() != null) {
-                    return sessionLockEntry.getMutableFsItem();
-                }
-            }
-        }
-
-        // get the requested fs item from the storage
-        return fetchVfsItem(repoPath);
-    }
-
-    @Override
-    @Nullable
-    public MutableVfsItem getMutableFsItem() {
-        LockEntryId lockEntryId = vault.getLock(repoPath);
-
-        // acquire the write lock
-        FsItemLockEntry sessionLockEntry = LockingHelper.writeLock(lockEntryId);
-        // try to get the item from the lock
-        MutableVfsItem mutableItem = sessionLockEntry.getMutableFsItem();
-        try {
-            if (mutableItem == null) {
-                // get the requested fs item from the storage
-                mutableItem = fetchMutableVfsItem(repoPath, sessionLockEntry);
-            }
-            return mutableItem;
-        } finally {
-            if (mutableItem == null) {
-                // item not found -> release the lock on this repo path
-                LockingHelper.removeLockEntry(repoPath);
-            }
-        }
-    }
-
-    @Override
-    @Nonnull
-    public MutableVfsItem getOrCreateMutableFsItem() {
-        // first try to get an existing mutable item
-        MutableVfsItem mutableItem = LockingHelper.getIfWriteLockedByMe(getRepoPath());
-        if (mutableItem != null) {
-            // item exists nothing new to create
-            return mutableItem;
-        }
-
-        // time to create a new item. start checking from the parent to the requested repo path
-        try {
-            createAncestors();
-            // get mutable item for the requested repo path
-            LockEntryId lockEntryId = vault.getLock(repoPath);
-            FsItemLockEntry sessionLockEntry = LockingHelper.writeLock(lockEntryId);
-            if (itemExists(repoPath)) { //TODO: [by YS] fetch and check for null
-                mutableItem = fetchMutableVfsItem(repoPath, sessionLockEntry);
-            } else {
-                // item doesn't exist and we hold the write lock -> create and set the write lock
-                mutableItem = createNewMutableItem(storingRepo, repoPath);
-                sessionLockEntry.setWriteFsItem(mutableItem);
-                //TODO: [by YS] put here before/after create events? for files it's in the repo mixin
-                if (mutableItem.isFolder()) {
-                    invokeBeforeCreateInterceptors((MutableVfsFolder) mutableItem);
-                    invokeAfterCreateInterceptors((MutableVfsFolder) mutableItem);
-                }
-            }
-
-            if (mutableItem == null) {
-                throw new IllegalStateException("Mutable item cannot be null when create is on: " + repoPath);
-            }
-            return mutableItem;
-        } catch (RepoRejectException e) {
-            throw new IllegalArgumentException("Could not create file system item " + e.getMessage(), e);
-        } finally {
-            if (mutableItem == null) {
-                // item not found -> release the lock on this repo path
-                LockingHelper.removeLockEntry(repoPath);
-            }
-        }
-    }
-
-    private void createAncestors() throws RepoRejectException {
-        // in most cases the parent already exist so perform a quick check before looping from the root
-        if (repoPath.getParent() == null || itemExists(repoPath.getParent())) {
-            if (itemExistsAndIsFile(repoPath.getParent())) {
-                throw new RepoRejectException("Parent " + repoPath.getParent().getPath() + " must be a folder",
-                        HttpStatus.SC_BAD_REQUEST);
-            }
-            return;
-        }
-        List<RepoPath> ancestors = getAncestors();
-        for (RepoPath ancestor : ancestors) {
-            // first check if it's already locked by this session
-            FsItemLockEntry sessionLockEntry = LockingHelper.getLockEntry(ancestor);
-            if (itemExistsAndIsFile(ancestor)) {
-                throw new RepoRejectException("Parent " + repoPath.getParent().getPath() + " must be a folder",
-                        HttpStatus.SC_BAD_REQUEST);
-            }
-            if ((sessionLockEntry == null || sessionLockEntry.getMutableFsItem() == null) && !itemExists(ancestor)) {
-                // acquire the write lock
-                LockEntryId lockEntryId = vault.getLock(ancestor);
-                sessionLockEntry = LockingHelper.writeLock(lockEntryId);
-                // after acquiring the lock check again that the item doesn't exist in the database
-                if (itemExists(ancestor)) {
-                    // somebody already created the folder - release the write lock
-                    LockingHelper.removeLockEntry(ancestor);
-                } else {
-                    //TORE: [by YS] share the folder creation with dbfolderprovider
-                    //TODO: [by YS] basically now we can create all the way down. no need to checks exists anymore. but consider keeping it like this for simplicity
-                    // item doesn't exist and we hold the write lock -> create and set the write lock
-                    log.debug("Creating ancestor {} for {}", ancestor, repoPath);
-                    MutableFolderInfo folderInfo = InfoFactoryHolder.get().createFolderInfo(ancestor);
-                    DbMutableFolder newlyCreatedFolder =
-                            new DbMutableFolder(storingRepo, DbService.NO_DB_ID, folderInfo);
-                    sessionLockEntry.setWriteFsItem(newlyCreatedFolder);
-                    // set current user as the creator/modifier. This can be later overridden in case of an import
-                    String userId = ContextHelper.get().getAuthorizationService().currentUsername();
-                    newlyCreatedFolder.setModifiedBy(userId);
-                    newlyCreatedFolder.setCreatedBy(userId);
-                    invokeBeforeCreateInterceptors(newlyCreatedFolder);
-                    invokeAfterCreateInterceptors(newlyCreatedFolder);
-                }
-            }
-        }
-    }
-
-    private List<RepoPath> getAncestors() {
-        List<RepoPath> ancestors = Lists.newArrayList();
-        RepoPath ancestor = repoPath.getParent();
-        while (ancestor != null && !ancestor.isRoot()) {
-            ancestors.add(0, ancestor);
-            ancestor = ancestor.getParent();
-        }
-        return ancestors;
-    }
-
-    /**
-     * Create a new mutable fs item. This method is called only if the item doesn't exist in the database
-     *
-     * @param storingRepo The repository that will store the new item
-     * @param repoPath    Repo path of the new item
-     * @return A newly created mutable fs item. The item doesn't exist in the database yet.
-     */
-    protected MutableVfsItem createNewMutableItem(StoringRepo storingRepo, RepoPath repoPath) {
-        throw new UnsupportedOperationException("Cannot create mutable item from a generic item provider: " + repoPath);
-    }
-
-    @Nullable
-    private MutableVfsItem fetchMutableVfsItem(RepoPath repoPath, FsItemLockEntry lockEntry) {
-        VfsItem vfsItem = fetchVfsItem(repoPath);
-        MutableVfsItem mutableItem = null;
-        if (vfsItem != null) {
-            // item exists in db -> create a mutable version
-            if (vfsItem.isFolder()) {
-                mutableItem = new DbMutableFolder(storingRepo, vfsItem.getId(), (FolderInfo) vfsItem.getInfo());
-            } else {
-                mutableItem = new DbMutableFile(storingRepo, vfsItem.getId(), (FileInfo) vfsItem.getInfo());
-            }
-
-            // set the mutable item on the lock entry
-            lockEntry.setWriteFsItem(mutableItem);
-        }
-        return mutableItem;
-    }
-
-    @Nullable
-    private VfsItem fetchVfsItem(RepoPath repoPath) {
-        FileService fileService = ContextHelper.get().beanForType(FileService.class);
-        VfsItem item;
-        try {
-            item = fileService.loadVfsItem(storingRepo, repoPath);
-        } catch (VfsItemNotFoundException e) {
-            item = null;
-        } catch (StorageException e) {
-            throw new StorageException(e);
-        }
-        return item;
-    }
-
-    private boolean itemExistsAndIsFile(RepoPath repoPath) {
-        if (repoPath == null) {
-            return false;
-        }
-        FileService fileService = ContextHelper.get().beanForType(FileService.class);
-        try {
-            ItemInfo itemInfo = fileService.loadItem(repoPath);
-            return !itemInfo.isFolder();
-        } catch (VfsItemNotFoundException e) {
-            return false;
-        }
-    }
-
-    private boolean itemExists(RepoPath repoPath) {
-        //TODO: [by YS] must use the cache
-        FileService fileService = ContextHelper.get().beanForType(FileService.class);
-        try {
-            return fileService.exists(repoPath);
-        } catch (StorageException e) {
-            throw new StorageException(e);
-        }
-    }
-
-    public RepoPath getRepoPath() {
-        return repoPath;
-    }
-
-    private void invokeBeforeCreateInterceptors(MutableVfsFolder mutableItem) throws CancelException {
-        if (mutableItem.getInfo().getRepoPath().isRoot()) {
-            return;
-        }
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-        StorageInterceptors interceptors = ContextHelper.get().beanForType(StorageInterceptors.class);
-        interceptors.beforeCreate(mutableItem, statusHolder);
-        checkForCancelException(mutableItem, statusHolder);
-    }
-
-    private void invokeAfterCreateInterceptors(MutableVfsFolder mutableItem) {
-        if (mutableItem.getInfo().getRepoPath().isRoot()) {
-            return;
-        }
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-        StorageInterceptors interceptors = ContextHelper.get().beanForType(StorageInterceptors.class);
-        interceptors.afterCreate(mutableItem, statusHolder);
-        checkForCancelException(mutableItem, statusHolder);
-    }
-
-    private void checkForCancelException(MutableVfsFolder mutableFolder, StatusHolder status) {
-        if (status.getCancelException() != null) {
-            mutableFolder.markError();
-            LockingHelper.removeLockEntry(mutableFolder.getRepoPath());
-            throw status.getCancelException();
-        }
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbMutableFile.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbMutableFile.java
deleted file mode 100644
index 00f29e7..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbMutableFile.java
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.model;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.checksum.ChecksumsInfo;
-import org.artifactory.exception.CancelException;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.MutableFileInfo;
-import org.artifactory.fs.StatsInfo;
-import org.artifactory.sapi.fs.MutableVfsFile;
-import org.artifactory.sapi.interceptor.DeleteContext;
-import org.artifactory.storage.BinaryInsertRetryException;
-import org.artifactory.storage.binstore.service.BinaryInfo;
-import org.artifactory.storage.binstore.service.InternalBinaryService;
-import org.artifactory.storage.db.binstore.service.BinaryServiceInputStream;
-import org.artifactory.storage.fs.VfsException;
-import org.artifactory.storage.fs.repo.StoringRepo;
-import org.artifactory.storage.fs.service.StatsService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * A mutable DB file.
- *
- * @author Yossi Shaul
- */
-public class DbMutableFile extends DbMutableItem<MutableFileInfo> implements MutableVfsFile {
-    private static final Logger log = LoggerFactory.getLogger(DbMutableFile.class);
-
-    private StatsInfo stats;
-    private boolean placedBinaryDeleteProtectionLock;
-
-    public DbMutableFile(StoringRepo storingRepo, long id, FileInfo info) {
-        super(storingRepo, id, InfoFactoryHolder.get().copyFileInfo(info));
-    }
-
-    @Override
-    public void setClientChecksum(@Nonnull ChecksumType type, @Nullable String checksum) {
-        if (type == ChecksumType.sha1) {
-            setClientSha1(checksum);
-        } else {
-            setClientMd5(checksum);
-        }
-    }
-
-    @Override
-    public void setClientSha1(@Nullable String sha1) {
-        mutableInfo.addChecksumInfo(new ChecksumInfo(ChecksumType.sha1, sha1, mutableInfo.getSha1()));
-    }
-
-    @Override
-    public void setClientMd5(String md5) {
-        mutableInfo.addChecksumInfo(new ChecksumInfo(ChecksumType.md5, md5, mutableInfo.getMd5()));
-    }
-
-    @Override
-    public void fillInfo(FileInfo source) {
-        super.fillInfo(source);
-        ChecksumsInfo resourceChecksums = source.getChecksumsInfo();
-        ChecksumInfo sha1Info = resourceChecksums.getChecksumInfo(ChecksumType.sha1);
-        String clientSha1 = sha1Info == null ? null : sha1Info.getOriginalOrNoOrig();
-        setClientSha1(clientSha1);
-        ChecksumInfo md5Info = resourceChecksums.getChecksumInfo(ChecksumType.md5);
-        String clientMd5 = md5Info == null ? null : md5Info.getOriginalOrNoOrig();
-        setClientMd5(clientMd5);
-    }
-
-    @Override
-    public boolean tryUsingExistingBinary(String sha1, String md5, long length) throws BinaryInsertRetryException {
-        BinaryInfo binary = getBinaryStore().addBinaryRecord(sha1, md5, length);
-        if (binary != null) {
-            setFileBinaryInfo(binary);
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    public void fillBinaryData(InputStream in) {
-        //Check if needs to create checksum and not checksum file
-        log.debug("Calculating checksums of '{}'.", getRepoPath());
-        BinaryInfo binaryInfo;
-        try {
-            if (in instanceof BinaryServiceInputStream) {
-                // input stream is from existing binary
-                binaryInfo = ((BinaryServiceInputStream) in).getBinaryInfo();
-            } else {
-                // call the binary service to add the current binary
-                binaryInfo = getBinaryStore().addBinary(in);
-            }
-        } catch (IOException e) {
-            throw new VfsException("Failed to add input stream for '" + getRepoPath() + "'", e);
-        }
-
-        setFileBinaryInfo(binaryInfo);
-    }
-
-    @Override
-    public void setStats(StatsInfo statsInfo) {
-        this.stats = statsInfo;
-    }
-
-    private void setFileBinaryInfo(@Nonnull BinaryInfo binary) {
-        getBinaryStore().incrementNoDeleteLock(binary.getSha1());
-        placedBinaryDeleteProtectionLock = true;
-        // The size needs to be always consistent so no rely on MD
-        mutableInfo.setSize(binary.getLength());
-        ChecksumInfo sha1Orig = mutableInfo.getChecksumsInfo().getChecksumInfo(ChecksumType.sha1);
-        String clientSha1 = sha1Orig == null ? null : sha1Orig.getOriginalOrNoOrig();
-        mutableInfo.addChecksumInfo(new ChecksumInfo(ChecksumType.sha1, clientSha1, binary.getSha1()));
-        ChecksumInfo md5Orig = mutableInfo.getChecksumsInfo().getChecksumInfo(ChecksumType.md5);
-        String clientMd5 = md5Orig == null ? null : md5Orig.getOriginalOrNoOrig();
-        mutableInfo.addChecksumInfo(new ChecksumInfo(ChecksumType.md5, clientMd5, binary.getMd5()));
-    }
-
-    @Override
-    public boolean delete(DeleteContext ctx) {
-        if (isNew()) {
-            log.error("Deleting a newly created item: {}", getRepoPath());
-            throw new IllegalStateException("Cannot delete a newly created item: " + getRepoPath());
-        }
-
-        if (markForDeletion) {
-            return true;
-        }
-
-        try {
-            fireBeforeDeleteEvent(ctx);
-        } catch (CancelException e) {
-            log.info("Deletion of {} was canceled by plugin", getRepoPath());
-            throw e;
-        }
-
-        markForDeletion = true;
-
-        fireAfterDeleteEvent(ctx);
-        return true;
-    }
-
-    @Override
-    public void releaseResources() {
-        super.releaseResources();
-        releaseInsertedStreamLock();
-    }
-
-    @Override
-    public boolean hasPendingChanges() {
-        if (inError) {
-            return false;
-        }
-        return stats != null || super.hasPendingChanges();
-    }
-
-    @Override
-    protected boolean readyForPersistence() {
-        return !StringUtils.isBlank(getSha1());
-    }
-
-    @Override
-    protected void resetAfterSave() {
-        super.resetAfterSave();
-        stats = null;
-    }
-
-    @Override
-    protected void doDeleteInternal() {
-        // delete file specific data
-        getStatsService().deleteStats(id);
-    }
-
-    @Override
-    protected long doCreateNode() {
-        long nodeId = getFileService().createFile(mutableInfo);
-        if (stats != null) {
-            getStatsService().setStats(nodeId, stats);
-        }
-        return nodeId;
-    }
-
-    private void releaseInsertedStreamLock() {
-        if (placedBinaryDeleteProtectionLock) {
-            getBinaryStore().decrementNoDeleteLock(getSha1());
-        }
-    }
-
-    @Override
-    protected void doUpdateNode() {
-        getFileService().updateFile(id, mutableInfo);
-        // stats are not updatable by mutable file
-    }
-
-    protected InternalBinaryService getBinaryStore() {
-        return ContextHelper.get().beanForType(InternalBinaryService.class);
-    }
-
-    @Override
-    public String getSha1() {
-        return mutableInfo.getSha1();
-    }
-
-    @Override
-    public String getMd5() {
-        return mutableInfo.getMd5();
-    }
-
-    @Override
-    public InputStream getStream() {
-        return getBinariesService().getBinary(getSha1());
-    }
-
-    @Override
-    public long length() {
-        return mutableInfo.getSize();
-    }
-
-    protected StatsService getStatsService() {
-        return ContextHelper.get().beanForType("statsServiceImpl", StatsService.class);
-    }
-
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbMutableFolder.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbMutableFolder.java
deleted file mode 100644
index 6e1361b..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbMutableFolder.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.model;
-
-import org.artifactory.exception.CancelException;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.fs.MutableFolderInfo;
-import org.artifactory.sapi.fs.MutableVfsFolder;
-import org.artifactory.sapi.fs.MutableVfsItem;
-import org.artifactory.sapi.fs.VfsItem;
-import org.artifactory.sapi.interceptor.DeleteContext;
-import org.artifactory.storage.fs.repo.StoringRepo;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- * A mutable DB folder.
- *
- * @author Yossi Shaul
- */
-public class DbMutableFolder extends DbMutableItem<MutableFolderInfo> implements MutableVfsFolder {
-    private static final Logger log = LoggerFactory.getLogger(DbMutableFolder.class);
-
-    public DbMutableFolder(StoringRepo repo, long id, FolderInfo folderInfo) {
-        super(repo, id, InfoFactoryHolder.get().copyFolderInfo(folderInfo));
-    }
-
-    @Override
-    public void fillInfo(FolderInfo source) {
-        super.fillInfo(source);
-    }
-
-    @Override
-    public List<MutableVfsItem> getMutableChildren() {
-        return getRepo().getMutableChildren(this);
-    }
-
-    @Override
-    public List<VfsItem> getImmutableChildren() {
-        return getRepo().getImmutableChildren(this);
-    }
-
-    @Override
-    public boolean hasChildren() {
-        return getRepo().hasChildren(this);
-    }
-
-    @Override
-    public boolean delete(DeleteContext ctx) {
-        if (isNew()) {
-            //TODO: [by YS] until verified
-            throw new IllegalStateException("Cannot delete a newly created item: " + getRepoPath());
-        }
-
-        if (markForDeletion) {
-            return true;
-        }
-
-        try {
-            fireBeforeDeleteEvent(ctx);
-        } catch (CancelException e) {
-            log.info("Deletion of {} was canceled by user plugin", getRepoPath());
-            throw e;
-        }
-
-        List<MutableVfsItem> children = getMutableChildren();
-        for (MutableVfsItem child : children) {
-            child.delete(ctx.triggeredByMove());
-        }
-
-        if (!getRepoPath().isRoot()) {
-            markForDeletion = true;
-        }
-
-        fireAfterDeleteEvent(ctx);
-        return true;
-    }
-
-    @Override
-    public void deleteIncludingRoot() {
-        if (!getRepoPath().isRoot()) {
-            throw new IllegalArgumentException("Current folder is not repo root: " + getRepoPath());
-        }
-        // delete all children
-        delete(new DeleteContext(getRepoPath()));
-        // mark root for deletion as well
-        markForDeletion = true;
-    }
-
-    @Override
-    protected boolean readyForPersistence() {
-        return true;
-    }
-
-    @Override
-    protected long doCreateNode() {
-        return getFileService().createFolder(mutableInfo);
-    }
-
-    @Override
-    protected void doUpdateNode() {
-        getFileService().updateFolder(id, mutableInfo);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbMutableItem.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbMutableItem.java
deleted file mode 100644
index e414e1b..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbMutableItem.java
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.model;
-
-import com.google.common.collect.Lists;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.exception.CancelException;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.fs.MutableItemInfo;
-import org.artifactory.fs.WatcherInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.interceptor.StorageInterceptors;
-import org.artifactory.sapi.fs.MutableVfsItem;
-import org.artifactory.sapi.interceptor.DeleteContext;
-import org.artifactory.security.AccessLogger;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.fs.repo.StoringRepo;
-import org.artifactory.storage.fs.service.ItemMetaInfo;
-import org.artifactory.storage.fs.service.NodeMetaInfoService;
-import org.artifactory.storage.spring.StorageContextHelper;
-import org.artifactory.util.PathValidator;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- * Base class for the mutable folder and file.
- *
- * @author Yossi Shaul
- */
-public abstract class DbMutableItem<T extends MutableItemInfo> extends DbFsItem<T> implements MutableVfsItem<T> {
-    private static final Logger log = LoggerFactory.getLogger(DbMutableItem.class);
-
-    /**
-     * The mutable item info. All item the modifications done during this session are saved in this object.
-     */
-    protected final T mutableInfo;
-
-    /**
-     * Original item info captures the state of the item before any changes are done to the mutable item.
-     * This is used to check if there are any pending changes to save on session commit.
-     */
-    private ItemInfo originalInfo;
-
-    private Properties properties;
-
-    private List<WatcherInfo> watchesToAdd;
-
-    /**
-     * True if this item is marked for deletion on session save
-     */
-    protected boolean markForDeletion;
-
-    /**
-     * True if this item was deleted from the db (after a session save)
-     */
-    private boolean deleted;
-
-    /**
-     * True if this item is marked in error state and should not be saved in the session.
-     *
-     * @see DbMutableItem#markError()
-     */
-    protected boolean inError;
-
-    public DbMutableItem(StoringRepo repo, long id, T info) {
-        super(repo, id, info);
-        PathValidator.validate(info.getRepoPath().toPath());
-        this.id = id;
-        this.mutableInfo = info;
-        originalInfo = InfoFactoryHolder.get().copyItemInfo(info);
-    }
-
-    @Override
-    public long getId() {
-        return id;
-    }
-
-    @Override
-    public void setCreated(long created) {
-        mutableInfo.setCreated(created);
-    }
-
-    @Override
-    public void setCreatedBy(String user) {
-        mutableInfo.setCreatedBy(user);
-    }
-
-    @Override
-    public void setModified(long modified) {
-        mutableInfo.setLastModified(modified);
-    }
-
-    @Override
-    public void setModifiedBy(String user) {
-        mutableInfo.setModifiedBy(user);
-    }
-
-    @Override
-    public void setUpdated(long updated) {
-        mutableInfo.setLastUpdated(updated);
-    }
-
-
-    @Override
-    public void setProperties(Properties properties) {
-        this.properties = properties;
-    }
-
-    @Override
-    public boolean isFile() {
-        return !info.isFolder();
-    }
-
-    @Override
-    public boolean isFolder() {
-        return info.isFolder();
-    }
-
-    @Override
-    public boolean isMarkedForDeletion() {
-        return markForDeletion;
-    }
-
-    @Override
-    public boolean isNew() {
-        return id == DbService.NO_DB_ID;
-    }
-
-    @Override
-    public boolean isDeleted() {
-        return deleted;
-    }
-
-    @Override
-    public Properties getProperties() {
-        if (properties != null) {
-            return properties;
-        } else {
-            return super.getProperties();
-        }
-    }
-
-    @Override
-    public void addWatch(WatcherInfo watch) {
-        if (watchesToAdd == null) {
-            watchesToAdd = Lists.newArrayList();
-        }
-        watchesToAdd.add(watch);
-    }
-
-    @Override
-    public void markError() {
-        inError = true;
-    }
-
-    @Override
-    public void releaseResources() {
-        // nothing to release by default
-    }
-
-    @Override
-    public boolean hasPendingChanges() {
-        if (inError) {
-            return false;
-        }
-        return isNew() || (markForDeletion && !deleted) || properties != null ||
-                watchesToAdd != null || !mutableInfo.isIdentical(originalInfo);
-    }
-
-    @Override
-    public void save() {
-        if (inError) {
-            throw new IllegalStateException("Attempt to save an item in error state: " + this);
-        }
-
-        if (isNew()) {
-            if (!readyForPersistence()) {
-                // session save might be called before an item is ready to be persisted in the database
-                // in such case delay the save and expect a later session save to persist
-                // if no other session save is called, an error will be emitted to the log on session remove
-                log.debug("Item '{}' is not ready for persistence");
-                return;
-            }
-            id = doCreateNode();
-            if (properties != null && !properties.isEmpty()) { // no point to set empty props for new item
-                getPropertiesService().setProperties(id, properties);
-                createOrUpdateNodeMetaInfo();
-            }
-            if (watchesToAdd != null) {
-                getWatchesService().addWatches(id, watchesToAdd);
-            }
-        } else if (markForDeletion) {
-            log.debug("Deleting item: '{}'", getRepoPath());
-            doDeleteInternal();
-            getWatchesService().deleteWatches(id);
-            getPropertiesService().deleteProperties(id);
-            getNodeMetaInfoService().deleteMetaInfo(id);
-            getFileService().deleteItem(id);
-            deleted = true;
-        } else {    // it's an update
-            if (!mutableInfo.isIdentical(originalInfo)) {
-                doUpdateNode();
-            }
-            if (properties != null) {
-                getPropertiesService().setProperties(id, properties);
-                if (!properties.isEmpty()) {
-                    createOrUpdateNodeMetaInfo();
-                } else {
-                    getNodeMetaInfoService().deleteMetaInfo(id);
-                }
-            }
-            if (watchesToAdd != null) {
-                getWatchesService().addWatches(id, watchesToAdd);
-            }
-        }
-
-        // reset original info
-        resetAfterSave();
-    }
-
-    protected void resetAfterSave() {
-        markForDeletion = false;
-        watchesToAdd = null;
-        properties = null;
-        originalInfo = InfoFactoryHolder.get().copyItemInfo(mutableInfo);
-    }
-
-    protected void doDeleteInternal() {
-        // allow override - file/folder can add specific cleanup before the node is removed
-    }
-
-    protected abstract long doCreateNode();
-
-    protected abstract void doUpdateNode();
-
-    protected abstract boolean readyForPersistence();
-
-    protected void fillInfo(ItemInfo source) {
-        setCreated(source.getCreated());
-        setCreatedBy(source.getCreatedBy());
-        setModified(source.getLastModified());
-        setModifiedBy(source.getModifiedBy());
-        setUpdated(source.getLastUpdated());
-    }
-
-    private void createOrUpdateNodeMetaInfo() {
-        getNodeMetaInfoService().createOrUpdateNodeMetaInfo(id,
-                new ItemMetaInfo(System.currentTimeMillis(), getAuthorizationService().currentUsername()));
-    }
-
-    private NodeMetaInfoService getNodeMetaInfoService() {
-        return ContextHelper.get().beanForType(NodeMetaInfoService.class);
-    }
-
-    private AuthorizationService getAuthorizationService() {
-        return ContextHelper.get().beanForType(AuthorizationService.class);
-    }
-
-    protected void fireBeforeDeleteEvent(DeleteContext ctx) throws CancelException {
-        StorageInterceptors interceptors = StorageContextHelper.get().beanForType(StorageInterceptors.class);
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-        interceptors.beforeDelete(this, statusHolder, ctx.isTriggeredByMove());
-        if (statusHolder.isError()) {
-            throw statusHolder.getCancelException();
-        }
-    }
-
-    protected void fireAfterDeleteEvent(DeleteContext ctx) {
-        StorageInterceptors interceptors = StorageContextHelper.get().beanForType(StorageInterceptors.class);
-        interceptors.afterDelete(this, new BasicStatusHolder(), ctx);
-        AccessLogger.deleted(getRepoPath());
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbVfsItemProviderFactory.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbVfsItemProviderFactory.java
deleted file mode 100644
index 9d0c683..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/model/DbVfsItemProviderFactory.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.model;
-
-import org.artifactory.repo.RepoPath;
-import org.artifactory.storage.fs.VfsFileProvider;
-import org.artifactory.storage.fs.VfsFolderProvider;
-import org.artifactory.storage.fs.VfsItemProvider;
-import org.artifactory.storage.fs.VfsItemProviderFactory;
-import org.artifactory.storage.fs.lock.FsItemsVault;
-import org.artifactory.storage.fs.repo.StoringRepo;
-import org.springframework.stereotype.Component;
-
-/**
- * Factory of of DB items provider.
- *
- * @author Yossi Shaul
- */
- at Component
-public class DbVfsItemProviderFactory implements VfsItemProviderFactory {
-    @Override
-    public VfsItemProvider createItemProvider(StoringRepo storingRepo, RepoPath repoPath, FsItemsVault fsItemsVault) {
-        return new DbFsItemProvider(storingRepo, repoPath, fsItemsVault);
-    }
-
-    @Override
-    public VfsFileProvider createFileProvider(StoringRepo storingRepo, RepoPath repoPath, FsItemsVault fsItemsVault) {
-        return new DbFileProvider(storingRepo, repoPath, fsItemsVault);
-    }
-
-    @Override
-    public VfsFolderProvider createFolderProvider(StoringRepo storingRepo, RepoPath repoPath,
-            FsItemsVault fsItemsVault) {
-        return new DbFolderProvider(storingRepo, repoPath, fsItemsVault);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/service/AbstractStatsService.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/service/AbstractStatsService.java
deleted file mode 100644
index 1c91601..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/service/AbstractStatsService.java
+++ /dev/null
@@ -1,517 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.service;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.Maps;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.ha.semaphore.SemaphoreWrapper;
-import org.artifactory.addon.smartrepo.SmartRepoAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.MutableStatsInfo;
-import org.artifactory.fs.StatsInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.db.DbType;
-import org.artifactory.storage.db.fs.dao.StatsDao;
-import org.artifactory.storage.db.fs.entity.Stat;
-import org.artifactory.storage.fs.VfsException;
-import org.artifactory.storage.fs.service.FileService;
-import org.artifactory.util.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.TransactionDefinition;
-import org.springframework.transaction.TransactionStatus;
-import org.springframework.transaction.support.AbstractPlatformTransactionManager;
-import org.springframework.transaction.support.DefaultTransactionDefinition;
-
-import java.sql.SQLException;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * Provides basic statistic services
- *
- * @author Michael Pasternak
- */
-public abstract class AbstractStatsService {
-
-    private static final Logger log = LoggerFactory.getLogger(AbstractStatsService.class);
-    public static final int DEFAULT_NB_STATS_SAVED_PER_TX = 30;
-    private ConcurrentMap<RepoPath, StatsEvent> statsEvents = Maps.newConcurrentMap();
-
-    @Autowired
-    private StatsDao statsDao;
-
-    @Autowired
-    private FileService fileService;
-
-    @Autowired
-    private DbService dbService;
-
-    public StatsDao getStatsDao() {
-        return statsDao;
-    }
-
-    public FileService getFileService() {
-        return fileService;
-    }
-
-    public DbService getDbService() {
-        return dbService;
-    }
-
-    public ConcurrentMap<RepoPath, StatsEvent> getStatsEvents() {
-        return statsEvents;
-    }
-
-    public void flushStats() {
-        if (getStatsEvents().isEmpty()) {
-            return;
-        }
-        try {
-            if (!getFlushingSemaphore().tryAcquire(ConstantValues.statsFlushTimeoutSecs.getLong(), TimeUnit.SECONDS)) {
-                log.debug("Received flush stats request, but another process is already running.");
-                return;
-            }
-        } catch (InterruptedException e) {
-            log.error("Interrupted while waiting for stats flush", e);
-            return;
-        }
-
-        try {
-            doFlushStats();
-        } finally {
-            getFlushingSemaphore().release();
-        }
-    }
-
-    private void doFlushStats() {
-        int sizeOnEntry = getStatsEvents().size();
-        log.debug("Flushing {} statistics to storage", sizeOnEntry);
-        Iterator<Map.Entry<RepoPath, StatsEvent>> iterator = getStatsEvents().entrySet().iterator();
-        int processed = 0;
-        TransactionStatus txStatus = null;
-        int savedPerTx = DEFAULT_NB_STATS_SAVED_PER_TX;
-        if (getDbService().getDatabaseType() == DbType.POSTGRESQL) {
-            // PostgreSQL does not support saving more data after a constraint failure (FK, PK, ...)
-            savedPerTx = 1;
-        }
-        try {
-            onTraversingStart();
-            while (iterator.hasNext()) {
-                final StatsEvent event = iterator.next().getValue();
-                log.trace("Flushing statistics : {}", event);
-                if (txStatus == null) {
-                    txStatus = startTransaction();
-                }
-                if (isWriteLocked(event)) {
-                    log.debug("Attempting to update stats of write locked node at: {}", event.getRepoPath());
-                    continue;
-                }
-                iterator.remove(); //remove the object prior to sampling its value to avoid atomicity problems
-                processed++;
-                StatsSaveResult saveResult = createOrUpdateStats(event);
-                switch (saveResult) {
-                    case Ignored:
-                        log.debug("Attempting to update stats of non-existing or folder node at: {}",
-                                event.getRepoPath());
-                        break;
-                    case Updated:
-                        if (processed % savedPerTx == 0) {
-                            log.debug("Flushed {} statistics done, started with {}", processed, sizeOnEntry);
-                            try {
-                                commitOrRollback(txStatus);
-                            } finally {
-                                txStatus = null;
-                            }
-                        }
-                        break;
-                    case Failed:
-                        log.debug("Flushed {} statistics done, started with {}", processed, sizeOnEntry);
-                        try {
-                            commitOrRollback(txStatus);
-                        } finally {
-                            txStatus = null;
-                        }
-                        break;
-                }
-            }
-        } finally {
-            commitOrRollback(txStatus);
-            onTraversingEnd();
-        }
-        log.debug("Successfully flushed {} statistics from total of {}", processed, sizeOnEntry);
-    }
-
-    protected enum StatsSaveResult {
-        Updated, Ignored, Failed;
-    }
-
-    public static class StatsEvent {
-        public static final String PATH_DELIMITER = "->";
-        private final RepoPath repoPath;
-
-        private final AtomicLong localEventCount;
-        private String localDownloadedBy;
-        private long localDownloadedTime;
-
-        private final AtomicLong remoteEventCount;
-        private String remoteDownloadedBy;
-        private long remoteDownloadedTime;
-        private String origin;
-        private StringBuilder path; // a path from the download triggering host (an origin)
-                                    // to the actual node containing the artifact
-
-        public StatsEvent(RepoPath repoPath) {
-            this.repoPath = repoPath;
-            this.localEventCount = new AtomicLong();
-            this.remoteEventCount = new AtomicLong();
-            this.path = new StringBuilder();
-        }
-
-        public StatsEvent(RepoPath repoPath, String origin) {
-            this.repoPath = repoPath;
-            this.localEventCount = new AtomicLong();
-            this.remoteEventCount = new AtomicLong();
-            this.origin = origin;
-            this.path = new StringBuilder();
-        }
-
-        /**
-         * Updates local statistics
-         *
-         * @param downloadedBy an local user was logged in
-         *                     at the time of update
-         * @param downloadedTime a time stamp of download request
-         */
-        public void update(String downloadedBy, long downloadedTime) {
-            this.localDownloadedBy = downloadedBy;
-            this.localDownloadedTime = downloadedTime;
-            localEventCount.incrementAndGet();
-        }
-
-        /**
-         * Updates remote statistics with foreign counter
-         *
-         * @param downloadedBy The remote user was logged in
-         *                     at the time of update
-         * @param origin The remote host the download was triggered by
-         * @param path   The round trip of download request
-         * @param downloadedTime a time stamp of download request
-         * @param delta  The download counter to add
-         */
-        public void update(String downloadedBy, String origin, String path, long downloadedTime, long delta) {
-            this.remoteDownloadedBy = downloadedBy;
-            this.remoteDownloadedTime = downloadedTime;
-            if(Strings.isNullOrEmpty(origin))
-                this.origin = origin;
-            this.remoteEventCount.addAndGet(delta);
-            updatePath(origin, path);
-        }
-
-        /**
-         * Appends intermediateOrigin to the path
-         *
-         * @param origin The remote host participating in
-         *               download request trip (e.g a->c->d->...)
-         * @param path   The round trip of download request
-         */
-        private void updatePath(String origin, String path) {
-            if (!Strings.isNullOrEmpty(origin) ) {
-                if (!Strings.isNullOrEmpty(path)) {
-                    this.path.append(path).append(PATH_DELIMITER);
-                }
-                this.path.append(origin).append(PATH_DELIMITER);
-            }
-        }
-
-        @Override
-        public String toString() {
-            final StringBuilder sb = new StringBuilder();
-                     sb.append(repoPath)
-
-                    .append("|").append(localEventCount)
-                    .append("|").append(localDownloadedBy)
-                    .append("|").append(localDownloadedTime)
-
-                    .append("|").append(remoteEventCount)
-                    .append("|").append(remoteDownloadedBy)
-                    .append("|").append(remoteDownloadedTime)
-                    .append("|").append(origin)
-                    .append("|").append(getPath());
-
-            return sb.toString();
-        }
-
-        public RepoPath getRepoPath() {
-            return repoPath;
-        }
-
-
-        public AtomicLong getRemoteEventCount() {
-            return remoteEventCount;
-        }
-
-        public String getRemoteDownloadedBy() {
-            return remoteDownloadedBy;
-        }
-
-        public long getRemoteDownloadedTime() {
-            return remoteDownloadedTime;
-        }
-
-        /**
-         * @return remote host the download was triggered by
-         */
-        public String getOrigin() {
-            return origin;
-        }
-
-        /**
-         * @return a path representing artifact download trip
-         */
-        public String getPath() {
-            String pathString;
-            if (path.length() != 0 &&
-                    (pathString = path.toString()).endsWith(PATH_DELIMITER)) {
-                    return StringUtils.replaceLast(pathString, PATH_DELIMITER, "");
-            }
-            return path.toString();
-        }
-
-        /**
-         * @return determination on whether this {@link StatsEvent}
-         *         has remote content
-         */
-        public boolean hasRemoteContent() {
-            return !Strings.isNullOrEmpty(origin);
-        }
-
-        public AtomicLong getLocalEventCount() {
-            return localEventCount;
-        }
-
-        public String getLocalDownloadedBy() {
-            return localDownloadedBy;
-        }
-
-        public long getLocalDownloadedTime() {
-            return localDownloadedTime;
-        }
-    }
-
-    protected abstract SemaphoreWrapper getFlushingSemaphore();
-
-    protected void commitOrRollback(TransactionStatus txStatus) {
-        if (txStatus == null) {
-            return;
-        }
-        if (!txStatus.isRollbackOnly()) {
-            commitTransaction(txStatus);
-        } else {
-            rollbackTransaction(txStatus);
-        }
-    }
-
-    protected boolean isWriteLocked(StatsEvent event) {
-        // Repository service not available in storage test until core module
-        RepositoryService repositoryService = ContextHelper.get().beanForType(RepositoryService.class);
-        if (repositoryService != null) {
-            return repositoryService.isWriteLocked(event.getRepoPath());
-        }
-        return false;
-    }
-
-    protected void commitTransaction(TransactionStatus status) {
-        getTransactionManager().commit(status);
-    }
-
-    protected void rollbackTransaction(TransactionStatus status) {
-        getTransactionManager().rollback(status);
-    }
-
-    protected AbstractPlatformTransactionManager getTransactionManager() {
-        return (AbstractPlatformTransactionManager) ContextHelper.get().getBean("artifactoryTransactionManager");
-    }
-
-    protected TransactionStatus startTransaction() {
-        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
-        def.setName("StatsTransaction");
-        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
-        AbstractPlatformTransactionManager txManager = getTransactionManager();
-        return txManager.getTransaction(def);
-    }
-
-    /**
-     * @param event
-     * @return true if element should be consumed, false otherwise
-     */
-    protected StatsSaveResult createOrUpdateStats(StatsEvent event) {
-        long nodeId = getFileService().getFileNodeId(event.getRepoPath());
-        if (nodeId == DbService.NO_DB_ID) {
-            return StatsSaveResult.Ignored;
-        }
-
-        try {
-            Stat stats = getStatistics(nodeId, event.getOrigin());
-            processStats(event, nodeId, stats);
-            return StatsSaveResult.Updated;
-        } catch (SQLException e) {
-            log.warn("Failed to update stats for " + event.getRepoPath() + ": " + e.getMessage() +
-                    "\nNode may have been deleted?");
-            log.debug("Failed to update stats for " + event.getRepoPath(), e);
-            return StatsSaveResult.Failed;
-        }
-    }
-
-    /**
-     * Load stats from DB
-     *
-     * @param repoPath identifier
-     *
-     * @return {@link StatsInfo}
-     */
-    protected StatsInfo getStatsFromStorage(RepoPath repoPath) {
-        long nodeId = getFileService().getNodeId(repoPath);
-        if (nodeId > DbService.NO_DB_ID) {
-            return loadStats(nodeId);
-        } else {
-            return null;
-        }
-    }
-
-    private StatsInfo loadStats(long nodeId) {
-        try {
-            Stat stats = getStatistics(nodeId);
-            if (stats != null) {
-                return statToStatsInfo(stats);
-            } else {
-                return null;
-            }
-        } catch (SQLException e) {
-            throw new VfsException("Failed to load stats for " + nodeId, e);
-        }
-    }
-
-    /**
-     * Fetches local and remote statistics for specific origin
-     *
-     * @param nodeId - node id
-     * @param origin - origin initiated download
-     *
-     * @return {@link Stat}
-     *
-     * @throws SQLException
-     */
-    private Stat getStatistics(long nodeId, String origin) throws SQLException {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        SmartRepoAddon smartRepoAddon = addonsManager.addonByType(SmartRepoAddon.class);
-        return getStatsDao().getStats(nodeId, origin, smartRepoAddon.supportRemoteStats());
-    }
-
-    /**
-     * get local and remote statistics
-     *
-     * @param nodeId - node id
-     * @return statistics
-     * @throws SQLException
-     */
-    private Stat getStatistics(long nodeId) throws SQLException {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        SmartRepoAddon smartRepoAddon = addonsManager.addonByType(SmartRepoAddon.class);
-        return getStatsDao().getStats(nodeId, smartRepoAddon.supportRemoteStats());
-    }
-
-    /**
-     * Fetches StatsEvent by RepoPath
-     *
-     * @param repoPath
-     *
-     * @return {@link StatsEvent}
-     */
-    protected StatsEvent getStatsFromEvents(RepoPath repoPath) {
-        return getStatsEvents().get(repoPath);
-    }
-
-    /**
-     * Converts Stat to StatsInfo
-     *
-     * @param stat
-     *
-     * @return {@link StatsInfo}
-     */
-    protected StatsInfo statToStatsInfo(Stat stat) {
-        MutableStatsInfo statsInfo = InfoFactoryHolder.get().createStats();
-        statsInfo.setDownloadCount(stat.getLocalDownloadCount());
-        statsInfo.setLastDownloaded(stat.getLocalLastDownloaded());
-        statsInfo.setLastDownloadedBy(stat.getLocalLastDownloadedBy());
-
-        statsInfo.setRemoteDownloadCount(stat.getRemoteDownloadCount());
-        statsInfo.setRemoteLastDownloaded(stat.getRemoteLastDownloaded());
-        statsInfo.setRemoteLastDownloadedBy(stat.getRemoteLastDownloadedBy());
-        statsInfo.setOrigin(stat.getOrigin());
-
-        return statsInfo;
-    }
-
-    /**
-     * Converts StatsInfo to Stat
-     *
-     * @param nodeId
-     * @param statsInfo
-     *
-     * @return {@link Stat}
-     */
-    protected Stat statInfoToStat(long nodeId, StatsInfo statsInfo) {
-        return new Stat(
-                nodeId,
-                statsInfo.getDownloadCount(), statsInfo.getLastDownloaded(), statsInfo.getLastDownloadedBy(),
-                statsInfo.getRemoteDownloadCount(), statsInfo.getRemoteLastDownloaded(), statsInfo.getRemoteLastDownloadedBy()
-        );
-    }
-
-    /**
-     * Performs stats processing
-     *
-     * @param event
-     * @param nodeId
-     * @param stats
-     * 
-     * @throws SQLException
-     */
-    protected abstract void processStats(StatsEvent event, long nodeId, Stat stats) throws SQLException;
-
-    /**
-     * Occurs before traversing queued events
-     */
-    protected abstract void onTraversingStart();
-
-    /**
-     * Occurs after traversing queued events
-     */
-    protected abstract void onTraversingEnd();
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/service/ArchiveEntriesServiceImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/service/ArchiveEntriesServiceImpl.java
deleted file mode 100644
index f7715ea..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/service/ArchiveEntriesServiceImpl.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.service;
-
-import com.google.common.collect.Sets;
-import org.artifactory.fs.ZipEntryInfo;
-import org.artifactory.model.xstream.fs.ZipEntryImpl;
-import org.artifactory.storage.StorageException;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.db.fs.dao.ArchiveEntriesDao;
-import org.artifactory.storage.db.fs.entity.ArchiveEntry;
-import org.artifactory.storage.fs.VfsException;
-import org.artifactory.storage.fs.service.ArchiveEntriesService;
-import org.artifactory.util.PathUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nonnull;
-import java.sql.SQLException;
-import java.util.Set;
-
-/**
- * A business service to interact with the archive entries table.
- *
- * @author Yossi Shaul
- */
- at Service
-public class ArchiveEntriesServiceImpl implements ArchiveEntriesService {
-
-    @Autowired
-    private DbService dbService;
-
-    @Autowired
-    private ArchiveEntriesDao archiveEntriesDao;
-
-    @Override
-    public boolean isIndexed(String archiveSha1) {
-        try {
-            return archiveEntriesDao.isIndexed(archiveSha1);
-        } catch (SQLException e) {
-            throw new VfsException("Failed to check indexed entries for '" + archiveSha1 + "'", e);
-        }
-    }
-
-    @Override
-    @Nonnull
-    public Set<ZipEntryInfo> getArchiveEntries(String archiveSha1) {
-        try {
-            Set<ArchiveEntry> archiveEntries = archiveEntriesDao.loadByChecksum(archiveSha1);
-            Set<ZipEntryInfo> entries = Sets.newLinkedHashSet();
-            for (ArchiveEntry entry : archiveEntries) {
-                entries.add(new ZipEntryImpl(entry.getPathName(), false));
-            }
-            return entries;
-        } catch (SQLException e) {
-            throw new StorageException("Failed to load archive entries for " + archiveSha1, e);
-        }
-    }
-
-    @Override
-    public void addArchiveEntries(String archiveSha1, Set<? extends ZipEntryInfo> entries) {
-        // insert main entry to the indexed_archives table
-        try {
-            // create indexed_archives row
-            long indexedArchiveId = dbService.nextId();
-            if (!archiveEntriesDao.createIndexedArchive(archiveSha1, indexedArchiveId)) {
-                throw new StorageException("Failed to insert indexed archive entry for " + archiveSha1);
-            }
-
-            for (ZipEntryInfo zipEntry : entries) {
-                // for each entry add one new row to the many to many and to the entries path
-                ArchiveEntry archiveEntry = zipEntryInfoToArchiveEntry(archiveSha1, zipEntry);
-
-                // select or create id from archive path
-                long archivePathId = archiveEntriesDao.findArchivePathId(archiveEntry.getEntryPath());
-                if (archivePathId == DbService.NO_DB_ID) {
-                    archivePathId = dbService.nextId();
-                    if (!archiveEntriesDao.createArchivePath(archivePathId, archiveEntry.getEntryPath())) {
-                        throw new StorageException("Failed to insert archive path: " + archiveEntry.getEntryPath());
-                    }
-                }
-
-                // select or create id from archive name
-                long archiveNameId = archiveEntriesDao.findArchiveNameId(archiveEntry.getEntryName());
-                if (archiveNameId == DbService.NO_DB_ID) {
-                    archiveNameId = dbService.nextId();
-                    if (!archiveEntriesDao.createArchiveName(archiveNameId, archiveEntry.getEntryName())) {
-                        throw new StorageException("Failed to insert archive name: " + archiveEntry.getEntryName());
-                    }
-                }
-
-                // before inserting to the many to many relation check that such entry doesn't entry doesn't exist
-                // this might happen for example in case insensitive databases if the archive contains two entries
-                // with difference only is character casing
-                if (!archiveEntriesDao.hasIndexedArchivesEntries(indexedArchiveId, archivePathId, archiveNameId)) {
-                    archiveEntriesDao.createIndexedArchivesEntries(indexedArchiveId, archivePathId, archiveNameId);
-                }
-            }
-        } catch (SQLException e) {
-            throw new StorageException("Failed to insert archive entries: " + e.getMessage(), e);
-        }
-    }
-
-    private ArchiveEntry zipEntryInfoToArchiveEntry(String archiveSha1, ZipEntryInfo entry) {
-        String path = PathUtils.getParent(entry.getPath());
-        return new ArchiveEntry(archiveSha1, path, entry.getName());
-    }
-
-    @Override
-    public boolean deleteArchiveEntries(String archiveSha1) {
-        try {
-            return archiveEntriesDao.deleteByChecksum(archiveSha1) > 0;
-        } catch (SQLException e) {
-            throw new VfsException("Failed to delete indexed entries for '" + archiveSha1 + "'", e);
-        }
-    }
-
-    @Override
-    public int deleteUnusedPathIds() {
-        try {
-            return archiveEntriesDao.deleteUnusedPathIds();
-        } catch (SQLException e) {
-            throw new StorageException("Failed to delete unused path ids", e);
-        }
-    }
-
-    @Override
-    public int deleteUnusedNameIds() {
-        try {
-            return archiveEntriesDao.deleteUnusedNameIds();
-        } catch (SQLException e) {
-            throw new StorageException("Failed to delete unused path ids", e);
-        }
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/service/ConfigsServiceImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/service/ConfigsServiceImpl.java
deleted file mode 100644
index 9e54345..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/service/ConfigsServiceImpl.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.service;
-
-import org.artifactory.storage.StorageException;
-import org.artifactory.storage.db.fs.dao.ConfigsDao;
-import org.artifactory.storage.db.util.blob.BlobWrapper;
-import org.artifactory.storage.fs.service.ConfigsService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.sql.SQLException;
-
-/**
- * Stores and retrieves configs from the database.
- *
- * @author Yossi Shaul
- */
- at Service
-public class ConfigsServiceImpl implements ConfigsService {
-    private static final Logger log = LoggerFactory.getLogger(ConfigsServiceImpl.class);
-
-    @Autowired
-    ConfigsDao configsDao;
-
-    @Override
-    public void addConfig(String name, String data) {
-        try {
-            if (hasConfig(name)) {
-                throw new IllegalStateException("Attempt to add an existing config: '" + name + "'");
-            }
-            configsDao.createConfig(name, data);
-        } catch (SQLException | UnsupportedEncodingException e) {
-            throw new StorageException("Failed to create config '" + name + "': " + e.getMessage(), e);
-        }
-    }
-
-    private void addConfig(String name, InputStream data, long length) {
-        try {
-            if (hasConfig(name)) {
-                throw new IllegalStateException("Attempt to add an existing config: '" + name + "'");
-            }
-            configsDao.createConfig(name, new BlobWrapper(data, length));
-        } catch (SQLException e) {
-            throw new StorageException("Failed to create config '" + name + "': " + e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public boolean hasConfig(String name) {
-        try {
-            return configsDao.hasConfig(name);
-        } catch (SQLException e) {
-            throw new StorageException("Failed to check for config '" + name + "' existence: " + e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public String getConfig(String name) {
-        try {
-            return configsDao.loadConfig(name);
-        } catch (SQLException e) {
-            throw new StorageException("Failed to retrieve config '" + name + "': " + e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public InputStream getStreamConfig(String name) {
-        try {
-            return configsDao.loadStreamConfig(name);
-        } catch (SQLException e) {
-            throw new StorageException("Failed to retrieve config '" + name + "': " + e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public void deleteConfig(String name) {
-        try {
-            int deleted = configsDao.deleteConfig(name);
-            if (deleted == 0) {
-                log.debug("Deletion of config entry " + name + " did not delete anything in DB!");
-            } else {
-                log.debug("Deleted config entry " + name);
-            }
-        } catch (SQLException e) {
-            throw new StorageException("Failed to delete config '" + name + "': " + e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public void updateConfig(String name, String data) {
-        try {
-            int updateCount = configsDao.updateConfig(name, data);
-            if (updateCount == 0) {
-                throw new IllegalStateException("Failed to update config '" + name + "'. Config doesn't exist");
-            }
-        } catch (UnsupportedEncodingException | SQLException e) {
-            throw new StorageException("Failed to update config '" + name + "': " + e.getMessage(), e);
-        }
-    }
-
-    private void updateConfig(String name, InputStream data, long length) {
-        try {
-            int updateCount = configsDao.updateConfig(name, new BlobWrapper(data, length));
-            if (updateCount == 0) {
-                throw new IllegalStateException("Failed to update config '" + name + "'. Config doesn't exist");
-            }
-        } catch (SQLException e) {
-            throw new StorageException("Failed to update config '" + name + "': " + e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public boolean addOrUpdateConfig(String name, InputStream data, long length) {
-        if (hasConfig(name)) {
-            updateConfig(name, data, length);
-            return false;
-        } else {
-            addConfig(name, data, length);
-            return true;
-        }
-    }
-
-    @Override
-    public boolean addOrUpdateConfig(String name, String data) {
-        if (hasConfig(name)) {
-            updateConfig(name, data);
-            return false;
-        } else {
-            addConfig(name, data);
-            return true;
-        }
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/service/DbPropertiesServiceImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/service/DbPropertiesServiceImpl.java
deleted file mode 100644
index d0dbf8f..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/service/DbPropertiesServiceImpl.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.service;
-
-import org.artifactory.md.Properties;
-import org.artifactory.model.xstream.fs.PropertiesImpl;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.storage.StorageException;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.db.fs.dao.PropertiesDao;
-import org.artifactory.storage.db.fs.entity.NodeProperty;
-import org.artifactory.storage.fs.service.FileService;
-import org.artifactory.storage.fs.service.PropertiesService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nonnull;
-import java.sql.SQLException;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Yossi Shaul
- */
- at Service
-public class DbPropertiesServiceImpl implements PropertiesService {
-
-    @Autowired
-    private DbService dbService;
-
-    @Autowired
-    private PropertiesDao propertiesDao;
-
-    @Autowired
-    private FileService fileService;
-
-    //TODO: [by YS] check how to pass an id instead of finding the id for each repo path passed
-
-    @Override
-    public Properties getProperties(RepoPath repoPath) {
-        long nodeId = fileService.getNodeId(repoPath);
-        if (nodeId > 0) {
-            return loadProperties(nodeId);
-        } else {
-            return new PropertiesImpl();
-        }
-    }
-
-    @Override
-    @Nonnull
-    public Properties loadProperties(long nodeId) {
-        try {
-            List<NodeProperty> nodeProperties = propertiesDao.getNodeProperties(nodeId);
-            PropertiesImpl properties = new PropertiesImpl();
-            for (NodeProperty nodeProperty : nodeProperties) {
-                properties.put(nodeProperty.getPropKey(), nodeProperty.getPropValue());
-            }
-            return properties;
-        } catch (SQLException e) {
-            throw new StorageException("Failed to load properties for " + nodeId, e);
-        }
-    }
-
-    @Override
-    public boolean hasProperties(RepoPath repoPath) {
-        long nodeId = fileService.getNodeId(repoPath);
-        try {
-            if (nodeId > 0) {
-                return propertiesDao.hasNodeProperties(nodeId);
-            } else {
-                return false;
-            }
-        } catch (SQLException e) {
-            throw new StorageException("Failed to check properties for " + repoPath, e);
-        }
-    }
-
-    /**
-     * Sets properties
-     *
-     * @param nodeId     Id of the node to set properties on
-     * @param properties The properties to set
-     */
-    @Override
-    public void setProperties(long nodeId, Properties properties) {
-        try {
-            // first delete existing properties is exist
-            deleteProperties(nodeId);
-
-            // create record for each node property. one record for each key/value combination
-            for (Map.Entry<String, String> propEntry : properties.entries()) {
-                NodeProperty property = new NodeProperty(dbService.nextId(), nodeId, propEntry.getKey(),
-                        propEntry.getValue());
-                propertiesDao.create(property);
-            }
-        } catch (SQLException e) {
-            throw new StorageException("Failed to set properties on node: " + nodeId, e);
-        }
-    }
-
-    /**
-     * Sets properties
-     *
-     * @param repoPath   RepoPath of the node to set properties on
-     * @param properties The properties to set
-     */
-    @Override
-    public void setProperties(RepoPath repoPath, Properties properties) {
-        long nodeId = fileService.getNodeId(repoPath);
-        if (nodeId > 0) {
-           setProperties(nodeId, properties);
-        }
-    }
-
-    @Override
-    public int deleteProperties(long nodeId) {
-        try {
-            return propertiesDao.deleteNodeProperties(nodeId);
-        } catch (SQLException e) {
-            throw new StorageException("Failed to delete properties for node: " + nodeId, e);
-        }
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/service/FileServiceImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/service/FileServiceImpl.java
deleted file mode 100644
index e9c5950..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/service/FileServiceImpl.java
+++ /dev/null
@@ -1,484 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.service;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.repo.exception.FileExpectedException;
-import org.artifactory.api.repo.exception.FolderExpectedException;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.checksum.ChecksumsInfo;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.model.xstream.fs.FileInfoImpl;
-import org.artifactory.model.xstream.fs.FolderInfoImpl;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.fs.VfsItem;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.db.fs.dao.NodesDao;
-import org.artifactory.storage.db.fs.entity.Node;
-import org.artifactory.storage.db.fs.entity.NodeBuilder;
-import org.artifactory.storage.db.fs.entity.NodePath;
-import org.artifactory.storage.db.fs.model.DbFsFile;
-import org.artifactory.storage.db.fs.model.DbFsFolder;
-import org.artifactory.storage.fs.VfsException;
-import org.artifactory.storage.fs.VfsItemNotFoundException;
-import org.artifactory.storage.fs.repo.RepoStorageSummary;
-import org.artifactory.storage.fs.repo.StoringRepo;
-import org.artifactory.storage.fs.service.FileService;
-import org.artifactory.util.PathValidator;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nonnull;
-import java.sql.SQLException;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * @author Yossi Shaul
- */
- at SuppressWarnings("DuplicateThrows")
- at Service
-public class FileServiceImpl implements FileService {
-    private static final Logger log = LoggerFactory.getLogger(FileServiceImpl.class);
-
-    @Autowired
-    private DbService dbService;
-
-    @Autowired
-    private NodesDao nodesDao;
-
-    @Override
-    public boolean exists(RepoPath repoPath) throws VfsException {
-        try {
-            return nodesDao.exists(NodePath.fromRepoPath(repoPath));
-        } catch (SQLException e) {
-            log.debug("Failed existence check of path '{}", repoPath, e);
-            throw new VfsException("Failed existence check of path '" + repoPath + "'", e);
-        }
-    }
-
-    @Override
-    public ItemInfo loadItem(RepoPath repoPath) throws VfsItemNotFoundException, VfsException {
-        Node node = loadNode(repoPath);
-        return itemInfoFromNode(node);
-    }
-
-    @Override
-    public ItemInfo loadItem(long id) {
-        Node node = loadNode(id);
-        return itemInfoFromNode(node);
-    }
-
-    @Override
-    public VfsItem loadVfsItem(StoringRepo storingRepo, RepoPath repoPath)
-            throws VfsItemNotFoundException, VfsException {
-        Node node = loadNode(repoPath);
-        return fsItemFromNode(storingRepo, node);
-    }
-
-    @Override
-    public long createFolder(FolderInfo folder) throws VfsException {
-        PathValidator.validate(folder.getRepoPath().toPath());
-        //TODO: [by YS] verify parent exists?
-        long nodeId = dbService.nextId();
-        Node node = folderInfoToNode(nodeId, folder);
-        int updateCount;
-        try {
-            updateCount = nodesDao.create(node);
-        } catch (SQLException e) {
-            throw new VfsException(e);
-        }
-        if (updateCount != 1) {
-            // Create new node should return with exactly 1 record updated
-            throw new IllegalStateException("Unexpected update count when creating new node: '" +
-                    node.getNodePath() + "'");
-        }
-        return nodeId;
-    }
-
-    @Override
-    public int updateFolder(long id, FolderInfo folder) {
-        log.debug("Updating folder: {}", folder.getRepoPath());
-        try {
-            return nodesDao.update(folderInfoToNode(id, folder));
-        } catch (SQLException e) {
-            throw new VfsException("Failed to update folder: '" + folder.getRepoPath() + "' id: '" + id + "': " +
-                    e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public long createFile(FileInfo file) {
-        PathValidator.validate(file.getRepoPath().toPath());
-        //TODO: [by YS] verify parent exists?
-        log.debug("Creating file {}", file.getRepoPath());
-        long nodeId = dbService.nextId();
-        Node node = fileInfoToNode(nodeId, file);
-        int updateCount;
-        try {
-            updateCount = nodesDao.create(node);
-        } catch (SQLException e) {
-            throw new VfsException(e);
-        }
-        if (updateCount != 1) {
-            // Create new node should return with exactly 1 record updated
-            throw new IllegalStateException("Unexpected update count when creating new node: '" +
-                    node.getNodePath() + "'");
-        }
-        return nodeId;
-    }
-
-    @Override
-    public int updateFile(long id, FileInfo file) {
-        log.debug("Updating file: {}", file.getRepoPath());
-        try {
-            return nodesDao.update(fileInfoToNode(id, file));
-        } catch (SQLException e) {
-            throw new VfsException("Failed to update file: '" + file.getRepoPath() + "' id: '" + id + "': " +
-                    e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public boolean deleteItem(long id) {
-        try {
-            return nodesDao.delete(id);
-        } catch (SQLException e) {
-            throw new VfsException("Failed to delete item with id '" + id + "': " + e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public boolean hasChildren(RepoPath repoPath) {
-        try {
-            return nodesDao.hasChildren(NodePath.fromRepoPath(repoPath));
-        } catch (SQLException e) {
-            throw new VfsException("Failed to check for children of: '" + repoPath + "': " + e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public void printNodesTable() {
-        if (!ConstantValues.dev.getBoolean()) {
-            return;
-        }
-        try {
-            List<? extends Node> nodes = nodesDao.getAllNodes();
-            StringBuilder sb = new StringBuilder(String.format(
-                    "%-4s%-4s %-16s%-44s%-16s%n", "ID", "Depth", "Repo", "Path", "Name"));
-            for (Node n : nodes) {
-                sb.append(String.format("%-4s%4s  %-16s%-44s%-16s%n",
-                        n.getNodeId(), n.getRepo(), n.getPath(), n.getName(), n.getDepth()));
-
-            }
-            log.trace("Dumping Checksum Paths Table ({} records):\n {}", nodes.size(), sb);
-        } catch (SQLException e) {
-            log.error("Failed to print nodes table");
-        }
-    }
-
-    @Override
-    public long getNodeId(RepoPath repoPath) {
-        //TODO: [by YS] requires caching
-        try {
-            return nodesDao.getNodeId(NodePath.fromRepoPath(repoPath));
-        } catch (SQLException e) {
-            throw new VfsException("Couldn't get node id for: " + repoPath, e);
-        }
-    }
-
-    @Override
-    public long getFileNodeId(RepoPath repoPath) {
-        //TODO: [by YS] requires caching
-        try {
-            return nodesDao.getFileNodeId(NodePath.fromRepoPath(repoPath));
-        } catch (SQLException e) {
-            throw new VfsException("Couldn't get node id for: " + repoPath, e);
-        }
-    }
-
-    @Override
-    public String getNodeSha1(RepoPath repoPath) {
-        try {
-            return nodesDao.getNodeSha1(NodePath.fromRepoPath(repoPath));
-        } catch (SQLException e) {
-            throw new VfsException("Couldn't get node id for: " + repoPath, e);
-        }
-    }
-
-    private Node loadNode(RepoPath repoPath) throws VfsItemNotFoundException, VfsException {
-        try {
-            Node node = nodesDao.get(NodePath.fromRepoPath(repoPath));
-            if (node == null) {
-                throw new VfsItemNotFoundException("Item not found: '" + repoPath + "'");
-            }
-            return node;
-        } catch (SQLException e) {
-            throw new VfsException("Failed to load item '" + repoPath + "'", e);
-        }
-    }
-
-    private Node loadNode(long id) throws VfsItemNotFoundException, VfsException {
-        try {
-            Node node = nodesDao.get(id);
-            if (node == null) {
-                throw new VfsItemNotFoundException("Item not found for id '" + id + "'");
-            }
-            return node;
-        } catch (SQLException e) {
-            throw new VfsException("Failed to load item with id '" + id + "'", e);
-        }
-    }
-
-    @Override
-    @Nonnull
-    public List<ItemInfo> loadChildren(RepoPath repoPath) throws VfsException {
-        //TODO: [by YS] consider always sorting by name to help prevent locking errors later
-        try {
-            List<Node> childrenNode = nodesDao.getChildren(NodePath.fromRepoPath(repoPath));
-            List<ItemInfo> children = Lists.newArrayList();
-            for (Node child : childrenNode) {
-                children.add(itemInfoFromNode(child));
-            }
-            return children;
-        } catch (SQLException e) {
-            throw new VfsException("Failed to load children for node '" + repoPath + "'", e);
-        }
-    }
-
-    @Override
-    public int getFilesCount() throws VfsException {
-        try {
-            return nodesDao.getFilesCount();
-        } catch (SQLException e) {
-            throw new VfsException(e);
-        }
-    }
-
-    @Override
-    public int getFilesCount(RepoPath repoPath) throws VfsException {
-        try {
-            if (repoPath.isRoot()) {
-                return nodesDao.getFilesCount(repoPath.getRepoKey());
-            } else {
-                return nodesDao.getFilesCount(NodePath.fromRepoPath(repoPath));
-            }
-        } catch (SQLException e) {
-            throw new VfsException(e);
-        }
-    }
-
-    @Override
-    public long getFilesTotalSize(RepoPath repoPath) {
-        try {
-            if (repoPath.isRoot()) {
-                return nodesDao.getFilesTotalSize(repoPath.getRepoKey());
-            } else {
-                return nodesDao.getFilesTotalSize(NodePath.fromRepoPath(repoPath));
-            }
-        } catch (SQLException e) {
-            throw new VfsException(e);
-        }
-    }
-
-    @Override
-    public int getNodesCount(RepoPath repoPath) throws VfsException {
-        try {
-            if (repoPath.isRoot()) {
-                return nodesDao.getNodesCount(repoPath.getRepoKey());
-            } else {
-                return nodesDao.getNodesCount(NodePath.fromRepoPath(repoPath));
-            }
-        } catch (SQLException e) {
-            throw new VfsException(e);
-        }
-    }
-
-    @Override
-    public List<FileInfo> searchFilesByProperty(String repo, String propKey, String propValue) {
-        try {
-            List<Node> childrenNode = nodesDao.searchFilesByProperty(repo, propKey, propValue);
-            List<FileInfo> children = Lists.newArrayList();
-            for (Node child : childrenNode) {
-                children.add(fileInfoFromNode(child));
-            }
-            return children;
-        } catch (SQLException e) {
-            throw new VfsException("Search by properties failed: " + e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public List<FileInfo> searchGrandchildPoms(RepoPath repoPath) {
-        try {
-            List<Node> nodes = nodesDao.searchGrandchildPoms(NodePath.fromRepoPath(repoPath));
-            return nodes.stream().map(this::fileInfoFromNode).collect(Collectors.toList());
-        } catch (SQLException e) {
-            throw new VfsException("Search by properties failed: " + e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public List<FileInfo> searchFilesWithBadChecksum(ChecksumType type) {
-        try {
-            List<Node> childrenNode = nodesDao.searchBadChecksums(type);
-            List<FileInfo> children = Lists.newArrayList();
-            for (Node child : childrenNode) {
-                children.add(fileInfoFromNode(child));
-            }
-            return children;
-        } catch (SQLException e) {
-            throw new VfsException("Search files with bad checksum failed: " + e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public Set<RepoStorageSummary> getRepositoriesStorageSummary() {
-        try {
-            return nodesDao.getRepositoriesStorageSummary();
-        } catch (SQLException e) {
-            throw new VfsException("Repository storage summary failed with exception: " + e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public List<ItemInfo> getOrphanItems(RepoPath repoPath) {
-        try {
-            List<Node> orphanNodes = nodesDao.getOrphanNodes(NodePath.fromRepoPath(repoPath));
-            List<ItemInfo> orphanItems = Lists.newArrayList();
-            for (Node orphanNode : orphanNodes) {
-                orphanItems.add(itemInfoFromNode(orphanNode));
-            }
-            return orphanItems;
-        } catch (SQLException e) {
-            throw new VfsException("Failed to find orphan nodes under: '" + repoPath + "': " + e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public void debugNodeStructure(RepoPath repoPath) throws VfsException {
-        log.info("************************ Tree structure dump ************************");
-        debugNodeStructure(loadItem(repoPath), 0);
-        log.info("*********************************************************************");
-    }
-
-    private void debugNodeStructure(ItemInfo item, int depth) throws VfsException {
-        StringBuilder itemString = new StringBuilder(depth * 2);
-        for (int i = 0; i < depth; i++) {
-            itemString.append("  ");
-        }
-        itemString.append(item.getRepoKey()).append("/").append(item.getRelPath())
-                .append(" (").append(item).append(") ");
-        log.info(itemString.toString());
-        if (item.isFolder()) {
-            for (ItemInfo child : loadChildren(item.getRepoPath())) {
-                debugNodeStructure(child, depth + 1);
-            }
-        }
-    }
-
-    private Node folderInfoToNode(long nodeId, FolderInfo folder) {
-        return itemNodeBuilder(nodeId, folder).file(false).build();
-    }
-
-    private Node fileInfoToNode(long nodeId, FileInfo file) {
-        NodeBuilder builder = itemNodeBuilder(nodeId, file).file(true);
-
-        builder.length(file.getSize());
-
-        ChecksumsInfo checksums = file.getChecksumsInfo();
-        ChecksumInfo sha1Checksums = checksums.getChecksumInfo(ChecksumType.sha1);
-        if (sha1Checksums == null || StringUtils.isBlank(sha1Checksums.getActual())) {
-            throw new VfsException("Cannot persist file '" + file.getRepoPath() + "' without sha1 checksum");
-        }
-        builder.sha1Actual(sha1Checksums.getActual()).sha1Original(sha1Checksums.getOriginalOrNoOrig());
-
-        ChecksumInfo md5Checksums = checksums.getChecksumInfo(ChecksumType.md5);
-        if (md5Checksums != null) {
-            builder.md5Actual(md5Checksums.getActual()).md5Original(md5Checksums.getOriginalOrNoOrig());
-        }
-        return builder.build();
-    }
-
-    private NodeBuilder itemNodeBuilder(long nodeId, ItemInfo item) {
-        return new NodeBuilder().nodeId(nodeId).nodePath(item.getRepoPath())
-                .created(item.getCreated()).createdBy(item.getCreatedBy())
-                .modified(item.getLastModified()).modifiedBy(item.getModifiedBy())
-                .updated(item.getLastUpdated());
-    }
-
-    private ItemInfo itemInfoFromNode(Node node) {
-        if (node.isFile()) {
-            return fileInfoFromNode(node);
-        } else {
-            return folderInfoFromNode(node);
-        }
-    }
-
-    private FolderInfo folderInfoFromNode(Node node) {
-        if (node.isFile()) {
-            throw new FolderExpectedException(node.getNodePath().toRepoPath());
-        }
-        FolderInfoImpl folderInfo = new FolderInfoImpl(node.getNodePath().toRepoPath());
-        folderInfo.setCreated(node.getCreated());
-        folderInfo.setCreatedBy(node.getCreatedBy());
-        folderInfo.setLastModified(node.getModified());
-        folderInfo.setModifiedBy(node.getModifiedBy());
-        folderInfo.setLastUpdated(node.getUpdated());
-        return folderInfo;
-    }
-
-    private FileInfo fileInfoFromNode(Node node) {
-        if (!node.isFile()) {
-            throw new FileExpectedException(node.getNodePath().toRepoPath());
-        }
-        FileInfoImpl fileInfo = new FileInfoImpl(node.getNodePath().toRepoPath());
-        fileInfo.setCreated(node.getCreated());
-        fileInfo.setCreatedBy(node.getCreatedBy());
-        fileInfo.setLastModified(node.getModified());
-        fileInfo.setModifiedBy(node.getModifiedBy());
-        fileInfo.setLastUpdated(node.getUpdated());
-        Set<ChecksumInfo> checksums = Sets.newHashSet(
-                new ChecksumInfo(ChecksumType.sha1, node.getSha1Original(), node.getSha1Actual()),
-                new ChecksumInfo(ChecksumType.md5, node.getMd5Original(), node.getMd5Actual())
-        );
-        fileInfo.setChecksums(checksums);
-        fileInfo.setSize(node.getLength());
-        return fileInfo;
-    }
-
-    private VfsItem fsItemFromNode(StoringRepo storingRepo, Node node) {
-        if (node.isFile()) {
-            FileInfo fileInfo = fileInfoFromNode(node);
-            return new DbFsFile(storingRepo, node.getNodeId(), fileInfo);
-        } else {
-            FolderInfo folderInfo = folderInfoFromNode(node);
-            return new DbFsFolder(storingRepo, node.getNodeId(), folderInfo);
-        }
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/service/NodeMetaInfoServiceImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/service/NodeMetaInfoServiceImpl.java
deleted file mode 100644
index 6a876d0..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/service/NodeMetaInfoServiceImpl.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.service;
-
-import org.artifactory.repo.RepoPath;
-import org.artifactory.storage.db.fs.dao.NodeMetaInfoDao;
-import org.artifactory.storage.db.fs.entity.NodeMetaInfo;
-import org.artifactory.storage.fs.VfsException;
-import org.artifactory.storage.fs.service.FileService;
-import org.artifactory.storage.fs.service.ItemMetaInfo;
-import org.artifactory.storage.fs.service.NodeMetaInfoService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nullable;
-import java.sql.SQLException;
-
-/**
- * A business service to interact with the node node meta info table.
- *
- * @author Yossi Shaul
- */
- at Service
-public class NodeMetaInfoServiceImpl implements NodeMetaInfoService {
-
-    @Autowired
-    private NodeMetaInfoDao nodeMetaInfoDao;
-
-    @Autowired
-    private FileService fileService;
-
-    @Override
-    @Nullable
-    public ItemMetaInfo getNodeMetaInfo(RepoPath repoPath) {
-        long nodeId = fileService.getNodeId(repoPath);
-        try {
-            NodeMetaInfo nodeMetadata = nodeMetaInfoDao.getNodeMetadata(nodeId);
-            if (nodeMetadata != null) {
-                return itemMetaInfoFromNodeMetaInfo(nodeMetadata);
-            } else {
-                return null;
-            }
-        } catch (SQLException e) {
-            throw new VfsException("Failed to load node metadata info", e);
-        }
-    }
-
-    @Override
-    public void createOrUpdateNodeMetaInfo(long nodeId, ItemMetaInfo metaInfo) {
-        NodeMetaInfo nodeMetaInfo = nodeMetaInfoFromItemMetaInfo(nodeId, metaInfo);
-        try {
-            if (nodeMetaInfoDao.hasNodeMetadata(nodeId)) {
-                nodeMetaInfoDao.update(nodeMetaInfo);
-            } else {
-                nodeMetaInfoDao.create(nodeMetaInfo);
-            }
-        } catch (SQLException e) {
-            throw new VfsException("Failed to create or update node metadata info", e);
-        }
-    }
-
-    @Override
-    public boolean hasNodeMetadata(RepoPath repoPath) {
-        long nodeId = fileService.getNodeId(repoPath);
-        try {
-            return nodeMetaInfoDao.hasNodeMetadata(nodeId);
-        } catch (SQLException e) {
-            throw new VfsException("Failed to load node metadata info", e);
-        }
-    }
-
-    @Override
-    public void deleteMetaInfo(RepoPath repoPath) {
-        long nodeId = fileService.getNodeId(repoPath);
-        deleteMetaInfo(nodeId);
-    }
-
-    @Override
-    public void deleteMetaInfo(long nodeId) {
-        try {
-            nodeMetaInfoDao.deleteNodeMeta(nodeId);
-        } catch (SQLException e) {
-            throw new VfsException("Failed to delete node metadata info", e);
-        }
-    }
-
-    private ItemMetaInfo itemMetaInfoFromNodeMetaInfo(NodeMetaInfo nodeMetadata) {
-        return new ItemMetaInfo(nodeMetadata.getPropsModified(), nodeMetadata.getPropsModifiedBy());
-    }
-
-    private NodeMetaInfo nodeMetaInfoFromItemMetaInfo(long nodeId, ItemMetaInfo metaInfo) {
-        return new NodeMetaInfo(nodeId, metaInfo.getPropsModified(), metaInfo.getPropsModifiedBy());
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/service/StatsPersistingService.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/service/StatsPersistingService.java
deleted file mode 100644
index dfe732b..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/service/StatsPersistingService.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.service;
-
-import org.artifactory.storage.fs.service.StatsService;
-
-/**
- * Internal interface for the stats service to support annotated transactions.
- *
- * @author Yossi Shaul
- */
-public interface StatsPersistingService extends StatsService {
-
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/service/StatsPersistingServiceImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/service/StatsPersistingServiceImpl.java
deleted file mode 100644
index efbbb99..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/service/StatsPersistingServiceImpl.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.service;
-
-import com.google.common.base.Strings;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.addon.ha.semaphore.SemaphoreWrapper;
-import org.artifactory.addon.smartrepo.SmartRepoAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.fs.StatsInfo;
-import org.artifactory.model.xstream.fs.StatsImpl;
-import org.artifactory.repo.RemoteRepoPath;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.storage.StorageException;
-import org.artifactory.storage.db.fs.entity.Stat;
-import org.artifactory.storage.fs.VfsException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import java.sql.SQLException;
-import java.util.Map;
-
-/**
- * A business service to interact with the node stats table.
- *
- * @author Yossi Shaul
- */
- at Service
-public class StatsPersistingServiceImpl extends AbstractStatsService implements StatsPersistingService {
-
-    private static final Logger log = LoggerFactory.getLogger(StatsPersistingServiceImpl.class);
-    private SemaphoreWrapper flushingSemaphore;
-
-    /**
-     * Collects storage and cache stats
-     *
-     * @param repoPath
-     *
-     * @return {@link StatsInfo}
-     */
-    @Override
-    public StatsInfo getStats(RepoPath repoPath) {
-        StatsImpl mergedStats = null;
-        StatsInfo statsInfo = getStatsFromStorage(repoPath);
-        StatsEvent event = getStatsFromEvents(repoPath);
-
-        if (event != null) {
-            // return the merged results between the storage and the event
-            long localDownloadCount = event.getLocalEventCount().get() +
-                    (statsInfo != null ? statsInfo.getDownloadCount() : 0);
-
-            // return the merged results between the storage and the event
-            long downloadRemoteCount = event.getRemoteEventCount().get() +
-                    (statsInfo != null ? statsInfo.getRemoteDownloadCount() : 0);
-
-            mergedStats = new StatsImpl(statsInfo);
-            mergedStats.setDownloadCount(localDownloadCount);
-            if(!Strings.isNullOrEmpty(event.getLocalDownloadedBy())) {
-                mergedStats.setLastDownloaded(event.getLocalDownloadedTime());
-                mergedStats.setLastDownloadedBy(event.getLocalDownloadedBy());
-            }
-
-            mergedStats.setRemoteDownloadCount(downloadRemoteCount);
-            if(!Strings.isNullOrEmpty(event.getOrigin())) {
-                mergedStats.setRemoteLastDownloaded(event.getRemoteDownloadedTime());
-                mergedStats.setRemoteLastDownloadedBy(event.getRemoteDownloadedBy());
-                mergedStats.setOrigin(event.getOrigin());
-            }
-            return mergedStats;
-        } else if (statsInfo != null) {
-            mergedStats = new StatsImpl(statsInfo);
-            return injectRemoteEvents(repoPath, mergedStats);
-        }
-        return statsInfo;
-    }
-
-    /**
-     * Aggregate and injects remote events counters to mergedStats
-     *
-     * statistics events may come from different origins for same repoPath,
-     * in sake if origin uniqueness, we maintain event per origin, but when
-     * we need statistics for specific repoPath, we need to accumulate all
-     * remote events for the repoPath
-     *
-     * @param repoPath {@link RepoPath}
-     * @param mergedStats statistics holder to merge to
-     *
-     * @return mergedStats
-     */
-    private StatsInfo injectRemoteEvents(RepoPath repoPath, StatsImpl mergedStats) {
-        for(Map.Entry<RepoPath, StatsEvent> entry : getStatsEvents().entrySet()) {
-            if(!entry.getValue().hasRemoteContent()) continue;
-            if(entry.getKey() instanceof RemoteRepoPath) {
-            // TODO: do we need this ^ ? previous line makes sure we have RemoteContent
-                if(((RemoteRepoPath)entry.getKey()).getActualRepoPath().equals(repoPath)){
-                    if(mergedStats == null) {
-                        mergedStats = new StatsImpl();
-                    }
-                    merge(entry.getValue(), mergedStats);
-                }
-            }
-        }
-
-        return mergedStats;
-    }
-
-    /**
-     * Performs merge of an {@link StatsEvent} into {@link StatsImpl}
-     *
-     * @param statsEvent
-     * @param mergedStats
-     */
-    private void merge(StatsEvent statsEvent, StatsImpl mergedStats) {
-        if (statsEvent != null) {
-
-            long downloadRemoteCount = statsEvent.getRemoteEventCount().get() +
-                    (mergedStats != null ? mergedStats.getRemoteDownloadCount() : 0);
-
-            mergedStats.setRemoteDownloadCount(downloadRemoteCount);
-
-            if(statsEvent.getRemoteDownloadedTime() > mergedStats.getRemoteLastDownloaded()) {
-                mergedStats.setRemoteLastDownloaded(statsEvent.getRemoteDownloadedTime());
-                mergedStats.setRemoteLastDownloadedBy(statsEvent.getRemoteDownloadedBy());
-                mergedStats.setOrigin(statsEvent.getOrigin());
-            }
-        }
-    }
-
-    /**
-     * Triggered on artifact local download event,
-     * queueing event for delegation
-     *
-     * @param repoPath       The file repo path to set/update stats
-     * @param downloadedBy   User who downloaded the file
-     * @param downloadedTime Time the file was downloaded
-     * @param fromAnotherArtifactory specifying whether request comes fromAnotherArtifactory
-     */
-    @Override
-    public synchronized void fileDownloaded(RepoPath repoPath, String downloadedBy, long downloadedTime, boolean fromAnotherArtifactory) {
-        log.debug("Queuing downloaded resource '{}' by '{}' at '{}', fromAnotherArtifactory: '{}'",
-                repoPath, downloadedBy, downloadedTime, fromAnotherArtifactory);
-
-        StatsEvent statsEvent = getStatsEvents().get(repoPath);
-        if (statsEvent == null) {
-            getStatsEvents().put(repoPath, statsEvent = new StatsEvent(repoPath));
-        }
-        statsEvent.update(downloadedBy, downloadedTime);
-    }
-
-    /**
-     * Triggered on artifact remote download event
-     *
-     * @param origin             The remote host the download was triggered by
-     * @param path               The round trip of download request
-     * @param repoPath           The file repo path to set/update stats
-     * @param downloadedBy       User who downloaded the file
-     * @param downloadedTime     Time the file was downloaded
-     * @param count              Amount of performed downloads
-     */
-    @Override
-    public synchronized void fileDownloadedRemotely(String origin, String path, RepoPath repoPath,
-            String downloadedBy, long downloadedTime, long count) {
-
-        log.debug("Queuing resource '{}' downloaded remotely by '{}', at '{}', from {}, count: '{}'",
-                repoPath, downloadedBy, downloadedTime, origin, count);
-
-        StatsEvent statsEvent = getStatsEvents().get(repoPath);
-        if (statsEvent == null) {
-            getStatsEvents().put(repoPath, statsEvent = new StatsEvent(repoPath, origin));
-        }
-        statsEvent.update(downloadedBy, origin, path, downloadedTime, count);
-    }
-
-    @Override
-    public int setStats(long nodeId, StatsInfo statsInfo) {
-        log.debug("Setting stats '{}' for node '{}'", statsInfo, nodeId);
-        try {
-            AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-            SmartRepoAddon smartRepoAddon = addonsManager.addonByType(SmartRepoAddon.class);
-            deleteStats(nodeId);
-            int stats = getStatsDao().createStats(statInfoToStat(nodeId, statsInfo),
-                    smartRepoAddon.supportRemoteStats());
-            return stats;
-        } catch (SQLException e) {
-            throw new VfsException("Failed to set stats on node " + nodeId, e);
-        }
-    }
-
-    @Override
-    public boolean deleteStats(long nodeId) {
-        log.debug("Deleting stats for node '{}'", nodeId);
-
-        try {
-            AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-            SmartRepoAddon smartRepoAddon = addonsManager.addonByType(SmartRepoAddon.class);
-            int deletedCount = getStatsDao().deleteStats(nodeId, smartRepoAddon.supportRemoteStats());
-            return deletedCount > 0;
-        } catch (SQLException e) {
-            throw new VfsException("Failed to delete stats from node id " + nodeId, e);
-        }
-    }
-
-    @Override
-    public boolean hasStats(RepoPath repoPath) {
-        if (getStatsEvents().containsKey(repoPath)) {
-            return true;
-        }
-        try {
-            long nodeId = getFileService().getNodeId(repoPath);
-            if (nodeId > 0) {
-                return getStatsDao().hasStats(nodeId);
-            } else {
-                return false;
-            }
-        } catch (SQLException e) {
-            throw new StorageException("Failed to check stats existence for " + repoPath);
-        }
-    }
-
-    /**
-     * Persists statistics
-     *
-     * @param event stats event
-     * @param nodeId id representing artifact location
-     * @param stats statistics
-     *
-     * @throws SQLException
-     */
-    @Override
-    protected void processStats(StatsEvent event, long nodeId, Stat stats) throws SQLException {
-        log.debug("Processing event: {} for stats {}", event, stats);
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        SmartRepoAddon smartRepoAddon = addonsManager.addonByType(SmartRepoAddon.class);
-        if (stats != null) {
-            stats = new Stat(nodeId,
-                    stats.getLocalDownloadCount() + event.getLocalEventCount().get(),
-                    event.getLocalDownloadedTime() != 0 ? event.getLocalDownloadedTime() : stats.getLocalLastDownloaded(),
-                    !Strings.isNullOrEmpty(event.getLocalDownloadedBy()) ? event.getLocalDownloadedBy() : stats.getLocalLastDownloadedBy(),
-
-                    stats.getRemoteDownloadCount() + event.getRemoteEventCount().get() ,
-                    event.getRemoteDownloadedTime() != 0 ? event.getRemoteDownloadedTime() : stats.getRemoteLastDownloaded(),
-                    !Strings.isNullOrEmpty(event.getRemoteDownloadedBy()) ? event.getRemoteDownloadedBy() : stats.getRemoteLastDownloadedBy(),
-                    !Strings.isNullOrEmpty(event.getOrigin()) ? event.getOrigin() : stats.getOrigin(),
-                    !Strings.isNullOrEmpty(event.getPath()) ? event.getPath() : stats.getPath()
-            );
-            log.debug("Updating stats: {} according for event {}", stats, event);
-            getStatsDao().updateStats(stats, smartRepoAddon.supportRemoteStats());
-        } else {
-            stats = new Stat(nodeId,
-                    event.getLocalEventCount().get(), event.getLocalDownloadedTime(), event.getLocalDownloadedBy(),
-                    event.getRemoteEventCount().get(), event.getRemoteDownloadedTime(), event.getRemoteDownloadedBy(),
-                    event.getOrigin(), event.getPath()
-            );
-
-            log.debug("Creating new stats: {} according for event {}", stats, event);
-            getStatsDao().createStats(stats, smartRepoAddon.supportRemoteStats());
-        }
-    }
-
-    @Override
-    protected SemaphoreWrapper getFlushingSemaphore() {
-        if (flushingSemaphore == null) {
-            AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-            HaCommonAddon haCommonAddon = addonsManager.addonByType(HaCommonAddon.class);
-            flushingSemaphore = haCommonAddon.getSemaphore(HaCommonAddon.STATS_SEMAPHORE_NAME);
-        }
-        return flushingSemaphore;
-    }
-
-    @Override
-    protected void onTraversingStart() {
-        log.debug("Starting events processing");
-    }
-
-    @Override
-    protected void onTraversingEnd() {
-        log.debug("Events processing finished");
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/service/TasksServiceImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/service/TasksServiceImpl.java
deleted file mode 100644
index 24700b8..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/service/TasksServiceImpl.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.service;
-
-import com.google.common.collect.Sets;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.storage.StorageException;
-import org.artifactory.storage.db.fs.dao.TasksDao;
-import org.artifactory.storage.db.fs.entity.TaskRecord;
-import org.artifactory.storage.fs.service.TasksService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nonnull;
-import java.sql.SQLException;
-import java.util.Set;
-
-/**
- * A business service to interact with the tasks table.
- *
- * @author Yossi Shaul
- */
- at Service
-public class TasksServiceImpl implements TasksService {
-
-    @Autowired
-    private TasksDao tasksDao;
-
-    @Override
-    @Nonnull
-    public Set<RepoPath> getIndexTasks() {
-        return getRepoPathTasks(TASK_TYPE_INDEX);
-    }
-
-    @Nonnull
-    private Set<RepoPath> getRepoPathTasks(String type) {
-        // this method expects repo path id as the task value
-        Set<RepoPath> repoPaths = Sets.newLinkedHashSet();
-        try {
-            Set<TaskRecord> tasks = tasksDao.load(type);
-            for (TaskRecord task : tasks) {
-                repoPaths.add(InternalRepoPathFactory.createRepoPath(task.getTaskContext()));
-            }
-        } catch (SQLException e) {
-            throw new StorageException("Failed to load tasks of type '" + type + "' : " + e.getMessage(), e);
-        }
-        return repoPaths;
-    }
-
-    @Override
-    public boolean hasIndexTask(RepoPath repoPath) {
-        try {
-            return tasksDao.exist(TASK_TYPE_INDEX, repoPath.getId());
-        } catch (SQLException e) {
-            throw new StorageException("Failed to check index task for " + repoPath + ": " + e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public void addIndexTask(RepoPath repoPath) {
-        try {
-            if (!hasIndexTask(repoPath)) {
-                tasksDao.create(TASK_TYPE_INDEX, repoPath.getId());
-            }
-        } catch (SQLException e) {
-            throw new StorageException("Failed to add index task for " + repoPath + ": " + e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public boolean removeIndexTask(RepoPath repoPath) {
-        try {
-            return tasksDao.delete(TASK_TYPE_INDEX, repoPath.getId());
-        } catch (SQLException e) {
-            throw new StorageException("Failed to delete index task for " + repoPath + ": " + e.getMessage(), e);
-        }
-    }
-
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/service/WatchesServiceImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/service/WatchesServiceImpl.java
deleted file mode 100644
index 952c6fb..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/service/WatchesServiceImpl.java
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.service;
-
-import com.google.common.collect.HashMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Multimap;
-import com.google.common.collect.Multimaps;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.addon.ha.message.HaMessageTopic;
-import org.artifactory.addon.ha.message.WatchesHaMessage;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.MutableWatchersInfo;
-import org.artifactory.fs.WatcherInfo;
-import org.artifactory.fs.WatchersInfo;
-import org.artifactory.model.WatcherRepoPathInfo;
-import org.artifactory.model.xstream.fs.WatcherImpl;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.storage.StorageException;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.db.fs.dao.WatchesDao;
-import org.artifactory.storage.db.fs.entity.Watch;
-import org.artifactory.storage.fs.VfsException;
-import org.artifactory.storage.fs.service.FileService;
-import org.artifactory.storage.fs.service.InternalWatchesService;
-import org.artifactory.storage.fs.service.WatchesService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nonnull;
-import java.sql.SQLException;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Yossi Shaul
- */
- at Service
-public class WatchesServiceImpl implements WatchesService, InternalWatchesService {
-    private static final Logger log = LoggerFactory.getLogger(WatchesServiceImpl.class);
-
-    @Autowired
-    private DbService dbService;
-
-    @Autowired
-    private WatchesDao watchesDao;
-
-    @Autowired
-    private FileService fileService;
-
-    private Multimap<RepoPath, Watch> watchersCache;
-    private volatile boolean initialized = false;
-
-    @Override
-    public WatchersInfo getWatches(RepoPath repoPath) {
-        MutableWatchersInfo watchers = InfoFactoryHolder.get().createWatchers();
-        Collection<Watch> nodeWatches = getWatchersFromCache(repoPath);
-        for (Watch nodeWatch : nodeWatches) {
-            watchers.addWatcher(watchToWatchInfo(nodeWatch));
-        }
-        return watchers;
-    }
-
-    @Override
-    public boolean isUserWatchingRepoPath(RepoPath repoPath,String userName){
-        boolean isUserWatchingRepoPath = false;
-         Collection<Watch> nodeWatches = getWatchersFromCache(repoPath);
-        for (Watch nodeWatch : nodeWatches) {
-            if (nodeWatch.getUsername().equals(userName)) {
-                isUserWatchingRepoPath = true;
-            }
-        }
-        return isUserWatchingRepoPath;
-    }
-
-    @Override
-    public boolean hasWatches(RepoPath repoPath) {
-        return getWatchersCache().containsKey(repoPath);
-    }
-
-    @Override
-    @Nonnull
-    public List<WatcherRepoPathInfo> loadWatches() {
-        Collection<Map.Entry<RepoPath, Watch>> allWatchers = getAllWatchersFromCache();
-        List<WatcherRepoPathInfo> watchersInfo = Lists.newArrayList();
-        for (Map.Entry<RepoPath, Watch> watchEntry : allWatchers) {
-            RepoPath repoPath = watchEntry.getKey();
-            WatcherInfo watcherInfo = watchToWatchInfo(watchEntry.getValue());
-            watchersInfo.add(new WatcherRepoPathInfo(repoPath, watcherInfo));
-        }
-
-        return watchersInfo;
-    }
-
-    @Override
-    public void addWatches(long nodeId, List<WatcherInfo> watches) {
-        for (WatcherInfo watch : watches) {
-            addWatch(nodeId, watch);
-        }
-    }
-
-    @Nonnull
-    @Override
-    public int addWatch(long nodeId, WatcherInfo watchInfo) {
-        int updateCount = internalAddWatch(nodeId, watchInfo);
-        notify(new WatchesHaMessage.AddWatch(nodeId, watchInfo));
-        return updateCount;
-    }
-
-    @Override
-    public int deleteWatches(long nodeId) {
-        try {
-            int deletedCount = watchesDao.deleteWatches(nodeId);
-            if (deletedCount > 0) {
-                RepoPath repoPath = fileService.loadItem(nodeId).getRepoPath();
-                deleteAllWatchesForRepoPath(repoPath);
-            }
-            return deletedCount;
-        } catch (SQLException e) {
-            throw new StorageException("Failed to delete watches for node: " + nodeId);
-        }
-    }
-
-    @Override
-    public int deleteUserWatches(RepoPath repoPath, String username) {
-        long nodeId = fileService.getNodeId(repoPath);
-        try {
-            if (nodeId > 0) {
-                int deletedCount = watchesDao.deleteUserWatches(nodeId, username);
-                if (deletedCount > 0) {
-                    deleteUserWatchesFromCache(repoPath, username);
-                }
-                return deletedCount;
-            }
-            return 0;
-        } catch (SQLException e) {
-            throw new StorageException("Failed to delete watches for node: " + nodeId);
-        }
-    }
-
-    @Override
-    public int deleteAllUserWatches(String username) {
-        try {
-            int deletedCount = watchesDao.deleteAllUserWatches(username);
-            if (deletedCount > 0) {
-                deleteAllUserWatchesFromCache(username);
-            }
-            return deletedCount;
-        } catch (SQLException e) {
-            throw new StorageException("Failed to delete watches for user: " + username);
-        }
-    }
-
-    private void updateCache(RepoPath repoPath, Watch watch) {
-        getWatchersCache().put(repoPath, watch);
-    }
-
-    private Collection<Map.Entry<RepoPath, Watch>> getAllWatchersFromCache() {
-        return getWatchersCache().entries();
-    }
-
-    private Collection<Watch> getWatchersFromCache(RepoPath repoPath) {
-        return getWatchersCache().get(repoPath);
-    }
-
-    private void deleteAllWatchesForRepoPath(RepoPath repoPath) {
-        internalDeleteAllWatchesForRepoPath(repoPath);
-        notify(new WatchesHaMessage.DeleteAllWatches(repoPath));
-    }
-
-    private void deleteUserWatchesFromCache(RepoPath repoPath, String username) {
-        internalDeleteUserWatchesFromCache(repoPath, username);
-        notify(new WatchesHaMessage.DeleteUserWatches(repoPath, username));
-    }
-
-    private void deleteAllUserWatchesFromCache(String username) {
-        internalDeleteAllUserWatchesFromCache(username);
-        notify(new WatchesHaMessage.DeleteAllUserWatches(username));
-    }
-
-    //
-    @Override
-    public int internalAddWatch(long nodeId, WatcherInfo watchInfo) {
-        log.debug("Adding watch to {}", nodeId);
-        long watchId = dbService.nextId();
-        Watch watch = watchInfoToWatch(watchId, nodeId, watchInfo);
-        int updateCount;
-        try {
-            updateCount = watchesDao.create(watch);
-            if (updateCount > 0) {
-                RepoPath repoPath = fileService.loadItem(nodeId).getRepoPath();
-                updateCache(repoPath, watch);
-            }
-            return updateCount;
-        } catch (SQLException e) {
-            throw new VfsException(e);
-        }
-    }
-
-    @Override
-    public void internalDeleteAllWatchesForRepoPath(RepoPath repoPath) {
-        getWatchersCache().removeAll(repoPath);
-    }
-
-    @Override
-    public void internalDeleteUserWatchesFromCache(RepoPath repoPath, String username) {
-        Collection<Watch> userWatches = getWatchersFromCache(repoPath);
-        List<Watch> watchesAfterDelete = Lists.newArrayList();
-        for (Watch watch : userWatches) {
-            if (!StringUtils.equals(watch.getUsername(), username)) {
-                watchesAfterDelete.add(watch);
-            }
-        }
-
-        getWatchersCache().replaceValues(repoPath, watchesAfterDelete);
-    }
-
-    @Override
-    public void internalDeleteAllUserWatchesFromCache(String username) {
-        Collection<Map.Entry<RepoPath, Watch>> allWatches = getAllWatchersFromCache();
-        for (Iterator<Map.Entry<RepoPath, Watch>> it = allWatches.iterator(); it.hasNext(); ) {
-            Map.Entry<RepoPath, Watch> watchEntry = it.next();
-            if (StringUtils.equals(watchEntry.getValue().getUsername(), username)) {
-                it.remove();
-            }
-        }
-    }
-
-    private Multimap<RepoPath, Watch> getWatchersCache() {
-        lazyInitCacheIfNeeded();
-        return watchersCache;
-    }
-
-    private void lazyInitCacheIfNeeded() {
-        if (!initialized) {
-            synchronized (this) {
-                if (!initialized) {
-                    if (watchersCache == null) {
-                        watchersCache = HashMultimap.create();
-                        watchersCache = Multimaps.synchronizedMultimap(watchersCache);
-                    }
-
-                    try {
-                        //TODO: [by YS] consider using single query to get watch + repo path
-                        List<Watch> nodeWatches = watchesDao.getWatches();
-                        for (Watch nodeWatch : nodeWatches) {
-                            RepoPath repoPath = fileService.loadItem(nodeWatch.getNodeId()).getRepoPath();
-                            watchersCache.put(repoPath, nodeWatch);
-                        }
-                        initialized = true;
-                    } catch (SQLException e) {
-                        throw new StorageException("Failed to load watches", e);
-                    }
-                }
-            }
-        }
-    }
-
-    private Watch watchInfoToWatch(long watchId, long nodeId, WatcherInfo watchInfo) {
-        return new Watch(watchId, nodeId, watchInfo.getUsername(), watchInfo.getWatchingSinceTime());
-    }
-
-    private WatcherInfo watchToWatchInfo(Watch nodeWatch) {
-        return new WatcherImpl(nodeWatch.getUsername(), nodeWatch.getSince());
-    }
-
-    private void notify(WatchesHaMessage haMessage) {
-        HaCommonAddon haAddon = ContextHelper.get().beanForType(AddonsManager.class).addonByType(HaCommonAddon.class);
-        haAddon.notify(HaMessageTopic.WATCHES_TOPIC, haMessage);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/session/SqlStorageSession.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/session/SqlStorageSession.java
deleted file mode 100644
index 97efd8a..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/session/SqlStorageSession.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.session;
-
-import org.artifactory.repo.RepoPath;
-import org.artifactory.storage.fs.lock.FsItemLockEntry;
-import org.artifactory.storage.fs.lock.LockEntryId;
-import org.artifactory.storage.fs.lock.SessionLockEntry;
-import org.artifactory.storage.fs.session.StorageSession;
-import org.artifactory.storage.tx.SessionResource;
-import org.artifactory.storage.tx.SessionResourceManager;
-import org.artifactory.storage.tx.SessionResourceManagerImpl;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nullable;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-/**
- * Represents a thread bound storage session in a context of a transaction.
- *
- * @author Yossi Shaul
- */
-public class SqlStorageSession implements StorageSession {
-    private static final Logger log = LoggerFactory.getLogger(SqlStorageSession.class);
-
-    private final Map<RepoPath, SessionLockEntry> locks = new LinkedHashMap<>();
-    private SessionResourceManager sessionResourceManager;
-
-    @Override
-    public void save() {
-        if (sessionResourceManager != null) {
-            sessionResourceManager.onSessionSave();
-        }
-
-        if (locks.size() == 0) {
-            log.trace("Save called on session with no locked items");
-            return;
-        }
-
-        log.debug("Save called on session with {} locked items", locks.size());
-
-        Iterator<Map.Entry<RepoPath, SessionLockEntry>> locksIter = locks.entrySet().iterator();
-        while (locksIter.hasNext()) {
-            SessionLockEntry lockEntry = locksIter.next().getValue();
-            if (lockEntry.isWriteLockedByMe()) {
-                lockEntry.save();
-                if (lockEntry.isDeleted()) {
-                    // deleted items are removed immediately from the session to support simpler override during move/copy
-                    lockEntry.unlock();
-                    locksIter.remove();
-                }
-            }
-        }
-
-    }
-
-    @Override
-    public void releaseResources() {
-        log.trace("Release all locks of lm={}", this.hashCode());
-        try {
-            Collection<SessionLockEntry> lockEntries = locks.values();
-            for (SessionLockEntry lockEntry : lockEntries) {
-                lockEntry.unlock();
-            }
-        } finally {
-            locks.clear();
-        }
-    }
-
-    @Override
-    public FsItemLockEntry writeLock(LockEntryId lockEntryId) {
-        SessionLockEntry sessionLockEntry = getOrCreateSessionLockEntry(lockEntryId);
-        sessionLockEntry.acquireWriteLock();
-        return sessionLockEntry;
-    }
-
-    @Override
-    public boolean removeLockEntry(RepoPath repoPath) {
-        SessionLockEntry lockEntry = locks.remove(repoPath);
-        if (lockEntry == null) {
-            log.debug("Removing lock entry {} but not locked by me!", repoPath);
-            return false;
-        } else {
-            log.trace("Removed lock entry {} for lm={}", repoPath, this.hashCode());
-            lockEntry.unlock();
-            return true;
-        }
-    }
-
-    @Override
-    @Nullable
-    public SessionLockEntry getLockEntry(RepoPath repoPath) {
-        return locks.get(repoPath);
-    }
-
-    private SessionLockEntry getOrCreateSessionLockEntry(LockEntryId lockEntryId) {
-        RepoPath repoPath = lockEntryId.getRepoPath();
-        SessionLockEntry sessionLockEntry = getLockEntry(repoPath);
-        if (sessionLockEntry == null) {
-            log.trace("Creating new SLE for {} in lm={}", repoPath, this.hashCode());
-            sessionLockEntry = new SessionLockEntry(lockEntryId);
-            locks.put(repoPath, sessionLockEntry);
-        } else {
-            log.trace("Reusing existing SLE for {} in lm={}", repoPath, this.hashCode());
-        }
-        return sessionLockEntry;
-    }
-
-    @Override
-    public <T extends SessionResource> T getOrCreateResource(Class<T> resourceClass) {
-        return getSessionResourceManager().getOrCreateResource(resourceClass);
-    }
-
-    @Override
-    public void afterCompletion(boolean success) {
-        if (sessionResourceManager != null) {
-            sessionResourceManager.afterCompletion(success);
-        }
-    }
-
-    public SessionResourceManager getSessionResourceManager() {
-        if (sessionResourceManager == null) {
-            sessionResourceManager = new SessionResourceManagerImpl();
-        }
-        return sessionResourceManager;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/session/SqlStorageSessionFactory.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/session/SqlStorageSessionFactory.java
deleted file mode 100644
index 92d67cd..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/session/SqlStorageSessionFactory.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.session;
-
-import org.artifactory.storage.fs.session.StorageSession;
-import org.artifactory.storage.fs.session.StorageSessionFactory;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Yossi Shaul
- */
- at Component
-public class SqlStorageSessionFactory implements StorageSessionFactory {
-    @Override
-    public StorageSession create() {
-        return new SqlStorageSession();
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/fs/util/NodeUtils.java b/storage/db/src/main/java/org/artifactory/storage/db/fs/util/NodeUtils.java
deleted file mode 100644
index 4108eb6..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/fs/util/NodeUtils.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.util;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.storage.db.fs.entity.Node;
-import org.artifactory.util.PathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-
-/**
- * @author Yossi Shaul
- */
-public abstract class NodeUtils {
-    private static final Logger log = LoggerFactory.getLogger(NodeUtils.class);
-
-    /**
-     * Returns the number of path elements of this path.
-     * Empty path returns 0, root path returns 1.
-     *
-     * @param path The path to check
-     * @return Number of path elements in this path
-     */
-    public static int getDepth(String path) {
-        if (StringUtils.isBlank(path)) {
-            return 0;
-        } else {
-            return StringUtils.countMatches(PathUtils.trimSlashes(path).toString(), "/") + 1;
-        }
-    }
-
-    public static void print(Node node) {
-        print(node, 0);
-    }
-
-    private static void print(Node node, int depth) {
-        StringBuilder sb = new StringBuilder();
-        sb.append(indent(depth, node));
-        sb.append(nodeToString(node));
-        log.info(sb.toString());
-    }
-
-    public static String nodeToString(Node node) {
-        StringBuilder sb = new StringBuilder();
-        sb.append(node.getName()).append("[");
-        sb.append(node.getPath()).append("]");
-        return sb.toString();
-    }
-
-    private static String indent(int amount, Node node) {
-        StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < amount; i++) {
-            sb.append("|  ");
-        }
-        if (!node.isFile()) {
-            sb.append("+-");
-        } else {
-            sb.append("\\-");
-        }
-        return sb.toString();
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/mbean/ManagedDataSource.java b/storage/db/src/main/java/org/artifactory/storage/db/mbean/ManagedDataSource.java
deleted file mode 100644
index 5746653..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/mbean/ManagedDataSource.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.artifactory.storage.db.mbean;
-
-import org.artifactory.storage.db.spring.ArtifactoryDataSource;
-import org.artifactory.storage.db.util.JdbcHelper;
-
-/**
- * MBean wrapper for {@link org.artifactory.storage.db.spring.ArtifactoryDataSource}
- *
- * @author mamo
- */
-public class ManagedDataSource implements ManagedDataSourceMBean {
-
-    private final ArtifactoryDataSource artifactoryDataSource;
-    private final JdbcHelper jdbcHelper;
-
-    public ManagedDataSource(ArtifactoryDataSource dataSource, JdbcHelper jdbcHelper) {
-        artifactoryDataSource = dataSource;
-        this.jdbcHelper = jdbcHelper;
-    }
-
-    @Override
-    public int getActiveConnectionsCount() {
-        return artifactoryDataSource.getActiveConnectionsCount();
-    }
-
-    @Override
-    public int getIdleConnectionsCount() {
-        return artifactoryDataSource.getIdleConnectionsCount();
-    }
-
-    @Override
-    public int getMaxActive() {
-        return artifactoryDataSource.getMaxActive();
-    }
-
-    @Override
-    public int getMaxIdle() {
-        return artifactoryDataSource.getMaxIdle();
-    }
-
-    @Override
-    public long getMaxWait() {
-        return artifactoryDataSource.getMaxWait();
-    }
-
-    @Override
-    public int getMinIdle() {
-        return artifactoryDataSource.getMinIdle();
-    }
-
-    @Override
-    public String getUrl() {
-        return artifactoryDataSource.getUrl();
-    }
-
-    @Override
-    public long getSelectQueriesCount() {
-        return jdbcHelper.getSelectQueriesCount();
-    }
-
-    @Override
-    public long getUpdateQueriesCount() {
-        return jdbcHelper.getUpdateQueriesCount();
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/mbean/ManagedDataSourceMBean.java b/storage/db/src/main/java/org/artifactory/storage/db/mbean/ManagedDataSourceMBean.java
deleted file mode 100644
index f7bb521..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/mbean/ManagedDataSourceMBean.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.artifactory.storage.db.mbean;
-
-/**
- * MBean wrapper for {@link org.artifactory.storage.db.spring.ArtifactoryDataSource}
- *
- * @author mamo
- */
-public interface ManagedDataSourceMBean {
-
-    int getMaxActive();
-
-    int getMaxIdle();
-
-    long getMaxWait();
-
-    int getMinIdle();
-
-    int getActiveConnectionsCount();
-
-    int getIdleConnectionsCount();
-
-    String getUrl();
-
-    long getSelectQueriesCount();
-
-    long getUpdateQueriesCount();
-
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/properties/dao/DbPropertiesDao.java b/storage/db/src/main/java/org/artifactory/storage/db/properties/dao/DbPropertiesDao.java
deleted file mode 100644
index 9ff3de1..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/properties/dao/DbPropertiesDao.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package org.artifactory.storage.db.properties.dao;
-
-import com.google.common.collect.Lists;
-import com.sun.istack.internal.NotNull;
-import org.artifactory.storage.db.properties.model.DbProperties;
-import org.artifactory.storage.db.util.BaseDao;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Repository;
-
-import java.sql.Connection;
-import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.List;
-
-/**
- * Date: 7/10/13 3:08 PM
- *
- * @author freds
- */
- at Repository
-public class DbPropertiesDao extends BaseDao {
-    public static final String TABLE_NAME = "db_properties";
-
-    @Autowired
-    public DbPropertiesDao(JdbcHelper jdbcHelper) {
-        super(jdbcHelper);
-    }
-
-    @NotNull
-    public List<DbProperties> getProperties() throws SQLException {
-        List<DbProperties> result = Lists.newArrayList();
-        ResultSet rs = null;
-        try {
-            rs = jdbcHelper.executeSelect("SELECT * FROM " + TABLE_NAME);
-            while (rs.next()) {
-                result.add(new DbProperties(rs.getLong(1), rs.getString(2),
-                        zeroIfNull(rs.getInt(3)), zeroIfNull(rs.getLong(4))));
-            }
-        } finally {
-            DbUtils.close(rs);
-        }
-        return result;
-    }
-
-    public boolean createProperties(DbProperties dbProperties) throws SQLException {
-        int updateCount = jdbcHelper.executeUpdate("INSERT INTO " + TABLE_NAME +
-                        " (installation_date, artifactory_version, artifactory_revision, artifactory_release)" +
-                        " VALUES(?, ?, ?, ?)",
-                dbProperties.getInstallationDate(), dbProperties.getArtifactoryVersion(),
-                nullIfZeroOrNeg(dbProperties.getArtifactoryRevision()),
-                nullIfZeroOrNeg(dbProperties.getArtifactoryRelease()));
-        return updateCount == 1;
-    }
-
-    public boolean isDbPropertiesTableExists() throws SQLException {
-        try (Connection con = jdbcHelper.getDataSource().getConnection()) {
-            DatabaseMetaData metaData = con.getMetaData();
-            return DbUtils.tableExists(metaData, DbPropertiesDao.TABLE_NAME);
-        }
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/properties/service/ArtifactoryDbPropertiesServiceImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/properties/service/ArtifactoryDbPropertiesServiceImpl.java
deleted file mode 100644
index b144f37..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/properties/service/ArtifactoryDbPropertiesServiceImpl.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.properties.service;
-
-import edu.emory.mathcs.backport.java.util.Collections;
-import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
-import org.artifactory.storage.StorageException;
-import org.artifactory.storage.db.properties.dao.DbPropertiesDao;
-import org.artifactory.storage.db.properties.model.DbProperties;
-import org.codehaus.mojo.versions.ordering.MavenVersionComparator;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.sql.SQLException;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
- at Service
-public class ArtifactoryDbPropertiesServiceImpl implements ArtifactoryDbPropertiesService {
-    @Autowired
-    private DbPropertiesDao dbPropertiesDao;
-
-    @Override
-    public void updateDbProperties(DbProperties dbProperties) {
-        try {
-            dbPropertiesDao.createProperties(dbProperties);
-        } catch (SQLException e) {
-            throw new StorageException("Failed to load db properties from database", e);
-        }
-    }
-
-    @Override
-    public DbProperties getDbProperties() {
-        try {
-            List<DbProperties> dbProperties = dbPropertiesDao.getProperties();
-            Collections.sort(dbProperties, new DBPropertiesComparator());
-            if (dbProperties.size() > 0) {
-                return dbProperties.get(dbProperties.size() - 1);
-            }
-        }catch (Exception e){
-            throw new StorageException("Failed to load db properties from database", e);
-        }
-        return null;
-    }
-
-    @Override
-    public boolean isDbPropertiesTableExists() {
-        try {
-            return dbPropertiesDao.isDbPropertiesTableExists();
-        } catch (SQLException e) {
-            throw new StorageException("Failed to check if the  db_properties table exists in the database", e);
-        }
-    }
-
-    private class DBPropertiesComparator implements Comparator<DbProperties> {
-
-        private final MavenVersionComparator versionComparator;
-
-        public DBPropertiesComparator() {
-            versionComparator = new MavenVersionComparator();
-        }
-
-        @Override
-        public int compare(DbProperties o1, DbProperties o2) {
-            String artifactoryVersion1 = o1.getArtifactoryVersion();
-            String artifactoryVersion2 = o2.getArtifactoryVersion();
-            DefaultArtifactVersion version1 = new DefaultArtifactVersion(artifactoryVersion1);
-            DefaultArtifactVersion version2 = new DefaultArtifactVersion(artifactoryVersion2);
-            return versionComparator.compare(version1,version2);
-        }
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/properties/utils/VersionPropertiesUtils.java b/storage/db/src/main/java/org/artifactory/storage/db/properties/utils/VersionPropertiesUtils.java
deleted file mode 100644
index 6bd0038..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/properties/utils/VersionPropertiesUtils.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package org.artifactory.storage.db.properties.utils;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.ArtifactoryRunningMode;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.storage.db.properties.model.DbProperties;
-import org.artifactory.storage.db.version.ArtifactoryDBVersion;
-import org.artifactory.version.ArtifactoryVersion;
-import org.artifactory.version.ArtifactoryVersionReader;
-import org.artifactory.version.CompoundVersionDetails;
-
-/**
- * Date: 8/27/13 9:29 PM
- *
- * @author freds
- */
-public abstract class VersionPropertiesUtils {
-
-    /**
-     * Compare the version of Artifactory running with the DB version, and return:<ul>
-     * <li><b>true</b> : if all is OK (server can run) and no upgrades to do.</li>
-     * <li><b>false</b> : if an upgrades needs to be applied.</li>
-     * <li><b>IllegalStateException</b> : if the version are incompatible.</li>
-     * </ul>
-     *
-     * @param dbVersionDetails The version found in Db props
-     * @param versionDetails   The running version of Artifactory
-     * @return true all ok, false upgrade needed
-     * @throws java.lang.IllegalStateException
-     *          If compatibility cannot be done
-     */
-    public static boolean isDbPropertiesVersionCompatible(
-            CompoundVersionDetails dbVersionDetails, CompoundVersionDetails versionDetails) {
-        // TODO: [by fsi] compare version type, impossible to run old version on new or vice-versa
-        // TODO: [by fsi] Info should come from ArtifactoryDBVersion
-        // For now just compare the version and then release number
-        if (dbVersionDetails.getVersion().before(versionDetails.getVersion())) {
-            // Need upgrade
-            return false;
-        }
-        if (dbVersionDetails.getVersion().after(versionDetails.getVersion())) {
-            // Cannot upgrade running below DB
-            return true;
-        }
-        // If DB above all good
-        return dbVersionDetails.getRevisionInt() >= versionDetails.getRevisionInt();
-    }
-
-    public static CompoundVersionDetails getBeforeAutoDbConvertVersionDetails() {
-        // Before auto convert implemented
-        ArtifactoryVersion firstDbVersion = ArtifactoryDBVersion.v100.getComparator().getFrom();
-        return new CompoundVersionDetails(firstDbVersion, firstDbVersion.getValue(),
-                "" + firstDbVersion.getRevision(), 0L);
-    }
-
-    public static CompoundVersionDetails getDbCompoundVersionDetails(DbProperties dbProperties) {
-        if (dbProperties == null) {
-            // First version with props and no value
-            ArtifactoryVersion firstPropsDbVersion = ArtifactoryDBVersion.v101.getComparator().getFrom();
-            return new CompoundVersionDetails(firstPropsDbVersion, firstPropsDbVersion.getValue(),
-                    "" + firstPropsDbVersion.getRevision(), 0L);
-        }
-        return ArtifactoryVersionReader.getCompoundVersionDetails(
-                dbProperties.getArtifactoryVersion(),
-                getRevisionStringFromInt(dbProperties.getArtifactoryRevision()),
-                "" + dbProperties.getArtifactoryRelease());
-    }
-
-    public static DbProperties createDbPropertiesFromVersion(CompoundVersionDetails versionDetails) {
-        long installTime = System.currentTimeMillis();
-        return new DbProperties(installTime,
-                versionDetails.getVersionName(),
-                versionDetails.getRevisionInt(),
-                versionDetails.getTimestamp()
-        );
-    }
-
-    private static ArtifactoryRunningMode getCurrentArtifactoryMode() {
-        ArtifactoryContext context = ContextHelper.get();
-        if (context == null) {
-            return ArtifactoryRunningMode.OSS;
-        }
-        AddonsManager addonsManager = context.beanForType(AddonsManager.class);
-        return addonsManager.getArtifactoryRunningMode();
-    }
-
-    private static String getRevisionStringFromInt(int rev) {
-        if (rev <= 0 || rev == Integer.MAX_VALUE) {
-            return "" + Integer.MAX_VALUE;
-        }
-        return "" + rev;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/search/model/ArchiveSearchEntry.java b/storage/db/src/main/java/org/artifactory/storage/db/search/model/ArchiveSearchEntry.java
deleted file mode 100644
index 9594b68..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/search/model/ArchiveSearchEntry.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.search.model;
-
-import org.artifactory.sapi.search.ArchiveEntryRow;
-
-/**
- * Holds entry names and paths for collection while search archive contents
- *
- * @author Noam Tenne
- */
-public class ArchiveSearchEntry implements ArchiveEntryRow {
-
-    private String entryName;
-    private String entryPath;
-
-    /**
-     * @param entryPath Path of entry without the name
-     * @param entryName Name of entry just the file name
-     */
-    public ArchiveSearchEntry(String entryPath, String entryName) {
-        this.entryName = entryName;
-        this.entryPath = entryPath;
-    }
-
-    @Override
-    public String getEntryName() {
-        return entryName;
-    }
-
-    @Override
-    public String getEntryPath() {
-        return entryPath;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        ArchiveSearchEntry that = (ArchiveSearchEntry) o;
-
-        if (entryName != null ? !entryName.equals(that.entryName) : that.entryName != null) {
-            return false;
-        }
-        if (entryPath != null ? !entryPath.equals(that.entryPath) : that.entryPath != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = entryName != null ? entryName.hashCode() : 0;
-        result = 31 * result + (entryPath != null ? entryPath.hashCode() : 0);
-        return result;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/search/model/BaseGroupCriterion.java b/storage/db/src/main/java/org/artifactory/storage/db/search/model/BaseGroupCriterion.java
deleted file mode 100644
index 8550250..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/search/model/BaseGroupCriterion.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.search.model;
-
-import com.google.common.collect.Lists;
-import org.artifactory.sapi.search.VfsBoolType;
-
-import java.util.List;
-
-/**
- * Date: 8/6/11
- * Time: 12:56 PM
- *
- * @author Fred Simon
- */
-class BaseGroupCriterion extends BaseVfsQueryCriterion {
-    private final List<BaseVfsQueryCriterion> criteria = Lists.newArrayList();
-
-    @Override
-    public boolean hasPropertyFilter() {
-        for (BaseVfsQueryCriterion criterion : criteria) {
-            if (criterion.hasPropertyFilter()) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public boolean hasStatisticFilter() {
-        for (BaseVfsQueryCriterion criterion : criteria) {
-            if (criterion.hasStatisticFilter()) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    BaseVfsQueryCriterion addCriterion(BaseVfsQueryCriterion criterion) {
-        if (criterion != null && criterion.isValid()) {
-            criteria.add(criterion);
-            return criterion;
-        }
-        return null;
-    }
-
-    @Override
-    public boolean isValid() {
-        // Always valid
-        return true;
-    }
-
-    @Override
-    protected VfsBoolType fill(DbSqlQueryBuilder query) {
-        if (!criteria.isEmpty()) {
-            query.usedPropertyCriteria = 0;
-            query.addNextBoolIfNeeded();
-            boolean wrapWithParentheses = criteria.size() > 1;
-            if (wrapWithParentheses) {
-                query.append('(');
-            }
-            for (BaseVfsQueryCriterion criterion : this.criteria) {
-                query.addNextBoolIfNeeded();
-                query.nextBool = criterion.fill(query);
-            }
-            if (wrapWithParentheses) {
-                query.append(')');
-            }
-        }
-        return nextBool;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/search/model/BaseVfsQueryCriterion.java b/storage/db/src/main/java/org/artifactory/storage/db/search/model/BaseVfsQueryCriterion.java
deleted file mode 100644
index 14b8ecf..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/search/model/BaseVfsQueryCriterion.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.storage.db.search.model;
-
-import org.artifactory.sapi.search.VfsBoolType;
-
-/**
- * Date: 8/6/11
- * Time: 12:51 PM
- *
- * @author Fred Simon
- */
-public abstract class BaseVfsQueryCriterion {
-    VfsBoolType nextBool;
-
-    public BaseVfsQueryCriterion() {
-        this.nextBool = VfsBoolType.AND;
-    }
-
-    protected abstract VfsBoolType fill(DbSqlQueryBuilder query);
-
-    public abstract boolean isValid();
-
-    public abstract boolean hasPropertyFilter();
-
-    public abstract boolean hasStatisticFilter();
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/search/model/DbFileInfoProxy.java b/storage/db/src/main/java/org/artifactory/storage/db/search/model/DbFileInfoProxy.java
deleted file mode 100644
index dc6f0e0..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/search/model/DbFileInfoProxy.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.search.model;
-
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumsInfo;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.storage.db.fs.entity.NodePath;
-
-import java.util.Set;
-
-/**
- * Date: 12/4/12
- * Time: 1:51 PM
- *
- * @author freds
- */
-public class DbFileInfoProxy extends DbItemInfoProxy implements FileInfo {
-    public DbFileInfoProxy(long nodeId, NodePath nodePath) {
-        super(nodeId, nodePath);
-    }
-
-    @Override
-    public FileInfo getMaterialized() {
-        return (FileInfo) super.getMaterialized();
-    }
-
-    @Override
-    public long getAge() {
-        return getMaterialized().getAge();
-    }
-
-    @Override
-    public String getMimeType() {
-        return getMaterialized().getMimeType();
-    }
-
-    @Override
-    public ChecksumsInfo getChecksumsInfo() {
-        return getMaterialized().getChecksumsInfo();
-    }
-
-    @Override
-    public long getSize() {
-        return getMaterialized().getSize();
-    }
-
-    @Override
-    public String getSha1() {
-        return getMaterialized().getSha1();
-    }
-
-    @Override
-    public String getMd5() {
-        return getMaterialized().getMd5();
-    }
-
-    @Override
-    public Set<ChecksumInfo> getChecksums() {
-        return getMaterialized().getChecksums();
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/search/model/DbFolderInfoProxy.java b/storage/db/src/main/java/org/artifactory/storage/db/search/model/DbFolderInfoProxy.java
deleted file mode 100644
index e39e573..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/search/model/DbFolderInfoProxy.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.search.model;
-
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.storage.db.fs.entity.NodePath;
-
-/**
- * Date: 12/4/12
- * Time: 1:54 PM
- *
- * @author freds
- */
-public class DbFolderInfoProxy extends DbItemInfoProxy implements FolderInfo {
-    public DbFolderInfoProxy(long nodeId, NodePath nodePath) {
-        super(nodeId, nodePath);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/search/model/DbItemInfoProxy.java b/storage/db/src/main/java/org/artifactory/storage/db/search/model/DbItemInfoProxy.java
deleted file mode 100644
index 507f7b9..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/search/model/DbItemInfoProxy.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.search.model;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.storage.db.fs.entity.NodePath;
-import org.artifactory.storage.fs.service.FileService;
-
-/**
- * Date: 11/29/12
- * Time: 2:48 PM
- *
- * @author freds
- */
-public abstract class DbItemInfoProxy implements ItemInfo {
-    private final long nodeId;
-    private final NodePath nodePath;
-    private ItemInfo itemInfo;
-    private RepoPath repoPath;
-
-    public DbItemInfoProxy(long nodeId, NodePath nodePath) {
-        if (nodePath == null) {
-            throw new IllegalArgumentException("Cannot create Item proxy without a node path. Got ID: " + nodeId);
-        }
-        this.nodeId = nodeId;
-        this.nodePath = nodePath;
-        this.itemInfo = null;
-    }
-
-    public ItemInfo getMaterialized() {
-        if (itemInfo == null) {
-            FileService fileService = ContextHelper.get().beanForType(FileService.class);
-            itemInfo = fileService.loadItem(nodeId);
-        }
-        return itemInfo;
-    }
-
-    @Override
-    public RepoPath getRepoPath() {
-        if (repoPath == null) {
-            repoPath = nodePath.toRepoPath();
-        }
-        return repoPath;
-    }
-
-    @Override
-    public boolean isFolder() {
-        return nodePath.isFolder();
-    }
-
-    @Override
-    public String getName() {
-        return nodePath.getName();
-    }
-
-    @Override
-    public String getRepoKey() {
-        return nodePath.getRepo();
-    }
-
-    @Override
-    public String getRelPath() {
-        return getRepoPath().getPath();
-    }
-
-    @Override
-    public long getCreated() {
-        return getMaterialized().getCreated();
-    }
-
-    @Override
-    public long getLastModified() {
-        return getMaterialized().getLastModified();
-    }
-
-    @Override
-    public String getModifiedBy() {
-        return getMaterialized().getModifiedBy();
-    }
-
-    @Override
-    public String getCreatedBy() {
-        return getMaterialized().getCreatedBy();
-    }
-
-    @Override
-    public long getLastUpdated() {
-        return getMaterialized().getLastUpdated();
-    }
-
-    @Override
-    public boolean isIdentical(ItemInfo info) {
-        return getMaterialized().isIdentical(info);
-    }
-
-    @Override
-    public int compareTo(ItemInfo o) {
-        return getMaterialized().compareTo(o);
-    }
-
-    public boolean isMaterialized() {
-        return itemInfo != null;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof DbItemInfoProxy)) {
-            return false;
-        }
-
-        DbItemInfoProxy that = (DbItemInfoProxy) o;
-
-        if (!nodePath.equals(that.nodePath)) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return nodePath.hashCode();
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/search/model/DbQueryHelper.java b/storage/db/src/main/java/org/artifactory/storage/db/search/model/DbQueryHelper.java
deleted file mode 100644
index d0e2d27..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/search/model/DbQueryHelper.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.search.model;
-
-/**
- * Date: 8/6/11
- * Time: 7:41 PM
- *
- * @author Fred Simon
- */
-abstract class DbQueryHelper {
-    static final String FORWARD_SLASH = "/";
-    static final char SLASH_CHAR = '/';
-    static final char STAR = '*';
-    static final char QUESTION_MARK = '?';
-    static final char PERCENT = '%';
-    static final char UNDERSCORE = '_';
-
-    private DbQueryHelper() {
-    }
-
-    public static int addPathValue(StringBuilder builder, String pathValue) {
-        // First add slash if needed
-        if (builder.length() > 0) {
-            // Avoid double / char
-            addCharIfNeeded(builder, SLASH_CHAR);
-        }
-        return appendWithWildcards(builder, pathValue);
-    }
-
-    public static String convertWildcards(String value) {
-        StringBuilder result = new StringBuilder();
-        appendWithWildcards(result, value);
-        return result.toString();
-    }
-
-    public static int appendWithWildcards(StringBuilder builder, String value) {
-        int nbSlash = 0;
-        for (char c : value.toCharArray()) {
-            if (c == STAR) {
-                // Avoid double % sign
-                addCharIfNeeded(builder, PERCENT);
-            } else if (c == QUESTION_MARK) {
-                builder.append(UNDERSCORE);
-            } else {
-                if (c == SLASH_CHAR) {
-                    nbSlash++;
-                }
-                builder.append(c);
-            }
-        }
-        return nbSlash;
-    }
-
-    private static void addCharIfNeeded(StringBuilder builder, char toAdd) {
-        char lastChar = 0;
-        if (builder.length() > 0) {
-            lastChar = builder.charAt(builder.length() - 1);
-        }
-        if (lastChar != toAdd) {
-            builder.append(toAdd);
-        }
-    }
-
-    static boolean hasWildcards(String value) {
-        for (char c : value.toCharArray()) {
-            if (c == STAR || c == QUESTION_MARK || c == PERCENT || c == UNDERSCORE) {
-                return true;
-            }
-        }
-        return false;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/search/model/DbSqlQueryBuilder.java b/storage/db/src/main/java/org/artifactory/storage/db/search/model/DbSqlQueryBuilder.java
deleted file mode 100644
index 994dd8a..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/search/model/DbSqlQueryBuilder.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.search.model;
-
-import com.google.common.collect.Lists;
-import org.artifactory.sapi.search.VfsBoolType;
-import org.artifactory.storage.db.util.JdbcHelper;
-
-import java.util.List;
-
-/**
- * Date: 11/27/12
- * Time: 5:33 PM
- *
- * @author freds
- */
-class DbSqlQueryBuilder {
-    final StringBuilder sqlQuery = new StringBuilder();
-    final List<Object> params = Lists.newArrayList();
-    VfsBoolType nextBool = null;
-    int usedPropertyCriteria = 0;
-
-    DbSqlQueryBuilder append(String sql) {
-        sqlQuery.append(sql);
-        return this;
-    }
-
-    DbSqlQueryBuilder append(char sql) {
-        sqlQuery.append(sql);
-        return this;
-    }
-
-    DbSqlQueryBuilder appendIfNeeded(char sql) {
-        if (sqlQuery.charAt(sqlQuery.length() - 1) != sql) {
-            sqlQuery.append(sql);
-        }
-        return this;
-    }
-
-    DbSqlQueryBuilder addParam(Object value) {
-        if (value instanceof Iterable) {
-            return addListParam((Iterable) value);
-        }
-        appendIfNeeded(' ');
-        sqlQuery.append("? ");
-        params.add(value);
-        return this;
-    }
-
-    DbSqlQueryBuilder addListParam(Iterable<?> value) {
-        appendIfNeeded(' ');
-        sqlQuery.append("(#) ");
-        params.add(value);
-        return this;
-    }
-
-    public VfsBoolType addNextBoolIfNeeded() {
-        appendIfNeeded(' ');
-        if (nextBool == null) {
-            return null;
-        }
-        // Keep an set to null => used
-        VfsBoolType toAdd = nextBool;
-        nextBool = null;
-        sqlQuery.append(toAdd.name()).append(' ');
-        return toAdd;
-    }
-
-    @Override
-    public String toString() {
-        return JdbcHelper.resolveQuery(sqlQuery.toString(), params.toArray(new Object[params.size()]));
-    }
-
-    public DbSqlQueryBuilder appendNodePropsTableName() {
-        if (usedPropertyCriteria <= 1) {
-            sqlQuery.append("node_props");
-        } else {
-            sqlQuery.append("node_props").append(usedPropertyCriteria);
-        }
-        return this;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/search/model/VfsQueryCriterionDbImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/search/model/VfsQueryCriterionDbImpl.java
deleted file mode 100644
index ac73636..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/search/model/VfsQueryCriterionDbImpl.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.search.model;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.sapi.search.VfsBoolType;
-import org.artifactory.sapi.search.VfsComparatorType;
-import org.artifactory.sapi.search.VfsDateFieldName;
-import org.artifactory.sapi.search.VfsFunctionType;
-import org.artifactory.sapi.search.VfsQueryFieldType;
-
-import javax.annotation.Nonnull;
-import java.util.Arrays;
-import java.util.Calendar;
-
-/**
- * Date: 8/6/11
- * Time: 12:01 PM
- *
- * @author Fred Simon
- */
-class VfsQueryCriterionDbImpl extends BaseVfsQueryCriterion {
-    private final VfsQueryFieldType fieldType;
-    private final String propertyName;
-    private VfsComparatorType comparator = null;
-    Object value;
-    VfsFunctionType function = VfsFunctionType.NONE;
-
-    VfsQueryCriterionDbImpl(String propertyName) {
-        super();
-        if (StringUtils.isEmpty(propertyName)) {
-            throw new IllegalArgumentException("Cannot accept null or empty property name!");
-        }
-        this.propertyName = getPropertyName(propertyName);
-        if ("node_name".equals(propertyName)
-                || "node_path".equals(propertyName)
-                || VfsDateFieldName.LAST_MODIFIED.getPropName().equals(propertyName)
-                || VfsDateFieldName.CREATED.getPropName().equals(propertyName)) {
-            fieldType = VfsQueryFieldType.BASE_NODE;
-        } else if ("entry_path".equals(propertyName)) {
-            fieldType = VfsQueryFieldType.ARCHIVE_PATH;
-        } else if ("entry_name".equals(propertyName)) {
-            fieldType = VfsQueryFieldType.ARCHIVE_NAME;
-        } else if (VfsDateFieldName.LAST_DOWNLOADED.getPropName().equals(propertyName)) {
-            fieldType = VfsQueryFieldType.STATISTIC;
-        } else if (VfsDateFieldName.LAST_REMOTE_DOWNLOADED.getPropName().equals(propertyName)) {
-            fieldType = VfsQueryFieldType.REMOTE_STATISTIC;
-        } else if (propertyName.startsWith(ChecksumType.sha1.name())
-                || propertyName.startsWith(ChecksumType.md5.name())) {
-            fieldType = VfsQueryFieldType.CHECKSUM;
-        } else {
-            fieldType = VfsQueryFieldType.PROPERTY;
-        }
-    }
-
-    /**
-     * Retrieves actual name from VfsDateFieldName (if exist)
-     *
-     * @param propertyName the property name
-     *
-     * @return actual name of VfsDateFieldName
-     */
-    private String getPropertyName(String propertyName) {
-        VfsDateFieldName vfsDateFieldName = VfsDateFieldName.byPropertyName(propertyName);
-        if (vfsDateFieldName != null && vfsDateFieldName.hasPropAlias()) {
-            return vfsDateFieldName.getPropActualName();
-        }
-        return propertyName;
-    }
-
-    public VfsComparatorType getComparator() {
-        if (comparator == null) {
-            if (value == null || StringUtils.isBlank(value.toString())) {
-                return VfsComparatorType.ANY;
-            } else {
-                if (DbQueryHelper.hasWildcards(value.toString())) {
-                    return VfsComparatorType.CONTAINS;
-                } else {
-                    return VfsComparatorType.EQUAL;
-                }
-            }
-        }
-        return comparator;
-    }
-
-    public void setComparator(@Nonnull VfsComparatorType comparator) {
-        this.comparator = comparator;
-    }
-
-    public void setValue(Object value) {
-        if (value != null && value instanceof String[]) {
-            String[] vals = (String[]) value;
-            if (vals.length == 0) {
-                this.value = null;
-            }
-            if (vals.length == 1) {
-                this.value = vals[0];
-            } else {
-                this.value = Arrays.asList(vals);
-            }
-        } else {
-            this.value = value;
-        }
-    }
-
-    public void setFunction(@Nonnull VfsFunctionType function) {
-        this.function = function;
-    }
-
-    @Override
-    public boolean hasPropertyFilter() {
-        return fieldType.isProperty();
-    }
-
-    @Override
-    public boolean hasStatisticFilter() {
-        return fieldType.isStatistic() || fieldType.isRemoteStatistic();
-    }
-
-    @Override
-    public boolean isValid() {
-        VfsComparatorType comp = getComparator();
-        if (comp == VfsComparatorType.NONE || comp == VfsComparatorType.ANY) {
-            // No need for value sor always true
-            return true;
-        }
-        if (value == null ||
-                !(value instanceof Calendar || value instanceof Long
-                        || value instanceof String || value instanceof Iterable)) {
-            // Un-recognized type
-            return false;
-        }
-        return !StringUtils.isEmpty(value.toString());
-    }
-
-    protected void fillPropertyName(DbSqlQueryBuilder query) {
-        switch (fieldType) {
-            case PROPERTY:
-                query.appendNodePropsTableName().append(".prop_key = ");
-                query.addParam(propertyName);
-                query.append("AND ").appendNodePropsTableName().append(".prop_value");
-                break;
-            case CHECKSUM:
-            case BASE_NODE:
-            case PATH:
-                query.append("nodes.").append(propertyName);
-                break;
-            case ARCHIVE_PATH:
-                query.append("archive_paths.").append(propertyName);
-                break;
-            case ARCHIVE_NAME:
-                query.append("archive_names.").append(propertyName);
-                break;
-            case STATISTIC:
-                query.append("stats.").append(propertyName);
-                break;
-            case REMOTE_STATISTIC:
-                query.append("stats_remote.").append(propertyName);
-                break;
-        }
-    }
-
-    @Override
-    protected VfsBoolType fill(DbSqlQueryBuilder query) {
-        VfsComparatorType comp = getComparator();
-
-        query.addNextBoolIfNeeded();
-
-        if (fieldType == VfsQueryFieldType.PROPERTY) {
-            query.usedPropertyCriteria++;
-            if (query.usedPropertyCriteria > 1) {
-                query.append("EXISTS (SELECT ").appendNodePropsTableName().append(".node_id ")
-                        .append("FROM node_props ").appendNodePropsTableName()
-                        .append(" WHERE nodes.node_id = ").appendNodePropsTableName().append(".node_id")
-                        .append(" AND ");
-            } else {
-                query.append('(');
-            }
-        }
-        fillPropertyName(query);
-        query.appendIfNeeded(' ');
-        query.append(comp.str).append(' ');
-        if (comp.acceptValue()) {
-            boolean applyFunction = comp.acceptFunction() && VfsFunctionType.NONE != function;
-            if (applyFunction) {
-                query.append(function.str).append('(');
-            }
-            if (isValid()) {
-                if (value instanceof String) {
-                    query.addParam(DbQueryHelper.convertWildcards((String) value));
-                } else if (value instanceof Calendar) {
-                    query.addParam(((Calendar) value).getTimeInMillis());
-                } else {
-                    query.addParam(value);
-                }
-            }
-            if (applyFunction) {
-                query.append(')');
-            }
-        }
-
-        if (fieldType == VfsQueryFieldType.PROPERTY) {
-            query.append(')');
-            if (nextBool == VfsBoolType.OR) {
-                // No need to select exists
-                query.usedPropertyCriteria = 0;
-            }
-        }
-
-        return nextBool;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/search/model/VfsQueryDbImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/search/model/VfsQueryDbImpl.java
deleted file mode 100644
index 3768a01..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/search/model/VfsQueryDbImpl.java
+++ /dev/null
@@ -1,610 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.search.model;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.repo.trash.TrashService;
-import org.artifactory.sapi.search.*;
-import org.artifactory.storage.StorageException;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.db.DbType;
-import org.artifactory.storage.db.fs.entity.NodePath;
-import org.artifactory.storage.db.util.BaseDao;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.artifactory.storage.spring.StorageContextHelper;
-import org.artifactory.util.PathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.*;
-
-/**
- * Date: 8/5/11
- * Time: 6:07 PM
- *
- * @author Fred Simon
- */
-public class VfsQueryDbImpl implements VfsQuery {
-    private static final Logger log = LoggerFactory.getLogger(VfsQueryDbImpl.class);
-
-    private VfsQueryResultType expectedResultType = VfsQueryResultType.ANY_ITEM;
-    private final Set<String> repoKeys = Sets.newHashSet();
-    private final BaseGroupCriterion defaultGroup;
-    protected final List<VfsQueryPathCriterionDbImpl> pathCriteria = Lists.newArrayList();
-    private final List<OrderBy> orders = Lists.newArrayList();
-
-    private Stack<BaseGroupCriterion> groups = new Stack<>();
-    private VfsQueryCriterionDbImpl currentCriteria = null;
-
-    public VfsQueryDbImpl() {
-        defaultGroup = new BaseGroupCriterion();
-    }
-
-    @Override
-    public VfsQuery expectedResult(@Nonnull VfsQueryResultType itemType) {
-        expectedResultType = itemType;
-        return this;
-    }
-
-    @Override
-    public VfsQuery setSingleRepoKey(String repoKey) {
-        this.repoKeys.clear();
-        this.repoKeys.add(repoKey);
-        return this;
-    }
-
-    @Override
-    public VfsQuery setRepoKeys(Collection<String> repoKeys) {
-        if (repoKeys != null) {
-            this.repoKeys.clear();
-            this.repoKeys.addAll(repoKeys);
-        }
-        return this;
-    }
-
-    @Override
-    public VfsQuery orderByAscending(@Nonnull String propertyName) {
-        orders.add(new OrderBy(propertyName, true));
-        return this;
-    }
-
-    @Override
-    public VfsQuery orderByDescending(@Nonnull String propertyName) {
-        orders.add(new OrderBy(propertyName, false));
-        return this;
-    }
-
-    @Override
-    public VfsQuery name(@Nonnull String nodeName) {
-        return prop("node_name").val(nodeName);
-    }
-
-    @Override
-    public VfsQuery archiveName(@Nonnull String entryName) {
-        return prop("entry_name").val(entryName);
-    }
-
-    @Override
-    public VfsQuery archivePath(@Nonnull String entryPath) {
-        return prop("entry_path").val(entryPath);
-    }
-
-    @Override
-    public VfsQuery prop(@Nonnull String propertyName) {
-        addCurrentCriteriaIfNeeded();
-        currentCriteria = new VfsQueryCriterionDbImpl(propertyName);
-        return this;
-    }
-
-    @Override
-    public VfsQuery comp(@Nonnull VfsComparatorType comparator) {
-        if (currentCriteria == null) {
-            throw new IllegalStateException("Cannot add comparator to non existing property!");
-        }
-        currentCriteria.setComparator(comparator);
-        return this;
-    }
-
-    @Override
-    public VfsQuery func(@Nonnull VfsFunctionType function) {
-        if (currentCriteria == null) {
-            throw new IllegalStateException("Cannot add function to non existing property!");
-        }
-        currentCriteria.setFunction(function);
-        return this;
-    }
-
-    @Override
-    public VfsQuery val(String... values) {
-        if (currentCriteria == null) {
-            throw new IllegalStateException("Cannot add filter value to non existing property!");
-        }
-        currentCriteria.setValue(values);
-        return this;
-    }
-
-    @Override
-    public VfsQuery val(@Nonnull Long value) {
-        if (currentCriteria == null) {
-            throw new IllegalStateException("Cannot add filter value to non existing property!");
-        }
-        currentCriteria.setValue(value);
-        return this;
-    }
-
-    @Override
-    public VfsQuery val(@Nonnull Calendar value) {
-        if (currentCriteria == null) {
-            throw new IllegalStateException("Cannot add filter value to non existing property!");
-        }
-        currentCriteria.setValue(value);
-        return this;
-    }
-
-    @Override
-    public VfsQuery nextBool(@Nonnull VfsBoolType bool) {
-        if (currentCriteria == null) {
-            throw new IllegalStateException("Cannot add next bool to non existing property!");
-        }
-        currentCriteria.nextBool = bool;
-        internalAddCriterion(currentCriteria);
-        currentCriteria = null;
-        return this;
-    }
-
-    @Override
-    public VfsQuery startGroup() {
-        addCurrentCriteriaIfNeeded();
-        BaseGroupCriterion newGroup = new BaseGroupCriterion();
-        internalAddCriterion(newGroup);
-        groups.push(newGroup);
-        return this;
-    }
-
-    private void addCurrentCriteriaIfNeeded() {
-        if (currentCriteria != null) {
-            internalAddCriterion(currentCriteria);
-            currentCriteria = null;
-        }
-    }
-
-    @Override
-    public VfsQuery endGroup() {
-        return endGroup(null);
-    }
-
-    @Override
-    public VfsQuery endGroup(@Nullable VfsBoolType bool) {
-        try {
-            BaseGroupCriterion groupCriterion = groups.pop();
-            if (currentCriteria != null) {
-                groupCriterion.addCriterion(currentCriteria);
-                currentCriteria = null;
-            }
-            if (bool != null) {
-                groupCriterion.nextBool = bool;
-            }
-            return this;
-        } catch (EmptyStackException e) {
-            throw new IllegalStateException("Cannot end group that did not start!", e);
-        }
-    }
-
-    private void internalAddCriterion(BaseVfsQueryCriterion criterion) {
-        if (!groups.isEmpty()) {
-            groups.peek().addCriterion(criterion);
-        } else {
-            defaultGroup.addCriterion(criterion);
-        }
-    }
-
-    @Override
-    @Nonnull
-    public VfsQueryResult execute(int limit) {
-        if (!groups.isEmpty()) {
-            throw new IllegalStateException("Cannot execute while group still active!");
-        }
-        addCurrentCriteriaIfNeeded();
-        DbSqlQueryBuilder query = new DbSqlQueryBuilder();
-        fillSelectBase(query);
-        fillExpectedNodeType(query);
-        fillRepoFilter(query);
-        fillPathCriterion(query);
-        fillLimitCriterion(query, limit);
-        fillCriteria(query);
-        fillOrderBy(query);
-
-        return executeSelect(query, limit);
-    }
-
-    private VfsQueryResult executeSelect(DbSqlQueryBuilder query, int limit) {
-        if (limit != Integer.MAX_VALUE) {
-            DbService dbService = StorageContextHelper.get().beanForType(DbService.class);
-            DbType databaseType = dbService.getDatabaseType();
-            boolean supportsLimitSyntax = databaseType == DbType.MYSQL;
-            if (supportsLimitSyntax) {
-                query.append(" LIMIT ").append(String.valueOf(limit));
-            }
-        }
-
-        ResultSet rs = null;
-        try {
-            log.debug("Executing search query: {}", query);
-            List<Object> params = query.params;
-            JdbcHelper jdbcHelper = StorageContextHelper.get().beanForType(JdbcHelper.class);
-            rs = jdbcHelper.executeSelect(query.sqlQuery.toString(),
-                    (Object[]) params.toArray(new Object[params.size()]));
-            LinkedHashMap<NodePath, VfsQueryRow> map = Maps.newLinkedHashMap();
-            int nbLines = 0;
-            while (rs.next()) {
-                if (nbLines >= limit) {
-                    break;
-                }
-                nbLines++;
-                int pos = 1;
-                long nodeId = rs.getLong(pos++);
-                boolean file = rs.getBoolean(pos++);
-                NodePath nodePath = new NodePath(rs.getString(pos++),
-                        BaseDao.emptyIfNullOrDot(rs.getString(pos++)),
-                        BaseDao.emptyIfNullOrDot(rs.getString(pos++)),
-                        file);
-                VfsQueryRow row = map.get(nodePath);
-                if (row == null) {
-                    if (hasArchiveEntries()) {
-                        row = new VfsQueryRowDbImpl(nodeId, file, nodePath,
-                                rs.getString(pos++), rs.getString(pos++));
-                    } else {
-                        row = new VfsQueryRowDbImpl(nodeId, file, nodePath);
-                    }
-                    map.put(nodePath, row);
-                } else {
-                    if (hasArchiveEntries()) {
-                        ((VfsQueryRowDbImpl) row).addArchiveEntry(rs.getString(pos++), rs.getString(pos++));
-                    } else {
-                        log.warn("Got multiple times the same node " + nodePath + " in query " + query);
-                    }
-                }
-                log.debug("Used {} params", pos);
-            }
-            if (nbLines >= limit) {
-                nbLines = -1;
-            }
-            return new VfsQueryResultDbImpl(map.values(), nbLines);
-        } catch (SQLException e) {
-            throw new StorageException("Could not execute query '" + query + "' due to:" + e.getMessage(), e);
-        } finally {
-            DbUtils.close(rs);
-        }
-    }
-
-    protected void fillSelectBase(DbSqlQueryBuilder query) {
-        query.append("SELECT nodes.node_id, nodes.node_type, nodes.repo, nodes.node_path, nodes.node_name");
-        if (hasArchiveEntries()) {
-            query.append(", archive_paths.entry_path, archive_names.entry_name");
-        }
-        query.append(" FROM nodes");
-        if (hasArchiveEntries()) {
-            query.append(", indexed_archives, indexed_archives_entries, archive_paths, archive_names");
-        }
-        if (defaultGroup.hasPropertyFilter()) {
-            query.append(", node_props");
-        }
-        if (defaultGroup.hasStatisticFilter()) {
-            query.append(" LEFT JOIN stats ON stats.node_id = nodes.node_id");
-            query.append(" LEFT JOIN stats_remote ON stats_remote.node_id = nodes.node_id");
-        }
-        query.append(" WHERE ");
-        if (defaultGroup.hasPropertyFilter()) {
-            query.addNextBoolIfNeeded();
-            query.append("node_props.node_id = nodes.node_id");
-            query.nextBool = VfsBoolType.AND;
-        }
-        if (hasArchiveEntries()) {
-            query.addNextBoolIfNeeded();
-            query.append("indexed_archives.archive_sha1 = nodes.sha1_actual");
-            query.nextBool = VfsBoolType.AND;
-            query.addNextBoolIfNeeded();
-            query.append("indexed_archives.indexed_archives_id = indexed_archives_entries.indexed_archives_id");
-            query.nextBool = VfsBoolType.AND;
-            query.addNextBoolIfNeeded();
-            query.append("indexed_archives_entries.entry_path_id = archive_paths.path_id");
-            query.nextBool = VfsBoolType.AND;
-            query.addNextBoolIfNeeded();
-            query.append("indexed_archives_entries.entry_name_id = archive_names.name_id");
-            query.nextBool = VfsBoolType.AND;
-        }
-    }
-
-    private boolean hasArchiveEntries() {
-        return expectedResultType == VfsQueryResultType.ARCHIVE_ENTRY;
-    }
-
-    protected void fillExpectedNodeType(DbSqlQueryBuilder query) {
-        switch (expectedResultType) {
-            case ANY_ITEM:
-                // No filter here
-                break;
-            case FILE:
-            case ARCHIVE_ENTRY:
-                query.addNextBoolIfNeeded();
-                query.append("nodes.node_type=1");
-                query.nextBool = VfsBoolType.AND;
-                break;
-            case FOLDER:
-                query.addNextBoolIfNeeded();
-                query.append("nodes.node_type=0");
-                query.nextBool = VfsBoolType.AND;
-                break;
-            default:
-                throw new IllegalStateException("Query node type " + expectedResultType + " not supported yet!");
-        }
-    }
-
-    protected void fillRepoFilter(DbSqlQueryBuilder query) {
-        filterTrashcan(query);
-        if (!repoKeys.isEmpty()) {
-            query.addNextBoolIfNeeded();
-            query.append(" nodes.repo ");
-            if (repoKeys.size() == 1) {
-                // Simple path
-                String singleRepoKey = repoKeys.iterator().next();
-                if (!StringUtils.isBlank(singleRepoKey)) {
-                    query.append(" = ");
-                    query.addParam(singleRepoKey);
-                } else {
-                    throw new InvalidQueryRuntimeException("Cannot accept null or empty repo key!");
-                }
-            } else {
-                query.append(' ').append(VfsComparatorType.IN.str).append(' ');
-                query.addListParam(repoKeys);
-            }
-            query.nextBool = VfsBoolType.AND;
-        }
-    }
-
-    private void filterTrashcan(DbSqlQueryBuilder query) {
-        if (repoKeys.contains(TrashService.TRASH_KEY)) {
-            return;
-        }
-
-        if (repoKeys.isEmpty()) {
-            query.addNextBoolIfNeeded();
-            query.append(" nodes.repo ");
-            query.append(" != ");
-            query.addParam(TrashService.TRASH_KEY);
-            query.nextBool = VfsBoolType.AND;
-        }
-    }
-
-    protected void fillCriteria(DbSqlQueryBuilder query) {
-        defaultGroup.fill(query);
-    }
-
-    protected void fillOrderBy(DbSqlQueryBuilder query) {
-        for (OrderBy order : orders) {
-            query.append("ORDER BY ").append(order.propertyName);
-            if (order.ascending) {
-                query.append(" ASC");
-            } else {
-                query.append(" DESC");
-            }
-        }
-    }
-
-    @Override
-    public VfsQuery addPathFilters(String... pathFilters) {
-        for (String pathFilter : pathFilters) {
-            if (StringUtils.isBlank(pathFilter)) {
-                internalAddPathCriterion(createSmartPathCriterion("*"));
-            } else {
-                internalAddPathCriterion(createSmartPathCriterion(pathFilter));
-            }
-        }
-        return this;
-    }
-
-    @Override
-    public VfsQuery addPathFilter(String relativePathFilter) {
-        // We can have double // in this path,
-        // Be careful when we split with slash // will return an empty string
-        // IMPORTANT NOTE... Big bug in spilt, splitting "//g1*//" return {"", "", "g1*"} instead of {"", "g1*", ""}
-        String[] split = relativePathFilter.split(DbQueryHelper.FORWARD_SLASH);
-        for (String path : split) {
-            internalAddPathCriterion(createSmartPathCriterion(path));
-        }
-        return this;
-    }
-
-    private VfsQueryPathCriterionDbImpl createSmartPathCriterion(String pathFilter) {
-        if (pathFilter == null || pathFilter.contains(DbQueryHelper.FORWARD_SLASH)) {
-            throw new InvalidQueryRuntimeException(
-                    "Path filter element cannot be null or contain slash: " + pathFilter);
-        }
-        if (pathFilter.length() == 0 || ALL_PATH_VALUE.equals(pathFilter)) {
-            return new VfsQueryPathCriterionDbImpl(VfsComparatorType.ANY, ALL_PATH_VALUE);
-        } else {
-            if (DbQueryHelper.hasWildcards(pathFilter)) {
-                return new VfsQueryPathCriterionDbImpl(VfsComparatorType.CONTAINS, pathFilter);
-            } else {
-                return new VfsQueryPathCriterionDbImpl(VfsComparatorType.EQUAL, pathFilter);
-            }
-        }
-    }
-
-    private void internalAddPathCriterion(VfsQueryPathCriterionDbImpl criterion) {
-        if (criterion != null && criterion.isValid()) {
-            pathCriteria.add(criterion);
-        }
-    }
-
-    protected void fillPathCriterion(DbSqlQueryBuilder query) {
-        if (pathCriteria.isEmpty()) {
-            return;
-        }
-
-        VfsQueryPathCriterionDbImpl mainCriterion;
-        // Count the path depth that the depth will be equal or greater than if some all path value appears
-        int fixedDepth;
-        boolean hasAllPathValue = false;
-        if (pathCriteria.size() == 1) {
-            mainCriterion = pathCriteria.get(0);
-            String pathValue = (String) mainCriterion.value;
-            VfsComparatorType comp = mainCriterion.getComparator();
-            if (comp == VfsComparatorType.ANY || ALL_PATH_VALUE.equals(pathValue)) {
-                // Basically no path filter only one and full path
-                return;
-            }
-
-            // If not a single star needs at least one folder level
-            if (!"*".equals(pathValue)) {
-                fixedDepth = 1;
-            } else {
-                // Can be 0 or 1
-                fixedDepth = 0;
-            }
-            if (comp == VfsComparatorType.CONTAINS) {
-                StringBuilder builder = new StringBuilder();
-                DbQueryHelper.addPathValue(builder, pathValue);
-                pathValue = builder.toString();
-            }
-            mainCriterion.value = pathValue;
-        } else {
-            fixedDepth = pathCriteria.size();
-            boolean hasContains = false;
-            for (VfsQueryPathCriterionDbImpl criterion : pathCriteria) {
-                VfsComparatorType comp = criterion.getComparator();
-                if (comp == VfsComparatorType.CONTAINS
-                        || comp == VfsComparatorType.ANY) {
-                    hasContains = true;
-                    if (!hasAllPathValue && ((String) criterion.value).contains(ALL_PATH_VALUE)) {
-                        hasAllPathValue = true;
-                    }
-                }
-            }
-            if (hasContains) {
-                mainCriterion = new VfsQueryPathCriterionDbImpl(VfsComparatorType.CONTAINS, "");
-            } else {
-                mainCriterion = new VfsQueryPathCriterionDbImpl(VfsComparatorType.EQUAL, "");
-            }
-            StringBuilder pathFilterValue = new StringBuilder();
-            for (VfsQueryPathCriterionDbImpl criterion : pathCriteria) {
-                DbQueryHelper.addPathValue(pathFilterValue, (String) criterion.value);
-            }
-            mainCriterion.value = pathFilterValue.toString();
-            mainCriterion.nextBool = pathCriteria.get(pathCriteria.size() - 1).nextBool;
-        }
-
-        query.addNextBoolIfNeeded();
-
-        if (expectedResultType == VfsQueryResultType.FILE) {
-            fixedDepth++;
-        }
-
-        String finalPathFilterValue = (String) PathUtils.trimSlashes((String) mainCriterion.value);
-        boolean endsWithAllPathValue = finalPathFilterValue.endsWith("/%") && hasAllPathValue;
-        if (endsWithAllPathValue && fixedDepth > 0) {
-            fixedDepth--;
-        }
-
-        if (hasAllPathValue) {
-            // Use greater than in depth
-            if (fixedDepth == 0) {
-                // Nothing to do depth always positive
-            } else {
-                query.append("nodes.depth >= ");
-                query.addParam(fixedDepth);
-                query.nextBool = VfsBoolType.AND;
-            }
-        } else {
-            if (expectedResultType == VfsQueryResultType.ANY_ITEM) {
-                query.append("nodes.depth IN ");
-                query.addListParam(Lists.asList(fixedDepth, fixedDepth + 1, new Integer[0]));
-                query.nextBool = VfsBoolType.AND;
-            } else {
-                query.append("nodes.depth = ");
-                query.addParam(fixedDepth);
-                query.nextBool = VfsBoolType.AND;
-            }
-        }
-
-        boolean addedOrPathFilter = false;
-        if (endsWithAllPathValue) {
-            // Needs to check also for equals without /% (full path value param)
-            String subPathFilter = finalPathFilterValue.substring(0, finalPathFilterValue.length() - 2);
-            if ("%".equals(subPathFilter)) {
-                // All path goes => No filter
-            } else {
-                addedOrPathFilter = true;
-                query.addNextBoolIfNeeded();
-                query.append('(');
-                if (DbQueryHelper.hasWildcards(subPathFilter)) {
-                    query.append("nodes.node_path LIKE ");
-                    query.addParam(subPathFilter);
-                } else {
-                    query.append("nodes.node_path = ");
-                    query.addParam(subPathFilter);
-                }
-                query.nextBool = VfsBoolType.OR;
-            }
-        }
-
-        query.addNextBoolIfNeeded();
-        query.append("nodes.node_path ");
-        query.append(mainCriterion.getComparator().str).append(' ');
-        query.addParam(finalPathFilterValue);
-        query.nextBool = mainCriterion.nextBool;
-        if (addedOrPathFilter) {
-            query.append(')');
-        }
-    }
-
-    private void fillLimitCriterion(DbSqlQueryBuilder query, int limit) {
-        if (limit == Integer.MAX_VALUE) {
-            return;
-        }
-
-        DbService dbService = StorageContextHelper.get().beanForType(DbService.class);
-        DbType databaseType = dbService.getDatabaseType();
-        if (databaseType == DbType.ORACLE) {
-            query.addNextBoolIfNeeded();
-            query.append("ROWNUM <= ").append(String.valueOf(limit));
-            query.nextBool = VfsBoolType.AND;
-        }
-    }
-
-
-    static class OrderBy {
-        String propertyName;
-        boolean ascending;
-
-        OrderBy(String propertyName, boolean ascending) {
-            this.propertyName = propertyName;
-            this.ascending = ascending;
-        }
-    }
-
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/search/model/VfsQueryPathCriterionDbImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/search/model/VfsQueryPathCriterionDbImpl.java
deleted file mode 100644
index a0906b0..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/search/model/VfsQueryPathCriterionDbImpl.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.search.model;
-
-import org.artifactory.sapi.search.InvalidQueryRuntimeException;
-import org.artifactory.sapi.search.VfsComparatorType;
-import org.artifactory.sapi.search.VfsQuery;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
-/**
- * Date: 8/6/11
- * Time: 12:01 PM
- *
- * @author Fred Simon
- */
-class VfsQueryPathCriterionDbImpl extends VfsQueryCriterionDbImpl {
-    VfsQueryPathCriterionDbImpl(@Nonnull VfsComparatorType comparator, @Nullable String value) {
-        super("node_path");
-        setComparator(comparator);
-        switch (comparator) {
-            case ANY:
-                this.value = VfsQuery.ALL_PATH_VALUE;
-                break;
-            case EQUAL:
-            case CONTAINS:
-                this.value = value;
-                break;
-            default:
-                throw new InvalidQueryRuntimeException("Path filter comparator type " + comparator + " not supported");
-        }
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/search/model/VfsQueryResultDbImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/search/model/VfsQueryResultDbImpl.java
deleted file mode 100644
index 207886e..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/search/model/VfsQueryResultDbImpl.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.search.model;
-
-import org.artifactory.sapi.search.VfsQueryResult;
-import org.artifactory.sapi.search.VfsQueryRow;
-
-/**
- * Date: 8/5/11
- * Time: 7:15 PM
- *
- * @author Fred Simon
- */
-public class VfsQueryResultDbImpl implements VfsQueryResult {
-    private final Iterable<VfsQueryRow> queryResult;
-    private long nbResult;
-
-    public VfsQueryResultDbImpl(Iterable<VfsQueryRow> queryResult, long count) {
-        this.queryResult = queryResult;
-        this.nbResult = count;
-    }
-
-    @Override
-    public long getCount() {
-        return nbResult;
-    }
-
-    @Override
-    public Iterable<VfsQueryRow> getAllRows() {
-        return queryResult;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/search/model/VfsQueryRowDbImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/search/model/VfsQueryRowDbImpl.java
deleted file mode 100644
index fa289d3..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/search/model/VfsQueryRowDbImpl.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.search.model;
-
-import com.google.common.collect.Sets;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.sapi.search.ArchiveEntryRow;
-import org.artifactory.sapi.search.VfsQueryRow;
-import org.artifactory.storage.db.fs.entity.NodePath;
-
-import java.util.Set;
-
-/**
- * Date: 8/5/11
- * Time: 10:55 PM
- *
- * @author Fred Simon
- */
-public class VfsQueryRowDbImpl implements VfsQueryRow {
-    private final DbItemInfoProxy item;
-    private final Set<ArchiveEntryRow> archiveEntries;
-
-    public VfsQueryRowDbImpl(long nodeId, boolean file, NodePath nodePath) {
-        if (file) {
-            item = new DbFileInfoProxy(nodeId, nodePath);
-        } else {
-            item = new DbFolderInfoProxy(nodeId, nodePath);
-        }
-        archiveEntries = null;
-    }
-
-    public VfsQueryRowDbImpl(long nodeId, boolean file, NodePath nodePath, String entryPath, String entryName) {
-        if (file) {
-            item = new DbFileInfoProxy(nodeId, nodePath);
-        } else {
-            item = new DbFolderInfoProxy(nodeId, nodePath);
-        }
-        archiveEntries = Sets.newHashSet();
-        addArchiveEntry(entryPath, entryName);
-    }
-
-    void addArchiveEntry(String entryPath, String entryName) {
-        archiveEntries.add(new ArchiveSearchEntry(entryPath, entryName));
-    }
-
-    @Override
-    public ItemInfo getItem() {
-        return item;
-    }
-
-    @Override
-    public Iterable<ArchiveEntryRow> getArchiveEntries() {
-        return archiveEntries;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/search/service/QueryServiceImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/search/service/QueryServiceImpl.java
deleted file mode 100644
index b0059ba..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/search/service/QueryServiceImpl.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.search.service;
-
-import org.artifactory.sapi.search.VfsQuery;
-import org.artifactory.sapi.search.VfsQueryService;
-import org.artifactory.storage.db.search.model.VfsQueryDbImpl;
-import org.springframework.stereotype.Service;
-
-/**
- * Date: 11/28/12
- * Time: 11:53 AM
- *
- * @author freds
- */
- at Service
-public class QueryServiceImpl implements VfsQueryService {
-    @Override
-    public VfsQuery createQuery() {
-        return new VfsQueryDbImpl();
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/security/dao/AclsDao.java b/storage/db/src/main/java/org/artifactory/storage/db/security/dao/AclsDao.java
deleted file mode 100644
index 7170fa7..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/security/dao/AclsDao.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.security.dao;
-
-import org.artifactory.storage.db.security.entity.Ace;
-import org.artifactory.storage.db.security.entity.Acl;
-import org.artifactory.storage.db.util.BaseDao;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Repository;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Date: 9/3/12
- * Time: 1:42 PM
- *
- * @author freds
- */
- at Repository
-public class AclsDao extends BaseDao {
-
-    @Autowired
-    public AclsDao(JdbcHelper jdbcHelper) {
-        super(jdbcHelper);
-    }
-
-    public int createAcl(Acl acl) throws SQLException {
-        int res = jdbcHelper.executeUpdate("INSERT INTO acls VALUES(" +
-                " ?, ?," +
-                " ?, ?)",
-                acl.getAclId(), acl.getPermTargetId(),
-                acl.getLastModified(), acl.getLastModifiedBy());
-        for (Ace ace : acl.getAces()) {
-            res += insertAce(ace);
-        }
-        return res;
-    }
-
-    public int updateAcl(Acl acl) throws SQLException {
-        int res = jdbcHelper.executeUpdate("UPDATE acls SET" +
-                " perm_target_id = ?, modified = ?, modified_by = ?" +
-                " WHERE acl_id = ?",
-                acl.getPermTargetId(), acl.getLastModified(), acl.getLastModifiedBy(),
-                acl.getAclId());
-        jdbcHelper.executeUpdate("DELETE FROM aces WHERE acl_id = ?", acl.getAclId());
-        for (Ace ace : acl.getAces()) {
-            res += insertAce(ace);
-        }
-        return res;
-    }
-
-    private int insertAce(Ace ace) throws SQLException {
-        return jdbcHelper.executeUpdate("INSERT INTO aces VALUES(?, ?, ?, ?, ?)",
-                ace.getAceId(), ace.getAclId(), ace.getMask(),
-                nullIfZero(ace.getUserId()), nullIfZero(ace.getGroupId()));
-    }
-
-    public int deleteAcl(long aclId) throws SQLException {
-        int res = jdbcHelper.executeUpdate("DELETE FROM aces WHERE acl_id = ?", aclId);
-        res += jdbcHelper.executeUpdate("DELETE FROM acls WHERE acl_id = ?", aclId);
-        return res;
-    }
-
-    public Acl findAclByPermissionTargetId(long permTargetId) throws SQLException {
-        ResultSet resultSet = null;
-        Acl acl = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM acls WHERE perm_target_id = ?", permTargetId);
-            if (resultSet.next()) {
-                acl = resultSetToAcl(resultSet);
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        if (acl != null) {
-            acl.setAces(findAces(acl.getAclId()));
-        }
-        return acl;
-    }
-
-    public Acl findAcl(long aclId) throws SQLException {
-        ResultSet resultSet = null;
-        Acl acl = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM acls WHERE acl_id = ?", aclId);
-            if (resultSet.next()) {
-                acl = resultSetToAcl(resultSet);
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        if (acl != null) {
-            acl.setAces(findAces(aclId));
-        }
-        return acl;
-    }
-
-    private Acl resultSetToAcl(ResultSet resultSet) throws SQLException {
-        Acl acl;
-        acl = new Acl(resultSet.getLong(1), resultSet.getLong(2), resultSet.getLong(3), resultSet.getString(4));
-        return acl;
-    }
-
-    private Set<Ace> findAces(long aclId) throws SQLException {
-        Set<Ace> aces = new HashSet<>(3);
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM aces WHERE acl_id = ?", aclId);
-            while (resultSet.next()) {
-                aces.add(aceFromResultSet(resultSet));
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        return aces;
-    }
-
-    public Collection<Acl> getAllAcls() throws SQLException {
-        ResultSet resultSet = null;
-        Map<Long, Acl> aclsMap = new HashMap<>();
-        Map<Long, Set<Ace>> acesMap = new HashMap<>();
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM acls");
-            while (resultSet.next()) {
-                Acl acl = resultSetToAcl(resultSet);
-                aclsMap.put(acl.getAclId(), acl);
-                acesMap.put(acl.getAclId(), new HashSet<Ace>(3));
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM aces");
-            while (resultSet.next()) {
-                Ace ace = aceFromResultSet(resultSet);
-                Set<Ace> aces = acesMap.get(ace.getAclId());
-                aces.add(ace);
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        for (Acl acl : aclsMap.values()) {
-            acl.setAces(acesMap.get(acl.getAclId()));
-        }
-        return aclsMap.values();
-    }
-
-    private Ace aceFromResultSet(ResultSet resultSet) throws SQLException {
-        return new Ace(resultSet.getLong(1), resultSet.getLong(2), resultSet.getInt(3),
-                zeroIfNull(resultSet.getLong(4)), zeroIfNull(resultSet.getLong(5)));
-    }
-
-    public boolean userHasAce(long userId) throws SQLException {
-        ResultSet rs = null;
-        try {
-            rs = jdbcHelper.executeSelect("SELECT COUNT(*) FROM aces WHERE user_id = ?", userId);
-            if (rs.next()) {
-                return rs.getInt(1) > 0;
-            }
-            return false;
-        } finally {
-            DbUtils.close(rs);
-        }
-    }
-
-    public boolean groupHasAce(long groupId) throws SQLException {
-        ResultSet rs = null;
-        try {
-            rs = jdbcHelper.executeSelect("SELECT COUNT(*) FROM aces WHERE group_id = ?", groupId);
-            if (rs.next()) {
-                return rs.getInt(1) > 0;
-            }
-            return false;
-        } finally {
-            DbUtils.close(rs);
-        }
-    }
-
-    public int deleteAceForGroup(long groupId) throws SQLException {
-        return jdbcHelper.executeUpdate("DELETE FROM aces WHERE group_id = ?", groupId);
-    }
-
-    public int deleteAceForUser(long userId) throws SQLException {
-        return jdbcHelper.executeUpdate("DELETE FROM aces WHERE user_id = ?", userId);
-    }
-
-    public int deleteAllAcls() throws SQLException {
-        int res = jdbcHelper.executeUpdate("DELETE FROM aces");
-        res += jdbcHelper.executeUpdate("DELETE FROM acls");
-        return res;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/security/dao/PermissionTargetsDao.java b/storage/db/src/main/java/org/artifactory/storage/db/security/dao/PermissionTargetsDao.java
deleted file mode 100644
index 78d0229..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/security/dao/PermissionTargetsDao.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.security.dao;
-
-import com.google.common.collect.Sets;
-import org.artifactory.storage.db.security.entity.PermissionTarget;
-import org.artifactory.storage.db.util.BaseDao;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Repository;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Date: 9/3/12
- * Time: 1:12 PM
- *
- * @author freds
- */
- at Repository
-public class PermissionTargetsDao extends BaseDao {
-
-    @Autowired
-    public PermissionTargetsDao(JdbcHelper jdbcHelper) {
-        super(jdbcHelper);
-    }
-
-    public int createPermissionTarget(PermissionTarget permTarget) throws SQLException {
-        int res = jdbcHelper.executeUpdate("INSERT INTO permission_targets VALUES(" +
-                " ?, ?," +
-                " ?, ?)",
-                permTarget.getPermTargetId(), permTarget.getName(),
-                permTarget.getIncludesPattern(), permTarget.getExcludesPattern());
-        for (String repoKey : permTarget.getRepoKeys()) {
-            res += jdbcHelper.executeUpdate("INSERT INTO permission_target_repos VALUES(?,?)",
-                    permTarget.getPermTargetId(), repoKey);
-        }
-        return res;
-    }
-
-    public int updatePermissionTarget(PermissionTarget permTarget) throws SQLException {
-        int res = jdbcHelper.executeUpdate("UPDATE permission_targets SET" +
-                " perm_target_name = ?, includes = ?, excludes = ?" +
-                " WHERE perm_target_id = ?",
-                permTarget.getName(), permTarget.getIncludesPattern(), permTarget.getExcludesPattern(),
-                permTarget.getPermTargetId());
-        jdbcHelper.executeUpdate("DELETE FROM permission_target_repos WHERE perm_target_id = ?",
-                permTarget.getPermTargetId());
-        for (String repoKey : permTarget.getRepoKeys()) {
-            res += jdbcHelper.executeUpdate("INSERT INTO permission_target_repos VALUES(?,?)",
-                    permTarget.getPermTargetId(), repoKey);
-        }
-        return res;
-    }
-
-    public int deletePermissionTarget(long permTargetId) throws SQLException {
-        int res = jdbcHelper.executeUpdate("DELETE FROM permission_target_repos WHERE perm_target_id = ?",
-                permTargetId);
-        res += jdbcHelper.executeUpdate("DELETE FROM permission_targets WHERE perm_target_id = ?", permTargetId);
-        return res;
-    }
-
-    public PermissionTarget findPermissionTarget(String permTargetName) throws SQLException {
-        ResultSet resultSet = null;
-        PermissionTarget permTarget = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM permission_targets WHERE perm_target_name = ?",
-                    permTargetName);
-            if (resultSet.next()) {
-                permTarget = resultSetToPermissionTarget(resultSet);
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        if (permTarget != null) {
-            permTarget.setRepoKeys(findRepoKeysForTarget(permTarget.getPermTargetId()));
-        }
-        return permTarget;
-    }
-
-    public PermissionTarget findPermissionTarget(long permTargetId) throws SQLException {
-        ResultSet resultSet = null;
-        PermissionTarget permTarget = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM permission_targets WHERE perm_target_id = ?",
-                    permTargetId);
-            if (resultSet.next()) {
-                permTarget = resultSetToPermissionTarget(resultSet);
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        if (permTarget != null) {
-            permTarget.setRepoKeys(findRepoKeysForTarget(permTargetId));
-        }
-        return permTarget;
-    }
-
-    public Map<Long, PermissionTarget> getAllPermissionTargets() throws SQLException {
-        ResultSet resultSet = null;
-        Map<Long, Set<String>> repoKeys = getAllRepoKeys();
-        Map<Long, PermissionTarget> permTargets = new HashMap<>(repoKeys.size());
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM permission_targets");
-            while (resultSet.next()) {
-                PermissionTarget pt = resultSetToPermissionTarget(resultSet);
-                Set<String> keys = repoKeys.get(pt.getPermTargetId());
-                if (keys == null) {
-                    pt.setRepoKeys(Collections.emptySet());
-                } else {
-                    pt.setRepoKeys(keys);
-                }
-                permTargets.put(pt.getPermTargetId(), pt);
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        return permTargets;
-    }
-
-    private Map<Long, Set<String>> getAllRepoKeys() throws SQLException {
-        ResultSet resultSet = null;
-        Map<Long, Set<String>> repoKeys = new HashMap<>(64);
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM permission_target_repos");
-            while (resultSet.next()) {
-                long ptId = resultSet.getLong(1);
-                Set<String> rks = repoKeys.get(ptId);
-                if (rks == null) {
-                    repoKeys.put(ptId, rks = new HashSet<>(3));
-                }
-                rks.add(resultSet.getString(2));
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        return repoKeys;
-    }
-
-    private HashSet<String> findRepoKeysForTarget(long permTargetId) throws SQLException {
-        HashSet<String> repoKeys;
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect(
-                    "SELECT repo_key FROM permission_target_repos WHERE perm_target_id = ?",
-                    permTargetId);
-            repoKeys = new HashSet<>(3);
-            while (resultSet.next()) {
-                repoKeys.add(resultSet.getString(1));
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        return repoKeys;
-    }
-
-    private PermissionTarget resultSetToPermissionTarget(ResultSet resultSet) throws SQLException {
-        PermissionTarget permTarget;
-        permTarget = new PermissionTarget(
-                resultSet.getLong(1), resultSet.getString(2),
-                resultSet.getString(3), resultSet.getString(4));
-        return permTarget;
-    }
-
-    public int deleteAllPermissionTargets() throws SQLException {
-        int res = jdbcHelper.executeUpdate("DELETE FROM permission_target_repos");
-        res += jdbcHelper.executeUpdate("DELETE FROM permission_targets");
-        return res;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/security/dao/UserGroupsDao.java b/storage/db/src/main/java/org/artifactory/storage/db/security/dao/UserGroupsDao.java
deleted file mode 100644
index 363b718..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/security/dao/UserGroupsDao.java
+++ /dev/null
@@ -1,947 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.security.dao;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.Sets;
-import org.artifactory.api.security.PasswordExpiryUser;
-import org.artifactory.api.security.UserInfoBuilder;
-import org.artifactory.common.Info;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.sapi.security.SecurityConstants;
-import org.artifactory.security.MutableGroupInfo;
-import org.artifactory.security.MutableUserInfo;
-import org.artifactory.security.SaltedPassword;
-import org.artifactory.security.UserGroupInfo;
-import org.artifactory.storage.db.security.entity.Group;
-import org.artifactory.storage.db.security.entity.User;
-import org.artifactory.storage.db.security.entity.UserGroup;
-import org.artifactory.storage.db.util.BaseDao;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.joda.time.DateTime;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Repository;
-
-import javax.annotation.Nullable;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.Predicate;
-
-/**
- * Date: 8/26/12
- * Time: 11:08 PM
- *
- * @author freds
- */
- at Repository
-public class UserGroupsDao extends BaseDao {
-
-    @Autowired
-    private UserPropertiesDao userPropertiesDao;
-
-    @Autowired
-    public UserGroupsDao(JdbcHelper jdbcHelper) {
-        super(jdbcHelper);
-    }
-
-    public int createGroup(Group group) throws SQLException {
-        return jdbcHelper.executeUpdate("INSERT INTO groups VALUES(?, ?, ?, ?, ?, ?)",
-                group.getGroupId(), group.getGroupName(), group.getDescription(),
-                booleanAsByte(group.isNewUserDefault()), group.getRealm(), group.getRealmAttributes());
-    }
-
-    public int updateGroup(Group group) throws SQLException {
-        return jdbcHelper.executeUpdate("UPDATE groups SET " +
-                " description = ?, default_new_user = ?," +
-                " realm = ?, realm_attributes = ?" +
-                " WHERE group_id = ? AND group_name = ?",
-                group.getDescription(), booleanAsByte(group.isNewUserDefault()),
-                group.getRealm(), group.getRealmAttributes(),
-                group.getGroupId(), group.getGroupName());
-    }
-
-    public int deleteGroup(String groupName) throws SQLException {
-        Group group = findGroupByName(groupName);
-        if (group == null) {
-            // Group doesn't exist
-            return 0;
-        }
-        int res = jdbcHelper.executeUpdate("DELETE FROM users_groups WHERE group_id = ?", group.getGroupId());
-        res += jdbcHelper.executeUpdate("DELETE FROM groups WHERE group_id = ?", group.getGroupId());
-        return res;
-    }
-
-    public int createUser(User user) throws SQLException {
-        int res = jdbcHelper.executeUpdate("INSERT INTO users VALUES(" +
-                        " ?," +
-                        " ?, ?, ?," +
-                        " ?, ?," +
-                        " ?, ?, ?," +
-                        " ?, ?, ?," +
-                        " ?, ?," +
-                        " ?, ?," +
-                        " ?, ?, ?)",
-                user.getUserId(),
-                user.getUsername(), nullIfEmpty(user.getPassword()), nullIfEmpty(user.getSalt()),
-                nullIfEmpty(user.getEmail()), nullIfEmpty(user.getGenPasswordKey()),
-                booleanAsByte(user.isAdmin()), booleanAsByte(user.isEnabled()),
-                booleanAsByte(user.isUpdatableProfile()),
-                nullIfEmpty(user.getRealm()), nullIfEmpty(user.getPrivateKey()), nullIfEmpty(user.getPublicKey()),
-                user.getLastLoginTimeMillis(), nullIfEmpty(user.getLastLoginClientIp()),
-                null, null,
-                nullIfEmpty(user.getBintrayAuth()), booleanAsByte(user.isLocked()), booleanAsByte(user.isCredentialsExpired()));
-
-        for (UserGroup userGroup : user.getGroups()) {
-            res += jdbcHelper.executeUpdate("INSERT INTO users_groups VALUES (?, ?, ?)",
-                    userGroup.getUserId(), userGroup.getGroupId(), userGroup.getRealm());
-        }
-
-        setPasswordCreatedNow(user.getUsername());
-
-        return res;
-    }
-
-    public int updateUser(User user) throws SQLException {
-        int res = jdbcHelper.executeUpdate("UPDATE users SET " +
-                        " password = ?, salt = ?," +
-                        " email = ?, gen_password_key = ?," +
-                        " admin = ?, enabled = ?, updatable_profile = ?," +
-                        " realm = ?, private_key = ?, public_key = ?," +
-                        " last_login_time = ?, last_login_ip = ?," +
-                        " bintray_auth = ?, credentials_expired = ?" +
-                        " WHERE user_id = ? AND username = ?",
-                nullIfEmpty(user.getPassword()), nullIfEmpty(user.getSalt()),
-                nullIfEmpty(user.getEmail()), nullIfEmpty(user.getGenPasswordKey()),
-                booleanAsByte(user.isAdmin()), booleanAsByte(user.isEnabled()),
-                booleanAsByte(user.isUpdatableProfile()),
-                nullIfEmpty(user.getRealm()), nullIfEmpty(user.getPrivateKey()), nullIfEmpty(user.getPublicKey()),
-                user.getLastLoginTimeMillis(), nullIfEmpty(user.getLastLoginClientIp()),
-                // TODO Cleanup
-                /*THE lastAccessTimeMillis and lastAccessClientIP  NOT IN USE
-                user.getLastAccessTimeMillis(), nullIfEmpty(user.getLastAccessClientIp()),*/
-                nullIfEmpty(user.getBintrayAuth()), booleanAsByte(user.isCredentialsExpired()),
-                user.getUserId(), user.getUsername());
-        if (res == 1) {
-            jdbcHelper.executeUpdate("DELETE FROM users_groups WHERE user_id = ?", user.getUserId());
-            for (UserGroup userGroup : user.getGroups()) {
-                res += jdbcHelper.executeUpdate("INSERT INTO users_groups VALUES (?, ?, ?)",
-                        userGroup.getUserId(), userGroup.getGroupId(), userGroup.getRealm());
-            }
-        }
-        return res;
-    }
-
-    public int deleteUser(String username) throws SQLException {
-        long userId = findUserIdByUsername(username);
-        if (userId == 0L) {
-            // User already deleted
-            return 0;
-        }
-        int res = jdbcHelper.executeUpdate("DELETE FROM users_groups WHERE user_id = ?", userId);
-        res += jdbcHelper.executeUpdate("DELETE FROM user_props WHERE user_id = ?", userId);
-        res += jdbcHelper.executeUpdate("DELETE FROM users WHERE user_id = ?", userId);
-        return res;
-    }
-
-    public long findUserIdByUsername(String username) throws SQLException {
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT user_id FROM users WHERE username = ?", username);
-            if (resultSet.next()) {
-                return resultSet.getLong(1);
-            }
-            return 0L;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public String findUsernameByUserId(long userId) throws SQLException {
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT username FROM users WHERE user_id = ?", userId);
-            if (resultSet.next()) {
-                return resultSet.getString(1);
-            }
-            return null;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public Map<Long, String> getAllUsernamePerIds() throws SQLException {
-        ResultSet resultSet = null;
-        Map<Long, String> results = new HashMap<>();
-        try {
-            String query = "SELECT user_id, username FROM users";
-            resultSet = jdbcHelper.executeSelect(query);
-            while (resultSet.next()) {
-                results.put(resultSet.getLong(1), resultSet.getString(2));
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        return results;
-    }
-
-    public Map<Long, String> getAllGroupNamePerIds() throws SQLException {
-        ResultSet resultSet = null;
-        Map<Long, String> results = new HashMap<>();
-        try {
-            String query = "SELECT group_id, group_name FROM groups";
-            resultSet = jdbcHelper.executeSelect(query);
-            while (resultSet.next()) {
-                results.put(resultSet.getLong(1), resultSet.getString(2));
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        return results;
-    }
-
-    public Collection<User> getAllUsers(boolean includeAdmins) throws SQLException {
-        ResultSet resultSet = null;
-        Map<Long, User> results = new HashMap<>();
-        Map<Long, Set<UserGroup>> groups = new HashMap<>();
-        try {
-            String query = "SELECT * FROM users";
-            if (!includeAdmins) {
-                query += " WHERE admin != 1";
-            }
-            resultSet = jdbcHelper.executeSelect(query);
-            while (resultSet.next()) {
-                User user = userFromResultSet(resultSet);
-                results.put(user.getUserId(), user);
-                groups.put(user.getUserId(), new HashSet<>());
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM users_groups");
-            while (resultSet.next()) {
-                UserGroup userGroup = userGroupFromResultSet(resultSet);
-                Set<UserGroup> userGroups = groups.get(userGroup.getUserId());
-                // Group not found due to admin filtering
-                if (userGroups != null) {
-                    userGroups.add(userGroup);
-                }
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        for (Map.Entry<Long, Set<UserGroup>> entry : groups.entrySet()) {
-            User user = results.get(entry.getKey());
-            if (user == null) {
-                throw new IllegalStateException("Map population of users and groups failed!");
-            } else {
-                user.setGroups(entry.getValue());
-            }
-        }
-        return results.values();
-    }
-
-
-    /**
-     * get users and groups info with paging
-     *
-     * @param includeAdmins - include admin
-     * @return list of users and group info
-     * @throws SQLException
-     */
-    public Collection<Info> getUsersGroupsPaging(boolean includeAdmins, String orderBy,
-            String startOffset, String limit, String direction) throws SQLException {
-        ResultSet resultSet = null;
-        String userGroupTable;
-        /// get base user group query
-        userGroupTable = getBaseUserGroupQuery(includeAdmins);
-        // get paginated query
-        Map<Long, Info> results = new LinkedHashMap<>();
-        Map<Long, Set<UserGroupInfo>> usrGroupsMap = new LinkedHashMap<>();
-        try {
-            resultSet = jdbcHelper.executeSelect(userGroupTable);
-            while (resultSet.next()) {
-                userAndGroupFromResultSet(resultSet, results, usrGroupsMap);
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        return results.values();
-    }
-
-    /**
-     * get all users count
-     *
-     * @param includeAdmins - if true include admin
-     * @return
-     */
-    public long getAllUsersGroupsCount(boolean includeAdmins) {
-        String countQuery;
-        countQuery = getUserGroupCountQuery(includeAdmins);
-        Long count = null;
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect(countQuery);
-            while (resultSet.next()) {
-                count = resultSet.getLong(1);
-            }
-        } catch (SQLException e) {
-            e.printStackTrace();
-        } finally {
-            if (resultSet != null) {
-                DbUtils.close(resultSet);
-            }
-        }
-        return count;
-    }
-
-    /**
-     * get user groups count query with or without admin
-     *
-     * @param includeAdmins - if true include admin
-     * @return count query
-     */
-    private String getUserGroupCountQuery(boolean includeAdmins) {
-        String countQuery;
-        if (includeAdmins) {
-            countQuery = "select count(*) as cnt from (\n" +
-                    "\t\t\tselect distinct users.user_id as id,username as principal,admin, 'user' as type\n" +
-                    "\t\t\tfrom users\n" +
-                    "\t\tunion\n" +
-                    "\t\t\tselect distinct groups.group_id as id ,group_name as principal,0 as admin, 'group' as type\n" +
-                    "\t\t\t from groups \n" +
-                    "\t\t)   usergroups  ";
-        } else {
-            countQuery = "select count(*) as cnt from (\n" +
-                    "\t\t\tselect distinct users.user_id as id,username as principal,admin,'user' as type\n" +
-                    "\t\t\tfrom users WHERE admin != 1\n" +
-                    "\t\tunion\n" +
-                    "\t\t\tselect distinct groups.group_id as id ,group_name as principal,0 as admin,'group' as type\n" +
-                    "\t\t\t from groups \n" +
-                    "\t\t)   usergroups  ";
-        }
-        return countQuery;
-    }
-
-    /**
-     * get base query and add pagination keys based on db type
-     *
-     * @param userGroupTable - user group base query
-     * @return query with pagination support
-     */
-    private String getPaginatedQuery(String userGroupTable) {
-        StringBuilder queryWriter = new StringBuilder();
-
-        String innerQuery = queryWriter.append("Select * from (").append(userGroupTable + " as userAndGroups").
-                append(" LEFT JOIN users_groups ON userAndGroups.id = users_groups.user_id").toString();
-        return innerQuery;
-    }
-
-    /**
-     * get base query to fetch users and groups data
-     *
-     * @param includeAdmins - fetch include admin
-     * @return base query
-     */
-    private String getBaseUserGroupQuery(boolean includeAdmins) {
-        String userGroupTable;
-        if (!includeAdmins) {
-            userGroupTable = "Select * from (select distinct users.user_id as id,username as principal,admin,'user' as type\n" +
-                    "\t\t\tfrom users where admin != 1\n" +
-                    "\t\tunion\n" +
-                    "select distinct groups.group_id as id ,group_name as principal,0 as admin, 'group' as type\n" +
-                    "\t\t\t from groups ) as userAndGroups \n" +
-                    "\t\tLEFT JOIN users_groups ON userAndGroups.id = users_groups.user_id";
-        } else {
-            userGroupTable = "Select * from (select distinct users.user_id as id,username as principal,admin,'user' as type\n" +
-                    "\t\t\tfrom users\n" +
-                    "\t\tunion\n" +
-                    "select distinct groups.group_id as id ,group_name as principal,0 as admin, 'group' as type\n" +
-                    "\t\t\t from groups ) as userAndGroups \n" +
-                    "\t\tLEFT JOIN users_groups ON userAndGroups.id = users_groups.user_id";
-        }
-        return userGroupTable;
-    }
-
-    public User findUserById(long userId) throws SQLException {
-        ResultSet resultSet = null;
-        User user = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM users WHERE user_id = ?", userId);
-            if (resultSet.next()) {
-                user = userFromResultSet(resultSet);
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        if (user != null) {
-            user.setGroups(findUserGroupByUserId(userId));
-        }
-        return user;
-    }
-
-    /**
-     * Searches user in DB
-     *
-     * @param username user to look for
-     * @return {@link User}
-     *
-     * @throws SQLException in case of lookup failure
-     */
-    public User findUserByName(String username) throws SQLException {
-        return findUserByName(username, true);
-    }
-
-    /**
-     * Searches user in DB
-     *
-     * @param username user to look for
-     * @param includeGroups if user groups to be included
-     * @return {@link User}
-     *
-     * @throws SQLException in case of lookup failure
-     */
-    public User findUserByName(String username, boolean includeGroups) throws SQLException {
-        ResultSet resultSet = null;
-        User user = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM users WHERE username = ?", username);
-            if (resultSet.next()) {
-                user = userFromResultSet(resultSet);
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        if (user != null && includeGroups) {
-            user.setGroups(findUserGroupByUserId(user.getUserId()));
-        }
-        return user;
-    }
-
-    public Group findGroupById(long groupId) throws SQLException {
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM groups WHERE group_id = ?", groupId);
-            if (resultSet.next()) {
-                return groupFromResultSet(resultSet);
-            }
-            return null;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    /**
-     * Fond the group entity by name if found.
-     * Returns null if no group with this name found.
-     *
-     * @param groupName The name of the group to find
-     * @return The Group DB entity object
-     * @throws SQLException If the query cannot be executed
-     */
-    @Nullable
-    public Group findGroupByName(String groupName) throws SQLException {
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM groups WHERE group_name = ?", groupName);
-            if (resultSet.next()) {
-                return groupFromResultSet(resultSet);
-            }
-            return null;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public int addUsersToGroup(long groupId, Collection<String> usernames, String realm) throws SQLException {
-        if (usernames == null || usernames.isEmpty()) {
-            throw new IllegalArgumentException("List of usernames to add group " + groupId + " to cannot be empty!");
-        }
-        // Find if the users passed already have the group
-        Collection<String> toAddUsernames = usernames;
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT u.username" +
-                    " FROM users u, users_groups ug" +
-                    " WHERE ug.group_id = ?" +
-                    " AND ug.user_id = u.user_id" +
-                    " AND u.username IN (#)", groupId, usernames);
-            if (resultSet.next()) {
-                // Found some usernames that needs to be removed
-                toAddUsernames = new HashSet<>(usernames);
-                toAddUsernames.remove(resultSet.getString(1));
-                while (resultSet.next()) {
-                    toAddUsernames.remove(resultSet.getString(1));
-                }
-            }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-
-        if (!toAddUsernames.isEmpty()) {
-            return jdbcHelper.executeUpdate("INSERT INTO users_groups (user_id, group_id, realm)" +
-                    " SELECT u.user_id, ?, ? FROM users u WHERE u.username IN (#)", groupId, realm, toAddUsernames);
-        }
-        return 0;
-    }
-
-    public int removeUsersFromGroup(long groupId, List<String> usernames) throws SQLException {
-        return jdbcHelper.executeUpdate("DELETE FROM users_groups " +
-                "WHERE group_id = ? " +
-                "AND user_id IN (SELECT u.user_id FROM users u WHERE username IN (#))", groupId, usernames);
-    }
-
-    public Collection<Group> findGroups(GroupFilter filter) throws SQLException {
-        List<Group> results = new ArrayList<>();
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM groups" + filter.filter);
-            while (resultSet.next()) {
-                results.add(groupFromResultSet(resultSet));
-            }
-            return results;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    private Set<UserGroup> findUserGroupByUserId(long userId) throws SQLException {
-        final Set<UserGroup> result = new HashSet<>(1);
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM users_groups WHERE user_id = ?", userId);
-            while (resultSet.next()) {
-                result.add(userGroupFromResultSet(resultSet));
-            }
-            return result;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public List<User> findUsersInGroup(long groupId) throws SQLException {
-        List<User> results = new ArrayList<>();
-        Set<UserGroup> userGroups = findUserGroupByGroupId(groupId);
-        for (UserGroup userGroup : userGroups) {
-            results.add(findUserById(userGroup.getUserId()));
-        }
-        return results;
-    }
-
-    public boolean adminUserExists() throws SQLException {
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT COUNT(user_id) FROM users WHERE admin = 1");
-            if (resultSet.next()) {
-                return resultSet.getLong(1) > 0L;
-            }
-            return false;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public int deleteAllGroupsAndUsers() throws SQLException {
-        int res = jdbcHelper.executeUpdate("DELETE FROM users_groups");
-        res += jdbcHelper.executeUpdate("DELETE FROM groups");
-        res += jdbcHelper.executeUpdate("DELETE FROM user_props");
-        res += jdbcHelper.executeUpdate("DELETE FROM users");
-        return res;
-    }
-
-    private Set<UserGroup> findUserGroupByGroupId(long groupId) throws SQLException {
-        Set<UserGroup> result = new HashSet<>(1);
-        ResultSet resultSet = null;
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM users_groups WHERE group_id = ?", groupId);
-            while (resultSet.next()) {
-                result.add(userGroupFromResultSet(resultSet));
-            }
-            return result;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    private User userFromResultSet(ResultSet rs) throws SQLException {
-        String userName = rs.getString(2);
-        return new User(rs.getLong(1), userName, emptyIfNull(rs.getString(3)),
-                nullIfEmpty(rs.getString(4)), nullIfEmpty(rs.getString(5)), nullIfEmpty(rs.getString(6)),
-                rs.getBoolean(7), rs.getBoolean(8), rs.getBoolean(9),
-                nullIfEmpty(rs.getString(10)), nullIfEmpty(rs.getString(11)), nullIfEmpty(rs.getString(12)),
-                rs.getLong(13), nullIfEmpty(rs.getString(14)),
-                // TODO Cleanup
-                /*rs.getLong(15), nullIfEmpty(rs.getString(16)) THE lastAccessTimeMillis and lastAccessClientIP  NOT IN USE*/
-                nullIfEmpty(rs.getString(17)), rs.getBoolean(18), rs.getBoolean(19)
-        );
-    }
-
-    /**
-     * populate user row data to info (users & groups) data
-     *
-     * @param rs            - users  and group info result set
-     * @param userGroupInfo - user group info map
-     * @throws SQLException
-     */
-    private void userAndGroupFromResultSet(ResultSet rs, Map<Long, Info> userGroupInfo,
-            Map<Long, Set<UserGroupInfo>> usrGroupsMap) throws SQLException {
-        Long id = rs.getLong(1);
-        String type = rs.getString(4);
-        if (type.trim().equals("user")) {
-            addUserInfo(rs, userGroupInfo, id, usrGroupsMap);
-        } else {
-            addGroupInfo(rs, userGroupInfo, id);
-        }
-        usrGroupsMap.forEach((keyID, groupValue) -> ((MutableUserInfo) userGroupInfo.get(keyID)).setGroups(groupValue));
-    }
-
-    /**
-     * populate group row data to info (users & groups) data
-     *
-     * @param rs            - users  and group info result set
-     * @param userGroupInfo - user group info map
-     * @param id            - group id
-     * @throws SQLException
-     */
-    private void addGroupInfo(ResultSet rs, Map<Long, Info> userGroupInfo, Long id) throws SQLException {
-        String groupName = rs.getString(2);
-        MutableGroupInfo groupInfo = InfoFactoryHolder.get().createGroup(groupName);
-        userGroupInfo.put(id, groupInfo);
-    }
-
-    /**
-     * add user Info to user & group info map
-     *
-     * @param rs            - users  and group info result set
-     * @param userGroupInfo - user group info map
-     * @param id            - row id
-     * @throws SQLException
-     */
-    private void addUserInfo(ResultSet rs, Map<Long, Info> userGroupInfo, Long id,
-            Map<Long, Set<UserGroupInfo>> usrGroupsMap) throws SQLException {
-        if (userGroupInfo.get(id) == null) {
-            MutableUserInfo userInfo = new UserInfoBuilder(rs.getString(2)).admin(rs.getBoolean(3)).build();
-            Set<UserGroupInfo> groups = new HashSet<>();
-            Long groupID = rs.getLong(6);
-            String realm = rs.getString(7);
-            addGroupToUser(groups, groupID, realm);
-            usrGroupsMap.put(id, groups);
-            userGroupInfo.put(id, userInfo);
-        } else {
-            Set<UserGroupInfo> groups = usrGroupsMap.get(id);
-            Long groupID = rs.getLong(6);
-            String realm = rs.getString(7);
-            addGroupToUser(groups, groupID, realm);
-        }
-    }
-
-    /**
-     * @param groups
-     * @param groupID
-     * @throws SQLException
-     */
-    private void addGroupToUser(Set<UserGroupInfo> groups, Long groupID, String realm) throws SQLException {
-        Group groupById = findGroupById(groupID);
-        if (groupById != null) {
-            String groupName = groupById.getGroupName();
-            UserGroupInfo userGroup = InfoFactoryHolder.get().createUserGroup(groupName, realm);
-            groups.add(userGroup);
-        }
-    }
-
-    private Group groupFromResultSet(ResultSet rs) throws SQLException {
-        return new Group(rs.getLong(1), rs.getString(2), rs.getString(3), rs.getBoolean(4),
-                rs.getString(5), rs.getString(6));
-    }
-
-    private UserGroup userGroupFromResultSet(ResultSet rs) throws SQLException {
-        return new UserGroup(rs.getLong(1), rs.getLong(2), rs.getString(3));
-    }
-
-    public static enum GroupFilter {
-        ALL(""),
-        DEFAULTS(" WHERE default_new_user=1"),
-        EXTERNAL(" WHERE realm IS NOT NULL AND realm != '" + SecurityConstants.DEFAULT_REALM + "'"),
-        INTERNAL(" WHERE realm IS NULL OR realm = '" + SecurityConstants.DEFAULT_REALM + "'");
-
-        final String filter;
-
-        GroupFilter(String filter) {
-            this.filter = filter;
-        }
-    }
-
-    /**
-     * Locks user on login failure
-     *
-     * @param user
-     * @return result
-     * @throws SQLException
-     */
-    public int lockUser(User user) throws SQLException {
-        return jdbcHelper.executeUpdate("UPDATE users SET " +
-                        " locked = ?" +
-                        " WHERE user_id = ? AND username = ?",
-                1, user.getUserId(), user.getUsername());
-    }
-
-    /**
-     * Makes user password expired
-     *
-     * @param userName
-     * @return result
-     * @throws SQLException
-     */
-    public int expireUserPassword(String userName) throws SQLException {
-        return setUserPasswordExpired(userName, true);
-    }
-
-    /**
-     * Unexpires user's password
-     *
-     * @param userName
-     * @return result
-     * @throws SQLException
-     */
-    public int unexpirePassword(String userName) throws SQLException {
-        int result1 = setUserPasswordExpired(userName, false);
-        boolean result2 = setPasswordCreatedNow(userName);
-        return !result2 ? -1 : result1;
-    }
-
-    /**
-     * Sets password creation time to NOW
-     *
-     * @param userName
-     * @return boolean
-     *
-     * @throws SQLException
-     */
-    private boolean setPasswordCreatedNow(String userName) throws SQLException {
-        return userPropertiesDao.addUserPropertyByUserName(
-                userName,
-                "passwordCreated",
-                Long.toString(DateTime.now().getMillis())
-        );
-    }
-
-    /**
-     * Sets credentials_expired value
-     *
-     * @param userName
-     * @param passwordExpired
-     *
-     * @return result
-     * @throws SQLException
-     */
-    private int setUserPasswordExpired(String userName, boolean passwordExpired) throws SQLException {
-        return jdbcHelper.executeUpdate("UPDATE users SET " +
-                        " credentials_expired = ?" +
-                        " WHERE username = ?",
-                passwordExpired ? 1 : 0, userName);
-    }
-
-    /**
-     * Unlocks user after it has been locked out
-     *
-     * @param user
-     * @return result
-     * @throws SQLException
-     */
-    public boolean unlockUser(User user) throws SQLException {
-        int unlockResult = jdbcHelper.executeUpdate("UPDATE users SET " +
-                        " locked = ?" +
-                        " WHERE user_id = ? AND username = ?",
-                0, user.getUserId(), user.getUsername()
-        );
-
-        return unlockResult == 1;
-    }
-
-    /**
-     * Unlocks all locked out users
-     *
-     * @return result
-     * @throws SQLException
-     */
-    public int unlockAdminUsers() throws SQLException {
-        return jdbcHelper.executeUpdate("UPDATE users SET " +
-                        " locked = ?" +
-                        " WHERE locked = ? and admin = ?",
-                0, 1, 1);
-    }
-
-    /**
-     * Unlocks all locked out users
-     *
-     * @return result
-     * @throws SQLException
-     */
-    public int unlockAllUsers() throws SQLException {
-        return jdbcHelper.executeUpdate("UPDATE users SET " +
-                        " locked = ?" +
-                        " WHERE locked = ?",
-               0, 1);
-    }
-
-    /**
-     * Sets whether password is expired for all users
-     *
-     * @return result
-     * @throws SQLException
-     */
-    private int setPasswordExpiredForAllUsers(boolean passwordExpired) throws SQLException {
-        return jdbcHelper.executeUpdate(
-                "UPDATE users SET credentials_expired = ? " +
-                        "WHERE password is not NULL and username != 'anonymous'",
-                passwordExpired ? 1 : 0
-        );
-    }
-
-    /**
-     * Expires password for all users
-     *
-     * @return result
-     * @throws SQLException
-     */
-    public int expirePasswordForAllUsers() throws SQLException {
-        return setPasswordExpiredForAllUsers(true);
-    }
-
-    /**
-     * Unexpires password for all users
-     *
-     * @return result
-     * @throws SQLException
-     */
-    public int unexpirePasswordForAllUsers() throws SQLException {
-        int result1 = setPasswordExpiredForAllUsers(false);
-        boolean result2 = userPropertiesDao.resetPasswordCreatedForAllUsers(Long.toString(new DateTime().getMillis()));
-        return !result2 ? -1 : result1;
-    }
-
-    /**
-     * @return locked out users (usernames)
-     */
-    public Set <String> getLockedUsersNames() throws SQLException {
-        ResultSet resultSet = null;
-        Set <String> users = Sets.newHashSet();
-        try {
-            String query = "SELECT username FROM users where locked = 1";
-
-            resultSet = jdbcHelper.executeSelect(query);
-            if (resultSet!=null)
-                while (resultSet.next()) {
-                    users.add(resultSet.getString(1));
-                }
-        } finally {
-            DbUtils.close(resultSet);
-        }
-        return users;
-    }
-
-    /**
-     * Changes user's password
-     *
-     * @param userName
-     * @param saltedPassword
-     *
-     * @return result
-     * @throws SQLException
-     */
-    public int changePassword(String userName, SaltedPassword saltedPassword) throws SQLException {
-        return jdbcHelper.executeUpdate("UPDATE users SET " +
-                        " password = ?, salt = ?" +
-                        " WHERE username = ?",
-                saltedPassword.getPassword(),
-                saltedPassword.getSalt(),
-                userName
-        );
-    }
-
-    /**
-     * Retrieves users that are valid for password expiry checks (not anon, has internal password and password
-     * creation time) based on the given {@param filter}
-     *
-     * @param filter        Predicate to filter users by
-     * @return              'Lean' user models with needed data
-     * @throws SQLException
-     */
-    public Set<PasswordExpiryUser> getPasswordExpiredUsersByFilter(Predicate<Long> filter) throws SQLException {
-        ResultSet rs = null;
-        Set<PasswordExpiryUser> results = Sets.newHashSet();
-        String usersWithPassCreation =
-                "SELECT u.user_id, u.username, u.email, d.prop_value " +
-                        "FROM users u INNER JOIN user_props d ON (u.user_id = d.user_id)" +
-                        "WHERE u.user_id = d.user_id " +
-                        "and u.username != 'anonymous' " +
-                        "and u.credentials_expired != 1 " +
-                        "and u.password is NOT NULL " +
-                        "and d.prop_key = 'passwordCreated' " +
-                        "and d.prop_value is not NULL ";
-        try {
-            rs = jdbcHelper.executeSelect(usersWithPassCreation);
-            while (rs.next()) {
-                if(filter.test(rs.getLong(4))) {
-                    results.add(new PasswordExpiryUser(rs.getLong(1), rs.getString(2), rs.getString(3), rs.getLong(4)));
-                }
-            }
-            return results;
-        } finally {
-            DbUtils.close(rs);
-        }
-    }
-
-    /**
-     * Marks user.credentials_expired=1 where password has expired
-     *
-     * @param usersBatch    Batch of {@link PasswordExpiryUser} to run update on
-     * @throws SQLException
-     */
-    public void markCredentialsExpired(Long[] usersBatch) throws SQLException {
-        String expireCredsQuery = "UPDATE users set credentials_expired = 1 where user_id = ?";
-        //Start inserting or to the query from the second user id
-        for (int i = 1; i < usersBatch.length; i++) {
-            expireCredsQuery += " or user_id = ?";
-        }
-        jdbcHelper.executeUpdate(expireCredsQuery, usersBatch);
-    }
-
-    /**
-     * @param userName
-     * @return the date when last password was created
-     * @throws SQLException
-     */
-    public Long getUserPasswordCreationTime(String userName) throws SQLException {
-        String passwordCreated = userPropertiesDao.getUserProperty(userName, "passwordCreated");
-        if (!Strings.isNullOrEmpty(passwordCreated)) {
-            return Long.valueOf(passwordCreated);
-        }
-        return null;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/security/dao/UserPropertiesDao.java b/storage/db/src/main/java/org/artifactory/storage/db/security/dao/UserPropertiesDao.java
deleted file mode 100644
index bd5938f..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/security/dao/UserPropertiesDao.java
+++ /dev/null
@@ -1,189 +0,0 @@
-package org.artifactory.storage.db.security.dao;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import org.artifactory.model.xstream.security.UserProperty;
-import org.artifactory.security.UserPropertyInfo;
-import org.artifactory.storage.db.util.BaseDao;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Repository;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * A dao for the user_props table.
- * This table contains any extra data or properties connected to users that may
- * be required by external authentication methods.
- *
- * @author Travis Foster
- */
- at Repository
-public class UserPropertiesDao extends BaseDao {
-
-    @Autowired
-    public UserPropertiesDao(JdbcHelper jdbcHelper) {
-        super(jdbcHelper);
-    }
-
-    public long getUserIdByProperty(String key, String val) throws SQLException {
-        ResultSet rs = null;
-        try {
-            String sel = "SELECT user_id FROM user_props ";
-            sel += "WHERE prop_key like '%" + key + "' AND prop_value = ?";
-            rs = jdbcHelper.executeSelect(sel, val);
-            if (rs.next()) {
-                return rs.getLong(1);
-            }
-            return 0L;
-        } finally {
-            DbUtils.close(rs);
-        }
-    }
-
-    public String getUserProperty(String username, String key) throws SQLException {
-        ResultSet rs = null;
-        try {
-            String sel = "SELECT d.prop_value FROM users u INNER JOIN user_props d ON (u.user_id = d.user_id) ";
-            sel += "WHERE u.username = ? AND d.prop_key = ?";
-            rs = jdbcHelper.executeSelect(sel, username, key);
-            if (rs.next()) {
-                return rs.getString(1);
-            }
-            return null;
-        } finally {
-            DbUtils.close(rs);
-        }
-    }
-
-    public boolean deleteProperty(long uid, String key) throws SQLException {
-        String del = "DELETE FROM user_props WHERE user_id = ? AND prop_key = ?";
-        return jdbcHelper.executeUpdate(del, uid, key) == 1;
-    }
-
-    public List<UserProperty> getPropertiesForUser(String username) throws SQLException {
-        ResultSet rs = null;
-        List<UserProperty> results = Lists.newArrayList();
-        try {
-            String sel = "SELECT d.user_id,d.prop_key,d.prop_value FROM users u " +
-                    "INNER JOIN user_props d ON (u.user_id = d.user_id) " +
-                    "WHERE u.username = ?";
-            rs = jdbcHelper.executeSelect(sel, username);
-            while (rs.next()) {
-                results.add(propertyFromResultSet(rs));
-            }
-            return results;
-        } finally {
-            DbUtils.close(rs);
-        }
-    }
-
-    public Map<Long, Set<UserPropertyInfo>> getAllUserProperties() throws SQLException {
-        ResultSet rs = null;
-        Set<UserPropertyInfo> results = null;
-        Map<Long, Set<UserPropertyInfo>> userPropertyMap = Maps.newHashMap();
-        try {
-            String sel = "SELECT user_id,prop_key,prop_value FROM user_props order by user_id ";
-            rs = jdbcHelper.executeSelect(sel);
-            while (rs.next()) {
-                Long userId = rs.getLong(1);
-                if (userPropertyMap.get(userId) == null) {
-                    results = Sets.newHashSet();
-                    results.add(propertyFromData(rs));
-                    userPropertyMap.put(userId, results);
-                } else {
-                    results.add(propertyFromData(rs));
-                }
-            }
-            return userPropertyMap;
-        } finally {
-            DbUtils.close(rs);
-        }
-    }
-
-
-    private UserProperty propertyFromResultSet(ResultSet resultSet) throws SQLException {
-        String propKey = resultSet.getString(2);
-        String propValue = emptyIfNull(resultSet.getString(3));
-        return new UserProperty(propKey, propValue);
-    }
-
-    private UserProperty propertyFromData(ResultSet resultSet) throws SQLException {
-        String propKey = resultSet.getString(2);
-        String propValue = emptyIfNull(resultSet.getString(3));
-        return new UserProperty(propKey, propValue);
-    }
-    public void deletePropertyFromAllUsers(String propertyKey) throws SQLException {
-        String del = "DELETE FROM user_props WHERE prop_key = ?";
-        jdbcHelper.executeUpdate(del, propertyKey);
-    }
-    /**
-     * find user id by name and add property to that user
-     *
-     * @param id - user id
-     * @param key      - prop key
-     * @param val      - prop password
-     * @return - if true adding property succeeded
-     * @throws SQLException
-     */
-    public boolean addUserPropertyById(long id, String key, String val) throws SQLException {
-        deleteProperty(id, key);
-        String ins = "INSERT INTO user_props (user_id, prop_key, prop_value) VALUES (?, ?, ?)";
-        int updateStatus = jdbcHelper.executeUpdate(ins, id, key, val);
-        return updateStatus == 1;
-    }
-    /**
-     * Sets new passwordCreated for all users where it available
-     *
-     * @param dateInMillis
-     * @return result
-     * @throws SQLException
-     */
-    public boolean resetPasswordCreatedForAllUsers(String dateInMillis) throws SQLException {
-        String ins = "UPDATE user_props SET prop_value = ? WHERE prop_key = 'passwordCreated'";
-        int updateStatus = jdbcHelper.executeUpdate(ins, dateInMillis);
-        return updateStatus == 1;
-    }
-    /**
-     * find user id by name and add property to that user
-     *
-     * @param userName - user name
-     * @param key      - prop key
-     * @param val      - prop password
-     * @return - if true adding property succeeded
-     * @throws SQLException
-     */
-    public boolean addUserPropertyByUserName(String userName, String key, String val) throws SQLException {
-        long userId = getUserIdByUserName(userName);
-        if (userId > 0) {
-            return addUserPropertyById(userId, key, val);
-        }
-        return false;
-    }
-
-    /**
-     * @param userName
-     * @return
-     * @throws SQLException
-     */
-    public long getUserIdByUserName(String userName) throws SQLException {
-        ResultSet rs = null;
-        long userId = 0;
-        try {
-            String sel = "SELECT user_id from users where username=? ";
-            rs = jdbcHelper.executeSelect(sel, userName);
-            if (rs.next()) {
-                userId = rs.getLong(1);
-            }
-        } finally {
-            DbUtils.close(rs);
-        }
-        return userId;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/security/entity/Ace.java b/storage/db/src/main/java/org/artifactory/storage/db/security/entity/Ace.java
deleted file mode 100644
index 026f901..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/security/entity/Ace.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.security.entity;
-
-/**
- * @author freds
- */
-public class Ace {
-    private final long aceId;
-    private final long aclId;
-    private final int mask;
-    private final long userId;
-    private final long groupId;
-
-    public Ace(long aceId, long aclId, int mask, long userId, long groupId) {
-        if (aceId < 0L || aclId < 0L || userId < 0L || groupId < 0L) {
-            throw new IllegalArgumentException("Ids cannot be negative");
-        }
-        this.aceId = aceId;
-        this.aclId = aclId;
-        this.mask = mask;
-        this.userId = userId;
-        this.groupId = groupId;
-        if (isOnUser() && isOnGroup()) {
-            throw new IllegalArgumentException(
-                    "Access Control Entry (ACE) cannot be related to both a group and a user");
-        }
-        if (!isOnUser() && !isOnGroup()) {
-            throw new IllegalArgumentException(
-                    "Access Control Entry (ACE) needs to be related to either a group or a user");
-        }
-    }
-
-    public long getAceId() {
-        return aceId;
-    }
-
-    public long getAclId() {
-        return aclId;
-    }
-
-    public int getMask() {
-        return mask;
-    }
-
-    public long getUserId() {
-        return userId;
-    }
-
-    public long getGroupId() {
-        return groupId;
-    }
-
-    /**
-     * @return True if this ace belongs to a user
-     */
-    public final boolean isOnUser() {
-        return userId > 0;
-    }
-
-    /**
-     * @return True if this ace belongs to a group
-     */
-    public final boolean isOnGroup() {
-        return groupId > 0;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        Ace ace = (Ace) o;
-
-        if (aceId != ace.aceId) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return (int) (aceId ^ (aceId >>> 32));
-    }
-
-    @Override
-    public String toString() {
-        return "Ace{" +
-                "aceId=" + aceId +
-                ", aclId=" + aclId +
-                ", mask=" + mask +
-                ", userId=" + userId +
-                ", groupId=" + groupId +
-                '}';
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/security/entity/Acl.java b/storage/db/src/main/java/org/artifactory/storage/db/security/entity/Acl.java
deleted file mode 100644
index 7a2d34f..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/security/entity/Acl.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.security.entity;
-
-import com.google.common.collect.ImmutableSet;
-
-import java.util.Set;
-
-/**
- * Date: 9/3/12
- * Time: 1:44 PM
- *
- * @author freds
- */
-public class Acl {
-    private final long aclId;
-    private final long permTargetId;
-    private final long lastModified;
-    private final String lastModifiedBy;
-
-    /**
-     * Initialized as null, and can (and should) be set only once
-     */
-    private ImmutableSet<Ace> aces = null;
-
-    public Acl(long aclId, long permTargetId, long lastModified, String lastModifiedBy) {
-        if (aclId <= 0L || permTargetId <= 0L) {
-            throw new IllegalArgumentException("Ids cannot be negative");
-        }
-        this.aclId = aclId;
-        this.permTargetId = permTargetId;
-        this.lastModified = lastModified;
-        this.lastModifiedBy = lastModifiedBy;
-    }
-
-    public long getAclId() {
-        return aclId;
-    }
-
-    public long getPermTargetId() {
-        return permTargetId;
-    }
-
-    public long getLastModified() {
-        return lastModified;
-    }
-
-    public String getLastModifiedBy() {
-        return lastModifiedBy;
-    }
-
-    public ImmutableSet<Ace> getAces() {
-        if (aces == null) {
-            throw new IllegalStateException("ACL object was not initialized correctly! ACEs missing.");
-        }
-        return aces;
-    }
-
-    public void setAces(Set<Ace> aces) {
-        if (this.aces != null) {
-            throw new IllegalStateException("Cannot set ACEs already set!");
-        }
-        if (aces == null) {
-            throw new IllegalArgumentException("Cannot set aces to null");
-        }
-        this.aces = ImmutableSet.copyOf(aces);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        Acl acl = (Acl) o;
-
-        if (aclId != acl.aclId) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return (int) (aclId ^ (aclId >>> 32));
-    }
-
-    @Override
-    public String toString() {
-        return "Acl{" +
-                "aclId=" + aclId +
-                ", permTargetId=" + permTargetId +
-                ", lastModified=" + lastModified +
-                ", lastModifiedBy='" + lastModifiedBy + '\'' +
-                ", aces=" + aces +
-                '}';
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/security/entity/Group.java b/storage/db/src/main/java/org/artifactory/storage/db/security/entity/Group.java
deleted file mode 100644
index 72ef94e..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/security/entity/Group.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.security.entity;
-
-import org.apache.commons.lang.StringUtils;
-
-/**
- * Date: 8/26/12
- * Time: 11:08 PM
- *
- * @author freds
- */
-public class Group {
-    private final long groupId;
-
-    private final String groupName;
-
-    private final String description;
-
-    /**
-     * indicates if this group should automatically be added to newly created users
-     */
-    private final boolean newUserDefault;
-
-    private final String realm;
-
-    private final String realmAttributes;
-
-    public Group(long groupId, String groupName, String description, boolean newUserDefault, String realm,
-            String realmAttributes) {
-        if (groupId <= 0L) {
-            throw new IllegalArgumentException("Group id cannot be zero or negative!");
-        }
-        if (StringUtils.isBlank(groupName)) {
-            throw new IllegalArgumentException("Group name cannot be null!");
-        }
-        this.groupId = groupId;
-        this.groupName = groupName;
-        this.description = description;
-        this.newUserDefault = newUserDefault;
-        this.realm = realm;
-        this.realmAttributes = realmAttributes;
-    }
-
-    public long getGroupId() {
-        return groupId;
-    }
-
-    public String getGroupName() {
-        return groupName;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public boolean isNewUserDefault() {
-        return newUserDefault;
-    }
-
-    public String getRealm() {
-        return realm;
-    }
-
-    public String getRealmAttributes() {
-        return realmAttributes;
-    }
-
-    public boolean isIdentical(Group group) {
-        if (this == group) {
-            return true;
-        }
-        if (group == null || getClass() != group.getClass()) {
-            return false;
-        }
-        if (newUserDefault != group.newUserDefault) {
-            return false;
-        }
-        if (description != null ? !description.equals(group.description) : group.description != null) {
-            return false;
-        }
-        if (!groupName.equals(group.groupName)) {
-            return false;
-        }
-        if (realm != null ? !realm.equals(group.realm) : group.realm != null) {
-            return false;
-        }
-        if (realmAttributes != null ? !realmAttributes.equals(group.realmAttributes) : group.realmAttributes != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public String toString() {
-        return "Group{" +
-                "groupId=" + groupId +
-                ", groupName='" + groupName + '\'' +
-                ", description='" + description + '\'' +
-                ", newUserDefault=" + newUserDefault +
-                ", realm='" + realm + '\'' +
-                ", realmAttributes='" + realmAttributes + '\'' +
-                '}';
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/security/entity/PermissionTarget.java b/storage/db/src/main/java/org/artifactory/storage/db/security/entity/PermissionTarget.java
deleted file mode 100644
index 110aa37..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/security/entity/PermissionTarget.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.security.entity;
-
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableSet;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.util.PathUtils;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Date: 9/3/12
- * Time: 12:24 PM
- *
- * @author freds
- */
-public class PermissionTarget {
-    private static final String DELIMITER = ",";
-
-    private final long permTargetId;
-    private final String name;
-    private final List<String> includes;
-    private final List<String> excludes;
-
-    /**
-     * Initialized as null, and can (and should) be set only once
-     */
-    private ImmutableSet<String> repoKeys = null;
-
-    public PermissionTarget(long id, String name, List<String> includes, List<String> excludes) {
-        if (id <= 0L) {
-            throw new IllegalArgumentException("Permission target id cannot be zero or negative!");
-        }
-        if (StringUtils.isBlank(name)) {
-            throw new IllegalArgumentException("Permission target name cannot be null!");
-        }
-        this.permTargetId = id;
-        this.name = name;
-        this.includes = includes == null ? Collections.<String>emptyList() : includes;
-        this.excludes = excludes == null ? Collections.<String>emptyList() : excludes;
-    }
-
-    public PermissionTarget(long id, String name, String includes, String excludes) {
-        this(id, name,
-                PathUtils.includesExcludesPatternToStringList(includes),
-                PathUtils.includesExcludesPatternToStringList(excludes));
-    }
-
-    public long getPermTargetId() {
-        return permTargetId;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public List<String> getIncludes() {
-        return includes;
-    }
-
-    public List<String> getExcludes() {
-        return excludes;
-    }
-
-    public String getIncludesPattern() {
-        if (includes == null || includes.isEmpty()) {
-            return null;
-        }
-        return PathUtils.collectionToDelimitedString(includes, DELIMITER);
-    }
-
-    public String getExcludesPattern() {
-        if (excludes == null || excludes.isEmpty()) {
-            return null;
-        }
-        return PathUtils.collectionToDelimitedString(excludes, DELIMITER);
-    }
-
-    public Collection<String> getRepoKeys() {
-        if (repoKeys == null) {
-            throw new IllegalStateException(
-                    "Permission Target object was not initialized correctly! List of repo keys missing.");
-        }
-        return repoKeys;
-    }
-
-    public void setRepoKeys(Set<String> repoKeys) {
-        if (this.repoKeys != null) {
-            throw new IllegalStateException("Cannot set repository keys already set!");
-        }
-        if (repoKeys == null) {
-            throw new IllegalArgumentException("Cannot set repository keys to null");
-        }
-        this.repoKeys = ImmutableSet.copyOf(repoKeys);
-    }
-
-    public boolean isIdentical(PermissionTarget pt) {
-        if (pt == this) {
-            return true;
-        }
-        if (pt == null) {
-            return false;
-        }
-        if (pt.permTargetId != this.permTargetId
-                || !StringUtils.equals(pt.name, this.name)
-                || !Objects.equal(pt.includes, this.includes)
-                || !Objects.equal(pt.excludes, this.excludes)
-                || !Objects.equal(pt.repoKeys, this.repoKeys)
-                ) {
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public String toString() {
-        return "PermissionTarget{" +
-                "permTargetId=" + permTargetId +
-                ", name='" + name + '\'' +
-                ", includes=" + includes +
-                ", excludes=" + excludes +
-                ", repoKeys=" + repoKeys +
-                '}';
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/security/entity/User.java b/storage/db/src/main/java/org/artifactory/storage/db/security/entity/User.java
deleted file mode 100644
index 45aa486..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/security/entity/User.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.security.entity;
-
-import com.google.common.collect.ImmutableSet;
-import org.apache.commons.lang.StringUtils;
-
-import java.util.Set;
-
-/**
- * Case class for User in DB security entity
- *
- * @author freds
- */
-public class User {
-    private final long userId;
-    private final String username;
-    private final String password;
-    private final String salt;
-    private final String email;
-    private final String genPasswordKey;
-    private final String bintrayAuth;
-    private final boolean admin;
-    private final boolean enabled;
-    private final boolean updatableProfile;
-
-    private final boolean locked;
-    private final boolean credentialsExpired;
-
-    private final String realm;
-    private final String privateKey;
-    private final String publicKey;
-
-    private final long lastLoginTimeMillis;
-    private final String lastLoginClientIp;
-
-    /**
-     * Initialized as null, and can (and should) be set only once
-     */
-    private ImmutableSet<UserGroup> groups = null;
-
-
-    public User(long userId, String username, String password, String salt, String email, boolean admin,
-            boolean enabled, boolean updatableProfile, String bintrayAuth) {
-        this(userId, username, password, salt, email, null, admin, enabled, updatableProfile,
-                null, null, null, 0L, null, bintrayAuth, false, false);
-    }
-
-    public User(long userId, String username,
-            String password, String salt, String email, String genPasswordKey,
-            boolean admin, boolean enabled, boolean updatableProfile,
-            String realm, String privateKey, String publicKey,
-            long lastLoginTimeMillis, String lastLoginClientIp,
-            String bintrayAuth, boolean locked, boolean credentialsExpired) {
-        if (userId <= 0L) {
-            throw new IllegalArgumentException("User id cannot be zero or negative!");
-        }
-        if (StringUtils.isBlank(username)) {
-            throw new IllegalArgumentException("User name cannot be null!");
-        }
-        this.userId = userId;
-        this.username = username;
-        this.password = password;
-        this.salt = salt;
-        this.email = email;
-        this.genPasswordKey = genPasswordKey;
-        this.bintrayAuth = bintrayAuth;
-        this.admin = admin;
-        this.enabled = enabled;
-        this.updatableProfile = updatableProfile;
-        this.realm = realm;
-        this.privateKey = privateKey;
-        this.publicKey = publicKey;
-        this.lastLoginTimeMillis = lastLoginTimeMillis;
-        this.lastLoginClientIp = lastLoginClientIp;
-        this.locked = locked;
-        this.credentialsExpired = credentialsExpired;
-    }
-
-    public long getUserId() {
-        return userId;
-    }
-
-    public String getUsername() {
-        return username;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public String getSalt() {
-        return salt;
-    }
-
-    public String getEmail() {
-        return email;
-    }
-
-    public String getGenPasswordKey() {
-        return genPasswordKey;
-    }
-
-    public String getBintrayAuth() {
-        return bintrayAuth;
-    }
-
-    public boolean isAdmin() {
-        return admin;
-    }
-
-    public boolean isEnabled() {
-        return enabled;
-    }
-
-    public boolean isUpdatableProfile() {
-        return updatableProfile;
-    }
-
-    public String getRealm() {
-        return realm;
-    }
-
-    public String getPrivateKey() {
-        return privateKey;
-    }
-
-    public String getPublicKey() {
-        return publicKey;
-    }
-
-    public long getLastLoginTimeMillis() {
-        return lastLoginTimeMillis;
-    }
-
-    public String getLastLoginClientIp() {
-        return lastLoginClientIp;
-    }
-
-    public ImmutableSet<UserGroup> getGroups() {
-        if (groups == null) {
-            throw new IllegalStateException("User object was not initialized correctly! Groups missing.");
-        }
-        return groups;
-    }
-
-    public void setGroups(Set<UserGroup> groups) {
-        if (this.groups != null) {
-            throw new IllegalStateException("Cannot set groups already set!");
-        }
-        if (groups == null) {
-            throw new IllegalArgumentException("Cannot set groups to null");
-        }
-        for (UserGroup group : groups) {
-            if (group.getUserId() != userId) {
-                throw new IllegalArgumentException("Cannot add group link " + group
-                        + " to user id=" + userId + " name=" + username + "!\n"
-                        + "User IDs do not match");
-            }
-        }
-        this.groups = ImmutableSet.copyOf(groups);
-    }
-
-    public boolean isIdentical(User user) {
-        if (this == user) {
-            return true;
-        }
-        if (user == null || getClass() != user.getClass()) {
-            return false;
-        }
-
-        if (!username.equals(user.username)) {
-            return false;
-        }
-        if (admin != user.admin || enabled != user.enabled
-                || lastLoginTimeMillis != user.lastLoginTimeMillis
-                || updatableProfile != user.updatableProfile
-                || locked != user.locked
-                || credentialsExpired != user.credentialsExpired) {
-            return false;
-        }
-        if (email != null ? !email.equals(user.email) : user.email != null) {
-            return false;
-        }
-        if (genPasswordKey != null ? !genPasswordKey.equals(user.genPasswordKey) : user.genPasswordKey != null) {
-            return false;
-        }
-        if (groups != null ? !groups.equals(user.groups) : user.groups != null) {
-            return false;
-        }
-
-        if (lastLoginClientIp != null ? !lastLoginClientIp.equals(user.lastLoginClientIp) :
-                user.lastLoginClientIp != null) {
-            return false;
-        }
-        if (password != null ? !password.equals(user.password) : user.password != null) {
-            return false;
-        }
-        if (privateKey != null ? !privateKey.equals(user.privateKey) : user.privateKey != null) {
-            return false;
-        }
-        if (publicKey != null ? !publicKey.equals(user.publicKey) : user.publicKey != null) {
-            return false;
-        }
-        if (realm != null ? !realm.equals(user.realm) : user.realm != null) {
-            return false;
-        }
-        if (salt != null ? !salt.equals(user.salt) : user.salt != null) {
-            return false;
-        }
-        if (bintrayAuth != null ? !bintrayAuth.equals(user.bintrayAuth) : user.bintrayAuth != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     * @return whether this user is locked
-     */
-    public boolean isLocked() {
-        return locked;
-    }
-
-    /**
-     * @return wheter user's password is expired
-     */
-    public boolean isCredentialsExpired() {
-        return credentialsExpired;
-    }
-
-    @Override
-    public String toString() {
-        return "User{" +
-                "userId=" + userId +
-                ", username='" + username + '\'' +
-                ", password='" + password + '\'' +
-                ", salt='" + salt + '\'' +
-                ", email='" + email + '\'' +
-                ", genPasswordKey='" + genPasswordKey + '\'' +
-                ", admin=" + admin +
-                ", enabled=" + enabled +
-                ", updatableProfile=" + updatableProfile +
-                ", realm='" + realm + '\'' +
-                ", privateKey='" + privateKey + '\'' +
-                ", publicKey='" + publicKey + '\'' +
-                ", lastLoginTimeMillis=" + lastLoginTimeMillis +
-                ", lastLoginClientIp='" + lastLoginClientIp + '\'' +
-                ", bintrayAuth='" + bintrayAuth + '\'' +
-                ", groups=" + groups + '\'' +
-                ", locked=" + locked + '\'' +
-                ", credentialsExpired=" + credentialsExpired +
-                '}';
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/security/entity/UserGroup.java b/storage/db/src/main/java/org/artifactory/storage/db/security/entity/UserGroup.java
deleted file mode 100644
index b6460f8..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/security/entity/UserGroup.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.security.entity;
-
-/**
- * The link between a User and a Group
- * Date: 8/26/12
- * Time: 11:04 PM
- *
- * @author freds
- */
-public class UserGroup {
-    private final long userId;
-    private final long groupId;
-    private final String realm;
-
-    public UserGroup(long userId, long groupId, String realm) {
-        if (userId <= 0L) {
-            throw new IllegalArgumentException("User id cannot be zero or negative!");
-        }
-        if (groupId <= 0L) {
-            throw new IllegalArgumentException("Group id cannot be zero or negative!");
-        }
-        this.userId = userId;
-        this.groupId = groupId;
-        this.realm = realm;
-    }
-
-    public long getUserId() {
-        return userId;
-    }
-
-    public long getGroupId() {
-        return groupId;
-    }
-
-    public String getRealm() {
-        return realm;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        UserGroup userGroup = (UserGroup) o;
-
-        if (groupId != userGroup.groupId) {
-            return false;
-        }
-        if (userId != userGroup.userId) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = (int) (userId ^ (userId >>> 32));
-        result = 31 * result + (int) (groupId ^ (groupId >>> 32));
-        return result;
-    }
-
-    @Override
-    public String toString() {
-        return "UserGroup{" +
-                "userId=" + userId +
-                ", groupId=" + groupId +
-                ", realm='" + realm + '\'' +
-                '}';
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/security/service/AclServiceImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/security/service/AclServiceImpl.java
deleted file mode 100644
index 2df93ce..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/security/service/AclServiceImpl.java
+++ /dev/null
@@ -1,466 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.security.service;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import edu.emory.mathcs.backport.java.util.concurrent.TimeUnit;
-import edu.emory.mathcs.backport.java.util.concurrent.locks.ReentrantLock;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.security.*;
-import org.artifactory.storage.DBEntityNotFoundException;
-import org.artifactory.storage.StorageException;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.db.security.dao.AclsDao;
-import org.artifactory.storage.db.security.dao.PermissionTargetsDao;
-import org.artifactory.storage.db.security.dao.UserGroupsDao;
-import org.artifactory.storage.db.security.entity.Ace;
-import org.artifactory.storage.db.security.entity.Acl;
-import org.artifactory.storage.db.security.entity.Group;
-import org.artifactory.storage.db.security.entity.PermissionTarget;
-import org.artifactory.storage.security.service.AclStoreService;
-import org.artifactory.util.AlreadyExistsException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.PostConstruct;
-import java.sql.SQLException;
-import java.util.*;
-import java.util.concurrent.Callable;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import static org.artifactory.security.ArtifactoryPermission.DEPLOY;
-import static org.artifactory.security.ArtifactoryPermission.READ;
-import static org.artifactory.security.PermissionTargetInfo.*;
-
-/**
- * Date: 9/3/12
- * Time: 4:12 PM
- *
- * @author freds
- */
- at Service
-public class AclServiceImpl implements AclStoreService {
-    private static final Logger log = LoggerFactory.getLogger(AclServiceImpl.class);
-    @Autowired
-    private DbService dbService;
-    @Autowired
-    private AclsDao aclsDao;
-    @Autowired
-    private PermissionTargetsDao permTargetsDao;
-    @Autowired
-    private UserGroupsDao userGroupsDao;
-    private AclsCache aclsCache;
-
-    @PostConstruct
-    private void init(){
-        long timeout = ConstantValues.aclDirtyReadsTimeout.getLong();
-        aclsCache = new AclsCache(timeout,new AclCacheLoader(aclsDao,userGroupsDao,permTargetsDao));
-    }
-
-    @Override
-    public Collection<AclInfo> getAllAcls() {
-        return getAclsMap().values();
-    }
-
-    @Override
-    public void createAcl(AclInfo entity) {
-        try {
-            PermissionTargetInfo permTargetInfo = entity.getPermissionTarget();
-            PermissionTarget dbPermTarget = permTargetsDao.findPermissionTarget(permTargetInfo.getName());
-            if (dbPermTarget != null) {
-                throw new AlreadyExistsException("Could not create ACL. Permission target already exist: " +
-                        permTargetInfo.getName());
-            }
-
-            dbPermTarget = new PermissionTarget(dbService.nextId(), permTargetInfo.getName(),
-                    permTargetInfo.getIncludes(), permTargetInfo.getExcludes());
-            dbPermTarget.setRepoKeys(Sets.newHashSet(permTargetInfo.getRepoKeys()));
-            permTargetsDao.createPermissionTarget(dbPermTarget);
-            Acl acl = aclFromInfo(dbService.nextId(), entity, dbPermTarget.getPermTargetId());
-            aclsDao.createAcl(acl);
-        } catch (SQLException e) {
-            throw new StorageException("Could not create ACL " + entity, e);
-        } finally {
-            aclsCache.promoteAclsDbVersion();
-        }
-    }
-
-    @Override
-    public void updateAcl(MutableAclInfo aclInfo) {
-        PermissionTargetInfo permTargetInfo = aclInfo.getPermissionTarget();
-        try {
-            PermissionTarget dbPermTarget = permTargetsDao.findPermissionTarget(permTargetInfo.getName());
-            if (dbPermTarget == null) {
-                throw new DBEntityNotFoundException(
-                        "Could not update ACL with non existent Permission Target " + aclInfo.getPermissionTarget());
-            }
-            long permTargetId = dbPermTarget.getPermTargetId();
-            PermissionTarget newPermTarget = new PermissionTarget(permTargetId,
-                    permTargetInfo.getName(), permTargetInfo.getIncludes(), permTargetInfo.getExcludes());
-            newPermTarget.setRepoKeys(Sets.newHashSet(permTargetInfo.getRepoKeys()));
-            permTargetsDao.updatePermissionTarget(newPermTarget);
-            Acl dbAcl = aclsDao.findAclByPermissionTargetId(permTargetId);
-            if (dbAcl == null) {
-                throw new DBEntityNotFoundException("Could not update non existent ACL " + aclInfo);
-            }
-            Acl acl = aclFromInfo(dbAcl.getAclId(), aclInfo, permTargetId);
-            aclsDao.updateAcl(acl);
-        } catch (SQLException e) {
-            throw new StorageException("Could not update ACL " + aclInfo, e);
-        } finally {
-            aclsCache.promoteAclsDbVersion();
-        }
-    }
-
-    @Override
-    public void deleteAcl(String permTargetName) {
-        try {
-            PermissionTarget permissionTarget = permTargetsDao.findPermissionTarget(permTargetName);
-            if (permissionTarget == null) {
-                // Already deleted
-                return;
-            }
-            Acl acl = aclsDao.findAclByPermissionTargetId(permissionTarget.getPermTargetId());
-            if (acl != null) {
-                aclsDao.deleteAcl(acl.getAclId());
-            } else {
-                log.warn("ACL already deleted, but permission target was not!");
-            }
-            permTargetsDao.deletePermissionTarget(permissionTarget.getPermTargetId());
-        } catch (SQLException e) {
-            throw new StorageException("Could not delete ACL " + permTargetName, e);
-        } finally {
-            aclsCache.promoteAclsDbVersion();
-        }
-    }
-
-    @Override
-    public AclInfo getAcl(String permTargetName) {
-        return getAclsMap().get(permTargetName);
-    }
-
-    @Override
-    public boolean permissionTargetExists(String permTargetName) {
-        return getAclsMap().containsKey(permTargetName);
-    }
-
-    @Override
-    public boolean userHasPermissions(String username) {
-        try {
-            long userId = userGroupsDao.findUserIdByUsername(username);
-            if (userId <= 0L) {
-                // User not in DB yet
-                return false;
-            }
-            return aclsDao.userHasAce(userId);
-        } catch (SQLException e) {
-            throw new StorageException("Cannot check if user " + username + " has permissions!", e);
-        }
-    }
-
-    @Override
-    public void removeAllUserAces(String username) {
-        try {
-            long userId = userGroupsDao.findUserIdByUsername(username);
-            if (userId <= 0L) {
-                // User does not exists
-                return;
-            }
-            aclsDao.deleteAceForUser(userId);
-        } catch (SQLException e) {
-            throw new StorageException("Could not delete ACE for user " + username, e);
-        } finally {
-            aclsCache.promoteAclsDbVersion();
-        }
-    }
-
-    @Override
-    public void removeAllGroupAces(String groupName) {
-        try {
-            Group group = userGroupsDao.findGroupByName(groupName);
-            if (group == null) {
-                // Group does not exists
-                return;
-            }
-            aclsDao.deleteAceForGroup(group.getGroupId());
-        } catch (SQLException e) {
-            throw new StorageException("Could not delete ACE for group " + groupName, e);
-        } finally {
-            aclsCache.promoteAclsDbVersion();
-        }
-    }
-
-    @Override
-    public void createDefaultSecurityEntities(UserInfo anonUser, GroupInfo readersGroup, String currentUsername) {
-        if (!UserInfo.ANONYMOUS.equals(anonUser.getUsername())) {
-            throw new IllegalArgumentException(
-                    "Default anything permissions should be created for the anonymous user only");
-        }
-
-        // create or update read permissions on "anything"
-        AclInfo anyAnyAcl = getAcl(ANY_PERMISSION_TARGET_NAME);
-        Set<AceInfo> anyAnyAces = new HashSet<>(2);
-        anyAnyAces.add(InfoFactoryHolder.get().createAce(
-                anonUser.getUsername(), false, READ.getMask()));
-        anyAnyAces.add(InfoFactoryHolder.get().createAce(
-                readersGroup.getGroupName(), true, READ.getMask()));
-        if (anyAnyAcl == null) {
-            MutablePermissionTargetInfo anyAnyTarget = InfoFactoryHolder.get().createPermissionTarget(
-                    ANY_PERMISSION_TARGET_NAME, Lists.newArrayList((ANY_REPO)));
-            anyAnyTarget.setIncludesPattern(ANY_PATH);
-            anyAnyAcl = InfoFactoryHolder.get().createAcl(anyAnyTarget, anyAnyAces, currentUsername);
-            createAcl(anyAnyAcl);
-        } else {
-            MutableAclInfo acl = InfoFactoryHolder.get().createAcl(anyAnyAcl.getPermissionTarget());
-            acl.setAces(anyAnyAces);
-            acl.setUpdatedBy(currentUsername);
-            updateAcl(acl);
-        }
-
-        // create or update read and deploy permissions on all remote repos
-        AclInfo anyRemoteAcl = getAcl(ANY_REMOTE_PERMISSION_TARGET_NAME);
-        HashSet<AceInfo> anyRemoteAces = new HashSet<>(2);
-        anyRemoteAces.add(InfoFactoryHolder.get().createAce(
-                anonUser.getUsername(), false,
-                READ.getMask() | DEPLOY.getMask()));
-        if (anyRemoteAcl == null) {
-            MutablePermissionTargetInfo anyRemoteTarget = InfoFactoryHolder.get().createPermissionTarget(
-                    ANY_REMOTE_PERMISSION_TARGET_NAME, new ArrayList<String>() {{
-                add(ANY_REMOTE_REPO);
-            }});
-            anyRemoteTarget.setIncludesPattern(ANY_PATH);
-            anyRemoteAcl = InfoFactoryHolder.get().createAcl(anyRemoteTarget, anyRemoteAces, currentUsername);
-            createAcl(anyRemoteAcl);
-        } else {
-            MutableAclInfo acl = InfoFactoryHolder.get().createAcl(anyRemoteAcl.getPermissionTarget());
-            acl.setAces(anyRemoteAces);
-            acl.setUpdatedBy(currentUsername);
-            updateAcl(acl);
-        }
-    }
-
-    @Override
-    public void deleteAllAcls() {
-        try {
-            aclsDao.deleteAllAcls();
-            permTargetsDao.deleteAllPermissionTargets();
-        } catch (SQLException e) {
-            throw new StorageException("Could not delete all ACLs", e);
-        } finally {
-            aclsCache.promoteAclsDbVersion();
-        }
-    }
-
-    @Override
-    public int promoteAclsDbVersion() {
-        return aclsCache.promoteAclsDbVersion();
-    }
-
-    private Acl aclFromInfo(long aclId, AclInfo aclInfo, long permTargetId) throws SQLException {
-        Acl acl = new Acl(aclId, permTargetId, System.currentTimeMillis(),
-                aclInfo.getUpdatedBy());
-        Set<AceInfo> aces = aclInfo.getAces();
-        HashSet<Ace> dbAces = new HashSet<>(aces.size());
-        for (AceInfo ace : aces) {
-            Ace dbAce = null;
-            if (ace.isGroup()) {
-                Group group = userGroupsDao.findGroupByName(ace.getPrincipal());
-                if (group != null) {
-                    dbAce = new Ace(dbService.nextId(), acl.getAclId(), ace.getMask(), 0, group.getGroupId());
-                } else {
-                    log.error("Got ACE entry for ACL " + aclInfo.getPermissionTarget().getName() +
-                            " with a group " + ace.getPrincipal() + " that does not exist!");
-                }
-            } else {
-                long userId = userGroupsDao.findUserIdByUsername(ace.getPrincipal());
-                if (userId > 0L) {
-                    dbAce = new Ace(dbService.nextId(), acl.getAclId(), ace.getMask(), userId, 0);
-                } else {
-                    log.error("Got ACE entry for ACL " + aclInfo.getPermissionTarget().getName() +
-                            " with a user " + ace.getPrincipal() + " that does not exist!");
-                }
-            }
-            if (dbAce != null) {
-                dbAces.add(dbAce);
-            }
-        }
-        acl.setAces(dbAces);
-        return acl;
-    }
-
-    private Map<String, AclInfo> getAclsMap() {
-        return aclsCache.get();
-    }
-
-    public static class AclsCache {
-        private ReentrantLock cacheLock = new ReentrantLock();
-        private long timeout;
-        private final AclCacheLoader cacheLoader;
-        private AtomicInteger aclsDbVersion = new AtomicInteger(
-                1);  // promoted on each DB change (permission change/add/delete)
-        private volatile int aclsMapVersion = 0; // promoted each time we load the map from DB
-        private volatile Map<String, AclInfo> aclsMap;
-
-        public AclsCache(long timeout,AclCacheLoader cacheLoader) {
-            this.timeout = timeout;
-            this.cacheLoader = cacheLoader;
-        }
-
-        /**
-         * Call this method each permission update/change/delete in DB.
-         */
-        public int promoteAclsDbVersion() {
-            return aclsDbVersion.incrementAndGet();
-        }
-
-        /**
-         * Returns permissions map.
-         */
-        public Map<String, AclInfo> get() {
-            Map<String, AclInfo> tempMap = aclsMap;
-            if (aclsDbVersion.get() > aclsMapVersion) {
-                // Need to update aclsMap (new version in aclsDbVersion).
-                // Try to acquire acl lock
-                log.debug("Attempting to acquire a lock on cacheLock");
-                boolean lockAcquired = tryToWaitForAclLock();
-                if ( ! lockAcquired) {
-                    // Timeout occurred : Return the current aclMap without waiting to thew new map which is being reloaded.
-                    log.debug("Acl lock timeout occurred returning current aclMap instead the one that is being loaded");
-                    return aclsMap;
-                }else {
-                    log.debug("cacheLock lock has been acquired");
-                    // Lock was successfully acquired, now we can start reloading the map
-                    try {
-                        tempMap = aclsMap;
-                        //print only if debug is enabled to avoid performances degradation on large maps
-                        if (log.isDebugEnabled()){
-                            if (tempMap!=null && !tempMap.isEmpty()){
-                                log.debug("Current aclsMap contains: "+tempMap.keySet());
-                            } else {
-                                log.debug("Current aclsMap is empty");
-                            }
-                        }
-                        // Double check after cacheLoader synchronization.
-                        if (aclsDbVersion.get() > aclsMapVersion) {
-                            log.debug("aclsDbVersion verion '{}' is higher than aclsMapVersion: {}",
-                                    aclsDbVersion.get(), aclsMapVersion);
-                            // The map will be valid for version the current aclsDbVersion.
-                            int startingVersion = aclsDbVersion.get();
-                            tempMap = cacheLoader.call();
-                            aclsMap = tempMap;
-                            //print only if debug is enabled to avoid performances degradation on large maps
-                            if (log.isDebugEnabled()) {
-                                log.debug("aclsMap has been updated with: " + tempMap.keySet());
-                            }
-                            aclsMapVersion = startingVersion;
-                        } else {
-                            log.debug("Skipping aclMap update, newer version exist: aclsDbVersion verion is: '{}'" +
-                                    " while aclsMapVersion version is: {}", aclsDbVersion.get(), aclsMapVersion);
-                        }
-
-                    } finally {
-                        cacheLock.unlock();
-                    }
-                }
-            }
-            return tempMap;
-        }
-
-        private boolean tryToWaitForAclLock() {
-            boolean acquireLock=false;
-            try {
-                acquireLock = cacheLock.tryLock(timeout, TimeUnit.MILLISECONDS);
-                if( ! acquireLock && aclsMap==null){
-                    log.debug("Blocking thread while acl map is being processed for the first time");
-                    acquireLock=tryToWaitForAclLock();
-                }
-            } catch (InterruptedException e) {
-                if( aclsMap==null){
-                    log.debug("Blocking thread while acl map is being processed for the first time");
-                    acquireLock=tryToWaitForAclLock();
-                }
-            }
-            return acquireLock;
-        }
-    }
-
-    public static class AclCacheLoader implements Callable<Map<String, AclInfo>> {
-
-        private AclsDao aclsDao;
-        private UserGroupsDao userGroupsDao;
-        private PermissionTargetsDao permTargetsDao;
-
-        public AclCacheLoader(AclsDao aclsDao,UserGroupsDao userGroupsDao,PermissionTargetsDao permissionTargetsDao) {
-            this.aclsDao = aclsDao;
-            this.userGroupsDao = userGroupsDao;
-            this.permTargetsDao = permissionTargetsDao;
-        }
-
-        @Override
-        public Map<String, AclInfo> call() {
-            try {
-                log.debug("Starting acl-reload-process");
-                Map<Long, String> allUsernamePerIds = userGroupsDao.getAllUsernamePerIds();
-                Map<Long, String> allGroupNamePerIds = userGroupsDao.getAllGroupNamePerIds();
-                Map<Long, PermissionTarget> targetMap = permTargetsDao.getAllPermissionTargets();
-                Collection<Acl> allAcls = aclsDao.getAllAcls();
-                Map<String, AclInfo> result = Maps.newHashMapWithExpectedSize(allAcls.size());
-                for (Acl acl : allAcls) {
-                    PermissionTarget permTarget = targetMap.get(acl.getPermTargetId());
-                    MutablePermissionTargetInfo permissionTarget = InfoFactoryHolder.get().createPermissionTarget(
-                            permTarget.getName(), new ArrayList<>(permTarget.getRepoKeys()));
-                    permissionTarget.setIncludes(permTarget.getIncludes());
-                    permissionTarget.setExcludes(permTarget.getExcludes());
-                    ImmutableSet<Ace> dbAces = acl.getAces();
-                    HashSet<AceInfo> aces = new HashSet<>(dbAces.size());
-                    for (Ace dbAce : dbAces) {
-                        MutableAceInfo ace = null;
-                        if (dbAce.isOnGroup()) {
-                            String groupName = allGroupNamePerIds.get(dbAce.getGroupId());
-                            if (groupName != null) {
-                                ace = InfoFactoryHolder.get().createAce(groupName, true, dbAce.getMask());
-                            }
-                        } else {
-                            String username = allUsernamePerIds.get(dbAce.getUserId());
-                            if (username != null) {
-                                ace = InfoFactoryHolder.get().createAce(username, false, dbAce.getMask());
-                            }
-                        }
-                        if (ace != null) {
-                            aces.add(ace);
-                        }
-                    }
-                    result.put(permTarget.getName(),
-                            InfoFactoryHolder.get().createAcl(permissionTarget, aces, acl.getLastModifiedBy()));
-                }
-                log.debug("Successfully finished acl-reload-process");
-                return result;
-            } catch (SQLException e) {
-                throw new StorageException("Could not load all Access Control List from DB due to:" + e.getMessage(),
-                        e);
-            }
-        }
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/security/service/UserGroupServiceImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/security/service/UserGroupServiceImpl.java
deleted file mode 100644
index 5299003..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/security/service/UserGroupServiceImpl.java
+++ /dev/null
@@ -1,1097 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.security.service;
-
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import org.apache.commons.collections.MapUtils;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.*;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.common.Info;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.md.Properties;
-import org.artifactory.model.xstream.fs.PropertiesImpl;
-import org.artifactory.model.xstream.security.UserProperty;
-import org.artifactory.security.*;
-import org.artifactory.security.exceptions.PasswordChangeException;
-import org.artifactory.storage.StorageException;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.db.security.dao.UserGroupsDao;
-import org.artifactory.storage.db.security.dao.UserPropertiesDao;
-import org.artifactory.storage.db.security.entity.Group;
-import org.artifactory.storage.db.security.entity.User;
-import org.artifactory.storage.db.security.entity.UserGroup;
-import org.artifactory.storage.security.service.UserGroupStoreService;
-import org.artifactory.util.Strings;
-import org.joda.time.DateTime;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.sql.SQLException;
-import java.util.*;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.stream.Collectors;
-
-/**
- * Date: 8/27/12
- * Time: 2:47 PM
- *
- * @author freds
- */
- at Service
-public class UserGroupServiceImpl implements UserGroupStoreService {
-    @SuppressWarnings("UnusedDeclaration")
-    private static final Logger log = LoggerFactory.getLogger(UserGroupServiceImpl.class);
-    private static final String API_KEY = "api_key";
-    public static final int MAX_USERS_TO_TRACK = 10000; // max locked users to keep in cache
-    // max delay for user to be suspended (5 seconds)
-    private static final int MAX_LOGIN_DELAY = 5000;
-    private static final int OK_INCORRECT_LOGINS = 2; // delay will start after OK_INCORRECT_LOGINS+1 attempts
-    private static final int LOGIN_DELAY_MULTIPLIER = getLoginDelayMultiplier();
-    private static final boolean CACHE_BLOCKED_USERS = ConstantValues.useFrontCacheForBlockedUsers.getBoolean();
-    private final long MILLIS_IN_DAY = /* secs in day */ 86400 * 1000 /* millis in sec */;
-
-    SecurityService securityService;
-
-    // cache meaning  <userName, lock-time>
-    private final Cache<String, Long> lockedUsersCache = CacheBuilder.newBuilder().maximumSize(MAX_USERS_TO_TRACK).
-            expireAfterWrite(24, TimeUnit.HOURS).build();
-    private final Cache<String, Long> userAccessUsersCache = CacheBuilder.newBuilder().maximumSize(MAX_USERS_TO_TRACK).
-            expireAfterWrite(24, TimeUnit.HOURS).build();
-    private final Map<String, AtomicInteger> incorrectLoginAttemptsCache = Maps.newConcurrentMap();
-
-    @Autowired
-    private DbService dbService;
-
-    @Autowired
-    private UserGroupsDao userGroupsDao;
-
-    @Autowired
-    private UserPropertiesDao userPropertiesDao;
-
-    @Override
-    public void deleteAllGroupsAndUsers() {
-        try {
-            userGroupsDao.deleteAllGroupsAndUsers();
-        } catch (SQLException e) {
-            throw new StorageException("Could not delete all users and groups", e);
-        }
-    }
-
-    @Override
-    public boolean adminUserExists() {
-        try {
-            return userGroupsDao.adminUserExists();
-        } catch (SQLException e) {
-            throw new StorageException("Could not determine if admin users exists due to: " + e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public boolean userExists(String username) {
-        try {
-            return userGroupsDao.findUserIdByUsername(username) > 0L;
-        } catch (SQLException e) {
-            throw new StorageException("Could not execute exists query for username='" + username + "'", e);
-        }
-    }
-
-    @Override
-    public UserInfo findUser(String username) {
-        try {
-            User user = userGroupsDao.findUserByName(username);
-            if (user != null) {
-                return userToUserInfo(user);
-            }
-        } catch (SQLException e) {
-            throw new StorageException("Could not execute search query for username='" + username + "'", e);
-        }
-        return null;
-    }
-
-    /**
-     * Finds user in DB and returns it as is
-     * without attaching any extra metadata such
-     * as groups for instance
-     *
-     * @param userName
-     * @return {@link User}
-     */
-    private User getUser(String userName) {
-        try {
-            return userGroupsDao.findUserByName(userName, false);
-        } catch (SQLException e) {
-            throw new StorageException("Could not execute search query for username='" + userName + "'", e);
-        }
-    }
-
-    @Override
-    public void updateUser(MutableUserInfo userInfo) {
-        try {
-            User originalUser = userGroupsDao.findUserByName(userInfo.getUsername());
-            if (originalUser == null) {
-                throw new UsernameNotFoundException(
-                        "Cannot update user with user name '" + userInfo.getUsername() + "' since it does not exists!");
-            }
-
-            User updatedUser = userInfoToUser(originalUser.getUserId(), userInfo);
-            userGroupsDao.updateUser(updatedUser);
-
-            // change passwordExpired state if user changes password during update
-            if (originalUser.isCredentialsExpired() == updatedUser.isCredentialsExpired() && // admin not changing password expired state
-                    !originalUser.getPassword().equals(updatedUser.getPassword())) {   // user indeed changed password
-                userGroupsDao.unexpirePassword(originalUser.getUsername());
-            }
-        } catch (SQLException e) {
-            throw new StorageException("Failed to update user " + userInfo.getUsername(), e);
-        }
-    }
-
-    /**
-     * Updates user access details
-     *
-     * @param userName
-     * @param clientIp
-     * @param accessTimeMillis
-     */
-    @Override
-    public void updateUserAccess(String userName, String clientIp, long accessTimeMillis) {
-        if (StringUtils.isNotBlank(userName) && !UserInfo.ANONYMOUS.equals(userName)) {
-            User user = getUser(userName);
-            if (user == null) return;
-            if (!user.isLocked() || !getSecurityService().isUserLockPolicyEnabled()) {
-                    userAccessUsersCache.put(userName, accessTimeMillis);
-            }
-        }
-    }
-
-    @Override
-    public boolean createUser(UserInfo user) {
-        return createUserWithProperties(user, false);
-    }
-
-    @Override
-    public boolean createUserWithProperties(UserInfo user, boolean addUserProperties) {
-        try {
-            if (userExists(user.getUsername())) {
-                return false;
-            }
-            User u = userInfoToUser(dbService.nextId(), user);
-            int createUserSucceeded = userGroupsDao.createUser(u);
-            Set<UserPropertyInfo> userProperties = user.getUserProperties();
-            if (addUserProperties && userProperties != null && !userProperties.isEmpty()) {
-                for (UserPropertyInfo userPropertyInfo : userProperties) {
-                    userPropertiesDao.addUserPropertyById(u.getUserId(),
-                            userPropertyInfo.getPropKey(), userPropertyInfo.getPropValue());
-                }
-            }
-            boolean result = createUserSucceeded > 0;
-            if (result) {
-                SecurityService securityService = getSecurityService();
-                // if user was previously locked as unknown user
-                // and create succeeded, we unlock it
-                if (securityService instanceof UserGroupService)
-                    ((UserGroupService) securityService).unlockUser(user.getUsername());
-            }
-            return result;
-        } catch (SQLException e) {
-            throw new StorageException("Failed to create user " + user.getUsername(), e);
-        }
-    }
-
-    /**
-     * @return {@link SecurityService}
-     */
-    private SecurityService getSecurityService() {
-        if (securityService == null)
-            securityService = ContextHelper.get().beanForType(SecurityService.class);
-        return securityService;
-    }
-
-    @Override
-    public void deleteUser(String username) {
-        try {
-            userGroupsDao.deleteUser(username);
-        } catch (SQLException e) {
-            throw new StorageException("Failed to delete user " + username, e);
-        }
-    }
-
-    @Override
-    public List<UserInfo> getAllUsers(boolean includeAdmins) {
-        List<UserInfo> results = new ArrayList<>();
-        try {
-            Collection<User> allUsers = userGroupsDao.getAllUsers(includeAdmins);
-            Map<Long, Set<UserPropertyInfo>> allUserProperties = userPropertiesDao.getAllUserProperties();
-            for (User user : allUsers) {
-                UserInfo userInfo = userToUserInfoWithProperties(user, allUserProperties);
-                results.add(userInfo);
-            }
-            return results;
-        } catch (SQLException e) {
-            throw new StorageException("Could not execute get all users query", e);
-        }
-    }
-
-    @Override
-    public Collection<Info> getUsersGroupsPaging(boolean includeAdmins, String orderBy,
-                                                 String startOffset, String limit, String direction) {
-        Collection<Info> infoCollection;
-        try {
-            infoCollection = userGroupsDao.getUsersGroupsPaging(includeAdmins, orderBy,
-                    startOffset, limit, direction);
-        } catch (SQLException e) {
-            throw new StorageException("Failed to get users  group ");
-        }
-        return infoCollection;
-    }
-
-    public long getAllUsersGroupsCount(boolean includeAdmins) {
-        return userGroupsDao.getAllUsersGroupsCount(includeAdmins);
-    }
-
-    @Override
-    public boolean deleteGroup(String groupName) {
-        try {
-            return userGroupsDao.deleteGroup(groupName) > 0;
-        } catch (SQLException e) {
-            throw new StorageException("Failed to delete group " + groupName, e);
-        }
-    }
-
-    private List<GroupInfo> findAllGroups(UserGroupsDao.GroupFilter groupFilter) {
-        List<GroupInfo> results = new ArrayList<>();
-        try {
-            Collection<Group> allGroups = userGroupsDao.findGroups(groupFilter);
-            for (Group group : allGroups) {
-                results.add(groupToGroupInfo(group));
-            }
-            return results;
-        } catch (SQLException e) {
-            throw new StorageException("Could not execute get all groups query", e);
-        }
-    }
-
-    @Override
-    public List<GroupInfo> getAllGroups() {
-        return findAllGroups(UserGroupsDao.GroupFilter.ALL);
-    }
-
-    @Override
-    public List<GroupInfo> getNewUserDefaultGroups() {
-        return findAllGroups(UserGroupsDao.GroupFilter.DEFAULTS);
-    }
-
-    @Override
-    public List<GroupInfo> getAllExternalGroups() {
-        return findAllGroups(UserGroupsDao.GroupFilter.EXTERNAL);
-    }
-
-    @Override
-    public List<GroupInfo> getInternalGroups() {
-        return findAllGroups(UserGroupsDao.GroupFilter.INTERNAL);
-    }
-
-    @Override
-    public Set<String> getNewUserDefaultGroupsNames() {
-        Set<String> results = new HashSet<>();
-        try {
-            Collection<Group> allGroups = userGroupsDao.findGroups(UserGroupsDao.GroupFilter.DEFAULTS);
-            for (Group group : allGroups) {
-                results.add(group.getGroupName());
-            }
-            return results;
-        } catch (SQLException e) {
-            throw new StorageException("Could not execute get all default group names query", e);
-        }
-    }
-
-    @Override
-    public void updateGroup(MutableGroupInfo groupInfo) {
-        try {
-            Group originalGroup = userGroupsDao.findGroupByName(groupInfo.getGroupName());
-            if (originalGroup == null) {
-                throw new GroupNotFoundException("Cannot update non existent group '" + groupInfo.getGroupName() + "'");
-            }
-            Group newGroup = groupInfoToGroup(originalGroup.getGroupId(), groupInfo);
-            if (userGroupsDao.updateGroup(newGroup) != 1) {
-                throw new StorageException("Updating group did not find corresponding entity" +
-                        " based on name='" + groupInfo.getGroupName() + "' and id=" + originalGroup.getGroupId());
-            }
-        } catch (SQLException e) {
-            throw new StorageException("Could not update group " + groupInfo.getGroupName(), e);
-        }
-    }
-
-    @Override
-    public boolean createGroup(GroupInfo groupInfo) {
-        try {
-            if (userGroupsDao.findGroupByName(groupInfo.getGroupName()) != null) {
-                // Group already exists
-                return false;
-            }
-            Group g = groupInfoToGroup(dbService.nextId(), groupInfo);
-            return userGroupsDao.createGroup(g) > 0;
-        } catch (SQLException e) {
-            throw new StorageException("Could not create group " + groupInfo.getGroupName(), e);
-        }
-    }
-
-    @Override
-    public void addUsersToGroup(String groupName, List<String> usernames) {
-        try {
-            Group group = userGroupsDao.findGroupByName(groupName);
-            if (group == null) {
-                throw new GroupNotFoundException("Cannot add users to non existent group " + groupName);
-            }
-            userGroupsDao.addUsersToGroup(group.getGroupId(), usernames, group.getRealm());
-        } catch (SQLException e) {
-            throw new StorageException("Could not add users " + usernames + " to group " + groupName, e);
-        }
-    }
-
-    @Override
-    public void removeUsersFromGroup(String groupName, List<String> usernames) {
-        try {
-            Group group = userGroupsDao.findGroupByName(groupName);
-            if (group == null) {
-                throw new GroupNotFoundException("Cannot remove users to non existent group " + groupName);
-            }
-            userGroupsDao.removeUsersFromGroup(group.getGroupId(), usernames);
-        } catch (SQLException e) {
-            throw new StorageException("Could not add users " + usernames + " to group " + groupName, e);
-        }
-    }
-
-    @Override
-    public List<UserInfo> findUsersInGroup(String groupName) {
-        List<UserInfo> results = new ArrayList<>();
-        try {
-            Group group = userGroupsDao.findGroupByName(groupName);
-            if (group == null) {
-                return results;
-            }
-            List<User> users = userGroupsDao.findUsersInGroup(group.getGroupId());
-            for (User user : users) {
-                results.add(userToUserInfo(user));
-            }
-            return results;
-        } catch (SQLException e) {
-            throw new StorageException("Could not find users for group with name='" + groupName + "'", e);
-        }
-    }
-
-    @Override
-    @Nullable
-    public GroupInfo findGroup(String groupName) {
-        try {
-            Group group = userGroupsDao.findGroupByName(groupName);
-            if (group != null) {
-                return groupToGroupInfo(group);
-            }
-            return null;
-        } catch (SQLException e) {
-            throw new StorageException("Could not search for group with name='" + groupName + "'", e);
-        }
-    }
-
-    @Override
-    @Nullable
-    public UserInfo findUserByProperty(String key, String val) {
-        try {
-            long userId = userPropertiesDao.getUserIdByProperty(key, val);
-            if (userId == 0L) {
-                return null;
-            } else {
-                return userToUserInfo(userGroupsDao.findUserById(userId));
-            }
-        } catch (SQLException e) {
-            throw new StorageException("Could not search for user with property " + key + ":" + val, e);
-        }
-    }
-
-    @Override
-    @Nullable
-    public String findUserProperty(String username, String key) {
-        try {
-            return userPropertiesDao.getUserProperty(username, key);
-        } catch (SQLException e) {
-            throw new StorageException("Could not search for datum " + key + " of user " + username, e);
-        }
-    }
-
-    @Override
-    public boolean addUserProperty(String username, String key, String val) {
-        try {
-            return userPropertiesDao.addUserPropertyByUserName(username, key, val);
-        } catch (SQLException e) {
-            throw new StorageException("Could not add external data " + key + ":" + val + " to user " + username, e);
-        }
-    }
-
-    @Override
-    public boolean deleteUserProperty(String username, String key) {
-        try {
-            return userPropertiesDao.deleteProperty(userGroupsDao.findUserIdByUsername(username), key);
-        } catch (SQLException e) {
-            throw new StorageException("Could not delete external data " + key + " from user " + username, e);
-        }
-    }
-
-    @Override
-    public Properties findPropertiesForUser(String username) {
-        try {
-            List<UserProperty> userProperties = userPropertiesDao.getPropertiesForUser(username);
-            PropertiesImpl properties = new PropertiesImpl();
-            for (UserProperty userProperty : userProperties) {
-                properties.put(userProperty.getPropKey(), userProperty.getPropValue());
-            }
-            return properties;
-        } catch (SQLException e) {
-            throw new StorageException("Failed to load user properties for " + username, e);
-        }
-    }
-
-    @Override
-    public void deletePropertyFromAllUsers(String propertyKey) {
-        try {
-            userPropertiesDao.deletePropertyFromAllUsers(propertyKey);
-        } catch (SQLException e) {
-            throw new StorageException("Could not delete property by key" + propertyKey + " from all users");
-        }
-
-    }
-
-    /**
-     * Locks user upon incorrect login attempt
-     *
-     * @param userName
-     * @throws StorageException
-     */
-    @Nonnull
-    @Override
-    public void lockUser(String userName) {
-        User user = null;
-        try {
-            user = getUser(userName);
-            synchronized (lockedUsersCache) {
-                // despite we use concurrency ready cache,
-                // we lock it externally in sake of db/cache
-                // synchronisation
-                if (user != null)
-                    // we want to block non-existing users as well
-                    userGroupsDao.lockUser(user);
-                registerLockedOutUser(userName);
-            }
-        } catch (SQLException e) {
-            log.debug("Could not lock user {}, cause: {}", userName, e);
-            throw new StorageException(
-                    "Could not lock user '" + userName + "', because " + e.getMessage()
-            );
-        }
-    }
-
-    /**
-     * Unlocks locked in user
-     *
-     * @param userName
-     * @throws StorageException
-     */
-    @Nonnull
-    @Override
-    public void unlockUser(String userName) {
-        User user = null;
-        try {
-            user = getUser(userName);
-            synchronized (lockedUsersCache) {
-                // despite we use concurrency ready cache,
-                // we lock it externally in sake of db/cache
-                // synchronisation
-                if (user != null)
-                    userGroupsDao.unlockUser(user);
-                unRegisterLockedOutUser(userName);
-            }
-            resetIncorrectLoginAttempts(userName);
-        } catch (SQLException e) {
-            log.debug("Could not unlock user {}, cause: {}", userName, e);
-            throw new StorageException(
-                    "Could not unlock user '" + userName + "', because " + e.getMessage()
-            );
-        }
-    }
-
-    /**
-     * Unlocks all locked out users
-     */
-    @Nonnull
-    @Override
-    public void unlockAllUsers() {
-        try {
-            synchronized (lockedUsersCache) {
-                // despite we use concurrency ready cache,
-                // we lock it externally in sake of db/cache
-                // synchronisation
-                userGroupsDao.unlockAllUsers();
-                lockedUsersCache.invalidateAll();
-            }
-            synchronized (incorrectLoginAttemptsCache) {
-                incorrectLoginAttemptsCache.clear();
-            }
-        } catch (SQLException e) {
-            log.debug("Could not unlock all users, cause: {}", e);
-            throw new StorageException(
-                    "Could not unlock all users, because " + e.getMessage()
-            );
-        }
-    }
-
-    /**
-     * Unlocks all locked out admin users
-     */
-    @Nonnull
-    @Override
-    public void unlockAdminUsers() {
-        try {
-            synchronized (lockedUsersCache) {
-                // despite we use concurrency ready cache,
-                // we lock it externally in sake of db/cache
-                // synchronisation
-                userGroupsDao.unlockAdminUsers();
-                getAllUsers(true).stream()
-                        .filter(u -> u.isAdmin())
-                        .forEach(u -> {
-                                    unRegisterLockedOutUser(u.getUsername());
-                                    resetIncorrectLoginAttempts(u.getUsername());
-                                }
-                        );
-            }
-        } catch (SQLException e) {
-            log.debug("Could not unlock all admin users, cause: {}", e);
-            throw new StorageException(
-                    "Could not unlock all admin users, because " + e.getMessage()
-            );
-        }
-    }
-
-    /**
-     * @param userName
-     * @return incorrect login attempts for user
-     */
-    @Nonnull
-    public int getIncorrectLoginAttempts(String userName) {
-        AtomicInteger incorrectLoginAttempts = incorrectLoginAttemptsCache.get(userName);
-        return incorrectLoginAttempts != null ? incorrectLoginAttempts.get() : 0;
-    }
-
-    /**
-     * Registers incorrect login attempt
-     *
-     * @param userName
-     * @throws StorageException
-     */
-    @Nonnull
-    @Override
-    public void registerIncorrectLoginAttempt(String userName) {
-        User user = getUser(userName);
-        if (user == null){
-            return;
-        }
-        AtomicInteger atomicInteger = incorrectLoginAttemptsCache.get(userName);
-        if (atomicInteger == null) {
-            synchronized (incorrectLoginAttemptsCache) {
-                atomicInteger = incorrectLoginAttemptsCache.get(userName);
-                if (atomicInteger == null) {
-                    atomicInteger = new AtomicInteger(0);
-                    incorrectLoginAttemptsCache.put(userName, atomicInteger);
-                }
-            }
-        }
-        int incorrectLoginAttempt = atomicInteger.incrementAndGet();
-        log.debug("Increased IncorrectLoginAttempts for user '{}' to '{}'", userName, incorrectLoginAttempt);
-
-    }
-
-    /**
-     * Resets incorrect login attempts
-     *
-     * @param userName
-     * @throws StorageException
-     */
-    @Nonnull
-    @Override
-    public void resetIncorrectLoginAttempts(String userName) {
-        if (incorrectLoginAttemptsCache.containsKey(userName)) {
-            synchronized (incorrectLoginAttemptsCache) {
-                incorrectLoginAttemptsCache.remove(userName);
-            }
-            log.debug("Reset IncorrectLoginAttempts for user '{}'", userName);
-        }
-    }
-
-    /**
-     * @return Collection of locked out users
-     */
-    @Override
-    public Set<String> getLockedUsers() {
-        try {
-            Set<String> lockedUsers = userGroupsDao.getLockedUsersNames();
-            lockedUsers.addAll(lockedUsersCache.asMap().keySet());
-            return lockedUsers;
-        } catch (SQLException e) {
-            log.debug("Could not list locked in users, cause: {}", e);
-            throw new StorageException(
-                    "Could not list locked in users, because " + e.getMessage()
-            );
-        }
-    }
-
-    /**
-     * Checks whether given user is locked
-     * <p>
-     * note: this method using caching in sake
-     * of DB load preventing
-     *
-     * @param userName
-     * @return boolean
-     */
-    @Override
-    public boolean isUserLocked(String userName) {
-        if (shouldCacheLockedUsers()) {
-            if (lockedUsersCache.getIfPresent(userName) != null) {
-                return true;
-            }
-            User user = getUser(userName);
-            if (user != null && user.isLocked()) {
-                registerLockedOutUser(user.getUsername());
-                return user.isLocked();
-            }
-        } else {
-            User user = getUser(userName);
-            if (user != null) {
-                return user.isLocked();
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Calculates next login if user previously
-     * failed to login due to incorrect credentials
-     * and now have to wait before trying to login again
-     *
-     * @param userName
-     * @return login delay or -1 if user login should
-     * not be delayed (e.g last login was successful)
-     */
-    @Nonnull
-    @Override
-    public long getNextLogin(String userName) {
-        Long lastAccessTime = userAccessUsersCache.getIfPresent(userName);
-        if (lastAccessTime != null) {
-            return getNextLogin(
-                    getIncorrectLoginAttempts(userName),
-                    lastAccessTime
-            );
-        }
-        return -1;
-    }
-
-    /**
-     * Calculates next login if user previously
-     * failed to authenticate, and now have to
-     * wait before before performing another login
-     * attempt,
-     * <p>
-     * - delay becomes affective after {@link UserGroupServiceImpl#OK_INCORRECT_LOGINS}
-     * - maximum possible delay is {@link UserGroupServiceImpl#MAX_LOGIN_DELAY}
-     *
-     * @param incorrectLoginAttempts
-     * @param lastAccessTimeMillis
-     * @return login delay or -1 if user login should
-     * not be delayed (e.g last login was successful) or
-     * OK_INCORRECT_LOGINS not exceeded yet
-     */
-    @Nonnull
-    @Override
-    public long getNextLogin(int incorrectLoginAttempts, long lastAccessTimeMillis) {
-        if (incorrectLoginAttempts >= OK_INCORRECT_LOGINS) {
-            long delay = Long.valueOf(
-                    (incorrectLoginAttempts - OK_INCORRECT_LOGINS) * LOGIN_DELAY_MULTIPLIER).longValue();
-            if (delay != 0)
-                return lastAccessTimeMillis + (delay <= MAX_LOGIN_DELAY ? delay : MAX_LOGIN_DELAY);
-        }
-        return -1;
-    }
-
-    /**
-     * Changes user password
-     *
-     * @param user
-     * @param newSaltedPassword
-     * @return sucess/failure
-     * @throws StorageException if persisting password fails
-     */
-    @Override
-    public void changePassword(UserInfo user, SaltedPassword newSaltedPassword) {
-        try {
-            if (user == null) throw new UsernameNotFoundException("User '" + user.getUsername() + "' is not exist");
-            if (!user.isUpdatableProfile()) {
-                throw new PasswordChangeException("The specified user is not permitted to reset his password.");
-            }
-            userGroupsDao.changePassword(user.getUsername(), newSaltedPassword);
-            userGroupsDao.unexpirePassword(user.getUsername());
-        } catch (SQLException e) {
-            throw new StorageException(
-                    "Changing password for \"" + user.getUsername() + "\" has failed, " + e.getMessage(), e);
-        }
-    }
-
-    /**
-     * Makes user password expired
-     *
-     * @param userName
-     */
-    @Override
-    public void expireUserPassword(String userName) {
-        try {
-            if (getUser(userName) != null) {
-                userGroupsDao.expireUserPassword(userName);
-                return;
-            }
-            throw new UsernameNotFoundException("User " + userName + " is not exist");
-        } catch (SQLException e) {
-            throw new StorageException("Expiring user password for \"" + userName + "\" has failed, " + e.getMessage(),
-                    e);
-        }
-    }
-
-    /**
-     * Makes user password not expired
-     *
-     * @param userName
-     */
-    @Override
-    public void revalidatePassword(String userName) {
-        try {
-            if (getUser(userName) != null) {
-                userGroupsDao.unexpirePassword(userName);
-                return;
-            }
-            throw new UsernameNotFoundException("User " + userName + " is not exist");
-        } catch (SQLException e) {
-            throw new StorageException("Expiring user password for \"" + userName + "\" has failed, " + e.getMessage(), e);
-        }
-    }
-
-    /**
-     * Makes all users passwords expired
-     */
-    @Override
-    public void expirePasswordForAllUsers() {
-        try {
-            userGroupsDao.expirePasswordForAllUsers();
-        } catch (SQLException e) {
-            throw new StorageException("Expiring passwords for all users has failed, " + e.getMessage(), e);
-        }
-    }
-
-    /**
-     * Makes all users passwords not expired
-     */
-    @Override
-    public void revalidatePasswordForAllUsers() {
-        try {
-            userGroupsDao.unexpirePasswordForAllUsers();
-        } catch (SQLException e) {
-            throw new StorageException("UnExpiring passwords for all users has failed, " + e.getMessage(), e);
-        }
-    }
-
-    /**
-     * @return whether locked out users should be cached
-     */
-    private boolean shouldCacheLockedUsers() {
-        return CACHE_BLOCKED_USERS;
-    }
-
-    /**
-     * Registers locked out user in cache
-     *
-     * @param userName
-     */
-    private void registerLockedOutUser(String userName) {
-        if (shouldCacheLockedUsers())
-            lockedUsersCache.put(userName, System.currentTimeMillis());
-    }
-
-    /**
-     * Unregisters locked out user/s from cache
-     *
-     * @param user a user name to unlock or all users via ALL_USERS
-     *             {@see UserGroupServiceImpl.ALL_USERS}
-     */
-    private void unRegisterLockedOutUser(String user) {
-        if (shouldCacheLockedUsers()) {
-            lockedUsersCache.invalidate(user);
-        }
-    }
-
-    private GroupInfo groupToGroupInfo(Group group) {
-        MutableGroupInfo result = InfoFactoryHolder.get().createGroup(group.getGroupName());
-        result.setDescription(group.getDescription());
-        result.setNewUserDefault(group.isNewUserDefault());
-        result.setRealm(group.getRealm());
-        result.setRealmAttributes(group.getRealmAttributes());
-        return result;
-    }
-
-    private Group groupInfoToGroup(long groupId, GroupInfo groupInfo) {
-        return new Group(groupId, groupInfo.getGroupName(), groupInfo.getDescription(),
-                groupInfo.isNewUserDefault(), groupInfo.getRealm(), groupInfo.getRealmAttributes());
-    }
-
-    private UserInfo userToUserInfo(User user) throws SQLException {
-        return userToUserInfoWithProperties(user, null);
-    }
-
-    private UserInfo userToUserInfoWithProperties(User user, Map<Long, Set<UserPropertyInfo>> allUserProperties)
-            throws SQLException {
-        UserInfoBuilder builder = new UserInfoBuilder(user.getUsername());
-        Set<UserGroupInfo> groups = new HashSet<>(user.getGroups().size());
-        for (UserGroup userGroup : user.getGroups()) {
-            Group groupById = userGroupsDao.findGroupById(userGroup.getGroupId());
-            if (groupById != null) {
-                String groupname = groupById.getGroupName();
-                groups.add(InfoFactoryHolder.get().createUserGroup(groupname, userGroup.getRealm()));
-            } else {
-                log.error("Group ID " + userGroup.getGroupId() + " does not exists!" +
-                        " Skipping add group for user " + user.getUsername());
-            }
-        }
-        builder.password(new SaltedPassword(user.getPassword(), user.getSalt())).email(user.getEmail())
-                .admin(user.isAdmin()).enabled(user.isEnabled()).updatableProfile(user.isUpdatableProfile())
-                .groups(groups);
-        MutableUserInfo userInfo = builder.build();
-        userInfo.setTransientUser(false);
-        userInfo.setGenPasswordKey(user.getGenPasswordKey());
-        userInfo.setRealm(user.getRealm());
-        userInfo.setPrivateKey(user.getPrivateKey());
-        userInfo.setPublicKey(user.getPublicKey());
-        userInfo.setLastLoginTimeMillis(user.getLastLoginTimeMillis());
-        userInfo.setLastLoginClientIp(user.getLastLoginClientIp());
-        userInfo.setBintrayAuth(user.getBintrayAuth());
-        userInfo.setLocked(user.isLocked());
-        userInfo.setCredentialsExpired(user.isCredentialsExpired());
-        userInfo.setCredentialsNonExpired(!user.isCredentialsExpired());
-        if (MapUtils.isNotEmpty(allUserProperties) && allUserProperties.get(user.getUserId()) != null) {
-            userInfo.setUserProperties(allUserProperties.get(user.getUserId()));
-        }
-        return userInfo;
-    }
-
-    private User userInfoToUser(long userId, UserInfo userInfo) throws SQLException {
-        User u = new User(userId, userInfo.getUsername(), userInfo.getPassword(), userInfo.getSalt(),
-                userInfo.getEmail(), userInfo.getGenPasswordKey(),
-                userInfo.isAdmin(), userInfo.isEnabled(), userInfo.isUpdatableProfile(), userInfo.getRealm(),
-                userInfo.getPrivateKey(),
-                userInfo.getPublicKey(), userInfo.getLastLoginTimeMillis(), userInfo.getLastLoginClientIp(),
-                userInfo.getBintrayAuth(), userInfo.isLocked(), userInfo.isCredentialsExpired());
-        Set<UserGroupInfo> groups = userInfo.getGroups();
-        Set<UserGroup> userGroups = new HashSet<>(groups.size());
-        for (UserGroupInfo groupInfo : groups) {
-            Group groupByName = userGroupsDao.findGroupByName(groupInfo.getGroupName());
-            if (groupByName != null) {
-                userGroups.add(new UserGroup(u.getUserId(), groupByName.getGroupId(), groupInfo.getRealm()));
-            } else {
-                log.error("Group named " + groupInfo.getGroupName() + " does not exists!" +
-                        " Skipping add group for user " + userInfo.getUsername());
-            }
-        }
-        u.setGroups(userGroups);
-        return u;
-    }
-
-    /**
-     * Calculates user login delay multiplier,
-     * the value (security.loginBlockDelay) is
-     * taken from system properties file,
-     * <p>
-     * delay may not exceed {@link UserGroupServiceImpl#MAX_LOGIN_DELAY}
-     *
-     * @return user login delay multiplier
-     */
-    private static int getLoginDelayMultiplier() {
-        int userDefinedDelayMultiplier = ConstantValues.loginBlockDelay.getInt();
-        if (userDefinedDelayMultiplier <= MAX_LOGIN_DELAY)
-            return userDefinedDelayMultiplier;
-        log.warn(
-                String.format(
-                        "loginBlockDelay '%d' has exceeded maximum allowed delay '%d', " +
-                                "which will be used instead", userDefinedDelayMultiplier, MAX_LOGIN_DELAY
-                )
-        );
-        return MAX_LOGIN_DELAY;
-    }
-
-    @Override
-    public Set<PasswordExpiryUser> getUsersWhichPasswordIsAboutToExpire(int daysToNotifyBefore, int daysToKeepPassword) {
-        //User error = notification day > expiration day will cause mail to never be sent. Just send a day before
-        if(daysToKeepPassword < daysToNotifyBefore) {
-            if(daysToKeepPassword >= 2) {
-                daysToNotifyBefore = daysToKeepPassword - 1;
-            } else {
-                daysToNotifyBefore = 1;
-            }
-        }
-        long millisDaysToNotifyBefore = daysToNotifyBefore * MILLIS_IN_DAY;
-        long millisDaysToKeepPassword = daysToKeepPassword * MILLIS_IN_DAY;
-        long now = DateTime.now().getMillis();
-        try {
-            return userGroupsDao.getPasswordExpiredUsersByFilter(
-                    (Long creationTime) ->
-                            shouldNotifyUser(creationTime, now, millisDaysToKeepPassword, millisDaysToNotifyBefore));
-        } catch (SQLException e) {
-            log.debug("Could not fetch users with passwords that about to expire, cause: {}", e);
-            throw new StorageException("Could not fetch users with passwords that about to expire");
-        }
-    }
-
-
-    @Override
-    public List<String> markUsersCredentialsExpired(int daysToKeepPassword) {
-        long millisDaysToKeepPassword = daysToKeepPassword * MILLIS_IN_DAY;
-        long now = DateTime.now().getMillis();
-        Set<PasswordExpiryUser> usersToExpire;
-        try {
-             usersToExpire = userGroupsDao.getPasswordExpiredUsersByFilter(
-                    (Long creationTime) -> passwordExpired(creationTime, now, millisDaysToKeepPassword));
-            boolean hadErrors = markExpiryByBatch(usersToExpire);
-            if(hadErrors) {
-                log.debug("Could not mark credentials expired.");
-                throw new StorageException("Could not mark credentials expired, see logs for more details");
-            }
-        } catch (SQLException e) {
-            log.debug("Could not mark credentials expired, cause: {}", e);
-            throw new StorageException("Could not mark credentials expired, see logs for more details", e);
-        }
-        return usersToExpire.stream()
-                .map(PasswordExpiryUser::getUserName)
-                .collect(Collectors.toList());
-    }
-
-    private boolean markExpiryByBatch(Set<PasswordExpiryUser> expiredPasswordsUsers) throws SQLException {
-        boolean hadErrors = false;
-        int batchCounter = 0;
-        Set<Long> batchOp = Sets.newHashSet();
-        //Run in 20 user batches
-        UserGroupStoreService txMe = ContextHelper.get().beanForType(UserGroupStoreService.class);
-        for (PasswordExpiryUser expiredUser : expiredPasswordsUsers) {
-            batchOp.add(expiredUser.getUserId());
-            batchCounter++;
-            if (batchCounter == 100) {
-                try {
-                    txMe.expirePasswordForUserIds(batchOp);
-                } catch (SQLException se) {
-                    log.error(se.getMessage(), se);
-                    hadErrors = true;
-                }
-                batchCounter = 0;
-                batchOp.clear();
-            }
-        }
-        //If we had less then 100 at the end make sure to mark them as well
-        if(batchCounter > 0) {
-            txMe.expirePasswordForUserIds(batchOp);
-        }
-        return hadErrors;
-    }
-
-    public void expirePasswordForUserIds(Set<Long> userIds) throws SQLException {
-        userGroupsDao.markCredentialsExpired(userIds.toArray(new Long[userIds.size()]));
-    }
-
-    /**
-     * Checks whether user password is expired
-     *
-     * @param userName  a user name
-     * @param expiresIn days for password to stay valid after creation
-     * @return boolean
-     */
-    @Override
-    public boolean isUserPasswordExpired(String userName, int expiresIn) {
-        boolean isExpired = false;
-
-        String passwordCreatedProperty = findUserProperty(userName, "passwordCreated");
-        DateTime created = null;
-        if (Strings.isNullOrEmpty(passwordCreatedProperty)) {
-            log.debug("Password creation for user {} was not found, initiating default value (now)", userName);
-            created = DateTime.now();
-            addUserProperty(userName, "passwordCreated", Long.toString(created.getMillis()));
-        } else {
-            created = new DateTime(Long.valueOf(passwordCreatedProperty));
-        }
-
-        log.debug("Password creation for user {} is {}, password expires after {}", userName, created, expiresIn);
-        if (isExpired = created.plusDays(expiresIn).isBeforeNow()) {
-            log.debug("User {} credentials have expired (updating profile accordingly)", userName);
-            expireUserPassword(userName);
-        }
-
-        // todo: [mp] set user.credentialsExpired=True if expired indeed
-
-        return isExpired;
-    }
-
-    /**
-     * @param userName
-     * @return the date when last password was created
-     * @throws SQLException
-     */
-    @Override
-    public Long getUserPasswordCreationTime(String userName) {
-        try {
-            return userGroupsDao.getUserPasswordCreationTime(userName);
-        } catch (SQLException e) {
-            log.debug("Could not check when credentials were created, cause: {}", e);
-            throw new StorageException("Could not check when credentials were created, see logs for more details");
-        }
-    }
-
-    private boolean passwordExpired(long creationTime, long millisNow, long millisDaysToKeepPassword) {
-        return millisNow > (creationTime + millisDaysToKeepPassword);
-    }
-
-    public boolean shouldNotifyUser (long creationTime, long millisNow, long millisDaysToKeepPassword,
-            long millisDaysToNotifyBefore) {
-                // now is after the (expiration - notification days) == inside the notification window
-        return (millisNow >= ((creationTime + millisDaysToKeepPassword) - millisDaysToNotifyBefore))
-                // now is not pass expiration notification day + 1 day (end of notification window)
-                && (millisNow <= ((creationTime + millisDaysToKeepPassword) - millisDaysToNotifyBefore) + MILLIS_IN_DAY);
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/servers/dao/ArtifactoryServersDao.java b/storage/db/src/main/java/org/artifactory/storage/db/servers/dao/ArtifactoryServersDao.java
deleted file mode 100644
index 1292e2d..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/servers/dao/ArtifactoryServersDao.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.servers.dao;
-
-import com.google.common.collect.Lists;
-import org.artifactory.addon.ArtifactoryRunningMode;
-import org.artifactory.state.ArtifactoryServerState;
-import org.artifactory.storage.db.servers.model.ArtifactoryServer;
-import org.artifactory.storage.db.servers.model.ArtifactoryServerRole;
-import org.artifactory.storage.db.util.BaseDao;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Repository;
-
-import javax.annotation.Nullable;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.List;
-
-/**
- * A data access object for artifactory servers table access.
- *
- * @author Yossi Shaul
- */
- at Repository
-public class ArtifactoryServersDao extends BaseDao {
-
-    @Autowired
-    public ArtifactoryServersDao(JdbcHelper jdbcHelper) {
-        super(jdbcHelper);
-    }
-
-    public int createArtifactoryServer(ArtifactoryServer s) throws SQLException {
-        return jdbcHelper.executeUpdate(
-                "INSERT INTO artifactory_servers VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
-                s.getServerId(), s.getStartTime(), s.getContextUrl(), s.getMembershipPort(),
-                enumToString(s.getServerState()), enumToString(s.getServerRole()),
-                s.getLastHeartbeat(), s.getArtifactoryVersion(),
-                s.getArtifactoryRevision(), s.getArtifactoryRelease(),
-                enumToString(s.getArtifactoryRunningMode()), s.getLicenseKeyHash());
-    }
-
-    public boolean hasArtifactoryServer(String serverId) throws SQLException {
-        return getArtifactoryServer(serverId) != null;
-    }
-
-    @Nullable
-    public ArtifactoryServer getArtifactoryServer(String serverId) throws SQLException {
-        ResultSet resultSet = null;
-        ArtifactoryServer server = null;
-        try {
-            resultSet = jdbcHelper.executeSelect(
-                    "SELECT * FROM artifactory_servers WHERE server_id = ?", serverId);
-            if (resultSet.next()) {
-                server = serverFromResultSet(resultSet);
-            }
-            return server;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    public List<ArtifactoryServer> getAllArtifactoryServers() throws SQLException {
-        ResultSet resultSet = null;
-        List<ArtifactoryServer> servers = Lists.newArrayList();
-        try {
-            resultSet = jdbcHelper.executeSelect("SELECT * FROM artifactory_servers");
-            while (resultSet.next()) {
-                servers.add(serverFromResultSet(resultSet));
-            }
-            return servers;
-        } finally {
-            DbUtils.close(resultSet);
-        }
-    }
-
-    /**
-     * Update existing {@link ArtifactoryServer}
-     * <p>Does not update the {@code membership_port}
-     * */
-    public int updateArtifactoryServer(ArtifactoryServer s) throws SQLException {
-        return jdbcHelper.executeUpdate("UPDATE artifactory_servers " +
-                "SET start_time = ?, context_url = ?, " +
-                "server_state = ?, server_role = ?, " +
-                "last_heartbeat = ?, artifactory_version = ?, " +
-                "artifactory_revision = ?, artifactory_release = ?, " +
-                "artifactory_running_mode = ?, license_hash=? WHERE server_id = ?",
-                s.getStartTime(), s.getContextUrl(),
-                enumToString(s.getServerState()), enumToString(s.getServerRole()),
-                s.getLastHeartbeat(), s.getArtifactoryVersion(),
-                s.getArtifactoryRevision(), s.getArtifactoryRelease(),
-                enumToString(s.getArtifactoryRunningMode()), s.getLicenseKeyHash(), s.getServerId());
-    }
-
-    public int updateArtifactoryServerHeartbeat(String serverId, long lastHeartbeat) throws SQLException {
-        return jdbcHelper.executeUpdate("UPDATE artifactory_servers SET last_heartbeat = ? WHERE server_id = ?",
-                lastHeartbeat, serverId);
-    }
-
-    public int updateArtifactoryServerState(String serverId, ArtifactoryServerState serverState, long heartbeat)
-            throws SQLException {
-        return jdbcHelper.executeUpdate(
-                "UPDATE artifactory_servers SET server_state = ?, last_heartbeat = ? WHERE server_id = ?",
-                enumToString(serverState), heartbeat, serverId);
-    }
-
-    public int updateArtifactoryServerRole(String serverId, ArtifactoryServerRole serverRole) throws SQLException {
-        return jdbcHelper.executeUpdate("UPDATE artifactory_servers SET server_role = ? WHERE server_id = ?",
-                enumToString(serverRole), serverId);
-    }
-
-    public int updateArtifactoryMembershipPort(String serverId, int membershipPort) throws SQLException {
-        return jdbcHelper.executeUpdate("UPDATE artifactory_servers SET membership_port = ? WHERE server_id = ?",
-                membershipPort, serverId);
-    }
-
-    public boolean removeServer(String serverId) throws SQLException {
-        int deleted = jdbcHelper.executeUpdate("DELETE FROM artifactory_servers WHERE server_id = ?", serverId);
-        return deleted > 0;
-    }
-
-    private ArtifactoryServer serverFromResultSet(ResultSet rs) throws SQLException {
-        return new ArtifactoryServer(rs.getString(1), rs.getLong(2), rs.getString(3), rs.getInt(4),
-                ArtifactoryServerState.fromString(rs.getString(5)), ArtifactoryServerRole.fromString(rs.getString(6)),
-                rs.getLong(7), rs.getString(8), rs.getInt(9), rs.getLong(10),
-                ArtifactoryRunningMode.fromString(rs.getString(11)), rs.getString(12));
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/servers/service/ArtifactoryServersServiceImpl.java b/storage/db/src/main/java/org/artifactory/storage/db/servers/service/ArtifactoryServersServiceImpl.java
deleted file mode 100644
index 74a9e08..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/servers/service/ArtifactoryServersServiceImpl.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package org.artifactory.storage.db.servers.service;
-
-import org.artifactory.state.ArtifactoryServerState;
-import org.artifactory.storage.StorageException;
-import org.artifactory.storage.db.servers.dao.ArtifactoryServersDao;
-import org.artifactory.storage.db.servers.model.ArtifactoryServer;
-import org.artifactory.storage.db.servers.model.ArtifactoryServerRole;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.sql.SQLException;
-import java.util.List;
-
-/**
- * Business service for artifactory servers management.
- *
- * @author Yossi Shaul
- */
- at Service
-public class ArtifactoryServersServiceImpl implements ArtifactoryServersService {
-    @Autowired
-    private ArtifactoryServersDao serversDao;
-
-    @Override
-    public List<ArtifactoryServer> getAllArtifactoryServers() {
-        try {
-            return serversDao.getAllArtifactoryServers();
-        } catch (SQLException e) {
-            throw new StorageException("Failed to load list of Artifactory servers", e);
-        }
-    }
-
-    @Override
-    public ArtifactoryServer getArtifactoryServer(String nodeId) {
-        try {
-            return serversDao.getArtifactoryServer(nodeId);
-        } catch (SQLException e) {
-            throw new StorageException("Failed to get Artifactory server [" + nodeId + "]", e);
-        }
-    }
-
-    @Override
-    public int createArtifactoryServer(ArtifactoryServer artifactoryServer) {
-        try {
-            return serversDao.createArtifactoryServer(artifactoryServer);
-        } catch (SQLException e) {
-            throw new StorageException(
-                    "Failed to create Artifactory server" +
-                            " [" + getServerIdForDisplay(artifactoryServer) + "]", e);
-        }
-    }
-
-    @Override
-    public int updateArtifactoryServer(ArtifactoryServer artifactoryServer) {
-        try {
-            return serversDao.updateArtifactoryServer(artifactoryServer);
-        } catch (SQLException e) {
-            throw new StorageException("Failed to update Artifactory server" +
-                    " [" + getServerIdForDisplay(artifactoryServer) + "]", e);
-        }
-    }
-
-    //
-    @Override
-    public int updateArtifactoryServerState(String serverId, ArtifactoryServerState newState) {
-        try {
-            return serversDao.updateArtifactoryServerState(serverId, newState, System.currentTimeMillis());
-        } catch (SQLException e) {
-            throw new StorageException("Failed to update Artifactory server [" + serverId.trim() + "]", e);
-        }
-    }
-
-    @Override
-    public int updateArtifactoryServerRole(String serverId, ArtifactoryServerRole newRole) {
-        try {
-            return serversDao.updateArtifactoryServerRole(serverId, newRole);
-        } catch (SQLException e) {
-            throw new StorageException("Failed to update Artifactory server role [" + serverId + "]", e);
-        }
-    }
-
-    @Override
-    public int updateArtifactoryJoinPort(String serverId, int joinPort) {
-        try {
-            return serversDao.updateArtifactoryMembershipPort(serverId, joinPort);
-        } catch (SQLException e) {
-            throw new StorageException("Failed to update Artifactory server join port [" + serverId + "]", e);
-        }
-    }
-
-    @Override
-    public boolean removeServer(String serverId) {
-        try {
-            return serversDao.removeServer(serverId);
-        } catch (SQLException e) {
-            throw new StorageException("Failed to delete server with id '" + serverId + "': " + e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public int updateArtifactoryServerHeartbeat(String serverId, long lastHeartbeat) {
-        try {
-            return serversDao.updateArtifactoryServerHeartbeat(serverId, lastHeartbeat);
-        } catch (SQLException e) {
-            throw new StorageException("Failed to update Artifactory server heartbeat [" + serverId + "]", e);
-        }
-    }
-
-
-    public String getServerIdForDisplay(ArtifactoryServer artifactoryServer) {
-        return artifactoryServer.getServerId().trim();
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/spring/AnnotationStorageTxAttributeSource.java b/storage/db/src/main/java/org/artifactory/storage/db/spring/AnnotationStorageTxAttributeSource.java
deleted file mode 100644
index 752396c..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/spring/AnnotationStorageTxAttributeSource.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.spring;
-
-import org.springframework.transaction.annotation.AnnotationTransactionAttributeSource;
-
-/**
- * TODO: Documentation
- *
- * @author Yossi Shaul
- */
-public class AnnotationStorageTxAttributeSource extends AnnotationTransactionAttributeSource {
-    public AnnotationStorageTxAttributeSource() {
-        super(new StorageTxAnnotationParser());
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/spring/ArtifactoryDataSource.java b/storage/db/src/main/java/org/artifactory/storage/db/spring/ArtifactoryDataSource.java
deleted file mode 100644
index fc5c196..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/spring/ArtifactoryDataSource.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.spring;
-
-import javax.sql.DataSource;
-import java.sql.SQLFeatureNotSupportedException;
-import java.util.logging.Logger;
-
-/**
- * Common interface for (non JNDI) JDBC data sources used by Artifactory.
- *
- * @author Yossi Shaul
- */
-public interface ArtifactoryDataSource extends DataSource {
-    @Override
-    Logger getParentLogger() throws SQLFeatureNotSupportedException;
-
-    void close() throws Exception;
-
-    //for now only used for mbean
-    int getActiveConnectionsCount();
-
-    int getIdleConnectionsCount();
-
-    int getMaxActive();
-
-    int getMaxIdle();
-
-    int getMaxWait();
-
-    int getMinIdle();
-
-    String getUrl();
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/spring/ArtifactoryTomcatDataSource.java b/storage/db/src/main/java/org/artifactory/storage/db/spring/ArtifactoryTomcatDataSource.java
deleted file mode 100644
index 63df5c6..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/spring/ArtifactoryTomcatDataSource.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.spring;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.tomcat.jdbc.pool.DataSource;
-import org.apache.tomcat.jdbc.pool.PoolProperties;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.storage.StorageProperties;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * A pooling data source based on tomcat-jdbc library.
- *
- * @author Yossi Shaul
- */
-public class ArtifactoryTomcatDataSource extends DataSource implements ArtifactoryDataSource {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryTomcatDataSource.class);
-    public ArtifactoryTomcatDataSource(StorageProperties s) {
-        // see org.apache.tomcat.jdbc.pool.DataSourceFactory.parsePoolProperties()
-        PoolProperties p = new PoolProperties();
-        p.setUrl(s.getConnectionUrl());
-        p.setDriverClassName(s.getDriverClass());
-        p.setUsername(s.getUsername());
-        p.setPassword(s.getPassword());
-
-        p.setDefaultAutoCommit(s.getBooleanProperty("defaultAutoCommit", true));
-        p.setDefaultTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
-
-        p.setInitialSize(s.getIntProperty("initialSize", 1));
-        p.setMaxAge(s.getIntProperty("maxAge", 0));
-        p.setMaxActive(s.getMaxActiveConnections());
-        p.setMaxWait(s.getIntProperty("maxWait", (int) TimeUnit.SECONDS.toMillis(120)));
-        p.setMaxIdle(s.getMaxIdleConnections());
-        p.setMinIdle(s.getIntProperty("minIdle", 1));
-        p.setMinEvictableIdleTimeMillis(
-                s.getIntProperty("minEvictableIdleTimeMillis", 300000));
-        p.setTimeBetweenEvictionRunsMillis(
-                s.getIntProperty("timeBetweenEvictionRunsMillis", 30000));
-        p.setInitSQL(s.getProperty("initSQL", null));
-
-        // validation query for all kind of tests (connect, borrow etc.)
-        p.setValidationQuery(s.getProperty("validationQuery", getDefaultValidationQuery(s)));
-        p.setValidationQueryTimeout(s.getIntProperty("validationQueryTimeout", 30));
-        p.setValidationInterval(s.getLongProperty("validationInterval", 30000));
-        p.setTestOnBorrow(s.getBooleanProperty("testOnBorrow", true));
-        p.setTestWhileIdle(s.getBooleanProperty("testWhileIdle", false));
-        p.setTestOnReturn(s.getBooleanProperty("testOnReturn", false));
-        p.setTestOnConnect(s.getBooleanProperty("testOnConnect", false));
-
-        p.setRemoveAbandoned(s.getBooleanProperty("removeAbandoned", false));
-        p.setRemoveAbandonedTimeout(s.getIntProperty("removeAbandonedTimeout", 600));
-        p.setSuspectTimeout(s.getIntProperty("suspectTimeout", 600));
-        p.setLogAbandoned(s.getBooleanProperty("logAbandoned", false));
-        p.setLogValidationErrors(s.getBooleanProperty("logValidationErrors", false));
-
-        p.setJmxEnabled(s.getBooleanProperty("jmxEnabled", true));
-
-        // only applicable if auto commit is false. has high performance penalty and only protects bugs in the code
-        p.setRollbackOnReturn(s.getBooleanProperty("rollbackOnReturn", false));
-        p.setCommitOnReturn(s.getBooleanProperty("commitOnReturn", false));
-
-        p.setIgnoreExceptionOnPreLoad(s.getBooleanProperty("ignoreExceptionOnPreLoad", false));
-
-        //p.setJdbcInterceptors(s.getProperty("jdbcInterceptors", "ConnectionState;StatementFinalizer"));
-        p.setJdbcInterceptors(s.getProperty("jdbcInterceptors", null));
-
-        p.setDefaultCatalog(s.getProperty("defaultCatalog", null));
-
-        setPoolProperties(p);
-    }
-
-    @Override
-    public int getActiveConnectionsCount() {
-        return super.getActive();
-    }
-
-    @Override
-    public int getIdleConnectionsCount() {
-        return super.getIdle();
-    }
-
-    @Override
-    public void close() {
-        close(true);    // close all connections, including active ones
-    }
-
-    public static DataSource createUniqueIdDataSource(StorageProperties s) {
-        // see org.apache.tomcat.jdbc.pool.DataSourceFactory.parsePoolProperties()
-        PoolProperties p = new PoolProperties();
-        p.setUrl(s.getConnectionUrl());
-        p.setDriverClassName(s.getDriverClass());
-        p.setUsername(s.getUsername());
-        p.setPassword(s.getPassword());
-
-        // auto commit is true for the unique id generator
-        p.setDefaultAutoCommit(true);
-        p.setDefaultTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
-
-        // only one connection is required for the id generator
-        p.setInitialSize(0);
-        p.setMinIdle(0);
-        p.setMaxIdle(1);
-        p.setMaxActive(1);
-        // Make sure old idle connections are sweep and tested
-        p.setTestWhileIdle(true);
-        p.setTestOnBorrow(true);
-        p.setTestWhileIdle(true);
-        p.setRemoveAbandoned(true);
-        p.setRemoveAbandonedTimeout((int) ConstantValues.locksTimeoutSecs.getLong()/2);
-        p.setSuspectTimeout((int) ConstantValues.locksTimeoutSecs.getLong()/2);
-        p.setLogAbandoned(true);
-        p.setLogValidationErrors(true);
-
-        // Timeout default to make sure new connection is created
-        long timeoutInMillis = TimeUnit.SECONDS.toMillis(ConstantValues.locksTimeoutSecs.getLong());
-        p.setMaxAge(timeoutInMillis);
-        p.setMaxWait((int) timeoutInMillis);
-        // Defaults values are good
-        //p.setMinEvictableIdleTimeMillis(60000);
-        //p.setTimeBetweenEvictionRunsMillis(5000);
-
-        // Pool sweeper critical here since connection rarely used
-        if (!p.isPoolSweeperEnabled()) {
-            log.error("ID Generator pool connection should sweep idled connections");
-        }
-
-        // validation query for all kind of tests (connect, borrow etc.)
-        p.setInitSQL(s.getProperty("initSQL", null));
-        p.setValidationQuery(s.getProperty("validationQuery", getDefaultValidationQuery(s)));
-        p.setValidationQueryTimeout(s.getIntProperty("validationQueryTimeout", 30));
-        p.setValidationInterval(s.getLongProperty("validationInterval", 30000));
-
-        p.setJmxEnabled(false);
-
-        p.setIgnoreExceptionOnPreLoad(s.getBooleanProperty("ignoreExceptionOnPreLoad", false));
-
-        //p.setJdbcInterceptors(s.getProperty("jdbcInterceptors", "ConnectionState;StatementFinalizer"));
-        p.setJdbcInterceptors(s.getProperty("jdbcInterceptors", null));
-
-        p.setDefaultCatalog(s.getProperty("defaultCatalog", null));
-
-        return new DataSource(p);
-    }
-
-    private static String getDefaultValidationQuery(StorageProperties s) {
-        switch (s.getDbType()) {
-            case DERBY:
-                return "values(1)";
-            case MYSQL:
-                return "/* ping */"; // special MySQL lightweight ping query
-            case ORACLE:
-                return "SELECT 1 FROM DUAL";
-            default:
-                return "SELECT 1";
-        }
-    }
-
-    @Override
-    public Connection getConnection(String username, String password) throws SQLException {
-        log.debug("Acquiring connection from pool");
-        return super.getConnection(username, password);
-    }
-
-    public Connection getConnection() throws SQLException {
-        log.debug("Acquiring connection from pool");
-        Connection connection = super.getConnection();
-        if (Connection.TRANSACTION_READ_COMMITTED != connection.getTransactionIsolation()) {
-            connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
-        }
-        return connection;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/spring/DbConfigFactory.java b/storage/db/src/main/java/org/artifactory/storage/db/spring/DbConfigFactory.java
deleted file mode 100644
index e4e0308..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/spring/DbConfigFactory.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.spring;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.FilenameUtils;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.storage.StorageProperties;
-import org.artifactory.storage.db.DbType;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.artifactory.storage.db.util.querybuilder.*;
-import org.artifactory.util.ResourceUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.BeanFactory;
-import org.springframework.beans.factory.BeanFactoryAware;
-import org.springframework.beans.factory.annotation.Autowire;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.jndi.JndiObjectFactoryBean;
-import org.springframework.util.StringUtils;
-
-import javax.naming.NamingException;
-import javax.sql.DataSource;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.sql.Connection;
-import java.sql.SQLException;
-
-/**
- * A Spring {@link org.springframework.context.annotation.Configuration} to initialized database beans.
- *
- * @author Yossi Shaul
- */
- at Configuration
-public class DbConfigFactory implements BeanFactoryAware {
-    public static final String BEAN_PREFIX = "bean:";
-    public static final String JNDI_PREFIX = "jndi:";
-    private static final Logger log = LoggerFactory.getLogger(DbConfigFactory.class);
-    private BeanFactory beanFactory;
-
-    @Bean(name = "dataSource")
-    public DataSource createDataSource() {
-        StorageProperties storageProperties = beanFactory.getBean("storageProperties", StorageProperties.class);
-        DataSource result = getDataSourceFromBeanOrJndi(storageProperties, "");
-        if (result != null) {
-            return result;
-        } else {
-            return new ArtifactoryTomcatDataSource(storageProperties);
-        }
-    }
-
-    private DataSource getDataSourceFromBeanOrJndi(StorageProperties storageProperties, String suffix) {
-        DataSource result = null;
-        String connectionUrl = storageProperties.getConnectionUrl();
-        if (StringUtils.startsWithIgnoreCase(connectionUrl, BEAN_PREFIX)) {
-            result = beanFactory.getBean(connectionUrl.substring(BEAN_PREFIX.length()) + suffix, DataSource.class);
-        } else if (StringUtils.startsWithIgnoreCase(connectionUrl, JNDI_PREFIX)) {
-            String jndiName = connectionUrl.substring(JNDI_PREFIX.length());
-            JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
-            jndiObjectFactoryBean.setJndiName(jndiName + suffix);
-            try {
-                jndiObjectFactoryBean.afterPropertiesSet();
-            } catch (NamingException e) {
-                throw new RuntimeException(e);
-            }
-            result = (DataSource) jndiObjectFactoryBean.getObject();
-        }
-        return result;
-    }
-
-    /**
-     * Returns a separate non-transactional auto-commit datasource. This data source is currently used only by the id
-     * generator.
-     *
-     * @return An auto-commit non-transactional datasource.
-     */
-    @Bean(name = "uniqueIdsDataSource")
-    public DataSource createUniqueIdsDataSource() {
-        StorageProperties storageProperties = beanFactory.getBean(StorageProperties.class);
-        DataSource result = getDataSourceFromBeanOrJndi(storageProperties, "noTX");
-        if (result != null) {
-            return result;
-        }
-
-        return ArtifactoryTomcatDataSource.createUniqueIdDataSource(storageProperties);
-    }
-
-    @Bean(name = "storageProperties")
-    public StorageProperties getDbProperties() throws IOException {
-        ArtifactoryHome artifactoryHome = ContextHelper.get().getArtifactoryHome();
-
-        File storagePropsFile = artifactoryHome.getStoragePropertiesFile();
-        if (!storagePropsFile.exists()) {
-            if (artifactoryHome.isHaConfigured()) {
-                throw new IllegalStateException("Artifactory could not start in HA mode because storage.properties " +
-                        "could not be found.");
-            }
-            copyDefaultDerbyConfig(storagePropsFile);
-        }
-
-        log.debug("Loading database properties from: '{}'", storagePropsFile);
-        StorageProperties storageProps = new StorageProperties(storagePropsFile);
-
-        // configure embedded derby
-        if (isDerbyDbUsed(storageProps.getDbType())) {
-            System.setProperty("derby.stream.error.file",
-                    new File(artifactoryHome.getLogDir(), "derby.log").getAbsolutePath());
-            String url = storageProps.getConnectionUrl();
-            String dataDir = FilenameUtils.separatorsToUnix(artifactoryHome.getHaAwareDataDir().getAbsolutePath());
-            url = url.replace("{db.home}", dataDir + "/derby");
-            storageProps.setConnectionUrl(url);
-        }
-
-        // first for loading of the driver class. automatic registration doesn't work on some Tomcat installations
-        String driver = storageProps.getDriverClass();
-        try {
-            Class.forName(driver);
-        } catch (ClassNotFoundException e) {
-            throw new RuntimeException("Failed to load JDBC driver '" + driver + "'", e);
-        }
-
-        return storageProps;
-    }
-
-    @Override
-    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
-        this.beanFactory = beanFactory;
-    }
-
-    private boolean isDerbyDbUsed(DbType dbType) {
-        return dbType.equals(DbType.DERBY);
-    }
-
-    private void copyDefaultDerbyConfig(File targetStorageFile) throws IOException {
-        try (InputStream pis = ResourceUtils.getResource("/META-INF/default/db/derby.properties")) {
-            FileUtils.copyInputStreamToFile(pis, targetStorageFile);
-        }
-    }
-
-    /**
-     * create  a query builder instance per db type
-     *
-     * @return query builder instance
-     */
-    @Bean(name = "queryBuilder", autowire = Autowire.BY_TYPE)
-    public IQueryBuilder createSqlBuilder() throws SQLException {
-        JdbcHelper jdbcHelper = beanFactory.getBean(JdbcHelper.class);
-        StorageProperties storageProperties = beanFactory.getBean(StorageProperties.class);
-        String productName = storageProperties.getDbType().toString();
-        Connection connection = jdbcHelper.getDataSource().getConnection();
-        connection.close();
-        IQueryBuilder queryBuilder;
-        switch (productName) {
-            case "oracle":
-                queryBuilder = new OracleQueryBuilder();
-                break;
-            case "mssql":
-                queryBuilder = new SqlServerQueryBuilder();
-                break;
-            case "derby":
-                queryBuilder = new DerbyQueryBuilder();
-                break;
-            case "postgresql":
-                queryBuilder = new PostgresqlQueryBuilder();
-                break;
-            case "mysql":
-                queryBuilder = new MysqlQueryBuilder();
-                break;
-            default:
-                queryBuilder = new DerbyQueryBuilder();
-                break;
-        }
-        return queryBuilder;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/spring/DbTransactionManager.java b/storage/db/src/main/java/org/artifactory/storage/db/spring/DbTransactionManager.java
deleted file mode 100644
index 5813994..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/spring/DbTransactionManager.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.spring;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.storage.fs.session.StorageSession;
-import org.artifactory.storage.fs.session.StorageSessionFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.jdbc.datasource.DataSourceTransactionManager;
-import org.springframework.stereotype.Component;
-import org.springframework.transaction.TransactionDefinition;
-import org.springframework.transaction.support.DefaultTransactionStatus;
-import org.springframework.transaction.support.TransactionSynchronizationManager;
-
-import javax.sql.DataSource;
-
-/**
- * @author Yossi Shaul
- */
- at Component("artifactoryTransactionManager")
-public class DbTransactionManager extends DataSourceTransactionManager {
-    private static final Logger log = LoggerFactory.getLogger(DbTransactionManager.class);
-
-    @Autowired
-    public DbTransactionManager(@Qualifier("dataSource") DataSource dataSource) {
-        super(dataSource);
-    }
-
-    @Override
-    protected void prepareSynchronization(DefaultTransactionStatus status, TransactionDefinition definition) {
-        super.prepareSynchronization(status, definition);
-        if (status.isNewSynchronization() &&
-                definition.getPropagationBehavior() != TransactionDefinition.PROPAGATION_NOT_SUPPORTED) {
-            log.trace("Registering new session synchronization");
-            StorageSessionFactory sessionFactory = ContextHelper.get().beanForType(StorageSessionFactory.class);
-            StorageSession session = sessionFactory.create();
-            TransactionSynchronizationManager.registerSynchronization(
-                    new SessionSynchronization(session, definition.getName()));
-        }
-    }
-
-
-    @Override
-    protected void doCleanupAfterCompletion(Object transaction) {
-        super.doCleanupAfterCompletion(transaction);
-        log.debug("Connection was successfully released");
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/spring/SessionSynchronization.java b/storage/db/src/main/java/org/artifactory/storage/db/spring/SessionSynchronization.java
deleted file mode 100644
index c7fbb6e..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/spring/SessionSynchronization.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.spring;
-
-import org.artifactory.storage.fs.session.StorageSession;
-import org.artifactory.storage.fs.session.StorageSessionHolder;
-import org.artifactory.util.TimeUnitFormat;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.transaction.support.TransactionSynchronization;
-import org.springframework.transaction.support.TransactionSynchronizationAdapter;
-
-/**
- * Callback for synchronization between Artifactory {@link org.artifactory.storage.fs.session.StorageSession} and the
- * JDBC transaction.
- *
- * @author Yossi Shaul
- */
-public class SessionSynchronization extends TransactionSynchronizationAdapter {
-    private static final Logger log = LoggerFactory.getLogger(SessionSynchronization.class);
-
-    private final StorageSession session;
-    private final String sessionName;
-    private final long startTime = System.nanoTime();
-
-    private boolean sessionActive = true;
-
-    public SessionSynchronization(StorageSession session, String name) {
-        this.session = session;
-        sessionName = name;
-        StorageSessionHolder.setSession(session);
-        log.debug("Session started: '{}'", sessionName);
-    }
-
-    @Override
-    public void suspend() {
-        if (sessionActive) {
-            StorageSessionHolder.removeSession();
-        }
-        sessionActive = false;
-    }
-
-    @Override
-    public void resume() {
-        if (sessionActive) {
-            log.warn("TX-resume when session is already active: {}", session);
-        }
-        StorageSessionHolder.setSession(session);
-        sessionActive = true;
-    }
-
-    @Override
-    public void beforeCommit(boolean readOnly) {
-        if (!sessionActive) {
-            log.trace("Session {} is not active", session);
-            return;
-        }
-
-        //Save any pending changes (no need to test for rollback at this phase)
-        log.debug("Saving session: {} .", session);
-        session.save();
-    }
-
-    @Override
-    public void afterCompletion(int status) {
-        if (sessionActive) {
-            boolean success = status == TransactionSynchronization.STATUS_COMMITTED;
-            // Commit the locks/discard changes on rollback
-            try {
-                session.afterCompletion(success);
-            } finally {
-                session.releaseResources();
-                StorageSessionHolder.removeSession();
-            }
-        }
-        if (log.isDebugEnabled()) {
-            log.debug("Session completed: '{}' in {}",
-                    sessionName, TimeUnitFormat.getTimeString(System.nanoTime() - startTime));
-        }
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/spring/StorageTxAnnotationParser.java b/storage/db/src/main/java/org/artifactory/storage/db/spring/StorageTxAnnotationParser.java
deleted file mode 100644
index a026262..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/spring/StorageTxAnnotationParser.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.spring;
-
-import org.artifactory.storage.fs.StorageTx;
-import org.springframework.core.annotation.AnnotationUtils;
-import org.springframework.transaction.annotation.TransactionAnnotationParser;
-import org.springframework.transaction.interceptor.RuleBasedTransactionAttribute;
-import org.springframework.transaction.interceptor.TransactionAttribute;
-
-import java.io.Serializable;
-import java.lang.reflect.AnnotatedElement;
-
-/**
- * @author Yossi Shaul
- */
-public class StorageTxAnnotationParser implements TransactionAnnotationParser, Serializable {
-
-    @Override
-    public TransactionAttribute parseTransactionAnnotation(AnnotatedElement ae) {
-        StorageTx ann = AnnotationUtils.getAnnotation(ae, StorageTx.class);
-        if (ann != null) {
-            RuleBasedTransactionAttribute rbta = new RuleBasedTransactionAttribute();
-            return rbta;
-        } else {
-            return null;
-        }
-    }
-
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/util/BaseDao.java b/storage/db/src/main/java/org/artifactory/storage/db/util/BaseDao.java
deleted file mode 100644
index b5412c4..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/util/BaseDao.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.util;
-
-/**
- * Base class for the data access objects.
- *
- * @author Yossi Shaul
- */
-public class BaseDao {
-
-    protected final JdbcHelper jdbcHelper;
-
-    public BaseDao(JdbcHelper jdbcHelper) {
-        this.jdbcHelper = jdbcHelper;
-    }
-
-    public static Long nullIfZero(long id) {
-        return (id == 0L) ? null : id;
-    }
-
-    // TODO [by FSI] : Looks useless since JDBS doing it no?
-    public static long zeroIfNull(Long id) {
-        return (id == null) ? 0L : id;
-    }
-
-    // TODO [by FSI] : Looks useless since JDBS doing it no?
-    public static int zeroIfNull(Integer id) {
-        return (id == null) ? 0 : id;
-    }
-
-    public static Long nullIfZeroOrNeg(long id) {
-        return (id <= 0L) ? null : id;
-    }
-
-    public static Integer nullIfZeroOrNeg(int id) {
-        return (id <= 0L) ? null : id;
-    }
-
-    public static String emptyIfNullOrDot(String path) {
-        return (path == null || path.length() == 0
-                || (path.length() == 1 && path.charAt(0) == '.')) ? "" : path;
-    }
-
-    public static String dotIfNullOrEmpty(String path) {
-        return (path == null || path.length() == 0) ? "." : path;
-    }
-
-    public static String emptyIfNull(String path) {
-        return path == null ? "" : path;
-    }
-
-    public static String nullIfEmpty(String path) {
-        return (path == null || path.length() == 0) ? null : path;
-    }
-
-    public static String enumToString(Enum versionType) {
-        if (versionType != null) {
-            return versionType.name();
-        }
-        return null;
-    }
-
-    /**
-     * Turns boolean to byte value (0, 1) for cross database compatibility.
-     *
-     * @param bool The boolean value
-     * @return 0 if boolean is false, 1 if true
-     */
-    protected byte booleanAsByte(boolean bool) {
-        return (byte) (bool ? 1 : 0);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/util/DbUtils.java b/storage/db/src/main/java/org/artifactory/storage/db/util/DbUtils.java
deleted file mode 100644
index 7ccafb1..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/util/DbUtils.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.util;
-
-import com.google.common.base.Charsets;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.storage.db.spring.ArtifactoryDataSource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.jdbc.datasource.DataSourceUtils;
-
-import javax.annotation.Nullable;
-import javax.sql.DataSource;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.sql.Connection;
-import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-
-/**
- * A utility class for common JDBC operations.
- *
- * @author Yossi Shaul
- */
-public abstract class DbUtils {
-    private static final Logger log = LoggerFactory.getLogger(DbUtils.class);
-    public static final String INSERT_INTO = "INSERT INTO ";
-    public static final String VALUES = " VALUES";
-
-    /**
-     * Closes the given resources. Exceptions are just logged.
-     *
-     * @param con  The {@link java.sql.Connection} to close
-     * @param stmt The {@link java.sql.Statement} to close
-     * @param rs   The {@link java.sql.ResultSet} to close
-     */
-    public static void close(@Nullable Connection con, @Nullable Statement stmt, @Nullable ResultSet rs) {
-        try {
-            close(rs);
-        } finally {
-            try {
-                close(stmt);
-            } finally {
-                close(con);
-            }
-        }
-    }
-
-    /**
-     * Closes the given resources. Exceptions are just logged.
-     *
-     * @param con  The {@link java.sql.Connection} to close
-     * @param stmt The {@link java.sql.Statement} to close
-     * @param rs   The {@link java.sql.ResultSet} to close
-     */
-    public static void close(@Nullable Connection con, @Nullable Statement stmt, @Nullable ResultSet rs,
-            @Nullable DataSource ds) {
-        try {
-            close(rs);
-        } finally {
-            try {
-                close(stmt);
-            } finally {
-                close(con, ds);
-            }
-        }
-    }
-
-    /**
-     * Closes the given connection and just logs any exception.
-     *
-     * @param con The {@link java.sql.Connection} to close.
-     */
-    public static void close(@Nullable Connection con) {
-        close(con, null);
-    }
-
-    /**
-     * Closes the given connection and just logs any exception.
-     *
-     * @param con The {@link java.sql.Connection} to close.
-     */
-    public static void close(@Nullable Connection con, @Nullable DataSource ds) {
-        if (con != null) {
-            try {
-                DataSourceUtils.doReleaseConnection(con, ds);
-            } catch (SQLException e) {
-                log.trace("Could not close JDBC connection", e);
-            } catch (Exception e) {
-                log.trace("Unexpected exception when closing JDBC connection", e);
-            }
-        }
-    }
-
-    /**
-     * Closes the given statement and just logs any exception.
-     *
-     * @param stmt The {@link java.sql.Statement} to close.
-     */
-    public static void close(@Nullable Statement stmt) {
-        if (stmt != null) {
-            try {
-                stmt.close();
-            } catch (SQLException e) {
-                log.trace("Could not close JDBC statement", e);
-            } catch (Exception e) {
-                log.trace("Unexpected exception when closing JDBC statement", e);
-            }
-        }
-    }
-
-    /**
-     * Closes the given result set and just logs any exception.
-     *
-     * @param rs The {@link java.sql.ResultSet} to close.
-     */
-    public static void close(@Nullable ResultSet rs) {
-        if (rs != null) {
-            try {
-                rs.close();
-            } catch (SQLException e) {
-                log.trace("Could not close JDBC result set", e);
-            } catch (Exception e) {
-                log.trace("Unexpected exception when closing JDBC result set", e);
-            }
-        }
-    }
-
-    public static void executeSqlStream(Connection con, InputStream in) throws IOException, SQLException {
-        BufferedReader reader = new BufferedReader(new InputStreamReader(in, Charsets.UTF_8));
-        Statement stmt = con.createStatement();
-        try {
-            StringBuilder sb = new StringBuilder();
-            String line;
-            while ((line = reader.readLine()) != null) {
-                if (StringUtils.isNotBlank(line) && !line.startsWith("--") && !line.startsWith("#")) {
-                    sb.append(line);
-                    if (line.endsWith(";")) {
-                        String query = sb.substring(0, sb.length() - 1);
-                        if (query.startsWith(INSERT_INTO)) {
-                            String databaseProductName = con.getMetaData().getDatabaseProductName();
-                            if ("Oracle".equals(databaseProductName)) {
-                                query = transformInsertIntoForOracle(query);
-                            }
-                        }
-                        log.debug("Executing query:\n{}", query);
-                        try {
-                            stmt.executeUpdate(query);
-                            if (!con.getAutoCommit()) {
-                                con.commit();
-                            }
-                        } catch (SQLException e) {
-                            log.error("Failed to execute query: {}:\n{}", e.getMessage(), query);
-                            throw e;
-                        }
-                        sb = new StringBuilder();
-                    } else {
-                        sb.append("\n");
-                    }
-                }
-            }
-        } finally {
-            IOUtils.closeQuietly(reader);
-            close(stmt);
-        }
-    }
-
-    private static String transformInsertIntoForOracle(String query) {
-        int values = query.indexOf(VALUES);
-        if (values == -1) {
-            throw new IllegalArgumentException("Query " + query + " does not the keyword " + VALUES);
-        }
-        String tableName = query.substring(INSERT_INTO.length(), values).trim();
-        log.info("Doing insert all in Oracle for table " + tableName);
-        StringBuilder sb = new StringBuilder("INSERT ALL ");
-        boolean inValue = false;
-        for (char c : query.toCharArray()) {
-            if (c == '(') {
-                inValue = true;
-                sb.append("INTO ").append(tableName).append(VALUES).append(" (");
-            } else if (c == ')') {
-                inValue = false;
-                sb.append(")\n");
-            } else if (inValue) {
-                sb.append(c);
-            }
-        }
-        sb.append("SELECT * FROM dual");
-        return sb.toString();
-    }
-
-    public static void closeDataSource(DataSource dataSource) {
-        if (dataSource == null) {
-            return;
-        }
-        if (dataSource instanceof ArtifactoryDataSource) {
-            try {
-                ((ArtifactoryDataSource) dataSource).close();
-            } catch (Exception e) {
-                String msg = "Error closing the data source " + dataSource + " due to:" + e.getMessage();
-                if (log.isDebugEnabled()) {
-                    log.error(msg, e);
-                } else {
-                    log.error(msg);
-                }
-            }
-        }
-    }
-
-    public static boolean tableExists(DatabaseMetaData metaData, String tableName) throws SQLException {
-        boolean schemaExists;
-        if (metaData.storesLowerCaseIdentifiers()) {
-            tableName = tableName.toLowerCase();
-        } else if (metaData.storesUpperCaseIdentifiers()) {
-            tableName = tableName.toUpperCase();
-        }
-        try (ResultSet rs = metaData.getTables(null, null, tableName, new String[]{"TABLE"})) {
-            schemaExists = rs.next();
-        }
-        return schemaExists;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/util/IdGenerator.java b/storage/db/src/main/java/org/artifactory/storage/db/util/IdGenerator.java
deleted file mode 100644
index f7c2572..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/util/IdGenerator.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.util;
-
-import org.artifactory.common.ConstantValues;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.transaction.annotation.Transactional;
-
-import javax.sql.DataSource;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-
-/**
- * Date: 12/3/13 3:03 PM
- *
- * @author freds
- */
-public abstract class IdGenerator {
-    private static final Logger log = LoggerFactory.getLogger(IdGenerator.class);
-
-    public static final String INDEX_TYPE_GENERAL = "general";
-    public static final long NO_ID = 0;
-
-    public static long step() {
-        return ConstantValues.dbIdGeneratorFetchAmount.getLong();
-    }
-
-    @Autowired
-    @Qualifier("uniqueIdsDataSource")
-    protected DataSource uniqueIdsDataSource;
-
-    @Autowired
-    private JdbcHelper jdbcHelper;
-
-    @Transactional
-    public void initializeIdGenerator() throws SQLException {
-        if (step() <= 0) {
-            throw new IllegalArgumentException("IdGenerator STEP must be positive");
-        }
-
-        ResultSet rs = null;
-        try {
-            rs = jdbcHelper.executeSelect("SELECT current_id FROM unique_ids WHERE index_type = ?", INDEX_TYPE_GENERAL);
-            if (!rs.next()) {
-                int rows = jdbcHelper.executeUpdate("INSERT INTO unique_ids VALUES (?, ?)", INDEX_TYPE_GENERAL, NO_ID);
-                if (rows == 1) {
-                    log.debug("Created current unique id for the first time");
-                }
-                initializeIndex(NO_ID);
-            } else {
-                initializeIndex(rs.getLong(1));
-            }
-        } catch (Exception e) {
-            throw new SQLException("Could not select current index.", e);
-        } finally {
-            DbUtils.close(rs);
-        }
-    }
-
-    protected abstract void initializeIndex(long currentValue);
-
-    public abstract long nextId();
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/util/JdbcHelper.java b/storage/db/src/main/java/org/artifactory/storage/db/util/JdbcHelper.java
deleted file mode 100644
index f9bd4f5..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/util/JdbcHelper.java
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.util;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.db.util.blob.BlobWrapper;
-import org.artifactory.util.PerfTimer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.jdbc.datasource.DataSourceUtils;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Nonnull;
-import javax.sql.DataSource;
-import java.sql.*;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * A helper class to execute jdbc queries.
- *
- * @author Yossi Shaul
- */
- at Service
-public class JdbcHelper {
-    private static final Logger log = LoggerFactory.getLogger(JdbcHelper.class);
-
-    private final DataSource dataSource;
-    private final AtomicLong selectQueriesCounter = new AtomicLong();
-    private final AtomicLong updateQueriesCounter = new AtomicLong();
-
-    @Autowired
-    public JdbcHelper(@Qualifier("dataSource") DataSource dataSource) {
-        this.dataSource = dataSource;
-    }
-
-    /**
-     * @return A transaction aware connection
-     */
-    private Connection getConnection() throws SQLException {
-        Connection connection = DataSourceUtils.doGetConnection(dataSource);
-        if (Connection.TRANSACTION_READ_COMMITTED != connection.getTransactionIsolation()) {
-            connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
-        }
-        return connection;
-    }
-
-    public DataSource getDataSource() {
-        return dataSource;
-    }
-
-    @Nonnull
-    public ResultSet
-
-    executeSelect(String query, Object... params) throws SQLException {
-        return executeSelect(query, false, params);
-    }
-
-    @Nonnull
-    public ResultSet executeSelect(String query, boolean allowDirtyReads, Object... params) throws SQLException {
-        selectQueriesCounter.incrementAndGet();
-        debugSql(query, params);
-
-        PerfTimer timer = null;
-        if (log.isDebugEnabled()) {
-            timer = new PerfTimer();
-        }
-        Connection con = null;
-        Statement stmt = null;
-        ResultSet rs = null;
-        try {
-            con = getConnection();
-            // allow dirty reads in case of non transactional aql query
-            //@Todo need to a fine better (elegant) way to force this
-            TxHelper.allowDirtyReads(allowDirtyReads, con);
-            if (params == null || params.length == 0) {
-                stmt = con.createStatement();
-                rs = stmt.executeQuery(query);
-            } else {
-                PreparedStatement pstmt = con.prepareStatement(parseInListQuery(query, params));
-                stmt = pstmt;
-                setParamsToStmt(pstmt, params);
-                rs = pstmt.executeQuery();
-            }
-            if (!TxHelper.isInTransaction() && !con.getAutoCommit()) {
-                con.commit();
-            }
-            if (timer != null && log.isDebugEnabled()) {
-                timer.stop();
-                log.debug("Query returned in {} : '{}'", timer, resolveQuery(query, params));
-            }
-            return ResultSetWrapper.newInstance(con, stmt, rs, dataSource);
-        } catch (Exception e) {
-            // update isolation level back to read committed
-            updateConnectionIsolationLevelToReadCommitted(allowDirtyReads, con);
-            DbUtils.close(con, stmt, rs, dataSource);
-            if (e instanceof SQLException) {
-                throw (SQLException) e;
-            } else {
-                throw new SQLException("Unexpected exception: " + e.getMessage(), e);
-            }
-        }
-    }
-
-    /**
-     * return coneection isolation level back to read committed
-     *
-     * @param allowDirtyReads
-     * @param con             sql connection
-     * @throws SQLException
-     */
-    private void updateConnectionIsolationLevelToReadCommitted(boolean allowDirtyReads,
-            Connection con) throws SQLException {
-        if (allowDirtyReads && con != null) {
-            con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
-        }
-    }
-
-    public int executeUpdate(String query, Object... params) throws SQLException {
-        updateQueriesCounter.incrementAndGet();
-        debugSql(query, params);
-
-        PerfTimer timer = null;
-        if (log.isDebugEnabled()) {
-            timer = new PerfTimer();
-        }
-        Connection con = null;
-        Statement stmt = null;
-        int results;
-        try {
-            con = getConnection();
-            if (params == null || params.length == 0) {
-                stmt = con.createStatement();
-                results = stmt.executeUpdate(query);
-            } else {
-                PreparedStatement pstmt = con.prepareStatement(parseInListQuery(query, params));
-                stmt = pstmt;
-                setParamsToStmt(pstmt, params);
-                results = pstmt.executeUpdate();
-            }
-            if (timer != null && log.isDebugEnabled()) {
-                timer.stop();
-                log.debug("Query returned with {} results in {} : '{}'",
-                        results, timer, resolveQuery(query, params));
-            }
-            return results;
-        } finally {
-            DbUtils.close(con, stmt, null, dataSource);
-        }
-    }
-
-    public int executeSelectCount(String query, Object... params) throws SQLException {
-        try (ResultSet resultSet = executeSelect(query, params)) {
-            int count = 0;
-            if (resultSet.next()) {
-                count = resultSet.getInt(1);
-            }
-            return count;
-        }
-    }
-
-    /**
-     * Helper method to select long value. This method expects long value returned as the first column.
-     * It ignores multiple results.
-     *
-     * @param query  The select query to execute
-     * @param params The query parameters
-     * @return Long value if a result was found or {@link org.artifactory.storage.db.DbService#NO_DB_ID} if not found
-     */
-    public long executeSelectLong(String query, Object... params) throws SQLException {
-        try (ResultSet resultSet = executeSelect(query, params)) {
-            long result = DbService.NO_DB_ID;
-            if (resultSet.next()) {
-                result = resultSet.getLong(1);
-            }
-            return result;
-        }
-    }
-
-    private String parseInListQuery(String sql, Object... params) {
-        int idx = sql.indexOf("(#)");
-        if (idx != -1) {
-            List<Integer> iterableSizes = new ArrayList<>(1);
-            for (Object param : params) {
-                if (param instanceof Collection) {
-                    int size = ((Collection) param).size();
-                    if (size > 0) {
-                        iterableSizes.add(size);
-                    }
-                }
-            }
-            if (iterableSizes.isEmpty()) {
-                throw new IllegalArgumentException("Could not find collection in parameters needed for query " + sql);
-            }
-
-            StringBuilder builder = new StringBuilder(sql.substring(0, idx + 1));
-            for (int i = 0; i < iterableSizes.get(0); i++) {
-                if (i != 0) {
-                    builder.append(',');
-                }
-                builder.append('?');
-            }
-            builder.append(sql.substring(idx + 2));
-            return builder.toString();
-        }
-        return sql;
-    }
-
-    private void setParamsToStmt(PreparedStatement pstmt, Object[] params) throws SQLException {
-        int i = 1;
-        for (Object param : params) {
-            if (param instanceof Iterable) {
-                for (Object p : (Iterable) param) {
-                    pstmt.setObject(i++, p);
-                }
-            } else if (param instanceof BlobWrapper) {
-                BlobWrapper blobWrapper = (BlobWrapper) param;
-                if (blobWrapper.getLength() < 0) {
-                    pstmt.setBinaryStream(i++, blobWrapper.getInputStream());
-                } else {
-                    pstmt.setBinaryStream(i++, blobWrapper.getInputStream(), blobWrapper.getLength());
-                }
-            } else {
-                pstmt.setObject(i++, param);
-            }
-        }
-    }
-
-    private static void debugSql(String sql, Object[] params) {
-        if (log.isDebugEnabled()) {
-            String resolved = resolveQuery(sql, params);
-            log.debug("Executing SQL: '" + resolved + "'.");
-        }
-    }
-
-    public static String resolveQuery(String sql, Object[] params) {
-        int expectedParamsCount = StringUtils.countMatches(sql, "?");
-        int paramsLength = params == null ? 0 : params.length;
-        if (expectedParamsCount != paramsLength) {
-            log.warn("Unexpected parameters count. Expected {} but got {}", expectedParamsCount, paramsLength);
-        }
-
-        if (params == null || params.length == 0) {
-            return sql;
-        } else if (expectedParamsCount == paramsLength) {
-            // replace placeholders in the query with matching parameter values
-            // this method doesn't attempt to escape characters
-            Object[] printParams = new Object[params.length];
-            for (int i = 0; i < params.length; i++) {
-                Object current = params[i];
-                if (current == null) {
-                    current = "NULL";
-                } else if (current instanceof String) {
-                    current = "'" + params[i] + "'";
-                } else if (current instanceof BlobWrapper) {
-                    current = "BLOB(length: " + ((BlobWrapper) params[i]).getLength() + ")";
-                }
-                printParams[i] = current;
-            }
-            sql = sql.replaceAll("\\?", "%s");
-            sql = String.format(sql, printParams);
-        } else {    // params not null but there's a difference between actual and expected
-            StringBuilder builder = new StringBuilder();
-            builder.append("Executing SQL: '").append(sql).append("'");
-            if (params.length > 0) {
-                builder.append(" with params: ");
-                for (int i = 0; i < params.length; i++) {
-                    builder.append("'");
-                    builder.append(params[i]);
-                    builder.append("'");
-                    if (i < params.length - 1) {
-                        builder.append(", ");
-                    }
-                }
-            }
-            sql = builder.toString();
-        }
-        return sql;
-    }
-
-    public void destroy() {
-        DbUtils.closeDataSource(dataSource);
-    }
-
-    public long getSelectQueriesCount() {
-        return selectQueriesCounter.get();
-    }
-
-    public long getUpdateQueriesCount() {
-        return updateQueriesCounter.get();
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/util/ResultSetWrapper.java b/storage/db/src/main/java/org/artifactory/storage/db/util/ResultSetWrapper.java
deleted file mode 100644
index 0003053..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/util/ResultSetWrapper.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.artifactory.storage.db.util;
-
-import javax.sql.DataSource;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.Statement;
-
-/**
- * A dynamic proxy to wrap {@link java.sql.ResultSet}. Its purpose is to close associated connection and statement
- * whenever it is closed (this is a valid behaviour assuming pooling is performed).
- * <p/>
- * A simple delegator will also do the work but it's a bit too long.
- */
-public final class ResultSetWrapper implements InvocationHandler {
-
-    private final DataSource ds;
-    private final Connection con;
-    private final Statement stmt;
-    private final ResultSet rs;
-
-    /**
-     * Creates a new {@link org.artifactory.storage.db.util.ResultSetWrapper} with the associated connection and
-     * statement.
-     *
-     * @param con  The associated {@link java.sql.Connection}
-     * @param stmt The associated {@link java.sql.Statement}
-     * @param rs   The {@link java.sql.ResultSet} to wrap
-     * @param ds   The data source of the connection (transactional aware)
-     * @return Proxy to the result set
-     */
-    public static ResultSet newInstance(Connection con, Statement stmt, ResultSet rs, DataSource ds) {
-        ResultSetWrapper proxy = new ResultSetWrapper(con, stmt, rs, ds);
-        return (ResultSet) Proxy.newProxyInstance(rs.getClass().getClassLoader(),
-                new Class<?>[]{ResultSet.class}, proxy);
-    }
-
-    private ResultSetWrapper(Connection con, Statement stmt, ResultSet rs, DataSource ds) {
-        this.con = con;
-        this.stmt = stmt;
-        this.rs = rs;
-        this.ds = ds;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
-        if ("close".equals(method.getName())) {
-            DbUtils.close(con, stmt, rs, ds);
-            return null;
-        } else {
-            return method.invoke(rs, args);
-        }
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/util/SimpleIdGenerator.java b/storage/db/src/main/java/org/artifactory/storage/db/util/SimpleIdGenerator.java
deleted file mode 100644
index 9f07855..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/util/SimpleIdGenerator.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.util;
-
-import org.artifactory.storage.StorageException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.PreDestroy;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * @author mamo
- */
- at Service
-public class SimpleIdGenerator extends IdGenerator {
-    private static final Logger log = LoggerFactory.getLogger(SimpleIdGenerator.class);
-
-    protected final Object indexMonitor = new Object();
-    protected final AtomicLong currentIndex = new AtomicLong(NO_ID);
-    protected volatile long maxReservedIndex = NO_ID;
-
-    @Override
-    protected void initializeIndex(long currentValue) {
-        maxReservedIndex = currentValue;
-        if (currentValue != NO_ID) {
-            currentValue++;
-        }
-        currentIndex.set(currentValue);
-        log.debug("Initialized current index to " + currentIndex.get());
-    }
-
-    @Override
-    public long nextId() {
-        long value = currentIndex.getAndIncrement();
-        if (isNotInRange(value)) {
-            synchronized (indexMonitor) {
-                value = getGoodValue(value);
-            }
-        }
-        return value;
-    }
-
-    private long getGoodValue(long value) {
-        if (isNotInRange(value)) {
-            simpleUpdateIndex();
-            if (value == NO_ID) {
-                value = currentIndex.getAndIncrement();
-            }
-        }
-        return value;
-    }
-
-    private boolean isNotInRange(long value) {
-        return value > maxReservedIndex || value == NO_ID;
-    }
-
-    private void simpleUpdateIndex() {
-        Connection con = null;
-        PreparedStatement stmt = null;
-        try {
-            log.trace("Starting updating index with current value={}", maxReservedIndex);
-            con = uniqueIdsDataSource.getConnection();
-            stmt = con.prepareStatement("UPDATE unique_ids SET current_id = ? where index_type = ?");
-            try {
-                long nextMaxCurrentIndex = maxReservedIndex + step();
-                stmt.setLong(1, nextMaxCurrentIndex);
-                stmt.setString(2, INDEX_TYPE_GENERAL);
-                log.trace("Executing update index with value={}", nextMaxCurrentIndex);
-                int rows = stmt.executeUpdate();
-                if (rows == 1) {
-                    maxReservedIndex = nextMaxCurrentIndex;
-                    log.trace("Updated index with value={}", maxReservedIndex);
-                } else {
-                    throw new StorageException(
-                            "Failed to update the unique indices table " + INDEX_TYPE_GENERAL + " does not exists!");
-                }
-            } catch (SQLException e) {
-                throw new StorageException("Failed to update the unique indices table", e);
-            }
-        } catch (SQLException e) {
-            throw new StorageException("Failed to update the unique indices table", e);
-        } finally {
-            DbUtils.close(con, stmt, null, uniqueIdsDataSource);
-        }
-    }
-
-    @PreDestroy
-    private void destroy() {
-        DbUtils.closeDataSource(uniqueIdsDataSource);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/util/TxHelper.java b/storage/db/src/main/java/org/artifactory/storage/db/util/TxHelper.java
deleted file mode 100644
index 61e1ce1..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/util/TxHelper.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.artifactory.storage.db.util;
-
-import org.springframework.transaction.support.TransactionSynchronizationManager;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-
-/**
- * @author Chen Keinan
- */
-public class TxHelper {
-
-
-    /**
-     * check if thread in mid of spring transactional
-     *
-     * @return if true - it in spring transactional
-     */
-    public static boolean isInTransaction() {
-        return TransactionSynchronizationManager.isSynchronizationActive();
-    }
-
-    /**
-     * set isolation level to read uncommitted in case of aql queries
-     *
-     * @param allowDirtyReads - if true set isolation level to  read uncommitted
-     * @param con             - sql connection
-     * @throws SQLException
-     */
-    public static void allowDirtyReads(boolean allowDirtyReads, Connection con) throws SQLException {
-        if (allowDirtyReads && con != null) {
-            con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
-        }
-    }
-
-    /**
-     * set isolation level to read committed in case of aql queries completed
-     *
-     * @param allowDirtyReads - if true set isolation level to  read committed
-     * @param con             - sql connection
-     * @throws SQLException
-     */
-    public static void disableDirtyReads(boolean allowDirtyReads, Connection con) throws SQLException {
-        if (allowDirtyReads && con != null) {
-            con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
-        }
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/util/blob/BlobWrapper.java b/storage/db/src/main/java/org/artifactory/storage/db/util/blob/BlobWrapper.java
deleted file mode 100644
index 8e80d27..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/util/blob/BlobWrapper.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.util.blob;
-
-import org.artifactory.util.StringInputStream;
-
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-
-/**
- * A wrapper around an input stream with the expected stream length.
- *
- * @author Yossi Shaul
- */
-public class BlobWrapper {
-    public static final int LENGTH_UNKNOWN = -1;
-
-    private final InputStream in;
-    private final long length;
-
-    /**
-     * Builds a wrapper around an input stream with unknown length.
-     * This constructor is protected to prevent accidental creation when using PostgreSQL.
-     *
-     * @param in The input stream to wrap
-     * @see
-     */
-    BlobWrapper(InputStream in) {
-        this(in, LENGTH_UNKNOWN);
-    }
-
-    /**
-     * Builds a wrapper around an input stream with known length
-     *
-     * @param in     The input stream to wrap
-     * @param length The length of the wrapped input stream (in bytes)
-     */
-    public BlobWrapper(InputStream in, long length) {
-        if (in == null) {
-            throw new NullPointerException("Input stream cannot be null");
-        }
-        this.in = in;
-        this.length = length;
-    }
-
-    /**
-     * Build a wrapper around a string. The string is expected to be UTF-8 encoded.
-     *
-     * @param data The data to use as the input stream
-     */
-    public BlobWrapper(String data) {
-        if (data == null) {
-            throw new NullPointerException("Data cannot be null");
-        }
-        StringInputStream sis;
-        try {
-            sis = new StringInputStream(data);
-        } catch (UnsupportedEncodingException e) {
-            throw new RuntimeException(e);
-        }
-        this.in = sis;
-        this.length = sis.getLength();
-    }
-
-    /**
-     * @return The wrapped input stream
-     */
-    public InputStream getInputStream() {
-        return in;
-    }
-
-    /**
-     * @return The length (in bytes) of the wrapped input stream or {@link BlobWrapper#LENGTH_UNKNOWN} if the size is
-     *         not known.
-     */
-    public long getLength() {
-        return length;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/util/blob/BlobWrapperFactory.java b/storage/db/src/main/java/org/artifactory/storage/db/util/blob/BlobWrapperFactory.java
deleted file mode 100644
index b166691..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/util/blob/BlobWrapperFactory.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.util.blob;
-
-import org.artifactory.storage.StorageProperties;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.io.InputStream;
-
-/**
- * A factory for building {@link BlobWrapper} matching the configured database.
- *
- * @author Yossi Shaul
- */
- at Component
-public class BlobWrapperFactory {
-
-    @Autowired
-    private StorageProperties storageProps;
-
-    /**
-     * @param in     The input stream to wrap
-     * @param length The length of the input stream (in bytes)
-     * @return A blob wrapper around an input stream with known length
-     */
-    public BlobWrapper create(InputStream in, long length) {
-        return new BlobWrapper(in, length);
-    }
-
-    /**
-     * @param data The data to use as the blob input stream
-     * @return A blob wrapper around a string
-     */
-    public BlobWrapper create(String data) {
-        return new BlobWrapper(data);
-    }
-
-    /**
-     * Creates a blob wrapper with unknown length.
-     * This factory method will create a wrapper that fits the currently configured database.
-     *
-     * @param in The input stream to wrap
-     * @return A blob wrapper
-     */
-    public BlobWrapper create(InputStream in) {
-        if (!storageProps.isPostgres()) {
-            return new BlobWrapper(in);
-        } else {
-            return new PostgresBlobWrapper(in);
-        }
-    }
-
-    /**
-     * @param jsonObject The object to serialize and offer as an input stream to the blob wrapper
-     * @return A blob wrapper around json object
-     */
-    public BlobWrapper createJsonObjectWrapper(Object jsonObject) {
-        JsonBlobWrapper jsonBlobWrapper = new JsonBlobWrapper(jsonObject);
-        if (!storageProps.isPostgres()) {
-            return jsonBlobWrapper;
-        } else {
-            return new PostgresBlobWrapper(jsonBlobWrapper.getInputStream());
-        }
-    }
-
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/util/blob/JsonBlobWrapper.java b/storage/db/src/main/java/org/artifactory/storage/db/util/blob/JsonBlobWrapper.java
deleted file mode 100644
index 7d24acd..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/util/blob/JsonBlobWrapper.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.util.blob;
-
-import org.artifactory.api.jackson.JacksonFactory;
-import org.codehaus.jackson.JsonGenerator;
-import org.iostreams.streams.in.OutputToInputStream;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-/**
- * A blob wrapper that lazily creates an input stream out of an Object using JSON serialization.
- *
- * @author freds
- */
-public class JsonBlobWrapper extends BlobWrapper {
-    JsonBlobWrapper(final Object jsonObject) {
-        // TODO: Make sure the Global Artifactory executor is used
-        super(new OutputToInputStream() {
-            @Override
-            protected void write(OutputStream outputStream) throws IOException {
-                JsonGenerator jsonGenerator = JacksonFactory.createJsonGenerator(outputStream);
-                jsonGenerator.writeObject(jsonObject);
-            }
-        });
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/util/blob/PostgresBlobWrapper.java b/storage/db/src/main/java/org/artifactory/storage/db/util/blob/PostgresBlobWrapper.java
deleted file mode 100644
index cc2561f..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/util/blob/PostgresBlobWrapper.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.util.blob;
-
-import org.apache.commons.io.FileUtils;
-import org.iostreams.streams.in.DeleteOnCloseFileInputStream;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * A Blob wrapper that always has the length of the wrapped input stream.
- * This is a requirement of the current PostgreSQL driver which requires the length of inserted blobs.
- *
- * @author Yossi Shaul
- */
-public class PostgresBlobWrapper extends BlobWrapper {
-
-    private long length = LENGTH_UNKNOWN;
-    private FileInputStream fileInputStream;
-
-    public PostgresBlobWrapper(InputStream in) {
-        super(in);
-    }
-
-    /**
-     * @return The length of the wrapped input stream. Never {@link BlobWrapper#LENGTH_UNKNOWN}.
-     */
-    @Override
-    public long getLength() {
-        if (length == LENGTH_UNKNOWN) {
-            // lazily create a temp file and save the length the the file input stream
-            createTempFileInputStream();
-        }
-        return length;
-    }
-
-    /**
-     * @return The input stream read from a temp file.
-     */
-    @Override
-    public InputStream getInputStream() {
-        if (length == LENGTH_UNKNOWN) {
-            // lazily create a temp file and save the length the the file input stream
-            createTempFileInputStream();
-        }
-        return fileInputStream;
-    }
-
-    private void createTempFileInputStream() {
-        try {
-            File tempFile = File.createTempFile("dbRecord", null, null);
-            tempFile.deleteOnExit();
-            FileUtils.copyInputStreamToFile(super.getInputStream(), tempFile);
-            length = tempFile.length();
-            fileInputStream = new DeleteOnCloseFileInputStream(tempFile);
-        } catch (IOException e) {
-            throw new RuntimeException("Couldn't create temp file", e);
-        }
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/util/querybuilder/BaseQueryBuilder.java b/storage/db/src/main/java/org/artifactory/storage/db/util/querybuilder/BaseQueryBuilder.java
deleted file mode 100644
index 1658c63..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/util/querybuilder/BaseQueryBuilder.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package org.artifactory.storage.db.util.querybuilder;
-
-import static org.apache.commons.lang.StringUtils.isBlank;
-
-/**
- * @author Chen Keinan
- */
-public abstract class BaseQueryBuilder implements IQueryBuilder {
-    public abstract String uniqueBuild(String baseQuery, String sortBy, long offSet, long limit);
-
-    public String build(String distinct, String fields, String tables, String conditions, String orderBy, String groupBy, Long offSet, Long limit) {
-        StringBuilder builder = new StringBuilder();
-        // Start select section
-        builder.append("select ");
-        // set distinct
-        if (!isBlank(distinct)) {
-            builder.append("distinct ");
-        }
-        // Start append the fields section
-        if (isBlank(fields)) {
-            builder.append("* ");
-        } else {
-            builder.append(fields);
-        }
-        // Set from section
-        builder.append("from ");
-        if (isBlank(tables)) {
-            throw new RuntimeException("Failed to build sql query. Reason: missing tables for the from section");
-        } else {
-            builder.append(tables);
-        }
-        // Set condition section
-        if (!isBlank(conditions)) {
-            builder.append("where ");
-            builder.append(conditions);
-        }
-        // Set order section
-        if (shouldAddOrderBy(offSet, limit) && !isBlank(orderBy)) {
-            builder.append("order by ");
-            builder.append(orderBy);
-        }
-        // Set group by section
-        if (!isBlank(groupBy)) {
-            builder.append("group by ");
-            builder.append(groupBy);
-        }
-        String result;
-        // handle special pagination behavior
-        if (isPagination(offSet, limit)) {
-            // Need special db type behaviour
-            if (offSet == null) {
-                offSet = 0l;
-            }
-            if (limit == null) {
-                limit = Long.MAX_VALUE;
-            }
-            result = uniqueBuild(builder.toString(), orderBy, offSet, limit);
-        } else {
-            result = builder.toString();
-        }
-        return result;
-    }
-
-    public abstract boolean shouldAddOrderBy(Long offSet, Long limit);
-
-    public boolean isPagination(Long offSet, Long limit) {
-        return offSet != null && offSet > 0 || limit != null && limit < Long.MAX_VALUE;
-    }
-}
-
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/util/querybuilder/DerbyQueryBuilder.java b/storage/db/src/main/java/org/artifactory/storage/db/util/querybuilder/DerbyQueryBuilder.java
deleted file mode 100644
index 1a93f17..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/util/querybuilder/DerbyQueryBuilder.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.artifactory.storage.db.util.querybuilder;
-
-/**
- * @author Chen Keinan
- */
-public class DerbyQueryBuilder extends BaseQueryBuilder {
-
-    @Override
-    public String uniqueBuild(String baseQuery, String sortBy, long offSet, long limit) {
-        StringBuilder builder = new StringBuilder(baseQuery);
-        if (offSet > 0) {
-            builder.append("offset ").append(offSet).append(" rows ");
-        }
-        if (limit < Long.MAX_VALUE) {
-            builder.append("fetch first ").append(limit).append(" rows only ");
-        }
-        return builder.toString();
-    }
-
-    @Override
-    public boolean shouldAddOrderBy(Long offSet, Long limit) {
-        return true;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/util/querybuilder/IQueryBuilder.java b/storage/db/src/main/java/org/artifactory/storage/db/util/querybuilder/IQueryBuilder.java
deleted file mode 100644
index 2b3f02e..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/util/querybuilder/IQueryBuilder.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.artifactory.storage.db.util.querybuilder;
-
-/**
- * @author Chen Keinan
- */
-public interface IQueryBuilder {
-    public abstract String uniqueBuild(String baseQuery, String fields, long offSet, long limit);
-
-    public abstract boolean shouldAddOrderBy(Long offSet, Long limit);
-
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/util/querybuilder/MysqlQueryBuilder.java b/storage/db/src/main/java/org/artifactory/storage/db/util/querybuilder/MysqlQueryBuilder.java
deleted file mode 100644
index f695a4d..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/util/querybuilder/MysqlQueryBuilder.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.artifactory.storage.db.util.querybuilder;
-
-/**
- * @author Chen Keinan
- */
-public class MysqlQueryBuilder extends BaseQueryBuilder {
-
-    @Override
-    public String uniqueBuild(String baseQuery, String sortBy, long offSet, long limit) {
-        if (offSet > 0) {
-            return baseQuery + "limit " + offSet + "," + limit + " ";
-        }
-        if (limit < Long.MAX_VALUE) {
-            return baseQuery + "limit " + limit + " ";
-        }
-        return baseQuery;
-    }
-
-    @Override
-    public boolean shouldAddOrderBy(Long offSet, Long limit) {
-        return true;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/util/querybuilder/OracleQueryBuilder.java b/storage/db/src/main/java/org/artifactory/storage/db/util/querybuilder/OracleQueryBuilder.java
deleted file mode 100644
index 8dbf335..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/util/querybuilder/OracleQueryBuilder.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.artifactory.storage.db.util.querybuilder;
-
-/**
- * @author Chen Keinan
- */
-public class OracleQueryBuilder extends BaseQueryBuilder {
-
-    @Override
-    public String uniqueBuild(String baseQuery, String sortBy, long offSet, long limit) {
-        long maxToFetch = Math.max(Long.MAX_VALUE,limit + offSet);
-        StringBuilder builder;
-        builder = new StringBuilder();
-        builder.append("select * from( ");
-        builder.append("select rownum rnum, inner_query.* from ( ").append(baseQuery).append(") inner_query ");
-        builder.append("where ROWNUM <= ").append(maxToFetch).append(")");
-        builder.append("where rnum > ").append(offSet).append(" ");
-        return builder.toString();
-    }
-
-    @Override
-    public boolean shouldAddOrderBy(Long offSet, Long limit) {
-        return true;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/util/querybuilder/PostgresqlQueryBuilder.java b/storage/db/src/main/java/org/artifactory/storage/db/util/querybuilder/PostgresqlQueryBuilder.java
deleted file mode 100644
index 3178289..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/util/querybuilder/PostgresqlQueryBuilder.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.storage.db.util.querybuilder;
-
-
-/**
- * @author Chen Keinan
- */
-public class PostgresqlQueryBuilder extends BaseQueryBuilder {
-
-    @Override
-    public String uniqueBuild(String baseQuery, String sortBy, long offSet, long limit) {
-        StringBuilder builder = new StringBuilder(baseQuery);
-        if (offSet > 0) {
-            builder.append("offset  ").append(offSet).append(" ");
-        }
-        if (limit < Long.MAX_VALUE) {
-            builder.append("limit  ").append(limit).append(" ");
-        }
-        return builder.toString();
-    }
-
-    @Override
-    public boolean shouldAddOrderBy(Long offSet, Long limit) {
-        return true;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/util/querybuilder/QueryWriter.java b/storage/db/src/main/java/org/artifactory/storage/db/util/querybuilder/QueryWriter.java
deleted file mode 100644
index 4ec8bba..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/util/querybuilder/QueryWriter.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package org.artifactory.storage.db.util.querybuilder;
-
-import org.artifactory.api.context.ContextHelper;
-
-/**
- * @author Chen Keinan
- */
-public class QueryWriter {
-
-    BaseQueryBuilder queryBuilder;
-    private String distinct;
-    private String fields;
-    private String tables;
-    private String conditions;
-    private String groupBy;
-    private String orderBy;
-    private Long offSet;
-    private Long limit;
-    public QueryWriter() {
-        queryBuilder = (BaseQueryBuilder) ContextHelper.get().beanForType(IQueryBuilder.class);
-    }
-
-    public QueryWriter distinct() {
-        this.distinct = "distinct ";
-        return this;
-    }
-
-    public QueryWriter select() {
-        this.fields = " * ";
-        return this;
-    }
-
-    public QueryWriter select(String fields) {
-        this.fields = fields;
-        return this;
-    }
-
-    public QueryWriter from(String tables) {
-        this.tables = tables;
-        return this;
-    }
-
-    public QueryWriter groupBy(String groupBy) {
-        this.groupBy = groupBy;
-        return this;
-    }
-
-    public QueryWriter where(String condition) {
-        this.conditions = condition;
-        return this;
-    }
-
-    public QueryWriter orderBy(String orderBy) {
-        this.orderBy = orderBy;
-        return this;
-    }
-
-    public QueryWriter offset(Long offset) {
-        offSet = offset;
-        return this;
-    }
-
-    public QueryWriter limit(Long limit) {
-        this.limit = limit;
-        return this;
-    }
-
-    public String build() {
-        return queryBuilder.build(distinct, fields, tables, conditions, orderBy, groupBy, offSet, limit);
-    }
-
-    public void clear() {
-        distinct = null;
-        fields = null;
-        tables = null;
-        conditions = null;
-        groupBy = null;
-        orderBy = null;
-        offSet = null;
-        limit = null;
-    }
-
-    public void useExistingQuery(String baseQuery) {
-
-    }
-}
-
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/util/querybuilder/SqlServerQueryBuilder.java b/storage/db/src/main/java/org/artifactory/storage/db/util/querybuilder/SqlServerQueryBuilder.java
deleted file mode 100644
index 46b3d8b..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/util/querybuilder/SqlServerQueryBuilder.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.artifactory.storage.db.util.querybuilder;
-
-import org.apache.commons.lang.StringUtils;
-
-/**
- * @author Chen Keinan
- */
-public class SqlServerQueryBuilder extends BaseQueryBuilder {
-
-    public String uniqueBuild(String baseQuery, String sortBy, long offSet, long limit) {
-        StringBuilder builder;
-        offSet += 1;
-        long lng = Long.max(limit + offSet, Long.MAX_VALUE);
-        builder = new StringBuilder();
-        builder.append("Select bb.* from (");
-        builder.append("Select aa.* ");
-        String extraRowNumberField = " ,ROW_NUMBER() ";
-        if (StringUtils.isBlank(sortBy)) {
-            extraRowNumberField = extraRowNumberField + "OVER ( order by (SELECT 1)) AS RN ";
-        } else {
-            String[] split = StringUtils.split(sortBy, ",");
-            String newSortBy = "";
-            for (int i = 0; i < split.length; i++) {
-                String s = split[i];
-                newSortBy += "aa." + s.substring(s.indexOf('.') + 1) + ",";
-            }
-            newSortBy = newSortBy.substring(0, newSortBy.length() - 1);
-            extraRowNumberField = extraRowNumberField + "OVER ( order by " + newSortBy + " ) AS RN ";
-        }
-        builder.append(extraRowNumberField);
-        builder.append(" from ( ");
-        builder.append(baseQuery).append(" ) aa");
-        builder.append(" ) bb");
-        builder.append(" Where bb.RN >= ").append(offSet);
-        builder.append(" AND bb.RN < ").append(lng);
-        builder.append(" ");
-        return builder.toString();
-    }
-
-    @Override
-    public boolean shouldAddOrderBy(Long offSet, Long limit) {
-        return !isPagination(offSet, limit);
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/version/ArtifactoryDBVersion.java b/storage/db/src/main/java/org/artifactory/storage/db/version/ArtifactoryDBVersion.java
deleted file mode 100644
index bf83052..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/version/ArtifactoryDBVersion.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.artifactory.storage.db.version;
-
-import com.google.common.collect.Lists;
-import org.artifactory.storage.db.DbType;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.artifactory.storage.db.version.converter.DBConverter;
-import org.artifactory.storage.db.version.converter.DBSqlConverter;
-import org.artifactory.version.ArtifactoryVersion;
-import org.artifactory.version.VersionComparator;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- * Artifactory DB version
- */
-public enum ArtifactoryDBVersion {
-    v100(ArtifactoryVersion.v300, ArtifactoryVersion.v304),
-    v101(ArtifactoryVersion.v310, ArtifactoryVersion.v310, new DBSqlConverter("v310")),
-    v102(ArtifactoryVersion.v311, ArtifactoryVersion.v402, new DBSqlConverter("v311")),
-    v103(ArtifactoryVersion.v410, ArtifactoryVersion.v412, new DBSqlConverter("v410")),
-    v104(ArtifactoryVersion.v420, ArtifactoryVersion.v431, new DBSqlConverter("v420")),
-    v106(ArtifactoryVersion.v432, ArtifactoryVersion.v433),
-    v107(ArtifactoryVersion.v440, ArtifactoryVersion.v440, new DBSqlConverter("v440")),
-    v108(ArtifactoryVersion.v441, ArtifactoryVersion.getCurrent(), new DBSqlConverter("v441"));
-
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryDBVersion.class);
-
-
-    private final VersionComparator comparator;
-    private final DBConverter[] converters;
-
-    ArtifactoryDBVersion(ArtifactoryVersion from, ArtifactoryVersion until, DBConverter... converters) {
-        this.comparator = new VersionComparator(from, until);
-        this.converters = converters;
-    }
-
-    public static ArtifactoryDBVersion getLast() {
-        ArtifactoryDBVersion[] versions = ArtifactoryDBVersion.values();
-        return versions[versions.length - 1];
-    }
-
-    public static void convert(ArtifactoryVersion from, JdbcHelper jdbcHelper, DbType dbType) {
-        // All converters of versions above me needs to be executed in sequence
-        List<DBConverter> converters = Lists.newArrayList();
-        for (ArtifactoryDBVersion version : ArtifactoryDBVersion.values()) {
-            if (version.comparator.isAfter(from) && !version.comparator.supports(from)) {
-                for (DBConverter dbConverter : version.getConverters()) {
-                    converters.add(dbConverter);
-                }
-            }
-        }
-
-        if (converters.isEmpty()) {
-            log.debug("No database converters found between version {} and {}", from, ArtifactoryVersion.getCurrent());
-        } else {
-            log.info("Starting database conversion from {} to {}", from, ArtifactoryVersion.getCurrent());
-            for (DBConverter converter : converters) {
-                converter.convert(jdbcHelper, dbType);
-            }
-            log.info("Finished database conversion from {} to {}", from, ArtifactoryVersion.getCurrent());
-        }
-    }
-
-    public DBConverter[] getConverters() {
-        return converters;
-    }
-
-    public VersionComparator getComparator() {
-        return comparator;
-    }
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/version/converter/DBConverter.java b/storage/db/src/main/java/org/artifactory/storage/db/version/converter/DBConverter.java
deleted file mode 100644
index 1c8d1db..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/version/converter/DBConverter.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.artifactory.storage.db.version.converter;
-
-import org.artifactory.storage.db.DbType;
-import org.artifactory.storage.db.util.JdbcHelper;
-
-/**
- *
- */
-public interface DBConverter {
-    void convert(JdbcHelper jdbcHelper, DbType dbType);
-}
diff --git a/storage/db/src/main/java/org/artifactory/storage/db/version/converter/DBSqlConverter.java b/storage/db/src/main/java/org/artifactory/storage/db/version/converter/DBSqlConverter.java
deleted file mode 100644
index 84864dc..0000000
--- a/storage/db/src/main/java/org/artifactory/storage/db/version/converter/DBSqlConverter.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.artifactory.storage.db.version.converter;
-
-import org.artifactory.storage.db.DbType;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.artifactory.util.ResourceUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.sql.Connection;
-import java.sql.SQLException;
-
-/**
- * Converts database by conversion sql script
- */
-public class DBSqlConverter implements DBConverter {
-    private static final Logger log = LoggerFactory.getLogger(DBSqlConverter.class);
-    private String fromVersion;
-
-    public DBSqlConverter(String fromVersion) {
-        this.fromVersion = fromVersion;
-    }
-
-    @Override
-    public void convert(JdbcHelper jdbcHelper, DbType dbType) {
-        Connection con = null;
-        try {
-            // Build resource file name.
-            String dbTypeName = dbType.toString();
-            String resourcePath = "/conversion/" + dbTypeName + "/" + dbTypeName + "_" + fromVersion + ".sql";
-            InputStream resource = ResourceUtils.getResource(resourcePath);
-            if (resource == null) {
-                throw new IOException("Database DDL resource not found at: '" + resourcePath + "'");
-            }
-            // Execute update
-            log.info("Starting schema conversion: {}", resourcePath);
-            con = jdbcHelper.getDataSource().getConnection();
-            DbUtils.executeSqlStream(con, resource);
-            log.info("Finished schema conversion: {}", resourcePath);
-        } catch (SQLException | IOException e) {
-            String msg = "Could not convert DB from " + fromVersion;
-            log.error(msg + " due to " + e.getMessage(), e);
-            throw new RuntimeException(msg, e);
-        } finally {
-            DbUtils.close(con);
-        }
-    }
-}
diff --git a/storage/db/src/main/resources/META-INF/binarystore-default.xml b/storage/db/src/main/resources/META-INF/binarystore-default.xml
deleted file mode 100644
index b260042..0000000
--- a/storage/db/src/main/resources/META-INF/binarystore-default.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<config version="v1">
-
-    <!-- FullDB default chain -->
-    <chain template="full-db">
-        <provider id="cache-fs" type="cache-fs">
-            <provider id="blob" type="blob"/>
-        </provider>
-    </chain>
-
-    <!-- FullDB chain without caching -->
-    <chain template="full-db-direct">
-        <provider id="blob" type="blob"/>
-    </chain>
-
-</config>
diff --git a/storage/db/src/main/resources/META-INF/binarystore.properties b/storage/db/src/main/resources/META-INF/binarystore.properties
deleted file mode 100644
index e44de51..0000000
--- a/storage/db/src/main/resources/META-INF/binarystore.properties
+++ /dev/null
@@ -1 +0,0 @@
-classes=org.artifactory.storage.db.binstore.service.BlobBinaryProvider
diff --git a/storage/db/src/main/resources/conversion/derby/derby_v310.sql b/storage/db/src/main/resources/conversion/derby/derby_v310.sql
deleted file mode 100644
index 75d8bb9..0000000
--- a/storage/db/src/main/resources/conversion/derby/derby_v310.sql
+++ /dev/null
@@ -1,23 +0,0 @@
-CREATE TABLE db_properties (
-  installation_date    BIGINT      NOT NULL,
-  artifactory_version  VARCHAR(30) NOT NULL,
-  artifactory_revision INT,
-  artifactory_release  BIGINT,
-  CONSTRAINT db_properties_pk PRIMARY KEY (installation_date)
-);
-
-CREATE TABLE artifactory_servers (
-  server_id            VARCHAR(41)    NOT NULL,
-  start_time           BIGINT      NOT NULL,
-  context_url          VARCHAR(255),
-  membership_port            INT,
-  server_state         VARCHAR(12) NOT NULL,
-  server_role          VARCHAR(12) NOT NULL,
-  last_heartbeat      BIGINT      NOT NULL,
-  artifactory_version  VARCHAR(30) NOT NULL,
-  artifactory_revision INT,
-  artifactory_release  BIGINT,
-  artifactory_running_mode     VARCHAR(12) NOT NULL,
-  license_hash         VARCHAR(41)    NOT NULL,
-  CONSTRAINT artifactory_servers_pk PRIMARY KEY (server_id)
-);
diff --git a/storage/db/src/main/resources/conversion/derby/derby_v311.sql b/storage/db/src/main/resources/conversion/derby/derby_v311.sql
deleted file mode 100644
index bfa5c19..0000000
--- a/storage/db/src/main/resources/conversion/derby/derby_v311.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE node_props ALTER COLUMN prop_value SET DATA TYPE VARCHAR(4000);
\ No newline at end of file
diff --git a/storage/db/src/main/resources/conversion/derby/derby_v410.sql b/storage/db/src/main/resources/conversion/derby/derby_v410.sql
deleted file mode 100644
index a0602a4..0000000
--- a/storage/db/src/main/resources/conversion/derby/derby_v410.sql
+++ /dev/null
@@ -1,16 +0,0 @@
-CREATE TABLE user_props (
-  user_id    BIGINT      NOT NULL,
-  prop_key   VARCHAR(64) NOT NULL,
-  prop_value VARCHAR(2048),
-  CONSTRAINT user_props_pk PRIMARY KEY (user_id, prop_key),
-  CONSTRAINT user_props_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id)
-);
-CREATE TABLE stats_remote (
-  node_id            BIGINT NOT NULL,
-  origin             varchar(64),
-  download_count     BIGINT,
-  last_downloaded    BIGINT,
-  last_downloaded_by VARCHAR(64),
-  CONSTRAINT stats_remote_pk PRIMARY KEY (node_id),
-  CONSTRAINT stats_remote_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
diff --git a/storage/db/src/main/resources/conversion/derby/derby_v420.sql b/storage/db/src/main/resources/conversion/derby/derby_v420.sql
deleted file mode 100644
index e0eb092..0000000
--- a/storage/db/src/main/resources/conversion/derby/derby_v420.sql
+++ /dev/null
@@ -1,11 +0,0 @@
-DROP TABLE stats_remote;
-CREATE TABLE stats_remote (
-  node_id            BIGINT NOT NULL,
-  origin             VARCHAR(64),
-  download_count     BIGINT,
-  last_downloaded    BIGINT,
-  last_downloaded_by VARCHAR(64),
-  path VARCHAR(1024),
-  CONSTRAINT stats_remote_pk PRIMARY KEY (node_id, origin),
-  CONSTRAINT stats_remote_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
diff --git a/storage/db/src/main/resources/conversion/derby/derby_v440.sql b/storage/db/src/main/resources/conversion/derby/derby_v440.sql
deleted file mode 100644
index 735a42b..0000000
--- a/storage/db/src/main/resources/conversion/derby/derby_v440.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE users ADD COLUMN locked SMALLINT;
diff --git a/storage/db/src/main/resources/conversion/derby/derby_v441.sql b/storage/db/src/main/resources/conversion/derby/derby_v441.sql
deleted file mode 100644
index 860d034..0000000
--- a/storage/db/src/main/resources/conversion/derby/derby_v441.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE users ADD COLUMN credentials_expired SMALLINT;
diff --git a/storage/db/src/main/resources/conversion/mssql/mssql_v310.sql b/storage/db/src/main/resources/conversion/mssql/mssql_v310.sql
deleted file mode 100644
index 079571f..0000000
--- a/storage/db/src/main/resources/conversion/mssql/mssql_v310.sql
+++ /dev/null
@@ -1,23 +0,0 @@
-CREATE TABLE db_properties (
-  installation_date    BIGINT      NOT NULL,
-  artifactory_version  VARCHAR(30) NOT NULL,
-  artifactory_revision INT,
-  artifactory_release  BIGINT,
-  CONSTRAINT db_properties_pk PRIMARY KEY (installation_date)
-);
-
-CREATE TABLE artifactory_servers (
-  server_id            VARCHAR(41) NOT NULL,
-  start_time           BIGINT NOT NULL,
-  context_url   VARCHAR(255),
-  membership_port            INT,
-  server_state         VARCHAR(12) NOT NULL,
-  server_role          VARCHAR(12) NOT NULL,
-  last_heartbeat      BIGINT NOT NULL,
-  artifactory_version  VARCHAR(30) NOT NULL,
-  artifactory_revision INT,
-  artifactory_release  BIGINT,
-  artifactory_running_mode     VARCHAR(12) NOT NULL,
-  license_hash         VARCHAR(41)    NOT NULL,
-  CONSTRAINT artifactory_servers_pk PRIMARY KEY (server_id)
-);
diff --git a/storage/db/src/main/resources/conversion/mssql/mssql_v311.sql b/storage/db/src/main/resources/conversion/mssql/mssql_v311.sql
deleted file mode 100644
index c2e69ca..0000000
--- a/storage/db/src/main/resources/conversion/mssql/mssql_v311.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE node_props ALTER COLUMN prop_value VARCHAR(4000);
\ No newline at end of file
diff --git a/storage/db/src/main/resources/conversion/mssql/mssql_v410.sql b/storage/db/src/main/resources/conversion/mssql/mssql_v410.sql
deleted file mode 100644
index 75517e0..0000000
--- a/storage/db/src/main/resources/conversion/mssql/mssql_v410.sql
+++ /dev/null
@@ -1,16 +0,0 @@
-CREATE TABLE user_props (
-  user_id    BIGINT      NOT NULL,
-  prop_key   VARCHAR(64) NOT NULL,
-  prop_value VARCHAR(2048),
-  CONSTRAINT user_props_pk PRIMARY KEY (user_id, prop_key),
-  CONSTRAINT user_props_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id)
-);
-CREATE TABLE stats_remote (
-  node_id            BIGINT NOT NULL,
-  origin             VARCHAR(64),
-  download_count     BIGINT,
-  last_downloaded    BIGINT,
-  last_downloaded_by VARCHAR(64),
-  CONSTRAINT stats_remote_pk PRIMARY KEY (node_id),
-  CONSTRAINT stats_remote_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
diff --git a/storage/db/src/main/resources/conversion/mssql/mssql_v420.sql b/storage/db/src/main/resources/conversion/mssql/mssql_v420.sql
deleted file mode 100644
index e0eb092..0000000
--- a/storage/db/src/main/resources/conversion/mssql/mssql_v420.sql
+++ /dev/null
@@ -1,11 +0,0 @@
-DROP TABLE stats_remote;
-CREATE TABLE stats_remote (
-  node_id            BIGINT NOT NULL,
-  origin             VARCHAR(64),
-  download_count     BIGINT,
-  last_downloaded    BIGINT,
-  last_downloaded_by VARCHAR(64),
-  path VARCHAR(1024),
-  CONSTRAINT stats_remote_pk PRIMARY KEY (node_id, origin),
-  CONSTRAINT stats_remote_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
diff --git a/storage/db/src/main/resources/conversion/mssql/mssql_v440.sql b/storage/db/src/main/resources/conversion/mssql/mssql_v440.sql
deleted file mode 100644
index 49eab0c..0000000
--- a/storage/db/src/main/resources/conversion/mssql/mssql_v440.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE users ADD locked BIT;
diff --git a/storage/db/src/main/resources/conversion/mssql/mssql_v441.sql b/storage/db/src/main/resources/conversion/mssql/mssql_v441.sql
deleted file mode 100644
index c95fd38..0000000
--- a/storage/db/src/main/resources/conversion/mssql/mssql_v441.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE users ADD credentials_expired BIT;
diff --git a/storage/db/src/main/resources/conversion/mysql/mysql_v310.sql b/storage/db/src/main/resources/conversion/mysql/mysql_v310.sql
deleted file mode 100644
index fb40560..0000000
--- a/storage/db/src/main/resources/conversion/mysql/mysql_v310.sql
+++ /dev/null
@@ -1,23 +0,0 @@
-CREATE TABLE db_properties (
-  installation_date    BIGINT      NOT NULL,
-  artifactory_version  VARCHAR(30) NOT NULL,
-  artifactory_revision INT,
-  artifactory_release  BIGINT,
-  CONSTRAINT db_properties_pk PRIMARY KEY (installation_date)
-);
-
-CREATE TABLE artifactory_servers (
-  server_id    VARCHAR(41) NOT NULL,
-  start_time           BIGINT      NOT NULL,
-  context_url   VARCHAR(255),
-  membership_port             INT,
-  server_state    VARCHAR(12) NOT NULL,
-  server_role     VARCHAR(12) NOT NULL,
-  last_heartbeat BIGINT      NOT NULL,
-  artifactory_version  VARCHAR(30) NOT NULL,
-  artifactory_revision INT,
-  artifactory_release  BIGINT,
-  artifactory_running_mode     VARCHAR(12) NOT NULL,
-  license_hash VARCHAR(41) NOT NULL,
-  CONSTRAINT artifactory_servers_pk PRIMARY KEY (server_id)
-);
diff --git a/storage/db/src/main/resources/conversion/mysql/mysql_v311.sql b/storage/db/src/main/resources/conversion/mysql/mysql_v311.sql
deleted file mode 100644
index b619e83..0000000
--- a/storage/db/src/main/resources/conversion/mysql/mysql_v311.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE node_props MODIFY prop_value VARCHAR(4000);
\ No newline at end of file
diff --git a/storage/db/src/main/resources/conversion/mysql/mysql_v410.sql b/storage/db/src/main/resources/conversion/mysql/mysql_v410.sql
deleted file mode 100644
index 75517e0..0000000
--- a/storage/db/src/main/resources/conversion/mysql/mysql_v410.sql
+++ /dev/null
@@ -1,16 +0,0 @@
-CREATE TABLE user_props (
-  user_id    BIGINT      NOT NULL,
-  prop_key   VARCHAR(64) NOT NULL,
-  prop_value VARCHAR(2048),
-  CONSTRAINT user_props_pk PRIMARY KEY (user_id, prop_key),
-  CONSTRAINT user_props_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id)
-);
-CREATE TABLE stats_remote (
-  node_id            BIGINT NOT NULL,
-  origin             VARCHAR(64),
-  download_count     BIGINT,
-  last_downloaded    BIGINT,
-  last_downloaded_by VARCHAR(64),
-  CONSTRAINT stats_remote_pk PRIMARY KEY (node_id),
-  CONSTRAINT stats_remote_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
diff --git a/storage/db/src/main/resources/conversion/mysql/mysql_v420.sql b/storage/db/src/main/resources/conversion/mysql/mysql_v420.sql
deleted file mode 100644
index e0eb092..0000000
--- a/storage/db/src/main/resources/conversion/mysql/mysql_v420.sql
+++ /dev/null
@@ -1,11 +0,0 @@
-DROP TABLE stats_remote;
-CREATE TABLE stats_remote (
-  node_id            BIGINT NOT NULL,
-  origin             VARCHAR(64),
-  download_count     BIGINT,
-  last_downloaded    BIGINT,
-  last_downloaded_by VARCHAR(64),
-  path VARCHAR(1024),
-  CONSTRAINT stats_remote_pk PRIMARY KEY (node_id, origin),
-  CONSTRAINT stats_remote_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
diff --git a/storage/db/src/main/resources/conversion/mysql/mysql_v440.sql b/storage/db/src/main/resources/conversion/mysql/mysql_v440.sql
deleted file mode 100644
index e94dfbf..0000000
--- a/storage/db/src/main/resources/conversion/mysql/mysql_v440.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE users ADD locked TINYINT;
diff --git a/storage/db/src/main/resources/conversion/mysql/mysql_v441.sql b/storage/db/src/main/resources/conversion/mysql/mysql_v441.sql
deleted file mode 100644
index a1302be..0000000
--- a/storage/db/src/main/resources/conversion/mysql/mysql_v441.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE users ADD credentials_expired TINYINT;
diff --git a/storage/db/src/main/resources/conversion/oracle/oracle_v310.sql b/storage/db/src/main/resources/conversion/oracle/oracle_v310.sql
deleted file mode 100644
index 8b4ed67..0000000
--- a/storage/db/src/main/resources/conversion/oracle/oracle_v310.sql
+++ /dev/null
@@ -1,23 +0,0 @@
-CREATE TABLE db_properties (
-  installation_date    NUMBER      NOT NULL,
-  artifactory_version  VARCHAR(30) NOT NULL,
-  artifactory_revision INT,
-  artifactory_release  NUMBER,
-  CONSTRAINT db_properties_pk PRIMARY KEY (installation_date)
-);
-
-CREATE TABLE artifactory_servers (
-  server_id    VARCHAR(41) NOT NULL,
-  start_time           NUMBER      NOT NULL,
-  context_url   VARCHAR(255),
-  membership_port             INT,
-  server_state    VARCHAR(12) NOT NULL,
-  server_role     VARCHAR(12) NOT NULL,
-  last_heartbeat NUMBER      NOT NULL,
-  artifactory_version  VARCHAR(30) NOT NULL,
-  artifactory_revision INT,
-  artifactory_release  NUMBER,
-  artifactory_running_mode     VARCHAR(12) NOT NULL,
-  license_hash VARCHAR(41) NOT NULL,
-  CONSTRAINT artifactory_servers_pk PRIMARY KEY (server_id)
-);
\ No newline at end of file
diff --git a/storage/db/src/main/resources/conversion/oracle/oracle_v311.sql b/storage/db/src/main/resources/conversion/oracle/oracle_v311.sql
deleted file mode 100644
index 621fb61..0000000
--- a/storage/db/src/main/resources/conversion/oracle/oracle_v311.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE node_props MODIFY prop_value VARCHAR2(4000);
\ No newline at end of file
diff --git a/storage/db/src/main/resources/conversion/oracle/oracle_v410.sql b/storage/db/src/main/resources/conversion/oracle/oracle_v410.sql
deleted file mode 100644
index d6ae388..0000000
--- a/storage/db/src/main/resources/conversion/oracle/oracle_v410.sql
+++ /dev/null
@@ -1,16 +0,0 @@
-CREATE TABLE user_props (
-  user_id    NUMBER(19, 0) NOT NULL,
-  prop_key   VARCHAR(64) NOT NULL,
-  prop_value VARCHAR(2048),
-  CONSTRAINT user_props_pk PRIMARY KEY (user_id, prop_key),
-  CONSTRAINT user_props_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id)
-);
-CREATE TABLE stats_remote (
-  node_id            NUMBER(19, 0) NOT NULL,
-  origin             VARCHAR2(64),
-  download_count     NUMBER(19, 0),
-  last_downloaded    NUMBER(19, 0),
-  last_downloaded_by VARCHAR2(64),
-  CONSTRAINT stats_remote_pk PRIMARY KEY (node_id),
-  CONSTRAINT stats_remote_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
diff --git a/storage/db/src/main/resources/conversion/oracle/oracle_v420.sql b/storage/db/src/main/resources/conversion/oracle/oracle_v420.sql
deleted file mode 100644
index de648b2..0000000
--- a/storage/db/src/main/resources/conversion/oracle/oracle_v420.sql
+++ /dev/null
@@ -1,11 +0,0 @@
-DROP TABLE stats_remote;
-CREATE TABLE stats_remote (
-  node_id            NUMBER(19, 0) NOT NULL,
-  origin             VARCHAR2(64),
-  download_count     NUMBER(19, 0),
-  last_downloaded    NUMBER(19, 0),
-  last_downloaded_by VARCHAR2(64),
-  path VARCHAR(1024),
-  CONSTRAINT stats_remote_pk PRIMARY KEY (node_id, origin),
-  CONSTRAINT stats_remote_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
diff --git a/storage/db/src/main/resources/conversion/oracle/oracle_v440.sql b/storage/db/src/main/resources/conversion/oracle/oracle_v440.sql
deleted file mode 100644
index f788831..0000000
--- a/storage/db/src/main/resources/conversion/oracle/oracle_v440.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE users ADD locked NUMBER(5, 0);
diff --git a/storage/db/src/main/resources/conversion/oracle/oracle_v441.sql b/storage/db/src/main/resources/conversion/oracle/oracle_v441.sql
deleted file mode 100644
index 3d6a0b1..0000000
--- a/storage/db/src/main/resources/conversion/oracle/oracle_v441.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE users ADD credentials_expired NUMBER(5, 0);
diff --git a/storage/db/src/main/resources/conversion/postgresql/postgresql_v310.sql b/storage/db/src/main/resources/conversion/postgresql/postgresql_v310.sql
deleted file mode 100644
index b5d660f..0000000
--- a/storage/db/src/main/resources/conversion/postgresql/postgresql_v310.sql
+++ /dev/null
@@ -1,33 +0,0 @@
-CREATE TABLE db_properties (
-  installation_date    BIGINT      NOT NULL,
-  artifactory_version  VARCHAR(30) NOT NULL,
-  artifactory_revision INT,
-  artifactory_release  BIGINT,
-  CONSTRAINT db_properties_pk PRIMARY KEY (installation_date)
-);
-
-CREATE TABLE artifactory_servers (
-  server_id            VARCHAR(41)    NOT NULL,
-  start_time           BIGINT      NOT NULL,
-  context_url   VARCHAR(255),
-  membership_port            INT,
-  server_state         VARCHAR(12) NOT NULL,
-  server_role          VARCHAR(12) NOT NULL,
-  last_heartbeat      BIGINT      NOT NULL,
-  artifactory_version  VARCHAR(30) NOT NULL,
-  artifactory_revision INT,
-  artifactory_release  BIGINT,
-  artifactory_running_mode     VARCHAR(12) NOT NULL,
-  license_hash         VARCHAR(41)    NOT NULL,
-  CONSTRAINT artifactory_servers_pk PRIMARY KEY (server_id)
-);
-
-
-
-
-
-
-
-
-
-
diff --git a/storage/db/src/main/resources/conversion/postgresql/postgresql_v311.sql b/storage/db/src/main/resources/conversion/postgresql/postgresql_v311.sql
deleted file mode 100644
index 02400f7..0000000
--- a/storage/db/src/main/resources/conversion/postgresql/postgresql_v311.sql
+++ /dev/null
@@ -1,3 +0,0 @@
-ALTER TABLE node_props ALTER prop_value TYPE VARCHAR(4000);
-DROP INDEX node_props_prop_value_idx;
-CREATE INDEX node_props_prop_value_idx ON node_props (substr(prop_value, 1, 255));
diff --git a/storage/db/src/main/resources/conversion/postgresql/postgresql_v410.sql b/storage/db/src/main/resources/conversion/postgresql/postgresql_v410.sql
deleted file mode 100644
index 75517e0..0000000
--- a/storage/db/src/main/resources/conversion/postgresql/postgresql_v410.sql
+++ /dev/null
@@ -1,16 +0,0 @@
-CREATE TABLE user_props (
-  user_id    BIGINT      NOT NULL,
-  prop_key   VARCHAR(64) NOT NULL,
-  prop_value VARCHAR(2048),
-  CONSTRAINT user_props_pk PRIMARY KEY (user_id, prop_key),
-  CONSTRAINT user_props_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id)
-);
-CREATE TABLE stats_remote (
-  node_id            BIGINT NOT NULL,
-  origin             VARCHAR(64),
-  download_count     BIGINT,
-  last_downloaded    BIGINT,
-  last_downloaded_by VARCHAR(64),
-  CONSTRAINT stats_remote_pk PRIMARY KEY (node_id),
-  CONSTRAINT stats_remote_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
diff --git a/storage/db/src/main/resources/conversion/postgresql/postgresql_v420.sql b/storage/db/src/main/resources/conversion/postgresql/postgresql_v420.sql
deleted file mode 100644
index e0eb092..0000000
--- a/storage/db/src/main/resources/conversion/postgresql/postgresql_v420.sql
+++ /dev/null
@@ -1,11 +0,0 @@
-DROP TABLE stats_remote;
-CREATE TABLE stats_remote (
-  node_id            BIGINT NOT NULL,
-  origin             VARCHAR(64),
-  download_count     BIGINT,
-  last_downloaded    BIGINT,
-  last_downloaded_by VARCHAR(64),
-  path VARCHAR(1024),
-  CONSTRAINT stats_remote_pk PRIMARY KEY (node_id, origin),
-  CONSTRAINT stats_remote_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
diff --git a/storage/db/src/main/resources/conversion/postgresql/postgresql_v440.sql b/storage/db/src/main/resources/conversion/postgresql/postgresql_v440.sql
deleted file mode 100644
index 735a42b..0000000
--- a/storage/db/src/main/resources/conversion/postgresql/postgresql_v440.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE users ADD COLUMN locked SMALLINT;
diff --git a/storage/db/src/main/resources/conversion/postgresql/postgresql_v441.sql b/storage/db/src/main/resources/conversion/postgresql/postgresql_v441.sql
deleted file mode 100644
index 860d034..0000000
--- a/storage/db/src/main/resources/conversion/postgresql/postgresql_v441.sql
+++ /dev/null
@@ -1 +0,0 @@
-ALTER TABLE users ADD COLUMN credentials_expired SMALLINT;
diff --git a/storage/db/src/main/resources/derby/derby.sql b/storage/db/src/main/resources/derby/derby.sql
deleted file mode 100644
index ffd4253..0000000
--- a/storage/db/src/main/resources/derby/derby.sql
+++ /dev/null
@@ -1,352 +0,0 @@
-CREATE TABLE unique_ids (
-  index_type VARCHAR(32) NOT NULL,
-  current_id BIGINT      NOT NULL,
-  CONSTRAINT unique_ids_pk PRIMARY KEY (index_type)
-);
-
-CREATE TABLE binaries (
-  sha1       CHAR(40) NOT NULL,
-  md5        CHAR(32) NOT NULL,
-  bin_length BIGINT   NOT NULL,
-  CONSTRAINT binaries_pk PRIMARY KEY (sha1)
-);
-CREATE UNIQUE INDEX binaries_md5_idx ON binaries (md5);
-
-CREATE TABLE binary_blobs (
-  sha1 CHAR(40) NOT NULL,
-  data BLOB,
-  CONSTRAINT binary_blobs_pk PRIMARY KEY (sha1)
-);
-
-CREATE TABLE nodes (
-  node_id       BIGINT        NOT NULL,
-  node_type     SMALLINT      NOT NULL,
-  repo          VARCHAR(64)   NOT NULL,
-  node_path     VARCHAR(1024) NOT NULL,
-  node_name     VARCHAR(255)  NOT NULL,
-  depth         SMALLINT      NOT NULL,
-  created       BIGINT        NOT NULL,
-  created_by    VARCHAR(64),
-  modified      BIGINT        NOT NULL,
-  modified_by   VARCHAR(64),
-  updated       BIGINT,
-  bin_length    BIGINT,
-  sha1_actual   CHAR(40),
-  sha1_original VARCHAR(1024),
-  md5_actual    CHAR(32),
-  md5_original  VARCHAR(1024),
-  CONSTRAINT nodes_pk PRIMARY KEY (node_id),
-  CONSTRAINT nodes_binaries_fk FOREIGN KEY (sha1_actual) REFERENCES binaries (sha1)
-);
-CREATE UNIQUE INDEX nodes_repo_path_name_idx ON nodes (repo, node_path, node_name);
-CREATE INDEX nodes_node_path_idx ON nodes (node_path);
-CREATE INDEX nodes_node_name_idx ON nodes (node_name);
-CREATE INDEX nodes_sha1_actual_idx ON nodes (sha1_actual);
-CREATE INDEX nodes_md5_actual_idx ON nodes (md5_actual);
-
-CREATE TABLE node_props (
-  prop_id    BIGINT NOT NULL,
-  node_id    BIGINT NOT NULL,
-  prop_key   VARCHAR(255),
-  prop_value VARCHAR(4000),
-  CONSTRAINT node_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT node_props_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-CREATE INDEX node_props_node_id_idx ON node_props (node_id);
-CREATE INDEX node_props_prop_key_idx ON node_props (prop_key);
-CREATE INDEX node_props_prop_value_idx ON node_props (prop_value);
-
-CREATE TABLE node_meta_infos (
-  node_id           BIGINT NOT NULL,
-  props_modified    BIGINT,
-  props_modified_by VARCHAR(64),
-  CONSTRAINT node_meta_infos_pk PRIMARY KEY (node_id),
-  CONSTRAINT node_meta_infos_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-
-CREATE TABLE watches (
-  watch_id BIGINT      NOT NULL,
-  node_id  BIGINT      NOT NULL,
-  username VARCHAR(64) NOT NULL,
-  since    BIGINT      NOT NULL,
-  CONSTRAINT watches_pk PRIMARY KEY (watch_id),
-  CONSTRAINT watches_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-CREATE INDEX watches_node_id_idx ON watches (node_id);
-
-CREATE TABLE stats (
-  node_id            BIGINT NOT NULL,
-  download_count     BIGINT,
-  last_downloaded    BIGINT,
-  last_downloaded_by VARCHAR(64),
-  CONSTRAINT stats_pk PRIMARY KEY (node_id),
-  CONSTRAINT stats_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-
-CREATE TABLE stats_remote (
-  node_id            BIGINT NOT NULL,
-  origin          varchar(64),
-  download_count     BIGINT,
-  last_downloaded    BIGINT,
-  last_downloaded_by VARCHAR(64),
-  path VARCHAR(1024),
-  CONSTRAINT stats_remote_pk PRIMARY KEY (node_id, origin),
-  CONSTRAINT stats_remote_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-
-CREATE TABLE indexed_archives (
-  archive_sha1        CHAR(40) NOT NULL,
-  indexed_archives_id BIGINT   NOT NULL,
-  CONSTRAINT indexed_archives_pk PRIMARY KEY (archive_sha1),
-  CONSTRAINT indexed_archives_id_uq UNIQUE (indexed_archives_id),
-  CONSTRAINT indexed_archives_binaries_fk FOREIGN KEY (archive_sha1) REFERENCES binaries (sha1)
-);
-
-CREATE TABLE archive_paths (
-  path_id    BIGINT NOT NULL,
-  entry_path VARCHAR(1024),
-  CONSTRAINT archive_paths_pk PRIMARY KEY (path_id)
-);
-CREATE UNIQUE INDEX archive_paths_path_idx ON archive_paths (entry_path);
-
-CREATE TABLE archive_names (
-  name_id    BIGINT NOT NULL,
-  entry_name VARCHAR(255),
-  CONSTRAINT archive_names_pk PRIMARY KEY (name_id)
-);
-CREATE UNIQUE INDEX archive_names_name_idx ON archive_names (entry_name);
-
-CREATE TABLE indexed_archives_entries (
-  indexed_archives_id BIGINT NOT NULL,
-  entry_path_id       BIGINT NOT NULL,
-  entry_name_id       BIGINT NOT NULL,
-  CONSTRAINT indexed_archives_entries_pk PRIMARY KEY (indexed_archives_id, entry_path_id, entry_name_id),
-  CONSTRAINT indexed_archives_id_fk FOREIGN KEY (indexed_archives_id) REFERENCES indexed_archives (indexed_archives_id),
-  CONSTRAINT entry_path_id_fk FOREIGN KEY (entry_path_id) REFERENCES archive_paths (path_id),
-  CONSTRAINT entry_name_id_fk FOREIGN KEY (entry_name_id) REFERENCES archive_names (name_id)
-);
-CREATE INDEX indexed_entries_path_idx ON indexed_archives_entries (entry_path_id);
-CREATE INDEX indexed_entries_name_idx ON indexed_archives_entries (entry_name_id);
-
-CREATE TABLE tasks (
-  task_type    VARCHAR(32)   NOT NULL,
-  task_context VARCHAR(1024) NOT NULL
--- CONSTRAINT pk_tasks PRIMARY KEY (task_type, task_context)
-);
-CREATE INDEX tasks_type_context_idx ON tasks (task_type, task_context);
-
-CREATE TABLE configs (
-  config_name VARCHAR(255) NOT NULL,
-  data        BLOB         NOT NULL,
-  CONSTRAINT configs_pk PRIMARY KEY (config_name)
-);
-
-CREATE TABLE users (
-  user_id           BIGINT      NOT NULL,
-  username          VARCHAR(64) NOT NULL,
-  password          VARCHAR(128),
-  salt              VARCHAR(128),
-  email             VARCHAR(128),
-  gen_password_key  VARCHAR(128),
-  admin             SMALLINT,
-  enabled           SMALLINT,
-  updatable_profile SMALLINT,
-  realm             VARCHAR(255),
-  private_key       VARCHAR(512),
-  public_key        VARCHAR(255),
-  last_login_time   BIGINT,
-  last_login_ip     VARCHAR(42),
-  last_access_time  BIGINT,
-  last_access_ip    VARCHAR(42),
-  bintray_auth      VARCHAR(512),
-  locked            SMALLINT,
-  credentials_expired  SMALLINT,
-  CONSTRAINT users_pk PRIMARY KEY (user_id)
-);
-CREATE UNIQUE INDEX users_username_idx ON users (username);
-
-CREATE TABLE user_props (
-  user_id    BIGINT      NOT NULL,
-  prop_key   VARCHAR(64) NOT NULL,
-  prop_value VARCHAR(2048),
-  CONSTRAINT user_props_pk PRIMARY KEY (user_id, prop_key),
-  CONSTRAINT user_props_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id)
-);
-
-CREATE TABLE groups (
-  group_id         BIGINT      NOT NULL,
-  group_name       VARCHAR(64) NOT NULL,
-  description      VARCHAR(1024),
-  default_new_user SMALLINT,
-  realm            VARCHAR(255),
-  realm_attributes VARCHAR(512),
-  CONSTRAINT groups_pk PRIMARY KEY (group_id)
-);
-CREATE UNIQUE INDEX groups_group_name_idx ON groups (group_name);
-
-CREATE TABLE users_groups (
-  user_id  BIGINT NOT NULL,
-  group_id BIGINT NOT NULL,
-  realm    VARCHAR(255),
-  CONSTRAINT users_groups_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id),
-  CONSTRAINT users_groups_groups_fk FOREIGN KEY (group_id) REFERENCES groups (group_id)
-);
-CREATE UNIQUE INDEX users_groups_idx ON users_groups (user_id, group_id);
-
-CREATE TABLE permission_targets (
-  perm_target_id   BIGINT      NOT NULL,
-  perm_target_name VARCHAR(64) NOT NULL,
-  includes         VARCHAR(1024),
-  excludes         VARCHAR(1024),
-  CONSTRAINT permission_targets_pk PRIMARY KEY (perm_target_id)
-);
-CREATE UNIQUE INDEX permission_targets_name_idx ON permission_targets (perm_target_name);
-
-CREATE TABLE permission_target_repos (
-  perm_target_id BIGINT      NOT NULL,
-  repo_key       VARCHAR(64) NOT NULL,
-  CONSTRAINT permission_target_repos_fk FOREIGN KEY (perm_target_id) REFERENCES permission_targets (perm_target_id)
-);
-
-CREATE TABLE acls (
-  acl_id         BIGINT NOT NULL,
-  perm_target_id BIGINT,
-  modified       BIGINT,
-  modified_by    VARCHAR(64),
-  CONSTRAINT acls_pk PRIMARY KEY (acl_id),
-  CONSTRAINT acls_permission_targets_fk FOREIGN KEY (perm_target_id) REFERENCES permission_targets (perm_target_id)
-);
-CREATE INDEX acls_perm_target_id_idx ON acls (perm_target_id);
-
-CREATE TABLE aces (
-  ace_id   BIGINT   NOT NULL,
-  acl_id   BIGINT   NOT NULL,
-  mask     SMALLINT NOT NULL,
-  user_id  BIGINT,
-  group_id BIGINT,
-  CONSTRAINT aces_pk PRIMARY KEY (ace_id),
-  CONSTRAINT aces_acls_fk FOREIGN KEY (acl_id) REFERENCES acls (acl_id),
-  CONSTRAINT aces_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id),
-  CONSTRAINT aces_groups_fk FOREIGN KEY (group_id) REFERENCES groups (group_id)
-);
-
-CREATE TABLE builds (
-  build_id     BIGINT       NOT NULL,
-  build_name   VARCHAR(255) NOT NULL,
-  build_number VARCHAR(255) NOT NULL,
-  build_date   BIGINT       NOT NULL,
-  ci_url       VARCHAR(1024),
-  created      BIGINT       NOT NULL,
-  created_by   VARCHAR(64),
-  modified     BIGINT,
-  modified_by  VARCHAR(64),
-  CONSTRAINT builds_pk PRIMARY KEY (build_id)
-);
-CREATE UNIQUE INDEX builds_name_number_date_idx ON builds (build_name, build_number, build_date);
-
-CREATE TABLE build_jsons (
-  build_id        BIGINT NOT NULL,
-  build_info_json BLOB,
-  CONSTRAINT build_jsons_pk PRIMARY KEY (build_id),
-  CONSTRAINT build_jsons_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-
-CREATE TABLE build_promotions (
-  build_id          BIGINT      NOT NULL,
-  created           BIGINT      NOT NULL,
-  created_by        VARCHAR(64),
-  status            VARCHAR(64) NOT NULL,
-  repo              VARCHAR(64),
-  promotion_comment VARCHAR(1024),
-  ci_user           VARCHAR(64),
-  CONSTRAINT build_promotions_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE UNIQUE INDEX build_promotions_created_idx ON build_promotions (build_id, created);
-CREATE INDEX build_promotions_status_idx ON build_promotions (status);
-
-CREATE TABLE build_props (
-  prop_id    BIGINT NOT NULL,
-  build_id   BIGINT NOT NULL,
-  prop_key   VARCHAR(255),
-  prop_value VARCHAR(2048),
-  CONSTRAINT build_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT build_props_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE INDEX build_props_build_id_idx ON build_props (build_id);
-CREATE INDEX build_props_prop_key_idx ON build_props (prop_key);
-CREATE INDEX build_props_prop_value_idx ON build_props (prop_value);
-
-CREATE TABLE build_modules (
-  module_id      BIGINT        NOT NULL,
-  build_id       BIGINT        NOT NULL,
-  module_name_id VARCHAR(1024) NOT NULL,
-  CONSTRAINT build_modules_pk PRIMARY KEY (module_id),
-  CONSTRAINT build_modules_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE INDEX build_modules_build_id_idx ON build_modules (build_id);
-
-CREATE TABLE build_artifacts (
-  artifact_id   BIGINT        NOT NULL,
-  module_id     BIGINT        NOT NULL,
-  artifact_name VARCHAR(1024) NOT NULL,
-  artifact_type VARCHAR(64),
-  sha1          CHAR(40),
-  md5           CHAR(32),
-  CONSTRAINT build_artifacts_pk PRIMARY KEY (artifact_id),
-  CONSTRAINT build_artifacts_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX build_artifacts_module_id_idx ON build_artifacts (module_id);
-CREATE INDEX build_artifacts_sha1_idx ON build_artifacts (sha1);
-CREATE INDEX build_artifacts_md5_idx ON build_artifacts (md5);
-
-CREATE TABLE build_dependencies (
-  dependency_id      BIGINT        NOT NULL,
-  module_id          BIGINT        NOT NULL,
-  dependency_name_id VARCHAR(1024) NOT NULL,
-  dependency_scopes  VARCHAR(1024),
-  dependency_type    VARCHAR(64),
-  sha1               CHAR(40),
-  md5                CHAR(32),
-  CONSTRAINT build_dependencies_pk PRIMARY KEY (dependency_id),
-  CONSTRAINT build_dependencies_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX build_dependencies_module_idx ON build_dependencies (module_id);
-CREATE INDEX build_dependencies_sha1_idx ON build_dependencies (sha1);
-CREATE INDEX build_dependencies_md5_idx ON build_dependencies (md5);
-
-CREATE TABLE module_props (
-  prop_id    BIGINT NOT NULL,
-  module_id  BIGINT NOT NULL,
-  prop_key   VARCHAR(255),
-  prop_value VARCHAR(2048),
-  CONSTRAINT module_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT module_props_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX module_props_module_id_idx ON module_props (module_id);
-CREATE INDEX module_props_prop_key_idx ON module_props (prop_key);
-CREATE INDEX module_props_prop_value_idx ON module_props (prop_value);
-
-CREATE TABLE db_properties (
-  installation_date    BIGINT      NOT NULL,
-  artifactory_version  VARCHAR(30) NOT NULL,
-  artifactory_revision INT,
-  artifactory_release  BIGINT,
-  CONSTRAINT db_properties_pk PRIMARY KEY (installation_date)
-);
-
-CREATE TABLE artifactory_servers (
-  server_id                VARCHAR(41) NOT NULL,
-  start_time               BIGINT      NOT NULL,
-  context_url     VARCHAR(255),
-  membership_port INT,
-  server_state             VARCHAR(12) NOT NULL,
-  server_role              VARCHAR(12) NOT NULL,
-  last_heartbeat BIGINT NOT NULL,
-  artifactory_version      VARCHAR(30) NOT NULL,
-  artifactory_revision     INT,
-  artifactory_release      BIGINT,
-  artifactory_running_mode VARCHAR(12) NOT NULL,
-  license_hash             VARCHAR(41) NOT NULL,
-  CONSTRAINT artifactory_servers_pk PRIMARY KEY (server_id)
-);
-
diff --git a/storage/db/src/main/resources/mssql/mssql.sql b/storage/db/src/main/resources/mssql/mssql.sql
deleted file mode 100644
index 33d41a1..0000000
--- a/storage/db/src/main/resources/mssql/mssql.sql
+++ /dev/null
@@ -1,351 +0,0 @@
-CREATE TABLE unique_ids (
-  index_type VARCHAR(32) NOT NULL,
-  current_id BIGINT      NOT NULL,
-  CONSTRAINT unique_ids_pk PRIMARY KEY (index_type)
-);
-
-CREATE TABLE binaries (
-  sha1       CHAR(40) NOT NULL,
-  md5        CHAR(32) NOT NULL,
-  bin_length BIGINT   NOT NULL,
-  CONSTRAINT binaries_pk PRIMARY KEY (sha1)
-);
-CREATE UNIQUE INDEX binaries_md5_idx ON binaries (md5);
-
-CREATE TABLE binary_blobs (
-  sha1 CHAR(40) NOT NULL,
-  data VARBINARY(MAX),
-  CONSTRAINT binary_blobs_pk PRIMARY KEY (sha1)
-);
-
-CREATE TABLE nodes (
-  node_id       BIGINT        NOT NULL,
-  node_type     BIT           NOT NULL,
-  repo          VARCHAR(64)   NOT NULL,
-  node_path     VARCHAR(1024) NOT NULL,
-  node_name     VARCHAR(255)  NOT NULL,
-  depth         SMALLINT      NOT NULL,
-  created       BIGINT        NOT NULL,
-  created_by    VARCHAR(64),
-  modified      BIGINT        NOT NULL,
-  modified_by   VARCHAR(64),
-  updated       BIGINT,
-  bin_length    BIGINT,
-  sha1_actual   CHAR(40),
-  sha1_original VARCHAR(1024),
-  md5_actual    CHAR(32),
-  md5_original  VARCHAR(1024),
-  CONSTRAINT nodes_pk PRIMARY KEY NONCLUSTERED (node_id),
-  CONSTRAINT nodes_binaries_fk FOREIGN KEY (sha1_actual) REFERENCES binaries (sha1)
-);
-CREATE UNIQUE CLUSTERED INDEX nodes_repo_path_name_idx ON nodes (repo, node_path, node_name);
-CREATE INDEX nodes_node_path_idx ON nodes (node_path);
-CREATE INDEX nodes_node_name_idx ON nodes (node_name);
-CREATE INDEX nodes_sha1_actual_idx ON nodes (sha1_actual);
-CREATE INDEX nodes_md5_actual_idx ON nodes (md5_actual);
-
-CREATE TABLE node_props (
-  prop_id    BIGINT NOT NULL,
-  node_id    BIGINT NOT NULL,
-  prop_key   VARCHAR(255),
-  prop_value VARCHAR(4000),
-  CONSTRAINT node_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT node_props_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-CREATE INDEX node_props_node_id_idx ON node_props (node_id);
-CREATE INDEX node_props_prop_key_idx ON node_props (prop_key);
-CREATE INDEX node_props_prop_value_idx ON node_props (prop_value);
-
-CREATE TABLE node_meta_infos (
-  node_id           BIGINT NOT NULL,
-  props_modified    BIGINT,
-  props_modified_by VARCHAR(64),
-  CONSTRAINT node_meta_infos_pk PRIMARY KEY (node_id),
-  CONSTRAINT node_meta_infos_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-
-CREATE TABLE watches (
-  watch_id BIGINT      NOT NULL,
-  node_id  BIGINT      NOT NULL,
-  username VARCHAR(64) NOT NULL,
-  since    BIGINT      NOT NULL,
-  CONSTRAINT watches_pk PRIMARY KEY (watch_id),
-  CONSTRAINT watches_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-CREATE INDEX watches_node_id_idx ON watches (node_id);
-
-CREATE TABLE stats (
-  node_id            BIGINT NOT NULL,
-  download_count     BIGINT,
-  last_downloaded    BIGINT,
-  last_downloaded_by VARCHAR(64),
-  CONSTRAINT stats_pk PRIMARY KEY (node_id),
-  CONSTRAINT stats_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-
-CREATE TABLE stats_remote (
-  node_id            BIGINT NOT NULL,
-  origin            VARCHAR(64),
-  download_count     BIGINT,
-  last_downloaded    BIGINT,
-  last_downloaded_by VARCHAR(64),
-  path VARCHAR(1024),
-  CONSTRAINT stats_remote_pk PRIMARY KEY (node_id, origin),
-  CONSTRAINT stats_remote_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-
-CREATE TABLE indexed_archives (
-  archive_sha1        CHAR(40) NOT NULL,
-  indexed_archives_id BIGINT   NOT NULL,
-  CONSTRAINT indexed_archives_pk PRIMARY KEY (archive_sha1),
-  CONSTRAINT indexed_archives_id_uq UNIQUE (indexed_archives_id),
-  CONSTRAINT indexed_archives_binaries_fk FOREIGN KEY (archive_sha1) REFERENCES binaries (sha1)
-);
-
-CREATE TABLE archive_paths (
-  path_id    BIGINT NOT NULL,
-  entry_path VARCHAR(1024),
-  CONSTRAINT archive_paths_pk PRIMARY KEY NONCLUSTERED (path_id)
-);
-CREATE UNIQUE CLUSTERED INDEX archive_paths_path_idx ON archive_paths (entry_path);
-
-CREATE TABLE archive_names (
-  name_id    BIGINT NOT NULL,
-  entry_name VARCHAR(255),
-  CONSTRAINT archive_names_pk PRIMARY KEY NONCLUSTERED (name_id)
-);
-CREATE UNIQUE CLUSTERED INDEX archive_names_name_idx ON archive_names (entry_name);
-
-CREATE TABLE indexed_archives_entries (
-  indexed_archives_id BIGINT NOT NULL,
-  entry_path_id       BIGINT NOT NULL,
-  entry_name_id       BIGINT NOT NULL,
-  CONSTRAINT indexed_archives_entries_pk PRIMARY KEY (indexed_archives_id, entry_path_id, entry_name_id),
-  CONSTRAINT indexed_archives_id_fk FOREIGN KEY (indexed_archives_id) REFERENCES indexed_archives (indexed_archives_id),
-  CONSTRAINT entry_path_id_fk FOREIGN KEY (entry_path_id) REFERENCES archive_paths (path_id),
-  CONSTRAINT entry_name_id_fk FOREIGN KEY (entry_name_id) REFERENCES archive_names (name_id)
-);
-CREATE INDEX indexed_entries_path_idx ON indexed_archives_entries (entry_path_id);
-CREATE INDEX indexed_entries_name_idx ON indexed_archives_entries (entry_name_id);
-
-CREATE TABLE tasks (
-  task_type    VARCHAR(32)   NOT NULL,
-  task_context VARCHAR(1024) NOT NULL
--- CONSTRAINT pk_tasks PRIMARY KEY (task_type, task_context)
-);
-CREATE INDEX tasks_type_context_idx ON tasks (task_type, task_context);
-
-CREATE TABLE configs (
-  config_name VARCHAR(255)   NOT NULL,
-  data        VARBINARY(MAX) NOT NULL,
-  CONSTRAINT configs_pk PRIMARY KEY (config_name)
-);
-
-CREATE TABLE users (
-  user_id           BIGINT      NOT NULL,
-  username          VARCHAR(64) NOT NULL,
-  password          VARCHAR(128),
-  salt              VARCHAR(128),
-  email             VARCHAR(128),
-  gen_password_key  VARCHAR(128),
-  admin             BIT,
-  enabled           BIT,
-  updatable_profile BIT,
-  realm             VARCHAR(255),
-  private_key       VARCHAR(512),
-  public_key        VARCHAR(255),
-  last_login_time   BIGINT,
-  last_login_ip     VARCHAR(42),
-  last_access_time  BIGINT,
-  last_access_ip    VARCHAR(42),
-  bintray_auth      VARCHAR(512),
-  locked            BIT,
-  credentials_expired  BIT,
-  CONSTRAINT users_pk PRIMARY KEY (user_id)
-);
-CREATE UNIQUE INDEX users_username_idx ON users (username);
-
-CREATE TABLE user_props (
-  user_id    BIGINT      NOT NULL,
-  prop_key   VARCHAR(64) NOT NULL,
-  prop_value VARCHAR(2048),
-  CONSTRAINT user_props_pk PRIMARY KEY (user_id, prop_key),
-  CONSTRAINT user_props_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id)
-);
-
-CREATE TABLE groups (
-  group_id         BIGINT      NOT NULL,
-  group_name       VARCHAR(64) NOT NULL,
-  description      VARCHAR(1024),
-  default_new_user BIT,
-  realm            VARCHAR(255),
-  realm_attributes VARCHAR(512),
-  CONSTRAINT groups_pk PRIMARY KEY (group_id)
-);
-CREATE UNIQUE INDEX groups_group_name_idx ON groups (group_name);
-
-CREATE TABLE users_groups (
-  user_id  BIGINT NOT NULL,
-  group_id BIGINT NOT NULL,
-  realm    VARCHAR(255),
-  CONSTRAINT users_groups_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id),
-  CONSTRAINT users_groups_groups_fk FOREIGN KEY (group_id) REFERENCES groups (group_id)
-);
-CREATE UNIQUE INDEX users_groups_idx ON users_groups (user_id, group_id);
-
-CREATE TABLE permission_targets (
-  perm_target_id   BIGINT      NOT NULL,
-  perm_target_name VARCHAR(64) NOT NULL,
-  includes         VARCHAR(1024),
-  excludes         VARCHAR(1024),
-  CONSTRAINT permission_targets_pk PRIMARY KEY (perm_target_id)
-);
-CREATE UNIQUE INDEX permission_targets_name_idx ON permission_targets (perm_target_name);
-
-CREATE TABLE permission_target_repos (
-  perm_target_id BIGINT      NOT NULL,
-  repo_key       VARCHAR(64) NOT NULL,
-  CONSTRAINT permission_target_repos_fk FOREIGN KEY (perm_target_id) REFERENCES permission_targets (perm_target_id)
-);
-
-CREATE TABLE acls (
-  acl_id         BIGINT NOT NULL,
-  perm_target_id BIGINT,
-  modified       BIGINT,
-  modified_by    VARCHAR(64),
-  CONSTRAINT acls_pk PRIMARY KEY (acl_id),
-  CONSTRAINT acls_permission_targets_fk FOREIGN KEY (perm_target_id) REFERENCES permission_targets (perm_target_id)
-);
-CREATE INDEX acls_perm_target_id_idx ON acls (perm_target_id);
-
-CREATE TABLE aces (
-  ace_id   BIGINT   NOT NULL,
-  acl_id   BIGINT   NOT NULL,
-  mask     SMALLINT NOT NULL,
-  user_id  BIGINT,
-  group_id BIGINT,
-  CONSTRAINT aces_pk PRIMARY KEY (ace_id),
-  CONSTRAINT aces_acls_fk FOREIGN KEY (acl_id) REFERENCES acls (acl_id),
-  CONSTRAINT aces_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id),
-  CONSTRAINT aces_groups_fk FOREIGN KEY (group_id) REFERENCES groups (group_id)
-);
-
-CREATE TABLE builds (
-  build_id     BIGINT       NOT NULL,
-  build_name   VARCHAR(255) NOT NULL,
-  build_number VARCHAR(255) NOT NULL,
-  build_date   BIGINT       NOT NULL,
-  ci_url       VARCHAR(1024),
-  created      BIGINT       NOT NULL,
-  created_by   VARCHAR(64),
-  modified     BIGINT,
-  modified_by  VARCHAR(64),
-  CONSTRAINT builds_pk PRIMARY KEY (build_id)
-);
-CREATE UNIQUE INDEX builds_name_number_date_idx ON builds (build_name, build_number, build_date);
-
-CREATE TABLE build_jsons (
-  build_id        BIGINT NOT NULL,
-  build_info_json VARBINARY(MAX),
-  CONSTRAINT build_jsons_pk PRIMARY KEY (build_id),
-  CONSTRAINT build_jsons_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-
-CREATE TABLE build_promotions (
-  build_id          BIGINT      NOT NULL,
-  created           BIGINT      NOT NULL,
-  created_by        VARCHAR(64),
-  status            VARCHAR(64) NOT NULL,
-  repo              VARCHAR(64),
-  promotion_comment VARCHAR(1024),
-  ci_user           VARCHAR(64),
-  CONSTRAINT build_promotions_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE UNIQUE INDEX build_promotions_created_idx ON build_promotions (build_id, created);
-CREATE INDEX build_promotions_status_idx ON build_promotions (status);
-
-CREATE TABLE build_props (
-  prop_id    BIGINT NOT NULL,
-  build_id   BIGINT NOT NULL,
-  prop_key   VARCHAR(255),
-  prop_value VARCHAR(2048),
-  CONSTRAINT build_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT build_props_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE INDEX build_props_build_id_idx ON build_props (build_id);
-CREATE INDEX build_props_prop_key_idx ON build_props (prop_key);
-CREATE INDEX build_props_prop_value_idx ON build_props (prop_value);
-
-CREATE TABLE build_modules (
-  module_id      BIGINT        NOT NULL,
-  build_id       BIGINT        NOT NULL,
-  module_name_id VARCHAR(1024) NOT NULL,
-  CONSTRAINT build_modules_pk PRIMARY KEY (module_id),
-  CONSTRAINT build_modules_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE INDEX build_modules_build_id_idx ON build_modules (build_id);
-
-CREATE TABLE build_artifacts (
-  artifact_id   BIGINT        NOT NULL,
-  module_id     BIGINT        NOT NULL,
-  artifact_name VARCHAR(1024) NOT NULL,
-  artifact_type VARCHAR(64),
-  sha1          CHAR(40),
-  md5           CHAR(32),
-  CONSTRAINT build_artifacts_pk PRIMARY KEY (artifact_id),
-  CONSTRAINT build_artifacts_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX build_artifacts_module_id_idx ON build_artifacts (module_id);
-CREATE INDEX build_artifacts_sha1_idx ON build_artifacts (sha1);
-CREATE INDEX build_artifacts_md5_idx ON build_artifacts (md5);
-
-CREATE TABLE build_dependencies (
-  dependency_id      BIGINT        NOT NULL,
-  module_id          BIGINT        NOT NULL,
-  dependency_name_id VARCHAR(1024) NOT NULL,
-  dependency_scopes  VARCHAR(1024),
-  dependency_type    VARCHAR(64),
-  sha1               CHAR(40),
-  md5                CHAR(32),
-  CONSTRAINT build_dependencies_pk PRIMARY KEY (dependency_id),
-  CONSTRAINT build_dependencies_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX build_dependencies_module_idx ON build_dependencies (module_id);
-CREATE INDEX build_dependencies_sha1_idx ON build_dependencies (sha1);
-CREATE INDEX build_dependencies_md5_idx ON build_dependencies (md5);
-
-CREATE TABLE module_props (
-  prop_id    BIGINT NOT NULL,
-  module_id  BIGINT NOT NULL,
-  prop_key   VARCHAR(255),
-  prop_value VARCHAR(2048),
-  CONSTRAINT module_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT module_props_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX module_props_module_id_idx ON module_props (module_id);
-CREATE INDEX module_props_prop_key_idx ON module_props (prop_key);
-CREATE INDEX module_props_prop_value_idx ON module_props (prop_value);
-
-CREATE TABLE db_properties (
-  installation_date    BIGINT      NOT NULL,
-  artifactory_version  VARCHAR(30) NOT NULL,
-  artifactory_revision INT,
-  artifactory_release  BIGINT,
-  CONSTRAINT db_properties_pk PRIMARY KEY (installation_date)
-);
-
-CREATE TABLE artifactory_servers (
-  server_id                VARCHAR(41) NOT NULL,
-  start_time               BIGINT      NOT NULL,
-  context_url              VARCHAR(255),
-  membership_port          INT,
-  server_state             VARCHAR(12) NOT NULL,
-  server_role              VARCHAR(12) NOT NULL,
-  last_heartbeat           BIGINT      NOT NULL,
-  artifactory_version      VARCHAR(30) NOT NULL,
-  artifactory_revision     INT,
-  artifactory_release      BIGINT,
-  artifactory_running_mode VARCHAR(12) NOT NULL,
-  license_hash             VARCHAR(41) NOT NULL,
-  CONSTRAINT artifactory_servers_pk PRIMARY KEY (server_id)
-);
diff --git a/storage/db/src/main/resources/mysql/mysql.sql b/storage/db/src/main/resources/mysql/mysql.sql
deleted file mode 100644
index 4a79b93..0000000
--- a/storage/db/src/main/resources/mysql/mysql.sql
+++ /dev/null
@@ -1,351 +0,0 @@
-CREATE TABLE unique_ids (
-  index_type VARCHAR(32) NOT NULL,
-  current_id BIGINT      NOT NULL,
-  CONSTRAINT unique_ids_pk PRIMARY KEY (index_type)
-);
-
-CREATE TABLE binaries (
-  sha1       CHAR(40) NOT NULL,
-  md5        CHAR(32) NOT NULL,
-  bin_length BIGINT   NOT NULL,
-  CONSTRAINT binaries_pk PRIMARY KEY (sha1)
-);
-CREATE UNIQUE INDEX binaries_md5_idx ON binaries (md5);
-
-CREATE TABLE binary_blobs (
-  sha1 CHAR(40) NOT NULL,
-  data LONGBLOB,
-  CONSTRAINT binary_blobs_pk PRIMARY KEY (sha1)
-);
-
-CREATE TABLE nodes (
-  node_id       BIGINT        NOT NULL,
-  node_type     TINYINT       NOT NULL,
-  repo          VARCHAR(64)   NOT NULL,
-  node_path     VARCHAR(1024) NOT NULL,
-  node_name     VARCHAR(255)  NOT NULL,
-  depth         TINYINT       NOT NULL,
-  created       BIGINT        NOT NULL,
-  created_by    VARCHAR(64),
-  modified      BIGINT        NOT NULL,
-  modified_by   VARCHAR(64),
-  updated       BIGINT,
-  bin_length    BIGINT,
-  sha1_actual   CHAR(40),
-  sha1_original VARCHAR(1024),
-  md5_actual    CHAR(32),
-  md5_original  VARCHAR(1024),
-  CONSTRAINT nodes_pk PRIMARY KEY (node_id),
-  CONSTRAINT nodes_binaries_fk FOREIGN KEY (sha1_actual) REFERENCES binaries (sha1)
-);
-CREATE INDEX nodes_repo_path_name_idx ON nodes (repo, node_path(255), node_name);
-CREATE INDEX nodes_node_path_idx ON nodes (node_path(255));
-CREATE INDEX nodes_node_name_idx ON nodes (node_name);
-CREATE INDEX nodes_sha1_actual_idx ON nodes (sha1_actual);
-CREATE INDEX nodes_md5_actual_idx ON nodes (md5_actual);
-
-CREATE TABLE node_props (
-  prop_id    BIGINT NOT NULL,
-  node_id    BIGINT NOT NULL,
-  prop_key   VARCHAR(255),
-  prop_value VARCHAR(4000),
-  CONSTRAINT node_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT node_props_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-CREATE INDEX node_props_node_id_idx ON node_props (node_id);
-CREATE INDEX node_props_prop_key_idx ON node_props (prop_key);
-CREATE INDEX node_props_prop_value_idx ON node_props (prop_value(255));
-
-CREATE TABLE node_meta_infos (
-  node_id           BIGINT NOT NULL,
-  props_modified    BIGINT,
-  props_modified_by VARCHAR(64),
-  CONSTRAINT node_meta_infos_pk PRIMARY KEY (node_id),
-  CONSTRAINT node_meta_infos_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-
-CREATE TABLE watches (
-  watch_id BIGINT      NOT NULL,
-  node_id  BIGINT      NOT NULL,
-  username VARCHAR(64) NOT NULL,
-  since    BIGINT      NOT NULL,
-  CONSTRAINT watches_pk PRIMARY KEY (watch_id),
-  CONSTRAINT watches_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-CREATE INDEX watches_node_id_idx ON watches (node_id);
-
-CREATE TABLE stats (
-  node_id            BIGINT NOT NULL,
-  download_count     BIGINT,
-  last_downloaded    BIGINT,
-  last_downloaded_by VARCHAR(64),
-  CONSTRAINT stats_pk PRIMARY KEY (node_id),
-  CONSTRAINT stats_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-
-CREATE TABLE stats_remote (
-  node_id            BIGINT NOT NULL,
-  origin             VARCHAR(64),
-  download_count     BIGINT,
-  last_downloaded    BIGINT,
-  last_downloaded_by VARCHAR(64),
-  path VARCHAR(1024),
-  CONSTRAINT stats_remote_pk PRIMARY KEY (node_id, origin),
-  CONSTRAINT stats_remote_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-
-CREATE TABLE indexed_archives (
-  archive_sha1        CHAR(40) NOT NULL,
-  indexed_archives_id BIGINT   NOT NULL,
-  CONSTRAINT indexed_archives_pk PRIMARY KEY (archive_sha1),
-  CONSTRAINT indexed_archives_id_uq UNIQUE (indexed_archives_id),
-  CONSTRAINT indexed_archives_binaries_fk FOREIGN KEY (archive_sha1) REFERENCES binaries (sha1)
-);
-
-CREATE TABLE archive_paths (
-  path_id    BIGINT NOT NULL,
-  entry_path VARCHAR(1024),
-  CONSTRAINT archive_paths_pk PRIMARY KEY (path_id)
-);
-CREATE INDEX archive_paths_path_idx ON archive_paths (entry_path(255));
-
-CREATE TABLE archive_names (
-  name_id    BIGINT NOT NULL,
-  entry_name VARCHAR(255),
-  CONSTRAINT archive_names_pk PRIMARY KEY (name_id)
-);
-CREATE UNIQUE INDEX archive_names_name_idx ON archive_names (entry_name);
-
-CREATE TABLE indexed_archives_entries (
-  indexed_archives_id BIGINT NOT NULL,
-  entry_path_id       BIGINT NOT NULL,
-  entry_name_id       BIGINT NOT NULL,
-  CONSTRAINT indexed_archives_entries_pk PRIMARY KEY (indexed_archives_id, entry_path_id, entry_name_id),
-  CONSTRAINT indexed_archives_id_fk FOREIGN KEY (indexed_archives_id) REFERENCES indexed_archives (indexed_archives_id),
-  CONSTRAINT entry_path_id_fk FOREIGN KEY (entry_path_id) REFERENCES archive_paths (path_id),
-  CONSTRAINT entry_name_id_fk FOREIGN KEY (entry_name_id) REFERENCES archive_names (name_id)
-);
-CREATE INDEX indexed_entries_path_idx ON indexed_archives_entries (entry_path_id);
-CREATE INDEX indexed_entries_name_idx ON indexed_archives_entries (entry_name_id);
-
-CREATE TABLE tasks (
-  task_type    VARCHAR(32)   NOT NULL,
-  task_context VARCHAR(1024) NOT NULL
-# CONSTRAINT pk_tasks PRIMARY KEY (task_type, task_context)
-);
-CREATE INDEX tasks_type_context_idx ON tasks (task_type, task_context(255));
-
-CREATE TABLE configs (
-  config_name VARCHAR(255) NOT NULL,
-  data        LONGBLOB     NOT NULL,
-  CONSTRAINT configs_pk PRIMARY KEY (config_name)
-);
-
-CREATE TABLE users (
-  user_id           BIGINT      NOT NULL,
-  username          VARCHAR(64) NOT NULL,
-  password          VARCHAR(128),
-  salt              VARCHAR(128),
-  email             VARCHAR(128),
-  gen_password_key  VARCHAR(128),
-  admin             TINYINT,
-  enabled           TINYINT,
-  updatable_profile TINYINT,
-  realm             VARCHAR(255),
-  private_key       VARCHAR(512),
-  public_key        VARCHAR(255),
-  last_login_time   BIGINT,
-  last_login_ip     VARCHAR(42),
-  last_access_time  BIGINT,
-  last_access_ip    VARCHAR(42),
-  bintray_auth      VARCHAR(512),
-  locked            TINYINT,
-  credentials_expired  TINYINT,
-  CONSTRAINT users_pk PRIMARY KEY (user_id)
-);
-CREATE UNIQUE INDEX users_username_idx ON users (username);
-
-CREATE TABLE user_props (
-  user_id    BIGINT      NOT NULL,
-  prop_key   VARCHAR(64) NOT NULL,
-  prop_value VARCHAR(2048),
-  CONSTRAINT user_props_pk PRIMARY KEY (user_id, prop_key),
-  CONSTRAINT user_props_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id)
-);
-
-CREATE TABLE groups (
-  group_id         BIGINT      NOT NULL,
-  group_name       VARCHAR(64) NOT NULL,
-  description      VARCHAR(1024),
-  default_new_user TINYINT,
-  realm            VARCHAR(255),
-  realm_attributes VARCHAR(512),
-  CONSTRAINT groups_pk PRIMARY KEY (group_id)
-);
-CREATE UNIQUE INDEX groups_group_name_idx ON groups (group_name);
-
-CREATE TABLE users_groups (
-  user_id  BIGINT NOT NULL,
-  group_id BIGINT NOT NULL,
-  realm    VARCHAR(255),
-  CONSTRAINT users_groups_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id),
-  CONSTRAINT users_groups_groups_fk FOREIGN KEY (group_id) REFERENCES groups (group_id)
-);
-CREATE UNIQUE INDEX users_groups_idx ON users_groups (user_id, group_id);
-
-CREATE TABLE permission_targets (
-  perm_target_id   BIGINT      NOT NULL,
-  perm_target_name VARCHAR(64) NOT NULL,
-  includes         VARCHAR(1024),
-  excludes         VARCHAR(1024),
-  CONSTRAINT permission_targets_pk PRIMARY KEY (perm_target_id)
-);
-CREATE UNIQUE INDEX permission_targets_name_idx ON permission_targets (perm_target_name);
-
-CREATE TABLE permission_target_repos (
-  perm_target_id BIGINT      NOT NULL,
-  repo_key       VARCHAR(64) NOT NULL,
-  CONSTRAINT permission_target_repos_fk FOREIGN KEY (perm_target_id) REFERENCES permission_targets (perm_target_id)
-);
-
-CREATE TABLE acls (
-  acl_id         BIGINT NOT NULL,
-  perm_target_id BIGINT,
-  modified       BIGINT,
-  modified_by    VARCHAR(64),
-  CONSTRAINT acls_pk PRIMARY KEY (acl_id),
-  CONSTRAINT acls_permission_targets_fk FOREIGN KEY (perm_target_id) REFERENCES permission_targets (perm_target_id)
-);
-CREATE INDEX acls_perm_target_id_idx ON acls (perm_target_id);
-
-CREATE TABLE aces (
-  ace_id   BIGINT   NOT NULL,
-  acl_id   BIGINT   NOT NULL,
-  mask     SMALLINT NOT NULL,
-  user_id  BIGINT,
-  group_id BIGINT,
-  CONSTRAINT aces_pk PRIMARY KEY (ace_id),
-  CONSTRAINT aces_acls_fk FOREIGN KEY (acl_id) REFERENCES acls (acl_id),
-  CONSTRAINT aces_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id),
-  CONSTRAINT aces_groups_fk FOREIGN KEY (group_id) REFERENCES groups (group_id)
-);
-
-CREATE TABLE builds (
-  build_id     BIGINT       NOT NULL,
-  build_name   VARCHAR(255) NOT NULL,
-  build_number VARCHAR(255) NOT NULL,
-  build_date   BIGINT       NOT NULL,
-  ci_url       VARCHAR(1024),
-  created      BIGINT       NOT NULL,
-  created_by   VARCHAR(64),
-  modified     BIGINT,
-  modified_by  VARCHAR(64),
-  CONSTRAINT builds_pk PRIMARY KEY (build_id)
-);
-CREATE UNIQUE INDEX builds_name_number_date_idx ON builds (build_name, build_number, build_date);
-
-CREATE TABLE build_jsons (
-  build_id        BIGINT NOT NULL,
-  build_info_json LONGBLOB,
-  CONSTRAINT build_jsons_pk PRIMARY KEY (build_id),
-  CONSTRAINT build_jsons_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-
-CREATE TABLE build_promotions (
-  build_id          BIGINT      NOT NULL,
-  created           BIGINT      NOT NULL,
-  created_by        VARCHAR(64),
-  status            VARCHAR(64) NOT NULL,
-  repo              VARCHAR(64),
-  promotion_comment VARCHAR(1024),
-  ci_user           VARCHAR(64),
-  CONSTRAINT build_promotions_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE UNIQUE INDEX build_promotions_created_idx ON build_promotions (build_id, created);
-CREATE INDEX build_promotions_status_idx ON build_promotions (status);
-
-CREATE TABLE build_props (
-  prop_id    BIGINT NOT NULL,
-  build_id   BIGINT NOT NULL,
-  prop_key   VARCHAR(255),
-  prop_value VARCHAR(2048),
-  CONSTRAINT build_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT build_props_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE INDEX build_props_build_id_idx ON build_props (build_id);
-CREATE INDEX build_props_prop_key_idx ON build_props (prop_key);
-CREATE INDEX build_props_prop_value_idx ON build_props (prop_value(255));
-
-CREATE TABLE build_modules (
-  module_id      BIGINT        NOT NULL,
-  build_id       BIGINT        NOT NULL,
-  module_name_id VARCHAR(1024) NOT NULL,
-  CONSTRAINT build_modules_pk PRIMARY KEY (module_id),
-  CONSTRAINT build_modules_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE INDEX build_modules_build_id_idx ON build_modules (build_id);
-
-CREATE TABLE build_artifacts (
-  artifact_id   BIGINT        NOT NULL,
-  module_id     BIGINT        NOT NULL,
-  artifact_name VARCHAR(1024) NOT NULL,
-  artifact_type VARCHAR(64),
-  sha1          CHAR(40),
-  md5           CHAR(32),
-  CONSTRAINT build_artifacts_pk PRIMARY KEY (artifact_id),
-  CONSTRAINT build_artifacts_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX build_artifacts_module_id_idx ON build_artifacts (module_id);
-CREATE INDEX build_artifacts_sha1_idx ON build_artifacts (sha1);
-CREATE INDEX build_artifacts_md5_idx ON build_artifacts (md5);
-
-CREATE TABLE build_dependencies (
-  dependency_id      BIGINT        NOT NULL,
-  module_id          BIGINT        NOT NULL,
-  dependency_name_id VARCHAR(1024) NOT NULL,
-  dependency_scopes  VARCHAR(1024),
-  dependency_type    VARCHAR(64),
-  sha1               CHAR(40),
-  md5                CHAR(32),
-  CONSTRAINT build_dependencies_pk PRIMARY KEY (dependency_id),
-  CONSTRAINT build_dependencies_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX build_dependencies_module_idx ON build_dependencies (module_id);
-CREATE INDEX build_dependencies_sha1_idx ON build_dependencies (sha1);
-CREATE INDEX build_dependencies_md5_idx ON build_dependencies (md5);
-
-CREATE TABLE module_props (
-  prop_id    BIGINT NOT NULL,
-  module_id  BIGINT NOT NULL,
-  prop_key   VARCHAR(255),
-  prop_value VARCHAR(2048),
-  CONSTRAINT module_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT module_props_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX module_props_module_id_idx ON module_props (module_id);
-CREATE INDEX module_props_prop_key_idx ON module_props (prop_key);
-CREATE INDEX module_props_prop_value_idx ON module_props (prop_value(255));
-
-CREATE TABLE db_properties (
-  installation_date    BIGINT      NOT NULL,
-  artifactory_version  VARCHAR(30) NOT NULL,
-  artifactory_revision INT,
-  artifactory_release  BIGINT,
-  CONSTRAINT db_properties_pk PRIMARY KEY (installation_date)
-);
-
-CREATE TABLE artifactory_servers (
-  server_id                VARCHAR(41) NOT NULL,
-  start_time               BIGINT      NOT NULL,
-  context_url              VARCHAR(255),
-  membership_port          INT,
-  server_state             VARCHAR(12) NOT NULL,
-  server_role              VARCHAR(12) NOT NULL,
-  last_heartbeat           BIGINT      NOT NULL,
-  artifactory_version      VARCHAR(30) NOT NULL,
-  artifactory_revision     INT,
-  artifactory_release      BIGINT,
-  artifactory_running_mode VARCHAR(12) NOT NULL,
-  license_hash             VARCHAR(41) NOT NULL,
-  CONSTRAINT artifactory_servers_pk PRIMARY KEY (server_id)
-);
diff --git a/storage/db/src/main/resources/oracle/oracle.sql b/storage/db/src/main/resources/oracle/oracle.sql
deleted file mode 100644
index 04d40d2..0000000
--- a/storage/db/src/main/resources/oracle/oracle.sql
+++ /dev/null
@@ -1,351 +0,0 @@
-CREATE TABLE unique_ids (
-  index_type VARCHAR2(32)  NOT NULL,
-  current_id NUMBER(19, 0) NOT NULL,
-  CONSTRAINT unique_ids_pk PRIMARY KEY (index_type)
-);
-
-CREATE TABLE binaries (
-  sha1       CHAR(40)      NOT NULL,
-  md5        CHAR(32)      NOT NULL,
-  bin_length NUMBER(19, 0) NOT NULL,
-  CONSTRAINT binaries_pk PRIMARY KEY (sha1)
-);
-CREATE UNIQUE INDEX binaries_md5_idx ON binaries (md5);
-
-CREATE TABLE binary_blobs (
-  sha1 CHAR(40) NOT NULL,
-  data BLOB,
-  CONSTRAINT binary_blobs_pk PRIMARY KEY (sha1)
-);
-
-CREATE TABLE nodes (
-  node_id       NUMBER(19, 0)  NOT NULL,
-  node_type     NUMBER(5, 0)   NOT NULL,
-  repo          VARCHAR2(64)   NOT NULL,
-  node_path     VARCHAR2(1024) NOT NULL,
-  node_name     VARCHAR2(255)  NOT NULL,
-  depth         NUMBER(5, 0)   NOT NULL,
-  created       NUMBER(19, 0)  NOT NULL,
-  created_by    VARCHAR2(64),
-  modified      NUMBER(19, 0)  NOT NULL,
-  modified_by   VARCHAR2(64),
-  updated       NUMBER(19, 0),
-  bin_length    NUMBER(19, 0),
-  sha1_actual   CHAR(40),
-  sha1_original VARCHAR2(1024),
-  md5_actual    CHAR(32),
-  md5_original  VARCHAR2(1024),
-  CONSTRAINT nodes_pk PRIMARY KEY (node_id),
-  CONSTRAINT nodes_binaries_fk FOREIGN KEY (sha1_actual) REFERENCES binaries (sha1)
-);
-CREATE UNIQUE INDEX nodes_repo_path_name_idx ON nodes (repo, node_path, node_name);
-CREATE INDEX nodes_node_path_idx ON nodes (node_path);
-CREATE INDEX nodes_node_name_idx ON nodes (node_name);
-CREATE INDEX nodes_sha1_actual_idx ON nodes (sha1_actual);
-CREATE INDEX nodes_md5_actual_idx ON nodes (md5_actual);
-
-CREATE TABLE node_props (
-  prop_id    NUMBER(19, 0) NOT NULL,
-  node_id    NUMBER(19, 0) NOT NULL,
-  prop_key   VARCHAR2(255),
-  prop_value VARCHAR2(4000),
-  CONSTRAINT node_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT node_props_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-CREATE INDEX node_props_node_id_idx ON node_props (node_id);
-CREATE INDEX node_props_prop_key_idx ON node_props (prop_key);
-CREATE INDEX node_props_prop_value_idx ON node_props (prop_value);
-
-CREATE TABLE node_meta_infos (
-  node_id           NUMBER(19, 0) NOT NULL,
-  props_modified    NUMBER(19, 0),
-  props_modified_by VARCHAR2(64),
-  CONSTRAINT node_meta_infos_pk PRIMARY KEY (node_id),
-  CONSTRAINT node_meta_infos_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-
-CREATE TABLE watches (
-  watch_id NUMBER(19, 0) NOT NULL,
-  node_id  NUMBER(19, 0) NOT NULL,
-  username VARCHAR2(64)  NOT NULL,
-  since    NUMBER(19, 0) NOT NULL,
-  CONSTRAINT watches_pk PRIMARY KEY (watch_id),
-  CONSTRAINT watches_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-CREATE INDEX watches_node_id_idx ON watches (node_id);
-
-CREATE TABLE stats (
-  node_id            NUMBER(19, 0) NOT NULL,
-  download_count     NUMBER(19, 0),
-  last_downloaded    NUMBER(19, 0),
-  last_downloaded_by VARCHAR2(64),
-  CONSTRAINT stats_pk PRIMARY KEY (node_id),
-  CONSTRAINT stats_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-
-CREATE TABLE stats_remote (
-  node_id            NUMBER(19, 0) NOT NULL,
-  origin             VARCHAR2(64),
-  download_count     NUMBER(19, 0),
-  last_downloaded    NUMBER(19, 0),
-  last_downloaded_by VARCHAR2(64),
-  path VARCHAR(1024),
-  CONSTRAINT stats_remote_pk PRIMARY KEY (node_id, origin),
-  CONSTRAINT stats_remote_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-
-CREATE TABLE indexed_archives (
-  archive_sha1        CHAR(40)      NOT NULL,
-  indexed_archives_id NUMBER(19, 0) NOT NULL,
-  CONSTRAINT indexed_archives_pk PRIMARY KEY (archive_sha1),
-  CONSTRAINT indexed_archives_id_uq UNIQUE (indexed_archives_id),
-  CONSTRAINT indexed_archives_binaries_fk FOREIGN KEY (archive_sha1) REFERENCES binaries (sha1)
-);
-
-CREATE TABLE archive_paths (
-  path_id    NUMBER(19, 0) NOT NULL,
-  entry_path VARCHAR2(1024),
-  CONSTRAINT archive_paths_pk PRIMARY KEY (path_id)
-);
-CREATE UNIQUE INDEX archive_paths_path_idx ON archive_paths (entry_path);
-
-CREATE TABLE archive_names (
-  name_id    NUMBER(19, 0) NOT NULL,
-  entry_name VARCHAR2(255),
-  CONSTRAINT archive_names_pk PRIMARY KEY (name_id)
-);
-CREATE UNIQUE INDEX archive_names_name_idx ON archive_names (entry_name);
-
-CREATE TABLE indexed_archives_entries (
-  indexed_archives_id NUMBER(19, 0) NOT NULL,
-  entry_path_id       NUMBER(19, 0) NOT NULL,
-  entry_name_id       NUMBER(19, 0) NOT NULL,
-  CONSTRAINT indexed_archives_entries_pk PRIMARY KEY (indexed_archives_id, entry_path_id, entry_name_id),
-  CONSTRAINT indexed_archives_id_fk FOREIGN KEY (indexed_archives_id) REFERENCES indexed_archives (indexed_archives_id),
-  CONSTRAINT entry_path_id_fk FOREIGN KEY (entry_path_id) REFERENCES archive_paths (path_id),
-  CONSTRAINT entry_name_id_fk FOREIGN KEY (entry_name_id) REFERENCES archive_names (name_id)
-);
-CREATE INDEX indexed_entries_path_idx ON indexed_archives_entries (entry_path_id);
-CREATE INDEX indexed_entries_name_idx ON indexed_archives_entries (entry_name_id);
-
-CREATE TABLE tasks (
-  task_type    VARCHAR2(32)   NOT NULL,
-  task_context VARCHAR2(1024) NOT NULL
--- CONSTRAINT pk_tasks PRIMARY KEY (task_type, task_context)
-);
-CREATE INDEX tasks_type_context_idx ON tasks (task_type, task_context);
-
-CREATE TABLE configs (
-  config_name VARCHAR2(255) NOT NULL,
-  data        BLOB          NOT NULL,
-  CONSTRAINT configs_pk PRIMARY KEY (config_name)
-);
-
-CREATE TABLE users (
-  user_id           NUMBER(19, 0) NOT NULL,
-  username          VARCHAR2(64)  NOT NULL,
-  password          VARCHAR2(128),
-  salt              VARCHAR2(128),
-  email             VARCHAR2(128),
-  gen_password_key  VARCHAR2(128),
-  admin             NUMBER(5, 0),
-  enabled           NUMBER(5, 0),
-  updatable_profile NUMBER(5, 0),
-  realm             VARCHAR2(255),
-  private_key       VARCHAR2(512),
-  public_key        VARCHAR2(255),
-  last_login_time   NUMBER(19, 0),
-  last_login_ip     VARCHAR2(42),
-  last_access_time  NUMBER(19, 0),
-  last_access_ip    VARCHAR2(42),
-  bintray_auth      VARCHAR2(512),
-  locked            NUMBER(5, 0),
-  credentials_expired  NUMBER(5, 0),
-  CONSTRAINT users_pk PRIMARY KEY (user_id)
-);
-CREATE UNIQUE INDEX users_username_idx ON users (username);
-
-CREATE TABLE user_props (
-  user_id    NUMBER(19, 0) NOT NULL,
-  prop_key   VARCHAR(64) NOT NULL,
-  prop_value VARCHAR(2048),
-  CONSTRAINT user_props_pk PRIMARY KEY (user_id, prop_key),
-  CONSTRAINT user_props_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id)
-);
-
-CREATE TABLE groups (
-  group_id         NUMBER(19, 0) NOT NULL,
-  group_name       VARCHAR2(64)  NOT NULL,
-  description      VARCHAR2(1024),
-  default_new_user NUMBER(5, 0),
-  realm            VARCHAR2(255),
-  realm_attributes VARCHAR2(512),
-  CONSTRAINT groups_pk PRIMARY KEY (group_id)
-);
-CREATE UNIQUE INDEX groups_group_name_idx ON groups (group_name);
-
-CREATE TABLE users_groups (
-  user_id  NUMBER(19, 0) NOT NULL,
-  group_id NUMBER(19, 0) NOT NULL,
-  realm    VARCHAR2(255),
-  CONSTRAINT users_groups_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id),
-  CONSTRAINT users_groups_groups_fk FOREIGN KEY (group_id) REFERENCES groups (group_id)
-);
-CREATE UNIQUE INDEX users_groups_idx ON users_groups (user_id, group_id);
-
-CREATE TABLE permission_targets (
-  perm_target_id   NUMBER(19, 0) NOT NULL,
-  perm_target_name VARCHAR2(64)  NOT NULL,
-  includes         VARCHAR2(1024),
-  excludes         VARCHAR2(1024),
-  CONSTRAINT permission_targets_pk PRIMARY KEY (perm_target_id)
-);
-CREATE UNIQUE INDEX permission_targets_name_idx ON permission_targets (perm_target_name);
-
-CREATE TABLE permission_target_repos (
-  perm_target_id NUMBER(19, 0) NOT NULL,
-  repo_key       VARCHAR2(64)  NOT NULL,
-  CONSTRAINT permission_target_repos_fk FOREIGN KEY (perm_target_id) REFERENCES permission_targets (perm_target_id)
-);
-
-CREATE TABLE acls (
-  acl_id         NUMBER(19, 0) NOT NULL,
-  perm_target_id NUMBER(19, 0),
-  modified       NUMBER(19, 0),
-  modified_by    VARCHAR2(64),
-  CONSTRAINT acls_pk PRIMARY KEY (acl_id),
-  CONSTRAINT acls_permission_targets_fk FOREIGN KEY (perm_target_id) REFERENCES permission_targets (perm_target_id)
-);
-CREATE INDEX acls_perm_target_id_idx ON acls (perm_target_id);
-
-CREATE TABLE aces (
-  ace_id   NUMBER(19, 0) NOT NULL,
-  acl_id   NUMBER(19, 0) NOT NULL,
-  mask     NUMBER(5, 0)  NOT NULL,
-  user_id  NUMBER(19, 0),
-  group_id NUMBER(19, 0),
-  CONSTRAINT aces_pk PRIMARY KEY (ace_id),
-  CONSTRAINT aces_acls_fk FOREIGN KEY (acl_id) REFERENCES acls (acl_id),
-  CONSTRAINT aces_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id),
-  CONSTRAINT aces_groups_fk FOREIGN KEY (group_id) REFERENCES groups (group_id)
-);
-
-CREATE TABLE builds (
-  build_id     NUMBER(19, 0) NOT NULL,
-  build_name   VARCHAR2(255) NOT NULL,
-  build_number VARCHAR2(255) NOT NULL,
-  build_date   NUMBER(19, 0) NOT NULL,
-  ci_url       VARCHAR2(1024),
-  created      NUMBER(19, 0) NOT NULL,
-  created_by   VARCHAR2(64),
-  modified     NUMBER(19, 0),
-  modified_by  VARCHAR2(64),
-  CONSTRAINT builds_pk PRIMARY KEY (build_id)
-);
-CREATE UNIQUE INDEX builds_name_number_date_idx ON builds (build_name, build_number, build_date);
-
-CREATE TABLE build_jsons (
-  build_id        NUMBER(19, 0) NOT NULL,
-  build_info_json BLOB,
-  CONSTRAINT build_jsons_pk PRIMARY KEY (build_id),
-  CONSTRAINT build_jsons_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-
-CREATE TABLE build_promotions (
-  build_id          NUMBER(19, 0) NOT NULL,
-  created           NUMBER(19, 0) NOT NULL,
-  created_by        VARCHAR2(64),
-  status            VARCHAR2(64)  NOT NULL,
-  repo              VARCHAR2(64),
-  promotion_comment VARCHAR2(1024),
-  ci_user           VARCHAR2(64),
-  CONSTRAINT build_promotions_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE UNIQUE INDEX build_promotions_created_idx ON build_promotions (build_id, created);
-CREATE INDEX build_promotions_status_idx ON build_promotions (status);
-
-CREATE TABLE build_props (
-  prop_id    NUMBER(19, 0) NOT NULL,
-  build_id   NUMBER(19, 0) NOT NULL,
-  prop_key   VARCHAR2(255),
-  prop_value VARCHAR2(2048),
-  CONSTRAINT build_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT build_props_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE INDEX build_props_build_id_idx ON build_props (build_id);
-CREATE INDEX build_props_prop_key_idx ON build_props (prop_key);
-CREATE INDEX build_props_prop_value_idx ON build_props (prop_value);
-
-CREATE TABLE build_modules (
-  module_id      NUMBER(19, 0)  NOT NULL,
-  build_id       NUMBER(19, 0)  NOT NULL,
-  module_name_id VARCHAR2(1024) NOT NULL,
-  CONSTRAINT build_modules_pk PRIMARY KEY (module_id),
-  CONSTRAINT build_modules_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE INDEX build_modules_build_id_idx ON build_modules (build_id);
-
-CREATE TABLE build_artifacts (
-  artifact_id   NUMBER(19, 0)  NOT NULL,
-  module_id     NUMBER(19, 0)  NOT NULL,
-  artifact_name VARCHAR2(1024) NOT NULL,
-  artifact_type VARCHAR2(64),
-  sha1          CHAR(40),
-  md5           CHAR(32),
-  CONSTRAINT build_artifacts_pk PRIMARY KEY (artifact_id),
-  CONSTRAINT build_artifacts_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX build_artifacts_module_id_idx ON build_artifacts (module_id);
-CREATE INDEX build_artifacts_sha1_idx ON build_artifacts (sha1);
-CREATE INDEX build_artifacts_md5_idx ON build_artifacts (md5);
-
-CREATE TABLE build_dependencies (
-  dependency_id      NUMBER(19, 0)  NOT NULL,
-  module_id          NUMBER(19, 0)  NOT NULL,
-  dependency_name_id VARCHAR2(1024) NOT NULL,
-  dependency_scopes  VARCHAR2(1024),
-  dependency_type    VARCHAR2(64),
-  sha1               CHAR(40),
-  md5                CHAR(32),
-  CONSTRAINT build_dependencies_pk PRIMARY KEY (dependency_id),
-  CONSTRAINT build_dependencies_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX build_dependencies_module_idx ON build_dependencies (module_id);
-CREATE INDEX build_dependencies_sha1_idx ON build_dependencies (sha1);
-CREATE INDEX build_dependencies_md5_idx ON build_dependencies (md5);
-
-CREATE TABLE module_props (
-  prop_id    NUMBER(19, 0) NOT NULL,
-  module_id  NUMBER(19, 0) NOT NULL,
-  prop_key   VARCHAR2(255),
-  prop_value VARCHAR2(2048),
-  CONSTRAINT module_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT module_props_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX module_props_module_id_idx ON module_props (module_id);
-CREATE INDEX module_props_prop_key_idx ON module_props (prop_key);
-CREATE INDEX module_props_prop_value_idx ON module_props (prop_value);
-
-CREATE TABLE db_properties (
-  installation_date    NUMBER      NOT NULL,
-  artifactory_version  VARCHAR(30) NOT NULL,
-  artifactory_revision INT,
-  artifactory_release  NUMBER,
-  CONSTRAINT db_properties_pk PRIMARY KEY (installation_date)
-);
-
-CREATE TABLE artifactory_servers (
-  server_id                VARCHAR(41) NOT NULL,
-  start_time               NUMBER      NOT NULL,
-  context_url              VARCHAR(255),
-  membership_port          INT,
-  server_state             VARCHAR(12) NOT NULL,
-  server_role              VARCHAR(12) NOT NULL,
-  last_heartbeat           NUMBER      NOT NULL,
-  artifactory_version      VARCHAR(30) NOT NULL,
-  artifactory_revision     INT,
-  artifactory_release      NUMBER,
-  artifactory_running_mode VARCHAR(12) NOT NULL,
-  license_hash             VARCHAR(41) NOT NULL,
-  CONSTRAINT artifactory_servers_pk PRIMARY KEY (server_id)
-);
diff --git a/storage/db/src/main/resources/postgresql/postgresql.sql b/storage/db/src/main/resources/postgresql/postgresql.sql
deleted file mode 100644
index adcb35b..0000000
--- a/storage/db/src/main/resources/postgresql/postgresql.sql
+++ /dev/null
@@ -1,351 +0,0 @@
-CREATE TABLE unique_ids (
-  index_type VARCHAR(32) NOT NULL,
-  current_id BIGINT      NOT NULL,
-  CONSTRAINT unique_ids_pk PRIMARY KEY (index_type)
-);
-
-CREATE TABLE binaries (
-  sha1       CHAR(40) NOT NULL,
-  md5        CHAR(32) NOT NULL,
-  bin_length BIGINT   NOT NULL,
-  CONSTRAINT binaries_pk PRIMARY KEY (sha1)
-);
-CREATE UNIQUE INDEX binaries_md5_idx ON binaries (md5);
-
-CREATE TABLE binary_blobs (
-  sha1 CHAR(40) NOT NULL,
-  data BYTEA,
-  CONSTRAINT binary_blobs_pk PRIMARY KEY (sha1)
-);
-
-CREATE TABLE nodes (
-  node_id       BIGINT        NOT NULL,
-  node_type     SMALLINT      NOT NULL,
-  repo          VARCHAR(64)   NOT NULL,
-  node_path     VARCHAR(1024) NOT NULL,
-  node_name     VARCHAR(255)  NOT NULL,
-  depth         SMALLINT      NOT NULL,
-  created       BIGINT        NOT NULL,
-  created_by    VARCHAR(64),
-  modified      BIGINT        NOT NULL,
-  modified_by   VARCHAR(64),
-  updated       BIGINT,
-  bin_length    BIGINT,
-  sha1_actual   CHAR(40),
-  sha1_original VARCHAR(1024),
-  md5_actual    CHAR(32),
-  md5_original  VARCHAR(1024),
-  CONSTRAINT nodes_pk PRIMARY KEY (node_id),
-  CONSTRAINT nodes_binaries_fk FOREIGN KEY (sha1_actual) REFERENCES binaries (sha1)
-);
-CREATE UNIQUE INDEX nodes_repo_path_name_idx ON nodes (repo, node_path, node_name);
-CREATE INDEX nodes_node_path_idx ON nodes (node_path);
-CREATE INDEX nodes_node_name_idx ON nodes (node_name);
-CREATE INDEX nodes_sha1_actual_idx ON nodes (sha1_actual);
-CREATE INDEX nodes_md5_actual_idx ON nodes (md5_actual);
-
-CREATE TABLE node_props (
-  prop_id    BIGINT NOT NULL,
-  node_id    BIGINT NOT NULL,
-  prop_key   VARCHAR(255),
-  prop_value VARCHAR(4000),
-  CONSTRAINT node_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT node_props_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-CREATE INDEX node_props_node_id_idx ON node_props (node_id);
-CREATE INDEX node_props_prop_key_idx ON node_props (prop_key);
-CREATE INDEX node_props_prop_value_idx ON node_props (substr(prop_value, 1, 255));
-
-CREATE TABLE node_meta_infos (
-  node_id           BIGINT NOT NULL,
-  props_modified    BIGINT,
-  props_modified_by VARCHAR(64),
-  CONSTRAINT node_meta_infos_pk PRIMARY KEY (node_id),
-  CONSTRAINT node_meta_infos_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-
-CREATE TABLE watches (
-  watch_id BIGINT      NOT NULL,
-  node_id  BIGINT      NOT NULL,
-  username VARCHAR(64) NOT NULL,
-  since    BIGINT      NOT NULL,
-  CONSTRAINT watches_pk PRIMARY KEY (watch_id),
-  CONSTRAINT watches_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-CREATE INDEX watches_node_id_idx ON watches (node_id);
-
-CREATE TABLE stats (
-  node_id            BIGINT NOT NULL,
-  download_count     BIGINT,
-  last_downloaded    BIGINT,
-  last_downloaded_by VARCHAR(64),
-  CONSTRAINT stats_pk PRIMARY KEY (node_id),
-  CONSTRAINT stats_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-
-CREATE TABLE stats_remote (
-  node_id            BIGINT NOT NULL,
-  origin             VARCHAR(64),
-  download_count     BIGINT,
-  last_downloaded    BIGINT,
-  last_downloaded_by VARCHAR(64),
-  path VARCHAR(1024),
-  CONSTRAINT stats_remote_pk PRIMARY KEY (node_id, origin),
-  CONSTRAINT stats_remote_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-
-CREATE TABLE indexed_archives (
-  archive_sha1        CHAR(40) NOT NULL,
-  indexed_archives_id BIGINT   NOT NULL,
-  CONSTRAINT indexed_archives_pk PRIMARY KEY (archive_sha1),
-  CONSTRAINT indexed_archives_id_uq UNIQUE (indexed_archives_id),
-  CONSTRAINT indexed_archives_binaries_fk FOREIGN KEY (archive_sha1) REFERENCES binaries (sha1)
-);
-
-CREATE TABLE archive_paths (
-  path_id    BIGINT NOT NULL,
-  entry_path VARCHAR(1024),
-  CONSTRAINT archive_paths_pk PRIMARY KEY (path_id)
-);
-CREATE UNIQUE INDEX archive_paths_path_idx ON archive_paths (entry_path);
-
-CREATE TABLE archive_names (
-  name_id    BIGINT NOT NULL,
-  entry_name VARCHAR(255),
-  CONSTRAINT archive_names_pk PRIMARY KEY (name_id)
-);
-CREATE UNIQUE INDEX archive_names_name_idx ON archive_names (entry_name);
-
-CREATE TABLE indexed_archives_entries (
-  indexed_archives_id BIGINT NOT NULL,
-  entry_path_id       BIGINT NOT NULL,
-  entry_name_id       BIGINT NOT NULL,
-  CONSTRAINT indexed_archives_entries_pk PRIMARY KEY (indexed_archives_id, entry_path_id, entry_name_id),
-  CONSTRAINT indexed_archives_id_fk FOREIGN KEY (indexed_archives_id) REFERENCES indexed_archives (indexed_archives_id),
-  CONSTRAINT entry_path_id_fk FOREIGN KEY (entry_path_id) REFERENCES archive_paths (path_id),
-  CONSTRAINT entry_name_id_fk FOREIGN KEY (entry_name_id) REFERENCES archive_names (name_id)
-);
-CREATE INDEX indexed_entries_path_idx ON indexed_archives_entries (entry_path_id);
-CREATE INDEX indexed_entries_name_idx ON indexed_archives_entries (entry_name_id);
-
-CREATE TABLE tasks (
-  task_type    VARCHAR(32)   NOT NULL,
-  task_context VARCHAR(1024) NOT NULL
--- CONSTRAINT pk_tasks PRIMARY KEY (task_type, task_context)
-);
-CREATE INDEX tasks_type_context_idx ON tasks (task_type, task_context);
-
-CREATE TABLE configs (
-  config_name VARCHAR(255) NOT NULL,
-  data        BYTEA        NOT NULL,
-  CONSTRAINT configs_pk PRIMARY KEY (config_name)
-);
-
-CREATE TABLE users (
-  user_id           BIGINT      NOT NULL,
-  username          VARCHAR(64) NOT NULL,
-  password          VARCHAR(128),
-  salt              VARCHAR(128),
-  email             VARCHAR(128),
-  gen_password_key  VARCHAR(128),
-  admin             SMALLINT,
-  enabled           SMALLINT,
-  updatable_profile SMALLINT,
-  realm             VARCHAR(255),
-  private_key       VARCHAR(512),
-  public_key        VARCHAR(255),
-  last_login_time   BIGINT,
-  last_login_ip     VARCHAR(42),
-  last_access_time  BIGINT,
-  last_access_ip    VARCHAR(42),
-  bintray_auth      VARCHAR(512),
-  locked            SMALLINT,
-  credentials_expired  SMALLINT,
-  CONSTRAINT users_pk PRIMARY KEY (user_id)
-);
-CREATE UNIQUE INDEX users_username_idx ON users (username);
-
-CREATE TABLE user_props (
-  user_id    BIGINT      NOT NULL,
-  prop_key   VARCHAR(64) NOT NULL,
-  prop_value VARCHAR(2048),
-  CONSTRAINT user_props_pk PRIMARY KEY (user_id, prop_key),
-  CONSTRAINT user_props_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id)
-);
-
-CREATE TABLE groups (
-  group_id         BIGINT      NOT NULL,
-  group_name       VARCHAR(64) NOT NULL,
-  description      VARCHAR(1024),
-  default_new_user SMALLINT,
-  realm            VARCHAR(255),
-  realm_attributes VARCHAR(512),
-  CONSTRAINT groups_pk PRIMARY KEY (group_id)
-);
-CREATE UNIQUE INDEX groups_group_name_idx ON groups (group_name);
-
-CREATE TABLE users_groups (
-  user_id  BIGINT NOT NULL,
-  group_id BIGINT NOT NULL,
-  realm    VARCHAR(255),
-  CONSTRAINT users_groups_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id),
-  CONSTRAINT users_groups_groups_fk FOREIGN KEY (group_id) REFERENCES groups (group_id)
-);
-CREATE UNIQUE INDEX users_groups_idx ON users_groups (user_id, group_id);
-
-CREATE TABLE permission_targets (
-  perm_target_id   BIGINT      NOT NULL,
-  perm_target_name VARCHAR(64) NOT NULL,
-  includes         VARCHAR(1024),
-  excludes         VARCHAR(1024),
-  CONSTRAINT permission_targets_pk PRIMARY KEY (perm_target_id)
-);
-CREATE UNIQUE INDEX permission_targets_name_idx ON permission_targets (perm_target_name);
-
-CREATE TABLE permission_target_repos (
-  perm_target_id BIGINT      NOT NULL,
-  repo_key       VARCHAR(64) NOT NULL,
-  CONSTRAINT permission_target_repos_fk FOREIGN KEY (perm_target_id) REFERENCES permission_targets (perm_target_id)
-);
-
-CREATE TABLE acls (
-  acl_id         BIGINT NOT NULL,
-  perm_target_id BIGINT,
-  modified       BIGINT,
-  modified_by    VARCHAR(64),
-  CONSTRAINT acls_pk PRIMARY KEY (acl_id),
-  CONSTRAINT acls_permission_targets_fk FOREIGN KEY (perm_target_id) REFERENCES permission_targets (perm_target_id)
-);
-CREATE INDEX acls_perm_target_id_idx ON acls (perm_target_id);
-
-CREATE TABLE aces (
-  ace_id   BIGINT   NOT NULL,
-  acl_id   BIGINT   NOT NULL,
-  mask     SMALLINT NOT NULL,
-  user_id  BIGINT,
-  group_id BIGINT,
-  CONSTRAINT aces_pk PRIMARY KEY (ace_id),
-  CONSTRAINT aces_acls_fk FOREIGN KEY (acl_id) REFERENCES acls (acl_id),
-  CONSTRAINT aces_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id),
-  CONSTRAINT aces_groups_fk FOREIGN KEY (group_id) REFERENCES groups (group_id)
-);
-
-CREATE TABLE builds (
-  build_id     BIGINT       NOT NULL,
-  build_name   VARCHAR(255) NOT NULL,
-  build_number VARCHAR(255) NOT NULL,
-  build_date   BIGINT       NOT NULL,
-  ci_url       VARCHAR(1024),
-  created      BIGINT       NOT NULL,
-  created_by   VARCHAR(64),
-  modified     BIGINT,
-  modified_by  VARCHAR(64),
-  CONSTRAINT builds_pk PRIMARY KEY (build_id)
-);
-CREATE UNIQUE INDEX builds_name_number_date_idx ON builds (build_name, build_number, build_date);
-
-CREATE TABLE build_jsons (
-  build_id        BIGINT NOT NULL,
-  build_info_json BYTEA,
-  CONSTRAINT build_jsons_pk PRIMARY KEY (build_id),
-  CONSTRAINT build_jsons_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-
-CREATE TABLE build_promotions (
-  build_id          BIGINT      NOT NULL,
-  created           BIGINT      NOT NULL,
-  created_by        VARCHAR(64),
-  status            VARCHAR(64) NOT NULL,
-  repo              VARCHAR(64),
-  promotion_comment VARCHAR(1024),
-  ci_user           VARCHAR(64),
-  CONSTRAINT build_promotions_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE UNIQUE INDEX build_promotions_created_idx ON build_promotions (build_id, created);
-CREATE INDEX build_promotions_status_idx ON build_promotions (status);
-
-CREATE TABLE build_props (
-  prop_id    BIGINT NOT NULL,
-  build_id   BIGINT NOT NULL,
-  prop_key   VARCHAR(255),
-  prop_value VARCHAR(2048),
-  CONSTRAINT build_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT build_props_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE INDEX build_props_build_id_idx ON build_props (build_id);
-CREATE INDEX build_props_prop_key_idx ON build_props (prop_key);
-CREATE INDEX build_props_prop_value_idx ON build_props (prop_value);
-
-CREATE TABLE build_modules (
-  module_id      BIGINT        NOT NULL,
-  build_id       BIGINT        NOT NULL,
-  module_name_id VARCHAR(1024) NOT NULL,
-  CONSTRAINT build_modules_pk PRIMARY KEY (module_id),
-  CONSTRAINT build_modules_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE INDEX build_modules_build_id_idx ON build_modules (build_id);
-
-CREATE TABLE build_artifacts (
-  artifact_id   BIGINT        NOT NULL,
-  module_id     BIGINT        NOT NULL,
-  artifact_name VARCHAR(1024) NOT NULL,
-  artifact_type VARCHAR(64),
-  sha1          CHAR(40),
-  md5           CHAR(32),
-  CONSTRAINT build_artifacts_pk PRIMARY KEY (artifact_id),
-  CONSTRAINT build_artifacts_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX build_artifacts_module_id_idx ON build_artifacts (module_id);
-CREATE INDEX build_artifacts_sha1_idx ON build_artifacts (sha1);
-CREATE INDEX build_artifacts_md5_idx ON build_artifacts (md5);
-
-CREATE TABLE build_dependencies (
-  dependency_id      BIGINT        NOT NULL,
-  module_id          BIGINT        NOT NULL,
-  dependency_name_id VARCHAR(1024) NOT NULL,
-  dependency_scopes  VARCHAR(1024),
-  dependency_type    VARCHAR(64),
-  sha1               CHAR(40),
-  md5                CHAR(32),
-  CONSTRAINT build_dependencies_pk PRIMARY KEY (dependency_id),
-  CONSTRAINT build_dependencies_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX build_dependencies_module_idx ON build_dependencies (module_id);
-CREATE INDEX build_dependencies_sha1_idx ON build_dependencies (sha1);
-CREATE INDEX build_dependencies_md5_idx ON build_dependencies (md5);
-
-CREATE TABLE module_props (
-  prop_id    BIGINT NOT NULL,
-  module_id  BIGINT NOT NULL,
-  prop_key   VARCHAR(255),
-  prop_value VARCHAR(2048),
-  CONSTRAINT module_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT module_props_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX module_props_module_id_idx ON module_props (module_id);
-CREATE INDEX module_props_prop_key_idx ON module_props (prop_key);
-CREATE INDEX module_props_prop_value_idx ON module_props (prop_value);
-
-CREATE TABLE db_properties (
-  installation_date    BIGINT      NOT NULL,
-  artifactory_version  VARCHAR(30) NOT NULL,
-  artifactory_revision INT,
-  artifactory_release  BIGINT,
-  CONSTRAINT db_properties_pk PRIMARY KEY (installation_date)
-);
-
-CREATE TABLE artifactory_servers (
-  server_id                VARCHAR(41) NOT NULL,
-  start_time               BIGINT      NOT NULL,
-  context_url              VARCHAR(255),
-  membership_port          INT,
-  server_state             VARCHAR(12) NOT NULL,
-  server_role              VARCHAR(12) NOT NULL,
-  last_heartbeat           BIGINT      NOT NULL,
-  artifactory_version      VARCHAR(30) NOT NULL,
-  artifactory_revision     INT,
-  artifactory_release      BIGINT,
-  artifactory_running_mode VARCHAR(12) NOT NULL,
-  license_hash             VARCHAR(41) NOT NULL,
-  CONSTRAINT artifactory_servers_pk PRIMARY KEY (server_id)
-);
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/aql/api/AqlApiDomainSensitiveTest.java b/storage/db/src/test/java/org/artifactory/storage/db/aql/api/AqlApiDomainSensitiveTest.java
deleted file mode 100644
index ddeb4c9..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/aql/api/AqlApiDomainSensitiveTest.java
+++ /dev/null
@@ -1,746 +0,0 @@
-package org.artifactory.storage.db.aql.api;
-
-import org.artifactory.aql.AqlException;
-import org.artifactory.aql.api.domain.sensitive.*;
-import org.artifactory.aql.model.AqlItemTypeEnum;
-import org.artifactory.aql.result.AqlEagerResult;
-import org.artifactory.aql.result.AqlJsonStreamer;
-import org.artifactory.aql.result.AqlLazyResult;
-import org.artifactory.aql.result.rows.*;
-import org.artifactory.storage.db.aql.service.AqlAbstractServiceTest.AdminPermissions;
-import org.artifactory.storage.db.aql.service.AqlServiceImpl;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.joda.time.DateTime;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.util.ReflectionTestUtils;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-
-import static org.artifactory.aql.api.internal.AqlBase.*;
-import static org.artifactory.aql.model.AqlComparatorEnum.matches;
-import static org.artifactory.aql.model.AqlItemTypeEnum.file;
-import static org.artifactory.aql.model.AqlItemTypeEnum.folder;
-import static org.fest.assertions.Assertions.assertThat;
-import static org.testng.Assert.assertTrue;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlApiDomainSensitiveTest extends DbBaseTest {
-    @Autowired
-    private AqlServiceImpl aqlService;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/aql_test.sql");
-        ReflectionTestUtils.setField(aqlService, "permissionProvider", new AdminPermissions());
-    }
-
-    /*Artifacts search*/
-    @Test
-    public void findAllItemsTest() throws AqlException {
-        AqlApiItem aql = AqlApiItem.create();
-        AqlEagerResult<AqlItem> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 11);
-    }
-
-    @Test
-    public void findAllSortedItemsTest() throws AqlException {
-        AqlApiItem aql = AqlApiItem.create().addSortElement(AqlApiItem.repo());
-        AqlEagerResult<AqlItem> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 11);
-    }
-
-    @Test
-    public void findItemsWithSort() throws AqlException {
-        AqlApiItem aql = AqlApiItem.create().
-                filter(
-                        AqlApiItem.path().matches("org*")
-                ).
-                addSortElement(AqlApiItem.name()).
-                addSortElement(AqlApiItem.repo()).
-                asc();
-        AqlEagerResult<AqlItem> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 6);
-        assertItemt(result, "repo-copy", "org/shayy/badmd5", "badmd5.jar", file);
-    }
-
-    @Test
-    public void findItemsWithSha1AndMd5() throws AqlException {
-        AqlApiItem aql = AqlApiItem.create().
-                filter(
-                        and(
-                                AqlApiItem.sha1Actual().matches("*"),
-                                AqlApiItem.sha1Orginal().matches("*"),
-                                AqlApiItem.md5Actual().matches("*"),
-                                AqlApiItem.md5Orginal().matches("*")
-                        )
-                ).
-                addSortElement(AqlApiItem.name()).
-                addSortElement(AqlApiItem.repo()).
-                asc();
-        AqlEagerResult<AqlItem> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 11);
-        assertItemt(result, "repo1", "org/yossis/tools", "test.bin", file);
-    }
-
-    @Test
-    public void findItemsWithOr() throws AqlException {
-        AqlApiItem aql = AqlApiItem.create().
-                filter(
-                        or(
-                                and(
-                                        AqlApiItem.property().key().equal("yossia"),
-                                        AqlApiItem.property().key().matches("*d")
-                                ),
-                                AqlApiItem.property().value().matches("ant")
-                        )
-                ).
-                addSortElement(AqlApiItem.name()).
-                desc();
-        AqlEagerResult<AqlItem> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 1);
-        assertItemt(result, "repo1", "ant/ant/1.5", "ant-1.5.jar", file);
-    }
-
-    @Test
-    public void findItemsWithAndOr() throws AqlException {
-        AqlApiItem aql = AqlApiItem.create().
-                filter(
-
-                        and(
-                                AqlApiItem.type().equal("any"),
-                                freezeJoin(
-                                        AqlApiItem.property().key().equal("yossis"),
-                                        AqlApiItem.property().value().matches("*ue1")
-                                ),
-                                or(
-                                        AqlApiItem.property().value().matches("value1"),
-                                        and(
-                                                freezeJoin(
-                                                        AqlApiItem.property().key().equal("yossis"),
-                                                        AqlApiItem.property().value().matches("*df")
-                                                )
-                                        )
-                                )
-                        )
-                );
-        AqlEagerResult<AqlItem> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 1);
-        assertItemt(result, "repo1", "org", "yossis", folder);
-    }
-
-    @Test
-    public void findItemsWithAndOrUsingPropertyCriteriaClause() throws AqlException {
-        AqlApiItem aql = AqlApiItem.create().
-                filter(
-                        and(
-                                AqlApiItem.type().equal("any"),
-                                AqlApiItem.property().property("yossis", matches, "*ue1"),
-                                or(
-                                        AqlApiItem.property().value().matches("value1"),
-                                        AqlApiItem.property().property("yossis", matches, "*df")
-                                )
-                        )
-                );
-        AqlEagerResult<AqlItem> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 1);
-        assertItemt(result, "repo1", "org", "yossis", folder);
-    }
-
-    @Test
-    public void multipleCriteriaOnSamePropertyRow() throws AqlException {
-        AqlApiItem aql = AqlApiItem.create().
-                filter(
-                        freezeJoin(
-                                AqlApiItem.type().equal("any"),
-                                AqlApiItem.property().key().matches("jun*"),
-                                AqlApiItem.property().key().matches("*gle")
-                        )
-                ).
-                addSortElement(AqlApiItem.name()).
-                addSortElement(AqlApiItem.repo());
-                AqlEagerResult<AqlItem> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 1);
-        assertItemt(result, "repo1", "org", "yossis", folder);
-    }
-
-    @Test
-    public void findAllProperties() throws AqlException {
-        AqlApiProperty aql = AqlApiProperty.create();
-        AqlEagerResult<AqlProperty> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 9);
-    }
-
-    @Test
-    public void findPropertiesWithFieldFilter() throws AqlException {
-        // return only the properties with the key 'yossis' from repository 'repo1'
-        AqlApiProperty aql = AqlApiProperty.create().
-                filter(
-                        and(
-                                AqlApiProperty.item().repo().equal("repo1"),
-                                propertyResultFilter(
-                                        AqlApiProperty.key().equal("yossis")
-                                )
-                        )
-                ).
-                addSortElement(AqlApiProperty.key());
-        AqlEagerResult<AqlProperty> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 2);
-        assertProperty(result, "yossis", "pdf");
-        assertProperty(result, "yossis", "value1");
-    }
-
-    @Test
-    public void singleWildCardMaching() throws AqlException {
-        // return only the properties with the key 'yossis' from repository 'repo1'
-        AqlApiProperty aql = AqlApiProperty.create().
-                filter(
-                        and(
-                                AqlApiProperty.item().repo().matches("rep?1"),
-                                propertyResultFilter(
-                                        AqlApiProperty.key().equal("yossis")
-                                )
-                        )
-                ).
-                addSortElement(AqlApiProperty.key());
-        AqlEagerResult<AqlProperty> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 2);
-        assertProperty(result, "yossis", "pdf");
-        assertProperty(result, "yossis", "value1");
-    }
-
-    @Test
-    public void archiveEntry() throws AqlException {
-        // return only the properties with the key 'yossis' from repository 'repo1'
-        AqlApiEntry aql = AqlApiEntry.create().
-                filter(
-                        and(
-                                AqlApiEntry.archive().item().repo().matches("rep?1"),
-                                AqlApiEntry.name().matches("*")
-                        )
-                ).include(AqlApiEntry.archive().item().property().key()).
-                addSortElement(AqlApiEntry.archive().item().property().key());
-        AqlEagerResult<AqlArchiveEntryItem> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 18);
-        assertArchive(result, "test.me", "another");
-        assertArchive(result, "Test", ".");
-    }
-
-    @Test
-    public void itemWithArchive() throws AqlException {
-        // return only the properties with the key 'yossis' from repository 'repo1'
-        AqlApiItem aql = AqlApiItem.create().
-                filter(
-                        and(
-                                AqlApiItem.archive().entry().name().matches("*")
-                        )
-                ).
-                include(AqlApiItem.archive().entry().path(), AqlApiItem.archive().entry().name()).
-                addSortElement(AqlApiItem.archive().entry().path()).
-                addSortElement(AqlApiItem.archive().entry().name());
-        AqlEagerResult<AqlItem> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 8);
-        assertItemt(result, "repo1", "org/yossis/tools","test.bin",AqlItemTypeEnum.file);
-    }
-
-    @Test(enabled = false)
-    public void underscoreEscape() throws AqlException {
-        // return only the properties with the key 'yossis' from repository 'repo1'
-        AqlApiProperty aql = AqlApiProperty.create().
-                filter(
-                        and(
-                                AqlApiProperty.item().repo().matches("rep_1"),
-                                propertyResultFilter(
-                                        AqlApiProperty.key().equal("yossis")
-                                )
-                        )
-                ).
-                addSortElement(AqlApiProperty.key());
-        AqlEagerResult<AqlProperty> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 0);
-    }
-
-    @Test(enabled = true)
-    public void nullUsage() throws AqlException {
-        // return only the properties with the key 'yossis' from repository 'repo1'
-        AqlApiItem aql = AqlApiItem.create().
-                filter(
-                        and(
-                                AqlApiItem.type().equal("any"),
-                                AqlApiItem.property().key().equal(null)
-                        )
-                ).
-                include(AqlApiItem.property().key(), AqlApiItem.property().value()).
-                addSortElement(AqlApiItem.property().key()).asc();
-        AqlEagerResult<AqlItem> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 21);
-    }
-
-    @Test(enabled = true)
-    public void notNullUsage() throws AqlException {
-        // return only the properties with the key 'yossis' from repository 'repo1'
-        AqlApiItem aql = AqlApiItem.create().
-                filter(
-                        and(
-                                AqlApiItem.type().equal("any"),
-                                AqlApiItem.property().key().notEquals((String) null)
-                        )
-                ).
-                include(AqlApiItem.property().key(), AqlApiItem.property().value()).
-                addSortElement(AqlApiItem.property().key()).asc();
-        AqlEagerResult<AqlItem> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 31);
-    }
-
-    @Test(enabled = true)
-    public void doNotHaveProperty() throws AqlException {
-        // return only the properties with the key 'yossis' from repository 'repo1'
-        AqlApiItem aql = AqlApiItem.create().
-                filter(
-                        and(
-                                AqlApiItem.type().equal("any"),
-                                AqlApiItem.property().key().notMatches("*")
-                        )
-                ).
-                include(AqlApiItem.property().key(), AqlApiItem.property().value()).
-                addSortElement(AqlApiItem.property().key()).asc();
-        AqlEagerResult<AqlItem> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 21);
-    }
-
-
-    @Test(enabled = false)
-    public void percentEscape() throws AqlException {
-        // return only the properties with the key 'yossis' from repository 'repo1'
-        AqlApiProperty aql = AqlApiProperty.create().
-                filter(
-                        and(
-                                AqlApiProperty.item().repo().matches("rep%1"),
-                                propertyResultFilter(
-                                        AqlApiProperty.key().equal("yossis")
-                                )
-                        )
-                ).
-                addSortElement(AqlApiProperty.key());
-        AqlEagerResult<AqlProperty> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 0);
-    }
-
-    @Test(enabled = true)
-    public void queryWithDateTest() throws AqlException {
-        // return only the properties with the key 'yossis' from repository 'repo1'
-        AqlApiProperty aql = AqlApiProperty.create().
-                filter(
-                        AqlApiProperty.item().created().greater(new DateTime(0))
-                ).
-                addSortElement(AqlApiProperty.key());
-        AqlEagerResult<AqlProperty> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 9);
-    }
-
-
-    @Test(enabled = true)
-    public void lazyResultJsonInMemoryStream() throws AqlException, IOException {
-        // return only the properties with the key 'yossis' from repository 'repo1'
-        AqlApiItem item = AqlApiItem.create();
-        item.filter(
-                //or(
-                AqlApiItem.artifact().module().build().name().matches("ba")
-                //)
-        );
-        AqlLazyResult aqlLazyResult = aqlService.executeQueryLazy(item);
-        AqlJsonStreamer aqlJsonStreamer = new AqlJsonStreamer(aqlLazyResult);
-
-        byte[] read;
-        StringBuilder builder=new StringBuilder();
-        while((read= aqlJsonStreamer.read())!=null){
-            builder.append(new String(read));
-        }
-        aqlJsonStreamer.close();
-        String string = builder.toString();
-        Assert.assertTrue(string.contains("\"size\" : 43434"));
-        Assert.assertTrue(string.contains("\"repo\" : \"repo1\""));
-        Assert.assertTrue(string.contains("\"actual_md5\" : \"302a360ecad98a34b59863c1e65bcf71\""));
-        Assert.assertTrue(string.contains("\"created_by\" : \"yossis-1\""));
-        Assert.assertTrue(string.contains("\"depth\" : 4"));
-        Assert.assertTrue(string.contains("\"original_md5\" : \"302a360ecad98a34b59863c1e65bcf71\""));
-        Assert.assertTrue(string.contains("\"actual_sha1\" : \"acab88fc2a043c2479a6de676a2f8179e9ea2167\""));
-        Assert.assertTrue(string.contains("\"path\" : \"org/yossis/tools\""));
-    }
-
-    @Test(enabled = true)
-    public void lazyResultStream() throws AqlException, IOException {
-        // return only the properties with the key 'yossis' from repository 'repo1'
-        AqlApiItem item = AqlApiItem.create();
-        item.filter(
-                //or(
-                AqlApiItem.artifact().module().build().name().matches("ba")
-                //)
-        ).limit(2000);
-        AqlLazyResult aqlLazyResult = aqlService.executeQueryLazy(item);
-        AqlJsonStreamer streamResult = new AqlJsonStreamer(aqlLazyResult);
-
-        byte[] read = streamResult.read();
-        StringBuilder builder = new StringBuilder();
-        while (read != null) {
-            builder.append(new String(read));
-            read = streamResult.read();
-        }
-        streamResult.close();
-        String string = builder.toString();
-        Assert.assertTrue(string.contains("\"size\" : 43434"));
-        Assert.assertTrue(string.contains("\"repo\" : \"repo1\""));
-        Assert.assertTrue(string.contains("\"actual_md5\" : \"302a360ecad98a34b59863c1e65bcf71\""));
-        Assert.assertTrue(string.contains("\"created_by\" : \"yossis-1\""));
-        Assert.assertTrue(string.contains("\"depth\" : 4"));
-        Assert.assertTrue(string.contains("\"original_md5\" : \"302a360ecad98a34b59863c1e65bcf71\""));
-        Assert.assertTrue(string.contains("\"actual_sha1\" : \"acab88fc2a043c2479a6de676a2f8179e9ea2167\""));
-        Assert.assertTrue(string.contains("\"path\" : \"org/yossis/tools\""));
-        Assert.assertTrue(string.contains("\"total\" : 1"));
-        Assert.assertTrue(!string.contains("\"limit\" : 20000"));
-    }
-
-    @Test(enabled = true)
-    public void lazyResultStreamWithLimit() throws AqlException, IOException {
-        // return only the properties with the key 'yossis' from repository 'repo1'
-        AqlApiItem item = AqlApiItem.create();
-        item.filter(
-                //or(
-                AqlApiItem.artifact().module().build().name().matches("ba")
-                //)
-        ).limit(2);
-        AqlLazyResult aqlLazyResult = aqlService.executeQueryLazy(item);
-        AqlJsonStreamer streamResult = new AqlJsonStreamer(aqlLazyResult);
-
-        byte[] read = streamResult.read();
-        StringBuilder builder = new StringBuilder();
-        while (read != null) {
-            builder.append(new String(read));
-            read = streamResult.read();
-        }
-        streamResult.close();
-        String string = builder.toString();
-        Assert.assertTrue(string.contains("\"size\" : 43434"));
-        Assert.assertTrue(string.contains("\"repo\" : \"repo1\""));
-        Assert.assertTrue(string.contains("\"actual_md5\" : \"302a360ecad98a34b59863c1e65bcf71\""));
-        Assert.assertTrue(string.contains("\"created_by\" : \"yossis-1\""));
-        Assert.assertTrue(string.contains("\"depth\" : 4"));
-        Assert.assertTrue(string.contains("\"original_md5\" : \"302a360ecad98a34b59863c1e65bcf71\""));
-        Assert.assertTrue(string.contains("\"actual_sha1\" : \"acab88fc2a043c2479a6de676a2f8179e9ea2167\""));
-        Assert.assertTrue(string.contains("\"path\" : \"org/yossis/tools\""));
-        Assert.assertTrue(string.contains("\"total\" : 1"));
-        Assert.assertTrue(string.contains("\"limit\" : 2"));
-    }
-
-    @Test
-    public void findArtifactsBiggerThan() throws AqlException {
-        AqlApiItem aql = AqlApiItem.create().
-                filter(
-                        AqlApiItem.size().greater(43434)
-                );
-        AqlEagerResult<AqlItem> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 5);
-        for (AqlItem artifact : result.getResults()) {
-            assertThat(artifact.getSize()).isGreaterThan(43434);
-        }
-    }
-
-    @Test
-    public void findArtifactsBiggerThanWithLimit() throws AqlException {
-        AqlApiItem aql = AqlApiItem.create().
-                filter(
-                        AqlApiItem.size().greater(43434)
-                )
-                .limit(2);
-        AqlEagerResult<AqlItem> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 2);
-        for (AqlItem artifact : result.getResults()) {
-            assertThat(artifact.getSize()).isGreaterThan(43434);
-        }
-    }
-
-    @Test
-    public void findArtifactsBiggerThanWithOffset() throws AqlException {
-        AqlApiItem aql = AqlApiItem.create().
-                filter(
-                        AqlApiItem.size().greater(43434)
-                )
-                .offset(4);
-        AqlEagerResult<AqlItem> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 1);
-        for (AqlItem artifact : result.getResults()) {
-            assertThat(artifact.getSize()).isGreaterThan(43434);
-        }
-    }
-
-    @Test
-    public void findArtifactsBiggerThanWithOffsetAndLimit() throws AqlException {
-        AqlApiItem aql = AqlApiItem.create().
-                filter(
-                        AqlApiItem.size().greater(43434)
-                )
-                .limit(1)
-                .offset(1);
-        AqlEagerResult<AqlItem> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 1);
-        for (AqlItem artifact : result.getResults()) {
-            assertThat(artifact.getSize()).isGreaterThan(43434);
-        }
-    }
-
-
-    @Test
-    public void findArtifactsUsinfInclude() throws AqlException {
-        AqlApiItem aql = AqlApiItem.create().
-                filter(
-                        AqlApiItem.size().greater(43434)
-                )
-                .limit(2).include(AqlApiItem.created());
-        AqlEagerResult<AqlItem> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 2);
-        for (AqlItem artifact : result.getResults()) {
-            assertThat(artifact.getSize()).isGreaterThan(43434);
-        }
-    }
-
-    @Test
-    public void usageOffTypeEqualAll() throws AqlException {
-        AqlApiItem aql = AqlApiItem.create().
-                filter(
-                        AqlApiItem.type().equal("any")
-                )
-                .include(AqlApiItem.created());
-        AqlEagerResult<AqlItem> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 26);
-    }
-
-    @Test
-    public void findBuild() throws AqlException {
-        AqlApiBuild aql = AqlApiBuild.create().
-                filter(
-                        AqlApiBuild.url().equal("http://myserver/jenkins/bb/1")
-                );
-        AqlEagerResult<AqlBuild> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 1);
-        assertBuild(result, "1", "bb");
-    }
-
-    @Test
-    public void findAqlApiBuildProperty() throws AqlException {
-        AqlApiBuildProperty aql = AqlApiBuildProperty.create().
-                filter(
-                        AqlApiBuildProperty.value().matches("*")
-                );
-        AqlEagerResult<AqlBuildProperty> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 6);
-        assertBuildProperty(result, "start", "0");
-        assertBuildProperty(result, "start", "1");
-        assertBuildProperty(result, "start", "4");
-        assertBuildProperty(result, "status", "bad");
-        assertBuildProperty(result, "status", "good");
-        assertBuildProperty(result, "status", "not-too-bad");
-    }
-
-    @Test
-    public void findAqlApiDependency() throws AqlException {
-        AqlApiDependency aql = AqlApiDependency.create().
-                filter(
-                        AqlApiDependency.name().matches("*")
-                );
-        AqlEagerResult<AqlBuildDependency> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 5);
-        assertDependency(result, "ba1mod3-art1", "dll");
-    }
-
-    @Test
-    public void findAqlApiStatistics() throws AqlException {
-        AqlApiStatistic aql = AqlApiStatistic.create().
-                filter(
-                        AqlApiStatistic.downloads().greater(1)
-                );
-        AqlEagerResult<AqlStatistics> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 2);
-        assertStatistic(result, 9, "yossis");
-        assertStatistic(result, 15, "yossis");
-    }
-
-    @Test
-    public void findArtifact() throws AqlException {
-        AqlApiArtifact aql = AqlApiArtifact.create().
-                filter(
-                        AqlApiArtifact.type().equal("dll")
-                );
-        AqlEagerResult<AqlBuildArtifact> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 5);
-        assertArtifact(result, "ba1mod1-art1", "dll");
-    }
-
-    @Test
-    public void itemsByBuildPromotions() throws AqlException {
-        AqlApiItem aql = AqlApiItem.create().
-                filter(
-                        AqlApiItem.artifact().module().build().promotion().userName().equal("me")
-                );
-        AqlEagerResult<AqlItem> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 0);
-
-    }
-
-    @Test
-    public void buildPromotionsByItem() throws AqlException {
-        AqlApiBuildPromotion aql = AqlApiBuildPromotion.create().
-                filter(
-                        AqlApiBuildPromotion.and(
-                            AqlApiBuildPromotion.build().module().artifact().item().name().matches("*"),
-                            AqlApiBuildPromotion.userName().matches("*")
-                        )
-                );
-        AqlEagerResult<AqlBuildPromotion> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 0);
-    }
-
-    @Test
-    public void buildPromotions() throws AqlException {
-        AqlApiBuildPromotion aql = AqlApiBuildPromotion.create().
-                filter(
-                        AqlApiBuildPromotion.and(
-                                AqlApiBuildPromotion.userName().matches("*"),
-                                AqlApiBuildPromotion.repo().notEquals((String)null)
-                        )
-                );
-        AqlEagerResult<AqlBuildPromotion> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 2);
-        assertBuildPromotion(result, "promoter", "me");
-    }
-
-    @Test
-    public void findItemsUsingIncludeStatistics() throws AqlException {
-        AqlApiItem aql = AqlApiItem.create().
-                filter(
-                        AqlApiItem.size().greater(43434)
-                )
-                .limit(2).include(AqlApiItem.created(), AqlApiItem.statistic().downloads());
-        AqlEagerResult<AqlItem> result = aqlService.executeQueryEager(aql);
-        assertSize(result, 2);
-        for (AqlItem artifact : result.getResults()) {
-            assertThat(artifact.getSize()).isGreaterThan(43434);
-        }
-    }
-
-
-    private void assertSize(AqlEagerResult queryResult, int i) {
-        Assert.assertEquals(queryResult.getSize(), i);
-    }
-
-    private void assertItemt(AqlEagerResult queryResult, String repo, String path, String name, AqlItemTypeEnum type) {
-        boolean found = false;
-        for (int j = 0; j < queryResult.getSize(); j++) {
-            AqlBaseItem row = (AqlBaseItem) queryResult.getResult(j);
-            if (row.getRepo().equals(repo) && row.getName().equals(name) &&
-                    row.getPath().equals(path) && row.getType() == type) {
-                found = true;
-            }
-        }
-        assertTrue(found);
-    }
-
-    private void assertProperty(AqlEagerResult queryResult, String key, String value) {
-        boolean found = false;
-        for (int j = 0; j < queryResult.getSize(); j++) {
-            AqlProperty row = (AqlProperty) queryResult.getResult(j);
-            if (row.getKey().equals(key) &&
-                    row.getValue().equals(value)) {
-                found = true;
-            }
-        }
-        assertTrue(found);
-    }
-
-    private void assertDependency(AqlEagerResult queryResult, String name, String type) {
-        boolean found = false;
-        for (int j = 0; j < queryResult.getSize(); j++) {
-            AqlBuildDependency row = (AqlBuildDependency) queryResult.getResult(j);
-            if (row.getBuildDependencyName().equals(name) &&
-                    row.getBuildDependencyType().equals(type)) {
-                found = true;
-            }
-        }
-        assertTrue(found);
-    }
-
-    private void assertBuild(AqlEagerResult queryResult, String buildNumber, String buildName) {
-        boolean found = false;
-        for (int j = 0; j < queryResult.getSize(); j++) {
-            AqlBuild row = (AqlBuild) queryResult.getResult(j);
-            if (row.getBuildName().equals(buildName) &&
-                    row.getBuildNumber().equals(buildNumber)) {
-                found = true;
-            }
-        }
-        assertTrue(found);
-    }
-
-    private void assertArtifact(AqlEagerResult queryResult, String name, String type) {
-        boolean found = false;
-        for (int j = 0; j < queryResult.getSize(); j++) {
-            AqlBuildArtifact row = (AqlBuildArtifact) queryResult.getResult(j);
-            if (row.getBuildArtifactName().equals(name) &&
-                    row.getBuildArtifactType().equals(type)) {
-                found = true;
-            }
-        }
-        assertTrue(found);
-    }
-
-    private void assertArchive(AqlEagerResult queryResult, String name, String path) {
-        boolean found = false;
-        for (int j = 0; j < queryResult.getSize(); j++) {
-            AqlArchiveEntryItem row = (AqlArchiveEntryItem) queryResult.getResult(j);
-            if (row.getEntryName().equals(name) &&
-                    row.getEntryPath().equals(path)) {
-                found = true;
-            }
-        }
-        assertTrue(found);
-    }
-
-    private void assertStatistic(AqlEagerResult queryResult, int downloads, String downloadBy) {
-        boolean found = false;
-        for (int j = 0; j < queryResult.getSize(); j++) {
-            AqlStatistics row = (AqlStatistics) queryResult.getResult(j);
-            if (row.getDownloads() == downloads &&
-                    row.getDownloadedBy().equals(downloadBy)) {
-                found = true;
-            }
-        }
-        assertTrue(found);
-    }
-
-    private void assertBuildProperty(AqlEagerResult queryResult, String key, String value) {
-        boolean found = false;
-        for (int j = 0; j < queryResult.getSize(); j++) {
-            AqlBuildProperty row = (AqlBuildProperty) queryResult.getResult(j);
-            if (row.getBuildPropKey().equals(key) &&
-                    row.getBuildPropValue().equals(value)) {
-                found = true;
-            }
-        }
-        assertTrue(found);
-    }
-
-    private void assertBuildPromotion(AqlEagerResult queryResult, String createdBy, String userName) {
-        boolean found = false;
-        for (int j = 0; j < queryResult.getSize(); j++) {
-            AqlBuildPromotion row = (AqlBuildPromotion) queryResult.getResult(j);
-            if (row.getBuildPromotionCreatedBy().equals(createdBy) &&
-                    row.getBuildPromotionUser().equals(userName)) {
-                found = true;
-            }
-        }
-        assertTrue(found);
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/aql/parser/AqlParserTest.java b/storage/db/src/test/java/org/artifactory/storage/db/aql/parser/AqlParserTest.java
deleted file mode 100644
index 2b5cc24..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/aql/parser/AqlParserTest.java
+++ /dev/null
@@ -1,139 +0,0 @@
-package org.artifactory.storage.db.aql.parser;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * @author Gidi Shabat
- */
- at Test
-public class AqlParserTest {
-    @Test
-    public void successParse() throws Exception {
-        AqlParser sm = new AqlParser();
-        assertValid(sm, "items.find({\"repo\":{\"$match\":\"jc*\"}})");
-        assertValid(sm, "items.find({\"@license\":{\"$eq\":\"GPL\"}})");
-        assertValid(sm, "items.find({\"@license\":{\"$eq\":\"GPL\"}})");
-        assertValid(sm,
-                "items.find({\"@license\":{\"$eq\":\"GPL\"},\"@license\":{\"$eq\":\"GPL\"},\"$or\":[{\"@license\":{\"$eq\":\"GPL\"}}]})");
-        assertValid(sm,
-                "items.find({\"@license\":{\"$eq\":\"GPL\"},\"@license\":{\"$lt\":\"GPL\"},\"$or\":[{\"@license\":{\"$eq\":\"GPL\"},\"@license\":{\"$eq\":\"GPL\"}}]})");
-        assertValid(sm,
-                "items.find({\"@license\":{\"$eq\":\"GPL\"},\"$or\":[{\"@license\":{\"$eq\":\"GPL\"},\"@license\":{\"$eq\":\"GPL\"},\"@license\":{\"$eq\":\"GPL\"}}]})");
-        assertValid(sm, "items.find({\"$or\":[{\"@license\":\"GPL\",\"@license\":\"GPL\"}]})");
-        assertValid(sm,
-                "items.find({\"$or\":[{\"repo\":\"jcentral\"},{\"type\":1},{\"$or\":[{\"$or\":[{\"@version\":\"1,1,1\"},{\"type\":1}]},{\"@version\":\"2.2.2\"}]}]})");
-        assertValid(sm, "items.find({\"$msp\":[{\"repo\":\"jcentral\"},{\"type\":1}]})");
-        assertValid(sm, "items.find({\"$msp\":[{\"repo\":\"jcentral\",\"type\":1}]})");
-        assertValid(sm, "items.find({\"repo\":\"jcentral\",\"type\":1})");
-        assertValid(sm, "items.find({\"repo\":\"jcentral\"},{\"type\":1})");
-        assertValid(sm, "items.find({\"$msp\":[{\"repo\":\"jcentral\"},{\"type\":1}]})");
-        assertValid(sm,
-                "items.find({\"$msp\":[{\"repo\":\"jcentral\"},{\"type\":1}]}).sort({\"$asc\" : [\"name\", \"repo\" ]})");
-        assertValid(sm, "items.find({\"@*\" : {\"$eq\" : \"1.1*\"}})");
-        assertValid(sm, "items.find({\"@ver*\" : {\"$eq\" : \"*\" }})");
-        assertValid(sm, "items.find({\"@ver*\" : {\"$eq\" : \"*\"}})");
-        assertValid(sm, "items.find()");
-        assertValid(sm, "items.find({\"@*\" : {\"$eq\" : \"1.1*\"}}).limit(10)");
-        assertValid(sm, "items.find({\"archive.entry.name\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "items.find({\"artifact.module.name\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "items.find({\"artifact.module.build.name\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "builds.find({\"module.dependency.name\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "builds.find({\"module.dependency.item.repo\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "builds.find({\"module.dependency.item.name\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "modules.find({\"name\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "modules.find({\"artifact.item.name\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "modules.find({\"artifact.item. at test\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "modules.find({\"build.number\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "dependencies.find({\"item.name\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "dependencies.find({\"scope\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "dependencies.find({\"module.name\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "build.properties.find({\"key\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "build.properties.find({\"build.number\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "build.properties.find({\"value\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "properties.find({\"item.repo\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "items.find({\"stat.downloads\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "artifacts.find({\"type\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "artifacts.find({\"module.name\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "artifacts.find({\"item.path\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "builds.find({\"module.artifact.item. at path\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-
-        assertValid(sm, "items.find({\"path\" : {\"$eq\" : \"a.a\"},\"path\" :\"path\" }).limit(10)");
-        assertValid(sm, "items.find({\"path\" : {\"$eq\" : \"a.a\"},\"@path\" :\"path\" }).limit(10)");
-        assertValid(sm,
-                "items.find({\"path\" : {\"$eq\" : \"a.a\"},\"@path\" :\"path\" }).include(\"repo\",\"archive.entry.name\").limit(10)");
-        assertValid(sm,
-                "items.find({\"path\" : {\"$eq\" : \"a.a\"},\"@path\" :\"path\" }).include(\"@repo\",\"property.value\").limit(10)");
-        assertValid(sm,
-                "items.find({\"path\" : {\"$eq\" : \"a.a\"},\"@path\" :\"path\" }).include(\"repo\",\"@repo\",\"property.value\").limit(10)");
-        assertValid(sm,
-                "items.find({\"path\" : {\"$eq\" : \"a.a\"},\"@path\" :\"path\" }).include(\"archive.entry.name\").limit(10)");
-        assertValid(sm, "items.find({\"@*\" : {\"$eq\" : \"1.1*\"}}).limit(10)");
-        assertValid(sm, "items.find({\"@*\" : {\"$eq\" : null}}).limit(10)");
-        assertValid(sm, "items.find({\"@*\" : {\"$eq\" : null}}).offset(145).limit(10)");
-        assertValid(sm, "items.find({\"@*\" : {\"$eq\" : \"test\"}}).offset(145).limit(10)");
-        assertValid(sm, "builds.find({\"module.artifact.item.@*\" : {\"$eq\" : \"test\"}}).offset(145).limit(10)");
-        assertValid(sm, "builds.find({\"module.artifact.item. at key\" : {\"$eq\" : \"*\"}}).offset(145).limit(10)");
-        assertValid(sm, "build.properties.find({\"build.module.artifact.item. at key\" : {\"$eq\" : \"*\"}}).offset(145).limit(10)");
-        assertValid(sm, "build.properties.find({\"module.artifact.item. at key\" : {\"$eq\" : \"*\"}}).offset(145).limit(10)");
-        assertValid(sm, "build.properties.find({\"@key\" : {\"$eq\" : \"*\"}}).offset(145).limit(10)");
-        assertValid(sm, "build.properties.find({\"@*\" : {\"$eq\" : \"*\"}}).offset(145).limit(10)");
-        assertValid(sm, "build.properties.find({\"@*\" : {\"$eq\" : \"sdsdsdsd*\"}}).offset(145).limit(10)");
-        assertValid(sm, "module.properties.find({\"module.artifact.item. at key\" : {\"$eq\" : \"*\"}}).offset(145).limit(10)");
-        assertValid(sm, "module.properties.find({\"@key\" : {\"$eq\" : \"*\"}}).offset(145).limit(10)");
-        assertValid(sm, "module.properties.find({\"*\" : {\"$eq\" : \"*\"}}).offset(145).limit(10)");
-        assertValid(sm, "module.properties.find({\"*\" : {\"$eq\" : \"sdsdsdsd*\"}}).offset(145).limit(10)");
-        assertValid(sm, "modules.find({\"@*\" : {\"$eq\" : \"sdsdsdsd*\"}}).offset(145).limit(10)");
-        assertValid(sm, "build.properties.find({\"module.number\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "build.properties.find({\"repo\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "archive.entries.find({\"archive.item.repo\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "build.promotions.find({\"repo\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "archive.entries.find({\"archive.item.artifact.module.build.created\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "archive.entries.find({\"archive.item.artifact.module.build.created\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertValid(sm, "items.find({\"created\" : {\"$before\" : \"5D\"}}).limit(10)");
-        assertValid(sm, "items.find({\"created\" : {\"$before\" : \"5Y\"}}).limit(10)");
-        assertValid(sm, "archive.entries.find({\"archive.item.artifact.module.build.created\" : {\"$before\" : \"10Days\"}}).limit(10)");
-        assertValid(sm, "archive.entries.find({\"archive.item.artifact.module.build.created\" : {\"$before\" : \"10years\"}}).limit(10)");
-        assertValid(sm, "archive.entries.find({\"archive.item.artifact.module.build.created\" : {\"$before\" : \"10Minutes\"}}).limit(10)");
-        assertValid(sm, "archive.entries.find({\"archive.item.artifact.module.build.created\" : {\"$before\" : \"10S\"}}).limit(10)");
-        assertValid(sm, "archive.entries.find({\"archive.item.artifact.module.build.created\" : {\"$last\" : \"10D\"}}).limit(10)");
-        assertValid(sm, "archive.entries.find({\"archive.item.artifact.module.build.created\" : {\"$last\" : \"10S\"}}).limit(10)");
-        assertValid(sm, "archive.entries.find({\"archive.item.artifact.module.build.created\" : {\"$last\" : \"10Minute\"}}).limit(10)");
-        assertValid(sm, "archive.entries.find({\"archive.item.artifact.module.build.created\" : {\"$last\" : \"10second\"}}).limit(10)");
-    }
-
-    @Test
-    public void failureOnParse() throws Exception {
-        AqlParser sm = new AqlParser();
-        assertInValid(sm, "artifacts({\"$names\" : [}).find({\"ver*\" : \"$eq\"})");
-        assertInValid(sm, "artifacts({\"$names\").find({\"ver*\" : \"$eq\"})");
-        assertInValid(sm, "artifacts().find({\"ver*\" : \"$eq\"})");
-        assertInValid(sm, "artifacts().find({\"blabla\" : \"jjhj\"})");
-        assertInValid(sm, "builds.find({\"module.dependency.nameg\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertInValid(sm, "modules.find({\"repo\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertInValid(sm, "dependencies.find({\"repo\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertInValid(sm, "items.find({\"downloads\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertInValid(sm, "artifacts.find({\"module.type\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertInValid(sm, "artifacts.find({\"module\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertInValid(sm, "artifacts.find({\"module.\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertInValid(sm, "items.find({\"property.item.@*\" : {\"$eq\" : \"1.1*\"}}).limit(10)");
-        assertInValid(sm, "items.find().include(\"repo3\").limit(10)");
-        assertInValid(sm, "items.find().include(\"repo3\").offset(45)limit(10)");
-        assertInValid(sm, "items.find().include(\"repo3\").offser(45).limit(10)");
-        assertInValid(sm, "archive.entries.find({\"archive.item.module.build.created\" : {\"$eq\" : \"a.a\"}}).limit(10)");
-        assertInValid(sm, "archive.entries.find({\"archive.item.artifact.module.build.created\" : {\"$lastf\" : \"10df\"}}).limit(10)");
-    }
-
-    private void assertValid(AqlParser sm, String script) throws Exception {
-        ParserElementResultContainer parse = sm.parse(script);
-    }
-
-    private void assertInValid(AqlParser sm, String script) throws Exception {
-        try {
-            sm.parse(script);
-            Assert.fail();
-        } catch (Exception e) {
-            Assert.assertTrue(true);
-        }
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlAbstractServiceTest.java b/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlAbstractServiceTest.java
deleted file mode 100644
index b137a84..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlAbstractServiceTest.java
+++ /dev/null
@@ -1,158 +0,0 @@
-package org.artifactory.storage.db.aql.service;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.aql.model.AqlItemTypeEnum;
-import org.artifactory.aql.model.AqlPermissionProvider;
-import org.artifactory.aql.result.AqlEagerResult;
-import org.artifactory.aql.result.rows.*;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.util.ReflectionTestUtils;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlAbstractServiceTest extends DbBaseTest {
-    @Autowired
-    protected AqlServiceImpl aqlService;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/aql_test.sql");
-        ReflectionTestUtils.setField(aqlService, "permissionProvider", new AdminPermissions());
-    }
-
-    protected void assertItem(AqlEagerResult queryResult, String repo, String path, String name, AqlItemTypeEnum type) {
-        boolean found = false;
-        for (int j = 0; j < queryResult.getSize(); j++) {
-            AqlBaseItem row = (AqlBaseItem) queryResult.getResult(j);
-            if (row.getRepo().equals(repo) && row.getName().equals(name) &&
-                    row.getPath().equals(path) && row.getType() == type) {
-                found = true;
-            }
-        }
-        Assert.assertTrue(found);
-    }
-
-    protected void assertProperty(AqlEagerResult queryResult, String key, String value) {
-        boolean found = false;
-        for (int j = 0; j < queryResult.getSize(); j++) {
-            AqlProperty row = (AqlProperty) queryResult.getResult(j);
-            if (row.getKey().equals(key) && (StringUtils.isBlank(row.getValue()) && StringUtils.isBlank(value) ||
-                    (!StringUtils.isBlank(row.getValue()) && row.getValue().equals(value)))) {
-                found = true;
-            }
-        }
-        Assert.assertTrue(found);
-    }
-
-    protected void assertDependencies(AqlEagerResult queryResult, String buildDependencyName,
-            String buildDependencyScope, String buildDependencyType) {
-        boolean found = false;
-        for (int j = 0; j < queryResult.getSize(); j++) {
-            AqlBuildDependency row = (AqlBuildDependency) queryResult.getResult(j);
-            if (row.getBuildDependencyName().equals(buildDependencyName) &&
-                    row.getBuildDependencyScope().equals(buildDependencyScope) &&
-                    row.getBuildDependencyType().equals(buildDependencyType)) {
-                found = true;
-            }
-        }
-        Assert.assertTrue(found);
-    }
-
-    protected void assertArchive(AqlEagerResult queryResult, String path, String name) {
-        boolean found = false;
-        for (int j = 0; j < queryResult.getSize(); j++) {
-            AqlArchiveEntryItem row = (AqlArchiveEntryItem) queryResult.getResult(j);
-            if (row.getEntryPath().equals(path) &&
-                    row.getEntryName().equals(name)) {
-                found = true;
-            }
-        }
-        Assert.assertTrue(found);
-    }
-
-    protected void assertBuildArtifacts(AqlEagerResult queryResult, String buildArtifactsName,
-            String buildArtifactsType) {
-        boolean found = false;
-        for (int j = 0; j < queryResult.getSize(); j++) {
-            AqlBuildArtifact row = (AqlBuildArtifact) queryResult.getResult(j);
-            if (row.getBuildArtifactName().equals(buildArtifactsName) &&
-                    row.getBuildArtifactType().equals(buildArtifactsType)) {
-                found = true;
-            }
-        }
-        Assert.assertTrue(found);
-    }
-
-    protected void assertStatistics(AqlEagerResult queryResult, int downloads, String downloadBy) {
-        boolean found = false;
-        for (int j = 0; j < queryResult.getSize(); j++) {
-            AqlStatisticItem row = (AqlStatisticItem) queryResult.getResult(j);
-            if (row.getDownloadedBy().equals(downloadBy) && row.getDownloads() == (downloads)) {
-                found = true;
-            }
-        }
-        Assert.assertTrue(found);
-    }
-
-    protected void assertBuild(AqlEagerResult queryResult, String buildName, String buildNumber) {
-        boolean found = false;
-        for (int j = 0; j < queryResult.getSize(); j++) {
-            AqlBuild row = (AqlBuild) queryResult.getResult(j);
-            if (row.getBuildName().equals(buildName) &&
-                    row.getBuildNumber().equals(buildNumber)) {
-                found = true;
-            }
-        }
-        Assert.assertTrue(found);
-    }
-
-    protected void assertBuildPromotion(AqlEagerResult queryResult, String createdBy, String userName) {
-        boolean found = false;
-        for (int j = 0; j < queryResult.getSize(); j++) {
-            AqlBuildPromotion row = (AqlBuildPromotion) queryResult.getResult(j);
-            if (row.getBuildPromotionCreatedBy().equals(createdBy) &&
-                    row.getBuildPromotionUser().equals(userName)) {
-                found = true;
-            }
-        }
-        Assert.assertTrue(found);
-    }
-
-    protected void assertModule(AqlEagerResult queryResult, String moduleName) {
-        boolean found = false;
-        for (int j = 0; j < queryResult.getSize(); j++) {
-            AqlBuildModule row = (AqlBuildModule) queryResult.getResult(j);
-            if ( row.getBuildModuleName().equals(moduleName)) {
-                found = true;
-            }
-        }
-        Assert.assertTrue(found);
-    }
-
-    protected void assertSize(AqlEagerResult queryResult, int i) {
-        Assert.assertEquals(queryResult.getSize(), i);
-    }
-
-    public static class AdminPermissions implements AqlPermissionProvider {
-
-        @Override
-        public boolean canRead(RepoPath repoPath) {
-            return true;
-        }
-
-        @Override
-        public boolean isAdmin() {
-            return true;
-        }
-
-        @Override
-        public boolean isOss() {
-            return false;
-        }
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlArchiveTest.java b/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlArchiveTest.java
deleted file mode 100644
index 9153ad8..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlArchiveTest.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.artifactory.storage.db.aql.service;
-
-import org.artifactory.aql.result.AqlEagerResult;
-import org.testng.annotations.Test;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlArchiveTest  extends AqlAbstractServiceTest {
-
-    @Test
-    public void archiveWithBuilds() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "archive.entries.find({\"archive.item.repo\" : \"repo1\"," +
-                        "\"archive.item.artifact.module.build.name\" : {\"$match\":\"*\"}})");
-        assertSize(queryResult, 1);
-        assertArchive(queryResult,  "path","file.file");
-    }
-
-    @Test
-    public void buildsWithArchive() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "builds.find({\"module.artifact.item.archive.entry.name\" :{\"$match\":\"*\"}})");
-        assertSize(queryResult, 3);
-        assertBuild(queryResult, "ba", "1");
-        assertBuild(queryResult, "bb", "1");
-        assertBuild(queryResult, "ba", "2");
-    }
-
-    @Test
-    public void archiveWithBuildsWithInclude() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "archive.entries.find({\"archive.item.repo\" : \"repo1\"," +
-                        "\"archive.item.artifact.module.build.name\" : {\"$match\":\"*\"}})" +
-                        ".include(\"archive.item\")");
-        assertSize(queryResult, 1);
-        assertArchive(queryResult,  "path","file.file");
-    }
-
-}
\ No newline at end of file
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlBuildPromotionOrientedTest.java b/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlBuildPromotionOrientedTest.java
deleted file mode 100644
index 18409e5..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlBuildPromotionOrientedTest.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package org.artifactory.storage.db.aql.service;
-
-import org.apache.commons.io.IOUtils;
-import org.artifactory.aql.result.AqlEagerResult;
-import org.artifactory.aql.result.AqlJsonStreamer;
-import org.artifactory.aql.result.AqlLazyResult;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.util.List;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * @author gidis
- */
-public class AqlBuildPromotionOrientedTest extends AqlAbstractServiceTest {
-    @Autowired
-    private AqlServiceImpl aqlService;
-
-    @Test
-    public void itemFilteringByPromotion() {
-        AqlEagerResult results = aqlService.executeQueryEager(
-                "items.find({\"artifact.module.build.promotion.user\":{\"$eq\": \"me\"}})"
-        );
-
-        List items = results.getResults();
-        assertEquals(items.size(), 0);
-    }
-
-    @Test
-    public void promotion() {
-        AqlEagerResult results = aqlService.executeQueryEager(
-                "build.promotions.find({\"user\":{\"$eq\": \"me\"}})"
-        );
-
-        List promotions = results.getResults();
-        assertEquals(promotions.size(), 1);
-        assertBuildPromotion(results, "promoter", "me");
-    }
-
-    @Test
-    public void promotionWithLazy() {
-        AqlLazyResult aqlLazyResult = aqlService.executeQueryLazy(
-                "build.promotions.find({\"user\":{\"$eq\": \"me\"}})"
-        );
-        AqlJsonStreamer streamer = new AqlJsonStreamer(aqlLazyResult);
-        byte[] array;
-        try {
-            array = streamer.read();
-            StringBuilder builder=new StringBuilder();
-            try {
-                while (array != null) {
-                    builder.append(new String(array));
-                    array = streamer.read();
-                }
-                String result = builder.toString();
-                Assert.assertTrue(result.contains("\"build.promotion.comment\" : \"sending to QA\""));
-                Assert.assertTrue(result.contains("\"build.promotion.created_by\" : \"promoter\""));
-                Assert.assertTrue(result.contains("\"build.promotion.repo\" : \"qa-local\""));
-                Assert.assertTrue(result.contains("\"build.promotion.status\" : \"promoted\""));
-                Assert.assertTrue(result.contains("\"build.promotion.user\" : \"me\""));
-            } finally {
-                IOUtils.closeQuietly(streamer);
-            }
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-    }
-
-    @Test
-    public void buldWithPromotionWithLazy() {
-        AqlLazyResult aqlLazyResult = aqlService.executeQueryLazy(
-                "builds.find({\"number\":{\"$eq\": \"2\"}}).include(\"promotion\")"
-        );
-        AqlJsonStreamer streamer = new AqlJsonStreamer(aqlLazyResult);
-        byte[] array;
-        try {
-            array = streamer.read();
-            StringBuilder builder=new StringBuilder();
-            try {
-                while (array != null) {
-                    builder.append(new String(array));
-                    array = streamer.read();
-                }
-                String result = builder.toString();
-                Assert.assertTrue(result.contains("\"build.promotion.status\" : \"promoted\""));
-                Assert.assertTrue(result.contains("\"build.promotion.created_by\" : \"tester\""));
-                Assert.assertTrue(result.contains("\"build.name\" : \"bb\""));
-                Assert.assertTrue(result.contains("\"build.promotion.status\" : \"rollback\""));
-            } finally {
-                IOUtils.closeQuietly(streamer);
-            }
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlComparatorTest.java b/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlComparatorTest.java
deleted file mode 100644
index 387f69d..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlComparatorTest.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package org.artifactory.storage.db.aql.service;
-
-import org.artifactory.aql.AqlException;
-import org.artifactory.aql.result.AqlEagerResult;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlComparatorTest extends AqlAbstractServiceTest {
-
-    private static final String INVALID_SYNTAX = "Illegal syntax the 'null' values are allowed to use only with equals and not equals operators.\n";
-
-    @Test
-    public void greaterWithNull() {
-        try {
-            AqlEagerResult queryResult = aqlService.executeQueryEager(
-                    "items.find({\"repo\" :\"repo1\",\"stat.downloads\":{\"$gt\":null}})");
-            assertSize(queryResult, 3);
-        } catch (AqlException e) {
-            Assert.assertEquals(e.getMessage(), INVALID_SYNTAX);
-        }
-    }
-
-    @Test
-    public void greaterEqualsWithNull() {
-        try {
-            AqlEagerResult queryResult = aqlService.executeQueryEager(
-                    "items.find({\"repo\" :\"repo1\",\"stat.downloads\":{\"$gte\":null}})");
-            assertSize(queryResult, 3);
-        } catch (AqlException e) {
-            Assert.assertEquals(e.getMessage(), INVALID_SYNTAX);
-        }
-    }
-
-    @Test
-    public void greaterLessWithNull() {
-        try {
-            AqlEagerResult queryResult = aqlService.executeQueryEager(
-                    "items.find({\"repo\" :\"repo1\",\"stat.downloads\":{\"$lt\":null}})");
-            assertSize(queryResult, 3);
-        } catch (AqlException e) {
-            Assert.assertEquals(e.getMessage(), INVALID_SYNTAX);
-        }
-    }
-
-    @Test
-    public void lessEqualsWithNull() {
-        try {
-            AqlEagerResult queryResult = aqlService.executeQueryEager(
-                    "items.find({\"repo\" :\"repo1\",\"stat.downloads\":{\"$lte\":null}})");
-            assertSize(queryResult, 3);
-        } catch (AqlException e) {
-            Assert.assertEquals(e.getMessage(), INVALID_SYNTAX);
-        }
-    }
-
-    @Test
-    public void matchWithNull() {
-        try {
-            AqlEagerResult queryResult = aqlService.executeQueryEager(
-                    "items.find({\"repo\" :\"repo1\",\"stat.downloads\":{\"$match\":null}})");
-            assertSize(queryResult, 3);
-        } catch (AqlException e) {
-            Assert.assertEquals(e.getMessage(), INVALID_SYNTAX);
-        }
-    }
-
-    @Test
-    public void notMatchWithNull() {
-        try {
-            AqlEagerResult queryResult = aqlService.executeQueryEager(
-                    "items.find({\"repo\" :\"repo1\",\"stat.downloads\":{\"$nmatch\":null}})");
-            assertSize(queryResult, 3);
-        } catch (AqlException e) {
-            Assert.assertEquals(e.getMessage(), INVALID_SYNTAX);
-        }
-    }
-
-    @Test
-    public void equalWithNull() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"repo\" :\"repo1\",\"modified\":{\"$eq\": null }})");
-        assertSize(queryResult, 0);
-    }
-
-    @Test
-    public void notEqualWithNull() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"repo\" :\"repo1\",\"modified\":{\"$ne\": null }})");
-        assertSize(queryResult, 4);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlExcludeFilesTest.java b/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlExcludeFilesTest.java
deleted file mode 100644
index c646fb9..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlExcludeFilesTest.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.storage.db.aql.service;
-
-import org.artifactory.aql.result.AqlEagerResult;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlExcludeFilesTest extends AqlAbstractServiceTest {
-    /**
-     * Exclusion test: ensure that the result from exclusion plus opposite results should be equals to items  result
-     */
-    @Test
-    public void test() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager("items.find()");
-        int all = queryResult.getResults().size();
-        queryResult = aqlService.executeQueryEager("items.find({\"property.value\" : {\"$match\" : \"*is is st*\"}})");
-        int matchFilter = queryResult.getResults().size();
-        queryResult = aqlService.executeQueryEager("items.find({\"property.value\" : {\"$nmatch\" : \"*is is st*\"}})");
-        int notMatchFilter = queryResult.getResults().size();
-        Assert.assertEquals(matchFilter + notMatchFilter, all, "Expecting that the result of two opposite criterias " +
-                "(same criteria with opposite comparator exp equal and not equal) will be equal to al items result");
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlExclusionTest.java b/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlExclusionTest.java
deleted file mode 100644
index 08e2321..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlExclusionTest.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package org.artifactory.storage.db.aql.service;
-
-import org.artifactory.aql.result.AqlEagerResult;
-import org.artifactory.aql.result.rows.AqlBaseItem;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.util.ReflectionTestUtils;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlExclusionTest extends DbBaseTest {
-    @Autowired
-    private AqlServiceImpl aqlService;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/aql_exclusion.sql");
-        ReflectionTestUtils.setField(aqlService, "permissionProvider", new AqlAbstractServiceTest.AdminPermissions());
-    }
-
-    @Test
-    public void simpleExclude1() {
-        AqlEagerResult results = aqlService.executeQueryEager(
-                "items.find({\"@license\":{\"$ne\": \"GPL\"}})"
-        );
-        List<AqlBaseItem> items = results.getResults();
-        assertEquals(items.size(), 1);
-        assertEquals(items.get(0).getName(), "b");
-    }
-
-    @Test
-    public void simpleExclude2() {
-        AqlEagerResult results = aqlService.executeQueryEager(
-                "items.find({\"@license\":{\"$ne\": \"LGPL\"}}).sort({\"$asc\":[\"name\"]})"
-        );
-        List<AqlBaseItem> items = results.getResults();
-        assertEquals(items.size(), 3);
-        assertEquals(items.get(0).getName(), "a");
-        assertEquals(items.get(1).getName(), "c");
-        assertEquals(items.get(2).getName(), "d");
-    }
-
-    @Test
-    public void simpleExclude3() {
-        AqlEagerResult results = aqlService.executeQueryEager(
-                "items.find({\"property.key\":{\"$ne\": \"license\"}}).sort({\"$asc\":[\"name\"]})"
-        );
-        List<AqlBaseItem> items = results.getResults();
-        assertEquals(items.size(), 0);
-    }
-
-    @Test
-    public void simpleExclude4() {
-        AqlEagerResult results = aqlService.executeQueryEager(
-                "items.find({\"property.value\":{\"$ne\": \"1.1.2\"}}).sort({\"$asc\":[\"name\"]})"
-        );
-        List<AqlBaseItem> items = results.getResults();
-        assertEquals(items.size(), 3);
-        assertEquals(items.get(0).getName(), "a");
-        assertEquals(items.get(1).getName(), "b");
-        assertEquals(items.get(2).getName(), "c");
-    }
-
-    @Test
-    public void simpleExclude5() {
-        AqlEagerResult results = aqlService.executeQueryEager(
-                "items.find({\"@version\":{\"$ne\": \"1.1.1\"}}).sort({\"$asc\":[\"name\"]})"
-        );
-        List<AqlBaseItem> items = results.getResults();
-        assertEquals(items.size(), 1);
-        assertEquals(items.get(0).getName(), "d");
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlIncludeServiceTest.java b/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlIncludeServiceTest.java
deleted file mode 100644
index 2afc5f0..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlIncludeServiceTest.java
+++ /dev/null
@@ -1,170 +0,0 @@
-package org.artifactory.storage.db.aql.service;
-
-import org.artifactory.aql.result.AqlEagerResult;
-import org.artifactory.aql.result.rows.AqlBaseFullRowImpl;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import static org.artifactory.aql.model.AqlItemTypeEnum.file;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlIncludeServiceTest extends AqlAbstractServiceTest {
-    /**
-     * Add extra field from other domain and add result filter on the property key
-     */
-    @Test
-    public void includeWithExtraFieldFromOtherDomainAndPropertyKeyFilter() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "properties.find({\"value\" : {\"$match\" : \"*is is st*\"}}).include(\"item.name\",\"string\")");
-        assertSize(queryResult, 1);
-        assertProperty(queryResult, "string", "this is string");
-    }
-
-    /**
-     * Override the default fields by adding extra field that belong to the main domain
-     */
-    @Test
-    public void includeWithExtraFieldFromSameDomainAndPropertyKeyFilter() {
-        // Should remove the default fields and add only the fields from the include and property filter
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"property.value\" : {\"$match\" : \"*is is st*\"}}).include(\"name\",\"@string\")");
-        assertSize(queryResult, 1);
-        String repo = ((AqlBaseFullRowImpl) queryResult.getResults().get(0)).getRepo();
-        Assert.assertNull(repo);
-    }
-
-    /**
-     * return result that contains all the field in the domain
-     */
-    @Test
-    public void includeExpendDomain() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"property.value\" : {\"$match\" : \"*is is st*\"}}).include(\"*\",\"@string\")");
-        assertSize(queryResult, 1);
-        String actualMd5 = ((AqlBaseFullRowImpl) queryResult.getResults().get(0)).getActualMd5();
-        Assert.assertEquals(actualMd5, "902a360ecad98a34b59863c1e65bcf71");
-    }
-
-    /**
-     * return result that contains all the field in the domain
-     */
-    @Test
-    public void includeDomainWithoutAsterisk() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"property.value\" : {\"$match\" : \"*is is st*\"}}).include(\"stat\")");
-        assertSize(queryResult, 1);
-        int downloads = ((AqlBaseFullRowImpl) queryResult.getResults().get(0)).getDownloads();
-        Assert.assertEquals(downloads, 9);
-    }
-
-    /**
-     * return result that contains all the domain's default fields and the build fields
-     */
-    @Test
-    public void includeExtraDomain() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"artifact.module.build.number\" : {\"$match\" : \"2\"}}).include(\"artifact.module.build.*\")");
-        assertSize(queryResult, 1);
-        String buildNumber = ((AqlBaseFullRowImpl) queryResult.getResults().get(0)).getBuildNumber();
-        String buildName = ((AqlBaseFullRowImpl) queryResult.getResults().get(0)).getBuildName();
-        Assert.assertEquals(buildNumber, "2");
-        Assert.assertEquals(buildName, "ba");
-    }
-
-    /**
-     * return result that contains all the domain's default fields and extra fields
-     */
-    @Test
-    public void findPropertiesUsingNamesExtensionWithOneExtension() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "properties.find({\"value\" : {\"$match\" : \"*is is st*\"}}).include(\"item.name\")");
-        assertSize(queryResult, 3);
-
-        AqlBaseFullRowImpl row = (AqlBaseFullRowImpl) queryResult.getResults().get(0);
-        // Make sure that the extra field (item.name)is not null;
-        Assert.assertTrue(row.getName() != null);
-        Assert.assertTrue(row.getPath() == null);
-        assertProperty(queryResult, "build.name", "ant");
-    }
-
-    /**
-     * return result that contains all the domain's default fields and two extra fields
-     */
-    @Test
-    public void findPropertiesUsingNamesExtensionWithTwoExtensions() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "properties.find({\"value\" : {\"$match\" : \"*is is st*\"}}).include(\"item.name\",\"item.path\")");
-        assertSize(queryResult, 3);
-
-        AqlBaseFullRowImpl row = (AqlBaseFullRowImpl) queryResult.getResults().get(0);
-        // Make sure that the extra field (item.name)is not null;
-        Assert.assertTrue(row.getName() != null);
-        Assert.assertTrue(row.getPath() != null);
-        assertProperty(queryResult, "build.name", "ant");
-    }
-
-    /**
-     * Test the sort mechanism with the include mechanism
-     */
-    @Test
-    public void ensureSortOnIncludedFields() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "properties.find({\"value\" : {\"$match\" : \"*is is st*\"}})." +
-                        "include(\"item.name\",\"item.path\",\"item.size\")." +
-                        "sort({\"$asc\": [\"item.size\"]})");
-        assertSize(queryResult, 3);
-
-        AqlBaseFullRowImpl row = (AqlBaseFullRowImpl) queryResult.getResults().get(0);
-        // Make sure that the extra field (item.name)is not null;
-        Assert.assertTrue(row.getName() != null);
-        Assert.assertTrue(row.getPath() != null);
-        assertProperty(queryResult, "build.name", "ant");
-    }
-
-    /**
-     * Test the sort mechanism with the include domain mechanism
-     */
-    @Test
-    public void ensureSortOnIncludedDomain() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"artifact.module.build.number\" : {\"$match\" : \"2\"}}).include(\"property.*\").sort({\"$asc\" : [\"property.key\"]})");
-        assertSize(queryResult, 1);
-        AqlBaseFullRowImpl row = (AqlBaseFullRowImpl) queryResult.getResults().get(0);
-        // Make sure that the extra field (item.name)is not null;
-        Assert.assertTrue(row.getKey() != null);
-        Assert.assertTrue(row.getValue() != null);
-        assertItem(queryResult, "repo1", "org/yossis/tools", "test.bin", file);
-    }
-
-    /**
-     * Test the sort mechanism with the include domain mechanism
-     */
-    @Test
-    public void includePropertiesWithAtAndAsterisk() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"artifact.module.build.number\" : {\"$match\" : \"2\"}})." +
-                        "include(\"@*\").sort({\"$asc\" : [\"property.key\"]})");
-        assertSize(queryResult, 1);
-        AqlBaseFullRowImpl row = (AqlBaseFullRowImpl) queryResult.getResults().get(0);
-        // Make sure that the extra field (item.name)is not null;
-        Assert.assertTrue(row.getKey() != null);
-        Assert.assertTrue(row.getValue() != null);
-        assertItem(queryResult, "repo1", "org/yossis/tools", "test.bin", file);
-    }
-
-    /**
-     * Test the sort mechanism with the include domain mechanism
-     */
-    @Test
-    public void multipleResultFilter() {
-        AqlEagerResult<AqlBaseFullRowImpl> queryResult = aqlService.executeQueryEager(
-                "items.find()." +
-                        "include(\"@build.name\",\"@build.number\")");
-        assertSize(queryResult, 2);
-        for (AqlBaseFullRowImpl row : queryResult.getResults()) {
-            Assert.assertTrue("build.number".equals(row.getKey()) || "build.name".equals(row.getKey()));
-        }
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlItemTypeTest.java b/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlItemTypeTest.java
deleted file mode 100644
index adf0c02..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlItemTypeTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.artifactory.storage.db.aql.service;
-
-import org.artifactory.aql.result.AqlEagerResult;
-import org.testng.annotations.Test;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlItemTypeTest extends AqlAbstractServiceTest {
-    /**
-     * By default return only files
-     */
-    @Test
-    public void returnByDefaultOnlyFieles() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find()");
-        assertSize(queryResult, 11);
-    }
-
-    /**
-     * Return both files and folder using all
-     */
-    @Test
-    public void returnFileAndFoldersUsingaAll() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"type\":\"any\"})");
-        assertSize(queryResult, 26);
-    }
-
-    /**
-     * Return both files and folder using file/folder
-     */
-    @Test
-    public void returnFileAndFoldersUsingFileAnFolder() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"$or\":[{\"type\":\"file\"},{\"type\":\"folder\"}]})");
-        assertSize(queryResult, 26);
-    }
-
-    /**
-     * Return files
-     */
-    @Test
-    public void returnFiles() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"type\":\"file\"})");
-        assertSize(queryResult, 11);
-    }
-
-    /**
-     * Return folders
-     */
-    @Test
-    public void returnFolder() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"type\":\"folder\"})");
-        assertSize(queryResult, 15);
-    }
-
-    /**
-     * Return folders
-     */
-    @Test
-    public void causingRecursiveOptimisationCleanup() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"$and\":[{\"type\" : \"any\"}],\"$or\":[{\"repo\" : \"repo1\", \"repo\" : \"repo2\" }]})");
-        assertSize(queryResult, 23);
-    }
-
-    /**
-     * Return folders
-     */
-    @Test
-    public void replaceAnyCriteriaWithFileOrFolderCriterias() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"$or\":[{\"type\" : \"any\"},{\"type\" : \"file\"}],\"$or\":[{\"repo\" : \"repo1\", \"repo\" : \"repo2\" }]})");
-        assertSize(queryResult, 23);
-    }
-
-
-
-
-}
\ No newline at end of file
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlJSonResultTest.java b/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlJSonResultTest.java
deleted file mode 100644
index 4718b27..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlJSonResultTest.java
+++ /dev/null
@@ -1,202 +0,0 @@
-package org.artifactory.storage.db.aql.service;
-
-import com.beust.jcommander.internal.Sets;
-import org.artifactory.aql.result.AqlJsonStreamer;
-import org.artifactory.aql.result.AqlLazyResult;
-import org.artifactory.util.ResourceUtils;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Gidi Shabat
- */
- at Test
-public class AqlJSonResultTest extends AqlAbstractServiceTest {
-
-    @Test
-    public void findBuildWithItemsAndItemProperties() throws IOException {
-        AqlLazyResult aqlLazyResult = aqlService.executeQueryLazy(
-                "builds.find().include(\"module.dependency.item.*\",\"module.dependency.item.property.*\")");
-        AqlJsonStreamer aqlStreamer = new AqlJsonStreamer(aqlLazyResult);
-        String result = read(aqlStreamer);
-        aqlStreamer.close();
-        String expectation = load("/aql/stream/buildsWithItems.json");
-        compareJsons(result, expectation);
-    }
-
-    @Test
-    public void findBuildWithArtifacts() throws IOException {
-        AqlLazyResult aqlLazyResult = aqlService.executeQueryLazy(
-                "builds.find().include(\"module.dependency.*\")");
-        AqlJsonStreamer aqlStreamer = new AqlJsonStreamer(aqlLazyResult);
-        String result = read(aqlStreamer);
-        aqlStreamer.close();
-        String expectation = load("/aql/stream/buildsWithArtifacts.json");
-        compareJsons(result, expectation);
-    }
-
-    @Test
-    public void findBuildWithDependencies() throws IOException {
-        AqlLazyResult aqlLazyResult = aqlService.executeQueryLazy(
-                "builds.find().include(\"module.dependency.*\")");
-        AqlJsonStreamer aqlStreamer = new AqlJsonStreamer(aqlLazyResult);
-        String result = read(aqlStreamer);
-        aqlStreamer.close();
-        String expectation = load("/aql/stream/buildsWithDependency.json");
-        compareJsons(result, expectation);
-    }
-
-    @Test
-    public void findBuildWithModules() throws IOException {
-        AqlLazyResult aqlLazyResult = aqlService.executeQueryLazy(
-                "builds.find().include(\"module.*\")");
-        AqlJsonStreamer aqlStreamer = new AqlJsonStreamer(aqlLazyResult);
-        String result = read(aqlStreamer);
-        aqlStreamer.close();
-        String expectation = load("/aql/stream/buildsWithModules.json");
-        compareJsons(result, expectation);
-    }
-
-    @Test
-    public void itemsWithProperties() throws IOException {
-        AqlLazyResult aqlLazyResult = aqlService.executeQueryLazy(
-                "items.find().include(\"property.*\")");
-        AqlJsonStreamer aqlStreamer = new AqlJsonStreamer(aqlLazyResult);
-        String result = read(aqlStreamer);
-        aqlStreamer.close();
-        String expectation = load("/aql/stream/itemsWithProperties.json");
-        compareJsons(result, expectation);
-    }
-
-    @Test
-    public void buildWithProperties() throws IOException {
-        AqlLazyResult aqlLazyResult = aqlService.executeQueryLazy(
-                "builds.find().include(\"property.*\")");
-        AqlJsonStreamer aqlStreamer = new AqlJsonStreamer(aqlLazyResult);
-        String result = read(aqlStreamer);
-        aqlStreamer.close();
-        String expectation = load("/aql/stream/buildsWithProperties.json");
-        compareJsons(result, expectation);
-    }
-
-    @Test
-    public void modulesWithProperties() throws IOException {
-        AqlLazyResult aqlLazyResult = aqlService.executeQueryLazy(
-                "modules.find().include(\"property.*\")");
-        AqlJsonStreamer aqlStreamer = new AqlJsonStreamer(aqlLazyResult);
-        String result = read(aqlStreamer);
-        aqlStreamer.close();
-        String expectation = load("/aql/stream/modulesWithProperties.json");
-        compareJsons(result, expectation);
-    }
-
-    @Test
-    public void dependenciesWithStats() throws IOException {
-        AqlLazyResult aqlLazyResult = aqlService.executeQueryLazy(
-                "dependencies.find().include(\"item.stat.*\")");
-        AqlJsonStreamer aqlStreamer = new AqlJsonStreamer(aqlLazyResult);
-        String result = read(aqlStreamer);
-        aqlStreamer.close();
-        String expectation = load("/aql/stream/dependenciesWithStats.json");
-        compareJsons(result, expectation);
-    }
-
-    @Test
-    public void items() throws IOException {
-        AqlLazyResult aqlLazyResult = aqlService.executeQueryLazy(
-                "items.find()");
-        AqlJsonStreamer aqlStreamer = new AqlJsonStreamer(aqlLazyResult);
-        String result = read(aqlStreamer);
-        aqlStreamer.close();
-        String expectation = load("/aql/stream/dependenciesWithStats.json");
-        compareJsons(result, expectation);
-    }
-
-    @Test
-    public void itemsWithPropertiesStatisticAndArchive() throws IOException {
-        AqlLazyResult aqlLazyResult = aqlService.executeQueryLazy(
-                "items.find().include(\"stat.*\",\"property.*\",\"archive.*\")");
-        AqlJsonStreamer aqlStreamer = new AqlJsonStreamer(aqlLazyResult);
-        String result = read(aqlStreamer);
-        aqlStreamer.close();
-        String expectation = load("/aql/stream/itemWithPropertiesStatisticsAndArchive.json");
-        compareJsons(result, expectation);
-    }
-
-    @Test
-    public void propertiesWithItems() throws IOException {
-        AqlLazyResult aqlLazyResult = aqlService.executeQueryLazy(
-                "properties.find().include(\"item.*\")");
-        AqlJsonStreamer aqlStreamer = new AqlJsonStreamer(aqlLazyResult);
-        String result = read(aqlStreamer);
-        aqlStreamer.close();
-        String expectation = load("/aql/stream/propertiesWithItems.json");
-        compareJsons(result, expectation);
-    }
-
-    private void compareJsons(String result, String expectation) throws IOException {
-        ObjectMapper mapper = new ObjectMapper();
-        Map resultMap = mapper.readValue(result, Map.class);
-        Map expectedMap = mapper.readValue(expectation, Map.class);
-        assertMapEquals(resultMap, expectedMap);
-    }
-
-    private void assertMapEquals(Map resultMap, Map expectedMap) {
-        Assert.assertTrue(contains(resultMap, expectedMap) && contains(expectedMap, resultMap));
-    }
-
-    private boolean contains(Map resultMap, Map expectedMap) {
-        for (Object o : resultMap.keySet()) {
-            Object result = resultMap.get(o);
-            Object expected = expectedMap.get(o);
-            if (result instanceof Map) {
-                contains((Map) result, (Map) expected);
-            } else if (result instanceof List) {
-
-                Set<Object> resultSet = Sets.newHashSet();
-                resultSet.addAll((List) result);
-                Set<Object> expectedSet = Sets.newHashSet();
-                resultSet.addAll((List) expected);
-                contains(resultSet, expectedSet);
-            } else if (!result.equals(expected)) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    private boolean contains(Set resultList, Set expectedList) {
-        for (Object o : resultList) {
-            if(!expectedList.contains(o)){
-                return false;
-            }
-        }
-        for (Object o : expectedList) {
-            if(!expectedList.contains(o)){
-                return false;
-            }
-        }
-        return true;
-    }
-
-    private String load(String fileName) {
-        return ResourceUtils.getResourceAsString(fileName);
-    }
-
-    private String read(AqlJsonStreamer aqlStreamer) throws IOException {
-        StringBuilder builder = new StringBuilder();
-        byte[] tempResult;
-        while ((tempResult = aqlStreamer.read()) != null) {
-            builder.append(new String(tempResult));
-        }
-        return builder.toString();
-    }
-}
-
-
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlMspOrientedTest.java b/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlMspOrientedTest.java
deleted file mode 100644
index 03a82ec..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlMspOrientedTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.artifactory.storage.db.aql.service;
-
-import org.artifactory.aql.result.AqlEagerResult;
-import org.artifactory.aql.result.rows.AqlBaseItem;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.fest.assertions.Assertions;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.util.ReflectionTestUtils;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * @author gidis
- */
-public class AqlMspOrientedTest  extends DbBaseTest {
-    @Autowired
-    private AqlServiceImpl aqlService;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/aql_msp.sql");
-        ReflectionTestUtils.setField(aqlService, "permissionProvider", new AqlAbstractServiceTest.AdminPermissions());
-    }
-
-    @Test
-    public void noneMsp() {
-        // without $smp the result will include the item with the LGPL license because it has another property
-        AqlEagerResult results = aqlService.executeQueryEager(
-                "items.find({"+
-                            "\"@license\":{\"$match\": \"*GPL*\"}, " +
-                            "\"@license\":{\"$nmatch\": \"LGPL-V5*\"}" +
-                        "})"
-        );
-
-        List<AqlBaseItem> items = results.getResults();
-        Assertions.assertThat(items).hasSize(1);
-        Assertions.assertThat(("ant-1.5.jar").equals(items.get(0).getName()));
-    }
-
-    @Test
-    public void msp() {
-        // without $smp the result will include the item with the LGPL license because it has another property
-        AqlEagerResult results = aqlService.executeQueryEager(
-                "items.find({\"$msp\": [" +
-                            "{\"@license\":{\"$match\": \"*GPL*\"}}," +
-                            "{\"@license\":{\"$ne\": \"LGPL-V5\"}}" +
-                        "]})"
-        );
-
-        List<AqlBaseItem> items = results.getResults();
-        Assertions.assertThat(items).hasSize(2);
-        Assertions.assertThat(("ant-1.5.jar").equals(items.get(0).getName()));
-    }
-
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlNullUsageTest.java b/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlNullUsageTest.java
deleted file mode 100644
index 524ab40..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlNullUsageTest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.artifactory.storage.db.aql.service;
-
-import org.artifactory.aql.result.AqlEagerResult;
-import org.testng.annotations.Test;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlNullUsageTest extends AqlAbstractServiceTest {
-
-    @Test
-    public void findNullStatistics() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"repo\" :\"repo1\",\"stat.downloads\":{\"$eq\":null}})");
-        assertSize(queryResult, 3);
-    }
-
-    @Test
-    public void findNullProperties() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"type\" :\"any\",\"property.key\":{\"$eq\":null}})");
-        assertSize(queryResult, 21);
-    }
-
-    @Test
-    public void findNotStarProperties() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"type\" :\"any\",\"property.key\":{\"$nmatch\":\"*\"}})");
-        assertSize(queryResult, 21);
-    }
-
-    @Test
-    public void findNotAntProperties() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"type\" :\"any\",\"property.key\":{\"$Nmatch\":\"yossis\"}})");
-        assertSize(queryResult, 24);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlOffsetLimitTest.java b/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlOffsetLimitTest.java
deleted file mode 100644
index 72abfdd..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlOffsetLimitTest.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package org.artifactory.storage.db.aql.service;
-
-import org.artifactory.aql.result.AqlEagerResult;
-import org.testng.annotations.Test;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlOffsetLimitTest extends AqlAbstractServiceTest {
-
-    /**
-     * All properties for sanity
-     */
-    @Test
-    public void allPropertiesForSanity() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "properties.find()");
-        assertSize(queryResult, 9);
-    }
-
-    /**
-     * offset with limit test
-     */
-    @Test
-    public void offset4LimitWith4() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "properties.find().sort({\"$asc\":[\"key\"]}).offset(4).limit(4)");
-        assertSize(queryResult, 4);
-
-        assertProperty(queryResult, "string", "this is string");
-    }
-
-
-    /**
-     * offset with limit test
-     */
-    @Test
-    public void offset4LimitWith5() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "properties.find().sort({\"$asc\":[\"key\"]}).offset(4).limit(5)");
-        assertSize(queryResult, 5);
-        assertProperty(queryResult, "yossis", "value1");
-    }
-
-    /**
-     * just limit test
-     */
-    @Test
-    public void justLimitTest() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "properties.find().sort({\"$asc\":[\"key\"]}).limit(5)");
-        assertSize(queryResult, 5);
-        assertProperty(queryResult, "jungle", "value2");
-    }
-
-    /**
-     * just limit test
-     */
-    @Test
-    public void justLimitOfsetAndSortTest() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "properties.find().sort({\"$asc\":[\"key\",\"value\"]}).limit(5)");
-        assertSize(queryResult, 5);
-        assertProperty(queryResult, "jungle", "value2");
-    }
-
-    /**
-     * just limit test
-     */
-    @Test
-    public void justOffsetTest() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "properties.find().offset(4)");
-        assertSize(queryResult, 5);
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlOrAndPropertiesOptimizationTest.java b/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlOrAndPropertiesOptimizationTest.java
deleted file mode 100644
index 4d7dbbf..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlOrAndPropertiesOptimizationTest.java
+++ /dev/null
@@ -1,151 +0,0 @@
-package org.artifactory.storage.db.aql.service;
-
-import org.artifactory.aql.result.AqlEagerResult;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * @author Gidi Shabat
- */
- at Test
-public class AqlOrAndPropertiesOptimizationTest extends AqlAbstractServiceTest {
-
-    @Test
-    public void orOptimizationWithPropertyKeyFields() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"$or\":[{\"property.key\" : \"test\"},{\"property.key\" : \"file\"}]})");
-        assertSize(queryResult, 0);
-    }
-
-    @Test
-    public void orOptimizationWithResult() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"@*\" : {\"$eq\" : \"ant\"} , \"@build.name\" : {\"$eq\" : \"*\"}})");
-        assertSize(queryResult, 1);
-    }
-
-
-
-    @Test
-    public void OrOptimizationWithPropertyValueFields() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"$or\":[{\"property.value\" : \"test\"},{\"property.value\" : \"file\"}]})");
-        assertSize(queryResult, 0);
-    }
-
-    @Test
-    public void OrOptimizationWithPropertyValueAndPropertyKeyFields() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"$or\":[{\"property.value\" : \"test\"},{\"property.value\" : \"file\"},{\"property.key\" : \"file\"}]})");
-        assertSize(queryResult, 0);
-    }
-
-    @Test
-    public void OrOptimizationWithPropertyCriterias() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"$or\":[{\"@a\" : \"test\"},{\"@b\" : \"file\"},{\"@c\" : \"c\"}]})");
-        assertSize(queryResult, 0);
-    }
-
-    /**
-     * Note that without the optimization the query duration is grater than 5 minutes
-     * and with the optimisation it is seconds
-     */
-    @Test
-    public void QueryTimeImprovementTest() {
-        long start = System.nanoTime();
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"$or\":[" +
-                        "{\"@aaaaaaaaaaaaa\" : \"test\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"@ccccccccccccc\" : \"c\"}," +
-                        "{\"@ddddddddddddd\" : \"d\"}," +
-                        "{\"@eeeeeeeeeeeee\" : \"e\"}," +
-                        "{\"@jjjjjjjjjjjjj\" : \"j\"}," +
-                        "{\"@jjjjjjjjjjjjj\" : \"j\"}," +
-                        "{\"@jjjjjjjjjjjjj\" : \"j\"}," +
-                        "{\"@jjjjjjjjjjjjj\" : \"j\"}," +
-                        "{\"@jjjjjjjjjjjjj\" : \"j\"}," +
-                        "{\"@jjjjjjjjjjjjj\" : \"j\"}" +
-                        "]})");
-        long end = System.nanoTime();
-        Assert.assertTrue(end-start<5*1000*1000*1000);
-        assertSize(queryResult, 0);
-    }
-
-    @Test
-    public void OrOptimizationWithSimpleCriterias() {
-        long start = System.nanoTime();
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"$or\":[" +
-                        "{\"path\" : \"test\"}," +
-                        "{\"@aaaaaaaaaaaaa\" : \"test\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"path\" : \"test\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"@ccccccccccccc\" : \"c\"}," +
-                        "{\"@ddddddddddddd\" : \"d\"}," +
-                        "{\"@eeeeeeeeeeeee\" : \"e\"}," +
-                        "{\"@jjjjjjjjjjjjj\" : \"j\"}," +
-                        "{\"@jjjjjjjjjjjjj\" : \"j\"}," +
-                        "{\"@jjjjjjjjjjjjj\" : \"j\"}," +
-                        "{\"@jjjjjjjjjjjjj\" : \"j\"}," +
-                        "{\"@jjjjjjjjjjjjj\" : \"j\"}," +
-                        "{\"@jjjjjjjjjjjjj\" : \"j\"}," +
-                        "{\"path\" : \"j\"}" +
-                        "]})");
-        long end = System.nanoTime();
-        Assert.assertTrue(end - start < 5 * 1000 * 1000 * 1000);
-        assertSize(queryResult, 0);
-    }
-
-    @Test
-    public void derbyPreferMarchThanEqual() {
-        long start = System.nanoTime();
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"$or\":[" +
-                        "{\"path\" : \"test\"}," +
-                        "{\"@aaaaaaaaaaaaa\" : \"test\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"path\" : \"test\"}," +
-                        "{\"@bbbbbbbbbbbbb\" : \"file\"}," +
-                        "{\"@ccccccccccccc\" : \"c\"}," +
-                        "{\"@ddddddddddddd\" : \"d\"}," +
-                        "{\"@eeeeeeeeeeeee\" : \"e\"}," +
-                        "{\"@jjjjjjjjjjjjj\" : \"j\"}," +
-                        "{\"@jjjjjjjjjjjjj\" : \"j\"}," +
-                        "{\"@jjjjjjjjjjjjj\" : \"j\"}," +
-                        "{\"@jjjjjjjjjjjjj\" : \"j\"}," +
-                        "{\"@jjjjjjjjjjjjj\" : \"j\"}," +
-                        "{\"@jjjjjjjjjjjjj\" : \"j\"}," +
-                        "{\"path\" : \"j\"}" +
-                        "]})");
-        long end = System.nanoTime();
-        Assert.assertTrue(end - start < 5 * 1000 * 1000 * 1000);
-        assertSize(queryResult, 0);
-    }
-
-}
\ No newline at end of file
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlPermissionsTest.java b/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlPermissionsTest.java
deleted file mode 100644
index dc250a8..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlPermissionsTest.java
+++ /dev/null
@@ -1,215 +0,0 @@
-package org.artifactory.storage.db.aql.service;
-
-import org.artifactory.aql.AqlException;
-import org.artifactory.aql.model.AqlPermissionProvider;
-import org.artifactory.aql.result.AqlJsonStreamer;
-import org.artifactory.aql.result.AqlLazyResult;
-import org.artifactory.repo.RepoPath;
-import org.springframework.test.util.ReflectionTestUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlPermissionsTest extends AqlAbstractServiceTest {
-
-    /**
-     * Test Admin authorization
-     */
-    @Test
-    public void testAnonymous() throws IOException {
-        AnonymousPermissions permissionProvider = new AnonymousPermissions();
-        ReflectionTestUtils.setField(aqlService, "permissionProvider", permissionProvider);
-        // return only the properties with the key 'yossis' from repository 'repo1'
-        AqlLazyResult aqlLazyResult = aqlService.executeQueryLazy("items.find()");
-        AqlJsonStreamer streamResult = new AqlJsonStreamer(aqlLazyResult);
-
-        byte[] read = streamResult.read();
-        StringBuilder builder = new StringBuilder();
-        while (read != null) {
-            builder.append(new String(read));
-            read = streamResult.read();
-        }
-        streamResult.close();
-        String string = builder.toString();
-        Assert.assertFalse(string.contains("\"repo\" : \"repo2\""));
-        Assert.assertFalse(string.contains("\"repo\" : \"repo1\""));
-    }
-
-
-    /**
-     * Test Admin authorization
-     */
-    @Test
-    public void testAdmin() throws IOException {
-        AdminPermissions permissionProvider = new AdminPermissions();
-        ReflectionTestUtils.setField(aqlService, "permissionProvider", permissionProvider);
-        // return only the properties with the key 'yossis' from repository 'repo1'
-        AqlLazyResult aqlLazyResult = aqlService.executeQueryLazy("items.find()");
-        AqlJsonStreamer streamResult = new AqlJsonStreamer(aqlLazyResult);
-
-        byte[] read = streamResult.read();
-        StringBuilder builder = new StringBuilder();
-        while (read != null) {
-            builder.append(new String(read));
-            read = streamResult.read();
-        }
-        streamResult.close();
-        String string = builder.toString();
-        Assert.assertTrue(string.contains("\"repo\" : \"repo2\""));
-        Assert.assertTrue(string.contains("\"repo\" : \"repo1\""));
-    }
-
-    /**
-     * Test Admin authorization
-     */
-    @Test
-    public void testUser() throws IOException {
-        UserPermissions permissionProvider = new UserPermissions();
-        ReflectionTestUtils.setField(aqlService, "permissionProvider", permissionProvider);
-        // return only the properties with the key 'yossis' from repository 'repo1'
-        AqlLazyResult aqlLazyResult = aqlService.executeQueryLazy("items.find({\"type\":\"any\"})");
-        AqlJsonStreamer streamResult = new AqlJsonStreamer(aqlLazyResult);
-
-        byte[] read = streamResult.read();
-        StringBuilder builder = new StringBuilder();
-        while (read != null) {
-            builder.append(new String(read));
-            read = streamResult.read();
-        }
-        streamResult.close();
-        String string = builder.toString();
-        Assert.assertTrue(string.contains("\"repo\" : \"repo2\""));
-        Assert.assertFalse(string.contains("\"repo\" : \"repo1\""));
-    }
-
-    /**
-     * Test Admin authorization
-     */
-    @Test
-    public void testUserItemWithProperties() throws IOException {
-        UserPermissions permissionProvider = new UserPermissions();
-        ReflectionTestUtils.setField(aqlService, "permissionProvider", permissionProvider);
-        // return only the properties with the key 'yossis' from repository 'repo1'
-        AqlLazyResult aqlLazyResult = aqlService.executeQueryLazy(
-                "items.find({\"type\":\"any\"}).include(\"property.*\")");
-        AqlJsonStreamer streamResult = new AqlJsonStreamer(aqlLazyResult);
-
-        byte[] read = streamResult.read();
-        StringBuilder builder = new StringBuilder();
-        while (read != null) {
-            builder.append(new String(read));
-            read = streamResult.read();
-        }
-        streamResult.close();
-        String string = builder.toString();
-        Assert.assertTrue(string.contains("\"repo\" : \"repo2\""));
-        Assert.assertFalse(string.contains("\"repo\" : \"repo1\""));
-    }
-
-    /**
-     * Test Admin authorization
-     */
-    @Test
-    public void testAdminItemWithProperties() throws IOException {
-        AdminPermissions permissionProvider = new AdminPermissions();
-        ReflectionTestUtils.setField(aqlService, "permissionProvider", permissionProvider);
-        // return only the properties with the key 'yossis' from repository 'repo1'
-        AqlLazyResult aqlLazyResult = aqlService.executeQueryLazy(
-                "items.find({\"type\":\"any\"}).include(\"property.*\")");
-        AqlJsonStreamer streamResult = new AqlJsonStreamer(aqlLazyResult);
-
-        byte[] read = streamResult.read();
-        StringBuilder builder = new StringBuilder();
-        while (read != null) {
-            builder.append(new String(read));
-            read = streamResult.read();
-        }
-        streamResult.close();
-        String string = builder.toString();
-        Assert.assertTrue(string.contains("\"repo\" : \"repo2\""));
-        Assert.assertTrue(string.contains("\"repo\" : \"repo1\""));
-    }
-
-    /**
-     * Test Admin authorization
-     */
-    @Test
-    public void testAnonymousItemWithProperties() throws IOException {
-        AnonymousPermissions permissionProvider = new AnonymousPermissions();
-        ReflectionTestUtils.setField(aqlService, "permissionProvider", permissionProvider);
-        // return only the properties with the key 'yossis' from repository 'repo1'
-        AqlLazyResult aqlLazyResult = aqlService.executeQueryLazy(
-                "items.find({\"type\":\"any\"}).include(\"property.*\")");
-        AqlJsonStreamer streamResult = new AqlJsonStreamer(aqlLazyResult);
-
-        byte[] read = streamResult.read();
-        StringBuilder builder = new StringBuilder();
-        while (read != null) {
-            builder.append(new String(read));
-            read = streamResult.read();
-        }
-        streamResult.close();
-        String string = builder.toString();
-        Assert.assertFalse(string.contains("\"repo\" : \"repo2\""));
-        Assert.assertFalse(string.contains("\"repo\" : \"repo1\""));
-    }
-
-
-    /**
-     * Test Admin authorization
-     */
-    @Test
-    public void missingFieldForPermission() throws IOException {
-        AnonymousPermissions permissionProvider = new AnonymousPermissions();
-        ReflectionTestUtils.setField(aqlService, "permissionProvider", permissionProvider);
-        // return only the properties with the key 'yossis' from repository 'repo1'
-        try {
-            aqlService.executeQueryLazy("items.find({\"type\":\"any\"}).include(\"property.*\",\"name\")");
-        } catch (AqlException e) {
-            Assert.assertTrue(e.getMessage().contains(
-                    "For permissions reasons AQL demands the following fields: repo, path and name"));
-        }
-    }
-
-
-    private class AnonymousPermissions implements AqlPermissionProvider {
-
-        @Override
-        public boolean canRead(RepoPath repoPath) {
-            return false;
-        }
-
-        @Override
-        public boolean isAdmin() {
-            return false;
-        }
-
-        @Override
-        public boolean isOss() {
-            return false;
-        }
-    }
-
-    private class UserPermissions implements AqlPermissionProvider {
-
-        @Override
-        public boolean canRead(RepoPath repoPath) {
-            return "repo2".equals(repoPath.getRepoKey());
-        }
-
-        @Override
-        public boolean isAdmin() {
-            return false;
-        }
-
-        @Override
-        public boolean isOss() {
-            return false;
-        }
-    }
-
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlPropertyOrientedSearchesTest.java b/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlPropertyOrientedSearchesTest.java
deleted file mode 100644
index 28126c3..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlPropertyOrientedSearchesTest.java
+++ /dev/null
@@ -1,194 +0,0 @@
-package org.artifactory.storage.db.aql.service;
-
-import org.artifactory.aql.result.AqlEagerResult;
-import org.artifactory.aql.result.rows.AqlBaseItem;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.fest.assertions.Assertions;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.util.ReflectionTestUtils;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Tests items searching with AQL based mostly on properties filtering.
- *
- * @author Yossi Shaul
- */
- at Test
-public class AqlPropertyOrientedSearchesTest extends DbBaseTest {
-    @Autowired
-    private AqlServiceImpl aqlService;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/aql_properties.sql");
-        ReflectionTestUtils.setField(aqlService, "permissionProvider", new AqlAbstractServiceTest.AdminPermissions());
-    }
-
-    @Test
-    public void simpleProperty() {
-        AqlEagerResult results = aqlService.executeQueryEager(
-                "items.find({\"@color\":{\"$eq\": \"red\"}})"
-        );
-
-        List<AqlBaseItem> items = results.getResults();
-        assertEquals(items.size(), 1);
-        assertEquals(items.get(0).getName(), "ant-1.5.jar");
-    }
-
-    @Test
-    public void valueEquals() {
-        AqlEagerResult results = aqlService.executeQueryEager(
-                "items.find({\"@*\":{\"$eq\": \"red\"}})"
-        );
-
-        List<AqlBaseItem> items = results.getResults();
-        assertEquals(items.size(), 1);
-        assertEquals(items.get(0).getName(), "ant-1.5.jar");
-    }
-
-    @Test
-    public void keyEquals() {
-        AqlEagerResult results = aqlService.executeQueryEager(
-                "items.find({\"@color\":{\"$eq\": \"*\"}}).sort({\"$asc\" : [\"name\"]})"
-        );
-        List<AqlBaseItem> items = results.getResults();
-        assertEquals(items.size(), 2);
-        assertEquals(items.get(0).getName(), "ant-1.5.jar");
-    }
-
-    @Test
-    public void defaultKeyEquals() {
-        AqlEagerResult results = aqlService.executeQueryEager(
-                "items.find({\"@color\":\"*\"}).sort({\"$asc\" : [\"name\"]})"
-        );
-        List<AqlBaseItem> items = results.getResults();
-        assertEquals(items.size(), 2);
-        assertEquals(items.get(0).getName(), "ant-1.5.jar");
-    }
-
-    @Test
-    public void defaultValueEquals() {
-        AqlEagerResult results = aqlService.executeQueryEager(
-                "items.find({\"@*\":\"red\"})"
-        );
-        List<AqlBaseItem> items = results.getResults();
-        assertEquals(items.size(), 1);
-        assertEquals(items.get(0).getName(), "ant-1.5.jar");
-    }
-
-    @Test
-    public void noSuchPropertyKey() {
-        AqlEagerResult results = aqlService.executeQueryEager(
-                "items.find({\"@nosuchkey\":{\"$match\": \"*\"}})"
-        );
-
-        Assertions.assertThat(results.getResults()).isEmpty();
-    }
-
-    @Test
-    public void noSuchPropertyValue() {
-        AqlEagerResult results = aqlService.executeQueryEager(
-                "items.find({\"@color\":{\"$match\": \"orange\"}})"
-        );
-
-        Assertions.assertThat(results.getResults()).isEmpty();
-    }
-
-    @Test
-    public void propertyOnBothFolderAndFile() {
-        AqlEagerResult results = aqlService.executeQueryEager(
-                "items.find({\"type\" : \"any\",\"@color\":{\"$eq\": \"green\"}})"
-        );
-
-        assertEquals(results.getResults().size(), 2);
-    }
-
-    @Test
-    public void propertyOnBothFolderAndFileFilerForFileOnly() {
-        AqlEagerResult results = aqlService.executeQueryEager(
-                "items.find({\"@color\":{\"$eq\": \"green\"}, \"type\": \"file\"})"
-        );
-
-        List<AqlBaseItem> items = results.getResults();
-        assertEquals(items.size(), 1);
-    }
-
-    @Test
-    public void propertyOrConditionOnTheValue() {
-        AqlEagerResult results = aqlService.executeQueryEager(
-                "items.find({" +
-                        "\"$or\": [" +
-                        "{\"@color\":{\"$eq\": \"red\"}}, " +
-                        "{\"@color\":{\"$eq\": \"black\"}}]" +
-                        "})"
-        );
-
-        List<AqlBaseItem> items = results.getResults();
-        assertEquals(items.size(), 2);
-    }
-
-    @Test
-    public void multiplePropertiesMatchesSameItem() {
-        AqlEagerResult results = aqlService.executeQueryEager(
-                "items.find({\"type\" : \"any\"," +
-                        "\"$or\": [" +
-                        "{\"@role\":{\"$eq\": \"manager\"}}, " +
-                        "{\"@role\":{\"$match\": \"clean*\"}}]" +
-                        "})"
-        );
-
-        List<AqlBaseItem> items = results.getResults();
-        assertEquals(items.size(), 1);
-        assertEquals(items.get(0).getName(), "org");
-    }
-
-    @Test
-    public void propertyExclusion() {
-        // this will return all the items, including items without properties and items that have any other property
-        // or any other value for the role property
-        AqlEagerResult results = aqlService.executeQueryEager(
-                "items.find({\"type\" : \"any\",\"@role\":{\"$ne\": \"manager\"}})"
-        );
-        Assertions.assertThat(results.getResults()).hasSize(10);   // all items
-    }
-
-    @Test
-    public void propertyWithCertainKeyExists() {
-        AqlEagerResult results = aqlService.executeQueryEager(
-                "items.find({\"type\" : \"any\",\"property.key\":{\"$eq\": \"color\"}})"
-        );
-
-        Assertions.assertThat(results.getResults()).hasSize(3);
-    }
-
-    @Test
-    public void propertyMatchOnTheSamePropertyRow() {
-        // without $smp the result will include the item with the LGPL license because it has another property
-        AqlEagerResult results = aqlService.executeQueryEager(
-                "items.find({\"$msp\": [" +
-                        "{\"@license\":{\"$match\": \"*GPL\"}}, " +
-                        "{\"@license\":{\"$nmatch\": \"*LGPL*\"}}" +
-                        "]})"
-        );
-
-        List<AqlBaseItem> items = results.getResults();
-        Assertions.assertThat(items).hasSize(1);
-        Assertions.assertThat(("ant-1.5.jar").equals(items.get(0).getName()));
-    }
-
-    @Test
-    public void propertyMatchWithValueNull() {
-        // without $smp the result will include the item with the LGPL license because it has another property
-        AqlEagerResult results = aqlService.executeQueryEager(
-                "items.find({\"@license\":{\"$match\": null}})"
-        );
-
-        List<AqlBaseItem> items = results.getResults();
-        Assertions.assertThat(items).hasSize(0);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlRestrictionTest.java b/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlRestrictionTest.java
deleted file mode 100644
index 831c7a4..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlRestrictionTest.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package org.artifactory.storage.db.aql.service;
-
-import org.artifactory.aql.AqlException;
-import org.artifactory.aql.model.AqlPermissionProvider;
-import org.artifactory.repo.RepoPath;
-import org.springframework.test.util.ReflectionTestUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlRestrictionTest extends AqlAbstractServiceTest {
-
-
-    @Test
-    public void usageOfSortInOssShouldBeBlocked() {
-        OssVersion ossVersionPermisionProvider = new OssVersion();
-        ReflectionTestUtils.setField(aqlService, "permissionProvider", ossVersionPermisionProvider);
-        try {
-            aqlService.executeQueryEager("items.find().sort({\"$asc\":[\"name\"]})");
-            Assert.fail();
-        } catch (AqlException e) {
-            Assert.assertEquals(e.getMessage(), "Sorting is not supported by AQL in the open source version\n");
-        }
-    }
-
-    @Test
-    public void usageOfPropertyResultFilterInOssShouldBeBlocked() {
-        OssVersion ossVersionPermisionProvider = new OssVersion();
-        ReflectionTestUtils.setField(aqlService, "permissionProvider", ossVersionPermisionProvider);
-        try {
-            aqlService.executeQueryEager("items.find().include(\"@version\")");
-            Assert.fail();
-        } catch (AqlException e) {
-            Assert.assertEquals(e.getMessage(),
-                    "Filtering properties result is not supported by AQL in the open source version\n");
-        }
-    }
-
-    @Test
-    public void ensureQueryWithMultiDomainResultsOnOSS() {
-        OssVersion ossVersionPermisionProvider = new OssVersion();
-        ReflectionTestUtils.setField(aqlService, "permissionProvider", ossVersionPermisionProvider);
-        aqlService.executeQueryEager("stats.find(\n" +
-                "    {\n" +
-                "        \"downloads\":{\"$gt\":2},\n" +
-                "        \"downloaded_by\":{\"$match\":\"\u200B_system_\u200B\"},\n" +
-                "        \"downloaded\":{\"$gt\":\"13-10-14\"}\n" +
-                "    }\n" +
-                "    ).include(\"item.name\", \"item.actual_sha1\")");
-    }
-
-    @Test
-    public void usageOfSortInNoneOssShouldNotBeBlocked() {
-        ProVersion proVersionPermisionProvider = new ProVersion();
-        ReflectionTestUtils.setField(aqlService, "permissionProvider", proVersionPermisionProvider);
-        aqlService.executeQueryEager("items.find().sort({\"$asc\":[\"name\"]})");
-    }
-
-    @Test
-    public void usageOfPropertyResultFilterInNoneOssShouldNotBeBlocked() {
-        ProVersion proVersionPermisionProvider = new ProVersion();
-        ReflectionTestUtils.setField(aqlService, "permissionProvider", proVersionPermisionProvider);
-        aqlService.executeQueryEager("items.find().include(\"@version\")");
-    }
-
-
-    private class OssVersion implements AqlPermissionProvider {
-
-        @Override
-        public boolean canRead(RepoPath repoPath) {
-            return "repo2".equals(repoPath.getRepoKey());
-        }
-
-        @Override
-        public boolean isAdmin() {
-            return true;
-        }
-
-        @Override
-        public boolean isOss() {
-            return true;
-        }
-    }
-
-    private class ProVersion implements AqlPermissionProvider {
-
-        @Override
-        public boolean canRead(RepoPath repoPath) {
-            return "repo2".equals(repoPath.getRepoKey());
-        }
-
-        @Override
-        public boolean isAdmin() {
-            return true;
-        }
-
-        @Override
-        public boolean isOss() {
-            return false;
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlServiceTest.java b/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlServiceTest.java
deleted file mode 100644
index 552c8c9..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlServiceTest.java
+++ /dev/null
@@ -1,1012 +0,0 @@
-package org.artifactory.storage.db.aql.service;
-
-import org.artifactory.aql.result.AqlEagerResult;
-import org.testng.annotations.Test;
-
-import static org.artifactory.aql.model.AqlItemTypeEnum.file;
-import static org.artifactory.aql.model.AqlItemTypeEnum.folder;
-
-
-/**
- * @author Gidi Shabat
- */
- at Test
-public class AqlServiceTest extends AqlAbstractServiceTest {
-
-    @Test
-    public void complexQueryWithPropertiesSortJoinAndOr() {
-        aqlService.executeQueryEager("items.find(" +
-                "{" +
-                "   \"$or\":[" +
-                "               {\"repo\" : \"jcentral\"}," +
-                "               {\"archive.item.repo\" : \"jcentral\"}," +
-                        "               {\"name\" : {\"$match\" : \".*test\"}}," +
-                        "               {\"type\" : \"file\"}," +
-                "               {\"$and\":[" +
-                        "                           {\"$msp\":[" +
-                        "                                       {\"@version\":\"1.1.1\"}," +
-                        "                                       {\"type\":\"file\"}" +
-                "                                    ]" +
-                "                           }," +
-                "                           {" +
-                        "                               \"@version\":\"2.2.2\"" +
-                "                           }" +
-                "                        ]" +
-                "                }," +
-                "               {\"repo\" : \"jcentral\"}" +
-                "            ]," +
-                "   \"repo\" : \"jcentral\"" +
-                "}" +
-                ")" +
-                ".sort(" +
-                "{" +
-                "    \"$asc\" : [" +
-                "                        \"name\",\"path\"" +
-                "               ]" +
-                "}" +
-                ")"
-        );
-    }
-
-    @Test
-    public void findPropertiesFilteringByProperties() {
-        aqlService.executeQueryEager("properties.find(" +
-                "{" +
-                "       \"@license\" : \"GPL\"," +
-                "       \"@license\" : {\"$match\" : \"*GPL\"}" +
-                "}" +
-                ")");
-    }
-
-    @Test
-    public void findPropertiesUsingNotMach() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"type\" : \"any\",\"property.key\" : {\"$nmatch\" : \"a\"}})." +
-                        "include(\"property.key\",\"property.value\",\"id\")");
-        assertSize(queryResult, 31);
-    }
-
-
-    @Test
-    public void findArtifactsFilterByPropertiesUsingDefaultAnd() {
-        aqlService.executeQueryEager("items.find(" +
-                "{" +
-                "       \"@license\" : \"GPL\"," +
-                "       \"@license\" : {\"$match\" : \"*GPL\"}" +
-                "}" +
-                ")");
-    }
-
-    @Test
-    public void findArtifactsFilterByPropertiesUsingOrAndDefaultAnd() {
-        aqlService.executeQueryEager("items.find(" +
-                "{" +
-                "       \"@license\" : \"GPL\"," +
-                "       \"@license\" : {\"$match\" : \"*GPL\"}," +
-                "       \"$or\" : [" +
-                "                   {\"@.id\" : \"org.jfrog\"}," +
-                "                   {\"@classifier\" : {\"$match\" : \"source\"}}" +
-                "                 ]" +
-                "}" +
-                ")");
-    }
-
-    @Test
-    public void findArtifactsFilterByPropertiesUsingJoinAndDefaultAnd() {
-        aqlService.executeQueryEager("items.find(" +
-                "{" +
-                "       \"@license\" : \"GPL\"," +
-                "       \"@license\" : {\"$match\" : \"*GPL\"}," +
-                "       \"$msp\" : [" +
-                "                   {\"@group.id\" : \"org.jfrog\"}," +
-                "                   {\"@classifier\" : {\"$match\" : \"source\"}}" +
-                "                 ]" +
-                "}" +
-                ")");
-    }
-
-    @Test
-    public void findPropertiesFilterByPropertiesUsingJoinAndDefaultAnd1() {
-        aqlService.executeQueryEager("items.find(" +
-                "{" +
-                "       \"@license\" : \"GPL\"," +
-                "       \"@license\" : {\"$match\" : \"*GPL\"}," +
-                "       \"$msp\" : [" +
-                "                   {\"@group.id\" : \"org.jfrog\"}," +
-                "                   {\"@classifier\" : {\"$match\" : \"source\"}}" +
-                "                 ]" +
-                "}" +
-                ")");
-    }
-
-    @Test
-    public void findPropertiesFilterByPropertiesUsingJoinAndDefaultAnd2() {
-        aqlService.executeQueryEager("properties.find(" +
-                "{" +
-                "       \"@license\" : \"GPL\"," +
-                "       \"@license\" : {\"$match\" : \"*GPL\"}," +
-                "       \"$msp\" : [" +
-                "                   {\"@group.id\" : \"org.jfrog\"}," +
-                "                   {\"@classifier\" : {\"$match\" : \"source\"}}" +
-                "                 ]," +
-                "       \"item.repo\" : \"jcenter\"," +
-                "       \"@version\" : \"1.1.1\"," +
-                "       \"item.stat.downloads\" : 1" +
-                "}" +
-                ")");
-    }
-    /*Archive searches*/
-
-    @Test
-    public void findArtifactsByPropertyValueAndMatch() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"property.value\" : {\"$match\" : \"*is is st*\"}})");
-        assertSize(queryResult, 1);
-        assertItem(queryResult, "repo1", "ant/ant/1.5", "ant-1.5.jar", file);
-    }
-
-    @Test
-    public void findArtifactsByPropertyAndNotMatch() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"repo\" : {\"$ne\" : \"repo1    jkkj\"}})");
-        assertSize(queryResult, 11);
-        assertItem(queryResult, "repo1", "ant/ant/1.5", "ant-1.5.jar", file);
-    }
-
-    @Test
-    public void findArtifactsByPropertyValueAndDefaultEquals() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"property.value\" : \"this is string\"})");
-        assertSize(queryResult, 1);
-        assertItem(queryResult, "repo1", "ant/ant/1.5", "ant-1.5.jar", file);
-    }
-
-    @Test
-    public void findArtifactsByRepoAndDefaultEquals() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"repo\" : \"repo1\",\"type\" : \"any\"})");
-        assertSize(queryResult, 14);
-        assertItem(queryResult, "repo1", "ant", "ant", folder);
-        assertItem(queryResult, "repo1", "ant/ant/1.5", "ant-1.5.jar", file);
-    }
-
-    @Test
-    public void findArtifactsByRepoEqualsAndPathMatches() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"type\" : \"any\",\"repo\" : \"repo1\", \"path\" : {\"$match\" : \"ant*\"}})");
-        assertSize(queryResult, 4);
-        assertItem(queryResult, "repo1", "ant", "ant", folder);
-        assertItem(queryResult, "repo1", "ant/ant/1.5", "ant-1.5.jar", file);
-    }
-
-    @Test
-    public void findArtifactsByArtifactTypeFolder() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager("items.find({\"type\" :\"folder\"})");
-        assertSize(queryResult, 15);
-        assertItem(queryResult, "repo1", ".", ".", folder);
-        assertItem(queryResult, "repo1", "ant/ant", "1.5", folder);
-    }
-
-    @Test
-    public void findArtifactsByRepoEqualsAndArtifactTypeFile() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"repo\": \"repo1\" , \"type\" :\"file\"})");
-        assertSize(queryResult, 4);
-        assertItem(queryResult, "repo1", "org/yossis/tools", "file2.bin", file);
-        assertItem(queryResult, "repo1", "ant/ant/1.5", "ant-1.5.jar", file);
-    }
-
-    @Test
-    public void findArtifactsByPropertyValueAndPropertyKey() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"@*\" : {\"$eq\": \"ant\"} , \"@build.name\" : {\"$eq\" : \"*\"}})");
-        assertSize(queryResult, 1);
-        assertItem(queryResult, "repo1", "ant/ant/1.5", "ant-1.5.jar", file);
-    }
-
-    @Test
-    public void findArtifactsUsingRepoFieldPropertyKeyPropertyValueShortcut() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"type\" : \"any\",\"repo\": \"repo1\" , \"@*\" : {\"$eq\" : \"ant\"} , \"@build.name\" : {\"$eq\" : \"*\"}})");
-        assertSize(queryResult, 2);
-        assertItem(queryResult, "repo1", ".", ".", folder);
-        assertItem(queryResult, "repo1", "ant/ant/1.5", "ant-1.5.jar", file);
-    }
-
-    @Test
-    public void findArtifactsUsingRepoFieldAndProperty() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"type\" : \"any\",\"repo\": \"repo1\" , \"@build.name\" : \"ant\"})");
-        assertSize(queryResult, 2);
-        assertItem(queryResult, "repo1", ".", ".", folder);
-        assertItem(queryResult, "repo1", "ant/ant/1.5", "ant-1.5.jar", file);
-    }
-
-    @Test
-    public void findArtifactsUsingRepoFieldAndDates() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"type\" : \"any\",\"$or\" : [{\"$and\": [{\"repo\": \"repo1\"} , {\"type\": \"file\"}]} , {\"created\" : {\"$gt\" : \"1970-01-19T00:00:00.000Z\"}}]})");
-        assertSize(queryResult, 26);
-        assertItem(queryResult, "repo1", ".", ".", folder);
-        assertItem(queryResult, "repo1", ".", "ant", folder);
-        assertItem(queryResult, "repo1", "org/yossis/tools", "file2.bin", file);
-        assertItem(queryResult, "repo2", ".", "aa", folder);
-    }
-
-    @Test
-    public void findArtifactsUsingRepoFieldAndDatesAndLess() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"$or\" : [{\"$and\": [{\"repo\": \"none\"} , {\"type\": \"file\"}]} , {\"created\" : {\"$lt\" : \"1970-01-19T00:00:00.000Z\"}}]})");
-        assertSize(queryResult, 0);
-    }
-
-    @Test
-    public void findArtifactsUsingRepoFieldAndDatesAndAndOperator() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"type\" : \"any\",\"repo\": \"repo1\" , \"$or\" : [ " +
-                        "{\"created\" : {\"$lt\" : \"1970-01-19T00:00:00.000Z\"}}, {\"created\" : {\"$gt\" : \"1970-01-19T00:00:00.000Z\"}}]})");
-        assertSize(queryResult, 14);
-        assertItem(queryResult, "repo1", "ant/ant", "1.5", folder);
-        assertItem(queryResult, "repo1", "org/yossis", "tools", folder);
-        assertItem(queryResult, "repo1", "org/yossis/tools", "test.bin", file);
-    }
-
-    @Test
-    public void findArtifactsWithPartialDate() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"type\" : \"any\",\"repo\": \"repo1\" , \"$or\" : [ " +
-                        "{\"created\" : {\"$lt\" : \"1970-01-19T00:00:00.000Z\"}}, {\"created\" : {\"$gt\" : \"1970-01\"}}]})");
-        assertSize(queryResult, 14);
-        assertItem(queryResult, "repo1", "ant/ant", "1.5", folder);
-        assertItem(queryResult, "repo1", "org/yossis", "tools", folder);
-        assertItem(queryResult, "repo1", "org/yossis/tools", "test.bin", file);
-    }
-
-
-    @Test
-    public void findArtifactsUsingArchives() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"archive.entry.name\": {\"$match\" : \"a*\"}})");
-        assertSize(queryResult, 0);
-    }
-
-    @Test
-    public void findArtifactsUsingArchivesAndMatches() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"archive.entry.name\": {\"$match\" : \"t*\"}})");
-        assertSize(queryResult, 1);
-        assertItem(queryResult, "repo1", "org/yossis/tools", "file2.bin", file);
-    }
-
-    @Test
-    public void findArtifactsUsingOrOperatorAndAndOperator() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"type\" : \"any\",\"$or\" : [{\"$and\" : [{\"repo\": \"repo1\"},{\"@gffgfgf\" : \"yossis\"}]},{\"@jungle\": {\"$eq\" : \"*\"}}]})");
-        assertSize(queryResult, 1);
-        assertItem(queryResult, "repo1", "org", "yossis", folder);
-    }
-
-    @Test
-    public void findArtifactsUsingOrOperatorAndAndOperatorAndFieldsAndProperties() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"type\" : \"any\",\"$or\" : [{\"$and\" : [{\"repo\": \"repo1\"},{\"@yossis\" : \"pdf\"}]},{\"@jungle\":{\"$eq\" : \"*\"}}]})");
-        assertSize(queryResult, 2);
-        assertItem(queryResult, "repo1", "org", "yossis", folder);
-        assertItem(queryResult, "repo1", "org/yossis/tools", "test.bin", file);
-    }
-
-    @Test
-    public void itemTypeAllAtTheBeginning() {
-
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"type\":\"any\",\"$or\" : [{\"$and\" : [{\"repo\" : \"repo1\"},{\"@trance\": {\"$eq\" : \"*\"}}]},{\"@hjhj\" : \"yossis\"}]})");
-        assertSize(queryResult, 1);
-        assertItem(queryResult, "repo1", "org", "yossis", folder);
-    }
-
-    @Test
-    public void itemTypeAllAtTheEnd() {
-
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"$or\" : [{\"$and\" : [{\"repo\" : \"repo1\"},{\"@trance\": {\"$eq\" : \"*\"}}]},{\"@hjhj\" : \"yossis\"}],\"type\":\"any\"})");
-        assertSize(queryResult, 1);
-        assertItem(queryResult, "repo1", "org", "yossis", folder);
-    }
-
-    @Test
-    public void itemTypeAllBeforeParenthesis() {
-
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"$or\" : [{\"$and\" : [{\"repo\" : \"repo1\"},{\"@trance\": {\"$eq\" : \"*\"}}]},{\"@hjhj\" : \"yossis\"},{\"type\":\"any\"}],\"type\":\"any\"})");
-        assertSize(queryResult, 1);
-        assertItem(queryResult, "repo1", "org", "yossis", folder);
-    }
-
-    @Test
-    public void itemTypeAllAfterParenthesis() {
-
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"$or\" : [{\"$and\" : [{\"type\":\"any\"},{\"repo\" : \"repo1\"},{\"@trance\": {\"$eq\" : \"*\"}}]},{\"@hjhj\" : \"yossis\"}],\"type\":\"any\"})");
-        assertSize(queryResult, 1);
-        assertItem(queryResult, "repo1", "org", "yossis", folder);
-    }
-
-    @Test
-    public void itemTypeDuplicate() {
-
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"$or\" : [{\"$and\" : [{\"type\":\"any\"},{\"type\":\"any\"},{\"type\":\"any\"},{\"repo\" : \"repo1\"},{\"type\":\"any\"},{\"@trance\": {\"$eq\" : \"*\"}}]},{\"@hjhj\" : \"yossis\"}],\"type\":\"any\"})");
-        assertSize(queryResult, 1);
-        assertItem(queryResult, "repo1", "org", "yossis", folder);
-    }
-
-    @Test
-    public void itemTypeAllDuplicate() {
-
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"type\":\"any\",\"$or\" : [{\"type\":\"any\"},{\"$and\" : [{\"type\":\"any\"},{\"type\":\"any\"},{\"type\":\"any\"},{\"type\":\"any\"},{\"type\":\"any\"},{\"type\":\"any\"}]},{\"type\":\"any\"}],\"type\":\"any\"})");
-        assertSize(queryResult, 26);
-        assertItem(queryResult, "repo1", "org", "yossis", folder);
-    }
-
-    @Test
-    public void findArtifactsWithOrAndAndOperatorsAndArtifactsFieldsAndPropertyKeyMatching() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"type\" : \"any\",\"$or\" : [{\"$and\" : [{\"repo\" : \"repo1\"},{\"$or\" : [{\"@build.name\" : \"ant\"},{\"@jungle\": {\"$eq\" : \"*\"}}]}]},{\"path\" : {\"$match\" : \"x*\"}}]})");
-        assertSize(queryResult, 3);
-        assertItem(queryResult, "repo1", ".", ".", folder);
-        assertItem(queryResult, "repo1", "ant/ant/1.5", "ant-1.5.jar", file);
-        assertItem(queryResult, "repo1", "org", "yossis", folder);
-    }
-
-    @Test
-    public void findArtifactsWithCanonicalAndOrOperatorsAndArtifactsFieldsAndPropertyKeyMatching() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"type\" : \"any\",\"$or\" : [{\"$and\" : [{\"repo\" : \"repo1\"},{\"$or\" : [{\"@build.name\" : {\"$ne\" : \"ant\"}},{\"@jungle\": {\"$ne\" : \"*\"}}]}]},{\"path\" : {\"$match\" : \"x*\"}}]})");
-        assertSize(queryResult, 14);
-        assertItem(queryResult, "repo1", ".", ".", folder);
-        assertItem(queryResult, "repo1", "org/yossis", "empty", folder);
-        assertItem(queryResult, "repo1", "org/yossis/tools", "test.bin", file);
-    }
-
-    @Test
-    public void findArtifactsWithCanonicalAndOperatorsAndArtifactsFieldsAndPropertyKeyMatchingAndNorEqual() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"type\" : \"any\",\"$or\" : [{\"$and\" : [{\"repo\" : \"repo1\"},{\"$and\" : [{\"@build.name\" : {\"$ne\" : \"an\"}},{\"@jungle\": {\"$ne\" : \"*\"}}]}]},{\"path\" : {\"$match\" : \"x*\"}}]})");
-        assertSize(queryResult, 13);
-        assertItem(queryResult, "repo1", ".", ".", folder);
-        assertItem(queryResult, "repo1", "ant/ant/1.5", "ant-1.5.jar", file);
-    }
-
-    @Test
-    public void findArtifactsWithCanonicalAndOrOperatorsAndArtifactsFieldsUsingNotEquals() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"type\" : \"any\",\"$or\" : [{\"$and\" : [{\"repo\" : \"repo1\"},{\"$or\" : [{\"@yossis\" : {\"$ne\" : \"ant\"}},{\"@jungle\": {\"$eq\" : \"*\"}}]}]},{\"path\" : {\"$match\" : \"x*\"}}]})");
-        assertSize(queryResult, 14);
-        assertItem(queryResult, "repo1", "org", "yossis", folder);
-        assertItem(queryResult, "repo1", "org/yossis/tools", "test.bin", file);
-    }
-
-    @Test
-    public void findArtifactsWithCanonicalAndOrOperatorsAndArtifactsFieldsAndArchiveFields() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"repo\" : \"repo1\", \"$and\" : [{\"@yossis\" : {\"$ne\" : \"an\"}},{\"archive.entry.name\": {\"$match\" : \"file*\"}}]})");
-        assertSize(queryResult, 1);
-        assertItem(queryResult, "repo1", "org/yossis/tools", "test.bin", file);
-    }
-
-    @Test
-    public void findArtifactsWithCanonicalAndOrOperatorsAndArtifactsFieldsAndArchiveFieldsUsingNotEquals() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"repo\" : \"repo1\", \"$and\" : [{\"@build.name\" : {\"$ne\" : \"ant\"}},{\"archive.entry.name\": {\"$match\" : \"file*\"}},{\"archive.entry.name\": \"lll\"}]})");
-        assertSize(queryResult, 0);
-    }
-
-    @Test
-    public void findArtifactsWithBuildFields() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"repo\" : \"repo1\",\"artifact.module.build.url\" : \"http://jkgkgkgk\"})");
-        assertSize(queryResult, 0);
-    }
-
-    @Test
-    public void findArtifactsWithOrOperatorsAndArtifactsFieldsAndPropertyKeyMatching() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"type\" : \"any\",\"repo\" : \"repo1\", \"$or\" : [{\"@yo*\" : {\"$match\" : \"*\"}}, {\"@*\" : {\"$match\" : \"ant*\"}},{\"@license\" : \"GPL\"}]})");
-        assertSize(queryResult, 4);
-        assertItem(queryResult, "repo1", "org", "yossis", folder);
-        assertItem(queryResult, "repo1", ".", ".", folder);
-        assertItem(queryResult, "repo1", "ant/ant/1.5", "ant-1.5.jar", file);
-    }
-
-    @Test
-    public void findArtifactWithShortEqualsQueriesAndNormalQueries() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"repo\" : \"repo1\", \"artifact.module.build.number\" : {\"$match\" : \"1*\"}})");
-        assertSize(queryResult, 1);
-        assertItem(queryResult, "repo1", "org/yossis/tools", "test.bin", file);
-    }
-
-    @Test
-    public void findArtifactWithShortEqualsQueries1() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"repo\" : \"repo1\", \"dependency.type\" : \"dll\"})");
-        assertSize(queryResult, 2);
-        assertItem(queryResult, "repo1", "ant/ant/1.5", "ant-1.5.jar", file);
-    }
-
-    @Test
-    public void findArtifactWithShortEqualsQueries2() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"type\" : \"any\",\"repo\" : \"repo1\", \"stat.downloaded_by\" : \"yossis\"})");
-        assertSize(queryResult, 3);
-        assertItem(queryResult, "repo1", "org", "yossis", folder);
-        assertItem(queryResult, "repo1", ".", "ant-launcher", folder);
-    }
-
-    @Test
-    public void findArtifactWithOrAndAndOperatorsArtifactFieldsAndProperties() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"type\" : \"any\",\"repo\" : \"repo1\", \"stat.downloaded_by\" : \"yossis\", \"$or\" : [{\"@yo*\" : {\"$match\" : \"*\"}} , { \"@*\":{\"$match\" : \"ant*\"}},{\"@license\" : \"GPL\"}]})");
-        assertSize(queryResult, 2);
-        assertItem(queryResult, "repo1", "org", "yossis", folder);
-        assertItem(queryResult, "repo1", "ant/ant/1.5", "ant-1.5.jar", file);
-    }
-
-    @Test
-    public void findArtifactWithJoin() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"$msp\" : [{\"@license\"  : {\"$match\" : \"*GPL\"}}, {\"@license\"  : {\"$ne\" : \"LGPL\"}}]})");
-        assertSize(queryResult, 0);
-    }
-
-    @Test
-    public void findArtifactWithPropertyNotMatches() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"@build.name\"  : {\"$nmatch\" : \"*GPL\"}})");
-        assertSize(queryResult, 11);
-    }
-
-    @Test(enabled = false)
-    public void findArtifactWithPropertyValueNotMatches() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"@*\"  : {\"$nmatch\" : \"*GPL\"}})");
-        assertSize(queryResult, 26);
-    }
-
-    @Test
-    public void findArtifactWithPropertyKeyNotMatches() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"@yossis\"  : {\"$nmatch\" : \"*\"}})");
-        assertSize(queryResult, 10);
-    }
-
-    @Test
-    public void findArtifactWithPropertyKeyNotMatchesAnyThing() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"@hghghg\"  : {\"$nmatch\" : \"*\"}})");
-        assertSize(queryResult, 11);
-    }
-
-    @Test
-    public void artifactWithLimit() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"@build.name\"  : {\"$nmatch\" : \"*\"}}).limit(2)");
-        assertSize(queryResult, 2);
-    }
-
-    @Test
-    public void artifactWithNotMatch() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"@build.name\"  : {\"$nmatch\" : \"antd\"},\"type\":\"any\"}).limit(2)");
-        assertSize(queryResult, 2);
-    }
-
-    @Test
-    public void artifactWithNotMatch1() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"@build.name\"  : {\"$nmatch\" : \"*\"},\"type\":\"any\"}).limit(2)");
-        assertSize(queryResult, 2);
-    }
-
-    /*Properties search*/
-    @Test
-    public void findPropertiesMergingArtifactsFieldJoinAndOrOperatorUsingMatchesAndFilteringByPropertyKey() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "properties.find({\"item.repo\" : \"repo1\",\"$or\" : [{\"$msp\" : [{\"b*\"  : {\"$match\" : \"*\"}} , {\"e*\"  : {\"$match\": \"*\"}},{\"asdasdasdas\" : \"dsdsadasd\"}]}]})");
-        assertSize(queryResult, 5);
-        assertProperty(queryResult, "empty.val", "");
-        assertProperty(queryResult, "build.number", "67");
-        assertProperty(queryResult, "build.name", "ant");
-    }
-
-    @Test
-    public void purePropertiesSearch() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "properties.find({\"yossis\"  : {\"$eq\" : \"*\"}})");
-        assertSize(queryResult, 4);
-        assertProperty(queryResult, "jungle", "value2");
-        assertProperty(queryResult, "trance", "me");
-    }
-
-
-    @Test
-    public void findPropertiesMergingArtifactsFieldsAndPropertyKeFiltering() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "properties.find({\"item.repo\" : \"repo1\",\"yossis\"  : {\"$eq\" : \"*\"}})");
-        assertSize(queryResult, 4);
-        assertProperty(queryResult, "yossis", "pdf");
-    }
-
-    @Test
-    public void findPropertiesUsingJoinAndOrOperator() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "properties.find({\"$msp\" : [ {\"$or\" : [{\"trance\"  : {\"$eq\" : \"*\"}},{\"yossis\"  : {\"$eq\" : \"*\" }}]}]})");
-        assertSize(queryResult, 4);
-        assertProperty(queryResult, "trance", "me");
-        assertProperty(queryResult, "yossis", "pdf");
-        assertProperty(queryResult, "yossis", "value1");
-    }
-
-    @Test
-    public void findPropertiesFilteringByKey() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "properties.find({\"yo*\"  : {\"$match\" : \"*\"}})");
-        assertSize(queryResult, 4);
-        assertProperty(queryResult, "yossis", "pdf");
-        assertProperty(queryResult, "yossis", "value1");
-    }
-
-    @Test
-    public void findPropertiesUsingJoin() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "properties.find({\"$msp\" : [{\"$or\" : [{\"@yo*\" : {\"$match\" : \"*\"}}, {\"@*\" : {\"$match\" : \"*o\"}}, {\"item.path\" : {\"$match\" : \"org*\"}}]}]})");
-        assertSize(queryResult, 6);
-        assertProperty(queryResult, "empty.val", "");
-        assertProperty(queryResult, "trance", "me");
-    }
-
-    @Test
-    public void findPropertiesMergingFieldsArchiveAndEqualls() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "properties.find({\"item.archive.entry_name\" : \"llklk\"})");
-        assertSize(queryResult, 0);
-    }
-
-    @Test
-    public void findPropertiesMergingFieldsArchiveAndMaching() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "properties.find({\"item.archive.entry_name\" : {\"$match\" :\"*.xml\"}})");
-        assertSize(queryResult, 0);
-    }
-
-    @Test
-    public void findPropertiesMergingFieldsFromStatisticsAndPropertiesAnfArtifactsAndBuildUsingDates() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "properties.find({\"item.repo\" :\"repo1\" ,  \"item.artifact.module.build.created\" : {\"$gt\" :\"1970-01-19T00:00:00.000Z\"}})");
-        assertSize(queryResult, 1);
-        assertProperty(queryResult, "yossis", "pdf");
-    }
-
-    @Test
-    public void findPropertiesMergingFieldsFromStatisticsAndPropertiesAnfArtifactsUsingDates() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "properties.find({\"item.repo\" :\"repo1\" ,  \"item.artifact.module.build.created\" : {\"$lt\" :\"1970-01-19T00:00:00.000Z\"}})");
-        assertSize(queryResult, 0);
-    }
-
-    @Test
-    public void findPropertiesMergingFieldsFromStatisticsAndProperties() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "properties.find({\"item.repo\" :\"repo1\" , \"item.stat.downloaded_by\" :\"yossis\", \"$or\" : [ {\"yo*\" : {\"$match\" : \"*\"} , \"*\" : {\"$match\" : \"ant*\"}, \"license\" : \"GPL\"}]})");
-        assertSize(queryResult, 6);
-        assertProperty(queryResult, "yossis", "value1");
-        assertProperty(queryResult, "build.name", "ant");
-    }
-
-    ///*Statistics search*/
-    @Test
-    public void findStatistics() {
-        //AqlQueryResult queryResult = aqlService.executeQueryEager("find statistics filter by repo=repo1");
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "stats.find({\"item.repo\" :\"repo1\"},{\"downloads\":{\"$gte\":0}})");
-        assertSize(queryResult, 2);
-        assertStatistics(queryResult, 15, "yossis");
-    }
-
-    /*build dependencies*/
-    @Test
-    public void findBuildDependenciesMergingArtifactFieldsAndBuildFields1() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "dependencies.find({\"item.repo\" :\"repo1\",\"module.build.number\" : 1})");
-        assertSize(queryResult, 2);
-        assertDependencies(queryResult, "ba1mod3-art1", "compile", "dll");
-        assertDependencies(queryResult, "bb1mod3-art1", "compile", "dll");
-    }
-
-    @Test
-    public void findBuildDependenciesMergingArtifactFieldsAndBuildFields2() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "dependencies.find({\"item.repo\" :\"repo1\",\"module.build.number\" : \"1\"})");
-        assertSize(queryResult, 2);
-        assertDependencies(queryResult, "ba1mod3-art1", "compile", "dll");
-        assertDependencies(queryResult, "bb1mod3-art1", "compile", "dll");
-    }
-
-    @Test
-    public void findArchives() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "archive.entries.find({\"archive.item.repo\" :\"repo1\"})");
-        assertSize(queryResult, 8);
-        assertArchive(queryResult, "META-INF", "LICENSE.txt");
-        assertArchive(queryResult, "META-INF", "MANIFEST.MF");
-    }
-
-    @Test
-    public void findArchivesFilterByArchiveEntryPath() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "archive.entries.find({\"archive.item.repo\" :\"repo1\",\"archive.entry.path\" :\"META\"})");
-        assertSize(queryResult, 0);
-    }
-
-    @Test
-    public void findBuildDependenciesMergingArtifactFieldsAndBuildFieldsAndBuildPropertiesFields() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "dependencies.find({\"item.repo\" :\"repo1\",\"module.build.number\" : 1 , \"module.build.property.value\" :\"bad\"})");
-        assertSize(queryResult, 1);
-        assertDependencies(queryResult, "bb1mod3-art1", "compile", "dll");
-    }
-
-    @Test
-    public void findBuildWithItemProperties() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "builds.find({\"module.artifact.item.repo\" :\"repo1\", \"module.artifact.item.@*\" :{\"$match\":\"*\"}})");
-        assertSize(queryResult, 3);
-        assertBuild(queryResult, "bb", "1");
-    }
-
-    @Test
-    public void findBuildWithNotMatchItemProperties1() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "builds.find({\"module.artifact.item.repo\" :\"repo1\", \"module.artifact.item.@*\" :{\"$nmatch\":\"*\"}})");
-        assertSize(queryResult, 0);
-    }
-
-    @Test
-    public void findBuildWithNotMatchItemProperties2() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "builds.find({\"module.artifact.item.repo\" :\"repo1\", \"module.artifact.item. at build.number\" :{\"$nmatch\":\"*\"}})");
-        assertSize(queryResult, 3);
-    }
-
-    @Test
-    public void findBuildWithNotMatchItemProperties3() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "builds.find({\"module.artifact.item.repo\" :\"repo1\", \"module.artifact.item.@*\" :{\"$nmatch\":\"67\"}})");
-        assertSize(queryResult, 3);
-    }
-
-    @Test
-    public void findBuildPropertiesByBuildPropertiesUsingAt() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "builds.find({\"@status\" :\"good\",\"@start\" :\"4\"})");
-        assertSize(queryResult, 1);
-    }
-
-    @Test
-    public void findBuildPropertiesByBuildProperties() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "build.properties.find({\"status\" :\"good\",\"start\" :\"4\"})");
-        assertSize(queryResult, 2);
-    }
-
-    @Test
-    public void findBuildModulePropertiesByModuleProperties() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "module.properties.find({\"status\" :\"good\",\"start\" :\"4\"})");
-        assertSize(queryResult, 2);
-    }
-
-    @Test
-    public void findBuildModulePropertiesByBuildName() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "module.properties.find({\"module.build.name\" :\"ba\",\"start\" :\"4\"})");
-        assertSize(queryResult, 2);
-    }
-
-    @Test
-    public void findItemsFilteringByBuildProperties() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"artifact.module.build. at start\" :\"1\"})");
-        assertSize(queryResult, 1);
-    }
-
-    @Test
-    public void findModulesFilteringByBuildProperties() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "modules.find({\"build. at start\" :\"1\"})");
-        assertSize(queryResult, 2);
-    }
-
-    @Test
-    public void findModulesFilteringByItemProperties() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "modules.find({\"artifact.item. at yossis\" :\"pdf\"})");
-        assertSize(queryResult, 3);
-    }
-
-    @Test
-    public void findModulesFilteringByModulePropertiesWithStarOnValue() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "modules.find({\"@start\" :\"*\"})");
-        assertSize(queryResult, 2);
-    }
-
-    @Test
-    public void findModulesFilteringByModulePropertiesWithStarOnKey() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "modules.find({\"@*\" :\"1\"})");
-        assertSize(queryResult, 1);
-    }
-
-    @Test
-    public void findModulesFilteringByModulePropertiesWithStarOnKeyAndValue() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "modules.find({\"@*\" :{\"$match\":\"*\"}})");
-        assertSize(queryResult, 2);
-    }
-
-    @Test
-    public void findBuildsFilteringByBuildProperties() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "modules.find({\"build. at start\" :\"1\"})");
-        assertSize(queryResult, 2);
-        assertModule(queryResult,"bb:modb1");
-        assertModule(queryResult,"bb:modb2");
-    }
-
-    @Test
-    public void findModulesBuildsPropertiesNotMatch() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "modules.find({\"build. at start\" :{\"$nmatch\":\"1\"}})");
-        assertSize(queryResult, 1);
-        assertModule(queryResult, "ba:moda1");
-        assertModule(queryResult,"ba:moda1");
-    }
-
-    @Test
-    public void findBuildsWithPropertiesNotMatch() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "builds.find({\"@start\" :{\"$nmatch\":\"1\"}})");
-        assertSize(queryResult, 4);
-    }
-
-    @Test
-    public void findModulesWithPropertiesNotMatch() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "modules.find({\"@start\" :{\"$nmatch\":\"1\"}})");
-        assertSize(queryResult, 2);
-        assertModule(queryResult,  "ba:moda1");
-        assertModule(queryResult,"ba:moda1");
-    }
-
-    @Test
-    public void buildPropertiesWithInclude() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "modules.find({\"@start\" :{\"$nmatch\":\"1\"}}).include(\"@start\")");
-        assertSize(queryResult, 2);
-        assertModule(queryResult,  "ba:moda1");
-        assertModule(queryResult,"ba:moda1");
-    }
-
-    @Test
-    public void msp() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "modules.find({\"$msp\":[{\"@start\" :{\"$nmatch\":\"1\"}},{\"build.@*\" :{\"$match\":\"*\"}}]})");
-        assertSize(queryResult, 3);
-        assertModule(queryResult, "ba:moda1");
-    }
-
-
-    @Test
-    public void findBuildsFilteringByItemProperties() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "modules.find({\"artifact.item. at yossis\" :\"pdf\"})");
-        assertSize(queryResult, 3);
-    }
-
-    @Test
-    public void findBuildsFilteringByModulePropertiesWithStarOnValue() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "builds.find({\"@start\" :\"*\"})");
-        assertSize(queryResult, 3);
-    }
-
-    @Test
-    public void findBuildsFilteringByModulePropertiesWithStarOnKey() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "builds.find({\"@*\" :\"1\"})");
-        assertSize(queryResult, 1);
-    }
-
-    @Test
-    public void findBuildsFilteringByModulePropertiesWithStarOnKeyAndValue() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "builds.find({\"@*\" :{\"$match\":\"*\"}})");
-        assertSize(queryResult, 3);
-    }
-
-    @Test
-    public void findBuildsFilteringByModulePropertiesAndIncludeUsage() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "builds.find({\"@*\" :{\"$match\":\"*\"}}).include(\"@start\")");
-        assertSize(queryResult, 3);
-    }
-
-    @Test
-    public void findBuildWithNotMatchItemProperties5() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "builds.find({\"module.artifact.item.repo\" :\"repo1\", \"module.artifact.item. at build.number\" :{\"$nmatch\":\"67\"}})");
-        assertSize(queryResult, 3);
-    }
-
-    /*build artifacts*/
-    @Test
-    public void findBuildArtifactsMergingArtifactFieldsAndBuildFieldsAndBuildPropertiesFields() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "artifacts.find({\"item.repo\" :\"repo1\",\"module.build.number\" : 1 , \"module.build.property.value\" :\"bad\"})");
-        assertSize(queryResult, 1);
-        assertBuildArtifacts(queryResult, "ba1mod1-art1", "dll");
-    }
-
-    @Test
-    public void findBuildArtifactsMergingArtifactFieldsAndBuildFieldsAndBuildFields1() {
-        //AqlQueryResult queryResult = aqlService.executeQueryEager("find build_artifacts filter by repo=repo1 and build_name=ba");
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "artifacts.find({\"item.repo\" :\"repo1\",\"module.build.name\" : \"ba\"})");
-        assertSize(queryResult, 2);
-        assertBuildArtifacts(queryResult, "ba1mod1-art1", "dll");
-        assertBuildArtifacts(queryResult, "ba2mod4-art1", "dll");
-    }
-
-    @Test
-    public void findBuildArtifactsMergingArtifactFieldsAndBuildFieldsAndBuildFields2() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "artifacts.find({\"item.repo\" :\"repo1\",\"module.build.number\" : 1})");
-        assertSize(queryResult, 3);
-        assertBuildArtifacts(queryResult, "ba1mod1-art1", "dll");
-        assertBuildArtifacts(queryResult, "bb1mod3-art1", "dll");
-        assertBuildArtifacts(queryResult, "bb1mod2-art1", "dll");
-    }
-
-    @Test
-    public void includeInProperties() {
-        //AqlEagerResult queryResult = aqlService.executeQueryEager("items.find({\"repo\" :\"repo1\"}).include(\"@ddd\",\"@ddd\")");
-
-        //System.out.println("");
-
-        AqlEagerResult queryResulta = aqlService.executeQueryEager("items.find({\"repo\": {\"$eq\": \"pd-canoe\"}, \"@gitRepo\": {\"$match\": \"*/Pardot/pardot.git\"}, \"@gitBranch\": {\"$eq\": \"master\"}}).include(\"*\").limit(1)");
-
-        System.out.println("");
-
-    }
-
-    @Test
-    public void checkOrBehaviour() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"archive.entry.name\" : {\"$match\": \"*txt\"}}).sort({\"$desc\" : [\"name\"]})");
-        assertSize(queryResult, 1);
-        assertItem(queryResult, "repo1", "ant/ant/1.5", "ant-1.5.jar", file);
-
-        queryResult = aqlService.executeQueryEager(
-                "items.find({\"archive.entry.name\" : {\"$match\": \"*file\"}}).sort({\"$desc\" : [\"name\"]})");
-        assertSize(queryResult, 1);
-        assertItem(queryResult, "repo1", "org/yossis/tools", "test.bin", file);
-
-        queryResult = aqlService.executeQueryEager(
-                "items.find({\"$or\":[{\"archive.entry.name\" : {\"$match\": \"*txt\"}},{\"archive.entry.name\" : {\"$match\": \"*file\"}}]}).sort({\"$desc\" : [\"name\"]})");
-        assertSize(queryResult, 2);
-        assertItem(queryResult, "repo1", "ant/ant/1.5", "ant-1.5.jar", file);
-        assertItem(queryResult, "repo1", "org/yossis/tools", "test.bin", file);
-    }
-
-    @Test
-    public void checkAndBehaviour() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"archive.entry.name\" : {\"$match\": \"*txt\"}}).sort({\"$desc\" : [\"name\"]})");
-        assertSize(queryResult, 1);
-        assertItem(queryResult, "repo1", "ant/ant/1.5", "ant-1.5.jar", file);
-
-        queryResult = aqlService.executeQueryEager(
-                "items.find({\"archive.entry.name\" : {\"$match\": \"*file\"}}).sort({\"$desc\" : [\"name\"]})");
-        assertSize(queryResult, 1);
-        assertItem(queryResult, "repo1", "org/yossis/tools", "test.bin", file);
-
-        queryResult = aqlService.executeQueryEager(
-                "items.find({\"$and\":[{\"archive.entry.name\" : {\"$match\": \"*txt\"}},{\"archive.entry.name\" : {\"$match\": \"*file\"}}]}).sort({\"$desc\" : [\"name\"]})");
-        assertSize(queryResult, 0);
-    }
-
-    @Test
-    public void findItemThatIsAnArtifactAndDependency() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"dependency.name\" : {\"$match\": \"*\"}}).sort({\"$desc\" : [\"name\"]})");
-        assertSize(queryResult, 3);
-        queryResult = aqlService.executeQueryEager(
-                "items.find({\"artifact.name\" : {\"$match\": \"*\"}})");
-        assertSize(queryResult, 1);
-        queryResult = aqlService.executeQueryEager(
-                "items.find({\"$or\":[{\"artifact.name\" : {\"$match\": \"*\"}},{\"dependency.name\" : {\"$match\": \"*\"}}]}).sort({\"$desc\" : [\"name\"]})");
-        assertSize(queryResult, 4);
-    }
-
-    @Test
-    public void relativeDateLastYearsNumber() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"created\" : {\"$last\": \"10years\"}}).sort({\"$desc\" : [\"name\"]})");
-        assertSize(queryResult, 11);
-    }
-
-    @Test
-    public void relativeDateLastYearsString() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"created\" : {\"$last\": \"10y\"}}).sort({\"$desc\" : [\"name\"]})");
-        assertSize(queryResult, 11);
-    }
-
-    @Test
-    public void relativeDateLastYearsString2() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"created\" : {\"$last\": \"10y\"}}).sort({\"$desc\" : [\"name\"]})");
-        assertSize(queryResult, 11);
-    }
-
-    @Test
-    public void relativeDateLastDaysNumber() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"created\" : {\"$last\": \"100d\"}}).sort({\"$desc\" : [\"name\"]})");
-        assertSize(queryResult, 0);
-    }
-    @Test
-    public void relativeDatebeforeDaysNumber() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"created\" : {\"$before\": \"1Minutes\"}}).sort({\"$desc\" : [\"name\"]})");
-        assertSize(queryResult, 11);
-    }
-
-    @Test
-    public void relativeDatebeforeSecondsNumber1() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"created\" : {\"$before\": \"60Seconds\"}}).sort({\"$desc\" : [\"name\"]})");
-        assertSize(queryResult, 11);
-    }
-
-    @Test
-    public void relativeDatebeforeSecondsNumber2() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"created\" : {\"$before\": \"100000seconds\"}}).sort({\"$desc\" : [\"name\"]})");
-        assertSize(queryResult, 11);
-    }
-
-    @Test
-    public void relativeDatebeforeSecondsNumber3() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"created\" : {\"$before\": \"100000S\"}}).sort({\"$desc\" : [\"name\"]})");
-        assertSize(queryResult, 11);
-    }
-
-    @Test
-    public void relativeDatebeforeSecondsNumber4() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"created\" : {\"$before\": \"100000s\"}}).sort({\"$desc\" : [\"name\"]})");
-        assertSize(queryResult, 11);
-    }
-
-
-    @Test
-    public void relativeDatebeforeDaysNumber1() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"created\" : {\"$before\": \"1Days\"}}).sort({\"$desc\" : [\"name\"]})");
-        assertSize(queryResult, 11);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlSortTest.java b/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlSortTest.java
deleted file mode 100644
index bba6afb..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlSortTest.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package org.artifactory.storage.db.aql.service;
-
-import org.artifactory.aql.result.AqlEagerResult;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlSortTest extends AqlAbstractServiceTest {
-
-    @Test
-    public void findBuildArtifactsSortAsc() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "artifacts.find().sort({\"$asc\" : [\"name\"]})");
-        assertSize(queryResult, 5);
-        assertBuildArtifacts(queryResult, "bb1mod3-art1", "dll");
-        assertBuildArtifacts(queryResult, "bb1mod2-art1", "dll");
-        assertBuildArtifacts(queryResult, "ba2mod4-art1", "dll");
-        assertBuildArtifacts(queryResult, "ba1mod1-art2", "dll");
-        assertBuildArtifacts(queryResult, "ba1mod1-art1", "dll");
-    }
-
-    @Test
-    public void findBuildArtifactsSortDesc() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "artifacts.find().sort({\"$desc\" : [\"name\"]})");
-        assertSize(queryResult, 5);
-        assertBuildArtifacts(queryResult, "bb1mod3-art1", "dll");
-        assertBuildArtifacts(queryResult, "bb1mod2-art1", "dll");
-        assertBuildArtifacts(queryResult, "ba2mod4-art1", "dll");
-        assertBuildArtifacts(queryResult, "ba1mod1-art2", "dll");
-        assertBuildArtifacts(queryResult, "ba1mod1-art1", "dll");
-    }
-
-    @Test
-    public void findBuildArtifactsWithExtraFieldsAndSorting() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "artifacts.find({\"item.repo\" : \"repo1\"}).sort({\"$desc\" : [\"name\"]})");
-        assertSize(queryResult, 4);
-        assertBuildArtifacts(queryResult, "bb1mod3-art1", "dll");
-        assertBuildArtifacts(queryResult, "bb1mod2-art1", "dll");
-        assertBuildArtifacts(queryResult, "ba2mod4-art1", "dll");
-        assertBuildArtifacts(queryResult, "ba1mod1-art1", "dll");
-    }
-
-    /*complex string comparator */
-    @Test
-    public void sortWithcomplexStringComparator() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "artifacts.find({\"item.repo\" :{\"$match\" : \"r*p*1\"}}).sort({\"$desc\" : [\"name\"]})");
-        assertSize(queryResult, 4);
-        assertBuildArtifacts(queryResult, "bb1mod3-art1", "dll");
-        assertBuildArtifacts(queryResult, "bb1mod2-art1", "dll");
-        assertBuildArtifacts(queryResult, "ba2mod4-art1", "dll");
-        assertBuildArtifacts(queryResult, "ba1mod1-art1", "dll");
-    }
-
-
-    @Test
-    public void failOnSortThatContainsNoneResultField() {
-        try {
-            aqlService.executeQueryEager(
-                    "items.find({\"repo\" : \"repo1\"}).sort({\"$desc\" : [\"artifact.module.build.number\", \"repo\"]})");
-            Assert.fail();
-        } catch (Exception e) {
-            Assert.assertTrue(e.getMessage().contains(
-                    "Only the result fields are allowed to use in the sort section"));
-        }
-    }
-
-    @Test
-    public void rejectionSortByValue1() {
-        try {
-            aqlService.executeQueryEager(
-                    "items.find({\"repo\" : \"repo1\"}).sort({\"$desc\" : [\"dsdsdsd\", \"repo\"]})");
-            Assert.fail();
-        } catch (Exception e) {
-            Assert.assertTrue(e.getMessage().contains(
-                    "it looks like there is syntax error near the following sub-query: dsdsdsd"));
-        }
-    }
-
-    @Test
-    public void uniqueSortField() {
-        // RTFACT-9709 Validate that there are no duplicate sort fields, inserted by AQL.
-        // Sort is being done automatically by AQL to support canonical JSON result.
-        aqlService.executeQueryEager(
-                "archive.entries.find({\n" +
-                        "        \"archive.item.repo\": {\n" +
-                        "            \"$match\": \"aql-test-repo\"\n" +
-                        "        }\n" +
-                        "        ,\n" +
-                        "        \"archive.item.path\": {\n" +
-                        "            \"$match\": \"subfolder1\"\n" +
-                        "        }\n" +
-                        "        ,\n" +
-                        "        \"archive.entry.name\": {\n" +
-                        "            \"$match\": \"*.txt\"\n" +
-                        "        }\n" +
-                        "    }).include(\"archive.entry.*\",\"archive.item.*\")");
-    }
-
-    @Test
-    public void duplicateSortsFields() {
-        // RTFACT-9709 Validate that there are no duplicate sort fields, inserted by user.
-        try {
-            aqlService.executeQueryEager(
-                    "artifacts.find({\"item.repo\" :{\"$match\" : \"r*p*1\"}}).sort({\"$desc\" : [\"name\",\"name\"]})");
-            Assert.fail();
-        } catch (Exception e) {
-            Assert.assertTrue(e.getMessage().contains(
-                    "Duplicate fields, all the fields in the sort section should be unique."));
-        }
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlStatsOrientedSearchesTest.java b/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlStatsOrientedSearchesTest.java
deleted file mode 100644
index 1f18e47..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlStatsOrientedSearchesTest.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.storage.db.aql.service;
-
-import org.artifactory.aql.result.AqlEagerResult;
-import org.testng.annotations.Test;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlStatsOrientedSearchesTest extends AqlAbstractServiceTest {
-
-    ///*Statistics search*/
-    @Test
-    public void findStatistics() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "stats.find({\"item.repo\" :\"repo1\"},{\"downloads\":{\"$gt\":0}})");
-        assertSize(queryResult, 2);
-        assertStatistics(queryResult, 15, "yossis");
-    }
-
-}
-
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlValueTypesTest.java b/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlValueTypesTest.java
deleted file mode 100644
index 8642b14..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/aql/service/AqlValueTypesTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.artifactory.storage.db.aql.service;
-
-import org.artifactory.aql.AqlException;
-import org.artifactory.aql.result.AqlEagerResult;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * @author Gidi Shabat
- */
-public class AqlValueTypesTest extends AqlAbstractServiceTest {
-
-    @Test
-    public void badIntFormat() {
-        try {
-            aqlService.executeQueryEager(
-                    "items.find({\"repo\" :\"repo1\",\"stat.downloads\":{\"$eq\":\"null\"}})");
-            Assert.fail();
-        } catch (AqlException e) {
-            Assert.assertEquals(e.getMessage(), "AQL Expect integer value but found:null\n");
-        }
-    }
-
-    @Test
-    public void dateFormat() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"repo\" :\"repo1\",\"modified\":{\"$eq\":\"12-12-12\"}})");
-        assertSize(queryResult, 0);
-    }
-
-
-    @Test
-    public void longFormat() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"repo\" :\"repo1\",\"size\":{\"$eq\":\"1111111111111\"}})");
-        assertSize(queryResult, 0);
-    }
-
-    @Test
-    public void intFormat() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"repo\" :\"repo1\",\"stat.downloads\":{\"$eq\":\"1\"}})");
-        assertSize(queryResult, 0);
-    }
-
-    @Test
-    public void badDateFormat() {
-        try {
-            aqlService.executeQueryEager(
-                    "items.find({\"repo\" :\"repo1\",\"modified\":{\"$eq\":\"null\"}})");
-            Assert.fail();
-        } catch (AqlException e) {
-            Assert.assertEquals(e.getMessage(), "Invalid Date format: null, AQL expect ISODateTimeFormat or long number");
-        }
-    }
-
-    @Test
-    public void badLongFormat() {
-        try {
-            aqlService.executeQueryEager(
-                    "items.find({\"repo\" :\"repo1\",\"size\":{\"$eq\":\"null\"}})");
-            Assert.fail();
-        } catch (AqlException e) {
-            Assert.assertEquals(e.getMessage(), "AQL Expect long value but found:null\n");
-        }
-    }
-
-    @Test
-    public void badFileTypeFormat() {
-        try {
-            aqlService.executeQueryEager(
-                    "items.find({\"repo\" :\"repo1\",\"type\":{\"$eq\":\"null\"}})");
-            Assert.fail();
-        } catch (AqlException e) {
-            Assert.assertEquals(e.getMessage(), "Invalid file type: null, valid types are : file, folder, any");
-        }
-    }
-
-    @Test
-    public void fileTypeFormat() {
-        AqlEagerResult queryResult = aqlService.executeQueryEager(
-                "items.find({\"repo\" :\"repo1\",\"type\":{\"$eq\":\"any\"}})");
-        assertSize(queryResult, 14);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/base/entity/DbPropertiesTest.java b/storage/db/src/test/java/org/artifactory/storage/db/base/entity/DbPropertiesTest.java
deleted file mode 100644
index dc5140e..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/base/entity/DbPropertiesTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.artifactory.storage.db.base.entity;
-
-import org.artifactory.storage.db.properties.model.DbProperties;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Date: 7/10/13 3:17 PM
- *
- * @author freds
- */
- at Test
-public class DbPropertiesTest {
-    public void basicDbProperties() {
-        DbProperties test = new DbProperties(1L, "3.0.1-test", 2, 3L);
-        assertEquals(test.getInstallationDate(), 1L);
-        assertEquals(test.getArtifactoryVersion(), "3.0.1-test");
-        assertEquals(test.getArtifactoryRevision(), 2);
-        assertEquals(test.getArtifactoryRelease(), 3L);
-    }
-
-    public void maxNullDbProperties() {
-        DbProperties test = new DbProperties(2L, "2-t", 0, 0L);
-        assertEquals(test.getInstallationDate(), 2L);
-        assertEquals(test.getArtifactoryVersion(), "2-t");
-        assertEquals(test.getArtifactoryRevision(), 0);
-        assertEquals(test.getArtifactoryRelease(), 0L);
-    }
-
-    public void maxNegDbProperties() {
-        DbProperties test = new DbProperties(3L, "3-t", -2, -3L);
-        assertEquals(test.getInstallationDate(), 3L);
-        assertEquals(test.getArtifactoryVersion(), "3-t");
-        assertEquals(test.getArtifactoryRevision(), -2);
-        assertEquals(test.getArtifactoryRelease(), -3L);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = ".*Installation date.*cannot.*zero.*")
-    public void nullInstallDateDbProperties() {
-        new DbProperties(0L, "3.0.1-test", 2, 3L);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = ".*Installation date.*cannot.*negative.*")
-    public void negInstallDateDbProperties() {
-        new DbProperties(-1L, "3.0.1-test", 2, 3L);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = ".*version.*cannot.*null.*")
-    public void nullArtVersionDbProperties() {
-        new DbProperties(1L, null, 2, 3L);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = ".*version.*cannot.*empty.*")
-    public void emptyArtVersionDbProperties() {
-        new DbProperties(1L, " ", 2, 3L);
-    }
-
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/base/itest/dao/DBPropertiesWithRealArtifactoryVersionTest.java b/storage/db/src/test/java/org/artifactory/storage/db/base/itest/dao/DBPropertiesWithRealArtifactoryVersionTest.java
deleted file mode 100644
index de5f8e9..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/base/itest/dao/DBPropertiesWithRealArtifactoryVersionTest.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.artifactory.storage.db.base.itest.dao;
-
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.artifactory.storage.db.properties.dao.DbPropertiesDao;
-import org.artifactory.storage.db.properties.model.DbProperties;
-import org.artifactory.storage.db.properties.service.ArtifactoryDbPropertiesService;
-import org.artifactory.storage.db.properties.utils.VersionPropertiesUtils;
-import org.artifactory.version.ArtifactoryVersion;
-import org.artifactory.version.CompoundVersionDetails;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.sql.SQLException;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertTrue;
-
-/**
- * @author gidis
- */
-public class DBPropertiesWithRealArtifactoryVersionTest extends DbBaseTest {
-
-    @Autowired
-    private DbPropertiesDao dbPropertiesDao;
-
-    @Autowired
-    private ArtifactoryDbPropertiesService dbPropertiesService;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/db-props-with-artifactory-version.sql");
-    }
-
-    private DbProperties getLatestProperties() throws SQLException {
-        return dbPropertiesService.getDbProperties();
-    }
-
-    public void loadExistingProps() throws SQLException {
-        DbProperties dbProperties = getLatestProperties();
-        assertNotNull(dbProperties);
-        assertEquals(dbProperties.getInstallationDate(), 1349000000000L);
-        assertEquals(dbProperties.getArtifactoryVersion(), "4.7.1");
-        assertEquals(dbProperties.getArtifactoryRevision(), 12000);
-        assertEquals(dbProperties.getArtifactoryRelease(), 1300000000000L);
-    }
-
-    @Test(dependsOnMethods = {"loadExistingProps"})
-    public void createArtifactoryVersion() throws SQLException, InterruptedException {
-        long now = System.currentTimeMillis() - 10000L;
-        DbProperties dbTest = new DbProperties(now, "4.7.2", 1, 2L);
-        dbPropertiesDao.createProperties(dbTest);
-        DbProperties dbProperties = getLatestProperties();
-        assertNotNull(dbProperties);
-        assertEquals(dbProperties.getInstallationDate(), now);
-        assertEquals(dbProperties.getArtifactoryVersion(), "4.7.2");
-        assertEquals(dbProperties.getArtifactoryRevision(), 1);
-        assertEquals(dbProperties.getArtifactoryRelease(), 2L);
-    }
-
-    @Test(dependsOnMethods = {"createArtifactoryVersion"})
-    public void latestVersion() throws SQLException, InterruptedException {
-        long now = System.currentTimeMillis();
-        ArtifactoryVersion current = ArtifactoryVersion.getCurrent();
-        Thread.sleep(100);
-        DbProperties fromVersion = VersionPropertiesUtils.createDbPropertiesFromVersion(new CompoundVersionDetails(
-                current, current.getValue(), "" + current.getRevision(), now - 1000000L));
-        dbPropertiesDao.createProperties(fromVersion);
-        DbProperties dbProperties = getLatestProperties();
-        assertNotNull(dbProperties);
-        assertTrue(now <= fromVersion.getInstallationDate());
-        assertEquals(dbProperties.getInstallationDate(), fromVersion.getInstallationDate());
-        assertEquals(dbProperties.getArtifactoryVersion(), current.getValue());
-        assertEquals(dbProperties.getArtifactoryRevision(), 0);
-        assertEquals(dbProperties.getArtifactoryRelease(), now - 1000000L);
-    }
-
-    @Test(dependsOnMethods = {"latestVersion"})
-    public void downgrade() throws SQLException, InterruptedException {
-        long now = System.currentTimeMillis() - 10000L;
-        DbProperties dbTest = new DbProperties(now, "4.7.4", 1, 2L);
-        dbPropertiesDao.createProperties(dbTest);
-        DbProperties dbProperties = getLatestProperties();
-        assertNotNull(dbProperties);
-        ArtifactoryVersion current = ArtifactoryVersion.getCurrent();
-        DbProperties fromVersion = VersionPropertiesUtils.createDbPropertiesFromVersion(new CompoundVersionDetails(
-                current, current.getValue(), "" + current.getRevision(), now - 1000000L));
-        assertTrue(now <= fromVersion.getInstallationDate());
-        assertEquals(dbProperties.getArtifactoryVersion(), current.getValue());
-        assertEquals(dbProperties.getArtifactoryRevision(), 0);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/base/itest/dao/DbPropertiesDaoTest.java b/storage/db/src/test/java/org/artifactory/storage/db/base/itest/dao/DbPropertiesDaoTest.java
deleted file mode 100644
index 5352179..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/base/itest/dao/DbPropertiesDaoTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package org.artifactory.storage.db.base.itest.dao;
-
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.artifactory.storage.db.properties.dao.DbPropertiesDao;
-import org.artifactory.storage.db.properties.model.DbProperties;
-import org.artifactory.storage.db.properties.service.ArtifactoryDbPropertiesService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.sql.SQLException;
-import java.util.Comparator;
-
-import static org.testng.Assert.*;
-
-/**
- * Date: 7/10/13 3:31 PM
- *
- * @author freds
- */
-public class DbPropertiesDaoTest extends DbBaseTest {
-    @Autowired
-    private DbPropertiesDao dbPropertiesDao;
-
-    @Autowired
-    private ArtifactoryDbPropertiesService dbPropertiesService;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/db-props.sql");
-    }
-
-
-    public void loadExistingProps() throws SQLException {
-        DbProperties dbProperties = getLatestProperties();
-        assertNotNull(dbProperties);
-        assertEquals(dbProperties.getInstallationDate(), 1349000000000L);
-        assertEquals(dbProperties.getArtifactoryVersion(), "5-t");
-        assertEquals(dbProperties.getArtifactoryRevision(), 12000);
-        assertEquals(dbProperties.getArtifactoryRelease(), 1300000000000L);
-    }
-
-    private DbProperties getLatestProperties() throws SQLException {
-        return dbPropertiesService.getDbProperties();
-    }
-
-    @Test(dependsOnMethods = {"loadExistingProps"})
-    public void createNewLatestProps() throws SQLException {
-        long now = System.currentTimeMillis() - 10000L;
-        DbProperties dbTest = new DbProperties(now, "6-a", 1, 2L);
-        dbPropertiesDao.createProperties(dbTest);
-        DbProperties dbProperties = getLatestProperties();
-        assertNotNull(dbProperties);
-        assertEquals(dbProperties.getInstallationDate(), now);
-        assertEquals(dbProperties.getArtifactoryVersion(), "6-a");
-        assertEquals(dbProperties.getArtifactoryRevision(), 1);
-        assertEquals(dbProperties.getArtifactoryRelease(), 2L);
-    }
-
-    @Test(dependsOnMethods = {"createNewLatestProps"})
-    public void createNewDevModeProps() throws SQLException {
-        long now = System.currentTimeMillis();
-        DbProperties dbTest = new DbProperties(now, "7-dev", -1, -3L);
-        dbPropertiesDao.createProperties(dbTest);
-        DbProperties dbProperties = getLatestProperties();
-        assertNotNull(dbProperties);
-        assertEquals(dbProperties.getInstallationDate(), now);
-        assertEquals(dbProperties.getArtifactoryVersion(), "7-dev");
-        assertEquals(dbProperties.getArtifactoryRevision(), 0);
-        assertEquals(dbProperties.getArtifactoryRelease(), 0L);
-    }
-
-
-
-    private class CreationComparator implements Comparator<DbProperties> {
-        @Override
-        public int compare(DbProperties o1, DbProperties o2) {
-            return (int) (o1.getInstallationDate() - o1.getInstallationDate());
-        }
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/binstore/entity/BinaryEntityTest.java b/storage/db/src/test/java/org/artifactory/storage/db/binstore/entity/BinaryEntityTest.java
deleted file mode 100644
index c3205bc..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/binstore/entity/BinaryEntityTest.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.binstore.entity;
-
-import org.artifactory.storage.db.binstore.service.BinaryEntityWithValidation;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * Date: 12/10/12
- * Time: 9:42 PM
- *
- * @author freds
- */
- at Test
-public class BinaryEntityTest {
-    public void simpleBinaryData() {
-        BinaryEntityWithValidation bd = new BinaryEntityWithValidation("8018634e43a47494119601b857356a5a1875f888",
-                "7c9703f5909d78ab0bf18147aee0a5b3", 13L);
-        assertEquals(bd.getSha1(), "8018634e43a47494119601b857356a5a1875f888");
-        assertEquals(bd.getMd5(), "7c9703f5909d78ab0bf18147aee0a5b3");
-        assertEquals(bd.getLength(), 13L);
-        assertTrue(bd.isValid());
-    }
-
-    public void maxNullBinaryData() {
-        // Sha1 and Md5 good length but invalid
-        BinaryEntityWithValidation bd = new BinaryEntityWithValidation(
-                "length matters but not content!!12345678",
-                "length matters but not content!!", 0L);
-        assertEquals(bd.getSha1(), "length matters but not content!!12345678");
-        assertEquals(bd.getMd5(), "length matters but not content!!");
-        assertEquals(bd.getLength(), 0L);
-        assertFalse(bd.isValid());
-
-        // Sha1 and Md5 good length but Md5 invalid
-        bd = new BinaryEntityWithValidation(
-                "8018634e43a47494119601b857356a5a1875f888",
-                "length matters but not content!!", 0L);
-        assertEquals(bd.getSha1(), "8018634e43a47494119601b857356a5a1875f888");
-        assertEquals(bd.getMd5(), "length matters but not content!!");
-        assertEquals(bd.getLength(), 0L);
-        assertFalse(bd.isValid());
-
-        // Sha1 and Md5 good length but Sha1 invalid
-        bd = new BinaryEntityWithValidation(
-                "length matters but not content!!12345678",
-                "7c9703f5909d78ab0bf18147aee0a5b3", 0L);
-        assertEquals(bd.getSha1(), "length matters but not content!!12345678");
-        assertEquals(bd.getMd5(), "7c9703f5909d78ab0bf18147aee0a5b3");
-        assertEquals(bd.getLength(), 0L);
-        assertFalse(bd.isValid());
-    }
-
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = ".*SHA1.*not.*valid.*")
-    public void nullSha1BinaryData() {
-        new BinaryEntityWithValidation(
-                null,
-                "length matters but not content!!", 1L);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = ".*MD5.*not.*valid.*")
-    public void nullMd5BinaryData() {
-        new BinaryEntityWithValidation(
-                "length matters but not content!!12345678",
-                null, 1L);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = ".*SHA1.*not.*valid.*")
-    public void emptySha1BinaryData() {
-        new BinaryEntityWithValidation(
-                "  ",
-                "length matters but not content!!", 1L);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = ".*MD5.*not.*valid.*")
-    public void emptyMd5BinaryData() {
-        new BinaryEntityWithValidation(
-                "length matters but not content!!12345678",
-                "  ", 1L);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = ".*SHA1.*not.*valid.*")
-    public void wrongSha1BinaryData() {
-        new BinaryEntityWithValidation(
-                "length matters but not content!!123456789",
-                "length matters but not content!!", 1L);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = ".*MD5.*not.*valid.*")
-    public void wrongMd5BinaryData() {
-        new BinaryEntityWithValidation(
-                "length matters but not content!!12345678",
-                "length matters but not content!!1", 1L);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = ".*Length.*not.*valid.*")
-    public void wrongLengthBinaryData() {
-        new BinaryEntityWithValidation(
-                "length matters but not content!!12345678",
-                "length matters but not content!!", -1L);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/dao/BinariesDaoTest.java b/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/dao/BinariesDaoTest.java
deleted file mode 100644
index b1f661a..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/dao/BinariesDaoTest.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.binstore.itest.dao;
-
-import com.google.common.base.Function;
-import com.google.common.collect.*;
-import org.artifactory.api.storage.BinariesInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.storage.db.binstore.dao.BinariesDao;
-import org.artifactory.storage.db.binstore.entity.BinaryEntity;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import javax.annotation.Nullable;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-
-import static org.testng.Assert.*;
-
-/**
- * Low level tests of the {@link org.artifactory.storage.db.binstore.dao.BinariesDao}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class BinariesDaoTest extends DbBaseTest {
-
-    @Autowired
-    private BinariesDao binariesDao;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/binaries.sql");
-    }
-
-    public void binaryExists() throws SQLException {
-        assertTrue(binariesDao.exists("f0d381ab0e057d4f835d639f6330a7c3e81eb6af"));
-    }
-
-    public void binaryNotExists() throws SQLException {
-        assertFalse(binariesDao.exists("699a458d52a1ca32cecb4d7c1ea50b89ea9ecaf9"));
-    }
-
-    public void loadExistingNode() throws SQLException {
-        BinaryEntity binaryEntity = binariesDao.load("f0d381ab0e057d4f835d639f6330a7c3e81eb6af");
-        assertNotNull(binaryEntity);
-        assertEquals(binaryEntity.getSha1(), "f0d381ab0e057d4f835d639f6330a7c3e81eb6af");
-        assertEquals(binaryEntity.getMd5(), "902a360ecad98a34b59863c1e65bcf71");
-        assertEquals(binaryEntity.getLength(), 2725);
-    }
-
-    public void loadNonExistingNode() throws SQLException {
-        BinaryEntity binaryEntity = binariesDao.load("62540a41c0b21fd3739565f7d961db07b760bfb8");
-        assertNull(binaryEntity);
-    }
-
-    @Test(dependsOnMethods = "findPotentialDeletion")
-    public void createBinary() throws SQLException {
-        BinaryEntity binaryEntity = new BinaryEntity("1bae873f4a13f2919a4205aff0722b44ead4b190",
-                "666a360ecad98a34b59863c1e65bcf71", 20);
-        assertFalse(binariesDao.exists(binaryEntity.getSha1()));
-        boolean created = binariesDao.create(binaryEntity);
-        assertTrue(created);
-        assertTrue(binariesDao.exists(binaryEntity.getSha1()));
-        BinaryEntity loadedData = binariesDao.load("1bae873f4a13f2919a4205aff0722b44ead4b190");
-        assertNotNull(loadedData);
-        assertEquals(loadedData.getSha1(), binaryEntity.getSha1());
-        assertEquals(loadedData.getMd5(), binaryEntity.getMd5());
-        assertEquals(loadedData.getLength(), binaryEntity.getLength());
-    }
-
-    @Test(expectedExceptions = SQLException.class)
-    public void createExistingBinary() throws SQLException {
-        BinaryEntity binaryEntity = new BinaryEntity("f0d381ab0e057d4f835d639f6330a7c3e81eb6af",
-                "902a360ecad98a34b59863c1e65bcf71", 20);
-        binariesDao.create(binaryEntity);
-    }
-
-    public void findPotentialDeletion() throws SQLException {
-        Collection<BinaryEntity> potentialDeletion = binariesDao.findPotentialDeletion();
-        assertEquals(potentialDeletion.size(), 3);
-        Set<String> nodes = Sets.newHashSet(Iterables.transform(potentialDeletion, new Function<BinaryEntity, String>() {
-            @Override
-            public String apply(@Nullable BinaryEntity input) {
-                return input == null ? "" : input.getSha1();
-            }
-        }));
-        assertTrue(nodes.contains("356a192b7913b04c54574d18c28d46e6395428ab"));
-        assertTrue(nodes.contains("74239116da1def240fe1d366eb535513efc1c40b"));
-        assertTrue(nodes.contains("da39a3ee5e6b4b0d3255bfef95601890afd80709"));
-    }
-
-    public void AssertPotentialDeletionOrder() throws SQLException {
-        Collection<BinaryEntity> potentialDeletion = binariesDao.findPotentialDeletion();
-        assertEquals(potentialDeletion.size(), 3);
-        List<String> nodes = Lists.newArrayList(
-                Iterables.transform(potentialDeletion, new Function<BinaryEntity, String>() {
-                    @Override
-                    public String apply(@Nullable BinaryEntity input) {
-                        return input == null ? "" : input.getSha1();
-                    }
-                }));
-        // verify candidates are ordered by size
-        assertEquals(nodes.get(0), "74239116da1def240fe1d366eb535513efc1c40b");
-        assertEquals(nodes.get(1), "356a192b7913b04c54574d18c28d46e6395428ab");
-        assertEquals(nodes.get(2), "da39a3ee5e6b4b0d3255bfef95601890afd80709");
-    }
-
-    @Test(dependsOnMethods = "createBinary")
-    public void testGetCountAndTotalSize() throws SQLException {
-        BinariesInfo binariesInfo = binariesDao.getCountAndTotalSize();
-        assertEquals(binariesInfo.getBinariesCount(), 6L);
-        assertEquals(binariesInfo.getBinariesSize(), 3 + 2725 + 33670080 + 1 + 20);
-    }
-
-    @Test(dependsOnMethods = {
-            "testGetCountAndTotalSize",
-            "findChecksumsByMd5",
-            "findChecksumsBySha1"
-    })
-    public void testDeleteEntries() throws SQLException {
-        ImmutableSet<String> deleteTest = ImmutableSet.of(
-                "74239116da1def240fe1d366eb535513efc1c40b",
-                "f0d381ab0e057d4f835d639f6330a7c3e81eb6af",
-                "da39a3ee5e6b4b0d3255bfef95601890afd80709"
-        );
-        int nbDeleted = 0;
-        for (String sha1ToDelete : deleteTest) {
-            nbDeleted += binariesDao.deleteEntry(sha1ToDelete);
-        }
-        assertEquals(nbDeleted, 2);
-        BinariesInfo countAndTotalSize = binariesDao.getCountAndTotalSize();
-        assertEquals(countAndTotalSize.getBinariesCount(), 4L);
-        assertEquals(countAndTotalSize.getBinariesSize(), 3 + 2725 + 1 + 20);
-    }
-
-    public void findChecksumsBySha1() throws SQLException {
-        Collection<BinaryEntity> nodes = binariesDao.search(ChecksumType.sha1, ImmutableList.of(
-                "f0d381ab0e057d4f835d639f6330a7c3e81eb6af",
-                "deaddeaddeaddeaddeaddeaddeaddeaddeaddead",
-                "da39a3ee5e6b4b0d3255bfef95601890afd80709"
-        ));
-        assertFoundNodes(nodes);
-    }
-
-    // RTFACT-6364 - Oracle limits the number of elements in the IN clause to 1000
-    public void findChecksumsBySha1ThousandLimit() throws SQLException {
-        List<String> sha1s = Lists.newArrayListWithCapacity(2000);
-        for (int i = 0; i < 999; i++) {
-            sha1s.add(randomSha1());
-        }
-        binariesDao.search(ChecksumType.sha1, sha1s);
-
-        // 1000
-        sha1s.add(randomSha1());
-        binariesDao.search(ChecksumType.sha1, sha1s);
-
-        // 1001 (fails if not chunked in Oracle)
-        sha1s.add(randomSha1());
-        binariesDao.search(ChecksumType.sha1, sha1s);
-    }
-
-    private void assertFoundNodes(Collection<BinaryEntity> nodes) {
-        assertNotNull(nodes);
-        assertEquals(nodes.size(), 2);
-        for (BinaryEntity node : nodes) {
-            BinaryEntity expected = null;
-            switch ((int) node.getLength()) {
-                case 2725:
-                    expected = new BinaryEntity("f0d381ab0e057d4f835d639f6330a7c3e81eb6af",
-                            "902a360ecad98a34b59863c1e65bcf71", 2725);
-                    break;
-                case 0:
-                    expected = new BinaryEntity("da39a3ee5e6b4b0d3255bfef95601890afd80709",
-                            "602a360ecad98a34b59863c1e65bcf71", 0);
-                    break;
-                default:
-                    fail("Binary data " + node + " unexpected!");
-            }
-            assertEquals(node.getSha1(), expected.getSha1());
-            assertEquals(node.getMd5(), expected.getMd5());
-            assertEquals(node.getLength(), expected.getLength());
-        }
-    }
-
-    public void testFindEmptyChecksumsBySha1() throws SQLException {
-        Collection<BinaryEntity> nodes = binariesDao.search(ChecksumType.sha1, new ArrayList<String>(1));
-        assertNotNull(nodes);
-        assertTrue(nodes.isEmpty());
-    }
-
-    public void findChecksumsByMd5() throws SQLException {
-        Collection<BinaryEntity> nodes = binariesDao.search(ChecksumType.md5, ImmutableList.of(
-                "902a360ecad98a34b59863c1e65bcf71",
-                "602a360ecad98a34b59863c1e65bcf71",
-                "402a360ecad98a34b59863c1e65bc222"
-        ));
-        assertFoundNodes(nodes);
-    }
-
-    public void testFindEmptyChecksumsByMd5() throws SQLException {
-        Collection<BinaryEntity> nodes = binariesDao.search(ChecksumType.md5, new ArrayList<String>(1));
-        assertNotNull(nodes);
-        assertTrue(nodes.isEmpty());
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryServiceBaseTest.java b/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryServiceBaseTest.java
deleted file mode 100644
index e619060..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryServiceBaseTest.java
+++ /dev/null
@@ -1,431 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.binstore.itest.service;
-
-import com.beust.jcommander.internal.Maps;
-import com.beust.jcommander.internal.Sets;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.storage.StorageUnit;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.storage.StorageProperties;
-import org.artifactory.storage.binstore.service.BinaryInfo;
-import org.artifactory.storage.binstore.service.GarbageCollectorInfo;
-import org.artifactory.storage.db.binstore.dao.BinariesDao;
-import org.artifactory.storage.db.binstore.entity.BinaryEntity;
-import org.artifactory.storage.db.binstore.service.BinaryServiceImpl;
-import org.artifactory.storage.db.fs.dao.NodesDao;
-import org.artifactory.storage.db.fs.entity.Node;
-import org.artifactory.storage.db.fs.entity.NodeBuilder;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.artifactory.test.TestUtils;
-import org.artifactory.util.ResourceUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.util.ReflectionTestUtils;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.sql.SQLException;
-import java.util.Collection;
-import java.util.Map;
-import java.util.Set;
-
-import static org.testng.Assert.*;
-
-/**
- * Date: 12/10/12
- * Time: 9:54 PM
- *
- * @author freds
- */
-public abstract class BinaryServiceBaseTest extends DbBaseTest {
-
-    @Autowired
-    protected BinaryServiceImpl binaryStore;
-
-    @Autowired
-    protected NodesDao nodesDao;
-
-    @Autowired
-    protected BinariesDao binariesDao;
-
-    @Autowired
-    protected StorageProperties storageProperties;
-
-    @Override
-    protected ArtifactoryHomeBoundTest createArtifactoryHomeTest() throws IOException {
-        ArtifactoryHomeBoundTest artifactoryHomeTest = super.createArtifactoryHomeTest();
-        artifactoryHomeTest.bindArtifactoryHome();
-        ArtifactoryHome artifactoryHome = ArtifactoryHome.get();
-
-        File workDir = new File("target", "binstoretest").getAbsoluteFile();
-        TestUtils.setField(artifactoryHome, "homeDir", workDir);
-        TestUtils.setField(artifactoryHome, "dataDir", artifactoryHome.getOrCreateSubDir("data"));
-
-        File filestoreDir = getFilestoreFolder(artifactoryHome);
-        if (filestoreDir.exists()) {
-            FileUtils.deleteDirectory(filestoreDir);
-            assertFalse(filestoreDir.exists(), "Could not clean filestore " + filestoreDir.getAbsolutePath());
-        }
-        return artifactoryHomeTest;
-    }
-
-    private File getFilestoreFolder(ArtifactoryHome artifactoryHome) {
-        String binaryStoreDirName = getBinaryStoreDirName();
-        File filestoreDir;
-        if (new File(binaryStoreDirName).isAbsolute()) {
-            filestoreDir = new File(binaryStoreDirName);
-        } else {
-            filestoreDir = new File(artifactoryHome.getDataDir(), binaryStoreDirName);
-        }
-        return filestoreDir;
-    }
-
-    @BeforeClass
-    public void initBinaryStore() {
-        try {
-            bindDummyContext();
-            updateStorageProperties();
-            binaryStore.initialize();
-        } finally {
-            unbindDummyContext();
-        }
-    }
-
-    protected void updateStorageProperties() {
-        // customize the storage properties before the binary store initialization
-        updateStorageProperty(StorageProperties.Key.binaryProviderType, getBinaryStoreType().name());
-        String binaryStoreDirName = getBinaryStoreDirName();
-        if (binaryStoreDirName.startsWith("cache")) {
-            updateStorageProperty(StorageProperties.Key.binaryProviderCacheDir, binaryStoreDirName);
-        } else {
-            updateStorageProperty(StorageProperties.Key.binaryProviderFilesystemDir, binaryStoreDirName);
-        }
-    }
-
-    protected void updateStorageProperty(StorageProperties.Key key, String value) {
-        Object propsField = ReflectionTestUtils.getField(storageProperties, "props");
-        ReflectionTestUtils.invokeMethod(propsField, "setProperty", key.key(), value);
-    }
-
-    protected abstract StorageProperties.BinaryProviderType getBinaryStoreType();
-
-    protected abstract String getBinaryStoreDirName();
-
-    @DataProvider(name = "testBinFiles")
-    protected Object[][] getBinFileData() {
-        // File Name, SHA1, MD5, size
-        return new Object[][]{
-                {"100c.bin", "8018634e43a47494119601b857356a5a1875f888", "7c9703f5909d78ab0bf18147aee0a5b3", 100L, 71L},
-                {"300c.bin", "e5dc83f4c8d6f5f23c00b61ee40dfcbf18c0a7ba", "270a150e83246818c8524cd04514aa67", 300L, 72L},
-                {"256w.bin", "b397ec1546ff6ada8c937cc8f8d988be57324f5e", "1a8e102c605bbb502d36848d48989498", 512L, 73L},
-                {"2k.bin", "195573fd008c06ea08fb66c2bbe76d4995b3f40a", "76632b91e81884b19b88ff86850b8f2e", 2048L, 74L},
-        };
-    }
-
-    @Test
-    public void testEmpty() throws IOException {
-        // Check initialized with folders correctly
-        File filestoreDir = getFilestoreFolder(ArtifactoryHome.get());
-        assertEquals(binaryStore.getBinariesDir().getAbsolutePath(), filestoreDir.getAbsolutePath());
-        File[] files = filestoreDir.listFiles();
-        assertNotNull(files);
-        assertEquals(files.length, 1);
-        File preFolder = files[0];
-        assertTrue(preFolder.isDirectory(), "File " + preFolder.getAbsolutePath() + " should be a folder");
-        assertEquals(preFolder.getName(), "_pre");
-
-        // Ping all OK => Ping throws exception if something wrong
-        binaryStore.ping();
-
-        // Check all is empty
-        assertTrue(binaryStore.findAllBinaries().isEmpty());
-        assertEquals(binaryStore.getStorageSize(), 0L);
-
-        // Finder should returns null and empty collections
-        Set<String> allChecksums = Sets.newHashSet();
-        Object[][] binFileData = getBinFileData();
-        for (Object[] binFile : binFileData) {
-            String sha1 = (String) binFile[1];
-            Assert.assertNull(binaryStore.findBinary(sha1));
-            allChecksums.add(sha1);
-            allChecksums.add((String) binFile[2]);
-        }
-        assertTrue(binaryStore.findBinaries(allChecksums).isEmpty());
-
-        // Garbage collection should do nothing
-        GarbageCollectorInfo collectorInfo = binaryStore.garbageCollect();
-        assertEquals(collectorInfo.initialSize, 0L);
-        assertEquals(collectorInfo.initialCount, 0);
-        assertEquals(collectorInfo.candidatesForDeletion, 0);
-        assertEquals(collectorInfo.binariesCleaned, 0);
-        assertEquals(collectorInfo.checksumsCleaned, 0);
-        assertEquals(collectorInfo.totalSizeCleaned, 0L);
-
-        testPrune(0, 0, 0);
-
-        for (Object[] binData : binFileData) {
-            checkSha1OnEmpty((String) binData[1]);
-        }
-    }
-
-    protected void checkSha1OnEmpty(String sha1) throws IOException {
-        assertNull(binaryStore.findBinary(sha1));
-        boolean exist = binaryStore.isFileExist(sha1);
-        assertFalse(exist);
-        assertBinaryExistsEmpty(sha1);
-    }
-
-    protected abstract void assertBinaryExistsEmpty(String sha1) throws IOException;
-
-    @Test(dependsOnMethods = "testEmpty", dataProvider = "testBinFiles")
-    public void testLoadResources(final String resName, final String sha1, final String md5,
-            final long length, long nodeId)
-            throws IOException, SQLException {
-        BinaryInfo binaryInfo = dbService.invokeInTransaction("testLoadResources",
-                () -> addBinary(resName, sha1, md5, length));
-        assertNotNull(binaryInfo);
-        assertEquals(binaryInfo.getSha1(), sha1);
-        assertEquals(binaryInfo.getMd5(), md5);
-        assertEquals(binaryInfo.getLength(), length);
-        // Add a dummy node to enforce usage...
-        createDummyNode(resName, sha1, md5, length, nodeId);
-    }
-
-    private void createDummyNode(String resName, String sha1, String md5, long length, long nodeId)
-            throws SQLException {
-        Node node = new NodeBuilder().nodeId(nodeId).repo("repo1").name(resName).file(true)
-                .sha1Actual(sha1).md5Actual(md5).length(length).build();
-        nodesDao.create(node);
-    }
-
-    protected abstract BinaryInfo addBinary(String resName, String sha1, String md5, long length) throws IOException;
-
-    @Test(dependsOnMethods = "testLoadResources")
-    public void testLoadedNothingToDelete() throws IOException, SQLException {
-        Object[][] binFileData = getBinFileData();
-        Map<String, Object[]> subFolders = getSubFoldersMap();
-
-        // Check initialized with folders correctly
-        checkBinariesDirAfterLoad(subFolders);
-
-        // Ping all OK => Ping throws exception if something wrong
-        binaryStore.ping();
-
-        // Check store size match
-        Collection<BinaryInfo> allBinaries = binaryStore.findAllBinaries();
-        assertEquals(allBinaries.size(), 4);
-        long totSize = 0L;
-        for (BinaryInfo allBinary : allBinaries) {
-            long expected = assertBinData(allBinary, subFolders);
-            totSize += expected;
-        }
-        assertEquals(binaryStore.getStorageSize(), totSize);
-
-        // Finder should returns null and empty collections
-        Set<String> allChecksums1 = Sets.newHashSet();
-        Set<String> allChecksums2 = Sets.newHashSet();
-        for (Object[] binFile : binFileData) {
-            String sha1 = (String) binFile[1];
-            BinaryInfo bd = binaryStore.findBinary(sha1);
-            Assert.assertNotNull(bd);
-            assertBinData(bd, binFile);
-            allChecksums1.add(sha1);
-            allChecksums2.add((String) binFile[2]);
-        }
-        Set<BinaryInfo> binaries = binaryStore.findBinaries(allChecksums1);
-        assertEquals(binaries.size(), 4);
-        for (BinaryInfo binary : binaries) {
-            assertBinData(binary, subFolders);
-        }
-        binaries = binaryStore.findBinaries(allChecksums2);
-        assertEquals(binaries.size(), 4);
-        for (BinaryInfo binary : binaries) {
-            assertBinData(binary, subFolders);
-        }
-
-        for (Object[] binData : binFileData) {
-            String sha1 = (String) binData[1];
-            // Should NOT print warning => TODO: How to test for that?
-            long size = (Long) binData[3];
-            long nodeId = (long) binData[4];
-            nodesDao.delete(nodeId);
-            Collection<BinaryEntity> potentialDeletion = binariesDao.findPotentialDeletion();
-            assertEquals(potentialDeletion.size(), 1);
-            assertBinData(potentialDeletion.iterator().next(), binData);
-            BinaryInfo binaryInfo = binaryStore.findBinary(sha1);
-            assertNotNull(binaryInfo);
-            assertBinData(binaryInfo, binData);
-            createDummyNode("trans-" + binData[0], binaryInfo.getSha1(), binaryInfo.getMd5(), binaryInfo.getLength(),
-                    nodeId);
-            assertTrue(binariesDao.findPotentialDeletion().isEmpty());
-
-            InputStream bis = binaryStore.getBinary(sha1);
-            assertEquals(IOUtils.toByteArray(bis),
-                    IOUtils.toByteArray(ResourceUtils.getResource("/binstore/" + binData[0])));
-            bis.close();
-
-            assertFileExistsAfterLoad(sha1, size);
-        }
-
-        // Garbage collection should do nothing
-        GarbageCollectorInfo collectorInfo = binaryStore.garbageCollect();
-        assertEquals(collectorInfo.initialSize, totSize);
-        assertEquals(collectorInfo.initialCount, 4);
-        assertEquals(collectorInfo.candidatesForDeletion, 0);
-        assertEquals(collectorInfo.binariesCleaned, 0);
-        assertEquals(collectorInfo.checksumsCleaned, 0);
-        assertEquals(collectorInfo.totalSizeCleaned, 0L);
-
-        testPruneAfterLoad();
-    }
-
-    protected Map<String, Object[]> getSubFoldersMap() {
-        Object[][] binFileData = getBinFileData();
-        Map<String, Object[]> subFolders = Maps.newHashMap();
-        subFolders.put("_pre", new Object[0]);
-        for (Object[] binFile : binFileData) {
-            String folderName = ((String) binFile[1]).substring(0, 2);
-            subFolders.put(folderName, binFile);
-        }
-        return subFolders;
-    }
-
-    protected void assertFileExistsAfterLoad(String sha1, long size) {
-        boolean binaryStoreFileExist = binaryStore.isFileExist(sha1);
-        assertTrue(binaryStoreFileExist);
-    }
-
-    protected void checkBinariesDirAfterLoad(Map<String, Object[]> subFolders) {
-        File filestoreDir = binaryStore.getBinariesDir();
-        checkFilestoreDirIsFull(subFolders, filestoreDir);
-    }
-
-    protected void checkFilestoreDirIsFull(Map<String, Object[]> subFolders, File filestoreDir) {
-        File[] files = filestoreDir.listFiles();
-        assertNotNull(files);
-        assertEquals(files.length, 5);
-        checkFilesAreValid(subFolders, files);
-    }
-
-    protected void checkFilesAreValid(Map<String, Object[]> subFolders, File[] files) {
-        for (File file : files) {
-            assertTrue(file.isDirectory(), "File " + file.getAbsolutePath() + " should be a folder");
-            String fileName = file.getName();
-            assertTrue(subFolders.containsKey(fileName), "File " + file + " should be part of " + subFolders.keySet());
-            File[] list = file.listFiles();
-            assertNotNull(list);
-            Object[] binData = subFolders.get(fileName);
-            if (binData.length == 5) {
-                // Real data one file matching dataProvider
-                assertEquals(list.length, 1);
-                assertEquals(list[0].getName(), (String) binData[1]);
-                assertEquals(list[0].length(), ((Long) binData[3]).longValue());
-            } else {
-                // Make sure pre is empty
-                assertEquals(list.length, 0);
-            }
-        }
-    }
-
-    protected abstract void testPruneAfterLoad();
-
-    protected BasicStatusHolder testPrune(int folders, int files, int bytes) {
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-        binaryStore.prune(statusHolder);
-        String statusMsg = statusHolder.getStatusMsg();
-        assertFalse(statusHolder.isError(), "Error during empty pruning: " + statusMsg);
-        assertMessageContains(statusMsg, folders, files, bytes);
-        return statusHolder;
-    }
-
-    protected void assertMessageContains(String statusMsg, int folders, int files, int bytes) {
-        String expected = "" + files + " files";
-        assertTrue(statusMsg.contains(expected), "Expected '" + expected + "' got status message '" + statusMsg + "'");
-        expected = "size of " + StorageUnit.toReadableString(bytes);
-        assertTrue(statusMsg.contains(expected), "Expected '" + expected + "' got status message '" + statusMsg + "'");
-    }
-
-    @Test(dependsOnMethods = "testLoadedNothingToDelete", dataProvider = "testBinFiles")
-    public void testGarbageOneByOne(String resName, String sha1, String md5, long length, long nodeId)
-            throws IOException, SQLException {
-        // Read the stream to lock reader
-        InputStream bis = binaryStore.getBinary(sha1);
-        try {
-            nodesDao.delete(nodeId);
-
-            // Verify node ready for deletion
-            Collection<BinaryEntity> potentialDeletion = binariesDao.findPotentialDeletion();
-            assertEquals(potentialDeletion.size(), 1);
-            assertBinData(potentialDeletion.iterator().next(), new Object[]{resName, sha1, md5, length});
-
-            // No GC since file is being read
-            GarbageCollectorInfo collectorInfo = binaryStore.garbageCollect();
-            assertEquals(collectorInfo.candidatesForDeletion, 1);
-            assertEquals(collectorInfo.binariesCleaned, 0);
-            assertEquals(collectorInfo.checksumsCleaned, 0);
-            assertEquals(collectorInfo.totalSizeCleaned, 0L);
-
-            bis.close();
-
-            // Now GC works
-            collectorInfo = binaryStore.garbageCollect();
-            assertEquals(collectorInfo.candidatesForDeletion, 1);
-            assertEquals(collectorInfo.binariesCleaned, 1);
-            assertEquals(collectorInfo.checksumsCleaned, 1);
-            assertEquals(collectorInfo.totalSizeCleaned, length);
-
-            assertPruneAfterOneGc();
-        } finally {
-            IOUtils.closeQuietly(bis);
-        }
-    }
-
-    protected abstract void assertPruneAfterOneGc();
-
-    private long assertBinData(BinaryInfo bd, Map<String, Object[]> binDataMap) {
-        Object[] binData = binDataMap.get(bd.getSha1().substring(0, 2));
-        return assertBinData(bd, binData);
-    }
-
-    private long assertBinData(BinaryInfo bd, Object[] binData) {
-        assertNotNull(binData);
-        assertEquals(bd.getSha1(), (String) binData[1]);
-        assertEquals(bd.getMd5(), (String) binData[2]);
-        long expected = (Long) binData[3];
-        assertEquals(bd.getLength(), expected);
-        return expected;
-    }
-
-    private long assertBinData(BinaryEntity bd, Object[] binData) {
-        assertNotNull(binData);
-        assertEquals(bd.getSha1(), (String) binData[1]);
-        assertEquals(bd.getMd5(), (String) binData[2]);
-        long expected = (Long) binData[3];
-        assertEquals(bd.getLength(), expected);
-        return expected;
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryServiceCachedFSProviderTest.java b/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryServiceCachedFSProviderTest.java
deleted file mode 100644
index b26ed0a..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryServiceCachedFSProviderTest.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.binstore.itest.service;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.common.StatusEntry;
-import org.artifactory.common.StatusEntryLevel;
-import org.artifactory.storage.StorageProperties;
-import org.artifactory.storage.binstore.service.BinaryInfo;
-import org.artifactory.util.ResourceUtils;
-import org.jfrog.storage.binstore.exceptions.BinaryNotFoundException;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.util.List;
-
-import static org.testng.Assert.assertTrue;
-import static org.testng.Assert.fail;
-
-/**
- * Date: 12/10/12
- * Time: 9:54 PM
- *
- * @author freds
- */
- at Test
-public class BinaryServiceCachedFSProviderTest extends BinaryServiceBaseTest {
-
-    @Override
-    protected StorageProperties.BinaryProviderType getBinaryStoreType() {
-        return StorageProperties.BinaryProviderType.cachedFS;
-    }
-
-    @Override
-    protected String getBinaryStoreDirName() {
-        return "cachefs_test";
-    }
-
-    @Override
-    protected void assertBinaryExistsEmpty(String sha1) {
-        try {
-            binaryStore.getBinary(sha1);
-            fail("Should have send " + BinaryNotFoundException.class + " exception!");
-        } catch (BinaryNotFoundException e) {
-            // Message should be "Couldn't find content for '" + sha1 + "'"
-            String message = e.getMessage();
-            assertTrue(message.contains("content for '" + sha1 + "'"), "Wrong exception message " + message);
-        }
-    }
-
-    @Override
-    protected BinaryInfo addBinary(String resName, String sha1, String md5, long length) throws IOException {
-        return binaryStore.addBinary(ResourceUtils.getResource("/binstore/" + resName));
-    }
-
-    // TODO [By Gidi] check this change with Fred or Yossi
-    @Override
-    protected void testPruneAfterLoad() {
-        Object[][] binFileData = getBinFileData();
-        int totSize = 0;
-        // The final filestore as no prune
-        BasicStatusHolder statusHolder = testPrune(0, 0, 0);
-        List<StatusEntry> entries = statusHolder.getEntries(StatusEntryLevel.INFO);
-        for (StatusEntry entry : entries) {
-            // The first entry cache filestore as prune all
-            String message = entry.getMessage();
-            if (message.startsWith("Removed")) {
-                assertMessageContains(message, 0, 0, totSize);
-                break;
-            }
-        }
-    }
-
-    @Override
-    protected void assertPruneAfterOneGc() {
-        testPrune(1, 0, 0);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryServiceFileProviderTest.java b/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryServiceFileProviderTest.java
deleted file mode 100644
index 087b78a..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryServiceFileProviderTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.binstore.itest.service;
-
-import org.artifactory.storage.StorageProperties;
-import org.artifactory.storage.binstore.service.BinaryInfo;
-import org.artifactory.util.ResourceUtils;
-import org.jfrog.storage.binstore.exceptions.BinaryNotFoundException;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-
-import static org.testng.Assert.assertTrue;
-import static org.testng.Assert.fail;
-
-/**
- * Date: 12/10/12
- * Time: 9:54 PM
- *
- * @author freds
- */
- at Test
-public class BinaryServiceFileProviderTest extends BinaryServiceBaseTest {
-
-    @Override
-    protected StorageProperties.BinaryProviderType getBinaryStoreType() {
-        return StorageProperties.BinaryProviderType.filesystem;
-    }
-
-    @Override
-    protected String getBinaryStoreDirName() {
-        return "filestore_test";
-    }
-
-    @Override
-    protected void assertBinaryExistsEmpty(String sha1) {
-        try {
-            binaryStore.getBinary(sha1);
-            fail("Should have send " + BinaryNotFoundException.class + " exception!");
-        } catch (BinaryNotFoundException e) {
-            // Message should be "Couldn't find content for '" + sha1 + "'"
-            String message = e.getMessage();
-            assertTrue(message.contains("content for '" + sha1 + "'"), "Wrong exception message " + message);
-        }
-    }
-
-    @Override
-    protected BinaryInfo addBinary(String resName, String sha1, String md5, long length) throws IOException {
-        return binaryStore.addBinary(ResourceUtils.getResource("/binstore/" + resName));
-    }
-
-    @Override
-    protected void testPruneAfterLoad() {
-        testPrune(0, 0, 0);
-    }
-
-    @Override
-    protected void assertPruneAfterOneGc() {
-        testPrune(1, 0, 0);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryServiceFullDbProviderTest.java b/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryServiceFullDbProviderTest.java
deleted file mode 100644
index 253a951..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryServiceFullDbProviderTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.binstore.itest.service;
-
-import org.artifactory.storage.StorageProperties;
-import org.artifactory.storage.binstore.service.BinaryInfo;
-import org.artifactory.util.ResourceUtils;
-import org.jfrog.storage.binstore.exceptions.BinaryNotFoundException;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-
-import static org.testng.Assert.assertTrue;
-import static org.testng.Assert.fail;
-
-/**
- * Date: 12/10/12
- * Time: 9:54 PM
- *
- * @author freds
- */
- at Test
-public class BinaryServiceFullDbProviderTest extends BinaryServiceBaseTest {
-
-    @Override
-    protected StorageProperties.BinaryProviderType getBinaryStoreType() {
-        return StorageProperties.BinaryProviderType.fullDb;
-    }
-
-    @Override
-    protected String getBinaryStoreDirName() {
-        return "cache_test";
-    }
-
-    @Override
-    protected void assertBinaryExistsEmpty(String sha1) {
-        try {
-            binaryStore.getBinary(sha1);
-            fail("Should have send " + BinaryNotFoundException.class + " exception!");
-        } catch (BinaryNotFoundException e) {
-            // Message should be "Couldn't find content for '" + sha1 + "'"
-            String message = e.getMessage();
-            assertTrue(message.contains("content for '" + sha1 + "'"), "Wrong exception message " + message);
-        }
-    }
-
-    @Override
-    protected BinaryInfo addBinary(String resName, String sha1, String md5, long length) throws IOException {
-        return binaryStore.addBinary(ResourceUtils.getResource("/binstore/" + resName));
-    }
-
-    // TODO [By Gidi] check this change with Fred or Yossi
-    @Override
-    protected void testPruneAfterLoad() {
-        Object[][] binFileData = getBinFileData();
-        int totSize = 0;
-//        for (Object[] objects : binFileData) {
-//            totSize += ((Long) objects[3]).intValue();
-//        }
-        testPrune(0, 0, totSize);
-    }
-
-    @Override
-    protected void assertPruneAfterOneGc() {
-        testPrune(0, 0, 0);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryServiceFullPathFileProviderTest.java b/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryServiceFullPathFileProviderTest.java
deleted file mode 100644
index 6710884..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryServiceFullPathFileProviderTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.binstore.itest.service;
-
-import org.apache.commons.lang.SystemUtils;
-import org.artifactory.storage.StorageProperties;
-import org.artifactory.storage.binstore.service.BinaryInfo;
-import org.artifactory.util.ResourceUtils;
-import org.jfrog.storage.binstore.exceptions.BinaryNotFoundException;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-
-import static org.testng.Assert.assertTrue;
-import static org.testng.Assert.fail;
-
-/**
- * Date: 12/10/12
- * Time: 9:54 PM
- *
- * @author freds
- */
- at Test
-public class BinaryServiceFullPathFileProviderTest extends BinaryServiceBaseTest {
-
-    @Override
-    protected StorageProperties.BinaryProviderType getBinaryStoreType() {
-        return StorageProperties.BinaryProviderType.filesystem;
-    }
-
-    @Override
-    protected String getBinaryStoreDirName() {
-        if (SystemUtils.IS_OS_WINDOWS) {
-            return SystemUtils.getJavaIoTmpDir().getAbsolutePath() + "\\fstest-" + hashCode();
-        }
-        return "//tmp/fstest-" + hashCode();
-    }
-
-    @Override
-    protected void assertBinaryExistsEmpty(String sha1) {
-        try {
-            binaryStore.getBinary(sha1);
-            fail("Should have send " + BinaryNotFoundException.class + " exception!");
-        } catch (BinaryNotFoundException e) {
-            // Message should be "Couldn't find content for '" + sha1 + "'"
-            String message = e.getMessage();
-            assertTrue(message.contains("content for '" + sha1 + "'"), "Wrong exception message " + message);
-        }
-    }
-
-    @Override
-    protected BinaryInfo addBinary(String resName, String sha1, String md5, long length) throws IOException {
-        return binaryStore.addBinary(ResourceUtils.getResource("/binstore/" + resName));
-    }
-
-    @Override
-    protected void testPruneAfterLoad() {
-        testPrune(0, 0, 0);
-    }
-
-    @Override
-    protected void assertPruneAfterOneGc() {
-        testPrune(1, 0, 0);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryStoreExternalProviderBaseTest.java b/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryStoreExternalProviderBaseTest.java
deleted file mode 100644
index 1911f76..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryStoreExternalProviderBaseTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.binstore.itest.service;
-
-import org.apache.commons.io.FileUtils;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.storage.StorageProperties;
-import org.artifactory.storage.binstore.service.BinaryInfo;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.artifactory.util.ResourceUtils;
-import org.testng.Assert;
-
-import java.io.File;
-import java.io.IOException;
-
-/**
- * Date: 12/17/12
- * Time: 9:22 AM
- *
- * @author freds
- */
-public abstract class BinaryStoreExternalProviderBaseTest extends BinaryServiceBaseTest {
-
-    protected File testExternal;
-
-    @Override
-    protected ArtifactoryHomeBoundTest createArtifactoryHomeTest() throws IOException {
-        ArtifactoryHomeBoundTest artifactoryHomeTest = super.createArtifactoryHomeTest();
-        testExternal = new File(ArtifactoryHome.get().getDataDir(), "testExternal");
-        Object[][] binFileData = getBinFileData();
-        for (Object[] binData : binFileData) {
-            String resName = (String) binData[0];
-            String sha1 = (String) binData[1];
-            File destFile = new File(testExternal, sha1.substring(0, 2) + "/" + sha1);
-            File parentFile = destFile.getParentFile();
-            if (!parentFile.exists()) {
-                Assert.assertTrue(parentFile.mkdirs(), "Error creating " + parentFile.getAbsolutePath());
-            }
-            FileUtils.copyInputStreamToFile(ResourceUtils.getResource("/binstore/" + resName), destFile);
-        }
-        return artifactoryHomeTest;
-    }
-
-    @Override
-    protected void updateStorageProperties() {
-        super.updateStorageProperties();
-        // Set property to activate external file provider
-        updateStorageProperty(StorageProperties.Key.binaryProviderExternalDir, testExternal.getAbsolutePath());
-        updateStorageProperty(StorageProperties.Key.binaryProviderExternalMode, getExternalConnectMode());
-    }
-
-    protected abstract String getExternalConnectMode();
-
-    @Override
-    protected BinaryInfo addBinary(String resName, String sha1, String md5, long length) throws IOException {
-        return binaryStore.addBinaryRecord(sha1, md5, length);
-    }
-
-    @Override
-    protected StorageProperties.BinaryProviderType getBinaryStoreType() {
-        return StorageProperties.BinaryProviderType.filesystem;
-    }
-
-    @Override
-    protected String getBinaryStoreDirName() {
-        return "filestore_test";
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryStoreExternalProviderCopyFirstTest.java b/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryStoreExternalProviderCopyFirstTest.java
deleted file mode 100644
index 678f81c..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryStoreExternalProviderCopyFirstTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.binstore.itest.service;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.jfrog.storage.binstore.ifc.ProviderConnectMode;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Map;
-
-import static org.testng.Assert.*;
-
-/**
- * Date: 12/10/12
- * Time: 9:54 PM
- *
- * @author freds
- */
- at Test
-public class BinaryStoreExternalProviderCopyFirstTest extends BinaryStoreExternalProviderBaseTest {
-
-    @Override
-    protected String getExternalConnectMode() {
-        return ProviderConnectMode.COPY_FIRST.propName;
-    }
-
-    @Override
-    protected void assertBinaryExistsEmpty(String sha1) throws IOException {
-        InputStream bis = binaryStore.getBinary(sha1);
-        assertNotNull(bis);
-        bis.close();
-    }
-
-    @Override
-    protected void checkBinariesDirAfterLoad(Map<String, Object[]> subFolders) {
-        // In copy first the folder is full as soon as binary accessed
-        super.checkBinariesDirAfterLoad(subFolders);
-    }
-
-    @Override
-    protected void testPruneAfterLoad() {
-        testPrune(0, 0, 0);
-        // Test disconnection will do nothing
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-        binaryStore.disconnectExternalFilestore(testExternal, ProviderConnectMode.MOVE, statusHolder);
-        String statusMsg = statusHolder.getStatusMsg();
-        assertFalse(statusHolder.isError(), "Error during disconnecting external provider: " + statusMsg);
-        assertTrue(statusMsg.contains("" + 4 + " files out"), "Wrong status message " + statusMsg);
-        assertTrue(statusMsg.contains("" + 0 + " total"), "Wrong status message " + statusMsg);
-        super.checkBinariesDirAfterLoad(getSubFoldersMap());
-    }
-
-    protected void checkSha1OnEmpty(String sha1) throws IOException {
-        assertNull(binaryStore.findBinary(sha1));
-        boolean exist = binaryStore.isFileExist(sha1);
-        assertTrue(exist);
-        assertBinaryExistsEmpty(sha1);
-    }
-
-    @Override
-    protected void assertPruneAfterOneGc() {
-        testPrune(1, 0, 0);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryStoreExternalProviderCopyOnReadTest.java b/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryStoreExternalProviderCopyOnReadTest.java
deleted file mode 100644
index ef0919e..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryStoreExternalProviderCopyOnReadTest.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.binstore.itest.service;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.jfrog.storage.binstore.ifc.ProviderConnectMode;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Map;
-
-import static org.testng.Assert.*;
-
-/**
- * Date: 12/10/12
- * Time: 9:54 PM
- *
- * @author freds
- */
- at Test
-public class BinaryStoreExternalProviderCopyOnReadTest extends BinaryStoreExternalProviderBaseTest {
-
-    @Override
-    protected String getExternalConnectMode() {
-        return ProviderConnectMode.COPY_ON_READ.propName;
-    }
-
-    @Override
-    protected void assertBinaryExistsEmpty(String sha1) throws IOException {
-        InputStream bis = binaryStore.getBinary(sha1);
-        assertNotNull(bis);
-        bis.close();
-    }
-
-    @Override
-    protected void checkBinariesDirAfterLoad(Map<String, Object[]> subFolders) {
-        // In pass through the folder is empty after using binaries
-        // Only reading stream does create the file
-        File filestoreDir = binaryStore.getBinariesDir();
-        File[] files = filestoreDir.listFiles();
-        assertNotNull(files);
-        assertEquals(files.length, 1);
-        for (File file : files) {
-            assertTrue(file.isDirectory(), "File " + file.getAbsolutePath() + " should be a folder");
-            String fileName = file.getName();
-            assertTrue(subFolders.containsKey(fileName), "File " + file + " should be part of " + subFolders.keySet());
-            Object[] binData = subFolders.get(fileName);
-            assertTrue(binData.length == 0);
-        }
-    }
-
-    @Override
-    protected void testPruneAfterLoad() {
-        testPrune(0, 0, 0);
-        // Test disconnection will do nothing
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-        binaryStore.disconnectExternalFilestore(testExternal, ProviderConnectMode.COPY_FIRST, statusHolder);
-        String statusMsg = statusHolder.getStatusMsg();
-        assertFalse(statusHolder.isError(), "Error during disconnecting external provider: " + statusMsg);
-        assertTrue(statusMsg.contains("" + 4 + " files out"), "Wrong status message " + statusMsg);
-        assertTrue(statusMsg.contains("" + 0 + " total"), "Wrong status message " + statusMsg);
-        super.checkBinariesDirAfterLoad(getSubFoldersMap());
-    }
-
-    protected void checkSha1OnEmpty(String sha1) throws IOException {
-        assertNull(binaryStore.findBinary(sha1));
-        boolean exist = binaryStore.isFileExist(sha1);
-        assertTrue(exist);
-        assertBinaryExistsEmpty(sha1);
-    }
-
-    @Override
-    protected void assertPruneAfterOneGc() {
-        testPrune(1, 0, 0);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryStoreExternalProviderMoveTest.java b/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryStoreExternalProviderMoveTest.java
deleted file mode 100644
index 5113202..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryStoreExternalProviderMoveTest.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.binstore.itest.service;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.jfrog.storage.binstore.ifc.ProviderConnectMode;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Map;
-
-import static org.testng.Assert.*;
-
-/**
- * Date: 12/10/12
- * Time: 9:54 PM
- *
- * @author freds
- */
- at Test
-public class BinaryStoreExternalProviderMoveTest extends BinaryStoreExternalProviderBaseTest {
-
-    @Override
-    protected String getExternalConnectMode() {
-        return ProviderConnectMode.MOVE.propName;
-    }
-
-    @Override
-    protected void assertBinaryExistsEmpty(String sha1) throws IOException {
-        File extFile = new File(testExternal, sha1.substring(0, 2) + "/" + sha1);
-        assertTrue(extFile.exists());
-        InputStream bis = binaryStore.getBinary(sha1);
-        assertNotNull(bis);
-        bis.close();
-        // Test external removed
-        assertFalse(extFile.exists());
-    }
-
-    @Override
-    protected void checkBinariesDirAfterLoad(Map<String, Object[]> subFolders) {
-        // In move the folder is full as soon as binary accessed
-        super.checkBinariesDirAfterLoad(subFolders);
-    }
-
-    @Override
-    protected void testPruneAfterLoad() {
-        testPrune(0, 0, 0);
-        // Test disconnection will do nothing
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-        binaryStore.disconnectExternalFilestore(testExternal, ProviderConnectMode.COPY_FIRST, statusHolder);
-        String statusMsg = statusHolder.getStatusMsg();
-        assertFalse(statusHolder.isError(), "Error during disconnecting external provider: " + statusMsg);
-        assertTrue(statusMsg.contains("" + 4 + " files out"), "Wrong status message " + statusMsg);
-        assertTrue(statusMsg.contains("" + 0 + " total"), "Wrong status message " + statusMsg);
-        super.checkBinariesDirAfterLoad(getSubFoldersMap());
-    }
-
-    protected void checkSha1OnEmpty(String sha1) throws IOException {
-        assertNull(binaryStore.findBinary(sha1));
-        boolean exist = binaryStore.isFileExist(sha1);
-        assertTrue(exist);
-        assertBinaryExistsEmpty(sha1);
-    }
-
-    @Override
-    protected void assertPruneAfterOneGc() {
-        testPrune(1, 0, 0);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryStoreExternalProviderPassThroughTest.java b/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryStoreExternalProviderPassThroughTest.java
deleted file mode 100644
index 65dde88..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/BinaryStoreExternalProviderPassThroughTest.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.binstore.itest.service;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.storage.StorageUnit;
-import org.jfrog.storage.binstore.ifc.ProviderConnectMode;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Map;
-
-import static org.testng.Assert.*;
-
-/**
- * Date: 12/10/12
- * Time: 9:54 PM
- *
- * @author freds
- */
- at Test
-public class BinaryStoreExternalProviderPassThroughTest extends BinaryStoreExternalProviderBaseTest {
-
-    @Override
-    protected String getExternalConnectMode() {
-        return ProviderConnectMode.PASS_THROUGH.propName;
-    }
-
-    @Override
-    protected void assertBinaryExistsEmpty(String sha1) throws IOException {
-        InputStream bis = binaryStore.getBinary(sha1);
-        assertNotNull(bis);
-        bis.close();
-    }
-
-    @Override
-    protected void checkBinariesDirAfterLoad(Map<String, Object[]> subFolders) {
-        // In pass through the folder is empty after using binaries
-        // Even reading stream does not create the file
-        File filestoreDir = binaryStore.getBinariesDir();
-        File[] files = filestoreDir.listFiles();
-        assertNotNull(files);
-        assertEquals(files.length, 1);
-        for (File file : files) {
-            assertTrue(file.isDirectory(), "File " + file.getAbsolutePath() + " should be a folder");
-            String fileName = file.getName();
-            assertTrue(subFolders.containsKey(fileName), "File " + file + " should be part of " + subFolders.keySet());
-            Object[] binData = subFolders.get(fileName);
-            assertTrue(binData.length == 0);
-        }
-    }
-
-    @Override
-    protected void assertFileExistsAfterLoad(String sha1, long size) {
-        // In pass through the file actually never exist
-        boolean fileExist = binaryStore.isFileExist(sha1);
-        assertTrue(fileExist);
-    }
-
-    @Override
-    protected void testPruneAfterLoad() {
-        testPrune(0, 0, 0);
-        // Test disconnection will copy all files
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-        binaryStore.disconnectExternalFilestore(testExternal, ProviderConnectMode.MOVE, statusHolder);
-        String statusMsg = statusHolder.getStatusMsg();
-        assertFalse(statusHolder.isError(), "Error during disconnecting external provider: " + statusMsg);
-        assertTrue(statusMsg.contains("" + 4 + " files out"), "Wrong status message " + statusMsg);
-        assertTrue(statusMsg.contains("" + 4 + " total"), "Wrong status message " + statusMsg);
-        assertTrue(statusMsg.contains(StorageUnit.toReadableString(binaryStore.getStorageSize())),
-                "Wrong status message " + statusMsg);
-        super.checkBinariesDirAfterLoad(getSubFoldersMap());
-    }
-
-    protected void checkSha1OnEmpty(String sha1) throws IOException {
-        assertNull(binaryStore.findBinary(sha1));
-        boolean exist = binaryStore.isFileExist(sha1);
-        assertTrue(exist);
-        assertBinaryExistsEmpty(sha1);
-    }
-
-    @Override
-    protected void assertPruneAfterOneGc() {
-        testPrune(1, 0, 0);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/ConfigurableBinaryProviderManagerTest.java b/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/ConfigurableBinaryProviderManagerTest.java
deleted file mode 100644
index 2cfc41c..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/binstore/itest/service/ConfigurableBinaryProviderManagerTest.java
+++ /dev/null
@@ -1,170 +0,0 @@
-package org.artifactory.storage.db.binstore.itest.service;
-
-import org.artifactory.storage.StorageProperties;
-import org.artifactory.storage.StorageProperties.BinaryProviderType;
-import org.artifactory.storage.db.binstore.service.BlobBinaryProvider;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.jfrog.storage.binstore.common.BinaryProviderManagerImpl;
-import org.jfrog.storage.binstore.ifc.BinaryProviderConfig;
-import org.jfrog.storage.binstore.ifc.BinaryProviderManager;
-import org.jfrog.storage.binstore.providers.EmptyBinaryProvider;
-import org.jfrog.storage.binstore.providers.FileBinaryProvider;
-import org.jfrog.storage.binstore.providers.FileBinaryProviderImpl;
-import org.jfrog.storage.binstore.providers.FileCacheBinaryProviderImpl;
-import org.jfrog.storage.binstore.providers.base.BinaryProviderBase;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.util.ReflectionTestUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-
-import static org.artifactory.storage.StorageProperties.Key;
-import static org.artifactory.util.ResourceUtils.getResourceAsFile;
-
-/**
- * @author Gidi Shabat
- */
- at Test
-public class ConfigurableBinaryProviderManagerTest extends DbBaseTest {
-
-    private BinaryProviderManager manager;
-    @Autowired
-    private StorageProperties storageProperties;
-
-    @Test
-    public void binaryProviderWithOverrideProviderTest() throws IOException {
-        BinaryProviderConfig defaultValues = storageProperties.toDefaultValues();
-        File configFile = getResourceAsFile("/binarystore/config/binarystoreWithOverideProviders.xml");
-        defaultValues.setBinaryStoreXmlPath(configFile.getAbsolutePath());
-        manager = new BinaryProviderManagerImpl(defaultValues);
-        BinaryProviderBase blobBinaryProvider = (BinaryProviderBase) ReflectionTestUtils.getField(manager,
-                "firstBinaryProvider");
-        Assert.assertTrue(blobBinaryProvider instanceof BlobBinaryProvider);
-        BinaryProviderBase empty = blobBinaryProvider.next();
-        Assert.assertTrue(empty instanceof EmptyBinaryProvider);
-    }
-
-    @Test
-    public void binaryProviderWithTemplateTest() throws IOException {
-        BinaryProviderConfig defaultValues = storageProperties.toDefaultValues();
-        File configFile = getResourceAsFile("/binarystore/config/binarystore-filesystem-template.xml");
-        defaultValues.setBinaryStoreXmlPath(configFile.getAbsolutePath());
-        manager = new BinaryProviderManagerImpl(defaultValues);
-        BinaryProviderBase fileSystem = (BinaryProviderBase) ReflectionTestUtils.getField(manager,
-                "firstBinaryProvider");
-        Assert.assertTrue(fileSystem instanceof FileBinaryProviderImpl);
-        BinaryProviderBase empty = fileSystem.next();
-        Assert.assertTrue(empty instanceof EmptyBinaryProvider);
-        Assert.assertEquals("filestore", ((FileBinaryProvider) fileSystem).getBinariesDir().getName());
-    }
-
-    @Test
-    public void binaryProviderWithExistingProviderTest() throws IOException {
-        BinaryProviderConfig defaultValues = storageProperties.toDefaultValues();
-        File configFile = getResourceAsFile("/binarystore/config/binarystoreWithExistingProviders.xml");
-        defaultValues.setBinaryStoreXmlPath(configFile.getAbsolutePath());
-        manager = new BinaryProviderManagerImpl(defaultValues);
-        BinaryProviderBase blobBinaryProvider = (BinaryProviderBase) ReflectionTestUtils.getField(manager,
-                "firstBinaryProvider");
-        Assert.assertTrue(blobBinaryProvider instanceof BlobBinaryProvider);
-        BinaryProviderBase empty = blobBinaryProvider.next();
-        Assert.assertTrue(empty instanceof EmptyBinaryProvider);
-    }
-
-    @Test
-    public void binaryProviderWithTemplateAndProviderTest() throws IOException {
-        BinaryProviderConfig defaultValues = storageProperties.toDefaultValues();
-        File configFile = getResourceAsFile("/binarystore/config/binarystoreWithTemplateAndProvider.xml");
-        defaultValues.setBinaryStoreXmlPath(configFile.getAbsolutePath());
-        manager = new BinaryProviderManagerImpl(defaultValues);
-        BinaryProviderBase cache = (BinaryProviderBase) ReflectionTestUtils.getField(manager,
-                "firstBinaryProvider");
-        Assert.assertTrue(cache instanceof FileCacheBinaryProviderImpl);
-        BinaryProviderBase fileSystem = cache.next();
-        Assert.assertTrue(fileSystem instanceof FileBinaryProviderImpl);
-        BinaryProviderBase empty = fileSystem.next();
-        Assert.assertTrue(empty instanceof EmptyBinaryProvider);
-        Assert.assertEquals("test654", ((FileBinaryProvider) fileSystem).getBinariesDir().getName());
-    }
-
-    @Test
-    public void binaryProviderWithUserChainTest() throws IOException {
-        BinaryProviderConfig defaultValues = storageProperties.toDefaultValues();
-        File configFile = getResourceAsFile("/binarystore/config/binarystoreWithUserChain.xml");
-        defaultValues.setBinaryStoreXmlPath(configFile.getAbsolutePath());
-        manager = new BinaryProviderManagerImpl(defaultValues);
-        BinaryProviderBase cacheFs = (BinaryProviderBase) ReflectionTestUtils.getField(manager,
-                "firstBinaryProvider");
-        Assert.assertTrue(cacheFs instanceof FileCacheBinaryProviderImpl);
-        BinaryProviderBase retry = cacheFs.next();
-        BinaryProviderBase fileSystem2 = retry.next();
-        Assert.assertTrue(fileSystem2 instanceof FileBinaryProviderImpl);
-        BinaryProviderBase empty = fileSystem2.next();
-        Assert.assertTrue(empty instanceof EmptyBinaryProvider);
-        Assert.assertEquals("test89", ((FileBinaryProvider) cacheFs).getBinariesDir().getName());
-        Assert.assertEquals("test99", ((FileBinaryProvider) fileSystem2).getBinariesDir().getName());
-    }
-
-    @Test
-    public void oldGenerationWithFullDB() throws IOException {
-        BinaryProviderConfig defaultValues = storageProperties.toDefaultValues();
-        defaultValues.addParam("maxCacheSize", "1000");
-        defaultValues.addParam("storageType", BinaryProviderType.fullDb.name());
-        manager = new BinaryProviderManagerImpl(defaultValues);
-        BinaryProviderBase cacheFs = (BinaryProviderBase) ReflectionTestUtils.getField(manager,
-                "firstBinaryProvider");
-        Assert.assertTrue(cacheFs instanceof FileCacheBinaryProviderImpl);
-        BinaryProviderBase blob = cacheFs.next();
-        Assert.assertTrue(blob instanceof BlobBinaryProvider);
-        BinaryProviderBase empty = blob.next();
-        Assert.assertTrue(empty instanceof EmptyBinaryProvider);
-        Assert.assertEquals("cache", ((FileBinaryProvider) cacheFs).getBinariesDir().getName());
-    }
-
-    @Test
-    public void oldGenerationWithFullDBDirect() throws IOException {
-        // If the cache size is 0 then no cache binary provider will be created
-        BinaryProviderConfig defaultValues = storageProperties.toDefaultValues();
-        defaultValues.addParam("maxCacheSize", "0");
-        defaultValues.addParam("storageType", BinaryProviderType.fullDb.name());
-        manager = new BinaryProviderManagerImpl(defaultValues);
-        BinaryProviderBase blob = (BinaryProviderBase) ReflectionTestUtils.getField(manager,
-                "firstBinaryProvider");
-        Assert.assertTrue(blob instanceof BlobBinaryProvider);
-        BinaryProviderBase empty = blob.next();
-        Assert.assertTrue(empty instanceof EmptyBinaryProvider);
-    }
-
-    @Test
-    public void oldGenerationWithFileSystemDBDirect() throws IOException {
-        BinaryProviderConfig defaultValues = storageProperties.toDefaultValues();
-        defaultValues.addParam("storageType", BinaryProviderType.filesystem.name());
-        manager = new BinaryProviderManagerImpl(defaultValues);
-        BinaryProviderBase fileSystem = (BinaryProviderBase) ReflectionTestUtils.getField(manager,
-                "firstBinaryProvider");
-        Assert.assertTrue(fileSystem instanceof FileBinaryProviderImpl);
-        BinaryProviderBase empty = fileSystem.next();
-        Assert.assertTrue(empty instanceof EmptyBinaryProvider);
-    }
-
-    @Test
-    public void oldGenerationWithCacheAndFile() throws IOException {
-        BinaryProviderConfig defaultValues = storageProperties.toDefaultValues();
-        defaultValues.addParam("storageType", BinaryProviderType.cachedFS.name());
-        manager = new BinaryProviderManagerImpl(defaultValues);
-        BinaryProviderBase cacheFS = (BinaryProviderBase) ReflectionTestUtils.getField(manager,
-                "firstBinaryProvider");
-        Assert.assertTrue(cacheFS instanceof FileCacheBinaryProviderImpl);
-        BinaryProviderBase fileSystem = cacheFS.next();
-        Assert.assertTrue(fileSystem instanceof FileBinaryProviderImpl);
-        BinaryProviderBase empty = fileSystem.next();
-        Assert.assertTrue(empty instanceof EmptyBinaryProvider);
-    }
-
-    protected void updateStorageProperty(Key key, String value) {
-        Object propsField = ReflectionTestUtils.getField(storageProperties, "props");
-        ReflectionTestUtils.invokeMethod(propsField, "setProperty", key.key(), value);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/build/entity/BuildArtifactTest.java b/storage/db/src/test/java/org/artifactory/storage/db/build/entity/BuildArtifactTest.java
deleted file mode 100644
index a1eb625..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/build/entity/BuildArtifactTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.build.entity;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNull;
-
-/**
- * Date: 10/30/12
- * Time: 2:02 PM
- *
- * @author freds
- */
- at Test
-public class BuildArtifactTest {
-
-    public void simpleBuildArtifactTest() {
-        BuildArtifact b = new BuildArtifact(1L, 2L, "b", "t", "a1", "a2");
-        assertEquals(b.getArtifactId(), 1L);
-        assertEquals(b.getModuleId(), 2L);
-        assertEquals(b.getArtifactName(), "b");
-        assertEquals(b.getArtifactType(), "t");
-        assertEquals(b.getSha1(), "a1");
-        assertEquals(b.getMd5(), "a2");
-    }
-
-    public void mostlyNullBuildArtifactTest() {
-        BuildArtifact b = new BuildArtifact(1L, 2L, "b", null, null, null);
-        assertEquals(b.getArtifactId(), 1L);
-        assertEquals(b.getModuleId(), 2L);
-        assertEquals(b.getArtifactName(), "b");
-        assertNull(b.getArtifactType());
-        assertNull(b.getSha1());
-        assertNull(b.getMd5());
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*id.*negative.*")
-    public void noArtifactIdTest() {
-        new BuildArtifact(0L, 2L, "b", null, null, null);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*id.*negative.*")
-    public void negArtifactIdTest() {
-        new BuildArtifact(-2L, 2L, "b", null, null, null);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*id.*negative.*")
-    public void noModuleIdTest() {
-        new BuildArtifact(1L, 0L, "b", null, null, null);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*id.*negative.*")
-    public void negModuleIdTest() {
-        new BuildArtifact(1L, -2L, "b", null, null, null);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*name.*null.*")
-    public void noArtifactNameTest() {
-        new BuildArtifact(1L, 2L, null, null, null, null);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*name.*null.*")
-    public void emptyArtifactNameTest() {
-        new BuildArtifact(1L, 2L, " ", null, null, null);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/build/entity/BuildDependencyTest.java b/storage/db/src/test/java/org/artifactory/storage/db/build/entity/BuildDependencyTest.java
deleted file mode 100644
index fdb5cb6..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/build/entity/BuildDependencyTest.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.build.entity;
-
-import org.testng.annotations.Test;
-
-import java.util.Set;
-
-import static org.testng.Assert.*;
-
-/**
- * Date: 10/30/12
- * Time: 2:02 PM
- *
- * @author freds
- */
- at Test
-public class BuildDependencyTest {
-
-    public void simpleBuildDependencyTest() {
-        BuildDependency b = new BuildDependency(1L, 2L, "b", "c,d", "t", "a1", "a2");
-        assertEquals(b.getDependencyId(), 1L);
-        assertEquals(b.getModuleId(), 2L);
-        assertEquals(b.getDependencyNameId(), "b");
-        assertEquals(b.getDependencyScopes(), "c,d");
-        assertEquals(b.getDependencyType(), "t");
-        assertEquals(b.getSha1(), "a1");
-        assertEquals(b.getMd5(), "a2");
-    }
-
-    public void mostlyNullBuildDependencyTest() {
-        BuildDependency b = new BuildDependency(1L, 2L, "b", "", null, null, null);
-        assertEquals(b.getDependencyId(), 1L);
-        assertEquals(b.getModuleId(), 2L);
-        assertEquals(b.getDependencyNameId(), "b");
-        assertEquals(b.getDependencyScopes(), "");
-        assertTrue(b.getScopes().isEmpty());
-        assertNull(b.getDependencyType());
-        assertNull(b.getSha1());
-        assertNull(b.getMd5());
-    }
-
-    public void mostlyNullBuildDependencyTest2() {
-        BuildDependency b = new BuildDependency(1L, 2L, "b", (String) null, null, null, null);
-        assertEquals(b.getDependencyId(), 1L);
-        assertEquals(b.getModuleId(), 2L);
-        assertEquals(b.getDependencyNameId(), "b");
-        assertNull(b.getDependencyScopes());
-        assertTrue(b.getScopes().isEmpty());
-        assertNull(b.getDependencyType());
-        assertNull(b.getSha1());
-        assertNull(b.getMd5());
-    }
-
-    public void mostlyNullBuildDependencyTest3() {
-        BuildDependency b = new BuildDependency(1L, 2L, "b", (Set<String>) null, null, null, null);
-        assertEquals(b.getDependencyId(), 1L);
-        assertEquals(b.getModuleId(), 2L);
-        assertEquals(b.getDependencyNameId(), "b");
-        assertEquals(b.getDependencyScopes(), "");
-        assertTrue(b.getScopes().isEmpty());
-        assertNull(b.getDependencyType());
-        assertNull(b.getSha1());
-        assertNull(b.getMd5());
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*id.*negative.*")
-    public void noDependencyIdTest() {
-        new BuildDependency(0L, 2L, "b", "", null, null, null);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*id.*negative.*")
-    public void negDependencyIdTest() {
-        new BuildDependency(-2L, 2L, "b", "", null, null, null);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*id.*negative.*")
-    public void noModuleIdTest() {
-        new BuildDependency(1L, 0L, "b", "", null, null, null);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*id.*negative.*")
-    public void negModuleIdTest() {
-        new BuildDependency(1L, -2L, "b", "", null, null, null);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*name.*null.*")
-    public void noDependencyNameTest() {
-        new BuildDependency(1L, 2L, null, (String) null, null, null, null);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*name.*null.*")
-    public void emptyDependencyNameTest() {
-        new BuildDependency(1L, 2L, " ", (String) null, null, null, null);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/build/entity/BuildEntityTest.java b/storage/db/src/test/java/org/artifactory/storage/db/build/entity/BuildEntityTest.java
deleted file mode 100644
index 276e7d2..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/build/entity/BuildEntityTest.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.build.entity;
-
-import com.google.common.collect.ImmutableSortedSet;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-
-import static org.testng.Assert.*;
-
-/**
- * Date: 10/31/12
- * Time: 8:41 AM
- *
- * @author freds
- */
- at Test
-public class BuildEntityTest {
-
-    public void simpleBuildTest() {
-        BuildEntity b = new BuildEntity(1L, "a", "1", 10000000L, "h", 34L, "c", 36L, "m");
-        b.setProperties(new HashSet<BuildProperty>());
-        b.setPromotions(new HashSet<BuildPromotionStatus>());
-        assertEquals(b.getBuildId(), 1L);
-        assertEquals(b.getBuildName(), "a");
-        assertEquals(b.getBuildNumber(), "1");
-        assertEquals(b.getBuildDate(), 10000000L);
-        assertEquals(b.getCiUrl(), "h");
-        assertEquals(b.getCreated(), 34L);
-        assertEquals(b.getCreatedBy(), "c");
-        assertEquals(b.getModified(), 36L);
-        assertEquals(b.getModifiedBy(), "m");
-        assertTrue(b.getProperties().isEmpty());
-        assertTrue(b.getPromotions().isEmpty());
-    }
-
-    public void maxNullBuildTest() {
-        BuildEntity b = new BuildEntity(1L, "a", "1", 10000000L, null, 3L, null, 0L, null);
-        assertEquals(b.getBuildId(), 1L);
-        assertEquals(b.getBuildName(), "a");
-        assertEquals(b.getBuildNumber(), "1");
-        assertEquals(b.getBuildDate(), 10000000L);
-        assertNull(b.getCiUrl());
-        assertEquals(b.getCreated(), 3L);
-        assertNull(b.getCreatedBy());
-        assertEquals(b.getModified(), 0L);
-        assertNull(b.getModifiedBy());
-        b = new BuildEntity(1L, "a", "1", 10000000L, null, 3L, null, -2L, null);
-        assertEquals(b.getBuildId(), 1L);
-        assertEquals(b.getBuildName(), "a");
-        assertEquals(b.getBuildNumber(), "1");
-        assertEquals(b.getBuildDate(), 10000000L);
-        assertNull(b.getCiUrl());
-        assertEquals(b.getCreated(), 3L);
-        assertNull(b.getCreatedBy());
-        assertEquals(b.getModified(), -2L);
-        assertNull(b.getModifiedBy());
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*id.*negative.*")
-    public void noIdBuildTest() {
-        new BuildEntity(0L, "a", "1", 10000000L, null, 34L, "c", 36L, "m");
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*id.*negative.*")
-    public void negIdBuildTest() {
-        new BuildEntity(-1L, "a", "1", 10000000L, null, 34L, "c", 36L, "m");
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*name.*null.*")
-    public void nullNameBuildTest() {
-        new BuildEntity(1L, null, "1", 10000000L, null, 34L, "c", 36L, "m");
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*name.*null.*")
-    public void noNameBuildTest() {
-        new BuildEntity(1L, " ", "1", 10000000L, null, 34L, "c", 36L, "m");
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*number.*null.*")
-    public void nullNumberBuildTest() {
-        new BuildEntity(1L, "a", null, 10000000L, null, 34L, "c", 36L, "m");
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*number.*null.*")
-    public void noNumberBuildTest() {
-        new BuildEntity(1L, "a", " ", 10000000L, null, 34L, "c", 36L, "m");
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*date.*null.*")
-    public void nullDateBuildTest() {
-        new BuildEntity(1L, "a", "1", 0L, null, 34L, "c", 36L, "m");
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*date.*null.*")
-    public void noDateBuildTest() {
-        new BuildEntity(1L, "a", "1", -3L, null, 34L, "c", 36L, "m");
-    }
-
-    @Test(expectedExceptions = {IllegalStateException.class},
-            expectedExceptionsMessageRegExp = ".*not initialized.*Properties missing.*")
-    public void noPropertiesInBuildTest() {
-        BuildEntity b = new BuildEntity(1L, "a", "1", 10000000L, null, 1L, null, 0L, null);
-        b.getProperties();
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class},
-            expectedExceptionsMessageRegExp = ".*set properties.*null.*")
-    public void setNullPropertiesInBuildTest() {
-        BuildEntity b = new BuildEntity(1L, "a", "1", 10000000L, null, 1L, null, 0L, null);
-        b.setProperties(null);
-    }
-
-    @Test(expectedExceptions = {IllegalStateException.class},
-            expectedExceptionsMessageRegExp = ".*Properties already set.*")
-    public void doubleSetPropertiesInBuildTest() {
-        BuildEntity b = new BuildEntity(1L, "a", "1", 10000000L, null, 1L, null, 0L, null);
-        b.setProperties(new HashSet<BuildProperty>());
-        b.setProperties(new HashSet<BuildProperty>());
-    }
-
-
-    @Test(expectedExceptions = {IllegalStateException.class},
-            expectedExceptionsMessageRegExp = ".*not initialized.*Promotions missing.*")
-    public void noPromotionsInBuildTest() {
-        BuildEntity b = new BuildEntity(1L, "a", "1", 10000000L, null, 1L, null, 0L, null);
-        b.getPromotions();
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class},
-            expectedExceptionsMessageRegExp = ".*set promotion.*null.*")
-    public void setNullPromotionsInBuildTest() {
-        BuildEntity b = new BuildEntity(1L, "a", "1", 10000000L, null, 1L, null, 0L, null);
-        b.setPromotions(null);
-    }
-
-    @Test(expectedExceptions = {IllegalStateException.class},
-            expectedExceptionsMessageRegExp = ".*Promotions already set.*")
-    public void doubleSetPromotionsInBuildTest() {
-        BuildEntity b = new BuildEntity(1L, "a", "1", 10000000L, null, 1L, null, 0L, null);
-        b.setPromotions(new HashSet<BuildPromotionStatus>());
-        b.setPromotions(new HashSet<BuildPromotionStatus>());
-    }
-
-    public void buildPropertiesTest() {
-        BuildEntity b = new BuildEntity(1L, "a", "1", 10000000L, "h", 34L, "c", 36L, "m");
-        Collection<BuildProperty> properties = new ArrayList<BuildProperty>();
-        properties.add(new BuildProperty(1L, 1L, "k1", "v1"));
-        properties.add(new BuildProperty(2L, 1L, "k2", "v2"));
-        BuildProperty badApple = new BuildProperty(2L, 1L, "k-bad", "v2");
-        properties.add(badApple);
-        b.setProperties(properties);
-        assertEquals(b.getBuildId(), 1L);
-        assertEquals(b.getBuildName(), "a");
-        assertEquals(b.getBuildNumber(), "1");
-        assertEquals(b.getBuildDate(), 10000000L);
-        assertEquals(b.getCiUrl(), "h");
-        assertEquals(b.getCreated(), 34L);
-        assertEquals(b.getCreatedBy(), "c");
-        assertEquals(b.getModified(), 36L);
-        assertEquals(b.getModifiedBy(), "m");
-        assertEquals(b.getProperties().size(), 2);
-        assertTrue(b.getProperties().contains(badApple));
-        for (BuildProperty buildProperty : b.getProperties()) {
-            assertFalse(buildProperty.isIdentical(badApple));
-        }
-    }
-
-    public void buildPromotionsTest() {
-        BuildEntity b = new BuildEntity(1L, "a", "1", 10000000L, "h", 34L, "c", 36L, "m");
-        Collection<BuildPromotionStatus> promotions = new ArrayList<BuildPromotionStatus>();
-        BuildPromotionStatus first = new BuildPromotionStatus(1L, 2L, "me", "rel", null, null, null);
-        BuildPromotionStatus second = new BuildPromotionStatus(1L, 3L, "me", "roll", null, null, null);
-        // Insert second first ;)
-        promotions.add(second);
-        promotions.add(first);
-        BuildPromotionStatus badApple = new BuildPromotionStatus(1L, 2L, "me", "k-bad", null, null, null);
-        promotions.add(badApple);
-        b.setPromotions(promotions);
-        assertEquals(b.getBuildId(), 1L);
-        assertEquals(b.getBuildName(), "a");
-        assertEquals(b.getBuildNumber(), "1");
-        assertEquals(b.getBuildDate(), 10000000L);
-        assertEquals(b.getCiUrl(), "h");
-        assertEquals(b.getCreated(), 34L);
-        assertEquals(b.getCreatedBy(), "c");
-        assertEquals(b.getModified(), 36L);
-        assertEquals(b.getModifiedBy(), "m");
-        ImmutableSortedSet<BuildPromotionStatus> statuses = b.getPromotions();
-        assertEquals(statuses.size(), 2);
-        assertTrue(statuses.contains(badApple));
-        assertTrue(statuses.first().isIdentical(first));
-        assertTrue(statuses.last().isIdentical(second));
-        for (BuildPromotionStatus buildPromo : statuses) {
-            assertFalse(buildPromo.isIdentical(badApple));
-        }
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/build/entity/BuildModuleTest.java b/storage/db/src/test/java/org/artifactory/storage/db/build/entity/BuildModuleTest.java
deleted file mode 100644
index 04ee880..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/build/entity/BuildModuleTest.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.build.entity;
-
-import org.testng.annotations.Test;
-
-import java.util.HashSet;
-
-import static org.testng.Assert.*;
-
-/**
- * Date: 10/31/12
- * Time: 8:41 AM
- *
- * @author freds
- */
- at Test
-public class BuildModuleTest {
-
-    public void simpleBuildModuleTest() {
-        BuildModule bm = new BuildModule(1L, 2L, "a");
-        bm.setProperties(new HashSet<ModuleProperty>());
-        assertEquals(bm.getModuleId(), 1L);
-        assertEquals(bm.getBuildId(), 2L);
-        assertEquals(bm.getModuleNameId(), "a");
-        assertTrue(bm.getProperties().isEmpty());
-    }
-
-    public void simpleModulePropertyTest() {
-        ModuleProperty mp = new ModuleProperty(1L, 2L, "k", "v");
-        assertEquals(mp.getPropId(), 1L);
-        assertEquals(mp.getModuleId(), 2L);
-        assertEquals(mp.getPropKey(), "k");
-        assertEquals(mp.getPropValue(), "v");
-    }
-
-    public void maxNullsModulePropertyTest() {
-        ModuleProperty mp = new ModuleProperty(1L, 2L, "k", null);
-        assertEquals(mp.getPropId(), 1L);
-        assertEquals(mp.getModuleId(), 2L);
-        assertEquals(mp.getPropKey(), "k");
-        assertNull(mp.getPropValue());
-    }
-
-    public void equalsModulePropertyTest() {
-        ModuleProperty mp1 = new ModuleProperty(1L, 2L, "k", "v");
-        ModuleProperty mp2 = new ModuleProperty(2L, 2L, "k", "v");
-        ModuleProperty mp2a = new ModuleProperty(2L, 3L, "k", "v");
-        ModuleProperty mp2b = new ModuleProperty(2L, 2L, "k1", "v");
-        ModuleProperty mp2c = new ModuleProperty(2L, 2L, "k", "v1");
-        ModuleProperty mp3 = new ModuleProperty(1L, 3L, "nk", null);
-        assertNotEquals(mp1, mp2);
-        assertNotEquals(mp1.hashCode(), mp2.hashCode());
-        assertNotEquals(mp3, mp2);
-        assertNotEquals(mp3.hashCode(), mp2.hashCode());
-        assertEquals(mp1, mp3);
-        assertEquals(mp1.hashCode(), mp3.hashCode());
-        assertEquals(mp2, mp2a);
-        assertEquals(mp2.hashCode(), mp2a.hashCode());
-        assertEquals(mp2, mp2b);
-        assertEquals(mp2.hashCode(), mp2b.hashCode());
-        assertEquals(mp2, mp2c);
-        assertEquals(mp2.hashCode(), mp2c.hashCode());
-        assertTrue(mp1.isIdentical(mp2));
-        assertFalse(mp2.isIdentical(mp2a));
-        assertFalse(mp2.isIdentical(mp2b));
-        assertFalse(mp2.isIdentical(mp2c));
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*id.*negative.*")
-    public void noIdModulePropertyTest() {
-        new ModuleProperty(0L, 2L, "k", "v");
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*id.*negative.*")
-    public void negIdModulePropertyTest() {
-        new ModuleProperty(-1L, 2L, "k", "v");
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*id.*negative.*")
-    public void noBuildIdModulePropertyTest() {
-        new ModuleProperty(1L, 0L, "k", "v");
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*id.*negative.*")
-    public void negBuildIdModulePropertyTest() {
-        new ModuleProperty(1L, -2L, "k", "v");
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*key.*null.*")
-    public void nullKeyModulePropertyTest() {
-        new ModuleProperty(1L, 2L, null, "v");
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*key.*null.*")
-    public void noKeyModulePropertyTest() {
-        new ModuleProperty(1L, 2L, " ", "v");
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*id.*negative.*")
-    public void noIdBuildModuleTest() {
-        new BuildModule(0L, 2L, "a");
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*id.*negative.*")
-    public void negIdBuildModuleTest() {
-        new BuildModule(-1L, 2L, "a");
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*id.*negative.*")
-    public void noBuildIdBuildModuleTest() {
-        new BuildModule(1L, 0L, "a");
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*id.*negative.*")
-    public void negBuildIdBuildModuleTest() {
-        new BuildModule(1L, -2L, "a");
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*name.*null.*")
-    public void nullNameBuildModuleTest() {
-        new BuildModule(1L, 2L, null);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*name.*null.*")
-    public void noNameBuildModuleTest() {
-        new BuildModule(1L, 2L, " ");
-    }
-
-    @Test(expectedExceptions = {IllegalStateException.class},
-            expectedExceptionsMessageRegExp = ".*not initialized.*Properties missing.*")
-    public void noPropertiesInBuildModuleTest() {
-        BuildModule bm = new BuildModule(1L, 2L, "a");
-        bm.getProperties();
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class},
-            expectedExceptionsMessageRegExp = ".*set properties.*null.*")
-    public void setNullPropertiesInBuildModuleTest() {
-        BuildModule bm = new BuildModule(1L, 2L, "a");
-        bm.setProperties(null);
-    }
-
-    @Test(expectedExceptions = {IllegalStateException.class},
-            expectedExceptionsMessageRegExp = ".*Properties already set.*")
-    public void doubleSetPropertiesInBuildModuleTest() {
-        BuildModule bm = new BuildModule(1L, 2L, "a");
-        bm.setProperties(new HashSet<ModuleProperty>());
-        bm.setProperties(new HashSet<ModuleProperty>());
-    }
-
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/build/entity/BuildPromotionStatusTest.java b/storage/db/src/test/java/org/artifactory/storage/db/build/entity/BuildPromotionStatusTest.java
deleted file mode 100644
index 1e3f4fc..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/build/entity/BuildPromotionStatusTest.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.build.entity;
-
-import com.google.common.collect.ImmutableList;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Collections;
-
-import static org.testng.Assert.*;
-
-/**
- * Date: 11/23/12
- * Time: 10:47 AM
- *
- * @author freds
- */
- at Test
-public class BuildPromotionStatusTest {
-    public void simpleBuildPromotionTest() {
-        BuildPromotionStatus bp = new BuildPromotionStatus(1L, 2L, "me", "s", "r", "c", "u");
-        assertEquals(bp.getBuildId(), 1L);
-        assertEquals(bp.getCreated(), 2L);
-        assertEquals(bp.getCreatedBy(), "me");
-        assertEquals(bp.getStatus(), "s");
-        assertEquals(bp.getRepository(), "r");
-        assertEquals(bp.getComment(), "c");
-        assertEquals(bp.getCiUser(), "u");
-    }
-
-    public void maxNullsBuildPromotionTest() {
-        BuildPromotionStatus bp = new BuildPromotionStatus(1L, 2L, null, "s", null, null, null);
-        assertEquals(bp.getBuildId(), 1L);
-        assertEquals(bp.getCreated(), 2L);
-        assertEquals(bp.getStatus(), "s");
-        assertNull(bp.getCreatedBy());
-        assertNull(bp.getRepository());
-        assertNull(bp.getComment());
-        assertNull(bp.getCiUser());
-    }
-
-    public void equalsBuildPromotionsTest() {
-        BuildPromotionStatus bp1 = new BuildPromotionStatus(1L, 2L, null, "s", null, null, null);
-        BuildPromotionStatus bp2 = new BuildPromotionStatus(2L, 2L, null, "s", null, null, null);
-        BuildPromotionStatus bp3 = new BuildPromotionStatus(2L, 1L, null, "s", null, null, null);
-
-        ImmutableList<BuildPromotionStatus> allEqualsToBp2 = ImmutableList.of(
-                new BuildPromotionStatus(2L, 2L, null, "s1", null, null, null),
-                new BuildPromotionStatus(2L, 2L, "me", "s", null, null, null),
-                new BuildPromotionStatus(2L, 2L, null, "s", "re", null, null),
-                new BuildPromotionStatus(2L, 2L, null, "s", null, "co", null),
-                new BuildPromotionStatus(2L, 2L, null, "s", null, null, "ci"));
-
-        assertNotEquals(bp1, bp2);
-        assertNotEquals(bp1.hashCode(), bp2.hashCode());
-        assertFalse(bp1.isIdentical(bp2));
-        assertTrue(bp1.compareTo(bp2) < 0);
-
-        assertNotEquals(bp1, bp3);
-        assertNotEquals(bp1.hashCode(), bp3.hashCode());
-        assertFalse(bp1.isIdentical(bp3));
-        assertTrue(bp1.compareTo(bp3) < 0);
-
-        assertNotEquals(bp3, bp2);
-        assertNotEquals(bp3.hashCode(), bp2.hashCode());
-        assertFalse(bp3.isIdentical(bp2));
-        assertTrue(bp3.compareTo(bp2) < 0);
-
-        for (BuildPromotionStatus status : allEqualsToBp2) {
-            assertEquals(bp2, status);
-            assertEquals(bp2.hashCode(), status.hashCode());
-            assertFalse(bp2.isIdentical(status));
-            assertEquals(status.compareTo(bp2), 0);
-            assertTrue(status.compareTo(bp1) > 0);
-            assertTrue(status.compareTo(bp3) > 0);
-        }
-    }
-
-    public void testBuildPromotionsOrderTest() {
-        // The order should be 1, 3, 2
-        BuildPromotionStatus bp1 = new BuildPromotionStatus(1L, 2L, null, "s", null, null, null);
-        BuildPromotionStatus bp2 = new BuildPromotionStatus(2L, 2L, null, "s", null, null, null);
-        BuildPromotionStatus bp3 = new BuildPromotionStatus(2L, 1L, null, "s", null, null, null);
-
-        ArrayList<BuildPromotionStatus> statuses = new ArrayList<BuildPromotionStatus>(3);
-        statuses.add(bp2);
-        statuses.add(bp1);
-        statuses.add(bp3);
-        Collections.sort(statuses);
-        assertEquals(statuses.get(0), bp1);
-        assertEquals(statuses.get(1), bp3);
-        assertEquals(statuses.get(2), bp2);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*id.*zero.*")
-    public void noBuildIdBuildPromotionTest() {
-        new BuildPromotionStatus(0L, 1L, null, "s", null, null, null);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*id.*negative.*")
-    public void negBuildIdBuildPromotionTest() {
-        new BuildPromotionStatus(-2L, 1L, null, "s", null, null, null);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*date.*zero.*")
-    public void noCreatedBuildPromotionTest() {
-        new BuildPromotionStatus(1L, 0L, null, "s", null, null, null);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*date.*negative.*")
-    public void negCreatedBuildPromotionTest() {
-        new BuildPromotionStatus(1L, -1L, null, "s", null, null, null);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*status.*null.*")
-    public void nullStatusBuildPromotionTest() {
-        new BuildPromotionStatus(1L, 1L, null, null, null, null, null);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*status.*empty.*")
-    public void emptyStatusBuildPromotionTest() {
-        new BuildPromotionStatus(1L, 1L, null, " ", null, null, null);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/build/entity/BuildPropertyTest.java b/storage/db/src/test/java/org/artifactory/storage/db/build/entity/BuildPropertyTest.java
deleted file mode 100644
index 3b5e382..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/build/entity/BuildPropertyTest.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.build.entity;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * Date: 11/23/12
- * Time: 10:41 AM
- *
- * @author freds
- */
- at Test
-public class BuildPropertyTest {
-    public void simpleBuildPropertyTest() {
-        BuildProperty bp = new BuildProperty(1L, 2L, "k", "v");
-        assertEquals(bp.getPropId(), 1L);
-        assertEquals(bp.getBuildId(), 2L);
-        assertEquals(bp.getPropKey(), "k");
-        assertEquals(bp.getPropValue(), "v");
-    }
-
-    public void maxNullsBuildPropertyTest() {
-        BuildProperty bp = new BuildProperty(1L, 2L, "k", null);
-        assertEquals(bp.getPropId(), 1L);
-        assertEquals(bp.getBuildId(), 2L);
-        assertEquals(bp.getPropKey(), "k");
-        assertNull(bp.getPropValue());
-    }
-
-    public void equalsBuildPropertyTest() {
-        BuildProperty bp1 = new BuildProperty(1L, 2L, "k", "v");
-        BuildProperty bp2 = new BuildProperty(2L, 2L, "k", "v");
-        BuildProperty bp2a = new BuildProperty(2L, 3L, "k", "v");
-        BuildProperty bp2b = new BuildProperty(2L, 2L, "k1", "v");
-        BuildProperty bp2c = new BuildProperty(2L, 2L, "k", "v1");
-        BuildProperty bp3 = new BuildProperty(1L, 3L, "nk", null);
-        assertNotEquals(bp1, bp2);
-        assertNotEquals(bp1.hashCode(), bp2.hashCode());
-        assertNotEquals(bp3, bp2);
-        assertNotEquals(bp3.hashCode(), bp2.hashCode());
-        assertEquals(bp1, bp3);
-        assertEquals(bp1.hashCode(), bp3.hashCode());
-        assertEquals(bp2, bp2a);
-        assertEquals(bp2.hashCode(), bp2a.hashCode());
-        assertEquals(bp2, bp2b);
-        assertEquals(bp2.hashCode(), bp2b.hashCode());
-        assertEquals(bp2, bp2c);
-        assertEquals(bp2.hashCode(), bp2c.hashCode());
-        assertTrue(bp1.isIdentical(bp2));
-        assertFalse(bp2.isIdentical(bp2a));
-        assertFalse(bp2.isIdentical(bp2b));
-        assertFalse(bp2.isIdentical(bp2c));
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*id.*zero.*")
-    public void noIdBuildPropertyTest() {
-        new BuildProperty(0L, 2L, "k", "v");
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*id.*negative.*")
-    public void negIdBuildPropertyTest() {
-        new BuildProperty(-1L, 2L, "k", "v");
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*id.*zero.*")
-    public void noBuildIdBuildPropertyTest() {
-        new BuildProperty(1L, 0L, "k", "v");
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*id.*negative.*")
-    public void negBuildIdBuildPropertyTest() {
-        new BuildProperty(1L, -2L, "k", "v");
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*key.*null.*")
-    public void nullKeyBuildPropertyTest() {
-        new BuildProperty(1L, 2L, null, "v");
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = ".*key.*empty.*")
-    public void noKeyBuildPropertyTest() {
-        new BuildProperty(1L, 2L, " ", "v");
-    }
-
-
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/build/itest/dao/BuildArtifactsDaoTest.java b/storage/db/src/test/java/org/artifactory/storage/db/build/itest/dao/BuildArtifactsDaoTest.java
deleted file mode 100644
index 891a1db..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/build/itest/dao/BuildArtifactsDaoTest.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.build.itest.dao;
-
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.storage.db.build.entity.BuildArtifact;
-import org.testng.Assert;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.Test;
-
-import java.io.UnsupportedEncodingException;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Date: 10/31/12
- * Time: 11:03 AM
- * <p/>
- * TODO: Test for SQL constraints violations.
- *
- * @author freds
- */
- at Test
-public class BuildArtifactsDaoTest extends BuildsDaoBaseTest {
-    private static final String SHA1_SUFFIX = "cab88fc2a043c2479a6de676a2f8179e9ea2167";
-    private static final String MD5_SUFFIX = "02a360ecad98a34b59863c1e65bcf71";
-
-    @AfterClass
-    public void testFullDelete() throws SQLException {
-        assertEquals(buildArtifactsDao.deleteAllBuildArtifacts(), 3);
-        assertEquals(buildDependenciesDao.deleteAllBuildDependencies(), 0);
-        assertEquals(buildModulesDao.deleteAllBuildModules(), 11);
-        assertEquals(buildsDao.deleteAllBuilds(), 12);
-    }
-
-    public void testCreateSimpleArtifact() throws SQLException, UnsupportedEncodingException {
-        createAndInsertModules11();
-        BuildArtifact ba = new BuildArtifact(1001L, 101L, "art1", "jar", "1" + SHA1_SUFFIX, "1" + MD5_SUFFIX);
-        Assert.assertEquals(buildArtifactsDao.createBuildArtifact(ba), 1);
-        List<BuildArtifact> artifacts = buildArtifactsDao.findArtifactsForModule(101L);
-        assertFoundArtifact1001(artifacts);
-    }
-
-    private void assertFoundArtifact1001(List<BuildArtifact> artifacts) {
-        Assert.assertEquals(artifacts.size(), 1);
-        BuildArtifact buildArtifact = artifacts.get(0);
-        Assert.assertEquals(buildArtifact.getArtifactId(), 1001L);
-        Assert.assertEquals(buildArtifact.getArtifactName(), "art1");
-        Assert.assertEquals(buildArtifact.getArtifactType(), "jar");
-        Assert.assertEquals(buildArtifact.getSha1(), "1" + SHA1_SUFFIX);
-        Assert.assertEquals(buildArtifact.getMd5(), "1" + MD5_SUFFIX);
-    }
-
-    public void testCreateMultipleArtifacts() throws SQLException, UnsupportedEncodingException {
-        long build12 = createAndInsertModules12();
-        ArrayList<BuildArtifact> bas = new ArrayList<BuildArtifact>(2);
-        bas.add(new BuildArtifact(2001L, 201L, "b2-art1", "dll", "a" + SHA1_SUFFIX, "a" + MD5_SUFFIX));
-        bas.add(new BuildArtifact(2002L, 201L, "b2-art2", "zip", "b" + SHA1_SUFFIX, "b" + MD5_SUFFIX));
-        bas.add(new BuildArtifact(2021L, 202L, "b2-m2-art1", "jar", "b" + SHA1_SUFFIX, "b" + MD5_SUFFIX));
-        bas.add(new BuildArtifact(2022L, 202L, "b2-m2-art2", "pom", "c" + SHA1_SUFFIX, "c" + MD5_SUFFIX));
-        Assert.assertEquals(buildArtifactsDao.createBuildArtifacts(bas), 4);
-        List<BuildArtifact> artifacts = buildArtifactsDao.findArtifactsForModules(
-                buildModulesDao.findModuleIdsForBuild(build12));
-        Assert.assertEquals(artifacts.size(), 4);
-        assertBuildArtifactsFromBuild12(artifacts);
-    }
-
-    public void testCreateNullChecksumsDependencies() throws SQLException, UnsupportedEncodingException {
-        long build14 = createAndInsertModules14();
-        ArrayList<BuildArtifact> bas = new ArrayList<BuildArtifact>(2);
-        bas.add(new BuildArtifact(4001L, 401L, "b2-art1", "dll", "e" + SHA1_SUFFIX, null));
-        bas.add(new BuildArtifact(4021L, 402L, "b2-m2-art1", "jar", null, "f" + MD5_SUFFIX));
-        bas.add(new BuildArtifact(4022L, 402L, "b2-m2-art1", null, null, null));
-        Assert.assertEquals(buildArtifactsDao.createBuildArtifacts(bas), 3);
-        List<BuildArtifact> artifacts = buildArtifactsDao.findArtifactsForModules(
-                buildModulesDao.findModuleIdsForBuild(build14));
-        Assert.assertEquals(artifacts.size(), 3);
-    }
-
-    private void assertBuildArtifactsFromBuild12(List<BuildArtifact> artifacts) {
-        for (BuildArtifact artifact : artifacts) {
-            switch ((int) artifact.getArtifactId()) {
-                case 2001:
-                    Assert.assertEquals(artifact.getArtifactName(), "b2-art1");
-                    Assert.assertEquals(artifact.getArtifactType(), "dll");
-                    Assert.assertEquals(artifact.getSha1(), "a" + SHA1_SUFFIX);
-                    Assert.assertEquals(artifact.getMd5(), "a" + MD5_SUFFIX);
-                    break;
-                case 2002:
-                    Assert.assertEquals(artifact.getArtifactName(), "b2-art2");
-                    Assert.assertEquals(artifact.getArtifactType(), "zip");
-                    Assert.assertEquals(artifact.getSha1(), "b" + SHA1_SUFFIX);
-                    Assert.assertEquals(artifact.getMd5(), "b" + MD5_SUFFIX);
-                    break;
-                case 2021:
-                    Assert.assertEquals(artifact.getArtifactName(), "b2-m2-art1");
-                    Assert.assertEquals(artifact.getArtifactType(), "jar");
-                    Assert.assertEquals(artifact.getSha1(), "b" + SHA1_SUFFIX);
-                    Assert.assertEquals(artifact.getMd5(), "b" + MD5_SUFFIX);
-                    break;
-                case 2022:
-                    Assert.assertEquals(artifact.getArtifactName(), "b2-m2-art2");
-                    Assert.assertEquals(artifact.getArtifactType(), "pom");
-                    Assert.assertEquals(artifact.getSha1(), "c" + SHA1_SUFFIX);
-                    Assert.assertEquals(artifact.getMd5(), "c" + MD5_SUFFIX);
-                    break;
-                default:
-                    Assert.fail("Build artifact " + artifact + " should not appear in this list!");
-            }
-        }
-    }
-
-    @Test(dependsOnMethods = {"testCreateSimpleArtifact", "testCreateMultipleArtifacts"})
-    public void testFindBySha1() throws SQLException {
-        assertFoundArtifact1001(buildArtifactsDao.findArtifactsForChecksum(ChecksumType.sha1, "1" + SHA1_SUFFIX));
-        List<BuildArtifact> forSha1 = buildArtifactsDao.findArtifactsForChecksum(ChecksumType.sha1, "b" + SHA1_SUFFIX);
-        Assert.assertEquals(forSha1.size(), 2);
-        assertBuildArtifactsFromBuild12(forSha1);
-    }
-
-    @Test(dependsOnMethods = {"testCreateSimpleArtifact", "testCreateMultipleArtifacts"})
-    public void testFindByMd5() throws SQLException {
-        assertFoundArtifact1001(buildArtifactsDao.findArtifactsForChecksum(ChecksumType.md5, "1" + MD5_SUFFIX));
-        List<BuildArtifact> forMd5 = buildArtifactsDao.findArtifactsForChecksum(ChecksumType.md5, "b" + MD5_SUFFIX);
-        Assert.assertEquals(forMd5.size(), 2);
-        assertBuildArtifactsFromBuild12(forMd5);
-    }
-
-    @Test(dependsOnMethods = {"testFindBySha1", "testFindByMd5"})
-    public void testDeleteBuildArtifacts() throws SQLException {
-        Assert.assertEquals(buildArtifactsDao.deleteBuildArtifacts(buildModulesDao.findModuleIdsForBuild(11L)), 1);
-        Assert.assertEquals(buildArtifactsDao.deleteBuildArtifacts(buildModulesDao.findModuleIdsForBuild(12L)), 4);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/build/itest/dao/BuildDependenciesDaoTest.java b/storage/db/src/test/java/org/artifactory/storage/db/build/itest/dao/BuildDependenciesDaoTest.java
deleted file mode 100644
index d60f0c7..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/build/itest/dao/BuildDependenciesDaoTest.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.build.itest.dao;
-
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.storage.db.build.entity.BuildDependency;
-import org.testng.Assert;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.Test;
-
-import java.io.UnsupportedEncodingException;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-/**
- * Date: 10/31/12
- * Time: 11:03 AM
- * <p/>
- * TODO: Test for SQL constraints violations.
- *
- * @author freds
- */
- at Test
-public class BuildDependenciesDaoTest extends BuildsDaoBaseTest {
-    private static final String SHA1_SUFFIX = "dab88fc2a043c2479a6de676a2f8179e9ea2167";
-    private static final String MD5_SUFFIX = "d2a360ecad98a34b59863c1e65bcf71";
-
-    //@Test(dependsOnMethods = "test*")
-    @AfterClass
-    public void fullDelete() throws SQLException {
-        assertEquals(buildArtifactsDao.deleteAllBuildArtifacts(), 0);
-        assertEquals(buildDependenciesDao.deleteAllBuildDependencies(), 3);
-        assertEquals(buildModulesDao.deleteAllBuildModules(), 11);
-        assertEquals(buildsDao.deleteAllBuilds(), 12);
-    }
-
-    public void testCreateSimpleDependency() throws SQLException, UnsupportedEncodingException {
-        createAndInsertModules11();
-        BuildDependency bd = new BuildDependency(1001L, 101L, "group:dep1:1.0", "compile,test", "jar",
-                "1" + SHA1_SUFFIX, "1" + MD5_SUFFIX);
-        Assert.assertEquals(buildDependenciesDao.createBuildDependency(bd), 1);
-        List<BuildDependency> dependencies = buildDependenciesDao.findDependenciesForModule(101L);
-        assertFoundDependency1001(dependencies);
-    }
-
-    private void assertFoundDependency1001(List<BuildDependency> dependencies) {
-        Assert.assertEquals(dependencies.size(), 1);
-        BuildDependency buildDependency = dependencies.get(0);
-        Assert.assertEquals(buildDependency.getDependencyId(), 1001L);
-        Assert.assertEquals(buildDependency.getDependencyNameId(), "group:dep1:1.0");
-        Assert.assertEquals(buildDependency.getDependencyScopes(), "compile,test");
-        Assert.assertEquals(buildDependency.getDependencyType(), "jar");
-        Assert.assertEquals(buildDependency.getSha1(), "1" + SHA1_SUFFIX);
-        Assert.assertEquals(buildDependency.getMd5(), "1" + MD5_SUFFIX);
-    }
-
-    public void testCreateMultipleDependencies() throws SQLException, UnsupportedEncodingException {
-        long build12 = createAndInsertModules12();
-        ArrayList<BuildDependency> bds = new ArrayList<BuildDependency>(4);
-        bds.add(new BuildDependency(2001L, 201L, "apache:log4j:1.0", (String) null, "dll", "a" + SHA1_SUFFIX,
-                "a" + MD5_SUFFIX));
-        bds.add(new BuildDependency(2002L, 201L, "jfrog:bi:2.2.0", (String) null, "zip", "b" + SHA1_SUFFIX,
-                "b" + MD5_SUFFIX));
-        bds.add(new BuildDependency(2021L, 202L, "g:a:v", (String) null, "jar", "b" + SHA1_SUFFIX, "b" + MD5_SUFFIX));
-        bds.add(new BuildDependency(2022L, 202L, "d:b:6", (String) null, "pom", "c" + SHA1_SUFFIX, "c" + MD5_SUFFIX));
-        Assert.assertEquals(buildDependenciesDao.createBuildDependencies(bds), 4);
-        List<BuildDependency> dependencies = buildDependenciesDao.findDependenciesForModules(
-                buildModulesDao.findModuleIdsForBuild(build12));
-        Assert.assertEquals(dependencies.size(), 4);
-        assertBuildDependenciesFromBuild12(dependencies);
-    }
-
-    public void testCreateNullChecksumsDependencies() throws SQLException, UnsupportedEncodingException {
-        long build14 = createAndInsertModules14();
-        ArrayList<BuildDependency> bds = new ArrayList<BuildDependency>(2);
-        bds.add(new BuildDependency(4001L, 401L, "apache:log4j:1.1", (String) null, "dll", null, "e" + MD5_SUFFIX));
-        bds.add(new BuildDependency(4021L, 402L, "jfrog:bi:2.2.1", (String) null, null, "f" + SHA1_SUFFIX, null));
-        bds.add(new BuildDependency(4022L, 402L, "jfrog:bi:2.2.1", (String) null, null, null, null));
-        Assert.assertEquals(buildDependenciesDao.createBuildDependencies(bds), 3);
-        List<BuildDependency> dependencies = buildDependenciesDao.findDependenciesForModules(
-                buildModulesDao.findModuleIdsForBuild(build14));
-        Assert.assertEquals(dependencies.size(), 3);
-    }
-
-    private void assertBuildDependenciesFromBuild12(List<BuildDependency> dependencies) {
-        for (BuildDependency dependency : dependencies) {
-            switch ((int) dependency.getDependencyId()) {
-                case 2001:
-                    assertEquals(dependency.getDependencyNameId(), "apache:log4j:1.0");
-                    assertNull(dependency.getDependencyScopes());
-                    assertEquals(dependency.getDependencyType(), "dll");
-                    assertEquals(dependency.getSha1(), "a" + SHA1_SUFFIX);
-                    assertEquals(dependency.getMd5(), "a" + MD5_SUFFIX);
-                    break;
-                case 2002:
-                    assertEquals(dependency.getDependencyNameId(), "jfrog:bi:2.2.0");
-                    assertNull(dependency.getDependencyScopes());
-                    assertEquals(dependency.getDependencyType(), "zip");
-                    assertEquals(dependency.getSha1(), "b" + SHA1_SUFFIX);
-                    assertEquals(dependency.getMd5(), "b" + MD5_SUFFIX);
-                    break;
-                case 2021:
-                    assertEquals(dependency.getDependencyNameId(), "g:a:v");
-                    assertNull(dependency.getDependencyScopes());
-                    assertEquals(dependency.getDependencyType(), "jar");
-                    assertEquals(dependency.getSha1(), "b" + SHA1_SUFFIX);
-                    assertEquals(dependency.getMd5(), "b" + MD5_SUFFIX);
-                    break;
-                case 2022:
-                    assertEquals(dependency.getDependencyNameId(), "d:b:6");
-                    assertNull(dependency.getDependencyScopes());
-                    assertEquals(dependency.getDependencyType(), "pom");
-                    assertEquals(dependency.getSha1(), "c" + SHA1_SUFFIX);
-                    assertEquals(dependency.getMd5(), "c" + MD5_SUFFIX);
-                    break;
-                default:
-                    fail("Build dependency " + dependency + " should not appear in this list!");
-            }
-        }
-    }
-
-    @Test(dependsOnMethods = {"testCreateSimpleDependency", "testCreateMultipleDependencies"})
-    public void testFindBySha1() throws SQLException {
-        assertFoundDependency1001(
-                buildDependenciesDao.findDependenciesForChecksum(ChecksumType.sha1, "1" + SHA1_SUFFIX));
-        List<BuildDependency> forSha1 = buildDependenciesDao.findDependenciesForChecksum(ChecksumType.sha1,
-                "b" + SHA1_SUFFIX);
-        Assert.assertEquals(forSha1.size(), 2);
-        assertBuildDependenciesFromBuild12(forSha1);
-    }
-
-    @Test(dependsOnMethods = {"testCreateSimpleDependency", "testCreateMultipleDependencies"})
-    public void testFindByMd5() throws SQLException {
-        assertFoundDependency1001(buildDependenciesDao.findDependenciesForChecksum(ChecksumType.md5, "1" + MD5_SUFFIX));
-        List<BuildDependency> forMd5 = buildDependenciesDao.findDependenciesForChecksum(ChecksumType.md5,
-                "b" + MD5_SUFFIX);
-        Assert.assertEquals(forMd5.size(), 2);
-        assertBuildDependenciesFromBuild12(forMd5);
-    }
-
-    @Test(dependsOnMethods = {"testFindBySha1", "testFindByMd5"})
-    public void testDeleteBuildDependencies() throws SQLException {
-        Assert.assertEquals(buildDependenciesDao.deleteBuildDependencies(buildModulesDao.findModuleIdsForBuild(11L)),
-                1);
-        Assert.assertEquals(buildDependenciesDao.deleteBuildDependencies(buildModulesDao.findModuleIdsForBuild(12L)),
-                4);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/build/itest/dao/BuildModulesDaoTest.java b/storage/db/src/test/java/org/artifactory/storage/db/build/itest/dao/BuildModulesDaoTest.java
deleted file mode 100644
index e56bdde..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/build/itest/dao/BuildModulesDaoTest.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.build.itest.dao;
-
-import com.google.common.collect.ImmutableSet;
-import org.artifactory.storage.db.build.entity.BuildModule;
-import org.artifactory.storage.db.build.entity.ModuleProperty;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.UnsupportedEncodingException;
-import java.sql.SQLException;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-/**
- * Date: 10/31/12
- * Time: 11:03 AM
- *
- * @author freds
- */
-public class BuildModulesDaoTest extends BuildsDaoBaseTest {
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/builds.sql");
-        importSql("/sql/build-modules.sql");
-    }
-
-    @AfterClass
-    public void testFullDelete() throws SQLException {
-        assertEquals(buildArtifactsDao.deleteAllBuildArtifacts(), 6);
-        assertEquals(buildDependenciesDao.deleteAllBuildDependencies(), 5);
-        assertEquals(buildModulesDao.deleteAllBuildModules(), 23);
-        assertEquals(buildsDao.deleteAllBuilds(), 23);
-    }
-
-    public void testReadBuildModulesById() throws SQLException {
-        for (long i = 1L; i <= 5L; i++) {
-            assertAnyBuildModuleList(buildModulesDao.findModulesForBuild(i));
-        }
-    }
-
-    public void testSimpleCreateBuildModule() throws SQLException, UnsupportedEncodingException {
-        long buildId = createAndInsertModules11();
-        List<BuildModule> modulesForBuild = buildModulesDao.findModulesForBuild(buildId);
-        assertEquals(modulesForBuild.size(), 1);
-        BuildModule buildModule1 = modulesForBuild.get(0);
-        assertEquals(buildModule1.getModuleId(), 101L);
-        assertEquals(buildModule1.getModuleNameId(), "b11:mod1");
-        assertTrue(buildModule1.getProperties().isEmpty());
-    }
-
-    public void testCreateTwoBuildModulesWithProperties() throws SQLException, UnsupportedEncodingException {
-        long buildId = createAndInsertModules12();
-        List<BuildModule> modulesForBuild = buildModulesDao.findModulesForBuild(buildId);
-        assertEquals(modulesForBuild.size(), 2);
-        for (BuildModule module : modulesForBuild) {
-            switch ((int) module.getModuleId()) {
-                case 201:
-                    assertEquals(module.getModuleId(), 201L);
-                    assertEquals(module.getModuleNameId(), "b12:the-mod1");
-                    assertEquals(module.getProperties().size(), 2);
-                    break;
-                case 202:
-                    assertEquals(module.getModuleId(), 202L);
-                    assertEquals(module.getModuleNameId(), "b12:not-mod2");
-                    assertEquals(module.getProperties().size(), 4);
-                    break;
-                default:
-                    fail("Build module " + module + " unexpected!");
-            }
-        }
-    }
-
-    @Test(dependsOnMethods = {"testSimpleCreateBuildModule", "testCreateTwoBuildModulesWithProperties"})
-    public void testDeleteBuildModules() throws SQLException, UnsupportedEncodingException {
-        doDelete(11L, 1, 1);
-        doDelete(12L, 2, 8);
-    }
-
-    private void doDelete(long buildId, int nbModules, int nbExpectedDeletedRows) throws SQLException {
-        List<BuildModule> modulesForBuild = buildModulesDao.findModulesForBuild(buildId);
-        assertNotNull(modulesForBuild);
-        assertEquals(modulesForBuild.size(), nbModules);
-        assertEquals(buildModulesDao.deleteBuildModules(buildId), nbExpectedDeletedRows);
-        assertTrue(buildModulesDao.findModulesForBuild(buildId).isEmpty());
-    }
-
-    private void assertAnyBuildModuleList(List<BuildModule> b) throws SQLException {
-        assertNotNull(b);
-        assertFalse(b.isEmpty());
-        // to simplify we sort the results by build id since each db will return in different order
-        Collections.sort(b, new Comparator<BuildModule>() {
-            @Override
-            public int compare(BuildModule o1, BuildModule o2) {
-                if (o1.getBuildId() != o2.getBuildId()) {
-                    return Long.compare(o1.getBuildId(), o2.getBuildId());
-                } else {
-                    return Long.compare(o1.getModuleId(), o2.getModuleId());
-                }
-            }
-        });
-        long buildId = b.get(0).getBuildId();
-        switch ((int) buildId) {
-            case 1:
-                assertBuild1(b);
-                break;
-            case 2:
-                assertBuild2(b);
-                break;
-            case 3:
-                assertBuild3(b);
-                break;
-            case 4:
-                assertBuild4(b);
-                break;
-            case 5:
-                assertBuild5(b);
-                break;
-            default:
-                fail("Build with id " + buildId + " is not known!");
-        }
-    }
-
-    private void assertBuild1(List<BuildModule> b1) {
-        assertBuildModuleData(b1, "a", new int[]{3}, new String[]{"bad"});
-    }
-
-    private void assertBuild2(List<BuildModule> b2) {
-        assertBuildModuleData(b2, "b", new int[]{2, 2}, new String[]{"not-too-bad", "quite-good"});
-    }
-
-    private void assertBuild3(List<BuildModule> b3) {
-        assertBuildModuleData(b3, "a", new int[]{0, 0}, new String[0]);
-    }
-
-    private void assertBuild4(List<BuildModule> b4) {
-        assertBuildModuleData(b4, "b", new int[]{0, 0}, new String[0]);
-    }
-
-    private void assertBuild5(List<BuildModule> b5) {
-        assertBuildModuleData(b5, "a", new int[]{2, 2, 2}, new String[]{"good", "good", "good"});
-    }
-
-    private void assertBuildModuleData(List<BuildModule> buildModules, String shortBuildName,
-            int[] nbModulePropsExpected, String[] moduleStatusExpected) {
-        assertEquals(buildModules.size(), nbModulePropsExpected.length);
-        int i = 0;
-        for (BuildModule module : buildModules) {
-            String artName = "mod" + shortBuildName + (i + 1);
-            String moduleName = "b" + shortBuildName + ":" + artName;
-            assertEquals(module.getModuleNameId(), moduleName);
-            ImmutableSet<ModuleProperty> modProps = module.getProperties();
-            assertEquals(modProps.size(), nbModulePropsExpected[i]);
-            if (modProps.size() >= 2) {
-                boolean foundName = false;
-                boolean foundStatus = false;
-                for (ModuleProperty modProp : modProps) {
-                    if ("art-name".equals(modProp.getPropKey())) {
-                        assertFalse(foundName, "Got 2 times the name property " + modProp);
-                        assertEquals(modProp.getPropValue(), artName);
-                        foundName = true;
-                    }
-                    if (modProp.getPropKey().startsWith("status")) {
-                        assertFalse(foundStatus, "Got 2 times the status property " + modProp);
-                        assertEquals(modProp.getPropValue(), moduleStatusExpected[i],
-                                "Property " + modProp + " was not expected value " + moduleStatusExpected[i]);
-                        foundStatus = true;
-                    }
-                }
-                assertTrue(foundName, "Did not find the art-name property");
-                assertTrue(foundStatus, "Did not find the status property");
-            }
-            i++;
-        }
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/build/itest/dao/BuildsDaoBaseTest.java b/storage/db/src/test/java/org/artifactory/storage/db/build/itest/dao/BuildsDaoBaseTest.java
deleted file mode 100644
index b8b31de..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/build/itest/dao/BuildsDaoBaseTest.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.build.itest.dao;
-
-import com.google.common.collect.Lists;
-import org.artifactory.storage.db.build.dao.BuildArtifactsDao;
-import org.artifactory.storage.db.build.dao.BuildDependenciesDao;
-import org.artifactory.storage.db.build.dao.BuildModulesDao;
-import org.artifactory.storage.db.build.dao.BuildsDao;
-import org.artifactory.storage.db.build.entity.BuildEntity;
-import org.artifactory.storage.db.build.entity.BuildModule;
-import org.artifactory.storage.db.build.entity.BuildPromotionStatus;
-import org.artifactory.storage.db.build.entity.BuildProperty;
-import org.artifactory.storage.db.build.entity.ModuleProperty;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.artifactory.storage.db.util.blob.BlobWrapper;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.Assert;
-
-import java.io.UnsupportedEncodingException;
-import java.sql.SQLException;
-import java.util.HashSet;
-import java.util.List;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Date: 11/11/12
- * Time: 3:49 PM
- *
- * @author freds
- */
-public abstract class BuildsDaoBaseTest extends DbBaseTest {
-    @Autowired
-    protected BuildModulesDao buildModulesDao;
-
-    @Autowired
-    protected BuildsDao buildsDao;
-
-    @Autowired
-    protected BuildArtifactsDao buildArtifactsDao;
-
-    @Autowired
-    protected BuildDependenciesDao buildDependenciesDao;
-
-    protected BuildEntity createBuild11() {
-        long now = System.currentTimeMillis();
-        BuildEntity c1 = new BuildEntity(11L, "c1", "1", now - 20000L, null, now, "this-is-me", 0L, null);
-        c1.setProperties(new HashSet<BuildProperty>());
-        c1.setPromotions(new HashSet<BuildPromotionStatus>());
-        return c1;
-    }
-
-    protected BuildEntity createBuild12() {
-        long now = System.currentTimeMillis();
-        BuildEntity c2 = new BuildEntity(12L, "c2", "1", now - 20000L, null, now, "this-is-me", 0L, null);
-        addBuildProps(c2);
-        c2.setPromotions(new HashSet<BuildPromotionStatus>());
-        return c2;
-    }
-
-    private void addBuildProps(BuildEntity b) {
-        long buildId = b.getBuildId();
-        HashSet<BuildProperty> props = new HashSet<BuildProperty>();
-        props.add(new BuildProperty(21L + buildId, buildId, "start", "34"));
-        props.add(new BuildProperty(22L + buildId, buildId, "status", "perfect"));
-        b.setProperties(props);
-    }
-
-    private void addBuildPromotions(BuildEntity b) {
-        long buildId = b.getBuildId();
-        HashSet<BuildPromotionStatus> promos = new HashSet<BuildPromotionStatus>();
-        promos.add(
-                new BuildPromotionStatus(buildId, b.getCreated() + 6000L, "promoter", "promoted", "public", "Promoted",
-                        null));
-        promos.add(new BuildPromotionStatus(buildId, b.getCreated() + 3000L, b.getCreatedBy(), "staged", null, null,
-                null));
-        b.setPromotions(promos);
-    }
-
-    protected BuildEntity createBuild13() {
-        long now = System.currentTimeMillis();
-        BuildEntity c2 = new BuildEntity(13L, "c2", "13", now - 20000L, null, now, "this-is-me", 0L, null);
-        c2.setProperties(new HashSet<BuildProperty>());
-        addBuildPromotions(c2);
-        return c2;
-    }
-
-    protected BuildEntity createBuild14() {
-        long now = System.currentTimeMillis();
-        BuildEntity c2 = new BuildEntity(14L, "c2", "14", now - 20000L, null, now, "this-is-me", 0L, null);
-        addBuildProps(c2);
-        addBuildPromotions(c2);
-        return c2;
-    }
-
-    protected long createAndInsertModules11() throws SQLException, UnsupportedEncodingException {
-        BuildEntity build11 = createBuild11();
-        Assert.assertEquals(createBuild(build11, "1"), 2);
-        long buildId = build11.getBuildId();
-        BuildModule buildModule = new BuildModule(101L, buildId, "b11:mod1");
-        buildModule.setProperties(new HashSet<ModuleProperty>());
-        Assert.assertEquals(buildModulesDao.createBuildModule(buildModule), 1);
-        return buildId;
-    }
-
-    protected long createAndInsertModules12() throws SQLException, UnsupportedEncodingException {
-        BuildEntity build12 = createBuild12();
-        long buildId = build12.getBuildId();
-        assertEquals(createBuild(build12, "2"), 4);
-        BuildModule buildModule1 = new BuildModule(201L, buildId, "b12:the-mod1");
-        HashSet<ModuleProperty> props1 = new HashSet<ModuleProperty>();
-        props1.add(new ModuleProperty(2001L, 201L, "art-name", "the-mod1"));
-        props1.add(new ModuleProperty(2002L, 201L, "key", "value"));
-        buildModule1.setProperties(props1);
-        BuildModule buildModule2 = new BuildModule(202L, buildId, "b12:not-mod2");
-        HashSet<ModuleProperty> props2 = new HashSet<ModuleProperty>();
-        props2.add(new ModuleProperty(2021L, 202L, "art-name", "the-mod2"));
-        props2.add(new ModuleProperty(2022L, 202L, "key1", "v1"));
-        props2.add(new ModuleProperty(2023L, 202L, "key2", "v2"));
-        props2.add(new ModuleProperty(2024L, 202L, "key3", "v3"));
-        buildModule2.setProperties(props2);
-        List<BuildModule> buildModules = Lists.asList(buildModule1, buildModule2, new BuildModule[0]);
-        assertEquals(buildModulesDao.createBuildModules(buildModules), 8);
-        return buildId;
-    }
-
-    protected long createAndInsertModules14() throws SQLException, UnsupportedEncodingException {
-        BuildEntity build14 = createBuild14();
-        long buildId = build14.getBuildId();
-        assertEquals(createBuild(build14, "4"), 6);
-        BuildModule buildModule1 = new BuildModule(401L, buildId, "b14:the-mod1");
-        buildModule1.setProperties(new HashSet<ModuleProperty>());
-        BuildModule buildModule2 = new BuildModule(402L, buildId, "b14:not-mod2");
-        buildModule2.setProperties(new HashSet<ModuleProperty>());
-        List<BuildModule> buildModules = Lists.asList(buildModule1, buildModule2, new BuildModule[0]);
-        assertEquals(buildModulesDao.createBuildModules(buildModules), 2);
-        return buildId;
-    }
-
-    protected int createBuild(BuildEntity build, String buildName) throws SQLException, UnsupportedEncodingException {
-        return buildsDao.createBuild(build, new BlobWrapper("{\"name\":\"" + buildName + "\"}"));
-    }
-
-    public static class DummyBuild {
-        public String name;
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/build/itest/dao/BuildsDaoTest.java b/storage/db/src/test/java/org/artifactory/storage/db/build/itest/dao/BuildsDaoTest.java
deleted file mode 100644
index e1202c4..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/build/itest/dao/BuildsDaoTest.java
+++ /dev/null
@@ -1,393 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.build.itest.dao;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSortedSet;
-import com.google.common.collect.UnmodifiableIterator;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.storage.db.build.entity.BuildEntity;
-import org.artifactory.storage.db.build.entity.BuildPromotionStatus;
-import org.artifactory.storage.db.build.entity.BuildProperty;
-import org.fest.assertions.Assertions;
-import org.jfrog.build.api.release.PromotionStatus;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.UnsupportedEncodingException;
-import java.sql.SQLException;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-/**
- * Date: 10/31/12
- * Time: 11:03 AM
- *
- * @author freds
- */
- at Test
-public class BuildsDaoTest extends BuildsDaoBaseTest {
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/builds.sql");
-    }
-
-    public void testReadBuildsById() throws SQLException {
-        for (long i = 1L; i <= 5L; i++) {
-            assertAnyBuild(buildsDao.getBuild(i));
-        }
-    }
-
-    @Test(dependsOnMethods = "testDeleteBuilds")
-    public void testReadBuildsByName() throws SQLException {
-        List<Long> buildIds = buildsDao.findBuildIds("ba");
-        assertEquals(buildIds.size(), 3);
-        for (Long buildId : buildIds) {
-            assertTrue(buildId == 1L || buildId == 3L || buildId == 5L, "Build id " + buildId + " should not be here!");
-        }
-        buildIds = buildsDao.findBuildIds("bb");
-        assertEquals(buildIds.size(), 2);
-        for (Long buildId : buildIds) {
-            assertTrue(buildId == 2L || buildId == 4L, "Build id " + buildId + " should not be here!");
-        }
-    }
-
-    public void testReadBuildsByFullPath() throws SQLException {
-        assertBuild1(buildsDao.findBuild("ba", "1", 1349000000000L));
-        assertBuild2(buildsDao.findBuild("bb", "1", 1349001000000L));
-        assertBuild3(buildsDao.findBuild("ba", "2", 1349002000000L));
-        assertBuild4(buildsDao.findBuild("bb", "2", 1349003000000L));
-        assertBuild5(buildsDao.findBuild("ba", "3", 1349004000000L));
-    }
-
-    public void testSimpleCreateBuild() throws SQLException, UnsupportedEncodingException {
-        BuildEntity build11 = createBuild11();
-        assertEquals(createBuild(build11, "1"), 2);
-        assertTrue(build11.isIdentical(buildsDao.getBuild(11L)));
-        assertEquals(buildsDao.getJsonBuild(11L, DummyBuild.class).name, "1");
-    }
-
-    public void testCreateBuildWithProps() throws SQLException, UnsupportedEncodingException {
-        BuildEntity c2 = createBuild12();
-        assertEquals(createBuild(c2, "2"), 4);
-        assertTrue(c2.isIdentical(buildsDao.getBuild(12L)));
-        assertEquals(buildsDao.getJsonBuild(12L, DummyBuild.class).name, "2");
-    }
-
-    public void testCreateBuildWithPromotions() throws SQLException, UnsupportedEncodingException {
-        BuildEntity c2 = createBuild13();
-        assertEquals(createBuild(c2, "3"), 4);
-        assertTrue(c2.isIdentical(buildsDao.getBuild(13L)));
-        assertEquals(buildsDao.getJsonBuild(13L, DummyBuild.class).name, "3");
-    }
-
-    public void testCreateBuildWithPropsAndPromotions() throws SQLException, UnsupportedEncodingException {
-        BuildEntity c2 = createBuild14();
-        assertEquals(createBuild(c2, "4"), 6);
-        assertTrue(c2.isIdentical(buildsDao.getBuild(14L)));
-        assertEquals(buildsDao.getJsonBuild(14L, DummyBuild.class).name, "4");
-    }
-
-    public void testCreateBuildSameNameAndNumber() throws SQLException, UnsupportedEncodingException {
-        long now = System.currentTimeMillis();
-        BuildEntity otherBa2 = new BuildEntity(103L, "ba", "2", 1349111111111L, null, now, "me", 0L, null);
-        otherBa2.setProperties(new HashSet<BuildProperty>());
-        otherBa2.setPromotions(new HashSet<BuildPromotionStatus>());
-        assertEquals(createBuild(otherBa2, "otherBa2"), 2);
-        assertTrue(otherBa2.isIdentical(buildsDao.getBuild(103L)));
-        DummyBuild dummyBuild = buildsDao.getJsonBuild(103L, DummyBuild.class);
-        assertNotNull(dummyBuild);
-        assertEquals(dummyBuild.name, "otherBa2");
-    }
-
-    @Test(dependsOnMethods = "testCreateBuildSameNameAndNumber")
-    public void testFindLatestBuildDate() throws SQLException {
-        assertEquals(buildsDao.findLatestBuildDate("ba", "1"), 1349000000000L);
-        assertEquals(buildsDao.findLatestBuildDate("bb", "1"), 1349001000000L);
-        assertEquals(buildsDao.findLatestBuildDate("ba", "2"), 1349111111111L);
-        assertEquals(buildsDao.findLatestBuildDate("bb", "2"), 1349003000000L);
-        assertEquals(buildsDao.findLatestBuildDate("ba", "3"), 1349004000000L);
-    }
-
-    @Test(dependsOnMethods = {"testSimpleCreateBuild",
-            "testCreateBuildWithProps",
-            "testCreateBuildWithPromotions",
-            "testCreateBuildWithPropsAndPromotions",
-            "testFindLatestBuildDate"})
-    public void testDeleteBuilds() throws SQLException, UnsupportedEncodingException {
-        doDelete(11L, 2);
-        doDelete(12L, 4);
-        doDelete(13L, 4);
-        doDelete(14L, 6);
-        doDelete(103L, 2);
-    }
-
-    // Disable since index too big => Need to find another way for this
-    @Test(enabled = false, expectedExceptions = SQLException.class)
-    public void testCreateBuildSameNameNumberDate() throws SQLException, UnsupportedEncodingException {
-        // TORE: [by fsi] use the error handling to verify we broke the correct constraint
-        BuildEntity badBuild = new BuildEntity(1003L, "ba", "2", 1349002000000L, null, 1234L, "me", 0L, null);
-        badBuild.setProperties(new HashSet<BuildProperty>());
-        badBuild.setPromotions(new HashSet<BuildPromotionStatus>());
-        createBuild(badBuild, "otherBadBa2");
-    }
-
-    @Test(expectedExceptions = SQLException.class)
-    public void testCreateBuildSameId() throws SQLException, UnsupportedEncodingException {
-        // TORE: [by fsi] use the error handling to verify we broke the correct constraint
-        BuildEntity badBuild = new BuildEntity(1L, "bad", "1", 2L, null, 1234L, "me", 0L, null);
-        badBuild.setProperties(new HashSet<BuildProperty>());
-        badBuild.setPromotions(new HashSet<BuildPromotionStatus>());
-        createBuild(badBuild, "1");
-    }
-
-    public void testFindBuildsForArtifactSHA1Checksum() throws SQLException {
-        Collection<BuildEntity> builds = buildsDao.findBuildsForArtifactChecksum(ChecksumType.sha1,
-                "acab88fc2a043c2479a6de676a2f8179e9ea2167");
-
-        assertEquals(builds.size(), 3);
-        Assertions.assertThat(builds).doesNotHaveDuplicates();
-        for (BuildEntity build : builds) {
-            assertTrue(build.getBuildId() == 1 || build.getBuildId() == 2 || build.getBuildId() == 3,
-                    "Build id should be 1 or 2 or 3");
-        }
-    }
-
-    public void testFindBuildsForArtifactMD5Checksum() throws SQLException {
-        Collection<BuildEntity> builds = buildsDao.findBuildsForArtifactChecksum(ChecksumType.md5,
-                "b02a360ecad98a34b59863c1e65bcf71");
-
-        assertEquals(builds.size(), 2);
-        Assertions.assertThat(builds).doesNotHaveDuplicates();
-        for (BuildEntity build : builds) {
-            assertTrue(build.getBuildId() == 1 || build.getBuildId() == 3, "Build id should be 1 or 3");
-        }
-    }
-
-    public void testFindBuildsForDependencySHA1Checksum() throws SQLException {
-        Collection<BuildEntity> builds = buildsDao.findBuildsForDependencyChecksum(ChecksumType.sha1,
-                "ccab88fc2a043c2479a6de676a2f8179e9ea2167");
-
-        assertEquals(builds.size(), 2);
-        Assertions.assertThat(builds).doesNotHaveDuplicates();
-        for (BuildEntity build : builds) {
-            assertTrue(build.getBuildId() == 1 || build.getBuildId() == 2,
-                    "Build id should be 1 or 2");
-        }
-    }
-
-    public void testFindBuildsForDependencyMD5Checksum() throws SQLException {
-        Collection<BuildEntity> builds = buildsDao.findBuildsForDependencyChecksum(ChecksumType.md5,
-                "d02a360ecad98a34b59863c1e65bcf71");
-
-        assertEquals(builds.size(), 2);
-        Assertions.assertThat(builds).doesNotHaveDuplicates();
-        for (BuildEntity build : builds) {
-            assertTrue(build.getBuildId() == 2 || build.getBuildId() == 3, "Build id should be 2 or 3");
-        }
-    }
-
-    private void doDelete(long buildId, int nbDeletedRows) throws SQLException {
-        assertNotNull(buildsDao.getBuild(buildId));
-        assertNotNull(buildsDao.getJsonBuild(buildId, DummyBuild.class));
-        assertEquals(buildsDao.deleteBuild(buildId), nbDeletedRows);
-        assertNull(buildsDao.getBuild(buildId));
-        assertNull(buildsDao.getJsonBuild(buildId, DummyBuild.class));
-    }
-
-    private void assertAnyBuild(BuildEntity b) throws SQLException {
-        assertNotNull(b);
-        switch ((int) b.getBuildId()) {
-            case 1:
-                assertBuild1(b);
-                break;
-            case 2:
-                assertBuild2(b);
-                break;
-            case 3:
-                assertBuild3(b);
-                break;
-            case 4:
-                assertBuild4(b);
-                break;
-            case 5:
-                assertBuild5(b);
-                break;
-            default:
-                fail("Build with id " + b.getBuildId() + " is not known!");
-        }
-        assertNull(buildsDao.getJsonBuild(b.getBuildId(), DummyBuild.class));
-    }
-
-    private void assertBuild1(BuildEntity b1) {
-        assertEquals(b1.getBuildId(), 1L);
-        assertEquals(b1.getBuildName(), "ba");
-        assertEquals(b1.getBuildNumber(), "1");
-        assertEquals(b1.getBuildDate(), 1349000000000L);
-        assertNull(b1.getCiUrl());
-        assertEquals(b1.getCreated(), 1350000000000L);
-        assertEquals(b1.getCreatedBy(), "me");
-        assertEquals(b1.getModified(), 1350000000001L);
-        assertEquals(b1.getModifiedBy(), "not-me");
-        ImmutableSet<BuildProperty> props = b1.getProperties();
-        assertEquals(props.size(), 2);
-        BuildProperty bp1 = new BuildProperty(1L, 1L, "start", "0");
-        BuildProperty bp2 = new BuildProperty(2L, 1L, "status", "bad");
-        assertTrue(props.contains(bp1));
-        assertTrue(props.contains(bp2));
-        for (BuildProperty prop : props) {
-            if (prop.getPropId() == 1L) {
-                assertTrue(prop.isIdentical(bp1));
-            }
-            if (prop.getPropId() == 2L) {
-                assertTrue(prop.isIdentical(bp2));
-            }
-        }
-        assertTrue(b1.getPromotions().isEmpty());
-    }
-
-    private void assertBuild2(BuildEntity b2) {
-        assertEquals(b2.getBuildId(), 2L);
-        assertEquals(b2.getBuildName(), "bb");
-        assertEquals(b2.getBuildNumber(), "1");
-        assertEquals(b2.getBuildDate(), 1349001000000L);
-        assertEquals(b2.getCiUrl(), "http://myserver/jenkins/bb/1");
-        assertEquals(b2.getCreated(), 1350001000000L);
-        assertEquals(b2.getCreatedBy(), "me");
-        assertEquals(b2.getModified(), 0L);
-        assertNull(b2.getModifiedBy());
-        ImmutableSet<BuildProperty> props = b2.getProperties();
-        assertEquals(props.size(), 2);
-        BuildProperty bp1 = new BuildProperty(3L, 2L, "start", "1");
-        BuildProperty bp2 = new BuildProperty(4L, 2L, "status", "not-too-bad");
-        assertTrue(props.contains(bp1));
-        assertTrue(props.contains(bp2));
-        for (BuildProperty prop : props) {
-            if (prop.getPropId() == 1L) {
-                assertTrue(prop.isIdentical(bp1));
-            }
-            if (prop.getPropId() == 2L) {
-                assertTrue(prop.isIdentical(bp2));
-            }
-        }
-        assertTrue(b2.getPromotions().isEmpty());
-    }
-
-    private void assertBuild3(BuildEntity b3) {
-        assertEquals(b3.getBuildId(), 3L);
-        assertEquals(b3.getBuildName(), "ba");
-        assertEquals(b3.getBuildNumber(), "2");
-        assertEquals(b3.getBuildDate(), 1349002000000L);
-        assertNull(b3.getCiUrl());
-        assertEquals(b3.getCreated(), 1350002000000L);
-        assertEquals(b3.getCreatedBy(), "me");
-        assertEquals(b3.getModified(), 0L);
-        assertNull(b3.getModifiedBy());
-        assertTrue(b3.getProperties().isEmpty());
-        assertEquals(b3.getPromotions().size(), 1);
-        BuildPromotionStatus promotionStatus = new BuildPromotionStatus(
-                3L, 1350012000000L,
-                "me", "dead", null, "bad stuff", null);
-        BuildPromotionStatus found = b3.getPromotions().first();
-        assertTrue(found.isIdentical(promotionStatus));
-    }
-
-    private void assertBuild4(BuildEntity b4) {
-        assertEquals(b4.getBuildId(), 4L);
-        assertEquals(b4.getBuildName(), "bb");
-        assertEquals(b4.getBuildNumber(), "2");
-        assertEquals(b4.getBuildDate(), 1349003000000L);
-        assertEquals(b4.getCiUrl(), "http://myserver/jenkins/bb/2");
-        assertEquals(b4.getCreated(), 1350003000000L);
-        assertEquals(b4.getCreatedBy(), "me");
-        assertEquals(b4.getModified(), 0L);
-        assertNull(b4.getModifiedBy());
-        assertTrue(b4.getProperties().isEmpty());
-        ImmutableSortedSet<BuildPromotionStatus> promotions = b4.getPromotions();
-        assertEquals(promotions.size(), 3);
-        ImmutableSortedSet<BuildPromotionStatus> expectedStatus = ImmutableSortedSet.of(
-                new BuildPromotionStatus(
-                        4L, 1350003000000L,
-                        null, "staging", null, null, null),
-                new BuildPromotionStatus(
-                        4L, 1350013000000L,
-                        "promoter", "promoted", "qa-local", "sending to QA", "me"),
-                new BuildPromotionStatus(
-                        4L, 1350023000000L,
-                        "tester", "rollback", "lost-local", "Refused by QA", null)
-        );
-        assertEquals(promotions, expectedStatus);
-        UnmodifiableIterator<BuildPromotionStatus> it1 = expectedStatus.iterator();
-        UnmodifiableIterator<BuildPromotionStatus> promosIt = promotions.iterator();
-        for (int i = 0; i < 3; i++) {
-            assertTrue(promosIt.next().isIdentical(it1.next()));
-        }
-    }
-
-    private void assertBuild5(BuildEntity b5) {
-        assertEquals(b5.getBuildId(), 5L);
-        assertEquals(b5.getBuildName(), "ba");
-        assertEquals(b5.getBuildNumber(), "3");
-        assertEquals(b5.getBuildDate(), 1349004000000L);
-        assertNull(b5.getCiUrl());
-        assertEquals(b5.getCreated(), 1350004000000L);
-        assertEquals(b5.getCreatedBy(), "me");
-        assertEquals(b5.getModified(), 0L);
-        assertNull(b5.getModifiedBy());
-        ImmutableSet<BuildProperty> props = b5.getProperties();
-        assertEquals(props.size(), 2);
-        BuildProperty bp1 = new BuildProperty(5L, 5L, "start", "4");
-        BuildProperty bp2 = new BuildProperty(6L, 5L, "status", "good");
-        assertTrue(props.contains(bp1));
-        assertTrue(props.contains(bp2));
-        for (BuildProperty prop : props) {
-            if (prop.getPropId() == 1L) {
-                assertTrue(prop.isIdentical(bp1));
-            }
-            if (prop.getPropId() == 2L) {
-                assertTrue(prop.isIdentical(bp2));
-            }
-        }
-        ImmutableSortedSet<BuildPromotionStatus> promotions = b5.getPromotions();
-        assertEquals(promotions.size(), 2);
-        BuildPromotionStatus first = new BuildPromotionStatus(
-                5L, 1350024000000L,
-                null, "staging", null, null, "jenkins");
-        BuildPromotionStatus second = new BuildPromotionStatus(
-                5L, 1350034000000L,
-                "promoter", PromotionStatus.RELEASED, "public", "Full release", "rel");
-        assertTrue(promotions.first().isIdentical(first));
-        assertTrue(promotions.last().isIdentical(second));
-    }
-
-    //@Test(dependsOnMethods = { ".*test.*" })
-    @AfterClass
-    public void fullDelete() throws SQLException {
-        assertEquals(buildArtifactsDao.deleteAllBuildArtifacts(), 6);
-        assertEquals(buildDependenciesDao.deleteAllBuildDependencies(), 5);
-        assertEquals(buildModulesDao.deleteAllBuildModules(), 4);
-        assertEquals(buildsDao.deleteAllBuilds(), 17);
-    }
-
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/build/itest/service/BuildStoreServiceImplTest.java b/storage/db/src/test/java/org/artifactory/storage/db/build/itest/service/BuildStoreServiceImplTest.java
deleted file mode 100644
index c0ea5cc..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/build/itest/service/BuildStoreServiceImplTest.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.build.itest.service;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import org.artifactory.build.BuildRun;
-import org.artifactory.storage.build.service.BuildStoreService;
-import org.artifactory.storage.db.build.service.BuildStoreServiceImpl;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.jfrog.build.api.Agent;
-import org.jfrog.build.api.Artifact;
-import org.jfrog.build.api.Build;
-import org.jfrog.build.api.BuildAgent;
-import org.jfrog.build.api.Dependency;
-import org.jfrog.build.api.Module;
-import org.jfrog.build.api.builder.ArtifactBuilder;
-import org.jfrog.build.api.builder.BuildInfoBuilder;
-import org.jfrog.build.api.builder.DependencyBuilder;
-import org.jfrog.build.api.builder.ModuleBuilder;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.util.List;
-import java.util.Properties;
-
-import static org.jfrog.build.api.BuildType.GRADLE;
-import static org.testng.Assert.*;
-
-/**
- * Date: 11/23/12
- * Time: 5:24 PM
- *
- * @author freds
- */
- at Test
-public class BuildStoreServiceImplTest extends DbBaseTest {
-    @Autowired
-    private BuildStoreService buildStoreService;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/builds.sql");
-        importSql("/sql/build-modules.sql");
-    }
-
-    @AfterClass
-    public void fullDelete() {
-        buildStoreService.deleteAllBuilds();
-    }
-
-    public void testAddBuild() {
-        buildStoreService.addBuild(getBuildObject("test", "23",
-                BuildStoreServiceImpl.formatDateToString(System.currentTimeMillis())));
-    }
-
-    public void testSearchByChecksum() {
-        // TODO:
-    }
-
-    @Test(dependsOnMethods = "testSearchByChecksum")
-    public void testFindBuild() {
-        BuildRun buildRun = buildStoreService.getBuildRun("bb", "2",
-                BuildStoreServiceImpl.formatDateToString(1349003000000L));
-        assertNotNull(buildRun);
-        assertEquals(buildRun.getReleaseStatus(), "rollback");
-    }
-
-    @Test(dependsOnMethods = {"testAddBuild", "testFindBuild"})
-    public void testGetAllBuildNames() {
-        List<String> allBuildNames = buildStoreService.getAllBuildNames();
-        assertEquals(allBuildNames.size(), 3);
-    }
-
-    @Test(dependsOnMethods = "testGetAllBuildNames")
-    public void testDeleteBuildB() {
-        buildStoreService.deleteAllBuilds("bb");
-        assertTrue(buildStoreService.findBuildsByName("bb").isEmpty());
-    }
-
-    @Test(dependsOnMethods = "testGetAllBuildNames")
-    public void testDeleteOneBuildA() {
-        buildStoreService.deleteBuild("ba", "2", BuildStoreServiceImpl.formatDateToString(1349002000000L));
-        assertEquals(buildStoreService.findBuildsByName("ba").size(), 2);
-    }
-
-    /**
-     * Returns a generic build object
-     *
-     * @param buildName
-     * @param buildNumber
-     * @param startedBuild
-     * @return Build object
-     */
-    private Build getBuildObject(String buildName, String buildNumber, String startedBuild) {
-        Dependency dependency = new DependencyBuilder().id("moo").type("bob").scopes(Sets.newHashSet("mitzi")).sha1(
-                "pop").md5("shmop").requiredBy(Lists.newArrayList("pitzi")).build();
-
-        Artifact artifact = new ArtifactBuilder("blob").type("glob").sha1("shlob").md5("mob").
-                properties(new Properties()).build();
-
-        Module module = new ModuleBuilder().id("moo").artifacts(Lists.newArrayList(artifact)).
-                dependencies(Lists.newArrayList(dependency)).build();
-
-        Properties properties = new Properties();
-        properties.put("goo", "koo");
-
-        return new BuildInfoBuilder(buildName).version("1.7.0").number(buildNumber).type(GRADLE).
-                agent(new Agent("pop", "1.6")).started(startedBuild).durationMillis(6L).
-                principal("bob").artifactoryPrincipal("too").url("mitz").modules(Lists.newArrayList(module)).
-                properties(properties).buildAgent(new BuildAgent("agentName", "agentVersion"))
-                .agent(new Agent("agentName", "agentVersion")).build();
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/build/service/BuildRunComparatorsTest.java b/storage/db/src/test/java/org/artifactory/storage/db/build/service/BuildRunComparatorsTest.java
deleted file mode 100644
index 7507727..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/build/service/BuildRunComparatorsTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.artifactory.storage.db.build.service;
-
-import com.google.common.collect.Lists;
-import junit.framework.Assert;
-import org.artifactory.api.build.BuildRunComparators;
-import org.artifactory.build.BuildRun;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Comparator;
-import java.util.Date;
-
-/**
- * Tests the behavior of {@link org.artifactory.api.build.BuildRunComparators} class factory
- */
- at Test
-public class BuildRunComparatorsTest {
-
-    public void testDateComparator() throws Exception {
-        Calendar instance1 = Calendar.getInstance();
-        instance1.set(2014, Calendar.JANUARY, 1);
-        Calendar instance2 = Calendar.getInstance();
-        instance2.set(2014, Calendar.FEBRUARY, 1);
-
-        BuildRun b1 = new BuildRunImpl("Alice", "1", instance1.getTime());
-        BuildRun b2 = new BuildRunImpl("Bob", "2", instance2.getTime());
-
-        Comparator<BuildRun> dateComparator = BuildRunComparators.getBuildStartDateComparator();
-        Assert.assertEquals(dateComparator.compare(b1, b2), -1);
-        Assert.assertEquals(dateComparator.compare(b2, b1), 1);
-        Assert.assertEquals(dateComparator.compare(b1, b1), 0);
-    }
-
-    public void testNumberComparator() throws Exception {
-        BuildRun b1 = new BuildRunImpl("Alice", "1", new Date());
-        BuildRun b2 = new BuildRunImpl("Bob", "2", new Date());
-        ArrayList<BuildRun> buildRuns = Lists.newArrayList(b1, b2);
-
-        //Also implicit check of the comparator factory, in this case should be Number compare.
-        Comparator<BuildRun> numberComparator = BuildRunComparators.getComparatorFor(buildRuns);
-        Assert.assertEquals(numberComparator.compare(b1, b2), -1);
-        Assert.assertEquals(numberComparator.compare(b2, b1), 1);
-        Assert.assertEquals(numberComparator.compare(b1, b1), 0);
-    }
-
-    public void testStringComparator() throws Exception {
-        BuildRun b1 = new BuildRunImpl("Alice", "11a", new Date());
-        BuildRun b2 = new BuildRunImpl("Bob", "11b", new Date());
-        ArrayList<BuildRun> buildRuns = Lists.newArrayList(b1, b2);
-
-        //Also implicit check of the comparator factory, in this case should be String compare.
-        Comparator<BuildRun> numberComparator = BuildRunComparators.getComparatorFor(buildRuns);
-        Assert.assertEquals(numberComparator.compare(b1, b2), -1);
-        Assert.assertEquals(numberComparator.compare(b2, b1), 1);
-        Assert.assertEquals(numberComparator.compare(b1, b1), 0);
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/ds/ArtifactoryTomcatDataSourceTest.java b/storage/db/src/test/java/org/artifactory/storage/db/ds/ArtifactoryTomcatDataSourceTest.java
deleted file mode 100644
index 1985749..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/ds/ArtifactoryTomcatDataSourceTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.ds;
-
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.artifactory.storage.db.spring.ArtifactoryTomcatDataSource;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.Test;
-
-import javax.sql.DataSource;
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the connection pooling done with {@link org.artifactory.storage.db.spring.ArtifactoryTomcatDataSource}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class ArtifactoryTomcatDataSourceTest extends DbBaseTest {
-
-    @Autowired
-    private DataSource dataSource;
-
-    public void instanceType() {
-        boolean ofExpectedType = dataSource instanceof ArtifactoryTomcatDataSource;
-        assertTrue(ofExpectedType, "Unexpected datasource type: " + dataSource.getClass());
-    }
-
-    public void verifyDefaultParams() {
-        ArtifactoryTomcatDataSource ds = (ArtifactoryTomcatDataSource) dataSource;
-        assertEquals(ds.getDefaultTransactionIsolation(), Connection.TRANSACTION_READ_COMMITTED);
-    }
-
-    public void verifyValidationQuery() throws SQLException {
-        ArtifactoryTomcatDataSource ds = (ArtifactoryTomcatDataSource) dataSource;
-        String validationQuery = ds.getValidationQuery();
-        assertNotNull(validationQuery, "Validation query shouldn't be null");
-
-        try (Connection con = dataSource.getConnection();
-             Statement stmt = con.createStatement();
-             ResultSet rs = stmt.executeQuery(validationQuery)) {
-            if (!rs.next()) {
-                fail("No result returned from the validation query");
-            }
-        }
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/fs/entity/NodeBuilderTest.java b/storage/db/src/test/java/org/artifactory/storage/db/fs/entity/NodeBuilderTest.java
deleted file mode 100644
index ab6477e..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/fs/entity/NodeBuilderTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.entity;
-
-import org.testng.annotations.Test;
-
-import java.util.Date;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests {@link org.artifactory.storage.db.fs.entity.NodeBuilder}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class NodeBuilderTest {
-
-    public void buildDirectory() throws Exception {
-        Date created = new Date(System.currentTimeMillis() - 30000);
-        Date modified = new Date(System.currentTimeMillis() - 20000);
-        Date updated = new Date(System.currentTimeMillis() - 10000);
-        NodeBuilder b = new NodeBuilder().nodeId(2).file(false).repo("repo").path("path/to/there").name("name")
-                .created(created).createdBy("yossis").modified(modified).modifiedBy("modifier").updated(
-                        updated);
-
-        Node n = b.build();
-
-        assertEquals(n.getNodeId(), 2);
-        assertFalse(n.isFile());
-        assertEquals(n.getRepo(), "repo");
-        assertEquals(n.getPath(), "path/to/there");
-        assertEquals(n.getName(), "name");
-        assertEquals(n.getDepth(), 4);
-        assertEquals(n.getCreated(), created.getTime());
-        assertEquals(n.getCreatedBy(), "yossis");
-        assertEquals(n.getModified(), modified.getTime());
-        assertEquals(n.getModifiedBy(), "modifier");
-        assertEquals(n.getUpdated(), updated.getTime());
-        assertNull(n.getSha1Actual());
-        assertNull(n.getSha1Original());
-        assertNull(n.getMd5Actual());
-        assertNull(n.getMd5Original());
-    }
-
-    public void buildFile() throws Exception {
-        Date created = new Date(System.currentTimeMillis() - 30000);
-        Date modified = new Date(System.currentTimeMillis() - 20000);
-        Date updated = new Date(System.currentTimeMillis() - 10000);
-        NodeBuilder b = new NodeBuilder();
-        b.nodeId(999).file(false).repo("repo").path("path/file").name("filename").created(created)
-                .createdBy("yossis").modified(modified).modifiedBy("modifier").updated(updated).length(333)
-                .sha1Actual("aaa").sha1Original("bbb").md5Actual("ccc").md5Original("ddd");
-
-        Node n = b.build();
-
-        assertEquals(n.getNodeId(), 999);
-        assertFalse(n.isFile());
-        assertEquals(n.getRepo(), "repo");
-        assertEquals(n.getPath(), "path/file");
-        assertEquals(n.getName(), "filename");
-        assertEquals(n.getDepth(), 3);
-        assertEquals(n.getCreated(), created.getTime());
-        assertEquals(n.getCreatedBy(), "yossis");
-        assertEquals(n.getModified(), modified.getTime());
-        assertEquals(n.getModifiedBy(), "modifier");
-        assertEquals(n.getUpdated(), updated.getTime());
-        assertEquals(n.getLength(), 333);
-        assertEquals(n.getSha1Actual(), "aaa");
-        assertEquals(n.getSha1Original(), "bbb");
-        assertEquals(n.getMd5Actual(), "ccc");
-        assertEquals(n.getMd5Original(), "ddd");
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/fs/entity/NodePathTest.java b/storage/db/src/test/java/org/artifactory/storage/db/fs/entity/NodePathTest.java
deleted file mode 100644
index 26df99f..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/fs/entity/NodePathTest.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.entity;
-
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.repo.RepoPath;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Tests {@link org.artifactory.storage.db.fs.entity.NodePath}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class NodePathTest {
-
-    public void simpleConstructor() {
-        NodePath nodePath = new NodePath("repo", "path/to", "name", true);
-        assertEquals(nodePath.getRepo(), "repo");
-        assertEquals(nodePath.getPath(), "path/to");
-        assertEquals(nodePath.getName(), "name");
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void constructorNoRepo() {
-        new NodePath("", "path/to", "name", true);
-    }
-
-    public void constructorNoPath() {
-        NodePath path = new NodePath("repo", null, "name", true);
-        assertEquals(path.getRepo(), "repo");
-        assertEquals(path.getPath(), "");
-        assertEquals(path.getName(), "name");
-        assertEquals(path.getDepth(), 1);
-    }
-
-    public void constructorRootPath() {
-        NodePath path = new NodePath("repo", null, "", true);
-        assertEquals(path.getRepo(), "repo");
-        assertEquals(path.getPath(), "");
-        assertEquals(path.getName(), "");
-        assertEquals(path.getDepth(), 0);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void constructorPathWithNoName() {
-        new NodePath("repo", "path", "", true);
-    }
-
-    public void toRepoPath() {
-        NodePath nodePath = new NodePath("repo", "path/to", "name", true);
-        RepoPath repoPath = nodePath.toRepoPath();
-        assertEquals(repoPath.getRepoKey(), "repo");
-        assertEquals(repoPath.getPath(), "path/to/name");
-    }
-
-    public void toRepoPathDepth1() {
-        NodePath nodePath = new NodePath("repo", "", "name", true);
-        RepoPath repoPath = nodePath.toRepoPath();
-        assertEquals(repoPath.getRepoKey(), "repo");
-        assertEquals(repoPath.getPath(), "name");
-    }
-
-    public void buildFromRepoPath() {
-        NodePath nodePath = NodePath.fromRepoPath(new RepoPathImpl("repo", "/path/to/name"));
-        assertEquals(nodePath.getRepo(), "repo");
-        assertEquals(nodePath.getPath(), "path/to");
-        assertEquals(nodePath.getName(), "name");
-    }
-
-    public void buildFromRootRepoPath() {
-        NodePath path = NodePath.fromRepoPath(new RepoPathImpl("repo", ""));
-        assertEquals(path.getRepo(), "repo");
-        assertEquals(path.getPath(), "");
-        assertEquals(path.getName(), "");
-        assertEquals(path.getDepth(), 0);
-    }
-
-    public void buildFromRepoPathDepth1() {
-        NodePath nodePath = NodePath.fromRepoPath(new RepoPathImpl("repo", "toto"));
-        assertEquals(nodePath.getRepo(), "repo");
-        assertEquals(nodePath.getPath(), "");
-        assertEquals(nodePath.getName(), "toto");
-    }
-
-    public void pathNameOfRoot() {
-        assertEquals(new NodePath("repo", "", "", true).getPathName(), "");
-    }
-
-    public void pathNameRootChild() {
-        assertEquals(new NodePath("repo", "", "name", true).getPathName(), "name");
-    }
-
-    public void pathName() {
-        assertEquals(new NodePath("repo", "path", "name", true).getPathName(), "path/name");
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/fs/entity/NodeTest.java b/storage/db/src/test/java/org/artifactory/storage/db/fs/entity/NodeTest.java
deleted file mode 100644
index 518e47e..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/fs/entity/NodeTest.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.entity;
-
-import org.testng.annotations.Test;
-
-import java.util.Date;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests {@link org.artifactory.storage.db.fs.entity.Node}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class NodeTest {
-
-    public void directoryConstructor() {
-        Date created = new Date(System.currentTimeMillis() - 30000);
-        Date modified = new Date(System.currentTimeMillis() - 20000);
-        Date updated = new Date(System.currentTimeMillis() - 10000);
-        Node n = new Node(2, false, "repo", "path/to/there", "name", (short) 3, created.getTime(), "yossis",
-                modified.getTime(), "modifier", updated.getTime(), 0, null, null, null, null);
-
-        assertEquals(n.getNodeId(), 2);
-        assertFalse(n.isFile());
-        assertEquals(n.getRepo(), "repo");
-        assertEquals(n.getPath(), "path/to/there");
-        assertEquals(n.getName(), "name");
-        assertEquals(n.getDepth(), 3);
-        assertEquals(n.getCreated(), created.getTime());
-        assertEquals(n.getCreatedBy(), "yossis");
-        assertEquals(n.getModified(), modified.getTime());
-        assertEquals(n.getModifiedBy(), "modifier");
-        assertEquals(n.getUpdated(), updated.getTime());
-        assertEquals(n.getLength(), 0);
-        assertNull(n.getSha1Actual());
-        assertNull(n.getSha1Original());
-        assertNull(n.getMd5Actual());
-        assertNull(n.getMd5Original());
-    }
-
-    public void fileConstructor() {
-        Date created = new Date(System.currentTimeMillis() - 30000);
-        Date modified = new Date(System.currentTimeMillis() - 20000);
-        Date updated = new Date(System.currentTimeMillis() - 10000);
-        Node n = new Node(3, true, "repo2", "path/to", "file", (short) 2, created.getTime(), "yossis",
-                modified.getTime(), "modifier", updated.getTime(),
-                22, "shasha", "ahsahs", "md5md5", "5dm5dm");
-
-        assertEquals(n.getNodeId(), 3);
-        assertTrue(n.isFile());
-        assertEquals(n.getRepo(), "repo2");
-        assertEquals(n.getPath(), "path/to");
-        assertEquals(n.getName(), "file");
-        assertEquals(n.getDepth(), 2);
-        assertEquals(n.getCreated(), created.getTime());
-        assertEquals(n.getCreatedBy(), "yossis");
-        assertEquals(n.getModified(), modified.getTime());
-        assertEquals(n.getModifiedBy(), "modifier");
-        assertEquals(n.getUpdated(), updated.getTime());
-        assertEquals(n.getLength(), 22);
-        assertEquals(n.getSha1Actual(), "shasha");
-        assertEquals(n.getSha1Original(), "ahsahs");
-        assertEquals(n.getMd5Actual(), "md5md5");
-        assertEquals(n.getMd5Original(), "5dm5dm");
-    }
-
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/fs/entity/RepoStorageSummaryTest.java b/storage/db/src/test/java/org/artifactory/storage/db/fs/entity/RepoStorageSummaryTest.java
deleted file mode 100644
index 2a6fa01..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/fs/entity/RepoStorageSummaryTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.entity;
-
-import org.artifactory.storage.fs.repo.RepoStorageSummary;
-import org.testng.annotations.Test;
-
-import static org.fest.assertions.Assertions.assertThat;
-
-/**
- * Tests the {@link org.artifactory.storage.fs.repo.RepoStorageSummary} entity.
- *
- * @author Yossi Shaul
- */
- at Test
-public class RepoStorageSummaryTest {
-
-    public void simpleConstructor() {
-        RepoStorageSummary r = new RepoStorageSummary("key", 6, 1, 456);
-        assertThat(r.getRepoKey()).isEqualTo("key");
-        assertThat(r.getFoldersCount()).isEqualTo(6);
-        assertThat(r.getFilesCount()).isEqualTo(1);
-        assertThat(r.getUsedSpace()).isEqualTo(456);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/ItemTreeTest.java b/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/ItemTreeTest.java
deleted file mode 100644
index da5ed6b..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/ItemTreeTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.itest;
-
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.artifactory.storage.fs.service.FileService;
-import org.artifactory.storage.fs.tree.ItemNode;
-import org.artifactory.storage.fs.tree.ItemNodeFilter;
-import org.artifactory.storage.fs.tree.ItemTree;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.BeforeClass;
-
-import javax.annotation.Nonnull;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the {@link org.artifactory.storage.fs.tree.ItemTree}.
- *
- * @author Yossi Shaul
- */
-public class ItemTreeTest extends DbBaseTest {
-
-    @Autowired
-    FileService fileService;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/nodes-for-service.sql");
-    }
-
-    public void rootItemTree() {
-        RepoPathImpl repo1 = new RepoPathImpl("repo1", "");
-        ItemTree itemTree = new ItemTree(repo1);
-        ItemNode rootNode = itemTree.getRootNode();
-        assertNotNull(rootNode);
-        assertEquals(rootNode.getRepoPath(), repo1);
-        assertTrue(rootNode.hasChildren());
-        assertEquals(rootNode.getChildren().size(), 2);
-    }
-
-    public void preBuildTree() {
-        RepoPathImpl repo1 = new RepoPathImpl("repo1", "");
-        ItemTree itemTree = new ItemTree(repo1);
-        ItemNode rootNode = itemTree.buildTree();
-        assertNotNull(rootNode);
-        assertEquals(rootNode.getRepoPath(), repo1);
-    }
-
-    public void treeWithFilter() {
-        RepoPathImpl repo1 = new RepoPathImpl("repo1", "");
-        ItemTree itemTree = new ItemTree(repo1, new ItemNodeFilter() {
-            @Override
-            public boolean accepts(@Nonnull ItemInfo itemInfo) {
-                return false;   // filter everything
-            }
-        });
-        ItemNode rootNode = itemTree.buildTree();
-        assertNotNull(rootNode);    // filter doesn't affect root node
-        assertEquals(rootNode.getRepoPath(), repo1);
-        assertTrue(rootNode.getChildren().isEmpty());
-    }
-
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/ArchiveEntriesDaoTest.java b/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/ArchiveEntriesDaoTest.java
deleted file mode 100644
index 54be18c..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/ArchiveEntriesDaoTest.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.itest.dao;
-
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.db.fs.dao.ArchiveEntriesDao;
-import org.artifactory.storage.db.fs.entity.ArchiveEntry;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.BeforeClass;
-
-import java.sql.SQLException;
-import java.util.Set;
-
-import static org.fest.assertions.Assertions.assertThat;
-import static org.testng.Assert.*;
-
-/**
- * Tests the {@link org.artifactory.storage.db.fs.dao.ArchiveEntriesDao}.
- *
- * @author Yossi Shaul
- */
-public class ArchiveEntriesDaoTest extends DbBaseTest {
-
-    @Autowired
-    private ArchiveEntriesDao archiveEntriesDao;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/nodes.sql");
-    }
-
-    public void loadByChecksum() throws SQLException {
-        String sha1 = "dcab88fc2a043c2479a6de676a2f8179e9ea2167";
-        Set<ArchiveEntry> entries = archiveEntriesDao.loadByChecksum(sha1);
-        assertNotNull(entries);
-        assertEquals(entries.size(), 5);
-        for (ArchiveEntry entry : entries) {
-            assertEquals(entry.getArchiveSha1(), sha1);
-        }
-
-        assertTrue(entries.contains(new ArchiveEntry(sha1, "org/apache/tools/mail", "MailMessage.class")));
-    }
-
-    public void isIndexed() throws SQLException {
-        assertTrue(archiveEntriesDao.isIndexed("dcab88fc2a043c2479a6de676a2f8179e9ea2167"));
-    }
-
-    public void isIndexedNoSuchChecksum() throws SQLException {
-        assertFalse(archiveEntriesDao.isIndexed("abab88fc2a043c2479a6de676a2f8179e9ea5243"));
-    }
-
-    public void loadByChecksumNonExisting() throws SQLException {
-        Set<ArchiveEntry> entries = archiveEntriesDao.loadByChecksum("aaab88fc2a043c2479a6de676a2f8179e9ea2167");
-        assertNotNull(entries);
-        assertTrue(entries.isEmpty());
-    }
-
-    public void removeByChecksum() throws SQLException {
-        String sha1 = "bbbb88fc2a043c2479a6de676a2f8179e9eabbbb";
-        assertEquals(archiveEntriesDao.loadByChecksum(sha1).size(), 2);
-        int deleteCount = archiveEntriesDao.deleteByChecksum(sha1);
-        assertEquals(deleteCount, 2);
-        assertEquals(archiveEntriesDao.loadByChecksum(sha1).size(), 0);
-    }
-
-    public void removeByChecksumNoSuchChecksum() throws SQLException {
-        int deleteCount = archiveEntriesDao.deleteByChecksum("111188fc2a043c2479a6de676a2f8179e9ea2222");
-        assertEquals(deleteCount, 0);
-    }
-
-    public void getEntryPathExistingPath() throws SQLException {
-        long archivePathId = archiveEntriesDao.findArchivePathId("META-INF");
-        assertEquals(8001, archivePathId);
-    }
-
-    public void getEntryPathNonExistingPath() throws SQLException {
-        long archivePathId = archiveEntriesDao.findArchivePathId("no/such/entry/path");
-        assertEquals(DbService.NO_DB_ID, archivePathId);
-    }
-
-    public void createIndexedArchive() throws SQLException {
-        String sha1 = "dddd88fc2a043c2479a6de676a2f7179e9eaddac";
-        assertFalse(archiveEntriesDao.isIndexed(sha1));
-        boolean created = archiveEntriesDao.createIndexedArchive(sha1, 21000);
-        assertTrue(created);
-        assertTrue(archiveEntriesDao.isIndexed(sha1));
-    }
-
-    public void createFindArchivePathEntry() throws SQLException {
-        assertTrue(archiveEntriesDao.createArchivePath(21000, "new/path"));
-        long archiveId = archiveEntriesDao.findArchivePathId("new/path");
-        assertEquals(archiveId, 21000);
-    }
-
-    public void findArchivePathEntryEmpty() throws SQLException {
-        // make sure empty paths are turned into single dot
-        assertEquals(archiveEntriesDao.findArchivePathId(""), 8004);
-        assertEquals(archiveEntriesDao.findArchivePathId("."), 8004);
-    }
-
-    public void deleteUnreferencedPathIds() throws SQLException {
-        assertTrue(archiveEntriesDao.createArchivePath(21010, "delete/me"));
-        assertEquals(archiveEntriesDao.findArchivePathId("delete/me"), 21010);
-        assertThat(archiveEntriesDao.deleteUnusedPathIds()).isGreaterThan(0);
-        assertEquals(archiveEntriesDao.findArchivePathId("delete/me"), DbService.NO_DB_ID);
-    }
-
-    public void createFindArchiveNameEntry() throws SQLException {
-        assertTrue(archiveEntriesDao.createArchiveName(22000, "name.txt"));
-        long nameId = archiveEntriesDao.findArchiveNameId("name.txt");
-        assertEquals(nameId, 22000);
-    }
-
-    public void createFindArchiveNameEntryEmpty() throws SQLException {
-        // make sure empty paths are turned into single dot
-        assertTrue(archiveEntriesDao.createArchiveName(22001, ""));
-        assertEquals(archiveEntriesDao.findArchiveNameId(""), 22001);
-    }
-
-    public void deleteUnreferencedNameIds() throws SQLException {
-        assertTrue(archiveEntriesDao.createArchiveName(22010L, "delete.me"));
-        assertEquals(archiveEntriesDao.findArchiveNameId("delete.me"), 22010L);
-        assertThat(archiveEntriesDao.deleteUnusedNameIds()).isGreaterThan(0);
-        assertEquals(archiveEntriesDao.findArchiveNameId("delete.me"), DbService.NO_DB_ID);
-    }
-
-    public void hasIndexedArchivesEntries() throws SQLException {
-        assertTrue(archiveEntriesDao.hasIndexedArchivesEntries(6000, 8002, 9003));
-        assertFalse(archiveEntriesDao.hasIndexedArchivesEntries(6000, 8002, 7894));
-    }
-
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/ConfigsDaoTest.java b/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/ConfigsDaoTest.java
deleted file mode 100644
index 025f0bb..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/ConfigsDaoTest.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.itest.dao;
-
-import org.apache.commons.io.IOUtils;
-import org.artifactory.storage.db.fs.dao.ConfigsDao;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.artifactory.storage.db.util.blob.BlobWrapper;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.sql.SQLException;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the {@link org.artifactory.storage.db.fs.dao.ConfigsDao}.
- *
- * @author Yossi Shaul
- */
-public class ConfigsDaoTest extends DbBaseTest {
-
-    @Autowired
-    private ConfigsDao configsDao;
-
-    public void createConfig() throws SQLException, UnsupportedEncodingException {
-        int insertCount = configsDao.createConfig("test", "data");
-        assertEquals(insertCount, 1);
-    }
-
-    @Test(dependsOnMethods = "createConfig")
-    public void hasConfig() throws SQLException {
-        assertTrue(configsDao.hasConfig("test"));
-    }
-
-    @Test(dependsOnMethods = "createConfig")
-    public void loadConfig() throws SQLException {
-        String data = configsDao.loadConfig("test");
-        assertNotNull(data);
-        assertEquals(data, "data");
-    }
-
-    @Test(dependsOnMethods = "loadConfig")
-    public void updateConfig() throws SQLException, UnsupportedEncodingException {
-        int updateCount = configsDao.updateConfig("test", "newdata");
-        assertEquals(updateCount, 1);
-        String result = configsDao.loadConfig("test");
-        assertNotNull(result);
-        assertEquals(result, "newdata");
-    }
-
-    private byte[] getByteTest() {
-        byte[] bytes = new byte[1024];
-        for (int i = 0; i < bytes.length; i++) {
-            bytes[i] = (byte) i;
-        }
-        return bytes;
-    }
-
-    public void createStreamConfig() throws SQLException {
-        byte[] byteTest = getByteTest();
-        int insertCount = configsDao.createConfig("test:stream",
-                new BlobWrapper(new ByteArrayInputStream(byteTest), byteTest.length));
-        assertEquals(insertCount, 1);
-    }
-
-    @Test(dependsOnMethods = "createStreamConfig")
-    public void hasStreamConfig() throws SQLException {
-        assertTrue(configsDao.hasConfig("test:stream"));
-    }
-
-    @Test(dependsOnMethods = "createStreamConfig")
-    public void loadStreamConfig() throws SQLException, IOException {
-        byte[] data = IOUtils.toByteArray(configsDao.loadStreamConfig("test:stream"));
-        assertNotNull(data);
-        assertEquals(data, getByteTest());
-    }
-
-    @Test(dependsOnMethods = "loadStreamConfig")
-    public void updateStreamConfig() throws SQLException, IOException {
-        byte[] byteTest = getByteTest();
-        byteTest[0] = 2;
-        int updateCount = configsDao.updateConfig("test:stream",
-                new BlobWrapper(new ByteArrayInputStream(byteTest), byteTest.length));
-        assertEquals(updateCount, 1);
-        byte[] result = IOUtils.toByteArray(configsDao.loadStreamConfig("test:stream"));
-        assertNotNull(result);
-        assertEquals(result, byteTest);
-    }
-
-    @Test(dependsOnMethods = {"updateStreamConfig", "updateConfig", "hasConfig", "hasStreamConfig"})
-    public void testDelete() throws SQLException, IOException {
-        assertEquals(configsDao.deleteConfig("test:stream"), 1);
-        assertEquals(configsDao.deleteConfig("test"), 1);
-    }
-
-    public void hasConfigNoConfig() throws SQLException {
-        assertFalse(configsDao.hasConfig("nosuchconfig"));
-    }
-
-    public void loadConfigNoConfig() throws SQLException {
-        assertNull(configsDao.loadConfig("nosuchconfig"));
-    }
-
-    public void updateConfigNoConfig() throws SQLException, UnsupportedEncodingException {
-        int updateCount = configsDao.updateConfig("nosuchconfig", "newdata");
-        assertEquals(updateCount, 0);
-    }
-
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/NodeMetaInfosDaoTest.java b/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/NodeMetaInfosDaoTest.java
deleted file mode 100644
index fa95dda..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/NodeMetaInfosDaoTest.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.itest.dao;
-
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.artifactory.storage.db.fs.dao.NodeMetaInfoDao;
-import org.artifactory.storage.db.fs.entity.NodeMetaInfo;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.sql.SQLException;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests {@link org.artifactory.storage.db.fs.dao.NodeMetaInfoDao}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class NodeMetaInfosDaoTest extends DbBaseTest {
-
-    @Autowired
-    private NodeMetaInfoDao metaDao;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/nodes.sql");
-    }
-
-    public void hasNodeMetadata() throws Exception {
-        assertTrue(metaDao.hasNodeMetadata(5));
-    }
-
-    public void hasNodeMetadataNodeWithNoProps() throws Exception {
-        assertFalse(metaDao.hasNodeMetadata(2));
-    }
-
-    public void getNodeMetadata() throws SQLException {
-        NodeMetaInfo nodeMetadata = metaDao.getNodeMetadata(5);
-        assertNotNull(nodeMetadata);
-        assertEquals(nodeMetadata.getNodeId(), 5);
-        assertEquals(nodeMetadata.getPropsModified(), 1340286103555L);
-        assertEquals(nodeMetadata.getPropsModifiedBy(), "yossis");
-    }
-
-    public void getNodeMetadataNoSuchNode() throws SQLException {
-        assertNull(metaDao.getNodeMetadata(748378));
-    }
-
-    public void getNodeMetadataNoMetadata() throws SQLException {
-        assertNull(metaDao.getNodeMetadata(2));
-    }
-
-    public void insertMetadata() throws SQLException {
-        long time = System.currentTimeMillis();
-        NodeMetaInfo toInsert = new NodeMetaInfo(6, time, "me");
-        metaDao.create(toInsert);
-
-        NodeMetaInfo fromDb = metaDao.getNodeMetadata(toInsert.getNodeId());
-
-        assertTrue(EqualsBuilder.reflectionEquals(toInsert, fromDb));
-    }
-
-    @Test(expectedExceptions = SQLException.class)
-    public void insertMetadataNonExistentNode() throws SQLException {
-        metaDao.create(new NodeMetaInfo(6, System.currentTimeMillis(), "me"));
-    }
-
-    public void updateMetadata() throws SQLException {
-        NodeMetaInfo metaInfo = new NodeMetaInfo(4, System.currentTimeMillis(), "someone");
-        metaDao.create(metaInfo);
-
-        NodeMetaInfo toUpdate = new NodeMetaInfo(4, 12345678L, "someoneelse");
-        metaDao.update(toUpdate);
-
-        NodeMetaInfo updatedMetaInfo = metaDao.getNodeMetadata(4);
-        assertNotNull(updatedMetaInfo);
-        assertTrue(EqualsBuilder.reflectionEquals(toUpdate, updatedMetaInfo));
-    }
-
-    public void updateMetadataNotExist() throws SQLException {
-        assertEquals(0, metaDao.update(new NodeMetaInfo(8989439, 12345678L, "someone")));
-    }
-
-    public void deleteMetadata() throws SQLException {
-        assertTrue(metaDao.hasNodeMetadata(9));
-        assertEquals(1, metaDao.deleteNodeMeta(9));
-        assertFalse(metaDao.hasNodeMetadata(9));
-    }
-
-    public void deleteMetadataNotExist() throws SQLException {
-        assertEquals(0, metaDao.deleteNodeMeta(11));
-    }
-
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/NodesDaoRepoStorageSummaryTest.java b/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/NodesDaoRepoStorageSummaryTest.java
deleted file mode 100644
index b7f7ab4..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/NodesDaoRepoStorageSummaryTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.itest.dao;
-
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.artifactory.storage.db.fs.dao.NodesDao;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.artifactory.storage.fs.repo.RepoStorageSummary;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.sql.SQLException;
-import java.util.Set;
-
-import static org.fest.assertions.Assertions.assertThat;
-
-/**
- * Tests the repo summary methods of the {@link org.artifactory.storage.db.fs.dao.NodesDao}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class NodesDaoRepoStorageSummaryTest extends DbBaseTest {
-
-    @Autowired
-    private NodesDao nodesDao;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/nodes-summary.sql");
-    }
-
-    public void testSummary() throws SQLException {
-        Set<RepoStorageSummary> summaries = nodesDao.getRepositoriesStorageSummary();
-        assertThat(summaries).isNotEmpty().hasSize(3).containsOnly(
-                new RepoStorageSummary("repo1", 6, 4, 10),
-                new RepoStorageSummary("repo2", 4, 4, 100),
-                new RepoStorageSummary("repo3", 0, 0, 0)   // empty repository
-        );
-
-        // per field and reflection equality checks
-        RepoStorageSummary repo1Summary = getSummaryFor("repo1", summaries);
-        assertThat(repo1Summary).isNotNull();
-        assertThat(repo1Summary.getRepoKey()).isEqualTo("repo1");
-        assertThat(repo1Summary.getFoldersCount()).isEqualTo(6);
-        assertThat(repo1Summary.getFilesCount()).isEqualTo(4);
-        assertThat(repo1Summary.getUsedSpace()).isEqualTo(10);
-
-        RepoStorageSummary repo2Summary = getSummaryFor("repo2", summaries);
-        assertThat(repo2Summary).isNotNull();
-        assertThat(EqualsBuilder.reflectionEquals(new RepoStorageSummary("repo2", 4, 4, 100), repo2Summary)).isTrue();
-
-        // repo with no children
-        RepoStorageSummary repo3Summary = getSummaryFor("repo3", summaries);
-        assertThat(repo3Summary).isNotNull();
-        assertThat(EqualsBuilder.reflectionEquals(new RepoStorageSummary("repo3", 0, 0, 0), repo3Summary)).isTrue();
-    }
-
-    private RepoStorageSummary getSummaryFor(String repoKey, Set<RepoStorageSummary> summaries) {
-        for (RepoStorageSummary summary : summaries) {
-            if (summary.getRepoKey().equals(repoKey)) {
-                return summary;
-            }
-        }
-        return null;
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/NodesDaoTest.java b/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/NodesDaoTest.java
deleted file mode 100644
index 85c1578..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/NodesDaoTest.java
+++ /dev/null
@@ -1,431 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.itest.dao;
-
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.db.DbType;
-import org.artifactory.storage.db.fs.dao.NodesDao;
-import org.artifactory.storage.db.fs.entity.Node;
-import org.artifactory.storage.db.fs.entity.NodeBuilder;
-import org.artifactory.storage.db.fs.entity.NodePath;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.sql.SQLException;
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-/**
- * Low level tests of the {@link org.artifactory.storage.db.fs.dao.NodesDao}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class NodesDaoTest extends DbBaseTest {
-
-    @Autowired
-    private NodesDao nodesDao;
-
-    private NodePath fileNodePath = new NodePath("repo1", "ant/ant/1.5", "ant-1.5.jar", true);
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/nodes.sql");
-    }
-
-    public void createDirectoryNode() throws SQLException {
-        NodeBuilder b = new NodeBuilder().nodeId(800).file(false).repo("repo").path("path/to/dir").name("name")
-                .createdBy("yossis").modifiedBy("yossis");
-
-        nodesDao.create(b.build());
-    }
-
-    @Test(dependsOnMethods = "createDirectoryNode")
-    public void loadDirectoryNodeByPath() throws SQLException {
-        Node node = nodesDao.get(new NodePath("repo", "path/to/dir", "name", false));
-        assertNotNull(node);
-        assertEquals(node.getNodeId(), 800);
-        assertFalse(node.isFile());
-        assertEquals(node.getDepth(), 4);
-        assertEquals(node.getRepo(), "repo");
-        assertEquals(node.getPath(), "path/to/dir");
-        assertEquals(node.getName(), "name");
-        assertEquals(node.getCreatedBy(), "yossis");
-        assertEquals(node.getModifiedBy(), "yossis");
-    }
-
-    @Test(dependsOnMethods = "loadDirectoryNodeByPath")
-    public void loadDirectoryNodeById() throws SQLException {
-        Node node = nodesDao.get(800);
-        EqualsBuilder.reflectionEquals(node, nodesDao.get(new NodePath("repo", "path/to/dir", "name", false)));
-    }
-
-    public void itemExists() throws SQLException {
-        assertTrue(nodesDao.exists(new NodePath("repo1", "", "org", false)));
-    }
-
-    public void itemNotExists() throws SQLException {
-        assertFalse(nodesDao.exists(new NodePath("repo1", "", "nosuchfile", false)));
-    }
-
-    public void deleteDirectoryNode() throws SQLException {
-        NodeBuilder b = new NodeBuilder().nodeId(801).file(false).repo("repo").path("path/to/dir").name("todelete")
-                .createdBy("yossis").modifiedBy("yossis");
-
-        Node inserted = b.build();
-        nodesDao.create(inserted);
-        Node loaded = nodesDao.get(inserted.getNodePath());
-        assertNotNull(loaded);
-        boolean deleted = nodesDao.delete(loaded.getNodeId());
-        assertTrue(deleted);
-        assertFalse(nodesDao.exists(inserted.getNodePath()));
-    }
-
-    public void deleteNonExistent() throws SQLException {
-        boolean deleted = nodesDao.delete(990);
-        assertFalse(deleted);
-    }
-
-    public void getChildrenOfRoot() throws SQLException {
-        NodePath path = new NodePath("repo1", "", "", false);
-        List<? extends Node> children = nodesDao.getChildren(path);
-        assertEquals(children.size(), 5);
-
-        assertTrue(nodesDao.hasChildren(path));
-    }
-
-    public void getChildrenOfNodeDirectlyUnderRoot() throws SQLException {
-        // nodes directly under root has name but no path - hence special test case
-        NodePath path = new NodePath("repo1", "", "org", false);
-        List<? extends Node> children = nodesDao.getChildren(path);
-        assertEquals(children.size(), 1);
-
-        assertTrue(nodesDao.hasChildren(path));
-    }
-
-    public void getChildrenOfNodeDirectlyUnderRootWithCousinStartingWithSamePrefix() throws SQLException {
-        NodePath path = new NodePath("repo1", "", "ant", false);
-        List<? extends Node> children = nodesDao.getChildren(path);
-        assertEquals(children.size(), 1);
-
-        assertTrue(nodesDao.hasChildren(path));
-    }
-
-    public void getChildrenOfLeafFolderNode() throws SQLException {
-        NodePath leaf = new NodePath("repo1", "org/yossis/tools", "test.bin", true);
-        assertTrue(nodesDao.exists(leaf));
-        assertEquals(nodesDao.getChildren(leaf).size(), 0);
-        assertFalse(nodesDao.hasChildren(leaf));
-    }
-
-    public void getChildrenOfLeafFileNode() throws SQLException {
-        assertTrue(nodesDao.exists(fileNodePath));
-        assertEquals(nodesDao.getChildren(fileNodePath).size(), 0);
-        assertFalse(nodesDao.hasChildren(fileNodePath));
-    }
-
-    public void getChildrenOfFolderWithUnderscore() throws SQLException {
-        NodePath path1 = new NodePath("repo1", "", "a_1.2", false);
-        NodePath path2 = new NodePath("repo1", "", "ab1.2", false);
-        NodePath file1 = new NodePath("repo1", "a_1.2", "tt.txt", true);
-        NodePath file2 = new NodePath("repo1", "ab1.2", "tt.txt", true);
-        assertTrue(nodesDao.exists(path1));
-        assertTrue(nodesDao.exists(path2));
-        assertFalse(nodesDao.exists(file1));
-        assertTrue(nodesDao.exists(file2));
-        assertEquals(nodesDao.getChildren(path1).size(), 0);
-        assertFalse(nodesDao.hasChildren(path1));
-        assertEquals(nodesDao.getChildren(path2).size(), 1);
-        assertTrue(nodesDao.hasChildren(path2));
-    }
-
-    public void countRepositoryFiles() throws SQLException {
-        assertEquals(nodesDao.getFilesCount("repo1"), 4);
-    }
-
-    public void countFilesUnderFolder() throws SQLException {
-        assertEquals(nodesDao.getFilesCount(new NodePath("repo1", "", "ant", false)), 1);
-    }
-
-    public void countFilesUnderFolderWithDirectChildren() throws SQLException {
-        assertEquals(nodesDao.getFilesCount(new NodePath("repo1", "ant/ant", "1.5", false)), 1);
-    }
-
-    public void countFilesUnderNonExistentFolder() throws SQLException {
-        assertEquals(nodesDao.getFilesCount(new NodePath("repo1", "xxx", "boo", false)), 0);
-    }
-
-    public void countFilesUnderFile() throws SQLException {
-        assertEquals(nodesDao.getFilesCount(fileNodePath), 0);
-    }
-
-    public void getFilesTotalSize() throws SQLException {
-        //hardcoded in nodes.sql
-        final int antExpectedSize = 716139;
-        final int totalExpectedSize = 846441;
-        final int toolsExpectedSize = 130302;
-
-        assertEquals(nodesDao.getFilesTotalSize(new NodePath("repo1", "", "ant", false)), antExpectedSize,
-                "single file size should be " + antExpectedSize);
-
-        assertEquals(nodesDao.getFilesTotalSize("repo1"), totalExpectedSize,
-                "total size of repo1 should be " + totalExpectedSize);
-
-        long filesTotalSize = 0;
-        for (Node node : nodesDao.getChildren(new NodePath("repo1", "", "", false))) {
-            filesTotalSize += nodesDao.getFilesTotalSize(node.getNodePath());
-        }
-
-        assertEquals(filesTotalSize, totalExpectedSize,
-                "sum of children size in repo1 should be " + filesTotalSize);
-
-        assertEquals(nodesDao.getFilesTotalSize(new NodePath("repo1", "org/yossis", "tools", false)), toolsExpectedSize,
-                "total size of files under org/yossis should be " + toolsExpectedSize);
-    }
-
-    public void countRepositoryFilesAndFolders() throws SQLException {
-        assertEquals(nodesDao.getNodesCount("repo1"), 17);
-    }
-
-    public void countRepositoryFilesAndFoldersUnderFolder() throws SQLException {
-        assertEquals(nodesDao.getNodesCount(new NodePath("repo1", "", "ant", false)), 3);
-    }
-
-    public void countFilesAndFoldersUnderFolderWithDirectChildren() throws SQLException {
-        assertEquals(nodesDao.getNodesCount(new NodePath("repo1", "ant/ant", "1.5", false)), 1);
-    }
-
-    public void countFilesAndFoldersUnderNonExistentFolder() throws SQLException {
-        assertEquals(nodesDao.getNodesCount(new NodePath("repo1", "xxx", "boo", false)), 0);
-    }
-
-    public void countFilesAndFoldersUnderFile() throws SQLException {
-        assertEquals(nodesDao.getNodesCount(fileNodePath), 0);
-    }
-
-    public void countFilesUnderFolderWithPrefix() throws SQLException {
-        assertEquals(nodesDao.getFilesCount(new NodePath("repo2", "", "a", false)), 2, "Files from 'repo2:/aa' were counted");
-    }
-
-    public void countNodesUnderFolderWithPrefix() throws SQLException {
-        assertEquals(nodesDao.getNodesCount(new NodePath("repo2", "", "a", false)), 3, "Nodes from 'repo2:/aa' were counted");
-    }
-
-    public void getTotalSizeUnderFolderWithPrefix() throws SQLException {
-        assertEquals(nodesDao.getFilesTotalSize(new NodePath("repo2", "", "a", false)),  716139 * 2, "Files from 'repo2:/aa' were counted");
-    }
-
-    public void updateFolderNode() throws SQLException {
-        NodeBuilder b = new NodeBuilder().nodeId(50).file(false).repo("repo").path("path/to/dir").name("toupdate")
-                .createdBy("yossis").modifiedBy("yossis");
-
-        nodesDao.create(b.build());
-
-        Node nodeToUpdate = b.repo("repo2").path("new/path").name("updatedfolder")
-                .created(1111).createdBy("updater-creator")
-                .modified(2222).modifiedBy("updater").updated(3333).build();
-
-        int updateCount = nodesDao.update(nodeToUpdate);
-        assertEquals(updateCount, 1);
-
-        Node updatedNode = nodesDao.get(nodeToUpdate.getNodePath());
-        assertNotNull(updatedNode);
-        assertEquals(updatedNode.getRepo(), nodeToUpdate.getRepo());
-        assertEquals(updatedNode.getPath(), nodeToUpdate.getPath());
-        assertEquals(updatedNode.getName(), nodeToUpdate.getName());
-        assertEquals(updatedNode.getCreated(), nodeToUpdate.getCreated());
-        assertEquals(updatedNode.getCreatedBy(), nodeToUpdate.getCreatedBy());
-        assertEquals(updatedNode.getModified(), nodeToUpdate.getModified());
-        assertEquals(updatedNode.getModifiedBy(), nodeToUpdate.getModifiedBy());
-        assertEquals(updatedNode.getUpdated(), nodeToUpdate.getUpdated());
-        assertEquals(updatedNode.getNodeId(), 50, "Node id shouldn't have been updated");
-        assertEquals(updatedNode.isFile(), false, "Node type shouldn't have been updated");
-    }
-
-
-    public void nodeIdRoot() throws SQLException {
-        assertEquals(nodesDao.getNodeId(new NodePath("repo1", "", "", false)), 1);
-    }
-
-    public void nodeIdNoSuchNode() throws SQLException {
-        assertEquals(nodesDao.getNodeId(new NodePath("repo2", "no", "folder", false)), DbService.NO_DB_ID);
-    }
-
-    public void nodeSha1OfFile() throws SQLException {
-        assertEquals(nodesDao.getNodeSha1(new NodePath("repo1", "org/yossis/tools", "test.bin", true)),
-                "acab88fc2a043c2479a6de676a2f8179e9ea2167");
-    }
-
-    public void nodeSha1NotExist() throws SQLException {
-        assertNull(nodesDao.getNodeSha1(new NodePath("repo2", "no", "folder", false)));
-    }
-
-    public void nodeSha1OfFolder() throws SQLException {
-        assertTrue(nodesDao.exists(new NodePath("repo1", "org/yossis", "tools", false)));
-        assertNull(nodesDao.getNodeSha1(new NodePath("repo1", "org/yossis", "tools", false)));
-    }
-
-    public void searchFilesByProperty() throws SQLException {
-        List<Node> nodes = nodesDao.searchFilesByProperty("repo1", "build.number", "67");
-        assertNotNull(nodes);
-        assertEquals(nodes.size(), 1);
-        assertEquals(nodes.get(0).getNodeId(), 5);
-    }
-
-    public void searchFilesByPropertyNoMatch() throws SQLException {
-        List<Node> nodes = nodesDao.searchFilesByProperty("repo1", "build.number", "68");
-        assertNotNull(nodes);
-        assertEquals(nodes.size(), 0);
-    }
-
-    public void searchGrandchildPoms() throws SQLException {
-        List<Node> nodes = nodesDao.searchGrandchildPoms(new NodePath("repo1", "org", "yossis", false));
-        assertNotNull(nodes);
-        assertEquals(nodes.size(), 2);
-        assertNotNull(getById(nodes, 12));
-        assertNotNull(getById(nodes, 13));
-    }
-
-    public void searchGrandchildPomsNoMatch() throws SQLException {
-        List<Node> nodes = nodesDao.searchGrandchildPoms(new NodePath("bu", "ba", "ga", false));
-        assertNotNull(nodes);
-        assertEquals(nodes.size(), 0);
-    }
-
-    public void findChecksumsBySha1() throws SQLException {
-        List<Node> nodes;
-        nodes = nodesDao.searchByChecksum(ChecksumType.sha1, "dcab88fc2a043c2479a6de676a2f8179e9ea2167");
-        assertEquals(nodes.size(), 1);
-        assertEquals(nodes.get(0).getNodeId(), 5L);
-        assertEquals(nodes.get(0).getRepo(), "repo1");
-        assertEquals(nodes.get(0).getName(), "ant-1.5.jar");
-        nodes = nodesDao.searchByChecksum(ChecksumType.sha1, "dddd88fc2a043c2479a6de676a2f8179e9eadddd");
-        assertEquals(nodes.size(), 2);
-        Node node = getById(nodes, 13);
-        assertNotNull(node);
-        assertEquals(node.getRepo(), "repo1");
-        assertEquals(node.getName(), "file3.pom");
-        node = getById(nodes, 15);
-        assertNotNull(node);
-        assertEquals(node.getRepo(), "repo-copy");
-        assertEquals(node.getName(), "file3.bin");
-        nodes = nodesDao.searchByChecksum(ChecksumType.sha1, "acab88fc2a043c2479a6de676a2f8179e9ea2222");
-        assertTrue(nodes.isEmpty());
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testFindEmptyChecksumsBySha1() throws SQLException {
-        nodesDao.searchByChecksum(ChecksumType.sha1, "wrong");
-    }
-
-    public void findChecksumsByMd5() throws SQLException {
-        List<Node> nodes;
-        nodes = nodesDao.searchByChecksum(ChecksumType.md5, "902a360ecad98a34b59863c1e65bcf71");
-        assertEquals(nodes.size(), 1);
-        assertEquals(nodes.get(0).getNodeId(), 5L);
-        assertEquals(nodes.get(0).getRepo(), "repo1");
-        assertEquals(nodes.get(0).getName(), "ant-1.5.jar");
-        nodes = nodesDao.searchByChecksum(ChecksumType.md5, "502a360ecad98a34b59863c1e65bcf71");
-        assertEquals(nodes.size(), 2);
-        Node node = getById(nodes, 13);
-        assertNotNull(node);
-        assertEquals(node.getRepo(), "repo1");
-        assertEquals(node.getName(), "file3.pom");
-        node = getById(nodes, 15);
-        assertNotNull(node);
-        assertEquals(node.getRepo(), "repo-copy");
-        assertEquals(node.getName(), "file3.bin");
-        nodes = nodesDao.searchByChecksum(ChecksumType.md5, "902a360ecad98a34b59863c1e65b2222");
-        assertTrue(nodes.isEmpty());
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testFindEmptyChecksumsByMd5() throws SQLException {
-        nodesDao.searchByChecksum(ChecksumType.md5, "wrong");
-    }
-
-    public void searchBadSha1Checksums() throws Exception {
-        List<Node> nodes = nodesDao.searchBadChecksums(ChecksumType.sha1);
-        assertEquals(nodes.size(), 3);
-        Node node = getById(nodes, 12);
-        assertNotNull(node);
-        assertEquals(node.getRepo(), "repo1");
-        assertEquals(node.getName(), "file2.pom");
-        node = getById(nodes, 13);
-        assertNotNull(node);
-        assertEquals(node.getRepo(), "repo1");
-        assertEquals(node.getName(), "file3.pom");
-        node = getById(nodes, 15);
-        assertNotNull(node);
-        assertEquals(node.getRepo(), "repo-copy");
-        assertEquals(node.getName(), "file3.bin");
-    }
-
-    public void findMissingDirectories() throws Exception {
-        if (storageProperties.getDbType() == DbType.DERBY) {
-            return; // CONCAT doesn't work on Derby + it's irrelevant
-        }
-        List<Node> nodes = nodesDao.getOrphanNodes(new NodePath("repo3", null, null, false));
-        assertEquals(nodes.size(), 2);
-        Node node = getById(nodes, 33);
-        assertNotNull(node);
-        assertEquals(node.getPath(), "a/B");
-        assertEquals(node.getName(), "C");
-        node = getById(nodes, 34);
-        assertNotNull(node);
-        assertEquals(node.getPath(), "B");
-        assertEquals(node.getName(), "test.txt");
-    }
-
-    public void findMissingDirectoriesUnderPath() throws Exception {
-        if (storageProperties.getDbType() == DbType.DERBY) {
-            return; // CONCAT doesn't work on Derby + it's irrelevant
-        }
-        List<Node> nodes = nodesDao.getOrphanNodes(new NodePath("repo3", "a", "B", false));
-        assertEquals(nodes.size(), 1);
-        Node node = getById(nodes, 33);
-        assertNotNull(node);
-        assertEquals(node.getPath(), "a/B");
-        assertEquals(node.getName(), "C");
-    }
-
-    public void searchBadMd5Checksums() throws Exception {
-        List<Node> nodes = nodesDao.searchBadChecksums(ChecksumType.md5);
-        assertEquals(nodes.size(), 1);
-        Node node = getById(nodes, 17);
-        assertNotNull(node);
-        assertEquals(node.getRepo(), "repo-copy");
-        assertEquals(node.getName(), "badmd5.jar");
-    }
-
-    private Node getById(List<Node> nodes, long id) {
-        for (Node node : nodes) {
-            if (node.getNodeId() == id) {
-                return node;
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/PropertiesDaoTest.java b/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/PropertiesDaoTest.java
deleted file mode 100644
index e1e1290..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/PropertiesDaoTest.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.itest.dao;
-
-import org.apache.commons.lang.RandomStringUtils;
-import org.artifactory.storage.db.DbType;
-import org.artifactory.storage.db.fs.dao.PropertiesDao;
-import org.artifactory.storage.db.fs.entity.NodeProperty;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.BeforeClass;
-
-import java.sql.SQLException;
-import java.util.List;
-
-import static org.fest.assertions.Assertions.assertThat;
-import static org.testng.Assert.*;
-
-/**
- * Tests {@link org.artifactory.storage.db.fs.dao.PropertiesDao}.
- *
- * @author Yossi Shaul
- */
-public class PropertiesDaoTest extends DbBaseTest {
-
-    @Autowired
-    private PropertiesDao propsDao;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/nodes.sql");
-    }
-
-    public void hasPropertiesNodeWithProperties() throws SQLException {
-        boolean result = propsDao.hasNodeProperties(5);
-        assertTrue(result, "Node expected to hold properties");
-    }
-
-    public void hasPropertiesNodeWithoutProperties() throws SQLException {
-        boolean result = propsDao.hasNodeProperties(1);
-        assertFalse(result, "Node is not expected to hold properties");
-    }
-
-    public void hasPropertiesNodeNotExist() throws SQLException {
-        boolean result = propsDao.hasNodeProperties(5478939);
-        assertFalse(result, "Node that doesn't exist is not expected to hold properties");
-    }
-
-    public void getPropertiesNodeWithProperties() throws SQLException {
-        List<NodeProperty> result = propsDao.getNodeProperties(5);
-        assertNotNull(result);
-        assertEquals(result.size(), 2);
-        for (NodeProperty property : result) {
-            assertEquals(property.getNodeId(), 5, "All results should be with the same node id");
-        }
-
-        NodeProperty buildName = getById(1, result);
-        assertEquals(buildName.getPropId(), 1);
-        assertEquals(buildName.getPropKey(), "build.name");
-        assertEquals(buildName.getPropValue(), "ant");
-    }
-
-    public void getPropertiesNodeWithEmptyProperties() throws SQLException {
-        List<NodeProperty> result = propsDao.getNodeProperties(14);
-        assertNotNull(result);
-        assertEquals(result.size(), 2);
-        for (NodeProperty property : result) {
-            assertEquals(property.getNodeId(), 14, "All results should be with the same node id");
-        }
-
-        NodeProperty emptyVal = getById(6, result);
-        assertEquals(emptyVal.getPropId(), 6);
-        assertEquals(emptyVal.getPropKey(), "empty.val");
-        assertEquals(emptyVal.getPropValue(), "");
-
-        NodeProperty nullVal = getById(7, result);
-        assertEquals(nullVal.getPropId(), 7);
-        assertEquals(nullVal.getPropKey(), "null.val");
-        assertEquals(emptyVal.getPropValue(), "");
-    }
-
-    public void getPropertiesNodeWithoutProperties() throws SQLException {
-        List<NodeProperty> result = propsDao.getNodeProperties(1);
-        assertEquals(result.size(), 0);
-    }
-
-    public void getPropertiesNodeNotExist() throws SQLException {
-        List<NodeProperty> result = propsDao.getNodeProperties(98958459);
-        assertEquals(result.size(), 0);
-    }
-
-    public void insertProperty() throws SQLException {
-        int createCount = propsDao.create(new NodeProperty(11, 9, "key1", "value1"));
-        assertEquals(createCount, 1);
-        createCount = propsDao.create(new NodeProperty(12, 9, "key2", "value2"));
-        assertEquals(createCount, 1);
-
-        List<NodeProperty> properties = propsDao.getNodeProperties(9);
-        assertEquals(properties.size(), 2);
-    }
-
-    public void deletePropertiesNodeWithProperties() throws SQLException {
-        // first check the properties exist
-        assertEquals(propsDao.getNodeProperties(9).size(), 3);
-
-        int deletedCount = propsDao.deleteNodeProperties(9);
-        assertEquals(deletedCount, 3);
-        assertEquals(propsDao.getNodeProperties(9).size(), 0);
-    }
-
-    public void deletePropertiesNodeWithNoProperties() throws SQLException {
-        assertEquals(propsDao.deleteNodeProperties(1), 0);
-    }
-
-    public void deletePropertiesNonExistentNode() throws SQLException {
-        assertEquals(propsDao.deleteNodeProperties(6778678), 0);
-    }
-
-    public void trimLongPropertyValue() throws SQLException {
-        if (storageProperties.getDbType() == DbType.MSSQL) {
-            return; // RTFACT-5768
-        }
-        String longValue = RandomStringUtils.randomAscii(4020);
-        propsDao.create(new NodeProperty(876, 15, "trimeme", longValue));
-        List<NodeProperty> nodeProperties = propsDao.getNodeProperties(15);
-        assertThat(nodeProperties.size()).isEqualTo(1);
-        String trimmedValue = nodeProperties.get(0).getPropValue();
-        assertThat(trimmedValue).hasSize(4000);
-        assertThat(longValue).startsWith(trimmedValue);
-    }
-
-    private NodeProperty getById(long propId, List<NodeProperty> properties) {
-        for (NodeProperty property : properties) {
-            if (property.getPropId() == propId) {
-                return property;
-            }
-        }
-        return null;
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/StatsDaoTest.java b/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/StatsDaoTest.java
deleted file mode 100644
index cb90004..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/StatsDaoTest.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.itest.dao;
-
-import org.artifactory.storage.db.fs.dao.StatsDao;
-import org.artifactory.storage.db.fs.entity.Stat;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.sql.SQLException;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests {@link org.artifactory.storage.db.fs.dao.StatsDao}.
- *
- * @author Yossi Shaul
- */
-public class StatsDaoTest extends DbBaseTest {
-
-    @Autowired
-    private StatsDao statsDao;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/nodes.sql");
-    }
-
-    public void getFileStats() throws SQLException {
-        Stat stat = statsDao.getStats(6, false);
-        assertNotNull(stat);
-        assertEquals(stat.getNodeId(), 6L);
-        assertEquals(stat.getLocalDownloadCount(), 15);
-        assertEquals(stat.getLocalLastDownloaded(), 1340283207850L);
-        assertEquals(stat.getLocalLastDownloadedBy(), "yossis");
-    }
-
-    public void getFileStatsWithNoDownloads() throws SQLException {
-        assertNull(statsDao.getStats(11, false));
-    }
-
-    public void hasStatsFileWithStats() throws SQLException {
-        assertTrue(statsDao.hasStats(6));
-    }
-
-    public void hasStatsFileWithoutStats() throws SQLException {
-        assertFalse(statsDao.hasStats(11));
-    }
-
-    public void hasStatsFolder() throws SQLException {
-        assertFalse(statsDao.hasStats(2), "Folders don't have stats");
-    }
-
-    public void hasStatsNonExistentId() throws SQLException {
-        assertFalse(statsDao.hasStats(2375437583L));
-    }
-
-    public void createStatsFileWithoutStats() throws SQLException {
-        long lastDownloaded = System.currentTimeMillis();
-        int updateCount = statsDao.createStats(new Stat(12, 3, lastDownloaded, "yoyo"), false);
-        assertEquals(updateCount, 1);
-        Stat stats = statsDao.getStats(12, false);
-        assertNotNull(stats);
-        assertEquals(stats.getNodeId(), 12L);
-        assertEquals(stats.getLocalDownloadCount(), 3);
-        assertEquals(stats.getLocalLastDownloaded(), lastDownloaded);
-        assertEquals(stats.getLocalLastDownloadedBy(), "yoyo");
-    }
-
-    @Test(dependsOnMethods = "createStatsFileWithoutStats", expectedExceptions = SQLException.class)
-    public void createStatsFileWithStats() throws SQLException {
-        statsDao.createStats(new Stat(12, 5, System.currentTimeMillis(), "lolo"), false);
-    }
-
-    @Test(dependsOnMethods = "getFileStats")
-    public void updateStatsFileWithStats() throws SQLException {
-        long time = System.currentTimeMillis();
-        int updateCount = statsDao.updateStats(new Stat(6, 23, time, "yoyo"), false);
-
-        assertEquals(updateCount, 1);
-        Stat stat = statsDao.getStats(6, false);
-        assertNotNull(stat);
-        assertEquals(stat.getNodeId(), 6L);
-        assertEquals(stat.getLocalDownloadCount(), 23);
-        assertEquals(stat.getLocalLastDownloaded(), time);
-        assertEquals(stat.getLocalLastDownloadedBy(), "yoyo");
-    }
-
-    public void updateStatsFileWithoutStats() throws SQLException {
-        int updateCount = statsDao.updateStats(new Stat(11, 23, System.currentTimeMillis(), "yoyo"), false);
-        assertEquals(updateCount, 0);
-        assertNull(statsDao.getStats(11, false));
-    }
-
-    @Test(dependsOnMethods = "createStatsFileWithStats")
-    public void deleteStatsFileWithStats() throws SQLException {
-        assertEquals(statsDao.deleteStats(12, false), 1);
-    }
-
-    public void deleteStatsFileWithoutStats() throws SQLException {
-        assertEquals(statsDao.deleteStats(13, false), 0);
-    }
-
-    public void deleteStatsNonExistingNode() throws SQLException {
-        assertEquals(statsDao.deleteStats(343434, false), 0);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/TasksDaoTest.java b/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/TasksDaoTest.java
deleted file mode 100644
index 11121fb..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/TasksDaoTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.itest.dao;
-
-import org.artifactory.storage.db.fs.dao.TasksDao;
-import org.artifactory.storage.db.fs.entity.TaskRecord;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.sql.SQLException;
-import java.util.Set;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the {@link org.artifactory.storage.db.fs.dao.TasksDao}.
- *
- * @author Yossi Shaul
- */
-public class TasksDaoTest extends DbBaseTest {
-
-    @Autowired
-    private TasksDao tasksDao;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/nodes.sql");
-    }
-
-    public void loadByType() throws SQLException {
-        Set<TaskRecord> tasks = tasksDao.load("INDEX");
-        assertNotNull(tasks);
-        assertEquals(tasks.size(), 2);
-        for (TaskRecord task : tasks) {
-            assertEquals(task.getTaskType(), "INDEX");
-        }
-    }
-
-    public void exist() throws SQLException {
-        assertTrue(tasksDao.exist("INDEX", "repo1:ant/ant/1.5/ant-1.5.jar"));
-        assertFalse(tasksDao.exist("INDEX", "repo1:ant/ant/1.9/ant-1.9.jar"));
-    }
-
-    public void create() throws SQLException {
-        assertFalse(tasksDao.exist("MYTEST", "123"));
-        tasksDao.create("MYTEST", "123");
-        Set<TaskRecord> myTestTasks = tasksDao.load("MYTEST");
-        assertEquals(myTestTasks.size(), 1);
-        assertEquals(myTestTasks.iterator().next().getTaskType(), "MYTEST");
-        assertEquals(myTestTasks.iterator().next().getTaskContext(), "123");
-    }
-
-    @Test
-    public void createDuplicate() throws SQLException {
-        // until decided otherwise the unique constraint is removed
-        tasksDao.create("DUPLICATE", "DUP");
-        tasksDao.create("DUPLICATE", "DUP");
-    }
-
-    public void delete() throws SQLException {
-        assertTrue(tasksDao.exist("MMC", "this/is/a/test"));
-        assertTrue(tasksDao.delete("MMC", "this/is/a/test"));
-        assertFalse(tasksDao.exist("MMC", "this/is/a/test"));
-    }
-
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/WatchesDaoTest.java b/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/WatchesDaoTest.java
deleted file mode 100644
index 73bd372..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/dao/WatchesDaoTest.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.itest.dao;
-
-import org.artifactory.storage.db.fs.dao.WatchesDao;
-import org.artifactory.storage.db.fs.entity.Watch;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.BeforeClass;
-
-import java.sql.SQLException;
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests {@link org.artifactory.storage.db.fs.dao.WatchesDao}.
- *
- * @author Yossi Shaul
- */
-public class WatchesDaoTest extends DbBaseTest {
-
-    @Autowired
-    private WatchesDao watchesDao;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/nodes.sql");
-    }
-
-    public void hasWatchesNodeWithWatches() throws SQLException {
-        boolean result = watchesDao.hasWatches(4);
-        assertTrue(result, "Node expected to hold watches");
-    }
-
-    public void hasWatchesNodeWithoutWatches() throws SQLException {
-        boolean result = watchesDao.hasWatches(1);
-        assertFalse(result, "Node is not expected to hold watches");
-    }
-
-    public void hasWatchesNodeNotExist() throws SQLException {
-        boolean result = watchesDao.hasWatches(5478939);
-        assertFalse(result, "Node that doesn't exist is not expected to hold watches");
-    }
-
-    public void getWatchesNodeWithWatches() throws SQLException {
-        List<Watch> result = watchesDao.getWatches(4);
-        assertNotNull(result);
-        assertEquals(result.size(), 2);
-        for (Watch watch : result) {
-            assertEquals(watch.getNodeId(), 4, "All results should be with the same node id");
-        }
-
-        Watch buildName = getByUsername("scott", result);
-        assertEquals(buildName.getWatchId(), 1);
-        assertEquals(buildName.getSince(), 1340286203555L);
-        assertEquals(buildName.getUsername(), "scott");
-
-        buildName = getByUsername("amy", result);
-        assertEquals(buildName.getWatchId(), 2);
-        assertEquals(buildName.getSince(), 1340286203666L);
-        assertEquals(buildName.getUsername(), "amy");
-    }
-
-    public void getWatchesNodeWithoutWatches() throws SQLException {
-        List<Watch> result = watchesDao.getWatches(1);
-        assertEquals(result.size(), 0);
-    }
-
-    public void getWatchesNodeNotExist() throws SQLException {
-        List<Watch> result = watchesDao.getWatches(98958459);
-        assertEquals(result.size(), 0);
-    }
-
-    public void insertWatch() throws SQLException {
-        long time = System.currentTimeMillis();
-        int createCount = watchesDao.create(new Watch(11, 6, "yoyo", time - 1000));
-        assertEquals(createCount, 1);
-        createCount = watchesDao.create(new Watch(12, 6, "lolo", time));
-        assertEquals(createCount, 1);
-
-        List<Watch> watches = watchesDao.getWatches(6);
-        assertEquals(watches.size(), 2);
-
-        Watch buildName = getByUsername("lolo", watches);
-        assertEquals(buildName.getWatchId(), 12);
-        assertEquals(buildName.getNodeId(), 6);
-        assertEquals(buildName.getSince(), time);
-        assertEquals(buildName.getUsername(), "lolo");
-
-    }
-
-    public void deleteWatchesNodeWithWatches() throws SQLException {
-        // first check the Watches exist
-        assertEquals(watchesDao.getWatches(9).size(), 2);
-
-        int deletedCount = watchesDao.deleteWatches(9);
-        assertEquals(deletedCount, 2);
-        assertEquals(watchesDao.getWatches(9).size(), 0);
-    }
-
-    public void deleteWatchesNodeWithNoWatches() throws SQLException {
-        assertEquals(watchesDao.deleteWatches(1), 0);
-    }
-
-    public void deleteWatchesNonExistentNode() throws SQLException {
-        assertEquals(watchesDao.deleteWatches(6778678), 0);
-    }
-
-    public void deleteUserWatches() throws SQLException {
-        assertEquals(watchesDao.deleteUserWatches(10, "dodo"), 1);
-    }
-
-    public void deleteAllUserWatches() throws SQLException {
-        assertEquals(watchesDao.deleteAllUserWatches("momo"), 2);
-    }
-
-    public void deleteAllUserWatchesNoSuchUser() throws SQLException {
-        assertEquals(watchesDao.deleteAllUserWatches("nosuchuser"), 0);
-    }
-
-    private Watch getByUsername(String username, List<Watch> Watches) {
-        for (Watch watch : Watches) {
-            if (watch.getUsername().equals(username)) {
-                return watch;
-            }
-        }
-        return null;
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/ArchiveEntriesServiceImplTest.java b/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/ArchiveEntriesServiceImplTest.java
deleted file mode 100644
index 74b6ec0..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/ArchiveEntriesServiceImplTest.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.itest.service;
-
-import com.google.common.collect.Sets;
-import org.artifactory.fs.ZipEntryInfo;
-import org.artifactory.model.xstream.fs.ZipEntryImpl;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.db.binstore.dao.BinariesDao;
-import org.artifactory.storage.db.binstore.entity.BinaryEntity;
-import org.artifactory.storage.db.fs.dao.ArchiveEntriesDao;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.artifactory.storage.fs.service.ArchiveEntriesService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.sql.SQLException;
-import java.util.Set;
-
-import static org.fest.assertions.Assertions.assertThat;
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-/**
- * Tests the {@link org.artifactory.storage.fs.service.ArchiveEntriesService}
- *
- * @author Yossi Shaul
- */
- at Test
-public class ArchiveEntriesServiceImplTest extends DbBaseTest {
-
-    @Autowired
-    private ArchiveEntriesService archiveEntriesService;
-
-    @Autowired
-    private ArchiveEntriesDao archiveEntriesDao;
-
-    @Autowired
-    private BinariesDao binariesDao;
-
-    @Autowired
-    private JdbcHelper jdbcHelper;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/nodes-for-service.sql");
-    }
-
-    public void hasEntries() {
-        assertTrue(archiveEntriesService.isIndexed("dcab88fc2a043c2479a6de676a2f8179e9ea2167"));
-    }
-
-    public void hasEntriesNoSuchChecksum() {
-        assertFalse(archiveEntriesService.isIndexed("999988fc2a043c2479a6de676a2f8179e9e55555"));
-    }
-
-    public void getEntries() {
-        Set<ZipEntryInfo> entries = archiveEntriesService.getArchiveEntries("dcab88fc2a043c2479a6de676a2f8179e9ea2167");
-        assertThat(entries).hasSize(3).doesNotHaveDuplicates()
-                .containsOnly(
-                        new ZipEntryImpl("META-INF/LICENSE.txt", false),
-                        new ZipEntryImpl("META-INF/MANIFEST.MF", false),
-                        new ZipEntryImpl("org/apache/tools/ant/filters/BaseFilterReader.class", false));
-    }
-
-    public void insertEntries() {
-        Set<ZipEntryImpl> entriesToInsert = Sets.newHashSet(
-                new ZipEntryImpl("my/test.me", false),
-                new ZipEntryImpl("my/test2", false),
-                new ZipEntryImpl("my/test/MyClass.class", false)
-        );
-
-        String sha1 = "ecab88fc2a043c2479a6de676a2f8179e9ea2167";
-        assertFalse(archiveEntriesService.isIndexed(sha1));
-        archiveEntriesService.addArchiveEntries(sha1, entriesToInsert);
-        assertTrue(archiveEntriesService.isIndexed(sha1));
-        Set<ZipEntryInfo> entriesLoaded = archiveEntriesService.getArchiveEntries(sha1);
-        assertThat(entriesLoaded).hasSize(entriesToInsert.size()).isEqualTo(entriesToInsert);
-    }
-
-    @Test(dependsOnMethods = "insertEntries")
-    public void deleteEntries() throws SQLException {
-        String sha1 = "ecab88fc2a043c2479a6de676a2f8179e9ea2167";
-        assertThat(archiveEntriesDao.findIndexedArchiveIdByChecksum(sha1)).isNotEqualTo(DbService.NO_DB_ID);
-        assertTrue(archiveEntriesService.deleteArchiveEntries(sha1));
-        assertFalse(archiveEntriesService.isIndexed(sha1));
-        assertThat(archiveEntriesDao.findIndexedArchiveIdByChecksum(sha1)).isEqualTo(DbService.NO_DB_ID);
-    }
-
-    public void deleteEntriesNotIndexed() {
-        assertFalse(archiveEntriesService.deleteArchiveEntries("999988fc2a043c2479a6de676a2f8179e9e55566"));
-    }
-
-    public void insertEntriesReusedPathAndName() throws SQLException {
-        Set<ZipEntryImpl> firstArchiveEntries = Sets.newHashSet(
-                new ZipEntryImpl("path1/name1", false),
-                new ZipEntryImpl("path1/name2", false)
-        );
-        String firstSha1 = randomSha1();
-        binariesDao.create(new BinaryEntity(firstSha1, randomMd5(), 789));
-
-        // assert that before inserting there are no path and name ids
-        assertThat(archiveEntriesDao.findArchivePathId("path1")).isEqualTo(DbService.NO_DB_ID);
-        assertThat(archiveEntriesDao.findArchiveNameId("name1")).isEqualTo(DbService.NO_DB_ID);
-
-        archiveEntriesService.addArchiveEntries(firstSha1, firstArchiveEntries);
-
-        // now there should be path and name ids
-        assertThat(archiveEntriesDao.findArchivePathId("path1")).isNotEqualTo(DbService.NO_DB_ID);
-        assertThat(archiveEntriesDao.findArchiveNameId("name1")).isNotEqualTo(DbService.NO_DB_ID);
-
-        assertTrue(archiveEntriesService.isIndexed(firstSha1));
-        Set<ZipEntryInfo> entriesLoaded = archiveEntriesService.getArchiveEntries(firstSha1);
-        assertThat(entriesLoaded).hasSize(firstArchiveEntries.size()).isEqualTo(firstArchiveEntries);
-
-        // now lets insert additional archive with similar paths and names
-        Set<ZipEntryImpl> secondArchiveEntries = Sets.newHashSet(
-                new ZipEntryImpl("path1/name1", false),
-                new ZipEntryImpl("path2/name2", false),
-                new ZipEntryImpl("path3/name2", false)
-        );
-        String secondSha1 = randomSha1();
-        binariesDao.create(new BinaryEntity(secondSha1, randomMd5(), 4512));
-
-        archiveEntriesService.addArchiveEntries(secondSha1, secondArchiveEntries);
-        assertThat(archiveEntriesService.getArchiveEntries(secondSha1)).hasSize(secondArchiveEntries.size())
-                .isEqualTo(secondArchiveEntries);
-    }
-
-    public void deleteKeepsPathAndName() throws SQLException {
-        // test that deleting an archive entries doesn't remove the path and name. Only GC cleans the unused
-        String archiveSha1 = randomSha1();
-        binariesDao.create(new BinaryEntity(archiveSha1, randomMd5(), 56));
-
-        assertThat(archiveEntriesDao.findArchivePathId("uniquepath")).isEqualTo(DbService.NO_DB_ID);
-        assertThat(archiveEntriesDao.findArchiveNameId("uniquename")).isEqualTo(DbService.NO_DB_ID);
-
-        archiveEntriesService.addArchiveEntries(archiveSha1,
-                Sets.newHashSet(new ZipEntryImpl("uniquepath/uniquename", true)));
-
-        assertThat(archiveEntriesDao.findArchivePathId("uniquepath")).isNotEqualTo(DbService.NO_DB_ID);
-        assertThat(archiveEntriesDao.findArchiveNameId("uniquename")).isNotEqualTo(DbService.NO_DB_ID);
-    }
-
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/ConfigsServiceImplTest.java b/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/ConfigsServiceImplTest.java
deleted file mode 100644
index c5ffb1c..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/ConfigsServiceImplTest.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.itest.service;
-
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.artifactory.storage.fs.service.ConfigsService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.Test;
-
-import java.io.UnsupportedEncodingException;
-import java.sql.SQLException;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the {@link org.artifactory.storage.fs.service.ConfigsService}
- *
- * @author Yossi Shaul
- */
-public class ConfigsServiceImplTest extends DbBaseTest {
-
-    @Autowired
-    private ConfigsService configsService;
-
-    public void addConfig() throws SQLException, UnsupportedEncodingException {
-        configsService.addConfig("confName", "confinput");
-    }
-
-    @Test(dependsOnMethods = "addConfig")
-    public void hasConfig() throws SQLException {
-        assertTrue(configsService.hasConfig("confName"));
-    }
-
-    @Test(dependsOnMethods = "addConfig")
-    public void getConfig() throws SQLException {
-        String data = configsService.getConfig("confName");
-        assertNotNull(data);
-        assertEquals(data, "confinput");
-    }
-
-    @Test(dependsOnMethods = "getConfig")
-    public void updateConfig() throws SQLException, UnsupportedEncodingException {
-        configsService.updateConfig("confName", "newdata");
-        String result = configsService.getConfig("confName");
-        assertNotNull(result);
-        assertEquals(result, "newdata");
-    }
-
-    public void hasConfigNoConfig() throws SQLException {
-        assertFalse(configsService.hasConfig("nosuchconfig"));
-    }
-
-    public void loadConfigNoConfig() throws SQLException {
-        assertNull(configsService.getConfig("nosuchconfig"));
-    }
-
-    @Test(expectedExceptions = IllegalStateException.class)
-    public void updateConfigNoConfig() throws SQLException, UnsupportedEncodingException {
-        configsService.updateConfig("nosuchconfig", "newdata");
-    }
-
-    @Test(dependsOnMethods = "addConfig", expectedExceptions = IllegalStateException.class)
-    public void addConfigExistingConfig() throws SQLException {
-        configsService.addConfig("confName", "jojjoh");
-    }
-
-    public void addOrUpdateConfig() {
-        boolean created = configsService.addOrUpdateConfig("artifactory", "somedata");
-        assertTrue(created);
-        assertEquals(configsService.getConfig("artifactory"), "somedata");
-        created = configsService.addOrUpdateConfig("artifactory", "newdata");
-        assertFalse(created);
-        assertEquals(configsService.getConfig("artifactory"), "newdata");
-    }
-
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/DbPropertiesServiceImplTest.java b/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/DbPropertiesServiceImplTest.java
deleted file mode 100644
index c972020..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/DbPropertiesServiceImplTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.itest.service;
-
-import org.artifactory.md.Properties;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.model.xstream.fs.PropertiesImpl;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.artifactory.storage.fs.service.PropertiesService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.util.Set;
-
-import static org.testng.Assert.*;
-
-/**
- * @author Yossi Shaul
- */
- at Test
-public class DbPropertiesServiceImplTest extends DbBaseTest {
-
-    @Autowired
-    private PropertiesService propertiesService;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/nodes-for-service.sql");
-    }
-
-    public void getPropertiesNodeWithProperties() {
-        Properties props = propertiesService.loadProperties(5);
-
-        assertEquals(props.keySet().size(), 2);
-        String value = props.getFirst("build.name");
-        assertEquals(value, "ant");
-    }
-
-    public void getPropertiesNodeWithMultiValueProperties() {
-        Properties props = propertiesService.loadProperties(7);
-
-        assertEquals(props.keySet().size(), 1, "One unique key");
-        Set<String> values = props.get("yossis");
-        assertNotNull(values);
-        assertTrue(values.contains("value1"));
-        assertTrue(values.contains("value2"));
-    }
-
-    public void getPropertiesNodeWithNone() {
-        assertEquals(propertiesService.loadProperties(2).size(), 0);
-    }
-
-    public void getPropertiesNodeNotExist() {
-        assertEquals(propertiesService.loadProperties(78849).size(), 0);
-    }
-
-    public void setProperties() {
-        assertEquals(propertiesService.loadProperties(6).size(), 0);
-        PropertiesImpl properties = new PropertiesImpl();
-        properties.put("key1", "1");
-        properties.put("key1", "2");
-        properties.put("key2", "2");
-
-        propertiesService.setProperties(6, properties);
-
-        assertEquals(propertiesService.loadProperties(6), properties);
-    }
-
-    @Test(dependsOnMethods = "setProperties")
-    public void deleteProperties() {
-        int count = propertiesService.deleteProperties(6);
-        assertEquals(count, 3);
-
-        assertEquals(propertiesService.loadProperties(6).size(), 0);
-    }
-
-    public void hasPropertiesPathWithProperties() {
-        assertTrue(propertiesService.hasProperties(new RepoPathImpl("repo1", "ant/ant/1.5/ant-1.5.jar")));
-    }
-
-    public void hasPropertiesPathWithNoProperties() {
-        assertFalse(propertiesService.hasProperties(new RepoPathImpl("repo2", "org")));
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/FileServiceImplTest.java b/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/FileServiceImplTest.java
deleted file mode 100644
index 6224b1e..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/FileServiceImplTest.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.itest.service;
-
-import org.artifactory.api.repo.exception.FolderExpectedException;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.model.xstream.fs.FolderInfoImpl;
-import org.artifactory.sapi.fs.VfsItem;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.artifactory.storage.fs.VfsException;
-import org.artifactory.storage.fs.VfsItemNotFoundException;
-import org.artifactory.storage.fs.service.FileService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-/**
- * Low level integration tests for the file service.
- *
- * @author Yossi Shaul
- */
-public class FileServiceImplTest extends DbBaseTest {
-
-    @Autowired
-    private FileService fileService;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/nodes-for-service.sql");
-    }
-
-    public void countAllFiles() throws VfsException {
-        int count = fileService.getFilesCount();
-        assertEquals(count, 6);
-    }
-
-    public void countFilesUnderRepo() throws VfsException {
-        int count = fileService.getFilesCount(new RepoPathImpl("repo1", ""));
-        assertEquals(count, 1);
-    }
-
-    public void countFilesUnderFolder() throws VfsException {
-        int count = fileService.getFilesCount(new RepoPathImpl("repo1", "ant"));
-        assertEquals(count, 1);
-    }
-
-    public void countRepoFilesUnderNonExistentRepo() throws VfsException {
-        int count = fileService.getFilesCount(new RepoPathImpl("repoXXX", ""));
-        assertEquals(count, 0, "Dummy repo name");
-    }
-
-    @Test(dependsOnMethods = "deleteFolderById")
-    public void countFolderAndFilesUnderRepo() throws VfsException {
-        int count = fileService.getNodesCount(new RepoPathImpl("repo1", ""));
-        assertEquals(count, 7);
-    }
-
-    public void countFolderAndFilesUnderFolder() throws VfsException {
-        int count = fileService.getNodesCount(new RepoPathImpl("repo1", "ant"));
-        assertEquals(count, 3);
-    }
-
-    public void countRepoFilesAndFoldersUnderNonExistentRepo() throws VfsException {
-        int count = fileService.getNodesCount(new RepoPathImpl("repoXXX", ""));
-        assertEquals(count, 0, "Dummy repo name");
-    }
-
-    public void getSha1BadChecksums() throws Exception {
-        List<FileInfo> files = fileService.searchFilesWithBadChecksum(ChecksumType.sha1);
-        assertNotNull(files);
-        assertEquals(files.size(), 1, "Expected 1 bad SHA-1 checksum");
-        FileInfo file = files.get(0);
-        assertEquals(file.getName(), "badsha1.jar", "Expected file name to be badsha1.jar");
-        assertFalse(file.getChecksumsInfo().getChecksumInfo(ChecksumType.sha1).checksumsMatch(),
-                "SHA-1 checksums should not match");
-    }
-
-    public void getMd5BadChecksums() throws Exception {
-        List<FileInfo> files = fileService.searchFilesWithBadChecksum(ChecksumType.md5);
-        assertNotNull(files);
-        assertEquals(files.size(), 1, "Expected 1 bad MD5 checksum");
-        FileInfo file = files.get(0);
-        assertEquals(file.getName(), "badmd5.jar", "Expected file name to be badmd5.jar");
-        assertFalse(file.getChecksumsInfo().getChecksumInfo(ChecksumType.md5).checksumsMatch(),
-                "MD5 checksums should not match");
-    }
-
-    public void loadFolderUnderRoot() throws Exception {
-        RepoPathImpl repoPath = new RepoPathImpl("repo1", "ant");
-        FolderInfo folderInfo = (FolderInfo) fileService.loadItem(repoPath);
-        assertNotNull(folderInfo);
-        assertEquals(folderInfo.getRepoPath(), repoPath);
-        assertEquals(folderInfo.getCreated(), 1340283204448L);
-        assertEquals(folderInfo.getCreatedBy(), "yossis-1");
-        assertEquals(folderInfo.getLastModified(), 1340283205448L);
-        assertEquals(folderInfo.getModifiedBy(), "yossis-2");
-        assertEquals(folderInfo.getLastUpdated(), 1340283205448L);
-    }
-
-    public void loadFolder() throws Exception {
-        RepoPathImpl repoPath = new RepoPathImpl("repo1", "ant/ant");
-        FolderInfo folderInfo = (FolderInfo) fileService.loadItem(repoPath);
-        assertNotNull(folderInfo);
-        assertEquals(folderInfo.getRepoPath(), repoPath);
-        assertEquals(folderInfo.getCreated(), 1340283204450L);
-        assertEquals(folderInfo.getCreatedBy(), "yossis-1");
-        assertEquals(folderInfo.getLastModified(), 1340283204450L);
-        assertEquals(folderInfo.getModifiedBy(), "yossis-3");
-        assertEquals(folderInfo.getLastUpdated(), 1340283214450L);
-    }
-
-    public void loadItemById() throws Exception {
-        ItemInfo itemInfo = fileService.loadItem(4);
-        assertNotNull(itemInfo);
-        RepoPathImpl repoPath = new RepoPathImpl("repo1", "ant/ant/1.5");
-        assertEquals(itemInfo.getRepoPath(), repoPath);
-    }
-
-    @Test(expectedExceptions = VfsItemNotFoundException.class)
-    public void loadNonExistentById() throws Exception {
-        fileService.loadItem(47483);
-    }
-
-    /*
-    @Test(expectedExceptions = FolderExpectedException.class)
-    public void loadFileWithFolderPath() throws Exception {
-        RepoPathImpl repoPath = new RepoPathImpl("repo1", "ant/ant/1.5");
-        fileService.loadFile(repoPath);
-    }
-    */
-
-    public void loadChildren() throws Exception {
-        List<ItemInfo> children = fileService.loadChildren(new RepoPathImpl("repo1", ""));
-        assertNotNull(children);
-        assertEquals(children.size(), 2, "Expected 2 direct children but got: " + children);
-    }
-
-    @Test(enabled = false, expectedExceptions = VfsItemNotFoundException.class)
-    public void loadChildrenPathNotFound() throws Exception {
-        fileService.loadChildren(new RepoPathImpl("repoYYY", ""));
-    }
-
-    @Test(enabled = false, expectedExceptions = FolderExpectedException.class)
-    public void loadChildrenOfFile() throws Exception {
-        fileService.loadChildren(new RepoPathImpl("repo1", "ant/ant/1.5/ant-1.5.jar"));
-    }
-
-    @Test(expectedExceptions = VfsItemNotFoundException.class)
-    public void loadNonExistentFolder() throws Exception {
-        fileService.loadItem(new RepoPathImpl("repoXXX", "ant"));
-    }
-
-    public void createFolder() throws Exception {
-        FolderInfoImpl folderSave = new FolderInfoImpl(new RepoPathImpl("repo1", "new/folder"));
-        fileService.createFolder(folderSave);
-        RepoPathImpl repoPath = new RepoPathImpl("repo1", "new/folder");
-        FolderInfo folderLoaded = (FolderInfo) fileService.loadItem(repoPath);
-        assertNotNull(folderLoaded);
-        assertEquals(folderSave, folderLoaded);
-    }
-
-    @Test(dependsOnMethods = "createFolder")
-    public void deleteFolderById() throws Exception {
-        RepoPathImpl folderRepoPath = new RepoPathImpl("repo1", "new/folder");
-        VfsItem item = fileService.loadVfsItem(null, folderRepoPath);
-        boolean deleted = fileService.deleteItem(item.getId());
-        assertTrue(deleted);
-        assertFalse(fileService.exists(folderRepoPath));
-    }
-
-    public void deleteNonExistentItem() throws Exception {
-        boolean deleted = fileService.deleteItem(89894);
-        assertFalse(deleted);
-    }
-
-    public void itemExists() throws VfsException {
-        assertTrue(fileService.exists(new RepoPathImpl("repo1", "org")));
-    }
-
-    public void itemNotExists() throws VfsException {
-        assertFalse(fileService.exists(new RepoPathImpl("repo1", "nosuchfile")));
-    }
-
-    public void itemExistsRepoRoot() throws VfsException {
-        assertTrue(fileService.exists(new RepoPathImpl("repo1", "")));
-    }
-
-    public void nodeIdRoot() {
-        assertEquals(fileService.getNodeId(new RepoPathImpl("repo2", "")), 500);
-    }
-
-    public void nodeIdNoSuchNode() {
-        assertEquals(fileService.getNodeId(new RepoPathImpl("repo2", "no/folder")), DbService.NO_DB_ID);
-    }
-
-    public void nodeSha1OfFile() {
-        assertEquals(fileService.getNodeSha1(new RepoPathImpl("repo2", "org/jfrog/test/test.jar")),
-                "dcab88fc2a043c2479a6de676a2f8179e9ea2167");
-    }
-
-    public void nodeSha1NotExist() {
-        assertNull(fileService.getNodeSha1(new RepoPathImpl("repo2", "no/folder")));
-    }
-
-    public void nodeSha1OfFolder() {
-        assertTrue(fileService.exists(new RepoPathImpl("repo2", "org")));
-        assertNull(fileService.getNodeSha1(new RepoPathImpl("repo2", "org")));
-    }
-
-    public void searchGrandchildPoms() {
-        List<FileInfo> poms = fileService.searchGrandchildPoms(new RepoPathImpl("repo2", "org/jfrog"));
-        assertNotNull(poms);
-        assertEquals(poms.size(), 1, "Expected 1 pom but got: " + poms);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/FileServiceRepoStorageSummaryTest.java b/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/FileServiceRepoStorageSummaryTest.java
deleted file mode 100644
index c9922f5..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/FileServiceRepoStorageSummaryTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.itest.service;
-
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.artifactory.storage.fs.repo.RepoStorageSummary;
-import org.artifactory.storage.fs.service.FileService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.util.Set;
-
-import static org.fest.assertions.Assertions.assertThat;
-
-/**
- * Low level integration tests for the repo summary in the file service.
- *
- * @author Yossi Shaul
- */
- at Test
-public class FileServiceRepoStorageSummaryTest extends DbBaseTest {
-
-    @Autowired
-    private FileService fileService;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/nodes-summary.sql");
-    }
-
-    public void testSummary() {
-        Set<RepoStorageSummary> summaries = fileService.getRepositoriesStorageSummary();
-        assertThat(summaries).isNotEmpty().hasSize(3).containsOnly(
-                new RepoStorageSummary("repo1", 6, 4, 10),
-                new RepoStorageSummary("repo2", 4, 4, 100),
-                new RepoStorageSummary("repo3", 0, 0, 0)   // empty repository
-        );
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/FileServiceSpecialCharsTest.java b/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/FileServiceSpecialCharsTest.java
deleted file mode 100644
index 8b38b49..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/FileServiceSpecialCharsTest.java
+++ /dev/null
@@ -1,191 +0,0 @@
-package org.artifactory.storage.db.fs.itest.service;
-
-import com.google.common.collect.Sets;
-import com.sun.xml.internal.messaging.saaj.util.ByteInputStream;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.model.xstream.fs.FileInfoImpl;
-import org.artifactory.model.xstream.fs.FolderInfoImpl;
-import org.artifactory.storage.binstore.service.BinaryInfo;
-import org.artifactory.storage.binstore.service.BinaryService;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.artifactory.storage.fs.service.FileService;
-import org.artifactory.util.PathValidator;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.nio.file.InvalidPathException;
-import java.util.HashSet;
-
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertTrue;
-
-/**
- * Integration test for special characters repo paths saving.
- *
- * @author Shay Yaakov
- * @see PathValidator
- */
- at Test
-public class FileServiceSpecialCharsTest extends DbBaseTest {
-
-    @Autowired
-    private FileService fileService;
-
-    @Autowired
-    private BinaryService binaryService;
-
-    private String sha1;
-
-    @BeforeClass
-    void insertBinaryEntry() throws IOException {
-        bindDummyContext();
-        try {
-            // Create a dummy binary entry for testing file creation
-            BinaryInfo binaryInfo = binaryService.addBinary(new ByteInputStream(new byte[]{1, 2, 3}, 3));
-            sha1 = binaryInfo.getSha1();
-        } finally {
-            unbindDummyContext();
-        }
-    }
-
-    public void createFolderValidChars() {
-        createFolder("~`@#$%^&()-+{}[];.+");
-        createFolder("a;nt/&ant(#)-junit{1}/[2]1.6.5~");
-        createFolder("ca/juliusd  avies/not-y$t-commons-ssl/&0.3.9/&n!t-yet-comm#ns-ssl-0.3.;.()%&r");
-    }
-
-    public void createFileValidChars() {
-        createFile("log4j/log4j/1.2.9/log4j-1.2.9.jar.md5");
-        createFile("javassist/javassist/3.4.GA/javassist-3.4.GA.jar.sha1");
-        createFile("rome/rome/0.9/rome-0.9.pom.tmp.sha1.tmp");
-        createFile(".index");
-        createFile(".index/");
-        createFile(".index/nexus-maven-repository-index.gz");
-        createFile(")/(& ^%$#. {}()[]+/~");
-    }
-
-    public void rootRepo() {
-        createFolder("");
-    }
-
-    public void invalidAllSpaces() {
-        createFile("   ");
-        createFolder("              ");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void invalidSingleColon() {
-        createFile(":");
-        createFolder(":");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void invalidSingleAmpersand() {
-        createFile("&");
-        createFolder("&");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void invalidSingleDot() {
-        createFile(".");
-        createFolder(".");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void invalidSingleDotDot() {
-        createFile("..");
-        createFolder("..");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void invalidDot() {
-        createFile("org/antlr/./3.4/antlr-master-3.4");
-        createFolder("org/antlr/./3.4/antlr-master-3.4");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void invalidDotDot() {
-        createFile("javacvs/javacvs/../javacvs-atlassian-20080407.jar.sha1");
-        createFolder("msv/msv/../msv-20020414");
-    }
-
-    @Test
-    public void validCarretLeft() {
-        createFile("javacvs/javacvs/javacvs-at<lassian-20080407.jar.sha1");
-        createFolder("msv/msv/msv-<20020414");
-    }
-
-    @Test
-    public void validCarretRight() {
-        createFile("edu/ucar/netcdf/>4.2-min");
-        createFolder("edu/ucar/netcdf4>.2-min");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void illegalQuestionMark() {
-        createFile("edu/ucar/ne?tcdf/4.2-min");
-        createFolder("edu/ucar?/netcdf4.2-min");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void illegalQuotationMark() {
-        createFile("vxcvxv\"");
-        createFolder("/vxcvxcv/af.asd/asdasdw\"sss\"df.jar");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void illegalPipe() {
-        createFile("bbb/ccc|cccc/df.jar");
-        createFolder("fold|er");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void illegalStar() {
-        createFile("ddd**ddd");
-        createFolder("*");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void illegalColon() {
-        createFile("jaxen/jaxen/1.1.:1/jaxen-1.1.1.pom");
-        createFolder("jaxen/jaxen/|1.1.1");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void invalidSpaceBeforeSlash() {
-        createFile("sdfsdfsdf  /sdgfdfg.sdfd");
-        createFolder("bvsfg/sdfsfew/sdfsdf  /");
-    }
-
-    @Test(expectedExceptions = InvalidPathException.class)
-    public void invalidSpaceAfterSlash() {
-        createFile("vvc/cccx/sdsd/ cvcv/");
-        createFolder("asdasd/aserwe/dfhgc/bv/ sdfsdf/dfsdf");
-    }
-
-    private void createFolder(String path) {
-        FolderInfoImpl folderSave = new FolderInfoImpl(new RepoPathImpl("repo1", path));
-        long folderId = fileService.createFolder(folderSave);
-        assertTrue(fileService.exists(folderSave.getRepoPath()));
-        ItemInfo itemInfo = fileService.loadItem(folderSave.getRepoPath());
-        assertNotNull(itemInfo);
-        assertTrue(itemInfo.isFolder());
-        assertTrue(fileService.deleteItem(folderId));
-    }
-
-    private void createFile(String path) {
-        HashSet<ChecksumInfo> checksums = Sets.newHashSet(new ChecksumInfo(ChecksumType.sha1, sha1, sha1));
-
-        FileInfoImpl fileSave = new FileInfoImpl(new RepoPathImpl("repo1", path));
-        fileSave.setChecksums(checksums);
-        long fileId = fileService.createFile(fileSave);
-        assertTrue(fileService.exists(fileSave.getRepoPath()));
-        assertNotNull(fileService.loadItem(fileSave.getRepoPath()));
-        assertTrue(fileService.deleteItem(fileId));
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/NodeMetaInfoServiceImplTest.java b/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/NodeMetaInfoServiceImplTest.java
deleted file mode 100644
index e2410aa..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/NodeMetaInfoServiceImplTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.itest.service;
-
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.storage.db.fs.service.NodeMetaInfoServiceImpl;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.artifactory.storage.fs.VfsException;
-import org.artifactory.storage.fs.service.ItemMetaInfo;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.sql.SQLException;
-
-import static org.testng.Assert.*;
-
-/**
- * DB Tests the {@link org.artifactory.storage.db.fs.service.NodeMetaInfoServiceImpl}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class NodeMetaInfoServiceImplTest extends DbBaseTest {
-
-    @Autowired
-    private NodeMetaInfoServiceImpl nodeMetaService;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/nodes-for-service.sql");
-    }
-
-    public void hasNodeMetadata() throws Exception {
-        assertTrue(nodeMetaService.hasNodeMetadata(new RepoPathImpl("repo1", "org/yossis")));
-    }
-
-    public void hasNodeMetadataNodeWithNoProps() throws Exception {
-        assertFalse(nodeMetaService.hasNodeMetadata(new RepoPathImpl("repo2", "")));
-    }
-
-    public void getNodeMetadata() throws SQLException {
-        ItemMetaInfo metaInfo = nodeMetaService.getNodeMetaInfo(new RepoPathImpl("repo1", "org/yossis"));
-        assertNotNull(metaInfo);
-        assertEquals(metaInfo.getPropsModified(), 1340286203121L);
-        assertEquals(metaInfo.getPropsModifiedBy(), "yoyo");
-    }
-
-    public void getNodeMetadataNoSuchNode() throws SQLException {
-        assertNull(nodeMetaService.getNodeMetaInfo(new RepoPathImpl("repo7", "no/item/here")));
-    }
-
-    public void getNodeMetadataNoMetadata() throws SQLException {
-        assertNull(nodeMetaService.getNodeMetaInfo(new RepoPathImpl("repo2", "")));
-    }
-
-    public void insertMetadata() throws SQLException {
-        long time = System.currentTimeMillis();
-        ItemMetaInfo toInsert = new ItemMetaInfo(time, "me");
-        // insert new
-        nodeMetaService.createOrUpdateNodeMetaInfo(6, toInsert);
-        ItemMetaInfo fromDb = nodeMetaService.getNodeMetaInfo(new RepoPathImpl("repo1", "org"));
-        assertTrue(EqualsBuilder.reflectionEquals(toInsert, fromDb));
-
-        // update existing
-        ItemMetaInfo toUpdate = new ItemMetaInfo(time + 1000, "another");
-        nodeMetaService.createOrUpdateNodeMetaInfo(6, toUpdate);
-        fromDb = nodeMetaService.getNodeMetaInfo(new RepoPathImpl("repo1", "org"));
-        assertTrue(EqualsBuilder.reflectionEquals(toUpdate, fromDb));
-    }
-
-    @Test(expectedExceptions = VfsException.class)
-    public void insertMetadataNonExistentNode() throws SQLException {
-        nodeMetaService.createOrUpdateNodeMetaInfo(8989, new ItemMetaInfo(System.currentTimeMillis(), "me"));
-    }
-
-    public void deleteMetadata() throws SQLException {
-        RepoPath pathWithMeta = new RepoPathImpl("repo1", "ant/ant/1.5/ant-1.5.jar");
-        assertTrue(nodeMetaService.hasNodeMetadata(pathWithMeta));
-        nodeMetaService.deleteMetaInfo(pathWithMeta);
-        assertFalse(nodeMetaService.hasNodeMetadata(pathWithMeta));
-    }
-
-    public void deleteMetadataNotExist() throws SQLException {
-        RepoPath pathWithNoMeta = new RepoPathImpl("repo2", "org/jfrog/test/test2.jar");
-        assertFalse(nodeMetaService.hasNodeMetadata(pathWithNoMeta));
-        nodeMetaService.deleteMetaInfo(pathWithNoMeta);
-        assertFalse(nodeMetaService.hasNodeMetadata(pathWithNoMeta));
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/StatsServiceImplTest.java b/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/StatsServiceImplTest.java
deleted file mode 100644
index 4180bbc..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/StatsServiceImplTest.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.itest.service;
-
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.MutableStatsInfo;
-import org.artifactory.fs.StatsInfo;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.artifactory.storage.fs.service.StatsService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.util.ReflectionTestUtils;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.sql.SQLException;
-
-import static org.testng.Assert.*;
-
-/**
- * Integration tests for {@link org.artifactory.storage.fs.service.StatsService}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class StatsServiceImplTest extends DbBaseTest {
-
-    @Autowired
-    private StatsService statsService;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/nodes-for-service.sql");
-    }
-
-    @Test
-    public void getStatsFileWithStats() {
-        StatsInfo stats = statsService.getStats(new RepoPathImpl("repo1", "ant/ant/1.5/ant-1.5.jar"));
-        assertNotNull(stats);
-
-        assertEquals(stats.getDownloadCount(), 2);
-        assertEquals(stats.getLastDownloaded(), 1340283207850L);
-        assertEquals(stats.getLastDownloadedBy(), "ariels");
-
-        assertEquals(stats.getRemoteDownloadCount(), 3);
-        assertEquals(stats.getRemoteLastDownloaded(), 1340283207853L);
-        assertEquals(stats.getRemoteLastDownloadedBy(), "michaelp");
-    }
-
-    public void getStatsFileWithNoStats() {
-        assertNull(statsService.getStats(new RepoPathImpl("repo2", "org/jfrog/test/test.jar")));
-    }
-
-    public void getStatsFolder() {
-        assertNull(statsService.getStats(new RepoPathImpl("repo2", "org")));
-    }
-
-    public void getStatsNonExistingItem() {
-        assertNull(statsService.getStats(new RepoPathImpl("repo2", "no/such/item")));
-    }
-
-
-    public void hasStatsFileWithStats() throws SQLException {
-        assertTrue(statsService.hasStats(new RepoPathImpl("repo1", "ant/ant/1.5/ant-1.5.jar")));
-    }
-
-    public void hasStatsFileWithoutStats() throws SQLException {
-        assertFalse(statsService.hasStats(new RepoPathImpl("repo2", "org/jfrog/test/test.jar")));
-    }
-
-    public void hasStatsFolder() throws SQLException {
-        assertFalse(statsService.hasStats(new RepoPathImpl("repo2", "org")), "Folders don't have stats");
-    }
-
-    public void hasStatsNonExistentPath() throws SQLException {
-        assertFalse(statsService.hasStats(new RepoPathImpl("repo2", "no/such/path")));
-    }
-
-    @Test(dependsOnMethods = "getStatsFileWithNoStats")
-    public void fileDownloadedOnFileWithNoStats() {
-        RepoPathImpl filePath = new RepoPathImpl("repo2", "org/jfrog/test/test.jar");
-        long lastDownloaded = System.currentTimeMillis();
-        statsService.fileDownloaded(filePath, "talias", lastDownloaded, false);
-
-        StatsInfo stats = statsService.getStats(filePath);
-        assertNotNull(stats);
-        assertEquals(stats.getDownloadCount(), 1);
-        assertEquals(stats.getLastDownloaded(), lastDownloaded);
-        assertEquals(stats.getLastDownloadedBy(), "talias");
-    }
-
-    @Test(dependsOnMethods = "fileDownloadedOnFileWithNoStats")
-    public void fileDownloadedOnFileWithStats() {
-        RepoPathImpl filePath = new RepoPathImpl("repo2", "org/jfrog/test/test.jar");
-        long lastDownloaded = System.currentTimeMillis() + 2000;
-        statsService.fileDownloaded(filePath, "ariels", lastDownloaded, false);
-
-        StatsInfo stats = statsService.getStats(filePath);
-        assertNotNull(stats);
-        assertEquals(stats.getDownloadCount(), 2);
-        assertEquals(stats.getLastDownloaded(), lastDownloaded);
-        assertEquals(stats.getLastDownloadedBy(), "ariels");
-    }
-
-    @Test(dependsOnMethods = "getStatsFileWithStats")
-    public void fileDownloadedRemotelyOnFileWithStats() {
-        RepoPathImpl repoPath = new RepoPathImpl("repo1", "ant/ant/1.5/ant-1.5.jar");
-        long lastDownloaded = System.currentTimeMillis() + 2000;
-        String origin="myhost.com";
-        String path="myhost-a.com->myhost-b.com->myhost-c.com";
-
-        statsService.fileDownloadedRemotely(origin, path, repoPath, "remoteUser", lastDownloaded, 7);
-
-        StatsInfo stats = statsService.getStats(new RepoPathImpl("repo1", "ant/ant/1.5/ant-1.5.jar"));
-
-        assertNotNull(stats);
-        assertEquals(stats.getRemoteDownloadCount(), 10);
-        assertEquals(stats.getRemoteLastDownloaded(), lastDownloaded);
-        assertEquals(stats.getRemoteLastDownloadedBy(), "remoteUser");
-    }
-
-    public void fileDownloadedOnNonExistingItem() {
-        RepoPathImpl filePath = new RepoPathImpl("repo2", "no/such/item.jhk");
-        statsService.fileDownloaded(filePath, "ariels", System.currentTimeMillis(), false);
-
-        // file downloaded events are not checked against the database and the getStats will return the cached result
-        StatsInfo stats = statsService.getStats(filePath);
-        assertNotNull(stats);
-        assertTrue(statsService.hasStats(filePath));
-
-        // but the db should return null
-        StatsInfo statsFromDb = ReflectionTestUtils.invokeMethod(statsService, "getStatsFromStorage", filePath);
-        assertNull(statsFromDb);
-
-        // and after flushing the events from memory, getStats should also return null
-        ReflectionTestUtils.invokeMethod(statsService, "flushStats");
-        assertNull(statsService.getStats(filePath), "No stats for no-existent file expected after flush");
-        assertFalse(statsService.hasStats(filePath));
-    }
-
-    public void setStatsOnFileWithoutStats() {
-        RepoPathImpl filePath = new RepoPathImpl("repo2", "org/jfrog/test/test2.pom");
-        assertNull(statsService.getStats(filePath));
-
-        long lastDownloaded = System.currentTimeMillis();
-        MutableStatsInfo statsInfo = InfoFactoryHolder.get().createStats();
-        statsInfo.setDownloadCount(888);
-        statsInfo.setLastDownloaded(lastDownloaded);
-        statsInfo.setLastDownloadedBy("yossis");
-        statsService.setStats(505, statsInfo);
-
-        StatsInfo stats = statsService.getStats(filePath);
-        assertNotNull(stats);
-        assertEquals(stats.getDownloadCount(), 888);
-        assertEquals(stats.getLastDownloaded(), lastDownloaded);
-        assertEquals(stats.getLastDownloadedBy(), "yossis");
-    }
-
-    @Test(dependsOnMethods = "setStatsOnFileWithoutStats")
-    public void setStatsOnFileWithStats() {
-        RepoPathImpl filePath = new RepoPathImpl("repo2", "org/jfrog/test/test2.pom");
-        assertNotNull(statsService.getStats(filePath));
-
-        long lastDownloaded = System.currentTimeMillis() + 3000;
-        MutableStatsInfo statsInfo = InfoFactoryHolder.get().createStats();
-        statsInfo.setDownloadCount(999);
-        statsInfo.setLastDownloaded(lastDownloaded);
-        statsInfo.setLastDownloadedBy("talias");
-        statsService.setStats(505, statsInfo);
-
-        StatsInfo stats = statsService.getStats(filePath);
-        assertNotNull(stats);
-        assertEquals(stats.getDownloadCount(), 999);
-        assertEquals(stats.getLastDownloaded(), lastDownloaded);
-        assertEquals(stats.getLastDownloadedBy(), "talias");
-    }
-
-    @Test(dependsOnMethods = "setStatsOnFileWithStats")
-    public void deleteStatsOnFileWithStats() {
-        RepoPathImpl filePath = new RepoPathImpl("repo2", "org/jfrog/test/test2.pom");
-        assertNotNull(statsService.getStats(filePath));
-
-        boolean deleted = statsService.deleteStats(505);
-        assertTrue(deleted);
-        assertNull(statsService.getStats(filePath));
-    }
-
-    @Test(dependsOnMethods = "deleteStatsOnFileWithStats")
-    public void deleteStatsOnFileWithoutStats() {
-        assertFalse(statsService.deleteStats(505), "Stats already deleted earlier");
-    }
-
-    public void deleteStatsOnNonExistingNode() {
-        assertFalse(statsService.deleteStats(64736));
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/TasksServiceImplTest.java b/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/TasksServiceImplTest.java
deleted file mode 100644
index bc46a84..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/TasksServiceImplTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.itest.service;
-
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.artifactory.storage.fs.service.TasksService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.util.Set;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the {@link org.artifactory.storage.fs.service.TasksService}
- *
- * @author Yossi Shaul
- */
- at Test
-public class TasksServiceImplTest extends DbBaseTest {
-
-    @Autowired
-    private TasksService tasksService;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/nodes-for-service.sql");
-    }
-
-    public void getIndexTasks() {
-        Set<RepoPath> checksumsToIndex = tasksService.getIndexTasks();
-        assertNotNull(checksumsToIndex);
-        assertEquals(checksumsToIndex.size(), 2);
-        assertTrue(checksumsToIndex.contains(InternalRepoPathFactory.createRepoPath("repo1:ant/ant/1.5/ant-1.5.jar")));
-        assertTrue(
-                checksumsToIndex.contains(InternalRepoPathFactory.createRepoPath("reponone:ant/ant/1.5/ant-1.5.jar")));
-    }
-
-    public void hasIndexTask() {
-        assertTrue(tasksService.hasIndexTask(InternalRepoPathFactory.createRepoPath("repo1:ant/ant/1.5/ant-1.5.jar")));
-    }
-
-    @Test(dependsOnMethods = "getIndexTasks")
-    public void addIndexTask() {
-        RepoPath repoPath = InternalRepoPathFactory.createRepoPath("repo2:test");
-        assertFalse(tasksService.hasIndexTask(repoPath));
-        tasksService.addIndexTask(repoPath);
-        assertTrue(tasksService.hasIndexTask(repoPath));
-    }
-
-    @Test(dependsOnMethods = "addIndexTask")
-    public void removeIndexTask() {
-        assertTrue(tasksService.removeIndexTask(InternalRepoPathFactory.createRepoPath("repo2:test")));
-        assertFalse(tasksService.hasIndexTask(InternalRepoPathFactory.createRepoPath("repo2:test")));
-    }
-
-    @Test(dependsOnMethods = "hasIndexTask")
-    public void removeIndexTaskByRepoPath() {
-        assertTrue(
-                tasksService.removeIndexTask(InternalRepoPathFactory.createRepoPath("repo1:ant/ant/1.5/ant-1.5.jar")));
-    }
-
-    public void removeIndexTaskByRepoPathNotExist() {
-        assertFalse(tasksService.removeIndexTask(InternalRepoPathFactory.createRepoPath("nosuch:path.txt")));
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/WatchesServiceImplTest.java b/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/WatchesServiceImplTest.java
deleted file mode 100644
index e5302d0..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/fs/itest/service/WatchesServiceImplTest.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.itest.service;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Multimap;
-import org.artifactory.fs.WatcherInfo;
-import org.artifactory.fs.WatchersInfo;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.model.xstream.fs.WatcherImpl;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.storage.db.fs.entity.Watch;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.artifactory.storage.fs.service.WatchesService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.util.ReflectionUtils;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.lang.reflect.Method;
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-/**
- * @author Yossi Shaul
- */
- at Test
-public class WatchesServiceImplTest extends DbBaseTest {
-
-    @Autowired
-    private WatchesService watchesService;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/nodes-for-service.sql");
-    }
-
-    public void getWatchesNodeWithWatches() {
-        WatchersInfo watches = watchesService.getWatches(new RepoPathImpl("repo1", "ant/ant/1.5/ant-1.5.jar"));
-
-        assertEquals(watches.getWatchers().size(), 1);
-        WatcherInfo watch = watches.getWatcher("scott");
-        assertNotNull(watch);
-        assertEquals(watch.getUsername(), "scott");
-        assertEquals(watch.getWatchingSinceTime(), 1340286203555L);
-    }
-
-    public void getWatchesNodeWithMultiWatches() {
-        WatchersInfo watches = watchesService.getWatches(new RepoPathImpl("repo1", "org/yossis"));
-        assertEquals(watches.getWatchers().size(), 2);
-    }
-
-    public void getWatchesNodeWithNone() {
-        assertEquals(watchesService.getWatches(new RepoPathImpl("repo1", "ant")).getWatchers().size(), 0);
-    }
-
-    public void getWatchesNodeNotExist() {
-        assertEquals(watchesService.getWatches(new RepoPathImpl("repo1", "not/exists/bla")).getWatchers().size(), 0);
-    }
-
-    public void createWatch() {
-        RepoPathImpl repoPath = new RepoPathImpl("repo1", "org");
-        assertEquals(watchesService.getWatches(repoPath).getWatchers().size(), 0);
-        long since = System.currentTimeMillis();
-        watchesService.addWatch(6, new WatcherImpl("adi", since));
-
-        WatchersInfo watches = watchesService.getWatches(repoPath);
-        assertEquals(watches.getWatchers().size(), 1);
-        assertEquals(watches.getWatcher("adi").getUsername(), "adi");
-        assertEquals(watches.getWatcher("adi").getWatchingSinceTime(), since);
-    }
-
-    @Test(dependsOnMethods = "createWatch")
-    public void deleteWatches() {
-        int count = watchesService.deleteWatches(6);
-        assertEquals(count, 1);
-
-        assertEquals(watchesService.getWatches(new RepoPathImpl("repo1", "org")).getWatchers().size(), 0);
-    }
-
-    public void createWatches() {
-        RepoPathImpl repoPath = new RepoPathImpl("repo2", "");
-        assertEquals(watchesService.getWatches(repoPath).getWatchers().size(), 0);
-        long since = System.currentTimeMillis();
-        List<WatcherInfo> watches = Lists.<WatcherInfo>newArrayList(
-                new WatcherImpl("a", since), new WatcherImpl("b", since));
-        watchesService.addWatches(500, watches);
-
-        assertEquals(watchesService.getWatches(repoPath).getWatchers().size(), 2);
-    }
-
-    @SuppressWarnings("unchecked")
-    @Test(dependsOnMethods = "createWatches")
-    public void verifyCachePopulation() throws Exception {
-        Method method = ReflectionUtils.findMethod(watchesService.getClass(), "getWatchersCache");
-        ReflectionUtils.makeAccessible(method);
-        Multimap<RepoPath, Watch> cache = (Multimap<RepoPath, Watch>) ReflectionUtils.invokeMethod(method,
-                watchesService);
-
-        RepoPathImpl repoPath = new RepoPathImpl("repo2", "");
-        assertEquals(cache.get(repoPath).size(), 2);
-    }
-
-    public void deleteUserWatches() {
-        RepoPathImpl repoPath = new RepoPathImpl("repo2", "org/jfrog");
-        assertEquals(watchesService.deleteUserWatches(repoPath, "yossis"), 1);
-    }
-
-    public void deleteUserWatchesNoSuchUser() {
-        RepoPathImpl repoPath = new RepoPathImpl("repo2", "org/jfrog/test");
-        assertEquals(watchesService.deleteUserWatches(repoPath, "nouser"), 0);
-    }
-
-    public void deleteAllUserWatches() {
-        assertEquals(watchesService.deleteAllUserWatches("yoyo"), 3);
-    }
-
-    public void deleteAllUserWatchesNoSuchUser() {
-        assertEquals(watchesService.deleteAllUserWatches("nouser"), 0);
-    }
-
-    public void hasWatchesNodeWithWatches() {
-        assertTrue(watchesService.hasWatches(new RepoPathImpl("repo2", "org/jfrog/test")));
-    }
-
-    public void hasWatchesNodeWithoutWatches() {
-        assertFalse(watchesService.hasWatches(new RepoPathImpl("repo1", "ant/ant")));
-    }
-
-    public void hasWatchesNodeNotExist() {
-        assertFalse(watchesService.hasWatches(new RepoPathImpl("repo99", "ant/ant")));
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/fs/util/NodeUtilsTest.java b/storage/db/src/test/java/org/artifactory/storage/db/fs/util/NodeUtilsTest.java
deleted file mode 100644
index dfefd0d..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/fs/util/NodeUtilsTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.fs.util;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Unit tests for {@link org.artifactory.storage.db.fs.util.NodeUtils}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class NodeUtilsTest {
-
-    public void emptyPath() {
-        assertEquals(NodeUtils.getDepth(""), 0);
-    }
-
-    public void nullPath() {
-        assertEquals(NodeUtils.getDepth(""), 0);
-    }
-
-    public void noSlashesPath() {
-        assertEquals(NodeUtils.getDepth("elantris"), 1);
-    }
-
-    public void oneLevelPath() {
-        assertEquals(NodeUtils.getDepth("a/b"), 2);
-    }
-
-    public void simplePath() {
-        assertEquals(NodeUtils.getDepth("a/b/c"), 3);
-    }
-
-    public void trailingAndLeadingSlashesPath() {
-        assertEquals(NodeUtils.getDepth("//a/b/c/"), 3);
-    }
-
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/ha/entity/ArtifactoryServerTest.java b/storage/db/src/test/java/org/artifactory/storage/db/ha/entity/ArtifactoryServerTest.java
deleted file mode 100644
index 5ba19a8..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/ha/entity/ArtifactoryServerTest.java
+++ /dev/null
@@ -1,131 +0,0 @@
-package org.artifactory.storage.db.ha.entity;
-
-import org.apache.commons.codec.digest.DigestUtils;
-import org.artifactory.addon.ArtifactoryRunningMode;
-import org.artifactory.state.ArtifactoryServerState;
-import org.artifactory.storage.db.servers.model.ArtifactoryServer;
-import org.artifactory.storage.db.servers.model.ArtifactoryServerRole;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNull;
-
-/**
- * Date: 7/10/13 3:17 PM
- *
- * @author freds
- */
- at Test
-public class ArtifactoryServerTest {
-
-    public static final String SERVER_ID = DigestUtils.shaHex("test");
-    private static final String LICENSE_HASH = "aaffsdgdfgdffgdgddfgdfgdfgdfgdfgsvfsawui0";
-
-    public void basicArtifactoryServer() {
-        long lastHeartbeat = System.currentTimeMillis();
-        ArtifactoryServer test = new ArtifactoryServer(
-                SERVER_ID, 1000000L, "127.0.0.1:8080",
-                5700, ArtifactoryServerState.RUNNING, ArtifactoryServerRole.PRIMARY,
-                lastHeartbeat,
-                "3.0.1-test", 2, 3L, ArtifactoryRunningMode.OSS, LICENSE_HASH);
-        assertEquals(test.getServerId(), SERVER_ID);
-        assertEquals(test.getStartTime(), 1000000L);
-        assertEquals(test.getContextUrl(), "127.0.0.1:8080");
-        assertEquals(test.getServerState(), ArtifactoryServerState.RUNNING);
-        assertEquals(test.getServerRole(), ArtifactoryServerRole.PRIMARY);
-        assertEquals(test.getLastHeartbeat(), lastHeartbeat);
-        assertEquals(test.getArtifactoryVersion(), "3.0.1-test");
-        assertEquals(test.getArtifactoryRevision(), 2);
-        assertEquals(test.getArtifactoryRelease(), 3L);
-        assertEquals(test.getArtifactoryRunningMode(), ArtifactoryRunningMode.OSS);
-    }
-
-    public void maxNullArtifactoryServer() {
-        ArtifactoryServer test = new ArtifactoryServer(
-                SERVER_ID, 1000000L, null,
-                5700, ArtifactoryServerState.OFFLINE, ArtifactoryServerRole.STANDALONE,
-                1L, "2-t", 0, 0L, ArtifactoryRunningMode.HA, LICENSE_HASH);
-        assertEquals(test.getServerId(), SERVER_ID);
-        assertEquals(test.getStartTime(), 1000000L);
-        assertNull(test.getContextUrl());
-        assertEquals(test.getServerState(), ArtifactoryServerState.OFFLINE);
-        assertEquals(test.getServerRole(), ArtifactoryServerRole.STANDALONE);
-        assertEquals(test.getLastHeartbeat(), 1L);
-        assertEquals(test.getArtifactoryVersion(), "2-t");
-        assertEquals(test.getArtifactoryRevision(), 0);
-        assertEquals(test.getArtifactoryRelease(), 0L);
-        assertEquals(test.getArtifactoryRunningMode(), ArtifactoryRunningMode.HA);
-    }
-
-    public void maxNegArtifactoryServer() {
-        ArtifactoryServer test = new ArtifactoryServer(
-                SERVER_ID, 1000000L, null,
-                5700, ArtifactoryServerState.UNKNOWN, ArtifactoryServerRole.COPY,
-                1L, "3-t", -2, -3L, ArtifactoryRunningMode.OSS, LICENSE_HASH);
-        assertEquals(test.getServerId(), SERVER_ID);
-        assertEquals(test.getStartTime(), 1000000L);
-        assertNull(test.getContextUrl());
-        assertEquals(test.getServerState(), ArtifactoryServerState.UNKNOWN);
-        assertEquals(test.getServerRole(), ArtifactoryServerRole.COPY);
-        assertEquals(test.getLastHeartbeat(), 1L);
-        assertEquals(test.getArtifactoryVersion(), "3-t");
-        assertEquals(test.getArtifactoryRevision(), -2);
-        assertEquals(test.getArtifactoryRelease(), -3L);
-        assertEquals(test.getArtifactoryRunningMode(), ArtifactoryRunningMode.OSS);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = ".*serverId.*cannot.*null.*")
-    public void nullServerIdArtifactoryServer() {
-        new ArtifactoryServer(
-                null, 1000000L, "127.0.0.1:8080",
-                5700, ArtifactoryServerState.RUNNING, ArtifactoryServerRole.PRIMARY,
-                2L, "3.0.1-test", 2, 3L, ArtifactoryRunningMode.OSS, LICENSE_HASH);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = ".*serverId.*cannot.*empty.*")
-    public void emptyServerIdArtifactoryServer() {
-        new ArtifactoryServer(
-                " ", 1000000L, "127.0.0.1:8080",
-                5700, ArtifactoryServerState.RUNNING, ArtifactoryServerRole.PRIMARY,
-                2L, "3.0.1-test", 2, 3L, ArtifactoryRunningMode.OSS, LICENSE_HASH);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = ".*start time.*cannot.*zero.*")
-    public void zeroStartTimeArtifactoryServer() {
-        new ArtifactoryServer(
-                SERVER_ID, 0L, "127.0.0.1:8080",
-                5700, ArtifactoryServerState.RUNNING, ArtifactoryServerRole.PRIMARY,
-                2L, "3.0.1-test", 2, 3L, ArtifactoryRunningMode.OSS, LICENSE_HASH);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = ".*start time.*cannot.*negative.*")
-    public void negStartTimeArtifactoryServer() {
-        new ArtifactoryServer(
-                SERVER_ID, -3L, "127.0.0.1:8080",
-                5700, ArtifactoryServerState.RUNNING, ArtifactoryServerRole.PRIMARY,
-                2L, "3.0.1-test", 2, 3L, ArtifactoryRunningMode.OSS, LICENSE_HASH);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = ".*server state.*cannot.*null.*")
-    public void nullServerStateArtifactoryServer() {
-        new ArtifactoryServer(
-                SERVER_ID, 1000000L, "127.0.0.1:8080",
-                5700, null, ArtifactoryServerRole.PRIMARY,
-                2L, "3.0.1-test", 2, 3L, ArtifactoryRunningMode.OSS, LICENSE_HASH);
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class,
-            expectedExceptionsMessageRegExp = ".*role.*cannot.*null.*")
-    public void nullServerRoleArtifactoryServer() {
-        new ArtifactoryServer(
-                SERVER_ID, 1000000L, "127.0.0.1:8080",
-                5700, ArtifactoryServerState.UNKNOWN, null,
-                2L, "3.0.1-test", 2, 3L, ArtifactoryRunningMode.OSS, LICENSE_HASH);
-    }
-
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/ha/itest/dao/ArtifactoryServersDaoTest.java b/storage/db/src/test/java/org/artifactory/storage/db/ha/itest/dao/ArtifactoryServersDaoTest.java
deleted file mode 100644
index 5b4b9ca..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/ha/itest/dao/ArtifactoryServersDaoTest.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.ha.itest.dao;
-
-import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.artifactory.addon.ArtifactoryRunningMode;
-import org.artifactory.state.ArtifactoryServerState;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.artifactory.storage.db.servers.dao.ArtifactoryServersDao;
-import org.artifactory.storage.db.servers.model.ArtifactoryServer;
-import org.artifactory.storage.db.servers.model.ArtifactoryServerRole;
-import org.fest.assertions.Assertions;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.sql.SQLException;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the {@link org.artifactory.storage.db.servers.dao.ArtifactoryServersDao}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class ArtifactoryServersDaoTest extends DbBaseTest {
-
-    private static final String LICENSE_HASH = DigestUtils.shaHex("server") + "0";
-    private static final String SERVER_ID = DigestUtils.shaHex("id") + "0";
-    @Autowired
-    private ArtifactoryServersDao dao;
-
-    private final ArtifactoryServer sampleServer = new ArtifactoryServer(SERVER_ID, 1000000L,
-            "127.0.0.1", 5700, ArtifactoryServerState.RUNNING, ArtifactoryServerRole.STANDALONE,
-            System.currentTimeMillis(),
-            "3.0.1-test", 2, 3L, ArtifactoryRunningMode.OSS, LICENSE_HASH);
-
-    @BeforeClass
-    public void createServer() throws SQLException {
-        dao.createArtifactoryServer(sampleServer);
-    }
-
-    @Test()
-    public void hasServer() throws SQLException {
-        assertTrue(dao.hasArtifactoryServer(SERVER_ID));
-    }
-
-    public void hasServerNonExistingServer() throws SQLException {
-        assertFalse(dao.hasArtifactoryServer(DigestUtils.shaHex("nosuchserver")));
-    }
-
-    public void loadServer() throws SQLException {
-        ArtifactoryServer insertedServer = new ArtifactoryServer(DigestUtils.shaHex("create'n'load"), 1000000L,
-                "152.45.32.56", 5700, ArtifactoryServerState.RUNNING, ArtifactoryServerRole.STANDALONE,
-                System.currentTimeMillis(), "6.1", 2, 3L, ArtifactoryRunningMode.OSS, LICENSE_HASH);
-
-        dao.createArtifactoryServer(insertedServer);
-
-        ArtifactoryServer loadedServer = dao.getArtifactoryServer(DigestUtils.shaHex("create'n'load"));
-
-        assertTrue(EqualsBuilder.reflectionEquals(insertedServer, loadedServer), "Orig and copy differ");
-    }
-
-    @Test()
-    public void loadAllServers() throws SQLException {
-        Assertions.assertThat(dao.getAllArtifactoryServers()).isNotEmpty().contains(sampleServer);
-    }
-
-    public void updateServer() throws SQLException {
-        ArtifactoryServer server = new ArtifactoryServer(DigestUtils.shaHex("toupdate"), 1000000L,
-                "152.45.32.56", 5700, ArtifactoryServerState.RUNNING, ArtifactoryServerRole.PRIMARY,
-                System.currentTimeMillis(), "6.1", 2, 3L, ArtifactoryRunningMode.OSS, LICENSE_HASH);
-        dao.createArtifactoryServer(server);
-
-        ArtifactoryServer updatedServer = new ArtifactoryServer(DigestUtils.shaHex("toupdate"), 11000000L,
-                "152.45.32.57", 5700, ArtifactoryServerState.STOPPED, ArtifactoryServerRole.STANDALONE,
-                System.currentTimeMillis(), "6.2", 3, 2L, ArtifactoryRunningMode.OSS, LICENSE_HASH);
-
-        int updateCount = dao.updateArtifactoryServer(updatedServer);
-        assertEquals(updateCount, 1);
-
-        ArtifactoryServer serverFromDb = dao.getArtifactoryServer(server.getServerId());
-        assertTrue(EqualsBuilder.reflectionEquals(updatedServer, serverFromDb));
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/ha/itest/service/ArtifactoryServersServiceImplTest.java b/storage/db/src/test/java/org/artifactory/storage/db/ha/itest/service/ArtifactoryServersServiceImplTest.java
deleted file mode 100644
index be13e5e..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/ha/itest/service/ArtifactoryServersServiceImplTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.artifactory.storage.db.ha.itest.service;
-
-import org.artifactory.addon.ArtifactoryRunningMode;
-import org.artifactory.state.ArtifactoryServerState;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.artifactory.storage.db.servers.model.ArtifactoryServer;
-import org.artifactory.storage.db.servers.model.ArtifactoryServerRole;
-import org.artifactory.storage.db.servers.service.ArtifactoryServersServiceImpl;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-/**
- * Integration tests for {@link org.artifactory.storage.db.servers.service.ArtifactoryServersCommonService}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class ArtifactoryServersServiceImplTest extends DbBaseTest {
-
-    @Autowired
-    private ArtifactoryServersServiceImpl serversService;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/ha.sql");
-    }
-
-    public void testAllServers() {
-        List<ArtifactoryServer> allArtifactoryServers = serversService.getAllArtifactoryServers();
-        assertEquals(allArtifactoryServers.size(), 3);
-        for (int i = 1; i < 4; i++) {
-            String serverId = "" + i + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0";
-            ArtifactoryServer artifactoryServer = serversService.getArtifactoryServer(serverId);
-            assertNotNull(artifactoryServer, "Server with ID " + serverId + " not found!");
-            assertEquals(artifactoryServer.getStartTime(), 1234567890 + i);
-            assertEquals(artifactoryServer.getContextUrl(), "10.0.0." + i + ":" + i);
-            assertEquals(artifactoryServer.getLastHeartbeat(), 1234567890L + (long) i);
-            assertEquals(artifactoryServer.getArtifactoryVersion(), "3.1.0_0" + i);
-            assertEquals(artifactoryServer.getArtifactoryRevision(), 8844550 + i);
-            assertEquals(artifactoryServer.getArtifactoryRelease(), 1230L + (long) i);
-            assertEquals(artifactoryServer.getLicenseKeyHash(), "0123456789012345678901234567890123456789" + i);
-            switch (i) {
-                case 1:
-                    assertEquals(artifactoryServer.getServerState(), ArtifactoryServerState.RUNNING);
-                    assertEquals(artifactoryServer.getServerRole(), ArtifactoryServerRole.PRIMARY);
-                    assertEquals(artifactoryServer.getArtifactoryRunningMode(), ArtifactoryRunningMode.HA);
-                    break;
-                case 2:
-                    assertEquals(artifactoryServer.getServerState(), ArtifactoryServerState.STARTING);
-                    assertEquals(artifactoryServer.getServerRole(), ArtifactoryServerRole.MEMBER);
-                    assertEquals(artifactoryServer.getArtifactoryRunningMode(), ArtifactoryRunningMode.OSS);
-                    break;
-                case 3:
-                    assertEquals(artifactoryServer.getServerState(), ArtifactoryServerState.STOPPING);
-                    assertEquals(artifactoryServer.getServerRole(), ArtifactoryServerRole.COPY);
-                    assertEquals(artifactoryServer.getArtifactoryRunningMode(), ArtifactoryRunningMode.PRO);
-                    break;
-                default:
-                    fail("ID " + i + " does not exists!");
-            }
-        }
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/itest/CleanDatabase.java b/storage/db/src/test/java/org/artifactory/storage/db/itest/CleanDatabase.java
deleted file mode 100644
index 3290909..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/itest/CleanDatabase.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.itest;
-
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * This test just a convenient way to clean the database (calls the parent).
- * Enable to execute.
- *
- * @author Yossi Shaul
- */
- at Test(enabled = false)
-public class CleanDatabase extends DbBaseTest {
-
-    public void cleanDatabase() {
-        Assert.assertTrue(true, "Leave this method for the base class to do something");
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/itest/DbBaseTest.java b/storage/db/src/test/java/org/artifactory/storage/db/itest/DbBaseTest.java
deleted file mode 100644
index f04b30a..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/itest/DbBaseTest.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.itest;
-
-import ch.qos.logback.classic.util.ContextInitializer;
-import org.apache.commons.lang.RandomStringUtils;
-import org.artifactory.api.context.ArtifactoryContextThreadBinder;
-import org.artifactory.storage.StorageProperties;
-import org.artifactory.storage.db.DbServiceImpl;
-import org.artifactory.storage.db.spring.ArtifactoryTomcatDataSource;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.artifactory.test.TestUtils;
-import org.artifactory.util.ResourceUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.sql.Connection;
-import java.sql.SQLException;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Base class for the low level database integration tests.
- *
- * @author Yossi Shaul
- */
-//@TestExecutionListeners(TransactionalTestExecutionListener.class)
-//@Transactional
-//@TransactionConfiguration(defaultRollback = false)
- at Test(groups = "dbtest")
- at ContextConfiguration(locations = {"classpath:spring/db-test-context.xml"})
-public abstract class DbBaseTest extends AbstractTestNGSpringContextTests {
-
-    @Autowired
-    protected JdbcHelper jdbcHelper;
-
-    @Autowired
-    protected DbServiceImpl dbService;
-
-    @Autowired
-    @Qualifier("storageProperties")
-    protected StorageProperties storageProperties;
-
-    private ArtifactoryHomeBoundTest artifactoryHomeBoundTest;
-
-    private DummyArtifactoryContext dummyArtifactoryContext;
-
-    static {
-        // use the itest logback config
-        URL url = DbBaseTest.class.getClassLoader().getResource("logback-dbtest.xml");
-        if (url == null) {
-            throw new RuntimeException("Could not find logback-dbtest.xml");
-        }
-        System.setProperty(ContextInitializer.CONFIG_FILE_PROPERTY, url.getPath());
-    }
-
-    @BeforeClass
-    @Override
-    protected void springTestContextPrepareTestInstance() throws Exception {
-        artifactoryHomeBoundTest = createArtifactoryHomeTest();
-        artifactoryHomeBoundTest.bindArtifactoryHome();
-
-        super.springTestContextPrepareTestInstance();
-
-        dummyArtifactoryContext = new DummyArtifactoryContext(applicationContext);
-
-        try (Connection connection = jdbcHelper.getDataSource().getConnection()) {
-            DbTestUtils.refreshOrRecreateSchema(connection, storageProperties.getDbType());
-        }
-        TestUtils.invokeMethodNoArgs(dbService, "initializeIdGenerator");
-    }
-
-    @AfterClass
-    public void verifyDbResourcesReleased() throws IOException, SQLException {
-        // make sure there are no active connections
-        /*PoolingDataSource ds = (PoolingDataSource) jdbcHelper.getDataSource();
-        GenericObjectPool pool = TestUtils.getField(ds, "_pool", GenericObjectPool.class);
-        assertEquals(pool.getNumActive(), 0, "Found " + pool.getNumActive() + " active connections after test ended:\n"
-                + TestUtils.invokeMethodNoArgs(pool, "debugInfo"));*/
-        ArtifactoryTomcatDataSource ds = (ArtifactoryTomcatDataSource) jdbcHelper.getDataSource();
-        assertEquals(ds.getActiveConnectionsCount(), 0, "Found " + ds.getActiveConnectionsCount() +
-                " active connections after test ended");
-        artifactoryHomeBoundTest.unbindArtifactoryHome();
-    }
-
-    protected void addBean(Object bean, Class<?>... types) {
-        dummyArtifactoryContext.addBean(bean, types);
-    }
-
-    protected ArtifactoryHomeBoundTest createArtifactoryHomeTest() throws IOException {
-        return new ArtifactoryHomeBoundTest();
-    }
-
-    protected String randomMd5() {
-        return randomHex(32);
-    }
-
-    protected String randomSha1() {
-        return randomHex(40);
-    }
-
-    private String randomHex(int count) {
-        return RandomStringUtils.random(count, "abcdef0123456789");
-    }
-
-    @BeforeMethod
-    public void bindArtifactoryHome() {
-        artifactoryHomeBoundTest.bindArtifactoryHome();
-    }
-
-    @AfterMethod
-    public void unbindArtifactoryHome() {
-        artifactoryHomeBoundTest.unbindArtifactoryHome();
-    }
-
-    protected void importSql(String resourcePath) {
-        InputStream resource = ResourceUtils.getResource(resourcePath);
-        Connection con = null;
-        try {
-            con = jdbcHelper.getDataSource().getConnection();
-            DbUtils.executeSqlStream(con, resource);
-            // update the id generator
-            TestUtils.invokeMethodNoArgs(dbService, "initializeIdGenerator");
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        } finally {
-            DbUtils.close(con);
-        }
-    }
-
-    @BeforeMethod
-    public void bindDummyContext() {
-        ArtifactoryContextThreadBinder.bind(dummyArtifactoryContext);
-    }
-
-    @AfterMethod
-    public void unbindDummyContext() {
-        ArtifactoryContextThreadBinder.unbind();
-    }
-
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/itest/DbTestUtils.java b/storage/db/src/test/java/org/artifactory/storage/db/itest/DbTestUtils.java
deleted file mode 100644
index 74ccce6..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/itest/DbTestUtils.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.itest;
-
-import org.artifactory.storage.db.DbType;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.util.ResourceUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.sql.Connection;
-import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
-import java.sql.ResultSetMetaData;
-import java.sql.SQLException;
-import java.sql.Statement;
-
-/**
- * A utility class for integration tests to clean and setup the database
- *
- * @author Yossi Shaul
- */
-public class DbTestUtils {
-    private static final Logger log = LoggerFactory.getLogger(DbTestUtils.class);
-
-    /**
-     * A list of all the tables in the database
-     */
-    public static String[] tables = new String[]{
-            "db_properties", "artifactory_servers",
-            "stats_remote", "stats", "watches", "node_props", "node_meta_infos", "nodes",
-            "indexed_archives_entries", "archive_names", "archive_paths", "indexed_archives",
-            "binary_blobs", "binaries",
-            "aces", "acls", "users_groups", "groups", "user_props", "users",
-            "permission_target_repos", "permission_targets",
-            "configs", "tasks",
-            "module_props", "build_props", "build_jsons", "build_promotions",
-            "build_dependencies", "build_artifacts", "build_modules", "builds",
-            "unique_ids"
-    };
-
-    public static void refreshOrRecreateSchema(Connection con, DbType dbType) throws IOException, SQLException {
-        // to improve test speed, re-create the schema only if there's a missing table
-        boolean recreateSchema = isTableMissing(con);
-        if (recreateSchema) {
-            log.info("Recreating test database schema for database: {}", dbType);
-            dropAllExistingTables(con);
-            createSchema(con, dbType);
-        } else {
-            log.info("Deleting database tables data from database: {}", dbType);
-            deleteFromAllTables(con);
-        }
-    }
-
-    public static void dropAllExistingTables(Connection con) throws SQLException {
-        for (String table : tables) {
-            if (tableExists(table, con)) {
-                try (Statement statement = con.createStatement()) {
-                    statement.execute("DROP TABLE " + table);
-                }
-            }
-        }
-    }
-
-    private static void deleteFromAllTables(Connection con) throws SQLException {
-        for (String table : tables) {
-            try (Statement statement = con.createStatement()) {
-                statement.execute("DELETE FROM " + table);
-            }
-        }
-    }
-
-    public static boolean isTableMissing(Connection con) throws SQLException, IOException {
-        for (String table : tables) {
-            if (!tableExists(table, con)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public static int getColumnSize(Connection con, String tableName, String columnName) throws SQLException {
-        DatabaseMetaData metaData = con.getMetaData();
-        if (metaData.storesLowerCaseIdentifiers()) {
-            tableName = tableName.toLowerCase();
-            columnName = columnName.toLowerCase();
-        } else if (metaData.storesUpperCaseIdentifiers()) {
-            tableName = tableName.toUpperCase();
-            columnName = columnName.toUpperCase();
-        }
-
-        try(Statement statement = con.createStatement()) {
-            ResultSet resultSet = statement.executeQuery("SELECT * from " + tableName);
-            ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
-            int columnCount = resultSetMetaData.getColumnCount();
-            for (int i = 1; i <= columnCount; i++) {
-                if (resultSetMetaData.getColumnName(i).equals(columnName)) {
-                    return resultSetMetaData.getColumnDisplaySize(i);
-                }
-            }
-        }
-
-        return -1;
-    }
-
-    private static void createSchema(Connection con, DbType dbType) throws SQLException, IOException {
-        // read ddl from file and execute
-        DbUtils.executeSqlStream(con, getDbSchemaSql(dbType));
-    }
-
-    private static boolean tableExists(String tableName, Connection con) throws SQLException {
-        DatabaseMetaData metaData = con.getMetaData();
-        if (metaData.storesLowerCaseIdentifiers()) {
-            tableName = tableName.toLowerCase();
-        } else if (metaData.storesUpperCaseIdentifiers()) {
-            tableName = tableName.toUpperCase();
-        }
-        try (ResultSet rs = metaData.getTables(null, null, tableName, new String[]{"TABLE"})) {
-            boolean tableExists = rs.next();
-            return tableExists;
-        }
-    }
-
-    private static InputStream getDbSchemaSql(DbType dbType) {
-        String dbConfigDir = dbType.toString();
-        return ResourceUtils.getResource("/" + dbConfigDir + "/" + dbConfigDir + ".sql");
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/itest/DummyArtifactoryContext.java b/storage/db/src/test/java/org/artifactory/storage/db/itest/DummyArtifactoryContext.java
deleted file mode 100644
index a9f79cd..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/itest/DummyArtifactoryContext.java
+++ /dev/null
@@ -1,291 +0,0 @@
-package org.artifactory.storage.db.itest;
-
-import com.google.common.collect.Maps;
-import org.artifactory.addon.AddonType;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.ArtifactoryRunningMode;
-import org.artifactory.addon.OssAddonsManager;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.addon.ha.message.HaMessage;
-import org.artifactory.addon.ha.message.HaMessageTopic;
-import org.artifactory.addon.ha.semaphore.JVMSemaphoreWrapper;
-import org.artifactory.addon.ha.semaphore.SemaphoreWrapper;
-import org.artifactory.addon.smartrepo.SmartRepoAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.converters.ConverterManager;
-import org.artifactory.converters.VersionProvider;
-import org.artifactory.fs.StatsInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.common.ExportSettings;
-import org.artifactory.sapi.common.ImportSettings;
-import org.artifactory.security.props.auth.CacheWrapper;
-import org.artifactory.security.props.auth.SimpleCacheWrapper;
-import org.artifactory.spring.SpringConfigPaths;
-import org.artifactory.storage.db.servers.model.ArtifactoryServer;
-import org.mockito.Mockito;
-import org.springframework.context.ApplicationContext;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.Semaphore;
-
-/**
- * @author mamo
- */
-public class DummyArtifactoryContext implements ArtifactoryContext {
-    private ApplicationContext applicationContext;
-    private Map<Class<?>, Object> beans = Maps.newHashMap();
-
-    public DummyArtifactoryContext(ApplicationContext applicationContext) {
-        this.applicationContext = applicationContext;
-    }
-
-    public void addBean(Object bean, Class<?>... types) {
-        for (Class<?> type : types) {
-            beans.put(type, bean);
-        }
-    }
-    @Override
-    public CentralConfigService getCentralConfig() {
-        return null;
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public <T> T beanForType(Class<T> type) {
-        if (AddonsManager.class.equals(type)) {
-            return (T) new DummyOssAddonsManager();
-        }
-        if (type.equals(HaCommonAddon.class)) {
-            return (T) new DummyHaCommonAddon();
-        }
-        if (type.equals(RepositoryService.class)) {
-            return (T) Mockito.mock(RepositoryService.class);
-        }
-        if (type.equals(SmartRepoAddon.class)) {
-            return (T) new SmartRepoAddon(){
-
-                @Override
-                public boolean isDefault() {
-                    return false;
-                }
-
-                @Override
-                public boolean supportRemoteStats() {
-                    return true;
-                }
-
-                @Override
-                public void fileDownloadedRemotely(StatsInfo statsInfo, String origin, RepoPath repoPath) {
-
-                }
-            };
-        }
-        if (beans.containsKey(type)) {
-            return (T) beans.get(type);
-        }
-        return applicationContext.getBean(type);
-    }
-
-    @Override
-    public <T> T beanForType(String name, Class<T> type) {
-        return null;
-    }
-
-    @Override
-    public <T> Map<String, T> beansForType(Class<T> type) {
-        return null;
-    }
-
-    @Override
-    public Object getBean(String name) {
-        return applicationContext.getBean(name);
-    }
-
-    @Override
-    public RepositoryService getRepositoryService() {
-        return null;
-    }
-
-    @Override
-    public AuthorizationService getAuthorizationService() {
-        return null;
-    }
-
-    @Override
-    public long getUptime() {
-        return 0;
-    }
-
-    @Override
-    public ArtifactoryHome getArtifactoryHome() {
-        return null;
-    }
-
-    @Override
-    public String getContextId() {
-        return null;
-    }
-
-    @Override
-    public SpringConfigPaths getConfigPaths() {
-        return null;
-    }
-
-    @Override
-    public String getServerId() {
-        return null;
-    }
-
-    @Override
-    public boolean isOffline() {
-        return false;
-    }
-
-    @Override
-    public void setOffline() {
-    }
-
-    @Override
-    public ConverterManager getConverterManager() {
-        return null;
-    }
-
-    @Override
-    public VersionProvider getVersionProvider() {
-        return null;
-    }
-
-    @Override
-    public void destroy() {
-    }
-
-    @Override
-    public void exportTo(ExportSettings settings) {
-    }
-
-    @Override
-    public void importFrom(ImportSettings settings) {
-    }
-
-    private static class DummyHaCommonAddon implements HaCommonAddon {
-
-        @Override
-        public boolean isHaEnabled() {
-            return false;
-        }
-
-        @Override
-        public boolean isPrimary() {
-            return false;
-        }
-
-        @Override
-        public boolean isHaConfigured() {
-            return false;
-        }
-
-        @Override
-        public void notify(HaMessageTopic haMessageTopic, HaMessage haMessage) {
-        }
-
-        @Override
-        public String getHostId() {
-            return null;
-        }
-
-        @Override
-        public SemaphoreWrapper getSemaphore(String semaphoreName) {
-            Semaphore semaphore = new Semaphore(HaCommonAddon.DEFAULT_SEMAPHORE_PERMITS);
-            return new JVMSemaphoreWrapper(semaphore);
-        }
-
-        @Override
-        public <K, V> CacheWrapper<K, V> getCache(String cacheName, CacheWrapper.CacheConfig cacheConfig) {
-            return new SimpleCacheWrapper<>(cacheConfig);
-        }
-
-        @Override
-        public void shutdown() {
-        }
-
-        @Override
-        public List<ArtifactoryServer> getAllArtifactoryServers() {
-            return new ArrayList<>();
-        }
-
-        @Override
-        public boolean deleteArtifactoryServer(String id) {
-            return false;
-        }
-
-        @Override
-        public boolean artifactoryServerHasHeartbeat(ArtifactoryServer artifactoryServer) {
-            return false;
-        }
-
-        @Override
-        public String getCurrentMemberServerId() {
-            return null;
-        }
-
-        @Override
-        public void propagateDebianReindexAll(ArtifactoryServer server, String repoKey, boolean async, boolean writeProps) {}
-
-        @Override
-        public void propagateOpkgReindexAll(ArtifactoryServer server, String repoKey, boolean async, boolean writeProps) {}
-
-        @Override
-        public List propagateTrafficCollector(long startLong, long endLong, List<String> ipsToFilter,
-                List<ArtifactoryServer> servers, Class clazz) {
-            return null;
-        }
-
-        @Override
-        public <T> List<T> propagateTasksList(List<ArtifactoryServer> servers, Class<T> clazz) {
-            return null;
-        }
-
-        @Override
-        public void forceOptimizationOnce() {
-        }
-
-        @Override
-        public boolean isDefault() {
-            return false;
-        }
-    }
-
-    private static class DummyOssAddonsManager extends OssAddonsManager {
-
-        private DummyOssAddonsManager() {
-            context = ContextHelper.get();
-        }
-
-        @Override
-        public boolean isAddonSupported(AddonType addonType) {
-            return false;
-        }
-
-        @Override
-        public boolean isProLicensed(String licenseKeyHash) {
-            return false;
-        }
-
-        @Override
-        public ArtifactoryRunningMode getArtifactoryRunningMode() {
-            return ArtifactoryRunningMode.OSS;
-        }
-
-        @Override
-        public boolean isPartnerLicense() {
-            return false;
-        }
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/itest/spring/DbTestConfigFactory.java b/storage/db/src/test/java/org/artifactory/storage/db/itest/spring/DbTestConfigFactory.java
deleted file mode 100644
index 78ea750..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/itest/spring/DbTestConfigFactory.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.itest.spring;
-
-import org.artifactory.storage.StorageProperties;
-import org.artifactory.storage.db.DbType;
-import org.artifactory.storage.db.spring.ArtifactoryTomcatDataSource;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.artifactory.storage.db.util.querybuilder.*;
-import org.artifactory.util.ResourceUtils;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.BeanFactory;
-import org.springframework.beans.factory.BeanFactoryAware;
-import org.springframework.beans.factory.annotation.Autowire;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import javax.sql.DataSource;
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.sql.Connection;
-import java.sql.SQLException;
-
-/**
- * A Spring {@link org.springframework.context.annotation.Configuration} to initialized database beans.
- *
- * @author Yossi Shaul
- */
- at Configuration
-public class DbTestConfigFactory implements BeanFactoryAware {
-
-    private BeanFactory beanFactory;
-
-    @Bean(name = "dataSource")
-    public DataSource createDataSource() {
-        StorageProperties storageProperties = beanFactory.getBean("storageProperties", StorageProperties.class);
-        ArtifactoryTomcatDataSource dataSource = new ArtifactoryTomcatDataSource(storageProperties);
-        // the db tests has limited tx support (which is mostly controlled by the business logic layer) so we are using
-        // auto commit
-        dataSource.setDefaultAutoCommit(true);
-        return dataSource;
-    }
-
-    /**
-     * @return Auto-commit datasource for the unique ids generator.
-     * @see org.artifactory.storage.db.spring.DbConfigFactory#createUniqueIdsDataSource()
-     */
-    @Bean(name = "uniqueIdsDataSource")
-    public DataSource createUniqueIdsDataSource() {
-        StorageProperties storageProperties = beanFactory.getBean("storageProperties", StorageProperties.class);
-        return ArtifactoryTomcatDataSource.createUniqueIdDataSource(storageProperties);
-    }
-
-    @Bean(name = "storageProperties")
-    public StorageProperties getDbProperties() throws IOException {
-        File dbPropsFile;
-        String generatedDbConfigLocation = getGeneratedDbConfigLocation();
-        if (generatedDbConfigLocation != null) {
-            dbPropsFile = new File(generatedDbConfigLocation);
-        } else {
-            String dbConfigName = getDbConfigName();
-            dbPropsFile = ResourceUtils.getResourceAsFile("/db/" + dbConfigName + ".properties");
-        }
-
-        StorageProperties storageProperties = new StorageProperties(dbPropsFile);
-
-        File workDir = new File("target", "dbtest").getAbsoluteFile();
-        Files.createDirectories(workDir.toPath());
-
-        // configure embedded derby
-        if (storageProperties.getDbType().equals(DbType.DERBY)) {
-            System.setProperty("derby.stream.error.file", new File(workDir, "derby.log").getAbsolutePath());
-            String url = storageProperties.getConnectionUrl();
-            File dbWorkDir = new File(workDir, DbType.DERBY.name()).getAbsoluteFile();
-            url = url.replace("{db.home}", dbWorkDir.getAbsolutePath());
-            storageProperties.setConnectionUrl(url);
-        }
-
-        return storageProperties;
-    }
-
-    @Override
-    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
-        this.beanFactory = beanFactory;
-    }
-
-    public String getDbConfigName() {
-        return System.getProperty("artifactory.db.config.name", "derby");
-    }
-
-    public String getGeneratedDbConfigLocation() {
-        String generatedConfig = System.getProperty("artifactory.db.generated.config");
-        // reset the value to make sure it's not propagated to other tests
-        System.clearProperty("artifactory.db.generated.config");
-        return generatedConfig;
-    }
-
-
-    /**
-     * create  a query builder instance per db type
-     *
-     * @return query builder instance
-     */
-    @Bean(name = "queryBuilder", autowire = Autowire.BY_TYPE)
-    public IQueryBuilder createSqlBuilder() throws SQLException {
-        JdbcHelper jdbcHelper = beanFactory.getBean(JdbcHelper.class);
-        StorageProperties storageProperties = beanFactory.getBean(StorageProperties.class);
-        String productName = storageProperties.getDbType().toString();
-        Connection connection = jdbcHelper.getDataSource().getConnection();
-        connection.close();
-        IQueryBuilder queryBuilder;
-        switch (productName) {
-            case "oracle":
-                queryBuilder = new OracleQueryBuilder();
-                break;
-            case "mssql":
-                queryBuilder = new SqlServerQueryBuilder();
-                break;
-            case "derby":
-                queryBuilder = new DerbyQueryBuilder();
-                break;
-            case "postgresql":
-                queryBuilder = new PostgresqlQueryBuilder();
-                break;
-            case "mysql":
-                queryBuilder = new MysqlQueryBuilder();
-                break;
-            default:
-                queryBuilder = new DerbyQueryBuilder();
-                break;
-        }
-        return queryBuilder;
-    }
-
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/itest/spring/DbUpgradeTestConfigFactory.java b/storage/db/src/test/java/org/artifactory/storage/db/itest/spring/DbUpgradeTestConfigFactory.java
deleted file mode 100644
index 9fdc705..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/itest/spring/DbUpgradeTestConfigFactory.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.itest.spring;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.storage.db.DbService;
-import org.artifactory.storage.db.DbType;
-import org.artifactory.version.CompoundVersionDetails;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.BeanFactory;
-import org.springframework.beans.factory.BeanFactoryAware;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import java.util.concurrent.Callable;
-
-/**
- * Date: 8/5/13 10:56 AM
- *
- * @author freds
- */
- at Configuration
-public class DbUpgradeTestConfigFactory implements BeanFactoryAware {
-
-    @Override
-    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
-    }
-
-    @Bean
-    public DbService createDummyDbService() {
-        return new DummyDbService();
-    }
-}
-
-class DummyDbService implements DbService {
-    @Override
-    public long nextId() {
-        return 0;
-    }
-
-    @Override
-    public DbType getDatabaseType() {
-        return DbType.DERBY;
-    }
-
-    @Override
-    public void compressDerbyDb(BasicStatusHolder statusHolder) {
-        // Nothing
-    }
-
-    @Override
-    public <T> T invokeInTransaction(String transactionName, Callable<T> execute) {
-        return null;
-    }
-
-    @Override
-    public void convert(CompoundVersionDetails source, CompoundVersionDetails target) {
-        // Nothing
-    }
-
-    @Override
-    public void init() {
-        // Nothing
-    }
-
-    @Override
-    public void reload(CentralConfigDescriptor oldDescriptor) {
-        // Nothing
-    }
-
-    @Override
-    public void destroy() {
-        // Nothing
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/security/acl/AclsCacheTest.java b/storage/db/src/test/java/org/artifactory/storage/db/security/acl/AclsCacheTest.java
deleted file mode 100644
index 098e5ab..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/security/acl/AclsCacheTest.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package org.artifactory.storage.db.security.acl;
-
-import org.testng.annotations.Test;
-
-/**
- * @author Gidi Shabat
- */
- at Test
-public class AclsCacheTest {
-    //
-    ///**
-    // * Make sure that all thread are getting released by timeout
-    // */
-    //public void test1(){
-    //    AclServiceImpl.AclsCache aclsCache = new AclServiceImpl.AclsCache(1000,new AclCacheLoaderTest());
-    //    ArrayList<Map<String, AclInfo>> list = new ArrayList<>();
-    //    list.add(aclsCache.get());
-    //    aclsCache.promoteAclsDbVersion();
-    //    for (int i = 0; i < 10; i++) {
-    //         new Thread(() -> {
-    //             list.add(aclsCache.get());
-    //         }).start();
-    //
-    //    }
-    //    while(list.size()<11){
-    //        waitSecond();
-    //    }
-    //    for (int i = 0; i < 10; i++) {
-    //        Map<String, AclInfo> map = list.get(i);
-    //        Assert.assertEquals(map.keySet().iterator().next(),"0");
-    //    }
-    //    Assert.assertEquals(list.get(10).keySet().iterator().next(),"1");
-    //}
-    //
-    ///**
-    // * Make sure that all thread are getting blocked while the map is null
-    // */
-    //public void test2(){
-    //    AclServiceImpl.AclsCache aclsCache = new AclServiceImpl.AclsCache(1000,new AclCacheLoaderTest());
-    //    ArrayList<Map<String, AclInfo>> list = new ArrayList<>();
-    //    for (int i = 0; i < 10; i++) {
-    //        new Thread(() -> {
-    //            list.add(aclsCache.get());
-    //        }).start();
-    //
-    //    }
-    //    while(list.size()<10){
-    //        waitSecond();
-    //    }
-    //    for (int i = 0; i < 10; i++) {
-    //        Map<String, AclInfo> map = list.get(i);
-    //        Assert.assertEquals(map.keySet().iterator().next(),"0");
-    //    }
-    //}
-    //
-    ///**
-    // * Make sure that all thread are getting blocked while the map is null
-    // */
-    //public void test3(){
-    //    AclServiceImpl.AclsCache aclsCache = new AclServiceImpl.AclsCache(30000,new AclCacheLoaderTest());
-    //    ArrayList<Map<String, AclInfo>> list = new ArrayList<>();
-    //    for (int i = 0; i < 10; i++) {
-    //        new Thread(() -> {
-    //            list.add(aclsCache.get());
-    //        }).start();
-    //
-    //    }
-    //    while(list.size()<10){
-    //        waitSecond();
-    //    }
-    //    for (int i = 0; i < 10; i++) {
-    //        Map<String, AclInfo> map = list.get(i);
-    //        Assert.assertEquals(map.keySet().iterator().next(),"0");
-    //    }
-    //}
-    //
-    //private void waitSecond() {
-    //    try {
-    //        Thread.sleep(1000);
-    //    } catch (InterruptedException e) {
-    //        // Do nothing
-    //    }
-    //}
-    //
-    //
-    //public static class AclCacheLoaderTest extends AclServiceImpl.AclCacheLoader{
-    //
-    //    AtomicInteger version=new AtomicInteger();
-    //
-    //    public AclCacheLoaderTest() {
-    //        super(null,null,null);
-    //    }
-    //
-    //    @Override
-    //    public Map<String, AclInfo> call() {
-    //        HashMap<String, AclInfo> map = new HashMap<>();
-    //        try {
-    //            Thread.sleep(10000);
-    //        } catch (InterruptedException e) {
-    //           // Do nothing
-    //        }
-    //        map.put(""+version.getAndAdd(1),null);
-    //        return map;
-    //    }
-    //}
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/security/entity/AclTest.java b/storage/db/src/test/java/org/artifactory/storage/db/security/entity/AclTest.java
deleted file mode 100644
index 502f33a..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/security/entity/AclTest.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.security.entity;
-
-import org.artifactory.security.ArtifactoryPermission;
-import org.testng.annotations.Test;
-
-import java.util.HashSet;
-
-import static org.testng.Assert.*;
-
-/**
- * Date: 10/25/12
- * Time: 5:36 PM
- *
- * @author freds
- */
- at Test
-public class AclTest {
-
-    public void simpleAcl() {
-        long now = System.currentTimeMillis();
-        Acl acl = new Acl(1L, 2L, now, "me");
-        acl.setAces(new HashSet<Ace>());
-        assertEquals(acl.getAclId(), 1L);
-        assertEquals(acl.getPermTargetId(), 2L);
-        assertEquals(acl.getLastModified(), now);
-        assertEquals(acl.getLastModifiedBy(), "me");
-        assertTrue(acl.getAces().isEmpty());
-    }
-
-    public void simpleAce() {
-        Ace ace = new Ace(1L, 2L, ArtifactoryPermission.READ.getMask(), 3L, 0L);
-        assertEquals(ace.getAceId(), 1L);
-        assertEquals(ace.getAclId(), 2L);
-        assertEquals(ace.getMask(), 1);
-        assertEquals(ace.getUserId(), 3L);
-        assertEquals(ace.getGroupId(), 0L);
-    }
-
-    public void aceEqualsHashTest() {
-        // Only the id matters in equals/hash
-        Ace ace1 = new Ace(1L, 2L, ArtifactoryPermission.READ.getMask(), 3L, 0L);
-        Ace ace2 = new Ace(2L, 2L, ArtifactoryPermission.READ.getMask(), 3L, 0L);
-        Ace ace3 = new Ace(1L, 3L, ArtifactoryPermission.MANAGE.getMask(), 0L, 5L);
-        assertNotEquals(ace1, ace2);
-        assertNotEquals(ace1.hashCode(), ace2.hashCode());
-        assertNotEquals(ace3, ace2);
-        assertNotEquals(ace3.hashCode(), ace2.hashCode());
-        assertEquals(ace1, ace3);
-        assertEquals(ace1.hashCode(), ace3.hashCode());
-    }
-
-    public void aceHashInAclTest() {
-        long now = System.currentTimeMillis();
-        Acl acl = new Acl(1L, 2L, now, "me");
-        HashSet<Ace> aces = new HashSet<Ace>();
-        aces.add(new Ace(1L, 2L, ArtifactoryPermission.READ.getMask(), 3L, 0L));
-        aces.add(new Ace(2L, 2L, ArtifactoryPermission.READ.getMask(), 3L, 0L));
-        aces.add(new Ace(1L, 3L, ArtifactoryPermission.MANAGE.getMask(), 0L, 5L));
-        acl.setAces(aces);
-
-        assertEquals(acl.getAclId(), 1L);
-        assertEquals(acl.getPermTargetId(), 2L);
-        assertEquals(acl.getLastModified(), now);
-        assertEquals(acl.getLastModifiedBy(), "me");
-        assertEquals(acl.getAces().size(), 2);
-        assertTrue(acl.getAces().contains(new Ace(1L, 7L, 0, 0L, 8L)));
-        assertTrue(acl.getAces().contains(new Ace(2L, 8L, 1, 8L, 0L)));
-    }
-
-    public void maxNullInAclTest() {
-        new Acl(1L, 2L, 0L, null);
-        new Acl(1L, 2L, -3L, null);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = "Ids.*negative.*")
-    public void noIdInAclTest() {
-        new Acl(0L, 2L, 0L, null);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = "Ids.*negative.*")
-    public void negIdInAclTest() {
-        new Acl(-1L, 2L, 0L, null);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = "Ids.*negative.*")
-    public void noPermIdInAclTest() {
-        new Acl(1L, 0L, 0L, null);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = "Ids.*negative.*")
-    public void negPermIdInAclTest() {
-        new Acl(1L, -2L, 0L, null);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = "Ids.*negative.*")
-    public void negAceAclIdTest() {
-        new Ace(-1L, 2L, ArtifactoryPermission.READ.getMask(), 3L, 0L);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = "Ids.*negative.*")
-    public void negAceAceIdTest() {
-        new Ace(1L, -2L, ArtifactoryPermission.READ.getMask(), 3L, 0L);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = "Ids.*negative.*")
-    public void negAceUserIdTest() {
-        new Ace(1L, 2L, ArtifactoryPermission.READ.getMask(), -3L, 0L);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class}, expectedExceptionsMessageRegExp = "Ids.*negative.*")
-    public void negAceGroupIdTest() {
-        new Ace(1L, 2L, ArtifactoryPermission.READ.getMask(), 3L, -4L);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class},
-            expectedExceptionsMessageRegExp = ".*both a group and a user.*")
-    public void wrongAceUserAndGroupTest() {
-        new Ace(1L, 2L, ArtifactoryPermission.READ.getMask(), 3L, 4L);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class},
-            expectedExceptionsMessageRegExp = ".*either a group or a user.*")
-    public void wrongAceNoUserOrGroupTest() {
-        new Ace(1L, 2L, ArtifactoryPermission.READ.getMask(), 0L, 0L);
-    }
-
-    @Test(expectedExceptions = {IllegalStateException.class},
-            expectedExceptionsMessageRegExp = ".*not initialized.*ACEs missing.*")
-    public void noAcesInAclTest() {
-        Acl acl = new Acl(1L, 2L, 0L, null);
-        acl.getAces();
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class},
-            expectedExceptionsMessageRegExp = ".*set aces.*null.*")
-    public void setNullAcesInAclTest() {
-        Acl acl = new Acl(1L, 2L, 0L, null);
-        acl.setAces(null);
-    }
-
-    @Test(expectedExceptions = {IllegalStateException.class},
-            expectedExceptionsMessageRegExp = ".*ACEs already set.*")
-    public void doubleSetAcesInAclTest() {
-        Acl acl = new Acl(1L, 2L, 0L, null);
-        acl.setAces(new HashSet<Ace>());
-        acl.setAces(new HashSet<Ace>());
-    }
-
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/security/entity/GroupTest.java b/storage/db/src/test/java/org/artifactory/storage/db/security/entity/GroupTest.java
deleted file mode 100644
index 24a97a2..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/security/entity/GroupTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.security.entity;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * Date: 8/26/12
- * Time: 11:46 PM
- *
- * @author freds
- */
- at Test
-public class GroupTest {
-
-    public void simpleGroupTest() {
-        Group g = new Group(1L, "g1", null, false, null, null);
-        assertEquals(g.getGroupId(), 1L);
-        assertEquals(g.getGroupName(), "g1");
-        assertNull(g.getDescription());
-        assertFalse(g.isNewUserDefault());
-        assertNull(g.getRealm());
-        assertNull(g.getRealmAttributes());
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class})
-    public void noGroupIdTest() {
-        new Group(0L, "XXX", "group description", true, "ldap", "dn=o");
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class})
-    public void noGroupNameTest() {
-        new Group(1L, "", "group description", true, "ldap", "dn=o");
-    }
-
-    public void withRealmGroupTest() {
-        Group g = new Group(1L, "g1", "group description", true, "ldap", "dn=o");
-        assertEquals(g.getGroupId(), 1L);
-        assertEquals(g.getGroupName(), "g1");
-        assertEquals(g.getDescription(), "group description");
-        assertTrue(g.isNewUserDefault());
-        assertEquals(g.getRealm(), "ldap");
-        assertEquals(g.getRealmAttributes(), "dn=o");
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/security/entity/PermissionTargetTest.java b/storage/db/src/test/java/org/artifactory/storage/db/security/entity/PermissionTargetTest.java
deleted file mode 100644
index b223d0d..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/security/entity/PermissionTargetTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.security.entity;
-
-import org.testng.annotations.Test;
-
-import java.util.HashSet;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
-
-/**
- * Date: 8/26/12
- * Time: 11:46 PM
- *
- * @author freds
- */
- at Test
-public class PermissionTargetTest {
-
-    public void simplePermTargetTest() {
-        PermissionTarget p = new PermissionTarget(1L, "p1", "", "");
-        p.setRepoKeys(new HashSet<String>(1));
-        assertEquals(p.getPermTargetId(), 1L);
-        assertEquals(p.getName(), "p1");
-        assertTrue(p.getIncludes().isEmpty());
-        assertTrue(p.getExcludes().isEmpty());
-        assertTrue(p.getRepoKeys().isEmpty());
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class})
-    public void noPermTargetIdTest() {
-        new PermissionTarget(0L, "XXX", "", "");
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class})
-    public void noPermTargetNameTest() {
-        new PermissionTarget(1L, "", "", "");
-    }
-
-    @Test(expectedExceptions = {IllegalStateException.class})
-    public void noRepoKeysSetTest() {
-        PermissionTarget p = new PermissionTarget(1L, "p1", "", "");
-        p.getRepoKeys();
-    }
-
-    @Test(expectedExceptions = {IllegalStateException.class})
-    public void tooManyRepoKeysSetTest() {
-        PermissionTarget p = new PermissionTarget(1L, "p1", "", "");
-        p.setRepoKeys(new HashSet<String>(1));
-        p.setRepoKeys(new HashSet<String>(1));
-    }
-
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/security/entity/UserGroupTest.java b/storage/db/src/test/java/org/artifactory/storage/db/security/entity/UserGroupTest.java
deleted file mode 100644
index 788744b..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/security/entity/UserGroupTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.security.entity;
-
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.*;
-
-/**
- * Date: 8/26/12
- * Time: 11:46 PM
- *
- * @author freds
- */
- at Test
-public class UserGroupTest {
-
-    public void simpleUserGroupTest() {
-        UserGroup ug = new UserGroup(1L, 1L, null);
-        assertEquals(ug.getUserId(), 1L);
-        assertEquals(ug.getGroupId(), 1L);
-        assertNull(ug.getRealm());
-    }
-
-    public void withRealmUserGroupTest() {
-        UserGroup ug = new UserGroup(2L, 2L, "ldap");
-        assertEquals(ug.getUserId(), 2L);
-        assertEquals(ug.getGroupId(), 2L);
-        assertEquals(ug.getRealm(), "ldap");
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class})
-    public void noUserUserGroupTest() {
-        new UserGroup(-2L, 2L, "ldap");
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class})
-    public void noGroupUserGroupTest() {
-        new UserGroup(1L, 0L, "ldap");
-    }
-
-    public void EqualsUserGroupTest() {
-        UserGroup ug1 = new UserGroup(1L, 1L, null);
-        UserGroup ug2a = new UserGroup(1L, 2L, null);
-        UserGroup ug2b = new UserGroup(2L, 1L, null);
-        UserGroup ug3 = new UserGroup(1L, 1L, "ldap");
-
-        assertNotEquals(ug1, ug2a);
-        assertNotEquals(ug1.hashCode(), ug2a.hashCode());
-        assertNotEquals(ug1, ug2b);
-        assertNotEquals(ug1.hashCode(), ug2b.hashCode());
-        assertNotEquals(ug3, ug2a);
-        assertNotEquals(ug3.hashCode(), ug2a.hashCode());
-        assertNotEquals(ug3, ug2b);
-        assertNotEquals(ug3.hashCode(), ug2b.hashCode());
-        assertEquals(ug1, ug3);
-        assertEquals(ug1.hashCode(), ug3.hashCode());
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/security/entity/UserTest.java b/storage/db/src/test/java/org/artifactory/storage/db/security/entity/UserTest.java
deleted file mode 100644
index 1b6c01d..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/security/entity/UserTest.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.security.entity;
-
-import org.testng.annotations.Test;
-
-import java.util.HashSet;
-
-import static org.testng.Assert.*;
-
-/**
- * Date: 8/26/12
- * Time: 11:46 PM
- *
- * @author freds
- */
- at Test
-public class UserTest {
-
-    public void simpleUserTest() {
-        User u = new User(1L, "u1", null, "SALT", null, false, true, false, "sdsdf:SDFSDF3434");
-        u.setGroups(new HashSet<UserGroup>());
-        assertEquals(u.getUserId(), 1L);
-        assertEquals(u.getUsername(), "u1");
-        assertEquals(u.getSalt(), "SALT");
-        assertEquals(u.getBintrayAuth(), "sdsdf:SDFSDF3434");
-        assertNull(u.getPassword());
-        assertNull(u.getEmail());
-        assertFalse(u.isAdmin());
-        assertTrue(u.isEnabled());
-        assertFalse(u.isUpdatableProfile());
-        assertTrue(u.getGroups().isEmpty());
-    }
-
-    public void withPassUserTest() {
-        User u = new User(2L, "u2", "APASSWD", "SALT", "e at mail.com", true, true, true, "asd:23SDFSD34");
-        u.setGroups(new HashSet<UserGroup>());
-        assertEquals(u.getUserId(), 2L);
-        assertEquals(u.getUsername(), "u2");
-        assertEquals(u.getPassword(), "APASSWD");
-        assertEquals(u.getSalt(), "SALT");
-        assertEquals(u.getBintrayAuth(), "asd:23SDFSD34");
-        assertEquals(u.getEmail(), "e at mail.com");
-        assertTrue(u.isAdmin());
-        assertTrue(u.isEnabled());
-        assertTrue(u.isUpdatableProfile());
-        assertTrue(u.getGroups().isEmpty());
-    }
-
-    public void withGroupsUserTest() {
-        User u = new User(3L, "u3", "BPASSWD", "SALT", "e at mail.com", true, true, true, null);
-        HashSet<UserGroup> groups = new HashSet<UserGroup>();
-        groups.add(new UserGroup(3L, 1L, null));
-        u.setGroups(groups);
-        assertEquals(u.getUserId(), 3L);
-        assertEquals(u.getUsername(), "u3");
-        assertEquals(u.getPassword(), "BPASSWD");
-        assertEquals(u.getSalt(), "SALT");
-        assertEquals(u.getEmail(), "e at mail.com");
-        assertTrue(u.isAdmin());
-        assertTrue(u.isEnabled());
-        assertTrue(u.isUpdatableProfile());
-        assertEquals(u.getGroups().size(), 1);
-        assertEquals(u.getGroups().iterator().next(), new UserGroup(3L, 1L, "does not matter"));
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class})
-    public void negUserIdTest() {
-        new User(-1L, "XXX", "APASSWD", "SALT", "e at mail.com", true, true, true, null);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class})
-    public void noUserIdTest() {
-        new User(0L, "XXX", "APASSWD", "SALT", "e at mail.com", true, true, true, null);
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class})
-    public void noUserNameTest() {
-        new User(1L, "", "APASSWD", "SALT", "e at mail.com", true, true, true, null);
-    }
-
-    @Test(expectedExceptions = {IllegalStateException.class})
-    public void noGroupsSetTest() {
-        User u = new User(1L, "u1", "APASSWD", "SALT", "e at mail.com", true, true, true, null);
-        u.getGroups();
-    }
-
-    @Test(expectedExceptions = {IllegalStateException.class})
-    public void tooManyGroupsSetTest() {
-        User u = new User(1L, "u1", "APASSWD", "SALT", "e at mail.com", true, true, true, null);
-        u.setGroups(new HashSet<UserGroup>());
-        u.setGroups(new HashSet<UserGroup>());
-    }
-
-    @Test(expectedExceptions = {IllegalArgumentException.class})
-    public void wrongGroupSetTest() {
-        User u = new User(1L, "u1", "APASSWD", "SALT", "e at mail.com", true, true, true, null);
-        HashSet<UserGroup> groups = new HashSet<UserGroup>();
-        groups.add(new UserGroup(2L, 3L, null));
-        u.setGroups(groups);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/security/itest/dao/AclsDaoTest.java b/storage/db/src/test/java/org/artifactory/storage/db/security/itest/dao/AclsDaoTest.java
deleted file mode 100644
index f5cb66d..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/security/itest/dao/AclsDaoTest.java
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.security.itest.dao;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import org.artifactory.security.PermissionTargetInfo;
-import org.artifactory.storage.db.security.dao.AclsDao;
-import org.artifactory.storage.db.security.dao.PermissionTargetsDao;
-import org.artifactory.storage.db.security.entity.Ace;
-import org.artifactory.storage.db.security.entity.Acl;
-import org.artifactory.storage.db.security.entity.PermissionTarget;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.sql.SQLException;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Map;
-
-import static org.testng.Assert.*;
-
-/**
- * Date: 11/13/12
- * Time: 4:41 PM
- *
- * @author freds
- */
-public class AclsDaoTest extends SecurityBaseDaoTest {
-
-    @Autowired
-    private AclsDao aclsDao;
-
-    @Autowired
-    private PermissionTargetsDao permissionTargetsDao;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/user-group.sql");
-        importSql("/sql/acls.sql");
-    }
-
-    public void testLoadPermissionTargets() throws SQLException {
-        for (long targetId = 1L; targetId < 5L; targetId++) {
-            assertAnyPermissionTarget(targetId, permissionTargetsDao.findPermissionTarget(targetId));
-        }
-    }
-
-    private void assertAnyPermissionTarget(long id, PermissionTarget pt) {
-        switch ((int) id) {
-            case 1:
-                assertPermissionTarget1(pt);
-                break;
-            case 2:
-                assertPermissionTarget2(pt);
-                break;
-            case 3:
-                assertPermissionTarget3(pt);
-                break;
-            case 4:
-                assertPermissionTarget4(pt);
-                break;
-            default:
-                fail("Permission Target unknown " + pt);
-                break;
-        }
-    }
-
-    private void assertPermissionTarget1(PermissionTarget pt) {
-        assertEquals(pt.getName(), "perm-target-1");
-        assertNull(pt.getIncludesPattern());
-        assertNull(pt.getExcludesPattern());
-        assertTrue(pt.getIncludes().isEmpty());
-        assertTrue(pt.getExcludes().isEmpty());
-        assertEquals(pt.getRepoKeys(), ImmutableSet.of(PermissionTargetInfo.ANY_REPO));
-    }
-
-    private void assertPermissionTarget2(PermissionTarget pt) {
-        assertEquals(pt.getName(), "perm-target-2");
-        assertEquals(pt.getIncludesPattern(), "com/**,org/**");
-        assertNull(pt.getExcludesPattern());
-        assertEquals(pt.getIncludes(), ImmutableList.of("com/**", "org/**"));
-        assertTrue(pt.getExcludes().isEmpty());
-        assertEquals(pt.getRepoKeys(), ImmutableSet.of(PermissionTargetInfo.ANY_LOCAL_REPO));
-    }
-
-    private void assertPermissionTarget3(PermissionTarget pt) {
-        assertEquals(pt.getName(), "perm-target-3");
-        assertNull(pt.getIncludesPattern());
-        assertEquals(pt.getExcludesPattern(), "apache/**");
-        assertTrue(pt.getIncludes().isEmpty());
-        assertEquals(pt.getExcludes(), ImmutableList.of("apache/**"));
-        assertEquals(pt.getRepoKeys(),
-                ImmutableSet.of("libs-release-local", PermissionTargetInfo.ANY_REMOTE_REPO, "libs-snapshot-local"));
-    }
-
-    private void assertPermissionTarget4(PermissionTarget pt) {
-        assertEquals(pt.getName(), "perm-target-4");
-        assertEquals(pt.getIncludesPattern(), "jfrog/**,**/art-*.xml");
-        assertEquals(pt.getExcludesPattern(), "codehaus/**");
-        assertEquals(pt.getIncludes(), ImmutableList.of("jfrog/**", "**/art-*.xml"));
-        assertEquals(pt.getExcludes(), ImmutableList.of("codehaus/**"));
-        assertTrue(pt.getRepoKeys().isEmpty());
-    }
-
-    @Test(dependsOnMethods = "testDeleteAcls")
-    public void testLoadAllAcls() throws SQLException {
-        Map<Long, PermissionTarget> allPermissionTargets = permissionTargetsDao.getAllPermissionTargets();
-        for (Map.Entry<Long, PermissionTarget> entry : allPermissionTargets.entrySet()) {
-            assertAnyPermissionTarget(entry.getKey(), entry.getValue());
-        }
-        assertAclCollection(aclsDao.getAllAcls(), ImmutableSet.of(10, 20, 30));
-    }
-
-    public void testFindAclById() throws SQLException {
-        assertAnyAcl(aclsDao.findAcl(10L), 10);
-        assertAnyAcl(aclsDao.findAcl(20L), 20);
-        assertAnyAcl(aclsDao.findAcl(30L), 30);
-    }
-
-    public void testFindAclByPermissionTargetId() throws SQLException {
-        assertAnyAcl(aclsDao.findAclByPermissionTargetId(1L), 10);
-        assertAnyAcl(aclsDao.findAclByPermissionTargetId(2L), 20);
-        assertAnyAcl(aclsDao.findAclByPermissionTargetId(3L), 30);
-    }
-
-    public void testUserOrGroupHasAce() throws SQLException {
-        assertTrue(aclsDao.userHasAce(1L));
-        assertTrue(aclsDao.userHasAce(2L));
-        assertFalse(aclsDao.userHasAce(3L));
-        assertTrue(aclsDao.groupHasAce(1L));
-        assertFalse(aclsDao.groupHasAce(2L));
-    }
-
-    public void testCreatePermissionTargetNoRepoKeys() throws SQLException {
-        PermissionTarget pt = new PermissionTarget(100L, "temp-perm-100", "", "");
-        pt.setRepoKeys(new HashSet<String>());
-        assertEquals(permissionTargetsDao.createPermissionTarget(pt), 1);
-        assertTrue(pt.isIdentical(permissionTargetsDao.findPermissionTarget(100L)));
-        assertTrue(pt.isIdentical(permissionTargetsDao.findPermissionTarget("temp-perm-100")));
-    }
-
-    @Test(dependsOnMethods = "testCreatePermissionTargetNoRepoKeys")
-    public void testCreatePermissionTargetWithRepoKeys() throws SQLException {
-        PermissionTarget pt = new PermissionTarget(101L, "temp-perm-101", "", "");
-        HashSet<String> repoKeys = new HashSet<String>();
-        repoKeys.add("test-repo");
-        repoKeys.add("test-repo-2");
-        pt.setRepoKeys(repoKeys);
-        assertEquals(permissionTargetsDao.createPermissionTarget(pt), 3);
-        assertTrue(pt.isIdentical(permissionTargetsDao.findPermissionTarget(101L)));
-        assertTrue(pt.isIdentical(permissionTargetsDao.findPermissionTarget("temp-perm-101")));
-    }
-
-    @Test(dependsOnMethods = "testCreatePermissionTargetWithRepoKeys",
-            expectedExceptions = {IllegalStateException.class},
-            expectedExceptionsMessageRegExp = "Permission Target.*not initialized.*repo keys missing.")
-    public void testCreatePermissionTargetWrongRepoKeys() throws SQLException {
-        PermissionTarget pt = new PermissionTarget(102L, "temp-perm-102", "", "");
-        permissionTargetsDao.createPermissionTarget(pt);
-    }
-
-    @Test(dependsOnMethods = {"testCreatePermissionTargetWrongRepoKeys"})
-    public void testDeletePermissionTarget() throws SQLException {
-        assertEquals(permissionTargetsDao.deletePermissionTarget(102L), 1);
-        assertEquals(permissionTargetsDao.deletePermissionTarget(101L), 3);
-        assertEquals(permissionTargetsDao.deletePermissionTarget(100L), 1);
-    }
-
-    public void testCreateAclNoAces() throws SQLException {
-        PermissionTarget pt = new PermissionTarget(200L, "temp-perm-200", "", "");
-        pt.setRepoKeys(new HashSet<String>());
-        assertEquals(permissionTargetsDao.createPermissionTarget(pt), 1);
-        Acl acl = new Acl(2000L, 200L, System.currentTimeMillis(), "me");
-        acl.setAces(new HashSet<Ace>());
-        assertEquals(aclsDao.createAcl(acl), 1);
-        aclEquals(acl, aclsDao.findAcl(2000L));
-        aclEquals(acl, aclsDao.findAclByPermissionTargetId(200L));
-    }
-
-    @Test(dependsOnMethods = "testCreateAclNoAces")
-    public void testCreateAclWithAces() throws SQLException {
-        PermissionTarget pt = new PermissionTarget(201L, "temp-perm-201", "", "");
-        pt.setRepoKeys(new HashSet<String>());
-        assertEquals(permissionTargetsDao.createPermissionTarget(pt), 1);
-        Acl acl = new Acl(2010L, 201L, System.currentTimeMillis(), "me1");
-        HashSet<Ace> aces = new HashSet<Ace>();
-        aces.add(new Ace(20100L, 2010L, 5, 15L, 0L));
-        aces.add(new Ace(20101L, 2010L, 5, 0L, 15L));
-        acl.setAces(aces);
-        assertEquals(aclsDao.createAcl(acl), 3);
-        aclEquals(acl, aclsDao.findAcl(2010L));
-        aclEquals(acl, aclsDao.findAclByPermissionTargetId(201L));
-    }
-
-    @Test(dependsOnMethods = "testCreateAclWithAces")
-    public void testDeleteAcls() throws SQLException {
-        assertEquals(aclsDao.deleteAcl(2010L), 3);
-        assertEquals(aclsDao.deleteAcl(2000L), 1);
-        assertEquals(permissionTargetsDao.deletePermissionTarget(200L), 1);
-        assertEquals(permissionTargetsDao.deletePermissionTarget(201L), 1);
-    }
-
-    private void aclEquals(Acl acl, Acl readAcl) {
-        assertEquals(acl, readAcl);
-        assertEquals(acl.getLastModified(), readAcl.getLastModified());
-        assertEquals(acl.getLastModifiedBy(), readAcl.getLastModifiedBy());
-        assertEquals(acl.getPermTargetId(), readAcl.getPermTargetId());
-        assertEquals(acl.getAces(), readAcl.getAces());
-    }
-
-    private void assertAclCollection(Collection<Acl> allAcls, Collection<Integer> aclIds) {
-        assertEquals(allAcls.size(), aclIds.size());
-        for (Acl acl : allAcls) {
-            int aclId = (int) acl.getAclId();
-            assertTrue(aclIds.contains(aclId));
-            assertAnyAcl(acl, aclId);
-        }
-    }
-
-    private void assertAnyAcl(Acl acl, int aclId) {
-        assertEquals((int) acl.getPermTargetId() * 10, aclId);
-        assertEquals(acl.getLastModified(), 0L);
-        assertNull(acl.getLastModifiedBy());
-        switch (aclId) {
-            case 10:
-                equalAces(acl.getAces(), ImmutableMap.<Long, Ace>of(
-                        1L, new Ace(1L, 10L, 1, 1L, 0L),
-                        2L, new Ace(2L, 10L, 2, 0L, 1L),
-                        3L, new Ace(3L, 10L, 3, 2L, 0L)
-                ));
-                break;
-            case 20:
-                equalAces(acl.getAces(), ImmutableMap.<Long, Ace>of(
-                        4L, new Ace(4L, 20L, 3, 1L, 0L),
-                        5L, new Ace(5L, 20L, 3, 0L, 1L)
-                ));
-                break;
-            case 30:
-                assertTrue(acl.getAces().isEmpty());
-                break;
-            default:
-                fail("Acl " + acl + " is unknown!");
-        }
-    }
-
-    private void equalAces(ImmutableSet<Ace> aces, ImmutableMap<Long, Ace> expectedAces) {
-        for (Ace ace : aces) {
-            Ace aceExpected = expectedAces.get(ace.getAceId());
-            assertEquals(ace, aceExpected);
-            assertEquals(ace.getAclId(), aceExpected.getAclId());
-            assertEquals(ace.getMask(), aceExpected.getMask());
-            assertEquals(ace.getUserId(), aceExpected.getUserId());
-            assertEquals(ace.getGroupId(), aceExpected.getGroupId());
-        }
-    }
-
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/security/itest/dao/FullDeleteAclsDaoTest.java b/storage/db/src/test/java/org/artifactory/storage/db/security/itest/dao/FullDeleteAclsDaoTest.java
deleted file mode 100644
index f77e724..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/security/itest/dao/FullDeleteAclsDaoTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.storage.db.security.itest.dao;
-
-import org.artifactory.storage.db.security.dao.AclsDao;
-import org.artifactory.storage.db.security.dao.PermissionTargetsDao;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.sql.SQLException;
-
-import static org.testng.Assert.*;
-
-/**
-* Date: 11/13/12
-* Time: 4:28 PM
-*
-* @author freds
-*/
-public class FullDeleteAclsDaoTest extends SecurityBaseDaoTest {
-
-    @Autowired
-    private AclsDao aclsDao;
-
-    @Autowired
-    private PermissionTargetsDao permissionTargetsDao;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/user-group.sql");
-        importSql("/sql/acls.sql");
-    }
-
-    @Test(expectedExceptions = {SQLException.class})
-    public void testDeleteUserWithAce() throws SQLException {
-        try {
-            // TORE: [by fsi] use the error handling to verify we broke the correct constraint
-            userGroupsDao.deleteUser("u1");
-        } catch (SQLException e) {
-            System.err.println(e.getMessage());
-            throw e;
-        }
-    }
-
-    @Test(expectedExceptions = {SQLException.class},dependsOnMethods = "testDeleteUserWithAce" )
-    public void testDeletePermissionTargetWithAcl() throws SQLException {
-        try {
-            // TORE: [by fsi] use the error handling to verify we broke the correct constraint
-            permissionTargetsDao.deletePermissionTarget(1L);
-        } catch (SQLException e) {
-            System.err.println(e.getMessage());
-            throw e;
-        }
-    }
-
-    @Test(dependsOnMethods = {"testDeletePermissionTargetWithAcl"})
-    public void testDeleteAllData() throws SQLException {
-        assertEquals(aclsDao.deleteAllAcls(), 8);
-        assertEquals(permissionTargetsDao.deleteAllPermissionTargets(), 8);
-        assertEquals(userGroupsDao.deleteAllGroupsAndUsers(), 15);
-
-        assertTrue(aclsDao.getAllAcls().isEmpty());
-        assertNull(permissionTargetsDao.findPermissionTarget(1L));
-        assertTrue(userGroupsDao.getAllUsers(true).isEmpty());
-    }
-
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/security/itest/dao/FullDeleteUserGroupsDaoTest.java b/storage/db/src/test/java/org/artifactory/storage/db/security/itest/dao/FullDeleteUserGroupsDaoTest.java
deleted file mode 100644
index 66de42e..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/security/itest/dao/FullDeleteUserGroupsDaoTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.storage.db.security.itest.dao;
-
-import com.google.common.collect.ImmutableSet;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.sql.SQLException;
-
-import static org.testng.Assert.*;
-
-/**
-* Date: 11/13/12
-* Time: 4:28 PM
-*
-* @author freds
-*/
-public class FullDeleteUserGroupsDaoTest extends SecurityBaseDaoTest {
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/user-group.sql");
-    }
-
-    public void testDeleteLastAdmin() throws SQLException {
-        assertTrue(userGroupsDao.adminUserExists());
-        checkUserCollection(userGroupsDao.getAllUsers(true), ImmutableSet.of(1, 2, 3, 15, 16));
-        assertEquals(userGroupsDao.deleteUser("u2"), 3);
-        assertEquals(userGroupsDao.deleteUser("u3"), 1);
-        assertEquals(userGroupsDao.deleteUser("admin"), 1);
-        checkUserCollection(userGroupsDao.getAllUsers(true), ImmutableSet.of(1, 15));
-        assertFalse(userGroupsDao.adminUserExists());
-    }
-
-    @Test(dependsOnMethods = "testDeleteLastAdmin")
-    public void testDeleteAllData() throws SQLException {
-        assertEquals(userGroupsDao.deleteAllGroupsAndUsers(), 14);
-        assertTrue(userGroupsDao.getAllUsers(true).isEmpty());
-    }
-
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/security/itest/dao/SecurityBaseDaoTest.java b/storage/db/src/test/java/org/artifactory/storage/db/security/itest/dao/SecurityBaseDaoTest.java
deleted file mode 100644
index 8b954a7..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/security/itest/dao/SecurityBaseDaoTest.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.security.itest.dao;
-
-import com.google.common.collect.ImmutableSet;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.sapi.security.SecurityConstants;
-import org.artifactory.security.MutableUserInfo;
-import org.artifactory.security.UserInfo;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.artifactory.storage.db.security.dao.UserGroupsDao;
-import org.artifactory.storage.db.security.entity.Group;
-import org.artifactory.storage.db.security.entity.User;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import java.util.Collection;
-
-import static org.testng.Assert.*;
-
-/**
- * Date: 11/13/12
- * Time: 4:27 PM
- *
- * @author freds
- */
-public abstract class SecurityBaseDaoTest extends DbBaseTest {
-
-    @Autowired
-    protected UserGroupsDao userGroupsDao;
-
-    protected void checkUserCollection(Collection<User> users, ImmutableSet<Integer> expectedUids) {
-        checkUserCollection(users, expectedUids, 0);
-    }
-
-    protected void checkUserCollection(Collection<User> users, ImmutableSet<Integer> expectedUids, int nbGroupsDelta) {
-        assertEquals(users.size(), expectedUids.size());
-        for (User u : users) {
-            int gid = (int) u.getUserId();
-            assertTrue(expectedUids.contains(gid));
-            assertAnyUser(u, gid, nbGroupsDelta);
-        }
-    }
-
-    private void assertAnyUser(User user, int uid, int nbGroupsDelta) {
-        switch (uid) {
-            case 1:
-                assertUser1(user, nbGroupsDelta);
-                break;
-            case 2:
-                assertUser2(user, nbGroupsDelta);
-                break;
-            case 3:
-                assertUser3(user, nbGroupsDelta);
-                break;
-            case 15:
-                assertUser15(user, nbGroupsDelta);
-                break;
-            case 16:
-                assertUser16(user, nbGroupsDelta);
-                break;
-            default:
-                fail("User " + user + " unknown!");
-        }
-    }
-
-    protected void assertUser1(User u, int nbGroupsDelta) {
-        assertEquals(u.getUserId(), 1L);
-        assertEquals(u.getUsername(), "u1");
-        assertEquals(u.getPassword(), "apass");
-        assertEquals(u.getEmail(), "e at mail.com");
-        assertFalse(u.isAdmin());
-        assertTrue(u.isEnabled());
-        assertFalse(u.isUpdatableProfile());
-        assertEquals(u.getGroups().size(), 2 + nbGroupsDelta);
-    }
-
-    protected void assertUser2(User u, int nbGroupsDelta) {
-        assertEquals(u.getUserId(), 2L);
-        assertEquals(u.getUsername(), "u2");
-        assertEquals(u.getPassword(), "bpass");
-        assertEquals(u.getEmail(), "f at mail.com");
-        assertTrue(u.isAdmin());
-        assertTrue(u.isEnabled());
-        assertTrue(u.isUpdatableProfile());
-        assertEquals(u.getGroups().size(), 1 + nbGroupsDelta);
-    }
-
-    protected void assertUser3(User u, int nbGroupsDelta) {
-        assertEquals(u.getUserId(), 3L);
-        assertEquals(u.getUsername(), "u3");
-        assertEquals(u.getPassword(), "");
-        assertTrue(u.isAdmin());
-        assertFalse(u.isEnabled());
-        assertTrue(u.isUpdatableProfile());
-        assertEquals(u.getGroups().size(), 0 + nbGroupsDelta);
-        assertNull(u.getSalt());
-        assertNull(u.getEmail());
-        assertNull(u.getGenPasswordKey());
-        assertNull(u.getRealm());
-        assertNull(u.getPrivateKey());
-        assertNull(u.getPublicKey());
-        assertNull(u.getLastLoginClientIp());
-        assertNull(u.getBintrayAuth());
-    }
-
-    private void assertUser15(User u, int nbGroupsDelta) {
-        assertEquals(u.getUserId(), 15L);
-        assertEquals(u.getUsername(), UserInfo.ANONYMOUS);
-        assertEquals(u.getPassword(), MutableUserInfo.INVALID_PASSWORD);
-        assertNull(u.getEmail());
-        assertFalse(u.isAdmin());
-        assertTrue(u.isEnabled());
-        assertFalse(u.isUpdatableProfile());
-        assertEquals(u.getGroups().size(), 2 + nbGroupsDelta);
-    }
-
-    private void assertUser16(User u, int nbGroupsDelta) {
-        assertEquals(u.getUserId(), 16L);
-        assertEquals(u.getUsername(), SecurityService.DEFAULT_ADMIN_USER);
-        assertEquals(u.getPassword(), "password");
-        assertNull(u.getEmail());
-        assertTrue(u.isAdmin());
-        assertTrue(u.isEnabled());
-        assertTrue(u.isUpdatableProfile());
-        assertEquals(u.getGroups().size(), 0 + nbGroupsDelta);
-    }
-
-    protected void checkGroupCollection(Collection<Group> groups, ImmutableSet<Integer> expectedGids) {
-        assertEquals(groups.size(), expectedGids.size());
-        for (Group group : groups) {
-            int gid = (int) group.getGroupId();
-            assertTrue(expectedGids.contains(gid));
-            assertAnyGroup(group, gid);
-        }
-    }
-
-    private void assertAnyGroup(Group defaultGroup, int gid) {
-        switch (gid) {
-            case 1:
-                assertGroup1(defaultGroup);
-                break;
-            case 2:
-                assertGroup2(defaultGroup);
-                break;
-            case 3:
-                assertGroup3(defaultGroup);
-                break;
-            case 15:
-                assertGroup15(defaultGroup);
-                break;
-            default:
-                fail("Default group " + defaultGroup + " unknown!");
-        }
-    }
-
-    protected void assertGroup1(Group g) {
-        assertEquals(g.getGroupId(), 1L);
-        assertEquals(g.getGroupName(), "g1");
-        assertNull(g.getDescription());
-        assertFalse(g.isNewUserDefault());
-        assertNull(g.getRealm());
-        assertNull(g.getRealmAttributes());
-    }
-
-    protected void assertGroup2(Group g) {
-        assertEquals(g.getGroupId(), 2L);
-        assertEquals(g.getGroupName(), "g2");
-        assertEquals(g.getDescription(), "is default");
-        assertTrue(g.isNewUserDefault());
-        assertEquals(g.getRealm(), "default realm");
-        assertEquals(g.getRealmAttributes(), "default att");
-    }
-
-    private void assertGroup3(Group g) {
-        assertEquals(g.getGroupId(), 3L);
-        assertEquals(g.getGroupName(), "g3");
-        assertEquals(g.getDescription(), "no one");
-        assertFalse(g.isNewUserDefault());
-        assertEquals(g.getRealm(), SecurityConstants.DEFAULT_REALM);
-        assertNull(g.getRealmAttributes());
-    }
-
-    private void assertGroup15(Group g) {
-        assertEquals(g.getGroupId(), 15L);
-        assertEquals(g.getGroupName(), "readers");
-        assertEquals(g.getDescription(), "readers");
-        assertTrue(g.isNewUserDefault());
-        assertEquals(g.getRealm(), SecurityConstants.DEFAULT_REALM);
-        assertNull(g.getRealmAttributes());
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/security/itest/dao/UserGroupsDaoTest.java b/storage/db/src/test/java/org/artifactory/storage/db/security/itest/dao/UserGroupsDaoTest.java
deleted file mode 100644
index cdccdcb..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/security/itest/dao/UserGroupsDaoTest.java
+++ /dev/null
@@ -1,624 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.security.itest.dao;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterators;
-import org.artifactory.api.security.PasswordExpiryUser;
-import org.artifactory.security.SaltedPassword;
-import org.artifactory.storage.db.security.dao.UserGroupsDao;
-import org.artifactory.storage.db.security.dao.UserPropertiesDao;
-import org.artifactory.storage.db.security.entity.Group;
-import org.artifactory.storage.db.security.entity.User;
-import org.artifactory.storage.db.security.entity.UserGroup;
-import org.joda.time.DateTime;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.sql.SQLException;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests {@link org.artifactory.storage.db.security.dao.UserGroupsDao}.
- *
- * @author freds
- */
- at Test
-public class UserGroupsDaoTest extends SecurityBaseDaoTest {
-
-    @Autowired
-    protected UserPropertiesDao userPropsDao;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/user-group.sql");
-    }
-
-    public void testCreateGroup() throws SQLException {
-        int res = userGroupsDao.createGroup(new Group(4L, "g4", "Test G4", false, "test realm", "test att"));
-        assertEquals(res, 1);
-    }
-
-    @Test(dependsOnMethods = "testCreateGroup")
-    public void testUpdateGroup() throws SQLException {
-        Group group = userGroupsDao.findGroupById(4L);
-        assertNotNull(group);
-        assertEquals(group.getGroupId(), 4L);
-        assertEquals(group.getGroupName(), "g4");
-        Group modGroup = new Group(group.getGroupId(), group.getGroupName(), group.getDescription() + "m",
-                !group.isNewUserDefault(), group.getRealm() + "m", group.getRealmAttributes() + "m");
-        int res = userGroupsDao.updateGroup(modGroup);
-        assertEquals(res, 1);
-        Group modReadGroup = userGroupsDao.findGroupById(4L);
-        assertEquals(modReadGroup.getGroupId(), 4L);
-        assertTrue(modReadGroup.isIdentical(modGroup));
-    }
-
-    @Test(dependsOnMethods = "testUpdateGroup")
-    public void testWrongUpdateGroupName() throws SQLException {
-        Group group = userGroupsDao.findGroupById(4L);
-        assertNotNull(group);
-        assertEquals(group.getGroupId(), 4L);
-        assertEquals(group.getGroupName(), "g4");
-        Group modGroup = new Group(group.getGroupId(), group.getGroupName() + "changingName",
-                group.getDescription(),
-                group.isNewUserDefault(), group.getRealm(), group.getRealmAttributes());
-        int res = userGroupsDao.updateGroup(modGroup);
-        assertEquals(res, 0);
-        Group modReadGroup = userGroupsDao.findGroupById(4L);
-        assertEquals(modReadGroup.getGroupId(), 4L);
-        assertFalse(modReadGroup.isIdentical(modGroup));
-        assertTrue(modReadGroup.isIdentical(group));
-    }
-
-    @Test(dependsOnMethods = "testWrongUpdateGroupName")
-    public void testDeleteGroup() throws SQLException {
-        assertEquals(userGroupsDao.deleteGroup("g4"), 1);
-        assertNull(userGroupsDao.findGroupById(4L));
-    }
-
-    @Test
-    public void testCreateUser() throws SQLException {
-        long now = System.currentTimeMillis();
-        final User u4 = new User(4L, "u4",
-                "4pass", "salty", "4 at mail.com", "genPass",
-                false, true, false,
-                "realmy", "privKey", "pubKey",
-                now - 10000L, "10.0.0.1",
-                "johndoe:sdfjshf23SDF3kljsdfXVXD324", false, false);
-        u4.setGroups(new HashSet<UserGroup>(1));
-        int res = userGroupsDao.createUser(u4);
-        assertEquals(res, 1);
-        User user = userGroupsDao.findUserById(4L);
-        assertNotNull(user);
-        assertTrue(user.isIdentical(u4));
-    }
-
-    @Test(dependsOnMethods = "testCreateUser")
-    public void testCreateUserWithNulls() throws SQLException {
-        long now = System.currentTimeMillis();
-        final User u5 = new User(5L, "u5",
-                null, "", "", "",
-                false, true, false,
-                "", "", "",
-                now - 10000L, "",
-                "", false, false);
-        u5.setGroups(new HashSet<UserGroup>(1));
-        int res = userGroupsDao.createUser(u5);
-        assertEquals(res, 1);
-        User user = userGroupsDao.findUserById(5L);
-        assertNotNull(user);
-        assertFalse(user.isIdentical(u5));
-        assertEquals(user.getPassword(), "");
-        assertNull(user.getSalt());
-        assertNull(user.getEmail());
-        assertNull(user.getGenPasswordKey());
-        assertNull(user.getRealm());
-        assertNull(user.getPrivateKey());
-        assertNull(user.getPublicKey());
-        assertNull(user.getLastLoginClientIp());
-        assertNull(user.getBintrayAuth());
-    }
-
-    @Test(dependsOnMethods = "testUnLockAllUsers")
-    public void testUpdateUser() throws SQLException {
-        User user = userGroupsDao.findUserById(4L);
-        assertNotNull(user);
-        assertEquals(user.getUserId(), 4L);
-        assertEquals(user.getUsername(), "u4");
-        User modUser = new User(user.getUserId(), user.getUsername(),
-                user.getPassword() + "m", user.getSalt() + "m", user.getEmail() + "m",
-                user.getGenPasswordKey() + "m", !user.isAdmin(), !user.isEnabled(), !user.isUpdatableProfile(),
-                user.getRealm() + "m", user.getPrivateKey() + "m", user.getPublicKey() + "m",
-                user.getLastLoginTimeMillis() + 2L, user.getLastLoginClientIp() + "0",
-                "gogo:sdflkjsdfksjdfSEDFSDF2345325DFG", false, false);
-        modUser.setGroups(user.getGroups());
-        assertEquals(userGroupsDao.updateUser(modUser), 1);
-        User readUser = userGroupsDao.findUserById(4L);
-        assertNotNull(readUser);
-        assertTrue(readUser.isIdentical(modUser));
-    }
-
-    @Test(dependsOnMethods = "testUpdateUser")
-    public void testWrongUpdateUser() throws SQLException {
-        User user = userGroupsDao.findUserById(4L);
-        assertNotNull(user);
-        assertEquals(user.getUserId(), 4L);
-        assertEquals(user.getUsername(), "u4");
-        User modUser = new User(user.getUserId(), user.getUsername() + "modified",
-                user.getPassword(), user.getSalt(), user.getEmail(),
-                user.getGenPasswordKey(), user.isAdmin(), user.isEnabled(), user.isUpdatableProfile(),
-                user.getRealm(), user.getPrivateKey(), user.getPublicKey(),
-                user.getLastLoginTimeMillis(), user.getLastLoginClientIp(),
-                "sdsd:sdfsdf34534DFGDFG32434", false, false);
-        modUser.setGroups(user.getGroups());
-        assertEquals(userGroupsDao.updateUser(modUser), 0);
-        User readUser = userGroupsDao.findUserById(4L);
-        assertNotNull(readUser);
-        assertFalse(readUser.isIdentical(modUser));
-        assertTrue(readUser.isIdentical(user));
-    }
-
-    @Test(dependsOnMethods = "testGetUsersWhichPasswordIsAboutToExpire")
-    public void testDeleteUser() throws SQLException {
-        assertEquals(userGroupsDao.deleteUser("u4"), 2);
-        assertNull(userGroupsDao.findUserById(4L));
-    }
-
-    @Test(expectedExceptions = {IllegalStateException.class},
-            expectedExceptionsMessageRegExp = ".*not initialized.*Groups missing.*")
-    public void testCreateUserFailedNoGroups() throws SQLException {
-        final User u6 = new User(6L, "u6", "6pass", null, "6 at mail.com", false, false, false, null);
-        userGroupsDao.createUser(u6);
-    }
-
-    public void testCreateUserWithGroups() throws SQLException {
-        Group g70 = new Group(70L, "g70", "Test G70", false, null, null);
-        final User u7 = new User(7L, "u7", "7pass", null, "7 at mail.com", false, false, false, null);
-        final HashSet<UserGroup> groups = new HashSet<UserGroup>(1);
-        groups.add(new UserGroup(7L, 1L, null));
-        groups.add(new UserGroup(7L, 2L, "ll"));
-        groups.add(new UserGroup(7L, 70L, "dl"));
-        u7.setGroups(groups);
-        assertEquals(userGroupsDao.createGroup(g70), 1);
-        int res = userGroupsDao.createUser(u7);
-        assertEquals(res, 4);
-        User user = userGroupsDao.findUserById(7L);
-        assertNotNull(user);
-        assertTrue(user.isIdentical(u7));
-    }
-
-    @Test(dependsOnMethods = "testDeleteUser")
-    public void testDeleteUserAndGroupLinked() throws SQLException {
-        User user = userGroupsDao.findUserById(7L);
-        assertNotNull(user);
-        assertEquals(user.getUserId(), 7L);
-        assertEquals(user.getUsername(), "u7");
-        assertEquals(user.getGroups().size(), 3);
-        List<User> inGroup = userGroupsDao.findUsersInGroup(1L);
-        assertEquals(inGroup.size(), 2);
-        assertTrue(lookFor7(inGroup), "Did not find user 7 in " + Iterators.toString(inGroup.iterator()));
-        Group group = userGroupsDao.findGroupById(70L);
-        assertNotNull(group);
-        assertEquals(group.getGroupId(), 70L);
-        assertEquals(group.getGroupName(), "g70");
-        boolean found70 = lookFor70InUserGroups(user);
-        assertTrue(found70, "Did not find group link to 70 in " + user.getGroups().toString());
-        assertEquals(userGroupsDao.deleteGroup("g70"), 2);
-        assertNull(userGroupsDao.findGroupById(70L));
-        assertNull(userGroupsDao.findGroupByName("g70"));
-
-        User userNo70 = userGroupsDao.findUserById(7L);
-        assertFalse(lookFor70InUserGroups(userNo70));
-        assertEquals(userNo70.getGroups().size(), 2);
-
-        assertEquals(userGroupsDao.deleteUser("u7"), 4);
-        assertNull(userGroupsDao.findUserById(7L));
-        assertNull(userGroupsDao.findUsernameByUserId(7L));
-        assertEquals(userGroupsDao.findUserIdByUsername("u7"), 0L);
-
-
-        inGroup = userGroupsDao.findUsersInGroup(1L);
-        assertEquals(inGroup.size(), 1);
-        assertFalse(lookFor7(inGroup), "Should not find user 7 in " + Iterators.toString(inGroup.iterator()));
-    }
-
-    private boolean lookFor7(List<User> inGroup) {
-        boolean found7 = false;
-        for (User u : inGroup) {
-            if (u.getUserId() == 7L) {
-                found7 = true;
-                assertEquals(u.getUsername(), "u7");
-            }
-        }
-        return found7;
-    }
-
-    private boolean lookFor70InUserGroups(User user) {
-        boolean found70 = false;
-        for (UserGroup userGroup : user.getGroups()) {
-            if (userGroup.getGroupId() == 70L) {
-                found70 = true;
-                assertEquals(userGroup.getUserId(), 7L);
-                assertEquals(userGroup.getRealm(), "dl");
-            }
-        }
-        return found70;
-    }
-
-    @Test(dependsOnMethods = {"testDeleteUserAndGroupLinked", "testDeleteUser"})
-    public void testAddUsersToGroup() throws SQLException {
-        // User 5, 6 and 8 are left over from groups link failure => delete silently
-        userGroupsDao.deleteUser("u5");
-        userGroupsDao.deleteUser("u6");
-        userGroupsDao.deleteUser("u8");
-        checkAllUsernameMap(userGroupsDao.getAllUsernamePerIds());
-        checkAllGroupNameMap(userGroupsDao.getAllGroupNamePerIds());
-        checkUserCollection(userGroupsDao.getAllUsers(true), ImmutableSet.of(1, 2, 3, 15, 16));
-        checkUserCollection(userGroupsDao.getAllUsers(false), ImmutableSet.of(1, 15));
-        assertTrue(userGroupsDao.findUsersInGroup(3L).isEmpty());
-        assertEquals(userGroupsDao.addUsersToGroup(3L, ImmutableList.of("u1", "u2", "u3"), "artifactory"), 3);
-        checkUserCollection(userGroupsDao.findUsersInGroup(3L), ImmutableSet.of(1, 2, 3), 1);
-        checkGroupInUser(userGroupsDao.findUserByName("u3"));
-        assertEquals(userGroupsDao.removeUsersFromGroup(3L, ImmutableList.of("u1", "u2", "u3")), 3);
-        assertTrue(userGroupsDao.findUsersInGroup(3L).isEmpty());
-        checkUserCollection(userGroupsDao.getAllUsers(true), ImmutableSet.of(1, 2, 3, 15, 16));
-    }
-
-    private void checkAllUsernameMap(Map<Long, String> allUsernamePerIds) {
-        assertEquals(allUsernamePerIds.size(), 5);
-        for (Map.Entry<Long, String> entry : allUsernamePerIds.entrySet()) {
-            switch (entry.getKey().intValue()) {
-                case 1:
-                case 2:
-                case 3:
-                    assertEquals(entry.getValue(), "u"+entry.getKey());
-                    break;
-                case 15:
-                    assertEquals(entry.getValue(), "anonymous");
-                    break;
-                case 16:
-                    assertEquals(entry.getValue(), "admin");
-                    break;
-                default:
-                    fail("User ID "+entry.getKey()+" unknown");
-            }
-        }
-    }
-
-    private void checkAllGroupNameMap(Map<Long, String> allGroupNamePerIds) {
-        assertEquals(allGroupNamePerIds.size(), 4);
-        for (Map.Entry<Long, String> entry : allGroupNamePerIds.entrySet()) {
-            switch (entry.getKey().intValue()) {
-                case 1:
-                case 2:
-                case 3:
-                    assertEquals(entry.getValue(), "g"+entry.getKey());
-                    break;
-                case 15:
-                    assertEquals(entry.getValue(), "readers");
-                    break;
-                default:
-                    fail("User ID "+entry.getKey()+" unknown");
-            }
-        }
-    }
-
-    private void checkGroupInUser(User userById) {
-        ImmutableSet<UserGroup> groups = userById.getGroups();
-        for (UserGroup group : groups) {
-            assertEquals(group.getGroupId(), 3L);
-            assertEquals(group.getRealm(), "artifactory");
-        }
-    }
-
-    @Test(expectedExceptions = {SQLException.class})
-    public void testCreateUserWithFailedGroups() throws SQLException {
-        // TORE: [by fsi] use the error handling to verify we broke the correct constraint
-        final User u8 = new User(8L, "u8", "8pass", null, "8 at mail.com", false, false, false, null);
-        final HashSet<UserGroup> groups = new HashSet<UserGroup>(1);
-        groups.add(new UserGroup(8L, 1L, null));
-        // Group Id does not exists
-        groups.add(new UserGroup(8L, 44L, "ll"));
-        u8.setGroups(groups);
-        userGroupsDao.createUser(u8);
-    }
-
-    @Test(expectedExceptions = {SQLException.class})
-    public void testCreateGroupSameId() throws SQLException {
-        // TORE: [by fsi] use the error handling to verify we broke the correct constraint
-        userGroupsDao.createGroup(new Group(1L, "g6", "Test G4", false, "test realm", "test att"));
-    }
-
-    @Test(expectedExceptions = {SQLException.class})
-    public void testCreateGroupSameName() throws SQLException {
-        // TORE: [by fsi] use the error handling to verify we broke the correct constraint
-        userGroupsDao.createGroup(new Group(5L, "g1", "Test G4", false, "test realm", "test att"));
-    }
-
-    @Test(expectedExceptions = {SQLException.class})
-    public void testCreateUserSameId() throws SQLException {
-        // TORE: [by fsi] use the error handling to verify we broke the correct constraint
-        userGroupsDao.createUser(new User(1L, "u6", "1pass", null, "1 at mail.com", false, false, false, null));
-    }
-
-    @Test(expectedExceptions = {SQLException.class})
-    public void testCreateUserSameName() throws SQLException {
-        // TORE: [by fsi] use the error handling to verify we broke the correct constraint
-        userGroupsDao.createUser(new User(5L, "u1", "1pass", null, "1 at mail.com", false, false, false, null));
-    }
-
-    @Test(expectedExceptions = {SQLException.class})
-    public void testCreateUserPropNullKey() throws SQLException {
-        // TORE: [by fsi] use the error handling to verify we broke the correct constraint
-        userPropsDao.addUserPropertyById(2L, null, "F");
-    }
-
-    @Test(expectedExceptions = {SQLException.class})
-    public void testCreateUserPropNoUser() throws SQLException {
-        // TORE: [by fsi] use the error handling to verify we broke the correct constraint
-        userPropsDao.addUserPropertyById(3456L, "test.fail", "F");
-    }
-
-    public void testFindUserById() throws SQLException {
-        assertUser1(userGroupsDao.findUserById(1L), 0);
-        assertUser2(userGroupsDao.findUserById(2L), 0);
-        assertUser3(userGroupsDao.findUserById(3L), 0);
-        assertNull(userGroupsDao.findUserById(30L));
-    }
-
-    public void testFindUserByName() throws SQLException {
-        assertUser1(userGroupsDao.findUserByName("u1"), 0);
-        assertUser2(userGroupsDao.findUserByName("u2"), 0);
-        assertUser3(userGroupsDao.findUserByName("u3"), 0);
-        assertNull(userGroupsDao.findUserByName("does not exists"));
-    }
-
-    public void testFindUserProperties() throws SQLException {
-        assertEquals(userPropsDao.getUserProperty("u1", "test.null"), null);
-        assertEquals(userPropsDao.getUserProperty("u1", "test.dup"), "A");
-        assertEquals(userPropsDao.getUserProperty("u2", "test.dup"), "B");
-        assertEquals(userPropsDao.getUserProperty("anonymous", "test.login"), "http://git/login");
-        assertEquals(userPropsDao.getUserProperty("anonymous", "test.logout"), "http://git/logout");
-    }
-
-    public void testFindUserByProperty() throws SQLException {
-        assertEquals(userPropsDao.getUserIdByProperty("test.dup", "A"), 1L);
-        assertEquals(userPropsDao.getUserIdByProperty("test.dup", "B"), 2L);
-        // TODO: [by fsi] support search for key only
-        //assertEquals(userPropsDao.getUserIdByProperty("test.null", null), 1L);
-        assertEquals(userPropsDao.getUserIdByProperty("test.fail", "W"), 0L);
-        assertEquals(userPropsDao.getUserIdByProperty("test.null", "DD"), 0L);
-    }
-
-    public void createUserProperty() throws SQLException {
-        // new prop
-        assertTrue(userPropsDao.addUserPropertyById(2L, "test.new", "W"));
-        // update and reset
-        assertTrue(userPropsDao.addUserPropertyById(1L, "test.null", "W"));
-        assertTrue(userPropsDao.addUserPropertyById(1L, "test.null", null));
-    }
-
-    public void testNoUserProperties() throws SQLException {
-        assertEquals(userPropsDao.getUserProperty("u3", "test.fail"), null);
-        assertEquals(userPropsDao.getUserProperty("u2", "test.fail"), null);
-    }
-
-    public void testFindGroupById() throws SQLException {
-        assertGroup1(userGroupsDao.findGroupById(1L));
-        assertGroup2(userGroupsDao.findGroupById(2L));
-        assertNull(userGroupsDao.findGroupById(30L));
-    }
-
-    public void testFindGroupByName() throws SQLException {
-        assertGroup1(userGroupsDao.findGroupByName("g1"));
-        assertGroup2(userGroupsDao.findGroupByName("g2"));
-        assertNull(userGroupsDao.findGroupByName("does not exists"));
-    }
-
-    @Test(dependsOnMethods = {"testDeleteGroup", "testDeleteUserAndGroupLinked"})
-    public void testFindGroupByFilter() throws SQLException {
-        checkGroupCollection(userGroupsDao.findGroups(UserGroupsDao.GroupFilter.ALL), ImmutableSet.of(1, 2, 3, 15));
-        checkGroupCollection(userGroupsDao.findGroups(UserGroupsDao.GroupFilter.DEFAULTS), ImmutableSet.of(2, 15));
-        checkGroupCollection(userGroupsDao.findGroups(UserGroupsDao.GroupFilter.EXTERNAL), ImmutableSet.of(2));
-        checkGroupCollection(userGroupsDao.findGroups(UserGroupsDao.GroupFilter.INTERNAL), ImmutableSet.of(1, 3, 15));
-    }
-
-    @Test(dependsOnMethods = "testCreateUserWithNulls")
-    public void testLockUser() throws SQLException {
-        User user = userGroupsDao.findUserById(4L);
-        assertNotNull(user);
-        assertEquals(user.getUserId(), 4L);
-        assertEquals(user.getUsername(), "u4");
-        assertEquals(userGroupsDao.lockUser(user), 1);
-        User readUser = userGroupsDao.findUserById(4L);
-        assertNotNull(readUser);
-        assertTrue(readUser.isLocked());
-    }
-
-    @Test(dependsOnMethods = "testLockUser")
-    public void testListLockedUsers() throws SQLException {
-        Set<String> lockedUsers = userGroupsDao.getLockedUsersNames();
-        assertNotNull(lockedUsers);
-        assertEquals(lockedUsers.size(), 1);
-        assertEquals(lockedUsers.toArray(new String[0])[0], "u4");
-    }
-
-    @Test(dependsOnMethods = "testListLockedUsers")
-    public void testUnLockUser() throws SQLException {
-        User user = userGroupsDao.findUserById(4L);
-        assertNotNull(user);
-        assertEquals(user.getUserId(), 4L);
-        assertEquals(user.getUsername(), "u4");
-        assertTrue(userGroupsDao.unlockUser(user));
-        User readUser = userGroupsDao.findUserById(4L);
-        assertNotNull(readUser);
-        assertFalse(readUser.isLocked());
-    }
-
-    @Test(dependsOnMethods = "testUnLockUser")
-    public void testUnLockAllUsers() throws SQLException {
-        // lock user
-        User user = userGroupsDao.findUserById(4L);
-        assertNotNull(user);
-        assertEquals(user.getUserId(), 4L);
-        assertEquals(user.getUsername(), "u4");
-        assertEquals(userGroupsDao.lockUser(user), 1);
-        User readUser = userGroupsDao.findUserById(4L);
-        assertNotNull(readUser);
-        assertTrue(readUser.isLocked());
-
-        // unlock all users
-        user = userGroupsDao.findUserById(4L);
-        assertNotNull(user);
-        assertEquals(user.getUserId(), 4L);
-        assertEquals(user.getUsername(), "u4");
-        assertEquals(userGroupsDao.unlockAllUsers(), 1);
-        readUser = userGroupsDao.findUserById(4L);
-        assertNotNull(readUser);
-        assertFalse(readUser.isLocked());
-    }
-
-    @Test(dependsOnMethods = "testUnLockAllUsers")
-    public void testExpirePassword() throws SQLException {
-        User user = userGroupsDao.findUserById(4L);
-        assertNotNull(user);
-        assertEquals(user.getUserId(), 4L);
-        assertEquals(user.getUsername(), "u4");
-
-        userGroupsDao.expireUserPassword(user.getUsername());
-
-        user = userGroupsDao.findUserById(4L);
-        assertNotNull(user);
-        assertTrue(user.isCredentialsExpired());
-    }
-
-    @Test(dependsOnMethods = "testExpirePassword")
-    public void testRevalidatePassword() throws SQLException {
-        User user = userGroupsDao.findUserById(4L);
-        assertNotNull(user);
-        assertEquals(user.getUserId(), 4L);
-        assertEquals(user.getUsername(), "u4");
-
-        userGroupsDao.unexpirePassword(user.getUsername());
-
-        user = userGroupsDao.findUserById(4L);
-        assertNotNull(user);
-        assertFalse(user.isCredentialsExpired());
-    }
-
-    @Test(dependsOnMethods = "testRevalidatePassword")
-    public void testExpirePasswordsForAllUsers() throws SQLException {
-        User user = userGroupsDao.findUserById(4L);
-        assertNotNull(user);
-        assertEquals(user.getUserId(), 4L);
-        assertEquals(user.getUsername(), "u4");
-
-        userGroupsDao.expirePasswordForAllUsers();
-
-        user = userGroupsDao.findUserById(4L);
-        assertNotNull(user);
-        assertTrue(user.isCredentialsExpired());
-    }
-
-    @Test(dependsOnMethods = "testExpirePasswordsForAllUsers")
-    public void testRevalidatePasswordForAllUsers() throws SQLException {
-        User user = userGroupsDao.findUserById(4L);
-        assertNotNull(user);
-        assertEquals(user.getUserId(), 4L);
-        assertEquals(user.getUsername(), "u4");
-
-        userGroupsDao.unexpirePasswordForAllUsers();
-
-        user = userGroupsDao.findUserById(4L);
-        assertNotNull(user);
-        assertFalse(user.isCredentialsExpired());
-    }
-
-    @Test(dependsOnMethods = "testRevalidatePasswordForAllUsers")
-    public void testChangePassword() throws SQLException {
-        User user = userGroupsDao.findUserById(4L);
-        assertNotNull(user);
-        assertEquals(user.getUserId(), 4L);
-        assertEquals(user.getUsername(), "u4");
-
-        SaltedPassword newSaltedPassword =  new SaltedPassword("foo", "bar");
-        userGroupsDao.changePassword(user.getUsername(), newSaltedPassword);
-
-        user = userGroupsDao.findUserById(4L);
-        assertNotNull(user);
-        assertEquals(user.getPassword(), newSaltedPassword.getPassword());
-        assertEquals(user.getSalt(), newSaltedPassword.getSalt());
-    }
-
-    @Test(dependsOnMethods = "testChangePassword")
-    public void testMarkCredentialsExpired() throws SQLException {
-        User user = userGroupsDao.findUserById(4L);
-        assertNotNull(user);
-        assertEquals(user.getUserId(), 4L);
-        assertEquals(user.getUsername(), "u4");
-        assertFalse(user.isCredentialsExpired());
-
-        // since password was created today (along with user),
-        // we pass artificial number (less than 1 day)
-        userGroupsDao.markCredentialsExpired(new Long[]{4L});
-
-        user = userGroupsDao.findUserById(4L);
-        assertNotNull(user);
-        assertTrue(user.isCredentialsExpired());
-    }
-
-    @Test(dependsOnMethods = "testMarkCredentialsExpired")
-    public void testGetUsersWhichPasswordIsAboutToExpire() throws SQLException {
-        userGroupsDao.unexpirePassword("u4");
-
-        User user = userGroupsDao.findUserById(4L);
-        assertNotNull(user);
-        assertEquals(user.getUserId(), 4L);
-        assertEquals(user.getUsername(), "u4");
-        assertFalse(user.isCredentialsExpired());
-
-        DateTime now = DateTime.now();
-        final int millisInDay = 86400 * 1000;
-        Set<PasswordExpiryUser> usersWhichPasswordIsAboutToExpire =
-                userGroupsDao.getPasswordExpiredUsersByFilter(
-                        (Long creationTime) -> shouldNotifyUser(creationTime, now.minusDays(1).getMillis(), millisInDay, 3 * millisInDay));
-        assertEquals(usersWhichPasswordIsAboutToExpire.size(), 2);
-        List<String> userNames = usersWhichPasswordIsAboutToExpire.stream()
-                .map(PasswordExpiryUser::getUserName)
-                .collect(Collectors.toList());
-        assertTrue(userNames.contains("u4"));
-        assertTrue(userNames.contains("u7"));
-    }
-
-    //Duplicated here to create same behavior as UserGroupService.getUsersWhichPasswordIsAboutToExpire()
-    public boolean shouldNotifyUser (long creationTime, long millisNow, long millisDaysToKeepPassword,
-            long millisDaysToStartNotificationsFrom) {
-        return (millisNow >= ((creationTime + millisDaysToKeepPassword) - millisDaysToStartNotificationsFrom))
-                && (millisNow < (creationTime + millisDaysToKeepPassword));
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/security/itest/dao/UserPropertiesDaoTest.java b/storage/db/src/test/java/org/artifactory/storage/db/security/itest/dao/UserPropertiesDaoTest.java
deleted file mode 100644
index 4a62d9a..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/security/itest/dao/UserPropertiesDaoTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2016 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.security.itest.dao;
-
-import org.artifactory.model.xstream.security.UserProperty;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.artifactory.storage.db.security.dao.UserPropertiesDao;
-import org.fest.assertions.Assertions;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.sql.SQLException;
-import java.sql.SQLIntegrityConstraintViolationException;
-import java.util.List;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Tests {@link UserPropertiesDao}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class UserPropertiesDaoTest extends DbBaseTest {
-
-    @Autowired
-    private UserPropertiesDao dao;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/user_properties.sql");
-    }
-
-    public void addPropertyToExistingUser() throws SQLException {
-        dao.addUserPropertyById(1, "something", "good");    // user oferc
-    }
-
-    @Test(expectedExceptions = SQLIntegrityConstraintViolationException.class)
-    public void addPropertyToNonExistingUser() throws SQLException {
-        dao.addUserPropertyById(9911828, "wont", "work");
-    }
-
-    @Test(dependsOnMethods = "addPropertyToExistingUser")
-    public void getUserProperties() throws SQLException {
-        List<UserProperty> props = dao.getPropertiesForUser("oferc");
-        Assertions.assertThat(props).hasSize(1);
-        assertEquals(props.get(0).getPropKey(), "something");
-        assertEquals(props.get(0).getPropValue(), "good");
-    }
-
-    public void getUserPropertiesNonExistingUser() throws SQLException {
-        List<UserProperty> props = dao.getPropertiesForUser("nosuchuser");
-        assertEquals(props.size(), 0);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/security/itest/service/UserGroupServiceImplTest.java b/storage/db/src/test/java/org/artifactory/storage/db/security/itest/service/UserGroupServiceImplTest.java
deleted file mode 100644
index c47e7d9..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/security/itest/service/UserGroupServiceImplTest.java
+++ /dev/null
@@ -1,426 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.security.itest.service;
-
-import com.google.common.collect.Sets;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.security.PasswordExpiryUser;
-import org.artifactory.api.security.SecurityListener;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.api.security.UserInfoBuilder;
-import org.artifactory.descriptor.security.ldap.LdapSetting;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.model.xstream.security.UserGroupImpl;
-import org.artifactory.model.xstream.security.UserProperty;
-import org.artifactory.sapi.common.ExportSettings;
-import org.artifactory.sapi.common.ImportSettings;
-import org.artifactory.security.*;
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.artifactory.storage.security.service.UserGroupStoreService;
-import org.artifactory.util.SerializablePair;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.util.ReflectionTestUtils;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.Date;
-import java.util.Set;
-import java.util.concurrent.*;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import static org.testng.Assert.*;
-
-/**
- * @author freds
- */
- at Test
-public class UserGroupServiceImplTest extends DbBaseTest {
-
-    @Autowired
-    private UserGroupStoreService userGroupService;
-
-    @BeforeClass
-    public void setup() {
-        importSql("/sql/user-group.sql");
-        ReflectionTestUtils.setField(userGroupService, "securityService", securityService);
-
-    }
-
-    public void hasAnonymousUser() {
-        UserInfo anonymousUser = userGroupService.findUser(UserInfo.ANONYMOUS);
-        assertNotNull(anonymousUser);
-        assertEquals(anonymousUser.getUsername(), UserInfo.ANONYMOUS);
-        assertFalse(anonymousUser.isAdmin());
-        assertTrue(anonymousUser.isEnabled());
-    }
-
-    public void hasDefaultAdmin() {
-        UserInfo defaultAdmin = userGroupService.findUser(SecurityService.DEFAULT_ADMIN_USER);
-        assertNotNull(defaultAdmin);
-        assertEquals(defaultAdmin.getUsername(), SecurityService.DEFAULT_ADMIN_USER);
-        assertTrue(defaultAdmin.isAdmin());
-        assertTrue(defaultAdmin.isEnabled());
-    }
-
-    public void createUserTest() {
-        //Create user with group
-        String userName = "createUserByMutableUserInfo";
-        UserInfoBuilder builder = new UserInfoBuilder(userName);
-        UserGroupInfo expectedGroup = new UserGroupImpl("g1", "g1realm");
-        Set<UserGroupInfo> groups = Sets.newHashSet(expectedGroup);
-        builder.password(new SaltedPassword("password", "salt")).email("jfrog at jfrog.com").enabled(
-                true).updatableProfile(true).groups(groups);
-        MutableUserInfo expectedUser = builder.build();
-        boolean success = userGroupService.createUser(expectedUser);
-        Assert.assertTrue(success, "Fail to create user");
-        UserInfo userFromDB = userGroupService.findUser(userName);
-
-        // Make sure that the user is equals to the user in the db.
-        Assert.assertEquals(expectedUser.getUsername(), userFromDB.getUsername());
-        Assert.assertEquals(expectedUser.getPassword(), userFromDB.getPassword());
-        Assert.assertEquals(expectedUser.getEmail(), userFromDB.getEmail());
-        Assert.assertEquals(expectedUser.isEnabled(), userFromDB.isEnabled());
-        Assert.assertEquals(expectedUser.isUpdatableProfile(), userFromDB.isUpdatableProfile());
-
-        // Assert group
-        Assert.assertEquals(userFromDB.getGroups().size(), 1);
-        UserGroupInfo groupFromDb = userFromDB.getGroups().iterator().next();
-        Assert.assertEquals(expectedGroup.getRealm(), groupFromDb.getRealm());
-        Assert.assertEquals(expectedGroup.getRealm(), groupFromDb.getRealm());
-    }
-
-    public void createUserExistingUsername() {
-        MutableUserInfo user = new UserInfoBuilder(SecurityService.DEFAULT_ADMIN_USER).build();
-        Assert.assertFalse(userGroupService.createUser(user), "Should not be able to create duplicate username");
-    }
-
-    public void createGroupExistingGroupName() {
-        MutableGroupInfo group = InfoFactoryHolder.get().createGroup("g1");
-        Assert.assertFalse(userGroupService.createGroup(group), "Should not be able to create duplicate group name");
-    }
-
-    @Test(dependsOnMethods = "createUserTest")
-    public void testRegisterIncorrectLoginAttempt() {
-        String user = "createUserByMutableUserInfo";
-        assertEquals(userGroupService.getIncorrectLoginAttempts(user), 0);
-        int failedLoginAttempts = 20;
-        for (int i = 0; i < failedLoginAttempts; i++) {
-            userGroupService.registerIncorrectLoginAttempt(user);
-        }
-        assertEquals(userGroupService.getIncorrectLoginAttempts(user), failedLoginAttempts);
-    }
-
-    @Test(dependsOnMethods = "testRegisterIncorrectLoginAttempt")
-    public void testRegisterIncorrectLoginAttemptAsynchronously() throws InterruptedException {
-        String user = "createUserByMutableUserInfo";
-
-        ExecutorService pool =
-                Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() - 1);
-
-        try {
-            int failedLoginRegistrations = 25;
-            CountDownLatch progress = new CountDownLatch(failedLoginRegistrations);
-            for (int i = 0; i < failedLoginRegistrations; i++) {
-                pool.submit(new Callable<Boolean>() {
-                    @Override
-                    public Boolean call() throws Exception {
-                        try {
-                            userGroupService.registerIncorrectLoginAttempt(user);
-                        } finally {
-                            progress.countDown();
-                            return Boolean.TRUE;
-                        }
-                    }
-                });
-            }
-            progress.await(10, TimeUnit.SECONDS);
-            assertEquals(userGroupService.getIncorrectLoginAttempts(user), 45);
-        } finally {
-            pool.shutdownNow();
-        }
-    }
-
-    @Test(dependsOnMethods = "testRegisterIncorrectLoginAttemptAsynchronously")
-    public void testResetIncorrectLoginAttempts() {
-        String user = "createUserByMutableUserInfo";
-        assertEquals(userGroupService.getIncorrectLoginAttempts(user), 45);
-        userGroupService.resetIncorrectLoginAttempts(user);
-        assertEquals(userGroupService.getIncorrectLoginAttempts(user), 0);
-    }
-
-    @Test(dependsOnMethods = "testResetIncorrectLoginAttempts")
-    public void testNpeInRaceBetweenResetAndRegisterIncorrectLoginAttemptsAsynchronously() throws InterruptedException {
-        String user = "createUserByMutableUserInfo";
-
-        ExecutorService pool =
-                Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() - 1);
-
-        try {
-            int failedLoginRegistrations = 25;
-            CountDownLatch progress = new CountDownLatch(failedLoginRegistrations);
-            final AtomicInteger j = new AtomicInteger(0);
-            for (int i = 0; i < failedLoginRegistrations; i++) {
-                pool.submit(new Callable<Boolean>() {
-                    @Override
-                    public Boolean call() throws Exception {
-                        try {
-                            if ((j.incrementAndGet() % 5) == 0) {
-                                userGroupService.resetIncorrectLoginAttempts(user);
-                            }
-                            userGroupService.registerIncorrectLoginAttempt(user);
-                        } finally {
-                            progress.countDown();
-                            return Boolean.TRUE;
-                        }
-                    }
-                });
-            }
-            progress.await(10, TimeUnit.SECONDS);
-        } finally {
-            pool.shutdownNow();
-        }
-    }
-
-    /**
-     * RTFACT-9568 - create user with props failed when user id is bigger than max int.
-     * A high id is configured in the imported sql for this test.
-     */
-    public void createUserWithProperties() {
-        UserInfoBuilder mika = new UserInfoBuilder("mika").admin(true)
-                .addProp(new UserProperty("running", "false"));
-        userGroupService.createUserWithProperties(mika.build(), true);
-    }
-
-    private SecurityService securityService = new SecurityService() {
-        @Override
-        public SecurityInfo getSecurityData() {
-            return null;
-        }
-
-        @Override
-        public void importSecurityData(String securityXml) {
-
-        }
-
-        @Override
-        public void importSecurityData(SecurityInfo descriptor) {
-
-        }
-
-        @Override
-        public BasicStatusHolder testLdapConnection(LdapSetting ldapSetting, String username, String password) {
-            return null;
-        }
-
-        @Override
-        public boolean isPasswordEncryptionEnabled() {
-            return false;
-        }
-
-        @Override
-        public boolean userPasswordMatches(String passwordToCheck) {
-            return false;
-        }
-
-        @Override
-        public void generatePasswordResetKey(String username, String clientIp, String resetPageUrl) throws Exception {
-
-        }
-
-        @Override
-        public SerializablePair<Date, String> getPasswordResetKeyInfo(String username) {
-            return null;
-        }
-
-        @Override
-        public SerializablePair<String, Long> getUserLastLoginInfo(String username) {
-            return null;
-        }
-
-        @Override
-        public void updateUserLastLogin(String username, String clientIp, long loginTimeMillis) {
-
-        }
-//
-//        @Override
-//        public SerializablePair<String, Long> getUserLastAccessInfo(String username) {
-//            return null;
-//        }
-
-        @Override
-        public void updateUserLastAccess(String username, String clientIp, long accessTimeMillis) {
-
-        }
-
-        @Override
-        public boolean isHttpSsoProxied() {
-            return false;
-        }
-
-        @Override
-        public String getHttpSsoRemoteUserRequestVariable() {
-            return null;
-        }
-
-        @Override
-        public boolean isNoHttpSsoAutoUserCreation() {
-            return false;
-        }
-
-        @Override
-        public void addListener(SecurityListener listener) {
-
-        }
-
-        @Override
-        public void removeListener(SecurityListener listener) {
-
-        }
-
-        @Override
-        public void authenticateAsSystem() {
-
-        }
-
-        @Override
-        public void nullifyContext() {
-
-        }
-
-        @Override
-        public SaltedPassword generateSaltedPassword(String rawPassword) {
-            return null;
-        }
-
-        @Override
-        public SaltedPassword generateSaltedPassword(String rawPassword, @Nullable String salt) {
-            return null;
-        }
-
-        @Override
-        public String getDefaultSalt() {
-            return null;
-        }
-
-        @Nonnull
-        @Override
-        public void interceptLoginFailure(String userName, long accessTime) {
-
-        }
-
-        @Nonnull
-        @Override
-        public void interceptLoginSuccess(String userName) {
-
-        }
-
-        @Nonnull
-        @Override
-        public void ensureUserIsNotLocked(String userName) {
-
-        }
-
-        @Nonnull
-        @Override
-        public void ensureSessionIsNotLocked(String sessionIdentifier) {
-
-        }
-
-        @Nonnull
-        @Override
-        public void ensureLoginShouldNotBeDelayed(String userName) {
-
-        }
-
-        @Nonnull
-        @Override
-        public void ensureSessionShouldNotBeDelayed(String sessionIdentifier) {
-
-        }
-
-        @Override
-        public boolean isUserLocked(String userName) {
-            return false;
-        }
-
-        @Override
-        public void changePassword(String userName, String oldPassword, String newPassword1, String newPassword2) {
-
-        }
-
-        @Override
-        public void expireUserCredentials(String userName) {
-
-        }
-
-        @Override
-        public void unexpirePassword(String userName) {
-
-        }
-
-        @Override
-        public void expireCredentialsForAllUsers() {
-
-        }
-
-        @Override
-        public void unexpirePasswordForAllUsers() {
-
-        }
-
-        @Override
-        public Set<PasswordExpiryUser> getUsersWhichPasswordIsAboutToExpire() {
-            return null;
-        }
-
-        @Override
-        public void markUsersCredentialsExpired(int daysToKeepPassword) {
-
-        }
-
-        @Override
-        public Integer getUserPasswordDaysLeft(String userName) {
-            return null;
-        }
-
-        @Override
-        public boolean isUserLockPolicyEnabled() {
-            return false;
-        }
-
-        @Override
-        public boolean isPasswordExpirationPolicyEnabled() {
-            return false;
-        }
-
-        @Override
-        public void exportTo(ExportSettings settings) {
-
-        }
-
-        @Override
-        public void importFrom(ImportSettings settings) {
-
-        }
-    };
-
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/upgrades/common/UpgradeBaseTest.java b/storage/db/src/test/java/org/artifactory/storage/db/upgrades/common/UpgradeBaseTest.java
deleted file mode 100644
index 5737508..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/upgrades/common/UpgradeBaseTest.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.upgrades.common;
-
-import ch.qos.logback.classic.util.ContextInitializer;
-import org.artifactory.storage.StorageProperties;
-import org.artifactory.storage.db.DbType;
-import org.artifactory.storage.db.itest.DbTestUtils;
-import org.artifactory.storage.db.spring.ArtifactoryDataSource;
-import org.artifactory.storage.db.util.DbUtils;
-import org.artifactory.storage.db.util.JdbcHelper;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.artifactory.util.ResourceUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.sql.Connection;
-import java.sql.SQLException;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Date: 8/5/13 9:58 AM
- *
- * @author freds
- */
- at Test(groups = "dbtest-upgrade")
- at ContextConfiguration(locations = {"classpath:spring/db-upgrade-test-context.xml"})
-public abstract class UpgradeBaseTest extends AbstractTestNGSpringContextTests {
-    @Autowired
-    protected JdbcHelper jdbcHelper;
-
-    @Autowired
-    @Qualifier("storageProperties")
-    protected StorageProperties storageProperties;
-
-    private ArtifactoryHomeBoundTest artifactoryHomeBoundTest;
-
-    static {
-        // use the itest logback config
-        URL url = UpgradeBaseTest.class.getClassLoader().getResource("logback-dbtest.xml");
-        System.setProperty(ContextInitializer.CONFIG_FILE_PROPERTY, url.getPath());
-    }
-
-    protected static InputStream getPreviousDbSchemaSql(String previousVersion, DbType dbType) {
-        String dbConfigDir = dbType.toString();
-        return ResourceUtils.getResource(
-                "/upgrades/" + previousVersion + "/ddl/" + dbConfigDir + "/" + dbConfigDir + ".sql");
-    }
-
-    protected static InputStream getPreviousImportSql(String previousVersion, String dataFileName) {
-        return ResourceUtils.getResource(
-                "/upgrades/" + previousVersion + "/data/" + dataFileName + ".sql");
-    }
-
-    protected static InputStream getDbSchemaUpgradeSql(String forVersion, DbType dbType) {
-        String dbConfigDir = dbType.toString();
-        return ResourceUtils.getResource(
-                "/conversion/" + dbConfigDir + "/" + dbConfigDir + "_" + forVersion + ".sql");
-    }
-
-    @BeforeClass
-    @Override
-    protected void springTestContextPrepareTestInstance() throws Exception {
-        artifactoryHomeBoundTest = createArtifactoryHomeTest();
-        artifactoryHomeBoundTest.bindArtifactoryHome();
-
-        super.springTestContextPrepareTestInstance();
-    }
-
-    protected ArtifactoryHomeBoundTest createArtifactoryHomeTest() throws IOException {
-        return new ArtifactoryHomeBoundTest();
-    }
-
-    @AfterMethod
-    protected void verifyDbResourcesReleased() throws IOException, SQLException {
-        // make sure there are no active connections
-        ArtifactoryDataSource ds = (ArtifactoryDataSource) jdbcHelper.getDataSource();
-        assertEquals(ds.getActiveConnectionsCount(), 0, "Found " + ds.getActiveConnectionsCount() +
-                " active connections after test ended");
-        artifactoryHomeBoundTest.unbindArtifactoryHome();
-    }
-
-    @BeforeMethod
-    public void bindArtifactoryHome() {
-        artifactoryHomeBoundTest.bindArtifactoryHome();
-    }
-
-    @AfterMethod
-    public void unbindArtifactoryHome() {
-        artifactoryHomeBoundTest.unbindArtifactoryHome();
-    }
-
-    public void rollBackTo300Version() throws SQLException, IOException {
-        try (Connection connection = jdbcHelper.getDataSource().getConnection()) {
-            // Making DB looks like v300 with data
-            DbTestUtils.dropAllExistingTables(connection);
-            DbUtils.executeSqlStream(connection, getPreviousDbSchemaSql("v300", storageProperties.getDbType()));
-            DbUtils.executeSqlStream(connection, getPreviousImportSql("v300", "user-group"));
-            DbUtils.executeSqlStream(connection, getPreviousImportSql("v300", "acls"));
-            DbUtils.executeSqlStream(connection, getPreviousImportSql("v300", "builds"));
-            DbUtils.executeSqlStream(connection, getPreviousImportSql("v300", "nodes"));
-        }
-    }
-    protected void importSql(String resourcePath) {
-        InputStream resource = ResourceUtils.getResource(resourcePath);
-        Connection con = null;
-        try {
-            con = jdbcHelper.getDataSource().getConnection();
-            DbUtils.executeSqlStream(con, resource);
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        } finally {
-            DbUtils.close(con);
-        }
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/upgrades/v310/UpgradeTo310.java b/storage/db/src/test/java/org/artifactory/storage/db/upgrades/v310/UpgradeTo310.java
deleted file mode 100644
index 2a19d25..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/upgrades/v310/UpgradeTo310.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.upgrades.v310;
-
-import org.artifactory.storage.db.itest.DbTestUtils;
-import org.artifactory.storage.db.upgrades.common.UpgradeBaseTest;
-import org.artifactory.storage.db.util.DbUtils;
-
-import java.sql.Connection;
-
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-/**
- * Date: 8/5/13 9:58 AM
- *
- * @author freds
- */
-public class UpgradeTo310 extends UpgradeBaseTest {
-
-    public void testDdlUpgrade() throws Exception {
-        rollBackTo300Version();
-        // Now the DB is like in 3.0.x, should be missing the new tables of 3.1.x
-        try (Connection connection = jdbcHelper.getDataSource().getConnection()) {
-            assertTrue(DbTestUtils.isTableMissing(connection));
-            DbUtils.executeSqlStream(connection, getDbSchemaUpgradeSql("v310", storageProperties.getDbType()));
-            assertFalse(DbTestUtils.isTableMissing(connection));
-        }
-    }
-
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/upgrades/versions/ArtifactoryDBVersionTest.java b/storage/db/src/test/java/org/artifactory/storage/db/upgrades/versions/ArtifactoryDBVersionTest.java
deleted file mode 100644
index 2169a5a..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/upgrades/versions/ArtifactoryDBVersionTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.artifactory.storage.db.upgrades.versions;
-
-import org.apache.commons.lang.RandomStringUtils;
-import org.artifactory.storage.db.DbType;
-import org.artifactory.storage.db.itest.DbTestUtils;
-import org.artifactory.storage.db.upgrades.common.UpgradeBaseTest;
-import org.artifactory.storage.db.version.ArtifactoryDBVersion;
-import org.artifactory.version.ArtifactoryVersion;
-import org.testng.annotations.BeforeClass;
-
-import java.io.IOException;
-import java.sql.Connection;
-import java.sql.SQLException;
-
-import static org.artifactory.storage.db.version.ArtifactoryDBVersion.convert;
-import static org.artifactory.storage.db.version.ArtifactoryDBVersion.v100;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertFalse;
-
-/**
- * Author: gidis
- */
-public class ArtifactoryDBVersionTest extends UpgradeBaseTest {
-
-    @BeforeClass
-    @Override
-    protected void springTestContextPrepareTestInstance() throws Exception {
-        super.springTestContextPrepareTestInstance();
-
-        rollBackTo300Version();
-        convert(getFromVersion(v100), jdbcHelper, storageProperties.getDbType());
-    }
-
-    public void test300DBChanges() throws IOException, SQLException {
-        // Now the DB is like in 3.0.x, should be missing the new tables of 3.1.x
-        try (Connection connection = jdbcHelper.getDataSource().getConnection()) {
-            assertFalse(DbTestUtils.isTableMissing(connection));
-        }
-    }
-
-    public void test311DBChanges() throws IOException, SQLException {
-        try (Connection connection = jdbcHelper.getDataSource().getConnection()) {
-            assertEquals(DbTestUtils.getColumnSize(connection, "node_props", "prop_value"), 4000);
-            if (storageProperties.getDbType() == DbType.MSSQL) {
-                return; // RTFACT-5768
-            }
-            jdbcHelper.executeUpdate("INSERT INTO node_props VALUES(?, ?, ?, ?)",
-                    15, 15, "longProp", RandomStringUtils.randomAscii(3999));
-        }
-    }
-
-    private ArtifactoryVersion getFromVersion(ArtifactoryDBVersion version) {
-        return version.getComparator().getFrom();
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/util/BlobWrapperTest.java b/storage/db/src/test/java/org/artifactory/storage/db/util/BlobWrapperTest.java
deleted file mode 100644
index 6eb5f9a..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/util/BlobWrapperTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.util;
-
-import org.apache.commons.io.IOUtils;
-import org.artifactory.storage.db.util.blob.BlobWrapper;
-import org.testng.annotations.Test;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertSame;
-
-/**
- * Tests {@link org.artifactory.storage.db.util.blob.BlobWrapper}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class BlobWrapperTest {
-
-    public void constructWithInputStream() throws Exception {
-        ByteArrayInputStream in = new ByteArrayInputStream(new byte[]{1, 5, 6});
-        BlobWrapper blobWrapper = new BlobWrapper(in, 3);
-        assertEquals(blobWrapper.getLength(), 3);
-        assertSame(blobWrapper.getInputStream(), in);
-    }
-
-    @Test(expectedExceptions = NullPointerException.class)
-    public void nullInputStream() throws Exception {
-        new BlobWrapper(null, 0);
-    }
-
-    public void stringConstructor() throws IOException {
-        String testData = "test data";
-        BlobWrapper blobWrapper = new BlobWrapper(testData);
-        assertEquals(blobWrapper.getLength(), testData.length());
-        assertEquals(IOUtils.toString(blobWrapper.getInputStream()), testData);
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/util/ConcurrentIdGeneratorTest.java b/storage/db/src/test/java/org/artifactory/storage/db/util/ConcurrentIdGeneratorTest.java
deleted file mode 100644
index fe55aa0..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/util/ConcurrentIdGeneratorTest.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2013 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.storage.db.util;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Ordering;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.Map;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorCompletionService;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-import static org.testng.Assert.assertTrue;
-
-/**
-* @author mamo
-*/
-public class ConcurrentIdGeneratorTest extends IdGeneratorBaseTest {
-    private static final Logger log = LoggerFactory.getLogger(ConcurrentIdGeneratorTest.class);
-
-    // Use only prime numbers to make sure things don't overlaps
-    public static final int POOL_SIZE = 2;
-    public static final int COUNT = 3 * POOL_SIZE;
-    public static final int STEP = 2;
-    public static final int BLOCKS_INC = 2;
-
-    static {
-        System.setProperty(ConstantValues.dbIdGeneratorFetchAmount.getPropertyName(), String.valueOf(STEP));
-    }
-
-    @Test
-    public void concurrentIdGenerator() throws ExecutionException, InterruptedException {
-        ExecuteManyIdNext executeManyIdNext = new ExecuteManyIdNext(idGenerator, getCurrentInTableId());
-        executeManyIdNext.doIt();
-        executeManyIdNext.checkUniqueness();
-        executeManyIdNext.checkContinuity();
-        executeManyIdNext.checkIncrementDelta(getCurrentInTableId(), STEP);
-    }
-
-    public interface ContextProvider {
-        ArtifactoryContext getContext();
-    }
-
-    public static class ExecuteManyIdNext {
-        final ContextProvider contextProvider;
-        IdGenerator idGenerator;
-        final long startId;
-        private final ExecutorService executorService;
-        private final ExecutorCompletionService<Map<Long, Long>> completionService;
-        private final Map<Long, Long> indices;
-        private long skipDiffs;
-
-        ExecuteManyIdNext(IdGenerator idGenerator, long startId) {
-            this.idGenerator = idGenerator;
-            this.startId = startId;
-            this.contextProvider = null;
-            executorService = Executors.newFixedThreadPool(POOL_SIZE);
-            completionService = new ExecutorCompletionService<>(executorService);
-            indices = new ConcurrentHashMap<>();
-        }
-
-        public ExecuteManyIdNext(ContextProvider contextProvider, long startId) {
-            this.startId = startId;
-            this.idGenerator = null;
-            this.contextProvider = contextProvider;
-            executorService = Executors.newFixedThreadPool(POOL_SIZE);
-            completionService = new ExecutorCompletionService<>(executorService);
-            indices = new ConcurrentHashMap<>();
-        }
-
-        public void doIt() {
-            for (int i = 0; i < COUNT; i++) {
-                completionService.submit(new CallNextId(this));
-            }
-        }
-
-        public void checkUniqueness() throws InterruptedException, ExecutionException {
-            for (int i = 0; i < COUNT; i++) {
-                Map<Long, Long> nextIds = completionService.take().get();
-                for (Long nextId : nextIds.keySet()) {
-                    assertTrue(indices.put(nextId, nextId) == null, "Index should be unique " + nextId);
-                }
-            }
-
-        }
-
-        public long checkContinuity() {
-            skipDiffs = 0L;
-            int skips = 0;
-            ImmutableList<Long> sortedIndices = Ordering.natural().immutableSortedCopy(indices.keySet());
-            for (int i = 1; i < sortedIndices.size(); i++) {
-                long diff = sortedIndices.get(i) - sortedIndices.get(i - 1);
-                if (diff != 1) {
-                    log.error("skip index #{}: {}", i, diff);
-                    skips++;
-                    skipDiffs += diff;
-                }
-            }
-            if (skips > 2) {
-                Assert.fail("too many skips in unique ids");
-            }
-            return skipDiffs;
-        }
-
-        /**
-         * Let ACTUAL be the total number of ids, provided by the database
-         * Let BOTTOM be the total number of ids, requested by the test.
-         * Let STEP be the size of single block (of idis), provided by the database
-         * The test ensure that ACTUAL minus BOTTOM is less than STEP.
-         * <p/>
-         * Note that the skipDiffs is the number of ids, requested by Artifactory during the test, those requests are
-         * included in the ACTUAL but not in the BOTTOM therefore we should consider the in the skipDiffs calculation:
-         * <p/>
-         * idis provided by the database and the
-         *
-         * @param currentInTableId
-         * @param acceptDelta
-         */
-        public void checkIncrementDelta(Long currentInTableId, int acceptDelta) {
-            // calculate the idis provided by the database during the test
-            long actual = currentInTableId - startId;
-            // calculate the number of idis requested by the test
-            long bottom = (long) COUNT * (long) BLOCKS_INC;
-            long delta = actual - bottom;
-            String msg = "Actual=" + actual + " bottom=" + bottom + " delta=" + delta + " acceptDelta=" + acceptDelta + " skips=" + skipDiffs;
-            log.info(msg);
-            assertTrue(delta >= 0L && delta < (acceptDelta + skipDiffs),
-                    "Index should have been incremented. Got " + msg);
-        }
-    }
-
-    static class CallNextId implements Callable<Map<Long, Long>> {
-        private final ExecuteManyIdNext parent;
-
-        CallNextId(ExecuteManyIdNext parent) {
-            this.parent = parent;
-        }
-
-        @Override
-        public Map<Long, Long> call() throws Exception {
-            Map<Long, Long> result = Maps.newHashMap();
-            try {
-                IdGenerator localIdGenerator;
-                if (parent.contextProvider != null) {
-                    ArtifactoryContext context = parent.contextProvider.getContext();
-                    ArtifactoryHome.bind(context.getArtifactoryHome());
-                    localIdGenerator = context.beanForType(IdGenerator.class);
-                } else {
-                    localIdGenerator = parent.idGenerator;
-                }
-                for (int j = 0; j < BLOCKS_INC; j++) {
-                    long nextId = localIdGenerator.nextId();
-                    if (nextId % 100_000 == 0) {
-                        log.info("nextId = " + nextId);
-                    }
-
-                    result.put(nextId, nextId);
-                }
-            } finally {
-                if (parent.contextProvider != null) {
-                    ArtifactoryHome.unbind();
-                }
-            }
-            return result;
-        }
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/util/IdGeneratorBaseTest.java b/storage/db/src/test/java/org/artifactory/storage/db/util/IdGeneratorBaseTest.java
deleted file mode 100644
index b6bda07..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/util/IdGeneratorBaseTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.util;
-
-import org.artifactory.storage.db.itest.DbBaseTest;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.util.ReflectionTestUtils;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * @author mamo
- */
-public abstract class IdGeneratorBaseTest extends DbBaseTest {
-
-    @Autowired
-    protected SimpleIdGenerator idGenerator;
-
-    @Autowired
-    protected JdbcHelper jdbcHelper;
-
-    protected long getCurrentInMemoryId() {
-        SimpleIdGenerator idGenerator = (SimpleIdGenerator) ReflectionTestUtils.getField(dbService, "idGenerator");
-        return ((AtomicLong) ReflectionTestUtils.getField(idGenerator, "currentIndex")).get();
-    }
-
-    protected long getMaxReservedIndex() {
-        SimpleIdGenerator idGenerator = (SimpleIdGenerator) ReflectionTestUtils.getField(dbService, "idGenerator");
-        return (Long) ReflectionTestUtils.getField(idGenerator, "maxReservedIndex");
-    }
-
-    protected Long getCurrentInTableId() {
-        try (ResultSet rs = jdbcHelper.executeSelect(
-                "SELECT current_id FROM unique_ids WHERE index_type = ?", IdGenerator.INDEX_TYPE_GENERAL)) {
-            return rs.next() ? rs.getLong(1) : null;
-        } catch (SQLException e) {
-            throw new RuntimeException("Could not get current_id from unique_ids", e);
-        }
-    }
-}
diff --git a/storage/db/src/test/java/org/artifactory/storage/db/util/SimpleIdGeneratorTest.java b/storage/db/src/test/java/org/artifactory/storage/db/util/SimpleIdGeneratorTest.java
deleted file mode 100644
index e008653..0000000
--- a/storage/db/src/test/java/org/artifactory/storage/db/util/SimpleIdGeneratorTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.storage.db.util;
-
-import org.artifactory.common.ConstantValues;
-import org.testng.annotations.Test;
-
-import java.sql.SQLException;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * @author mamo
- */
- at Test(sequential = true)
-public class SimpleIdGeneratorTest extends IdGeneratorBaseTest {
-
-    @Test
-    public void afterInit() throws SQLException {
-        assertEquals(getCurrentInTableId(), (Long) IdGenerator.NO_ID, "Wrong init db value");
-        assertEquals(getCurrentInMemoryId(), IdGenerator.NO_ID, "Wrong init in memory");
-    }
-
-    @Test(dependsOnMethods = "afterInit")
-    public void firstId() throws SQLException {
-        assertEquals(idGenerator.nextId(), 1, "First nextId is lazy initialized to 1");
-        assertEquals(getCurrentInTableId(), step(), "First nextId should not update db");
-        assertEquals(getCurrentInMemoryId(), 2, "First nextId should update in memory by 1");
-    }
-
-    @Test(dependsOnMethods = "firstId")
-    public void nextId() throws SQLException {
-        assertEquals(idGenerator.nextId(), 2);
-        assertEquals(getCurrentInTableId(), step(), "Second nextId should not update db");
-        assertEquals(getCurrentInMemoryId(), 3, "Second nextId should increment by 1");
-    }
-
-    @Test(dependsOnMethods = "nextId")
-    public void beforeExhaust() throws SQLException {
-        while (getCurrentInMemoryId() <= step()) {
-            long inMemory = getCurrentInMemoryId();
-            long nextId = idGenerator.nextId();
-            assertEquals(inMemory, nextId, "In memory value is the nextId"); //getAndInc
-            assertEquals(getCurrentInMemoryId(), nextId + 1, "In memory should increment by 1");
-        }
-        assertEquals(getCurrentInTableId(), step(), "Wrong before exhaust db value");
-        assertEquals(getCurrentInMemoryId(), step() + 1, "In memory exhausted before db");
-    }
-
-    @Test(dependsOnMethods = "beforeExhaust")
-    public void afterExhaust() throws SQLException {
-        long nextId = idGenerator.nextId();
-        assertEquals(nextId, step() + 1, "Wrong exhaust nextId value");
-        assertEquals(getCurrentInTableId(), new Long(2 * step()), "Wrong after exhaust db value");
-        assertEquals(getCurrentInMemoryId(), step() + 2, "Wrong after exhaust in memory");
-    }
-
-    private static Long step() {
-        return ConstantValues.dbIdGeneratorFetchAmount.getLong();
-    }
-}
diff --git a/storage/db/src/test/resources/aql/stream/buildsWithArtifacts.json b/storage/db/src/test/resources/aql/stream/buildsWithArtifacts.json
deleted file mode 100644
index f6cf8b4..0000000
--- a/storage/db/src/test/resources/aql/stream/buildsWithArtifacts.json
+++ /dev/null
@@ -1,91 +0,0 @@
-
-{
-  "results" : [ {
-    "build.created" : "2012-10-12T02:00:00.000+02:00",
-    "build.created_by" : "me",
-    "build.modified" : "2012-10-12T02:00:00.001+02:00",
-    "build.modified_by" : "not-me",
-    "build.name" : "ba",
-    "build.number" : "1",
-    "modules" : [ {
-      "dependencies" : [ {
-        "dependency.md5" : "d02a360ecad98a34b59863c1e65bcf71",
-        "dependency.name" : "bb1mod3-art1",
-        "dependency.scope" : "compile",
-        "dependency.sha1" : "dddd88fc2a043c2479a6de676a2f8179e9eadddd",
-        "dependency.type" : "dll"
-      }, {
-        "dependency.md5" : "c02a360ecad98a34b59863c1e65bcf71",
-        "dependency.name" : "bb1mod1-art1",
-        "dependency.scope" : "compile",
-        "dependency.sha1" : "ccab88fc2a043c2479a6de676a2f8179e9ea2167",
-        "dependency.type" : "dll"
-      } ]
-    } ]
-  },{
-    "build.created" : "2012-10-12T02:16:40.000+02:00",
-    "build.created_by" : "me",
-    "build.name" : "bb",
-    "build.number" : "1",
-    "build.url" : "http://myserver/jenkins/bb/1",
-    "modules" : [ {
-      "dependencies" : [ {
-        "dependency.md5" : "c02a360ecad98a34b59863c1e65bcf71",
-        "dependency.name" : "bb1mod2-art1",
-        "dependency.scope" : "compile",
-        "dependency.sha1" : "ccab88fc2a043c2479a6de676a2f8179e9ea2167",
-        "dependency.type" : "dll"
-      } ]
-    }, {
-      "dependencies" : [ {
-        "dependency.md5" : "c02a360ecad98a34b59863c1e65bcf71",
-        "dependency.name" : "ba1mod3-art1",
-        "dependency.scope" : "compile",
-        "dependency.sha1" : "dcab88fc2a043c2479a6de676a2f8179e9ea2167",
-        "dependency.type" : "dll"
-      }, {
-        "dependency.md5" : "d02a360ecad98a34b59863c1e65bcf71",
-        "dependency.name" : "bb1mod3-art1",
-        "dependency.scope" : "compile",
-        "dependency.sha1" : "ccab88fc2a043c2479a6de676a2f8179e9ea2167",
-        "dependency.type" : "dll"
-      }, {
-        "dependency.md5" : "d02a360ecad98a34b59863c1e65bcf71",
-        "dependency.name" : "bb1mod3-art1",
-        "dependency.scope" : "compile",
-        "dependency.sha1" : "bcab88fc2a043c2479a6de676a2f8179e9ea2167",
-        "dependency.type" : "dll"
-      } ]
-    } ]
-  },{
-    "build.created" : "2012-10-12T02:33:20.000+02:00",
-    "build.created_by" : "me",
-    "build.name" : "ba",
-    "build.number" : "2",
-    "modules" : [ {
-      "dependencies" : [ {
-        "dependency.md5" : "d02a360ecad98a34b59863c1e65bcf71",
-        "dependency.name" : "ba2mod4-art1",
-        "dependency.scope" : "compile",
-        "dependency.sha1" : "ccab88fc2a043c2479a6de676a2f8179e9ea2167",
-        "dependency.type" : "dll"
-      } ]
-    } ]
-  },{
-    "build.created" : "2012-10-12T02:50:00.000+02:00",
-    "build.created_by" : "me",
-    "build.name" : "bb",
-    "build.number" : "2",
-    "build.url" : "http://myserver/jenkins/bb/2"
-  },{
-    "build.created" : "2012-10-12T03:06:40.000+02:00",
-    "build.created_by" : "me",
-    "build.name" : "ba",
-    "build.number" : "3"
-  } ],
-  "range" : {
-    "start_pos" : 0,
-    "end_pos" : 5,
-    "total" : 5
-  }
-}
diff --git a/storage/db/src/test/resources/aql/stream/buildsWithDependency.json b/storage/db/src/test/resources/aql/stream/buildsWithDependency.json
deleted file mode 100644
index f6cf8b4..0000000
--- a/storage/db/src/test/resources/aql/stream/buildsWithDependency.json
+++ /dev/null
@@ -1,91 +0,0 @@
-
-{
-  "results" : [ {
-    "build.created" : "2012-10-12T02:00:00.000+02:00",
-    "build.created_by" : "me",
-    "build.modified" : "2012-10-12T02:00:00.001+02:00",
-    "build.modified_by" : "not-me",
-    "build.name" : "ba",
-    "build.number" : "1",
-    "modules" : [ {
-      "dependencies" : [ {
-        "dependency.md5" : "d02a360ecad98a34b59863c1e65bcf71",
-        "dependency.name" : "bb1mod3-art1",
-        "dependency.scope" : "compile",
-        "dependency.sha1" : "dddd88fc2a043c2479a6de676a2f8179e9eadddd",
-        "dependency.type" : "dll"
-      }, {
-        "dependency.md5" : "c02a360ecad98a34b59863c1e65bcf71",
-        "dependency.name" : "bb1mod1-art1",
-        "dependency.scope" : "compile",
-        "dependency.sha1" : "ccab88fc2a043c2479a6de676a2f8179e9ea2167",
-        "dependency.type" : "dll"
-      } ]
-    } ]
-  },{
-    "build.created" : "2012-10-12T02:16:40.000+02:00",
-    "build.created_by" : "me",
-    "build.name" : "bb",
-    "build.number" : "1",
-    "build.url" : "http://myserver/jenkins/bb/1",
-    "modules" : [ {
-      "dependencies" : [ {
-        "dependency.md5" : "c02a360ecad98a34b59863c1e65bcf71",
-        "dependency.name" : "bb1mod2-art1",
-        "dependency.scope" : "compile",
-        "dependency.sha1" : "ccab88fc2a043c2479a6de676a2f8179e9ea2167",
-        "dependency.type" : "dll"
-      } ]
-    }, {
-      "dependencies" : [ {
-        "dependency.md5" : "c02a360ecad98a34b59863c1e65bcf71",
-        "dependency.name" : "ba1mod3-art1",
-        "dependency.scope" : "compile",
-        "dependency.sha1" : "dcab88fc2a043c2479a6de676a2f8179e9ea2167",
-        "dependency.type" : "dll"
-      }, {
-        "dependency.md5" : "d02a360ecad98a34b59863c1e65bcf71",
-        "dependency.name" : "bb1mod3-art1",
-        "dependency.scope" : "compile",
-        "dependency.sha1" : "ccab88fc2a043c2479a6de676a2f8179e9ea2167",
-        "dependency.type" : "dll"
-      }, {
-        "dependency.md5" : "d02a360ecad98a34b59863c1e65bcf71",
-        "dependency.name" : "bb1mod3-art1",
-        "dependency.scope" : "compile",
-        "dependency.sha1" : "bcab88fc2a043c2479a6de676a2f8179e9ea2167",
-        "dependency.type" : "dll"
-      } ]
-    } ]
-  },{
-    "build.created" : "2012-10-12T02:33:20.000+02:00",
-    "build.created_by" : "me",
-    "build.name" : "ba",
-    "build.number" : "2",
-    "modules" : [ {
-      "dependencies" : [ {
-        "dependency.md5" : "d02a360ecad98a34b59863c1e65bcf71",
-        "dependency.name" : "ba2mod4-art1",
-        "dependency.scope" : "compile",
-        "dependency.sha1" : "ccab88fc2a043c2479a6de676a2f8179e9ea2167",
-        "dependency.type" : "dll"
-      } ]
-    } ]
-  },{
-    "build.created" : "2012-10-12T02:50:00.000+02:00",
-    "build.created_by" : "me",
-    "build.name" : "bb",
-    "build.number" : "2",
-    "build.url" : "http://myserver/jenkins/bb/2"
-  },{
-    "build.created" : "2012-10-12T03:06:40.000+02:00",
-    "build.created_by" : "me",
-    "build.name" : "ba",
-    "build.number" : "3"
-  } ],
-  "range" : {
-    "start_pos" : 0,
-    "end_pos" : 5,
-    "total" : 5
-  }
-}
diff --git a/storage/db/src/test/resources/aql/stream/buildsWithItems.json b/storage/db/src/test/resources/aql/stream/buildsWithItems.json
deleted file mode 100644
index 42ed803..0000000
--- a/storage/db/src/test/resources/aql/stream/buildsWithItems.json
+++ /dev/null
@@ -1,150 +0,0 @@
-{
-  "results" : [ {
-    "build.created" : "2012-10-12T02:00:00.000+02:00",
-    "build.created_by" : "me",
-    "build.modified" : "2012-10-12T02:00:00.001+02:00",
-    "build.modified_by" : "not-me",
-    "build.name" : "ba",
-    "build.number" : "1",
-    "modules" : [ {
-      "dependencies" : [ {
-        "items" : [ {
-          "repo" : "repo-copy",
-          "path" : "org/yossis/tools",
-          "name" : "file3.bin",
-          "type" : "file",
-          "size" : 43434,
-          "created" : "2012-10-12T02:00:00.000+02:00",
-          "created_by" : "me",
-          "modified" : "2012-10-12T02:00:00.001+02:00",
-          "modified_by" : "not-me",
-          "updated" : "2012-06-21T15:53:24.448+03:00",
-          "depth" : 4,
-          "actual_md5" : "502a360ecad98a34b59863c1e65bcf71",
-          "actual_sha1" : "dddd88fc2a043c2479a6de676a2f8179e9eadddd",
-          "original_md5" : "502a360ecad98a34b59863c1e65bcf71",
-          "original_sha1" : "ccab88fc2a043c2479a6de676a2f8179e9ea2167"
-        } ]
-      }, {
-        "items" : [ {
-          "type" : "folder",
-          "size" : 0,
-          "created" : "2012-10-12T02:00:00.000+02:00",
-          "created_by" : "me",
-          "modified" : "2012-10-12T02:00:00.001+02:00",
-          "modified_by" : "not-me",
-          "depth" : 0
-        } ]
-      } ]
-    } ]
-  },{
-    "build.created" : "2012-10-12T02:16:40.000+02:00",
-    "build.created_by" : "me",
-    "build.name" : "bb",
-    "build.number" : "1",
-    "build.url" : "http://myserver/jenkins/bb/1",
-    "modules" : [ {
-      "dependencies" : [ {
-        "items" : [ {
-          "type" : "folder",
-          "size" : 0,
-          "created" : "2012-10-12T02:16:40.000+02:00",
-          "created_by" : "me",
-          "depth" : 0
-        } ]
-      } ]
-    }, {
-      "dependencies" : [ {
-        "items" : [ {
-          "repo" : "repo1",
-          "path" : "ant/ant/1.5",
-          "name" : "ant-1.5.jar",
-          "type" : "file",
-          "size" : 716139,
-          "created" : "2012-10-12T02:16:40.000+02:00",
-          "created_by" : "me",
-          "updated" : "2012-06-21T15:53:24.448+03:00",
-          "depth" : 4,
-          "actual_md5" : "902a360ecad98a34b59863c1e65bcf71",
-          "actual_sha1" : "dcab88fc2a043c2479a6de676a2f8179e9ea2167",
-          "original_md5" : "902a360ecad98a34b59863c1e65bcf71",
-          "original_sha1" : "dcab88fc2a043c2479a6de676a2f8179e9ea2167",
-          "properties" : [ {
-            "key" : "string",
-            "value" : "this is string"
-          } ]
-        } ]
-      }, {
-        "items" : [ {
-          "type" : "folder",
-          "size" : 0,
-          "created" : "2012-10-12T02:16:40.000+02:00",
-          "created_by" : "me",
-          "depth" : 0
-        } ]
-      }, {
-        "items" : [ {
-          "type" : "folder",
-          "size" : 0,
-          "created" : "2012-10-12T02:16:40.000+02:00",
-          "created_by" : "me",
-          "depth" : 0
-        } ]
-      } ]
-    } ]
-  },{
-    "build.created" : "2012-10-12T02:33:20.000+02:00",
-    "build.created_by" : "me",
-    "build.name" : "ba",
-    "build.number" : "2",
-    "modules" : [ {
-      "dependencies" : [ {
-        "items" : [ {
-          "type" : "folder",
-          "size" : 0,
-          "created" : "2012-10-12T02:33:20.000+02:00",
-          "created_by" : "me",
-          "depth" : 0
-        } ]
-      } ]
-    } ]
-  },{
-    "build.created" : "2012-10-12T02:50:00.000+02:00",
-    "build.created_by" : "me",
-    "build.name" : "bb",
-    "build.number" : "2",
-    "build.url" : "http://myserver/jenkins/bb/2",
-    "modules" : [ {
-      "dependencies" : [ {
-        "items" : [ {
-          "type" : "folder",
-          "size" : 0,
-          "created" : "2012-10-12T02:50:00.000+02:00",
-          "created_by" : "me",
-          "depth" : 0
-        } ]
-      } ]
-    } ]
-  },{
-    "build.created" : "2012-10-12T03:06:40.000+02:00",
-    "build.created_by" : "me",
-    "build.name" : "ba",
-    "build.number" : "3",
-    "modules" : [ {
-      "dependencies" : [ {
-        "items" : [ {
-          "type" : "folder",
-          "size" : 0,
-          "created" : "2012-10-12T03:06:40.000+02:00",
-          "created_by" : "me",
-          "depth" : 0
-        } ]
-      } ]
-    } ]
-  } ],
-  "range" : {
-    "start_pos" : 0,
-    "end_pos" : 5,
-    "total" : 5
-  }
-}
diff --git a/storage/db/src/test/resources/aql/stream/buildsWithModules.json b/storage/db/src/test/resources/aql/stream/buildsWithModules.json
deleted file mode 100644
index 5fe2b47..0000000
--- a/storage/db/src/test/resources/aql/stream/buildsWithModules.json
+++ /dev/null
@@ -1,49 +0,0 @@
-
-{
-  "results" : [ {
-    "build.created" : "2012-10-12T02:00:00.000+02:00",
-    "build.created_by" : "me",
-    "build.modified" : "2012-10-12T02:00:00.001+02:00",
-    "build.modified_by" : "not-me",
-    "build.name" : "ba",
-    "build.number" : "1",
-    "modules" : [ {
-      "module.name" : "ba:moda1"
-    } ]
-  },{
-    "build.created" : "2012-10-12T02:16:40.000+02:00",
-    "build.created_by" : "me",
-    "build.name" : "bb",
-    "build.number" : "1",
-    "build.url" : "http://myserver/jenkins/bb/1",
-    "modules" : [ {
-      "module.name" : "bb:modb1"
-    }, {
-      "module.name" : "bb:modb2"
-    } ]
-  },{
-    "build.created" : "2012-10-12T02:33:20.000+02:00",
-    "build.created_by" : "me",
-    "build.name" : "ba",
-    "build.number" : "2",
-    "modules" : [ {
-      "module.name" : "ba:moda1"
-    } ]
-  },{
-    "build.created" : "2012-10-12T02:50:00.000+02:00",
-    "build.created_by" : "me",
-    "build.name" : "bb",
-    "build.number" : "2",
-    "build.url" : "http://myserver/jenkins/bb/2"
-  },{
-    "build.created" : "2012-10-12T03:06:40.000+02:00",
-    "build.created_by" : "me",
-    "build.name" : "ba",
-    "build.number" : "3"
-  } ],
-  "range" : {
-    "start_pos" : 0,
-    "end_pos" : 5,
-    "total" : 5
-  }
-}
diff --git a/storage/db/src/test/resources/aql/stream/buildsWithProperties.json b/storage/db/src/test/resources/aql/stream/buildsWithProperties.json
deleted file mode 100644
index ca1932b..0000000
--- a/storage/db/src/test/resources/aql/stream/buildsWithProperties.json
+++ /dev/null
@@ -1,59 +0,0 @@
-
-{
-  "results" : [ {
-    "build.created" : "2012-10-12T02:00:00.000+02:00",
-    "build.created_by" : "me",
-    "build.modified" : "2012-10-12T02:00:00.001+02:00",
-    "build.modified_by" : "not-me",
-    "build.name" : "ba",
-    "build.number" : "1",
-    "build.properties" : [ {
-      "build.property.key" : "start",
-      "build.property.value" : "0"
-    }, {
-      "build.property.key" : "status",
-      "build.property.value" : "bad"
-    } ]
-  },{
-    "build.created" : "2012-10-12T02:16:40.000+02:00",
-    "build.created_by" : "me",
-    "build.name" : "bb",
-    "build.number" : "1",
-    "build.properties" : [ {
-      "build.property.key" : "start",
-      "build.property.value" : "1"
-    }, {
-      "build.property.key" : "status",
-      "build.property.value" : "not-too-bad"
-    } ],
-    "build.url" : "http://myserver/jenkins/bb/1"
-  },{
-    "build.created" : "2012-10-12T02:33:20.000+02:00",
-    "build.created_by" : "me",
-    "build.name" : "ba",
-    "build.number" : "2"
-  },{
-    "build.created" : "2012-10-12T02:50:00.000+02:00",
-    "build.created_by" : "me",
-    "build.name" : "bb",
-    "build.number" : "2",
-    "build.url" : "http://myserver/jenkins/bb/2"
-  },{
-    "build.created" : "2012-10-12T03:06:40.000+02:00",
-    "build.created_by" : "me",
-    "build.name" : "ba",
-    "build.number" : "3",
-    "build.properties" : [ {
-      "build.property.key" : "start",
-      "build.property.value" : "4"
-    }, {
-      "build.property.key" : "status",
-      "build.property.value" : "good"
-    } ]
-  } ],
-  "range" : {
-    "start_pos" : 0,
-    "end_pos" : 5,
-    "total" : 5
-  }
-}
diff --git a/storage/db/src/test/resources/aql/stream/dependenciesWithStats.json b/storage/db/src/test/resources/aql/stream/dependenciesWithStats.json
deleted file mode 100644
index 7b3270d..0000000
--- a/storage/db/src/test/resources/aql/stream/dependenciesWithStats.json
+++ /dev/null
@@ -1,74 +0,0 @@
-
-{
-  "results" : [ {
-    "dependency.name" : "bb1mod1-art1",
-    "dependency.scope" : "compile",
-    "dependency.type" : "dll",
-    "items" : [ {
-      "stats" : [ {
-        "downloads" : 0
-      } ]
-    } ]
-  },{
-    "dependency.name" : "bb1mod2-art1",
-    "dependency.scope" : "compile",
-    "dependency.type" : "dll",
-    "items" : [ {
-      "stats" : [ {
-        "downloads" : 0
-      } ]
-    } ]
-  },{
-    "dependency.name" : "ba1mod3-art1",
-    "dependency.scope" : "compile",
-    "dependency.type" : "dll",
-    "items" : [ {
-      "stats" : [ {
-        "downloaded" : "2012-06-21T15:53:27.850+03:00",
-        "downloaded_by" : "yossis",
-        "downloads" : 9
-      } ]
-    } ]
-  },{
-    "dependency.name" : "ba2mod4-art1",
-    "dependency.scope" : "compile",
-    "dependency.type" : "dll",
-    "items" : [ {
-      "stats" : [ {
-        "downloads" : 0
-      } ]
-    } ]
-  },{
-    "dependency.name" : "bb1mod3-art1",
-    "dependency.scope" : "compile",
-    "dependency.type" : "dll",
-    "items" : [ {
-      "stats" : [ {
-        "downloads" : 0
-      } ]
-    } ]
-  },{
-    "dependency.name" : "bb1mod3-art1",
-    "dependency.scope" : "compile",
-    "dependency.type" : "dll",
-    "items" : [ {
-      "stats" : [ {
-        "downloads" : 0
-      } ]
-    } ]
-  },{
-    "dependency.name" : "bb1mod3-art1",
-    "dependency.scope" : "compile",
-    "dependency.type" : "dll",
-    "items" : [ {
-      "stats" : [ {
-        "downloads" : 0
-      } ]
-    } ]
-  } ],
-  "range" : {
-    "start_pos" : 0,
-    "end_pos" : 7,
-    "total" : 7
-  }
-}
diff --git a/storage/db/src/test/resources/aql/stream/itemWithPropertiesStatisticsAndArchive.json b/storage/db/src/test/resources/aql/stream/itemWithPropertiesStatisticsAndArchive.json
deleted file mode 100644
index bf4d393..0000000
--- a/storage/db/src/test/resources/aql/stream/itemWithPropertiesStatisticsAndArchive.json
+++ /dev/null
@@ -1,77 +0,0 @@
-
-{
-  "results" : [ {
-    "repo" : "repo1",
-    "path" : "ant/ant/1.5",
-    "name" : "ant-1.5.jar",
-    "type" : "file",
-    "size" : 716139,
-    "created" : "2012-06-21T15:53:24.448+03:00",
-    "created_by" : "yossis-2201",
-    "modified" : "2012-06-21T15:53:24.448+03:00",
-    "modified_by" : "yossis-3274",
-    "updated" : "2012-06-21T15:53:24.448+03:00",
-    "archives" : [ {
-      "entry.name" : "LICENSE.txt",
-      "entry.path" : "META-INF"
-    }, {
-      "entry.name" : "MailMessage.class",
-      "entry.path" : "org/apache/tools/mail"
-    }, {
-      "entry.name" : "BaseFilterReader.class",
-      "entry.path" : "org/apache/tools/ant/filters"
-    }, {
-      "entry.name" : "BaseParamFilterReader.class",
-      "entry.path" : "org/apache/tools/ant/filters"
-    }, {
-      "entry.name" : "MANIFEST.MF",
-      "entry.path" : "META-INF"
-    } ],
-    "properties" : [ {
-      "key" : "string",
-      "value" : "this is string"
-    } ]
-  },{
-    "repo" : "repo1",
-    "path" : "org/yossis/tools",
-    "name" : "test.bin",
-    "type" : "file",
-    "size" : 43434,
-    "created" : "2012-06-21T15:53:24.448+03:00",
-    "created_by" : "yossis-1",
-    "modified" : "2012-06-21T15:53:24.448+03:00",
-    "modified_by" : "yossis-1",
-    "updated" : "2012-06-21T15:53:24.448+03:00",
-    "archives" : [ {
-      "entry.name" : "file.file",
-      "entry.path" : "path"
-    } ],
-    "properties" : [ {
-      "key" : "yossis",
-      "value" : "pdf"
-    } ]
-  },{
-    "repo" : "repo2",
-    "path" : "aa/b",
-    "name" : "ant-1.5.jar",
-    "type" : "file",
-    "size" : 716139,
-    "created" : "2012-06-21T15:53:24.448+03:00",
-    "created_by" : "yossis-2201",
-    "modified" : "2012-06-21T15:53:24.448+03:00",
-    "modified_by" : "yossis-3274",
-    "updated" : "2012-06-21T15:53:24.448+03:00",
-    "archives" : [ {
-      "entry.name" : "Test",
-      "entry.path" : "."
-    }, {
-      "entry.name" : "test.me",
-      "entry.path" : "another"
-    } ]
-  } ],
-  "range" : {
-    "start_pos" : 0,
-    "end_pos" : 3,
-    "total" : 3
-  }
-}
diff --git a/storage/db/src/test/resources/aql/stream/items.json b/storage/db/src/test/resources/aql/stream/items.json
deleted file mode 100644
index dcdcc68..0000000
--- a/storage/db/src/test/resources/aql/stream/items.json
+++ /dev/null
@@ -1,130 +0,0 @@
-
-{
-  "results" : [ {
-    "repo" : "repo1",
-    "path" : "ant/ant/1.5",
-    "name" : "ant-1.5.jar",
-    "type" : "file",
-    "size" : 716139,
-    "created" : "2012-06-21T15:53:24.448+03:00",
-    "created_by" : "yossis-2201",
-    "modified" : "2012-06-21T15:53:24.448+03:00",
-    "modified_by" : "yossis-3274",
-    "updated" : "2012-06-21T15:53:24.448+03:00"
-  },{
-    "repo" : "repo1",
-    "path" : "org/yossis/tools",
-    "name" : "test.bin",
-    "type" : "file",
-    "size" : 43434,
-    "created" : "2012-06-21T15:53:24.448+03:00",
-    "created_by" : "yossis-1",
-    "modified" : "2012-06-21T15:53:24.448+03:00",
-    "modified_by" : "yossis-1",
-    "updated" : "2012-06-21T15:53:24.448+03:00"
-  },{
-    "repo" : "repo1",
-    "path" : "org/yossis/tools",
-    "name" : "file2.bin",
-    "type" : "file",
-    "size" : 43434,
-    "created" : "2012-06-21T15:53:24.448+03:00",
-    "created_by" : "yossis-1",
-    "modified" : "2012-06-21T15:53:24.448+03:00",
-    "modified_by" : "yossis-1",
-    "updated" : "2012-06-21T15:53:24.448+03:00"
-  },{
-    "repo" : "repo1",
-    "path" : "org/yossis/tools",
-    "name" : "file3.bin",
-    "type" : "file",
-    "size" : 43434,
-    "created" : "2012-06-21T15:53:24.448+03:00",
-    "created_by" : "yossis-1",
-    "modified" : "2012-06-21T15:53:24.448+03:00",
-    "modified_by" : "yossis-1",
-    "updated" : "2012-06-21T15:53:24.448+03:00"
-  },{
-    "repo" : "repo-copy",
-    "path" : "org/yossis/tools",
-    "name" : "file3.bin",
-    "type" : "file",
-    "size" : 43434,
-    "created" : "2012-06-21T15:53:24.448+03:00",
-    "created_by" : "yossis-1",
-    "modified" : "2012-06-21T15:53:24.448+03:00",
-    "modified_by" : "yossis-1",
-    "updated" : "2012-06-21T15:53:24.448+03:00"
-  },{
-    "repo" : "repo-copy",
-    "path" : "org/shayy/trustme",
-    "name" : "trustme.jar",
-    "type" : "file",
-    "size" : 43434,
-    "created" : "2012-06-21T15:53:24.447+03:00",
-    "created_by" : "yossis-1",
-    "modified" : "2012-06-21T15:53:24.448+03:00",
-    "modified_by" : "yossis-1",
-    "updated" : "2012-06-21T15:53:24.448+03:00"
-  },{
-    "repo" : "repo-copy",
-    "path" : "org/shayy/badmd5",
-    "name" : "badmd5.jar",
-    "type" : "file",
-    "size" : 43434,
-    "created" : "2012-06-21T15:53:24.447+03:00",
-    "created_by" : "yossis-1",
-    "modified" : "2012-06-21T15:53:24.448+03:00",
-    "modified_by" : "yossis-1",
-    "updated" : "2012-06-21T15:53:24.448+03:00"
-  },{
-    "repo" : "repo2",
-    "path" : "a",
-    "name" : "ant-1.5.jar",
-    "type" : "file",
-    "size" : 716139,
-    "created" : "2012-06-21T15:53:24.448+03:00",
-    "created_by" : "yossis-2201",
-    "modified" : "2012-06-21T15:53:24.448+03:00",
-    "modified_by" : "yossis-3274",
-    "updated" : "2012-06-21T15:53:24.448+03:00"
-  },{
-    "repo" : "repo2",
-    "path" : "a/b",
-    "name" : "ant-1.5.jar",
-    "type" : "file",
-    "size" : 716139,
-    "created" : "2012-06-21T15:53:24.448+03:00",
-    "created_by" : "yossis-2201",
-    "modified" : "2012-06-21T15:53:24.448+03:00",
-    "modified_by" : "yossis-3274",
-    "updated" : "2012-06-21T15:53:24.448+03:00"
-  },{
-    "repo" : "repo2",
-    "path" : "aa",
-    "name" : "ant-1.5.jar",
-    "type" : "file",
-    "size" : 716139,
-    "created" : "2012-06-21T15:53:24.448+03:00",
-    "created_by" : "yossis-2201",
-    "modified" : "2012-06-21T15:53:24.448+03:00",
-    "modified_by" : "yossis-3274",
-    "updated" : "2012-06-21T15:53:24.448+03:00"
-  },{
-    "repo" : "repo2",
-    "path" : "aa/b",
-    "name" : "ant-1.5.jar",
-    "type" : "file",
-    "size" : 716139,
-    "created" : "2012-06-21T15:53:24.448+03:00",
-    "created_by" : "yossis-2201",
-    "modified" : "2012-06-21T15:53:24.448+03:00",
-    "modified_by" : "yossis-3274",
-    "updated" : "2012-06-21T15:53:24.448+03:00"
-  } ],
-  "range" : {
-    "start_pos" : 0,
-    "end_pos" : 11,
-    "total" : 11
-  }
-}
diff --git a/storage/db/src/test/resources/aql/stream/itemsWithProperties.json b/storage/db/src/test/resources/aql/stream/itemsWithProperties.json
deleted file mode 100644
index 5132692..0000000
--- a/storage/db/src/test/resources/aql/stream/itemsWithProperties.json
+++ /dev/null
@@ -1,138 +0,0 @@
-
-{
-  "results" : [ {
-    "repo" : "repo1",
-    "path" : "ant/ant/1.5",
-    "name" : "ant-1.5.jar",
-    "type" : "file",
-    "size" : 716139,
-    "created" : "2012-06-21T15:53:24.448+03:00",
-    "created_by" : "yossis-2201",
-    "modified" : "2012-06-21T15:53:24.448+03:00",
-    "modified_by" : "yossis-3274",
-    "updated" : "2012-06-21T15:53:24.448+03:00",
-    "properties" : [ {
-      "key" : "string",
-      "value" : "this is string"
-    } ]
-  },{
-    "repo" : "repo1",
-    "path" : "org/yossis/tools",
-    "name" : "test.bin",
-    "type" : "file",
-    "size" : 43434,
-    "created" : "2012-06-21T15:53:24.448+03:00",
-    "created_by" : "yossis-1",
-    "modified" : "2012-06-21T15:53:24.448+03:00",
-    "modified_by" : "yossis-1",
-    "updated" : "2012-06-21T15:53:24.448+03:00",
-    "properties" : [ {
-      "key" : "yossis",
-      "value" : "pdf"
-    } ]
-  },{
-    "repo" : "repo1",
-    "path" : "org/yossis/tools",
-    "name" : "file2.bin",
-    "type" : "file",
-    "size" : 43434,
-    "created" : "2012-06-21T15:53:24.448+03:00",
-    "created_by" : "yossis-1",
-    "modified" : "2012-06-21T15:53:24.448+03:00",
-    "modified_by" : "yossis-1",
-    "updated" : "2012-06-21T15:53:24.448+03:00"
-  },{
-    "repo" : "repo1",
-    "path" : "org/yossis/tools",
-    "name" : "file3.bin",
-    "type" : "file",
-    "size" : 43434,
-    "created" : "2012-06-21T15:53:24.448+03:00",
-    "created_by" : "yossis-1",
-    "modified" : "2012-06-21T15:53:24.448+03:00",
-    "modified_by" : "yossis-1",
-    "updated" : "2012-06-21T15:53:24.448+03:00"
-  },{
-    "repo" : "repo-copy",
-    "path" : "org/yossis/tools",
-    "name" : "file3.bin",
-    "type" : "file",
-    "size" : 43434,
-    "created" : "2012-06-21T15:53:24.448+03:00",
-    "created_by" : "yossis-1",
-    "modified" : "2012-06-21T15:53:24.448+03:00",
-    "modified_by" : "yossis-1",
-    "updated" : "2012-06-21T15:53:24.448+03:00"
-  },{
-    "repo" : "repo-copy",
-    "path" : "org/shayy/trustme",
-    "name" : "trustme.jar",
-    "type" : "file",
-    "size" : 43434,
-    "created" : "2012-06-21T15:53:24.447+03:00",
-    "created_by" : "yossis-1",
-    "modified" : "2012-06-21T15:53:24.448+03:00",
-    "modified_by" : "yossis-1",
-    "updated" : "2012-06-21T15:53:24.448+03:00"
-  },{
-    "repo" : "repo-copy",
-    "path" : "org/shayy/badmd5",
-    "name" : "badmd5.jar",
-    "type" : "file",
-    "size" : 43434,
-    "created" : "2012-06-21T15:53:24.447+03:00",
-    "created_by" : "yossis-1",
-    "modified" : "2012-06-21T15:53:24.448+03:00",
-    "modified_by" : "yossis-1",
-    "updated" : "2012-06-21T15:53:24.448+03:00"
-  },{
-    "repo" : "repo2",
-    "path" : "a",
-    "name" : "ant-1.5.jar",
-    "type" : "file",
-    "size" : 716139,
-    "created" : "2012-06-21T15:53:24.448+03:00",
-    "created_by" : "yossis-2201",
-    "modified" : "2012-06-21T15:53:24.448+03:00",
-    "modified_by" : "yossis-3274",
-    "updated" : "2012-06-21T15:53:24.448+03:00"
-  },{
-    "repo" : "repo2",
-    "path" : "a/b",
-    "name" : "ant-1.5.jar",
-    "type" : "file",
-    "size" : 716139,
-    "created" : "2012-06-21T15:53:24.448+03:00",
-    "created_by" : "yossis-2201",
-    "modified" : "2012-06-21T15:53:24.448+03:00",
-    "modified_by" : "yossis-3274",
-    "updated" : "2012-06-21T15:53:24.448+03:00"
-  },{
-    "repo" : "repo2",
-    "path" : "aa",
-    "name" : "ant-1.5.jar",
-    "type" : "file",
-    "size" : 716139,
-    "created" : "2012-06-21T15:53:24.448+03:00",
-    "created_by" : "yossis-2201",
-    "modified" : "2012-06-21T15:53:24.448+03:00",
-    "modified_by" : "yossis-3274",
-    "updated" : "2012-06-21T15:53:24.448+03:00"
-  },{
-    "repo" : "repo2",
-    "path" : "aa/b",
-    "name" : "ant-1.5.jar",
-    "type" : "file",
-    "size" : 716139,
-    "created" : "2012-06-21T15:53:24.448+03:00",
-    "created_by" : "yossis-2201",
-    "modified" : "2012-06-21T15:53:24.448+03:00",
-    "modified_by" : "yossis-3274",
-    "updated" : "2012-06-21T15:53:24.448+03:00"
-  } ],
-  "range" : {
-    "start_pos" : 0,
-    "end_pos" : 11,
-    "total" : 11
-  }
-}
diff --git a/storage/db/src/test/resources/aql/stream/modulesWithProperties.json b/storage/db/src/test/resources/aql/stream/modulesWithProperties.json
deleted file mode 100644
index d5cbd59..0000000
--- a/storage/db/src/test/resources/aql/stream/modulesWithProperties.json
+++ /dev/null
@@ -1,38 +0,0 @@
-
-{
-  "results" : [ {
-    "module.name" : "ba:moda1",
-    "module.properties" : [ {
-      "module.property.key" : "start",
-      "module.property.value" : "0"
-    }, {
-      "module.property.key" : "status",
-      "module.property.value" : "bad"
-    } ]
-  },{
-    "module.name" : "bb:modb1",
-    "module.properties" : [ {
-      "module.property.key" : "start",
-      "module.property.value" : "1"
-    }, {
-      "module.property.key" : "status",
-      "module.property.value" : "not-too-bad"
-    } ]
-  },{
-    "module.name" : "bb:modb2"
-  },{
-    "module.name" : "ba:moda1",
-    "module.properties" : [ {
-      "module.property.key" : "start",
-      "module.property.value" : "4"
-    }, {
-      "module.property.key" : "status",
-      "module.property.value" : "good"
-    } ]
-  } ],
-  "range" : {
-    "start_pos" : 0,
-    "end_pos" : 4,
-    "total" : 4
-  }
-}
diff --git a/storage/db/src/test/resources/aql/stream/propertiesWithItems.json b/storage/db/src/test/resources/aql/stream/propertiesWithItems.json
deleted file mode 100644
index 79650aa..0000000
--- a/storage/db/src/test/resources/aql/stream/propertiesWithItems.json
+++ /dev/null
@@ -1,96 +0,0 @@
-
-{
-  "results" : [ {
-    "items" : [ {
-      "repo" : "repo1",
-      "path" : ".",
-      "name" : ".",
-      "type" : "folder",
-      "size" : 0,
-      "created" : "2012-06-21T15:53:24.448+03:00",
-      "created_by" : "yossis-1",
-      "modified" : "2012-06-21T15:53:24.448+03:00",
-      "modified_by" : "yossis-1",
-      "updated" : "2012-06-21T15:53:24.448+03:00",
-      "depth" : 0
-    } ],
-    "key" : "build.name",
-    "value" : "ant"
-  },{
-    "items" : [ {
-      "repo" : "repo1",
-      "path" : "ant/ant/1.5",
-      "name" : "ant-1.5.jar",
-      "type" : "file",
-      "size" : 716139,
-      "created" : "2012-06-21T15:53:24.448+03:00",
-      "created_by" : "yossis-2201",
-      "modified" : "2012-06-21T15:53:24.448+03:00",
-      "modified_by" : "yossis-3274",
-      "updated" : "2012-06-21T15:53:24.448+03:00",
-      "depth" : 4,
-      "actual_md5" : "902a360ecad98a34b59863c1e65bcf71",
-      "actual_sha1" : "dcab88fc2a043c2479a6de676a2f8179e9ea2167",
-      "original_md5" : "902a360ecad98a34b59863c1e65bcf71",
-      "original_sha1" : "dcab88fc2a043c2479a6de676a2f8179e9ea2167"
-    } ],
-    "key" : "string",
-    "value" : "this is string"
-  },{
-    "items" : [ {
-      "repo" : "repo1",
-      "path" : "org",
-      "name" : "yossis",
-      "type" : "folder",
-      "size" : 0,
-      "created" : "2012-06-21T15:53:24.448+03:00",
-      "created_by" : "yossis-1",
-      "modified" : "2012-06-21T15:53:24.448+03:00",
-      "modified_by" : "yossis-1",
-      "updated" : "2012-06-21T15:53:24.448+03:00",
-      "depth" : 2
-    } ],
-    "key" : "jungle",
-    "value" : "value2"
-  },{
-    "items" : [ {
-      "repo" : "repo1",
-      "path" : "org/yossis/tools",
-      "name" : "test.bin",
-      "type" : "file",
-      "size" : 43434,
-      "created" : "2012-06-21T15:53:24.448+03:00",
-      "created_by" : "yossis-1",
-      "modified" : "2012-06-21T15:53:24.448+03:00",
-      "modified_by" : "yossis-1",
-      "updated" : "2012-06-21T15:53:24.448+03:00",
-      "depth" : 4,
-      "actual_md5" : "302a360ecad98a34b59863c1e65bcf71",
-      "actual_sha1" : "acab88fc2a043c2479a6de676a2f8179e9ea2167",
-      "original_md5" : "302a360ecad98a34b59863c1e65bcf71",
-      "original_sha1" : "acab88fc2a043c2479a6de676a2f8179e9ea2167"
-    } ],
-    "key" : "yossis",
-    "value" : "pdf"
-  },{
-    "items" : [ {
-      "repo" : "repo1",
-      "path" : "org/yossis",
-      "name" : "empty",
-      "type" : "folder",
-      "size" : 0,
-      "created" : "2012-06-21T15:53:24.448+03:00",
-      "created_by" : "yossis-1",
-      "modified" : "2012-06-21T15:53:24.448+03:00",
-      "modified_by" : "yossis-1",
-      "updated" : "2012-06-21T15:53:24.448+03:00",
-      "depth" : 3
-    } ],
-    "key" : "null.val"
-  } ],
-  "range" : {
-    "start_pos" : 0,
-    "end_pos" : 5,
-    "total" : 5
-  }
-}
diff --git a/storage/db/src/test/resources/binarystore/config/binarystore-filesystem-template.xml b/storage/db/src/test/resources/binarystore/config/binarystore-filesystem-template.xml
deleted file mode 100644
index dd129aa..0000000
--- a/storage/db/src/test/resources/binarystore/config/binarystore-filesystem-template.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-<config version="2">
-    <chain template="file-system"/>
-</config>
\ No newline at end of file
diff --git a/storage/db/src/test/resources/binarystore/config/binarystore-s3-template.xml b/storage/db/src/test/resources/binarystore/config/binarystore-s3-template.xml
deleted file mode 100644
index 9a1aab0..0000000
--- a/storage/db/src/test/resources/binarystore/config/binarystore-s3-template.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<config version="2">
-    <chain template="s3"/>
-    <provider id="s3" type="s3">
-        <bucketName>bucket</bucketName>
-        <path>test</path>
-    </provider>
-</config>
\ No newline at end of file
diff --git a/storage/db/src/test/resources/binarystore/config/binarystore-sharding-template.xml b/storage/db/src/test/resources/binarystore/config/binarystore-sharding-template.xml
deleted file mode 100644
index f8df010..0000000
--- a/storage/db/src/test/resources/binarystore/config/binarystore-sharding-template.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<config version="2">
-    <chain>
-        <provider id="cache-fs" type="cache-fs">
-            <provider id="redundant" type="redundant">
-                <redundancy>2</redundancy>
-                <sub-provider id="shard-state-aware-1" type="state-aware"/>
-                <sub-provider id="shard-state-aware-2" type="state-aware"/>
-            </provider>
-        </provider>
-    </chain>
-</config>
\ No newline at end of file
diff --git a/storage/db/src/test/resources/binarystore/config/binarystoreWithExistingProviders.xml b/storage/db/src/test/resources/binarystore/config/binarystoreWithExistingProviders.xml
deleted file mode 100644
index c3a04f9..0000000
--- a/storage/db/src/test/resources/binarystore/config/binarystoreWithExistingProviders.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-<config version="2">
-    <chain template="full-db-direct"/>
-</config>
\ No newline at end of file
diff --git a/storage/db/src/test/resources/binarystore/config/binarystoreWithOverideProviders.xml b/storage/db/src/test/resources/binarystore/config/binarystoreWithOverideProviders.xml
deleted file mode 100644
index e1350b2..0000000
--- a/storage/db/src/test/resources/binarystore/config/binarystoreWithOverideProviders.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<config version="2">
-    <chain template="full-db-direct"/>
-    <provider id="blob" type="blob">
-        <useless>true</useless>
-    </provider>
-</config>
\ No newline at end of file
diff --git a/storage/db/src/test/resources/binarystore/config/binarystoreWithTemplate.xml b/storage/db/src/test/resources/binarystore/config/binarystoreWithTemplate.xml
deleted file mode 100644
index 789c475..0000000
--- a/storage/db/src/test/resources/binarystore/config/binarystoreWithTemplate.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-<config version="2">
-    <chain template="s3"/>
-</config>
\ No newline at end of file
diff --git a/storage/db/src/test/resources/binarystore/config/binarystoreWithTemplateAndProvider.xml b/storage/db/src/test/resources/binarystore/config/binarystoreWithTemplateAndProvider.xml
deleted file mode 100644
index 45b61bc..0000000
--- a/storage/db/src/test/resources/binarystore/config/binarystoreWithTemplateAndProvider.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<config version="2">
-    <chain template="cache-fs"/>
-    <provider id="file-system" type="file-system">
-        <fileStoreDir>test654</fileStoreDir>
-    </provider>
-</config>
\ No newline at end of file
diff --git a/storage/db/src/test/resources/binarystore/config/binarystoreWithUserChain.xml b/storage/db/src/test/resources/binarystore/config/binarystoreWithUserChain.xml
deleted file mode 100644
index 98a030d..0000000
--- a/storage/db/src/test/resources/binarystore/config/binarystoreWithUserChain.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<config version="2">
-    <chain>
-        <provider id="cache-fs" type="cache-fs">
-            <provider id="retry" type="retry">
-                <provider id="file-system" type="file-system"/>
-            </provider>
-        </provider>
-    </chain>
-
-    <provider id="cache-fs" type="cache-fs">
-        <cacheProviderDir>test89</cacheProviderDir>
-    </provider>
-    <provider id="file-system" type="file-system">
-        <fileStoreDir>test99</fileStoreDir>
-    </provider>
-</config>
\ No newline at end of file
diff --git a/storage/db/src/test/resources/binstore/100c.bin b/storage/db/src/test/resources/binstore/100c.bin
deleted file mode 100644
index 203496a..0000000
Binary files a/storage/db/src/test/resources/binstore/100c.bin and /dev/null differ
diff --git a/storage/db/src/test/resources/binstore/256w.bin b/storage/db/src/test/resources/binstore/256w.bin
deleted file mode 100644
index dc7d4ea..0000000
--- a/storage/db/src/test/resources/binstore/256w.bin
+++ /dev/null
@@ -1 +0,0 @@
-����
�����L�wTm���e�,��*�*�{�
����: ��>��{�)�T0q���S$S�u�^L�ϡ���s�
��k��Z�
��r�;���Ss��\���:�;	�Ō�ƃJ �������b���lEM쬔N��3�G �o
��8��a�0�	�E��3������z�A*	z�R�#^́��Û`q	����Rd
]�/B8u�|xR�e���B���j��2����K���H/���!4�ֺ��	XX��˕
��=�Ш扼����d���p:�����m,�:$�>mu9q�É��‚AU��w�:�-�4
&k3�$

7u���sx����^�rq�?��m|�UR�<r"��wΘ\C�<nx�s������^e�����a��&�A����Z�us�堉1Hg����ʚ���@�?��	іkI���E�z��H��7�f���d%������a����`������ljsd���|f���&
\ No newline at end of file
diff --git a/storage/db/src/test/resources/binstore/2k.bin b/storage/db/src/test/resources/binstore/2k.bin
deleted file mode 100644
index 2374307..0000000
Binary files a/storage/db/src/test/resources/binstore/2k.bin and /dev/null differ
diff --git a/storage/db/src/test/resources/binstore/300c.bin b/storage/db/src/test/resources/binstore/300c.bin
deleted file mode 100644
index 7174489..0000000
Binary files a/storage/db/src/test/resources/binstore/300c.bin and /dev/null differ
diff --git a/storage/db/src/test/resources/db/derby.properties b/storage/db/src/test/resources/db/derby.properties
deleted file mode 100644
index 6453982..0000000
--- a/storage/db/src/test/resources/db/derby.properties
+++ /dev/null
@@ -1,23 +0,0 @@
-## derby properties file for testing and development
-type=derby
-url=jdbc:derby:{db.home};create=true
-driver=org.apache.derby.jdbc.EmbeddedDriver
-
-## Maximum active database connection
-#pool.max.active=100
-## Maximum idle database connection
-#pool.max.idle=10
-
-## Determines where the actual artifacts binaries are stored. Available options:
-## filesystem - binaries are stored in the filesystem (recommended, default)
-## fullDb     - binaries are stored as blobs in the db, filesystem is used for caching
-## cachedFS   - binaries are stored in the filesystem, but a front cache (with faster access) is added
-## IMPORTANT NOTE: This property should not be change after the initial setup. To change binaries storage you have to export and import
-#binary.provider.type=filesystem
-
-## Determines the maximum filesystem cache size in bytes when using binary provider type fullDb or cachedFS. Default is 5GB
-## Supported units are TB (terabytes), GB (gigabytes), MB (megabytes) and KB (kilobytes)
-#binary.provider.cache.maxSize=5GB
-
-#binary.provider.type=cachedFS
-binary.provider.cache.maxSize=1GB
\ No newline at end of file
diff --git a/storage/db/src/test/resources/db/mssql-win2012.properties b/storage/db/src/test/resources/db/mssql-win2012.properties
deleted file mode 100644
index 8b4d843..0000000
--- a/storage/db/src/test/resources/db/mssql-win2012.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-type=mssql
-driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
-url=jdbc:sqlserver://win2012-4:1433;databaseName=artifactory4build;sendStringParametersAsUnicode=false;applicationName=Artifactory Binary Repository;lockTimeout=5000;
-username=artifactory4build
-password=password
diff --git a/storage/db/src/test/resources/db/mssql.properties b/storage/db/src/test/resources/db/mssql.properties
deleted file mode 100644
index 83ffaa1..0000000
--- a/storage/db/src/test/resources/db/mssql.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-# After creating a database named 'artdbtest' run the following:
-#CREATE LOGIN [artifactory] WITH PASSWORD=N'password', DEFAULT_DATABASE=[artdbtest], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
-#USE [artdbtest]
-#GO
-#CREATE USER artifactory
-#GO
-#EXEC sp_addrolemember N'db_owner', N'artifactory'
-#GO
-
-type=mssql
-driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
-url=jdbc:sqlserver://localhost:1433;databaseName=artifactory4test;sendStringParametersAsUnicode=false;applicationName=Artifactory Binary Repository;lockTimeout=5000;
-username=artifactory
-password=password
diff --git a/storage/db/src/test/resources/db/mysql.properties b/storage/db/src/test/resources/db/mysql.properties
deleted file mode 100644
index c0acd23..0000000
--- a/storage/db/src/test/resources/db/mysql.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-## mysql properties file for testing and development
-
-#CREATE DATABASE artdbtest character set utf8 collate utf8_bin;
-#GRANT ALL on artdbtest.* TO 'artifactory'@'%' IDENTIFIED BY 'password';
-type=mysql
-url=jdbc:mysql://localhost:3306/artifactory4test?characterEncoding=UTF-8&elideSetAutoCommits=true
-driver=com.mysql.jdbc.Driver
-username=artifactory
-password=password
\ No newline at end of file
diff --git a/storage/db/src/test/resources/db/oracle-agent.properties b/storage/db/src/test/resources/db/oracle-agent.properties
deleted file mode 100644
index d6ea982..0000000
--- a/storage/db/src/test/resources/db/oracle-agent.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-type=oracle
-driver=oracle.jdbc.OracleDriver
-url=jdbc:oracle:thin:@oracle4.jfrog.local:1521:ORCL
-username=artifactory4_test
-password=password
diff --git a/storage/db/src/test/resources/db/oracle.properties b/storage/db/src/test/resources/db/oracle.properties
deleted file mode 100644
index 04e70d5..0000000
--- a/storage/db/src/test/resources/db/oracle.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-#CREATE USER artifactory IDENTIFIED BY password
-#DEFAULT TABLESPACE "USERS"
-#TEMPORARY TABLESPACE "TEMP";
-#GRANT "RESOURCE" TO artifactory;
-#GRANT "CONNECT" TO artifactory;
-#GRANT CREATE SEQUENCE TO artifactory;
-#ALTER USER artifactory QUOTA UNLIMITED ON USERS;
-
-type=oracle
-driver=oracle.jdbc.OracleDriver
-url=jdbc:oracle:thin:@oracle4.jfrog.local:1521:ORCL
-username=artifactory4_test
-password=password
\ No newline at end of file
diff --git a/storage/db/src/test/resources/db/postgresql.properties b/storage/db/src/test/resources/db/postgresql.properties
deleted file mode 100644
index 9665b11..0000000
--- a/storage/db/src/test/resources/db/postgresql.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-#CREATE USER artifactory WITH PASSWORD 'password';
-#CREATE DATABASE artifactory4test WITH OWNER=artifactory ENCODING='UTF8';
-#GRANT ALL PRIVILEGES ON DATABASE artifactory4test TO artifactory;
-
-type=postgresql
-driver=org.postgresql.Driver
-url=jdbc:postgresql://localhost:5432/artifactory4test
-username=artifactory
-password=password
\ No newline at end of file
diff --git a/storage/db/src/test/resources/jsons/build.json b/storage/db/src/test/resources/jsons/build.json
deleted file mode 100644
index 38fc7f9..0000000
--- a/storage/db/src/test/resources/jsons/build.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
-    "name":"moo :: moo",
-    "type":"GRADLE",
-    "number":15,
-    "version":"1.7.0",
-    "started":"2009-11-25T10:25:16.381+0200",
-    "agent":{
-        "name":"pop",
-        "version":"1.6"
-    },
-    "buildAgent":{
-        "name":"pop",
-        "version":"1.6"
-    },
-    "durationMillis":6,
-    "principal":"bob",
-    "artifactoryPrincipal":"too",
-    "url":"mitz",
-    "parentBuildId":"pooh",
-    "modules":[
-        {
-            "id":"moo",
-            "artifacts":[
-                {
-                    "name":"blob",
-                    "type":"glob",
-                    "sha1":"shlob",
-                    "md5":"mob",
-                    "properties":{
-                    }
-                }
-            ],
-            "dependencies":[
-                {
-                    "id":"moo",
-                    "scopes":[ "mitzi" ],
-                    "requiredBy":[ "pitzi" ],
-                    "type":"bob",
-                    "sha1":"pop",
-                    "md5":"shmop",
-                    "properties":{
-                    }
-                }
-            ],
-            "properties":{
-            }
-        }
-    ],
-    "properties":{
-        "goo":"koo"
-    }
-}
\ No newline at end of file
diff --git a/storage/db/src/test/resources/logback-dbtest.xml b/storage/db/src/test/resources/logback-dbtest.xml
deleted file mode 100644
index 992e424..0000000
--- a/storage/db/src/test/resources/logback-dbtest.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- This file is used as logback configuration for the low level database tests -->
-<configuration>
-    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-        <encoder>
-            <pattern>%-30(%d{HH:mm:ss.SSS} [%thread]) [%-5p] \(%-20c{3}:%L\) - %m%n</pattern>
-        </encoder>
-    </appender>
-
-    <root>
-        <level value="warn"/>
-        <appender-ref ref="CONSOLE"/>
-    </root>
-    <logger name="org.artifactory">
-        <level value="info"/>
-    </logger>
-    <logger name="org.artifactory.test">
-        <level value="info"/>
-    </logger>
-    <logger name="org.artifactory.storage.db">
-        <level value="info"/>
-    </logger>
-    <logger name="org.springframework.jdbc">
-        <level value="info"/>
-    </logger>
-    <logger name="org.springframework.transaction">
-        <level value="info"/>
-    </logger>
-    <logger name="org.artifactory.info.InfoWriter">
-        <level value="warn"/>
-    </logger>
-</configuration>
diff --git a/storage/db/src/test/resources/spring/db-test-context.xml b/storage/db/src/test/resources/spring/db-test-context.xml
deleted file mode 100644
index 75b3f3e..0000000
--- a/storage/db/src/test/resources/spring/db-test-context.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xmlns:context="http://www.springframework.org/schema/context"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans
-           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
-           http://www.springframework.org/schema/context
-           http://www.springframework.org/schema/context/spring-context-3.0.xsd">
-
-    <!-- Activate bean annotation scanning -->
-    <context:component-scan base-package="org.artifactory.storage.db">
-        <!-- exclude the production db configurator -->
-        <context:exclude-filter type="assignable" expression="org.artifactory.storage.db.spring.DbConfigFactory"/>
-        <!-- exclude the upgrade configurator -->
-        <context:exclude-filter type="assignable"
-                                expression="org.artifactory.storage.db.itest.spring.DbUpgradeTestConfigFactory"/>
-    </context:component-scan>
-
-    <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ConcurrentTaskExecutor"/>
-
-</beans>
\ No newline at end of file
diff --git a/storage/db/src/test/resources/spring/db-upgrade-test-context.xml b/storage/db/src/test/resources/spring/db-upgrade-test-context.xml
deleted file mode 100644
index e8337be..0000000
--- a/storage/db/src/test/resources/spring/db-upgrade-test-context.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xmlns:context="http://www.springframework.org/schema/context"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans
-           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
-
-
-           http://www.springframework.org/schema/context
-           http://www.springframework.org/schema/context/spring-context-3.0.xsd">
-
-    <!-- Activate bean annotation scanning -->
-    <context:component-scan base-package="org.artifactory.storage.db">
-        <!-- exclude the production db configurator -->
-        <context:exclude-filter type="assignable" expression="org.artifactory.storage.db.spring.DbConfigFactory"/>
-        <!-- exclude the default db service that auto upgrades -->
-        <context:exclude-filter type="assignable" expression="org.artifactory.storage.db.DbServiceImpl"/>
-    </context:component-scan>
-
-    <!-- Activate annotation driven transactions (transaction manager is defined in the BaseBackendConfig)-->
-    <!--<tx:annotation-driven/>-->
-
-    <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ConcurrentTaskExecutor"/>
-
-</beans>
\ No newline at end of file
diff --git a/storage/db/src/test/resources/sql/acls.sql b/storage/db/src/test/resources/sql/acls.sql
deleted file mode 100644
index f0a661b..0000000
--- a/storage/db/src/test/resources/sql/acls.sql
+++ /dev/null
@@ -1,26 +0,0 @@
-UPDATE unique_ids SET current_id = 10000 WHERE index_type = 'general';
-
-INSERT INTO permission_targets VALUES
-(1, 'perm-target-1',NULL,NULL),
-(2, 'perm-target-2','com/**,org/**',NULL),
-(3, 'perm-target-3',NULL,'apache/**'),
-(4, 'perm-target-4','jfrog/**,**/art-*.xml','codehaus/**');
-
-INSERT INTO permission_target_repos VALUES
-(1, 'ANY'),
-(2, 'ANY LOCAL'),
-(3, 'ANY REMOTE'),
-(3, 'libs-release-local'),
-(3, 'libs-snapshot-local');
-
-INSERT INTO acls VALUES
-(10,1,NULL,NULL),
-(20,2,NULL,NULL),
-(30,3,NULL,NULL);
-
-INSERT INTO aces VALUES
-(1,10,1,1,NULL),
-(2,10,2,NULL,1),
-(3,10,3,2,NULL),
-(4,20,3,1,NULL),
-(5,20,3,NULL,1);
diff --git a/storage/db/src/test/resources/sql/aql_exclusion.sql b/storage/db/src/test/resources/sql/aql_exclusion.sql
deleted file mode 100644
index 15715b2..0000000
--- a/storage/db/src/test/resources/sql/aql_exclusion.sql
+++ /dev/null
@@ -1,39 +0,0 @@
-UPDATE unique_ids SET current_id = 10000 WHERE index_type = 'general';
-
-INSERT INTO binaries VALUES
-('dcab88fc2a043c2479a6de676a2f8179e9ea2167', '902a360ecad98a34b59863c1e65bcf71', 3),
-('acab88fc2a043c2479a6de676a2f8179e9ea2167', '302a360ecad98a34b59863c1e65bcf71', 78),
-('bbbb88fc2a043c2479a6de676a2f8179e9eabbbb', '402a360ecad98a34b59863c1e65bcf71', 33),
-('dddd89fc2a043c2479a6de676a2f8179e9eadddd', '502a360ecad98a34b59863c1e65bcf71', 333);
-
-INSERT INTO nodes VALUES
-(1, 1, 'repo1', '.', 'a', 4, 1340283204448, 'jon', 1340283204448,'jon', 1340283204448, 716139, 'dcab88fc2a043c2479a6de676a2f8179e9ea2167', 'dcab88fc2a043c2479a6de676a2f8179e9ea2167', '902a360ecad98a34b59863c1e65bcf71', '902a360ecad98a34b59863c1e65bcf71'),
-(2, 1, 'repo1', '.', 'b', 4, 1340283204448, 'jon', 1340283204448, 'jon', 1340283204448, 43434, 'acab88fc2a043c2479a6de676a2f8179e9ea2167', 'acab88fc2a043c2479a6de676a2f8179e9ea2167', '302a360ecad98a34b59863c1e65bcf71', '302a360ecad98a34b59863c1e65bcf71'),
-(3, 1, 'repo1', '.', 'c', 4, 1340283204448, 'jon', 1340283204448, 'jon', 1340283204448, 43434, 'bbbb88fc2a043c2479a6de676a2f8179e9eabbbb', 'bcab88fc2a043c2479a6de676a2f8179e9ea2167', '402a360ecad98a34b59863c1e65bcf71', '402a360ecad98a34b59863c1e65bcf71'),
-(4, 1, 'repo1', '.', 'd', 4, 1340283204448, 'jon', 1340283204448, 'jon', 1340283204448, 43434, 'dddd89fc2a043c2479a6de676a2f8179e9eadddd', 'dddd89fc2a043c2479a6de676a2f8179e9eadddd', '502a360ecad98a34b59863c1e65bcf71', '502a360ecad98a34b59863c1e65bcf71');
-
-INSERT INTO node_props VALUES
-(1, 1, 'license', 'GPL'),
-(2, 1, 'version', '1.1.1'),
-(3, 2, 'license', 'LGPL'),
-(4, 2, 'version', '1.1.1'),
-(5, 3, 'license', 'GPL'),
-(6, 3, 'version', '1.1.1'),
-(7, 4, 'license', 'GPL'),
-(8, 4, 'version', '1.1.2');
-
-INSERT INTO node_meta_infos VALUES
-(1, 1340286103555, 'yossis'),
-(2, 1340286803666, 'yoyo');
-
-INSERT INTO watches VALUES
-(1, 1, 'jon', 1340286203555),
-(2, 2, 'jon', 1340286203666),
-(3, 3, 'jon', 1340286203433),
-(4, 4, 'jon', 1340286203433);
-
-INSERT INTO stats VALUES
-(1, 1, 1340283207850, 'jon'),
-(2, 2, 1340283207850, 'jon'),
-(3, 3, 1340283207850, 'jon'),
-(4, 4, 1340283207850, 'jon');
diff --git a/storage/db/src/test/resources/sql/aql_msp.sql b/storage/db/src/test/resources/sql/aql_msp.sql
deleted file mode 100644
index 20699a9..0000000
--- a/storage/db/src/test/resources/sql/aql_msp.sql
+++ /dev/null
@@ -1,37 +0,0 @@
-UPDATE unique_ids SET current_id = 10000 WHERE index_type = 'general';
-
-INSERT INTO binaries VALUES
-('dcab88fc2a043c2479a6de676a2f8179e9ea2167', '902a360ecad98a34b59863c1e65bcf71', 3),
-('acab88fc2a043c2479a6de676a2f8179e9ea2167', '302a360ecad98a34b59863c1e65bcf71', 78),
-('bbbb88fc2a043c2479a6de676a2f8179e9eabbbb', '402a360ecad98a34b59863c1e65bcf71', 33),
-('dddd88fc2a043c2479a6de676a2f8179e9eadddd', '502a360ecad98a34b59863c1e65bcf71', 333),
-('dddd88fc2a043c2479a6de676a2f7179e9eaddac', '502a360ecad98a34b59863c1e6accf71', 500),
-('dddd89fc2a043c2479a6de676a2f7179e9eaddac', '503a360ecad98a34b59863c1e6accf71', 666);
-
-INSERT INTO nodes VALUES
-(1, 0, 'repo1', '.', '.', 0, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(2, 0, 'repo1', '.', 'ant', 1, 1340283204448, 'yossis-1', 1340283205448,'yossis-2', 1340283205448, 0, NULL, NULL, NULL, NULL),
-(3, 0, 'repo1', 'ant', 'ant', 2, 1340283204450, 'yossis-1', 1340283204450,'yossis-3', 1340283214450, 0, NULL, NULL, NULL, NULL),
-(4, 0, 'repo1', 'ant/ant', '1.5', 3, 1340283204448, 'yossis-9614', 1340283204448,'yossis-5612', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(5, 1, 'repo1', 'ant/ant/1.5', 'ant-1.5.jar', 4, 1340283204448, 'yossis-2201', 1340283204448,'yossis-3274', 1340283204448, 716139, 'dcab88fc2a043c2479a6de676a2f8179e9ea2167', 'dcab88fc2a043c2479a6de676a2f8179e9ea2167', '902a360ecad98a34b59863c1e65bcf71', '902a360ecad98a34b59863c1e65bcf71'),
-(6, 0, 'repo1', '.', 'ant-launcher', 1, 1340223204457, 'yossis-2', 1340283204448,'yossis-2', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(7, 0, 'repo1', 'ant-launcher', 'ant-launcher', 2, 1340223204457, 'yossis-2', 1340283204448,'yossis-2', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(8, 0, 'repo1', '.', 'org', 1, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(9, 0, 'repo1', 'org', 'yossis', 2, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(10, 0, 'repo1', 'org/yossis', 'tools', 3, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(11, 1, 'repo1', 'org/yossis/tools', 'test.bin', 4, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'acab88fc2a043c2479a6de676a2f8179e9ea2167', 'acab88fc2a043c2479a6de676a2f8179e9ea2167', '302a360ecad98a34b59863c1e65bcf71', '302a360ecad98a34b59863c1e65bcf71');
-
-INSERT INTO node_props VALUES
-(1, 5, 'color', 'red'),
-(2, 5, 'color', 'green'),
-(3, 5, 'license', 'GPL'),
-(4, 3, 'color', 'green'),
-(5, 11, 'color', 'black'),
-(6, 11, 'license', 'LGPL-V5'),
-(7, 8, 'role', 'manager'),
-(8, 8, 'role', 'cleaner'),
-(9, 11, 'license','LGPL-V2');
-
-INSERT INTO node_meta_infos VALUES
-(5, 1340286103555, 'yossis'),
-(9, 1340286803666, 'yoyo');
diff --git a/storage/db/src/test/resources/sql/aql_properties.sql b/storage/db/src/test/resources/sql/aql_properties.sql
deleted file mode 100644
index be7042d..0000000
--- a/storage/db/src/test/resources/sql/aql_properties.sql
+++ /dev/null
@@ -1,36 +0,0 @@
-UPDATE unique_ids SET current_id = 10000 WHERE index_type = 'general';
-
-INSERT INTO binaries VALUES
-('dcab88fc2a043c2479a6de676a2f8179e9ea2167', '902a360ecad98a34b59863c1e65bcf71', 3),
-('acab88fc2a043c2479a6de676a2f8179e9ea2167', '302a360ecad98a34b59863c1e65bcf71', 78),
-('bbbb88fc2a043c2479a6de676a2f8179e9eabbbb', '402a360ecad98a34b59863c1e65bcf71', 33),
-('dddd88fc2a043c2479a6de676a2f8179e9eadddd', '502a360ecad98a34b59863c1e65bcf71', 333),
-('dddd88fc2a043c2479a6de676a2f7179e9eaddac', '502a360ecad98a34b59863c1e6accf71', 500),
-('dddd89fc2a043c2479a6de676a2f7179e9eaddac', '503a360ecad98a34b59863c1e6accf71', 666);
-
-INSERT INTO nodes VALUES
-(1, 0, 'repo1', '.', '.', 0, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(2, 0, 'repo1', '.', 'ant', 1, 1340283204448, 'yossis-1', 1340283205448,'yossis-2', 1340283205448, 0, NULL, NULL, NULL, NULL),
-(3, 0, 'repo1', 'ant', 'ant', 2, 1340283204450, 'yossis-1', 1340283204450,'yossis-3', 1340283214450, 0, NULL, NULL, NULL, NULL),
-(4, 0, 'repo1', 'ant/ant', '1.5', 3, 1340283204448, 'yossis-9614', 1340283204448,'yossis-5612', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(5, 1, 'repo1', 'ant/ant/1.5', 'ant-1.5.jar', 4, 1340283204448, 'yossis-2201', 1340283204448,'yossis-3274', 1340283204448, 716139, 'dcab88fc2a043c2479a6de676a2f8179e9ea2167', 'dcab88fc2a043c2479a6de676a2f8179e9ea2167', '902a360ecad98a34b59863c1e65bcf71', '902a360ecad98a34b59863c1e65bcf71'),
-(6, 0, 'repo1', '.', 'ant-launcher', 1, 1340223204457, 'yossis-2', 1340283204448,'yossis-2', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(7, 0, 'repo1', 'ant-launcher', 'ant-launcher', 2, 1340223204457, 'yossis-2', 1340283204448,'yossis-2', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(8, 0, 'repo1', '.', 'org', 1, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(9, 0, 'repo1', 'org', 'yossis', 2, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(10, 0, 'repo1', 'org/yossis', 'tools', 3, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(11, 1, 'repo1', 'org/yossis/tools', 'test.bin', 4, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'acab88fc2a043c2479a6de676a2f8179e9ea2167', 'acab88fc2a043c2479a6de676a2f8179e9ea2167', '302a360ecad98a34b59863c1e65bcf71', '302a360ecad98a34b59863c1e65bcf71');
-
-INSERT INTO node_props VALUES
-(1, 5, 'color', 'red'),
-(2, 5, 'color', 'green'),
-(3, 5, 'license', 'GPL'),
-(4, 3, 'color', 'green'),
-(5, 11, 'color', 'black'),
-(6, 11, 'license', 'LGPL'),
-(7, 8, 'role', 'manager'),
-(8, 8, 'role', 'cleaner');
-
-INSERT INTO node_meta_infos VALUES
-(5, 1340286103555, 'yossis'),
-(9, 1340286803666, 'yoyo');
diff --git a/storage/db/src/test/resources/sql/aql_test.sql b/storage/db/src/test/resources/sql/aql_test.sql
deleted file mode 100644
index b63e25c..0000000
--- a/storage/db/src/test/resources/sql/aql_test.sql
+++ /dev/null
@@ -1,161 +0,0 @@
-UPDATE unique_ids SET current_id = 10000 WHERE index_type = 'general';
-
-INSERT INTO binaries VALUES
-('dcab88fc2a043c2479a6de676a2f8179e9ea2167', '902a360ecad98a34b59863c1e65bcf71', 3),
-('acab88fc2a043c2479a6de676a2f8179e9ea2167', '302a360ecad98a34b59863c1e65bcf71', 78),
-('bbbb88fc2a043c2479a6de676a2f8179e9eabbbb', '402a360ecad98a34b59863c1e65bcf71', 33),
-('dddd88fc2a043c2479a6de676a2f8179e9eadddd', '502a360ecad98a34b59863c1e65bcf71', 333),
-('dddd88fc2a043c2479a6de676a2f7179e9eaddac', '502a360ecad98a34b59863c1e6accf71', 500),
-('dddd89fc2a043c2479a6de676a2f7179e9eaddac', '503a360ecad98a34b59863c1e6accf71', 666);
-
-INSERT INTO nodes VALUES
-(1, 0, 'repo1', '.', '.', 0, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(2, 0, 'repo1', '.', 'ant', 1, 1340283204448, 'yossis-1', 1340283205448,'yossis-2', 1340283205448, 0, NULL, NULL, NULL, NULL),
-(3, 0, 'repo1', 'ant', 'ant', 2, 1340283204450, 'yossis-1', 1340283204450,'yossis-3', 1340283214450, 0, NULL, NULL, NULL, NULL),
-(4, 0, 'repo1', 'ant/ant', '1.5', 3, 1340283204448, 'yossis-9614', 1340283204448,'yossis-5612', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(5, 1, 'repo1', 'ant/ant/1.5', 'ant-1.5.jar', 4, 1340283204448, 'yossis-2201', 1340283204448,'yossis-3274', 1340283204448, 716139, 'dcab88fc2a043c2479a6de676a2f8179e9ea2167', 'dcab88fc2a043c2479a6de676a2f8179e9ea2167', '902a360ecad98a34b59863c1e65bcf71', '902a360ecad98a34b59863c1e65bcf71'),
-(6, 0, 'repo1', '.', 'ant-launcher', 1, 1340223204457, 'yossis-2', 1340283204448,'yossis-2', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(7, 0, 'repo1', 'ant-launcher', 'ant-launcher', 2, 1340223204457, 'yossis-2', 1340283204448,'yossis-2', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(8, 0, 'repo1', '.', 'org', 1, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(9, 0, 'repo1', 'org', 'yossis', 2, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(10, 0, 'repo1', 'org/yossis', 'tools', 3, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(11, 1, 'repo1', 'org/yossis/tools', 'test.bin', 4, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'acab88fc2a043c2479a6de676a2f8179e9ea2167', 'acab88fc2a043c2479a6de676a2f8179e9ea2167', '302a360ecad98a34b59863c1e65bcf71', '302a360ecad98a34b59863c1e65bcf71'),
-(12, 1, 'repo1', 'org/yossis/tools', 'file2.bin', 4, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'bbbb88fc2a043c2479a6de676a2f8179e9eabbbb', 'bcab88fc2a043c2479a6de676a2f8179e9ea2167', '402a360ecad98a34b59863c1e65bcf71', '402a360ecad98a34b59863c1e65bcf71'),
-(13, 1, 'repo1', 'org/yossis/tools', 'file3.bin', 4, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'dddd88fc2a043c2479a6de676a2f8179e9eadddd', 'ccab88fc2a043c2479a6de676a2f8179e9ea2167', '502a360ecad98a34b59863c1e65bcf71', '502a360ecad98a34b59863c1e65bcf71'),
-(15, 1, 'repo-copy', 'org/yossis/tools', 'file3.bin', 4, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'dddd88fc2a043c2479a6de676a2f8179e9eadddd', 'ccab88fc2a043c2479a6de676a2f8179e9ea2167', '502a360ecad98a34b59863c1e65bcf71', '502a360ecad98a34b59863c1e65bcf71'),
-(14, 0, 'repo1', 'org/yossis', 'empty', 3, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(16, 1, 'repo-copy', 'org/shayy/trustme', 'trustme.jar', 4, 1340283204447, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'dddd88fc2a043c2479a6de676a2f7179e9eaddac', 'NO_ORIG', '502a360ecad98a34b59863c1e6accf71', 'NO_ORIG'),
-(17, 1, 'repo-copy', 'org/shayy/badmd5', 'badmd5.jar', 4, 1340283204447, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'dddd88fc2a043c2479a6de676a2f7179e9eaddac', 'NO_ORIG', '502a360ecad98a34b59863c1e6accf71', '502a360ecad98a34b59863c1e65bcf32'),
-(18, 0, 'repo2', '.', '.', 0, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(19, 0, 'repo2', '.', 'a', 1, 1340283204448, 'yossis-1', 1340283205448,'yossis-2', 1340283205448, 0, NULL, NULL, NULL, NULL),
-(20, 0, 'repo2', 'a', 'b', 2, 1340283204450, 'yossis-1', 1340283204450,'yossis-3', 1340283214450, 0, NULL, NULL, NULL, NULL),
-(21, 1, 'repo2', 'a', 'ant-1.5.jar', 4, 1340283204448, 'yossis-2201', 1340283204448,'yossis-3274', 1340283204448, 716139, 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', '503a360ecad98a34b59863c1e6accf71', '503a360ecad98a34b59863c1e6accf71'),
-(22, 1, 'repo2', 'a/b', 'ant-1.5.jar', 4, 1340283204448, 'yossis-2201', 1340283204448,'yossis-3274', 1340283204448, 716139, 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', '503a360ecad98a34b59863c1e6accf71', '503a360ecad98a34b59863c1e6accf71'),
-(23, 0, 'repo2', '.', 'aa', 1, 1340283204448, 'yossis-1', 1340283205448,'yossis-2', 1340283205448, 0, NULL, NULL, NULL, NULL),
-(24, 0, 'repo2', 'aa', 'b', 2, 1340283204450, 'yossis-1', 1340283204450,'yossis-3', 1340283214450, 0, NULL, NULL, NULL, NULL),
-(25, 1, 'repo2', 'aa', 'ant-1.5.jar', 4, 1340283204448, 'yossis-2201', 1340283204448,'yossis-3274', 1340283204448, 716139, 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', '503a360ecad98a34b59863c1e6accf71', '503a360ecad98a34b59863c1e6accf71'),
-(26, 1, 'repo2', 'aa/b', 'ant-1.5.jar', 4, 1340283204448, 'yossis-2201', 1340283204448,'yossis-3274', 1340283204448, 716139, 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', '503a360ecad98a34b59863c1e6accf71', '503a360ecad98a34b59863c1e6accf71');
-
-INSERT INTO node_props VALUES
-(1, 5, 'build.name', 'ant'),
-(2, 5, 'build.number', '67'),
-(3, 9, 'yossis', 'value1'),
-(4, 9, 'jungle', 'value2'),
-(5, 9, 'trance', 'me'),
-(6, 14, 'empty.val', ''),
-(7, 14, 'null.val', NULL),
-(8, 1, 'build.name', 'ant'),
-(9, 11, 'yossis', 'pdf'),
-(10, 5, 'string', 'this is string');
-
-INSERT INTO node_meta_infos VALUES
-(5, 1340286103555, 'yossis'),
-(9, 1340286803666, 'yoyo');
-
-INSERT INTO watches VALUES
-(1, 4, 'scott', 1340286203555),
-(2, 4, 'amy', 1340286203666),
-(3, 5, 'scott', 1340286203555),
-(4, 9, 'yossis', 1340286203432),
-(5, 9, 'ariel', 1340286203433),
-(6, 10, 'dodo', 1340286203433),
-(7, 10, 'momo', 1340286203433),
-(8, 11, 'momo', 1340286203433);
-
-INSERT INTO stats VALUES
-(6, 15, 1340283207850, 'yossis'),
-(9, 9, 1340283207850, 'yossis'),
-(5, 9, 1340283207850, 'yossis');
-
-INSERT INTO indexed_archives VALUES
-('dcab88fc2a043c2479a6de676a2f8179e9ea2167', 6000),
-('bbbb88fc2a043c2479a6de676a2f8179e9eabbbb', 6001),
-('acab88fc2a043c2479a6de676a2f8179e9ea2167', 6002);
-
-INSERT INTO archive_paths VALUES
-(8001, 'META-INF'),
-(8002, 'org/apache/tools/ant/filters'),
-(8003, 'org/apache/tools/mail'),
-(8004, '.'),
-(8005, 'another'),
-(8006, 'path');
-
-INSERT INTO archive_names VALUES
-(9001, 'LICENSE.txt'),
-(9002, 'MANIFEST.MF'),
-(9003, 'BaseFilterReader.class'),
-(9004, 'BaseParamFilterReader.class'),
-(9005, 'MailMessage.class'),
-(9006, 'Test'),
-(9007, 'test.me'),
-(9008, 'file.file');
-
-INSERT INTO indexed_archives_entries VALUES
-(6000, 8001, 9001),
-(6000, 8001, 9002),
-(6000, 8002, 9003),
-(6000, 8002, 9004),
-(6000, 8003, 9005),
-(6001, 8004, 9006),
-(6001, 8005, 9007),
-(6002, 8006, 9008);
-
-INSERT INTO tasks VALUES
-('INDEX', 'repo1:ant/ant/1.5/ant-1.5.jar'),
-('INDEX', 'reponone:test'),
-('MMC', 'this/is/a/test');
-
-INSERT INTO builds VALUES
-(1, 'ba', '1', 1349000000000, NULL, 1350000000000, 'me', 1350000000001, 'not-me'),
-(2, 'bb', '1', 1349001000000, 'http://myserver/jenkins/bb/1', 1350001000000, 'me', NULL, NULL),
-(3, 'ba', '2', 1349002000000, NULL, 1350002000000, 'me', NULL, NULL),
-(4, 'bb', '2', 1349003000000, 'http://myserver/jenkins/bb/2', 1350003000000, 'me', NULL, NULL),
-(5, 'ba', '3', 1349004000000, NULL, 1350004000000, 'me', NULL, NULL);
-
-INSERT INTO build_props VALUES
-(1, 1, 'start', '0'),
-(2, 1, 'status', 'bad'),
-(3, 2, 'start', '1'),
-(4, 2, 'status', 'not-too-bad'),
-(5, 5, 'start', '4'),
-(6, 5, 'status', 'good');
-
-INSERT INTO build_modules VALUES
-  (1, 1, 'ba:moda1'),
-  (2, 2, 'bb:modb1'),
-  (3, 2, 'bb:modb2'),
-  (4, 3, 'ba:moda1');
-
-INSERT INTO module_props VALUES
-(1, 1, 'start', '0'),
-(2, 1, 'status', 'bad'),
-(3, 2, 'start', '1'),
-(4, 2, 'status', 'not-too-bad'),
-(5, 4, 'start', '4'),
-(6, 4, 'status', 'good');
--- Inserting date in oposite order to check re-ordering
-INSERT INTO build_promotions VALUES
-(3, 1350012000000, 'me', 'dead', NULL, 'bad stuff', NULL),
-(5, 1350034000000, 'promoter', 'Released', 'public', 'Full release', 'rel'),
-(5, 1350024000000, NULL, 'staging', NULL, NULL, 'jenkins'),
-(4, 1350003000000, NULL, 'staging', NULL, NULL, NULL),
-(4, 1350023000000, 'tester', 'rollback', 'lost-local', 'Refused by QA', NULL),
-(4, 1350013000000, 'promoter', 'promoted', 'qa-local', 'sending to QA', 'me');
-
-INSERT INTO build_artifacts VALUES
-(2001, 1, 'ba1mod1-art1', 'dll', 'acab88fc2a043c2479a6de676a2f8179e9ea2167', 'a02a360ecad98a34b59863c1e65bcf71'),
-(2002, 2, 'bb1mod2-art1', 'dll', 'acab88fc2a043c2479a6de676a2f8179e9ea2167', 'a02a360ecad98a34b59863c1e65bcf71'),
-(2003, 3, 'bb1mod3-art1', 'dll', 'acab88fc2a043c2479a6de676a2f8179e9ea2167', 'a02a360ecad98a34b59863c1e65bcf71'),
-(2004, 4, 'ba2mod4-art1', 'dll', 'acab88fc2a043c2479a6de676a2f8179e9ea2167', 'a02a360ecad98a34b59863c1e65bcf71'),
-(2005, 1, 'ba1mod1-art2', 'dll', 'bcab88fc2a043c2479a6de676a2f8179e9ea2167', 'b02a360ecad98a34b59863c1e65bcf71'),
-(2006, 4, 'ba2mod4-art1', 'dll', 'bcab88fc2a043c2479a6de676a2f8179e9ea2167', 'b02a360ecad98a34b59863c1e65bcf71');
-
-INSERT INTO build_dependencies VALUES
-(2010, 1, 'bb1mod1-art1', 'compile', 'dll', 'ccab88fc2a043c2479a6de676a2f8179e9ea2167', 'c02a360ecad98a34b59863c1e65bcf71'),
-(2011, 2, 'bb1mod2-art1', 'compile', 'dll', 'ccab88fc2a043c2479a6de676a2f8179e9ea2167', 'c02a360ecad98a34b59863c1e65bcf71'),
-(2012, 3, 'ba1mod3-art1', 'compile', 'dll', 'dcab88fc2a043c2479a6de676a2f8179e9ea2167', 'c02a360ecad98a34b59863c1e65bcf71'),
-(2013, 4, 'ba2mod4-art1', 'compile', 'dll', 'ccab88fc2a043c2479a6de676a2f8179e9ea2167', 'd02a360ecad98a34b59863c1e65bcf71'),
-(2014, 3, 'bb1mod3-art1', 'compile', 'dll', 'ccab88fc2a043c2479a6de676a2f8179e9ea2167', 'd02a360ecad98a34b59863c1e65bcf71'),
-(2015, 3, 'bb1mod3-art1', 'compile', 'dll', 'bcab88fc2a043c2479a6de676a2f8179e9ea2167', 'd02a360ecad98a34b59863c1e65bcf71'),
-(2016, 1, 'bb1mod3-art1', 'compile', 'dll', 'dddd88fc2a043c2479a6de676a2f8179e9eadddd', 'd02a360ecad98a34b59863c1e65bcf71');
-
diff --git a/storage/db/src/test/resources/sql/binaries.sql b/storage/db/src/test/resources/sql/binaries.sql
deleted file mode 100644
index c3aab00..0000000
--- a/storage/db/src/test/resources/sql/binaries.sql
+++ /dev/null
@@ -1,16 +0,0 @@
-INSERT INTO binaries VALUES
-('b60d121b438a380c343d5ec3c2037564b82ffef3', '302a360ecad98a34b59863c1e65bcf71', 3),
-('f0d381ab0e057d4f835d639f6330a7c3e81eb6af', '902a360ecad98a34b59863c1e65bcf71', 2725),
-('356a192b7913b04c54574d18c28d46e6395428ab', '502a360ecad98a34b59863c1e65bcf71', 1),
-('74239116da1def240fe1d366eb535513efc1c40b', '402a360ecad98a34b59863c1e65bcf71', 33670080),
-('da39a3ee5e6b4b0d3255bfef95601890afd80709', '602a360ecad98a34b59863c1e65bcf71', 0);
-
-INSERT INTO nodes VALUES
-(1, 0, 'repo1', '.', '.', 0, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(8, 0, 'repo1', '.', 'org', 1, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(9, 0, 'repo1', 'org', 'yossis', 2, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(10, 0, 'repo1', 'org/yossis', 'tools', 3, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(11, 1, 'repo1', 'org/yossis/tools', 'test.bin', 4, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'b60d121b438a380c343d5ec3c2037564b82ffef3', 'acab88fc2a043c2479a6de676a2f8179e9ea2167', '302a360ecad98a34b59863c1e65bcf71', '302a360ecad98a34b59863c1e65bcf71'),
-(12, 1, 'repo1', 'org/yossis/tools', 'file2.bin', 4, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'b60d121b438a380c343d5ec3c2037564b82ffef3', 'bcab88fc2a043c2479a6de676a2f8179e9ea2167', '302a360ecad98a34b59863c1e65bcf71', '402a360ecad98a34b59863c1e65bcf71'),
-(13, 1, 'repo1', 'org/yossis/tools', 'file3.bin', 4, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'f0d381ab0e057d4f835d639f6330a7c3e81eb6af', 'ccab88fc2a043c2479a6de676a2f8179e9ea2167', '902a360ecad98a34b59863c1e65bcf71', '502a360ecad98a34b59863c1e65bcf71'),
-(14, 0, 'repo1', 'org/yossis', 'empty', 3, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL);
diff --git a/storage/db/src/test/resources/sql/build-modules.sql b/storage/db/src/test/resources/sql/build-modules.sql
deleted file mode 100644
index 46ec713..0000000
--- a/storage/db/src/test/resources/sql/build-modules.sql
+++ /dev/null
@@ -1,25 +0,0 @@
-UPDATE unique_ids SET current_id = 10000 WHERE index_type = 'general';
-
-INSERT INTO build_modules VALUES
-(5, 3, 'ba:moda2'),
-(6, 4, 'bb:modb1'),
-(7, 4, 'bb:modb2'),
-(8, 5, 'ba:moda1'),
-(9, 5, 'ba:moda2'),
-(10, 5, 'ba:moda3');
-
-INSERT INTO module_props VALUES
-(1, 1, 'art-name', 'moda1'),
-(2, 1, 'status', 'bad'),
-(3, 1, 'dummy', 'dumm'),
-(4, 2, 'art-name', 'modb1'),
-(5, 2, 'status', 'not-too-bad'),
-(6, 3, 'art-name', 'modb2'),
-(7, 3, 'status', 'quite-good'),
-(8, 8, 'art-name', 'moda1'),
-(9, 8, 'status-moda1', 'good'),
-(10, 9, 'art-name', 'moda2'),
-(11, 9, 'status-moda2', 'good'),
-(12, 10, 'art-name', 'moda3'),
-(13, 10, 'status-moda3', 'good');
-
diff --git a/storage/db/src/test/resources/sql/builds.sql b/storage/db/src/test/resources/sql/builds.sql
deleted file mode 100644
index cf8780d..0000000
--- a/storage/db/src/test/resources/sql/builds.sql
+++ /dev/null
@@ -1,46 +0,0 @@
-UPDATE unique_ids SET current_id = 10000 WHERE index_type = 'general';
-
-INSERT INTO builds VALUES
-(1, 'ba', '1', 1349000000000, NULL, 1350000000000, 'me', 1350000000001, 'not-me'),
-(2, 'bb', '1', 1349001000000, 'http://myserver/jenkins/bb/1', 1350001000000, 'me', NULL, NULL),
-(3, 'ba', '2', 1349002000000, NULL, 1350002000000, 'me', NULL, NULL),
-(4, 'bb', '2', 1349003000000, 'http://myserver/jenkins/bb/2', 1350003000000, 'me', NULL, NULL),
-(5, 'ba', '3', 1349004000000, NULL, 1350004000000, 'me', NULL, NULL);
-
-INSERT INTO build_props VALUES
-(1, 1, 'start', '0'),
-(2, 1, 'status', 'bad'),
-(3, 2, 'start', '1'),
-(4, 2, 'status', 'not-too-bad'),
-(5, 5, 'start', '4'),
-(6, 5, 'status', 'good');
-
--- Inserting date in oposite order to check re-ordering
-INSERT INTO build_promotions VALUES
-(3, 1350012000000, 'me', 'dead', NULL, 'bad stuff', NULL),
-(5, 1350034000000, 'promoter', 'Released', 'public', 'Full release', 'rel'),
-(5, 1350024000000, NULL, 'staging', NULL, NULL, 'jenkins'),
-(4, 1350003000000, NULL, 'staging', NULL, NULL, NULL),
-(4, 1350023000000, 'tester', 'rollback', 'lost-local', 'Refused by QA', NULL),
-(4, 1350013000000, 'promoter', 'promoted', 'qa-local', 'sending to QA', 'me');
-
-INSERT INTO build_modules VALUES
-  (1, 1, 'ba:moda1'),
-  (2, 2, 'bb:modb1'),
-  (3, 2, 'bb:modb2'),
-  (4, 3, 'ba:moda1');
-
-INSERT INTO build_artifacts VALUES
-(2001, 1, 'ba1mod1-art1', 'dll', 'acab88fc2a043c2479a6de676a2f8179e9ea2167', 'a02a360ecad98a34b59863c1e65bcf71'),
-(2002, 2, 'bb1mod2-art1', 'dll', 'acab88fc2a043c2479a6de676a2f8179e9ea2167', 'a02a360ecad98a34b59863c1e65bcf71'),
-(2003, 3, 'bb1mod3-art1', 'dll', 'acab88fc2a043c2479a6de676a2f8179e9ea2167', 'a02a360ecad98a34b59863c1e65bcf71'),
-(2004, 4, 'ba2mod4-art1', 'dll', 'acab88fc2a043c2479a6de676a2f8179e9ea2167', 'a02a360ecad98a34b59863c1e65bcf71'),
-(2005, 1, 'ba1mod1-art2', 'dll', 'bcab88fc2a043c2479a6de676a2f8179e9ea2167', 'b02a360ecad98a34b59863c1e65bcf71'),
-(2006, 4, 'ba2mod4-art1', 'dll', 'bcab88fc2a043c2479a6de676a2f8179e9ea2167', 'b02a360ecad98a34b59863c1e65bcf71');
-
-INSERT INTO build_dependencies VALUES
-(2010, 1, 'bb1mod1-art1', 'compile', 'dll', 'ccab88fc2a043c2479a6de676a2f8179e9ea2167', 'c02a360ecad98a34b59863c1e65bcf71'),
-(2011, 2, 'bb1mod2-art1', 'compile', 'dll', 'ccab88fc2a043c2479a6de676a2f8179e9ea2167', 'c02a360ecad98a34b59863c1e65bcf71'),
-(2012, 3, 'ba1mod3-art1', 'compile', 'dll', 'ccab88fc2a043c2479a6de676a2f8179e9ea2167', 'c02a360ecad98a34b59863c1e65bcf71'),
-(2013, 4, 'ba2mod4-art1', 'compile', 'dll', 'dcab88fc2a043c2479a6de676a2f8179e9ea2167', 'd02a360ecad98a34b59863c1e65bcf71'),
-(2014, 3, 'bb1mod3-art1', 'compile', 'dll', 'dcab88fc2a043c2479a6de676a2f8179e9ea2167', 'd02a360ecad98a34b59863c1e65bcf71');
\ No newline at end of file
diff --git a/storage/db/src/test/resources/sql/db-props-with-artifactory-version.sql b/storage/db/src/test/resources/sql/db-props-with-artifactory-version.sql
deleted file mode 100644
index 9f81160..0000000
--- a/storage/db/src/test/resources/sql/db-props-with-artifactory-version.sql
+++ /dev/null
@@ -1,4 +0,0 @@
-INSERT INTO db_properties VALUES
-(1339000000000, '4.7.0', NULL, NULL),
-(1349000000000, '4.7.1', 12000, 1300000000000);
-
diff --git a/storage/db/src/test/resources/sql/db-props.sql b/storage/db/src/test/resources/sql/db-props.sql
deleted file mode 100644
index a771470..0000000
--- a/storage/db/src/test/resources/sql/db-props.sql
+++ /dev/null
@@ -1,4 +0,0 @@
-INSERT INTO db_properties VALUES
-(1339000000000, '2-t', NULL, NULL),
-(1349000000000, '5-t', 12000, 1300000000000),
-(1348000000000, '4-t', 11000, 1200000000000);
diff --git a/storage/db/src/test/resources/sql/ha.sql b/storage/db/src/test/resources/sql/ha.sql
deleted file mode 100644
index 477f8bb..0000000
--- a/storage/db/src/test/resources/sql/ha.sql
+++ /dev/null
@@ -1,4 +0,0 @@
-INSERT INTO artifactory_servers VALUES
-('1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0', 1234567891, '10.0.0.1:1', 5700, 'RUNNING',  'priMary', 1234567891, '3.1.0_01', 8844551, 1231, 'HA', '01234567890123456789012345678901234567891'),
-('2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0', 1234567892, '10.0.0.2:2', 5700, 'STARTING', 'MEMBER',  1234567892, '3.1.0_02', 8844552, 1232, 'OSS', '01234567890123456789012345678901234567892'),
-('3aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0', 1234567893, '10.0.0.3:3', 5700, 'STOPPING', 'COPY',   1234567893, '3.1.0_03', 8844553, 1233, 'PRO', '01234567890123456789012345678901234567893');
diff --git a/storage/db/src/test/resources/sql/nodes-for-service.sql b/storage/db/src/test/resources/sql/nodes-for-service.sql
deleted file mode 100644
index df389ea..0000000
--- a/storage/db/src/test/resources/sql/nodes-for-service.sql
+++ /dev/null
@@ -1,86 +0,0 @@
-UPDATE unique_ids SET current_id = 10000 WHERE index_type = 'general';
-
-INSERT INTO binaries VALUES
-('dcab88fc2a043c2479a6de676a2f8179e9ea2167', '902a360ecad98a34b59863c1e65bcf71', 3),
-('ecab88fc2a043c2479a6de676a2f8179e9ea2167', '002a360ecad98a34b59863c1e65bcf71', 42),
-('dddd88fc2a043c2479a6de676a2f7179e9eaddac', '502a360ecad98a34b59863c1e6accf71', 89),
-('cccc88fc2a043c2479a6de676a2f8179e9eacccc', '777a360ecad98a34b59863c1e6accf71', 789);
-
-INSERT INTO nodes VALUES
-(1, 0, 'repo1', '.', '.', 0, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(2, 0, 'repo1', '.', 'ant', 1, 1340283204448, 'yossis-1', 1340283205448,'yossis-2', 1340283205448, 0, NULL, NULL, NULL, NULL),
-(3, 0, 'repo1', 'ant', 'ant', 2, 1340283204450, 'yossis-1', 1340283204450,'yossis-3', 1340283214450, 0, NULL, NULL, NULL, NULL),
-(4, 0, 'repo1', 'ant/ant', '1.5', 3, 1340283204448, 'yossis-9614', 1340283204448,'yossis-5612', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(5, 1, 'repo1', 'ant/ant/1.5', 'ant-1.5.jar', 4, 1340283204448, 'yossis-2201', 1340283204448,'yossis-3274', 1340283204448, 716139, 'dcab88fc2a043c2479a6de676a2f8179e9ea2167', 'dcab88fc2a043c2479a6de676a2f8179e9ea2167', '902a360ecad98a34b59863c1e65bcf71', '902a360ecad98a34b59863c1e65bcf71'),
-(6, 0, 'repo1', '.', 'org', 1, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(7, 0, 'repo1', 'org', 'yossis', 2, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(500, 0, 'repo2', '.', '.', 0, 1340283204448, 'yossis', 1340283204448, 'yossis', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(501, 0, 'repo2', '.', 'org', 1, 1340283204448, 'yossis-1', 1340283204448, 'yossis', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(502, 0, 'repo2', 'org', 'jfrog', 2, 1340283204448, 'yossis', 1340283204448, 'yossis', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(503, 0, 'repo2', 'org/jfrog', 'test', 3, 1340283204448, 'yossis', 1340283204448, 'yossis', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(504, 1, 'repo2', 'org/jfrog/test', 'test.jar', 4, 1340283204448, 'yossis', 1340283204448, 'yossis', 1340283204448, 716139, 'dcab88fc2a043c2479a6de676a2f8179e9ea2167', 'dcab88fc2a043c2479a6de676a2f8179e9ea2167', '902a360ecad98a34b59863c1e65bcf71', '902a360ecad98a34b59863c1e65bcf71'),
-(505, 1, 'repo2', 'org/jfrog/test', 'test2.pom', 4, 1340283204448, 'yossis', 1340283204448, 'yossis', 1340283204448, 321, 'ecab88fc2a043c2479a6de676a2f8179e9ea2167', 'ecab88fc2a043c2479a6de676a2f8179e9ea2167', '002a360ecad98a34b59863c1e65bcf71', '002a360ecad98a34b59863c1e65bcf71'),
-(600, 1, 'repo-copy', 'org/shayy/trustme', 'trustme.jar', 4, 1340283204447, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'dddd88fc2a043c2479a6de676a2f7179e9eaddac', 'NO_ORIG', '502a360ecad98a34b59863c1e6accf71', 'NO_ORIG'),
-(601, 1, 'repo-copy', 'org/shayy/badsha1', 'badsha1.jar', 4, 1340283204447, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'dddd88fc2a043c2479a6de676a2f7179e9eaddac', 'dddd88fc2a043c2479a6de676a2f7179e9eadd34', '502a360ecad98a34b59863c1e65bcf32', '502a360ecad98a34b59863c1e65bcf32'),
-(602, 1, 'repo-copy', 'org/shayy/badmd5', 'badmd5.jar', 4, 1340283204447, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'dddd88fc2a043c2479a6de676a2f7179e9eaddac', 'NO_ORIG', '502a360ecad98a34b59863c1e6accf71', '502a360ecad98a34b59863c1e65bcf32');
-
-INSERT INTO node_props VALUES
-(100, 5, 'build.name', 'ant'),
-(101, 5, 'build.number', '67'),
-(102, 7, 'yossis', 'value1'),
-(103, 7, 'yossis', 'value2');
-
-INSERT INTO node_meta_infos VALUES
-(5, 1340286203444, 'yossis'),
-(7, 1340286203121, 'yoyo');
-
-INSERT INTO watches VALUES
-(1, 4, 'scott', 1340286203555),
-(2, 4, 'amy', 1340286203666),
-(3, 5, 'scott', 1340286203555),
-(4, 7, 'yossis', 1340286203432),
-(5, 7, 'ariel', 1340286203433),
-(6, 502, 'yossis', 1340286203433),
-(7, 503, 'yossis', 1340286203433),
-(8, 504, 'yossis', 1340286203433),
-(9, 4, 'yoyo', 1340286203932),
-(10, 4, 'yoyo', 1340282203433),
-(11, 4, 'yoyo', 1340285203433);
-
-INSERT INTO stats VALUES
-(5, 2, 1340283207850, 'ariels');
-
-INSERT INTO stats_remote VALUES
-(5, 'myhost.com', 3, 1340283207853, 'michaelp', 'no-path');
-
-INSERT INTO indexed_archives VALUES
-('dcab88fc2a043c2479a6de676a2f8179e9ea2167', 6001),
-('cccc88fc2a043c2479a6de676a2f8179e9eacccc', 6002);
-
-INSERT INTO archive_paths VALUES
-(8001, 'META-INF'),
-(8002, 'org/apache/tools/ant/filters'),
-(8003, 'org/apache/tools/mail'),
-(8004, '.'),
-(8005, 'another');
-
-INSERT INTO archive_names VALUES
-(9001, 'LICENSE.txt'),
-(9002, 'MANIFEST.MF'),
-(9003, 'BaseFilterReader.class'),
-(9004, 'BaseParamFilterReader.class'),
-(9005, 'MailMessage.class'),
-(9006, 'Test'),
-(9007, 'test.me');
-
-INSERT INTO indexed_archives_entries VALUES
-(6001, 8001, 9001),
-(6001, 8001, 9002),
-(6001, 8002, 9003),
-(6002, 8001, 9002),
-(6002, 8004, 9006),
-(6002, 8005, 9007);
-
-INSERT INTO tasks VALUES
-('INDEX', 'repo1:ant/ant/1.5/ant-1.5.jar'),
-('INDEX', 'reponone:ant/ant/1.5/ant-1.5.jar');
\ No newline at end of file
diff --git a/storage/db/src/test/resources/sql/nodes-summary.sql b/storage/db/src/test/resources/sql/nodes-summary.sql
deleted file mode 100644
index 91d7d1e..0000000
--- a/storage/db/src/test/resources/sql/nodes-summary.sql
+++ /dev/null
@@ -1,32 +0,0 @@
-UPDATE unique_ids SET current_id = 10000 WHERE index_type = 'general';
-
-INSERT INTO binaries VALUES
-('666b88fc2a043c2479a6de676a2f8179e9ea2777', '902a360ecad98a34b59863c1e65bcf71', 3),
-('acab88fc2a043c2479a6de676a2f8179e9ea2167', '302a360ecad98a34b59863c1e65bcf71', 78),
-('bbbb88fc2a043c2479a6de676a2f8179e9eabbbb', '402a360ecad98a34b59863c1e65bcf71', 33),
-('dddd88fc2a043c2479a6de676a2f8179e9eadddd', '502a360ecad98a34b59863c1e65bcf71', 333),
-('dddd88fc2a043c2479a6de676a2f7179e9eaddac', '502a360ecad98a34b59863c1e6accf71', 500),
-('dddd89fc2a043c2479a6de676a2f7179e9eaddac', '503a360ecad98a34b59863c1e6accf71', 666);
-
-INSERT INTO nodes VALUES
-(1, 0, 'repo1', '.', '.', 0, 1340283204448, 'yossis', 1340283204448, 'yossis', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(2, 0, 'repo1', '.', 'ant', 1, 1340283204448, 'yossis', 1340283205448,'yossis', 1340283205448, 0, NULL, NULL, NULL, NULL),
-(3, 0, 'repo1', 'ant', 'ant', 2, 1340283204450, 'yossis', 1340283204450,'yossis-3', 1340283214450, 0, NULL, NULL, NULL, NULL),
-(4, 0, 'repo1', 'ant/ant', '1.5', 3, 1340283204448, 'yossis', 1340283204448,'yossis', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(5, 1, 'repo1', 'ant/ant/1.5', 'ant-1.5.jar', 4, 1340283204448, 'yossis', 1340283204448,'yossis', 1340283204448, 4, '666b88fc2a043c2479a6de676a2f8179e9ea2777', '666b88fc2a043c2479a6de676a2f8179e9ea2777', '902a360ecad98a34b59863c1e65bcf71', '902a360ecad98a34b59863c1e65bcf71'),
-(6, 0, 'repo1', '.', 'org', 1, 1340283204448, 'yossis', 1340283204448, 'yossis', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(7, 0, 'repo1', 'org', 'yossis', 2, 1340283204448, 'yossis', 1340283204448, 'yossis', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(8, 0, 'repo1', 'org/yossis', 'tools', 3, 1340283204448, 'yossis', 1340283204448, 'yossis', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(9, 1, 'repo1', 'org/yossis/tools', 'test.bin', 4, 1340283204448, 'yossis', 1340283204448, 'yossis', 1340283204448, 1, 'acab88fc2a043c2479a6de676a2f8179e9ea2167', 'acab88fc2a043c2479a6de676a2f8179e9ea2167', '302a360ecad98a34b59863c1e65bcf71', '302a360ecad98a34b59863c1e65bcf71'),
-(10, 1, 'repo1', 'org/yossis/tools', 'file2.bin', 4, 1340283204448, 'yossis', 1340283204448, 'yossis', 1340283204448, 2, 'bbbb88fc2a043c2479a6de676a2f8179e9eabbbb', 'bcab88fc2a043c2479a6de676a2f8179e9ea2167', '402a360ecad98a34b59863c1e65bcf71', '402a360ecad98a34b59863c1e65bcf71'),
-(11, 1, 'repo1', 'org/yossis/tools', 'file3.bin', 4, 1340283204448, 'yossis', 1340283204448, 'yossis', 1340283204448, 3, 'dddd88fc2a043c2479a6de676a2f8179e9eadddd', 'ccab88fc2a043c2479a6de676a2f8179e9ea2167', '502a360ecad98a34b59863c1e65bcf71', '502a360ecad98a34b59863c1e65bcf71'),
-(12, 0, 'repo2', '.', '.', 0, 1340283204448, 'yossis', 1340283204448, 'yossis', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(13, 0, 'repo2', '.', 'a', 1, 1340283204448, 'yossis', 1340283205448,'yossis', 1340283205448, 0, NULL, NULL, NULL, NULL),
-(14, 0, 'repo2', 'a', 'b', 2, 1340283204450, 'yossis', 1340283204450,'yossis-3', 1340283214450, 0, NULL, NULL, NULL, NULL),
-(15, 1, 'repo2', 'a', 'ant-1.5.jar', 4, 1340283204448, 'yossis', 1340283204448,'yossis', 1340283204448, 10, 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', '503a360ecad98a34b59863c1e6accf71', '503a360ecad98a34b59863c1e6accf71'),
-(16, 1, 'repo2', 'a/b', 'ant-1.5.jar', 4, 1340283204448, 'yossis', 1340283204448,'yossis', 1340283204448, 20, 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', '503a360ecad98a34b59863c1e6accf71', '503a360ecad98a34b59863c1e6accf71'),
-(17, 0, 'repo2', '.', 'aa', 1, 1340283204448, 'yossis', 1340283205448,'yossis', 1340283205448, 0, NULL, NULL, NULL, NULL),
-(18, 0, 'repo2', 'aa', 'b', 2, 1340283204450, 'yossis', 1340283204450,'yossis', 1340283214450, 0, NULL, NULL, NULL, NULL),
-(19, 1, 'repo2', 'aa', 'ant-1.5.jar', 4, 1340283204448, 'yossis', 1340283204448,'yossis', 1340283204448, 30, 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', '503a360ecad98a34b59863c1e6accf71', '503a360ecad98a34b59863c1e6accf71'),
-(20, 1, 'repo2', 'aa/b', 'ant-1.5.jar', 4, 1340283204448, 'yossis', 1340283204448,'yossis', 1340283204448, 40, 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', '503a360ecad98a34b59863c1e6accf71', '503a360ecad98a34b59863c1e6accf71'),
-(21, 0, 'repo3', '.', '.', 0, 1340283204448, 'yossis', 1340283204448, 'yossis', 1340283204448, 0, NULL, NULL, NULL, NULL);
\ No newline at end of file
diff --git a/storage/db/src/test/resources/sql/nodes.sql b/storage/db/src/test/resources/sql/nodes.sql
deleted file mode 100644
index 44c8335..0000000
--- a/storage/db/src/test/resources/sql/nodes.sql
+++ /dev/null
@@ -1,108 +0,0 @@
-UPDATE unique_ids SET current_id = 10000 WHERE index_type = 'general';
-
-INSERT INTO binaries VALUES
-('dcab88fc2a043c2479a6de676a2f8179e9ea2167', '902a360ecad98a34b59863c1e65bcf71', 3),
-('acab88fc2a043c2479a6de676a2f8179e9ea2167', '302a360ecad98a34b59863c1e65bcf71', 78),
-('bbbb88fc2a043c2479a6de676a2f8179e9eabbbb', '402a360ecad98a34b59863c1e65bcf71', 33),
-('dddd88fc2a043c2479a6de676a2f8179e9eadddd', '502a360ecad98a34b59863c1e65bcf71', 333),
-('dddd88fc2a043c2479a6de676a2f7179e9eaddac', '502a360ecad98a34b59863c1e6accf71', 500),
-('dddd89fc2a043c2479a6de676a2f7179e9eaddac', '503a360ecad98a34b59863c1e6accf71', 666);
-
-INSERT INTO nodes VALUES
-(1, 0, 'repo1', '.', '.', 0, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(2, 0, 'repo1', '.', 'ant', 1, 1340283204448, 'yossis-1', 1340283205448,'yossis-2', 1340283205448, 0, NULL, NULL, NULL, NULL),
-(3, 0, 'repo1', 'ant', 'ant', 2, 1340283204450, 'yossis-1', 1340283204450,'yossis-3', 1340283214450, 0, NULL, NULL, NULL, NULL),
-(4, 0, 'repo1', 'ant/ant', '1.5', 3, 1340283204448, 'yossis-9614', 1340283204448,'yossis-5612', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(5, 1, 'repo1', 'ant/ant/1.5', 'ant-1.5.jar', 4, 1340283204448, 'yossis-2201', 1340283204448,'yossis-3274', 1340283204448, 716139, 'dcab88fc2a043c2479a6de676a2f8179e9ea2167', 'dcab88fc2a043c2479a6de676a2f8179e9ea2167', '902a360ecad98a34b59863c1e65bcf71', '902a360ecad98a34b59863c1e65bcf71'),
-(6, 0, 'repo1', '.', 'ant-launcher', 1, 1340223204457, 'yossis-2', 1340283204448,'yossis-2', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(7, 0, 'repo1', 'ant-launcher', 'ant-launcher', 2, 1340223204457, 'yossis-2', 1340283204448,'yossis-2', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(8, 0, 'repo1', '.', 'org', 1, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(9, 0, 'repo1', 'org', 'yossis', 2, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(10, 0, 'repo1', 'org/yossis', 'tools', 3, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(11, 1, 'repo1', 'org/yossis/tools', 'test.bin', 4, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'acab88fc2a043c2479a6de676a2f8179e9ea2167', 'acab88fc2a043c2479a6de676a2f8179e9ea2167', '302a360ecad98a34b59863c1e65bcf71', '302a360ecad98a34b59863c1e65bcf71'),
-(12, 1, 'repo1', 'org/yossis/tools', 'file2.pom', 4, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'bbbb88fc2a043c2479a6de676a2f8179e9eabbbb', 'bcab88fc2a043c2479a6de676a2f8179e9ea2167', '402a360ecad98a34b59863c1e65bcf71', '402a360ecad98a34b59863c1e65bcf71'),
-(13, 1, 'repo1', 'org/yossis/tools', 'file3.pom', 4, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'dddd88fc2a043c2479a6de676a2f8179e9eadddd', 'ccab88fc2a043c2479a6de676a2f8179e9ea2167', '502a360ecad98a34b59863c1e65bcf71', '502a360ecad98a34b59863c1e65bcf71'),
-(15, 1, 'repo-copy', 'org/yossis/tools', 'file3.bin', 4, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'dddd88fc2a043c2479a6de676a2f8179e9eadddd', 'ccab88fc2a043c2479a6de676a2f8179e9ea2167', '502a360ecad98a34b59863c1e65bcf71', '502a360ecad98a34b59863c1e65bcf71'),
-(14, 0, 'repo1', 'org/yossis', 'empty', 3, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(16, 1, 'repo-copy', 'org/shayy/trustme', 'trustme.jar', 4, 1340283204447, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'dddd88fc2a043c2479a6de676a2f7179e9eaddac', 'NO_ORIG', '502a360ecad98a34b59863c1e6accf71', 'NO_ORIG'),
-(17, 1, 'repo-copy', 'org/shayy/badmd5', 'badmd5.jar', 4, 1340283204447, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'dddd88fc2a043c2479a6de676a2f7179e9eaddac', 'NO_ORIG', '502a360ecad98a34b59863c1e6accf71', '502a360ecad98a34b59863c1e65bcf32'),
-(18, 0, 'repo2', '.', '.', 0, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(19, 0, 'repo2', '.', 'a', 1, 1340283204448, 'yossis-1', 1340283205448,'yossis-2', 1340283205448, 0, NULL, NULL, NULL, NULL),
-(20, 0, 'repo2', 'a', 'b', 2, 1340283204450, 'yossis-1', 1340283204450,'yossis-3', 1340283214450, 0, NULL, NULL, NULL, NULL),
-(21, 1, 'repo2', 'a', 'ant-1.5.jar', 4, 1340283204448, 'yossis-2201', 1340283204448,'yossis-3274', 1340283204448, 716139, 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', '503a360ecad98a34b59863c1e6accf71', '503a360ecad98a34b59863c1e6accf71'),
-(22, 1, 'repo2', 'a/b', 'ant-1.5.jar', 4, 1340283204448, 'yossis-2201', 1340283204448,'yossis-3274', 1340283204448, 716139, 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', '503a360ecad98a34b59863c1e6accf71', '503a360ecad98a34b59863c1e6accf71'),
-(23, 0, 'repo2', '.', 'aa', 1, 1340283204448, 'yossis-1', 1340283205448,'yossis-2', 1340283205448, 0, NULL, NULL, NULL, NULL),
-(24, 0, 'repo2', 'aa', 'b', 2, 1340283204450, 'yossis-1', 1340283204450,'yossis-3', 1340283214450, 0, NULL, NULL, NULL, NULL),
-(25, 1, 'repo2', 'aa', 'ant-1.5.jar', 2, 1340283204448, 'yossis-2201', 1340283204448,'yossis-3274', 1340283204448, 716139, 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', '503a360ecad98a34b59863c1e6accf71', '503a360ecad98a34b59863c1e6accf71'),
-(26, 1, 'repo2', 'aa/b', 'ant-1.5.jar', 3, 1340283204448, 'yossis-2201', 1340283204448,'yossis-3274', 1340283204448, 716139, 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', '503a360ecad98a34b59863c1e6accf71', '503a360ecad98a34b59863c1e6accf71'),
-(27, 0, 'repo3', '.', '.', 0, 1340283204448, 'admin', 1340283204448,'yossis-3274', 1340283204448, 716139, 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', '503a360ecad98a34b59863c1e6accf71', '503a360ecad98a34b59863c1e6accf71'),
-(28, 0, 'repo3', '.', 'a', 1, 1340283204448, 'admin', 1340283204448,'yossis-3274', 1340283204448, 716139, 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', '503a360ecad98a34b59863c1e6accf71', '503a360ecad98a34b59863c1e6accf71'),
-(29, 0, 'repo3', 'a', 'b', 2, 1340283204448, 'admin', 1340283204448,'yossis-3274', 1340283204448, 716139, 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', '503a360ecad98a34b59863c1e6accf71', '503a360ecad98a34b59863c1e6accf71'),
-(30, 0, 'repo3', 'a/b', 'c', 3, 1340283204448, 'admin', 1340283204448,'yossis-3274', 1340283204448, 716139, 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', '503a360ecad98a34b59863c1e6accf71', '503a360ecad98a34b59863c1e6accf71'),
-(31, 1, 'repo3', 'a/b/c', 'g.txt', 4, 1340283204448, 'admin', 1340283204448,'yossis-3274', 1340283204448, 716139, 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', '503a360ecad98a34b59863c1e6accf71', '503a360ecad98a34b59863c1e6accf71'),
-(32, 1, 'repo3', 'a/B/C', 'f.txt', 4, 1340283204448, 'admin', 1340283204448,'yossis-3274', 1340283204448, 716139, 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', '503a360ecad98a34b59863c1e6accf71', '503a360ecad98a34b59863c1e6accf71'),
-(33, 0, 'repo3', 'a/B', 'C', 4, 1340283204448, 'admin', 1340283204448,'yossis-3274', 1340283204448, 716139, 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', '503a360ecad98a34b59863c1e6accf71', '503a360ecad98a34b59863c1e6accf71'),
-(34, 1, 'repo3', 'B', 'test.txt', 2, 1340283204448, 'admin', 1340283204448,'yossis-3274', 1340283204448, 716139, 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', '503a360ecad98a34b59863c1e6accf71', '503a360ecad98a34b59863c1e6accf71'),
-(35, 0, 'repo1', '.', 'a_1.2', 1, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(36, 0, 'repo1', '.', 'ab1.2', 1, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(37, 0, 'repo1', 'ab1.2', 'tt.txt', 2, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 716139, 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', 'dddd89fc2a043c2479a6de676a2f7179e9eaddac', '503a360ecad98a34b59863c1e6accf71', '503a360ecad98a34b59863c1e6accf71');
-
-INSERT INTO node_props VALUES
-(1, 5, 'build.name', 'ant'),
-(2, 5, 'build.number', '67'),
-(3, 9, 'yossis', 'value1'),
-(4, 9, 'jungle', 'value2'),
-(5, 9, 'trance', 'me'),
-(6, 14, 'empty.val', ''),
-(7, 14, 'null.val', NULL);
-
-INSERT INTO node_meta_infos VALUES
-(5, 1340286103555, 'yossis'),
-(9, 1340286803666, 'yoyo');
-
-INSERT INTO watches VALUES
-(1, 4, 'scott', 1340286203555),
-(2, 4, 'amy', 1340286203666),
-(3, 5, 'scott', 1340286203555),
-(4, 9, 'yossis', 1340286203432),
-(5, 9, 'ariel', 1340286203433),
-(6, 10, 'dodo', 1340286203433),
-(7, 10, 'momo', 1340286203433),
-(8, 11, 'momo', 1340286203433);
-
-INSERT INTO stats VALUES
-(6, 15, 1340283207850, 'yossis');
-
-INSERT INTO indexed_archives VALUES
-('dcab88fc2a043c2479a6de676a2f8179e9ea2167', 6000),
-('bbbb88fc2a043c2479a6de676a2f8179e9eabbbb', 6001);
-
-INSERT INTO archive_paths VALUES
-(8001, 'META-INF'),
-(8002, 'org/apache/tools/ant/filters'),
-(8003, 'org/apache/tools/mail'),
-(8004, '.'),
-(8005, 'another');
-
-INSERT INTO archive_names VALUES
-(9001, 'LICENSE.txt'),
-(9002, 'MANIFEST.MF'),
-(9003, 'BaseFilterReader.class'),
-(9004, 'BaseParamFilterReader.class'),
-(9005, 'MailMessage.class'),
-(9006, 'Test'),
-(9007, 'test.me');
-
-INSERT INTO indexed_archives_entries VALUES
-(6000, 8001, 9001),
-(6000, 8001, 9002),
-(6000, 8002, 9003),
-(6000, 8002, 9004),
-(6000, 8003, 9005),
-(6001, 8004, 9006),
-(6001, 8005, 9007);
-
-INSERT INTO tasks VALUES
-('INDEX', 'repo1:ant/ant/1.5/ant-1.5.jar'),
-('INDEX', 'reponone:test'),
-('MMC', 'this/is/a/test');
\ No newline at end of file
diff --git a/storage/db/src/test/resources/sql/user-group.sql b/storage/db/src/test/resources/sql/user-group.sql
deleted file mode 100644
index b4d3c01..0000000
--- a/storage/db/src/test/resources/sql/user-group.sql
+++ /dev/null
@@ -1,29 +0,0 @@
-# Keep the high id for RTFACT-9568
-UPDATE unique_ids SET current_id = 10000000000 WHERE index_type = 'general';
-
-INSERT INTO users VALUES
-(1, 'u1','apass',NULL,'e at mail.com',NULL,0,1,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
-(2, 'u2','bpass',NULL,'f at mail.com',NULL,1,1,1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
-(3, 'u3',NULL,'','','',1,0,1,'','','',NULL,'',NULL,'','',NULL,NULL),
-(15, 'anonymous',NULL,NULL,NULL, NULL,0,1,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
-(16, 'admin', 'password',NULL,NULL, NULL,1,1,1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
-
-INSERT INTO groups VALUES
-(1, 'g1',NULL,0,NULL,NULL),
-(2, 'g2','is default',1,'default realm','default att'),
-(3, 'g3','no one',0,'artifactory',NULL),
-(15, 'readers','readers',1,'artifactory',NULL);
-
-INSERT INTO users_groups VALUES
-(1,1,NULL),
-(1,2,NULL),
-(2,2,'ldap'),
-(15,2,NULL),
-(15,15,NULL);
-
-INSERT INTO user_props VALUES
-(1,'test.null',NULL),
-(1,'test.dup','A'),
-(2,'test.dup','B'),
-(15,'test.login','http://git/login'),
-(15,'test.logout','http://git/logout');
diff --git a/storage/db/src/test/resources/sql/user_properties.sql b/storage/db/src/test/resources/sql/user_properties.sql
deleted file mode 100644
index 931014e..0000000
--- a/storage/db/src/test/resources/sql/user_properties.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-# start with value bigger than int (RTFACT-9568)
-UPDATE unique_ids SET current_id = 7777777777 WHERE index_type = 'general';
-
-INSERT INTO users VALUES
-(1, 'oferc','masterpass',NULL,'e at mail.com',NULL,0,1,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
-(2, 'yossis', 'weakpass',NULL,NULL, NULL,1,1,1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
diff --git a/storage/db/src/test/resources/testng-db.xml b/storage/db/src/test/resources/testng-db.xml
deleted file mode 100644
index 1c36ef7..0000000
--- a/storage/db/src/test/resources/testng-db.xml
+++ /dev/null
@@ -1,211 +0,0 @@
-<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
-<suite name="DB Tests Suite" thread-count="1" verbose="1" parallel="false">
-    <!--ArtifactoryDBVersionTest should be the first test in order to convert old databases to 3.1.x-->
-    <test name="ArtifactoryDBVersionTest">
-        <classes>
-            <class name="org.artifactory.storage.db.upgrades.versions.ArtifactoryDBVersionTest"/>
-        </classes>
-    </test>
-    <test name="ArtifactoryServersDaoTest">
-        <classes>
-            <class name="org.artifactory.storage.db.ha.itest.dao.ArtifactoryServersDaoTest"/>
-        </classes>
-    </test>
-    <test name="DbPropertiesDaoTest">
-        <classes>
-            <class name="org.artifactory.storage.db.base.itest.dao.DbPropertiesDaoTest"/>
-        </classes>
-    </test>
-    <test name="ArtifactoryServersServiceImplTest">
-        <classes>
-            <class name="org.artifactory.storage.db.ha.itest.service.ArtifactoryServersServiceImplTest"/>
-        </classes>
-    </test>
-    <test name="FileServiceImplTest">
-        <classes>
-            <class name="org.artifactory.storage.db.fs.itest.service.FileServiceImplTest"/>
-        </classes>
-    </test>
-<!--
-    <test name="ConfigurableBinaryProviderManagerTest">
-        <classes>
-            <class name="org.artifactory.storage.db.binstore.itest.service.ConfigurableBinaryProviderManagerTest"/>
-        </classes>
-    </test>
--->
-    <test name="FileServiceRepoSummaryTest">
-        <classes>
-            <class name="org.artifactory.storage.db.fs.itest.service.FileServiceRepoStorageSummaryTest"/>
-        </classes>
-    </test>
-    <test name="NodesDaoTest">
-        <classes>
-            <class name="org.artifactory.storage.db.fs.itest.dao.NodesDaoTest"/>
-        </classes>
-    </test>
-    <test name="BinariesDaoTest">
-        <classes>
-            <class name="org.artifactory.storage.db.binstore.itest.dao.BinariesDaoTest"/>
-        </classes>
-    </test>
-    <test name="PropertiesDaoTest">
-        <classes>
-            <class name="org.artifactory.storage.db.fs.itest.dao.PropertiesDaoTest"/>
-        </classes>
-    </test>
-    <test name="DbPropertiesServiceImplTest">
-        <classes>
-            <class name="org.artifactory.storage.db.fs.itest.service.DbPropertiesServiceImplTest"/>
-        </classes>
-    </test>
-    <test name="WatchesDaoTest">
-        <classes>
-            <class name="org.artifactory.storage.db.fs.itest.dao.WatchesDaoTest"/>
-        </classes>
-    </test>
-    <test name="WatchesServiceImplTest">
-        <classes>
-            <class name="org.artifactory.storage.db.fs.itest.service.WatchesServiceImplTest"/>
-        </classes>
-    </test>
-    <test name="StatsDaoTest">
-        <classes>
-            <class name="org.artifactory.storage.db.fs.itest.dao.StatsDaoTest"/>
-        </classes>
-    </test>
-    <test name="StatsServiceImplTest">
-        <classes>
-            <class name="org.artifactory.storage.db.fs.itest.service.StatsServiceImplTest"/>
-        </classes>
-    </test>
-    <test name="ConfigsDaoTest">
-        <classes>
-            <class name="org.artifactory.storage.db.fs.itest.dao.ConfigsDaoTest"/>
-        </classes>
-    </test>
-    <test name="ConfigsServiceImplTest">
-        <classes>
-            <class name="org.artifactory.storage.db.fs.itest.service.ConfigsServiceImplTest"/>
-        </classes>
-    </test>
-    <test name="ArchiveEntriesDaoTest">
-        <classes>
-            <class name="org.artifactory.storage.db.fs.itest.dao.ArchiveEntriesDaoTest"/>
-        </classes>
-    </test>
-    <test name="ArchiveEntriesImplTest">
-        <classes>
-            <class name="org.artifactory.storage.db.fs.itest.service.ArchiveEntriesServiceImplTest"/>
-        </classes>
-    </test>
-    <test name="TasksDaoTest">
-        <classes>
-            <class name="org.artifactory.storage.db.fs.itest.dao.TasksDaoTest"/>
-        </classes>
-    </test>
-    <test name="TasksServiceImplTest">
-        <classes>
-            <class name="org.artifactory.storage.db.fs.itest.service.TasksServiceImplTest"/>
-        </classes>
-    </test>
-    <test name="UserGroupDaoTest">
-        <classes>
-            <class name="org.artifactory.storage.db.security.itest.dao.UserGroupsDaoTest"/>
-        </classes>
-    </test>
-    <test name="AclsDaoTest">
-        <classes>
-            <class name="org.artifactory.storage.db.security.itest.dao.AclsDaoTest"/>
-        </classes>
-    </test>
-    <test name="FullDeleteAclsDaoTest">
-        <classes>
-            <class name="org.artifactory.storage.db.security.itest.dao.FullDeleteAclsDaoTest"/>
-        </classes>
-    </test>
-    <test name="FullDeleteUserGroupsDaoTest">
-        <classes>
-            <class name="org.artifactory.storage.db.security.itest.dao.FullDeleteUserGroupsDaoTest"/>
-        </classes>
-    </test>
-    <test name="UserGroupServiceTest">
-        <classes>
-            <class name="org.artifactory.storage.db.security.itest.service.UserGroupServiceImplTest"/>
-        </classes>
-    </test>
-    <test name="ItemTreeTest">
-        <classes>
-            <class name="org.artifactory.storage.db.fs.itest.ItemTreeTest"/>
-        </classes>
-    </test>
-    <test name="BuildsDaoTest">
-        <classes>
-            <class name="org.artifactory.storage.db.build.itest.dao.BuildsDaoTest"/>
-        </classes>
-    </test>
-    <test name="BuildModulesDaoTest">
-        <classes>
-            <class name="org.artifactory.storage.db.build.itest.dao.BuildModulesDaoTest"/>
-        </classes>
-    </test>
-    <test name="BuildArtifactsDaoTest">
-        <classes>
-            <class name="org.artifactory.storage.db.build.itest.dao.BuildArtifactsDaoTest"/>
-        </classes>
-    </test>
-    <test name="BuildDependenciesDaoTest">
-        <classes>
-            <class name="org.artifactory.storage.db.build.itest.dao.BuildDependenciesDaoTest"/>
-        </classes>
-    </test>
-    <test name="BuildStoreServiceImplTest">
-        <classes>
-            <class name="org.artifactory.storage.db.build.itest.service.BuildStoreServiceImplTest"/>
-        </classes>
-    </test>
-    <test name="BinaryStoreImplFileProviderTest">
-        <classes>
-            <class name="org.artifactory.storage.db.binstore.itest.service.BinaryServiceFileProviderTest"/>
-        </classes>
-    </test>
-    <test name="BinaryStoreImplFullPathFileProviderTest">
-        <classes>
-            <class name="org.artifactory.storage.db.binstore.itest.service.BinaryServiceFullPathFileProviderTest"/>
-        </classes>
-    </test>
-    <test name="BinaryStoreImplFullDbProviderTest">
-        <classes>
-            <class name="org.artifactory.storage.db.binstore.itest.service.BinaryServiceFullDbProviderTest"/>
-        </classes>
-    </test>
-    <test name="BinaryStoreImplCachedFSProviderTest">
-        <classes>
-            <class name="org.artifactory.storage.db.binstore.itest.service.BinaryServiceCachedFSProviderTest"/>
-        </classes>
-    </test>
-    <test name="BinaryStoreExternalProviderPassThroughTest">
-        <classes>
-            <class name="org.artifactory.storage.db.binstore.itest.service.BinaryStoreExternalProviderPassThroughTest"/>
-        </classes>
-    </test>
-    <test name="BinaryStoreExternalProviderCopyFirstTest">
-        <classes>
-            <class name="org.artifactory.storage.db.binstore.itest.service.BinaryStoreExternalProviderCopyFirstTest"/>
-        </classes>
-    </test>
-    <test name="BinaryStoreExternalProviderCopyOnReadTest">
-        <classes>
-            <class name="org.artifactory.storage.db.binstore.itest.service.BinaryStoreExternalProviderCopyOnReadTest"/>
-        </classes>
-    </test>
-    <test name="BinaryStoreExternalProviderMoveTest">
-        <classes>
-            <class name="org.artifactory.storage.db.binstore.itest.service.BinaryStoreExternalProviderMoveTest"/>
-        </classes>
-    </test>
-    <test name="FileServiceSpecialCharsTest">
-        <classes>
-            <class name="org.artifactory.storage.db.fs.itest.service.FileServiceSpecialCharsTest"/>
-        </classes>
-    </test>
-</suite>
\ No newline at end of file
diff --git a/storage/db/src/test/resources/upgrades/v300/data/acls.sql b/storage/db/src/test/resources/upgrades/v300/data/acls.sql
deleted file mode 100644
index f0a661b..0000000
--- a/storage/db/src/test/resources/upgrades/v300/data/acls.sql
+++ /dev/null
@@ -1,26 +0,0 @@
-UPDATE unique_ids SET current_id = 10000 WHERE index_type = 'general';
-
-INSERT INTO permission_targets VALUES
-(1, 'perm-target-1',NULL,NULL),
-(2, 'perm-target-2','com/**,org/**',NULL),
-(3, 'perm-target-3',NULL,'apache/**'),
-(4, 'perm-target-4','jfrog/**,**/art-*.xml','codehaus/**');
-
-INSERT INTO permission_target_repos VALUES
-(1, 'ANY'),
-(2, 'ANY LOCAL'),
-(3, 'ANY REMOTE'),
-(3, 'libs-release-local'),
-(3, 'libs-snapshot-local');
-
-INSERT INTO acls VALUES
-(10,1,NULL,NULL),
-(20,2,NULL,NULL),
-(30,3,NULL,NULL);
-
-INSERT INTO aces VALUES
-(1,10,1,1,NULL),
-(2,10,2,NULL,1),
-(3,10,3,2,NULL),
-(4,20,3,1,NULL),
-(5,20,3,NULL,1);
diff --git a/storage/db/src/test/resources/upgrades/v300/data/binaries.sql b/storage/db/src/test/resources/upgrades/v300/data/binaries.sql
deleted file mode 100644
index 082f5ac..0000000
--- a/storage/db/src/test/resources/upgrades/v300/data/binaries.sql
+++ /dev/null
@@ -1,16 +0,0 @@
-INSERT INTO binaries VALUES
-('b60d121b438a380c343d5ec3c2037564b82ffef3', '302a360ecad98a34b59863c1e65bcf71', 3),
-('f0d381ab0e057d4f835d639f6330a7c3e81eb6af', '902a360ecad98a34b59863c1e65bcf71', 2725),
-('74239116da1def240fe1d366eb535513efc1c40b', '402a360ecad98a34b59863c1e65bcf71', 33670080),
-('356a192b7913b04c54574d18c28d46e6395428ab', '502a360ecad98a34b59863c1e65bcf71', 1),
-('da39a3ee5e6b4b0d3255bfef95601890afd80709', '602a360ecad98a34b59863c1e65bcf71', 0);
-
-INSERT INTO nodes VALUES
-(1, 0, 'repo1', '.', '.', 0, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(8, 0, 'repo1', '.', 'org', 1, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(9, 0, 'repo1', 'org', 'yossis', 2, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(10, 0, 'repo1', 'org/yossis', 'tools', 3, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(11, 1, 'repo1', 'org/yossis/tools', 'test.bin', 4, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'b60d121b438a380c343d5ec3c2037564b82ffef3', 'acab88fc2a043c2479a6de676a2f8179e9ea2167', '302a360ecad98a34b59863c1e65bcf71', '302a360ecad98a34b59863c1e65bcf71'),
-(12, 1, 'repo1', 'org/yossis/tools', 'file2.bin', 4, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'b60d121b438a380c343d5ec3c2037564b82ffef3', 'bcab88fc2a043c2479a6de676a2f8179e9ea2167', '302a360ecad98a34b59863c1e65bcf71', '402a360ecad98a34b59863c1e65bcf71'),
-(13, 1, 'repo1', 'org/yossis/tools', 'file3.bin', 4, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'f0d381ab0e057d4f835d639f6330a7c3e81eb6af', 'ccab88fc2a043c2479a6de676a2f8179e9ea2167', '902a360ecad98a34b59863c1e65bcf71', '502a360ecad98a34b59863c1e65bcf71'),
-(14, 0, 'repo1', 'org/yossis', 'empty', 3, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL);
diff --git a/storage/db/src/test/resources/upgrades/v300/data/build-modules.sql b/storage/db/src/test/resources/upgrades/v300/data/build-modules.sql
deleted file mode 100644
index 9895e21..0000000
--- a/storage/db/src/test/resources/upgrades/v300/data/build-modules.sql
+++ /dev/null
@@ -1,29 +0,0 @@
-UPDATE unique_ids SET current_id = 10000 WHERE index_type = 'general';
-
-INSERT INTO build_modules VALUES
-(1, 1, 'ba:moda1'),
-(2, 2, 'bb:modb1'),
-(3, 2, 'bb:modb2'),
-(4, 3, 'ba:moda1'),
-(5, 3, 'ba:moda2'),
-(6, 4, 'bb:modb1'),
-(7, 4, 'bb:modb2'),
-(8, 5, 'ba:moda1'),
-(9, 5, 'ba:moda2'),
-(10, 5, 'ba:moda3');
-
-INSERT INTO module_props VALUES
-(1, 1, 'art-name', 'moda1'),
-(2, 1, 'status', 'bad'),
-(3, 1, 'dummy', 'dumm'),
-(4, 2, 'art-name', 'modb1'),
-(5, 2, 'status', 'not-too-bad'),
-(6, 3, 'art-name', 'modb2'),
-(7, 3, 'status', 'quite-good'),
-(8, 8, 'art-name', 'moda1'),
-(9, 8, 'status-moda1', 'good'),
-(10, 9, 'art-name', 'moda2'),
-(11, 9, 'status-moda2', 'good'),
-(12, 10, 'art-name', 'moda3'),
-(13, 10, 'status-moda3', 'good');
-
diff --git a/storage/db/src/test/resources/upgrades/v300/data/builds.sql b/storage/db/src/test/resources/upgrades/v300/data/builds.sql
deleted file mode 100644
index d125f93..0000000
--- a/storage/db/src/test/resources/upgrades/v300/data/builds.sql
+++ /dev/null
@@ -1,26 +0,0 @@
-UPDATE unique_ids SET current_id = 10000 WHERE index_type = 'general';
-
-INSERT INTO builds VALUES
-(1, 'ba', '1', 1349000000000, NULL, 1350000000000, 'me', 1350000000001, 'not-me'),
-(2, 'bb', '1', 1349001000000, 'http://myserver/jenkins/bb/1', 1350001000000, 'me', NULL, NULL),
-(3, 'ba', '2', 1349002000000, NULL, 1350002000000, 'me', NULL, NULL),
-(4, 'bb', '2', 1349003000000, 'http://myserver/jenkins/bb/2', 1350003000000, 'me', NULL, NULL),
-(5, 'ba', '3', 1349004000000, NULL, 1350004000000, 'me', NULL, NULL);
-
-INSERT INTO build_props VALUES
-(1, 1, 'start', '0'),
-(2, 1, 'status', 'bad'),
-(3, 2, 'start', '1'),
-(4, 2, 'status', 'not-too-bad'),
-(5, 5, 'start', '4'),
-(6, 5, 'status', 'good');
-
--- Inserting date in oposite order to check re-ordering
-INSERT INTO build_promotions VALUES
-(3, 1350012000000, 'me', 'dead', NULL, 'bad stuff', NULL),
-(5, 1350034000000, 'promoter', 'Released', 'public', 'Full release', 'rel'),
-(5, 1350024000000, NULL, 'staging', NULL, NULL, 'jenkins'),
-(4, 1350003000000, NULL, 'staging', NULL, NULL, NULL),
-(4, 1350023000000, 'tester', 'rollback', 'lost-local', 'Refused by QA', NULL),
-(4, 1350013000000, 'promoter', 'promoted', 'qa-local', 'sending to QA', 'me');
-
diff --git a/storage/db/src/test/resources/upgrades/v300/data/nodes-for-service.sql b/storage/db/src/test/resources/upgrades/v300/data/nodes-for-service.sql
deleted file mode 100644
index ee03792..0000000
--- a/storage/db/src/test/resources/upgrades/v300/data/nodes-for-service.sql
+++ /dev/null
@@ -1,83 +0,0 @@
-UPDATE unique_ids SET current_id = 10000 WHERE index_type = 'general';
-
-INSERT INTO binaries VALUES
-('dcab88fc2a043c2479a6de676a2f8179e9ea2167', '902a360ecad98a34b59863c1e65bcf71', 3),
-('ecab88fc2a043c2479a6de676a2f8179e9ea2167', '002a360ecad98a34b59863c1e65bcf71', 42),
-('dddd88fc2a043c2479a6de676a2f7179e9eaddac', '502a360ecad98a34b59863c1e6accf71', 89),
-('cccc88fc2a043c2479a6de676a2f8179e9eacccc', '777a360ecad98a34b59863c1e6accf71', 789);
-
-INSERT INTO nodes VALUES
-(1, 0, 'repo1', '.', '.', 0, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(2, 0, 'repo1', '.', 'ant', 1, 1340283204448, 'yossis-1', 1340283205448,'yossis-2', 1340283205448, 0, NULL, NULL, NULL, NULL),
-(3, 0, 'repo1', 'ant', 'ant', 2, 1340283204450, 'yossis-1', 1340283204450,'yossis-3', 1340283214450, 0, NULL, NULL, NULL, NULL),
-(4, 0, 'repo1', 'ant/ant', '1.5', 3, 1340283204448, 'yossis-9614', 1340283204448,'yossis-5612', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(5, 1, 'repo1', 'ant/ant/1.5', 'ant-1.5.jar', 4, 1340283204448, 'yossis-2201', 1340283204448,'yossis-3274', 1340283204448, 716139, 'dcab88fc2a043c2479a6de676a2f8179e9ea2167', 'dcab88fc2a043c2479a6de676a2f8179e9ea2167', '902a360ecad98a34b59863c1e65bcf71', '902a360ecad98a34b59863c1e65bcf71'),
-(6, 0, 'repo1', '.', 'org', 1, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(7, 0, 'repo1', 'org', 'yossis', 2, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(500, 0, 'repo2', '.', '.', 0, 1340283204448, 'yossis', 1340283204448, 'yossis', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(501, 0, 'repo2', '.', 'org', 1, 1340283204448, 'yossis-1', 1340283204448, 'yossis', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(502, 0, 'repo2', 'org', 'jfrog', 2, 1340283204448, 'yossis', 1340283204448, 'yossis', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(503, 0, 'repo2', 'org/jfrog', 'test', 3, 1340283204448, 'yossis', 1340283204448, 'yossis', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(504, 1, 'repo2', 'org/jfrog/test', 'test.jar', 4, 1340283204448, 'yossis', 1340283204448, 'yossis', 1340283204448, 716139, 'dcab88fc2a043c2479a6de676a2f8179e9ea2167', 'dcab88fc2a043c2479a6de676a2f8179e9ea2167', '902a360ecad98a34b59863c1e65bcf71', '902a360ecad98a34b59863c1e65bcf71'),
-(505, 1, 'repo2', 'org/jfrog/test', 'test2.jar', 4, 1340283204448, 'yossis', 1340283204448, 'yossis', 1340283204448, 321, 'ecab88fc2a043c2479a6de676a2f8179e9ea2167', 'ecab88fc2a043c2479a6de676a2f8179e9ea2167', '002a360ecad98a34b59863c1e65bcf71', '002a360ecad98a34b59863c1e65bcf71'),
-(600, 1, 'repo-copy', 'org/shayy/trustme', 'trustme.jar', 4, 1340283204447, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'dddd88fc2a043c2479a6de676a2f7179e9eaddac', 'NO_ORIG', '502a360ecad98a34b59863c1e6accf71', 'NO_ORIG'),
-(601, 1, 'repo-copy', 'org/shayy/badsha1', 'badsha1.jar', 4, 1340283204447, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'dddd88fc2a043c2479a6de676a2f7179e9eaddac', 'dddd88fc2a043c2479a6de676a2f7179e9eadd34', '502a360ecad98a34b59863c1e65bcf32', '502a360ecad98a34b59863c1e65bcf32'),
-(602, 1, 'repo-copy', 'org/shayy/badmd5', 'badmd5.jar', 4, 1340283204447, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'dddd88fc2a043c2479a6de676a2f7179e9eaddac', 'NO_ORIG', '502a360ecad98a34b59863c1e6accf71', '502a360ecad98a34b59863c1e65bcf32');
-
-INSERT INTO node_props VALUES
-(100, 5, 'build.name', 'ant'),
-(101, 5, 'build.number', '67'),
-(102, 7, 'yossis', 'value1'),
-(103, 7, 'yossis', 'value2');
-
-INSERT INTO node_meta_infos VALUES
-(5, 1340286203444, 'yossis'),
-(7, 1340286203121, 'yoyo');
-
-INSERT INTO watches VALUES
-(1, 4, 'scott', 1340286203555),
-(2, 4, 'amy', 1340286203666),
-(3, 5, 'scott', 1340286203555),
-(4, 7, 'yossis', 1340286203432),
-(5, 7, 'ariel', 1340286203433),
-(6, 502, 'yossis', 1340286203433),
-(7, 503, 'yossis', 1340286203433),
-(8, 504, 'yossis', 1340286203433),
-(9, 4, 'yoyo', 1340286203932),
-(10, 4, 'yoyo', 1340282203433),
-(11, 4, 'yoyo', 1340285203433);
-
-INSERT INTO stats VALUES
-(5, 2, 1340283207850, 'ariels');
-
-INSERT INTO indexed_archives VALUES
-('dcab88fc2a043c2479a6de676a2f8179e9ea2167', 6001),
-('cccc88fc2a043c2479a6de676a2f8179e9eacccc', 6002);
-
-INSERT INTO archive_paths VALUES
-(8001, 'META-INF'),
-(8002, 'org/apache/tools/ant/filters'),
-(8003, 'org/apache/tools/mail'),
-(8004, '.'),
-(8005, 'another');
-
-INSERT INTO archive_names VALUES
-(9001, 'LICENSE.txt'),
-(9002, 'MANIFEST.MF'),
-(9003, 'BaseFilterReader.class'),
-(9004, 'BaseParamFilterReader.class'),
-(9005, 'MailMessage.class'),
-(9006, 'Test'),
-(9007, 'test.me');
-
-INSERT INTO indexed_archives_entries VALUES
-(6001, 8001, 9001),
-(6001, 8001, 9002),
-(6001, 8002, 9003),
-(6002, 8001, 9002),
-(6002, 8004, 9006),
-(6002, 8005, 9007);
-
-INSERT INTO tasks VALUES
-('INDEX', 'repo1:ant/ant/1.5/ant-1.5.jar'),
-('INDEX', 'reponone:ant/ant/1.5/ant-1.5.jar');
\ No newline at end of file
diff --git a/storage/db/src/test/resources/upgrades/v300/data/nodes.sql b/storage/db/src/test/resources/upgrades/v300/data/nodes.sql
deleted file mode 100644
index fa01808..0000000
--- a/storage/db/src/test/resources/upgrades/v300/data/nodes.sql
+++ /dev/null
@@ -1,87 +0,0 @@
-UPDATE unique_ids SET current_id = 10000 WHERE index_type = 'general';
-
-INSERT INTO binaries VALUES
-('dcab88fc2a043c2479a6de676a2f8179e9ea2167', '902a360ecad98a34b59863c1e65bcf71', 3),
-('acab88fc2a043c2479a6de676a2f8179e9ea2167', '302a360ecad98a34b59863c1e65bcf71', 78),
-('bbbb88fc2a043c2479a6de676a2f8179e9eabbbb', '402a360ecad98a34b59863c1e65bcf71', 33),
-('dddd88fc2a043c2479a6de676a2f8179e9eadddd', '502a360ecad98a34b59863c1e65bcf71', 333),
-('dddd88fc2a043c2479a6de676a2f7179e9eaddac', '502a360ecad98a34b59863c1e6accf71', 500);
-
-INSERT INTO nodes VALUES
-(1, 0, 'repo1', '.', '.', 0, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(2, 0, 'repo1', '.', 'ant', 1, 1340283204448, 'yossis-1', 1340283205448,'yossis-2', 1340283205448, 0, NULL, NULL, NULL, NULL),
-(3, 0, 'repo1', 'ant', 'ant', 2, 1340283204450, 'yossis-1', 1340283204450,'yossis-3', 1340283214450, 0, NULL, NULL, NULL, NULL),
-(4, 0, 'repo1', 'ant/ant', '1.5', 3, 1340283204448, 'yossis-9614', 1340283204448,'yossis-5612', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(5, 1, 'repo1', 'ant/ant/1.5', 'ant-1.5.jar', 4, 1340283204448, 'yossis-2201', 1340283204448,'yossis-3274', 1340283204448, 716139, 'dcab88fc2a043c2479a6de676a2f8179e9ea2167', 'dcab88fc2a043c2479a6de676a2f8179e9ea2167', '902a360ecad98a34b59863c1e65bcf71', '902a360ecad98a34b59863c1e65bcf71'),
-(6, 0, 'repo1', '.', 'ant-launcher', 1, 1340223204457, 'yossis-2', 1340283204448,'yossis-2', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(7, 0, 'repo1', 'ant-launcher', 'ant-launcher', 2, 1340223204457, 'yossis-2', 1340283204448,'yossis-2', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(8, 0, 'repo1', '.', 'org', 1, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(9, 0, 'repo1', 'org', 'yossis', 2, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(10, 0, 'repo1', 'org/yossis', 'tools', 3, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(11, 1, 'repo1', 'org/yossis/tools', 'test.bin', 4, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'acab88fc2a043c2479a6de676a2f8179e9ea2167', 'acab88fc2a043c2479a6de676a2f8179e9ea2167', '302a360ecad98a34b59863c1e65bcf71', '302a360ecad98a34b59863c1e65bcf71'),
-(12, 1, 'repo1', 'org/yossis/tools', 'file2.bin', 4, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'bbbb88fc2a043c2479a6de676a2f8179e9eabbbb', 'bcab88fc2a043c2479a6de676a2f8179e9ea2167', '402a360ecad98a34b59863c1e65bcf71', '402a360ecad98a34b59863c1e65bcf71'),
-(13, 1, 'repo1', 'org/yossis/tools', 'file3.bin', 4, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'dddd88fc2a043c2479a6de676a2f8179e9eadddd', 'ccab88fc2a043c2479a6de676a2f8179e9ea2167', '502a360ecad98a34b59863c1e65bcf71', '502a360ecad98a34b59863c1e65bcf71'),
-(15, 1, 'repo-copy', 'org/yossis/tools', 'file3.bin', 4, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'dddd88fc2a043c2479a6de676a2f8179e9eadddd', 'ccab88fc2a043c2479a6de676a2f8179e9ea2167', '502a360ecad98a34b59863c1e65bcf71', '502a360ecad98a34b59863c1e65bcf71'),
-(14, 0, 'repo1', 'org/yossis', 'empty', 3, 1340283204448, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 0, NULL, NULL, NULL, NULL),
-(16, 1, 'repo-copy', 'org/shayy/trustme', 'trustme.jar', 4, 1340283204447, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'dddd88fc2a043c2479a6de676a2f7179e9eaddac', 'NO_ORIG', '502a360ecad98a34b59863c1e6accf71', 'NO_ORIG'),
-(17, 1, 'repo-copy', 'org/shayy/badmd5', 'badmd5.jar', 4, 1340283204447, 'yossis-1', 1340283204448, 'yossis-1', 1340283204448, 43434, 'dddd88fc2a043c2479a6de676a2f7179e9eaddac', 'NO_ORIG', '502a360ecad98a34b59863c1e6accf71', '502a360ecad98a34b59863c1e65bcf32');
-
-INSERT INTO node_props VALUES
-(1, 5, 'build.name', 'ant'),
-(2, 5, 'build.number', '67'),
-(3, 9, 'yossis', 'value1'),
-(4, 9, 'jungle', 'value2'),
-(5, 9, 'trance', 'me'),
-(6, 14, 'empty.val', ''),
-(7, 14, 'null.val', NULL);
-
-INSERT INTO node_meta_infos VALUES
-(5, 1340286103555, 'yossis'),
-(9, 1340286803666, 'yoyo');
-
-INSERT INTO watches VALUES
-(1, 4, 'scott', 1340286203555),
-(2, 4, 'amy', 1340286203666),
-(3, 5, 'scott', 1340286203555),
-(4, 9, 'yossis', 1340286203432),
-(5, 9, 'ariel', 1340286203433),
-(6, 10, 'dodo', 1340286203433),
-(7, 10, 'momo', 1340286203433),
-(8, 11, 'momo', 1340286203433);
-
-INSERT INTO stats VALUES
-(6, 15, 1340283207850, 'yossis');
-
-INSERT INTO indexed_archives VALUES
-('dcab88fc2a043c2479a6de676a2f8179e9ea2167', 6000),
-('bbbb88fc2a043c2479a6de676a2f8179e9eabbbb', 6001);
-
-INSERT INTO archive_paths VALUES
-(8001, 'META-INF'),
-(8002, 'org/apache/tools/ant/filters'),
-(8003, 'org/apache/tools/mail'),
-(8004, '.'),
-(8005, 'another');
-
-INSERT INTO archive_names VALUES
-(9001, 'LICENSE.txt'),
-(9002, 'MANIFEST.MF'),
-(9003, 'BaseFilterReader.class'),
-(9004, 'BaseParamFilterReader.class'),
-(9005, 'MailMessage.class'),
-(9006, 'Test'),
-(9007, 'test.me');
-
-INSERT INTO indexed_archives_entries VALUES
-(6000, 8001, 9001),
-(6000, 8001, 9002),
-(6000, 8002, 9003),
-(6000, 8002, 9004),
-(6000, 8003, 9005),
-(6001, 8004, 9006),
-(6001, 8005, 9007);
-
-INSERT INTO tasks VALUES
-('INDEX', 'repo1:ant/ant/1.5/ant-1.5.jar'),
-('INDEX', 'reponone:test'),
-('MMC', 'this/is/a/test');
\ No newline at end of file
diff --git a/storage/db/src/test/resources/upgrades/v300/data/user-group.sql b/storage/db/src/test/resources/upgrades/v300/data/user-group.sql
deleted file mode 100644
index d0c0ea6..0000000
--- a/storage/db/src/test/resources/upgrades/v300/data/user-group.sql
+++ /dev/null
@@ -1,22 +0,0 @@
-UPDATE unique_ids SET current_id = 10000 WHERE index_type = 'general';
-
-INSERT INTO users VALUES
-(1, 'u1','apass',NULL,'e at mail.com',NULL,0,1,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
-(2, 'u2','bpass',NULL,'f at mail.com',NULL,1,1,1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
-(3, 'u3',NULL,'','','',1,0,1,'','','',NULL,'',NULL,'',''),
-(15, 'anonymous',NULL,NULL,NULL, NULL,0,1,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
-(16, 'admin', 'password',NULL,NULL, NULL,1,1,1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
-
-INSERT INTO groups VALUES
-(1, 'g1',NULL,0,NULL,NULL),
-(2, 'g2','is default',1,'default realm','default att'),
-(3, 'g3','no one',0,'artifactory',NULL),
-(15, 'readers','readers',1,'artifactory',NULL);
-
-INSERT INTO users_groups VALUES
-(1,1,NULL),
-(1,2,NULL),
-(2,2,'ldap'),
-(15,2,NULL),
-(15,15,NULL);
-
diff --git a/storage/db/src/test/resources/upgrades/v300/ddl/derby/derby.sql b/storage/db/src/test/resources/upgrades/v300/ddl/derby/derby.sql
deleted file mode 100644
index d4f7538..0000000
--- a/storage/db/src/test/resources/upgrades/v300/ddl/derby/derby.sql
+++ /dev/null
@@ -1,306 +0,0 @@
-CREATE TABLE unique_ids (
-  index_type VARCHAR(32) NOT NULL,
-  current_id BIGINT      NOT NULL,
-  CONSTRAINT unique_ids_pk PRIMARY KEY (index_type)
-);
-
-CREATE TABLE binaries (
-  sha1       CHAR(40) NOT NULL,
-  md5        CHAR(32) NOT NULL,
-  bin_length BIGINT   NOT NULL,
-  CONSTRAINT binaries_pk PRIMARY KEY (sha1)
-);
-CREATE UNIQUE INDEX binaries_md5_idx ON binaries (md5);
-
-CREATE TABLE binary_blobs (
-  sha1 CHAR(40) NOT NULL,
-  data BLOB,
-  CONSTRAINT binary_blobs_pk PRIMARY KEY (sha1)
-);
-
-CREATE TABLE nodes (
-  node_id       BIGINT        NOT NULL,
-  node_type     SMALLINT      NOT NULL,
-  repo          VARCHAR(64)   NOT NULL,
-  node_path     VARCHAR(1024) NOT NULL,
-  node_name     VARCHAR(255)  NOT NULL,
-  depth         SMALLINT      NOT NULL,
-  created       BIGINT        NOT NULL,
-  created_by    VARCHAR(64),
-  modified      BIGINT        NOT NULL,
-  modified_by   VARCHAR(64),
-  updated       BIGINT,
-  bin_length    BIGINT,
-  sha1_actual   CHAR(40),
-  sha1_original VARCHAR(1024),
-  md5_actual    CHAR(32),
-  md5_original  VARCHAR(1024),
-  CONSTRAINT nodes_pk PRIMARY KEY (node_id),
-  CONSTRAINT nodes_binaries_fk FOREIGN KEY (sha1_actual) REFERENCES binaries (sha1)
-);
-CREATE UNIQUE INDEX nodes_repo_path_name_idx ON nodes (repo, node_path, node_name);
-CREATE INDEX nodes_node_path_idx ON nodes (node_path);
-CREATE INDEX nodes_node_name_idx ON nodes (node_name);
-CREATE INDEX nodes_sha1_actual_idx ON nodes (sha1_actual);
-CREATE INDEX nodes_md5_actual_idx ON nodes (md5_actual);
-
-CREATE TABLE node_props (
-  prop_id    BIGINT NOT NULL,
-  node_id    BIGINT NOT NULL,
-  prop_key   VARCHAR(255),
-  prop_value VARCHAR(2048),
-  CONSTRAINT node_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT node_props_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-CREATE INDEX node_props_node_id_idx ON node_props (node_id);
-CREATE INDEX node_props_prop_key_idx ON node_props (prop_key);
-CREATE INDEX node_props_prop_value_idx ON node_props (prop_value);
-
-CREATE TABLE node_meta_infos (
-  node_id           BIGINT NOT NULL,
-  props_modified    BIGINT,
-  props_modified_by VARCHAR(64),
-  CONSTRAINT node_meta_infos_pk PRIMARY KEY (node_id),
-  CONSTRAINT node_meta_infos_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-
-CREATE TABLE watches (
-  watch_id BIGINT      NOT NULL,
-  node_id  BIGINT      NOT NULL,
-  username VARCHAR(64) NOT NULL,
-  since    BIGINT      NOT NULL,
-  CONSTRAINT watches_pk PRIMARY KEY (watch_id),
-  CONSTRAINT watches_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-CREATE INDEX watches_node_id_idx ON watches (node_id);
-
-CREATE TABLE stats (
-  node_id            BIGINT NOT NULL,
-  download_count     BIGINT,
-  last_downloaded    BIGINT,
-  last_downloaded_by VARCHAR(64),
-  CONSTRAINT stats_pk PRIMARY KEY (node_id),
-  CONSTRAINT stats_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-
-CREATE TABLE indexed_archives (
-  archive_sha1        CHAR(40) NOT NULL,
-  indexed_archives_id BIGINT   NOT NULL,
-  CONSTRAINT indexed_archives_pk PRIMARY KEY (archive_sha1),
-  CONSTRAINT indexed_archives_id_uq UNIQUE (indexed_archives_id),
-  CONSTRAINT indexed_archives_binaries_fk FOREIGN KEY (archive_sha1) REFERENCES binaries (sha1)
-);
-
-CREATE TABLE archive_paths (
-  path_id    BIGINT NOT NULL,
-  entry_path VARCHAR(1024),
-  CONSTRAINT archive_paths_pk PRIMARY KEY (path_id)
-);
-CREATE UNIQUE INDEX archive_paths_path_idx ON archive_paths (entry_path);
-
-CREATE TABLE archive_names (
-  name_id    BIGINT NOT NULL,
-  entry_name VARCHAR(255),
-  CONSTRAINT archive_names_pk PRIMARY KEY (name_id)
-);
-CREATE UNIQUE INDEX archive_names_name_idx ON archive_names (entry_name);
-
-CREATE TABLE indexed_archives_entries (
-  indexed_archives_id BIGINT NOT NULL,
-  entry_path_id       BIGINT NOT NULL,
-  entry_name_id       BIGINT NOT NULL,
-  CONSTRAINT indexed_archives_entries_pk PRIMARY KEY (indexed_archives_id, entry_path_id, entry_name_id),
-  CONSTRAINT indexed_archives_id_fk FOREIGN KEY (indexed_archives_id) REFERENCES indexed_archives (indexed_archives_id),
-  CONSTRAINT entry_path_id_fk FOREIGN KEY (entry_path_id) REFERENCES archive_paths (path_id),
-  CONSTRAINT entry_name_id_fk FOREIGN KEY (entry_name_id) REFERENCES archive_names (name_id)
-);
-CREATE INDEX indexed_entries_path_idx ON indexed_archives_entries (entry_path_id);
-CREATE INDEX indexed_entries_name_idx ON indexed_archives_entries (entry_name_id);
-
-CREATE TABLE tasks (
-  task_type    VARCHAR(32)   NOT NULL,
-  task_context VARCHAR(1024) NOT NULL
-  -- CONSTRAINT pk_tasks PRIMARY KEY (task_type, task_context)
-);
-CREATE INDEX tasks_type_context_idx ON tasks (task_type, task_context);
-
-CREATE TABLE configs (
-  config_name VARCHAR(255) NOT NULL,
-  data        BLOB         NOT NULL,
-  CONSTRAINT configs_pk PRIMARY KEY (config_name)
-);
-
-CREATE TABLE users (
-  user_id           BIGINT      NOT NULL,
-  username          VARCHAR(64) NOT NULL,
-  password          VARCHAR(128),
-  salt              VARCHAR(128),
-  email             VARCHAR(128),
-  gen_password_key  VARCHAR(128),
-  admin             SMALLINT,
-  enabled           SMALLINT,
-  updatable_profile SMALLINT,
-  realm             VARCHAR(255),
-  private_key       VARCHAR(512),
-  public_key        VARCHAR(255),
-  last_login_time   BIGINT,
-  last_login_ip     VARCHAR(42),
-  last_access_time  BIGINT,
-  last_access_ip    VARCHAR(42),
-  bintray_auth      VARCHAR(512),
-  CONSTRAINT users_pk PRIMARY KEY (user_id)
-);
-CREATE UNIQUE INDEX users_username_idx ON users (username);
-
-CREATE TABLE groups (
-  group_id         BIGINT      NOT NULL,
-  group_name       VARCHAR(64) NOT NULL,
-  description      VARCHAR(1024),
-  default_new_user SMALLINT,
-  realm            VARCHAR(255),
-  realm_attributes VARCHAR(512),
-  CONSTRAINT groups_pk PRIMARY KEY (group_id)
-);
-CREATE UNIQUE INDEX groups_group_name_idx ON groups (group_name);
-
-CREATE TABLE users_groups (
-  user_id  BIGINT NOT NULL,
-  group_id BIGINT NOT NULL,
-  realm    VARCHAR(255),
-  CONSTRAINT users_groups_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id),
-  CONSTRAINT users_groups_groups_fk FOREIGN KEY (group_id) REFERENCES groups (group_id)
-);
-CREATE UNIQUE INDEX users_groups_idx ON users_groups (user_id, group_id);
-
-CREATE TABLE permission_targets (
-  perm_target_id   BIGINT      NOT NULL,
-  perm_target_name VARCHAR(64) NOT NULL,
-  includes         VARCHAR(1024),
-  excludes         VARCHAR(1024),
-  CONSTRAINT permission_targets_pk PRIMARY KEY (perm_target_id)
-);
-CREATE UNIQUE INDEX permission_targets_name_idx ON permission_targets (perm_target_name);
-
-CREATE TABLE permission_target_repos (
-  perm_target_id BIGINT      NOT NULL,
-  repo_key       VARCHAR(64) NOT NULL,
-  CONSTRAINT permission_target_repos_fk FOREIGN KEY (perm_target_id) REFERENCES permission_targets (perm_target_id)
-);
-
-CREATE TABLE acls (
-  acl_id         BIGINT NOT NULL,
-  perm_target_id BIGINT,
-  modified       BIGINT,
-  modified_by    VARCHAR(64),
-  CONSTRAINT acls_pk PRIMARY KEY (acl_id),
-  CONSTRAINT acls_permission_targets_fk FOREIGN KEY (perm_target_id) REFERENCES permission_targets (perm_target_id)
-);
-CREATE INDEX acls_perm_target_id_idx ON acls (perm_target_id);
-
-CREATE TABLE aces (
-  ace_id   BIGINT   NOT NULL,
-  acl_id   BIGINT   NOT NULL,
-  mask     SMALLINT NOT NULL,
-  user_id  BIGINT,
-  group_id BIGINT,
-  CONSTRAINT aces_pk PRIMARY KEY (ace_id),
-  CONSTRAINT aces_acls_fk FOREIGN KEY (acl_id) REFERENCES acls (acl_id),
-  CONSTRAINT aces_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id),
-  CONSTRAINT aces_groups_fk FOREIGN KEY (group_id) REFERENCES groups (group_id)
-);
-
-CREATE TABLE builds (
-  build_id     BIGINT       NOT NULL,
-  build_name   VARCHAR(255) NOT NULL,
-  build_number VARCHAR(255) NOT NULL,
-  build_date   BIGINT       NOT NULL,
-  ci_url       VARCHAR(1024),
-  created      BIGINT       NOT NULL,
-  created_by   VARCHAR(64),
-  modified     BIGINT,
-  modified_by  VARCHAR(64),
-  CONSTRAINT builds_pk PRIMARY KEY (build_id)
-);
-CREATE UNIQUE INDEX builds_name_number_date_idx ON builds (build_name, build_number, build_date);
-
-CREATE TABLE build_jsons (
-  build_id        BIGINT NOT NULL,
-  build_info_json BLOB,
-  CONSTRAINT build_jsons_pk PRIMARY KEY (build_id),
-  CONSTRAINT build_jsons_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-
-CREATE TABLE build_promotions (
-  build_id          BIGINT      NOT NULL,
-  created           BIGINT      NOT NULL,
-  created_by        VARCHAR(64),
-  status            VARCHAR(64) NOT NULL,
-  repo              VARCHAR(64),
-  promotion_comment VARCHAR(1024),
-  ci_user           VARCHAR(64),
-  CONSTRAINT build_promotions_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE UNIQUE INDEX build_promotions_created_idx ON build_promotions (build_id, created);
-CREATE INDEX build_promotions_status_idx ON build_promotions (status);
-
-CREATE TABLE build_props (
-  prop_id    BIGINT NOT NULL,
-  build_id   BIGINT NOT NULL,
-  prop_key   VARCHAR(255),
-  prop_value VARCHAR(2048),
-  CONSTRAINT build_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT build_props_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE INDEX build_props_build_id_idx ON build_props (build_id);
-CREATE INDEX build_props_prop_key_idx ON build_props (prop_key);
-CREATE INDEX build_props_prop_value_idx ON build_props (prop_value);
-
-CREATE TABLE build_modules (
-  module_id      BIGINT        NOT NULL,
-  build_id       BIGINT        NOT NULL,
-  module_name_id VARCHAR(1024) NOT NULL,
-  CONSTRAINT build_modules_pk PRIMARY KEY (module_id),
-  CONSTRAINT build_modules_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE INDEX build_modules_build_id_idx ON build_modules (build_id);
-
-CREATE TABLE build_artifacts (
-  artifact_id   BIGINT        NOT NULL,
-  module_id     BIGINT        NOT NULL,
-  artifact_name VARCHAR(1024) NOT NULL,
-  artifact_type VARCHAR(64),
-  sha1          CHAR(40),
-  md5           CHAR(32),
-  CONSTRAINT build_artifacts_pk PRIMARY KEY (artifact_id),
-  CONSTRAINT build_artifacts_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX build_artifacts_module_id_idx ON build_artifacts (module_id);
-CREATE INDEX build_artifacts_sha1_idx ON build_artifacts (sha1);
-CREATE INDEX build_artifacts_md5_idx ON build_artifacts (md5);
-
-CREATE TABLE build_dependencies (
-  dependency_id      BIGINT        NOT NULL,
-  module_id          BIGINT        NOT NULL,
-  dependency_name_id VARCHAR(1024) NOT NULL,
-  dependency_scopes  VARCHAR(1024),
-  dependency_type    VARCHAR(64),
-  sha1               CHAR(40),
-  md5                CHAR(32),
-  CONSTRAINT build_dependencies_pk PRIMARY KEY (dependency_id),
-  CONSTRAINT build_dependencies_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX build_dependencies_module_idx ON build_dependencies (module_id);
-CREATE INDEX build_dependencies_sha1_idx ON build_dependencies (sha1);
-CREATE INDEX build_dependencies_md5_idx ON build_dependencies (md5);
-
-CREATE TABLE module_props (
-  prop_id    BIGINT NOT NULL,
-  module_id  BIGINT NOT NULL,
-  prop_key   VARCHAR(255),
-  prop_value VARCHAR(2048),
-  CONSTRAINT module_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT module_props_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX module_props_module_id_idx ON module_props (module_id);
-CREATE INDEX module_props_prop_key_idx ON module_props (prop_key);
-CREATE INDEX module_props_prop_value_idx ON module_props (prop_value);
diff --git a/storage/db/src/test/resources/upgrades/v300/ddl/mssql/mssql.sql b/storage/db/src/test/resources/upgrades/v300/ddl/mssql/mssql.sql
deleted file mode 100644
index 28b902e..0000000
--- a/storage/db/src/test/resources/upgrades/v300/ddl/mssql/mssql.sql
+++ /dev/null
@@ -1,306 +0,0 @@
-CREATE TABLE unique_ids (
-  index_type VARCHAR(32) NOT NULL,
-  current_id BIGINT      NOT NULL,
-  CONSTRAINT unique_ids_pk PRIMARY KEY (index_type)
-);
-
-CREATE TABLE binaries (
-  sha1       CHAR(40) NOT NULL,
-  md5        CHAR(32) NOT NULL,
-  bin_length BIGINT   NOT NULL,
-  CONSTRAINT binaries_pk PRIMARY KEY (sha1)
-);
-CREATE UNIQUE INDEX binaries_md5_idx ON binaries (md5);
-
-CREATE TABLE binary_blobs (
-  sha1 CHAR(40) NOT NULL,
-  data VARBINARY(MAX),
-  CONSTRAINT binary_blobs_pk PRIMARY KEY (sha1)
-);
-
-CREATE TABLE nodes (
-  node_id       BIGINT        NOT NULL,
-  node_type     BIT           NOT NULL,
-  repo          VARCHAR(64)   NOT NULL,
-  node_path     VARCHAR(1024) NOT NULL,
-  node_name     VARCHAR(255)  NOT NULL,
-  depth         SMALLINT      NOT NULL,
-  created       BIGINT        NOT NULL,
-  created_by    VARCHAR(64),
-  modified      BIGINT        NOT NULL,
-  modified_by   VARCHAR(64),
-  updated       BIGINT,
-  bin_length    BIGINT,
-  sha1_actual   CHAR(40),
-  sha1_original VARCHAR(1024),
-  md5_actual    CHAR(32),
-  md5_original  VARCHAR(1024),
-  CONSTRAINT nodes_pk PRIMARY KEY NONCLUSTERED (node_id),
-  CONSTRAINT nodes_binaries_fk FOREIGN KEY (sha1_actual) REFERENCES binaries (sha1)
-);
-CREATE UNIQUE CLUSTERED INDEX nodes_repo_path_name_idx ON nodes (repo, node_path, node_name);
-CREATE INDEX nodes_node_path_idx ON nodes (node_path);
-CREATE INDEX nodes_node_name_idx ON nodes (node_name);
-CREATE INDEX nodes_sha1_actual_idx ON nodes (sha1_actual);
-CREATE INDEX nodes_md5_actual_idx ON nodes (md5_actual);
-
-CREATE TABLE node_props (
-  prop_id    BIGINT NOT NULL,
-  node_id    BIGINT NOT NULL,
-  prop_key   VARCHAR(255),
-  prop_value VARCHAR(2048),
-  CONSTRAINT node_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT node_props_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-CREATE INDEX node_props_node_id_idx ON node_props (node_id);
-CREATE INDEX node_props_prop_key_idx ON node_props (prop_key);
-CREATE INDEX node_props_prop_value_idx ON node_props (prop_value);
-
-CREATE TABLE node_meta_infos (
-  node_id           BIGINT NOT NULL,
-  props_modified    BIGINT,
-  props_modified_by VARCHAR(64),
-  CONSTRAINT node_meta_infos_pk PRIMARY KEY (node_id),
-  CONSTRAINT node_meta_infos_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-
-CREATE TABLE watches (
-  watch_id BIGINT      NOT NULL,
-  node_id  BIGINT      NOT NULL,
-  username VARCHAR(64) NOT NULL,
-  since    BIGINT      NOT NULL,
-  CONSTRAINT watches_pk PRIMARY KEY (watch_id),
-  CONSTRAINT watches_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-CREATE INDEX watches_node_id_idx ON watches (node_id);
-
-CREATE TABLE stats (
-  node_id            BIGINT NOT NULL,
-  download_count     BIGINT,
-  last_downloaded    BIGINT,
-  last_downloaded_by VARCHAR(64),
-  CONSTRAINT stats_pk PRIMARY KEY (node_id),
-  CONSTRAINT stats_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-
-CREATE TABLE indexed_archives (
-  archive_sha1        CHAR(40) NOT NULL,
-  indexed_archives_id BIGINT   NOT NULL,
-  CONSTRAINT indexed_archives_pk PRIMARY KEY (archive_sha1),
-  CONSTRAINT indexed_archives_id_uq UNIQUE (indexed_archives_id),
-  CONSTRAINT indexed_archives_binaries_fk FOREIGN KEY (archive_sha1) REFERENCES binaries (sha1)
-);
-
-CREATE TABLE archive_paths (
-  path_id    BIGINT NOT NULL,
-  entry_path VARCHAR(1024),
-  CONSTRAINT archive_paths_pk PRIMARY KEY NONCLUSTERED (path_id)
-);
-CREATE UNIQUE CLUSTERED INDEX archive_paths_path_idx ON archive_paths (entry_path);
-
-CREATE TABLE archive_names (
-  name_id    BIGINT NOT NULL,
-  entry_name VARCHAR(255),
-  CONSTRAINT archive_names_pk PRIMARY KEY NONCLUSTERED (name_id)
-);
-CREATE UNIQUE CLUSTERED INDEX archive_names_name_idx ON archive_names (entry_name);
-
-CREATE TABLE indexed_archives_entries (
-  indexed_archives_id BIGINT NOT NULL,
-  entry_path_id       BIGINT NOT NULL,
-  entry_name_id       BIGINT NOT NULL,
-  CONSTRAINT indexed_archives_entries_pk PRIMARY KEY (indexed_archives_id, entry_path_id, entry_name_id),
-  CONSTRAINT indexed_archives_id_fk FOREIGN KEY (indexed_archives_id) REFERENCES indexed_archives (indexed_archives_id),
-  CONSTRAINT entry_path_id_fk FOREIGN KEY (entry_path_id) REFERENCES archive_paths (path_id),
-  CONSTRAINT entry_name_id_fk FOREIGN KEY (entry_name_id) REFERENCES archive_names (name_id)
-);
-CREATE INDEX indexed_entries_path_idx ON indexed_archives_entries (entry_path_id);
-CREATE INDEX indexed_entries_name_idx ON indexed_archives_entries (entry_name_id);
-
-CREATE TABLE tasks (
-  task_type    VARCHAR(32)   NOT NULL,
-  task_context VARCHAR(1024) NOT NULL
-  -- CONSTRAINT pk_tasks PRIMARY KEY (task_type, task_context)
-);
-CREATE INDEX tasks_type_context_idx ON tasks (task_type, task_context);
-
-CREATE TABLE configs (
-  config_name VARCHAR(255)   NOT NULL,
-  data        VARBINARY(MAX) NOT NULL,
-  CONSTRAINT configs_pk PRIMARY KEY (config_name)
-);
-
-CREATE TABLE users (
-  user_id           BIGINT      NOT NULL,
-  username          VARCHAR(64) NOT NULL,
-  password          VARCHAR(128),
-  salt              VARCHAR(128),
-  email             VARCHAR(128),
-  gen_password_key  VARCHAR(128),
-  admin             BIT,
-  enabled           BIT,
-  updatable_profile BIT,
-  realm             VARCHAR(255),
-  private_key       VARCHAR(512),
-  public_key        VARCHAR(255),
-  last_login_time   BIGINT,
-  last_login_ip     VARCHAR(42),
-  last_access_time  BIGINT,
-  last_access_ip    VARCHAR(42),
-  bintray_auth      VARCHAR(512),
-  CONSTRAINT users_pk PRIMARY KEY (user_id)
-);
-CREATE UNIQUE INDEX users_username_idx ON users (username);
-
-CREATE TABLE groups (
-  group_id         BIGINT      NOT NULL,
-  group_name       VARCHAR(64) NOT NULL,
-  description      VARCHAR(1024),
-  default_new_user BIT,
-  realm            VARCHAR(255),
-  realm_attributes VARCHAR(512),
-  CONSTRAINT groups_pk PRIMARY KEY (group_id)
-);
-CREATE UNIQUE INDEX groups_group_name_idx ON groups (group_name);
-
-CREATE TABLE users_groups (
-  user_id  BIGINT NOT NULL,
-  group_id BIGINT NOT NULL,
-  realm    VARCHAR(255),
-  CONSTRAINT users_groups_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id),
-  CONSTRAINT users_groups_groups_fk FOREIGN KEY (group_id) REFERENCES groups (group_id)
-);
-CREATE UNIQUE INDEX users_groups_idx ON users_groups (user_id, group_id);
-
-CREATE TABLE permission_targets (
-  perm_target_id   BIGINT      NOT NULL,
-  perm_target_name VARCHAR(64) NOT NULL,
-  includes         VARCHAR(1024),
-  excludes         VARCHAR(1024),
-  CONSTRAINT permission_targets_pk PRIMARY KEY (perm_target_id)
-);
-CREATE UNIQUE INDEX permission_targets_name_idx ON permission_targets (perm_target_name);
-
-CREATE TABLE permission_target_repos (
-  perm_target_id BIGINT      NOT NULL,
-  repo_key       VARCHAR(64) NOT NULL,
-  CONSTRAINT permission_target_repos_fk FOREIGN KEY (perm_target_id) REFERENCES permission_targets (perm_target_id)
-);
-
-CREATE TABLE acls (
-  acl_id         BIGINT NOT NULL,
-  perm_target_id BIGINT,
-  modified       BIGINT,
-  modified_by    VARCHAR(64),
-  CONSTRAINT acls_pk PRIMARY KEY (acl_id),
-  CONSTRAINT acls_permission_targets_fk FOREIGN KEY (perm_target_id) REFERENCES permission_targets (perm_target_id)
-);
-CREATE INDEX acls_perm_target_id_idx ON acls (perm_target_id);
-
-CREATE TABLE aces (
-  ace_id   BIGINT   NOT NULL,
-  acl_id   BIGINT   NOT NULL,
-  mask     SMALLINT NOT NULL,
-  user_id  BIGINT,
-  group_id BIGINT,
-  CONSTRAINT aces_pk PRIMARY KEY (ace_id),
-  CONSTRAINT aces_acls_fk FOREIGN KEY (acl_id) REFERENCES acls (acl_id),
-  CONSTRAINT aces_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id),
-  CONSTRAINT aces_groups_fk FOREIGN KEY (group_id) REFERENCES groups (group_id)
-);
-
-CREATE TABLE builds (
-  build_id     BIGINT       NOT NULL,
-  build_name   VARCHAR(255) NOT NULL,
-  build_number VARCHAR(255) NOT NULL,
-  build_date   BIGINT       NOT NULL,
-  ci_url       VARCHAR(1024),
-  created      BIGINT       NOT NULL,
-  created_by   VARCHAR(64),
-  modified     BIGINT,
-  modified_by  VARCHAR(64),
-  CONSTRAINT builds_pk PRIMARY KEY (build_id)
-);
-CREATE UNIQUE INDEX builds_name_number_date_idx ON builds (build_name, build_number, build_date);
-
-CREATE TABLE build_jsons (
-  build_id        BIGINT NOT NULL,
-  build_info_json VARBINARY(MAX),
-  CONSTRAINT build_jsons_pk PRIMARY KEY (build_id),
-  CONSTRAINT build_jsons_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-
-CREATE TABLE build_promotions (
-  build_id          BIGINT      NOT NULL,
-  created           BIGINT      NOT NULL,
-  created_by        VARCHAR(64),
-  status            VARCHAR(64) NOT NULL,
-  repo              VARCHAR(64),
-  promotion_comment VARCHAR(1024),
-  ci_user           VARCHAR(64),
-  CONSTRAINT build_promotions_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE UNIQUE INDEX build_promotions_created_idx ON build_promotions (build_id, created);
-CREATE INDEX build_promotions_status_idx ON build_promotions (status);
-
-CREATE TABLE build_props (
-  prop_id    BIGINT NOT NULL,
-  build_id   BIGINT NOT NULL,
-  prop_key   VARCHAR(255),
-  prop_value VARCHAR(2048),
-  CONSTRAINT build_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT build_props_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE INDEX build_props_build_id_idx ON build_props (build_id);
-CREATE INDEX build_props_prop_key_idx ON build_props (prop_key);
-CREATE INDEX build_props_prop_value_idx ON build_props (prop_value);
-
-CREATE TABLE build_modules (
-  module_id      BIGINT        NOT NULL,
-  build_id       BIGINT        NOT NULL,
-  module_name_id VARCHAR(1024) NOT NULL,
-  CONSTRAINT build_modules_pk PRIMARY KEY (module_id),
-  CONSTRAINT build_modules_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE INDEX build_modules_build_id_idx ON build_modules (build_id);
-
-CREATE TABLE build_artifacts (
-  artifact_id   BIGINT        NOT NULL,
-  module_id     BIGINT        NOT NULL,
-  artifact_name VARCHAR(1024) NOT NULL,
-  artifact_type VARCHAR(64),
-  sha1          CHAR(40),
-  md5           CHAR(32),
-  CONSTRAINT build_artifacts_pk PRIMARY KEY (artifact_id),
-  CONSTRAINT build_artifacts_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX build_artifacts_module_id_idx ON build_artifacts (module_id);
-CREATE INDEX build_artifacts_sha1_idx ON build_artifacts (sha1);
-CREATE INDEX build_artifacts_md5_idx ON build_artifacts (md5);
-
-CREATE TABLE build_dependencies (
-  dependency_id      BIGINT        NOT NULL,
-  module_id          BIGINT        NOT NULL,
-  dependency_name_id VARCHAR(1024) NOT NULL,
-  dependency_scopes  VARCHAR(1024),
-  dependency_type    VARCHAR(64),
-  sha1               CHAR(40),
-  md5                CHAR(32),
-  CONSTRAINT build_dependencies_pk PRIMARY KEY (dependency_id),
-  CONSTRAINT build_dependencies_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX build_dependencies_module_idx ON build_dependencies (module_id);
-CREATE INDEX build_dependencies_sha1_idx ON build_dependencies (sha1);
-CREATE INDEX build_dependencies_md5_idx ON build_dependencies (md5);
-
-CREATE TABLE module_props (
-  prop_id    BIGINT NOT NULL,
-  module_id  BIGINT NOT NULL,
-  prop_key   VARCHAR(255),
-  prop_value VARCHAR(2048),
-  CONSTRAINT module_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT module_props_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX module_props_module_id_idx ON module_props (module_id);
-CREATE INDEX module_props_prop_key_idx ON module_props (prop_key);
-CREATE INDEX module_props_prop_value_idx ON module_props (prop_value);
diff --git a/storage/db/src/test/resources/upgrades/v300/ddl/mysql/mysql.sql b/storage/db/src/test/resources/upgrades/v300/ddl/mysql/mysql.sql
deleted file mode 100644
index 5e57f74..0000000
--- a/storage/db/src/test/resources/upgrades/v300/ddl/mysql/mysql.sql
+++ /dev/null
@@ -1,306 +0,0 @@
-CREATE TABLE unique_ids (
-  index_type VARCHAR(32) NOT NULL,
-  current_id BIGINT      NOT NULL,
-  CONSTRAINT unique_ids_pk PRIMARY KEY (index_type)
-);
-
-CREATE TABLE binaries (
-  sha1       CHAR(40) NOT NULL,
-  md5        CHAR(32) NOT NULL,
-  bin_length BIGINT   NOT NULL,
-  CONSTRAINT binaries_pk PRIMARY KEY (sha1)
-);
-CREATE UNIQUE INDEX binaries_md5_idx ON binaries (md5);
-
-CREATE TABLE binary_blobs (
-  sha1 CHAR(40) NOT NULL,
-  data LONGBLOB,
-  CONSTRAINT binary_blobs_pk PRIMARY KEY (sha1)
-);
-
-CREATE TABLE nodes (
-  node_id       BIGINT        NOT NULL,
-  node_type     TINYINT       NOT NULL,
-  repo          VARCHAR(64)   NOT NULL,
-  node_path     VARCHAR(1024) NOT NULL,
-  node_name     VARCHAR(255)  NOT NULL,
-  depth         TINYINT       NOT NULL,
-  created       BIGINT        NOT NULL,
-  created_by    VARCHAR(64),
-  modified      BIGINT        NOT NULL,
-  modified_by   VARCHAR(64),
-  updated       BIGINT,
-  bin_length    BIGINT,
-  sha1_actual   CHAR(40),
-  sha1_original VARCHAR(1024),
-  md5_actual    CHAR(32),
-  md5_original  VARCHAR(1024),
-  CONSTRAINT nodes_pk PRIMARY KEY (node_id),
-  CONSTRAINT nodes_binaries_fk FOREIGN KEY (sha1_actual) REFERENCES binaries (sha1)
-);
-CREATE INDEX nodes_repo_path_name_idx ON nodes (repo, node_path(255), node_name);
-CREATE INDEX nodes_node_path_idx ON nodes (node_path(255));
-CREATE INDEX nodes_node_name_idx ON nodes (node_name);
-CREATE INDEX nodes_sha1_actual_idx ON nodes (sha1_actual);
-CREATE INDEX nodes_md5_actual_idx ON nodes (md5_actual);
-
-CREATE TABLE node_props (
-  prop_id    BIGINT NOT NULL,
-  node_id    BIGINT NOT NULL,
-  prop_key   VARCHAR(255),
-  prop_value VARCHAR(2048),
-  CONSTRAINT node_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT node_props_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-CREATE INDEX node_props_node_id_idx ON node_props (node_id);
-CREATE INDEX node_props_prop_key_idx ON node_props (prop_key);
-CREATE INDEX node_props_prop_value_idx ON node_props (prop_value(255));
-
-CREATE TABLE node_meta_infos (
-  node_id           BIGINT NOT NULL,
-  props_modified    BIGINT,
-  props_modified_by VARCHAR(64),
-  CONSTRAINT node_meta_infos_pk PRIMARY KEY (node_id),
-  CONSTRAINT node_meta_infos_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-
-CREATE TABLE watches (
-  watch_id BIGINT      NOT NULL,
-  node_id  BIGINT      NOT NULL,
-  username VARCHAR(64) NOT NULL,
-  since    BIGINT      NOT NULL,
-  CONSTRAINT watches_pk PRIMARY KEY (watch_id),
-  CONSTRAINT watches_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-CREATE INDEX watches_node_id_idx ON watches (node_id);
-
-CREATE TABLE stats (
-  node_id            BIGINT NOT NULL,
-  download_count     BIGINT,
-  last_downloaded    BIGINT,
-  last_downloaded_by VARCHAR(64),
-  CONSTRAINT stats_pk PRIMARY KEY (node_id),
-  CONSTRAINT stats_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-
-CREATE TABLE indexed_archives (
-  archive_sha1        CHAR(40) NOT NULL,
-  indexed_archives_id BIGINT   NOT NULL,
-  CONSTRAINT indexed_archives_pk PRIMARY KEY (archive_sha1),
-  CONSTRAINT indexed_archives_id_uq UNIQUE (indexed_archives_id),
-  CONSTRAINT indexed_archives_binaries_fk FOREIGN KEY (archive_sha1) REFERENCES binaries (sha1)
-);
-
-CREATE TABLE archive_paths (
-  path_id    BIGINT NOT NULL,
-  entry_path VARCHAR(1024),
-  CONSTRAINT archive_paths_pk PRIMARY KEY (path_id)
-);
-CREATE INDEX archive_paths_path_idx ON archive_paths (entry_path(255));
-
-CREATE TABLE archive_names (
-  name_id    BIGINT NOT NULL,
-  entry_name VARCHAR(255),
-  CONSTRAINT archive_names_pk PRIMARY KEY (name_id)
-);
-CREATE UNIQUE INDEX archive_names_name_idx ON archive_names (entry_name);
-
-CREATE TABLE indexed_archives_entries (
-  indexed_archives_id BIGINT NOT NULL,
-  entry_path_id       BIGINT NOT NULL,
-  entry_name_id       BIGINT NOT NULL,
-  CONSTRAINT indexed_archives_entries_pk PRIMARY KEY (indexed_archives_id, entry_path_id, entry_name_id),
-  CONSTRAINT indexed_archives_id_fk FOREIGN KEY (indexed_archives_id) REFERENCES indexed_archives (indexed_archives_id),
-  CONSTRAINT entry_path_id_fk FOREIGN KEY (entry_path_id) REFERENCES archive_paths (path_id),
-  CONSTRAINT entry_name_id_fk FOREIGN KEY (entry_name_id) REFERENCES archive_names (name_id)
-);
-CREATE INDEX indexed_entries_path_idx ON indexed_archives_entries (entry_path_id);
-CREATE INDEX indexed_entries_name_idx ON indexed_archives_entries (entry_name_id);
-
-CREATE TABLE tasks (
-  task_type    VARCHAR(32)   NOT NULL,
-  task_context VARCHAR(1024) NOT NULL
-  # CONSTRAINT pk_tasks PRIMARY KEY (task_type, task_context)
-);
-CREATE INDEX tasks_type_context_idx ON tasks (task_type, task_context(255));
-
-CREATE TABLE configs (
-  config_name VARCHAR(255) NOT NULL,
-  data        LONGBLOB     NOT NULL,
-  CONSTRAINT configs_pk PRIMARY KEY (config_name)
-);
-
-CREATE TABLE users (
-  user_id           BIGINT      NOT NULL,
-  username          VARCHAR(64) NOT NULL,
-  password          VARCHAR(128),
-  salt              VARCHAR(128),
-  email             VARCHAR(128),
-  gen_password_key  VARCHAR(128),
-  admin             TINYINT,
-  enabled           TINYINT,
-  updatable_profile TINYINT,
-  realm             VARCHAR(255),
-  private_key       VARCHAR(512),
-  public_key        VARCHAR(255),
-  last_login_time   BIGINT,
-  last_login_ip     VARCHAR(42),
-  last_access_time  BIGINT,
-  last_access_ip    VARCHAR(42),
-  bintray_auth      VARCHAR(512),
-  CONSTRAINT users_pk PRIMARY KEY (user_id)
-);
-CREATE UNIQUE INDEX users_username_idx ON users (username);
-
-CREATE TABLE groups (
-  group_id         BIGINT      NOT NULL,
-  group_name       VARCHAR(64) NOT NULL,
-  description      VARCHAR(1024),
-  default_new_user TINYINT,
-  realm            VARCHAR(255),
-  realm_attributes VARCHAR(512),
-  CONSTRAINT groups_pk PRIMARY KEY (group_id)
-);
-CREATE UNIQUE INDEX groups_group_name_idx ON groups (group_name);
-
-CREATE TABLE users_groups (
-  user_id  BIGINT NOT NULL,
-  group_id BIGINT NOT NULL,
-  realm    VARCHAR(255),
-  CONSTRAINT users_groups_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id),
-  CONSTRAINT users_groups_groups_fk FOREIGN KEY (group_id) REFERENCES groups (group_id)
-);
-CREATE UNIQUE INDEX users_groups_idx ON users_groups (user_id, group_id);
-
-CREATE TABLE permission_targets (
-  perm_target_id   BIGINT      NOT NULL,
-  perm_target_name VARCHAR(64) NOT NULL,
-  includes         VARCHAR(1024),
-  excludes         VARCHAR(1024),
-  CONSTRAINT permission_targets_pk PRIMARY KEY (perm_target_id)
-);
-CREATE UNIQUE INDEX permission_targets_name_idx ON permission_targets (perm_target_name);
-
-CREATE TABLE permission_target_repos (
-  perm_target_id BIGINT      NOT NULL,
-  repo_key       VARCHAR(64) NOT NULL,
-  CONSTRAINT permission_target_repos_fk FOREIGN KEY (perm_target_id) REFERENCES permission_targets (perm_target_id)
-);
-
-CREATE TABLE acls (
-  acl_id         BIGINT NOT NULL,
-  perm_target_id BIGINT,
-  modified       BIGINT,
-  modified_by    VARCHAR(64),
-  CONSTRAINT acls_pk PRIMARY KEY (acl_id),
-  CONSTRAINT acls_permission_targets_fk FOREIGN KEY (perm_target_id) REFERENCES permission_targets (perm_target_id)
-);
-CREATE INDEX acls_perm_target_id_idx ON acls (perm_target_id);
-
-CREATE TABLE aces (
-  ace_id   BIGINT   NOT NULL,
-  acl_id   BIGINT   NOT NULL,
-  mask     SMALLINT NOT NULL,
-  user_id  BIGINT,
-  group_id BIGINT,
-  CONSTRAINT aces_pk PRIMARY KEY (ace_id),
-  CONSTRAINT aces_acls_fk FOREIGN KEY (acl_id) REFERENCES acls (acl_id),
-  CONSTRAINT aces_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id),
-  CONSTRAINT aces_groups_fk FOREIGN KEY (group_id) REFERENCES groups (group_id)
-);
-
-CREATE TABLE builds (
-  build_id     BIGINT       NOT NULL,
-  build_name   VARCHAR(255) NOT NULL,
-  build_number VARCHAR(255) NOT NULL,
-  build_date   BIGINT       NOT NULL,
-  ci_url       VARCHAR(1024),
-  created      BIGINT       NOT NULL,
-  created_by   VARCHAR(64),
-  modified     BIGINT,
-  modified_by  VARCHAR(64),
-  CONSTRAINT builds_pk PRIMARY KEY (build_id)
-);
-CREATE UNIQUE INDEX builds_name_number_date_idx ON builds (build_name, build_number, build_date);
-
-CREATE TABLE build_jsons (
-  build_id        BIGINT NOT NULL,
-  build_info_json LONGBLOB,
-  CONSTRAINT build_jsons_pk PRIMARY KEY (build_id),
-  CONSTRAINT build_jsons_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-
-CREATE TABLE build_promotions (
-  build_id          BIGINT      NOT NULL,
-  created           BIGINT      NOT NULL,
-  created_by        VARCHAR(64),
-  status            VARCHAR(64) NOT NULL,
-  repo              VARCHAR(64),
-  promotion_comment VARCHAR(1024),
-  ci_user           VARCHAR(64),
-  CONSTRAINT build_promotions_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE UNIQUE INDEX build_promotions_created_idx ON build_promotions (build_id, created);
-CREATE INDEX build_promotions_status_idx ON build_promotions (status);
-
-CREATE TABLE build_props (
-  prop_id    BIGINT NOT NULL,
-  build_id   BIGINT NOT NULL,
-  prop_key   VARCHAR(255),
-  prop_value VARCHAR(2048),
-  CONSTRAINT build_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT build_props_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE INDEX build_props_build_id_idx ON build_props (build_id);
-CREATE INDEX build_props_prop_key_idx ON build_props (prop_key);
-CREATE INDEX build_props_prop_value_idx ON build_props (prop_value(255));
-
-CREATE TABLE build_modules (
-  module_id      BIGINT        NOT NULL,
-  build_id       BIGINT        NOT NULL,
-  module_name_id VARCHAR(1024) NOT NULL,
-  CONSTRAINT build_modules_pk PRIMARY KEY (module_id),
-  CONSTRAINT build_modules_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE INDEX build_modules_build_id_idx ON build_modules (build_id);
-
-CREATE TABLE build_artifacts (
-  artifact_id   BIGINT        NOT NULL,
-  module_id     BIGINT        NOT NULL,
-  artifact_name VARCHAR(1024) NOT NULL,
-  artifact_type VARCHAR(64),
-  sha1          CHAR(40),
-  md5           CHAR(32),
-  CONSTRAINT build_artifacts_pk PRIMARY KEY (artifact_id),
-  CONSTRAINT build_artifacts_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX build_artifacts_module_id_idx ON build_artifacts (module_id);
-CREATE INDEX build_artifacts_sha1_idx ON build_artifacts (sha1);
-CREATE INDEX build_artifacts_md5_idx ON build_artifacts (md5);
-
-CREATE TABLE build_dependencies (
-  dependency_id      BIGINT        NOT NULL,
-  module_id          BIGINT        NOT NULL,
-  dependency_name_id VARCHAR(1024) NOT NULL,
-  dependency_scopes  VARCHAR(1024),
-  dependency_type    VARCHAR(64),
-  sha1               CHAR(40),
-  md5                CHAR(32),
-  CONSTRAINT build_dependencies_pk PRIMARY KEY (dependency_id),
-  CONSTRAINT build_dependencies_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX build_dependencies_module_idx ON build_dependencies (module_id);
-CREATE INDEX build_dependencies_sha1_idx ON build_dependencies (sha1);
-CREATE INDEX build_dependencies_md5_idx ON build_dependencies (md5);
-
-CREATE TABLE module_props (
-  prop_id    BIGINT NOT NULL,
-  module_id  BIGINT NOT NULL,
-  prop_key   VARCHAR(255),
-  prop_value VARCHAR(2048),
-  CONSTRAINT module_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT module_props_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX module_props_module_id_idx ON module_props (module_id);
-CREATE INDEX module_props_prop_key_idx ON module_props (prop_key);
-CREATE INDEX module_props_prop_value_idx ON module_props (prop_value(255));
diff --git a/storage/db/src/test/resources/upgrades/v300/ddl/oracle/oracle.sql b/storage/db/src/test/resources/upgrades/v300/ddl/oracle/oracle.sql
deleted file mode 100644
index 80411d2..0000000
--- a/storage/db/src/test/resources/upgrades/v300/ddl/oracle/oracle.sql
+++ /dev/null
@@ -1,306 +0,0 @@
-CREATE TABLE unique_ids (
-  index_type VARCHAR2(32)  NOT NULL,
-  current_id NUMBER(19, 0) NOT NULL,
-  CONSTRAINT unique_ids_pk PRIMARY KEY (index_type)
-);
-
-CREATE TABLE binaries (
-  sha1       CHAR(40)      NOT NULL,
-  md5        CHAR(32)      NOT NULL,
-  bin_length NUMBER(19, 0) NOT NULL,
-  CONSTRAINT binaries_pk PRIMARY KEY (sha1)
-);
-CREATE UNIQUE INDEX binaries_md5_idx ON binaries (md5);
-
-CREATE TABLE binary_blobs (
-  sha1 CHAR(40) NOT NULL,
-  data BLOB,
-  CONSTRAINT binary_blobs_pk PRIMARY KEY (sha1)
-);
-
-CREATE TABLE nodes (
-  node_id       NUMBER(19, 0)  NOT NULL,
-  node_type     NUMBER(5, 0)   NOT NULL,
-  repo          VARCHAR2(64)   NOT NULL,
-  node_path     VARCHAR2(1024) NOT NULL,
-  node_name     VARCHAR2(255)  NOT NULL,
-  depth         NUMBER(5, 0)   NOT NULL,
-  created       NUMBER(19, 0)  NOT NULL,
-  created_by    VARCHAR2(64),
-  modified      NUMBER(19, 0)  NOT NULL,
-  modified_by   VARCHAR2(64),
-  updated       NUMBER(19, 0),
-  bin_length    NUMBER(19, 0),
-  sha1_actual   CHAR(40),
-  sha1_original VARCHAR2(1024),
-  md5_actual    CHAR(32),
-  md5_original  VARCHAR2(1024),
-  CONSTRAINT nodes_pk PRIMARY KEY (node_id),
-  CONSTRAINT nodes_binaries_fk FOREIGN KEY (sha1_actual) REFERENCES binaries (sha1)
-);
-CREATE UNIQUE INDEX nodes_repo_path_name_idx ON nodes (repo, node_path, node_name);
-CREATE INDEX nodes_node_path_idx ON nodes (node_path);
-CREATE INDEX nodes_node_name_idx ON nodes (node_name);
-CREATE INDEX nodes_sha1_actual_idx ON nodes (sha1_actual);
-CREATE INDEX nodes_md5_actual_idx ON nodes (md5_actual);
-
-CREATE TABLE node_props (
-  prop_id    NUMBER(19, 0) NOT NULL,
-  node_id    NUMBER(19, 0) NOT NULL,
-  prop_key   VARCHAR2(255),
-  prop_value VARCHAR2(2048),
-  CONSTRAINT node_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT node_props_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-CREATE INDEX node_props_node_id_idx ON node_props (node_id);
-CREATE INDEX node_props_prop_key_idx ON node_props (prop_key);
-CREATE INDEX node_props_prop_value_idx ON node_props (prop_value);
-
-CREATE TABLE node_meta_infos (
-  node_id           NUMBER(19, 0) NOT NULL,
-  props_modified    NUMBER(19, 0),
-  props_modified_by VARCHAR2(64),
-  CONSTRAINT node_meta_infos_pk PRIMARY KEY (node_id),
-  CONSTRAINT node_meta_infos_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-
-CREATE TABLE watches (
-  watch_id NUMBER(19, 0) NOT NULL,
-  node_id  NUMBER(19, 0) NOT NULL,
-  username VARCHAR2(64)  NOT NULL,
-  since    NUMBER(19, 0) NOT NULL,
-  CONSTRAINT watches_pk PRIMARY KEY (watch_id),
-  CONSTRAINT watches_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-CREATE INDEX watches_node_id_idx ON watches (node_id);
-
-CREATE TABLE stats (
-  node_id            NUMBER(19, 0) NOT NULL,
-  download_count     NUMBER(19, 0),
-  last_downloaded    NUMBER(19, 0),
-  last_downloaded_by VARCHAR2(64),
-  CONSTRAINT stats_pk PRIMARY KEY (node_id),
-  CONSTRAINT stats_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-
-CREATE TABLE indexed_archives (
-  archive_sha1        CHAR(40)      NOT NULL,
-  indexed_archives_id NUMBER(19, 0) NOT NULL,
-  CONSTRAINT indexed_archives_pk PRIMARY KEY (archive_sha1),
-  CONSTRAINT indexed_archives_id_uq UNIQUE (indexed_archives_id),
-  CONSTRAINT indexed_archives_binaries_fk FOREIGN KEY (archive_sha1) REFERENCES binaries (sha1)
-);
-
-CREATE TABLE archive_paths (
-  path_id    NUMBER(19, 0) NOT NULL,
-  entry_path VARCHAR2(1024),
-  CONSTRAINT archive_paths_pk PRIMARY KEY (path_id)
-);
-CREATE UNIQUE INDEX archive_paths_path_idx ON archive_paths (entry_path);
-
-CREATE TABLE archive_names (
-  name_id    NUMBER(19, 0) NOT NULL,
-  entry_name VARCHAR2(255),
-  CONSTRAINT archive_names_pk PRIMARY KEY (name_id)
-);
-CREATE UNIQUE INDEX archive_names_name_idx ON archive_names (entry_name);
-
-CREATE TABLE indexed_archives_entries (
-  indexed_archives_id NUMBER(19, 0) NOT NULL,
-  entry_path_id       NUMBER(19, 0) NOT NULL,
-  entry_name_id       NUMBER(19, 0) NOT NULL,
-  CONSTRAINT indexed_archives_entries_pk PRIMARY KEY (indexed_archives_id, entry_path_id, entry_name_id),
-  CONSTRAINT indexed_archives_id_fk FOREIGN KEY (indexed_archives_id) REFERENCES indexed_archives (indexed_archives_id),
-  CONSTRAINT entry_path_id_fk FOREIGN KEY (entry_path_id) REFERENCES archive_paths (path_id),
-  CONSTRAINT entry_name_id_fk FOREIGN KEY (entry_name_id) REFERENCES archive_names (name_id)
-);
-CREATE INDEX indexed_entries_path_idx ON indexed_archives_entries (entry_path_id);
-CREATE INDEX indexed_entries_name_idx ON indexed_archives_entries (entry_name_id);
-
-CREATE TABLE tasks (
-  task_type    VARCHAR2(32)   NOT NULL,
-  task_context VARCHAR2(1024) NOT NULL
-  -- CONSTRAINT pk_tasks PRIMARY KEY (task_type, task_context)
-);
-CREATE INDEX tasks_type_context_idx ON tasks (task_type, task_context);
-
-CREATE TABLE configs (
-  config_name VARCHAR2(255) NOT NULL,
-  data        BLOB          NOT NULL,
-  CONSTRAINT configs_pk PRIMARY KEY (config_name)
-);
-
-CREATE TABLE users (
-  user_id           NUMBER(19, 0) NOT NULL,
-  username          VARCHAR2(64)  NOT NULL,
-  password          VARCHAR2(128),
-  salt              VARCHAR2(128),
-  email             VARCHAR2(128),
-  gen_password_key  VARCHAR2(128),
-  admin             NUMBER(5, 0),
-  enabled           NUMBER(5, 0),
-  updatable_profile NUMBER(5, 0),
-  realm             VARCHAR2(255),
-  private_key       VARCHAR2(512),
-  public_key        VARCHAR2(255),
-  last_login_time   NUMBER(19, 0),
-  last_login_ip     VARCHAR2(42),
-  last_access_time  NUMBER(19, 0),
-  last_access_ip    VARCHAR2(42),
-  bintray_auth      VARCHAR2(512),
-  CONSTRAINT users_pk PRIMARY KEY (user_id)
-);
-CREATE UNIQUE INDEX users_username_idx ON users (username);
-
-CREATE TABLE groups (
-  group_id         NUMBER(19, 0) NOT NULL,
-  group_name       VARCHAR2(64)  NOT NULL,
-  description      VARCHAR2(1024),
-  default_new_user NUMBER(5, 0),
-  realm            VARCHAR2(255),
-  realm_attributes VARCHAR2(512),
-  CONSTRAINT groups_pk PRIMARY KEY (group_id)
-);
-CREATE UNIQUE INDEX groups_group_name_idx ON groups (group_name);
-
-CREATE TABLE users_groups (
-  user_id  NUMBER(19, 0) NOT NULL,
-  group_id NUMBER(19, 0) NOT NULL,
-  realm    VARCHAR2(255),
-  CONSTRAINT users_groups_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id),
-  CONSTRAINT users_groups_groups_fk FOREIGN KEY (group_id) REFERENCES groups (group_id)
-);
-CREATE UNIQUE INDEX users_groups_idx ON users_groups (user_id, group_id);
-
-CREATE TABLE permission_targets (
-  perm_target_id   NUMBER(19, 0) NOT NULL,
-  perm_target_name VARCHAR2(64)  NOT NULL,
-  includes         VARCHAR2(1024),
-  excludes         VARCHAR2(1024),
-  CONSTRAINT permission_targets_pk PRIMARY KEY (perm_target_id)
-);
-CREATE UNIQUE INDEX permission_targets_name_idx ON permission_targets (perm_target_name);
-
-CREATE TABLE permission_target_repos (
-  perm_target_id NUMBER(19, 0) NOT NULL,
-  repo_key       VARCHAR2(64)  NOT NULL,
-  CONSTRAINT permission_target_repos_fk FOREIGN KEY (perm_target_id) REFERENCES permission_targets (perm_target_id)
-);
-
-CREATE TABLE acls (
-  acl_id         NUMBER(19, 0) NOT NULL,
-  perm_target_id NUMBER(19, 0),
-  modified       NUMBER(19, 0),
-  modified_by    VARCHAR2(64),
-  CONSTRAINT acls_pk PRIMARY KEY (acl_id),
-  CONSTRAINT acls_permission_targets_fk FOREIGN KEY (perm_target_id) REFERENCES permission_targets (perm_target_id)
-);
-CREATE INDEX acls_perm_target_id_idx ON acls (perm_target_id);
-
-CREATE TABLE aces (
-  ace_id   NUMBER(19, 0) NOT NULL,
-  acl_id   NUMBER(19, 0) NOT NULL,
-  mask     NUMBER(5, 0)  NOT NULL,
-  user_id  NUMBER(19, 0),
-  group_id NUMBER(19, 0),
-  CONSTRAINT aces_pk PRIMARY KEY (ace_id),
-  CONSTRAINT aces_acls_fk FOREIGN KEY (acl_id) REFERENCES acls (acl_id),
-  CONSTRAINT aces_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id),
-  CONSTRAINT aces_groups_fk FOREIGN KEY (group_id) REFERENCES groups (group_id)
-);
-
-CREATE TABLE builds (
-  build_id     NUMBER(19, 0) NOT NULL,
-  build_name   VARCHAR2(255) NOT NULL,
-  build_number VARCHAR2(255) NOT NULL,
-  build_date   NUMBER(19, 0) NOT NULL,
-  ci_url       VARCHAR2(1024),
-  created      NUMBER(19, 0) NOT NULL,
-  created_by   VARCHAR2(64),
-  modified     NUMBER(19, 0),
-  modified_by  VARCHAR2(64),
-  CONSTRAINT builds_pk PRIMARY KEY (build_id)
-);
-CREATE UNIQUE INDEX builds_name_number_date_idx ON builds (build_name, build_number, build_date);
-
-CREATE TABLE build_jsons (
-  build_id        NUMBER(19, 0) NOT NULL,
-  build_info_json BLOB,
-  CONSTRAINT build_jsons_pk PRIMARY KEY (build_id),
-  CONSTRAINT build_jsons_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-
-CREATE TABLE build_promotions (
-  build_id          NUMBER(19, 0) NOT NULL,
-  created           NUMBER(19, 0) NOT NULL,
-  created_by        VARCHAR2(64),
-  status            VARCHAR2(64)  NOT NULL,
-  repo              VARCHAR2(64),
-  promotion_comment VARCHAR2(1024),
-  ci_user           VARCHAR2(64),
-  CONSTRAINT build_promotions_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE UNIQUE INDEX build_promotions_created_idx ON build_promotions (build_id, created);
-CREATE INDEX build_promotions_status_idx ON build_promotions (status);
-
-CREATE TABLE build_props (
-  prop_id    NUMBER(19, 0) NOT NULL,
-  build_id   NUMBER(19, 0) NOT NULL,
-  prop_key   VARCHAR2(255),
-  prop_value VARCHAR2(2048),
-  CONSTRAINT build_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT build_props_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE INDEX build_props_build_id_idx ON build_props (build_id);
-CREATE INDEX build_props_prop_key_idx ON build_props (prop_key);
-CREATE INDEX build_props_prop_value_idx ON build_props (prop_value);
-
-CREATE TABLE build_modules (
-  module_id      NUMBER(19, 0)  NOT NULL,
-  build_id       NUMBER(19, 0)  NOT NULL,
-  module_name_id VARCHAR2(1024) NOT NULL,
-  CONSTRAINT build_modules_pk PRIMARY KEY (module_id),
-  CONSTRAINT build_modules_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE INDEX build_modules_build_id_idx ON build_modules (build_id);
-
-CREATE TABLE build_artifacts (
-  artifact_id   NUMBER(19, 0)  NOT NULL,
-  module_id     NUMBER(19, 0)  NOT NULL,
-  artifact_name VARCHAR2(1024) NOT NULL,
-  artifact_type VARCHAR2(64),
-  sha1          CHAR(40),
-  md5           CHAR(32),
-  CONSTRAINT build_artifacts_pk PRIMARY KEY (artifact_id),
-  CONSTRAINT build_artifacts_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX build_artifacts_module_id_idx ON build_artifacts (module_id);
-CREATE INDEX build_artifacts_sha1_idx ON build_artifacts (sha1);
-CREATE INDEX build_artifacts_md5_idx ON build_artifacts (md5);
-
-CREATE TABLE build_dependencies (
-  dependency_id      NUMBER(19, 0)  NOT NULL,
-  module_id          NUMBER(19, 0)  NOT NULL,
-  dependency_name_id VARCHAR2(1024) NOT NULL,
-  dependency_scopes  VARCHAR2(1024),
-  dependency_type    VARCHAR2(64),
-  sha1               CHAR(40),
-  md5                CHAR(32),
-  CONSTRAINT build_dependencies_pk PRIMARY KEY (dependency_id),
-  CONSTRAINT build_dependencies_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX build_dependencies_module_idx ON build_dependencies (module_id);
-CREATE INDEX build_dependencies_sha1_idx ON build_dependencies (sha1);
-CREATE INDEX build_dependencies_md5_idx ON build_dependencies (md5);
-
-CREATE TABLE module_props (
-  prop_id    NUMBER(19, 0) NOT NULL,
-  module_id  NUMBER(19, 0) NOT NULL,
-  prop_key   VARCHAR2(255),
-  prop_value VARCHAR2(2048),
-  CONSTRAINT module_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT module_props_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX module_props_module_id_idx ON module_props (module_id);
-CREATE INDEX module_props_prop_key_idx ON module_props (prop_key);
-CREATE INDEX module_props_prop_value_idx ON module_props (prop_value);
diff --git a/storage/db/src/test/resources/upgrades/v300/ddl/postgresql/postgresql.sql b/storage/db/src/test/resources/upgrades/v300/ddl/postgresql/postgresql.sql
deleted file mode 100644
index 51b0971..0000000
--- a/storage/db/src/test/resources/upgrades/v300/ddl/postgresql/postgresql.sql
+++ /dev/null
@@ -1,306 +0,0 @@
-CREATE TABLE unique_ids (
-  index_type VARCHAR(32) NOT NULL,
-  current_id BIGINT      NOT NULL,
-  CONSTRAINT unique_ids_pk PRIMARY KEY (index_type)
-);
-
-CREATE TABLE binaries (
-  sha1       CHAR(40) NOT NULL,
-  md5        CHAR(32) NOT NULL,
-  bin_length BIGINT   NOT NULL,
-  CONSTRAINT binaries_pk PRIMARY KEY (sha1)
-);
-CREATE UNIQUE INDEX binaries_md5_idx ON binaries (md5);
-
-CREATE TABLE binary_blobs (
-  sha1 CHAR(40) NOT NULL,
-  data BYTEA,
-  CONSTRAINT binary_blobs_pk PRIMARY KEY (sha1)
-);
-
-CREATE TABLE nodes (
-  node_id       BIGINT        NOT NULL,
-  node_type     SMALLINT      NOT NULL,
-  repo          VARCHAR(64)   NOT NULL,
-  node_path     VARCHAR(1024) NOT NULL,
-  node_name     VARCHAR(255)  NOT NULL,
-  depth         SMALLINT      NOT NULL,
-  created       BIGINT        NOT NULL,
-  created_by    VARCHAR(64),
-  modified      BIGINT        NOT NULL,
-  modified_by   VARCHAR(64),
-  updated       BIGINT,
-  bin_length    BIGINT,
-  sha1_actual   CHAR(40),
-  sha1_original VARCHAR(1024),
-  md5_actual    CHAR(32),
-  md5_original  VARCHAR(1024),
-  CONSTRAINT nodes_pk PRIMARY KEY (node_id),
-  CONSTRAINT nodes_binaries_fk FOREIGN KEY (sha1_actual) REFERENCES binaries (sha1)
-);
-CREATE UNIQUE INDEX nodes_repo_path_name_idx ON nodes (repo, node_path, node_name);
-CREATE INDEX nodes_node_path_idx ON nodes (node_path);
-CREATE INDEX nodes_node_name_idx ON nodes (node_name);
-CREATE INDEX nodes_sha1_actual_idx ON nodes (sha1_actual);
-CREATE INDEX nodes_md5_actual_idx ON nodes (md5_actual);
-
-CREATE TABLE node_props (
-  prop_id    BIGINT NOT NULL,
-  node_id    BIGINT NOT NULL,
-  prop_key   VARCHAR(255),
-  prop_value VARCHAR(2048),
-  CONSTRAINT node_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT node_props_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-CREATE INDEX node_props_node_id_idx ON node_props (node_id);
-CREATE INDEX node_props_prop_key_idx ON node_props (prop_key);
-CREATE INDEX node_props_prop_value_idx ON node_props (prop_value);
-
-CREATE TABLE node_meta_infos (
-  node_id           BIGINT NOT NULL,
-  props_modified    BIGINT,
-  props_modified_by VARCHAR(64),
-  CONSTRAINT node_meta_infos_pk PRIMARY KEY (node_id),
-  CONSTRAINT node_meta_infos_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-
-CREATE TABLE watches (
-  watch_id BIGINT      NOT NULL,
-  node_id  BIGINT      NOT NULL,
-  username VARCHAR(64) NOT NULL,
-  since    BIGINT      NOT NULL,
-  CONSTRAINT watches_pk PRIMARY KEY (watch_id),
-  CONSTRAINT watches_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-CREATE INDEX watches_node_id_idx ON watches (node_id);
-
-CREATE TABLE stats (
-  node_id            BIGINT NOT NULL,
-  download_count     BIGINT,
-  last_downloaded    BIGINT,
-  last_downloaded_by VARCHAR(64),
-  CONSTRAINT stats_pk PRIMARY KEY (node_id),
-  CONSTRAINT stats_nodes_fk FOREIGN KEY (node_id) REFERENCES nodes (node_id)
-);
-
-CREATE TABLE indexed_archives (
-  archive_sha1        CHAR(40) NOT NULL,
-  indexed_archives_id BIGINT   NOT NULL,
-  CONSTRAINT indexed_archives_pk PRIMARY KEY (archive_sha1),
-  CONSTRAINT indexed_archives_id_uq UNIQUE (indexed_archives_id),
-  CONSTRAINT indexed_archives_binaries_fk FOREIGN KEY (archive_sha1) REFERENCES binaries (sha1)
-);
-
-CREATE TABLE archive_paths (
-  path_id    BIGINT NOT NULL,
-  entry_path VARCHAR(1024),
-  CONSTRAINT archive_paths_pk PRIMARY KEY (path_id)
-);
-CREATE UNIQUE INDEX archive_paths_path_idx ON archive_paths (entry_path);
-
-CREATE TABLE archive_names (
-  name_id    BIGINT NOT NULL,
-  entry_name VARCHAR(255),
-  CONSTRAINT archive_names_pk PRIMARY KEY (name_id)
-);
-CREATE UNIQUE INDEX archive_names_name_idx ON archive_names (entry_name);
-
-CREATE TABLE indexed_archives_entries (
-  indexed_archives_id BIGINT NOT NULL,
-  entry_path_id       BIGINT NOT NULL,
-  entry_name_id       BIGINT NOT NULL,
-  CONSTRAINT indexed_archives_entries_pk PRIMARY KEY (indexed_archives_id, entry_path_id, entry_name_id),
-  CONSTRAINT indexed_archives_id_fk FOREIGN KEY (indexed_archives_id) REFERENCES indexed_archives (indexed_archives_id),
-  CONSTRAINT entry_path_id_fk FOREIGN KEY (entry_path_id) REFERENCES archive_paths (path_id),
-  CONSTRAINT entry_name_id_fk FOREIGN KEY (entry_name_id) REFERENCES archive_names (name_id)
-);
-CREATE INDEX indexed_entries_path_idx ON indexed_archives_entries (entry_path_id);
-CREATE INDEX indexed_entries_name_idx ON indexed_archives_entries (entry_name_id);
-
-CREATE TABLE tasks (
-  task_type    VARCHAR(32)   NOT NULL,
-  task_context VARCHAR(1024) NOT NULL
-  -- CONSTRAINT pk_tasks PRIMARY KEY (task_type, task_context)
-);
-CREATE INDEX tasks_type_context_idx ON tasks (task_type, task_context);
-
-CREATE TABLE configs (
-  config_name VARCHAR(255) NOT NULL,
-  data        BYTEA        NOT NULL,
-  CONSTRAINT configs_pk PRIMARY KEY (config_name)
-);
-
-CREATE TABLE users (
-  user_id           BIGINT      NOT NULL,
-  username          VARCHAR(64) NOT NULL,
-  password          VARCHAR(128),
-  salt              VARCHAR(128),
-  email             VARCHAR(128),
-  gen_password_key  VARCHAR(128),
-  admin             SMALLINT,
-  enabled           SMALLINT,
-  updatable_profile SMALLINT,
-  realm             VARCHAR(255),
-  private_key       VARCHAR(512),
-  public_key        VARCHAR(255),
-  last_login_time   BIGINT,
-  last_login_ip     VARCHAR(42),
-  last_access_time  BIGINT,
-  last_access_ip    VARCHAR(42),
-  bintray_auth      VARCHAR(512),
-  CONSTRAINT users_pk PRIMARY KEY (user_id)
-);
-CREATE UNIQUE INDEX users_username_idx ON users (username);
-
-CREATE TABLE groups (
-  group_id         BIGINT      NOT NULL,
-  group_name       VARCHAR(64) NOT NULL,
-  description      VARCHAR(1024),
-  default_new_user SMALLINT,
-  realm            VARCHAR(255),
-  realm_attributes VARCHAR(512),
-  CONSTRAINT groups_pk PRIMARY KEY (group_id)
-);
-CREATE UNIQUE INDEX groups_group_name_idx ON groups (group_name);
-
-CREATE TABLE users_groups (
-  user_id  BIGINT NOT NULL,
-  group_id BIGINT NOT NULL,
-  realm    VARCHAR(255),
-  CONSTRAINT users_groups_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id),
-  CONSTRAINT users_groups_groups_fk FOREIGN KEY (group_id) REFERENCES groups (group_id)
-);
-CREATE UNIQUE INDEX users_groups_idx ON users_groups (user_id, group_id);
-
-CREATE TABLE permission_targets (
-  perm_target_id   BIGINT      NOT NULL,
-  perm_target_name VARCHAR(64) NOT NULL,
-  includes         VARCHAR(1024),
-  excludes         VARCHAR(1024),
-  CONSTRAINT permission_targets_pk PRIMARY KEY (perm_target_id)
-);
-CREATE UNIQUE INDEX permission_targets_name_idx ON permission_targets (perm_target_name);
-
-CREATE TABLE permission_target_repos (
-  perm_target_id BIGINT      NOT NULL,
-  repo_key       VARCHAR(64) NOT NULL,
-  CONSTRAINT permission_target_repos_fk FOREIGN KEY (perm_target_id) REFERENCES permission_targets (perm_target_id)
-);
-
-CREATE TABLE acls (
-  acl_id         BIGINT NOT NULL,
-  perm_target_id BIGINT,
-  modified       BIGINT,
-  modified_by    VARCHAR(64),
-  CONSTRAINT acls_pk PRIMARY KEY (acl_id),
-  CONSTRAINT acls_permission_targets_fk FOREIGN KEY (perm_target_id) REFERENCES permission_targets (perm_target_id)
-);
-CREATE INDEX acls_perm_target_id_idx ON acls (perm_target_id);
-
-CREATE TABLE aces (
-  ace_id   BIGINT   NOT NULL,
-  acl_id   BIGINT   NOT NULL,
-  mask     SMALLINT NOT NULL,
-  user_id  BIGINT,
-  group_id BIGINT,
-  CONSTRAINT aces_pk PRIMARY KEY (ace_id),
-  CONSTRAINT aces_acls_fk FOREIGN KEY (acl_id) REFERENCES acls (acl_id),
-  CONSTRAINT aces_users_fk FOREIGN KEY (user_id) REFERENCES users (user_id),
-  CONSTRAINT aces_groups_fk FOREIGN KEY (group_id) REFERENCES groups (group_id)
-);
-
-CREATE TABLE builds (
-  build_id     BIGINT       NOT NULL,
-  build_name   VARCHAR(255) NOT NULL,
-  build_number VARCHAR(255) NOT NULL,
-  build_date   BIGINT       NOT NULL,
-  ci_url       VARCHAR(1024),
-  created      BIGINT       NOT NULL,
-  created_by   VARCHAR(64),
-  modified     BIGINT,
-  modified_by  VARCHAR(64),
-  CONSTRAINT builds_pk PRIMARY KEY (build_id)
-);
-CREATE UNIQUE INDEX builds_name_number_date_idx ON builds (build_name, build_number, build_date);
-
-CREATE TABLE build_jsons (
-  build_id        BIGINT NOT NULL,
-  build_info_json BYTEA,
-  CONSTRAINT build_jsons_pk PRIMARY KEY (build_id),
-  CONSTRAINT build_jsons_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-
-CREATE TABLE build_promotions (
-  build_id          BIGINT      NOT NULL,
-  created           BIGINT      NOT NULL,
-  created_by        VARCHAR(64),
-  status            VARCHAR(64) NOT NULL,
-  repo              VARCHAR(64),
-  promotion_comment VARCHAR(1024),
-  ci_user           VARCHAR(64),
-  CONSTRAINT build_promotions_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE UNIQUE INDEX build_promotions_created_idx ON build_promotions (build_id, created);
-CREATE INDEX build_promotions_status_idx ON build_promotions (status);
-
-CREATE TABLE build_props (
-  prop_id    BIGINT NOT NULL,
-  build_id   BIGINT NOT NULL,
-  prop_key   VARCHAR(255),
-  prop_value VARCHAR(2048),
-  CONSTRAINT build_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT build_props_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE INDEX build_props_build_id_idx ON build_props (build_id);
-CREATE INDEX build_props_prop_key_idx ON build_props (prop_key);
-CREATE INDEX build_props_prop_value_idx ON build_props (prop_value);
-
-CREATE TABLE build_modules (
-  module_id      BIGINT        NOT NULL,
-  build_id       BIGINT        NOT NULL,
-  module_name_id VARCHAR(1024) NOT NULL,
-  CONSTRAINT build_modules_pk PRIMARY KEY (module_id),
-  CONSTRAINT build_modules_builds_fk FOREIGN KEY (build_id) REFERENCES builds (build_id)
-);
-CREATE INDEX build_modules_build_id_idx ON build_modules (build_id);
-
-CREATE TABLE build_artifacts (
-  artifact_id   BIGINT        NOT NULL,
-  module_id     BIGINT        NOT NULL,
-  artifact_name VARCHAR(1024) NOT NULL,
-  artifact_type VARCHAR(64),
-  sha1          CHAR(40),
-  md5           CHAR(32),
-  CONSTRAINT build_artifacts_pk PRIMARY KEY (artifact_id),
-  CONSTRAINT build_artifacts_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX build_artifacts_module_id_idx ON build_artifacts (module_id);
-CREATE INDEX build_artifacts_sha1_idx ON build_artifacts (sha1);
-CREATE INDEX build_artifacts_md5_idx ON build_artifacts (md5);
-
-CREATE TABLE build_dependencies (
-  dependency_id      BIGINT        NOT NULL,
-  module_id          BIGINT        NOT NULL,
-  dependency_name_id VARCHAR(1024) NOT NULL,
-  dependency_scopes  VARCHAR(1024),
-  dependency_type    VARCHAR(64),
-  sha1               CHAR(40),
-  md5                CHAR(32),
-  CONSTRAINT build_dependencies_pk PRIMARY KEY (dependency_id),
-  CONSTRAINT build_dependencies_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX build_dependencies_module_idx ON build_dependencies (module_id);
-CREATE INDEX build_dependencies_sha1_idx ON build_dependencies (sha1);
-CREATE INDEX build_dependencies_md5_idx ON build_dependencies (md5);
-
-CREATE TABLE module_props (
-  prop_id    BIGINT NOT NULL,
-  module_id  BIGINT NOT NULL,
-  prop_key   VARCHAR(255),
-  prop_value VARCHAR(2048),
-  CONSTRAINT module_props_pk PRIMARY KEY (prop_id),
-  CONSTRAINT module_props_modules_fk FOREIGN KEY (module_id) REFERENCES build_modules (module_id)
-);
-CREATE INDEX module_props_module_id_idx ON module_props (module_id);
-CREATE INDEX module_props_prop_key_idx ON module_props (prop_key);
-CREATE INDEX module_props_prop_value_idx ON module_props (prop_value);
diff --git a/storage/pom.xml b/storage/pom.xml
deleted file mode 100644
index 3b05928..0000000
--- a/storage/pom.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0          http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.artifactory</groupId>
-        <artifactId>artifactory-parent</artifactId>
-        <version>4.8.0</version>
-    </parent>
-
-    <artifactId>artifactory-storage-parent</artifactId>
-    <packaging>pom</packaging>
-    <name>Artifactory Storage Parent</name>
-
-    <modules>
-        <module>common</module>
-        <module>update</module>
-        <module>db</module>
-        <module>config</module>
-    </modules>
-
-</project>
diff --git a/storage/update/pom.xml b/storage/update/pom.xml
deleted file mode 100644
index 2533d8f..0000000
--- a/storage/update/pom.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <artifactId>artifactory-storage-parent</artifactId>
-        <groupId>org.artifactory</groupId>
-        <version>4.8.0</version>
-    </parent>
-
-    <artifactId>artifactory-update</artifactId>
-    <packaging>jar</packaging>
-    <name>Artifactory Update</name>
-
-    <description>Artifactory Update will manage the conversion of DB and xml configuration
-        from previous Artifactory versions 2.0.0+ to the current one.
-    </description>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-storage-common</artifactId>
-            <scope>runtime</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-config</artifactId>
-            <type>test-jar</type>
-        </dependency>
-    </dependencies>
-</project>
diff --git a/storage/update/src/main/java/org/artifactory/update/md/MetadataConverter.java b/storage/update/src/main/java/org/artifactory/update/md/MetadataConverter.java
deleted file mode 100644
index 12f51b9..0000000
--- a/storage/update/src/main/java/org/artifactory/update/md/MetadataConverter.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md;
-
-import org.artifactory.version.converter.XmlConverter;
-
-/**
- * @author freds
- * @date Nov 9, 2008
- */
-public interface MetadataConverter extends XmlConverter {
-    String getNewMetadataName();
-
-    /**
-     * @return The metadata type this converters supports.
-     */
-    MetadataType getSupportedMetadataType();
-}
diff --git a/storage/update/src/main/java/org/artifactory/update/md/MetadataConverterUtils.java b/storage/update/src/main/java/org/artifactory/update/md/MetadataConverterUtils.java
deleted file mode 100644
index 8d718a6..0000000
--- a/storage/update/src/main/java/org/artifactory/update/md/MetadataConverterUtils.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md;
-
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.util.XmlUtils;
-import org.jdom2.Document;
-import org.jdom2.Element;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author freds
- * @date Nov 11, 2008
- */
-public abstract class MetadataConverterUtils {
-    private static final String CREATED_BY = "createdBy";
-    private static final String MODIFIED_BY = "modifiedBy";
-    private static final String REPO_PATH = "repoPath";
-    private static final String REPO_KEY = "repoKey";
-    private static final String PATH = "path";
-    private static final String NAME = "name";
-    private static final String EXTENSION = "extension";
-    private static final String REL_PATH = "relPath";
-
-    private static final String[] EXTENSION_FIELDS = {"lastUpdated", MODIFIED_BY, CREATED_BY, "sha1", "md5"};
-
-    private MetadataConverterUtils() {
-        // utility class
-    }
-
-    public static List<Element> extractExtensionFields(Element rootElement) {
-        String modifiedBy = rootElement.getChildText(MODIFIED_BY);
-        List<Element> toMove = new ArrayList<>(EXTENSION_FIELDS.length);
-        for (String tagName : EXTENSION_FIELDS) {
-            Element element = rootElement.getChild(tagName);
-            if (element != null) {
-                toMove.add(element);
-                rootElement.removeChild(tagName);
-            } else {
-                if (CREATED_BY.equals(tagName)) {
-                    toMove.add(new Element(CREATED_BY).setText(modifiedBy));
-                }
-            }
-        }
-        return toMove;
-    }
-
-    public static void addNewContent(Element rootElement, RepoPath repoPath, List<Element> toMove) {
-        rootElement.addContent(new Element(NAME).setText(repoPath.getName()));
-        rootElement.addContent(new Element(REPO_PATH).
-                addContent(new Element(REPO_KEY).setText(repoPath.getRepoKey())).
-                addContent(new Element(PATH).setText(repoPath.getPath())));
-        rootElement.addContent(new Element(EXTENSION).addContent(toMove));
-    }
-
-    public static RepoPath extractRepoPath(Element rootElement) {
-        String repoKey = rootElement.getChildText(REPO_KEY);
-        String relPath = rootElement.getChildText(REL_PATH);
-        RepoPath repoPath = InternalRepoPathFactory.create(repoKey, relPath);
-        rootElement.removeChild(REPO_KEY);
-        rootElement.removeChild(REL_PATH);
-        return repoPath;
-    }
-
-    public static String convertString(MetadataConverter converter, String xmlContent) {
-        Document doc = XmlUtils.parse(xmlContent);
-        converter.convert(doc);
-        return XmlUtils.outputString(doc);
-    }
-}
diff --git a/storage/update/src/main/java/org/artifactory/update/md/MetadataType.java b/storage/update/src/main/java/org/artifactory/update/md/MetadataType.java
deleted file mode 100644
index 1629502..0000000
--- a/storage/update/src/main/java/org/artifactory/update/md/MetadataType.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md;
-
-/**
- * Enum of the metadata types.
- *
- * @author Yossi Shaul
- */
-public enum MetadataType {
-    file, folder, stats, watch
-}
diff --git a/storage/update/src/main/java/org/artifactory/update/md/MetadataVersion.java b/storage/update/src/main/java/org/artifactory/update/md/MetadataVersion.java
deleted file mode 100644
index 8a952cc..0000000
--- a/storage/update/src/main/java/org/artifactory/update/md/MetadataVersion.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md;
-
-import org.apache.commons.io.IOUtils;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.fs.MetadataEntryInfo;
-import org.artifactory.sapi.fs.MetadataReader;
-import org.artifactory.update.md.current.PassThroughMetadataReaderImpl;
-import org.artifactory.update.md.v125rc0.MdFileConverter;
-import org.artifactory.update.md.v125rc0.MdFolderConverter;
-import org.artifactory.update.md.v125rc0.MdStatsConverter;
-import org.artifactory.update.md.v125rc0.MetadataReader125;
-import org.artifactory.update.md.v130beta3.ArtifactoryFileConverter;
-import org.artifactory.update.md.v130beta3.ArtifactoryFolderConverter;
-import org.artifactory.update.md.v130beta3.MetadataReader130beta3;
-import org.artifactory.update.md.v130beta6.ChecksumsConverter;
-import org.artifactory.update.md.v130beta6.FolderAdditionalInfoNameConverter;
-import org.artifactory.update.md.v130beta6.MetadataReader130beta6;
-import org.artifactory.update.md.v230.BaseRepoPathClassConverter;
-import org.artifactory.update.md.v230.MetadataReader230;
-import org.artifactory.util.XmlUtils;
-import org.artifactory.version.ArtifactoryVersion;
-import org.artifactory.version.SubConfigElementVersion;
-import org.artifactory.version.VersionComparator;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author freds
- * @date Nov 11, 2008
- */
-public enum MetadataVersion implements MetadataReader, SubConfigElementVersion {
-    notSupported(ArtifactoryVersion.v122rc0, ArtifactoryVersion.v122, null),
-    v1(ArtifactoryVersion.v125rc0, ArtifactoryVersion.v130beta2, new MetadataReader125(),
-            new MdFolderConverter(), new MdFileConverter(), new MdStatsConverter()),
-    v2(ArtifactoryVersion.v130beta3, ArtifactoryVersion.v130beta5, new MetadataReader130beta3(),
-            new ArtifactoryFolderConverter(), new ArtifactoryFileConverter()),
-    v3(ArtifactoryVersion.v130beta6, ArtifactoryVersion.v130beta61, new MetadataReader130beta6(),
-            new FolderAdditionalInfoNameConverter(), new ChecksumsConverter()),
-    v4(ArtifactoryVersion.v130rc1, ArtifactoryVersion.v225, new PassThroughMetadataReaderImpl()),
-    v5(ArtifactoryVersion.v230, ArtifactoryVersion.v2341, new MetadataReader230(),
-            new BaseRepoPathClassConverter.FileRepoPathClassConverter(),
-            new BaseRepoPathClassConverter.FolderRepoPathClassConverter(),
-            new BaseRepoPathClassConverter.WatchersRepoPathClassConverter()),
-    v6(ArtifactoryVersion.v240, ArtifactoryVersion.getCurrent(), new PassThroughMetadataReaderImpl());
-
-    private static final Logger log = LoggerFactory.getLogger(MetadataVersion.class);
-
-    private static final String FILE_MD_NAME_V130_BETA_3 = ArtifactoryFileConverter.ARTIFACTORY_FILE + ".xml";
-    private static final String FOLDER_MD_NAME_V130_BETA_3 = ArtifactoryFolderConverter.ARTIFACTORY_FOLDER + ".xml";
-    private static final String FILE_MD_NAME_V130_BETA_6 = ChecksumsConverter.ARTIFACTORY_FILE + ".xml";
-    private static final String FOLDER_MD_NAME_V130_BETA_6 =
-            FolderAdditionalInfoNameConverter.ARTIFACTORY_FOLDER + ".xml";
-
-    private final VersionComparator comparator;
-    private final MetadataReader delegate;
-    private final MetadataConverter[] converters;
-
-    /**
-     * @param from       The artifactory version this metadata format was first used in
-     * @param until      The latest artifactory version this metadata format was valid
-     * @param converters A list of converters to use to convert the metadata from this version range to the next
-     */
-    MetadataVersion(ArtifactoryVersion from, ArtifactoryVersion until, MetadataReader delegate,
-            MetadataConverter... converters) {
-        this.comparator = new VersionComparator(from, until);
-        this.delegate = delegate;
-        this.converters = converters;
-    }
-
-    public boolean isCurrent() {
-        return comparator.isCurrent();
-    }
-
-    public boolean supports(ArtifactoryVersion version) {
-        return comparator.supports(version);
-    }
-
-    public MetadataConverter[] getConverters() {
-        return converters;
-    }
-
-    @Override
-    public VersionComparator getComparator() {
-        return comparator;
-    }
-
-    @Override
-    public List<MetadataEntryInfo> getMetadataEntries(File file, MutableStatusHolder status) {
-        if (delegate == null) {
-            throw new IllegalStateException("Metadata Import from version older than 1.2.2 is not supported!");
-        }
-        // The first delegate provide the base list of metadata entries to convert
-        List<MetadataEntryInfo> metadataEntries = delegate.getMetadataEntries(file, status);
-        if (!isCurrent()) {
-            // All the version above this should be called to convert the metadata entries
-            List<MetadataEntryInfo> result = new ArrayList<>(metadataEntries.size());
-            MetadataVersion[] values = values();
-            for (MetadataEntryInfo metadataEntry : metadataEntries) {
-                for (int i = ordinal() + 1; i < values.length; i++) {
-                    MetadataVersion value = values[i];
-                    metadataEntry = value.convertMetadataEntry(metadataEntry);
-                }
-                result.add(metadataEntry);
-            }
-            return result;
-        } else {
-            return metadataEntries;
-        }
-    }
-
-    @Override
-    public MetadataEntryInfo convertMetadataEntry(MetadataEntryInfo metadataEntryInfo) {
-        if (delegate == null) {
-            throw new IllegalStateException("Metadata Import from version older than 1.2.2 is not supported!");
-        }
-        return delegate.convertMetadataEntry(metadataEntryInfo);
-    }
-
-    /**
-     * Find the version from the format of the metadata folder
-     *
-     * @param metadataFolder
-     */
-    public static MetadataVersion findVersion(File metadataFolder) {
-        if (!metadataFolder.exists()) {
-            throw new IllegalArgumentException(
-                    "Cannot find metadata version of non existent file " + metadataFolder.getAbsolutePath());
-        }
-        if (!metadataFolder.isDirectory()) {
-            // For v125rc0 to v130beta2, the folder is actually a file
-            return v1;
-        }
-        File[] mdFiles = metadataFolder.listFiles();
-        for (File mdFile : mdFiles) {
-            String mdFileName = mdFile.getName();
-            if (mdFileName.equalsIgnoreCase(FILE_MD_NAME_V130_BETA_3) ||
-                    mdFileName.equalsIgnoreCase(FOLDER_MD_NAME_V130_BETA_3)) {
-                return v2;
-            }
-            if (mdFileName.equalsIgnoreCase(FILE_MD_NAME_V130_BETA_6) ||
-                    mdFileName.equalsIgnoreCase(FOLDER_MD_NAME_V130_BETA_6)) {
-                // here we don't know if it's beta6 or rc1+ so we must read the xml and decide by the content
-                // must improve this in the future.
-                Document doc;
-                try {
-                    doc = buildDocFromFile(mdFile);
-                } catch (Exception e) {
-                    // log and try the next file
-                    log.warn("Failed to read file '" + mdFile + "' as xml", e);
-                    continue;
-                }
-                Element root = doc.getRootElement();
-                Element extension = root.getChild("extension");
-                if (extension != null) {
-                    return v3;
-                } else {
-                    Element repoPath = root.getChild("repoPath");
-                    if (repoPath.getAttribute("class") != null) {
-                        return v5;
-                    }
-                    return v6;
-                }
-            }
-        }
-        log.warn("Metadata folder " + metadataFolder.getAbsolutePath() +
-                " does not contain any recognizable metadata files! Trying to use the latest metadata layout.");
-        return v6;
-
-    }
-
-    private static Document buildDocFromFile(File file) throws Exception {
-        InputStream in = new FileInputStream(file);
-        try {
-            return XmlUtils.parse(in);
-        } finally {
-            IOUtils.closeQuietly(in);
-        }
-    }
-
-    public static MetadataVersion findVersion(ArtifactoryVersion version) {
-        MetadataVersion result = null;
-        MetadataVersion[] metadataVersions = values();
-        for (int i = metadataVersions.length - 1; i >= 0; i--) {
-            MetadataVersion metadataVersion = metadataVersions[i];
-            if (metadataVersion.supports(version)) {
-                result = metadataVersion;
-                break;
-            }
-        }
-        if (result == null || result == notSupported) {
-            throw new IllegalStateException("Metadata import from Artifactory version " + version +
-                    " is not supported!");
-        }
-        return result;
-    }
-}
diff --git a/storage/update/src/main/java/org/artifactory/update/md/current/ConverterMetadataReaderImpl.java b/storage/update/src/main/java/org/artifactory/update/md/current/ConverterMetadataReaderImpl.java
deleted file mode 100644
index 7d8e669..0000000
--- a/storage/update/src/main/java/org/artifactory/update/md/current/ConverterMetadataReaderImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md.current;
-
-import org.artifactory.fs.MetadataEntryInfo;
-import org.artifactory.update.md.MetadataConverter;
-import org.artifactory.update.md.MetadataConverterUtils;
-import org.artifactory.update.md.MetadataType;
-
-/**
- * Date: 11/7/11
- * Time: 9:51 AM
- *
- * @author Fred Simon
- */
-public abstract class ConverterMetadataReaderImpl extends PassThroughMetadataReaderImpl {
-
-    @Override
-    protected MetadataEntryInfo createMetadataEntry(String metadataName, String xmlContent) {
-        MetadataType metadataType = getMetadataTypeForName(metadataName);
-        if (metadataType != null) {
-            for (MetadataConverter converter : getConverters()) {
-                if (converter.getSupportedMetadataType() == metadataType) {
-                    xmlContent = MetadataConverterUtils.convertString(converter, xmlContent);
-                    metadataName = converter.getNewMetadataName();
-                }
-            }
-        }
-        return createME(metadataName, xmlContent);
-    }
-
-    protected abstract MetadataConverter[] getConverters();
-
-    protected abstract MetadataType getMetadataTypeForName(String metadataName);
-
-    @Override
-    public final MetadataEntryInfo convertMetadataEntry(MetadataEntryInfo metadataEntryInfo) {
-        // Enforce conversion
-        return createMetadataEntry(metadataEntryInfo.getMetadataName(), metadataEntryInfo.getXmlContent());
-    }
-}
diff --git a/storage/update/src/main/java/org/artifactory/update/md/current/PassThroughMetadataReaderImpl.java b/storage/update/src/main/java/org/artifactory/update/md/current/PassThroughMetadataReaderImpl.java
deleted file mode 100644
index 764911f..0000000
--- a/storage/update/src/main/java/org/artifactory/update/md/current/PassThroughMetadataReaderImpl.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md.current;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.filefilter.SuffixFileFilter;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.MetadataEntryInfo;
-import org.artifactory.sapi.fs.MetadataReader;
-import org.artifactory.util.Files;
-import org.artifactory.util.PathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * @author freds
- * @date Nov 13, 2008
- */
-public class PassThroughMetadataReaderImpl implements MetadataReader {
-    private static final Logger log = LoggerFactory.getLogger(PassThroughMetadataReaderImpl.class);
-
-    @Override
-    public List<MetadataEntryInfo> getMetadataEntries(File file, MutableStatusHolder status) {
-        if (!file.isDirectory()) {
-            status.error("Expecting a directory but got file: " + file.getAbsolutePath(), log);
-            return Collections.emptyList();
-        }
-
-        String[] metadataFileNames = file.list(new SuffixFileFilter(".xml"));
-        if (metadataFileNames == null) {
-            status.error("Cannot read list of metadata files from " + file.getAbsolutePath() + ": "
-                    + Files.readFailReason(file), log);
-            return Collections.emptyList();
-        }
-
-        //Import all the xml files within the metadata folder
-        List<MetadataEntryInfo> result = Lists.newArrayListWithCapacity(metadataFileNames.length);
-        for (String metadataFileName : metadataFileNames) {
-            File metadataFile = new File(file, metadataFileName);
-            String extension = PathUtils.getExtension(metadataFileName);
-            if (!verify(status, metadataFileName, metadataFile, extension)) {
-                continue;
-            }
-            status.debug("Importing metadata from '" + metadataFile.getPath() + "'.", log);
-
-            try {
-                // metadata name is the name of the file without the extension
-                String metadataName = PathUtils.stripExtension(metadataFileName);
-                String xmlContent = FileUtils.readFileToString(metadataFile, "utf-8");
-                MetadataEntryInfo metadataEntry = createMetadataEntry(metadataName, xmlContent);
-                result.add(metadataEntry);
-            } catch (Exception e) {
-                status.error("Failed to import xml metadata from '" +
-                        metadataFile.getAbsolutePath() + "'.", e, log);
-            }
-        }
-        return result;
-    }
-
-    private boolean verify(MutableStatusHolder status, String metadataFileName, File metadataFile, String extension) {
-        if (metadataFile.exists() && metadataFile.isDirectory()) {
-            //Sanity check
-            status.warn("Skipping xml metadata import from '" + metadataFile.getAbsolutePath() +
-                    "'. Expected a file but encountered a folder.", log);
-            return false;
-        }
-        if (extension.length() + 1 >= metadataFileName.length()) {
-            // No name for file, just extension
-            status.warn("Skipping xml metadata import from '" + metadataFile.getAbsolutePath() +
-                    "'. The file does not have a name.", log);
-            return false;
-        }
-        return true;
-    }
-
-    protected MetadataEntryInfo createMetadataEntry(String metadataName, String xmlContent) {
-        return createME(metadataName, xmlContent);
-    }
-
-    @Override
-    public MetadataEntryInfo convertMetadataEntry(MetadataEntryInfo metadataEntryInfo) {
-        // current doesn't need any conversions...
-        return metadataEntryInfo;
-    }
-
-    public static MetadataEntryInfo createME(String metadataName, String xmlContent) {
-        return InfoFactoryHolder.get().createMetadataEntry(metadataName, xmlContent);
-    }
-}
diff --git a/storage/update/src/main/java/org/artifactory/update/md/v125rc0/MdFileConverter.java b/storage/update/src/main/java/org/artifactory/update/md/v125rc0/MdFileConverter.java
deleted file mode 100644
index 0ad6600..0000000
--- a/storage/update/src/main/java/org/artifactory/update/md/v125rc0/MdFileConverter.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md.v125rc0;
-
-import org.artifactory.repo.RepoPath;
-import org.artifactory.update.md.MetadataConverter;
-import org.artifactory.update.md.MetadataConverterUtils;
-import org.artifactory.update.md.MetadataType;
-import org.jdom2.Document;
-import org.jdom2.Element;
-
-import java.util.List;
-
-/**
- * @author freds
- * @date Nov 11, 2008
- */
-public class MdFileConverter implements MetadataConverter {
-    @Override
-    public String getNewMetadataName() {
-        return "artifactory-file";
-    }
-
-    @Override
-    public MetadataType getSupportedMetadataType() {
-        return MetadataType.file;
-    }
-
-    @Override
-    public void convert(Document doc) {
-        Element rootElement = doc.getRootElement();
-        rootElement.setName(getNewMetadataName());
-        RepoPath repoPath = MetadataConverterUtils.extractRepoPath(rootElement);
-        List<Element> toMove = MetadataConverterUtils.extractExtensionFields(rootElement);
-        MetadataConverterUtils.addNewContent(rootElement, repoPath, toMove);
-        // Not used anymore
-        rootElement.removeChild(MdFolderConverter.ARTIFACTORY_NAME);
-        rootElement.removeChild("xmlAware");
-        rootElement.removeChild("downloadCount");
-    }
-}
diff --git a/storage/update/src/main/java/org/artifactory/update/md/v125rc0/MdFolderConverter.java b/storage/update/src/main/java/org/artifactory/update/md/v125rc0/MdFolderConverter.java
deleted file mode 100644
index fd45cc5..0000000
--- a/storage/update/src/main/java/org/artifactory/update/md/v125rc0/MdFolderConverter.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md.v125rc0;
-
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.update.md.MetadataConverter;
-import org.artifactory.update.md.MetadataConverterUtils;
-import org.artifactory.update.md.MetadataType;
-import org.jdom2.Document;
-import org.jdom2.Element;
-
-import java.util.List;
-
-/**
- * @author freds
- * @date Nov 11, 2008
- */
-public class MdFolderConverter implements MetadataConverter {
-    static final String ARTIFACTORY_NAME = "artifactoryName";
-
-    @Override
-    public String getNewMetadataName() {
-        return "artifactory-folder";
-    }
-
-    @Override
-    public MetadataType getSupportedMetadataType() {
-        return MetadataType.folder;
-    }
-
-    @Override
-    public void convert(Document doc) {
-        Element rootElement = doc.getRootElement();
-        rootElement.setName(getNewMetadataName());
-        RepoPath repoPath = MetadataConverterUtils.extractRepoPath(rootElement);
-        // In this version the relPath is the father and name need to be added
-        if (rootElement.getChild(ARTIFACTORY_NAME) != null) {
-            String name = rootElement.getChildText(ARTIFACTORY_NAME);
-            repoPath = InternalRepoPathFactory.create(repoPath, name);
-        }
-        List<Element> toMove = MetadataConverterUtils.extractExtensionFields(rootElement);
-        MetadataConverterUtils.addNewContent(rootElement, repoPath, toMove);
-        // Not used anymore
-        rootElement.removeChild(ARTIFACTORY_NAME);
-    }
-}
diff --git a/storage/update/src/main/java/org/artifactory/update/md/v125rc0/MdStatsConverter.java b/storage/update/src/main/java/org/artifactory/update/md/v125rc0/MdStatsConverter.java
deleted file mode 100644
index a98bc9e..0000000
--- a/storage/update/src/main/java/org/artifactory/update/md/v125rc0/MdStatsConverter.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md.v125rc0;
-
-import org.artifactory.update.md.MetadataConverter;
-import org.artifactory.update.md.MetadataType;
-import org.jdom2.Document;
-import org.jdom2.Element;
-
-/**
- * Extracts the stats info (download count) from an old file metadata - before v1.3.0-beta-3.
- *
- * @author Yossi Shaul
- */
-public class MdStatsConverter implements MetadataConverter {
-    private static final String STATS_NAME = "artifactory.stats";
-
-    @Override
-    public String getNewMetadataName() {
-        return STATS_NAME;
-    }
-
-    @Override
-    public MetadataType getSupportedMetadataType() {
-        return MetadataType.stats;
-    }
-
-    @Override
-    public void convert(Document doc) {
-        Element root = doc.getRootElement();
-        Element downloadCount = root.getChild("downloadCount");
-        if (downloadCount == null) {
-            downloadCount = new Element("downloadCount");
-            downloadCount.setText("0");
-        }
-        // rename the root to the stats name
-        root.setName(STATS_NAME);
-        // remove all childer
-        root.removeContent();
-        // add the download count
-        root.addContent(downloadCount);
-    }
-}
diff --git a/storage/update/src/main/java/org/artifactory/update/md/v125rc0/MetadataReader125.java b/storage/update/src/main/java/org/artifactory/update/md/v125rc0/MetadataReader125.java
deleted file mode 100644
index 63c05b5..0000000
--- a/storage/update/src/main/java/org/artifactory/update/md/v125rc0/MetadataReader125.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md.v125rc0;
-
-import org.apache.commons.io.FileUtils;
-import org.artifactory.common.MutableStatusHolder;
-import org.artifactory.fs.MetadataEntryInfo;
-import org.artifactory.sapi.fs.MetadataReader;
-import org.artifactory.update.md.MetadataConverter;
-import org.artifactory.update.md.MetadataConverterUtils;
-import org.artifactory.update.md.current.PassThroughMetadataReaderImpl;
-import org.artifactory.update.md.v130beta6.ChecksumsConverter;
-import org.artifactory.update.md.v130beta6.FolderAdditionalInfoNameConverter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * @author freds
- * @date Nov 13, 2008
- */
-public class MetadataReader125 implements MetadataReader {
-    private static final Logger log = LoggerFactory.getLogger(MetadataReader125.class);
-    private final MetadataConverter folderConverter = new MdFolderConverter();
-    private final MetadataConverter fileConverter = new MdFileConverter();
-    private final MetadataConverter statsConverter = new MdStatsConverter();
-
-    @Override
-    public List<MetadataEntryInfo> getMetadataEntries(File file, MutableStatusHolder status) {
-        if (!file.isFile()) {
-            status.error("Expecting a file but got a directory: " + file.getAbsolutePath(), log);
-            return Collections.emptyList();
-        }
-        List<MetadataEntryInfo> result = new ArrayList<>();
-        try {
-            String xmlContent = FileUtils.readFileToString(file, "utf-8");
-            if (xmlContent.contains("<file>")) {
-                // convert to file metadata
-                String fileXmlContent = MetadataConverterUtils.convertString(fileConverter, xmlContent);
-                ChecksumsConverter checksumsConverter = new ChecksumsConverter();
-                fileXmlContent = MetadataConverterUtils.convertString(checksumsConverter, fileXmlContent);
-                String fileMetadataName = checksumsConverter.getNewMetadataName();
-                result.add(PassThroughMetadataReaderImpl.createME(fileMetadataName, fileXmlContent));
-
-                // get the stats data from the original xml content
-                result.add(convert(xmlContent, statsConverter));
-            } else if (xmlContent.contains("<folder>")) {
-                xmlContent = MetadataConverterUtils.convertString(this.folderConverter, xmlContent);
-                FolderAdditionalInfoNameConverter folderConverter = new FolderAdditionalInfoNameConverter();
-                xmlContent = MetadataConverterUtils.convertString(folderConverter, xmlContent);
-                String fileMetadataName = folderConverter.getNewMetadataName();
-                result.add(PassThroughMetadataReaderImpl.createME(fileMetadataName, xmlContent));
-            } else {
-                status.error("Failed to import xml metadata from '" +
-                        file.getAbsolutePath() + "' since it does not contain any known XML tag <file> <folder>.",
-                        log);
-            }
-        } catch (IOException e) {
-            status.error("Failed to import xml metadata from '" +
-                    file.getAbsolutePath() + "'.", e, log);
-        }
-        return result;
-    }
-
-    private MetadataEntryInfo convert(String xmlContent, MetadataConverter converter) {
-        MetadataEntryInfo metadataEntry;
-        xmlContent = MetadataConverterUtils.convertString(converter, xmlContent);
-        metadataEntry = PassThroughMetadataReaderImpl.createME(converter.getNewMetadataName(), xmlContent);
-        return metadataEntry;
-    }
-
-    @Override
-    public MetadataEntryInfo convertMetadataEntry(MetadataEntryInfo metadataEntryInfo) {
-        throw new IllegalStateException("Cannot convert the root metadata reader " + this);
-    }
-}
\ No newline at end of file
diff --git a/storage/update/src/main/java/org/artifactory/update/md/v130beta3/ArtifactoryFileConverter.java b/storage/update/src/main/java/org/artifactory/update/md/v130beta3/ArtifactoryFileConverter.java
deleted file mode 100644
index 2fdddff..0000000
--- a/storage/update/src/main/java/org/artifactory/update/md/v130beta3/ArtifactoryFileConverter.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md.v130beta3;
-
-import org.artifactory.mime.MimeType;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.update.md.MetadataConverter;
-import org.artifactory.update.md.MetadataConverterUtils;
-import org.artifactory.update.md.MetadataType;
-import org.jdom2.Document;
-import org.jdom2.Element;
-
-import java.util.List;
-
-/**
- * @author freds
- * @date Nov 9, 2008
- */
-public class ArtifactoryFileConverter implements MetadataConverter {
-    public static final String ARTIFACTORY_FILE = "artifactory.file";
-
-    @Override
-    public String getNewMetadataName() {
-        return "artifactory-file";
-    }
-
-    @Override
-    public MetadataType getSupportedMetadataType() {
-        return MetadataType.file;
-    }
-
-    @Override
-    public void convert(Document doc) {
-        Element rootElement = doc.getRootElement();
-        if (rootElement.getName().equals(getNewMetadataName())) {
-            // Already done
-            return;
-        }
-        rootElement.setName(getNewMetadataName());
-        RepoPath repoPath = MetadataConverterUtils.extractRepoPath(rootElement);
-        List<Element> toMove = MetadataConverterUtils.extractExtensionFields(rootElement);
-        MetadataConverterUtils.addNewContent(rootElement, repoPath, toMove);
-        MimeType ct = NamingUtils.getMimeType(repoPath.getName());
-        rootElement.removeChild("mimeType");
-        rootElement.addContent(new Element("mimeType").setText(ct.getType()));
-    }
-
-}
diff --git a/storage/update/src/main/java/org/artifactory/update/md/v130beta3/ArtifactoryFolderConverter.java b/storage/update/src/main/java/org/artifactory/update/md/v130beta3/ArtifactoryFolderConverter.java
deleted file mode 100644
index bdd50c0..0000000
--- a/storage/update/src/main/java/org/artifactory/update/md/v130beta3/ArtifactoryFolderConverter.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md.v130beta3;
-
-import org.artifactory.repo.RepoPath;
-import org.artifactory.update.md.MetadataConverter;
-import org.artifactory.update.md.MetadataConverterUtils;
-import org.artifactory.update.md.MetadataType;
-import org.jdom2.Document;
-import org.jdom2.Element;
-
-import java.util.List;
-
-/**
- * @author freds
- * @date Nov 9, 2008
- */
-public class ArtifactoryFolderConverter implements MetadataConverter {
-    public static final String ARTIFACTORY_FOLDER = "artifactory.folder";
-
-    @Override
-    public String getNewMetadataName() {
-        return "artifactory-folder";
-    }
-
-    @Override
-    public MetadataType getSupportedMetadataType() {
-        return MetadataType.folder;
-    }
-
-    @Override
-    public void convert(Document doc) {
-        Element rootElement = doc.getRootElement();
-        rootElement.setName(getNewMetadataName());
-        RepoPath repoPath = MetadataConverterUtils.extractRepoPath(rootElement);
-        List<Element> toMove = MetadataConverterUtils.extractExtensionFields(rootElement);
-        MetadataConverterUtils.addNewContent(rootElement, repoPath, toMove);
-    }
-}
diff --git a/storage/update/src/main/java/org/artifactory/update/md/v130beta3/MetadataReader130beta3.java b/storage/update/src/main/java/org/artifactory/update/md/v130beta3/MetadataReader130beta3.java
deleted file mode 100644
index 3db49de..0000000
--- a/storage/update/src/main/java/org/artifactory/update/md/v130beta3/MetadataReader130beta3.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md.v130beta3;
-
-import org.artifactory.update.md.MetadataConverter;
-import org.artifactory.update.md.MetadataType;
-import org.artifactory.update.md.MetadataVersion;
-import org.artifactory.update.md.current.ConverterMetadataReaderImpl;
-
-/**
- * @author freds
- * @date Nov 13, 2008
- */
-public class MetadataReader130beta3 extends ConverterMetadataReaderImpl {
-
-    @Override
-    protected MetadataConverter[] getConverters() {
-        return MetadataVersion.v2.getConverters();
-    }
-
-    @Override
-    protected MetadataType getMetadataTypeForName(String metadataName) {
-        MetadataType metadataType;
-        if (ArtifactoryFileConverter.ARTIFACTORY_FILE.equals(metadataName)) {
-            metadataType = MetadataType.file;
-        } else if (ArtifactoryFolderConverter.ARTIFACTORY_FOLDER.equals(metadataName)) {
-            metadataType = MetadataType.folder;
-        } else {
-            metadataType = null;
-        }
-        return metadataType;
-    }
-}
diff --git a/storage/update/src/main/java/org/artifactory/update/md/v130beta6/ChecksumsConverter.java b/storage/update/src/main/java/org/artifactory/update/md/v130beta6/ChecksumsConverter.java
deleted file mode 100644
index af8a2a7..0000000
--- a/storage/update/src/main/java/org/artifactory/update/md/v130beta6/ChecksumsConverter.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md.v130beta6;
-
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.update.md.MetadataConverter;
-import org.artifactory.update.md.MetadataType;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Converts artifactory-file.xml from version 1.3.0-beta-6 to 1.3.0-rc1. The extension node needs to be renamed and the
- * checksums are organized differently.
- *
- * @author Yossi Shaul
- */
-public class ChecksumsConverter implements MetadataConverter {
-    private static final Logger log = LoggerFactory.getLogger(ChecksumsConverter.class);
-    public static final String ARTIFACTORY_FILE = "artifactory-file";
-
-    @Override
-    public void convert(Document doc) {
-        Element root = doc.getRootElement();
-
-        Element extension = root.getChild("extension");
-
-        // rename the extensions to additionalInfo
-        extension.setName("additionalInfo");
-
-        // now get the sha1 and md5 values
-
-        Element sha1Node = extension.getChild("sha1");
-        String sha1 = null;
-        if (sha1Node != null) {
-            sha1 = sha1Node.getValue();
-            extension.removeContent(sha1Node);
-        } else {
-            log.debug("SHA1 checksum not found, setting it to {}", sha1);
-        }
-
-        Element md5Node = extension.getChild("md5");
-        String md5 = null;
-        if (md5Node != null) {
-            md5 = md5Node.getValue();
-            extension.removeContent(md5Node);
-        } else {
-            log.debug("MD5 checksum not found, setting it to {}", md5);
-        }
-
-        // create the new checksums nodes
-        Element checksumsInfo = new Element("checksumsInfo");
-        extension.addContent(checksumsInfo);
-        Element checksums = new Element("checksums");
-        checksumsInfo.addContent(checksums);
-        addChecksum(checksums, ChecksumType.sha1, sha1);
-        addChecksum(checksums, ChecksumType.md5, md5);
-    }
-
-    private void addChecksum(Element checksums, ChecksumType type, String checksum) {
-        Element checksumElement = new Element("checksum");
-        checksumElement.addContent(createTextElement("type", type.name()));
-        checksumElement.addContent(createTextElement("original", ChecksumInfo.TRUSTED_FILE_MARKER));
-        checksumElement.addContent(createTextElement("actual", checksum));
-        checksums.addContent(checksumElement);
-    }
-
-    private Element createTextElement(String elementName, String value) {
-        Element element = new Element(elementName);
-        element.setText(value);
-        return element;
-    }
-
-    @Override
-    public String getNewMetadataName() {
-        return ARTIFACTORY_FILE;
-    }
-
-    @Override
-    public MetadataType getSupportedMetadataType() {
-        return MetadataType.file;
-    }
-
-}
diff --git a/storage/update/src/main/java/org/artifactory/update/md/v130beta6/FolderAdditionalInfoNameConverter.java b/storage/update/src/main/java/org/artifactory/update/md/v130beta6/FolderAdditionalInfoNameConverter.java
deleted file mode 100644
index f36f801..0000000
--- a/storage/update/src/main/java/org/artifactory/update/md/v130beta6/FolderAdditionalInfoNameConverter.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md.v130beta6;
-
-import org.artifactory.update.md.MetadataConverter;
-import org.artifactory.update.md.MetadataType;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Converts FolderInfo from version 1.3.0-beta-6. Just renaming extension to additionalInfo.
- *
- * @author Yossi Shaul
- */
-public class FolderAdditionalInfoNameConverter implements MetadataConverter {
-    private static final Logger log = LoggerFactory.getLogger(FolderAdditionalInfoNameConverter.class);
-    public static final String ARTIFACTORY_FOLDER = "artifactory-folder";
-
-    @Override
-    public void convert(Document doc) {
-        Element root = doc.getRootElement();
-        Element extension = root.getChild("extension");
-        if (extension != null) {
-            extension.setName("additionalInfo");
-        } else {
-            log.warn("Folder info extension node not found");
-        }
-    }
-
-    @Override
-    public String getNewMetadataName() {
-        // metadata name not changed
-        return ARTIFACTORY_FOLDER;
-    }
-
-    @Override
-    public MetadataType getSupportedMetadataType() {
-        return MetadataType.folder;
-    }
-
-}
diff --git a/storage/update/src/main/java/org/artifactory/update/md/v130beta6/MetadataReader130beta6.java b/storage/update/src/main/java/org/artifactory/update/md/v130beta6/MetadataReader130beta6.java
deleted file mode 100644
index fad1ced..0000000
--- a/storage/update/src/main/java/org/artifactory/update/md/v130beta6/MetadataReader130beta6.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md.v130beta6;
-
-import org.artifactory.update.md.MetadataConverter;
-import org.artifactory.update.md.MetadataType;
-import org.artifactory.update.md.MetadataVersion;
-import org.artifactory.update.md.current.ConverterMetadataReaderImpl;
-
-/**
- * Reads and converts metadata from version 1.3.0-beta-6.
- *
- * @author Yossi Shaul
- */
-public class MetadataReader130beta6 extends ConverterMetadataReaderImpl {
-    @Override
-    protected MetadataType getMetadataTypeForName(String metadataName) {
-        MetadataType metadataType;
-        if ("artifactory-file".equals(metadataName)) {
-            metadataType = MetadataType.file;
-        } else if ("artifactory-folder".equals(metadataName)) {
-            metadataType = MetadataType.folder;
-        } else {
-            metadataType = null;
-        }
-        return metadataType;
-    }
-
-    @Override
-    protected MetadataConverter[] getConverters() {
-        return MetadataVersion.v3.getConverters();
-    }
-}
diff --git a/storage/update/src/main/java/org/artifactory/update/md/v230/BaseRepoPathClassConverter.java b/storage/update/src/main/java/org/artifactory/update/md/v230/BaseRepoPathClassConverter.java
deleted file mode 100644
index deb4fff..0000000
--- a/storage/update/src/main/java/org/artifactory/update/md/v230/BaseRepoPathClassConverter.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md.v230;
-
-import org.artifactory.update.md.MetadataConverter;
-import org.artifactory.update.md.MetadataType;
-import org.jdom2.Document;
-import org.jdom2.Element;
-
-/**
- * Converts file and folder info metadata created between versions 2.3.0-2.3.4.1.
- * They contained repo path tags which had the class attribute by mistake (caused by splitting the repo path to a class
- * and impl).
- *
- * @author Noam Y. Tenne
- */
-public abstract class BaseRepoPathClassConverter implements MetadataConverter {
-
-    @Override
-    public void convert(Document doc) {
-        Element rootElement = doc.getRootElement();
-        Element repoPath = rootElement.getChild("repoPath");
-        if (repoPath != null) {
-            if (repoPath.getAttribute("class") != null) {
-                repoPath.removeAttribute("class");
-            }
-        }
-    }
-
-    public static class FileRepoPathClassConverter extends BaseRepoPathClassConverter {
-
-        @Override
-        public String getNewMetadataName() {
-            return "artifactory-file";
-        }
-
-        @Override
-        public MetadataType getSupportedMetadataType() {
-            return MetadataType.file;
-        }
-    }
-
-    public static class FolderRepoPathClassConverter extends BaseRepoPathClassConverter {
-
-        @Override
-        public String getNewMetadataName() {
-            return "artifactory-folder";
-        }
-
-        @Override
-        public MetadataType getSupportedMetadataType() {
-            return MetadataType.folder;
-        }
-    }
-
-    public static class WatchersRepoPathClassConverter extends BaseRepoPathClassConverter {
-
-        @Override
-        public String getNewMetadataName() {
-            return "watchers";
-        }
-
-        @Override
-        public MetadataType getSupportedMetadataType() {
-            return MetadataType.watch;
-        }
-    }
-}
\ No newline at end of file
diff --git a/storage/update/src/main/java/org/artifactory/update/md/v230/MetadataReader230.java b/storage/update/src/main/java/org/artifactory/update/md/v230/MetadataReader230.java
deleted file mode 100644
index 05549b9..0000000
--- a/storage/update/src/main/java/org/artifactory/update/md/v230/MetadataReader230.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md.v230;
-
-import org.artifactory.update.md.MetadataConverter;
-import org.artifactory.update.md.MetadataType;
-import org.artifactory.update.md.MetadataVersion;
-import org.artifactory.update.md.current.ConverterMetadataReaderImpl;
-
-/**
- * Reads and converts metadata from version 2.3.0.
- *
- * @author Noam Y. Tenne
- */
-public class MetadataReader230 extends ConverterMetadataReaderImpl {
-    @Override
-    protected MetadataType getMetadataTypeForName(String metadataName) {
-        if ("artifactory-file".equals(metadataName)) {
-            return MetadataType.file;
-        } else if ("artifactory-folder".equals(metadataName)) {
-            return MetadataType.folder;
-        } else if ("watchers".equals(metadataName)) {
-            return MetadataType.watch;
-        } else {
-            return null;
-        }
-    }
-
-    @Override
-    protected MetadataConverter[] getConverters() {
-        return MetadataVersion.v5.getConverters();
-    }
-}
diff --git a/storage/update/src/main/java/org/artifactory/update/security/SecurityInfoReader.java b/storage/update/src/main/java/org/artifactory/update/security/SecurityInfoReader.java
deleted file mode 100644
index e49b72d..0000000
--- a/storage/update/src/main/java/org/artifactory/update/security/SecurityInfoReader.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.security;
-
-import com.thoughtworks.xstream.XStream;
-import org.apache.commons.io.IOUtils;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.security.SecurityInfo;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * Reads and converts on-the-fly security descriptor xml files. This should be the only class who reads the security xml
- * files.
- *
- * @author Yossi Shaul
- */
-public class SecurityInfoReader {
-    private static final Logger log = LoggerFactory.getLogger(SecurityInfoReader.class);
-
-    public SecurityInfo read(File securityFile) {
-        FileInputStream fis = null;
-        try {
-            fis = new FileInputStream(securityFile);
-            return read(fis);
-        } catch (FileNotFoundException e) {
-            throw new RuntimeException("File not found: " + e.getMessage());
-        } finally {
-            IOUtils.closeQuietly(fis);
-        }
-    }
-
-    public SecurityInfo read(InputStream is) {
-        String xmlContent;
-        try {
-            xmlContent = IOUtils.toString(is, "utf-8");
-        } catch (IOException e) {
-            throw new RuntimeException("Failed to read file content: " + e.getMessage(), e);
-        }
-
-        return read(xmlContent);
-    }
-
-    public SecurityInfo read(String xmlContent) {
-        SecurityVersion xmlSecurityVersion = SecurityVersion.findVersion(xmlContent);
-        if (!xmlSecurityVersion.isCurrent()) {
-            log.info("Converting security.xml version from '{}' to '{}'", xmlSecurityVersion.toString(),
-                    SecurityVersion.getCurrent());
-            xmlContent = xmlSecurityVersion.convert(xmlContent);
-        }
-
-        XStream xStream = InfoFactoryHolder.get().getSecurityXStream();
-        SecurityInfo securityInfo = ((SecurityInfo) xStream.fromXML(xmlContent));
-        return securityInfo;
-    }
-}
diff --git a/storage/update/src/main/java/org/artifactory/update/security/SecurityVersion.java b/storage/update/src/main/java/org/artifactory/update/security/SecurityVersion.java
deleted file mode 100644
index 97fce59..0000000
--- a/storage/update/src/main/java/org/artifactory/update/security/SecurityVersion.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.security;
-
-import org.artifactory.update.security.v1.AclsConverter;
-import org.artifactory.update.security.v1.UserPermissionsConverter;
-import org.artifactory.update.security.v2.RepoPathAclConverter;
-import org.artifactory.update.security.v2.SimpleUserConverter;
-import org.artifactory.update.security.v3.AclRepoKeysConverter;
-import org.artifactory.update.security.v3.AnyRemoteConverter;
-import org.artifactory.update.security.v4.AnnotatePermissionXmlConverter;
-import org.artifactory.update.security.v6.LdapGroupSettingXmlConverter;
-import org.artifactory.update.security.v6.LowercaseUsernameXmlConverter;
-import org.artifactory.version.ArtifactoryVersion;
-import org.artifactory.version.SubConfigElementVersion;
-import org.artifactory.version.VersionComparator;
-import org.artifactory.version.XmlConverterUtils;
-import org.artifactory.version.converter.XmlConverter;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * @author freds
- * @date Nov 9, 2008
- */
-public enum SecurityVersion implements SubConfigElementVersion {
-    unsupported(ArtifactoryVersion.v122rc0, ArtifactoryVersion.v125rc6) {
-        @Override
-        public String convert(String in) {
-            throw new IllegalStateException(
-                    "Reading security data from backup of Artifactory version older than 1.2.5-rc6 is not supported!");
-        }
-    },
-    v1(ArtifactoryVersion.v125, ArtifactoryVersion.v125u1, new UserPermissionsConverter(), new AclsConverter()),
-    v2(ArtifactoryVersion.v130beta1, ArtifactoryVersion.v130beta2,
-            new SimpleUserConverter(), new RepoPathAclConverter()),
-    v3(ArtifactoryVersion.v130beta3, ArtifactoryVersion.v208, new AnyRemoteConverter(), new AclRepoKeysConverter()),
-    v4(ArtifactoryVersion.v210, ArtifactoryVersion.v210, new AnnotatePermissionXmlConverter()),
-    v5(ArtifactoryVersion.v211, ArtifactoryVersion.v212),
-    // due to a bug 2.1.2 was released with new security version that is the same as 4
-    v6(ArtifactoryVersion.v213, ArtifactoryVersion.v213, new LdapGroupSettingXmlConverter(),
-            new LowercaseUsernameXmlConverter()),
-    v7(ArtifactoryVersion.v220, ArtifactoryVersion.v264),
-    v8(ArtifactoryVersion.v265, ArtifactoryVersion.getCurrent());
-
-    private static final String VERSION_ATT = "version=\"";
-
-    private final VersionComparator comparator;
-    private final XmlConverter[] xmlConverters;
-
-    /**
-     * Represents Artifactory security version. For each change in the security files new security version is created.
-     *
-     * @param from          Artifactory version this security version started at
-     * @param until         Last Artifactory version this security version was valid
-     * @param xmlConverters List of converters needed to convert the security.xml of this version to the next
-     *                      one
-     */
-    SecurityVersion(ArtifactoryVersion from, ArtifactoryVersion until, XmlConverter... xmlConverters) {
-        this.comparator = new VersionComparator(from, until);
-        this.xmlConverters = xmlConverters;
-    }
-
-    public boolean isCurrent() {
-        return comparator.isCurrent();
-    }
-
-    @Override
-    public VersionComparator getComparator() {
-        return comparator;
-    }
-
-    public XmlConverter[] getXmlConverters() {
-        return xmlConverters;
-    }
-
-    public String convert(String securityXmlAsString) {
-        // First create the list of converters to apply
-        List<XmlConverter> converters = new ArrayList<>();
-
-        // All converters of versions above me needs to be executed in sequence
-        SecurityVersion[] versions = SecurityVersion.values();
-        for (SecurityVersion version : versions) {
-            if (version.ordinal() >= ordinal() && version.getXmlConverters() != null) {
-                converters.addAll(Arrays.asList(version.getXmlConverters()));
-            }
-        }
-
-        return XmlConverterUtils.convert(converters, securityXmlAsString);
-    }
-
-    public static SecurityVersion getCurrent() {
-        SecurityVersion[] versions = SecurityVersion.values();
-        for (SecurityVersion version : versions) {
-            if (version.isCurrent()) {
-                return version;
-            }
-        }
-        throw new IllegalStateException("Should have a current version!");
-    }
-
-    public static SecurityVersion findVersion(String securityData) {
-        // Version exists since v4
-        int versionIdx = securityData.indexOf(VERSION_ATT);
-        if (versionIdx != -1) {
-            int versionStartIndex = versionIdx + VERSION_ATT.length();
-            String cutVersion = securityData.substring(versionStartIndex);
-            String isolatedVersion = cutVersion.substring(0, cutVersion.indexOf('"'));
-            return valueOf(isolatedVersion);
-        } else {
-            // Hack to find old versions
-            int groupsIdx = securityData.indexOf("<groups>");
-            int userIdx = securityData.indexOf("<user>");
-            int simpleUserIdx = securityData.indexOf("SimpleUser>");
-            int aclIdIdx = securityData.indexOf("<aclObjectIdentity");
-            if (userIdx != -1 || groupsIdx != -1) {
-                return v3;
-            }
-            if (aclIdIdx != -1) {
-                return v1;
-            }
-            if (simpleUserIdx != -1) {
-                return v2;
-            }
-            return unsupported;
-        }
-    }
-}
diff --git a/storage/update/src/main/java/org/artifactory/update/security/v1/AclsConverter.java b/storage/update/src/main/java/org/artifactory/update/security/v1/AclsConverter.java
deleted file mode 100644
index 0d85015..0000000
--- a/storage/update/src/main/java/org/artifactory/update/security/v1/AclsConverter.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.security.v1;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Renames the tags named after class names to the shorter notation (for example org.acegisecurity.acl.basic.SimpleAclEntry
- * will be renamed to acl). Will convert the permission masks and identifiers.
- *
- * @author freds
- */
-public class AclsConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(AclsConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        Element root = doc.getRootElement();
-        root.removeChild("repoPaths");
-
-        Element aclsElement = root.getChild("acls");
-        @SuppressWarnings({"unchecked"})
-        List<Element> acls = aclsElement.getChildren();
-        if (acls == null) {
-            log.warn("No acls detected");
-            return;
-        }
-
-        // remove all acls - will create new ones
-        root.removeChild("acls");
-        Element newAclsElement = new Element("acls");
-        root.addContent(newAclsElement);
-
-        Map<Integer, String> objectIdentitiesMap = buildObjectIdentitiesMap(acls);
-        HashMap<String, Element> newAclsByIdentity = new HashMap<>();
-
-        for (Element oldAcl : acls) {
-            if ("org.acegisecurity.acl.basic.SimpleAclEntry".equals(oldAcl.getName())) {
-                Element objectIdentity = oldAcl.getChild("aclObjectIdentity");
-                if (hasIdentity(objectIdentity)) {
-                    // add new acl
-                    Element newAcl = new Element("org.artifactory.security.RepoPathAcl");
-                    String newIdentity = getNewIdentity(objectIdentity);
-                    newAcl.addContent(new Element("identifier").setText(newIdentity));
-                    Element aces = new Element("aces");
-                    newAcl.addContent(aces);
-                    aces.addContent(new Element("list"));
-                    addAceToAcl(oldAcl, newAcl);
-                    newAclsByIdentity.put(newIdentity, newAcl);
-                    newAclsElement.addContent(newAcl);
-                } else {
-                    // just an ace - add to existing acl
-                    // get the identifier index from the reference attribute
-                    // sample value: ../../org.acegisecurity.acl.basic.SimpleAclEntry[2]/aclObjectIdentity
-                    String reference = objectIdentity.getAttributeValue("reference");
-                    Pattern pattern = Pattern.compile(".*org.acegisecurity.acl.basic.SimpleAclEntry\\[(.*)\\].*");
-                    Matcher matcher = pattern.matcher(reference);
-                    if (matcher.matches()) {
-                        String indexStr = matcher.group(1);
-                        int identityIndex = Integer.parseInt(indexStr);
-                        String identity = objectIdentitiesMap.get(identityIndex);
-                        Element newAcl = newAclsByIdentity.get(identity);
-                        addAceToAcl(oldAcl, newAcl);
-                    } else {
-                        log.warn("Couldn't match identity reference {}", reference);
-                    }
-                }
-            } else {
-                log.warn("Acl tag " + oldAcl + " under acls is not a SimpleAclEntry!");
-            }
-        }
-    }
-
-    private void addAceToAcl(Element oldAcl, Element newAcl) {
-        Element acesListElement = newAcl.getChild("aces").getChild("list");
-        String user = oldAcl.getChildText("recipient");
-        String mask = oldAcl.getChildText("mask");
-        if ("___INHERITENCE_MARKER_ONLY___".equals(user)) {
-            user = "anonymous";
-            mask = "1";
-        }
-        Element ace = new Element("org.artifactory.security.RepoPathAce");
-        ace.addContent(new Element("principal").setText(user));
-        ace.addContent(new Element("mask").setText(mask));
-        acesListElement.addContent(ace);
-    }
-
-    private boolean hasIdentity(Element objectIdentity) {
-        return objectIdentity.getChild("repoKey") != null;
-    }
-
-    private Map<Integer, String> buildObjectIdentitiesMap(List<Element> acls) {
-        HashMap<Integer, String> identities = new HashMap<>();
-        for (int i = 0; i < acls.size(); i++) {
-            Element acl = acls.get(i);
-            Element objectIdentity = acl.getChild("aclObjectIdentity");
-            if (hasIdentity(objectIdentity)) {
-                String identity = getNewIdentity(objectIdentity);
-                identities.put(i + 1, identity);
-            }
-        }
-        return identities;
-    }
-
-    private String getNewIdentity(Element objectIdentity) {
-        String repoKey = objectIdentity.getChildText("repoKey");
-        String path = objectIdentity.getChildText("path");
-        String identity = repoKey + "%3a" + path;
-        return identity;
-    }
-}
\ No newline at end of file
diff --git a/storage/update/src/main/java/org/artifactory/update/security/v1/UserPermissionsConverter.java b/storage/update/src/main/java/org/artifactory/update/security/v1/UserPermissionsConverter.java
deleted file mode 100644
index 7a1bc03..0000000
--- a/storage/update/src/main/java/org/artifactory/update/security/v1/UserPermissionsConverter.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.security.v1;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- * This converter will add the admin element for admin users.
- *
- * @author Yossi Shaul
- */
-public class UserPermissionsConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(UserPermissionsConverter.class);
-
-    @Override
-    @SuppressWarnings({"unchecked"})
-    public void convert(Document doc) {
-        Element root = doc.getRootElement();
-
-        Element usersElement = root.getChild("users");
-        if (usersElement == null) {
-            log.warn("No users found");
-            return;
-        }
-
-        List<Element> users = usersElement.getChildren("org.artifactory.security.SimpleUser");
-        for (Element user : users) {
-            Element authoritiesElement = user.getChild("authorities");
-            if (authoritiesElement == null) {
-                log.warn("No authorities found for {}", user.getChildText("username"));
-                continue;
-            }
-            List<Element> authorities = authoritiesElement.getChildren("org.acegisecurity.GrantedAuthorityImpl");
-            for (Element authority : authorities) {
-                if ("ADMIN".equals(authority.getChildText("role"))) {
-                    user.addContent(new Element("admin").setText("true"));
-                    break;
-                }
-            }
-        }
-    }
-}
diff --git a/storage/update/src/main/java/org/artifactory/update/security/v2/RepoPathAclConverter.java b/storage/update/src/main/java/org/artifactory/update/security/v2/RepoPathAclConverter.java
deleted file mode 100644
index 672582b..0000000
--- a/storage/update/src/main/java/org/artifactory/update/security/v2/RepoPathAclConverter.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.security.v2;
-
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.security.ArtifactoryPermission;
-import org.artifactory.security.PermissionTargetInfo;
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.util.List;
-
-/**
- * Renames the tags named after class names to the shorter notation (for example org.acegisecurity.acl.basic.SimpleAclEntry
- * will be renamed to acl). Will convert the permission masks and identifiers.
- *
- * @author freds
- */
-public class RepoPathAclConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(RepoPathAclConverter.class);
-    private static final String IDENTIFIER = "identifier";
-    private static final String ACES = "aces";
-    private static final String MASK = "mask";
-    private static final String PRINCIPAL = "principal";
-
-    @Override
-    @SuppressWarnings({"unchecked"})
-    public void convert(Document doc) {
-        Element aclsTag = doc.getRootElement().getChild("acls");
-        List<Element> acls = aclsTag.getChildren();
-        for (Element acl : acls) {
-            if (acl.getName().contains("RepoPathAcl")) {
-                acl.setName("acl");
-                convertIdentifierToPermissionTarget(acl);
-                Element acesTag = acl.getChild(ACES);
-                Element aceListTag = acesTag.getChild("list");
-                List<Element> aces = aceListTag.getChildren("org.artifactory.security.RepoPathAce");
-                Element newAces = new Element(ACES);
-                Element aceTemplate = new Element("ace");
-                Element groupEl = new Element("group");
-                groupEl.setText("false");
-                aceTemplate.addContent(new Element(PRINCIPAL)).addContent(groupEl).addContent(new Element(MASK));
-                for (Element ace : aces) {
-                    Element newAce = (Element) aceTemplate.clone();
-                    newAce.getChild(PRINCIPAL).setText(ace.getChildText(PRINCIPAL));
-                    Element maskEl = ace.getChild(MASK);
-                    int mask = Integer.parseInt(maskEl.getText());
-                    if ((mask & (ArtifactoryPermission.MANAGE.getMask() |
-                            ArtifactoryPermission.DEPLOY.getMask())) > 0) {
-                        mask |= ArtifactoryPermission.DELETE.getMask();
-                    }
-                    newAce.getChild(MASK).setText("" + mask);
-                    newAces.addContent(newAce);
-                }
-                acl.removeChild(ACES);
-                acl.addContent(newAces);
-            } else {
-                log.warn("Acl tag " + acl + " under acls is not a RepoPAthAcl!");
-            }
-        }
-    }
-
-    private void convertIdentifierToPermissionTarget(Element acl) {
-        String identifier;
-        try {
-            identifier = URLDecoder.decode(acl.getChildText(IDENTIFIER), "UTF-8");
-        } catch (UnsupportedEncodingException e) {
-            throw new RuntimeException("Failed to decode identifier", e);
-        }
-        RepoPath repoPath = InternalRepoPathFactory.fromId(identifier);
-        acl.removeChild(IDENTIFIER);
-        Element permissionTarget = new Element("permissionTarget");
-
-        Element nameEl = new Element("name");
-        if (repoPath.getRepoKey().equalsIgnoreCase(PermissionTargetInfo.ANY_REPO) &&
-                repoPath.getPath().equalsIgnoreCase(PermissionTargetInfo.ANY_REPO)) {
-            nameEl.setText(PermissionTargetInfo.ANY_PERMISSION_TARGET_NAME);
-        } else {
-            nameEl.setText(repoPath.getId());
-        }
-        permissionTarget.addContent(nameEl);
-
-        Element repoKeyEl = new Element("repoKey");
-        repoKeyEl.setText(repoPath.getRepoKey());
-        permissionTarget.addContent(repoKeyEl);
-
-        Element includesEl = new Element("includes");
-        Element includeEl = new Element("string");
-        if (repoPath.getPath().equalsIgnoreCase(PermissionTargetInfo.ANY_REPO)) {
-            includeEl.setText(PermissionTargetInfo.ANY_PATH);
-        } else {
-            includeEl.setText(repoPath.getPath() + "/" + PermissionTargetInfo.ANY_PATH);
-        }
-        includesEl.addContent(includeEl);
-        permissionTarget.addContent(includesEl);
-        permissionTarget.addContent(new Element("excludes"));
-
-        acl.addContent(permissionTarget);
-    }
-}
diff --git a/storage/update/src/main/java/org/artifactory/update/security/v2/SimpleUserConverter.java b/storage/update/src/main/java/org/artifactory/update/security/v2/SimpleUserConverter.java
deleted file mode 100644
index bc6ae9a..0000000
--- a/storage/update/src/main/java/org/artifactory/update/security/v2/SimpleUserConverter.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.security.v2;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- * Renames the org.artifactory.security.SimpleUser tag to user and removes the authorities.
- *
- * @author freds
- */
-public class SimpleUserConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(SimpleUserConverter.class);
-
-    @Override
-    @SuppressWarnings({"unchecked"})
-    public void convert(Document doc) {
-        Element usersTag = doc.getRootElement().getChild("users");
-        List<Element> users = usersTag.getChildren();
-        for (Element user : users) {
-            if (user.getName().contains("SimpleUser")) {
-                user.setName("user");
-                user.removeChild("authorities");
-            } else {
-                log.warn("A tag " + user + " under users is not SimpleUSer!!");
-            }
-        }
-    }
-}
diff --git a/storage/update/src/main/java/org/artifactory/update/security/v3/AclRepoKeysConverter.java b/storage/update/src/main/java/org/artifactory/update/security/v3/AclRepoKeysConverter.java
deleted file mode 100644
index bdd73f7..0000000
--- a/storage/update/src/main/java/org/artifactory/update/security/v3/AclRepoKeysConverter.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.security.v3;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-
-import java.util.List;
-
-/**
- * Converts permission target in an Acls to contain multiple repoKeys.
- *
- * @author Yossi Shaul
- */
-public class AclRepoKeysConverter implements XmlConverter {
-    @Override
-    public void convert(Document doc) {
-        Element aclsTag = doc.getRootElement().getChild("acls");
-        @SuppressWarnings({"unchecked"})
-        List<Element> acls = aclsTag.getChildren();
-        for (Element acl : acls) {
-            Element permissionTarget = acl.getChild("permissionTarget");
-            Element repoKeyElement = permissionTarget.getChild("repoKey");
-            permissionTarget.removeContent(repoKeyElement);
-            // create the new element - repoKeys and add to the acl
-            Element repoKeys = new Element("repoKeys");
-            repoKeyElement.setName("string");   // the xstream element name
-            repoKeys.addContent(repoKeyElement);
-            permissionTarget.addContent(repoKeys);
-        }
-    }
-}
diff --git a/storage/update/src/main/java/org/artifactory/update/security/v3/AnyRemoteConverter.java b/storage/update/src/main/java/org/artifactory/update/security/v3/AnyRemoteConverter.java
deleted file mode 100644
index 9e036ff..0000000
--- a/storage/update/src/main/java/org/artifactory/update/security/v3/AnyRemoteConverter.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.security.v3;
-
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-/**
- * If the default Anything permission target exists and the anonymous user read permission is set, add the new default
- * "any remote" premission and grant read+deploy permissions on it to anonymous. This is how the additionan element
- * looks like:
- * <pre>
- *   <acl>
- *     <permissionTarget>
- *       <name>Any Remote</name>
- *       <repoKey>ANY REMOTE</repoKeys>
- *       <includes>
- *         <string>**</string>
- *       </includes>
- *       <excludes/>
- *     </permissionTarget>
- *     <aces>
- *       <ace>
- *         <principal>anonymous</principal>
- *         <group>false</group>
- *         <mask>3</mask>
- *       </ace>
- *     </aces>
- *     <updatedBy>system</updatedBy>
- *   </acl>
- * </pre>
- *
- * @author Yossi Shaul
- */
-public class AnyRemoteConverter implements XmlConverter {
-    private static final Logger log = LoggerFactory.getLogger(AnyRemoteConverter.class);
-
-    @Override
-    public void convert(Document doc) {
-        Element aclsTag = doc.getRootElement().getChild("acls");
-
-        if (shouldAddDefaultAnyRemote(aclsTag)) {
-            Element acl = new Element("acl");
-            Element permissionTarget = new Element("permissionTarget");
-            permissionTarget.addContent(newElement("name", "Any Remote"));
-            permissionTarget.addContent(newElement("repoKey", "ANY REMOTE"));
-            Element includes = new Element("includes");
-            includes.addContent(newElement("string", "**"));
-            permissionTarget.addContent(includes);
-            permissionTarget.addContent(new Element("excludes"));
-            acl.addContent(permissionTarget);
-
-            Element aces = new Element("aces");
-            Element ace = new Element("ace");
-            ace.addContent(newElement("principal", "anonymous"));
-            ace.addContent(newElement("group", "false"));
-            ace.addContent(newElement("mask", "3"));    // read+write
-            aces.addContent(ace);
-            acl.addContent(aces);
-            acl.addContent(newElement("updatedBy", SecurityService.USER_SYSTEM));
-
-            aclsTag.addContent(acl);
-        } else {
-            log.debug("No need to add default any remote permissions");
-        }
-    }
-
-    @SuppressWarnings({"unchecked"})
-    private boolean shouldAddDefaultAnyRemote(Element aclsTag) {
-        List<Element> acls = aclsTag.getChildren();
-        for (Element acl : acls) {
-            Element permissionTarget = acl.getChild("permissionTarget");
-            String repoKey = permissionTarget.getChildText("repoKey");
-            if ("ANY".equals(repoKey)) {
-                Element acesTag = acl.getChild("aces");
-                if (acesTag != null) {
-                    List<Element> aces = acesTag.getChildren();
-                    for (Element ace : aces) {
-                        if ("anonymous".equals(ace.getChildText("principal"))) {
-                            return true;
-                        }
-                    }
-                }
-            }
-        }
-        return false;
-    }
-
-    private Element newElement(String name, String value) {
-        Element element = new Element(name);
-        element.setText(value);
-        return element;
-    }
-
-}
\ No newline at end of file
diff --git a/storage/update/src/main/java/org/artifactory/update/security/v4/AnnotatePermissionXmlConverter.java b/storage/update/src/main/java/org/artifactory/update/security/v4/AnnotatePermissionXmlConverter.java
deleted file mode 100644
index d387383..0000000
--- a/storage/update/src/main/java/org/artifactory/update/security/v4/AnnotatePermissionXmlConverter.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.security.v4;
-
-import org.artifactory.security.ArtifactoryPermission;
-import org.artifactory.security.UserInfo;
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-
-import java.util.List;
-
-/**
- * An xml converter that locates any ACE (except anonymous) with admin and deploy permissions, and grants them an
- * annotate permission
- *
- * @author Noam Y. Tenne
- */
-public class AnnotatePermissionXmlConverter implements XmlConverter {
-
-    private static final String ACES = "aces";
-    private static final String MASK = "mask";
-    private static final String PRINCIPAL = "principal";
-    private static final String ACE = "ace";
-    private static final String GROUP = "group";
-
-    @Override
-    @SuppressWarnings({"unchecked"})
-    public void convert(Document doc) {
-        Element aclsTag = doc.getRootElement().getChild("acls");
-        List<Element> acls = aclsTag.getChildren();
-        for (Element acl : acls) {
-            Element acesTag = acl.getChild(ACES);
-            List<Element> aces = acesTag.getChildren(ACE);
-            Element newAces = new Element(ACES);
-            Element aceTemplate = new Element(ACE);
-            Element groupEl = new Element(GROUP);
-            aceTemplate.addContent(new Element(PRINCIPAL)).addContent(groupEl).addContent(new Element(MASK));
-            for (Element ace : aces) {
-                Element child = ace.getChild("principal");
-                Element newAce = (Element) aceTemplate.clone();
-                newAce.getChild(PRINCIPAL).setText(ace.getChildText(PRINCIPAL));
-                newAce.getChild(GROUP).setText(ace.getChildText(GROUP));
-
-                Element maskEl = ace.getChild(MASK);
-                int mask = Integer.parseInt(maskEl.getText());
-                if (!child.getText().equals(UserInfo.ANONYMOUS)) {
-                    if ((mask & (ArtifactoryPermission.MANAGE.getMask() |
-                            ArtifactoryPermission.DEPLOY.getMask())) > 0) {
-                        mask |= ArtifactoryPermission.ANNOTATE.getMask();
-                    }
-                }
-                newAce.getChild(MASK).setText("" + mask);
-                newAces.addContent(newAce);
-            }
-            acl.removeChild(ACES);
-            acl.addContent(newAces);
-        }
-    }
-}
\ No newline at end of file
diff --git a/storage/update/src/main/java/org/artifactory/update/security/v6/LdapGroupSettingXmlConverter.java b/storage/update/src/main/java/org/artifactory/update/security/v6/LdapGroupSettingXmlConverter.java
deleted file mode 100644
index 27cc597..0000000
--- a/storage/update/src/main/java/org/artifactory/update/security/v6/LdapGroupSettingXmlConverter.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.security.v6;
-
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Convert the security descriptor with the new group name tag instead of strings
- *
- * @author Tomer Cohen
- */
-public class LdapGroupSettingXmlConverter implements XmlConverter {
-
-    @Override
-    public void convert(Document doc) {
-        Element root = doc.getRootElement();
-        Namespace namespace = root.getNamespace();
-        Element child = root.getChild("users", namespace);
-        List users = child.getChildren("user", namespace);
-        if (users != null && !users.isEmpty()) {
-            for (Object user : users) {
-                Element userElement = (Element) user;
-                Element groups = userElement.getChild("groups", namespace);
-                if (groups != null) {
-                    List groupNames = groups.getChildren("string", namespace);
-                    List<String> listOfGroupNames = new ArrayList<>();
-                    for (Object groupName : groupNames) {
-                        Element group = (Element) groupName;
-                        listOfGroupNames.add(group.getText());
-                    }
-                    groups.removeChildren("string", namespace);
-                    for (String name : listOfGroupNames) {
-                        Element userGroup = new Element("userGroup", namespace);
-                        userGroup.setText(name);
-                        groups.addContent(userGroup);
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/storage/update/src/main/java/org/artifactory/update/security/v6/LowercaseUsernameXmlConverter.java b/storage/update/src/main/java/org/artifactory/update/security/v6/LowercaseUsernameXmlConverter.java
deleted file mode 100644
index b01b433..0000000
--- a/storage/update/src/main/java/org/artifactory/update/security/v6/LowercaseUsernameXmlConverter.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.security.v6;
-
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.version.converter.XmlConverter;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.Namespace;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Tomer Cohen
- */
-public class LowercaseUsernameXmlConverter implements XmlConverter {
-
-    @Override
-    public void convert(Document doc) {
-        // 1. aggregate all usenames in a map (username->user element)
-        // 2. for each user check if another lowercase username exists in the map
-        // 2.1 if duplicates doesn't exist, add to the users SET/MAP
-        // 2.2 if duplicates exist, take the admin if there is one (first if not)
-        // 3. attach the users elements to the "users" element (cut it first)
-
-        // in the acls:
-        // 1. for each ace in acl:
-        // 1.1 if no duplicate -> add to the list of aces
-        // 1.2 if there are duplicates -> merge the mask eg a | b (101 | 010 = 111)
-
-
-        // for groups:
-        // 1. Remove duplicates under groups element (change all to lowercase)
-        // 2. Remove duplicates under users groups element (change all to lowercase)
-
-        // merge aces (same for groups and for users)
-
-
-        Element root = doc.getRootElement();
-        Namespace namespace = root.getNamespace();
-
-        mergeGroups(root, namespace);
-        mergeUsers(root, namespace);
-        mergeAcls(root, namespace);
-    }
-
-    private void mergeUsers(Element root, Namespace namespace) {
-        Element child = root.getChild("users", namespace);
-        List users = child.getChildren("user", namespace);
-        Map<String, Element> usernameToGroups = Maps.newHashMap();
-        if (users != null && !users.isEmpty()) {
-            Iterator iterator = users.iterator();
-            while (iterator.hasNext()) {
-                Element userElement = (Element) iterator.next();
-                Element userNameElement = userElement.getChild("username", namespace);
-                String userName = userNameElement.getText();
-                String lowerCaseUsername = userName.toLowerCase();
-                userNameElement.setText(lowerCaseUsername);
-                if (!usernameToGroups.containsKey(lowerCaseUsername)) {
-                    usernameToGroups.put(lowerCaseUsername, userElement);
-                    addGroupsToUser(userElement, userElement, namespace);
-                    copyEmails(namespace, usernameToGroups, userElement, lowerCaseUsername);
-                } else {
-                    String isAdmin = userElement.getChild("admin").getText();
-                    Element existingUserElement = usernameToGroups.get(lowerCaseUsername);
-                    addGroupsToUser(existingUserElement, userElement, namespace);
-                    if (Boolean.parseBoolean(isAdmin)) {
-                        usernameToGroups.put(lowerCaseUsername, userElement);
-                    }
-                    copyEmails(namespace, usernameToGroups, existingUserElement, lowerCaseUsername);
-                    addGroupsToUser(userElement, existingUserElement, namespace);
-                    iterator.remove();
-                }
-            }
-        }
-        root.removeChildren("users", namespace);
-        Element usersElement = new Element("users", namespace);
-        root.addContent(usersElement);
-        for (Map.Entry<String, Element> elementEntry : usernameToGroups.entrySet()) {
-            Element newUser = elementEntry.getValue();
-            Element userElement = new Element("user", namespace);
-            userElement.setContent(newUser.cloneContent());
-            usersElement.addContent(userElement);
-        }
-    }
-
-    private void copyEmails(Namespace namespace, Map<String, Element> usernameToGroups, Element userElement,
-            String lowerCaseUsername) {
-        Element userElementFromMap = usernameToGroups.get(lowerCaseUsername);
-        Element emailFromXml = userElementFromMap.getChild("email");
-        if (emailFromXml == null) {
-            Element emailElement = userElement.getChild("email");
-            if (emailElement != null) {
-                String email = emailElement.getText();
-                if (StringUtils.isNotBlank(email)) {
-                    Element newEmailElement = new Element("email", namespace);
-                    newEmailElement.setText(email);
-                    userElementFromMap.addContent(newEmailElement);
-                }
-            }
-        }
-    }
-
-    private Map<String, Element> mergeGroups(Element root, Namespace namespace) {
-        Map<String, Element> foundGroupNames = Maps.newHashMap();
-        Element groupsChildren = root.getChild("groups", namespace);
-        if (groupsChildren != null) {
-            List groups = groupsChildren.getChildren("group", namespace);
-            if (groups != null && !groups.isEmpty()) {
-                Iterator groupsIterator = groups.iterator();
-                while (groupsIterator.hasNext()) {
-                    Element groupElement = (Element) groupsIterator.next();
-                    Element groupNameElement = groupElement.getChild("groupName");
-                    String groupName = groupNameElement.getText();
-                    String lowerCaseGroupName = groupName.toLowerCase();
-                    if (!foundGroupNames.containsKey(lowerCaseGroupName)) {
-                        groupNameElement.setText(lowerCaseGroupName);
-                        foundGroupNames.put(lowerCaseGroupName, groupElement);
-                    } else {
-                        Element autoJoinElement = groupElement.getChild("newUserDefault");
-                        if (autoJoinElement != null) {
-                            boolean isNewUserDefault = Boolean.parseBoolean(autoJoinElement.getText());
-                            if (isNewUserDefault) {
-                                Element existingGroupElement = foundGroupNames.get(lowerCaseGroupName);
-                                Element existingNewUserDefault = existingGroupElement.getChild("newUserDefault");
-                                if (existingNewUserDefault != null) {
-                                    existingNewUserDefault.setText("true");
-                                } else {
-                                    Element newUserDefault = new Element("newUserDefault");
-                                    newUserDefault.setText("true");
-                                    existingGroupElement.addContent(newUserDefault);
-                                }
-                            }
-                        }
-                        groupsIterator.remove();
-                    }
-                }
-            }
-        }
-        return foundGroupNames;
-    }
-
-    private void addGroupsToUser(Element userElement, Element userToGetGroupsFrom, Namespace namespace) {
-        Set<String> existingGroupNames = getUserGroups(userElement);
-        Set<String> newGroupNames = getUserGroups(userToGetGroupsFrom);
-        existingGroupNames.addAll(newGroupNames);
-        Element groupsElement = userElement.getChild("groups");
-        if (groupsElement != null) {
-            groupsElement.removeChildren("userGroup");
-            for (String groupName : existingGroupNames) {
-                Element userGroup = new Element("userGroup", namespace);
-                userGroup.setText(groupName.toLowerCase());
-                groupsElement.addContent(userGroup);
-            }
-        }
-    }
-
-    private Set<String> getUserGroups(Element userElement) {
-        Set<String> groups = Sets.newHashSet();
-        Element groupsElement = userElement.getChild("groups");
-        if (groupsElement != null) {
-            List userGroups = groupsElement.getChildren("userGroup");
-            if (userGroups != null && !userGroups.isEmpty()) {
-                for (Object group : userGroups) {
-                    Element groupElement = (Element) group;
-                    groups.add(groupElement.getText().toLowerCase());
-                }
-            }
-        }
-        return groups;
-    }
-
-    private void mergeAcls(Element root, Namespace namespace) {
-        List acls = root.getChildren("acls", namespace);
-        if (acls != null && !acls.isEmpty()) {
-            for (Object acl : acls) {
-                Element aclElement = (Element) acl;
-                List aces = aclElement.getChildren("acl", namespace);
-                if (aces != null && !aces.isEmpty()) {
-                    for (Object ace : aces) {
-                        Element aceElement = (Element) ace;
-                        List childAces = aceElement.getChildren("aces", namespace);
-                        if (childAces != null && !childAces.isEmpty()) {
-                            for (Object childAce : childAces) {
-                                Map<String, Element> aclMap = Maps.newHashMap();
-
-                                Element childAceElement = (Element) childAce;
-                                List aceName = childAceElement.getChildren("ace");
-                                if (aceName != null && !aceName.isEmpty()) {
-                                    Iterator iterator = aceName.iterator();
-                                    while (iterator.hasNext()) {
-                                        Element child = (Element) iterator.next();
-                                        Element principalElement = child.getChild("principal");
-                                        boolean isGroup = Boolean.parseBoolean(child.getChild("group").getText());
-                                        String principal = principalElement.getText();
-                                        String principalLowerCase = principal.toLowerCase();
-                                        String finalGroupName = principalLowerCase + " " + isGroup;
-                                        principalElement.setText(principalLowerCase);
-                                        if (!aclMap.containsKey(finalGroupName)) {
-                                            aclMap.put(finalGroupName, child);
-                                        } else {
-                                            Element element = aclMap.get(finalGroupName);
-                                            int newMask = Integer.parseInt(child.getChild("mask").getText());
-                                            Element originalElementMask = element.getChild("mask");
-                                            int originalMask = Integer.parseInt(originalElementMask.getText());
-                                            newMask |= originalMask;
-                                            originalElementMask.setText(String.valueOf(newMask));
-                                            iterator.remove();
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/storage/update/src/main/java/org/artifactory/update/utils/BackupUtils.java b/storage/update/src/main/java/org/artifactory/update/utils/BackupUtils.java
deleted file mode 100644
index f57f4fc..0000000
--- a/storage/update/src/main/java/org/artifactory/update/utils/BackupUtils.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.utils;
-
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.version.ArtifactoryVersion;
-import org.artifactory.version.ArtifactoryVersionReader;
-
-import java.io.File;
-
-/**
- * @author freds
- * @date Nov 9, 2008
- */
-public abstract class BackupUtils {
-    private BackupUtils() {
-        // utility class
-    }
-
-    public static ArtifactoryVersion findVersion(File backupFolder) {
-        if (backupFolder == null || !backupFolder.exists()) {
-            throw new IllegalArgumentException("Cannot find Artifactory of null or non existent folder");
-        }
-
-        File propFile = new File(backupFolder, ArtifactoryHome.ARTIFACTORY_PROPERTIES_FILE);
-        if (!propFile.exists()) {
-            throw new IllegalArgumentException("Backup folder " + backupFolder.getAbsolutePath() +
-                    " does not contain file :" + propFile.getName());
-        }
-
-        return ArtifactoryVersionReader.read(propFile).getVersion();
-    }
-}
diff --git a/storage/update/src/test/java/org/artifactory/update/md/MetadataConverterTest.java b/storage/update/src/test/java/org/artifactory/update/md/MetadataConverterTest.java
deleted file mode 100644
index 9a7bc84..0000000
--- a/storage/update/src/test/java/org/artifactory/update/md/MetadataConverterTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md;
-
-import com.thoughtworks.xstream.XStream;
-import org.artifactory.convert.XmlConverterTest;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.testng.annotations.BeforeClass;
-
-/**
- * Base class for the matadata converters tests.
- *
- * @author Yossi Shaul
- */
-public abstract class MetadataConverterTest extends XmlConverterTest {
-    protected XStream xstream;
-
-    @BeforeClass
-    public void setupXStream() {
-        xstream = InfoFactoryHolder.get().getFileSystemXStream();
-    }
-
-}
diff --git a/storage/update/src/test/java/org/artifactory/update/md/MetadataReaderBaseTest.java b/storage/update/src/test/java/org/artifactory/update/md/MetadataReaderBaseTest.java
deleted file mode 100644
index ea694dd..0000000
--- a/storage/update/src/test/java/org/artifactory/update/md/MetadataReaderBaseTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md;
-
-import com.thoughtworks.xstream.XStream;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.MetadataEntryInfo;
-import org.artifactory.test.ArtifactoryHomeBoundTest;
-import org.testng.annotations.BeforeClass;
-
-import java.util.List;
-
-/**
- * Base class for the metadata reader tests.
- *
- * @author Yossi Shaul
- */
-public abstract class MetadataReaderBaseTest extends ArtifactoryHomeBoundTest {
-
-    protected XStream xstream;
-
-    protected MetadataEntryInfo getMetadataByName(List<MetadataEntryInfo> entries, String metadataName) {
-        for (MetadataEntryInfo entry : entries) {
-            if (entry.getMetadataName().equals(metadataName)) {
-                return entry;
-            }
-        }
-        // fail if not found
-        org.testng.Assert.fail(String.format("Metadata %s not found in %s", metadataName, entries));
-        return null;
-    }
-
-    @BeforeClass
-    public void setup() {
-        xstream = InfoFactoryHolder.get().getFileSystemXStream();
-    }
-}
diff --git a/storage/update/src/test/java/org/artifactory/update/md/MetadataVersionTest.java b/storage/update/src/test/java/org/artifactory/update/md/MetadataVersionTest.java
deleted file mode 100644
index 98950b8..0000000
--- a/storage/update/src/test/java/org/artifactory/update/md/MetadataVersionTest.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md;
-
-import org.artifactory.util.ResourceUtils;
-import org.artifactory.version.SubConfigElementVersion;
-import org.artifactory.version.VersionTest;
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * @author freds
- * @date Nov 23, 2008
- */
- at Test
-public class MetadataVersionTest extends VersionTest {
-
-    @Override
-    protected SubConfigElementVersion[] getVersions() {
-        return MetadataVersion.values();
-    }
-
-    public void detectVersion125rc0() {
-        File metadataFile = ResourceUtils.getResourceAsFile(
-                "/metadata/v125rc0/commons-cli-1.0.pom.artifactory-metadata");
-        MetadataVersion version = MetadataVersion.findVersion(metadataFile);
-        assertEquals(version, MetadataVersion.v1);
-    }
-
-    public void detectVersion30beta3() {
-        File metadataDir = ResourceUtils.getResourceAsFile("/metadata/v130beta3/0.1.23.artifactory-metadata");
-        MetadataVersion version = MetadataVersion.findVersion(metadataDir);
-        assertEquals(version, MetadataVersion.v2);
-    }
-
-    public void detectVersion30beta6() {
-        File metadataDir = ResourceUtils.getResourceAsFile("/metadata/v130beta6/junit-3.8.1.jar.artifactory-metadata");
-        MetadataVersion version = MetadataVersion.findVersion(metadataDir);
-        assertEquals(version, MetadataVersion.v3);
-    }
-
-    public void detectVersion230() {
-        File metadataDir = ResourceUtils.getResourceAsFile(
-                "/metadata/v230/aspectjweaver-1.5.3.jar.artifactory-metadata");
-        MetadataVersion version = MetadataVersion.findVersion(metadataDir);
-        assertEquals(version, MetadataVersion.v5);
-    }
-}
\ No newline at end of file
diff --git a/storage/update/src/test/java/org/artifactory/update/md/v125rc0/MdFileConverterTest.java b/storage/update/src/test/java/org/artifactory/update/md/v125rc0/MdFileConverterTest.java
deleted file mode 100644
index 14cd57b..0000000
--- a/storage/update/src/test/java/org/artifactory/update/md/v125rc0/MdFileConverterTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md.v125rc0;
-
-import org.artifactory.update.md.MetadataConverterTest;
-import org.artifactory.util.XmlUtils;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-
-/**
- * Tests the file metadata converter from version 1.2.5rc0 to 1.3.0beta3.
- *
- * @author Yossi Shaul
- */
- at Test
-public class MdFileConverterTest extends MetadataConverterTest {
-    private static final Logger log = LoggerFactory.getLogger(MdFileConverterTest.class);
-
-    public void convertValidFile() throws Exception {
-        String fileMetadata = "/metadata/v125rc0/commons-cli-1.0.pom.artifactory-metadata";
-        Document doc = convertXml(fileMetadata, new MdFileConverter());
-
-        log.debug(XmlUtils.outputString(doc));
-
-        Element root = doc.getRootElement();
-        assertEquals(root.getName(), "artifactory-file", "Root node should have been renamed");
-        Element repoPath = root.getChild("repoPath");
-        assertNotNull(repoPath, "Converter should create repoPath node");
-        assertEquals(repoPath.getChildren().size(), 2, "Repo path should contains repoKey and path");
-        Element extension = root.getChild("extension");
-        assertNotNull(repoPath, "Converter should create extension node");
-        assertEquals(extension.getChildText("modifiedBy"), "", "Modified by should be empty");
-    }
-
-}
\ No newline at end of file
diff --git a/storage/update/src/test/java/org/artifactory/update/md/v125rc0/MdFolderConverterTest.java b/storage/update/src/test/java/org/artifactory/update/md/v125rc0/MdFolderConverterTest.java
deleted file mode 100644
index 4ce66e4..0000000
--- a/storage/update/src/test/java/org/artifactory/update/md/v125rc0/MdFolderConverterTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md.v125rc0;
-
-import org.artifactory.update.md.MetadataConverterTest;
-import org.artifactory.util.XmlUtils;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-
-/**
- * Tests the file metadata converter from version 1.2.5-rc0 to 1.3.0beta3.
- *
- * @author Yossi Shaul
- */
- at Test
-public class MdFolderConverterTest extends MetadataConverterTest {
-    private static final Logger log = LoggerFactory.getLogger(MdFolderConverterTest.class);
-
-    public void convertValidFile() throws Exception {
-        String fileMetadata = "/metadata/v125rc0/commons-cli.artifactory-metadata";
-        Document doc = convertXml(fileMetadata, new MdFolderConverter());
-
-        log.debug(XmlUtils.outputString(doc));
-
-        Element root = doc.getRootElement();
-        assertEquals(root.getName(), "artifactory-folder", "Root node should have been renamed");
-        Element repoPath = root.getChild("repoPath");
-        assertNotNull(repoPath, "Converter should create repoPath node");
-        assertEquals(repoPath.getChildren().size(), 2, "Repo path should contains repoKey and path");
-
-        Element extension = root.getChild("extension");
-        assertNotNull(repoPath, "Converter should create extension node");
-        assertEquals(extension.getChildText("modifiedBy"), "", "Modified by should be empty");
-    }
-
-}
\ No newline at end of file
diff --git a/storage/update/src/test/java/org/artifactory/update/md/v125rc0/MdStatsConverterTest.java b/storage/update/src/test/java/org/artifactory/update/md/v125rc0/MdStatsConverterTest.java
deleted file mode 100644
index 773c2d0..0000000
--- a/storage/update/src/test/java/org/artifactory/update/md/v125rc0/MdStatsConverterTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md.v125rc0;
-
-import org.artifactory.update.md.MetadataConverterTest;
-import org.artifactory.util.XmlUtils;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-
-/**
- * Tests the stats metadata converter from version 1.3.0beta3 to 1.3.0beta6.
- *
- * @author Yossi Shaul
- */
- at Test
-public class MdStatsConverterTest extends MetadataConverterTest {
-    private static final Logger log = LoggerFactory.getLogger(MdStatsConverterTest.class);
-
-    public void convertValidFile() throws Exception {
-        String fileMetadata = "/metadata/v125rc0/commons-cli-1.0.pom.artifactory-metadata";
-        Document doc = convertXml(fileMetadata, new MdStatsConverter());
-
-        log.debug(XmlUtils.outputString(doc));
-
-        Element root = doc.getRootElement();
-        assertEquals(root.getName(), "artifactory.stats", "Root node should have been renamed");
-        Element downloadCount = root.getChild("downloadCount");
-        assertNotNull(downloadCount, "Converter should create downloadCount node");
-        assertEquals(downloadCount.getText(), "99", "Download count should be 1");
-    }
-
-}
\ No newline at end of file
diff --git a/storage/update/src/test/java/org/artifactory/update/md/v125rc0/MetadataReader125Test.java b/storage/update/src/test/java/org/artifactory/update/md/v125rc0/MetadataReader125Test.java
deleted file mode 100644
index 8221a54..0000000
--- a/storage/update/src/test/java/org/artifactory/update/md/v125rc0/MetadataReader125Test.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md.v125rc0;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.fs.MetadataEntryInfo;
-import org.artifactory.fs.MutableFileInfo;
-import org.artifactory.fs.StatsInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.update.md.MetadataReaderBaseTest;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.net.URL;
-import java.util.List;
-import java.util.Set;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the matadata reader from versions 1.3.3-beta-3 to 1.3.3-beta-6 (or later).
- *
- * @author Yossi Shaul
- */
- at Test
-public class MetadataReader125Test extends MetadataReaderBaseTest {
-
-    public void readFolderMetadata() {
-        MetadataReader125 reader = new MetadataReader125();
-        File folderMetadataDirectory = getMetadataDirectory("/metadata/v125rc0/commons-cli.artifactory-metadata");
-        BasicStatusHolder status = new BasicStatusHolder();
-        List<MetadataEntryInfo> entries = reader.getMetadataEntries(folderMetadataDirectory, status);
-        assertFalse(status.isError());
-        assertNotNull(entries);
-        assertEquals(entries.size(), 1, "One matadata entry expected - folder");
-
-        // the result should be compatible with the latest FolderInfo
-        org.artifactory.fs.FolderInfo folderInfo =
-                (org.artifactory.fs.FolderInfo) xstream.fromXML(entries.get(0).getXmlContent());
-        assertEquals(folderInfo.getName(), "commons-cli", "Name mismatch");
-        RepoPath repoPath = folderInfo.getRepoPath();
-        assertEquals(repoPath.getRepoKey(), "repo1-cache", "Repository key mismatch");
-        assertEquals(repoPath.getPath(), "commons-cli", "Path mismatch");
-    }
-
-    public void readFileMetadata() {
-        MetadataReader125 reader = new MetadataReader125();
-        File fileMetadataDirectory = getMetadataDirectory(
-                "/metadata/v125rc0/commons-cli-1.0.pom.artifactory-metadata");
-        BasicStatusHolder status = new BasicStatusHolder();
-        List<MetadataEntryInfo> entries = reader.getMetadataEntries(fileMetadataDirectory, status);
-        assertFalse(status.isError());
-        assertNotNull(entries);
-        assertEquals(entries.size(), 2, "Two matadata entries are expected - file and stats");
-
-        MetadataEntryInfo fileInfoEntry = getMetadataByName(entries, org.artifactory.fs.FileInfo.ROOT);
-        MutableFileInfo fileInfo = (MutableFileInfo) xstream.fromXML(fileInfoEntry.getXmlContent());
-        Set<ChecksumInfo> checksums = fileInfo.getChecksums();
-        Assert.assertNotNull(checksums);
-        Assert.assertEquals(checksums.size(), 2);
-        Assert.assertEquals(fileInfo.getSha1(), "");
-        Assert.assertEquals(fileInfo.getMd5(), "");
-
-        // just make sure the stats is readable
-        MetadataEntryInfo statsInfoEntry = getMetadataByName(entries, StatsInfo.ROOT);
-        StatsInfo statsInfo = (StatsInfo) xstream.fromXML(statsInfoEntry.getXmlContent());
-        assertEquals(statsInfo.getDownloadCount(), 99);
-    }
-
-    private File getMetadataDirectory(String path) {
-        URL resource = getClass().getResource(path);
-        if (resource == null) {
-            throw new IllegalArgumentException("Resource not found: " + path);
-        }
-        return new File(resource.getFile());
-    }
-}
\ No newline at end of file
diff --git a/storage/update/src/test/java/org/artifactory/update/md/v130beta3/ArtifactoryFileConverterTest.java b/storage/update/src/test/java/org/artifactory/update/md/v130beta3/ArtifactoryFileConverterTest.java
deleted file mode 100644
index 8f389a8..0000000
--- a/storage/update/src/test/java/org/artifactory/update/md/v130beta3/ArtifactoryFileConverterTest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md.v130beta3;
-
-import org.artifactory.update.md.MetadataConverterTest;
-import org.artifactory.util.XmlUtils;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-
-/**
- * Tests the file metadata converter from version 1.3.0beta3 to 1.3.0beta6.
- *
- * @author Yossi Shaul
- */
- at Test
-public class ArtifactoryFileConverterTest extends MetadataConverterTest {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryFileConverterTest.class);
-
-    public void convertValidFile() throws Exception {
-        String fileMetadata = "/metadata/v130beta3/artifactory.file.xml";
-        Document doc = convertXml(fileMetadata, new ArtifactoryFileConverter());
-
-        log.debug(XmlUtils.outputString(doc));
-
-        Element root = doc.getRootElement();
-        assertEquals(root.getName(), "artifactory-file", "Root node should have been renamed");
-        Element repoPath = root.getChild("repoPath");
-        assertNotNull(repoPath, "Converter should create repoPath node");
-        assertEquals(repoPath.getChildren().size(), 2, "Repo path should contains repoKey and path");
-        Element extension = root.getChild("extension");
-        assertNotNull(repoPath, "Converter should create extension node");
-        assertEquals(extension.getChildText("modifiedBy"), "anonymous",
-                "Modified by should be under the extension");
-    }
-
-}
diff --git a/storage/update/src/test/java/org/artifactory/update/md/v130beta3/ArtifactoryFolderConverterTest.java b/storage/update/src/test/java/org/artifactory/update/md/v130beta3/ArtifactoryFolderConverterTest.java
deleted file mode 100644
index 3e561f5..0000000
--- a/storage/update/src/test/java/org/artifactory/update/md/v130beta3/ArtifactoryFolderConverterTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md.v130beta3;
-
-import org.artifactory.update.md.MetadataConverterTest;
-import org.artifactory.util.XmlUtils;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-
-/**
- * Tests the file metadata converter from version 1.3.0beta3 to 1.3.0beta6.
- *
- * @author Yossi Shaul
- */
- at Test
-public class ArtifactoryFolderConverterTest extends MetadataConverterTest {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryFolderConverterTest.class);
-
-    public void convertValidFile() throws Exception {
-        String fileMetadata = "/metadata/v130beta3/artifactory.folder.xml";
-        Document doc = convertXml(fileMetadata, new ArtifactoryFolderConverter());
-
-        log.debug(XmlUtils.outputString(doc));
-
-        Element root = doc.getRootElement();
-        assertEquals(root.getName(), "artifactory-folder", "Root node should have been renamed");
-        Element repoPath = root.getChild("repoPath");
-        assertNotNull(repoPath, "Converter should create repoPath node");
-        assertEquals(repoPath.getChildren().size(), 2, "Repo path should contains repoKey and path");
-
-        Element extension = root.getChild("extension");
-        assertNotNull(repoPath, "Converter should create extension node");
-        assertEquals(extension.getChildText("modifiedBy"), "anonymous",
-                "Modified by should be under the extension");
-    }
-
-}
\ No newline at end of file
diff --git a/storage/update/src/test/java/org/artifactory/update/md/v130beta3/MetadataReader130beta3Test.java b/storage/update/src/test/java/org/artifactory/update/md/v130beta3/MetadataReader130beta3Test.java
deleted file mode 100644
index d1cff1e..0000000
--- a/storage/update/src/test/java/org/artifactory/update/md/v130beta3/MetadataReader130beta3Test.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md.v130beta3;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.fs.MetadataEntryInfo;
-import org.artifactory.fs.MutableFileInfo;
-import org.artifactory.fs.StatsInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.sapi.fs.MetadataReader;
-import org.artifactory.update.md.MetadataReaderBaseTest;
-import org.artifactory.update.md.MetadataVersion;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.net.URL;
-import java.util.List;
-import java.util.Set;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the matadata reader from versions 1.3.3-beta-3 to 1.3.3-beta-6 (or later).
- *
- * @author Yossi Shaul
- */
- at Test
-public class MetadataReader130beta3Test extends MetadataReaderBaseTest {
-
-    public void readFolderMetadata() {
-        MetadataReader reader = MetadataVersion.v2;
-        File folderMetadataDirectory = getMetadataDirectory("/metadata/v130beta3/0.1.23.artifactory-metadata");
-        BasicStatusHolder status = new BasicStatusHolder();
-        List<MetadataEntryInfo> entries = reader.getMetadataEntries(folderMetadataDirectory, status);
-        assertFalse(status.isError());
-        assertNotNull(entries);
-        assertEquals(entries.size(), 1, "One metadata entry expected - folder");
-
-        // the result should be compatible with the latest FolderInfo
-        FolderInfo folderInfo = (FolderInfo) xstream.fromXML(entries.get(0).getXmlContent());
-        assertEquals(folderInfo.getName(), "0.1.23", "Name mismatch");
-        RepoPath repoPath = folderInfo.getRepoPath();
-        assertEquals(repoPath.getRepoKey(), "repo1-cache", "Repository key mismatch");
-        assertEquals(repoPath.getPath(), "com/jcraft/jsch/0.1.23", "Path mismatch");
-    }
-
-    public void readFileMetadata() {
-        MetadataReader reader = MetadataVersion.v2;
-        File fileMetadataDirectory = getMetadataDirectory(
-                "/metadata/v130beta3/jsch-0.1.23.pom.artifactory-metadata");
-        BasicStatusHolder status = new BasicStatusHolder();
-        List<MetadataEntryInfo> entries = reader.getMetadataEntries(fileMetadataDirectory, status);
-        assertFalse(status.isError());
-        assertNotNull(entries);
-        assertEquals(entries.size(), 2, "Two metadata entries are expected - file and stats");
-
-        MetadataEntryInfo fileInfoEntry = getMetadataByName(entries, org.artifactory.fs.FileInfo.ROOT);
-        MutableFileInfo fileInfo = (MutableFileInfo) xstream.fromXML(fileInfoEntry.getXmlContent());
-        Set<ChecksumInfo> checksums = fileInfo.getChecksums();
-        Assert.assertNotNull(checksums);
-        Assert.assertEquals(checksums.size(), 2);
-        Assert.assertEquals(fileInfo.getSha1(), "1d4266015cc4deba8bf4b56441ebc02cd170503d");
-        Assert.assertEquals(fileInfo.getMd5(), "f1298dace833ceafd88f6cd6acc26c64");
-
-        // just make sure the stats is readable
-        MetadataEntryInfo statsInfoEntry = getMetadataByName(entries, StatsInfo.ROOT);
-        StatsInfo statsInfo = (StatsInfo) xstream.fromXML(statsInfoEntry.getXmlContent());
-        assertEquals(statsInfo.getDownloadCount(), 1);
-    }
-
-    private File getMetadataDirectory(String path) {
-        URL resource = getClass().getResource(path);
-        if (resource == null) {
-            throw new IllegalArgumentException("Resource not found: " + path);
-        }
-        return new File(resource.getFile());
-    }
-}
\ No newline at end of file
diff --git a/storage/update/src/test/java/org/artifactory/update/md/v130beta6/ChecksumsConverterTest.java b/storage/update/src/test/java/org/artifactory/update/md/v130beta6/ChecksumsConverterTest.java
deleted file mode 100644
index ee6c95f..0000000
--- a/storage/update/src/test/java/org/artifactory/update/md/v130beta6/ChecksumsConverterTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md.v130beta6;
-
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.MutableFileInfo;
-import org.artifactory.update.md.MetadataConverterTest;
-import org.artifactory.util.ResourceUtils;
-import org.artifactory.util.XmlUtils;
-import org.jdom2.Document;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.Set;
-
-/**
- * Tests the conversion of checksums info in the file metadata.
- *
- * @author Yossi Shaul
- */
- at Test
-public class ChecksumsConverterTest extends MetadataConverterTest {
-    private static final Logger log = LoggerFactory.getLogger(ChecksumsConverterTest.class);
-
-    public void convertValidFile() throws Exception {
-        String fileMetadata = "/metadata/v130beta6/artifactory-file.xml";
-        Document doc = convertXml(fileMetadata, new ChecksumsConverter());
-
-        String result = XmlUtils.outputString(doc);
-        log.debug(result);
-
-        // the result is intermediate so it might not be compatible with latest FileInfo
-        // but for now it is a good test to test the resulting FileInfo 
-        MutableFileInfo fileInfo = (MutableFileInfo) xstream.fromXML(result);
-        Set<ChecksumInfo> checksums = fileInfo.getChecksums();
-        Assert.assertNotNull(checksums);
-        Assert.assertEquals(checksums.size(), 2);
-        Assert.assertEquals(fileInfo.getSha1(), "99129f16442844f6a4a11ae22fbbee40b14d774f");
-        Assert.assertEquals(fileInfo.getMd5(), "1f40fb782a4f2cf78f161d32670f7a3a");
-
-        FileInfo expected = (FileInfo) xstream.fromXML(
-                ResourceUtils.getResource("/metadata/v130beta6/artifactory-file-expected.xml"));
-        Assert.assertTrue(fileInfo.isIdentical(expected));
-    }
-}
diff --git a/storage/update/src/test/java/org/artifactory/update/md/v130beta6/FolderAdditionalInfoNameConverterTest.java b/storage/update/src/test/java/org/artifactory/update/md/v130beta6/FolderAdditionalInfoNameConverterTest.java
deleted file mode 100644
index e797447..0000000
--- a/storage/update/src/test/java/org/artifactory/update/md/v130beta6/FolderAdditionalInfoNameConverterTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md.v130beta6;
-
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.update.md.MetadataConverterTest;
-import org.artifactory.util.ResourceUtils;
-import org.artifactory.util.XmlUtils;
-import org.jdom2.Document;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * Tests the conversion of folder info metadata.
- *
- * @author Yossi Shaul
- */
- at Test
-public class FolderAdditionalInfoNameConverterTest extends MetadataConverterTest {
-    private static final Logger log = LoggerFactory.getLogger(FolderAdditionalInfoNameConverterTest.class);
-
-    public void convertValidFolderInfo() throws Exception {
-        String fileMetadata = "/metadata/v130beta6/artifactory-folder.xml";
-        Document doc = convertXml(fileMetadata, new FolderAdditionalInfoNameConverter());
-
-        String result = XmlUtils.outputString(doc);
-        log.debug(result);
-
-        // the result is intermediate so it might not be compatible with latest FolderInfo
-        // but for now it is a good test to test the resulting FolderInfo
-        FolderInfo folderInfo = (FolderInfo) xstream.fromXML(result);
-        Assert.assertNotNull(folderInfo.getModifiedBy());
-
-        FolderInfo expected = (FolderInfo) xstream.fromXML(
-                ResourceUtils.getResource("/metadata/v130beta6/artifactory-folder-expected.xml"));
-        Assert.assertTrue(folderInfo.isIdentical(expected));
-    }
-}
diff --git a/storage/update/src/test/java/org/artifactory/update/md/v130beta6/MetadataReader130beta6Test.java b/storage/update/src/test/java/org/artifactory/update/md/v130beta6/MetadataReader130beta6Test.java
deleted file mode 100644
index 05f9c52..0000000
--- a/storage/update/src/test/java/org/artifactory/update/md/v130beta6/MetadataReader130beta6Test.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md.v130beta6;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.MetadataEntryInfo;
-import org.artifactory.fs.MutableFileInfo;
-import org.artifactory.fs.StatsInfo;
-import org.artifactory.update.md.MetadataReaderBaseTest;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.net.URL;
-import java.util.List;
-import java.util.Set;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the matadata reader from versions 1.3.3-beta-6 to rc1 (or later).
- *
- * @author Yossi Shaul
- */
- at Test
-public class MetadataReader130beta6Test extends MetadataReaderBaseTest {
-
-    public void readFolderMetadata() {
-        MetadataReader130beta6 reader = new MetadataReader130beta6();
-        File folderMetadataDirectory = getMetadataDirectory("/metadata/v130beta6/3.8.1.artifactory-metadata");
-        BasicStatusHolder status = new BasicStatusHolder();
-        List<MetadataEntryInfo> entries = reader.getMetadataEntries(folderMetadataDirectory, status);
-        assertFalse(status.isError());
-        assertNotNull(entries);
-        assertEquals(entries.size(), 1, "One matadata entry expected - folder");
-        assertEquals(entries.get(0).getMetadataName(), "artifactory-folder");
-
-        // the result should be compatible with the latest FolderInfo
-        org.artifactory.fs.FolderInfo folderInfo =
-                (org.artifactory.fs.FolderInfo) xstream.fromXML(entries.get(0).getXmlContent());
-    }
-
-    public void readFileMetadata() {
-        MetadataReader130beta6 reader = new MetadataReader130beta6();
-        File fileMetadataDirectory = getMetadataDirectory(
-                "/metadata/v130beta6/junit-3.8.1.jar.artifactory-metadata");
-        BasicStatusHolder status = new BasicStatusHolder();
-        List<MetadataEntryInfo> entries = reader.getMetadataEntries(fileMetadataDirectory, status);
-        assertFalse(status.isError());
-        assertNotNull(entries);
-        assertEquals(entries.size(), 2, "Two matadata entries are expected - file and stats");
-
-        MetadataEntryInfo fileInfoEntry = getMetadataByName(entries, FileInfo.ROOT);
-        MutableFileInfo fileInfo = (MutableFileInfo) xstream.fromXML(fileInfoEntry.getXmlContent());
-        Set<ChecksumInfo> checksums = fileInfo.getChecksums();
-        Assert.assertNotNull(checksums);
-        Assert.assertEquals(checksums.size(), 2);
-        Assert.assertEquals(fileInfo.getSha1(), "99129f16442844f6a4a11ae22fbbee40b14d774f");
-        Assert.assertEquals(fileInfo.getMd5(), "1f40fb782a4f2cf78f161d32670f7a3a");
-
-        // just make sure the stats is readable
-        MetadataEntryInfo statsInfoEntry = getMetadataByName(entries, StatsInfo.ROOT);
-        StatsInfo statsInfo = (StatsInfo) xstream.fromXML(statsInfoEntry.getXmlContent());
-        assertEquals(statsInfo.getDownloadCount(), 2);
-    }
-
-    private File getMetadataDirectory(String path) {
-        URL resource = getClass().getResource(path);
-        if (resource == null) {
-            throw new IllegalArgumentException("Resource not found: " + path);
-        }
-        return new File(resource.getFile());
-    }
-}
diff --git a/storage/update/src/test/java/org/artifactory/update/md/v230/RepoPathClassConverterTests.java b/storage/update/src/test/java/org/artifactory/update/md/v230/RepoPathClassConverterTests.java
deleted file mode 100644
index 52b5288..0000000
--- a/storage/update/src/test/java/org/artifactory/update/md/v230/RepoPathClassConverterTests.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.md.v230;
-
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.update.md.MetadataConverterTest;
-import org.artifactory.util.ResourceUtils;
-import org.artifactory.util.XmlUtils;
-import org.jdom2.Document;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-/**
- * @author Noam Y. Tenne
- */
- at Test
-public class RepoPathClassConverterTests extends MetadataConverterTest {
-    private static final Logger log = LoggerFactory.getLogger(RepoPathClassConverterTests.class);
-
-    public void testInfo() throws Exception {
-        convertItemInfo("folder", new BaseRepoPathClassConverter.FolderRepoPathClassConverter());
-        convertItemInfo("file", new BaseRepoPathClassConverter.FileRepoPathClassConverter());
-    }
-
-    private void convertItemInfo(String type, BaseRepoPathClassConverter requiredConverter) throws Exception {
-        Document doc = convertXml("/metadata/v230/artifactory-" + type + ".xml", requiredConverter);
-
-        String result = XmlUtils.outputString(doc);
-        log.debug(result);
-
-        ItemInfo itemInfo = (ItemInfo) xstream.fromXML(result);
-        Assert.assertNotNull(itemInfo.getModifiedBy());
-
-        ItemInfo expected = (ItemInfo) xstream.fromXML(
-                ResourceUtils.getResource("/metadata/v230/artifactory-" + type + "-expected.xml"));
-        Assert.assertTrue(itemInfo.isIdentical(expected));
-    }
-}
diff --git a/storage/update/src/test/java/org/artifactory/update/security/SecurityConverterTest.java b/storage/update/src/test/java/org/artifactory/update/security/SecurityConverterTest.java
deleted file mode 100644
index 70d1f72..0000000
--- a/storage/update/src/test/java/org/artifactory/update/security/SecurityConverterTest.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.security;
-
-import org.artifactory.convert.XmlConverterTest;
-
-/**
- * Base class for the security converters tests.
- *
- * @author Yossi Shaul
- */
-public abstract class SecurityConverterTest extends XmlConverterTest {
-}
diff --git a/storage/update/src/test/java/org/artifactory/update/security/SecurityInfoReaderTest.java b/storage/update/src/test/java/org/artifactory/update/security/SecurityInfoReaderTest.java
deleted file mode 100644
index 15c7640..0000000
--- a/storage/update/src/test/java/org/artifactory/update/security/SecurityInfoReaderTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.security;
-
-import org.apache.commons.io.FileUtils;
-import org.artifactory.security.SecurityInfo;
-import org.artifactory.util.ResourceUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.util.Collection;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the {@link SecurityInfoReader}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class SecurityInfoReaderTest {
-    private static final Logger log = LoggerFactory.getLogger(SecurityInfoReaderTest.class);
-
-    @Test(description = "this test will try to read all the security files under the security test directory")
-    public void readAllVersions() {
-        File securityDirectory = ResourceUtils.getResourceAsFile("/security");
-        Collection securityFiles = FileUtils.listFiles(securityDirectory, new String[]{"xml"}, true);
-        assertTrue(securityFiles.size() > 5, "Hey, where are all the security test files? Non found under "
-                + securityDirectory.getAbsolutePath());
-
-        SecurityInfoReader reader = new SecurityInfoReader();
-        for (Object securityFile : securityFiles) {
-            File file = (File) securityFile;
-            log.debug("Reading security file: {}", file.getAbsolutePath());
-            // lets just check that the reader knows how to read this file...
-            SecurityInfo securityInfo = reader.read(file);
-            assertNotNull(securityInfo, "Null value returned from security reader for file " + file.getAbsolutePath());
-        }
-    }
-
-    @Test(description = "just another test on version 6 with few assertions")
-    public void readVersion5() {
-        File securityFile = ResourceUtils.getResourceAsFile("/security/v6/security.xml");
-        SecurityInfo securityInfo = new SecurityInfoReader().read(securityFile);
-        assertEquals(securityInfo.getUsers().size(), 5, "Wrong users count");
-    }
-
-}
diff --git a/storage/update/src/test/java/org/artifactory/update/security/SecurityVersionTest.java b/storage/update/src/test/java/org/artifactory/update/security/SecurityVersionTest.java
deleted file mode 100644
index 2283c2e..0000000
--- a/storage/update/src/test/java/org/artifactory/update/security/SecurityVersionTest.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.security;
-
-import com.thoughtworks.xstream.XStream;
-import org.apache.commons.io.FileUtils;
-import org.artifactory.factory.InfoFactory;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.security.AclInfo;
-import org.artifactory.security.SecurityInfo;
-import org.artifactory.security.UserInfo;
-import org.artifactory.util.ResourceUtils;
-import org.artifactory.version.SubConfigElementVersion;
-import org.artifactory.version.VersionTest;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-/**
- * @author freds
- * @author Yossi Shaul
- */
- at Test
-public class SecurityVersionTest extends VersionTest {
-    private static final Logger log = LoggerFactory.getLogger(SecurityVersionTest.class);
-
-    protected final InfoFactory factory = InfoFactoryHolder.get();
-
-    @Override
-    protected SubConfigElementVersion[] getVersions() {
-        return SecurityVersion.values();
-    }
-
-    public void convertFromVersion1() throws IOException {
-        XStream xstream = factory.getSecurityXStream();
-        log.debug(xstream.toXML(factory.createPermissionTarget("blbla", Arrays.asList("repo"))));
-
-        File toConvert = ResourceUtils.getResourceAsFile("/security/v1/security.xml");
-        String secXmlData = FileUtils.readFileToString(toConvert, "utf-8");
-        String result = SecurityVersion.v1.convert(secXmlData);
-
-        log.debug("convertFromv125 result:\n{}", result);
-
-        SecurityInfo securityInfo = getSecurityInfo(result);
-
-        List<UserInfo> users = securityInfo.getUsers();
-        assertEquals(users.size(), 3, "3 users expected");
-        UserInfo admin = users.get(users.indexOf(factory.createUser("admin")));
-        assertEquals(admin.getUsername(), "admin");
-        assertTrue(admin.isAdmin(), "Admin is admin...");
-        assertFalse(admin.isAnonymous());
-
-        UserInfo momo = users.get(users.indexOf(factory.createUser("momo")));
-        assertEquals(momo.getUsername(), "momo");
-        assertFalse(momo.isAdmin());
-        assertFalse(momo.isAnonymous());
-
-        assertNull(securityInfo.getGroups(), "No groups before 130beta3");
-
-        List<AclInfo> acls = securityInfo.getAcls();
-        assertEquals(acls.size(), 3);
-
-        AclInfo acl1 = acls.get(0);
-        assertEquals(acl1.getPermissionTarget().getName(), "Anything");
-        assertEquals(acl1.getPermissionTarget().getRepoKeys(), Arrays.asList("ANY"));
-        assertEquals(acl1.getAces().size(), 1);
-
-        AclInfo acl2 = acls.get(1);
-        assertEquals(acl2.getPermissionTarget().getName(), "libs-releases:org.apache");
-        assertEquals(acl2.getPermissionTarget().getRepoKeys(), Arrays.asList("libs-releases"));
-        assertEquals(acl2.getAces().size(), 2);
-
-        // any remote added
-        AclInfo acl3 = acls.get(2);
-        assertEquals(acl3.getPermissionTarget().getName(), "Any Remote");
-        assertEquals(acl3.getPermissionTarget().getRepoKeys(), Arrays.asList("ANY REMOTE"));
-        assertEquals(acl3.getAces().size(), 1);
-    }
-
-    public void convertFromVersion1Big() throws IOException {
-        File toConvert = ResourceUtils.getResourceAsFile("/security/v1/security-big.xml");
-        String secXmlData = FileUtils.readFileToString(toConvert, "utf-8");
-        String result = SecurityVersion.v1.convert(secXmlData);
-
-        log.debug("convertFromv125Big result:\n{}", result);
-
-        SecurityInfo securityInfo = getSecurityInfo(result);
-
-        List<UserInfo> users = securityInfo.getUsers();
-        assertEquals(users.size(), 5, "5 users expected");
-        int indexOfAdmin = users.indexOf(factory.createUser("admin"));
-        UserInfo admin = users.get(indexOfAdmin);
-        assertEquals(admin.getUsername(), "admin");
-        assertTrue(admin.isAdmin(), "Admin is admin...");
-        assertFalse(admin.isAnonymous());
-
-        // no more admins
-        for (int i = 0; i != indexOfAdmin && i < users.size(); i++) {
-            UserInfo user = users.get(i);
-            assertFalse(user.isAdmin(), "Not expecting more admins: " + user.getUsername());
-        }
-
-        assertNull(securityInfo.getGroups(), "No groups before 130beta3");
-
-        List<AclInfo> acls = securityInfo.getAcls();
-        assertEquals(acls.size(), 6, "6 acls expected");
-
-        AclInfo acl1 = acls.get(4);
-        assertEquals(acl1.getPermissionTarget().getName(), "libs-releases:ANY");
-        assertEquals(acl1.getPermissionTarget().getRepoKeys(), Arrays.asList("libs-releases"));
-        assertEquals(acl1.getAces().size(), 3);
-    }
-
-    public void convertFromVersion2() throws IOException {
-        File toConvert = ResourceUtils.getResourceAsFile("/security/v2/security.xml");
-        String secXmlData = FileUtils.readFileToString(toConvert, "utf-8");
-        String result = SecurityVersion.v2.convert(secXmlData);
-
-        log.debug("convertFromv130beta1 result:\n{}", result);
-
-        SecurityInfo securityInfo = getSecurityInfo(result);
-
-        List<UserInfo> users = securityInfo.getUsers();
-        assertEquals(users.size(), 4, "4 users expected");
-        UserInfo admin = users.get(users.indexOf(factory.createUser("admin")));
-        assertEquals(admin.getUsername(), "admin");
-        assertTrue(admin.isAdmin());
-        assertFalse(admin.isAnonymous());
-
-        UserInfo yossis = users.get(users.indexOf(factory.createUser("yossis")));
-        assertEquals(yossis.getUsername(), "yossis");
-        assertFalse(yossis.isAdmin());
-        assertFalse(yossis.isAnonymous());
-
-        assertNull(securityInfo.getGroups(), "No groups before 130beta3");
-
-        List<AclInfo> acls = securityInfo.getAcls();
-        assertEquals(acls.size(), 3);
-
-        AclInfo acl1 = acls.get(0);
-        assertEquals(acl1.getPermissionTarget().getName(), "Anything");
-        assertEquals(acl1.getPermissionTarget().getRepoKeys(), Arrays.asList("ANY"));
-        assertEquals(acl1.getAces().size(), 1);
-
-        AclInfo acl2 = acls.get(1);
-        assertEquals(acl2.getPermissionTarget().getName(), "libs-releases-local:org.art");
-        assertEquals(acl2.getPermissionTarget().getRepoKeys(), Arrays.asList("libs-releases-local"));
-        assertEquals(acl2.getAces().size(), 2);
-    }
-
-    public void convertFromVersion3() throws IOException {
-        File toConvert = ResourceUtils.getResourceAsFile("/security/v3/security.xml");
-        String secXmlData = FileUtils.readFileToString(toConvert, "utf-8");
-        String result = SecurityVersion.v3.convert(secXmlData);
-
-        log.debug("convertFromv130beta1 result:\n{}", result);
-
-        SecurityInfo securityInfo = getSecurityInfo(result);
-
-        List<UserInfo> users = securityInfo.getUsers();
-        assertEquals(users.size(), 5, "5 users expected");
-        assertEquals(securityInfo.getGroups().size(), 2, "2 groups expected");
-
-        List<AclInfo> acls = securityInfo.getAcls();
-        assertEquals(acls.size(), 5, "Any remote should have been added");
-
-        // any remote added
-        AclInfo acl3 = acls.get(4);
-        assertEquals(acl3.getPermissionTarget().getName(), "Any Remote");
-        assertEquals(acl3.getPermissionTarget().getRepoKeys(), Arrays.asList("ANY REMOTE"));
-        assertEquals(acl3.getAces().size(), 1);
-    }
-
-    private SecurityInfo getSecurityInfo(String result) {
-        XStream xstream = InfoFactoryHolder.get().getSecurityXStream();
-        SecurityInfo securityInfo = (SecurityInfo) xstream.fromXML(result);
-        return securityInfo;
-    }
-}
\ No newline at end of file
diff --git a/storage/update/src/test/java/org/artifactory/update/security/v1/AclsConverterTest.java b/storage/update/src/test/java/org/artifactory/update/security/v1/AclsConverterTest.java
deleted file mode 100644
index 23f3639..0000000
--- a/storage/update/src/test/java/org/artifactory/update/security/v1/AclsConverterTest.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.security.v1;
-
-import org.artifactory.update.security.v2.SimpleUserConverterTest;
-import org.artifactory.util.XmlUtils;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests conversion done by RepoPathAclConverter.
- *
- * @author Yossi Shaul
- */
-public class AclsConverterTest extends SimpleUserConverterTest {
-    private static final Logger log = LoggerFactory.getLogger(AclsConverterTest.class);
-
-    @Test
-    public void convertOutputOfSimpleUserConverter() throws Exception {
-        String fileMetadata = "/security/v1/security.xml";
-        Document doc = convertXml(fileMetadata, new AclsConverter());
-
-        log.debug(XmlUtils.outputString(doc));
-
-        Element root = doc.getRootElement();
-
-        assertNull(root.getChild("repoPaths"), "repoPaths element should be removed");
-
-        Element aclsElement = root.getChild("acls");
-        List<Element> acls = aclsElement.getChildren();
-        assertEquals(acls.size(), 2, "Expecting two acls");
-
-        Element acl1 = acls.get(0);
-        assertEquals(acl1.getName(), "org.artifactory.security.RepoPathAcl", "ACL element not renamed");
-        assertNull(acl1.getChildText("aclObjectIdentity"), "aclObjectIdentity should have been replaced");
-        assertEquals(acl1.getChildText("identifier"), "ANY%3aANY", "Acl identifier mismatch");
-        Element acesElement = acl1.getChild("aces");
-        assertNotNull(acesElement, "aces element shouldn't be null");
-        Element listElement = acesElement.getChild("list");
-        assertNotNull(listElement, "List element should not be null");
-        List aces = listElement.getChildren("org.artifactory.security.RepoPathAce");
-        assertEquals(aces.size(), 1, "Expecting one ace");
-        Element pathAce = (Element) aces.get(0);
-        assertEquals(pathAce.getChildText("principal"), "anonymous", "Expected anonymous user");
-        assertEquals(pathAce.getChildText("mask"), "1", "Expected mask of 1");
-
-        Element acl2 = acls.get(1);
-        assertEquals(acl2.getName(), "org.artifactory.security.RepoPathAcl", "ACL element not renamed");
-        assertNull(acl2.getChildText("aclObjectIdentity"), "aclObjectIdentity should have been replaced");
-        assertEquals(acl2.getChildText("identifier"), "libs-releases%3aorg.apache", "Acl identifier mismatch");
-        Element aces2Element = acl2.getChild("aces");
-        assertNotNull(aces2Element, "aces element shouldn't be null");
-        listElement = aces2Element.getChild("list");
-        assertNotNull(listElement, "List element should not be null");
-        aces = listElement.getChildren("org.artifactory.security.RepoPathAce");
-        assertEquals(aces.size(), 2, "Expecting one ace");
-        pathAce = (Element) aces.get(0);
-        assertEquals(pathAce.getChildText("principal"), "momo", "Unexpected user");
-        assertEquals(pathAce.getChildText("mask"), "7", "Unexpected mask");
-        pathAce = (Element) aces.get(1);
-        assertEquals(pathAce.getChildText("principal"), "yossis", "Unexpected user");
-        assertEquals(pathAce.getChildText("mask"), "6", "Unexpected mask");
-    }
-}
\ No newline at end of file
diff --git a/storage/update/src/test/java/org/artifactory/update/security/v1/UserPermissionsConverterTest.java b/storage/update/src/test/java/org/artifactory/update/security/v1/UserPermissionsConverterTest.java
deleted file mode 100644
index 30ff3d0..0000000
--- a/storage/update/src/test/java/org/artifactory/update/security/v1/UserPermissionsConverterTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.security.v1;
-
-import org.artifactory.update.security.SecurityConverterTest;
-import org.artifactory.util.XmlUtils;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNull;
-
-/**
- * Tests the UserPermissionsConverter.
- *
- * @author Yossi Shaul
- */
-public class UserPermissionsConverterTest extends SecurityConverterTest {
-    private static final Logger log = LoggerFactory.getLogger(UserPermissionsConverterTest.class);
-
-    @Test
-    public void convertOutputOfSimpleUserConverter() throws Exception {
-        String fileMetadata = "/security/v1/security.xml";
-        Document doc = convertXml(fileMetadata, new UserPermissionsConverter());
-
-        log.debug(XmlUtils.outputString(doc));
-
-        Element root = doc.getRootElement();
-
-        Element usersElement = root.getChild("users");
-        List users = usersElement.getChildren();
-        Element admin = (Element) users.get(0);
-        assertEquals(admin.getChildText("username"), "admin");
-        assertEquals(admin.getChildText("admin"), "true");
-
-        Element user1 = (Element) users.get(1);
-        assertNull(user1.getChild("admin"));
-
-        Element user2 = (Element) users.get(2);
-        assertNull(user2.getChildText("admin"));
-
-    }
-}
diff --git a/storage/update/src/test/java/org/artifactory/update/security/v2/RepoPathAclConverterTest.java b/storage/update/src/test/java/org/artifactory/update/security/v2/RepoPathAclConverterTest.java
deleted file mode 100644
index 047f32a..0000000
--- a/storage/update/src/test/java/org/artifactory/update/security/v2/RepoPathAclConverterTest.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.security.v2;
-
-import org.artifactory.util.XmlUtils;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests conversion done by RepoPathAclConverter.
- *
- * @author Yossi Shaul
- */
-public class RepoPathAclConverterTest extends SimpleUserConverterTest {
-    private static final Logger log = LoggerFactory.getLogger(RepoPathAclConverterTest.class);
-
-    @Test
-    public void convertOutputOfSimpleUserConverter() throws Exception {
-        String fileMetadata = "/security/v2/security.xml";
-        Document doc = convertXml(fileMetadata, new RepoPathAclConverter());
-
-        log.debug(XmlUtils.outputString(doc));
-
-        Element root = doc.getRootElement();
-
-        assertNull(root.getChild("repoPaths"), "repoPaths element should be removed");
-
-        Element aclssElement = root.getChild("acls");
-
-        List acls = aclssElement.getChildren();
-        assertEquals(acls.size(), 2, "Expecting two acls");
-
-        // first acl
-        Element acl1 = (Element) acls.get(0);
-        assertEquals(acl1.getName(), "acl", "ACL element name not changed");
-        assertNull(acl1.getChild("list"), "List should have been removed");
-
-        assertEquals(acl1.getChildText("updatedBy"), "unknown");
-
-        Element permTarget1 = acl1.getChild("permissionTarget");
-        assertNotNull(permTarget1, "Permission target not generated");
-        assertEquals(permTarget1.getChildText("name"), "Anything", "Permission target name mismatch");
-        assertEquals(permTarget1.getChildText("repoKey"), "ANY", "Permission target repo key mismatch");
-        Element acesElement1 = acl1.getChild("aces");
-        assertNotNull(acesElement1, "Aces should not be null");
-
-        List aces1 = acesElement1.getChildren("ace");
-        assertEquals(aces1.size(), 1, "Expecting only 1 ace");
-        Element ace1 = (Element) aces1.get(0);
-        assertEquals(ace1.getChildText("principal"), "anonymous");
-        assertEquals(ace1.getChildText("mask"), "1");
-        assertEquals(ace1.getChildText("group"), "false");
-
-
-        // second acl
-        Element acl2 = (Element) acls.get(1);
-        assertEquals(acl2.getName(), "acl", "ACL element name not changed");
-        assertNull(acl2.getChild("list"), "List should have been removed");
-
-        assertEquals(acl2.getChildText("updatedBy"), "admin");
-
-        Element permTarget = acl2.getChild("permissionTarget");
-        assertNotNull(permTarget, "Permission target not generated");
-        assertEquals(permTarget.getChildText("name"), "libs-releases-local:org.art", "Permission target name mismatch");
-        assertEquals(permTarget.getChildText("repoKey"), "libs-releases-local", "Permission target repo key mismatch");
-        Element acesElement = acl2.getChild("aces");
-        assertNotNull(acesElement, "Aces should not be null");
-
-        List aces = acesElement.getChildren("ace");
-        assertEquals(aces.size(), 2, "Expecting only 1 ace");
-        Element ace = (Element) aces.get(1);
-        assertEquals(ace.getChildText("principal"), "yossis");
-        assertEquals(ace.getChildText("mask"), "11");   // with delete permissions
-        assertEquals(ace.getChildText("group"), "false");
-    }
-}
diff --git a/storage/update/src/test/java/org/artifactory/update/security/v2/SimpleUserConverterTest.java b/storage/update/src/test/java/org/artifactory/update/security/v2/SimpleUserConverterTest.java
deleted file mode 100644
index ff92c63..0000000
--- a/storage/update/src/test/java/org/artifactory/update/security/v2/SimpleUserConverterTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.security.v2;
-
-import org.artifactory.update.security.SecurityConverterTest;
-import org.artifactory.util.XmlUtils;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNull;
-
-/**
- * Tests the SimpleUserConverter.
- *
- * @author Yossi Shaul
- */
- at Test
-public class SimpleUserConverterTest extends SecurityConverterTest {
-    private static final Logger log = LoggerFactory.getLogger(SimpleUserConverterTest.class);
-
-    public void convertValidFile() throws Exception {
-        String fileMetadata = "/security/v2/security.xml";
-        Document doc = convertXml(fileMetadata, new SimpleUserConverter());
-
-        log.debug(XmlUtils.outputString(doc));
-
-        Element root = doc.getRootElement();
-        Element usersElement = root.getChild("users");
-        List users = usersElement.getChildren();
-        assertEquals(users.size(), 4, "Expecting 4 users");
-        Element user = (Element) users.get(0);
-        assertEquals(user.getName(), "user", "User element name not changed");
-        assertNull(user.getChild("authorities"), "Authorities should be removed");
-        assertEquals(user.getChildText("username"), "admin", "Username mismatch");
-        assertEquals(user.getChildText("admin"), "true", "Should be admin");
-
-        user = (Element) users.get(1);
-        assertEquals(user.getName(), "user", "User element name not changed");
-        assertNull(user.getChild("authorities"), "Authorities should be removed");
-        assertEquals(user.getChildText("username"), "anonymous", "Username mismatch");
-        assertEquals(user.getChildText("admin"), "false", "Should not be admin");
-    }
-}
diff --git a/storage/update/src/test/java/org/artifactory/update/security/v3/AclRepoKeysConverterTest.java b/storage/update/src/test/java/org/artifactory/update/security/v3/AclRepoKeysConverterTest.java
deleted file mode 100644
index d8d5743..0000000
--- a/storage/update/src/test/java/org/artifactory/update/security/v3/AclRepoKeysConverterTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.security.v3;
-
-import org.artifactory.update.security.SecurityConverterTest;
-import org.artifactory.util.XmlUtils;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-/**
- * Tests the conversion of acl repo key.
- *
- * @author Yossi Shaul
- */
- at Test
-public class AclRepoKeysConverterTest extends SecurityConverterTest {
-    private static final Logger log = LoggerFactory.getLogger(AclRepoKeysConverterTest.class);
-
-    @SuppressWarnings({"unchecked"})
-    public void convertValidFile() throws Exception {
-        String fileMetadata = "/security/v3/security-repokey-convert.xml";
-        Document doc = convertXml(fileMetadata, new AclRepoKeysConverter());
-
-        log.debug(XmlUtils.outputString(doc));
-
-        Element root = doc.getRootElement();
-        Element aclsElement = root.getChild("acls");
-        List<Element> acls = aclsElement.getChildren();
-        assertEquals(acls.size(), 3, "Expecting 3 acls");
-
-        Element permissionTarget = acls.get(0).getChild("permissionTarget");
-        assertNull(permissionTarget.getChild("string"), "repoKey should have been removed");
-        Element repoKeysElement = permissionTarget.getChild("repoKeys");
-        assertNotNull(repoKeysElement, "repoKeys element wasn't created");
-        List<Element> repoKeys = repoKeysElement.getChildren();
-        assertEquals(repoKeys.size(), 1, "Only one repo key expected");
-        assertEquals(repoKeys.get(0).getText(), "ANY", "Unexpected repo key");
-
-        permissionTarget = acls.get(1).getChild("permissionTarget");
-        assertNull(permissionTarget.getChild("string"), "repoKey should have been removed");
-        repoKeysElement = permissionTarget.getChild("repoKeys");
-        assertNotNull(repoKeysElement, "repoKeys element wasn't created");
-        repoKeys = repoKeysElement.getChildren();
-        assertEquals(repoKeys.size(), 1, "Only one repo key expected");
-        assertEquals(repoKeys.get(0).getText(), "ext-releases-local", "Unexpected repo key");
-    }
-}
diff --git a/storage/update/src/test/java/org/artifactory/update/security/v3/AnyRemoteConverterTest.java b/storage/update/src/test/java/org/artifactory/update/security/v3/AnyRemoteConverterTest.java
deleted file mode 100644
index 4d2aafa..0000000
--- a/storage/update/src/test/java/org/artifactory/update/security/v3/AnyRemoteConverterTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.security.v3;
-
-import org.artifactory.update.security.SecurityConverterTest;
-import org.artifactory.util.XmlUtils;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-
-/**
- * Tests the any remote converter.
- *
- * @author Yossi Shaul
- */
- at Test
-public class AnyRemoteConverterTest extends SecurityConverterTest {
-    private static final Logger log = LoggerFactory.getLogger(AnyRemoteConverterTest.class);
-
-    @SuppressWarnings({"unchecked"})
-    public void convertFileWithAnonymousRealOnAny() throws Exception {
-        String fileMetadata = "/security/v3/security.xml";
-        Document doc = convertXml(fileMetadata, new AnyRemoteConverter());
-
-        log.debug(XmlUtils.outputString(doc));
-
-        Element root = doc.getRootElement();
-        Element aclsElement = root.getChild("acls");
-        List<Element> acls = aclsElement.getChildren();
-        assertEquals(acls.size(), 5, "Expecting 5 acls (any remote should have been added)");
-
-        Element anyRemoteAcl = acls.get(4);
-        Element permissionTarget = anyRemoteAcl.getChild("permissionTarget");
-        assertEquals(permissionTarget.getChildText("name"), "Any Remote", "Wrong permission target name");
-        assertEquals(permissionTarget.getChildText("repoKey"), "ANY REMOTE", "Wrong repo key");
-        assertEquals(permissionTarget.getChild("includes").getChildText("string"), "**", "Wrong include pattern");
-        assertNotNull(permissionTarget.getChild("excludes"), "Excludes must not be null");
-        Element aces = anyRemoteAcl.getChild("aces");
-        assertEquals(aces.getChildren().size(), 1, "Expecting 1 ace (for anonymous only)");
-        Element anonAce = (Element) aces.getChildren().get(0);
-        assertEquals(anonAce.getChildText("principal"), "anonymous");
-        assertEquals(anonAce.getChildText("mask"), "3", "Mask should be 3 (read+write)");
-    }
-
-    public void convertFileWithoutAnonymousRealOnAny() throws Exception {
-        String fileMetadata = "/security/v3/security-no-anything-permissions.xml";
-        Document doc = convertXml(fileMetadata, new AnyRemoteConverter());
-
-        log.debug(XmlUtils.outputString(doc));
-
-        Element root = doc.getRootElement();
-        Element aclsElement = root.getChild("acls");
-        assertEquals(aclsElement.getChildren().size(), 1, "No acl should have been added");
-    }
-}
diff --git a/storage/update/src/test/java/org/artifactory/update/security/v6/LdapGroupSettingConverterTest.java b/storage/update/src/test/java/org/artifactory/update/security/v6/LdapGroupSettingConverterTest.java
deleted file mode 100644
index e1c01f3..0000000
--- a/storage/update/src/test/java/org/artifactory/update/security/v6/LdapGroupSettingConverterTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.security.v6;
-
-import org.artifactory.update.security.SecurityConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Test the Ldap Group settings converter
- *
- * @author Tomer Cohen
- */
- at Test
-public class LdapGroupSettingConverterTest extends SecurityConverterTest {
-
-    public void convertValidFile() throws Exception {
-        String fileMetadata = "/security/v6/security.xml";
-        Document document = convertXml(fileMetadata, new LdapGroupSettingXmlConverter());
-        Element rootElement = document.getRootElement();
-        Element child = rootElement.getChild("users");
-        List children = child.getChildren("user");
-        assertEquals(children.size(), 5, "Expecting 5 users");
-        Object user = children.get(4);
-        Element userElement = (Element) user;
-        Element groups = userElement.getChild("groups");
-        List userGroup = groups.getChildren("userGroup");
-        assertEquals(userGroup.size(), 2, "Expecting 2 groups");
-        Element firstGroup = (Element) userGroup.get(0);
-        Assert.assertEquals(firstGroup.getText(), "group1");
-        Element secondGroup = (Element) userGroup.get(1);
-        Assert.assertEquals(secondGroup.getText(), "group2");
-    }
-
-}
diff --git a/storage/update/src/test/java/org/artifactory/update/security/v6/LowercaseUsernameXmlConverterTest.java b/storage/update/src/test/java/org/artifactory/update/security/v6/LowercaseUsernameXmlConverterTest.java
deleted file mode 100644
index 47255ed..0000000
--- a/storage/update/src/test/java/org/artifactory/update/security/v6/LowercaseUsernameXmlConverterTest.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.security.v6;
-
-import com.google.common.collect.Lists;
-import org.artifactory.update.security.SecurityConverterTest;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.List;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
-
-/**
- * Test the lowercase username converter
- *
- * @author Tomer Cohen
- */
- at Test
-public class LowercaseUsernameXmlConverterTest extends SecurityConverterTest {
-
-    public void convertValidFile() throws Exception {
-        String fileMetadata = "/security/v6/security.upperlowercase.xml";
-        Document document = convertXml(fileMetadata, new LowercaseUsernameXmlConverter());
-        Element rootElement = document.getRootElement();
-        Element child = rootElement.getChild("users");
-        List<Element> children = child.getChildren("user");
-
-        assertEquals(children.size(), 4, "There should only be 4 users left");
-        Element firstUser = getElementByUserName(children, "toto");
-        String firstUserName = firstUser.getChild("username").getText();
-        assertEquals(firstUserName, "toto");
-        Assert.assertNull(firstUser.getChild("email"), "email child in xml should be null");
-        Element singleUser = getElementByUserName(children, "singleuser");
-        String singleUserName = singleUser.getChild("username").getText();
-        assertEquals(singleUserName, "singleuser");
-        List<Element> singleUserGroups = singleUser.getChild("groups").getChildren("userGroup");
-        assertEquals(singleUserGroups.size(), 1, "Should contain one group");
-        Element singleUserGroup = singleUserGroups.get(0);
-        assertEquals(singleUserGroup.getText(), "group3", "Should contain one group");
-        Element secondUser = getElementByUserName(children, "admin");
-        String secondUserName = secondUser.getChild("username").getText();
-        assertEquals(secondUserName, "admin");
-        Element thirdUser = getElementByUserName(children, "momo");
-        String thirdUserName = thirdUser.getChild("username").getText();
-        assertEquals(thirdUserName, "momo");
-        Element isAdmin = thirdUser.getChild("admin");
-        assertTrue(Boolean.parseBoolean(isAdmin.getText()), "user momo should be admin");
-        Element emailElement = thirdUser.getChild("email");
-        assertEquals(emailElement.getText(), "momo at momo.com", "user emails do not match");
-        List<Element> firstUserGroups = firstUser.getChild("groups").getChildren("userGroup");
-        assertEquals(firstUserGroups.size(), 3, "User should belong to three groups");
-
-        List<String> groupNames = Lists.newArrayList();
-        for (Element userGroup : firstUserGroups) {
-            groupNames.add(userGroup.getText());
-        }
-
-        assertTrue(groupNames.contains("group3"));
-        assertTrue(groupNames.contains("group1"));
-        assertTrue(groupNames.contains("group2"));
-
-        Element groups = rootElement.getChild("groups");
-        List<Element> listOfGroups = groups.getChildren("group");
-        Element secondGroup = listOfGroups.get(0);
-        assertTrue(Boolean.parseBoolean(secondGroup.getChild("newUserDefault").getText()), "Group should be auto-join");
-        List<Element> thirdUserGroups = thirdUser.getChild("groups").getChildren("userGroup");
-        assertEquals(thirdUserGroups.size(), 1, "User should belong to one group");
-        Element thirdUserGroup = thirdUserGroups.get(0);
-        assertEquals(thirdUserGroup.getText(), "group2");
-
-        Element aclsElement = rootElement.getChild("acls");
-        List<Element> acls = aclsElement.getChildren("acl");
-        Element acl = acls.get(1);
-        Element aces = acl.getChild("aces");
-        List<Element> ace = aces.getChildren("ace");
-        Element momoAce = ace.get(3);
-        assertEquals(momoAce.getChild("principal").getText(), "momo");
-        Element groupTwoElement = ace.get(4);
-        assertEquals(groupTwoElement.getChild("principal").getText(), "group2");
-        assertEquals(groupTwoElement.getChild("mask").getText(), "11");
-    }
-
-    private Element getElementByUserName(List<Element> users, String userName) {
-        for (Element user : users) {
-            String xmlUserName = user.getChild("username").getText();
-            if (userName.equals(xmlUserName)) {
-                return user;
-            }
-        }
-        return null;
-    }
-}
diff --git a/storage/update/src/test/java/org/artifactory/update/test/ArtifactoryVersionTest.java b/storage/update/src/test/java/org/artifactory/update/test/ArtifactoryVersionTest.java
deleted file mode 100644
index 2699420..0000000
--- a/storage/update/src/test/java/org/artifactory/update/test/ArtifactoryVersionTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.test;
-
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.version.ArtifactoryVersion;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.Test;
-
-import java.io.InputStream;
-import java.util.Properties;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * @author freds
- */
-public class ArtifactoryVersionTest {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryVersionTest.class);
-
-    @Test
-    public void testBackupPropertyFile() throws Exception {
-        ArtifactoryVersion[] versions = ArtifactoryVersion.values();
-        for (ArtifactoryVersion version : versions) {
-            if (version.isCurrent()) {
-                // No test here
-                continue;
-            }
-            String backupVersionFolder = "/backups/" + version.name() + "/";
-            InputStream artifactoryPropertyInputStream =
-                    getClass().getResourceAsStream(backupVersionFolder +
-                            ArtifactoryHome.ARTIFACTORY_PROPERTIES_FILE);
-            if (artifactoryPropertyInputStream != null) {
-                Properties properties = new Properties();
-                properties.load(artifactoryPropertyInputStream);
-                artifactoryPropertyInputStream.close();
-                String artifactoryVersion =
-                        properties.getProperty(ConstantValues.artifactoryVersion.getPropertyName());
-                assertEquals(artifactoryVersion, version.getValue(),
-                        "Error in version value for " + version);
-                int artifactoryRevision =
-                        Integer.parseInt(properties.getProperty(
-                                ConstantValues.artifactoryRevision.getPropertyName()));
-                assertEquals(artifactoryRevision, version.getRevision(),
-                        "Error in revision value for " + version);
-            } else {
-                log.debug("Version " + version + " does not have a backup test folder in " +
-                        backupVersionFolder);
-            }
-        }
-    }
-}
diff --git a/storage/update/src/test/java/org/artifactory/update/test/FileIOTest.java b/storage/update/src/test/java/org/artifactory/update/test/FileIOTest.java
deleted file mode 100644
index dda328b..0000000
--- a/storage/update/src/test/java/org/artifactory/update/test/FileIOTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.test;
-
-import org.testng.annotations.Test;
-
-import java.io.File;
-
-import static org.testng.Assert.*;
-
-/**
- * User: freds Date: Jun 11, 2008 Time: 3:26:22 PM
- */
- at Test
-public class FileIOTest {
-    public void testFileReturns() throws Exception {
-        String tmpFileName = System.getProperty("java.io.tmpdir");
-        assertNotNull(tmpFileName);
-        File tmpFolder = new File(tmpFileName);
-        assertTrue(tmpFolder.exists());
-        File testFolder = new File(tmpFolder, "FolderTest-" + System.currentTimeMillis());
-        testFolder.deleteOnExit();
-        assertFalse(testFolder.exists());
-        assertTrue(testFolder.mkdir());
-        assertTrue(testFolder.exists());
-        // Returns false if it exists
-        assertFalse(testFolder.mkdir());
-    }
-}
diff --git a/storage/update/src/test/java/org/artifactory/update/test/ReadOldBackupsTest.java b/storage/update/src/test/java/org/artifactory/update/test/ReadOldBackupsTest.java
deleted file mode 100644
index 863a8b4..0000000
--- a/storage/update/src/test/java/org/artifactory/update/test/ReadOldBackupsTest.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.update.test;
-
-import org.artifactory.addon.CoreAddons;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.factory.InfoFactory;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.security.*;
-import org.artifactory.update.security.SecurityInfoReader;
-import org.artifactory.update.utils.BackupUtils;
-import org.artifactory.version.ArtifactoryVersion;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.net.URL;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * @author freds
- * @date Nov 9, 2008
- */
-public class ReadOldBackupsTest {
-    private static final Logger log = LoggerFactory.getLogger(ReadOldBackupsTest.class);
-    protected final InfoFactory factory = InfoFactoryHolder.get();
-
-    @Test
-    public void testReadingVersion() throws Exception {
-        for (ArtifactoryVersion version : ArtifactoryVersion.values()) {
-            if (version.isCurrent()) {
-                // Nothing to do
-                continue;
-            }
-            String backupVersionFolder = "/backups/" + version.name();
-            URL resource = getClass().getResource(backupVersionFolder);
-            if (resource != null) {
-                File backupFolder = new File(resource.toURI());
-                ArtifactoryVersion backupVersion = BackupUtils.findVersion(backupFolder);
-                Assert.assertEquals(backupVersion, version);
-            } else {
-                log.debug("Version {} does not have a backup test folder in {}", version, backupVersionFolder);
-            }
-        }
-    }
-
-    @Test
-    public void testSecurityConversion() throws Exception {
-        ArtifactoryVersion version = ArtifactoryVersion.v130beta2;
-        String backupVersionFolder = "/backups/" + version.name();
-        URL resource = getClass().getResource(backupVersionFolder);
-        Assert.assertNotNull(resource, "Resource folder " + backupVersionFolder + " should exists");
-        File backupFolder = new File(resource.toURI());
-        ArtifactoryVersion backupVersion = BackupUtils.findVersion(backupFolder);
-        Assert.assertEquals(backupVersion, version);
-        SecurityInfo securityConfig = new SecurityInfoReader().read(new File(backupFolder, SecurityService.FILE_NAME));
-        List<UserInfo> users = securityConfig.getUsers();
-        Assert.assertEquals(users.size(), 6, "Should have 6 users");
-        UserInfo totoUser = users.get(users.indexOf(factory.createUser("toto")));
-        Assert.assertFalse(totoUser.isAdmin(), "Toto user should not be admin");
-        UserInfo superUser = users.get(users.indexOf(factory.createUser(CoreAddons.SUPER_USER_NAME)));
-        Assert.assertTrue(superUser.isAdmin(), "Super user should be admin");
-        List<GroupInfo> groups = securityConfig.getGroups();
-        Assert.assertTrue(groups == null || groups.isEmpty(), "There should be no groups");
-        List<AclInfo> acls = securityConfig.getAcls();
-        Assert.assertEquals(acls.size(), 6, "There should be 6 ACLs");
-        AclInfo anythingAcl = acls.get(acls.indexOf(factory.createAcl(
-                factory.createPermissionTarget(PermissionTargetInfo.ANY_PERMISSION_TARGET_NAME,
-                        Arrays.asList(PermissionTargetInfo.ANY_REPO)))));
-        Assert.assertEquals(anythingAcl.getAces().size(), 4, "Should be 4 ACE in Anything");
-    }
-}
diff --git a/storage/update/src/test/resources/backups/v122/artifactory.properties b/storage/update/src/test/resources/backups/v122/artifactory.properties
deleted file mode 100644
index a4a10a4..0000000
--- a/storage/update/src/test/resources/backups/v122/artifactory.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-artifactory.version=1.2.2
-artifactory.revision=836
\ No newline at end of file
diff --git a/storage/update/src/test/resources/backups/v122rc0/artifactory.properties b/storage/update/src/test/resources/backups/v122rc0/artifactory.properties
deleted file mode 100644
index b1b3bfd..0000000
--- a/storage/update/src/test/resources/backups/v122rc0/artifactory.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-artifactory.version=1.2.2-rc0
-artifactory.revision=804
\ No newline at end of file
diff --git a/storage/update/src/test/resources/backups/v122rc1/artifactory.properties b/storage/update/src/test/resources/backups/v122rc1/artifactory.properties
deleted file mode 100644
index bbfbb7f..0000000
--- a/storage/update/src/test/resources/backups/v122rc1/artifactory.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-artifactory.version=1.2.2-rc1
-artifactory.revision=819
\ No newline at end of file
diff --git a/storage/update/src/test/resources/backups/v122rc2/artifactory.properties b/storage/update/src/test/resources/backups/v122rc2/artifactory.properties
deleted file mode 100644
index 6cfa835..0000000
--- a/storage/update/src/test/resources/backups/v122rc2/artifactory.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-artifactory.version=1.2.2-rc2
-artifactory.revision=826
\ No newline at end of file
diff --git a/storage/update/src/test/resources/backups/v125/artifactory.properties b/storage/update/src/test/resources/backups/v125/artifactory.properties
deleted file mode 100644
index 6880136..0000000
--- a/storage/update/src/test/resources/backups/v125/artifactory.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-artifactory.version=1.2.5
-artifactory.revision=1154
\ No newline at end of file
diff --git a/storage/update/src/test/resources/backups/v125rc0/artifactory.properties b/storage/update/src/test/resources/backups/v125rc0/artifactory.properties
deleted file mode 100644
index ac9bcfd..0000000
--- a/storage/update/src/test/resources/backups/v125rc0/artifactory.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-artifactory.version=1.2.5-rc0
-artifactory.revision=970
\ No newline at end of file
diff --git a/storage/update/src/test/resources/backups/v125rc1/artifactory.properties b/storage/update/src/test/resources/backups/v125rc1/artifactory.properties
deleted file mode 100644
index 04e5227..0000000
--- a/storage/update/src/test/resources/backups/v125rc1/artifactory.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-artifactory.version=1.2.5-rc1
-artifactory.revision=1015
\ No newline at end of file
diff --git a/storage/update/src/test/resources/backups/v125rc2/artifactory.properties b/storage/update/src/test/resources/backups/v125rc2/artifactory.properties
deleted file mode 100644
index 099d617..0000000
--- a/storage/update/src/test/resources/backups/v125rc2/artifactory.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-artifactory.version=1.2.5-rc2
-artifactory.revision=1082
\ No newline at end of file
diff --git a/storage/update/src/test/resources/backups/v125rc3/artifactory.properties b/storage/update/src/test/resources/backups/v125rc3/artifactory.properties
deleted file mode 100644
index c69374d..0000000
--- a/storage/update/src/test/resources/backups/v125rc3/artifactory.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-artifactory.version=1.2.5-rc3
-artifactory.revision=1087
\ No newline at end of file
diff --git a/storage/update/src/test/resources/backups/v125rc4/artifactory.properties b/storage/update/src/test/resources/backups/v125rc4/artifactory.properties
deleted file mode 100644
index a12e6a9..0000000
--- a/storage/update/src/test/resources/backups/v125rc4/artifactory.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-artifactory.version=1.2.5-rc4
-artifactory.revision=1104
\ No newline at end of file
diff --git a/storage/update/src/test/resources/backups/v125rc5/artifactory.properties b/storage/update/src/test/resources/backups/v125rc5/artifactory.properties
deleted file mode 100644
index b44d99f..0000000
--- a/storage/update/src/test/resources/backups/v125rc5/artifactory.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-artifactory.version=1.2.5-rc5
-artifactory.revision=1115
\ No newline at end of file
diff --git a/storage/update/src/test/resources/backups/v125rc6/artifactory.properties b/storage/update/src/test/resources/backups/v125rc6/artifactory.properties
deleted file mode 100644
index 4282f6a..0000000
--- a/storage/update/src/test/resources/backups/v125rc6/artifactory.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-artifactory.version=1.2.5-rc6
-artifactory.revision=1136
\ No newline at end of file
diff --git a/storage/update/src/test/resources/backups/v125u1/artifactory.properties b/storage/update/src/test/resources/backups/v125u1/artifactory.properties
deleted file mode 100644
index 8e44327..0000000
--- a/storage/update/src/test/resources/backups/v125u1/artifactory.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-artifactory.version=1.2.5u1
-artifactory.revision=1174
\ No newline at end of file
diff --git a/storage/update/src/test/resources/backups/v130beta2/artifactory.config.xml b/storage/update/src/test/resources/backups/v130beta2/artifactory.config.xml
deleted file mode 100644
index 6a0e2f0..0000000
--- a/storage/update/src/test/resources/backups/v130beta2/artifactory.config.xml
+++ /dev/null
@@ -1,305 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.3.0"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.3.0
-        http://www.jfrog.org/xsd/artifactory-v1_3_0.xsd">
-    <!--
-    enable/disable anonymous downloads
-    -->
-    <!--<anonAccessEnabled>false</anonAccessEnabled>-->
-    <!--security>
-        <ldapSettings>
-            <authenticationMethod>bind-anonymous</authenticationMethod>
-            <ldapUrl>ldap://mydomain:389/dc=mycompany,dc=com</ldapUrl>
-            <userDnPattern>uid={0},ou=People</userDnPattern>
-            <managerDn></managerDn>
-            <managerPassword></managerPassword>
-            <searchAuthPasswordAttributeName>userPassword</searchAuthPasswordAttributeName>
-        </ldapSettings>
-    </security-->
-    <backup>
-        <!--
-        alternative backup dir
-        -->
-        <!--<dir></dir>-->
-        <!--
-        backup every 12 hours
-        -->
-        <cronExp>0 0 /12 * * ?</cronExp>
-        <!--
-        keep backups for a week.
-        Set to 0 in order to always backup to a "current" dir (useful for incremental FS backups).
-        -->
-        <retentionPeriodHours>168</retentionPeriodHours>
-        <!--
-        exclude certain repositories from being backed up
-        -->
-        <excludedRepositories>
-            <repositoryRef>repo1</repositoryRef>
-            <repositoryRef>codehaus-snapshots</repositoryRef>
-            <repositoryRef>java.net.m2</repositoryRef>
-            <repositoryRef>java.net.m1</repositoryRef>
-        </excludedRepositories>
-    </backup>
-    <!-- The cron definition to control the activation of the m2 eclipse indexer. Default every full hour. -->
-    <!--
-    <indexer>
-        <cronExp>0 /1 * * * ?</cronExp>
-    </indexer>
-    -->
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases-local</key>
-            <description>Local repository for plugins</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-releases-local</key>
-            <description>Local repository for third party libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshots-local</key>
-            <description>Local repository for third party snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-
-        <!--
-        A sample local repository with all possible settings
-        -->
-        <!--
-        <localRepository>
-            <key>local-sample</key>
-            <description>Sample local repository</description>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            -->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--
-        <maxUniqueSnapshots>3</maxUniqueSnapshots>
-        <includesPattern>*/**</includesPattern>
-        <excludesPattern>com/mycompany/**</excludesPattern>
-        -->
-        <!--
-        centrally control unique snapshots behavior (non-unique|unique|deployer)
-        -->
-        <!--
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-        </localRepository>
-        -->
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://repo1.maven.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus-snapshots</key>
-            <blackedOut>true</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://snapshots.repository.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m2</key>
-            <description>java.net Maven2 Format</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://download.java.net/maven/2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net.m1</key>
-            <description>java.net Maven1 Format</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <type>maven1</type>
-            <url>http://download.java.net/maven/1</url>
-        </remoteRepository>
-        <!--
-        <remoteRepository>
-            <key>codehaus</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://dist.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>ibiblio</key>
-            <excludesPattern>org/artifactory/**</excludesPattern>
-            <url>http://www.ibiblio.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>apache-m2-snapshots</key>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <url>http://people.apache.org/repo/m2-snapshot-repository</url>
-            <proxyRef>unused-proxy</proxyRef>
-        </remoteRepository>
-        -->
-
-        <!-- A sample remote repository with all possible tunings -->
-        <!--
-        <remoteRepository>
-        <key>remote-sample</key>
-        <description>Sample remote repository</description>
-        -->
-        <!--
-        blok the usage of this repository
-        -->
-        <!--<blackedOut>false</blackedOut>-->
-        <!--
-        maximum number of unique stnapshot to keep
-        -->
-        <!--<maxUniqueSnapshots>3</maxUniqueSnapshots>-->
-        <!--<includesPattern>*/**</includesPattern>-->
-        <!--<excludesPattern>com/mycompany/**</excludesPattern>-->
-        <!--<url>http://maven.repo/repository</url>-->
-        <!--
-        put offline to use only the cache and not send remote requests
-        -->
-        <!--<offline>false</offline>-->
-        <!--<hardFail>true</hardFail>-->
-        <!--
-        cache remotely retrieved artifacts (you'd want 'true')
-        -->
-        <!--<storeArtifactsLocally>true</storeArtifactsLocally>-->
-        <!--
-        number of seconds to cache artifact lookup results
-        -->
-        <!--<retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to cache artifact retrieval failures (normally communication errors)
-        -->
-        <!--<failedRetrievalCachePeriodSecs>30</failedRetrievalCachePeriodSecs>-->
-        <!--
-        number of seconds to remember artifact retrieval misses (artifact not found)
-        -->
-        <!--<missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>-->
-        <!--
-        ttp authentication details
-        -->
-        <!--<username>un</username>-->
-        <!--<password>pw</password>-->
-        <!--
-        network timeout for both connection establishment failures and unanswered requests
-        -->
-        <!--<socketTimeoutMillis>2000</socketTimeoutMillis>-->
-        <!--
-        proxy reference
-        -->
-        <!--<proxyRef>unused-proxy</proxyRef>-->
-        <!--</remoteRepository>-->
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <!-- This repositoy will be available at the url:
-        http://<host>:<port>/artifactory/snapshots-only/
-        (note the trailing slash!)
-        -->
-        <virtualRepository>
-            <key>remote-repos</key>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>java.net.m2</repositoryRef>
-                <repositoryRef>java.net.m1</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-releases</key>
-            <repositories>
-                <repositoryRef>libs-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-releases</key>
-            <repositories>
-                <repositoryRef>plugins-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshots</key>
-            <repositories>
-                <repositoryRef>libs-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-                <repositoryRef>codehaus-snapshots</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshots</key>
-            <repositories>
-                <repositoryRef>plugins-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-                <repositoryRef>codehaus-snapshots</repositoryRef>
-            </repositories>
-        </virtualRepository>
-    </virtualRepositories>
-
-    <!--
-        <proxies>
-            <proxy>
-                <key>unused-proxy</key>
-                <host>host</host>
-                <port>8080</port>
-                <username>un</username>
-                <password>pw</password>
-                <domain>mydomain</domain>
-            </proxy>
-        </proxies>
-    -->
-
-</config>
diff --git a/storage/update/src/test/resources/backups/v130beta2/artifactory.properties b/storage/update/src/test/resources/backups/v130beta2/artifactory.properties
deleted file mode 100644
index af77b3d..0000000
--- a/storage/update/src/test/resources/backups/v130beta2/artifactory.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-#Sun Nov 09 18:50:31 IST 2008
-artifactory.version=1.3.0-beta-2
-artifactory.revision=1509
diff --git a/storage/update/src/test/resources/backups/v130beta2/security.xml b/storage/update/src/test/resources/backups/v130beta2/security.xml
deleted file mode 100644
index e92b6e8..0000000
--- a/storage/update/src/test/resources/backups/v130beta2/security.xml
+++ /dev/null
@@ -1,235 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<security>
-    <users>
-        <org.artifactory.security.SimpleUser>
-            <password>f71dbe52628a3f83a77ab494817525c6</password>
-            <username>toto</username>
-            <authorities>
-                <org.springframework.security.GrantedAuthorityImpl>
-                    <role>user</role>
-                </org.springframework.security.GrantedAuthorityImpl>
-            </authorities>
-            <accountNonExpired>true</accountNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <enabled>true</enabled>
-            <admin>false</admin>
-            <updatableProfile>true</updatableProfile>
-        </org.artifactory.security.SimpleUser>
-        <org.artifactory.security.SimpleUser>
-            <password>1b3231655cebb7a1f783eddf27d254ca</password>
-            <username>super</username>
-            <authorities>
-                <org.springframework.security.GrantedAuthorityImpl>
-                    <role>admin</role>
-                </org.springframework.security.GrantedAuthorityImpl>
-                <org.springframework.security.GrantedAuthorityImpl>
-                    <role>user</role>
-                </org.springframework.security.GrantedAuthorityImpl>
-            </authorities>
-            <accountNonExpired>true</accountNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <enabled>true</enabled>
-            <admin>true</admin>
-            <updatableProfile>true</updatableProfile>
-        </org.artifactory.security.SimpleUser>
-        <org.artifactory.security.SimpleUser>
-            <password>bdb8c008fa551ba75f8481963f2201da</password>
-            <username>tutu</username>
-            <authorities>
-                <org.springframework.security.GrantedAuthorityImpl
-                        reference="../../../org.artifactory.security.SimpleUser/authorities/org.springframework.security.GrantedAuthorityImpl"/>
-            </authorities>
-            <accountNonExpired>true</accountNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <enabled>true</enabled>
-            <admin>false</admin>
-            <updatableProfile>true</updatableProfile>
-        </org.artifactory.security.SimpleUser>
-        <org.artifactory.security.SimpleUser>
-            <password>570a90bfbf8c7eab5dc5d4e26832d5b1</password>
-            <username>fred</username>
-            <authorities>
-                <org.springframework.security.GrantedAuthorityImpl
-                        reference="../../../org.artifactory.security.SimpleUser/authorities/org.springframework.security.GrantedAuthorityImpl"/>
-            </authorities>
-            <accountNonExpired>true</accountNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <enabled>true</enabled>
-            <admin>false</admin>
-            <updatableProfile>true</updatableProfile>
-        </org.artifactory.security.SimpleUser>
-        <org.artifactory.security.SimpleUser>
-            <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
-            <username>admin</username>
-            <authorities>
-                <org.springframework.security.GrantedAuthorityImpl
-                        reference="../../../org.artifactory.security.SimpleUser[2]/authorities/org.springframework.security.GrantedAuthorityImpl"/>
-                <org.springframework.security.GrantedAuthorityImpl
-                        reference="../../../org.artifactory.security.SimpleUser[2]/authorities/org.springframework.security.GrantedAuthorityImpl[2]"/>
-            </authorities>
-            <accountNonExpired>true</accountNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <enabled>true</enabled>
-            <admin>true</admin>
-            <updatableProfile>true</updatableProfile>
-        </org.artifactory.security.SimpleUser>
-        <org.artifactory.security.SimpleUser>
-            <password>d41d8cd98f00b204e9800998ecf8427e</password>
-            <username>anonymous</username>
-            <authorities>
-                <org.springframework.security.GrantedAuthorityImpl
-                        reference="../../../org.artifactory.security.SimpleUser/authorities/org.springframework.security.GrantedAuthorityImpl"/>
-            </authorities>
-            <accountNonExpired>true</accountNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <enabled>true</enabled>
-            <admin>false</admin>
-            <updatableProfile>false</updatableProfile>
-        </org.artifactory.security.SimpleUser>
-    </users>
-    <acls>
-        <org.artifactory.security.RepoPathAcl>
-            <aces class="org.apache.jackrabbit.ocm.manager.collectionconverter.impl.ManageableArrayList"
-                  serialization="custom">
-                <unserializable-parents/>
-                <list>
-                    <default>
-                        <size>2</size>
-                    </default>
-                    <int>10</int>
-                    <org.artifactory.security.RepoPathAce>
-                        <parentAcl reference="../../../.."/>
-                        <mask>3</mask>
-                        <principal>fred</principal>
-                    </org.artifactory.security.RepoPathAce>
-                    <org.artifactory.security.RepoPathAce>
-                        <parentAcl reference="../../../.."/>
-                        <mask>3</mask>
-                        <principal>toto</principal>
-                    </org.artifactory.security.RepoPathAce>
-                </list>
-            </aces>
-            <identifier>ext-snapshots-local%3aANY</identifier>
-            <updatedBy>admin</updatedBy>
-        </org.artifactory.security.RepoPathAcl>
-        <org.artifactory.security.RepoPathAcl>
-            <aces class="org.apache.jackrabbit.ocm.manager.collectionconverter.impl.ManageableArrayList"
-                  serialization="custom">
-                <unserializable-parents/>
-                <list>
-                    <default>
-                        <size>1</size>
-                    </default>
-                    <int>10</int>
-                    <org.artifactory.security.RepoPathAce>
-                        <parentAcl reference="../../../.."/>
-                        <mask>19</mask>
-                        <principal>tutu</principal>
-                    </org.artifactory.security.RepoPathAce>
-                </list>
-            </aces>
-            <identifier>plugins-releases-local%3aorg.apache</identifier>
-            <updatedBy>admin</updatedBy>
-        </org.artifactory.security.RepoPathAcl>
-        <org.artifactory.security.RepoPathAcl>
-            <aces class="org.apache.jackrabbit.ocm.manager.collectionconverter.impl.ManageableArrayList"
-                  serialization="custom">
-                <unserializable-parents/>
-                <list>
-                    <default>
-                        <size>1</size>
-                    </default>
-                    <int>10</int>
-                    <org.artifactory.security.RepoPathAce>
-                        <parentAcl reference="../../../.."/>
-                        <mask>19</mask>
-                        <principal>toto</principal>
-                    </org.artifactory.security.RepoPathAce>
-                </list>
-            </aces>
-            <identifier>libs-releases-local%3aANY</identifier>
-            <updatedBy>admin</updatedBy>
-        </org.artifactory.security.RepoPathAcl>
-        <org.artifactory.security.RepoPathAcl>
-            <aces class="org.apache.jackrabbit.ocm.manager.collectionconverter.impl.ManageableArrayList"
-                  serialization="custom">
-                <unserializable-parents/>
-                <list>
-                    <default>
-                        <size>2</size>
-                    </default>
-                    <int>10</int>
-                    <org.artifactory.security.RepoPathAce>
-                        <parentAcl reference="../../../.."/>
-                        <mask>3</mask>
-                        <principal>tutu</principal>
-                    </org.artifactory.security.RepoPathAce>
-                    <org.artifactory.security.RepoPathAce>
-                        <parentAcl reference="../../../.."/>
-                        <mask>19</mask>
-                        <principal>fred</principal>
-                    </org.artifactory.security.RepoPathAce>
-                </list>
-            </aces>
-            <identifier>ANY%3aorg.jfrog</identifier>
-            <updatedBy>admin</updatedBy>
-        </org.artifactory.security.RepoPathAcl>
-        <org.artifactory.security.RepoPathAcl>
-            <aces class="org.apache.jackrabbit.ocm.manager.collectionconverter.impl.ManageableArrayList"
-                  serialization="custom">
-                <unserializable-parents/>
-                <list>
-                    <default>
-                        <size>4</size>
-                    </default>
-                    <int>10</int>
-                    <org.artifactory.security.RepoPathAce>
-                        <parentAcl reference="../../../.."/>
-                        <mask>1</mask>
-                        <principal>anonymous</principal>
-                    </org.artifactory.security.RepoPathAce>
-                    <org.artifactory.security.RepoPathAce>
-                        <parentAcl reference="../../../.."/>
-                        <mask>1</mask>
-                        <principal>fred</principal>
-                    </org.artifactory.security.RepoPathAce>
-                    <org.artifactory.security.RepoPathAce>
-                        <parentAcl reference="../../../.."/>
-                        <mask>1</mask>
-                        <principal>toto</principal>
-                    </org.artifactory.security.RepoPathAce>
-                    <org.artifactory.security.RepoPathAce>
-                        <parentAcl reference="../../../.."/>
-                        <mask>1</mask>
-                        <principal>tutu</principal>
-                    </org.artifactory.security.RepoPathAce>
-                </list>
-            </aces>
-            <identifier>ANY%3aANY</identifier>
-            <updatedBy>unknown</updatedBy>
-        </org.artifactory.security.RepoPathAcl>
-    </acls>
-</security>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/backups/v130beta3/artifactory.config.xml b/storage/update/src/test/resources/backups/v130beta3/artifactory.config.xml
deleted file mode 100644
index d99c0b1..0000000
--- a/storage/update/src/test/resources/backups/v130beta3/artifactory.config.xml
+++ /dev/null
@@ -1,159 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns="http://artifactory.jfrog.org/xsd/1.3.1"
-        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.3.1         http://www.jfrog.org/xsd/artifactory-v1_3_1.xsd">
-
-
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local Repository for Applications Releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-local</key>
-            <description>Local Repository for Applications Snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases-local</key>
-            <description>Local Repository for Plugins Releases</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-local</key>
-            <description>Local Repository for Plugins Snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>third-party-releases-local</key>
-            <description>Local Repository for Third party libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>third-party-snapshots-local</key>
-            <description>Local Repository for Third party snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://repo1.maven.org/maven2</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>codehaus-snapshots</key>
-            <blackedOut>true</blackedOut>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://snapshots.repository.codehaus.org</url>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net</key>
-            <description>java.net</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <url>http://download.java.net/maven/2</url>
-        </remoteRepository>
-
-
-    </remoteRepositories>
-    <virtualRepositories>
-        <virtualRepository>
-            <key>plugins-releases</key>
-            <repositories>
-                <repositoryRef>plugins-releases-local</repositoryRef>
-                <repositoryRef>java.net</repositoryRef>
-                <repositoryRef>codehaus-snapshots</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshots</key>
-            <repositories>
-                <repositoryRef>plugins-snapshots-local</repositoryRef>
-                <repositoryRef>java.net</repositoryRef>
-                <repositoryRef>codehaus-snapshots</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>third-party-releases</key>
-            <repositories>
-                <repositoryRef>third-party-releases-local</repositoryRef>
-                <repositoryRef>java.net</repositoryRef>
-                <repositoryRef>codehaus-snapshots</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshots</key>
-            <repositories>
-                <repositoryRef>libs-snapshots-local</repositoryRef>
-                <repositoryRef>java.net</repositoryRef>
-                <repositoryRef>codehaus-snapshots</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-releases</key>
-            <repositories>
-                <repositoryRef>libs-releases-local</repositoryRef>
-                <repositoryRef>java.net</repositoryRef>
-                <repositoryRef>codehaus-snapshots</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>third-party-snapshots</key>
-            <repositories>
-                <repositoryRef>third-party-snapshots-local</repositoryRef>
-                <repositoryRef>java.net</repositoryRef>
-                <repositoryRef>codehaus-snapshots</repositoryRef>
-                <repositoryRef>repo1</repositoryRef>
-            </repositories>
-        </virtualRepository>
-    </virtualRepositories>
-
-    <proxies>
-        <proxy>
-            <key>unused-proxy</key>
-            <host>host</host>
-            <port>8080</port>
-            <username>un</username>
-            <password>pw</password>
-            <domain>domain</domain>
-        </proxy>
-    </proxies>
-
-</config>
diff --git a/storage/update/src/test/resources/backups/v130beta3/artifactory.properties b/storage/update/src/test/resources/backups/v130beta3/artifactory.properties
deleted file mode 100644
index 8f2e3a5..0000000
--- a/storage/update/src/test/resources/backups/v130beta3/artifactory.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-#Wed Sep 10 12:00:03 IDT 2008
-artifactory.version=1.3.0-beta-3
-artifactory.revision=1992
diff --git a/storage/update/src/test/resources/backups/v130beta3/security.xml b/storage/update/src/test/resources/backups/v130beta3/security.xml
deleted file mode 100644
index 08bf1b4..0000000
--- a/storage/update/src/test/resources/backups/v130beta3/security.xml
+++ /dev/null
@@ -1,210 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<security>
-    <users>
-        <user>
-            <username>admin</username>
-            <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
-            <admin>true</admin>
-            <enabled>true</enabled>
-            <updatableProfile>true</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups/>
-        </user>
-        <user>
-            <username>fred</username>
-            <password>f71dbe52628a3f83a77ab494817525c6</password>
-            <admin>false</admin>
-            <enabled>true</enabled>
-            <updatableProfile>true</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups/>
-        </user>
-        <user>
-            <username>super</username>
-            <password>1b3231655cebb7a1f783eddf27d254ca</password>
-            <admin>true</admin>
-            <enabled>true</enabled>
-            <updatableProfile>true</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups/>
-        </user>
-        <user>
-            <username>reader</username>
-            <password>1de9b0a30075ae8c303eb420c103c320</password>
-            <admin>false</admin>
-            <enabled>true</enabled>
-            <updatableProfile>true</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups/>
-        </user>
-        <user>
-            <username>guest</username>
-            <password>084e0343a0486ff05530df6c705c8bb4</password>
-            <admin>false</admin>
-            <enabled>true</enabled>
-            <updatableProfile>true</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups/>
-        </user>
-        <user>
-            <username>toto</username>
-            <password>f71dbe52628a3f83a77ab494817525c6</password>
-            <admin>true</admin>
-            <enabled>true</enabled>
-            <updatableProfile>true</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups/>
-        </user>
-        <user>
-            <username>tutu</username>
-            <password>bdb8c008fa551ba75f8481963f2201da</password>
-            <admin>false</admin>
-            <enabled>true</enabled>
-            <updatableProfile>true</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups/>
-        </user>
-    </users>
-    <groups/>
-    <acls>
-        <acl>
-            <permissionTarget>
-                <name>ANY:ANY</name>
-                <repoKey>ANY-local</repoKey>
-                <includes>
-                    <string>**</string>
-                </includes>
-                <excludes/>
-            </permissionTarget>
-            <aces>
-                <ace>
-                    <principal>guest</principal>
-                    <group>false</group>
-                    <mask>10</mask>
-                </ace>
-                <ace>
-                    <principal>reader</principal>
-                    <group>false</group>
-                    <mask>10</mask>
-                </ace>
-                <ace>
-                    <principal>fred</principal>
-                    <group>false</group>
-                    <mask>4</mask>
-                </ace>
-            </aces>
-        </acl>
-        <acl>
-            <permissionTarget>
-                <name>libs-releases:ANY</name>
-                <repoKey>libs-releases-local</repoKey>
-                <includes>
-                    <string>**</string>
-                </includes>
-                <excludes/>
-            </permissionTarget>
-            <aces>
-                <ace>
-                    <principal>reader</principal>
-                    <group>false</group>
-                    <mask>10</mask>
-                </ace>
-                <ace>
-                    <principal>fred</principal>
-                    <group>false</group>
-                    <mask>10</mask>
-                </ace>
-            </aces>
-        </acl>
-        <acl>
-            <permissionTarget>
-                <name>ANY:org</name>
-                <repoKey>ANY-local</repoKey>
-                <includes>
-                    <string>org/**</string>
-                </includes>
-                <excludes/>
-            </permissionTarget>
-            <aces>
-                <ace>
-                    <principal>guest</principal>
-                    <group>false</group>
-                    <mask>10</mask>
-                </ace>
-                <ace>
-                    <principal>reader</principal>
-                    <group>false</group>
-                    <mask>4</mask>
-                </ace>
-                <ace>
-                    <principal>fred</principal>
-                    <group>false</group>
-                    <mask>4</mask>
-                </ace>
-            </aces>
-        </acl>
-        <acl>
-            <permissionTarget>
-                <name>plugins-releases:ANY</name>
-                <repoKey>plugins-releases-local</repoKey>
-                <includes>
-                    <string>**</string>
-                </includes>
-                <excludes/>
-            </permissionTarget>
-            <aces>
-                <ace>
-                    <principal>guest</principal>
-                    <group>false</group>
-                    <mask>10</mask>
-                </ace>
-                <ace>
-                    <principal>reader</principal>
-                    <group>false</group>
-                    <mask>10</mask>
-                </ace>
-                <ace>
-                    <principal>tutu</principal>
-                    <group>false</group>
-                    <mask>1</mask>
-                </ace>
-                <ace>
-                    <principal>fred</principal>
-                    <group>false</group>
-                    <mask>4</mask>
-                </ace>
-            </aces>
-        </acl>
-    </acls>
-</security>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/backups/v130beta5/artifactory.config.xml b/storage/update/src/test/resources/backups/v130beta5/artifactory.config.xml
deleted file mode 100644
index 5d22cf8..0000000
--- a/storage/update/src/test/resources/backups/v130beta5/artifactory.config.xml
+++ /dev/null
@@ -1,146 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="http://artifactory.jfrog.org/xsd/1.3.2"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.3.2
-        http://www.jfrog.org/xsd/artifactory-v1_3_2.xsd">
-
-    <serverName>Local Test</serverName>
-
-    <security>
-        <!--
-        enable/disable anonymous downloads
-        -->
-        <anonAccessEnabled>true</anonAccessEnabled>
-        <!--
-        <ldapSettings>
-            <ldapUrl>ldap://127.0.0.1:10389/dc=jfrog,dc=org</ldapUrl>
-            <authenticationPatterns>
-                <authenticationPattern>
-                    <userDnPattern>uid={0}, ou=People</userDnPattern>
-                </authenticationPattern>
-            </authenticationPatterns>
-            <managerDn></managerDn>
-            <managerPassword></managerPassword>
-        </ldapSettings>
-        -->
-    </security>
-    <!--
-        <backups>
-            <backup>
-                <cronExp>0 /1 * * * ?</cronExp>
-                <retentionPeriodHours>0</retentionPeriodHours>
-            </backup>
-        </backups>
-    -->
-
-    <!-- The cron definition to control the activation of the m2 eclipse indexer. Default every full hour. -->
-    <indexer>
-        <cronExp>0 0 /1 * * ?</cronExp>
-    </indexer>
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases-local</key>
-            <description>Local repository for plugins</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-releases-local</key>
-            <description>Local repository for third party libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshots-local</key>
-            <description>Local repository for third party snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>remote-repo</key>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <!--<url>http://10.0.0.13:8081/artifactory/remote-repos/</url>-->
-            <!--<url>http://swamp.jfrog.org:8081/artifactory/remote-repos/</url>-->
-            <url>http://10.0.0.13:8081/artifactory/remote-repos</url>
-            <!--<offline>true</offline>-->
-        </remoteRepository>
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <virtualRepository>
-            <key>libs-releases</key>
-            <repositories>
-                <repositoryRef>libs-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repo</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-releases</key>
-            <repositories>
-                <repositoryRef>plugins-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repo</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshots</key>
-            <repositories>
-                <repositoryRef>libs-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repo</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshots</key>
-            <repositories>
-                <repositoryRef>plugins-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repo</repositoryRef>
-            </repositories>
-        </virtualRepository>
-    </virtualRepositories>
-
-</config>
diff --git a/storage/update/src/test/resources/backups/v130beta5/artifactory.properties b/storage/update/src/test/resources/backups/v130beta5/artifactory.properties
deleted file mode 100644
index fa85f47..0000000
--- a/storage/update/src/test/resources/backups/v130beta5/artifactory.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# Artifactory is a binaries repository manager.
-# Copyright (C) 2012 JFrog Ltd.
-#
-# Artifactory is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Artifactory is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-#Sun Nov 09 17:44:01 IST 2008
-artifactory.version=1.3.0-beta-5
-artifactory.revision=2282
diff --git a/storage/update/src/test/resources/backups/v130beta5/security.xml b/storage/update/src/test/resources/backups/v130beta5/security.xml
deleted file mode 100644
index 8d7d156..0000000
--- a/storage/update/src/test/resources/backups/v130beta5/security.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<security>
-    <users>
-        <user>
-            <username>admin</username>
-            <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
-            <admin>true</admin>
-            <enabled>true</enabled>
-            <updatableProfile>true</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups/>
-        </user>
-        <user>
-            <username>anonymous</username>
-            <password>d41d8cd98f00b204e9800998ecf8427e</password>
-            <admin>false</admin>
-            <enabled>true</enabled>
-            <updatableProfile>false</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups/>
-        </user>
-    </users>
-    <groups/>
-    <acls>
-        <acl>
-            <permissionTarget>
-                <name>Anything</name>
-                <repoKey>ANY</repoKey>
-                <includes>
-                    <string>**</string>
-                </includes>
-                <excludes/>
-            </permissionTarget>
-            <aces>
-                <ace>
-                    <principal>anonymous</principal>
-                    <group>false</group>
-                    <mask>1</mask>
-                </ace>
-            </aces>
-            <updatedBy>unknown</updatedBy>
-        </acl>
-    </acls>
-</security>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/config/artifactory.config.136.xml b/storage/update/src/test/resources/config/artifactory.config.136.xml
deleted file mode 100644
index 956ccf2..0000000
--- a/storage/update/src/test/resources/config/artifactory.config.136.xml
+++ /dev/null
@@ -1,223 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns="http://artifactory.jfrog.org/xsd/1.3.6">
-    <serverName>Dev Server</serverName>
-    <offlineMode>false</offlineMode>
-    <fileUploadMaxSizeMb>10</fileUploadMaxSizeMb>
-    <dateFormat>dd-MM-yy HH:mm:ssZ</dateFormat>
-    <security>
-        <anonAccessEnabled>false</anonAccessEnabled>
-        <passwordSettings>
-            <encryptionPolicy>supported</encryptionPolicy>
-        </passwordSettings>
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <enabled>true</enabled>
-            <cronExp>0 30 23 * * ?</cronExp>
-            <retentionPeriodHours>0</retentionPeriodHours>
-            <createArchive>false</createArchive>
-            <excludedRepositories>
-                <repositoryRef>java.net</repositoryRef>
-                <repositoryRef>jboss</repositoryRef>
-                <repositoryRef>repo1.maven</repositoryRef>
-            </excludedRepositories>
-        </backup>
-    </backups>
-    <localRepositories>
-        <localRepository>
-            <key>ext-libs-local</key>
-            <description>libraries and plugins local repoitory</description>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <includesPattern>**/*</includesPattern>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-        </localRepository>
-        <localRepository>
-            <key>my-releases-local</key>
-            <description>my releases packages</description>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <includesPattern>**/*</includesPattern>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-        </localRepository>
-        <localRepository>
-            <key>my-snapshots-local</key>
-            <description>my packages in development</description>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <includesPattern>**/*</includesPattern>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-        </localRepository>
-    </localRepositories>
-    <remoteRepositories>
-        <remoteRepository>
-            <key>repo1.maven</key>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <includesPattern>**/*</includesPattern>
-            <excludesPattern>my/**,noc/**,alphacsp/**,com/my/**,com/alphacsp/**,jboss/**,org/jboss/**</excludesPattern>
-            <type>maven2</type>
-            <url>http://repo1.maven.org/maven2</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <failedRetrievalCachePeriodSecs>30</failedRetrievalCachePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <checksumPolicyType>generate-if-absent</checksumPolicyType>
-            <socketTimeoutMillis>20000</socketTimeoutMillis>
-        </remoteRepository>
-        <remoteRepository>
-            <key>java.net</key>
-            <blackedOut>true</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <includesPattern>**/*</includesPattern>
-            <excludesPattern>my/**,noc/**,alphacsp/**,com/my/**,com/alphacsp/**,jboss/**,org/jboss/**</excludesPattern>
-            <type>maven2</type>
-            <url>http://download.java.net/maven/2</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <failedRetrievalCachePeriodSecs>30</failedRetrievalCachePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <checksumPolicyType>generate-if-absent</checksumPolicyType>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jboss</key>
-            <description>JBoss Maven2 repository</description>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <includesPattern>**/*</includesPattern>
-            <excludesPattern>my/**,noc/**,alphacsp/**,com/my/**,com/alphacsp/**</excludesPattern>
-            <type>maven2</type>
-            <url>http://repository.jboss.org/maven2</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <failedRetrievalCachePeriodSecs>30</failedRetrievalCachePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <checksumPolicyType>generate-if-absent</checksumPolicyType>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-        </remoteRepository>
-        <remoteRepository>
-            <key>terracotta</key>
-            <description>Terracotta Maven2 repository</description>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <includesPattern>org/terracotta/**,org/apache/tomcat/**,org/dijon/**,berkeleydb/**,knopflerfish-tc/**,javax/management/**,net/sf/ehcache/**</includesPattern>            <type>maven2</type>
-            <url>http://terracotta.artifactoryonline.com/terracotta/original/</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <failedRetrievalCachePeriodSecs>30</failedRetrievalCachePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <checksumPolicyType>generate-if-absent</checksumPolicyType>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-        </remoteRepository>
-        <remoteRepository>
-            <key>jfrog-libs</key>
-            <description>JFrog repo releases libraries</description>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <includesPattern>**/*</includesPattern>
-            <type>maven2</type>
-            <url>http://repo.jfrog.org/artifactory/libs-releases-local</url>
-            <offline>false</offline>
-            <hardFail>false</hardFail>
-            <storeArtifactsLocally>true</storeArtifactsLocally>
-            <retrievalCachePeriodSecs>43200</retrievalCachePeriodSecs>
-            <failedRetrievalCachePeriodSecs>30</failedRetrievalCachePeriodSecs>
-            <missedRetrievalCachePeriodSecs>43200</missedRetrievalCachePeriodSecs>
-            <checksumPolicyType>generate-if-absent</checksumPolicyType>
-            <socketTimeoutMillis>15000</socketTimeoutMillis>
-        </remoteRepository>
-    </remoteRepositories>
-    <virtualRepositories>
-        <virtualRepository>
-            <key>my-releases</key>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>false</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>my-releases-local</repositoryRef>
-                <repositoryRef>ext-libs-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>my-snapshots</key>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>false</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>my-snapshots-local</repositoryRef>
-                <repositoryRef>ext-libs-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>ext-libs</key>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>false</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>ext-libs-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>cluster</key>
-            <description>The virtual repo for cluster build</description>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>false</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>ext-libs-local</repositoryRef>
-                <repositoryRef>terracotta</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>remote-repos</key>
-            <description>Basic remote repositories</description>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>repo1.maven</repositoryRef>
-                <repositoryRef>java.net</repositoryRef>
-                <repositoryRef>jboss</repositoryRef>
-            </repositories>
-        </virtualRepository>
-    </virtualRepositories>
-    <proxies/>
-</config>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/config/v6/artifactory.config.xml b/storage/update/src/test/resources/config/v6/artifactory.config.xml
deleted file mode 100644
index bbf4e90..0000000
--- a/storage/update/src/test/resources/config/v6/artifactory.config.xml
+++ /dev/null
@@ -1,175 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<config xmlns="http://artifactory.jfrog.org/xsd/1.4.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xsi:schemaLocation="http://artifactory.jfrog.org/xsd/1.4.3 http://www.jfrog.org/xsd/artifactory-v1_4_3.xsd">
-
-    <security>
-        <anonAccessEnabled>true</anonAccessEnabled>
-    </security>
-    <backups>
-        <backup>
-            <key>backup1</key>
-            <enabled>false</enabled>
-            <cronExp>0 0 /12 * * ?</cronExp>
-            <retentionPeriodHours>0</retentionPeriodHours>
-            <excludedRepositories>
-                <repositoryRef>remote-repo</repositoryRef>
-            </excludedRepositories>
-        </backup>
-    </backups>
-    <!-- The interval at which to activate the m2eclipse indexer. -->
-    <!--
-    <indexer>
-        <indexingIntervalHours>24</indexingIntervalHours>
-    </indexer>
-    -->
-    <localRepositories>
-        <localRepository>
-            <key>libs-releases-local</key>
-            <description>Local repository for in-house libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>libs-snapshots-local</key>
-            <description>Local repository for in-house snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-releases-local</key>
-            <description>Local repository for plugins</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>plugins-snapshots-local</key>
-            <description>Local repository for plugins snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-releases-local</key>
-            <description>Local repository for third party libraries</description>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>ext-snapshots-local</key>
-            <description>Local repository for third party snapshots</description>
-            <handleReleases>false</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-        </localRepository>
-        <localRepository>
-            <key>UNIQUE</key>
-            <includesPattern>**/*</includesPattern>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>5</maxUniqueSnapshots>
-            <snapshotVersionBehavior>unique</snapshotVersionBehavior>
-        </localRepository>
-        <localRepository>
-            <key>NONUNIQUE</key>
-            <includesPattern>**/*</includesPattern>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>0</maxUniqueSnapshots>
-            <snapshotVersionBehavior>non-unique</snapshotVersionBehavior>
-        </localRepository>
-        <localRepository>
-            <key>DEPLOYER</key>
-            <includesPattern>**/*</includesPattern>
-            <blackedOut>false</blackedOut>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>true</handleSnapshots>
-            <maxUniqueSnapshots>5</maxUniqueSnapshots>
-            <snapshotVersionBehavior>deployer</snapshotVersionBehavior>
-        </localRepository>
-    </localRepositories>
-
-    <remoteRepositories>
-        <remoteRepository>
-            <key>remote-repo</key>
-            <excludesPattern>org/artifactory/**,org/jfrog/**</excludesPattern>
-            <handleReleases>true</handleReleases>
-            <handleSnapshots>false</handleSnapshots>
-            <url>http://repo.jfrog.org/artifactory/remote-repos</url>
-            <!--<url>http://repo1.maven.org/maven2</url>-->
-        </remoteRepository>
-    </remoteRepositories>
-
-    <virtualRepositories>
-        <!-- This repositoy will be available at the url:
-        http://<host>:<port>/artifactory/snapshots-only/
-        (note the trailing slash!)
-        -->
-        <virtualRepository>
-            <key>remote-repos</key>
-            <artifactoryRequestsCanRetrieveRemoteArtifacts>true</artifactoryRequestsCanRetrieveRemoteArtifacts>
-            <repositories>
-                <repositoryRef>remote-repo</repositoryRef>
-            </repositories>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-releases</key>
-            <repositories>
-                <repositoryRef>libs-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>UNIQUE</repositoryRef>
-                <repositoryRef>NONUNIQUE</repositoryRef>
-                <repositoryRef>DEPLOYER</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-releases</key>
-            <repositories>
-                <repositoryRef>plugins-releases-local</repositoryRef>
-                <repositoryRef>ext-releases-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>libs-snapshots</key>
-            <repositories>
-                <repositoryRef>libs-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>UNIQUE</repositoryRef>
-                <repositoryRef>NONUNIQUE</repositoryRef>
-                <repositoryRef>DEPLOYER</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-        <virtualRepository>
-            <key>plugins-snapshots</key>
-            <repositories>
-                <repositoryRef>plugins-snapshots-local</repositoryRef>
-                <repositoryRef>ext-snapshots-local</repositoryRef>
-                <repositoryRef>remote-repos</repositoryRef>
-            </repositories>
-            <pomRepositoryReferencesCleanupPolicy>discard_active_reference</pomRepositoryReferencesCleanupPolicy>
-        </virtualRepository>
-    </virtualRepositories>
-</config>
diff --git a/storage/update/src/test/resources/metadata/v125rc0/commons-cli-1.0.pom-expected.xml b/storage/update/src/test/resources/metadata/v125rc0/commons-cli-1.0.pom-expected.xml
deleted file mode 100644
index 6d12ee5..0000000
--- a/storage/update/src/test/resources/metadata/v125rc0/commons-cli-1.0.pom-expected.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<artifactory-file>
-    <lastModified>1131487912000</lastModified>
-    <mimeType>application/xml</mimeType>
-    <created>1228124642312</created>
-    <name>commons-cli-1.0.pom</name>
-    <repoPath>
-        <repoKey>repo1-cache</repoKey>
-        <path>commons-cli/commons-cli/1.0/commons-cli-1.0.pom</path>
-    </repoPath>
-    <extension>
-        <lastUpdated>1228124642796</lastUpdated>
-        <modifiedBy/>
-        <createdBy></createdBy>
-    </extension>
-</artifactory-file>
diff --git a/storage/update/src/test/resources/metadata/v125rc0/commons-cli-1.0.pom.artifactory-metadata b/storage/update/src/test/resources/metadata/v125rc0/commons-cli-1.0.pom.artifactory-metadata
deleted file mode 100644
index 071e6a0..0000000
--- a/storage/update/src/test/resources/metadata/v125rc0/commons-cli-1.0.pom.artifactory-metadata
+++ /dev/null
@@ -1,11 +0,0 @@
-<file>
-  <lastUpdated>1228124642796</lastUpdated>
-  <lastModified>1131487912000</lastModified>
-  <downloadCount>99</downloadCount>
-  <mimeType>application/xml</mimeType>
-  <xmlAware>true</xmlAware>
-  <repoKey>repo1-cache</repoKey>
-  <relPath>commons-cli/commons-cli/1.0/commons-cli-1.0.pom</relPath>
-  <created>1228124642312</created>
-  <modifiedBy></modifiedBy>
-</file>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/metadata/v125rc0/commons-cli-expected.xml b/storage/update/src/test/resources/metadata/v125rc0/commons-cli-expected.xml
deleted file mode 100644
index 7c51d10..0000000
--- a/storage/update/src/test/resources/metadata/v125rc0/commons-cli-expected.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<artifactory-folder>
-    <created>1228124642312</created>
-    <name>null</name>
-    <repoPath>
-        <repoKey>repo1-cache</repoKey>
-        <path>commons-cli/null</path>
-    </repoPath>
-    <extension>
-        <modifiedBy/>
-        <createdBy></createdBy>
-    </extension>
-</artifactory-folder>
diff --git a/storage/update/src/test/resources/metadata/v125rc0/commons-cli.artifactory-metadata b/storage/update/src/test/resources/metadata/v125rc0/commons-cli.artifactory-metadata
deleted file mode 100644
index 60784d1..0000000
--- a/storage/update/src/test/resources/metadata/v125rc0/commons-cli.artifactory-metadata
+++ /dev/null
@@ -1,6 +0,0 @@
-<folder>
-  <repoKey>repo1-cache</repoKey>
-  <relPath>commons-cli</relPath>
-  <created>1228124642312</created>
-  <modifiedBy></modifiedBy>
-</folder>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/metadata/v130beta3/0.1.23.artifactory-metadata/artifactory.folder.xml b/storage/update/src/test/resources/metadata/v130beta3/0.1.23.artifactory-metadata/artifactory.folder.xml
deleted file mode 100644
index 9640624..0000000
--- a/storage/update/src/test/resources/metadata/v130beta3/0.1.23.artifactory-metadata/artifactory.folder.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<artifactory.folder>
-    <repoKey>repo1-cache</repoKey>
-    <relPath>com/jcraft/jsch/0.1.23</relPath>
-    <created>0</created>
-    <modifiedBy>anonymous</modifiedBy>
-</artifactory.folder>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/metadata/v130beta3/artifactory.file-expected.xml b/storage/update/src/test/resources/metadata/v130beta3/artifactory.file-expected.xml
deleted file mode 100644
index ea40bbc..0000000
--- a/storage/update/src/test/resources/metadata/v130beta3/artifactory.file-expected.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<artifactory-file>
-    <created>0</created>
-    <lastModified>1132809621000</lastModified>
-    <size>9928</size>
-    <name>commons-lang-2.1.pom</name>
-    <repoPath>
-        <repoKey>repo1-cache</repoKey>
-        <path>commons-lang/commons-lang/2.1/commons-lang-2.1.pom</path>
-    </repoPath>
-    <extension>
-        <lastUpdated>1228118176359</lastUpdated>
-        <modifiedBy>anonymous</modifiedBy>
-        <createdBy>anonymous</createdBy>
-        <sha1>a34d992202615804c534953aba402de55d8ee47c</sha1>
-        <md5>8e41bacdd69de9373c20326d231c8a5d</md5>
-    </extension>
-    <mimeType>application/x-maven-pom+xml</mimeType>
-</artifactory-file>
diff --git a/storage/update/src/test/resources/metadata/v130beta3/artifactory.file.xml b/storage/update/src/test/resources/metadata/v130beta3/artifactory.file.xml
deleted file mode 100644
index c4c3b72..0000000
--- a/storage/update/src/test/resources/metadata/v130beta3/artifactory.file.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<artifactory.file>
-    <repoKey>repo1-cache</repoKey>
-    <relPath>commons-lang/commons-lang/2.1/commons-lang-2.1.pom</relPath>
-    <created>0</created>
-    <modifiedBy>anonymous</modifiedBy>
-    <lastUpdated>1228118176359</lastUpdated>
-    <lastModified>1132809621000</lastModified>
-    <size>9928</size>
-    <mimeType>text/xml</mimeType>
-    <sha1>a34d992202615804c534953aba402de55d8ee47c</sha1>
-    <md5>8e41bacdd69de9373c20326d231c8a5d</md5>
-</artifactory.file>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/metadata/v130beta3/artifactory.folder-expected.xml b/storage/update/src/test/resources/metadata/v130beta3/artifactory.folder-expected.xml
deleted file mode 100644
index 51648e0..0000000
--- a/storage/update/src/test/resources/metadata/v130beta3/artifactory.folder-expected.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<artifactory-folder>
-    <repoPath>
-        <repoKey>repo1-cache</repoKey>
-        <path>commons-lang/commons-lang</path>
-    </repoPath>
-    <name>commons-lang</name>
-    <created>0</created>
-    <extension>
-        <createdBy>anonymous</createdBy>
-        <modifiedBy>anonymous</modifiedBy>
-    </extension>
-</artifactory-folder>
diff --git a/storage/update/src/test/resources/metadata/v130beta3/artifactory.folder.xml b/storage/update/src/test/resources/metadata/v130beta3/artifactory.folder.xml
deleted file mode 100644
index 378fa4a..0000000
--- a/storage/update/src/test/resources/metadata/v130beta3/artifactory.folder.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<artifactory.folder>
-    <repoKey>repo1-cache</repoKey>
-    <relPath>commons-lang/commons-lang</relPath>
-    <created>0</created>
-    <modifiedBy>anonymous</modifiedBy>
-</artifactory.folder>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/metadata/v130beta3/jsch-0.1.23.pom.artifactory-metadata/artifactory.file.xml b/storage/update/src/test/resources/metadata/v130beta3/jsch-0.1.23.pom.artifactory-metadata/artifactory.file.xml
deleted file mode 100644
index d13f9b8..0000000
--- a/storage/update/src/test/resources/metadata/v130beta3/jsch-0.1.23.pom.artifactory-metadata/artifactory.file.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<artifactory.file>
-    <repoKey>repo1-cache</repoKey>
-    <relPath>com/jcraft/jsch/0.1.23/jsch-0.1.23.pom</relPath>
-    <created>0</created>
-    <modifiedBy>anonymous</modifiedBy>
-    <lastUpdated>1228118022890</lastUpdated>
-    <lastModified>1131489126000</lastModified>
-    <size>485</size>
-    <mimeType>text/xml</mimeType>
-    <sha1>1d4266015cc4deba8bf4b56441ebc02cd170503d</sha1>
-    <md5>f1298dace833ceafd88f6cd6acc26c64</md5>
-</artifactory.file>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/metadata/v130beta3/jsch-0.1.23.pom.artifactory-metadata/artifactory.stats.xml b/storage/update/src/test/resources/metadata/v130beta3/jsch-0.1.23.pom.artifactory-metadata/artifactory.stats.xml
deleted file mode 100644
index 8225ed6..0000000
--- a/storage/update/src/test/resources/metadata/v130beta3/jsch-0.1.23.pom.artifactory-metadata/artifactory.stats.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<artifactory.stats>
-    <downloadCount>1</downloadCount>
-</artifactory.stats>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/metadata/v130beta6/3.8.1.artifactory-metadata/artifactory-folder.xml b/storage/update/src/test/resources/metadata/v130beta6/3.8.1.artifactory-metadata/artifactory-folder.xml
deleted file mode 100644
index 3c20660..0000000
--- a/storage/update/src/test/resources/metadata/v130beta6/3.8.1.artifactory-metadata/artifactory-folder.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<artifactory-folder>
-    <repoPath>
-        <repoKey>repo1-cache</repoKey>
-        <path>junit/junit/3.8.1</path>
-    </repoPath>
-    <name>3.8.1</name>
-    <created>1228036420625</created>
-    <lastModified>0</lastModified>
-    <extension>
-        <createdBy>anonymous</createdBy>
-        <modifiedBy>anonymous</modifiedBy>
-        <lastUpdated>1228036420625</lastUpdated>
-    </extension>
-</artifactory-folder>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/metadata/v130beta6/artifactory-file-expected.xml b/storage/update/src/test/resources/metadata/v130beta6/artifactory-file-expected.xml
deleted file mode 100644
index a7416f3..0000000
--- a/storage/update/src/test/resources/metadata/v130beta6/artifactory-file-expected.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<artifactory-file>
-    <repoPath>
-        <repoKey>repo1-cache</repoKey>
-        <path>junit/junit/3.8.1/junit-3.8.1.jar</path>
-    </repoPath>
-    <name>junit-3.8.1.jar</name>
-    <created>1228036457953</created>
-    <lastModified>1122889368000</lastModified>
-    <size>121070</size>
-    <mimeType>application/zip</mimeType>
-    <additionalInfo>
-        <createdBy>anonymous</createdBy>
-        <modifiedBy>anonymous</modifiedBy>
-        <lastUpdated>1228036459703</lastUpdated>
-        <checksumsInfo>
-            <checksums>
-                <checksum>
-                    <type>sha1</type>
-                    <original>NO_ORIG</original>
-                    <actual>99129f16442844f6a4a11ae22fbbee40b14d774f</actual>
-                </checksum>
-                <checksum>
-                    <type>md5</type>
-                    <original>NO_ORIG</original>
-                    <actual>1f40fb782a4f2cf78f161d32670f7a3a</actual>
-                </checksum>
-            </checksums>
-        </checksumsInfo>
-    </additionalInfo>
-</artifactory-file>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/metadata/v130beta6/artifactory-file.xml b/storage/update/src/test/resources/metadata/v130beta6/artifactory-file.xml
deleted file mode 100644
index 4f01e4d..0000000
--- a/storage/update/src/test/resources/metadata/v130beta6/artifactory-file.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<artifactory-file>
-    <repoPath>
-        <repoKey>repo1-cache</repoKey>
-        <path>junit/junit/3.8.1/junit-3.8.1.jar</path>
-    </repoPath>
-    <name>junit-3.8.1.jar</name>
-    <created>1228036457953</created>
-    <lastModified>1122889368000</lastModified>
-    <size>121070</size>
-    <mimeType>application/zip</mimeType>
-    <extension>
-        <createdBy>anonymous</createdBy>
-        <modifiedBy>anonymous</modifiedBy>
-        <lastUpdated>1228036459703</lastUpdated>
-        <sha1>99129f16442844f6a4a11ae22fbbee40b14d774f</sha1>
-        <md5>1f40fb782a4f2cf78f161d32670f7a3a</md5>
-    </extension>
-</artifactory-file>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/metadata/v130beta6/artifactory-folder-expected.xml b/storage/update/src/test/resources/metadata/v130beta6/artifactory-folder-expected.xml
deleted file mode 100644
index 6aad566..0000000
--- a/storage/update/src/test/resources/metadata/v130beta6/artifactory-folder-expected.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<artifactory-folder>
-    <repoPath>
-        <repoKey>repo1-cache</repoKey>
-        <path>javax/activation</path>
-    </repoPath>
-    <name>activation</name>
-    <created>1228036433703</created>
-    <lastModified>0</lastModified>
-    <additionalInfo>
-        <createdBy>anonymous</createdBy>
-        <modifiedBy>anonymous</modifiedBy>
-        <lastUpdated>1228036433703</lastUpdated>
-    </additionalInfo>
-</artifactory-folder>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/metadata/v130beta6/artifactory-folder.xml b/storage/update/src/test/resources/metadata/v130beta6/artifactory-folder.xml
deleted file mode 100644
index dbaa678..0000000
--- a/storage/update/src/test/resources/metadata/v130beta6/artifactory-folder.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<artifactory-folder>
-    <repoPath>
-        <repoKey>repo1-cache</repoKey>
-        <path>javax/activation</path>
-    </repoPath>
-    <name>activation</name>
-    <created>1228036433703</created>
-    <lastModified>0</lastModified>
-    <extension>
-        <createdBy>anonymous</createdBy>
-        <modifiedBy>anonymous</modifiedBy>
-        <lastUpdated>1228036433703</lastUpdated>
-    </extension>
-</artifactory-folder>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/metadata/v130beta6/junit-3.8.1.jar.artifactory-metadata/artifactory-file.xml b/storage/update/src/test/resources/metadata/v130beta6/junit-3.8.1.jar.artifactory-metadata/artifactory-file.xml
deleted file mode 100644
index 4f01e4d..0000000
--- a/storage/update/src/test/resources/metadata/v130beta6/junit-3.8.1.jar.artifactory-metadata/artifactory-file.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<artifactory-file>
-    <repoPath>
-        <repoKey>repo1-cache</repoKey>
-        <path>junit/junit/3.8.1/junit-3.8.1.jar</path>
-    </repoPath>
-    <name>junit-3.8.1.jar</name>
-    <created>1228036457953</created>
-    <lastModified>1122889368000</lastModified>
-    <size>121070</size>
-    <mimeType>application/zip</mimeType>
-    <extension>
-        <createdBy>anonymous</createdBy>
-        <modifiedBy>anonymous</modifiedBy>
-        <lastUpdated>1228036459703</lastUpdated>
-        <sha1>99129f16442844f6a4a11ae22fbbee40b14d774f</sha1>
-        <md5>1f40fb782a4f2cf78f161d32670f7a3a</md5>
-    </extension>
-</artifactory-file>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/metadata/v130beta6/junit-3.8.1.jar.artifactory-metadata/artifactory.stats.xml b/storage/update/src/test/resources/metadata/v130beta6/junit-3.8.1.jar.artifactory-metadata/artifactory.stats.xml
deleted file mode 100644
index 2adb87c..0000000
--- a/storage/update/src/test/resources/metadata/v130beta6/junit-3.8.1.jar.artifactory-metadata/artifactory.stats.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<artifactory.stats>
-    <downloadCount>2</downloadCount>
-</artifactory.stats>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/metadata/v230/artifactory-file-expected.xml b/storage/update/src/test/resources/metadata/v230/artifactory-file-expected.xml
deleted file mode 100644
index 8da3ae3..0000000
--- a/storage/update/src/test/resources/metadata/v230/artifactory-file-expected.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<artifactory-file>
-    <repoPath>
-        <repoKey>libs-release-local</repoKey>
-        <path>aspectjweaver/aspectjweaver/1.5.3/aspectjweaver-1.5.3.jar</path>
-    </repoPath>
-    <name>aspectjweaver-1.5.3.jar</name>
-    <created>1316590989115</created>
-    <lastModified>1316591065519</lastModified>
-    <size>0</size>
-    <mimeType>application/java-archive</mimeType>
-    <additionalInfo>
-        <createdBy>admin</createdBy>
-        <modifiedBy>admin</modifiedBy>
-        <lastUpdated>1316591065520</lastUpdated>
-        <checksumsInfo>
-            <checksums>
-                <checksum>
-                    <type>sha1</type>
-                    <actual>da39a3ee5e6b4b0d3255bfef95601890afd80709</actual>
-                </checksum>
-                <checksum>
-                    <type>md5</type>
-                    <actual>d41d8cd98f00b204e9800998ecf8427e</actual>
-                </checksum>
-            </checksums>
-        </checksumsInfo>
-    </additionalInfo>
-</artifactory-file>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/metadata/v230/artifactory-file.xml b/storage/update/src/test/resources/metadata/v230/artifactory-file.xml
deleted file mode 100644
index bdfaed8..0000000
--- a/storage/update/src/test/resources/metadata/v230/artifactory-file.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<artifactory-file>
-    <repoPath class="org.artifactory.api.repo.RepoPathImpl">
-        <repoKey>libs-release-local</repoKey>
-        <path>aspectjweaver/aspectjweaver/1.5.3/aspectjweaver-1.5.3.jar</path>
-    </repoPath>
-    <name>aspectjweaver-1.5.3.jar</name>
-    <created>1316590989115</created>
-    <lastModified>1316591065519</lastModified>
-    <size>0</size>
-    <mimeType>application/java-archive</mimeType>
-    <additionalInfo>
-        <createdBy>admin</createdBy>
-        <modifiedBy>admin</modifiedBy>
-        <lastUpdated>1316591065520</lastUpdated>
-        <checksumsInfo>
-            <checksums>
-                <checksum>
-                    <type>sha1</type>
-                    <actual>da39a3ee5e6b4b0d3255bfef95601890afd80709</actual>
-                </checksum>
-                <checksum>
-                    <type>md5</type>
-                    <actual>d41d8cd98f00b204e9800998ecf8427e</actual>
-                </checksum>
-            </checksums>
-        </checksumsInfo>
-    </additionalInfo>
-</artifactory-file>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/metadata/v230/artifactory-folder-expected.xml b/storage/update/src/test/resources/metadata/v230/artifactory-folder-expected.xml
deleted file mode 100644
index eb400a8..0000000
--- a/storage/update/src/test/resources/metadata/v230/artifactory-folder-expected.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<artifactory-folder>
-    <repoPath>
-        <repoKey>libs-release-local</repoKey>
-        <path>aspectjweaver/aspectjweaver/1.5.3</path>
-    </repoPath>
-    <name>1.5.3</name>
-    <created>1316590989115</created>
-    <lastModified>1316590989120</lastModified>
-    <additionalInfo>
-        <createdBy>admin</createdBy>
-        <modifiedBy>admin</modifiedBy>
-        <lastUpdated>1316590989120</lastUpdated>
-    </additionalInfo>
-</artifactory-folder>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/metadata/v230/artifactory-folder.xml b/storage/update/src/test/resources/metadata/v230/artifactory-folder.xml
deleted file mode 100644
index a7af442..0000000
--- a/storage/update/src/test/resources/metadata/v230/artifactory-folder.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<artifactory-folder>
-    <repoPath class="org.artifactory.api.repo.RepoPathImpl">
-        <repoKey>libs-release-local</repoKey>
-        <path>aspectjweaver/aspectjweaver/1.5.3</path>
-    </repoPath>
-    <name>1.5.3</name>
-    <created>1316590989115</created>
-    <lastModified>1316590989120</lastModified>
-    <additionalInfo>
-        <createdBy>admin</createdBy>
-        <modifiedBy>admin</modifiedBy>
-        <lastUpdated>1316590989120</lastUpdated>
-    </additionalInfo>
-</artifactory-folder>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/metadata/v230/aspectjweaver-1.5.3.jar.artifactory-metadata/artifactory-file.xml b/storage/update/src/test/resources/metadata/v230/aspectjweaver-1.5.3.jar.artifactory-metadata/artifactory-file.xml
deleted file mode 100644
index bdfaed8..0000000
--- a/storage/update/src/test/resources/metadata/v230/aspectjweaver-1.5.3.jar.artifactory-metadata/artifactory-file.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<artifactory-file>
-    <repoPath class="org.artifactory.api.repo.RepoPathImpl">
-        <repoKey>libs-release-local</repoKey>
-        <path>aspectjweaver/aspectjweaver/1.5.3/aspectjweaver-1.5.3.jar</path>
-    </repoPath>
-    <name>aspectjweaver-1.5.3.jar</name>
-    <created>1316590989115</created>
-    <lastModified>1316591065519</lastModified>
-    <size>0</size>
-    <mimeType>application/java-archive</mimeType>
-    <additionalInfo>
-        <createdBy>admin</createdBy>
-        <modifiedBy>admin</modifiedBy>
-        <lastUpdated>1316591065520</lastUpdated>
-        <checksumsInfo>
-            <checksums>
-                <checksum>
-                    <type>sha1</type>
-                    <actual>da39a3ee5e6b4b0d3255bfef95601890afd80709</actual>
-                </checksum>
-                <checksum>
-                    <type>md5</type>
-                    <actual>d41d8cd98f00b204e9800998ecf8427e</actual>
-                </checksum>
-            </checksums>
-        </checksumsInfo>
-    </additionalInfo>
-</artifactory-file>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/security/v1/security-big.xml b/storage/update/src/test/resources/security/v1/security-big.xml
deleted file mode 100644
index 539855f..0000000
--- a/storage/update/src/test/resources/security/v1/security-big.xml
+++ /dev/null
@@ -1,345 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<security>
-    <users>
-        <org.artifactory.security.SimpleUser>
-            <updatableProfile>true</updatableProfile>
-            <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
-            <username>admin</username>
-            <authorities>
-                <org.acegisecurity.GrantedAuthorityImpl>
-                    <role>ADMIN</role>
-                </org.acegisecurity.GrantedAuthorityImpl>
-                <org.acegisecurity.GrantedAuthorityImpl>
-                    <role>USER</role>
-                </org.acegisecurity.GrantedAuthorityImpl>
-            </authorities>
-            <accountNonExpired>true</accountNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <enabled>true</enabled>
-        </org.artifactory.security.SimpleUser>
-        <org.artifactory.security.SimpleUser>
-            <updatableProfile>true</updatableProfile>
-            <password>06c56a89949d617def52f371c357b6db</password>
-            <username>momo</username>
-            <authorities>
-                <org.acegisecurity.GrantedAuthorityImpl>
-                    <role>USER</role>
-                </org.acegisecurity.GrantedAuthorityImpl>
-            </authorities>
-            <accountNonExpired>true</accountNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <enabled>true</enabled>
-        </org.artifactory.security.SimpleUser>
-        <org.artifactory.security.SimpleUser>
-            <updatableProfile>true</updatableProfile>
-            <password>06c56a89949d617def52f371c357b6db</password>
-            <username>momo1</username>
-            <authorities>
-                <org.acegisecurity.GrantedAuthorityImpl>
-                    <role>USER</role>
-                </org.acegisecurity.GrantedAuthorityImpl>
-            </authorities>
-            <accountNonExpired>true</accountNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <enabled>true</enabled>
-        </org.artifactory.security.SimpleUser>
-        <org.artifactory.security.SimpleUser>
-            <updatableProfile>true</updatableProfile>
-            <password>f71dbe52628a3f83a77ab494817525c6</password>
-            <username>toto</username>
-            <authorities>
-                <org.acegisecurity.GrantedAuthorityImpl>
-                    <role>USER</role>
-                </org.acegisecurity.GrantedAuthorityImpl>
-            </authorities>
-            <accountNonExpired>true</accountNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <enabled>true</enabled>
-        </org.artifactory.security.SimpleUser>
-        <org.artifactory.security.SimpleUser>
-            <updatableProfile>true</updatableProfile>
-            <password>9891b71c5812781d61403a03a101a854</password>
-            <username>yossis</username>
-            <authorities>
-                <org.acegisecurity.GrantedAuthorityImpl>
-                    <role>USER</role>
-                </org.acegisecurity.GrantedAuthorityImpl>
-            </authorities>
-            <accountNonExpired>true</accountNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <enabled>true</enabled>
-        </org.artifactory.security.SimpleUser>
-    </users>
-    <repoPaths>
-        <org.artifactory.security.RepoPath>
-            <repoKey>ANY</repoKey>
-            <path>ANY</path>
-        </org.artifactory.security.RepoPath>
-        <org.artifactory.security.RepoPath>
-            <repoKey>libs-releases</repoKey>
-            <path>org.apache</path>
-        </org.artifactory.security.RepoPath>
-        <org.artifactory.security.RepoPath>
-            <repoKey>ext-snapshots</repoKey>
-            <path>ANY</path>
-        </org.artifactory.security.RepoPath>
-        <org.artifactory.security.RepoPath>
-            <repoKey>repo1-cache</repoKey>
-            <path>blabla</path>
-        </org.artifactory.security.RepoPath>
-        <org.artifactory.security.RepoPath>
-            <repoKey>libs-releases</repoKey>
-            <path>ANY</path>
-        </org.artifactory.security.RepoPath>
-    </repoPaths>
-    <acls>
-        <org.acegisecurity.acl.basic.SimpleAclEntry>
-            <aclObjectIdentity class="org.artifactory.security.RepoPath">
-                <repoKey>ANY</repoKey>
-                <path>ANY</path>
-            </aclObjectIdentity>
-            <recipient class="string">___INHERITENCE_MARKER_ONLY___</recipient>
-            <validPermissions>
-                <int>0</int>
-                <int>1</int>
-                <int>2</int>
-                <int>4</int>
-                <int>6</int>
-                <int>8</int>
-                <int>14</int>
-                <int>16</int>
-                <int>22</int>
-                <int>30</int>
-            </validPermissions>
-            <mask>0</mask>
-        </org.acegisecurity.acl.basic.SimpleAclEntry>
-        <org.acegisecurity.acl.basic.SimpleAclEntry>
-            <aclObjectIdentity class="org.artifactory.security.RepoPath">
-                <repoKey>libs-releases</repoKey>
-                <path>org.apache</path>
-            </aclObjectIdentity>
-            <recipient class="string">momo</recipient>
-            <validPermissions>
-                <int>0</int>
-                <int>1</int>
-                <int>2</int>
-                <int>4</int>
-                <int>6</int>
-                <int>8</int>
-                <int>14</int>
-                <int>16</int>
-                <int>22</int>
-                <int>30</int>
-            </validPermissions>
-            <mask>7</mask>
-        </org.acegisecurity.acl.basic.SimpleAclEntry>
-        <org.acegisecurity.acl.basic.SimpleAclEntry>
-            <aclObjectIdentity class="org.artifactory.security.RepoPath"
-                               reference="../../org.acegisecurity.acl.basic.SimpleAclEntry[2]/aclObjectIdentity"/>
-            <recipient class="string">yossis</recipient>
-            <validPermissions>
-                <int>0</int>
-                <int>1</int>
-                <int>2</int>
-                <int>4</int>
-                <int>6</int>
-                <int>8</int>
-                <int>14</int>
-                <int>16</int>
-                <int>22</int>
-                <int>30</int>
-            </validPermissions>
-            <mask>6</mask>
-        </org.acegisecurity.acl.basic.SimpleAclEntry>
-        <org.acegisecurity.acl.basic.SimpleAclEntry>
-            <aclObjectIdentity class="org.artifactory.security.RepoPath">
-                <repoKey>ext-snapshots</repoKey>
-                <path>ANY</path>
-            </aclObjectIdentity>
-            <recipient class="string">momo</recipient>
-            <validPermissions>
-                <int>0</int>
-                <int>1</int>
-                <int>2</int>
-                <int>4</int>
-                <int>6</int>
-                <int>8</int>
-                <int>14</int>
-                <int>16</int>
-                <int>22</int>
-                <int>30</int>
-            </validPermissions>
-            <mask>7</mask>
-        </org.acegisecurity.acl.basic.SimpleAclEntry>
-        <org.acegisecurity.acl.basic.SimpleAclEntry>
-            <aclObjectIdentity class="org.artifactory.security.RepoPath"
-                               reference="../../org.acegisecurity.acl.basic.SimpleAclEntry[4]/aclObjectIdentity"/>
-            <recipient class="string">yossis</recipient>
-            <validPermissions>
-                <int>0</int>
-                <int>1</int>
-                <int>2</int>
-                <int>4</int>
-                <int>6</int>
-                <int>8</int>
-                <int>14</int>
-                <int>16</int>
-                <int>22</int>
-                <int>30</int>
-            </validPermissions>
-            <mask>2</mask>
-        </org.acegisecurity.acl.basic.SimpleAclEntry>
-        <org.acegisecurity.acl.basic.SimpleAclEntry>
-            <aclObjectIdentity class="org.artifactory.security.RepoPath">
-                <repoKey>repo1-cache</repoKey>
-                <path>blabla</path>
-            </aclObjectIdentity>
-            <recipient class="string">toto</recipient>
-            <validPermissions>
-                <int>0</int>
-                <int>1</int>
-                <int>2</int>
-                <int>4</int>
-                <int>6</int>
-                <int>8</int>
-                <int>14</int>
-                <int>16</int>
-                <int>22</int>
-                <int>30</int>
-            </validPermissions>
-            <mask>4</mask>
-        </org.acegisecurity.acl.basic.SimpleAclEntry>
-        <org.acegisecurity.acl.basic.SimpleAclEntry>
-            <aclObjectIdentity class="org.artifactory.security.RepoPath"
-                               reference="../../org.acegisecurity.acl.basic.SimpleAclEntry[6]/aclObjectIdentity"/>
-            <recipient class="string">momo</recipient>
-            <validPermissions>
-                <int>0</int>
-                <int>1</int>
-                <int>2</int>
-                <int>4</int>
-                <int>6</int>
-                <int>8</int>
-                <int>14</int>
-                <int>16</int>
-                <int>22</int>
-                <int>30</int>
-            </validPermissions>
-            <mask>7</mask>
-        </org.acegisecurity.acl.basic.SimpleAclEntry>
-        <org.acegisecurity.acl.basic.SimpleAclEntry>
-            <aclObjectIdentity class="org.artifactory.security.RepoPath"
-                               reference="../../org.acegisecurity.acl.basic.SimpleAclEntry[6]/aclObjectIdentity"/>
-            <recipient class="string">yossis</recipient>
-            <validPermissions>
-                <int>0</int>
-                <int>1</int>
-                <int>2</int>
-                <int>4</int>
-                <int>6</int>
-                <int>8</int>
-                <int>14</int>
-                <int>16</int>
-                <int>22</int>
-                <int>30</int>
-            </validPermissions>
-            <mask>7</mask>
-        </org.acegisecurity.acl.basic.SimpleAclEntry>
-        <org.acegisecurity.acl.basic.SimpleAclEntry>
-            <aclObjectIdentity class="org.artifactory.security.RepoPath"
-                               reference="../../org.acegisecurity.acl.basic.SimpleAclEntry[6]/aclObjectIdentity"/>
-            <recipient class="string">momo1</recipient>
-            <validPermissions>
-                <int>0</int>
-                <int>1</int>
-                <int>2</int>
-                <int>4</int>
-                <int>6</int>
-                <int>8</int>
-                <int>14</int>
-                <int>16</int>
-                <int>22</int>
-                <int>30</int>
-            </validPermissions>
-            <mask>6</mask>
-        </org.acegisecurity.acl.basic.SimpleAclEntry>
-        <org.acegisecurity.acl.basic.SimpleAclEntry>
-            <aclObjectIdentity class="org.artifactory.security.RepoPath">
-                <repoKey>libs-releases</repoKey>
-                <path>ANY</path>
-            </aclObjectIdentity>
-            <recipient class="string">momo</recipient>
-            <validPermissions>
-                <int>0</int>
-                <int>1</int>
-                <int>2</int>
-                <int>4</int>
-                <int>6</int>
-                <int>8</int>
-                <int>14</int>
-                <int>16</int>
-                <int>22</int>
-                <int>30</int>
-            </validPermissions>
-            <mask>7</mask>
-        </org.acegisecurity.acl.basic.SimpleAclEntry>
-        <org.acegisecurity.acl.basic.SimpleAclEntry>
-            <aclObjectIdentity class="org.artifactory.security.RepoPath"
-                               reference="../../org.acegisecurity.acl.basic.SimpleAclEntry[10]/aclObjectIdentity"/>
-            <recipient class="string">yossis</recipient>
-            <validPermissions>
-                <int>0</int>
-                <int>1</int>
-                <int>2</int>
-                <int>4</int>
-                <int>6</int>
-                <int>8</int>
-                <int>14</int>
-                <int>16</int>
-                <int>22</int>
-                <int>30</int>
-            </validPermissions>
-            <mask>7</mask>
-        </org.acegisecurity.acl.basic.SimpleAclEntry>
-        <org.acegisecurity.acl.basic.SimpleAclEntry>
-            <aclObjectIdentity class="org.artifactory.security.RepoPath"
-                               reference="../../org.acegisecurity.acl.basic.SimpleAclEntry[10]/aclObjectIdentity"/>
-            <recipient class="string">momo1</recipient>
-            <validPermissions>
-                <int>0</int>
-                <int>1</int>
-                <int>2</int>
-                <int>4</int>
-                <int>6</int>
-                <int>8</int>
-                <int>14</int>
-                <int>16</int>
-                <int>22</int>
-                <int>30</int>
-            </validPermissions>
-            <mask>7</mask>
-        </org.acegisecurity.acl.basic.SimpleAclEntry>
-    </acls>
-</security>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/security/v1/security-expected.xml b/storage/update/src/test/resources/security/v1/security-expected.xml
deleted file mode 100644
index 8fa5607..0000000
--- a/storage/update/src/test/resources/security/v1/security-expected.xml
+++ /dev/null
@@ -1,107 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<security>
-    <users>
-        <org.artifactory.security.SimpleUser>
-            <updatableProfile>true</updatableProfile>
-            <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
-            <username>admin</username>
-            <authorities>
-                <org.acegisecurity.GrantedAuthorityImpl>
-                    <role>ADMIN</role>
-                </org.acegisecurity.GrantedAuthorityImpl>
-                <org.acegisecurity.GrantedAuthorityImpl>
-                    <role>USER</role>
-                </org.acegisecurity.GrantedAuthorityImpl>
-            </authorities>
-            <accountNonExpired>true</accountNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <enabled>true</enabled>
-            <admin>true</admin>
-        </org.artifactory.security.SimpleUser>
-        <org.artifactory.security.SimpleUser>
-            <updatableProfile>true</updatableProfile>
-            <password>06c56a89949d617def52f371c357b6db</password>
-            <username>momo</username>
-            <authorities>
-                <org.acegisecurity.GrantedAuthorityImpl>
-                    <role>USER</role>
-                </org.acegisecurity.GrantedAuthorityImpl>
-            </authorities>
-            <accountNonExpired>true</accountNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <enabled>true</enabled>
-            <admin>false</admin>
-        </org.artifactory.security.SimpleUser>
-        <org.artifactory.security.SimpleUser>
-            <updatableProfile>true</updatableProfile>
-            <password>9891b71c5812781d61403a03a101a854</password>
-            <username>yossis</username>
-            <authorities>
-                <org.acegisecurity.GrantedAuthorityImpl>
-                    <role>USER</role>
-                </org.acegisecurity.GrantedAuthorityImpl>
-            </authorities>
-            <accountNonExpired>true</accountNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <enabled>true</enabled>
-            <admin>false</admin>
-        </org.artifactory.security.SimpleUser>
-    </users>
-    <acls>
-        <org.artifactory.security.RepoPathAcl>
-            <aces>
-                <list>
-                    <default>
-                        <size>1</size>
-                    </default>
-                    <int>10</int>
-                    <org.artifactory.security.RepoPathAce>
-                        <parentAcl reference="../../../.."/>
-                        <mask>1</mask>
-                        <principal>anonymous</principal>
-                    </org.artifactory.security.RepoPathAce>
-                </list>
-            </aces>
-            <identifier>ANY%3aANY</identifier>
-        </org.artifactory.security.RepoPathAcl>
-        <org.artifactory.security.RepoPathAcl>
-            <aces>
-                <list>
-                    <default>
-                        <size>2</size>
-                    </default>
-                    <int>10</int>
-                    <org.artifactory.security.RepoPathAce>
-                        <mask>7</mask>
-                        <principal>momo</principal>
-                    </org.artifactory.security.RepoPathAce>
-                    <org.artifactory.security.RepoPathAce>
-                        <mask>6</mask>
-                        <principal>yossis</principal>
-                    </org.artifactory.security.RepoPathAce>
-                </list>
-            </aces>
-            <identifier>libs-releases%3aorg.apache</identifier>
-        </org.artifactory.security.RepoPathAcl>
-    </acls>
-</security>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/security/v1/security.xml b/storage/update/src/test/resources/security/v1/security.xml
deleted file mode 100644
index ece6805..0000000
--- a/storage/update/src/test/resources/security/v1/security.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<security>
-    <users>
-        <org.artifactory.security.SimpleUser>
-            <updatableProfile>true</updatableProfile>
-            <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
-            <username>admin</username>
-            <authorities>
-                <org.acegisecurity.GrantedAuthorityImpl>
-                    <role>ADMIN</role>
-                </org.acegisecurity.GrantedAuthorityImpl>
-                <org.acegisecurity.GrantedAuthorityImpl>
-                    <role>USER</role>
-                </org.acegisecurity.GrantedAuthorityImpl>
-            </authorities>
-            <accountNonExpired>true</accountNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <enabled>true</enabled>
-        </org.artifactory.security.SimpleUser>
-        <org.artifactory.security.SimpleUser>
-            <updatableProfile>true</updatableProfile>
-            <password>06c56a89949d617def52f371c357b6db</password>
-            <username>momo</username>
-            <authorities>
-                <org.acegisecurity.GrantedAuthorityImpl>
-                    <role>USER</role>
-                </org.acegisecurity.GrantedAuthorityImpl>
-            </authorities>
-            <accountNonExpired>true</accountNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <enabled>true</enabled>
-        </org.artifactory.security.SimpleUser>
-        <org.artifactory.security.SimpleUser>
-            <updatableProfile>true</updatableProfile>
-            <password>9891b71c5812781d61403a03a101a854</password>
-            <username>yossis</username>
-            <authorities>
-                <org.acegisecurity.GrantedAuthorityImpl>
-                    <role>USER</role>
-                </org.acegisecurity.GrantedAuthorityImpl>
-            </authorities>
-            <accountNonExpired>true</accountNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <enabled>true</enabled>
-        </org.artifactory.security.SimpleUser>
-    </users>
-    <repoPaths>
-        <org.artifactory.security.RepoPath>
-            <repoKey>ANY</repoKey>
-            <path>ANY</path>
-        </org.artifactory.security.RepoPath>
-        <org.artifactory.security.RepoPath>
-            <repoKey>libs-releases</repoKey>
-            <path>org.apache</path>
-        </org.artifactory.security.RepoPath>
-    </repoPaths>
-    <acls>
-        <org.acegisecurity.acl.basic.SimpleAclEntry>
-            <aclObjectIdentity class="org.artifactory.security.RepoPath">
-                <repoKey>ANY</repoKey>
-                <path>ANY</path>
-            </aclObjectIdentity>
-            <recipient class="string">___INHERITENCE_MARKER_ONLY___</recipient>
-            <validPermissions>
-                <int>0</int>
-                <int>1</int>
-                <int>2</int>
-                <int>4</int>
-                <int>6</int>
-                <int>8</int>
-                <int>14</int>
-                <int>16</int>
-                <int>22</int>
-                <int>30</int>
-            </validPermissions>
-            <mask>0</mask>
-        </org.acegisecurity.acl.basic.SimpleAclEntry>
-        <org.acegisecurity.acl.basic.SimpleAclEntry>
-            <aclObjectIdentity class="org.artifactory.security.RepoPath">
-                <repoKey>libs-releases</repoKey>
-                <path>org.apache</path>
-            </aclObjectIdentity>
-            <recipient class="string">momo</recipient>
-            <validPermissions>
-                <int>0</int>
-                <int>1</int>
-                <int>2</int>
-                <int>4</int>
-                <int>6</int>
-                <int>8</int>
-                <int>14</int>
-                <int>16</int>
-                <int>22</int>
-                <int>30</int>
-            </validPermissions>
-            <mask>7</mask>
-        </org.acegisecurity.acl.basic.SimpleAclEntry>
-        <org.acegisecurity.acl.basic.SimpleAclEntry>
-            <aclObjectIdentity class="org.artifactory.security.RepoPath"
-                               reference="../../org.acegisecurity.acl.basic.SimpleAclEntry[2]/aclObjectIdentity"/>
-            <recipient class="string">yossis</recipient>
-            <validPermissions>
-                <int>0</int>
-                <int>1</int>
-                <int>2</int>
-                <int>4</int>
-                <int>6</int>
-                <int>8</int>
-                <int>14</int>
-                <int>16</int>
-                <int>22</int>
-                <int>30</int>
-            </validPermissions>
-            <mask>6</mask>
-        </org.acegisecurity.acl.basic.SimpleAclEntry>
-    </acls>
-</security>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/security/v2/security-expected.xml b/storage/update/src/test/resources/security/v2/security-expected.xml
deleted file mode 100644
index 9ae1570..0000000
--- a/storage/update/src/test/resources/security/v2/security-expected.xml
+++ /dev/null
@@ -1,106 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<security>
-    <users>
-        <user>
-            <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
-            <username>admin</username>
-            <accountNonExpired>true</accountNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <enabled>true</enabled>
-            <admin>true</admin>
-            <updatableProfile>true</updatableProfile>
-        </user>
-        <user>
-            <password>d41d8cd98f00b204e9800998ecf8427e</password>
-            <username>anonymous</username>
-            <accountNonExpired>true</accountNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <enabled>true</enabled>
-            <admin>false</admin>
-            <updatableProfile>false</updatableProfile>
-        </user>
-        <user>
-            <password>9891b71c5812781d61403a03a101a854</password>
-            <username>yossis</username>
-            <accountNonExpired>true</accountNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <enabled>true</enabled>
-            <admin>false</admin>
-            <updatableProfile>true</updatableProfile>
-        </user>
-        <user>
-            <password>06c56a89949d617def52f371c357b6db</password>
-            <username>momo</username>
-            <accountNonExpired>true</accountNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <enabled>true</enabled>
-            <admin>false</admin>
-            <updatableProfile>true</updatableProfile>
-        </user>
-    </users>
-    <acls>
-        <acl>
-            <permissionTarget>
-                <name>Anything</name>
-                <repoKey>ANY</repoKey>
-                <includes>
-                    <string>**</string>
-                </includes>
-                <excludes/>
-            </permissionTarget>
-            <aces>
-                <ace>
-                    <principal>anonymous</principal>
-                    <group>false</group>
-                    <mask>1</mask>
-                </ace>
-            </aces>
-            <!--<identifier>ANY%3aANY</identifier>-->
-            <updatedBy>unknown</updatedBy>
-        </acl>
-        <acl>
-            <permissionTarget>
-                <name>libs-releases-local:org.art</name>
-                <repoKey>libs-releases-local</repoKey>
-                <includes>
-                    <string>**</string>
-                </includes>
-                <excludes/>
-            </permissionTarget>
-            <aces>
-                <ace>
-                    <principal>momo</principal>
-                    <group>false</group>
-                    <mask>19</mask>
-                </ace>
-                <ace>
-                    <principal>yossis</principal>
-                    <group>false</group>
-                    <mask>3</mask>
-                </ace>
-            </aces>
-            <updatedBy>admin</updatedBy>
-        </acl>
-    </acls>
-</security>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/security/v2/security.xml b/storage/update/src/test/resources/security/v2/security.xml
deleted file mode 100644
index edc81f7..0000000
--- a/storage/update/src/test/resources/security/v2/security.xml
+++ /dev/null
@@ -1,128 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<security>
-    <users>
-        <org.artifactory.security.SimpleUser>
-            <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
-            <username>admin</username>
-            <authorities>
-                <org.springframework.security.GrantedAuthorityImpl>
-                    <role>admin</role>
-                </org.springframework.security.GrantedAuthorityImpl>
-                <org.springframework.security.GrantedAuthorityImpl>
-                    <role>user</role>
-                </org.springframework.security.GrantedAuthorityImpl>
-            </authorities>
-            <accountNonExpired>true</accountNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <enabled>true</enabled>
-            <admin>true</admin>
-            <updatableProfile>true</updatableProfile>
-        </org.artifactory.security.SimpleUser>
-        <org.artifactory.security.SimpleUser>
-            <password>d41d8cd98f00b204e9800998ecf8427e</password>
-            <username>anonymous</username>
-            <authorities>
-                <org.springframework.security.GrantedAuthorityImpl>
-                    <role>user</role>
-                </org.springframework.security.GrantedAuthorityImpl>
-            </authorities>
-            <accountNonExpired>true</accountNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <enabled>true</enabled>
-            <admin>false</admin>
-            <updatableProfile>false</updatableProfile>
-        </org.artifactory.security.SimpleUser>
-        <org.artifactory.security.SimpleUser>
-            <password>9891b71c5812781d61403a03a101a854</password>
-            <username>yossis</username>
-            <authorities>
-                <org.springframework.security.GrantedAuthorityImpl
-                        reference="../../../org.artifactory.security.SimpleUser[2]/authorities/org.springframework.security.GrantedAuthorityImpl"/>
-            </authorities>
-            <accountNonExpired>true</accountNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <enabled>true</enabled>
-            <admin>false</admin>
-            <updatableProfile>true</updatableProfile>
-        </org.artifactory.security.SimpleUser>
-        <org.artifactory.security.SimpleUser>
-            <password>06c56a89949d617def52f371c357b6db</password>
-            <username>momo</username>
-            <authorities>
-                <org.springframework.security.GrantedAuthorityImpl
-                        reference="../../../org.artifactory.security.SimpleUser[2]/authorities/org.springframework.security.GrantedAuthorityImpl"/>
-            </authorities>
-            <accountNonExpired>true</accountNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <enabled>true</enabled>
-            <admin>false</admin>
-            <updatableProfile>true</updatableProfile>
-        </org.artifactory.security.SimpleUser>
-    </users>
-    <acls>
-        <org.artifactory.security.RepoPathAcl>
-            <aces class="org.apache.jackrabbit.ocm.manager.collectionconverter.impl.ManageableArrayList"
-                  serialization="custom">
-                <unserializable-parents/>
-                <list>
-                    <default>
-                        <size>1</size>
-                    </default>
-                    <int>10</int>
-                    <org.artifactory.security.RepoPathAce>
-                        <parentAcl reference="../../../.."/>
-                        <mask>1</mask>
-                        <principal>anonymous</principal>
-                    </org.artifactory.security.RepoPathAce>
-                </list>
-            </aces>
-            <identifier>ANY%3aANY</identifier>
-            <updatedBy>unknown</updatedBy>
-        </org.artifactory.security.RepoPathAcl>
-        <org.artifactory.security.RepoPathAcl>
-            <aces class="org.apache.jackrabbit.ocm.manager.collectionconverter.impl.ManageableArrayList"
-                  serialization="custom">
-                <unserializable-parents/>
-                <list>
-                    <default>
-                        <size>2</size>
-                    </default>
-                    <int>10</int>
-                    <org.artifactory.security.RepoPathAce>
-                        <parentAcl reference="../../../.."/>
-                        <mask>19</mask>
-                        <principal>momo</principal>
-                    </org.artifactory.security.RepoPathAce>
-                    <org.artifactory.security.RepoPathAce>
-                        <parentAcl reference="../../../.."/>
-                        <mask>3</mask>
-                        <principal>yossis</principal>
-                    </org.artifactory.security.RepoPathAce>
-                </list>
-            </aces>
-            <identifier>libs-releases-local%3aorg.art</identifier>
-            <updatedBy>admin</updatedBy>
-        </org.artifactory.security.RepoPathAcl>
-    </acls>
-</security>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/security/v3/security-no-anything-permissions.xml b/storage/update/src/test/resources/security/v3/security-no-anything-permissions.xml
deleted file mode 100644
index 80c0c3b..0000000
--- a/storage/update/src/test/resources/security/v3/security-no-anything-permissions.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<security>
-    <users>
-        <user>
-            <username>anonymous</username>
-            <password>d41d8cd98f00b204e9800998ecf8427e</password>
-            <admin>false</admin>
-            <enabled>true</enabled>
-            <updatableProfile>false</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups/>
-        </user>
-        <user>
-            <username>admin</username>
-            <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
-            <admin>true</admin>
-            <enabled>true</enabled>
-            <updatableProfile>true</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups/>
-        </user>
-    </users>
-    <acls>
-        <acl>
-            <permissionTarget>
-                <name>emptyperm</name>
-                <repoKey>ANY</repoKey>
-                <includes>
-                    <string>**</string>
-                </includes>
-                <excludes/>
-            </permissionTarget>
-            <aces/>
-            <updatedBy>admin</updatedBy>
-        </acl>
-    </acls>
-</security>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/security/v3/security-repokey-convert.xml b/storage/update/src/test/resources/security/v3/security-repokey-convert.xml
deleted file mode 100644
index cac3302..0000000
--- a/storage/update/src/test/resources/security/v3/security-repokey-convert.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<security>
-    <users>
-        <user>
-            <username>admin</username>
-            <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
-            <admin>true</admin>
-            <enabled>true</enabled>
-            <updatableProfile>true</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups/>
-        </user>
-        <user>
-            <username>anonymous</username>
-            <password>d41d8cd98f00b204e9800998ecf8427e</password>
-            <admin>false</admin>
-            <enabled>true</enabled>
-            <updatableProfile>false</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups/>
-        </user>
-        <user>
-            <username>yossis</username>
-            <password>9891b71c5812781d61403a03a101a854</password>
-            <email>yossis at alphacsp.com</email>
-            <admin>true</admin>
-            <enabled>true</enabled>
-            <updatableProfile>true</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups>
-                <string>group1</string>
-            </groups>
-        </user>
-        <user>
-            <username>momoadmin</username>
-            <password>06c56a89949d617def52f371c357b6db</password>
-            <email>momo at momo.com</email>
-            <admin>true</admin>
-            <enabled>true</enabled>
-            <updatableProfile>false</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups>
-                <string>group1</string>
-            </groups>
-        </user>
-        <user>
-            <username>momo</username>
-            <password>06c56a89949d617def52f371c357b6db</password>
-            <email>momo at momo.com</email>
-            <admin>false</admin>
-            <enabled>true</enabled>
-            <updatableProfile>true</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups>
-                <string>group1</string>
-                <string>group2</string>
-            </groups>
-        </user>
-    </users>
-    <groups>
-        <group>
-            <groupName>group1</groupName>
-            <description>This is the 1st grou</description>
-            <newUserDefault>true</newUserDefault>
-        </group>
-        <group>
-            <groupName>group2</groupName>
-            <newUserDefault>false</newUserDefault>
-        </group>
-    </groups>
-    <acls>
-        <acl>
-            <permissionTarget>
-                <name>Anything</name>
-                <repoKey>ANY</repoKey>
-                <includes>
-                    <string>**</string>
-                </includes>
-                <excludes/>
-            </permissionTarget>
-            <aces>
-                <ace>
-                    <principal>anonymous</principal>
-                    <group>false</group>
-                    <mask>1</mask>
-                </ace>
-            </aces>
-            <updatedBy>unknown</updatedBy>
-        </acl>
-        <acl>
-            <permissionTarget>
-                <name>momo_on_ext</name>
-                <repoKey>ext-releases-local</repoKey>
-                <includes>
-                    <string>**/*-sources.*</string>
-                </includes>
-                <excludes>
-                    <string>com/acme/**</string>
-                </excludes>
-            </permissionTarget>
-            <aces>
-                <ace>
-                    <principal>group2</principal>
-                    <group>true</group>
-                    <mask>11</mask>
-                </ace>
-                <ace>
-                    <principal>momo</principal>
-                    <group>false</group>
-                    <mask>27</mask>
-                </ace>
-            </aces>
-            <updatedBy>admin</updatedBy>
-        </acl>
-        <acl>
-            <permissionTarget>
-                <name>libsreleases</name>
-                <repoKey>libs-releases-local</repoKey>
-                <includes>
-                    <string>**</string>
-                </includes>
-                <excludes>
-                    <string>**/*-SNAPSHOT/**</string>
-                </excludes>
-            </permissionTarget>
-            <aces>
-                <ace>
-                    <principal>group2</principal>
-                    <group>true</group>
-                    <mask>3</mask>
-                </ace>
-                <ace>
-                    <principal>momo</principal>
-                    <group>false</group>
-                    <mask>11</mask>
-                </ace>
-                <ace>
-                    <principal>anonymous</principal>
-                    <group>false</group>
-                    <mask>3</mask>
-                </ace>
-                <ace>
-                    <principal>group1</principal>
-                    <group>true</group>
-                    <mask>1</mask>
-                </ace>
-            </aces>
-            <updatedBy>admin</updatedBy>
-        </acl>
-    </acls>
-</security>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/security/v3/security.xml b/storage/update/src/test/resources/security/v3/security.xml
deleted file mode 100644
index e3ea6b7..0000000
--- a/storage/update/src/test/resources/security/v3/security.xml
+++ /dev/null
@@ -1,176 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<security>
-    <users>
-        <user>
-            <username>anonymous</username>
-            <password>d41d8cd98f00b204e9800998ecf8427e</password>
-            <admin>false</admin>
-            <enabled>true</enabled>
-            <updatableProfile>false</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups/>
-        </user>
-        <user>
-            <username>admin</username>
-            <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
-            <admin>true</admin>
-            <enabled>true</enabled>
-            <updatableProfile>true</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups/>
-        </user>
-        <user>
-            <username>momo</username>
-            <password>06c56a89949d617def52f371c357b6db</password>
-            <email>momo at momo.com</email>
-            <admin>false</admin>
-            <enabled>false</enabled>
-            <updatableProfile>true</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups>
-                <string>group2</string>
-            </groups>
-        </user>
-        <user>
-            <username>yossis</username>
-            <password>9891b71c5812781d61403a03a101a854</password>
-            <email>yeswecan at yahoo.com</email>
-            <admin>false</admin>
-            <enabled>true</enabled>
-            <updatableProfile>true</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups/>
-        </user>
-        <user>
-            <username>toto</username>
-            <password>f71dbe52628a3f83a77ab494817525c6</password>
-            <email>toto at to.com</email>
-            <admin>false</admin>
-            <enabled>false</enabled>
-            <updatableProfile>true</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups>
-                <string>group1</string>
-                <string>group2</string>
-            </groups>
-        </user>
-    </users>
-    <groups>
-        <group>
-            <groupName>group2</groupName>
-        </group>
-        <group>
-            <groupName>group1</groupName>
-        </group>
-    </groups>
-    <acls>
-        <acl>
-            <permissionTarget>
-                <name>Anything</name>
-                <repoKey>ANY</repoKey>
-                <includes>
-                    <string>**</string>
-                </includes>
-                <excludes/>
-            </permissionTarget>
-            <aces>
-                <ace>
-                    <principal>anonymous</principal>
-                    <group>false</group>
-                    <mask>1</mask>
-                </ace>
-            </aces>
-            <updatedBy>unknown</updatedBy>
-        </acl>
-        <acl>
-            <permissionTarget>
-                <name>myperm1</name>
-                <repoKey>ANY</repoKey>
-                <includes>
-                    <string>**</string>
-                </includes>
-                <excludes>
-                    <string>**/*-SNAPSHOT/**</string>
-                </excludes>
-            </permissionTarget>
-            <aces>
-                <ace>
-                    <principal>toto</principal>
-                    <group>false</group>
-                    <mask>3</mask>
-                </ace>
-                <ace>
-                    <principal>anonymous</principal>
-                    <group>false</group>
-                    <mask>3</mask>
-                </ace>
-                <ace>
-                    <principal>momo</principal>
-                    <group>false</group>
-                    <mask>27</mask>
-                </ace>
-            </aces>
-            <updatedBy>admin</updatedBy>
-        </acl>
-        <acl>
-            <permissionTarget>
-                <name>myperm2</name>
-                <repoKey>plugins-releases-local</repoKey>
-                <includes/>
-                <excludes/>
-            </permissionTarget>
-            <aces>
-                <ace>
-                    <principal>toto</principal>
-                    <group>false</group>
-                    <mask>11</mask>
-                </ace>
-                <ace>
-                    <principal>group1</principal>
-                    <group>true</group>
-                    <mask>27</mask>
-                </ace>
-            </aces>
-            <updatedBy>admin</updatedBy>
-        </acl>
-        <acl>
-            <permissionTarget>
-                <name>emptyperm</name>
-                <repoKey>ANY</repoKey>
-                <includes>
-                    <string>**</string>
-                </includes>
-                <excludes/>
-            </permissionTarget>
-            <aces/>
-            <updatedBy>admin</updatedBy>
-        </acl>
-    </acls>
-</security>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/security/v6/security.upperlowercase.xml b/storage/update/src/test/resources/security/v6/security.upperlowercase.xml
deleted file mode 100644
index 3c9c939..0000000
--- a/storage/update/src/test/resources/security/v6/security.upperlowercase.xml
+++ /dev/null
@@ -1,226 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<security>
-    <users>
-        <user>
-            <username>TOTO</username>
-            <password>d41d8cd98f00b204e9800998ecf8427e</password>
-            <admin>false</admin>
-            <enabled>true</enabled>
-            <updatableProfile>false</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups/>
-        </user>
-        <user>
-            <username>admin</username>
-            <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
-            <admin>true</admin>
-            <enabled>true</enabled>
-            <updatableProfile>true</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups/>
-        </user>
-        <user>
-            <username>momo</username>
-            <password>06c56a89949d617def52f371c357b6db</password>
-            <email>momo at momo.com</email>
-            <admin>false</admin>
-            <enabled>false</enabled>
-            <updatableProfile>true</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups>
-                <userGroup>group2</userGroup>
-            </groups>
-        </user>
-        <user>
-            <username>Momo</username>
-            <password>06c56a89949d617def52f371c357b6db</password>
-            <email>momo at momo.com</email>
-            <admin>true</admin>
-            <enabled>false</enabled>
-            <updatableProfile>true</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups/>
-        </user>
-        <user>
-            <username>ToTo</username>
-            <password>9891b71c5812781d61403a03a101a854</password>
-            <admin>false</admin>
-            <enabled>true</enabled>
-            <updatableProfile>true</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups>
-                <userGroup>group2</userGroup>
-            </groups>
-        </user>
-        <user>
-            <username>toto</username>
-            <password>f71dbe52628a3f83a77ab494817525c6</password>
-            <admin>false</admin>
-            <enabled>false</enabled>
-            <updatableProfile>true</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups>
-                <userGroup>group1</userGroup>
-                <userGroup>GROUP3</userGroup>
-            </groups>
-        </user>
-        <user>
-            <username>singleuser</username>
-            <password>f71dbe52628a3f83a77ab494817525c6</password>
-            <admin>false</admin>
-            <enabled>false</enabled>
-            <updatableProfile>true</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups>
-                <userGroup>GROUP3</userGroup>
-            </groups>
-        </user>
-    </users>
-    <groups>
-        <group>
-            <groupName>group2</groupName>
-            <newUserDefault>false</newUserDefault>
-        </group>
-        <group>
-            <groupName>GrOuP2</groupName>
-            <newUserDefault>true</newUserDefault>
-
-        </group>
-        <group>
-            <groupName>group1</groupName>
-        </group>
-        <group>
-            <groupName>GROUP3</groupName>
-        </group>
-    </groups>
-    <acls>
-        <acl>
-            <permissionTarget>
-                <name>Anything</name>
-                <repoKey>ANY</repoKey>
-                <includes>
-                    <string>**</string>
-                </includes>
-                <excludes/>
-            </permissionTarget>
-            <aces>
-                <ace>
-                    <principal>anonymous</principal>
-                    <group>false</group>
-                    <mask>1</mask>
-                </ace>
-            </aces>
-            <updatedBy>unknown</updatedBy>
-        </acl>
-        <acl>
-            <permissionTarget>
-                <name>myperm1</name>
-                <repoKey>ANY</repoKey>
-                <includes>
-                    <string>**</string>
-                </includes>
-                <excludes>
-                    <string>**/*-SNAPSHOT/**</string>
-                </excludes>
-            </permissionTarget>
-            <aces>
-                <ace>
-                    <principal>toto</principal>
-                    <group>false</group>
-                    <mask>3</mask>
-                </ace>
-                <ace>
-                    <principal>toto</principal>
-                    <group>true</group>
-                    <mask>3</mask>
-                </ace>
-                <ace>
-                    <principal>anonymous</principal>
-                    <group>false</group>
-                    <mask>3</mask>
-                </ace>
-                <ace>
-                    <principal>MOMO</principal>
-                    <group>false</group>
-                    <mask>27</mask>
-                </ace>
-                <ace>
-                    <principal>group2</principal>
-                    <group>true</group>
-                    <mask>9</mask>
-                </ace>
-                <ace>
-                    <principal>GrOuP2</principal>
-                    <group>true</group>
-                    <mask>3</mask>
-                </ace>
-
-            </aces>
-            <updatedBy>admin</updatedBy>
-        </acl>
-        <acl>
-            <permissionTarget>
-                <name>myperm2</name>
-                <repoKey>plugins-releases-local</repoKey>
-                <includes/>
-                <excludes/>
-            </permissionTarget>
-            <aces>
-                <ace>
-                    <principal>ToTo</principal>
-                    <group>false</group>
-                    <mask>11</mask>
-                </ace>
-                <ace>
-                    <principal>group1</principal>
-                    <group>true</group>
-                    <mask>27</mask>
-                </ace>
-            </aces>
-            <updatedBy>admin</updatedBy>
-        </acl>
-        <acl>
-            <permissionTarget>
-                <name>emptyperm</name>
-                <repoKey>ANY</repoKey>
-                <includes>
-                    <string>**</string>
-                </includes>
-                <excludes/>
-            </permissionTarget>
-            <aces/>
-            <updatedBy>admin</updatedBy>
-        </acl>
-    </acls>
-</security>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/security/v6/security.xml b/storage/update/src/test/resources/security/v6/security.xml
deleted file mode 100644
index e3ea6b7..0000000
--- a/storage/update/src/test/resources/security/v6/security.xml
+++ /dev/null
@@ -1,176 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<security>
-    <users>
-        <user>
-            <username>anonymous</username>
-            <password>d41d8cd98f00b204e9800998ecf8427e</password>
-            <admin>false</admin>
-            <enabled>true</enabled>
-            <updatableProfile>false</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups/>
-        </user>
-        <user>
-            <username>admin</username>
-            <password>5f4dcc3b5aa765d61d8327deb882cf99</password>
-            <admin>true</admin>
-            <enabled>true</enabled>
-            <updatableProfile>true</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups/>
-        </user>
-        <user>
-            <username>momo</username>
-            <password>06c56a89949d617def52f371c357b6db</password>
-            <email>momo at momo.com</email>
-            <admin>false</admin>
-            <enabled>false</enabled>
-            <updatableProfile>true</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups>
-                <string>group2</string>
-            </groups>
-        </user>
-        <user>
-            <username>yossis</username>
-            <password>9891b71c5812781d61403a03a101a854</password>
-            <email>yeswecan at yahoo.com</email>
-            <admin>false</admin>
-            <enabled>true</enabled>
-            <updatableProfile>true</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups/>
-        </user>
-        <user>
-            <username>toto</username>
-            <password>f71dbe52628a3f83a77ab494817525c6</password>
-            <email>toto at to.com</email>
-            <admin>false</admin>
-            <enabled>false</enabled>
-            <updatableProfile>true</updatableProfile>
-            <accountNonExpired>true</accountNonExpired>
-            <credentialsNonExpired>true</credentialsNonExpired>
-            <accountNonLocked>true</accountNonLocked>
-            <groups>
-                <string>group1</string>
-                <string>group2</string>
-            </groups>
-        </user>
-    </users>
-    <groups>
-        <group>
-            <groupName>group2</groupName>
-        </group>
-        <group>
-            <groupName>group1</groupName>
-        </group>
-    </groups>
-    <acls>
-        <acl>
-            <permissionTarget>
-                <name>Anything</name>
-                <repoKey>ANY</repoKey>
-                <includes>
-                    <string>**</string>
-                </includes>
-                <excludes/>
-            </permissionTarget>
-            <aces>
-                <ace>
-                    <principal>anonymous</principal>
-                    <group>false</group>
-                    <mask>1</mask>
-                </ace>
-            </aces>
-            <updatedBy>unknown</updatedBy>
-        </acl>
-        <acl>
-            <permissionTarget>
-                <name>myperm1</name>
-                <repoKey>ANY</repoKey>
-                <includes>
-                    <string>**</string>
-                </includes>
-                <excludes>
-                    <string>**/*-SNAPSHOT/**</string>
-                </excludes>
-            </permissionTarget>
-            <aces>
-                <ace>
-                    <principal>toto</principal>
-                    <group>false</group>
-                    <mask>3</mask>
-                </ace>
-                <ace>
-                    <principal>anonymous</principal>
-                    <group>false</group>
-                    <mask>3</mask>
-                </ace>
-                <ace>
-                    <principal>momo</principal>
-                    <group>false</group>
-                    <mask>27</mask>
-                </ace>
-            </aces>
-            <updatedBy>admin</updatedBy>
-        </acl>
-        <acl>
-            <permissionTarget>
-                <name>myperm2</name>
-                <repoKey>plugins-releases-local</repoKey>
-                <includes/>
-                <excludes/>
-            </permissionTarget>
-            <aces>
-                <ace>
-                    <principal>toto</principal>
-                    <group>false</group>
-                    <mask>11</mask>
-                </ace>
-                <ace>
-                    <principal>group1</principal>
-                    <group>true</group>
-                    <mask>27</mask>
-                </ace>
-            </aces>
-            <updatedBy>admin</updatedBy>
-        </acl>
-        <acl>
-            <permissionTarget>
-                <name>emptyperm</name>
-                <repoKey>ANY</repoKey>
-                <includes>
-                    <string>**</string>
-                </includes>
-                <excludes/>
-            </permissionTarget>
-            <aces/>
-            <updatedBy>admin</updatedBy>
-        </acl>
-    </acls>
-</security>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/xsd/artifactory-v1_0_0.xsd b/storage/update/src/test/resources/xsd/artifactory-v1_0_0.xsd
deleted file mode 100755
index be00b15..0000000
--- a/storage/update/src/test/resources/xsd/artifactory-v1_0_0.xsd
+++ /dev/null
@@ -1,344 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0"
-           targetNamespace="http://artifactory.jfrog.org/xsd/1.0.0"
-           xmlns="http://artifactory.jfrog.org/xsd/1.0.0"
-           elementFormDefault="qualified">
-
-    <xs:element name="config" type="CentralConfigType"/>
-
-    <xs:complexType name="CentralConfigType">
-        <xs:sequence>
-            <xs:element name="serverName" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        A name uniquely identifying this artifactory server instance accross the
-                        network.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="anonDownloadsAllowed" type="xs:boolean" minOccurs="0" default="true">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Determines whether anonymous downloads are permitted.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="backupDir" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The directory to which backup local repository data as files.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="backupCronExp" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The cron expression by which backup frequency is determined.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="dateFormat" type="xs:string" default="dd-MM-yy HH:mm:ssZ"
-                        minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The format used for displaying dates.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="localRepositories" type="LocalRepositoriesType">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of locally installed repositories.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="remoteRepositories" type="RemoteRepositoriesType" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of remote proxied (normally cached) repositories.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="proxies" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of reusable proxy definitions.
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:complexType>
-                    <xs:sequence>
-                        <xs:element name="proxy" type="ProxyType" maxOccurs="unbounded"
-                                    minOccurs="0"/>
-                    </xs:sequence>
-                </xs:complexType>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="LocalRepositoriesType">
-        <xs:sequence>
-            <xs:element name="localRepository" type="LocalRepoType" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="LocalRepoType">
-        <xs:complexContent>
-            <xs:extension base="RepoType">
-                <xs:sequence>
-                    <xs:element name="useSnapshotUniqueVersions" type="xs:boolean" default="false"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether to use time-based version numbers for the name of SNAPSHOTs,
-                                or to use a self-overridding artifactId-version-SNAPSHOT.type
-                                naming.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="RepoType" abstract="true">
-        <xs:sequence>
-            <xs:element name="key" type="xs:string">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Repository unique id.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="description" type="xs:string" default="default description"
-                        minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Textual description of the repository.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="blackedOut" type="xs:boolean" default="false" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Whether the repository is blacked-out. A blacked-out repository does not
-                        participate in artifact resolution, nor dies its local cache.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="handleReleases" type="xs:boolean" default="true" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Whether the repository handle release artifacts.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="handleSnapshots" type="xs:boolean" default="true" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Whether the repository handle snapshot artifacts.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="includesPattern" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A comma-separated list of artifact patterns to include when evaluating
-                        artifact requests, in the form of x/y/**/z/*. When used, only requests
-                        matching one the include patterns will be served.
-                        By default all artifacts are included (**/*).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="excludesPattern" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A comma-separated list of artifact patterns to exclude when evaluating
-                        artifact requests, in the form of x/y/**/z/*.
-                        By default no artifacts are excluded.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="RemoteRepositoriesType">
-        <xs:sequence>
-            <xs:element name="remoteRepository" type="RemoteRepoType" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="RepoType">
-        <xs:complexContent>
-            <xs:extension base="RemoteRepoBaseType">
-                <xs:sequence>
-                    <xs:element name="username" type="xs:string" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                HTTP authentication username.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="password" type="xs:string" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                HTTP authentication password.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="socketTimeoutMillis" type="xs:int" default="5000"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Network timeout in milliseconds to use both for connection
-                                establishment and for unanswered requests.
-                                Timing out is considered a retrieval failure.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="proxyRef" type="xs:IDREF" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Network proxy reference.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="RemoteRepoBaseType" abstract="true">
-        <xs:complexContent>
-            <xs:extension base="RepoType">
-                <xs:sequence>
-                    <xs:element name="url" type="xs:string">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The url for the remote repository. Currently only HTTP urls are
-                                supported.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="hardFail" type="xs:boolean" default="false" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether failing to communicate with this repository will return an
-                                error to the client that will fail the build.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="storeArtifactsLocally" type="xs:boolean" default="true"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether the repository should cache artifacts locally. Leave as
-                                'true', as direct-to-client streaming has not been tested.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="retrievalCachePeriodSecs" type="xs:long" default="43200"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The number of seconds to cache artifact lookup results.
-                                A value of 0 means no caching.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-
-                    <xs:element name="failedRetrievalCachePeriodSecs" type="xs:long" default="30"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The number of seconds to cache artifact retrieval failures
-                                (resulting in comm. errors).
-                                A value of 0 means no caching.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="missedRetrievalCachePeriodSecs" type="xs:long" default="43200"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The number of seconds to cache artifact retrieval misses (artifct
-                                not found).
-                                A value of 0 means no caching.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="ProxyType">
-        <xs:sequence>
-            <xs:element name="key" type="xs:ID">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy unique id.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="host" type="xs:string">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy host.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="port" type="xs:int">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy port number.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="username" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy username.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="password" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy password.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="domain" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy domain/realm name.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-</xs:schema>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/xsd/artifactory-v1_1_0.xsd b/storage/update/src/test/resources/xsd/artifactory-v1_1_0.xsd
deleted file mode 100644
index 691ffca..0000000
--- a/storage/update/src/test/resources/xsd/artifactory-v1_1_0.xsd
+++ /dev/null
@@ -1,475 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0"
-           targetNamespace="http://artifactory.jfrog.org/xsd/1.1.0"
-           xmlns="http://artifactory.jfrog.org/xsd/1.1.0"
-           elementFormDefault="qualified">
-
-    <xs:element name="config" type="CentralConfigType"/>
-
-    <xs:complexType name="CentralConfigType">
-        <xs:sequence>
-            <xs:element name="serverName" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        A name uniquely identifying this artifactory server instance accross the
-                        network.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="anonDownloadsAllowed" type="xs:boolean" minOccurs="0" default="true">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Determines whether anonymous downloads are permitted.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="fileUploadMaxSizeMb" type="xs:int" default="100" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The maximun size in megabytes for uploaded artifact files.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="dateFormat" type="xs:string" default="dd-MM-yy HH:mm:ssZ"
-                        minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The format used for displaying dates.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="backup" type="BackupType" minOccurs="0"/>
-            <xs:element name="localRepositories" type="LocalRepositoriesType">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of locally installed repositories.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="remoteRepositories" type="RemoteRepositoriesType" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of remote proxied (normally cached) repositories.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="virtualRepositories" type="VirtualRepositoriesType" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of virtual repositories wrapping regular local and remote
-                        repositories.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="proxies" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of reusable proxy definitions.
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:complexType>
-                    <xs:sequence>
-                        <xs:element name="proxy" type="ProxyType" maxOccurs="unbounded"
-                                    minOccurs="0"/>
-                    </xs:sequence>
-                </xs:complexType>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="LocalRepositoriesType">
-        <xs:sequence>
-            <xs:element name="localRepository" type="LocalRepoType" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="LocalRepoType">
-        <xs:complexContent>
-            <xs:extension base="RepoType">
-                <xs:sequence>
-                    <xs:element name="snapshotVersionBehavior" default="nonunique" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether to use time-based version numbers for the name of SNAPSHOTs,
-                                or to use a non-unique, self-overridding naming pattern of
-                                artifactId-version-SNAPSHOT.type (the default), or to respect the
-                                deployer settings coming from the Maven client.
-                            </xs:documentation>
-                        </xs:annotation>
-                        <xs:simpleType>
-                            <xs:restriction base="xs:string">
-                                <xs:enumeration value="deployer"/>
-                                <xs:enumeration value="nonunique"/>
-                                <xs:enumeration value="unique"/>
-                            </xs:restriction>
-                        </xs:simpleType>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="RepoType" abstract="true">
-        <xs:sequence>
-            <xs:element name="key" type="xs:ID">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Repository unique id.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="description" type="xs:string" default="default description"
-                        minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Textual description of the repository.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="blackedOut" type="xs:boolean" default="false" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Whether the repository is blacked-out. A blacked-out repository does not
-                        participate in artifact resolution, nor dies its local cache.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="handleReleases" type="xs:boolean" default="true" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Whether the repository handle release artifacts.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="handleSnapshots" type="xs:boolean" default="true" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Whether the repository handle snapshot artifacts.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="maxUniqueSnapshots" type="xs:int" default="0" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The maximun number unique snapshots (of the same artifact) to store.
-                        Any number of sanpshots above the max will be automatically removed by age.
-                        A value of 0 (the default) means no limits on unique snapshots number (thus
-                        no automatic cleanup).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="includesPattern" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A comma-separated list of artifact patterns to include when evaluating
-                        artifact requests, in the form of x/y/**/z/*. When used, only requests
-                        matching one the include patterns will be served.
-                        By default all artifacts are included (**/*).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="excludesPattern" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A comma-separated list of artifact patterns to exclude when evaluating
-                        artifact requests, in the form of x/y/**/z/*.
-                        By default no artifacts are excluded.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="RemoteRepositoriesType">
-        <xs:sequence>
-            <xs:element name="remoteRepository" type="RemoteRepoType"
-                        minOccurs="0" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="RepoType">
-        <xs:complexContent>
-            <xs:extension base="RemoteRepoBaseType">
-                <xs:sequence>
-                    <xs:element name="username" type="xs:string" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                HTTP authentication username.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="password" type="xs:string" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                HTTP authentication password.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="socketTimeoutMillis" type="xs:int" default="5000"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Network timeout in milliseconds to use both for connection
-                                establishment and for unanswered requests.
-                                Timing out on a network operation is considered as a retrieval
-                                failure.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="proxyRef" type="xs:IDREF" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Network proxy reference.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="RemoteRepoBaseType" abstract="true">
-        <xs:complexContent>
-            <xs:extension base="RepoType">
-                <xs:sequence>
-                    <xs:element name="type" default="maven2" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The repository-type of the remote repository, which normally also
-                                reflects on its layout and behavior.
-                            </xs:documentation>
-                        </xs:annotation>
-                        <xs:simpleType>
-                            <xs:restriction base="xs:string">
-                                <xs:enumeration value="maven2"/>
-                                <xs:enumeration value="maven1"/>
-                                <xs:enumeration value="obr"/>
-                            </xs:restriction>
-                        </xs:simpleType>
-                    </xs:element>
-                    <xs:element name="url" type="xs:string">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The url for the remote repository. Currently only HTTP urls are
-                                supported.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="offline" type="xs:boolean" default="false" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                When set to true only already-cached artifacts will be retrieved and
-                                fetching remote artifacts will not be attempted.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="hardFail" type="xs:boolean" default="false" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether failing to communicate with this repository will return an
-                                error to the client that will fail the build.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="storeArtifactsLocally" type="xs:boolean" default="true"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether the repository should cache artifacts locally. Leave as
-                                'true', as direct-to-client streaming has not been thoroughly tested
-                                yet.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="retrievalCachePeriodSecs" type="xs:long" default="43200"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The number of seconds to cache artifact lookup results.
-                                A value of 0 means no caching.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-
-                    <xs:element name="failedRetrievalCachePeriodSecs" type="xs:long" default="30"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The number of seconds to cache artifact retrieval failures
-                                (resulting in comm. errors).
-                                A value of 0 means no caching.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="missedRetrievalCachePeriodSecs" type="xs:long" default="43200"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The number of seconds to cache artifact retrieval misses (artifact
-                                not found).
-                                A value of 0 means no caching.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="VirtualRepositoriesType">
-        <xs:sequence>
-            <xs:element name="virtualRepository" type="VirtualRepoType"
-                        minOccurs="0" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="VirtualRepoType">
-        <xs:sequence>
-            <xs:element name="key" type="xs:ID">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Virtual repository unique id.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="repositories" type="RepositoryRefsType" maxOccurs="1" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of local and remote repository references to include in a virtual
-                        repository.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="RepositoryRefsType">
-        <xs:sequence>
-            <xs:element name="repositoryRef" type="xs:IDREF" minOccurs="0" maxOccurs="unbounded">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Local or remote repository reference (key).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="ProxyType">
-        <xs:sequence>
-            <xs:element name="key" type="xs:ID">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy unique id.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="host" type="xs:string">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy host.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="port" type="xs:int">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy port number.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="username" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy username.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="password" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy password.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="domain" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy domain/realm name.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="BackupType">
-        <xs:sequence>
-            <xs:element name="dir" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The directory to which backup local repository data as files.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="cronExp" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The cron expression by which backup frequency is determined.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="retentionPeriodHours" type="xs:int" default="168" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The maximun number of hours to keep old backups in the destination dir.
-                        A value of 0 means no cleanup of old backups will be perfromed.
-                        The default is 168 hours = 7 days.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="excludedRepositories" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of repository references to exclude from backup.
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:complexType>
-                    <xs:sequence>
-                        <xs:element name="repositoryRef" type="xs:IDREF" minOccurs="0"
-                                    maxOccurs="unbounded">
-                            <xs:annotation>
-                                <xs:documentation source="description">
-                                    Local or remote repository reference (key).
-                                </xs:documentation>
-                            </xs:annotation>
-                        </xs:element>
-                    </xs:sequence>
-                </xs:complexType>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-</xs:schema>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/xsd/artifactory-v1_2_0.xsd b/storage/update/src/test/resources/xsd/artifactory-v1_2_0.xsd
deleted file mode 100644
index 90cc456..0000000
--- a/storage/update/src/test/resources/xsd/artifactory-v1_2_0.xsd
+++ /dev/null
@@ -1,571 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0"
-           targetNamespace="http://artifactory.jfrog.org/xsd/1.2.0"
-           xmlns="http://artifactory.jfrog.org/xsd/1.2.0"
-           elementFormDefault="qualified">
-
-    <xs:element name="config" type="CentralConfigType"/>
-
-    <xs:complexType name="CentralConfigType">
-        <xs:sequence>
-            <xs:element name="serverName" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        A name uniquely identifying this artifactory server instance accross the
-                        network.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="anonDownloadsAllowed" type="xs:boolean" minOccurs="0" default="true">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Determines whether anonymous downloads are permitted.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="fileUploadMaxSizeMb" type="xs:int" default="100" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The maximun size in megabytes for uploaded artifact files.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="dateFormat" type="xs:string" default="dd-MM-yy HH:mm:ssZ"
-                        minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The format used for displaying dates.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="security" type="SecurityType" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Security related configuration used in authentication and authorization.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="backup" type="BackupType" minOccurs="0"/>
-            <xs:element name="localRepositories" type="LocalRepositoriesType">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of locally installed repositories.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="remoteRepositories" type="RemoteRepositoriesType" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of remote proxied (normally cached) repositories.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="virtualRepositories" type="VirtualRepositoriesType" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of virtual repositories wrapping regular local and remote
-                        repositories.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="proxies" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of reusable proxy definitions.
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:complexType>
-                    <xs:sequence>
-                        <xs:element name="proxy" type="ProxyType" maxOccurs="unbounded"
-                                    minOccurs="0"/>
-                    </xs:sequence>
-                </xs:complexType>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="LocalRepositoriesType">
-        <xs:sequence>
-            <xs:element name="localRepository" type="LocalRepoType" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="LocalRepoType">
-        <xs:complexContent>
-            <xs:extension base="RepoType">
-                <xs:sequence>
-                    <xs:element name="snapshotVersionBehavior" default="non-unique" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether to use time-based version numbers for the name of SNAPSHOTs,
-                                or to use a non-unique, self-overridding naming pattern of
-                                artifactId-version-SNAPSHOT.type (the default), or to respect the
-                                deployer settings coming from the Maven client.
-                            </xs:documentation>
-                        </xs:annotation>
-                        <xs:simpleType>
-                            <xs:restriction base="xs:string">
-                                <xs:enumeration value="deployer"/>
-                                <xs:enumeration value="non-unique"/>
-                                <xs:enumeration value="unique"/>
-                            </xs:restriction>
-                        </xs:simpleType>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="RepoType" abstract="true">
-        <xs:sequence>
-            <xs:element name="key" type="xs:ID">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Repository unique id.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="description" type="xs:string" default="default description"
-                        minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Textual description of the repository.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="blackedOut" type="xs:boolean" default="false" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Whether the repository is blacked-out. A blacked-out repository does not
-                        participate in artifact resolution, nor dies its local cache.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="handleReleases" type="xs:boolean" default="true" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Whether the repository handle release artifacts.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="handleSnapshots" type="xs:boolean" default="true" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Whether the repository handle snapshot artifacts.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="maxUniqueSnapshots" type="xs:int" default="0" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The maximun number unique snapshots (of the same artifact) to store.
-                        Any number of sanpshots above the max will be automatically removed by age.
-                        A value of 0 (the default) means no limits on unique snapshots number (thus
-                        no automatic cleanup).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="includesPattern" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A comma-separated list of artifact patterns to include when evaluating
-                        artifact requests, in the form of x/y/**/z/*. When used, only requests
-                        matching one the include patterns will be served.
-                        By default all artifacts are included (**/*).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="excludesPattern" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A comma-separated list of artifact patterns to exclude when evaluating
-                        artifact requests, in the form of x/y/**/z/*.
-                        By default no artifacts are excluded.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="RemoteRepositoriesType">
-        <xs:sequence>
-            <xs:element name="remoteRepository" type="RemoteRepoType"
-                        minOccurs="0" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="RepoType">
-        <xs:complexContent>
-            <xs:extension base="RemoteRepoBaseType">
-                <xs:sequence>
-                    <xs:element name="username" type="xs:string" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                HTTP authentication username.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="password" type="xs:string" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                HTTP authentication password.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="socketTimeoutMillis" type="xs:int" default="5000"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Network timeout in milliseconds to use both for connection
-                                establishment and for unanswered requests.
-                                Timing out on a network operation is considered as a retrieval
-                                failure.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="proxyRef" type="xs:IDREF" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Network proxy reference.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="RemoteRepoBaseType" abstract="true">
-        <xs:complexContent>
-            <xs:extension base="RepoType">
-                <xs:sequence>
-                    <xs:element name="type" default="maven2" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The repository-type of the remote repository, which normally also
-                                reflects on its layout and behavior.
-                            </xs:documentation>
-                        </xs:annotation>
-                        <xs:simpleType>
-                            <xs:restriction base="xs:string">
-                                <xs:enumeration value="maven2"/>
-                                <xs:enumeration value="maven1"/>
-                                <xs:enumeration value="obr"/>
-                                <xs:enumeration value="raw"/>
-                            </xs:restriction>
-                        </xs:simpleType>
-                    </xs:element>
-                    <xs:element name="url" type="xs:string">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The url for the remote repository. Currently only HTTP urls are
-                                supported.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="offline" type="xs:boolean" default="false" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                When set to true only already-cached artifacts will be retrieved and
-                                fetching remote artifacts will not be attempted.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="hardFail" type="xs:boolean" default="false" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether failing to communicate with this repository will return an
-                                error to the client that will fail the build.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="storeArtifactsLocally" type="xs:boolean" default="true"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether the repository should cache artifacts locally. Leave as
-                                'true', as direct-to-client streaming has not been thoroughly tested
-                                yet.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="retrievalCachePeriodSecs" type="xs:long" default="43200"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The number of seconds to cache artifact lookup results.
-                                A value of 0 means no caching.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-
-                    <xs:element name="failedRetrievalCachePeriodSecs" type="xs:long" default="30"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The number of seconds to cache artifact retrieval failures
-                                (resulting in comm. errors).
-                                A value of 0 means no caching.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="missedRetrievalCachePeriodSecs" type="xs:long" default="43200"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The number of seconds to cache artifact retrieval misses (artifact
-                                not found).
-                                A value of 0 means no caching.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="VirtualRepositoriesType">
-        <xs:sequence>
-            <xs:element name="virtualRepository" type="VirtualRepoType"
-                        minOccurs="0" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="VirtualRepoType">
-        <xs:sequence>
-            <xs:element name="key" type="xs:ID">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Virtual repository unique id.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="repositories" type="RepositoryRefsType" maxOccurs="1" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of local and remote repository references to include in a virtual
-                        repository.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="RepositoryRefsType">
-        <xs:sequence>
-            <xs:element name="repositoryRef" type="xs:IDREF" minOccurs="0" maxOccurs="unbounded">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Local or remote repository reference (key).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="ProxyType">
-        <xs:sequence>
-            <xs:element name="key" type="xs:ID">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy unique id.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="host" type="xs:string">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy host.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="port" type="xs:int">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy port number.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="username" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy username.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="password" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy password.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="domain" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy domain/realm name.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="BackupType">
-        <xs:sequence>
-            <xs:element name="dir" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The directory to which backup local repository data as files.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="cronExp" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The cron expression by which backup frequency is determined.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="retentionPeriodHours" type="xs:int" default="168" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The maximun number of hours to keep old backups in the destination dir.
-                        A value of 0 means no cleanup of old backups will be perfromed.
-                        The default is 168 hours = 7 days.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="excludedRepositories" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of repository references to exclude from backup.
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:complexType>
-                    <xs:sequence>
-                        <xs:element name="repositoryRef" type="xs:IDREF" minOccurs="0"
-                                    maxOccurs="unbounded">
-                            <xs:annotation>
-                                <xs:documentation source="description">
-                                    Local or remote repository reference (key).
-                                </xs:documentation>
-                            </xs:annotation>
-                        </xs:element>
-                    </xs:sequence>
-                </xs:complexType>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="SecurityType">
-        <xs:sequence>
-            <xs:element name="ldapSettings" type="LdapSettingsType" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Security settings specific to ldap.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="LdapSettingsType">
-        <xs:sequence>
-            <xs:element name="authenticationMethod">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The method used for ldap authentication. Possible values are:
-                        "bind-anonymous", "bind-manager", "search-anonymous", "search-manager".
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:simpleType>
-                    <xs:restriction base="xs:string">
-                        <xs:enumeration value="bind-anonymous"/>
-                        <xs:enumeration value="bind-manager"/>
-                        <xs:enumeration value="search-anonymous"/>
-                        <xs:enumeration value="search-manager"/>
-                    </xs:restriction>
-                </xs:simpleType>
-            </xs:element>
-            <xs:element name="ldapUrl" type="xs:string" minOccurs="1" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Location of the ldap server in the form of:
-                        ldap://myserver:myport/dc=sampledomain,dc=com
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="userDnPattern" type="xs:string" minOccurs="1" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Search criteria used to locate users in the ldap database.
-                        For example: uid={0},ou=People
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="managerDn" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Used only if the authenticationMethod "search" is used.
-                        It is the name of the user who binds to the ldap server to perform the search
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="managerPassword" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Used only if the authenticationMethod "search" is used.
-                        It is the password of the user who binds to the ldap server to perform the search
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="searchAuthPasswordAttributeName" type="xs:string" minOccurs="0"
-                        maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Used only if the authenticationMethod "search" is used.
-                        It is the name of the ldap-attribute that holds the password of the users
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-</xs:schema>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/xsd/artifactory-v1_2_6.xsd b/storage/update/src/test/resources/xsd/artifactory-v1_2_6.xsd
deleted file mode 100644
index b07c95d..0000000
--- a/storage/update/src/test/resources/xsd/artifactory-v1_2_6.xsd
+++ /dev/null
@@ -1,597 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0"
-           targetNamespace="http://artifactory.jfrog.org/xsd/1.3.0"
-           xmlns="http://artifactory.jfrog.org/xsd/1.3.0"
-           elementFormDefault="qualified">
-
-    <xs:element name="config" type="CentralConfigType"/>
-
-    <xs:complexType name="CentralConfigType">
-        <xs:sequence>
-            <xs:element name="serverName" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        A name uniquely identifying this artifactory server instance accross the
-                        network.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="anonAccessEnabled" type="xs:boolean" minOccurs="0" default="true">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Determines whether anonymous access to the repository and the UI is
-                        permitted.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="fileUploadMaxSizeMb" type="xs:int" default="100" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The maximun size in megabytes for uploaded artifact files.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="dateFormat" type="xs:string" default="dd-MM-yy HH:mm:ssZ"
-                        minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The format used for displaying dates.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="security" type="SecurityType" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Security related configuration used in authentication and authorization.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="backup" type="BackupType" minOccurs="0"/>
-            <xs:element name="localRepositories" type="LocalRepositoriesType">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of locally installed repositories.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="remoteRepositories" type="RemoteRepositoriesType" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of remote proxied (normally cached) repositories.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="virtualRepositories" type="VirtualRepositoriesType" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of virtual repositories wrapping regular local and remote
-                        repositories.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="proxies" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of reusable proxy definitions.
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:complexType>
-                    <xs:sequence>
-                        <xs:element name="proxy" type="ProxyType" maxOccurs="unbounded"
-                                    minOccurs="0"/>
-                    </xs:sequence>
-                </xs:complexType>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="LocalRepositoriesType">
-        <xs:sequence>
-            <xs:element name="localRepository" type="LocalRepoType" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="LocalRepoType">
-        <xs:complexContent>
-            <xs:extension base="RealRepoType">
-                <xs:sequence>
-                    <xs:element name="snapshotVersionBehavior" default="non-unique" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether to use time-based version numbers for the name of SNAPSHOTs,
-                                or to use a non-unique, self-overridding naming pattern of
-                                artifactId-version-SNAPSHOT.type (the default), or to respect the
-                                deployer settings coming from the Maven client.
-                            </xs:documentation>
-                        </xs:annotation>
-                        <xs:simpleType>
-                            <xs:restriction base="xs:string">
-                                <xs:enumeration value="deployer"/>
-                                <xs:enumeration value="non-unique"/>
-                                <xs:enumeration value="unique"/>
-                            </xs:restriction>
-                        </xs:simpleType>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="RealRepoType" abstract="true">
-        <xs:complexContent>
-            <xs:extension base="RepoType">
-                <xs:sequence>
-                    <xs:element name="blackedOut" type="xs:boolean" default="false" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether the repository is blacked-out. A blacked-out repository does not
-                                participate in artifact resolution, nor dies its local cache.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="handleReleases" type="xs:boolean" default="true"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether the repository handle release artifacts.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="handleSnapshots" type="xs:boolean" default="true"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether the repository handle snapshot artifacts.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="maxUniqueSnapshots" type="xs:int" default="0" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The maximun number unique snapshots (of the same artifact) to store.
-                                Any number of sanpshots above the max will be automatically removed by age.
-                                A value of 0 (the default) means no limits on unique snapshots number (thus
-                                no automatic cleanup).
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="includesPattern" type="xs:string" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                A comma-separated list of artifact patterns to include when evaluating
-                                artifact requests, in the form of x/y/**/z/*. When used, only requests
-                                matching one the include patterns will be served.
-                                By default all artifacts are included (**/*).
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="excludesPattern" type="xs:string" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                A comma-separated list of artifact patterns to exclude when evaluating
-                                artifact requests, in the form of x/y/**/z/*.
-                                By default no artifacts are excluded.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="RepoType" abstract="true">
-        <xs:sequence>
-            <xs:element name="key" type="xs:ID">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Repository unique id.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="description" type="xs:string" default="default description"
-                        minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Textual description of the repository.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="RemoteRepositoriesType">
-        <xs:sequence>
-            <xs:element name="remoteRepository" type="RemoteRepoType"
-                        minOccurs="0" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="RepoType">
-        <xs:complexContent>
-            <xs:extension base="RemoteRepoBaseType">
-                <xs:sequence>
-                    <xs:element name="username" type="xs:string" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                HTTP authentication username.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="password" type="xs:string" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                HTTP authentication password.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="socketTimeoutMillis" type="xs:int" default="15000"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Network timeout in milliseconds to use both for connection
-                                establishment and for unanswered requests.
-                                Timing out on a network operation is considered as a retrieval
-                                failure.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="localAddress" type="xs:string" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The local address to be used when creating connections.
-                                Useful for specifying the interface to use on multi-homed systems.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="proxyRef" type="xs:IDREF" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Network proxy reference.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="RemoteRepoBaseType" abstract="true">
-        <xs:complexContent>
-            <xs:extension base="RealRepoType">
-                <xs:sequence>
-                    <xs:element name="type" default="maven2" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The repository-type of the remote repository, which normally also
-                                reflects on its layout and behavior.
-                            </xs:documentation>
-                        </xs:annotation>
-                        <xs:simpleType>
-                            <xs:restriction base="xs:string">
-                                <xs:enumeration value="maven2"/>
-                                <xs:enumeration value="maven1"/>
-                                <xs:enumeration value="obr"/>
-                                <xs:enumeration value="raw"/>
-                            </xs:restriction>
-                        </xs:simpleType>
-                    </xs:element>
-                    <xs:element name="url" type="xs:string">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The url for the remote repository. Currently only HTTP urls are
-                                supported.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="offline" type="xs:boolean" default="false" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                When set to true only already-cached artifacts will be retrieved and
-                                fetching remote artifacts will not be attempted.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="hardFail" type="xs:boolean" default="false" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether failing to communicate with this repository will return an
-                                error to the client that will fail the build.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="storeArtifactsLocally" type="xs:boolean" default="true"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether the repository should cache artifacts locally. Leave as
-                                'true', as direct-to-client streaming has not been thoroughly tested
-                                yet.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="retrievalCachePeriodSecs" type="xs:long" default="43200"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The number of seconds to cache artifact lookup results.
-                                A value of 0 means no caching.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-
-                    <xs:element name="failedRetrievalCachePeriodSecs" type="xs:long" default="30"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The number of seconds to cache artifact retrieval failures
-                                (resulting in comm. errors).
-                                A value of 0 means no caching.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="missedRetrievalCachePeriodSecs" type="xs:long" default="43200"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The number of seconds to cache artifact retrieval misses (artifact
-                                not found).
-                                A value of 0 means no caching.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="VirtualRepositoriesType">
-        <xs:sequence>
-            <xs:element name="virtualRepository" type="VirtualRepoType"
-                        minOccurs="0" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="VirtualRepoType">
-        <xs:complexContent>
-            <xs:extension base="RepoType">
-                <xs:sequence>
-                    <xs:element name="repositories" type="RepositoryRefsType" maxOccurs="1"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                A set of local and remote repository references to include in a
-                                virtual repository.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="RepositoryRefsType">
-        <xs:sequence>
-            <xs:element name="repositoryRef" type="xs:IDREF" minOccurs="0" maxOccurs="unbounded">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Local, remote or virtual repository reference (key).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="ProxyType">
-        <xs:sequence>
-            <xs:element name="key" type="xs:ID">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy unique id.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="host" type="xs:string">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy host.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="port" type="xs:int">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy port number.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="username" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy username.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="password" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy password.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="domain" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy domain/realm name.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="BackupType">
-        <xs:sequence>
-            <xs:element name="dir" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The directory to which backup local repository data as files.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="cronExp" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The cron expression by which backup frequency is determined.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="retentionPeriodHours" type="xs:int" default="168" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The maximun number of hours to keep old backups in the destination dir.
-                        A value of 0 means no cleanup of old backups will be perfromed.
-                        The default is 168 hours = 7 days.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="createArchive" type="xs:boolean" minOccurs="0" default="false">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Determines whether the backup output should be a zip archive or a
-                        directory (the default).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="excludedRepositories" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of repository references to exclude from backup.
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:complexType>
-                    <xs:sequence>
-                        <xs:element name="repositoryRef" type="xs:IDREF" minOccurs="0"
-                                    maxOccurs="unbounded">
-                            <xs:annotation>
-                                <xs:documentation source="description">
-                                    Local or remote repository reference (key).
-                                </xs:documentation>
-                            </xs:annotation>
-                        </xs:element>
-                    </xs:sequence>
-                </xs:complexType>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="SecurityType">
-        <xs:sequence>
-            <xs:element name="ldapSettings" type="LdapSettingsType" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Security settings specific to ldap.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="LdapSettingsType">
-        <xs:sequence>
-            <xs:element name="authenticationMethod">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The method used for ldap authentication. Possible values are:
-                        "bind-anonymous", "bind-manager", "search-anonymous", "search-manager".
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:simpleType>
-                    <xs:restriction base="xs:string">
-                        <xs:enumeration value="bind-anonymous"/>
-                        <xs:enumeration value="bind-manager"/>
-                        <xs:enumeration value="search-anonymous"/>
-                        <xs:enumeration value="search-manager"/>
-                    </xs:restriction>
-                </xs:simpleType>
-            </xs:element>
-            <xs:element name="ldapUrl" type="xs:string" minOccurs="1" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Location of the ldap server in the form of:
-                        ldap://myserver:myport/dc=sampledomain,dc=com
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="userDnPattern" type="xs:string" minOccurs="1" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Search criteria used to locate users in the ldap database.
-                        For example: uid={0},ou=People
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="managerDn" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Used only if the authenticationMethod "search" is used.
-                        It is the name of the user who binds to the ldap server to perform the search
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="managerPassword" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Used only if the authenticationMethod "search" is used.
-                        It is the password of the user who binds to the ldap server to perform the search
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="searchAuthPasswordAttributeName" type="xs:string" minOccurs="0"
-                        maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Used only if the authenticationMethod "search" is used.
-                        It is the name of the ldap-attribute that holds the password of the users
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-</xs:schema>
\ No newline at end of file
diff --git a/storage/update/src/test/resources/xsd/artifactory-v1_3_0.xsd b/storage/update/src/test/resources/xsd/artifactory-v1_3_0.xsd
deleted file mode 100644
index 46b2e52..0000000
--- a/storage/update/src/test/resources/xsd/artifactory-v1_3_0.xsd
+++ /dev/null
@@ -1,659 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0"
-           targetNamespace="http://artifactory.jfrog.org/xsd/1.3.0"
-           xmlns="http://artifactory.jfrog.org/xsd/1.3.0"
-           elementFormDefault="qualified">
-
-    <xs:element name="config" type="CentralConfigType"/>
-
-    <xs:complexType name="CentralConfigType">
-        <xs:sequence>
-            <xs:element name="serverName" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        A name uniquely identifying this artifactory server instance accross the
-                        network.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="anonAccessEnabled" type="xs:boolean" minOccurs="0" default="true">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Determines whether anonymous access to the repository and the UI is
-                        permitted.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="fileUploadMaxSizeMb" type="xs:int" default="100" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The maximun size in megabytes for uploaded artifact files.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="dateFormat" type="xs:string" default="dd-MM-yy HH:mm:ssZ"
-                        minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The format used for displaying dates.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="security" type="SecurityType" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Security related configuration used in authentication and authorization.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="backup" type="BackupType" minOccurs="0"/>
-            <xs:element name="indexer" type="IndexerType" minOccurs="0"/>
-            <xs:element name="localRepositories" type="LocalRepositoriesType">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of locally installed repositories.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="remoteRepositories" type="RemoteRepositoriesType" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of remote proxied (normally cached) repositories.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="virtualRepositories" type="VirtualRepositoriesType" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of virtual repositories wrapping regular local and remote
-                        repositories.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="proxies" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of reusable proxy definitions.
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:complexType>
-                    <xs:sequence>
-                        <xs:element name="proxy" type="ProxyType" maxOccurs="unbounded"
-                                    minOccurs="0"/>
-                    </xs:sequence>
-                </xs:complexType>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="LocalRepositoriesType">
-        <xs:sequence>
-            <xs:element name="localRepository" type="LocalRepoType" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="LocalRepoType">
-        <xs:complexContent>
-            <xs:extension base="RealRepoType">
-                <xs:sequence>
-                    <xs:element name="snapshotVersionBehavior" default="non-unique" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether to use time-based version numbers for the name of SNAPSHOTs,
-                                or to use a non-unique, self-overridding naming pattern of
-                                artifactId-version-SNAPSHOT.type (the default), or to respect the
-                                deployer settings coming from the Maven client.
-                            </xs:documentation>
-                        </xs:annotation>
-                        <xs:simpleType>
-                            <xs:restriction base="xs:string">
-                                <xs:enumeration value="deployer"/>
-                                <xs:enumeration value="non-unique"/>
-                                <xs:enumeration value="unique"/>
-                            </xs:restriction>
-                        </xs:simpleType>
-                    </xs:element>
-                    <xs:element name="allowArtifactsOvewriting" type="xs:boolean" minOccurs="0"
-                                default="true">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Determines whether artifacts can be deployed over existing
-                                artifacts. With maven repositories this does setting does not apply
-                                to non-unique snapshots (which can always be overwritten).
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="RealRepoType" abstract="true">
-        <xs:complexContent>
-            <xs:extension base="RepoType">
-                <xs:sequence>
-                    <xs:element name="blackedOut" type="xs:boolean" default="false" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether the repository is blacked-out. A blacked-out repository does not
-                                participate in artifact resolution, nor dies its local cache.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="handleReleases" type="xs:boolean" default="true"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether the repository handle release artifacts.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="handleSnapshots" type="xs:boolean" default="true"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether the repository handle snapshot artifacts.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="maxUniqueSnapshots" type="xs:int" default="0" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The maximun number unique snapshots (of the same artifact) to store.
-                                Any number of sanpshots above the max will be automatically removed by age.
-                                A value of 0 (the default) means no limits on unique snapshots number (thus
-                                no automatic cleanup).
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="includesPattern" type="xs:string" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                A comma-separated list of artifact patterns to include when evaluating
-                                artifact requests, in the form of x/y/**/z/*. When used, only requests
-                                matching one the include patterns will be served.
-                                By default all artifacts are included (**/*).
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="excludesPattern" type="xs:string" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                A comma-separated list of artifact patterns to exclude when evaluating
-                                artifact requests, in the form of x/y/**/z/*.
-                                By default no artifacts are excluded.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="RepoType" abstract="true">
-        <xs:sequence>
-            <xs:element name="key" type="xs:ID">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Repository unique id.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="description" type="xs:string" default="default description"
-                        minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Textual description of the repository.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="RemoteRepositoriesType">
-        <xs:sequence>
-            <xs:element name="remoteRepository" type="RemoteRepoType"
-                        minOccurs="0" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="RepoType">
-        <xs:complexContent>
-            <xs:extension base="RemoteRepoBaseType">
-                <xs:sequence>
-                    <xs:element name="username" type="xs:string" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                HTTP authentication username.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="password" type="xs:string" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                HTTP authentication password.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="socketTimeoutMillis" type="xs:int" default="15000"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Network timeout in milliseconds to use both for connection
-                                establishment and for unanswered requests.
-                                Timing out on a network operation is considered as a retrieval
-                                failure.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="localAddress" type="xs:string" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The local address to be used when creating connections.
-                                Useful for specifying the interface to use on multi-homed systems.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="proxyRef" type="xs:IDREF" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Network proxy reference.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="RemoteRepoBaseType" abstract="true">
-        <xs:complexContent>
-            <xs:extension base="RealRepoType">
-                <xs:sequence>
-                    <xs:element name="type" default="maven2" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The repository-type of the remote repository, which normally also
-                                reflects on its layout and behavior.
-                            </xs:documentation>
-                        </xs:annotation>
-                        <xs:simpleType>
-                            <xs:restriction base="xs:string">
-                                <xs:enumeration value="maven2"/>
-                                <xs:enumeration value="maven1"/>
-                                <xs:enumeration value="obr"/>
-                                <xs:enumeration value="raw"/>
-                            </xs:restriction>
-                        </xs:simpleType>
-                    </xs:element>
-                    <xs:element name="url" type="xs:string">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The url for the remote repository. Currently only HTTP urls are
-                                supported.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="offline" type="xs:boolean" default="false" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                When set to true only already-cached artifacts will be retrieved and
-                                fetching remote artifacts will not be attempted.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="hardFail" type="xs:boolean" default="false" minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether failing to communicate with this repository will return an
-                                error to the client that will fail the build.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="storeArtifactsLocally" type="xs:boolean" default="true"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Whether the repository should cache artifacts locally. Leave as
-                                'true', as direct-to-client streaming has not been thoroughly tested
-                                yet.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="retrievalCachePeriodSecs" type="xs:long" default="43200"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The number of seconds to cache artifact lookup results.
-                                A value of 0 means no caching.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-
-                    <xs:element name="failedRetrievalCachePeriodSecs" type="xs:long" default="30"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The number of seconds to cache artifact retrieval failures
-                                (resulting in comm. errors).
-                                A value of 0 means no caching.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="missedRetrievalCachePeriodSecs" type="xs:long" default="43200"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                The number of seconds to cache artifact retrieval misses (artifact
-                                not found).
-                                A value of 0 means no caching.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="VirtualRepositoriesType">
-        <xs:sequence>
-            <xs:element name="virtualRepository" type="VirtualRepoType"
-                        minOccurs="0" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="VirtualRepoType">
-        <xs:complexContent>
-            <xs:extension base="RepoType">
-                <xs:sequence>
-                    <xs:element name="artifactoryRequestsCanRetrieveRemoteArtifacts"
-                                type="xs:boolean" minOccurs="0" default="false">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                Determines whether artifact requests comming from other Artifactories
-                                can be fulfilled by accessing this virtual repository's remote repositories
-                                or by only accessing its caches (the default).
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="repositories" type="RepositoryRefsType" maxOccurs="1"
-                                minOccurs="0">
-                        <xs:annotation>
-                            <xs:documentation source="description">
-                                A set of local and remote repository references to include in a
-                                virtual repository.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="RepositoryRefsType">
-        <xs:sequence>
-            <xs:element name="repositoryRef" type="xs:IDREF" minOccurs="0" maxOccurs="unbounded">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Local, remote or virtual repository reference (key).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="ProxyType">
-        <xs:sequence>
-            <xs:element name="key" type="xs:ID">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy unique id.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="host" type="xs:string">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy host.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="port" type="xs:int">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy port number.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="username" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy username.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="password" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy password.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="domain" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Proxy domain/realm name.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="BackupType">
-        <xs:sequence>
-            <xs:element name="dir" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The directory to which backup local repository data as files.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="cronExp" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The cron expression by which backup frequency is determined.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="retentionPeriodHours" type="xs:int" default="168" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        The maximun number of hours to keep old backups in the destination dir.
-                        A value of 0 means backups will always be written to the same directory for
-                        incremental file-system based backup support, thus cleanup of old backups is
-                        inactive.
-                        The default is 168 hours = 7 days.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="createArchive" type="xs:boolean" minOccurs="0" default="false">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        Determines whether the backup output should be a zip archive or a
-                        directory (the default).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="excludedRepositories" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of repository references to exclude from backup.
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:complexType>
-                    <xs:sequence>
-                        <xs:element name="repositoryRef" type="xs:IDREF" minOccurs="0"
-                                    maxOccurs="unbounded">
-                            <xs:annotation>
-                                <xs:documentation source="description">
-                                    Local or remote repository reference (key).
-                                </xs:documentation>
-                            </xs:annotation>
-                        </xs:element>
-                    </xs:sequence>
-                </xs:complexType>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="IndexerType">
-        <xs:annotation>
-            <xs:documentation source="description">
-                Configuration for the indexer creating (Nexus) indexes downloadable by IDEs.
-            </xs:documentation>
-        </xs:annotation>
-        <xs:sequence>
-            <xs:element name="cronExp" type="xs:string" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The cron expression by which indexing frequency is determined.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-
-            <xs:element name="excludedRepositories" minOccurs="0">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        A set of repository references to exclude from indexing.
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:complexType>
-                    <xs:sequence>
-                        <xs:element name="repositoryRef" type="xs:IDREF" minOccurs="0"
-                                    maxOccurs="unbounded">
-                            <xs:annotation>
-                                <xs:documentation source="description">
-                                    Repository reference (key).
-                                </xs:documentation>
-                            </xs:annotation>
-                        </xs:element>
-                    </xs:sequence>
-                </xs:complexType>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="SecurityType">
-        <xs:sequence>
-            <xs:element name="ldapSettings" type="LdapSettingsType" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Security settings specific to ldap.
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="LdapSettingsType">
-        <xs:sequence>
-            <xs:element name="authenticationMethod">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        The method used for ldap authentication. Possible values are:
-                        "bind-anonymous", "bind-manager", "search-anonymous", "search-manager".
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-                <xs:simpleType>
-                    <xs:restriction base="xs:string">
-                        <xs:enumeration value="bind-anonymous"/>
-                        <xs:enumeration value="bind-manager"/>
-                        <xs:enumeration value="search-anonymous"/>
-                        <xs:enumeration value="search-manager"/>
-                    </xs:restriction>
-                </xs:simpleType>
-            </xs:element>
-            <xs:element name="ldapUrl" type="xs:string" minOccurs="1" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Location of the ldap server in the form of:
-                        ldap://myserver:myport/dc=sampledomain,dc=com
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="userDnPattern" type="xs:string" minOccurs="1" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Search criteria used to locate users in the ldap database.
-                        For example: uid={0},ou=People
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="managerDn" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Used only if the authenticationMethod "search" is used.
-                        It is the name of the user who binds to the ldap server to perform the search
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="managerPassword" type="xs:string" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Used only if the authenticationMethod "search" is used.
-                        It is the password of the user who binds to the ldap server to perform the search
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="searchAuthPasswordAttributeName" type="xs:string" minOccurs="0"
-                        maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation source="description">
-                        <![CDATA[
-                        Used only if the authenticationMethod "search" is used.
-                        It is the name of the ldap-attribute that holds the password of the users
-                        ]]>
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-</xs:schema>
\ No newline at end of file
diff --git a/support/core/pom.xml b/support/core/pom.xml
deleted file mode 100644
index c7d6b5d..0000000
--- a/support/core/pom.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0          http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>artifactory-support-core</artifactId>
-    <packaging>jar</packaging>
-    <name>Artifactory Support Core</name>
-
-    <parent>
-        <artifactId>artifactory-support-parent</artifactId>
-        <groupId>org.artifactory</groupId>
-        <version>4.8.0</version>
-    </parent>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-log</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-common</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-tx</artifactId>
-        </dependency>
-    </dependencies>
-
-</project>
diff --git a/support/core/src/main/java/org/artifactory/support/config/CollectConfiguration.java b/support/core/src/main/java/org/artifactory/support/config/CollectConfiguration.java
deleted file mode 100644
index 969e3b2..0000000
--- a/support/core/src/main/java/org/artifactory/support/config/CollectConfiguration.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.config;
-
-/**
- * @author Michael Pasternak
- */
-public class CollectConfiguration implements Configuration {
-
-    // we enable all collectors by default (see in #RTFACT-8106)
-    private boolean enabled = true;
-
-    /**
-     * serialization .ctr
-     */
-    public CollectConfiguration() {
-    }
-
-    public CollectConfiguration(boolean enabled) {
-        this.enabled = enabled;
-    }
-
-    /**
-     * @return whether given configuration is enabled
-     */
-    public boolean isEnabled() {
-        return enabled;
-    }
-
-    /**
-     * @return {@link CollectConfiguration}
-     */
-    @Override
-    public CollectConfiguration get() {
-        return this;
-    }
-}
diff --git a/support/core/src/main/java/org/artifactory/support/config/Configuration.java b/support/core/src/main/java/org/artifactory/support/config/Configuration.java
deleted file mode 100644
index 041391b..0000000
--- a/support/core/src/main/java/org/artifactory/support/config/Configuration.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.config;
-
-/**
- * Support configuration
- *
- * @author Michael Pasternak
- */
-public interface Configuration {
-    CollectConfiguration get();
-}
diff --git a/support/core/src/main/java/org/artifactory/support/config/analysis/ThreadDumpConfiguration.java b/support/core/src/main/java/org/artifactory/support/config/analysis/ThreadDumpConfiguration.java
deleted file mode 100644
index 82f8f1b..0000000
--- a/support/core/src/main/java/org/artifactory/support/config/analysis/ThreadDumpConfiguration.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.config.analysis;
-
-import org.artifactory.support.config.CollectConfiguration;
-import org.artifactory.support.core.exceptions.BundleConfigurationException;
-
-/**
- * Thread dump collection configuration
- *
- * @author Michael Pasternak
- */
-public class ThreadDumpConfiguration extends CollectConfiguration {
-
-    private int count;
-    private long interval;
-
-    /**
-     * Default .ctr
-     */
-    public ThreadDumpConfiguration() {
-        // we enable all collectors by default (see in #RTFACT-8106)
-        setDefaultConfig();
-    }
-
-    /**
-     * @param enabled is collection enabled
-     */
-    public ThreadDumpConfiguration(boolean enabled) {
-        super(enabled);
-        setDefaultConfig();
-    }
-
-    /**
-     * @param enabled is collection enabled
-     * @param count amount of dumps to take
-     * @param interval interval between dumps (millis)
-     */
-    public ThreadDumpConfiguration(boolean enabled, int count, long interval) {
-        super(enabled);
-        this.count = count;
-        this.interval = interval;
-    }
-
-    /**
-     * @return dumps count
-     */
-    public int getCount() {
-        return count;
-    }
-
-    /**
-     * @return interval between dumps (millis)
-     */
-    public long getInterval() {
-        return interval;
-    }
-
-    /**
-     * Sets default configuration on user config absence
-     */
-    private void setDefaultConfig() {
-        count=1;
-        interval=0;
-    }
-}
diff --git a/support/core/src/main/java/org/artifactory/support/config/bundle/BundleConfiguration.java b/support/core/src/main/java/org/artifactory/support/config/bundle/BundleConfiguration.java
deleted file mode 100644
index 860d098..0000000
--- a/support/core/src/main/java/org/artifactory/support/config/bundle/BundleConfiguration.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.config.bundle;
-
-import org.artifactory.support.config.configfiles.ConfigFilesConfiguration;
-import org.artifactory.support.config.descriptor.ConfigDescriptorConfiguration;
-import org.artifactory.support.config.analysis.ThreadDumpConfiguration;
-import org.artifactory.support.config.security.SecurityInfoConfiguration;
-import org.artifactory.support.config.storage.StorageSummaryConfiguration;
-import org.artifactory.support.config.system.SystemInfoConfiguration;
-import org.artifactory.support.config.systemlogs.SystemLogsConfiguration;
-
-/**
- * Generic bundle configuration
- *
- * @author Michael Pasternak
- */
-public interface BundleConfiguration {
-
-    /**
-     * @return {@link org.artifactory.support.config.systemlogs.SystemLogsConfiguration}
-     */
-    SystemLogsConfiguration getSystemLogsConfiguration();
-
-    /**
-     * @return {@link org.artifactory.support.config.system.SystemInfoConfiguration}
-     */
-    SystemInfoConfiguration getSystemInfoConfiguration();
-
-    /**
-     * @return {@link org.artifactory.support.config.security.SecurityInfoConfiguration}
-     */
-    SecurityInfoConfiguration getSecurityInfoConfiguration();
-
-    /**
-     * @return {@link org.artifactory.support.config.descriptor.ConfigDescriptorConfiguration}
-     */
-    ConfigDescriptorConfiguration getConfigDescriptorConfiguration();
-
-    /**
-     * @return {@link org.artifactory.support.config.configfiles.ConfigFilesConfiguration}
-     */
-    ConfigFilesConfiguration getConfigFilesConfiguration();
-
-    /**
-     * @return {@link org.artifactory.support.config.analysis.ThreadDumpConfiguration}
-     */
-    ThreadDumpConfiguration getThreadDumpConfiguration();
-
-    /**
-     * @return {@link org.artifactory.support.config.storage.StorageSummaryConfiguration}
-     */
-    StorageSummaryConfiguration getStorageSummaryConfiguration();
-
-    /**
-     * @return a default size of compressed archives
-     */
-    int getBundleSize();
-
-    /**
-     * Whether system logs should be collected
-     *
-     * @return boolean
-     */
-    boolean isCollectSystemLogs();
-
-    /**
-     * Whether SystemInfo should be collected
-     *
-     * @return boolean
-     */
-    boolean isCollectSystemInfo();
-
-    /**
-     * Whether SecurityConfig should be collected
-     *
-     * @return boolean
-     */
-    boolean isCollectSecurityConfig();
-
-    /**
-     * Whether ConfigDescriptor should be collected
-     *
-     * @return boolean
-     */
-    boolean isCollectConfigDescriptor();
-
-    /**
-     * Whether ConfigurationFiles should be collected
-     *
-     * @return boolean
-     */
-    boolean isCollectConfigurationFiles();
-
-    /**
-     * Whether ThreadDump should be collected
-     *
-     * @return boolean
-     */
-    boolean isCollectThreadDump();
-
-    /**
-     * Whether StorageSummary should be collected
-     *
-     * @return boolean
-     */
-    boolean isCollectStorageSummary();
-}
diff --git a/support/core/src/main/java/org/artifactory/support/config/bundle/BundleConfigurationBuilder.java b/support/core/src/main/java/org/artifactory/support/config/bundle/BundleConfigurationBuilder.java
deleted file mode 100644
index d5398e9..0000000
--- a/support/core/src/main/java/org/artifactory/support/config/bundle/BundleConfigurationBuilder.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.config.bundle;
-
-import org.joda.time.DateTime;
-
-import java.util.Date;
-import java.util.Optional;
-
-/**
- * Constructs {@link BundleConfiguration}
- *
- * @author Michael Pasternak
- */
-public class BundleConfigurationBuilder {
-    private Date startDate=null; // TODO: consider using ZonedDateTime (if needed)
-    private Date endDate=null;   // TODO: consider using ZonedDateTime (if needed)
-    private Integer daysCount=null;
-
-    private boolean collectSystemInfo;
-    private boolean collectSecurityConfig;
-    private boolean collectConfigDescriptor;
-    private boolean collectConfigurationFiles;
-    private boolean collectThreadDump;
-    private int threadDumpCount;
-    private long threadDumpInterval;
-    private boolean collectStorageSummary;
-    private Optional<Boolean> hideUserDetails = Optional.empty();
-
-    private int bundleSize = BundleConfigurationImpl.DEFAULT_BUNDLE_SIZE;
-
-    /**
-     * Default configuration
-     */
-    public BundleConfigurationBuilder() {
-    }
-
-    /**
-     * @param startDate collect logs from
-     * @param endDate collect logs to
-     */
-    public BundleConfigurationBuilder(Date startDate, Date endDate) {
-        this.startDate = startDate;
-        this.endDate = endDate;
-    }
-
-    /**
-     * @param daysCount amount of days eligible for logs collection
-     */
-    public BundleConfigurationBuilder(int daysCount) {
-        this.daysCount = Integer.valueOf(daysCount);
-    }
-
-    /**
-     * Whether SystemInfo should be collected
-     */
-    public BundleConfigurationBuilder collectSystemInfo() {
-        this.collectSystemInfo = true;
-        return this;
-    }
-
-    /**
-     * Whether SecurityConfig should be collected
-     */
-    public BundleConfigurationBuilder collectSecurityConfig() {
-        this.collectSecurityConfig = true;
-        return this;
-    }
-
-    /**
-     * Whether SecurityConfig should be collected
-     *
-     * @param hideUserDetails whether user details should be hidden (default true)
-     */
-    public BundleConfigurationBuilder collectSecurityConfig(boolean hideUserDetails) {
-        this.collectSecurityConfig = true;
-        this.hideUserDetails = Optional.of(hideUserDetails);
-        return this;
-    }
-
-    /**
-     * Whether ConfigDescriptor should be collected
-     */
-    public BundleConfigurationBuilder collectConfigDescriptor() {
-        this.collectConfigDescriptor = true;
-        return this;
-    }
-
-    /**
-     *
-     * Whether ConfigurationFiles should be collected
-     */
-    public BundleConfigurationBuilder collectConfigurationFiles() {
-        this.collectConfigurationFiles = true;
-        return this;
-    }
-
-    /**
-     * Whether ThreadDump should be collected
-     */
-    public BundleConfigurationBuilder collectThreadDump() {
-        this.collectThreadDump = true;
-        return this;
-    }
-
-    /**
-     * Whether ThreadDump should be collected
-     *
-     * @param count amount of dumps to take
-     * @param interval interval between dumps (millis)
-     */
-    public BundleConfigurationBuilder collectThreadDump(int count, long interval) {
-        this.collectThreadDump = true;
-        this.threadDumpCount = count;
-        this.threadDumpInterval = interval;
-        return this;
-    }
-
-    /**
-     * Whether StorageSummary should be collected
-     */
-    public BundleConfigurationBuilder collectStorageSummary() {
-        this.collectStorageSummary = true;
-        return this;
-    }
-
-    /**
-     * A bundle size in Mb
-     *
-     * @param bundleSize
-     */
-    public BundleConfigurationBuilder bundleSize(int bundleSize) {
-        this.bundleSize = bundleSize;
-        return this;
-    }
-
-    /**
-     * Constructs BundleConfiguration
-     *
-     * @return {@link BundleConfigurationImpl}
-     */
-    public BundleConfigurationImpl build() {
-        if (daysCount == null && startDate == null && endDate == null) {
-            endDate = new Date();
-            startDate = new DateTime(endDate).minusDays(1).toDate();
-            return new BundleConfigurationImpl(startDate, endDate, collectSystemInfo,
-                    collectSecurityConfig, hideUserDetails, collectConfigDescriptor,
-                    collectConfigurationFiles, collectThreadDump, threadDumpCount, threadDumpInterval,
-                    collectStorageSummary, Optional.<Integer>of(this.bundleSize)
-            );
-        } else if (daysCount == null) {
-            return new BundleConfigurationImpl(startDate, endDate, collectSystemInfo,
-                    collectSecurityConfig, hideUserDetails, collectConfigDescriptor,
-                    collectConfigurationFiles, collectThreadDump, threadDumpCount, threadDumpInterval,
-                    collectStorageSummary, Optional.<Integer>of(this.bundleSize)
-            );
-        } else {
-            return new BundleConfigurationImpl(daysCount, collectSystemInfo, collectSecurityConfig,
-                    hideUserDetails,  collectConfigDescriptor, collectConfigurationFiles,
-                    collectThreadDump, threadDumpCount, threadDumpInterval, collectStorageSummary,
-                    Optional.<Integer>of(this.bundleSize)
-            );
-        }
-    }
-}
diff --git a/support/core/src/main/java/org/artifactory/support/config/bundle/BundleConfigurationImpl.java b/support/core/src/main/java/org/artifactory/support/config/bundle/BundleConfigurationImpl.java
deleted file mode 100644
index 413f150..0000000
--- a/support/core/src/main/java/org/artifactory/support/config/bundle/BundleConfigurationImpl.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.config.bundle;
-
-import org.artifactory.api.jackson.JacksonWriter;
-import org.artifactory.support.config.configfiles.ConfigFilesConfiguration;
-import org.artifactory.support.config.descriptor.ConfigDescriptorConfiguration;
-import org.artifactory.support.config.analysis.ThreadDumpConfiguration;
-import org.artifactory.support.config.security.SecurityInfoConfiguration;
-import org.artifactory.support.config.storage.StorageSummaryConfiguration;
-import org.artifactory.support.config.system.SystemInfoConfiguration;
-import org.artifactory.support.config.systemlogs.SystemLogsConfiguration;
-
-import java.io.IOException;
-import java.util.Date;
-import java.util.Optional;
-
-/**
- * Generic bundle configuration
- *
- * @author Michael Pasternak
- */
-public class BundleConfigurationImpl implements BundleConfiguration {
-
-    private static final boolean FORCE_COLLECT_SYS_LOGS = true;
-    public static final int DEFAULT_BUNDLE_SIZE = 10; // in Mb
-
-    private SystemLogsConfiguration systemLogsConfiguration;
-    private SystemInfoConfiguration systemInfoConfiguration;
-    private SecurityInfoConfiguration securityInfoConfiguration;
-    private ConfigDescriptorConfiguration configDescriptorConfiguration;
-    private ConfigFilesConfiguration configFilesConfiguration;
-    private StorageSummaryConfiguration storageSummaryConfiguration;
-    private ThreadDumpConfiguration threadDumpConfiguration;
-
-    private int bundleSize = DEFAULT_BUNDLE_SIZE;
-
-    /**
-     * serialization .ctr
-     */
-    public BundleConfigurationImpl() {
-        this.systemLogsConfiguration = new SystemLogsConfiguration();
-        this.systemInfoConfiguration = new SystemInfoConfiguration();
-        this.securityInfoConfiguration =  new SecurityInfoConfiguration();
-        this.configDescriptorConfiguration = new ConfigDescriptorConfiguration();
-        this.configFilesConfiguration = new ConfigFilesConfiguration();
-        this.storageSummaryConfiguration = new StorageSummaryConfiguration();
-        this.threadDumpConfiguration = new ThreadDumpConfiguration();
-    }
-
-    /**
-     * @param startDate collect logs from
-     * @param endDate collect logs to
-     * @param collectSystemInfo
-     * @param collectSecurityConfig
-     * @param hideUserDetails whether user details should be hidden (default true)
-     * @param collectConfigDescriptor
-     * @param collectConfigurationFiles
-     * @param collectThreadDump
-     * @param threadDumpCount amount of dumps to take
-     * @param threadDumpInterval interval between dumps (millis)
-     * @param collectStorageSummary
-     * @param bundleSize
-     */
-    public BundleConfigurationImpl(Date startDate, Date endDate, boolean collectSystemInfo,
-            boolean collectSecurityConfig, Optional<Boolean> hideUserDetails, boolean collectConfigDescriptor,
-            boolean collectConfigurationFiles, boolean collectThreadDump, int threadDumpCount, long threadDumpInterval,
-            boolean collectStorageSummary, Optional<Integer> bundleSize) {
-
-        this.systemLogsConfiguration = new SystemLogsConfiguration(FORCE_COLLECT_SYS_LOGS, startDate, endDate);
-        this.systemInfoConfiguration = new SystemInfoConfiguration(collectSystemInfo);
-        this.securityInfoConfiguration =  new SecurityInfoConfiguration(collectSecurityConfig, hideUserDetails);
-        this.configDescriptorConfiguration = new ConfigDescriptorConfiguration(collectConfigDescriptor, hideUserDetails);
-        this.configFilesConfiguration = new ConfigFilesConfiguration(collectConfigurationFiles);
-        this.storageSummaryConfiguration = new StorageSummaryConfiguration(collectStorageSummary);
-        this.threadDumpConfiguration = new ThreadDumpConfiguration(collectThreadDump, threadDumpCount, threadDumpInterval);
-
-        if(bundleSize.isPresent()) {
-            this.bundleSize = bundleSize.get().intValue();
-        }
-    }
-
-    /**
-     * @param daysCount amount of days eligible for logs collection
-     * @param collectSystemInfo
-     * @param collectSecurityConfig
-     * @param hideUserDetails whether user details should be hidden (default true)
-     * @param collectConfigDescriptor
-     * @param collectConfigurationFiles
-     * @param collectThreadDump
-     * @param threadDumpCount amount of dumps to take
-     * @param threadDumpInterval interval between dumps (millis)
-     * @param collectStorageSummary
-     * @param bundleSize
-     */
-    public BundleConfigurationImpl(Integer daysCount, boolean collectSystemInfo, boolean collectSecurityConfig,
-            Optional<Boolean> hideUserDetails, boolean collectConfigDescriptor, boolean collectConfigurationFiles,
-            boolean collectThreadDump, int threadDumpCount, long threadDumpInterval, boolean collectStorageSummary,
-            Optional<Integer> bundleSize) {
-
-        this.systemLogsConfiguration = new SystemLogsConfiguration(FORCE_COLLECT_SYS_LOGS, daysCount);
-        this.systemInfoConfiguration = new SystemInfoConfiguration(collectSystemInfo);
-        this.securityInfoConfiguration =  new SecurityInfoConfiguration(collectSecurityConfig, hideUserDetails);
-        this.configDescriptorConfiguration = new ConfigDescriptorConfiguration(collectConfigDescriptor, hideUserDetails);
-        this.configFilesConfiguration = new ConfigFilesConfiguration(collectConfigurationFiles);
-        this.storageSummaryConfiguration = new StorageSummaryConfiguration(collectStorageSummary);
-        this.threadDumpConfiguration = new ThreadDumpConfiguration(collectThreadDump, threadDumpCount, threadDumpInterval);
-
-        if(bundleSize.isPresent()) {
-            this.bundleSize = bundleSize.get().intValue();
-        }
-    }
-
-    /**
-     * @return {@link org.artifactory.support.config.systemlogs.SystemLogsConfiguration}
-     */
-    @Override
-    public SystemLogsConfiguration getSystemLogsConfiguration() {
-        return systemLogsConfiguration;
-    }
-
-    /**
-     * @return {@link org.artifactory.support.config.system.SystemInfoConfiguration}
-     */
-    @Override
-    public SystemInfoConfiguration getSystemInfoConfiguration() {
-        return systemInfoConfiguration;
-    }
-
-    /**
-     * @return {@link org.artifactory.support.config.security.SecurityInfoConfiguration}
-     */
-    @Override
-    public SecurityInfoConfiguration getSecurityInfoConfiguration() {
-        return securityInfoConfiguration;
-    }
-
-    /**
-     * @return {@link org.artifactory.support.config.descriptor.ConfigDescriptorConfiguration}
-     */
-    @Override
-    public ConfigDescriptorConfiguration getConfigDescriptorConfiguration() {
-        return configDescriptorConfiguration;
-    }
-
-    /**
-     * @return {@link org.artifactory.support.config.configfiles.ConfigFilesConfiguration}
-     */
-    @Override
-    public ConfigFilesConfiguration getConfigFilesConfiguration() {
-        return configFilesConfiguration;
-    }
-
-    /**
-     * @return {@link org.artifactory.support.config.storage.StorageSummaryConfiguration}
-     */
-    @Override
-    public StorageSummaryConfiguration getStorageSummaryConfiguration() {
-        return storageSummaryConfiguration;
-    }
-
-    /**
-     * @return {@link org.artifactory.support.config.analysis.ThreadDumpConfiguration}
-     */
-    @Override
-    public ThreadDumpConfiguration getThreadDumpConfiguration() {
-        return threadDumpConfiguration;
-    }
-
-    /**
-     * @return a default size of compressed archives
-     */
-    @Override
-    public int getBundleSize() {
-        return bundleSize;
-    }
-
-    @Override
-    public boolean isCollectSystemLogs() {
-        return systemLogsConfiguration.isEnabled();
-    }
-
-    @Override
-    public boolean isCollectSystemInfo() {
-        return systemInfoConfiguration.isEnabled();
-    }
-
-    @Override
-    public boolean isCollectSecurityConfig() {
-        return securityInfoConfiguration.isEnabled();
-    }
-
-    @Override
-    public boolean isCollectConfigDescriptor() {
-        return configDescriptorConfiguration.isEnabled();
-    }
-
-    @Override
-    public boolean isCollectConfigurationFiles() {
-        return configFilesConfiguration.isEnabled();
-    }
-
-    @Override
-    public boolean isCollectThreadDump() {
-        return threadDumpConfiguration.isEnabled();
-    }
-
-    @Override
-    public boolean isCollectStorageSummary() {
-        return storageSummaryConfiguration.isEnabled();
-    }
-
-    @Override
-    public String toString() {
-        try {
-            return JacksonWriter.serialize(this, true);
-        } catch (IOException e) {
-            return ""; // should not happen
-        }
-    }
-}
diff --git a/support/core/src/main/java/org/artifactory/support/config/configfiles/ConfigFilesConfiguration.java b/support/core/src/main/java/org/artifactory/support/config/configfiles/ConfigFilesConfiguration.java
deleted file mode 100644
index e0ddad4..0000000
--- a/support/core/src/main/java/org/artifactory/support/config/configfiles/ConfigFilesConfiguration.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.config.configfiles;
-
-import org.artifactory.support.config.CollectConfiguration;
-
-/**
- * Configuration files collection configuration
- *
- * @author Michael Pasternak
- */
-public class ConfigFilesConfiguration extends CollectConfiguration {
-
-    /**
-     * serialization .ctr
-     */
-    public ConfigFilesConfiguration() {
-    }
-
-    public ConfigFilesConfiguration(boolean enabled) {
-        super(enabled);
-    }
-}
diff --git a/support/core/src/main/java/org/artifactory/support/config/descriptor/ConfigDescriptorConfiguration.java b/support/core/src/main/java/org/artifactory/support/config/descriptor/ConfigDescriptorConfiguration.java
deleted file mode 100644
index b62ad08..0000000
--- a/support/core/src/main/java/org/artifactory/support/config/descriptor/ConfigDescriptorConfiguration.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.config.descriptor;
-
-import org.artifactory.support.config.CollectConfiguration;
-
-import java.util.Optional;
-
-/**
- * ConfigDescriptor collection configuration
- *
- * @author Michael Pasternak
- */
-public class ConfigDescriptorConfiguration extends CollectConfiguration {
-
-    private boolean hideUserDetails = true;
-
-    /**
-     * serialization .ctr
-     */
-    public ConfigDescriptorConfiguration() {
-    }
-
-    public ConfigDescriptorConfiguration(boolean enabled, Optional<Boolean> hideUserDetails) {
-        super(enabled);
-        if (hideUserDetails.isPresent())
-            this.hideUserDetails = hideUserDetails.get();
-    }
-
-    public boolean isHideUserDetails() {
-        return hideUserDetails;
-    }
-}
diff --git a/support/core/src/main/java/org/artifactory/support/config/security/SecurityInfoConfiguration.java b/support/core/src/main/java/org/artifactory/support/config/security/SecurityInfoConfiguration.java
deleted file mode 100644
index 38c1ccd..0000000
--- a/support/core/src/main/java/org/artifactory/support/config/security/SecurityInfoConfiguration.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.config.security;
-
-import org.artifactory.support.config.CollectConfiguration;
-
-import java.util.Optional;
-
-/**
- * SecurityInfo collection configuration
- *
- * @author Michael Pasternak
- */
-public class SecurityInfoConfiguration extends CollectConfiguration {
-
-    private boolean hideUserDetails = true;
-
-    /**
-     * serialization .ctr
-     */
-    public SecurityInfoConfiguration() {
-    }
-
-    public SecurityInfoConfiguration(boolean enabled, Optional<Boolean> hideUserDetails) {
-        super(enabled);
-        if (hideUserDetails.isPresent())
-            this.hideUserDetails = hideUserDetails.get();
-    }
-
-    public boolean isHideUserDetails() {
-        return hideUserDetails;
-    }
-}
diff --git a/support/core/src/main/java/org/artifactory/support/config/storage/StorageSummaryConfiguration.java b/support/core/src/main/java/org/artifactory/support/config/storage/StorageSummaryConfiguration.java
deleted file mode 100644
index e9ad820..0000000
--- a/support/core/src/main/java/org/artifactory/support/config/storage/StorageSummaryConfiguration.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.config.storage;
-
-import org.artifactory.support.config.CollectConfiguration;
-
-/**
- * StorageSummary collection configuration
- *
- * @author Michael Pasternak
- */
-public class StorageSummaryConfiguration extends CollectConfiguration {
-
-    /**
-     * serialization .ctr
-     */
-    public StorageSummaryConfiguration() {
-    }
-
-    public StorageSummaryConfiguration(boolean enabled) {
-        super(enabled);
-    }
-}
diff --git a/support/core/src/main/java/org/artifactory/support/config/system/SystemInfoConfiguration.java b/support/core/src/main/java/org/artifactory/support/config/system/SystemInfoConfiguration.java
deleted file mode 100644
index d8237cd..0000000
--- a/support/core/src/main/java/org/artifactory/support/config/system/SystemInfoConfiguration.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.config.system;
-
-import org.artifactory.support.config.CollectConfiguration;
-import org.artifactory.support.config.Configuration;
-
-/**
- * SystemInfo configuration
- *
- * @author Michael Pasternak
- */
-public class SystemInfoConfiguration extends CollectConfiguration {
-
-    /**
-     * serialization .ctr
-     */
-    public SystemInfoConfiguration() {
-    }
-
-    public SystemInfoConfiguration(boolean enabled) {
-        super(enabled);
-    }
-}
diff --git a/support/core/src/main/java/org/artifactory/support/config/systemlogs/SystemLogsConfiguration.java b/support/core/src/main/java/org/artifactory/support/config/systemlogs/SystemLogsConfiguration.java
deleted file mode 100644
index ea479d0..0000000
--- a/support/core/src/main/java/org/artifactory/support/config/systemlogs/SystemLogsConfiguration.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.config.systemlogs;
-
-import org.artifactory.support.config.CollectConfiguration;
-import org.artifactory.support.core.exceptions.BundleConfigurationException;
-import org.joda.time.DateTime;
-
-import java.util.Date;
-
-/**
- * Provides configuration for system logs collection
- *
- * @author Michael Pasternak
- */
-public class SystemLogsConfiguration extends CollectConfiguration {
-
-    private Date startDate; // TODO: consider using ZonedDateTime (if needed)
-    private Date endDate;   // TODO: consider using ZonedDateTime (if needed)
-    private Integer daysCount;
-
-    /**
-     * we enable all collectors by default (see in #RTFACT-8106),
-     * if no date range is specified, we'll collect logs for last
-     * day only
-     */
-    public SystemLogsConfiguration() {
-        endDate = new Date();
-        startDate = new DateTime(endDate).minusDays(1).toDate();
-    }
-
-    /**
-     * @param enabled whether SystemLogs configuration is enabled
-     * @param startDate collect logs from
-     * @param endDate collect logs to
-     */
-    public SystemLogsConfiguration(boolean enabled, Date startDate, Date endDate) {
-        super(enabled);
-
-        this.startDate = startDate;
-        this.endDate = endDate;
-        this.daysCount = null;
-    }
-
-    /**
-     * @param enabled whether SystemLogs configuration is enabled
-     * @param daysCount amount of days eligible for logs collection
-     */
-    public SystemLogsConfiguration(boolean enabled, Integer daysCount) {
-        super(enabled);
-
-        this.daysCount = daysCount;
-        this.startDate = null;
-        this.endDate = null;
-    }
-
-    /**
-     * @return StartDate
-     */
-    public Date getStartDate() {
-        return startDate;
-    }
-
-    /**
-     * @return EndDate
-     */
-    public Date getEndDate() {
-        return endDate;
-    }
-
-    /**
-     * @return DaysCount
-     */
-    public Integer getDaysCount() {
-        return daysCount;
-    }
-}
diff --git a/support/core/src/main/java/org/artifactory/support/core/annotations/CollectService.java b/support/core/src/main/java/org/artifactory/support/core/annotations/CollectService.java
deleted file mode 100644
index 9228671..0000000
--- a/support/core/src/main/java/org/artifactory/support/core/annotations/CollectService.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.core.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * This annotation used to mark suppliers of
- * {@link org.artifactory.support.core.collectors.ContentCollector}
- *
- * @author Michael Pasternak
- */
- at Retention(RetentionPolicy.RUNTIME)
- at Target(ElementType.METHOD)
-public @interface CollectService {
-    /**
-     * @return Invocation priority
-     */
-    public Priority priority() default Priority.NORMAL;
-
-    /**
-     * Invocation priority
-     */
-    public enum Priority {
-        LOW(1), NORMAL(2), MEDIUM(3), HIGH(4);
-        private final Integer value;
-
-        private Priority(int value) {
-            this.value = Integer.valueOf(value);
-        }
-
-        /**
-         * Compares its two priorities for order.  Returns a negative integer,
-         * zero, or a positive integer as the first argument is less than, equal
-         * to, or greater than the second
-         *
-         * @param p1 {@link Priority}
-         * @param p2 {@link Priority}
-         *
-         * @return -1/0/1
-         */
-        public int compare(Priority p1, Priority p2) {
-            return p1.value.compareTo(p2.value);
-        }
-    }
-}
diff --git a/support/core/src/main/java/org/artifactory/support/core/bundle/AbstractSupportBundleService.java b/support/core/src/main/java/org/artifactory/support/core/bundle/AbstractSupportBundleService.java
deleted file mode 100644
index 71cdafe..0000000
--- a/support/core/src/main/java/org/artifactory/support/core/bundle/AbstractSupportBundleService.java
+++ /dev/null
@@ -1,843 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.core.bundle;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.FilenameUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.addon.ha.semaphore.SemaphoreWrapper;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.support.config.analysis.ThreadDumpConfiguration;
-import org.artifactory.support.config.bundle.BundleConfiguration;
-import org.artifactory.support.config.configfiles.ConfigFilesConfiguration;
-import org.artifactory.support.config.descriptor.ConfigDescriptorConfiguration;
-import org.artifactory.support.config.security.SecurityInfoConfiguration;
-import org.artifactory.support.config.storage.StorageSummaryConfiguration;
-import org.artifactory.support.config.system.SystemInfoConfiguration;
-import org.artifactory.support.config.systemlogs.SystemLogsConfiguration;
-import org.artifactory.support.core.annotations.CollectService;
-import org.artifactory.support.core.compression.CompressionService;
-import org.artifactory.support.core.exceptions.BundleConfigurationException;
-import org.artifactory.support.core.exceptions.TempDirAccessException;
-import org.artifactory.util.StringUtils;
-import org.joda.time.DateTime;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import javax.annotation.PreDestroy;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.nio.file.FileVisitOption;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.RejectedExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-
-/**
- * Provides generic bundle generation capabilities
- *
- * @author Michael Pasternak
- */
-public abstract class AbstractSupportBundleService implements SupportBundleService {
-
-    private static final Logger log = LoggerFactory.getLogger(AbstractSupportBundleService.class);
-    private static final String SUPPORT_BUNDLE_PREFIX = "support-bundle-";
-    private static final String SUPPORT_BUNDLE_TIMESTAMP_PATTERN = "yyyyMMdd-HHmmssS";
-
-    private volatile SemaphoreWrapper executionGuard;
-    private volatile ExecutorService executorService;
-
-    @Autowired
-    private CompressionService compressionService;
-    private static ImmutableList<Method> collectServices = null;
-
-    /**
-     * @return CollectServices
-     */
-    private static ImmutableList<Method> getCollectServices() {
-        if (collectServices == null) {
-            synchronized (AbstractSupportBundleService.class) {
-                if (collectServices == null) {
-                    collectServices = identifyCollectServices();
-                }
-            }
-        }
-        return collectServices;
-    }
-
-    /**
-     * Collects SystemLogs
-     *
-     * @param progressLatch pipe listening for worker progress events
-     * @param tmpDir output directory for produced content
-     * @param configuration the runtime configuration
-     *
-     * @return operation result
-     */
-    @CollectService(priority = CollectService.Priority.LOW)
-    private boolean collectSystemLogs(CountDownLatch progressLatch, File tmpDir, BundleConfiguration configuration) {
-        if(configuration.isCollectSystemLogs()) {
-            try {
-                return doCollectSystemLogs(
-                        tmpDir,
-                        configuration.getSystemLogsConfiguration()
-                );
-            } finally {
-                postProcess(progressLatch);
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Collects SystemInfo
-     *
-     * @param progressLatch pipe listening for worker progress events
-     * @param tmpDir output directory for produced content
-     * @param configuration the runtime configuration
-     *
-     * @return operation result
-     */
-    @CollectService
-    private boolean collectSystemInfo(CountDownLatch progressLatch, File tmpDir, BundleConfiguration configuration) {
-        if(configuration.isCollectSystemInfo()) {
-            try {
-                return doCollectSystemInfo(
-                        tmpDir,
-                        configuration.getSystemInfoConfiguration()
-                );
-            } finally {
-                postProcess(progressLatch);
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Collects SecurityConfig
-     *
-     * @param progressLatch pipe listening for worker progress events
-     * @param tmpDir output directory for produced content
-     * @param configuration the runtime configuration
-     *
-     * @return operation result
-     */
-    @CollectService
-    private boolean collectSecurityConfig(CountDownLatch progressLatch, File tmpDir, BundleConfiguration configuration) {
-        if(configuration.isCollectSecurityConfig()) {
-            try {
-                return doCollectSecurityConfig(
-                        tmpDir,
-                        configuration.getSecurityInfoConfiguration()
-                );
-            } finally {
-                postProcess(progressLatch);
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Collects ConfigDescriptor
-     *
-     * @param progressLatch pipe listening for worker progress events
-     * @param tmpDir output directory for produced content
-     * @param configuration the runtime configuration
-     *
-     * @return operation result
-     */
-    @CollectService
-    private boolean collectConfigDescriptor(CountDownLatch progressLatch, File tmpDir, BundleConfiguration configuration) {
-        if(configuration.isCollectConfigDescriptor()) {
-            try {
-                return doCollectConfigDescriptor(
-                        tmpDir,
-                        configuration.getConfigDescriptorConfiguration()
-                );
-            } finally {
-                postProcess(progressLatch);
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Collects ConfigurationFiles
-     *
-     * @param progressLatch pipe listening for worker progress events
-     * @param tmpDir output directory for produced content
-     * @param configuration the runtime configuration
-     *
-     * @return operation result
-     */
-    @CollectService
-    private boolean collectConfigurationFiles(CountDownLatch progressLatch, File tmpDir, BundleConfiguration configuration) {
-        if(configuration.isCollectConfigurationFiles()) {
-            try {
-                return doCollectConfigurationFiles(
-                        tmpDir,
-                        configuration.getConfigFilesConfiguration()
-                );
-            } finally {
-                postProcess(progressLatch);
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Collects ThreadDump
-     *
-     * @param progressLatch pipe listening for worker progress events
-     * @param tmpDir output directory for produced content
-     * @param configuration the runtime configuration
-     *
-     * @return operation result
-     */
-    @CollectService(priority = CollectService.Priority.HIGH)
-    private boolean collectThreadDump(CountDownLatch progressLatch, File tmpDir, BundleConfiguration configuration) {
-        if(configuration.isCollectThreadDump()) {
-            try {
-                return doCollectThreadDump(
-                        tmpDir,
-                        configuration.getThreadDumpConfiguration()
-                );
-            } finally {
-                postProcess(progressLatch);
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Collects StorageSummary
-     *
-     * @param progressLatch pipe listening for worker progress events
-     * @param tmpDir output directory for produced content
-     * @param configuration the runtime configuration
-     *
-     * @return operation result
-     */
-    @CollectService
-    private boolean collectStorageSummary(CountDownLatch progressLatch, File tmpDir, BundleConfiguration configuration) {
-        if(configuration.isCollectStorageSummary()) {
-            try {
-                return doCollectStorageSummary(
-                        tmpDir,
-                        configuration.getStorageSummaryConfiguration()
-                );
-            } finally {
-                postProcess(progressLatch);
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Invoked post {@link @CollectService}
-     *
-     * @param progress
-     */
-    private void postProcess(CountDownLatch progress) {
-        synchronized (progress) {
-            progress.countDown();
-            if (progress.getCount() > 0) {
-                getLog().debug(
-                        Thread.currentThread().getName() + " has finished, " +
-                                "still left '{}' tasks to break the latch",
-                        progress.getCount()
-                );
-            } else {
-                getLog().debug(
-                        Thread.currentThread().getName() + " has finished, all tasks are done!"
-                );
-            }
-        }
-    }
-
-    /**
-     * Performs post generation cleanup
-     */
-    private void postGenerate() {
-        rollBundles();
-        getExecutionGuard().release();
-    }
-
-    /**
-     * Performs rolling up to {@link ConstantValues#maxBundles} bundles
-     */
-    private void rollBundles() {
-        if (list().size() > ConstantValues.maxBundles.getInt()) {
-            synchronized (this) {
-                List<String> bundles = list();
-                if (bundles.size() > ConstantValues.maxBundles.getInt()) {
-                    try {
-                        do {
-                            // deleting bundle may take time if bundle size is too large,
-                            // thus we delete it asynchronously
-                            delete(bundles.get(bundles.size() - 1), true);
-                            bundles = list();
-                        } while (bundles.size() > ConstantValues.maxBundles.getInt());
-                    } catch (FileNotFoundException e) {
-                        getLog().debug("FileNotFound during rollBundles(): ", e);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Performs content collection of all {@link CollectService} products
-     * and compresses output
-     *
-     * @param configuration the runtime configuration
-     *
-     * @return compressed archives/s
-     */
-    @Override
-    public final List<String> generate(BundleConfiguration configuration) {
-
-        String alreadyRunningMsg = "Another support content collection process already running, " +
-                "please try again in few moments";
-        try {
-            if (!getExecutionGuard().tryAcquire(
-                    ConstantValues.waitForSlotBeforeWithdraw.getInt(), TimeUnit.SECONDS)) {
-                getLog().warn(alreadyRunningMsg);
-            } else {
-                try {
-                    return doGenerate(configuration);
-                } finally {
-                    postGenerate();
-                }
-            }
-        } catch (InterruptedException e) {
-            getLog().debug("Interrupted while waiting for execution: {}", e);
-            getLog().warn(alreadyRunningMsg);
-        }
-        return Lists.newLinkedList();
-    }
-
-    /**
-     * Performs content collection of all {@link CollectService} products
-     * and compresses output
-     *
-     * @param configuration the runtime configuration
-     *
-     * @return compressed archives/s
-     */
-    private List<String> doGenerate(BundleConfiguration configuration) {
-        String executionId = Long.toString(System.currentTimeMillis());
-
-        getLog().info("Initiating support content collection ...");
-
-        getLog().debug("Creating output directory");
-        File outputDirectory = createOutputDirectory(executionId);
-
-        getLog().debug("Initiating content generation");
-        generateContent(outputDirectory, executionId, configuration);
-
-        getLog().debug("Initiating content compression");
-        List<File> compressedContent = compressContent(outputDirectory, executionId, configuration);
-
-        List<String> files = org.artifactory.support.utils.FileUtils.toFileNames(compressedContent);
-        getLog().info("Support request content collection is done!, - " + files);
-
-        return files;
-    }
-
-    /**
-     * Creates output directory
-     *
-     * @param executionId The id of initiating context
-     *
-     * @return reference to output directory
-     */
-    private File createOutputDirectory(String executionId) {
-        File tmpDir = getOutputDirectory();
-        File archiveTmpDir = new File(
-                tmpDir,
-                SUPPORT_BUNDLE_PREFIX + DateTime.now()
-                        .toString(SUPPORT_BUNDLE_TIMESTAMP_PATTERN) + "-" + executionId);
-        try {
-            FileUtils.forceMkdir(archiveTmpDir);
-        } catch (IOException e) {
-            throw new TempDirAccessException(
-                    "Output directory creation has failed - " + e.getMessage(),
-                    e
-            );
-        }
-        return archiveTmpDir;
-    }
-
-    /**
-     * @return support bundle output directory
-     */
-    @Override
-    public File getOutputDirectory() {
-        return ArtifactoryHome.get().getSupportDir();
-    }
-
-    /**
-     * Collects and compresses generated content
-     *
-     * @param archiveTmpDir location of generated content
-     * @param executionId The id of initiating context
-     * @param configuration the runtime configuration
-     *
-     * @return reference to compressed archive
-     */
-    private List<File> compressContent(File archiveTmpDir, String executionId, BundleConfiguration configuration) {
-        getLog().info("Compressing collected content ...");
-        return compressionService.compress(
-                archiveTmpDir,
-                configuration.getBundleSize()
-        );
-    }
-
-    /**
-     * Invokes asynchronously all eligible {@link CollectService}
-     *
-     * @param archiveTmpDir location for generated content
-     * @param progress progress signaling mechanism
-     * @param configuration the runtime configuration
-     */
-    private void invokeContentCollection(File archiveTmpDir, CountDownLatch progress, String executionId, BundleConfiguration configuration) {
-        if (getCollectServices().size() > 0) {
-            for (Method task : getCollectServices()) {
-                getLog().debug("Checking task '{}' for execution", task.getName());
-
-                if(isTaskEnabled(task, configuration)) {
-                    getLog().info("Scheduling task '" + task.getName() + "'");
-                    AbstractSupportBundleService owner = this;
-                    try {
-                        submitAsyncTask(() -> {
-                            try {
-                                task.setAccessible(true);
-                                task.invoke(owner, progress, archiveTmpDir, configuration);
-                            } catch (IllegalAccessException | IllegalArgumentException e) {
-                                getLog().error("Task '" + task.getName() + "' has failed");
-                                getLog().debug("Cause: {}", e);
-                            } catch (InvocationTargetException e) {
-                                getLog().error("Task '" + task.getName() + "' has failed, " + getCause(e));
-                                getLog().debug("Cause: {}", e);
-                            }
-                        });
-                    } catch (RejectedExecutionException e) {
-                        getLog().error("Task '" + task.getName() + "' has failed");
-                        getLog().debug("Cause: {}", e);
-                    }
-                } else {
-                    getLog().debug("Task '{}' is not eligible for execution", task.getName());
-                }
-            }
-        }
-    }
-
-    /**
-     * Fetches Throwable cause
-     *
-     * @param e exception to check
-     * @return actual exception cause
-     */
-    private String getCause(InvocationTargetException e) {
-        return (e.getCause() != null ? e.getCause().getMessage() : e.getMessage());
-    }
-
-    /**
-     * Triggers async content generation and awaits for
-     * all triggered tasks accomplishing
-     *
-     * @param archiveTmpDir location for generated content
-     * @param executionId The id of initiating context
-     * @param configuration the runtime configuration
-     *
-     * @return result
-     */
-    private boolean generateContent(File archiveTmpDir, String executionId, BundleConfiguration configuration) {
-        CountDownLatch progress = createProgressPipe(configuration);
-        getLog().info("Awaiting for tasks collecting content ...");
-        invokeContentCollection(archiveTmpDir, progress, executionId, configuration);
-        try {
-            progress.await(
-                    ConstantValues.contentCollectionAwaitTimeout.getInt(),
-                    TimeUnit.MINUTES
-            );
-            getLog().info("All collecting tasks were accomplished!");
-            return true;
-        } catch (Exception e) {
-            getLog().error("Await for collecting tasks has ended with error, - " +
-                            e.getMessage()
-            );
-            getLog().debug("cause: {}", e);
-        }
-        return false;
-    }
-
-    /**
-     * Produces pipe listening for worker progress events
-     *
-     * @param configuration the runtime configuration
-     *
-     * @return {@link CountDownLatch}
-     */
-    private CountDownLatch createProgressPipe(BundleConfiguration configuration) {
-        return new CountDownLatch(getMembersCount(configuration));
-    }
-
-    /**
-     * Collects all {@link CollectService}
-     *
-     * @return ImmutableList<Method>
-     */
-    private static ImmutableList<Method> identifyCollectServices() {
-        return ImmutableList.copyOf(
-                Arrays.stream(AbstractSupportBundleService.class.getDeclaredMethods())
-                    .parallel()
-                    .filter(m -> m.getAnnotation(CollectService.class) != null)
-                    .sorted(new Comparator<Method>() {
-                        @Override
-                        public int compare(Method m1, Method m2) {
-                            CollectService c1 = m1.getAnnotation(CollectService.class);
-                            CollectService c2 = m2.getAnnotation(CollectService.class);
-                            if (c1 != null && c2 != null)
-                                return c2.priority().compareTo(c1.priority());
-                            return 0;
-                        }
-                    })
-                    .collect(Collectors.toList()
-                )
-        );
-    }
-
-    /**
-     * Check whether given {@link CollectService} is enabled
-     *
-     * @param task task to check
-     * @param configuration the runtime configuration
-     *
-     * @return boolean
-     */
-    private boolean isTaskEnabled(Method task, BundleConfiguration configuration) {
-        try {
-            String isMethodName = "is" + StringUtils.capitalize(task.getName());
-            Method isMethod = configuration.getClass().getDeclaredMethod(isMethodName);
-            if (isMethod != null) {
-                return  (boolean) isMethod.invoke(configuration);
-            } else {
-                // should not happen
-                getLog().debug("Could not find corresponding verification method to '{}'", task.getName());
-            }
-        } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
-            getLog().debug("Cannot verify if task enabled: {}", e);
-        }
-        return false;
-    }
-
-    /**
-     * Calculates amount of collect services eligible for execution
-     *
-     * @param configuration the runtime configuration
-     *
-     * @return amount of {@link CollectService} eligible for execution
-     */
-    private int getMembersCount(BundleConfiguration configuration) {
-        int workersCount=0;
-        for (Method method : getCollectServices()) {
-            boolean enabled = isTaskEnabled(method, configuration);
-            workersCount += (enabled ? 1 : 0);
-        }
-        return workersCount;
-    }
-
-    /**
-     * @return {@link SemaphoreWrapper}
-     */
-    private SemaphoreWrapper getExecutionGuard() {
-        if (executionGuard == null) {
-            synchronized (this) {
-                if (executionGuard == null) {
-                    AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-                    HaCommonAddon haCommonAddon = addonsManager.addonByType(HaCommonAddon.class);
-                    executionGuard = haCommonAddon.getSemaphore(HaCommonAddon.SUPPORT_BUNDLE_SEMAPHORE_NAME);
-                }
-            }
-        }
-        return executionGuard;
-    }
-
-    /**
-     * @return {@link ExecutorService}
-     */
-    private ExecutorService getExecutorService() {
-        if (executorService == null) {
-            synchronized (this) {
-                if (executorService == null) {
-                    executorService = Executors.newFixedThreadPool(
-                            Runtime.getRuntime().availableProcessors()
-                    );
-                }
-            }
-        }
-        return executorService;
-    }
-
-    @PreDestroy
-    private void destroy() {
-        if(!getExecutorService().isShutdown())
-            getExecutorService().shutdown();
-    }
-
-    /**
-     * Lists previously created bundles
-     *
-     * @return archive/s
-     */
-    @Override
-    public final List<String> list() {
-
-        List<String> archives = Lists.newLinkedList();
-
-        try {
-             Files.walk(getOutputDirectory().toPath(), FileVisitOption.FOLLOW_LINKS)
-                    .filter(Files::isRegularFile)
-                    .filter(f -> f.toFile().getName().startsWith(SUPPORT_BUNDLE_PREFIX))
-                    .filter (p -> FilenameUtils.getExtension(p.toString())
-                            .equals(CompressionService.ARCHIVE_EXTENSION))
-                     .sorted(new Comparator<Path>() {
-                         @Override
-                         public int compare(Path o1, Path o2) {
-                             return o2.toString().compareTo(o1.toString());
-                         }
-                     })
-                    .forEach(p -> archives.add(p.toFile().getName()));
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-
-        return archives;
-    }
-
-    /**
-     * Downloads support bundles
-     *
-     * @param bundleName
-     * @return {@link InputStream} to support bundle
-     *         (user responsibility is to close stream upon consumption)
-     *
-     * @throws FileNotFoundException
-     */
-    @Override
-    public final InputStream download(String bundleName) throws FileNotFoundException {
-        assert !Strings.isNullOrEmpty(bundleName) : "bundleName cannot be empty";
-
-        getLog().debug("Downloading support bundle '{}'", bundleName);
-        return new FileInputStream(calculateBundlePath(bundleName));
-        // TODO: check if stream can be closed by server (if not closed by client)
-    }
-
-    /**
-     * Calculates file location on filesystem
-     *
-     * @param bundleName
-     *
-     * @return result
-     */
-    private String calculateBundlePath(String bundleName) {
-        return calculateBundleFolder(bundleName) + File.separator + bundleName;
-    }
-
-    /**
-     * Calculates bundle folder
-     *
-     * @param bundleName
-     *
-     * @return folder containing bundle location on filesystem
-     */
-    private String calculateBundleFolder(String bundleName) {
-        return ArtifactoryHome.get().getSupportDir() + File.separator +
-                StringUtils.replaceLast(bundleName, ("." + CompressionService.ARCHIVE_EXTENSION), "") ;
-    }
-
-    /**
-     * Deletes support bundles
-     *
-     * @param bundleName name of bundle to delete
-     * @param async whether delete should be performed asynchronously
-     *
-     * @return result
-     *
-     * @throws FileNotFoundException
-     */
-    @Override
-    public final boolean delete(String bundleName, boolean async) throws FileNotFoundException {
-        File file = new File(calculateBundlePath(bundleName));
-
-        if (file.exists()) {
-            if (async)
-                return deleteAsync(bundleName, file);
-            return deleteSync(bundleName, file);
-        }
-        throw new FileNotFoundException(bundleName);
-    }
-
-    /**
-     * Deletes bundle asynchronously
-     *
-     * @param bundleName name
-     * @param file bundle
-     *
-     * @return true if scheduling has succeeded, otherwise false
-     */
-    private boolean deleteAsync(String bundleName, File file) {
-        try {
-            submitAsyncTask(() -> deleteSync(bundleName, file));
-            return true;
-        } catch (RejectedExecutionException e) {
-            getLog().warn("Deleting '" + bundleName + "' has failed, see logs for more details");
-            getLog().debug("Cause: {}", e);
-            return false;
-        }
-    }
-
-    /**
-     * Deletes bundle synchronously
-     *
-     * @param bundleName name
-     * @param file bundle
-     * @return success/failure
-     */
-    private boolean deleteSync(String bundleName, File file) {
-        boolean result = true;
-        try {
-            result = file.delete();
-            if (result)
-                getLog().info("'" + bundleName + "' was successfully deleted");
-            else
-                getLog().warn("'" + bundleName + "' was not deleted");
-            File folder = new File(calculateBundleFolder(bundleName));
-            if (folder.isDirectory() && folder.list().length == 0) {
-                FileUtils.deleteDirectory(folder);
-            }
-        } catch (IOException | SecurityException e) {
-            getLog().warn("Deleting '" + bundleName + "' has failed, ", e.getMessage());
-            getLog().debug("Cause: {}", e);
-            result &= false;
-        }
-        return result;
-    }
-
-    /**
-     * Submits async task for execution
-     *
-     * @param task {@link Runnable tp execute}
-     */
-    private void submitAsyncTask(Runnable task) {
-        getExecutorService().submit(task);
-    }
-
-    /**
-     * @return {@link Logger}
-     */
-    protected static Logger getLog() {
-        return log;
-    }
-
-    /**
-     * Collects SystemLogs
-     *
-     * @param tmpDir output directory for produced content
-     * @param configuration the runtime configuration
-     *
-     * @return operation result
-     */
-    protected abstract boolean doCollectSystemLogs(File tmpDir, SystemLogsConfiguration configuration);
-    /**
-     * Collects SystemInfo
-     *
-     * @param tmpDir output directory for produced content
-     * @param configuration the runtime configuration
-     *
-     * @return operation result
-     */
-    protected abstract boolean doCollectSystemInfo(File tmpDir, SystemInfoConfiguration configuration);
-    /**
-     * Collects SecurityConfig
-     *
-     * @param tmpDir output directory for produced content
-     * @param configuration the runtime configuration
-     *
-     * @return operation result
-     */
-    protected abstract boolean doCollectSecurityConfig(File tmpDir, SecurityInfoConfiguration configuration);
-    /**
-     * Collects ConfigDescriptor
-     *
-     * @param tmpDir output directory for produced content
-     * @param configuration the runtime configuration
-     *
-     * @return operation result
-     */
-    protected abstract boolean doCollectConfigDescriptor(File tmpDir, ConfigDescriptorConfiguration configuration);
-    /**
-     * Collects ConfigurationFiles
-     *
-     * @param tmpDir output directory for produced content
-     * @param configuration the runtime configuration
-     *
-     * @return operation result
-     */
-    protected abstract boolean doCollectConfigurationFiles(File tmpDir, ConfigFilesConfiguration configuration);
-    /**
-     * Collects ThreadDump
-     *
-     * @param tmpDir output directory for produced content
-     * @param configuration the runtime configuration
-     *
-     * @return operation result
-     */
-    protected abstract boolean doCollectThreadDump(File tmpDir, ThreadDumpConfiguration configuration);
-    /**
-     * Collects StorageSummary
-     *
-     * @param tmpDir output directory for produced content
-     * @param configuration the runtime configuration
-     *
-     * @return operation result
-     */
-    protected abstract boolean doCollectStorageSummary(File tmpDir, StorageSummaryConfiguration configuration);
-}
diff --git a/support/core/src/main/java/org/artifactory/support/core/bundle/SupportBundleService.java b/support/core/src/main/java/org/artifactory/support/core/bundle/SupportBundleService.java
deleted file mode 100644
index cdd2396..0000000
--- a/support/core/src/main/java/org/artifactory/support/core/bundle/SupportBundleService.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.core.bundle;
-
-import org.artifactory.support.config.bundle.BundleConfiguration;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-import java.util.List;
-
-/**
- * Defines bundle generator behaviour
- *
- * @author Michael Pasternak
- */
-public interface SupportBundleService {
-    /**
-     * Generates support bundle
-     *
-     * @param bundleConfiguration config to be used
-     *
-     * @return compressed archive/s
-     */
-    List<String> generate(BundleConfiguration bundleConfiguration);
-
-    /**
-     * Lists previously created bundles
-     *
-     * @return archive/s
-     */
-    List<String> list();
-
-    /**
-     * Deletes support bundles
-     *
-     * @param bundleName name of bundle to delete
-     * @param async whether delete should be performed asynchronously
-     *
-     * @return result
-     *
-     * @throws FileNotFoundException
-     */
-    boolean delete(String bundleName, boolean async) throws FileNotFoundException;
-
-    /**
-     * Downloads support bundles
-     *
-     * @param bundleName
-     * @return {@link InputStream} to support bundle
-     *         (user responsibility is to close stream upon consumption)
-     *
-     * @throws FileNotFoundException
-     */
-    InputStream download(String bundleName) throws FileNotFoundException;
-
-    /**
-     * @return support bundle output directory
-     */
-    File getOutputDirectory();
-}
diff --git a/support/core/src/main/java/org/artifactory/support/core/bundle/SupportBundleServiceImpl.java b/support/core/src/main/java/org/artifactory/support/core/bundle/SupportBundleServiceImpl.java
deleted file mode 100644
index 895b9a0..0000000
--- a/support/core/src/main/java/org/artifactory/support/core/bundle/SupportBundleServiceImpl.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.core.bundle;
-
-import org.artifactory.support.config.analysis.ThreadDumpConfiguration;
-import org.artifactory.support.config.configfiles.ConfigFilesConfiguration;
-import org.artifactory.support.config.descriptor.ConfigDescriptorConfiguration;
-import org.artifactory.support.config.security.SecurityInfoConfiguration;
-import org.artifactory.support.config.storage.StorageSummaryConfiguration;
-import org.artifactory.support.config.system.SystemInfoConfiguration;
-import org.artifactory.support.config.systemlogs.SystemLogsConfiguration;
-import org.artifactory.support.core.collectors.analysis.ThreadDumpCollector;
-import org.artifactory.support.core.collectors.config.ConfigDescriptorCollector;
-import org.artifactory.support.core.collectors.configfiles.ConfigFilesCollector;
-import org.artifactory.support.core.collectors.logs.LogsCollector;
-import org.artifactory.support.core.collectors.security.SecurityInfoCollector;
-import org.artifactory.support.core.collectors.storage.StorageSummaryCollector;
-import org.artifactory.support.core.collectors.system.SystemInfoCollector;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Service;
-
-import java.io.File;
-
-
-/**
- * @author Michael Pasternak
- */
- at Scope(BeanDefinition.SCOPE_SINGLETON)
- at Service
-public class SupportBundleServiceImpl extends AbstractSupportBundleService {
-
-    @Autowired
-    LogsCollector logsCollector;
-    @Autowired
-    SystemInfoCollector systemInfoCollector;
-    @Autowired
-    SecurityInfoCollector securityInfoCollector;
-    @Autowired
-    ConfigDescriptorCollector configDescriptorCollector;
-    @Autowired
-    ConfigFilesCollector configFilesCollector;
-    @Autowired
-    StorageSummaryCollector storageSummaryCollector;
-    @Autowired
-    ThreadDumpCollector threadDumpCollector;
-
-    /**
-     * Collects SystemLogs
-     *
-     * @param tmpDir output directory for produced content
-     * @param configuration the runtime configuration
-     *
-     * @return operation result
-     */
-    @Override
-    protected boolean doCollectSystemLogs(File tmpDir, SystemLogsConfiguration configuration) {
-        return logsCollector.collect(configuration, tmpDir);
-    }
-
-    /**
-     * Collects SystemInfo
-     *
-     * @param tmpDir output directory for produced content
-     * @param configuration the runtime configuration
-     *
-     * @return operation result
-     */
-    @Override
-    protected boolean doCollectSystemInfo(File tmpDir, SystemInfoConfiguration configuration) {
-        return systemInfoCollector.collect(configuration, tmpDir);
-    }
-
-    /**
-     * Collects SecurityConfig
-     *
-     * @param tmpDir output directory for produced content
-     * @param configuration the runtime configuration
-     *
-     * @return operation result
-     */
-    @Override
-    protected boolean doCollectSecurityConfig(File tmpDir, SecurityInfoConfiguration configuration) {
-        return securityInfoCollector.collect(configuration, tmpDir);
-    }
-
-    /**
-     * Collects ConfigDescriptor
-     *
-     * @param tmpDir output directory for produced content
-     * @param configuration the runtime configuration
-     *
-     * @return operation result
-     */
-    @Override
-    protected boolean doCollectConfigDescriptor(File tmpDir, ConfigDescriptorConfiguration configuration) {
-        return configDescriptorCollector.collect(configuration, tmpDir);
-    }
-
-    /**
-     * Collects ConfigurationFiles
-     *
-     * @param tmpDir output directory for produced content
-     * @param configuration the runtime configuration
-     *
-     * @return operation result
-     */
-    @Override
-    protected boolean doCollectConfigurationFiles(File tmpDir, ConfigFilesConfiguration configuration) {
-        return configFilesCollector.collect(configuration, tmpDir);
-    }
-
-    /**
-     * Collects ThreadDump
-     *
-     * @param tmpDir output directory for produced content
-     * @param configuration the runtime configuration
-     *
-     * @return operation result
-     */
-    @Override
-    protected boolean doCollectThreadDump(File tmpDir, ThreadDumpConfiguration configuration) {
-        return threadDumpCollector.collect(configuration, tmpDir);
-    }
-
-    /**
-     * Collects StorageSummary
-     *
-     * @param tmpDir output directory for produced content
-     * @param configuration the runtime configuration
-     *
-     * @return operation result
-     */
-    @Override
-    protected boolean doCollectStorageSummary(File tmpDir, StorageSummaryConfiguration configuration) {
-        return storageSummaryCollector.collect(configuration, tmpDir);
-    }
-}
diff --git a/support/core/src/main/java/org/artifactory/support/core/collectors/AbstractContentCollector.java b/support/core/src/main/java/org/artifactory/support/core/collectors/AbstractContentCollector.java
deleted file mode 100644
index 001da46..0000000
--- a/support/core/src/main/java/org/artifactory/support/core/collectors/AbstractContentCollector.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.core.collectors;
-
-import org.artifactory.io.FileUtils;
-import org.artifactory.support.config.CollectConfiguration;
-import org.artifactory.support.core.exceptions.BundleConfigurationException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-
-/**
- * Generic ContentCollector
- *
- * @param <T> configuration type declaration
- *
- *
- * @author Michael Pasternak
- */
-public abstract class AbstractContentCollector<T extends CollectConfiguration>
-        implements ContentCollector<T> {
-
-    private static final Logger log = LoggerFactory.getLogger(AbstractContentCollector.class);
-    private final String contentName;
-
-    /**
-     * @param contentName a name for specific sub-folder
-     */
-    protected AbstractContentCollector(String contentName) {
-        this.contentName = contentName;
-    }
-
-    /**
-     * Collects content according to {@link CollectConfiguration}
-     *
-     * @param configuration {@link CollectConfiguration}
-     * @param tmpDir output dir
-     *
-     * @return boolean
-     */
-    @Override
-    public final boolean collect(T configuration, File tmpDir) {
-        try {
-            if (configuration.isEnabled()) {
-                getLog().debug("Ensuring configuration is correct for '{}'", getContentName());
-                doEnsureConfiguration(configuration);
-
-                getLog().info("Starting " + getContentName() + " collection ...");
-                File contentSpecificTmpDir = produceTempDirectory(tmpDir);
-                ensureTempDir(contentSpecificTmpDir);
-                return doCollect(configuration, contentSpecificTmpDir);
-            } else {
-                getLog().debug("Configuration {} is disabled", configuration);
-            }
-        } catch (IllegalStateException ise) {
-            getLog().error("Executing task " + getContentName() + " has failed ("+ ise.getMessage()+")");
-            getLog().debug("Cause: {}", ise);
-        }
-        return false;
-    }
-
-    /**
-     * Calculates temp directory from output directory and content-name
-     *
-     * @param outputDirectory the output directory
-     *
-     * @return temp directory
-     */
-    private File produceTempDirectory(File outputDirectory) {
-        return new File(
-                outputDirectory.getAbsolutePath() + File.separator + getContentName()
-        );
-    }
-
-    /**
-     * Makes sure directory exist
-     *
-     * @param archiveTmpDir
-     */
-    private void ensureTempDir(File archiveTmpDir) {
-        FileUtils.createDirectory(archiveTmpDir);
-    }
-
-    /**
-     * @return sub-folder name
-     */
-    protected String getContentName() {
-        return contentName;
-    }
-
-    /**
-     * Produces content specific output {@link File}
-     *
-     * @param tmpDir output dir
-     * @return output {@link File}
-     */
-    protected File getOutputFile(File tmpDir) {
-        return new File(tmpDir.getPath() + File.separator + getFileName());
-    }
-
-    /**
-     * @return The filename to be used
-     */
-    protected String getFileName() {
-        return getContentName()+".artifactory";
-    }
-
-    /**
-     * @return logger
-     */
-    protected Logger getLog() {
-        return log;
-    }
-
-    /**
-     * Collects content according to {@link CollectConfiguration}
-     *
-     * @param configuration {@link CollectConfiguration}
-     * @param tmpDir output dir
-     *
-     * @return boolean
-     */
-    protected abstract boolean doCollect(T configuration, File tmpDir);
-
-    /**
-     * Makes sure configuration is valid
-     *
-     * @param configuration configuration to check
-     * @throws BundleConfigurationException if configuration is invalid
-     */
-    protected abstract void doEnsureConfiguration(T configuration) throws BundleConfigurationException;
-}
diff --git a/support/core/src/main/java/org/artifactory/support/core/collectors/AbstractGenericContentCollector.java b/support/core/src/main/java/org/artifactory/support/core/collectors/AbstractGenericContentCollector.java
deleted file mode 100644
index 2b478e2..0000000
--- a/support/core/src/main/java/org/artifactory/support/core/collectors/AbstractGenericContentCollector.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.core.collectors;
-
-import com.google.common.base.Charsets;
-import com.google.common.io.Files;
-import org.artifactory.support.config.CollectConfiguration;
-import org.artifactory.support.core.exceptions.ContentCollectionExceptionException;
-import org.artifactory.support.utils.StringBuilderWrapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.IOException;
-
-/**
- * Provides content generic services where all
- * items in the context requires same treatment
- *
- * @author Michael Pasternak
- */
-public abstract class AbstractGenericContentCollector<T extends CollectConfiguration> extends AbstractContentCollector<T> {
-
-    private static final Logger log = LoggerFactory.getLogger(AbstractGenericContentCollector.class);
-
-    /**
-     * @param contentName a name for specific sub-folder
-     */
-    protected AbstractGenericContentCollector(String contentName) {
-        super(contentName);
-    }
-
-    /**
-     * Collects security info
-     *
-     * @param configuration {@link org.artifactory.support.config.CollectConfiguration}
-     * @param tmpDir output dir
-     *
-     * @return result
-     */
-    protected final boolean doCollect(T configuration, File tmpDir) {
-        if (configuration.isEnabled()) {
-            try {
-                StringBuilderWrapper content = doProduceContent(configuration);
-                Files.write(content, getOutputFile(tmpDir), Charsets.UTF_8);
-                getLog().info("Collection of " + getContentName() + " was successfully accomplished");
-                return true;
-            } catch (IOException | InstantiationException |
-                    IllegalAccessException | ContentCollectionExceptionException e) {
-                getLog().error("Collecting " + getContentName() + " has failed, - " + e.getMessage());
-                getLog().debug("Cause: {}", e);
-            }
-        } else {
-            getLog().debug("Content collection of " + getContentName() +" is disabled");
-        }
-        return false;
-    }
-
-    /**
-     * @throws {@link ContentCollectionExceptionException} when no
-     * content is available
-     */
-    protected StringBuilderWrapper failure() {
-        throw new ContentCollectionExceptionException(
-                "No content was collected for " + getContentName()
-        );
-    }
-
-    /**
-     * @throws {@link ContentCollectionExceptionException} when no
-     * content is available
-     */
-    protected StringBuilderWrapper failure(Exception e) {
-        throw new ContentCollectionExceptionException(
-                "No content was collected for " + getContentName() +
-                " - " + e.getMessage()
-        );
-    }
-
-    /**
-     * Produces content and returns it wrapped with {@link StringBuilderWrapper}
-     *
-     * @return {@link StringBuilderWrapper}
-     *
-     * @throws IOException
-     * @throws InstantiationException
-     * @throws IllegalAccessException
-     */
-    abstract protected StringBuilderWrapper doProduceContent(T configuration)
-            throws IOException, InstantiationException, IllegalAccessException;
-}
diff --git a/support/core/src/main/java/org/artifactory/support/core/collectors/AbstractSpecificContentCollector.java b/support/core/src/main/java/org/artifactory/support/core/collectors/AbstractSpecificContentCollector.java
deleted file mode 100644
index a757057..0000000
--- a/support/core/src/main/java/org/artifactory/support/core/collectors/AbstractSpecificContentCollector.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.core.collectors;
-
-import org.artifactory.support.config.CollectConfiguration;
-import org.artifactory.support.core.exceptions.TempDirAccessException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.StandardCopyOption;
-
-/**
- * Provides content specific services where every
- * item in the context requires unique treatment
- *
- * @author Michael Pasternak
- */
-public abstract class AbstractSpecificContentCollector<T extends CollectConfiguration>
-        extends AbstractContentCollector<T> {
-
-    private static final Logger log = LoggerFactory.getLogger(AbstractSpecificContentCollector.class);
-
-    /**
-     * @param contentName a name for specific sub-folder
-     */
-    protected AbstractSpecificContentCollector(String contentName) {
-        super(contentName);
-    }
-
-    @Override
-    public Logger getLog() {
-        return log;
-    }
-
-    /**
-     * Performs copy to destination directory
-     *
-     * @param file source
-     * @param tmpDir target
-     */
-    protected void copyToTempDir(Path file, File tmpDir) {
-        log.debug("Initiating copy of file '{}'", file.getFileName());
-        try {
-            Files.copy(
-                    file,
-                    Paths.get(
-                            tmpDir.getPath() + File.separator + file.getFileName()
-                    ),
-                    StandardCopyOption.COPY_ATTRIBUTES
-            );
-        } catch (IOException e) {
-            throw new TempDirAccessException("Cannot copy file '"+file.getFileName()
-                    +"' to '" + tmpDir.getPath() + "' because " + e.getMessage(), e
-            );
-        }
-    }
-
-    /**
-     * Prints failure cause by exception
-     *
-     * @param e the cause
-     */
-    protected boolean failure(Exception e) {
-        getLog().warn("Collecting content has failed - '" + e.getMessage() + "'");
-        getLog().debug("Cause: {}", e);
-        getLog().info("Collection of " + getContentName() +
-                " was not properly accomplished, see logs for more details");
-        return false;
-    }
-}
diff --git a/support/core/src/main/java/org/artifactory/support/core/collectors/ContentCollector.java b/support/core/src/main/java/org/artifactory/support/core/collectors/ContentCollector.java
deleted file mode 100644
index 2512fe9..0000000
--- a/support/core/src/main/java/org/artifactory/support/core/collectors/ContentCollector.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.core.collectors;
-
-import org.artifactory.support.config.CollectConfiguration;
-
-import java.io.File;
-import java.util.concurrent.CountDownLatch;
-
-/**
- * Provides ContentCollector services
- *
- * @param <T> configuration type declaration
- *
- * @author Michael Pasternak
- */
-public interface ContentCollector<T extends CollectConfiguration> {
-    /**
-     * Collects content according to {@link CollectConfiguration}
-     *
-     * @param configuration instance specific {@link CollectConfiguration}
-     * @param tmpDir output dir
-     *
-     * @return boolean
-     */
-    boolean collect(T configuration, File tmpDir);
-}
diff --git a/support/core/src/main/java/org/artifactory/support/core/collectors/analysis/ThreadDumpCollector.java b/support/core/src/main/java/org/artifactory/support/core/collectors/analysis/ThreadDumpCollector.java
deleted file mode 100644
index a8ad7d9..0000000
--- a/support/core/src/main/java/org/artifactory/support/core/collectors/analysis/ThreadDumpCollector.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.core.collectors.analysis;
-
-import org.artifactory.mbean.ThreadDumper;
-import org.artifactory.support.config.analysis.ThreadDumpConfiguration;
-import org.artifactory.support.core.collectors.AbstractSpecificContentCollector;
-import org.artifactory.support.core.exceptions.BundleConfigurationException;
-import org.artifactory.support.utils.StringBuilderWrapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Service;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Optional;
-
-import com.google.common.io.Files;
-import com.google.common.base.Charsets;
-
-/**
- * ThreadDump collector
- *
- * @author Michael Pasternak
- */
- at Scope(BeanDefinition.SCOPE_SINGLETON)
- at Service
-public class ThreadDumpCollector extends AbstractSpecificContentCollector<ThreadDumpConfiguration> {
-
-    private static final Logger log = LoggerFactory.getLogger(ThreadDumpCollector.class);
-    private static final String FILE_EXTENSION = ".tdump";
-    private final ThreadDumper threadDumper;
-
-    public ThreadDumpCollector() {
-        super("thread-dump");
-        threadDumper = new ThreadDumper();
-    }
-
-    @Override
-    public Logger getLog() {
-        return log;
-    }
-
-    /**
-     * Collects thread dump/s according to {@link org.artifactory.support.config.CollectConfiguration}
-     *
-     * @param configuration {@link org.artifactory.support.config.analysis.ThreadDumpConfiguration}
-     * @param tmpDir output dir
-     *
-     * @return result
-     */
-    @Override
-    protected boolean doCollect(ThreadDumpConfiguration configuration, File tmpDir) {
-        boolean result = true;
-        if (configuration.getCount() > 1) {
-            for(short i=0;i<configuration.getCount();i++) {
-                result &= createDump(tmpDir, Optional.of(i));
-                result &= sleep(configuration.getInterval());
-            }
-        } else {
-            result = createDump(tmpDir, Optional.empty());
-        }
-
-        if (result)
-            getLog().info("Collection of " + getContentName() + " was successfully accomplished");
-        else
-            getLog().info("Collection of " + getContentName() + " has not accomplished successfully");
-
-        return result;
-    }
-
-    /**
-     * Executes interval between collected dumps
-     *
-     * @param interval amount of time to sleep (millis)
-     *
-     * @return result
-     */
-    private boolean sleep(long interval) {
-        try {
-            getLog().debug("Sleeping for {} millis", interval);
-            Thread.sleep(interval);
-        } catch (InterruptedException e) {
-            getLog().error("Error while executing interval on thread dump collection");
-            getLog().debug("Cause: {}", e);
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * Produces thread dump and saves it to the corresponding file
-     *
-     * @param id an ordered id of the collected dump
-     *
-     * @return {@link StringBuilderWrapper}
-     */
-    private boolean createDump(File tmpDir, Optional<Short> id) {
-        try {
-            getLog().debug("Producing thread dump {}", id.isPresent() ? id.get() : 1);
-            StringBuilderWrapper td = new StringBuilderWrapper(threadDumper.dumpThreads());
-            Files.write(td, getOutputFile(tmpDir, id), Charsets.UTF_8);
-        } catch (IOException e) {
-            getLog().error("Creating thread dump has failed: " + e.getMessage());
-            getLog().debug("Cause: {}", e);
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * @return The filename to be used
-     */
-    @Override
-    protected String getFileName() {
-        return getContentName() + ".tdump";
-    }
-
-    /**
-     * @param id the ordered id of artifact
-     *
-     * @return The filename to be used
-     */
-    protected String getFileName(Optional<Short> id) {
-        return !id.isPresent() ? getFileName() : getContextFileName(id);
-    }
-
-    /**
-     * @param id the ordered id of artifact
-     *
-     * @return file name
-     */
-    protected String getContextFileName(Optional<Short> id) {
-        return !id.isPresent() ?
-                getFileName()
-                :
-                super.getContentName() + "-" + Integer.toString(id.get() + 1) +
-                        FILE_EXTENSION;
-    }
-
-    /**
-     * Produces content specific output {@link File}
-     *
-     * @param tmpDir output dir
-     * @param id the ordered id of artifact
-     *
-     * @return output {@link File}
-     */
-    protected File getOutputFile(File tmpDir, Optional<Short> id) {
-        return new File(tmpDir.getPath() + File.separator + getFileName(id));
-    }
-
-    /**
-     * Makes sure configuration is valid
-     *
-     * @param configuration configuration to check
-     * @throws BundleConfigurationException if configuration is invalid
-     */
-    @Override
-    protected void doEnsureConfiguration(ThreadDumpConfiguration configuration)
-            throws BundleConfigurationException {
-        ensureThreadDumpConfig(
-                configuration.getCount(), configuration.getInterval()
-        );
-    }
-
-    /**
-     * Makes sure ThreadDumpConfig is valid
-     *
-     * @param count dumps count
-     * @param interval interval between dumps (millis)
-     *
-     * @throws BundleConfigurationException thrown when illegal configuration is found
-     */
-    private void ensureThreadDumpConfig(int count, long interval)
-            throws BundleConfigurationException {
-        if (count < 0)
-            throw new BundleConfigurationException(
-                    "ThreadDump configuration is illegal, " +
-                            "amount of dumps (count) cannot be negative number"
-            );
-        if (interval < 0)
-            throw new BundleConfigurationException(
-                    "ThreadDump configuration is illegal, " +
-                            "dumps interval cannot be negative number"
-            );
-    }
-}
diff --git a/support/core/src/main/java/org/artifactory/support/core/collectors/config/ConfigDescriptorCollector.java b/support/core/src/main/java/org/artifactory/support/core/collectors/config/ConfigDescriptorCollector.java
deleted file mode 100644
index ef264be..0000000
--- a/support/core/src/main/java/org/artifactory/support/core/collectors/config/ConfigDescriptorCollector.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.core.collectors.config;
-
-import com.google.common.base.Strings;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.support.config.analysis.ThreadDumpConfiguration;
-import org.artifactory.support.config.descriptor.ConfigDescriptorConfiguration;
-import org.artifactory.support.core.collectors.AbstractGenericContentCollector;
-import org.artifactory.support.core.exceptions.BundleConfigurationException;
-import org.artifactory.support.utils.StringBuilderWrapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Service;
-
-import java.io.IOException;
-
-/**
- * Config descriptor collector
- *
- * @author Michael Pasternak
- */
- at Scope(BeanDefinition.SCOPE_SINGLETON)
- at Service
-public class ConfigDescriptorCollector extends AbstractGenericContentCollector<ConfigDescriptorConfiguration> {
-    private static final Logger log = LoggerFactory.getLogger(ConfigDescriptorCollector.class);
-    private static final String PASSWORD = "\\s*+<password>\\w+</password>";
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    public ConfigDescriptorCollector() {
-        super("config-descriptor");
-    }
-
-    /**
-     * Produces content and returns it wrapped with {@link StringBuilderWrapper}
-     *
-     * @param configuration the runtime configuration
-     *
-     * @return {@link StringBuilderWrapper}
-     *
-     * @throws IOException
-     * @throws InstantiationException
-     * @throws IllegalAccessException
-     */
-    @Override
-    protected StringBuilderWrapper doProduceContent(ConfigDescriptorConfiguration configuration) throws InstantiationException,
-            IllegalAccessException, IOException {
-        String centralConfigDescriptor = getDescriptorData(configuration);
-
-        if (!Strings.isNullOrEmpty(centralConfigDescriptor)) {
-            return new StringBuilderWrapper(centralConfigDescriptor);
-        }
-        return failure();
-    }
-
-    /**
-     * Performs filtering on returned data
-     *
-     * @param configuration {@link ConfigDescriptorConfiguration}
-     *
-     * @return {@link CentralConfigDescriptor}
-     */
-    private String getDescriptorData(ConfigDescriptorConfiguration configuration) {
-        String configDescriptor = centralConfigService.getConfigXml();
-
-        if (!configuration.isHideUserDetails())
-            return configDescriptor;
-        return configDescriptor.replaceAll(PASSWORD, "");
-    }
-
-    @Override
-    public Logger getLog() {
-        return log;
-    }
-
-    /**
-     * Makes sure configuration is valid
-     *
-     * @param configuration configuration to check
-     * @throws org.artifactory.support.core.exceptions.BundleConfigurationException
-     *         if configuration is invalid
-     */
-    @Override
-    protected void doEnsureConfiguration(ConfigDescriptorConfiguration configuration)
-            throws BundleConfigurationException {
-        ;
-    }
-}
diff --git a/support/core/src/main/java/org/artifactory/support/core/collectors/configfiles/ConfigFilesCollector.java b/support/core/src/main/java/org/artifactory/support/core/collectors/configfiles/ConfigFilesCollector.java
deleted file mode 100644
index 75a1cbc..0000000
--- a/support/core/src/main/java/org/artifactory/support/core/collectors/configfiles/ConfigFilesCollector.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.core.collectors.configfiles;
-
-import com.google.common.collect.Lists;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.support.config.configfiles.ConfigFilesConfiguration;
-import org.artifactory.support.config.descriptor.ConfigDescriptorConfiguration;
-import org.artifactory.support.core.collectors.AbstractSpecificContentCollector;
-import org.artifactory.support.core.exceptions.BundleConfigurationException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Service;
-
-import java.io.File;
-import java.nio.file.Files;
-import java.util.List;
-
-/**
- * Config files collector
- *
- * @author Michael Pasternak
- */
- at Scope(BeanDefinition.SCOPE_SINGLETON)
- at Service
-public class ConfigFilesCollector extends AbstractSpecificContentCollector<ConfigFilesConfiguration> {
-
-    private static final Logger log = LoggerFactory.getLogger(ConfigFilesCollector.class);
-    private final List<File> configFiles = getConfigFiles();
-
-    public ConfigFilesCollector() {
-        super("config-files");
-    }
-
-    /**
-     * Collects SystemLogs
-     *
-     * @param configuration {@link org.artifactory.support.config.systemlogs.SystemLogsConfiguration}
-     * @param tmpDir output directory for produced content
-     *
-     * @return operation result
-     */
-    @Override
-    protected boolean doCollect(ConfigFilesConfiguration configuration, File tmpDir) {
-        if (configFiles != null && configFiles.size() > 0) {
-            try {
-                configFiles.parallelStream()
-                        .filter(f -> Files.exists(f.toPath()))
-                        .filter(f -> Files.isRegularFile(f.toPath()))
-                        .forEach(f -> this.copyToTempDir(f.toPath(), tmpDir));
-                getLog().info("Collection of " + getContentName() + " was successfully accomplished");
-                return true;
-            } catch (Exception e) {
-                return failure(e);
-            }
-        } else {
-            getLog().debug("No items to work on");
-            return false;
-        }
-    }
-
-    /**
-     * @return config files
-     */
-    private static List<File> getConfigFiles() {
-        List<File> configFiles = Lists.newArrayList();
-
-        configFiles.add(ArtifactoryHome.get().getArtifactoryConfigBootstrapFile());
-        configFiles.add(ArtifactoryHome.get().getArtifactoryConfigFile());
-        configFiles.add(ArtifactoryHome.get().getArtifactoryConfigImportFile());
-        configFiles.add(ArtifactoryHome.get().getArtifactoryConfigLatestFile());
-        configFiles.add(ArtifactoryHome.get().getArtifactoryConfigNewBootstrapFile());
-        configFiles.add(ArtifactoryHome.get().getLogbackConfig());
-        configFiles.add(ArtifactoryHome.get().getMissionControlPropertiesFile());
-        configFiles.add(ArtifactoryHome.get().getStoragePropertiesFile());
-        configFiles.add(ArtifactoryHome.get().getMimeTypesFile());
-
-        return configFiles;
-    }
-
-    @Override
-    public Logger getLog() {
-        return log;
-    }
-
-    /**
-     * Makes sure configuration is valid
-     *
-     * @param configuration configuration to check
-     * @throws org.artifactory.support.core.exceptions.BundleConfigurationException
-     *         if configuration is invalid
-     */
-    @Override
-    protected void doEnsureConfiguration(ConfigFilesConfiguration configuration)
-            throws BundleConfigurationException {
-        ;
-    }
-}
diff --git a/support/core/src/main/java/org/artifactory/support/core/collectors/logs/LogsCollector.java b/support/core/src/main/java/org/artifactory/support/core/collectors/logs/LogsCollector.java
deleted file mode 100644
index bcaae71..0000000
--- a/support/core/src/main/java/org/artifactory/support/core/collectors/logs/LogsCollector.java
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.core.collectors.logs;
-
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.support.config.descriptor.ConfigDescriptorConfiguration;
-import org.artifactory.support.core.collectors.AbstractSpecificContentCollector;
-import org.artifactory.support.core.exceptions.BundleConfigurationException;
-import org.artifactory.support.utils.DatePatternsHolder;
-import org.artifactory.support.config.systemlogs.SystemLogsConfiguration;
-import org.artifactory.support.core.exceptions.IllegalConditionException;
-import org.artifactory.support.core.exceptions.TempDirAccessException;
-import org.joda.time.DateTime;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Service;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.FileVisitOption;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.nio.file.attribute.FileTime;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.regex.Matcher;
-
-/**
- * System logs collector
- *
- * @author Michael Pasternak
- */
- at Scope(BeanDefinition.SCOPE_SINGLETON)
- at Service
-public class LogsCollector extends AbstractSpecificContentCollector<SystemLogsConfiguration> {
-
-    private static final Logger log = LoggerFactory.getLogger(LogsCollector.class);
-
-    public LogsCollector() {
-        super("system-logs");
-    }
-
-    /**
-     * Collects SystemLogs
-     *
-     * @param configuration {@link SystemLogsConfiguration}
-     * @param tmpDir output directory for produced content
-     *
-     * @return operation result
-     */
-    @Override
-    protected boolean doCollect(SystemLogsConfiguration configuration, File tmpDir) {
-        try {
-            Files.walk(getLogsDirectory().toPath(), FileVisitOption.FOLLOW_LINKS)
-                    .filter (Files::isRegularFile)
-                    .filter (f -> isCollectible(f, configuration))
-                    .forEach(f -> copyToTempDir(f, tmpDir));
-            getLog().info("Collection of " + getContentName() + " was successfully accomplished");
-            return true;
-        } catch (IOException | TempDirAccessException e) {
-            return failure(e);
-        }
-    }
-
-    /**
-     * Checks whether given file is eligible for collections
-     *
-     * @param filePath
-     * @param configuration {@link SystemLogsConfiguration}
-     *
-     * @return boolean
-     */
-    private boolean isCollectible(Path filePath, SystemLogsConfiguration configuration) {
-        getLog().debug("Initiating collect eligibility check for file '{}'", filePath.getFileName());
-
-        String fileName = filePath.getFileName().toString();
-
-        Matcher matcher1 = DatePatternsHolder.getMatcher1(fileName);
-        Matcher matcher2 = DatePatternsHolder.getMatcher2(fileName);
-        Matcher matcher3 = DatePatternsHolder.getMatcher3(fileName);
-        Matcher matcher4 = DatePatternsHolder.getMatcher4(fileName);
-        Matcher matcherDateZip = DatePatternsHolder.getDateZipPattern(fileName);
-
-
-        if (matcher1.find()) {
-            getLog().debug("File '{}' matches pattern 1", filePath.getFileName());
-            String date = matcher1.group(0);
-            return isDateInRequestedRange(date, configuration,
-                    DatePatternsHolder.DatePattern.PATTERN_1);
-        } else if (matcher2.find()) {
-            getLog().debug("File '{}' matches pattern 2", filePath.getFileName());
-            String date = matcher2.group(0);
-            return isDateInRequestedRange(date, configuration,
-                    DatePatternsHolder.DatePattern.PATTERN_2);
-        } else if (matcher3.find()) {
-            getLog().debug("File '{}' matches pattern 3", filePath.getFileName());
-            String date = matcher3.group(0);
-            return isDateInRequestedRange(date, configuration,
-                    DatePatternsHolder.DatePattern.PATTERN_3);
-        } else if (matcher4.find()) {
-            getLog().debug("File '{}' matches pattern 4", filePath.getFileName());
-            String date = matcher4.group(0);
-            return isDateInRequestedRange(date, configuration,
-                    DatePatternsHolder.DatePattern.PATTERN_4);
-        } else if(matcherDateZip.find()) {
-            getLog().debug("File '{}' matches pattern log.zip", filePath.getFileName());
-            return isDateInRequestedZipRange(filePath, configuration, DatePatternsHolder.DatePattern.PATTERN_ZIP_LOG);
-        }
-
-        getLog().debug("File '{}' doesn't match any known date pattern, " +
-                "using default fallback (true)", fileName);
-        return true;
-    }
-
-    /**
-     * Checks zipped artifactory.log based on 'created' attribute
-     * to avoid attaching heavy legacy zipped logs
-     *
-     * @param filePath
-     * @param configuration
-     *
-     * @return should be collected or not
-     */
-    private boolean isDateInRequestedZipRange(Path filePath, SystemLogsConfiguration configuration,
-            DatePatternsHolder.DatePattern datePattern) {
-
-        Date start, end;
-
-        if(configuration.getDaysCount() != null) {
-            int dayCount = configuration.getDaysCount().intValue();
-            end = new Date();
-            start = new DateTime(end).minusDays(dayCount).toDate();
-        } else {
-            start = configuration.getStartDate();
-            end = configuration.getEndDate();
-        }
-
-        try {
-            BasicFileAttributes attr = Files.readAttributes(filePath, BasicFileAttributes.class);
-            if (attr != null) {
-                FileTime time = attr.creationTime();
-                if (time != null) {
-                    if(time.compareTo(FileTime.fromMillis(start.getTime())) >= 0 &&
-                            time.compareTo(FileTime.fromMillis(end.getTime())) <= 0) {
-                        return true;
-                    }
-                    return false;
-                } else {
-                    getLog().debug("Created attribute for '{}' was not located", filePath);
-                }
-            } else {
-                getLog().debug("No attributes for '{}' were located", filePath);
-            }
-        } catch (IOException e) {
-            getLog().warn("Reading '{}' attributes has failed: {}", filePath, e.getMessage());
-            getLog().debug("Cause: {}", e);
-        }
-        return true;
-    }
-
-    /**
-     * Checks whether log file date falls into {@link SystemLogsConfiguration}
-     *
-     * @param date log file date
-     * @param configuration {@link SystemLogsConfiguration}
-     * @param datePattern {@link DatePatternsHolder.DatePattern} to work with
-     *
-     * @return boolean
-     */
-    private boolean isDateInRequestedRange(String date,
-            SystemLogsConfiguration configuration, DatePatternsHolder.DatePattern datePattern) {
-        getLog().debug("Initiating range check for date '{}'", date);
-
-        Date logFileDate = null;
-
-        for(String patternTemplate : datePattern.getPatternTemplates() ) {
-            DateFormat df = new SimpleDateFormat(patternTemplate);
-            try {
-                logFileDate = df.parse(date);
-                getLog().debug("Date '{}' matches template '{}'", date, patternTemplate);
-                break;
-            } catch (ParseException e) {
-                getLog().debug("Cannot parse date '{}' with template '{}'", date, patternTemplate);
-            }
-        }
-
-        if (logFileDate == null) {
-            getLog().debug(
-                    "Could not parse date '{}' using any known template for pattern '{}', " +
-                            "assuming positive answer",
-                    date, datePattern.getPattern()
-            );
-            return true;
-        }
-
-        if (configuration.getDaysCount() != null) { // days offset
-            DateTime dateTime = new DateTime(logFileDate);
-            if(DateTime.now().minusDays(configuration.getDaysCount()
-                    .intValue()).compareTo(dateTime) <= 0)
-                return true;
-            return false;
-        } else if (configuration.getStartDate() != null) { // date range
-            Date endDate = configuration.getEndDate() != null ?
-                    configuration.getEndDate() : new Date();
-            if(configuration.getStartDate().compareTo(logFileDate) <= 0 &&
-                    endDate.compareTo(logFileDate) >=0) {
-                return true;
-            }
-            return false;
-        } else {
-            throw new IllegalConditionException(
-                    "Either days offset or StartDate must be specified"
-            );
-        }
-    }
-
-    /**
-     * @return artifactory logs folder location
-     */
-    private File getLogsDirectory() {
-        return ArtifactoryHome.get().getLogDir();
-    }
-
-    @Override
-    public Logger getLog() {
-        return log;
-    }
-
-    /**
-     * Makes sure configuration is valid
-     *
-     * @param configuration configuration to check
-     * @throws org.artifactory.support.core.exceptions.BundleConfigurationException
-     *         if configuration is invalid
-     */
-    @Override
-    protected void doEnsureConfiguration(SystemLogsConfiguration configuration)
-            throws BundleConfigurationException {
-        if (configuration.getDaysCount() != null) {
-            ensureDateRange(
-                    configuration.getDaysCount()
-            );
-        } else if (configuration.getStartDate() != null &&
-            configuration.getEndDate() != null) {
-                ensureDateRange(
-                configuration.getStartDate(),
-                configuration.getEndDate()
-            );
-        } else {
-            throw new BundleConfigurationException(
-                    "SystemLogsConfiguration is incomplete, either DaysCount or StartDate+EndDate must be specified"
-            );
-        }
-    }
-
-    /**
-     * Makes sure date range is legal
-     *
-     * @param startDate
-     * @param endDate
-     *
-     * @throws BundleConfigurationException thrown when illegal configuration is found
-     */
-    private void ensureDateRange(Date startDate, Date endDate)
-            throws BundleConfigurationException {
-        if(startDate == null || endDate == null)
-            throw new BundleConfigurationException(
-                    "Date range is illegal, " +
-                            "startDate/endDate cannot be empty"
-            );
-
-        if(startDate.getTime() > endDate.getTime())
-            throw new BundleConfigurationException(
-                    "Date range is illegal, " +
-                            "startDate cannot be greater than endDate"
-            );
-    }
-
-    /**
-     * Makes sure date range is legal
-     *
-     * @param daysCount
-     *
-     * @throws BundleConfigurationException thrown when illegal configuration is found
-     */
-    private void ensureDateRange(Integer daysCount)
-            throws BundleConfigurationException {
-        if (daysCount == null)
-            throw new BundleConfigurationException(
-                    "Date range is illegal, " +
-                            "daysCount cannot be empty"
-            );
-
-        if (daysCount.intValue() <= 0)
-            throw new BundleConfigurationException(
-                    "Date range is illegal, " +
-                            "daysCount cannot be negative number or zero"
-            );
-    }
-
-}
diff --git a/support/core/src/main/java/org/artifactory/support/core/collectors/security/SecurityInfoCollector.java b/support/core/src/main/java/org/artifactory/support/core/collectors/security/SecurityInfoCollector.java
deleted file mode 100644
index d26c833..0000000
--- a/support/core/src/main/java/org/artifactory/support/core/collectors/security/SecurityInfoCollector.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.core.collectors.security;
-
-import com.google.common.base.Strings;
-import org.artifactory.api.jackson.JacksonWriter;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.security.SecurityInfo;
-import org.artifactory.support.config.descriptor.ConfigDescriptorConfiguration;
-import org.artifactory.support.config.security.SecurityInfoConfiguration;
-import org.artifactory.support.config.system.SystemInfoConfiguration;
-import org.artifactory.support.core.collectors.AbstractGenericContentCollector;
-import org.artifactory.support.core.exceptions.BundleConfigurationException;
-import org.artifactory.support.utils.StringBuilderWrapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Service;
-
-import java.io.IOException;
-
-/**
- * Security info collector
- *
- * @author Michael Pasternak
- */
- at Scope(BeanDefinition.SCOPE_SINGLETON)
- at Service
-public class SecurityInfoCollector extends AbstractGenericContentCollector<SecurityInfoConfiguration> {
-    private static final Logger log = LoggerFactory.getLogger(SecurityInfoCollector.class);
-
-    @Autowired
-    private SecurityService securityService;
-
-    public SecurityInfoCollector() {
-        super("security-info");
-    }
-
-    @Override
-    public Logger getLog() {
-        return log;
-    }
-
-    /**
-     * Produces content and returns it wrapped with {@link StringBuilderWrapper}
-     *
-     * @param configuration the runtime configuration
-     *
-     * @return {@link StringBuilderWrapper}
-     *
-     * @throws IOException
-     */
-    @Override
-    protected StringBuilderWrapper doProduceContent(SecurityInfoConfiguration configuration) throws IOException {
-        SecurityInfo securityInfo = getSecurityData(configuration);
-        if (securityInfo != null) {
-            String serialized = JacksonWriter.serialize(securityInfo, true);
-            if(!Strings.isNullOrEmpty(serialized))
-                return new StringBuilderWrapper(serialized);
-            else
-                getLog().debug("No content was fetched from SecurityDescriptor");
-        }
-        return failure();
-    }
-
-    /**
-     * Converts server entity to collectible support
-     * entity according to configuration
-     *
-     * @param configuration
-     * @return
-     */
-    private SecurityInfo getSecurityData(SecurityInfoConfiguration configuration) {
-        SecurityInfo securityData = securityService.getSecurityData();
-        if (!configuration.isHideUserDetails()) {
-            return securityData;
-        }
-
-        SecurityInfo descriptor = InfoFactoryHolder.get().createSecurityInfo(
-                null,
-                securityData.getGroups(),
-                securityData.getAcls()
-        );
-        descriptor.setVersion(securityData.getVersion());
-        return descriptor;
-    }
-    /**
-     * Makes sure configuration is valid
-     *
-     * @param configuration configuration to check
-     * @throws org.artifactory.support.core.exceptions.BundleConfigurationException
-     *         if configuration is invalid
-     */
-    @Override
-    protected void doEnsureConfiguration(SecurityInfoConfiguration configuration)
-            throws BundleConfigurationException {
-        ;
-    }
-}
diff --git a/support/core/src/main/java/org/artifactory/support/core/collectors/storage/StorageSummaryCollector.java b/support/core/src/main/java/org/artifactory/support/core/collectors/storage/StorageSummaryCollector.java
deleted file mode 100644
index dc2a6ac..0000000
--- a/support/core/src/main/java/org/artifactory/support/core/collectors/storage/StorageSummaryCollector.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.core.collectors.storage;
-
-import com.google.common.base.Strings;
-import org.artifactory.api.jackson.JacksonWriter;
-import org.artifactory.storage.StorageService;
-import org.artifactory.storage.StorageSummaryImpl;
-import org.artifactory.storage.StorageSummaryInfo;
-import org.artifactory.support.config.descriptor.ConfigDescriptorConfiguration;
-import org.artifactory.support.config.storage.StorageSummaryConfiguration;
-import org.artifactory.support.core.collectors.AbstractGenericContentCollector;
-import org.artifactory.support.core.exceptions.BundleConfigurationException;
-import org.artifactory.support.utils.StringBuilderWrapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Service;
-
-import java.io.IOException;
-
-/**
- * Storage summary collector
- *
- * @author Michael Pasternak
- */
- at Scope(BeanDefinition.SCOPE_SINGLETON)
- at Service
-public class StorageSummaryCollector extends AbstractGenericContentCollector<StorageSummaryConfiguration> {
-    private static final Logger log = LoggerFactory.getLogger(StorageSummaryCollector.class);
-
-    @Autowired
-    private StorageService storageService;
-
-    public StorageSummaryCollector() {
-        super("storage-summary");
-    }
-
-    @Override
-    public Logger getLog() {
-        return log;
-    }
-
-    /**
-     * Produces content and returns it wrapped with
-     * {@link org.artifactory.support.utils.StringBuilderWrapper}
-     *
-     * @param configuration the runtime configuration
-     *
-     * @return {@link org.artifactory.support.utils.StringBuilderWrapper}
-     *
-     * @throws java.io.IOException
-     */
-    @Override
-    protected StringBuilderWrapper doProduceContent(StorageSummaryConfiguration configuration)
-            throws IOException {
-        StorageSummaryInfo storageSummaryInfo = storageService.getStorageSummaryInfo();
-        StorageSummaryImpl storageSummary = new StorageSummaryImpl(storageSummaryInfo);
-
-        if (storageSummary != null) {
-            String serialized = JacksonWriter.serialize(storageSummary, true);
-            if(!Strings.isNullOrEmpty(serialized))
-                return new StringBuilderWrapper(serialized);
-            else
-                getLog().debug("No content was fetched from StorageService");
-        }
-        return failure();
-    }
-
-    /**
-     * Makes sure configuration is valid
-     *
-     * @param configuration configuration to check
-     * @throws org.artifactory.support.core.exceptions.BundleConfigurationException
-     *         if configuration is invalid
-     */
-    @Override
-    protected void doEnsureConfiguration(StorageSummaryConfiguration configuration)
-            throws BundleConfigurationException {
-        ;
-    }
-}
diff --git a/support/core/src/main/java/org/artifactory/support/core/collectors/system/SystemInfoCollector.java b/support/core/src/main/java/org/artifactory/support/core/collectors/system/SystemInfoCollector.java
deleted file mode 100644
index 64b07fa..0000000
--- a/support/core/src/main/java/org/artifactory/support/core/collectors/system/SystemInfoCollector.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.core.collectors.system;
-
-import com.google.common.base.Strings;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.plugin.PluginsAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.info.InfoWriter;
-import org.artifactory.support.config.descriptor.ConfigDescriptorConfiguration;
-import org.artifactory.support.config.system.SystemInfoConfiguration;
-import org.artifactory.support.core.collectors.AbstractGenericContentCollector;
-import org.artifactory.support.core.exceptions.BundleConfigurationException;
-import org.artifactory.support.utils.StringBuilderWrapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Service;
-
-import java.io.IOException;
-
-/**
- * System info collector
- *
- * @author Michael Pasternak
- */
- at Scope(BeanDefinition.SCOPE_SINGLETON)
- at Service
-public class SystemInfoCollector extends AbstractGenericContentCollector<SystemInfoConfiguration> {
-    private static final Logger log = LoggerFactory.getLogger(SystemInfoCollector.class);
-
-    public SystemInfoCollector() {
-        super("system-info");
-    }
-
-    /**
-     * Produces content and returns it wrapped with {@link StringBuilderWrapper}
-     *
-     * @param configuration the runtime configuration
-     *
-     * @return {@link StringBuilderWrapper}
-     *
-     * @throws IOException
-     * @throws InstantiationException
-     * @throws IllegalAccessException
-     */
-    @Override
-    protected StringBuilderWrapper doProduceContent(SystemInfoConfiguration configuration) throws InstantiationException,
-            IllegalAccessException, IOException {
-        String info = InfoWriter.getInfo();
-        String pluginsStatus = ContextHelper.get().beanForType(AddonsManager.class).addonByType(PluginsAddon.class)
-                .getPluginsInfoSupportBundleDump();
-        if(!Strings.isNullOrEmpty(info))
-            return new StringBuilderWrapper(info).append("\n").append(pluginsStatus);
-        else
-            getLog().debug("No content was fetched from InfoWriter");
-
-        return failure();
-    }
-
-    @Override
-    public Logger getLog() {
-        return log;
-    }
-
-    /**
-     * Makes sure configuration is valid
-     *
-     * @param configuration configuration to check
-     * @throws org.artifactory.support.core.exceptions.BundleConfigurationException
-     *         if configuration is invalid
-     */
-    @Override
-    protected void doEnsureConfiguration(SystemInfoConfiguration configuration)
-            throws BundleConfigurationException {
-        ;
-    }
-}
diff --git a/support/core/src/main/java/org/artifactory/support/core/compression/CompressionService.java b/support/core/src/main/java/org/artifactory/support/core/compression/CompressionService.java
deleted file mode 100644
index 559b7bb..0000000
--- a/support/core/src/main/java/org/artifactory/support/core/compression/CompressionService.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.core.compression;
-
-import java.io.File;
-import java.util.List;
-
-/**
- * Provides content compression services
- *
- * @author Michael Pasternak
- */
-public interface CompressionService {
-    public static final String ARCHIVE_EXTENSION = "zip";
-    /**
-     * Compresses given directory into zip file
-     *
-     * @param directory the content to compress
-     * @param size default archive size
-     *
-     * @return zipped archive/s
-     */
-    List<File> compress(File directory, int size);
-}
diff --git a/support/core/src/main/java/org/artifactory/support/core/compression/CompressionServiceImpl.java b/support/core/src/main/java/org/artifactory/support/core/compression/CompressionServiceImpl.java
deleted file mode 100644
index 25309d9..0000000
--- a/support/core/src/main/java/org/artifactory/support/core/compression/CompressionServiceImpl.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.core.compression;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.FilenameUtils;
-import org.artifactory.util.ZipUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Service;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.FileVisitOption;
-import java.nio.file.Files;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Provides content compression services
- *
- * @author Michael Pasternak
- */
- at Scope(BeanDefinition.SCOPE_SINGLETON)
- at Service
-public class CompressionServiceImpl implements CompressionService {
-
-    private static final Logger log = LoggerFactory.getLogger(CompressionServiceImpl.class);
-
-    /**
-     * Compresses given directory into zip file
-     *
-     * @param directory the content to compress
-     * @param size default archive size
-     *
-     * @return zipped archive/s
-     */
-    @Override
-    public List<File> compress(File directory, int size) {
-
-        List<File> destinationArchives = Lists.newLinkedList();
-        try {
-            File destinationArchive = new File(directory.getPath() + File.separator
-                    + directory.getName() + "."+ ARCHIVE_EXTENSION);
-            ZipUtils.archive(directory, destinationArchive, true);
-            destinationArchives.add(destinationArchive);
-        } catch (IOException e) {
-            log.error("Content compression has failed, - " + e.getMessage());
-            log.debug("Cause: {}", e);
-        } finally {
-            cleanup(directory);
-        }
-        return destinationArchives;
-    }
-
-    /**
-     * Performs cleanup
-     *
-     * @param directory content to clean
-     */
-    private void cleanup(File directory) {
-        try {
-            Files.walk(directory.toPath(), FileVisitOption.FOLLOW_LINKS)
-                    .filter(Files::isDirectory)
-                    .filter(p -> !p.equals(directory.toPath()))
-                    .filter (p -> !FilenameUtils.getExtension(p.toString()).equals("zip"))
-                    .forEach(p -> {
-                        try {
-                            FileUtils.deleteDirectory(p.toFile());
-                        } catch (IOException e) {
-                            log.debug("Cannot delete folder: {}", e);
-                        }
-                    } );
-        } catch (IOException e) {
-            log.debug("Cleanup has failed: {}", e);
-        }
-    }
-}
diff --git a/support/core/src/main/java/org/artifactory/support/core/exceptions/BundleConfigurationException.java b/support/core/src/main/java/org/artifactory/support/core/exceptions/BundleConfigurationException.java
deleted file mode 100644
index 5054947..0000000
--- a/support/core/src/main/java/org/artifactory/support/core/exceptions/BundleConfigurationException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.core.exceptions;
-
-/**
- * Thrown when illegal configuration is found
- *
- * @author Michael Pasternak
- */
-public class BundleConfigurationException extends RuntimeException {
-    public BundleConfigurationException(String message) {
-        super(message);
-    }
-
-    public BundleConfigurationException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/support/core/src/main/java/org/artifactory/support/core/exceptions/ContentCollectionExceptionException.java b/support/core/src/main/java/org/artifactory/support/core/exceptions/ContentCollectionExceptionException.java
deleted file mode 100644
index 62b3f82..0000000
--- a/support/core/src/main/java/org/artifactory/support/core/exceptions/ContentCollectionExceptionException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.core.exceptions;
-
-/**
- * Thrown when illegal condition during content collection is met
- *
- * @author Michael Pasternak
- */
-public class ContentCollectionExceptionException extends RuntimeException {
-    public ContentCollectionExceptionException(String message) {
-        super(message);
-    }
-
-    public ContentCollectionExceptionException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/support/core/src/main/java/org/artifactory/support/core/exceptions/IllegalConditionException.java b/support/core/src/main/java/org/artifactory/support/core/exceptions/IllegalConditionException.java
deleted file mode 100644
index 93ab548..0000000
--- a/support/core/src/main/java/org/artifactory/support/core/exceptions/IllegalConditionException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.core.exceptions;
-
-/**
- * Thrown when illegal pre condition is met
- *
- * @author Michael Pasternak
- */
-public class IllegalConditionException extends RuntimeException {
-    public IllegalConditionException(String message) {
-        super(message);
-    }
-
-    public IllegalConditionException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/support/core/src/main/java/org/artifactory/support/core/exceptions/TaskInvocationException.java b/support/core/src/main/java/org/artifactory/support/core/exceptions/TaskInvocationException.java
deleted file mode 100644
index 64d188a..0000000
--- a/support/core/src/main/java/org/artifactory/support/core/exceptions/TaskInvocationException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.core.exceptions;
-
-/**
- * Thrown when TaskInvocation error occurs
- *
- * @author Michael Pasternak
- */
-public class TaskInvocationException extends RuntimeException {
-    public TaskInvocationException(String message) {
-        super(message);
-    }
-
-    public TaskInvocationException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/support/core/src/main/java/org/artifactory/support/core/exceptions/TempDirAccessException.java b/support/core/src/main/java/org/artifactory/support/core/exceptions/TempDirAccessException.java
deleted file mode 100644
index 8be38bd..0000000
--- a/support/core/src/main/java/org/artifactory/support/core/exceptions/TempDirAccessException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.core.exceptions;
-
-/**
- * Thrown when TempDirAccess is raised
- *
- * @author Michael Pasternak
- */
-public class TempDirAccessException extends RuntimeException {
-    public TempDirAccessException(String message) {
-        super(message);
-    }
-
-    public TempDirAccessException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/support/core/src/main/java/org/artifactory/support/utils/DatePatternsHolder.java b/support/core/src/main/java/org/artifactory/support/utils/DatePatternsHolder.java
deleted file mode 100644
index 7d58e27..0000000
--- a/support/core/src/main/java/org/artifactory/support/utils/DatePatternsHolder.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.utils;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Holds known Date patterns and corresponding templates
- *
- * @author Michael Pasternak
- */
-public class DatePatternsHolder {
-    private static final Pattern datePattern1 = Pattern.compile(DatePattern.PATTERN_1.getPattern());
-    private static final Pattern datePattern2 = Pattern.compile(DatePattern.PATTERN_2.getPattern());
-    private static final Pattern datePattern3 = Pattern.compile(DatePattern.PATTERN_3.getPattern());
-    private static final Pattern datePattern4 = Pattern.compile(DatePattern.PATTERN_4.getPattern());
-    private static final Pattern dateZipPattern = Pattern.compile(DatePattern.PATTERN_ZIP_LOG.getPattern());
-
-    /**
-     * Produces {@link Matcher} from str according to datePattern1
-     *
-     * @param str string to compile
-     *
-     * @return {@link Matcher}
-     */
-    public static Matcher getMatcher1(String str) {
-        return datePattern1.matcher(str);
-    }
-
-    /**
-     * Produces {@link Matcher} from str according to datePattern2
-     *
-     * @param str string to compile
-     *
-     * @return {@link Matcher}
-     */
-    public static Matcher getMatcher2(String str) {
-        return datePattern2.matcher(str);
-    }
-
-    /**
-     * Produces {@link Matcher} from str according to datePattern3
-     *
-     * @param str string to compile
-     *
-     * @return {@link Matcher}
-     */
-    public static Matcher getMatcher3(String str) {
-        return datePattern3.matcher(str);
-    }
-
-    /**
-     * Produces {@link Matcher} from str according to datePattern4
-     *
-     * @param str string to compile
-     *
-     * @return {@link Matcher}
-     */
-    public static Matcher getMatcher4(String str) {
-        return datePattern4.matcher(str);
-    }
-
-    /**
-     * Produces {@link Matcher} from str according to dateZipPattern
-     *
-     * @param str string to compile
-     *
-     * @return {@link Matcher}
-     */
-    public static Matcher getDateZipPattern(String str) {
-        return dateZipPattern.matcher(str);
-    }
-
-
-    public enum DatePattern {
-        PATTERN_1("(19|20|30)\\d\\d[- /. /_](0[1-9]|1[012])[- /. /_](0[1-9]|[12][0-9]|3[01])",
-                "yyyy_MM_dd", "yyyy.MM.dd", "yyyy-MM-dd"
-        ),
-        PATTERN_2("(0[1-9]|1[012])[- /. /_](0[1-9]|[12][0-9]|3[01])[- /. /_](19|20|30)",
-                "MM_dd_yyyy", "MM.dd.yyyy", "MM-dd-yyyy"
-        ),
-        PATTERN_3("(19|20|30)\\d\\d[- /. /_](0[1-9]|[12][0-9]|3[01])[- /. /_](0[1-9]|1[012])",
-                "yyyy_dd_MM", "yyyy.dd.MM", "yyyy-dd-MM"
-        ),
-        PATTERN_4("(0[1-9]|[12][0-9]|3[01])[- /. /_](0[1-9]|1[012])[- /. /_](19|20|30)",
-                "dd_MM_yyyy", "dd.MM.yyyy", "dd-MM-yyyy"
-        ),
-        PATTERN_ZIP_LOG("artifactory\\.[0-9].*log\\.zip",
-                "\\d+"
-        );
-
-        DatePattern(String pattern, String... patternTemplates) {
-            this.pattern = pattern;
-            this.patternTemplates = patternTemplates;
-        }
-
-        private final String pattern;
-        private final String[] patternTemplates;
-
-        public String[] getPatternTemplates() {
-            return patternTemplates;
-        }
-
-        public String getPattern() {
-            return pattern;
-        }
-    };
-}
diff --git a/support/core/src/main/java/org/artifactory/support/utils/FileUtils.java b/support/core/src/main/java/org/artifactory/support/utils/FileUtils.java
deleted file mode 100644
index 7172b9d..0000000
--- a/support/core/src/main/java/org/artifactory/support/utils/FileUtils.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.utils;
-
-import com.google.common.collect.Lists;
-
-import java.io.File;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author Michael Pasternak
- */
-public class FileUtils {
-
-    /**
-     * Converts list of {@link java.io.File} to
-     * list of {@link java.lang.String} file names
-     *
-     * @param files
-     *
-     * @return List<String>
-     */
-    public static List<String> toFileNames(List<File> files) {
-        return files != null && files.size() > 0 ?
-                files.parallelStream()
-                        .map(f -> f.getName())
-                        .collect(Collectors.toList())
-                :
-                Lists.newLinkedList();
-    }
-}
diff --git a/support/core/src/main/java/org/artifactory/support/utils/StringBuilderWrapper.java b/support/core/src/main/java/org/artifactory/support/utils/StringBuilderWrapper.java
deleted file mode 100644
index 450d085..0000000
--- a/support/core/src/main/java/org/artifactory/support/utils/StringBuilderWrapper.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.utils;
-
-import com.google.common.base.Strings;
-
-import java.util.stream.IntStream;
-
-/**
- * @author Michael Pasternak
- */
-public class StringBuilderWrapper implements java.io.Serializable, CharSequence{
-    public static final String NEW_LINE = getLineSeparator();
-
-    private static String getLineSeparator() {
-        return System.getProperty("line.separator") != null ?
-                System.getProperty("line.separator") : "\n";
-    }
-
-    private final StringBuilder sb;
-
-    public StringBuilderWrapper() {
-        sb = new StringBuilder();
-    }
-
-    public StringBuilderWrapper(String string) {
-        sb = new StringBuilder(string);
-    }
-
-    public StringBuilderWrapper(CharSequence charSequence) {
-        sb = new StringBuilder(charSequence);
-    }
-
-    /**
-     * @param content
-     */
-    public StringBuilderWrapper append(String content) {
-        if (!Strings.isNullOrEmpty(content)) {
-            sb.append(content);
-            sb.append(NEW_LINE);
-            sb.append(NEW_LINE);
-        }
-        return this;
-    }
-
-    /**
-     * @param object
-     */
-    public void append(Object object) {
-        if (object != null) {
-            sb.append(object);
-            sb.append(NEW_LINE);
-        }
-    }
-
-    /**
-     * @param title
-     * @param content
-     */
-    public void append(Object title, Object content) {
-        if (title != null) {
-            sb.append(title);
-            sb.append(": ");
-            sb.append(content);
-            sb.append(NEW_LINE);
-        }
-    }
-
-    public void newLine() {
-        sb.append(NEW_LINE);
-    }
-
-    @Override
-    public int length() {
-        return sb.length();
-    }
-
-    @Override
-    public char charAt(int index) {
-        return sb.charAt(index);
-    }
-
-    @Override
-    public CharSequence subSequence(int start, int end) {
-        return sb.subSequence(start, end);
-    }
-
-    @Override
-    public IntStream chars() {
-        return sb.chars();
-    }
-
-    @Override
-    public IntStream codePoints() {
-        return sb.codePoints();
-    }
-
-    @Override
-    public String toString() {
-        return sb.toString();
-    }
-}
diff --git a/support/core/src/test/java/org/artifactory/support/config/bundle/BundleConfigurationTest.java b/support/core/src/test/java/org/artifactory/support/config/bundle/BundleConfigurationTest.java
deleted file mode 100644
index 9c04399..0000000
--- a/support/core/src/test/java/org/artifactory/support/config/bundle/BundleConfigurationTest.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.config.bundle;
-
-import org.joda.time.DateTime;
-import org.testng.annotations.Test;
-
-import java.util.Date;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-/**
- * @author Michael Pasternak
- */
-public class BundleConfigurationTest {
-    @Test
-    public void testBundleDatesConfiguration() {
-        Date startDate = DateTime.now().minusDays(3).toDate();
-        Date endDate = DateTime.now().toDate();
-
-        BundleConfiguration bc =
-                new BundleConfigurationBuilder(startDate, endDate)
-                .collectSystemInfo()
-                .collectSecurityConfig(false)
-                .collectConfigDescriptor()
-                .collectConfigurationFiles()
-                .collectThreadDump()
-                .collectStorageSummary()
-                .build();
-
-        assertTrue(bc.isCollectSystemLogs());
-        assertTrue(bc.isCollectSecurityConfig());
-        assertTrue(bc.isCollectSystemInfo());
-        assertTrue(bc.isCollectConfigDescriptor());
-        assertTrue(bc.isCollectThreadDump());
-        assertTrue(bc.isCollectStorageSummary());
-
-        assertFalse(bc.getSecurityInfoConfiguration().isHideUserDetails());
-        assertFalse(bc.getConfigDescriptorConfiguration().isHideUserDetails());
-
-        assertEquals(bc.getSystemLogsConfiguration().getStartDate(), startDate);
-        assertEquals(bc.getSystemLogsConfiguration().getEndDate(), endDate);
-    }
-
-    @Test
-    public void testBundleDateOffsetConfiguration() {
-        BundleConfiguration bc =
-                new BundleConfigurationBuilder(5)
-                        .collectSystemInfo()
-                        .collectSecurityConfig(false)
-                        .collectConfigDescriptor()
-                        .collectConfigurationFiles()
-                        .collectThreadDump()
-                        .collectStorageSummary()
-                        .build();
-
-        assertTrue(bc.isCollectSystemLogs());
-        assertTrue(bc.isCollectSecurityConfig());
-        assertTrue(bc.isCollectSystemInfo());
-        assertTrue(bc.isCollectConfigDescriptor());
-        assertTrue(bc.isCollectThreadDump());
-        assertTrue(bc.isCollectStorageSummary());
-
-        assertFalse(bc.getSecurityInfoConfiguration().isHideUserDetails());
-        assertFalse(bc.getConfigDescriptorConfiguration().isHideUserDetails());
-
-        assertEquals(bc.getSystemLogsConfiguration().getDaysCount(), Integer.valueOf(5));
-    }
-}
diff --git a/support/core/src/test/java/org/artifactory/support/utils/FileUtilsTest.java b/support/core/src/test/java/org/artifactory/support/utils/FileUtilsTest.java
deleted file mode 100644
index c0e7037..0000000
--- a/support/core/src/test/java/org/artifactory/support/utils/FileUtilsTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.utils;
-
-import com.beust.jcommander.internal.Lists;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.File;
-import java.util.List;
-
-import static org.testng.Assert.assertTrue;
-import static org.testng.AssertJUnit.assertNotNull;
-
-/**
- * @author Michael Pasternak
- */
-public class FileUtilsTest {
-
-    List<File> files;
-
-    @BeforeClass
-    public void init() {
-        files = Lists.newArrayList();
-        files.add(new File(File.separator + "a"+
-                File.separator+"b"+
-                File.separator+"c"+
-                File.separator+"foo.zip"));
-        files.add(new File(File.separator + "a"+
-                File.separator+"b"+
-                File.separator+"c"+
-                File.separator+"bar.zip"));
-    }
-
-    @Test
-    public void toFileNamesTest() {
-        List<String> fileNames = FileUtils.toFileNames(files);
-        assertSize(fileNames);
-        assertTrue(fileNames.contains("foo.zip"));
-        assertTrue(fileNames.contains("bar.zip"));
-    }
-
-    private void assertSize(List<String> contents) {
-        assertNotNull(contents);
-        assertTrue(contents.size() == 2);
-    }
-}
diff --git a/support/core/src/test/java/org/artifactory/support/utils/StringBuilderWrapperTest.java b/support/core/src/test/java/org/artifactory/support/utils/StringBuilderWrapperTest.java
deleted file mode 100644
index e5ec47f..0000000
--- a/support/core/src/test/java/org/artifactory/support/utils/StringBuilderWrapperTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.support.utils;
-
-import org.testng.annotations.Test;
-import static org.artifactory.util.StringUtils.LINE_SEPARATOR;
-import static org.testng.AssertJUnit.assertEquals;
-
-/**
- * @author Michael Pasternak
- */
-public class StringBuilderWrapperTest {
-
-    @Test
-    public void testAppendOnStringBuilderWrapper() {
-        StringBuilderWrapper sb = new StringBuilderWrapper();
-        sb.append("foo1", "bar1");
-        sb.append("foo2", "bar2");
-
-        assertEquals(sb.toString(), "foo1: bar1" +
-                LINE_SEPARATOR + "foo2: bar2" + LINE_SEPARATOR
-        );
-    }
-    @Test
-    public void testCreateAndAppendOnStringBuilderWrapper() {
-        StringBuilderWrapper sb = new StringBuilderWrapper("test1:test2" + LINE_SEPARATOR);
-        sb.append("foo1", "bar1");
-        sb.append("foo2", "bar2");
-
-        assertEquals(sb.toString(),
-                "test1:test2" + LINE_SEPARATOR + "foo1: bar1" +
-                        LINE_SEPARATOR + "foo2: bar2" + LINE_SEPARATOR
-        );
-    }
-}
diff --git a/support/pom.xml b/support/pom.xml
deleted file mode 100644
index a4782ff..0000000
--- a/support/pom.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0          http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.artifactory</groupId>
-        <artifactId>artifactory-parent</artifactId>
-        <version>4.8.0</version>
-    </parent>
-
-    <artifactId>artifactory-support-parent</artifactId>
-    <packaging>pom</packaging>
-    <name>Artifactory Support Parent</name>
-
-    <modules>
-        <module>core</module>
-    </modules>
-
-</project>
diff --git a/tomcat/LICENSE b/tomcat/LICENSE
new file mode 100644
index 0000000..285df34
--- /dev/null
+++ b/tomcat/LICENSE
@@ -0,0 +1,1057 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   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.
+
+
+
+APACHE TOMCAT SUBCOMPONENTS:
+
+Apache Tomcat includes a number of subcomponents with separate copyright notices
+and license terms. Your use of these subcomponents is subject to the terms and
+conditions of the following licenses.
+
+
+For the Eclipse JDT Core Batch Compiler (ecj-x.x.x.jar) component:
+
+Eclipse Public License - v 1.0
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC
+LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
+CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+a) in the case of the initial Contributor, the initial code and documentation
+distributed under this Agreement, and
+
+b) in the case of each subsequent Contributor:
+
+i) changes to the Program, and
+
+ii) additions to the Program;
+
+where such changes and/or additions to the Program originate from and are
+distributed by that particular Contributor. A Contribution 'originates' from a
+Contributor if it was added to the Program by such Contributor itself or anyone
+acting on such Contributor's behalf. Contributions do not include additions to
+the Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii) are not
+derivative works of the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"Licensed Patents" mean patent claims licensable by a Contributor which are
+necessarily infringed by the use or sale of its Contribution alone or when
+combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement,
+including all Contributors.
+
+2. GRANT OF RIGHTS
+
+a) Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide, royalty-free copyright license to
+reproduce, prepare derivative works of, publicly display, publicly perform,
+distribute and sublicense the Contribution of such Contributor, if any, and such
+derivative works, in source code and object code form.
+
+b) Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed
+Patents to make, use, sell, offer to sell, import and otherwise transfer the
+Contribution of such Contributor, if any, in source code and object code form.
+This patent license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor, such
+addition of the Contribution causes such combination to be covered by the
+Licensed Patents. The patent license shall not apply to any other combinations
+which include the Contribution. No hardware per se is licensed hereunder.
+
+c) Recipient understands that although each Contributor grants the licenses to
+its Contributions set forth herein, no assurances are provided by any
+Contributor that the Program does not infringe the patent or other intellectual
+property rights of any other entity. Each Contributor disclaims any liability to
+Recipient for claims brought by any other entity based on infringement of
+intellectual property rights or otherwise. As a condition to exercising the
+rights and licenses granted hereunder, each Recipient hereby assumes sole
+responsibility to secure any other intellectual property rights needed, if any.
+For example, if a third party patent license is required to allow Recipient to
+distribute the Program, it is Recipient's responsibility to acquire that license
+before distributing the Program.
+
+d) Each Contributor represents that to its knowledge it has sufficient copyright
+rights in its Contribution, if any, to grant the copyright license set forth in
+this Agreement.
+
+3. REQUIREMENTS
+
+A Contributor may choose to distribute the Program in object code form under its
+own license agreement, provided that:
+
+a) it complies with the terms and conditions of this Agreement; and
+
+b) its license agreement:
+
+i) effectively disclaims on behalf of all Contributors all warranties and
+conditions, express and implied, including warranties or conditions of title and
+non-infringement, and implied warranties or conditions of merchantability and
+fitness for a particular purpose;
+
+ii) effectively excludes on behalf of all Contributors all liability for
+damages, including direct, indirect, special, incidental and consequential
+damages, such as lost profits;
+
+iii) states that any provisions which differ from this Agreement are offered by
+that Contributor alone and not by any other party; and
+
+iv) states that source code for the Program is available from such Contributor,
+and informs licensees how to obtain it in a reasonable manner on or through a
+medium customarily used for software exchange.
+
+When the Program is made available in source code form:
+
+a) it must be made available under this Agreement; and
+
+b) a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained within the
+Program.
+
+Each Contributor must identify itself as the originator of its Contribution, if
+any, in a manner that reasonably allows subsequent Recipients to identify the
+originator of the Contribution.
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities with
+respect to end users, business partners and the like. While this license is
+intended to facilitate the commercial use of the Program, the Contributor who
+includes the Program in a commercial product offering should do so in a manner
+which does not create potential liability for other Contributors. Therefore, if
+a Contributor includes the Program in a commercial product offering, such
+Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
+every other Contributor ("Indemnified Contributor") against any losses, damages
+and costs (collectively "Losses") arising from claims, lawsuits and other legal
+actions brought by a third party against the Indemnified Contributor to the
+extent caused by the acts or omissions of such Commercial Contributor in
+connection with its distribution of the Program in a commercial product
+offering. The obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In order
+to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial Contributor
+to control, and cooperate with the Commercial Contributor in, the defense and
+any related settlement negotiations. The Indemnified Contributor may
+participate in any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial product
+offering, Product X. That Contributor is then a Commercial Contributor. If that
+Commercial Contributor then makes performance claims, or offers warranties
+related to Product X, those performance claims and warranties are such
+Commercial Contributor's responsibility alone. Under this section, the
+Commercial Contributor would have to defend claims against the other
+Contributors related to those performance claims and warranties, and if a court
+requires any other Contributor to pay any damages as a result, the Commercial
+Contributor must pay those damages.
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
+IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE,
+NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each
+Recipient is solely responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its exercise of
+rights under this Agreement , including but not limited to the risks and costs
+of program errors, compliance with applicable laws, damage to or loss of data,
+programs or equipment, and unavailability or interruption of operations.
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY
+CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
+PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS
+GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under applicable
+law, it shall not affect the validity or enforceability of the remainder of the
+terms of this Agreement, and without further action by the parties hereto, such
+provision shall be reformed to the minimum extent necessary to make such
+provision valid and enforceable.
+
+If Recipient institutes patent litigation against any entity (including a
+cross-claim or counterclaim in a lawsuit) alleging that the Program itself
+(excluding combinations of the Program with other software or hardware)
+infringes such Recipient's patent(s), then such Recipient's rights granted under
+Section 2(b) shall terminate as of the date such litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it fails to
+comply with any of the material terms or conditions of this Agreement and does
+not cure such failure in a reasonable period of time after becoming aware of
+such noncompliance. If all Recipient's rights under this Agreement terminate,
+Recipient agrees to cease use and distribution of the Program as soon as
+reasonably practicable. However, Recipient's obligations under this Agreement
+and any licenses granted by Recipient relating to the Program shall continue and
+survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement, but in
+order to avoid inconsistency the Agreement is copyrighted and may only be
+modified in the following manner. The Agreement Steward reserves the right to
+publish new versions (including revisions) of this Agreement from time to time.
+No one other than the Agreement Steward has the right to modify this Agreement.
+The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation
+may assign the responsibility to serve as the Agreement Steward to a suitable
+separate entity. Each new version of the Agreement will be given a
+distinguishing version number. The Program (including Contributions) may always
+be distributed subject to the version of the Agreement under which it was
+received. In addition, after a new version of the Agreement is published,
+Contributor may elect to distribute the Program (including its Contributions)
+under the new version. Except as expressly stated in Sections 2(a) and 2(b)
+above, Recipient receives no rights or licenses to the intellectual property of
+any Contributor under this Agreement, whether expressly, by implication,
+estoppel or otherwise. All rights in the Program not expressly granted under
+this Agreement are reserved.
+
+This Agreement is governed by the laws of the State of New York and the
+intellectual property laws of the United States of America. No party to this
+Agreement will bring a legal action under this Agreement more than one year
+after the cause of action arose. Each party waives its rights to a jury trial in
+any resulting litigation.
+
+
+For the Windows Installer component:
+
+    * All NSIS source code, plug-ins, documentation, examples, header files and
+       graphics, with the exception of the compression modules and where
+       otherwise noted, are licensed under the zlib/libpng license.
+    * The zlib compression module for NSIS is licensed under the zlib/libpng
+       license.
+    * The bzip2 compression module for NSIS is licensed under the bzip2 license.
+    * The lzma compression module for NSIS is licensed under the Common Public
+       License version 1.0.
+
+zlib/libpng license
+
+This software is provided 'as-is', without any express or implied warranty. In
+no event will the authors be held liable for any damages arising from the use of
+this software.
+
+Permission is granted to anyone to use this software for any purpose, including
+commercial applications, and to alter it and redistribute it freely, subject to
+the following restrictions:
+
+   1. The origin of this software must not be misrepresented; you must not claim
+       that you wrote the original software. If you use this software in a
+       product, an acknowledgment in the product documentation would be
+       appreciated but is not required.
+   2. Altered source versions must be plainly marked as such, and must not be
+       misrepresented as being the original software.
+   3. This notice may not be removed or altered from any source distribution.
+
+bzip2 license
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+   1. Redistributions of source code must retain the above copyright notice,
+       this list of conditions and the following disclaimer.
+   2. The origin of this software must not be misrepresented; you must not claim
+       that you wrote the original software. If you use this software in a
+       product, an acknowledgment in the product documentation would be
+       appreciated but is not required.
+   3. Altered source versions must be plainly marked as such, and must not be
+       misrepresented as being the original software.
+   4. The name of the author may not be used to endorse or promote products
+       derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+
+Julian Seward, Cambridge, UK.
+
+jseward at acm.org
+Common Public License version 1.0
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC
+LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
+CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+a) in the case of the initial Contributor, the initial code and documentation
+distributed under this Agreement, and b) in the case of each subsequent
+Contributor:
+
+i) changes to the Program, and
+
+ii) additions to the Program;
+
+where such changes and/or additions to the Program originate from and are
+distributed by that particular Contributor. A Contribution 'originates' from a
+Contributor if it was added to the Program by such Contributor itself or anyone
+acting on such Contributor's behalf. Contributions do not include additions to
+the Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii) are not
+derivative works of the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"Licensed Patents " mean patent claims licensable by a Contributor which are
+necessarily infringed by the use or sale of its Contribution alone or when
+combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement,
+including all Contributors.
+
+2. GRANT OF RIGHTS
+
+a) Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide, royalty-free copyright license to
+reproduce, prepare derivative works of, publicly display, publicly perform,
+distribute and sublicense the Contribution of such Contributor, if any, and such
+derivative works, in source code and object code form.
+
+b) Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed
+Patents to make, use, sell, offer to sell, import and otherwise transfer the
+Contribution of such Contributor, if any, in source code and object code form.
+This patent license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor, such
+addition of the Contribution causes such combination to be covered by the
+Licensed Patents. The patent license shall not apply to any other combinations
+which include the Contribution. No hardware per se is licensed hereunder.
+
+c) Recipient understands that although each Contributor grants the licenses to
+its Contributions set forth herein, no assurances are provided by any
+Contributor that the Program does not infringe the patent or other intellectual
+property rights of any other entity. Each Contributor disclaims any liability to
+Recipient for claims brought by any other entity based on infringement of
+intellectual property rights or otherwise. As a condition to exercising the
+rights and licenses granted hereunder, each Recipient hereby assumes sole
+responsibility to secure any other intellectual property rights needed, if any.
+For example, if a third party patent license is required to allow Recipient to
+distribute the Program, it is Recipient's responsibility to acquire that license
+before distributing the Program.
+
+d) Each Contributor represents that to its knowledge it has sufficient copyright
+rights in its Contribution, if any, to grant the copyright license set forth in
+this Agreement.
+
+3. REQUIREMENTS
+
+A Contributor may choose to distribute the Program in object code form under its
+own license agreement, provided that:
+
+a) it complies with the terms and conditions of this Agreement; and
+
+b) its license agreement:
+
+i) effectively disclaims on behalf of all Contributors all warranties and
+conditions, express and implied, including warranties or conditions of title and
+non-infringement, and implied warranties or conditions of merchantability and
+fitness for a particular purpose;
+
+ii) effectively excludes on behalf of all Contributors all liability for
+damages, including direct, indirect, special, incidental and consequential
+damages, such as lost profits;
+
+iii) states that any provisions which differ from this Agreement are offered by
+that Contributor alone and not by any other party; and
+
+iv) states that source code for the Program is available from such Contributor,
+and informs licensees how to obtain it in a reasonable manner on or through a
+medium customarily used for software exchange.
+
+When the Program is made available in source code form:
+
+a) it must be made available under this Agreement; and
+
+b) a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained within the
+Program.
+
+Each Contributor must identify itself as the originator of its Contribution, if
+any, in a manner that reasonably allows subsequent Recipients to identify the
+originator of the Contribution.
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities with
+respect to end users, business partners and the like. While this license is
+intended to facilitate the commercial use of the Program, the Contributor who
+includes the Program in a commercial product offering should do so in a manner
+which does not create potential liability for other Contributors. Therefore, if
+a Contributor includes the Program in a commercial product offering, such
+Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
+every other Contributor ("Indemnified Contributor") against any losses, damages
+and costs (collectively "Losses") arising from claims, lawsuits and other legal
+actions brought by a third party against the Indemnified Contributor to the
+extent caused by the acts or omissions of such Commercial Contributor in
+connection with its distribution of the Program in a commercial product
+offering. The obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In order
+to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial Contributor to
+control, and cooperate with the Commercial Contributor in, the defense and any
+related settlement negotiations. The Indemnified Contributor may participate in
+any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial product
+offering, Product X. That Contributor is then a Commercial Contributor. If that
+Commercial Contributor then makes performance claims, or offers warranties
+related to Product X, those performance claims and warranties are such
+Commercial Contributor's responsibility alone. Under this section, the
+Commercial Contributor would have to defend claims against the other
+Contributors related to those performance claims and warranties, and if a court
+requires any other Contributor to pay any damages as a result, the Commercial
+Contributor must pay those damages.
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
+IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE,
+NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each
+Recipient is solely responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its exercise of
+rights under this Agreement, including but not limited to the risks and costs of
+program errors, compliance with applicable laws, damage to or loss of data,
+programs or equipment, and unavailability or interruption of operations.
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY
+CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
+PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS
+GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under applicable
+law, it shall not affect the validity or enforceability of the remainder of the
+terms of this Agreement, and without further action by the parties hereto, such
+provision shall be reformed to the minimum extent necessary to make such
+provision valid and enforceable.
+
+If Recipient institutes patent litigation against a Contributor with respect to
+a patent applicable to software (including a cross-claim or counterclaim in a
+lawsuit), then any patent licenses granted by that Contributor to such Recipient
+under this Agreement shall terminate as of the date such litigation is filed. In
+addition, if Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the Program
+itself (excluding combinations of the Program with other software or hardware)
+infringes such Recipient's patent(s), then such Recipient's rights granted under
+Section 2(b) shall terminate as of the date such litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it fails to
+comply with any of the material terms or conditions of this Agreement and does
+not cure such failure in a reasonable period of time after becoming aware of
+such noncompliance. If all Recipient's rights under this Agreement terminate,
+Recipient agrees to cease use and distribution of the Program as soon as
+reasonably practicable. However, Recipient's obligations under this Agreement
+and any licenses granted by Recipient relating to the Program shall continue and
+survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement, but in
+order to avoid inconsistency the Agreement is copyrighted and may only be
+modified in the following manner. The Agreement Steward reserves the right to
+publish new versions (including revisions) of this Agreement from time to time.
+No one other than the Agreement Steward has the right to modify this Agreement.
+IBM is the initial Agreement Steward. IBM may assign the responsibility to serve
+as the Agreement Steward to a suitable separate entity. Each new version of the
+Agreement will be given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the Agreement
+under which it was received. In addition, after a new version of the Agreement
+is published, Contributor may elect to distribute the Program (including its
+Contributions) under the new version. Except as expressly stated in Sections
+2(a) and 2(b) above, Recipient receives no rights or licenses to the
+intellectual property of any Contributor under this Agreement, whether
+expressly, by implication, estoppel or otherwise. All rights in the Program not
+expressly granted under this Agreement are reserved.
+
+This Agreement is governed by the laws of the State of New York and the
+intellectual property laws of the United States of America. No party to this
+Agreement will bring a legal action under this Agreement more than one year
+after the cause of action arose. Each party waives its rights to a jury trial in
+any resulting litigation.
+
+Special exception for LZMA compression module
+
+Igor Pavlov and Amir Szekely, the authors of the LZMA compression module for
+NSIS, expressly permit you to statically or dynamically link your code (or bind
+by name) to the files from the LZMA compression module for NSIS without
+subjecting your linked code to the terms of the Common Public license version
+1.0. Any modifications or additions to files from the LZMA compression module
+for NSIS, however, are subject to the terms of the Common Public License version
+1.0.
+
+
+For the following XML Schemas for Java EE Deployment Descriptors:
+ - javaee_5.xsd
+ - javaee_web_services_1_2.xsd
+ - javaee_web_services_client_1_2.xsd
+ - javaee_6.xsd
+ - javaee_web_services_1_3.xsd
+ - javaee_web_services_client_1_3.xsd
+ - jsp_2_2.xsd
+ - web-app_3_0.xsd
+ - web-common_3_0.xsd
+ - web-fragment_3_0.xsd
+ - javaee_7.xsd
+ - javaee_web_services_1_4.xsd
+ - javaee_web_services_client_1_4.xsd
+ - jsp_2_3.xsd
+ - web-app_3_1.xsd
+ - web-common_3_1.xsd
+ - web-fragment_3_1.xsd
+
+COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
+
+1. Definitions.
+
+   1.1. Contributor. means each individual or entity that creates or contributes
+        to the creation of Modifications.
+
+   1.2. Contributor Version. means the combination of the Original Software,
+        prior Modifications used by a Contributor (if any), and the
+        Modifications made by that particular Contributor.
+
+   1.3. Covered Software. means (a) the Original Software, or (b) Modifications,
+        or (c) the combination of files containing Original Software with files
+        containing Modifications, in each case including portions thereof.
+
+   1.4. Executable. means the Covered Software in any form other than Source
+        Code.
+
+   1.5. Initial Developer. means the individual or entity that first makes
+        Original Software available under this License.
+
+   1.6. Larger Work. means a work which combines Covered Software or portions
+        thereof with code not governed by the terms of this License.
+
+   1.7. License. means this document.
+
+   1.8. Licensable. means having the right to grant, to the maximum extent
+        possible, whether at the time of the initial grant or subsequently
+        acquired, any and all of the rights conveyed herein.
+
+   1.9. Modifications. means the Source Code and Executable form of any of the
+        following:
+
+        A. Any file that results from an addition to, deletion from or
+           modification of the contents of a file containing Original Software
+           or previous Modifications;
+
+        B. Any new file that contains any part of the Original Software or
+           previous Modification; or
+
+        C. Any new file that is contributed or otherwise made available under
+           the terms of this License.
+
+   1.10. Original Software. means the Source Code and Executable form of
+         computer software code that is originally released under this License.
+
+   1.11. Patent Claims. means any patent claim(s), now owned or hereafter
+         acquired, including without limitation, method, process, and apparatus
+         claims, in any patent Licensable by grantor.
+
+   1.12. Source Code. means (a) the common form of computer software code in
+         which modifications are made and (b) associated documentation included
+         in or with such code.
+
+   1.13. You. (or .Your.) means an individual or a legal entity exercising
+         rights under, and complying with all of the terms of, this License. For
+         legal entities, .You. includes any entity which controls, is controlled
+         by, or is under common control with You. For purposes of this
+         definition, .control. means (a) the power, direct or indirect, to cause
+         the direction or management of such entity, whether by contract or
+         otherwise, or (b) ownership of more than fifty percent (50%) of the
+         outstanding shares or beneficial ownership of such entity.
+
+2. License Grants.
+
+      2.1. The Initial Developer Grant.
+
+      Conditioned upon Your compliance with Section 3.1 below and subject to
+      third party intellectual property claims, the Initial Developer hereby
+      grants You a world-wide, royalty-free, non-exclusive license:
+
+        (a) under intellectual property rights (other than patent or trademark)
+            Licensable by Initial Developer, to use, reproduce, modify, display,
+            perform, sublicense and distribute the Original Software (or
+            portions thereof), with or without Modifications, and/or as part of
+            a Larger Work; and
+
+        (b) under Patent Claims infringed by the making, using or selling of
+            Original Software, to make, have made, use, practice, sell, and
+            offer for sale, and/or otherwise dispose of the Original Software
+            (or portions thereof).
+
+        (c) The licenses granted in Sections 2.1(a) and (b) are effective on the
+            date Initial Developer first distributes or otherwise makes the
+            Original Software available to a third party under the terms of this
+            License.
+
+        (d) Notwithstanding Section 2.1(b) above, no patent license is granted:
+            (1) for code that You delete from the Original Software, or (2) for
+            infringements caused by: (i) the modification of the Original
+            Software, or (ii) the combination of the Original Software with
+            other software or devices.
+
+    2.2. Contributor Grant.
+
+    Conditioned upon Your compliance with Section 3.1 below and subject to third
+    party intellectual property claims, each Contributor hereby grants You a
+    world-wide, royalty-free, non-exclusive license:
+
+        (a) under intellectual property rights (other than patent or trademark)
+            Licensable by Contributor to use, reproduce, modify, display,
+            perform, sublicense and distribute the Modifications created by such
+            Contributor (or portions thereof), either on an unmodified basis,
+            with other Modifications, as Covered Software and/or as part of a
+            Larger Work; and
+
+        (b) under Patent Claims infringed by the making, using, or selling of
+            Modifications made by that Contributor either alone and/or in
+            combination with its Contributor Version (or portions of such
+            combination), to make, use, sell, offer for sale, have made, and/or
+            otherwise dispose of: (1) Modifications made by that Contributor (or
+            portions thereof); and (2) the combination of Modifications made by
+            that Contributor with its Contributor Version (or portions of such
+            combination).
+
+        (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on
+            the date Contributor first distributes or otherwise makes the
+            Modifications available to a third party.
+
+        (d) Notwithstanding Section 2.2(b) above, no patent license is granted:
+            (1) for any code that Contributor has deleted from the Contributor
+            Version; (2) for infringements caused by: (i) third party
+            modifications of Contributor Version, or (ii) the combination of
+            Modifications made by that Contributor with other software (except
+            as part of the Contributor Version) or other devices; or (3) under
+            Patent Claims infringed by Covered Software in the absence of
+            Modifications made by that Contributor.
+
+3. Distribution Obligations.
+
+      3.1. Availability of Source Code.
+      Any Covered Software that You distribute or otherwise make available in
+      Executable form must also be made available in Source Code form and that
+      Source Code form must be distributed only under the terms of this License.
+      You must include a copy of this License with every copy of the Source Code
+      form of the Covered Software You distribute or otherwise make available.
+      You must inform recipients of any such Covered Software in Executable form
+      as to how they can obtain such Covered Software in Source Code form in a
+      reasonable manner on or through a medium customarily used for software
+      exchange.
+
+      3.2. Modifications.
+      The Modifications that You create or to which You contribute are governed
+      by the terms of this License. You represent that You believe Your
+      Modifications are Your original creation(s) and/or You have sufficient
+      rights to grant the rights conveyed by this License.
+
+      3.3. Required Notices.
+      You must include a notice in each of Your Modifications that identifies
+      You as the Contributor of the Modification. You may not remove or alter
+      any copyright, patent or trademark notices contained within the Covered
+      Software, or any notices of licensing or any descriptive text giving
+      attribution to any Contributor or the Initial Developer.
+
+      3.4. Application of Additional Terms.
+      You may not offer or impose any terms on any Covered Software in Source
+      Code form that alters or restricts the applicable version of this License
+      or the recipients. rights hereunder. You may choose to offer, and to
+      charge a fee for, warranty, support, indemnity or liability obligations to
+      one or more recipients of Covered Software. However, you may do so only on
+      Your own behalf, and not on behalf of the Initial Developer or any
+      Contributor. You must make it absolutely clear that any such warranty,
+      support, indemnity or liability obligation is offered by You alone, and
+      You hereby agree to indemnify the Initial Developer and every Contributor
+      for any liability incurred by the Initial Developer or such Contributor as
+      a result of warranty, support, indemnity or liability terms You offer.
+
+      3.5. Distribution of Executable Versions.
+      You may distribute the Executable form of the Covered Software under the
+      terms of this License or under the terms of a license of Your choice,
+      which may contain terms different from this License, provided that You are
+      in compliance with the terms of this License and that the license for the
+      Executable form does not attempt to limit or alter the recipient.s rights
+      in the Source Code form from the rights set forth in this License. If You
+      distribute the Covered Software in Executable form under a different
+      license, You must make it absolutely clear that any terms which differ
+      from this License are offered by You alone, not by the Initial Developer
+      or Contributor. You hereby agree to indemnify the Initial Developer and
+      every Contributor for any liability incurred by the Initial Developer or
+      such Contributor as a result of any such terms You offer.
+
+      3.6. Larger Works.
+      You may create a Larger Work by combining Covered Software with other code
+      not governed by the terms of this License and distribute the Larger Work
+      as a single product. In such a case, You must make sure the requirements
+      of this License are fulfilled for the Covered Software.
+
+4. Versions of the License.
+
+      4.1. New Versions.
+      Sun Microsystems, Inc. is the initial license steward and may publish
+      revised and/or new versions of this License from time to time. Each
+      version will be given a distinguishing version number. Except as provided
+      in Section 4.3, no one other than the license steward has the right to
+      modify this License.
+
+      4.2. Effect of New Versions.
+      You may always continue to use, distribute or otherwise make the Covered
+      Software available under the terms of the version of the License under
+      which You originally received the Covered Software. If the Initial
+      Developer includes a notice in the Original Software prohibiting it from
+      being distributed or otherwise made available under any subsequent version
+      of the License, You must distribute and make the Covered Software
+      available under the terms of the version of the License under which You
+      originally received the Covered Software. Otherwise, You may also choose
+      to use, distribute or otherwise make the Covered Software available under
+      the terms of any subsequent version of the License published by the
+      license steward.
+
+      4.3. Modified Versions.
+      When You are an Initial Developer and You want to create a new license for
+      Your Original Software, You may create and use a modified version of this
+      License if You: (a) rename the license and remove any references to the
+      name of the license steward (except to note that the license differs from
+      this License); and (b) otherwise make it clear that the license contains
+      terms which differ from this License.
+
+5. DISCLAIMER OF WARRANTY.
+
+   COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN .AS IS. BASIS, WITHOUT
+   WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT
+   LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS,
+   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK
+   AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD
+   ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL
+   DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
+   SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN
+   ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED
+   HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+6. TERMINATION.
+
+      6.1. This License and the rights granted hereunder will terminate
+           automatically if You fail to comply with terms herein and fail to
+           cure such breach within 30 days of becoming aware of the breach.
+           Provisions which, by their nature, must remain in effect beyond the
+           termination of this License shall survive.
+
+      6.2. If You assert a patent infringement claim (excluding declaratory
+           judgment actions) against Initial Developer or a Contributor (the
+           Initial Developer or Contributor against whom You assert such claim
+           is referred to as .Participant.) alleging that the Participant
+           Software (meaning the Contributor Version where the Participant is a
+           Contributor or the Original Software where the Participant is the
+           Initial Developer) directly or indirectly infringes any patent, then
+           any and all rights granted directly or indirectly to You by such
+           Participant, the Initial Developer (if the Initial Developer is not
+           the Participant) and all Contributors under Sections 2.1 and/or 2.2
+           of this License shall, upon 60 days notice from Participant terminate
+           prospectively and automatically at the expiration of such 60 day
+           notice period, unless if within such 60 day period You withdraw Your
+           claim with respect to the Participant Software against such
+           Participant either unilaterally or pursuant to a written agreement
+           with Participant.
+
+      6.3. In the event of termination under Sections 6.1 or 6.2 above, all end
+           user licenses that have been validly granted by You or any
+           distributor hereunder prior to termination (excluding licenses
+           granted to You by any distributor) shall survive termination.
+
+7. LIMITATION OF LIABILITY.
+
+   UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING
+   NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY
+   OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF
+   ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL,
+   INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT
+   LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE,
+   COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR
+   LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF
+   SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR
+   DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY.S NEGLIGENCE TO THE EXTENT
+   APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
+   EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS
+   EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+8. U.S. GOVERNMENT END USERS.
+
+   The Covered Software is a .commercial item,. as that term is defined in 48
+   C.F.R. 2.101 (Oct. 1995), consisting of .commercial computer software. (as
+   that term is defined at 48 C.F.R. ? 252.227-7014(a)(1)) and commercial
+   computer software documentation. as such terms are used in 48 C.F.R. 12.212
+   (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1
+   through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered
+   Software with only those rights set forth herein. This U.S. Government Rights
+   clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or
+   provision that addresses Government rights in computer software under this
+   License.
+
+9. MISCELLANEOUS.
+
+   This License represents the complete agreement concerning subject matter
+   hereof. If any provision of this License is held to be unenforceable, such
+   provision shall be reformed only to the extent necessary to make it
+   enforceable. This License shall be governed by the law of the jurisdiction
+   specified in a notice contained within the Original Software (except to the
+   extent applicable law, if any, provides otherwise), excluding such
+   jurisdiction's conflict-of-law provisions. Any litigation relating to this
+   License shall be subject to the jurisdiction of the courts located in the
+   jurisdiction and venue specified in a notice contained within the Original
+   Software, with the losing party responsible for costs, including, without
+   limitation, court costs and reasonable attorneys. fees and expenses. The
+   application of the United Nations Convention on Contracts for the
+   International Sale of Goods is expressly excluded. Any law or regulation
+   which provides that the language of a contract shall be construed against
+   the drafter shall not apply to this License. You agree that You alone are
+   responsible for compliance with the United States export administration
+   regulations (and the export control laws and regulation of any other
+   countries) when You use, distribute or otherwise make available any Covered
+   Software.
+
+10. RESPONSIBILITY FOR CLAIMS.
+
+   As between Initial Developer and the Contributors, each party is responsible
+   for claims and damages arising, directly or indirectly, out of its
+   utilization of rights under this License and You agree to work with Initial
+   Developer and Contributors to distribute such responsibility on an equitable
+   basis. Nothing herein is intended or shall be deemed to constitute any
+   admission of liability.
+
+   NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION
+   LICENSE (CDDL)
+
+   The code released under the CDDL shall be governed by the laws of the State
+   of California (excluding conflict-of-law provisions). Any litigation relating
+   to this License shall be subject to the jurisdiction of the Federal Courts of
+   the Northern District of California and the state courts of the State of
+   California, with venue lying in Santa Clara County, California.
+
diff --git a/tomcat/NOTICE b/tomcat/NOTICE
new file mode 100644
index 0000000..ac66c6a
--- /dev/null
+++ b/tomcat/NOTICE
@@ -0,0 +1,45 @@
+Apache Tomcat
+Copyright 1999-2017 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+The Windows Installer is built with the Nullsoft
+Scriptable Install System (NSIS), which is
+open source software.  The original software and
+related information is available at
+http://nsis.sourceforge.net.
+
+Java compilation software for JSP pages is provided by the Eclipse
+JDT Core Batch Compiler component, which is open source software.
+The original software and related information is available at
+http://www.eclipse.org/jdt/core/.
+
+For the bayeux implementation
+The org.apache.cometd.bayeux API is derivative work originating at the Dojo Foundation
+* Copyright 2007-2008 Guy Molinari
+* Copyright 2007-2008 Filip Hanik
+* Copyright 2007 Dojo Foundation
+* Copyright 2007 Mort Bay Consulting Pty. Ltd.
+
+The original XML Schemas for Java EE Deployment Descriptors:
+ - javaee_5.xsd
+ - javaee_web_services_1_2.xsd
+ - javaee_web_services_client_1_2.xsd
+ - javaee_6.xsd
+ - javaee_web_services_1_3.xsd
+ - javaee_web_services_client_1_3.xsd
+ - jsp_2_2.xsd
+ - web-app_3_0.xsd
+ - web-common_3_0.xsd
+ - web-fragment_3_0.xsd
+ - javaee_7.xsd
+ - javaee_web_services_1_4.xsd
+ - javaee_web_services_client_1_4.xsd
+ - jsp_2_3.xsd
+ - web-app_3_1.xsd
+ - web-common_3_1.xsd
+ - web-fragment_3_1.xsd
+
+may be obtained from:
+http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/index.html
diff --git a/tomcat/RELEASE-NOTES b/tomcat/RELEASE-NOTES
new file mode 100644
index 0000000..fc68974
--- /dev/null
+++ b/tomcat/RELEASE-NOTES
@@ -0,0 +1,172 @@
+================================================================================
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+================================================================================
+
+
+                     Apache Tomcat Version 8.0.41
+                            Release Notes
+
+
+=========
+CONTENTS:
+=========
+
+* Dependency Changes
+* API Stability
+* Bundled APIs
+* Web application reloading and static fields in shared libraries
+* Security manager URLs
+* Symlinking static resources
+* Viewing the Tomcat Change Log
+* Cryptographic software notice
+* When all else fails
+
+
+===================
+Dependency Changes:
+===================
+Tomcat 8.0 is designed to run on Java SE 7 and later.
+
+
+==============
+API Stability:
+==============
+
+The public interfaces for the following classes are fixed and will not be
+changed at all during the remaining lifetime of the 8.x series:
+- All classes in the javax namespace
+
+The public interfaces for the following classes may be added to in order to
+resolve bugs and/or add new features. No existing interface method will be
+removed or changed although it may be deprecated.
+- org.apache.catalina.* (excluding sub-packages)
+
+Note: As Tomcat 8 matures, the above list will be added to. The list is not
+      considered complete at this time.
+
+The remaining classes are considered part of the Tomcat internals and may change
+without notice between point releases.
+
+
+=============
+Bundled APIs:
+=============
+A standard installation of Tomcat 8.0 makes all of the following APIs available
+for use by web applications (by placing them in "lib"):
+* annotations-api.jar (Annotations package)
+* catalina.jar (Tomcat Catalina implementation)
+* catalina-ant.jar (Tomcat Catalina Ant tasks)
+* catalina-ha.jar (High availability package)
+* catalina-storeconfig.jar (Generation of XML configuration from current state)
+* catalina-tribes.jar (Group communication)
+* ecj-4.5.1.jar (Eclipse JDT Java compiler)
+* el-api.jar (EL 3.0 API)
+* jasper.jar (Jasper 2 Compiler and Runtime)
+* jasper-el.jar (Jasper 2 EL implementation)
+* jsp-api.jar (JSP 2.3 API)
+* servlet-api.jar (Servlet 3.1 API)
+* tomcat-api.jar (Interfaces shared by Catalina and Jasper)
+* tomcat-coyote.jar (Tomcat connectors and utility classes)
+* tomcat-dbcp.jar (package renamed database connection pool based on Commons DBCP)
+* tomcat-jdbc.jar (Tomcat's database connection pooling solution)
+* tomcat-jni.jar (Interface to the native component of the APR/native connector)
+* tomcat-util.jar (Various utilities)
+* tomcat-websocket.jar (WebSocket 1.1 implementation)
+* websocket-api.jar (WebSocket 1.1 API)
+
+You can make additional APIs available to all of your web applications by
+putting unpacked classes into a "classes" directory (not created by default),
+or by placing them in JAR files in the "lib" directory.
+
+To override the XML parser implementation or interfaces, use the endorsed
+mechanism of the JVM. The default configuration defines JARs located in
+"endorsed" as endorsed.
+
+
+================================================================
+Web application reloading and static fields in shared libraries:
+================================================================
+Some shared libraries (many are part of the JDK) keep references to objects
+instantiated by the web application. To avoid class loading related problems
+(ClassCastExceptions, messages indicating that the classloader
+is stopped, etc.), the shared libraries state should be reinitialized.
+
+Something which might help is to avoid putting classes which would be
+referenced by a shared static field in the web application classloader,
+and putting them in the shared classloader instead (JARs should be put in the
+"lib" folder, and classes should be put in the "classes" folder).
+
+
+======================
+Security manager URLs:
+======================
+In order to grant security permissions to JARs located inside the
+web application repository, use URLs of of the following format
+in your policy file:
+
+file:${catalina.base}/webapps/examples/WEB-INF/lib/driver.jar
+
+
+============================
+Symlinking static resources:
+============================
+By default, Unix symlinks will not work when used in a web application to link
+resources located outside the web application root directory.
+
+This behavior is optional, and the "allowLinking" flag may be used to disable
+the check.
+
+
+==============================
+Viewing the Tomcat Change Log:
+==============================
+The full change log is available from http://tomcat.apache.org and is also
+included in the documentation web application.
+
+
+=============================
+Cryptographic software notice
+=============================
+This distribution includes cryptographic software.  The country in
+which you currently reside may have restrictions on the import,
+possession, use, and/or re-export to another country, of
+encryption software.  BEFORE using any encryption software, please
+check your country's laws, regulations and policies concerning the
+import, possession, or use, and re-export of encryption software, to
+see if this is permitted.  See <http://www.wassenaar.org/> for more
+information.
+
+The U.S. Government Department of Commerce, Bureau of Industry and
+Security (BIS), has classified this software as Export Commodity
+Control Number (ECCN) 5D002.C.1, which includes information security
+software using or performing cryptographic functions with asymmetric
+algorithms.  The form and manner of this Apache Software Foundation
+distribution makes it eligible for export under the License Exception
+ENC Technology Software Unrestricted (TSU) exception (see the BIS
+Export Administration Regulations, Section 740.13) for both object
+code and source code.
+
+The following provides more details on the included cryptographic
+software:
+  - Tomcat includes code designed to work with JSSE
+  - Tomcat includes code designed to work with OpenSSL
+
+
+====================
+When all else fails:
+====================
+See the FAQ
+http://tomcat.apache.org/faq/
diff --git a/tomcat/RUNNING.txt b/tomcat/RUNNING.txt
new file mode 100644
index 0000000..636f69a
--- /dev/null
+++ b/tomcat/RUNNING.txt
@@ -0,0 +1,476 @@
+================================================================================
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+================================================================================
+
+            ===================================================
+            Running The Apache Tomcat 8.0 Servlet/JSP Container
+            ===================================================
+
+Apache Tomcat 8.0 requires a Java Standard Edition Runtime
+Environment (JRE) version 7 or later.
+
+=============================
+Running With JRE 7 Or Later
+=============================
+
+(1) Download and Install a Java SE Runtime Environment (JRE)
+
+(1.1) Download a Java SE Runtime Environment (JRE),
+      release version 7 or later, from
+      http://www.oracle.com/technetwork/java/javase/downloads/index.html
+
+(1.2) Install the JRE according to the instructions included with the
+      release.
+
+      You may also use a full Java Development Kit (JDK) rather than just
+      a JRE.
+
+
+(2) Download and Install Apache Tomcat
+
+(2.1) Download a binary distribution of Tomcat from:
+
+      http://tomcat.apache.org/
+
+(2.2) Unpack the binary distribution so that it resides in its own
+      directory (conventionally named "apache-tomcat-[version]").
+
+      For the purposes of the remainder of this document, the name
+      "CATALINA_HOME" is used to refer to the full pathname of that
+      directory.
+
+NOTE:  As an alternative to downloading a binary distribution, you can
+create your own from the Tomcat source code, as described in
+"BUILDING.txt".  You can either
+
+  a)  Do the full "release" build and find the created distribution in the
+      "output/release" directory and then proceed with unpacking as above, or
+
+  b)  Do a simple build and use the "output/build" directory as
+      "CATALINA_HOME".  Be warned that there are some differences between the
+      contents of the "output/build" directory and a full "release"
+      distribution.
+
+
+(3) Configure Environment Variables
+
+Tomcat is a Java application and does not use environment variables directly.
+Environment variables are used by the Tomcat startup scripts. The scripts use
+the environment variables to prepare the command that starts Tomcat.
+
+(3.1) Set CATALINA_HOME (required) and CATALINA_BASE (optional)
+
+The CATALINA_HOME environment variable should be set to the location of the
+root directory of the "binary" distribution of Tomcat.
+
+The Tomcat startup scripts have some logic to set this variable
+automatically if it is absent, based on the location of the startup script
+in *nix and on the current directory in Windows. That logic might not work
+in all circumstances, so setting the variable explicitly is recommended.
+
+The CATALINA_BASE environment variable specifies location of the root
+directory of the "active configuration" of Tomcat. It is optional. It
+defaults to be equal to CATALINA_HOME.
+
+Using distinct values for the CATALINA_HOME and CATALINA_BASE variables is
+recommended to simplify further upgrades and maintenance. It is documented
+in the "Multiple Tomcat Instances" section below.
+
+
+(3.2) Set JRE_HOME or JAVA_HOME (required)
+
+These variables are used to specify location of a Java Runtime
+Environment or of a Java Development Kit that is used to start Tomcat.
+
+The JRE_HOME variable is used to specify location of a JRE. The JAVA_HOME
+variable is used to specify location of a JDK.
+
+Using JAVA_HOME provides access to certain additional startup options that
+are not allowed when JRE_HOME is used.
+
+If both JRE_HOME and JAVA_HOME are specified, JRE_HOME is used.
+
+The recommended place to specify these variables is a "setenv" script. See
+below.
+
+
+(3.3) Other variables (optional)
+
+Other environment variables exist, besides the four described above.
+See the comments at the top of catalina.bat or catalina.sh scripts for
+the list and a description of each of them.
+
+One frequently used variable is CATALINA_OPTS. It allows specification of
+additional options for the java command that starts Tomcat.
+
+See the Java documentation for the options that affect the Java Runtime
+Environment.
+
+See the "System Properties" page in the Tomcat Configuration Reference for
+the system properties that are specific to Tomcat.
+
+A similar variable is JAVA_OPTS. It is used less frequently. It allows
+specification of options that are used both to start and to stop Tomcat as well
+as for other commands.
+
+Note: Do not use JAVA_OPTS to specify memory limits. You do not need much
+memory for a small process that is used to stop Tomcat. Those settings
+belong to CATALINA_OPTS.
+
+Another frequently used variable is CATALINA_PID (on *nix only). It
+specifies the location of the file where process id of the forked Tomcat
+java process will be written. This setting is optional. It will enable the
+following features:
+
+ *  better protection against duplicate start attempts and
+ *  allows forceful termination of Tomcat process when it does not react to
+    the standard shutdown command.
+
+
+(3.4) Using the "setenv" script (optional, recommended)
+
+Apart from CATALINA_HOME and CATALINA_BASE, all environment variables can
+be specified in the "setenv" script. The script is placed either into
+CATALINA_BASE/bin or into CATALINA_HOME/bin directory and is named
+setenv.bat (on Windows) or setenv.sh (on *nix). The file has to be
+readable.
+
+By default the setenv script file is absent. If the script file is present
+both in CATALINA_BASE and in CATALINA_HOME, the one in CATALINA_BASE is
+preferred.
+
+For example, to configure the JRE_HOME and CATALINA_PID variables you can
+create the following script file:
+
+On Windows, %CATALINA_BASE%\bin\setenv.bat:
+
+  set "JRE_HOME=%ProgramFiles%\Java\jre7"
+  exit /b 0
+
+On *nix, $CATALINA_BASE/bin/setenv.sh:
+
+  JRE_HOME=/usr/java/latest
+  CATALINA_PID="$CATALINA_BASE/tomcat.pid"
+
+
+The CATALINA_HOME and CATALINA_BASE variables cannot be configured in the
+setenv script, because they are used to locate that file.
+
+All the environment variables described here and the "setenv" script are
+used only if you use the standard scripts to launch Tomcat. For example, if
+you have installed Tomcat as a service on Windows, the service wrapper
+launches Java directly and does not use the script files.
+
+
+(4) Start Up Tomcat
+
+(4.1) Tomcat can be started by executing one of the following commands:
+
+  On Windows:
+
+      %CATALINA_HOME%\bin\startup.bat
+
+    or
+
+      %CATALINA_HOME%\bin\catalina.bat start
+
+  On *nix:
+
+      $CATALINA_HOME/bin/startup.sh
+
+    or
+
+      $CATALINA_HOME/bin/catalina.sh start
+
+(4.2) After startup, the default web applications included with Tomcat will be
+      available by visiting:
+
+      http://localhost:8080/
+
+(4.3) Further information about configuring and running Tomcat can be found in
+      the documentation included here, as well as on the Tomcat web site:
+
+      http://tomcat.apache.org/
+
+
+(5) Shut Down Tomcat
+
+(5.1) Tomcat can be shut down by executing one of the following commands:
+
+  On Windows:
+
+      %CATALINA_HOME%\bin\shutdown.bat
+
+    or
+
+      %CATALINA_HOME%\bin\catalina.bat stop
+
+  On *nix:
+
+      $CATALINA_HOME/bin/shutdown.sh
+
+    or
+
+      $CATALINA_HOME/bin/catalina.sh stop
+
+==================================================
+Advanced Configuration - Multiple Tomcat Instances
+==================================================
+
+In many circumstances, it is desirable to have a single copy of a Tomcat
+binary distribution shared among multiple users on the same server.  To make
+this possible, you can set the CATALINA_BASE environment variable to the
+directory that contains the files for your 'personal' Tomcat instance.
+
+When running with a separate CATALINA_HOME and CATALINA_BASE, the files
+and directories are split as following:
+
+In CATALINA_BASE:
+
+ * bin  - Only the following files:
+
+           * setenv.sh (*nix) or setenv.bat (Windows),
+           * tomcat-juli.jar
+
+          The setenv scripts were described above. The tomcat-juli library
+          is documented in the Logging chapter in the User Guide.
+
+ * conf - Server configuration files (including server.xml)
+
+ * lib  - Libraries and classes, as explained below
+
+ * logs - Log and output files
+
+ * webapps - Automatically loaded web applications
+
+ * work - Temporary working directories for web applications
+
+ * temp - Directory used by the JVM for temporary files (java.io.tmpdir)
+
+
+In CATALINA_HOME:
+
+ * bin  - Startup and shutdown scripts
+
+          The following files will be used only if they are absent in
+          CATALINA_BASE/bin:
+
+          setenv.sh (*nix), setenv.bat (Windows), tomcat-juli.jar
+
+ * lib  - Libraries and classes, as explained below
+
+ * endorsed - Libraries that override standard "Endorsed Standards"
+              libraries provided by JRE. See Classloading documentation
+              in the User Guide for details.
+
+              By default this "endorsed" directory is absent.
+
+In the default configuration the JAR libraries and classes both in
+CATALINA_BASE/lib and in CATALINA_HOME/lib will be added to the common
+classpath, but the ones in CATALINA_BASE will be added first and thus will
+be searched first.
+
+The idea is that you may leave the standard Tomcat libraries in
+CATALINA_HOME/lib and add other ones such as database drivers into
+CATALINA_BASE/lib.
+
+In general it is advised to never share libraries between web applications,
+but put them into WEB-INF/lib directories inside the applications. See
+Classloading documentation in the User Guide for details.
+
+
+It might be useful to note that the values of CATALINA_HOME and
+CATALINA_BASE can be referenced in the XML configuration files processed
+by Tomcat as ${catalina.home} and ${catalina.base} respectively.
+
+For example, the standard manager web application can be kept in
+CATALINA_HOME/webapps/manager and loaded into CATALINA_BASE by using
+the following trick:
+
+ * Copy the CATALINA_HOME/webapps/manager/META-INF/context.xml
+   file as CATALINA_BASE/conf/Catalina/localhost/manager.xml
+
+ * Add docBase attribute as shown below.
+
+The file will look like the following:
+
+  <?xml version="1.0" encoding="UTF-8"?>
+  <Context docBase="${catalina.home}/webapps/manager"
+    antiResourceLocking="false" privileged="true" >
+    <Valve className="org.apache.catalina.valves.RemoteAddrValve"
+         allow="127\.0\.0\.1" />
+  </Context>
+
+See Deployer chapter in User Guide and Context and Host chapters in the
+Configuration Reference for more information on contexts and web
+application deployment.
+
+
+================
+Troubleshooting
+================
+
+There are only really 2 things likely to go wrong during the stand-alone
+Tomcat install:
+
+(1) The most common hiccup is when another web server (or any process for that
+    matter) has laid claim to port 8080.  This is the default HTTP port that
+    Tomcat attempts to bind to at startup.  To change this, open the file:
+
+       $CATALINA_HOME/conf/server.xml
+
+    and search for '8080'.  Change it to a port that isn't in use, and is
+    greater than 1024, as ports less than or equal to 1024 require superuser
+    access to bind under UNIX.
+
+    Restart Tomcat and you're in business.  Be sure that you replace the "8080"
+    in the URL you're using to access Tomcat.  For example, if you change the
+    port to 1977, you would request the URL http://localhost:1977/ in your
+    browser.
+
+(2) The 'localhost' machine isn't found.  This could happen if you're behind a
+    proxy.  If that's the case, make sure the proxy configuration for your
+    browser knows that you shouldn't be going through the proxy to access the
+    "localhost".
+
+    In Firefox, this is under Tools/Preferences -> Advanced/Network ->
+    Connection -> Settings..., and in Internet Explorer it is Tools ->
+    Internet Options -> Connections -> LAN Settings.
+
+
+====================
+Optional Components
+====================
+
+The following optional components may be included with the Apache Tomcat binary
+distribution. If they are not included, you can install them separately.
+
+ 1. Apache Tomcat Native library
+
+ 2. Apache Commons Daemon service launcher
+
+Both of them are implemented in C language and as such have to be compiled
+into binary code. The binary code will be specific for a platform and CPU
+architecture and it must match the Java Runtime Environment executables
+that will be used to launch Tomcat.
+
+The Windows-specific binary distributions of Apache Tomcat include binary
+files for these components. On other platforms you would have to look for
+binary versions elsewhere or compile them yourself.
+
+If you are new to Tomcat, do not bother with these components to start with.
+If you do use them, do not forget to read their documentation.
+
+
+Apache Tomcat Native library
+-----------------------------
+
+It is a library that allows to use the "Apr" variant of HTTP and AJP
+protocol connectors in Apache Tomcat. It is built around OpenSSL and Apache
+Portable Runtime (APR) libraries. Those are the same libraries as used by
+Apache HTTPD Server project.
+
+This feature was especially important in the old days when Java performance
+was poor. It is less important nowadays, but it is still used and respected
+by many. See Tomcat documentation for more details.
+
+For further reading:
+
+ - Apache Tomcat documentation
+
+    * Documentation for APR/Native library in the Tomcat User's Guide
+
+      http://tomcat.apache.org/tomcat-8.0-doc/apr.html
+
+    * Documentation for the HTTP and AJP protocol connectors in the Tomcat
+      Configuration Reference
+
+      http://tomcat.apache.org/tomcat-8.0-doc/config/http.html
+
+      http://tomcat.apache.org/tomcat-8.0-doc/config/ajp.html
+
+ - Apache Tomcat Native project home
+
+      http://tomcat.apache.org/native-doc/
+
+ - Other projects
+
+    * OpenSSL
+
+      http://openssl.org/
+
+    * Apache Portable Runtime
+
+      http://apr.apache.org/
+
+    * Apache HTTP Server
+
+      http://httpd.apache.org/
+
+To disable Apache Tomcat Native library:
+
+ - To disable Apache Tomcat Native library when it is installed, or
+ - To remove the warning that is logged during Tomcat startup when the
+   library is not installed:
+
+   Edit the "conf/server.xml" file and remove "AprLifecycleListener" from
+   it.
+
+The binary file of Apache Tomcat Native library is usually named
+
+  - "tcnative-1.dll" on Windows
+  - "libtcnative-1.so" on *nix systems
+
+
+Apache Commons Daemon
+----------------------
+
+Apache Commons Daemon project provides wrappers that can be used to
+install Apache Tomcat as a service on Windows or as a daemon on *nix
+systems.
+
+The Windows-specific implementation of Apache Commons Daemon is called
+"procrun". The *nix-specific one is called "jsvc".
+
+For further reading:
+
+ - Apache Commons Daemon project
+
+      http://commons.apache.org/daemon/
+
+ - Apache Tomcat documentation
+
+    * Installing Apache Tomcat
+
+      http://tomcat.apache.org/tomcat-8.0-doc/setup.html
+
+    * Windows service HOW-TO
+
+      http://tomcat.apache.org/tomcat-8.0-doc/windows-service-howto.html
+
+The binary files of Apache Commons Daemon in Apache Tomcat distributions
+for Windows are named:
+
+  - "tomcat8.exe"
+  - "tomcat8w.exe"
+
+These files are renamed copies of "prunsrv.exe" and "prunmgr.exe" from
+Apache Commons Daemon distribution. The file names have a meaning: they are
+used as the service name to register the service in Windows, as well as the
+key name to store distinct configuration for this installation of
+"procrun". If you would like to install several instances of Tomcat 8.0
+in parallel, you have to further rename those files, using the same naming
+scheme.
diff --git a/tomcat/bin/bootstrap.jar b/tomcat/bin/bootstrap.jar
new file mode 100644
index 0000000..b9681b4
Binary files /dev/null and b/tomcat/bin/bootstrap.jar differ
diff --git a/tomcat/bin/catalina-tasks.xml b/tomcat/bin/catalina-tasks.xml
new file mode 100644
index 0000000..1ecb94f
--- /dev/null
+++ b/tomcat/bin/catalina-tasks.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!--
+  XML file for importing Catalina ant tasks.
+  <import file="${catalina.home}/bin/catalina-tasks.xml"/>
+-->
+
+<project name="catalina-tasks">
+  <description>Catalina Ant Manager, JMX and JSPC Tasks</description>
+  <!-- set catalina.home if it's not already set -->
+  <dirname property="catalina.home.bin.dir" file="${ant.file.catalina-tasks}"/>
+  <property name="catalina.home" value="${catalina.home.bin.dir}/.."/>
+  <typedef resource="org/apache/catalina/ant/catalina.tasks">
+    <classpath>
+      <fileset file="${catalina.home}/bin/tomcat-juli.jar"/>
+      <fileset dir="${catalina.home}/lib" includes="*.jar"/>
+    </classpath>
+  </typedef>
+  <typedef resource="org/apache/catalina/ant/jmx/jmxaccessor.tasks">
+    <classpath>
+      <fileset file="${catalina.home}/lib/catalina-ant.jar"/>
+    </classpath>
+  </typedef>
+</project>
diff --git a/tomcat/bin/catalina.bat b/tomcat/bin/catalina.bat
new file mode 100644
index 0000000..c76b2de
--- /dev/null
+++ b/tomcat/bin/catalina.bat
@@ -0,0 +1,353 @@
+ at echo off
+rem Licensed to the Apache Software Foundation (ASF) under one or more
+rem contributor license agreements.  See the NOTICE file distributed with
+rem this work for additional information regarding copyright ownership.
+rem The ASF licenses this file to You under the Apache License, Version 2.0
+rem (the "License"); you may not use this file except in compliance with
+rem the License.  You may obtain a copy of the License at
+rem
+rem     http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem ---------------------------------------------------------------------------
+rem Start/Stop Script for the CATALINA Server
+rem
+rem Environment Variable Prerequisites
+rem
+rem   Do not set the variables in this script. Instead put them into a script
+rem   setenv.bat in CATALINA_BASE/bin to keep your customizations separate.
+rem
+rem   WHEN RUNNING TOMCAT AS A WINDOWS SERVICE:
+rem   Note that the environment variables that affect the behavior of this
+rem   script will have no effect at all on Windows Services. As such, any
+rem   local customizations made in a CATALINA_BASE/bin/setenv.bat script
+rem   will also have no effect on Tomcat when launched as a Windows Service.
+rem   The configuration that controls Windows Services is stored in the Windows
+rem   Registry, and is most conveniently maintained using the "tomcatXw.exe"
+rem   maintenance utility, where "X" is the major version of Tomcat you are
+rem   running.
+rem
+rem   CATALINA_HOME   May point at your Catalina "build" directory.
+rem
+rem   CATALINA_BASE   (Optional) Base directory for resolving dynamic portions
+rem                   of a Catalina installation.  If not present, resolves to
+rem                   the same directory that CATALINA_HOME points to.
+rem
+rem   CATALINA_OPTS   (Optional) Java runtime options used when the "start",
+rem                   "run" or "debug" command is executed.
+rem                   Include here and not in JAVA_OPTS all options, that should
+rem                   only be used by Tomcat itself, not by the stop process,
+rem                   the version command etc.
+rem                   Examples are heap size, GC logging, JMX ports etc.
+rem
+rem   CATALINA_TMPDIR (Optional) Directory path location of temporary directory
+rem                   the JVM should use (java.io.tmpdir).  Defaults to
+rem                   %CATALINA_BASE%\temp.
+rem
+rem   JAVA_HOME       Must point at your Java Development Kit installation.
+rem                   Required to run the with the "debug" argument.
+rem
+rem   JRE_HOME        Must point at your Java Runtime installation.
+rem                   Defaults to JAVA_HOME if empty. If JRE_HOME and JAVA_HOME
+rem                   are both set, JRE_HOME is used.
+rem
+rem   JAVA_OPTS       (Optional) Java runtime options used when any command
+rem                   is executed.
+rem                   Include here and not in CATALINA_OPTS all options, that
+rem                   should be used by Tomcat and also by the stop process,
+rem                   the version command etc.
+rem                   Most options should go into CATALINA_OPTS.
+rem
+rem   JAVA_ENDORSED_DIRS (Optional) Lists of of semi-colon separated directories
+rem                   containing some jars in order to allow replacement of APIs
+rem                   created outside of the JCP (i.e. DOM and SAX from W3C).
+rem                   It can also be used to update the XML parser implementation.
+rem                   Defaults to $CATALINA_HOME/endorsed.
+rem
+rem   JPDA_TRANSPORT  (Optional) JPDA transport used when the "jpda start"
+rem                   command is executed. The default is "dt_socket".
+rem
+rem   JPDA_ADDRESS    (Optional) Java runtime options used when the "jpda start"
+rem                   command is executed. The default is localhost:8000.
+rem
+rem   JPDA_SUSPEND    (Optional) Java runtime options used when the "jpda start"
+rem                   command is executed. Specifies whether JVM should suspend
+rem                   execution immediately after startup. Default is "n".
+rem
+rem   JPDA_OPTS       (Optional) Java runtime options used when the "jpda start"
+rem                   command is executed. If used, JPDA_TRANSPORT, JPDA_ADDRESS,
+rem                   and JPDA_SUSPEND are ignored. Thus, all required jpda
+rem                   options MUST be specified. The default is:
+rem
+rem                   -agentlib:jdwp=transport=%JPDA_TRANSPORT%,
+rem                       address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%
+rem
+rem   JSSE_OPTS       (Optional) Java runtime options used to control the TLS
+rem                   implementation when JSSE is used. Default is:
+rem                   "-Djdk.tls.ephemeralDHKeySize=2048"
+rem
+rem   LOGGING_CONFIG  (Optional) Override Tomcat's logging config file
+rem                   Example (all one line)
+rem                   set LOGGING_CONFIG="-Djava.util.logging.config.file=%CATALINA_BASE%\conf\logging.properties"
+rem
+rem   LOGGING_MANAGER (Optional) Override Tomcat's logging manager
+rem                   Example (all one line)
+rem                   set LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
+rem
+rem   TITLE           (Optional) Specify the title of Tomcat window. The default
+rem                   TITLE is Tomcat if it's not specified.
+rem                   Example (all one line)
+rem                   set TITLE=Tomcat.Cluster#1.Server#1 [%DATE% %TIME%]
+rem ---------------------------------------------------------------------------
+
+setlocal
+
+rem Suppress Terminate batch job on CTRL+C
+if not ""%1"" == ""run"" goto mainEntry
+if "%TEMP%" == "" goto mainEntry
+if exist "%TEMP%\%~nx0.run" goto mainEntry
+echo Y>"%TEMP%\%~nx0.run"
+if not exist "%TEMP%\%~nx0.run" goto mainEntry
+echo Y>"%TEMP%\%~nx0.Y"
+call "%~f0" %* <"%TEMP%\%~nx0.Y"
+rem Use provided errorlevel
+set RETVAL=%ERRORLEVEL%
+del /Q "%TEMP%\%~nx0.Y" >NUL 2>&1
+exit /B %RETVAL%
+:mainEntry
+del /Q "%TEMP%\%~nx0.run" >NUL 2>&1
+
+rem Guess CATALINA_HOME if not defined
+set "CURRENT_DIR=%cd%"
+if not "%CATALINA_HOME%" == "" goto gotHome
+set "CATALINA_HOME=%CURRENT_DIR%"
+if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
+cd ..
+set "CATALINA_HOME=%cd%"
+cd "%CURRENT_DIR%"
+:gotHome
+
+if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
+echo The CATALINA_HOME environment variable is not defined correctly
+echo This environment variable is needed to run this program
+goto end
+:okHome
+
+rem Copy CATALINA_BASE from CATALINA_HOME if not defined
+if not "%CATALINA_BASE%" == "" goto gotBase
+set "CATALINA_BASE=%CATALINA_HOME%"
+:gotBase
+
+rem Ensure that neither CATALINA_HOME nor CATALINA_BASE contains a semi-colon
+rem as this is used as the separator in the classpath and Java provides no
+rem mechanism for escaping if the same character appears in the path. Check this
+rem by replacing all occurrences of ';' with '' and checking that neither
+rem CATALINA_HOME nor CATALINA_BASE have changed
+if "%CATALINA_HOME%" == "%CATALINA_HOME:;=%" goto homeNoSemicolon
+echo Using CATALINA_HOME:   "%CATALINA_HOME%"
+echo Unable to start as CATALINA_HOME contains a semicolon (;) character
+goto end
+:homeNoSemicolon
+
+if "%CATALINA_BASE%" == "%CATALINA_BASE:;=%" goto baseNoSemicolon
+echo Using CATALINA_BASE:   "%CATALINA_BASE%"
+echo Unable to start as CATALINA_BASE contains a semicolon (;) character
+goto end
+:baseNoSemicolon
+
+rem Ensure that any user defined CLASSPATH variables are not used on startup,
+rem but allow them to be specified in setenv.bat, in rare case when it is needed.
+set CLASSPATH=
+
+rem Get standard environment variables
+if not exist "%CATALINA_BASE%\bin\setenv.bat" goto checkSetenvHome
+call "%CATALINA_BASE%\bin\setenv.bat"
+goto setenvDone
+:checkSetenvHome
+if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat"
+:setenvDone
+
+rem Get standard Java environment variables
+if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath
+echo Cannot find "%CATALINA_HOME%\bin\setclasspath.bat"
+echo This file is needed to run this program
+goto end
+:okSetclasspath
+call "%CATALINA_HOME%\bin\setclasspath.bat" %1
+if errorlevel 1 goto end
+
+rem Add on extra jar file to CLASSPATH
+rem Note that there are no quotes as we do not want to introduce random
+rem quotes into the CLASSPATH
+if "%CLASSPATH%" == "" goto emptyClasspath
+set "CLASSPATH=%CLASSPATH%;"
+:emptyClasspath
+set "CLASSPATH=%CLASSPATH%%CATALINA_HOME%\bin\bootstrap.jar"
+
+if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir
+set "CATALINA_TMPDIR=%CATALINA_BASE%\temp"
+:gotTmpdir
+
+rem Add tomcat-juli.jar to classpath
+rem tomcat-juli.jar can be over-ridden per instance
+if not exist "%CATALINA_BASE%\bin\tomcat-juli.jar" goto juliClasspathHome
+set "CLASSPATH=%CLASSPATH%;%CATALINA_BASE%\bin\tomcat-juli.jar"
+goto juliClasspathDone
+:juliClasspathHome
+set "CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\tomcat-juli.jar"
+:juliClasspathDone
+
+if not "%JSSE_OPTS%" == "" goto gotJsseOpts
+set JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048"
+:gotJsseOpts
+set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"
+
+rem Register custom URL handlers
+rem Do this here so custom URL handles (specifically 'war:...') can be used in the security policy
+set "JAVA_OPTS=%JAVA_OPTS% -Djava.protocol.handler.pkgs=org.apache.catalina.webresources"
+
+if not "%LOGGING_CONFIG%" == "" goto noJuliConfig
+set LOGGING_CONFIG=-Dnop
+if not exist "%CATALINA_BASE%\conf\logging.properties" goto noJuliConfig
+set LOGGING_CONFIG=-Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"
+:noJuliConfig
+
+if not "%LOGGING_MANAGER%" == "" goto noJuliManager
+set LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
+:noJuliManager
+
+rem ----- Execute The Requested Command ---------------------------------------
+
+echo Using CATALINA_BASE:   "%CATALINA_BASE%"
+echo Using CATALINA_HOME:   "%CATALINA_HOME%"
+echo Using CATALINA_TMPDIR: "%CATALINA_TMPDIR%"
+if ""%1"" == ""debug"" goto use_jdk
+echo Using JRE_HOME:        "%JRE_HOME%"
+goto java_dir_displayed
+:use_jdk
+echo Using JAVA_HOME:       "%JAVA_HOME%"
+:java_dir_displayed
+echo Using CLASSPATH:       "%CLASSPATH%"
+
+set _EXECJAVA=%_RUNJAVA%
+set MAINCLASS=org.apache.catalina.startup.Bootstrap
+set ACTION=start
+set SECURITY_POLICY_FILE=
+set DEBUG_OPTS=
+set JPDA=
+
+if not ""%1"" == ""jpda"" goto noJpda
+set JPDA=jpda
+if not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransport
+set JPDA_TRANSPORT=dt_socket
+:gotJpdaTransport
+if not "%JPDA_ADDRESS%" == "" goto gotJpdaAddress
+set JPDA_ADDRESS=localhost:8000
+:gotJpdaAddress
+if not "%JPDA_SUSPEND%" == "" goto gotJpdaSuspend
+set JPDA_SUSPEND=n
+:gotJpdaSuspend
+if not "%JPDA_OPTS%" == "" goto gotJpdaOpts
+set JPDA_OPTS=-agentlib:jdwp=transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%
+:gotJpdaOpts
+shift
+:noJpda
+
+if ""%1"" == ""debug"" goto doDebug
+if ""%1"" == ""run"" goto doRun
+if ""%1"" == ""start"" goto doStart
+if ""%1"" == ""stop"" goto doStop
+if ""%1"" == ""configtest"" goto doConfigTest
+if ""%1"" == ""version"" goto doVersion
+
+echo Usage:  catalina ( commands ... )
+echo commands:
+echo   debug             Start Catalina in a debugger
+echo   debug -security   Debug Catalina with a security manager
+echo   jpda start        Start Catalina under JPDA debugger
+echo   run               Start Catalina in the current window
+echo   run -security     Start in the current window with security manager
+echo   start             Start Catalina in a separate window
+echo   start -security   Start in a separate window with security manager
+echo   stop              Stop Catalina
+echo   configtest        Run a basic syntax check on server.xml
+echo   version           What version of tomcat are you running?
+goto end
+
+:doDebug
+shift
+set _EXECJAVA=%_RUNJDB%
+set DEBUG_OPTS=-sourcepath "%CATALINA_HOME%\..\..\java"
+if not ""%1"" == ""-security"" goto execCmd
+shift
+echo Using Security Manager
+set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"
+goto execCmd
+
+:doRun
+shift
+if not ""%1"" == ""-security"" goto execCmd
+shift
+echo Using Security Manager
+set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"
+goto execCmd
+
+:doStart
+shift
+if "%TITLE%" == "" set TITLE=Tomcat
+set _EXECJAVA=start "%TITLE%" %_RUNJAVA%
+if not ""%1"" == ""-security"" goto execCmd
+shift
+echo Using Security Manager
+set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"
+goto execCmd
+
+:doStop
+shift
+set ACTION=stop
+set CATALINA_OPTS=
+goto execCmd
+
+:doConfigTest
+shift
+set ACTION=configtest
+set CATALINA_OPTS=
+goto execCmd
+
+:doVersion
+%_EXECJAVA% -classpath "%CATALINA_HOME%\lib\catalina.jar" org.apache.catalina.util.ServerInfo
+goto end
+
+
+:execCmd
+rem Get remaining unshifted command line arguments and save them in the
+set CMD_LINE_ARGS=
+:setArgs
+if ""%1""=="""" goto doneSetArgs
+set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
+shift
+goto setArgs
+:doneSetArgs
+
+rem Execute Java with the applicable properties
+if not "%JPDA%" == "" goto doJpda
+if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity
+%_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
+goto end
+:doSecurity
+%_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
+goto end
+:doJpda
+if not "%SECURITY_POLICY_FILE%" == "" goto doSecurityJpda
+%_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %JPDA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
+goto end
+:doSecurityJpda
+%_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %JPDA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
+goto end
+
+:end
diff --git a/tomcat/bin/catalina.sh b/tomcat/bin/catalina.sh
new file mode 100755
index 0000000..51e68e8
--- /dev/null
+++ b/tomcat/bin/catalina.sh
@@ -0,0 +1,614 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# -----------------------------------------------------------------------------
+# Control Script for the CATALINA Server
+#
+# Environment Variable Prerequisites
+#
+#   Do not set the variables in this script. Instead put them into a script
+#   setenv.sh in CATALINA_BASE/bin to keep your customizations separate.
+#
+#   CATALINA_HOME   May point at your Catalina "build" directory.
+#
+#   CATALINA_BASE   (Optional) Base directory for resolving dynamic portions
+#                   of a Catalina installation.  If not present, resolves to
+#                   the same directory that CATALINA_HOME points to.
+#
+#   CATALINA_OUT    (Optional) Full path to a file where stdout and stderr
+#                   will be redirected.
+#                   Default is $CATALINA_BASE/logs/catalina.out
+#
+#   CATALINA_OPTS   (Optional) Java runtime options used when the "start",
+#                   "run" or "debug" command is executed.
+#                   Include here and not in JAVA_OPTS all options, that should
+#                   only be used by Tomcat itself, not by the stop process,
+#                   the version command etc.
+#                   Examples are heap size, GC logging, JMX ports etc.
+#
+#   CATALINA_TMPDIR (Optional) Directory path location of temporary directory
+#                   the JVM should use (java.io.tmpdir).  Defaults to
+#                   $CATALINA_BASE/temp.
+#
+#   JAVA_HOME       Must point at your Java Development Kit installation.
+#                   Required to run the with the "debug" argument.
+#
+#   JRE_HOME        Must point at your Java Runtime installation.
+#                   Defaults to JAVA_HOME if empty. If JRE_HOME and JAVA_HOME
+#                   are both set, JRE_HOME is used.
+#
+#   JAVA_OPTS       (Optional) Java runtime options used when any command
+#                   is executed.
+#                   Include here and not in CATALINA_OPTS all options, that
+#                   should be used by Tomcat and also by the stop process,
+#                   the version command etc.
+#                   Most options should go into CATALINA_OPTS.
+#
+#   JAVA_ENDORSED_DIRS (Optional) Lists of of colon separated directories
+#                   containing some jars in order to allow replacement of APIs
+#                   created outside of the JCP (i.e. DOM and SAX from W3C).
+#                   It can also be used to update the XML parser implementation.
+#                   Defaults to $CATALINA_HOME/endorsed.
+#
+#   JPDA_TRANSPORT  (Optional) JPDA transport used when the "jpda start"
+#                   command is executed. The default is "dt_socket".
+#
+#   JPDA_ADDRESS    (Optional) Java runtime options used when the "jpda start"
+#                   command is executed. The default is localhost:8000.
+#
+#   JPDA_SUSPEND    (Optional) Java runtime options used when the "jpda start"
+#                   command is executed. Specifies whether JVM should suspend
+#                   execution immediately after startup. Default is "n".
+#
+#   JPDA_OPTS       (Optional) Java runtime options used when the "jpda start"
+#                   command is executed. If used, JPDA_TRANSPORT, JPDA_ADDRESS,
+#                   and JPDA_SUSPEND are ignored. Thus, all required jpda
+#                   options MUST be specified. The default is:
+#
+#                   -agentlib:jdwp=transport=$JPDA_TRANSPORT,
+#                       address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND
+#
+#   JSSE_OPTS       (Optional) Java runtime options used to control the TLS
+#                   implementation when JSSE is used. Default is:
+#                   "-Djdk.tls.ephemeralDHKeySize=2048"
+#
+#   CATALINA_PID    (Optional) Path of the file which should contains the pid
+#                   of the catalina startup java process, when start (fork) is
+#                   used
+#
+#   LOGGING_CONFIG  (Optional) Override Tomcat's logging config file
+#                   Example (all one line)
+#                   LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties"
+#
+#   LOGGING_MANAGER (Optional) Override Tomcat's logging manager
+#                   Example (all one line)
+#                   LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
+#
+#   USE_NOHUP       (Optional) If set to the string true the start command will
+#                   use nohup so that the Tomcat process will ignore any hangup
+#                   signals. Default is "false" unless running on HP-UX in which
+#                   case the default is "true"
+# -----------------------------------------------------------------------------
+
+# OS specific support.  $var _must_ be set to either true or false.
+cygwin=false
+darwin=false
+os400=false
+hpux=false
+case "`uname`" in
+CYGWIN*) cygwin=true;;
+Darwin*) darwin=true;;
+OS400*) os400=true;;
+HP-UX*) hpux=true;;
+esac
+
+# resolve links - $0 may be a softlink
+PRG="$0"
+
+while [ -h "$PRG" ]; do
+  ls=`ls -ld "$PRG"`
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    PRG="$link"
+  else
+    PRG=`dirname "$PRG"`/"$link"
+  fi
+done
+
+# Get standard environment variables
+PRGDIR=`dirname "$PRG"`
+
+# Only set CATALINA_HOME if not already set
+[ -z "$CATALINA_HOME" ] && CATALINA_HOME=`cd "$PRGDIR/.." >/dev/null; pwd`
+
+# Copy CATALINA_BASE from CATALINA_HOME if not already set
+[ -z "$CATALINA_BASE" ] && CATALINA_BASE="$CATALINA_HOME"
+
+# Ensure that any user defined CLASSPATH variables are not used on startup,
+# but allow them to be specified in setenv.sh, in rare case when it is needed.
+CLASSPATH=
+
+if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then
+  . "$CATALINA_BASE/bin/setenv.sh"
+elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then
+  . "$CATALINA_HOME/bin/setenv.sh"
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin; then
+  [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+  [ -n "$JRE_HOME" ] && JRE_HOME=`cygpath --unix "$JRE_HOME"`
+  [ -n "$CATALINA_HOME" ] && CATALINA_HOME=`cygpath --unix "$CATALINA_HOME"`
+  [ -n "$CATALINA_BASE" ] && CATALINA_BASE=`cygpath --unix "$CATALINA_BASE"`
+  [ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# Ensure that neither CATALINA_HOME nor CATALINA_BASE contains a colon
+# as this is used as the separator in the classpath and Java provides no
+# mechanism for escaping if the same character appears in the path.
+case $CATALINA_HOME in
+  *:*) echo "Using CATALINA_HOME:   $CATALINA_HOME";
+       echo "Unable to start as CATALINA_HOME contains a colon (:) character";
+       exit 1;
+esac
+case $CATALINA_BASE in
+  *:*) echo "Using CATALINA_BASE:   $CATALINA_BASE";
+       echo "Unable to start as CATALINA_BASE contains a colon (:) character";
+       exit 1;
+esac
+
+# For OS400
+if $os400; then
+  # Set job priority to standard for interactive (interactive - 6) by using
+  # the interactive priority - 6, the helper threads that respond to requests
+  # will be running at the same priority as interactive jobs.
+  COMMAND='chgjob job('$JOBNAME') runpty(6)'
+  system $COMMAND
+
+  # Enable multi threading
+  export QIBM_MULTI_THREADED=Y
+fi
+
+# Get standard Java environment variables
+if $os400; then
+  # -r will Only work on the os400 if the files are:
+  # 1. owned by the user
+  # 2. owned by the PRIMARY group of the user
+  # this will not work if the user belongs in secondary groups
+  . "$CATALINA_HOME"/bin/setclasspath.sh
+else
+  if [ -r "$CATALINA_HOME"/bin/setclasspath.sh ]; then
+    . "$CATALINA_HOME"/bin/setclasspath.sh
+  else
+    echo "Cannot find $CATALINA_HOME/bin/setclasspath.sh"
+    echo "This file is needed to run this program"
+    exit 1
+  fi
+fi
+
+# Add on extra jar files to CLASSPATH
+if [ ! -z "$CLASSPATH" ] ; then
+  CLASSPATH="$CLASSPATH":
+fi
+CLASSPATH="$CLASSPATH""$CATALINA_HOME"/bin/bootstrap.jar
+
+if [ -z "$CATALINA_OUT" ] ; then
+  CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out
+fi
+
+if [ -z "$CATALINA_TMPDIR" ] ; then
+  # Define the java.io.tmpdir to use for Catalina
+  CATALINA_TMPDIR="$CATALINA_BASE"/temp
+fi
+
+# Add tomcat-juli.jar to classpath
+# tomcat-juli.jar can be over-ridden per instance
+if [ -r "$CATALINA_BASE/bin/tomcat-juli.jar" ] ; then
+  CLASSPATH=$CLASSPATH:$CATALINA_BASE/bin/tomcat-juli.jar
+else
+  CLASSPATH=$CLASSPATH:$CATALINA_HOME/bin/tomcat-juli.jar
+fi
+
+# Bugzilla 37848: When no TTY is available, don't output to console
+have_tty=0
+if [ "`tty`" != "not a tty" ]; then
+    have_tty=1
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+  JAVA_HOME=`cygpath --absolute --windows "$JAVA_HOME"`
+  JRE_HOME=`cygpath --absolute --windows "$JRE_HOME"`
+  CATALINA_HOME=`cygpath --absolute --windows "$CATALINA_HOME"`
+  CATALINA_BASE=`cygpath --absolute --windows "$CATALINA_BASE"`
+  CATALINA_TMPDIR=`cygpath --absolute --windows "$CATALINA_TMPDIR"`
+  CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+  JAVA_ENDORSED_DIRS=`cygpath --path --windows "$JAVA_ENDORSED_DIRS"`
+fi
+
+if [ -z "$JSSE_OPTS" ] ; then
+  JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048"
+fi
+JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS"
+
+# Register custom URL handlers
+# Do this here so custom URL handles (specifically 'war:...') can be used in the security policy
+JAVA_OPTS="$JAVA_OPTS -Djava.protocol.handler.pkgs=org.apache.catalina.webresources"
+
+# Set juli LogManager config file if it is present and an override has not been issued
+if [ -z "$LOGGING_CONFIG" ]; then
+  if [ -r "$CATALINA_BASE"/conf/logging.properties ]; then
+    LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties"
+  else
+    # Bugzilla 45585
+    LOGGING_CONFIG="-Dnop"
+  fi
+fi
+
+if [ -z "$LOGGING_MANAGER" ]; then
+  LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
+fi
+
+# Uncomment the following line to make the umask available when using the
+# org.apache.catalina.security.SecurityListener
+#JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.security.SecurityListener.UMASK=`umask`"
+
+if [ -z "$USE_NOHUP" ]; then
+    if $hpux; then
+        USE_NOHUP="true"
+    else
+        USE_NOHUP="false"
+    fi
+fi
+unset _NOHUP
+if [ "$USE_NOHUP" = "true" ]; then
+    _NOHUP=nohup
+fi
+
+# ----- Execute The Requested Command -----------------------------------------
+
+# Bugzilla 37848: only output this if we have a TTY
+if [ $have_tty -eq 1 ]; then
+  echo "Using CATALINA_BASE:   $CATALINA_BASE"
+  echo "Using CATALINA_HOME:   $CATALINA_HOME"
+  echo "Using CATALINA_TMPDIR: $CATALINA_TMPDIR"
+  if [ "$1" = "debug" ] ; then
+    echo "Using JAVA_HOME:       $JAVA_HOME"
+  else
+    echo "Using JRE_HOME:        $JRE_HOME"
+  fi
+  echo "Using CLASSPATH:       $CLASSPATH"
+  if [ ! -z "$CATALINA_PID" ]; then
+    echo "Using CATALINA_PID:    $CATALINA_PID"
+  fi
+fi
+
+if [ "$1" = "jpda" ] ; then
+  if [ -z "$JPDA_TRANSPORT" ]; then
+    JPDA_TRANSPORT="dt_socket"
+  fi
+  if [ -z "$JPDA_ADDRESS" ]; then
+    JPDA_ADDRESS="localhost:8000"
+  fi
+  if [ -z "$JPDA_SUSPEND" ]; then
+    JPDA_SUSPEND="n"
+  fi
+  if [ -z "$JPDA_OPTS" ]; then
+    JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND"
+  fi
+  CATALINA_OPTS="$JPDA_OPTS $CATALINA_OPTS"
+  shift
+fi
+
+if [ "$1" = "debug" ] ; then
+  if $os400; then
+    echo "Debug command not available on OS400"
+    exit 1
+  else
+    shift
+    if [ "$1" = "-security" ] ; then
+      if [ $have_tty -eq 1 ]; then
+        echo "Using Security Manager"
+      fi
+      shift
+      exec "$_RUNJDB" "$LOGGING_CONFIG" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
+        -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
+        -sourcepath "$CATALINA_HOME"/../../java \
+        -Djava.security.manager \
+        -Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \
+        -Dcatalina.base="$CATALINA_BASE" \
+        -Dcatalina.home="$CATALINA_HOME" \
+        -Djava.io.tmpdir="$CATALINA_TMPDIR" \
+        org.apache.catalina.startup.Bootstrap "$@" start
+    else
+      exec "$_RUNJDB" "$LOGGING_CONFIG" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
+        -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
+        -sourcepath "$CATALINA_HOME"/../../java \
+        -Dcatalina.base="$CATALINA_BASE" \
+        -Dcatalina.home="$CATALINA_HOME" \
+        -Djava.io.tmpdir="$CATALINA_TMPDIR" \
+        org.apache.catalina.startup.Bootstrap "$@" start
+    fi
+  fi
+
+elif [ "$1" = "run" ]; then
+
+  shift
+  if [ "$1" = "-security" ] ; then
+    if [ $have_tty -eq 1 ]; then
+      echo "Using Security Manager"
+    fi
+    shift
+    eval exec "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
+      -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
+      -Djava.security.manager \
+      -Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \
+      -Dcatalina.base="\"$CATALINA_BASE\"" \
+      -Dcatalina.home="\"$CATALINA_HOME\"" \
+      -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
+      org.apache.catalina.startup.Bootstrap "$@" start
+  else
+    eval exec "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
+      -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
+      -Dcatalina.base="\"$CATALINA_BASE\"" \
+      -Dcatalina.home="\"$CATALINA_HOME\"" \
+      -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
+      org.apache.catalina.startup.Bootstrap "$@" start
+  fi
+
+elif [ "$1" = "start" ] ; then
+
+  if [ ! -z "$CATALINA_PID" ]; then
+    if [ -f "$CATALINA_PID" ]; then
+      if [ -s "$CATALINA_PID" ]; then
+        echo "Existing PID file found during start."
+        if [ -r "$CATALINA_PID" ]; then
+          PID=`cat "$CATALINA_PID"`
+          ps -p $PID >/dev/null 2>&1
+          if [ $? -eq 0 ] ; then
+            echo "Tomcat appears to still be running with PID $PID. Start aborted."
+            echo "If the following process is not a Tomcat process, remove the PID file and try again:"
+            ps -f -p $PID
+            exit 1
+          else
+            echo "Removing/clearing stale PID file."
+            rm -f "$CATALINA_PID" >/dev/null 2>&1
+            if [ $? != 0 ]; then
+              if [ -w "$CATALINA_PID" ]; then
+                cat /dev/null > "$CATALINA_PID"
+              else
+                echo "Unable to remove or clear stale PID file. Start aborted."
+                exit 1
+              fi
+            fi
+          fi
+        else
+          echo "Unable to read PID file. Start aborted."
+          exit 1
+        fi
+      else
+        rm -f "$CATALINA_PID" >/dev/null 2>&1
+        if [ $? != 0 ]; then
+          if [ ! -w "$CATALINA_PID" ]; then
+            echo "Unable to remove or write to empty PID file. Start aborted."
+            exit 1
+          fi
+        fi
+      fi
+    fi
+  fi
+
+  shift
+  touch "$CATALINA_OUT"
+  if [ "$1" = "-security" ] ; then
+    if [ $have_tty -eq 1 ]; then
+      echo "Using Security Manager"
+    fi
+    shift
+    eval $_NOHUP "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
+      -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
+      -Djava.security.manager \
+      -Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \
+      -Dcatalina.base="\"$CATALINA_BASE\"" \
+      -Dcatalina.home="\"$CATALINA_HOME\"" \
+      -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
+      org.apache.catalina.startup.Bootstrap "$@" start \
+      >> "$CATALINA_OUT" 2>&1 "&"
+
+  else
+    eval $_NOHUP "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
+      -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
+      -Dcatalina.base="\"$CATALINA_BASE\"" \
+      -Dcatalina.home="\"$CATALINA_HOME\"" \
+      -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
+      org.apache.catalina.startup.Bootstrap "$@" start \
+      >> "$CATALINA_OUT" 2>&1 "&"
+
+  fi
+
+  if [ ! -z "$CATALINA_PID" ]; then
+    echo $! > "$CATALINA_PID"
+  fi
+
+  echo "Tomcat started."
+
+elif [ "$1" = "stop" ] ; then
+
+  shift
+
+  SLEEP=5
+  if [ ! -z "$1" ]; then
+    echo $1 | grep "[^0-9]" >/dev/null 2>&1
+    if [ $? -gt 0 ]; then
+      SLEEP=$1
+      shift
+    fi
+  fi
+
+  FORCE=0
+  if [ "$1" = "-force" ]; then
+    shift
+    FORCE=1
+  fi
+
+  if [ ! -z "$CATALINA_PID" ]; then
+    if [ -f "$CATALINA_PID" ]; then
+      if [ -s "$CATALINA_PID" ]; then
+        kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1
+        if [ $? -gt 0 ]; then
+          echo "PID file found but no matching process was found. Stop aborted."
+          exit 1
+        fi
+      else
+        echo "PID file is empty and has been ignored."
+      fi
+    else
+      echo "\$CATALINA_PID was set but the specified file does not exist. Is Tomcat running? Stop aborted."
+      exit 1
+    fi
+  fi
+
+  eval "\"$_RUNJAVA\"" $LOGGING_MANAGER $JAVA_OPTS \
+    -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
+    -Dcatalina.base="\"$CATALINA_BASE\"" \
+    -Dcatalina.home="\"$CATALINA_HOME\"" \
+    -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
+    org.apache.catalina.startup.Bootstrap "$@" stop
+
+  # stop failed. Shutdown port disabled? Try a normal kill.
+  if [ $? != 0 ]; then
+    if [ ! -z "$CATALINA_PID" ]; then
+      echo "The stop command failed. Attempting to signal the process to stop through OS signal."
+      kill -15 `cat "$CATALINA_PID"` >/dev/null 2>&1
+    fi
+  fi
+
+  if [ ! -z "$CATALINA_PID" ]; then
+    if [ -f "$CATALINA_PID" ]; then
+      while [ $SLEEP -ge 0 ]; do
+        kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1
+        if [ $? -gt 0 ]; then
+          rm -f "$CATALINA_PID" >/dev/null 2>&1
+          if [ $? != 0 ]; then
+            if [ -w "$CATALINA_PID" ]; then
+              cat /dev/null > "$CATALINA_PID"
+              # If Tomcat has stopped don't try and force a stop with an empty PID file
+              FORCE=0
+            else
+              echo "The PID file could not be removed or cleared."
+            fi
+          fi
+          echo "Tomcat stopped."
+          break
+        fi
+        if [ $SLEEP -gt 0 ]; then
+          sleep 1
+        fi
+        if [ $SLEEP -eq 0 ]; then
+          echo "Tomcat did not stop in time."
+          if [ $FORCE -eq 0 ]; then
+            echo "PID file was not removed."
+          fi
+          echo "To aid diagnostics a thread dump has been written to standard out."
+          kill -3 `cat "$CATALINA_PID"`
+        fi
+        SLEEP=`expr $SLEEP - 1 `
+      done
+    fi
+  fi
+
+  KILL_SLEEP_INTERVAL=5
+  if [ $FORCE -eq 1 ]; then
+    if [ -z "$CATALINA_PID" ]; then
+      echo "Kill failed: \$CATALINA_PID not set"
+    else
+      if [ -f "$CATALINA_PID" ]; then
+        PID=`cat "$CATALINA_PID"`
+        echo "Killing Tomcat with the PID: $PID"
+        kill -9 $PID
+        while [ $KILL_SLEEP_INTERVAL -ge 0 ]; do
+            kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1
+            if [ $? -gt 0 ]; then
+                rm -f "$CATALINA_PID" >/dev/null 2>&1
+                if [ $? != 0 ]; then
+                    if [ -w "$CATALINA_PID" ]; then
+                        cat /dev/null > "$CATALINA_PID"
+                    else
+                        echo "The PID file could not be removed."
+                    fi
+                fi
+                echo "The Tomcat process has been killed."
+                break
+            fi
+            if [ $KILL_SLEEP_INTERVAL -gt 0 ]; then
+                sleep 1
+            fi
+            KILL_SLEEP_INTERVAL=`expr $KILL_SLEEP_INTERVAL - 1 `
+        done
+        if [ $KILL_SLEEP_INTERVAL -lt 0 ]; then
+            echo "Tomcat has not been killed completely yet. The process might be waiting on some system call or might be UNINTERRUPTIBLE."
+        fi
+      fi
+    fi
+  fi
+
+elif [ "$1" = "configtest" ] ; then
+
+    eval "\"$_RUNJAVA\"" $LOGGING_MANAGER $JAVA_OPTS \
+      -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
+      -Dcatalina.base="\"$CATALINA_BASE\"" \
+      -Dcatalina.home="\"$CATALINA_HOME\"" \
+      -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
+      org.apache.catalina.startup.Bootstrap configtest
+    result=$?
+    if [ $result -ne 0 ]; then
+        echo "Configuration error detected!"
+    fi
+    exit $result
+
+elif [ "$1" = "version" ] ; then
+
+    "$_RUNJAVA"   \
+      -classpath "$CATALINA_HOME/lib/catalina.jar" \
+      org.apache.catalina.util.ServerInfo
+
+else
+
+  echo "Usage: catalina.sh ( commands ... )"
+  echo "commands:"
+  if $os400; then
+    echo "  debug             Start Catalina in a debugger (not available on OS400)"
+    echo "  debug -security   Debug Catalina with a security manager (not available on OS400)"
+  else
+    echo "  debug             Start Catalina in a debugger"
+    echo "  debug -security   Debug Catalina with a security manager"
+  fi
+  echo "  jpda start        Start Catalina under JPDA debugger"
+  echo "  run               Start Catalina in the current window"
+  echo "  run -security     Start in the current window with security manager"
+  echo "  start             Start Catalina in a separate window"
+  echo "  start -security   Start in a separate window with security manager"
+  echo "  stop              Stop Catalina, waiting up to 5 seconds for the process to end"
+  echo "  stop n            Stop Catalina, waiting up to n seconds for the process to end"
+  echo "  stop -force       Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running"
+  echo "  stop n -force     Stop Catalina, wait up to n seconds and then use kill -KILL if still running"
+  echo "  configtest        Run a basic syntax check on server.xml - check exit code for result"
+  echo "  version           What version of tomcat are you running?"
+  echo "Note: Waiting for the process to end and use of the -force option require that \$CATALINA_PID is defined"
+  exit 1
+
+fi
diff --git a/tomcat/bin/commons-daemon-native.tar.gz b/tomcat/bin/commons-daemon-native.tar.gz
new file mode 100644
index 0000000..6d25918
Binary files /dev/null and b/tomcat/bin/commons-daemon-native.tar.gz differ
diff --git a/tomcat/bin/commons-daemon.jar b/tomcat/bin/commons-daemon.jar
new file mode 100644
index 0000000..2b6b9c6
Binary files /dev/null and b/tomcat/bin/commons-daemon.jar differ
diff --git a/tomcat/bin/configtest.bat b/tomcat/bin/configtest.bat
new file mode 100644
index 0000000..02448e1
--- /dev/null
+++ b/tomcat/bin/configtest.bat
@@ -0,0 +1,58 @@
+ at echo off
+rem Licensed to the Apache Software Foundation (ASF) under one or more
+rem contributor license agreements.  See the NOTICE file distributed with
+rem this work for additional information regarding copyright ownership.
+rem The ASF licenses this file to You under the Apache License, Version 2.0
+rem (the "License"); you may not use this file except in compliance with
+rem the License.  You may obtain a copy of the License at
+rem
+rem     http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem ---------------------------------------------------------------------------
+rem Configuration test script for the CATALINA Server
+rem ---------------------------------------------------------------------------
+
+setlocal
+
+rem Guess CATALINA_HOME if not defined
+set "CURRENT_DIR=%cd%"
+if not "%CATALINA_HOME%" == "" goto gotHome
+set "CATALINA_HOME=%CURRENT_DIR%"
+if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
+cd ..
+set "CATALINA_HOME=%cd%"
+cd "%CURRENT_DIR%"
+:gotHome
+if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
+echo The CATALINA_HOME environment variable is not defined correctly
+echo This environment variable is needed to run this program
+goto end
+:okHome
+
+set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"
+
+rem Check that target executable exists
+if exist "%EXECUTABLE%" goto okExec
+echo Cannot find "%EXECUTABLE%"
+echo This file is needed to run this program
+goto end
+:okExec
+
+rem Get remaining unshifted command line arguments and save them in the
+set CMD_LINE_ARGS=
+:setArgs
+if ""%1""=="""" goto doneSetArgs
+set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
+shift
+goto setArgs
+:doneSetArgs
+
+call "%EXECUTABLE%" configtest %CMD_LINE_ARGS%
+
+:end
diff --git a/tomcat/bin/configtest.sh b/tomcat/bin/configtest.sh
new file mode 100755
index 0000000..9a8ebff
--- /dev/null
+++ b/tomcat/bin/configtest.sh
@@ -0,0 +1,60 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# -----------------------------------------------------------------------------
+# Configuration Test Script for the CATALINA Server
+# -----------------------------------------------------------------------------
+
+# Better OS/400 detection: see Bugzilla 31132
+os400=false
+case "`uname`" in
+OS400*) os400=true;;
+esac
+
+# resolve links - $0 may be a softlink
+PRG="$0"
+
+while [ -h "$PRG" ] ; do
+  ls=`ls -ld "$PRG"`
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    PRG="$link"
+  else
+    PRG=`dirname "$PRG"`/"$link"
+  fi
+done
+
+PRGDIR=`dirname "$PRG"`
+EXECUTABLE=catalina.sh
+
+# Check that target executable exists
+if $os400; then
+  # -x will Only work on the os400 if the files are:
+  # 1. owned by the user
+  # 2. owned by the PRIMARY group of the user
+  # this will not work if the user belongs in secondary groups
+  eval
+else
+  if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then
+    echo "Cannot find $PRGDIR/$EXECUTABLE"
+    echo "The file is absent or does not have execute permission"
+    echo "This file is needed to run this program"
+    exit 1
+  fi
+fi
+
+exec "$PRGDIR"/"$EXECUTABLE" configtest "$@"
diff --git a/tomcat/bin/daemon.sh b/tomcat/bin/daemon.sh
new file mode 100755
index 0000000..dee6c77
--- /dev/null
+++ b/tomcat/bin/daemon.sh
@@ -0,0 +1,252 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# -----------------------------------------------------------------------------
+# Commons Daemon wrapper script.
+# -----------------------------------------------------------------------------
+#
+# resolve links - $0 may be a softlink
+ARG0="$0"
+while [ -h "$ARG0" ]; do
+  ls=`ls -ld "$ARG0"`
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    ARG0="$link"
+  else
+    ARG0="`dirname $ARG0`/$link"
+  fi
+done
+DIRNAME="`dirname $ARG0`"
+PROGRAM="`basename $ARG0`"
+while [ ".$1" != . ]
+do
+  case "$1" in
+    --java-home )
+        JAVA_HOME="$2"
+        shift; shift;
+        continue
+    ;;
+    --catalina-home )
+        CATALINA_HOME="$2"
+        shift; shift;
+        continue
+    ;;
+    --catalina-base )
+        CATALINA_BASE="$2"
+        shift; shift;
+        continue
+    ;;
+    --catalina-pid )
+        CATALINA_PID="$2"
+        shift; shift;
+        continue
+    ;;
+    --tomcat-user )
+        TOMCAT_USER="$2"
+        shift; shift;
+        continue
+    ;;
+    --service-start-wait-time )
+        SERVICE_START_WAIT_TIME="$2"
+        shift; shift;
+        continue
+    ;;
+    * )
+        break
+    ;;
+  esac
+done
+# OS specific support (must be 'true' or 'false').
+cygwin=false;
+darwin=false;
+case "`uname`" in
+    CYGWIN*)
+        cygwin=true
+        ;;
+    Darwin*)
+        darwin=true
+        ;;
+esac
+
+# Use the maximum available, or set MAX_FD != -1 to use that
+test ".$MAX_FD" = . && MAX_FD="maximum"
+# Setup parameters for running the jsvc
+#
+test ".$TOMCAT_USER" = . && TOMCAT_USER=tomcat
+# Set JAVA_HOME to working JDK or JRE
+# JAVA_HOME=/opt/jdk-1.6.0.22
+# If not set we'll try to guess the JAVA_HOME
+# from java binary if on the PATH
+#
+if [ -z "$JAVA_HOME" ]; then
+    JAVA_BIN="`which java 2>/dev/null || type java 2>&1`"
+    test -x "$JAVA_BIN" && JAVA_HOME="`dirname $JAVA_BIN`"
+    test ".$JAVA_HOME" != . && JAVA_HOME=`cd "$JAVA_HOME/.." >/dev/null; pwd`
+else
+    JAVA_BIN="$JAVA_HOME/bin/java"
+fi
+
+# Only set CATALINA_HOME if not already set
+test ".$CATALINA_HOME" = . && CATALINA_HOME=`cd "$DIRNAME/.." >/dev/null; pwd`
+test ".$CATALINA_BASE" = . && CATALINA_BASE="$CATALINA_HOME"
+test ".$CATALINA_MAIN" = . && CATALINA_MAIN=org.apache.catalina.startup.Bootstrap
+# If not explicitly set, look for jsvc in CATALINA_BASE first then CATALINA_HOME
+if [ -z "$JSVC" ]; then
+    JSVC="$CATALINA_BASE/bin/jsvc"
+    if [ ! -x "$JSVC" ]; then
+        JSVC="$CATALINA_HOME/bin/jsvc"
+    fi
+fi
+# Set the default service-start wait time if necessary
+test ".$SERVICE_START_WAIT_TIME" = . && SERVICE_START_WAIT_TIME=10
+
+# Ensure that any user defined CLASSPATH variables are not used on startup,
+# but allow them to be specified in setenv.sh, in rare case when it is needed.
+CLASSPATH=
+JAVA_OPTS=
+if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then
+  . "$CATALINA_BASE/bin/setenv.sh"
+elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then
+  . "$CATALINA_HOME/bin/setenv.sh"
+fi
+
+# Add on extra jar files to CLASSPATH
+test ".$CLASSPATH" != . && CLASSPATH="${CLASSPATH}:"
+CLASSPATH="$CLASSPATH$CATALINA_HOME/bin/bootstrap.jar:$CATALINA_HOME/bin/commons-daemon.jar"
+
+test ".$CATALINA_OUT" = . && CATALINA_OUT="$CATALINA_BASE/logs/catalina-daemon.out"
+test ".$CATALINA_TMP" = . && CATALINA_TMP="$CATALINA_BASE/temp"
+
+# Add tomcat-juli.jar to classpath
+# tomcat-juli.jar can be over-ridden per instance
+if [ -r "$CATALINA_BASE/bin/tomcat-juli.jar" ] ; then
+  CLASSPATH="$CLASSPATH:$CATALINA_BASE/bin/tomcat-juli.jar"
+else
+  CLASSPATH="$CLASSPATH:$CATALINA_HOME/bin/tomcat-juli.jar"
+fi
+# Set juli LogManager config file if it is present and an override has not been issued
+if [ -z "$LOGGING_CONFIG" ]; then
+  if [ -r "$CATALINA_BASE/conf/logging.properties" ]; then
+    LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties"
+  else
+    # Bugzilla 45585
+    LOGGING_CONFIG="-Dnop"
+  fi
+fi
+
+test ".$LOGGING_MANAGER" = . && LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
+JAVA_OPTS="$JAVA_OPTS $LOGGING_MANAGER"
+
+# Set -pidfile
+test ".$CATALINA_PID" = . && CATALINA_PID="$CATALINA_BASE/logs/catalina-daemon.pid"
+
+# Increase the maximum file descriptors if we can
+if [ "$cygwin" = "false" ]; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ "$?" -eq 0 ]; then
+        # Darwin does not allow RLIMIT_INFINITY on file soft limit
+        if [ "$darwin" = "true" -a "$MAX_FD_LIMIT" = "unlimited" ]; then
+            MAX_FD_LIMIT=`/usr/sbin/sysctl -n kern.maxfilesperproc`
+        fi
+        test ".$MAX_FD" = ".maximum" && MAX_FD="$MAX_FD_LIMIT"
+        ulimit -n $MAX_FD
+        if [ "$?" -ne 0 ]; then
+            echo "$PROGRAM: Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        echo "$PROGRAM: Could not query system maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# ----- Execute The Requested Command -----------------------------------------
+case "$1" in
+    run     )
+      shift
+      "$JSVC" $* \
+      $JSVC_OPTS \
+      -java-home "$JAVA_HOME" \
+      -pidfile "$CATALINA_PID" \
+      -wait "$SERVICE_START_WAIT_TIME" \
+      -nodetach \
+      -outfile "&1" \
+      -errfile "&2" \
+      -classpath "$CLASSPATH" \
+      "$LOGGING_CONFIG" $JAVA_OPTS $CATALINA_OPTS \
+      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" \
+      -Dcatalina.base="$CATALINA_BASE" \
+      -Dcatalina.home="$CATALINA_HOME" \
+      -Djava.io.tmpdir="$CATALINA_TMP" \
+      $CATALINA_MAIN
+      exit $?
+    ;;
+    start   )
+      "$JSVC" $JSVC_OPTS \
+      -java-home "$JAVA_HOME" \
+      -user $TOMCAT_USER \
+      -pidfile "$CATALINA_PID" \
+      -wait "$SERVICE_START_WAIT_TIME" \
+      -outfile "$CATALINA_OUT" \
+      -errfile "&1" \
+      -classpath "$CLASSPATH" \
+      "$LOGGING_CONFIG" $JAVA_OPTS $CATALINA_OPTS \
+      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" \
+      -Dcatalina.base="$CATALINA_BASE" \
+      -Dcatalina.home="$CATALINA_HOME" \
+      -Djava.io.tmpdir="$CATALINA_TMP" \
+      $CATALINA_MAIN
+      exit $?
+    ;;
+    stop    )
+      "$JSVC" $JSVC_OPTS \
+      -stop \
+      -pidfile "$CATALINA_PID" \
+      -classpath "$CLASSPATH" \
+      -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" \
+      -Dcatalina.base="$CATALINA_BASE" \
+      -Dcatalina.home="$CATALINA_HOME" \
+      -Djava.io.tmpdir="$CATALINA_TMP" \
+      $CATALINA_MAIN
+      exit $?
+    ;;
+    version  )
+      "$JSVC" \
+      -java-home "$JAVA_HOME" \
+      -pidfile "$CATALINA_PID" \
+      -classpath "$CLASSPATH" \
+      -errfile "&2" \
+      -version \
+      -check \
+      $CATALINA_MAIN
+      if [ "$?" = 0 ]; then
+        "$JAVA_BIN" \
+        -classpath "$CATALINA_HOME/lib/catalina.jar" \
+        org.apache.catalina.util.ServerInfo
+      fi
+      exit $?
+    ;;
+    *       )
+      echo "Unknown command: \`$1'"
+      echo "Usage: $PROGRAM ( commands ... )"
+      echo "commands:"
+      echo "  run               Start Tomcat without detaching from console"
+      echo "  start             Start Tomcat"
+      echo "  stop              Stop Tomcat"
+      echo "  version           What version of commons daemon and Tomcat"
+      echo "                    are you running?"
+      exit 1
+    ;;
+esac
diff --git a/tomcat/bin/digest.bat b/tomcat/bin/digest.bat
new file mode 100644
index 0000000..428b9d1
--- /dev/null
+++ b/tomcat/bin/digest.bat
@@ -0,0 +1,58 @@
+ at echo off
+rem Licensed to the Apache Software Foundation (ASF) under one or more
+rem contributor license agreements.  See the NOTICE file distributed with
+rem this work for additional information regarding copyright ownership.
+rem The ASF licenses this file to You under the Apache License, Version 2.0
+rem (the "License"); you may not use this file except in compliance with
+rem the License.  You may obtain a copy of the License at
+rem
+rem     http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem ---------------------------------------------------------------------------
+rem Script to digest password using the algorithm specified
+rem ---------------------------------------------------------------------------
+
+setlocal
+
+rem Guess CATALINA_HOME if not defined
+set "CURRENT_DIR=%cd%"
+if not "%CATALINA_HOME%" == "" goto gotHome
+set "CATALINA_HOME=%CURRENT_DIR%"
+if exist "%CATALINA_HOME%\bin\tool-wrapper.bat" goto okHome
+cd ..
+set "CATALINA_HOME=%cd%"
+cd "%CURRENT_DIR%"
+:gotHome
+if exist "%CATALINA_HOME%\bin\tool-wrapper.bat" goto okHome
+echo The CATALINA_HOME environment variable is not defined correctly
+echo This environment variable is needed to run this program
+goto end
+:okHome
+
+set "EXECUTABLE=%CATALINA_HOME%\bin\tool-wrapper.bat"
+
+rem Check that target executable exists
+if exist "%EXECUTABLE%" goto okExec
+echo Cannot find "%EXECUTABLE%"
+echo This file is needed to run this program
+goto end
+:okExec
+
+rem Get remaining unshifted command line arguments and save them in the
+set CMD_LINE_ARGS=
+:setArgs
+if ""%1""=="""" goto doneSetArgs
+set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
+shift
+goto setArgs
+:doneSetArgs
+
+call "%EXECUTABLE%" -server org.apache.catalina.realm.RealmBase %CMD_LINE_ARGS%
+
+:end
diff --git a/tomcat/bin/digest.sh b/tomcat/bin/digest.sh
new file mode 100755
index 0000000..62ed5d0
--- /dev/null
+++ b/tomcat/bin/digest.sh
@@ -0,0 +1,60 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# -----------------------------------------------------------------------------
+# Script to digest password using the algorithm specified
+# -----------------------------------------------------------------------------
+
+# Better OS/400 detection: see Bugzilla 31132
+os400=false
+case "`uname`" in
+OS400*) os400=true;;
+esac
+
+# resolve links - $0 may be a softlink
+PRG="$0"
+
+while [ -h "$PRG" ] ; do
+  ls=`ls -ld "$PRG"`
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    PRG="$link"
+  else
+    PRG=`dirname "$PRG"`/"$link"
+  fi
+done
+
+PRGDIR=`dirname "$PRG"`
+EXECUTABLE=tool-wrapper.sh
+
+# Check that target executable exists
+if $os400; then
+  # -x will Only work on the os400 if the files are:
+  # 1. owned by the user
+  # 2. owned by the PRIMARY group of the user
+  # this will not work if the user belongs in secondary groups
+  eval
+else
+  if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then
+    echo "Cannot find $PRGDIR/$EXECUTABLE"
+    echo "The file is absent or does not have execute permission"
+    echo "This file is needed to run this program"
+    exit 1
+  fi
+fi
+
+exec "$PRGDIR"/"$EXECUTABLE" -server org.apache.catalina.realm.RealmBase "$@"
diff --git a/tomcat/bin/setclasspath.bat b/tomcat/bin/setclasspath.bat
new file mode 100644
index 0000000..da0d8a3
--- /dev/null
+++ b/tomcat/bin/setclasspath.bat
@@ -0,0 +1,93 @@
+ at echo off
+rem Licensed to the Apache Software Foundation (ASF) under one or more
+rem contributor license agreements.  See the NOTICE file distributed with
+rem this work for additional information regarding copyright ownership.
+rem The ASF licenses this file to You under the Apache License, Version 2.0
+rem (the "License"); you may not use this file except in compliance with
+rem the License.  You may obtain a copy of the License at
+rem
+rem     http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem ---------------------------------------------------------------------------
+rem Set JAVA_HOME or JRE_HOME if not already set, ensure any provided settings
+rem are valid and consistent with the selected start-up options and set up the
+rem endorsed directory.
+rem ---------------------------------------------------------------------------
+
+rem Make sure prerequisite environment variables are set
+
+rem In debug mode we need a real JDK (JAVA_HOME)
+if ""%1"" == ""debug"" goto needJavaHome
+
+rem Otherwise either JRE or JDK are fine
+if not "%JRE_HOME%" == "" goto gotJreHome
+if not "%JAVA_HOME%" == "" goto gotJavaHome
+echo Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
+echo At least one of these environment variable is needed to run this program
+goto exit
+
+:needJavaHome
+rem Check if we have a usable JDK
+if "%JAVA_HOME%" == "" goto noJavaHome
+if not exist "%JAVA_HOME%\bin\java.exe" goto noJavaHome
+if not exist "%JAVA_HOME%\bin\javaw.exe" goto noJavaHome
+if not exist "%JAVA_HOME%\bin\jdb.exe" goto noJavaHome
+if not exist "%JAVA_HOME%\bin\javac.exe" goto noJavaHome
+set "JRE_HOME=%JAVA_HOME%"
+goto okJava
+
+:noJavaHome
+echo The JAVA_HOME environment variable is not defined correctly.
+echo It is needed to run this program in debug mode.
+echo NB: JAVA_HOME should point to a JDK not a JRE.
+goto exit
+
+:gotJavaHome
+rem No JRE given, use JAVA_HOME as JRE_HOME
+set "JRE_HOME=%JAVA_HOME%"
+
+:gotJreHome
+rem Check if we have a usable JRE
+if not exist "%JRE_HOME%\bin\java.exe" goto noJreHome
+if not exist "%JRE_HOME%\bin\javaw.exe" goto noJreHome
+goto okJava
+
+:noJreHome
+rem Needed at least a JRE
+echo The JRE_HOME environment variable is not defined correctly
+echo This environment variable is needed to run this program
+goto exit
+
+:okJava
+rem Don't override the endorsed dir if the user has set it previously
+if not "%JAVA_ENDORSED_DIRS%" == "" goto gotEndorseddir
+rem Set the default -Djava.endorsed.dirs argument
+set "JAVA_ENDORSED_DIRS=%CATALINA_HOME%\endorsed"
+:gotEndorseddir
+
+rem Don't override _RUNJAVA if the user has set it previously
+if not "%_RUNJAVA%" == "" goto gotRunJava
+rem Set standard command for invoking Java.
+rem Also note the quoting as JRE_HOME may contain spaces.
+set _RUNJAVA="%JRE_HOME%\bin\java.exe"
+:gotRunJava
+
+rem Don't override _RUNJDB if the user has set it previously
+rem Also note the quoting as JAVA_HOME may contain spaces.
+if not "%_RUNJDB%" == "" goto gotRunJdb
+set _RUNJDB="%JAVA_HOME%\bin\jdb.exe"
+:gotRunJdb
+
+goto end
+
+:exit
+exit /b 1
+
+:end
+exit /b 0
diff --git a/tomcat/bin/setclasspath.sh b/tomcat/bin/setclasspath.sh
new file mode 100755
index 0000000..873fad3
--- /dev/null
+++ b/tomcat/bin/setclasspath.sh
@@ -0,0 +1,94 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# -----------------------------------------------------------------------------
+#  Set JAVA_HOME or JRE_HOME if not already set, ensure any provided settings
+#  are valid and consistent with the selected start-up options and set up the
+#  endorsed directory.
+# -----------------------------------------------------------------------------
+
+# Make sure prerequisite environment variables are set
+if [ -z "$JAVA_HOME" -a -z "$JRE_HOME" ]; then
+  if $darwin; then
+    # Bugzilla 54390
+    if [ -x '/usr/libexec/java_home' ] ; then
+      export JAVA_HOME=`/usr/libexec/java_home`
+    # Bugzilla 37284 (reviewed).
+    elif [ -d "/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home" ]; then
+      export JAVA_HOME="/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home"
+    fi
+  else
+    JAVA_PATH=`which java 2>/dev/null`
+    if [ "x$JAVA_PATH" != "x" ]; then
+      JAVA_PATH=`dirname $JAVA_PATH 2>/dev/null`
+      JRE_HOME=`dirname $JAVA_PATH 2>/dev/null`
+    fi
+    if [ "x$JRE_HOME" = "x" ]; then
+      # XXX: Should we try other locations?
+      if [ -x /usr/bin/java ]; then
+        JRE_HOME=/usr
+      fi
+    fi
+  fi
+  if [ -z "$JAVA_HOME" -a -z "$JRE_HOME" ]; then
+    echo "Neither the JAVA_HOME nor the JRE_HOME environment variable is defined"
+    echo "At least one of these environment variable is needed to run this program"
+    exit 1
+  fi
+fi
+if [ -z "$JAVA_HOME" -a "$1" = "debug" ]; then
+  echo "JAVA_HOME should point to a JDK in order to run in debug mode."
+  exit 1
+fi
+if [ -z "$JRE_HOME" ]; then
+  JRE_HOME="$JAVA_HOME"
+fi
+
+# If we're running under jdb, we need a full jdk.
+if [ "$1" = "debug" ] ; then
+  if [ "$os400" = "true" ]; then
+    if [ ! -x "$JAVA_HOME"/bin/java -o ! -x "$JAVA_HOME"/bin/javac ]; then
+      echo "The JAVA_HOME environment variable is not defined correctly"
+      echo "This environment variable is needed to run this program"
+      echo "NB: JAVA_HOME should point to a JDK not a JRE"
+      exit 1
+    fi
+  else
+    if [ ! -x "$JAVA_HOME"/bin/java -o ! -x "$JAVA_HOME"/bin/jdb -o ! -x "$JAVA_HOME"/bin/javac ]; then
+      echo "The JAVA_HOME environment variable is not defined correctly"
+      echo "This environment variable is needed to run this program"
+      echo "NB: JAVA_HOME should point to a JDK not a JRE"
+      exit 1
+    fi
+  fi
+fi
+
+# Don't override the endorsed dir if the user has set it previously
+if [ -z "$JAVA_ENDORSED_DIRS" ]; then
+  # Set the default -Djava.endorsed.dirs argument
+  JAVA_ENDORSED_DIRS="$CATALINA_HOME"/endorsed
+fi
+
+# Set standard commands for invoking Java, if not already set.
+if [ -z "$_RUNJAVA" ]; then
+  _RUNJAVA="$JRE_HOME"/bin/java
+fi
+if [ "$os400" != "true" ]; then
+  if [ -z "$_RUNJDB" ]; then
+    _RUNJDB="$JAVA_HOME"/bin/jdb
+  fi
+fi
\ No newline at end of file
diff --git a/tomcat/bin/shutdown.bat b/tomcat/bin/shutdown.bat
new file mode 100644
index 0000000..119fb99
--- /dev/null
+++ b/tomcat/bin/shutdown.bat
@@ -0,0 +1,58 @@
+ at echo off
+rem Licensed to the Apache Software Foundation (ASF) under one or more
+rem contributor license agreements.  See the NOTICE file distributed with
+rem this work for additional information regarding copyright ownership.
+rem The ASF licenses this file to You under the Apache License, Version 2.0
+rem (the "License"); you may not use this file except in compliance with
+rem the License.  You may obtain a copy of the License at
+rem
+rem     http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem ---------------------------------------------------------------------------
+rem Stop script for the CATALINA Server
+rem ---------------------------------------------------------------------------
+
+setlocal
+
+rem Guess CATALINA_HOME if not defined
+set "CURRENT_DIR=%cd%"
+if not "%CATALINA_HOME%" == "" goto gotHome
+set "CATALINA_HOME=%CURRENT_DIR%"
+if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
+cd ..
+set "CATALINA_HOME=%cd%"
+cd "%CURRENT_DIR%"
+:gotHome
+if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
+echo The CATALINA_HOME environment variable is not defined correctly
+echo This environment variable is needed to run this program
+goto end
+:okHome
+
+set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"
+
+rem Check that target executable exists
+if exist "%EXECUTABLE%" goto okExec
+echo Cannot find "%EXECUTABLE%"
+echo This file is needed to run this program
+goto end
+:okExec
+
+rem Get remaining unshifted command line arguments and save them in the
+set CMD_LINE_ARGS=
+:setArgs
+if ""%1""=="""" goto doneSetArgs
+set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
+shift
+goto setArgs
+:doneSetArgs
+
+call "%EXECUTABLE%" stop %CMD_LINE_ARGS%
+
+:end
diff --git a/tomcat/bin/shutdown.sh b/tomcat/bin/shutdown.sh
new file mode 100755
index 0000000..cd0c97d
--- /dev/null
+++ b/tomcat/bin/shutdown.sh
@@ -0,0 +1,60 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# -----------------------------------------------------------------------------
+# Stop script for the CATALINA Server
+# -----------------------------------------------------------------------------
+
+# Better OS/400 detection: see Bugzilla 31132
+os400=false
+case "`uname`" in
+OS400*) os400=true;;
+esac
+
+# resolve links - $0 may be a softlink
+PRG="$0"
+
+while [ -h "$PRG" ] ; do
+  ls=`ls -ld "$PRG"`
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    PRG="$link"
+  else
+    PRG=`dirname "$PRG"`/"$link"
+  fi
+done
+
+PRGDIR=`dirname "$PRG"`
+EXECUTABLE=catalina.sh
+
+# Check that target executable exists
+if $os400; then
+  # -x will Only work on the os400 if the files are:
+  # 1. owned by the user
+  # 2. owned by the PRIMARY group of the user
+  # this will not work if the user belongs in secondary groups
+  eval
+else
+  if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then
+    echo "Cannot find $PRGDIR/$EXECUTABLE"
+    echo "The file is absent or does not have execute permission"
+    echo "This file is needed to run this program"
+    exit 1
+  fi
+fi
+
+exec "$PRGDIR"/"$EXECUTABLE" stop "$@"
diff --git a/tomcat/bin/startup.bat b/tomcat/bin/startup.bat
new file mode 100644
index 0000000..e9f46b8
--- /dev/null
+++ b/tomcat/bin/startup.bat
@@ -0,0 +1,58 @@
+ at echo off
+rem Licensed to the Apache Software Foundation (ASF) under one or more
+rem contributor license agreements.  See the NOTICE file distributed with
+rem this work for additional information regarding copyright ownership.
+rem The ASF licenses this file to You under the Apache License, Version 2.0
+rem (the "License"); you may not use this file except in compliance with
+rem the License.  You may obtain a copy of the License at
+rem
+rem     http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem ---------------------------------------------------------------------------
+rem Start script for the CATALINA Server
+rem ---------------------------------------------------------------------------
+
+setlocal
+
+rem Guess CATALINA_HOME if not defined
+set "CURRENT_DIR=%cd%"
+if not "%CATALINA_HOME%" == "" goto gotHome
+set "CATALINA_HOME=%CURRENT_DIR%"
+if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
+cd ..
+set "CATALINA_HOME=%cd%"
+cd "%CURRENT_DIR%"
+:gotHome
+if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
+echo The CATALINA_HOME environment variable is not defined correctly
+echo This environment variable is needed to run this program
+goto end
+:okHome
+
+set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"
+
+rem Check that target executable exists
+if exist "%EXECUTABLE%" goto okExec
+echo Cannot find "%EXECUTABLE%"
+echo This file is needed to run this program
+goto end
+:okExec
+
+rem Get remaining unshifted command line arguments and save them in the
+set CMD_LINE_ARGS=
+:setArgs
+if ""%1""=="""" goto doneSetArgs
+set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
+shift
+goto setArgs
+:doneSetArgs
+
+call "%EXECUTABLE%" start %CMD_LINE_ARGS%
+
+:end
diff --git a/tomcat/bin/startup.sh b/tomcat/bin/startup.sh
new file mode 100755
index 0000000..7b10287
--- /dev/null
+++ b/tomcat/bin/startup.sh
@@ -0,0 +1,60 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# -----------------------------------------------------------------------------
+# Start Script for the CATALINA Server
+# -----------------------------------------------------------------------------
+
+# Better OS/400 detection: see Bugzilla 31132
+os400=false
+case "`uname`" in
+OS400*) os400=true;;
+esac
+
+# resolve links - $0 may be a softlink
+PRG="$0"
+
+while [ -h "$PRG" ] ; do
+  ls=`ls -ld "$PRG"`
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    PRG="$link"
+  else
+    PRG=`dirname "$PRG"`/"$link"
+  fi
+done
+
+PRGDIR=`dirname "$PRG"`
+EXECUTABLE=catalina.sh
+
+# Check that target executable exists
+if $os400; then
+  # -x will Only work on the os400 if the files are:
+  # 1. owned by the user
+  # 2. owned by the PRIMARY group of the user
+  # this will not work if the user belongs in secondary groups
+  eval
+else
+  if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then
+    echo "Cannot find $PRGDIR/$EXECUTABLE"
+    echo "The file is absent or does not have execute permission"
+    echo "This file is needed to run this program"
+    exit 1
+  fi
+fi
+
+exec "$PRGDIR"/"$EXECUTABLE" start "$@"
diff --git a/tomcat/bin/tomcat-juli.jar b/tomcat/bin/tomcat-juli.jar
new file mode 100644
index 0000000..c6554c5
Binary files /dev/null and b/tomcat/bin/tomcat-juli.jar differ
diff --git a/tomcat/bin/tomcat-native.tar.gz b/tomcat/bin/tomcat-native.tar.gz
new file mode 100644
index 0000000..9d42fbf
Binary files /dev/null and b/tomcat/bin/tomcat-native.tar.gz differ
diff --git a/tomcat/bin/tool-wrapper.bat b/tomcat/bin/tool-wrapper.bat
new file mode 100644
index 0000000..26fde3d
--- /dev/null
+++ b/tomcat/bin/tool-wrapper.bat
@@ -0,0 +1,96 @@
+ at echo off
+rem Licensed to the Apache Software Foundation (ASF) under one or more
+rem contributor license agreements.  See the NOTICE file distributed with
+rem this work for additional information regarding copyright ownership.
+rem The ASF licenses this file to You under the Apache License, Version 2.0
+rem (the "License"); you may not use this file except in compliance with
+rem the License.  You may obtain a copy of the License at
+rem
+rem     http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem ---------------------------------------------------------------------------
+rem Wrapper script for command line tools
+rem
+rem Environment Variable Prerequisites
+rem
+rem   CATALINA_HOME   May point at your Catalina "build" directory.
+rem
+rem   TOOL_OPTS       (Optional) Java runtime options.
+rem
+rem   JAVA_HOME       Must point at your Java Development Kit installation.
+rem                   Using JRE_HOME instead works as well.
+rem
+rem   JRE_HOME        Must point at your Java Runtime installation.
+rem                   Defaults to JAVA_HOME if empty. If JRE_HOME and JAVA_HOME
+rem                   are both set, JRE_HOME is used.
+rem
+rem   JAVA_OPTS       (Optional) Java runtime options.
+rem
+rem   JAVA_ENDORSED_DIRS (Optional) Lists of of semi-colon separated directories
+rem                   containing some jars in order to allow replacement of APIs
+rem                   created outside of the JCP (i.e. DOM and SAX from W3C).
+rem                   It can also be used to update the XML parser implementation.
+rem                   Defaults to $CATALINA_HOME/endorsed.
+rem ---------------------------------------------------------------------------
+
+setlocal
+
+rem Guess CATALINA_HOME if not defined
+set "CURRENT_DIR=%cd%"
+if not "%CATALINA_HOME%" == "" goto gotHome
+set "CATALINA_HOME=%CURRENT_DIR%"
+if exist "%CATALINA_HOME%\bin\tool-wrapper.bat" goto okHome
+cd ..
+set "CATALINA_HOME=%cd%"
+cd "%CURRENT_DIR%"
+:gotHome
+if exist "%CATALINA_HOME%\bin\tool-wrapper.bat" goto okHome
+echo The CATALINA_HOME environment variable is not defined correctly
+echo This environment variable is needed to run this program
+goto end
+:okHome
+
+rem Ensure that any user defined CLASSPATH variables are not used on startup,
+rem but allow them to be specified in setenv.bat, in rare case when it is needed.
+set CLASSPATH=
+
+rem Get standard environment variables
+if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat"
+
+rem Get standard Java environment variables
+if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath
+echo Cannot find "%CATALINA_HOME%\bin\setclasspath.bat"
+echo This file is needed to run this program
+goto end
+:okSetclasspath
+call "%CATALINA_HOME%\bin\setclasspath.bat" %1
+if errorlevel 1 goto end
+
+rem Add on extra jar files to CLASSPATH
+rem Note that there are no quotes as we do not want to introduce random
+rem quotes into the CLASSPATH
+if "%CLASSPATH%" == "" goto emptyClasspath
+set "CLASSPATH=%CLASSPATH%;"
+:emptyClasspath
+set "CLASSPATH=%CLASSPATH%%CATALINA_HOME%\bin\bootstrap.jar;%CATALINA_HOME%\bin\tomcat-juli.jar;%CATALINA_HOME%\lib\servlet-api.jar;%CATALINA_HOME%\lib\tomcat-util.jar"
+
+set JAVA_OPTS=%JAVA_OPTS% -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
+
+rem Get remaining unshifted command line arguments and save them in the
+set CMD_LINE_ARGS=
+:setArgs
+if ""%1""=="""" goto doneSetArgs
+set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
+shift
+goto setArgs
+:doneSetArgs
+
+%_RUNJAVA% %JAVA_OPTS% %TOOL_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.home="%CATALINA_HOME%" org.apache.catalina.startup.Tool %CMD_LINE_ARGS%
+
+:end
diff --git a/tomcat/bin/tool-wrapper.sh b/tomcat/bin/tool-wrapper.sh
new file mode 100755
index 0000000..c87fa9e
--- /dev/null
+++ b/tomcat/bin/tool-wrapper.sh
@@ -0,0 +1,139 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# -----------------------------------------------------------------------------
+# Wrapper script for command line tools
+#
+# Environment Variable Prerequisites
+#
+#   CATALINA_HOME   May point at your Catalina "build" directory.
+#
+#   TOOL_OPTS       (Optional) Java runtime options.
+#
+#   JAVA_HOME       Must point at your Java Development Kit installation.
+#                   Using JRE_HOME instead works as well.
+#
+#   JRE_HOME        Must point at your Java Runtime installation.
+#                   Defaults to JAVA_HOME if empty. If JRE_HOME and JAVA_HOME
+#                   are both set, JRE_HOME is used.
+#
+#   JAVA_OPTS       (Optional) Java runtime options.
+#
+#   JAVA_ENDORSED_DIRS (Optional) Lists of of colon separated directories
+#                   containing some jars in order to allow replacement of APIs
+#                   created outside of the JCP (i.e. DOM and SAX from W3C).
+#                   It can also be used to update the XML parser implementation.
+#                   Defaults to $CATALINA_HOME/endorsed.
+# -----------------------------------------------------------------------------
+
+# OS specific support.  $var _must_ be set to either true or false.
+cygwin=false
+darwin=false
+os400=false
+case "`uname`" in
+CYGWIN*) cygwin=true;;
+Darwin*) darwin=true;;
+OS400*) os400=true;;
+esac
+
+# resolve links - $0 may be a softlink
+PRG="$0"
+
+while [ -h "$PRG" ]; do
+  ls=`ls -ld "$PRG"`
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    PRG="$link"
+  else
+    PRG=`dirname "$PRG"`/"$link"
+  fi
+done
+
+# Get standard environment variables
+PRGDIR=`dirname "$PRG"`
+
+# Only set CATALINA_HOME if not already set
+[ -z "$CATALINA_HOME" ] && CATALINA_HOME=`cd "$PRGDIR/.." >/dev/null; pwd`
+
+# Ensure that any user defined CLASSPATH variables are not used on startup,
+# but allow them to be specified in setenv.sh, in rare case when it is needed.
+CLASSPATH=
+
+if [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then
+  . "$CATALINA_HOME/bin/setenv.sh"
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin; then
+  [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+  [ -n "$JRE_HOME" ] && JRE_HOME=`cygpath --unix "$JRE_HOME"`
+  [ -n "$CATALINA_HOME" ] && CATALINA_HOME=`cygpath --unix "$CATALINA_HOME"`
+  [ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For OS400
+if $os400; then
+  # Set job priority to standard for interactive (interactive - 6) by using
+  # the interactive priority - 6, the helper threads that respond to requests
+  # will be running at the same priority as interactive jobs.
+  COMMAND='chgjob job('$JOBNAME') runpty(6)'
+  system $COMMAND
+
+  # Enable multi threading
+  export QIBM_MULTI_THREADED=Y
+fi
+
+# Get standard Java environment variables
+if $os400; then
+  # -r will Only work on the os400 if the files are:
+  # 1. owned by the user
+  # 2. owned by the PRIMARY group of the user
+  # this will not work if the user belongs in secondary groups
+  . "$CATALINA_HOME"/bin/setclasspath.sh
+else
+  if [ -r "$CATALINA_HOME"/bin/setclasspath.sh ]; then
+    . "$CATALINA_HOME"/bin/setclasspath.sh
+  else
+    echo "Cannot find $CATALINA_HOME/bin/setclasspath.sh"
+    echo "This file is needed to run this program"
+    exit 1
+  fi
+fi
+
+# Add on extra jar files to CLASSPATH
+if [ ! -z "$CLASSPATH" ] ; then
+  CLASSPATH="$CLASSPATH":
+fi
+CLASSPATH="$CLASSPATH""$CATALINA_HOME"/bin/bootstrap.jar:"$CATALINA_HOME"/bin/tomcat-juli.jar:"$CATALINA_HOME"/lib/servlet-api.jar:"$CATALINA_HOME"/lib/tomcat-util.jar
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+  JAVA_HOME=`cygpath --absolute --windows "$JAVA_HOME"`
+  JRE_HOME=`cygpath --absolute --windows "$JRE_HOME"`
+  CATALINA_HOME=`cygpath --absolute --windows "$CATALINA_HOME"`
+  CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+  JAVA_ENDORSED_DIRS=`cygpath --path --windows "$JAVA_ENDORSED_DIRS"`
+fi
+
+JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
+
+# ----- Execute The Requested Command -----------------------------------------
+
+exec "$_RUNJAVA" $JAVA_OPTS $TOOL_OPTS \
+  -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
+  -Dcatalina.home="$CATALINA_HOME" \
+  org.apache.catalina.startup.Tool "$@"
diff --git a/tomcat/bin/version.bat b/tomcat/bin/version.bat
new file mode 100644
index 0000000..d294f76
--- /dev/null
+++ b/tomcat/bin/version.bat
@@ -0,0 +1,58 @@
+ at echo off
+rem Licensed to the Apache Software Foundation (ASF) under one or more
+rem contributor license agreements.  See the NOTICE file distributed with
+rem this work for additional information regarding copyright ownership.
+rem The ASF licenses this file to You under the Apache License, Version 2.0
+rem (the "License"); you may not use this file except in compliance with
+rem the License.  You may obtain a copy of the License at
+rem
+rem     http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem ---------------------------------------------------------------------------
+rem Version script for the CATALINA Server
+rem ---------------------------------------------------------------------------
+
+setlocal
+
+rem Guess CATALINA_HOME if not defined
+set "CURRENT_DIR=%cd%"
+if not "%CATALINA_HOME%" == "" goto gotHome
+set "CATALINA_HOME=%CURRENT_DIR%"
+if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
+cd ..
+set "CATALINA_HOME=%cd%"
+cd "%CURRENT_DIR%"
+:gotHome
+if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
+echo The CATALINA_HOME environment variable is not defined correctly
+echo This environment variable is needed to run this program
+goto end
+:okHome
+
+set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"
+
+rem Check that target executable exists
+if exist "%EXECUTABLE%" goto okExec
+echo Cannot find "%EXECUTABLE%"
+echo This file is needed to run this program
+goto end
+:okExec
+
+rem Get remaining unshifted command line arguments and save them in the
+set CMD_LINE_ARGS=
+:setArgs
+if ""%1""=="""" goto doneSetArgs
+set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
+shift
+goto setArgs
+:doneSetArgs
+
+call "%EXECUTABLE%" version %CMD_LINE_ARGS%
+
+:end
diff --git a/tomcat/bin/version.sh b/tomcat/bin/version.sh
new file mode 100755
index 0000000..1cb19bd
--- /dev/null
+++ b/tomcat/bin/version.sh
@@ -0,0 +1,60 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# -----------------------------------------------------------------------------
+# Version Script for the CATALINA Server
+# -----------------------------------------------------------------------------
+
+# Better OS/400 detection: see Bugzilla 31132
+os400=false
+case "`uname`" in
+OS400*) os400=true;;
+esac
+
+# resolve links - $0 may be a softlink
+PRG="$0"
+
+while [ -h "$PRG" ] ; do
+  ls=`ls -ld "$PRG"`
+  link=`expr "$ls" : '.*-> \(.*\)$'`
+  if expr "$link" : '/.*' > /dev/null; then
+    PRG="$link"
+  else
+    PRG=`dirname "$PRG"`/"$link"
+  fi
+done
+
+PRGDIR=`dirname "$PRG"`
+EXECUTABLE=catalina.sh
+
+# Check that target executable exists
+if $os400; then
+  # -x will Only work on the os400 if the files are:
+  # 1. owned by the user
+  # 2. owned by the PRIMARY group of the user
+  # this will not work if the user belongs in secondary groups
+  eval
+else
+  if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then
+    echo "Cannot find $PRGDIR/$EXECUTABLE"
+    echo "The file is absent or does not have execute permission"
+    echo "This file is needed to run this program"
+    exit 1
+  fi
+fi
+
+exec "$PRGDIR"/"$EXECUTABLE" version "$@"
diff --git a/distribution/standalone/src/main/install/misc/tomcat/artifactory.xml b/tomcat/conf/Catalina/localhost/artifactory.xml
similarity index 100%
rename from distribution/standalone/src/main/install/misc/tomcat/artifactory.xml
rename to tomcat/conf/Catalina/localhost/artifactory.xml
diff --git a/tomcat/conf/catalina.policy b/tomcat/conf/catalina.policy
new file mode 100644
index 0000000..2822037
--- /dev/null
+++ b/tomcat/conf/catalina.policy
@@ -0,0 +1,260 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements.  See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// ============================================================================
+// catalina.policy - Security Policy Permissions for Tomcat
+//
+// This file contains a default set of security policies to be enforced (by the
+// JVM) when Catalina is executed with the "-security" option.  In addition
+// to the permissions granted here, the following additional permissions are
+// granted to each web application:
+//
+// * Read access to the web application's document root directory
+// * Read, write and delete access to the web application's working directory
+// ============================================================================
+
+
+// ========== SYSTEM CODE PERMISSIONS =========================================
+
+
+// These permissions apply to javac
+grant codeBase "file:${java.home}/lib/-" {
+        permission java.security.AllPermission;
+};
+
+// These permissions apply to all shared system extensions
+grant codeBase "file:${java.home}/jre/lib/ext/-" {
+        permission java.security.AllPermission;
+};
+
+// These permissions apply to javac when ${java.home] points at $JAVA_HOME/jre
+grant codeBase "file:${java.home}/../lib/-" {
+        permission java.security.AllPermission;
+};
+
+// These permissions apply to all shared system extensions when
+// ${java.home} points at $JAVA_HOME/jre
+grant codeBase "file:${java.home}/lib/ext/-" {
+        permission java.security.AllPermission;
+};
+
+
+// ========== CATALINA CODE PERMISSIONS =======================================
+
+
+// These permissions apply to the daemon code
+grant codeBase "file:${catalina.home}/bin/commons-daemon.jar" {
+        permission java.security.AllPermission;
+};
+
+// These permissions apply to the logging API
+// Note: If tomcat-juli.jar is in ${catalina.base} and not in ${catalina.home},
+// update this section accordingly.
+//  grant codeBase "file:${catalina.base}/bin/tomcat-juli.jar" {..}
+grant codeBase "file:${catalina.home}/bin/tomcat-juli.jar" {
+        permission java.io.FilePermission
+         "${java.home}${file.separator}lib${file.separator}logging.properties", "read";
+
+        permission java.io.FilePermission
+         "${catalina.base}${file.separator}conf${file.separator}logging.properties", "read";
+        permission java.io.FilePermission
+         "${catalina.base}${file.separator}logs", "read, write";
+        permission java.io.FilePermission
+         "${catalina.base}${file.separator}logs${file.separator}*", "read, write";
+
+        permission java.lang.RuntimePermission "shutdownHooks";
+        permission java.lang.RuntimePermission "getClassLoader";
+        permission java.lang.RuntimePermission "setContextClassLoader";
+
+        permission java.lang.management.ManagementPermission "monitor";
+
+        permission java.util.logging.LoggingPermission "control";
+
+        permission java.util.PropertyPermission "java.util.logging.config.class", "read";
+        permission java.util.PropertyPermission "java.util.logging.config.file", "read";
+        permission java.util.PropertyPermission "org.apache.juli.AsyncLoggerPollInterval", "read";
+        permission java.util.PropertyPermission "org.apache.juli.AsyncMaxRecordCount", "read";
+        permission java.util.PropertyPermission "org.apache.juli.AsyncOverflowDropType", "read";
+        permission java.util.PropertyPermission "org.apache.juli.ClassLoaderLogManager.debug", "read";
+        permission java.util.PropertyPermission "catalina.base", "read";
+
+        // Note: To enable per context logging configuration, permit read access to
+        // the appropriate file. Be sure that the logging configuration is
+        // secure before enabling such access.
+        // E.g. for the examples web application (uncomment and unwrap
+        // the following to be on a single line):
+        // permission java.io.FilePermission "${catalina.base}${file.separator}
+        //  webapps${file.separator}examples${file.separator}WEB-INF
+        //  ${file.separator}classes${file.separator}logging.properties", "read";
+};
+
+// These permissions apply to the server startup code
+grant codeBase "file:${catalina.home}/bin/bootstrap.jar" {
+        permission java.security.AllPermission;
+};
+
+// These permissions apply to the servlet API classes
+// and those that are shared across all class loaders
+// located in the "lib" directory
+grant codeBase "file:${catalina.home}/lib/-" {
+        permission java.security.AllPermission;
+};
+
+
+// If using a per instance lib directory, i.e. ${catalina.base}/lib,
+// then the following permission will need to be uncommented
+// grant codeBase "file:${catalina.base}/lib/-" {
+//         permission java.security.AllPermission;
+// };
+
+
+// ========== WEB APPLICATION PERMISSIONS =====================================
+
+
+// These permissions are granted by default to all web applications
+// In addition, a web application will be given a read FilePermission
+// for all files and directories in its document root.
+grant {
+    // Required for JNDI lookup of named JDBC DataSource's and
+    // javamail named MimePart DataSource used to send mail
+    permission java.util.PropertyPermission "java.home", "read";
+    permission java.util.PropertyPermission "java.naming.*", "read";
+    permission java.util.PropertyPermission "javax.sql.*", "read";
+
+    // OS Specific properties to allow read access
+    permission java.util.PropertyPermission "os.name", "read";
+    permission java.util.PropertyPermission "os.version", "read";
+    permission java.util.PropertyPermission "os.arch", "read";
+    permission java.util.PropertyPermission "file.separator", "read";
+    permission java.util.PropertyPermission "path.separator", "read";
+    permission java.util.PropertyPermission "line.separator", "read";
+
+    // JVM properties to allow read access
+    permission java.util.PropertyPermission "java.version", "read";
+    permission java.util.PropertyPermission "java.vendor", "read";
+    permission java.util.PropertyPermission "java.vendor.url", "read";
+    permission java.util.PropertyPermission "java.class.version", "read";
+    permission java.util.PropertyPermission "java.specification.version", "read";
+    permission java.util.PropertyPermission "java.specification.vendor", "read";
+    permission java.util.PropertyPermission "java.specification.name", "read";
+
+    permission java.util.PropertyPermission "java.vm.specification.version", "read";
+    permission java.util.PropertyPermission "java.vm.specification.vendor", "read";
+    permission java.util.PropertyPermission "java.vm.specification.name", "read";
+    permission java.util.PropertyPermission "java.vm.version", "read";
+    permission java.util.PropertyPermission "java.vm.vendor", "read";
+    permission java.util.PropertyPermission "java.vm.name", "read";
+
+    // Required for OpenJMX
+    permission java.lang.RuntimePermission "getAttribute";
+
+    // Allow read of JAXP compliant XML parser debug
+    permission java.util.PropertyPermission "jaxp.debug", "read";
+
+    // All JSPs need to be able to read this package
+    permission java.lang.RuntimePermission "accessClassInPackage.org.apache.tomcat";
+
+    // Precompiled JSPs need access to these packages.
+    permission java.lang.RuntimePermission "accessClassInPackage.org.apache.jasper.el";
+    permission java.lang.RuntimePermission "accessClassInPackage.org.apache.jasper.runtime";
+    permission java.lang.RuntimePermission
+     "accessClassInPackage.org.apache.jasper.runtime.*";
+
+    // Precompiled JSPs need access to these system properties.
+    permission java.util.PropertyPermission
+     "org.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER", "read";
+    permission java.util.PropertyPermission
+     "org.apache.el.parser.COERCE_TO_ZERO", "read";
+
+    // The cookie code needs these.
+    permission java.util.PropertyPermission
+     "org.apache.catalina.STRICT_SERVLET_COMPLIANCE", "read";
+    permission java.util.PropertyPermission
+     "org.apache.tomcat.util.http.ServerCookie.STRICT_NAMING", "read";
+    permission java.util.PropertyPermission
+     "org.apache.tomcat.util.http.ServerCookie.FWD_SLASH_IS_SEPARATOR", "read";
+
+    // Applications using Comet need to be able to access this package
+    permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.comet";
+
+    // Applications using WebSocket need to be able to access these packages
+    permission java.lang.RuntimePermission "accessClassInPackage.org.apache.tomcat.websocket";
+    permission java.lang.RuntimePermission "accessClassInPackage.org.apache.tomcat.websocket.server";
+};
+
+
+// The Manager application needs access to the following packages to support the
+// session display functionality. These settings support the following
+// configurations:
+// - default CATALINA_HOME == CATALINA_BASE
+// - CATALINA_HOME != CATALINA_BASE, per instance Manager in CATALINA_BASE
+// - CATALINA_HOME != CATALINA_BASE, shared Manager in CATALINA_HOME
+grant codeBase "file:${catalina.base}/webapps/manager/-" {
+    permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina";
+    permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.ha.session";
+    permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.manager";
+    permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.manager.util";
+    permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.util";
+};
+grant codeBase "file:${catalina.home}/webapps/manager/-" {
+    permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina";
+    permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.ha.session";
+    permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.manager";
+    permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.manager.util";
+    permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.util";
+};
+
+// You can assign additional permissions to particular web applications by
+// adding additional "grant" entries here, based on the code base for that
+// application, /WEB-INF/classes/, or /WEB-INF/lib/ jar files.
+//
+// Different permissions can be granted to JSP pages, classes loaded from
+// the /WEB-INF/classes/ directory, all jar files in the /WEB-INF/lib/
+// directory, or even to individual jar files in the /WEB-INF/lib/ directory.
+//
+// For instance, assume that the standard "examples" application
+// included a JDBC driver that needed to establish a network connection to the
+// corresponding database and used the scrape taglib to get the weather from
+// the NOAA web server.  You might create a "grant" entries like this:
+//
+// The permissions granted to the context root directory apply to JSP pages.
+// grant codeBase "file:${catalina.base}/webapps/examples/-" {
+//      permission java.net.SocketPermission "dbhost.mycompany.com:5432", "connect";
+//      permission java.net.SocketPermission "*.noaa.gov:80", "connect";
+// };
+//
+// The permissions granted to the context WEB-INF/classes directory
+// grant codeBase "file:${catalina.base}/webapps/examples/WEB-INF/classes/-" {
+// };
+//
+// The permission granted to your JDBC driver
+// grant codeBase "jar:file:${catalina.base}/webapps/examples/WEB-INF/lib/driver.jar!/-" {
+//      permission java.net.SocketPermission "dbhost.mycompany.com:5432", "connect";
+// };
+// The permission granted to the scrape taglib
+// grant codeBase "jar:file:${catalina.base}/webapps/examples/WEB-INF/lib/scrape.jar!/-" {
+//      permission java.net.SocketPermission "*.noaa.gov:80", "connect";
+// };
+
+// To grant permissions for web applications using packed WAR files, use the
+// Tomcat specific WAR url scheme.
+//
+// The permissions granted to the entire web application
+// grant codeBase "war:file:${catalina.base}/webapps/examples.war*/-" {
+// };
+//
+// The permissions granted to a specific JAR
+// grant codeBase "war:file:${catalina.base}/webapps/examples.war*/WEB-INF/lib/foo.jar" {
+// };
\ No newline at end of file
diff --git a/tomcat/conf/catalina.properties b/tomcat/conf/catalina.properties
new file mode 100644
index 0000000..ce515a0
--- /dev/null
+++ b/tomcat/conf/catalina.properties
@@ -0,0 +1,146 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# List of comma-separated packages that start with or equal this string
+# will cause a security exception to be thrown when
+# passed to checkPackageAccess unless the
+# corresponding RuntimePermission ("accessClassInPackage."+package) has
+# been granted.
+package.access=sun.,org.apache.catalina.,org.apache.coyote.,org.apache.jasper.,org.apache.tomcat.
+#
+# List of comma-separated packages that start with or equal this string
+# will cause a security exception to be thrown when
+# passed to checkPackageDefinition unless the
+# corresponding RuntimePermission ("defineClassInPackage."+package) has
+# been granted.
+#
+# by default, no packages are restricted for definition, and none of
+# the class loaders supplied with the JDK call checkPackageDefinition.
+#
+package.definition=sun.,java.,org.apache.catalina.,org.apache.coyote.,\
+org.apache.jasper.,org.apache.naming.,org.apache.tomcat.
+
+#
+#
+# List of comma-separated paths defining the contents of the "common"
+# classloader. Prefixes should be used to define what is the repository type.
+# Path may be relative to the CATALINA_HOME or CATALINA_BASE path or absolute.
+# If left as blank,the JVM system loader will be used as Catalina's "common"
+# loader.
+# Examples:
+#     "foo": Add this folder as a class repository
+#     "foo/*.jar": Add all the JARs of the specified folder as class
+#                  repositories
+#     "foo/bar.jar": Add bar.jar as a class repository
+#
+# Note: Values are enclosed in double quotes ("...") in case either the
+#       ${catalina.base} path or the ${catalina.home} path contains a comma.
+#       Because double quotes are used for quoting, the double quote character
+#       may not appear in a path.
+common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.home}/lib","${catalina.home}/lib/*.jar"
+
+#
+# List of comma-separated paths defining the contents of the "server"
+# classloader. Prefixes should be used to define what is the repository type.
+# Path may be relative to the CATALINA_HOME or CATALINA_BASE path or absolute.
+# If left as blank, the "common" loader will be used as Catalina's "server"
+# loader.
+# Examples:
+#     "foo": Add this folder as a class repository
+#     "foo/*.jar": Add all the JARs of the specified folder as class
+#                  repositories
+#     "foo/bar.jar": Add bar.jar as a class repository
+#
+# Note: Values may be enclosed in double quotes ("...") in case either the
+#       ${catalina.base} path or the ${catalina.home} path contains a comma.
+#       Because double quotes are used for quoting, the double quote character
+#       may not appear in a path.
+server.loader=
+
+#
+# List of comma-separated paths defining the contents of the "shared"
+# classloader. Prefixes should be used to define what is the repository type.
+# Path may be relative to the CATALINA_BASE path or absolute. If left as blank,
+# the "common" loader will be used as Catalina's "shared" loader.
+# Examples:
+#     "foo": Add this folder as a class repository
+#     "foo/*.jar": Add all the JARs of the specified folder as class
+#                  repositories
+#     "foo/bar.jar": Add bar.jar as a class repository
+# Please note that for single jars, e.g. bar.jar, you need the URL form
+# starting with file:.
+#
+# Note: Values may be enclosed in double quotes ("...") in case either the
+#       ${catalina.base} path or the ${catalina.home} path contains a comma.
+#       Because double quotes are used for quoting, the double quote character
+#       may not appear in a path.
+shared.loader=
+
+# Default list of JAR files that should not be scanned using the JarScanner
+# functionality. This is typically used to scan JARs for configuration
+# information. JARs that do not contain such information may be excluded from
+# the scan to speed up the scanning process. This is the default list. JARs on
+# this list are excluded from all scans. The list must be a comma separated list
+# of JAR file names.
+# The list of JARs to skip may be over-ridden at a Context level for individual
+# scan types by configuring a JarScanner with a nested JarScanFilter.
+# The JARs listed below include:
+# - Tomcat Bootstrap JARs
+# - Tomcat API JARs
+# - Catalina JARs
+# - Jasper JARs
+# - Tomcat JARs
+# - Common non-Tomcat JARs
+# - Test JARs (JUnit, Cobertura and dependencies)
+tomcat.util.scan.StandardJarScanFilter.jarsToSkip=\
+bootstrap.jar,commons-daemon.jar,tomcat-juli.jar,\
+annotations-api.jar,el-api.jar,jsp-api.jar,servlet-api.jar,websocket-api.jar,\
+catalina.jar,catalina-ant.jar,catalina-ha.jar,catalina-storeconfig.jar,\
+catalina-tribes.jar,\
+jasper.jar,jasper-el.jar,ecj-*.jar,\
+tomcat-api.jar,tomcat-util.jar,tomcat-util-scan.jar,tomcat-coyote.jar,\
+tomcat-dbcp.jar,tomcat-jni.jar,tomcat-websocket.jar,\
+tomcat-i18n-en.jar,tomcat-i18n-es.jar,tomcat-i18n-fr.jar,tomcat-i18n-ja.jar,\
+tomcat-juli-adapters.jar,catalina-jmx-remote.jar,catalina-ws.jar,\
+tomcat-jdbc.jar,\
+tools.jar,\
+commons-beanutils*.jar,commons-codec*.jar,commons-collections*.jar,\
+commons-dbcp*.jar,commons-digester*.jar,commons-fileupload*.jar,\
+commons-httpclient*.jar,commons-io*.jar,commons-lang*.jar,commons-logging*.jar,\
+commons-math*.jar,commons-pool*.jar,\
+jstl.jar,taglibs-standard-spec-*.jar,\
+geronimo-spec-jaxrpc*.jar,wsdl4j*.jar,\
+ant.jar,ant-junit*.jar,aspectj*.jar,jmx.jar,h2*.jar,hibernate*.jar,httpclient*.jar,\
+jmx-tools.jar,jta*.jar,log4j*.jar,mail*.jar,slf4j*.jar,\
+xercesImpl.jar,xmlParserAPIs.jar,xml-apis.jar,\
+junit.jar,junit-*.jar,ant-launcher.jar,\
+cobertura-*.jar,asm-*.jar,dom4j-*.jar,icu4j-*.jar,jaxen-*.jar,jdom-*.jar,\
+jetty-*.jar,oro-*.jar,servlet-api-*.jar,tagsoup-*.jar,xmlParserAPIs-*.jar,\
+xom-*.jar
+
+# Default list of JAR files that should be scanned that overrides the default
+# jarsToSkip list above. This is typically used to include a specific JAR that
+# has been excluded by a broad file name pattern in the jarsToSkip list.
+# The list of JARs to scan may be over-ridden at a Context level for individual
+# scan types by configuring a JarScanner with a nested JarScanFilter.
+tomcat.util.scan.StandardJarScanFilter.jarsToScan=\
+log4j-web*.jar,log4j-taglib*.jar,log4javascript*.jar,slf4j-taglib*.jar
+
+# String cache configuration.
+tomcat.util.buf.StringCache.byte.enabled=true
+#tomcat.util.buf.StringCache.char.enabled=true
+#tomcat.util.buf.StringCache.trainThreshold=500000
+#tomcat.util.buf.StringCache.cacheSize=5000
diff --git a/distribution/standalone/src/main/install/misc/tomcat/logging.properties b/tomcat/conf/logging.properties
similarity index 100%
rename from distribution/standalone/src/main/install/misc/tomcat/logging.properties
rename to tomcat/conf/logging.properties
diff --git a/distribution/standalone/src/main/install/misc/tomcat/server.xml b/tomcat/conf/server.xml
similarity index 100%
rename from distribution/standalone/src/main/install/misc/tomcat/server.xml
rename to tomcat/conf/server.xml
diff --git a/tomcat/conf/web.xml b/tomcat/conf/web.xml
new file mode 100644
index 0000000..c0b5459
--- /dev/null
+++ b/tomcat/conf/web.xml
@@ -0,0 +1,4612 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<web-app xmlns="http://java.sun.com/xml/ns/javaee"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
+                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
+         version="3.0">
+
+    <!-- ======================== Introduction ============================== -->
+    <!-- This document defines default values for *all* web applications      -->
+    <!-- loaded into this instance of Tomcat.  As each application is         -->
+    <!-- deployed, this file is processed, followed by the                    -->
+    <!-- "/WEB-INF/web.xml" deployment descriptor from your own               -->
+    <!-- applications.                                                        -->
+    <!--                                                                      -->
+    <!-- WARNING:  Do not configure application-specific resources here!      -->
+    <!-- They should go in the "/WEB-INF/web.xml" file in your application.   -->
+
+
+    <!-- ================== Built In Servlet Definitions ==================== -->
+
+
+    <!-- The default servlet for all web applications, that serves static     -->
+    <!-- resources.  It processes all requests that are not mapped to other   -->
+    <!-- servlets with servlet mappings (defined either here or in your own   -->
+    <!-- web.xml file).  This servlet supports the following initialization   -->
+    <!-- parameters (default values are in square brackets):                  -->
+    <!--                                                                      -->
+    <!--   debug               Debugging detail level for messages logged     -->
+    <!--                       by this servlet.  [0]                          -->
+    <!--                                                                      -->
+    <!--   fileEncoding        Encoding to be used to read static resources   -->
+    <!--                       [platform default]                             -->
+    <!--                                                                      -->
+    <!--   input               Input buffer size (in bytes) when reading      -->
+    <!--                       resources to be served.  [2048]                -->
+    <!--                                                                      -->
+    <!--   listings            Should directory listings be produced if there -->
+    <!--                       is no welcome file in this directory?  [false] -->
+    <!--                       WARNING: Listings for directories with many    -->
+    <!--                       entries can be slow and may consume            -->
+    <!--                       significant proportions of server resources.   -->
+    <!--                                                                      -->
+    <!--   output              Output buffer size (in bytes) when writing     -->
+    <!--                       resources to be served.  [2048]                -->
+    <!--                                                                      -->
+    <!--   readonly            Is this context "read only", so HTTP           -->
+    <!--                       commands like PUT and DELETE are               -->
+    <!--                       rejected?  [true]                              -->
+    <!--                                                                      -->
+    <!--   readmeFile          File to display together with the directory    -->
+    <!--                       contents. [null]                               -->
+    <!--                                                                      -->
+    <!--   sendfileSize        If the connector used supports sendfile, this  -->
+    <!--                       represents the minimal file size in KB for     -->
+    <!--                       which sendfile will be used. Use a negative    -->
+    <!--                       value to always disable sendfile.  [48]        -->
+    <!--                                                                      -->
+    <!--   useAcceptRanges     Should the Accept-Ranges header be included    -->
+    <!--                       in responses where appropriate? [true]         -->
+    <!--                                                                      -->
+    <!--  For directory listing customization. Checks localXsltFile, then     -->
+    <!--  globalXsltFile, then defaults to original behavior.                 -->
+    <!--                                                                      -->
+    <!--   localXsltFile       Make directory listings an XML doc and         -->
+    <!--                       pass the result to this style sheet residing   -->
+    <!--                       in that directory. This overrides              -->
+    <!--                       contextXsltFile and globalXsltFile[null]       -->
+    <!--                                                                      -->
+    <!--   contextXsltFile     Make directory listings an XML doc and         -->
+    <!--                       pass the result to this style sheet which is   -->
+    <!--                       relative to the context root. This overrides   -->
+    <!--                       globalXsltFile[null]                           -->
+    <!--                                                                      -->
+    <!--   globalXsltFile      Site wide configuration version of             -->
+    <!--                       localXsltFile This argument is expected        -->
+    <!--                       to be a physical file. [null]                  -->
+    <!--                                                                      -->
+    <!--                                                                      -->
+
+    <servlet>
+        <servlet-name>default</servlet-name>
+        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
+        <init-param>
+            <param-name>debug</param-name>
+            <param-value>0</param-value>
+        </init-param>
+        <init-param>
+            <param-name>listings</param-name>
+            <param-value>false</param-value>
+        </init-param>
+        <load-on-startup>1</load-on-startup>
+    </servlet>
+
+
+    <!-- The JSP page compiler and execution servlet, which is the mechanism  -->
+    <!-- used by Tomcat to support JSP pages.  Traditionally, this servlet    -->
+    <!-- is mapped to the URL pattern "*.jsp".  This servlet supports the     -->
+    <!-- following initialization parameters (default values are in square    -->
+    <!-- brackets):                                                           -->
+    <!--                                                                      -->
+    <!--   checkInterval       If development is false and checkInterval is   -->
+    <!--                       greater than zero, background compilations are -->
+    <!--                       enabled. checkInterval is the time in seconds  -->
+    <!--                       between checks to see if a JSP page (and its   -->
+    <!--                       dependent files) needs to  be recompiled. [0]  -->
+    <!--                                                                      -->
+    <!--   classdebuginfo      Should the class file be compiled with         -->
+    <!--                       debugging information?  [true]                 -->
+    <!--                                                                      -->
+    <!--   classpath           What class path should I use while compiling   -->
+    <!--                       generated servlets?  [Created dynamically      -->
+    <!--                       based on the current web application]          -->
+    <!--                                                                      -->
+    <!--   compiler            Which compiler Ant should use to compile JSP   -->
+    <!--                       pages.  See the jasper documentation for more  -->
+    <!--                       information.                                   -->
+    <!--                                                                      -->
+    <!--   compilerSourceVM    Compiler source VM. [1.6]                      -->
+    <!--                                                                      -->
+    <!--   compilerTargetVM    Compiler target VM. [1.6]                      -->
+    <!--                                                                      -->
+    <!--   development         Is Jasper used in development mode? If true,   -->
+    <!--                       the frequency at which JSPs are checked for    -->
+    <!--                       modification may be specified via the          -->
+    <!--                       modificationTestInterval parameter. [true]     -->
+    <!--                                                                      -->
+    <!--   displaySourceFragment                                              -->
+    <!--                       Should a source fragment be included in        -->
+    <!--                       exception messages? [true]                     -->
+    <!--                                                                      -->
+    <!--   dumpSmap            Should the SMAP info for JSR45 debugging be    -->
+    <!--                       dumped to a file? [false]                      -->
+    <!--                       False if suppressSmap is true                  -->
+    <!--                                                                      -->
+    <!--   enablePooling       Determines whether tag handler pooling is      -->
+    <!--                       enabled. This is a compilation option. It will -->
+    <!--                       not alter the behaviour of JSPs that have      -->
+    <!--                       already been compiled. [true]                  -->
+    <!--                                                                      -->
+    <!--   engineOptionsClass  Allows specifying the Options class used to    -->
+    <!--                       configure Jasper. If not present, the default  -->
+    <!--                       EmbeddedServletOptions will be used.           -->
+    <!--                                                                      -->
+    <!--   errorOnUseBeanInvalidClassAttribute                                -->
+    <!--                       Should Jasper issue an error when the value of -->
+    <!--                       the class attribute in an useBean action is    -->
+    <!--                       not a valid bean class?  [true]                -->
+    <!--                                                                      -->
+    <!--   fork                Tell Ant to fork compiles of JSP pages so that -->
+    <!--                       a separate JVM is used for JSP page compiles   -->
+    <!--                       from the one Tomcat is running in. [true]      -->
+    <!--                                                                      -->
+    <!--   genStringAsCharArray                                               -->
+    <!--                       Should text strings be generated as char       -->
+    <!--                       arrays, to improve performance in some cases?  -->
+    <!--                       [false]                                        -->
+    <!--                                                                      -->
+    <!--   ieClassId           The class-id value to be sent to Internet      -->
+    <!--                       Explorer when using <jsp:plugin> tags.         -->
+    <!--                       [clsid:8AD9C840-044E-11D1-B3E9-00805F499D93]   -->
+    <!--                                                                      -->
+    <!--   javaEncoding        Java file encoding to use for generating java  -->
+    <!--                       source files. [UTF8]                           -->
+    <!--                                                                      -->
+    <!--   keepgenerated       Should we keep the generated Java source code  -->
+    <!--                       for each page instead of deleting it? [true]   -->
+    <!--                                                                      -->
+    <!--   mappedfile          Should we generate static content with one     -->
+    <!--                       print statement per input line, to ease        -->
+    <!--                       debugging?  [true]                             -->
+    <!--                                                                      -->
+    <!--   maxLoadedJsps       The maximum number of JSPs that will be loaded -->
+    <!--                       for a web application. If more than this       -->
+    <!--                       number of JSPs are loaded, the least recently  -->
+    <!--                       used JSPs will be unloaded so that the number  -->
+    <!--                       of JSPs loaded at any one time does not exceed -->
+    <!--                       this limit. A value of zero or less indicates  -->
+    <!--                       no limit. [-1]                                 -->
+    <!--                                                                      -->
+    <!--   jspIdleTimeout      The amount of time in seconds a JSP can be     -->
+    <!--                       idle before it is unloaded. A value of zero    -->
+    <!--                       or less indicates never unload. [-1]           -->
+    <!--                                                                      -->
+    <!--   modificationTestInterval                                           -->
+    <!--                       Causes a JSP (and its dependent files) to not  -->
+    <!--                       be checked for modification during the         -->
+    <!--                       specified time interval (in seconds) from the  -->
+    <!--                       last time the JSP was checked for              -->
+    <!--                       modification. A value of 0 will cause the JSP  -->
+    <!--                       to be checked on every access.                 -->
+    <!--                       Used in development mode only. [4]             -->
+    <!--                                                                      -->
+    <!--   recompileOnFail     If a JSP compilation fails should the          -->
+    <!--                       modificationTestInterval be ignored and the    -->
+    <!--                       next access trigger a re-compilation attempt?  -->
+    <!--                       Used in development mode only and is disabled  -->
+    <!--                       by default as compilation may be expensive and -->
+    <!--                       could lead to excessive resource usage.        -->
+    <!--                       [false]                                        -->
+    <!--                                                                      -->
+    <!--   scratchdir          What scratch directory should we use when      -->
+    <!--                       compiling JSP pages?  [default work directory  -->
+    <!--                       for the current web application]               -->
+    <!--                                                                      -->
+    <!--   suppressSmap        Should the generation of SMAP info for JSR45   -->
+    <!--                       debugging be suppressed?  [false]              -->
+    <!--                                                                      -->
+    <!--   trimSpaces          Should white spaces in template text between   -->
+    <!--                       actions or directives be trimmed?  [false]     -->
+    <!--                                                                      -->
+    <!--   xpoweredBy          Determines whether X-Powered-By response       -->
+    <!--                       header is added by generated servlet.  [false] -->
+
+    <!--
+        <servlet>
+            <servlet-name>jsp</servlet-name>
+            <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
+            <init-param>
+                <param-name>fork</param-name>
+                <param-value>false</param-value>
+            </init-param>
+            <init-param>
+                <param-name>xpoweredBy</param-name>
+                <param-value>false</param-value>
+            </init-param>
+            <load-on-startup>3</load-on-startup>
+        </servlet>
+    -->
+
+    <!-- NOTE: An SSI Filter is also available as an alternative SSI          -->
+    <!-- implementation. Use either the Servlet or the Filter but NOT both.   -->
+    <!--                                                                      -->
+    <!-- Server Side Includes processing servlet, which processes SSI         -->
+    <!-- directives in HTML pages consistent with similar support in web      -->
+    <!-- servers like Apache.  Traditionally, this servlet is mapped to the   -->
+    <!-- URL pattern "*.shtml".  This servlet supports the following          -->
+    <!-- initialization parameters (default values are in square brackets):   -->
+    <!--                                                                      -->
+    <!--   buffered            Should output from this servlet be buffered?   -->
+    <!--                       (0=false, 1=true)  [0]                         -->
+    <!--                                                                      -->
+    <!--   debug               Debugging detail level for messages logged     -->
+    <!--                       by this servlet.  [0]                          -->
+    <!--                                                                      -->
+    <!--   expires             The number of seconds before a page with SSI   -->
+    <!--                       directives will expire.  [No default]          -->
+    <!--                                                                      -->
+    <!--   isVirtualWebappRelative                                            -->
+    <!--                       Should "virtual" paths be interpreted as       -->
+    <!--                       relative to the context root, instead of       -->
+    <!--                       the server root? [false]                       -->
+    <!--                                                                      -->
+    <!--   inputEncoding       The encoding to assume for SSI resources if    -->
+    <!--                       one is not available from the resource.        -->
+    <!--                       [Platform default]                             -->
+    <!--                                                                      -->
+    <!--   outputEncoding      The encoding to use for the page that results  -->
+    <!--                       from the SSI processing. [UTF-8]               -->
+    <!--                                                                      -->
+    <!--   allowExec           Is use of the exec command enabled? [false]    -->
+
+    <!--
+        <servlet>
+            <servlet-name>ssi</servlet-name>
+            <servlet-class>
+              org.apache.catalina.ssi.SSIServlet
+            </servlet-class>
+            <init-param>
+              <param-name>buffered</param-name>
+              <param-value>1</param-value>
+            </init-param>
+            <init-param>
+              <param-name>debug</param-name>
+              <param-value>0</param-value>
+            </init-param>
+            <init-param>
+              <param-name>expires</param-name>
+              <param-value>666</param-value>
+            </init-param>
+            <init-param>
+              <param-name>isVirtualWebappRelative</param-name>
+              <param-value>false</param-value>
+            </init-param>
+            <load-on-startup>4</load-on-startup>
+        </servlet>
+    -->
+
+
+    <!-- Common Gateway Includes (CGI) processing servlet, which supports     -->
+    <!-- execution of external applications that conform to the CGI spec      -->
+    <!-- requirements.  Typically, this servlet is mapped to the URL pattern  -->
+    <!-- "/cgi-bin/*", which means that any CGI applications that are         -->
+    <!-- executed must be present within the web application.  This servlet   -->
+    <!-- supports the following initialization parameters (default values     -->
+    <!-- are in square brackets):                                             -->
+    <!--                                                                      -->
+    <!--   cgiPathPrefix        The CGI search path will start at             -->
+    <!--                        webAppRootDir + File.separator + this prefix. -->
+    <!--                        [WEB-INF/cgi]                                 -->
+    <!--                                                                      -->
+    <!--   debug                Debugging detail level for messages logged    -->
+    <!--                        by this servlet.  [0]                         -->
+    <!--                                                                      -->
+    <!--   executable           Name of the executable used to run the        -->
+    <!--                        script. [perl]                                -->
+    <!--                                                                      -->
+    <!--   parameterEncoding    Name of parameter encoding to be used with    -->
+    <!--                        CGI servlet.                                  -->
+    <!--                        [System.getProperty("file.encoding","UTF-8")] -->
+    <!--                                                                      -->
+    <!--   passShellEnvironment Should the shell environment variables (if    -->
+    <!--                        any) be passed to the CGI script? [false]     -->
+    <!--                                                                      -->
+    <!--   stderrTimeout        The time (in milliseconds) to wait for the    -->
+    <!--                        reading of stderr to complete before          -->
+    <!--                        terminating the CGI process. [2000]           -->
+
+    <!--
+        <servlet>
+            <servlet-name>cgi</servlet-name>
+            <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
+            <init-param>
+              <param-name>debug</param-name>
+              <param-value>0</param-value>
+            </init-param>
+            <init-param>
+              <param-name>cgiPathPrefix</param-name>
+              <param-value>WEB-INF/cgi</param-value>
+            </init-param>
+             <load-on-startup>5</load-on-startup>
+        </servlet>
+    -->
+
+
+    <!-- ================ Built In Servlet Mappings ========================= -->
+
+
+    <!-- The servlet mappings for the built in servlets defined above.  Note  -->
+    <!-- that, by default, the CGI and SSI servlets are *not* mapped.  You    -->
+    <!-- must uncomment these mappings (or add them to your application's own -->
+    <!-- web.xml deployment descriptor) to enable these services              -->
+
+    <!-- The mapping for the default servlet -->
+    <servlet-mapping>
+        <servlet-name>default</servlet-name>
+        <url-pattern>/</url-pattern>
+    </servlet-mapping>
+
+    <!-- The mappings for the JSP servlet -->
+    <!--
+        <servlet-mapping>
+            <servlet-name>jsp</servlet-name>
+            <url-pattern>*.jsp</url-pattern>
+            <url-pattern>*.jspx</url-pattern>
+        </servlet-mapping>
+    -->
+
+    <!-- The mapping for the SSI servlet -->
+    <!--
+        <servlet-mapping>
+            <servlet-name>ssi</servlet-name>
+            <url-pattern>*.shtml</url-pattern>
+        </servlet-mapping>
+    -->
+
+    <!-- The mapping for the CGI Gateway servlet -->
+
+    <!--
+        <servlet-mapping>
+            <servlet-name>cgi</servlet-name>
+            <url-pattern>/cgi-bin/*</url-pattern>
+        </servlet-mapping>
+    -->
+
+
+    <!-- ================== Built In Filter Definitions ===================== -->
+
+    <!-- A filter that sets character encoding that is used to decode -->
+    <!-- parameters in a POST request -->
+    <!--
+        <filter>
+            <filter-name>setCharacterEncodingFilter</filter-name>
+            <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
+            <init-param>
+                <param-name>encoding</param-name>
+                <param-value>UTF-8</param-value>
+            </init-param>
+            <async-supported>true</async-supported>
+        </filter>
+    -->
+
+    <!-- A filter that triggers request parameters parsing and rejects the    -->
+    <!-- request if some parameters were skipped because of parsing errors or -->
+    <!-- request size limitations.                                            -->
+    <!--
+        <filter>
+            <filter-name>failedRequestFilter</filter-name>
+            <filter-class>
+              org.apache.catalina.filters.FailedRequestFilter
+            </filter-class>
+            <async-supported>true</async-supported>
+        </filter>
+    -->
+
+
+    <!-- NOTE: An SSI Servlet is also available as an alternative SSI         -->
+    <!-- implementation. Use either the Servlet or the Filter but NOT both.   -->
+    <!--                                                                      -->
+    <!-- Server Side Includes processing filter, which processes SSI          -->
+    <!-- directives in HTML pages consistent with similar support in web      -->
+    <!-- servers like Apache.  Traditionally, this filter is mapped to the    -->
+    <!-- URL pattern "*.shtml", though it can be mapped to "*" as it will     -->
+    <!-- selectively enable/disable SSI processing based on mime types. For   -->
+    <!-- this to work you will need to uncomment the .shtml mime type         -->
+    <!-- definition towards the bottom of this file.                          -->
+    <!-- The contentType init param allows you to apply SSI processing to JSP -->
+    <!-- pages, javascript, or any other content you wish.  This filter       -->
+    <!-- supports the following initialization parameters (default values are -->
+    <!-- in square brackets):                                                 -->
+    <!--                                                                      -->
+    <!--   contentType         A regex pattern that must be matched before    -->
+    <!--                       SSI processing is applied.                     -->
+    <!--                       [text/x-server-parsed-html(;.*)?]              -->
+    <!--                                                                      -->
+    <!--   debug               Debugging detail level for messages logged     -->
+    <!--                       by this servlet.  [0]                          -->
+    <!--                                                                      -->
+    <!--   expires             The number of seconds before a page with SSI   -->
+    <!--                       directives will expire.  [No default]          -->
+    <!--                                                                      -->
+    <!--   isVirtualWebappRelative                                            -->
+    <!--                       Should "virtual" paths be interpreted as       -->
+    <!--                       relative to the context root, instead of       -->
+    <!--                       the server root? [false]                       -->
+    <!--                                                                      -->
+    <!--   allowExec           Is use of the exec command enabled? [false]    -->
+
+    <!--
+        <filter>
+            <filter-name>ssi</filter-name>
+            <filter-class>
+              org.apache.catalina.ssi.SSIFilter
+            </filter-class>
+            <init-param>
+              <param-name>contentType</param-name>
+              <param-value>text/x-server-parsed-html(;.*)?</param-value>
+            </init-param>
+            <init-param>
+              <param-name>debug</param-name>
+              <param-value>0</param-value>
+            </init-param>
+            <init-param>
+              <param-name>expires</param-name>
+              <param-value>666</param-value>
+            </init-param>
+            <init-param>
+              <param-name>isVirtualWebappRelative</param-name>
+              <param-value>false</param-value>
+            </init-param>
+        </filter>
+    -->
+
+
+    <!-- ==================== Built In Filter Mappings ====================== -->
+
+    <!-- The mapping for the Set Character Encoding Filter -->
+    <!--
+        <filter-mapping>
+            <filter-name>setCharacterEncodingFilter</filter-name>
+            <url-pattern>/*</url-pattern>
+        </filter-mapping>
+    -->
+
+    <!-- The mapping for the Failed Request Filter -->
+    <!--
+        <filter-mapping>
+            <filter-name>failedRequestFilter</filter-name>
+            <url-pattern>/*</url-pattern>
+        </filter-mapping>
+    -->
+
+    <!-- The mapping for the SSI Filter -->
+    <!--
+        <filter-mapping>
+            <filter-name>ssi</filter-name>
+            <url-pattern>*.shtml</url-pattern>
+        </filter-mapping>
+    -->
+
+
+    <!-- ==================== Default Session Configuration ================= -->
+    <!-- You can set the default session timeout (in minutes) for all newly   -->
+    <!-- created sessions by modifying the value below.                       -->
+
+    <session-config>
+        <session-timeout>30</session-timeout>
+    </session-config>
+
+
+    <!-- ===================== Default MIME Type Mappings =================== -->
+    <!-- When serving static resources, Tomcat will automatically generate    -->
+    <!-- a "Content-Type" header based on the resource's filename extension,  -->
+    <!-- based on these mappings.  Additional mappings can be added here (to  -->
+    <!-- apply to all web applications), or in your own application's web.xml -->
+    <!-- deployment descriptor.                                               -->
+
+    <mime-mapping>
+        <extension>123</extension>
+        <mime-type>application/vnd.lotus-1-2-3</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>3dml</extension>
+        <mime-type>text/vnd.in3d.3dml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>3ds</extension>
+        <mime-type>image/x-3ds</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>3g2</extension>
+        <mime-type>video/3gpp2</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>3gp</extension>
+        <mime-type>video/3gpp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>7z</extension>
+        <mime-type>application/x-7z-compressed</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>aab</extension>
+        <mime-type>application/x-authorware-bin</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>aac</extension>
+        <mime-type>audio/x-aac</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>aam</extension>
+        <mime-type>application/x-authorware-map</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>aas</extension>
+        <mime-type>application/x-authorware-seg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>abs</extension>
+        <mime-type>audio/x-mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>abw</extension>
+        <mime-type>application/x-abiword</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ac</extension>
+        <mime-type>application/pkix-attr-cert</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>acc</extension>
+        <mime-type>application/vnd.americandynamics.acc</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ace</extension>
+        <mime-type>application/x-ace-compressed</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>acu</extension>
+        <mime-type>application/vnd.acucobol</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>acutc</extension>
+        <mime-type>application/vnd.acucorp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>adp</extension>
+        <mime-type>audio/adpcm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>aep</extension>
+        <mime-type>application/vnd.audiograph</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>afm</extension>
+        <mime-type>application/x-font-type1</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>afp</extension>
+        <mime-type>application/vnd.ibm.modcap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ahead</extension>
+        <mime-type>application/vnd.ahead.space</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ai</extension>
+        <mime-type>application/postscript</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>aif</extension>
+        <mime-type>audio/x-aiff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>aifc</extension>
+        <mime-type>audio/x-aiff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>aiff</extension>
+        <mime-type>audio/x-aiff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>aim</extension>
+        <mime-type>application/x-aim</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>air</extension>
+        <mime-type>application/vnd.adobe.air-application-installer-package+zip</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ait</extension>
+        <mime-type>application/vnd.dvb.ait</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ami</extension>
+        <mime-type>application/vnd.amiga.ami</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>anx</extension>
+        <mime-type>application/annodex</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>apk</extension>
+        <mime-type>application/vnd.android.package-archive</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>appcache</extension>
+        <mime-type>text/cache-manifest</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>application</extension>
+        <mime-type>application/x-ms-application</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>apr</extension>
+        <mime-type>application/vnd.lotus-approach</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>arc</extension>
+        <mime-type>application/x-freearc</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>art</extension>
+        <mime-type>image/x-jg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>asc</extension>
+        <mime-type>application/pgp-signature</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>asf</extension>
+        <mime-type>video/x-ms-asf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>asm</extension>
+        <mime-type>text/x-asm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>aso</extension>
+        <mime-type>application/vnd.accpac.simply.aso</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>asx</extension>
+        <mime-type>video/x-ms-asf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>atc</extension>
+        <mime-type>application/vnd.acucorp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>atom</extension>
+        <mime-type>application/atom+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>atomcat</extension>
+        <mime-type>application/atomcat+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>atomsvc</extension>
+        <mime-type>application/atomsvc+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>atx</extension>
+        <mime-type>application/vnd.antix.game-component</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>au</extension>
+        <mime-type>audio/basic</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>avi</extension>
+        <mime-type>video/x-msvideo</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>avx</extension>
+        <mime-type>video/x-rad-screenplay</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>aw</extension>
+        <mime-type>application/applixware</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>axa</extension>
+        <mime-type>audio/annodex</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>axv</extension>
+        <mime-type>video/annodex</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>azf</extension>
+        <mime-type>application/vnd.airzip.filesecure.azf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>azs</extension>
+        <mime-type>application/vnd.airzip.filesecure.azs</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>azw</extension>
+        <mime-type>application/vnd.amazon.ebook</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>bat</extension>
+        <mime-type>application/x-msdownload</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>bcpio</extension>
+        <mime-type>application/x-bcpio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>bdf</extension>
+        <mime-type>application/x-font-bdf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>bdm</extension>
+        <mime-type>application/vnd.syncml.dm+wbxml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>bed</extension>
+        <mime-type>application/vnd.realvnc.bed</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>bh2</extension>
+        <mime-type>application/vnd.fujitsu.oasysprs</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>bin</extension>
+        <mime-type>application/octet-stream</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>blb</extension>
+        <mime-type>application/x-blorb</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>blorb</extension>
+        <mime-type>application/x-blorb</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>bmi</extension>
+        <mime-type>application/vnd.bmi</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>bmp</extension>
+        <mime-type>image/bmp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>body</extension>
+        <mime-type>text/html</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>book</extension>
+        <mime-type>application/vnd.framemaker</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>box</extension>
+        <mime-type>application/vnd.previewsystems.box</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>boz</extension>
+        <mime-type>application/x-bzip2</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>bpk</extension>
+        <mime-type>application/octet-stream</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>btif</extension>
+        <mime-type>image/prs.btif</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>bz</extension>
+        <mime-type>application/x-bzip</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>bz2</extension>
+        <mime-type>application/x-bzip2</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>c</extension>
+        <mime-type>text/x-c</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>c11amc</extension>
+        <mime-type>application/vnd.cluetrust.cartomobile-config</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>c11amz</extension>
+        <mime-type>application/vnd.cluetrust.cartomobile-config-pkg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>c4d</extension>
+        <mime-type>application/vnd.clonk.c4group</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>c4f</extension>
+        <mime-type>application/vnd.clonk.c4group</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>c4g</extension>
+        <mime-type>application/vnd.clonk.c4group</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>c4p</extension>
+        <mime-type>application/vnd.clonk.c4group</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>c4u</extension>
+        <mime-type>application/vnd.clonk.c4group</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cab</extension>
+        <mime-type>application/vnd.ms-cab-compressed</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>caf</extension>
+        <mime-type>audio/x-caf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cap</extension>
+        <mime-type>application/vnd.tcpdump.pcap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>car</extension>
+        <mime-type>application/vnd.curl.car</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cat</extension>
+        <mime-type>application/vnd.ms-pki.seccat</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cb7</extension>
+        <mime-type>application/x-cbr</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cba</extension>
+        <mime-type>application/x-cbr</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cbr</extension>
+        <mime-type>application/x-cbr</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cbt</extension>
+        <mime-type>application/x-cbr</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cbz</extension>
+        <mime-type>application/x-cbr</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cc</extension>
+        <mime-type>text/x-c</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cct</extension>
+        <mime-type>application/x-director</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ccxml</extension>
+        <mime-type>application/ccxml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cdbcmsg</extension>
+        <mime-type>application/vnd.contact.cmsg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cdf</extension>
+        <mime-type>application/x-cdf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cdkey</extension>
+        <mime-type>application/vnd.mediastation.cdkey</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cdmia</extension>
+        <mime-type>application/cdmi-capability</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cdmic</extension>
+        <mime-type>application/cdmi-container</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cdmid</extension>
+        <mime-type>application/cdmi-domain</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cdmio</extension>
+        <mime-type>application/cdmi-object</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cdmiq</extension>
+        <mime-type>application/cdmi-queue</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cdx</extension>
+        <mime-type>chemical/x-cdx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cdxml</extension>
+        <mime-type>application/vnd.chemdraw+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cdy</extension>
+        <mime-type>application/vnd.cinderella</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cer</extension>
+        <mime-type>application/pkix-cert</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cfs</extension>
+        <mime-type>application/x-cfs-compressed</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cgm</extension>
+        <mime-type>image/cgm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>chat</extension>
+        <mime-type>application/x-chat</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>chm</extension>
+        <mime-type>application/vnd.ms-htmlhelp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>chrt</extension>
+        <mime-type>application/vnd.kde.kchart</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cif</extension>
+        <mime-type>chemical/x-cif</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cii</extension>
+        <mime-type>application/vnd.anser-web-certificate-issue-initiation</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cil</extension>
+        <mime-type>application/vnd.ms-artgalry</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cla</extension>
+        <mime-type>application/vnd.claymore</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>class</extension>
+        <mime-type>application/java</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>clkk</extension>
+        <mime-type>application/vnd.crick.clicker.keyboard</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>clkp</extension>
+        <mime-type>application/vnd.crick.clicker.palette</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>clkt</extension>
+        <mime-type>application/vnd.crick.clicker.template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>clkw</extension>
+        <mime-type>application/vnd.crick.clicker.wordbank</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>clkx</extension>
+        <mime-type>application/vnd.crick.clicker</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>clp</extension>
+        <mime-type>application/x-msclip</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cmc</extension>
+        <mime-type>application/vnd.cosmocaller</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cmdf</extension>
+        <mime-type>chemical/x-cmdf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cml</extension>
+        <mime-type>chemical/x-cml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cmp</extension>
+        <mime-type>application/vnd.yellowriver-custom-menu</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cmx</extension>
+        <mime-type>image/x-cmx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cod</extension>
+        <mime-type>application/vnd.rim.cod</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>com</extension>
+        <mime-type>application/x-msdownload</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>conf</extension>
+        <mime-type>text/plain</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cpio</extension>
+        <mime-type>application/x-cpio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cpp</extension>
+        <mime-type>text/x-c</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cpt</extension>
+        <mime-type>application/mac-compactpro</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>crd</extension>
+        <mime-type>application/x-mscardfile</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>crl</extension>
+        <mime-type>application/pkix-crl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>crt</extension>
+        <mime-type>application/x-x509-ca-cert</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cryptonote</extension>
+        <mime-type>application/vnd.rig.cryptonote</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>csh</extension>
+        <mime-type>application/x-csh</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>csml</extension>
+        <mime-type>chemical/x-csml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>csp</extension>
+        <mime-type>application/vnd.commonspace</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>css</extension>
+        <mime-type>text/css</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cst</extension>
+        <mime-type>application/x-director</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>csv</extension>
+        <mime-type>text/csv</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cu</extension>
+        <mime-type>application/cu-seeme</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>curl</extension>
+        <mime-type>text/vnd.curl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cww</extension>
+        <mime-type>application/prs.cww</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cxt</extension>
+        <mime-type>application/x-director</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>cxx</extension>
+        <mime-type>text/x-c</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dae</extension>
+        <mime-type>model/vnd.collada+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>daf</extension>
+        <mime-type>application/vnd.mobius.daf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dart</extension>
+        <mime-type>application/vnd.dart</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dataless</extension>
+        <mime-type>application/vnd.fdsn.seed</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>davmount</extension>
+        <mime-type>application/davmount+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dbk</extension>
+        <mime-type>application/docbook+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dcr</extension>
+        <mime-type>application/x-director</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dcurl</extension>
+        <mime-type>text/vnd.curl.dcurl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dd2</extension>
+        <mime-type>application/vnd.oma.dd2+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ddd</extension>
+        <mime-type>application/vnd.fujixerox.ddd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>deb</extension>
+        <mime-type>application/x-debian-package</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>def</extension>
+        <mime-type>text/plain</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>deploy</extension>
+        <mime-type>application/octet-stream</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>der</extension>
+        <mime-type>application/x-x509-ca-cert</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dfac</extension>
+        <mime-type>application/vnd.dreamfactory</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dgc</extension>
+        <mime-type>application/x-dgc-compressed</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dib</extension>
+        <mime-type>image/bmp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dic</extension>
+        <mime-type>text/x-c</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dir</extension>
+        <mime-type>application/x-director</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dis</extension>
+        <mime-type>application/vnd.mobius.dis</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dist</extension>
+        <mime-type>application/octet-stream</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>distz</extension>
+        <mime-type>application/octet-stream</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>djv</extension>
+        <mime-type>image/vnd.djvu</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>djvu</extension>
+        <mime-type>image/vnd.djvu</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dll</extension>
+        <mime-type>application/x-msdownload</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dmg</extension>
+        <mime-type>application/x-apple-diskimage</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dmp</extension>
+        <mime-type>application/vnd.tcpdump.pcap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dms</extension>
+        <mime-type>application/octet-stream</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dna</extension>
+        <mime-type>application/vnd.dna</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>doc</extension>
+        <mime-type>application/msword</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>docm</extension>
+        <mime-type>application/vnd.ms-word.document.macroenabled.12</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>docx</extension>
+        <mime-type>application/vnd.openxmlformats-officedocument.wordprocessingml.document</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dot</extension>
+        <mime-type>application/msword</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dotm</extension>
+        <mime-type>application/vnd.ms-word.template.macroenabled.12</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dotx</extension>
+        <mime-type>application/vnd.openxmlformats-officedocument.wordprocessingml.template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dp</extension>
+        <mime-type>application/vnd.osgi.dp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dpg</extension>
+        <mime-type>application/vnd.dpgraph</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dra</extension>
+        <mime-type>audio/vnd.dra</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dsc</extension>
+        <mime-type>text/prs.lines.tag</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dssc</extension>
+        <mime-type>application/dssc+der</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dtb</extension>
+        <mime-type>application/x-dtbook+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dtd</extension>
+        <mime-type>application/xml-dtd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dts</extension>
+        <mime-type>audio/vnd.dts</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dtshd</extension>
+        <mime-type>audio/vnd.dts.hd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dump</extension>
+        <mime-type>application/octet-stream</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dv</extension>
+        <mime-type>video/x-dv</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dvb</extension>
+        <mime-type>video/vnd.dvb.file</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dvi</extension>
+        <mime-type>application/x-dvi</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dwf</extension>
+        <mime-type>model/vnd.dwf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dwg</extension>
+        <mime-type>image/vnd.dwg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dxf</extension>
+        <mime-type>image/vnd.dxf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dxp</extension>
+        <mime-type>application/vnd.spotfire.dxp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>dxr</extension>
+        <mime-type>application/x-director</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ecelp4800</extension>
+        <mime-type>audio/vnd.nuera.ecelp4800</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ecelp7470</extension>
+        <mime-type>audio/vnd.nuera.ecelp7470</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ecelp9600</extension>
+        <mime-type>audio/vnd.nuera.ecelp9600</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ecma</extension>
+        <mime-type>application/ecmascript</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>edm</extension>
+        <mime-type>application/vnd.novadigm.edm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>edx</extension>
+        <mime-type>application/vnd.novadigm.edx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>efif</extension>
+        <mime-type>application/vnd.picsel</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ei6</extension>
+        <mime-type>application/vnd.pg.osasli</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>elc</extension>
+        <mime-type>application/octet-stream</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>emf</extension>
+        <mime-type>application/x-msmetafile</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>eml</extension>
+        <mime-type>message/rfc822</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>emma</extension>
+        <mime-type>application/emma+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>emz</extension>
+        <mime-type>application/x-msmetafile</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>eol</extension>
+        <mime-type>audio/vnd.digital-winds</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>eot</extension>
+        <mime-type>application/vnd.ms-fontobject</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>eps</extension>
+        <mime-type>application/postscript</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>epub</extension>
+        <mime-type>application/epub+zip</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>es3</extension>
+        <mime-type>application/vnd.eszigno3+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>esa</extension>
+        <mime-type>application/vnd.osgi.subsystem</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>esf</extension>
+        <mime-type>application/vnd.epson.esf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>et3</extension>
+        <mime-type>application/vnd.eszigno3+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>etx</extension>
+        <mime-type>text/x-setext</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>eva</extension>
+        <mime-type>application/x-eva</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>evy</extension>
+        <mime-type>application/x-envoy</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>exe</extension>
+        <mime-type>application/octet-stream</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>exi</extension>
+        <mime-type>application/exi</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ext</extension>
+        <mime-type>application/vnd.novadigm.ext</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ez</extension>
+        <mime-type>application/andrew-inset</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ez2</extension>
+        <mime-type>application/vnd.ezpix-album</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ez3</extension>
+        <mime-type>application/vnd.ezpix-package</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>f</extension>
+        <mime-type>text/x-fortran</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>f4v</extension>
+        <mime-type>video/x-f4v</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>f77</extension>
+        <mime-type>text/x-fortran</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>f90</extension>
+        <mime-type>text/x-fortran</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fbs</extension>
+        <mime-type>image/vnd.fastbidsheet</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fcdt</extension>
+        <mime-type>application/vnd.adobe.formscentral.fcdt</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fcs</extension>
+        <mime-type>application/vnd.isac.fcs</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fdf</extension>
+        <mime-type>application/vnd.fdf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fe_launch</extension>
+        <mime-type>application/vnd.denovo.fcselayout-link</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fg5</extension>
+        <mime-type>application/vnd.fujitsu.oasysgp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fgd</extension>
+        <mime-type>application/x-director</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fh</extension>
+        <mime-type>image/x-freehand</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fh4</extension>
+        <mime-type>image/x-freehand</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fh5</extension>
+        <mime-type>image/x-freehand</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fh7</extension>
+        <mime-type>image/x-freehand</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fhc</extension>
+        <mime-type>image/x-freehand</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fig</extension>
+        <mime-type>application/x-xfig</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>flac</extension>
+        <mime-type>audio/flac</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fli</extension>
+        <mime-type>video/x-fli</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>flo</extension>
+        <mime-type>application/vnd.micrografx.flo</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>flv</extension>
+        <mime-type>video/x-flv</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>flw</extension>
+        <mime-type>application/vnd.kde.kivio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>flx</extension>
+        <mime-type>text/vnd.fmi.flexstor</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fly</extension>
+        <mime-type>text/vnd.fly</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fm</extension>
+        <mime-type>application/vnd.framemaker</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fnc</extension>
+        <mime-type>application/vnd.frogans.fnc</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>for</extension>
+        <mime-type>text/x-fortran</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fpx</extension>
+        <mime-type>image/vnd.fpx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>frame</extension>
+        <mime-type>application/vnd.framemaker</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fsc</extension>
+        <mime-type>application/vnd.fsc.weblaunch</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fst</extension>
+        <mime-type>image/vnd.fst</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ftc</extension>
+        <mime-type>application/vnd.fluxtime.clip</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fti</extension>
+        <mime-type>application/vnd.anser-web-funds-transfer-initiation</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fvt</extension>
+        <mime-type>video/vnd.fvt</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fxp</extension>
+        <mime-type>application/vnd.adobe.fxp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fxpl</extension>
+        <mime-type>application/vnd.adobe.fxp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>fzs</extension>
+        <mime-type>application/vnd.fuzzysheet</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>g2w</extension>
+        <mime-type>application/vnd.geoplan</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>g3</extension>
+        <mime-type>image/g3fax</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>g3w</extension>
+        <mime-type>application/vnd.geospace</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gac</extension>
+        <mime-type>application/vnd.groove-account</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gam</extension>
+        <mime-type>application/x-tads</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gbr</extension>
+        <mime-type>application/rpki-ghostbusters</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gca</extension>
+        <mime-type>application/x-gca-compressed</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gdl</extension>
+        <mime-type>model/vnd.gdl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>geo</extension>
+        <mime-type>application/vnd.dynageo</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gex</extension>
+        <mime-type>application/vnd.geometry-explorer</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ggb</extension>
+        <mime-type>application/vnd.geogebra.file</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ggt</extension>
+        <mime-type>application/vnd.geogebra.tool</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ghf</extension>
+        <mime-type>application/vnd.groove-help</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gif</extension>
+        <mime-type>image/gif</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gim</extension>
+        <mime-type>application/vnd.groove-identity-message</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gml</extension>
+        <mime-type>application/gml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gmx</extension>
+        <mime-type>application/vnd.gmx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gnumeric</extension>
+        <mime-type>application/x-gnumeric</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gph</extension>
+        <mime-type>application/vnd.flographit</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gpx</extension>
+        <mime-type>application/gpx+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gqf</extension>
+        <mime-type>application/vnd.grafeq</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gqs</extension>
+        <mime-type>application/vnd.grafeq</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gram</extension>
+        <mime-type>application/srgs</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gramps</extension>
+        <mime-type>application/x-gramps-xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gre</extension>
+        <mime-type>application/vnd.geometry-explorer</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>grv</extension>
+        <mime-type>application/vnd.groove-injector</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>grxml</extension>
+        <mime-type>application/srgs+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gsf</extension>
+        <mime-type>application/x-font-ghostscript</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gtar</extension>
+        <mime-type>application/x-gtar</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gtm</extension>
+        <mime-type>application/vnd.groove-tool-message</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gtw</extension>
+        <mime-type>model/vnd.gtw</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gv</extension>
+        <mime-type>text/vnd.graphviz</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gxf</extension>
+        <mime-type>application/gxf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gxt</extension>
+        <mime-type>application/vnd.geonext</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>gz</extension>
+        <mime-type>application/x-gzip</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>h</extension>
+        <mime-type>text/x-c</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>h261</extension>
+        <mime-type>video/h261</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>h263</extension>
+        <mime-type>video/h263</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>h264</extension>
+        <mime-type>video/h264</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>hal</extension>
+        <mime-type>application/vnd.hal+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>hbci</extension>
+        <mime-type>application/vnd.hbci</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>hdf</extension>
+        <mime-type>application/x-hdf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>hh</extension>
+        <mime-type>text/x-c</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>hlp</extension>
+        <mime-type>application/winhlp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>hpgl</extension>
+        <mime-type>application/vnd.hp-hpgl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>hpid</extension>
+        <mime-type>application/vnd.hp-hpid</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>hps</extension>
+        <mime-type>application/vnd.hp-hps</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>hqx</extension>
+        <mime-type>application/mac-binhex40</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>htc</extension>
+        <mime-type>text/x-component</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>htke</extension>
+        <mime-type>application/vnd.kenameaapp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>htm</extension>
+        <mime-type>text/html</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>html</extension>
+        <mime-type>text/html</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>hvd</extension>
+        <mime-type>application/vnd.yamaha.hv-dic</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>hvp</extension>
+        <mime-type>application/vnd.yamaha.hv-voice</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>hvs</extension>
+        <mime-type>application/vnd.yamaha.hv-script</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>i2g</extension>
+        <mime-type>application/vnd.intergeo</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>icc</extension>
+        <mime-type>application/vnd.iccprofile</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ice</extension>
+        <mime-type>x-conference/x-cooltalk</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>icm</extension>
+        <mime-type>application/vnd.iccprofile</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ico</extension>
+        <mime-type>image/x-icon</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ics</extension>
+        <mime-type>text/calendar</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ief</extension>
+        <mime-type>image/ief</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ifb</extension>
+        <mime-type>text/calendar</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ifm</extension>
+        <mime-type>application/vnd.shana.informed.formdata</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>iges</extension>
+        <mime-type>model/iges</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>igl</extension>
+        <mime-type>application/vnd.igloader</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>igm</extension>
+        <mime-type>application/vnd.insors.igm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>igs</extension>
+        <mime-type>model/iges</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>igx</extension>
+        <mime-type>application/vnd.micrografx.igx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>iif</extension>
+        <mime-type>application/vnd.shana.informed.interchange</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>imp</extension>
+        <mime-type>application/vnd.accpac.simply.imp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ims</extension>
+        <mime-type>application/vnd.ms-ims</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>in</extension>
+        <mime-type>text/plain</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ink</extension>
+        <mime-type>application/inkml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>inkml</extension>
+        <mime-type>application/inkml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>install</extension>
+        <mime-type>application/x-install-instructions</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>iota</extension>
+        <mime-type>application/vnd.astraea-software.iota</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ipfix</extension>
+        <mime-type>application/ipfix</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ipk</extension>
+        <mime-type>application/vnd.shana.informed.package</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>irm</extension>
+        <mime-type>application/vnd.ibm.rights-management</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>irp</extension>
+        <mime-type>application/vnd.irepository.package+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>iso</extension>
+        <mime-type>application/x-iso9660-image</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>itp</extension>
+        <mime-type>application/vnd.shana.informed.formtemplate</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ivp</extension>
+        <mime-type>application/vnd.immervision-ivp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ivu</extension>
+        <mime-type>application/vnd.immervision-ivu</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jad</extension>
+        <mime-type>text/vnd.sun.j2me.app-descriptor</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jam</extension>
+        <mime-type>application/vnd.jam</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jar</extension>
+        <mime-type>application/java-archive</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>java</extension>
+        <mime-type>text/x-java-source</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jisp</extension>
+        <mime-type>application/vnd.jisp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jlt</extension>
+        <mime-type>application/vnd.hp-jlyt</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jnlp</extension>
+        <mime-type>application/x-java-jnlp-file</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>joda</extension>
+        <mime-type>application/vnd.joost.joda-archive</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jpe</extension>
+        <mime-type>image/jpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jpeg</extension>
+        <mime-type>image/jpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jpg</extension>
+        <mime-type>image/jpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jpgm</extension>
+        <mime-type>video/jpm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jpgv</extension>
+        <mime-type>video/jpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jpm</extension>
+        <mime-type>video/jpm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>js</extension>
+        <mime-type>application/javascript</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jsf</extension>
+        <mime-type>text/plain</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>json</extension>
+        <mime-type>application/json</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>jsonml</extension>
+        <mime-type>application/jsonml+json</mime-type>
+    </mime-mapping>
+    <!--
+        <mime-mapping>
+            <extension>jspf</extension>
+            <mime-type>text/plain</mime-type>
+        </mime-mapping>
+    -->
+    <mime-mapping>
+        <extension>kar</extension>
+        <mime-type>audio/midi</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>karbon</extension>
+        <mime-type>application/vnd.kde.karbon</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>kfo</extension>
+        <mime-type>application/vnd.kde.kformula</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>kia</extension>
+        <mime-type>application/vnd.kidspiration</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>kml</extension>
+        <mime-type>application/vnd.google-earth.kml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>kmz</extension>
+        <mime-type>application/vnd.google-earth.kmz</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>kne</extension>
+        <mime-type>application/vnd.kinar</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>knp</extension>
+        <mime-type>application/vnd.kinar</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>kon</extension>
+        <mime-type>application/vnd.kde.kontour</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>kpr</extension>
+        <mime-type>application/vnd.kde.kpresenter</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>kpt</extension>
+        <mime-type>application/vnd.kde.kpresenter</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>kpxx</extension>
+        <mime-type>application/vnd.ds-keypoint</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ksp</extension>
+        <mime-type>application/vnd.kde.kspread</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ktr</extension>
+        <mime-type>application/vnd.kahootz</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ktx</extension>
+        <mime-type>image/ktx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ktz</extension>
+        <mime-type>application/vnd.kahootz</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>kwd</extension>
+        <mime-type>application/vnd.kde.kword</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>kwt</extension>
+        <mime-type>application/vnd.kde.kword</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>lasxml</extension>
+        <mime-type>application/vnd.las.las+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>latex</extension>
+        <mime-type>application/x-latex</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>lbd</extension>
+        <mime-type>application/vnd.llamagraphics.life-balance.desktop</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>lbe</extension>
+        <mime-type>application/vnd.llamagraphics.life-balance.exchange+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>les</extension>
+        <mime-type>application/vnd.hhe.lesson-player</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>lha</extension>
+        <mime-type>application/x-lzh-compressed</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>link66</extension>
+        <mime-type>application/vnd.route66.link66+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>list</extension>
+        <mime-type>text/plain</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>list3820</extension>
+        <mime-type>application/vnd.ibm.modcap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>listafp</extension>
+        <mime-type>application/vnd.ibm.modcap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>lnk</extension>
+        <mime-type>application/x-ms-shortcut</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>log</extension>
+        <mime-type>text/plain</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>lostxml</extension>
+        <mime-type>application/lost+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>lrf</extension>
+        <mime-type>application/octet-stream</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>lrm</extension>
+        <mime-type>application/vnd.ms-lrm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ltf</extension>
+        <mime-type>application/vnd.frogans.ltf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>lvp</extension>
+        <mime-type>audio/vnd.lucent.voice</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>lwp</extension>
+        <mime-type>application/vnd.lotus-wordpro</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>lzh</extension>
+        <mime-type>application/x-lzh-compressed</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m13</extension>
+        <mime-type>application/x-msmediaview</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m14</extension>
+        <mime-type>application/x-msmediaview</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m1v</extension>
+        <mime-type>video/mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m21</extension>
+        <mime-type>application/mp21</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m2a</extension>
+        <mime-type>audio/mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m2v</extension>
+        <mime-type>video/mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m3a</extension>
+        <mime-type>audio/mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m3u</extension>
+        <mime-type>audio/x-mpegurl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m3u8</extension>
+        <mime-type>application/vnd.apple.mpegurl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m4a</extension>
+        <mime-type>audio/mp4</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m4b</extension>
+        <mime-type>audio/mp4</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m4r</extension>
+        <mime-type>audio/mp4</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m4u</extension>
+        <mime-type>video/vnd.mpegurl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>m4v</extension>
+        <mime-type>video/mp4</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ma</extension>
+        <mime-type>application/mathematica</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mac</extension>
+        <mime-type>image/x-macpaint</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mads</extension>
+        <mime-type>application/mads+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mag</extension>
+        <mime-type>application/vnd.ecowin.chart</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>maker</extension>
+        <mime-type>application/vnd.framemaker</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>man</extension>
+        <mime-type>text/troff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mar</extension>
+        <mime-type>application/octet-stream</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mathml</extension>
+        <mime-type>application/mathml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mb</extension>
+        <mime-type>application/mathematica</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mbk</extension>
+        <mime-type>application/vnd.mobius.mbk</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mbox</extension>
+        <mime-type>application/mbox</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mc1</extension>
+        <mime-type>application/vnd.medcalcdata</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mcd</extension>
+        <mime-type>application/vnd.mcd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mcurl</extension>
+        <mime-type>text/vnd.curl.mcurl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mdb</extension>
+        <mime-type>application/x-msaccess</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mdi</extension>
+        <mime-type>image/vnd.ms-modi</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>me</extension>
+        <mime-type>text/troff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mesh</extension>
+        <mime-type>model/mesh</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>meta4</extension>
+        <mime-type>application/metalink4+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>metalink</extension>
+        <mime-type>application/metalink+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mets</extension>
+        <mime-type>application/mets+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mfm</extension>
+        <mime-type>application/vnd.mfmp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mft</extension>
+        <mime-type>application/rpki-manifest</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mgp</extension>
+        <mime-type>application/vnd.osgeo.mapguide.package</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mgz</extension>
+        <mime-type>application/vnd.proteus.magazine</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mid</extension>
+        <mime-type>audio/midi</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>midi</extension>
+        <mime-type>audio/midi</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mie</extension>
+        <mime-type>application/x-mie</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mif</extension>
+        <mime-type>application/x-mif</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mime</extension>
+        <mime-type>message/rfc822</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mj2</extension>
+        <mime-type>video/mj2</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mjp2</extension>
+        <mime-type>video/mj2</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mk3d</extension>
+        <mime-type>video/x-matroska</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mka</extension>
+        <mime-type>audio/x-matroska</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mks</extension>
+        <mime-type>video/x-matroska</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mkv</extension>
+        <mime-type>video/x-matroska</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mlp</extension>
+        <mime-type>application/vnd.dolby.mlp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mmd</extension>
+        <mime-type>application/vnd.chipnuts.karaoke-mmd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mmf</extension>
+        <mime-type>application/vnd.smaf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mmr</extension>
+        <mime-type>image/vnd.fujixerox.edmics-mmr</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mng</extension>
+        <mime-type>video/x-mng</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mny</extension>
+        <mime-type>application/x-msmoney</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mobi</extension>
+        <mime-type>application/x-mobipocket-ebook</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mods</extension>
+        <mime-type>application/mods+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mov</extension>
+        <mime-type>video/quicktime</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>movie</extension>
+        <mime-type>video/x-sgi-movie</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mp1</extension>
+        <mime-type>audio/mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mp2</extension>
+        <mime-type>audio/mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mp21</extension>
+        <mime-type>application/mp21</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mp2a</extension>
+        <mime-type>audio/mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mp3</extension>
+        <mime-type>audio/mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mp4</extension>
+        <mime-type>video/mp4</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mp4a</extension>
+        <mime-type>audio/mp4</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mp4s</extension>
+        <mime-type>application/mp4</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mp4v</extension>
+        <mime-type>video/mp4</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpa</extension>
+        <mime-type>audio/mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpc</extension>
+        <mime-type>application/vnd.mophun.certificate</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpe</extension>
+        <mime-type>video/mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpeg</extension>
+        <mime-type>video/mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpega</extension>
+        <mime-type>audio/x-mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpg</extension>
+        <mime-type>video/mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpg4</extension>
+        <mime-type>video/mp4</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpga</extension>
+        <mime-type>audio/mpeg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpkg</extension>
+        <mime-type>application/vnd.apple.installer+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpm</extension>
+        <mime-type>application/vnd.blueice.multipass</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpn</extension>
+        <mime-type>application/vnd.mophun.application</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpp</extension>
+        <mime-type>application/vnd.ms-project</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpt</extension>
+        <mime-type>application/vnd.ms-project</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpv2</extension>
+        <mime-type>video/mpeg2</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mpy</extension>
+        <mime-type>application/vnd.ibm.minipay</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mqy</extension>
+        <mime-type>application/vnd.mobius.mqy</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mrc</extension>
+        <mime-type>application/marc</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mrcx</extension>
+        <mime-type>application/marcxml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ms</extension>
+        <mime-type>text/troff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mscml</extension>
+        <mime-type>application/mediaservercontrol+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mseed</extension>
+        <mime-type>application/vnd.fdsn.mseed</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mseq</extension>
+        <mime-type>application/vnd.mseq</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>msf</extension>
+        <mime-type>application/vnd.epson.msf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>msh</extension>
+        <mime-type>model/mesh</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>msi</extension>
+        <mime-type>application/x-msdownload</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>msl</extension>
+        <mime-type>application/vnd.mobius.msl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>msty</extension>
+        <mime-type>application/vnd.muvee.style</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mts</extension>
+        <mime-type>model/vnd.mts</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mus</extension>
+        <mime-type>application/vnd.musician</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>musicxml</extension>
+        <mime-type>application/vnd.recordare.musicxml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mvb</extension>
+        <mime-type>application/x-msmediaview</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mwf</extension>
+        <mime-type>application/vnd.mfer</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mxf</extension>
+        <mime-type>application/mxf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mxl</extension>
+        <mime-type>application/vnd.recordare.musicxml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mxml</extension>
+        <mime-type>application/xv+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mxs</extension>
+        <mime-type>application/vnd.triscape.mxs</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>mxu</extension>
+        <mime-type>video/vnd.mpegurl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>n-gage</extension>
+        <mime-type>application/vnd.nokia.n-gage.symbian.install</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>n3</extension>
+        <mime-type>text/n3</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>nb</extension>
+        <mime-type>application/mathematica</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>nbp</extension>
+        <mime-type>application/vnd.wolfram.player</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>nc</extension>
+        <mime-type>application/x-netcdf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ncx</extension>
+        <mime-type>application/x-dtbncx+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>nfo</extension>
+        <mime-type>text/x-nfo</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ngdat</extension>
+        <mime-type>application/vnd.nokia.n-gage.data</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>nitf</extension>
+        <mime-type>application/vnd.nitf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>nlu</extension>
+        <mime-type>application/vnd.neurolanguage.nlu</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>nml</extension>
+        <mime-type>application/vnd.enliven</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>nnd</extension>
+        <mime-type>application/vnd.noblenet-directory</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>nns</extension>
+        <mime-type>application/vnd.noblenet-sealer</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>nnw</extension>
+        <mime-type>application/vnd.noblenet-web</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>npx</extension>
+        <mime-type>image/vnd.net-fpx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>nsc</extension>
+        <mime-type>application/x-conference</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>nsf</extension>
+        <mime-type>application/vnd.lotus-notes</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ntf</extension>
+        <mime-type>application/vnd.nitf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>nzb</extension>
+        <mime-type>application/x-nzb</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>oa2</extension>
+        <mime-type>application/vnd.fujitsu.oasys2</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>oa3</extension>
+        <mime-type>application/vnd.fujitsu.oasys3</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>oas</extension>
+        <mime-type>application/vnd.fujitsu.oasys</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>obd</extension>
+        <mime-type>application/x-msbinder</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>obj</extension>
+        <mime-type>application/x-tgif</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>oda</extension>
+        <mime-type>application/oda</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- OpenDocument Database -->
+        <extension>odb</extension>
+        <mime-type>application/vnd.oasis.opendocument.database</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- OpenDocument Chart -->
+        <extension>odc</extension>
+        <mime-type>application/vnd.oasis.opendocument.chart</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- OpenDocument Formula -->
+        <extension>odf</extension>
+        <mime-type>application/vnd.oasis.opendocument.formula</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>odft</extension>
+        <mime-type>application/vnd.oasis.opendocument.formula-template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- OpenDocument Drawing -->
+        <extension>odg</extension>
+        <mime-type>application/vnd.oasis.opendocument.graphics</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- OpenDocument Image -->
+        <extension>odi</extension>
+        <mime-type>application/vnd.oasis.opendocument.image</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- OpenDocument Master Document -->
+        <extension>odm</extension>
+        <mime-type>application/vnd.oasis.opendocument.text-master</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- OpenDocument Presentation -->
+        <extension>odp</extension>
+        <mime-type>application/vnd.oasis.opendocument.presentation</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- OpenDocument Spreadsheet -->
+        <extension>ods</extension>
+        <mime-type>application/vnd.oasis.opendocument.spreadsheet</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- OpenDocument Text -->
+        <extension>odt</extension>
+        <mime-type>application/vnd.oasis.opendocument.text</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>oga</extension>
+        <mime-type>audio/ogg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ogg</extension>
+        <mime-type>audio/ogg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ogv</extension>
+        <mime-type>video/ogg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- xiph mime types -->
+        <extension>ogx</extension>
+        <mime-type>application/ogg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>omdoc</extension>
+        <mime-type>application/omdoc+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>onepkg</extension>
+        <mime-type>application/onenote</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>onetmp</extension>
+        <mime-type>application/onenote</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>onetoc</extension>
+        <mime-type>application/onenote</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>onetoc2</extension>
+        <mime-type>application/onenote</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>opf</extension>
+        <mime-type>application/oebps-package+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>opml</extension>
+        <mime-type>text/x-opml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>oprc</extension>
+        <mime-type>application/vnd.palm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>org</extension>
+        <mime-type>application/vnd.lotus-organizer</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>osf</extension>
+        <mime-type>application/vnd.yamaha.openscoreformat</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>osfpvg</extension>
+        <mime-type>application/vnd.yamaha.openscoreformat.osfpvg+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>otc</extension>
+        <mime-type>application/vnd.oasis.opendocument.chart-template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>otf</extension>
+        <mime-type>application/x-font-otf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- OpenDocument Drawing Template -->
+        <extension>otg</extension>
+        <mime-type>application/vnd.oasis.opendocument.graphics-template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- HTML Document Template -->
+        <extension>oth</extension>
+        <mime-type>application/vnd.oasis.opendocument.text-web</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>oti</extension>
+        <mime-type>application/vnd.oasis.opendocument.image-template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- OpenDocument Presentation Template -->
+        <extension>otp</extension>
+        <mime-type>application/vnd.oasis.opendocument.presentation-template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- OpenDocument Spreadsheet Template -->
+        <extension>ots</extension>
+        <mime-type>application/vnd.oasis.opendocument.spreadsheet-template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- OpenDocument Text Template -->
+        <extension>ott</extension>
+        <mime-type>application/vnd.oasis.opendocument.text-template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>oxps</extension>
+        <mime-type>application/oxps</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>oxt</extension>
+        <mime-type>application/vnd.openofficeorg.extension</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>p</extension>
+        <mime-type>text/x-pascal</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>p10</extension>
+        <mime-type>application/pkcs10</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>p12</extension>
+        <mime-type>application/x-pkcs12</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>p7b</extension>
+        <mime-type>application/x-pkcs7-certificates</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>p7c</extension>
+        <mime-type>application/pkcs7-mime</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>p7m</extension>
+        <mime-type>application/pkcs7-mime</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>p7r</extension>
+        <mime-type>application/x-pkcs7-certreqresp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>p7s</extension>
+        <mime-type>application/pkcs7-signature</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>p8</extension>
+        <mime-type>application/pkcs8</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pas</extension>
+        <mime-type>text/x-pascal</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>paw</extension>
+        <mime-type>application/vnd.pawaafile</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pbd</extension>
+        <mime-type>application/vnd.powerbuilder6</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pbm</extension>
+        <mime-type>image/x-portable-bitmap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pcap</extension>
+        <mime-type>application/vnd.tcpdump.pcap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pcf</extension>
+        <mime-type>application/x-font-pcf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pcl</extension>
+        <mime-type>application/vnd.hp-pcl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pclxl</extension>
+        <mime-type>application/vnd.hp-pclxl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pct</extension>
+        <mime-type>image/pict</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pcurl</extension>
+        <mime-type>application/vnd.curl.pcurl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pcx</extension>
+        <mime-type>image/x-pcx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pdb</extension>
+        <mime-type>application/vnd.palm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pdf</extension>
+        <mime-type>application/pdf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pfa</extension>
+        <mime-type>application/x-font-type1</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pfb</extension>
+        <mime-type>application/x-font-type1</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pfm</extension>
+        <mime-type>application/x-font-type1</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pfr</extension>
+        <mime-type>application/font-tdpfr</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pfx</extension>
+        <mime-type>application/x-pkcs12</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pgm</extension>
+        <mime-type>image/x-portable-graymap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pgn</extension>
+        <mime-type>application/x-chess-pgn</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pgp</extension>
+        <mime-type>application/pgp-encrypted</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pic</extension>
+        <mime-type>image/pict</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pict</extension>
+        <mime-type>image/pict</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pkg</extension>
+        <mime-type>application/octet-stream</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pki</extension>
+        <mime-type>application/pkixcmp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pkipath</extension>
+        <mime-type>application/pkix-pkipath</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>plb</extension>
+        <mime-type>application/vnd.3gpp.pic-bw-large</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>plc</extension>
+        <mime-type>application/vnd.mobius.plc</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>plf</extension>
+        <mime-type>application/vnd.pocketlearn</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pls</extension>
+        <mime-type>audio/x-scpls</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pml</extension>
+        <mime-type>application/vnd.ctc-posml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>png</extension>
+        <mime-type>image/png</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pnm</extension>
+        <mime-type>image/x-portable-anymap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pnt</extension>
+        <mime-type>image/x-macpaint</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>portpkg</extension>
+        <mime-type>application/vnd.macports.portpkg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pot</extension>
+        <mime-type>application/vnd.ms-powerpoint</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>potm</extension>
+        <mime-type>application/vnd.ms-powerpoint.template.macroenabled.12</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>potx</extension>
+        <mime-type>application/vnd.openxmlformats-officedocument.presentationml.template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ppam</extension>
+        <mime-type>application/vnd.ms-powerpoint.addin.macroenabled.12</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ppd</extension>
+        <mime-type>application/vnd.cups-ppd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ppm</extension>
+        <mime-type>image/x-portable-pixmap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pps</extension>
+        <mime-type>application/vnd.ms-powerpoint</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ppsm</extension>
+        <mime-type>application/vnd.ms-powerpoint.slideshow.macroenabled.12</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ppsx</extension>
+        <mime-type>application/vnd.openxmlformats-officedocument.presentationml.slideshow</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ppt</extension>
+        <mime-type>application/vnd.ms-powerpoint</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pptm</extension>
+        <mime-type>application/vnd.ms-powerpoint.presentation.macroenabled.12</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pptx</extension>
+        <mime-type>application/vnd.openxmlformats-officedocument.presentationml.presentation</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pqa</extension>
+        <mime-type>application/vnd.palm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>prc</extension>
+        <mime-type>application/x-mobipocket-ebook</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pre</extension>
+        <mime-type>application/vnd.lotus-freelance</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>prf</extension>
+        <mime-type>application/pics-rules</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ps</extension>
+        <mime-type>application/postscript</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>psb</extension>
+        <mime-type>application/vnd.3gpp.pic-bw-small</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>psd</extension>
+        <mime-type>image/vnd.adobe.photoshop</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>psf</extension>
+        <mime-type>application/x-font-linux-psf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pskcxml</extension>
+        <mime-type>application/pskc+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ptid</extension>
+        <mime-type>application/vnd.pvi.ptid1</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pub</extension>
+        <mime-type>application/x-mspublisher</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pvb</extension>
+        <mime-type>application/vnd.3gpp.pic-bw-var</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pwn</extension>
+        <mime-type>application/vnd.3m.post-it-notes</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pya</extension>
+        <mime-type>audio/vnd.ms-playready.media.pya</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>pyv</extension>
+        <mime-type>video/vnd.ms-playready.media.pyv</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>qam</extension>
+        <mime-type>application/vnd.epson.quickanime</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>qbo</extension>
+        <mime-type>application/vnd.intu.qbo</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>qfx</extension>
+        <mime-type>application/vnd.intu.qfx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>qps</extension>
+        <mime-type>application/vnd.publishare-delta-tree</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>qt</extension>
+        <mime-type>video/quicktime</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>qti</extension>
+        <mime-type>image/x-quicktime</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>qtif</extension>
+        <mime-type>image/x-quicktime</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>qwd</extension>
+        <mime-type>application/vnd.quark.quarkxpress</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>qwt</extension>
+        <mime-type>application/vnd.quark.quarkxpress</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>qxb</extension>
+        <mime-type>application/vnd.quark.quarkxpress</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>qxd</extension>
+        <mime-type>application/vnd.quark.quarkxpress</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>qxl</extension>
+        <mime-type>application/vnd.quark.quarkxpress</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>qxt</extension>
+        <mime-type>application/vnd.quark.quarkxpress</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ra</extension>
+        <mime-type>audio/x-pn-realaudio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ram</extension>
+        <mime-type>audio/x-pn-realaudio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rar</extension>
+        <mime-type>application/x-rar-compressed</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ras</extension>
+        <mime-type>image/x-cmu-raster</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rcprofile</extension>
+        <mime-type>application/vnd.ipunplugged.rcprofile</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rdf</extension>
+        <mime-type>application/rdf+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rdz</extension>
+        <mime-type>application/vnd.data-vision.rdz</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rep</extension>
+        <mime-type>application/vnd.businessobjects</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>res</extension>
+        <mime-type>application/x-dtbresource+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rgb</extension>
+        <mime-type>image/x-rgb</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rif</extension>
+        <mime-type>application/reginfo+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rip</extension>
+        <mime-type>audio/vnd.rip</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ris</extension>
+        <mime-type>application/x-research-info-systems</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rl</extension>
+        <mime-type>application/resource-lists+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rlc</extension>
+        <mime-type>image/vnd.fujixerox.edmics-rlc</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rld</extension>
+        <mime-type>application/resource-lists-diff+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rm</extension>
+        <mime-type>application/vnd.rn-realmedia</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rmi</extension>
+        <mime-type>audio/midi</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rmp</extension>
+        <mime-type>audio/x-pn-realaudio-plugin</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rms</extension>
+        <mime-type>application/vnd.jcp.javame.midlet-rms</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rmvb</extension>
+        <mime-type>application/vnd.rn-realmedia-vbr</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rnc</extension>
+        <mime-type>application/relax-ng-compact-syntax</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>roa</extension>
+        <mime-type>application/rpki-roa</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>roff</extension>
+        <mime-type>text/troff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rp9</extension>
+        <mime-type>application/vnd.cloanto.rp9</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rpss</extension>
+        <mime-type>application/vnd.nokia.radio-presets</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rpst</extension>
+        <mime-type>application/vnd.nokia.radio-preset</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rq</extension>
+        <mime-type>application/sparql-query</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rs</extension>
+        <mime-type>application/rls-services+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rsd</extension>
+        <mime-type>application/rsd+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rss</extension>
+        <mime-type>application/rss+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rtf</extension>
+        <mime-type>application/rtf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>rtx</extension>
+        <mime-type>text/richtext</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>s</extension>
+        <mime-type>text/x-asm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>s3m</extension>
+        <mime-type>audio/s3m</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>saf</extension>
+        <mime-type>application/vnd.yamaha.smaf-audio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sbml</extension>
+        <mime-type>application/sbml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sc</extension>
+        <mime-type>application/vnd.ibm.secure-container</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>scd</extension>
+        <mime-type>application/x-msschedule</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>scm</extension>
+        <mime-type>application/vnd.lotus-screencam</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>scq</extension>
+        <mime-type>application/scvp-cv-request</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>scs</extension>
+        <mime-type>application/scvp-cv-response</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>scurl</extension>
+        <mime-type>text/vnd.curl.scurl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sda</extension>
+        <mime-type>application/vnd.stardivision.draw</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sdc</extension>
+        <mime-type>application/vnd.stardivision.calc</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sdd</extension>
+        <mime-type>application/vnd.stardivision.impress</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sdkd</extension>
+        <mime-type>application/vnd.solent.sdkm+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sdkm</extension>
+        <mime-type>application/vnd.solent.sdkm+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sdp</extension>
+        <mime-type>application/sdp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sdw</extension>
+        <mime-type>application/vnd.stardivision.writer</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>see</extension>
+        <mime-type>application/vnd.seemail</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>seed</extension>
+        <mime-type>application/vnd.fdsn.seed</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sema</extension>
+        <mime-type>application/vnd.sema</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>semd</extension>
+        <mime-type>application/vnd.semd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>semf</extension>
+        <mime-type>application/vnd.semf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ser</extension>
+        <mime-type>application/java-serialized-object</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>setpay</extension>
+        <mime-type>application/set-payment-initiation</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>setreg</extension>
+        <mime-type>application/set-registration-initiation</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sfd-hdstx</extension>
+        <mime-type>application/vnd.hydrostatix.sof-data</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sfs</extension>
+        <mime-type>application/vnd.spotfire.sfs</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sfv</extension>
+        <mime-type>text/x-sfv</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sgi</extension>
+        <mime-type>image/sgi</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sgl</extension>
+        <mime-type>application/vnd.stardivision.writer-global</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sgm</extension>
+        <mime-type>text/sgml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sgml</extension>
+        <mime-type>text/sgml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sh</extension>
+        <mime-type>application/x-sh</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>shar</extension>
+        <mime-type>application/x-shar</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>shf</extension>
+        <mime-type>application/shf+xml</mime-type>
+    </mime-mapping>
+    <!--
+    <mime-mapping>
+        <extension>shtml</extension>
+        <mime-type>text/x-server-parsed-html</mime-type>
+    </mime-mapping>
+    -->
+    <mime-mapping>
+        <extension>sid</extension>
+        <mime-type>image/x-mrsid-image</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sig</extension>
+        <mime-type>application/pgp-signature</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sil</extension>
+        <mime-type>audio/silk</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>silo</extension>
+        <mime-type>model/mesh</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sis</extension>
+        <mime-type>application/vnd.symbian.install</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sisx</extension>
+        <mime-type>application/vnd.symbian.install</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sit</extension>
+        <mime-type>application/x-stuffit</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sitx</extension>
+        <mime-type>application/x-stuffitx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>skd</extension>
+        <mime-type>application/vnd.koan</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>skm</extension>
+        <mime-type>application/vnd.koan</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>skp</extension>
+        <mime-type>application/vnd.koan</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>skt</extension>
+        <mime-type>application/vnd.koan</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sldm</extension>
+        <mime-type>application/vnd.ms-powerpoint.slide.macroenabled.12</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sldx</extension>
+        <mime-type>application/vnd.openxmlformats-officedocument.presentationml.slide</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>slt</extension>
+        <mime-type>application/vnd.epson.salt</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sm</extension>
+        <mime-type>application/vnd.stepmania.stepchart</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>smf</extension>
+        <mime-type>application/vnd.stardivision.math</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>smi</extension>
+        <mime-type>application/smil+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>smil</extension>
+        <mime-type>application/smil+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>smv</extension>
+        <mime-type>video/x-smv</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>smzip</extension>
+        <mime-type>application/vnd.stepmania.package</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>snd</extension>
+        <mime-type>audio/basic</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>snf</extension>
+        <mime-type>application/x-font-snf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>so</extension>
+        <mime-type>application/octet-stream</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>spc</extension>
+        <mime-type>application/x-pkcs7-certificates</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>spf</extension>
+        <mime-type>application/vnd.yamaha.smaf-phrase</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>spl</extension>
+        <mime-type>application/x-futuresplash</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>spot</extension>
+        <mime-type>text/vnd.in3d.spot</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>spp</extension>
+        <mime-type>application/scvp-vp-response</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>spq</extension>
+        <mime-type>application/scvp-vp-request</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>spx</extension>
+        <mime-type>audio/ogg</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sql</extension>
+        <mime-type>application/x-sql</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>src</extension>
+        <mime-type>application/x-wais-source</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>srt</extension>
+        <mime-type>application/x-subrip</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sru</extension>
+        <mime-type>application/sru+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>srx</extension>
+        <mime-type>application/sparql-results+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ssdl</extension>
+        <mime-type>application/ssdl+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sse</extension>
+        <mime-type>application/vnd.kodak-descriptor</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ssf</extension>
+        <mime-type>application/vnd.epson.ssf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ssml</extension>
+        <mime-type>application/ssml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>st</extension>
+        <mime-type>application/vnd.sailingtracker.track</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>stc</extension>
+        <mime-type>application/vnd.sun.xml.calc.template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>std</extension>
+        <mime-type>application/vnd.sun.xml.draw.template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>stf</extension>
+        <mime-type>application/vnd.wt.stf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sti</extension>
+        <mime-type>application/vnd.sun.xml.impress.template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>stk</extension>
+        <mime-type>application/hyperstudio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>stl</extension>
+        <mime-type>application/vnd.ms-pki.stl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>str</extension>
+        <mime-type>application/vnd.pg.format</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>stw</extension>
+        <mime-type>application/vnd.sun.xml.writer.template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sub</extension>
+        <mime-type>text/vnd.dvb.subtitle</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sus</extension>
+        <mime-type>application/vnd.sus-calendar</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>susp</extension>
+        <mime-type>application/vnd.sus-calendar</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sv4cpio</extension>
+        <mime-type>application/x-sv4cpio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sv4crc</extension>
+        <mime-type>application/x-sv4crc</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>svc</extension>
+        <mime-type>application/vnd.dvb.service</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>svd</extension>
+        <mime-type>application/vnd.svd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>svg</extension>
+        <mime-type>image/svg+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>svgz</extension>
+        <mime-type>image/svg+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>swa</extension>
+        <mime-type>application/x-director</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>swf</extension>
+        <mime-type>application/x-shockwave-flash</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>swi</extension>
+        <mime-type>application/vnd.aristanetworks.swi</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sxc</extension>
+        <mime-type>application/vnd.sun.xml.calc</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sxd</extension>
+        <mime-type>application/vnd.sun.xml.draw</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sxg</extension>
+        <mime-type>application/vnd.sun.xml.writer.global</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sxi</extension>
+        <mime-type>application/vnd.sun.xml.impress</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sxm</extension>
+        <mime-type>application/vnd.sun.xml.math</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>sxw</extension>
+        <mime-type>application/vnd.sun.xml.writer</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>t</extension>
+        <mime-type>text/troff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>t3</extension>
+        <mime-type>application/x-t3vm-image</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>taglet</extension>
+        <mime-type>application/vnd.mynfc</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tao</extension>
+        <mime-type>application/vnd.tao.intent-module-archive</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tar</extension>
+        <mime-type>application/x-tar</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tcap</extension>
+        <mime-type>application/vnd.3gpp2.tcap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tcl</extension>
+        <mime-type>application/x-tcl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>teacher</extension>
+        <mime-type>application/vnd.smart.teacher</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tei</extension>
+        <mime-type>application/tei+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>teicorpus</extension>
+        <mime-type>application/tei+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tex</extension>
+        <mime-type>application/x-tex</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>texi</extension>
+        <mime-type>application/x-texinfo</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>texinfo</extension>
+        <mime-type>application/x-texinfo</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>text</extension>
+        <mime-type>text/plain</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tfi</extension>
+        <mime-type>application/thraud+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tfm</extension>
+        <mime-type>application/x-tex-tfm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tga</extension>
+        <mime-type>image/x-tga</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>thmx</extension>
+        <mime-type>application/vnd.ms-officetheme</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tif</extension>
+        <mime-type>image/tiff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tiff</extension>
+        <mime-type>image/tiff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tmo</extension>
+        <mime-type>application/vnd.tmobile-livetv</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>torrent</extension>
+        <mime-type>application/x-bittorrent</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tpl</extension>
+        <mime-type>application/vnd.groove-tool-template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tpt</extension>
+        <mime-type>application/vnd.trid.tpt</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tr</extension>
+        <mime-type>text/troff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tra</extension>
+        <mime-type>application/vnd.trueapp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>trm</extension>
+        <mime-type>application/x-msterminal</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tsd</extension>
+        <mime-type>application/timestamped-data</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>tsv</extension>
+        <mime-type>text/tab-separated-values</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ttc</extension>
+        <mime-type>application/x-font-ttf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ttf</extension>
+        <mime-type>application/x-font-ttf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ttl</extension>
+        <mime-type>text/turtle</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>twd</extension>
+        <mime-type>application/vnd.simtech-mindmapper</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>twds</extension>
+        <mime-type>application/vnd.simtech-mindmapper</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>txd</extension>
+        <mime-type>application/vnd.genomatix.tuxedo</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>txf</extension>
+        <mime-type>application/vnd.mobius.txf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>txt</extension>
+        <mime-type>text/plain</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>u32</extension>
+        <mime-type>application/x-authorware-bin</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>udeb</extension>
+        <mime-type>application/x-debian-package</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ufd</extension>
+        <mime-type>application/vnd.ufdl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ufdl</extension>
+        <mime-type>application/vnd.ufdl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ulw</extension>
+        <mime-type>audio/basic</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ulx</extension>
+        <mime-type>application/x-glulx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>umj</extension>
+        <mime-type>application/vnd.umajin</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>unityweb</extension>
+        <mime-type>application/vnd.unity</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uoml</extension>
+        <mime-type>application/vnd.uoml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uri</extension>
+        <mime-type>text/uri-list</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uris</extension>
+        <mime-type>text/uri-list</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>urls</extension>
+        <mime-type>text/uri-list</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>ustar</extension>
+        <mime-type>application/x-ustar</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>utz</extension>
+        <mime-type>application/vnd.uiq.theme</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uu</extension>
+        <mime-type>text/x-uuencode</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uva</extension>
+        <mime-type>audio/vnd.dece.audio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvd</extension>
+        <mime-type>application/vnd.dece.data</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvf</extension>
+        <mime-type>application/vnd.dece.data</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvg</extension>
+        <mime-type>image/vnd.dece.graphic</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvh</extension>
+        <mime-type>video/vnd.dece.hd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvi</extension>
+        <mime-type>image/vnd.dece.graphic</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvm</extension>
+        <mime-type>video/vnd.dece.mobile</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvp</extension>
+        <mime-type>video/vnd.dece.pd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvs</extension>
+        <mime-type>video/vnd.dece.sd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvt</extension>
+        <mime-type>application/vnd.dece.ttml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvu</extension>
+        <mime-type>video/vnd.uvvu.mp4</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvv</extension>
+        <mime-type>video/vnd.dece.video</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvva</extension>
+        <mime-type>audio/vnd.dece.audio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvvd</extension>
+        <mime-type>application/vnd.dece.data</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvvf</extension>
+        <mime-type>application/vnd.dece.data</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvvg</extension>
+        <mime-type>image/vnd.dece.graphic</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvvh</extension>
+        <mime-type>video/vnd.dece.hd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvvi</extension>
+        <mime-type>image/vnd.dece.graphic</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvvm</extension>
+        <mime-type>video/vnd.dece.mobile</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvvp</extension>
+        <mime-type>video/vnd.dece.pd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvvs</extension>
+        <mime-type>video/vnd.dece.sd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvvt</extension>
+        <mime-type>application/vnd.dece.ttml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvvu</extension>
+        <mime-type>video/vnd.uvvu.mp4</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvvv</extension>
+        <mime-type>video/vnd.dece.video</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvvx</extension>
+        <mime-type>application/vnd.dece.unspecified</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvvz</extension>
+        <mime-type>application/vnd.dece.zip</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvx</extension>
+        <mime-type>application/vnd.dece.unspecified</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>uvz</extension>
+        <mime-type>application/vnd.dece.zip</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vcard</extension>
+        <mime-type>text/vcard</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vcd</extension>
+        <mime-type>application/x-cdlink</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vcf</extension>
+        <mime-type>text/x-vcard</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vcg</extension>
+        <mime-type>application/vnd.groove-vcard</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vcs</extension>
+        <mime-type>text/x-vcalendar</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vcx</extension>
+        <mime-type>application/vnd.vcx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vis</extension>
+        <mime-type>application/vnd.visionary</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>viv</extension>
+        <mime-type>video/vnd.vivo</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vob</extension>
+        <mime-type>video/x-ms-vob</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vor</extension>
+        <mime-type>application/vnd.stardivision.writer</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vox</extension>
+        <mime-type>application/x-authorware-bin</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vrml</extension>
+        <mime-type>model/vrml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vsd</extension>
+        <mime-type>application/vnd.visio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vsf</extension>
+        <mime-type>application/vnd.vsf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vss</extension>
+        <mime-type>application/vnd.visio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vst</extension>
+        <mime-type>application/vnd.visio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vsw</extension>
+        <mime-type>application/vnd.visio</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vtu</extension>
+        <mime-type>model/vnd.vtu</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>vxml</extension>
+        <mime-type>application/voicexml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>w3d</extension>
+        <mime-type>application/x-director</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wad</extension>
+        <mime-type>application/x-doom</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wav</extension>
+        <mime-type>audio/x-wav</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wax</extension>
+        <mime-type>audio/x-ms-wax</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- Wireless Bitmap -->
+        <extension>wbmp</extension>
+        <mime-type>image/vnd.wap.wbmp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wbs</extension>
+        <mime-type>application/vnd.criticaltools.wbs+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wbxml</extension>
+        <mime-type>application/vnd.wap.wbxml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wcm</extension>
+        <mime-type>application/vnd.ms-works</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wdb</extension>
+        <mime-type>application/vnd.ms-works</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wdp</extension>
+        <mime-type>image/vnd.ms-photo</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>weba</extension>
+        <mime-type>audio/webm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>webm</extension>
+        <mime-type>video/webm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>webp</extension>
+        <mime-type>image/webp</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wg</extension>
+        <mime-type>application/vnd.pmi.widget</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wgt</extension>
+        <mime-type>application/widget</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wks</extension>
+        <mime-type>application/vnd.ms-works</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wm</extension>
+        <mime-type>video/x-ms-wm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wma</extension>
+        <mime-type>audio/x-ms-wma</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wmd</extension>
+        <mime-type>application/x-ms-wmd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wmf</extension>
+        <mime-type>application/x-msmetafile</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- WML Source -->
+        <extension>wml</extension>
+        <mime-type>text/vnd.wap.wml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- Compiled WML -->
+        <extension>wmlc</extension>
+        <mime-type>application/vnd.wap.wmlc</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- WML Script Source -->
+        <extension>wmls</extension>
+        <mime-type>text/vnd.wap.wmlscript</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <!-- Compiled WML Script -->
+        <extension>wmlsc</extension>
+        <mime-type>application/vnd.wap.wmlscriptc</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wmv</extension>
+        <mime-type>video/x-ms-wmv</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wmx</extension>
+        <mime-type>video/x-ms-wmx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wmz</extension>
+        <mime-type>application/x-msmetafile</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>woff</extension>
+        <mime-type>application/x-font-woff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wpd</extension>
+        <mime-type>application/vnd.wordperfect</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wpl</extension>
+        <mime-type>application/vnd.ms-wpl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wps</extension>
+        <mime-type>application/vnd.ms-works</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wqd</extension>
+        <mime-type>application/vnd.wqd</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wri</extension>
+        <mime-type>application/x-mswrite</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wrl</extension>
+        <mime-type>model/vrml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wsdl</extension>
+        <mime-type>application/wsdl+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wspolicy</extension>
+        <mime-type>application/wspolicy+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wtb</extension>
+        <mime-type>application/vnd.webturbo</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>wvx</extension>
+        <mime-type>video/x-ms-wvx</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>x32</extension>
+        <mime-type>application/x-authorware-bin</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>x3d</extension>
+        <mime-type>model/x3d+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>x3db</extension>
+        <mime-type>model/x3d+binary</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>x3dbz</extension>
+        <mime-type>model/x3d+binary</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>x3dv</extension>
+        <mime-type>model/x3d+vrml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>x3dvz</extension>
+        <mime-type>model/x3d+vrml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>x3dz</extension>
+        <mime-type>model/x3d+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xaml</extension>
+        <mime-type>application/xaml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xap</extension>
+        <mime-type>application/x-silverlight-app</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xar</extension>
+        <mime-type>application/vnd.xara</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xbap</extension>
+        <mime-type>application/x-ms-xbap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xbd</extension>
+        <mime-type>application/vnd.fujixerox.docuworks.binder</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xbm</extension>
+        <mime-type>image/x-xbitmap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xdf</extension>
+        <mime-type>application/xcap-diff+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xdm</extension>
+        <mime-type>application/vnd.syncml.dm+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xdp</extension>
+        <mime-type>application/vnd.adobe.xdp+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xdssc</extension>
+        <mime-type>application/dssc+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xdw</extension>
+        <mime-type>application/vnd.fujixerox.docuworks</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xenc</extension>
+        <mime-type>application/xenc+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xer</extension>
+        <mime-type>application/patch-ops-error+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xfdf</extension>
+        <mime-type>application/vnd.adobe.xfdf</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xfdl</extension>
+        <mime-type>application/vnd.xfdl</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xht</extension>
+        <mime-type>application/xhtml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xhtml</extension>
+        <mime-type>application/xhtml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xhvml</extension>
+        <mime-type>application/xv+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xif</extension>
+        <mime-type>image/vnd.xiff</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xla</extension>
+        <mime-type>application/vnd.ms-excel</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xlam</extension>
+        <mime-type>application/vnd.ms-excel.addin.macroenabled.12</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xlc</extension>
+        <mime-type>application/vnd.ms-excel</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xlf</extension>
+        <mime-type>application/x-xliff+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xlm</extension>
+        <mime-type>application/vnd.ms-excel</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xls</extension>
+        <mime-type>application/vnd.ms-excel</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xlsb</extension>
+        <mime-type>application/vnd.ms-excel.sheet.binary.macroenabled.12</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xlsm</extension>
+        <mime-type>application/vnd.ms-excel.sheet.macroenabled.12</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xlsx</extension>
+        <mime-type>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xlt</extension>
+        <mime-type>application/vnd.ms-excel</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xltm</extension>
+        <mime-type>application/vnd.ms-excel.template.macroenabled.12</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xltx</extension>
+        <mime-type>application/vnd.openxmlformats-officedocument.spreadsheetml.template</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xlw</extension>
+        <mime-type>application/vnd.ms-excel</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xm</extension>
+        <mime-type>audio/xm</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xml</extension>
+        <mime-type>application/xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xo</extension>
+        <mime-type>application/vnd.olpc-sugar</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xop</extension>
+        <mime-type>application/xop+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xpi</extension>
+        <mime-type>application/x-xpinstall</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xpl</extension>
+        <mime-type>application/xproc+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xpm</extension>
+        <mime-type>image/x-xpixmap</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xpr</extension>
+        <mime-type>application/vnd.is-xpr</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xps</extension>
+        <mime-type>application/vnd.ms-xpsdocument</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xpw</extension>
+        <mime-type>application/vnd.intercon.formnet</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xpx</extension>
+        <mime-type>application/vnd.intercon.formnet</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xsl</extension>
+        <mime-type>application/xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xslt</extension>
+        <mime-type>application/xslt+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xsm</extension>
+        <mime-type>application/vnd.syncml+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xspf</extension>
+        <mime-type>application/xspf+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xul</extension>
+        <mime-type>application/vnd.mozilla.xul+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xvm</extension>
+        <mime-type>application/xv+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xvml</extension>
+        <mime-type>application/xv+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xwd</extension>
+        <mime-type>image/x-xwindowdump</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xyz</extension>
+        <mime-type>chemical/x-xyz</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>xz</extension>
+        <mime-type>application/x-xz</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>yang</extension>
+        <mime-type>application/yang</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>yin</extension>
+        <mime-type>application/yin+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>z</extension>
+        <mime-type>application/x-compress</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>Z</extension>
+        <mime-type>application/x-compress</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>z1</extension>
+        <mime-type>application/x-zmachine</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>z2</extension>
+        <mime-type>application/x-zmachine</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>z3</extension>
+        <mime-type>application/x-zmachine</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>z4</extension>
+        <mime-type>application/x-zmachine</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>z5</extension>
+        <mime-type>application/x-zmachine</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>z6</extension>
+        <mime-type>application/x-zmachine</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>z7</extension>
+        <mime-type>application/x-zmachine</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>z8</extension>
+        <mime-type>application/x-zmachine</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>zaz</extension>
+        <mime-type>application/vnd.zzazz.deck+xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>zip</extension>
+        <mime-type>application/zip</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>zir</extension>
+        <mime-type>application/vnd.zul</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>zirz</extension>
+        <mime-type>application/vnd.zul</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+        <extension>zmm</extension>
+        <mime-type>application/vnd.handheld-entertainment+xml</mime-type>
+    </mime-mapping>
+
+    <!-- ==================== Default Welcome File List ===================== -->
+    <!-- When a request URI refers to a directory, the default servlet looks  -->
+    <!-- for a "welcome file" within that directory and, if present, to the   -->
+    <!-- corresponding resource URI for display.                              -->
+    <!-- If no welcome files are present, the default servlet either serves a -->
+    <!-- directory listing (see default servlet configuration on how to       -->
+    <!-- customize) or returns a 404 status, depending on the value of the    -->
+    <!-- listings setting.                                                    -->
+    <!--                                                                      -->
+    <!-- If you define welcome files in your own application's web.xml        -->
+    <!-- deployment descriptor, that list *replaces* the list configured      -->
+    <!-- here, so be sure to include any of the default values that you wish  -->
+    <!-- to use within your application.                                       -->
+
+    <welcome-file-list>
+        <welcome-file>index.html</welcome-file>
+        <welcome-file>index.htm</welcome-file>
+        <!--        <welcome-file>index.jsp</welcome-file> -->
+    </welcome-file-list>
+
+</web-app>
diff --git a/tomcat/lib/annotations-api.jar b/tomcat/lib/annotations-api.jar
new file mode 100644
index 0000000..0b039ee
Binary files /dev/null and b/tomcat/lib/annotations-api.jar differ
diff --git a/tomcat/lib/catalina.jar b/tomcat/lib/catalina.jar
new file mode 100644
index 0000000..14a1e75
Binary files /dev/null and b/tomcat/lib/catalina.jar differ
diff --git a/tomcat/lib/el-api.jar b/tomcat/lib/el-api.jar
new file mode 100644
index 0000000..8f5c4c4
Binary files /dev/null and b/tomcat/lib/el-api.jar differ
diff --git a/tomcat/lib/servlet-api.jar b/tomcat/lib/servlet-api.jar
new file mode 100644
index 0000000..497215f
Binary files /dev/null and b/tomcat/lib/servlet-api.jar differ
diff --git a/tomcat/lib/tomcat-api.jar b/tomcat/lib/tomcat-api.jar
new file mode 100644
index 0000000..8a60958
Binary files /dev/null and b/tomcat/lib/tomcat-api.jar differ
diff --git a/tomcat/lib/tomcat-coyote.jar b/tomcat/lib/tomcat-coyote.jar
new file mode 100644
index 0000000..d4b198f
Binary files /dev/null and b/tomcat/lib/tomcat-coyote.jar differ
diff --git a/tomcat/lib/tomcat-jni.jar b/tomcat/lib/tomcat-jni.jar
new file mode 100644
index 0000000..19503a3
Binary files /dev/null and b/tomcat/lib/tomcat-jni.jar differ
diff --git a/tomcat/lib/tomcat-util-scan.jar b/tomcat/lib/tomcat-util-scan.jar
new file mode 100644
index 0000000..de22ac2
Binary files /dev/null and b/tomcat/lib/tomcat-util-scan.jar differ
diff --git a/tomcat/lib/tomcat-util.jar b/tomcat/lib/tomcat-util.jar
new file mode 100644
index 0000000..ba7ab89
Binary files /dev/null and b/tomcat/lib/tomcat-util.jar differ
diff --git a/distribution/standalone/src/main/install/misc/tomcat/index.html b/tomcat/webapps/ROOT/index.html
similarity index 100%
rename from distribution/standalone/src/main/install/misc/tomcat/index.html
rename to tomcat/webapps/ROOT/index.html
diff --git a/web/angular-web/pom.xml b/web/angular-web/pom.xml
deleted file mode 100644
index da54607..0000000
--- a/web/angular-web/pom.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2015 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory. If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0          http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>artifactory-angular-web</artifactId>
-    <packaging>jar</packaging>
-    <name>Artifactory Angular Web</name>
-
-    <parent>
-        <artifactId>artifactory-web-parent</artifactId>
-        <groupId>org.artifactory</groupId>
-        <version>4.8.0</version>
-    </parent>
-    <dependencies>
-        <dependency>
-            <groupId>org.easymock</groupId>
-            <artifactId>easymock</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>com.github.eirslett</groupId>
-                <artifactId>frontend-maven-plugin</artifactId>
-                <version>0.0.23</version>
-                <configuration>
-                    <workingDirectory>src/main/webapp</workingDirectory>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>install node and npm</id>
-                        <goals>
-                            <goal>install-node-and-npm</goal>
-                        </goals>
-                        <configuration>
-                            <nodeDownloadRoot>http://repo.jfrog.org/artifactory/node.dist/</nodeDownloadRoot>
-                            <npmDownloadRoot>http://repo.jfrog.org/artifactory/npmjs.org/npm/-/</npmDownloadRoot>
-                            <nodeVersion>v0.12.3</nodeVersion>
-                            <npmVersion>2.14.2</npmVersion>
-                        </configuration>
-                    </execution>
-
-                    <execution>
-                        <id>npm update</id>
-                        <goals>
-                            <goal>npm</goal>
-                        </goals>
-                        <configuration>
-                            <arguments>update</arguments>
-                        </configuration>
-                    </execution>
-
-                    <execution>
-                        <id>bower install</id>
-                        <goals>
-                            <goal>bower</goal>
-                        </goals>
-                        <configuration>
-                            <arguments>install</arguments>
-                        </configuration>
-                    </execution>
-
-                    <execution>
-                        <id>gulp</id>
-                        <goals>
-                            <goal>gulp</goal>
-                        </goals>
-                        <configuration>
-                            <arguments>build</arguments>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/web/angular-web/src/main/resources/DUMMY.TXT b/web/angular-web/src/main/resources/DUMMY.TXT
deleted file mode 100644
index 938fcef..0000000
--- a/web/angular-web/src/main/resources/DUMMY.TXT
+++ /dev/null
@@ -1 +0,0 @@
-Dummy file for the source plugin to work
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/.bowerrc b/web/angular-web/src/main/webapp/.bowerrc
deleted file mode 100644
index aeeed59..0000000
--- a/web/angular-web/src/main/webapp/.bowerrc
+++ /dev/null
@@ -1 +0,0 @@
-{"directory" : "components"}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/.gitignore b/web/angular-web/src/main/webapp/.gitignore
deleted file mode 100644
index fc28949..0000000
--- a/web/angular-web/src/main/webapp/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-/bower_components
-/node_modules
-/node
-/.sass-cache
-.idea/*
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/.npmrc b/web/angular-web/src/main/webapp/.npmrc
deleted file mode 100644
index e69de29..0000000
diff --git a/web/angular-web/src/main/webapp/Gulpfile.js b/web/angular-web/src/main/webapp/Gulpfile.js
deleted file mode 100644
index 1939cef..0000000
--- a/web/angular-web/src/main/webapp/Gulpfile.js
+++ /dev/null
@@ -1,298 +0,0 @@
-var gulp = require("gulp");
-var gutil = require("gulp-util");
-var webpack = require("webpack");
-var path = require('path');
-var concat = require('gulp-concat');
-var html2js = require('gulp-html2js');
-var webpackConfig = require('./webpack.config');
-var less = require('gulp-less');
-var sourceMaps = require('gulp-sourcemaps');
-var CONFIG = require('./artifactory.config');
-var install = require("gulp-install");
-var iconfont = require('gulp-iconfont');
-var iconfontCss = require('gulp-iconfont-css');
-var browserSync = require('browser-sync');
-var runSequence = require('run-sequence');
-var reload      = browserSync.reload;
-var webserver = require('gulp-webserver');
-var prefixer = require('gulp-autoprefixer');
-var combiner = require('stream-combiner2');
-var uglify = require('gulp-uglify');
-var minifyCss = require('gulp-minify-css');
-var RevAll = require('gulp-rev-all');
-var revReplace = require("gulp-rev-replace");
-var revNapkin = require('gulp-rev-napkin');
-var karma = require('karma');
-var rimraf = require('gulp-rimraf');
-
-// default task runs the development tasks seq
-gulp.task('default',['build', 'watch']);
-
-
-// Build tasks common to dev and production
-gulp.task('build:common',
-    function(callback) {
-        runSequence(
-            'clean',
-            [
-                'webpack',
-                'templates',
-                'vendorScripts',
-                'vendorStyles',
-                'vendorStylesAssets',
-                'vendorFonts',
-                'less',
-                'copyHtml',
-                'fonts',
-                'images',
-                'jqueryui-images'
-            ],
-            callback
-        );
-    }
-);
-
-
-// Build the client. This is run by Jenkins
-gulp.task('build',
-    function(callback) {
-        delete webpackConfig.devtool; //don't generate source maps on production build
-        runSequence(
-            'build:common',
-            'revreplace',
-            callback
-        );
-    }
-);
-
-// Same as build:common just copy styleguide
-gulp.task("build:dev",
-    function(callback) {
-        runSequence(
-            'build:common',
-            'copyStyleguide',
-            callback
-        );
-    }
-);
-
-// Clean up
-gulp.task('clean', function() {
-    return gulp.src(CONFIG.DESTINATIONS.TARGET, { read: false })
-        .pipe(rimraf({ force: true }));
-});
-
-// Reload everything:
-gulp.task("reload", reload);
-// Reload CSS files:
-gulp.task("reloadCss", function() {
-    reload(["vendorStyles.css", "application.css"]);
-});
-
-// Utility factory function to create a function that runs a sequence
-function sequence() {
-    var args = arguments;
-    return function() {
-        runSequence.apply(this, args);
-    }
-}
-
-// Run browserSync that proxies to Artifactory REST Server
-gulp.task("serve:dev", ["build:dev", "watch:dev"], connectTo('http://10.100.1.110:8081'));
-gulp.task("serve:local", ["build:dev", "watch:dev"], connectTo('http://localhost:8081'));
-gulp.task("serve:8080", ["build:dev", "watch:dev"], connectTo('http://localhost:8080'));
-gulp.task("serve", ["serve:local"]);
-
-function connectTo(url) {
-    return function(cb) {
-        gulp.src(CONFIG.DESTINATIONS.TARGET)
-            .pipe(webserver({
-                open: false,
-                proxies: [
-                    {source: '/artifactory/ui', target: url + '/artifactory/ui'},
-                    {source: '/artifactory/webapp', target: 'http://localhost:8000'}
-                ]
-            }));
-        browserSync({
-            proxy: 'localhost:8000',
-            ghostMode: false,
-            open: false
-        });
-        return cb;
-    };
-}
-
-// Set watchers and run relevant tasks - then reload (when running under browsersync)
-gulp.task('watch', function () {
-    gulp.watch('./bower.json', sequence('bower', ['vendorScripts', 'vendorStyles', 'vendorStylesAssets', 'vendorFonts'], 'reload'));
-    gulp.watch(CONFIG.SOURCES.APPLICATION_JS, sequence('webpack', 'reload'));
-    gulp.watch(CONFIG.SOURCES.TEMPLATES, sequence('templates', 'reload'));
-    gulp.watch(CONFIG.SOURCES.REQUIRED_TEMPLATES, sequence('webpack', 'reload'));
-    gulp.watch(CONFIG.SOURCES.LESS, sequence('less', 'reloadCss'));
-    gulp.watch(CONFIG.SOURCES.VENDOR_JS, sequence(['vendorScripts', 'vendorStyles', 'vendorStylesAssets', 'vendorFonts'], 'reload'));
-    gulp.watch(CONFIG.SOURCES.VENDOR_CSS, sequence(['vendorStyles'], 'reloadCss'));
-    gulp.watch(CONFIG.SOURCES.FONTS, sequence('fonts', 'reload'));
-    gulp.watch(CONFIG.SOURCES.INDEX, sequence('copyHtml', 'reload'));
-});
-
-// Watch the styleguide
-gulp.task('watch:dev', ["watch"], function () {
-    gulp.watch(CONFIG.SOURCES.STYLEGUIDE, sequence('copyStyleguide', 'reload'));
-});
-
-// install bower dependedencies
-gulp.task('bower', function () {
-    return gulp.src(['./bower.json'])
-        .pipe(install());
-});
-
-// bundle application code
-gulp.task("webpack", function (callback) {
-    return webpack(webpackConfig, function (err, stats) {
-        console.log(err);
-        if (err) {
-            throw new gutil.PluginError("webpack", err)
-        }
-        gutil.log("[webpack]", stats.toString({
-            // output options
-        }));
-        callback();
-    });
-});
-
-// cache templates
-gulp.task('templates', function () {
-    return gulp.src(CONFIG.SOURCES.TEMPLATES)
-        .pipe(html2js({
-            outputModuleName: 'artifactory.templates',
-            base: 'app/',
-            useStrict: true
-        }))
-        .pipe(concat('templates.js'))
-        .pipe(uglify({mangle:false}))
-        .pipe(gulp.dest(CONFIG.DESTINATIONS.TARGET))
-});
-
-// concat vendor scripts
-gulp.task('vendorScripts', function () {
-    return gulp.src(CONFIG.SOURCES.VENDOR_SCRIPTS)
-        .pipe(concat('vendorScripts.js'))
-        .pipe(uglify({mangle:false}))
-        .pipe(gulp.dest(CONFIG.DESTINATIONS.TARGET));
-});
-
-// concat vendor stylesheets
-gulp.task('vendorStyles', function () {
-    return gulp.src(CONFIG.SOURCES.VENDOR_CSS)
-        .pipe(concat('vendorStyles.css'))
-        .pipe(minifyCss())
-        .pipe(gulp.dest(CONFIG.DESTINATIONS.TARGET + '/css'));
-});
-
-// copy vendor assets to css
-gulp.task('vendorStylesAssets', function () {
-    return gulp.src(CONFIG.SOURCES.VENDOR_ASSETS)
-        .pipe(gulp.dest(CONFIG.DESTINATIONS.TARGET + '/css'));
-});
-
-gulp.task('vendorFonts', function () {
-    return gulp.src(CONFIG.SOURCES.VENDOR_FONTS)
-        .pipe(gulp.dest(CONFIG.DESTINATIONS.TARGET + '/fonts'));
-});
-
-gulp.task('iconfonts', function(){
-    return gulp.src(CONFIG.SOURCES.MEDIUM_SVG_ICONS)
-        .pipe(iconfontCss({
-            fontName: 'medium_svgicons'
-        }))
-        .pipe(iconfont({
-            fontName: 'medium_svgicons'
-        }))
-        .pipe(gulp.dest(CONFIG.DESTINATIONS.TARGET + '/css'));
-});
-
-
-// compile less
-gulp.task('less', function () {
-    var combined = combiner.obj([
-        gulp.src(CONFIG.SOURCES.LESS_MAIN_FILE),
-//        sourceMaps.init(),
-        less({paths: [path.join(__dirname, 'less', 'includes')]}),
-        prefixer(),
-        concat('application.css'),
-//        sourceMaps.write(),
-        minifyCss(),
-        gulp.dest(CONFIG.DESTINATIONS.TARGET + '/css')
-    ]);
-
-    // any errors in the above streams will get caught
-    // by this listener, instead of being thrown:
-    combined.on('error', console.error.bind(console));
-
-    return combined;
-});
-
-// copy html file to dest
-gulp.task('copyHtml', function () {
-    return gulp.src(CONFIG.SOURCES.INDEX)
-        .pipe(gulp.dest(CONFIG.DESTINATIONS.TARGET))
-});
-
-// copy styleguide file to dest - for development only
-gulp.task('copyStyleguide', function () {
-    return gulp.src(CONFIG.SOURCES.STYLEGUIDE)
-        .pipe(gulp.dest(CONFIG.DESTINATIONS.TARGET))
-});
-
-//copy fonts
-gulp.task('fonts', function () {
-    return gulp.src(CONFIG.SOURCES.FONTS)
-        .pipe(gulp.dest(CONFIG.DESTINATIONS.TARGET + '/fonts'))
-});
-
-//copy images
-gulp.task('images', function () {
-    return gulp.src(CONFIG.SOURCES.IMAGES)
-        .pipe(gulp.dest(CONFIG.DESTINATIONS.TARGET + '/images'))
-});
-
-//copy jquery-ui images
-gulp.task('jqueryui-images', function () {
-    return gulp.src(CONFIG.SOURCES.JQUERY_UI_IMAGES)
-        .pipe(gulp.dest(CONFIG.DESTINATIONS.TARGET + '/css/images'))
-});
-
-function transformFilename(file, hash) {
-    var ext = path.extname(file.path);
-    return path.basename(file.path, ext) + '.' + process.env.BUILD_NUMBER + ext; // filename.<BUILD_NUMBER>.ext
-}
-
-gulp.task("revision", function(){
-    if (process.env.BUILD_NUMBER) {
-        var revAll = new RevAll({transformFilename: transformFilename});
-        return gulp.src(CONFIG.DESTINATIONS.TARGET_REV)
-            .pipe(revAll.revision())
-            .pipe(revNapkin({force:true}))
-            .pipe(gulp.dest(CONFIG.DESTINATIONS.TARGET))
-            .pipe(revAll.manifestFile())
-            //     .pipe(revDel({ dest: CONFIG.DESTINATIONS.TARGET, force: true }))
-            .pipe(gulp.dest(CONFIG.DESTINATIONS.TARGET))
-    }
-})
-
-gulp.task("revreplace", ['revision'], function() {
-    if (process.env.BUILD_NUMBER) {
-        var manifest = gulp.src(CONFIG.DESTINATIONS.TARGET + "/rev-manifest.json");
-        return gulp.src(CONFIG.SOURCES.INDEX)
-            .pipe(revReplace({manifest: manifest}))
-            .pipe(gulp.dest(CONFIG.DESTINATIONS.TARGET))
-    }
-});
-
-
-gulp.task('karma', function (done) {
-    karma.server.start({
-        configFile: __dirname + '/karma.conf.js',
-        singleRun: true
-    }, done);
-});
diff --git a/web/angular-web/src/main/webapp/app/app.html b/web/angular-web/src/main/webapp/app/app.html
deleted file mode 100644
index 32fa00c..0000000
--- a/web/angular-web/src/main/webapp/app/app.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!DOCTYPE html>
-<html ng-app="artifactory.ui">
-<head>
-    <meta charset="UTF-8">
-    <meta name="google" content="notranslate">
-    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
-
-    <link rel="icon" type="image/x-icon" href="images/favicon.ico"/>
-
-    <!-- Stylesheets -->
-    <link rel="stylesheet" href="css/vendorStyles.css"/>
-    <link rel="stylesheet" href="css/application.css"/>
-
-    <title></title>
-</head>
-
-<body jf-body-class ng-class="{'load-complete':jfBodyClass.isLoadCompleted()}">
-<jf-spinner domain="body"></jf-spinner>
-<toaster-container></toaster-container>
-
-<ui-view></ui-view>
-
-<!-- Javascript -->
-<script type="text/javascript" src="vendorScripts.js"></script>
-<script type="text/javascript" src="templates.js"></script>
-
-<!-- Application code -->
-<script src="artifactory_core.js"></script>
-<script src="artifactory_services.js"></script>
-<script src="artifactory_dao.js"></script>
-
-<script src="artifactory_ui.js"></script>
-<script src="artifactory_ui_components.js"></script>
-<script src="artifactory_directives.js"></script>
-<script src="artifactory_filters.js"></script>
-
-<script src="artifactory_views.js"></script>
-<script src="artifactory_states.js"></script>
-<script src="artifactory_main.js"></script>
-
-</body>
-</html>
diff --git a/web/angular-web/src/main/webapp/app/app.js b/web/angular-web/src/main/webapp/app/app.js
deleted file mode 100644
index bb9ee92..0000000
--- a/web/angular-web/src/main/webapp/app/app.js
+++ /dev/null
@@ -1,241 +0,0 @@
-import Models                   from './models/models.module';
-
-if (angular.version.full !== '1.4.8') console.log("%cWrong AngularJS version!","color: #ff0000;");
-
-// For debugging:
-window._inject = function(injectable) {
-    return angular.element(document.body).injector().get(injectable);
-}
-
-if (!String.prototype.endsWith) {
-    String.prototype.endsWith = function (str) {
-        return this.substr(this.length - str.length,str.length)===str;
-    }
-}
-if (!String.prototype.startsWith) {
-    String.prototype.startsWith = function (str) {
-        return this.substr(0, str.length)===str;
-    }
-}
-
-/**
- * providers configurations
- * @param $urlRouterProvider
- */
-function appConfig($stateProvider, $urlRouterProvider, ngClipProvider, $httpProvider) {
-    $urlRouterProvider.otherwise(function($injector,$location) {
-        if ($location.path() === '' || $location.path() === '/') return '/home';
-        else return '/404';
-    });
-    ngClipProvider.setPath("css/ZeroClipboard.swf");
-    $httpProvider.interceptors.push('artifactorySpinnerInterceptor');
-    $httpProvider.interceptors.push('artifactoryMessageInterceptor');
-    $httpProvider.interceptors.push('artifactorySessionInterceptor');
-    $httpProvider.interceptors.push('artifactoryServerErrorInterceptor');
-    $httpProvider.interceptors.push('artifactoryDebugInterceptor');
-}
-
-function appRun($httpBackend, $rootScope, ArtifactoryFeatures, $timeout, $animate) {
-
-
-    $httpBackend.whenPOST(/.*/).passThrough();
-    $httpBackend.whenPUT(/.*/).passThrough();
-    $httpBackend.whenGET(/.*/).passThrough();
-    $httpBackend.whenDELETE(/.*/).passThrough();
-    $httpBackend.whenPATCH(/.*/).passThrough();
-    defineCodeMirrorMimes();
-    defineCodeMirrorLinkOverlay();
-    defineCodeMirrorAqlMode();
-
-    $timeout(()=>{
-        if (ArtifactoryFeatures.isOss()) {
-            installHiringDevsHook();
-        }
-    },5000)
-
-
-    tempFixForAnimateParamsReversal($animate);
-    logNgAnimations($animate);
-}
-
-angular.module('artifactory.ui', [
-
-    // Vendor modules
-    'ngMessages',
-    'ngAnimate',
-    'ui.utils',
-    'ui.select',
-    'selectize',
-    'ui.codemirror',
-    'cfp.hotkeys',
-    'artifactory.templates',
-    'ui.router',
-/* --- MOVED TO artifactory_grid module
-    'ui.grid',
-    'ui.grid.autoResize',
-    'ui.grid.edit',
-    'ui.grid.selection',
-    'ui.grid.pagination',
-    'ui.grid.grouping',
-    'ui.grid.resizeColumns',
-*/
-    'ngCookies',
-    'toaster',
-    'ngSanitize',
-    'ui.layout',
-    'ui.bootstrap',
-    'ngMockE2E',
-    'ngClipboard',
-    'ngPasswordStrength',
-    'angular-capitalize-filter',
-    'angularFileUpload',
-    // Application modules
-    'artifactory.services',
-    'artifactory.directives',
-    'artifactory.dao',
-    'artifactory.ui_components',
-    'artifactory.states',
-    'artifactory.filters',
-    'ui.grid.draggable-rows',
-    'color.picker',
-    Models.name
-])
-    .config(appConfig)
-    .run(appRun);
-
-function aliasMime(newMime, existingMime) {
-    CodeMirror.defineMIME(newMime, CodeMirror.mimeModes[existingMime]);
-}
-function defineCodeMirrorMimes() {
-    aliasMime('text/x-java-source', 'text/x-java');
-    aliasMime('pom', 'text/xml');
-
-    /* Example definition of a simple mode that understands a subset of
-     * JavaScript:
-     */
-
-}
-
-
-function defineCodeMirrorAqlMode() {
-    CodeMirror.defineMode("aql", function () {
-        var urlRegex = /^https?:\/\/[a-zA-Z]+(\.)?(:[0-9]+)?.+?(?=\s|$|"|'|>|<)/;
-
-        let inApiKey = false;
-        return {
-            token: function (stream, state) {
-
-                if (stream.match(/(?:curl|\-\H|\-\X|\-d|POST)\b/)) {
-                    return "external-command";
-                }
-                else if (stream.match(/(?:X\-Api\-Key)\b/)) {
-                    inApiKey=true;
-                    return "header-tag";
-                }
-                else if (stream.match("'")) {
-                    inApiKey = false;
-                    return null;
-                }
-                else if (stream.match(/(?:find|include|limit|sort|offset)\b/)) {
-                    return "aql-keyword";
-                }
-                else if (stream.match(/(?:\$and|\$or|\$ne|\$gt|\$gte|\$lt|\$lte|\$rf|\$msp|\$match|\$nmatch|\$eq|\$asc|\$desc)\b/)) {
-                    return "aql-operators";
-                }
-                else if (stream.match(/(?:items|builds|entries)\b/)) {
-                    return "aql-domain";
-                }
-                else if (stream.match(/[\{\}\[\]\(\)]+/)) {
-                    return "aql-brackets";
-                }
-                else if (stream.match(urlRegex)) {
-                    return "api-url";
-                }
-                else {
-                    let ret = null;
-                    if (inApiKey && !stream.match(':')) {
-                        ret = "api-key";
-                    }
-                    stream.next();
-                    return ret;
-                }
-            }
-        };
-
-    });
-}
-
-function defineCodeMirrorLinkOverlay() {
-    var urlRegex = /^https?:\/\/[a-zA-Z]+(\.)?(:[0-9]+)?.+?(?=\s|$|"|'|>|<)/;
-    CodeMirror.defineMode("links", function (config, parserConfig) {
-        var linkOverlay = {
-            token: function (stream, state) {
-                if (stream.match(urlRegex)) {
-                    return "link";
-                }
-                while (stream.next() != null && !stream.match(urlRegex, false)) {
-                }
-                return null;
-            }
-        };
-
-        return CodeMirror.overlayMode(CodeMirror.getMode(config, config.mimeType || "text/xml"), linkOverlay);
-    });
-}
-
-
-
-
-function installHiringDevsHook() {
-    window.u = {
-        r: {
-            reading: function() {
-                window.never={
-                    mind: function() {
-                        window.location.href="https://www.jfrog.com/about/open-positions/";
-                    }
-                };
-                setTimeout(function() {
-                    delete window.never;
-                },500);
-                return false;
-            }
-        }
-    };
-    console.log('%cif (u.r.reading(this) && u.can(code) && u.r.looking4.a.job) {\n    u.may(b.come.a(new JFrog("Star Developer")));\n}\nelse {\n    never.mind();\n}\n// Run this code snippet to find out more about CAREERS & OPPORTUNITIES @ JFrog', "font: 12px sans-serif; color: #43a047;");
-}
-
-
-function tempFixForAnimateParamsReversal($animate) {
-    let origFunc = $animate.enabled.bind($animate);
-    $animate.enabled = function() {
-        if (typeof arguments[0] === 'boolean' && typeof arguments[1] === 'object') {
-            let temp = arguments[0];
-            arguments[0] = arguments[1];
-            arguments[1] = temp;
-        }
-        return origFunc.apply($animate, arguments);
-    }
-}
-
-function logNgAnimations($animate) {
-    if (localStorage._logNgAnimations) {
-        setInterval(()=>{
-            let enters = $('.ng-enter').get();
-            let leaves = $('.ng-leave').get();
-
-            if (enters.length || leaves.length) {
-
-                let all = enters.concat(leaves);
-
-                all.forEach((elem) => {
-                    if ($animate.enabled(elem)) {
-                        console.log('ngAnimating: ',elem);
-                    }
-                });
-            }
-        },100);
-    }
-}
-
-
diff --git a/web/angular-web/src/main/webapp/app/assets/fonts/artifactory.eot b/web/angular-web/src/main/webapp/app/assets/fonts/artifactory.eot
deleted file mode 100644
index 7caa960..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/fonts/artifactory.eot and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/fonts/artifactory.svg b/web/angular-web/src/main/webapp/app/assets/fonts/artifactory.svg
deleted file mode 100644
index d337557..0000000
--- a/web/angular-web/src/main/webapp/app/assets/fonts/artifactory.svg
+++ /dev/null
@@ -1,128 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg">
-<metadata>Generated by IcoMoon</metadata>
-<defs>
-<font id="artifactory" horiz-adv-x="1024">
-<font-face units-per-em="1024" ascent="960" descent="-64" />
-<missing-glyph horiz-adv-x="1024" />
-<glyph unicode="&#x20;" horiz-adv-x="512" d="" />
-<glyph unicode="&#x21;" glyph-name="remote-repo" d="M752 792c-4 0-14 4-20 10-62 56-138 92-226 92-82 0-158-36-220-92-10-10-30-10-40 0s-10 30 0 40c72 66 164 108 260 108 98 0 190-42 262-108 10-10 10-30 0-40-6-6-10-10-16-10zM692 688c-6 0-12 0-16 6-124 98-216 98-332 0-12-6-26-6-36 4-12 16-12 32 4 42 138 112 256 112 400 0 10-10 16-26 4-42-10-4-20-10-24-10zM762 458l-250 124-250-124 250-122zM512 720l-410-190v-374l410-204 410 214v364zM870 208c0-10-14-22-26-26l-316-158c-6 0-10-6-16-6s-10 0-10 6l-3 [...]
-<glyph unicode="&#x22;" glyph-name="archive-2" d="M64 960v-1024h896v1024zM896 0h-768v896h320v-64h-64v-64h64v-64h-64v-64h64v-64h-64v-64h64v-64h192v64h-64v64h64v64h-64v64h64v64h-64v64h64v64h256z" />
-<glyph unicode="&#x23;" glyph-name="more" d="M512-64c-284 0-512 228-512 512s228 512 512 512c284 0 512-228 512-512s-228-512-512-512zM512 900c-246 0-452-206-452-452s206-452 452-452c246 0 452 206 452 452s-206 452-452 452zM512 298c-6 0-12 0-18 6l-228 198c-14 12-14 30 0 42 12 12 30 12 42 0l204-186 204 186c12 12 30 12 42 0 14-12 14-30 0-42l-222-204c-12 0-18 0-24 0z" />
-<glyph unicode="&#x24;" glyph-name="gradle" d="M704 448c0-106-86-192-192-192s-192 86-192 192c0 106 86 192 192 192s192-86 192-192zM692 768l140-256h128c-38 218-224 384-448 384-64 0-122-12-180-38l64-90zM692 128h-352l-180 320 134 244-70 102c-96-84-160-206-160-346 0-250 198-448 448-448 224 0 410 166 442 384h-128z" />
-<glyph unicode="&#x25;" glyph-name="docker-tags" d="M996 202h-812c-4 0-12 4-16 8l-128 136c-56 56-56 148 0 200l128 140c4 4 8 8 16 8h812c12 0 20-8 20-20v-452c0-12-12-20-20-20zM192 244h782v408h-782l-122-130c-20-20-30-46-30-74s14-54 30-74zM226 346c-58 0-104 44-104 102s46 102 104 102c56 0 102-44 102-102s-46-102-102-102zM226 510c-34 0-62-30-62-62s28-62 62-62c32 0 60 30 60 62s-28 62-60 62zM852 488h-410c-12 0-20 10-20 22s8 20 20 20h410c12 0 20-8 20-20s-12-22-20-22zM852 366h-410c-12 0-20 8-20 20s [...]
-<glyph unicode="&#x26;" glyph-name="bower" d="M980 474c-20 6-32 12-52 18-90 26-186 40-276 52-12 0-32 6-44 6 6 32 20 38 44 38 0-6 8-12 8-18s6-6 12-6 26 0 38 0c64 6 102 38 128 102 6 18 14 38 14 58 6 44 24 82 50 114 0 0 6 6 6 14-70 24-198-26-248-136-14 0-26 8-32 8-8 0-14 6-14 12-32 102-114 166-218 160-114 0-210-44-288-128-76-90-108-192-108-308 6-102 38-198 96-288 26-38 58-70 96-96 38-24 76-18 108 14 8 6 14 12 20 26 0-8 0-8 6-14 6-26 20-44 26-70 12-26 44-38 64-26 6 6 12 0 12 0 20-6 46-12 64  [...]
-<glyph unicode="&#x27;" glyph-name="import" d="M994-64h-964c-18 0-30 12-30 30v964c0 18 12 30 30 30h150c18 0 30-12 30-30s-12-30-30-30h-120v-904h904v120c0 18 12 30 30 30s30-12 30-30v-150c0-18-12-30-30-30zM740 238h-408c-18 0-30 12-30 30v426c0 14 6 26 18 32s24 0 30-6l408-428c6-6 14-24 6-30 0-18-12-24-24-24zM362 298h306l-306 324zM566 472c-6 0-18 0-24 6-12 12-12 30 0 42l428 428c12 12 30 12 42 0s12-30 0-42l-422-422c-6-6-12-12-24-12z" />
-<glyph unicode="&#x28;" glyph-name="filter" d="M586-64c-8 0-16 0-22 8l-148 88c-6 6-14 22-14 28v336l-394 506c-8 6-8 22 0 36 0 14 14 22 28 22h952c14 0 28-8 28-22 8-14 8-30 0-36l-394-506v-424c0-14-8-22-22-28 0-8-8-8-14-8zM476 82l72-44v374c0 6 0 14 8 22l358 452h-804l358-452c8-8 8-16 8-22z" />
-<glyph unicode="&#x2a;" glyph-name="set-me-up" d="M264-26c-10 0-22 6-26 10l-194 194c-6 6-12 16-12 28 0 10 6 22 12 26l268 270v296c0 16 12 32 32 38l314 80c16 6 26 0 38-10l32-32c10-12 16-32 4-48l-102-190 38-38 216 82c10 10 32 10 42-6l34-32c10-10 16-22 10-38l-86-312c-6-16-22-32-38-32h-280l-274-270c-6-10-18-16-28-16zM124 210l140-140 258 260c6 4 16 10 28 10h264l70 254-210-82c-16-4-32 0-44 12l-74 74c-18 18-18 38-12 54l98 178-248-64v-270c0-10-6-22-12-26z" />
-<glyph unicode="&#x2b;" glyph-name="lock" d="M748.8 499.2h-64v70.4c0 96-76.8 172.8-172.8 172.8s-172.8-76.8-172.8-172.8v-76.8h-64v76.8c0 134.4 102.4 243.2 236.8 243.2s236.8-108.8 236.8-236.8v-76.8zM748.8 0h-473.6c-76.8 0-147.2 64-147.2 147.2v236.8c0 76.8 64 147.2 147.2 147.2h467.2c76.8 0 147.2-64 147.2-147.2v-236.8c0-83.2-64-147.2-140.8-147.2zM275.2 467.2c-44.8 0-76.8-44.8-76.8-83.2v-236.8c0-44.8 38.4-83.2 83.2-83.2h467.2c44.8 0 83.2 38.4 83.2 83.2v236.8c0 44.8-38.4 83.2-83.2 83.2h-473.6z [...]
-<glyph unicode="&#x2c;" glyph-name="notif-success" d="M512-64c-284 0-512 228-512 512s228 512 512 512c284 0 512-228 512-512s-228-512-512-512zM512 882c-238 0-434-196-434-434s196-434 434-434c238 0 434 196 434 434s-196 434-434 434zM442 212c-12 0-24 4-32 12l-126 158c-14 16-10 42 4 56 16 12 42 10 56-6l94-116 236 334c14 18 38 22 56 10s20-36 10-54l-268-378c-4-12-18-16-30-16z" />
-<glyph unicode="&#x2d;" glyph-name="notif-error" d="M512 960c-284 0-512-228-512-512s228-512 512-512c284 0 512 228 512 512s-228 512-512 512zM512 14c-238 0-434 196-434 434s196 434 434 434c238 0 434-196 434-434s-196-434-434-434zM724 658c-16 14-42 14-58 0l-154-154-154 154c-16 14-42 14-58 0-16-16-16-40 0-56l154-154-154-154c-16-16-16-40 0-56 8-8 18-10 28-10s22 2 30 10l154 154 154-154c8-8 20-10 30-10s20 2 28 10c16 16 16 40 0 56l-154 154 154 154c14 14 14 40 0 56z" />
-<glyph unicode="&#x2e;" glyph-name="docker-command" d="M34-2c-6 0-20 0-28 6-12 14-12 34 0 48l396 396-396 402c-6 14-6 34 0 48 14 14 34 14 48 0l424-422c14-14 14-34 0-48l-416-416c-8-8-22-14-28-14zM956-30h-614c-22 0-34 14-34 34s12 34 34 34h614c20 0 34-14 34-34s-14-34-34-34z" />
-<glyph unicode="&#x2f;" glyph-name="copy-to-clipboard" d="M512 952c-282 0-512-230-512-512s230-512 512-512c282 0 512 230 512 512s-230 512-512 512zM512-32c-262 0-472 214-472 472s210 470 472 470c262 0 472-208 472-470s-214-472-472-472zM758 140h-410c-12 0-20 8-20 22v60h-62c-12 0-20 8-20 22v330c0 6 0 10 4 14l126 160c4 4 10 8 18 8h240c14 0 22-8 22-22v-60h102c12 0 20-8 20-22v-490c0-14-8-22-20-22zM368 182h370v450h-82v-388c0-14-8-22-22-22h-266zM286 264h328v450h-204v-144c0-12-8-20-20-20h-104zM304 5 [...]
-<glyph unicode="&#x30;" glyph-name="megaphone-on" d="M834 578c-4 0-10 2-12 8s0 14 8 16l162 66c8 2 14 0 18-8 2-8 0-14-8-18l-162-64c-4 0-6 0-6 0zM986 264c-2 0-4 0-6 2l-154 98c-4 4-6 12-4 16 2 6 12 8 18 6l154-98c6-4 8-12 6-18-4-4-8-6-14-6zM1006 466h-150c-6 0-12 4-12 12s6 12 12 12h150c8 0 14-4 14-12s-6-12-14-12zM438 224h-226c-8 0-12 4-12 12v112h24v-100h200v50h26v-62c0-8-6-12-12-12zM12 324c-2 0-4 0-8 2-2 2-4 4-4 10v224c0 6 2 8 4 10 4 2 8 2 10 2l100-24c6-2 10-8 10-12v-176c0-4-4-10-10-12l-100-2 [...]
-<glyph unicode="&#x31;" glyph-name="show-in-tree" d="M814-34c18 0 30 12 30 30s-12 30-30 30h-302v182h302c18 0 30 12 30 30s-12 30-30 30h-302v180h302c18 0 30 12 30 30s-12 30-30 30h-604v422c0 18-12 30-30 30s-30-12-30-30v-452c0-18 12-30 30-30h272v-482z" />
-<glyph unicode="&#x32;" glyph-name="show-in-ci-server" horiz-adv-x="1072" d="M1050.896 522.796c-10.84 10.84-26.016 10.84-36.856 0l-67.208-67.208c-6.504 223.3-188.616 398.908-416.252 398.908-123.576 6.504-238.476-49.864-316.524-149.592-10.84-10.84-10.84-26.016 0-39.024 10.84-4.336 32.52-4.336 39.024 6.504 71.544 82.384 171.272 132.248 277.5 132.248 192.952 0 355.548-153.928 359.884-349.044l-71.544 60.704c-10.84 10.84-28.184 10.84-39.024 0s-10.84-28.184 0-39.024l117.072-104.064c10.84-6.504 [...]
-<glyph unicode="&#x33;" glyph-name="show-build-json" d="M1012-26l-224 224c82 84 134 192 134 320 0 244-198 448-448 448s-442-204-442-454c0-250 198-448 448-448 96 0 186 32 262 84l230-232zM96 512c0 212 172 384 384 384s384-172 384-384c0-212-172-384-384-384s-384 180-384 384zM410 698h64v-276c0-38 0-76-14-96-6-6-50-32-114-32v-64c64 0 134 20 166 58 26 38 26 84 26 134v276h64v64h-192z" />
-<glyph unicode="&#x34;" glyph-name="search-specific" d="M512 952c-282 0-512-230-512-512s230-512 512-512c282 0 512 230 512 512s-230 512-512 512zM512-32c-262 0-472 214-472 472s210 470 472 470c262 0 472-208 472-470s-214-472-472-472zM684 494c0 114-90 204-204 204-116 0-206-90-206-204 0-116 90-206 206-206 40 0 82 12 114 38l144-144 28 28-140 140c38 36 58 86 58 144zM316 494c0 90 74 162 164 162s164-72 164-162c0-92-74-164-164-164s-164 72-164 164z" />
-<glyph unicode="&#x35;" glyph-name="search" d="M984-8l-290 292c74 72 120 170 120 284 0 216-176 398-398 398s-398-176-398-398c0-222 176-398 398-398 84 0 164 28 232 74l290-290zM86 568c0 188 152 340 340 340s342-152 342-340c0-188-154-342-342-342s-340 154-340 342z" />
-<glyph unicode="&#x36;" glyph-name="run" d="M512 896c250 0 448-198 448-448s-198-448-448-448c-250 0-448 198-448 448s198 448 448 448zM512 960c-282 0-512-230-512-512s230-512 512-512c282 0 512 230 512 512s-230 512-512 512zM378 186c-6 0-14 0-20 6-12 6-18 20-18 26v460c0 14 6 20 18 26 14 6 20 6 32 0l404-230c12-6 18-20 18-26s-6-20-18-26l-404-230c-6-6-6-6-12-6zM410 628v-352l300 172z" />
-<glyph unicode="&#x37;" glyph-name="zap" d="M362-64c-6 0-6 0-12 0-12 6-18 18-18 36l114 446h-236c-12 0-18 6-24 12-6 12-6 24-6 30l224 482c6 12 18 18 30 18h306c12 0 18-6 24-12 8-12 8-18 0-30l-138-260h188c12 0 24-6 24-18 6-12 6-24 0-30l-452-662c-6-6-12-12-24-12zM260 478h222c12 0 18-6 24-12s6-18 6-24l-78-320 324 476h-186c-12 0-18 6-24 12-6 12-6 24 0 30l138 260h-240z" />
-<glyph unicode="&#x38;" glyph-name="refresh" d="M1024 544c-12 12-28 12-40 0l-74-68c-12 240-210 428-454 428-252 0-456-206-456-456s204-456 456-456c148 0 290 74 374 200 12 12 6 28-6 40-10 12-28 6-38-6-74-114-200-176-330-176-222 0-400 182-400 398s182 398 400 398c210 0 380-164 398-370l-68 68c-12 12-30 12-40 0-12-10-12-28 0-40l118-118c6-6 12-6 24-6 10 0 16 0 22 6l114 118c12 12 12 30 0 40z" />
-<glyph unicode="&#x39;" glyph-name="view" d="M542 622c-96 0-174-78-174-174s78-174 174-174c96 0 174 78 174 174s-78 174-174 174zM542 334c-66 0-114 48-114 114s48 114 114 114c66 0 114-54 114-114s-48-114-114-114zM1030 460c-102 180-290 290-500 290s-404-104-524-284c-6 0-6-6-6-12v-6c0-6 0-12 6-18 120-174 314-284 524-284s398 110 500 284c6 12 6 24 0 30zM530 208c-186 0-362 90-470 240 108 150 284 240 464 240 186 0 350-90 440-246-84-144-248-234-434-234z" />
-<glyph unicode="&#x3a;" glyph-name="arrow2" d="M136-64c-6 0-14 0-20 6-14 14-14 34 0 48l410 458-410 458c-14 14-14 34 0 48 14 12 34 12 48 0l430-478c14-14 14-34 0-48l-430-478c-6-8-20-14-28-14zM478-64c-6 0-14 0-20 6-14 14-14 34 0 48l408 458-408 458c-22 14-14 34 0 48 14 12 34 12 48 0l430-478c12-14 12-34 0-48l-430-478c-8-8-22-14-28-14z" />
-<glyph unicode="&#x3c;" glyph-name="vagrant" d="M972 858l-96 44c-6 6-18 6-24 0l-224-114c-14-8-20-20-20-26v-64l-58-180-70 180v64c0 6-6 18-12 26l-232 134c0 0 0 0-6 0-6 6-18 0-26 0l-128-58c0 0-6-6-12-20l-12-64c0-6 0-12 0-18l306-710c0-8 6-14 14-14l172-90c6 0 12-6 12-6 8 0 14 0 14 6l32 20 108 70c6 6 6 6 14 14l262 704c6 6 6 12 6 12v58c0 12-6 26-20 32zM416 90l-300 690 6 40 82 38 340-832zM556 166l-268 654 128-78v-50c0-8 0-14 0-14l108-262c8-20 20-32 32-32 14 0 26 12 32 26l84 268c0 0 0 6 0 14v44l1 [...]
-<glyph unicode="&#x3d;" glyph-name="docker-created" d="M976 814h-220v122c0 14-10 24-24 24h-98c-14 0-24-10-24-24v-122h-196v122c0 14-10 24-24 24h-98c-14 0-24-10-24-24v-122h-220c-14 0-24-10-24-24v-830c0-14 10-24 24-24h928c14 0 24 10 24 24v830c0 14-10 24-24 24zM658 912h50v-98h-50zM316 912h50v-98h-50zM74 764h292v-48c0-14 10-24 24-24s24 10 24 24v48h294v-48c0-14 8-24 24-24 14 0 24 10 24 24v48h194v-146h-876zM950-16h-876v586h876zM170 522h98v-98h-98zM366 522h98v-98h-98zM560 522h98v-98h-98zM170 326 [...]
-<glyph unicode="&#x3e;" glyph-name="yum" d="M0 596h90l38-142c0-6 6-18 6-26 0 14 0 20 6 26l46 142h82l-96-256c-12-32-24-58-44-72-20-12-44-18-70-18-14 0-26 0-32 6v64c6 0 18 0 26 0 6 0 12 0 18 6 6 0 14 6 14 14 0 6 6 12 12 24zM500 352l-14 32h-6c-6-12-12-20-26-26-12-6-26-12-44-12-26 0-46 6-64 26-14 12-26 38-26 64v160h84v-136c0-12 0-24 6-38 6-12 12-12 18-12 14 0 26 6 32 18 8 14 8 32 8 58v110h82v-244zM940 352v134c0 20 0 32-6 38-6 8-12 14-18 14-14 0-26-6-26-20-6-12-6-26-6-50v-116h-84v134c0 20 0 3 [...]
-<glyph unicode="&#x3f;" glyph-name="sbt" d="M268 358c0-38-12-64-38-90-26-18-64-32-108-32-46 0-84 8-116 26v84c26-14 52-20 70-26 20-6 40-6 52-6 20 0 32 6 44 12 14 6 14 20 14 32 0 6 0 14-6 20-8 0-14 6-26 12-6 6-26 20-52 32-26 6-44 20-58 32-12 14-18 26-24 38-8 14-14 32-14 52 0 38 14 64 38 84 20 18 58 32 104 32 18 0 44 0 64-8 18-6 38-12 64-18l-40-70c-18 6-38 12-50 18-20 0-32 6-46 6-18 0-24-6-38-12-12-6-12-20-12-32 0-6 0-12 6-20 0-6 6-12 20-18 6-6 24-14 56-32 40-20 64-38 78-58 12-12 18-32 18-5 [...]
-<glyph unicode="&#x40;" glyph-name="blackduck" d="M934 762c-58 76-122 122-166 146-26 14-44 20-58 26-12 6-18 6-18 6s6-6 18-12c14-6 26-26 46-38 38-38 82-90 120-166 14-40 20-84 32-128 8-46 8-96 0-142-6-50-18-96-44-146-12-26-20-46-38-64-6-14-14-20-20-26s-12-14-12-14c-6-6-6-6-14-12-38-32-76-58-120-70-46-14-90-14-142-6-44 12-96 24-128 50s-64 58-82 90c-46 70-64 140-72 192-12 44-18 76-18 76s-6-32-14-82c-6-52-6-134 32-224 20-46 46-96 90-134 46-40 96-64 160-84 58-20 134-26 198-6 72 18 128 50 180 9 [...]
-<glyph unicode="&#x41;" glyph-name="arrow" d="M308-64c-8 0-14 0-22 6-12 14-12 34 0 48l410 458-410 458c-12 14-12 34 0 48 14 12 34 12 48 0l430-478c14-14 14-34 0-48l-430-478c-6-8-20-14-26-14z" />
-<glyph unicode="&#x42;" glyph-name="c-2" d="M896 448v64h-108l18 122-64 6-18-128h-46l20 122-64 6-20-128h-102v-64h90l-6-64h-84v-64h76l-18-122 64-6 18 134h46l-20-122 64-6 20 134h134v52h-128l6 64zM704 384h-44l6 64h44zM422 70c-192 0-346 154-346 346s154 346 346 346c70 0 134-20 192-58l52 52c-70 50-154 76-244 76-230 0-422-186-422-416s192-416 422-416c90 0 174 32 244 84l-52 50c-58-38-122-64-192-64z" />
-<glyph unicode="&#x43;" glyph-name="artifactory-edit" d="M994 924c-18 18-54 30-84 24s-60-18-84-42l-68-66-396-398c0 0-6-6-6-12l-84-192c-6-12 0-24 6-36 6-6 12-6 24-6 6 0 6 0 12 0l192 84c6 0 6 6 12 6l398 396 72 74c42 54 48 126 6 168zM392 364l48-48-84-36zM488 352l-66 66 362 356 66-66zM940 798l-48-48-66 66 48 48c12 12 30 24 48 24 6 0 24 0 36-12s6-48-18-78zM934 478c-18 0-30-12-30-30v-452h-844v904h542c18 0 30 12 30 30s-18 30-30 30h-572c-18 0-30-12-30-30v-964c0-18 12-30 30-30h904c18 0 30 12 30 3 [...]
-<glyph unicode="&#x44;" glyph-name="unwatch" d="M278 26c-134 0-242 108-242 242 0 132 108 240 242 240 132 0 240-108 240-240 0-134-102-242-240-242zM278 448c-98 0-182-78-182-180 0-104 78-182 182-182 102 0 180 78 180 182 0 102-78 180-180 180zM722 26c-132 0-240 108-240 242 0 132 108 240 240 240 134 0 242-108 242-240 0-134-108-242-242-242zM722 448c-96 0-180-78-180-180 0-104 78-182 180-182 104 0 182 78 182 182 0 102-84 180-182 180zM482 870h60v-602h-60zM102 298l-54 30 278 590c6 12 18 12 30 12h32 [...]
-<glyph unicode="&#x45;" glyph-name="jar" d="M884 588l-180 104v12l58 58c6 6 6 12 6 26v140c0 20-12 32-32 32h-448c-20 0-32-12-32-32v-140c0-14 0-20 6-26l58-58v-6l-180-110c-6-6-12-12-12-24v-410c0-6 0-14 6-14l64-120c0-14 14-20 26-20h576c12 0 26 6 26 20l64 120c0 8 6 14 6 14v410c0 12-6 18-12 24zM320 896h384v-96l-26-32h-332l-26 32zM780 64h-536l-32 64h600zM832 192h-640v352l180 102c6 6 12 20 12 32v26h256v-26c0-12 6-18 12-26l180-108z" />
-<glyph unicode="&#x47;" glyph-name="download" d="M984-64h-944c-24 0-40 16-40 40v196c0 24 16 40 40 40s38-16 38-40v-158h868v158c0 24 14 40 38 40s40-16 40-40v-196c0-24-16-40-40-40zM898 432c-16 16-40 24-56 8l-290-188v630c0 22-16 38-40 38s-40-16-40-38v-638l-290 196c-24 16-48 8-56-8-16-16-8-40 8-54l354-238c8 0 16-8 16-8 8 0 16 0 16 8l354 238c32 14 32 38 24 54z" />
-<glyph unicode="&#x48;" glyph-name="rpm" d="M102 192v-128h-70v332h96c44 0 76-6 102-24 26-14 32-40 32-78 0-18-6-38-18-50-14-14-26-26-46-40 52-76 84-120 96-146h-70l-76 128h-46zM102 250h26c20 0 38 6 52 12 6 6 12 20 12 32 0 14-6 26-20 32-6 6-24 14-44 14h-26zM570 294c0-38-14-64-32-82-20-20-52-26-96-26h-32v-122h-70v332h108c38 0 70-6 90-24 26-20 32-46 32-78zM410 244h26c18 0 38 6 50 12 14 6 20 20 20 38 0 20-6 26-14 38-12 0-32 8-50 8h-32zM774 64l-76 262c0-50 6-90 6-108v-154h-64v332h96l76-256 84 2 [...]
-<glyph unicode="&#x49;" glyph-name="ruby-gems" d="M1012 692l-288 198c0 6-8 6-14 6h-396c-6 0-14 0-14-6l-288-198c-6-8-12-14-12-20s0-20 6-26l480-634c6-6 14-12 26-12s20 6 26 12l480 634c6 6 6 14 6 26 0 6-6 12-12 20zM384 704l-32 128h320l-32-128zM620 640l-108-428-108 428zM730 806l154-102h-180zM294 806l26-102h-180zM332 640l128-486-370 486zM564 154l128 486h242z" />
-<glyph unicode="&#x4a;" glyph-name="scala" d="M896 896l-768-166v-154h518l-518-128v-192h518l-518-90v-166l768 166v154h-518l518 128v192h-518l518 90z" />
-<glyph unicode="&#x4b;" glyph-name="general" d="M960-32c0-20-12-32-32-32h-832c-12 0-32 12-32 32v666c0 6 0 12 6 18l250 296c6 6 12 12 26 12h582c20 0 32-12 32-32zM896 896h-486v-262c0-20-14-32-32-32h-250v-602h768zM166 666h180v210z" />
-<glyph unicode="&#x4c;" glyph-name="delete-recursive" d="M1018 606c-8 6-14 12-28 12h-170v8c0 54-42 130-104 130h-122l-54 60c-8 0-22 8-28 8h-204c-8 0-22-8-28-8l-54-60h-124c-62 0-102-56-102-110v-574h786c12 0 26 8 34 22l204 476c0 14 0 22-6 36zM68 646c0 20 20 40 34 40h136c8 0 22 8 28 8l54 62h178l62-62c0 0 14-8 20-8h136c14 0 34-34 34-60v-8h-512c-12 0-26-6-34-20l-136-314zM764 140h-676l178 410h682zM656 442c-14 12-34 12-48 0l-62-62-62 62c-12 12-34 12-48 0-12-14-12-34 0-48l62-62-62-62c-12-14-12-34 [...]
-<glyph unicode="&#x4d;" glyph-name="delete-content" d="M796-64h-682c-18 0-28 12-28 28v706c0 6 0 12 6 16l250 262c6 6 10 12 22 12h432c18 0 28-12 28-28v-428c0-16-10-28-28-28-16 0-28 12-28 28v400h-342v-256c0-18-10-30-28-30h-256v-626h626v114c0 18 12 30 28 30 18 0 28-12 28-30v-142c0-16-10-28-28-28zM160 676h210v222zM910 164c-6 0-16 0-22 6l-92 90-90-90c-12-12-30-12-40 0-12 10-12 28 0 40l90 90-90 92c-12 10-12 28 0 38 10 12 28 12 40 0l90-90 92 90c10 12 28 12 40 0 10-10 10-28 0-38l-92-92 92-90c10-1 [...]
-<glyph unicode="&#x4e;" glyph-name="c-1" d="M768 448h-64v64h-64v-64h-64v-64h64v-64h64v64h64zM1024 448h-64v64h-64v-64h-64v-64h64v-64h64v64h64zM614 134c-58-38-122-64-192-64-192 0-346 154-346 346s154 346 346 346c70 0 134-20 192-58l52 52c-70 50-154 76-244 76-230 0-422-186-422-416s192-416 422-416c90 0 174 32 244 84z" />
-<glyph unicode="&#x4f;" glyph-name="delete-versions" d="M934 840h-150v90c0 18-12 30-32 30h-450c-12 0-18-6-24-12l-212-222c0 0-6-6-6-6v-634c0-18 12-30 30-30h90v-90c0-18 12-30 30-30h724c18 0 30 12 30 30v844c0 18-12 30-30 30zM302 888v-168h-158zM120 116v542h212c18 0 30 12 30 30v212h360v-784zM904-4h-664v60h512c20 0 32 12 32 30v694h120zM240 232c6-6 12-6 26-6 12 0 18 0 24 6l132 132 132-132c6-6 12-6 24-6s18 0 24 6c12 12 12 30 0 42l-144 132 132 132c12 12 12 30 0 42s-30 12-42 0l-132-132-132 132c-12 [...]
-<glyph unicode="&#x50;" glyph-name="c" d="M614 134c-58-38-122-64-192-64-192 0-346 154-346 346s154 346 346 346c70 0 134-20 192-58l52 52c-70 50-154 76-244 76-230 0-422-186-422-416s192-416 422-416c90 0 174 32 244 84z" />
-<glyph unicode="&#x51;" glyph-name="watch" d="M278 26c-134 0-242 108-242 242 0 132 108 240 242 240 132 0 240-108 240-240 0-134-108-242-240-242zM278 448c-98 0-182-78-182-180 0-104 78-182 182-182 102 0 180 78 180 182 0 102-78 180-180 180zM722 26c-132 0-240 108-240 242 0 132 108 240 240 240 134 0 242-108 242-240 0-134-108-242-242-242zM722 448c-96 0-180-78-180-180 0-104 78-182 180-182 104 0 182 78 182 182 0 102-84 180-182 180zM482 870h60v-602h-60zM102 298l-54 30 278 590c6 12 18 12 30 12h324c [...]
-<glyph unicode="&#x52;" glyph-name="local-repo" d="M512 390c-6 0-12 0-12 0l-480 224c-14 6-26 20-26 32 0 14 12 26 26 32l480 224c6 6 18 6 32 0l480-218c12-6 18-18 18-32 0-12-6-24-18-32l-488-224c-6 0-12-6-12-6zM116 646l396-178 396 184-396 180zM512-12c-6 0-12 0-12 6l-480 250c-14 0-20 12-20 24v378h64v-358l448-236 448 248v352h64v-364c0-12-6-20-20-26l-480-268c-6-6-12-6-12-6zM480 428h64v-428h-64z" />
-<glyph unicode="&#x53;" glyph-name="megaphone" d="M438 224h-226c-8 0-12 4-12 12v112h24v-100h200v50h26v-62c0-8-6-12-12-12zM12 324c-2 0-4 0-8 2-2 2-4 4-4 10v224c0 6 2 8 4 10 4 2 8 2 10 2l100-24c6-2 10-8 10-12v-176c0-4-4-10-10-12l-100-24c0 0-2 0-2 0zM24 546v-192l76 20v152zM762 224c0 0-2 0 0 0l-652 124c-6 0-10 8-10 12v176c0 4 4 10 10 12l650 150c2 0 6 0 10-2 2-4 4-6 4-10v-450c0-2-2-8-4-10-4-2-6-2-8-2zM124 370l626-120v420l-626-144z" />
-<glyph unicode="&#x54;" glyph-name="move" d="M854-64h-684c-16 0-28 12-28 28v712c0 6 6 16 6 16l250 256c6 6 12 12 22 12h434c16 0 28-12 28-28v-428c0-16-12-28-28-28-18 0-30 12-30 28v400h-340v-256c0-18-12-30-28-30h-256v-626h624v114c0 18 12 30 30 30 16 0 28-12 28-30v-142c0-16-12-28-28-28zM210 676h216v222zM734 140c-6 0-12 0-18 6-10 12-10 28-4 40l74 86h-302c-18 0-28 12-28 28 0 18 10 34 28 34h306l-78 102c-12 12-6 30 4 40 12 12 30 6 40-6l114-148c6-10 6-22 0-34l-114-136c-6-6-16-12-22-12z" />
-<glyph unicode="&#x55;" glyph-name="simple-browser" d="M994 870h-722c-20 0-32-12-32-30v-152h-210c-18 0-30-12-30-30v-602c0-18 12-30 30-30h722c20 0 32 12 32 30v212h210c18 0 30 12 30 30v542c0 18-12 30-30 30zM722 86h-662v362h662zM722 508h-662v120h662zM964 328h-180v300h180zM964 688h-662v122h662z" />
-<glyph unicode="&#x56;" glyph-name="datagrid-v" d="M512 960c-282 0-512-230-512-512s230-512 512-512c282 0 512 230 512 512s-230 512-512 512zM768 640l-300-428c-8-8-14-20-26-20-6 0-20 12-26 20l-148 178c-6 14-6 32 8 46 12 12 32 12 44-8l122-146 274 390c14 12 32 20 46 6 18 0 18-18 6-38z" />
-<glyph unicode="&#x57;" glyph-name="re-index" d="M1018 520c-10 10-24 10-34 0l-62-62c-6 206-174 368-384 368-114 6-220-46-292-138-10-10-10-24 0-36 10-4 30-4 36 6 66 76 158 122 256 122 178 0 328-142 332-322l-66 56c-10 10-26 10-36 0s-10-26 0-36l108-96c10-6 14-10 20-10s16 0 20 4l102 102c12 16 12 32 0 42zM798 232c-60-76-158-116-256-116-86 0-168 30-234 96-62 62-98 138-104 226l68-56c14-10 30-6 40 4s6 26-4 36l-108 92c-10 10-26 6-36 0l-98-112c-10-10-10-26 0-36 6-6 10-6 16-6s16 6 20 12l56 60c6-96 4 [...]
-<glyph unicode="&#x58;" glyph-name="virtual-repo" d="M512 396c-6 0-12 0-12 0l-480 224c-14 0-26 14-26 26 0 14 6 26 18 32l480 224c8 6 20 6 32 0l480-218c14-6 20-18 20-32 0-12-6-24-20-32l-480-224c-6 0-12 0-12 0zM116 652l396-184 396 184-396 186zM512-12c-6 0-12 0-12 6l-480 250c-14 6-20 18-20 24v384h64v-364l448-236 448 248v352h64v-364c0-12-6-20-20-26l-480-268c-6-6-12-6-12-6zM512 186c-6 0-6 0-12 0l-288 134c-14 6-20 20-20 32v198c0 14 6 26 20 32l288 142c6 6 18 6 24 0l288-136c14-12 20-18 20-32v-192 [...]
-<glyph unicode="&#x59;" glyph-name="v" d="M512 960c-284 0-512-228-512-512s228-512 512-512c284 0 512 228 512 512s-228 512-512 512zM512-4c-246 0-452 206-452 452s206 452 452 452c246 0 452-206 452-452s-206-452-452-452zM704 664l-258-366-114 138c-12 12-30 12-42 6-12-12-12-30-6-42l138-162c6-6 12 0 24 0s18-6 24 0l282 390c12 12 6 30-6 42s-30 6-42-6z" />
-<glyph unicode="&#x5a;" glyph-name="unview" d="M972 482c-44 80-112 142-186 188l152 154c12 10 12 28 0 40-10 10-28 10-40 0l-164-166c-68 34-148 52-228 52-198 0-380-98-494-268l-12-6v-28l6-6c62-96 154-170 256-216l-160-160c-10-10-10-28 0-38 6-6 12-6 24-6 10 0 16 0 22 6l176 176c58-18 120-30 182-30 200 0 376 104 472 268l12 18zM62 466c102 142 268 226 438 226 68 0 132-10 188-34l-68-68c-28 22-68 40-108 40-92 0-164-74-164-164 0-40 16-80 38-110l-78-78c-98 34-182 96-246 188zM620 466c0-64-52-110-108-11 [...]
-<glyph unicode="&#x5b;" glyph-name="pypi" d="M608 448c52 0 96 44 96 96 0 84 0 172 0 256 0 52-44 96-96 96-96 0-192 0-288 0-122 0-122-192 0-192 64 0 128 0 192 0 0-20 0-44 0-64-140 0-276 0-416 0-52 0-96-44-96-96 0-76 0-148 0-224 0-122 192-122 192 0 0 44 0 84 0 128 140 0 276 0 416 0zM768 576c0-64 0-128 0-192-140 0-276 0-416 0-52 0-96-44-96-96 0-84 0-172 0-256 0-52 44-96 96-96 96 0 192 0 288 0 122 0 122 192 0 192-64 0-128 0-192 0 0 20 0 44 0 64 140 0 276 0 416 0 52 0 96 44 96 96 0 96 0 192 0  [...]
-<glyph unicode="&#x5c;" glyph-name="drag" d="M626 652c0 22-16 38-38 38-20 0-36-16-36-38 0-20 16-36 36-36 22 0 38 16 38 36zM472 652c0 22-16 38-36 38-22 0-38-16-38-38 0-20 16-36 38-36 20 0 36 16 36 36zM626 516c0 20-16 38-38 38-20 0-36-18-36-38s16-36 36-36c22 0 38 16 38 36zM472 516c0 20-16 38-36 38-22 0-38-18-38-38s16-36 38-36c20 0 36 16 36 36zM626 380c0 20-16 36-38 36-20 0-36-16-36-36s16-38 36-38c22 0 38 18 38 38zM472 380c0 20-16 36-36 36-22 0-38-16-38-36s16-38 38-38c20 0 36 18 36 38zM626  [...]
-<glyph unicode="&#x5d;" glyph-name="git-lfs" d="M780 724l-396-250v-154l-128 58v160l410 250-154 88-448-256v-344l448-256 448 256v344z" />
-<glyph unicode="&#x5e;" glyph-name="p2" d="M468 550c0-64-20-108-58-140-46-32-96-52-174-52h-50v-204h-122v582h186c70 0 122-12 160-44s58-78 58-142zM186 460h38c38 0 64 8 84 26 18 14 24 38 24 64s-6 52-24 64c-8 14-32 20-64 20h-58zM960 154h-404v82l142 148c44 44 70 76 82 90 14 18 26 32 26 44 6 14 6 32 6 46 0 24-6 38-18 50-6 20-20 26-46 26-24 0-44-6-64-12-18-14-44-26-64-46l-64 78c26 24 52 44 64 50 20 14 40 20 64 26 20 6 46 6 78 6 38 0 70-6 96-18 26-14 50-32 64-58 12-26 26-52 26-84 0-26-8-50-14-76 [...]
-<glyph unicode="&#x5f;" glyph-name="npm" d="M166 288v134c0 20 0 32-6 38-6 8-12 14-20 14-12 0-24-6-32-20-6-6-12-32-12-58v-108h-84v250h64l14-32h6c6 12 20 18 32 26 12 6 26 6 44 6 26 0 52-6 64-26 14-20 20-32 20-64v-160zM474 282c-14 0-26 0-32 6-14 6-20 12-32 20h-6c0-20 6-26 6-32v-104h-90v366h70l14-32h6c12 26 38 38 64 38s50-12 64-32c12-20 26-52 26-96 0-38-8-70-26-96-14-26-38-38-64-38zM442 474c-14 0-20-6-26-14-6-6-6-24-6-38v-6c0-20 0-38 6-44 6-8 12-14 26-14 12 0 18 6 26 14 6 6 6 24 6 44s0 38-6  [...]
-<glyph unicode="&#x60;" glyph-name="notif-icon" d="M512-64c-284 0-512 228-512 512s228 512 512 512c284 0 512-228 512-512s-228-512-512-512zM512 882c-238 0-434-196-434-434s196-434 434-434c238 0 434 196 434 434s-196 434-434 434zM510 580c20 0 38-20 38-40v-316c0-20-18-38-38-38-22 0-40 18-40 38v316c0 20 16 40 40 40zM548 672c0-22-16-40-38-40s-40 18-40 40c0 20 18 38 40 38s38-18 38-38z" />
-<glyph unicode="&#x63;" glyph-name="bintray" d="M112 16h794v-72h-794zM678 622v-72h106l-240-238v512l76-74 50 50-162 160-160-160 52-50 76 76v-514l-240 238h102v72h-226v-228h72v110l326-326 324 324v-108h72v228z" />
-<glyph unicode="&#x64;" glyph-name="archive" d="M1024 608c0 6 0 6 0 0 0 6 0 12-6 12l-174 256c-6 14-12 20-24 20h-616c-12 0-18-6-24-12l-174-256c0 0 0-8 0-8s0-6 0-6v-640c-6-26 6-38 26-38h960c20 0 32 12 32 32zM134 704h756l44-64h-844zM224 832h582l46-64h-672zM960 0h-896v576h896zM320 384h384c20 0 32 12 32 32s-12 32-32 32h-384c-20 0-32-12-32-32s12-32 32-32z" />
-<glyph unicode="&#x65;" glyph-name="cached-repo" d="M512 280c-6 0-10 0-10 0l-384 174c-10 4-20 14-20 24s10 22 20 26l384 180c4 4 16 4 26 0l384-174c10-6 14-16 14-26s-4-20-14-26l-384-178c-10 0-16 0-16 0zM194 478l318-142 318 148-318 144zM512-48c-6 0-10 0-10 4l-384 200c-10 6-16 10-16 20v308h52v-292l358-190 358 200v282h52v-292c0-10-6-16-16-20l-384-216c-4-4-10-4-10-4zM486 304h52v-342h-52zM752 792c-4 0-14 4-20 10-56 56-138 86-220 86-88 0-164-30-226-92-10-10-30-10-40 0s-10 30 0 42c72 70 168 106 26 [...]
-<glyph unicode="&#x66;" glyph-name="css" d="M960-32c0-20-12-32-32-32h-832c-20 0-32 12-32 32v666c0 6 0 12 6 18l250 296c6 6 12 12 26 12h582c20 0 32-12 32-32zM896 896h-486v-262c0-20-14-32-32-32h-250v-602h768zM166 666h180v210zM358 332c-18 0-38-6-50-24-14-14-20-40-20-64 0-26 6-52 20-64 12-14 32-20 50-20 14 0 20 0 26 0s20 6 26 6v-32c-20-6-38-12-64-12-32 0-58 12-78 32-18 18-24 50-24 90 0 24 6 44 12 64 6 18 20 32 38 38 20 6 38 12 58 12 26 0 44-6 64-12l-6-26c-14 0-20 6-26 6-12 6-20 6-26 6zM596 19 [...]
-<glyph unicode="&#x67;" glyph-name="deb" d="M652-52c-288 0-518 238-518 520 0 230 192 422 422 422 192 0 346-154 346-346 0-154-128-282-282-282-128 0-230 102-230 230 0 110 84 192 192 192 20 0 32-12 32-32 0-18-18-24-38-24-70 0-128-58-128-128 0-96 76-168 166-168 122 0 218 96 218 218 0 154-128 282-282 282-198 0-358-160-358-358 0-250 204-454 454-454 20 0 32-14 32-32 0-20-6-40-26-40z" />
-<glyph unicode="&#x68;" glyph-name="docker-id" d="M294 154c-4 0-14 0-18 4l-272 272c-4 10-4 26 0 36l272 272c8 8 22 8 32 0 12-10 12-22 4-32l-258-258 258-258c8-10 8-22 0-32-4-4-14-4-18-4zM730 154c-4 0-14 0-18 4-8 10-8 22 0 32l258 258-258 258c-8 10-8 22 0 32 10 8 22 8 32 0l272-272c8-10 8-22 0-32l-272-270c0-10-10-10-14-10zM406 136c-6 0-6 0-10 0-14 4-18 18-14 28l224 578c4 14 18 22 26 18 14-4 18-18 14-28l-224-578c0-14-8-18-16-18z" />
-<glyph unicode="&#x69;" glyph-name="copy" d="M934 840h-150v90c0 18-12 30-32 30h-450c-12 0-18-6-24-12l-212-222c0 0-6-6-6-6v-634c0-18 12-30 30-30h90v-90c0-18 12-30 30-30h724c18 0 30 12 30 30v844c0 18-12 30-30 30zM302 888v-168h-158zM120 116v542h212c18 0 30 12 30 30v212h360v-784zM904-4h-664v60h512c20 0 32 12 32 30v694h120z" />
-<glyph unicode="&#x6a;" glyph-name="docker" d="M870 716l-58-18c0-20-12-96-38-186h-70v128h-64v256h-256v-128h-128v-128h-128v-128h-84l-32-32c0-6-6-218 122-346 64-70 154-102 270-102 230 0 358 250 416 416h184l26 52zM448 832h128v-64h-128zM320 704h256v-64h-256zM192 576h448v-64h-448zM404 96c-90 0-168 26-218 84-90 82-102 210-110 268h672c-50-148-160-352-344-352zM838 512c14 38 20 70 26 102l76-102zM326 346c0-36-28-64-64-64-34 0-64 28-64 64 0 34 30 64 64 64 36 0 64-30 64-64z" />
-<glyph unicode="&#x6b;" glyph-name="groovy" d="M500-26c-264 0-480 218-480 480s216 480 480 480c262 0 480-218 480-480s-212-480-480-480zM500 870c-232 0-416-186-416-416s184-416 416-416c230 0 416 186 416 416s-186 416-416 416zM652 576c-32 26-82 44-128 44-102 0-166-76-166-178 0-78 46-160 166-160 40 0 72 6 110 38v84h-122v82h212v-204c-46-58-110-90-192-90-180 0-256 122-256 250 0 134 82 262 256 262 64 0 128-26 178-76z" />
-<glyph unicode="&#x6c;" glyph-name="html" d="M960-32c0-20-12-32-32-32h-832c-20 0-32 12-32 32v666c0 6 0 12 6 18l250 296c6 6 12 12 26 12h582c20 0 32-12 32-32zM896 896h-486v-262c0-20-14-32-32-32h-250v-602h768zM166 666h180v210zM576 448v-128h-128v128h-64v-320h64v128h128v-128h64v320z" />
-<glyph unicode="&#x6d;" glyph-name="java" d="M484 648c16 0 28 10 28 28v228c0 16-12 28-28 28-18 0-28-12-28-28v-228c0-18 10-28 28-28zM598 648c16 0 28 10 28 28v170c0 18-12 28-28 28-18 0-30-10-30-28v-170c0-18 12-28 30-28zM370 648c16 0 28 10 28 28v114c0 16-12 28-28 28-18 0-28-12-28-28v-114c0-18 10-28 28-28zM882 448h-102l16 80c0 6 0 16-6 22-4 6-16 12-22 12h-568c-6 0-18-6-24-12s-6-16-6-22l114-570c0-10 18-22 28-22h342c12 0 22 12 28 22l30 148h170c16 0 28 12 28 30v284c0 16-12 28-28 28zM632-8h-296l [...]
-<glyph unicode="&#x6e;" glyph-name="json" d="M960-32c0-20-12-32-32-32h-832c-20 0-32 12-32 32v666c0 6 0 12 6 18l250 296c6 6 12 12 26 12h582c20 0 32-12 32-32zM896 896h-486v-262c0-20-14-32-32-32h-250v-602h768zM166 666h180v210zM186 70c-14 0-20 0-26 6v26c6 0 12 0 26 0 12 0 18 0 26 6 6 8 6 14 6 26v224h26v-230c0-20-8-32-14-44-6-14-26-14-44-14zM410 192c0-20-6-38-20-44-12-8-38-20-64-20s-44 6-64 12v26c6-6 20-6 32-6 14 0 20-6 32-6 20 0 32 6 38 12 14 0 20 6 20 20 0 6 0 12-6 18-6 8-6 14-14 14-6 6-18  [...]
-<glyph unicode="&#x70;" glyph-name="group" d="M820 660c-44 168-198 300-388 300-220 0-396-176-396-394 0-132 66-250 168-322 44-176 198-308 388-308 220 0 396 176 396 394 0 140-66 256-168 330zM760 566c0-176-146-322-322-322-58 0-116 14-168 44 0 14-6 36-6 50 0 176 146 322 322 322 58 0 116-14 168-44 0-22 6-36 6-50zM110 566c0 174 146 320 322 320 124 0 234-72 284-174-36 14-80 22-124 22-212 0-388-168-394-382-60 52-88 126-88 214zM592 10c-124 0-234 72-284 174 44-14 86-22 130-22 212 0 388 168 396 382 [...]
-<glyph unicode="&#x71;" glyph-name="nuget" d="M660 84c-122 0-224 102-224 224 0 120 102 224 224 224 120 0 224-104 224-224 0-122-104-224-224-224zM660 468c-90 0-160-72-160-160 0-90 70-160 160-160 88 0 160 70 160 160 0 88-72 160-160 160zM96 748c-52 0-96 46-96 96 0 52 44 96 96 96s96-38 96-96c0-56-38-96-96-96zM96 876c-12 0-32-12-32-32 0-18 12-32 32-32s32 20 32 32c0 14-12 32-32 32zM352 500c-58 0-96 44-96 96 0 50 44 96 96 96s96-46 96-96c0-52-44-96-96-96zM352 628c-20 0-32-14-32-32 0-20 12-32 32-3 [...]
-<glyph unicode="&#x72;" glyph-name="pdf" d="M384 288c0-26-6-44-26-58-12-12-38-18-64-18h-26v-84h-38v230h64c26 0 52-6 64-18 20-14 26-26 26-52zM268 244h20c20 0 32 6 44 12 8 6 14 20 14 32s-6 26-14 32c-6 0-18 6-38 6h-26zM614 244c0-40-12-64-32-90-18-14-50-26-90-26h-64v230h72c38 0 64-12 82-32 26-18 32-44 32-82zM576 244c0 56-26 82-76 82h-32v-166h24c58 0 84 26 84 84zM704 128h-38v230h128v-32h-90v-70h84v-32h-84zM960-32c0-20-12-32-32-32h-832c-20 0-32 12-32 32v666c0 6 0 12 6 18l250 296c6 6 12 12 26 1 [...]
-<glyph unicode="&#x73;" glyph-name="deploy" d="M674-20h-324c-22 0-38 16-38 42v420h-166c-16 0-32 12-38 22-6 16-6 32 6 48l366 394c6 10 16 10 32 10 10 0 22-4 32-10l362-394c10-4 16-20 16-32 0-22-16-42-44-42h-166v-426c0-12-6-22-12-28-4-4-16-4-26-4zM394 60h242v420c0 22 16 44 44 44h112l-280 296-274-296h112c22 0 44-16 44-44z" />
-<glyph unicode="&#x74;" glyph-name="go-to-build" d="M692 846c-12 12-24 18-36 18h-12c-12-6-66-12-114 30-18 18-54 18-72 0l-42-54c-12-12-18-24-18-36s6-24 18-36l108-110-488-488c-18-18-18-54 0-72l90-90c6-6 18-12 36-12 12 0 24 6 36 18l488 488 164-162 174 168zM566 616l72-78-378-380-74 80zM162 62l-78 78 60 62 72-86zM686 580l-102 102-120 122 30 36c66-54 132-42 156-36l290-290-90-96z" />
-<glyph unicode="&#x75;" glyph-name="txt" d="M960-32c0-20-12-32-32-32h-832c-20 0-32 12-32 32v666c0 6 0 12 6 18l250 296c6 6 12 12 26 12h582c20 0 32-12 32-32zM896 896h-486v-262c0-20-14-32-32-32h-250v-602h768zM166 666h180v210zM384 448v-64h128v-256h64v256h128v64z" />
-<glyph unicode="&#x76;" glyph-name="folder" d="M1018 606c-8 6-22 12-28 12h-170v8c0 54-42 130-104 130h-122l-62 60c-6 0-14 8-20 8h-204c-14 0-22-8-28-8l-54-60h-124c-62 0-102-56-102-110v-574h786c12 0 26 8 34 22l204 476c0 14 0 22-6 36zM68 646c0 20 14 40 34 40h136c8 0 22 8 28 8l54 62h178l62-62c0 0 6-8 20-8h136c8 0 34-34 34-60v-8h-512c-12 0-26-6-34-20l-136-314zM758 140h-676l178 410h676z" />
-<glyph unicode="&#x77;" glyph-name="xml" d="M378 128h-46l-56 90-58-90h-38l76 116-70 114h38l58-90 50 90h40l-72-114zM506 128l-64 192c0-26 0-58 0-76v-116h-32v230h50l64-178 64 178h52v-230h-32v116c0 12 0 24 0 44s0 32 0 32l-70-192zM704 128v230h38v-198h96v-32zM960-32c0-20-12-32-32-32h-832c-20 0-32 12-32 32v666c0 6 0 12 6 18l250 296c6 6 12 12 26 12h582c20 0 32-12 32-32zM896 896h-486v-262c0-20-14-32-32-32h-250v-602h768zM166 666h180v210z" />
-<glyph unicode="&#x78;" glyph-name="zip" d="M64 960v-1024h896v1024zM896 0h-768v896h320v-64h-64v-64h64v-64h-64v-64h64v-64h-64v-64h64v-64h192v64h-64v64h64v64h-64v64h64v64h-64v64h64v64h256zM436 128h-168v26l116 172h-108v32h160v-26l-116-172h122v-32zM486 128v230h38v-230zM756 288c0-26-8-44-26-58-14-12-38-18-64-18h-26v-84h-38v230h64c26 0 50-6 64-18 18-14 26-26 26-52zM640 250h20c18 0 32 6 44 12 6 6 12 20 12 32 0 14-6 26-12 32s-20 14-38 14h-26z" />
-<glyph unicode="&#x79;" glyph-name="artifacts" d="M896-34l-148 148c20 28 32 60 32 94 0 40-16 80-46 108-58 60-160 60-218 0-60-60-60-158 0-218 28-30 68-46 108-46 34 0 66 12 94 32l148-148zM546 128c-44 44-44 114 0 158 20 22 48 34 78 34s58-12 80-34c22-20 32-48 32-78s-10-58-32-80c-42-42-116-42-158 0zM384 960l-256-252v-772h342v42h-300v684h256v256h428v-512h42v554zM192 704l192 194v-194z" />
-<glyph unicode="&#x7a;" glyph-name="admin" d="M832-64h-640c-106 0-192 86-192 192v640c0 106 86 192 192 192h640c106 0 192-86 192-192v-640c0-106-86-192-192-192zM192 918c-82 0-150-68-150-150v-640c0-82 68-150 150-150h640c82 0 150 68 150 150v640c0 82-68 150-150 150zM256 556v234c0 12-10 20-22 20s-20-8-20-20v-234c-44-10-78-50-78-96 0-48 34-88 78-98v-256c0-12 8-20 20-20s22 8 22 20v256c44 10 78 50 78 98 0 46-34 86-78 96zM256 408c-6-4-14-4-22-4-6 0-14 0-20 4-20 8-36 28-36 52 0 22 16 42 36 50 6 4 14 [...]
-<glyph unicode="&#x7b;" glyph-name="notif-warning" d="M512-64c-284 0-512 228-512 512s228 512 512 512c284 0 512-228 512-512s-228-512-512-512zM512 882c-238 0-434-196-434-434s196-434 434-434c238 0 434 196 434 434s-196 434-434 434zM510 316c-22 0-40 20-40 40v316c0 20 18 38 40 38 20 0 38-18 38-38v-316c0-24-18-40-38-40zM548 224c0-20-16-38-38-38s-40 18-40 38c0 22 18 40 40 40s38-18 38-40z" />
-<glyph unicode="&#x7c;" glyph-name="generic" d="M960 768c0 0 0 6 0 6 0 110-282 134-448 134s-448-24-448-134c0 0 0-6 0-6v-646c0-102 268-142 448-142s448 40 448 142zM512 428c116 0 320 14 384 58v-154c0-24-154-82-384-82s-372 64-384 70v166c96-50 268-58 384-58zM128 570v128c90-46 268-58 384-58s320 12 384 58v-142c0-24-154-70-384-70s-372 26-384 84zM512 844c236 0 378-50 384-70-6-26-148-70-384-70s-378 52-384 70c6 26 148 70 384 70zM512 44c-218 0-372 52-384 78v146c96-44 268-76 384-76s320 20 384 64v-134 [...]
-<glyph unicode="&#x7d;" glyph-name="export" d="M994 472c-6 0-18 6-24 6l-422 428c-12 12-12 24-6 36 0 12 12 18 24 18h428c18 0 30-12 30-30v-428c0-12-6-24-18-30-6 0-6 0-12 0zM638 900l326-326v326zM332 256c-6 0-18 0-24 6-6 18-6 36 6 48l426 428c12 12 32 12 44 0s12-30 0-44l-428-426c-6-6-18-12-24-12zM994-64h-964c-18 0-30 12-30 30v964c0 18 12 30 30 30h150c18 0 30-12 30-30s-12-30-30-30h-120v-904h904v120c0 18 12 30 30 30s30-12 30-30v-150c0-18-12-30-30-30z" />
-<glyph unicode="&#x7e;" glyph-name="duplicate" d="M632 238c-6 0-12 0-18 6-12 12-12 30-6 42l78 90h-318c-18 0-30 12-30 30s12 30 30 30h324l-84 114c-12 18-6 36 6 42 12 12 30 6 42-6l122-156c6-12 6-30 0-36l-122-144c-6-6-18-12-24-12zM934 840h-150v72c0 12-12 48-32 48h-450c-12 0-18-12-24-18l-212-222c0 0-6 0-6 0v-652c0-18 12-12 30-12h90v-108c0-18 12-12 30-12h724c18 0 30-6 30 12v844c0 12-12 48-30 48zM302 870v-150h-158zM904-4h-664v60h512c20 0 32-6 32 12v170h-62v-122h-602v542h212c18 0 30-6 30 12v230h [...]
-<glyph unicode="&#xe000;" glyph-name="new" d="M512-64c-284 0-512 228-512 512s228 512 512 512c284 0 512-228 512-512s-228-512-512-512zM512 900c-246 0-452-206-452-452s206-452 452-452c246 0 452 206 452 452s-206 452-452 452zM542 418h272c18 0 30 12 30 30s-12 30-30 30h-272v290c0 12-12 30-30 30s-30-18-30-30v-290h-266c-18 0-30-6-30-18 0-6 6-18 6-24 6-12 18-18 24-18h266v-248c0-6 6-18 12-24s12-6 18-6c18 0 30 12 30 30z" />
-<glyph unicode="&#xe001;" glyph-name="ivy" d="M32 678v90h96v-90zM32 276v352h96v-352zM352 276l-140 352h96l64-180 18-58c6 14 6 26 14 32 0 14 6 20 12 32l70 180h96l-140-352h-90zM628 628h102l82-250 84 250h96l-128-340-20-64c-6-20-18-38-24-44-8-14-20-20-26-26-14-6-20-14-38-14-14-6-32-6-52-6s-38 0-52 6l-6 72c14 0 26-8 38-8 20 0 40 8 52 20s20 32 26 52z" />
-<glyph unicode="&#xe002;" glyph-name="info" d="M512-64c-284 0-512 228-512 512s228 512 512 512c284 0 512-228 512-512s-228-512-512-512zM512 900c-246 0-452-206-452-452s206-452 452-452c246 0 452 206 452 452s-206 452-452 452zM512 146c-18 0-30 12-30 30v362c0 18 12 30 30 30s30-12 30-30v-362c0-18-12-30-30-30zM572 726c0-34-26-62-60-62s-60 28-60 62c0 32 26 60 60 60s60-28 60-60z" />
-<glyph unicode="&#xe003;" glyph-name="clear" d="M512-64c-284 0-512 228-512 512s228 512 512 512c284 0 512-228 512-512s-228-512-512-512zM512 900c-246 0-452-206-452-452s206-452 452-452c246 0 452 206 452 452s-206 452-452 452zM554 448l186 186c12 12 12 30 0 42s-30 12-42 0l-186-186-186 192c-12 12-30 12-42 0s-12-30 0-42l186-186-186-186c-12-12-12-30 0-42 6-6 12-6 24-6s18 0 24 6l186 186 186-186c6-6 12-6 24-6s18 0 24 6c12 12 12 30 0 42z" />
-<glyph unicode="&#xe004;" glyph-name="pro" d="M512 902l154-288 326-58-230-236 44-326-294 140-294-140 44 326-230 236 326 58z" />
-<glyph unicode="&#xe005;" glyph-name="upload-small" d="M820-64h-616c-14 0-24 10-24 26v128c0 14 10 26 24 26 16 0 26-12 26-26v-102h564v102c0 14 10 26 26 26 14 0 24-12 24-26v-128c0-16-10-26-24-26zM262 382c10-10 24-16 34-6l190 128v-414c0-16 10-26 26-26s26 10 26 26v414l190-128c10-10 24-4 34 6 12 10 6 26-4 36l-230 152c-6 0-10 6-10 6-6 0-12 0-12-6l-230-152c-20-6-26-22-14-36z" />
-<glyph unicode="&#xe006;" glyph-name="upload-hover" d="M820-64h-616c-14 0-24 6-24 20v128c0 16 10 26 24 26 16 0 26-10 26-26v-96h564v96c0 16 10 26 26 26 14 0 24-10 24-26v-128c0-14-10-20-24-20zM262 734c10-10 24-14 34-4l190 128v-416c0-14 10-24 26-24s26 10 26 24v416l190-128c10-10 24-6 34 4 12 10 6 26-4 36l-230 154c-6 0-10 6-10 6-6 0-12 0-12-6l-230-154c-20-4-26-20-14-36z" />
-<glyph unicode="&#xe007;" glyph-name="vcs" d="M788 876l-206-204c6-12 14-32 14-44 0-32-20-64-52-78v-326c32-12 52-44 52-76 0-46-40-84-84-84s-84 38-84 84c0 32 20 64 52 76v326c-6 0-6 6-12 6l-104-108c0-6 8-20 8-26 0-44-40-82-84-82s-90 38-90 82c0 46 38 84 84 84 12 0 26-6 38-14l108 110c0 6 0 12 0 18 0 46 40 84 84 84 6 0 12 0 20 0l204 204c-70 32-140 52-224 52-282 0-512-230-512-512s230-512 512-512c282 0 512 230 512 512 0 180-96 340-236 428z" />
-<glyph unicode="&#xe008;" glyph-name="pom" d="M64 128l64 352c12 64 20 122 26 172h134l-6-82c50 70 114 96 178 96 84 0 122-52 122-96 52 64 122 96 186 96 84 0 128-52 128-142 0-24-6-64-12-88l-52-308h-148l52 288c6 20 6 44 6 64 0 38-18 64-50 64-52 0-104-70-122-172l-46-244h-152l50 288c6 20 6 44 6 58 0 38-12 64-50 64-52 0-110-78-128-180l-32-230z" />
-<glyph unicode="&#xe00a;" glyph-name="docker-size" d="M1024 34l-232 602c0 12-10 28-22 28h-160c26 0 42 48 42 86 0 76-64 130-140 130s-140-54-140-124c0-44 22-92 48-92h-162c-16 0-26-16-26-28l-232-598c-6-10 0-10 6-16 4-10 10-6 20-6h972c10 0 16-4 20 0 6 6 6 6 6 18zM512 820c48 0 86-38 86-80 0-44-38-82-86-82s-86 38-86 82c0 42 38 80 86 80zM64 70l210 540h476l210-540z" />
-<glyph unicode="&#xe00b;" glyph-name="docker-digest" d="M794 210c0-60-8-118-18-176-6-16-16-24-26-20-14 4-18 14-14 30 14 58 20 116 20 174 0 152-102 274-254 298-160 30-322-88-346-248 0-10 0-20-4-30 0-14-10-20-20-20s-20 10-20 26c6 68 24 126 64 180 88 112 204 160 346 132 142-30 228-122 264-264 4-10 4-20 4-34s0-30 4-48zM872 204c0-14 0-30 0-44s-8-24-18-24c-16 0-20 10-20 24 4 50 4 92-6 136-28 152-156 274-306 298-166 30-322-54-404-200-10-14-20-20-30-14-10 4-14 14-10 28 24 50 54 88 98 122 238 216 [...]
-<glyph unicode="&#xe00c;" glyph-name="home" d="M1000 524l-470 430c-4 4-10 6-16 6h-14c-6 0-10-2-14-6l-470-430c-8-8-10-20-2-30 8-8 22-8 30 0l464 422 462-422c4-4 10-6 14-6 6 0 12 2 16 6 8 10 8 22 0 30zM918 470c-12 0-22-10-22-22v-470h-256v278c0 12-10 22-22 22h-212c-12 0-22-10-22-22v-278h-256v470c0 12-10 22-22 22s-20-10-20-22v-490c0-12 8-22 20-22h300c12 0 20 10 20 22v276h172v-276c0-12 8-22 20-22h300c12 0 20 10 20 22v490c0 12-8 22-20 22z" />
-<glyph unicode="&#xe00d;" glyph-name="builds" d="M354 386c-60 0-108-48-108-106s48-106 108-106c58 0 106 48 106 106s-48 106-106 106zM354 216c-36 0-64 28-64 64s28 64 64 64c34 0 64-28 64-64s-30-64-64-64zM674 278h-66c-4 84-26 116-60 156l46 52c10 8 10 24 0 32-8 8-22 10-30 2l-46-46c-38 32-92 54-134 60v66c0 12-10 22-22 22s-20-10-20-22v-64c-44-2-112-24-156-60l-44 46c-8 8-22 8-30 0s-8-22 0-30l46-58c-34-40-56-72-60-156h-76c-12 0-22-10-22-22s10-22 22-22h76c4-42 26-92 60-132l-46-40c-8-8-8-18 0-26 4-4 [...]
-<glyph unicode="&#xe900;" glyph-name="trashcan" horiz-adv-x="869" d="M644.010 802.082v71.557c0 47.129-35.778 86.361-85.128 86.361h-249.461c-49.103 0-84.881-39.233-84.881-86.361v-71.557h-224.54v-78.959h22.701c0 0 13.324-1.48 20.233-8.389s9.623-22.207 9.623-22.207l46.882-596.387c3.701-72.544 3.701-83.647 88.829-83.647h492.013c85.128 0 85.128 10.857 88.829 83.4l46.882 596.141c0 0 2.714 15.545 9.623 22.454s20.233 8.389 20.233 8.389h22.701v78.959l-224.54 0.247zM276.357 873.639c0 23.688 19.246 [...]
-<glyph unicode="&#xe901;" glyph-name="trash" horiz-adv-x="960" d="M704 0h-441.6c-44.8 0-76.8 32-76.8 76.8v505.6h-51.2v115.2c0 44.8 32 76.8 76.8 76.8h537.6c44.8 0 76.8-32 76.8-76.8v-115.2h-51.2v-499.2c6.4-51.2-25.6-83.2-70.4-83.2zM179.2 627.2h51.2v-550.4c0-19.2 12.8-32 32-32h441.6c19.2 0 32 12.8 32 32v550.4h51.2v70.4c0 19.2-12.8 32-32 32h-544c-19.2 0-32-12.8-32-32v-70.4zM588.8 505.6h44.8v-377.6h-44.8v377.6zM460.8 505.6h44.8v-377.6h-44.8v377.6zM332.8 505.6h44.8v-377.6h-44.8v377.6zM179.2 62 [...]
-<glyph unicode="&#xe902;" glyph-name="unlock, locked-unlock" d="M716.8 486.4c-19.2 0-32 12.8-32 32v172.8c0 96-76.8 172.8-172.8 172.8-89.6 0-166.4-70.4-172.8-153.6 0-6.4 0-12.8 0-19.2 0-19.2-12.8-32-32-32s-32 12.8-32 32c0 6.4 0 19.2 0 25.6 12.8 121.6 115.2 211.2 236.8 211.2 134.4 0 236.8-108.8 236.8-236.8v-172.8c0-19.2-12.8-32-32-32zM748.8 0h-473.6c-76.8 0-147.2 64-147.2 147.2v236.8c0 76.8 64 147.2 147.2 147.2h467.2c76.8 0 147.2-64 147.2-147.2v-236.8c0-83.2-64-147.2-140.8-147.2zM275.2 467 [...]
-<glyph unicode="&#xe903;" glyph-name="trashcan-restore" horiz-adv-x="873" d="M627.748 595.784h-92.103c-34.896-70.174-91.34-124.329-169.332-162.658 58.542 28.794 100.112 70.174 124.711 123.948 5.911 13.158 10.488 25.934 13.73 38.71h-374.704v-61.020h17.543c0 0 10.297-1.144 15.636-6.483s7.437-17.162 7.437-17.162l36.231-460.895c2.86-56.063 2.86-64.644 68.648-64.644h380.234c65.788 0 65.788 8.39 68.648 64.453l36.231 460.705c0 0 2.098 12.013 7.437 17.353s15.636 6.483 15.636 6.483h17.543v61.020l [...]
-<glyph unicode="&#xe904;" glyph-name="opkg" horiz-adv-x="964" d="M571.461 366.416c0-45.57-36.941-82.513-82.513-82.513s-82.513 36.941-82.513 82.513c0 45.57 36.941 82.513 82.513 82.513s82.513-36.941 82.513-82.513zM823.46 404.699c56.495 0 102.212 45.717 102.212 102.212s-45.717 102.212-102.212 102.212c-56.495 0-102.212-45.717-102.212-102.212 0-4.088 0.372-7.805 0.743-11.893l-96.265-40.142c-9.292 14.867-21.185 28.248-34.567 39.027l89.203 249.768c8.92-2.602 18.583-4.088 28.248-4.088 56.495 0 1 [...]
-<glyph unicode="&#xe905;" glyph-name="go" d="M512-64c-284.8 0-512 227.2-512 512s227.2 512 512 512 512-227.2 512-512-227.2-512-512-512zM512 899.2c-246.4 0-451.2-204.8-451.2-451.2s204.8-451.2 451.2-451.2c246.4 0 451.2 204.8 451.2 451.2s-204.8 451.2-451.2 451.2zM224 409.6h464l-140.8-140.8c-16-16-16-38.4 0-54.4s38.4-16 54.4 0l204.8 204.8c6.4 6.4 9.6 16 9.6 25.6s-3.2 19.2-9.6 25.6l-204.8 204.8c-6.4 6.4-16 9.6-25.6 9.6s-19.2-3.2-25.6-9.6c-16-16-16-38.4 0-54.4l140.8-140.8h-464c-19.2 0-38.4-16-3 [...]
-<glyph unicode="&#xe906;" glyph-name="cocoapods" d="M694.338 348.243c-25.765-142.039-147.324-257.652-334.947-257.652-223.959 0-359.391 165.161-359.391 352.785 0 183.659 128.826 352.785 357.409 352.785 196.212 0 318.431-123.541 336.268-278.132h-161.858c-13.874 78.617-73.992 138.075-172.428 138.075-128.826 0-201.497-101.739-201.497-212.728 0-117.595 81.259-212.728 203.479-212.728 89.848 0 149.306 51.53 168.465 117.595h164.501zM881.961 780.305l-99.097-42.281 123.541-290.023-123.541-290.023  [...]
-<glyph unicode="&#xe907;" glyph-name="revoke-api" d="M512 940.8c-275.2 0-499.2-224-499.2-499.2s224-492.8 499.2-492.8 499.2 224 499.2 492.8c0 275.2-224 499.2-499.2 499.2zM512-6.4c-249.6 0-448 198.4-448 448 0 121.6 51.2 236.8 128 313.6l204.8-224-198.4-236.8c-6.4-6.4-6.4-19.2-6.4-32v-70.4c0-25.6 6.4-64 38.4-64h70.4c25.6 0 44.8 25.6 51.2 44.8l6.4 32 57.6 6.4c25.6 0 44.8 19.2 51.2 44.8v38.4h38.4c19.2 0 38.4 12.8 44.8 32l6.4 25.6 230.4-256c-70.4-64-166.4-102.4-275.2-102.4zM467.2 531.2c0 19.2-6 [...]
-<glyph unicode="&#xe908;" glyph-name="unexpire" horiz-adv-x="1092" d="M191.147 372.907l54.613-27.307 27.307 54.613 34.133-61.44 54.613 34.133-47.787 61.44h68.267l-6.827 68.267-75.093-27.307 6.827 75.093h-61.44l6.827-75.093-75.093 20.48-13.653-61.44h68.267zM928.427 502.613l-81.92-27.307 13.653 75.093h-68.267l6.827-75.093-75.093 20.48-6.827-61.44h68.267l-47.787-61.44 61.44-27.307 27.307 54.613 27.307-61.44 54.613 34.133-40.96 61.44h68.267zM860.16 741.547v0 0c-27.307 6.827-47.787 13.653-75. [...]
-<glyph unicode="&#xe909;" glyph-name="expire" horiz-adv-x="1092" d="M375.467 502.613l-75.093-27.307 6.827 75.093h-61.44l6.827-75.093-75.093 27.307-13.653-68.267h68.267l-40.96-61.44 54.613-27.307 27.307 54.613 34.133-61.44 54.613 34.133-47.787 61.44h68.267zM648.533 502.613l-75.093-27.307 6.827 75.093h-68.267l6.827-75.093-75.093 27.307-6.827-68.267h68.267l-47.787-61.44 61.44-27.307 27.307 54.613 27.307-61.44 61.44 34.133-47.787 61.44h68.267zM928.427 502.613l-81.92-27.307 13.653 75.093h-68. [...]
-<glyph unicode="&#xe90a;" glyph-name="pin" d="M537.6 704l-172.8-172.8-128-51.2 134.4-134.4-179.2-185.6-12.8-44.8 51.2 12.8 179.2 179.2 134.4-134.4 51.2 128 172.8 172.8 128 51.2-307.2 307.2-51.2-128zM812.8 544l-76.8-32-179.2-179.2-32-76.8-204.8 204.8 70.4 25.6 185.6 185.6 32 76.8 204.8-204.8z" />
-<glyph unicode="&#xe90b;" glyph-name="unpin" d="M537.6 704l-172.8-172.8-128-51.2 134.4-134.4-179.2-185.6-12.8-44.8 51.2 12.8 179.2 179.2 134.4-134.4 51.2 128 172.8 172.8 128 51.2-307.2 307.2-51.2-128zM812.8 544l-76.8-32-179.2-179.2-32-76.8-204.8 204.8 70.4 25.6 185.6 185.6 32 76.8 204.8-204.8zM285.842 807.191l615.373-615.547-31.683-31.674-615.373 615.547 31.683 31.674z" />
-<glyph unicode="&#xe90c;" glyph-name="tar" d="M332.8 128h-38.4v198.4h-70.4v32h172.8v-32h-64v-198.4zM556.8 128l-25.6 64h-83.2l-19.2-64h-38.4l83.2 230.4h38.4l89.6-230.4h-44.8zM524.8 224l-19.2 64c0 6.4-6.4 12.8-6.4 19.2s-6.4 12.8-6.4 19.2c0-12.8-6.4-25.6-12.8-44.8l-19.2-57.6h64zM665.6 224v-96h-38.4v230.4h64c32 0 51.2-6.4 64-19.2s19.2-25.6 19.2-51.2c0-25.6-12.8-51.2-44.8-57.6l64-102.4h-44.8l-44.8 96h-38.4zM665.6 249.6h25.6c19.2 0 32 6.4 38.4 12.8s12.8 19.2 12.8 25.6c0 12.8-6.4 19.2-12.8 25.6 [...]
-<glyph unicode="&#xe90d;" glyph-name="gz" d="M416 256h83.2v-115.2c-12.8-6.4-25.6-12.8-38.4-12.8s-25.6 0-38.4 0c-32 0-64 12.8-83.2 32s-25.6 51.2-25.6 89.6c0 38.4 12.8 64 32 83.2s51.2 32 89.6 32c25.6 0 44.8-6.4 70.4-12.8l-12.8-32c-25.6 6.4-44.8 6.4-64 6.4-25.6 0-44.8-6.4-57.6-19.2s-19.2-38.4-19.2-64c0-25.6 6.4-51.2 19.2-64s32-19.2 57.6-19.2c12.8 0 25.6 0 38.4 6.4v57.6h-51.2v32zM716.8 128h-166.4v25.6l115.2 172.8h-115.2v32h160v-25.6l-115.2-172.8h121.6v-32zM64 960v-1024h896v1024h-896zM896 0h- [...]
-<glyph unicode="&#xe90e;" glyph-name="upload" d="M984-64h-944c-24 0-40 16-40 40v196c0 24 16 40 40 40s38-16 38-40v-158h868v158c0 24 14 40 38 40s40-16 40-40v-196c0-24-16-40-40-40zM874 674l-354 238c0 8-8 8-16 8 0 0-8-8-16-8l-354-238c-16-14-24-38-8-54 8-16 32-24 56-8l290 196v-638c0-22 16-38 40-38s40 16 40 38v630l290-188c16-16 40-8 56 8 8 16 8 40-24 54z" />
-<glyph unicode="&#xe90f;" glyph-name="plus-sign" d="M1024 482.133h-477.867v477.867h-68.267v-477.867h-477.867v-68.267h477.867v-477.867h68.267v477.867h477.867z" />
-<glyph unicode="&#xe910;" glyph-name="distribution-repo" d="M908.8 400l-41.6-44.8 48-25.6q54.4-48 38.4-121.6t-86.4-96q-16-6.4-64-6.4h-585.6q-67.2 0-105.6 25.6-41.6 35.2-48 83.2-6.4 60.8 25.6 99.2 38.4 44.8 92.8 44.8 57.6 0 64-3.2l16 48 22.4 41.6q32 35.2 83.2 41.6v67.2q-32 0-60.8-12.8-38.4-25.6-44.8-28.8-19.2-12.8-38.4-38.4-19.2-28.8-22.4-48-102.4 0-163.2-73.6-38.4-44.8-38.4-102.4 0-64 16-102.4l38.4-51.2 12.8-9.6q57.6-44.8 108.8-44.8h672q28.8 0 67.2 19.2 9.6 3.2 38.4 25.6l22.4 22.4 19.2 2 [...]
-</font></defs></svg>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/assets/fonts/artifactory.ttf b/web/angular-web/src/main/webapp/app/assets/fonts/artifactory.ttf
deleted file mode 100644
index eb03817..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/fonts/artifactory.ttf and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/fonts/artifactory.woff b/web/angular-web/src/main/webapp/app/assets/fonts/artifactory.woff
deleted file mode 100644
index b8318de..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/fonts/artifactory.woff and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/fonts/artifactory.woff2 b/web/angular-web/src/main/webapp/app/assets/fonts/artifactory.woff2
deleted file mode 100644
index a02bd78..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/fonts/artifactory.woff2 and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/fonts/glyphicons-halflings-regular.eot b/web/angular-web/src/main/webapp/app/assets/fonts/glyphicons-halflings-regular.eot
deleted file mode 100644
index b93a495..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/fonts/glyphicons-halflings-regular.eot and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/fonts/glyphicons-halflings-regular.svg b/web/angular-web/src/main/webapp/app/assets/fonts/glyphicons-halflings-regular.svg
deleted file mode 100644
index 94fb549..0000000
--- a/web/angular-web/src/main/webapp/app/assets/fonts/glyphicons-halflings-regular.svg
+++ /dev/null
@@ -1,288 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg">
-<metadata></metadata>
-<defs>
-<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
-<font-face units-per-em="1200" ascent="960" descent="-240" />
-<missing-glyph horiz-adv-x="500" />
-<glyph horiz-adv-x="0" />
-<glyph horiz-adv-x="400" />
-<glyph unicode=" " />
-<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 15 [...]
-<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xa0;" />
-<glyph unicode="&#xa5;" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" />
-<glyph unicode="&#x2000;" horiz-adv-x="650" />
-<glyph unicode="&#x2001;" horiz-adv-x="1300" />
-<glyph unicode="&#x2002;" horiz-adv-x="650" />
-<glyph unicode="&#x2003;" horiz-adv-x="1300" />
-<glyph unicode="&#x2004;" horiz-adv-x="433" />
-<glyph unicode="&#x2005;" horiz-adv-x="325" />
-<glyph unicode="&#x2006;" horiz-adv-x="216" />
-<glyph unicode="&#x2007;" horiz-adv-x="216" />
-<glyph unicode="&#x2008;" horiz-adv-x="162" />
-<glyph unicode="&#x2009;" horiz-adv-x="260" />
-<glyph unicode="&#x200a;" horiz-adv-x="72" />
-<glyph unicode="&#x202f;" horiz-adv-x="260" />
-<glyph unicode="&#x205f;" horiz-adv-x="325" />
-<glyph unicode="&#x20ac;" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 1 [...]
-<glyph unicode="&#x20bd;" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 1 [...]
-<glyph unicode="&#x2212;" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#x231b;" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-2 [...]
-<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
-<glyph unicode="&#x2601;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" />
-<glyph unicode="&#x26fa;" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " />
-<glyph unicode="&#x2709;" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" />
-<glyph unicode="&#x270f;" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" />
-<glyph unicode="&#xe001;" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" />
-<glyph unicode="&#xe002;" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" />
-<glyph unicode="&#xe003;" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" />
-<glyph unicode="&#xe005;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" />
-<glyph unicode="&#xe006;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" />
-<glyph unicode="&#xe007;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" />
-<glyph unicode="&#xe008;" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" />
-<glyph unicode="&#xe009;" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t- [...]
-<glyph unicode="&#xe010;" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21  [...]
-<glyph unicode="&#xe011;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 [...]
-<glyph unicode="&#xe012;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21  [...]
-<glyph unicode="&#xe013;" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" />
-<glyph unicode="&#xe014;" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" />
-<glyph unicode="&#xe015;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5  [...]
-<glyph unicode="&#xe016;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17. [...]
-<glyph unicode="&#xe017;" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" />
-<glyph unicode="&#xe018;" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h [...]
-<glyph unicode="&#xe019;" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 9 [...]
-<glyph unicode="&#xe020;" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" />
-<glyph unicode="&#xe021;" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" />
-<glyph unicode="&#xe022;" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" />
-<glyph unicode="&#xe023;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5  [...]
-<glyph unicode="&#xe024;" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" />
-<glyph unicode="&#xe025;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe026;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 [...]
-<glyph unicode="&#xe027;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -2 [...]
-<glyph unicode="&#xe028;" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" />
-<glyph unicode="&#xe029;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
-<glyph unicode="&#xe030;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" />
-<glyph unicode="&#xe031;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 21 [...]
-<glyph unicode="&#xe032;" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-4 [...]
-<glyph unicode="&#xe033;" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" />
-<glyph unicode="&#xe034;" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" />
-<glyph unicode="&#xe035;" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q [...]
-<glyph unicode="&#xe036;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" />
-<glyph unicode="&#xe037;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" />
-<glyph unicode="&#xe038;" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16 [...]
-<glyph unicode="&#xe039;" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0 [...]
-<glyph unicode="&#xe040;" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" />
-<glyph unicode="&#xe041;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
-<glyph unicode="&#xe042;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
-<glyph unicode="&#xe043;" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" />
-<glyph unicode="&#xe044;" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe045;" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5 [...]
-<glyph unicode="&#xe046;" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" />
-<glyph unicode="&#xe047;" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" />
-<glyph unicode="&#xe048;" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 [...]
-<glyph unicode="&#xe049;" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" />
-<glyph unicode="&#xe050;" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" />
-<glyph unicode="&#xe051;" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" />
-<glyph unicode="&#xe052;" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21  [...]
-<glyph unicode="&#xe053;" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -2 [...]
-<glyph unicode="&#xe054;" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 [...]
-<glyph unicode="&#xe055;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0  [...]
-<glyph unicode="&#xe056;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21  [...]
-<glyph unicode="&#xe057;" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5  [...]
-<glyph unicode="&#xe058;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0  [...]
-<glyph unicode="&#xe059;" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" />
-<glyph unicode="&#xe060;" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" />
-<glyph unicode="&#xe062;" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" />
-<glyph unicode="&#xe063;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" />
-<glyph unicode="&#xe064;" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 [...]
-<glyph unicode="&#xe065;" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" />
-<glyph unicode="&#xe066;" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 - [...]
-<glyph unicode="&#xe067;" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" />
-<glyph unicode="&#xe068;" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" />
-<glyph unicode="&#xe069;" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe070;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe071;" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" />
-<glyph unicode="&#xe072;" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" />
-<glyph unicode="&#xe073;" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe074;" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" />
-<glyph unicode="&#xe075;" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" />
-<glyph unicode="&#xe076;" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe077;" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe078;" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe079;" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" />
-<glyph unicode="&#xe080;" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" />
-<glyph unicode="&#xe081;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5  [...]
-<glyph unicode="&#xe082;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" />
-<glyph unicode="&#xe083;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141  [...]
-<glyph unicode="&#xe084;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" />
-<glyph unicode="&#xe085;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t [...]
-<glyph unicode="&#xe086;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 [...]
-<glyph unicode="&#xe087;" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 [...]
-<glyph unicode="&#xe088;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q [...]
-<glyph unicode="&#xe089;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 - [...]
-<glyph unicode="&#xe090;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" />
-<glyph unicode="&#xe091;" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" />
-<glyph unicode="&#xe092;" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" />
-<glyph unicode="&#xe093;" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" />
-<glyph unicode="&#xe094;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe095;" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" />
-<glyph unicode="&#xe096;" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" />
-<glyph unicode="&#xe097;" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" />
-<glyph unicode="&#xe101;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
-<glyph unicode="&#xe102;" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 [...]
-<glyph unicode="&#xe103;" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 - [...]
-<glyph unicode="&#xe104;" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80  [...]
-<glyph unicode="&#xe105;" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -7 [...]
-<glyph unicode="&#xe106;" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 1 [...]
-<glyph unicode="&#xe107;" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" />
-<glyph unicode="&#xe108;" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" />
-<glyph unicode="&#xe109;" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100 [...]
-<glyph unicode="&#xe110;" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" />
-<glyph unicode="&#xe111;" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" />
-<glyph unicode="&#xe112;" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" />
-<glyph unicode="&#xe113;" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" />
-<glyph unicode="&#xe114;" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" />
-<glyph unicode="&#xe115;" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
-<glyph unicode="&#xe116;" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" />
-<glyph unicode="&#xe117;" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" />
-<glyph unicode="&#xe118;" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" />
-<glyph unicode="&#xe119;" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
-<glyph unicode="&#xe120;" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" />
-<glyph unicode="&#xe121;" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" />
-<glyph unicode="&#xe122;" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" />
-<glyph unicode="&#xe123;" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" />
-<glyph unicode="&#xe124;" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" />
-<glyph unicode="&#xe125;" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe126;" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375 [...]
-<glyph unicode="&#xe127;" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 - [...]
-<glyph unicode="&#xe128;" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 [...]
-<glyph unicode="&#xe129;" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 [...]
-<glyph unicode="&#xe130;" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-4 [...]
-<glyph unicode="&#xe131;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" />
-<glyph unicode="&#xe132;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" />
-<glyph unicode="&#xe133;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" />
-<glyph unicode="&#xe134;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" />
-<glyph unicode="&#xe135;" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5  [...]
-<glyph unicode="&#xe136;" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" />
-<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70 [...]
-<glyph unicode="&#xe138;" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" />
-<glyph unicode="&#xe139;" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" />
-<glyph unicode="&#xe140;" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 [...]
-<glyph unicode="&#xe141;" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 [...]
-<glyph unicode="&#xe142;" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2  [...]
-<glyph unicode="&#xe143;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 - [...]
-<glyph unicode="&#xe144;" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" />
-<glyph unicode="&#xe145;" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" />
-<glyph unicode="&#xe146;" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" />
-<glyph unicode="&#xe148;" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5 [...]
-<glyph unicode="&#xe149;" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17. [...]
-<glyph unicode="&#xe150;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
-<glyph unicode="&#xe151;" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " />
-<glyph unicode="&#xe152;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " />
-<glyph unicode="&#xe153;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" />
-<glyph unicode="&#xe154;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" />
-<glyph unicode="&#xe155;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" />
-<glyph unicode="&#xe156;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" />
-<glyph unicode="&#xe157;" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" />
-<glyph unicode="&#xe158;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
-<glyph unicode="&#xe159;" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" />
-<glyph unicode="&#xe160;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" />
-<glyph unicode="&#xe161;" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
-<glyph unicode="&#xe162;" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" />
-<glyph unicode="&#xe163;" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
-<glyph unicode="&#xe164;" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" />
-<glyph unicode="&#xe165;" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" />
-<glyph unicode="&#xe166;" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
-<glyph unicode="&#xe167;" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
-<glyph unicode="&#xe168;" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" />
-<glyph unicode="&#xe169;" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
-<glyph unicode="&#xe170;" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
-<glyph unicode="&#xe171;" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" />
-<glyph unicode="&#xe172;" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" />
-<glyph unicode="&#xe173;" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" />
-<glyph unicode="&#xe174;" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15 [...]
-<glyph unicode="&#xe175;" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe176;" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" />
-<glyph unicode="&#xe177;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" />
-<glyph unicode="&#xe178;" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" />
-<glyph unicode="&#xe179;" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14 [...]
-<glyph unicode="&#xe180;" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" />
-<glyph unicode="&#xe181;" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" />
-<glyph unicode="&#xe182;" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" />
-<glyph unicode="&#xe183;" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212 [...]
-<glyph unicode="&#xe184;" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe185;" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " />
-<glyph unicode="&#xe186;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
-<glyph unicode="&#xe187;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
-<glyph unicode="&#xe188;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" />
-<glyph unicode="&#xe189;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" />
-<glyph unicode="&#xe190;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" />
-<glyph unicode="&#xe191;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" />
-<glyph unicode="&#xe192;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" />
-<glyph unicode="&#xe193;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" />
-<glyph unicode="&#xe194;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" />
-<glyph unicode="&#xe195;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" />
-<glyph unicode="&#xe197;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe198;" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" />
-<glyph unicode="&#xe199;" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" />
-<glyph unicode="&#xe200;" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" />
-<glyph unicode="&#xe201;" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -2 [...]
-<glyph unicode="&#xe202;" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" />
-<glyph unicode="&#xe203;" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" />
-<glyph unicode="&#xe204;" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" />
-<glyph unicode="&#xe205;" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" />
-<glyph unicode="&#xe206;" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" />
-<glyph unicode="&#xe209;" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" />
-<glyph unicode="&#xe210;" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250 [...]
-<glyph unicode="&#xe211;" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe212;" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe213;" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe214;" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t [...]
-<glyph unicode="&#xe215;" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe216;" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" />
-<glyph unicode="&#xe218;" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" />
-<glyph unicode="&#xe219;" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h [...]
-<glyph unicode="&#xe221;" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe223;" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" />
-<glyph unicode="&#xe224;" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " />
-<glyph unicode="&#xe225;" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35 [...]
-<glyph unicode="&#xe226;" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 [...]
-<glyph unicode="&#xe227;" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h [...]
-<glyph unicode="&#xe230;" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" />
-<glyph unicode="&#xe231;" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
-<glyph unicode="&#xe232;" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
-<glyph unicode="&#xe233;" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" />
-<glyph unicode="&#xe234;" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
-<glyph unicode="&#xe235;" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
-<glyph unicode="&#xe236;" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
-<glyph unicode="&#xe237;" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" />
-<glyph unicode="&#xe238;" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 3 [...]
-<glyph unicode="&#xe239;" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" />
-<glyph unicode="&#xe240;" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -1 [...]
-<glyph unicode="&#xe241;" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" />
-<glyph unicode="&#xe242;" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" />
-<glyph unicode="&#xe243;" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 [...]
-<glyph unicode="&#xe244;" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" />
-<glyph unicode="&#xe245;" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" />
-<glyph unicode="&#xe246;" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" />
-<glyph unicode="&#xe247;" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe248;" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" />
-<glyph unicode="&#xe249;" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
-<glyph unicode="&#xe250;" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" />
-<glyph unicode="&#xe251;" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" />
-<glyph unicode="&#xe252;" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" />
-<glyph unicode="&#xe253;" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" />
-<glyph unicode="&#xe254;" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" />
-<glyph unicode="&#xe255;" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" />
-<glyph unicode="&#xe256;" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" />
-<glyph unicode="&#xe257;" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" />
-<glyph unicode="&#xe258;" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" />
-<glyph unicode="&#xe259;" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" />
-<glyph unicode="&#xe260;" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" />
-<glyph unicode="&#xf8ff;" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 19 [...]
-<glyph unicode="&#x1f511;" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" />
-<glyph unicode="&#x1f6aa;" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" />
-</font>
-</defs></svg> 
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/assets/fonts/glyphicons-halflings-regular.ttf b/web/angular-web/src/main/webapp/app/assets/fonts/glyphicons-halflings-regular.ttf
deleted file mode 100644
index 1413fc6..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/fonts/glyphicons-halflings-regular.ttf and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/fonts/glyphicons-halflings-regular.woff b/web/angular-web/src/main/webapp/app/assets/fonts/glyphicons-halflings-regular.woff
deleted file mode 100644
index 9e61285..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/fonts/glyphicons-halflings-regular.woff and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/fonts/glyphicons-halflings-regular.woff2 b/web/angular-web/src/main/webapp/app/assets/fonts/glyphicons-halflings-regular.woff2
deleted file mode 100644
index 64539b5..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/fonts/glyphicons-halflings-regular.woff2 and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/32px.png b/web/angular-web/src/main/webapp/app/assets/images/32px.png
deleted file mode 100644
index 503e49b..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/32px.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/32px_trash.png b/web/angular-web/src/main/webapp/app/assets/images/32px_trash.png
deleted file mode 100644
index 32210ed..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/32px_trash.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/403_image.svg b/web/angular-web/src/main/webapp/app/assets/images/403_image.svg
deleted file mode 100644
index 875a05a..0000000
--- a/web/angular-web/src/main/webapp/app/assets/images/403_image.svg
+++ /dev/null
@@ -1,931 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 237.5 132.7" enable-background="new 0 0 237.5 132.7" xml:space="preserve">
-<g>
-	<g>
-		<path fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="7" d="M155.3,76.4"/>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<path d="M54.7,120.6l-0.5-0.8c1.3-0.8,2.6-1.5,3.8-2.2l0.5,0.8C57.3,119,56,119.8,54.7,120.6z M64.5,115.3l-0.4-0.9
-				c2.2-1,4.3-1.8,6.4-2.4l0.3,0.9C68.7,113.6,66.7,114.4,64.5,115.3z M77.2,111.6l-0.1-1c2.3-0.3,4.4-0.4,6.4-0.4l0.3,0l0,1l-0.3,0
-				C81.6,111.3,79.5,111.3,77.2,111.6z M90.7,110.7l-0.1-1c2.2-0.3,4.3-0.9,6.4-1.7l0.3,0.9C95.1,109.7,92.9,110.3,90.7,110.7z
-				 M103.4,106l-0.5-0.8l2.2-1.2c1.4-0.8,2.6-1.5,3.7-2.1l0.5,0.8c-1,0.6-2.2,1.3-3.7,2.1L103.4,106z M115.3,99.6l-0.4-0.9
-				c1.5-0.7,3.3-1.4,5.6-2.4l0.6-0.3l0.4,0.9l-0.6,0.2C118.5,98.2,116.8,98.9,115.3,99.6z M127.8,94.9l-0.3-0.9
-				c2.1-0.6,4.2-1.1,6.6-1.5l0.2,0.9C132,93.8,129.8,94.3,127.8,94.9z M141,92.2l-0.1-1l1.7-0.2c1.7-0.2,3.3-0.5,5-0.7l0.2,1
-				c-1.6,0.3-3.3,0.5-5,0.8L141,92.2z M154.3,89.8l-0.3-0.9c0.9-0.3,1.8-0.5,2.7-0.8c1.2-0.4,2.5-0.9,3.6-1.4l0.4,0.9
-				c-1.2,0.5-2.4,1-3.7,1.4C156.2,89.3,155.3,89.6,154.3,89.8z M166.9,84.7l-0.4-0.9c2.3-1.2,4.4-2.4,5.9-3.3l0.5,0.8
-				C171.3,82.3,169.2,83.5,166.9,84.7z M178.6,77.9l-0.5-0.8c2.3-1.3,4.1-2.3,6-3.2l0.4,0.9C182.6,75.7,180.8,76.6,178.6,77.9z
-				 M190.8,72.7l-0.1-1c1.6-0.3,3.9-0.5,6.8-0.7l0.1,1C194.6,72.2,192.4,72.5,190.8,72.7z M204.2,71.6l-0.1-1l0.1,0
-				c2.4-0.1,4.7-0.3,6.6-0.4l0.1,1C209,71.3,206.7,71.5,204.2,71.6L204.2,71.6z M217.7,69.9l-0.4-0.9c1.5-0.6,3.6-1.5,6.2-2.7
-				l0.4,0.9C221.3,68.3,219.2,69.3,217.7,69.9z M230,64.2l-0.4-0.9c3.4-1.7,6.1-3,6.1-3l0.4,0.9C236.1,61.2,233.5,62.5,230,64.2z"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<path d="M28.6,105.3l-0.5-0.8c1.4-0.8,2.8-1.6,4.1-2.3l0.5,0.8C31.3,103.7,30,104.5,28.6,105.3z M38.6,100l-0.4-0.9
-				c2.3-1,4.4-1.8,6.4-2.4l0.3,0.9C43,98.2,40.9,99,38.6,100z M57.8,97c-1.1,0-2.1-0.1-3.1-0.2c-1-0.1-2.1-0.2-3.2-0.2l-0.1-1
-				c1.2,0,2.3,0.1,3.4,0.2c1,0.1,2,0.1,3,0.1l0.3,0l0,1L57.8,97z M64.9,95.8l-0.3-0.9c1.8-0.6,3.8-1.5,6.1-2.8l0.5,0.8
-				C68.8,94.2,66.8,95.1,64.9,95.8z M77,89.7l-0.4-0.9c2.5-1.3,4.1-1.9,6.2-2.7l0.3,0.9C81.1,87.9,79.6,88.5,77,89.7z M89.5,84.7
-				l-0.4-0.9c2.1-0.8,4.2-1.6,6.4-2.3l0.3,0.9C93.6,83.1,91.5,83.8,89.5,84.7z M102.3,80.7l-0.2-0.9c2.4-0.5,4.7-1,6.6-1.4l0.2,0.9
-				C107,79.8,104.7,80.2,102.3,80.7z M115.6,78.1l-0.2-0.9c2.6-0.5,4.7-1,6.5-1.5l0.3,0.9C120.3,77.1,118.2,77.6,115.6,78.1z
-				 M128.6,74.3l-0.4-0.9c2.1-0.8,4.1-1.8,6.1-2.8l0.4,0.9C132.7,72.6,130.7,73.5,128.6,74.3z M140.7,68.2l-0.5-0.8
-				c0.9-0.5,1.7-1.1,2.6-1.6c1.1-0.7,2.1-1.3,3.2-1.9l0.5,0.8c-1.1,0.6-2.1,1.3-3.2,1.9C142.4,67.2,141.6,67.7,140.7,68.2z
-				 M152.4,61.6l-0.4-0.9c1.2-0.6,2.4-1.1,3.7-1.6c0.7-0.3,1.6-0.5,2.8-0.7l0.2,0.9c-1.1,0.2-2,0.5-2.6,0.7
-				C154.8,60.5,153.6,61,152.4,61.6z M165.3,58.4l-0.1-1c1.8-0.2,3.7-0.4,5.6-0.6l1.2-0.1l0.1,1l-1.2,0.1
-				C169,57.9,167.1,58.1,165.3,58.4z M178.7,56.7l-0.2-1c1.1-0.2,1.9-0.3,2.3-0.5c1.1-0.3,2.8-0.5,4.4-0.5l0,1
-				c-1.6,0.1-3.1,0.2-4.1,0.5C180.7,56.4,179.9,56.6,178.7,56.7z M192.1,55.5l-0.1-1c2.5-0.2,4.7-0.4,6.6-0.8l0.2,0.9
-				C196.9,55.1,194.7,55.3,192.1,55.5z M205.4,52.6l-0.4-0.9c2.1-1,3.9-2.2,5.4-3.7l0.7,0.7C209.5,50.3,207.6,51.6,205.4,52.6z"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<path fill="#FFFFFF" d="M21.2,71.2c-1.5,0-2.1,0.5-2.7,2.2c-0.6,1.6-0.9,3.4-0.3,5.1c0.6,1.7,2.2,1.7,3.3,0.8
-				c1.1-0.8,1.8-3.1,1.7-4.6C23.1,72.9,22.2,71.3,21.2,71.2z"/>
-		</g>
-	</g>
-	<g>
-		<g>
-			<path d="M20,80.5L20,80.5c-1,0-1.8-0.6-2.2-1.7c-0.7-2-0.3-4.1,0.3-5.5c0.6-1.6,1.3-2.5,3.1-2.5l0.1,0c1.4,0.1,2.4,2.1,2.5,4
-				c0.1,1.6-0.6,4-1.9,5C21.3,80.2,20.6,80.5,20,80.5z M21.2,71.7c-1.2,0-1.7,0.4-2.3,1.9c-0.5,1.2-0.9,3-0.3,4.8
-				c0.3,0.7,0.7,1.1,1.3,1.1l0,0c0.4,0,0.9-0.2,1.3-0.5c0.9-0.7,1.6-2.7,1.5-4.2C22.6,73,21.7,71.8,21.2,71.7z"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<path fill="#FFFFFF" d="M22.2,60.1c-3.3-1.4-4.9,3.9-3.6,6.8c1.6,3.7,5.6,2.7,5.3-1.8C23.8,63.6,23.2,60.2,22.2,60.1z"/>
-		</g>
-	</g>
-	<g>
-		<g>
-			<path d="M21.3,69.7L21.3,69.7c-1.3,0-2.5-1-3.2-2.6c-0.8-1.9-0.5-4.6,0.6-6.3c0.9-1.3,2.2-1.8,3.6-1.2c1.7,0.3,2,5.2,2.1,5.5
-				c0.1,1.6-0.3,2.9-1.1,3.7C22.7,69.4,22,69.7,21.3,69.7z M21.1,60.4c-0.8,0-1.3,0.6-1.7,1c-0.9,1.4-1.1,3.8-0.5,5.4
-				c0.5,1.2,1.4,2,2.3,2c0.5,0,0.9-0.2,1.3-0.6c0.6-0.6,0.9-1.7,0.8-3c-0.1-2.4-0.9-4.5-1.3-4.6l-0.2,0
-				C21.7,60.5,21.4,60.4,21.1,60.4z"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<path fill="#ED1C24" d="M22.4,49c-0.9-0.8-2.6,0-3.3,1c-1,1.5-0.9,3.8-0.5,5.5c0.4,1.6,1.1,2.1,2.5,2c1.7-0.2,2.6-1.5,2.8-3.5
-				C24.1,52,23.8,48.5,22.4,49z"/>
-		</g>
-	</g>
-	<g>
-		<g>
-			<path d="M20.7,58c-1.7,0-2.3-1.3-2.5-2.4c-0.4-1.7-0.5-4.2,0.6-5.9c0.8-1.2,2.7-1.9,3.8-1.2c0.3,0,0.7,0,1.1,0.4
-				c0.9,1,1,3.6,0.9,5.1c-0.3,3-1.9,3.8-3.2,4C21,58,20.8,58,20.7,58z M21.4,49.2c-0.7,0-1.5,0.5-1.9,1.1c-0.9,1.4-0.8,3.7-0.4,5.1
-				c0.4,1.6,1,1.7,2,1.6c1.4-0.2,2.2-1.2,2.4-3.1c0.1-1.6-0.1-3.8-0.6-4.4c-0.2-0.2-0.2-0.1-0.3-0.1l-0.3,0.1l-0.2-0.2
-				C21.9,49.3,21.7,49.2,21.4,49.2z"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<g>
-				<polygon fill="#FFFFFF" points="133.9,2.5 110.5,50.7 47.3,57.3 88,88.9 107.6,94.5 178.7,68 197.6,18.8 154.4,39.7 				"/>
-			</g>
-		</g>
-	</g>
-	<g>
-		<g>
-			<g>
-				<g>
-					<polygon fill="#FFFFFF" points="47.3,57.3 124.6,62 169.1,49.6 197.6,18.8 178.7,68 107.6,94.5 					"/>
-				</g>
-			</g>
-			<g>
-				<g>
-					<path d="M107.6,95l-0.2-0.1L47.1,57.7l-1-0.9h0.7l77.7,4.7l44.3-12.3l29-31.3l0.9-0.5l-19.7,51L107.6,95z M49.2,57.9l58.5,36
-						l70.6-26.3l18-46.7l-27,29.1l-0.1,0l-45.4,12.3l0.3,0.1L49.2,57.9z"/>
-				</g>
-			</g>
-		</g>
-		<g>
-			<g>
-				<g>
-					<polygon points="107.5,94.9 87.7,89.3 47,57.7 47.6,56.9 88.2,88.4 107.8,94 					"/>
-				</g>
-			</g>
-		</g>
-		<g>
-			<g>
-				<g>
-					<polygon points="108.1,94.7 107.2,94.2 123.8,61.8 124.3,62.1 					"/>
-				</g>
-			</g>
-		</g>
-		<g>
-			<g>
-				<g>
-					<rect x="163.5" y="58.3" transform="matrix(0.4631 0.8863 -0.8863 0.4631 145.4421 -122.5522)" width="20.8" height="1"/>
-				</g>
-			</g>
-		</g>
-		<g>
-			<g>
-				<g>
-					<polyline fill="#FFFFFF" points="105.1,60.7 133.9,2.5 161,51.6 					"/>
-				</g>
-			</g>
-			<g>
-				<g>
-					<polygon points="105.5,61 104.6,60.5 133.9,1.4 161.4,51.4 160.5,51.8 134,3.5 					"/>
-				</g>
-			</g>
-		</g>
-		<g>
-			<g>
-				<g>
-					<polygon points="138.3,57.2 133.5,2.5 134.4,2.4 146.8,55.1 145.9,55.3 135,9.2 139.3,57.1 					"/>
-				</g>
-			</g>
-		</g>
-		<g>
-			<g>
-				<g>
-					<line fill="#FFFFFF" x1="154.4" y1="39.7" x2="197.6" y2="18.8"/>
-				</g>
-			</g>
-			<g>
-				<g>
-					<rect x="175.5" y="5.2" transform="matrix(0.4355 0.9002 -0.9002 0.4355 125.6834 -141.9637)" width="1" height="48"/>
-				</g>
-			</g>
-		</g>
-		<g>
-			<g>
-				<g>
-					<rect x="78.5" y="22.2" transform="matrix(0.1035 0.9946 -0.9946 0.1035 124.4772 -30.102)" width="1" height="63.5"/>
-				</g>
-			</g>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon fill="#B7B7B7" points="155.4,39.6 195.4,19.8 169.1,49.6 161,51.6 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon fill="#42A147" points="155.4,39.6 195.4,19.8 187,30.2 157.8,45.8 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon fill="#42A147" points="109.4,50.9 52.3,56.8 78.7,60 106.6,57.7 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon fill="#B7B7B7" points="105.1,60.7 107.5,55.4 76.3,59 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon fill="#30783B" points="159.9,37.4 166.8,41.1 158,45.8 155.1,39.9 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon fill="#929392" points="166.8,41.1 173.6,44.7 169.1,49.6 161,51.6 157.8,45.8 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon fill="#30783B" points="99,51.5 93.8,56.8 107.8,55.4 109.9,50.8 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon fill="#929392" points="107.8,55.4 105.3,60.7 90.4,60.1 93.8,56.8 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon fill="#B7B7B7" points="47.3,57.3 123.8,62.3 107.6,94.5 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon fill="#373737" points="105.1,60.7 84.1,79.9 47.3,57.3 72.5,59.3 			"/>
-		</g>
-	</g>
-</g>
-<g opacity="0.61">
-	<g>
-		<g>
-			<polygon fill="#B7B7B7" points="124.3,62.1 108.7,93.9 178.7,68 169.1,49.6 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon fill="#FFFFFF" points="108.7,67.4 116.8,74.2 153.8,61.3 144,80.7 107.6,94.5 92,84.8 			"/>
-		</g>
-	</g>
-	<g>
-		<g>
-			<path d="M107.6,95L91.2,84.9l17.4-18.1l8.2,6.9l37.8-13.3l-10.4,20.7L107.6,95z M92.7,84.7l15,9.2l36-13.6l9.1-18.2l-36.1,12.7
-				l-8-6.7L92.7,84.7z"/>
-		</g>
-	</g>
-</g>
-<g opacity="0.35">
-	<g>
-		<g>
-			<polygon fill="#B7B7B7" points="108.7,67.4 103.2,73.6 113.6,82.1 147.9,72 152.8,62.1 116.5,74.7 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon points="113.5,82.7 102.7,74.4 103.3,73.7 113.7,81.6 148.5,71.5 148.8,72.4 			"/>
-		</g>
-	</g>
-</g>
-<g opacity="0.17">
-	<g>
-		<g>
-			<polygon points="123.8,62.3 107,94.5 83.5,79.9 104.4,60.7 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon points="112.4,85.8 106.4,81.8 107,81 112.5,84.7 136.1,77.8 136.3,78.7 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon points="109.8,90.2 103.5,85.3 104.1,84.6 109.9,89.1 136.2,80.3 136.5,81.2 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<g>
-				<rect x="107.1" y="74.4" transform="matrix(0.9797 0.2006 -0.2006 0.9797 17.2267 -20.2802)" width="3.1" height="1"/>
-			</g>
-		</g>
-	</g>
-	<g>
-		<g>
-			<g>
-				<path d="M112.2,78.1c-0.9,0-1.8-0.5-2.3-1.3c-0.3-0.6-0.4-1.3-0.2-1.9c0.2-0.7,0.6-1.2,1.2-1.6c0.4-0.2,0.8-0.3,1.3-0.3
-					c0.9,0,1.8,0.5,2.3,1.3c0.3,0.6,0.4,1.3,0.2,1.9c-0.2,0.7-0.6,1.2-1.2,1.6C113.1,77.9,112.7,78.1,112.2,78.1z M112.2,73.9
-					c-0.3,0-0.6,0.1-0.8,0.2c-0.4,0.2-0.7,0.6-0.8,1c-0.1,0.4-0.1,0.8,0.2,1.2c0.4,0.7,1.5,1,2.3,0.6c0.4-0.2,0.7-0.6,0.8-1
-					c0.1-0.4,0.1-0.8-0.2-1.2C113.4,74.3,112.8,73.9,112.2,73.9z"/>
-			</g>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<path d="M138.4,74l2.1-6.8l9-3.3l-3,7.6L138.4,74z M141.2,67.9l-1.4,4.6l5.9-1.9l2-5.2L141.2,67.9z"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<path fill="#42A147" d="M143.1,70.6L143.1,70.6c-0.2,0-0.3-0.1-0.4-0.2l-0.9-1.1l0.8-0.6l0.5,0.7l2-2.3l0.7,0.6l-2.4,2.7
-				C143.4,70.6,143.3,70.6,143.1,70.6z"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon fill="#A4A4A3" points="197.6,18.8 169.1,49.6 178.7,68 			"/>
-		</g>
-	</g>
-</g>
-<g opacity="0.81">
-	<g>
-		<g>
-			<polygon fill="#B7B7B7" points="132.9,4.7 105.1,60.7 123.3,61.9 138.8,57.1 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon fill="#757776" points="107.8,55.7 124,54.5 138.4,53.6 138.7,57.3 123.3,61.9 105.4,60.4 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon fill="#545554" points="135.2,7.8 138.9,57.4 146.4,55.2 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<path fill="#333333" d="M132.4,5.9c0.3,1.2,6.5,52.1,6.5,52.1l3.9-1.4l-8.8-54.2L132.4,5.9z"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon points="138.3,57.4 132.4,4.7 133.3,4.6 139.3,57.2 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon fill="#B7B7B7" points="146.5,55.2 160.2,52 135.3,6 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<rect x="113.1" y="28.4" transform="matrix(0.2293 0.9734 -0.9734 0.2293 136.1005 -114.1839)" width="54.2" height="1"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon fill="#757776" points="146.1,51.8 159.3,50.2 160.2,52 146.7,55.3 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon points="123.4,62.4 50.1,57.9 50.1,57 123.3,61.4 168.8,49.1 195.1,19.5 195.8,20.2 169.3,50 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon fill="#A4A4A3" points="52.6,60.5 88,88.9 104.7,93.9 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<path fill="#A4A4A3" d="M71.7,76.2"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon fill="#262626" points="49.1,57.5 70.6,75.7 83.1,80 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<g>
-				<g>
-					<path fill="#FFFFFF" d="M68.2,72.1l-0.2-0.1l0.2-0.2l-1.3-1L66.8,71l-0.2-0.1l0.4-0.4l0.2,0.1L67,70.7l1.3,1l0.2-0.2l0.2,0.1
-						L68.2,72.1z"/>
-				</g>
-			</g>
-		</g>
-		<g>
-			<g>
-				<g>
-					<path fill="#FFFFFF" d="M70.3,73.3c0,0.1-0.1,0-0.3,0c-0.2-0.1-0.3-0.2-0.6-0.4c-0.1-0.1-0.3-0.2-0.4-0.3
-						c-0.1-0.1-0.2-0.2-0.2-0.3s0-0.1,0-0.2c0-0.1,0.1,0,0.3,0c0.2,0.1,0.3,0.2,0.6,0.4c0.2,0.2,0.4,0.3,0.5,0.4
-						C70.3,73.2,70.3,73.3,70.3,73.3z M69,72.4c0,0,0,0.1,0.1,0.2c0.1,0.1,0.2,0.2,0.4,0.4c0.2,0.1,0.3,0.2,0.4,0.3
-						c0.1,0,0.2,0.1,0.2,0c0,0,0-0.1-0.1-0.2c-0.1-0.1-0.2-0.2-0.4-0.4c-0.2-0.1-0.3-0.2-0.4-0.3C69.1,72.3,69,72.3,69,72.4z"/>
-				</g>
-			</g>
-		</g>
-		<g>
-			<g>
-				<g>
-					<path fill="#FFFFFF" d="M72.6,75.4l0.2-0.2c0,0,0-0.1,0-0.1c0-0.1-0.1-0.1-0.3-0.2c-0.2-0.1-0.3-0.2-0.4-0.3
-						c-0.1,0-0.2,0-0.2,0l-0.2,0.2l-0.2-0.1l0.2-0.2c0-0.1-0.1-0.2-0.3-0.4c-0.2-0.1-0.3-0.2-0.4-0.3c-0.1,0-0.2,0-0.2,0L70.7,74
-						l-0.1-0.1l0.3-0.3l0.1,0.1l0,0.1l0,0c0.1,0,0.1,0.1,0.2,0.1c0.1,0.1,0.2,0.1,0.3,0.2c0.3,0.2,0.4,0.3,0.4,0.4l0,0
-						c0.1,0,0.2,0.1,0.2,0.1c0.1,0.1,0.2,0.1,0.3,0.2c0.2,0.1,0.3,0.2,0.4,0.3s0.1,0.2,0.1,0.2l-0.2,0.2L72.6,75.4z"/>
-				</g>
-			</g>
-		</g>
-		<g>
-			<g>
-				<g>
-					<path fill="#FFFFFF" d="M73.9,76.4c-0.2-0.2-0.4-0.3-0.5-0.5c-0.1-0.1-0.1-0.2-0.1-0.3c0-0.1,0.1,0,0.3,0
-						c0.2,0.1,0.3,0.2,0.6,0.3c0.2,0.1,0.3,0.3,0.4,0.4c0.1,0.1,0.1,0.2,0.1,0.2l0,0l-1.2-0.9c0,0,0,0.1,0.1,0.2
-						C73.6,76.1,73.8,76.2,73.9,76.4c0.1,0,0.2,0.1,0.3,0.2s0.2,0.1,0.3,0.2l0,0c-0.1-0.1-0.2-0.1-0.3-0.2
-						C74.1,76.5,74,76.5,73.9,76.4z M74.2,76.1c-0.2-0.1-0.3-0.2-0.4-0.3c-0.1-0.1-0.2-0.1-0.2,0l1,0.8c0,0,0-0.1,0-0.2
-						C74.4,76.3,74.3,76.2,74.2,76.1z"/>
-				</g>
-			</g>
-		</g>
-	</g>
-	<g>
-		<g>
-			<g>
-				<g>
-					<g>
-						<path fill="#FFFFFF" d="M64,68.2c0.7,0.6,1.2,1.1,1.1,1.3c-0.1,0.2-0.8-0.2-1.6-0.7c-0.7-0.6-1.2-1.1-1.1-1.3
-							C62.5,67.3,63.2,67.6,64,68.2 M64,68.1c-0.8-0.6-1.6-1-1.8-0.8c-0.1,0.2,0.4,0.8,1.2,1.5c0.8,0.6,1.6,1,1.8,0.8
-							C65.4,69.4,64.8,68.8,64,68.1L64,68.1z"/>
-					</g>
-				</g>
-			</g>
-		</g>
-		<g>
-			<g>
-				<g>
-					<g>
-						
-							<rect x="61.8" y="68.9" transform="matrix(0.7954 0.6061 -0.6061 0.7954 54.7184 -24.2944)" fill="#FFFFFF" width="3.1" height="0"/>
-					</g>
-				</g>
-			</g>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<path fill="#373737" d="M84.1,79.9"/>
-		</g>
-	</g>
-</g>
-<g>
-	<defs>
-		<polygon id="SVGID_17_" points="105.1,60.7 84.1,79.9 47.3,57.3 72.5,59.3 		"/>
-	</defs>
-	<clipPath id="SVGID_2_">
-		<use xlink:href="#SVGID_17_"  overflow="visible"/>
-	</clipPath>
-	<g clip-path="url(#SVGID_2_)">
-		<g>
-			<g>
-				<g>
-					<g>
-						<path fill="#FFFFFF" d="M71.3,68.5l-1-0.7l-0.9,0.6l-0.2-0.1l2.6-1.6l0.1,0.1l-0.8,2.9L71,69.5L71.3,68.5z M70.5,67.8l0.8,0.6
-							l0.3-1c0-0.1,0.1-0.2,0.1-0.3c-0.1,0.1-0.2,0.1-0.3,0.2L70.5,67.8z"/>
-					</g>
-				</g>
-			</g>
-			<g>
-				<g>
-					<g>
-						<path fill="#FFFFFF" d="M73.5,68.6c0.1,0.1,0.1,0.1,0.2,0.2l-0.1,0.1c-0.1-0.1-0.1-0.1-0.2-0.2c-0.1-0.1-0.3-0.1-0.5-0.1
-							c-0.2,0.1-0.3,0.2-0.5,0.4L71.7,70l-0.2-0.1l1.2-1.7l0.1,0.1l-0.2,0.3l0,0c0.2-0.1,0.3-0.1,0.4-0.1
-							C73.2,68.5,73.4,68.6,73.5,68.6z"/>
-					</g>
-				</g>
-			</g>
-			<g>
-				<g>
-					<g>
-						<path fill="#FFFFFF" d="M73.3,71c0.1,0.1,0.2,0.1,0.3,0.2l-0.1,0.1c-0.1,0-0.2-0.1-0.3-0.1C73.1,71,73,70.9,73,70.7
-							c0-0.1,0-0.3,0.2-0.4l0.8-1.1L73.7,69l0.1-0.1l0.3,0.1l0.4-0.3l0.1,0.1l-0.3,0.4l0.5,0.4l-0.1,0.1l-0.5-0.4l-0.8,1.1
-							c-0.1,0.1-0.1,0.2-0.1,0.3C73.2,70.8,73.2,70.9,73.3,71z"/>
-					</g>
-				</g>
-			</g>
-			<g>
-				<g>
-					<g>
-						<path fill="#FFFFFF" d="M75.5,69.3c0.1-0.1,0.1-0.1,0.2-0.1c0,0,0,0.1,0,0.1c0,0,0,0.1-0.1,0.1c0,0-0.1,0.1-0.1,0.1
-							c0,0-0.1,0-0.1,0C75.4,69.5,75.4,69.4,75.5,69.3z M74,71.6l-0.2-0.1l1.2-1.7l0.2,0.1L74,71.6z"/>
-					</g>
-				</g>
-			</g>
-			<g>
-				<g>
-					<g>
-						<path fill="#FFFFFF" d="M76.4,70.9L76,70.6l-1.1,1.5l-0.2-0.1l1.1-1.5l-0.3-0.2l0.1-0.1l0.4,0.2l0.1-0.1
-							c0.2-0.2,0.3-0.3,0.5-0.4s0.3,0,0.5,0.1c0.1,0.1,0.2,0.1,0.3,0.2l-0.1,0.1c-0.1-0.1-0.1-0.2-0.2-0.2c-0.1-0.1-0.2-0.1-0.3-0.1
-							c-0.1,0-0.2,0.1-0.3,0.3l-0.1,0.2l0.4,0.3L76.4,70.9z"/>
-					</g>
-				</g>
-			</g>
-			<g>
-				<g>
-					<g>
-						<path fill="#FFFFFF" d="M76.7,73.4l0.2-0.3l0,0c-0.2,0-0.3,0.1-0.4,0c-0.1,0-0.3-0.1-0.4-0.2c-0.2-0.1-0.3-0.3-0.3-0.4
-							c0-0.1,0-0.3,0.1-0.4c0.1-0.2,0.3-0.2,0.5-0.2c0.2,0,0.4,0.1,0.7,0.3l0.3,0.2l0.1-0.1c0.1-0.2,0.2-0.3,0.2-0.4
-							c0-0.1-0.1-0.2-0.2-0.3c-0.2-0.1-0.4-0.2-0.6-0.2l0-0.2c0.3,0,0.5,0.1,0.7,0.3c0.2,0.1,0.3,0.3,0.3,0.4c0,0.2,0,0.3-0.2,0.5
-							l-0.8,1.1L76.7,73.4z M76.1,72.9c0.2,0.1,0.4,0.2,0.6,0.1c0.2,0,0.3-0.1,0.5-0.3l0.1-0.2l-0.3-0.2c-0.3-0.2-0.5-0.2-0.6-0.2
-							c-0.2,0-0.3,0.1-0.4,0.2c-0.1,0.1-0.1,0.2-0.1,0.3C75.9,72.7,76,72.8,76.1,72.9z"/>
-					</g>
-				</g>
-			</g>
-			<g>
-				<g>
-					<g>
-						<path fill="#FFFFFF" d="M78,74.4c-0.2-0.2-0.4-0.4-0.4-0.6c0-0.2,0.1-0.5,0.3-0.8c0.2-0.3,0.4-0.4,0.7-0.5
-							c0.3-0.1,0.5,0,0.8,0.2c0.2,0.1,0.3,0.2,0.4,0.4l-0.1,0.1c-0.1-0.2-0.2-0.3-0.3-0.3c-0.2-0.1-0.4-0.2-0.6-0.1
-							s-0.4,0.2-0.6,0.4c-0.2,0.2-0.2,0.4-0.2,0.6c0,0.2,0.1,0.4,0.3,0.5c0.2,0.1,0.3,0.2,0.5,0.2l-0.1,0.1
-							C78.4,74.6,78.2,74.5,78,74.4z"/>
-					</g>
-				</g>
-			</g>
-			<g>
-				<g>
-					<g>
-						<path fill="#FFFFFF" d="M79.4,75.2c0.1,0.1,0.2,0.1,0.3,0.2l-0.1,0.1c-0.1,0-0.2-0.1-0.3-0.1c-0.2-0.1-0.2-0.2-0.3-0.4
-							c0-0.1,0-0.3,0.2-0.4l0.8-1.1l-0.3-0.2l0.1-0.1l0.3,0.1l0.4-0.3l0.1,0.1l-0.3,0.4l0.5,0.4l-0.1,0.1l-0.5-0.4l-0.8,1.1
-							c-0.1,0.1-0.1,0.2-0.1,0.3S79.3,75.1,79.4,75.2z"/>
-					</g>
-				</g>
-			</g>
-			<g>
-				<g>
-					<g>
-						<path fill="#FFFFFF" d="M81.4,76c-0.1,0.2-0.3,0.2-0.4,0.2c-0.2,0-0.4-0.1-0.6-0.2c-0.2-0.2-0.4-0.3-0.5-0.5l0.1-0.2
-							c0.1,0.2,0.3,0.4,0.5,0.5c0.2,0.1,0.3,0.2,0.5,0.2c0.1,0,0.2,0,0.3-0.1c0.1-0.1,0.1-0.2,0.1-0.3c0-0.1-0.1-0.2-0.2-0.4
-							c-0.1-0.2-0.2-0.3-0.2-0.4c0-0.1-0.1-0.2,0-0.3c0-0.1,0-0.2,0.1-0.2c0.1-0.1,0.2-0.2,0.4-0.2c0.2,0,0.3,0.1,0.5,0.2
-							c0.2,0.1,0.3,0.3,0.5,0.5l-0.2,0.1c-0.1-0.2-0.3-0.3-0.4-0.4c-0.1-0.1-0.3-0.2-0.4-0.2c-0.1,0-0.2,0-0.3,0.1
-							c-0.1,0.1-0.1,0.2-0.1,0.3c0,0.1,0.1,0.2,0.2,0.4c0.1,0.2,0.2,0.3,0.2,0.4c0,0.1,0.1,0.2,0.1,0.3C81.5,75.9,81.5,75.9,81.4,76
-							z"/>
-					</g>
-				</g>
-			</g>
-		</g>
-		<g>
-			<g>
-				<g>
-					<g>
-						<g>
-							<g>
-								<g>
-									
-										<rect x="66.4" y="67.6" transform="matrix(0.1684 0.9857 -0.9857 0.1684 122.4587 -9.7462)" fill="#FFFFFF" width="1.2" height="0.2"/>
-								</g>
-							</g>
-						</g>
-					</g>
-				</g>
-				<g>
-					<g>
-						<g>
-							<g>
-								<g>
-									<path fill="#FFFFFF" d="M66.3,67.1C66.1,67,66,66.8,66,66.6c0-0.2,0-0.4,0.1-0.6c0.1-0.2,0.3-0.3,0.5-0.3
-										c0.4-0.1,0.9,0.2,1,0.7c0,0.2,0,0.4-0.1,0.6c-0.1,0.2-0.3,0.3-0.5,0.3C66.7,67.3,66.5,67.2,66.3,67.1z M67.1,66
-										c-0.1-0.1-0.3-0.1-0.4-0.1c-0.2,0-0.3,0.1-0.4,0.2c-0.1,0.1-0.1,0.3-0.1,0.4c0.1,0.3,0.4,0.5,0.7,0.5
-										c0.2,0,0.3-0.1,0.4-0.2s0.1-0.3,0.1-0.4C67.3,66.2,67.3,66.1,67.1,66z"/>
-								</g>
-							</g>
-						</g>
-					</g>
-				</g>
-			</g>
-			<g>
-				<g>
-					<g>
-						<g>
-							<g>
-								<g>
-									<polygon fill="#FFFFFF" points="65.1,67.1 63.6,66 65.9,62.8 67.9,62.5 70.2,64.1 68.6,66.4 68.4,66.2 69.9,64.2 
-										67.9,62.8 66.1,63 63.9,66 65.3,66.9 									"/>
-								</g>
-							</g>
-						</g>
-					</g>
-				</g>
-				<g>
-					<g>
-						<g>
-							<g>
-								<g>
-									<polygon fill="#FFFFFF" points="67.1,64 66,63.2 66.1,63 67.1,63.7 67.8,62.7 68,62.9 									"/>
-								</g>
-							</g>
-						</g>
-					</g>
-				</g>
-			</g>
-		</g>
-	</g>
-	<g clip-path="url(#SVGID_2_)">
-		<g>
-			<g>
-				<g>
-					<g>
-						<path fill="#FFFFFF" d="M79,64.2l-1.1-0.6l-0.9,0.7l-0.2-0.1l2.7-2l0.1,0.1L79,65.4l-0.2-0.1L79,64.2z M78,63.4l1,0.5l0.2-1.1
-							c0-0.1,0-0.2,0.1-0.4c-0.1,0.1-0.2,0.2-0.3,0.2L78,63.4z"/>
-					</g>
-				</g>
-			</g>
-			<g>
-				<g>
-					<g>
-						<path fill="#FFFFFF" d="M81.3,64c0.1,0.1,0.3,0.2,0.3,0.3c0.1,0.1,0.1,0.3,0.1,0.4l0,0c0.1-0.2,0.2-0.3,0.3-0.4l0.4-0.7
-							l0.2,0.1l-1.7,2.8l-0.1-0.1l0.1-0.3l0,0c-0.3,0.1-0.6,0.1-0.9,0c-0.3-0.2-0.4-0.4-0.5-0.6c0-0.2,0-0.5,0.2-0.9
-							c0.2-0.3,0.4-0.6,0.7-0.6C80.7,63.8,81,63.9,81.3,64z M81.2,64.2c-0.2-0.1-0.4-0.1-0.6-0.1c-0.2,0.1-0.4,0.3-0.6,0.6
-							c-0.3,0.5-0.3,0.9,0.2,1.2c0.2,0.1,0.4,0.2,0.6,0.1c0.2-0.1,0.4-0.2,0.5-0.5l0,0c0.2-0.3,0.3-0.5,0.2-0.7
-							C81.5,64.5,81.4,64.3,81.2,64.2z"/>
-					</g>
-				</g>
-			</g>
-			<g>
-				<g>
-					<g>
-						<path fill="#FFFFFF" d="M84.1,68.2l0.8-1.3c0.1-0.2,0.2-0.3,0.1-0.5c0-0.1-0.1-0.2-0.3-0.3c-0.2-0.1-0.4-0.1-0.6-0.1
-							c-0.2,0.1-0.3,0.2-0.5,0.4L83,67.7l-0.2-0.1l0.8-1.3c0.2-0.3,0.1-0.6-0.2-0.7c-0.2-0.1-0.4-0.1-0.6-0.1
-							c-0.2,0.1-0.3,0.2-0.5,0.5L81.8,67l-0.2-0.1l1.2-1.9l0.2,0.1l-0.1,0.3l0,0c0.1-0.1,0.2-0.1,0.4-0.1c0.1,0,0.3,0,0.4,0.1
-							c0.3,0.2,0.5,0.4,0.4,0.7l0,0c0.1-0.1,0.3-0.1,0.4-0.1c0.1,0,0.3,0,0.4,0.1c0.2,0.1,0.3,0.3,0.4,0.4c0,0.2,0,0.4-0.2,0.6
-							l-0.8,1.3L84.1,68.2z"/>
-					</g>
-				</g>
-			</g>
-			<g>
-				<g>
-					<g>
-						<path fill="#FFFFFF" d="M86.4,66.2c0.1-0.1,0.1-0.1,0.2-0.1c0,0,0.1,0.1,0.1,0.1c0,0,0,0.1,0,0.1c0,0.1-0.1,0.1-0.1,0.1
-							c0,0-0.1,0-0.1,0C86.3,66.4,86.3,66.3,86.4,66.2z M85.1,68.8l-0.2-0.1l1.2-1.9l0.2,0.1L85.1,68.8z"/>
-					</g>
-				</g>
-			</g>
-			<g>
-				<g>
-					<g>
-						<path fill="#FFFFFF" d="M87.2,70l0.8-1.3c0.1-0.2,0.2-0.4,0.1-0.5c0-0.1-0.1-0.3-0.3-0.4c-0.2-0.1-0.5-0.2-0.6-0.1
-							c-0.2,0.1-0.4,0.2-0.5,0.5L86,69.3l-0.2-0.1l1.2-1.9l0.2,0.1L87,67.6l0,0c0.3-0.1,0.5-0.1,0.9,0.1c0.5,0.3,0.5,0.6,0.3,1.1
-							l-0.8,1.3L87.2,70z"/>
-					</g>
-				</g>
-			</g>
-		</g>
-		<g>
-			<g>
-				<g>
-					<g>
-						<path fill="#FFFFFF" d="M73.3,57.2c-1.3-0.8-3.1-0.3-3.9,1c-0.8,1.3-0.3,3,1,3.7c1.3,0.8,3.1,0.3,3.9-1S74.7,58,73.3,57.2z
-							 M73.2,57.4c1.2,0.7,1.7,2.2,0.9,3.4c-0.3,0.5-0.8,0.9-1.3,1.1c0-0.6-0.1-1.1-0.5-1.5c0.3-0.1,0.6-0.3,0.8-0.6
-							c0.4-0.6,0.1-1.4-0.5-1.7c-0.6-0.3-1.4-0.1-1.8,0.5c-0.2,0.3-0.2,0.7-0.1,1c-0.5-0.1-1.1,0.1-1.5,0.4c-0.1-0.5,0-1.1,0.3-1.6
-							C70.4,57.2,72,56.8,73.2,57.4z M72.3,60.2c-0.1,0-0.3,0-0.4,0c-0.1,0-0.2-0.1-0.3-0.1c-0.1,0-0.1-0.1-0.2-0.2
-							c-0.1-0.1-0.2-0.2-0.2-0.3c-0.1-0.3-0.1-0.6,0-0.9c0.3-0.5,0.9-0.7,1.5-0.4s0.7,0.9,0.4,1.4C72.9,60,72.6,60.2,72.3,60.2z
-							 M70.6,61.8c-0.6-0.4-1.1-1-1.2-1.6c0.5-0.3,1.1-0.5,1.6-0.4c0.1,0.2,0.3,0.3,0.5,0.5c0.2,0.1,0.5,0.2,0.7,0.2
-							c0.4,0.4,0.6,1,0.5,1.6C72,62.2,71.3,62.1,70.6,61.8z"/>
-					</g>
-				</g>
-			</g>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon fill="#FFFFFF" points="162.5,59.6 157.2,76 178.7,68 185.5,50.3 180.4,46.8 172.8,56.8 			"/>
-		</g>
-	</g>
-	<g>
-		<g>
-			<path d="M156.4,76.8l5.7-17.6l10.4-2.8l7.8-10.3l5.7,3.9l-7,18.3L156.4,76.8z M162.9,60l-4.9,15.2l20.4-7.6l6.6-17.1l-4.4-3
-				l-7.5,9.8L162.9,60z"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon points="160,68.2 159.7,67.3 176,62.3 183.8,49.1 184.6,49.6 176.6,63.1 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<rect x="163.7" y="63" transform="matrix(0.8683 0.4961 -0.4961 0.8683 53.2239 -73.5911)" width="2.9" height="1"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<rect x="164.7" y="61.5" transform="matrix(0.8206 0.5715 -0.5715 0.8206 65.8852 -83.029)" width="1" height="3.9"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<path d="M170.7,63.4c-0.1,0.1-0.4,0.4-0.8,0.6c-1,0.4-1.9,0.1-2.3-0.9c-0.4-0.9-0.1-1.9,0.9-2.4c0.3-0.1,0.7-0.2,0.9-0.2l0.1,0.5
-				c-0.2,0-0.4,0-0.7,0.1c-0.7,0.3-0.9,1-0.6,1.6c0.3,0.7,1,0.9,1.6,0.7c0.3-0.1,0.5-0.3,0.6-0.5L170.7,63.4z"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<path d="M169.2,58.9l0.6-0.2l2.1,4.5l-0.6,0.2L169.2,58.9z"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<path d="M174.9,60.1c0.5,1.1-0.1,2-0.8,2.3c-0.8,0.4-1.8,0.1-2.2-0.9c-0.5-1,0-1.9,0.8-2.3C173.5,58.8,174.4,59.1,174.9,60.1z
-				 M172.4,61.2c0.3,0.6,0.9,1,1.5,0.7c0.6-0.3,0.7-1,0.4-1.6c-0.2-0.5-0.8-1.1-1.5-0.8C172.1,59.9,172.1,60.7,172.4,61.2z"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<path d="M176.6,59.3c0.2-0.1,0.4-0.4,0.5-0.6c0.1-0.4,0-0.7-0.2-0.7c-0.3-0.1-0.5,0-0.8,0.4c-0.4,0.5-0.8,0.6-1.2,0.5
-				c-0.5-0.2-0.8-0.7-0.5-1.3c0.1-0.3,0.3-0.5,0.5-0.7l0.4,0.3c-0.1,0.1-0.3,0.3-0.4,0.6c-0.1,0.3,0,0.6,0.2,0.6
-				c0.3,0.1,0.4,0,0.7-0.4c0.4-0.4,0.8-0.6,1.2-0.5c0.5,0.2,0.8,0.7,0.5,1.4c-0.1,0.3-0.3,0.6-0.5,0.8L176.6,59.3z"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<path d="M177.3,55.9c0.7,0.4,1.2,0.1,1.5-0.4c0.2-0.3,0.3-0.6,0.3-0.8l0.4,0.1c0,0.2-0.1,0.5-0.3,1c-0.5,0.8-1.3,1-2.1,0.5
-				c-0.8-0.5-1.2-1.3-0.7-2c0.5-0.8,1.4-0.6,1.9-0.4c0.1,0.1,0.2,0.1,0.2,0.1L177.3,55.9z M177.8,54.4c-0.3-0.2-0.9-0.3-1.2,0.2
-				c-0.3,0.5,0,0.9,0.4,1.2L177.8,54.4z"/>
-		</g>
-	</g>
-</g>
-<g opacity="0.23">
-	<g>
-		<g>
-			<polygon points="169.1,49.6 178.7,68 185.5,50.3 198.3,18.1 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon fill="#FFFFFF" points="165,44.7 164.3,50.9 169.1,49.6 177.9,39.6 			"/>
-		</g>
-	</g>
-	<g>
-		<g>
-			<path d="M163.7,51.4l0.9-7.1l15-6L169.3,50L163.7,51.4z M165.5,45l-0.6,5.3l3.9-1.2l7.4-8.4L165.5,45z"/>
-		</g>
-	</g>
-</g>
-<g opacity="0.42">
-	<g>
-		<g>
-			<polygon fill="#757776" points="165.5,45 164.8,50.5 168.9,49.2 173.7,43.9 170.2,43.1 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon points="165.1,47.4 165.1,46.4 173.4,44.3 173.7,45.2 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon fill="#373737" points="113.2,44.5 128.4,60 123.7,61.5 105.4,60.4 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon points="107.5,94.9 87.7,89.3 47,57.7 47.6,56.9 88.2,88.4 107.8,94 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon points="103.8,93.9 47.7,57.2 110.5,50.2 110.6,51.2 50.5,57.8 105,93.5 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon points="154.9,40 154.5,39.1 198.4,17.6 198,18.8 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<path fill="#FFFFFF" d="M18.2,114.3c-0.3-2.6,4.7-2.2,4.1-0.1c-0.5,2-3.8,1.2-4.7,0c-1.2,1.4-2.1,3.3-3,4.9
-				c-0.4,0.7-0.7,2.2-0.9,2.7"/>
-		</g>
-	</g>
-	<g>
-		<g>
-			<path d="M14.3,121.7l-1-0.1c0.1-0.2,0.2-0.6,0.3-1c0.2-0.7,0.4-1.2,0.6-1.7c0.1-0.3,0.3-0.8,0.5-1.1c0.8-1.4,1.5-2.9,2.5-4.1
-				l0.4-0.5l0.1,0.2c0.1-0.5,0.5-0.9,0.9-1.1c1-0.6,2.6-0.5,3.5,0.2c0.6,0.4,0.8,1.1,0.6,1.7c-0.2,0.8-0.8,1.3-1.7,1.5
-				c-1.1,0.2-2.6-0.2-3.4-1c-0.8,1-1.4,2.3-2.1,3.5c-0.2,0.3-0.3,0.7-0.5,1c-0.2,0.4-0.4,1.1-0.5,1.6
-				C14.5,121.3,14.4,121.5,14.3,121.7z M18.5,114.2c0.6,0.4,1.7,0.7,2.4,0.6c0.5-0.1,0.8-0.4,0.9-0.8c0-0.2,0.1-0.4-0.3-0.7
-				c-0.6-0.4-1.7-0.5-2.4-0.1c-0.4,0.2-0.6,0.6-0.5,1L18.5,114.2z"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<path d="M19.8,113.7c0-1.9-0.1-2.4-0.2-2.8c-0.1-0.5-0.2-1-0.1-2.9c0.1-4.3-0.1-8.8-0.2-13.1c-0.1-4.2-0.3-8.1-0.2-11.8l1,0
-				c-0.1,3.7,0.1,7.6,0.2,11.7c0.2,4.3,0.3,8.8,0.2,13.1c0,1.8,0,2.3,0.1,2.8c0.1,0.5,0.2,1.1,0.2,3L19.8,113.7z"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<path d="M25.9,122.7l-0.9-0.4c0.4-0.9,0.1-2.7-0.2-4c-0.3-1.1-0.6-1.8-1-2.5c-0.2-0.3-0.6-0.7-1-1c-0.5-0.5-1-1-1.2-1.4l0.9-0.3
-				c0.1,0.3,0.5,0.7,0.9,1.1c0.4,0.4,0.8,0.8,1.1,1.2c0.5,0.7,0.8,1.6,1.2,2.7C25.9,118.8,26.5,121.3,25.9,122.7z"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<path d="M22.5,124.3c-0.8,0-1.8-0.1-2.9-0.5c-0.4-0.1-0.9-0.4-1.4-0.7c-1-0.6-2.3-1.3-4.2-1.4v-0.9c2.1,0,3.6,0.9,4.7,1.5
-				c0.5,0.3,0.8,0.5,1.2,0.6c3.4,1.1,4.9-0.1,5.1-0.6l0.9,0.4C25.6,123.4,24.5,124.3,22.5,124.3z"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<path d="M27.5,132c-0.4,0-0.7,0-1.1,0l0.1-1c1.3,0.1,2.8,0,4.3-0.2l0.1,1C29.7,131.9,28.6,132,27.5,132z M37.6,129.8l-0.4-0.9
-				c1.2-0.6,1.9-1.3,1.9-1.8c0-0.6-0.8-1.2-2.1-1.8l0.4-0.9c1.8,0.7,2.7,1.6,2.7,2.6C40,128.1,39.2,129,37.6,129.8z"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<path d="M1.8,122.7c-0.5-0.3-1-0.7-1.3-1.1l0.7-0.6c0.3,0.3,0.6,0.6,1.1,0.9L1.8,122.7z M3.2,116.3l-0.5-0.8
-				c1.8-1.2,4.2-2.1,6.4-2.5l0.2,1C7.1,114.3,4.9,115.2,3.2,116.3z"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<polygon points="106.2,60.5 105.2,60.4 133.9,1.4 161,51.3 160.1,51.7 134,3.5 			"/>
-		</g>
-	</g>
-</g>
-<g opacity="0.72">
-	<g>
-		<polygon fill="#FFFFFF" points="92,84.8 83.1,85.1 88,88.9 107.6,94.5 		"/>
-	</g>
-	<g>
-		<path d="M107.5,94.9l-19.8-5.7l-4.9-3.8l0.3-0.9l8.8-0.3l0.3,0.1l15.7,9.7L107.5,94.9z M88.2,88.4l16.1,4.6l-12.5-7.7l-7.3,0.2
-			L88.2,88.4z"/>
-	</g>
-</g>
-<g>
-	<g>
-		<path d="M47.3,56.8"/>
-	</g>
-</g>
-</svg>
diff --git a/web/angular-web/src/main/webapp/app/assets/images/404_image.svg b/web/angular-web/src/main/webapp/app/assets/images/404_image.svg
deleted file mode 100644
index f8a0de4..0000000
--- a/web/angular-web/src/main/webapp/app/assets/images/404_image.svg
+++ /dev/null
@@ -1,823 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 352 185.3" enable-background="new 0 0 352 185.3" xml:space="preserve">
-<g>
-	<g>
-		<path fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="7" d="M277.1,98.6"/>
-	</g>
-</g>
-<g>
-	<g>
-		<polygon fill="#E2E2E2" points="272,120.3 293.3,115.4 331.8,169.2 		"/>
-	</g>
-</g>
-<g>
-	<g>
-		<polygon fill="#C2C4C4" points="270.4,129.9 271.4,121 340.2,175.9 		"/>
-	</g>
-</g>
-<g>
-	<g>
-		<polygon fill="#B2B3B3" points="248.6,140.9 246.6,151.9 341.8,180.3 		"/>
-	</g>
-</g>
-<g>
-	<g>
-		<path fill="#2A2B2B" d="M348.6,183.2c-0.1,0-0.1,0-0.2,0l-144.3-60.3c-0.2-0.1-0.3-0.3-0.3-0.5c0-0.2,0.2-0.4,0.4-0.4l42.8-8.2
-			c0.1,0,0.3,0,0.4,0.1l101.5,68.6c0.2,0.1,0.3,0.4,0.2,0.7C348.9,183.1,348.8,183.2,348.6,183.2z M206,122.5l138.1,57.8L247,114.7
-			L206,122.5z"/>
-	</g>
-</g>
-<g>
-	<g>
-		<path fill="#2A2B2B" d="M348.6,183.2c-0.1,0-0.2,0-0.3-0.1l-89.5-72.2c-0.1-0.1-0.2-0.3-0.2-0.5s0.2-0.3,0.4-0.4l31.6-7.9
-			c0.2,0,0.4,0,0.5,0.2l57.9,80.1c0.1,0.2,0.1,0.5-0.1,0.7C348.8,183.1,348.7,183.2,348.6,183.2z M260.2,110.7l85.8,69.2l-55.5-76.8
-			L260.2,110.7z"/>
-	</g>
-</g>
-<g>
-	<g>
-		<path fill="#2A2B2B" d="M348.6,183.2c-0.1,0-0.2,0-0.3-0.1l-90.6-61.2c-0.2-0.1-0.2-0.3-0.2-0.5l1.1-11c0-0.2,0.1-0.3,0.3-0.4
-			c0.2-0.1,0.4,0,0.5,0.1l89.5,72.2c0.2,0.2,0.2,0.5,0.1,0.7C348.9,183.1,348.7,183.2,348.6,183.2z M258.5,121.2l80.6,54.5
-			l-79.6-64.2L258.5,121.2z"/>
-	</g>
-</g>
-<g>
-	<g>
-		<path fill="#2A2B2B" d="M348.6,183.2c0,0-0.1,0-0.1,0l-102-30.8c-0.2-0.1-0.4-0.3-0.3-0.6l2-11c0-0.1,0.1-0.3,0.3-0.3
-			c0.1-0.1,0.3-0.1,0.4,0l100,41.8c0.2,0.1,0.4,0.4,0.3,0.6C349,183,348.8,183.2,348.6,183.2z M247.2,151.5l92.3,27.9L249,141.6
-			L247.2,151.5z"/>
-	</g>
-</g>
-<g opacity="0.89">
-	<g>
-		<path fill="#2A2B2B" d="M235.3,135.3c8.7-2.9,19.9-6.5,28.6-9.5l-16.8-11.7l-42,8L235.3,135.3z"/>
-	</g>
-</g>
-<g opacity="0.89">
-	<g>
-		<polygon fill="#2A2B2B" points="271.4,120.4 298,114.5 290.7,102.5 259.1,110.5 		"/>
-	</g>
-</g>
-<g>
-	<g>
-		<polygon fill="#42A147" points="284.8,104.4 330.7,167.6 346.7,180.5 290.8,103.1 		"/>
-	</g>
-</g>
-<g>
-	<g>
-		<polygon fill="#2A2B2B" points="271.4,120.4 270.4,129.9 257.9,121.4 259.1,110.5 		"/>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M266.1,120.5l0.5,0.3c0.2,0.1,0.4,0.3,0.4,0.4c0.1,0.1,0,0.3-0.1,0.4c-0.1,0.1-0.2,0.2-0.3,0.2
-					c-0.1,0-0.2,0-0.4-0.1l0,0c0.1,0.1,0.2,0.2,0.2,0.3c0,0.1,0,0.2-0.1,0.3c-0.1,0.2-0.2,0.3-0.4,0.3c-0.2,0-0.3,0-0.5-0.2
-					l-0.5-0.4L266.1,120.5z M265.8,121.4l0.4,0.3c0.2,0.1,0.3,0.2,0.4,0.2c0.1,0,0.2-0.1,0.3-0.2c0.1-0.1,0.1-0.2,0-0.3
-					c0-0.1-0.2-0.2-0.3-0.3l-0.4-0.2L265.8,121.4z M265.7,121.5l-0.5,0.8l0.4,0.3c0.3,0.2,0.6,0.2,0.8-0.1c0.2-0.2,0.1-0.5-0.3-0.7
-					L265.7,121.5z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M267.5,122l-0.6,0.8c-0.1,0.1-0.1,0.2-0.1,0.3c0,0.1,0.1,0.2,0.2,0.3c0.2,0.1,0.3,0.1,0.4,0.1
-					c0.1,0,0.2-0.1,0.4-0.3l0.5-0.7l0.1,0.1l-0.9,1.3l-0.1-0.1l0.1-0.2l0,0c-0.2,0.1-0.4,0-0.6-0.1c-0.3-0.2-0.3-0.5-0.1-0.8
-					l0.6-0.9L267.5,122z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M269,122.6c0.1-0.1,0.1-0.1,0.2-0.1c0,0,0,0,0,0.1s0,0.1,0,0.1c0,0,0,0.1-0.1,0.1c0,0-0.1,0-0.1,0
-					C269,122.7,269,122.6,269,122.6z M268.1,124.3l-0.1-0.1l0.9-1.3l0.1,0.1L268.1,124.3z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M268.6,124.7l-0.1-0.1l1.2-1.9l0.1,0.1L268.6,124.7z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M270.4,124c0.1,0.1,0.2,0.1,0.2,0.2c0,0.1,0.1,0.2,0.1,0.3l0,0c0.1-0.1,0.1-0.2,0.2-0.3l0.3-0.5l0.1,0.1
-					l-1.2,1.9l-0.1-0.1l0.1-0.2l0,0c-0.2,0.1-0.4,0.1-0.6-0.1c-0.2-0.1-0.3-0.3-0.3-0.4s0-0.4,0.2-0.6c0.2-0.2,0.3-0.4,0.5-0.4
-					C270.1,123.8,270.2,123.9,270.4,124z M270.3,124.1c-0.1-0.1-0.3-0.1-0.4-0.1c-0.1,0.1-0.3,0.2-0.4,0.4c-0.2,0.4-0.2,0.7,0.1,0.8
-					c0.1,0.1,0.3,0.1,0.4,0.1c0.1,0,0.3-0.2,0.4-0.4l0,0c0.1-0.2,0.2-0.4,0.2-0.5C270.6,124.3,270.5,124.2,270.3,124.1z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M271.6,126.2c-0.1,0.1-0.2,0.2-0.3,0.2c-0.1,0-0.3,0-0.4-0.2c-0.2-0.1-0.3-0.2-0.4-0.4l0.1-0.1
-					c0.1,0.2,0.2,0.3,0.4,0.4c0.1,0.1,0.2,0.1,0.3,0.1c0.1,0,0.2,0,0.2-0.1c0-0.1,0.1-0.1,0-0.2c0-0.1-0.1-0.2-0.2-0.3
-					c-0.1-0.1-0.2-0.2-0.2-0.3c0-0.1,0-0.1,0-0.2c0-0.1,0-0.1,0.1-0.2c0.1-0.1,0.2-0.1,0.3-0.1c0.1,0,0.3,0,0.4,0.1
-					c0.1,0.1,0.3,0.2,0.3,0.3l-0.1,0.1c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1-0.1-0.2-0.1-0.3-0.1s-0.1,0-0.2,0.1c0,0.1-0.1,0.1,0,0.2
-					c0,0.1,0.1,0.2,0.2,0.3c0.1,0.1,0.1,0.2,0.2,0.3c0,0.1,0,0.1,0,0.2C271.6,126,271.6,126.1,271.6,126.2z"/>
-			</g>
-		</g>
-	</g>
-	<g>
-		<g>
-			<g>
-				<g>
-					<path fill="#FFFFFF" d="M260.4,120.6c-0.2-0.2-0.3-0.5-0.1-0.7c-0.1-0.1-0.1-0.2-0.2-0.3c-0.3,0-0.5-0.1-0.6-0.4
-						c0-0.1,0-0.3,0.1-0.4c0.1-0.1,0.2-0.2,0.3-0.2c0-0.1,0-0.2,0.1-0.3c-0.2-0.2-0.3-0.5-0.1-0.7s0.5-0.3,0.7-0.1
-						c0.1-0.1,0.2-0.1,0.3-0.2c0-0.1,0-0.3,0.1-0.4c0.1-0.1,0.2-0.2,0.3-0.2c0.3-0.1,0.5,0.1,0.6,0.4c0.1,0,0.2,0,0.3,0.1
-						c0.2-0.2,0.5-0.3,0.7-0.1c0.2,0.2,0.3,0.5,0.1,0.7c0.1,0.1,0.1,0.2,0.2,0.3c0.3,0,0.5,0.1,0.6,0.4c0,0.1,0,0.3-0.1,0.4
-						c-0.1,0.1-0.2,0.2-0.3,0.2c0,0.1,0,0.2-0.1,0.3c0.2,0.2,0.3,0.5,0.1,0.7c-0.2,0.2-0.5,0.3-0.7,0.1c-0.1,0.1-0.2,0.1-0.3,0.2
-						c0,0.1,0,0.3-0.1,0.4c-0.1,0.1-0.2,0.2-0.3,0.2c-0.3,0.1-0.5-0.1-0.6-0.4c-0.1,0-0.2,0-0.3-0.1
-						C261,120.7,260.7,120.8,260.4,120.6z M260.2,119.5L260.2,119.5c0.1,0.2,0.2,0.3,0.3,0.4l0.1,0.1l-0.1,0.1c0,0,0,0,0,0
-						c-0.1,0.2-0.1,0.4,0.1,0.5c0.2,0.1,0.4,0.1,0.5-0.1c0,0,0,0,0,0l0-0.1l0.1,0c0.1,0.1,0.3,0.1,0.4,0.1l0.1,0l0,0.1c0,0,0,0,0,0
-						c0,0.2,0.2,0.3,0.4,0.3c0.1,0,0.2-0.1,0.2-0.1c0-0.1,0.1-0.2,0-0.2c0,0,0,0,0,0l0-0.1l0.1,0c0.1-0.1,0.3-0.2,0.4-0.3l0.1-0.1
-						l0.1,0.1c0,0,0,0,0,0c0.2,0.1,0.4,0.1,0.5-0.1c0.1-0.2,0.1-0.4-0.1-0.5l-0.1,0l0-0.1c0.1-0.1,0.1-0.3,0.1-0.4l0-0.1l0.1,0
-						c0,0,0,0,0,0c0.1,0,0.2-0.1,0.2-0.1c0-0.1,0.1-0.2,0-0.2c0-0.2-0.2-0.3-0.4-0.3c0,0,0,0,0,0l-0.1,0l0-0.1
-						c-0.1-0.1-0.2-0.3-0.3-0.4l-0.1-0.1l0.1-0.1c0,0,0,0,0,0c0.1-0.2,0.1-0.4-0.1-0.5c-0.2-0.1-0.4-0.1-0.5,0.1c0,0,0,0,0,0l0,0.1
-						l-0.1,0c-0.1-0.1-0.3-0.1-0.4-0.1l-0.1,0l0-0.1c0,0,0,0,0,0c0-0.2-0.2-0.3-0.4-0.3c-0.1,0-0.2,0.1-0.2,0.1c0,0.1-0.1,0.2,0,0.2
-						c0,0,0,0,0,0l0,0.1l-0.1,0c-0.1,0.1-0.3,0.2-0.4,0.3l-0.1,0.1l-0.1-0.1c0,0,0,0,0,0c-0.2-0.1-0.4-0.1-0.5,0.1
-						c-0.1,0.2,0,0.4,0.1,0.5l0.1,0l0,0.1c-0.1,0.1-0.1,0.3-0.1,0.4l0,0.1l-0.1,0c0,0,0,0,0,0c-0.1,0-0.2,0.1-0.2,0.1
-						c0,0.1-0.1,0.2,0,0.2c0,0.2,0.2,0.3,0.4,0.3C260.1,119.5,260.1,119.5,260.2,119.5L260.2,119.5z"/>
-				</g>
-			</g>
-		</g>
-		<g>
-			<g>
-				<g>
-					<path fill="#FFFFFF" d="M261.3,119.4c-0.3-0.2-0.4-0.6-0.2-0.9c0.2-0.3,0.6-0.4,0.9-0.2c0.3,0.2,0.4,0.6,0.2,0.9
-						S261.6,119.6,261.3,119.4z M261.9,118.4c-0.2-0.1-0.5-0.1-0.7,0.1c-0.1,0.2-0.1,0.5,0.1,0.7c0.2,0.1,0.5,0.1,0.7-0.1
-						C262.2,118.9,262.1,118.6,261.9,118.4z"/>
-				</g>
-			</g>
-		</g>
-		<g>
-			<g>
-				<g>
-					<path fill="#FFFFFF" d="M261,119.9c-0.6-0.4-0.7-1.1-0.3-1.7c0.4-0.6,1.1-0.7,1.7-0.3c0.6,0.4,0.7,1.1,0.3,1.7
-						C262.3,120.1,261.5,120.2,261,119.9z M262.2,118c-0.5-0.3-1.1-0.2-1.5,0.3c-0.3,0.5-0.2,1.1,0.3,1.5c0.5,0.3,1.1,0.2,1.5-0.3
-						C262.8,118.9,262.7,118.3,262.2,118z"/>
-				</g>
-			</g>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M234.5,126.3l0.5,0.3c0.2,0.1,0.4,0.3,0.4,0.4c0.1,0.1,0,0.3-0.1,0.4c-0.1,0.1-0.2,0.2-0.3,0.2
-					c-0.1,0-0.2,0-0.4-0.1l0,0c0.1,0.1,0.2,0.2,0.2,0.3c0,0.1,0,0.2-0.1,0.3c-0.1,0.2-0.2,0.3-0.4,0.3c-0.2,0-0.3,0-0.5-0.2
-					l-0.5-0.4L234.5,126.3z M234.1,127.2l0.4,0.3c0.2,0.1,0.3,0.2,0.4,0.2c0.1,0,0.2-0.1,0.3-0.2c0.1-0.1,0.1-0.2,0-0.3
-					c0-0.1-0.2-0.2-0.3-0.3l-0.4-0.2L234.1,127.2z M234,127.3l-0.5,0.8l0.4,0.3c0.3,0.2,0.6,0.2,0.8-0.1c0.2-0.2,0.1-0.5-0.3-0.7
-					L234,127.3z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M235.8,127.8l-0.6,0.8c-0.1,0.1-0.1,0.2-0.1,0.3c0,0.1,0.1,0.2,0.2,0.3c0.2,0.1,0.3,0.1,0.4,0.1
-					c0.1,0,0.2-0.1,0.4-0.3l0.5-0.7l0.1,0.1l-0.9,1.3l-0.1-0.1l0.1-0.2l0,0c-0.2,0.1-0.4,0-0.6-0.1c-0.3-0.2-0.3-0.5-0.1-0.8
-					l0.6-0.9L235.8,127.8z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M237.3,128.4c0.1-0.1,0.1-0.1,0.2-0.1c0,0,0,0,0,0.1c0,0,0,0.1,0,0.1c0,0,0,0.1-0.1,0.1c0,0-0.1,0-0.1,0
-					C237.3,128.5,237.3,128.4,237.3,128.4z M236.4,130.1l-0.1-0.1l0.9-1.3l0.1,0.1L236.4,130.1z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M236.9,130.5l-0.1-0.1l1.2-1.9l0.1,0.1L236.9,130.5z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M238.7,129.8c0.1,0.1,0.2,0.1,0.2,0.2c0,0.1,0.1,0.2,0.1,0.3l0,0c0.1-0.1,0.1-0.2,0.2-0.3l0.3-0.5
-					l0.1,0.1l-1.2,1.9l-0.1-0.1l0.1-0.2l0,0c-0.2,0.1-0.4,0.1-0.6-0.1c-0.2-0.1-0.3-0.3-0.3-0.4c0-0.2,0-0.4,0.2-0.6
-					c0.2-0.2,0.3-0.4,0.5-0.4C238.4,129.6,238.5,129.6,238.7,129.8z M238.7,129.9c-0.1-0.1-0.3-0.1-0.4-0.1
-					c-0.1,0.1-0.3,0.2-0.4,0.4c-0.2,0.4-0.2,0.7,0.1,0.8c0.1,0.1,0.3,0.1,0.4,0.1c0.1,0,0.3-0.2,0.4-0.4l0,0
-					c0.1-0.2,0.2-0.4,0.2-0.5C238.9,130.1,238.8,130,238.7,129.9z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M239.9,131.9c-0.1,0.1-0.2,0.2-0.3,0.2c-0.1,0-0.3,0-0.4-0.2c-0.2-0.1-0.3-0.2-0.4-0.4l0.1-0.1
-					c0.1,0.2,0.2,0.3,0.4,0.4c0.1,0.1,0.2,0.1,0.3,0.1c0.1,0,0.2,0,0.2-0.1c0-0.1,0.1-0.1,0-0.2c0-0.1-0.1-0.2-0.2-0.3
-					c-0.1-0.1-0.2-0.2-0.2-0.3c0-0.1,0-0.1,0-0.2c0-0.1,0-0.1,0.1-0.2c0.1-0.1,0.2-0.1,0.3-0.1c0.1,0,0.3,0,0.4,0.1
-					c0.1,0.1,0.3,0.2,0.3,0.3l-0.1,0.1c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1-0.1-0.2-0.1-0.3-0.1c-0.1,0-0.1,0-0.2,0.1
-					c0,0.1-0.1,0.1,0,0.2c0,0.1,0.1,0.2,0.2,0.3c0.1,0.1,0.1,0.2,0.2,0.3c0,0.1,0,0.1,0,0.2C239.9,131.8,239.9,131.9,239.9,131.9z"
-					/>
-			</g>
-		</g>
-	</g>
-	<g>
-		<g>
-			<g>
-				<g>
-					<path fill="#FFFFFF" d="M228.8,126.4c-0.2-0.2-0.3-0.5-0.1-0.7c-0.1-0.1-0.1-0.2-0.2-0.3c-0.3,0-0.5-0.1-0.6-0.4
-						c0-0.1,0-0.3,0.1-0.4c0.1-0.1,0.2-0.2,0.3-0.2c0-0.1,0-0.2,0.1-0.3c-0.2-0.2-0.3-0.5-0.1-0.7c0.2-0.2,0.5-0.3,0.7-0.1
-						c0.1-0.1,0.2-0.1,0.3-0.2c0-0.1,0-0.3,0.1-0.4c0.1-0.1,0.2-0.2,0.3-0.2c0.3-0.1,0.5,0.1,0.6,0.4c0.1,0,0.2,0,0.3,0.1
-						c0.2-0.2,0.5-0.3,0.7-0.1c0.2,0.2,0.3,0.5,0.1,0.7c0.1,0.1,0.1,0.2,0.2,0.3c0.3,0,0.5,0.1,0.6,0.4c0,0.1,0,0.3-0.1,0.4
-						c-0.1,0.1-0.2,0.2-0.3,0.2c0,0.1,0,0.2-0.1,0.3c0.2,0.2,0.3,0.5,0.1,0.7c-0.2,0.2-0.5,0.3-0.7,0.1c-0.1,0.1-0.2,0.1-0.3,0.2
-						c0,0.1,0,0.3-0.1,0.4c-0.1,0.1-0.2,0.2-0.3,0.2c-0.3,0.1-0.5-0.1-0.6-0.4c-0.1,0-0.2,0-0.3-0.1
-						C229.3,126.5,229,126.6,228.8,126.4z M228.5,125.2L228.5,125.2c0.1,0.2,0.2,0.3,0.3,0.4l0.1,0.1l-0.1,0.1c0,0,0,0,0,0
-						c-0.1,0.2-0.1,0.4,0.1,0.5c0.2,0.1,0.4,0.1,0.5-0.1c0,0,0,0,0,0l0-0.1l0.1,0c0.1,0.1,0.3,0.1,0.4,0.1l0.1,0l0,0.1c0,0,0,0,0,0
-						c0,0.2,0.2,0.3,0.4,0.3c0.1,0,0.2-0.1,0.2-0.1c0-0.1,0.1-0.2,0-0.2c0,0,0,0,0,0l0-0.1l0.1,0c0.1-0.1,0.3-0.2,0.4-0.3l0.1-0.1
-						l0.1,0.1c0,0,0,0,0,0c0.2,0.1,0.4,0.1,0.5-0.1c0.1-0.2,0.1-0.4-0.1-0.5l-0.1,0l0-0.1c0.1-0.1,0.1-0.3,0.1-0.4l0-0.1l0.1,0
-						c0,0,0,0,0,0c0.1,0,0.2-0.1,0.2-0.1c0-0.1,0.1-0.2,0-0.2c0-0.2-0.2-0.3-0.4-0.3c0,0,0,0,0,0l-0.1,0l0-0.1
-						c-0.1-0.1-0.2-0.3-0.3-0.4l-0.1-0.1l0.1-0.1c0,0,0,0,0,0c0.1-0.2,0.1-0.4-0.1-0.5c-0.2-0.1-0.4-0.1-0.5,0.1c0,0,0,0,0,0l0,0.1
-						l-0.1,0c-0.1-0.1-0.3-0.1-0.4-0.1l-0.1,0l0-0.1c0,0,0,0,0,0c0-0.2-0.2-0.3-0.4-0.3c-0.1,0-0.2,0.1-0.2,0.1c0,0.1-0.1,0.2,0,0.2
-						c0,0,0,0,0,0l0,0.1l-0.1,0c-0.1,0.1-0.3,0.2-0.4,0.3l-0.1,0.1l-0.1-0.1c0,0,0,0,0,0c-0.2-0.1-0.4-0.1-0.5,0.1
-						c-0.1,0.2,0,0.4,0.1,0.5l0.1,0l0,0.1c-0.1,0.1-0.1,0.3-0.1,0.4l0,0.1l-0.1,0c0,0,0,0,0,0c-0.1,0-0.2,0.1-0.2,0.1
-						c0,0.1-0.1,0.2,0,0.2c0,0.2,0.2,0.3,0.4,0.3C228.4,125.3,228.4,125.3,228.5,125.2L228.5,125.2z"/>
-				</g>
-			</g>
-		</g>
-		<g>
-			<g>
-				<g>
-					<path fill="#FFFFFF" d="M229.6,125.2c-0.3-0.2-0.4-0.6-0.2-0.9c0.2-0.3,0.6-0.4,0.9-0.2s0.4,0.6,0.2,0.9
-						C230.3,125.3,229.9,125.4,229.6,125.2z M230.2,124.2c-0.2-0.1-0.5-0.1-0.7,0.1s-0.1,0.5,0.1,0.7c0.2,0.1,0.5,0.1,0.7-0.1
-						S230.4,124.4,230.2,124.2z"/>
-				</g>
-			</g>
-		</g>
-		<g>
-			<g>
-				<g>
-					<path fill="#FFFFFF" d="M229.3,125.6c-0.6-0.4-0.7-1.1-0.3-1.7c0.4-0.6,1.1-0.7,1.7-0.3c0.6,0.4,0.7,1.1,0.3,1.7
-						C230.6,125.9,229.8,126,229.3,125.6z M230.5,123.7c-0.5-0.3-1.1-0.2-1.5,0.3c-0.3,0.5-0.2,1.1,0.3,1.5c0.5,0.3,1.1,0.2,1.5-0.3
-						C231.2,124.7,231,124.1,230.5,123.7z"/>
-				</g>
-			</g>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M272,114.7l-0.4-0.7l-0.7,0.1l-0.1-0.1l2-0.2l0,0.1l-1.3,1.5l-0.1-0.1L272,114.7z M271.8,114l0.3,0.6
-					l0.5-0.5c0,0,0.1-0.1,0.2-0.2c-0.1,0-0.2,0-0.2,0L271.8,114z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M273.3,115.4c0,0.1,0.1,0.1,0.1,0.2l-0.1,0c0-0.1,0-0.1-0.1-0.2c-0.1-0.1-0.1-0.2-0.3-0.2
-					c-0.1,0-0.3,0-0.4,0.1l-0.7,0.4l-0.1-0.1l1.2-0.6l0,0.1l-0.2,0.1l0,0c0.1,0,0.2,0,0.3,0.1C273.2,115.3,273.2,115.4,273.3,115.4z
-					"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M272.5,116.8c0,0.1,0.1,0.1,0.1,0.2l-0.1,0c0,0-0.1-0.1-0.1-0.2c-0.1-0.1-0.1-0.2,0-0.3
-					c0-0.1,0.1-0.2,0.2-0.2l0.8-0.4l-0.1-0.2l0.1,0l0.1,0.2l0.3-0.1l0,0.1l-0.3,0.2l0.2,0.4l-0.1,0.1l-0.2-0.4l-0.8,0.4
-					c-0.1,0-0.2,0.1-0.2,0.2C272.4,116.7,272.4,116.7,272.5,116.8z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M274.2,116.5c0.1,0,0.1,0,0.1,0c0,0,0,0,0,0.1c0,0,0,0-0.1,0.1c0,0-0.1,0-0.1,0c0,0,0,0-0.1,0
-					C274.1,116.5,274.1,116.5,274.2,116.5z M272.7,117.4l-0.1-0.1l1.2-0.6l0.1,0.1L272.7,117.4z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M274.3,117.7l-0.2-0.3L273,118l-0.1-0.1l1.1-0.6l-0.1-0.2l0.1,0l0.2,0.2l0.1,0c0.2-0.1,0.3-0.1,0.4-0.1
-					c0.1,0,0.2,0.1,0.2,0.2c0,0.1,0.1,0.1,0.1,0.2l-0.1,0c0-0.1,0-0.1-0.1-0.2c0-0.1-0.1-0.1-0.2-0.1c-0.1,0-0.2,0-0.3,0.1l-0.1,0.1
-					L274.3,117.7L274.3,117.7z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M273.7,119.3l0.2-0.1l0,0c-0.1,0-0.2-0.1-0.3-0.1c-0.1,0-0.1-0.1-0.2-0.2c-0.1-0.1-0.1-0.2-0.1-0.3
-					s0.1-0.2,0.2-0.2c0.1-0.1,0.2-0.1,0.4,0c0.1,0.1,0.2,0.2,0.3,0.4l0.1,0.2l0.1,0c0.1-0.1,0.2-0.1,0.2-0.2c0-0.1,0-0.2,0-0.3
-					c-0.1-0.1-0.2-0.2-0.3-0.3l0.1-0.1c0.1,0.1,0.2,0.2,0.3,0.4c0.1,0.1,0.1,0.3,0.1,0.4c0,0.1-0.1,0.2-0.3,0.3L273.7,119.3
-					L273.7,119.3z M273.5,118.8c0.1,0.1,0.2,0.2,0.3,0.3c0.1,0,0.2,0,0.4,0l0.1-0.1l-0.1-0.2c-0.1-0.2-0.2-0.3-0.3-0.3
-					c-0.1-0.1-0.2,0-0.3,0c-0.1,0-0.1,0.1-0.1,0.2C273.4,118.6,273.5,118.7,273.5,118.8z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M274.1,120.3c-0.1-0.2-0.1-0.3,0-0.5c0.1-0.2,0.2-0.3,0.4-0.4c0.2-0.1,0.4-0.1,0.6-0.1
-					c0.2,0,0.3,0.2,0.4,0.3c0.1,0.1,0.1,0.2,0.1,0.3l-0.1,0c0-0.1-0.1-0.2-0.1-0.3c-0.1-0.2-0.2-0.2-0.3-0.3c-0.1,0-0.3,0-0.5,0.1
-					c-0.2,0.1-0.3,0.2-0.3,0.3c-0.1,0.1,0,0.3,0,0.4c0.1,0.1,0.1,0.2,0.2,0.3l-0.1,0.1C274.3,120.5,274.2,120.4,274.1,120.3z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M274.7,121.2c0,0.1,0.1,0.1,0.1,0.2l-0.1,0c0,0-0.1-0.1-0.1-0.2c-0.1-0.1-0.1-0.2,0-0.3
-					c0-0.1,0.1-0.2,0.2-0.2l0.8-0.4l-0.1-0.2l0.1,0l0.1,0.2l0.3-0.1l0,0.1l-0.3,0.2l0.2,0.4l-0.1,0.1l-0.2-0.4l-0.8,0.4
-					c-0.1,0-0.2,0.1-0.2,0.2C274.7,121,274.7,121.1,274.7,121.2z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M275.6,122.2c-0.1,0.1-0.2,0.1-0.3,0c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1-0.2-0.1-0.3-0.1-0.4l0.1-0.1
-					c0,0.2,0,0.3,0.1,0.4c0.1,0.1,0.1,0.2,0.2,0.2c0.1,0,0.1,0,0.2,0c0.1,0,0.1-0.1,0.1-0.2c0-0.1,0-0.2,0-0.3c0-0.1,0-0.3,0-0.3
-					c0-0.1,0-0.1,0.1-0.2c0,0,0.1-0.1,0.1-0.1c0.1,0,0.2,0,0.3,0c0.1,0,0.2,0.1,0.3,0.3c0.1,0.1,0.1,0.3,0.1,0.4l-0.1,0
-					c0-0.1,0-0.3-0.1-0.4c-0.1-0.1-0.1-0.2-0.2-0.2c-0.1,0-0.1,0-0.2,0c-0.1,0-0.1,0.1-0.1,0.1c0,0.1,0,0.2,0,0.3c0,0.1,0,0.2,0,0.3
-					c0,0.1,0,0.1-0.1,0.2S275.7,122.2,275.6,122.2z"/>
-			</g>
-		</g>
-	</g>
-	<g>
-		<g>
-			<g>
-				<g>
-					<g>
-						<g>
-							
-								<rect x="269.4" y="112.9" transform="matrix(-0.3014 0.9535 -0.9535 -0.3014 458.836 -110.2392)" fill="#FFFFFF" width="0.8" height="0.2"/>
-						</g>
-					</g>
-				</g>
-			</g>
-			<g>
-				<g>
-					<g>
-						<g>
-							<path fill="#FFFFFF" d="M269.6,112.4c-0.1-0.1-0.1-0.3,0-0.4c0-0.1,0.1-0.2,0.3-0.3c0.1-0.1,0.3-0.1,0.4,0
-								c0.3,0.1,0.4,0.4,0.4,0.7c0,0.1-0.1,0.2-0.3,0.3c-0.1,0.1-0.3,0.1-0.4,0C269.8,112.6,269.6,112.5,269.6,112.4z M270.4,112
-								c0-0.1-0.1-0.2-0.2-0.2c-0.1,0-0.2,0-0.3,0c-0.1,0-0.2,0.1-0.2,0.2c-0.1,0.2,0.1,0.4,0.3,0.5c0.1,0,0.2,0,0.3,0
-								s0.2-0.1,0.2-0.2C270.5,112.2,270.4,112.1,270.4,112z"/>
-						</g>
-					</g>
-				</g>
-			</g>
-		</g>
-		<g>
-			<g>
-				<g>
-					<g>
-						<g>
-							<polygon fill="#FFFFFF" points="268.9,112 268.3,110.9 270.7,109.7 271.9,110.1 272.8,111.8 271.1,112.6 271,112.5 
-								272.6,111.7 271.8,110.2 270.7,109.9 268.5,111 269,112 							"/>
-						</g>
-					</g>
-				</g>
-			</g>
-			<g>
-				<g>
-					<g>
-						<g>
-							<polygon fill="#FFFFFF" points="271,110.8 270.6,109.9 270.7,109.9 271.1,110.5 271.8,110.2 271.8,110.3 							"/>
-						</g>
-					</g>
-				</g>
-			</g>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M241.6,124.2l-0.6-0.5l-0.6,0.3l-0.1-0.1l1.8-0.9l0.1,0.1l-0.7,1.9l-0.1-0.1L241.6,124.2z M241.1,123.6
-					l0.5,0.4l0.3-0.7c0-0.1,0-0.1,0.1-0.2c-0.1,0-0.1,0.1-0.2,0.1L241.1,123.6z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M243,124.4c0,0,0.1,0.1,0.1,0.1l-0.1,0.1C243,124.6,242.9,124.5,243,124.4c-0.2,0-0.3,0-0.4,0
-					c-0.1,0-0.2,0.1-0.3,0.2l-0.5,0.6l-0.1-0.1l0.9-1l0.1,0.1l-0.2,0.2l0,0c0.1,0,0.2-0.1,0.3,0C242.8,124.3,242.9,124.3,243,124.4z
-					"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M242.7,126c0.1,0.1,0.1,0.1,0.2,0.1l-0.1,0.1C242.8,126.1,242.7,126.1,242.7,126c-0.2,0-0.2-0.1-0.2-0.2
-					c0-0.1,0-0.2,0.1-0.3l0.6-0.7l-0.2-0.1l0-0.1l0.2,0.1l0.3-0.2l0,0l-0.2,0.3l0.3,0.3l-0.1,0.1l-0.3-0.3l-0.6,0.7
-					c-0.1,0.1-0.1,0.2-0.1,0.2C242.6,125.8,242.7,125.9,242.7,126z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M244.2,125c0.1-0.1,0.1-0.1,0.1,0c0,0,0,0,0,0.1c0,0,0,0.1,0,0.1c0,0-0.1,0-0.1,0.1c0,0,0,0-0.1,0
-					C244.2,125.1,244.2,125.1,244.2,125z M243.2,126.4L243.2,126.4l0.8-1.1l0.1,0.1L243.2,126.4z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M244.7,126.1l-0.2-0.2l-0.8,1l-0.1-0.1l0.8-1l-0.2-0.2l0-0.1l0.2,0.1l0.1-0.1c0.1-0.1,0.2-0.2,0.3-0.2
-					c0.1,0,0.2,0,0.3,0.1c0.1,0.1,0.1,0.1,0.2,0.2l-0.1,0.1c0-0.1-0.1-0.1-0.1-0.2c-0.1-0.1-0.1-0.1-0.2-0.1c-0.1,0-0.1,0.1-0.2,0.2
-					l-0.1,0.1L244.7,126.1L244.7,126.1z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M244.7,127.8l0.1-0.2l0,0c-0.1,0-0.2,0-0.3,0c-0.1,0-0.2-0.1-0.2-0.1c-0.1-0.1-0.2-0.2-0.2-0.3
-					c0-0.1,0-0.2,0.1-0.3c0.1-0.1,0.2-0.1,0.3-0.1c0.1,0,0.3,0.1,0.4,0.2l0.2,0.2l0.1-0.1c0.1-0.1,0.1-0.2,0.1-0.3
-					c0-0.1,0-0.2-0.1-0.2c-0.1-0.1-0.2-0.1-0.4-0.2l0-0.1c0.2,0,0.3,0.1,0.4,0.2c0.1,0.1,0.2,0.2,0.2,0.3c0,0.1,0,0.2-0.2,0.4
-					L244.7,127.8L244.7,127.8z M244.4,127.4c0.1,0.1,0.2,0.1,0.3,0.1c0.1,0,0.2-0.1,0.3-0.2l0.1-0.1l-0.2-0.2
-					c-0.2-0.1-0.3-0.2-0.4-0.2c-0.1,0-0.2,0-0.3,0.1c-0.1,0.1-0.1,0.1-0.1,0.2C244.3,127.3,244.3,127.4,244.4,127.4z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M245.5,128.6c-0.1-0.1-0.2-0.3-0.2-0.5c0-0.2,0.1-0.3,0.2-0.5c0.2-0.2,0.3-0.3,0.5-0.3
-					c0.2,0,0.3,0,0.5,0.2c0.1,0.1,0.2,0.2,0.2,0.3l-0.1,0.1c-0.1-0.1-0.1-0.2-0.2-0.3c-0.1-0.1-0.3-0.2-0.4-0.1s-0.3,0.1-0.4,0.3
-					c-0.1,0.1-0.2,0.3-0.2,0.4C245.4,128.3,245.5,128.4,245.5,128.6c0.2,0,0.3,0.1,0.4,0.1l-0.1,0.1
-					C245.8,128.7,245.7,128.7,245.5,128.6z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M246.4,129.2c0.1,0.1,0.1,0.1,0.2,0.1l-0.1,0.1C246.5,129.4,246.4,129.3,246.4,129.2
-					c-0.2,0-0.2-0.1-0.2-0.2c0-0.1,0-0.2,0.1-0.3l0.6-0.7l-0.2-0.1l0-0.1l0.2,0.1l0.3-0.2l0,0l-0.2,0.3l0.3,0.3l-0.1,0.1l-0.3-0.3
-					l-0.6,0.7c-0.1,0.1-0.1,0.2-0.1,0.2C246.3,129.1,246.4,129.1,246.4,129.2z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M247.6,129.9c-0.1,0.1-0.2,0.1-0.3,0.1c-0.1,0-0.2-0.1-0.4-0.2c-0.1-0.1-0.2-0.2-0.3-0.4l0.1-0.1
-					c0.1,0.1,0.1,0.3,0.3,0.4c0.1,0.1,0.2,0.1,0.3,0.2c0.1,0,0.2,0,0.2-0.1c0-0.1,0.1-0.1,0.1-0.2c0-0.1-0.1-0.2-0.1-0.3
-					c-0.1-0.1-0.1-0.2-0.1-0.3c0-0.1,0-0.1,0-0.2c0-0.1,0-0.1,0.1-0.2c0.1-0.1,0.2-0.1,0.3-0.1c0.1,0,0.2,0.1,0.3,0.2
-					c0.1,0.1,0.2,0.2,0.3,0.3l-0.1,0.1c-0.1-0.1-0.1-0.2-0.2-0.3c-0.1-0.1-0.2-0.1-0.2-0.1c-0.1,0-0.1,0-0.2,0.1
-					c0,0.1-0.1,0.1-0.1,0.2c0,0.1,0.1,0.2,0.1,0.3c0.1,0.1,0.1,0.2,0.1,0.3c0,0.1,0,0.1,0,0.2S247.7,129.8,247.6,129.9z"/>
-			</g>
-		</g>
-	</g>
-	<g>
-		<g>
-			<g>
-				<g>
-					<g>
-						<g>
-							
-								<rect x="238.5" y="123.3" transform="matrix(6.415460e-02 0.9979 -0.9979 6.415460e-02 346.6186 -122.9345)" fill="#FFFFFF" width="0.8" height="0.2"/>
-						</g>
-					</g>
-				</g>
-			</g>
-			<g>
-				<g>
-					<g>
-						<g>
-							<path fill="#FFFFFF" d="M238.4,122.9c-0.1-0.1-0.2-0.2-0.2-0.4c0-0.1,0-0.3,0.1-0.4c0.1-0.1,0.2-0.2,0.4-0.2
-								c0.3,0,0.6,0.2,0.6,0.5c0,0.1,0,0.3-0.1,0.4s-0.2,0.2-0.4,0.2C238.7,123,238.6,123,238.4,122.9z M239.1,122.2
-								c-0.1-0.1-0.2-0.1-0.3-0.1c-0.1,0-0.2,0.1-0.3,0.1s-0.1,0.2-0.1,0.3c0,0.2,0.2,0.4,0.4,0.4c0.1,0,0.2-0.1,0.3-0.1
-								s0.1-0.2,0.1-0.3C239.2,122.4,239.1,122.3,239.1,122.2z"/>
-						</g>
-					</g>
-				</g>
-			</g>
-		</g>
-		<g>
-			<g>
-				<g>
-					<g>
-						<g>
-							<polygon fill="#FFFFFF" points="237.7,122.8 236.7,122 238.5,120 239.8,119.9 241.2,121.2 240,122.5 239.8,122.4 241,121.2 
-								239.7,120.1 238.6,120.1 237,122 237.8,122.7 							"/>
-						</g>
-					</g>
-				</g>
-			</g>
-			<g>
-				<g>
-					<g>
-						<g>
-							<polygon fill="#FFFFFF" points="239.2,120.8 238.5,120.2 238.6,120.1 239.2,120.6 239.7,120 239.8,120.1 							"/>
-						</g>
-					</g>
-				</g>
-			</g>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M281.4,112.4l-0.1-0.1l0.9-0.4l-0.5-1l-0.9,0.4l-0.1-0.1l1.8-0.8l0.1,0.1l-0.8,0.4l0.5,1l0.8-0.4
-					l0.1,0.1L281.4,112.4z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M282.8,113.6c-0.2,0.1-0.4,0.1-0.6,0.1c-0.2,0-0.3-0.2-0.4-0.3c-0.1-0.1-0.1-0.2-0.1-0.3
-					c0-0.1,0.1-0.2,0.1-0.3c0.1-0.1,0.2-0.2,0.3-0.2c0.2-0.1,0.4-0.1,0.6-0.1c0.2,0,0.3,0.2,0.4,0.3c0.1,0.2,0.1,0.3,0,0.5
-					C283.2,113.4,283,113.5,282.8,113.6z M282.3,112.6c-0.2,0.1-0.3,0.2-0.4,0.3c-0.1,0.1-0.1,0.3,0,0.4s0.2,0.2,0.3,0.3
-					c0.1,0,0.3,0,0.5-0.1c0.2-0.1,0.3-0.2,0.4-0.3c0.1-0.1,0.1-0.3,0-0.4c-0.1-0.1-0.2-0.2-0.3-0.3
-					C282.7,112.5,282.5,112.5,282.3,112.6z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M283.1,115.9l0.9-0.4c0.1-0.1,0.2-0.1,0.2-0.2c0-0.1,0-0.2,0-0.3c-0.1-0.1-0.1-0.2-0.3-0.2
-					c-0.1,0-0.2,0-0.4,0.1l-0.8,0.4l-0.1-0.1l0.9-0.4c0.2-0.1,0.3-0.3,0.2-0.5c-0.1-0.1-0.2-0.2-0.3-0.2c-0.1,0-0.3,0-0.4,0.1
-					l-0.7,0.3l-0.1-0.1l1.3-0.6l0,0.1l-0.2,0.1l0,0c0.1,0,0.2,0,0.2,0.1c0.1,0,0.1,0.1,0.2,0.2c0.1,0.2,0.1,0.4,0,0.5l0,0
-					c0.1,0,0.2,0,0.3,0.1c0.1,0.1,0.1,0.1,0.2,0.2c0.1,0.1,0.1,0.3,0,0.4c0,0.1-0.1,0.2-0.3,0.3l-0.9,0.4L283.1,115.9z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M283.6,117c-0.1-0.2-0.1-0.4,0-0.5c0.1-0.2,0.2-0.3,0.4-0.4c0.2-0.1,0.4-0.1,0.6-0.1
-					c0.2,0,0.3,0.1,0.4,0.3c0.1,0.2,0.1,0.3,0,0.4c-0.1,0.1-0.2,0.3-0.4,0.3l-0.1,0l-0.5-0.9c-0.2,0.1-0.3,0.2-0.3,0.3
-					c-0.1,0.1,0,0.3,0,0.4c0,0.1,0.1,0.1,0.1,0.2c0,0.1,0.1,0.1,0.2,0.2l-0.1,0.1c-0.1-0.1-0.1-0.1-0.2-0.2
-					C283.7,117.2,283.7,117.1,283.6,117z M284.9,116.4c-0.1-0.1-0.2-0.2-0.3-0.2c-0.1,0-0.3,0-0.4,0l0.4,0.8
-					c0.2-0.1,0.3-0.2,0.3-0.3C284.9,116.6,284.9,116.5,284.9,116.4z"/>
-			</g>
-		</g>
-	</g>
-	<g>
-		<g>
-			<g>
-				<g>
-					<path fill="#FFFFFF" d="M281.2,108c0.3,0.6,0,1.3-0.6,1.6s-1.4,0.1-1.7-0.5c-0.3-0.6,0-1.3,0.6-1.6
-						C280.1,107.2,280.9,107.4,281.2,108 M281.3,107.9c-0.3-0.7-1.2-0.9-1.9-0.6c-0.7,0.3-1,1.2-0.7,1.8c0.3,0.7,1.2,0.9,1.9,0.6
-						C281.3,109.4,281.6,108.6,281.3,107.9L281.3,107.9z"/>
-				</g>
-			</g>
-		</g>
-		<g>
-			<g>
-				<g>
-					
-						<rect x="277.2" y="109.4" transform="matrix(0.4363 0.8998 -0.8998 0.4363 255.2555 -188.7239)" fill="#FFFFFF" width="2.2" height="0"/>
-				</g>
-			</g>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M251.6,122.6l-0.8-0.5l-0.7,0.5l-0.1-0.1l2-1.4l0.1,0.1l-0.5,2.4l-0.1-0.1L251.6,122.6z M251,122
-					l0.7,0.5l0.2-0.8c0-0.1,0-0.2,0.1-0.3c-0.1,0.1-0.2,0.1-0.2,0.2L251,122z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M253.3,122.6c0.1,0.1,0.2,0.1,0.2,0.2c0,0.1,0.1,0.2,0.1,0.3l0,0c0.1-0.1,0.1-0.2,0.2-0.3l0.3-0.5
-					l0.1,0.1l-1.3,2l-0.1-0.1l0.1-0.2l0,0c-0.2,0.1-0.4,0.1-0.6-0.1c-0.2-0.1-0.3-0.3-0.3-0.5c0-0.2,0-0.4,0.2-0.6
-					c0.2-0.2,0.3-0.4,0.5-0.4S253.1,122.5,253.3,122.6z M253.2,122.7c-0.2-0.1-0.3-0.1-0.5-0.1c-0.1,0.1-0.3,0.2-0.4,0.4
-					c-0.3,0.4-0.2,0.7,0.1,0.9c0.2,0.1,0.3,0.1,0.4,0.1c0.1,0,0.3-0.2,0.4-0.4l0,0c0.1-0.2,0.2-0.4,0.2-0.5
-					C253.5,123,253.4,122.8,253.2,122.7z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M255.1,125.9l0.6-0.9c0.1-0.1,0.1-0.3,0.1-0.4c0-0.1-0.1-0.2-0.2-0.3c-0.1-0.1-0.3-0.1-0.4-0.1
-					c-0.1,0-0.2,0.1-0.4,0.3l-0.6,0.8l-0.1-0.1l0.6-1c0.2-0.2,0.1-0.4-0.1-0.6c-0.1-0.1-0.3-0.1-0.4-0.1c-0.1,0-0.2,0.2-0.4,0.3
-					l-0.5,0.8l-0.1-0.1l0.9-1.4l0.1,0.1l-0.1,0.2l0,0c0.1,0,0.2-0.1,0.3,0c0.1,0,0.2,0,0.3,0.1c0.2,0.1,0.3,0.3,0.3,0.5l0,0
-					c0.1,0,0.2-0.1,0.3-0.1c0.1,0,0.2,0,0.3,0.1c0.2,0.1,0.2,0.2,0.3,0.4c0,0.1,0,0.3-0.1,0.5l-0.6,0.9L255.1,125.9z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M256.9,124.5c0.1-0.1,0.1-0.1,0.2-0.1c0,0,0,0,0,0.1c0,0,0,0.1,0,0.1c0,0-0.1,0.1-0.1,0.1
-					c0,0-0.1,0-0.1,0C256.8,124.7,256.8,124.6,256.9,124.5z M255.8,126.4l-0.1-0.1l0.9-1.4l0.1,0.1L255.8,126.4z"/>
-			</g>
-		</g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M257.3,127.4l0.6-0.9c0.1-0.1,0.1-0.3,0.1-0.4c0-0.1-0.1-0.2-0.2-0.3c-0.2-0.1-0.3-0.2-0.5-0.1
-					c-0.1,0-0.3,0.1-0.4,0.3l-0.5,0.8l-0.1-0.1l0.9-1.4l0.1,0.1l-0.1,0.2l0,0c0.2-0.1,0.4,0,0.6,0.1c0.3,0.2,0.4,0.5,0.1,0.8
-					l-0.6,0.9L257.3,127.4z"/>
-			</g>
-		</g>
-	</g>
-	<g>
-		<g>
-			<g>
-				<path fill="#FFFFFF" d="M247.9,117.1c-0.9-0.6-2.2-0.4-2.8,0.5s-0.4,2.2,0.5,2.8c0.9,0.6,2.2,0.4,2.8-0.5
-					C249.1,119,248.9,117.8,247.9,117.1z M247.9,117.3c0.9,0.6,1.1,1.7,0.5,2.6c-0.2,0.4-0.6,0.6-1,0.7c0.1-0.4,0-0.8-0.2-1.2
-					c0.2,0,0.5-0.2,0.6-0.4c0.3-0.4,0.2-1-0.3-1.3c-0.4-0.3-1-0.2-1.3,0.3c-0.2,0.2-0.2,0.5-0.1,0.7c-0.4-0.1-0.8,0-1.1,0.2
-					c0-0.4,0.1-0.8,0.3-1.2C245.8,116.9,247,116.7,247.9,117.3z M247,119.3c-0.1,0-0.2,0-0.3,0c-0.1,0-0.1,0-0.2-0.1
-					c-0.1,0-0.1-0.1-0.1-0.1c-0.1-0.1-0.1-0.2-0.1-0.2c-0.1-0.2-0.1-0.5,0.1-0.7c0.2-0.4,0.7-0.4,1.1-0.2s0.4,0.7,0.2,1.1
-					C247.5,119.2,247.2,119.3,247,119.3z M245.7,120.4c-0.4-0.3-0.7-0.8-0.8-1.3c0.4-0.2,0.8-0.3,1.2-0.2c0.1,0.1,0.2,0.3,0.3,0.4
-					c0.1,0.1,0.3,0.2,0.5,0.2c0.3,0.3,0.4,0.7,0.3,1.2C246.7,120.8,246.2,120.7,245.7,120.4z"/>
-			</g>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<path fill="#FFFFFF" d="M291.3,109.6l0.4-0.6l-0.4-0.6l-0.6,0.2l-0.1-0.2l2-0.5l0.1,0.2l-1.2,1.7L291.3,109.6z M291.8,108.9
-				l0.4-0.5c0-0.1,0.1-0.1,0.2-0.2c-0.1,0-0.2,0.1-0.3,0.1l-0.6,0.2L291.8,108.9z"/>
-		</g>
-	</g>
-	<g>
-		<g>
-			<path fill="#FFFFFF" d="M293.2,109.7c0,0.1,0.1,0.1,0.1,0.2l-0.2,0.1c0-0.1,0-0.1-0.1-0.1c-0.1-0.1-0.2-0.2-0.3-0.2
-				c-0.1,0-0.2,0-0.4,0.1l-0.6,0.4l-0.1-0.2l1.2-0.8l0.1,0.1l-0.2,0.2l0,0c0.1,0,0.2,0,0.3,0C293.1,109.6,293.2,109.6,293.2,109.7z"
-				/>
-		</g>
-	</g>
-	<g>
-		<g>
-			<path fill="#FFFFFF" d="M292.6,111.2C292.7,111.3,292.7,111.3,292.6,111.2c0.1,0.1,0.1,0.1,0.1,0.1l-0.1,0.1c0,0-0.1,0-0.1-0.1
-				c0,0-0.1-0.1-0.1-0.1c-0.2-0.2-0.1-0.4,0.1-0.6l0.7-0.5l-0.1-0.2l0.1-0.1l0.2,0.1l0.3-0.1l0.1,0.1l-0.3,0.2l0.2,0.3l-0.1,0.1
-				l-0.2-0.3l-0.7,0.5c-0.1,0-0.1,0.1-0.1,0.2C292.6,111.1,292.6,111.2,292.6,111.2z"/>
-		</g>
-	</g>
-	<g>
-		<g>
-			<path fill="#FFFFFF" d="M294.3,110.7c0,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0.1c0,0,0,0.1,0,0.1c0,0,0,0.1-0.1,0.1c0,0-0.1,0-0.1,0
-				c0,0-0.1,0-0.1-0.1C294.2,110.8,294.2,110.8,294.3,110.7C294.2,110.7,294.3,110.7,294.3,110.7z M292.9,111.9l-0.1-0.2l1.2-0.8
-				l0.1,0.2L292.9,111.9z"/>
-		</g>
-	</g>
-	<g>
-		<g>
-			<path fill="#FFFFFF" d="M294.6,112.1l-0.2-0.3l-1.1,0.7l-0.1-0.2l1.1-0.7l-0.1-0.2l0.1-0.1l0.2,0.2l0.1,0
-				c0.3-0.2,0.5-0.2,0.7,0.1c0,0.1,0.1,0.1,0.1,0.2l-0.2,0.1c0-0.1-0.1-0.2-0.1-0.2c0-0.1-0.1-0.1-0.2-0.1c-0.1,0-0.2,0-0.3,0.1
-				l-0.1,0.1l0.2,0.3L294.6,112.1z"/>
-		</g>
-	</g>
-	<g>
-		<g>
-			<path fill="#FFFFFF" d="M294.2,113.8l0.1-0.2l0,0c-0.1,0-0.2,0-0.3-0.1c-0.1,0-0.1-0.1-0.2-0.2c-0.1-0.1-0.1-0.2-0.1-0.3
-				c0-0.1,0.1-0.2,0.2-0.3c0.2-0.2,0.5-0.1,0.8,0.3l0.1,0.2l0.1-0.1c0.1-0.1,0.1-0.1,0.2-0.2c0-0.1,0-0.2-0.1-0.2
-				c-0.1-0.1-0.2-0.2-0.3-0.3l0.1-0.2c0.1,0,0.1,0.1,0.2,0.1c0.1,0.1,0.1,0.1,0.2,0.2c0.1,0.1,0.1,0.3,0.1,0.4
-				c0,0.1-0.1,0.2-0.2,0.3l-0.8,0.6L294.2,113.8z M294.1,113.3c0.1,0.1,0.2,0.2,0.3,0.2c0.1,0,0.2,0,0.3-0.1l0.1-0.1l-0.1-0.2
-				c-0.1-0.1-0.2-0.2-0.3-0.3c-0.1,0-0.2,0-0.3,0c-0.1,0-0.1,0.1-0.1,0.2C294,113.1,294,113.2,294.1,113.3z"/>
-		</g>
-	</g>
-	<g>
-		<g>
-			<path fill="#FFFFFF" d="M294.9,114.8c-0.1-0.2-0.2-0.3-0.1-0.5c0-0.2,0.2-0.3,0.4-0.5c0.2-0.1,0.4-0.2,0.6-0.2
-				c0.2,0,0.3,0.1,0.4,0.3c0,0.1,0.1,0.1,0.1,0.2c0,0.1,0,0.1,0,0.2l-0.2,0.1c0-0.1,0-0.1-0.1-0.2c0-0.1,0-0.1-0.1-0.1
-				c-0.2-0.2-0.4-0.3-0.7,0c-0.1,0.1-0.2,0.2-0.3,0.3c0,0.1,0,0.2,0.1,0.3c0.1,0.1,0.2,0.2,0.3,0.3l-0.2,0.1
-				C295.1,115,295,114.9,294.9,114.8z"/>
-		</g>
-	</g>
-	<g>
-		<g>
-			<path fill="#FFFFFF" d="M295.7,115.7C295.7,115.7,295.7,115.7,295.7,115.7c0.1,0.1,0.1,0.1,0.1,0.1l-0.1,0.1c0,0-0.1,0-0.1-0.1
-				c0,0-0.1-0.1-0.1-0.1c-0.2-0.2-0.1-0.4,0.1-0.6l0.7-0.5l-0.1-0.2l0.1-0.1l0.2,0.1l0.3-0.1l0.1,0.1l-0.3,0.2l0.2,0.3l-0.1,0.1
-				l-0.2-0.3l-0.7,0.5c-0.1,0-0.1,0.1-0.1,0.2C295.6,115.5,295.7,115.6,295.7,115.7z"/>
-		</g>
-	</g>
-	<g>
-		<g>
-			<path fill="#FFFFFF" d="M297.2,116.8c-0.2,0.1-0.4,0.2-0.6,0.2c-0.2,0-0.3-0.1-0.4-0.3c-0.1-0.1-0.1-0.2-0.1-0.3
-				c0-0.1,0-0.2,0.1-0.3c0.1-0.1,0.2-0.2,0.3-0.3c0.2-0.1,0.4-0.2,0.6-0.2c0.2,0,0.3,0.1,0.4,0.3c0.1,0.2,0.2,0.3,0.1,0.5
-				C297.5,116.5,297.4,116.6,297.2,116.8z M296.5,115.9c-0.2,0.1-0.2,0.2-0.3,0.3s0,0.2,0.1,0.4c0.1,0.1,0.2,0.2,0.3,0.2
-				c0.1,0,0.3,0,0.4-0.1c0.2-0.1,0.2-0.2,0.3-0.3c0-0.1,0-0.2-0.1-0.4c-0.1-0.1-0.2-0.2-0.3-0.2
-				C296.8,115.7,296.7,115.7,296.5,115.9z"/>
-		</g>
-	</g>
-	<g>
-		<g>
-			<path fill="#FFFFFF" d="M298.4,117.2c0,0.1,0.1,0.1,0.1,0.2l-0.2,0.1c0-0.1,0-0.1-0.1-0.1c-0.1-0.1-0.2-0.2-0.3-0.2
-				c-0.1,0-0.2,0-0.4,0.1l-0.6,0.4l-0.1-0.2l1.2-0.8l0.1,0.1l-0.2,0.2l0,0c0.1,0,0.2,0,0.3,0C298.3,117.1,298.3,117.1,298.4,117.2z"
-				/>
-		</g>
-	</g>
-	<g>
-		<g>
-			<path fill="#FFFFFF" d="M298.5,117.4l0.1,0.2l-0.5,0.7c-0.1,0.2-0.2,0.3-0.3,0.3l0,0c0,0,0.1,0,0.2-0.1c0.1,0,0.5-0.1,1-0.3
-				l0.1,0.2l-1.7,0.4c-0.2,0-0.3,0-0.4,0c-0.1,0-0.2-0.1-0.3-0.2c0-0.1-0.1-0.1-0.1-0.2l0.1-0.1c0,0,0,0.1,0.1,0.1
-				c0.1,0.1,0.2,0.2,0.4,0.1l0.2-0.1L298.5,117.4z"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			<path fill="#FFFFFF" d="M288.8,106c-0.4-0.6-0.3-1.4,0.3-1.7c0.6-0.4,1.4-0.3,1.7,0.3c0.4,0.6,0.3,1.4-0.3,1.7
-				C290,106.7,289.2,106.5,288.8,106z M290.7,104.7c-0.3-0.5-1-0.6-1.4-0.3c-0.5,0.3-0.6,1-0.3,1.4s1,0.6,1.4,0.3
-				S291,105.1,290.7,104.7z"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<g>
-			
-				<rect x="286.3" y="106.5" transform="matrix(0.5681 0.8229 -0.8229 0.5681 212.307 -191.1957)" fill="#FFFFFF" width="4.1" height="0.3"/>
-		</g>
-	</g>
-</g>
-<g opacity="0.4">
-	<g>
-		<g>
-			<polygon fill="#2A2B2B" points="328.8,166.2 284.4,104.7 285.2,104.1 331.1,168.2 			"/>
-		</g>
-	</g>
-</g>
-<g>
-	<g>
-		<polygon fill="#E2E2E2" points="236.9,135.5 344.2,180.5 263.9,125.8 		"/>
-	</g>
-</g>
-<g>
-	<g>
-		<polygon fill="#FFFFFF" points="282.2,128.5 293.3,125.2 303.1,140.9 297.9,141.8 		"/>
-	</g>
-	<g>
-		<path d="M297.7,142.3l-16.6-14l12.4-3.7l10.4,16.7L297.7,142.3z M283.2,128.7l14.8,12.5l4.3-0.7l-9.2-14.8L283.2,128.7z"/>
-	</g>
-</g>
-<g>
-	<g>
-		<polygon fill="#DEDDDD" points="282.2,128.5 281.4,137.8 295.4,146.8 297.9,141.8 		"/>
-	</g>
-	<g>
-		<path d="M295.6,147.5l-14.8-9.4l1-10.6l16.7,14.1L295.6,147.5z M281.9,137.6l13.3,8.5l2-4.1l-14.6-12.4L281.9,137.6z"/>
-	</g>
-</g>
-<g>
-	<g>
-		<polygon fill="#FFFFFF" points="284.8,140.2 270.2,145.5 249.7,135.4 268,128.6 		"/>
-	</g>
-	<g>
-		<path d="M270.2,146.1l-21.8-10.8l19.7-7.3l17.8,12.4L270.2,146.1z M250.9,135.4l19.3,9.6l13.5-4.9l-15.8-11L250.9,135.4z"/>
-	</g>
-</g>
-<g>
-	<g>
-		<polygon fill="#FFFFFF" points="289.6,143 278.2,147.7 301.3,158.4 308.3,155.5 		"/>
-	</g>
-	<g>
-		<path d="M301.3,159L277,147.7l12.6-5.2l19.8,13.1L301.3,159z M279.5,147.7l21.9,10.1l5.9-2.5l-17.8-11.8L279.5,147.7z"/>
-	</g>
-</g>
-<g>
-	<g>
-		<polygon fill="#FFFFFF" points="304.3,142.4 311.9,152.4 300,143.5 		"/>
-	</g>
-	<g>
-		<path d="M314.5,155l-15.6-11.7l5.5-1.4L314.5,155z M301.2,143.7l8.1,6.1l-5.2-6.8L301.2,143.7z"/>
-	</g>
-</g>
-<g>
-	<g>
-		<polygon fill="#FFFFFF" points="300,143.5 299.5,148.6 311.4,156.9 311.9,152.4 		"/>
-	</g>
-	<g>
-		<path d="M311.8,157.8l-12.8-9l0.6-6.2l12.8,9.6L311.8,157.8z M300,148.3l11,7.7l0.3-3.4l-10.9-8.2L300,148.3z"/>
-	</g>
-</g>
-<g>
-	<g>
-		<line fill="#FFFFFF" x1="259" y1="134.6" x2="269.8" y2="140.4"/>
-	</g>
-	<g>
-		<rect x="258.3" y="137" transform="matrix(0.8792 0.4765 -0.4765 0.8792 97.4442 -109.3737)" width="12.2" height="1"/>
-	</g>
-</g>
-<g>
-	<g>
-		<line fill="#FFFFFF" x1="262.3" y1="132.5" x2="273" y2="138.4"/>
-	</g>
-	<g>
-		<rect x="261.5" y="134.9" transform="matrix(0.8792 0.4765 -0.4765 0.8792 96.8715 -111.1631)" width="12.2" height="1"/>
-	</g>
-</g>
-<g>
-	<g>
-		<line fill="#FFFFFF" x1="287.1" y1="147.5" x2="297.9" y2="153.3"/>
-	</g>
-	<g>
-		<rect x="286.4" y="149.9" transform="matrix(0.8792 0.4764 -0.4764 0.8792 106.9968 -121.1901)" width="12.2" height="1"/>
-	</g>
-</g>
-<g>
-	<g>
-		<polygon fill="#E0E0E0" points="290.2,126.1 297.9,141.8 303.1,140.9 293.3,125.2 		"/>
-	</g>
-	<g>
-		<path d="M297.6,142.3l-8.1-16.5l4-1.2l10.4,16.7L297.6,142.3z M290.9,126.4l7.2,14.8l4.1-0.7l-9.2-14.8L290.9,126.4z"/>
-	</g>
-</g>
-<g>
-	<g>
-		<polygon fill="#DEDDDD" points="252.8,143 251.6,148.5 276.4,157.1 276.8,153.3 		"/>
-	</g>
-	<g>
-		<path d="M276.8,157.8l-25.8-8.9l1.5-6.6l24.9,10.7L276.8,157.8z M252.2,148.2l23.8,8.2l0.3-2.8l-23.1-10L252.2,148.2z"/>
-	</g>
-</g>
-<g>
-	<g>
-		<polygon fill="#DEDDDD" points="281.9,155.1 281.6,157.9 294.2,160.3 		"/>
-	</g>
-	<g>
-		<path d="M298.6,161.7l-17.6-3.3l0.4-4L298.6,161.7z M282.1,157.5l7.7,1.4l-7.5-3.2L282.1,157.5z"/>
-	</g>
-</g>
-<g>
-	<g>
-		<path d="M47.3,153.6h-0.6v-1h0.6c3.5,0,7-0.1,10.4-0.2l0,1C54.3,153.6,50.8,153.6,47.3,153.6z M35.7,153.6h-11v-1h11V153.6z
-			 M13.7,153.6h-11v-1h11V153.6z M68.8,152.7l-0.1-1c3.7-0.3,7.3-0.8,10.9-1.3l0.1,1C76.1,151.9,72.4,152.3,68.8,152.7z M90.6,149.5
-			l-0.2-1c3.6-0.7,7.2-1.5,10.7-2.4l0.2,1C97.8,148,94.2,148.8,90.6,149.5z M111.9,144l-0.3-1c3.5-1.1,7-2.4,10.3-3.7l0.4,0.9
-			C118.9,141.6,115.4,142.8,111.9,144z M132.4,135.9L132,135c3.3-1.6,6.6-3.2,9.8-5l0.5,0.9C139.1,132.7,135.8,134.3,132.4,135.9z
-			 M151.7,125.2l-0.5-0.8c3.1-2,6.1-4.1,8.9-6.4l0.6,0.8C157.8,121,154.8,123.2,151.7,125.2z M169.1,111.7l-0.7-0.7
-			c2.7-2.4,5.3-5,7.8-7.7l0.7,0.7C174.5,106.6,171.9,109.2,169.1,111.7z M237.5,104.3c-2.8-1.6-5.8-3.3-9.6-5.4l0.5-0.9
-			c3.8,2,6.8,3.8,9.6,5.4L237.5,104.3z M184.3,95.6l-0.8-0.6c2.3-2.8,4.4-5.8,6.5-8.8l0.8,0.6C188.7,89.8,186.5,92.8,184.3,95.6z
-			 M218.2,93.8c-2.9-1.5-6.3-3.4-9.7-5.2l0.5-0.9c3.4,1.9,6.8,3.7,9.7,5.2L218.2,93.8z M198.9,83.1c-3.4-2-6.4-3.9-9.4-5.8l0.5-0.8
-			c2.9,1.9,6,3.8,9.3,5.8L198.9,83.1z M196.6,77.3l-0.9-0.5c1.8-3.3,3.5-6.6,4.8-9.8l0.9,0.4C200.1,70.7,198.4,74,196.6,77.3z
-			 M180.5,71c-3-2.3-5.9-4.6-8.6-7l0.7-0.7c2.6,2.3,5.5,4.7,8.5,6.9L180.5,71z M205,57l-1-0.3c1-3.6,1.6-7.3,1.9-10.7l1,0.1
-			C206.7,49.6,206,53.3,205,57z M164.1,56.3c-1.2-1.3-2.4-2.7-3.6-4c-1.3-1.5-2.5-3-3.5-4.5l0.8-0.6c1.1,1.4,2.2,2.9,3.5,4.4
-			c1.1,1.3,2.3,2.7,3.6,4L164.1,56.3z M151.4,38.3c-1.6-3.7-2.5-7.3-2.7-10.8l1,0c0.2,3.3,1.1,6.8,2.6,10.4L151.4,38.3z M205.6,35.1
-			c-0.5-3.6-1.5-7.1-2.9-10.4l0.9-0.4c1.5,3.4,2.5,7,3,10.7L205.6,35.1z M151.7,17l-0.9-0.4c1.6-3.2,4.1-6.1,7.3-8.4l0.6,0.8
-			C155.7,11.2,153.2,14,151.7,17z M197.2,15.4c-2.3-2.9-5-5.4-8-7.3l0.5-0.8c3,1.9,5.8,4.5,8.2,7.5L197.2,15.4z M168.5,4.6l-0.2-1
-			c3.7-0.9,7.5-1,11.1-0.4l-0.2,1C175.8,3.6,172.1,3.7,168.5,4.6z"/>
-	</g>
-</g>
-</svg>
diff --git a/web/angular-web/src/main/webapp/app/assets/images/40px.png b/web/angular-web/src/main/webapp/app/assets/images/40px.png
deleted file mode 100644
index 1959347..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/40px.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/actions.png b/web/angular-web/src/main/webapp/app/assets/images/actions.png
deleted file mode 100644
index a5712dd..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/actions.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/admin.png b/web/angular-web/src/main/webapp/app/assets/images/admin.png
deleted file mode 100755
index 0a575e2..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/admin.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/arrow_left.png b/web/angular-web/src/main/webapp/app/assets/images/arrow_left.png
deleted file mode 100644
index 430cc2e..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/arrow_left.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/arrow_right.png b/web/angular-web/src/main/webapp/app/assets/images/arrow_right.png
deleted file mode 100644
index 643340c..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/arrow_right.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/artifactory_logo.png b/web/angular-web/src/main/webapp/app/assets/images/artifactory_logo.png
deleted file mode 100644
index 995f567..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/artifactory_logo.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/artifactory_logo.svg b/web/angular-web/src/main/webapp/app/assets/images/artifactory_logo.svg
deleted file mode 100644
index 7322711..0000000
--- a/web/angular-web/src/main/webapp/app/assets/images/artifactory_logo.svg
+++ /dev/null
@@ -1,297 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="204.694397px" height="36.096386px" viewBox="0 0 204.694397 36.096386"
-	 style="enable-background:new 0 0 204.694397 36.096386;" xml:space="preserve">
-<style type="text/css">
-	.st0{fill:#F7F7F7;}
-	.st1{fill:#373737;}
-	.st2{fill:#50AC59;}
-	.st3{fill:#2C2C2C;}
-	.st4{fill:#6B6B6B;}
-	.st5{fill:none;stroke:#2C2C2C;stroke-miterlimit:10;}
-	.st6{opacity:0.5;fill:#373737;stroke:#413E3E;stroke-miterlimit:10;}
-	.st7{fill:#EAEAEA;}
-	.st8{fill:none;stroke:#6EBA75;stroke-miterlimit:10;}
-	.st9{fill:none;stroke:#4DA454;stroke-miterlimit:10;}
-	.st10{fill:none;stroke:#F7931E;stroke-miterlimit:10;}
-	.st11{filter:url(#Adobe_OpacityMaskFilter);}
-	.st12{mask:url(#SVGID_1_);}
-	.st13{opacity:0.399994;clip-path:url(#SVGID_5_);fill:#FFFFFF;}
-	.st14{filter:url(#Adobe_OpacityMaskFilter_1_);}
-	.st15{mask:url(#SVGID_6_);}
-	.st16{opacity:0.399994;clip-path:url(#SVGID_10_);fill:#FFFFFF;}
-	.st17{filter:url(#Adobe_OpacityMaskFilter_2_);}
-	.st18{mask:url(#SVGID_11_);}
-	.st19{opacity:0.399994;clip-path:url(#SVGID_15_);fill:#FFFFFF;}
-	.st20{filter:url(#Adobe_OpacityMaskFilter_3_);}
-	.st21{mask:url(#SVGID_16_);}
-	.st22{opacity:0.399994;clip-path:url(#SVGID_20_);fill:#FFFFFF;}
-	.st23{filter:url(#Adobe_OpacityMaskFilter_4_);}
-	.st24{mask:url(#SVGID_21_);}
-	.st25{opacity:0.399994;clip-path:url(#SVGID_25_);fill:#FFFFFF;}
-	.st26{filter:url(#Adobe_OpacityMaskFilter_5_);}
-	.st27{mask:url(#SVGID_26_);}
-	.st28{opacity:0.399994;clip-path:url(#SVGID_30_);fill:#FFFFFF;}
-	.st29{filter:url(#Adobe_OpacityMaskFilter_6_);}
-	.st30{mask:url(#SVGID_31_);}
-	.st31{opacity:0.399994;clip-path:url(#SVGID_35_);fill:#FFFFFF;}
-	.st32{filter:url(#Adobe_OpacityMaskFilter_7_);}
-	.st33{mask:url(#SVGID_36_);}
-	.st34{opacity:0.399994;clip-path:url(#SVGID_40_);fill:#FFFFFF;}
-	.st35{filter:url(#Adobe_OpacityMaskFilter_8_);}
-	.st36{mask:url(#SVGID_41_);}
-	.st37{opacity:0.399994;clip-path:url(#SVGID_45_);fill:#FFFFFF;}
-	.st38{filter:url(#Adobe_OpacityMaskFilter_9_);}
-	.st39{mask:url(#SVGID_46_);}
-	.st40{opacity:0.399994;clip-path:url(#SVGID_50_);fill:#FFFFFF;}
-	.st41{filter:url(#Adobe_OpacityMaskFilter_10_);}
-	.st42{mask:url(#SVGID_51_);}
-	.st43{opacity:0.399994;clip-path:url(#SVGID_55_);fill:#FFFFFF;}
-	.st44{filter:url(#Adobe_OpacityMaskFilter_11_);}
-	.st45{mask:url(#SVGID_56_);}
-	.st46{opacity:0.399994;clip-path:url(#SVGID_60_);fill:#FFFFFF;}
-	.st47{filter:url(#Adobe_OpacityMaskFilter_12_);}
-	.st48{mask:url(#SVGID_61_);}
-	.st49{opacity:0.399994;clip-path:url(#SVGID_65_);fill:#FFFFFF;}
-	.st50{filter:url(#Adobe_OpacityMaskFilter_13_);}
-	.st51{mask:url(#SVGID_66_);}
-	.st52{opacity:0.399994;clip-path:url(#SVGID_70_);fill:#FFFFFF;}
-	.st53{filter:url(#Adobe_OpacityMaskFilter_14_);}
-	.st54{mask:url(#SVGID_71_);}
-	.st55{opacity:0.399994;clip-path:url(#SVGID_75_);fill:#FFFFFF;}
-	.st56{filter:url(#Adobe_OpacityMaskFilter_15_);}
-	.st57{mask:url(#SVGID_76_);}
-	.st58{opacity:0.399994;clip-path:url(#SVGID_80_);fill:#FFFFFF;}
-	.st59{filter:url(#Adobe_OpacityMaskFilter_16_);}
-	.st60{mask:url(#SVGID_81_);}
-	.st61{opacity:0.399994;clip-path:url(#SVGID_85_);fill:#FFFFFF;}
-	.st62{filter:url(#Adobe_OpacityMaskFilter_17_);}
-	.st63{mask:url(#SVGID_86_);}
-	.st64{opacity:0.399994;clip-path:url(#SVGID_90_);fill:#FFFFFF;}
-	.st65{filter:url(#Adobe_OpacityMaskFilter_18_);}
-	.st66{mask:url(#SVGID_91_);}
-	.st67{opacity:0.399994;clip-path:url(#SVGID_95_);fill:#FFFFFF;}
-	.st68{filter:url(#Adobe_OpacityMaskFilter_19_);}
-	.st69{mask:url(#SVGID_96_);}
-	.st70{opacity:0.399994;clip-path:url(#SVGID_100_);fill:#FFFFFF;}
-	.st71{filter:url(#Adobe_OpacityMaskFilter_20_);}
-	.st72{mask:url(#SVGID_101_);}
-	.st73{opacity:0.399994;clip-path:url(#SVGID_105_);fill:#FFFFFF;}
-	.st74{filter:url(#Adobe_OpacityMaskFilter_21_);}
-	.st75{mask:url(#SVGID_106_);}
-	.st76{opacity:0.399994;clip-path:url(#SVGID_110_);fill:#FFFFFF;}
-	.st77{filter:url(#Adobe_OpacityMaskFilter_22_);}
-	.st78{mask:url(#SVGID_111_);}
-	.st79{opacity:0.399994;clip-path:url(#SVGID_115_);fill:#FFFFFF;}
-	.st80{filter:url(#Adobe_OpacityMaskFilter_23_);}
-	.st81{mask:url(#SVGID_116_);}
-	.st82{opacity:0.399994;clip-path:url(#SVGID_120_);fill:#FFFFFF;}
-	.st83{filter:url(#Adobe_OpacityMaskFilter_24_);}
-	.st84{mask:url(#SVGID_121_);}
-	.st85{opacity:0.399994;clip-path:url(#SVGID_125_);fill:#FFFFFF;}
-	.st86{filter:url(#Adobe_OpacityMaskFilter_25_);}
-	.st87{mask:url(#SVGID_126_);}
-	.st88{opacity:0.399994;clip-path:url(#SVGID_130_);fill:#FFFFFF;}
-	.st89{filter:url(#Adobe_OpacityMaskFilter_26_);}
-	.st90{mask:url(#SVGID_131_);}
-	.st91{opacity:0.399994;clip-path:url(#SVGID_135_);fill:#FFFFFF;}
-	.st92{filter:url(#Adobe_OpacityMaskFilter_27_);}
-	.st93{mask:url(#SVGID_136_);}
-	.st94{opacity:0.399994;clip-path:url(#SVGID_140_);fill:#FFFFFF;}
-	.st95{filter:url(#Adobe_OpacityMaskFilter_28_);}
-	.st96{mask:url(#SVGID_141_);}
-	.st97{opacity:0.399994;clip-path:url(#SVGID_145_);fill:#FFFFFF;}
-	.st98{filter:url(#Adobe_OpacityMaskFilter_29_);}
-	.st99{mask:url(#SVGID_146_);}
-	.st100{opacity:0.399994;clip-path:url(#SVGID_150_);fill:#FFFFFF;}
-	.st101{filter:url(#Adobe_OpacityMaskFilter_30_);}
-	.st102{mask:url(#SVGID_151_);}
-	.st103{opacity:0.399994;clip-path:url(#SVGID_155_);fill:#FFFFFF;}
-	.st104{filter:url(#Adobe_OpacityMaskFilter_31_);}
-	.st105{mask:url(#SVGID_156_);}
-	.st106{opacity:0.399994;clip-path:url(#SVGID_160_);fill:#FFFFFF;}
-	.st107{filter:url(#Adobe_OpacityMaskFilter_32_);}
-	.st108{mask:url(#SVGID_161_);}
-	.st109{opacity:0.399994;clip-path:url(#SVGID_165_);fill:#FFFFFF;}
-	.st110{filter:url(#Adobe_OpacityMaskFilter_33_);}
-	.st111{mask:url(#SVGID_166_);}
-	.st112{opacity:0.399994;clip-path:url(#SVGID_170_);fill:#FFFFFF;}
-	.st113{filter:url(#Adobe_OpacityMaskFilter_34_);}
-	.st114{mask:url(#SVGID_171_);}
-	.st115{opacity:0.399994;clip-path:url(#SVGID_175_);fill:#FFFFFF;}
-	.st116{filter:url(#Adobe_OpacityMaskFilter_35_);}
-	.st117{mask:url(#SVGID_176_);}
-	.st118{opacity:0.399994;clip-path:url(#SVGID_180_);fill:#FFFFFF;}
-	.st119{filter:url(#Adobe_OpacityMaskFilter_36_);}
-	.st120{mask:url(#SVGID_181_);}
-	.st121{opacity:0.399994;clip-path:url(#SVGID_185_);fill:#FFFFFF;}
-	.st122{filter:url(#Adobe_OpacityMaskFilter_37_);}
-	.st123{mask:url(#SVGID_186_);}
-	.st124{opacity:0.399994;clip-path:url(#SVGID_190_);fill:#FFFFFF;}
-	.st125{filter:url(#Adobe_OpacityMaskFilter_38_);}
-	.st126{mask:url(#SVGID_191_);}
-	.st127{opacity:0.399994;clip-path:url(#SVGID_195_);fill:#FFFFFF;}
-	.st128{fill:#FFFFFF;stroke:#D3D3D3;stroke-miterlimit:10;}
-	.st129{fill:#545454;}
-	.st130{fill:#363636;}
-	.st131{fill:#FFFFFF;}
-	.st132{fill:#F15A24;}
-	.st133{fill:#662D91;}
-	.st134{fill:#4D3380;}
-	.st135{fill:#00A99D;stroke:#F1F1F1;stroke-width:2;stroke-miterlimit:10;}
-	.st136{fill:#22B573;stroke:#F1F1F1;stroke-width:2;stroke-miterlimit:10;}
-	.st137{fill:#373737;stroke:#F1F1F1;stroke-width:2;stroke-miterlimit:10;}
-	.st138{fill:#8CC63F;}
-	.st139{fill:#736558;}
-	.st140{fill:#534741;}
-	.st141{fill:#39B54A;}
-	.st142{fill:#C7B299;}
-	.st143{fill:none;stroke:#F1F1F1;stroke-miterlimit:10;}
-	.st144{fill:#006CAB;}
-	.st145{fill:#006CAB;stroke:#006CAB;stroke-width:0.5;stroke-miterlimit:10;}
-	.st146{fill:#006CAB;stroke:#006CAB;stroke-linecap:round;stroke-miterlimit:10;}
-	.st147{fill:none;stroke:#006CAB;stroke-miterlimit:10;}
-	.st148{fill:none;stroke:#F2F2F2;stroke-miterlimit:10;}
-	.st149{fill:#FFFFFF;stroke:#50AC59;stroke-miterlimit:10;}
-	.st150{fill:none;stroke:#707070;stroke-miterlimit:10;}
-	.st151{fill:#707070;}
-	.st152{fill:none;stroke:#50AC59;stroke-miterlimit:10;}
-	.st153{fill:#E5F4FB;}
-</style>
-<g id="Layer_1">
-</g>
-<g id="main">
-</g>
-<g id="Layer_4">
-</g>
-<g id="notifications">
-</g>
-<g id="grid">
-	<g>
-		<g>
-			<g>
-				<path class="st131" d="M50.128315,7.2315969h3.5186729v13.8777094c0,2.2298431-0.0742912,2.676712-0.2476387,3.3700905
-					c-0.4952698,2.1060257-2.452713,3.4443817-4.0139427,4.0398331l-1.6107559-1.7852249
-					c0.8914871-0.5447979,1.6850471-1.3867588,2.0069733-2.0812626c0.2723999-0.6190891,0.3466911-1.3135929,0.3466911-3.1719837
-					V7.2315969z"/>
-				<path class="st131" d="M55.4580994,7.2811236h9.3426056l-0.3962173,2.8005309h-5.4772415v3.9396524h4.3865242v2.8252945
-					h-4.3865242v7.6080322h-3.4691467V7.2811236z"/>
-				<path class="st131" d="M64.0093994,12.2619705l2.973877-0.7924328c0.2971573,0.5200338,0.4705048,1.0907211,0.5200348,1.8088636
-					c0.4705048-0.6438522,1.264061-1.3135929,1.8831482-1.610755c0.2723999-0.1238184,0.7192688-0.1981087,1.0907211-0.1981087
-					c0.4952698,0,0.7181473,0.0495272,1.2393036,0.2723989l-0.9173737,2.9243479
-					c-0.3219299-0.1733446-0.5943298-0.2476349-0.9669037-0.2476349c-0.7429047,0-1.4115219,0.3466892-2.0317383,1.0648317
-					v8.9711523h-3.3205643v-8.4747562C64.4799042,14.2700682,64.2817993,12.9812384,64.0093994,12.2619705z"/>
-				<path class="st131" d="M76.8976898,11.5190649c1.8088684,0,3.2215118,0.6190882,4.312233,1.907917
-					c1.0153046,1.1897755,1.4621735,2.5776587,1.4621735,4.6341581c0,2.1803169-0.4963989,3.6672535-1.5859909,4.9065552
-					c-0.9669037,1.0907211-2.2309723,1.7593365-4.1884155,1.7593365c-3.4443817,0-5.7001114-2.5765324-5.7001114-6.5668373
-					C71.1975784,14.1710138,73.4780731,11.5190649,76.8976898,11.5190649z M76.9472198,13.9717798
-					c-0.7924347,0-1.4374084,0.4963961-1.7098083,1.2888298c-0.2228775,0.6697407-0.3466949,1.5612288-0.3466949,2.8252935
-					c0,1.4621735,0.1485825,2.5528946,0.4209824,3.1967468c0.2971649,0.6933784,1.0411987,1.0411949,1.6850433,1.0411949
-					c1.4374161,0,2.0565033-1.2888298,2.0565033-4.287468c0-1.7098103-0.2228699-2.8252945-0.6686172-3.3948555
-					C78.062706,14.220541,77.5415421,13.9717798,76.9472198,13.9717798z"/>
-				<path class="st131" d="M95.2125778,11.0485573l1.3878784,2.1060266
-					c-0.7181396,0.6686153-1.4126434,0.9410133-2.3288956,0.9410133c-0.3230515,0-0.4468689-0.0247631-0.8678513-0.0742903
-					c0.4952698,0.5954504,0.7429047,1.2393026,0.7429047,2.0823879c0,2.1803169-1.9822083,3.7663078-4.6836777,3.7663078
-					c-0.1485825,0-0.2476349,0-0.4952774-0.0247631c-0.8419571,0.3962173-1.313591,0.6945038-1.313591,1.0411949
-					c0,0.1733437,0.1981125,0.2971611,0.5459213,0.2971611l1.7841034,0.0247631
-					c1.9326782,0.024765,2.9491119,0.3219261,3.8405991,1.1402493c0.7440338,0.6933784,1.0907211,1.5612278,1.0907211,2.7003498
-					c0,1.065958-0.3219223,1.8842812-1.0164337,2.6271858c-1.114357,1.1897755-3.0233994,1.635519-5.0056076,1.635519
-					c-1.8088608,0-3.6672516-0.297163-4.8075027-1.3631191c-0.6933746-0.6438522-1.0411911-1.3878841-1.0411911-2.2546082
-					c0-0.6945038,0.174469-1.041193,0.2982864-1.2888279h3.0729294c-0.0990524,0.272398-0.149704,0.3714523-0.149704,0.8171959
-					c0,1.0164299,0.8430862,1.5612278,2.3795471,1.5612278c0.9421387,0,1.6602859-0.1238174,2.1060257-0.4209805
-					c0.4716339-0.2971611,0.7935562-0.7924328,0.7935562-1.2888279c0-0.4952717-0.2476349-0.9410152-0.5954514-1.1391239
-					c-0.3466873-0.1733437-0.8171921-0.3230515-1.7345657-0.3725777c-0.1733475,0-0.6438522-0.0247631-1.4126511-0.0247631
-					c-1.4858093-0.024765-2.452713-0.1733456-3.0470428-0.3962173c-0.2982864-0.1238174-0.5459213-0.3466892-0.7192612-0.6190891
-					c-0.1485825-0.2971611-0.2476425-0.6449776-0.2476425-1.041193c0-0.4705067,0.1238174-0.866724,0.3962173-1.1650124
-					c0.3714523-0.4209805,1.1897812-0.7924328,1.9326859-0.9657764c-1.8336258-0.4716339-2.7251129-1.635519-2.7251129-3.5186739
-					c0-2.6024218,2.1060257-4.287468,5.3522949-4.287468c0.7181473,0,1.363121,0.0742912,2.2793732,0.3219261
-					c0.9173737,0.2228718,1.1402435,0.2723989,1.5612259,0.2723989
-					C93.5027695,12.1381531,94.4449081,11.7419367,95.2125778,11.0485573z M88.7200241,13.9717798
-					c-1.264061,0-1.9822083,0.6945047-1.9822083,1.8842802c0,1.2877026,0.7924347,1.8088627,1.9574509,1.8088627
-					c1.313591,0,2.0317307-0.6449776,2.0317307-1.8088627C90.7269974,14.6662846,89.9840927,13.9717798,88.7200241,13.9717798z"/>
-				<path class="st131" d="M104.8309555,7.1820698h3.7426682l5.42659,17.2725639h-3.716774l-1.2145386-4.0893593h-5.0551376
-					l-1.2145386,4.0893593h-3.6177292L104.8309555,7.1820698z M104.8557205,17.4915791h3.3700943
-					c0,0-0.5695648-1.8099899-0.9410172-3.4702721c-0.1733475-0.7924328-0.6945038-3.0481653-0.6945038-3.0481653
-					s-0.4952698,2.0328608-0.8171997,3.3216896C105.4511719,15.5330086,105.228302,16.3513298,104.8557205,17.4915791z"/>
-				<path class="st131" d="M113.879776,12.2619705l2.973877-0.7924328c0.2971573,0.5200338,0.4705048,1.0907211,0.5200348,1.8088636
-					c0.4705048-0.6438522,1.264061-1.3135929,1.8831482-1.610755c0.2723999-0.1238184,0.7192688-0.1981087,1.0907211-0.1981087
-					c0.4952774,0,0.7181473,0.0495272,1.2393036,0.2723989l-0.9173737,2.9243479
-					c-0.3219299-0.1733446-0.5943222-0.2476349-0.9669037-0.2476349c-0.7429047,0-1.4115219,0.3466892-2.0317383,1.0648317
-					v8.9711523h-3.3205643v-8.4747562C114.3502808,14.2700682,114.1521759,12.9812384,113.879776,12.2619705z"/>
-				<path class="st131" d="M129.5179443,11.7419367l-0.8430786,2.20508h-2.1307907v6.4677839
-					c0,1.6107559,0.2971573,2.0328617,1.4374084,2.0328617c0.2971573,0,0.5943222-0.0742912,1.1897812-0.2476349
-					l0.4209747,1.9822063c-0.9669037,0.3962173-1.8336258,0.5695629-2.7014771,0.5695629
-					c-1.6850433,0-3.0481644-0.7429066-3.4196167-1.8583908c-0.1981125-0.5447979-0.2228775-0.7924328-0.2228775-1.9574451
-					v-6.9889441h-1.264061v-2.1555529h1.264061c0-1.2393026,0-2.0812626,0.1238174-3.0234022l3.3700943-0.8419604
-					c-0.1238174,1.1638865-0.1981049,2.5270057-0.1981049,3.8158355H129.5179443z"/>
-				<path class="st131" d="M132.2453156,6.2162919c1.1154785,0,2.0069733,0.9162507,2.0069733,2.056499
-					s-0.9162598,2.0564985-2.0565033,2.0564985c-1.1154785,0-2.0317383-0.9162502-2.0317383-2.0564985
-					S131.1050568,6.2162919,132.2453156,6.2162919z M130.5355072,11.9895716l3.3205566-0.5200338v12.985096h-3.3205566V11.9895716z"
-					/>
-				<path class="st131" d="M142.4816589,8.9414063c-0.7192688-0.3466892-0.9669037-0.4209805-1.3631287-0.4209805
-					c-0.8430786,0-1.3878784,0.5200348-1.3878784,1.4374104v1.7841005h3.2215118l-0.8419647,2.3288975h-2.3547821v10.3837996
-					H136.50914V14.0708342h-1.1402435v-2.3288975h1.2145386c-0.074295-0.5200348-0.1238251-1.1402483-0.1238251-1.7098093
-					c0-2.5033684,1.4869385-3.9407787,4.0893707-3.9407787c1.0895844,0,1.9822083,0.2239976,2.9986267,0.7935586
-					L142.4816589,8.9414063z"/>
-				<path class="st131" d="M142.929657,13.2784014c0.8171844-0.5200348,1.1638794-0.6933794,2.056488-1.041194
-					c1.2393036-0.5200348,2.3041382-0.7429066,3.4691467-0.7429066c2.1319122,0,3.5929718,0.7924337,4.0893707,2.20508
-					c0.1733398,0.5211601,0.2228699,0.9173765,0.2228699,2.2804966l-0.074295,4.2615795c0,0.0742893,0,0.1485806,0,0.2228718
-					c0,1.3631191,0.2228699,1.8842793,1.1897736,2.6024208l-1.7604675,2.0317364
-					c-0.7676697-0.3219261-1.4610443-0.8914871-1.7840881-1.5364647c-0.47052,0.4468689-0.5200348,0.4963951-0.7676697,0.6697407
-					c-0.620224,0.4457436-1.5117035,0.6933784-2.5529022,0.6933784c-2.8252869,0-4.3617554-1.4374104-4.3617554-3.9644165
-					c0-2.973875,2.0576172-4.3617573,6.0963287-4.3617573c0.2476349,0,0.3973389,0,0.7440338,0.0247631v-0.5200348
-					c0-1.4126472-0.2723999-1.8831539-1.4869385-1.8831539c-1.0659637,0-2.3052521,0.5200338-3.6672516,1.436285
-					L142.929657,13.2784014z M149.4469604,18.9042263h-0.1485748c-2.3052673,0-3.097702,0.4209785-3.097702,1.9326801
-					c0,0.9905415,0.6190948,1.6602821,1.4621735,1.6602821c0.6190948,0,1.2381897-0.3219261,1.7345734-0.8678493
-					L149.4469604,18.9042263z"/>
-				<path class="st131" d="M163.5745544,12.8574209l-1.6118774,2.1803169
-					c-0.6686096-0.6190882-1.3867645-0.9916668-2.0069733-0.9916668c-1.4869385,0-2.1555481,1.2888288-2.1555481,4.2627039
-					c0,1.6602821,0.1981049,2.6519489,0.6438446,3.1967468c0.3466949,0.4457436,0.9173737,0.7192688,1.4869385,0.7192688
-					c0.7687988,0,1.4621735-0.3230515,2.2805023-1.0411949l0.1981049-0.1733437l1.5117035,2.0069714
-					c-0.4963989,0.4952698-0.7192688,0.6697407-1.1650085,0.9421387c-0.8926239,0.5200348-1.8831635,0.7924347-3.097702,0.7924347
-					c-3.4939117,0-5.5256348-2.4279518-5.5256348-6.5420761c0-2.9243479,1.1143494-4.857029,2.6012878-5.8734589
-					c0.8430939-0.569562,2.0823975-0.9410143,3.1472168-0.9410143c0.8430939,0,1.7345734,0.2228718,2.4538422,0.569561
-					C162.8057556,12.2124434,163.0286407,12.385788,163.5745544,12.8574209z"/>
-				<path class="st131" d="M171.8286896,11.7419367l-0.8430786,2.20508h-2.1307983v6.4677839
-					c0,1.6107559,0.2971649,2.0328617,1.4374237,2.0328617c0.2971497,0,0.5943146-0.0742912,1.1897736-0.2476349
-					l0.4209747,1.9822063c-0.9669037,0.3962173-1.8336334,0.5695629-2.7014771,0.5695629
-					c-1.6850433,0-3.048172-0.7429066-3.4196167-1.8583908c-0.1981049-0.5447979-0.2228699-0.7924328-0.2228699-1.9574451
-					v-6.9889441h-1.2640686v-2.1555529h1.2640686c0-1.2393026,0-2.0812626,0.1238098-3.0234022l3.3701019-0.8419604
-					c-0.1238251,1.1638865-0.1981201,2.5270057-0.1981201,3.8158355H171.8286896z"/>
-				<path class="st131" d="M177.8023376,11.5190649c1.8088531,0,3.2215118,0.6190882,4.3122253,1.907917
-					c1.0153046,1.1897755,1.4621735,2.5776587,1.4621735,4.6341581c0,2.1803169-0.4963989,3.6672535-1.5859833,4.9065552
-					c-0.9669037,1.0907211-2.2309723,1.7593365-4.1884155,1.7593365c-3.4443817,0-5.700119-2.5765324-5.700119-6.5668373
-					C172.1022186,14.1710138,174.3827209,11.5190649,177.8023376,11.5190649z M177.8518524,13.9717798
-					c-0.7924194,0-1.4374084,0.4963961-1.7098083,1.2888298c-0.2228699,0.6697407-0.3466797,1.5612288-0.3466797,2.8252935
-					c0,1.4621735,0.1485748,2.5528946,0.4209747,3.1967468c0.2971649,0.6933784,1.0411987,1.0411949,1.6850433,1.0411949
-					c1.4374084,0,2.0565033-1.2888298,2.0565033-4.287468c0-1.7098103-0.2228699-2.8252945-0.6686096-3.3948555
-					C178.9673462,14.220541,178.4461823,13.9717798,177.8518524,13.9717798z"/>
-				<path class="st131" d="M184.4952393,12.2619705l2.973877-0.7924328
-					c0.2971649,0.5200338,0.4705048,1.0907211,0.5200348,1.8088636c0.4705048-0.6438522,1.2640686-1.3135929,1.8831482-1.610755
-					c0.2723999-0.1238184,0.7192688-0.1981087,1.0907288-0.1981087c0.4952698,0,0.7181396,0.0495272,1.2393036,0.2723989
-					l-0.9173737,2.9243479c-0.3219299-0.1733446-0.5943298-0.2476349-0.9669037-0.2476349
-					c-0.7429199,0-1.4115295,0.3466892-2.0317383,1.0648317v8.9711523h-3.3205719v-8.4747562
-					C184.965744,14.2700682,184.7676392,12.9812384,184.4952393,12.2619705z"/>
-				<path class="st131" d="M192.1302948,11.9895716l3.3948517-0.3962164l2.2062073,7.3851604
-					c0.2228699,0.7676697,0.6686096,2.6260605,0.6686096,2.6260605s0.2476349-1.4126472,0.3962097-2.0317345
-					c0.1981201-0.79356,0.2476501-0.9173775,0.4963989-1.7593365l1.9079285-6.0220413h3.4938965l-4.6093903,12.8612785
-					c-0.8667145,2.4538403-1.5117035,3.5186729-2.427948,4.1884136c-0.8430939,0.6190872-1.9338074,1.0153046-3.072937,1.1638851
-					l-1.1402435-2.180315c0.7181396-0.1981087,1.5612335-0.4952717,2.0565033-0.8419609
-					c0.3714447-0.2735252,0.6697388-0.6202145,0.9421387-1.0411949c0.3219299-0.5200329,0.4209747-0.74403,0.7181396-1.4869366
-					h-0.8419647c-0.1981049-0.5943241-0.2982788-0.8430862-0.5211487-1.4869385
-					c-0.2476349-0.7676678-0.6438599-2.0317345-0.6686249-2.0812607L192.1302948,11.9895716z"/>
-			</g>
-		</g>
-		<g>
-			<path class="st131" d="M13.9886475,27.9772968C6.2751646,27.9772968,0,21.7021332,0,13.9886503
-				S6.2751646,0.0000028,13.9886475,0.0000028s13.9886475,6.2751646,13.9886475,13.9886475
-				S21.7021294,27.9772968,13.9886475,27.9772968z M13.9886475,2.480721c-6.3457656,0-11.5079288,5.1621637-11.5079288,11.5079288
-				s5.1621637,11.5079298,11.5079288,11.5079298s11.5079288-5.1621647,11.5079288-11.5079298
-				S20.3344135,2.480721,13.9886475,2.480721z"/>
-			<rect x="0.1894346" y="33.6157303" class="st131" width="27.8174973" height="2.4807181"/>
-		</g>
-	</g>
-</g>
-</svg>
diff --git a/web/angular-web/src/main/webapp/app/assets/images/blackduck_logo.png b/web/angular-web/src/main/webapp/app/assets/images/blackduck_logo.png
deleted file mode 100644
index 455ee90..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/blackduck_logo.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/build.png b/web/angular-web/src/main/webapp/app/assets/images/build.png
deleted file mode 100755
index d7db757..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/build.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/checkbox.png b/web/angular-web/src/main/webapp/app/assets/images/checkbox.png
deleted file mode 100644
index 07e83e5..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/checkbox.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/checkbox_checked.png b/web/angular-web/src/main/webapp/app/assets/images/checkbox_checked.png
deleted file mode 100644
index a383a3f..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/checkbox_checked.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/delete-recursive.png b/web/angular-web/src/main/webapp/app/assets/images/delete-recursive.png
deleted file mode 100644
index c4db028..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/delete-recursive.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/delete.png b/web/angular-web/src/main/webapp/app/assets/images/delete.png
deleted file mode 100644
index f472b41..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/delete.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/deploy.png b/web/angular-web/src/main/webapp/app/assets/images/deploy.png
deleted file mode 100644
index ddf2e5a..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/deploy.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/download.png b/web/angular-web/src/main/webapp/app/assets/images/download.png
deleted file mode 100644
index cdfe376..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/download.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/downloaded.png b/web/angular-web/src/main/webapp/app/assets/images/downloaded.png
deleted file mode 100644
index 1665d59..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/downloaded.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/favicon-old.ico b/web/angular-web/src/main/webapp/app/assets/images/favicon-old.ico
deleted file mode 100644
index 233ecbe..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/favicon-old.ico and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/favicon.ico b/web/angular-web/src/main/webapp/app/assets/images/favicon.ico
deleted file mode 100644
index a248e33..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/favicon.ico and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/file.png b/web/angular-web/src/main/webapp/app/assets/images/file.png
deleted file mode 100644
index ffd22db..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/file.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/folder-closed.png b/web/angular-web/src/main/webapp/app/assets/images/folder-closed.png
deleted file mode 100644
index 9c8489c..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/folder-closed.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/folder.png b/web/angular-web/src/main/webapp/app/assets/images/folder.png
deleted file mode 100644
index fdad546..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/folder.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/footer-icon.png b/web/angular-web/src/main/webapp/app/assets/images/footer-icon.png
deleted file mode 100644
index bf328c3..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/footer-icon.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/grid-row-not-selected-hover.png b/web/angular-web/src/main/webapp/app/assets/images/grid-row-not-selected-hover.png
deleted file mode 100644
index 7979be4..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/grid-row-not-selected-hover.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/grid-row-not-selected.png b/web/angular-web/src/main/webapp/app/assets/images/grid-row-not-selected.png
deleted file mode 100644
index 9394a76..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/grid-row-not-selected.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/grid-row-selected.png b/web/angular-web/src/main/webapp/app/assets/images/grid-row-selected.png
deleted file mode 100644
index 6ab5a21..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/grid-row-selected.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/grid_checkbox.png b/web/angular-web/src/main/webapp/app/assets/images/grid_checkbox.png
deleted file mode 100644
index 3ace37f..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/grid_checkbox.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/home.png b/web/angular-web/src/main/webapp/app/assets/images/home.png
deleted file mode 100755
index 2ce349e..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/home.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/animated-overlay.gif b/web/angular-web/src/main/webapp/app/assets/images/jqueryui/animated-overlay.gif
deleted file mode 100755
index d441f75..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/animated-overlay.gif and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-bg_flat_0_aaaaaa_40x100.png b/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-bg_flat_0_aaaaaa_40x100.png
deleted file mode 100644
index 2991f73..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-bg_flat_0_aaaaaa_40x100.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-bg_flat_75_ffffff_40x100.png b/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-bg_flat_75_ffffff_40x100.png
deleted file mode 100644
index eacaf60..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-bg_flat_75_ffffff_40x100.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-bg_glass_55_fbf9ee_1x400.png b/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-bg_glass_55_fbf9ee_1x400.png
deleted file mode 100644
index a7d19c4..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-bg_glass_55_fbf9ee_1x400.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-bg_glass_65_ffffff_1x400.png b/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-bg_glass_65_ffffff_1x400.png
deleted file mode 100644
index f89e88c..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-bg_glass_65_ffffff_1x400.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-bg_glass_75_dadada_1x400.png b/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-bg_glass_75_dadada_1x400.png
deleted file mode 100644
index bf5c20d..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-bg_glass_75_dadada_1x400.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-bg_glass_75_e6e6e6_1x400.png b/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-bg_glass_75_e6e6e6_1x400.png
deleted file mode 100644
index 3e4e6ec..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-bg_glass_75_e6e6e6_1x400.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-bg_glass_95_fef1ec_1x400.png b/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-bg_glass_95_fef1ec_1x400.png
deleted file mode 100644
index d6f3392..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-bg_glass_95_fef1ec_1x400.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-bg_highlight-soft_75_cccccc_1x100.png b/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-bg_highlight-soft_75_cccccc_1x100.png
deleted file mode 100644
index 0071c4d..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-bg_highlight-soft_75_cccccc_1x100.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-icons_222222_256x240.png b/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-icons_222222_256x240.png
deleted file mode 100644
index 82fad68..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-icons_222222_256x240.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-icons_2e83ff_256x240.png b/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-icons_2e83ff_256x240.png
deleted file mode 100644
index 429489e..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-icons_2e83ff_256x240.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-icons_454545_256x240.png b/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-icons_454545_256x240.png
deleted file mode 100644
index 2df9132..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-icons_454545_256x240.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-icons_888888_256x240.png b/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-icons_888888_256x240.png
deleted file mode 100644
index ad48782..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-icons_888888_256x240.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-icons_cd0a0a_256x240.png b/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-icons_cd0a0a_256x240.png
deleted file mode 100644
index f51e31d..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/jqueryui/ui-icons_cd0a0a_256x240.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/more-tabs-arrow.png b/web/angular-web/src/main/webapp/app/assets/images/more-tabs-arrow.png
deleted file mode 100644
index b11ba30..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/more-tabs-arrow.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/node-closed-2.png b/web/angular-web/src/main/webapp/app/assets/images/node-closed-2.png
deleted file mode 100644
index dd92ffd..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/node-closed-2.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/node-closed-light.png b/web/angular-web/src/main/webapp/app/assets/images/node-closed-light.png
deleted file mode 100644
index 7fd25bc..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/node-closed-light.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/node-closed.png b/web/angular-web/src/main/webapp/app/assets/images/node-closed.png
deleted file mode 100644
index d6d65a1..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/node-closed.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/node-opened-2.png b/web/angular-web/src/main/webapp/app/assets/images/node-opened-2.png
deleted file mode 100644
index 09ac4fc..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/node-opened-2.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/node-opened-light.png b/web/angular-web/src/main/webapp/app/assets/images/node-opened-light.png
deleted file mode 100644
index 47b558d..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/node-opened-light.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/node-opened.png b/web/angular-web/src/main/webapp/app/assets/images/node-opened.png
deleted file mode 100644
index 5b88e61..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/node-opened.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/sample.png b/web/angular-web/src/main/webapp/app/assets/images/sample.png
deleted file mode 100644
index 4815573..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/sample.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/search.png b/web/angular-web/src/main/webapp/app/assets/images/search.png
deleted file mode 100644
index 4a5e56f..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/search.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/set-me-up.png b/web/angular-web/src/main/webapp/app/assets/images/set-me-up.png
deleted file mode 100644
index aca3cfe..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/set-me-up.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/throbber.gif b/web/angular-web/src/main/webapp/app/assets/images/throbber.gif
deleted file mode 100644
index 1b5b2fd..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/throbber.gif and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/tooltip.png b/web/angular-web/src/main/webapp/app/assets/images/tooltip.png
deleted file mode 100644
index 85e6c33..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/tooltip.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/tooltips-icon.png b/web/angular-web/src/main/webapp/app/assets/images/tooltips-icon.png
deleted file mode 100644
index f0834e0..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/tooltips-icon.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/tree-spinner.gif b/web/angular-web/src/main/webapp/app/assets/images/tree-spinner.gif
deleted file mode 100644
index 9b3486c..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/tree-spinner.gif and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/tree_cache.png b/web/angular-web/src/main/webapp/app/assets/images/tree_cache.png
deleted file mode 100755
index 89e382d..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/tree_cache.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/tree_file.png b/web/angular-web/src/main/webapp/app/assets/images/tree_file.png
deleted file mode 100755
index b142491..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/tree_file.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/tree_folder.png b/web/angular-web/src/main/webapp/app/assets/images/tree_folder.png
deleted file mode 100755
index a886b6f..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/tree_folder.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/tree_repo.png b/web/angular-web/src/main/webapp/app/assets/images/tree_repo.png
deleted file mode 100755
index 984e30e..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/tree_repo.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/tree_virtual.png b/web/angular-web/src/main/webapp/app/assets/images/tree_virtual.png
deleted file mode 100755
index 16d73e4..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/tree_virtual.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/images/view.png b/web/angular-web/src/main/webapp/app/assets/images/view.png
deleted file mode 100644
index 24091d9..0000000
Binary files a/web/angular-web/src/main/webapp/app/assets/images/view.png and /dev/null differ
diff --git a/web/angular-web/src/main/webapp/app/assets/stylesheets/admin.less b/web/angular-web/src/main/webapp/app/assets/stylesheets/admin.less
deleted file mode 100644
index 1e96dc3..0000000
--- a/web/angular-web/src/main/webapp/app/assets/stylesheets/admin.less
+++ /dev/null
@@ -1,1051 +0,0 @@
-.btn-test-fix {
-  padding-top: 25px;
-}
-
-.scroll-auto {
-  overflow: auto;
-}
-
-.admin-wrapper {
-  height: 100%;
-  overflow: auto;
-
-  .admin-panel {
-    padding: 10px 28px;
-    .glow(8px);
-    background: #fff;
-
-    .form-group {
-      padding-left: 23px;
-      padding-right: 15px;
-      margin-bottom: 27px;
-    }
-
-    .input-text {
-      width: 380px;
-      //margin-right: 19px;
-    }
-
-    .admin-actions {
-      margin-right: 5px;
-      margin-top: 0;
-    }
-
-    .label-wight {
-      font-weight: 100;
-    }
-  }
-
-}
-
-.mail-experiment {
-  .form-group {
-    margin-bottom: 15px !important;
-  }
-
-}
-
-.filter-group {
-  .btn {
-    margin-left: 5px;
-  }
-}
-
-.ldap-settings {
-  .ldap-buttons {
-    margin-top: 40px;
-  }
-
-}
-
-.ldap-groups-modal {
-  .selectize-dropdown-content {
-    .option {
-      height: 30px;
-      line-height: 26px;
-    }
-  }
-}
-
-//----------signing keys--------------//
-.signing-keys {
-  .default-link {
-    font-size: 16px;
-    position: relative;
-    top: 2px;
-    left: 6px;
-    
-    &.icon-clear:hover {
-      color: @redError;
-    }
-  }
-}
-
-.general-conf {
-  .artifactory-logo {
-    padding-bottom: 10px;
-    background-color: @greenBGDark;
-    font-size: 0;
-    height: 60px;
-    line-height: 60px;
-    padding-left: 30px;
-
-    img {
-      max-height: 50px;
-    }
-  }
-  .cb-sep {
-    display: inline-block;
-    width: 50px;
-  }
-}
-
-//-----------------descriptors-----------------------------//
-body.admin-advanced-config_descriptor, body.admin-advanced-security_descriptor {
-  .content-wrapper {
-    top: 88px;
-  }
-
-  .field-bottom-remark {
-    margin: -5px 0 0 38px;
-
-    i {
-      margin-top: 1px;
-      font-size: 16px;
-    }
-  }
-}
-
-//-----------------permissions-----------------------------//
-.slice {
-  display: inline-block;
-  .permission-tabs {
-    //  border: solid 1px #eee;
-    //  width: 18%;
-    //  padding: 8px;
-
-    display: inline-block;
-    background-color: #999;
-    padding: 0 8px 0 8px;
-    color: #fff;
-    position: relative;
-    height: 30px;
-    line-height: 30px;
-    vertical-align: top;
-    float: left;
-
-    &.active {
-      background: @greenBGSmall;
-    }
-  }
-
-  .tab-head-first {
-    border: 1px solid #eee;
-    border-bottom: 0px;
-    border-left: 0;
-    height: 30px;
-    width: 30px;
-  }
-  .tab-head {
-    display: inline-block;
-    border: 15px solid transparent;
-    border-left-width: 15px;
-    border-right-width: 0px;
-    z-index: 10;
-    position: relative;
-    border-left-color: #999;
-    vertical-align: top;
-    float: left;
-  }
-}
-
-//
-//.tab-head {
-//  border: 1px solid #eee;
-//  border-bottom: 0;
-//  border-left: 0;
-//  height: 30px;
-//  width: 30px;
-//  position: absolute;
-//  display: inline-block;
-//
-//  transform: rotate(45deg);
-//  &.first {
-//    margin-left: 130px;
-//  }
-//
-//  &.second {
-//    margin-left: 150px;
-//  }
-//  &.third {
-//    margin-left: 180px;
-//  }
-//}
-.text-area-permissions {
-  height: 67px;
-}
-
-//.list-groups-item-permissions {
-//  position: relative;
-//  display: block;
-//  padding: 10px 15px;
-//  margin-bottom: -1px;
-//  background-color: #fff;
-//}
-
-.logo-type-title {
-  color: @grayFontDarker;
-}
-
-.logo-type-selection {
-  color: @grayFontLighter;
-  padding: 0 10px;
-
-  &.active {
-    color: @greenBGDark;
-    font-weight: 400;
-    text-decoration: none;
-  }
-
-  &:hover {
-    text-decoration: none;
-  }
-}
-
-.group-list-wrapper {
-  border: 1px solid @grayBorderLighter;
-  margin: 10px 0 10px;
-
-  .permissions-form & {
-    overflow: auto;
-    height: 282px;
-  }
-}
-
-.group-list {
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-
-  .group-list-item {
-    display: block;
-    padding: 10px 15px;
-
-    &:nth-child(odd) {
-      background-color: @grayGridRow;
-    }
-    &:nth-child(even) {
-      background-color: @white;
-    }
-    .permissions-form &:hover {
-      background-color: @grayGridRowHover;
-    }
-  }
-  
-  &.with-actions {
-    .group-list-item {
-      position: relative;
-    }
-    
-    .group-list-actions {
-      position: absolute;
-      right: 0;
-      top: 0;
-      
-      .btn {
-        min-width: initial;
-        
-        i {
-          font-size: 18px;
-          
-          &:before {
-            line-height: 40px;
-          }
-        }
-        
-        &:hover .icon-clear:before {
-          color: @redError;
-        }
-      }
-    }
-  }
-}
-
-// ------------------------ Wizard ------------------------- //
-.wizard-container {
-  border: 1px solid #ccc;
-  position: absolute;
-  left: 20px;
-  right: 20px;
-  top: 15px;
-  bottom: 15px;
-
-  .wizard-content {
-    padding: 20px 30px;
-    position: absolute;
-    top: 38px;
-    bottom: 0;
-    left: 0;
-    right: 0;
-    overflow: auto;
-
-    .smart-repo-ind {
-      margin: 80px 0 0 80px;
-    }
-  }
-
-  .wizard-tabs {
-    border-bottom: 1px solid #ccc;
-
-    li {
-      position: relative;
-      display: inline-block;
-      font-size: 20px;
-      line-height: 37px;
-      padding: 0;
-      margin: 0 -3px 0 0;
-      width: 250px;
-      text-align: center;
-      cursor: pointer;
-
-      &.active {
-        background-color: @grayBGLight;
-        color: @greenFontHeader;
-
-        &:after {
-          border-left-color: @grayBGLight;
-        }
-      }
-
-      &:after, &:before {
-        left: 100%;
-        top: 50%;
-        border: solid transparent;
-        content: " ";
-        height: 0;
-        width: 0;
-        position: absolute;
-        z-index: 10;
-        pointer-events: none;
-      }
-
-      &:after {
-        border-color: rgba(136, 183, 213, 0);
-        border-left-color: #fff;
-        border-width: 19px;
-        margin-top: -19px;
-        border-left-width: 8px;
-        margin-left: -1px;
-      }
-      &:before {
-        border-color: rgba(194, 225, 245, 0);
-        border-left-color: #ccc;
-        border-width: 20px;
-        margin-top: -20px;
-        border-left-width: 8px;
-      }
-
-      .license-required {
-        position: absolute;
-        right: 0;
-      }
-    }
-  }
-
-  .grid-container {
-    margin-top: 0;
-  }
-}
-
-.wizard-pager {
-  display: inline-block;
-  margin-right: 20px;
-
-  a {
-    color: @grayFontGeneral;
-    margin-right: 10px;
-
-    &:hover {
-      color: @greenFontHeader;
-    }
-
-    &[disabled] {
-      pointer-events: none;
-      color: @grayFontLighter;
-      cursor: default;
-    }
-  }
-}
-
-// ------------------------------------------------------ //
-
-.slice {
-  display: inline-block;
-  width: 18%;
-
-}
-
-.slice .head {
-  display: inline-block;
-  border: 20px solid transparent;
-  border-left-width: 8px;
-  border-right-width: 0px;
-  z-index: 10;
-  position: relative;
-  border-left-color: #999;
-  vertical-align: top;
-  float: left;
-
-  &.active {
-    border-left-color: @greenBGDark;
-  }
-}
-
-.slice .body {
-  display: inline-block;
-  background-color: #999;
-  padding: 0 8px 0 8px;
-  color: #fff;
-  position: relative;
-  height: 40px;
-  line-height: 40px;
-  vertical-align: top;
-  width: 89%;
-  float: left;
-
-  &.active {
-    background: @greenBGDark;
-  }
-}
-
-.slice .tail {
-  display: inline-block;
-  background-color: #999;
-  border: 20px solid transparent;
-  border-left-width: 15px;
-  border-right-width: 0px;
-  border-left-color: #fff;
-  vertical-align: top;
-  float: left;
-  margin-left: -15px;
-
-  &.active {
-    background: @greenBGDark;
-  }
-}
-
-.slice.tail-head {
-  margin-left: -15px;
-}
-
-//**************repository wizard **************//
-.label-type-box {
-}
-
-.type-box {
-  height: 100px;
-  width: 100px;
-  background: #EEEEEE;
-  line-height: 80px;
-  text-align: center;
-  color: @grayPlaceholderLight;
-  cursor: pointer;
-  margin-top: 10px;
-
-  span {
-    display: inline-block;
-  }
-
-  &.typeValidation {
-    border: 1px solid #d7593f;
-  }
-}
-
-.cron-wrapper {
-  width: 400px !important;
-}
-
-.refresh-cron {
-  font-size: 25px;
-  vertical-align: middle;
-}
-
-.property-set-advanced {
-  .clear-all-btn {
-    display: none;
-  }
-}
-
-.admin-grid-buttons {
-  margin-right: 10px;
-
-  a {
-    float: left;
-    color: @grayFontGeneral;
-    margin-left: 20px;
-    font-size: 16px;
-    cursor: pointer;
-
-    &:hover {
-      text-decoration: none;
-      color: @greenFontHeader;
-    }
-
-    .grid-button-icon {
-      float: left;
-      font-size: 18px;
-      margin: 1px 8px 0 0;
-    }
-
-    &[disabled] {
-      &, & .grid-button-icon:before {
-        cursor: not-allowed;
-        color: @grayFontLighter;
-      }
-    }
-  }
-  &.replications-admin-grid-buttons {
-    margin-bottom: -26px;
-    position: relative;
-    z-index: 2;
-  }
-}
-
-.monospaced {
-  font-family: "Courier New", Courier, monospace;
-}
-
-.system-logs {
-  #textarea {
-    background-color: #fff;
-  }
-
-  .fill-screen {
-    background-color: #b4a;
-    position: absolute;
-    top: 160px;
-    bottom: 20px;
-    left: 20px;
-    right: 20px;
-
-    textarea {
-      height: 100%;
-    }
-  }
-
-  .icon-hourglass {
-    margin-top: 10px;
-  }
-}
-
-.card .row, .modal-body {
-  .form-group-cell, .grid-filter .input-text {
-    @media screen and (min-width: 1900px) {
-      width: 360px !important;
-    }
-    @media screen and (min-width: 1680px) and (max-width: 1900px) {
-      width: 280px !important;
-    }
-    @media screen and (max-width: 1679px) {
-      margin-bottom: 27px;
-    }
-  }
-
-  .form-group {
-    @media screen and (max-width: 1679px) {
-      margin-bottom: 0;
-    }
-  }
-
-  .form-group-cell {
-    &:last-child {
-      margin-right: 0;
-    }
-  }
-  .panel {
-    .form-group-cell {
-      &.select-240 {
-        width: 240px !important;
-      }
-    }
-  }
-}
-
-.radio-select-list {
-  list-style-type: none;
-
-  li {
-    display: inline-block;
-    margin-right: 10px;
-  }
-
-  input {
-    float: left;
-    margin: 4px 8px 0 0;
-  }
-}
-
-#package-description {
-  min-height: 20px;
-}
-.modal .repository-type-modal {
-  .modal-body {
-    padding: 28px 34px 20px;
-  }
-  .form-group-cell {margin-left: 10px;}
-  .modal-footer {padding: 20px 45px;}
-}
-#package-type-filter {width: 240px;}
-
-.package-type {
-  position: relative;
-  color: @grayFontLighter;
-  background: @grayBGLight;
-  height: 100px;
-  width: 100px;
-  margin: 10px;
-  text-align: center;
-  cursor: pointer;
-  font-size: 12px;
-  font-weight: 700;
-  transition: 0.5s all;
-
-  .repotitle {
-    position: absolute;
-    width: 100%;
-    bottom: 7px;
-  }
-
-  span {
-    line-height: 100px;
-  }
-
-  .wizard-content & {
-    margin: 0;
-  }
-
-  .modal-content &.package-highlight,
-  .modal-content &:hover {
-    box-shadow: 0 1px 6px 1px rgba(0, 0, 0, 0.30);
-    transform: scale(1.10,1.10);
-  }
-  .modal-content &.package-highlight.package-selected {
-    animation: highlightPackageType .5s ease-in forwards;
-  }
-
-  &.not-clickable {
-    cursor: default;
-  }
-
-  &.license-required::after {
-    top: 2px;
-  }
-}
-.licenses-management {
-  .grid-container .ui-grid .ui-grid-cell-contents a {padding-left: 0;}
-}
-.repotype.iconrepo {
-  width: 70px;
-  height: 70px;
-  background-position: center center;
-  background-size: auto 75%;
-
-  .package-type & {
-    position: absolute;
-    left: 50%;
-    margin-left: -35px;
-    top: 5px;
-  }
-}
-
-.repository-error {
-  color: #d7593f;
-}
-
-.repo-layout-form {
-  .repo-association {
-    i {
-      margin: 0px 10px;
-    }
-    margin: 0px 15px;
-  }
-}
-
-.grid-container .item.noreplication {
-  border: 1px #eee solid !important;
-  cursor: auto;
-}
-
-.permissions-form {
-  .wizard-container {
-    top: 100px;
-  }
-}
-
-.jf-reveal-input {
-  cursor: pointer;
-}
-
-.text-button-group {
-  .text-button {
-    display: inline-block;
-    margin: 0 20px 0 0;
-    padding: 0;
-  }
-  
-  &.pull-right {
-    .text-button {
-      margin: 0 0 0 20px;
-    }
-  }
-  
-  &.grey {
-    .text-button {
-      color: @grayFontGeneral;
-      
-      &:hover {
-        color: @greenFontHeader;
-      }
-    }
-  }
-}
-
-.text-button {
-  display: inline-block;
-  font-size: 16px;
-  color: @greenFontHeader;
-  cursor: pointer;
-  padding: 4px 0;
-
-  span {
-    position: relative;
-    top: 6px;
-    margin-right: 8px;
-    font-size: 24px;
-  }
-
-  &:hover {
-    color: #327535;
-  }
-  
-  &[disabled] {
-    color: @grayFontLighter !important;
-    cursor: default;
-  }
-  
-  &.warning-button {
-    &:hover {
-      color: @redError;
-    }
-  }
-  
-  .form-button & {
-    padding: 0;
-  }
-}
-.input-help-text {
-  font-size: 11px;
-}
-.info-box {
-  color: #bbb;
-  margin-bottom: 15px;
-}
-
-.repo-visibility {
-  .jf-switch {
-    .jf-switch-option {
-      &.disabled {
-        cursor: default;
-      }
-    }
-  }
-  .license-required {
-    &::after {
-      display: inline-block;
-      position: static;
-      width: 10px;
-    }
-  }
-}
-/******************** High Availability ***********************/
-.ha-heartbeat-stale {
-  color: @redError;
-
-  .icon {
-    font-size: 18px;
-    float: left;
-    top: 4px;
-    margin: 2px 5px 0 0;
-  }
-}
-
-/******************** Support Page ***********************/
-
-.form-calendar {
-  position: relative;
-  
-  input {
-    cursor: pointer;
-  }
-  
-  i.icon {
-    font-size: 20px;
-    position: absolute;
-    top: 34px;
-    right: 14px;
-    pointer-events: none;
-  }
-}
-
-.key-installed {
-  color: @blueFontDark;
-}
-
-/******************** Reverse Proxy Page ***********************/
-
-.icon-reverse {
-  width: 40px;
-  height: 40px;
-  float: left;
-  background-position: 0 center;
-  margin-right: 10px;
-}
-
-/******************** Storage Summary Page ***********************/
-
-.storage-multiple-mounts {
-  line-height: 24px;
-  padding-top: 4px;
-}
-
-/******************** JF List Maker ***********************/
-
-.jf-list-maker {
-  .form-group {
-    margin-bottom: 10px;
-  }
-  div.jf-validation {
-    height: 22px;
-    line-height: 22px;
-    padding-left: 3px;
-  }
-  .form-group-cell {
-    &.auto-width {
-      width: auto !important;
-      margin-right: 0 !important;
-    }
-    
-    &.list-new-value {
-      //width: 335px !important;
-      width: 100% !important;
-      margin-right: 10px;
-      position: relative;
-      .jf-field {
-        position: relative;
-      }
-      .form-button {
-        margin-top: 0;
-        position: absolute;
-        right: 15px;
-        top: 25px;
-        i {
-          font-size: 16px;
-        }
-      }
-      .card .row & , .modal-body & {
-        @media screen and (min-width: 1900px) {
-          //width: 315px !important;
-        }
-
-        @media screen and (min-width: 1680px) and (max-width: 1900px) {
-          //width: 235px !important;
-        }
-      }
-    }
-  }
-
-  #property-set-list {
-    width: 380px;
-    border: 1px solid #e4e4e4;
-    .property-set-row div.property-set-buttons {
-      padding-right: 15px;
-    }
-    .card .row & , .modal-body & {
-      @media screen and (min-width: 1900px) {
-        width: 360px;
-      }
-
-      @media screen and (min-width: 1680px) and (max-width: 1900px) {
-        width: 280px !important;
-      }
-    }
-  }
-  
-  .icon {
-    line-height: 42px;
-    font-size: 26px;
-    color: #999;
-    
-    &[disabled] {
-      color: #ddd;
-      cursor: default;
-    }
-    &:not([disabled]):hover {
-      color: @greenFontHeader;
-      cursor: pointer;
-    }
-  }
-}
-
-
-.user-actions {
-  margin: 28px 50px 20px 30px;
-}
-
-.retrieve-token {
-  margin-top: 20px;
-  i {vertical-align: middle;}
-  a, i:before {color: @blueLinkBasic;}
-  a:hover, a:hover i:before {
-      color: darken(@blueLinkBasic, 10%);
-  }
-}
-input#clientId[readonly],
-input#organizationName[readonly] {
-  background: @grayBGLighter;
-  cursor: default;
-  &:focus {
-    border-color: @grayBorderLighter;
-    color: @grayFontGeneral;
-  }
-}
-.rules-popup {
-  .panel-heading {
-    margin-left: -10px;
-  }
-}
-.register-to-bintray {
-    color: @greenFontDark;
-  i {vertical-align: middle;}
-}
-
-.available-tokens {
-  font-family: "Lucida Console", Monaco, monospace;
-  font-size: 13px;
-  color: #424242;
-  ul {
-    list-style: none;
-  }
-}
-
-.docker-popup {
-  h1 {font-weight: 700; font-size: 18px;}
-  .text-center {margin-bottom: 25px;}
-  .snippet-wrapper {margin: 0 0 20px;}
-  .CodeMirror-wrap {margin-bottom: 10px;}
-}
-.new-docker {
-  margin: 25px 0 40px;
-  .artilogo,
-  .dockerlogo {
-    width: 100px;
-    height: 100px;
-    position: relative;
-    z-index: 2;
-  }
-
-  .artilogo {
-    background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMTAxIDEwMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMTAxIDEwMTsiIHhtbDpzcGFjZT0icHJlc2VydmUiPjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LnN0MHtmaWxsOiNFNkU3RTg7c3Ryb2tlOiNCQ0JFQzA7c3Ryb2tlLW1pdGVybGltaXQ6MTA7fS5z [...]
-
-  }
-  .dockerlogo {
-    background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMTAxIDEwMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMTAxIDEwMTsiIHhtbDpzcGFjZT0icHJlc2VydmUiPjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LnN0MHtmaWxsOiNFNkU3RTg7c3Ryb2tlOiNCQ0JFQzA7c3Ryb2tlLW1pdGVybGltaXQ6MTA7fS5z [...]
-  }
-  & > div {
-    display: inline-block;
-  }
-  .docker-container {
-    width: 260px;
-    height: 100px;
-    position: relative;
-    .cont {
-      background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgNDkgMjQiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQ5IDI0OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4uc3Qwe29wYWNpdHk6MC44Mzt9LnN0MXtmaWxsOiNGRkZGRkY7fS5zdDJ7ZmlsbDojMzFCM0QzO30uc3 [...]
-      background-repeat: no-repeat;
-      width: 47px;
-      height: 22px;
-      position: absolute;
-      &:first-child {
-        top: 22px;
-        animation: containerAnim 3s linear infinite;
-      }
-      &:last-child {
-        bottom: 18px;
-        animation: containerAnimReverse 3s linear infinite;
-      }
-    }
-    .sep {
-      height: 50%;
-      border-bottom: 2px dashed #e8e8ea;
-      position: relative;
-      bottom: -2px;
-      margin: 0 5px;
-    }
-  }
-}
-.btn.btn-secondary.btn-dark {
-  background: @greenBGPrimary;
-  color: #fff;
-  &:hover, &:focus {
-    background: darken(@greenBGPrimaryHover, 10%);
-  }
-}
-
- at keyframes containerAnim {
-  0% {transform: translateX(-55px); opacity: 0;}
-  20% {opacity: 1;}
-  80% {opacity: 1;}
-  100%{transform: translateX(270px); opacity: 0.2;}
-}
-
- at keyframes containerAnimReverse {
-  0% {transform: translateX(270px); opacity: 0.2;}
-  20% {opacity: 1;}
-  80% {opacity: 1;}
-  100%{transform: translateX(-55px); opacity: 0.2;}
-}
-
- at keyframes highlightPackageType {
-    50% {
-      transform: scale(1.2,1.2);
-      background: #eee;
-    }
-    100% {
-      background: #eee;
-      box-shadow: 0 1px 6px 1px rgba(0, 0, 0, 0.4);
-    }
-}
-
-
-
-//Replication column on repos grids when global push/pull replications blocked
-
-.ui-grid-row {
-  &:nth-child(odd) .ui-grid-cell {
-    .replication-disabled {
-      background-color: #f1f1f1;
-    }
-  }
-  &:nth-child(even) .ui-grid-cell {
-    .replication-disabled {
-      background-color: #e9e9e9;
-    }
-  }
-  .replication-disabled {
-    a.grid-column-button {
-      &:not([disabled]):hover {
-        color: @grayFontGeneral;
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/assets/stylesheets/artifact_modals.less b/web/angular-web/src/main/webapp/app/assets/stylesheets/artifact_modals.less
deleted file mode 100644
index e433ae2..0000000
--- a/web/angular-web/src/main/webapp/app/assets/stylesheets/artifact_modals.less
+++ /dev/null
@@ -1,45 +0,0 @@
-.dry-run-result {
-  max-height: 100px;
-  overflow: auto;
-  margin-bottom: 0;
-  // Close icon
-  &::before {
-    display: none;
-  }
-}
-
-label.snippet {
-  color: @greenBGDark;
-  margin: 5px 0 0;
-
-  .icon {
-    position: relative;
-    top: 2px;
-    color: @grayFontMediumDark;
-  }
-}
-
-.cell-top-padding {
-  > * {
-    position: relative;
-    top: 34px;
-  }
-}
-
-.property-modal {
-  overflow: hidden !important;
-
-  .dropdown-min-height {
-    min-height: 250px;
-  }
-}
-
-.modal-sm{
-  max-width: 600px;
-}
-
-.repository-type-modal {
-  .modal-footer {
-    min-height: 100px;
-  }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/assets/stylesheets/artifactory-icons.less b/web/angular-web/src/main/webapp/app/assets/stylesheets/artifactory-icons.less
deleted file mode 100644
index e02734c..0000000
--- a/web/angular-web/src/main/webapp/app/assets/stylesheets/artifactory-icons.less
+++ /dev/null
@@ -1,446 +0,0 @@
- at charset "UTF-8";
-
- at font-face {
-  font-family: "artifactory";
-  src:url("../fonts/artifactory.eot");
-  src:url("../fonts/artifactory.eot?#iefix") format("embedded-opentype"),
-  url("../fonts/artifactory.woff") format("woff"),
-  url("../fonts/artifactory.ttf") format("truetype"),
-  url("../fonts/artifactory.svg#artifactory") format("svg");
-  font-weight: normal;
-  font-style: normal;
-
-}
-
-[data-icon]:before {
-  font-family: "artifactory" !important;
-  content: attr(data-icon);
-  font-style: normal !important;
-  font-weight: normal !important;
-  font-variant: normal !important;
-  text-transform: none !important;
-  speak: none;
-  line-height: 1;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-}
-
-[class^="icon-"]:before,
-[class*=" icon-"]:before {
-  font-family: "artifactory" !important;
-  font-style: normal !important;
-  font-weight: normal !important;
-  font-variant: normal !important;
-  text-transform: none !important;
-  speak: none;
-  line-height: 1;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-}
-.icon-plus:before {
-  content: "\e90f";
-}
-.icon-trash:before {
-  content: "\e901";
-}
-.icon-gz:before {
-  content: "\e90d";
-}
-.icon-tar:before {
-  content: "\e90c";
-}
-.icon-pin:before {
-  content: "\e90a";
-}
-.icon-unpin:before {
-  content: "\e90b";
-}
-.icon-admin:before {
-  content: "z";
-}
-.icon-css:before {
-  content: "f";
-}
-.icon-deb:before {
-  content: "g";
-}
-.icon-docker:before {
-  content: "j";
-}
-.icon-groovy:before {
-  content: "k";
-}
-.icon-html:before {
-  content: "l";
-}
-.icon-java:before {
-  content: "m";
-}
-.icon-json:before {
-  content: "n";
-}
-.icon-nuget:before {
-  content: "q";
-}
-.icon-pdf:before {
-  content: "r";
-}
-.icon-txt:before {
-  content: "u";
-}
-.icon-xml:before {
-  content: "w";
-}
-.icon-zip:before {
-  content: "x";
-}
-.icon-artifacts:before {
-  content: "y";
-}
-.icon-builds:before {
-  content: "\e00d";
-}
-.icon-rpm:before {
-  content: "H";
-}
-.icon-ruby-gems:before {
-  content: "I";
-}
-.icon-scala:before {
-  content: "J";
-}
-.icon-general:before {
-  content: "K";
-}
-.icon-archive:before {
-  content: "d";
-}
-.icon-c-1:before {
-  content: "N";
-}
-.icon-c:before {
-  content: "P";
-}
-.icon-c-2:before {
-  content: "B";
-}
-.icon-distribution-repo:before {
-  content: "\e910";
-}
-.icon-cached-repo:before {
-  content: "e";
-}
-.icon-copy:before {
-  content: "i";
-}
-.icon-group:before {
-  content: "p";
-}
-.icon-go-to-build:before {
-  content: "t";
-}
-.icon-folder:before {
-  content: "v";
-}
-.icon-arrow:before {
-  content: "A";
-}
-.icon-download:before {
-  content: "G";
-}
-.icon-delete-content:before {
-  content: "M";
-}
-.icon-delete-versions:before {
-  content: "O";
-}
-.icon-local-repo:before {
-  content: "R";
-}
-.icon-move:before {
-  content: "T";
-}
-.icon-simple-browser:before {
-  content: "U";
-}
-.icon-re-index:before {
-  content: "W";
-}
-.icon-virtual-repo:before {
-  content: "X";
-}
-.icon-v:before {
-  content: "Y";
-}
-.icon-unview:before {
-  content: "Z";
-}
-.icon-show-in-tree:before {
-  content: "1";
-}
-.icon-show-in-ci-server:before {
-  content: "2";
-}
-.icon-show-build-json:before {
-  content: "3";
-}
-.icon-search-specific:before {
-  content: "4";
-}
-.icon-search:before {
-  content: "5";
-}
-.icon-run:before {
-  content: "6";
-}
-.icon-zap:before {
-  content: "7";
-}
-.icon-refresh:before {
-  content: "8";
-}
-.icon-view:before {
-  content: "9";
-}
-.icon-archive-2:before {
-  content: "\"";
-}
-.icon-delete-recursive:before {
-  content: "L";
-}
-.icon-home:before {
-  content: "\e00c";
-}
-.icon-gradle:before {
-  content: "$";
-}
-.icon-filter:before {
-  content: "(";
-}
-.icon-upload-hover-old:before {
-  content: ")";
-}
-.icon-set-me-up:before {
-  content: "*";
-}
-.icon-notif-success:before {
-  content: ",";
-}
-.icon-notif-error:before {
-  content: "-";
-}
-.icon-copy-to-clipboard:before {
-  content: "/";
-}
-.icon-arrow2:before {
-  content: ":";
-}
-.icon-edit:before {
-  content: "o";
-}
-.icon-artifactory-edit:before {
-  content: "C";
-}
-.icon-js:before {
-  content: ";";
-}
-.icon-bintray:before {
-  content: "c";
-}
-.icon-bintray-old:before {
-  content: "o";
-}
-.icon-jar:before {
-  content: "E";
-}
-.icon-vagrant:before {
-  content: "<";
-}
-.icon-yum:before {
-  content: ">";
-}
-.icon-sbt:before {
-  content: "?";
-}
-.icon-blackduck:before {
-  content: "@";
-}
-.icon-pypi:before {
-  content: "[";
-}
-.icon-git-lfs:before {
-  content: "]";
-}
-.icon-remote-repo:before {
-  content: "!";
-}
-.icon-deploy:before {
-  content: "s";
-}
-.icon-datagrid-v {
-  &:before {
-    content: "V";
-  }
-}
-.icon-more:before {
-  content: "#";
-}
-.icon-bower:before {
-  content: "&";
-}
-.icon-import:before {
-  content: "'";
-}
-/*.icon-padlock:before {
-  content: "+";
-}*/
-.icon-p2:before {
-  content: "^";
-}
-.icon-npm:before {
-  content: "_";
-}
-.icon-notif-icon:before {
-  content: "`";
-}
-.icon-notif-warning:before {
-  content: "{";
-}
-.icon-generic:before {
-  content: "|";
-}
-.icon-export:before {
-  content: "}";
-}
-.icon-duplicate:before {
-  content: "~";
-}
-.icon-drag:before {
-  content: "\\";
-}
-.icon-new:before {
-  content: "\e000";
-}
-.icon-ivy:before {
-  content: "\e001";
-}
-.icon-info:before {
-  content: "\e002";
-}
-
-.icon-clear:before, .icon-clear2:before {
-  content: "\e003";
-}
-.icon-pro:before {
-  content: "\e004";
-}
-.icon-upload-small:before {
-  content: "\e005";
-}
-.icon-upload-hover:before {
-  content: "\e006";
-}
-.icon-upload:before {
-  content: "\e90e";
-}
-.icon-vcs:before {
-  content: "\e007";
-}
-.icon-pom:before {
-  content: "\e008";
-}
-.icon-not-view-nor-watch:before {
-  content: "\e009";
-}
-.icon-re-index-new:before {
-  content: "a";
-}
-.icon-megaphone:before {
-  content: "S";
-}
-.icon-megaphone-on:before {
-  content: "0";
-}
-.icon-unwatch:before {
-  content: "D";
-}
-.icon-watch:before {
-  content: "Q";
-}
-.icon-docker-id:before {
-  content: "h";
-}
-.icon-docker-tags:before {
-  content: "%";
-}
-.icon-docker-command:before {
-  content: ".";
-}
-.icon-docker-created:before {
-  content: "=";
-}
-.icon-docker-size:before {
-  content: "\e00a";
-}
-.icon-docker-digest:before {
-  content: "\e00b";
-}
-.icon-trashcan:before {
-  content: "\e900";
-}
-.icon-trashcan-restore:before {
-  content: "\e903";
-}
-.icon-unlock:before {
-  content: "\e902";
-}
-.icon-locked-unlock:before {
-  content: "\e902";
-}
-.icon-lock:before {
-  content: "\2b";
-}
-.icon-opkg:before {
-  content: "\e904";
-}
-.icon-go:before {
-  content: "\e905";
-}
-.icon-cocoapods:before {
-  content: "\e906";
-}
-.icon-revoke-api:before {
-  content: "\e907";
-}
-.icon-unexpire:before {
-  content: "\e908";
-}
-.icon-expire:before {
-  content: "\e909";
-}
-
-.icon-locked-unlock:before {
-  content: "\e902";
-}
-.icon-lock:hover:before {
-  content: "\e902";
-}
-.context-menu-item {
-  &.icon-locked-unlock:before {
-    content: "\e902";
-    color: red !important;
-  }
-}
-
-
-
-.icon-angle-double-up:before {
-  content: "\21E7";
-  font-size: 22px;
-  line-height: 36px !important;
-}
-.icon-angle-double-down:before {
-  content: "\21E9";
-  font-size: 22px;
-  line-height: 36px !important;
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/assets/stylesheets/artifactory_grid.less b/web/angular-web/src/main/webapp/app/assets/stylesheets/artifactory_grid.less
deleted file mode 100644
index 2fb9684..0000000
--- a/web/angular-web/src/main/webapp/app/assets/stylesheets/artifactory_grid.less
+++ /dev/null
@@ -1,634 +0,0 @@
-//-----ui grid----//
-.ui-grid-filter-input {
-  display: none;
-}
-
-.grid-pagination {
-  margin: 23px 10px 0 10px;
-  padding-bottom: 5px;
-  color: @grayFontGeneral;
-
-  p {
-    margin-bottom: 0;
-  }
-
-  a {
-    color: @grayFontGeneral;
-    text-decoration: none;
-    font-size: 24px;
-    font-weight: 100;
-    line-height: 18px;
-    vertical-align: top;
-
-    &.disabled {
-      color: @grayBorderDark;
-    }
-  }
-
-  .grid-page-box {
-    border: 1px solid @grayBorderDark;
-    background-color: @grayBGLight;
-    padding: 0 5px;
-    margin: 2px 0 0 0;
-    width: 28px;
-    height: 20px;
-    font-size: 13px;
-    outline: none;
-    text-align: center;
-  }
-}
-
-.grid-container {
-  margin: 20px auto;
-  width: 100%;
-  position: relative;
-  padding: 0;
-  overflow: hidden;
-
-  .ui-grid a {
-    color: @blueMain;
-
-    &:hover {
-      text-decoration: none;
-    }
-  }
-
-  .grid-items-container {
-    height: 40px;
-    overflow: auto;
-  }
-
-  .item {
-    display: inline-block;
-    background: transparent;
-    border-radius: 3px;
-    padding: 0 8px;
-    margin: 6px 0 0 8px;
-    height: 26px;
-    line-height: 24px;
-    border: 1px solid @blueMain;
-    color: @grayFontGeneral;
-  }
-
-  a.grid-column-button {
-    display: inline-block;
-    background: transparent;
-    border: 0 none;
-    font-size: 24px;
-    color: @grayFontGeneral;
-
-    &:not([disabled]):hover {
-      color: @greenFontHeader;
-    }
-
-    &[disabled] {
-      color: @grayFontLighter;
-    }
-  }
-
-  .btn {
-    min-width: inherit !important;
-
-    &:hover {
-      background-color: @grayBGMedium;
-    }
-  }
-
-  .ui-grid-header-cell-wrapper, .ui-grid-header-canvas {
-    height: 40px;
-  }
-
-  .ui-grid {
-    position: relative;
-    clear: both;
-    visibility: hidden;
-    border-radius: 0;
-    border: 0 none;
-
-    .ui-grid-canvas {
-      padding-top: 0;
-    }
-
-    .ui-grid-viewport {
-      border-right: 0 none;
-    }
-
-    .ui-grid-top-panel {
-      background: none !important;
-    }
-
-    .ui-grid-cell, .ui-grid-header-cell {
-      border-left: 1px solid @grayGridHeader !important;
-
-      &:not(:last-child) {
-        border-right: 0 none transparent !important;
-      }
-      &:last-child {
-        border-right: 1px solid @grayGridHeader !important;
-      }
-      /* breaks the cell overflow (ellipsis)
-      .ui-grid-cell-contents {
-        white-space: normal;
-      }
-      */
-    }
-
-    .ui-grid-header-cell:last-child .ui-grid-column-resizer.right {
-      border-right: 0 none transparent !important;
-    }
-
-    .ui-grid-header {
-      border: 0 none !important;
-      border-bottom: 0 none !important;
-    }
-
-    .ui-grid-row {
-      position: relative;
-
-      &:nth-child(odd) .ui-grid-cell {
-        background-color: @white;
-      }
-      &:nth-child(even) .ui-grid-cell {
-        background-color: @grayGridRow;
-      }
-
-      &:last-child .ui-grid-cell {
-        border-bottom: 1px solid @grayGridHeader;
-      }
-
-      .grid-action-bar {
-        position: absolute;
-        z-index: 1000;
-        right: 0;
-        display: none;
-
-        .btn-action {
-          color: @grayFontGeneral;
-
-          &:hover {
-            color: @greenFontHeader;
-            
-            .icon-clear:before {
-              color: @redError;
-            }
-          }
-
-          i {
-            font-size: 16px;
-
-            &:before {
-              line-height: 40px;
-            }
-          }
-        }
-      }
-
-      .ui-grid-row-header-cell {
-        border-bottom: none;
-      }
-    }
-
-    .ui-grid-render-container-body .ui-grid-row.hovered {
-      .grid-actions, .grid-action-bar {
-        display: block;
-      }
-
-      .ui-grid-cell, .ui-grid-viewport, .grid-action-bar {
-        background: @grayGridRowHover;
-      }
-
-      .ui-grid-draggable-row {
-        &:before {
-          font-family: "artifactory" !important;
-          font-size: 26px;
-          content: "\\";
-          position: absolute;
-          z-index: 10;
-          top: 2px;
-          left: -7px;
-          color: #bbb;
-        }
-      }
-    }
-
-    .ui-grid-header-cell {
-      .ui-grid-cell-contents {
-        font-weight: normal;
-        font-size: 16px;
-        color: @grayFontGeneral;
-        background-color: @grayGridHeader;
-      }
-
-      .sorting-active .ui-grid-cell-contents {
-        background: #cdd2d4;
-      }
-    }
-
-    .ui-grid-cell {
-      position: relative;
-    }
-
-    .ui-grid-cell-contents {
-      height: 40px;
-      line-height: 40px;
-      padding: 0 5px 0 15px;
-
-      a::before {
-        line-height: 40px;
-      }
-
-      .group-button {
-        position: relative;
-        display: inline-block;
-        width: 24px;
-        height: 24px;
-        top: 7px;
-        left: 4px;
-      }
-
-      .repo-type-icon {
-        float: left;
-        margin: 1px 10px 0 0;
-        
-        &.icon- {
-          display: none;
-        }
-      }
-    }
-
-    .ui-grid-group-header-row {
-      .ui-grid-cell {
-        background: #fff !important;
-        color: @greenBGDark;
-        border-left: 1px solid transparent !important;
-        border-top: 1px solid @grayGridHeader;
-
-        &.expandedRow {
-          background: @greenBGSmallHover !important;
-        }
-      }
-    }
-
-    .ui-grid-pinned-container {
-      .ui-grid-viewport {
-        .ui-grid-cell:last-child {
-          border-right: 0 none !important;
-        }
-      }
-
-      .ui-grid-group-header-row .ui-grid-cell:first-child {
-        border-left-color: @grayGridHeader !important;
-      }
-
-      .ui-grid-cell-contents {
-        padding: 0;
-      }
-
-      .ui-grid-header-cell {
-        display: inline-block;
-      }
-    }
-
-    .ui-grid-group-header-row .ui-grid-selection-row-header-buttons {
-      visibility: hidden !important;
-    }
-
-    &.grouped {
-      .grouped-column .ui-grid-cell-contents {
-        padding: 12px 5px 10px 40px;
-      }
-
-      .ui-grid-cell {
-        background: @white;
-      }
-
-      .ui-grid-row .ui-grid-row-header-cell {
-        background: @white !important;
-        border-left: none !important;
-      }
-
-      .ui-grid-pinned-container.ui-grid-pinned-container-left {
-        .ui-grid-group-header-row {
-          .ui-grid-row-header-cell {
-            background: @white !important;
-            border-bottom: 1px solid @grayBorderDark;
-          }
-        }
-
-        .ui-grid-header-cell:nth-child(2) {
-          border-right: none !important;
-        }
-
-        .ui-grid-grouping-row-header-buttons.ui-grid-icon-plus-squared,
-        .ui-grid-grouping-row-header-buttons.ui-grid-icon-minus-squared {
-          visibility: hidden;
-        }
-      }
-    }
-  }
-
-  .ui-grid-icon-down-dir, .ui-grid-icon-up-dir {
-    position: absolute;
-    right: 0;
-    font-size: 19px;
-  }
-
-  .ui-grid-selection-row-header-buttons {
-    opacity: 1;
-    line-height: 40px;
-  }
-
-  // selection checkbox icons
-  .ui-grid-header-cell.ui-grid-col0 .ui-grid-cell-contents {
-    //padding: 10px 5px 10px 5px;
-  }
-
-  .ui-grid-icon-ok {
-    .icon-datagrid-v;
-
-    &:before {
-      font-family: "artifactory" !important;
-
-      width: 40px;
-      height: 40px;
-      display: block;
-      position: relative;
-      margin-left: 0;
-      top: 13px;
-      font-size: 16px;
-      color: @grayBGDarker;
-    }
-  }
-
-  .ui-grid-header-cell .ui-grid-icon-ok:before {
-    color: @grayFontLighter;
-  }
-  .ui-grid-cell-contents:hover .ui-grid-icon-ok:not(.ui-grid-row-selected):not(.ui-grid-all-selected):before {
-    color: @grayFontGeneral;
-  }
-
-  .ui-grid-row-selected.ui-grid-icon-ok:before, .ui-grid-all-selected.ui-grid-icon-ok:before {
-    color: @greenFontHeader;
-  }
-
-  .ui-grid-icon-plus-squared, .ui-grid-icon-minus-squared {
-    &:before {
-      font-family: 'ui-grid', 'serif';
-      color: @greenFontDarker;
-      font-size: 18px;
-      margin: 0;
-      width: 30px;
-      height: 40px;
-      line-height: 40px;
-    }
-  }
-
-  .ui-grid-icon-plus-squared {
-    &:before {
-      content: "\c358";
-      transform: rotate(-90deg);
-    }
-  }
-  .ui-grid-icon-minus-squared {
-    &:before {
-      content: "\c358";
-    }
-  }
-
-  .ui-grid-header-viewport .ui-grid-grouping-row-header-buttons {
-    display: none;
-  }
-
-  .ui-grid-render-container-left .grid-action-bar {
-    display: none !important;
-  }
-
-  .expandedRow {
-    background: @greenBGSmallHover !important;
-    color: @greenBGDark;
-  }
-
-  .panel-container & {
-    margin: 0 auto !important;
-  }
-
-  .grid-cell-checkbox {
-    line-height: 40px;
-    text-align: center;
-  }
-
-  .ui-grid-draggable-row {
-    height: 40px;
-    overflow: hidden;
-
-    //.grid-action-bar + .ui-grid-cell .ui-grid-cell-contents {
-    //  padding-left: 20px;
-    //}
-  }
-
-  .ui-grid-draggable-row-over {
-    position: relative;
-
-    &.ui-grid-draggable-row-over--above {
-      border-top: 1px solid @blueMain;
-
-      .ui-grid-cell-contents {
-        line-height: 38px !important;
-      }
-    }
-    &.ui-grid-draggable-row-over--below {
-      border-bottom: 1px solid @blueMain;
-    }
-  }
-
-  .ui-grid-draggable-row-over:before {
-    content: "";
-    display: block;
-    position: absolute;
-    left: 0;
-    width: 100%;
-
-  }
-
-  .ui-grid-draggable-row-over--above:before {
-    top: 0;
-  }
-
-  .ui-grid-draggable-row-over--below:before {
-    bottom: 0;
-  }
-}
-
-div.ui-grid-cell input.ng-valid {
-  height: 36px;
-  margin-top: 2px;
-}
-
-.grid-cell-empty .ui-grid-cell-contents {
-  visibility: hidden;
-}
-
-.grid-checkbox {
-  padding: 0;
-  text-align: center;
-
-  input[type="checkbox"] {
-    display: none;
-  }
-
-  input[type="checkbox"] + span {
-    display: none;
-    font-size: 17px;
-    color: @blueMain;
-
-    &:before {
-      line-height: 40px;
-    }
-  }
-
-  input[type="checkbox"]:checked + span {
-    display: inline-block;
-  }
-}
-
-.grid-icon {
-  padding: 0;
-  text-align: center;
-
-  i {
-    font-size: 17px;
-    &:before {
-      line-height: 40px;
-    }
-  }
-}
-
-.wrapper-grid-actions {
-  height: 50px;
-}
-
-.grid-batch-actions {
-  padding-top: 20px;
-
-  .btn {
-    height: 30px;
-    line-height: 30px;
-
-    &, i:before {
-      color: @grayFontGeneral;
-    }
-
-    &.disabled {
-      &, i:before {
-        color: @grayFontLighter;
-      }
-    }
-
-    img {
-      margin-right: 2px;
-    }
-
-    &:hover {
-      background-color: transparent;
-      &, i:before {
-        color: @greenFontHeader;
-      }
-    }
-    
-    &.batch-action-clear:hover {
-      &, i:before {
-        color: @redError;
-      }
-    }
-  }
-
-  i {
-    float: left;
-    margin: 2px 5px 0 0;
-    font-size: 16px;
-  }
-}
-
-.icon.clear-group {
-  color: @grayFontLighter;
-}
-
-
-.ui-grid-disable-selection {
-
-  //override (enable) selection to handle the stupid ui-grid bug when not setting grid's row selection
-  -webkit-touch-callout: default;
-  -webkit-user-select: text;
-  -khtml-user-select: text;
-  -moz-user-select: text;
-  -ms-user-select: text;
-  user-select: text;
-  cursor: auto;
-
-}
-
-
-.grid-counter {
-  font-size: 16px;
-  font-weight: 600;
-  line-height: 28px;
-}
-
-.ui-grid-cell-contents {
-  .gridcell-showall {
-    position: absolute;
-    right: 0px;
-    padding: 0 10px;
-  }
-  &.overflow:hover,
-  &.always-show:hover {
-    padding-right: 66px;
-  }
-  &:not(:hover) {
-    .gridcell-showall {
-      visibility: hidden !important;
-    }
-  }
-}
-
-//override non releveant icons defined in jQuery.contextMenu.css (vendor)
-.context-menu-item.icon-edit {
-  background-image: inherit;
-}
-.context-menu-item.icon-cut {
-  background-image: inherit;
-}
-.context-menu-item.icon-copy {
-  background-image: inherit;
-}
-.context-menu-item.icon-paste {
-  background-image: inherit;
-}
-.context-menu-item.icon-delete {
-  background-image: inherit;
-}
-.context-menu-item.icon-add {
-  background-image: inherit;
-}
-.context-menu-item.icon-quit {
-  background-image: inherit;
-}
-
-
-//special-row class is used in storage summary grid for TOTAL and TRASH CAN rows (RTFACT-9187)
-.ui-grid-row.special-row {
-
-  font-weight: 600;
-  &:first-child {
-    border-top: 1px solid @greenFontHeader;
-  }
-  &:nth-child(2) {
-    border-top: 1px solid @grayGridHeader;
-    border-bottom: 1px solid @greenFontHeader;
-  }
-
-  background-color: white !important;
-  * {
-    background-color: transparent !important;
-  }
-}
diff --git a/web/angular-web/src/main/webapp/app/assets/stylesheets/artifacts.less b/web/angular-web/src/main/webapp/app/assets/stylesheets/artifacts.less
deleted file mode 100644
index 1b23b70..0000000
--- a/web/angular-web/src/main/webapp/app/assets/stylesheets/artifacts.less
+++ /dev/null
@@ -1,1204 +0,0 @@
-/**
-  OLD CSS
-**/
-.artifacts-list,
-.artifact-details {
-  border: 1px solid #EEEEEE;
-
-}
-
-.js-back {
-  width: 300px;
-  height: 8000px;
-  background: red;
-}
-
-.ui-fix {
-  position: relative;
-  min-height: 600px;
-  overflow: auto;
-}
-
-.jstree-contextmenu {
-  z-index: 10000;
-  margin-top: 15px;
-  margin-left: 5px;
-  // The Tchupchik:
-  & li:first-child::after, .vakata-context li:first-child::after {
-    display: none;
-  }
-}
-
-.jf-tree-search-container {
-  position: absolute;
-  z-index: 10000;
-  top: -9999px;
-  left: 12px;
-  width: 200px;
-
-  &.jf-tree-search-active {
-    top: 34px;
-  }
-
-  .jf-tree-search {
-    height: 30px;
-    background: #fff;
-    box-shadow: 0 0 5px 1px rgba(0, 0, 0, .15);
-    width: 100%;
-    color: @grayFontDarker;
-    border: none;
-    outline: none;
-    font-size: 15px;
-    padding: 0 25px 0 10px;
-  }
-
-  .spinner-msg-local {
-    position: absolute;
-    top: 5px;
-    right: 5px;
-  }
-}
-
-/**
-  END OF OLD CSS
-**/
-
-#jf-artifacts {
-  .set-me-up, .deploy-btn {
-    color: @blueFontDark;
-    font-size: 20px;
-    line-height: 40px;
-    font-weight: 400;
-    cursor: pointer;
-    margin-top: 13px;
-
-    &:hover {
-      color: #013c6b;
-    }
-
-    span {
-      font-size: 19px;
-      float: left;
-      margin: 1px 6px 0 0;
-    }
-  }
-
-  .set-me-up {
-    margin-right: 20px;
-    letter-spacing: -0.5px;
-
-    span {
-      margin-right: 8px;
-      font-size: 20px;
-    }
-  }
-
-  .deploy-btn {
-    margin-right: 32px;
-
-    &.disabled {
-      cursor: not-allowed;
-    }
-  }
-
-  .artifact-details {
-    padding: 0 0 15px;
-
-    .repository-type {
-      float: right;
-      margin: 0;
-      background-position: center top;
-      text-align: center;
-
-      .repotype {
-        display: inline-block;
-      }
-      .icon-logo-circle {
-        display: inline-block;
-        width: 18px;
-        height: 22px;
-        background-size: 100%;
-        position: relative;
-        top: 7px;
-        margin-right: 4px;
-      }
-    }
-
-    .artifact-details-header {
-      //margin: 4px 15px 20px 30px;
-      padding: 8px 10px 8px 4px;
-      border-bottom: 1px solid #e9e9e9;
-      margin-bottom: 15px;
-
-      .jstree-icon {
-        float: left;
-        font-size: 18px;
-        color: @blueFontDark;
-        margin: 0 8px 0 30px;
-        line-height: 28px;
-
-        &.icon-trashcan {
-          line-height: 42px;
-        }
-      }
-    }
-
-    .artifact-name-heading {
-      color: @blueFontDark;
-      font-size: 18px;
-      font-weight: 400;
-      margin-top: 0px;
-      line-height: 20px;
-      white-space: nowrap;
-      overflow: hidden;
-      text-overflow: ellipsis;
-      margin-bottom: 0;
-      padding: 2px 0;
-    }
-
-    .inner-buttons {
-      margin-left: 20px;
-
-      a {
-        cursor: pointer;
-        color: @greenFontHeader;
-
-        &:hover {
-          text-decoration: none;
-          color: #327535;
-
-          &:not(.no-separator)::before {
-            color: @greenFontHeader;
-          }
-        }
-        &:not(.no-separator)::before {
-          content: "|";
-          cursor: default;
-          margin: 0 6px 0 4px;
-          position: relative;
-          top: -1px;
-        }
-      }
-    }
-
-    .jf-data-table {
-      td:first-child {
-        min-width: 200px
-      }
-    }
-
-    #jf-general {
-      > .panel-default, > .panel {
-        border: none;
-      }
-
-      .licenses {
-
-        .buttons {
-          margin: 0 20px;
-
-          button {
-            margin: 0 5px;
-          }
-        }
-
-        input[type="checkbox"] {
-          display: inline-block;
-        }
-      }
-    }
-
-    .blackduck_logo {
-      position: absolute;
-      top: 60px;
-      right: 20px;
-    }
-  }
-
-  .tree-head-expansion {
-    display: none;
-    padding: 0 20px;
-    height: 40px;
-    line-height: 40px;
-    border-bottom: 1px solid #e9e9e9;
-  }
-
-  #tree-element {
-    bottom: 0;
-    overflow: auto;
-    padding: 12px 0 10px;
-    top: 41px;
-    position: absolute;
-    right: 0;
-    left: 0;
-
-    [class^="icon-"]:before,
-    [class*=" icon-"]:before {
-      line-height: 2.2em;
-    }
-  }
-  .expanded {
-    #tree-element {
-      top: 80px;
-    }
-
-    .tree-head-expansion {
-      display: block;
-      background-color: #fafafa;
-
-      .labeled-item {
-        background: #fff;
-      }
-    }
-  }
-
-  .tree-browser-header {
-    padding: 8px 10px 8px 4px;
-    border-bottom: 1px solid @grayBorderLighter;
-    overflow: auto;
-    display: table;
-    width: 100%;
-
-    .tree-browser-header-tabs {
-      padding: 0px 15px;
-      margin-bottom: 8px;
-      display: table-cell;
-      width: 230px;
-
-      .tree-browser-tab {
-        color: @grayFontGeneral;
-        font-size: 15px;
-        padding: 1px 9px 2px 0;
-        display: inline-block;
-
-        &:first-child {
-          padding-left: 0;
-        }
-
-        &:hover, &.active {
-          color: @greenFontHeader;
-        }
-      }
-    }
-
-    .icon {
-      font-size: 15px;
-      top: 2px;
-      position: relative;
-      color: @grayFontGeneral;
-      cursor: pointer;
-
-      &:hover {
-        color: @greenFontHeader;
-      }
-    }
-
-    .tree-browser-header-hide {
-      display: table-cell;
-      vertical-align: top;
-      padding: 2px 10px 0 0;
-    }
-
-    .hide-empty-folders {
-      text-align: right;
-      height: 20px;
-      overflow: hidden;
-
-      label {
-        margin-bottom: 0;
-      }
-    }
-  }
-
-  .jstree-container-ul {
-    float: left;
-    position: relative;
-    min-width: 100%;
-  }
-
-  .jstree-icon {
-    color: @grayFontLight;
-    background-repeat: no-repeat !important;
-    font-size: 14px;
-  }
-
-  .jstree-wholerow-hovered {
-    background: @grayBGMediumLight;
-  }
-
-  .jstree-hovered .jstree-icon {
-    color: @blueFontDark;
-  }
-
-  .jstree-wholerow-clicked {
-
-    background: @blueBGLight;
-  }
-
-  .jstree-default .jstree-node,
-  .jstree-default .jstree-icon {
-    background-image: url('../images/32px.png');
-    background-repeat: repeat-y;
-  }
-  .jstree-default .jstree-li-the-trashcan.jstree-node,
-  .jstree-default .jstree-li-the-trashcan.jstree-node .jstree-node,
-  .jstree-default .jstree-li-the-trashcan .jstree-icon {
-    background-image: url('../images/32px_trash.png');
-  }
-
-  .jstree-default .jstree-node,
-  .jstree-default .jstree-icon,
-  .jstree-default .jstree-anchor,
-  .jstree-default .jstree-wholerow {
-    min-height: 30px;
-    line-height: 30px;
-  }
-
-  .jstree-default {
-    .jstree-icon:empty {
-      width: 41px;
-    }
-
-    .jstree-anchor, .jstree-icon {
-      -webkit-touch-callout: none;
-      -webkit-user-select: none;
-      -khtml-user-select: none;
-      -moz-user-select: none;
-      -ms-user-select: none;
-      user-select: none;
-    }
-
-    .jstree-anchor {
-      padding-right: 20px;
-      transition: none !important;
-
-      &.jstree-clicked, &.jstree-hovered {
-        background: transparent;
-        box-shadow: none;
-
-        &:before {
-          content: "";
-          position: absolute;
-          height: 30px;
-          width: 100%;
-          left: 0;
-          opacity: 0.1;
-        }
-      }
-
-      &.jstree-hovered:before {
-        background: #919191;
-      }
-      &.jstree-clicked:before {
-        background: #2291B2;
-      }
-
-      .jstree-icon {
-        background: transparent;
-      }
-
-      &:hover, &.jstree-clicked {
-        &, .jstree-icon:before {
-          color: @blueMain;
-        }
-      }
-    }
-
-    .jstree-node {
-      clear: both;
-      margin-left: 15px;
-      background-position: -292px -2px;
-
-      &.jstree-last {
-        background: transparent;
-        background-image: none !important;
-      }
-
-      &.jstree-closed > .jstree-icon {
-        background-position: -106px -2px;
-      }
-
-      &.jstree-open > .jstree-icon {
-        background-position: -148px -2px;
-      }
-
-      &.jstree-open:not([aria-level="1"]) {
-        &.jstree-last > .jstree-icon {
-          background-position: -241px -73px !important;
-        }
-
-      }
-
-      &.jstree-closed:not([aria-level="1"]) {
-        &.jstree-last > .jstree-icon {
-          background-position: -190px -73px !important;
-        }
-      }
-
-      &.jstree-li-the-trashcan {
-        .icon-trash:before {
-          color: @blueMain;
-          font-size: 16px;
-          position: relative;
-          top: -3px;
-        }
-      }
-    }
-
-    .jstree-leaf {
-      //background: transparent;
-
-      > .jstree-ocl {
-        background-position: -68px -2px !important;
-        width: 41px;
-      }
-
-      &.jstree-last {
-        background: transparent;
-        .jstree-icon {
-          background-position: -138px -73px !important;
-          width: 39px;
-          margin-right: 2px;
-        }
-
-      }
-    }
-
-    .jstree-anchor {
-      font-size: 14px;
-      padding-right: 10px;
-      padding-left: 10px;
-    }
-
-    .jstree-ocl {
-      position: relative;
-      z-index: 100;
-    }
-
-    .jstree-themeicon {
-      margin-left: 0;
-      width: 30px !important;
-    }
-
-    .jstree-children {
-      padding-left: 10px;
-    }
-
-    .jstree-search {
-      color: inherit;
-      font-weight: inherit;
-      font-weight: 600;
-      font-style: normal;
-    }
-  }
-
-  .jstree-node[aria-level="1"] {
-
-    background: transparent;
-    margin-left: -20px;
-
-    &.jstree-closed > .jstree-icon.jstree-ocl {
-      background-position: 30px -2px;
-    }
-
-    &.jstree-closed.jstree-last > .jstree-icon,
-    > .jstree-icon.jstree-ocl {
-      background-position: 30px -2px;
-      margin-left: 0;
-    }
-
-    &.jstree-leaf {
-      > .jstree-icon.jstree-ocl {
-        background: transparent;
-        margin-left: 0;
-        width: 41px;
-      }
-    }
-
-    &.jstree-open {
-      > .jstree-icon.jstree-ocl {
-        background-position: -12px -2px;
-      }
-    }
-
-  }
-
-  .jstree-loading .jstree-node,
-  .jstree-loading > .jstree-icon {
-
-    &.jstree-ocl {
-      .icon-hourglass();
-      .spinning();
-
-      background-size: 16px 16px;
-      width: 16px !important;
-      height: 16px !important;
-      min-height: 0 !important;
-      background-position: 0 0 !important;
-      top: 7px;
-      left: 29px;
-      margin-right: 25px;
-    }
-
-    width: 16px;
-    height: 16px;
-    position: relative;
-  }
-
-  .ui-layout-container {
-    //background: @white;
-    border: none;
-  }
-
-  .artifacts-outer-layout-container, .ui-layout-column, .ui-layout-row {
-    overflow: visible; // Otherwise can't see card shadow
-  }
-
-  .ui-layout-column > .ui-splitbar {
-    background: transparent;
-
-    a {
-      display: none;
-    }
-  }
-
-  .list-declaration {
-    height: 30px;
-    margin-bottom: 10px;
-  }
-
-  .build-tool-btn {
-    min-width: 70px;
-    max-width: 120px;
-    text-align: center;
-    height: 30px;
-    line-height: 30px;
-    background: @grayBGMedium;
-    cursor: pointer;
-
-    &.active {
-      background: @greenBGSmallActive;
-      border-top: 2px solid @buildToolBtnBorder;
-      border-bottom: 2px solid @buildToolBtnBorder;
-      color: @white;
-      box-sizing: content-box;
-    }
-  }
-
-  .virtual-repo-item {
-    display: inline-block;
-    margin-right: 40px;
-    line-height: 28px;
-
-    a {
-      &:hover .icon:before {
-        color: @blueLinkBasic;
-      }
-    }
-
-    .icon {
-      float: left;
-      margin: 2px 8px 0 0;
-    }
-  }
-
-  .buttons button {
-    margin: 0 5px;
-  }
-
-  .main-view {
-    padding: 20px 35px 0;
-    position: absolute;
-    top: 87px;
-    bottom: 0;
-    right: 0;
-    left: 0;
-    overflow-y: auto;
-  }
-
-  .ui-view-search {
-    //transition: 1s height cubic-bezier(0.68, -0.55, 0.27, 1.55);
-  }
-
-  .back-to-repository-browser {
-    font-size: 14px;
-    margin-left: 15px;
-    position: absolute;
-    right: 30px;
-    margin-top: 8px;
-  }
-}
-
-//-----------deploy modal-------------------------//
-.file-name-deploy, .file-name-deploy-multi {
-  width: 90%;
-  font-size: 14px;
-  display: inline-block;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-  vertical-align: middle;
-}
-
-.file-name-deploy {
-  padding-top: 5px;
-  max-height: 25px;
-}
-
-.deploy-steps {
-  width: 48%;
-  font-size: 19px;
-  border: 1px solid @grayBorderDark;
-  border-top-right-radius: 50px;
-  border-bottom-right-radius: 50px;
-  padding: 10px;
-  padding-left: 30px !important;
-  background: white;
-  cursor: pointer;
-
-  &.active,
-  &.visited {
-    background: @greenBGPrimary;
-    color: white;
-  }
-  &.step-two {
-    position: absolute;
-    margin-left: -30px;
-    border-left: none;
-  }
-  &.step-one {
-    z-index: 2;
-    position: relative;
-
-  }
-}
-
-.file-upload-name {
-  max-width: 25px;
-  word-wrap: break-word;
-}
-
-.input-form {
-  width: auto;
-  display: inline-block !important;
-  margin-left: 60px;
-}
-
-.deploy-label {
-  width: 30%;
-}
-
-.fileupload-name {
-  color: @grayFontLight;
-}
-
-.deploy {
-  .form-group:nth-child(2) {margin-bottom: 21px;}
-
-  .form-group-cell.target-path {
-    width: 240px !important;
-  }
-
-  //form[name="targetPath"] .form-group-cell  width: 358px !important;
-  .deploy-title {
-    color: @grayFontDarker;
-  }
-  .deploy-repo-data {
-    font-weight: 100;
-    div:first-child {
-      margin-bottom: 15px;
-    }
-    label {
-      //width: 120px;
-    }
-  }
-  .deploy-drop {
-    .form-group {
-      margin-bottom: 21px;
-      &.form-checkbox {margin-bottom: 14px;}
-    }
-  }
-  .deploy-mode {
-    color: @grayFontLighter;
-    padding: 0 10px;
-
-    &.active {
-      color: @greenBGDark;
-      font-weight: 700;
-      text-decoration: none;
-    }
-
-    &:hover {
-      text-decoration: none;
-    }
-  }
-
-  .jf-switch {
-    margin-bottom: 5px;
-
-    li a {
-      font-weight: 700;
-    }
-  }
-
-  .alert {
-    margin-top: 15px;
-  }
-
-  .progress-deploy {
-    height: 70px;
-    padding-top: 15px;
-  }
-
-  .progress {
-    width: 82%;
-    margin: 0 10px 0 20px;
-    display: inline-block;
-    vertical-align: middle;
-  }
-
-  .repo-type-icon {
-    position: relative;
-    margin-left: 8px;
-    top: 1px;
-  }
-  #repo-layout {
-    word-break: break-all;
-    margin-top: 5px;
-
-    small {
-      display: block;
-      font-family: "Lucida Console", Monaco, monospace;
-      color: #424242;
-      position: relative;
-      top: -1px;
-      font-size: 13px;
-      width: 500px;
-    }
-  }
-}
-.modal .modal-body.deploy-body {
-  padding: 32px 34px 20px;
-}
-.deploy .progress-deploy, .progress-file-drop {
-  text-align: center;
-  background-color: @grayBGLight;
-  border: 2px solid #e9e9e9;
-  height: 80px;
-
-  .progress {
-    border-radius: 0 !important;
-    box-shadow: none;
-    background-color: @greenBGSecondary;
-  }
-  .progress-bar {
-    background: @greenFontHeader;
-    box-shadow: none;
-  }
-}
-.file-upload-progress .progress-file-drop {height: auto;}
-.progress-file-drop {
-  width: 82%;
-  margin: 9px auto 0;
-}
-
-.deploy-footer {
-  margin-top: 10px;
-}
-
-//-------------repo tabs----------------//
-.artifact-file-icon {
-  position: absolute;
-  right: 20px;
-  top: 35px;
-
-  img {
-    width: 40px;
-  }
-}
-
-.info-key {
-  width: 20%;
-  display: inline-block;
-  vertical-align: top;
-
-  &.half {
-    width: 50%;
-  }
-}
-
-//---------------rpm tab-------------------//
-.rpm {
-  .event-author {
-    color: @grayFontMediumDark;
-  }
-  .event-container {
-    overflow-y: auto;
-    max-height: 350px;
-  }
-
-  .changelogs {
-    .panel-heading {
-      color: @blackFontDark !important;
-    }
-    .panel-container {
-      margin-top: 0;
-    }
-
-  }
-}
-
-//---------------docker ancestry tab------------//
-.labeled-value a {
-  color: #87B343;
-  font-weight: bold;
-  text-decoration: none;
-}
-
-.builds-tab {
-  .builds-tab-tabs-row {
-    margin: 25px 0;
-    font-size: 15px;
-    font-weight: 100;
-    .builds-mode {
-      color: @grayFontLighter;
-      padding: 0 10px;
-      &.active {
-        color: @greenBGDark;
-      }
-
-      &:hover {
-        text-decoration: none;
-      }
-    }
-  }
-}
-
-//---------------governance tab------------//
-
-#jf_governance {
-
-  .panel-container {
-    position: relative;
-  }
-
-  .info-key {
-    width: 30%;
-  }
-
-  .description-panel {
-    margin-left: 94px;
-  }
-}
-
-//------------------Set me up-----------------------//
-.set-me-up-modal {
-  min-height: 500px;
-
-  .form-group {
-    margin-bottom: 12px;
-  }
-
-  &.modal-body .form-group-cell {
-    width: 240px !important;
-  }
-
-  .generate-title-label {
-    font-weight: 700;
-  }
-
-  .set-me-up-actions {
-    margin: 20px 0;
-    font-size: 16px;
-
-    .text-button {
-      font-size: 14px;
-
-      span {
-        font-size: 20px;
-      }
-    }
-  }
-
-  .CodeMirror {
-    margin-bottom: 15px;
-  }
-
-  .settings-view {
-    position: relative;
-    margin-bottom: 20px;
-
-    p {
-      margin-bottom: 5px;
-      line-height: 22px;
-    }
-
-    ul, ol {
-      margin-left: 20px;
-    }
-
-    .copy-to-clip {
-      right: 4px;
-    }
-  }
-
-  a:not(.copy-to-clip) {
-    color: @greenFontHeader;
-  }
-
-  #insert-credentials-box {
-    display: none;
-
-    overflow: hidden;
-    width: 0;
-    height: 0;
-
-    form {
-      width: 275px;
-      height: 40px;
-    }
-    .input-text {
-      width: 240px;
-    }
-
-    .icon-go {
-      font-size: 26px;
-      line-height: 42px;
-
-      &[disabled] {
-        color: #ddd;
-        cursor: default;
-      }
-      &:not([disabled]):hover {
-        color: @greenFontHeader;
-        cursor: pointer;
-      }
-    }
-  }
-}
-
-//------------------simple browser-----------------------//
-
-.simple-browser {
-  .view-in-simple-mode {
-    visibility: hidden;
-    position: absolute;
-    margin-left: 20px;
-    width: 20px;
-    text-align: center;
-  }
-  .no-simple-browsing {
-    padding-right: 30px;
-  }
-  .jstree-anchor {
-    padding-right: 40px !important;
-
-    &:hover {
-      & > .view-in-simple-mode {
-        visibility: visible;
-      }
-    }
-  }
-  &.has-parent { // When viewing simple browser with parent folder
-    > .jstree-children > .jstree-node:first-child { // The go up node (..)
-      & > .jstree-icon {
-        width: 16px !important;
-        background: none !important;
-      }
-      & > .jstree-anchor {
-        width: 180px;
-        & > .jstree-icon {
-          width: 16px !important;
-          background: none !important;
-        }
-      }
-    }
-    > .jstree-children > .jstree-node:nth-child(2) { // parent folder
-      & > .jstree-anchor .view-in-simple-mode {
-        display: inline-block;
-      }
-      & > .jstree-wholerow { // row background
-        background: #e0f3fb;
-      }
-      & > .jstree-icon { // expand icon
-        width: 16px !important;
-        background: none !important;
-      }
-      & > .jstree-anchor { // row text
-        color: @blueFontDark;
-        & > .jstree-icon { // row icon
-          width: 32px;
-        }
-      }
-    }
-  }
-}
-
-.settings-view.preline {
-  white-space: pre-line;
-}
-
-.docker-v2-layers-visualization {
-  position: relative;
-  .layers-container {
-    width: 580px;
-    margin-top: 35px;
-    margin-right: auto;
-    margin-left: auto;
-    ul {
-      margin: 0;
-      padding: 0;
-      list-style: none;
-      li {
-        margin-bottom: 5px;
-        .title {
-          background: #e5e5e5;
-          position: relative;
-          height: 40px;
-          line-height: 40px;
-          font-size: 16px;
-          padding: 0 10px 0 30px;
-          cursor: pointer;
-          transition: transform .1s ease-in;
-          &:hover {
-            transform: scale(1.02,1.03);
-            z-index: 3;
-          }
-          &.open {transform: scale(1,1);}
-
-          .cmd-color-bar {
-            position: absolute;
-            height: 100%;
-            width: 10px;
-            top: 0;
-            left: 0;
-            margin-right: 20px;
-          }
-          .current-node-name {
-            padding: 2px 6px;
-            margin-left: 10px;
-            color: #929292;
-            border: 1px solid #A9A9A9;
-            border-radius: 3px;
-            font-size: 12px;
-          }
-          .layer-id-display {
-            float: right;
-          }
-        }
-        .layer-details {
-          background: @grayBGLight;
-          padding: 10px;
-          list-style: none;
-          width: 100%;
-          li {
-            border: solid @grayBorderMiddleDark;
-            border-width: 1px 0;
-            margin: -1px 0 0;
-            padding: 12px 0;
-            i {
-              font-size: 30px;
-              color: @greenBGPrimary;
-              margin: 0 12px;
-              &.icon-docker-command {font-size: 20px; margin: 0 19px;}
-            }
-            &.id {
-              padding: 3px 0;
-              i {
-                position: relative;
-                bottom: -2px;
-              }
-              span {
-                display: inline-block;
-                max-width:485px;
-                overflow: hidden;
-                text-overflow: ellipsis;
-              }
-            }
-            span.commandtext {
-              padding-left: 60px;
-              padding-right: 10px;
-              display: inline-block;
-              word-break: break-all;
-              white-space: pre-line;
-              i {margin-left: -40px;}
-            }
-            &.inline-cells {
-              padding: 0;
-              & > div {
-                display: inline-block;
-                width: 50%;
-                margin-right: -2px;
-                padding: 10px 0 6px;
-                &:first-child {border-right: 1px solid @grayBorderMiddleDark;}
-                i {vertical-align: middle;}
-              }
-
-            }
-          }
-        }
-      }
-    }
-  }
-}
-
-
-#deploy-progress-frame {
-  margin-top: 10px;
-  border: 1px black solid;
-  width: 100%;
-  height: 12px;
-  overflow: hidden;
-}
-
-#deploy-progress-line {
-  background-color: @greenBorderDark;
-  height: 12px;
-}
-
-/*
-.trashcan-sub-node-icon:before,
-.trashcan-sub-node {
-  color: red;
-}*/
-
-.jstree-li-the-trashcan {
-  background-color: #f7f7f7 !important;
-  border-left: 0 none;
-  border-right: 0 none;
-
-
-  &.pinned {
-    border-top: 1px solid #eaeae9;
-    position: fixed;
-    bottom: 20px;
-    max-height: 112px;
-    overflow-y: auto;
-    width: inherit;
-    z-index: 200;
-  }
-
-  .icon-trashcan:before, .trashcan-node {
-    color: #0671ad !important;
-  }
-
-  .jstree-anchor {
-    &.jstree-clicked:before {
-      background-color: #909090 !important;
-    }
-  }
-
-}
-
-.trash-pin {
-  position: absolute;
-  height: 30px;
-  font-size: 18px;
-  margin-top: -4px;
-  &:before {
-    color: #949494 !important;
-  }
-  &:hover:before {
-    color: black !important;
-  }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/assets/stylesheets/build.less b/web/angular-web/src/main/webapp/app/assets/stylesheets/build.less
deleted file mode 100644
index 51d4b30..0000000
--- a/web/angular-web/src/main/webapp/app/assets/stylesheets/build.less
+++ /dev/null
@@ -1,196 +0,0 @@
-//.builds {
-#jf-builds {
-  .breadcrumb {
-    padding: 18px 60px;
-    margin: 0;
-    background: rgba(245, 245, 245, 1);
-    border-bottom: 1px solid @grayBGMedium;
-    border-radius: 4px;
-    display: block;
-
-    li {
-      font-size: 14px;
-      position: relative;
-    }
-
-    a {
-      color: @blackFontDark;
-
-      &:hover {
-        color: rgba(42, 100, 150, 1);
-      }
-    }
-
-    & > .active {
-      color: rgba(153, 153, 153, 1);
-    }
-
-    & > li + li {
-      margin-left: 56px;
-
-      &:before {
-        color: @greenBGDark;
-        margin: 0px 28px;
-        content: "›";
-        font-size: 28px;
-        font-weight: 300;
-        position: absolute;
-        left: -60px;
-        top: -12px;
-      }
-    }
-  }
-
-  .card-side-pad {
-    padding-right: 35px;
-    padding-left: 35px;
-  }
-
-  .main-view {
-    padding: 20px 35px;
-    position: absolute;
-    top: 130px;
-    bottom: 0;
-    right: 0;
-    left: 0;
-    overflow-y: auto;
-  }
-
-  h2 {
-    color: #006CAB;
-    font-size: 22px;
-    font-weight: 400;
-    margin: 0;
-    padding: 35px 0 10px;
-  }
-
-  .build-info h2 {
-    padding-bottom: 30px;
-    padding-left: 35px;
-  }
-
-  .builds-diff,
-  .builds-published-modules {
-    .grid-container {
-      margin-top: 0;
-    }
-    .compare-selection {
-      margin-top: 20px;
-      margin-bottom: -10px;
-      select {
-        margin-right: 20px;
-        margin-left: 10px;
-      }
-    }
-
-    .status-unchanged {
-      color: @grayFontDark;
-    }
-    .status-updated {
-      color: @blueLinkBasic;
-    }
-    .status-new {
-      color: green;
-    }
-    .status-removed {
-      color: @grayFontLighter;
-    }
-
-    &.license-required {
-      &::after {
-        content: "";
-      }
-
-      h4 span {
-        position: relative;
-
-        .license-required-icon;
-
-        &::after {
-          top: -2px;
-          right: -24px;
-        }
-      }
-    }
-  }
-
-  .builds-diff  {
-    min-height: 100px;
-  }
-
-  .scopes-options {
-    margin: 15px 0 0 25px;
-  }
-
-  .general-summary {
-    .summary-ok {
-
-    }
-    .summary-warn {
-      color: @redError;
-    }
-
-    i {
-      font-size: 20px;
-      float: left;
-      margin: -1px 10px 0 0;
-    }
-
-    span {
-      padding-right: 10px;
-    }
-  }
-
-
-  .licenses-tab {
-    .licenses-summary {
-      padding: 20px 0;
-    }
-  }
-
-  .governance-tab {
-    .status-pending {
-      color: red;
-    }
-    .status-approved {
-      color: green;
-    }
-
-    .not-in-build {
-      color: red;
-    }
-  }
-
-}
-
-.found-license-container {
-  margin-bottom: 20px;
-
-  button {
-    margin-left: 20px;
-  }
-}
-
-.push-to-bintray-btn {
-  float: right;
-  font-size: 16px;
-  font-weight: 700;
-  color: @grayFontGeneral;
-  cursor: pointer;
-  margin-right: 20px;
-
-  &:hover {
-    color: @greenFontHeader;
-  }
-
-  span {
-    display: block;
-    height: 46px;
-    font-size: 40px;
-    text-align: center;
-  }
-}
-
-.back-to-modules {
-  margin-right: 10px;
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/assets/stylesheets/common.less b/web/angular-web/src/main/webapp/app/assets/stylesheets/common.less
deleted file mode 100644
index fa6843d..0000000
--- a/web/angular-web/src/main/webapp/app/assets/stylesheets/common.less
+++ /dev/null
@@ -1,2005 +0,0 @@
-a {
-  color: @blueLinkBasic;
-  cursor: pointer;
-
-  &:hover,
-  &:focus,
-  &:active {
-    text-decoration: none;
-  }
-
-  & i:before, & span:before {
-    color: @grayFontGeneral;
-  }
-  &:hover i:before, &:hover span:before {
-    color: @greenFontHeader;
-  }
-
-  &.default-link {
-    color: @grayFontGeneral;
-
-    &:hover {
-      color: @greenFontHeader;
-    }
-  }
-}
-
-.highlight {
-  //color: @greenFontDark;
-  color: #222;
-  background-color: yellow;
-}
-
-.alert {
-  position: relative;
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-  padding-left: 45px;
-
-  &:before {
-    font-family: "artifactory" !important;
-    font-size: 20px;
-    font-weight: normal;
-    position: absolute;
-    top: 11px;
-    left: 15px;
-  }
-
-  &.alert-warning:before {
-    content: "{";
-  }
-  &.alert-danger:before {
-    content: "-";
-  }
-  &.alert-info {
-    &:before {
-      content: "\e002";
-    }
-    
-    a {
-      text-decoration: underline;
-    }
-  }
-  
-  &.special-locked-user:before {
-    content: "\e902" !important;
-    font-size: 30px;
-    top: 4px;
-    left: 17px;
-  }
-  
-  ul {
-    margin: 4px 20px;
-  }
-  
-  &.stripped {
-    padding: 5px 15px 5px 30px !important;
-    border: 0 none;
-    background-color: transparent;
-    margin-bottom: 0;
-    
-    &:before {
-      top: 1px;
-      left: 0;
-    }
-  }
-}
-
-.alert-fade.ng-leave {
-  animation: fadeOut 1s;
-}
-
-.alert-fade.ng-enter {
-  animation: fadeIn 1s;
-}
-
-.jf-form-errors {
-  color: @redError;
-  margin-bottom: 10px;
-}
-
-jf-help-tooltip {
-  position: relative;
-
-  div {
-    display: inline-block;
-  }
-
-  .tooltip-icon {
-    display: inline-block;
-    background: url('../images/tooltips-icon.png') no-repeat -2px 0;
-    width: 18px;
-    height: 18px;
-
-    position: absolute;
-    top: 1px;
-    left: 6px;
-
-    &:hover, &.active {
-      background-position: -20px 0;
-    }
-    span {
-      display: none;
-    }
-  }
-}
-
-.tooltipster-default {
-  border-radius: 0;
-  background-color: #262626;
-  color: #c8c8c8;
-  border: 0 none;
-  text-align: left;
-  white-space: pre-wrap;
-  max-width:600px;
-  box-shadow: 0 0px 12px 0 rgba(0,0,0,0.1), 0 0px 10px 0 rgba(0,0,0,0.2);
-
-  a {
-    color: @greenFontHeader;
-  }
-}
-
-.tooltip {
-  z-index: 10000;
-
-  .tooltip-inner {
-    border: 1px solid @grayBorderDark;
-    border-radius: 0;
-    padding: 8px;
-  }
-
-  .tooltip.top,
-  .tooltip-arrow {
-    border-width: 10px 10px 0 !important;
-    margin-left: -10px !important;
-  }
-}
-
-/* Utils
----------------------------------------- */
-.no-padding-left {
-  padding-left: 0 !important;
-}
-
-.padded-row-1x {
-  padding: 5px;
-}
-
-.action-link {
-  color: @greenFontDark;
-  font-weight: 100;
-}
-
-.weight-normal {
-  font-weight: 400;
-}
-
-.no-margin-bottom {
-  margin-bottom: 0 !important;
-}
-
-.no-margin-top {
-  margin-top: 0 !important;
-}
-
-.margin-top-25 {
-  margin-top: 25px;
-}
-
-.margin-top-20 {
-  margin-top: 20px;
-}
-
-.margin-top-10 {
-  margin-top: 10px;
-}
-
-.icon-baseline {
-  position: relative;
-  top: 2px;
-}
-
-.icon-1x {
-  font-size: 16px;
-}
-
-.icon-2x {
-  font-size: 22px;
-}
-
-.icon-3x {
-  font-size: 26px;
-}
-
-.non-visible {
-  visibility: hidden;
-  height: 0;
-}
-
-.hidden {
-  display: none;
-}
-
-.input-label-weight {
-  font-weight: 100;
-}
-
-.preserve-lb {
-  white-space: pre-wrap;
-}
-
-.field-bottom-remark {
-  margin-top: 5px;
-
-  i {
-    float: left;
-    margin: 2px 4px 0 0;
-  }
-  
-  &.attention {
-    color: @redError;
-  }
-}
-
-.back-link-icon {
-  font-size: 20px;
-  margin-right: 5px;
-}
-
-.list-group-item:first-child, .list-group-item:last-child {
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-}
-
-/* headers
--------------------------------------- */
-h1 {
-  color: @greenFontHeader;
-  font-size: 28px;
-  font-weight: 100;
-}
-
-/* Main Navigation
----------------------------------------- */
-
-.col-lg-2.admin-nav,
-.col-md-2.admin-nav,
-.col-lg-11.accordion {
-  padding: 0;
-}
-
-.selected-module {
-  height: 100%;
-}
-
-.module-name {
-  transform: rotate(-90deg);
-  margin-top: 160px;
-  font-size: 3.2em;
-}
-
-//------------------------files browser style-----------------//
-.artifactory-browser {
-  .root-select-cell {
-    width: 100px !important;
-  }
-
-  .folder-select-cell {
-    width: 350px !important;
-  }
-
-  .browse-container {
-    padding: 10px 0;
-    height: 225px;
-    overflow-y: scroll;
-    border: 1px solid @grayBorderLighter;
-    margin-bottom: 20px;
-  }
-
-  .up-folder {
-    i {
-      font-size: 24px;
-    }
-
-    &[disabled] {
-      cursor: default;
-
-      i:before {
-        color: @grayBorderDark;
-      }
-    }
-  }
-
-  .browse-item-row {
-    cursor: pointer;
-    line-height: 30px;
-    padding-left: 15px;
-    outline: none;
-    clear: both;
-
-    &:hover {
-      background-color: #f4f4f4;
-    }
-    &.selected {
-      background-color: #e8f3f7;
-      color: @blueMain;
-    }
-  }
-
-  .browse-item {
-    .icon {
-      float: left;
-      margin: 2px 7px -2px 0;
-    }
-  }
-}
-
-.system-log-wrapper {
-  height: 500px;
-  overflow: auto;
-}
-
-.file-wrapper {
-  width: auto;
-}
-
-//------------------drag and drop---------------------------//
-//.dnd-actions {
-//  width: 50px;
-//}
-
-.dnd-list-wrapper {
-  border: 1px solid @grayBorderLighter;
-  overflow: auto;
-  height: 260px;
-  padding: 5px 5px 0;
-}
-
-.dnd-panel {
-
-  outline: none;
-  //padding: 10px 12px;
-  background-color: #fff;
-  //border: 1px solid @grayBorderLighter;
-
-  .col-lg-5 {
-    width: 47% !important;
-  }
-  .col-lg-2 {
-    width: 6% !important;
-    padding: 0;
-  }
-
-  h5 {
-    margin: 6px 0 8px;
-    color: @grayFontGeneral;
-  }
-
-  .dnd-actions {
-    margin-top: 60px;
-
-    li {
-      display: block;
-      padding: 5px 0;
-      text-align: center;
-
-      span {
-        display: block;
-        font-size: 38px;
-        font-weight: 400;
-        color: @greenFontHeader;
-        line-height: 28px;
-        cursor: pointer;
-        overflow: hidden;
-
-        &[disabled] {
-          color: @grayBGDarker;
-        }
-      }
-    }
-  }
-}
-
-.drag-helper {
-  pointer-events: none;
-  z-index: 1000000;
-  white-space: nowrap;
-  background-color: @greenBGLighter !important;
-  padding: 0 14px;
-  box-shadow: -2px 2px 0 0 @greenFontHeader;
-  color: @greenFontHeader !important;
-  font-size: 16px;
-  font-weight: bold !important;
-  height: 40px !important;
-  line-height: 40px;
-
-  &.multiple {
-    padding-left: 34px;
-  }
-
-  span {
-    font-size: 28px;
-    position: absolute;
-    left: 10px;
-    margin: -1px 8px 0 0;
-  }
-
-  div.drag-item-text {
-    padding: 0 !important;
-    color: @greenFontHeader !important;
-    font-weight: bold !important;
-    line-height: 40px;
-  }
-}
-
-.drag-item, .dropped-item {
-  border: none;
-  padding: 0 10px;
-  cursor: pointer;
-  color: @grayFontDarker;
-  list-style: none;
-  margin-bottom: 4px;
-  position: relative;
-}
-
-.drag-item {
-  background: @grayBGLighter;
-
-  &:hover,
-  &:focus {
-    background: @grayGridRowHover;
-  }
-
-  &.active,
-  &.active:hover,
-  &.active:focus,
-  {
-    background: @greenBGLighter;
-  }
-
-  &.drag-placeholder {
-    border: 1px solid @greenBGLighter;
-    background-color: white !important;
-  }
-
-
-  .icon {
-    position: relative;
-    top: 3px;
-    left: 1px;
-    margin-right: 6px;
-  }
-
-  .drag-item-text {
-    height: 30px;
-    line-height: 30px;
-    width: 100%;
-    white-space: nowrap;
-    overflow: hidden;
-    -ms-text-overflow: ellipsis;
-    text-overflow: ellipsis;
-  }
-}
-
-.dropped-item {
-  padding-right: 20px;
-
-  &,
-  &:hover,
-  &:focus {
-    background: @greenBGLighter;
-  }
-
-  &.active,
-  &.active:hover,
-  &.active:focus {
-    background: @greenFontLight;
-  }
-}
-
-.delete-drop-item {
-  position: absolute;
-  top: 3px;
-  right: 6px;
-  text-decoration: none;
-  font-size: 18px;
-
-  &, &:focus {
-    color: @grayFontDarker;
-  }
-
-  &:hover,
-  &:focus {
-    text-decoration: none;
-  }
-
-  &:hover {
-    color: @greenFontHeader;
-  }
-}
-
-.dnd-filter {
-  width: 95%;
-}
-
-//---------------------------tabs-------------------------//
-
-.tab-list {
-  list-style: none;
-  padding: 0;
-  margin: 0;
-
-  li {
-    float: left;
-    border: 1px solid #eee;
-    border-bottom-width: 0;
-    margin: 3px 3px 0px 3px;
-    padding: 5px;
-    background-color: #ffffff;
-    color: #696969;
-    border-radius: 4px 4px 0 0;
-  }
-  .main-view {
-    border: 1px solid #EEEEEE;
-    clear: both;
-    padding: 0 1em;
-  }
-  .active {
-    background-color: green;
-    color: #ffffff;
-  }
-}
-
-//-----caret----//
-
-.caret-wrapper {
-  border: 1px solid #ddd;
-  padding: 4px 10px 4px 8px;
-  border-top-right-radius: 5px;
-  border-bottom-right-radius: 5px;
-  border-left: none;
-}
-
-.padding-10 {
-  padding: 10px;
-}
-
-//-----panels----//
-.panel-container {
-  position: relative;
-  margin: 0 0 14px;
-
-  .panel-heading {
-    background: @white;
-    border: none;
-    position: relative;
-    top: 10px;
-    left: 4px;
-    color: @greenBGDark;
-    width: auto;
-    padding: 0 4px 0 4px;
-    font-size: 16px;
-    font-weight: 600;
-    z-index: 300;
-
-    .panel-container .panel &, .wizard-content &, &.borderless {
-      left: 0;
-      padding-left: 0;
-    }
-  }
-
-  .panel-body {
-    padding: 0;
-  }
-
-  .panel {
-    padding: 21px 21px 12px;
-    margin-bottom: 0;
-    border-radius: 0;
-    box-shadow: 0 0 0;
-    margin-right: 15px;
-    &.clearfix {
-      margin-right: 0;
-    }
-
-    .panel-container .panel &, .wizard-content &, &.borderless {
-      border-width: 0;
-      border-top-width: 1px;
-      padding-right: 0;
-      padding-left: 0;
-    }
-    
-    .form-group:last-child {
-      margin-bottom: 10px;
-    }
-  }
-}
-
-jf-panel.license-required {
-  .panel-container::before {
-    content: "";
-    display: block;
-    position: absolute;
-    z-index: 1000;
-    width: 100%;
-    height: 100%;
-    //background: rgba(0, 0, 0, 0.1);
-  }
-  &::after {
-    content: "";
-  }
-
-  .panel-heading {
-    padding-right: 25px;
-
-    .license-required-icon;
-
-    &::after {
-      right: 0;
-    }
-  }
-}
-
-.generate-panel-z-order(10);
-
-.generate-panel-z-order(@n, @i: 1) when (@i =< @n) {
-  jf-panel:nth-child(@{i}) .panel-container {
-    z-index: (200 - @i);
-  }
-  .generate-panel-z-order(@n, (@i + 1));
-}
-
-//-----dropdowns-----//
-
-.dropdown-container {
-  padding: 0;
-
-  li {
-    padding: 0 !important;
-  }
-
-  .dropdown-item {
-
-    border-bottom: 1px solid @grayBorderLight;
-
-    a {
-      padding: 10px 0 9px 0 !important;
-      font-weight: 100;
-      color: @grayFontDark !important;
-
-      &:hover {
-        background: @greenBGLighter;
-        color: @greenFontDark !important;
-      }
-    }
-
-    &:last-child {
-      border: none;
-    }
-
-  }
-
-}
-
-//-----buttons----//
-.btn {
-  border-radius: 0;
-  border: none;
-  color: @blackFontDark;
-  font-weight: normal;
-  padding: 0 12px;
-  height: 40px;
-  line-height: 40px;
-  min-width: 100px;
-  opacity: 1 !important;
-  outline: none;
-
-  &:focus, &:visited, &:hover, &:active {
-    outline: none;
-    border: none;
-    box-shadow: none;
-  }
-
-  &:active:focus {
-    outline: none;
-    box-shadow: none;
-  }
-
-  &.btn-primary {
-    background: @greenBGPrimary;
-    color: @white;
-
-    &:focus, &:visited {
-      background: @greenBGPrimary;
-    }
-
-    &:hover {
-      background: @greenBGPrimaryHover;
-    }
-
-    &:active {
-      background: @greenBGPrimaryHover;
-    }
-
-    &[disabled] {
-      background: @grayBGDisabled;
-    }
-  }
-
-  &.btn-primary-light {
-    background: @greenBGSmallHover;
-    color: @greenFontDarker;
-
-    &:hover {
-      color: @greenFontDarker;
-      background: @greenBGSmall;
-    }
-
-    &:active {
-      background: @greenBGSmallActive;
-      color: @white;
-    }
-
-    &[disabled] {
-      background: @grayBGDisabled;
-    }
-  }
-
-  &.btn-secondary {
-    background: @greenBGSecondary;
-    color: @greenBGPrimary;
-
-    &:focus, &:visited {
-      background: @greenBGSecondary;
-    }
-
-    &:hover {
-      background: @greenBGSecondaryHover;
-    }
-
-    &:active {
-      background: @greenBGSecondaryHover;
-    }
-
-    &[disabled] {
-      background: @grayButtonSecondaryDisabled;
-    }
-  }
-
-  &.btn-small {
-    height: 36px; //temporary !
-    background: @greenBGSmall;
-    color: @greenFontDarker;
-    padding: 0;
-    //padding: 3px 12px;
-
-    &:hover {
-      color: @greenFontDarker;
-      background: @greenBGSmallHover;
-    }
-
-    &:active {
-      background: @greenBGSmallActive;
-      color: @white;
-    }
-
-    &[disabled] {
-      background: @grayBGDisabled;
-      color: @white;
-    }
-  }
-
-  &.btn-default {
-    background: transparent;
-    color: @grayFontGeneral;
-
-    &:hover {
-      color: @greenFontDarker;
-    }
-  }
-
-  &.btn-wide {
-    min-width: 155px;
-  }
-
-}
-
-form.ng-pending {
-  .btn[disabled] {
-    &.btn-primary, &.btn-primary-light {
-      background: @greenBGPrimary;
-    }
-    &.btn-secondary {
-      background: @greenBGSecondary;
-    }
-    &.btn-small {
-      background: @greenBGSmall;
-      color: @greenFontDarker;
-    }
-  }
-}
-
-.btn-action {
-  color: @blackFontDark;
-  padding: 0;
-  width: 40px;
-  font-weight: 100;
-  font-size: 14px;
-
-  &:hover {
-    color: @greenFontHeader;
-    background: @grayBGMedium;
-  }
-}
-
-//-----inputs----//
-
-.form-group {
-  margin-bottom: 27px;
-
-  &.form-checkbox, &.half-margin-bottom {
-    margin-bottom: 14px;
-  }
-  
-  &.form-checkbox-group {
-    padding-left: 26px;
-  }
-
-  &.form-group-no-margin {
-    margin-bottom: 0;
-  }
-}
-
-.input-label {
-  position: relative;
-  display: block;
-  clear: both;
-
-  label {
-    -webkit-transform: translateY(-50%);
-    -moz-transform: translateY(-50%);
-    -ms-transform: translateY(-50%);
-    -o-transform: translateY(-50%);
-    transform: translateY(-50%);
-    -webkit-transition: all 0.2s ease-in-out;
-    -moz-transition: all 0.2s ease-in-out;
-    transition: all 0.2s ease-in-out;
-    position: absolute;
-    top: 50%;
-    left: 1em;
-    background-color: #fff;
-    color: #b3b3b3;
-    font-weight: normal;
-    cursor: text;
-    pointer-events: none;
-  }
-
-  input.hascontent ~ label {
-    color: #66A523;
-  }
-
-  input:focus ~ label, input.hascontent ~ label, input:focus ~ label, input.hascontent ~ label {
-    top: 0;
-    font-size: .9em;
-    padding: 0 .3em;
-    color: #66A523;
-  }
-}
-
-label.mandatory {
-  &::after {
-    content: "*";
-    margin-left: 4px;
-  }
-}
-
-.input-small {
-  width: 120px !important;
-  height: 25px !important;
-}
-
-.input-text {
-  border: transparent;
-  border-radius: 0;
-  outline: none;
-  box-shadow: none;
-
-  width: 100%;
-  border: 1px solid @grayBorderLighter;
-  padding: 0 10px;
-  transition: border-color .5s ease;
-  &:not(textarea) {
-    height: 40px;
-  }
-  textarea& {
-    padding-top: 5px;
-    padding-bottom: 5px;
-    resize: none;
-  }
-  &[type="number"] {
-    padding-right: 0;
-  }
-
-  &:focus {
-    border-color: @grayBorderMiddleDark;
-    color: @grayFontLight;
-    box-shadow: none;
-  }
-
-  &.invalid.ng-invalid:not([disabled]) {
-    border-color: @redError;
-    box-shadow: none;
-  }
-  &:not(.not-disabled-style)[disabled] {
-    background: @grayBGLighter;
-  }
-  &::-ms-clear,
-  &::-ms-reveal {
-    display: none;
-  }
-  &:-webkit-autofill {
-    -webkit-box-shadow: 0 0 0px 1000px white inset;
-  }
-  &::-webkit-input-placeholder {
-    .jf-placeholder();
-  }
-
-  &:-moz-placeholder {
-    /* Firefox 18- */
-    .jf-placeholder();
-  }
-
-  &::-moz-placeholder {
-    /* Firefox 19+ */
-    .jf-placeholder();
-  }
-
-  &:-ms-input-placeholder {
-    .jf-placeholder();
-  }
-}
-.color-picker-input {
-  .input-text;
-}
-.color-picker-swatch {
-  border-radius: 0;
-}
-
-//----------------Checkbox---------------------//
-.jf-checkbox {
-  font-weight: 100;
-  input[type="checkbox"] {
-    position: absolute;
-    opacity: 0;
-  }
-
-  input[type="checkbox"] + span {
-    display: inline-block;
-    background: #fff url(../images/checkbox.png) left top no-repeat;
-    width: 17px;
-    height: 17px;
-    margin: -1px 5px 0 0;
-    position: relative;
-    vertical-align: middle;
-  }
-
-  input[type="checkbox"]:checked + span {
-    background-image: url(../images/checkbox_checked.png);
-  }
-
-  input[type="checkbox"][disabled] + span {
-    background-color: #ddd;
-  }
-
-  input[type="checkbox"]:focus + span {
-    .glow;
-  }
-}
-
-jf-checkbox + jf-checkbox {
-  margin-left: 20px;
-}
-
-//------------------------ Switch toggle -----------------//
-.jf-switch-toggle {
-  .switch-toggle {
-    display: inline-block;
-    width: 35px;
-    padding: 2px;
-    border-radius: 20px;
-    position: relative;
-    height: 19px;
-    cursor: pointer;
-    vertical-align: middle;
-    margin-top: -2px;
-    margin-right: 5px;
-    transition: all .25s ease-in;
-    span {
-      display: inline-block;
-      background: #fff;
-      width: 15px;
-      height: 15px;
-      border-radius: 50%;
-      position: absolute;
-      top: 2px;
-      transition: all .15s ease-in;
-    }
-  }
-  &.on {
-    .switch-toggle {
-      background: #43a047;
-      span {left: 2px;}
-    }
-    .text-off {display: none;}
-  }
-  &.off {
-    .switch-toggle {
-      background: #d7593f;
-      span {left: 18px;}
-    }
-    .text-on {display: none;}
-  }
-
-  span[class^="text-"] {
-    font-size: 12px;
-    &.text-on {color: #43a047;}
-    &.text-off {color: #d7593f;}
-  }
-}
-
-//------------------------Data Tables-----------------//
-
-.jf-data-table {
-  td {
-    padding: 0;
-    line-height: 30px;
-    vertical-align: top;
-
-    &:first-child {
-      white-space: nowrap;
-      padding-right: 40px;
-    }
-    &:not(:first-child) {
-      word-wrap: break-word;      /* IE 5+ */
-      overflow-wrap: break-word;
-
-      #jf-artifacts & {
-        word-break: break-all;
-      }
-    }
-
-    .icon-hourglass {
-      margin-top: 5px;
-    }
-  }
-}
-
-.jf-data-table-ellipsis {
-  > div {
-    clear: both;
-    line-height: 30px;
-
-    white-space: nowrap;
-    overflow: hidden;
-    text-overflow: ellipsis;
-
-    .key-cell {
-      float: left;
-      width: 200px;
-    }
-  }
-
-  .license-required-icon, .license-required {
-    &::after {
-      line-height: 18px;
-      right: -24px;
-    }
-  }
-}
-
-//------------------------Validation-----------------//
-.jf-validation {
-  color: @redError;
-}
-
-//------------------------typography-----------------//
-
-h5 {
-  font-size: 15px;
-  color: @greenFontDark;
-}
-
-//------------------------toasts-----------------//
-
- at keyframes toaster-in {
-  from {right: -370px;}
-  to {right: 0;}
-}
-
- at keyframes toaster-out {
-  from {right: 0;}
-  to {right: -370px;}
-}
-
-#toast-container {
-  top: 80px;
-  right: 20px;
-
-  .toast {
-    display: table;
-    height: 100px;
-    background: #eee !important;
-    border-radius: 0;
-    color: @grayFontGeneral;
-    padding: 0;
-    width: 340px;
-    opacity: 1;
-    filter: alpha(opacity=100);
-    float: right;
-    clear: both;
-    cursor: auto;
-
-    position: relative;
-
-    //    animation: toaster-in 0.5s ease, toaster-out 0.5s ease 4.5s;
-
-    &.ng-enter {
-      opacity: 1 !important;
-      right: -370px !important;
-      transition: right .3s ease !important;
-    }
-    &.ng-enter.ng-enter-active {
-      opacity: 1 !important;
-      right: 0 !important;
-    }
-    &.ng-leave {
-      opacity: 1 !important;
-      right: 0 !important;
-      transition: right .3s ease-out !important;
-    }
-    &.ng-leave.ng-leave-active {
-      opacity: 1 !important;
-      right: -370px !important;
-    }
-
-
-    .toast-message {
-      display: table-cell;
-      vertical-align: middle;
-      font-size: 14px;
-      padding: 20px;
-      background-color: #fff;
-    }
-
-    .toast-close-button {
-      color: @grayFontGeneral;
-      position: absolute;
-      right: 12px;
-      top: 0;
-      font-size: 22px;
-      font-weight: normal;
-
-      &:hover {
-        color: inherit;
-      }
-    }
-
-    .toast-title {
-      display: table-cell;
-      background-color: @grayBorderLight;
-      width: 80px;
-      text-align: center;
-      vertical-align: middle;
-      padding: 0 25px;
-
-      &::before {
-        font-family: "artifactory" !important;
-        font-size: 30px;
-        font-weight: normal;
-      }
-    }
-
-    &.toast-success {
-      &, & a {
-        color: @greenFontHeader;
-      }
-
-      .toast-title::before {
-        content: ",";
-      }
-    }
-    &.toast-error {
-      //      animation: toaster-in 0.5s ease; //, toaster-out 0.5s ease;
-
-      &, & a {
-        color: @redError;
-      }
-
-      .toast-title::before {
-        content: "-";
-      }
-    }
-    &.toast-warning {
-      &, & a {
-        color: @yellowWarning;
-      }
-
-      .toast-title::before {
-        content: "{";
-      }
-    }
-    &.toast-info {
-      &, & a {
-        color: @blueMain;
-      }
-
-      .toast-title::before {
-        content: "\e002";
-      }
-    }
-
-    a {
-      text-decoration: underline;
-
-      &:hover {
-        text-decoration: none;
-      }
-    }
-
-    &:hover {
-      box-shadow: 0 0 12px #999999;
-    }
-  }
-}
-
-//----------------------------- licenses -------------------------//
-
-.license-approved {
-  &, a {
-    color: @greenFontHeader !important;
-  }
-}
-.license-unapproved {
-  &, a {
-    color: @redError !important;
-  }
-}
-.license-notfound {
-  &, a {
-    color: orange !important;
-  }
-}
-.license-neutral {
-  &, a {
-    color: @blueMain !important;
-  }
-}
-.license-found-same-or-notfound {
-  &, a {
-    color: @grayFontLighter !important;
-  }
-}
-
-//------------------------permanent notifications-----------------//
-
-.constant-messages-container {
-  width: 100%;
-  color: #000;
-  z-index: 100;
-  position: relative;
-
-  .constant-message {
-    text-align: center;
-
-    a {
-      text-decoration: underline;
-
-      &:hover {
-        text-decoration: none;
-      }
-    }
-
-    &.default {
-      a {
-        color: #fff;
-      }
-
-      font-size: 13px;
-      font-weight: 600;
-      color: #fff;
-      height: 25px;
-      line-height: 25px;
-    }
-
-    &.system {
-      position: relative;
-      box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.37);
-      background-color: #fff;
-
-      font-size: 14px;
-      font-weight: 400;
-      color: @grayFontGeneral;
-      height: 40px;
-      line-height: 40px;
-      white-space: nowrap;
-
-      .message-container {
-        margin: 0 20px;
-        overflow: hidden;
-
-        & div {
-          display: inline-block;
-          white-space: nowrap;
-          vertical-align: top;
-        }
-
-        &:hover {
-          .message-text.marqueed {
-            text-overflow: clip;
-
-            span {
-              position: relative;
-              animation: marquee 140s linear;
-            }
-          }
-        }
-
-        &.pause-animation .message-text.marqueed span {
-          -webkit-animation-play-state: paused;
-          -moz-animation-play-state: paused;
-          -o-animation-play-state: paused;
-          animation-play-state: paused;
-        }
-      }
-
-      .message-title {
-        font-weight: 700;
-        margin-right: 2px;
-      }
-      .message-text {
-        position: relative;
-        overflow: hidden;
-        text-overflow: ellipsis;
-      }
-    }
-  }
-
-  .error {
-    background-color: @redError;
-  }
-
-  .warning {
-    background-color: @yellowWarning;
-  }
-
-  .info {
-    background-color: @grayFontGeneral;
-  }
-}
-
-.ng-toast {
-  margin-top: 0;
-  top: 60px !important;
-  z-index: 1030;
-
-  &.ng-toast--right .ng-toast__list {
-    width: 100%;
-    margin-right: 0;
-  }
-
-  .ng-toast__message .alert {
-    width: 100%;
-    text-align: center;
-    margin: 0;
-    height: 20px;
-    line-height: 0px;
-    border-radius: 0;
-    font-size: 14px;
-    font-weight: bold;
-  }
-}
-
-//------codemirror----//
-.cm-link {
-  text-decoration: underline;
-  cursor: pointer;
-}
-
-
-//---multiple file upload---//
-.wrapper-drop-zone {
-
-}
-
-.drop-zone {
-  display: inline-block;
-  position: relative;
-  width: 380px;
-  text-align: center;
-  min-height: 44px;
-  line-height: 44px;
-  font-size: 16px;
-  border: 2px dashed @grayBorderLighter;
-  transition: all 0.3s ease-in-out;
-  &.drop-zone-hover,
-  &.drop-zone-load{
-    background-color: #f7f7f7;
-    border-style: solid !important;
-  }
-  span {
-    color: @greenFontHeader;
-  }
-
-  &[disabled] {
-    background-color: @grayBGDark;
-  }
-}
-
-/*.drop-zone-hover {
-  background-color: @grayBGLight;
-}*/
-
-.drop-zone-file-name {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-  padding: 0 15px;
-}
-
-.upload-files-frame {
-  max-height: 120px;
-  overflow-y: auto;
-
-  ul {
-    padding: 0;
-    overflow: hidden;
-  }
-
-  .upload-item {
-    list-style: none;
-    padding: 0 10px;
-    height: 40px;
-    line-height: 40px;
-    span {
-      color: #707070;
-      text-align: left;
-    }
-
-    &:nth-child(odd) {
-      background-color: @grayGridRow;
-    }
-    &:nth-child(even) {
-      background-color: @white;
-    }
-
-    .item-remove {
-      cursor: pointer;
-    }
-  }
-}
-
-.select-files-hidden {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  width: 100%;
-  opacity: 0;
-  cursor: pointer;
-}
-
-
-//-----------------File select - Deploy --------------//
-
-.drop-zone-wrapper {
-  .drop-zone {
-    border: 2px dashed @grayBorderLighter;
-    min-height: 80px;
-    padding-top: 10px;
-    line-height: 24px;
-    transition: all .3s ease-in-out;
-
-    .icon {
-      font-size: 28px;
-    }
-  }
-
-  .icon-upload-hover {
-    display: none;
-  }
-
-  .drop-zone-hover {
-    background-color: @grayBGLight;
-    border-style: solid;
-    .icon-upload-small {
-      display: none;
-    }
-    .icon-upload-hover {
-      display: inline;
-    }
-  }
-
-  .select-files-hidden {
-    height: 70px;
-  }
-
-  .icon.icon-clear {
-    font-size: 16px;
-    position: relative;
-    top: 3px;
-    color: @grayFontGeneral;
-
-    &:hover {
-      color: @greenFontHeader;
-    }
-  }
-}
-
-//-----------------Code Mirror - Code Display--------------//
-
-.CodeMirror {
-  height: auto;
-  border: 1px solid #eee;
-  padding: 15px;
-
-  .CodeMirror-code {
-    div:nth-child(even) {
-      &, .CodeMirror-gutter-wrapper {
-        background-color: @grayGridRow;
-      }
-    }
-  }
-
-  .CodeMirror-gutters {
-    border-right: 0 none;
-    background-color: transparent;
-  }
-
-  pre, .CodeMirror-linenumber {
-    font-size: 12px;
-    line-height: 20px;
-  }
-
-  .CodeMirror-linenumber {
-    text-align: left;
-  }
-}
-
-//--------------Server Error----------------------//
-#server-error {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  right: 0;
-
-  .error-box {
-    position: absolute;
-    width: 628px;
-    height: 238px;
-
-    top: 30%;
-    left: 50%;
-    margin-left: -319px;
-
-    border: 1px solid @greenFontHeader;
-    padding: 20px 20px 20px 100px;
-
-    h1 {
-      font-size: 32px;
-      font-weight: 400;
-      margin: 5px 0 20px;
-    }
-
-    .icon-notif-warning {
-      position: absolute;
-      font-size: 36px;
-      left: 30px;
-      top: 22px;
-      color: @greenFontHeader;
-    }
-
-    p {
-      font-size: 14px;
-      line-height: 24px;
-    }
-
-    .icon-refresh {
-      font-size: 20px;
-      position: relative;
-      top: 4px;
-      left: 5px;
-      cursor: pointer;
-
-      &:hover {
-        color: @greenFontHeader;
-      }
-    }
-  }
-}
-
-//--------------Modals----------------------------//
-
-.modal {
-  overflow: auto;
-  .modal-header {
-    padding: 0 0 0 35px;
-    line-height: 50px;
-
-    .close {
-      margin: 0 20px;
-      line-height: 50px;
-      font-size: 26px;
-    }
-  }
-
-  .modal-content {
-    border-radius: 0;
-  }
-
-  .modal-title {
-    color: @blueMain;
-    font-size: 20px;
-    font-weight: 400;
-    line-height: 48px;
-    padding-top: 2px;
-  }
-
-  .modal-body {
-    max-height: 475px;
-    padding: 20px 34px;
-    overflow-y: auto;
-    overflow-x: hidden;
-  }
-
-  .modal-footer {
-    background: @grayBGLight;
-    border-top: 0 none;
-  }
-}
-
-.grid-filter {
-  .input-text {
-    width: 380px !important;
-  }
-
-  .jf-field {
-    display: inline-block;
-  }
-
-  .btn {
-    margin-top: -2px;
-  }
-
-  .jf-validation {
-    position: absolute;
-    min-width: 200px;
-    top: 10px;
-    left: 400px;
-  }
-}
-
-.inline-block {
-  display: inline-block;
-}
-
-.display-block {
-  display: block;
-}
-.form-group-cell {
-  width: 380px;
-  display: inline-block;
-  vertical-align: top;
-  margin-right: 20px;
-
-  label {
-    font-weight: 100;
-  }
-  
-  &.auto-width {
-    width: auto !important;
-  }
-
-  &.form-button {
-    margin-top: 25px;
-    width: auto !important;
-  }
-
-  &.form-link {
-    height: 40px;
-
-    &, & i:before {
-      line-height: 40px;
-    }
-  }
-
-  .form-search {
-    font-size: 22px;
-  }
-
-  .deploy .panel & {
-    width: 340px;
-  }
-
-  .set-me-up-modal.modal-body & {
-    width: 240px !important;
-  }
-
-  .modal-body .panel & {
-    width: 356px !important;
-  }
-
-
-  &.double {
-    width: 783px;
-  }
-
-  .search-wrapper &.auto-width {
-    @media screen and (max-width: 1660px) {
-      width: 783px !important;
-      text-align: right;
-    }
-  }
-
-  .properties & {
-    @media screen and (max-width: 1660px) {
-      &:first-child {
-        margin: 0 130px 27px 0;
-
-      }
-    }
-  }
-}
-
-.filter-group {
-  float: left;
-  padding: 0;
-}
-
-.btns-in-row {
-  button {
-    margin-right: 20px;
-  }
-
-  position: relative;
-  top: 24px;
-}
-
-.navbar-brand {
-  font-size: 0;
-}
-.logo-picture {
-  max-height: 50px;
-}
-
-.smart-repo-ind {
-  width: 26px;
-  height: 32px;
-  background-size: 100%;
-
-  position: absolute;
-  z-index: 10;
-}
-
-.jf-spinner {
-  position: fixed;
-  width: 100%;
-  height: 100%;
-  background-color: rgba(255, 255, 255, 0.5);
-  z-index: 10000000;
-
-  .spinner-msg {
-    position: absolute;
-    height: 100px;
-    width: 100px;
-
-    color: @grayFontGeneral;
-    text-align: center;
-    top: 50%;
-    left: 50%;
-
-    margin-top: -50px;
-    margin-left: -50px;
-
-    #jf-content & {
-      margin-top: -110px;
-      margin-left: -150px;
-    }
-  }
-
-  .icon-hourglass {
-    background-size: 100px 100px;
-    width: 100px;
-    height: 100px;
-  }
-
-}
-
-.jf-spinner-local {
-  display: inline;
-  position: relative;
-  width: 100%;
-  height: 100%;
-  z-index: 10000000;
-  background-color: rgba(0, 0, 255, 0.5);
-
-  .spinner-msg-local {
-    position: absolute;
-    height: 20px;
-    width: 20px;
-
-    color: @grayFontGeneral;
-    text-align: center;
-    top: 0px;
-    left: 0px;
-
-  }
-
-  .icon-hourglass-local {
-    background-size: 20px 20px;
-    width: 20px;
-    height: 20px;
-  }
-}
-
-.icon-hourglass-local,
-.icon-hourglass {
-  .icon-hourglass();
-  .spinning();
-
-  background-size: 20px 20px;
-  width: 20px;
-  height: 20px;
-}
-
- at keyframes spin {
-  from {transform: rotate(0deg);}
-  to {transform: rotate(360deg);}
-}
-
-.spinning() {
-  animation: spin 0.8s infinite linear;
-}
-
-.icon-button {
-  color: @grayFontGeneral;
-  cursor: pointer;
-  font-size: 22px;
-  
-  &:hover {
-    color: @grayFontGeneral;
-  }
-}
-
-.copy-to-clip {
-  h1 & , .jf-data-table & {
-    position: relative;
-    top: 2px;
-    left: 4px;
-  }
-
-  &.code-mirror-copy {
-    position: absolute;
-    z-index: 100;
-    right: 54px;
-    margin-top: 2px;
-  }
-}
-
-.cursor-pointer {
-  cursor: pointer;
-}
-
-.noselect {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -khtml-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-}
-
-.info-bar i {
-  float: left;
-  margin: 2px 6px 0 0;
-  color: @blueMain;
-}
-
-.ui-widget-content {
-  border: 1px solid #aaaaaa;
-  background: #ffffff;
-  color: #222222;
-}
-
-.ui-state-hover,
-.ui-widget-content .ui-state-hover,
-.ui-widget-header .ui-state-hover,
-.ui-state-focus,
-.ui-widget-content .ui-state-focus,
-.ui-widget-header .ui-state-focus {
-  border: 1px solid #999999;
-  background: #dadada;
-  font-weight: normal;
-  color: #212121;
-}
-
-.show-all-list-item {
-  &:hover,
-  &:focus {
-    background: @grayBGLight;
-  }
-  height: 30px;
-  line-height: 30px;
-  width: 100%;
-  white-space: nowrap;
-  overflow: hidden;
-  -ms-text-overflow: ellipsis;
-  text-overflow: ellipsis;
-}
-
-.the-schpitz {
-  position: relative;
-
-  &::before {
-    content: '';
-    width: 0;
-    height: 0;
-    border-style: solid;
-    border-width: 6px 6px 0 6px;
-    border-color: @greenBGDark transparent transparent transparent;
-    position: absolute;
-    bottom: -6px;
-    left: 50%;
-    margin-left: -6px;
-  }
-
-  &::after {
-    content: '';
-    width: 0;
-    height: 0;
-    border-style: solid;
-    border-width: 4px 4px 0 4px;
-    border-color: @white transparent transparent transparent;
-    position: absolute;
-    bottom: -4px;
-    left: 50%;
-    margin-left: -4px;
-  }
-}
-
-.not-like-input {
-  background-color: transparent;
-  border-color: transparent !important;
-}
-
-.not-allowed {
-  cursor: not-allowed;
-}
-
-.disabled-look {
-  background-color: @grayBGLighter;
-}
-
-
-// TOOLTIPS ANIMATION
- at tooltipDist: 15px;
-
-.tooltipster-default .tooltipster-content {
-  font-size: 12px;
-  line-height: 18px;
-}
-
-.tooltipster-fade {
-  opacity: 0;
-  transition: margin .15s ease-out, opacity .1s ease-out !important;
-  margin: @tooltipDist 0 0 0;
-  &.bottom {
-    margin: - at tooltipDist 0 0 0;
-  }
-}
-.tooltipster-fade-show {
-  opacity: 1;
-  margin: 0 !important;
-}
diff --git a/web/angular-web/src/main/webapp/app/assets/stylesheets/error_pages.less b/web/angular-web/src/main/webapp/app/assets/stylesheets/error_pages.less
deleted file mode 100644
index e8c4965..0000000
--- a/web/angular-web/src/main/webapp/app/assets/stylesheets/error_pages.less
+++ /dev/null
@@ -1,39 +0,0 @@
-.error_page {
-  text-align: center;
-  & > div {
-    display: inline-block;
-    text-align: left;
-    margin-left: -200px;
-    h1 {
-      font-size: 29px;
-      color: #222;
-      margin: 180px 0 12px;
-      position: relative;
-      span {
-        display: block;
-        font-size: 73px;
-        margin-bottom: -2px;
-      }
-      .notfound_image {
-        position: absolute;
-        width: 352px;
-        bottom: -26px;
-        margin-left: 54px;
-      }
-      .forbidden_image {
-        position: absolute;
-        width: 238px;
-        bottom: -50px;
-        margin-left: 130px;
-      }
-    }
-    &.forbidden {
-      margin-left: -260px;
-      h1 {
-        font-size: 43px;
-        margin-bottom: 2px;
-        margin-top: 200px;
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/assets/stylesheets/features.less b/web/angular-web/src/main/webapp/app/assets/stylesheets/features.less
deleted file mode 100644
index 8db50bc..0000000
--- a/web/angular-web/src/main/webapp/app/assets/stylesheets/features.less
+++ /dev/null
@@ -1,43 +0,0 @@
-.license-required {
-  position: relative;
-  color: grey;
-  cursor: default !important;
-
-  *:not(a) {
-    color: grey;
-    cursor: default !important;
-  }
-
-  .license-required-icon;
-
-  &:not(.addon-container) a {
-    pointer-events: none;
-  }
-}
-
-.license-required-PRO {
-  &::after {
-
-  }
-}
-
-.license-required-ENT {
-  &::after {
-
-  }
-}
-
-.license-required-icon {
-  &::after {
-    display: block;
-    position: absolute;
-    top: 0;
-    right: 5px;
-    width: 20px;
-
-    font-family: "artifactory" !important;
-    font-size: 16px;
-    content: "\e004";
-    color: @blueMain !important;
-  }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/assets/stylesheets/home.less b/web/angular-web/src/main/webapp/app/assets/stylesheets/home.less
deleted file mode 100644
index 65e4319..0000000
--- a/web/angular-web/src/main/webapp/app/assets/stylesheets/home.less
+++ /dev/null
@@ -1,273 +0,0 @@
-// Animations
- at -webkit-keyframes swell {
-  0% { transform: scale(0); }
-  47% { transform: scale(1); }
-  50% { transform: scale(1.1); }
-  75% { transform: scale(1); }
-  100% { transform: scale(1); }
-}
-
- at keyframes swell {
-  0% { transform: scale(0); }
-  47% { transform: scale(1); }
-  50% { transform: scale(1.1); }
-  75% { transform: scale(1); }
-  100% { transform: scale(1); }
-}
-
-.swelling {
-  -webkit-animation: swell 0.5s linear forwards;
-  animation: swell 0.5s linear forwards;
-}
-
-.home-page {
-  h3 {
-    color: @blackFontDark;
-    font-size: 32px;
-    margin-bottom: 30px;
-  }
-
-  .jf-switch {
-    width: 100%;
-    z-index: 2;
-    background: #fff;
-    border: solid #e8e8e8;
-    border-width: 1px 0;
-
-    .jf-switch-options {
-      li {
-        &:not(:first-child) {
-          padding-left: 40px;
-
-          &::before {
-            content: " ";
-            padding: 0;
-          }
-        }
-      }
-    }
-
-    .jf-switch-option {
-      display: block;
-      color: @grayFontLighter;
-      font-size: 16px;
-      white-space: nowrap;
-      padding: 22px 0;
-      min-width: 40px;
-      border-top: 1px solid #fff;
-      border-bottom: 1px solid #fff;
-
-      &:hover, &.active {
-        border-color: @greenFontHeader;
-      }
-      &:hover {
-        color: @grayFontLighter;
-      }
-      &.active {
-        color: @grayFontGeneral;
-        .the-schpitz;
-      }
-    }
-  }
-
-  .home-page-head {
-    margin-top: 20px;
-    padding: 0 20px;
-  }
-
-  .message-of-day {
-    height: 35px;
-    line-height: 35px;
-    background-color: #fff;
-    padding-left: 15px;
-
-    span {
-      font-size: 12px;
-      color: @blueFontDark;
-    }
-  }
-
-  .home-page-intro {
-    margin-top: 20px;
-    position: relative;
-    padding-left: 15px;
-  }
-
-  .artifactory-version {
-    font-size: 16px;
-    margin: 0 0 5px;
-
-    a i:before {
-      color: @blueLinkBasic;
-    }
-  }
-  
-  .number-artifacts {
-    font-weight: bold;
-  }
-
-  .jfrog-news {
-    float: right;
-    width: 30%;
-    margin: 0 0 10px 10px;
-
-    background-color: #fff;
-    box-shadow: 0 1px 4px 1px rgba(0, 0, 0, .1);
-
-    div {
-      padding-left: 15px;
-
-      &.headline {
-        line-height: 40px;
-        height: 40px;
-        font-size: 18px;
-        color: @blueMain;
-        border-bottom: 1px solid @blueMain;
-
-        i {
-          position: absolute;
-          margin: 1px 0 0 10px;
-          font-size: 44px;
-        }
-
-        .twitter-follow {
-          position: absolute;
-          right: 10px;
-          top: 3px;
-        }
-      }
-
-      &.news-content {
-        padding: 10px 15px 6px;
-        max-height: 150px;
-        overflow: auto;
-
-        h2 {
-          font-size: 16px;
-          font-weight: 700;
-          margin: 0 0 10px;
-        }
-      }
-    }
-
-    iframe {
-      width: 625px;
-      height: 100px;
-      background-color: #fff;
-      border: 0 none;
-    }
-  }
-
-  .addon-list {
-    padding-left: 20px;
-  }
-
-  .addon-container {
-    position: relative;
-    display: inline-block;
-    height: 200px;
-    background: @grayBGLight;
-    margin: 0 20px 15px 0;
-    text-align: center;
-    transition: 0.5s all;
-
-    &, .addon-name, .addon-status, .addon-links {
-      width: 180px;
-    }
-
-    &:hover {
-      box-shadow: 0 1px 6px 1px rgba(0, 0, 0, 0.17);
-    }
-
-    .addon-icon {
-      // Commented out animation until we get clearance from Yoav
-      //transform: scale(0);
-      width: 130px;
-      height: 70px;
-      margin: 35px auto 0;
-      background-position: center center;
-      background-size: auto 100%;
-    }
-
-    .addon-name {
-      position: absolute;
-      top: 120px;
-      font-weight: bold;
-      color: @grayFontLighter;
-    }
-
-    .addon-status {
-      position: absolute;
-      top: 145px;
-
-      color: @greenFontHeader;
-
-      &.available {
-        color: @blueFontDark;
-      }
-    }
-
-    .addon-links {
-      position: absolute;
-      top: 164px;
-      font-size: 12px;
-
-      &, a {
-        color: @grayFontLighter;
-      }
-
-      a:hover {
-        color: @greenFontHeader;
-      }
-
-      span {
-        font-size: 20px;
-        margin: 0 4px;
-        position: relative;
-        top: 3px;
-      }
-
-      visibility: hidden;
-    }
-
-    &:hover {
-      .addon-links {
-        visibility: visible;
-      }
-    }
-
-    &.license-required::after {
-      top: 7px;
-      right: 12px;
-    }
-  }
-
-  .today-content {
-    margin-left: 5px;
-  }
-
-  .icon-padlock {
-    font-size: 22px;
-    position: relative;
-    top: 4px;
-    margin-right: 4px;
-  }
-
-}
-
-#home-disclaimer {
-  position: absolute;
-  bottom: 0;
-  padding: 0 20px 0;
-  font-size: 11px;
-  color: #bbb;
-  text-overflow: ellipsis;
-  width: 100%;
-  white-space: nowrap;
-  overflow: hidden;
-
-  a {
-    color: #75c2ff;
-  }
-}
-
diff --git a/web/angular-web/src/main/webapp/app/assets/stylesheets/jf_switch.less b/web/angular-web/src/main/webapp/app/assets/stylesheets/jf_switch.less
deleted file mode 100644
index 7c200ca..0000000
--- a/web/angular-web/src/main/webapp/app/assets/stylesheets/jf_switch.less
+++ /dev/null
@@ -1,42 +0,0 @@
-.jf-switch {
-  margin-bottom: 16px;
-  font-size: 14px;
-  font-weight: 100;
-
-  .jf-switch-title {
-    color: @grayFontDarker;
-    margin-right: 10px;
-  }
-
-  .jf-switch-options {
-    display: inline-block;
-
-    li {
-      display: inline-block;
-      padding: 0;
-
-      &:not(:first-child)::before {
-        content: "|";
-        color: @grayFontGeneral;
-        padding: 0px 4px 0 6px;
-      }
-    }
-  }
-
-  .jf-switch-option {
-    font-weight: 400;
-    color: @grayFontGeneral;
-
-
-    &:hover, &.active {
-      color: @greenFontHeader;
-    }
-    &.disabled {
-      color: @grayFontGeneral;
-      cursor: default;
-      &.active {
-        color: @greenFontHeader;
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/assets/stylesheets/layout.less b/web/angular-web/src/main/webapp/app/assets/stylesheets/layout.less
deleted file mode 100644
index 03adbc3..0000000
--- a/web/angular-web/src/main/webapp/app/assets/stylesheets/layout.less
+++ /dev/null
@@ -1,373 +0,0 @@
-body, html {
-  font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
-  height: 100%;
-  min-height: 100%;
-}
-
-body {
-  background: @greenBGLight;
-  color: @grayFontGeneral;
-
-  &.login, &.reset-password, &.forgot-password, &.login_request, &.change-password {
-    background: @grayBGLogin;
-  }
-}
-
-ul, ol {
-  margin: 0;
-  padding: 0;
-}
-
-// page table layout
-#jf-full-page {
-  display: table;
-  width: 100%;
-  height: 100%;
-  min-height: 100%;
-
-  .jf-layout-row {
-    display: table-row;
-  }
-  .jf-layout-cell {
-    display: table-cell;
-  }
-}
-
-#jf-relative-viewport {
-  position: relative;
-  height: 100%;
-}
-
-#jf-viewport {
-  position: relative;
-  height: 100%;
-  min-height: 100%;
-
-  .jf-footer {
-    position: absolute;
-    font-size: 10px;
-    bottom: 20px;
-    width: 200px;
-    padding: 0 25px;
-    border: none !important;
-    color: @grayFontDarker;
-    pointer-events: none;
-    .wrapper-footer-data {
-      padding-top: 5px;
-      text-align: center;
-    }
-
-    .icon-jfrog-logo {
-      height: 50px;
-      background-position: top center;
-    }
-    &.admin-jf-footer {
-      position: relative;
-      line-height: 13px;
-      padding-top: 20px;
-    }
-  }
-
-  .wrapper-view {
-    padding-left: 50px !important;
-  }
-
-  #jf-content {
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    left: @mainBarWidth;
-    right: 0;
-    margin: 0;
-    padding: 0;
-
-    .action-button {
-      padding: 0 10px;
-      font-size: 15px;
-
-      a {
-        color: @grayFontGeneral;
-        text-decoration: none;
-      }
-
-      a:hover, & .dropdown.open a {
-        &, & i:before {
-          color: @greenBGDark;
-        }
-      }
-
-      & > a > .action-icon, .actions-more .action-icon {
-        position: relative;
-        margin-right: 6px;
-        font-size: 16px;
-        top: 3px;
-      }
-    }
-  }
-}
-
-//----------- header----------
-jf-header {
-  height: @topHeaderHeight;
-}
-#jf-header {
-  z-index: 1050;
-  height: @topHeaderHeight;
-  background: @greenBGDark;
-  box-shadow: 0 1px 4px 0 rgba(0, 0, 0, .37);
-  position: absolute;
-  width: 100%;
-  padding-left: 15px;
-
-  .navbar-brand {
-    padding-top: 0;
-    padding-bottom: 0;
-    line-height: 60px;
-  }
-
-  a {
-    color: white !important;
-  }
-
-  .log-out {
-    color: @greenFontLight;
-    font-weight: 100;
-  }
-
-  .username-header {
-    text-transform: capitalize;
-  }
-
-  .header-section {
-    border-left: 1px solid @greenSeparatorBorder;
-    position: relative;
-    line-height: 60px;
-    height: 60px;
-    color: #fff;
-    padding: 0 30px;
-
-    &::before {
-      content: '';
-      width: 1px;
-      height: 100%;
-      display: inline-block;
-      background: @greenDarkSeparatorBorder;
-      position: absolute;
-      top: 0;
-      left: 0;
-    }
-
-    &.header-help {
-      padding: 0;
-
-      &:not([disabled]) {
-        &:hover, &.open {
-          &, &::before {
-            background-color: #fff;
-          }
-          .dropdown-toggle {
-            color: @greenFontHeader !important;
-            cursor: pointer;
-          }
-        }
-      }
-
-      &[disabled] {
-        .dropdown-toggle {
-          color: @grayFontLighter !important;
-        }
-      }
-
-      .dropdown-toggle {
-        display: block;
-        line-height: 60px;
-        padding: 0 20px;
-        cursor: default;
-      }
-      &.open .dropdown-toggle {
-        border-bottom: 1px solid #eaeaea;
-      }
-
-      .dropdown-menu {
-        margin-top: 0;
-        border-radius: 0;
-        border: 0 none;
-        padding: 0;
-
-        a {
-          height: 46px;
-          line-height: 46px;
-          color: @grayFontGeneral !important;
-          font-size: 14px;
-          padding: 0 35px 0 35px;
-
-          &:hover {
-            background-color: @grayBGLight !important;
-            color: @greenFontHeader !important;
-          }
-        }
-
-        li {
-          border-top: 1px solid #eaeaea;
-        }
-      }
-    }
-  }
-
-  .search-wrapper {
-    height: @topHeaderHeight;
-    padding: 4px 5px 50px 5px;
-  }
-
-  .icon-search-container {
-    display: inline-block;
-    height: 45px;
-    width: 70px;
-    position: relative;
-    transition: width 0.4s ease-out;
-    backface-visibility: hidden;
-    outline: none;
-    &.active {
-      width: 456px;
-      border-radius: 50px;
-
-      .glyphicon-remove-circle {
-        opacity: 1;
-      }
-      .search-input {
-        width: 200px;
-        color: @white;
-
-        &::-webkit-input-placeholder {
-          /* WebKit browsers */
-          color: @white;
-          padding: 0 0 0 8px;
-        }
-        &::-moz-placeholder {
-          /* Mozilla Firefox 19+ */
-          color: @white;
-          padding: 0 0 0 8px;
-        }
-        &:-ms-input-placeholder {
-          /* Internet Explorer 10+ */
-          color: @white;
-          padding: 0 0 0 8px;
-        }
-
-      }
-    }
-
-    .header-search-btn {
-      color: @white;
-      font-size: 19px;
-      line-height: 46px;
-      cursor: pointer;
-      z-index: 999;
-      margin: 2px 5px 3px 25px;
-      display: inline-block;
-
-      &:before {
-        position: relative;
-        top: 4px;
-      }
-    }
-    .glyphicon-remove-circle {
-      opacity: 0;
-      color: #FFFFFF;
-      font-size: 20px;
-      position: absolute;
-      top: 12px;
-      transition: opacity 0.4s ease-out;
-      cursor: pointer;
-      right: 15px;
-    }
-
-    .search-input {
-      cursor: default;
-      width: 0;
-      padding: 5px;
-      border: none;
-      outline: none;
-      font-size: 18px;
-      line-height: 28px;
-      background-color: rgba(255, 255, 255, 0);
-      transition: width 0.4s ease-out;
-      font-weight: 300;
-    }
-    .search-input.active {
-      width: 390px;
-    }
-  }
-}
-
-// content layout
-
-.content-layout-container {
-  h1 {
-    color: @greenFontDark;
-    font-weight: 400;
-    font-size: 28px;
-    letter-spacing: -0.5px;
-    margin: 0;
-    padding: 0 0 0 40px;
-    line-height: 58px;
-  }
-
-  .content-wrapper {
-    position: absolute;
-    top: 58px;
-    bottom: 20px;
-    left: 20px;
-    right: 20px;
-
-    .card {
-      background: @white;
-      box-shadow: 0 1px 4px 1px rgba(0, 0, 0, .17);
-      padding: 0;
-
-      .content-with-footer {
-        position: absolute;
-        top: 0;
-        bottom: @layoutFooterHeight;
-        right: 0;
-        left: 0;
-        overflow-y: auto;
-      }
-    }
-
-    .card-pole-pad {
-      &, .content-with-footer {
-        padding-top: 15px;
-        padding-bottom: 15px;
-      }
-    }
-    .card-side-pad {
-      &, .content-with-footer {
-        padding-right: 20px;
-        padding-left: 20px;
-      }
-    }
-  }
-
-  &.with-head-bar {
-    .content-wrapper {
-      top: 116px;
-    }
-  }
-  &.home-page {
-    .content-wrapper {
-      top: 232px;
-    }
-  }
-
-  .content-footer {
-    background: @grayBorderLight;
-    height: @layoutFooterHeight;
-    line-height: @layoutFooterHeight;
-    padding: 0 40px;
-    position: absolute;
-    width: 100%;
-    z-index: 99;
-    bottom: 0;
-  }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/assets/stylesheets/login.less b/web/angular-web/src/main/webapp/app/assets/stylesheets/login.less
deleted file mode 100644
index ad78fa6..0000000
--- a/web/angular-web/src/main/webapp/app/assets/stylesheets/login.less
+++ /dev/null
@@ -1,107 +0,0 @@
-.center-login{
-  width: 471px;
-  margin: 140px auto 0;
-}
-
-.login-form {
-  background: @white;
-  padding: 0;
-
-  .login-inner {
-    padding: 13px 45px 12px;
-
-
-    h3 {
-      margin-bottom: 20px;
-      color: @greenFontHeader;
-      font-size: 22px;
-      margin-bottom: 30px;
-    }
-  }
-
-  &.change-password-form {
-
-    .login-inner {
-      padding: 15px 45px 20px;
-      h3 {
-        font-size: 18px;
-        margin-bottom: 25px;
-      }
-
-      .form-group {
-        margin-bottom: 32px;
-      }
-      #validation-label {
-        margin: 5px 0;
-      }
-    }
-  }
-
-  .login-button-bar {
-//    background: @grayBGLoginLight;
-    margin-top: -10px;
-    border: 1px @grayBGDarker solid;
-    padding: 18px 45px;
-    overflow: auto;
-    .remember-me {
-      label {margin: 8px 0 0;}
-    }
-  }
-
-  .close-button {
-    color: @grayFontMediumDark;
-    padding: 10px 20px 0 0;
-    font-size: 22px;
-
-    &:hover {
-      text-decoration: none;
-    }
-  }
-}
-
-.oauth-login {
-  border-top: 1px solid @grayBorderLighter;
-
-  .oauth-login-title {
-    padding: 15px 0 5px;
-  }
-
-  .oauth-login-links-container {
-    text-align: left;
-    margin-bottom: 0;
-    a {
-      display: inline-block;
-      width: 75px;
-      border: solid @grayBorderLighter;
-      border-width: 0 1px;
-      border-left: 0 none;
-      padding: 52px 5px 0;
-      text-align: center;
-      font-size: 12px;
-      color: @grayDocker;
-      height: 70px;
-      background-size: 65% auto;
-      background-position: center 5px;
-      &.single {border: 0;}
-      span {
-        display: block;
-        height: 35px;
-        overflow: hidden;
-        word-break: break-all;
-      }
-
-      /*&:nth-child(4n+1) {
-        border-left: 1px solid @grayBorderLighter;
-      }
-      &:nth-child(1n+5) {
-        border-top: 0 none;
-      }*/
-      &:hover {
-        color: @blackBorderDark;
-      }
-      &:last-child {
-        border-right: 0;
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/assets/stylesheets/main.less b/web/angular-web/src/main/webapp/app/assets/stylesheets/main.less
deleted file mode 100644
index d7b1a1c..0000000
--- a/web/angular-web/src/main/webapp/app/assets/stylesheets/main.less
+++ /dev/null
@@ -1,28 +0,0 @@
- at import "variables.less";
- at import "mixins.less";
- at import "artifactory-icons.less";
- at import "admin.less";
- at import "common.less";
-
- at import "artifacts.less";
- at import "build.less";
- at import "home.less";
- at import "login.less";
- at import "modal.less";
- at import "layout.less";
- at import "search.less";
- at import "artifact_modals.less";
- at import "artifactory_grid.less";
- at import "selectbox.less";
- at import "sidebar.less";
- at import "user_profile.less";
- at import "storage_viewer.less";
- at import "tabs.less";
- at import "repos.less";
-
- at import "tree-control.less";
- at import "tree-control-attribute.less";
-
- at import "jf_switch.less";
- at import "features.less";
- at import "error_pages.less";
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/assets/stylesheets/mixins.less b/web/angular-web/src/main/webapp/app/assets/stylesheets/mixins.less
deleted file mode 100644
index 588048e..0000000
--- a/web/angular-web/src/main/webapp/app/assets/stylesheets/mixins.less
+++ /dev/null
@@ -1,29 +0,0 @@
-.glow(@spread:5px; @color: rgba(0, 0, 0, .15)) {
-	box-shadow: 0 0 @spread @color;
-}
-
-.icon-tall() {
-  background-size: 80% auto !important;
-}
-
-.icon-hourglass() {
-  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAQBElEQVR4Xu1dX2Rl2xlf5zpqq6ioUVFxRUVFRZ2HUVHzEBVX1KioPORh1Kj7MGrUVaNG3YdRo+7DqFHzMCoqD/chKipqHvIwD1Fx5WFUHkZFRUVFxRUVFXWM6Knfb69v5dtrr73PPvvsc3ImZx8iyTn77D/rt75/v+9b32qYEXxd/u+y0263Tfuibc4vzg3+Pj87N4dHh/x9enrK99qX7fiz83Pz6s+vGngUfNd/pOYHTX72PrxG6kbP/n3WOT055YAfHx/zB39jwDH4ea9MQC6NMU0g5f22Jxs1sK4dkMt3lx3M/IM3B1cScBZLQOgVNaMgOA6Qd5edIAAakJQIxW+MAjjXAghAwKzff7Nv9vf2zfHJcQwABs0YDrgMvP87S0p6kZCs88eoX [...]
-  background-repeat: no-repeat;
-}
-
-.jf-placeholder() {
-  color: @grayPlaceholderLight;
-  font-size: 15px;
-  font-weight: 100;
-}
-
- at -webkit-keyframes marquee {
-  from {left: 0;}
-  to {left: -9999px;}
-}
-
-/* Standard syntax */
- at keyframes marquee {
-  from {left: 0;}
-  to {left: -9999px;}
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/assets/stylesheets/modal.less b/web/angular-web/src/main/webapp/app/assets/stylesheets/modal.less
deleted file mode 100644
index 9858623..0000000
--- a/web/angular-web/src/main/webapp/app/assets/stylesheets/modal.less
+++ /dev/null
@@ -1,133 +0,0 @@
-.push-to-bintray {
-  select {
-    width: 100%;
-  }
-
-  .bintray-info-container {
-    margin-bottom: 20px;
-  }
-  .bintray-info {
-    display: block;
-    font-size: 14px;
-    line-height: 20px;
-    font-weight: 100;
-  }
-}
-
-.modal-dialog{
-  width: auto !important;
-  max-width: 875px;
-  margin: 70px auto;
-}
-
-.inline {
-  display: inline;
-}
-
-.select-repo-icon {
-  position: relative;
-  margin-right: 10px;
-  top: 2px;
-}
-
-.select-target-path {
-  min-height: 300px;
-}
-
-#property-set-list {
-  width: 492px;
-  border-top: 1px solid @grayBGMedium;
-  border-bottom: 1px solid @grayBGMedium;
-
-  .property-set-row {
-    display: table;
-    width: 100%;
-    height: 40px;
-    line-height: 40px;
-
-    &:nth-child(even) {
-      background-color: @white;
-    }
-    &:nth-child(odd) {
-      background-color: @grayGridRow;
-    }
-
-    div {
-      display: table-cell;
-
-      &:first-child {
-        padding-left: 10px;
-        width: 340px;
-      }
-
-      a {
-        color: @grayFontLighter;
-        font-size: 16px;
-        position: relative;
-        top: 2px;
-
-        &:hover {
-          color: @greenFontHeader;
-        }
-      }
-
-      jf-checkbox {
-        float: right;
-        margin-right: 20px;
-
-        label {
-          margin-bottom: 0;
-        }
-      }
-      
-      &.property-set-buttons {
-        text-align: right;
-        padding-right: 20px;
-        
-        a {
-          &[disabled]:hover {
-            color: @grayFontLighter;
-            cursor: default;
-          }
-          &.icon-clear:hover {
-            color: @redError;
-          }
-        }
-      }
-    }
-  }
-}
-
-#smart-remote-repository {
-  .sync-checkbox {
-    p {
-      margin-left: 25px;
-    }
-  }
-  ul {
-    margin-left: 25px;
-    
-    li {
-      margin-bottom: 10px;
-    }
-  }
-}
-
-#show-all-modal {
-  .modal-body {
-    height: 412px;
-  }
-
-  .group-list-wrapper {
-    max-height: 322px;
-    overflow-y: auto;
-    margin-bottom: 0;
-  }
-}
-
-.modal-body {
-  .highlight-alert {
-    color: @redError;
-    font-weight: 700;
-  }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/assets/stylesheets/repos.less b/web/angular-web/src/main/webapp/app/assets/stylesheets/repos.less
deleted file mode 100644
index 143ab7d..0000000
--- a/web/angular-web/src/main/webapp/app/assets/stylesheets/repos.less
+++ /dev/null
@@ -1,359 +0,0 @@
-.iconrepo {
-  background-repeat: no-repeat;
-}
-
-.iconrepo-bower {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2016.0.0%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0A%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%2 [...]
-}
-
-.iconrepo-debian {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0D%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2018.1.1%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0D%0A%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0D%0A%09%20width%3D%22144px%22%20heig [...]
-}
-
-.iconrepo-docker {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0D%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2018.1.1%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0D%0A%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0D%0A%09%20width%3D%22144px%22%20heig [...]
-}
-
-.iconrepo-blackduck {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0D%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2018.1.1%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0D%0A%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0D%0A%09%20width%3D%22286.7px%22%20he [...]
-}
-
-.iconrepo-gitlfs, .iconrepo-git-lfs, .iconrepo-git.lfs {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-}
-
-.iconrepo-maven {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0D%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2018.1.1%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0D%0A%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0D%0A%09%20width%3D%22144px%22%20heig [...]
-  .icon-tall();
-}
-
-.iconrepo-nuget {
-  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgaWQ9InN2ZzIiIGlua3NjYXBlOnZlcnNpb249IjAuNDguMiByOTgxOSIgc29kaXBvZGk6ZG9jbmFtZT0ibnVnZXQuc3ZnIiB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiIH [...]
-
-}
-
-.iconrepo-debian2 {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0D%0A%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%22-60%20-75%20210%20260%22%3E%0D%0A%20%3Cg%20fill%3D%22%23D70751%22%3E%0D%0A%20%20%3Cpath%20d%3D%22M64.525%2C62.053c-4.125%2C0.058%2C0.78%2C2.125%2C6.165%2C2.954%2C1.488-1.161%2C2.838-2.336%2C4.04-3.479-3.354%2C0.821-6.765%2C0.838-10.205%2C0.525%22/%3E%0D%0A%20%20%3Cpath%20 [...]
-}
-
-.iconrepo-python {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//web.resource.org/cc/%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www.w3.org/2 [...]
-}
-
-.iconrepo-rpm {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0D%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2018.1.1%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0D%0A%3Csvg%20version%3D%221.1%22%0D%0A%09%20id%3D%22svg2%22%20sodipodi%3Adocname%3D%22RPM_Logo.svg%22%20inkscape%3Aversion%3D%220.45.1%22%20xmlns%3Asodipodi%3D%22http%3A//sodipodi.sourceforge.net/DTD/sodipodi-0.dtd%22%20xml [...]
-}
-
-.iconrepo-yum {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0D%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2018.1.1%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0D%0A%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0D%0A%09%20width%3D%22144px%22%20heig [...]
-  .icon-tall();
-}
-
-.iconrepo-p2 {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-}
-
-.iconrepo-gems {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2012.0.1%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%2051448%29%20%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/2 [...]
-}
-
-.iconrepo-license {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-}
-
-.iconrepo-build {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-}
-
-.iconrepo-watches {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0D%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2017.0.0%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0D%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0D%0A%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000 [...]
-}
-
-.iconrepo-vagrant {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0D%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2018.1.1%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0D%0A%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0D%0A%09%20width%3D%22144px%22%20heig [...]
-}
-
-.iconrepo-pypi {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-}
-
-.iconrepo-jenkins {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-}
-
-.iconrepo-gradle {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2015.0.2%2C%20SVG%20Export%20Plug-In%20%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%2 [...]
-}
-
-.iconrepo-s3fileStore {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0D%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2017.0.0%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0D%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0D%0A%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000 [...]
-}
-.iconrepo-gcs {
-  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAELCAYAAABj1Lv7AAAACXBIWXMAABcSAAAXEgFnn9JSAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAFR5JREFUeNrsnV1wnNV5x8+uJH9hIgGZ4namaGUbZpiktbjpBQ2R2rFNkht7GC46zYd2msuQWCSdSbDdsEG7Ns2YqVyXO5MsF76qG0w7tGDMSkxVcmfLHSbMtAFW9UzjNLTyh4wtbGn7HO0RsWVL2o/343z8fjOHNUZo3/ecs//3f84+53kytVpNQetsf36+R14GpfWb15y0XnoGhLPSqtLGdTv1g+wkXdIeGQSrZaHKy8tuabvoDWiQKWknpJURLwQrKTc1LC2Pi4I2eVtaQYRrnK5AsOJyVKPSuukNiFi4hnFcCFZUQpXTFl7aAL0BM [...]
-}
-.iconrepo-hdfsFileStore {
-  background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjU2IiBoZWlnaHQ9IjE5MiIgdmlld0JveD0iMCAwIDI1NiAxOTIiIHZlcnNpb249IjEuMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPjxwYXRoIGQ9Ik05NC45MiA0Mi4xOUw3Ny45NiA0NC45NCA2Mi40OSA1MS43MiA0OS4zNiA1OS45OSAzNi44NSA3NS4yNSAyOS43OSA4Mi43MyAyMi45NiA4NS4yNSAyMS4xNSA4MC44MyAyNC4zMSA3Ni4yNyAyNS4wMiA2OS44NCAyNy4xMyA2OS45MyAyOS40NSA3Mi4wNCAyOC [...]
-  opacity: .8;
-}
-
-.iconrepo-sharding {
-  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiIHdpZHRoPSI2OHB4IiBoZWlnaHQ9IjY4cHgiIHZpZXdCb3g9IjAgMCA2OCA2OCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldy [...]
-}
-
-.iconrepo-vcs {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0D%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2017.0.0%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0D%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0D%0A%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000 [...]
-}
-
-.iconrepo-sbt {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-}
-
-.iconrepo-ivy {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-}
-
-.iconrepo-msbuild {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-}
-
-.iconrepo-rest {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-}
-
-.iconrepo-ha {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-}
-
-.iconrepo-sso {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-  .icon-tall();
-}
-
-.iconrepo-filtered-resources {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-}
-
-.iconrepo-ldap {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-}
-
-.iconrepo-multipush {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-}
-
-.iconrepo-npm {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-  .icon-tall();
-}
-
-.iconrepo-properties {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-}
-
-.iconrepo-replication {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-}
-
-.iconrepo-layouts {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-}
-
-.iconrepo-search {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-}
-
-.iconrepo-plugins {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-}
-
-.iconrepo-webstart {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-}
-
-.iconrepo-bintray, .iconrepo-bintray-integration {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-}
-.iconrepo-bintray-integration {
-  background-size: auto 110% !important;
-}
-.iconrepo-bintray-black {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-}
-
-.iconrepo-generic {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0D%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2017.0.0%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0D%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0D%0A%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000 [...]
-
-  &.repotype {
-    background-size: auto 60%;
-  }
-}
-
-.iconrepo-teamcity {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-  background-size: auto 80% !important;
-}
-
-.iconrepo-bamboo {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-}
-
-.iconrepo-aql-old {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-  .icon-tall();
-}
-
-.iconrepo-aql {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-  .icon-tall();
-}
-
-.iconrepo-smart-repo {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-}
-
-.iconrepo-oauth {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2013.0.0%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%2014576%29%20%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/2 [...]
-}
-
-.iconrepo-opkg {
-  background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwIiB5PSIwIiB2aWV3Qm94PSIwIDAgMjQ1IDI2Ni45IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNDUgMjY2LjkiIHhtbDpzcGFjZT0icHJlc2VydmUiPiAgPGNpcmNsZSBmaWxsPSIjNTI0QTRDIiBjeD0iMTI3LjUiIGN5PSIxNTUuNCIgcj0iMjIuMiIvPiAgPHBhdGggZmlsbD0iIzUyNEE0QyIgZD0iTTIxNy41IDE0NS4xYzE1LjIgMCAyNy41LTEyLjMgMjcuNS0yNy41cy0xMi [...]
-}
-
-.iconrepo-ssh {
-  background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJUZXJtaW5hbCIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6ZVNwZWVkIiB4PSIwIiB5PSIwIiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDI0IDEwMjQiIHhtbDpzcGFjZT0icHJlc2VydmUiPjxwYXRoIGZpbGw9Im5vbmUiIGQ9InoiLz48ZyBpZD0ic2hhZG93Ij48ZyBpZD0ic2hhcGUiPjxwYXRoIGlkPSJwYXRoIiBmaWxsLW9wYWNpdHk9IjAuMSIgZD0iTT [...]
-}
-
-.iconrepo-cocoapods {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0D%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2019.1.1%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0D%0A%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0D%0A%09%20viewBox%3D%22-177%20269%20 [...]
-}
-
-.iconrepo-distribution {
-  background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMTYgMTYiPjxkZWZzPjxnIGlkPSJTeW1ib2xfMV8wX0xheWVyMF8wX0ZJTEwiPjxwYXRoIGZpbGw9IiM2OEEwNEUiIHN0cm9rZT0ibm9uZSIgZD0iTSAxNDguMiA4OTYuMTVMIDE0Ny41NSA4OTYuODUgMTQ4LjMgODk3LjI1USAxNDkuMTUgODk4IDE0OC45IDg5OS4xNS [...]
-}
-
-// ************************************************************************************
-// ************************************ icons *****************************************
-// ************************************************************************************
-
-.icon-logo-circle {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-  background-repeat: no-repeat;
-}
-
-.icon-jfrog-logo {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0D%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2017.0.0%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0D%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0D%0A%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000 [...]
-  background-repeat: no-repeat;
-}
-
-.icon-grouping-off {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0D%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2017.0.0%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0D%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0D%0A%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000 [...]
-  background-repeat: no-repeat;
-}
-
-.icon-grouping-on {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0D%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2017.0.0%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0D%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0D%0A%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000 [...]
-  background-repeat: no-repeat;
-}
-
-.icon-stash-stash-empty {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0D%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2017.0.0%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0D%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0D%0A%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axli [...]
-  background-repeat: no-repeat;
-}
-
-.icon-stash-stash-full {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0D%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2017.0.0%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0D%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0D%0A%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axli [...]
-  background-repeat: no-repeat;
-}
-
-.icon-stash-add {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0D%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2017.0.0%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0D%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0D%0A%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axli [...]
-  background-repeat: no-repeat;
-}
-
-.icon-stash-intersect {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0D%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2017.0.0%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0D%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0D%0A%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axli [...]
-  background-repeat: no-repeat;
-}
-
-.icon-stash-subtract {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0D%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2017.0.0%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0D%0A%3C%21DOCTYPE%20svg%20PUBLIC%20%22-//W3C//DTD%20SVG%201.1//EN%22%20%22http%3A//www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd%22%3E%0D%0A%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axli [...]
-  background-repeat: no-repeat;
-}
-
-.icon-generate {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Created%20with%20Inkscape%20%28http%3A//www.inkscape.org/%29%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rdf-syntax-ns%23%22%0A%20%20%20xmlns%3Asvg%3D%22http%3A//www. [...]
-  background-repeat: no-repeat;
-
-  display: inline-block;
-  background-size: 100% auto;
-  width: 25px;
-  height: 28px;
-  margin-top: 4px;
-}
-
-// icons for oauth
-
-.icon-oauth-github-dark, .oauth-login .icon-oauth-github:hover {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2017.0.0%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rd [...]
-  background-repeat: no-repeat;
-}
-
-.icon-oauth-google-dark, .oauth-login .icon-oauth-google:hover {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2017.0.0%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rd [...]
-  background-repeat: no-repeat;
-}
-
-.icon-oauth-openid-dark, .oauth-login .icon-oauth-openid:hover {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2017.0.0%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rd [...]
-  background-repeat: no-repeat;
-}
-
-.icon-oauth-openid-dark, .oauth-login .icon-oauth-openid:hover {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2017.0.0%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rd [...]
-  background-repeat: no-repeat;
-}
-
-.icon-oauth-cloud-foundry-dark, .oauth-login .icon-oauth-cloudfoundry:hover {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0D%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2019.1.1%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0D%0A%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0D%0A%09%20viewBox%3D%22-280%20372%20 [...]
-  background-repeat: no-repeat;
-}
-
-.icon-oauth-github {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2017.0.0%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rd [...]
-  background-repeat: no-repeat;
-}
-
-.icon-oauth-google {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2017.0.0%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rd [...]
-  background-repeat: no-repeat;
-}
-
-.icon-oauth-openid {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2017.0.0%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0A%0A%3Csvg%0A%20%20%20xmlns%3Adc%3D%22http%3A//purl.org/dc/elements/1.1/%22%0A%20%20%20xmlns%3Acc%3D%22http%3A//creativecommons.org/ns%23%22%0A%20%20%20xmlns%3Ardf%3D%22http%3A//www.w3.org/1999/02/22-rd [...]
-  background-repeat: no-repeat;
-}
-
-.icon-oauth-cloudfoundry {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0D%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2019.1.1%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0D%0A%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0D%0A%09%20viewBox%3D%22-280%20372%20 [...]
-  background-repeat: no-repeat;
-}
-
-.icon-oauth-sso {
-  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgNTAgNTAiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDUwIDUwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4uc3Qwe2ZpbGw6I0M5QzlDOTt9PC9zdHlsZT48ZyBpZD0iTGF5ZXJfMV8xXyI+PC9nPjxnIGlkPSJMYXllcl [...]
-  background-repeat: no-repeat;
-}
-
-.icon-oauth-sso:hover {
-  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIgd2lkdGg9IjUwcHgiIGhlaWdodD0iNTBweCIgdmlld0JveD0iMCAwIDUwIDUwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MCA1MCIgeG [...]
-}
-// icons for reverse proxy
-
-.icon-reverse-apache {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0D%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2019.1.1%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0D%0A%3Csvg%20version%3D%221.1%22%20id%3D%22body%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0D%0A%09%20viewBox%3D%22-221%20371.9%201 [...]
-  background-repeat: no-repeat;
-}
-
-.icon-reverse-nginx {
-  background-image: url('data:image/svg+xml;charset=US-ASCII,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0D%0A%3C%21--%20Generator%3A%20Adobe%20Illustrator%2019.1.1%2C%20SVG%20Export%20Plug-In%20.%20SVG%20Version%3A%206.00%20Build%200%29%20%20--%3E%0D%0A%3Csvg%20version%3D%221.1%22%0D%0A%09%20id%3D%22svg2%22%20xmlns%3Asodipodi%3D%22http%3A//sodipodi.sourceforge.net/DTD/sodipodi-0.dtd%22%20xmlns%3Asvg%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Ardf%3D%22http%3A//www. [...]
-  background-repeat: no-repeat;
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/assets/stylesheets/search.less b/web/angular-web/src/main/webapp/app/assets/stylesheets/search.less
deleted file mode 100644
index 0e4cf81..0000000
--- a/web/angular-web/src/main/webapp/app/assets/stylesheets/search.less
+++ /dev/null
@@ -1,473 +0,0 @@
- at import "../../../components/bootstrap/less/variables.less";
-
-.search-panel-container {
-  position: absolute !important;
-  top: 58px;
-  bottom: 0;
-  left: 0;
-  right: 0;
-  overflow-y: auto;
-  z-index: 1000;
-  background: @grayBorderLight;
-  padding: 0 40px;
-
-  .grid-container {
-    margin-top: 2px;
-  }
-
-  .grid-actions { //temporary
-    display: none;
-    position: absolute;
-    top: 6px;
-    right: 6px;
-
-    span {
-      cursor: pointer;
-      &:hover {
-        color: @greenFontHeader;
-      }
-    }
-  }
-
-  .form-group {
-    margin-bottom: 15px;
-  }
-
-  .dnd-panel {
-    padding: 10px 12px;
-  }
-
-  .ui-select-choices {
-    max-height: 400px;
-  }
-}
-
-.quick-search-tabs {
-  background: @grayBGLight;
-  list-style: none;
-  display: inline-block;
-  width: 100%;
-  position: relative;
-  margin-bottom: 0;
-  border-bottom: 1px solid @white;
-
-  &::after {
-    content: '';
-    position: absolute;
-    top: 101%;
-    left: 0;
-    right: 0;
-    bottom: 5px;
-    border-top: 1px solid @grayBorderLight;
-  }
-
-  .search-title {
-    width: 165px !important;
-    font-size: 17px;
-  }
-
-  .quick-search-tab {
-    display: inline-block;
-    text-align: center;
-    height: 55px;
-    width: 10.7%;
-    line-height: 55px;
-    border-left: 1px solid #f7f7f7;
-    border-right: 1px solid #f7f7f7;
-
-    a {
-      color: @grayFontDark;
-      text-decoration: none;
-    }
-
-    &:not(.license-required):not(.search-title) {
-      &.active, &:hover {
-        background: @grayBorderLight;
-      }
-
-      &.active {
-        a {
-          color: @greenFontDark;
-        }
-
-        &::after {
-          content: "";
-          display: block;
-          border-bottom: 2px solid @grayBorderLight;
-        }
-      }
-
-      &:hover {
-        cursor: pointer;
-      }
-    }
-  }
-}
-
-.label-style {
-  display: inline-block;
-  background: white;
-  width: 75px;
-  float: left;
-  font-size: 14px;
-  font-weight: normal;
-  height: 34px;
-  line-height: 34px;
-  padding-left: 5px;
-  border: 1px solid @grayBorderLighter;
-  border-right: none;
-  color: @grayFontDark;
-}
-
-.field-style {
-  width: 380px;
-  display: inline-block;
-}
-
-.search-wrapper {
-  display: block;
-  margin-bottom: 10px;
-  padding: 30px 50px 0px 0px;
-
-  .row {
-    margin-bottom: 0px;
-    * {
-      margin-bottom: 5px;
-    }
-    .selectize-input {
-      margin-bottom: 0px;
-    }
-  }
-
-  .field-style {
-    margin-right: 10px;
-  }
-
-  .jf-checkbox {
-    margin-top: 7px;
-    span {
-      margin-right: 10px;
-      vertical-align: text-bottom;
-    }
-  }
-
-  h2 {
-    margin-top: 0;
-    font-size: 24px;
-  }
-}
-
-.search-results-title {
-  font-size: 16px;
-  font-weight: 600;
-  line-height: 28px;
-
-  span span {
-    margin: 0 7px 0 5px;
-  }
-}
-
-.search-panel {
-  position: relative;
-}
-
-a.clear-all {
-  margin-right: 10px;
-  color: @grayFontDarker;
-  text-decoration: none;
-}
-
-.repo-list-dropdown {
-  padding-top: 10px;
-
-  .icon {
-    font-size: 22px;
-    float: left;
-    margin: 3px 8px 0 0;
-    color: @greenFontHeader;
-  }
-
-  .dnd-panel {
-    margin-left: -15px;
-    max-width: none;
-  }
-
-  .dnd-list {
-    border: 1px solid @grayBGMedium;
-  }
-
-  .dnd-list-fullheight {
-    height: 310px;
-  }
-}
-
-
-.gap-list {
-  height: 32px;
-  display: none;
-}
-.checkbox-search{
-  margin-right: 10px;
-}
-.back-to-browse{
-  padding-top: 20px;
-}
-.search-input {
-  width:380px;
-}
-
-.search-button {
-  width: auto;
-  margin-left: 17px;
-}
-
-.repo-dnd-title {
-  display: inline-block;
-  padding-bottom: 10px;
-  font-size: 14px;
-  color: @greenFontHeader;
-  cursor: pointer;
-
-  span {
-    line-height: 28px;
-  }
-}
-
-.search-result-container {
-  .filter-group{
-    padding-left: 0!important;
-  }
-}
-
-.multi-selectize {
-  .selectize-input {
-    background: white;
-    min-height: 42px;
-  }
-}
-.selectize-control.single .selectize-input {
-  background: white;
-}
-.any-property {
-  + ul {
-    width: 24%;
-    li {
-      width: 100%;
-    }
-  }
-}
-
-.package-search {
-  position: relative;
-  
-  .form-group {
-    margin-bottom: 0;
-    
-    &:after {
-      content: "";
-      display: block;
-      clear: both;
-    }
-  }
-  .form-group-cell {
-    width: 250px;
-    float: left;
-    display: block;
-    margin-bottom: 15px;
-    
-    &:nth-child(3n + 1):not(.package-search-buttons) {
-      clear: left;
-    }
-
-    @media screen and (max-width: 1440px) {
-      &:nth-child(3n + 1).package-search-buttons {
-        width: 790px;
-        
-        & + .field-bottom-remark {
-          bottom: 45px;
-        }
-      }
-    }
-    &:nth-child(4n + 1).package-search-buttons {
-      width: 520px;
-    }
-    &:nth-child(5n + 1).package-search-buttons {
-      width: 250px;
-    }
-    
-    &.package-search-buttons {
-      width: auto;
-    }
-  }
-  
-  .field-bottom-remark {
-    clear: both;
-    position: absolute;
-    bottom: -10px;
-  }
-}
-
-#stash-container {
-  position: absolute;
-  right: 0;
-  z-index: 1;
-  margin-top: -25px;
-
-
-  i#stash-animation {
-    position: absolute;
-    z-index: 1000;
-    font-size: 26px;
-    color: @grayFontGeneral;
-    display: block;
-    opacity: 0;
-    right: 1300px;
-    transform: rotate(-25deg);
-    z-index: -1;
-
-  }
-
-  i.icon-info {
-    position: absolute;
-    left: 17px;
-    top: 4px;
-    color: #707070;
-  }
-
-  #stash-menu {
-    display: inline-block;
-    margin-right: 10px;
-
-    #calc-actions {
-      display: table;
-      width: 100%;
-      border-bottom: 1px solid #fff;
-      padding-bottom: 2px;
-
-      div {
-        display: table-cell;
-        text-align: center;
-
-        span {
-          display: inline-block;
-          width: 16px;
-          height: 16px;
-          background-size: 100%;
-          cursor: pointer;
-        }
-      }
-    }
-
-    #general-actions {
-      padding-top: 6px;
-      border-top: 1px solid #aaa;
-
-      a {
-        color: @grayFontGeneral;
-        font-size: 14px;
-
-        i {
-          margin-right: 6px;
-          position: relative;
-          top: 1px;
-        }
-
-        &:hover {
-          &, i:before {
-            color: @blueMain;
-          }
-        }
-        &:not(:first-child) {
-          margin-left: 5px;
-        }
-      }
-    }
-  }
-
-  #stash-box {
-    display: inline-block;
-    color: @blueMain;
-    text-align: center;
-    font-weight: 600;
-    font-size: 12px;
-    min-width: 70px;
-
-    span {
-      display: inline-block;
-      height: 32px;
-      width: 36px;
-      position: relative;
-      top: 2px;
-      left: 2px;
-    }
-  }
-}
-
-
-
-// AQL Viewer
-
-#show-aql-button {
-  position: absolute;
-  left: 385px;
-  top: 1px;
-  .btn {
-    background-color: transparent;
-    width: 33px;
-    height: 33px;
-
-    i {
-      position: absolute;
-      top: 12px;
-      left: 10px;
-      display: block;
-      width: 33px;
-      height: 33px;
-    }
-  }
-}
-
-#aql-viewer {
-  margin-bottom: 15px;
-}
-
-.cm-external-command {
-  color: red;
-}
-.cm-header-tag {
-  color: orange;
-}
-.cm-aql-keyword {
-  color: green;
-}
-.cm-aql-operators {
-  color: blue;
-}
-.cm-aql-domain {
-  color: purple;
-}
-.cm-aql-brackets {
-  color: darkred;
-}
-.cm-api-url {
-  color: darkcyan;
-}
-.cm-api-key {
-  color: slategray;
-}
-
-
-#stash-container.animate {
-  i#stash-animation {
-    animation: stash 2s ease-in-out .3s;
-  }
-}
-
- at keyframes stash {
-  0% {opacity: .2;top: 0; top: 10px;}
-  15% {transform: scale(.85,.85); opacity: 1;}
-  25% {transform: scale(.85,.85); top: -10px;}
-  50% {opacity: 1;}
-  75% {opacity: 0;}
-  100% {right: 20px; transform: scale(.55,.55) rotate(0deg); top: -10px;}
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/assets/stylesheets/selectbox.less b/web/angular-web/src/main/webapp/app/assets/stylesheets/selectbox.less
deleted file mode 100644
index 97183ad..0000000
--- a/web/angular-web/src/main/webapp/app/assets/stylesheets/selectbox.less
+++ /dev/null
@@ -1,323 +0,0 @@
-.ui-select-choices, .actions-dropdown, .vakata-context, .context-menu-list {
-  border-radius: 0;
-  background-color: #fff;
-  border: 0 none;
-  padding: 0;
-}
-
-.ui-select-choices .ui-select-choices-row, .actions-dropdown li, .vakata-context li, .context-menu-list li {
-  height: 40px;
-  line-height: 40px;
-
-  & > a {
-    height: 40px;
-    line-height: 40px;
-    color: @grayFontGeneral;
-  }
-}
-
-.actions-dropdown, .vakata-context, .context-menu-list {
-  top: 25px;
-  min-width: 190px;
-  box-shadow: 0 2px 12px rgba(0, 0, 0, .25);
-
-  li {
-    display: list-item;
-    list-style: none;
-    background-color: #fff;
-
-    .action-icon, &.context-menu-item:before {
-      width: auto !important;
-      font-size: 18px;
-      line-height: 40px;
-    }
-
-    .action-icon {
-      margin: 0 10px 0 12px;
-      line-height: 46px !important;
-
-      &::before {
-        color: @grayFontGeneral;
-      }
-    }
-
-    .action-container {
-      .action-icon {
-        margin-right: 6px;
-
-        &.icon-re-index {
-          font-size: 20px;
-          margin-left: 10px;
-        }
-      }
-    }
-
-    & > a {
-      padding: 0;
-      font-size: 13px;
-      text-shadow: none;
-
-      & > span:not(.action-icon) {
-        display: inline-block;
-        font-weight: 300;
-        color: @grayFontGeneral;
-        vertical-align: top;
-      }
-    }
-
-    & > a:hover, &.vakata-context-hover a {
-      -webkit-box-shadow: none;
-      -moz-box-shadow: none;
-      box-shadow: none;
-      background: transparent;
-    }
-
-    .vakata-contextmenu-sep {
-      display: none !important;
-    }
-
-    &:hover {
-      background: @greenBGDropdownHover !important;
-      box-shadow: inset 3px 0px 0px 0px @greenBGDark;
-
-      & > a, > a > span, .action-icon::before, &.context-menu-item, &.context-menu-item:before {
-        color: @greenFontHeader;
-      }
-
-      .action-container {
-        background: transparent;
-      }
-    }
-
-    &.icon-clear, &.menu-item-icon-clear, &.menu-item-icon-trashcan {
-      &:hover {
-        background: #F4E7E7 !important;
-        box-shadow: inset 3px 0px 0px 0px @redError;
-
-        & > a, > a > span, .action-icon::before, &.context-menu-item, &.context-menu-item:before {
-          color: @redError;
-        }
-      }
-    }
-  }
-}
-
-.actions-dropdown {
-  li:first-child {
-    &::after {
-      content: "";
-      position: absolute;
-      width: 0;
-      height: 0;
-      top: 2px;
-      right: 8%;
-      box-sizing: border-box;
-
-      border: 5px solid black;
-      border-color: transparent transparent @white @white;
-
-      transform-origin: 0 0;
-      transform: rotate(135deg);
-
-      box-shadow: -3px 2px 2px 0 rgba(0, 0, 0, 0.06);
-    }
-
-    &:hover::after {
-      border-color: transparent transparent @greenBGDropdownHover @greenBGDropdownHover;
-    }
-  }
-}
-
-.context-menu-list {
-  margin-top: 2px;
-
-  font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
-  font-size: 13px;
-}
-
-.context-menu-item {
-  padding: 0 0 0 12px;
-
-  &:before {
-    float: left;
-    margin-right: 8px;
-  }
-}
-
-//---ui select design---//
-.ui-select-container {
-  box-shadow: none !important;
-  outline: none !important;
-
-  .ui-select-match span.ui-select-toggle:first-child,
-  input.ui-select-search {
-    outline: none !important;
-    padding: 0 10px;
-    box-shadow: none !important;
-    transition: border-color 0.5s ease;
-    border-radius: 0 !important;
-    line-height: 40px;
-    background: white !important;
-    .input-text;
-
-    input:focus {
-    }
-  }
-
-  span.ui-select-toggle {
-    overflow: hidden;
-  }
-
-  &[disabled] .ui-select-match span.ui-select-toggle:first-child {
-    background: #f5f5f5 !important;
-  }
-
-  .btn.btn-default {
-    &:hover, &:focus, &:active {
-      color: @blackFontDark !important;
-    }
-  }
-
-  .text-muted {
-    .jf-placeholder();
-  }
-}
-
-.ui-select-choices {
-  border-top: 1px solid @grayBorderLighter;
-  box-shadow: 0 4px 8px rgba(0, 0, 0, .25);
-
-  .ui-select-choices-row {
-    &.active > a, & > a:hover {
-      background: @greenBGDropdownHover !important;
-      color: @greenFontHeader;
-
-      i:before {
-        color: @greenFontHeader;
-      }
-    }
-
-    & > a {
-      padding-top: 0;
-      padding-bottom: 0;
-      border-bottom: 1px solid @grayBorderLighter;
-    }
-  }
-}
-
-//-----selectize---------------------------//
-.selectize-dropdown-content {
-  padding: 0;
-}
-
-.selectize-dropdown {
-  border: 0 none;
-  border-radius: 0;
-  margin-top: -1px;
-
-  border-top: 1px solid @grayBorderLighter;
-  box-shadow: 0 4px 8px rgba(0, 0, 0, .25);
-}
-
-.selectize-dropdown [data-selectable], .selectize-dropdown .optgroup-header {
-  padding: 0 20px;
-  height: 40px;
-  line-height: 40px;
-  border-bottom: 1px solid @grayBorderLighter;
-  color: @grayFontGeneral;
-
-  &.active {
-    background: @greenBGDropdownHover !important;
-    color: @greenFontHeader;
-  }
-}
-
-.selectize-control {
-  height: 40px;
-
-  &.single .selectize-input {
-    &:after {
-      border-width: 4px 4px 0 4px;
-    }
-    &.dropdown-active:after {
-      border-width: 0 4px 4px 4px;
-    }
-  }
-}
-
-.labeled-item,
-.selectize-control.multi .selectize-input > div,
-.selectize-control.multi .selectize-input > div.active {
-  position: relative;
-  display: inline-block;
-  background: transparent;
-  padding: 0px 24px 0 8px !important;
-  margin: 0 8px 0 0;
-  border: 1px solid @blueMain;
-  border-radius: 3px;
-  color: @grayFontGeneral;
-  height: 26px;
-  line-height: 24px;
-
-  .remove, .remove:hover {
-    position: absolute;
-    top: 0;
-    right: 0;
-    bottom: 0;
-
-    background: @white;
-    font-weight: 400;
-    font-size: 22px;
-    color: @blueMain;
-    width: 22px;
-    text-align: center;
-    margin-right: 1px;
-    padding: 0;
-  }
-}
-
-.selectize-input {
-  min-height: 40px;
-  max-height: 107px;
-  overflow-y: auto;
-  line-height: 29px;
-  padding: 4px 10px !important;
-  color: @grayFontGeneral;
-  .input-text;
-
-  &.dropdown-active {
-    border-radius: 0;
-  }
-  
-  &.disabled {
-    opacity: 1 !important;
-    background: #f5f5f5 !important;
-  }
-}
-
-.ui-select-search,
-.ui-select-match,
-.selectize-input,
-.btn-default-focus {
-  width: 100%;
-  //      border: 1px solid @grayBorderLighter;
-  outline: none;
-  box-shadow: none;
-  background: none;
-  border-radius: 0px;
-  input {
-    height: 30px;
-  }
-  .btn {
-    height: auto;
-  }
-  .btn-default:hover,
-  &.focus {
-    border: 1px solid @grayBorderLighter;
-    box-shadow: none;
-  }
-  span {
-    height: 40px !important;
-    background: transparent !important;
-  }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/assets/stylesheets/sidebar.less b/web/angular-web/src/main/webapp/app/assets/stylesheets/sidebar.less
deleted file mode 100644
index 27298d7..0000000
--- a/web/angular-web/src/main/webapp/app/assets/stylesheets/sidebar.less
+++ /dev/null
@@ -1,484 +0,0 @@
-//------------sidebar----------------------//
-#jf-main-nav {
-  width: @mainBarWidth;
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  padding: 0;
-  background-color: @blackBGLight;
-
-  ul {
-    background: @blackBGLight;
-    margin: 0;
-    padding: 0;
-    list-style: none;
-
-    .navbar-separator {
-      height: @topHeaderHeight;
-      border-left: 1px solid @greenBorderDark;
-      border-right: 1px solid @greenBorderLight;
-    }
-
-    .disabled {
-      a:hover {
-        background: none;
-      }
-      * {
-        cursor: not-allowed;
-      }
-    }
-
-    li {
-      height: 58px;
-      line-height: 58px;
-
-      &.active > a {
-        background-color: @blackBGDark;
-        color: white;
-      }
-
-      &:first-child {
-        border-top: 0;
-      }
-
-      &:last-child {
-        &::after {
-          content: '';
-          display: block;
-          border-bottom: 1px solid @whiteSideBarBorder;
-          position: relative;
-          top: -2px;
-        }
-      }
-
-      &.disabled {
-        a {
-          color: @grayFontDark;
-        }
-      }
-
-      a {
-        color: #bdbdbd;
-        font-size: 16px;
-        font-weight: lighter;
-        text-align: left;
-
-        display: inline-block;
-        width: 100%;
-        padding-left: 25px;
-
-        height: 58px;
-        line-height: 58px;
-
-        border-bottom: 1px solid @blackBGDark;
-        border-top: 1px solid @whiteSideBarBorder;
-
-        &:hover {
-          background: #3d3d3d;
-        }
-
-        &:before {
-          font-size: @mediumIconFontSize;
-          float: left;
-          margin-right: 12px;
-          line-height: 58px;
-        }
-        &.icon-builds:before {
-          font-size: 28px;
-        }
-      }
-    }
-
-  }
-
-  .mp-menu,
-  .sidebar-list {
-    background: @blackBGLight;
-    li.active > a {
-      background-color: @blackBGDark;
-      color: white;
-      border-top: 1px solid #282828;
-    }
-  }
-}
-
-.no-animate {
-  .mp-level {
-    transition: none !important;
-  }
-
-}
-
-.mp-pusher {
-  position: relative;
-  left: 0;
-  transition: none !important;
-
-}
-
-.mp-menu {
-  position: absolute; /* we can't use fixed here :( */
-  top: 0;
-  left: 0;
-  z-index: 1;
-  width: 200px;
-  -ms-transform: translate3d(-100%, 0, 0);
-  -webkit-transform: translate3d(-100%, 0, 0);
-  -moz-transform: translate3d(-100%, 0, 0);
-  transform: translate3d(-100%, 0, 0);
-
-  a {
-    text-decoration: none;
-  }
-}
-
-.mp-level {
-  position: absolute;
-  z-index: 10;
-  top: 0;
-  left: 0;
-  width: 100%;
-  background: @blackBGLight;
-  -ms-transform: translate3d(-100%, 0, 0);
-  -webkit-transform: translate3d(-100%, 0, 0);
-  -moz-transform: translate3d(-100%, 0, 0);
-  transform: translate3d(-100%, 0, 0);
-}
-
-/* overlays for pusher and for level that gets covered */
-.mp-pusher::after,
-.mp-level::after,
-.mp-level::before {
-  position: absolute;
-  top: 0;
-  right: 0;
-  width: 0;
-  height: 0;
-  content: '';
-  opacity: 0;
-}
-
-.mp-pusher::after,
-.mp-level::after {
-  background: rgba(0, 0, 0, 0.3);
-  -webkit-transition: opacity 0.3s, width 0.1s 0.3s, height 0.1s 0.3s;
-  -moz-transition: opacity 0.3s, width 0.1s 0.3s, height 0.1s 0.3s;
-  transition: opacity 0.3s, width 0.1s 0.3s, height 0.1s 0.3s;
-}
-
-.mp-level::after {
-  z-index: -1;
-}
-
-.mp-pusher.mp-pushed::after,
-.mp-level.mp-level-overlay::after {
-  width: 100%;
-  opacity: 0;
-  -webkit-transition: opacity 0.3s;
-  -moz-transition: opacity 0.3s;
-  transition: opacity 0.3s;
-}
-
-.mp-level.mp-level-overlay {
-  cursor: pointer;
-}
-
-.mp-level.mp-level-overlay.mp-level::before {
-  width: 100%;
-  background: transparent;
-  opacity: 1;
-}
-
-.mp-pusher,
-.mp-level {
-  -webkit-transition: all 0.5s;
-  -moz-transition: all 0.5s;
-  transition: all 0.5s;
-}
-
-/* overlap */
-.mp-overlap .mp-level.mp-level-open {
-  box-shadow: 1px 0 2px rgba(0, 0, 0, 0.2);
-  -ms-transform: translate3d(-40px, 0, 0);
-  -webkit-transform: translate3d(-40px, 0, 0);
-  -moz-transform: translate3d(-40px, 0, 0);
-  transform: translate3d(-40px, 0, 0);
-}
-
-/* First level */
-.mp-menu > .mp-level,
-.mp-menu > .mp-level.mp-level-open,
-.mp-menu.mp-overlap > .mp-level,
-.mp-menu.mp-overlap > .mp-level.mp-level-open {
-  box-shadow: none;
-
-}
-
-/* cover */
-.mp-cover .mp-level.mp-level-open {
-  -ms-transform: translate3d(0, 0, 0);
-  -webkit-transform: translate3d(0, 0, 0);
-  -moz-transform: translate3d(0, 0, 0);
-  transform: translate3d(0, 0, 0);
-}
-
-.mp-cover .mp-level.mp-level-open > ul > li > .mp-level:not(.mp-level-open) {
-  -ms-transform: translate3d(-100%, 0, 0);
-  -webkit-transform: translate3d(-100%, 0, 0);
-  -moz-transform: translate3d(-100%, 0, 0);
-  transform: translate3d(-100%, 0, 0);
-}
-
-/* content style */
-
-//.mp-menu ul li > a {
-//  display: block;
-//  //padding: 0.7em 1em 0.7em 1.8em;
-//  outline: none;
-//  box-shadow: inset 0 -1px rgba(0, 0, 0, 0.2);
-//  text-shadow: 0 0 1px rgba(255, 255, 255, 0.1);
-//  font-size: 1.4em;
-//  -webkit-transition: background 0.3s, box-shadow 0.3s;
-//  -moz-transition: background 0.3s, box-shadow 0.3s;
-//  transition: background 0.3s, box-shadow 0.3s;
-//}
-
-.mp-menu ul li::before {
-  position: absolute;
-  left: 10px;
-  z-index: -1;
-  color: rgba(0, 0, 0, 0.2);
-  line-height: 3.5;
-}
-
-//.mp-menu .mp-level.mp-level-overlay > ul > li > a,
-//.mp-level.mp-level-overlay > ul > li:first-child > a {
-//  box-shadow: inset 0 -1px rgba(0, 0, 0, 0);
-//}
-//
-//.mp-level > ul > li:first-child > a:hover,
-//.mp-level.mp-level-overlay > ul > li:first-child > a {
-//  box-shadow: inset 0 -1px rgba(0, 0, 0, 0), inset 0 1px rgba(0, 0, 0, 0);
-//}
-//
-//.mp-menu .mp-level.mp-level-overlay > .mp-back,
-//.mp-menu .mp-level.mp-level-overlay > .mp-back::after {
-//  background: transparent;
-//  box-shadow: none;
-//  color: transparent;
-//}
-
-/* Fallback example for browsers that don't support 3D transforms (and no JS fallback) */
-/* We'll show the first level only */
-.no-csstransforms3d .mp-pusher,
-.no-js .mp-pusher {
-  padding-left: 200px;
-}
-
-.no-csstransforms3d .mp-menu .mp-level,
-.no-js .mp-menu .mp-level {
-  display: none;
-}
-
-.no-csstransforms3d .mp-menu > .mp-level,
-.no-js .mp-menu > .mp-level {
-  display: block;
-}
-
-.nav-stacked > li + li,
-#jf-viewport #jf-main-nav ul li {
-  margin-top: 0;
-}
-
-.header-subitem {
-  height: 58px;
-
-  a {
-    display: inline-block;
-    width: 100%;
-    text-align: center;
-    border-bottom: 1px solid #2c2c2c !important;
-    font-size: 16px;
-    line-height: 58px !important;
-    color: #7a7a7a;
-
-    &:hover {
-      background-color: inherit !important;
-    }
-    &.text-muted {
-      color: #7a7a7a;
-    }
-  }
-
-  &.back-button {
-    height: 30px;
-    line-height: 30px;
-    background-color: #1a1a1a;
-    cursor: pointer;
-
-    a {
-      font-size: 14px !important;
-      height: 30px !important;
-      line-height: 28px !important;
-      position: relative;
-      color: #a9a9a9 !important;
-      padding-left: 39px !important;
-      border-top: 1px solid #151515 !important;
-
-      &::after {
-        content: "\2039";
-        position: absolute;
-        left: 24px;
-        top: -2px;
-        font-size: 24px;
-      }
-    }
-  }
-}
-
-.panel-default > .panel-heading {
-  padding: 0;
-}
-
-//-------------accordion----------------//
-.accordion-style {
-  .panel-default > .panel-heading {
-    background-color: @blackBGLight !important;
-  }
-
-  background: @accordionBgBlack;
-  a {
-    text-decoration: none;
-  }
-  .panel-body {
-    padding: 0;
-  }
-  .accordion-subitem {
-    width: 100%;
-    height: 46px;
-    font-size: 13px;
-    text-indent: 14px;
-    line-height: 44px;
-    color: #a9a9a9;
-
-    a.selected {
-      background-color: darkgray;
-    }
-
-    &.disabled {
-      &:hover * {
-        background: none;
-        cursor: not-allowed;
-      }
-
-      .subitem-style div {
-        color: @grayFontDark;
-      }
-    }
-
-    &:hover:not(.license-required) {
-      background: #2b2b2b;
-    }
-
-    &.license-required::after {
-      right: 34px;
-    }
-  }
-  .accordion-header {
-    -webkit-border-radius: 0;
-    -moz-border-radius: 0;
-    border-radius: 0;
-    border: 0 none !important;
-  }
-  .subitem-style {
-    width: 100%;
-    cursor: pointer;
-    border-bottom: 1px solid #151515;
-    border-top: 1px solid #302E2E;
-
-    & div {
-      text-align: left;
-      padding-left: 25px;
-    }
-  }
-  .subitem-style.selected {
-    background: @accordionActive;
-    color: @grayBGLight;
-    border-top: 1px solid #151515;
-    width: 100%;
-    a {
-      color: #ffffff;
-    }
-  }
-  .panel-group .panel + .panel {
-    margin-top: 0;
-  }
-  .panel-group .panel-heading + .panel-collapse .panel-body {
-    border-top: none;
-  }
-}
-
-.arrow-accord {
-  vertical-align: middle;
-
-}
-
-.sidebar-wrapper {
-  position: relative;
-  height: 100%;
-  overflow: hidden;
-
-  &.overflown {
-    overflow-y: auto;
-  }
-
-  .panel-default {
-    border-top: none;
-    border-color: transparent;
-    border-bottom: 1px solid #2c2c2c;
-    background-color: transparent;
-    .panel-heading,
-    .accordion-toggle {
-      font-weight: lighter;
-      border-radius: 0 !important;
-    }
-  }
-
-  .accordion-header {
-    &.disabled {
-      background: transparent !important;
-
-      a span {
-        color: @grayFontDark !important;
-      }
-
-      * {
-        cursor: not-allowed !important;
-      }
-    }
-
-    &.active {
-      .panel-heading a {
-        background: #1a1a1a;
-      }
-    }
-  }
-}
-
-
-//@media screen and (max-width: 1280px) {
-//  #jf-viewport {
-//    #jf-main-nav {
-//      .accordion-style .accordion-subitem {
-//        height: 40px;
-//        line-height: 40px;
-//      }
-//      ul li a {
-//        height: 43px;
-//        line-height: 43px;
-//        padding: 0.2em 0.3em 0.6em 1.8em !important;
-//      }
-//    }
-//  }
-//}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/assets/stylesheets/storage_viewer.less b/web/angular-web/src/main/webapp/app/assets/stylesheets/storage_viewer.less
deleted file mode 100644
index 34a913e..0000000
--- a/web/angular-web/src/main/webapp/app/assets/stylesheets/storage_viewer.less
+++ /dev/null
@@ -1,303 +0,0 @@
-//Storage Viewer
-ul.storage-binaries-summary {
-    list-style: none;
-    width: 500px;
-    li {
-      width: 250px;
-      float: left;
-      padding: 3px 0;
-      & > span:first-child {
-        display: inline-block;
-        padding-right: 35px;
-        width: 145px;
-      }
-    }
-}
-
-.rtfact-storage-viewer {
-  width: 100%;
-  color: black;
-  .rtfact-storage-element {
-    position: relative;
-    width: 100%;
-    margin-bottom: 20px;
-    border: 1px solid #dfdede;
-    background-color: #f0f0f0;
-    .storage-element-row {
-      border-bottom: 1px solid #dadada;
-      font-size: 14px;
-      width: 100%;
-      padding: 12px 25px;
-      margin: 0;
-      & > span > span {
-        margin: 0 15px;
-      }
-
-      .storage-element-separator {
-        margin: 0 10px;
-      }
-      .storage-element-name {
-        font-weight: 600;
-      }
-
-      .usage-string {
-        padding: 13px 0;
-        margin-right: 20px;
-      }
-
-      &.usage {
-        padding: 0 25px;
-        border-bottom: 0;
-      }
-      .storage-usage-container {
-        margin: 0 0 12px;
-      }
-    }
-
-    .caches-container {
-      border-bottom: 1px solid #b4b4b4;
-      padding: 7px 25px;
-      margin: 0;
-
-      .rtfact-storage-element {
-        margin: 0 -12px;
-        border-width: 1px 0 0;
-      }
-      .storage-element-row {
-        padding: 3px 10px;
-        font-size: 14px;
-        .storage-usage-container {
-          padding-right: 0;
-          padding-top: 0;
-        }
-        .usage-string {
-          padding-top: 0;
-        }
-      }
-      .storage-usage {
-        height: 10px;
-        margin-top: 4px;
-      }
-    }
-
-    .subs-container {
-      min-height: 135px;
-      padding: 20px 20px 0;
-      & > div:last-child {
-        .storage-element-as-sub {margin-right: 0 !important;}
-      }
-      .sub-container {
-        .sub-wrapper {
-          .storage-element-as-sub {
-            transition: height .25s ease-out;
-            .sub-usage {
-              transition: bottom .25s ease-out;
-            }
-          }
-        }
-        &:last-child {
-          .storage-element-as-sub {
-            .sub-usage {
-              margin-right: 20px !important;
-            }
-          }
-          .selected-sub::before {
-            margin-left: -13px !important;
-          }
-          .selected-sub::after {
-            margin-left: -13px !important;
-          }
-        }
-        &:not(:last-child) {
-          .storage-element-as-sub {
-            .sub-usage {
-              right: 28px;
-            }
-          }
-        }
-      }
-      .rtfact-storage-element {
-        border: none;
-      }
-      .storage-element-as-sub {
-        overflow-x: hidden;
-        white-space: nowrap;
-        border: 1px solid #dad9d9;
-        height: 100px ;
-        background-color: #e9e9e9;
-        margin-right: 20px !important;
-        padding: 8px;
-        cursor: pointer;
-        &:hover {
-          background-color: #dddddd;
-          border-color: #cccbcb;
-        }
-        .sub-usage {
-          position: absolute;
-          bottom: 8px;
-          left: 8px;
-          right: 8px;
-        }
-        .sub-usage-text {
-          font-size: 10px !important;
-        }
-        .overflow-tooltip-trigger {
-          z-index: 10000;
-          position: absolute;
-          top: 0;
-          bottom: 0;
-          right: 20px;
-          left: 0;
-          .mini-label {
-            padding: 8px 24px 8px 8px;
-            div {
-              overflow: hidden;
-              white-space: normal;
-            }
-          }
-        }
-        .icon-plus {
-          font-size: 10px;
-          color: #a6a6a6;
-          transition: transform .25s ease;
-          &.close-sign {
-            transform: rotate(45deg);
-          }
-        }
-      }
-      .selected-sub {
-        .the-schpitz;
-        &::before {
-          border-color: #a4a2a2 transparent transparent transparent;
-          bottom: 10px;
-          height: 10px;
-          margin-left: -25px;
-          border-width: 10px 15px 0 15px;
-          z-index: 500;
-        }
-        &::after {
-          border-color: #d8d8d8 transparent transparent transparent;
-          bottom: 3px;
-          height: 18px;
-          border-width: 10px 15px 0 15px;
-          margin-left: -25px;
-          z-index: 500;
-        }
-        .storage-element-as-sub {
-          background-color: #d8d8d8;
-          border-color: #a4a2a2;
-          height: 116px;
-          .sub-usage {bottom: 24px;}
-        }
-      }
-    }
-
-    .storage-usage {
-      border: 1px solid #cacfc9;
-      height: 20px;
-      width: 100%;
-      margin-top: 2px;
-      background-color: #fff;
-
-      &.infinity-storage {
-        background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAPElEQVQYV2N8/eHdfwYCgJGQolV3TjDgVQRSEKZigV8RzBVYTYKZgFMRugKQQoIOR1GEzQQU6/ApACkEANQ6M2AOiXgzAAAAAElFTkSuQmCC) repeat;
-      }
-      .infinity-sign {
-        float: right;
-        width: 40px;
-        background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiIHdpZHRoPSIxNnB4IiBoZWlnaHQ9IjE2cHgiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZW5hYmxlLWJhY2tncm91bmQ9 [...]
-        background-repeat: no-repeat;
-        background-position: center center;
-      }
-      .unsupported-sign {
-        float: right;
-        width: 40px;
-        background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiIHdpZHRoPSIxNnB4IiBoZWlnaHQ9IjE2cHgiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZW5hYmxlLWJhY2tncm91bmQ9 [...]
-        background-repeat: no-repeat;
-        background-position: center 2px;
-        background-size: 15px;
-      }
-      .storage-usage-used {
-        background-color: @greenFontHeader;
-        height: 100%;
-        line-height: 20px;
-        transition: width .5s ease-out;
-      }
-
-      .threshold-container {
-        width: 100%;
-        position: relative;
-        .threshold {
-          z-index: 10000;
-          position: absolute;
-          width: 1px;
-          margin-top: -1px;
-          .threshold-icon {
-            width: 26px;
-            height: 20px;
-            font: 12px Arial;
-            line-height: 20px;
-            text-align: center;
-            position: relative;
-            top: -26px;
-            color: #fff;
-            border-radius: 2px;
-            cursor: default;
-            margin-left: -12.5px;
-            &:after {
-              content: '';
-              width: 0;
-              height: 0;
-              border-style: solid;
-              border-width: 6px 4px 0 4px;
-              border-color: #e7e7e7 transparent transparent transparent;
-              position: absolute;
-              bottom: -6px;
-              right: 50%;
-              margin-right: -4px;
-            }
-          }
-          &.error {
-            background: red;
-            z-index: 10001;
-            .threshold-icon {
-              background-color: red;
-              &:after {
-                border-color: red transparent transparent transparent;
-              }
-            }
-          }
-          &.warning {
-            background: orange;
-            .threshold-icon {
-              background-color: orange;
-              &:after {
-                border-color: orange transparent transparent transparent;
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-
-  .storage-element-anim {
-    transition: all .5s ease;
-    overflow: hidden;
-    width: 100%;
-    &.ng-enter {
-      max-height: 0px;
-    }
-    &.ng-enter.ng-enter-active {
-      opacity: 1;
-      max-height: 1000px;
-    }
-    &.ng-leave {
-      max-height: 1000px;
-    }
-    &.ng-leave.ng-leave-active {
-      max-height: 0;
-      opacity: 0;
-    }
-  }
-}
diff --git a/web/angular-web/src/main/webapp/app/assets/stylesheets/tabs.less b/web/angular-web/src/main/webapp/app/assets/stylesheets/tabs.less
deleted file mode 100644
index cfd44d9..0000000
--- a/web/angular-web/src/main/webapp/app/assets/stylesheets/tabs.less
+++ /dev/null
@@ -1,95 +0,0 @@
-.nav-tabs {
-  width: 100%;
-  left: 0;
-  position: relative;
-  z-index: 200;
-
-  > li {
-    position: relative;
-    top: 1px;
-    margin-bottom: 0;
-
-    > a:hover, &.active > a, &.active > a:hover, .active > a:focus {
-      background: transparent;
-      border: none;
-      padding-top: 1px;
-    }
-
-    &:not(.license-required):not(.disabled) {
-      > a:hover, &.active > a, &.active > a:hover, .active > a:focus {
-        border-bottom: 1px solid @greenBGDark;
-        color: @greenBGDark;
-        cursor: pointer;
-        z-index: 3;
-      }
-
-      &.active > a, &.active > a:hover, .active > a:focus {
-        .the-schpitz;
-      }
-    }
-
-    &.license-required {
-      &::after {
-        content: "";
-      }
-
-      a span {
-        position: relative;
-
-        .license-required-icon;
-
-        &::after {
-          top: -2px;
-          right: -24px;
-        }
-      }
-    }
-  }
-
-  > li:first-child {
-    margin-left: 35px;
-  }
-
-  li {
-    width: 165px;
-    text-align: center;
-
-    &.action-expand {
-      width: 50px;
-    }
-
-    > a {
-      padding: 0 0 8px 0;
-      margin-right: 0;
-      //width: 145px;
-
-      color: @grayFontGeneral;
-    }
-  }
-
-  .dropdown-menu {
-    -webkit-border-radius: 0;
-    -moz-border-radius: 0;
-    border-radius: 0;
-    right: -15px;
-    margin-top: 3px;
-    top: auto;
-
-    .dropdown-item {
-      cursor: pointer;
-    }
-  }
-}
-
-.nav-tabs-more {
-  display: block;
-  color: @grayFontGeneral;
-  font-size: 24px;
-  padding: 0 25px;
-  margin-top: -8px;
-
-  &:hover, &:focus, .dropdown.open & {
-    background-color: transparent !important;
-    color: @greenFontHeader;
-  }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/assets/stylesheets/tree-control-attribute.less b/web/angular-web/src/main/webapp/app/assets/stylesheets/tree-control-attribute.less
deleted file mode 100644
index 1aea842..0000000
--- a/web/angular-web/src/main/webapp/app/assets/stylesheets/tree-control-attribute.less
+++ /dev/null
@@ -1,109 +0,0 @@
-[treecontrol] {
-    /* prevent user selection */
-    -moz-user-select: -moz-none;
-    -khtml-user-select: none;
-    -webkit-user-select: none;
-    -ms-user-select: none;
-    user-select: none;
-
-    /* default */
-    font-family: Verdana, Helvetica, Arial, sans-serif;
-    font-size:13px;
-    color: #555;
-    text-decoration: none;
-}
-
-[treecontrol] ul {
-    margin: 0;
-    padding: 0;
-    list-style: none;
-    border: none;
-    overflow: hidden;
-}
-
-[treecontrol] li {
-    position: relative;
-    padding: 0 0 0 20px;
-    line-height: 20px;
-}
-
-[treecontrol] li.tree-expanded i.tree-leaf-head, [treecontrol] li.tree-collapsed i.tree-leaf-head {display:none;}
-[treecontrol] li.tree-expanded i.tree-branch-head, [treecontrol] li.tree-collapsed i.tree-branch-head {display:inline;}
-[treecontrol] li.tree-leaf i.tree-branch-head {display:none;}
-[treecontrol] li.tree-leaf i.tree-leaf-head {display:inline;}
-
-[treecontrol] li i {
-    cursor: pointer;
-}
-
-[treecontrol] li .tree-label {
-    cursor: pointer;
-    display: inline;
-}
-
-
-[treecontrol].tree-classic li.tree-expanded i.tree-branch-head {
-    padding: 1px 10px;
-    background: url("../images/folder.png") no-repeat;
-}
-
-[treecontrol].tree-classic li.tree-collapsed i.tree-branch-head {
-    padding: 1px 10px;
-    background: url("../images/folder-closed.png") no-repeat;
-}
-
-[treecontrol].tree-classic li.tree-leaf i.tree-leaf-head {
-    padding: 1px 10px;
-    background: url("../images/file.png") no-repeat;
-}
-
-[treecontrol].tree-classic li .tree-selected {
-    background-color: #aaddff;
-    font-weight: bold;
-}
-
-
-[treecontrol].tree-light li.tree-expanded i.tree-branch-head {
-    padding: 1px 10px;
-    background: url("../images/node-opened-2.png") no-repeat;
-}
-
-[treecontrol].tree-light li.tree-collapsed i.tree-branch-head {
-    padding: 1px 10px;
-    background: url("../images/node-closed-2.png") no-repeat;
-}
-
-[treecontrol].tree-light li.tree-leaf i.tree-leaf-head {
-    padding: 1px 10px;
-    width: 16px; height: 16px;
-    background: none no-repeat;
-}
-
-[treecontrol].tree-light li .tree-selected {
-    font-weight: bold;
-}
-
-
-[treecontrol].tree-dark li.tree-expanded i.tree-branch-head {
-    padding: 1px 10px;
-    background: url("../images/node-opened-light.png") no-repeat;
-}
-
-[treecontrol].tree-dark li.tree-collapsed i.tree-branch-head {
-    padding: 1px 10px;
-    background: url("../images/node-closed-light.png") no-repeat;
-}
-
-[treecontrol].tree-dark li.tree-leaf i.tree-leaf-head {
-    padding: 1px 10px;
-    width: 16px; height: 16px;
-    background: none no-repeat;
-}
-
-[treecontrol].tree-dark li .tree-selected {
-    font-weight: bold;
-}
-
-[treecontrol].tree-dark {
-    color: #ddd;
-}
diff --git a/web/angular-web/src/main/webapp/app/assets/stylesheets/tree-control.less b/web/angular-web/src/main/webapp/app/assets/stylesheets/tree-control.less
deleted file mode 100644
index 69a8cad..0000000
--- a/web/angular-web/src/main/webapp/app/assets/stylesheets/tree-control.less
+++ /dev/null
@@ -1,109 +0,0 @@
-treecontrol {
-    /* prevent user selection */
-    -moz-user-select: -moz-none;
-    -khtml-user-select: none;
-    -webkit-user-select: none;
-    -ms-user-select: none;
-    user-select: none;
-
-    /* default */
-    font-family: Verdana, Helvetica, Arial, sans-serif;
-    font-size:13px;
-    color: #555;
-    text-decoration: none;
-}
-
-treecontrol ul {
-    margin: 0;
-    padding: 0;
-    list-style: none;
-    border: none;
-    overflow: hidden;
-}
-
-treecontrol li {
-    position: relative;
-    padding: 0 0 0 20px;
-    line-height: 20px;
-}
-
-treecontrol li.tree-expanded i.tree-leaf-head, treecontrol li.tree-collapsed i.tree-leaf-head {display:none;}
-treecontrol li.tree-expanded i.tree-branch-head, treecontrol li.tree-collapsed i.tree-branch-head {display:inline;}
-treecontrol li.tree-leaf i.tree-branch-head {display:none;}
-treecontrol li.tree-leaf i.tree-leaf-head {display:inline;}
-
-treecontrol li i.tree-branch-head {
-    cursor: pointer;
-}
-
-treecontrol li .tree-label {
-    cursor: pointer;
-    display: inline;
-}
-
-
-treecontrol.tree-classic li.tree-expanded i.tree-branch-head {
-    padding: 1px 10px;
-    background: url("../images/folder.png") no-repeat;
-}
-
-treecontrol.tree-classic li.tree-collapsed i.tree-branch-head {
-    padding: 1px 10px;
-    background: url("../images/folder-closed.png") no-repeat;
-}
-
-treecontrol.tree-classic li.tree-leaf i.tree-leaf-head {
-    padding: 1px 10px;
-    background: url("../images/file.png") no-repeat;
-}
-
-treecontrol.tree-classic li .tree-selected {
-    background-color: #aaddff;
-    font-weight: bold;
-}
-
-
-treecontrol.tree-light li.tree-expanded i.tree-branch-head {
-    padding: 1px 10px;
-    background: url("../images/node-opened-2.png") no-repeat;
-}
-
-treecontrol.tree-light li.tree-collapsed i.tree-branch-head {
-    padding: 1px 10px;
-    background: url("../images/node-closed-2.png") no-repeat;
-}
-
-treecontrol.tree-light li.tree-leaf i.tree-leaf-head {
-    padding: 1px 10px;
-    width: 16px; height: 16px;
-    background: none no-repeat;
-}
-
-treecontrol.tree-light li .tree-selected {
-    font-weight: bold;
-}
-
-
-treecontrol.tree-dark li.tree-expanded i.tree-branch-head {
-    padding: 1px 10px;
-    background: url("../images/node-opened-light.png") no-repeat;
-}
-
-treecontrol.tree-dark li.tree-collapsed i.tree-branch-head {
-    padding: 1px 10px;
-    background: url("../images/node-closed-light.png") no-repeat;
-}
-
-treecontrol.tree-dark li.tree-leaf i.tree-leaf-head {
-    padding: 1px 10px;
-    width: 16px; height: 16px;
-    background: none no-repeat;
-}
-
-treecontrol.tree-dark li .tree-selected {
-    font-weight: bold;
-}
-
-treecontrol.tree-dark {
-    color: #ddd;
-}
diff --git a/web/angular-web/src/main/webapp/app/assets/stylesheets/user_profile.less b/web/angular-web/src/main/webapp/app/assets/stylesheets/user_profile.less
deleted file mode 100644
index 0e8e049..0000000
--- a/web/angular-web/src/main/webapp/app/assets/stylesheets/user_profile.less
+++ /dev/null
@@ -1,79 +0,0 @@
-#user-profile-oauth {
-  padding-top: 10px;
-
-  .user-profile-oauth-row {
-    clear: both;
-    line-height: 30px;
-    margin-bottom: 10px;
-    padding-bottom: 10px;
-    border-bottom: 1px solid @grayBorderLighter;
-
-    div:not(.clearfix) {
-      float: left;
-    }
-  }
-
-  .icon-oauth {
-    width: 30px;
-    height: 30px;
-    background-size: 100% auto;
-  }
-  .provider-name {
-    font-size: 16px;
-    margin: 0 10px;
-    width: 400px;
-    white-space: nowrap;
-    overflow: hidden;
-    text-overflow: ellipsis;
-  }
-  .oauth-username {
-    padding-left: 40px;
-    height: 20px;
-    line-height: 20px;
-  }
-  .unbind-link {
-    color: @redError;
-  }
-}
-
-#jf-viewport {
-  .panel {
-    &.disabled {
-      background: @grayBGLoginLight;
-    }
-  }
-
-  .current-password {
-    padding-left: 0;
-  }
-  .progress {
-    padding: 0 !important;
-    margin: 0;
-    border-radius: 4px;
-    border: 0 none;
-    
-    [role="progressbar"] {
-      height: 20px;
-      box-shadow: inset 0 -1px 2px rgba(0,0,0,.2);
-
-      &.danger {
-        background-color: @redError;
-      }
-
-      &.warning {
-        background-color: @yellowWarning;
-      }
-
-      &.success {
-        background-color: @greenFontDark;
-      }
-    }
-  }
-}
-
-.profile-reveal {
-  padding-top: 1px;
-}
-.profile-copy, .profile-generate {
-  padding-top: 3px;
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/assets/stylesheets/variables.less b/web/angular-web/src/main/webapp/app/assets/stylesheets/variables.less
deleted file mode 100644
index fe1c402..0000000
--- a/web/angular-web/src/main/webapp/app/assets/stylesheets/variables.less
+++ /dev/null
@@ -1,91 +0,0 @@
-// Colors
- at greenBGDark:      #43a047;
- at greenBGLight:     #f7f7f7;
- at greenBGLighter:   #d7ead8;
- at greenBGDropdownHover: #e7f4e8;
- at greenBorderDark:  #409843;
- at greenBorderLight: #63b066;
- at greenFontLight:   #BFDFC2;
- at greenFontDark:    #5bab5e;
- at greenFontDarker:  #50a554;
- at greenSeparatorBorder: #63b066;
- at greenDarkSeparatorBorder: #409843;
- at greenBGPrimary:  #429f46;
- at greenBGPrimaryHover: #39893d;
- at greenBGSecondary:  #e7f4e8;
- at greenBGSecondaryHover: #c7e5c8;
- at greenBGSmall: #cee6cf;
- at greenBGSmallHover: #ebf5ec;
- at greenBGSmallActive: #69b36c;
- at greenBorderDarker:  #50ac58;
- at greenFontHeader:    #429f46;
-
- at blackBGLight:     #373737;
- at blackBGMediumDark: #2e2e2e;
- at blackBGDark:      #2B2B2B;
- at blackFontDark:    #2B2B2B;
- at blackBorderLight: #d9d9d9;
- at blackBorderDark:  #2C2C2C;
- at blackBGSecondary:   #2a2a2a;
- at blackBGSecondaryHover: #3a3a3a;
- at blackBGSecondaryActive: #202020;
- at accordionBgBlack: #262626;
- at accordionActive: #1a1a1a;
- at grayBGLoginLight: #f1f1f1;
- at grayBGLight:      #f7f7f7;
- at grayBGLighter:    #f5f5f5;
- at grayBorderLight:  #eeeeee;
- at grayBorderLighter: #e9e9e9;
- at grayBorderDark:   #d7dbdd;
- at grayBorderDarker: #bdbdbd;
- at grayBorderMiddleDark: #bcbcbc;
- at grayBGDark:       #e3e4e5;
- at grayFontGeneral:  #707070;
- at grayFontDark:     #606060;
- at grayFontDarker:   #757575;
- at grayFontLight:    #585858;
- at grayFontLighter:  #bdbdbd;
- at grayBGDarker:     #e0e5e7;
- at grayBGLogin:    #2B2B2B;
- at grayBGMedium:     #e4e4e4;
- at grayBGMediumLight: #e9eaeb;
- at grayPlaceholderLight: #a3a3a3;
- at grayFontMediumDark:  #878787;
- at grayBGDisabled:  #b3b3b3;
- at grayButtonSecondaryDisabled:  #e5e5e5;
- at softGrayBackground: #f2f2f2;
-
- at grayGridHeader:     #e5e9eb;
- at grayGridRow:         #f7f7f7;
- at grayGridRowHover:    #f1f1f1;
- at grayGridSortingCell:    #d5dadb;
- at grayDocker: #c9c9c9;
-
- at whiteSideBarBorder:  #413e3e;
- at blueMain: #006CAB;
-
-
- at blueFontDark:     #01579b;
- at blueBGLight:      #e0f3fb;
- at blueLinkBasic:    #00569a;
-
- at redError:   #d73f3f;
- at yellowWarning:   #f3c43d;
- at greenInfo:   #BFDFC2;
-
- at homeNewsHeadline: #f3c43d;
- at buildToolBtnBorder: #50ab58;
-
-
- at white: #fff;
-
-// Font sizes
- at normalFontSize: 16px;
- at mediumIconFontSize:  24px;
-
-// margins & dimensions
- at topHeaderHeight: 60px;
- at mainBarWidth: 200px;
-
-// layout
- at layoutFooterHeight: 60px;
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/assets/svgicons/admin.svg b/web/angular-web/src/main/webapp/app/assets/svgicons/admin.svg
deleted file mode 100644
index 4fa9979..0000000
--- a/web/angular-web/src/main/webapp/app/assets/svgicons/admin.svg
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="24px" height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
-<style type="text/css">
-	.st0{fill:#6B6B6B;}
-	.st1{fill:none;stroke:#6B6B6B;stroke-miterlimit:10;}
-</style>
-<g>
-	<g>
-		<path class="st0" d="M12,1c0.8,0,1.4,0.6,1.4,1.4c0,0,0,0.1,0,0.1l0,0.1l-0.1,0.9l0.9,0.2c0.8,0.2,1.6,0.5,2.3,0.9l0.8,0.5
-			l0.5-0.7c0.1-0.1,0.1-0.1,0.1-0.2c0.3-0.2,0.6-0.4,0.9-0.4c0.4,0,0.7,0.1,1,0.4c0.3,0.3,0.4,0.6,0.4,1c0,0.4-0.1,0.7-0.4,0.9
-			c-0.1,0-0.1,0.1-0.2,0.1l-0.7,0.5l0.5,0.8c0.4,0.7,0.7,1.5,1,2.3l0.2,0.9l0.9-0.1l0.1,0c0,0,0.1,0,0.1,0c0.8,0,1.4,0.6,1.4,1.4
-			c0,0.8-0.6,1.4-1.4,1.4c0,0-0.1,0-0.1,0l-0.1,0l-0.9-0.1l-0.2,0.9c-0.2,0.8-0.5,1.6-1,2.3l-0.5,0.8l0.7,0.5
-			c0.1,0.1,0.1,0.1,0.2,0.1c0.2,0.3,0.4,0.6,0.4,0.9c0,0.4-0.1,0.7-0.4,1c-0.3,0.3-0.6,0.4-1,0.4c-0.4,0-0.7-0.1-0.9-0.4
-			c0-0.1-0.1-0.1-0.1-0.2l-0.5-0.7l-0.8,0.5c-0.7,0.4-1.5,0.7-2.3,1l-0.9,0.2l0.1,0.9l0,0.1c0,0,0,0.1,0,0.1c0,0.8-0.6,1.4-1.4,1.4
-			c-0.8,0-1.4-0.6-1.4-1.4c0,0,0-0.1,0-0.1l0-0.1l0.1-0.9l-0.9-0.2c-0.8-0.2-1.6-0.5-2.3-1l-0.8-0.5l-0.5,0.7
-			c-0.1,0.1-0.1,0.1-0.1,0.2c-0.3,0.2-0.6,0.4-0.9,0.4c-0.4,0-0.7-0.1-1-0.4c-0.3-0.3-0.4-0.6-0.4-1c0-0.4,0.1-0.7,0.4-0.9
-			c0.1,0,0.1-0.1,0.2-0.1l0.7-0.5l-0.5-0.8c-0.4-0.7-0.7-1.5-1-2.3l-0.2-0.9l-0.9,0.1l-0.1,0c0,0-0.1,0-0.1,0C1.6,13.4,1,12.8,1,12
-			c0-0.8,0.6-1.4,1.4-1.4c0,0,0.1,0,0.1,0l0.1,0l0.9,0.1l0.2-0.9c0.2-0.8,0.5-1.6,1-2.3l0.5-0.8L4.4,6.3C4.3,6.2,4.3,6.2,4.2,6.2
-			C3.9,5.9,3.8,5.6,3.8,5.2c0-0.4,0.1-0.7,0.4-1c0.3-0.3,0.6-0.4,1-0.4c0.3,0,0.7,0.1,0.9,0.4c0,0.1,0.1,0.1,0.1,0.2l0.5,0.7
-			l0.8-0.5c0.7-0.4,1.5-0.7,2.3-0.9l0.9-0.2l-0.1-0.9l0-0.1c0,0,0-0.1,0-0.1C10.6,1.6,11.2,1,12,1 M12,0c-1.3,0-2.4,1.1-2.4,2.4
-			c0,0.1,0,0.2,0,0.3C8.7,2.9,7.9,3.3,7.1,3.8C7,3.7,7,3.6,6.9,3.5C6.4,3,5.8,2.8,5.2,2.8S4,3,3.5,3.5C2.6,4.5,2.6,6,3.5,6.9
-			C3.6,7,3.7,7,3.8,7.1C3.3,7.9,2.9,8.7,2.7,9.6c-0.1,0-0.2,0-0.3,0C1.1,9.6,0,10.7,0,12s1.1,2.4,2.4,2.4c0.1,0,0.2,0,0.3,0
-			c0.2,0.9,0.6,1.8,1.1,2.6C3.7,17,3.6,17,3.5,17.1c-0.9,0.9-0.9,2.5,0,3.4C4,21,4.6,21.2,5.2,21.2s1.2-0.2,1.7-0.7
-			C7,20.4,7,20.3,7.1,20.2c0.8,0.5,1.6,0.8,2.6,1.1c0,0.1,0,0.2,0,0.3c0,1.3,1.1,2.4,2.4,2.4c1.3,0,2.4-1.1,2.4-2.4
-			c0-0.1,0-0.2,0-0.3c0.9-0.2,1.8-0.6,2.6-1.1c0.1,0.1,0.1,0.2,0.2,0.3c0.5,0.5,1.1,0.7,1.7,0.7s1.2-0.2,1.7-0.7
-			c0.9-0.9,0.9-2.5,0-3.4c-0.1-0.1-0.2-0.1-0.3-0.2c0.5-0.8,0.8-1.6,1.1-2.6c0.1,0,0.2,0,0.3,0c1.3,0,2.4-1.1,2.4-2.4
-			s-1.1-2.4-2.4-2.4c-0.1,0-0.2,0-0.3,0c-0.2-0.9-0.6-1.8-1.1-2.6C20.3,7,20.4,7,20.5,6.9c0.9-0.9,0.9-2.5,0-3.4
-			C20,3,19.4,2.8,18.8,2.8S17.6,3,17.1,3.5C17,3.6,17,3.7,16.9,3.8c-0.8-0.5-1.6-0.8-2.6-1.1c0-0.1,0-0.2,0-0.3
-			C14.4,1.1,13.3,0,12,0L12,0z"/>
-	</g>
-	<circle class="st1" cx="12" cy="12" r="3.2"/>
-	<circle class="st1" cx="12" cy="12" r="6.5"/>
-</g>
-</svg>
diff --git a/web/angular-web/src/main/webapp/app/assets/svgicons/artifacts.svg b/web/angular-web/src/main/webapp/app/assets/svgicons/artifacts.svg
deleted file mode 100644
index c90c04a..0000000
--- a/web/angular-web/src/main/webapp/app/assets/svgicons/artifacts.svg
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="24px" height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
-<style type="text/css">
-	.st0{fill:#6B6B6B;}
-	.st1{fill:none;stroke:#6B6B6B;stroke-miterlimit:10;}
-</style>
-<path class="st0" d="M12,1.2c-6.1,0-11,4.9-11,11s4.9,11,11,11c6.1,0,11-4.9,11-11S18.1,1.2,12,1.2z M12,2.2
-	c5.6,0,10.1,4.5,10.1,10.1c0,2.3-0.8,4.5-2.1,6.2c-1-2.1-2.6-3.6-4.6-4.4c1-0.9,1.6-2.2,1.6-3.6c0-2.8-2.3-5.1-5.1-5.1
-	s-5.1,2.3-5.1,5.1c0,1.5,0.6,2.8,1.6,3.7C6.5,14.9,5,16.4,4,18.4c-1.3-1.7-2.1-3.8-2.1-6.2C1.9,6.7,6.4,2.2,12,2.2z M14.3,13.7
-	c-0.4,0.3-0.9,0.5-1.4,0.7c-0.3,0.1-0.7,0.2-1.1,0.2c-0.4,0-0.7-0.1-1-0.1c-0.5-0.1-1-0.4-1.4-0.7c-1-0.8-1.7-2-1.7-3.3
-	c0-2.3,1.9-4.1,4.1-4.1S16,8.1,16,10.4C16,11.7,15.3,12.9,14.3,13.7z M12,22.3c-2.9,0-5.5-1.2-7.4-3.2c1-2.1,2.6-3.6,4.7-4.4
-	c0.7,0.4,1.6,0.7,2.5,0.7c1,0,1.9-0.3,2.6-0.8c2.1,0.7,3.8,2.2,4.9,4.4C17.5,21.1,14.9,22.3,12,22.3z"/>
-</svg>
diff --git a/web/angular-web/src/main/webapp/app/assets/svgicons/build.svg b/web/angular-web/src/main/webapp/app/assets/svgicons/build.svg
deleted file mode 100644
index 2b14ded..0000000
--- a/web/angular-web/src/main/webapp/app/assets/svgicons/build.svg
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="24px" height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
-<style type="text/css">
-	.st0{fill:#6B6B6B;}
-	.st1{fill:none;stroke:#6B6B6B;stroke-miterlimit:10;}
-</style>
-<g>
-	<g>
-		<line class="st1" x1="20.7" y1="22.9" x2="17" y2="19.3"/>
-		<circle class="st1" cx="14.9" cy="17.2" r="3"/>
-	</g>
-	<g>
-		<polyline class="st1" points="10.8,23 3.3,23 3.3,6.6 9.1,1 20.3,1 20.3,12.5 		"/>
-		<polyline class="st1" points="3.8,7 9.3,7 9.3,1.5 		"/>
-	</g>
-</g>
-</svg>
diff --git a/web/angular-web/src/main/webapp/app/assets/svgicons/home.svg b/web/angular-web/src/main/webapp/app/assets/svgicons/home.svg
deleted file mode 100644
index 85a9160..0000000
--- a/web/angular-web/src/main/webapp/app/assets/svgicons/home.svg
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 width="24px" height="24px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
-<style type="text/css">
-	.st0{fill:#6B6B6B;}
-	.st1{fill:none;stroke:#6B6B6B;stroke-miterlimit:10;}
-</style>
-<g>
-	<path class="st0" d="M12.041687,20.0072632c4.97052,0,9-4.4788208,9-10.0036621S17.012207,0,12.041687,0
-		c-4.9705811,0-9,4.4787598-9,10.0036011S7.071106,20.0072632,12.041687,20.0072632z M12.041687,1
-		c4.4111938,0,8,4.0390015,8,9.0036011c0,4.9646606-3.5888062,9.0036621-8,9.0036621c-4.4112549,0-8-4.0390015-8-9.0036621
-		C4.041687,5.0390015,7.6304321,1,12.041687,1z"/>
-	<rect x="5" y="22" class="st0" width="14" height="1"/>
-</g>
-</svg>
diff --git a/web/angular-web/src/main/webapp/app/constants/api.constants.js b/web/angular-web/src/main/webapp/app/constants/api.constants.js
deleted file mode 100644
index 71a4852..0000000
--- a/web/angular-web/src/main/webapp/app/constants/api.constants.js
+++ /dev/null
@@ -1,102 +0,0 @@
-export default {
-    "API_URL": "../ui",
-    "AUTH_LOGIN": "/auth/login?_spring_security_remember_me=",
-    "AUTH_CURRENT": "/auth/current",
-    "AUTH_LOGOUT": "/auth/logout",
-    "AUTH_IS_SAML": "/auth/issaml",
-    "AUTH_FORGOT_PASSWORD": "/auth/forgotpassword",
-    "AUTH_VALIDATE_KEY": '/auth/validatetoken?key=',
-    "AUTH_RESET_PASSWORD": "/auth/resetpassword?key=",
-    "AUTH_LOGIN_DATA": '/auth/loginRelatedData',
-    "AUTH_CAN_ANNOTATE": '/auth/canAnnotate?repoKey=',
-    "CRYPTO": "/crypto",
-    "SECURITY_CONFIG": "/securityconfig",
-    "USERS": "/users",
-    "GROUPS": "/groups",
-    "GROUP_PERMISSION": "/groupPermission",
-    "MAIL": "/mail",
-    "REGISTER_PRO": "/registerlicense",
-    "PROXIES": "/proxies",
-    "REVERSE_PROXIES": "/reverseProxies",
-    "HTTPSSO": "/httpsso",
-    "SSHSERVER": "/sshserver",
-    "LICENSES": "/licenses",
-    "HIGH_AVAILABILITY": "/highAvailability",
-    "SAML_CONFIG": "/saml/config",
-    "SAML_LOGOUT": "/saml/logoutRequest",
-    "OAUTH_LOGIN": "/oauth2/loginRequest",
-    "BINTRAY_SETTING": "/bintraysetting",
-    "BLACK_DUCK": "/blackduck",
-    "PROPERTY_SETS": "/propertysets",
-    "BROWSE_FILESYSTEM": "/browsefilesystem",
-    "BACKUP": "/backup",
-    "SYSTEM_INFO": "/systeminfo",
-    "CONFIG_DESCRIPTOR": "/configdescriptor",
-    "SECURITY_DESCRIPTOR": "/securitydescriptor",
-    "INDEXER": "/indexer",
-    "STORAGE_SUMMARY": "/storagesummary",
-    "TREE_BROWSER": "/treebrowser",
-    "REPO_DATA": "/repodata",
-    "CRON_TIME": "/crontime",
-    "DATE_FORMAT": "/validations/dateformat",
-    "NAME_VALIDATOR": "/validations/name",
-    "UNIQUE_ID_VALIDATOR": "/validations/uniqueid",
-    "XML_NAME_VALIDATOR": "/validations/xmlname",
-    "ARTIFACT_PERMISSIONS": "/artifactpermissions",
-    "ARTIFACT_GENERAL": "/artifactgeneral",
-    "ARTIFACT_GENERAL_BINTRAY": "/artifactgeneral/bintray",
-    "ARTIFACT_VIEW_SOURCE": "/archiveViewSource",
-    "ARTIFACT_BUILDS": "/artifactbuilds",
-    "ARTIFACT_ACTIONS": "/artifactactions",
-    "ARTIFACT_PROPERTIES": "/artifactproperties",
-    "ARTIFACT_GOVERNANCE": "/artifactblackduck",
-    "PREDEFINE_VALUES": "/predefinevalues",
-    "REPO_PROPERTY_SET": "/repopropertyset",
-    "ARTIFACT_WATCHES": "/artifactwatches",
-    "ARTIFACT_SEARCH": "/artifactsearch",
-    "DEPENDENCY_DECLARATION": "/dependencydeclaration",
-    "ARTIFACT": "/artifact",
-    "FOOTER":"/auth/screen/footer",
-    "VIEWS":"/views",
-    "CROWD":"/crowd",
-    "EXPORT": "/artifactexport",
-    "IMPORT": "/artifactimport",
-    "MAINTENANCE": "/maintenance",
-    "LDAP": "/ldap",
-    "OAUTH": "/oauth",
-    "CHECKSUMS": "/checksums",
-    "FILTERED_RESOURCE": "/filteredResource",
-    "LDAP_GROUPS": "/ldapgroups",
-    "PUSH_TO_BINTRAY": "/pushToBintray",
-    "BINTRAY_DISTRIBUTION": "/distribution",
-    "GENERAL_CONFIG": "/generalConfig",
-    "SIGNINGKEYS": "/signingkeys",
-    "KEYSTORE":"/keystore",
-    "USER_PROFILE": "/userProfile",
-    "SSH_CLIENT": "/sshClient",
-    "USER_API_KEY": "/userApiKey",
-    "BUILDS": "/builds",
-    "BUILDS_INFO": "/buildsinfo",  /// JUST FOR MOCK, WILL BE REMOVED
-    "TARGET_PERMISSIONS": "/targetPermissions",
-    "GENERAL_TAB_LICENSES":"/generalTabLicenses",
-    "HOME_PAGE": "/home",
-    "SYSTEM_LOGS": "/systemlogs",
-    "SET_ME_UP": "/setMeUp",
-    "SET_ME_UP_MAVEN": "/setMeUp/mavenSettings",
-    "SET_ME_UP_GRADLE": "/setMeUp/gradleSettings",
-    "SET_ME_UP_IVY": "/setMeUp/ivySettings",
-    "SET_ME_UP_MAVEN_DISTRIBUTION": "/setMeUp/mavenDistributionManagement",
-    "SET_ME_UP_MAVEN_SNIPPET": "/setMeUp/mavenSnippet",
-    "SET_ME_UP_GRADLE_SNIPPET": "/setMeUp/gradleSnippet",
-    "SET_ME_UP_IVY_SNIPPET": "/setMeUp/ivySnippet",
-    "SET_ME_UP_REVERSE_PROXY_DATA": "/setMeUp/reverseProxyData",
-    "REPOSITORIES":"/admin/repositories",
-    "REPOSITORIES_LAYOUTS":"/admin/repolayouts",
-    "STASH_RESULTS":"/stashResults",
-    "SUPPORT_PAGE":"/userSupport",
-    "SERVER_TIME":"/system/serverTime",
-    "LICENSE_DETAILS":"/system/license",
-    "BINARY_PROVIDERS_INFO":"/binary/providers/info",
-    "DOCKER_STATUS":"/admin/repositories/docker",
-    "GLOBAL_REPLICATIONS_BLOCK":"/global/replications/config"
-}
diff --git a/web/angular-web/src/main/webapp/app/constants/artifact_tooltip.constant.js b/web/angular-web/src/main/webapp/app/constants/artifact_tooltip.constant.js
deleted file mode 100644
index 8f2a193..0000000
--- a/web/angular-web/src/main/webapp/app/constants/artifact_tooltip.constant.js
+++ /dev/null
@@ -1,588 +0,0 @@
-export default {
-    admin: {
-        advanced: {
-            maintenance: {
-                garbageCronExpression: `The Cron expression that determines the frequency of garbage collection.
-For detailed information, see <a href="http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/crontrigger" target="_blank">The CronTrigger Tutorial</a>.`,
-                cleanupCronExpression: `The Cron expression that determines the frequency of artifacts cleanup.
-For detailed information, see <a href="http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/crontrigger" target="_blank">The CronTrigger Tutorial</a>.`,
-                runNow: `Remove unreferenced binaries from the underlying datastore.
-Artifactory periodically runs garbage collection to remove unused (deleted) binaries from the datastore.
-You may also run datastore cleanup manually using this button.`,
-                enableQuotaControl: `Enable control over the amount of storage space used for binaries to avoid running out of disk space.`,
-                storageSpaceLimit: `The maximum percentage of disk capacity that the partition containing the binaries folder is allowed to use.
-Once this limit has been reached, deployment is rejected with a 413 error (request entity
-too large) and an error message is displayed in the UI (visible to admin users only).
-When using filesystem storage, the partition checked is the one containing the
-'$ARTIFACTORY_HOME/data/filestore' directory.
-When using database BLOB storage, the partition checked is the one containing the
-'$ARTIFACTORY_HOME/data/cache' directory.`,
-                storageSpaceWarning: `The percentage of disk space usage, by the partition containing the binaries folder, that will trigger a warning.
-Once this limit is reached a warning is logged and a warning message is displayed in the UI
-(visible to admin users only).`,
-                cronExpressionCleanup: `The Cron expression that determines the frequency at which unused artifacts are cleaned up. For detailed information, see <a href="http://www.quartz-scheduler.org/documentation/quartz-1.x/tutorials/crontrigger" target="_blank">The CronTrigger Tutorial</a>.`,
-                runUnusedCachedArtifactsCleanup: `Remove unused artifacts from all remote repository caches
-according to the 'Keep Unused Artifacts(Hours)' setting for each remote repository.
-Artifactory periodically cleans up unused artifacts from all remote repository caches.
-You can also run the cleanup manually using this button.`,
-                cleanVirtualRepositoriesNow: `Clean up internal data used by virtual repositories.
-Cached POM files older than the number of hours defined in the 'virtualCacheCleanup.maxAgeHours' system property will be deleted.
-The default is 168 hours (one week). Artifacts accessed through virtual repositories will not be affected by this.`,
-                compressTheInternetDatabase: `When using the internal Derby database, use this to clean up fragmented space that may remain
-after delete operations.
-NOTE! It is recommended to run this when Artifactory activity is low because compression may not run its full course when
-storage is busy (although this has no detrimental effect on the storage).`,
-                pruneUnreferencedData: `Running Artifactory with the wrong file system permissions on storage folders, or running out of storage space,
-can result in unreferenced binary files and empty folders present in the filestore or cache folders. This action
-removes unreferenced files and empty folders.`
-
-            },
-            storageSummary: {
-                itemsCount: `The total number of items (both files and folders) in your system.`,
-                optimization: `The ratio of Binaries Size to Artifacts Size.
-This reflects how much the usage of storage in your system has been reduced by Artifactory using checksum storage.`,
-                artifactsCount: `The total number of artifacts pointing to the physical binaries stored on your system.`,
-                storageDirectory: `If Storage Type is "filesystem" then this is the path to the physical file store.
-If Storage Type is "fullDb" then this is the path to the directory that caches binaries when they are extracted from the database.
-If Storage Type is "S3" then this is the path to the directory that caches binaries from S3.
-
-If Storage Type is "Advanced Configuration" then these are the paths of the corresponding binary providers, supplied by the advanced configuration.`,
-                centralConfigurationDescriptor: ``,
-                securityConfigurationDescriptor: ``
-            },
-            supportPage: {
-                hideUserDetails: `This option will remove passwords and user related information from configuration files before generating the support info package.`
-            }
-        },
-        configuration: {
-            general: {
-                serverName: `A name that uniquely identifies this artifactory server instance across the network.`,
-                customURLBase: `A hard-coded URL prefix used to calculate relative URLs.`,
-                fileUploadMaxSize: `The maximum size (in MB) allowed for artifacts uploaded through the web UI.
-Set to '0' for unlimited size.`,
-                bintrayMaxFilesUpload: `The maximum number of files that can be uploaded to Bintray in a single operation.`,
-                dateFormat: `The format used to display dates.
-For a detailed explanation see: <a href="http://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html" target="_blank">Joda DateTimeFormat</a>`,
-                globalOfflineMode: `If set, Artifactory does not try to access remote resources to fetch artifacts.
-Only cached and local artifacts are served`,
-                showAvailableAddonsInfo: `When set, Artifactory displays information about available Add-ons. This overrides any user-specific setting to hide information.`,
-                folderDownloadMaxFiles: `The maximum amount of artifacts that can be downloaded under one folder.`,
-                folderDownloadMaxSize: `The maximum size (in MB) of a folder that is allowed to be downloaded.`,
-                folderDownloadMaxParallel: `The maximum amount of folder download requests Artifactory will allow to run together.`,
-                retentionPeriodDays: `The maximum number of days to keep artifacts in the trashcan.`,
-                allowPermDeletes: `When deleting, users will be given an option to bypass the trash can and delete artifacts permanently.`,
-                blockReplications: `When set, replication will not be triggered regardless of configuration.`,
-                blockPushReplications: ` When set, push replication will not be triggered regardless of configuration.`,
-                blockPullReplications: `When set, pull replication will not be triggered regardless of configuration.`
-            },
-            licenseForm: {
-                licenseKey: `A unique short name identifying the license.`,
-                longName: `A descriptive name for the license.`,
-                URLs: `A URL (or URLs separated by semicolon) pointing to the license's homepage.`,
-                regExp: `A regular expression used to match licenses of this type against license details in artifact module information.
-For regular expression syntax reference please refer to the Pattern javadoc.`
-
-            },
-            blackDuck: {
-                connectionTimeout: `Network timeout to use when establishing a connection and for unanswered requests.
-Timing out on a network operation is considered a retrieval failure.
-Default is 20000 ms.`,
-                proxies: `Proxy configuration to use when accessing Black Duck Code Center.`
-
-            },
-            propertySetsForm: {},
-            proxyForm: {
-                systemDefault: `Make this proxy the default for new remote repositories and for internal HTTP requests.`,
-                redirectingProxyTargetHosts: `An optional list of host names (separated by newline or comma) to which the proxy may redirect requests.
-The credentials of the proxy are reused by requests redirected to any of these hosts.`
-
-            },
-            reverseProxy: {
-                serverName: `The server name that will be used to access Artifactory.
-Should be correlated with the base URL value.`,
-                publicAppContext: `The path which will be publicly used to access Artifactory. If Artifactory is accessible on the root of the server leave empty.`,
-                artifactoryServerName: `The internal server name for Artifactory which will be used by the web server to access the Artifacotry machine.
-If the web server is installed on the same machine as Artifactory you can use localhost, otherwise use the IP or hostname.`,
-                artifactoryAppContext: `The path which will be used to access the Artifactory application. If Artifactory is accessible on the root of the server leave empty.`,
-                sslCertificate: `The full path of the certificate file on the web server.`,
-                sslKey: `The full path of the key file on the web server.`
-            },
-            mail: {
-                enable: `The activity state of the configuration.`,
-                from: `The "from" address header to use in all outgoing messages (optional). `,
-                subjectPrefix: `A prefix to use for the subject of all outgoing messages.`,
-                artifactoryURL: `The Artifactory URL to to link to in all outgoing messages (optional).`
-            },
-            bintray: {
-                bintrayUsername: `The default Bintray user name that will be used by Artifactory in cases where an Artifactory
-user doesn't have Bintray credentials defined.`,
-                bintrayAPIKey: `The default Bintray API Key that will be used by Artifactory in cases where an Artifactory
-user doesn't have Bintray credentials defined.`
-            },
-            registerPro: {
-                licenseKey: `The license key is required for using Artifactory Add-ons.`
-            }
-        },
-        import_export: {
-            repositories: {
-                createM2CompatibleExport: `Include Maven 2 repository metadata and checksum files as part of the export`,
-                outputVerboseLog: `Lowers the log level to debug and redirects the output from the standard log to the import-export log.
-You can monitor the log in the <a href="./#/admin/advanced/system_logs">'System Logs'</a> page.`,
-                targetLocalRepository: `Specifies the repository in which to place imported content.
-When importing to a single repository, the file structure within the folder you import from should be similar to:
-SELECTED_DIR
-|
-|--LIB_DIR_1
-But when importing to all repositories, the file structure within the folder you import from should be similar to:
-SELECTED_DIR
-|
-|--REPOSITORY_NAME_DIR_1
-| |
-| |--LIB_DIR_1
-
-When importing to all repositories, make sure the names of the directories representing
-the repositories in the archive, match the names of the target repositories in Artifactory.`,
-                repositoryZipFile: `The archive file from which to import content.
-When importing to a single repository, the file structure within the archive should be similar to:
-ARCHIVE.ZIP
-|
-|--LIB_DIR_1
-When importing to all repositories, the file structure within the archive you import from should be similar to:
-ARCHIVE.ZIP
-|
-|--REPOSITORY_NAME_DIR_1
-| |
-| |--LIB_DIR_1
-When importing to all repositories, make sure the names of the directories representing
-the repositories in the archive, match the names of the target repositories in Artifactory.
-NOTE! Uploading the archive, does not import its content.
-To import, select the Target Local Repository, upload the archive and click Import.`
-            },
-            system: {
-                excludeBuilds: `Exclude all builds from the export.`,
-                createM2CompatibleExport: `Include Maven 2 repository metadata and checksum files as part of the export.`,
-                outputVerboseLog: `Lowers the log level to debug and redirects the output from the standard log to the import-export log.
-You can monitor the log in the <a href="./#/admin/advanced/system_logs">'System Logs'</a> page.`
-
-            },
-            stash: {
-                createM2CompatibleExport: `Include Maven 2 repository metadata and checksum files as part of the export.`,
-                outputVerboseLog: `Lowers the log level to debug and redirects the output from the standard log to the import-export log.
-You can monitor the log in the <a href="./#/admin/advanced/system_logs">'System Logs'</a> page.`,
-                createArchive: `Export the results as a zip archive.`
-            }
-        },
-        repositories: {
-            customURLBase: `A hard-coded URL prefix used to calculate relative URLs.`,
-            localForm: {
-                publicDescription: `Textual description of the repository. This description is displayed when the repository is selected in the Tree Browser.`,
-                internalDescription: `Additional notes that are only displayed in this form.`,
-                includesPattern: `List of artifact patterns to include when evaluating artifact requests in the form of x/y/**/z/*. When used, only artifacts matching one of the include patterns are served. By default, all artifacts are included (**/*).`,
-                excludedPattern: `List of artifact patterns to exclude when evaluating artifact requests, in the form of x/y/**/z/*. By default no artifacts are excluded.`,
-                repositoryLayout: `The layout that the repository should use to store and identify modules.`,
-                checksumPolicy: `Checksum policy determines how Artifactory behaves when a client checksum for a deployed resource is missing or conflicts with the locally calculated checksum (bad checksum).
-For more details, please refer to <a href="https://www.jfrog.com/confluence/display/RTF/Local+Repositories#LocalRepositories-ChecksumPolicy">Checksum Policy</a>.`,
-                mavenSnapshotVersionBehavior: `Specifies the naming convention for Maven SNAPSHOT versions.
-The options are -
-Unique: Version number is based on a time-stamp
-Non-unique: Version number uses a self-overriding naming pattern of artifactId-version-SNAPSHOT.type (default)
-Deployer: Respects the settings in the Maven client that is deploying the artifact.`,
-                maxUniqueSnapshots: `The maximum number of unique snapshots of a single artifact to store. Once the number of snapshots exceeds this setting, older versions are removed. A value of 0 (default) indicates there is no limit, and unique snapshots are not cleaned up.`,
-                blackedOut: `When set, the repository does not participate in artifact resolution and new artifacts cannot be deployed.`,
-                yumMetadataFolderDepth: `The depth, relative to the repository's root folder, where YUM metadata is created.
-This is useful when your repository contains multiple YUM repositories under parallel hierarchies.
-For example, if your RPMs are stored under 'fedora/linux/$releasever/$basearch', specify a depth of 4.`,
-                yumGroupFileNames: `A comma-separated list of xml file names containing YUM group component definitions.
-Artifactory includes the group definitions as part of the calculated YUM metadata, as well as automatically generating a gzipped version of the group files, if required.`,
-                allowContentBrowsing: `When set, you may view content such as HTML or Javadoc files directly from Artifactory.
-This may not be safe and therefore requires strict content moderation to prevent malicious users from uploading content that may compromise security (e.g., cross-site scripting attacks).`,
-                selectPropertySets: `Specifies the Property Sets to be used to construct the list of properties displayed when assigning properties to artifacts in this repository.
-This is a convenience; not a restrictive measure. You can still assign any property to artifacts from the Properties tab.`,
-                cronExpressionReplication: `The Cron expression that determines when the next replication will be triggered. For detailed information, see <a href="http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/crontrigger" target="_blank">The CronTrigger Tutorial</a>.`,
-                nextReplicationTime: `The next replication time based on the Cron expression.`,
-                enableEventReplication: `When set, additions and modifications are replicated as they occur.`,
-                trivialLayout: `When set, the repository will use the deprecated trivial layout.`,
-                forceDockerAuth:'Force basic authentication credentials in order to use this repository.',
-                forceNugetAuth:'Force basic authentication credentials in order to use this repository.',
-                pathPrefix: `Limit replication to artifacts matching this sub-path under the source repository.`
-            },
-            remoteForm: {
-                publicDescription: `Textual description of the repository.
-This description is displayed when the repository is selected in the Tree Browser.`,
-                internalDescription: `Additional notes that are only displayed in this form. `,
-                includesPattern: `List of artifact patterns to include when evaluating artifact requests in the form of x/y/**/z/*. When used, only artifacts matching one of the include patterns are served.
-By default, all artifacts are included (**/*).`,
-                nuGetDownloadContextPath: `The context path prefix through which NuGet downloads are served.
-For example, the NuGet Gallery download URL is 'https://nuget.org/api/v2/package', so the repository
-URL should be configured as 'https://nuget.org' and the download context path should be configured as 'api/v2/package'.`,
-                nuGetFeedContextPath: `The context path prefix through which the NuGet feeds are served.
-For example, the NuGet Gallery feed URL is 'https://nuget.org/api/v2', so the repository URL should be configured as 'https://nuget.org' and the feed context path should be configured as 'api/v2'.`,
-                eagerlyFetchJars: `When marked, the repository attempts to eagerly fetch the jar in the background each time a POM is requested.`,
-                eagerlyFetchSources: `When marked, the repository attempts to eagerly fetch the source jar in the background each time a jar is requested.`,
-                excludedPattern: `List of artifact patterns to exclude when evaluating artifact requests, in the form of x/y/**/z/*.
-By default no artifacts are excluded.`,
-                dockerEnableTokenAuthentication: `Enable token (Bearer) based authentication.`,
-                checksumPolicy: `Checksum policy determines how Artifactory behaves when a client checksum for a deployed resource is missing or conflicts with the locally calculated checksum (bad checksum).
-For more details, please refer to <a href="https://www.jfrog.com/confluence/display/RTF/Remote+Repositories#RemoteRepositories-ChecksumPolicy">Checksum Policy</a>.`,
-                maxUniqueSnapshots: `The maximum number of unique snapshots of a single artifact to store.
-Once the number of snapshots exceeds this setting, older versions are removed.
-A value of 0 (default) indicates there is no limit, and unique snapshots are not cleaned up.`,
-                listRemoteFolderItems: `Lists the items of remote folders in simple and list browsing. Required for dynamic resolution that depends on remote folder content information, such as remote Ivy version lookups. The remote content is cached according to the value of the
-'Retrieval Cache Period'.`,
-                blackedOut: `When set, the repository or its local cache do not participate in artifact resolution.`,
-                globalOfflineMode: `If set, Artifactory does not try to access remote resources to fetch artifacts. Only cached and local artifacts are served.`,
-                offline: `If set, Artifactory does not try to fetch remote artifacts. Only locally-cached artifacts are retrieved.`,
-                shareConfiguration: `If set, the configuration details of this remote repository can be publicly shared with remote clients such as other Artifactory servers.`,
-                repositoryLayout: `The layout that the repository should use to store and identify modules.`,
-                remoteLayoutMapping: `The layout that best matches that of the remote repository.
-Path-mapping takes place if the remote layout is different from the local layout.
-In this case, remote module artifacts and descriptors are stored according to the local repository layout (e.g., Maven 1->Maven 2, or Maven 2->Ivy).`,
-                localAddress: `The local address to be used when creating connections.
-Useful for specifying the interface to use on systems with multiple network interfaces.`,
-                username: `Username for HTTP authentication.`,
-                password: `Password for HTTP authentication.`,
-                socketTimeout: `Network timeout (in ms) to use when establishing a connection and for unanswered requests.
-Timing out on a network operation is considered a retrieval failure.`,
-                lenientHostAuthentication: `Allow credentials of this repository to be used on requests redirected to any other host.`,
-                enableCookieManagement: `Enables cookie management if the remote repository uses cookies to manage client state.`,
-                keepUnusedArtifacts: `The number of hours to wait before an artifact is deemed "unused" and eligible for cleanup from the repository.
-A value of 0 means automatic cleanup of cached artifacts is disabled.`,
-                assumedOfflineLimit: `The number of seconds the repository stays in assumed offline state after a connection error. At the end of this time, an online check is attempted in order to reset the offline status.
-A value of 0 means the repository is never assumed offline.`,
-                retrievalCachePeriod: `This value refers to the number of seconds to cache metadata files before checking for newer versions on remote server. A value of 0 indicates no caching.`,
-                missedRetrievalCachePeriod: `The number of seconds to cache artifact retrieval misses (artifact not found).     A value of 0 indicates no caching.`,
-                queryParams: `Custom HTTP query parameters that will be automatically included in all remote resource requests.
-For example: param1=val1&ampparam2=val2&ampparam3=val3`,
-                allowContentBrowsing: `When set, you may view content such as HTML or Javadoc files directly from Artifactory.
-This may not be safe and therefore requires strict content moderation to prevent malicious users from uploading content that may compromise security (e.g., cross-site scripting attacks).`,
-                storeArtifactsLocally: `When set, the repository should store cached artifacts locally. When not set, artifacts are not stored locally, and direct repository-to-client streaming is used. This can be useful for multi-server setups over a high-speed LAN, with one Artifactory caching certain data on central storage, and streaming it directly to satellite pass-though Artifactory servers.`,
-                synchronizeArtifactoryProperties: `When set, remote artifacts are fetched along with their properties.`,
-                selectPropertySets: `Specifies the Property Sets to be used to construct the list of properties displayed when assigning properties to artifacts in this repository.
-This is a convenience; not a restrictive measure. You can still assign any property to artifacts from the Properties tab.`,
-                cronExpression: `The Cron expression that determines artifact cleanup frequency. For detailed information, see <a href="http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/crontrigger" target="_blank">The CronTrigger Tutorial</a>.`,
-                cronExpressionReplication: `The Cron expression that determines when the next replication will be triggered. For detailed information, see <a href="http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/crontrigger" target="_blank">The CronTrigger Tutorial</a>.`,
-                syncDeletes: `Delete artifacts and folders that no longer exist in the source repository.`,
-                syncProperties: `Include metadata properties of files and folders as part of the replication.`,
-                pathPrefix: `Limit replication to artifacts matching this sub-path under the source repository.`,
-                bowerRegistryURL: `The remote Bower registry URL to communicate with.
-Usually the default value (https://bower.herokuapp.com) will be correct unless the remote resource is an Artifactory instance. In this case the value should match the remote repository URL.`,
-                nugetFeedContextPath: `The context path prefix through which the NuGet feeds are served.
-For example, the NuGet Gallery feed URL is 'https://nuget.org/api/v2', so the repository URL should be configured as 'https://nuget.org' and the feed context path should be configured as 'api/v2'.`,
-                nugetDownloadContextPath: `The context path prefix through which NuGet downloads are served.
-For example, the NuGet Gallery download URL is 'https://nuget.org/api/v2/package', so the repository
-URL should be configured as 'https://nuget.org' and the download context path should be configured as 'api/v2/package'.`,
-                smartSyncStatistics: `If set, download statistics for the artifact at the remote Artifactory instance will be updated each time a cached item is downloaded from your repository.`,
-                smartSyncProperties: `If set, properties for artifacts that have been cached in this repository will be updated if they are modified in the artifact hosted at the remote Artifactory instance.`,
-                smartListRemoteFolderItems: `If set, Artifactory lets you navigate the contents of the repository at the remote Artifactory instance, for all package types, even if the artifacts have not been cached in this repository.`,
-                originAbsenceDetection: `If set, Artifactory will check that cached artifacts' sources are available in the origin repository.`,
-                propagateQueryParams: `If set, the query params passed with the request to Artifactory, will be passed on to the remote repo.`,
-                rejectInvalidJars: `Reject the caching of jar files that are found to be invalid.
-For example, pseudo jars retrieved behind a "captive portal".`,
-                blockMismatchingMimeTypes: `If set, artifacts will fail to download if a mismatch is detected between requested and received mimetype, according to the list specified in the system properties file under blockedMismatchingMimeTypes. You can override by adding mimetypes to the override list below.`
-            },
-            virtualForm: {
-                publicDescription: `Textual description of the repository.
-This description is displayed when the repository is selected in the Tree Browser.`,
-                internalDescription: `Additional notes that are only displayed in this form. `,
-                cleanupRepositoryReferencesinPOM: `(1) Discard Active References - Removes repository elements that are declared directly under project or under a profile in the same POM that is activeByDefault.
-(2)Discard Any References - Removes all repository elements regardless of whether they are included in an active profile or not.
-(3)Nothing - Does not remove any repository elements declared in the POM.`,
-                 pathSuffix: `An optional sub-path inside the local repository where P2 metadata files reside.
-When left empty, P2 metadata files (content, artifacts, compositeContent, etc.) are assumed to reside directly under the repository's root.
-If you have a Tycho repository deployed as a single archive, specify the archive's root path. For example: 'eclipse-repository.zip!'. `,
-                includesPattern: `List of artifact patterns to include when evaluating artifact requests in the form of x/y/**/z/*. When used, only artifacts matching one of the include patterns are served.
-By default, all artifacts are included (**/*).`,
-                excludedPattern: `List of artifact patterns to exclude when evaluating artifact requests, in the form of x/y/**/z/*.
-By default no artifacts are excluded.`,
-                resolvedRepositories: `The resolved list of repositories.
-Repositories starting with an exclamation mark ('!') indicate that not all tokens can be mapped between the layout of this virtual repository and the marked repository.
-Path translations may not work as expected.`,
-                artifactoryRequestCanRetrieveRemoteArtifacts: `Determines whether artifact requests coming from other instance of Artifactory can be fulfilled by accessing this virtual repository's remote repositories, or by only accessing its caches (default).`,
-                externalDependenciesPatterns: `Optional include patterns to match external dependencies. Ant-style path expressions are supported (*, **, ?).
-For example, specifying **/github.com/** will only allow external dependencies from github.com host.`,
-                cleanupRepositoryReferencesInPOMs: `(1) Discard Active References - Removes repository elements that are declared directly under a project or a profile in the same POM that is activeByDefault.
-(2) Discard Any References - Removes all repository elements regardless of whether they are included in an active profile or not.
-(3) Nothing - Does not remove any repository elements declared in the POM.`,
-                keyPair: `A named key-pair that is used to sign artifacts automatically.`
-
-
-            },
-            distributionForm: {
-                includesPattern: 'Properties on distributed artifacts with key that matches the list below will be added as a version attributes in Bintray.',
-                repositoryVisibility: 'Creating private Bintray repositories is available for <a href="https://www.jfrog.com/bintray/bintray-private-repo/" target="_blank">premium Bintray</a> accounts.',
-                distributeProduct: 'When set, the ${productName} token will be replaced in the distribution rules with the product name configured below. Also, Artifactory will create a <a href="https://bintray.com/docs/usermanual/uploads/uploads_products.html" target="_blank">Bintray product</a> and link the deployed packages to the product.'
-            },
-            layoutsForm: {
-                artifactPathPattern: `Please refer to: <a href="http://www.jfrog.com/confluence/display/RTF/Repository+Layouts#RepositoryLayouts-ModulesandPathPatternsusedbyRepositoryLayouts" target="_blank">Path Patterns</a> in the Artifactory Wiki documentation.`,
-                distinctiveDescriptorPathPattern: `Please refer to: <a href="http://www.jfrog.com/confluence/display/RTF/Repository+Layouts#RepositoryLayouts-DescriptorPathPatterns" target="_blank">Descriptor Path Patterns</a> in the Artifactory Wiki documentation.`,
-                folderIntegrationRevisionRegExp: `A regular expression matching the integration revision string appearing in a folder name
-as part of the artifact's path. For example, 'SNAPSHOT', in Maven.
-Note! Take care not to introduce any regexp capturing groups within this expression.
-If not applicable use '.*'.`,
-                fileIntegrationRevisionRegExp: `A regular expression matching the integration revision string appearing in a file name
-as part of the artifact's path. For example, 'SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))',
-in Maven.
-Note! Take care not to introduce any regexp capturing groups within this expression.
-If not applicable use '.*'.`
-
-            },
-            reverseProxy: {
-                registryPort: `This port will be binded to the Docker registry.`
-            }
-        },
-        security: {
-            general: {
-                hideExistenceOfUnauthorizedResources: `When set, Artifactory hides the existence of unauthorized resources by sending a 404
-response (not found) to requests for resources that are not accessible by the user. Otherwise,
-the response implies that the resource exists, but is protected,  by requesting authentication
-for anonymous requests (401), or by denying an authenticated request for unauthorized users.`,
-                passwordEncryptionPolicy: `Determines the password requirements from users identified to Artifactory from a remote client such as Maven.
-The options are:
-(1) Supported (default): Users can authenticate using secure encrypted passwords or clear-text passwords.
-(2) Required: Users must authenticate using secure encrypted passwords. Clear-text authentication fails.
-(3) Unsupported: Only clear-text passwords can be used for authentication.`,
-                encrypt: `Artifactory will generate a Master Encryption Key and encrypt all passwords in your configuration.`,
-                decrypt: `Artifactory will decrypt all passwords in your configuration.`,
-                passwordMaxAge: `The time interval in which users will be obligated to change their password`,
-                notifyByMail: `Users will receive an email notification X days before password will expire.
-Mail server must be enabled and configured correctly.`
-            },
-            usersForm: {
-                disableInternalPassword: `When set, user's password is cleared which means that only external authentication is allowed (for example via an LDAP server).`
-            },
-            permissionsForm: {
-                includePatterns: `Simple comma separated wildcard patterns for repository artifact paths (with no leading slash).
-Ant-style path expressions are supported (*, **, ?).
-For example: "org/apache/**"`,
-                excludePatterns: `Simple comma separated wildcard patterns for repository artifact paths (with no leading slash).
-Ant-style path expressions are supported (*, **, ?).
-For example: "org/apache/**"`
-            },
-            LDAPSettingsForm: {
-                LDAPURL: `Location of the LDAP server in the following format:
-ldap://myserver:myport/dc=sampledomain,dc=com`,
-                userDNPattern: `A DN pattern that can be used to log users directly in to LDAP.
-This pattern is used to create a DN string for 'direct' user authentication where the pattern is relative to the base DN in the LDAP URL.
-The pattern argument {0} is replaced with the username. This only works if anonymous binding is allowed and a direct user DN can
-be used, which is not the default case for Active Directory (use User DN search filter instead).
-Example: uid={0},ou=People`,
-                autoCreateArtifactoryUsers: `When set, users are automatically created when using LDAP. Otherwise, users are transient
-and associated with auto-join groups defined in Artifactory.`,
-                emailAttribute: `An attribute that can be used to map a user's email address to a user created
-automatically in Artifactory.`,
-                searchFilter: `A filter expression used to search for the user DN used in LDAP authentication.
-This is an LDAP search filter (as defined in 'RFC 2254') with optional arguments.
-In this case, the username is the only argument, and is denoted by '{0}'.
-Possible examples are:
-(uid={0}) - This searches for a username match on the attribute.
-Authentication to LDAP is performed from the DN found if successful.`,
-                searchBase: `(Optional) A context name to search in relative to the base DN of the LDAP URL. For example, 'ou=users'
-With the LDAP Group Add-on enabled, it is possible to enter multiple search base entries
-separated by a pipe ('|') character.`,
-                manageDN: `The full DN of the user that binds to the LDAP server to perform user searches.
-Only used with "search" authentication.
-`,
-                managerPassword: `The password of the user that binds to the LDAP server to perform the search.
-Only used with "search" authentication.`,
-                subTreeSearch: `When set, enables deep search through the sub tree of the LDAP URL + search base.`
-            },
-            LDAPGroupsForm: {
-                settingsName: `LDAP group key.`,
-                LDAPSetting: `Select the LDAP setting you want to use for group retrieval`,
-                static: `Groups have a multi-value member attribute containing user DNs or User IDs.`,
-                dynamic: `Users have a mutli-value member attribute containing DNs or names of imported groups.
-Default group association strategy for Active Directory.`,
-                hierarchy: `User DN contains one or more hierarchical name attributes of imported groups.
-For example: cn=joe,ou=sales,ou=europe,dc=acme,dc=com implies Joe's membership in the 'sales' and 'europe' groups.`,
-                groupMemberAttribute: `A multi-value attribute on the group entry containing user DNs or IDs of the group members (e.g., uniqueMember,member).`,
-                groupNameAttribute: `Attribute on the group entry denoting the group name. Used when importing groups.`,
-                descriptionAttribute: `An attribute on the group entry which denoting the group description. Used when importing groups.`,
-                filter: `The LDAP filter used to search for group entries. Used when importing groups.`,
-                searchBase: `A search base for group entry DNs, relative to the existing DN on the LDAP server's URL.
-Used when importing groups.`
-            },
-            crowd_integration: {
-                sessionValidationInterval: `The time window (min) during which the session does not need to be validated.`,
-                useJIRAUserServer: `Authenticate using credentials instead of the default session, token-based authentication.
-This is required when using the JIRA User Server.`,
-                autoCreateArtifactoryUsers: `When set, authenticated users are automatically created in Artifactory.
-When not set, for every request from a Crowd user, the user is temporarily associated with default groups (if such groups are defined),
-and the permissions for these groups apply. Without automatic user creation, you must manually create the user in Artifactory to manage
-user permissions not attached to their default groups.`,
-                useDefaultProxyConfiguration: `If a default proxy definition exists, it is used to pass through to the Crowd Server.`
-
-            },
-            SAMLSSOSettings: {
-                SAMLLoginURL: `The identity provider login URL (when you try to login, the service provider redirects to this URL).`,
-                SAMLLogoutURL: `The identity provider logout URL (when you try to logout, the service provider redirects to this URL).`,
-                SAMLServiceProviderName: `The Artifactory name in the SAML federation.`,
-                SAMLCertificate: `The certificate for SAML Authentication.
-NOTE! The certificate must contain the public key to allow Artifactory to verify sign-in requests.`,
-                autoCreateArtifactoryUsers: `When set, authenticated users are automatically created in Artifactory.
-When not set, for every request from a SAML user, the user is temporarily associated with default groups (if such groups are defined),
-and the permissions for these groups apply. Without automatic user creation, you must manually create the user inside Artifactory to manage
-user permissions not attached to their default groups.`,
-                allowUserToAccessProfile: `Auto created users will have access to their profile page and will be able to perform actions such as generate API key.`,
-                autoRedirect: `When set, clicking on the login link will direct users to the configured SAML login URL.`
-            },
-            OAuthSSO: {
-                id: `Your OAuth2 id, given by the provider.`,
-                secret: `Your OAuth2 shared secret, given by the provider.`,
-                domain: `Google App domain accepted for authentication.`,
-                basicUrl: `The url used to acquire a token via basic auth.`,
-                authUrl: `The url used for the initial authentication step.`,
-                apiUrl: `The url used for api access, if needed to get user data.`,
-                tokenUrl: `The url used to acquire a token from the provider.`,
-                allowUserToAccessProfile: `Auto created users will have access to their profile page and will be able to perform actions such as generate API key.`
-            },
-            HTTPSSO: {
-                artifactoryIsProxiedByASecureHTTPServer: `When set, Artifactory trusts incoming requests and reuses the remote user originally set on the request by the SSO of the HTTP server.
-This is useful if you want to use existing enterprise SSO integrations, such as the powerful authentication schemes provided by Apache (mod_auth_ldap, mod_auth_ntlm, mod_auth_kerb, etc.).
-When Artifactory is deployed as a webapp on Tomcat behind Apache:
-If using mod_proxy_ajp, be sure to set tomcatAuthentication="false" on the AJP connector.
-If using mod_jk, be sure to use the "JkEnvVar REMOTE_USER" directive in Apache's configuration.`,
-                remoteUserRequestVariable: `The name of the HTTP request variable to use for extracting the user identity.
-Default is: REMOTE_USER.`,
-                autoCreateArtifactoryUsers: `When set, authenticated users are automatically created in Artifactory.
-When not set, for every request from an SSO user, the user is temporarily associated with default groups (if such groups are defined),
-and the permissions for these groups apply. Without automatic user creation, you must manually create the user inside Artifactory to manage
-user permissions not attached to their default groups.`,
-                allowUserToAccessProfile: `Auto created users will have access to their profile page and will be able to perform actions such as generate API key.`
-            },
-            SSHSERVER: {
-                enableSshServer: `Enable SSH authentication.`,
-                serverPublicKey: `SSH Public Key to identify your server.`,
-                serverPrivateKey: `SSH Private Key to identify your server.`,
-                sshServerPort: `The port to use for SSH authentication. Default: 1337`,
-                customURLBase: `A hard-coded URL prefix used to calculate relative URLs.`
-            },
-            signingKeys: {
-                passPhrase: `Pass phrase required to use the installed keys. It can be saved or supplied with the REST API calls.
-The "Verify" button checks that the keys and pass phrase match, and can be used to verify the pass phrase without saving it.
-If keys are saved, we highly recommend using the Master Encryption Key feature.`
-            }
-
-        },
-        services: {
-            backupsForm: {
-                cronExpression: `The Cron expression that determines backup frequency. For detailed information, see <a href="http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/crontrigger" target="_blank">The CronTrigger Tutorial</a>`,
-                serverPathForBackup: `The directory to which local repository data is backed up as files.
-The default is $ARTIFACTORY_HOME/backup/[backup_key]`,
-                sendMailToAdminsIfThereAreBackupErrors: `Requires properly configured email settings and valid email addresses for admin users.`,
-                excludeBuilds: `Exclude all builds from the backup.`,
-                excludeNewRepositories: `Automatically exclude new repositories from the backup.`,
-                retentionPeriod: `The maximum number of hours to keep old backups in the destination directory.
-Setting the "Incremental" checkbox, indicates that backups are incrementally written
-(delta only) to the same directory: \${backupDir}/current. This "in place" backup is suitable
-for file-system based backup support. In this mode, cleanup of old backups is inactive.
-The default is 168 hours (7 days).`,
-                backUpToAZipArchive: `When set, the backup output should be a zip archive.
-Otherwise the output is to a directory (default).`
-
-            },
-            mavenIndexer: {
-                 cronExpression: `The Cron expression that determines indexer frequency. For detailed information, see <a href="http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/crontrigger" target="_blank">The CronTrigger Tutorial</a>`
-                 }
-        }
-    },
-    artifacts: {
-        deploy: {
-            targetRepo: `The target repository to which the artifact should be deployed.`,
-            targetPath: `The relative path in the target repository. You can add key-value matrix parameters to deploy the artifacts with properties.
-For more details, please refer to <a href="http://www.jfrog.com/confluence/display/RTF/Using+Properties+in+Deployment+and+Resolution#UsingPropertiesinDeploymentandResolution-IntroducingMatrixParameters" target="_blank"> Introducing Matrix Parameters</a>.`,
-            deployAsMaven: `Deploy a Maven artifact where the target deployment path is based on Maven attributes.
-If you want to specify the target deployment path manually, unset this option.`,
-            deployAsDebian: `Deploying a Debian file to a Debian repository requires coordinates. Setting this flag lets you configure the Debian file coordinates`,
-            disabled: `You do not have deploy permission`
-        },
-        pushToBintray: {
-            bintrayPackageName: `A target package name under the repository. You must create the package in Bintray first if it does not exist.`,
-            bintrayPackageVersion: `A target version under the package.If the version does not yet exist in Bintray, it is automatically created.`
-        },
-        browse: {
-            created: `The time this artifact was deployed to or cached in Artifactory.`,
-            lastModified: `The time this artifact was modified. If this value is not available, the artifact's 'Created' value is used.
-This can occur if the artifact is deployed without the 'X-Artifactory-Last-Modified' request header.`,
-            licenses: `Scans the archive for a textual license file. The following file names are searched for:
-license,LICENSE,license.txt,LICENSE.txt,LICENSE.TXT
-(You can override this list by using the 'artifactory.archive.licenseFile.names' property).`,
-            filtered: `Set this to have Artifactory serve the file as a filtered resource.
-A filtered textual resource is processed by the <a href="http://freemarker.org/" target="_blank">FreeMarker</a> engine before being returned to clients.
-The context accessible to the template includes:
-Properties ,Security and Request. Javadocs can be found in the <a href="http://repo.jfrog.org/artifactory/libs-releases-local/org/artifactory/artifactory-papi/%5BRELEASE%5D/artifactory-papi-%5BRELEASE%5D-javadoc.jar!/index.html" target="_blank">Artifactory Public API</a>.`,
-            lastReplicationStatus: `Displays the result of the latest run of this repository's scheduled replication.
-Can be one of the following:
-Never ran: Replication has not yet run.
-Incomplete: Replication has not yet completed or was interrupted.
-Completed with errors: Replication errors were logged.
-Completed with warnings: Replication warnings were logged.
-Completed successfully: No errors or warnings logged.
-Inconsistent: Replication status cannot be interpreted.`,
-            recursive: `Add the property to all children of the current node.`
-        },
-        search: {
-            stash: `The Stash lets you store search results for later use.
-Once it is populated, you can add, subtract or intersect new search results to assemble just the right set of artifacts you need.
-The Stash Browser displays all the artifacts in your stash and provides a convenient way to perform bulk operations.
-You can copy or move the entire Stash to a repository, or perform actions on individual items.`
-        },
-
-        general: {
-            /*name: 'Copy this link to navigate directly to this item in the tree browser.',*/
-            created: `The time this artifact was deployed to or cached in Artifactory`,
-            filtered: `Set this to have Artifactory serve the file as a filtered resource.
-A filtered textual resource is processed by the <a href="http://freemarker.org/" target="_blank">FreeMarker</a> engine before being returned to clients.
-The context accessible to the template includes:
-Properties ,Security and Request. Javadocs can be found in the <a href="http://repo.jfrog.org/artifactory/libs-releases-local/org/artifactory/artifactory-papi/%5BRELEASE%5D/artifactory-papi-%5BRELEASE%5D-javadoc.jar!/index.html" target="_blank">Artifactory Public API</a>.`
-        },
-        selectTargetPathModal: {
-            targetRepoInput: [`Selects the target repository for the transferred items.`,
-`Repositories starting with an exclamation mark (\'!\') indicate that not all tokens`,
-`can be mapped between the layouts of the source repository and the marked repository.`,
-`Path translations may not work as expected.`].join(' '),
-            copyToCustomCheckbox: {
-                copy: [`Enable copying and renaming to a custom target path. WARNING: This will cause`,
-`the operation to suppress cross-layout translation when copying to different layouts.`,
-`This means that your client may not be able to resolve the artifacts even in cases of a same-layout move.`].join(' '),
-                move: [`Enable moving and renaming to a custom target path. WARNING: This will cause`,
-`the operation to suppress cross-layout translation when moving to different layouts.`,
-`This means that your client may not be able to resolve the artifacts even in cases of a same-layout move.`].join(' ')
-            },
-            customPathInput: {
-                copy: [`Type the path in the target repository where the selected source should be copied to.`,
-`NOTE: Copy operations are executed using Unix conventions (e.g.copying org/jfrog/example from`,
-`a source repository to org/jfrog/example in a target repository will result in the contents of the source`,
-`being copied to org/jfrog/example/example). To achieve the same path in the target repository, copy`,
-`the source into one folder up in the hierarchy (i.e. copy source org/jfrog/example into target org/jfrog).`,
-`If you leave the Target Path empty, the source will be moved into the target repository\'s root folder.`].join(' '),
-                move: [`Type the path in the target repository where the selected source should be moved to.`,
-`NOTE: Move operations are executed using Unix conventions (e.g. moving org/jfrog/example from`,
-`a source repository to org/jfrog/example in a target repository will result in the contents of the source`,
-`being moved to org/jfrog/example/example). To achieve the same path in the target repository, move`,
-`the source into one folder up in the hierarchy (i.e. move source org/jfrog/example into target org/jfrog).`,
-`If you leave the Target Path empty, the source will be moved into the target repository\'s root folder.`].join(' ')
-            }
-
-        }
-    },
-    builds: {
-        summary: `An artifact license can have one of the following statuses:
-Unapproved: The license found is not approved.
-Unknown: License information was found but cannot be related to any license managed in Artifactory.
-Not Found: No license information could be found for the artifact.
-Neutral: The license found is not approved, however another approved license was found for the artifact.
-Approved: The license found is approved.`,
-        includePublishedArtifacts: `Include the build's published module artifacts in the license report if they are also used as dependencies for other modules in this build.`,
-        IncludeDependenciesOfTheFollowingScopes: `Include the build's published module dependencies in the license report.
-You can optionally select the dependency scopes to include.`,
-        autoFindLicenses: `Automatically extract license data from artifacts' module information.
-When an artifact has conflicting licenses already attached, you can select whether
-to override these licenses with the ones found.`,
-        name: `The Code Center application name. Click on the link to navigate to this application in Code Center.`
-    },
-    userProfile: {
-        apiKey: `Your API key can be used to authenticate you when using the REST API.
-To use the API key, add the following header to all REST API calls: 'X-JFrog-Art-Api: &ltYOUR_API_KEY&gt'`
-    }
-
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/constants/artifactory_help.constants.js b/web/angular-web/src/main/webapp/app/constants/artifactory_help.constants.js
deleted file mode 100644
index becfa58..0000000
--- a/web/angular-web/src/main/webapp/app/constants/artifactory_help.constants.js
+++ /dev/null
@@ -1,560 +0,0 @@
-export default {
-    "/**": [
-        {
-            title: "User Guide",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+User+Guide",
-            priority: 0
-        },
-        {
-            title: "REST API",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API",
-            priority: 0
-        }
-    ],
-
-    "/home": [
-        {
-            title: "General Information",
-            link: "https://www.jfrog.com/confluence/display/RTF/General+Information",
-            priority: 1
-        }
-    ],
-    "/profile": [
-        {
-            title: "Updating Your Profile",
-            link: "https://www.jfrog.com/confluence/display/RTF/Updating+Your+Profile",
-            priority: 1
-        }
-    ],
-    "/forgot-password": [
-        {
-            title: "Forgot Password",
-            link: "https://www.jfrog.com/confluence/display/RTF/Updating+Your+Profile#UpdatingYourProfile-ResettingYourPassword",
-            priority: 1
-        }
-    ],
-
-    "/artifacts/browse/tree/**": [
-        {
-            title: "Browsing Artifacts",
-            link: "https://www.jfrog.com/confluence/display/RTF/Browsing+Artifactory#BrowsingArtifactory-TreeBrowsing",
-            priority: 1
-        },
-    ],
-    "/artifacts/browse/simple/**": [
-        {
-            title: "Browsing Artifacts",
-            link: "https://www.jfrog.com/confluence/display/RTF/Browsing+Artifactory#BrowsingArtifactory-SimpleBrowsing",
-            priority: 1
-        },
-    ],
-    "/artifacts/browse/**": [
-        {
-            title: "Deploying Artifacts",
-            link: "https://www.jfrog.com/confluence/display/RTF/Deploying+Artifacts",
-            priority: 2
-        },
-        {
-            title: "Set Me Up",
-            link: "https://www.jfrog.com/confluence/display/RTF/Using+Artifactory#UsingArtifactory-SetMeUp",
-            priority: 5
-        },
-        {
-            title: "Deploy Artifact with REST API",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-DeployArtifact",
-            priority: 200
-        }
-    ],
-
-
-    "/artifacts/browse/tree/search/**": [
-        {
-            title: "Searching Artifacts",
-            link: "https://www.jfrog.com/confluence/display/RTF/Searching+Artifacts",
-            priority: 3
-        },
-        {
-            title: "Stash Search Results",
-            link: "https://www.jfrog.com/confluence/display/RTF/Searching+for+Artifacts#SearchingforArtifacts-SavingSearchResultsintheStash",
-            priority: 4
-        },
-        {
-            title: "Artifactory Query Language",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-ArtifactoryQueryLanguage%28AQL%29",
-            priority: 200
-        }
-    ],
-
-    // Every search type needs a duplicated entry, one under the tree search and one for simple
-
-    "/artifacts/browse/tree/search/quick/**": [
-        {
-            title: "Execute Quick Search with REST API",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-ArtifactSearch%28QuickSearch%29",
-            priority: 200
-        }
-    ],
-    "/artifacts/browse/simple/search/quick/**": [
-        {
-            title: "Execute Quick Search with REST API",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-ArtifactSearch%28QuickSearch%29",
-            priority: 200
-        }
-    ],
-    "/artifacts/browse/tree/search/class/**": [
-        {
-            title: "Execute Archive Search with REST API",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-ArchiveEntrySearch%28ClassSearch%29",
-            priority: 200
-        }
-    ],
-    "/artifacts/browse/simple/search/class/**": [
-        {
-            title: "Execute Archive Search with REST API",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-ArchiveEntrySearch%28ClassSearch%29",
-            priority: 200
-        }
-    ],
-    "/artifacts/browse/tree/search/gavc/**": [
-        {
-            title: "Execute GAVC Search with REST API",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-GAVCSearch",
-            priority: 200
-        }
-    ],
-    "/artifacts/browse/simple/search/gavc/**": [
-        {
-            title: "Execute GAVC Search with REST API",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-GAVCSearch",
-            priority: 200
-        }
-    ],
-    "/artifacts/browse/tree/search/property/**": [
-        {
-            title: "Execute Property Search with REST API",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-PropertySearch",
-            priority: 200
-        }
-    ],
-    "/artifacts/browse/simple/search/property/**": [
-        {
-            title: "Execute Property Search with REST API",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-PropertySearch",
-            priority: 200
-        }
-    ],
-    "/artifacts/browse/tree/search/checksum/**": [
-        {
-            title: "Execute Checksum Search with REST API",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-ChecksumSearch",
-            priority: 200
-        }
-    ],
-    "/artifacts/browse/simple/search/checksum/**": [
-        {
-            title: "Execute Checksum Search with REST API",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-ChecksumSearch",
-            priority: 200
-        }
-    ],
-    //"/artifacts/browse/tree/search/remote/**": [
-    //    {
-    //        title: "",
-    //        link: "",
-    //        priority: 200
-    //    }
-    //],
-    //"/artifacts/browse/simple/search/remote/**": [
-    //    {
-    //        title: "",
-    //        link: "",
-    //        priority: 200
-    //    }
-    //],
-
-    "/builds/**": [
-        {
-            title: "Build Integration",
-            link: "https://www.jfrog.com/confluence/display/RTF/Build+Integration",
-            priority: 1
-        },
-        {
-            title: "Upload Build with REST API",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-BuildUpload",
-            priority: 200
-        }
-    ],
-
-
-    "/admin/repositories/**": [
-        {
-            title: "Configuring Repositories",
-            link: "https://www.jfrog.com/confluence/display/RTF/Configuring+Repositories",
-            priority: 100
-        },
-        {
-            title: "Single Package Type Repositories",
-            link: "https://www.jfrog.com/confluence/display/RTF/Upgrading+Artifactory#UpgradingArtifactory-SinglePackageTypeRepositories",
-            priority: 101
-        },
-        {
-            title: "Create Repository with REST API",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-CreateorReplaceRepositoryConfiguration",
-            priority: 200
-        }
-    ],
-
-    "/admin/repository/**": [
-        {
-            title: "Single Package Type Repositories",
-            link: "https://www.jfrog.com/confluence/display/RTF/Upgrading+Artifactory#UpgradingArtifactory-SinglePackageTypeRepositories",
-            priority: 101
-        },
-        {
-            title: "Create Repository with REST API",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-CreateorReplaceRepositoryConfiguration",
-            priority: 200
-        }
-    ],
-
-    "/admin/repositories/local": [
-        {
-            title: "Local Repositories",
-            link: "https://www.jfrog.com/confluence/display/RTF/Local+Repositories",
-            priority: 1
-        }
-    ],
-    "/admin/repository/local/**": [
-        {
-            title: "Local Repositories",
-            link: "https://www.jfrog.com/confluence/display/RTF/Local+Repositories",
-            priority: 1
-        },
-        {
-            title: "Repository Replication",
-            link: "https://www.jfrog.com/confluence/display/RTF/Repository+Replication",
-            priority: 2
-        }
-    ],
-
-    "/admin/repositories/remote": [
-        {
-            title: "Remote Repositories",
-            link: "https://www.jfrog.com/confluence/display/RTF/Remote+Repositories",
-            priority: 1
-        }
-    ],
-    "/admin/repository/remote/**": [
-        {
-            title: "Remote Repositories",
-            link: "https://www.jfrog.com/confluence/display/RTF/Remote+Repositories",
-            priority: 1
-        },
-        {
-            title: "Pull Replication",
-            link: "https://www.jfrog.com/confluence/display/RTF/Repository+Replication#RepositoryReplication-PullReplication",
-            priority: 2
-        }
-    ],
-
-    "/admin/repositories/virtual": [
-        {
-            title: "Virtual Repositories",
-            link: "https://www.jfrog.com/confluence/display/RTF/Virtual+Repositories",
-            priority: 1
-        },
-        {
-            title: "Deploying to a Virtual Repository",
-            link: "https://www.jfrog.com/confluence/display/RTF/Deploying+Artifacts#DeployingArtifacts-DeployingtoaVirtualRepository",
-            priority: 2
-        }
-    ],
-    "/admin/repository/virtual/**": [
-        {
-            title: "Virtual Repositories",
-            link: "https://www.jfrog.com/confluence/display/RTF/Virtual+Repositories",
-            priority: 1
-        },
-        {
-            title: "Deploying to a Virtual Repository",
-            link: "https://www.jfrog.com/confluence/display/RTF/Deploying+Artifacts#DeployingArtifacts-DeployingtoaVirtualRepository",
-            priority: 2
-        }
-    ],
-
-
-    "/admin/repo_layouts**": [
-        {
-            title: "Repository Layouts",
-            link: "https://www.jfrog.com/confluence/display/RTF/Repository+Layouts",
-            priority: 1
-        }
-    ],
-
-    "/admin/configuration/licenses": [
-        {
-            title: "License Control",
-            link: "https://www.jfrog.com/confluence/display/RTF/License+Control",
-            priority: 1
-        }
-    ],
-    "/admin/configuration/black_duck": [
-        {
-            title: "Black Duck Integration",
-            link: "https://www.jfrog.com/confluence/display/RTF/Black+Duck+Code+Center+Integration",
-            priority: 1
-        }
-    ],
-    "/admin/configuration/property_sets**": [
-        {
-            title: "Property Sets",
-            link: "https://www.jfrog.com/confluence/display/RTF/Properties",
-            priority: 1
-        }
-    ],
-    "/admin/configuration/proxies**": [
-        {
-            title: "Managing Proxies",
-            link: "https://www.jfrog.com/confluence/display/RTF/Managing+Proxies",
-            priority: 1
-        }
-    ],
-    "/admin/configuration/mail": [
-        {
-            title: "Mail Configuration",
-            link: "https://www.jfrog.com/confluence/display/RTF/Mail+Server+Configuration",
-            priority: 1
-        }
-    ],
-    "/admin/configuration/ha": [
-        {
-            title: "High Availability",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+High+Availability",
-            priority: 1
-        }
-    ],
-    "/admin/configuration/register_pro": [
-        {
-            title: "Activating License",
-            link: "https://www.jfrog.com/confluence/display/RTF/Activating+Artifactory+Pro",
-            priority: 1
-        }
-    ],
-
-    "/admin/security/users**": [
-        {
-            title: "User Management",
-            link: "https://www.jfrog.com/confluence/display/RTF/Managing+Users",
-            priority: 1
-        },
-        {
-            title: "Create User with REST API",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-CreateorReplaceUser",
-            priority: 200
-        }
-    ],
-    "/admin/security/groups**": [
-        {
-            title: "Group Management",
-            link: "https://www.jfrog.com/confluence/display/RTF/Managing+Users#ManagingUsers-CreatingandEditingGroups",
-            priority: 1
-        },
-        {
-            title: "Create Group with REST API",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-CreateorReplaceGroup",
-            priority: 200
-        }
-    ],
-    "/admin/security/permissions**": [
-        {
-            title: "Permission Management",
-            link: "https://www.jfrog.com/confluence/display/RTF/Managing+Permissions",
-            priority: 1
-        },
-        {
-            title: "Create Permission with REST API",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-CreateorReplacePermissionTarget",
-            priority: 200
-        }
-    ],
-
-
-    // Remove after fixing the url of the new permission form
-
-    "/admin/security/permission/**": [
-        {
-            title: "Permission Management",
-            link: "https://www.jfrog.com/confluence/display/RTF/Managing+Permissions",
-            priority: 1
-        },
-        {
-            title: "Create Permission with REST API",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-CreateorReplacePermissionTarget",
-            priority: 200
-        }
-    ],
-
-
-
-    "/admin/security/ldap_settings": [
-        {
-            title: "LDAP Settings",
-            link: "https://www.jfrog.com/confluence/display/RTF/Managing+Security+with+LDAP",
-            priority: 1
-        },
-        {
-            title: "LDAP Groups",
-            link: "https://www.jfrog.com/confluence/display/RTF/LDAP+Groups",
-            priority: 2
-        }
-    ],
-    "/admin/security/ldap_settings/**": [
-        {
-            title: "LDAP Settings",
-            link: "https://www.jfrog.com/confluence/display/RTF/Managing+Security+with+LDAP",
-            priority: 1
-        }
-    ],
-    "/admin/security/ldap_groups/**": [
-        {
-            title: "LDAP Groups",
-            link: "https://www.jfrog.com/confluence/display/RTF/LDAP+Groups",
-            priority: 1
-        }
-    ],
-    "/admin/security/crowd_integration": [
-        {
-            title: "Crowd Integration",
-            link: "https://www.jfrog.com/confluence/display/RTF/Atlassian+Crowd+Integration",
-            priority: 1
-        }
-    ],
-    "/admin/security/saml_integration": [
-        {
-            title: "SAML Integration",
-            link: "https://www.jfrog.com/confluence/display/RTF/SAML+SSO+Integration",
-            priority: 1
-        }
-    ],
-    "/admin/security/http_sso": [
-        {
-            title: "HTTP SSO",
-            link: "https://www.jfrog.com/confluence/display/RTF/Single+Sign-on",
-            priority: 1
-        }
-    ],
-    "/admin/security/ssh_server": [
-        {
-            title: "SSH Server",
-            link: "https://www.jfrog.com/confluence/display/RTF/SSH+Server",
-            priority: 1
-        }
-    ],
-    "/admin/security/signing_keys": [
-        {
-            title: "Signing Keys",
-            link: "https://www.jfrog.com/confluence/display/RTF/Master+Key+Encryption",
-            priority: 1
-        },
-        {
-            title: "Signing Debian Packages",
-            link: "https://www.jfrog.com/confluence/display/RTF/Debian+Repositories#DebianRepositories-SigningDebianPackages",
-            priority: 2
-        }
-    ],
-
-    "/admin/services/backups**": [
-        {
-            title: "Backup Management",
-            link: "https://www.jfrog.com/confluence/display/RTF/Managing+Backups",
-            priority: 1
-        }
-    ],
-    "/admin/services/indexer": [
-        {
-            title: "Maven Indexer",
-            link: "https://www.jfrog.com/confluence/display/RTF/Exposing+Maven+Indexes",
-            priority: 1
-        }
-    ],
-
-    "/admin/import_export**": [
-        {
-            title: "Importing & Exporting",
-            link: "https://www.jfrog.com/confluence/display/RTF/Importing+and+Exporting",
-            priority: 1
-        }
-    ],
-    "/admin/import_export/repositories": [
-        {
-            title: "Repository Import with REST API",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-ImportRepositoryContent",
-            priority: 200
-        }
-    ],
-    "/admin/import_export/system": [
-        {
-            title: "System Import with REST API",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-FullSystemImport",
-            priority: 200
-        },
-        {
-            title: "System Export with REST API",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-ExportSystem",
-            priority: 200
-        }
-    ],
-
-    "/admin/advanced/system_info": [
-        {
-            title: "System Info",
-            link: "https://www.jfrog.com/confluence/display/RTF/System+Information",
-            priority: 1
-        },
-        {
-            title: "Get Sysmtem Info with REST API",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-SystemInfo",
-            priority: 200
-        }
-    ],
-    "/admin/advanced/system_logs": [
-        {
-            title: "Artifactory Logs",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+Log+Files",
-            priority: 1
-        }
-    ],
-    "/admin/advanced/maintenance": [
-        {
-            title: "Maintenance",
-            link: "https://www.jfrog.com/confluence/display/RTF/Regular+Maintenance+Operations",
-            priority: 1
-        }
-    ],
-    "/admin/advanced/storage_summary": [
-        {
-            title: "Monitoring Storage",
-            link: "https://www.jfrog.com/confluence/display/RTF/Monitoring+Storage",
-            priority: 1
-        }
-    ],
-    "/admin/advanced/config_descriptor": [
-        {
-            title: "Configuration Files",
-            link: "https://www.jfrog.com/confluence/display/RTF/Configuration+Files",
-            priority: 1
-        },
-        {
-            title: "Get Config Descriptor with REST API",
-            link: "https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-GeneralConfiguration",
-            priority: 200
-        }
-    ],
-    "/admin/advanced/security_descriptor": [
-        {
-            title: "Security Configuration",
-            link: "https://www.jfrog.com/confluence/display/RTF/Configuring+Security",
-            priority: 1
-        }
-    ]
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/constants/artifacts_actions.constants.js b/web/angular-web/src/main/webapp/app/constants/artifacts_actions.constants.js
deleted file mode 100644
index 62503db..0000000
--- a/web/angular-web/src/main/webapp/app/constants/artifacts_actions.constants.js
+++ /dev/null
@@ -1,31 +0,0 @@
-export default {
-    'Watch': {title: 'Watch', icon: 'icon-watch'},
-    'Unwatch': {title: 'Unwatch', icon: 'icon-unwatch'},
-    'Download': {title: 'Download', icon: 'icon-download'},
-    'DownloadFolder': {title: 'Download', icon: 'icon-download'},
-    'View': {title: 'View', icon: 'icon-view'},
-    'Delete': {title: 'Delete', icon: 'icon-clear'},
-    'DeletePermanently': {title: 'Delete Permanently', icon: 'icon-clear'},
-    'Copy': {title: 'Copy', icon: 'icon-copy'},
-    'Move': {title: 'Move', icon: 'icon-move'},
-    'CopyStash': {title: 'Copy Stash to Repository', icon: 'icon-copy'},
-    'MoveStash': {title: 'Move Stash to Repository', icon: 'icon-move'},
-    'ShowInTree': {title: 'Show In Tree', icon: 'icon-show-in-tree'},
-    'DiscardFromStash': {title: 'Discard from Stash', icon: 'icon-delete-content'},
-    'DiscardStash': {title: 'Discard Search Results', icon: 'icon-delete-content'},
-    'DeleteContent': {title: 'Delete Content', icon: 'icon-clear'},
-    'CopyContent': {title: 'Copy Content', icon: 'icon-copy'},
-    'MoveContent': {title: 'Move Content', icon: 'icon-move'},
-    'DeleteVersions': {title: 'Delete Versions', icon: 'icon-delete-versions'},
-    'Refresh': {title: 'Refresh', icon: 'icon-refresh'},
-    'UploadToBintray': {title: 'Push to Bintray', icon: 'icon-bintray'},
-    'Distribute': {title: 'Distribute', icon: 'icon-distribution-repo'},
-    'Redistribute': {title: 'Redistribute', icon: 'icon-distribution-repo'},
-    'Zap': {title: 'Zap Cache', icon: 'icon-zap'},
-    'ZapCaches': {title: 'Zap Caches', icon: 'icon-zap'},
-    'RecalculateIndex': {title: 'Recalculate Index', icon: 'icon-re-index'},
-    'NativeBrowser': {title: 'Native Browser', icon: 'icon-simple-browser'},
-    'EmptyTrash': {title: 'Empty Trash', icon: 'icon-trash'},
-    'SearchTrash': {title: 'Search Trash', icon: 'icon-search'},
-    'Restore': {title: 'Restore', icon: 'icon-trashcan-restore'}
-};
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/constants/artifacts_events.constants.js b/web/angular-web/src/main/webapp/app/constants/artifacts_events.constants.js
deleted file mode 100644
index 9bdf4a8..0000000
--- a/web/angular-web/src/main/webapp/app/constants/artifacts_events.constants.js
+++ /dev/null
@@ -1,56 +0,0 @@
-let events = {
-    ACTIVATE_TREE_SEARCH:   'tree:search:activate',
-    TREE_SEARCH_CHANGE:     'tree:search:change',
-    TREE_NODE_SELECT:       'tree:node:select',
-    TREE_NODE_OPEN:         'tree:node:open',
-    TREE_SEARCH_KEYDOWN:    'tree:search:keydown',
-    TREE_SEARCH_CANCEL:     'tree:search:cancel',
-    TREE_SEARCH_RUNNING:    'tree:search:running',
-    TREE_COMPACT:           'tree:compact',
-    TREE_REFRESH:           'tree:refresh',
-    TREE_COLLAPSE_ALL:      'tree:collapse:all',
-    SEARCH_COLLAPSE:        'search:collapse',
-    SEARCH:                 'search',
-    CLEAR_SEARCH:           'search:clear',
-
-    ACTION_WATCH:           'action:watch',    // node
-    ACTION_UNWATCH:         'action:unwatch',  // node
-    ACTION_COPY:            'action:copy',     // node, target
-    ACTION_MOVE:            'action:move',     // node, target
-    ACTION_COPY_STASH:            'action:copystash',     // repoKey
-    ACTION_MOVE_STASH:            'action:movestash',     // repoKey
-    ACTION_DISCARD_STASH:         'action:discardstash',     //
-    ACTION_DISCARD_FROM_STASH:         'action:discardfromstash',     //node
-    ACTION_REFRESH_STASH:         'action:refreshstash',     //
-    ACTION_EXIT_STASH:         'action:exitstash',     //
-    ACTION_DELETE:          'action:delete',   // node
-    ACTION_REFRESH:         'action:refresh',   // node
-    ACTION_DEPLOY:         'action:deploy',   // repoKey
-
-    BUILDS_BREADCRUMBS:     'builds:breadcrumbs',
-
-    FOOTER_DATA_UPDATED: 'footer:data:updated',
-
-    SHOW_SPINNER: 'spinner:show',
-    HIDE_SPINNER: 'spinner:hide',
-    CANCEL_SPINNER: 'spinner:cancel',
-
-    USER_CHANGED:           'user:changed',
-    USER_LOGOUT:            'user:logout', //confirmDiscard (true/false)
-
-    TABS_REFRESH:           'tabs:refresh',
-    TAB_NODE_CHANGED:       'tabs:node:changed',
-
-    ARTIFACT_URL_CHANGED:   'artifact:url:changed',
-    SEARCH_URL_CHANGED:     'search:url:changed',
-
-    CLOSE_MODAL:            'modal:close',
-
-    FOOTER_REFRESH:         'footer:refresh'
-};
-
-export default events;
-
-let eventNames = {};
-Object.keys(events).forEach(key => eventNames[events[key]] = key);
-export const EVENTS_NAMES = eventNames;
diff --git a/web/angular-web/src/main/webapp/app/constants/common_events.constants.js b/web/angular-web/src/main/webapp/app/constants/common_events.constants.js
deleted file mode 100644
index 0420bd4..0000000
--- a/web/angular-web/src/main/webapp/app/constants/common_events.constants.js
+++ /dev/null
@@ -1,10 +0,0 @@
-let events = {
-    FORM_SUBMITTED:     'form:submitted',
-    FORM_CLEAR_FIELD_VALIDATION: 'form:clear:field'
-}
-
-export default events;
-
-let eventNames = {};
-Object.keys(events).forEach(key => eventNames[events[key]] = key);
-export const COMMON_EVENTS_NAMES = eventNames;
diff --git a/web/angular-web/src/main/webapp/app/constants/field_options.constats.js b/web/angular-web/src/main/webapp/app/constants/field_options.constats.js
deleted file mode 100644
index cd1ed00..0000000
--- a/web/angular-web/src/main/webapp/app/constants/field_options.constats.js
+++ /dev/null
@@ -1,202 +0,0 @@
-export default {
-    localChecksumPolicy:{
-        CLIENT:'Verify against client checksums',
-        SERVER:'Trust server generated checksums'
-    },
-    remoteChecksumPolicy:{
-        GEN_IF_ABSENT:'Generate if absent',
-        FAIL:'Fail',
-        IGNORE_AND_GEN:'Ignore and generate',
-        PASS_THRU:'Ignore and pass-through'
-    },
-    snapshotRepositoryBehavior:{
-        UNIQUE:'Unique',
-        NONUNIQUE:'Non-unique',
-        DEPLOYER:'Deployer'
-    },
-    pomCleanupPolicy:{
-        discard_active_reference:'Discard active references',
-        discard_any_reference:'Discard any reference',
-        nothing:'Nothing'
-    },
-    dockerApiVersion:{
-        V1:'V1',
-        V2:'V2'
-    },
-    vcsGitProvider:{
-        GITHUB:'GitHub',
-        BITBUCKET:'BitBucket',
-        STASH:'Stash',
-        ARTIFACTORY:'Artifactory',
-        CUSTOM:'Custom'
-    },
-    defaultLayouts:{
-        maven:'maven-2-default',
-        ivy:'ivy-default',
-        gradle:'gradle-default',
-        nuget:'nuget-default',
-        npm:'npm-default',
-        bower:'bower-default',
-        vcs:'vcs-default',
-        sbt:'sbt-default'
-    },
-    REPO_TYPE:{
-        LOCAL:'local',
-        REMOTE:'remote',
-        VIRTUAL:'virtual',
-        DISTRIBUTION:'distribution'
-    },
-    repoPackageTypes:[
-        {
-            "serverEnumName": "Bower",
-            "value": "bower",
-            "text": "Bower",
-            "icon": 'bower',
-            "repoType": ['local', 'remote', 'virtual'],
-            "description": 'Bower package manager is optimized for front-end development. A Bower repository will allow you to easily manage your Bower packages and proxy remote Bower repositories.'
-        },
-        {
-            "serverEnumName": "CocoaPods",
-            "value": "cocoapods",
-            "text": "CocoaPods",
-            "icon": 'cocoapods',
-            "repoType": ['local', 'remote'],
-            "description": 'CocoaPods is an application level dependency manager for the Objective-C programming language and any other languages that run on the Objective-C runtime, that provides a standard format for managing external libraries.'
-        },
-        {
-            "serverEnumName": "Debian",
-            "value": "debian",
-            "text": "Debian",
-            "icon": 'deb',
-            "repoType": ['local', 'remote'],
-            "description": 'A Debian repository will allow you to host, cache and distribute your packages for Debian based operating systems such as Ubuntu.'
-        },
-        {
-            "serverEnumName": "Docker",
-            "value": "docker",
-            "text": "Docker",
-            "icon": 'docker',
-            "repoType": ['local', 'remote', 'virtual'],
-            "description": 'Docker allows you to package an application with all of its dependencies into a standardized unit for software development. A Docker repository will allow you to easily and securely manage your Docker images.'
-        },
-        {
-            "serverEnumName": "Gems",
-            "value": "gems",
-            "text": "Gems",
-            "icon": 'ruby-gems',
-            "repoType": ['local', 'remote', 'virtual'],
-            "description": 'A RubyGems repository allows you to easily download, install, and use ruby software packages in your system. Gems can be used to extend or modify functionality in Ruby applications.'
-        },
-        {
-            "serverEnumName": "GitLfs",
-            "value": "gitlfs",
-            "text": "Git LFS",
-            "icon": 'git-lfs',
-            "repoType": ['local', 'remote', 'virtual'],
-            "description": 'Git LFS replaces large files such as audio samples, videos, datasets, and graphics with text pointers inside Git, while storing the file contents in an Artifactory repository. This allows you to work with the same Git workflow, but with better access control, faster download and more repository space.'
-        },
-        {
-            "serverEnumName": "Gradle",
-            "value": "gradle",
-            "text": "Gradle",
-            "icon": 'gradle',
-            "repoType": ['local', 'remote', 'virtual'],
-            "description": 'Gradle is a build automation tool which lets model your problem domain declaratively using a powerful and expressive domain-specific language (DSL) implemented in Groovy.'
-        },
-        {
-            "serverEnumName": "Ivy",
-            "value": "ivy",
-            "text": "Ivy",
-            "icon": 'ivy',
-            "repoType": ['local', 'remote', 'virtual'],
-            "description": 'Apache Ivy is a popular dependency manager focusing on flexibility and simplicity. Ivy offers full integration with ant, and a strong transitive dependency management engine.'
-        },
-        {
-            "serverEnumName": "Maven",
-            "value": "maven",
-            "text": "Maven",
-            "icon": 'pom',
-            "repoType": ['local', 'remote', 'virtual'],
-            "description": 'Apache Maven is a build automation tool which provides useful project information from your project’s sources.'
-        },
-        {
-            "serverEnumName": "Npm",
-            "value": "npm",
-            "text": "npm",
-            "icon": 'npm',
-            "repoType": ['local', 'remote', 'virtual'],
-            "description": 'npm package manager makes it easy for JavaScript developers to share, reuse code, and update code. Host your own node.js packages in Artifactory and proxy remote npm repositories. Use npm against a single in-house repository under your control for your all npm needs.'
-        },
-        {
-            "serverEnumName": "NuGet",
-            "value": "nuget",
-            "text": "NuGet",
-            "icon": 'nuget',
-            "repoType": ['local', 'remote', 'virtual'],
-            "description": 'NuGet is the package manager for Microsoft development platforms including .NET. Host and proxy NuGet packages in Artifactory, and pull libraries from Artifactory into your various Visual Studio .NET applications.'
-        },
-        {
-            "serverEnumName": "Opkg",
-            "value": "opkg",
-            "text": "Opkg",
-            "icon": 'opkg',
-            "repoType": ['local', 'remote'],
-            "description": 'Opkg is a lightweight package management system based upon ipkg. It is intended for use on embedded Linux devices, and is commonly used for IoT.'
-        },
-        {
-            "serverEnumName": "P2",
-            "value": "p2",
-            "text": "P2",
-            "icon": 'p2',
-            "repoType": ['remote', 'virtual'],
-            "description": 'P2 provides a provisioning platform for Eclipse and Equinox-based applications.'
-        },
-        {
-            "serverEnumName": "Pypi",
-            "value": "pypi",
-            "text": "PyPI",
-            "icon": 'pypi',
-            "repoType": ['local', 'remote', 'virtual'],
-            "description": 'The Python Package Index for the Python programming language. Transparently resolve PyPI distribution locations, whether local or remote. Exercise fine-grained access control to all PyPI resources with comprehensive security measures and full support for pip.'
-        },
-        {
-            "serverEnumName": "SBT",
-            "value": "sbt",
-            "text": "SBT",
-            "icon": 'sbt',
-            "repoType": ['local', 'remote', 'virtual'],
-            "description": 'Sbt is a build tool for the Scala community and Java projects. Sbt uses advanced concepts to provide flexible and powerful build definitions.'
-        },
-        {
-            "serverEnumName": "Vagrant",
-            "value": "vagrant",
-            "text": "Vagrant",
-            "icon": 'vagrant',
-            "repoType": ['local'],
-            "description": 'Vagrant provides easy-to-configure, reproducible, and portable work environments built on top of industry-standard technology and controlled by a single consistent workflow.'
-        },
-        {
-            "serverEnumName": "VCS",
-            "value": "vcs",
-            "text": "VCS",
-            "icon": 'vcs',
-            "repoType": ['remote'],
-            "description": 'A VCS remote repository gives you stable and reliable access to your source code with security and access control, along with smart search capabilities for any of the supported version control systems.'
-        },
-        {
-            "serverEnumName": "YUM",
-            "value": "yum",
-            "text": "YUM",
-            "icon": 'yum',
-            "repoType": ['local', 'remote'],
-            "description": 'YUM allows automatic updates with package and dependency management on RPM-based distributions. A YUM repository will allow you to host, cache and distribute your RPM packages.'
-        },
-        {
-            "serverEnumName": "Generic",
-            "value": "generic",
-            "text": "Generic",
-            "icon": 'generic',
-            "repoType": ['local', 'remote', 'virtual'],
-            "description": 'A generic repository can be used to host and proxy any type of file.'}
-    ]
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/constants/keys.constants.js b/web/angular-web/src/main/webapp/app/constants/keys.constants.js
deleted file mode 100644
index d0952e2..0000000
--- a/web/angular-web/src/main/webapp/app/constants/keys.constants.js
+++ /dev/null
@@ -1,15 +0,0 @@
-export default {
-    ENTER:          13,
-    ESC:            27,
-    SPACE:          32,
-    UP_ARROW:       38,
-    DOWN_ARROW:     40,
-    HOTKEYS: {
-        ALPHANUMERIC: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890-_'
-    },
-    PROPERTY_TYPE:{
-        MULTI_SELECT:null,
-        SINGLE_SELECT:1,
-        ANY_VALUE: 0
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/constants/roles.constants.js b/web/angular-web/src/main/webapp/app/constants/roles.constants.js
deleted file mode 100644
index 92d8c95..0000000
--- a/web/angular-web/src/main/webapp/app/constants/roles.constants.js
+++ /dev/null
@@ -1,5 +0,0 @@
-export default {
-    GUEST: 1,
-    REGULAR: 2,
-    ADMIN: 3
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/constants/setmeup_snippets.constants.js b/web/angular-web/src/main/webapp/app/constants/setmeup_snippets.constants.js
deleted file mode 100644
index 7d81faf..0000000
--- a/web/angular-web/src/main/webapp/app/constants/setmeup_snippets.constants.js
+++ /dev/null
@@ -1,352 +0,0 @@
-let snippets = {
-    debian: {
-        read: [{
-            before: "To use Artifactory repository to install Debian package you need to add it to your <i>source.list</i> file. You can do that using the following command:",
-            snippet: "sudo sh -c \"echo 'deb $2/$1 <DISTRIBUTION> <COMPONENT>' >> /etc/apt/sources.list\""
-        }, {
-            before: "For accessing Artifactory using credentials you can specify it in the <i>source.list</i> file like so:",
-            snippet: "http://<USERNAME>:<PASSWORD>@$4/artifactory/$1 <DISTRIBUTION> <COMPONENTS>"
-        }, {
-            before: "Your apt-get client will use the specified Artifactory repositories to install the package",
-            snippet: "apt-get install <PACKAGE>"
-        }],
-        deploy: [{
-            before: "To deploy a Debian package into Artifactory you can either use the deploy option in the Artifact’s module or upload with cURL using matrix parameters. The required parameters are package name, distribution, component, and architecture in the following way:",
-            snippet: "curl <CURL_AUTH> -XPUT \"$2/$1/pool/<DEBIAN_PACKAGE_NAME>;deb.distribution=<DISTRIBUTION>;deb.component=<COMPONENT>;deb.architecture=<ARCHITECTURE>\" -T <PATH_TO_FILE>"
-        }, {
-            before: "You can specify multiple layouts by adding semicolon separated multiple parameters, like so:",
-            snippet: "curl <CURL_AUTH> -XPUT \"$2/$1/pool/<DEBIAN_PACKAGE_NAME>;deb.distribution=<DISTRIBUTION>;deb.distribution=<DISTRIBUTION>;deb.component=<COMPONENT>;deb.component=<COMPONENT>;deb.architecture=<ARCHITECTURE>;deb.architecture=<ARCHITECTURE>\" -T <PATH_TO_FILE>",
-            after: "To add an architecture independent layout use deb.architecture=all. This will cause your package to appear in the Packages index of all the architectures under the same Distribution and Component, as well as under a new index branch called binary-all which holds all Debian packages that are marked as \"all\"."
-        }]
-    },
-    opkg: {
-        read: [{
-            before: "To use the Artifactory repository to install Ipk packages you need to add an indexed path (a feed) to your <i>opkg.conf</i> file. You can do that using the following command:",
-            snippet: "echo 'src <FEED_NAME> http://$4/artifactory/$1/<PATH_TO_FEED>' >> /etc/opkg/opkg.conf",
-            after: "If you want your client to download the .gz variant of the Packages index file instead, change the src part to src/gz"
-        }, {
-            before: "For accessing Artifactory using credentials you can specify it in the <i>opkg.conf</i> file like so:",
-            snippet: "echo 'option http_auth <USERNAME>:<PASSWORD>' >> /etc/opkg/opkg.conf"
-        }, {
-            before: "Your Opkg client will use the specified Artifactory repositories to install the package",
-            snippet: "opkg install <PACKAGE>"
-        }],
-        deploy: [{
-            before: "To deploy an ipk package into Artifactory, run the following:",
-            snippet: "curl <CURL_AUTH> -XPUT \"http://$4/artifactory/$1/<PATH_TO_FEED>/<IPK_PACKAGE_NAME>\" -T <PATH_TO_FILE>"
-        }]
-    },
-    pypi: {
-        read: [{
-            before: "To resolve packages using pip, add the following to ~/.pip/pip.conf:",
-            snippet: "[global]\nindex-url = $2/api/pypi/$1/simple"
-        }, {
-            before: "If credentials are required they should be embedded in the URL. To resolve packages using pip, run:",
-            snippet: "pip install <PACKAGE>"
-        }],
-        deploy: [{
-            before: "To deploy packages using setuptools you need to add an Artifactory repository to the <i>.pypirc</i> file (usually located in your home directory):",
-            snippet: "[distutils]\n" + "index-servers = local\n" + "[local]\n" + "repository: $2/api/pypi/$1\n" + "username: <USERNAME>\n" + "password: <PASSWORD>"
-        }, {
-            before: "To deploy a python egg to Artifactory, after changing the <i>.pypirc</i> file, run the following command:",
-            snippet: "python setup.py sdist upload -r local"
-        }, {
-            before: "To deploy a python wheel to Artifactory, after changing the <i>.pypirc</i> file, run the following command:",
-            snippet: "python setup.py bdist_wheel upload -r local",
-            after: "where <i>local</i> is the index server you defined in <i>.pypirc</i>."
-        }]
-    },
-    bower: {
-        general: [{
-            before: "In order to use Bower with Artifactory you will need to add 'bower-art-resolver' as one of the resolvers in your .bowerrc file. To install <a href=\"https://www.google.com/url?q=https%3A%2F%2Fwww.npmjs.com%2Fpackage%2Fbower-art-resolver&sa=D&sntz=1&usg=AFQjCNH5pnW2E2ETaXtmJL33xBhGkxKPag\" target=\"_blank\">bower-art-resolver</a> (custom Bower resolver dedicated to integrate with Artifactory), run the following command:",
-            snippet: "npm install -g bower-art-resolver"
-        }, {
-            before: "And add the bower-art-resolver as one of the resolvers in your <i>.bowerrc</i> file:",
-            snippet: "{\n\t\"resolvers\" : [\n\t\t\"bower-art-resolver\"\n\t]\n}"
-        },{
-            before: "Now replace the default Bower registry with the following in your <i>.bowerrc</i> file:",
-            snippet: "{\n\t\"registry\" : \"$2/api/bower/$1\",\n\t\"resolvers\" : [\n\t\t\"bower-art-resolver\"\n\t]\n}"
-        }, {
-            before: "If authentication is required use:",
-            snippet: "{\n\t\"registry\" : \"http://<USERNAME>:<PASSWORD>@$4/artifactory/api/bower/$1\",\n\t\"resolvers\" : [\n\t\t\"bower-art-resolver\"\n\t]\n}"
-        },{
-            before: "The instructions above apply to <b>Bower version 1.5</b> or higher. For older versions see instructions <a href=\"http://www.jfrog.com/confluence/display/RTF/Bower+Repositories#BowerRepositories-UsingOlderVersionsofBower\" target=\"_blank\">here</a>."
-        }],
-        read: {
-            before: "To install bower packages execute the following command:",
-            snippet: "bower install <PACKAGE>"
-        },
-        deploy: {
-            before: "To deploy a Bower package into an Artifactory repository you need to use Artifactory's REST API or the Web UI.<br/>For example, to deploy a Bower package into this repository using the REST API, use the following command:",
-            snippet: "curl <CURL_AUTH> -XPUT $2/$1/<TARGET_FILE_PATH> -T <PATH_TO_FILE>"
-        }
-    },
-    cocoapods: {
-        general: [{
-            before: "In order to use CocoaPods with Artifactory you will need to install the <a href=\"https://github.com/JFrogDev/cocoapods-art\" target=\"_blank\">'cocoapods-art'</a>. plugin. To install cocoapods-art run the following command:",
-            snippet: "gem install cocoapods-art",
-        },{
-            before: "repo-art uses authentication as specified in your standard <a href=\"https://www.gnu.org/software/inetutils/manual/html_node/The-_002enetrc-file.html\" target=\"_blank\">netrc file</a>.",
-            snippet: "machine $4\nlogin <USERNAME>\npassword <PASSWORD>"
-        },{
-            before: "To add an Artifactory Specs repo:",
-            snippet: "pod repo-art add $1 \"$2/api/pods/$1\""
-        }],
-        read: [{
-            before: "To resolve pods from an Artifactory specs repo that you added, you must add the following to your Podfile:",
-            snippet: "plugin 'cocoapods-art', :sources => [\n  '$1'\n]"
-        },{
-            before: "Then you can use install as usual:",
-            snippet: "pod install"
-        }],
-        deploy: [{
-            before: "To deploy a pod into an Artifactory repository you need to use Artifactory's REST API or the Web UI.<br/>For example, to deploy a pod into this repository using the REST API, use the following command:",
-            snippet: "curl <CURL_AUTH> -XPUT $2/$1/<TARGET_FILE_PATH> -T <PATH_TO_FILE>"
-        }/*,  {
-            before: "Artifactory can also function as a standalone Specs repo, which does not need to be backed by a Git repository.<br/>To push an index entry to the Specs repo on this repository use the following command:",
-            snippet: "pod repo-art push $1 <NAME.podspec>",
-            after: "Running the command without specifying a podspec will push all podspecs in the current working directory."
-        }*/]
-    },
-    docker: {
-        general: [{
-            title_reverse_proxy: "Using Docker with Artifactory requires a reverse proxy such as Nginx or Apache. For more details please visit our <a href=\"http://www.jfrog.com/confluence/display/RTF/Docker+Repositories#DockerRepositories-RequirementforaReverseProxy(Nginx/Apache)\" target=\"_blank\">Docker Repositories</a> documentation.",
-            title_insecure: "<br/>Not using an SSL certificate requires Docker clients to add an --insecure-registry flag to the <b>DOCKER_OPTS</b>",
-            snippet_insecure: 'export DOCKER_OPTS+=" --insecure-registry <INSECURE_SNIP>"',
-            after_example_server: "<br/>In this example we use <b>artprod.company.com</b> to represent the Docker repository in Artifactory.",
-        },{
-            before: "To login use the <i>docker login</i> command.",
-            snippet: "docker login <DOCKER_SERVER>",
-            after: "And provide your Artifactory username and password or API key.<br/>If anonymous access is enabled you do not need to login."
-        },{
-            before: "To manually set your credentials, or if you are using Docker v1, copy the following snippet to your ~/.docker/config.json file.",
-            snippet: "{\n\t\"auths\": {\n\t\t\"!https://<DOCKER_SERVER>\" : {\n\t\t\t\"auth\": \"<USERNAME>:<PASSWORD> (converted to base 64)\",\n\t\t\t\"email\": \"youremail at email.com\"\n\t\t}\n\t}\n}",
-            after: "To enter multiple registries see the <a href=\"https://www.jfrog.com/confluence/display/RTF/Using+Docker+V1#UsingDockerV1-3.SettingUpAuthentication\" target=\"_blank\">following example</a>."
-        }],
-        read: [{
-            before: "To pull an image use the <i>docker pull</i> command specifying the docker image and tag.",
-            snippet: "docker pull <DOCKER_SERVER>/<DOCKER_REPOSITORY>:<DOCKER_TAG>"
-        }],
-        deploy: [{
-            before: "To push an image tag an image using the <i>docker tag</i> and then <i>docker push</i> command.",
-            snippet: "docker tag ubuntu <DOCKER_SERVER>/<DOCKER_REPOSITORY>:<DOCKER_TAG>"
-        }, {
-            before: "",
-            snippet: "docker push <DOCKER_SERVER>/<DOCKER_REPOSITORY>:<DOCKER_TAG>"
-        }]
-    },
-    gitlfs: {
-        read: [{
-            before: "In order for your client to upload and download LFS blobs from artifactory, the [lfs] clause should be added to the <i>.lfsconfig</i> file of your Git repository in the following format:",
-            snippet: "[lfs]\n" + "url = \"$2/api/lfs/$1\""
-        }, {
-            before: "You can also set LFS endpoints for different remotes on your repo (as supported by the Git LFS client). For example:",
-            snippet: "[remote \"origin\"]\n" + "url = <URL>\n" + "fetch = +refs/heads/*:refs/remotes/origin/*\n" + "lfsurl = \"$2/api/lfs/$1\""
-        }]
-    },
-    nuget: {
-        general: [{
-            before: "When using Artifactory as a NuGet repository you can either work with the NuGet client directly or with Visual Studio"
-        },{
-            before: "<b>NuGet Client Configuration</b><br/>To configure NuGet client to work with Artifactory you will need to add Artifactroy to the list of sources. To add this repository use the following command",
-            snippet: "nuget sources Add -Name Artifactory -Source $2/api/nuget/$1"
-        },{
-            before: "To enable the use of NuGet API key, run the following command",
-            snippet: "nuget setapikey <USERNAME>:<PASSWORD> -Source Artifactory"
-        },{
-            before: "<b>Visual Studio Configuration</b><br/>To configure the NuGet Visual Studio Extension to use Artifactory, you need to add Artifactory as another Package Source under NuGet Package Manager.<ol><li>Access the corresponding repositories in the \"Options\" window (Options | Tools) and select to add another Package Source.<br />Name: ENTER_RESOURCE_NAME (e.g. Artifactory NuGet repository)</li><li>Paste the snippet below in the URL field</li></ol>",
-            snippet: "$2/api/nuget/$1",
-            after: "<ol start=\"3\"><li>Make sure it is checked.</li></ol>"
-        }],
-        read:[{
-            before: "<b>NuGet Client Resolve</b><br/>To resove using the NuGet client, run the following command",
-            snippet: "nuget install <PACKAGE_NAME>"
-        },{
-            before: "To make sure your client will resolve from Artifactory verify it is the first in the list of sources, or run the following command",
-            snippet: "nuget install <PACKAGE_NAME> -Source Artifactory"
-        }],
-        deploy: [{
-            before: "Uploading packages to Artifactory can be done by running the following command:",
-            snippet: "nuget push <PACKAGE_NAME> -Source Artifactory"
-        },{
-            before: "To support more manageable layouts and additional features such as cleanup, NuGet repositories support custom layouts. When pushing a package, you need to ensure that its layout matches the target repository’s layout:",
-            snippet: "nuget push <PACKAGE> -Source $2/api/nuget/$1/<PATH_TO_FOLDER>"
-        }]
-    },
-    ivy: {
-        general: {
-            title: "Click on \"Generate Ivy Settings\" in order to use Virtual or Remote repositories for resolution."
-        }
-    },
-    maven: {
-        general: {
-            title: "Click on \"Generate Maven Settings\" in order to resolve artifacts through Virtual or Remote repositories."
-        },
-        deploy: {
-            before: "To deploy build artifacts through Artifactory you need to add a deployment element with the URL of a target local repository to which you want to deploy your artifacts. For example:"
-        }
-    },
-    npm: {
-        general: [{
-            title: "In order for your npm command line client to work with Artifactory you will firstly need to set the relevant authentication. For getting authentication details run the following command:",
-            snippet: "curl -u<USERNAME>:<PASSWORD> $2/api/npm/auth"
-        }, {
-            before: "The response should be pasted in the <i>~/.npmrc</i> (in Windows %USERPROFILE%/<i>.npmrc</i>) file. Here is an example of the content of the file:",
-            snippet: "_auth = <USERNAME>:<PASSWORD> (converted to base 64)\n" + "email = youremail at email.com\n" + "always-auth = true"
-        }, {
-            before: "Artifactory also support scoped packages. For getting authentication details run the following command:",
-            snippet: "curl -u<USERNAME>:<PASSWORD> \"$2/api/npm/$1/auth/<SCOPE>\""
-        }, {
-            before: "The response should be pasted in the <i>~/.npmrc</i> (in Windows %USERPROFILE%/<i>.npmrc</i>) file. Here is an example of the content of the file:",
-            snippet: "@<SCOPE>:registry=$2/api/npm/$1/\n" + "//$4/api/npm/$1/:_password=<BASE64_PASSWORD>\n" + "//$4/api/npm/$1/:username=<USERNAME>\n" + "//$4/api/npm/$1/:email=youremail at email.com\n" + "//$4api/npm/$1/:always-auth=true\n"
-        }, {
-            before: "Run the following command to replace the default npm registry with an Artifactory repository:",
-            snippet: "npm config set registry $2/api/npm/$1"
-        }, {
-            before: "For scoped package run the following command:",
-            snippet: "npm config set @<SCOPE>:registry $2/api/npm/$1"
-        }],
-        read: [{
-            before: "After adding Artifactory as the default repository you can install a package using the npm install command:",
-            snippet: "npm install <PACKAGE_NAME>"
-        }, {
-            before: "To install a package by specifying Artifactory repository use the following npm command:",
-            snippet: "npm install <PACKAGE_NAME> --registry $2/api/npm/$1"
-        }],
-        deploy: [{
-            before: "To deploy your package to an Artifactory repository you can either add the following to the <i>package.json</i> file:",
-            snippet: "\"publishConfig\":{\"registry\":\"$2/api/npm/$1\"}"
-        }, {
-            before: "And then you can simply run the default npm publish command:",
-            snippet: "npm publish"
-        }, {
-            before: "Or provide the local repository to the npm publish command:",
-            snippet: "npm publish --registry $2/api/npm/$1" }]
-    },
-    gems: {
-        general: [{
-            title: "For your gem client to upload and download Gems from this repository you need to add it to your <i>~/.gemrc</i> file using the following command:",
-            snippet: "gem source -a http://<USERNAME>:<PASSWORD>@$4/artifactory/api/gems/$1/"
-        }, {
-            before: "If anonymous access is enabled you can also use the following:",
-            snippet: "gem source -a $2/api/gems/$1/"
-        }, {
-            before: "To view a list of your effective sources and their order of resolution, run the following command:",
-            snippet: "gem source --list",
-            after: "Make sure that this repository is at the top of the list."
-        }, {
-            before: "If you want to setup the credentials for your gem tool either include your API_KEY in the <i>~/.gem/credentials</i> file, or run the following command:",
-            snippet: "curl -u<USERNAME>:<PASSWORD> $2/api/gems/$1/api/v1/api_key.yaml > ~/.gem/credentials"
-        }, {
-            before: "<b>Running on Linux</b><br/>On Linux you may need to change the permissions of the credentials file to 600 by navigating to <i>~/.gem</i> directory and running:",
-            snippet: "chmod 600 credentials"
-        }, {
-            before: "<b>Running on Windows</b><br/>On Windows, the credentials file is located at <i>%USERPROFILE%/.gem/credentials</i>. Note that you also need to set the API key encoding to be \"ASCII\".<br/> To generate the creadentials file run the following command from PowerShell:",
-            snippet: "curl.exe -u<USERNAME>:<PASSWORD> $2/api/gems/$1/api/v1/api_key.yaml | Out-File ~/.gem/credentials -Encoding \"ASCII\""
-        }, {
-            before: "<b>API keys</b><br/>You can modify the credentials file manually and add different API keys. You can then use the following command to choose the relevant API key:",
-            snippet: "gem push -k <KEY>"
-        }],
-        deploy: [{
-            before: "In order to push gems to this repository, you can set the global variable $RUBYGEMS_HOST to point to it as follows:",
-            snippet: "export RUBYGEMS_HOST=$2/api/gems/$1"
-        }, {
-            before: "You can also specify the target repository when pushing the gem by using the --host option:",
-            snippet: "gem push <PACKAGE> --host $2/api/gems/$1"
-        }],
-        read: [{
-            before: "After completing the configuration under General section above, simply execute the following command:",
-            snippet: "gem install <PACKAGE>"
-        }, {
-            before: "The package will be resolved from the repository configured in your <i>~/.gemrc</i> file. You can also specify a source with the following command:",
-            snippet: "gem install <PACKAGE> --source $2/api/gems/$1"
-        }]
-    },
-    generic: {
-        read: {
-            before: "You can download a file directly using the following command:",
-            snippet: "curl <CURL_AUTH> -O \"$2/$1/<TARGET_FILE_PATH>\""
-        },
-        deploy: {
-            before: "You can upload any file using the following command:",
-            snippet: "curl <CURL_AUTH> -T <PATH_TO_FILE> \"$2/$1/<TARGET_FILE_PATH>\""
-        }
-    },
-    vagrant: {
-        read: {
-            before: "To provision a Vagrant box, all you need is to construct it's name in the following manner.",
-            snippet: "vagrant box add \"$2/api/vagrant/$1/{boxName}\""
-        },
-        deploy: {
-            before: "To deploy Vagrant boxes to this Artifactory repository using an explicit URL with Matrix Parameters use:",
-            snippet: "curl <CURL_AUTH> -T <PATH_TO_FILE> \"$2/$1/{vagrantBoxName.box};box_name={name};box_provider={provider};box_version={version}\""
-        }
-    },
-    vcs: {
-        general: {
-            title: "Artifactory supports downloading tags or branches using a simple GET request. You can also specify to download a specific tag or branch as a tar.gz or zip, and a specific file within a tag or branch as a zip file."
-        },
-        read: [{
-            before: "Use the following command to list all tags:",
-            snippet: "curl <CURL_AUTH> -XGET $2/api/vcs/tags/$1/<USER_ORG>/<REPO>"
-        }, {
-            before: "Use the following command to list all branches:",
-            snippet: "curl <CURL_AUTH> -XGET $2/api/vcs/branches/$1/<USER_ORG>/<REPO>"
-        }, {
-            before: "Use the command below to download a tag. You can specify if the package will be downloaded as a tar.gz or a zip; default is tar.gz.",
-            snippet: "curl <CURL_AUTH> -XGET $2/api/vcs/downloadTag/$1/<USER_ORG>/<REPO>/<TAG_NAME>?ext=<tar.gz/zip>"
-        }, {
-            before: "Use the following command to download a file within a tag as a zip:",
-            snippet: "curl <CURL_AUTH> -XGET $2/api/vcs/downloadTag/$1/<USER_ORG>/<REPO>/<TAG_NAME>!<PATH_TO_FILE>?ext=zip"
-        }, {
-            before: "Use the command below to download a branch. You can specify a tar.gz or a zip by adding a parameter in the URL; default is tar.gz. (Downloading can be executed conditionally according to properties by specifying the properties query param. In this case only cached artifacts are searched.)",
-            snippet: "curl <CURL_AUTH> -XGET $2/api/vcs/downloadBranch/$1/<USER_ORG>/<REPO>/<BRANCH_NAME>?ext=<tar.gz/zip>[&properties=key=value]"
-        }, {
-            before: "Use the following command to download a file within a branch as a zip:",
-            snippet: "curl <CURL_AUTH> -XGET $2/api/vcs/downloadBranch/$1/<USER_ORG>/<REPO>/<BRANCH_NAME>!<PATH_TO_FILE>?ext=zip"
-        }]
-    },
-    yum: {
-        general: [{
-            before: "To resolve <i>.rpm</i> files using the YUM client, edit or create the <i>artifactory.repo</i> file with root privileges:",
-            snippet: "sudo vi /etc/yum.repos.d/artifactory.repo"
-        }, {
-            before: "Then edit the baseurl to point to the path of the <a href=\"https://www.jfrog.com/confluence/display/RTF/YUM+Repositories#YUMRepositories-YUMrepodataFolderDepth\" target=\"_blank\">repodata folder</a> according to configured repository depth.<br />If the configured depth is 0 the baseurl should point to the root of the repository.",
-            snippet: "[Artifactory]\n" + "name=Artifactory\n" + "baseurl=http://<USERNAME>:<PASSWORD>@$4/artifactory/$1/<PATH_TO_REPODATA_FOLDER>\n" + "enabled=1\n" + "gpgcheck=0"
-        }],
-        read: [{
-
-        }, {
-            before: "To install a package execute:",
-            snippet: "yum install <PACKAGE>"
-        }]
-    },
-    sbt: {
-        general: [{
-            before: "You can define proxy repositories in the <i>~/.sbt/repositories</i> file in the following way:",
-            snippet: "[repositories]\n" + "local\n" + "my-ivy-proxy-releases: $2/$1/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]\n" + "my-maven-proxy-releases: $2/$1/"
-        }, {
-            before: "In order to specify that all resolvers added in the sbt project should be ignored in favor of those configured in the repositories configuration, add the following configuration option to the sbt launcher script:",
-            snippet: "-Dsbt.override.build.repos=true",
-            after: "You can add this setting to the <i>/usr/local/etc/sbtopts</i> file"
-        }],
-        read: {
-            before: "Add the following to your <i>build.sbt</i> file:",
-            snippet: "resolvers += \n" + "\"Artifactory\" at \"$2/$1/\""
-        },
-        deploy: [{
-            before: "To publish <b>releases</b> add the following to your build.sbt:",
-            snippet: "publishTo := Some(\"Artifactory Realm\" at \"$2/$1\")\n" + "credentials += Credentials(\"Artifactory Realm\", \"localhost\", \"<USERNAME>\", \"<PASSWORD>\")"
-        }, {
-            before: "To publish <b>snapshots</b> add the following to your build.sbt:",
-            snippet: "publishTo := Some(\"Artifactory Realm\" at \"$2/$1;build.timestamp=\" + new java.util.Date().getTime)\n" + "credentials += Credentials(\"Artifactory Realm\", \"localhost\", \"<USERNAME>\", \"<PASSWORD>\")"
-        }]
-    },
-    gradle: {
-        general: {
-            title: "Click on \"Generate Gradle Settings\" in order to use Virtual or Remote repositories for resolution."
-        }
-    }
-};
-
-export default snippets;
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/constants/user_actions.constants.js b/web/angular-web/src/main/webapp/app/constants/user_actions.constants.js
deleted file mode 100644
index 166de00..0000000
--- a/web/angular-web/src/main/webapp/app/constants/user_actions.constants.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export default {
-    'RevokeApiKey': {title: 'Revoke Api Key', icon: 'icon-revoke-api'},
-    'UnlockUser': {title: 'Unlock User', icon: 'icon-unlock'},
-    'ExpirePassword': {title: 'Expire Password', icon: 'icon-expire'},
-    'UnexpirePassword': {title: 'Unexpire Password', icon: 'icon-unexpire'},
-    'DeleteUser': {title: 'Delete User', icon: 'icon-clear'}
-};
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/constants/validation.constants.js b/web/angular-web/src/main/webapp/app/constants/validation.constants.js
deleted file mode 100644
index 84abc12..0000000
--- a/web/angular-web/src/main/webapp/app/constants/validation.constants.js
+++ /dev/null
@@ -1,89 +0,0 @@
-export default function (name) {
-    return angular.extend(angular.copy(commonMessages), customMessages[name]);
-}
-
-const commonMessages = {
-    "required": "You must fill in this field",
-    "unique": "This value must be unique",
-    "validator": "This value is invalid",
-    "email": "Please enter a valid email",
-    "url": "Please enter a valid url",
-    "number": "Please enter an Integer",
-    "min": "Value too low",
-    "max": "Value too high",
-    "minlength": "Value too short",
-    "maxlength": "Value too long",
-    "invalidCron": "The cron expression is invalid",
-    "pastCron": "The next run time is in the past",
-    "uniqueId": "Key is already used",
-    "name": "Name cannot be blank or contain /\\:|?*\"<>",
-    "xmlName": "Name cannot be blank or contain spaces & special characters",
-    "integerValue": "Value must be an integer number"
-};
-
-const customMessages = {
-    "adminGeneral": {
-        "min": "Value must be between 0 and 2,147,483,647",
-        "max": "Value must be between 0 and 2,147,483,647",
-        "dateFormatExpression": "Please enter a valid date format"
-    },
-    "folderDownload": {
-      "min": "Number of downloads must 1 or more"
-    },
-    "adminBackup": {
-        "name": "Invalid backup name",
-        "xmlName": "Invalid backup name"
-    },
-    "adminMail": {
-        "min": "Port must be between 1 and 65535",
-        "max": "Port must be between 1 and 65535"
-    },
-    "proxies": {
-        "min": "Port must be between 1 and 65535",
-        "max": "Port must be between 1 and 65535"
-    },
-    "users": {
-        "validator": "Passwords do not match",
-        "minlength": "Password must be more than 4 characters",
-        "maxlength": "Username must be less than 64 characters"
-    },
-    "maintenance": {
-        "min": "Value must be between 0 and 99",
-        "max": "Value must be between 0 and 99"
-    },
-    "crowd": {
-        "min": "Value must be between 0 and 9999999999999",
-        "max": "Value must be between 0 and 9999999999999",
-        "url": "Please enter a valid url"
-    },
-    "ldapSettings": {
-        "ldapUrl": "You must fill a valid LDAP url"
-    },
-    "gridFilter": {
-        "maxlength": "Filter is too long"
-    },
-    "properties": {
-        "validCharacters": "Name cannot include the following characters: *<>~!@#$%^&()+=-{}[];,`/\\",
-        "predefinedValues": "Must supply predefined values for the selected type"
-    },
-    "repoLayouts": {
-        "pathPattern": "Pattern must at-least contain the tokens 'module', 'baseRev' and 'org' or 'orgPath'."
-    },
-    "bintray": {
-        "required": "Cannot leave apiKey / userName blank"
-    },
-    "licenses": {
-        "validateLicense": "License name contains illegal characters"
-    },
-    "propertySet": {
-        "name": "Property set name should start with a letter and contain only letters, digits, '-' and '_'. no spaces allowed.",
-        "xmlName": "Property set name should start with a letter and contain only letters, digits, '-' and '_'. no spaces allowed."
-    },
-    "reverseProxy": {
-        "port": "Port is not available"
-    },
-    "distRepo": {
-        "existRuleName": "This rule name already in use",
-        "illegalProductName": "Product name can only contain letters, numbers and the following characters: .-_:"
-    }
-};
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/artifactory_dao.js b/web/angular-web/src/main/webapp/app/data/artifactory_dao.js
deleted file mode 100644
index d6452fc..0000000
--- a/web/angular-web/src/main/webapp/app/data/artifactory_dao.js
+++ /dev/null
@@ -1,138 +0,0 @@
-/**
- * base class for DAO's
- */
-export class ArtifactoryDao {
-
-    /**
-     * inject services provided by the sub class
-     * @param $resource
-     * @param RESOURCE
-     */
-    constructor($resource, RESOURCE, artifactoryNotificationsInterceptor) {
-        this.artifactoryNotificationsInterceptor = artifactoryNotificationsInterceptor;
-        this.RESOURCE = RESOURCE;
-        this.$resource = $resource;
-        this._url = null;
-        this._prototype = null;
-
-        /**
-         * default custom actions
-         * @type {{update: {method: string, interceptor: *}, save: {method: string, interceptor: *}, delete: {method: string, interceptor: *}}}
-         * @private
-         */
-        this.setDefaults({});
-        this.setCustomActions({
-            'update': {
-                method: 'PUT',
-                notifications: true
-            },
-            'delete': {
-                method: 'DELETE',
-                notifications: true
-            },
-            'fetch': { // POST which is actually getting data
-                method: 'POST',
-                notifications: false
-            },
-            'save': {
-                method: 'POST',
-                notifications: true
-            }
-        });
-    }
-
-    /**
-     * full url for the resource, include params
-     * @param {string} url
-     */
-    setUrl(url) {
-        this._url = url;
-        return this;
-    }
-
-    /**
-     * relative path for the resource, include params
-     * @param {string} path
-     */
-    setPath(path) {
-        this._url = this.RESOURCE.API_URL + path;
-        return this;
-    }
-
-    /**
-     * set defaults method for custom actions
-     * @param {object} options - Object of default properties. Possible keys and values:
-     ** @param {string} method - GET, POST, PUT, DELETE, PATCH, etc.
-     */
-    setDefaults(options) {
-        this._defaults = this._defaults || {};
-        angular.extend(this._defaults, options);
-        return this;
-    }
-
-    /**
-     * extend the default actions object
-     * @param {object} actionsObject
-     */
-    setCustomActions(actionsObject) {
-        this._customActions = this._customActions || {};
-        Object.keys(actionsObject).forEach((action) => {
-            let actionParams = actionsObject[action];
-            if (!actionParams.method && this._defaults.method) {
-                actionParams.method = this._defaults.method;
-            }
-            if (actionParams.path) {
-                actionParams.url = this.RESOURCE.API_URL + actionParams.path;
-                delete actionParams.path;
-            }
-            if (angular.isDefined(actionParams.notifications) && actionParams.notifications) {
-                if (actionParams.notifications) actionParams.interceptor = this.artifactoryNotificationsInterceptor;
-            }
-            if (angular.isDefined(actionParams.notifications)) {
-                delete actionParams.notifications;
-            }
-            if (this._customActions[action]) {
-                angular.extend(this._customActions[action], actionParams);
-            } else {
-                this._customActions[action] = angular.copy(actionParams);
-            }
-        });
-        return this;
-    }
-
-    /**
-     * extend the resources prototype
-     * @param {object} prototype
-     */
-    extendPrototype(prototype) {
-        this._prototype = prototype;
-        return this;
-    }
-
-    /**
-     * supply a transform function
-     * @callback {function} transform function
-     */
-    transformResponse(callback) {
-        this.transformResponse = callback;
-        return this;
-    }
-
-    /**
-     *returns an instance of the resource object
-     * @returns {Object|*} $resource
-     */
-    getInstance() {
-        var result = this.$resource(this._url, null, this._customActions);
-        if (this._prototype) {
-            angular.extend(result.prototype, this._prototype);
-        }
-        return result;
-    }
-}
-
-export function ArtifactoryDaoFactory($resource, RESOURCE, artifactoryNotificationsInterceptor) {
-    return function () {
-        return new ArtifactoryDao($resource, RESOURCE, artifactoryNotificationsInterceptor);
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/artifactory_dao_module.js b/web/angular-web/src/main/webapp/app/data/artifactory_dao_module.js
deleted file mode 100644
index cd0fea3..0000000
--- a/web/angular-web/src/main/webapp/app/data/artifactory_dao_module.js
+++ /dev/null
@@ -1,165 +0,0 @@
-import {artifactoryNotificationsInterceptor} from "./artifactory_notifications_interceptor.js";
-import {ArtifactoryDao, ArtifactoryDaoFactory} from "./artifactory_dao.js";
-import {AdminSecurityGeneralDao} from "./dao/admin_security_general_dao";
-import {GroupsDao} from "./dao/groups_dao";
-import {GroupPermissionsDao} from "./dao/group_permissions_dao";
-import {HttpSsoDao} from "./dao/http_sso_dao";
-import {SshServerDao} from "./dao/ssh_server_dao";
-import {LicensesDao} from "./dao/licenses_dao";
-import {MailDao} from "./dao/mail_dao";
-import {PasswordsEncryptionDao} from "./dao/passwords_encryption_dao";
-import {ProxiesDao} from "./dao/proxies_dao";
-import {ReverseProxiesDao} from "./dao/reverse_proxies_dao";
-import {RegisterProDao} from "./dao/register_pro_dao";
-import {UserDao} from "./dao/user_dao";
-import {SamlDao} from "./dao/saml_dao";
-import {BintrayDao} from "./dao/bintray_dao";
-import {BlackDuckDao} from "./dao/black_duck_dao";
-import {PropertySetsDao, PropertyFactory, PropertySetFactory} from "./dao/property_sets_dao";
-import {BackupDao} from "./dao/backup_dao";
-import {BrowseFilesDao} from "./dao/browse_files_dao";
-import {SystemInfoDao} from "./dao/system_info_dao";
-import {SecurityDescriptorDao} from "./dao/security_descriptor_dao";
-import {ConfigDescriptorDao} from "./dao/config_descriptor_dao";
-import {IndexerDao} from "./dao/indexer_dao";
-import {StorageSummaryDao} from "./dao/storage_summary_dao";
-import {TreeBrowserDao} from "./dao/tree_browser_dao";
-import {TreeNodeFactory} from "./dao/tree_node";
-import {RepoDataDao} from "./dao/repo_data_dao";
-import {CronTimeDao} from "./dao/cron_time_dao";
-import {DateFormatDao} from "./dao/date_format_dao";
-import {NameValidatorDao} from "./dao/name_validator_dao";
-import {UniqueIdValidatorDao} from "./dao/unique_id_validator_dao";
-import {XmlNameDao} from "./dao/xml_name_dao";
-import {ArtifactGeneralDao} from "./dao/artifact/artifact_general_dao";
-import {ArtifactPermissionsDao} from "./dao/artifact/artifact_permissions_dao";
-import {ArtifactBuildsDao} from "./dao/artifact/artifact_builds_dao";
-import {ArtifactViewSourceDao} from "./dao/artifact/artifact_viewsource_dao";
-import {ArtifactPropertyDao} from "./dao/artifact/artifact_property_dao";
-import {ArtifactWatchesDao} from "./dao/artifact/artifact_watches_dao";
-import {ArtifactActionsDao} from "./dao/artifact/artifact_actions_dao";
-import {PredefineDao} from "./dao/predefine_values_dao";
-import {RepoPropertySetDao} from "./dao/repo_property_set_dao";
-import {ArtifactSearchDao} from "./dao/artifact/artifact_search_dao";
-import {ArtifactPackageSearchDao} from "./dao/artifact/artifact_package_search_dao";
-import {DependencyDeclarationDao} from "./dao/dependency_declaration_dao";
-import {ArtifactDeployDao} from "./dao/artifact/artifact_deploy_dao";
-import {ArtifactViewsDao} from "./dao/artifact/artifact_views_dao";
-import {FooterDao} from "./dao/footer_dao";
-import {CrowdIntegrationDao} from "./dao/crowd_integration_dao";
-import {ExportDao} from "./dao/export_dao";
-import {ImportDao} from "./dao/import_dao";
-import {MaintenanceDao} from "./dao/maintenance_dao";
-import {LdapDao} from "./dao/ldap_dao";
-import {DockerStatusDao} from "./dao/docker_status_dao";
-import {LdapGroupsDao} from "./dao/ldap_groups_dao";
-import {PushToBintrayDao} from "./dao/push_to_bintray_dao";
-import {DistributionDao} from "./dao/distribution_dao";
-import {GeneralConfigDao} from "./dao/general_config_dao";
-import {GovernanceDao} from "./dao/governance_dao";
-import {SigningKeysDao} from "./dao/signing_keys_dao";
-import {KeystoreDao} from "./dao/keystore_dao";
-import {BuildsDao} from "./dao/builds/builds_dao";
-import {UserProfileDao} from "./dao/user_profile_dao";
-import {PermissionsDao} from "./dao/permissions_dao";
-import {ChecksumsDao} from "./dao/checksums_dao";
-import {FilteredResourceDao} from "./dao/filtered_resource_dao";
-import {ArtifactLicensesDao} from "./dao/artifact/artifact_licenses_dao";
-import {HomePageDao} from "./dao/home_page_dao";
-import {SetMeUpDao} from "./dao/set_me_up_dao";
-import {SystemLogsDao} from "./dao/system_logs_dao";
-import {RepositoriesDao} from "./dao/repositories_dao";
-import {RepositoriesLayoutsDao} from "./dao/repositories_layouts_dao";
-import {HaDao} from "./dao/ha_dao";
-import {StashResultsDao} from "./dao/stash_results_dao";
-import {OAuthDao} from "./dao/oauth_dao";
-import {SupportPageDao} from "./dao/support_page_dao";
-import {ServerTimeDao} from "./dao/server_time_dao";
-import {SshClientDao} from "./dao/ssh_client_dao";
-import {BinaryProvidersInfoDao} from "./dao/binary_providers_info_dao";
-import {GlobalReplicationsConfigDao} from "./dao/global_replications_config_dao";
-
-angular.module('artifactory.dao', ['ngResource', 'artifactory.services'])
-    .factory('artifactoryNotificationsInterceptor', artifactoryNotificationsInterceptor)
-    .service('ArtifactoryDao', ArtifactoryDao)
-    .factory('ArtifactoryDaoFactory', ArtifactoryDaoFactory)
-    .service('AdminSecurityGeneralDao', AdminSecurityGeneralDao)
-    .service('GroupsDao', GroupsDao)
-    .service('GroupPermissionsDao', GroupPermissionsDao)
-    .service('HttpSsoDao', HttpSsoDao)
-    .service('SshServerDao', SshServerDao)
-    .service('LicensesDao', LicensesDao)
-    .service('MailDao', MailDao)
-    .service('PasswordsEncryptionDao', PasswordsEncryptionDao)
-    .factory('ProxiesDao', ProxiesDao)
-    .factory('ReverseProxiesDao', ReverseProxiesDao)
-    .service('RegisterProDao', RegisterProDao)
-    .service('UserDao', UserDao)
-    .service('SamlDao', SamlDao)
-    .service('BintrayDao', BintrayDao)
-    .service('BlackDuckDao', BlackDuckDao)
-    .factory('PropertySetsDao', PropertySetsDao)
-    .factory('Property', PropertyFactory)
-    .factory('PropertySet', PropertySetFactory)
-    .factory('BackupDao', BackupDao)
-    .service('BrowseFilesDao', BrowseFilesDao)
-    .service('SystemInfoDao', SystemInfoDao)
-    .service('SecurityDescriptorDao', SecurityDescriptorDao)
-    .service('ConfigDescriptorDao', ConfigDescriptorDao)
-    .service('IndexerDao', IndexerDao)
-    .service('StorageSummaryDao', StorageSummaryDao)
-    .service('TreeBrowserDao', TreeBrowserDao)
-    .factory('TreeNode', TreeNodeFactory)
-    .service('RepoDataDao', RepoDataDao)
-    .service('CronTimeDao', CronTimeDao)
-    .service('DateFormatDao', DateFormatDao)
-    .service('NameValidatorDao', NameValidatorDao)
-    .service('UniqueIdValidatorDao', UniqueIdValidatorDao)
-    .service('XmlNameDao', XmlNameDao)
-    .service('ArtifactGeneralDao', ArtifactGeneralDao)
-    .service('ArtifactPermissionsDao', ArtifactPermissionsDao)
-    .service('ArtifactBuildsDao', ArtifactBuildsDao)
-    .service('ArtifactViewSourceDao', ArtifactViewSourceDao)
-    .service('ArtifactPropertyDao', ArtifactPropertyDao)
-    .factory('ArtifactWatchesDao', ArtifactWatchesDao)
-    .factory('ArtifactActionsDao', ArtifactActionsDao)
-    .service('PredefineDao', PredefineDao)
-    .service('RepoPropertySetDao', RepoPropertySetDao)
-    .service('ArtifactSearchDao', ArtifactSearchDao)
-    .service('ArtifactPackageSearchDao', ArtifactPackageSearchDao)
-    .service('DependencyDeclarationDao', DependencyDeclarationDao)
-    .service('ArtifactDeployDao', ArtifactDeployDao)
-    .service('ArtifactViewsDao', ArtifactViewsDao)
-    .service('FooterDao', FooterDao)
-    .service('CrowdIntegrationDao', CrowdIntegrationDao)
-    .service('ExportDao', ExportDao)
-    .service('ImportDao', ImportDao)
-    .service('MaintenanceDao', MaintenanceDao)
-    .service('LdapDao', LdapDao)
-    .service('LdapGroupsDao', LdapGroupsDao)
-    .service('PushToBintrayDao', PushToBintrayDao)
-    .service('DistributionDao', DistributionDao)
-    .service('GeneralConfigDao', GeneralConfigDao)
-    .service('GovernanceDao', GovernanceDao)
-    .service('SigningKeysDao', SigningKeysDao)
-    .service('KeystoreDao', KeystoreDao)
-    .service('BuildsDao', BuildsDao)
-    .service('UserProfileDao', UserProfileDao)
-    .service('PermissionsDao', PermissionsDao)
-    .service('ChecksumsDao', ChecksumsDao)
-    .service('FilteredResourceDao', FilteredResourceDao)
-    .service('ArtifactLicensesDao', ArtifactLicensesDao)
-    .service('HomePageDao', HomePageDao)
-    .service('SetMeUpDao', SetMeUpDao)
-    .service('SystemLogsDao', SystemLogsDao)
-    .service('RepositoriesDao', RepositoriesDao)
-    .service('DockerStatusDao', DockerStatusDao)
-        .service('RepositoriesLayoutsDao', RepositoriesLayoutsDao)
-        .service('StashResultsDao', StashResultsDao)
-        .service('OAuthDao', OAuthDao)
-        .service('SupportPageDao', SupportPageDao)
-        .service('ServerTimeDao', ServerTimeDao)
-        .service('SshClientDao', SshClientDao)
-        .service('BinaryProvidersInfoDao', BinaryProvidersInfoDao)
-        .service('GlobalReplicationsConfigDao', GlobalReplicationsConfigDao)
-        .factory('HaDao', HaDao);
diff --git a/web/angular-web/src/main/webapp/app/data/artifactory_notifications_interceptor.js b/web/angular-web/src/main/webapp/app/data/artifactory_notifications_interceptor.js
deleted file mode 100644
index 832effb..0000000
--- a/web/angular-web/src/main/webapp/app/data/artifactory_notifications_interceptor.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * returns a function that accept some custom info
- * and returns the interceptor object.
- * intent to be injected and use in DAO's
- *
- * @returns {Function}
- */
-export function artifactoryNotificationsInterceptor($q, ArtifactoryNotifications) {
-
-    /**
-     * accept an additional info that can be used
-     * in the returned interceptor object
-     *
-     * @returns {{response: Function, responseError: Function}}
-     */
-    return {
-        response: function (res) {
-            if (res.data) {
-                if (!res.data.url) {
-                    if (res.data.info || res.data.warn) {
-                        if ((res.data.info && res.data.info.indexOf('<a') !== -1 && res.data.info.indexOf('</a>') !== -1) ||
-                            (res.data.warn && res.data.warn.indexOf('<a') !== -1 && res.data.warn.indexOf('</a>') !== -1)) {
-                            ArtifactoryNotifications.create(res.data,true);
-                        }
-                        else {
-                            ArtifactoryNotifications.create(res.data);
-                        }
-                    } else if (res.data.feedbackMsg) {
-                        ArtifactoryNotifications.create(res.data.feedbackMsg);
-                    }
-                }
-            }
-            return res;
-        },
-        responseError: function (res) {
-            // Response error as array:
-            if (res.data && res.data.errors && res.data.errors.length) {
-                ArtifactoryNotifications.create({error: res.data.errors[0].message});
-            }
-            // Response error as single object:
-            else if (res.data && (res.data.error || res.data.warn)) {
-                ArtifactoryNotifications.create(res.data);
-            }
-            return $q.reject(res);
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/admin_security_general_dao.js b/web/angular-web/src/main/webapp/app/data/dao/admin_security_general_dao.js
deleted file mode 100644
index 998f1ac..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/admin_security_general_dao.js
+++ /dev/null
@@ -1,24 +0,0 @@
-export class AdminSecurityGeneralDao {
-    constructor(ArtifactoryDaoFactory, RESOURCE) {
-	    return ArtifactoryDaoFactory()
-            .setPath(RESOURCE.SECURITY_CONFIG)
-            .setCustomActions({
-                'lockUsers': {
-                    path: RESOURCE.SECURITY_CONFIG + '/lockUsers',
-                    method: 'POST',
-                    notifications: true
-                },
-                'unlockUsers': {
-                    path: RESOURCE.SECURITY_CONFIG + '/unlockUsers',
-                    method: 'POST',
-                    notifications: true
-                },
-                'unlockAllUsers': {
-                    path: RESOURCE.SECURITY_CONFIG + '/unlockAllUsers',
-                    method: 'POST',
-                    notifications: true
-                }
-            })
-            .getInstance();
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_actions_dao.js b/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_actions_dao.js
deleted file mode 100644
index e0f44ae..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_actions_dao.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import {ArtifactoryDao} from '../../artifactory_dao';
-
-export function ArtifactActionsDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-        .setDefaults({method: 'POST'})
-        .setPath(RESOURCE.ARTIFACT_ACTIONS + '/:action')
-        .setCustomActions({
-                perform: {
-                    params: {action: '@action'},
-                    notifications: true
-                },
-                performGet: {
-                    method: 'GET',
-                    params: {action: '@action'},
-                    notifications: true
-                },
-                dryRun: {
-                    params: {action: '@action'}
-                },
-                getDeleteVersions: {
-                    method: 'GET',
-                    path: RESOURCE.ARTIFACT_ACTIONS + '/deleteversions',
-                    isArray: false,
-                    notifications: true
-                },
-                getSha256: {
-                    method: 'POST',
-                    path: RESOURCE.ARTIFACT_ACTIONS + '/addSha256',
-                    notifications: true
-                }
-        }).getInstance();
-}
diff --git a/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_builds_dao.js b/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_builds_dao.js
deleted file mode 100644
index 2725271..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_builds_dao.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import {ArtifactoryDao} from '../../artifactory_dao';
-
-export class ArtifactBuildsDao extends ArtifactoryDao {
-
-    constructor($resource, RESOURCE,artifactoryNotificationsInterceptor) {
-        super($resource, RESOURCE,artifactoryNotificationsInterceptor);
-
-        this.setPath(RESOURCE.ARTIFACT_BUILDS);
-        this.setCustomActions({
-            'query': {
-                isArray: false
-            },
-            'getJson': {
-                path: RESOURCE.ARTIFACT_BUILDS + '/json',
-                transformResponse: (data) => {
-                    return {json: data};
-                }
-            }
-        });
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_deploy_dao.js b/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_deploy_dao.js
deleted file mode 100644
index 6ae2cb5..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_deploy_dao.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import {ArtifactoryDao} from '../../artifactory_dao';
-
-export function ArtifactDeployDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-            .setDefaults({method: 'POST'})
-            .setPath(RESOURCE.ARTIFACT + '/:action')
-            .setCustomActions({
-                'post': {
-                    method: 'POST',
-                    params: {
-                        action: '@action'
-                    },
-                    notifications: true
-                },
-                'cancelUpload': {
-                    method: 'POST',
-                    path: RESOURCE.ARTIFACT + "/cancelupload"
-                },
-                postBundle: {
-                    method: 'POST',
-                    path: RESOURCE.ARTIFACT + "/:action/bundle",
-                    params: {
-                        action: '@action'
-                    },
-                    notifications: true
-                }
-            })
-            .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_general_dao.js b/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_general_dao.js
deleted file mode 100644
index 71f379e..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_general_dao.js
+++ /dev/null
@@ -1,17 +0,0 @@
-export function ArtifactGeneralDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-        .setPath(RESOURCE.ARTIFACT_GENERAL)
-        .setCustomActions({
-            'bintray': {
-                method: 'POST',
-                path: RESOURCE.ARTIFACT_GENERAL_BINTRAY,
-                params: {sha1: '@sha1', $no_spinner: true}
-            },
-            artifactsCount: {
-                method: 'POST',
-                path: RESOURCE.ARTIFACT_GENERAL + "/artifactsCount",
-                params: {$no_spinner: true},
-                notifications: false
-            }
-        }).getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_licenses_dao.js b/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_licenses_dao.js
deleted file mode 100644
index 936eb14..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_licenses_dao.js
+++ /dev/null
@@ -1,39 +0,0 @@
-import {ArtifactoryDao} from '../../artifactory_dao';
-
-export function ArtifactLicensesDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-        .setPath(RESOURCE.GENERAL_TAB_LICENSES + '/:action')
-        .setCustomActions({
-            'getLicenses': {
-                method: 'GET',
-                isArray: true
-            },
-            setLicenses: {
-                method: 'PUT',
-                isArray: false,
-                path: RESOURCE.GENERAL_TAB_LICENSES + '/setLicensesOnPath',
-                notifications: true
-            },
-            scanArtifact: {
-                method: 'GET',
-                isArray: true,
-                path: RESOURCE.GENERAL_TAB_LICENSES + '/scanArtifact',
-                notifications: true
-            },
-            queryCodeCenter: {
-                method: 'POST',
-                params: {
-                    repoKey: '@repoKey',
-                    path: '@path'
-                },
-                path: RESOURCE.GENERAL_TAB_LICENSES + '/queryCodeCenter',
-                notifications: true
-            },
-            getArchiveLicenseFile: {
-                method: 'GET',
-                path: RESOURCE.GENERAL_TAB_LICENSES + '/getArchiveLicenseFile',
-                transformResponse:(data)=>{ return {data: data} }
-            }
-        })
-        .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_package_search_dao.js b/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_package_search_dao.js
deleted file mode 100644
index def497f..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_package_search_dao.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import {ArtifactoryDao} from '../../artifactory_dao';
-
-export function ArtifactPackageSearchDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-            .setPath(RESOURCE.ARTIFACT_SEARCH + '/pkg/:param')
-            .setCustomActions({
-                'availablePackages': {
-                    method: 'GET',
-                    isArray: true,
-                    params: {param: 'availablePackages'}
-                },
-                'queryFields': {
-                    method: 'GET',
-                    isArray: true,
-                    params: {param: '@packageType'}
-                },
-                'runQuery': {
-                    method: 'POST',
-                    notifications: true
-                }
-            })
-            .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_permissions_dao.js b/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_permissions_dao.js
deleted file mode 100644
index 7e08657..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_permissions_dao.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import {ArtifactoryDao} from '../../artifactory_dao';
-
-export class ArtifactPermissionsDao extends ArtifactoryDao {
-
-    constructor(RESOURCE, $resource, artifactoryNotificationsInterceptor) {
-        super($resource,RESOURCE, artifactoryNotificationsInterceptor);
-
-        this.setUrl(RESOURCE.API_URL + RESOURCE.ARTIFACT_PERMISSIONS);
-        this.setCustomActions({
-            query: {
-                isArray: false
-            }
-        })
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_property_dao.js b/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_property_dao.js
deleted file mode 100644
index a9bfd80..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_property_dao.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import {ArtifactoryDao} from '../../artifactory_dao';
-
-export class ArtifactPropertyDao extends ArtifactoryDao {
-
-    constructor(RESOURCE, $resource, artifactoryNotificationsInterceptor) {
-        super($resource,RESOURCE, artifactoryNotificationsInterceptor);
-
-        this.setUrl(RESOURCE.API_URL + RESOURCE.ARTIFACT_PROPERTIES +"/:name");
-        this.setCustomActions({
-            'query': {
-                isArray: false
-            },
-            'get': {
-                params: {name: '@name'}
-            },
-            'update': {
-                params: {name: '@name'}
-            },
-            'delete':{
-                params: {name: '@name'}
-            },
-            'deleteBatch': {
-                url: RESOURCE.API_URL+'/deleteproperties',
-                method: 'POST',
-                notifications:true
-            }
-        });
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_search_dao.js b/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_search_dao.js
deleted file mode 100644
index b361cb1..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_search_dao.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import {ArtifactoryDao} from '../../artifactory_dao';
-
-export function ArtifactSearchDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-            .setDefaults({method: 'POST'})
-            .setPath(RESOURCE.ARTIFACT_SEARCH + '/:search/:action')
-            .setCustomActions({
-                'fetch': {
-                    params: {search: '@search'},
-                    notifications:true
-                },
-                'get': {
-                    method: 'GET',
-                    isArray: true,
-                    params: {
-                        action: '@action',
-                        search: '@search'
-                    },
-                    notifications:true
-                },
-                'delete': {
-                    method: 'POST',
-                    params: {search: 'deleteArtifact'}
-                }
-            })
-            .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_views_dao.js b/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_views_dao.js
deleted file mode 100644
index 25ba1a1..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_views_dao.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import {ArtifactoryDao} from '../../artifactory_dao';
-
-export function ArtifactViewsDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-            .setDefaults({method: 'POST'})
-            .setPath(RESOURCE.VIEWS+"/:view")
-            .setCustomActions({
-                'fetch':{
-                    method: 'POST',
-                    params:{view: '@view'}
-                },
-                'getDockerProxySnippet': {
-                    method: 'GET',
-                    path: RESOURCE.VIEWS + "/dockerproxy/:repoKey",
-                    params:{repoKey: '@repoKey'}
-                }
-            })
-            .getInstance();
-}
diff --git a/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_viewsource_dao.js b/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_viewsource_dao.js
deleted file mode 100644
index 0443120..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_viewsource_dao.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import {ArtifactoryDao} from '../../artifactory_dao';
-
-export class ArtifactViewSourceDao extends ArtifactoryDao {
-
-    constructor(RESOURCE, $resource, artifactoryNotificationsInterceptor) {
-        super($resource,RESOURCE, artifactoryNotificationsInterceptor);
-
-        this.setUrl(RESOURCE.API_URL + RESOURCE.ARTIFACT_VIEW_SOURCE);
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_watches_dao.js b/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_watches_dao.js
deleted file mode 100644
index cd21ed2..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/artifact/artifact_watches_dao.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import {ArtifactoryDao} from '../../artifactory_dao';
-
-export function ArtifactWatchesDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-            .setPath(RESOURCE.ARTIFACT_WATCHES + "/:name")
-            .setCustomActions({
-                "delete": {
-                    method: 'POST',
-                    path: RESOURCE.ARTIFACT_WATCHES + "/remove"
-                },
-                status: {
-                    path: RESOURCE.ARTIFACT_WATCHES + "/status"
-                }
-            })
-            .getInstance();
-}
-
diff --git a/web/angular-web/src/main/webapp/app/data/dao/backup_dao.js b/web/angular-web/src/main/webapp/app/data/dao/backup_dao.js
deleted file mode 100644
index f80b260..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/backup_dao.js
+++ /dev/null
@@ -1,21 +0,0 @@
-export function BackupDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-        .setPath(RESOURCE.BACKUP + "/:key/:action")
-        .setCustomActions({
-            'delete': {
-                params: {key: '@key'}
-            },
-            'get': {
-                params: {key: '@key'}
-            },
-            'update': {
-                params: {key: '@key'}
-            },
-            'runNow': {
-                method: 'POST',
-                params: {key: '@key', action: 'runnow'},
-                notifications: true
-            }
-        })
-        .getInstance();
-}
diff --git a/web/angular-web/src/main/webapp/app/data/dao/binary_providers_info_dao.js b/web/angular-web/src/main/webapp/app/data/dao/binary_providers_info_dao.js
deleted file mode 100644
index b2e3697..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/binary_providers_info_dao.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export function BinaryProvidersInfoDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-            .setPath(RESOURCE.BINARY_PROVIDERS_INFO)
-            .setCustomActions({
-                'get':{
-                    method: 'GET'
-                }
-            });
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/bintray_dao.js b/web/angular-web/src/main/webapp/app/data/dao/bintray_dao.js
deleted file mode 100644
index ce42132..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/bintray_dao.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export class BintrayDao extends ArtifactoryDao {
-
-    constructor($resource, RESOURCE,artifactoryNotificationsInterceptor) {
-        super($resource, RESOURCE,artifactoryNotificationsInterceptor);
-
-        this.setUrl(RESOURCE.API_URL + RESOURCE.BINTRAY_SETTING);
-        this.setCustomActions({
-            'fetch': {
-                notifications: true
-            },
-            'info': {
-                path: RESOURCE.BINTRAY_SETTING + "/info",
-                params: {sha1: '@sha1'}
-            }
-        })
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/black_duck_dao.js b/web/angular-web/src/main/webapp/app/data/dao/black_duck_dao.js
deleted file mode 100644
index fb42808..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/black_duck_dao.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export class BlackDuckDao extends ArtifactoryDao{
-
-    constructor($resource, RESOURCE,artifactoryNotificationsInterceptor) {
-        super($resource, RESOURCE,artifactoryNotificationsInterceptor);
-
-        this.setUrl(RESOURCE.API_URL + RESOURCE.BLACK_DUCK)
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/browse_files_dao.js b/web/angular-web/src/main/webapp/app/data/dao/browse_files_dao.js
deleted file mode 100644
index d686d9e..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/browse_files_dao.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export class BrowseFilesDao extends ArtifactoryDao {
-
-    constructor($resource, RESOURCE,artifactoryNotificationsInterceptor) {
-        super($resource, RESOURCE,artifactoryNotificationsInterceptor);
-
-        this.setUrl(RESOURCE.API_URL + RESOURCE.BROWSE_FILESYSTEM);
-        this.setCustomActions({
-            'query': {
-                method: 'GET',
-                params: {path: '@path'}
-            }
-        });
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/builds/builds_dao.js b/web/angular-web/src/main/webapp/app/data/dao/builds/builds_dao.js
deleted file mode 100644
index 4d36c15..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/builds/builds_dao.js
+++ /dev/null
@@ -1,46 +0,0 @@
-import {ArtifactoryDao} from '../../artifactory_dao';
-
-export function BuildsDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-
-        .setPath(RESOURCE.BUILDS + "/:action/:subAction/:name/:number/:time/:moduleId")
-        .setCustomActions({
-
-            getData: {
-                method: 'GET',
-                isArray: false,
-                params: {action: '@action', subAction: '@subAction',name: '@name', number: '@number', time: '@time', moduleId: '@moduleId'}
-            },
-            lastBuild: {
-                method: 'GET',
-                isArray: false,
-                params: {action: 'buildInfo', name: '@name', number: '@number'}
-            },
-            getDataArray: {
-                method: 'GET',
-                isArray: true,
-                params: {action: '@action', subAction: '@subAction', name: '@name', number: '@number', time: '@time', moduleId: '@moduleId'}
-            },
-            delete:{
-                method: 'POST',
-                notifications: true,
-                params: {action: 'buildsDelete'}
-            },
-            deleteAll:{
-                method: 'POST',
-                notifications: true,
-                params: {action: 'deleteAllBuilds'}
-            },
-            overrideLicenses:{
-                method: 'PUT',
-                params: {action: 'overrideLicenses', name: '@name', number: '@number', time: '@time'}
-            },
-            updateGovernanceRequest: {
-                method: 'PUT',
-                notifications: true,
-                params: {action: 'updateGovernance', name: '@name', number: '@number', time: '@time'}
-            }
-
-        })
-        .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/checksums_dao.js b/web/angular-web/src/main/webapp/app/data/dao/checksums_dao.js
deleted file mode 100644
index f524934..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/checksums_dao.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export function ChecksumsDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-        .setDefaults({method: 'POST'})
-        .setPath(RESOURCE.CHECKSUMS + "/:action")
-        .setCustomActions({
-            'fix': {
-                method: 'POST',
-                params: {action: 'fix'},
-                notifications: true
-            }
-        })
-        .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/config_descriptor_dao.js b/web/angular-web/src/main/webapp/app/data/dao/config_descriptor_dao.js
deleted file mode 100644
index ae8f1a0..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/config_descriptor_dao.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export class ConfigDescriptorDao extends ArtifactoryDao {
-
-    constructor($resource, RESOURCE, artifactoryNotificationsInterceptor) {
-        super($resource, RESOURCE,artifactoryNotificationsInterceptor);
-
-        this.setUrl(RESOURCE.API_URL + RESOURCE.CONFIG_DESCRIPTOR);
-        this.setCustomActions({
-            'get': {
-                method: 'GET',
-                notifications: true
-            },
-            'update': {
-                method: 'PUT',
-                notifications: true
-            }
-        });
-
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/data/dao/cron_time_dao.js b/web/angular-web/src/main/webapp/app/data/dao/cron_time_dao.js
deleted file mode 100644
index f084c89..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/cron_time_dao.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export class CronTimeDao extends ArtifactoryDao {
-
-    constructor($resource, RESOURCE, artifactoryNotificationsInterceptor) {
-        super($resource, RESOURCE, artifactoryNotificationsInterceptor);
-
-        this.setUrl(RESOURCE.API_URL + RESOURCE.CRON_TIME);
-        this.setCustomActions({
-            get: {
-                "params": {
-                    cron: '@cron',
-                    isReplication:'@isReplication'
-                }
-            }
-        })
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/data/dao/crowd_integration_dao.js b/web/angular-web/src/main/webapp/app/data/dao/crowd_integration_dao.js
deleted file mode 100644
index 96543e4..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/crowd_integration_dao.js
+++ /dev/null
@@ -1,24 +0,0 @@
-export function CrowdIntegrationDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-            .setDefaults({method: 'POST'})
-            .setPath(RESOURCE.CROWD)
-            .setCustomActions({
-                'test': {
-                    method: 'POST',
-                    path: RESOURCE.CROWD + "/test",
-                    notifications: true
-                },
-                'refresh': {
-                    method: 'POST',
-                    path: RESOURCE.CROWD + "/refresh/:name",
-                    params: {name: '@name'},
-                    notifications: true
-                },
-                'import': {
-                    method: 'POST',
-                    path: RESOURCE.CROWD + "/import",
-                    notifications: true
-                }
-            })
-            .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/date_format_dao.js b/web/angular-web/src/main/webapp/app/data/dao/date_format_dao.js
deleted file mode 100644
index ec1e9e6..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/date_format_dao.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export class DateFormatDao extends ArtifactoryDao {
-
-    constructor($resource, RESOURCE,artifactoryNotificationsInterceptor) {
-        super($resource, RESOURCE,artifactoryNotificationsInterceptor);
-
-        this.setUrl(RESOURCE.API_URL + RESOURCE.DATE_FORMAT);
-        this.setCustomActions({
-            get: {
-                "params": {
-                    dateformat: '@dateformat'
-                }
-            }
-        })
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/data/dao/dependency_declaration_dao.js b/web/angular-web/src/main/webapp/app/data/dao/dependency_declaration_dao.js
deleted file mode 100644
index ca65fed..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/dependency_declaration_dao.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export function DependencyDeclarationDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-            .setDefaults({method: 'POST'})
-            .setPath(RESOURCE.DEPENDENCY_DECLARATION)
-            .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/distribution_dao.js b/web/angular-web/src/main/webapp/app/data/dao/distribution_dao.js
deleted file mode 100644
index 074fe3e..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/distribution_dao.js
+++ /dev/null
@@ -1,22 +0,0 @@
-export function DistributionDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-        .setPath(RESOURCE.BINTRAY_DISTRIBUTION + "/:action")
-        .setCustomActions({
-            'distributeArtifact': {
-                method: 'POST',
-                notifications: true,
-                params: {action: 'distributeArtifact'}
-            },
-            'distributeBuild': {
-                method: 'POST',
-                notifications: true,
-                params: {action: 'distributeBuild'}
-            },
-            'getAvailableDistributionRepos': {
-                method: 'GET',
-                params: {action: 'getAvailableDistributionRepos'},
-                isArray: true
-            }
-        })
-        .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/docker_status_dao.js b/web/angular-web/src/main/webapp/app/data/dao/docker_status_dao.js
deleted file mode 100644
index 12d9b3f..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/docker_status_dao.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export function DockerStatusDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-            .setPath(RESOURCE.DOCKER_STATUS)
-            .setCustomActions({
-                'get':{
-                    method: 'GET'
-                }
-            });
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/export_dao.js b/web/angular-web/src/main/webapp/app/data/dao/export_dao.js
deleted file mode 100644
index a7466d0..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/export_dao.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export function ExportDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-            .setDefaults({method: 'POST'})
-            .setPath(RESOURCE.EXPORT + '/:action')
-            .setCustomActions({
-                'save': {
-                    method: 'POST',
-                    params: {
-                        action: '@action'
-                    },
-                    notifications: true
-                }
-            })
-            .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/filtered_resource_dao.js b/web/angular-web/src/main/webapp/app/data/dao/filtered_resource_dao.js
deleted file mode 100644
index d4b6252..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/filtered_resource_dao.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export function FilteredResourceDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-        .setDefaults({method: 'POST'})
-        .setPath(RESOURCE.FILTERED_RESOURCE)
-        .setCustomActions({
-            'setFiltered': {
-                method: 'POST'
-            }
-        })
-        .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/footer_dao.js b/web/angular-web/src/main/webapp/app/data/dao/footer_dao.js
deleted file mode 100644
index db90ddf..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/footer_dao.js
+++ /dev/null
@@ -1,43 +0,0 @@
-import EVENTS from '../../constants/artifacts_events.constants';
-const VERSION_INFO_KEY = 'VERSION_INFO';
-export class FooterDao {
-	constructor(RESOURCE, ArtifactoryDaoFactory, ArtifactoryStorage, $timeout, ArtifactoryEventBus) {
-		this.storage = ArtifactoryStorage;
-        this.$timeout = $timeout;
-        this.ArtifactoryEventBus = ArtifactoryEventBus;
-    	this._resource = ArtifactoryDaoFactory()
-            .setPath(RESOURCE.FOOTER)
-            .getInstance();
-    }
-
-    get(force = false) {
-
-/*
-        let now = (new Date()).getTime();
-        if (this.lastGet && now - this.lastGet > 1000 && !this._info) force = true;
-        this.lastGet = now;
-*/
-
-        if (!this.cached || force) {
-            this.cached = this._resource.get().$promise
-                    .then(info => this._info = info);
-        }
-
-        //Fix for RTFACT-9873
-        if (!this._info) {
-            this.$timeout(()=> {
-                if (!this._info) {
-                    this.get(true).then(()=> {
-                        this.ArtifactoryEventBus.dispatch(EVENTS.FOOTER_DATA_UPDATED);
-                    });
-                }
-            }, 400);
-        }
-
-        return this.cached;
-    }
-
-    getInfo() {
-        return this._info;
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/data/dao/general_config_dao.js b/web/angular-web/src/main/webapp/app/data/dao/general_config_dao.js
deleted file mode 100644
index 05f7b7d..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/general_config_dao.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export function GeneralConfigDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-        .setDefaults({method: 'POST'})
-        .setPath(RESOURCE.GENERAL_CONFIG + "/:param")
-        .setCustomActions({
-            'deleteLogo': {
-                method: 'DELETE',
-                params: {param: 'logo'}
-            },
-                getData: {
-                    method: 'GET',
-                    path: RESOURCE.GENERAL_CONFIG + "/data"
-                }
-        })
-        .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/global_replications_config_dao.js b/web/angular-web/src/main/webapp/app/data/dao/global_replications_config_dao.js
deleted file mode 100644
index 979c614..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/global_replications_config_dao.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export function GlobalReplicationsConfigDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-        .setPath(RESOURCE.GLOBAL_REPLICATIONS_BLOCK)
-        .setCustomActions({
-            'status': {
-                method: 'GET'
-            }
-        })
-        .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/governance_dao.js b/web/angular-web/src/main/webapp/app/data/dao/governance_dao.js
deleted file mode 100644
index 101231f..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/governance_dao.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export function GovernanceDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-        .setDefaults({method: 'POST'})
-        .setPath(RESOURCE.ARTIFACT_GOVERNANCE)
-        .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/group_permissions_dao.js b/web/angular-web/src/main/webapp/app/data/dao/group_permissions_dao.js
deleted file mode 100644
index 6b94024..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/group_permissions_dao.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export class GroupPermissionsDao extends ArtifactoryDao {
-
-    constructor($resource, RESOURCE, artifactoryNotificationsInterceptor) {
-        super($resource, RESOURCE, artifactoryNotificationsInterceptor);
-
-        this.setUrl(RESOURCE.API_URL + RESOURCE.GROUP_PERMISSION);
-
-        this.setCustomActions({
-            'get': {
-                method: 'POST',
-                isArray: true
-            }
-        });
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/groups_dao.js b/web/angular-web/src/main/webapp/app/data/dao/groups_dao.js
deleted file mode 100644
index 7a05780..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/groups_dao.js
+++ /dev/null
@@ -1,35 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export class GroupsDao extends ArtifactoryDao {
-
-    constructor($resource, RESOURCE, artifactoryNotificationsInterceptor) {
-        super($resource, RESOURCE,artifactoryNotificationsInterceptor);
-
-        this.setUrl(RESOURCE.API_URL + RESOURCE.GROUPS + '/:prefix/:name');
-
-        this.setCustomActions({
-
-            'getAll': {
-                method: 'GET',
-                isArray: true,
-                params: {flag: true, prefix: 'crud'}
-            },
-            'getSingle': {
-                method: 'GET',
-                params: {prefix: 'crud', name: '@name'}
-            },
-            'update': {
-                params: {name: '@name'}
-            },
-            'create': {
-                method: 'POST',
-                notifications: true
-            },
-            'delete': {
-                method: 'POST',
-                params: {prefix: 'groupsDelete'}
-            }
-        });
-    }
-}
-
diff --git a/web/angular-web/src/main/webapp/app/data/dao/ha_dao.js b/web/angular-web/src/main/webapp/app/data/dao/ha_dao.js
deleted file mode 100644
index 35b959f..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/ha_dao.js
+++ /dev/null
@@ -1,10 +0,0 @@
-export function HaDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-            .setPath(RESOURCE.HIGH_AVAILABILITY + '/:id')
-            .setCustomActions({
-            	'delete': {
-            		params: {id: '@id'}
-				}
-            })
-            .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/home_page_dao.js b/web/angular-web/src/main/webapp/app/data/dao/home_page_dao.js
deleted file mode 100644
index 6e7b294..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/home_page_dao.js
+++ /dev/null
@@ -1,6 +0,0 @@
-export function HomePageDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-        .setDefaults({method: 'GET'})
-        .setPath(RESOURCE.HOME_PAGE)
-        .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/http_sso_dao.js b/web/angular-web/src/main/webapp/app/data/dao/http_sso_dao.js
deleted file mode 100644
index 5317076..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/http_sso_dao.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export class HttpSsoDao extends ArtifactoryDao {
-
-    constructor($resource, RESOURCE,artifactoryNotificationsInterceptor) {
-        super($resource, RESOURCE,artifactoryNotificationsInterceptor);
-
-        this.setUrl(RESOURCE.API_URL + RESOURCE.HTTPSSO)
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/import_dao.js b/web/angular-web/src/main/webapp/app/data/dao/import_dao.js
deleted file mode 100644
index 45401df..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/import_dao.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export function ImportDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-            .setDefaults({method: 'POST'})
-            .setPath(RESOURCE.IMPORT + '/:action')
-            .setCustomActions({
-                'save': {
-                    method: 'POST',
-                    params: {
-                        action: '@action'
-                    },
-                    notifications: true
-                }
-            })
-            .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/indexer_dao.js b/web/angular-web/src/main/webapp/app/data/dao/indexer_dao.js
deleted file mode 100644
index 18f46de..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/indexer_dao.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export class IndexerDao extends ArtifactoryDao {
-
-    constructor($resource, RESOURCE, artifactoryNotificationsInterceptor) {
-        super($resource, RESOURCE, artifactoryNotificationsInterceptor);
-
-        this.setUrl(RESOURCE.API_URL + RESOURCE.INDEXER);
-
-        this.setCustomActions({
-            'run': {
-                method: 'POST',
-                notifications: true
-            },
-            'save': {
-                method: 'PUT',
-                notifications: true
-            }
-        })
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/keystore_dao.js b/web/angular-web/src/main/webapp/app/data/dao/keystore_dao.js
deleted file mode 100644
index d4fc2ae..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/keystore_dao.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export function KeystoreDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-        .setDefaults({method: 'GET'})
-        .setPath(RESOURCE.KEYSTORE+"/:action")
-        .setCustomActions({
-            'delete':{
-                method: 'DELETE',
-                params:{'public':'@public'}
-            },
-            post:{
-                method: 'POST',
-                params:{'action':'@action'},
-                notifications: true
-            },
-            updatePassword: {
-                method: 'PUT',
-                notifications: true
-            },
-            removeKeystore: {
-                method: 'DELETE',
-                notifications: true
-            },
-            removeKeypair: {
-                method: 'DELETE',
-                params: {'name': '@name'},
-                notifications: true
-            }
-        })
-        .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/ldap_dao.js b/web/angular-web/src/main/webapp/app/data/dao/ldap_dao.js
deleted file mode 100644
index 7dc057a..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/ldap_dao.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export function LdapDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-            .setPath(RESOURCE.LDAP + "/:action/:key")
-            .setCustomActions({
-                'save':{
-                    method: 'POST'
-                },
-                'get':{
-                    method: 'GET',
-                    params: {key: '@key'}
-                },
-                'update':{
-                    method: 'PUT',
-                    params: {key: '@key'}
-                },
-                'delete':{
-                    method: 'DELETE',
-                    params: {key: '@key'}
-                },
-                'test':{
-                    method: 'POST',
-                    params: {key: '@key', action: 'test'},
-                    notifications: true
-                },
-                'reorder':{
-                    method: 'POST',
-                    path: RESOURCE.LDAP + "/reorder"
-                }
-            })
-            .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/ldap_groups_dao.js b/web/angular-web/src/main/webapp/app/data/dao/ldap_groups_dao.js
deleted file mode 100644
index bc9f0ff..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/ldap_groups_dao.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export function LdapGroupsDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-            .setPath(RESOURCE.LDAP_GROUPS + "/:name/:action/:username")
-            .setCustomActions({
-                'get':{
-                    params: {name: '@name'}
-                },
-                'update':{
-                    params: {name: '@name'}
-                },
-                'delete':{
-                    params: {name: '@name'}
-                },
-                'refresh':{
-                    method: 'POST',
-                    isArray: true,
-                    params: {name: '@name', action: 'refresh', username: '@username'},
-                    notifications: true
-                },
-                'import':{
-                    method: 'POST',
-                    params: {name: '@name', action: 'import'},
-                    notifications: true
-                },
-                'getstrategy':{
-                    method: 'GET',
-                    params: {name: '@name', action: 'strategy'}
-                }
-            })
-            .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/licenses_dao.js b/web/angular-web/src/main/webapp/app/data/dao/licenses_dao.js
deleted file mode 100644
index 73ce8db..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/licenses_dao.js
+++ /dev/null
@@ -1,36 +0,0 @@
-export class LicensesDao {
-
-    constructor(RESOURCE, ArtifactoryDaoFactory) {
-        return ArtifactoryDaoFactory()
-            .setPath(RESOURCE.LICENSES + "/:action/:name")
-            .setCustomActions({
-                'getLicense': {
-                    method: 'GET',
-                    params: {action: 'crud',name: '@name'},
-                    notifications: true,
-                    isArray: true
-                },
-                    'getSingleLicense': {
-                        method: 'GET',
-                        params: {action: 'crud',name: '@name'},
-                        notifications: true,
-                    },
-                'update': {
-                        method: 'PUT',
-                        params: {action: 'crud',name: '@name'},
-                        notifications: true,
-                },
-                'create': {
-                    method: 'POST',
-                    params: {action: 'crud',name: '@name'},
-                    notifications: true,
-                },
-                'delete': {
-                    method: 'POST',
-                    params: {action: 'deleteLicense',name: '@name'}
-                }
-
-            })
-            .getInstance();
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/mail_dao.js b/web/angular-web/src/main/webapp/app/data/dao/mail_dao.js
deleted file mode 100644
index 5df8fb5..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/mail_dao.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export class MailDao extends ArtifactoryDao{
-
-    constructor($resource, RESOURCE, artifactoryNotificationsInterceptor){
-        super($resource, RESOURCE,artifactoryNotificationsInterceptor);
-
-        this.setUrl(RESOURCE.API_URL+RESOURCE.MAIL);
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/maintenance_dao.js b/web/angular-web/src/main/webapp/app/data/dao/maintenance_dao.js
deleted file mode 100644
index 3f49b4f..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/maintenance_dao.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export function MaintenanceDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-            .setDefaults({method: 'POST'})
-            .setPath(RESOURCE.MAINTENANCE + '/:module')
-            .setCustomActions({
-                perform: {
-                    params: {module: '@module'},
-                    notifications: true
-                }
-            }).getInstance();
-}
diff --git a/web/angular-web/src/main/webapp/app/data/dao/name_validator_dao.js b/web/angular-web/src/main/webapp/app/data/dao/name_validator_dao.js
deleted file mode 100644
index 4204bfc..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/name_validator_dao.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export class NameValidatorDao extends ArtifactoryDao {
-
-    constructor($resource, RESOURCE,artifactoryNotificationsInterceptor) {
-        super($resource, RESOURCE,artifactoryNotificationsInterceptor);
-
-        this.setUrl(RESOURCE.API_URL + RESOURCE.NAME_VALIDATOR);
-        this.setCustomActions({
-            get: {
-                "params": {
-                    name: '@name'
-                }
-            }
-        })
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/data/dao/oauth_dao.js b/web/angular-web/src/main/webapp/app/data/dao/oauth_dao.js
deleted file mode 100644
index f05d103..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/oauth_dao.js
+++ /dev/null
@@ -1,40 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export function OAuthDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-            .setPath(RESOURCE.OAUTH + "/:p1/:p2/:p3/:p4")
-            .setCustomActions({
-                'get':{
-                    method: 'GET'
-                },
-                'update':{
-                    method: 'POST',
-                    notifications: true
-                },
-                'createProvider':{
-                    method: 'PUT',
-                    params: {p1: 'provider'},
-                    notifications: true
-                },
-                'updateProvider':{
-                    method: 'POST',
-                    params: {p1: 'provider'},
-                    notifications: true
-                },
-                'deleteProvider':{
-                    method: 'DELETE',
-                    params: {p1: 'provider', p2: '@provider'},
-                    notifications: true
-                },
-                'getUserTokens':{
-                    method: 'GET',
-                    isArray: true,
-                    params: {p1: 'user', p2: 'tokens'}
-                },
-                'deleteUserToken':{
-                    method: 'DELETE',
-                    params: {p1: 'user', p2: 'tokens', p3: '@username', p4: '@provider'}
-                }
-            })
-            .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/passwords_encryption_dao.js b/web/angular-web/src/main/webapp/app/data/dao/passwords_encryption_dao.js
deleted file mode 100644
index f43f422..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/passwords_encryption_dao.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export class PasswordsEncryptionDao extends ArtifactoryDao {
-
-    constructor($resource, RESOURCE, artifactoryNotificationsInterceptor) {
-        super($resource, RESOURCE,artifactoryNotificationsInterceptor);
-
-        this.setUrl(RESOURCE.API_URL + RESOURCE.CRYPTO + "/:action");
-
-        this.setCustomActions({
-            'encrypt': {
-                method: 'POST',
-                params: {action: 'encrypt'},
-                notifications: true
-            },
-
-            'decrypt': {
-                method: 'POST',
-                params: {action: 'decrypt'},
-                notifications: true
-            }
-        })
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/permissions_dao.js b/web/angular-web/src/main/webapp/app/data/dao/permissions_dao.js
deleted file mode 100644
index d0b0e65..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/permissions_dao.js
+++ /dev/null
@@ -1,40 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export class PermissionsDao extends ArtifactoryDao {
-
-    constructor($resource, RESOURCE,artifactoryNotificationsInterceptor)
-    {
-        super($resource, RESOURCE, artifactoryNotificationsInterceptor);
-
-        this.setUrl(RESOURCE.API_URL + RESOURCE.TARGET_PERMISSIONS + '/:action/:name');
-
-        this.setCustomActions({
-            getAll: {
-                method: 'GET',
-                isArray: true,
-                params: {action: 'crud'}
-            },
-            getAllUsersAndGroups: {
-                method: 'GET',
-                params: {action: 'allUsersGroups'}
-            },
-            getPermission: {
-                method: 'GET',
-                params: {name: '@name', action: 'crud'}
-            },
-            deletePermission: {
-                method: 'POST',
-                params: {action:'deleteTargetPermissions'},
-                notifications: true
-            },
-            update: {
-                method: 'PUT',
-                params: {name: '@name'}
-            },
-            create: {
-                method: 'POST',
-                notifications: true
-            }
-        });
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/predefine_values_dao.js b/web/angular-web/src/main/webapp/app/data/dao/predefine_values_dao.js
deleted file mode 100644
index bb6645b..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/predefine_values_dao.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export class PredefineDao extends ArtifactoryDao {
-
-    constructor($resource, RESOURCE,ArtifactoryDaoFactory) {
-        super($resource, RESOURCE,ArtifactoryDaoFactory);
-
-        this.setUrl(RESOURCE.API_URL + RESOURCE.PREDEFINE_VALUES + "/:name");
-        this.setCustomActions({
-            'get': {
-                params: {name: "@name"}
-            }
-        })
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/property_sets_dao.js b/web/angular-web/src/main/webapp/app/data/dao/property_sets_dao.js
deleted file mode 100644
index 67cf414..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/property_sets_dao.js
+++ /dev/null
@@ -1,83 +0,0 @@
-export function PropertySetsDao(ArtifactoryDaoFactory, RESOURCE) {
-    return ArtifactoryDaoFactory()
-    	.setPath(RESOURCE.PROPERTY_SETS + "/:action/:name")
-        .setCustomActions({
-            'get': {
-                params: {name: '@name'}
-            },
-            'update': {
-                params: {name: '@name'}
-            },
-            'delete': {
-                method: 'POST',
-                params: {action: 'deletePropertySet'}
-            },
-                'query': {
-                    isArray: true,
-                    params: {name: '@name', isRepoForm: '@isRepoForm'}
-                }
-            })
-    	.getInstance();
-}
-
-
-export class Property {
-    constructor(data) {
-        data = data || {};
-        data.propertyType = data.propertyType || "ANY_VALUE";
-
-        data.predefinedValues = data.predefinedValues || [];
-        angular.extend(this, data);
-    }
-    getDisplayType() {
-        let type = Property.propertyTypesMap[this.propertyType];
-        return type ? type.text : null;
-    }
-    getDefaultValues() {
-        return _.where(this.predefinedValues, {defaultValue: true});
-    }
-
-    getPredefinedValue(value) {
-        return _.findWhere(this.predefinedValues, {value: value});
-    }
-    addPredefinedValue(newValue) {
-        this.predefinedValues.push({value: newValue, defaultValue: false});
-    }
-}
-
-// Create an array and map of types for easy access
-let anyValue = {value: 'ANY_VALUE', text: 'Any Value'};
-let singleSelect = {value: 'SINGLE_SELECT', text: 'Single Select'};
-let multiSelect = {value: 'MULTI_SELECT', text: 'Multi Select'};
-
-Property.propertyTypes = [anyValue, singleSelect, multiSelect];
-Property.propertyTypesMap = {
-    ANY_VALUE: anyValue,
-    SINGLE_SELECT: singleSelect,
-    MULTI_SELECT: multiSelect
-};
-
-export function PropertyFactory() {
-    return Property;
-}
-
-export class PropertySet {
-    constructor(data) {
-        data = data || {};
-        data.properties = data.properties || [];
-        angular.extend(this, data);
-        this.properties = this.properties.map((property) => new Property(property));
-    }
-    getPropertyByName(propertyName) {
-        return _.findWhere(this.properties, {name: propertyName});
-    }
-    addProperty(property) {
-        this.properties.push(property);
-    }
-    removeProperty(propertyName) {
-        _.remove(this.properties, {name: propertyName});
-    }
-}
-export function PropertySetFactory() {
-    return PropertySet;
-}
diff --git a/web/angular-web/src/main/webapp/app/data/dao/proxies_dao.js b/web/angular-web/src/main/webapp/app/data/dao/proxies_dao.js
deleted file mode 100644
index e8aba81..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/proxies_dao.js
+++ /dev/null
@@ -1,24 +0,0 @@
-export function ProxiesDao(RESOURCE, ArtifactoryDaoFactory) {
-	return ArtifactoryDaoFactory()
-    	.setPath(RESOURCE.PROXIES + "/:prefix/:key")
-        .setCustomActions({
-            'delete': {
-                method : 'POST',
-                params: {prefix: 'deleteProxies'}
-            },
-            'update': {
-                method : 'PUT',
-                params :{prefix: 'crud', key :'@key'}
-            },
-            'get': {
-                method : 'GET',
-                params :{prefix: 'crud', key :'@key'},
-                isArray: true
-            },
-                'getSingleProxy': {
-                    method: 'GET',
-                    params: {prefix: 'crud', key: '@key'}
-            }
-        })
-        .getInstance();
-}
diff --git a/web/angular-web/src/main/webapp/app/data/dao/push_to_bintray_dao.js b/web/angular-web/src/main/webapp/app/data/dao/push_to_bintray_dao.js
deleted file mode 100644
index 12f4ae9..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/push_to_bintray_dao.js
+++ /dev/null
@@ -1,39 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export function PushToBintrayDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-        .setPath(RESOURCE.PUSH_TO_BINTRAY + "/:param1/:param2/:param3/:param4")
-        .setCustomActions({
-            'getBuildRepos': {
-                method: 'GET'
-            },
-            'getBuildPacks': {
-                method: 'GET',
-                params: {param1: 'build', param2: 'pkg'}
-            },
-            'getBuildVersions': {
-                method: 'GET',
-                params: {param1: 'build', param2: 'versions'}
-            },
-            'pushBuildToBintray': {
-                method: 'POST',
-                notifications: true,
-                params: {param1: 'build', param2: '@buildName', param3: '@buildNumber', param4: '@buildTime'}
-            },
-            'getArtifactData': {
-                method: 'GET',
-                params: {param1: 'artifact'}
-            },
-            'pushArtifactToBintray': {
-                method: 'POST',
-                notifications: true,
-                params: {param1: 'artifact', param2: '@repoKey', param3: '@path'}
-            },
-            'pushDockerTagToBintray': {
-                method: 'POST',
-                notifications: true,
-                params: {param1: 'dockerTag', param2: '@repoKey', param3: '@path'}
-            }
-        })
-        .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/register_pro_dao.js b/web/angular-web/src/main/webapp/app/data/dao/register_pro_dao.js
deleted file mode 100644
index c03602a..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/register_pro_dao.js
+++ /dev/null
@@ -1,11 +0,0 @@
-export function RegisterProDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-            .setPath(RESOURCE.REGISTER_PRO)
-            .setCustomActions({
-                'update': {
-                    notifications: true
-                }
-
-            })
-            .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/repo_data_dao.js b/web/angular-web/src/main/webapp/app/data/dao/repo_data_dao.js
deleted file mode 100644
index f2363d8..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/repo_data_dao.js
+++ /dev/null
@@ -1,27 +0,0 @@
-export function RepoDataDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-            .setPath(RESOURCE.REPO_DATA)
-            .setCustomActions({
-                getAllForPerms: {
-                    method: 'GET'
-                },
-                getAll: {
-                    method: 'GET',
-                    isArray: true,
-                    path: RESOURCE.REPO_DATA + "?user=true"
-                },
-                getForSearch: {
-                    method: 'GET',
-                    path: RESOURCE.REPO_DATA + "?search=true"
-                },
-                getForBackup: {
-                    method: 'GET',
-                    path: RESOURCE.REPO_DATA + "?backup=true"
-                },
-                getForPackageSearch: {
-                    method: 'GET',
-                    path: RESOURCE.REPO_DATA + "?packageSearch=true"
-                }
-            })
-            .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/repo_property_set_dao.js b/web/angular-web/src/main/webapp/app/data/dao/repo_property_set_dao.js
deleted file mode 100644
index ff817e5..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/repo_property_set_dao.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export class RepoPropertySetDao extends ArtifactoryDao {
-
-    constructor($resource, RESOURCE,ArtifactoryDaoFactory) {
-        super($resource, RESOURCE,ArtifactoryDaoFactory);
-
-        this.setUrl(RESOURCE.API_URL + RESOURCE.REPO_PROPERTY_SET)
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/repositories_dao.js b/web/angular-web/src/main/webapp/app/data/dao/repositories_dao.js
deleted file mode 100644
index 7e35be6..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/repositories_dao.js
+++ /dev/null
@@ -1,134 +0,0 @@
-export function RepositoriesDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-            .setPath(RESOURCE.REPOSITORIES)
-            .setCustomActions({
-                getRepositories: {
-                    method: 'GET',
-                    path: RESOURCE.REPOSITORIES + '/:type/info',
-                    isArray: true,
-                    params: {type: '@repoType'}
-                },
-                getRepository: {
-                    method: 'GET',
-                    path: RESOURCE.REPOSITORIES + '/:type/:repoKey',
-                    params: {type: '@repoType', repoKey: '@repoKey'}
-                },
-                deleteRepository: {
-                    method: 'DELETE',
-                    path: RESOURCE.REPOSITORIES + '/:repoKey', params: {repoKey: '@repoKey'},
-                    notifications: true
-                },
-                getAvailableChoicesOptions: {
-                    method: 'GET',
-                    path: RESOURCE.REPOSITORIES + '/availablechoices'
-                },
-                getDefaultValues: {
-                    method: 'GET',
-                    path: RESOURCE.REPOSITORIES + '/defaultvalues'
-                },
-                repoKeyValidator: {
-                    method: 'GET',
-                    path: RESOURCE.REPOSITORIES + '/validatereponame'
-                },
-                testRemoteUrl: {
-                    method: 'POST',
-                    path: RESOURCE.REPOSITORIES + '/testremote',
-                    notifications: true
-                },
-                detectSmartRepository: {
-                    method: 'POST',
-                    path: RESOURCE.REPOSITORIES + '/discoversmartrepocapabilities',
-                },
-                testLocalReplication: {
-                    method: 'POST',
-                    path: RESOURCE.REPOSITORIES + '/testlocalreplication',
-                    notifications: true
-                },
-                testRemoteReplication: {
-                    method: 'POST',
-                    path: RESOURCE.REPOSITORIES + '/testremotereplication',
-                    notifications: true
-                },
-                executeReplicationNow: {
-                    method: 'POST',
-                    path: RESOURCE.REPOSITORIES + '/executereplicationnow',
-                    params: {replicationUrl: '@replicationUrl', repoKey: '@repoKey'},
-                    notifications: true
-                },
-                executeRemoteReplicationNow: {
-                    method: 'POST',
-                    path: RESOURCE.REPOSITORIES + '/exeucteremotereplication',
-                    params: {replicationUrl: '@replicationUrl', repoKey: '@repoKey'},
-                    notifications: true
-                },
-                runNowReplications: {
-                    method: 'POST',
-                    path: RESOURCE.REPOSITORIES + '/executeall', params: {repoKey: '@repoKey'},
-                    notifications: true
-                },
-                remoteUrlToRepoMap: {
-                    method: 'GET',
-                    path: RESOURCE.REPOSITORIES + '/remoteUrlMap'
-                },
-                availableRepositoriesByType: {
-                    method: 'GET',
-                    params: {type: '@type', repoKey: '@repoKey'},
-                    path: RESOURCE.REPOSITORIES + '/availablerepositories'
-                },
-                indexerAvailableRepositories: {
-                    method: 'GET',
-                    params: {type: '@type', layout: '@layout'},
-                    path: RESOURCE.REPOSITORIES + '/indexeravailablerepositories'
-                },
-                getResolvedRepositories: {
-                    method: 'POST',
-                    isArray: true,
-                    params: {type: '@repoType', repoKey: '@repoKey'},
-                    path: RESOURCE.REPOSITORIES + '/resolvedrepositories'
-                },
-                isReplicationValid: {
-                    method: 'POST',
-                    path: RESOURCE.REPOSITORIES + '/validatelocalreplication',
-                    notifications: true
-                },
-                reorderRepositories: {
-                    method: 'POST',
-                    path: RESOURCE.REPOSITORIES + '/:repoType/reorderrepositories',
-                    params: {
-                        repoType: '@repoType',
-                        $no_spinner: true
-                    }
-                },
-                createDefaultJcenterRepo: {
-                    method: 'POST',
-                    path: RESOURCE.REPOSITORIES + '/createdefaultjcenterrepo',
-                    notifications: true,
-                    params: {
-                        $no_spinner: false
-                    }
-                },
-                isJcenterRepoConfigured: {
-                    method: 'GET',
-                    path: RESOURCE.REPOSITORIES + '/isjcenterconfigured',
-                    notifications: false,
-                    params: {
-                        $no_spinner: true
-                    }
-                },
-                saveBintrayOauthConfig: {
-                    method: 'PUT',
-                    path: RESOURCE.REPOSITORIES + '/savebintrayoauthconfig',
-                    notifications: true
-                }
-            })
-            .extendPrototype({
-                isType: function (...types) {
-                    return this.typeSpecific && this.typeSpecific.repoType && _.contains(types,
-                                    this.typeSpecific.repoType.toLowerCase());
-                },
-                isGitProvider: function (gitProvider) {
-                    return this.typeSpecific && this.typeSpecific.gitProvider && gitProvider == this.typeSpecific.gitProvider.toLowerCase();
-                }
-            })
-            .getInstance();
-}
diff --git a/web/angular-web/src/main/webapp/app/data/dao/repositories_layouts_dao.js b/web/angular-web/src/main/webapp/app/data/dao/repositories_layouts_dao.js
deleted file mode 100644
index 7331597..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/repositories_layouts_dao.js
+++ /dev/null
@@ -1,30 +0,0 @@
-export function RepositoriesLayoutsDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-        .setPath(RESOURCE.REPOSITORIES_LAYOUTS + '/:action/:name')
-        .setCustomActions({
-            getLayouts: {
-                method: 'GET',
-                isArray: true
-            },
-            getLayoutData: {
-                method: 'GET',
-                params: {name: '@layoutName'}
-            },
-            deleteLayout: {
-                method: 'DELETE',
-                params: {name: '@layoutName'},
-                notifications: true
-            },
-            testArtifactPath: {
-                method: 'POST',
-                params: {action: 'testArtPath'},
-                notifications: true
-            },
-            resolveRegex: {
-                method: 'POST',
-                params: {action: 'resolveRegex'}
-            }
-
-        })
-        .getInstance();
-}
diff --git a/web/angular-web/src/main/webapp/app/data/dao/reverse_proxies_dao.js b/web/angular-web/src/main/webapp/app/data/dao/reverse_proxies_dao.js
deleted file mode 100644
index 7b36343..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/reverse_proxies_dao.js
+++ /dev/null
@@ -1,23 +0,0 @@
-export function ReverseProxiesDao(RESOURCE, ArtifactoryDaoFactory) {
-	return ArtifactoryDaoFactory()
-    	.setPath(RESOURCE.REVERSE_PROXIES + "/:prefix/:key")
-        .setCustomActions({
-            'delete': {
-                method : 'POST',
-                params: {prefix: 'deleteReverseProxies'}
-            },
-            'update': {
-                method : 'PUT',
-                params :{prefix: 'crud', key :'@key'}
-            },
-            'get': {
-                method : 'GET',
-                params :{prefix: 'crud', key :'@key'}
-            },
-            'checkPort': {
-                    method: 'GET',
-                    params: {prefix: 'checkPort', key: '@port'}
-            }
-        })
-        .getInstance();
-}
diff --git a/web/angular-web/src/main/webapp/app/data/dao/saml_dao.js b/web/angular-web/src/main/webapp/app/data/dao/saml_dao.js
deleted file mode 100644
index 088bc23..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/saml_dao.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export function SamlDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-            .setPath(RESOURCE.SAML_CONFIG)
-}
-
-
-/*  OLLLLLLLLLDDDDDD - (should be removed)
-export class SamlDao extends ArtifactoryDao {
-
-    constructor($resource, RESOURCE,ArtifactoryDaoFactory) {
-        super($resource, RESOURCE,ArtifactoryDaoFactory);
-
-        this.setUrl(RESOURCE.API_URL + RESOURCE.SAML)
-    }
-}
-*/
diff --git a/web/angular-web/src/main/webapp/app/data/dao/security_descriptor_dao.js b/web/angular-web/src/main/webapp/app/data/dao/security_descriptor_dao.js
deleted file mode 100644
index e8adc52..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/security_descriptor_dao.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export class SecurityDescriptorDao extends ArtifactoryDao {
-
-    constructor($resource, RESOURCE, artifactoryNotificationsInterceptor) {
-        super($resource, RESOURCE,artifactoryNotificationsInterceptor);
-
-        this.setUrl(RESOURCE.API_URL + RESOURCE.SECURITY_DESCRIPTOR);
-
-        this.setCustomActions({
-            'get': {
-                method: 'GET',
-                notifications: true
-            },
-            'update': {
-                method: 'PUT',
-                notifications: true
-            }
-        });
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/server_time_dao.js b/web/angular-web/src/main/webapp/app/data/dao/server_time_dao.js
deleted file mode 100644
index f9bd1cb..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/server_time_dao.js
+++ /dev/null
@@ -1,10 +0,0 @@
-export function ServerTimeDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-            .setPath(RESOURCE.SERVER_TIME)
-            .setCustomActions({
-            	'get': {
-                    method: 'GET'
-				}
-            })
-            .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/set_me_up_dao.js b/web/angular-web/src/main/webapp/app/data/dao/set_me_up_dao.js
deleted file mode 100644
index 4252624..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/set_me_up_dao.js
+++ /dev/null
@@ -1,41 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export function SetMeUpDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-        .setDefaults({method: 'GET'})
-        .setPath(RESOURCE.SET_ME_UP)
-        .setCustomActions({
-            fetch: {
-                notifications: true
-            },
-            maven : {
-                path : RESOURCE.SET_ME_UP_MAVEN
-            },
-            gradle : {
-                path : RESOURCE.SET_ME_UP_GRADLE
-            },
-            ivy : {
-                path : RESOURCE.SET_ME_UP_IVY
-            },
-            maven_distribution : {
-              path : RESOURCE.SET_ME_UP_MAVEN_DISTRIBUTION,
-              method : "GET"
-            },
-            maven_snippet : {
-                path : RESOURCE.SET_ME_UP_MAVEN_SNIPPET,
-                method : "POST"
-            },
-            gradle_snippet : {
-                path : RESOURCE.SET_ME_UP_GRADLE_SNIPPET,
-                method : "POST"
-            },
-            ivy_snippet : {
-                path : RESOURCE.SET_ME_UP_IVY_SNIPPET,
-                method : "POST"
-            },
-            reverse_proxy_data : {
-                path : RESOURCE.SET_ME_UP_REVERSE_PROXY_DATA,
-                method : "GET"
-            }
-        }).getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/signing_keys_dao.js b/web/angular-web/src/main/webapp/app/data/dao/signing_keys_dao.js
deleted file mode 100644
index 39f07b0..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/signing_keys_dao.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export function SigningKeysDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-        .setDefaults({method: 'GET'})
-        .setPath(RESOURCE.SIGNINGKEYS + "/:action")
-        .setCustomActions({
-            'delete': {
-                method: 'DELETE',
-                params: {'public': '@public'}
-            },
-            post: {
-                method: 'POST',
-                params: {'action': '@action'},
-                notifications: true
-            },
-            postWithoutNotifications: {
-                method: 'POST',
-                params: {action: '@action'},
-                notifications: false
-            },
-            put: {
-                method: 'PUT',
-                params: {'action': '@action'},
-                notifications: true
-            }
-        })
-        .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/ssh_client_dao.js b/web/angular-web/src/main/webapp/app/data/dao/ssh_client_dao.js
deleted file mode 100644
index 76b4264..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/ssh_client_dao.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export function SshClientDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-        .setDefaults({method: 'POST'})
-        .setPath(RESOURCE.SSH_CLIENT)
-        .setCustomActions({
-            fetch: {
-                notifications: true
-            }
-        }).getInstance();
-}
diff --git a/web/angular-web/src/main/webapp/app/data/dao/ssh_server_dao.js b/web/angular-web/src/main/webapp/app/data/dao/ssh_server_dao.js
deleted file mode 100644
index e34953c..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/ssh_server_dao.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export class SshServerDao extends ArtifactoryDao {
-
-    constructor($resource, RESOURCE,artifactoryNotificationsInterceptor) {
-        super($resource, RESOURCE,artifactoryNotificationsInterceptor);
-
-        this.setUrl(RESOURCE.API_URL + RESOURCE.SSHSERVER)
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/stash_results_dao.js b/web/angular-web/src/main/webapp/app/data/dao/stash_results_dao.js
deleted file mode 100644
index 168c9e5..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/stash_results_dao.js
+++ /dev/null
@@ -1,62 +0,0 @@
-export function StashResultsDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-            .setDefaults({method: 'GET'})
-            .setPath(RESOURCE.STASH_RESULTS)
-            .setCustomActions({
-                'get': {
-                    method: 'GET',
-                    isArray: true
-                },
-                'save': {
-                    method: 'POST',
-                    notifications: true
-                },
-                'delete': {
-                    method: 'DELETE'
-                },
-                'add': {
-                    path: RESOURCE.STASH_RESULTS + "/add",
-                    notifications: true,
-                    method: 'POST'
-                },
-                'subtract': {
-                    path: RESOURCE.STASH_RESULTS + "/subtract",
-                    notifications: true,
-                    method: 'POST'
-                },
-                'intersect': {
-                    path: RESOURCE.STASH_RESULTS + "/intersect",
-                    notifications: true,
-                    method: 'POST'
-                },
-                'export': {
-                    path: RESOURCE.STASH_RESULTS + "/export",
-                    notifications: true,
-                    method: 'POST'
-                },
-                'discard': {
-                    path: RESOURCE.STASH_RESULTS + "/discard",
-                    notifications: true,
-                    method: 'POST'
-                },
-                'copy': {
-                    path: RESOURCE.STASH_RESULTS + "/copy",
-                    notifications: true,
-                    method: 'POST'
-                },
-                'move': {
-                    path: RESOURCE.STASH_RESULTS + "/move",
-                    notifications: true,
-                    method: 'POST'
-                },
-                'silentCopy': {
-                    path: RESOURCE.STASH_RESULTS + "/copy",
-                    method: 'POST'
-                },
-                'silentMove': {
-                    path: RESOURCE.STASH_RESULTS + "/move",
-                    method: 'POST'
-                }
-            })
-            .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/storage_summary_dao.js b/web/angular-web/src/main/webapp/app/data/dao/storage_summary_dao.js
deleted file mode 100644
index bd0d2fb..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/storage_summary_dao.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export class StorageSummaryDao extends ArtifactoryDao {
-
-    constructor($resource, RESOURCE,artifactoryNotificationsInterceptor) {
-        super($resource, RESOURCE,artifactoryNotificationsInterceptor);
-
-        this.setUrl(RESOURCE.API_URL + RESOURCE.STORAGE_SUMMARY)
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/support_page_dao.js b/web/angular-web/src/main/webapp/app/data/dao/support_page_dao.js
deleted file mode 100644
index c754b90..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/support_page_dao.js
+++ /dev/null
@@ -1,21 +0,0 @@
-export function SupportPageDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-            .setPath(RESOURCE.SUPPORT_PAGE + '/:action/:filename')
-            .setCustomActions({
-                'generateBundle': {
-                    method: 'POST',
-                    isArray: true,
-                    params: {action: 'generateBundle'}
-                },
-                'listBundles': {
-                    method: 'GET',
-                    isArray: true,
-                    params: {action: 'listBundles'}
-                },
-                'deleteBundle': {
-                    method: 'DELETE',
-                    params: {action: 'deleteBundle', filename: '@filename'}
-                }
-            })
-            .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/system_info_dao.js b/web/angular-web/src/main/webapp/app/data/dao/system_info_dao.js
deleted file mode 100644
index 13702d6..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/system_info_dao.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export class SystemInfoDao extends ArtifactoryDao{
-
-    constructor($resource, RESOURCE,artifactoryNotificationsInterceptor) {
-        super($resource, RESOURCE,artifactoryNotificationsInterceptor);
-
-        this.setUrl(RESOURCE.API_URL+RESOURCE.SYSTEM_INFO);
-    }
-}
-
-
-
diff --git a/web/angular-web/src/main/webapp/app/data/dao/system_logs_dao.js b/web/angular-web/src/main/webapp/app/data/dao/system_logs_dao.js
deleted file mode 100644
index c0fa9a4..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/system_logs_dao.js
+++ /dev/null
@@ -1,20 +0,0 @@
-export function SystemLogsDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-        .setDefaults({method: 'GET'})
-        .setPath(RESOURCE.SYSTEM_LOGS + "/:action")
-        .setCustomActions({
-            'getLogs': {
-                method: 'GET',
-                params: {action: 'initialize'}
-            },
-            'getLogData': {
-                method: 'GET',
-                params: {action: 'logData'}
-            },
-            'getDownloadLink': {
-                method: 'GET',
-                params: {action: 'downloadFile'}
-            }
-        })
-        .getInstance();
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/tree_browser_dao.js b/web/angular-web/src/main/webapp/app/data/dao/tree_browser_dao.js
deleted file mode 100644
index c2fde31..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/tree_browser_dao.js
+++ /dev/null
@@ -1,80 +0,0 @@
-const ARCHIVE_MARKER = '!';
-const COMPACT_FOLDERS_KEY = 'COMPACT_FOLDERS';
-
-export class TreeBrowserDao {
-    constructor(RESOURCE, ArtifactoryHttpClient, $q, $injector, ArtifactoryStorage) {
-        this.$q = $q;
-        this.TreeNode = $injector.get('TreeNode');
-        this.RESOURCE = RESOURCE;
-        this.artifactoryHttpClient = ArtifactoryHttpClient;
-        this.artifactoryStorage = ArtifactoryStorage;
-        this.compactFolders = ArtifactoryStorage.getItem(COMPACT_FOLDERS_KEY, /* defaultValue = */ true);
-        this.roots = null;
-    }
-
-    setCompactFolders(value) {
-        this.compactFolders = value;
-        this.artifactoryStorage.setItem(COMPACT_FOLDERS_KEY, this.compactFolders);
-    }
-
-    getCompactFolders() {
-        return this.compactFolders;
-    }
-
-    // get all repositories (roots) and cache them
-    // or return the cached promise
-    getRoots(force = false) {
-        if (force || !this.roots) {
-            this.roots = this._loadChildren({type: 'root'});
-        }
-        return this.roots;
-    }
-
-    // invalidate the cached promise
-    invalidateRoots() {
-        this.roots = null;
-    }
-
-    findRepo(repoKey) {
-        return this.getRoots().then((roots) => {
-            return _.findWhere(roots, {repoKey: repoKey});
-        });
-    }
-
-    findNodeByFullPath(path, includeArchives = true) {
-        if (typeof(path) === 'string') path = path.split('/');
-        path = path.map((pathElement) => _.trimRight(pathElement, ARCHIVE_MARKER));
-        if (!path.length) return this.$q.when(null);
-        let pathElement = path.shift();
-        // Find child:
-        return this.getRoots().then((roots) => {
-            return _.findWhere(roots, {text: pathElement});
-        })
-        .then((root) => {
-        // Recursively look for rest of fullpath:
-            if (root) return root.findNodeByPath(path, 0, includeArchives);
-            else return this;
-        }).catch(() => null);
-    }
-
-    _loadChildren(node, parent) {
-        let compact = this.compactFolders && !node.trashcan; //Don't compact the repos level under trashcan
-        return this.artifactoryHttpClient.post(this.RESOURCE.TREE_BROWSER + '?compacted=' + (compact), node)
-                .then(result => this._transformData(result.data, parent));
-
-    }
-
-    // Wrap with TreeNode
-    // Recursively go over children if exist
-    // Assign the parent node
-    _transformData(data, parent) {
-        return data.map((node) => {
-            node = new this.TreeNode(node);
-            node.parent = parent;
-            if (_.isArray(node.children)) {
-                node.children = this.$q.when(this._transformData(node.children, node));
-            }
-            return node;
-        });
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/tree_node.js b/web/angular-web/src/main/webapp/app/data/dao/tree_node.js
deleted file mode 100644
index 3ccdd6c..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/tree_node.js
+++ /dev/null
@@ -1,265 +0,0 @@
-const ARCHIVE_MARKER = '!';
-
-export function TreeNodeFactory($q, $injector, RESOURCE, ArtifactoryHttpClient, ArtifactWatchesDao, ArtifactActionsDao, NativeBrowser) {
-    return function(data) {
-        return new TreeNode(data, $q, $injector, RESOURCE, ArtifactoryHttpClient, ArtifactWatchesDao, ArtifactActionsDao, NativeBrowser)
-    }
-}
-
-class TreeNode {
-    constructor(data, $q, $injector, RESOURCE, ArtifactoryHttpClient, ArtifactWatchesDao, ArtifactActionsDao, NativeBrowser) {
-        this.$q = $q;
-        this.treeBrowserDao = $injector.get('TreeBrowserDao');
-        this.RESOURCE = RESOURCE;
-        this.artifactoryHttpClient = ArtifactoryHttpClient;
-        this.artifactWatchesDao = ArtifactWatchesDao;
-        this.artifactActionsDao = ArtifactActionsDao;
-        this.nativeBrowser = NativeBrowser;
-
-        // Wrap the data
-        angular.extend(this, data);
-
-        if (this.children) {
-            this.hasChild = true;
-        }
-        this._initIconType();
-        this._initFullpath();
-
-        this.className = 'TreeNode';
-    }
-    _initIconType() {
-        if (!this.icon && this.compacted && this.isLocalFolder()) {
-            this.iconType = 'compactedFolder';
-        }
-        else if (this.isTrashcan()) {
-            this.iconType = 'trashcan';
-        }
-        else if (this.isRepoInTrashcan()) {
-            this.iconType = 'localRepository';
-        }
-        else if (this.isRepo()) {
-            switch(this.repoType) {
-                case 'virtual':
-                    this.iconType = 'virtualRepository';
-                    break;
-                case 'distribution':
-                    this.iconType = 'distributionRepository';
-                    break;
-                case 'remote':
-                    this.iconType = 'remoteRepository';
-                    break;
-                case 'cached':
-                    this.iconType = 'cachedRepository';
-                    break;
-                default:
-                    this.iconType = 'localRepository';
-            }
-        }
-        else {
-            this.iconType = this.mimeType || this.icon || this.type;
-        }
-
-    }
-
-    _initFullpath() {
-        if (this.path == '') {
-            this.fullpath = this.repoKey;
-        }
-        else {
-            let path = this.path;
-            if (this.archivePath) {
-                path = path.replace(this.archivePath, this.archivePath + ARCHIVE_MARKER);
-            }
-            this.fullpath = this.repoKey + "/" + path;
-        }
-    }
-
-    getRoot() {
-        return this.parent ? this.parent.getRoot() : this;
-    }
-
-    findNodeByPath(path, startIndex, includeArchives = true) {
-        if (startIndex === path.length) return this;
-        if (this.isArchive() && !includeArchives) return this;
-        // Find child:
-        return this.getChildren().then((children) => {
-            while(startIndex != path.length) {
-                startIndex++;
-                let partialPath = path.slice(0, startIndex).join('/');
-                // TODO: remove second condition after Chen fixes server. Currently sometimes server returns path that ends with '/'
-                let child = _.findWhere(children, {path: partialPath}) || _.findWhere(children, {path: partialPath + '/'});
-                if (child) return child;
-            }
-        })
-        .then((child) => {
-        // Recursively look for rest of path:
-            if (child) return child.findNodeByPath(path, startIndex, includeArchives);
-            else return this;
-        }).catch(() => this);
-    }
-
-    isLocal() {
-        return this.local;
-    }
-
-    isFile() {
-        return this.type == 'file' || this.type == 'virtualRemoteFile';
-    }
-
-    isLocalFolder() {
-        return this.type == 'folder';
-    }
-
-    isFolder() {
-        return this.isLocalFolder() || this.type === 'virtualRemoteFolder';
-    }
-
-    isRepo() {
-        return this.type === 'repository' || this.type === 'virtualRemoteRepository';
-    }
-
-    isTrashcan() {
-        return this.isRepo() && this.repoType === 'trash';
-    }
-
-    isInTrashcan() {
-        return !this.isRepo() && this.repoType === 'trash';
-    }
-
-    isRepoInTrashcan() {
-        return this.isInTrashcan() && !_.contains(this.path,'/');
-    }
-
-    isArchive() {
-        return this.type === 'archive';
-    }
-
-    isInsideArchive() {
-        return this.archivePath;
-    }
-
-    // If tabs or actions don't exist already - fetch them from the server
-    load() {
-
-        if (this.tabs || this.actions) {
-            return this.$q.when(this);
-        }
-        else {
-            let data = {
-                type: this.type,
-                path: this.path,
-                repoKey: this.repoKey,
-                repoType: this.repoType,
-                text: this.text
-            };
-            return this.artifactoryHttpClient.post(this.RESOURCE.TREE_BROWSER, data)
-                    .then((response) => {
-                        this.tabs = response.data[0].tabs;
-                        this.actions = response.data[0].actions;
-
-                        let removeIndex = this.actions.indexOf(_.findWhere(this.actions, {name: "NativeBrowser"}));
-                        if (removeIndex !== -1) this.actions.splice(removeIndex,1);
-
-                        let index = this.actions.indexOf(_.findWhere(this.actions, {name: "Watch"}));
-                        if (index===-1) index = this.actions.indexOf(_.findWhere(this.actions, {name: "Unwatch"}));
-                        if (index===-1) index = this.actions.indexOf(_.findWhere(this.actions, {name: "Move"}));
-                        if (index===-1) index = this.actions.indexOf(_.findWhere(this.actions, {name: "Refresh"}));
-                        if (this.nativeBrowser.isAllowed(this)) this.actions.splice(index+1,0,{
-                            icon: "icon-simple-browser",
-                            name: "NativeBrowser",
-                            title: "Native Browser"
-                        });
-
-                        if (this.isInTrashcan()) {
-                            let deleteAction = _.findWhere(this.actions,{name: "Delete"});
-                            if (deleteAction) {
-                                deleteAction.name = "DeletePermanently";
-                            }
-                        }
-
-                        let distAction = _.findWhere(this.actions, {name: 'Distribute'});
-                        if (distAction && this.repoType === 'distribution') {
-                            distAction.name = 'Redistribute';
-                        }
-
-
-                        return this;
-                    });
-        }
-
-    }
-
-    getDownloadPath() {
-        if (!this.downloadPathPromise) {
-            let data = {
-                repoKey: this.repoKey,
-                path: this.downloadPath || this.path
-            };
-            this.downloadPathPromise = this.artifactActionsDao.perform({action: 'download'}, data).$promise
-                .then((response) => {
-                    return this.actualDownloadPath = response.data.path;
-                });
-        }
-        return this.downloadPathPromise;
-    }
-
-    refreshWatchActions() {
-         // Can't watch archive / remote files
-        if (!this.isInsideArchive() && this.isLocal() && !this.isTrashcan() && !this.isInTrashcan()) {
-            return this.artifactWatchesDao.status({repoKey: this.repoKey, path: this.path})
-                .$promise.then((action) => {
-//                    console.log(action);
-                    let previousAction = this._getWatchAction();
-                    if (action && action.name) {
-                        // Replace the previous action with the new one
-                        if (previousAction) previousAction.name = action.name;
-                        // Or add the new one if didn't exist before
-                        else this.actions.push(action);
-                    }
-                    else {
-                        // Remove the previous action if there is no new action
-                        if (previousAction) _.remove(this.actions, previousAction);
-                    }
-                    return this;
-                });
-        }
-        else {
-            return this.$q.when(this);
-        }
-    }
-    _getWatchAction() {
-        return _.find(this.actions, (action) => {
-            return _.contains(['Watch', 'Unwatch'], action.name);
-        });
-    }
-
-
-    invalidateChildren() {
-        this.children = null;
-    }
-
-    invalidateParent() {
-        if (this.parent) {
-            this.parent.invalidateChildren();
-        }
-        else {
-            this.treeBrowserDao.invalidateRoots();
-        }
-    }
-
-    // Get the children of this node and cache the result
-    // or return the cached promise
-    getChildren(force = false) {
-        // Server errors if requesting children of file
-        // (simple browser always requests getChildren of current node)
-        if (this.isFile()) {
-            return this.$q.when(null);
-        }
-
-        if (!this.children || (force && !this.isInsideArchive()) || this.isTrashcan()) {
-            // Load children from server, and cache them
-            this.children = this.treeBrowserDao._loadChildren({type: "junction", repoType: this.repoType, repoKey: this.repoKey, path: this.path, text: this.text, trashcan: this.isTrashcan()}, this);
-        }
-        return this.children;
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/data/dao/unique_id_validator_dao.js b/web/angular-web/src/main/webapp/app/data/dao/unique_id_validator_dao.js
deleted file mode 100644
index 7fc9adc..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/unique_id_validator_dao.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export class UniqueIdValidatorDao extends ArtifactoryDao {
-
-    constructor($resource, RESOURCE, artifactoryNotificationsInterceptor) {
-        super($resource, RESOURCE, artifactoryNotificationsInterceptor);
-
-        this.setUrl(RESOURCE.API_URL + RESOURCE.UNIQUE_ID_VALIDATOR);
-        this.setCustomActions({
-            get: {
-                "params": {
-                    id: '@id'
-                }
-            }
-        })
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/data/dao/user_dao.js b/web/angular-web/src/main/webapp/app/data/dao/user_dao.js
deleted file mode 100644
index c73b230..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/user_dao.js
+++ /dev/null
@@ -1,73 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export class UserDao extends ArtifactoryDao {
-
-    constructor($resource, RESOURCE,artifactoryNotificationsInterceptor) {
-        super($resource, RESOURCE,artifactoryNotificationsInterceptor);
-
-        this.setUrl(RESOURCE.API_URL + RESOURCE.USERS + '/:prefix/:name');
-
-        this.setCustomActions({
-            'getAll': {
-                method: 'GET',
-                params: {prefix: 'crud'},
-                isArray: true
-            },
-            'getSingle': {
-                method: 'GET',
-                params: {name: '@name', prefix: 'crud'}
-            },
-            'create': {
-                method: 'POST',
-                notifications: true
-            },
-            'update': {
-                method: 'PUT',
-                params: {name: '@name'},
-                notifications: true
-            },
-            'delete': {
-                method: 'POST',
-                params: {prefix: 'userDelete'},
-                notifications: true
-            },
-            'getPermissions': {
-                method: 'GET',
-                params: {name: '@name', prefix: 'permissions'},
-                isArray: true
-            },
-            'checkExternalStatus': {
-                method: 'POST',
-                params: {prefix: 'externalStatus'},
-                notifications: true
-            },
-            'changePassword': {
-                path: '/auth/changePassword',
-                method: 'POST',
-                params: {prefix: 'changePassword'},
-                notifications: true
-            },
-            'expirePassword': {
-                method: 'POST',
-                params: {prefix: '@username', name: 'expirePassword'},
-                notifications: true
-            },
-            'unExpirePassword': {
-                method: 'POST',
-                params: {prefix: '@username', name: 'unexpirePassword'},
-                notifications: true
-            },
-            'expireAllPassword': {
-                method: 'POST',
-                params: {prefix: 'expirePasswordForAllUsers'},
-                notifications: true
-            },
-            'unExpireAllPassword': {
-                method: 'POST',
-                params: {prefix: 'unexpirePasswordForAllUsers'},
-                notifications: true
-            }
-
-        })
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/data/dao/user_profile_dao.js b/web/angular-web/src/main/webapp/app/data/dao/user_profile_dao.js
deleted file mode 100644
index 8a95020..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/user_profile_dao.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export function UserProfileDao(RESOURCE, ArtifactoryDaoFactory) {
-    return ArtifactoryDaoFactory()
-        .setDefaults({method: 'POST'})
-        .setPath(RESOURCE.USER_PROFILE)
-        .setCustomActions({
-            fetch: {
-                notifications: true
-            },
-            getApiKey: {
-                method: 'GET',
-                path: RESOURCE.USER_API_KEY + '/:user',
-                params: {user: '@username'}
-            },
-            getAndCreateApiKey: {
-                method: 'POST',
-                path: RESOURCE.USER_API_KEY
-            },
-            regenerateApiKey: {
-                method: 'PUT',
-                path: RESOURCE.USER_API_KEY
-            },
-            revokeApiKey: {
-                method: 'DELETE',
-                path: RESOURCE.USER_API_KEY + '/:user',
-                params: {user: '@username'},
-                notifications: true
-            }
-        }).getInstance();
-}
diff --git a/web/angular-web/src/main/webapp/app/data/dao/xml_name_dao.js b/web/angular-web/src/main/webapp/app/data/dao/xml_name_dao.js
deleted file mode 100644
index b5259c7..0000000
--- a/web/angular-web/src/main/webapp/app/data/dao/xml_name_dao.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import {ArtifactoryDao} from '../artifactory_dao';
-
-export class XmlNameDao extends ArtifactoryDao {
-
-    constructor($resource, RESOURCE, artifactoryNotificationsInterceptor) {
-        super($resource, RESOURCE, artifactoryNotificationsInterceptor);
-
-        this.setUrl(RESOURCE.API_URL + RESOURCE.XML_NAME_VALIDATOR);
-        this.setCustomActions({
-            get: {
-                "params": {
-                    xmlName: '@xmlName'
-                }
-            }
-        })
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/artifactory.directives.module.js b/web/angular-web/src/main/webapp/app/directives/artifactory.directives.module.js
deleted file mode 100644
index f3e220c..0000000
--- a/web/angular-web/src/main/webapp/app/directives/artifactory.directives.module.js
+++ /dev/null
@@ -1,142 +0,0 @@
-import {jfAccordion}     from './jf_accordion/jf_accordion';
-import {jfCode}          from './jf_code/jf_code';
-import {jfFooter}        from './jf_footer/jf_footer';
-import {jfHeader}        from './jf_header/jf_header';
-import {jfMessages}      from './jf_messages/jf_messages';
-import {jfHeaderSearch}  from './jf_header_search/jf_header_search';
-import {jfSidebar}       from './jf_sidebar/jf_sidebar';
-import {jfDragDrop}      from './jf_drag_drop/jf_drag_drop'
-import {jfBrowseFiles}   from './jf_browse_files/jf_browse_files';
-import dynamicDirective  from './jf_dynamic_directive/jf_dynamic_directive';
-import {jfActions}       from './jf_actions/jf_actions';
-import {jfTooltip}       from './jf_tooltip/jf_tooltip';
-import {jfHelpTooltip}       from './jf_help_tooltip/jf_help_tooltip';
-import {jfSearch}        from './jf_search/jf_search';
-import {jfList}          from './jf_list/jf_list';
-import {jfListMaker}          from './jf_list_maker/jf_list_maker';
-import searchTabs        from './jf_search/search_tabs/search_tabs.module';
-import {jfCheckbox}      from './jf_checkbox/jf_checkbox';
-import {jfSwitchToggle}      from './jf_switch_toggle/jf_switch_toggle';
-import {jfSwitch}        from './jf_switch/jf_switch';
-import {jfGrid} from './jf_grid/jf_grid';
-import {jfGridPagination} from './jf_grid_pagination/jf_grid_pagination';
-import {jfGridBatchActions}   from './jf_grid_batch_actions/jf_grid_batch_actions';
-import {ArtifactoryDeployModal}   from './jf_deploy/artifactory_deploy_modal';
-import {jfMultiDeploy}   from './jf_deploy/jf_multi_deploy';
-import {jfSingleDeploy}   from './jf_deploy/jf_single_deploy';
-import {jfPrint}   from './jf_print/jf_print';
-import {jfAutoFocus}   from './jf_autofocus/jf_autofocus';
-import {jfField}   from './jf_field/jf_field';
-import {jfCodeMirror}   from './jf_codemirror/jf_codemirror';
-import {jfBodyClass}   from './jf_body_class/jf_body_class';
-import {jfInputTextV2}   from './jf_input_text_v2/jf_input_text_v2';
-import {jfCronFormatter}   from './jf_cron_formatter/jf_cron_formatter';
-import {jfGridFilter}   from './jf_grid_filter/jf_grid_filter';
-import {jfBreadcrumb}   from './jf_breadcrumb/jf_breadcrumb';
-import {jfTabs}   from './jf_tabs/jf_tabs';
-import {jfTab}   from './jf_tabs/jf_tab';
-import {jfPanel}   from './jf_panel/jf_panel';
-import {jfUiSelect}   from './jf_ui_select/jf_ui_select';
-import {jfSpinner}   from './jf_spinner/jf_spinner';
-import {jfRevealInput}   from './jf_reveal_input/jf_reveal_input';
-import {jfEnterPress}   from './jf_enter_press/jf_enter_press';
-import {jfDisableFeature} from './jf_disable_feature/jf_disable_feature';
-import {jfHideForAol} from './jf_hide_for_aol/jf_hide_for_aol';
-import {jfFileDrop} from './jf_file_drop/jf_file_drop';
-import {jfAutoComplete} from './jf_auto_complete/jf_auto_complete';
-import {jfClearErrors} from './jf_clear_errors/jf_clear_errors';
-import {jfDisableNgAnimate} from './jf_disable_ng_animate/jf_disable_ng_animate';
-import {jfTooltipOnOverflow} from './jf_tooltip_on_overflow/jf_tooltip_on_overflow';
-import {jfClipCopy} from './jf_clip_copy/jf_clip_copy';
-import {jfDockerV2Layer} from './jf_docker_v2_layer/jf_docker_v2_layer';
-import {jfDockerV2Layers} from './jf_docker_v2_layers/jf_docker_v2_layers';
-import {rtfactStorageViewer} from './rtfact_storage_viewer/rtfact_storage_viewer';
-import {rtfactStorageElement} from './rtfact_storage_viewer/rtfact_storage_element';
-import {rtfactStorageUsage} from './rtfact_storage_viewer/rtfact_storage_usage';
-
-// custom field validators
-import {jfValidation}   from './jf_validation/jf_validation';
-import {jfValidatorName}   from './validators/jf_validator_name';
-import {jfValidatorUniqueId}   from './validators/jf_validator_unique_id';
-import {jfValidatorXmlName}   from './validators/jf_validator_xml_name';
-import {jfValidatorCron}   from './validators/jf_validator_cron';
-import {jfValidatorLdapUrl}   from './validators/jf_validator_ldap_url';
-import {jfValidatorPathPattern}   from './validators/jf_validator_path_pattern';
-import {jfValidatorIntValue}   from './validators/jf_validator_int_value';
-import {jfValidatorMaxTextLength}   from './validators/jf_validator_max_text_length';
-import {jfSpecialChars}   from './jf_special_chars/jf_special_chars';
-import {jfRepokeyValidator}   from './jf_repokey_validator/jf_repokey_validtaor';
-import {jfValidatorDateFormat}   from './validators/jf_validator_date_format';
-import {jfValidatorReverseProxyPort}   from './validators/jf_validator_reverse_proxy_port';
-
-
-angular.module('artifactory.directives', ['artifactory.services', 'artifactory.dao', 'searchTabs', 'ui.select', 'ngSanitize', 'ui.highlight'])
-    .directive({
-        'jfAccordion': jfAccordion,
-        'jfCode': jfCode,
-        'jfFooter': jfFooter,
-        'jfHeader': jfHeader,
-        'jfMessages': jfMessages,
-        'jfHeaderSearch': jfHeaderSearch,
-        'jfSidebar': jfSidebar,
-        'jfDragDrop': jfDragDrop,
-        'jfBrowseFiles': jfBrowseFiles,
-        'dynamicDirective': dynamicDirective,
-        'jfActions': jfActions,
-        'jfTooltip': jfTooltip,
-        'jfHelpTooltip': jfHelpTooltip,
-        'jfSearch': jfSearch,
-        'jfList': jfList,
-        'jfListMaker': jfListMaker,
-        'jfCheckbox': jfCheckbox,
-        'jfSwitchToggle': jfSwitchToggle,
-        'jfSwitch': jfSwitch,
-        'jfGrid': jfGrid,
-        'jfGridPagination': jfGridPagination,
-        'jfGridBatchActions': jfGridBatchActions,
-            'jfSingleDeploy': jfSingleDeploy,
-            'jfMultiDeploy': jfMultiDeploy,
-        'jfPrint': jfPrint,
-        'jfValidation': jfValidation,
-        'jfAutoFocus': jfAutoFocus,
-        'jfField': jfField,
-        'jfCodeMirror': jfCodeMirror,
-        'jfBodyClass': jfBodyClass,
-        'jfInputTextV2': jfInputTextV2,
-        'jfCronFormatter': jfCronFormatter,
-        'jfValidatorName': jfValidatorName,
-        'jfValidatorUniqueId': jfValidatorUniqueId,
-        'jfValidatorXmlName': jfValidatorXmlName,
-        'jfValidatorCron': jfValidatorCron,
-        'jfValidatorLdapUrl': jfValidatorLdapUrl,
-        'jfValidatorPathPattern': jfValidatorPathPattern,
-        'jfValidatorIntValue': jfValidatorIntValue,
-        'jfValidatorDateFormat': jfValidatorDateFormat,
-        'jfValidatorMaxTextLength': jfValidatorMaxTextLength,
-        'jfValidatorReverseProxyPort': jfValidatorReverseProxyPort,
-        'jfGridFilter': jfGridFilter,
-        'jfBreadcrumb': jfBreadcrumb,
-        'jfTabs': jfTabs,
-        'jfTab': jfTab,
-        'jfSpecialChars': jfSpecialChars,
-        'jfPanel': jfPanel,
-        'jfUiSelect': jfUiSelect,
-        'jfSpinner': jfSpinner,
-        'jfRepokeyValidator': jfRepokeyValidator,
-        'jfRevealInput': jfRevealInput,
-        'jfEnterPress': jfEnterPress,
-        'jfDisableFeature': jfDisableFeature,
-        'jfDisableNgAnimate': jfDisableNgAnimate,
-        'jfHideForAol': jfHideForAol,
-        'jfFileDrop': jfFileDrop,
-        'jfAutoComplete': jfAutoComplete,
-        'jfClearErrors': jfClearErrors,
-        'jfTooltipOnOverflow': jfTooltipOnOverflow,
-        'jfClipCopy': jfClipCopy,
-        'jfDockerV2Layer': jfDockerV2Layer,
-        'jfDockerV2Layers': jfDockerV2Layers,
-        'rtfactStorageViewer': rtfactStorageViewer,
-        'rtfactStorageElement': rtfactStorageElement,
-        'rtfactStorageUsage': rtfactStorageUsage
-        })
-        .service('ArtifactoryDeployModal', ArtifactoryDeployModal);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_accordion/accordion-remember-item-in-category.js b/web/angular-web/src/main/webapp/app/directives/jf_accordion/accordion-remember-item-in-category.js
deleted file mode 100644
index 91b379e..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_accordion/accordion-remember-item-in-category.js
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * Created by danny on 01/06/15.
- */
-class jfAccordionController {
-
-    constructor($state, $scope, $rootScope, ArtifactoryState) {
-        this.state = $state;
-        this.currentAccordion = null;
-        this.artifactoryState = ArtifactoryState;
-        this.scope = $scope;
-        this.openItemByCurrentState();
-
-        $rootScope.$on('$stateChangeSuccess', () => this.openItemByCurrentState());
-
-
-        this._initWatchers();
-    }
-
-    openItemByCurrentState() {
-
-        let item = _.find(this.items, (item) => {
-            return _.contains(this.state.current.name, item.state);
-        });
-        if (item) {
-            item.isOpen = true;
-        }
-
-        this.currentAccordion && this.artifactoryState.setState(this.currentAccordion, this.state.current);
-
-    }
-
-    isCurrentAccordion(item) {
-        return this.currentAccordion === item.label;
-    }
-
-    getCurrentAccordion() {
-        return this.currentAccordion;
-    }
-
-    setCurrentAccordion(item) {
-
-        if (item) {
-            if (!this.currentAccordion) {
-                this.artifactoryState.setState(item.label, this.state.current);
-            }
-            this.currentAccordion = item.label;
-            let state = this.artifactoryState.getState(this.currentAccordion);
-            if (state) {
-                this.state.go(state);
-            }
-        }
-        //this.currentAccordion == item.label?this.currentAccordion = '':this.currentAccordion = item.label;
-    }
-
-    _initWatchers() {
-        for (let i in this.items) {
-            this.scope.$watch('jfAccordion.items[' + i + '].isOpen', (isOpen) => {
-                if (isOpen) {
-                    //console.log('current accordion: '+this.items[i].label);
-                    this.setCurrentAccordion(this.items[i]);
-                }
-                else {
-                    this.setCurrentAccordion(null);
-                }
-            });
-        }
-    }
-
-}
-
-export function jfAccordion() {
-
-    return {
-        restrict: 'EA',
-        scope: {items: '='},
-        controller: jfAccordionController,
-        controllerAs: 'jfAccordion',
-        templateUrl: 'directives/jf_accordion/jf_accordion.html',
-        bindToController: true
-    };
-}
-
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_accordion/jf_accordion.html b/web/angular-web/src/main/webapp/app/directives/jf_accordion/jf_accordion.html
deleted file mode 100644
index f5b767f..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_accordion/jf_accordion.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<div class="accordion-style">
-    <accordion close-others="true">                         
-        <accordion-group ng-repeat="item in jfAccordion.items"
-                         ng-if="!item.isHidden"
-                         heading="{{ item.label | replaceStringForAol }}"
-                         is-open="item.isOpen"
-                         class="accordion-header"
-                         ng-class="{disabled: item.isDisabled}"
-                         is-disabled="item.isDisabled"
-                         ui-sref-active="selected">
-            <div ng-repeat="subitem in item.subItems"
-                 ng-class="{disabled: subitem.isDisabled}"
-                 jf-disable-feature="{{ subitem.feature }}"
-                 class="accordion-subitem">
-                <div ng-if="subitem.isDisabled"
-                     class="subitem-style">
-                    <div>{{subitem.label}}</div>
-                </div>
-                <div ng-if="!subitem.isDisabled"
-                     ui-sref="{{ subitem.state }} ({{ subitem.stateParams }})"
-                     ng-class="{selected: jfAccordion.isItemActive(subitem)}"
-                     ng-click="jfAccordion.saveState()"
-                     jf-clear-errors
-                     class="subitem-style">
-                    <div>{{subitem.label}}</div>
-                </div>
-            </div>
-        </accordion-group>
-    </accordion>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_accordion/jf_accordion.js b/web/angular-web/src/main/webapp/app/directives/jf_accordion/jf_accordion.js
deleted file mode 100644
index 68d7b8a..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_accordion/jf_accordion.js
+++ /dev/null
@@ -1,56 +0,0 @@
-class jfAccordionController {
-
-    constructor($state, $rootScope,ArtifactoryState,$timeout) {
-        this.state = $state;
-        this.currentAccordion = '';
-        this.artifactoryState = ArtifactoryState;
-        this.$timeout = $timeout;
-        this.openItemByCurrentState();
-        $rootScope.$on('$stateChangeSuccess', () => this.openItemByCurrentState());
-    }
-
-    openItemByCurrentState() {
-        let item = _.find(this.items, (item) => {
-            return this.isItemActive(item);
-        });
-        if (item) item.isOpen = true;
-    }
-
-    saveState() {
-
-        this.artifactoryState.setState('saveAdminState',true);
-/*
-// ACTUAL SAVING OF LAST ADMIN STATE MOVED TO artifactory.states.mudule.js (TO PREVENT SAVING WRONG STATE WHEN CONFIRMATION MODAL IS PRESENTED)
-        this.$timeout(()=>{
-            this.artifactoryState.setState('lastAdminState',this.state.current);
-            this.artifactoryState.setState('lastAdminStateParams', this.state.params);
-        });
-*/
-
-    }
-
-    isItemActive(item) {
-        // (Adam) - don't use $state.includes, because it goes by the route hierarchy 
-        let result = _.contains(this.state.current.name, item.state);
-        // (Adam) - if item includes paramsParams, match this params with the current state
-        if (result && item.stateParams) {
-            let relevantParams = _.pick(this.state.params, Object.keys(item.stateParams));
-            result = angular.equals(relevantParams, item.stateParams);
-        }
-        return result;
-    }
-
-}
-
-export function jfAccordion() {
-
-    return {
-        restrict: 'EA',
-        scope: {items: '='},
-        controller: jfAccordionController,
-        controllerAs: 'jfAccordion',
-        templateUrl: 'directives/jf_accordion/jf_accordion.html',
-        bindToController: true
-    };
-}
-
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_actions/jf_actions.html b/web/angular-web/src/main/webapp/app/directives/jf_actions/jf_actions.html
deleted file mode 100644
index b9e7c43..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_actions/jf_actions.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<ul class="list-inline" ng-show="jfActions.getActiveActionsCount()">
-    <li ng-show="jfActions.fixedActions.length"
-        ng-repeat="actionObj in jfActions.fixedActions"
-        ng-click="jfActions.doAction(actionObj)"
-        class="action-button"
-        ng-if="!actionObj.visibleWhen || actionObj.visibleWhen()">
-
-        <a ng-href="{{ actionObj.href }}">
-            <i class="action-icon icon" ng-class="actionObj.icon"></i> {{actionObj.title}}
-        </a>
-    </li>
-    <li ng-show="jfActions.dynamicActions.length" class="action-button">
-        <span class="dropdown" dropdown is-open="jfActions.isDropdownOpen">
-          <a href class="dropdown-toggle actions-more" dropdown-toggle>
-              <i class="action-icon icon icon-more"></i> Actions
-          </a>
-          <ul class="dropdown-menu dropdown-menu-right actions-dropdown text-left">
-              <li ng-repeat="actionObj in jfActions.dynamicActions"
-                  class="action-item menu-item-{{actionObj.icon}}"
-                  ng-if="!actionObj.visibleWhen || actionObj.visibleWhen()">
-                  <a href="" class="action-container" ng-click="jfActions.doAction(actionObj)">
-                      <span class="action-icon icon"
-                            ng-class="actionObj.icon"></span>
-                      <span class="action-name">{{actionObj.title}}</span>
-                  </a>
-              </li>
-          </ul>
-        </span>
-
-    </li>
-</ul>
-
-<!--<li ng-repeat="action in jfActions.actions">-->
-    <!--<a><span class="glyphicon glyphicon-refresh"></span>{{action.name}}</a></li>-->
-<!--<li><a><span class="glyphicon glyphicon-trash"></span>Delete Content</a></li>-->
-<!--<li><a><span class="glyphicon glyphicon-cloud-upload"></span>Upload to Bintray</a></li>-->
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_actions/jf_actions.js b/web/angular-web/src/main/webapp/app/directives/jf_actions/jf_actions.js
deleted file mode 100644
index d89d630..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_actions/jf_actions.js
+++ /dev/null
@@ -1,151 +0,0 @@
-class jfActionsController {
-    constructor($scope) {
-        this.$scope = $scope;
-        this.isDropdownOpen = false;
-
-        if (this.parentController && this.initMethod && this.parentController[this.initMethod]) {
-            this.parentController[this.initMethod](this);
-        }
-        else {
-            console.error('jfActionsController: Missing parent-controller & init-method attributes')
-        }
-    }
-
-    setActionsHandler(actionsHandler) {
-        this.actionsHandler = actionsHandler;
-    }
-    setCurrentEntity(entity) {
-        this.currentEntity = entity;
-    }
-    setActionsDictionary(actionsDictionary) {
-        this.actionsDictionary = actionsDictionary;
-    }
-
-    setActions(actions) {
-        this.actions = actions || [];
-        this._transformActionsData();
-    }
-
-    doAction(actionObj) {
-        if (this.actionsHandler) {
-            if (!actionObj.href) this.actionsHandler.perform(actionObj, this.currentEntity);
-        }
-        else if (actionObj.action) {
-            actionObj.action(this.currentEntity);
-        }
-    }
-
-    getActiveActionsCount() {
-        if (!this.actions || !this.actions.length) return 0;
-        return _.filter(this.actions, (act)=>!act.visibleWhen || act.visibleWhen()).length;
-    }
-
-    _toggleDropdown(isOpen) {
-        this.isDropdownOpen = isOpen;
-        if (!this.$scope.$$phase) {
-            this.$scope.$digest();
-        }
-    }
-
-
-    // Transform from server JSON to client representation
-    _transformActionsData() {
-        // extend action properties from ACTIONS dictionary
-        this.actions.forEach((actionObj) => {
-            if (!this.actionsDictionary[actionObj.name]) {
-                console.log("Unrecognized action", actionObj.name);
-                return true;
-            }
-            angular.extend(actionObj, this.actionsDictionary[actionObj.name]);
-        });
-        // Divide actions to fixed and dynamic (dropdown)
-        this._divideActions();
-    }
-
-    _divideActions() {
-        this.fixedActions = [];
-        this.dynamicActions = [];
-        _.forEach(this.actions, (actionObj) => {
-            if (_.contains(this.fixedActionsNames, actionObj.name)) {
-                this.fixedActions.push(actionObj);
-            }
-            else {
-                this.dynamicActions.push(actionObj);
-            }
-        });
-        if (this.fixedActions.length === 0 && this.dynamicActions.length === 1) {
-            this.fixedActions.push(this.dynamicActions.pop());
-        }
-    }
-}
-
-export function jfActions($timeout) {
-    return {
-        scope: {
-            parentController: '=',
-            initMethod: '@',
-            fixedActionsNames: '='
-        },
-        restrict: 'EA',
-        controller: jfActionsController,
-        controllerAs: 'jfActions',
-        templateUrl: 'directives/jf_actions/jf_actions.html',
-        bindToController: true,
-        link: function ($scope, element, attr, jfActions) {
-            let dropdownOver = false;
-            let buttonOver = false;
-            let $dropdownElement = $(element).find('.actions-more');
-            let $buttonElement = $(element).find('.action-button');
-            let stayOpened = false;
-            let clicked = false;
-
-            $dropdownElement.on('mouseup', () => {
-                if (!stayOpened) {
-                    clicked = true;
-                }
-            });
-
-            $dropdownElement.on('mouseenter', () => {
-                buttonOver = true;
-                jfActions._toggleDropdown(true);
-            });
-            $dropdownElement.on('mouseleave', () => {
-                buttonOver = false;
-                if (!stayOpened) {
-                    jfActions._toggleDropdown(dropdownOver);
-                }
-            });
-            $buttonElement.on('mouseenter', () => {
-                dropdownOver = true;
-                jfActions._toggleDropdown(true);
-            });
-            $buttonElement.on('mouseleave', () => {
-                dropdownOver = false;
-                if (!stayOpened) {
-                    $timeout(()=> {
-                        jfActions._toggleDropdown(buttonOver || dropdownOver);
-                    }, 200);
-                }
-            });
-
-
-            let unwatch = $scope.$watch('jfActions.isDropdownOpen',(newVal,oldVal)=>{
-                if (!newVal && clicked) {
-                    jfActions.isDropdownOpen = true;
-                    clicked = false;
-                    stayOpened = true;
-                }
-                else if (!newVal && stayOpened) {
-                    stayOpened = false;
-                }
-
-            });
-
-            $scope.$on('$destroy', () => {
-                $dropdownElement.off('click');
-                unwatch();
-            });
-
-        }
-    };
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_auto_complete/jf_auto_complete.js b/web/angular-web/src/main/webapp/app/directives/jf_auto_complete/jf_auto_complete.js
deleted file mode 100644
index 36bddeb..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_auto_complete/jf_auto_complete.js
+++ /dev/null
@@ -1,45 +0,0 @@
-class jfAutoCompleteController {
-
-    constructor($scope, $element, $attrs, $timeout) {
-
-        this.$element = $element;
-
-
-        $($element).autocomplete({
-            source: $scope.uiItems,
-            select: (event,ui) => {
-                if ($scope.onSelect) {
-                    $scope.onSelect({selection:ui.item.value});
-                }
-            }
-        });
-        let widget = $($element).autocomplete('widget');
-        widget.css('z-index','9999999999');
-        widget.css('max-height','400px');
-        widget.css('overflow-y','auto');
-        widget.css('overflow-x','hidden');
-
-
-        $scope.$watch('uiItems',(newVal,oldVal)=>{
-           this.updateSource(newVal);
-        });
-
-    }
-
-    updateSource(list) {
-        $(this.$element).autocomplete('option','source',list);
-    }
-
-}
-
-export function jfAutoComplete() {
-
-    return {
-        restrict: 'A',
-        scope: {
-            uiItems: '=',
-            onSelect: '&'
-        },
-        controller: jfAutoCompleteController
-    };
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_autofocus/jf_autofocus.js b/web/angular-web/src/main/webapp/app/directives/jf_autofocus/jf_autofocus.js
deleted file mode 100644
index 77e81f0..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_autofocus/jf_autofocus.js
+++ /dev/null
@@ -1,10 +0,0 @@
-export function jfAutoFocus($timeout) {
-    return {
-        restrict: 'A',
-        link: function(scope, element) {
-            $timeout(function() {
-                element[0].focus();
-            });
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_body_class/jf_body_class.js b/web/angular-web/src/main/webapp/app/directives/jf_body_class/jf_body_class.js
deleted file mode 100644
index 5e554a7..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_body_class/jf_body_class.js
+++ /dev/null
@@ -1,36 +0,0 @@
-export function jfBodyClass() {
-    return {
-        restrict: 'A',
-        controller: jfBodyClassController,
-        controllerAs: 'jfBodyClass',
-        bindToController: true
-    }
-}
-
-class jfBodyClassController {
-    constructor($element, $state, $scope) {
-        this.$element = $element;
-        this.$state = $state;
-        this.$scope = $scope;
-
-        this._registerEvents();
-    }
-
-    _registerEvents() {
-        this.$scope.$on('$stateChangeSuccess', () => {
-            this._setBodyClass()
-        });
-    }
-
-    _setBodyClass() {
-        this.$element.attr('class', this._formatCssClass(this.$state.$current.name));
-    }
-
-    _formatCssClass(stateName) {
-        return stateName.replace(/\./g, '-');
-    }
-
-    isLoadCompleted() {
-        return window.angular && angular.element(document.body).injector() && angular.element(document.body).injector().get("$http").pendingRequests.length == 0;
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_breadcrumb/jf_breadcrumb.html b/web/angular-web/src/main/webapp/app/directives/jf_breadcrumb/jf_breadcrumb.html
deleted file mode 100644
index 03e8f52..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_breadcrumb/jf_breadcrumb.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<ol class="breadcrumb">
-    <li ng-click="jfBreadcrumb.updateBreadcrumb()" ng-repeat="crumb in jfBreadcrumb.crumbs">
-        <a href="" ui-sref="{{crumb.state}}">{{crumb.name}}</a>
-    </li>
-</ol>
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_breadcrumb/jf_breadcrumb.js b/web/angular-web/src/main/webapp/app/directives/jf_breadcrumb/jf_breadcrumb.js
deleted file mode 100644
index 49a3e9c..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_breadcrumb/jf_breadcrumb.js
+++ /dev/null
@@ -1,70 +0,0 @@
-import EVENTS from '../../constants/artifacts_events.constants';
-
-class jfBreadcrumbController {
-
-    constructor($scope, $state, $stateParams, ArtifactoryEventBus, $timeout) {
-
-        this.$scope = $scope;
-        this.$stateParams = $stateParams;
-        this.$state = $state;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.$timeout = $timeout;
-        this._registerEvents();
-
-        this.updateBreadcrumb();
-    }
-
-    updateBreadcrumb() {
-        this.$timeout(()=>{
-            switch(this.$state.current.name) {
-                case 'builds.all':
-                    this._initCrumbs();
-                    break;
-                case 'builds.history':
-                    this._initCrumbs();
-                    this.crumbs.push({
-                        name:this.$stateParams.buildName,
-                        state:this.$state.current.name + '(' + JSON.stringify(this.$stateParams) + ')'
-                    });
-                    break;
-                case 'builds.info':
-                    this._initCrumbs();
-                    this.crumbs.push({
-                        name: this.$stateParams.buildName,
-                        state: 'builds.history' + '(' + JSON.stringify({buildName:this.$stateParams.buildName}) + ')'
-                    });
-                    this.crumbs.push({
-                        name: this.$stateParams.buildNumber,
-                        state: 'builds.info' + '(' + JSON.stringify({buildName: this.$stateParams.buildName ,buildNumber: this.$stateParams.buildNumber}) + ')'                    });
-                    break;
-            }
-        });
-    }
-
-    _initCrumbs() {
-        this.crumbs = [
-            {name:'All Builds',state:'builds.all({})'}
-        ];
-    }
-
-    _registerEvents() {
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.BUILDS_BREADCRUMBS, () => {
-            this.updateBreadcrumb();
-        });
-    }
-
-
-}
-
-export function jfBreadcrumb() {
-
-    return {
-        restrict: 'E',
-        scope: {
-        },
-        controller: jfBreadcrumbController,
-        controllerAs: 'jfBreadcrumb',
-        templateUrl: 'directives/jf_breadcrumb/jf_breadcrumb.html',
-        bindToController: true
-    };
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_browse_files/jf_browse_files.html b/web/angular-web/src/main/webapp/app/directives/jf_browse_files/jf_browse_files.html
deleted file mode 100644
index 3840696..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_browse_files/jf_browse_files.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<button type="button" class="btn btn-secondary"
-        ng-click="jfBrowseFiles.openBrowser()">Browse</button>
-
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_browse_files/jf_browse_files.js b/web/angular-web/src/main/webapp/app/directives/jf_browse_files/jf_browse_files.js
deleted file mode 100644
index 434e835..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_browse_files/jf_browse_files.js
+++ /dev/null
@@ -1,287 +0,0 @@
-import EVENTS     from '../../constants/common_events.constants';
-
-class jfBrowseFilesController {
-
-    constructor($scope, ArtifactoryModal, ArtifactoryEventBus, $timeout) {
-        this.root = '/';
-        this.browseFilesDao = this.browserResource;
-        this.modal = ArtifactoryModal;
-        this.browseFilesScope = $scope.$new();
-        this.initBrowseFileScope();
-        this.selectedFile = false;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-
-        this.$timeout = $timeout;
-    }
-
-    initBrowseFileScope() {
-        let browseFilesScope = this.browseFilesScope;
-        browseFilesScope.folderList = [];
-        browseFilesScope.rootsList = [];
-        browseFilesScope.fileList = [];
-        browseFilesScope.folder = {};
-        this.isWindows = false;
-        this.browseFilesScope.getDataList = (path)=>this.getDataList(path);
-        this.browseFilesScope.setFilePath = path => this.setFilePath(path);
-        this.browseFilesScope.setSelectedItem = item => this.setSelectedItem(item);
-        this.browseFilesScope.onSelectionChange = item => this.onSelectionChange();
-        browseFilesScope.upperFolder = ()=>this.upperFolder();
-        browseFilesScope.save = ()=>this.save();
-        browseFilesScope.closeModal = ()=>this.closeModal();
-        browseFilesScope.onChangeFolder = ()=>this.onChangeFolder();
-        browseFilesScope.onChangeRoot = ()=>this.onChangeRoot();
-        browseFilesScope.onPathKeyPress = (e)=>this.onPathKeyPress(e);
-        browseFilesScope.onPathAutoCompleteSelect = (selection)=>this.onPathAutoCompleteSelect(selection);
-        browseFilesScope.onKeyPress = (e)=>this.onKeyPress(e);
-        browseFilesScope.selectedItem = null;
-        browseFilesScope.baseDirectory = null;
-
-        if (!this.browserOptions)
-            this.browserOptions = {};
-
-        browseFilesScope.modalTitle = this.browserOptions.modalTitle || 'Server File System Browser';
-        browseFilesScope.selectionLabel = this.browserOptions.selectionLabel || 'Selected Folder:';
-        browseFilesScope.pathLabel = this.browserOptions.pathLabel || 'Path:';
-        browseFilesScope.canSelectFiles = this.browserOptions.canSelectFiles === true;
-        browseFilesScope.showSelectedItem = this.browserOptions.showSelectedItem !== false;
-        browseFilesScope.enableSelectedItem = this.browserOptions.enableSelectedItem !== false;
-        browseFilesScope.confirmButtonLabel = this.browserOptions.confirmButtonLabel || 'Select';
-        browseFilesScope.createDirHelp = 'To create a new directory,\nEnter it\'s name here.';
-
-        if (this.isWindows)
-            browseFilesScope.mountLabel = this.browserOptions.windowsDriveLabel || 'Drive:';
-        else
-            browseFilesScope.mountLabel = this.browserOptions.nonWindowsMountLabel || 'Mount Point:';
-    }
-
-    onPathKeyPress(e) {
-        if ((!this.isWindows && e.charCode == 47) || (this.isWindows && e.charCode == 92)) {
-            this.$timeout(()=>{
-                this._gotoPath(this.browseFilesScope.folder.selectedFolder);
-            });
-        }
-    }
-
-    _gotoPath(path) {
-        let current = path.endsWith(!this.isWindows ? '/' : '\\') ? path.substr(0,path.length-1) : path;
-
-        if (this.browseFilesScope.pathAutoComplete.indexOf(current)>=0) {
-            let parts = current.split(!this.isWindows ? '/' : '\\');
-            let lastPart = parts[parts.length-1].trim() || parts[parts.length-2].trim();
-            this.getDataList(lastPart);
-            this.browseFilesScope.folder.selectedFolder += !this.isWindows ? '/' : '\\';
-        }
-    }
-
-    openBrowser() {
-        if (!this.startFolder) this.initBrowseFileScope();
-        else {
-            if (this.startFolder.indexOf('\\')>=0 && this.startFolder.indexOf('/')<0) this.isWindows = true;
-            this.browseFilesScope.folder.selectedFolder = this.startFolder;
-            let parts = this.startFolder.split(!this.isWindows ? '/' : '\\');
-            let lastPart = parts[parts.length-1].trim() || parts[parts.length-2].trim();
-//            this.browseFilesScope.baseDirectory = '/'+_.filter(parts,(p)=>{return p}).join(!this.isWindows ? '/' : '\\');
-            this.browseFilesScope.folderList = _.filter(parts,(p)=>{return p.trim()});
-            this.browseFilesScope.folder.currentRoot = parts[0]+(!this.isWindows ? '/' : '\\');
-            if (this.isWindows) this.browseFilesScope.folderList.shift();
-            this.browseFilesScope.folder.currentFolder = lastPart;
-        }
-        this.artifactoryEventBus.dispatch(EVENTS.FORM_CLEAR_FIELD_VALIDATION, true);
-        this._getFileList(this.browseFilesScope.folder.selectedFolder || this.root);
-        this.modalInstance = this.modal.launchModal("browse_files_modal", this.browseFilesScope, 'sm');
-    }
-
-    upperFolder() {
-        let folderList = this.browseFilesScope.folderList;
-
-        if (folderList.length) {
-            folderList.pop();
-
-            let currentFolder = folderList.pop();
-            if (!currentFolder || (this.isWindows && currentFolder === '/')) {
-                currentFolder = this.browseFilesScope.folder.currentRoot;
-                this.browseFilesScope.folder.selectedFolder = this.browseFilesScope.folder.currentRoot;
-            }
-            this.getDataList(currentFolder);
-
-            this.browseFilesScope.folder.currentFolder = currentFolder;
-            this.browseFilesScope.baseDirectory = this.browseFilesScope.folder.selectedFolder;
-        }
-    }
-
-    setSelectedItem(item) {
-        this.browseFilesScope.selectedItem = item;
-        this.browseFilesScope.folder.currentFolder = item.fileSystemItemName;
-        this.browseFilesScope.folder.selectedFolder = (this.browseFilesScope.baseDirectory || '') + (!this.isWindows ? (this.browseFilesScope.baseDirectory == '/' ? '' : '/') : (this.browseFilesScope.baseDirectory ? (!this.browseFilesScope.baseDirectory.endsWith('\\') ? '\\' : '') : this.browseFilesScope.folder.currentRoot)) + item.fileSystemItemName;
-    }
-
-    _clearData() {
-        this.browseFilesScope.folder.currentFolder = !this.isWindows ? '/' : this.browseFilesScope.folder.currentRoot;
-        this.browseFilesScope.folderList = [];
-    }
-
-    onChangeRoot() {
-        this.$timeout(()=>{
-            this.onChangeFolder(true);
-        });
-    }
-
-    onChangeFolder(newRoot) {
-        if (newRoot) {
-            this._clearData();
-        }
-        let folderLabel = '';
-        if (this.browseFilesScope.folder.currentFolder == '/') {
-            folderLabel = this.browseFilesScope.folder.currentRoot;
-        }
-        else {
-            folderLabel = this.browseFilesScope.folder.currentFolder;
-        }
-        let index = 0;
-        for (index; this.browseFilesScope.folderList.length > index; index++) {
-            if (this.browseFilesScope.folderList[index] == folderLabel) {
-                break;
-            }
-        }
-        let indexToCut = this.browseFilesScope.folderList.length - index;
-        this.browseFilesScope.folderList = _.dropRight(this.browseFilesScope.folderList, indexToCut);
-        this.getDataList(folderLabel);
-    }
-
-    getDataList(path) {
-        let PathSend = '';
-        if (path == '/') {
-            PathSend = this.browseFilesScope.folder.currentRoot;
-        }
-        else {
-            PathSend = this._selectPath(path);
-        }
-        this._getFileList(PathSend);
-    }
-
-    _getFileList(path) {
-        path = path.replace('\\\/\\','\\');
-        this.browseFilesDao.query({path: path, includeZip: this.browseFilesScope.canSelectFiles}).$promise.then((result) => {
-            if (result) {
-                this.browseFilesScope.rootsList = result.roots;
-                this.isWindows = result.windows;
-                if (this.isWindows && path==='/') {
-                    this._getFileList(result.roots[0]);
-                    return;
-                }
-
-                this.browseFilesScope.fileList = result.fileSystemItems;
-                if (!this.browseFilesScope.folder.currentRoot) {
-                    this.browseFilesScope.folder.currentRoot = result.roots[0];
-                    this.onChangeRoot();
-                }
-                if (!this.browseFilesScope.folder.selectedFolder) {
-                    this.browseFilesScope.folder.selectedFolder = result.roots[0];
-                }
-
-                if (this.isWindows)
-                    this.browseFilesScope.mountLabel = this.browserOptions.windowsDriveLabel || 'Drive:';
-                else
-                    this.browseFilesScope.mountLabel = this.browserOptions.nonWindowsMountLabel || 'Mount Point:';
-
-                let onlyFolders = _.filter(result.fileSystemItems,(item)=>{return item.folder});
-                this.browseFilesScope.pathAutoComplete = _.map(onlyFolders,(item)=>{
-                    return (this.browseFilesScope.baseDirectory||(!this.isWindows ? '' : this.browseFilesScope.folder.currentRoot)) + (!this.isWindows ? (!this.browseFilesScope.baseDirectory || !this.browseFilesScope.baseDirectory.endsWith('/') ? '/' :'') : ((this.browseFilesScope.baseDirectory && !this.browseFilesScope.baseDirectory.endsWith('\\'))?'\\':'')) + item.fileSystemItemName;
-                });
-
-                let filteredSelectionList = this.browseFilesScope.canSelectFiles ? result.fileSystemItems : _.filter(result.fileSystemItems,(item)=>{return item.folder});
-                this.browseFilesScope.selectionAutoComplete = _.map(filteredSelectionList,(item)=>{
-                    return item.fileSystemItemName;
-                });
-            }
-        },
-        function (result) {
-        });
-    }
-
-    _selectPath(path, isFile = false) {
-        let backslash = '/';
-        let windowSlash = "\\";
-        let _path = this.browseFilesScope.folder.currentRoot;
-        let PathSend;
-
-        if (isFile && this.selectedFile || this.selectedFile)
-            this.browseFilesScope.folderList.pop();
-
-        if (this.browseFilesScope.folderList.length > 0) {
-            this.browseFilesScope.folderList.forEach((pathEntry, index) => {
-                if (pathEntry != windowSlash && this.isWindows) {
-                    _path += pathEntry + windowSlash;
-                }
-                if (pathEntry != backslash && !this.isWindows) {
-                    _path += pathEntry + backslash;
-                }
-            });
-        }
-
-        if (this.browseFilesScope.folder.currentRoot == path) {
-            _path = this.browseFilesScope.folder.currentRoot;
-            this.browseFilesScope.folder.selectedFolder = this.browseFilesScope.folder.currentRoot;
-            this.browseFilesScope.folderList = [];
-            this.browseFilesScope.folderList.push(backslash);
-        }
-        else {
-            if (!isFile) {
-                this.browseFilesScope.folderList.push(path);
-                this.browseFilesScope.folder.currentFolder = path;
-            }
-            _path += path;
-            this.browseFilesScope.folder.selectedFolder = _path;
-            this.browseFilesScope.folder.selectedFolder = this.browseFilesScope.folder.selectedFolder.replace('\\\/\\','\\');
-            this.browseFilesScope.baseDirectory = this.browseFilesScope.folder.selectedFolder;
-            this.selectedFile = isFile;
-        }
-
-        return _path;
-    }
-
-    setFilePath(path) {
-        if (this.browseFilesScope.canSelectFiles)
-            this._selectPath(path, true);
-    }
-
-    save() {
-        this.browserUpdateFolder({directory: this.browseFilesScope.folder.selectedFolder});
-        this.closeModal();
-    }
-
-    closeModal() {
-        this.modalInstance.close();
-    }
-
-    onKeyPress(e) {
-        if (e.charCode == 13 && this.browseFilesScope.selectedItem)
-            this.getDataList(this.browseFilesScope.selectedItem.fileSystemItemName);
-    }
-
-    onSelectionChange() {
-        this.browseFilesScope.folder.selectedFolder = (this.browseFilesScope.baseDirectory || '') + (!this.isWindows ? (!this.browseFilesScope.baseDirectory || !this.browseFilesScope.baseDirectory.endsWith('/') ? '/' :'') : (this.browseFilesScope.baseDirectory ? (!this.browseFilesScope.baseDirectory.endsWith('\\')?'\\':'') : this.browseFilesScope.folder.currentRoot)) + this.browseFilesScope.folder.currentFolder;
-        if (this.isWindows && this.browseFilesScope.folder.selectedFolder.toLowerCase().startsWith(this.browseFilesScope.folder.currentRoot.toLowerCase()+this.browseFilesScope.folder.currentRoot.toLowerCase()))
-            this.browseFilesScope.folder.selectedFolder = this.browseFilesScope.folder.selectedFolder.toLowerCase().replace(this.browseFilesScope.folder.currentRoot.toLowerCase()+this.browseFilesScope.folder.currentRoot.toLowerCase(),this.browseFilesScope.folder.currentRoot);
-    }
-
-    onPathAutoCompleteSelect(selection) {
-        this._gotoPath(selection);
-    }
-}
-
-export function jfBrowseFiles() {
-    return {
-        restrict: 'EA',
-        scope: {
-            browserUpdateFolder: '&',
-            browserResource: '=',
-            browserOptions: '=',
-            startFolder: '='
-        },
-        controller: jfBrowseFilesController,
-        controllerAs: 'jfBrowseFiles',
-        templateUrl: 'directives/jf_browse_files/jf_browse_files.html',
-        bindToController: true
-    };
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_checkbox/jf_checkbox.html b/web/angular-web/src/main/webapp/app/directives/jf_checkbox/jf_checkbox.html
deleted file mode 100644
index 89f264a..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_checkbox/jf_checkbox.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<label class="jf-checkbox">
-	<span></span> {{ text }}
-</label>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_checkbox/jf_checkbox.js b/web/angular-web/src/main/webapp/app/directives/jf_checkbox/jf_checkbox.js
deleted file mode 100644
index 73fc1de..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_checkbox/jf_checkbox.js
+++ /dev/null
@@ -1,22 +0,0 @@
-class jfCheckboxController {
-    constructor($element, $transclude, $timeout) {
-        $transclude(function(clone) {
-            // (Adam) TODO: Find out why checkbox appears only when grid appears in jf_properties
-            $timeout(function() {
-                $element.find('label').prepend(clone);
-            }, 0, false);
-        });
-    }
-}
-
-export function jfCheckbox() {
-    return {
-        restrict: 'E',
-        transclude: true,
-        scope: {
-            text: '@?'
-        },
-        controller: jfCheckboxController,
-        templateUrl: 'directives/jf_checkbox/jf_checkbox.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_clear_errors/jf_clear_errors.js b/web/angular-web/src/main/webapp/app/directives/jf_clear_errors/jf_clear_errors.js
deleted file mode 100644
index fd68ac9..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_clear_errors/jf_clear_errors.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import EVENTS from '../../constants/common_events.constants';
-class jfClearErrorsController {
-
-    constructor($scope, $element, $attrs, ArtifactoryEventBus) {
-
-        this.artifactoryEventBus = ArtifactoryEventBus;
-
-        angular.element($element).on("mousedown",()=>{
-            this.clearFieldValidations();
-        })
-    }
-
-    clearFieldValidations() {
-        this.artifactoryEventBus.dispatch(EVENTS.FORM_CLEAR_FIELD_VALIDATION, true);
-    }
-
-}
-
-export function jfClearErrors() {
-
-    return {
-        restrict: 'A',
-        controller: jfClearErrorsController
-    };
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_clip_copy/jf_clip_copy.html b/web/angular-web/src/main/webapp/app/directives/jf_clip_copy/jf_clip_copy.html
deleted file mode 100644
index 50533c9..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_clip_copy/jf_clip_copy.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<span>
-    <a ng-show="!jfClipCopy.isSafari && !!jfClipCopy.textToCopy"
-       class="copy-to-clip icon icon-copy-to-clipboard icon-button"
-       data-clipboard-text="{{jfClipCopy.textToCopy}}"
-       jf-tooltip="{{jfClipCopy.tooltipText}}"></a>
-    <a ng-show="jfClipCopy.isSafari && !!jfClipCopy.textToCopy"
-       class="copy-to-clip icon icon-copy-to-clipboard icon-button"
-       clip-copy="jfClipCopy.textToCopy"
-       clip-click="jfClipCopy.onSuccessfulCopy()"
-       jf-tooltip="{{jfClipCopy.tooltipText}}"></a>
-</span>
-
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_clip_copy/jf_clip_copy.js b/web/angular-web/src/main/webapp/app/directives/jf_clip_copy/jf_clip_copy.js
deleted file mode 100644
index 2e901d9..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_clip_copy/jf_clip_copy.js
+++ /dev/null
@@ -1,82 +0,0 @@
-class jfClipCopyController {
-
-    constructor($timeout,$scope,$element) {
-
-        this.FEEDBACK_DELAY = 4000;
-
-        this.$timeout = $timeout;
-
-        if (this.objectName) {
-            this.origTooltip = this.tooltipText = "Copy " + this.objectName.toLowerCase() + " to clipboard";
-        }
-        else {
-            this.origTooltip = this.tooltipText = "Copy to clipboard";
-        }
-        this.timeoutPromise = null;
-
-        this.isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;
-
-        if (!this.isSafari) {
-            //initialize Clipboard.js
-            let target = $element.find('a')[0];
-            this.clipboard = new Clipboard(target);
-            this.clipboard.on('success', (e) => {
-                this.onSuccessfulCopy();
-                $scope.$apply();
-            });
-
-            this.clipboard.on('error', (e) => {
-            });
-
-            $scope.$on('$destroy', () => {
-                this.clipboard.destroy();
-            });
-        }
-
-
-    }
-
-    onSuccessfulCopy() {
-
-        if (!this.textToCopy) return;
-
-        if (this.timeoutPromise) {
-            this.$timeout.cancel(this.timeoutPromise);
-            this.timeoutPromise = null;
-        }
-
-        this.tooltipText = this.objectName ? (this.objectName.charAt(0).toUpperCase() +  this.objectName.substr(1) + ' copied to clipboard') : 'Value copied to clipboard';
-        this.timeoutPromise = this.$timeout(()=>{
-            this.tooltipText = this.origTooltip;
-        },this.FEEDBACK_DELAY);
-        
-    }
-}
-
-export function jfClipCopy($compile) {
-
-    return {
-        restrict: 'E',
-        scope: {
-            textToCopy: '=',
-            objectName: '@'
-        },
-        controller: jfClipCopyController,
-        controllerAs: 'jfClipCopy',
-        bindToController: true,
-        templateUrl: 'directives/jf_clip_copy/jf_clip_copy.html',
-        link: ($scope,$element,$attrs) => {
-            let classList = $element[0].classList;
-            let outer = angular.element($element[0]);
-            let inner = angular.element($($element[0]).find('a'));
-
-            for (let i = classList.length-1; i >= 0; i--) {
-                let cls = classList[i];
-                if (!cls.startsWith('ng-')) {
-                    outer.removeClass(cls);
-                    inner.addClass(cls);
-                }
-            }
-        }
-    };
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_code/jf_code.js b/web/angular-web/src/main/webapp/app/directives/jf_code/jf_code.js
deleted file mode 100644
index 5f06a60..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_code/jf_code.js
+++ /dev/null
@@ -1,20 +0,0 @@
-class jfCodeController {
-
-    constructor($element) {
-
-    }
-}
-
-export function jfCode () {
-    return {
-        restrict: 'EA',
-        scope: {
-            src: '='
-        },
-        controller: jfCodeController,
-        controllerAs: 'jfCode',
-        bindToController: true,
-        template: '<pre>{{jfCode.src | json}}</pre>'
-    }
-}
-
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_codemirror/jf_codemirror.js b/web/angular-web/src/main/webapp/app/directives/jf_codemirror/jf_codemirror.js
deleted file mode 100644
index 6929a55..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_codemirror/jf_codemirror.js
+++ /dev/null
@@ -1,74 +0,0 @@
-import {search}  from './search/search'
-
-export function jfCodeMirror() {
-    return {
-        restrict: 'E',
-        scope: {
-            mimeType: '@',
-            mode: '@',
-            model: '=',
-            allowEdit: '@',
-            height: '@?',
-            apiAccess: '=',
-            autofocus: '@'
-        },
-        controller: jfCodeController,
-        controllerAs: 'jfCodeMirror',
-        bindToController: true,
-        template: '<textarea ui-codemirror="jfCodeMirror.editorOptions" ' +
-        'ng-model="jfCodeMirror.model"></textarea>'
-
-    }
-}
-
-class jfCodeController {
-    constructor($scope, $element) {
-        this.$element = $element;
-        this.$scope = $scope;
-
-        this.editorOptions = {
-            lineNumbers: true,
-            readOnly: !this.allowEdit, // Don't use nocursor - it disables search
-            lineWrapping: true,
-            mode: this.mode || 'links',
-            viewportMargin: 65,
-            autofocus: this.autofocus,
-            mimeType: this.mimeType,
-            onLoad: this._codeMirrorLoaded.bind(this)
-        };
-        // Hide cursor in readonly mode
-        if (!this.allowEdit) {
-            this.editorOptions.cursorBlinkRate = -1;
-        }
-    }
-
-    // register click handlers on code mirror links
-    _codeMirrorLoaded(_editor) {
-        if (this.height) {
-            let codeMirrorElement = $(this.$element).find('.CodeMirror');
-            if (this.height === 'flexible') {
-                codeMirrorElement.css('top', 0);
-                codeMirrorElement.css('bottom', 0);
-                codeMirrorElement.css('left', 0);
-                codeMirrorElement.css('right', 0);
-                codeMirrorElement.css('position', 'absolute');
-            }
-            else {
-                codeMirrorElement.css('height', this.height);
-            }
-        }
-        $(_editor.display.wrapper).on('click', '.cm-link', function (e) {
-            let url = $(this).text();
-            if (url) {
-                window.open(url, '_blank');
-            }
-        });
-        this.$scope.$on('$destroy', () => $(_editor.display.wrapper).off('click'));
-        if (this.apiAccess) {
-            this.apiAccess.api = _editor;
-            if (this.apiAccess.onLoad) {
-                this.apiAccess.onLoad();
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_codemirror/search/search.js b/web/angular-web/src/main/webapp/app/directives/jf_codemirror/search/search.js
deleted file mode 100644
index f7986a8..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_codemirror/search/search.js
+++ /dev/null
@@ -1,213 +0,0 @@
-"use strict";
-function searchOverlay(query, caseInsensitive) {
-    if (typeof query == "string") {
-        query = new RegExp(query.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"),
-                caseInsensitive ? "gi" : "g");
-    } else if (!query.global) {
-        query = new RegExp(query.source, query.ignoreCase ? "gi" : "g");
-    }
-
-    return {
-        token: function (stream) {
-            query.lastIndex = stream.pos;
-            var match = query.exec(stream.string);
-            if (match && match.index == stream.pos) {
-                stream.pos += match[0].length;
-                return "searching";
-            } else if (match) {
-                stream.pos = match.index;
-            } else {
-                stream.skipToEnd();
-            }
-        }
-    };
-}
-
-function SearchState() {
-    this.posFrom = this.posTo = this.query = null;
-    this.overlay = null;
-}
-
-function getSearchState(cm) {
-    return cm.state.search || (cm.state.search = new SearchState());
-}
-
-function queryCaseInsensitive(query) {
-    return typeof query == "string" && query == query.toLowerCase();
-}
-
-function getSearchCursor(cm, query, pos) {
-    // Heuristic: if the query string is all lowercase, do a case insensitive search.
-    return cm.getSearchCursor(query, pos, queryCaseInsensitive(query));
-}
-
-function dialog(cm, text, shortText, deflt, f) {
-    if (cm.openDialog) {
-        cm.openDialog(text, f, {value: deflt, closeOnEnter: false});
-    } else {
-        f(prompt(shortText, deflt));
-    }
-}
-
-function confirmDialog(cm, text, shortText, fs) {
-    if (cm.openConfirm) {
-        cm.openConfirm(text, fs);
-    } else if (confirm(shortText)) {
-        fs[0]();
-    }
-}
-
-function parseQuery(query) {
-    var isRE = query.match(/^\/(.*)\/([a-z]*)$/);
-    if (isRE) {
-        try {
-            query = new RegExp(isRE[1], isRE[2].indexOf("i") == -1 ? "" : "i");
-        }
-        catch (e) {
-        } // Not a regular expression after all, do a string search
-    }
-    if (typeof query == "string" ? query == "" : query.test("")) {
-        query = /x^/;
-    }
-    return query;
-}
-
-var queryDialog =
-        '<label class="input-label-weight">Search:</label> <input type="text"  class="input-text"/> ';
-
-function doSearch(cm, rev) {
-    var state = getSearchState(cm);
-    if (state.query) {
-        return findNext(cm, rev);
-    }
-    dialog(cm, queryDialog, "Search for:", cm.getSelection(), function (query) {
-        cm.operation(function () {
-            //if (!query || state.query) return;
-            var newQuery = parseQuery(query);
-            if (newQuery !== state.query) {
-                state.query = newQuery;
-                cm.removeOverlay(state.overlay, queryCaseInsensitive(state.query));
-                state.overlay = searchOverlay(state.query, queryCaseInsensitive(state.query));
-                cm.addOverlay(state.overlay);
-                if (cm.showMatchesOnScrollbar) {
-                    if (state.annotate) {
-                        state.annotate.clear();
-                        state.annotate = null;
-                    }
-                    state.annotate = cm.showMatchesOnScrollbar(state.query, queryCaseInsensitive(state.query));
-                }
-                state.posFrom = state.posTo = cm.getCursor();
-            }
-            findNext(cm, rev);
-        });
-    });
-}
-
-function findNext(cm, rev) {
-    cm.operation(function () {
-        var state = getSearchState(cm);
-        var cursor = getSearchCursor(cm, state.query, rev ? state.posFrom : state.posTo);
-        if (!cursor.find(rev)) {
-            cursor = getSearchCursor(cm, state.query,
-                    rev ? CodeMirror.Pos(cm.lastLine()) : CodeMirror.Pos(cm.firstLine(), 0));
-            if (!cursor.find(rev)) {
-                return;
-            }
-        }
-        cm.setSelection(cursor.from(), cursor.to());
-        cm.scrollIntoView({from: cursor.from(), to: cursor.to()});
-        state.posFrom = cursor.from();
-        state.posTo = cursor.to();
-    });
-}
-
-function clearSearch(cm) {
-    cm.operation(function () {
-        var state = getSearchState(cm);
-        if (!state.query) {
-            return;
-        }
-        state.query = null;
-        cm.removeOverlay(state.overlay);
-        if (state.annotate) {
-            state.annotate.clear();
-            state.annotate = null;
-        }
-    });
-}
-
-var replaceQueryDialog =
-        'Replace: <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">(Use /re/ syntax for regexp search)</span>';
-var replacementQueryDialog = 'With: <input type="text" style="width: 10em" class="CodeMirror-search-field"/>';
-var doReplaceConfirm = "Replace? <button>Yes</button> <button>No</button> <button>Stop</button>";
-
-function replace(cm, all) {
-    if (cm.getOption("readOnly")) {
-        return;
-    }
-    dialog(cm, replaceQueryDialog, "Replace:", cm.getSelection(), function (query) {
-        if (!query) {
-            return;
-        }
-        query = parseQuery(query);
-        dialog(cm, replacementQueryDialog, "Replace with:", "", function (text) {
-            if (all) {
-                cm.operation(function () {
-                    for (var cursor = getSearchCursor(cm, query); cursor.findNext();) {
-                        if (typeof query != "string") {
-                            var match = cm.getRange(cursor.from(), cursor.to()).match(query);
-                            cursor.replace(text.replace(/\$(\d)/g, function (_, i) {
-                                return match[i];
-                            }));
-                        } else {
-                            cursor.replace(text);
-                        }
-                    }
-                });
-            } else {
-                clearSearch(cm);
-                var cursor = getSearchCursor(cm, query, cm.getCursor());
-                var advance = function () {
-                    var start = cursor.from(), match;
-                    if (!(match = cursor.findNext())) {
-                        cursor = getSearchCursor(cm, query);
-                        if (!(match = cursor.findNext()) ||
-                                (start && cursor.from().line == start.line && cursor.from().ch == start.ch)) {
-                            return;
-                        }
-                    }
-                    cm.setSelection(cursor.from(), cursor.to());
-                    cm.scrollIntoView({from: cursor.from(), to: cursor.to()});
-                    confirmDialog(cm, doReplaceConfirm, "Replace?",
-                            [function () {
-                                doReplace(match);
-                            }, advance]);
-                };
-                var doReplace = function (match) {
-                    cursor.replace(typeof query == "string" ? text :
-                            text.replace(/\$(\d)/g, function (_, i) {
-                                return match[i];
-                            }));
-                    advance();
-                };
-                advance();
-            }
-        });
-    });
-}
-
-CodeMirror.commands.find = function (cm) {
-    clearSearch(cm);
-    doSearch(cm);
-};
-CodeMirror.commands.findNext = doSearch;
-CodeMirror.commands.findPrev = function (cm) {
-    doSearch(cm, true);
-};
-CodeMirror.commands.clearSearch = clearSearch;
-CodeMirror.commands.replace = replace;
-CodeMirror.commands.replaceAll = function (cm) {
-    replace(cm, true);
-};
-
-export function search() {} //export nothing, prevent ide from marking import as error
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_cron_formatter/jf_cron_formatter.js b/web/angular-web/src/main/webapp/app/directives/jf_cron_formatter/jf_cron_formatter.js
deleted file mode 100644
index 52bc1a1..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_cron_formatter/jf_cron_formatter.js
+++ /dev/null
@@ -1,31 +0,0 @@
-export function jfCronFormatter(CronTimeDao, $q, $timeout) {
-    return {
-        restrict: 'A',
-        require: 'ngModel',
-        link: function jfCronFormatterLink(scope, element, attrs, ngModel) {
-
-
-            let cronTimeDao = CronTimeDao.getInstance();
-            ngModel.$formatters.push(formatCron);
-            ngModel.$parsers.push(input => ngModel.$modelValue);
-
-            // Format the next scheduled time in the server
-            function formatCron(input) {
-                if (input) {
-                    return cronTimeDao.get({cron: input}).$promise
-                        .then(function (result) {
-                            if (result.error) {
-                                return $q.reject();
-                            }
-
-                            ngModel.$viewValue = result.nextTime;
-                            ngModel.$render();
-                            return ngModel.$viewValue;
-                        });
-                }
-
-                return input;
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_deploy/artifactory_deploy_modal.js b/web/angular-web/src/main/webapp/app/directives/jf_deploy/artifactory_deploy_modal.js
deleted file mode 100644
index 3e365e3..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_deploy/artifactory_deploy_modal.js
+++ /dev/null
@@ -1,143 +0,0 @@
-import EVENTS from '../../constants/artifacts_events.constants';
-import API from '../../constants/api.constants';
-import TOOLTIP from '../../constants/artifact_tooltip.constant';
-import FIELD_OPTIONS from '../../constants/field_options.constats';
-
-export class ArtifactoryDeployModal {
-
-    constructor($rootScope, RepoDataDao, ArtifactoryEventBus, ArtifactoryModal,$timeout) {
-        this.$rootScope = $rootScope;
-        this.$timeout = $timeout;
-        this.repoDataDao = RepoDataDao;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.artifactoryModal = ArtifactoryModal;
-        this.TOOLTIP = TOOLTIP.artifacts.deploy;
-    }
-
-
-    /**
-     * Init the modal scope and launch the modal
-     * @param node
-     * @returns {modalInstance.result|*}
-     */
-    launch(node) {
-        this.$scope = this.$rootScope.$new();
-        this.$scope.Deploy = this;
-        this.node = node;
-        this._initDeploy();
-        this.modalInstance = this.artifactoryModal.launchModal('deploy_modal', this.$scope, 600);
-        return this.modalInstance.result;
-    }
-
-    /**
-     * get repo list.
-     * set controller (single or multi)
-     * check if local repo
-     * (set  local repo on comm obj)
-     * @private
-     */
-    _initDeploy() {
-        this.currentDeploy = 'Single';
-        this.deployFile = {};
-        this.comm = {};
-        this.repoDataDao.get({deploy: 'true'}).$promise.then((result)=> {
-            this.comm.reposList = result.repoTypesList;
-            this.comm.reposList = _.map(this.comm.reposList,(repo)=>{
-                if (repo.layoutPattern) {
-                    repo.layoutPatternDisplay = repo.layoutPattern;
-
-                    let pattern = repo.layoutPattern;
-                    let nextToken = pattern.match(/\[(.*?)\]/);
-                    while (nextToken) {
-                        let safeHTML = nextToken[1].replace('<','&lt').replace('>','&gt');
-                        repo.layoutPatternDisplay = repo.layoutPatternDisplay.split(nextToken[0]).join(`[${safeHTML}]`);
-                        pattern = pattern.replace(nextToken[0],'');
-                        nextToken = pattern.match(/\[(.*?)\]/);
-                    }
-                }
-                
-                var rowPackageType =_.find(FIELD_OPTIONS.repoPackageTypes, (type) => {
-                    return type.serverEnumName == repo.repoType;
-                });
-                if (rowPackageType)
-                    repo.repoTypeIcon = rowPackageType.icon;
-                
-                return repo;
-            });
-            this.comm.localRepo = _.findWhere(this.comm.reposList, {repoKey: this.node.data.repoKey});
-        });
-        this.comm.createNotification = this.createNotification.bind(this);
-        this.comm.setController = (controller) => {
-            this.deployController = controller;
-        };
-    }
-
-    /**
-     * deploy on selected controller (single or multi)
-     */
-    deploy() {
-        this.deployController.deployArtifacts();
-    }
-
-    /**
-     * when deploy success refresh node and close modal
-     */
-    onDeploySuccess() {
-        this.dispatchSuccessEvent();
-        this.modalInstance.close();
-    }
-
-    /**
-     * check if current deploy selected
-     * @param deploy
-     * @returns {boolean}
-     */
-    isSelectedDeploy(deploy) {
-        return this.currentDeploy === deploy;
-    }
-
-    /**
-     * This builds an appropriate notification for the Deploy action in the UI (with or w/o the Artifact URL)
-     *
-     * @param response from the server
-     * @returns {{type: string, body: string}}
-     */
-    createNotification(response) {
-        let {repoKey, artifactPath} = response;
-        artifactPath = _.trim(artifactPath, '/');
-        let messageWithUrl = `Successfully deployed <a href="#/artifacts/browse/tree/General/${repoKey}/${artifactPath}">${artifactPath}</a> to ${repoKey}`;
-        let messageWithoutUrl = `Successfully deployed ${artifactPath}`;
-        return {
-            type: 'success',
-            body: response.showUrl ? messageWithUrl : messageWithoutUrl
-        }
-    }
-
-    /**
-     * after deploy _dispatchSuccessEvent refresh node in tree
-     * @private
-     */
-    dispatchSuccessEvent() {
-        this.artifactoryEventBus.dispatch(EVENTS.ACTION_DEPLOY, this.deployFile.repoDeploy.repoKey);
-    }
-
-    onRepoChange() {
-        this.$timeout(()=>{
-            if (this.deployController.layoutTokens) {
-                delete this.deployController.layoutTokens;
-                this.deployController.extractTokensFromLayout();
-                this.deployController.updatePathFromLayoutTokens();
-            }
-
-            let repo = this.deployController.deployFile.repoDeploy;
-            if (repo.repoType !== 'Maven' && this.deployController.deployFile.unitInfo) {
-                delete this.deployController.deployFile.unitInfo.maven;
-                this.deployController.deployFile.unitInfo.mavenArtifact = false;
-                if (this.deployController.originalDeployPath) {
-                    this.deployController.deployFile.targetPath = angular.copy(this.deployController.originalDeployPath);
-                }
-            }
-        });
-    }
-
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_deploy/jf_multi_deploy.html b/web/angular-web/src/main/webapp/app/directives/jf_deploy/jf_multi_deploy.html
deleted file mode 100644
index e5c6bba..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_deploy/jf_multi_deploy.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<div class="form-group">
-    <div class="form-group-cell">
-        <div class="drop-zone-wrapper">
-            <div class="drop-zone"
-                 ng-class="{'drop-zone-load': jfMultiDeploy.deployMultiUploader.fileUploader.queue.length > 0}"
-                 nv-file-drop uploader="jfMultiDeploy.deployMultiUploader.getUploader()"
-                 nv-file-over over-class="drop-zone-hover">
-
-                <span class="icon icon-upload-small"></span>
-                <span class="icon icon-upload-hover"></span>
-                <br>
-                <input class="select-files-hidden"
-                       type="file"
-                       nv-file-select
-                       uploader="jfMultiDeploy.deployMultiUploader.getUploader()"
-                       title=" "
-                       multiple/>
-                <span>Drop files</span> here or <span>Select files</span>
-                <div class="upload-files-frame">
-                    <ul>
-                        <li ng-repeat="item in jfMultiDeploy.deployMultiUploader.getUploader().queue" class="upload-item">
-                            <span class="file-name-deploy-multi" jf-tooltip="{{ item.file.originalName }}">{{ item.file.originalName }}</span>
-                            <a href=""
-                               ng-click="item.remove(); jfMultiDeploy.multiUploadItemRemoved()"
-                               jf-tooltip="Remove"
-                               class="icon icon-clear pull-right"></a>
-                        </li>
-                    </ul>
-                </div>
-            </div>
-
-        </div>
-    </div>
-</div>
-
-<form name="targetPath">
-    <div class="form-group">
-        <div class="form-group-cell">
-            <jf-field>
-                <label for="target-file">Target Path
-                </label>
-                <jf-help-tooltip
-                        html="jfMultiDeploy.TOOLTIP.targetPath"></jf-help-tooltip>
-                <input type="text"
-                       class="input-text"
-                       id="target-file"
-                       ng-model="jfMultiDeploy.deployFile.targetPath">
-            </jf-field>
-        </div>
-    </div>
-</form>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_deploy/jf_multi_deploy.js b/web/angular-web/src/main/webapp/app/directives/jf_deploy/jf_multi_deploy.js
deleted file mode 100644
index 46a6306..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_deploy/jf_multi_deploy.js
+++ /dev/null
@@ -1,281 +0,0 @@
-/**
- * Created by idannaim on 8/6/15.
- */
-import EVENTS from '../../constants/artifacts_events.constants';
-import API from '../../constants/api.constants';
-import TOOLTIP from '../../constants/artifact_tooltip.constant';
-
-class jfMultiDeployController {
-
-
-    constructor($scope, ArtifactoryUploaderFactory, ArtifactDeployDao, ArtifactoryState,
-            ArtifactoryNotifications) {
-
-        this.comm.setController(this);
-        this.$scope = $scope;
-        this.artifactDeployDao = ArtifactDeployDao;
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this.artifactoryState = ArtifactoryState;
-        this.artifactoryUploaderFactory = ArtifactoryUploaderFactory;
-        this.errorQueue = [];
-        this.multiSuccessMessage = '';
-        this.multiSuccessMessageCount = 0;
-        this.TOOLTIP = TOOLTIP.artifacts.deploy;
-        this.originalDeployPath = '';
-        this._initDeploy();
-    }
-
-    /**
-     * create uploader instance,
-     * set methods callback
-     * set path and file type
-     * @private
-     */
-    _initDeploy() {
-        let UPLOAD_REST_URL = `${API.API_URL}/artifact/upload`;
-
-        this.deployMultiUploader = this.artifactoryUploaderFactory.getUploaderInstance(this)
-                .setUrl(UPLOAD_REST_URL)
-                .setOnSuccessItem(this.onSuccessItem)
-                .setOnAfterAddingAll(this.onAfterAddingAll)
-                .setOnAfterAddingFile(this.onAfterAddingFile)
-                .setOnErrorItem(this.onUploadError)
-                .setOnCompleteAll(this.onCompleteAll)
-                .setOnProgressAll(this.onProgressAll);
-
-        this._setPathAndFileType(this.node.data.path);
-    }
-
-    /**
-     * check if path includes file/archive if yes cut it from the path and set .
-     * check if the current repo is local else clean path.
-     * Reset garbage deployFile if exists and fields.
-     * @param targetPath
-     * @private
-     */
-    _setPathAndFileType(targetPath) {
-        if (this.node.data.isInsideArchive()) {
-            targetPath = "";
-        }
-        else {
-            if (this.node.data.type == "file" || this.node.data.type == 'archive') {
-                if (targetPath.indexOf('/') > -1) {
-                    targetPath = targetPath.substr(0, targetPath.lastIndexOf('/'))
-                }
-                else if (targetPath.indexOf('\\') > -1) {
-                    targetPath = targetPath.substr(0, targetPath.lastIndexOf('\\'))
-                }
-                else {
-                    targetPath = "";
-                }
-            }
-        }
-        if (this.firstInit) {
-            if (localRepo) {
-                this.deployFile = {
-                    repoDeploy: localRepo,
-                    targetPath: targetPath
-                }
-            } else {
-                this.deployFile = {
-                    repoDeploy: this.node.data.type == 'local' ? this.node.this.reposList[0] : '',
-                    targetPath: targetPath
-                }
-            }
-        } else {
-            //Reset garbage deployFile if exists
-            if (this.deployFile && this.deployFile.unitInfo && this.deployFile.unitInfo.mavenArtifact) {
-                this.deployFile.unitInfo.mavenArtifact = false;
-            }
-            if (this.deployFile && this.deployFile.unitInfo && this.deployFile.unitInfo.debianArtifact) {
-                this.deployFile.unitInfo.debianArtifact = false;
-            }
-            this.deployFile.unitInfo = {};
-            this.deployFile.fileName = '';
-            this.deployMultiUploader.clearQueue();
-            this.deployFile.targetPath = targetPath;
-        }
-        this.uploadCompleted = false;
-        this.firstInit = false;
-    }
-
-    onSuccessItem(fileDetails, response) {
-        this.deployFile.unitInfo = response.unitInfo;
-        this.deployFile.unitConfigFileContent = response.unitConfigFileContent;
-        //MavenArtifact causes 'deploy as' checkbox to be lit -> change deployment path according to GAVC
-        if (this.deployFile.unitInfo && this.deployFile.unitInfo.mavenArtifact) {
-            this.originalDeployPath = this.deployFile.targetPath;
-        }
-        if (response.repoKey && response.artifactPath) {
-            let msg = this.comm.createNotification(response);
-            this.multiSuccessMessage += msg.body + '<br>';
-            this.multiSuccessMessageCount++;
-        }
-    }
-
-    /**
-     * check if queue have files to upload
-     */
-    multiUploadItemRemoved() {
-        if (!this.deployMultiUploader.getQueue() || !this.deployMultiUploader.getQueue().length) {
-            this.uploadCompleted = false;
-        }
-    }
-
-    /**
-     * when upload item error push to queue for notifications
-     * @param item
-     * @param response
-     */
-    onUploadError(item, response) {
-
-        this.errorQueue.push({item: item, response: response});
-
-    }
-
-    /**
-     * upload complete check if 'error queue' if empty if not show all failed files
-     * else show success notification
-     */
-    onCompleteAll() {
-        this.uploadCompleted = true;
-        this.progress = false;
-        let body = '<ul>';
-        this.artifactoryNotifications.clear();
-        if (this.errorQueue.length) {
-            this.errorQueue.forEach((error)=> {
-                body += '<li>"' + error.item.file.name + '" ' + error.response.error + '</li>'
-            })
-            body += '</ul>';
-            this.artifactoryNotifications.createMessageWithHtml({type: 'error', body: body, timeout: 10000});
-            this.deployMultiUploader.clearQueue();
-            this.errorQueue = [];
-        }
-        else {
-            this.artifactoryNotifications.createMessageWithHtml({type: 'success', body: `Successfully deployed ${this.multiSuccessMessageCount} files`});
-        }
-        if (this.onSuccess && typeof this.onSuccess === 'function') {
-            this.onSuccess();
-        }
-
-    }
-
-    /**
-     * onAfterAddingAll check for only 20 files  upload
-     * @param fileItems
-     */
-    onAfterAddingAll(fileItems) {
-        if (fileItems.length > 20) {
-            this.artifactoryNotifications.create({error: "You can only deploy up to 20 files at a time"});
-            this.deployMultiUploader.clearQueue();
-            return;
-        }
-        //Enable the "deploy" button after all files were added.
-        this.uploadCompleted = true;
-        let uploadAll = true;
-
-        fileItems.forEach((item)=> {
-            if (!item.okToUploadFile) {
-
-                uploadAll = false;
-                return;
-            }
-        });
-    }
-
-    /**
-     * check if missing fields to disable deploy button
-     * @returns {boolean|*}
-     */
-    isReady() {
-        let ok = true;
-        if (this.deployFile.unitInfo && this.deployFile.unitInfo.debianArtifact) {
-            ok = this.deployFile.unitInfo.distribution && this.deployFile.unitInfo.component && this.deployFile.unitInfo.architecture;
-        }
-        return ok && this.uploadCompleted && this.deployFile.repoDeploy;
-    }
-
-    onAfterAddingFile(fileItem) {
-        if (fileItem.file.size < 0) {
-            fileItem.okToUploadFile = false;
-            this.deployMultiUploader.removeFileFromQueue(fileItem);
-        }
-        else {
-            // Save original for display
-            fileItem.file.originalName = fileItem.file.name;
-            // Encode filename to support UTF-8 strings (server does decode)
-            fileItem.file.name = encodeURI(fileItem.file.name);
-            fileItem.okToUploadFile = true;
-        }
-    }
-
-    onProgressAll(progressPercent) {
-        if (!this.progress) {
-            this.progress = true;
-            this.artifactoryNotifications.createMessageWithHtml({
-                type: 'success',
-                body: '<div id="deploy-progress-percent">Deploy in progress... (0%)</div>' +
-                      '<div id="deploy-progress-frame"><div id="deploy-progress-line"></div></div>',
-                timeout: 60 * 60000 * 10
-            });
-            if (this.onSuccess && typeof this.onSuccess === 'function') {
-                this.onSuccess();
-            }
-        }
-        else {
-            let percElem = $('#deploy-progress-percent');
-            let lineElem = $('#deploy-progress-line');
-            percElem.text(`Deploy in progress... (${progressPercent}%)`)
-            lineElem.css('width',`${progressPercent}%`);
-        }
-    }
-
-    /**
-     * if exist char '&' need to be replace to  '%26' before upload
-     * @param name
-     * @returns {*}
-     * @private
-     */
-    _fixUrlPath(name) {
-        name = name.replace(/&/g, '%26');
-        var find = '&';
-        var re = new RegExp(find, 'g');
-        return name.replace(re, '%26');
-    }
-
-    /**
-     * set url to deploy for each file and deploy when ready
-     */
-    deployArtifacts() {
-
-        let DEPLOY_REST_URL = `${API.API_URL}/artifact/deploy/multi`;
-
-        if ((!this.deployFile.targetPath.endsWith("/"))) {
-            this.deployFile.targetPath += "/";
-        }
-
-        this.deployMultiUploader.getQueue().forEach((item)=> {
-            item.url = DEPLOY_REST_URL + '?repoKey=' + this.deployFile.repoDeploy.repoKey + '&path=' +
-            (this.deployFile.targetPath || '') + this._fixUrlPath(item.file.name);
-        });
-        this.deployMultiUploader.getUploader().uploadAll();
-    }
-
-
-}
-export function jfMultiDeploy() {
-    return {
-        restrict: 'EA',
-        scope: {
-            node: '=',
-            deploy: '&',
-            comm: '=',
-            deployFile: '=',
-            onSuccess: '&'
-        },
-        controller: jfMultiDeployController,
-        controllerAs: 'jfMultiDeploy',
-        bindToController: true,
-        templateUrl: 'directives/jf_deploy/jf_multi_deploy.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_deploy/jf_single_deploy.html b/web/angular-web/src/main/webapp/app/directives/jf_deploy/jf_single_deploy.html
deleted file mode 100644
index c599d85..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_deploy/jf_single_deploy.html
+++ /dev/null
@@ -1,342 +0,0 @@
-<div class="form-group">
-    <div class="form-group-cell">
-        <div class="drop-zone-wrapper">
-            <div class="drop-zone"
-                 nv-file-drop uploader="jfSingleDeploy.deploySingleUploader.getUploader()"
-                 nv-file-over over-class="drop-zone-hover"
-                 ng-if="!jfSingleDeploy.deploySingleUploader.getQueue().length" jf-disable-ng-animate>
-                <span class="icon icon-upload-small"></span>
-                <span class="icon icon-upload-hover"></span>
-                <br>
-                <input class="select-files-hidden"
-                       type="file"
-                       nv-file-select
-                       title=" "
-                       uploader="jfSingleDeploy.deploySingleUploader.getUploader()"/>
-                <span>Drop file</span> here or <span>Select file</span>
-            </div>
-            <div ng-repeat="item in jfSingleDeploy.deploySingleUploader.getUploader().queue">
-                <div ng-show="jfSingleDeploy.deploySingleUploader.getUploader().isHTML5"
-                     class="progress-deploy file-info">
-                    <div>
-                        <div class="progress">
-                            <div class="progress-bar" role="progressbar"
-                                 ng-style="{ 'width': item.progress + '%' }">
-                            </div>
-                        </div>
-                        <a href=""
-                           ng-click="jfSingleDeploy.onRemoveSingle(); item.remove();jfSingleDeploy.deployFile.unitInfo={}; jfSingleDeploy.clearPath(); jfSingleDeploy.uploadCompleted = false"
-                           jf-tooltip="Remove"
-                           class="icon icon-clear"></a>
-                    </div>
-                    <div class="file-name-deploy">
-                        <span ng-if="!jfSingleDeploy.uploadCompleted"> Uploading {{ item.file.name }}</span>
-                        <span ng-if="jfSingleDeploy.uploadCompleted"> Upload Completed </span>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
-</div>
-
-
-<form name="targetPath">
-    <div class="form-group">
-        <div class="form-group-cell">
-            <jf-field>
-                <label for="target-file">Target Path
-                </label>
-                <jf-help-tooltip
-                        html="jfSingleDeploy.TOOLTIP.targetPath"></jf-help-tooltip>
-                <input type="text"
-                       class="input-text"
-                       id="target-file"
-                       ng-model="jfSingleDeploy.deployFile.targetPath"
-                       ng-disabled="jfSingleDeploy.deployFile.unitInfo.mavenArtifact || jfSingleDeploy.deployFile.unitInfo.deployByLayout">
-            </jf-field>
-        </div>
-    </div>
-</form>
-
-<div class="form-group form-checkbox"
-     ng-if="jfSingleDeploy.deployFile.unitInfo && jfSingleDeploy.deployFile.unitInfo.valid && jfSingleDeploy.deployFile.repoDeploy.layoutPattern && !jfSingleDeploy.deployFile.unitInfo.mavenArtifact && !jfSingleDeploy.deployFile.unitInfo.debianArtifact && !jfSingleDeploy.deployFile.unitInfo.vagrantArtifact && !jfSingleDeploy.deployFile.unitInfo.bundle">
-    <jf-checkbox text="Deploy According To Layout">
-        <input type="checkbox"
-               id="delpoyByLayout"
-               ng-change="jfSingleDeploy.onToggleDeployByLayout()"
-               ng-model="jfSingleDeploy.deployFile.unitInfo.deployByLayout">
-    </jf-checkbox>
-</div>
-
-<div class="form-group form-checkbox"
-     ng-if="jfSingleDeploy.isMavenCheckBoxVisible() && !jfSingleDeploy.deployFile.unitInfo.bundle && !jfSingleDeploy.deployFile.unitInfo.deployByLayout && !jfSingleDeploy.deployFile.unitInfo.debianArtifact && !jfSingleDeploy.deployFile.unitInfo.vagrantArtifact">
-    <jf-checkbox text="Deploy as Maven Artifact">
-        <input type="checkbox"
-               id="maven"
-               ng-model="jfSingleDeploy.deployFile.unitInfo.mavenArtifact"
-               ng-change="jfSingleDeploy.changeMavenFileType()">
-    </jf-checkbox>
-    <jf-help-tooltip
-            html="jfSingleDeploy.TOOLTIP.deployAsMaven"></jf-help-tooltip>
-</div>
-<div class="form-group form-checkbox"
-     ng-if="(jfSingleDeploy.deployFile.unitInfo.debian || jfSingleDeploy.deployFile.unitInfo.artifactType=='debian' || jfSingleDeploy.deployFile.unitInfo.origArtifactType=='debian') && !jfSingleDeploy.deployFile.unitInfo.mavenArtifact && !jfSingleDeploy.deployFile.unitInfo.deployByLayout && !jfSingleDeploy.deployFile.unitInfo.vagrantArtifact &&!jfSingleDeploy.deployFile.unitInfo.bundle">
-    <jf-checkbox text="Deploy as Debian Package">
-        <input type="checkbox"
-               id="debian"
-               ng-model="jfSingleDeploy.deployFile.unitInfo.debianArtifact"
-               ng-change="jfSingleDeploy.changeDebianFileType()">
-    </jf-checkbox>
-    <jf-help-tooltip
-            html="jfSingleDeploy.TOOLTIP.deployAsDebian"></jf-help-tooltip>
-</div>
-<div class="form-group form-checkbox"
-     ng-if="(jfSingleDeploy.deployFile.unitInfo.artifactType=='vagrant') && !jfSingleDeploy.deployFile.unitInfo.debianArtifact && !jfSingleDeploy.deployFile.unitInfo.mavenArtifact && !jfSingleDeploy.deployFile.unitInfo.deployByLayout && !jfSingleDeploy.deployFile.unitInfo.bundle">
-    <jf-checkbox text="Deploy as Vagrant Box">
-        <input type="checkbox"
-               id="vagrant"
-               ng-model="jfSingleDeploy.deployFile.unitInfo.vagrantArtifact"
-               ng-change="jfSingleDeploy.changeVagrantFileType()">
-    </jf-checkbox>
-    <jf-help-tooltip
-            html="jfSingleDeploy.TOOLTIP.deployAsVagrantBox"></jf-help-tooltip>
-</div>
-<div class="form-group form-checkbox"
-     ng-if="jfSingleDeploy.deployFile.unitInfo.valid && jfSingleDeploy.isBundle && !jfSingleDeploy.deployFile.unitInfo.mavenArtifact && !jfSingleDeploy.deployFile.unitInfo.debianArtifact && !jfSingleDeploy.deployFile.unitInfo.vagrantArtifact && !jfSingleDeploy.deployFile.unitInfo.deployByLayout">
-    <jf-checkbox text="Deploy as Bundle Artifact">
-        <input type="checkbox"
-               id="bundle"
-               ng-model="jfSingleDeploy.deployFile.unitInfo.bundle">
-    </jf-checkbox>
-</div>
-
-<jf-panel jf-panel-heading="Layout Tokens"
-          ng-if="jfSingleDeploy.deployFile.unitInfo.deployByLayout">
-    <form name="jfSingleDeploy.layoutTokensForm">
-        <div ng-repeat="(token, value) in jfSingleDeploy.layoutTokens track by $index"
-             class="form-group">
-            <div class="form-group-cell">
-                <jf-field validations="common" delayed-init="true" dont-push-down-errors="true">
-                    <label for="token-{{token}}"
-                           ng-class="{mandatory: !jfSingleDeploy.layoutTokens[token].customSegment}"
-                           class="control-label deploy-label">{{token}}</label>
-                    <input type="text"
-                           class="input-text"
-                           id="token-{{token}}"
-                           name="token-{{token}}"
-                           ui-validate="{tokenRegexValidator: 'jfSingleDeploy.isTokenValueValid(token,$value)'}"
-                           ng-required="!jfSingleDeploy.layoutTokens[token].customSegment"
-                           ng-change="jfSingleDeploy.updatePathFromLayoutTokens()"
-                           ng-model="jfSingleDeploy.layoutTokens[token].value">
-                    <div class="jf-form-errors"
-                         ng-if="jfSingleDeploy.getTokenRegexError(token)"
-                         style="position: absolute">{{jfSingleDeploy.getTokenRegexError(token)}}</div>
-                </jf-field>
-            </div>
-        </div>
-    </form>
-</jf-panel>
-
-
-<jf-panel jf-panel-heading="Maven Artifact"
-          ng-if="jfSingleDeploy.isMavenSectionVisible()">
-    <form name="jfSingleDeploy.mavenArtifactForm">
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-field validations="common">
-                    <label for="GroupId"
-                           class="control-label deploy-label mandatory">Group ID
-                    </label>
-                    <input type="text"
-                           class="input-text"
-                           id="GroupId"
-                           name="GroupId"
-                           required
-                           ng-model="jfSingleDeploy.deployFile.unitInfo.groupId"
-                           ng-change="jfSingleDeploy.updateMavenTargetPath()">
-                </jf-field>
-            </div>
-            <div class="form-group-cell">
-                <jf-field validations="common">
-                    <label for="ArtifactId"
-                           class="control-label deploy-label mandatory">Artifact ID
-                    </label>
-                    <input type="text"
-                           class="input-text"
-                           id="ArtifactId"
-                           name="ArtifactId"
-                           required
-                           ng-model="jfSingleDeploy.deployFile.unitInfo.artifactId"
-                           ng-change="jfSingleDeploy.updateMavenTargetPath()">
-                </jf-field>
-            </div>
-        </div>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-field validations="common">
-                    <label for="Version"
-                           class="deploy-label mandatory">Version
-                    </label>
-                    <input type="text"
-                           class="input-text"
-                           id="Version"
-                           name="Version"
-                           required
-                           ng-model="jfSingleDeploy.deployFile.unitInfo.version"
-                           ng-change="jfSingleDeploy.updateMavenTargetPath()">
-                </jf-field>
-            </div>
-            <div class="form-group-cell">
-                <jf-field>
-                    <label for="Classifier"
-                           class="control-label deploy-label">Classifier
-                    </label>
-                    <input type="text"
-                           class="input-text"
-                           id="Classifier"
-                           ng-model="jfSingleDeploy.deployFile.unitInfo.classifier"
-                           ng-change="jfSingleDeploy.updateMavenTargetPath()">
-                </jf-field>
-            </div>
-        </div>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-field validations="common">
-                    <label for="Type"
-                           class="control-label deploy-label mandatory">Type
-                    </label>
-                    <input type="text"
-                           class="input-text"
-                           id="Type"
-                           name="Type"
-                           required
-                           ng-model="jfSingleDeploy.deployFile.unitInfo.type"
-                           ng-change="jfSingleDeploy.updateMavenTargetPath()">
-                </jf-field>
-            </div>
-        </div>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-checkbox text="Generate Default POM / Deploy Jar's Internal POM">
-
-                    <input type="checkbox"
-                           id="Internal"
-                           class="input-text"
-                           ng-model="jfSingleDeploy.deployFile.unitInfo.Internal">
-                </jf-checkbox>
-            </div>
-        </div>
-        <div class="form-group" ng-if="jfSingleDeploy.deployFile.unitInfo.Internal">
-            <jf-code-mirror mime-type="xml"
-                            model="jfSingleDeploy.deployFile.unitConfigFileContent"
-                            height="200px"
-                            allowEdit="false">
-            </jf-code-mirror>
-        </div>
-    </form>
-</jf-panel>
-
-<jf-panel jf-panel-heading="Debian Artifact"
-          ng-if="jfSingleDeploy.deployFile.unitInfo.debianArtifact">
-    <form name="mavenArifactForm">
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-field validations="common"
-                          autofocus="true">
-                    <label for="distribution"
-                           class="control-label deploy-label mandatory">Distribution
-                    </label>
-                    <input name="debDistribution"
-                           type="text"
-                           class="input-text"
-                           id="distribution"
-                           required
-                           ng-model="jfSingleDeploy.deployFile.unitInfo.distribution"
-                           ng-change="jfSingleDeploy.updateDebianTargetPath()">
-                </jf-field>
-            </div>
-            <div class="form-group-cell">
-                <jf-field validations="common">
-                    <label for="component"
-                           class="control-label deploy-label mandatory">Component
-                    </label>
-                    <input name="debComponent"
-                           type="text"
-                           class="input-text"
-                           id="component"
-                           required
-                           ng-model="jfSingleDeploy.deployFile.unitInfo.component"
-                           ng-change="jfSingleDeploy.updateDebianTargetPath()">
-                </jf-field>
-            </div>
-        </div>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-field validations="common">
-                    <label for="architecture"
-                           class="deploy-label mandatory">Architecture
-                    </label>
-                    <input name="debArchitecture"
-                           type="text"
-                           class="input-text"
-                           id="architecture"
-                           required
-                           ng-model="jfSingleDeploy.deployFile.unitInfo.architecture"
-                           ng-change="jfSingleDeploy.updateDebianTargetPath()">
-                </jf-field>
-            </div>
-        </div>
-    </form>
-</jf-panel>
-<jf-panel jf-panel-heading="Vagrant Artifact"
-          ng-if="jfSingleDeploy.deployFile.unitInfo.vagrantArtifact">
-    <form name="vagrantArifactForm">
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-field validations="common"
-                          autofocus="true">
-                    <label for="boxName"
-                           class="control-label deploy-label mandatory">Name
-                    </label>
-                    <input name="boxName"
-                           type="text"
-                           class="input-text"
-                           id="boxName"
-                           required
-                           ng-model="jfSingleDeploy.deployFile.unitInfo.boxName"
-                           ng-change="jfSingleDeploy.updateVagrantTargetPath()">
-                </jf-field>
-            </div>
-            <div class="form-group-cell">
-                <jf-field validations="common">
-                    <label for="boxProvider"
-                           class="control-label deploy-label mandatory">Provider
-                    </label>
-                    <input name="boxProvider"
-                           type="text"
-                           class="input-text"
-                           id="boxProvider"
-                           required
-                           ng-model="jfSingleDeploy.deployFile.unitInfo.boxProvider"
-                           ng-change="jfSingleDeploy.updateVagrantTargetPath()">
-                </jf-field>
-            </div>
-        </div>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-field validations="common">
-                    <label for="boxVersion"
-                           class="deploy-label mandatory">Version
-                    </label>
-                    <input name="boxVersion"
-                           type="text"
-                           class="input-text"
-                           id="boxVersion"
-                           required
-                           ng-model="jfSingleDeploy.deployFile.unitInfo.boxVersion"
-                           ng-change="jfSingleDeploy.updateVagrantTargetPath()">
-                </jf-field>
-            </div>
-        </div>
-    </form>
-</jf-panel>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_deploy/jf_single_deploy.js b/web/angular-web/src/main/webapp/app/directives/jf_deploy/jf_single_deploy.js
deleted file mode 100644
index 6e7e9f5..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_deploy/jf_single_deploy.js
+++ /dev/null
@@ -1,600 +0,0 @@
-/**
- * Created by idannaim on 8/6/15.
- */
-
-import EVENTS from '../../constants/artifacts_events.constants';
-import API from '../../constants/api.constants';
-import TOOLTIP from '../../constants/artifact_tooltip.constant';
-
-class jfSingleDeployController {
-    constructor($scope, ArtifactoryUploaderFactory, ArtifactDeployDao, ArtifactoryState,
-            ArtifactoryNotifications) {
-
-        this.comm.setController(this);
-        this.$scope = $scope;
-        this.artifactDeployDao = ArtifactDeployDao;
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this.artifactoryState = ArtifactoryState;
-        this.artifactoryUploaderFactory = ArtifactoryUploaderFactory;
-        this.errorQueue = [];
-        this.multiSuccessMessage = '';
-        this.TOOLTIP = TOOLTIP.artifacts.deploy;
-        this.originalDeployPath = '';
-        this.firstInit = true;
-        this.uploadCompleted = false;
-        this._initDeploy();
-        this._initEvent();
-
-    }
-
-    /**
-     * create uploader instance,
-     * set methods callback
-     * set path and file type
-     * @private
-     */
-    _initDeploy() {
-        let UPLOAD_REST_URL = `${API.API_URL}/artifact/upload`;
-        this.deploySingleUploader = this.artifactoryUploaderFactory.getUploaderInstance(this)
-                .setUrl(UPLOAD_REST_URL)
-                .setOnSuccessItem(this.onSuccessItem)
-                .setOnAfterAddingAll(this.onAfterAddingAll)
-                .setOnAfterAddingFile(this.onAfterAddingFile)
-                .setOnErrorItem(this.onUploadError)
-                .setOnCompleteAll(this.onCompleteAll);
-
-        this._setPathAndFileType(this.node.data.path);
-
-        // set data from currently open node
-    }
-
-    _initEvent() {
-        this.$scope.$on('$destroy', this.onRemoveSingle.bind(this));
-    }
-
-    /**
-     *  On file successfully uploaded: setting path for deploy.
-     *  if maven repo set fields and path
-     * @param fileDetails
-     * @param response
-     */
-    onSuccessItem(fileDetails, response) {
-        if (this.deployFile.repoDeploy.repoType !== 'Maven' && response.unitInfo.artifactType === 'maven') {
-            response.unitInfo.artifactType = "base";
-        }
-        response.unitInfo.origArtifactType = response.unitInfo.artifactType;
-        response.unitInfo.debianArtifact = response.unitInfo.artifactType==='debian';
-        response.unitInfo.mavenArtifact = response.unitInfo.artifactType==='maven';
-        response.unitInfo.vagrantArtifact = response.unitInfo.artifactType==='vagrant';
-//        response.unitInfo.originalMaven = response.unitInfo.artifactType==='maven';
-
-        let tempBundle = this.deployFile.unitInfo ? this.deployFile.unitInfo.bundle : false;
-        this.deployFile.unitInfo = response.unitInfo;
-        this.deployFile.unitInfo.bundle = tempBundle;
-        this.deployFile.unitInfo.type = fileDetails.file.name.substr(fileDetails.file.name.lastIndexOf('.')+1);
-
-        this.deployFile.unitConfigFileContent = response.unitConfigFileContent || "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\" xmlns=\"http://maven.apache.org/POM/4.0.0\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId></groupId>\n  <artifactId></artifactId>\n  <version></version>\n  <description>Artifactory auto gen [...]
-
-        //MavenArtifact causes 'deploy as' checkbox to be lit -> change deployment path according to GAVC
-        if (this.deployFile.unitInfo && this.deployFile.unitInfo.mavenArtifact) {
-            this.originalDeployPath = this.deployFile.targetPath;
-            this.updateMavenTargetPath()
-        }
-        if (this.deployFile.unitInfo && this.deployFile.unitInfo.debianArtifact) {
-            this.originalDeployPath = this.deployFile.targetPath;
-            this.updateDebianTargetPath()
-        }
-        if (this.comm) {
-            this.needToCancel = true;
-        }
-    }
-
-    /**
-     * check if path includes file/archive if yes cut it from the path and set .
-     * check if the current repo is local else clean path.
-     * Reset garbage deployFile and fields if exists.
-     * @param targetPath
-     * @private
-     */
-    _setPathAndFileType(targetPath) {
-        if (this.node.data.isInsideArchive()) {
-            targetPath = "";
-        }
-        else {
-            if (this.node.data.isFile() || this.node.data.isArchive()) {
-                if (targetPath.indexOf('/') > -1) {
-                    targetPath = targetPath.substr(0, targetPath.lastIndexOf('/'))
-                }
-                else if (targetPath.indexOf('\\') > -1) {
-                    targetPath = targetPath.substr(0, targetPath.lastIndexOf('\\'))
-                }
-                else {
-                    targetPath = "";
-                }
-            }
-        }
-        if (this.firstInit) {
-            if (this.comm && this.comm.localRepo) {
-                this.deployFile = {
-                    repoDeploy: this.comm.localRepo,
-                    targetPath: targetPath
-                }
-            } else {
-                this.deployFile = {
-                    repoDeploy: this.node.data.type == 'local' ? this.comm.reposList[0] : '',
-                    targetPath: targetPath
-                }
-            }
-        } else {
-            if (this.deployFile && this.deployFile.unitInfo && this.deployFile.unitInfo.mavenArtifact) {
-                this.deployFile.unitInfo.mavenArtifact = false;
-            }
-            if (this.deployFile && this.deployFile.unitInfo && this.deployFile.unitInfo.debianArtifact) {
-                this.deployFile.unitInfo.debianArtifact = false;
-            }
-            this.deployFile.unitInfo = {};
-            this.deployFile.fileName = '';
-            this.deploySingleUploader.clearQueue();
-            this.deployFile.targetPath = targetPath;
-        }
-        this.uploadCompleted = false;
-        this.firstInit = false;
-    }
-
-    /**
-     * if maven file upload
-     * update path by gavc (onChange)
-     */
-    updateMavenTargetPath() {
-        let newPath = '';
-        if (this.deployFile.unitInfo.groupId) {
-            newPath += this.deployFile.unitInfo.groupId.replace(/\./g, '/');
-        }
-        newPath += '/' + (this.deployFile.unitInfo.artifactId || '');
-        newPath += '/' + (this.deployFile.unitInfo.version || '');
-        newPath += '/' + (this.deployFile.unitInfo.artifactId || '');
-        newPath += '-' + (this.deployFile.unitInfo.version || '');
-        if (this.deployFile.unitInfo.classifier) {
-            newPath += '-' + this.deployFile.unitInfo.classifier;
-        }
-        newPath += '.' + (this.deployFile.unitInfo.type || '');
-
-        this.deployFile.targetPath = newPath;
-        this._bindToPomXml();
-    }
-
-    /**
-     * bind and update maven  xml (depend on updateMavenTargetPath)
-     * @private
-     */
-    _bindToPomXml() {
-        if (typeof window.DOMParser != 'undefined' && typeof window.XMLSerializer != 'undefined'
-                && this.deployFile.unitConfigFileContent) {
-            //Parse the code mirror model into xml object and modify based on input fields
-            let parser = new DOMParser();
-            let pomXml = parser.parseFromString(this.deployFile.unitConfigFileContent, "text/xml");
-            let groupId = pomXml.getElementsByTagName('groupId');
-            if (groupId.length) {
-                if (groupId[0].hasChildNodes()) {
-                    groupId[0].childNodes[0].nodeValue = this.deployFile.unitInfo.groupId;
-                } else {
-                    groupId[0].textContent = this.deployFile.unitInfo.groupId;
-                }
-            }
-            var artifactId = pomXml.getElementsByTagName('artifactId');
-            if (artifactId.length) {
-                if (artifactId[0].hasChildNodes()) {
-                    artifactId[0].childNodes[0].nodeValue = this.deployFile.unitInfo.artifactId;
-                } else {
-                    artifactId[0].textContent = this.deployFile.unitInfo.artifactId;
-                }
-            }
-            var version = pomXml.getElementsByTagName('version');
-            if (version.length) {
-                if (version[0].hasChildNodes()) {
-                    version[0].childNodes[0].nodeValue = this.deployFile.unitInfo.version;
-                } else {
-                    version[0].textContent = this.deployFile.unitInfo.version;
-                }
-            }
-            //Serialize updated pom xml back to string and re-set as model
-            let backToText = new XMLSerializer();
-            this.deployFile.unitConfigFileContent = backToText.serializeToString(pomXml);
-        }
-    }
-
-    /**
-     * check if missing fields to disable deploy button
-     * @returns {boolean|*}
-     */
-    isReady() {
-        let ok = true;
-        if (this.deployFile.unitInfo && this.deployFile.unitInfo.debianArtifact) {
-            ok = this.deployFile.unitInfo.distribution && this.deployFile.unitInfo.component && this.deployFile.unitInfo.architecture;
-        }
-        return ok && this.uploadCompleted && this.deployFile.repoDeploy && (!this.layoutTokensForm || this.layoutTokensForm.$valid) && (!this.mavenArtifactForm || this.mavenArtifactForm.$valid);
-    }
-
-    /**
-     * if debian file upload
-     * update path onChange
-     */
-    updateDebianTargetPath() {
-        let path;
-        if (this.deployFile.targetPath.indexOf(';') != -1) {
-            path = this.deployFile.targetPath.substring(0, this.deployFile.targetPath.indexOf(';'));
-        }
-        else {
-            path = this.deployFile.targetPath;
-        }
-        let newPath = '';
-        newPath += ( path || '');
-        if (this.deployFile.unitInfo.distribution) {
-            let dist=this.deployFile.unitInfo.distribution ? this.deployFile.unitInfo.distribution.split(';').join(';deb.distribution=') : null;
-            newPath += ";deb.distribution=" + (dist || '');
-        }
-        if (this.deployFile.unitInfo.component) {
-            let comp=this.deployFile.unitInfo.component ? this.deployFile.unitInfo.component.split(';').join(';deb.component=') : null;
-            newPath += ";deb.component=" + (comp || '');
-        }
-        if (this.deployFile.unitInfo.architecture) {
-            let arch=this.deployFile.unitInfo.architecture ? this.deployFile.unitInfo.architecture.split(';').join(';deb.architecture=') : null;
-            newPath += ";deb.architecture=" + (arch || '');
-        }
-        this.deployFile.targetPath = '';
-        this.deployFile.targetPath = newPath;
-    }
-
-    /**
-     * if vagrant box file upload
-     * update path onChange
-     */
-    updateVagrantTargetPath() {
-        let path;
-        if (this.deployFile.targetPath.indexOf(';') != -1) {
-            path = this.deployFile.targetPath.substring(0, this.deployFile.targetPath.indexOf(';'));
-        }
-        else {
-            path = this.deployFile.targetPath;
-        }
-        let newPath = '';
-        newPath += ( path || '');
-        if (this.deployFile.unitInfo.boxName) {
-            let name=this.deployFile.unitInfo.boxName ? this.deployFile.unitInfo.boxName.split(';').join(';box_name=') : null;
-            newPath += ";box_name=" + (name || '');
-        }
-        if (this.deployFile.unitInfo.boxProvider) {
-            let prov=this.deployFile.unitInfo.boxProvider ? this.deployFile.unitInfo.boxProvider.split(';').join(';box_provider=') : null;
-            newPath += ";box_provider=" + (prov || '');
-        }
-        if (this.deployFile.unitInfo.boxVersion) {
-            let ver=this.deployFile.unitInfo.boxVersion ? this.deployFile.unitInfo.boxVersion.split(';').join(';box_version=') : null;
-            newPath += ";box_version=" + (ver || '');
-        }
-        this.deployFile.targetPath = '';
-        this.deployFile.targetPath = newPath;
-    }
-
-    /**
-     *onAfterAddingAll Verifies upload only one file
-     * @param fileItems
-     */
-    onAfterAddingAll(fileItems) {
-        if (fileItems.length > 1) {
-            this.artifactoryNotifications.create({error: "You can only deploy one file"});
-            this.deploySingleUploader.clearQueue();
-            return;
-        }
-
-        let uploadAll = true;
-
-        fileItems.forEach((item)=> {
-            if (!item.okToUploadFile) {
-                uploadAll = false;
-                return;
-            }
-        });
-        if (uploadAll) {
-            this.deploySingleUploader.uploadAll();
-        }
-        else {
-            return;
-        }
-    }
-
-    onAfterAddingFile(fileItem) {
-        this.isBundle = _.endsWith(fileItem.file.name, 'zip') ||
-                        _.endsWith(fileItem.file.name, 'tar') ||
-                        _.endsWith(fileItem.file.name, 'tgz') ||
-                        _.endsWith(fileItem.file.name, 'tar.gz') ;
-        this.deployFile.fileName = fileItem.file.name;
-        if (this.deployFile.targetPath.slice(-1) != "/") {
-            this.deployFile.targetPath += "/";
-        }
-        this.deployFile.targetPath += fileItem.file.name;
-
-        if (fileItem.file.size < 0) {
-            fileItem.okToUploadFile = false;
-            this.deploySingleUploader.removeFileFromQueue(fileItem);
-        }
-        else {
-            // Save original for display
-            fileItem.file.originalName = fileItem.file.name;
-            // Encode filename to support UTF-8 strings (server does decode)
-            fileItem.file.name = encodeURIComponent(fileItem.file.name);
-            fileItem.okToUploadFile = true;
-        }
-    }
-
-    /**
-     * when upload item error push to queue for notifications
-     * @param item
-     * @param response
-     */
-    onUploadError(item, response) {
-        this.errorQueue.push({item: item, response: response});
-        this.artifactoryNotifications.create(response);
-        this.deploySingleUploader.removeFileFromQueue(item);
-
-        this.deployFile.unitInfo={};
-        this.clearPath();
-    }
-
-    /**
-     * trigger if user checked for edit maven gavc
-     * if not set artifactType = origArtifactType
-     */
-    changeMavenFileType() {
-        if (!this.deployFile.unitInfo.mavenArtifact) {
-            this.deployFile.unitInfo.maven = false;
-            this.deployFile.unitInfo.artifactType = this.deployFile.unitInfo.origArtifactType === 'maven' ? 'base' : this.deployFile.unitInfo.origArtifactType;
-            if (this.originalDeployPath) {
-                this.deployFile.targetPath = angular.copy(this.originalDeployPath);
-            }
-            this.tempUnitConfigFileContent = this.deployFile.unitConfigFileContent;
-            delete this.deployFile.unitConfigFileContent;
-        }
-        else {
-            this.deployFile.unitInfo.maven = true;
-            this.deployFile.unitInfo.artifactType = 'maven';
-            this.originalDeployPath = angular.copy(this.deployFile.targetPath);
-            if (this.tempUnitConfigFileContent) {
-                this.deployFile.unitConfigFileContent = this.tempUnitConfigFileContent;
-            }
-            this.updateMavenTargetPath();
-        }
-    }
-
-    /**
-     * trigger if user checked for edit debian
-     * if not set artifactType = origArtifactType
-     */
-
-    changeDebianFileType() {
-        if (!this.deployFile.unitInfo.debianArtifact) {
-            this.deployFile.unitInfo.artifactType = this.deployFile.unitInfo.origArtifactType === 'debian' ? 'base' : this.deployFile.unitInfo.origArtifactType;
-            this.deployFile.unitInfo.debian = false;
-            if (this.originalDeployPath) {
-                this.deployFile.targetPath = angular.copy(this.originalDeployPath);
-            }
-        }
-        else {
-            this.deployFile.unitInfo.debian = true;
-            this.deployFile.unitInfo.artifactType = 'debian';
-            this.originalDeployPath = angular.copy(this.deployFile.targetPath);
-            this.updateDebianTargetPath();
-        }
-    }
-
-    onToggleDeployByLayout() {
-        if (this.deployFile.unitInfo.deployByLayout) {
-            this.tempPathBeforeUsingLayout = this.deployFile.targetPath;
-            if (!this.layoutTokens) {
-                this.extractTokensFromLayout();
-            }
-            this.deployFile.targetPath = this.getPathFromLayoutTokens();
-        }
-        else {
-            this.deployFile.targetPath = this.tempPathBeforeUsingLayout;
-        }
-    }
-
-    onCompleteAll() {
-        this.progress = false;
-        let body = '<ul>';
-        this.artifactoryNotifications.clear();
-        if (this.errorQueue.length) {
-            this.errorQueue.forEach((error)=> {
-                body += '<li>"' + error.item.file.name + '" ' + error.response.error + '</li>'
-            })
-            body += '</ul>';
-            this.artifactoryNotifications.createMessageWithHtml({type: 'error', body: body, timeout: 10000});
-            this.deploySingleUploader.clearQueue();
-            this.errorQueue = [];
-        }
-        else { //only when no errors
-            this.uploadCompleted = true;
-        }
-    }
-
-    /**
-     * when user removed selected file 'clearPath' is calling
-     */
-    clearPath() {
-        if (this.node.data.isFolder() || this.node.data.isRepo()) {
-            this.deployFile.targetPath = this.node.data.path;
-        } else {
-            this.deployFile.targetPath = this.deployFile.targetPath.replace("/" + this.deployFile.fileName, "");
-        }
-        delete this.layoutTokens;
-        this.uploadCompleted = false;
-    }
-
-    /**
-     *
-     * cancel file upload remove from server stock
-     */
-    onRemoveSingle() {
-        if (this.needToCancel) {
-            this.artifactDeployDao.cancelUpload({fileName: this.deployFile.fileName});
-            this.needToCancel = false;
-        }
-    }
-
-    /**
-     * deploy after adding file to queue
-     */
-    deployArtifacts() {
-        let singleDeploy = {};
-        singleDeploy.action = "deploy";
-        singleDeploy.unitInfo = this.deployFile.unitInfo;
-        singleDeploy.unitInfo.path = angular.copy(this.deployFile.targetPath);
-        singleDeploy.fileName = this.deployFile.fileName;
-        singleDeploy.repoKey = this.deployFile.repoDeploy.repoKey;
-
-        if (this.deployFile.unitInfo.Internal && this.deployFile.unitConfigFileContent) {
-            singleDeploy.publishUnitConfigFile = true;
-            singleDeploy.unitConfigFileContent = this.deployFile.unitConfigFileContent;
-        }
-        if (!this.deployFile.unitInfo.bundle) {
-            this.artifactDeployDao.post(singleDeploy).$promise.then((result)=> {
-                if (result.data) {
-                    this.deploySuccess(result.data);
-                }
-            });
-        }
-        else {
-            this.artifactDeployDao.postBundle(singleDeploy).$promise.then((result)=> {
-                if (result.data) {
-                    this.deploySuccess(result.data);
-                }
-            });
-        }
-    }
-
-    deploySuccess(data) {
-        this.artifactoryNotifications.createMessageWithHtml(this.comm.createNotification(data));
-        this.needToCancel = false;
-        this.onSuccess();
-    }
-
-    isMavenCheckBoxVisible() {
-//        return this.deployFile.unitInfo && (this.deployFile.unitInfo.originalMaven || (this.deployFile.unitInfo.valid && this.deployFile.repoDeploy.repoType === 'Maven'));
-        return this.deployFile.unitInfo && (this.deployFile.unitInfo.valid && this.deployFile.repoDeploy.repoType === 'Maven');
-    }
-    isMavenSectionVisible() {
-        return this.deployFile.unitInfo && this.deployFile.unitInfo.mavenArtifact && this.isMavenCheckBoxVisible();// && (this.deployFile.unitInfo.maven || (this.deployFile.unitInfo.valid && this.deployFile.repoDeploy.repoType === 'Maven'));
-    }
-
-
-    extractTokensFromLayout() {
-
-        let extractToken = (tokenMatch,customSegment) => {
-            let tokenKey = tokenMatch[1];
-
-            let tokenRegex = tokenKey.match(/\<(.*?)\>/);
-            if (tokenRegex) {
-                tokenKey = tokenKey.split(tokenRegex[0]).join('');
-            }
-
-            if (customSegment) customSegment.tokens.push(tokenKey);
-            this.layoutTokens[tokenKey] = {
-                exactString: tokenMatch[0],
-                customSegment: customSegment,
-                regex: tokenKey==='folderItegRev' ? this.deployFile.repoDeploy.layoutFolderItegRevRegex : tokenKey==='fileItegRev' ? this.deployFile.repoDeploy.layoutFileItegRevRegex : tokenRegex ? tokenRegex[1] : undefined,
-                value: tokenKey==='ext' ? this.deployFile.unitInfo.type : ''
-            };
-        };
-
-        let pattern = this.deployFile.repoDeploy.layoutPattern;
-        this.layoutTokens = {};
-
-        let nextToken = pattern.match(/\[(.*?)\]/);
-        while (nextToken) {
-            let nextTokenIndex = pattern.search(/\[(.*?)\]/);
-            let nextCustomSegmentIndex = pattern.search(/\((.*?)\)/);
-
-            if (nextTokenIndex < nextCustomSegmentIndex || nextCustomSegmentIndex === -1) {
-                extractToken(nextToken);
-                pattern = pattern.replace(nextToken[0],'');
-                nextToken = pattern.match(/\[(.*?)\]/);
-            }
-            else {
-                let customSegment = {
-                    match: pattern.match(/\((.*?)\)/),
-                    tokens: []
-                };
-                let customPattern = customSegment.match[1];
-                let nextCustomToken = customPattern.match(/\[(.*?)\]/);
-                while (nextCustomToken) {
-                    extractToken(nextCustomToken,customSegment);
-                    customPattern = customPattern.replace(nextCustomToken[0],'');
-                    nextCustomToken = customPattern.match(/\[(.*?)\]/);
-                }
-                pattern = pattern.replace(customSegment.match[0],'');
-                nextToken = pattern.match(/\[(.*?)\]/);
-            }
-        }
-
-    }
-
-    getPathFromLayoutTokens() {
-        let pattern = this.deployFile.repoDeploy.layoutPattern;
-        for (let token in this.layoutTokens) {
-            let customSegment = this.layoutTokens[token].customSegment;
-            if (customSegment) {
-                let allFilled = true;
-                for (let i in customSegment.tokens) {
-                    if (!this.layoutTokens[customSegment.tokens[i]].value) {
-                        allFilled = false;
-                        break;
-                    }
-                }
-                if (allFilled) {
-                    pattern = pattern.split(customSegment.match[0]).join(customSegment.match[1]);
-                    pattern = pattern.split(this.layoutTokens[token].exactString).join(this.layoutTokens[token].value);
-                }
-                else {
-                    pattern = pattern.split(customSegment.match[0]).join('');
-                }
-            }
-            else {
-                if (this.layoutTokens[token].value) pattern = pattern.split(this.layoutTokens[token].exactString).join(this.layoutTokens[token].value);
-            }
-        }
-        return pattern;
-    }
-
-    updatePathFromLayoutTokens() {
-        this.deployFile.targetPath = this.getPathFromLayoutTokens();
-    }
-
-    isTokenValueValid(tokenKey,value) {
-        return !value || !this.layoutTokens[tokenKey].regex || (new RegExp('^'+this.layoutTokens[tokenKey].regex+'$')).test(value);
-    }
-
-    getTokenRegexError(tokenKey) {
-        let showErrors = this.layoutTokensForm[`token-${tokenKey}`].showErrors;
-        let errObj = this.layoutTokensForm[`token-${tokenKey}`].$error;
-        if (showErrors && errObj.tokenRegexValidator && !errObj.required) {
-            return `Value do not match regex: ${this.layoutTokens[tokenKey].regex}`
-        }
-    }
-
-}
-export function jfSingleDeploy() {
-    return {
-        restrict: 'EA',
-        scope: {
-            node: '=',
-            deploy: '&',
-            comm: '=',
-            deployFile: '=',
-            onSuccess: '&'
-        },
-        controller: jfSingleDeployController,
-        controllerAs: 'jfSingleDeploy',
-        bindToController: true,
-        templateUrl: 'directives/jf_deploy/jf_single_deploy.html'
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_disable_feature/jf_disable_feature.js b/web/angular-web/src/main/webapp/app/directives/jf_disable_feature/jf_disable_feature.js
deleted file mode 100644
index 9bc8d9b..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_disable_feature/jf_disable_feature.js
+++ /dev/null
@@ -1,43 +0,0 @@
-export function jfDisableFeature(ArtifactoryFeatures, $timeout) {
-  return {
-    restrict: 'A',
-    link: function ($scope, $element, $attrs) {
-      let feature = $attrs.jfDisableFeature;
-      let currentLicense = ArtifactoryFeatures.getCurrentLicense();
-      if (!feature) return;
-      if (ArtifactoryFeatures.isHidden(feature)) {
-        $($element).hide();
-      }
-      else if (ArtifactoryFeatures.isDisabled(feature)) {
-        if (currentLicense === "OSS") {
-          $timeout(() => {
-              $($element).find("*").attr('disabled', true)
-          }, 500, false);
-          let license = ArtifactoryFeatures.getAllowedLicense(feature);
-          // Add the correct class:
-          $($element).addClass('license-required-' + license);
-          $($element).addClass('license-required');
-
-          // Add a tooltip with link to the feature page:
-          let featureName = ArtifactoryFeatures.getFeatureName(feature);
-          let featureLink = ArtifactoryFeatures.getFeatureLink(feature);
-
-          $($element).tooltipster({
-                    animation: 'fade',
-                    contentAsHTML : 'true',
-                    trigger: 'hover',
-                    onlyOne: 'true',
-                    interactive: 'true',
-                    interactiveTolerance: 150,
-                    position: 'top',
-                    theme: 'tooltipster-default top',
-                    content: featureLink ? `Learn more about the <a href="${featureLink}" target="_blank">${featureName}</a> feature` : `${featureName} feature is not supported in OSS version`
-                });
-        }
-        else {
-          $($element).hide();
-        }
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_disable_ng_animate/jf_disable_ng_animate.js b/web/angular-web/src/main/webapp/app/directives/jf_disable_ng_animate/jf_disable_ng_animate.js
deleted file mode 100644
index 51a0ca5..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_disable_ng_animate/jf_disable_ng_animate.js
+++ /dev/null
@@ -1,13 +0,0 @@
-class jfDisableNgAnimateController {
-	constructor($element, $animate) {
-		$animate.enabled($element,false);
-	}
-}
-
-export function jfDisableNgAnimate() {
-	return {
-		restrict: 'A',
-		scope: false,
-		controller: jfDisableNgAnimateController
-	}
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_docker_v2_layer/cmd_color_map.js b/web/angular-web/src/main/webapp/app/directives/jf_docker_v2_layer/cmd_color_map.js
deleted file mode 100644
index 22179c9..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_docker_v2_layer/cmd_color_map.js
+++ /dev/null
@@ -1,19 +0,0 @@
-export default {
-    'RUN': '#f3c43d',
-    'CMD': '#429f46',
-    'ADD': '#662d91',
-    'MAINTAINER': '#000080',
-    'EXPOSE': '#d7593f',
-    'FROM': '#c8c8c8',
-    'LABEL': '#b2d567',
-    'ENV': '#707070',
-    'COPY': '#2fa4db',
-    'ENTRYPOINT': '#2b2b2b',
-    'VOLUME': '#d54581',
-    'USER': '#add8e6',
-    'WORKDIR': '#fdcfa3',
-    'ARG': '#ffd700',
-    'ONBUILD': '#fa8072',
-    'STOPSIGNAL': '#6ab29b'
-    
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_docker_v2_layer/jf_docker_v2_layer.html b/web/angular-web/src/main/webapp/app/directives/jf_docker_v2_layer/jf_docker_v2_layer.html
deleted file mode 100644
index c1fcc5c..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_docker_v2_layer/jf_docker_v2_layer.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<li ng-click="jfDockerV2Layer.setSelected(true)" ng-class="{'selected':jfDockerV2Layer.isSelected()}">
-    <div class="title" ng-click="jfDockerV2Layer.collapsed = !jfDockerV2Layer.collapsed" ng-class="{open: !jfDockerV2Layer.collapsed}">
-        <span class="cmd-color-bar" ng-style="{backgroundColor: jfDockerV2Layer.COLOR_MAP[jfDockerV2Layer.data.command]}"></span>
-        {{jfDockerV2Layer.data.command}}
-        <span class="current-node-name" ng-if="jfDockerV2Layer.isUpper">{{jfDockerV2Layer.parent.currentPath.substr(jfDockerV2Layer.parent.currentPath.lastIndexOf('/') + 1)}}</span>
-        <span class="layer-id-display">{{jfDockerV2Layer.data.shortId}}</span>
-    </div>
-    <ul class="layer-details" collapse="jfDockerV2Layer.collapsed">
-
-        <li class="id">
-            <i class="icon icon-docker-id" jf-tooltip="ID"></i> <span jf-tooltip="{{jfDockerV2Layer.data.id}}">{{jfDockerV2Layer.data.id}}</span>
-        </li>
-        <li class="id">
-            <i class="icon icon-docker-digest" jf-tooltip="Digest"></i> <span jf-tooltip="{{jfDockerV2Layer.data.id}}">{{jfDockerV2Layer.data.digest}}</span>
-        </li>
-        <li>
-            <span class="commandtext"><i class="icon icon-docker-command" jf-tooltip="Command"></i>{{jfDockerV2Layer.data.commandText}}</span>
-        </li>
-        <li class="inline-cells">
-            <div><i class="icon icon-docker-created" jf-tooltip="Created"></i>{{jfDockerV2Layer.created}}</div>
-            <div><i class="icon icon-docker-size" jf-tooltip="Size"></i>{{jfDockerV2Layer.data.size}}</div>
-        </li>
-
-    </ul>
-</li>
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_docker_v2_layer/jf_docker_v2_layer.js b/web/angular-web/src/main/webapp/app/directives/jf_docker_v2_layer/jf_docker_v2_layer.js
deleted file mode 100644
index 038de3e..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_docker_v2_layer/jf_docker_v2_layer.js
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- USAGE EXAMPLE:
-
- <jf-grid-filter
- filter-grid="gridOptions"  //the name of the grid (grid options)
- filter-field="fieldName"        //the name of the field that should be filtered
- filter-on-change>          //optional - don't use a button for filtering, filter on every change
- </jf-grid-filter>
-
- */
-import COLOR_MAP from './cmd_color_map.js';
-
-class jfDockerV2LayerController {
-
-    constructor() {
-        this.data.commandText = this.data.command + ' ' + this.data.commandText;
-        this.selected = false;
-        this.COLOR_MAP = COLOR_MAP;
-        this.parent.layerDirectives.push(this);
-        this.collapsed = true;
-
-        let created = this.data.created.split("T");
-        this.created = created[0] + " " + created[1].split('.')[0];
-
-        if (this.preselected)
-            this.setSelected(true);
-    }
-
-    isSelected() {
-        return this.selected;
-    }
-
-    setSelected(s) {
-        this.selected = s;
-        this.parent.setSelected(this);
-    }
-}
-
-export function jfDockerV2Layer() {
-
-    return {
-        restrict: 'E',
-        scope: {
-            parent: '=',
-            data: '=',
-            preselected: '=',
-            isBase: '=',
-            isUpper: '='
-        },
-        controller: jfDockerV2LayerController,
-        controllerAs: 'jfDockerV2Layer',
-        templateUrl: 'directives/jf_docker_v2_layer/jf_docker_v2_layer.html',
-        bindToController: true
-    };
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_docker_v2_layers/details_key_dictionary.js b/web/angular-web/src/main/webapp/app/directives/jf_docker_v2_layers/details_key_dictionary.js
deleted file mode 100644
index 6ff9ef2..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_docker_v2_layers/details_key_dictionary.js
+++ /dev/null
@@ -1,8 +0,0 @@
-export default {
-    'id': {icon: 'icon icon-docker-id', tooltip: 'ID'},
-    'digest': {icon: 'icon icon-docker-digest', tooltip: 'Digest'},
-    'command': {icon: 'icon icon-docker-command', tooltip: 'Command'},
-    'commandText': {icon: 'icon icon-docker-command', tooltip: 'Command'},
-    'created': {icon: 'icon icon-docker-created', tooltip: 'Created'},
-    'size': {icon: 'icon icon-docker-size', tooltip: 'Size'}
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_docker_v2_layers/jf_docker_v2_layers.html b/web/angular-web/src/main/webapp/app/directives/jf_docker_v2_layers/jf_docker_v2_layers.html
deleted file mode 100644
index 8400180..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_docker_v2_layers/jf_docker_v2_layers.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<div class="docker-v2-layers-visualization">
-    <div class="layers-container">
-        <ul class="docker-v2-layer-container">
-        <jf-docker-v2-layer ng-repeat="layer in jfDockerV2Layers.data track by $index"
-                            parent="jfDockerV2Layers"
-                            data="layer"
-                            preselected="$index === 0"
-                            is-base="$index === jfDockerV2Layers.data.length-1"
-                            is-upper="$index === 0">
-        </jf-docker-v2-layer>
-        </ul>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_docker_v2_layers/jf_docker_v2_layers.js b/web/angular-web/src/main/webapp/app/directives/jf_docker_v2_layers/jf_docker_v2_layers.js
deleted file mode 100644
index f549d8f..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_docker_v2_layers/jf_docker_v2_layers.js
+++ /dev/null
@@ -1,40 +0,0 @@
-import KEY_DICTIONARY from './details_key_dictionary.js';
-
-class jfDockerV2LayersController {
-    constructor($scope, $attrs) {
-        this.KEY_DICTIONARY = KEY_DICTIONARY;
-
-        this.selectedLayer = null;
-        this.layerDirectives = [];
-
-        this.controller.layersController = this;
-    }
-
-    setSelected(layer) {
-        if (this.selectedLayer && this.selectedLayer !== layer)
-            this.selectedLayer.setSelected(false);
-        this.selectedLayer = layer;
-    }
-
-    refreshView() {
-        if (this.layerDirectives.length)
-            this.layerDirectives[0].setSelected(true);
-
-        $('#jf-artifacts .main-view').animate({ scrollTop: "0" }, 400);
-    }
-}
-
-export function jfDockerV2Layers() {
-    return {
-        restrict: 'E',
-        scope: {
-            controller: '=',
-            data: '=',
-            currentPath: '@'
-        },
-        controller: jfDockerV2LayersController,
-        controllerAs: 'jfDockerV2Layers',
-        templateUrl: 'directives/jf_docker_v2_layers/jf_docker_v2_layers.html',
-        bindToController: true
-    };
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_drag_drop/jf_drag_drop.html b/web/angular-web/src/main/webapp/app/directives/jf_drag_drop/jf_drag_drop.html
deleted file mode 100644
index d85628d..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_drag_drop/jf_drag_drop.html
+++ /dev/null
@@ -1,102 +0,0 @@
-<div class="dnd-panel" ng-keydown="jfDragDrop.onKeyDown($event)" tabindex="0">
-    <div class="row">
-        <div class="col-lg-5">
-            <input type="text"
-                   ng-style="{color:jfDragDrop.noMatches ? 'red' : 'black'}"
-                   ng-model="jfDragDrop.filterList"
-                   placeholder="Filter..."
-                   ng-change="jfDragDrop.filterChange()"
-                   ng-disabled="jfDragDrop.disabled"
-                   class="input-text dnd-filter">
-        </div>
-    </div>
-    <div class="row margin-top-10">
-        <div class="col-lg-5">
-            <h5 class="text-primary" ng-if="jfDragDrop.headers.leftTitle">
-                {{jfDragDrop.headers.leftTitle}}
-            </h5>
-            <div id="dnd-exclude-list"
-                 class="dnd-list-wrapper"
-                 ng-mouseenter="jfDragDrop.mouseIsInExclude(true)"
-                 ng-mouseleave="jfDragDrop.mouseIsInExclude(false)">
-                <ul class="dnd-list">
-                    <li ng-repeat="item in jfDragDrop._getFilteredExcludeList() track by $index"
-                        class="drag-item"
-                        ng-class="{'drag-placeholder':item===jfDragDrop.PLACEHOLDER, 'active' : jfDragDrop.isSelected(item)}"
-                        data-index="exc-{{$index}}"
-                        ng-click="jfDragDrop.toggleSelection(item)"
-                        ng-dblclick="jfDragDrop.includeSpecific(item)"
-                        ng-mouseenter="jfDragDrop.mouseOver(item)"
-                        ng-mouseleave="jfDragDrop.mouseOver(null)">
-                        <div class="drag-item-text" ng-if="item !== jfDragDrop.PLACEHOLDER">
-                            <i ng-if= "item._iconClass" class = "{{item._iconClass}}"></i>
-                            {{jfDragDrop.excludeDisplayField && item[jfDragDrop.excludeDisplayField] ? item[jfDragDrop.excludeDisplayField] : item}}
-                        </div>
-                        <div class="drag-item-text" ng-if="item === jfDragDrop.PLACEHOLDER"></div>
-                    </li>
-                </ul>
-            </div>
-        </div>
-
-        <div class="col-lg-2">
-            <h5 class="text-primary" ng-if="jfDragDrop.headers.leftTitle || jfDragDrop.headers.rightTitle"> </h5>
-            <ul class="dnd-actions">
-                <li>
-                    <span ng-click="jfDragDrop.excludeAll()"
-                          ng-disabled="jfDragDrop.isIncludeListEmpty() || jfDragDrop.isIncludeListFixed() || jfDragDrop.disabled">«
-                    </span>
-                </li>
-                <li>
-                    <span ng-click="jfDragDrop.excludeSelected()"
-                          ng-disabled="jfDragDrop.isIncludeListItemSelected() || jfDragDrop.disabled">‹
-                    </span>
-                </li>
-                <li>
-                    <span ng-click="jfDragDrop.includeSelected()"
-                          ng-disabled="jfDragDrop.isExcludeListItemSelected() || jfDragDrop.disabled">›
-                    </span>
-                </li>
-                <li>
-                    <span ng-click="jfDragDrop.includeAll()"
-                          ng-disabled="jfDragDrop.isExcludeListEmpty() || jfDragDrop.disabled">»
-                    </span>
-                </li>
-            </ul>
-        </div>
-
-        <div class="col-lg-5">
-            <h5 class="text-primary"
-                ng-if="jfDragDrop.headers.rightTitle">{{jfDragDrop.headers.rightTitle}}
-            </h5>
-            <div id="dnd-include-list"
-                 class="dnd-list-wrapper"
-                 ng-mouseenter="jfDragDrop.mouseIsInInclude(true)"
-                 ng-mouseleave="jfDragDrop.mouseIsInInclude(false)">
-                <ul class="dnd-list dnd-list-fullheight">
-                    <li class="gap-list"
-                        ng-if="!jfDragDrop.headers.rightTitle"></li>
-                    <li ng-repeat="item in jfDragDrop.includeList track by $index"
-                        class="drag-item dropped-item"
-                        ng-class="{'drag-placeholder':item===jfDragDrop.PLACEHOLDER, 'active' : jfDragDrop.isSelected(item)}"
-                        data-index="inc-{{$index}}"
-                        ng-click="!$event.defaultPrevented ? (jfDragDrop.toggleSelection(item)) : ''"
-                        ng-dblclick="jfDragDrop.excludeSpecific(item)"
-                        ng-mouseenter="jfDragDrop.mouseOver(item)"
-                        ng-mouseleave="jfDragDrop.mouseOver(null)">
-                        <div class="drag-item-text" ng-if="item !== jfDragDrop.PLACEHOLDER">
-                            <i ng-if= "item._iconClass" class = "{{item._iconClass}}"></i>
-                            {{jfDragDrop.includeDisplayField && item[jfDragDrop.includeDisplayField] ? item[jfDragDrop.includeDisplayField] : item}}
-                        </div>
-                        <div class="drag-item-text" ng-if="item === jfDragDrop.PLACEHOLDER"></div>
-                        <a ng-if="item && item !== jfDragDrop.PLACEHOLDER && !item['__fixed__'] && !jfDragDrop.disabled"
-                           href=""
-                           class="delete-drop-item"
-                           ng-click="jfDragDrop.excludeSpecific(item);$event.preventDefault();">✕</a>
-                    </li>
-                </ul>
-            </div>
-        </div>
-    </div>
-    <div class="clearfix"></div>
-    {{jfDragDrop.draggedOffset}}
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_drag_drop/jf_drag_drop.js b/web/angular-web/src/main/webapp/app/directives/jf_drag_drop/jf_drag_drop.js
deleted file mode 100644
index 3b42536..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_drag_drop/jf_drag_drop.js
+++ /dev/null
@@ -1,695 +0,0 @@
-export function jfDragDrop() {
-
-    return {
-        restrict: 'E',
-        scope: {
-            includeList: '=',
-            excludeList: '=',
-            includeDisplayField: '@',
-            excludeDisplayField: '@',
-            objectsName: '@',
-            headers: '=',
-            onChange: '&',
-            disabled: '=ngDisabled'
-        },
-        templateUrl: 'directives/jf_drag_drop/jf_drag_drop.html',
-        controller: jfDragDropController,
-        controllerAs: 'jfDragDrop',
-        bindToController: true,
-        link: ($scope, $element) => {
-            $($element).on('mouseenter','.drag-item-text',(e)=>{
-                let dragItem = $(e.target);
-
-                if (dragItem.hasClass('drag-item-text')) {
-                    if (dragItem[0].scrollWidth > dragItem.innerWidth()) {
-                        if (!dragItem.hasClass('tooltipstered')) {
-                            dragItem.tooltipster({
-                                animation: 'fade',
-                                trigger: 'hover',
-                                onlyOne: 'true',
-                                interactive: 'true',
-                                position: 'bottom',
-                                theme: 'tooltipster-default bottom',
-                                content: dragItem.text().trim()
-                            });
-                            dragItem.tooltipster('show');
-                        }
-                        else {
-                            dragItem.tooltipster('enable');
-                            if (dragItem.tooltipster('content') != dragItem.text().trim())
-                                dragItem.tooltipster('content', dragItem.text().trim());
-                        }
-                    }
-                    else if (dragItem.hasClass('tooltipstered'))
-                        dragItem.tooltipster('disable');
-                }
-            });
-        }
-    }
-}
-
-/**
- * API for the jfDragDrop directive
- */
-class jfDragDropController {
-
-    constructor($attrs,$interval,$element,$scope,$timeout) {
-        this.$element = $element;
-        this.$scope = $scope;
-        this.$timeout = $timeout;
-        this.$interval = $interval;
-        this.draggedObject = null;
-        this.PLACEHOLDER = {'@@@DNDPH@@@': '@@@DNDPH@@@'};
-
-        this.selectedItems = [];
-        if (!this.includeList) this.includeList = [];
-        _.remove(this.excludeList, (excludeItem) => {
-            return _.find(this.includeList, (includeItem) => angular.equals(includeItem, excludeItem))
-        });
-    }
-
-    /**
-     * move all the selected items to the exclude list.å
-     * clear those items from the included list
-     */
-    excludeAll() {
-        if (this.disabled || this.isIncludeListEmpty() || this.isIncludeListFixed()) return;
-
-        let staying = [];
-        this.includeList.forEach((item)=> {
-            if (!_.isObject(item) || !item["__fixed__"]) {
-                this.excludeList.push(item);
-            } else {
-                staying.push(item);
-            }
-        });
-        this.includeList.splice(0, this.includeList.length);//this.includeList = [];
-        this.includeList = this.includeList.concat(staying);
-        this._clearSelectedItems();
-        if (this.onChange) this.onChange();
-    }
-
-    /**
-     * move the selected items to the exclude list.
-     * clear those items from the include list
-     */
-    excludeSelected() {
-        if (this.disabled || this.isIncludeListItemSelected()) return;
-
-        this._filterSelection('inc');
-
-        this.selectedItems.forEach((item) => {
-            if (!_.isObject(item) || !item["__fixed__"]) {
-                this.includeList.splice(this.includeList.indexOf(item), 1);
-
-                if (this.excludeList.indexOf(item) < 0) {
-                    this.excludeList.push(item);
-                }
-            }
-        });
-        this._clearSelectedItems();
-        if (this.onChange) this.onChange();
-    }
-
-    /**
-     * remove the specific item from the list
-     * useful when clicking a per-item delete button
-     */
-    excludeSpecific(item) {
-        if (this.disabled || item["__fixed__"]) return;
-        var picked;
-        for (var i = this.includeList.length-1; i >= 0; i--) {
-            if (this.includeList[i] == item) {
-                picked = this.includeList.splice(i, 1)[0];
-                break;
-            }
-        }
-        if (picked) {
-            this.excludeList.push(picked);
-        }
-        if (this.onChange) this.onChange();
-
-    }
-
-    includeSpecific(item) {
-        if (this.disabled) return;
-        var picked;
-        for (var i = this.excludeList.length-1; i >= 0; i--) {
-            if (this.excludeList[i] == item) {
-                picked = this.excludeList.splice(i, 1)[0];
-                break;
-            }
-        }
-        if (picked) {
-            if (picked["__fixed__"]) picked["__fixed__"] = undefined;
-            this.includeList.push(picked);
-        }
-        if (this.onChange) this.onChange();
-
-    }
-
-    /**
-     * move all the selected items to the include list.
-     * clear those items from the exclude list
-     */
-    includeAll() {
-        if (this.disabled || this.isExcludeListEmpty()) return;
-        let filteredOut = [];
-        this.excludeList.forEach((item)=> {
-            if (_.isObject(item)) {
-                item["__fixed__"] = undefined;
-            }
-            if (this.filterList) {
-                if (this._isFilteredOut(item)) {
-                    filteredOut.push(item);
-                }
-                else {
-                    this.includeList.push(item);
-                }
-            }
-            else {
-                this.includeList.push(item);
-            }
-        });
-        this.excludeList = filteredOut;
-        this._clearSelectedItems();
-        this.$timeout(()=>{
-            if (this.onChange) this.onChange();
-        });
-    }
-
-    /**
-     * move the selected items to the include list.
-     * clear those items from the exclude list
-     */
-    includeSelected() {
-        if (this.disabled || this.isExcludeListItemSelected()) return;
-
-        this._filterSelection('exc');
-
-        if (!this.includeList) {
-            this.includeList = [];
-        }
-        if (this.excludeList.length) {
-            this.selectedItems.forEach((item) => {
-                if (_.isObject(item)) {
-                    item["__fixed__"] = undefined;
-                }
-                this.excludeList.splice(this.excludeList.indexOf(item), 1);
-
-                if (this.includeList.indexOf(item) < 0) {
-                    this.includeList.push(item);
-                }
-            });
-            this._clearSelectedItems();
-        }
-        if (this.onChange) this.onChange();
-    }
-
-    /**
-     * populate the selected items array
-     * @param item
-     */
-    toggleSelection(item) {
-        if (this.disabled) return;
-
-        let index = this._inSelectedItems(item);
-
-        if (index > -1) {
-            this.selectedItems.splice(index, 1);
-        } else {
-            if (!_.isObject(item) || !item["__fixed__"] || this.includeList.indexOf(item) < 0) {
-                this.selectedItems.push(item);
-            }
-        }
-
-        this.$element[0].querySelector('.dnd-panel').focus();
-    }
-
-    /**
-     * for ngDisabled, check if an item from the include list
-     * is present in the selected items array
-     *
-     * @returns {boolean}
-     */
-    isIncludeListItemSelected() {
-
-        let found = true;
-
-        if (this.includeList) {
-            for (let i = 0; i < this.includeList.length; i++) {
-                if (this.selectedItems.indexOf(this.includeList[i]) > -1) {
-                    found = false;
-                    break;
-                }
-            }
-        }
-
-        return found;
-    }
-
-    /**
-     *
-     * for ngDisabled, check if an item from the exclude list
-     * is present in the selected items array
-     *
-     * @returns {boolean}
-     */
-    isExcludeListItemSelected() {
-
-        let found = true;
-
-        if (this.excludeList) {
-
-            for (let i = 0; i < this.excludeList.length; i++) {
-                if (this.selectedItems.indexOf(this.excludeList[i]) > -1) {
-                    found = false;
-                    break;
-                }
-            }
-        }
-
-        return found;
-    }
-
-    /**
-     * returns true if the excludeList list contains elements
-     * @returns {boolean}
-     */
-    isExcludeListEmpty() {
-        if (!this.excludeList || !this.excludeList.length) return true;
-//        else if (!this.filterList) return false;
-
-        let empty = true;
-
-        for (let i in this.excludeList) {
-            let item = this.excludeList[i];
-            if (!this._isFilteredOut(item) && item !== this.PLACEHOLDER) {
-                empty = false;
-                break;
-            }
-        }
-
-        return empty;
-
-    }
-
-    /**
-     * returns true if the include list contains elements
-     * @returns {boolean}
-     */
-    isIncludeListEmpty() {
-        if (!this.includeList || !this.includeList.length) return true;
-
-        let empty = true;
-
-        for (let i in this.includeList) {
-            let item = this.includeList[i];
-            if (item !== this.PLACEHOLDER) {
-                empty = false;
-                break;
-            }
-        }
-
-        return empty;
-    }
-
-    /**
-     * returns true if the include list contains only fixed elements
-     * @returns {boolean}
-     */
-    isIncludeListFixed() {
-        if (this.includeList) {
-            let fixed = true;
-            for (let i in this.includeList) {
-                let item = this.includeList[i];
-                if (!_.isObject(item) || !item['__fixed__']) {
-                    fixed = false;
-                    break;
-                }
-            };
-            //            return _.filter(this.includeList,{'__fixed__':undefined}).length === 0;
-            return fixed;
-        }
-    }
-
-
-    /**
-     * used by ngClass directive to apply
-     * the correct css class
-     *
-     * @param item
-     * @returns {boolean}
-     */
-    isSelected(item) {
-        return this._inSelectedItems(item) > -1;
-    }
-
-    /**
-     *
-     * check if an item is present on the selected
-     * items array
-     *
-     * @param item
-     * @returns {*|number|Number}
-     * @private
-     */
-    _inSelectedItems(item) {
-        return this.selectedItems.indexOf(item);
-    }
-
-    /**
-     * assign an empty array to the selected items array
-     * @private
-     */
-    _clearSelectedItems() {
-        this.selectedItems = [];
-    }
-
-    _isFilteredOut(item) {
-        if (!this.filterList || item === '') return false;
-        let regex = new RegExp('.*' + this.filterList.split('*').join('.*') + '.*','i');
-        return !regex.test(this.excludeDisplayField && item[this.excludeDisplayField] ? item[this.excludeDisplayField] : item);
-    }
-
-    _getFilteredExcludeList() {
-        let ret = _.filter(this.excludeList,(item)=>!this._isFilteredOut(item));
-        this.noMatches = this.excludeList && this.excludeList.length && !ret.length;
-        return ret;
-    }
-
-
-    _dragStart(event,ui) {
-        let dragObj=this._objectFromElement(event.target);
-
-        if (this.disabled || (dragObj.draggedFrom === this.includeList && _.isObject(dragObj.dataObject) && dragObj.dataObject["__fixed__"])) {
-            event.preventDefault();
-            return;
-        }
-        this._initDragObject(dragObj);
-
-        this._initDragHelper(ui.helper);
-
-        this._dragAdditionals();
-
-        this._insertPlaceHolder(this.draggedObject.draggedFrom,this.draggedObject.index);
-        this.$scope.$apply();
-
-    }
-
-    _initDragObject(dragObj) {
-        this.draggedObject = dragObj;
-        dragObj.draggedFrom.splice(dragObj.index,1);
-        this.$scope.$apply();
-    }
-
-    _initDragHelper(helper) {
-        this.draggedObject.helper = helper;
-        helper.addClass('drag-helper');
-        let xicon = helper.find('.delete-drop-item');
-        if (xicon) xicon.remove();
-    }
-
-    _dragAdditionals() {
-        if (this.selectedItems.length) {
-
-            //remove dragged object from selection, leave only additionals
-            if (this._inSelectedItems(this.draggedObject.dataObject)>=0) this.toggleSelection(this.draggedObject.dataObject);
-
-            this.draggedObject.additionals = [];
-
-            //only add to additionals the selected items from the draggedFrom array, and not filtered out.
-            this.selectedItems.forEach((selected)=>{
-                let index;
-                if (this.draggedObject.draggedFrom === this.excludeList) index = this._getFilteredExcludeList().indexOf(selected);
-                else index = this.draggedObject.draggedFrom.indexOf(selected);
-
-                if (index>=0) {
-                    this.draggedObject.additionals.push(selected);
-                }
-            });
-
-            this._clearSelectedItems();
-
-            this.$scope.$apply(()=>{
-                this.draggedObject.additionals.forEach((selected)=>{
-                    this.draggedObject.draggedFrom.splice(this.draggedObject.draggedFrom.indexOf(selected), 1);
-                });
-
-                if (this.draggedObject.additionals.length > 0)
-                    this.draggedObject.helper.addClass('multiple').html('<span>≡</span>' + (1 + this.draggedObject.additionals.length) + ' ' + (this.objectsName ? this.objectsName : 'Items'));
-            });
-        }
-    }
-
-    _dragStop(event,ui) {
-        if (this.draggedObject) {
-            let ph = this._removePlaceHolder();
-            //console.log('mouseInExclude: '+this.mouseInExclude, 'mouseInInclude: '+this.mouseInInclude);
-            if (this.mouseInExclude || this.mouseInInclude) {
-                let droppedInArray = this.mouseInExclude ? this.excludeList : this.includeList;
-
-                if (ph && ph.array === droppedInArray) {
-                    droppedInArray.splice(ph.index,0,this.draggedObject.dataObject);
-                }
-                else {
-                    droppedInArray.push(this.draggedObject.dataObject);
-                }
-            }
-            else {
-                this.draggedObject.draggedFrom.splice(this.draggedObject.index,0,this.draggedObject.dataObject);
-            }
-            if (_.isObject(this.draggedObject.dataObject)) {
-                this.draggedObject.dataObject["__fixed__"] = undefined;
-            }
-
-            this._stopScrollInterval();
-
-            this.$scope.$apply();
-
-            this._undragAdditionals(ph.index+1);
-
-            this._initDragAndDropOnElement(this._elementFromObject(this.draggedObject.dataObject));
-
-            this.draggedObject = null;
-
-            this._clearSelectedItems();
-            if (this.onChange) this.onChange();
-        }
-    }
-
-    _dragMove (event,ui) {
-        //console.log(event.toElement);
-        this.$scope.$apply(()=> {
-            let list_element = $(event.toElement);
-
-            if (!list_element.hasClass('dnd-list-wrapper'))
-                list_element = list_element.parents('.dnd-list-wrapper');
-
-            if (list_element && list_element.hasClass('dnd-list-wrapper')) {
-                let dragOffsetY = event.pageY - list_element.offset().top;
-
-                if (list_element.scrollTop() > 0 && dragOffsetY > 0 && dragOffsetY < 20 && !this.scrollInterval)
-                //this.scrollInterval = this.$interval(() => {
-                    list_element.scrollTop(list_element.scrollTop() - 5);
-                //}, 50);
-                else if (dragOffsetY > list_element.outerHeight() - 20 && dragOffsetY < list_element.outerHeight() && !this.scrollInterval)
-                //this.scrollInterval = this.$interval(() => {
-                    list_element.scrollTop(list_element.scrollTop() + 5);
-                //}, 50);
-                //else
-                //    this._stopScrollInterval();
-            }
-            //else
-            //    this._stopScrollInterval();
-        });
-    }
-
-    _stopScrollInterval() {
-        if (this.scrollInterval) {
-            this.$interval.cancel(this.scrollInterval);
-            this.scrollInterval = null;
-        }
-    }
-
-    _undragAdditionals(startIndex) {
-        if (this.draggedObject.additionals) {
-            let next = startIndex;
-            this.$scope.$apply(()=>{
-                this.draggedObject.additionals.forEach((additional)=>{
-                    if (this.mouseInInclude) {
-                        this.includeList.splice(next,0,additional);
-                    }
-                    else if (this.mouseInExclude) {
-                        this.excludeList.splice(next,0,additional);
-                    }
-                    else {
-                        this.draggedObject.draggedFrom.splice(next,0,additional);
-                    }
-
-                    if (_.isObject(additional)) {
-                        additional["__fixed__"] = undefined;
-                    }
-                    //                this.$scope.$apply();
-                    this._initDragAndDropOnElement(this._elementFromObject(additional));
-                    next++;
-                });
-
-            });
-        }
-    }
-
-    _initDragAndDropOnElement(elem) {
-        if (!elem || elem.hasClass('drag-enabled')) return;
-        elem.draggable({
-            helper: 'clone',
-            cursorAt: {left:-5, top:-5},
-            scroll: false,
-            distance: 10,
-            start: (event, ui) => this._dragStart(event,ui),
-            stop: (event, ui) => this._dragStop(event,ui),
-            drag: (event, ui) => this._dragMove(event,ui)
-        });
-        elem.addClass('drag-enabled');
-    }
-
-    _objectFromElement(elem) {
-        let dataIndex = $(elem).attr('data-index');
-        let parsed = dataIndex.split('-');
-        let array;
-        if (parsed[0] === 'inc') array = this.includeList;
-        else if (parsed[0] === 'exc') array = this.excludeList;
-
-        let index = parsed[1];
-        if (array === this.excludeList) {
-            let obj = this._getFilteredExcludeList()[index];
-            index = this.excludeList.indexOf(obj);
-        }
-
-        let obj = {
-            draggedFrom: array,
-            dataObject: array[index],
-            index: index,
-            phIndex: null,
-            phArray: null
-        };
-
-        return obj;
-    }
-
-    _elementFromObject(obj) {
-
-        let iexc=this._getFilteredExcludeList().indexOf(obj);
-        let iinc=this.includeList.indexOf(obj);
-        let array = iexc >= 0 ? 'exc' : (iinc >= 0 ? 'inc' : '');
-        let index = iexc >= 0 ? iexc : (iinc >= 0 ? iinc : -1);
-
-        if (index < 0) return null;
-        else {
-            return $(this.$element).find('li[data-index='+array+'-'+index+']');
-        }
-    }
-    mouseIsInInclude(isIn) {
-        this.mouseInInclude = isIn;
-        if (this.mouseInInclude) this.mouseInExclude = false;
-        if (isIn && this.draggedObject && this.draggedObject.phArray !== this.includeList) {
-            this._insertPlaceHolder(this.includeList,this.includeList.length);
-        }
-    }
-    mouseIsInExclude(isIn) {
-        this.mouseInExclude = isIn;
-        if (this.mouseInExclude) this.mouseInInclude = false;
-        if (isIn && this.draggedObject && this.draggedObject.phArray !== this.excludeList) {
-            this._insertPlaceHolder(this.excludeList,this.excludeList.length);
-
-            //let list_element = $('#dnd-' + (iexc >= 0 ? 'exclude' : 'include'));
-
-        }
-    }
-
-    initDragElement(item) {
-        this.$timeout(()=>{
-            let elem = this._elementFromObject(item);
-
-            this._initDragAndDropOnElement(elem);
-        });
-    }
-
-    mouseOver(item) {
-        if (item != null && this.draggedObject) {
-
-            let iexc=this.excludeList.indexOf(item);
-            let iinc=this.includeList.indexOf(item);
-
-            let array = iexc >= 0 ? this.excludeList : (iinc >= 0 ? this.includeList : null);
-            let index = iexc >= 0 ? iexc : (iinc >= 0 ? iinc : -1);
-
-            if (array)
-                this._insertPlaceHolder(array,index);
-
-        }
-        else if (item != null) {
-            this.initDragElement(item);
-        }
-    }
-
-    _insertPlaceHolder(array,index) {
-        this._removePlaceHolder();
-        array.splice(index, 0, this.PLACEHOLDER);
-        this.draggedObject.phIndex = index;
-        this.draggedObject.phArray = array;
-    }
-
-    _findPlaceHolder() {
-        let phIndexExc = this.excludeList.indexOf(this.PLACEHOLDER);
-        let phIndexInc = this.includeList.indexOf(this.PLACEHOLDER);
-
-        if (phIndexExc >= 0) {
-            return {array: this.excludeList, index: phIndexExc};
-        }
-        else if (phIndexInc >= 0) {
-            return {array: this.includeList, index: phIndexInc};
-        }
-        else {
-            return null;
-        }
-
-    }
-
-    _removePlaceHolder() {
-        let ph = this._findPlaceHolder();
-        if (ph) {
-            ph.array.splice(ph.index, 1);
-            this.draggedObject.phIndex = null;
-        }
-        return ph;
-    }
-
-    onKeyDown(e) {
-        if (e.shiftKey && e.ctrlKey && (e.which === 65 || e.which === 97)) {
-            this._clearSelectedItems();
-        }
-        else if (e.ctrlKey && (e.which === 65 || e.which === 97)) {
-            e.preventDefault();
-            if (this.mouseInExclude) this._selectAll(this.excludeList);
-            else if (this.mouseInInclude) this._selectAll(this.includeList);
-
-        }
-    }
-    _selectAll(array) {
-        this._clearSelectedItems();
-        array.forEach((item)=>{
-            this.toggleSelection(item);
-        });
-    }
-
-    _filterSelection(leave) {
-        this.selectedItems = _.filter(this.selectedItems,(item)=>{
-            if (leave === 'inc' && this.includeList && this.includeList.indexOf(item) >= 0) return true;
-            else if (leave === 'exc' && this.excludeList && this.excludeList.indexOf(item) >= 0) return true;
-            else return false;
-        })
-    }
-
-
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_dynamic_directive/jf_dynamic_directive.js b/web/angular-web/src/main/webapp/app/directives/jf_dynamic_directive/jf_dynamic_directive.js
deleted file mode 100644
index d2609d9..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_dynamic_directive/jf_dynamic_directive.js
+++ /dev/null
@@ -1,14 +0,0 @@
-export default function ($compile) {
-    return {
-        link: function ($scope, $element, attrs) {
-            let newElement;
-            let directiveName;
-            newElement = $element.clone();
-            directiveName = $scope.$eval(attrs.dynamicDirective);
-            newElement.removeAttr('dynamic-directive');
-            newElement.attr(directiveName, '');                       // assign the directive to it
-            newElement = $compile(newElement)($scope);                // compile it
-            $element.replaceWith(newElement);                         // replace the original element
-        }
-    }
-};
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_enter_press/jf_enter_press.js b/web/angular-web/src/main/webapp/app/directives/jf_enter_press/jf_enter_press.js
deleted file mode 100644
index 5b0c2b1..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_enter_press/jf_enter_press.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import KEYS from '../../constants/keys.constants';
-
-class jfEnterPressController {
-	constructor($element, $scope) {
-		this.$scope = $scope;
-		$element.on('keypress', (e) => this._onKeyPress(e));
-		this.$scope.$on('$destroy', () => $element.off('keypress'))
-	}
-	_onKeyPress(e) {
-        if (e.keyCode != KEYS.ENTER) return ;
-        e.preventDefault();
-        this.callback();
-        if (!this.$scope.$$phase) this.$scope.$apply();
-	}
-}
-
-export function jfEnterPress() {
-	return {
-		scope: {
-			callback: '&jfEnterPress'
-		},
-		controllerAs: 'jfEnterPress',
-		bindToController: true,
-		controller: jfEnterPressController
-	}
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_field/jf_field.html b/web/angular-web/src/main/webapp/app/directives/jf_field/jf_field.html
deleted file mode 100644
index aa8feda..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_field/jf_field.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<div ng-class="{'input-label': animated}" class="jf-field">
-        <ng-transclude></ng-transclude>
-    </div>
-    <jf-validation ng-if="formField.showErrors || alwaysShowErrors || (formField.initialValue && !formField.$error.required)"
-                   field="formField"
-                   dont-push-down="dontPushDownErrors"
-                   dictionary="{{validations}}">
-    </jf-validation>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_field/jf_field.js b/web/angular-web/src/main/webapp/app/directives/jf_field/jf_field.js
deleted file mode 100644
index d6b562d..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_field/jf_field.js
+++ /dev/null
@@ -1,146 +0,0 @@
-import EVENTS     from '../../constants/common_events.constants';
-
-export function jfField($timeout, ArtifactoryEventBus, $rootScope) {
-    return {
-        restrict: 'E',
-        require: '^form',
-        scope: {
-            animated: '@',
-            validations: '@',
-            autofocus: '=',
-            invalidateOnSubmit: '@',
-            alwaysShowErrors: '@',
-            dontValidateDisabled: '@',
-            delayedInit: '=',
-            dontPushDownErrors: '='
-        },
-        transclude: true,
-        templateUrl: 'directives/jf_field/jf_field.html',
-        link: function jfInputTextLink(scope, element, attrs, form) {
-
-            let inputElement;
-            let inputName;
-            let init = ()=>{
-                inputElement = $(element.find('input')[0]);
-                if (!inputElement.length) {
-                    inputElement = $(element.find('textarea')[0]);
-                }
-                inputName = inputElement.attr('name');
-                scope.formField = form[inputName];
-                if (scope.formField) scope.formField.initialValue = true;
-                scope.form = form;
-                scope.$watch(()=>scope.autofocus, ()=>focusInput());
-                ArtifactoryEventBus.registerOnScope(scope, EVENTS.FORM_SUBMITTED, _onFormSubmitted);
-                ArtifactoryEventBus.registerOnScope(scope, EVENTS.FORM_CLEAR_FIELD_VALIDATION, force => {
-                    _onBlur(force);
-                    if (scope.formField) scope.formField.preventShowErrors = true;
-                });
-
-                scope.$on('$destroy', () => {
-                    inputElement.off('blur');
-                    inputElement.off('keyup');
-                    inputElement.off('keydown');
-                    inputElement.off('focus');
-                });
-
-                inputElement.on('keydown', () => _onKeyDown());
-
-                if (!scope.invalidateOnSubmit && scope.validations) {
-                    inputElement.on('blur', () => _onBlur());
-                    inputElement.on('keyup', () => _onKeyUp());
-                }
-                if (scope.invalidateOnSubmit || scope.validations) {
-                    inputElement.on('focus', () => _onFocus());
-                }
-
-                if (scope.dontValidateDisabled) {
-                    $rootScope.$watch(() => inputElement[0].disabled, () => _onDisabledChanged(inputElement[0].disabled));
-                }
-                focusInput();
-            };
-
-            if (scope.delayedInit) {
-                $timeout(()=>init());
-            }
-            else {
-                init();
-            }
-
-
-            function focusInput() {
-                if (scope.autofocus && scope.autofocus != 'false') {
-                    $timeout(() => {
-                        if (inputElement.scrollParent()) {
-                            var y = inputElement.scrollParent().scrollTop();
-                            inputElement.focus();
-                            inputElement.scrollParent().scrollTop(y);
-                        }
-                        else {
-                            inputElement.focus();
-                        }
-                    });
-                }
-            }
-            function _onDisabledChanged(disabled) {
-                if (disabled) {
-                    scope.formField.showErrors = false;
-                }
-                else {
-                    scope.formField.showErrors = true;
-                }
-            }
-
-            function _onFormSubmitted(formName) {
-                if (!formName || (scope.form.$name === formName && !scope.formField.$valid)) {
-                    inputElement.addClass('invalid');
-                    if (scope.formField) scope.formField.showErrors = true;
-                } else {
-                    inputElement.removeClass('invalid');
-                    if (scope.formField) scope.formField.showErrors = false;
-                }
-            }
-
-            function _onBlur(force) {
-                $timeout(function () {
-                    if (scope.formField) {
-                        if (force) {
-                            scope.formField.showErrors = false;
-                        } else if (!scope.formField.preventShowErrors){
-                            scope.formField.showErrors = true;
-                        }
-                    }
-                });
-
-                if (force || (scope.formField && scope.formField.$valid) || (scope.formField && scope.formField.preventShowErrors)) {
-                    inputElement.removeClass('invalid');
-                } else {
-                    inputElement.addClass('invalid');
-                }
-            }
-
-            function _onFocus() {
-                $timeout(function () {
-                    if (scope.formField) {
-                        scope.formField.showErrors = false;
-                        scope.formField.preventShowErrors = false;
-                        inputElement.removeClass('invalid');
-                    }
-
-                    scope.form.$setPristine();
-                });
-            }
-            function _onKeyDown() {
-                if (scope.formField) scope.formField.initialValue = false;
-            }
-
-            function _onKeyUp() {
-                let value = inputElement.val();
-                if (value !== null && value !== undefined && value !== '') {
-                    inputElement.addClass('hascontent');
-                } else {
-                    inputElement.removeClass('hascontent');
-                }
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_file_drop/jf_file_drop.html b/web/angular-web/src/main/webapp/app/directives/jf_file_drop/jf_file_drop.html
deleted file mode 100644
index d7a49ed..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_file_drop/jf_file_drop.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<div class="wrapper-drop-zone">
-    <div class="drop-zone"
-         nv-file-drop uploader="jfFileUploader"
-         nv-file-over over-class="drop-zone-hover"
-         ng-disabled="jfFileDisabled"
-         ng-class="{'drop-zone-load': jfFileUploader.queue.length}">
-        <input class="select-files-hidden"
-               type="file"
-               ng-if="!jfFileUploader.queue[0].progress"
-               nv-file-select multiple
-               uploader="jfFileUploader"
-               ng-disabled="jfFileDisabled"
-               title=" " />
-        <div ng-if="!jfFileUploader.queue.length"><span>Drop file</span> here or <span>Select file</span></div>
-        <div ng-if="jfFileUploader.queue.length && (!jfFileUploader.queue[0].progress || !showProgressBar)"
-             class="drop-zone-file-name">{{jfFileUploader.queue[0].file.name}}</div>
-        <div ng-if="showProgressBar">
-            <div ng-repeat="item in jfFileUploader.queue">
-                <div ng-show="jfFileUploader.isHTML5 && item.progress"
-                     class="file-upload-progress file-info">
-                    <div class="progress-file-drop">
-                        <div class="progress">
-                            <div class="progress-bar" role="progressbar"
-                                 ng-style="{ 'width': item.progress + '%' }">
-                            </div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_file_drop/jf_file_drop.js b/web/angular-web/src/main/webapp/app/directives/jf_file_drop/jf_file_drop.js
deleted file mode 100644
index f61ebe7..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_file_drop/jf_file_drop.js
+++ /dev/null
@@ -1,18 +0,0 @@
-export function jfFileDrop() {
-    return {
-        scope: {
-            jfFileUploader: '=',
-            jfFileDisabled: '=ngDisabled',
-            addCallback: '&jfAddingFileCallback',
-            showProgressBar: '='
-        },
-        restrict: 'E',
-        templateUrl: 'directives/jf_file_drop/jf_file_drop.html',
-        link: ($scope) => {
-            $scope.jfFileUploader.onAfterAddingFile = (fileItem) => {
-                $scope.jfFileUploader.queue = [fileItem];
-                $scope.addCallback({fileItem: fileItem});
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_footer/jf_footer.html b/web/angular-web/src/main/webapp/app/directives/jf_footer/jf_footer.html
deleted file mode 100644
index b9adf15..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_footer/jf_footer.html
+++ /dev/null
@@ -1 +0,0 @@
-<div>Footer</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_footer/jf_footer.js b/web/angular-web/src/main/webapp/app/directives/jf_footer/jf_footer.js
deleted file mode 100644
index f37fe77..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_footer/jf_footer.js
+++ /dev/null
@@ -1,14 +0,0 @@
-class jfFooterController {
-    constructor() {
-
-    }
-}
-
-export function jfFooter() {
-    return {
-        controller: jfFooterController,
-        controllerAs: 'jfFooter',
-        templateUrl: 'directives/jf_footer/jf_footer.html'
-    }
-}
-
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_grid/jf_grid.html b/web/angular-web/src/main/webapp/app/directives/jf_grid/jf_grid.html
deleted file mode 100644
index 89c7979..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_grid/jf_grid.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<div class="grid-container" ng-if="gridOptions.data">
-    <div class="wrapper-grid-actions" ng-show="!noPagination || !noCount || gridOptions.batchActions.length || filterField">
-
-        <div ng-if="!noCount" class="grid-counter">{{ getTotalRecords() }}<span ng-if="getSelectedRecords()"> ({{getSelectedRecords()}} Selected)</span></div>
-
-        <div ng-if="filterField" class="filter-group">
-            <jf-grid-filter
-                    auto-focus="{{autoFocus}}"
-                    filter-grid="gridOptions"
-                    filter-field="{{ filterField }}"
-                    filter-field2="{{ filterField2 }}"
-                    filter-on-change="{{ filterOnChange }}">
-            </jf-grid-filter>
-        </div>
-
-        <jf-grid-pagination ng-show="!noPagination"
-                            grid-api="gridOptions.api"
-                            class="pull-right">
-        </jf-grid-pagination>
-
-        <jf-grid-batch-actions ng-if="gridOptions.batchActions.length"
-                               grid-api="gridOptions.api"
-                               actions="gridOptions.batchActions">
-        </jf-grid-batch-actions>
-    </div>
-    <div ui-grid="gridOptions"
-         ui-grid-draggable-rows
-         ui-grid-selection
-         ui-grid-pagination
-         ui-grid-grouping
-         ui-grid-edit
-         ui-grid-resize-columns
-         class="grid"></div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_grid/jf_grid.js b/web/angular-web/src/main/webapp/app/directives/jf_grid/jf_grid.js
deleted file mode 100644
index 0fb02d7..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_grid/jf_grid.js
+++ /dev/null
@@ -1,114 +0,0 @@
-export function jfGrid($timeout,$compile) {
-
-
-    let isNoTooltip = (cell) => {
-        return (cell.context.classList.contains('no-tooltip'));
-    };
-
-    return {
-        scope: {
-            gridOptions: '=',
-            filterField: '@?',
-            filterField2: '@?',
-            filterOnChange: '@?',
-            autoFocus: '@',
-            objectName: '@'
-        },
-        templateUrl: 'directives/jf_grid/jf_grid.html',
-        link: ($scope, $element, $attrs) => {
-
-            $scope.gridOptions.gridObjectName = $scope.objectName;
-
-            $scope.noCount = $attrs.hasOwnProperty('noCount');
-            $scope.noPagination = $attrs.hasOwnProperty('noPagination');
-
-            $($element).on('mouseenter', '.ui-grid-cell, .ui-grid-cell-contents, .btn-action', (e)=>{
-                let cellItem = $(e.target);
-
-                cellItem.parents('.ui-grid-row').addClass('hovered');
-                $scope.$apply();
-
-                if (cellItem.hasClass('ui-grid-cell-contents')) {
-                    let cellItemContent = cellItem.text().trim();
-
-                    if (cellItemContent.length > 0 && cellItem[0].scrollWidth > cellItem.innerWidth()) {
-                        if (!cellItem.hasClass('tooltipstered') && !isNoTooltip(cellItem)) {
-                            cellItem.tooltipster({
-                                animation: 'fade',
-                                trigger: 'hover',
-                                onlyOne: 'true',
-                                interactive: 'true',
-                                position: 'bottom',
-                                theme: 'tooltipster-default bottom',
-                                content: cellItemContent
-                            });
-                            cellItem.tooltipster('show');
-                        }
-                        else if (!isNoTooltip(cellItem)) {
-                            cellItem.tooltipster('enable');
-
-                            if (cellItem.tooltipster('content') != cellItemContent)
-                                cellItem.tooltipster('content', cellItemContent);
-                        }
-                    }
-                    else if (cellItem.hasClass('tooltipstered'))
-                        cellItem.tooltipster('disable');
-                }
-            }).on('mouseleave', '.ui-grid-draggable-row, .ui-grid-cell, .ui-grid-cell-contents, .btn-action', (e)=>{
-                let currentRowElement = $(e.currentTarget).parents('.ui-grid-row'),
-                        toRowElement = $(e.relatedTarget).parents('.ui-grid-row');
-
-                if (!toRowElement || !currentRowElement.is(toRowElement)) {
-                    currentRowElement.removeClass('hovered');
-                    $scope.$apply();
-                }
-            });
-            $scope.$on('$destroy', () => {
-                $($element).off('mouseenter');
-                $($element).off('mouseleave');
-                $scope.gridOptions.onDestroy();
-            });
-
-
-            $scope.getTotalRecords = () => {
-                let count;
-
-                if (!$scope.gridOptions.api) return 0;
-
-                let visRows = $scope.gridOptions.api.grid.getVisibleRows();
-                let totalRows = $scope.gridOptions.api.grid.rows.length;
-                if (_.findWhere(visRows,{entity:{_emptyRow:true}}))
-                    count = totalRows - 1;
-                else
-                    count = totalRows;
-
-                //Reduce rows that should not be counted
-                count -= _.filter($scope.gridOptions.api.grid.rows,{entity:{'__doNotCount__':true}}).length;
-
-                let recordsName;
-
-                if ($scope.objectName) {
-                    if ($scope.objectName.indexOf('/')>=0) {
-                        let splited = $scope.objectName.split('/');
-                        recordsName = count !== 1 ? splited[1] : splited[0];
-                    }
-                    else
-                        recordsName = count !== 1 ? $scope.objectName + 's' : $scope.objectName;
-                }
-                else
-                    recordsName = count !== 1 ? 'records' : 'record';
-
-                return count + ' ' + _.startCase(recordsName);
-            };
-
-            $scope.getSelectedRecords = () => {
-
-                if (!$scope.gridOptions.multiSelect || !$scope.gridOptions.api || !$scope.gridOptions.api.selection) return '';
-
-                let count = $scope.gridOptions.api.selection.getSelectedRows().length;
-
-                return count;
-            };
-        }
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_grid_batch_actions/jf_grid_batch_actions.html b/web/angular-web/src/main/webapp/app/directives/jf_grid_batch_actions/jf_grid_batch_actions.html
deleted file mode 100644
index 8ab69a2..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_grid_batch_actions/jf_grid_batch_actions.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<div class="grid-batch-actions text-right">
-    <a ng-repeat="action in jfBatchActions.actions"
-       ng-class="{disabled: !jfBatchActions.anySelected() || (action.disabledWhen && action.disabledWhen())}"
-       ng-if="!action.visibleWhen || action.visibleWhen()"
-       ng-click="jfBatchActions.perform(action)"
-       class="btn batch-action-{{action.icon}}">
-        <img ng-src="images/{{action.icon}}.png"
-                ng-if="action.img"/>
-        <i class="icon icon-{{action.icon}}"
-           ng-if="!action.img"></i> {{ action.name }}
-    </a>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_grid_batch_actions/jf_grid_batch_actions.js b/web/angular-web/src/main/webapp/app/directives/jf_grid_batch_actions/jf_grid_batch_actions.js
deleted file mode 100644
index 31b7155..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_grid_batch_actions/jf_grid_batch_actions.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// TODO: (Adam) improve performence by listening to the batch selection change on gridApi, other than using ng-class
-class jfGridBatchActionsController {
-    perform(action) {
-        if (this.anySelected() && (!action.disabledWhen || !action.disabledWhen())) {
-            action.callback && action.callback(this.gridApi.selection.getSelectedRows());
-        }
-    }
-    anySelected() {
-        return this.gridApi && this.gridApi.selection.getSelectedRows().length > 0;
-    }
-}
-export function jfGridBatchActions() {
-    return {
-        scope: {
-            actions: '=',
-            gridApi: '='
-        },
-        templateUrl: 'directives/jf_grid_batch_actions/jf_grid_batch_actions.html',
-        controller: jfGridBatchActionsController,
-        controllerAs: 'jfBatchActions',
-        bindToController: true
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_grid_filter/jf_grid_filter.html b/web/angular-web/src/main/webapp/app/directives/jf_grid_filter/jf_grid_filter.html
deleted file mode 100644
index 676c662..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_grid_filter/jf_grid_filter.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<div class="grid-filter">
-    <form name="jfGridFilter.gridFilterForm" novalidate>
-        <jf-field validations="gridFilter" autofocus="jfGridFilter.autoFocus">
-            <input type="text"
-                   name="gridFilter"
-                   class="input-text"
-                   jf-validator-max-text-length="1024"
-                   ng-model="jfGridFilter.gridFilter"
-                   ng-model-options="{debounce: jfGridFilter.shouldFilterOnChange() ? 200 : 0}"
-                   ng-change="jfGridFilter.onChange()"
-                   ng-style="{color:jfGridFilter.noMatches ? 'red' : 'black'}"
-                   placeholder="{{jfGridFilter.getPlaceHolder()}}"/>
-        </jf-field>
-<!--
-        <div ng-if="jfGridFilter.noMatches" class="alert-warning" style="margin-bottom: 10px">No Matches Found</div>
--->
-        <div class="btn-group" ng-if="!jfGridFilter.shouldFilterOnChange()">
-            <button class="btn btn-primary" ng-click="jfGridFilter.doFilter()"
-                    ng-disabled="jfGridFilter.disableButton">
-                <span class="icon icon-refresh"></span>
-            </button>
-        </div>
-    </form>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_grid_filter/jf_grid_filter.js b/web/angular-web/src/main/webapp/app/directives/jf_grid_filter/jf_grid_filter.js
deleted file mode 100644
index b858295..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_grid_filter/jf_grid_filter.js
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- USAGE EXAMPLE:
-
- <jf-grid-filter
- filter-grid="gridOptions"  //the name of the grid (grid options)
- filter-field="fieldName"        //the name of the field that should be filtered
- filter-on-change>          //optional - don't use a button for filtering, filter on every change
- </jf-grid-filter>
-
- */
-
-
-class jfGridFilterController {
-
-    constructor($scope,$timeout) {
-
-        this.$timeout = $timeout;
-        this.gridFilter = '';
-
-        this.grid.enableFiltering = true;
-
-        if (this.filterField.indexOf('.') !== -1) {
-            let splitted = this.filterField.split('.');
-            this.filterField = splitted[0];
-            this.filterSubField = splitted[1];
-        }
-        if (this.filterField2.indexOf('.') !== -1) {
-            let splitted = this.filterField2.split('.');
-            this.filterField2 = splitted[0];
-            this.filterSubField2 = splitted[1];
-        }
-
-        var cols = this.grid.columnDefs;
-        this.column = _.find(cols, _.matchesProperty('field', this.filterField)) || cols[0];
-        if (this.filterField2) this.column2 = _.find(cols, _.matchesProperty('field', this.filterField2));
-
-        $scope.$on('$destroy', () => this.onDestroy());
-    }
-
-    shouldFilterOnChange() {
-        return this.filterOnChange !== 'false';
-    }
-
-    doFilter() {
-        if (!this.column) return;
-        if (!this.column2) {
-//            this.column.filter = {term: '*' + this.gridFilter + '*'};
-            this.column.filter = {
-                term: '*' + this.gridFilter + '*',
-                condition: (searchTerm, cellValue, row, column)=> {
-                    let regex = new RegExp('.*' + searchTerm.split('\\*').join('.*') + '.*', "i");
-                    return regex.test(this.filterSubField ? cellValue[this.filterSubField] : cellValue) || row.entity._emptyRow || row.entity._specialRow;
-                }
-            };
-        }
-        else {
-            this.column.filter = {
-                term: '*' + this.gridFilter + '*',
-                condition: (searchTerm, cellValue, row, column)=> {
-                    let cell2Value = row.entity[this.column2.field];
-                    let regex = new RegExp('.*' + searchTerm.split('\\*').join('.*') + '.*', "i");
-                    return regex.test(this.filterSubField ? cellValue[this.filterSubField] : cellValue) || regex.test(this.filterSubField2 ? cell2Value[this.filterSubField2] : cell2Value)  || row.entity._emptyRow;
-                }
-            };
-        }
-        this._refreshGrid();
-    }
-
-    onChange() {
-        if (this.shouldFilterOnChange()) this.doFilter();
-    }
-
-    onDestroy() {
-        this.gridFilter = '';
-        this.doFilter();
-    }
-
-    _refreshGrid() {
-        //yes, it's so very ugly... but nothing else worked...
-        //also, it should be a method of ArtifactoryGrid...
-
-        this.column.name += ' ';
-        if (this.column2) this.column2.name += ' ';
-        var data = [];
-        if (this.grid.data.length) {
-            data[0] = _.cloneDeep(this.grid.data[0]);
-            data = data.concat(this.grid.data.slice(1));
-        }
-
-        this.grid.setGridData(data);
-        this.$timeout(()=>{
-            if (this.grid.api.grid.getVisibleRows().length === 0) {
-                this.grid.setGridData(data.concat([{_emptyRow:true}]));
-                this.noMatches=true;
-            }
-            else if (this.grid.api.grid.getVisibleRows().length > 1) {
-                this.grid.setGridData(_.filter(data,(row)=>{
-                    return !row._emptyRow;
-                }));
-                this.noMatches=false;
-            }
-            this.$timeout(()=> {
-                this.grid.api.core.refresh();
-            });
-        });
-
-    }
-
-    getPlaceHolder() {
-        if (this.column2) {
-            return 'Filter by ' + (this.column.displayName || this.column.name) + ' or ' + (this.column2.displayName || this.column2.name);
-        }
-        else if (this.column) {
-            return 'Filter by ' + (this.column.displayName || this.column.name);
-        }
-        else {
-            return 'FILTER UNAVAILABLE'
-        }
-    }
-}
-
-export function jfGridFilter() {
-
-    return {
-        restrict: 'E',
-        scope: {
-            disableButton: '=',
-            filterField: '@',
-            filterField2: '@',
-            grid: '=filterGrid',
-            filterOnChange: '@',
-            autoFocus: '@'
-        },
-        controller: jfGridFilterController,
-        controllerAs: 'jfGridFilter',
-        templateUrl: 'directives/jf_grid_filter/jf_grid_filter.html',
-        bindToController: true
-    };
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_grid_pagination/jf_grid_pagination.html b/web/angular-web/src/main/webapp/app/directives/jf_grid_pagination/jf_grid_pagination.html
deleted file mode 100644
index 852cc09..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_grid_pagination/jf_grid_pagination.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<div class="grid-pagination text-right" ng-if="jfGridPagination.gridApi.pagination.getTotalPages()">
-    <p>
-        <a href
-           ng-click="jfGridPagination.prevPage()"
-           ng-class="{disabled: jfGridPagination.currentPage === 1}">‹</a>
-        Page <input type="text"
-                    class="grid-page-box"
-                    ng-style="{'width': (14 + jfGridPagination.getTotalPages().toString().length * 7) + 'px'}"
-                    jf-tooltip="Jump to Page"
-                    ng-model="jfGridPagination.currentPage"
-                    ng-change="jfGridPagination.pageChanged()"/>
-        of {{ jfGridPagination.getTotalPages() }}
-        <a href
-           ng-click="jfGridPagination.nextPage()"
-           ng-class="{disabled: jfGridPagination.currentPage === jfGridPagination.gridApi.pagination.getTotalPages()}">›</a>
-    </p>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_grid_pagination/jf_grid_pagination.js b/web/angular-web/src/main/webapp/app/directives/jf_grid_pagination/jf_grid_pagination.js
deleted file mode 100644
index 4a0facc..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_grid_pagination/jf_grid_pagination.js
+++ /dev/null
@@ -1,61 +0,0 @@
-class jfGridPaginationController {
-
-    constructor($scope,$timeout) {
-
-        this.$scope = $scope;
-        this.gridApi = $scope.gridApi;
-
-        this.currentPage = 1;
-
-        $timeout(()=>{
-            if (this.gridApi.pagination) {
-                this.gridApi.pagination.on.paginationChanged($scope, (pageNum)=> {
-                    this.currentPage = pageNum;
-                });
-            }
-        });
-
-
-
-    }
-
-
-    pageChanged() {
-
-        this.currentPage = parseInt(this.currentPage);
-
-        if (!this.currentPage) this.currentPage = 1;
-        if (this.currentPage < 1) this.currentPage = 1;
-        if (this.currentPage > this.gridApi.pagination.getTotalPages()) this.currentPage = this.gridApi.pagination.getTotalPages();
-        this.gridApi.pagination.seek(this.currentPage);
-    }
-
-    nextPage() {
-        if (this.currentPage === this.gridApi.pagination.getTotalPages()) return;
-        this.gridApi.pagination.nextPage();
-        this.currentPage = this.gridApi.pagination.getPage();
-    }
-    prevPage() {
-        this.gridApi.pagination.previousPage();
-        this.currentPage = this.gridApi.pagination.getPage();
-    }
-    getTotalPages() {
-        this.gridApi.pagination.seek(this.currentPage);
-        return this.gridApi.pagination.getTotalPages();
-    }
-}
-
-
-
-
-export function jfGridPagination() {
-    return {
-        scope: {
-            gridApi: '='
-        },
-        controller: jfGridPaginationController,
-        controllerAs: 'jfGridPagination',
-        bindToController: true,
-        templateUrl: 'directives/jf_grid_pagination/jf_grid_pagination.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_header/jf_header.html b/web/angular-web/src/main/webapp/app/directives/jf_header/jf_header.html
deleted file mode 100644
index 8784b7b..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_header/jf_header.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<nav id="jf-header">
-    <div class="navbar-header">
-        <a class="navbar-brand" ui-sref="home">
-            <img class="logo-picture" ng-src="{{jfHeader.logoUrl}}" alt="Artifactory"/>
-        </a>
-    </div>
-
-    <div class="navbar-right">
-        <div class="pull-right header-section header-help dropdown" dropdown ng-disabled="jfHeader.helpLinks.length == 0" ng-if="jfHeader.helpLinksEnabled">
-            <a class="dropdown-toggle help-menu" dropdown-toggle ng-disabled="jfHeader.helpLinks.length == 0">Help</a>
-            <ul class="dropdown-menu dropdown-menu-right text-left">
-                <li ng-repeat="helpLink in jfHeader.helpLinks | orderBy:'priority'">
-                    <a href="{{helpLink.link}}"
-                       target="_blank">{{helpLink.title}}</a>
-                </li>
-            </ul>
-        </div>
-        <div class="pull-right header-section">
-            <div ng-if="!jfHeader.currentUser.isGuest()">Welcome,
-                <a href ui-sref="user_profile" class="navbar-link username-header">{{jfHeader.currentUser.name}}</a>
-                <a id="logout"
-                   href=""
-                   class="navbar-link"
-                   ng-click="jfHeader.logout()">
-                    <span class="log-out">( Log Out )</span>
-                </a>
-            </div>
-            <div ng-if="jfHeader.currentUser.isGuest()">
-                <a href ng-click="jfHeader.login()">Log In</a>
-            </div>
-        </div>
-
-        <jf-header-search ng-if="!jfHeader.hideSearch"></jf-header-search>
-        <span class="pull-left navbar-separator"></span>
-    </div>
-</nav>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_header/jf_header.js b/web/angular-web/src/main/webapp/app/directives/jf_header/jf_header.js
deleted file mode 100644
index 8a636a3..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_header/jf_header.js
+++ /dev/null
@@ -1,129 +0,0 @@
-import EVENTS from '../../constants/artifacts_events.constants';
-import API from '../../constants/api.constants';
-import HELP from '../../constants/artifactory_help.constants';
-
-class jfHeaderController {
-    constructor($scope, $q, User, $state, $timeout, $window, GeneralConfigDao, FooterDao, ArtifactoryEventBus, ArtifactoryFeatures, $rootScope, $location, $http, ArtifactoryState, ArtifactoryHttpClient) {
-        this.$scope = $scope;
-        this.currentUser = User.getCurrent();
-        this.generalConfigDao = GeneralConfigDao;
-        this.footerDao = FooterDao;
-        this.artifactoryState = ArtifactoryState;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.user = User;
-        this.state = $state;
-        this.$timeout = $timeout;
-        this.$window = $window;
-        this.$q = $q;
-        this.logoEndPoint = `${API.API_URL}/auth/screen/logo`;
-        this.defaultLogoUrl = 'images/artifactory_logo.svg';
-        this.HELP = HELP;
-
-        this.ArtifactoryHttpClient = ArtifactoryHttpClient;
-
-        //$.getJSON('artifactory_help.json', (jsonRes) => {
-        //    this.HELP = jsonRes;
-        //    this._refreshHelpMenu($location.path());
-        //})
-        //        .fail((errRes) => {
-        //            if (errRes.status != 404) {
-        //                let body = `Cannot parse the local help links file 'artifactory_help.json'.<br>The default file will be loaded instead.`;
-        //                ArtifactoryNotifications.createMessageWithHtml({type: 'error', body: body, timeout: 0});
-        //            }
-        //        });
-
-        $rootScope.$watch(() => {
-            return $location.path();
-        },
-        (currentURL) => this._refreshHelpMenu(currentURL));
-
-        this._registerEvents();
-        this._getFooterData();
-    }
-
-    _registerEvents() {
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.FOOTER_DATA_UPDATED, () => this._getFooterData(true));
-    }
-
-    _getFooterData(force) {
-        this.footerDao.get(force).then(footerData => {
-            this.$window.document.title = footerData.serverName ? footerData.serverName : 'Artifactory';
-
-            this.helpLinksEnabled = footerData.helpLinksEnabled;
-
-            this.samlRedirectEnabled = footerData.samlRedirectEnabled;
-
-            if (footerData.userLogo) {
-                this.logoUrl = '';
-                this.$timeout(()=> {
-                    this.logoUrl = this.logoEndPoint;
-                });
-            }
-            else if (footerData.logoUrl)
-                this.logoUrl = footerData.logoUrl;
-            else
-                this.logoUrl = this.defaultLogoUrl;
-
-            if ((this.user.currentUser.name !== 'anonymous' || this.user.currentUser.anonAccessEnabled) && (footerData.systemMessage || footerData.systemMessageTitle))
-                this.artifactoryState.setState('systemMessage', {
-                    enabled: footerData.systemMessageEnabled,
-                    color: footerData.systemMessageTitleColor,
-                    title: footerData.systemMessageTitle,
-                    message: footerData.systemMessage,
-                    inAllPages: footerData.showSystemMessageOnAllPages
-                });
-            else
-                this.artifactoryState.setState('systemMessage',undefined);
-        });
-    }
-
-    _refreshHelpMenu(currentURL) {
-        this.helpLinks = [];
-
-        for (let key in this.HELP)
-            if (currentURL == key || (key.indexOf('**') != -1 && currentURL.indexOf(key.replace('**', '')) != -1))
-                for (let i = 0; i < this.HELP[key].length; i++)
-                    this.helpLinks.push(this.HELP[key][i]);
-    }
-
-    login() {
-
-        if (this.samlRedirectEnabled) {
-            this.ArtifactoryHttpClient.post("/auth/loginRelatedData", null,{}).then((res)=> {
-                if (res.data.ssoProviderLink) {
-                    this.$window.open(res.data.ssoProviderLink, "_self");
-                }
-                else {
-                    this.state.go('login');
-                }
-            });
-        }
-        else {
-            this.state.go('login');
-        }
-
-    }
-
-    logout() {
-        this.artifactoryEventBus.dispatch(EVENTS.USER_LOGOUT,this.state.current.name.startsWith('admin.'));
-
-/*
-        this.user.logout()
-                .then(() => {
-                    this.state.go("home");
-                });
-*/
-    }
-}
-
-export function jfHeader() {
-    return {
-        scope: {
-            hideSearch: '@'
-        },
-        controller: jfHeaderController,
-        controllerAs: 'jfHeader',
-        bindToController: true,
-        templateUrl: 'directives/jf_header/jf_header.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_header_search/jf_header_search.html b/web/angular-web/src/main/webapp/app/directives/jf_header_search/jf_header_search.html
deleted file mode 100644
index 876d750..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_header_search/jf_header_search.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<form ng-submit="jfHeaderSearch.search()" class="pull-left header-separator">
-    <div class="search-wrapper">
-        <div class="icon-search-container"
-             data-ic-class="search-trigger">
-            <span class="header-search-btn icon icon-search" ng-click="jfHeaderSearch.search()"></span>
-            <input type="text"
-                   class="search-input"
-                   data-ic-class="search-input"
-                   placeholder="Search"
-                   ng-model="jfHeaderSearch.query.query"/>
-        </div>
-    </div>
-</form>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_header_search/jf_header_search.js b/web/angular-web/src/main/webapp/app/directives/jf_header_search/jf_header_search.js
deleted file mode 100644
index 55cce98..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_header_search/jf_header_search.js
+++ /dev/null
@@ -1,83 +0,0 @@
-class jfHeaderSearchController {
-    constructor($element, $scope,$state) {
-        this.$scope = $scope;
-        this.$element = $element;
-        this.$searchTrigger = $('[data-ic-class="search-trigger"]');
-        this.$searchInput = $('[data-ic-class="search-input"]');
-
-        this.$state=$state;
-        this._isFocused = false;
-        this.query = {
-            search:'quick'
-        };
-        this._registerEvents();
-    }
-
-    search() {
-        this.$state.go('artifacts.browsers.search',{'searchType':'quick', 'tab':this.query.search,'params':btoa(JSON.stringify(this.query))});
-        this.query.query = '';
-    }
-
-    _registerEvents() {
-        this.$element.on('mouseenter', () => this._mouseEnter());
-        this.$element.on('mouseleave', () => this._mouseLeave());
-        this.$searchInput.on('focus', () => this._triggerFocus());
-        this.$searchInput.on('blur', () => this._triggerFocus());
-
-        this.$scope.$on('$destroy', () => {
-            this.$element.off('mouseenter');
-            this.$element.off('mouseleave');
-            this.$searchInput.off('focus');
-            this.$searchInput.off('blur');
-        });
-    }
-
-    _registerBodyEvent() {
-        $('body').on('click.outsideSearch', (e) => this._checkClickTarget(e));
-    }
-
-    _deregisterBodyEvent() {
-        $('body').off('click.outsideSearch');
-    }
-
-    _mouseEnter() {
-        this.$searchTrigger.addClass('active');
-        this.$searchInput.addClass('active');
-    }
-
-    _mouseLeave() {
-        // do not hide the search bar when it is focused
-        if (this._isFocused) {
-            return;
-        }
-
-        this.$searchTrigger.removeClass('active');
-        this.$searchInput.removeClass('active');
-    }
-
-    _triggerFocus() {
-        this._registerBodyEvent();
-        this._isFocused = !this._isFocused;
-    }
-
-    _checkClickTarget(e) {
-        // check if the clicked element is inside the directive
-        if (!$(this.$element).has(e.target).length) {
-            this.query.query = '';
-            if (!this.$scope.$$phase) this.$scope.$digest();
-            this._isFocused = false;
-            this._mouseLeave();
-            this._deregisterBodyEvent();
-        }
-    }
-
-
-}
-
-export function jfHeaderSearch() {
-    return {
-        controller: jfHeaderSearchController,
-        controllerAs: 'jfHeaderSearch',
-        templateUrl: 'directives/jf_header_search/jf_header_search.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_help_tooltip/jf_help_tooltip.html b/web/angular-web/src/main/webapp/app/directives/jf_help_tooltip/jf_help_tooltip.html
deleted file mode 100644
index ebfc11a..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_help_tooltip/jf_help_tooltip.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<div>
-    <span class="tooltip-icon jf-tooltipster">
-        <span><ng-transclude></ng-transclude></span>
-    </span>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_help_tooltip/jf_help_tooltip.js b/web/angular-web/src/main/webapp/app/directives/jf_help_tooltip/jf_help_tooltip.js
deleted file mode 100644
index e2fc392..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_help_tooltip/jf_help_tooltip.js
+++ /dev/null
@@ -1,36 +0,0 @@
-export function jfHelpTooltip() {
-    return {
-        scope: {
-            placement: '@?',
-            text: '@?',
-            html: '='
-        },
-        restrict: 'E',
-        templateUrl: 'directives/jf_help_tooltip/jf_help_tooltip.html',
-        transclude: true,
-        link: function ($scope, $element, $attrs, ctrl, $transclude) {
-            let content = $scope.text || $scope.html || $transclude().html();
-            if (!content) return;
-
-            content = content.replace(/\n/g, '<br>');
-
-            $($element).find('.jf-tooltipster').tooltipster({
-                animation: 'fade',
-                contentAsHTML : 'true',
-                trigger: 'hover',
-                onlyOne: 'true',
-                interactive: 'true',
-                interactiveTolerance: 500,
-                position: $element.placement,
-                theme: "tooltipster-default " + $element.placement,
-                content: content,
-                functionReady: function() {
-                    $($element).find('.jf-tooltipster').addClass('active');
-                },
-                functionAfter: function() {
-                    $($element).find('.jf-tooltipster').removeClass('active');
-                }
-            });
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_hide_for_aol/jf_hide_for_aol.js b/web/angular-web/src/main/webapp/app/directives/jf_hide_for_aol/jf_hide_for_aol.js
deleted file mode 100644
index 8389357..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_hide_for_aol/jf_hide_for_aol.js
+++ /dev/null
@@ -1,10 +0,0 @@
-export function jfHideForAol() {
-	return {
-		restrict: 'A',
-		controller: function(ArtifactoryFeatures, $element) {
-			if (ArtifactoryFeatures.isAol()) {
-				$($element).hide();
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_input_text_v2/jf_input_text_v2.html b/web/angular-web/src/main/webapp/app/directives/jf_input_text_v2/jf_input_text_v2.html
deleted file mode 100644
index 50d81f2..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_input_text_v2/jf_input_text_v2.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<label for="{{jfInputTextV2.name}}" style="font-weight: 100;">{{jfInputTextV2.text}}<span ng-if="jfInputTextV2.ismandatory">*</span></label>
-<div style="position:relative; bottom: 0px; display:inline-block;"><img style="width: 16px;" src="images/tooltip.png" /></div>
-<div class="input-label-top">
-    <input type="{{jfInputTextV2.type}}"
-           class="input-text"
-           name="{{jfInputTextV2.name}}"
-           id="{{jfInputTextV2.name}}"
-           ng-class="{invalid: (jfInputTextV2.form[jfInputTextV2.name].showErrors && !jfInputTextV2.form.$valid),
-                      hascontent:jfInputTextV2.isInputEmpty()}"
-           ng-blur="jfInputTextV2.form[jfInputTextV2.name].showErrors = true"
-           ng-focus="jfInputTextV2.form[jfInputTextV2.name].showErrors = false; jfInputTextV2.form[jfInputTextV2.name].showErrors=false"
-           ui-keyup="{13: 'jfInputTextV2.form = true'}"
-           ng-change="jfInputTextV2.isInputDirty()"
-           autocomplete="{{jfInputTextV2.autocomplete}}"
-           ng-model="jfInputTextV2.model">
-</div>
-<jf-validation field="jfInputTextV2.form[jfInputTextV2.name]"
-               dictionary="jfInputTextV2.dictionary"
-               ng-if="jfInputTextV2.dictionary && (jfInputTextV2.form.showErrors || jfInputTextV2.form[jfInputTextV2.name].showErrors)"></jf-validation>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_input_text_v2/jf_input_text_v2.js b/web/angular-web/src/main/webapp/app/directives/jf_input_text_v2/jf_input_text_v2.js
deleted file mode 100644
index 9ef9ec8..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_input_text_v2/jf_input_text_v2.js
+++ /dev/null
@@ -1,52 +0,0 @@
-class jfInputTextV2Controller {
-
-    constructor($element, $scope, $compile,$timeout) {
-        this.$element = $element;
-        this.$scope = $scope;
-        this.$compile = $compile;
-        this.$timeout=$timeout;
-        this._initInput();
-
-    }
-
-    _initInput() {
-        if (this.ismandatory) {
-            $(this.$element.find('input')[0]).attr('required','');
-            this.$compile(this.$element.find('input'))(this.$scope);
-        }
-        if (this.autofocus) {
-            this.$timeout($(this.$element.find('input')[0]).focus());
-
-        }
-    }
-
-    isInputEmpty() {
-        return this.model !== "" &&
-                this.model !== undefined &&
-                this.model !== null;
-
-    }
-}
-
-export function jfInputTextV2() {
-    return {
-        scope: {
-            type: '@',
-            name: '@',
-            text: '@',
-            autocomplete:'@',
-            autofocus: '=',
-            ismandatory: '=',
-            model: '=',
-            form: '='
-
-        },
-        controller: jfInputTextV2Controller,
-        controllerAs: 'jfInputTextV2',
-        templateUrl: 'directives/jf_input_text_v2/jf_input_text_v2.html',
-        terminal:true,
-        priority:1000,
-        bindToController: true
-
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_list/jf_list.html b/web/angular-web/src/main/webapp/app/directives/jf_list/jf_list.html
deleted file mode 100644
index 1c1626e..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_list/jf_list.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<ul class="list-group">
-    <li ng-repeat="item in jfList.list track by $index"
-        class="list-group-item"
-        ng-bind="item"
-        ng-class="{'active' : jfList.isSelected(item)}"
-        ng-click="jfList.toggleSelection(item)">
-    </li>
-
-</ul>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_list/jf_list.js b/web/angular-web/src/main/webapp/app/directives/jf_list/jf_list.js
deleted file mode 100644
index c5ee43c..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_list/jf_list.js
+++ /dev/null
@@ -1,44 +0,0 @@
-class jfListController {
-    constructor() {
-       // this.selectedItems = [];
-    }
-
-    isSelected(item) {
-        return this._inSelectedItems(item) > -1;
-    }
-
-    toggleSelection(item) {
-        let index = this._inSelectedItems(item);
-
-        if (index > -1) {
-            this.selectedItems.splice(index, 1);
-        } else {
-            this.selectedItems.push(item);
-        }
-        this.getSelectedItems();
-    }
-
-    _inSelectedItems(item) {
-        return this.selectedItems.indexOf(item);
-    }
-
-    getSelectedItems() {
-
-        this.selectedItemsList({list: this.selectedItems});
-
-    }
-
-}
-
-export function jfList() {
-    return {
-        scope: {
-            list: '=',
-            selectedItems: '='
-        },
-        controller: jfListController,
-        controllerAs: 'jfList',
-        templateUrl: 'directives/jf_list/jf_list.html',
-        bindToController: true
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_list_maker/jf_list_maker.html b/web/angular-web/src/main/webapp/app/directives/jf_list_maker/jf_list_maker.html
deleted file mode 100644
index 8ec5425..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_list_maker/jf_list_maker.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<div class="jf-list-maker">
-    <div class="form-group">
-        <div class="form-group-cell list-new-value">
-            <jf-field>
-                <label>{{jfListMaker.label}}</label>
-                <jf-help-tooltip ng-if="jfListMaker.helpTooltip"
-                                 html="jfListMaker.helpTooltip"></jf-help-tooltip>
-                <input
-                        type="text"
-                        class="input-text"
-                        ng-model="jfListMaker.newValue"
-                        placeholder="New {{jfListMaker.objectName}}"
-                        id="newValueField"
-                        name="newValueField"
-                        jf-enter-press="jfListMaker.addValue()"
-                        ng-disabled="jfListMaker.ngDisabled">
-            </jf-field>
-            <div class="form-group-cell form-button auto-width">
-                <i class="icon icon-new"
-                   ng-click="!(jfListMaker.ngDisabled || !jfListMaker.newValue.length) && jfListMaker.addValue()"
-                   ng-disabled="jfListMaker.ngDisabled || !jfListMaker.newValue.length"></i>
-            </div>
-            <div class="jf-validation">{{jfListMaker.errorMessage}}</div>
-        </div>
-    </div>
-
-    <div id="property-set-list" ng-if="jfListMaker.values.length">
-        <div class="property-set-row" ng-repeat="value in jfListMaker.values track by $index">
-            <div>{{value}}</div>
-            <div class="property-set-buttons">
-                <a href="" class="icon icon-clear"
-                   ng-click="jfListMaker.removeValue($index)"
-                   ng-if="jfListMaker.values.length > jfListMaker.minLength"
-                   ng-disabled="jfListMaker.ngDisabled"></a>
-            </div>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_list_maker/jf_list_maker.js b/web/angular-web/src/main/webapp/app/directives/jf_list_maker/jf_list_maker.js
deleted file mode 100644
index a8561f5..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_list_maker/jf_list_maker.js
+++ /dev/null
@@ -1,58 +0,0 @@
-export function jfListMaker() {
-
-    return {
-        restrict: 'E',
-        scope: {
-            values: '=',
-            label: '@',
-            helpTooltip: '=',
-            objectName: '@',
-            ngDisabled: '=',
-            noSort: '=?',
-            minLength: '@'
-        },
-        templateUrl: 'directives/jf_list_maker/jf_list_maker.html',
-        controller: jfListMakerController,
-        controllerAs: 'jfListMaker',
-        bindToController: true
-    }
-}
-
-/**
- * API for the jfDragDrop directive
- */
-class jfListMakerController {
-
-    constructor($attrs) {
-        this.noSort = this.noSort || $attrs.hasOwnProperty('noSort');
-        if (this.values && !this.noSort) this.values = _.sortBy(this.values);
-        this.minLength = this.minLength || 0;
-    }
-    addValue() {
-        if (!this.values) this.values = [];
-
-        this.errorMessage = null;
-
-        if (_.isEmpty(this.newValue)) {
-            this.errorMessage = "Must input value";
-        }
-        else if (!this._isValueUnique(this.newValue)) {
-            this.errorMessage = "Value already exists";
-        }
-        else {
-            this.values.push(this.newValue);
-            this.newValue = null;
-        }
-        if (!this.noSort) {
-            this.values = _.sortBy(this.values);
-        }
-    }
-
-    removeValue(index) {
-        this.values.splice(index,1);
-    }
-
-    _isValueUnique(text) {
-        return !this.values || this.values.indexOf(text) == -1;
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_messages/jf_messages.html b/web/angular-web/src/main/webapp/app/directives/jf_messages/jf_messages.html
deleted file mode 100644
index 68cd81f..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_messages/jf_messages.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<div jf-disable-ng-animate class="constant-messages-container" ng-if="jfMessages.getConstantMessages().length || jfMessages.getSystemMessage()">
-    <div class="constant-message system"
-         ng-if="jfMessages.systemMessage">
-        <div class="message-container">
-            <div class="message-title"
-                 ng-if="jfMessages.systemMessage.title"
-                 ng-style="{color: jfMessages.systemMessage.color}"
-                 ng-bind-html="jfMessages.systemMessage.title + (jfMessages.systemMessage.message ? ': ' : '')"></div>
-            <div class="message-text"
-                 ng-if="jfMessages.systemMessage.message">
-                <span ng-bind-html="jfMessages.systemMessage.message | parseLinks"></span>
-            </div>
-        </div>
-    </div>
-    <div class="constant-message default"
-         ng-class="{error: message.type==='error',warning: message.type==='warning',info: message.type==='info'}"
-         ng-repeat="message in jfMessages.getConstantMessages()">
-
-        <span ng-bind-html="message.message"></span>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_messages/jf_messages.js b/web/angular-web/src/main/webapp/app/directives/jf_messages/jf_messages.js
deleted file mode 100644
index 0e9dc1e..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_messages/jf_messages.js
+++ /dev/null
@@ -1,80 +0,0 @@
-class jfMessagesController {
-    constructor($scope, $state, $window, ArtifactoryState, User) {
-
-        this.$state = $state;
-        this.user = User;
-        this.artifactoryState = ArtifactoryState;
-        this.$window = $window;
-
-        angular.element(this.$window).on('resize', this.handleSizing.bind(this));
-        $scope.$on('$destroy', () => {
-            angular.element(this.$window).off('resize');
-        });
-
-        setTimeout(() => {
-            this.handleSizing();
-
-            $(document).on('mouseenter', '.message-text a', () => {
-                $('.message-container').addClass('pause-animation')
-            });
-            $(document).on('mouseleave', '.message-text a', () => {
-                $('.message-container').removeClass('pause-animation')
-            });
-        }, 300);
-    }
-
-    getConstantMessages() {
-        let msgs = this.artifactoryState.getState('constantMessages');
-        if (msgs) this.addPasswordExpirationMessages(msgs);
-        return msgs;
-    }
-
-    addPasswordExpirationMessages(msgs) {
-        let daysToExpiration = this.user.currentUser.currentPasswordValidFor;
-        let profileUpdatable = this.user.currentUser.profileUpdatable;
-        if (daysToExpiration <= 2 && this.$state.current.name !== 'user_profile' && !_.findWhere(msgs,{code: 'expiration'})) {
-            msgs.push({
-                message: `Your password will expire in ${daysToExpiration} days. ${profileUpdatable ? 'Click <a href="#/profile">here</a> to change it now.' : 'Contact your system administrator to change it.'}`,
-                type: 'warning',
-                code: 'expiration'
-            })
-        }
-        else if (this.$state.current.name === 'user_profile' && _.findWhere(msgs,{code: 'expiration'})) {
-            let index = msgs.indexOf(!_.findWhere(msgs,{code: 'expiration'}));
-            msgs.splice(index,1);
-        }
-    }
-
-    getSystemMessage() {
-        let msgObj = this.artifactoryState.getState('systemMessage');
-        if (msgObj && msgObj.enabled && (msgObj.inAllPages || this.$state.current.name === 'home')) {
-            this.systemMessage = msgObj;
-            this.handleSizing();
-        }
-        else
-            this.systemMessage = null;
-
-        return this.systemMessage;
-    }
-
-    handleSizing() {
-        if ($('.constant-message.system').length) {
-            let maxMessageSize = this.$window.innerWidth - $('.constant-message.system .message-title').width() - ($('.constant-message.system .message-container').offset().left * 2) - 10,
-                    msgText = $('.constant-message.system .message-text');
-
-            if (msgText.find('span').width() > maxMessageSize)
-                msgText.css('width', maxMessageSize).addClass('marqueed');
-            else
-                msgText.css('width', 'auto').removeClass('marqueed');
-        }
-    }
-}
-
-export function jfMessages() {
-    return {
-        controller: jfMessagesController,
-        controllerAs: 'jfMessages',
-        bindToController: true,
-        templateUrl: 'directives/jf_messages/jf_messages.html'
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_panel/jf_panel.html b/web/angular-web/src/main/webapp/app/directives/jf_panel/jf_panel.html
deleted file mode 100644
index fed7c3a..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_panel/jf_panel.html
+++ /dev/null
@@ -1,8 +0,0 @@
-<div class="panel-container">
-    <span class="panel-heading" ng-if="jfPanelHeading" ng-bind="jfPanelHeading"></span>
-    <div class="panel-body">
-        <div class="panel panel-default clearfix {{ jfPanelClasses }}">
-            <ng-transclude></ng-transclude>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_panel/jf_panel.js b/web/angular-web/src/main/webapp/app/directives/jf_panel/jf_panel.js
deleted file mode 100644
index 63aa084..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_panel/jf_panel.js
+++ /dev/null
@@ -1,10 +0,0 @@
-export function jfPanel() {
-    return {
-        scope: {
-            jfPanelHeading: '@',
-            jfPanelClasses: '@'
-        },
-        templateUrl: 'directives/jf_panel/jf_panel.html',
-        transclude: true
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_print/jf_print.html b/web/angular-web/src/main/webapp/app/directives/jf_print/jf_print.html
deleted file mode 100644
index f0f7eea..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_print/jf_print.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<a clip-copy="jfGeneral.generalData.distributionManagement.distributedManagement"
-   jf-tooltip="Print"
-   class="pull-right">
-    <img src="images/tree_file.png"/>
-</a>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_print/jf_print.js b/web/angular-web/src/main/webapp/app/directives/jf_print/jf_print.js
deleted file mode 100644
index 907cf43..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_print/jf_print.js
+++ /dev/null
@@ -1,47 +0,0 @@
-export function jfPrint () {
-    return {
-        restrict: 'E',
-        scope: {
-            content: '@'
-        },
-        controller: jfPrintController,
-        controllerAs: 'jfPrint',
-        bindToController: true,
-        templateUrl: 'directives/jf_print/jf_print.html'
-    }
-}
-
-
-class jfPrintController {
-
-    constructor($element, $window, $scope) {
-        this.$element = $element;
-        this.$window = $window;
-        this.$scope = $scope;
-
-        this._registerEvents();
-    }
-
-    _registerEvents() {
-        this.$element.on('click', () => this.print());
-        this.$scope.$on('$destroy', () => this.$element.off('click'));
-    }
-
-    print() {
-        let printWindow = this.$window.open('', '_blank', 'height=380,width=750');
-        printWindow.document.write('<html><head><title>Artifactory</title></head><body >');
-        printWindow.document.write('<pre>' + this._escapeHTML(this.content) + '</pre>');
-        printWindow.document.write('</body></html>');
-        printWindow.print();
-        printWindow.close();
-        return true;
-    }
-
-    _escapeHTML(content) {
-        let escape = document.createElement('textarea');
-        escape.innerHTML = content;
-        return escape.innerHTML;
-    }
-
-
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_repokey_validator/jf_repokey_validtaor.js b/web/angular-web/src/main/webapp/app/directives/jf_repokey_validator/jf_repokey_validtaor.js
deleted file mode 100644
index 3c43479..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_repokey_validator/jf_repokey_validtaor.js
+++ /dev/null
@@ -1,35 +0,0 @@
-export function jfRepokeyValidator(RepositoriesDao, $q, $timeout) {
-    return {
-        restrict: 'A',
-        require: 'ngModel',
-        scope:{
-            controller:'=jfRepokeyValidator'
-        },
-        link: function jfRepokeyValidatorLink(scope, element, attrs, ngModel) {
-
-
-            ngModel.$asyncValidators.repoKeyValidator = validateRepoKey;
-
-            function validateRepoKey(modelValue, viewValue) {
-                var value = modelValue || viewValue;
-
-                if (!value) {
-                    return $q.when();
-                }
-
-                return RepositoriesDao.repoKeyValidator({repoKey: value}).$promise
-                    .then(function (result) {
-                        if (result.error) {
-                            scope.controller.repoKeyValidatorMessage = result.error;
-                            return $q.reject();
-                        }
-                        else if (scope.controller.repoInfo.isType('docker') && value.toLowerCase() !== value) {
-                            scope.controller.repoKeyValidatorMessage = 'Docker repository key must be in lowercase';
-                            return $q.reject();
-                        }
-                        return true;
-                    });
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_reveal_input/jf_reveal_input.js b/web/angular-web/src/main/webapp/app/directives/jf_reveal_input/jf_reveal_input.js
deleted file mode 100644
index c67ac4c..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_reveal_input/jf_reveal_input.js
+++ /dev/null
@@ -1,44 +0,0 @@
-class jfRevealInputController {
-	constructor($element) {
-		this.$elementIcon = $element.find('i');
-		this.tooltipText = 'Show ' + this.objectName;
-	}
-	
-	updateInput() {
-		let input = $(`#${this.inputId}`);
-		let type = input.attr('type');
-		if (type === 'text') {
-			input.attr('type', 'password');
-			this.$elementIcon.removeClass('icon-unview').addClass('icon-view');
-			this.tooltipText = this.tooltipText.replace('Hide', 'Show');
-		}
-		else {
-			input.attr('type', 'text');
-			this.$elementIcon.removeClass('icon-view').addClass('icon-unview');
-			this.tooltipText = this.tooltipText.replace('Show', 'Hide');
-		}
-
-	}
-
-	hasData() {
-		let input = $(`#${this.inputId}`);
-		return !!input.val();
-	}
-}
-
-export function jfRevealInput() {
-    return {
-    	restrict: 'A',
-		template: `<i class="icon icon-view icon-2x jf-reveal-input"
-					  jf-tooltip="{{jfRevealInput.tooltipText}}"
-					  ng-if="jfRevealInput.hasData()"
-		   			  ng-click="jfRevealInput.updateInput()"></i>`,
-		controller: jfRevealInputController,
-		controllerAs: 'jfRevealInput',
-		bindToController: true,
-		scope: {
-			inputId: '@jfRevealInput',
-			objectName: '@'
-		}
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_search/jf_search.html b/web/angular-web/src/main/webapp/app/directives/jf_search/jf_search.html
deleted file mode 100644
index 9d5d612..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_search/jf_search.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<div>
-    <ul class="quick-search-tabs">
-        <li class="quick-search-tab search-title">
-            Search type:
-        </li>
-        <li class="quick-search-tab"
-            ng-repeat="tab in jfSearch.searchTabs"
-            ng-class="{active:jfSearch.isActiveTab(tab.key)}"
-            jf-disable-feature="{{ tab.feature }}"
-            ng-click="jfSearch.onClick(tab)"><a href="">{{tab.value}}</a></li>
-    </ul>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_search/jf_search.js b/web/angular-web/src/main/webapp/app/directives/jf_search/jf_search.js
deleted file mode 100644
index bf87a46..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_search/jf_search.js
+++ /dev/null
@@ -1,83 +0,0 @@
-import EVENTS     from '../../constants/artifacts_events.constants';
-class jfSearchController {
-    constructor($scope, $state, $stateParams, ArtifactoryEventBus, ArtifactoryState, ArtifactoryFeatures, User) {
-        this.$stateParams = $stateParams;
-        this.currentSearch = this.$stateParams.searchType || '';
-        this.user = User.currentUser;
-        this.searchTabs = this.getSearchTabs();
-        this.$state = $state;
-        this.collapseSearchPanel = this.$stateParams.searchType ? false : true;
-        this.artifactoryState = ArtifactoryState;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.features = ArtifactoryFeatures;
-        ArtifactoryEventBus.dispatch(EVENTS.SEARCH_COLLAPSE, this.collapseSearchPanel);
-        ArtifactoryEventBus.registerOnScope($scope, EVENTS.CLEAR_SEARCH, () => {
-            this.collapseSearchPanel = true;
-            this.currentSearch = '';
-        });
-        ArtifactoryEventBus.registerOnScope($scope, EVENTS.SEARCH_URL_CHANGED, (stateParams) => {
-            if (this.currentSearch != stateParams.searchType) {            
-                this.selectSearch(stateParams.searchType, stateParams.params);
-            }
-        });
-    }
-
-    onClick(tab) {
-        if (this.features.isEnabled(tab.feature)) this.selectSearch(tab.key);
-    }
-
-    selectSearch(_currentSearch, params) {
-        if (this.collapseSearchPanel) {
-            this.collapseSearchPanel = false;
-        }
-        else if (this.currentSearch == _currentSearch) {
-            this.collapseSearchPanel = true;
-            this.currentSearch = '';
-
-            var state = this.artifactoryState.getState('lastTreeState');
-            if (state) {
-                this.$state.go(state.name, state.params);
-            }
-            else {
-                this.$state.go('artifacts.browsers.path', {tab: 'General', artifact: '', browser: 'tree'})
-            }
-        }
-
-        if (!this.collapseSearchPanel) {
-            this.currentSearch = _currentSearch;
-            this.$state.go('artifacts.browsers.search', {'searchType': _currentSearch, params: params || ''});
-        }
-        this.artifactoryEventBus.dispatch(EVENTS.SEARCH_COLLAPSE, this.collapseSearchPanel);
-    }
-
-    getSearchTabs() {
-        let tabs = [
-            {key: 'quick', value: 'Quick'},
-            {key: 'package', value: 'Package'},
-            {key: 'class', value: 'Archive'},
-            {key: 'property', value: 'Property', feature: 'properties'},
-            {key: 'checksum', value: 'Checksum'},
-            {key: 'remote', value: 'Remote'}
-        ];
-
-/*
-        if (this.user.isAdmin()) {
-            tabs.push({key: 'trash', value: 'Trash'});
-        }
-*/
-
-        return tabs;
-    }
-
-    isActiveTab(tab) {
-        return this.currentSearch == tab && !this.collapseSearchPanel;
-    }
-}
-
-export function jfSearch() {
-    return {
-        controller: jfSearchController,
-        controllerAs: 'jfSearch',
-        templateUrl: 'directives/jf_search/jf_search.html'
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_checksum.html b/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_checksum.html
deleted file mode 100644
index 37d50de..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_checksum.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<div class="search-wrapper">
-    <form novalidate>
-        <div class="form-group no-margin-bottom">
-            <div class="form-group-cell">
-                <jf-field autofocus="true">
-                    <input type="text"
-                           class="input-text"
-                           id="checksum"
-                           name="checksum"
-                           ng-model="jfChecksum.query.checksum"
-                           placeholder="Checksum"/>
-                </jf-field>
-            </div>
-            <div class="form-group-cell">
-                <button type="submit"
-                        class="btn btn-primary"
-                        ng-disabled="!jfChecksum.query.checksum"
-                        ng-click="jfChecksum.search()">Search
-                </button>
-            </div>
-        </div>
-    </form>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_checksum.js b/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_checksum.js
deleted file mode 100644
index 6b4d56e..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_checksum.js
+++ /dev/null
@@ -1,36 +0,0 @@
-import EVENTS   from '../../../constants/artifacts_events.constants';
-import TOOLTIP  from '../../../constants/artifact_tooltip.constant';
-
-class jfChecksumController{
-    constructor($state,ArtifactoryEventBus) {
-
-        this.artifactoryEventBus=ArtifactoryEventBus;
-        this.$state=$state;
-        this.query.search= "checksum";
-        this.TOOLTIP = TOOLTIP.artifacts.search.checksumSearch;
-    }
-
-
-    search() {
-        this.$state.go('.', {
-            'searchType': this.query.search,
-            'searchParams': {
-                selectedRepos: this.query.selectedRepositories
-            },
-            'params': btoa(JSON.stringify(this.query))
-        });
-    }
-}
-
-export function jfChecksum() {
-    return {
-        restrict: 'EA',
-        scope:{
-            query:'='
-        },
-        controller: jfChecksumController,
-        controllerAs: 'jfChecksum',
-        bindToController: true,
-        templateUrl: 'directives/jf_search/search_tabs/jf_checksum.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_class.html b/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_class.html
deleted file mode 100644
index 96ab561..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_class.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<div class="search-wrapper">
-    <form novalidate>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-field>
-                    <input type="text"
-                           class="input-text"
-                           id="path"
-                           name="path"
-                           ng-model="jfClass.query.path"
-                           placeholder="Path (leave blank for *)">
-                </jf-field>
-<!--
-                <div class="field-bottom-remark"><i class="icon icon-info"></i>Search is case sensitive & supports *, ?</div>
--->
-            </div>
-            <div class="form-group-cell">
-                <jf-field autofocus="true">
-                    <input type="text"
-                           class="input-text"
-                           id="name"
-                           name="name"
-                           ng-model="jfClass.query.name"
-                           placeholder="Name">
-                </jf-field>
-            </div>
-        </div>
-        <div class="form-group no-margin-bottom">
-            <div class="form-group-cell double">
-                <jf-checkbox text="Search Class Resources Only" class="checkbox-search">
-                    <input type="checkbox"
-                           ng-model="jfClass.query.searchClassOnly"
-                           id="classOnly">
-                </jf-checkbox>
-                <jf-checkbox text="Exclude Inner Classes">
-                    <input type="checkbox" ng-model="jfClass.query.excludeInnerClasses" id="excludeInner">
-                </jf-checkbox>
-
-                <div class="pull-right">
-                    <button type="button" class="btn btn-default"
-                            ng-click="jfClass.query={}">Clear
-                    </button>
-                    <button type="submit"
-                            class="btn btn-primary"
-                            ng-disabled="!jfClass.query.name && !jfClass.query.path"
-                            ng-click="jfClass.search()">Search
-                    </button>
-                </div>
-            </div>
-        </div>
-    </form>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_class.js b/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_class.js
deleted file mode 100644
index ea66453..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_class.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import EVENTS   from '../../../constants/artifacts_events.constants';
-import TOOLTIP  from '../../../constants/artifact_tooltip.constant';
-
-class jfClassController {
-    constructor($state, ArtifactoryEventBus,$stateParams) {
-
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.$state = $state;
-        this.query.search = 'class';
-        this.query.searchClassOnly = ($stateParams.searchParams) ? $stateParams.searchParams.searchClassOnly : true;
-        this.TOOLTIP = TOOLTIP.artifacts.search.classSearch;
-    }
-
-    search() {
-        this.$state.go('.', {
-            'searchType': "class",
-            'searchParams': {
-                searchClassOnly: this.query.searchClassOnly,
-                selectedRepos: this.query.selectedRepositories
-            },
-            'params': btoa(JSON.stringify(this.query))
-        });
-    }
-}
-
-export function jfClass() {
-    return {
-        restrict: 'EA',
-        scope: {
-            query: '='
-        },
-        controller: jfClassController,
-        controllerAs: 'jfClass',
-        bindToController: true,
-        templateUrl: 'directives/jf_search/search_tabs/jf_class.html'
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_gavc.html b/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_gavc.html
deleted file mode 100644
index a6bc08e..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_gavc.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<div class="search-wrapper">
-    <form novalidate>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-field autofocus="true">
-                    <input type="text"
-                           class="input-text"
-                           id="groupId"
-                           name="groupID"
-                           ng-model="jfGavc.query.groupID"
-                           placeholder="Group ID">
-                </jf-field>
-            </div>
-            <div class="form-group-cell">
-                <jf-field>
-                    <input type="text"
-                           class="input-text"
-                           id="artifactId"
-                           name="artifactID"
-                           ng-model="jfGavc.query.artifactID"
-                           placeholder="Artifact ID">
-                </jf-field>
-            </div>
-        </div>
-        <div class="form-group no-margin-bottom">
-            <div class="form-group-cell">
-                <jf-field>
-                    <input type="text"
-                           class="input-text"
-                           id="version"
-                           name="version"
-                           ng-model="jfGavc.query.version"
-                           placeholder="Version">
-                </jf-field>
-                <div class="field-bottom-remark"><i class="icon icon-info"></i>Search is case sensitive & supports *, ?</div>
-            </div>
-            <div class="form-group-cell">
-                <jf-field>
-                    <input type="text"
-                           class="input-text"
-                           id="Classifier"
-                           name="Classifier"
-                           ng-model="jfGavc.query.classifier"
-                           placeholder="Classifier">
-                </jf-field>
-            </div>
-            <div class="form-group-cell auto-width">
-                    <button type="button" class="btn btn-default"
-                            ng-click="jfGavc.clearFields()">Clear
-                    </button>
-                    <button type="submit"
-                            class="btn btn-primary"
-                            ng-disabled="!jfGavc.query.classifier && !jfGavc.query.version && !jfGavc.query.artifactID && !jfGavc.query.groupID"
-                            ng-click="jfGavc.search()">Search
-                    </button>
-            </div>
-        </div>
-    </form>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_gavc.js b/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_gavc.js
deleted file mode 100644
index 3a1d74f..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_gavc.js
+++ /dev/null
@@ -1,40 +0,0 @@
-import EVENTS   from '../../../constants/artifacts_events.constants';
-import TOOLTIP  from '../../../constants/artifact_tooltip.constant';
-
-class jfGavcController {
-    constructor($state, ArtifactoryEventBus) {
-
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.$state = $state;
-        this.query.search = "gavc";
-        this.TOOLTIP = TOOLTIP.artifacts.search.gavcSearch;
-    }
-    clearFields(){
-        this.query={};
-        this.query.search = "gavc";
-    }
-
-    search() {
-
-        this.$state.go('.', {
-            'searchType': this.query.search,
-            'searchParams': {
-                selectedRepos: this.query.selectedRepositories
-            },
-            'params': btoa(JSON.stringify(this.query))
-        });
-    }
-}
-
-export function jfGavc() {
-    return {
-        restrict: 'EA',
-        scope: {
-            query: '='
-        },
-        controller: jfGavcController,
-        controllerAs: 'jfGavc',
-        bindToController: true,
-        templateUrl: 'directives/jf_search/search_tabs/jf_gavc.html'
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_package.html b/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_package.html
deleted file mode 100644
index 87fdc5a..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_package.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<div class="search-wrapper package-search">
-    <form novalidate>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <ui-select jf-disable-ng-animate ng-model="jfPackage.selectedPackageType" ng-change="jfPackage.onPackageTypeChange()">
-                    <ui-select-match placeholder="Select Package Type...">
-                        <i ng-if="$select.selected.icon" class="select-repo-icon icon icon-{{$select.selected.icon}}"></i>{{$select.selected.displayName}}
-                    </ui-select-match>
-                    <ui-select-choices repeat="property in jfPackage.availablePackageTypes | filter: $select.search track by $index">
-                        <i ng-if="property.icon" class="select-repo-icon icon icon-{{property.icon}}"></i>
-                        <span ng-bind-html="property.displayName | highlight: $select.search"></span>
-                    </ui-select-choices>
-                </ui-select>
-            </div>
-            <div class="form-group-cell"
-                 ng-if="jfPackage.selectedPackageType.id.startsWith('docker')">
-                <ul class="radio-select-list margin-top-10">
-                    <li>
-                        <input type="radio" id="v1" value="dockerV1" ng-change="jfPackage.onPackageTypeChange()"
-                               name="docker-version" ng-model="jfPackage.selectedPackageType.id"/>
-                        <label for="v1" class="input-label-weight">V1</label>
-                    </li>
-                    <li>
-                        <input type="radio" id="v2" value="dockerV2" ng-change="jfPackage.onPackageTypeChange()"
-                               name="docker-version" ng-model="jfPackage.selectedPackageType.id"/>
-                        <label for="v2" class="input-label-weight">V2</label>
-                    </li>
-                </ul>
-            </div>
-        </div>
-
-        <div ng-if="jfPackage.queryFields.length">
-            <div class="form-group">
-                <div class="form-group-cell"
-                     ng-repeat="field in jfPackage.queryFields"
-                     ng-if="field.id !== 'repo'">
-                    <jf-field>
-                        <input type="text"
-                               class="input-text"
-                               id="field.id"
-                               name="field.id"
-                               ng-model="jfPackage.rawQuery[field.id].values"
-                               placeholder="{{field.displayName}}">
-                    </jf-field>
-                </div>
-                <div class="form-group-cell package-search-buttons"
-                     ng-if="jfPackage.selectedPackageType">
-                    <div class="pull-right">
-                        <button type="button" class="btn btn-default"
-                                ng-click="jfPackage.clear()">Clear
-                        </button>
-                        <button type="submit"
-                                class="btn btn-primary"
-                                ng-disabled="!jfPackage.canSearch()"
-                                ng-click="jfPackage.search()">Search
-                        </button><!--ng-disabled="!jfPackage.query.name && !jfPackage.query.path"-->
-                    </div>
-                </div>
-<!--
-                <div class="field-bottom-remark"><i class="icon icon-info"></i>Search is case sensitive, supports (*,?) and comma separated multiple values</div>
--->
-            </div>
-        </div>
-
-    </form>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_package.js b/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_package.js
deleted file mode 100644
index fb583ab..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_package.js
+++ /dev/null
@@ -1,222 +0,0 @@
-import EVENTS   from '../../../constants/artifacts_events.constants';
-import TOOLTIP  from '../../../constants/artifact_tooltip.constant';
-
-class jfPackageController {
-    constructor($state, $stateParams, ArtifactPackageSearchDao, $timeout, $q, ArtifactoryFeatures) {
-        this.queryFields = [];
-
-        this.$q = $q;
-        this.$state = $state;
-        this.$stateParams = $stateParams;
-        this.$timeout = $timeout;
-        this.artifactPackageSearchDao = ArtifactPackageSearchDao;
-
-        this.isOss = ArtifactoryFeatures.isOss();
-
-        this.init();
-    }
-
-    init() {
-
-        if (this.query.selectedPackageType) {
-            this.selectedPackageType = this.query.selectedPackageType;
-
-            this.onPackageTypeChange().then(()=>{
-                if (this.query.query) {
-                    if (this.query.query.search === 'gavc') {
-                        for (let key in this.rawQuery) {
-                            this.rawQuery[key].values = this.query.query[key];
-                        }
-                    }
-                    else {
-                        this.query.query.forEach((queryItem)=>{
-                            this.rawQuery[queryItem.id].values = queryItem.values.join(',');
-                        })
-                    }
-                }
-            });
-        }
-
-        this.artifactPackageSearchDao.availablePackages().$promise.then((data)=> {
-            data = _.filter(data, (packageType)=> {
-                return !packageType.id.startsWith('docker') && (!this.isOss || packageType.id === "gavc");
-            });
-            if (!this.isOss) {
-                data.unshift({
-                    id: 'dockerV2',
-                    icon: 'docker',
-                    displayName: 'Docker'
-                });
-            }
-            this.availablePackageTypes = data;
-        })
-    }
-
-    onPackageTypeChange() {
-
-        var defer = this.$q.defer();
-
-        this.rawQuery = {};
-        this.$timeout(()=>{
-            this.parentController.filterReposLimitByPackageType(this.selectedPackageType.id);
-            if (this.selectedPackageType.id === 'gavc') {
-                let gavcFields = [
-                    {id: 'groupID', displayName: 'Group ID', allowedComparators: ''},
-                    {id: 'artifactID', displayName: 'Artifact ID', allowedComparators: ''},
-                    {id: 'version', displayName: 'Version', allowedComparators: ''},
-                    {id: 'classifier', displayName: 'Classifier', allowedComparators: ''}
-                ];
-                this.queryFields = gavcFields;
-                this.queryFields.forEach((field)=>{
-                    this.rawQuery[field.id] = {comparator: field.allowedComparators[0]};
-                });
-                defer.resolve();
-            }
-            else {
-                this.artifactPackageSearchDao.queryFields({},{packageType:this.selectedPackageType.id}).$promise.then((data)=>{
-                    if (this.selectedPackageType.id === 'nuget') {
-                        data = _.filter(data,(field)=>{
-                            return field.id !== 'nugetTags' && field.id !== 'nugetDigest';
-                        })
-                    }
-                    this.queryFields = data;
-                    this.queryFields.forEach((field)=>{
-                        this.rawQuery[field.id] = {comparator: field.allowedComparators[0]};
-                    });
-                    defer.resolve();
-                });
-            }
-        });
-
-        return defer.promise;
-    }
-
-    _transformQuery(rawQuery) {
-        let transformed;
-        if (this.selectedPackageType.id === 'gavc') {
-            transformed = {};
-            transformed.search = 'gavc';
-            for (let key in rawQuery) {
-                if (rawQuery[key].values) {
-                    transformed[key] = rawQuery[key].values || '';
-                }
-            }
-            transformed.selectedRepositories = this.query.selectedRepositories;
-        }
-        else {
-            transformed = [];
-            for (let key in rawQuery) {
-                if (rawQuery[key].values) {
-                    if (key !== 'repo') transformed.push({
-                        id: key,
-                        /*
-                         comparator: rawQuery[key].comparator,
-                         */
-                        values: rawQuery[key].values.split(',')
-                    })
-                }
-            }
-            transformed.push({
-                id: 'repo',
-                values: _.pluck(this.query.selectedRepositories, "repoKey")
-            })
-        }
-
-
-
-        return transformed;
-    }
-
-    canSearch() {
-        let ret = false;
-        if (this.rawQuery) {
-            for (let key in this.rawQuery) {
-                if (this.rawQuery[key].values) {
-                    ret = true;
-                    break;
-                }
-            }
-        }
-        return ret;
-    }
-
-    search() {
-
-        let transformedQuery = this._transformQuery(this.rawQuery);
-        let completeQuery = {
-            query: transformedQuery,
-            selectedPackageType: this.selectedPackageType,
-            selectedRepositories: this.query.selectedRepositories,
-            columns: this.getColumnsByPackage()
-        }
-        this.$state.go('.', {
-            'searchType': 'package',
-            'searchParams': {
-                selectedRepos: this.query.selectedRepositories
-            },
-            'params': btoa(JSON.stringify(completeQuery))
-        });
-    }
-    clear() {
-        for (let key in this.rawQuery) {
-            let field = this.rawQuery[key];
-            if (field.values) delete field.values;
-        }
-    }
-    getColumnsByPackage() {
-
-        switch(this.selectedPackageType.id) {
-            case 'gavc':
-                return ['artifact','groupID','artifactID','version','classifier','repo','path','modified'];
-                break;
-            case 'dockerV1':
-                return ['dockerV1Image*Image@','dockerV1Tag*Tag@','repo','modified'];
-                break;
-            case 'dockerV2':
-                return ['dockerV2Image*Image@','dockerV2Tag*Tag@','repo','modified'];
-                break;
-            case 'nuget':
-                return ['nugetPackageId*Package ID','nugetVersion*Version@','repo','path','modified'];
-                break;
-            case 'npm':
-                return ['npmName*Package Name','npmVersion*Version@','npmScope*Scope@','repo','path','modified'];
-                break;
-            case 'bower':
-                return ['bowerName*Package Name','bowerVersion*Version@','repo','path','modified'];
-                break;
-            case 'debian':
-                return ['artifact','repo','path','debianDistribution*Distribution@','debianComponent*Component@','debianArchitecture*Architecture@','modified'];
-                break;
-            case 'pypi':
-                return ['pypiName*Name','pypiVersion*Version@','repo','path','modified'];
-                break;
-            case 'gems':
-                return ['gemName*Name','gemVersion*Version@','repo','path','modified'];
-                break;
-            case 'rpm':
-                return ['rpmName*Name','rpmVersion*Version@','rpmArchitecture*Architecture@','repo','path','modified'];
-                break;
-            case 'vagrant':
-                return ['vagrantName*Box Name','vagrantVersion*Box Version@','vagrantProvider*Box Provider@','repo','path','modified'];
-                break;
-            default:
-                return ['artifact','repo','path','modified'];
-        }
-
-    }
-
-}
-
-export function jfPackage() {
-    return {
-        restrict: 'EA',
-        scope: {
-            query: '=',
-            parentController: '='
-        },
-        controller: jfPackageController,
-        controllerAs: 'jfPackage',
-        bindToController: true,
-        templateUrl: 'directives/jf_search/search_tabs/jf_package.html'
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_property.html b/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_property.html
deleted file mode 100644
index b0b284c..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_property.html
+++ /dev/null
@@ -1,99 +0,0 @@
-<div class="search-wrapper">
-    <jf-switch jf-switch-title="Add:" ng-model="jfProperty.propertyType" options="['Property', 'Property Set']"></jf-switch>
-    <form name="propertyForm">
-        <div ng-switch="jfProperty.propertyType">
-            <div ng-switch-when="Property">
-                <div class="form-group">
-                    <div class="form-group-cell">
-                        <jf-field validations="properties" autofocus="true">
-                            <input type="text" class="input-text" placeholder="Name *"
-                                   name="selectedProperty"
-                                   ng-model="jfProperty.selectedProperty"/>
-                        </jf-field>
-<!--
-                        <div class="field-bottom-remark"><i class="icon icon-info"></i>Search is case sensitive & supports *, ?</div>
--->
-                    </div>
-                    <div class="form-group-cell">
-                        <input type="text" class="input-text" placeholder="Value"
-                               ng-model="jfProperty.selectedPropertyValue"/>
-                    </div>
-                    <div class="form-group-cell auto-width">
-                        <div class="pull-right">
-                            <button type="button" class="btn btn-default"
-                                    ng-click="jfProperty.clearFields()">Clear
-                            </button>
-                            <button class="btn btn-primary" ng-click="jfProperty.addProperty()"
-                                    ng-disabled="!jfProperty.selectedProperty">Add</button>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div ng-switch-when="Property Set">
-                <div class="form-group">
-                    <div class="form-group-cell">
-                        <ui-select jf-disable-ng-animate ng-model="jfProperty.selectedPropertySet"
-                                   ng-change="jfProperty.setPropertySetValues()">
-                            <ui-select-match placeholder="Property Name">{{$select.selected.key}}</ui-select-match>
-                            <ui-select-choices
-                                    repeat="property in jfProperty.propertiesOptions | filter: $select.search track by property.key">
-                                <div ng-bind-html="property.key| highlight: $select.search"></div>
-                            </ui-select-choices>
-                        </ui-select>
-                    </div>
-                    <div class="form-group-cell">
-                        <selectize placeholder='Select Value... '
-                                   config="jfProperty.propertySetMultiValuesConfig"
-                                   options="jfProperty.propertyValuesOptions"
-                                   ng-model="jfProperty.selectedPropertySetValue"
-                                   ng-if="jfProperty.isCurrentPropertyType('MULTI_SELECT')"
-                                   class="multi-selectize">
-                        </selectize>
-                        <selectize placeholder='Select Value...'
-                                   config="jfProperty.propertySetSingleValueConfig"
-                                   options="jfProperty.propertyValuesOptions"
-                                   ng-model="jfProperty.selectedPropertySetValue"
-                                   ng-if="jfProperty.isCurrentPropertyType('SINGLE_SELECT')">
-                        </selectize>
-                        <input type="text"
-                               ng-model="jfProperty.selectedPropertySetValue"
-                               typeahead="state.text for state in jfProperty.propertyValuesOptions | filter:$viewValue | limitTo:8"
-                               class="input-text any-property"
-                               placeholder='Select Value...'
-                               ng-if="jfProperty.isCurrentPropertyType('ANY_VALUE')">
-                    </div>
-                    <div class="form-group-cell auto-width">
-                        <div class="pull-right">
-                            <button type="button" class="btn btn-default"
-                                    ng-click="jfProperty.clearFields()">Clear
-                            </button>
-                            <button class="btn btn-primary" ng-click="jfProperty.addPropertySet()"
-                                    ng-disabled="!jfProperty.selectedPropertySet">Add</button>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </form>
-
-    <div class="form-group no-margin-bottom">
-        <div class="form-group-cell double">
-            <div class="grid-container">
-                <jf-grid grid-options="jfProperty.propertyGridOption"
-                         no-count no-pagination>
-                </jf-grid>
-            </div>
-        </div>
-    </div>
-    <div class="form-group no-margin-bottom">
-        <div class="form-group-cell double">
-            <div class="pull-right">
-                <button type="submit"
-                        class="btn btn-primary"
-                        ng-disabled="jfProperty.gridItems.length===0"
-                        ng-click="jfProperty.search()">Search
-                </button>
-            </div>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_property.js b/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_property.js
deleted file mode 100644
index c32b934..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_property.js
+++ /dev/null
@@ -1,204 +0,0 @@
-import EVENTS     from '../../../constants/artifacts_events.constants';
-import KEYS       from '../../../constants/keys.constants';
-import TOOLTIP    from '../../../constants/artifact_tooltip.constant';
-
-class jfPropertyController {
-
-    constructor($scope, $compile, $state,$stateParams, ArtifactoryEventBus, ArtifactSearchDao, ArtifactoryGridFactory, ArtifactoryFeatures) {
-        this.artifactSearchDao = ArtifactSearchDao;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.$state = $state;
-        this.$scope = $scope;
-        this.propertyTypeKeys = KEYS.PROPERTY_TYPE;
-        this.propertyGridOption = {};
-        this.gridItems = this.query.properties || [];
-        this.propertyType = ($stateParams.searchParams && $stateParams.searchParams.propertyType) ? $stateParams.searchParams.propertyType : 'Property';
-        this.propertiesOptions = [];
-        this.propertyValuesOptions = [];
-        this.query.search = "property";
-        this.propertySetMultiValuesConfig = {
-            sortField: 'text',
-            maxItems: null,
-            plugins: ['remove_button']
-        };
-        this.propertySetSingleValueConfig = {
-            sortField: 'text',
-            maxItems: 1
-        };
-        this.TOOLTIP = TOOLTIP.artifacts.search.propertySearch;
-
-        // If we're not allowed to see the property search:
-        if (ArtifactoryFeatures.isDisabled('properties')) {
-            $state.go('.', {searchType: 'quick'});
-            return;
-        }
-
-        this.getProperties();
-
-        this._createGrid();
-    }
-
-    _createGrid() {
-        this.propertyGridOption = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setColumns(this._getCloumns())
-                .setRowTemplate('default')
-                .setGridData( this.gridItems || [])
-                .setButtons(this._getActions())
-    }
-
-    _getActions() {
-        return [
-            {
-                icon: 'icon icon-clear',
-                tooltip: 'Delete',
-                callback: row => this.deleteSingleProperty(row, false)
-            }
-        ];
-    }
-
-    deleteSingleProperty(row) {
-        _.remove(this.gridItems, {key: row.key, values: row.values});
-        this.propertyGridOption.setGridData(this.gridItems);
-    }
-
-    addPropertySet() {
-        let values = [];
-        if (!_.isArray(this.selectedPropertySetValue)) {
-            values.push(this.selectedPropertySetValue);
-        }
-
-        this.gridItems.push({
-            key: this.selectedPropertySet.key,
-            values: _.isArray(this.selectedPropertySetValue) ? this.selectedPropertySetValue : values
-        });
-
-        this.propertyGridOption.setGridData(this.gridItems);
-        this.selectedPropertySetValue = '';
-        this.selectedPropertySet = '';
-
-    }
-
-    addProperty() {
-        let values = [];
-        values.push(this.selectedPropertyValue);
-        this.gridItems.push({
-            key: this.selectedProperty,
-            values: values
-        });
-
-        this.propertyGridOption.setGridData(this.gridItems);
-
-        this.selectedPropertyValue = '';
-        this.selectedProperty = '';
-    }
-
-
-    getProperties() {
-        this.artifactSearchDao.get({search: "property", action: "keyvalue"}).$promise.then((_propeties)=> {
-            this.propertiesOptions = _propeties.data;
-        });
-    }
-
-    clearFields() {
-        if (this.propertyType == 'Property') {
-            this.selectedPropertyValue = '';
-            this.selectedProperty = '';
-        }
-        else {
-            this.selectedPropertySetValue = '';
-            this.selectedPropertySet = '';
-        }
-    }
-
-    isCurrentPropertyType(type) {
-        if (!this.selectedPropertySet && type === 'ANY_VALUE') {
-            return true;
-        }
-        else if (this.selectedPropertySet) {
-
-            return this.propertyTypeKeys[this.selectedPropertySet.propertyType] === this.propertyTypeKeys[type]
-        }
-    }
-
-    setPropertySetValues() {
-
-        let self = this;
-        let propertyValues = [];
-        self.propertyValuesOptions = [];
-        this.propertiesOptions.forEach((property)=> {
-            if (property === self.selectedPropertySet) {
-                property.values.forEach((value)=> {
-                    propertyValues.push({text: value, value: value});
-                });
-                self.propertyValuesOptions = propertyValues;
-            }
-        });
-    }
-
-    _getBatchActions() {
-        return [
-            {
-                icon: 'clear',
-                name: 'Delete',
-                callback: () => this.deleteSelectedProperties(false)
-            }
-        ]
-    }
-
-    deleteSelectedProperties() {
-        let selectedProperties = this.propertyGridOption.api.selection.getSelectedRows();
-        selectedProperties.forEach((property)=> {
-            _.remove(this.gridItems, {key: property.key, values: property.values});
-        });
-        this.propertyGridOption.setGridData(this.gridItems);
-    }
-
-    search() {
-
-        this.query.search = "property";
-        this.query.properties = this.gridItems;
-        this.$state.go('.', {
-            'searchType': "property",
-            'searchParams': {
-                propertyType: this.propertyType,
-                selectedRepos: this.query.selectedRepositories
-            },
-            'params': btoa(JSON.stringify(this.query))
-        });
-
-
-    }
-
-    _getCloumns() {
-        let cellTemplate = '<div class="item" ng-if="row.entity.values.length>1" ng-repeat="col in row.entity.values track by $index">{{col}}</div>' +
-                '<div class="ui-grid-cell-contents" ng-if="row.entity.values.length==1" >{{row.entity.values[0]}}</div>';
-        return [{
-            name: 'Property',
-            displayName: 'Property',
-            field: 'key'
-        },
-            {
-                name: 'Value(s)',
-                displayName: 'Value(s)',
-                cellTemplate: cellTemplate,
-                field: 'values'
-
-            }
-        ]
-    }
-
-}
-
-export function jfProperty() {
-    return {
-        scope: {
-            query: '='
-        },
-        restrict: 'EA',
-        controller: jfPropertyController,
-        controllerAs: 'jfProperty',
-        bindToController: true,
-        templateUrl: 'directives/jf_search/search_tabs/jf_property.html'
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_quick.html b/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_quick.html
deleted file mode 100644
index 0c0404d..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_quick.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<div class="search-wrapper">
-    <form novalidate>
-        <div class="form-group no-margin-bottom">
-            <div class="form-group-cell">
-                <jf-field  autofocus="true">
-                    <input type="text"
-                           class="input-text"
-                           id="quick"
-                           name="query"
-                           placeholder="Enter Value"
-                           ng-model="jfQuick.query.query"/>
-                </jf-field>
-<!--
-                <div class="field-bottom-remark"><i class="icon icon-info"></i>Search is case sensitive & supports *, ?</div>
--->
-            </div>
-            <div class="form-group-cell">
-                <button type="submit"
-                        class="btn btn-primary"
-                        ng-disabled="!jfQuick.query.query"
-                        ng-click="jfQuick.search()">Search
-                </button>
-            </div>
-        </div>
-    </form>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_quick.js b/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_quick.js
deleted file mode 100644
index 07cc44f..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_quick.js
+++ /dev/null
@@ -1,36 +0,0 @@
-import EVENTS   from '../../../constants/artifacts_events.constants';
-import TOOLTIP  from '../../../constants/artifact_tooltip.constant';
-
-class jfQuickController {
-    constructor($scope, $state, ArtifactoryEventBus) {
-
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.$state = $state;
-        this.TOOLTIP = TOOLTIP.artifacts.search.quickSearch;
-    }
-
-    search() {
-        this.query.search = "quick";
-        this.$state.go('.', {
-            'searchType': this.query.search,
-            'searchParams': {
-                selectedRepos: this.query.selectedRepositories
-            },
-            'params': btoa(JSON.stringify(this.query))
-        });
-    }
-
-}
-
-export function jfQuick() {
-    return {
-        scope: {
-            query: '='
-        },
-        restrict: 'EA',
-        controller: jfQuickController,
-        controllerAs: 'jfQuick',
-        bindToController: true,
-        templateUrl: 'directives/jf_search/search_tabs/jf_quick.html'
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_remote.html b/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_remote.html
deleted file mode 100644
index 44e41f6..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_remote.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<div class="search-wrapper">
-    <div class="form-group">
-        <h2>Search in Bintray <a href="https://bintray.com/bintray/jcenter" target="_blank">JCenter</a></h2>
-        <p>
-            Bintray's JCenter Maven repository offers the biggest collection around for open source java libraries.<br>
-            Find all your jar dependencies under a single, reliable source and auto-resolve them from the fast JCenter remote repository.
-        </p>
-        <div class="alert alert-warning" ng-if="!jfRemote.isJcenterExists">
-            <p>A remote JCenter repository is not configured in artifactory, you will not be able to perform remote searches.</p>
-            <p ng-if="jfRemote.user.isAdmin()">Would you like Artifactory to automatically <a href="" ng-click="jfRemote.createJcenter()">create it?</a></p>
-        </div>
-    </div>
-
-    <form novalidate>
-        <div class="form-group no-margin-bottom">
-            <div class="form-group-cell">
-                <jf-field autofocus="true">
-                    <input type="text"
-                           class="input-text"
-                           id="remote"
-                           name="searchKey"
-                           min-length="3"
-                           ng-disabled="!jfRemote.isJcenterExists"
-                           required
-                           ng-model="jfRemote.query.searchKey"
-                           placeholder="Search for"/>
-                </jf-field>
-                <div class="field-bottom-remark"><i class="icon icon-info"></i>Search is case sensitive & supports *, ?</div>
-            </div>
-            <div class="form-group-cell">
-                <button type="submit"
-                        class="btn btn-primary"
-                        ng-disabled="!jfRemote.query.searchKey"
-                        ng-click="jfRemote.search()">Search
-                </button>
-            </div>
-        </div>
-    </form>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_remote.js b/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_remote.js
deleted file mode 100644
index f28a585..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_remote.js
+++ /dev/null
@@ -1,62 +0,0 @@
-import EVENTS   from '../../../constants/artifacts_events.constants';
-import TOOLTIP  from '../../../constants/artifact_tooltip.constant';
-
-class jfRemoteController {
-    constructor($state, ArtifactoryEventBus, RepositoriesDao, ArtifactoryNotifications, User, ArtifactoryModal) {
-
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.$state = $state;
-        this.TOOLTIP = TOOLTIP.artifacts.search.remoteSearch;
-        this.repositoriesDao = RepositoriesDao;
-        this.notifications = ArtifactoryNotifications;
-        this.modal = ArtifactoryModal;
-        this.user = User.getCurrent();
-        this.isJcenterExists = true;
-        this.jcenterExists();
-    }
-
-    search() {
-        this.query.search='remote';
-
-        this.$state.go('.', {
-            'searchType': this.query.search,
-            'searchParams': {
-                selectedRepos: this.query.selectedRepositories
-            },
-            'params': btoa(JSON.stringify(this.query))
-        });
-    }
-
-    jcenterExists() {
-        this.repositoriesDao.isJcenterRepoConfigured().$promise
-        .then(() => this.isJcenterExists = true, () => this.isJcenterExists = false);
-    }
-
-    createJcenter() {
-        if(!this.user.isAdmin()) {
-            this.notifications.create({warn: 'Only an admin user can create repositories.'});
-            return false;
-        }
-        this.modal.confirm('A remote repository pointing to JCenter with default configuration values is about to be created.<br/>' +
-                'If you wish to change it\'s configuration you can do so from the Remote Repositories menu in the Admin section',
-                'Creating JCenter remote repository')
-                .then(()=> {
-                    this.repositoriesDao.createDefaultJcenterRepo().$promise
-                            .then(() => this.isJcenterExists = true , () => '');
-                }
-        );
-    }
-}
-
-export function jfRemote() {
-    return {
-        restrict: 'EA',
-        scope: {
-            query: '='
-        },
-        controller: jfRemoteController,
-        controllerAs: 'jfRemote',
-        bindToController: true,
-        templateUrl: 'directives/jf_search/search_tabs/jf_remote.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_trash.html b/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_trash.html
deleted file mode 100644
index 7cb3583..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_trash.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<div class="search-wrapper">
-    <jf-switch jf-switch-title="Search Type:" ng-model="jfTrash.selectedMode" options="['Quick', 'Checksum']"></jf-switch>
-    <form novalidate>
-        <div class="form-group no-margin-bottom">
-            <div class="form-group-cell">
-                <jf-field  autofocus="true">
-                    <input type="text"
-                           class="input-text"
-                           id="quick"
-                           name="query"
-                           placeholder="Enter Value"
-                           ng-model="jfTrash.query.query"/>
-                </jf-field>
-                <div class="field-bottom-remark"><i class="icon icon-info"></i>Search is case sensitive & supports *, ?</div>
-            </div>
-            <div class="form-group-cell">
-                <button type="submit"
-                        class="btn btn-primary"
-                        ng-disabled="!jfTrash.query.query"
-                        ng-click="jfTrash.search()">Search
-                </button>
-            </div>
-        </div>
-    </form>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_trash.js b/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_trash.js
deleted file mode 100644
index 7b41be5..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/jf_trash.js
+++ /dev/null
@@ -1,38 +0,0 @@
-import EVENTS   from '../../../constants/artifacts_events.constants';
-import TOOLTIP  from '../../../constants/artifact_tooltip.constant';
-
-class jfTrashController {
-    constructor($scope, $state, ArtifactoryEventBus) {
-
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.$state = $state;
-        this.TOOLTIP = TOOLTIP.artifacts.search.trashSearch;
-        this.selectedMode = this.query.isChecksum ? 'Checksum' : 'Quick';
-    }
-
-    search() {
-        this.query.isChecksum = this.selectedMode === 'Checksum';
-        this.query.search = "trash";
-        this.$state.go('.', {
-            'searchType': this.query.search,
-            'searchParams': {
-                selectedRepos: this.query.selectedRepositories
-            },
-            'params': btoa(JSON.stringify(this.query))
-        });
-    }
-
-}
-
-export function jfTrash() {
-    return {
-        scope: {
-            query: '='
-        },
-        restrict: 'EA',
-        controller: jfTrashController,
-        controllerAs: 'jfTrash',
-        bindToController: true,
-        templateUrl: 'directives/jf_search/search_tabs/jf_trash.html'
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/search_tabs.module.js b/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/search_tabs.module.js
deleted file mode 100644
index 464a2a2..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_search/search_tabs/search_tabs.module.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import {jfQuick}    from './jf_quick'
-import {jfClass}    from './jf_class'
-import {jfPackage}  from './jf_package'
-/*
-import {jfGavc}     from './jf_gavc'
-*/
-import {jfProperty} from './jf_property'
-import {jfChecksum} from './jf_checksum'
-import {jfRemote}   from './jf_remote'
-import {jfTrash}    from './jf_trash'
-
-export default angular.module('searchTabs', [])
-        .directive({
-            'jfQuick': jfQuick,
-            'jfClass': jfClass,
-            'jfPackage': jfPackage,
-/*
-            'jfGavc' : jfGavc,
-*/
-            'jfProperty':jfProperty,
-            'jfChecksum': jfChecksum,
-            'jfRemote':jfRemote,
-            'jfTrash': jfTrash
-        })
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_sidebar/jf_sidebar.html b/web/angular-web/src/main/webapp/app/directives/jf_sidebar/jf_sidebar.html
deleted file mode 100644
index 0a8eec5..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_sidebar/jf_sidebar.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<div id="sidebar-wrapper" class="sidebar-wrapper no-animate" ng-class="{overflown : jfSidebar.isAdminOpen}">
-    <div class="mp-pusher mp-pushed" id="mp-pusher">
-
-        <!-- mp-menu -->
-        <nav id="mp-menu" class="mp-menu">
-            <div class="mp-level mp-level-open">
-                <ul class="nav-pills nav-stacked sidebar-list">
-                    <li ng-repeat="item in jfSidebar.menuItems"
-                        class="icon icon-arrow-left"
-                        ng-click="jfSidebar.setCurrentTab(item)"
-                        ng-class="{disabled: item.isDisabled, active: (item.stateParent | includedByState), 'icon-arrow-left':item.children }">
-
-                        <a ng-if="item.isDisabled"
-                           disabled="true"
-                           ng-class="item.icon"
-                           id="{{item.id}}">{{item.label}}</a>
-                        <a ng-click="jfSidebar.goToState(item)"
-                           ng-class="item.icon"
-                           id="{{item.id}}"
-                           href=""
-                           ng-if="!item.isDisabled">{{item.label}}</a>
-
-                        <div class="mp-level" ng-class="{'mp-level-open': jfSidebar.isAdminOpen}"
-                             ng-if="item.children && !item.isDisabled">
-                            <div class="header-subitem" ng-click="jfSidebar.goBack()">
-                                <a>{{item.label}}</a>
-                            </div>
-                            <div class="header-subitem back-button">
-                                <a class="mp-back" ng-click="jfSidebar.goBack()">Back to Main</a>
-                            </div>
-                            <jf-accordion items="jfSidebar.adminMenuItems"></jf-accordion>
-                        </div>
-                    </li>
-                </ul>
-            </div>
-
-        </nav>
-    </div>
-
-    <div class="jf-footer"
-         ng-if="!jfSidebar.isAdminOpen">
-        <div class="text-center">
-            <div class="icon-jfrog-logo"></div>
-        </div>
-        <div class="wrapper-footer-data">
-            <div class="footer-version">
-                {{jfSidebar.footerData.versionInfo}}
-                <div> {{jfSidebar.footerData.buildNumber}}</div>
-            </div>
-            <div class="footer-server-id">{{jfSidebar.footerData.serverId}}</div>
-            <div class="footer-licenses">{{jfSidebar.footerData.licenseInfo}}</div>
-            <div class="footer-copyright">{{jfSidebar.footerData.copyRights}}</div>
-        </div>
-    </div>
-
-</div>
-
-
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_sidebar/jf_sidebar.js b/web/angular-web/src/main/webapp/app/directives/jf_sidebar/jf_sidebar.js
deleted file mode 100644
index 7992092..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_sidebar/jf_sidebar.js
+++ /dev/null
@@ -1,158 +0,0 @@
-import {mlPushMenu} from './mlpushmenu';
-import EVENTS from '../../constants/artifacts_events.constants';
-
-class jfSidebarController {
-
-    constructor(FooterDao, AdminMenuItems, $state, User, $timeout, $rootScope, ArtifactoryEventBus, $scope, ArtifactoryFeatures, ArtifactoryStorage) {
-        this.currentTab = "Home";
-        this.$state = $state;
-        this.$timeout = $timeout;
-        this.setSideBarState();
-        this.originalAdminMenuItems = AdminMenuItems;
-        this.adminMenuItems = [];
-        this.user = User.getCurrent();
-        this.ArtifactoryEventBus = ArtifactoryEventBus;
-        this.features = ArtifactoryFeatures;
-        this.storage = ArtifactoryStorage;
-        this.footerDao = FooterDao;
-
-        User.whenLoadedFromServer.then(this._onUserLoaded.bind(this));
-        ArtifactoryEventBus.registerOnScope($scope, EVENTS.USER_CHANGED, this._onUserLoaded.bind(this));
-        ArtifactoryEventBus.registerOnScope($scope, EVENTS.FOOTER_REFRESH, ()=> {
-            this.getFooterData(true);
-        });
-
-        $rootScope.$on('$stateChangeSuccess', () => this.setSideBarState());
-        this.getFooterData();
-    }
-
-    getFooterData(force) {
-        this.footerDao.get(force).then(footerData => this.footerData = footerData);
-    }
-
-    setSideBarState() {
-        this.isAdminOpen = _.includes(this.$state.current.name, 'admin');
-        if (!this.isAdminOpen) {
-            this.$timeout(() => {
-                $('#sidebar-wrapper').scrollTop(0);
-            });
-        }
-    }
-
-    isCurrentTab(tab) {
-        return this.currentTab === tab.label;
-    }
-
-    goBack(state) {
-        let prevState = this.storage.getItem('stateBeforeAdmin');
-        if (prevState) {
-            this.$state.go(prevState.name, prevState.params);
-        }
-        else {
-            this.$state.go('home');
-        }
-
-        document.getElementById('sidebar-wrapper').scrollTop = 0;
-    }
-
-    setCurrentTab(tab) {
-        this.currentTab === tab.label ? this.currentTab = '' : this.currentTab = tab.label;
-    }
-
-    _onUserLoaded(AdminMenuItems) {
-        this.menuItems = this._getMenuItems();
-        this._fixAdminMenuItems();
-        this.$timeout(() => {
-            let mpMenuElem = document.getElementById('mp-menu');
-            if (mpMenuElem) new mlPushMenu(mpMenuElem, {
-                type: 'cover'
-            });
-        });
-    }
-
-    goToState(item) {
-/*
-        if (item.state === 'artifacts.browsers.path') {
-            this.ArtifactoryEventBus.dispatch(EVENTS.CLEAR_SEARCH);
-        }
-*/
-        // Fix browser param according to user preference
-        if (item.stateParams && item.stateParams.browser) {
-            let storedBrowser = this.storage.getItem('BROWSER');
-            item.stateParams.browser = storedBrowser || 'tree';
-            item.stateParams.tab = storedBrowser === 'stash' ? 'StashInfo' : 'General';
-        }
-
-        // If we're going into admin - save the state
-        if (item.state == 'admin' && this.$state.current.name.indexOf('admin') === -1 && !_.contains(['not_found_404','forbidden_403'],this.$state.current.name)) {
-            this.storage.setItem('stateBeforeAdmin', {name: this.$state.current.name, params: this.$state.params});
-        }
-
-        this.$state.go(item.state, item.stateParams);
-    }
-
-    _getMenuItems() {
-        return [
-            {
-                label: 'Home',
-                stateParent: "home",
-                state: "home",
-                icon: 'icon icon-home',
-                selected: true
-            },
-            {
-                label: 'Artifacts',
-                state: "artifacts.browsers.path",
-                stateParent: "artifacts",
-                stateParams: {tab: 'General', artifact: '', browser: 'tree'},
-                icon: 'icon icon-artifacts',
-                isDisabled: !this.user.canView('artifacts'),
-                selected: false
-            },
-            {
-                label: 'Builds',
-                stateParent: "builds",
-                state: "builds.all",
-                icon: 'icon icon-builds',
-                selected: false,
-                isDisabled: !this.user.canView("builds")
-            },
-            {
-                label: 'Admin',
-                icon: 'icon icon-admin',
-                id: 'admin',
-                stateParent: "admin",
-                state: 'admin',
-                selected: false,
-                children: true,
-                isDisabled: !this.user.getCanManage()
-            }
-        ]
-    }
-    _fixAdminMenuItems() {
-        angular.copy(this.originalAdminMenuItems, this.adminMenuItems);
-        this.adminMenuItems.forEach((item) => {
-            item.isDisabled = true;
-             // if all subitems are hidden then hide item
-            item.isHidden = _.every(item.subItems, (subitem) => this.features.isHidden(subitem.feature));
-            item.subItems.forEach((subitem) => {
-                if (!this.user.canView(subitem.state) ||
-                    this.features.isDisabled(subitem.feature))
-                {
-                    subitem.isDisabled = true;
-                }
-                else { // if one subitem is enabled then item is enabled
-                    item.isDisabled = false;
-                }
-            });
-        });
-    }
-}
-
-export function jfSidebar() {
-    return {
-        controller: jfSidebarController,
-        controllerAs: 'jfSidebar',
-        templateUrl: 'directives/jf_sidebar/jf_sidebar.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_sidebar/mlpushmenu.js b/web/angular-web/src/main/webapp/app/directives/jf_sidebar/mlpushmenu.js
deleted file mode 100644
index 148d6c1..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_sidebar/mlpushmenu.js
+++ /dev/null
@@ -1,239 +0,0 @@
-function extend(a, b) {
-    for (var key in b) {
-        if (b.hasOwnProperty(key)) {
-            a[key] = b[key];
-        }
-    }
-    return a;
-}
-
-// taken from https://github.com/inuyaksa/jquery.nicescroll/blob/master/jquery.nicescroll.js
-function hasParent(e, id) {
-    if (!e) {
-        return false;
-    }
-    var el = e.target || e.srcElement || e || false;
-    while (el && el.id != id) {
-        el = el.parentNode || false;
-    }
-    return (el !== false);
-}
-
-// returns the depth of the element "e" relative to element with id=id
-// for this calculation only parents with classname = waypoint are considered
-function getLevelDepth(e, id, waypoint, cnt) {
-    cnt = cnt || 0;
-    if (e.id.indexOf(id) >= 0) {
-        return cnt;
-    }
-    if ($(e).hasClass(waypoint)) {
-        ++cnt;
-    }
-    return e.parentNode && getLevelDepth(e.parentNode, id, waypoint, cnt);
-}
-
-// http://coveroverflow.com/a/11381730/989439
-function mobilecheck() {
-    var check = false;
-    (function (a) {
-        if (/(android|ipad|playbook|silk|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au( [...]
-                        4))) {
-            check = true
-        }
-    })(navigator.userAgent || navigator.vendor || window.opera);
-    return check;
-}
-
-// returns the closest element to 'e' that has class "classname"
-function closest(e, classname) {
-    if ($(e).hasClass(classname)) {
-        return e;
-    }
-    return e.parentNode && closest(e.parentNode, classname);
-}
-
-export class mlPushMenu {
-    constructor(el,  options) {
-        this.el = el;
-
-        this.defaults = {
-            // overlap: there will be a gap between open levels
-            // cover: the open levels will be on top of any previous open level
-            type: 'cover', // overlap || cover
-            // space between each overlaped level
-            levelSpacing: 40,
-            // classname for the element (if any) that when clicked closes the current level
-            backClass: 'mp-back'
-        };
-        this.options = extend(this.defaults, options);
-        // support 3d transforms
-            this._init();
-    }
-
-
-    _init() {
-        // if menu is open or not
-        this.open = true;
-        // level depth
-        this.level = 1;
-        // the moving wrapper
-        this.wrapper = document.getElementById('mp-pusher');
-        // the mp-level elements
-        this.levels = Array.prototype.slice.call(this.el.querySelectorAll('div.mp-level'));
-        // save the depth of each of these mp-level elements
-        var self = this;
-        this.levels.forEach(function (el, i) {
-            el.setAttribute('data-level', getLevelDepth(el, self.el.id, 'mp-level'));
-        });
-        // the menu items
-        this.menuItems = Array.prototype.slice.call(this.el.querySelectorAll('li'));
-        // if type == "cover" these will serve as hooks to move back to the previous level
-        this.levelBack = Array.prototype.slice.call(this.el.querySelectorAll('.' + this.options.backClass));
-        // event type (if mobile use touch events)
-        this.eventtype = mobilecheck() ? 'touchstart' : 'click';
-        // add the class mp-overlap or mp-cover to the main element depending on options.type
-        $(this.el).addClass('mp-' + this.options.type);
-        // initialize / bind the necessary events
-
-        var levelFactor = ( this.level - 1 ) * this.options.levelSpacing,
-                translateVal = this.options.type === 'overlap' ? this.el.offsetWidth + levelFactor :
-                        this.el.offsetWidth;
-
-        this._setTransform('translate3d(' + translateVal + 'px,0,0)');
-
-        setTimeout(function () {
-            $('.sidebar-wrapper').removeClass('no-animate');
-        }, 100);
-
-
-        this._initEvents();
-    }
-
-    _initEvents() {
-        var self = this;
-
-        // the menu should close if clicking somewhere on the body
-        var bodyClickFn = function (el) {
-            self._resetMenu();
-            el.removeEventListener(self.eventtype, bodyClickFn);
-        };
-
-
-        // opening a sub level menu
-        this.menuItems.forEach(function (el, i) {
-            // check if it has a sub level
-            var subLevel = el.querySelector('div.mp-level');
-            if (subLevel) {
-                el.querySelector('a').addEventListener(self.eventtype, function (ev) {
-                  // ev.preventDefault();
-                    var level = closest(el, 'mp-level').getAttribute('data-level');
-                    if (self.level <= level) {
-                        ev.stopPropagation();
-                        $(el).addClass(closest(el, 'mp-level'), 'mp-level-overlay');
-                        self._openMenu(subLevel);
-                    }
-                });
-            }
-        });
-
-        // closing the sub levels :
-        // by clicking on the visible part of the level element
-        this.levels.forEach(function (el, i) {
-            el.addEventListener(self.eventtype, function (ev) {
-                ev.stopPropagation();
-                var level = el.getAttribute('data-level');
-                if (self.level > level) {
-                    self.level = level;
-                    self._closeMenu();
-                }
-            });
-        });
-
-        // by clicking on a specific element
-        this.levelBack.forEach(function (el, i) {
-            el.addEventListener(self.eventtype, function (ev) {
-              //  ev.preventDefault();
-                var level = closest(el, 'mp-level').getAttribute('data-level');
-                if (self.level <= level) {
-                    ev.stopPropagation();
-                    self.level = closest(el, 'mp-level').getAttribute('data-level') - 1;
-                    self.level === 0 ? self._resetMenu() : self._closeMenu();
-                }
-            });
-        });
-    }
-
-    _openMenu(subLevel) {
-        // increment level depth
-        ++this.level;
-
-        // move the main wrapper
-        var levelFactor = ( this.level - 1 ) * this.options.levelSpacing,
-                translateVal = this.options.type === 'overlap' ? this.el.offsetWidth + levelFactor :
-                        this.el.offsetWidth;
-
-        this._setTransform('translate3d(' + translateVal + 'px,0,0)');
-
-        if (subLevel) {
-            // reset transform for sublevel
-            this._setTransform('', subLevel);
-            // need to reset the translate value for the level menus that have the same level depth and are not open
-            for (var i = 0, len = this.levels.length; i < len; ++i) {
-                var levelEl = this.levels[i];
-                if (levelEl != subLevel && ! $(levelEl).hasClass('mp-level-open')) {
-                    this._setTransform('translate3d(-100%,0,0) translate3d(' + -1 * levelFactor + 'px,0,0)', levelEl);
-                }
-            }
-        }
-        // add class mp-pushed to main wrapper if opening the first time
-        if (this.level === 1) {
-            $(this.wrapper).addClass( 'mp-pushed');
-            this.open = true;
-        }
-        // add class mp-level-open to the opening level element
-        // $(subLevel || this.levels[0]).addClass( 'mp-level-open');
-        $('.footer').hide();
-    }
-
-    // close the menu
-    _resetMenu() {
-        this._setTransform('translate3d(0,0,0)');
-        this.level = 0;
-        // remove class mp-pushed from main wrapper
-        $(this.wrapper).removeClass( 'mp-pushed');
-        this._toggleLevels();
-        this.open = false;
-    }
-
-    // close sub menus
-    _closeMenu() {
-        var translateVal = this.options.type === 'overlap' ?
-        this.el.offsetWidth + ( this.level - 1 ) * this.options.levelSpacing : this.el.offsetWidth;
-        this._setTransform('translate3d(' + translateVal + 'px,0,0)');
-        this._toggleLevels();
-    }
-
-    // translate the el
-    _setTransform(val, el) {
-        el = el || this.wrapper;
-        el.style.WebkitTransform = val;
-        el.style.MozTransform = val;
-        el.style.transform = val;
-    }
-
-    // removes classes mp-level-open from closing levels
-    _toggleLevels() {
-        for (var i = 0, len = this.levels.length; i < len; ++i) {
-            var levelEl = this.levels[i];
-            if (levelEl.getAttribute('data-level') >= this.level + 1) {
-                // $(levelEl).removeClass('mp-level-open');
-                $('.footer').show();
-                $(levelEl).removeClass('mp-level-overlay');
-            }
-            else if (Number(levelEl.getAttribute('data-level')) == this.level) {
-                $(levelEl).removeClass('mp-level-overlay');
-            }
-        }
-    }
-}
-
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_special_chars/jf_special_chars.js b/web/angular-web/src/main/webapp/app/directives/jf_special_chars/jf_special_chars.js
deleted file mode 100644
index cea523e..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_special_chars/jf_special_chars.js
+++ /dev/null
@@ -1,28 +0,0 @@
-export function jfSpecialChars() {
-    return {
-        restrict: 'A',
-        require: 'ngModel',
-        link: function jfSpecialCharsLink(scope, element, attrs, ngModel) {
-
-            let disallowedSymbols = [ '/', '\\', '<', '>', '~', '!', '@', '#', '$',
-                                    '%', '^', '&', '(', ')', '+', '=', '-', '{', '}',
-                                    '[', ']', ';', ',', '`', ',', ' '];
-
-            ngModel.$validators.validCharacters = function(modelValue, viewValue) {
-                let value = modelValue || viewValue;
-                if (!value) {
-                    return true;
-                }
-                value = value.split('');
-                let valid = true;
-
-                for (let i = 0, limit = value.length; i < limit; i++) {
-                    if (disallowedSymbols.indexOf(value[i]) > -1) {
-                                valid = false;
-                    }
-                }
-                return valid;
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_spinner/jf_spinner.html b/web/angular-web/src/main/webapp/app/directives/jf_spinner/jf_spinner.html
deleted file mode 100644
index 0e9e401..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_spinner/jf_spinner.html
+++ /dev/null
@@ -1,8 +0,0 @@
-<div ng-class="{'jf-spinner':jfSpinner.domain === 'body' || jfSpinner.domain === 'content', 'jf-spinner-local': jfSpinner.domain !== 'body' && jfSpinner.domain !== 'content'}" ng-if="jfSpinner.show">
-    <div class="spinner-msg" ng-if="jfSpinner.domain === 'body' || jfSpinner.domain === 'content'">
-        <div class="icon-hourglass"></div>
-    </div>
-    <div class="spinner-msg-local" ng-if="jfSpinner.domain !== 'body' && jfSpinner.domain !== 'content'">
-        <div class="icon-hourglass-local"></div>
-    </div>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_spinner/jf_spinner.js b/web/angular-web/src/main/webapp/app/directives/jf_spinner/jf_spinner.js
deleted file mode 100644
index c07e725..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_spinner/jf_spinner.js
+++ /dev/null
@@ -1,57 +0,0 @@
-import EVENTS from '../../constants/artifacts_events.constants';
-class jfSpinnerController {
-
-    constructor($scope, $state, ArtifactoryEventBus,$element) {
-        this.$scope = $scope;
-        this.$state = $state;
-        this.$element = $element;
-        this.show = false;
-        this.count = 0;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.intervalPromise = null;
-
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.SHOW_SPINNER, (domain) => {
-            this.showSpinner(domain);
-        });
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.HIDE_SPINNER, () => this.hideSpinner());
-
-    }
-
-    showSpinner(domain) {
-        if ((!domain && this.domain === 'body' && this.$state.current.name === 'login') || (!domain && this.domain === 'content' && this.$state.current.name !== 'login') || (this.domain === domain) ) {
-
-            this.count++;
-            this.show = true;
-//            console.log(this.count,'show')
-        }
-    }
-
-    hideSpinner() {
-        this.count--;
-        if (this.count<0) this.count = 0;
-//        console.log(this.count)
-        if (this.count === 0) {
-//            console.log('hide')
-            this.show = false;
-        }
-    }
-
-
-}
-
-export function jfSpinner() {
-
-    return {
-        restrict: 'E',
-        scope: {
-            domain: '@'
-        },
-/*
-        replace: true,
-*/
-        controller: jfSpinnerController,
-        controllerAs: 'jfSpinner',
-        templateUrl: 'directives/jf_spinner/jf_spinner.html',
-        bindToController: true
-    };
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_switch/jf_switch.html b/web/angular-web/src/main/webapp/app/directives/jf_switch/jf_switch.html
deleted file mode 100644
index b1e21ae..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_switch/jf_switch.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<div class="jf-switch">
-    <span ng-if="jfSwitch.jfSwitchTitle" class="jf-switch-title">{{jfSwitch.jfSwitchTitle}}</span>
-    <jf-help-tooltip ng-if="jfSwitch.helpTooltip"
-                     html="jfSwitch.helpTooltip"></jf-help-tooltip>
-    <ul class="jf-switch-options">
-        <li ng-repeat="option in jfSwitch.optionObjects">
-            <a class="jf-switch-option"
-               href=""
-               ng-click="jfSwitch.selectOption(option)"
-               ng-class="{active: jfSwitch.isSelected(option), disabled: jfSwitch.disabled}">{{option.text}}</a>
-        </li>
-    </ul>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_switch/jf_switch.js b/web/angular-web/src/main/webapp/app/directives/jf_switch/jf_switch.js
deleted file mode 100644
index 0eb5906..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_switch/jf_switch.js
+++ /dev/null
@@ -1,56 +0,0 @@
-class jfSwitchController {
-    constructor() {
-        if (!this.options) throw 'Must supply options';
-        // Supports 2 methods of options:
-        // array of strings
-        // array of objects of type {'value': ..., 'text': ...}
-        // The model is assigned the value, and the text is displayed
-
-        this.controller = this;
-
-        this.updateOptionObjects();
-
-        if (_.isEmpty(this.ngModel))
-            this.ngModel = this.optionObjects[0].value;
-    }
-
-    updateOptionObjects() {
-        this.optionObjects = this.options.map((option) => {
-            if (typeof(option) === 'string')
-                return {value: option, text: option};
-            else
-                return option;
-        });
-    }
-
-    selectOption(option) {
-        if (this.disabled) return;
-        this.ngModelCtrl.$setViewValue(option.value);
-    }
-
-    isSelected(option) {
-        return this.ngModel === option.value;
-    }
-}
-
-export function jfSwitch() {
-    return {
-        restrict: 'E',
-        require: 'ngModel',
-        scope: {
-            jfSwitchTitle: '@',
-            options: '=',
-            ngModel: '=',
-            controller: '=',
-            disabled: '=ngDisabled',
-            helpTooltip: '='
-        },
-        link: ($scope, attrs, $element, ngModelCtrl) => {
-            $scope.jfSwitch.ngModelCtrl = ngModelCtrl;
-        },
-        controller: jfSwitchController,
-        controllerAs: 'jfSwitch',
-        bindToController: true,
-        templateUrl: 'directives/jf_switch/jf_switch.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_switch_toggle/jf_switch_toggle.html b/web/angular-web/src/main/webapp/app/directives/jf_switch_toggle/jf_switch_toggle.html
deleted file mode 100644
index bc32baf..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_switch_toggle/jf_switch_toggle.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<div class="jf-switch-toggle">
-    <div class="switch-toggle"><span></span></div>
-    <span class="text-off">{{textoff}}</span>
-    <span class="text-on">{{texton}}</span>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_switch_toggle/jf_switch_toggle.js b/web/angular-web/src/main/webapp/app/directives/jf_switch_toggle/jf_switch_toggle.js
deleted file mode 100644
index c3187b7..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_switch_toggle/jf_switch_toggle.js
+++ /dev/null
@@ -1,23 +0,0 @@
-class jfSwitchToggleController {
-    constructor($element, $transclude, $timeout) {
-        $transclude(function(clone) {
-            $timeout(function() {
-                $element.find('label').prepend(clone);
-            }, 0, false);
-        });
-    }
-}
-
-export function jfSwitchToggle() {
-    return {
-        restrict: 'E',
-        transclude: true,
-        scope: {
-            texton: '@?',
-            textoff: '@?'
-        },
-        replace: true,
-        controller: jfSwitchToggleController,
-        templateUrl: 'directives/jf_switch_toggle/jf_switch_toggle.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_tabs/jf_tab.html b/web/angular-web/src/main/webapp/app/directives/jf_tabs/jf_tab.html
deleted file mode 100644
index 146f287..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_tabs/jf_tab.html
+++ /dev/null
@@ -1,4 +0,0 @@
-
-<div ng-if="getCurrentTabName() === name">
-    <ng-transclude></ng-transclude>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_tabs/jf_tab.js b/web/angular-web/src/main/webapp/app/directives/jf_tabs/jf_tab.js
deleted file mode 100644
index 10e7623..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_tabs/jf_tab.js
+++ /dev/null
@@ -1,13 +0,0 @@
-export function jfTab() {
-    return {
-        scope: {
-            name: '@'
-        },
-        require:'^jfTabs',
-        templateUrl: 'directives/jf_tabs/jf_tab.html',
-        transclude: true,
-        link: function(scope, element, attrs, ctrl) {
-            scope.getCurrentTabName = () => ctrl.currentTab && ctrl.currentTab.name;
-        }
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_tabs/jf_tabs.html b/web/angular-web/src/main/webapp/app/directives/jf_tabs/jf_tabs.html
deleted file mode 100644
index c5c58a1..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_tabs/jf_tabs.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<ul class="nav nav-tabs">
-    <li ng-repeat="tab in jfTabs.tabsVisible"
-        ng-class="{active:jfTabs.isActiveTab(tab), disabled:tab.isDisabled}"
-        class="jf-tabs-tab-header"
-        jf-disable-feature="{{ tab.feature }}">
-        <a ng-click="jfTabs.onClickTab(tab)" style="z-index: 999999"><span>{{jfTabs.dictionary[tab.name]}}</span></a>
-    </li>
-    <li class="action-expand" ng-show="jfTabs.tabsCollapsed.length">
-        <span class="dropdown" dropdown is-open="jfTabs.isDropdownOpen">
-            <a href class="dropdown-toggle nav-tabs-more" dropdown-toggle>»</a>
-            <ul class="dropdown-menu dropdown-menu-right dropdown-container text-left">
-                <li class="dropdown-item" ng-repeat="tab in jfTabs.tabsCollapsed"
-                    jf-disable-feature="{{ tab.feature }}">
-                    <a ng-click="jfTabs.onClickTab(tab)"><span>{{jfTabs.dictionary[tab.name]}}</span></a>
-                </li>
-            </ul>
-        </span>
-    </li>
-</ul>
-<ng-transclude></ng-transclude>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_tabs/jf_tabs.js b/web/angular-web/src/main/webapp/app/directives/jf_tabs/jf_tabs.js
deleted file mode 100644
index 4aff6fe..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_tabs/jf_tabs.js
+++ /dev/null
@@ -1,118 +0,0 @@
-import EVENTS from '../../constants/artifacts_events.constants';
-
-class jfTabsController {
-
-    constructor($scope, $state, $timeout, $element, $stateParams, ArtifactoryEventBus, ArtifactoryFeatures) {
-        this.$scope = $scope;
-        this.$element = $element;
-        this.stateParams = $stateParams;
-        this.$timeout = $timeout;
-        this.state = $state;
-        this.tabsCollapsed = [];
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.features = ArtifactoryFeatures;
-
-        this.currentTab = {
-            name: this.stateParams.tab
-        };
-        this._registerEvents();
-        this.initTabs();
-    }
-
-    initTabs() {
-        // wait for the element to render and calculate how many tabs should display
-        this.$timeout(() => {
-            this._calculateTabsSize();
-
-            if (!this._getTab(this.currentTab)) {
-                // If current tab doesn't exist on the tabs list at all - select the first tab
-                this.onClickTab(this.tabs[0]);
-            }
-            else {
-                // Otherwise - make sure it's visible
-                this._ensureTabVisible(this.currentTab);
-            }
-        });
-    }
-
-    _calculateTabsSize() {
-        // wait for the element to render and calculate how many tabs should display
-        let container = $(this.$element).children().eq(0);
-        let containerWidth = container.width();
-        let tabWidth = parseInt(this.tabWidth);
-        let containerMargin = parseInt(this.containerMargin);
-
-        let expanderWidth = $('.action-expand').eq(0).outerWidth(true);
-        let tabsToTake = Math.floor((containerWidth - expanderWidth - containerMargin) / tabWidth);
-
-        this.tabsCollapsed = _.takeRight(this.tabs, this.tabs.length - tabsToTake);
-        this.tabsVisible = _.take(this.tabs, tabsToTake);
-    }
-
-    _registerEvents() {
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TABS_REFRESH, () => this.initTabs());
-        // URL changed (like back button / forward button / someone input a URL)
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.ARTIFACT_URL_CHANGED, (stateParams) => {
-            this.currentTab = {name: stateParams.tab};
-        });
-
-        $(window).on('resize.tabs', () => {
-            this.initTabs();
-            this.$scope.$digest();
-        });
-        this.$scope.$on('$destroy', () => {
-            $(window).off('resize.tabs');
-        });
-    }
-
-    onClickTab(tab) {
-        // if the tab is in the more section replace it
-        // with the last tab in the main tabs.
-        if (this.features.isDisabled(tab.feature) || tab.isDisabled) {
-            return;
-        }
-        this._ensureTabVisible(tab);
-        this.state.go(this.state.current, {tab: tab.name});
-        this.currentTab.name = tab.name;
-    }
-
-    _ensureTabVisible(tab) {
-        let collapsedTab = this._getCollapsedTab(tab);
-        if (!collapsedTab) return;
-
-        // Replace between collapsedTabs & visibleTabs:
-        var collapsedTabIndex = this.tabsCollapsed.indexOf(collapsedTab)
-        var tabToReplace = this.tabsVisible[this.tabsVisible.length - 1]
-        this.tabsCollapsed[collapsedTabIndex] = tabToReplace;
-        this.tabsVisible[this.tabsVisible.length - 1] = collapsedTab;
-    }
-
-    isActiveTab(tab) {
-        return tab.name === this.currentTab.name;
-    }
-
-    _getTab(tab) {
-        return _.findWhere(this.tabs, {name: tab.name});
-    }
-
-    _getCollapsedTab(tab) {
-        return _.findWhere(this.tabsCollapsed, {name: tab.name})
-    }
-}
-
-export function jfTabs() {
-    return {
-        scope: {
-            tabs: '=',
-            dictionary: '=',
-            features: '=',
-            tabWidth: '@',
-            containerMargin: '@'
-        },
-        transclude: true,
-        controller: jfTabsController,
-        controllerAs: 'jfTabs',
-        templateUrl: 'directives/jf_tabs/jf_tabs.html',
-        bindToController: true
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_tooltip/jf_tooltip.js b/web/angular-web/src/main/webapp/app/directives/jf_tooltip/jf_tooltip.js
deleted file mode 100644
index 5cdb927..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_tooltip/jf_tooltip.js
+++ /dev/null
@@ -1,23 +0,0 @@
-export function jfTooltip() {
-    return {
-        restrict: 'A',
-        link: function($scope, $element, $attrs) {
-            let content = $attrs.jfTooltip;
-
-            $($element).tooltipster({
-                animation: 'fade',
-                contentAsHTML : 'true',
-                trigger: 'hover',
-                onlyOne: 'true',
-                interactive: 'true',
-                position: 'bottom',
-                theme: 'tooltipster-default bottom',
-                content: content
-            });
-
-            $attrs.$observe('jfTooltip', function(val){
-                $($element).tooltipster('content', val);
-            });
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_tooltip_on_overflow/jf_tooltip_on_overflow.js b/web/angular-web/src/main/webapp/app/directives/jf_tooltip_on_overflow/jf_tooltip_on_overflow.js
deleted file mode 100644
index d354818..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_tooltip_on_overflow/jf_tooltip_on_overflow.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- USAGE EXAMPLE:
-
- <jf-grid-filter
- filter-grid="gridOptions"  //the name of the grid (grid options)
- filter-field="fieldName"        //the name of the field that should be filtered
- filter-on-change>          //optional - don't use a button for filtering, filter on every change
- </jf-grid-filter>
-
- */
-
-export function jfTooltipOnOverflow() {
-
-    return {
-        restrict: 'A',
-        scope: {
-        },
-        link: ($scope, $element) => {
-            $($element).on('mouseenter',(e)=>{
-                let target = $(e.target);
-                let targetContent = target.text().trim();
-
-                if (target[0].scrollWidth > target.innerWidth()) {
-                    if (!target.hasClass('tooltipstered')) {
-                        target.tooltipster({
-                            animation: 'fade',
-                            trigger: 'hover',
-                            onlyOne: 'true',
-                            interactive: 'true',
-                            position: 'bottom',
-                            theme: 'tooltipster-default bottom',
-                            content: targetContent
-                        });
-                        target.tooltipster('show');
-                    }
-                    else {
-                        target.tooltipster('enable');
-
-                        if (target.tooltipster('content') != targetContent)
-                            target.tooltipster('content', targetContent);
-                    }
-                }
-                else if (target.hasClass('tooltipstered'))
-                    target.tooltipster('disable');
-            });
-            $scope.$on('$destroy', () => {
-                $($element).off('mouseenter');
-                $($element).off('mouseleave');
-            });
-
-
-        }
-    };
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_ui_select/jf_ui_select.html b/web/angular-web/src/main/webapp/app/directives/jf_ui_select/jf_ui_select.html
deleted file mode 100644
index d9b433b..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_ui_select/jf_ui_select.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<ui-select jf-disable-ng-animate ng-model="jfUiSelect.jfSelectModel" ng-change="jfUiSelect.jfSelectChange()" ng-disabled="jfUiSelect.jfSelectDisabled">
-    <ui-select-match id="select-header" placeholder="{{ jfUiSelect.jfSelectPlaceholder }}">
-        {{ jfUiSelect.displayLabel($select.selected) }}
-    </ui-select-match>
-    <ui-select-choices
-            repeat="item in jfUiSelect.jfSelectOptions | filter: $select.search track by $index">
-        <div name="select-item" ng-bind-html="jfUiSelect.displayLabel(item) | highlight: $select.search"></div>
-    </ui-select-choices>
-</ui-select>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_ui_select/jf_ui_select.js b/web/angular-web/src/main/webapp/app/directives/jf_ui_select/jf_ui_select.js
deleted file mode 100644
index 14c5c09..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_ui_select/jf_ui_select.js
+++ /dev/null
@@ -1,37 +0,0 @@
-class jfUiSelectController {
-    constructor() {
-        // 3 methods are allowed for passing the options:
-        // Passing an array of objects, and the attribute to display
-        // Passing an array (of anything), and a function that returns the label to display
-        // Passing an array of strings (and then the string is displayed)
-        this.displayLabel = (item) => {
-            if (item === null || item === undefined) return null;
-            if (item[this.jfSelectDisabled]) return null;
-            if (this.jfSelectDisplayAttr) {
-                return item[this.jfSelectDisplayAttr];
-            } else if (this.jfSelectDisplayFunc) {
-                return this.jfSelectDisplayFunc({$item: item});
-            } else {
-                return item;
-            }
-        };
-    }
-}
-
-export function jfUiSelect() {
-    return {
-        controller: jfUiSelectController,
-        controllerAs: 'jfUiSelect',
-        bindToController: true,
-        scope: {
-            jfSelectModel: '=',
-            jfSelectOptions: '=',
-            jfSelectDisabled: '=',
-            jfSelectChange: '&',
-            jfSelectDisplayAttr: '@',
-            jfSelectDisplayFunc: '&?',
-            jfSelectPlaceholder: '@'
-        },
-        templateUrl: 'directives/jf_ui_select/jf_ui_select.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_validation/jf_validation.html b/web/angular-web/src/main/webapp/app/directives/jf_validation/jf_validation.html
deleted file mode 100644
index 0543b7f..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_validation/jf_validation.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<ng-messages for="jfValidation.field.$error" class="jf-validation" ng-style="{position: jfValidation.dontPushDown ? 'absolute' : 'relative'}">
-    <div ng-repeat="(key, value) in jfValidation.messages">
-        <div ng-message-exp="key" id="validation-label">{{ value }}</div>
-    </div>
-</ng-messages>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/jf_validation/jf_validation.js b/web/angular-web/src/main/webapp/app/directives/jf_validation/jf_validation.js
deleted file mode 100644
index a39f0e4..0000000
--- a/web/angular-web/src/main/webapp/app/directives/jf_validation/jf_validation.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import VALIDATION_MESSAGES from '../../constants/validation.constants.js';
-
-export function jfValidation() {
-    return {
-        scope: {
-            field: '=',
-            dictionary: '@',
-            dontPushDown: '='
-        },
-        controller: jfValidation,
-        controllerAs: 'jfValidation',
-        bindToController: true,
-        templateUrl: 'directives/jf_validation/jf_validation.html'
-    }
-}
-
-class jfValidation {
-    constructor() {
-        this.messages = VALIDATION_MESSAGES(this.dictionary);
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/rtfact_storage_viewer/rtfact_storage_element.html b/web/angular-web/src/main/webapp/app/directives/rtfact_storage_viewer/rtfact_storage_element.html
deleted file mode 100644
index 8544287..0000000
--- a/web/angular-web/src/main/webapp/app/directives/rtfact_storage_viewer/rtfact_storage_element.html
+++ /dev/null
@@ -1,92 +0,0 @@
-<div>
-    <div class="rtfact-storage-element"
-         ng-click="StorageElement.onClick($event)">
-
-        <!-- Title Row -->
-        <div class="storage-element-row"
-              ng-if="StorageElement.level === 'top'">
-            <span class="storage-element-name" ng-if="StorageElement.STORAGE_TYPES_DICTIONARY[StorageElement.element.data.type]">{{StorageElement.STORAGE_TYPES_DICTIONARY[StorageElement.element.data.type]}}</span>
-            <span class="storage-element-name" ng-if="!StorageElement.STORAGE_TYPES_DICTIONARY[StorageElement.element.data.type]">{{StorageElement.element.data.type}}</span>
-            <span ng-if="StorageElement.element.subElements && StorageElement.element.subElements.length">
-                <span>|</span> Mount - {{StorageElement.element.subElements.length}}
-            </span>
-            <span ng-if="StorageElement.element.data.redundancy">
-                <span>|</span> Redundancy - {{StorageElement.element.data.redundancy}}
-            </span>
-
-        </div>
-
-        <!-- Directory Row -->
-        <div class="storage-element-row"
-              ng-if="StorageElement.level === 'top' && StorageElement.element.data.binariesDir">
-            <span>
-                Directory: {{StorageElement.element.data.binariesDir}}
-            </span>
-        </div>
-
-        <!-- Usage Row -->
-        <div class="storage-element-row usage"
-             ng-if="StorageElement.level === 'top' && StorageElement.element.data.usageSpace !== undefined && StorageElement.element.data.totalSpace !== undefined">
-            <div class="usage-string">Used: {{StorageElement.getUsageString(true) || 'N/A'}}</div>
-            <div class="storage-usage-container" ng-if="!StorageElement.SpecialValues.isSpecialValue(StorageElement.element.data.usageSpace)">
-                <rtfact-storage-usage total="StorageElement.element.data.totalSpace"
-                                      used="StorageElement.element.data.usageSpace"
-                                      thresholds="StorageElement.thresholds"></rtfact-storage-usage>
-            </div>
-        </div>
-
-        <!-- Caches -->
-        <div ng-if="StorageElement.element.caches && StorageElement.element.caches.length"
-             class="caches-container"
-             ng-repeat="cache in StorageElement.element.caches track by $index">
-            <rtfact-storage-element level="top" element="cache"></rtfact-storage-element>
-        </div>
-
-        <!-- Sub elements for shard -->
-        <div class="subs-container"
-             ng-if="StorageElement.level === 'top' && StorageElement.element.data.type === 'sharding' && StorageElement.element.subElements && StorageElement.element.subElements.length">
-            <div ng-repeat="subElement in StorageElement.element.subElements" class="sub-container">
-                <div ng-style="{width: StorageElement.getSubWidth(subElement)}" class="pull-left sub-wrapper" ng-class="{'selected-sub': StorageElement.selectedSub.element === subElement}">
-                    <rtfact-storage-element level='sub' parent="StorageElement" element="subElement"></rtfact-storage-element>
-                </div>
-            </div>
-        </div>
-
-        <!-- Sub View -->
-        <div class="storage-element-as-sub" ng-if="StorageElement.level === 'sub'">
-
-            <i class="icon icon-plus pull-right" ng-class="{'close-sign': StorageElement.parent.selectedSub === StorageElement}"></i>
-
-            <div class="overflow-tooltip-trigger"
-                 ng-if="StorageElement.isTextOverflowing()"
-                 jf-tooltip="{{StorageElement.element.data.id}}<br>{{StorageElement.getUsageString()}}">
-                <div class="mini-label">
-                    <div>{{StorageElement.element.data.id}}</div>
-                </div>
-            </div>
-
-            <div class="text-content" ng-style="{visibility: (StorageElement.isTextOverflowing() ? 'hidden' : 'visible')}">
-                <div>{{StorageElement.element.data.id}}
-                    <span ng-if="StorageElement.element.subElements && StorageElement.element.subElements.length">
-                        (M={{StorageElement.element.subElements.length}})
-                    </span>
-                </div>
-                <div class="sub-usage-text" ng-if="StorageElement.element.data.usageSpace !== undefined && StorageElement.element.data.totalSpace !== undefined">
-                    {{StorageElement.getUsageString() || 'Usage Info Unavailable'}}
-                </div>
-            </div>
-
-            <rtfact-storage-usage ng-if="!StorageElement.SpecialValues.isSpecialValue(StorageElement.element.data.usageSpace)"
-                                  class="sub-usage"
-                                  total="StorageElement.element.data.totalSpace"
-                                  used="StorageElement.element.data.usageSpace"></rtfact-storage-usage>
-        </div>
-
-    </div>
-
-
-    <!-- Selected sub, opened in full display below -->
-    <div ng-if="StorageElement.selectedSub" class="storage-element-anim">
-        <rtfact-storage-element level='top' above="StorageElement" element="StorageElement.selectedSub.element"></rtfact-storage-element>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/rtfact_storage_viewer/rtfact_storage_element.js b/web/angular-web/src/main/webapp/app/directives/rtfact_storage_viewer/rtfact_storage_element.js
deleted file mode 100644
index 8c6fa38..0000000
--- a/web/angular-web/src/main/webapp/app/directives/rtfact_storage_viewer/rtfact_storage_element.js
+++ /dev/null
@@ -1,199 +0,0 @@
-import SpecialValues from './special_values';
-import STORAGE_TYPES_DICTIONARY from './storage_types_dictionary.js';
-
-
-class rtfactStorageElementController {
-    constructor($element, $timeout, $filter) {
-        this.SpecialValues = SpecialValues;
-        this.$element = $element;
-        this.fileSizeFilter = $filter('filesize');
-        this.selectedSub = null;
-        this.$timeout = $timeout;
-        this.MINIMUM_SUB_WIDTH = 10; //percent
-        this.DEFAULT_UNKNOWN_WIDTH = 12; //percent
-        this.STORAGE_TYPES_DICTIONARY = STORAGE_TYPES_DICTIONARY;
-
-        if (this.above) {
-            this.above.below = this;
-        }
-
-        if (this.element.subElements && this.element.subElements.length) {
-            this.calcSubWidths();
-        }
-
-        this.thresholds = this.getThresholds();
-
-    }
-
-    getSubWidth(sub) {
-        if (sub.displayWidth) return sub.displayWidth+'%';
-        else {
-            this.minimumSubWidth = this.MINIMUM_SUB_WIDTH;
-            this.unknownWidth = this.DEFAULT_UNKNOWN_WIDTH;
-            this.calcSubWidths();
-            return sub.displayWidth+'%';
-        }
-    }
-
-    calcSubWidths() {
-       let totalSubsSpace = 0;
-        this.element.subElements.forEach((sub) => {
-            if(!SpecialValues.isSpecialValue(sub.data.usageSpace)) {
-                totalSubsSpace += parseFloat(!SpecialValues.isSpecialValue(sub.data.totalSpace) ? sub.data.totalSpace : sub.data.usageSpace);
-            }
-        });
-
-        let totalPercents = 0;
-        let totalPercentsNatural = 0;
-        let belowMinimum = 0;
-        let unknowns = 0;
-        this.element.subElements.forEach((sub) => {
-            let width;
-            let natural = true;
-            if (SpecialValues.isSpecialValue(sub.data.usageSpace)) {
-                width = this.unknownWidth;
-                unknowns++;
-                natural = false;
-                sub.unknown = true;
-            }
-            else {
-                width = (parseFloat(!SpecialValues.isSpecialValue(sub.data.totalSpace) ? sub.data.totalSpace : sub.data.usageSpace) / totalSubsSpace)*100;
-                if (width < this.minimumSubWidth) {
-                    width = this.minimumSubWidth;
-                    belowMinimum++;
-                    natural = false;
-                }
-            }
-
-            if (natural) totalPercentsNatural += width;
-
-            sub.displayWidth = width;
-            totalPercents += width;
-        });
-
-        //normalize
-        while ((totalPercents > 100.0001 || totalPercents < 99) && totalPercentsNatural > 0) {
-//            console.log('!!');
-            let minimumWidth = this.minimumSubWidth * belowMinimum + this.unknownWidth * unknowns;
-            let remainingWidth = 100 - minimumWidth;
-            let newTotal = 0;
-            let newTotalNatural = 0;
-            this.element.subElements.forEach((sub) => {
-                if (sub.displayWidth === this.minimumSubWidth || sub.unknown) {
-                    newTotal += sub.displayWidth;
-                }
-                else {
-                    let normalWidth = (sub.displayWidth/totalPercentsNatural)*remainingWidth;
-                    if (normalWidth < this.minimumSubWidth) {
-                        normalWidth = this.minimumSubWidth;
-                        belowMinimum++;
-                    }
-                    else newTotalNatural += normalWidth;
-                    sub.displayWidth = normalWidth;
-                    newTotal += normalWidth;
-                }
-            });
-            totalPercents = newTotal;
-            totalPercentsNatural = newTotalNatural;
-        }
-
-        if (!totalPercentsNatural && totalPercents > 100) {
-            this.minimumSubWidth *= 100/totalPercents;
-            this.calcSubWidths();
-        }
-
-        if (totalPercents < 100 && totalPercentsNatural === 0 && unknowns === this.element.subElements.length) {
-            this.unknownWidth = 100/unknowns;
-            this.calcSubWidths();
-        }
-
-    }
-
-    onClick(e) {
-        e.stopImmediatePropagation();
-        e.preventDefault();
-
-        if (this.level === 'sub') {
-            this.parent.onChildClicked(this);
-        }
-    }
-
-    onChildClicked(child) {
-        if (this.below) this.below.onChildClicked(null);
-        this.selectedSub = this.selectedSub === child ? null : child;
-
-        //for debug
-        if (child && localStorage._debugStorageViewer === 'true' && window.storageRef) window.storageRef = child.element;
-    }
-
-    isTextOverflowing() {
-        if (this.level !== 'sub') return false;
-        let textContent = $(this.$element).find('.text-content');
-        return textContent[0].scrollWidth > textContent.innerWidth();
-    }
-
-    getUsageString(includePercentage = false) {
-        if (this.element.data.usageSpace === SpecialValues.UNSUPPORTED_VALUE) return null;
-        else {
-            let usageString = (this.element.data.usageSpace !== '0' ?
-                this.fileSizeFilter(this.element.data.usageSpace) + ' / ' : (includePercentage ? '0 / ' : 'Empty - ')) +
-                (!SpecialValues.isSpecialValue(this.element.data.totalSpace) ?
-                    this.fileSizeFilter(this.element.data.totalSpace) :
-                    (this.element.data.totalSpace === SpecialValues.INFINITY_VALUE ? '\u221E' : '?'));
-
-            if (includePercentage) {
-                usageString += (!SpecialValues.isSpecialValue(this.element.data.totalSpace) ?
-                ' (' + (100*this.element.data.usageSpace/this.element.data.totalSpace).toFixed(1) + '%)' : '');
-            }
-            return usageString;
-        }
-    }
-
-    getThresholds() {
-        let thresholds = [];
-
-        if (this.element.caches && this.element.caches[0] && this.element.caches[0].data.quotaErrorLimit) {
-            this.element.data.quotaErrorLimit = this.element.caches[0].data.quotaErrorLimit;
-            delete this.element.caches[0].data.quotaErrorLimit;
-        }
-        if (this.element.caches && this.element.caches[0] && this.element.caches[0].data.quotaWarningLimit) {
-            this.element.data.quotaWarningLimit = this.element.caches[0].data.quotaWarningLimit;
-            delete this.element.caches[0].data.quotaWarningLimit;
-        }
-
-        if (this.element.data && this.element.data.quotaErrorLimit) {
-            thresholds.push({
-                value: this.element.data.quotaErrorLimit,
-                type: 'error'
-            })
-        }
-        if (this.element.data && this.element.data.quotaWarningLimit) {
-            thresholds.push({
-                value: this.element.data.quotaWarningLimit,
-                type: 'warning'
-            })
-        }
-
-        return thresholds;
-    }
-
-}
-
-export function rtfactStorageElement(recursiveDirective) {
-    return {
-        restrict: 'E',
-        scope: {
-            level: '@', //'top' / 'sub'
-            element: '=',
-            parent: '=',
-            above: '='
-        },
-        controller: rtfactStorageElementController,
-        controllerAs: 'StorageElement',
-        templateUrl: 'directives/rtfact_storage_viewer/rtfact_storage_element.html',
-        bindToController: true,
-        compile: (element) => {
-            return recursiveDirective.compile(element);
-        }
-    };
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/rtfact_storage_viewer/rtfact_storage_usage.html b/web/angular-web/src/main/webapp/app/directives/rtfact_storage_viewer/rtfact_storage_usage.html
deleted file mode 100644
index 97df1df..0000000
--- a/web/angular-web/src/main/webapp/app/directives/rtfact_storage_viewer/rtfact_storage_usage.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<div class="storage-usage" ng-class="{'infinity-storage': StorageUsage.SpecialValues.isSpecialValue(StorageUsage.total)}">
-    <div ng-repeat="threshold in StorageUsage.thresholds"
-         class="threshold-container">
-        <div class="threshold"
-             ng-class="threshold.type"
-             ng-style="{left: threshold.value + '%'}">
-            <div class="threshold-icon" jf-tooltip="{{threshold.type === 'warning' ? 'Storage Space Warning ' + threshold.value + '%' : 'Storage Space Limit ' + threshold.value + '%'}}">{{threshold.value}}</div>
-        </div>
-    </div>
-    <span ng-if="StorageUsage.total === StorageUsage.SpecialValues.INFINITY_VALUE" class="infinity-sign"> </span>
-    <span ng-if="StorageUsage.total === StorageUsage.SpecialValues.UNSUPPORTED_VALUE" class="unsupported-sign"> </span>
-    <div class="storage-usage-used" ng-style="{width:StorageUsage.getPercents()}"></div>
-</div>
-
diff --git a/web/angular-web/src/main/webapp/app/directives/rtfact_storage_viewer/rtfact_storage_usage.js b/web/angular-web/src/main/webapp/app/directives/rtfact_storage_viewer/rtfact_storage_usage.js
deleted file mode 100644
index 9c98f04..0000000
--- a/web/angular-web/src/main/webapp/app/directives/rtfact_storage_viewer/rtfact_storage_usage.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import SpecialValues from './special_values';
-
-class rtfactStorageUsageController {
-    constructor() {
-        this.SpecialValues = SpecialValues;
-    }
-
-    getPercents() {
-        if (!SpecialValues.isSpecialValue(this.total)) return ((this.used / this.total) * 100) + '%';
-        else return 'calc(100% - 40px)'
-    }
-}
-
-export function rtfactStorageUsage() {
-    return {
-        restrict: 'E',
-        scope: {
-            total: '=',
-            used: '=',
-            thresholds: '='
-        },
-        controller: rtfactStorageUsageController,
-        controllerAs: 'StorageUsage',
-        templateUrl: 'directives/rtfact_storage_viewer/rtfact_storage_usage.html',
-        bindToController: true
-    };
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/rtfact_storage_viewer/rtfact_storage_viewer.html b/web/angular-web/src/main/webapp/app/directives/rtfact_storage_viewer/rtfact_storage_viewer.html
deleted file mode 100644
index 93a1e1c..0000000
--- a/web/angular-web/src/main/webapp/app/directives/rtfact_storage_viewer/rtfact_storage_viewer.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<div class="rtfact-storage-viewer">
-    <rtfact-storage-element ng-if="StorageViewer.data"
-                            level='top'
-                            element="StorageViewer.data"></rtfact-storage-element>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/rtfact_storage_viewer/rtfact_storage_viewer.js b/web/angular-web/src/main/webapp/app/directives/rtfact_storage_viewer/rtfact_storage_viewer.js
deleted file mode 100644
index 864e0c9..0000000
--- a/web/angular-web/src/main/webapp/app/directives/rtfact_storage_viewer/rtfact_storage_viewer.js
+++ /dev/null
@@ -1,185 +0,0 @@
-import SpecialValues from './special_values';
-
-class rtfactStorageViewerController {
-    constructor($scope,$interval,BinaryProvidersInfoDao) {
-
-        this.$scope = $scope;
-        this.$interval = $interval;
-        this.binaryProvidersInfoDao = BinaryProvidersInfoDao.getInstance();
-
-        if (!this.data) {
-            this._getData();
-        }
-        else {
-            this.data = this._transformData(this.data);
-        }
-    }
-
-    _getData() {
-        this.binaryProvidersInfoDao.get().$promise.then((data)=>{
-            this.data = this._transformData(data);
-
-            //debug aid
-            if (localStorage._debugStorageViewer === 'true') this._installDebugHooks();
-        })
-    }
-
-    _installDebugHooks() {
-        window.setData = ((totals) => {
-            this._setTestData(totals);
-            this.$scope.$apply();
-        }).bind(this);
-        window.randomData = (doApply = true) => {
-            let totals = [];
-            let n = Math.round(Math.random()*15) + 1;
-            for (let i = 0; i<n; i++) {
-                let val;
-                if (Math.random() < .4) val = 'infinite';
-                else if (Math.random() < .2) val = 'unsupported';
-                else val = Math.round(Math.random()*9999999999999);
-                if (Math.random() < .2) val = val + '*';
-                totals.push(val);
-            }
-            this._setTestData(totals);
-            if (doApply) this.$scope.$apply();
-        }
-        window.runRandomTest = () => {
-            this.$interval(()=>{
-                randomData(false);
-            },100)
-        }
-    }
-
-    //debug aid
-    _setTestData(totalSizes) {
-
-//        let template = this.template = this.template ? this.template : this.data.subElements[0].subElements[0];
-        let template = {
-            "data": {
-                "baseDataDir": "/home/danny/workspace-4.2/artifactory/devenv/.artifactory/data",
-                "period": "1",
-                "usageSpace": "211439489024",
-                "freeSpace": "23654612992",
-                "totalSpace": "235094102016",
-                "fileStoreDir": "shard-fs-1",
-                "type": "state-aware",
-                "binariesDir": "/home/danny/workspace-4.2/artifactory/devenv/.artifactory/data/shard-fs-1",
-                "tempDir": "_pre",
-                "usageSpaceInPercent": "89",
-                "id": "shard-fs-3",
-                "freeSpaceInPercent": "11",
-                "essential": "true"
-            },
-            "caches": [
-
-            ]
-        };
-
-        let subs = [];
-
-        for (let i in totalSizes) {
-            let ts = totalSizes[i];
-            let unsupported = false;
-            if (_.isString(ts) && ts.endsWith('*')) {
-                ts = ts.substr(0, ts.length - 1);
-                unsupported = true;
-            }
-            let newStorage = angular.copy(template);
-            newStorage.data.id = 'test-fs-'+i;
-            newStorage.data.totalSpace = ts + '';
-
-            if (unsupported) newStorage.data.usageSpace = SpecialValues.UNSUPPORTED_VALUE;
-            else newStorage.data.usageSpace = _.isNumber(ts) ? Math.round(Math.random()*ts) + '' : Math.round(100000000000*Math.random()) + '';
-
-            subs.push(newStorage);
-        }
-
-        if (window.storageRef) {
-            window.storageRef.data.type = 'sharding';
-            window.storageRef.data.id = 'mock-shard';
-            window.storageRef.subElements = subs;
-//            window.storageRef.data.quotaErrorLimit = 100 * Math.random();
-        }
-        else {
-            window.storageRef = this.data;
-            this.data.data.type='sharding';
-            this.data.data.id='mock-shard';
-            let cacheMock = angular.copy(template);
-            cacheMock.data.id = 'cache-mock';
-            this.data.caches = [cacheMock];
-            this.data.subElements = subs;
-        }
-
-
-
-/*
-        if (this.debugInterval) {
-            this.$interval.cancel(this.debugInterval);
-            this.debugInterval = null;
-        }
-
-        this.debugInterval = this.$interval(()=>{
-            subs.forEach((sub)=>{
-                if (sub.data.usageSpace !== SpecialValues.UNSUPPORTED_VALUE) {
-                    sub.data.usageSpace = Math.round(parseFloat(sub.data.usageSpace) + (10000000000*Math.random()-5000000000)) + '';
-                    if (!SpecialValues.isSpecialValue(sub.data.totalSpace) &&  parseFloat(sub.data.usageSpace) > parseFloat(sub.data.totalSpace)) sub.data.usageSpace = sub.data.totalSpace;
-                    if (parseFloat(sub.data.usageSpace) < 0) sub.data.usageSpace = '0';
-                    if (SpecialValues.isSpecialValue(sub.data.totalSpace)) delete sub.displayWidth;
-                }
-            })
-        },100)
-*/
-
-    }
-
-    _transformData(root) {
-        let transformed = {};
-
-        let isEmpty = (element) => {
-            if (element.data) return false;
-            if (element.subBinaryTreeElements && element.subBinaryTreeElements.length) return false;
-            if (element.nextBinaryTreeElement && !isEmpty(element.nextBinaryTreeElement)) return false;
-
-            return true;
-        };
-
-        let caches = [];
-        let current = root;
-        while (current) {
-            let currentObj = {data: current.data};
-            if (current.subBinaryTreeElements && current.subBinaryTreeElements.length) {
-                currentObj.subElements = current.subBinaryTreeElements;
-                for (let i = 0; i < currentObj.subElements.length; i++) {
-                    currentObj.subElements[i] = this._transformData(currentObj.subElements[i])
-                }
-            }
-            if (currentObj.data && current.nextBinaryTreeElement && !isEmpty(current.nextBinaryTreeElement)) {
-                caches.push(currentObj);
-                current = current.nextBinaryTreeElement;
-            }
-            else if (!currentObj.data && current.nextBinaryTreeElement && !isEmpty(current.nextBinaryTreeElement)) {
-                current = current.nextBinaryTreeElement;
-            }
-            else {
-                transformed = currentObj;
-                transformed.caches = caches;
-                current = null;
-            }
-        }
-        return transformed;
-    }
-
-}
-
-export function rtfactStorageViewer() {
-    return {
-        restrict: 'E',
-        scope: {
-            data: '='
-        },
-        controller: rtfactStorageViewerController,
-        controllerAs: 'StorageViewer',
-        templateUrl: 'directives/rtfact_storage_viewer/rtfact_storage_viewer.html',
-        bindToController: true
-    };
-}
diff --git a/web/angular-web/src/main/webapp/app/directives/rtfact_storage_viewer/special_values.js b/web/angular-web/src/main/webapp/app/directives/rtfact_storage_viewer/special_values.js
deleted file mode 100644
index 0e1963b..0000000
--- a/web/angular-web/src/main/webapp/app/directives/rtfact_storage_viewer/special_values.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export default {
-    INFINITY_VALUE: 'infinite',
-    UNSUPPORTED_VALUE: 'unsupported',
-    isSpecialValue: function(val) {
-        return val === this.INFINITY_VALUE || val === this.UNSUPPORTED_VALUE;
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/rtfact_storage_viewer/storage_types_dictionary.js b/web/angular-web/src/main/webapp/app/directives/rtfact_storage_viewer/storage_types_dictionary.js
deleted file mode 100644
index 38c8737..0000000
--- a/web/angular-web/src/main/webapp/app/directives/rtfact_storage_viewer/storage_types_dictionary.js
+++ /dev/null
@@ -1,16 +0,0 @@
-export default {
-    'blob': 'Full DB',
-    'sharding': 'Sharding',
-    's3': 'S3',
-    'google-storage': 'GCS',
-    'eventual': 'Eventual',
-    'external-file': 'External Storage',
-    'external-wrapper': 'External Wrapper',
-    'file-system': 'File System',
-    'cache-fs': 'Cache FS',
-    'state-aware': 'State Aware',
-    'hdfs': 'HDFS',
-    'retry': 'Retry',
-    'tracking': 'Tracking',
-    's3Old': 'S3'
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_cron.js b/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_cron.js
deleted file mode 100644
index 027d7ce..0000000
--- a/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_cron.js
+++ /dev/null
@@ -1,72 +0,0 @@
-export function jfValidatorCron(CronTimeDao, $q, $timeout, ArtifactoryNotifications) {
-    return {
-        restrict: 'A',
-        require: 'ngModel',
-        /**
-         * Register an async validator on cron expressions
-         */
-        link: function jfCronValidatorLink(scope, element, attrs, ngModel) {
-            let cronTimeDao = CronTimeDao.getInstance();
-
-            let cache = {};
-
-            // Get from server and cache result, or get from cache
-            function getFromServer(data) {
-                if (!cache[data.cron]) {
-                    cache[data.cron] = cronTimeDao.get(data).$promise;
-                }
-                return cache[data.cron];
-            }
-
-            // This is a factory function that creates a validation function for the cron expression
-            // It will be executed per validation key, and return an error only if the server returns
-            // an error that matches the key
-            function validateCron(key) {
-                return function (modelValue, viewValue) {
-                    var value = modelValue || viewValue;
-
-                    if (!value) {
-
-                        return $q.when();
-                    }
-                    // No need to check with server if the cron is less than 11 chars
-                    if (value.length < 11) {
-                        if (key === 'invalidCron') {
-                            return $q.reject();
-                        }
-                        else {
-                            return $q.when();
-                        }
-                    }
-
-                    let data = {cron: value};
-                    if (attrs.jfValidatorCronIsReplication) {
-                        data.isReplication = true;
-                    }
-
-                    // Get from server (or cached result)
-                    return getFromServer(data)
-                            .catch(function (result) {
-                                if (result.data.error === key || (result.data.feedbackMsg && result.data.feedbackMsg.error === key)) {
-                                    // The server responded with error message that matches this validator
-                                    if (key === 'shortCron') {
-                                        // shortCron is not an invalid value, just notify the user about it:
-                                        ArtifactoryNotifications.create({warn: "The current Cron expression will " +
-                                        "result in very frequent replications. \nThis will impact system performance."});
-                                        return true;
-                                    }
-                                    return $q.reject();
-                                }
-                                return true;
-                            });
-                }
-            }
-
-            // Message is per key, so need 3 different keys (even though REST is the same)
-            // Possible keys: invalid cron expression, next execution is too close in the future, next execution is in the past
-            ngModel.$asyncValidators.invalidCron = validateCron('invalidCron');
-            ngModel.$asyncValidators.shortCron = validateCron('shortCron');
-            ngModel.$asyncValidators.pastCron = validateCron('pastCron');
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_date_format.js b/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_date_format.js
deleted file mode 100644
index aa46d75..0000000
--- a/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_date_format.js
+++ /dev/null
@@ -1,27 +0,0 @@
-export function jfValidatorDateFormat(DateFormatDao, $q, $timeout) {
-    return {
-        restrict: 'A',
-        require: 'ngModel',
-        link: function jfValidatorDateFormat(scope, element, attrs, ngModel) {
-
-            let dateFormatDao = DateFormatDao.getInstance();
-            ngModel.$asyncValidators.dateFormatExpression = validateDateFormat;
-
-            function validateDateFormat(modelValue, viewValue) {
-                var value = modelValue || viewValue;
-
-                if (!value) {
-                    return $q.when();
-                }
-
-                return dateFormatDao.get({dateformat: value}).$promise
-                    .then(function (result) {
-                        if (result.error) {
-                            return $q.reject();
-                        }
-                        return true;
-                    });
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_int_value.js b/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_int_value.js
deleted file mode 100644
index 8432dc9..0000000
--- a/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_int_value.js
+++ /dev/null
@@ -1,18 +0,0 @@
-export function jfValidatorIntValue() {
-    return {
-        restrict: 'A',
-        require: 'ngModel',
-        link: function jfIntegerValueValidator(scope, element, attrs, ngModel) {
-
-            registerTransformers();
-
-            function registerTransformers() {
-                ngModel.$validators.integerValue = validateInteger;
-            }
-
-            function validateInteger(modelValue, viewValue) {
-                return parseInt(viewValue).toString() === viewValue;
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_ldap_url.js b/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_ldap_url.js
deleted file mode 100644
index 4409e4b..0000000
--- a/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_ldap_url.js
+++ /dev/null
@@ -1,20 +0,0 @@
-export function jfValidatorLdapUrl() {
-    return {
-        restrict: 'A',
-        require: 'ngModel',
-        link: function jfValidatorLdapUrl(scope, element, attrs, ngModel) {
-
-            registerTransformers();
-
-            function registerTransformers() {
-                ngModel.$validators.ldapUrl = validateLdapUrl;
-            }
-
-            function validateLdapUrl(modelValue, viewValue) {
-                //var regex = /^(?:(?:ldaps?):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5}) [...]
-                var regex = /^(?:(?:ldaps?):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:.(?:[a-z\u00a1-\uffff]{0,})))(?::\d{2,5})?(? [...]
-                return regex.test(viewValue);
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_max_text_length.js b/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_max_text_length.js
deleted file mode 100644
index d849090..0000000
--- a/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_max_text_length.js
+++ /dev/null
@@ -1,21 +0,0 @@
-export function jfValidatorMaxTextLength() {
-    return {
-        restrict: 'A',
-        require: 'ngModel',
-        link: function jfLimitTextLengthValidator(scope, element, attrs, ngModel) {
-
-            let limitTo = attrs.maxlength || attrs.jfValidatorMaxTextLength;
-
-            registerTransformers();
-
-            function registerTransformers() {
-                ngModel.$validators.maxlength = validateTextLength;
-            }
-
-            function validateTextLength(modelValue, viewValue) {
-                let ok  = !viewValue || viewValue.length <= parseInt(limitTo);
-                return ok;
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_name.js b/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_name.js
deleted file mode 100644
index 03ec55c..0000000
--- a/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_name.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * Validates an input to be valid entiyy name
- */
-export function jfValidatorName(NameValidatorDao, $q, $timeout) {
-    return {
-        restrict: 'A',
-        require: 'ngModel',
-        link: function jfValidatorName(scope, element, attrs, ngModel) {
-
-            let nameValidatorDao = NameValidatorDao.getInstance();
-            ngModel.$asyncValidators.name = validateName;
-
-            function validateName(modelValue, viewValue) {
-                var value = modelValue || viewValue;
-
-                if (!value) {
-                    return $q.when();
-                }
-
-                return nameValidatorDao.get({name: value}).$promise
-                    .then(function (result) {
-                        if (result.error) {
-                            return $q.reject();
-                        }
-                        return true;
-                    });
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_path_pattern.js b/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_path_pattern.js
deleted file mode 100644
index 8844aaa..0000000
--- a/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_path_pattern.js
+++ /dev/null
@@ -1,33 +0,0 @@
-export function jfValidatorPathPattern() {
-    return {
-        restrict: 'A',
-        require: 'ngModel',
-        link: function jfValidatorPathPattern(scope, element, attrs, ngModel) {
-
-            registerTransformers();
-
-            function registerTransformers() {
-                ngModel.$validators.pathPattern = validatePathPattern;
-            }
-
-            function validatePathPattern(modelValue, viewValue) {
-                if (!viewValue) return false;
-
-                let ok = true;
-
-                let tokens = ["(org|orgPath)", "module", "baseRev"];
-
-                for (let i in tokens) {
-                    let token = tokens[i];
-                    let regex = new RegExp('\\['+token+'\\]');
-                    if (!viewValue.match(regex)) {
-                        ok = false;
-                        break;
-                    }
-                }
-
-                return ok;
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_reverse_proxy_port.js b/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_reverse_proxy_port.js
deleted file mode 100644
index d90b1f4..0000000
--- a/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_reverse_proxy_port.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * Validates an input to be valid entiyy name
- */
-export function jfValidatorReverseProxyPort(ReverseProxiesDao, $q, $timeout) {
-    return {
-        restrict: 'A',
-        require: 'ngModel',
-        link: function jfValidatorReverseProxyPort(scope, element, attrs, ngModel) {
-
-            let repoKey = attrs.jfValidatorReverseProxyPort;
-
-            let portValidatorDao = ReverseProxiesDao;
-            ngModel.$asyncValidators.port = validatePort;
-
-            function validatePort(modelValue, viewValue) {
-                var value = modelValue || viewValue;
-
-                if (!value) {
-                    return $q.when();
-                }
-
-                return ReverseProxiesDao.checkPort(repoKey ? {repoKey: repoKey} : {},{port: value}).$promise
-                    .then(function (result) {
-                        if (!result.portAvailable) {
-                            return $q.reject();
-                        }
-                        return true;
-                    });
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_unique_id.js b/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_unique_id.js
deleted file mode 100644
index e536088..0000000
--- a/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_unique_id.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * Validates an input to be unique id in the config descriptor
- */
-export function jfValidatorUniqueId(UniqueIdValidatorDao, $q, $timeout) {
-    return {
-        restrict: 'A',
-        require: 'ngModel',
-        link: function jfValidatorUniqueId(scope, element, attrs, ngModel) {
-
-            let uniqueIdDao = UniqueIdValidatorDao.getInstance();
-            ngModel.$asyncValidators.uniqueId = validateUniqueId;
-
-            function validateUniqueId(modelValue, viewValue) {
-                // Don't validate disabled fields
-                if ($(element).is(':disabled')) return $q.when();
-
-                var value = modelValue || viewValue;
-
-                if (!value) return $q.when();
-
-                return uniqueIdDao.get({id: value}).$promise
-                    .then(function (result) {
-                        if (result.error) {
-                            return $q.reject();
-                        }
-                        return true;
-                    });
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_xml_name.js b/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_xml_name.js
deleted file mode 100644
index 09454e2..0000000
--- a/web/angular-web/src/main/webapp/app/directives/validators/jf_validator_xml_name.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * Validates an input to be valid XMLCName
- */
-export function jfValidatorXmlName(XmlNameDao, $q, $timeout) {
-    return {
-        restrict: 'A',
-        require: 'ngModel',
-        link: function jfValidatorXmlName(scope, element, attrs, ngModel) {
-
-            let xmlNameDao = XmlNameDao.getInstance();
-            ngModel.$asyncValidators.xmlName = validateXmlName;
-
-            function validateXmlName(modelValue, viewValue) {
-                var value = modelValue || viewValue;
-
-                if (!value) {
-                    return $q.when();
-                }
-
-                return xmlNameDao.get({xmlName: value}).$promise
-                    .then(function (result) {
-                        if (result.error) {
-                            return $q.reject();
-                        }
-                        return true;
-                    });
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/filters/artifactory.filters.module.js b/web/angular-web/src/main/webapp/app/filters/artifactory.filters.module.js
deleted file mode 100644
index a741457..0000000
--- a/web/angular-web/src/main/webapp/app/filters/artifactory.filters.module.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import {ReplaceCharacter} from './replace_character';
-import {FileSize} from './filesize';
-import {SplitWords} from './split_words';
-import {ParseLinks} from './parse_links';
-import {ReplaceStringForAol} from './replace_string_for_aol';
-
-export default angular.module('artifactory.filters', [])
-        .filter('replaceCharacter', ReplaceCharacter)
-        .filter('filesize', FileSize)
-        .filter('splitWords', SplitWords)
-        .filter('parseLinks', ParseLinks)
-        .filter('replaceStringForAol', ReplaceStringForAol);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/filters/filesize.js b/web/angular-web/src/main/webapp/app/filters/filesize.js
deleted file mode 100644
index bd03361..0000000
--- a/web/angular-web/src/main/webapp/app/filters/filesize.js
+++ /dev/null
@@ -1,11 +0,0 @@
-export function FileSize() {
-
-    return function(bytes, precision) {
-        if (bytes===0) return 'empty file'
-        if (isNaN(parseFloat(bytes)) || !isFinite(bytes)) return '-';
-        if (typeof precision === 'undefined') precision = 1;
-        var units = ['bytes', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
-            number = Math.floor(Math.log(bytes) / Math.log(1024));
-        return (bytes / Math.pow(1024, Math.floor(number))).toFixed(precision) +  ' ' + units[number];
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/filters/parse_links.js b/web/angular-web/src/main/webapp/app/filters/parse_links.js
deleted file mode 100644
index 346a93b..0000000
--- a/web/angular-web/src/main/webapp/app/filters/parse_links.js
+++ /dev/null
@@ -1,12 +0,0 @@
-export function ParseLinks() {
-
-    return function(str) {
-        return str.replace(/\[(.*?)\]/g, function (match) {
-            let linkData = match.substring(1, match.length - 1).split(',');
-            if (linkData.length == 2)
-                return '<a href="' + linkData[0].trim() + '" target="_blank">' + linkData[1].trim() + '</a>';
-            else
-                return match;
-        });
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/filters/replace_character.js b/web/angular-web/src/main/webapp/app/filters/replace_character.js
deleted file mode 100644
index 7ae9838..0000000
--- a/web/angular-web/src/main/webapp/app/filters/replace_character.js
+++ /dev/null
@@ -1,11 +0,0 @@
-export function ReplaceCharacter() {
-
-    return function(input, search, replace) {
-        if (input) {
-            let regex = new RegExp(search, 'g');
-            return input.replace(regex, replace);
-        }
-
-        return input;
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/filters/replace_string_for_aol.js b/web/angular-web/src/main/webapp/app/filters/replace_string_for_aol.js
deleted file mode 100644
index d9ee92b..0000000
--- a/web/angular-web/src/main/webapp/app/filters/replace_string_for_aol.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// TODO: pass in key to filter instead of the text
-const dictionary = {
-	'Import & Export': 'Import',
-	'Repositories Import & Export': 'Import Repositories'
-};
-
-export function ReplaceStringForAol(ArtifactoryFeatures) {
-
-    return function(str) {
-    	if (ArtifactoryFeatures.isAol()) {
-    		return dictionary[str] || str;
-    	}
-    	else {
-    		return str;
-    	}
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/filters/split_words.js b/web/angular-web/src/main/webapp/app/filters/split_words.js
deleted file mode 100644
index c38c5f5..0000000
--- a/web/angular-web/src/main/webapp/app/filters/split_words.js
+++ /dev/null
@@ -1,20 +0,0 @@
-export function SplitWords() {
-
-    return function(string) {
-        return splitWords(string);
-    }
-}
-
-/** Splits a camel-case or Pascal-case variable name into individual words.
- * @param {string} s
- * @returns {string[]}
- */
-function splitWords(str) {
-    return str
-        // insert a space between lower & upper
-        .replace(/([a-z])([A-Z])/g, '$1 $2')
-        // space before last upper in a sequence followed by lower
-        .replace(/\b([A-Z]+)([A-Z])([a-z])/, '$1 $2$3')
-        // uppercase the first character
-        .replace(/^./, function(str){ return str.toUpperCase(); })
-}
diff --git a/web/angular-web/src/main/webapp/app/layouts/application.html b/web/angular-web/src/main/webapp/app/layouts/application.html
deleted file mode 100644
index f0bb084..0000000
--- a/web/angular-web/src/main/webapp/app/layouts/application.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<div id="jf-full-page" ng-if="Base.footerData">
-    <div class="jf-layout-row">
-        <jf-header class="jf-layout-cell"></jf-header>
-    </div>
-    <div class="jf-layout-row">
-        <div class="jf-layout-cell">
-            <jf-messages></jf-messages>
-        </div>
-    </div>
-
-    <div class="jf-layout-row">
-        <div id="jf-viewport" class="jf-layout-cell">
-            <div id="jf-relative-viewport">
-                <div id="jf-main-nav">
-                    <jf-sidebar></jf-sidebar>
-                </div>
-                <!-- Main Content Area-->
-                <div id="jf-content">
-                    <jf-spinner domain="content"></jf-spinner>
-                    <ui-view></ui-view>
-                </div>
-            </div>
-        </div>
-    </div>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/layouts/login.html b/web/angular-web/src/main/webapp/app/layouts/login.html
deleted file mode 100644
index f43eec2..0000000
--- a/web/angular-web/src/main/webapp/app/layouts/login.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<div class="container-fluid">
-
-    <div class="row">
-        <jf-header hide-search="true"></jf-header>
-    </div>
-
-    <div class="row">
-
-
-        <!-- Main Content Area-->
-        <div class="col-lg-12">
-            <ui-view></ui-view>
-        </div>
-
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/models/admin_menu_items.js b/web/angular-web/src/main/webapp/app/models/admin_menu_items.js
deleted file mode 100644
index 9d51d2b..0000000
--- a/web/angular-web/src/main/webapp/app/models/admin_menu_items.js
+++ /dev/null
@@ -1,85 +0,0 @@
-export const AdminMenuItems = [
-    {
-        "label": "Repositories",
-        "state": "admin.repositories",
-        "subItems": [
-            {"label": "Local", "state": "admin.repositories.list", "stateParams": {"repoType": "local"}},
-            {"label": "Remote", "state": "admin.repositories.list", "stateParams": {"repoType": "remote"}},
-            {"label": "Virtual", "state": "admin.repositories.list", "stateParams": {"repoType": "virtual"}},
-            {"label": "Distribution", "state": "admin.repositories.list", "stateParams": {"repoType": "distribution"}},
-            {"label": "Layouts", "state": "admin.repositories.repo_layouts"}
-        ]
-    },
-
-    {
-        "label": "Configuration",
-        "state": "admin.configuration",
-        "subItems": [
-            {"label": "General", "state": "admin.configuration.general"},
-            {"label": "Licenses", "state": "admin.configuration.licenses", "feature": "licenses"},
-            {"label": "Governance", "state": "admin.configuration.black_duck", "feature": "blackduck"},
-            {"label": "Property Sets", "state": "admin.configuration.property_sets", "feature": "properties"},
-            {"label": "Proxies", "state": "admin.configuration.proxies", "feature": "proxies"},
-            {"label": "Reverse Proxy", "state": "admin.configuration.reverse_proxy", "feature": "reverse_proxies"},
-            {"label": "Mail", "state": "admin.configuration.mail", "feature": "mail"},
-            {"label": "High Availability", "state": "admin.configuration.ha", "feature": "highavailability"},
-            //{"label": "Bintray", "state": "admin.configuration.bintray"},
-            {"label": "Register License", "state": "admin.configuration.register_pro", "feature": "register_pro"}
-        ]
-    },
-
-    {
-        "label": "Security",
-        "state": "admin.security",
-        "subItems": [
-            {"label": "General", "state": "admin.security.general"},
-            {"label": "Users", "state": "admin.security.users"},
-            {"label": "Groups", "state": "admin.security.groups"},
-            {"label": "Permissions", "state": "admin.security.permissions"},
-            {"label": "LDAP", "state": "admin.security.ldap_settings"},
-            {"label": "Crowd / JIRA", "state": "admin.security.crowd_integration", "feature": "crowd"},
-            {"label": "SAML SSO", "state": "admin.security.saml_integration", "feature": "samlsso"},
-            {"label": "OAuth SSO", "state": "admin.security.oauth", "feature": "oauthsso"},
-            {"label": "HTTP SSO", "state": "admin.security.http_sso", "feature": "httpsso"},
-            {"label": "SSH Server", "state": "admin.security.ssh_server", "feature": "sshserver"},
-            {"label": "Signing Keys", "state": "admin.security.signing_keys", "feature": "signingkeys"}
-        ]
-    },
-
-    {
-        "label": "Services",
-        "state": "admin.services",
-        "subItems": [
-            {"label": "Backups", "state": "admin.services.backups", "feature": "backups"},
-            {"label": "Maven Indexer", "state": "admin.services.indexer", "feature": "indexer"}
-        ]
-
-    },
-
-    {
-        "label": "Import & Export",
-        "state": "admin.import_export",
-        "subItems": [
-            {"label": "Repositories", "state": "admin.import_export.repositories", "feature": "repositories"},
-            {"label": "System", "state": "admin.import_export.system", "feature": "system"}
-
-        ]
-
-    },
-
-    {
-        "label": "Advanced",
-        "state": "admin.advanced",
-        "subItems": [
-            {"label": "Support Zone", "state": "admin.advanced.support_page", "feature":"supportpage"},
-            {"label": "System Info", "state": "admin.advanced.system_info", "feature":"systeminfo"},
-            {"label": "System Logs", "state": "admin.advanced.system_logs"},
-            {"label": "Maintenance", "state": "admin.advanced.maintenance", "feature":"maintenance"},
-            {"label": "Storage", "state": "admin.advanced.storage_summary"},
-            {"label": "Config Descriptor", "state": "admin.advanced.config_descriptor", "feature":"configdescriptor"},
-            {"label": "Security Descriptor", "state": "admin.advanced.security_descriptor", "feature":"securitydescriptor"}
-
-        ]
-    }
-
-];
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/models/models.module.js b/web/angular-web/src/main/webapp/app/models/models.module.js
deleted file mode 100644
index 0d7ac76..0000000
--- a/web/angular-web/src/main/webapp/app/models/models.module.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import {AdminMenuItems} from './admin_menu_items';
-
-export default angular.module('models', [])
-        .value('AdminMenuItems', AdminMenuItems);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/services/advanced_string_match.js b/web/angular-web/src/main/webapp/app/services/advanced_string_match.js
deleted file mode 100644
index c2316ba..0000000
--- a/web/angular-web/src/main/webapp/app/services/advanced_string_match.js
+++ /dev/null
@@ -1,159 +0,0 @@
-function getMatchCount(str,match,searchInside = false) {
-    let i = 0;
-    while (str[i] && match[i] && str[i] === match[i]) i++;
-
-    let result;
-
-    if (i===0 && searchInside) {
-        let len = match.length;
-        let start = str.indexOf(match.substr(0,len));
-        while (start === -1 && len > 0) {
-            len--;
-            start = str.indexOf(match.substr(0,len));
-        }
-
-        if (start !== -1 && len > 1) {
-            i = start;
-            while (str[i] && match[i - start] && str[i] === match[i - start]) i++;
-            result = {
-                start: start,
-                length: i-start
-            }
-        }
-        else {
-            result = {
-                start: 0,
-                length: 0
-            }
-        }
-    }
-    else {
-        result = {
-            start: 0,
-            length: i
-        };
-    }
-
-    return result;
-}
-
-function doMatch(str, match) {
-    str=str.toLowerCase();
-    match=match.toLowerCase();
-    if (!match || !str) return {
-        matched: false,
-        segments: []
-    };
-    let index = str.indexOf(match);
-    if (index !== -1) {
-        return {
-            matched: true,
-            segments: [
-                {start: index, length: match.length}
-            ]
-        };
-    }
-    else {
-        let regexp = /\_|\-|\.|\/| /
-        let regexp_no_dot = /\_|\-|\/| /
-        let parts = match.indexOf('.') !== -1 ? str.split(regexp_no_dot) : str.split(regexp);
-        if (match.indexOf('.') !== -1) {
-            let tempParts = [];
-            parts.forEach((part) => {
-                if (part.indexOf('.') === -1) {
-                    tempParts.push(part);
-                }
-                else {
-                    let innerParts = part.split('.');
-                    innerParts = _.map(innerParts, (part)=>{return '.'+part});
-                    innerParts[0] = innerParts[0].substr(1); // we don't want '.' before the first entry
-                    tempParts = tempParts.concat(innerParts);
-                }
-            });
-            parts=tempParts;
-        }
-
-        match = match.split(regexp_no_dot).join('');
-        let gotMatch = false;
-        let pos = 0;
-        let segments = [];
-        let searchInside = false;
-        if (match[0] === '*') {
-            while (match[0] === '*') match = match.substr(1);
-        }
-        for (let i = 0; i < parts.length; i++) {
-            let matchCount = getMatchCount(parts[i], match, !gotMatch || searchInside);
-            if (matchCount.length !== 0) {
-                if (parts[i].startsWith('.')) pos--;
-                segments.push({
-                    start: pos + matchCount.start,
-                    length: matchCount.length
-                });
-                gotMatch = true;
-            }
-            match = match.substr(matchCount.length);
-
-            if (match[0] === '*') {
-                searchInside=true;
-                while (match[0] === '*') match = match.substr(1);
-                let newPart = parts[i].substr(matchCount.start + matchCount.length);
-                if (newPart) parts.splice(i+1,0,newPart);
-                else pos++;
-                pos+=matchCount.start + matchCount.length;
-            }
-            else {
-                if (matchCount.length !== 0) searchInside=false;
-                pos += parts[i].length + 1;
-            }
-
-            if (!match.length) break;
-        }
-        if (match.length) gotMatch = false;
-        return {
-            matched: gotMatch,
-            segments: gotMatch ? segments : []
-        };
-    }
-}
-
-function getHighlighted(text,segments,hlElemType,hlClass) {
-    if (!segments.length || !text) return text;
-    else {
-        let last = 0;
-        let highlighted = '';
-        for (let i in segments) {
-            if (text.substr(segments[i].start, segments[i].length)) {
-                highlighted += text.substr(last,segments[i].start-last);
-                highlighted += `<${hlElemType} class="${hlClass}">`;
-                highlighted += text.substr(segments[i].start, segments[i].length);
-                highlighted += `</${hlElemType}>`;
-                last = segments[i].start + segments[i].length;
-            }
-        }
-        highlighted += text.substr(last,text.length-last);
-
-        return highlighted;
-    }
-}
-
-function doHighlight(elem,segments,hlElemType = 'span',hlClass = 'highlight') {
-    let contents = elem.contents();
-    let textNode = _.findWhere(contents,{nodeType:3});
-    if (!textNode) {
-        for (let i = 0; i<contents.length; i++) {
-            textNode = _.findWhere(contents[i].childNodes,{nodeType:3});
-            if (textNode) break;
-        }
-    }
-    if (textNode) {
-        let highlighted = getHighlighted(textNode.nodeValue,segments,hlElemType,hlClass);
-        $(textNode).replaceWith(highlighted);
-    }
-}
-
-export function AdvancedStringMatch() {
-    return {
-        match: (str, match) => doMatch(str,match),
-        highlight: (elem,segments,hlElemType,hlClass) => doHighlight(elem,segments,hlElemType,hlClass)
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/services/artifact_actions.js b/web/angular-web/src/main/webapp/app/services/artifact_actions.js
deleted file mode 100644
index 6d68bca..0000000
--- a/web/angular-web/src/main/webapp/app/services/artifact_actions.js
+++ /dev/null
@@ -1,402 +0,0 @@
-import API from "../constants/api.constants";
-import EVENTS from "../constants/artifacts_events.constants";
-export class ArtifactActions {
-    constructor(ArtifactoryEventBus, ArtifactActionsDao, StashResultsDao, $state, $window, $rootScope, $timeout, ArtifactoryNotifications, FooterDao, $sce,
-                ArtifactoryModal, selectTargetPath, selectDeleteVersions, PushToBintrayModal, DistributionDao, $q, artifactoryIFrameDownload, NativeBrowser) {
-        this.$q = $q;
-        this.$state = $state;
-        this.$timeout = $timeout;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this.footerDao = FooterDao;
-        this.artifactActionsDao = ArtifactActionsDao;
-        this.stashResultsDao = StashResultsDao;
-        this.pushToBintrayModal = PushToBintrayModal;
-        this.distributionDao = DistributionDao;
-        this.modal = ArtifactoryModal;
-        this.selectTargetPath = selectTargetPath;
-        this.selectDeleteVersions = selectDeleteVersions;
-        this.$window = $window;
-        this.$rootScope = $rootScope;
-        this.iframeDownload = artifactoryIFrameDownload;
-        this.nativeBrowser = NativeBrowser;
-        this.$sce = $sce;
-    }
-
-    perform(actionObj, node) {
-        return this['_do' + actionObj.name](node);
-    }
-
-    _doRefresh(node) {
-        this.artifactoryEventBus.dispatch(EVENTS.ACTION_REFRESH, node);
-    }
-
-    _doCopy(node, useNodePath) {
-
-        let target;
-        let onActionDone;
-        onActionDone = (retData) => {
-            target = retData.target;
-            this._performActionInServer('copy', node, target)
-                    .then(()=>{
-                        retData.onSuccess().then((response) => {
-                            this.artifactoryEventBus.dispatch(EVENTS.ACTION_COPY,{node: node, target: target});
-                        });
-                    })
-                    .catch((err)=>{
-                        retData.onFail(err.data.errors).then(onActionDone);
-                    });
-        }
-        this.selectTargetPath('copy', node, useNodePath).then(onActionDone)
-    }
-
-    _doMove(node, useNodePath) {
-        let target;
-        let onActionDone;
-        onActionDone = (retData) => {
-            target = retData.target;
-            this._performActionInServer('move', node, target)
-                    .then((data)=>{
-                        retData.onSuccess().then((response) => {
-                            this.artifactoryEventBus.dispatch(EVENTS.ACTION_MOVE,{node: node, target: target});
-                        });
-                    })
-                    .catch((err)=>{
-                        retData.onFail(err.data.errors).then(onActionDone);
-                    });
-        }
-        this.selectTargetPath('move', node, useNodePath).then(onActionDone);
-    }
-
-
-    _doStashAction(node,action) {
-        let target;
-        let onActionDone;
-        let dryRun;
-        onActionDone = (retData) => {
-            target = retData.target;
-            this.stashResultsDao[action]({name: 'stash', repoKey: target.targetRepoKey},{}).$promise
-                .then(()=>{
-                    retData.onSuccess().then((response) => {
-                        this.artifactoryEventBus.dispatch(EVENTS.ACTION_MOVE_STASH,{node: node, target:{targetPath: '/', targetRepoKey: target.targetRepoKey}});
-                    });
-                })
-                .catch((err)=>{
-                    this.artifactoryEventBus.dispatch(EVENTS.ACTION_REFRESH_STASH);
-                    retData.onFail(err.data.errors).then(onActionDone);
-                });
-        };
-
-        dryRun = ()=>{
-            let modalScope = dryRun.scope;
-            this.stashResultsDao['silent'+action.charAt(0).toUpperCase()+action.substring(1)]({name: 'stash', repoKey: modalScope.target.repoKey, dryRun: true},{}).$promise
-                    .then((response)=>{
-                        modalScope.resultError = false;
-                        modalScope.dryRunResults = [response.info];
-                    })
-                    .catch((response) => {
-                        modalScope.resultError = true;
-                        modalScope.dryRunResults = response.data.errors;
-                    });
-        };
-
-        this.selectTargetPath(action+'Stash', node, false, dryRun).then(onActionDone)
-    }
-
-    _doCopyStash(node) {
-        this._doStashAction(node,'copy');
-    }
-
-    _doMoveStash(node) {
-        this._doStashAction(node,'move');
-    }
-
-    _doDiscardFromStash(node) {
-        let doAction = () => {
-            this.stashResultsDao.discard({
-                name:'stash',
-                repoKey:node.data.repoKey,
-                path:node.data.path
-            },{}).$promise.then((res)=>{
-                        if (res.status === 200) {
-                            this.artifactoryEventBus.dispatch(EVENTS.ACTION_DISCARD_FROM_STASH,node);
-                        }
-                    });
-        };
-
-        if (!node.alreadyDeleted) {
-            this.modal.confirm('Are you sure you wish to discard \'' + node.text + '\' from stashed search results?',
-                    'Discard from stash', {confirm: 'Discard'})
-                    .then(doAction);
-        }
-        else doAction();
-
-
-    }
-
-    _doDiscardStash() {
-        this.modal.confirm('Are you sure you wish to discard stashed search results?','Discard search results', {confirm: 'Discard'})
-                .then(() => {
-                    this.stashResultsDao.delete({name:'stash'}).$promise.then(()=>{
-                        this.artifactoryEventBus.dispatch(EVENTS.ACTION_DISCARD_STASH);
-                    });
-                });
-    }
-
-    _doShowInTree(node) { //stash
-        this.artifactoryEventBus.dispatch(EVENTS.ACTION_EXIT_STASH,node);
-    }
-
-    _doUploadToBintray(node) {
-        this.pushToBintrayModal.launchModal(node.type === 'docker' ? 'docker' : 'artifact', {
-            repoPath: node.data.repoKey + ':' + node.data.path
-        });
-    }
-
-    _doRedistribute(node) {
-        this._doDistribute(node, true);
-    }
-    _doDistribute(node,redistribute = false) {
-
-
-        this.distributionDao.getAvailableDistributionRepos({}).$promise.then((data)=>{
-
-            let modalInstance;
-            this.distributeModalScope = this.$rootScope.$new();
-
-            this.distributeModalScope.title = "Distribute " + node.text;
-
-            this.distributeModalScope.data = {};
-
-            if (redistribute) {
-                this.distributeModalScope.distributionRepositoriesOptions = [node.data.repoKey];
-                this.distributeModalScope.data.selectedRepo = node.data.repoKey;
-                this.distributeModalScope.redistribute = true;
-            }
-            else {
-                this.distributeModalScope.distributionRepositoriesOptions = _.map(data, 'repoKey');
-                this.distributeModalScope.data.selectedRepo = null;
-            }
-
-            this.distributeModalScope.data.async = true;
-            this.distributeModalScope.data.publish = true;
-            this.distributeModalScope.data.overrideExistingFiles = false;
-
-            this.distributeModalScope.distribute = () => {
-                this.distributionDao.distributeArtifact({
-                    targetRepo: this.distributeModalScope.data.selectedRepo,
-                    async: this.distributeModalScope.data.async,
-                    publish: this.distributeModalScope.data.publish,
-                    overrideExistingFiles: this.distributeModalScope.data.overrideExistingFiles
-                }, {repoKey: node.data.repoKey, path: node.data.path}).$promise.then((res)=>{
-                    // Success
-                    modalInstance.close();
-                });
-            };
-
-            modalInstance = this.modal.launchModal('distribute_modal', this.distributeModalScope, 'sm');
-        });
-
-    }
-
-    _doCopyContent(node) {
-        this._doCopy(node, false);
-    }
-
-    _doMoveContent(node) {
-        this._doMove(node, false);
-    }
-
-    _doWatch(node) {
-        this._performActionInServer('watch', node, {}, {param: 'watch'})
-                .then((response) => {
-                    this.artifactoryEventBus.dispatch(EVENTS.ACTION_WATCH, node);
-                });
-    }
-
-    _doUnwatch(node) {
-        this._performActionInServer('watch', node, {}, {param: 'unwatch'})
-                .then((response) => {
-                    this.artifactoryEventBus.dispatch(EVENTS.ACTION_UNWATCH, node);
-                });
-    }
-
-    _doView(node) {
-        this._performActionInServer('view', node)
-                .then((response) => {
-                    this.modal.launchCodeModal(node.data.text, response.data.fileContent,
-                            {name: node.data.mimeType})
-                });
-    }
-
-    _doDeletePermanently(node) {
-        this._doDelete(node);
-    }
-
-    _doDelete(node) {
-        let permanent = this.footerDao.getInfo().trashDisabled || node.data.isInTrashcan();
-
-        //allowPermDeletes is disabled for now (30.12.15)
-        let allowPerm = false;//this.footerDao.getInfo().allowPermDeletes;
-
-        let onPermChange = (perm, scope) => {
-            scope.content = this.$sce.trustAsHtml('Are you sure you wish to' + (perm ? ' <span class="highlight-alert">permanently</span> ' : ' ') + 'delete this file?');
-        };
-
-        this.modal.confirm('Are you sure you wish to' + (permanent ? ' <span class="highlight-alert">permanently</span> ' : ' ') + 'delete this file?', 'Delete ' + node.data.text,
-                {confirm: 'Delete'},allowPerm ? "Delete permanently" : undefined, onPermChange)
-                .then((permDelete) => {
-                    this._performActionInServer('delete', node, permDelete ? {permDelete: permDelete} : undefined).then(()=>{
-                        this.artifactoryEventBus.dispatch(EVENTS.ACTION_DELETE, node);
-                    })
-
-                })
-    }
-
-    _doDeleteContent(node) {
-        let permanent = this.footerDao.getInfo().trashDisabled;
-
-        this.modal.confirm('Are you sure you want to delete the content of this repository? All artifacts will be' + (permanent ? ' <span class="highlight-alert">permanently</span> ' : ' ') + 'deleted.', 'Delete Content Of \'' + node.data.text +'\'', {confirm: 'Delete Content'})
-                .then(() => this._performActionInServer('delete', node))
-                .then((response) => this.artifactoryEventBus.dispatch(EVENTS.ACTION_DELETE, node));
-    }
-
-    _doDeleteVersions(node) {
-        var versions;
-        this.selectDeleteVersions(node)
-                .then((_versions) => {
-                    versions = _versions;
-                    return this.modal.confirm('Are you sure you wish to delete '+_versions.length+' selected versions?\n\nThis folder may contain artifacts that are part of the result of or used as dependencies in published build(s).','Delete '+_versions.length+' Versions')
-                })
-                .then(() => {
-                    let promise = this._performActionInServer('deleteversions', null, versions);
-                    promise.then(()=>{
-                        this._doRefresh(node);
-                    });
-                    return promise;
-                });
-    }
-
-    _doZap(node) {
-        this._performActionInServer('zap', node).then((data)=> {
-//            console.log(data);
-        })
-    }
-
-    _doZapCaches(node) {
-        this._performActionInServer('zapVirtual', node).then((data)=> {
-            // console.log(data);
-        })
-    }
-
-    _doRecalculateIndex(node) {
-//        console.log('recalculate index', node);
-        this._performActionInServer('calculateIndex', node,
-                {"type": node.data.repoPkgType, "repoKey": node.data.repoKey}).then((data)=> {
-//            console.log(data);
-        })
-    }
-
-    _doRestoreToOriginalPath(node) {
-        return this._doRestore(node,false)
-    }
-
-    _doRestore(node,chooseTarget = true) {
-
-        let defer = this.$q.defer();
-
-        let restoreTarget = {
-            targetPath: node.data.path.indexOf('/') !== -1 ? node.data.path.substr(node.data.path.indexOf('/')) : '/',
-            targetRepoKey: node.data.path.indexOf('/') !== -1 ? node.data.path.substr(0,node.data.path.indexOf('/')) : node.data.path
-        };
-
-        let onActionDone = (retData) => {
-            let target = retData.target;
-            this._performActionInServer('restore', node, target)
-                .then((data)=>{
-                    if (retData.onSuccess) retData.onSuccess().then((response) => {
-                        this.artifactoryEventBus.dispatch(EVENTS.ACTION_MOVE,{node: node, target: target});
-                        defer.resolve();
-                    });
-                    else {
-                        defer.resolve();
-                    }
-                })
-                .catch((err)=>{
-                    if (retData.onFail) retData.onFail(err.data.errors).then(onActionDone);
-                    defer.reject();
-                });
-        }
-        if (chooseTarget) {
-            this.selectTargetPath('restore', node, false, false, restoreTarget).then(onActionDone);
-        }
-        else {
-            onActionDone({target: restoreTarget})
-        }
-
-        return defer.promise;
-/*
-        this.modal.confirm('Are you sure you wish to restore this file?', 'Restore ' + node.data.text,
-            {confirm: 'Restore'})
-            .then(() => this._performActionInServer('restore', node,restoreTarget))
-            .then((response) => this.artifactoryEventBus.dispatch(EVENTS.ACTION_MOVE,{node: node, target: restoreTarget}));
-*/
-    }
-
-    _doEmptyTrash(node) {
-
-        this.modal.confirm('Are you sure you want to empty the trash can?', 'Empty Trash',
-            {confirm: 'Empty Trash'})
-            .then(() => this._performActionInServer('emptytrash', node))
-            .then((response) => this.artifactoryEventBus.dispatch(EVENTS.TREE_REFRESH, node));
-    }
-
-    _doSearchTrash(node) {
-        this.$state.go('artifacts.browsers.search',{'searchType':'trash'});
-    }
-
-    _doDownloadFolder(node) {
-        this.artifactActionsDao.performGet({
-            action: 'downloadfolderinfo',
-            path: node.data.path,
-            repoKey: node.data.repoKey
-        }).$promise.then((data)=>{
-            let modalInstance;
-            let modalScope = this.$rootScope.$new();
-            modalScope.totalSize = data.data.sizeMB;
-            modalScope.filesCount = data.data.totalFiles;
-            modalScope.folderName = node.data.text;
-            modalScope.archiveTypes = ['zip','tar','tar.gz','tgz'];
-            modalScope.selection = {archiveType: 'zip'};
-            modalScope.download = () => {
-                this.iframeDownload(`${API.API_URL}/artifactactions/downloadfolder?repoKey=${node.data.repoKey}&path=${node.data.path}&archiveType=${modalScope.selection.archiveType}`,'There are too many folder download requests currently running, try again later.');
-                modalInstance.close();
-            };
-            modalScope.cancel = () => modalInstance.close();
-
-            modalInstance = this.modal.launchModal('download_folder_modal', modalScope, 'sm');
-        });
-
-    }
-
-    _doNativeBrowser(node) {
-        this.$window.open(this.nativeBrowser.pathFor(node.data),"_blank");
-    }
-
-    // Do the actual action on the server via the DAO:
-    _performActionInServer(actionName, node, extraData = {}, extraParams = {}) {
-        let data;
-        if (node) {
-            data = angular.extend({
-                repoKey: node.data.repoKey,
-                path: node.data.path,
-                param: extraParams.param
-            }, extraData);
-        }
-        else {
-            data = extraData;
-        }
-        var params = angular.extend({action: actionName}, extraParams);
-        return this.artifactActionsDao.perform(params, data).$promise;
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/services/artifactory.services.module.js b/web/angular-web/src/main/webapp/app/services/artifactory.services.module.js
deleted file mode 100644
index 3d5c68c..0000000
--- a/web/angular-web/src/main/webapp/app/services/artifactory.services.module.js
+++ /dev/null
@@ -1,50 +0,0 @@
-import ApiConstants                             from '../constants/api.constants';
-import {ArtifactoryNotifications}               from './artifactory_notifications';
-import {ArtifactoryCookies}                     from './artifactory_cookies';
-import {ArtifactoryHttpClient}                  from './artifactory_http_client';
-import {ArtifactoryStorage}                     from './artifactory_storage';
-import {ArtifactoryEventBus}                    from './artifactory_eventBus';
-import {ArtifactoryXmlParser}                   from './artifactory_xml_parser';
-import {UserFactory}                            from './user';
-import {artifactoryDownload}                    from './artifactory_download';
-import {artifactoryIFrameDownload}              from './artifactory_iframe_download';
-import {ArtifactoryState}                       from './artifactory_state';
-import {artifactorySessionInterceptor}          from './artifactory_session_interceptor';
-import {artifactoryDebugInterceptor}            from './artifactory_debug_interceptor';
-import {artifactorySpinnerInterceptor}          from './artifactory_spinner_interceptor';
-import {artifactoryMessageInterceptor}          from './artifactory_message_interceptor';
-import {artifactoryServerErrorInterceptor}      from './artifactory_server_error_interceptor';
-import {ArtifactoryModelSaverFactory}           from './artifactory_model_saver';
-import {ArtifactoryFeatures}                    from './artifactory_features';
-import {NativeBrowser}                          from './native_browser';
-import {ArtifactActions}                        from './artifact_actions';
-import {SetMeUpModal}                           from './set_me_up_modal';
-import {parseUrl}                               from './parse_url';
-import {recursiveDirective}                     from './recursive_directive';
-import {AdvancedStringMatch}                    from './advanced_string_match';
-
-angular.module('artifactory.services', ['ui.router', 'artifactory.ui_components', 'toaster'])
-        .constant('RESOURCE', ApiConstants)
-        .service('ArtifactoryCookies', ArtifactoryCookies)
-        .service('ArtifactoryNotifications', ArtifactoryNotifications)
-        .service('ArtifactoryHttpClient', ArtifactoryHttpClient)
-        .service('ArtifactoryStorage', ArtifactoryStorage)
-        .service('ArtifactoryEventBus', ArtifactoryEventBus)
-        .service('ArtifactoryXmlParser', ArtifactoryXmlParser)
-        .service('User', UserFactory)
-        .service('ArtifactoryState', ArtifactoryState)
-        .factory('artifactoryDownload', artifactoryDownload)
-        .factory('artifactoryIFrameDownload', artifactoryIFrameDownload)
-        .factory('artifactorySessionInterceptor', artifactorySessionInterceptor)
-        .factory('artifactoryDebugInterceptor', artifactoryDebugInterceptor)
-        .factory('artifactoryMessageInterceptor', artifactoryMessageInterceptor)
-        .factory('artifactoryServerErrorInterceptor', artifactoryServerErrorInterceptor)
-        .factory('ArtifactoryModelSaver', ArtifactoryModelSaverFactory)
-        .factory('artifactorySpinnerInterceptor', artifactorySpinnerInterceptor)
-        .service('NativeBrowser', NativeBrowser)
-        .service('ArtifactoryFeatures', ArtifactoryFeatures)
-        .service('ArtifactActions', ArtifactActions)
-        .service('SetMeUpModal', SetMeUpModal)
-        .factory('parseUrl', parseUrl)
-        .factory('recursiveDirective', recursiveDirective)
-        .service('AdvancedStringMatch', AdvancedStringMatch)
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/services/artifactory_cookies.js b/web/angular-web/src/main/webapp/app/services/artifactory_cookies.js
deleted file mode 100644
index 18a6644..0000000
--- a/web/angular-web/src/main/webapp/app/services/artifactory_cookies.js
+++ /dev/null
@@ -1,11 +0,0 @@
-export class ArtifactoryCookies {
-
-    constructor($cookies) {
-        this.cookies = $cookies;
-    }
-
-    getCookie(cookieName) {
-        return this.cookies[cookieName]
-    }
-
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/services/artifactory_debug_interceptor.js b/web/angular-web/src/main/webapp/app/services/artifactory_debug_interceptor.js
deleted file mode 100644
index 5f9b167..0000000
--- a/web/angular-web/src/main/webapp/app/services/artifactory_debug_interceptor.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * returns a function that accept some custom info
- * and returns the interceptor object.
- * intent to be injected and use in DAO's
- *
- * @returns {Function}
- */
-window._debugOn = function() {
-    localStorage._debug = true;
-}
-window._debugOff = function() {
-    delete localStorage._debug;
-}
-export function artifactoryDebugInterceptor($injector) {
-    /**
-     * accept an additional info that can be used
-     * in the returned interceptor object
-     *
-     * @returns {{response: Function, responseError: Function}}
-     */
-    var $q;
-    var RESOURCE;
-    function debugResponse(res) {
-        if (!localStorage._debug) return;
-        RESOURCE = RESOURCE || $injector.get('RESOURCE');
-        var apiRequest = _.contains(res.config.url, RESOURCE.API_URL);
-
-        if (apiRequest) {
-            console.log("========================");
-            console.log("URL:      ",res.config.url);
-            console.log("METHOD:   ",res.config.method);
-            console.log("DATA:     ",res.config.data);
-            console.log("Status:   ",res.status);
-            console.log("Response: ", res.data);
-            console.log("========================");
-        }
-    }
-    function response(res) {
-        debugResponse(res);
-        return res;
-    }
-    function responseError(res) {
-        $q = $q || $injector.get('$q');
-        debugResponse(res);
-        return $q.reject(res);
-    }
-    return {
-        response: response,
-        responseError: responseError
-    };
-}
diff --git a/web/angular-web/src/main/webapp/app/services/artifactory_download.js b/web/angular-web/src/main/webapp/app/services/artifactory_download.js
deleted file mode 100644
index 1ecdc8c..0000000
--- a/web/angular-web/src/main/webapp/app/services/artifactory_download.js
+++ /dev/null
@@ -1,5 +0,0 @@
-export function artifactoryDownload() {
-    return function(url) {
-        document.location = url;
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/services/artifactory_eventBus.js b/web/angular-web/src/main/webapp/app/services/artifactory_eventBus.js
deleted file mode 100644
index f49438e..0000000
--- a/web/angular-web/src/main/webapp/app/services/artifactory_eventBus.js
+++ /dev/null
@@ -1,104 +0,0 @@
-import {EVENTS_NAMES}     from '../constants/artifacts_events.constants';
-import {COMMON_EVENTS_NAMES}     from '../constants/common_events.constants';
-/**
- * Service for components communication
- */
-export class ArtifactoryEventBus {
-
-    /**
-     * init an empty map
-     */
-    constructor() {
-        this._listeners = Object.create(null);
-    }
-
-
-    _randomId() {
-        return Math.floor((Math.random() * 100000000000) + 1);
-    }
-
-     /**
-     *
-     * push a callback to the event name array is exist.
-     * if the event doesn't exist, create this key and
-     * init an empty array for it.
-     *
-     * @param {string / array(string)} eventNames - single event or array of events
-     * @param {Function} callback
-     * @returns {Deregister} the deregistration function
-     */
-    register(eventNames, callback) {
-         if (_.isArray(eventNames)) {
-             return eventNames.map((eventName) => this._registerSingleEvent(eventName, callback));
-         }
-         else {
-             return this._registerSingleEvent(eventNames, callback);
-         }
-     }
-
-    _registerSingleEvent(eventName, callback) {
-        this._verifyEventExists(eventName);
-        this._listeners[eventName] = this._listeners[eventName] || [];
-        let listener = {
-            _callback: callback,
-            _id: this._randomId()
-        };
-        this._listeners[eventName].push(listener);
-
-        return () => {
-            this._remove(eventName, listener._id);
-        }
-    }
-
-    /**
-     * Registers a callback and makes sure that it deregisters on scope destroy
-     */
-    registerOnScope(scope, eventNames, callback) {
-        let deregisters = this.register(eventNames, callback);
-        if (!_.isArray(deregisters)) deregisters = [deregisters];
-        scope.$on('$destroy', () => {
-            deregisters.forEach((deregister) => deregister());
-        });
-    }
-
-    /**
-     *
-     * invoke all the callbacks in the array under the
-     * event key. throw an error if the event key doesn't
-     * exist
-     *
-     * @param {string} eventName
-     */
-    dispatch(eventName, payload) {
-        this._verifyEventExists(eventName);
-        if(this._listeners[eventName]) {
-            this._listeners[eventName].forEach( (listener) => listener._callback(payload) )
-        }
-    }
-
-    _verifyEventExists(eventName) {
-        if (!EVENTS_NAMES[eventName] && !COMMON_EVENTS_NAMES[eventName]) throw new Error('There are no events registered under the name ' + eventName);
-    }
-
-    /**
-     *
-     * remove the callback from the array under the
-     * event name key if exist.
-     * throw an error if the event key doesn't exist
-     *
-     * @param {string} eventName
-     * @param {Number} index
-     */
-    _remove(eventName, id) {
-        if(this._listeners[eventName] == 'undefined') {
-            throw new Error('This event does not exist');
-        }
-        if(!_.findWhere(this._listeners[eventName], {_id: id})) {
-            throw new Error('This callback is not registered under this event name')
-        }
-
-        _.remove(this._listeners[eventName], (listener) => {
-            return listener._id == id;
-        })
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/services/artifactory_features.js b/web/angular-web/src/main/webapp/app/services/artifactory_features.js
deleted file mode 100644
index 2dfcb1a..0000000
--- a/web/angular-web/src/main/webapp/app/services/artifactory_features.js
+++ /dev/null
@@ -1,325 +0,0 @@
-// For debugging only:
-window._aolSimulate = function (value) {
-    localStorage._aol = value ? "true" : "false";
-}
-window._aolOff = function () {
-    delete localStorage._aol;
-}
-window._licenseSimulate = function (value) {
-    localStorage._license = value;
-}
-window._licenseOff = function () {
-    delete localStorage._license;
-}
-
-// Order of license levels
-const LICENSES_LEVELS = {
-    'OSS': 1,
-    'PRO': 2,
-    'ENT': 3
-}
-
-// Minimum license needed per feature
-export const FEATURES = {
-    // This is the default for all other features:
-    'default': {
-        license: 'OSS'
-    },
-
-    // features:
-    'stash': {
-        license: 'PRO',
-        label: 'Smart search',
-        path: 'search'
-    },
-
-    'properties': {
-        license: 'PRO',
-        label: 'Properties',
-        path: 'properties'
-    },
-    'builds': {
-        license: 'PRO',
-        label: 'Builds',
-        path: 'build'
-    },
-
-    'watches': {
-        license: 'PRO',
-        label: 'Watches',
-        path: 'watches'
-    },
-    'diff': {
-        license: 'PRO',
-        label: 'Build Diff',
-        path: 'build'
-    },
-
-    'licenses': {
-        license: 'PRO',
-        label: 'Licenses',
-        path: 'license'
-    },
-    'blackduck': {
-        license: 'PRO',
-        label: 'governance',
-        path: 'blackduck'
-    },
-    'publishedmodule': {
-        license: 'PRO',
-        label: 'Published Module',
-        path: 'build'
-    },
-
-    'highavailability': {
-        license: 'ENT',
-        label: 'High Availability',
-        path: 'ha'
-    },
-    'crowd': {
-        license: 'PRO',
-        label: 'Crowd',
-        path: 'sso'
-    },
-    'samlsso': {
-        license: 'PRO',
-        label: 'Saml & SSO',
-        path: 'sso'
-    },
-    'oauthsso': {
-        license: 'PRO',
-        label: 'OAuth SSO',
-        path: 'sso' // ???
-    },
-    'httpsso': {
-        license: 'PRO',
-        label: 'Http SSO',
-        path: 'sso'
-    },
-    'signingkeys': {
-        license: 'PRO',
-        label: 'Signing Keys & WebStart',
-        path: 'webstart'
-    },
-
-    'replications': {
-        license: 'PRO',
-        label: 'Replications',
-        path: 'replications'
-    },
-
-    // repo types:
-    'nuget': {
-        license: 'PRO',
-        label: 'NuGet',
-        path: 'nuget'
-    },
-    'gems': {
-        license: 'PRO',
-        label: 'Gems',
-        path: 'gems'
-    },
-    'ldap': {
-        license: 'PRO',
-        label: 'LDAP Groups',
-        path: 'ldap'
-    },
-    'npm': {
-        license: 'PRO',
-        label: 'Npm',
-        path: 'npm'
-    },
-    'bower': {
-        license: 'PRO',
-        label: 'Bower',
-        path: 'bower'
-    },
-    'cocoapods': {
-        license: 'PRO',
-        label: 'CocoaPods',
-        path: 'cocoapods'
-    },
-    'debian': {
-        license: 'PRO',
-        label: 'Debian',
-        path: 'debian'
-    },
-    'distribution': {
-        license: 'OSS',
-        label: 'Distribution Repository',
-        path: 'distribution'
-    },
-    'distribution-map-properties': {
-        license: 'PRO',
-        label: 'Map Properties to Bintray Version Attributes'
-    },
-    'opkg': {
-        license: 'PRO',
-        label: 'Opkg',
-        path: 'opkg'
-    },
-    'pypi': {
-        license: 'PRO',
-        label: 'pypi',
-        path: 'pypi'
-    },
-    'docker': {
-        license: 'PRO',
-        label: 'Docker',
-        path: 'docker'
-    },
-    'vagrant': {
-        license: 'PRO',
-        label: 'Vagrant',
-        path: 'vagrant'
-    },
-    'gitlfs': {
-        license: 'PRO',
-        label: 'GitLfs',
-        path: 'gitlfs'
-    },
-    'yum': {
-        license: 'PRO',
-        label: 'Yum',
-        path: 'yum'
-    },
-    'vcs': {
-        license: 'PRO',
-        label: 'VCS',
-        path: 'vcs'
-    },
-    'register_pro': {
-        license: 'PRO',
-        label: 'Register Pro',
-        path: 'register pro'
-    },
-    'p2': {
-        license: 'PRO',
-        label: 'P2',
-        path: 'p2'
-    },
-    'sha256': {
-        license: 'PRO',
-        label: 'Sha256 Calculation',
-        path: 'sha256'
-    },
-    'supportpage': {
-        license: 'PRO',
-        label: 'Support Page'
-    },
-    'reverse_proxies': {
-        license: 'PRO',
-        label: 'Reverse Proxies'
-    },
-    'sshserver': {
-        license: 'OSS',
-        label: 'SSH Authentication'
-    }
-};
-
-// Features that are hidden for AOL
-export const HIDDEN_AOL_FEATURES = [
-    'backups',
-    'highavailability',
-    'httpsso',
-    'proxies',
-    'register_pro',
-    'indexer',
-    'services',
-    'systeminfo',
-    'maintenance',
-    'configdescriptor',
-    'securitydescriptor',
-    'system',
-    'mail',
-    'supportpage',
-    'reverse_proxies',
-    'sshserver'
-];
-
-// Features that are not hidden for dedicated AOL
-export const SHOW_ON_DEDICATED_AOL = [
-    'indexer'
-];
-
-
-// Features that are hidden for OSS
-export const HIDDEN_OSS_FEATURES = [
-    'register_pro'
-];
-
-// Service for accessing allowed features and licenses
-export class ArtifactoryFeatures {
-    constructor(FooterDao) {
-        this.footerDao = FooterDao;
-        this.footerDao.get(true);
-    }
-
-    getAllowedLicense(featureName) {
-        featureName = featureName && featureName.toLowerCase();
-        let feature = FEATURES[featureName] || FEATURES['default'];
-        return feature.license;
-    }
-
-    isEnabled(feature) {
-        if (!feature) {
-            return true;
-        }
-        let allowedLicense = this.getAllowedLicense(feature);
-        let currentLicense = this.getCurrentLicense();
-        return LICENSES_LEVELS[currentLicense] >= LICENSES_LEVELS[allowedLicense];
-    }
-
-    isDisabled(feature) {
-        return !this.isEnabled(feature);
-    }
-
-    isHidden(feature) {
-        if (!feature) {
-            return false;
-        }
-        feature = feature.toLowerCase();
-        return (this.isAol() && _.contains(HIDDEN_AOL_FEATURES, feature) && !(this.isDedicatedAol() && _.contains(SHOW_ON_DEDICATED_AOL, feature))) ||
-               (this.isOss() && _.contains(HIDDEN_OSS_FEATURES, feature));
-    }
-
-
-    isVisible(feature) {
-        return !this.isHidden(feature);
-    }
-
-    isAol() {
-        if (localStorage._aol != undefined) {
-            return localStorage._aol === "true";
-        } // For debugging only
-        return this.footerDao.getInfo() && this.footerDao.getInfo().isAol;
-    }
-
-    isDedicatedAol() {
-        return this.footerDao.getInfo() && this.footerDao.getInfo().isDedicatedAol;
-    }
-
-    isGlobalRepoEnabled() {
-        return this.footerDao.getInfo() && this.footerDao.getInfo().globalRepoEnabled;
-    }
-
-    getCurrentLicense() {
-        return this.footerDao.getInfo() && this.footerDao.getInfo().versionID;
-    }
-
-    isOss() {
-        return this.getCurrentLicense() == 'OSS';
-    }
-
-    getFeatureName(feature) {
-        feature = feature && feature.toLowerCase();
-        return FEATURES[feature].label;
-    }
-
-    getFeatureLink(feature) {
-        feature = feature && feature.toLowerCase();
-        if (FEATURES[feature] && FEATURES[feature].path) {
-            return `http://service.jfrog.org/artifactory/addons/info/${ FEATURES[feature].path }`;
-        }
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/services/artifactory_http_client.js b/web/angular-web/src/main/webapp/app/services/artifactory_http_client.js
deleted file mode 100644
index 1c1d611..0000000
--- a/web/angular-web/src/main/webapp/app/services/artifactory_http_client.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * wrapper around angular $http service
- */
-import RC from '../constants/api.constants'
-export class ArtifactoryHttpClient {
-
-    constructor($http, RESOURCE) {
-        this.http = $http;
-        this.baseUrl = RESOURCE.API_URL;
-        this.config = {
-            headers: {'Content-Type': 'application/json'}
-        };
-    }
-
-    post(api, data, config = {}) {
-        return this.http.post(this.baseUrl + api, data, angular.extend(this.config, config));
-    }
-
-    put(api, data, config = {}) {
-        return this.http.put(this.baseUrl + api, data, angular.extend(this.config, config));
-    }
-
-    get(api, config = {}) {
-        return this.http.get(this.baseUrl + api, angular.extend(this.config, config));
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/services/artifactory_iframe_download.js b/web/angular-web/src/main/webapp/app/services/artifactory_iframe_download.js
deleted file mode 100644
index 459f7e3..0000000
--- a/web/angular-web/src/main/webapp/app/services/artifactory_iframe_download.js
+++ /dev/null
@@ -1,29 +0,0 @@
-export function artifactoryIFrameDownload(ArtifactoryNotifications, $timeout) {
-    return function(url,defaultErrorMessage) {
-        let iframe=$('<iframe style="display: none">');
-        iframe.load((event)=>{
-            let response,defaultMessage;
-            try {
-                response = $(event.target).contents().find('pre').text();
-            }
-            catch(e) { //workaround for ie .contents() ACCESS DENIED error
-                defaultMessage = defaultErrorMessage || 'Something went wrong.';
-            }
-            if (defaultMessage || response) {
-                let message = defaultMessage || JSON.parse(JSON.parse(response).errors[0].message).error;
-                $timeout(()=>{
-                    ArtifactoryNotifications.create({error: message});
-                    if (iframe.parent().length) iframe.remove();
-                });
-            }
-        });
-
-        iframe.ready(() => {
-            $timeout(()=>{
-                if (iframe.parent().length) iframe.remove();
-            },15000);
-        });
-
-        iframe.attr('src', url).appendTo('body');
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/services/artifactory_message_interceptor.js b/web/angular-web/src/main/webapp/app/services/artifactory_message_interceptor.js
deleted file mode 100644
index 5b1c898..0000000
--- a/web/angular-web/src/main/webapp/app/services/artifactory_message_interceptor.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * Created by gidis on 7/26/15.
- */
-import EVENTS from '../constants/artifacts_events.constants';
-
-export function artifactoryMessageInterceptor(ArtifactoryState, $q) {
-
-    function request(req) {
-        return req;
-    }
-
-    function response(res) {
-        handleResponse(res);
-        return res;
-    }
-
-    function responseError(res) {
-        handleResponse(res);
-        return $q.reject(res);
-    }
-
-    function handleResponse(res) {
-        let messages=res.headers()["artifactory-ui-messages"];
-        if (messages) ArtifactoryState.setState('constantMessages', JSON.parse(messages));
-    }
-
-    return {
-        response: response,
-        request: request,
-        responseError: responseError
-    };
-}
diff --git a/web/angular-web/src/main/webapp/app/services/artifactory_model_saver.js b/web/angular-web/src/main/webapp/app/services/artifactory_model_saver.js
deleted file mode 100644
index 568e3f1..0000000
--- a/web/angular-web/src/main/webapp/app/services/artifactory_model_saver.js
+++ /dev/null
@@ -1,116 +0,0 @@
-class ArtifactoryModelSaver {
-    constructor(controller,modelObjects,excludePaths, $timeout,ArtifactoryModal, $q, ArtifactoryState) {
-        this.ArtifactoryModal = ArtifactoryModal;
-        this.$q = $q;
-
-        this.controller = controller;
-        this.controller._$modelSaver$_ = this;
-        this.confirmOnLeave = true;
-        this.modelObjects = modelObjects;
-        this.excludePaths = excludePaths;
-        this.savedModels = {};
-        this.saved = false;
-        this.artifactoryState = ArtifactoryState;
-
-        $timeout(()=>{
-            if (!this.saved) this.save();
-        })
-    }
-
-    save() {
-        this.modelObjects.forEach((objName)=>{
-            this.savedModels[objName] = _.cloneDeep(this.controller[objName]);
-        });
-        this.saved = true;
-    }
-
-    isModelSaved() {
-        let isSaved = true;
-        for (let objectNameI in this.modelObjects) {
-            let objectName = this.modelObjects[objectNameI];
-            if (!angular.equals(this.savedModels[objectName],this.controller[objectName])) {
-                let deefObj = DeepDiff(this.savedModels[objectName],this.controller[objectName]);
-//                console.log(deefObj);
-                if (this._isDiffReal(deefObj,this.excludePaths[objectNameI])) {
-                    isSaved = false;
-                    break;
-                }
-            }
-        }
-        return isSaved;
-    }
-
-
-    _isDiffReal(deefObj,excludePaths) {
-
-        let excludes = excludePaths ? excludePaths.split(';') : [];
-
-        let isReal = false;
-
-        for (let key in deefObj) {
-            let deef = deefObj[key];
-
-            if (deef.path && deef.path.length && ((!_.isString(deef.path[deef.path.length-1]) || deef.path[deef.path.length-1].startsWith('$$')) || this._isExcluded(deef.path,excludes))) continue;
-
-            if ((deef.lhs === undefined && deef.rhs === '') || (deef.lhs === '' && deef.rhs === undefined) ||
-                (deef.lhs === undefined && _.isArray(deef.rhs) && deef.rhs.length === 0) ||
-                (deef.lhs === undefined && _.isObject(deef.rhs) && Object.keys(deef.rhs).length === 0)) {
-                // not real
-            }
-            else { //real
-                isReal = true;
-                break;
-            }
-        }
-
-        return isReal;
-
-    }
-
-    _isExcluded(path,excludes) {
-        if (!excludes.length) return false;
-        let excluded = false;
-        for (let i in excludes) {
-            let exclude = excludes[i];
-            let exPath = exclude.split('.');
-            let match = true;
-            for (let pI in exPath) {
-                if ((exPath[pI] !== '*' && exPath[pI] !== path[pI]) || (exPath[pI] === '*' && path[pI]) === undefined) {
-                    match = false;
-                    break;
-                }
-            }
-            if (match) excluded = true;
-            break;
-        }
-
-        return excluded;
-    }
-
-
-    ask() {
-        let defer = this.$q.defer();
-        if (!this.isModelSaved()) {
-            this.ArtifactoryModal.confirm('You have unsaved changes. Leaving this page will discard changes.', 'Discard Changes', {confirm: 'Discard'})
-                    .then(()=>{
-                        defer.resolve();
-                        this.artifactoryState.setState('confirmDiscardModalOpen',false);
-                    }).catch(()=>this.artifactoryState.setState('confirmDiscardModalOpen',false));
-
-            this.artifactoryState.setState('confirmDiscardModalOpen',true);
-        }
-        else {
-            defer.resolve();
-        }
-        return defer.promise;
-    }
-}
-
-export function ArtifactoryModelSaverFactory ($timeout,ArtifactoryModal, $q, ArtifactoryState) {
-    return {
-        createInstance: (controller,modelObjects,excludePaths) => {
-            excludePaths = excludePaths || [];
-            return new ArtifactoryModelSaver(controller,modelObjects,excludePaths,$timeout,ArtifactoryModal, $q, ArtifactoryState);
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/services/artifactory_notifications.js b/web/angular-web/src/main/webapp/app/services/artifactory_notifications.js
deleted file mode 100644
index 0f67b1e..0000000
--- a/web/angular-web/src/main/webapp/app/services/artifactory_notifications.js
+++ /dev/null
@@ -1,94 +0,0 @@
-/**
- * wrapper around the ngToast service
- * @url http://tamerayd.in/ngToast/#
- */
-export class ArtifactoryNotifications {
-
-    constructor(toaster, $timeout) {
-        this.toast = toaster;
-        this.$timeout = $timeout;
-        this.lastNotification = null;
-    }
-
-    create(message, allowHtml = false) {
-        if (message.info) {
-            if (this.lastNotification == message.info) {
-                return false
-            }
-            this.toast.pop({
-                type: 'success',
-                timeout: message.timeout || 5000,
-                body: message.info,
-                showCloseButton: true,
-                bodyOutputType: allowHtml ? 'trustedHtml' : undefined,
-                clickHandler: this.notifClickHandle
-            });
-            this.lastNotification = message.info;
-            this.$timeout(() => {
-                this.lastNotification = null
-            }, message.timeout || 5000);
-            //this.toast.create({animation:'fade',content:message.info});
-        }
-
-        if (message.error) {
-            if (this.lastNotification == message.error) {
-                return false
-            }
-            this.toast.pop({
-                type: 'error',
-                timeout: message.timeout || 10000,
-                body: message.error,
-                showCloseButton: true,
-                bodyOutputType: allowHtml ? 'trustedHtml' : undefined,
-                clickHandler: this.notifClickHandle
-            });
-            this.lastNotification = message.error;
-            this.$timeout(() => {
-                this.lastNotification = null
-            }, message.timeout || 5000);
-            //this.toast.danger({animation:'fade',content:message.error});
-        }
-        if(message.warn) {
-            if (this.lastNotification == message.warn) {
-                return false
-            }
-            this.toast.pop({
-                type: 'warning',
-                timeout: message.timeout || 4000,
-                body: message.warn,
-                showCloseButton: true,
-                bodyOutputType: allowHtml ? 'trustedHtml' : undefined,
-                clickHandler: this.notifClickHandle
-            });
-            this.lastNotification = message.warn;
-            this.$timeout(() => {
-                this.lastNotification = null
-            }, message.timeout || 1000);
-        }
-    }
-
-    notifClickHandle(toast, isCloseButton) {
-        return isCloseButton;
-    }
-
-    /**
-     * Show toast with HTML content
-     *
-     * @param message {{type: string, body: string}}
-     */
-    createMessageWithHtml(message) {
-        this.toast.pop({
-            type: message.type,
-            body: message.body,
-            bodyOutputType: 'trustedHtml',
-            timeout: message.timeout,
-            showCloseButton: true,
-            clickHandler: this.notifClickHandle
-        });
-    }
-
-    clear() {
-        this.toast.clear();
-    }
-
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/services/artifactory_server_error_interceptor.js b/web/angular-web/src/main/webapp/app/services/artifactory_server_error_interceptor.js
deleted file mode 100644
index fe46957..0000000
--- a/web/angular-web/src/main/webapp/app/services/artifactory_server_error_interceptor.js
+++ /dev/null
@@ -1,22 +0,0 @@
-export function artifactoryServerErrorInterceptor($injector) {
-    var $state;
-    var $q;
-
-    function initInjectables() {
-        $q = $q || $injector.get('$q');
-        $state = $state || $injector.get('$state');
-    }
-
-    function responseError(res) {
-        initInjectables();
-        if (res.status === 0 || res.status > 500) {
-            $state.go('server_error');
-        }
-        return $q.reject(res);
-    }
-
-    return {
-        responseError: responseError
-    };
-}
-
diff --git a/web/angular-web/src/main/webapp/app/services/artifactory_session_interceptor.js b/web/angular-web/src/main/webapp/app/services/artifactory_session_interceptor.js
deleted file mode 100644
index 1755915..0000000
--- a/web/angular-web/src/main/webapp/app/services/artifactory_session_interceptor.js
+++ /dev/null
@@ -1,122 +0,0 @@
-window._sessionExpire = function () {
-    localStorage._forceSessionExpire = true;
-}
-
-export function artifactorySessionInterceptor($injector) {
-    var User;
-    var $state;
-    var ArtifactoryState;
-    var $location;
-    var RESOURCE;
-    var $q;
-    var ArtifactoryNotifications;
-    var ArtifactoryHttpClient;
-    var $window;
-
-    function initInjectables() {
-        $q = $q || $injector.get('$q');
-        $window = $window || $injector.get('$window');
-        User = User || $injector.get('User');
-        $state = $state || $injector.get('$state');
-        ArtifactoryState = ArtifactoryState || $injector.get('ArtifactoryState');
-        $location = $location || $injector.get('$location');
-        RESOURCE = RESOURCE || $injector.get('RESOURCE');
-        ArtifactoryNotifications = ArtifactoryNotifications || $injector.get('ArtifactoryNotifications');
-        ArtifactoryHttpClient = ArtifactoryHttpClient || $injector.get('ArtifactoryHttpClient');
-    }
-
-    function bypass(res) {
-        return res.config && res.config.bypassSessionInterceptor;
-    };
-
-    function isSessionInvalid(res) {
-        return res.headers().sessionvalid === "false";
-    }
-
-    function isApiRequest(res) {
-        return _.contains(res.config.url, RESOURCE.API_URL);
-    }
-
-    function isLoggedIn() {
-        return !User.getCurrent().isGuest();
-    }
-
-    function handleExpiredSession() {
-        // if session invalid and we think we are logged in - session expired on server
-        delete localStorage._forceSessionExpire;
-        User.loadUser(true);
-
-
-        if ($state.current !== 'login' && $location.path() !== '/login') {
-            ArtifactoryState.setState('urlAfterLogin', $location.path());
-            $state.go('login');
-//            return false;
-        }
-        return true;
-    }
-
-    function verifySession(res) {
-        initInjectables();
-        if (bypass(res)) {
-            return true;
-        }
-
-        User.loadUser(); // Refresh from localstorage (parallel tab support)
-        if (isApiRequest(res) && isSessionInvalid(res) && isLoggedIn() || localStorage._forceSessionExpire) {
-            // if the user is not logged in but is in a bypassed request
-            // let the request go through but log out the user.
-            if ($location.path() !== '/login') ArtifactoryState.setState('urlAfterLogin', $location.path());
-            return handleExpiredSession();
-        }
-        return true;
-    }
-
-    function checkAuthorization(res) {
-        if (res.status === 401) {
-            ArtifactoryHttpClient.post("/auth/loginRelatedData", null,{}).then((res)=>{
-               if(res.data.ssoProviderLink) {
-                   if ($location.path() == '/login') {
-                       $state.go('login');
-                   } else {
-                        $window.open(res.data.ssoProviderLink, "_self");
-                   }
-               } else {
-                   setUrlAfterLogin();
-                   $state.go('login');
-               }
-            });
-        }
-        else if (res.status === 403) {
-            if (res.config.url.indexOf('targetPermissions') !== -1) {
-                ArtifactoryNotifications.create({error: 'You are not authorized to view this page'});
-                $state.go('home');
-            }
-        }
-    }
-
-    function setUrlAfterLogin() {
-        if ($state.current !== 'login' && $location.path() !== '/login') {
-            ArtifactoryState.setState('urlAfterLogin', $location.path());
-        }
-    }
-
-    function response(res) {
-        if (verifySession(res)) {
-            return res;
-        }
-        else {
-            return $q.reject(res);
-        }
-    }
-
-    function responseError(res) {
-        verifySession(res);
-        checkAuthorization(res);
-        return $q.reject(res);
-    }
-
-    return {
-        response: response,
-        responseError: responseError
-    };
-}
diff --git a/web/angular-web/src/main/webapp/app/services/artifactory_spinner_interceptor.js b/web/angular-web/src/main/webapp/app/services/artifactory_spinner_interceptor.js
deleted file mode 100644
index c26bf43..0000000
--- a/web/angular-web/src/main/webapp/app/services/artifactory_spinner_interceptor.js
+++ /dev/null
@@ -1,104 +0,0 @@
-import EVENTS from '../constants/artifacts_events.constants';
-
-export function artifactorySpinnerInterceptor($injector, $timeout, $q, ArtifactoryEventBus) {
-
-    let SPINNER_TIMEOUT = 500; //milis
-    let serial = 0;
-    let timeouts = {};
-    let pendings = [];
-    let canceled = [];
-    let inDelay = [];
-
-    ArtifactoryEventBus.register(EVENTS.CANCEL_SPINNER, () => {
-        if (pendings.length) {
-            ArtifactoryEventBus.dispatch(EVENTS.HIDE_SPINNER);
-            canceled = canceled.concat(pendings);
-            pendings = [];
-//            console.log('canceled: ', canceled);
-        }
-    });
-
-
-    function request(req) {
-
-        req.headers['Request-Agent'] = 'artifactoryUI';
-
-        if ((!req.params || !req.params.$no_spinner) && req.url.startsWith('../ui/') ) {
-
-            let domain = req.params ? req.params.$spinner_domain : undefined;
-
-            req.headers.serial = serial;
-
-            pendings.push(serial);
-
-            inDelay.push(serial);
-            timeouts[serial] = $timeout(()=> {
-                let canceledIndex = canceled.indexOf(req.headers.serial);
-
-                if (canceledIndex < 0) {
-                    ArtifactoryEventBus.dispatch(EVENTS.SHOW_SPINNER, domain);
-                }
-                else {
-                    canceled.splice(canceledIndex,1);
-                }
-
-                let inDelayIndex = inDelay.indexOf(req.headers.serial);
-                if (inDelayIndex >= 0) inDelay.splice(inDelayIndex,1);
-
-//                console.log('inDelay',inDelay);
-            }, SPINNER_TIMEOUT);
-
-            serial++;
-
-        }
-
-        return req;
-    }
-
-    function response(res) {
-        if (handleResponse(res)) return res;
-        else return $q.defer().promise;
-    }
-
-    function responseError(res) {
-        if (handleResponse(res)) return $q.reject(res);
-        else return $q.defer().promise;
-    }
-
-    function handleResponse(res) {
-        let s = res.config.headers.serial;
-
-        let pendingIndex = pendings.indexOf(s);
-        if (pendingIndex >= 0) {
-            pendings.splice(pendingIndex,1);
-        }
-
-        let inDelayIndex = inDelay.indexOf(s);
-
-        let canceledIndex = canceled.indexOf(s);
-        if (canceledIndex >= 0) {
-//            console.log('canceled',res);
-            if (inDelayIndex < 0) canceled.splice(canceledIndex,1);
-            return false;
-        }
-        else {
-            if (timeouts[s]) {
-                if (inDelayIndex >= 0) inDelay.splice(inDelayIndex,1);
-                else {
-                    ArtifactoryEventBus.dispatch(EVENTS.HIDE_SPINNER);
-                }
-                $timeout.cancel(timeouts[s]);
-                delete timeouts[s];
-            }
-
-            return  true;
-        }
-
-    }
-
-    return {
-        response: response,
-        request: request,
-        responseError: responseError
-    };
-}
diff --git a/web/angular-web/src/main/webapp/app/services/artifactory_state.js b/web/angular-web/src/main/webapp/app/services/artifactory_state.js
deleted file mode 100644
index f9bc0f1..0000000
--- a/web/angular-web/src/main/webapp/app/services/artifactory_state.js
+++ /dev/null
@@ -1,22 +0,0 @@
-export class ArtifactoryState {
-    constructor() {
-        this.states = {};
-    }
-
-    getState(name) {
-        return this.states[name];
-    }
-
-    setState(name, state) {
-        this.states[name] = state;
-    }
-
-    removeState(name) {
-        if (this.states[name]) delete this.states[name];
-    }
-
-    clearAll(){
-        this.states = {};
-    }
-
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/services/artifactory_storage.js b/web/angular-web/src/main/webapp/app/services/artifactory_storage.js
deleted file mode 100644
index e72b01c..0000000
--- a/web/angular-web/src/main/webapp/app/services/artifactory_storage.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * wrapper around the HTML5 local storage API.
- * support JSON serialization de-serialization.
- *
- */
-
-let storage;
-export class ArtifactoryStorage {
-
-    constructor($window) {
-        storage = $window.localStorage;
-    }
-
-    setItem(key, item) {
-        try {
-            storage.setItem(key, JSON.stringify(item));
-            return this.getItem(key);
-        }
-        catch (e) {
-            console.log(e)
-        }
-    }
-
-    getItem(key, defaultValue = null) {
-        try {
-            let itemStr = storage.getItem(key);
-            if (itemStr) {
-                return JSON.parse(itemStr);
-            }
-            else {
-                return defaultValue;
-            }
-        }
-        catch (e) {
-            console.log(e)
-        }
-    }
-
-    removeItem(key) {
-        storage.removeItem(key);
-    }
-
-    isLocalStorageNameSupported() {
-        let testKey = 'test', storage = window.sessionStorage;
-        try {
-            storage.setItem(testKey, '1');
-            storage.removeItem(testKey);
-            return localStorageName in win && win[localStorageName];
-        }
-        catch (error) {
-            return false;
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/services/artifactory_xml_parser.js b/web/angular-web/src/main/webapp/app/services/artifactory_xml_parser.js
deleted file mode 100644
index c5bf587..0000000
--- a/web/angular-web/src/main/webapp/app/services/artifactory_xml_parser.js
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * simple wrapper around x2j
- */
-export class ArtifactoryXmlParser {
-
-    constructor() {
-        this.x2js = new X2JS();
-        this.xml2json = this.x2js.xml2json;
-        this.json2xml=  this.x2js.json2xml_str;
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/services/native_browser.js b/web/angular-web/src/main/webapp/app/services/native_browser.js
deleted file mode 100644
index d4e9766..0000000
--- a/web/angular-web/src/main/webapp/app/services/native_browser.js
+++ /dev/null
@@ -1,11 +0,0 @@
-export class NativeBrowser {
-    isAllowed(node) {
-        if (node.isInsideArchive()) return false;
-        return (node.isFolder() || node.isRepo()) && !node.isTrashcan() && !node.isInTrashcan();
-    }
-    pathFor(node) {
-    	let path = '../list/' + node.fullpath;
-    	if (!_.endsWith(path, '/')) path = path + '/'; // add '/' in the end
-      return path;
-    }    
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/services/parse_url.js b/web/angular-web/src/main/webapp/app/services/parse_url.js
deleted file mode 100644
index 9b649d4..0000000
--- a/web/angular-web/src/main/webapp/app/services/parse_url.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export function parseUrl() {
-	return function(url) {
-	    let parser = document.createElement('a');
-	    parser.href = url;
-	    return parser;
-	}
-}
diff --git a/web/angular-web/src/main/webapp/app/services/recursive_directive.js b/web/angular-web/src/main/webapp/app/services/recursive_directive.js
deleted file mode 100644
index e8a609e..0000000
--- a/web/angular-web/src/main/webapp/app/services/recursive_directive.js
+++ /dev/null
@@ -1,17 +0,0 @@
-export function recursiveDirective($compile) {
-	return {
-		compile: (elem, link) => {
-            link = _.isFunction(link) ? { post: link } : link;
-			var origContents = elem.contents().remove();
-			var compileFunction;
-			return {
-				pre: (link && link.pre) ? link.pre : null,
-				post: (scope, elem) => {
-                    compileFunction = !compileFunction ? $compile(origContents) : compileFunction;
-					compileFunction(scope, (clone) => elem.append(clone));
-					if (link && link.post) link.post.apply(null, arguments);
-				}
-			};
-		}
-	};
-}
diff --git a/web/angular-web/src/main/webapp/app/services/set_me_up_modal.js b/web/angular-web/src/main/webapp/app/services/set_me_up_modal.js
deleted file mode 100644
index d869a12..0000000
--- a/web/angular-web/src/main/webapp/app/services/set_me_up_modal.js
+++ /dev/null
@@ -1,915 +0,0 @@
-import EVENTS from '../constants/artifacts_events.constants';
-import SNIPPETS from '../constants/setmeup_snippets.constants';
-import FIELD_OPTIONS from '../constants/field_options.constats';
-
-export class SetMeUpModal {
-
-    constructor(ArtifactoryModal, ArtifactoryState, SetMeUpDao, ArtifactDeployDao, RepoDataDao, ArtifactoryEventBus, ArtifactoryNotifications, FilteredResourceDao,
-                RepositoriesDao, ReverseProxiesDao, ArtifactoryFeatures, ArtifactViewsDao, User, UserProfileDao, parseUrl, $sce, $rootScope, $timeout, $compile, DockerStatusDao) {
-        this.modal = ArtifactoryModal;
-        this.setMeUpDao = SetMeUpDao;
-        this.artifactDeployDao = ArtifactDeployDao;
-        this.userProfileDao = UserProfileDao;
-        this.repoDataDao = RepoDataDao;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this.filteredResourceDao = FilteredResourceDao;
-        this.repositoriesDao = RepositoriesDao;
-        this.dockerStatusDao = DockerStatusDao.getInstance();
-        this.reverseProxiesDao = ReverseProxiesDao;
-        this.artifactoryFeatures = ArtifactoryFeatures;
-        this.artifactViewsDao = ArtifactViewsDao;
-        this.artifactoryState = ArtifactoryState;
-        this.user = User.getCurrent();
-        this.parseUrl = parseUrl;
-        this.$sce = $sce;
-        this.$rootScope = $rootScope;
-        this.$timeout = $timeout;
-        this.$compile = $compile;
-
-        this.repoPackageTypes = FIELD_OPTIONS.repoPackageTypes.slice(0);//make a copy
-
-        this._removeP2();
-        this._removeDisabledFeatures();
-
-    }
-
-    _removeP2(){
-        for (let i = 0; i < this.repoPackageTypes.length; i++) {
-            if (this.repoPackageTypes[i].value.toLowerCase() == "p2") {
-                this.repoPackageTypes.splice(i, 1);
-            }
-        }
-    }
-
-    _removeDisabledFeatures() {
-        this.repoPackageTypes = _.filter(this.repoPackageTypes,
-            (item) => !this.artifactoryFeatures.isDisabled(item.value));
-    }
-
-    launch(node) {
-        this.node = node;
-        this._initSetMeUpScope();
-        this.modalInstance = this.modal.launchModal('set_me_up_modal', this.setMeUpScope);
-    }
-
-    _getSetMeUpData() {
-        this.setMeUpDao.get().$promise.then((data)=> {
-//            let url = new URL(data.baseUrl) //CAUSES PROBLEM ON IE, NOT REALY NEEDED...
-
-            let parser = this.parseUrl(data.baseUrl);
-            this.setMeUpScope.baseUrl = parser.href;
-            this.setMeUpScope.host = this.artifactoryFeatures.isAol() ? parser.host.split(':')[0] : parser.host; //split by ':' in aol to remove the port number that IE returns in .host
-            this.setMeUpScope.serverId = data.serverId;
-            this.setMeUpScope.protocol = parser.protocol+'//';
-            this.setMeUpScope.path = parser.pathname;
-            this.setMeUpScope.aolHostName = data.hostname;
-
-            if (!this.setMeUpScope.path.startsWith('/')) this.setMeUpScope.path = '/' + this.setMeUpScope.path;
-
-            data.repoKeyTypes.sort((a,b) => {
-                return (a.repoKey > b.repoKey)?1:-1;
-            });
-            this.setMeUpScope.reposAndTypes = data.repoKeyTypes.map((item) => {
-                return { text : item.repoKey, value : item.repoType.toLowerCase(), read : item.canRead, deploy: item.canDeploy, local: item.isLocal, remote: item.isRemote, virtual: item.isVirtual, defaultDeploymentConfigured: item.isDefaultDeploymentConfigured }
-            });
-
-            // Select the repo according to current node
-            for (let i = 0; i < this.setMeUpScope.reposAndTypes.length; i++) {
-                if (this.setMeUpScope.reposAndTypes[i].text.toLowerCase() == this.setMeUpScope.node.text.toLowerCase() ||
-                    this.setMeUpScope.reposAndTypes[i].text.concat("-cache").toLowerCase() == this.setMeUpScope.node.text.toLowerCase()) {
-                    this.setMeUpScope.selection.repo = this.setMeUpScope.reposAndTypes[i];
-                    this.setMeUpScope.resolveSnippet();
-                    break;
-                }
-            }
-
-            let repoData = this._getRepoData(this.setMeUpScope);
-
-            //Populate general snippets
-            this._setGeneralSnippets(repoData);
-
-            this._setRepositories(this.setMeUpScope);
-
-            this._setShowSettings(this.setMeUpScope);
-
-        })
-    }
-
-    _initSetMeUpScope() {
-        let setMeUpDao = this.setMeUpDao;
-        this.setMeUpScope = this.$rootScope.$new();
-
-        this.setMeUpScope.settingPage = false;
-
-        this.setMeUpScope.id = this.setMeUpScope.$id;
-        this.setMeUpScope.$sce = this.$sce;
-        this.setMeUpScope.settings = {};
-        this.setMeUpScope.status = {};
-        this.setMeUpScope.selection = {};
-        this.setMeUpScope.close = ()=>this.modalInstance.close();
-        this.setMeUpScope.title = "Set Me Up";
-        this.setMeUpScope.shownRepos = [];
-        this.setMeUpScope.deploySnippets = [];
-        this.setMeUpScope.readSnippets = [];
-        this.setMeUpScope.generalSnippets = [];
-
-        this.setMeUpScope.node = this.node.data.getRoot();
-
-        this._prepareSnippets();
-
-        let previousInjectionData = this.artifactoryState.getState('setMeUpUserData');
-        if (previousInjectionData) {
-            this.injectionData = previousInjectionData;
-            this.useApiKey = !!previousInjectionData.apiKey;
-            this.setMeUpScope.userDataInjected = true;
-            this._getUserData(null,true);
-        }
-        else {
-            this.injectionData = {};
-            this._getUserData();
-        }
-
-
-
-
-        this.setMeUpScope.repoTypes = this.repoPackageTypes;
-
-        // Select the repo type according to current node
-        for (let i = 0; i < this.setMeUpScope.repoTypes.length; i++) {
-            if (this.setMeUpScope.node.repoPkgType && this.setMeUpScope.node.repoPkgType.toLowerCase() == this.setMeUpScope.repoTypes[i].value.toLowerCase()) {
-                this.setMeUpScope.selection.repoType = this.setMeUpScope.repoTypes[i];
-                break;
-            }
-        }
-
-        this._getSetMeUpData();
-
-        let sc = this.setMeUpScope;
-
-        this.setMeUpScope.$watch('selection', () => {
-            if (sc.generateSettings && sc.snippet) sc.generateBuildSettings();
-        }, true);
-
-
-        this.setMeUpScope.me = () => {
-            let scope = this.setMeUpScope;
-            while (scope.$id != this.setMeUpScope.id && scope.$parent) {
-                scope = scope.$parent;
-            }
-            return scope;
-        };
-
-
-        this.setMeUpScope.canInjectUserData = this.user.existsInDB && this.user.name !== 'anonymous' && !(this.user.requireProfileUnlock && !this.user.requireProfilePassword);
-
-
-        this.setMeUpScope.injection = {};
-        this.setMeUpScope.gotoInjectionMode = () => {
-            if (this.user.requireProfileUnlock === false) {
-                this.setMeUpScope.injection.password = '';
-                this.setMeUpScope.injectUserData();
-            }
-            else {
-                this.setMeUpScope.injectionMode = true;
-                this.setMeUpScope.toggleInjectUserData(true);
-            }
-        };
-        this.setMeUpScope.cancelInjection = () => {
-            this.setMeUpScope.injectionMode = false;
-            this.setMeUpScope.toggleInjectUserData(false);
-        };
-        this.setMeUpScope.injectUserData = () => {
-
-            this.setMeUpScope.status.snippetResolved = false;
-
-            this._getUserData(this.setMeUpScope.injection.password,true);
-
-            this.setMeUpScope.injectionMode = false;
-            this.setMeUpScope.toggleInjectUserData(false);
-
-            this.setMeUpScope.injection.password = '';
-
-        };
-
-        this.setMeUpScope.removeUserData = () => {
-            this.setMeUpScope.status.snippetResolved = false;
-            this._prepareSnippets();
-            this.artifactoryState.removeState('setMeUpUserData');
-        };
-
-        this.setMeUpScope.toggleInjectUserData = (bShow) => {
-            if (bShow)
-                $('#insert-credentials-box').show().animate({
-                    width: '295px',
-                    height: '62px'
-                }, 400, function() {
-                    $(this).find('.input-text').focus();
-                });
-            else
-                $('#insert-credentials-box').hide().css('width', 0).css('height', 0).find('.icon-clear').hide();
-        };
-
-
-        this.setMeUpScope.checkLayoutSettings = (settings, repoType) => {
-            if (this.setMeUpScope.select && this.setMeUpScope.select.selected) {
-                if (repoType == 'ivy') {
-                    this.setMeUpScope.selection.gradle[settings + 'UseIvy'] = true;
-                    this.setMeUpScope.selection.gradle[settings + 'UseMaven'] = false;
-                }
-                else if (repoType == 'maven') {
-                    this.setMeUpScope.selection.gradle[settings + 'UseMaven'] = true;
-                    this.setMeUpScope.selection.gradle[settings + 'UseIvy'] = false;
-                }
-            }
-            else {
-                if (repoType == 'ivy') {
-                    if (!this.setMeUpScope.selection.gradle[settings + 'UseMaven']) {
-                        this.setMeUpScope.selection.gradle[settings + 'UseMaven'] = true;
-                    }
-                }
-                else if (repoType == 'maven') {
-                    if (!this.setMeUpScope.selection.gradle[settings + 'UseIvy']) {
-                        this.setMeUpScope.selection.gradle[settings + 'UseIvy'] = true;
-                    }
-                }
-            }
-        };
-
-        this.setMeUpScope.getMavenProps = () => {
-            let scope = this.setMeUpScope.me();
-            return JSON.stringify({
-                release: scope.selection.maven.releases,
-                snapshot: scope.selection.maven.snapshots,
-                pluginRelease: scope.selection.maven.pluginReleases,
-                pluginSnapshot: scope.selection.maven.pluginSnapshots,
-                mirror: (scope.selection.maven.mirror) ? scope.selection.maven.mirrorAny : ''
-            })
-        };
-
-        this.setMeUpScope.getGradleProps = () => {
-            let scope = this.setMeUpScope.me();
-            return JSON.stringify({
-                pluginRepoKey: scope.selection.gradle.pluginResolver,
-                libsResolverRepoKey: scope.selection.gradle.libsResolver,
-                libsPublisherRepoKey: scope.selection.gradle.libsPublisher,
-                pluginUseMaven: scope.selection.gradle.pluginUseMaven,
-                resolverUseMaven: scope.selection.gradle.libsUseMaven,
-                publisherUseMaven: scope.selection.gradle.publishUseMaven,
-                pluginUseIvy: scope.selection.gradle.pluginUseIvy,
-                resolverUseIvy: scope.selection.gradle.libsUseIvy,
-                publisherUseIvy: scope.selection.gradle.publishUseIvy,
-                pluginResolverLayout: scope.selection.gradle.pluginLayout,
-                libsResolverLayout: scope.selection.gradle.libsLayout,
-                libsPublisherLayouts: scope.selection.gradle.publishLayout
-            })
-        };
-
-        this.setMeUpScope.getIvyProps = () => {
-            let scope = this.setMeUpScope.me();
-            return JSON.stringify({
-                libsRepo: scope.selection.ivy.libsRepository,
-                libsRepoLayout: scope.selection.ivy.libsRepositoryLayout,
-                libsResolverName: scope.selection.ivy.libsResolverName,
-                useIbiblioResolver: !!(scope.selection.ivy.ibiblio),
-                m2Compatible: !!(scope.selection.ivy.maven2)
-            })
-        };
-
-        this.setMeUpScope.generateBuildSettings = () => {
-            let scope = this.setMeUpScope.me();
-            if (!scope.generate) return false;
-
-            if (scope.generate.maven) {
-                setMeUpDao.maven_snippet({
-                    release: scope.selection.maven.releases,
-                    snapshot: scope.selection.maven.snapshots,
-                    pluginRelease: scope.selection.maven.pluginReleases,
-                    pluginSnapshot: scope.selection.maven.pluginSnapshots,
-                    mirror: (scope.selection.maven.mirror) ? scope.selection.maven.mirrorAny : ''
-                }).$promise.then((result)=> {
-                        scope.snippet = result.mavenSnippet;
-                    })
-            }
-            else if (scope.generate.gradle) {
-                setMeUpDao.gradle_snippet({
-                    pluginRepoKey: scope.selection.gradle.pluginResolver,
-                    libsResolverRepoKey: scope.selection.gradle.libsResolver,
-                    libsPublisherRepoKey: scope.selection.gradle.libsPublisher,
-                    pluginUseMaven: scope.selection.gradle.pluginUseMaven,
-                    resolverUseMaven: scope.selection.gradle.libsUseMaven,
-                    publisherUseMaven: scope.selection.gradle.publishUseMaven,
-                    pluginUseIvy: scope.selection.gradle.pluginUseIvy,
-                    resolverUseIvy: scope.selection.gradle.libsUseIvy,
-                    publisherUseIvy: scope.selection.gradle.publishUseIvy,
-                    pluginResolverLayout: scope.selection.gradle.pluginLayout,
-                    libsResolverLayout: scope.selection.gradle.libsLayout,
-                    libsPublisherLayouts: scope.selection.gradle.publishLayout
-                }).$promise.then((result)=> {
-                        scope.snippet = result.gradleSnippet;
-                    })
-            }
-            else if (scope.generate.ivy) {
-                setMeUpDao.ivy_snippet({
-                    libsRepo: scope.selection.ivy.libsRepository,
-                    libsRepoLayout: scope.selection.ivy.libsRepositoryLayout,
-                    libsResolverName: scope.selection.ivy.libsResolverName,
-                    useIbiblioResolver: !!(scope.selection.ivy.ibiblio),
-                    m2Compatible: !!(scope.selection.ivy.maven2)
-                }).$promise.then((result)=> {
-                        scope.snippet = result.ivySnippet;
-                    })
-            }
-        };
-
-        this.setMeUpScope.filterByType = (selectRepo = false) => {
-            if (!this.setMeUpScope.reposAndTypes) return false;
-
-            let scope = this.setMeUpScope.me();
-            scope.settingPage = false;
-            if (scope.selection && scope.selection.repo && scope.selection.repo.value !== scope.selection.repoType.value) {
-                scope.selection.repo = null;
-            }
-            scope.snippet = scope.readSnippet = scope.deploySnippet = null;
-            scope.generateSettings = false;
-            scope.generate = {};
-
-            scope.deploySettingsMode = false;
-
-
-            scope.generalSnippets = [];
-            scope.readSnippets = [];
-            scope.deploySnippets = [];
-
-            this._setShowSettings(scope);
-            this._setRepositories(scope);
-            if (selectRepo) {
-                this._selectRepoByType(scope);
-                this.setMeUpScope.status.snippetResolved = false;
-            }
-            this.setMeUpScope.resolveSnippet();
-            let repoData = this._getRepoData(scope);
-            //Populate general snippets
-            this._setGeneralSnippets(repoData);
-        };
-
-        this.setMeUpScope.getGeneratorRepos = (type) => {
-            let scope = this.setMeUpScope.me();
-            scope.settingPage = true;
-            if (!scope.generate) scope.generate = {};
-
-            scope.readSnippet = scope.deploySnippet = null;
-
-            switch (type) {
-                case 'Maven':
-                    setMeUpDao.maven().$promise.then((result)=> {
-                        scope.generateSettings = true;
-                        scope.generate = {maven: true};
-                        scope.settings.maven = result;
-                        this.setMeUpScope.selection.maven = {
-                            releases: scope.settings.maven.releases[0],
-                            snapshots: scope.settings.maven.snapshots[0],
-                            pluginReleases: scope.settings.maven.pluginReleases[0],
-                            pluginSnapshots: scope.settings.maven.pluginSnapshots[0],
-                            mirrorAny: scope.settings.maven.anyMirror[0],
-                            mirror: false
-                        };
-                    });
-                    break;
-                case 'Gradle':
-                    setMeUpDao.gradle().$promise.then((result)=> {
-                        scope.generateSettings = true;
-                        scope.generate = {gradle: true};
-                        scope.settings.gradle = result;
-                        this.setMeUpScope.selection.gradle = {
-                            pluginResolver: scope.settings.gradle.pluginResolver[0],
-                            pluginUseMaven: true,
-                            pluginUseIvy: false,
-                            pluginLayout: scope.settings.gradle.layouts[0],
-                            libsResolver: scope.settings.gradle.libsResolver[0],
-                            libsUseMaven: true,
-                            libsUseIvy: false,
-                            libsLayout: scope.settings.gradle.layouts[0],
-                            libsPublisher: scope.settings.gradle.libsPublisher[0],
-                            publishUseMaven: true,
-                            publishUseIvy: false,
-                            publishLayout: scope.settings.gradle.layouts[0]
-                        };
-                    });
-                    break;
-                case 'Ivy':
-                    setMeUpDao.ivy().$promise.then((result)=> {
-                        scope.generateSettings = true;
-                        scope.generate = {ivy: true};
-                        scope.settings.ivy = result;
-                        this.setMeUpScope.selection.ivy = {
-                            libsRepository: scope.settings.ivy.libsRepository[0],
-                            libsRepositoryLayout: scope.settings.ivy.libsRepositoryLayout[0],
-                            ibiblio: true,
-                            maven2: true
-                        }
-                    });
-                    break;
-                default:
-                    scope.generateSettings = false;
-                    break;
-            }
-
-        };
-
-        this.setMeUpScope.resolveSnippet = (resolveDockerReverseProxy = true) => {
-
-            if (this.setMeUpScope.status.snippetResolved) {
-                this.$timeout(()=>{
-                    if (!this.setMeUpScope.deploySnippets.length && !this.setMeUpScope.generalSnippets.length && !this.setMeUpScope.readSnippets.length) {
-                        this.setMeUpScope.status.snippetResolved = false;
-                        this.setMeUpScope.resolveSnippet();
-                    }
-                });
-                return;
-            }
-            else {
-            }
-            this.setMeUpScope.status.snippetResolved = true;
-
-            if (!this.setMeUpScope.selection.repoType) {
-                return;
-            }
-            let scope = this.setMeUpScope.me();
-            let repoData = this._getRepoData(scope);
-            let repoType = this.setMeUpScope.selection.repoType.value;
-
-            if (!repoData) return;
-
-            scope.deploySnippets = [];
-            scope.readSnippets = [];
-            scope.generalSnippets = [];
-
-            if (this.setMeUpScope.snippets[repoType]) {
-                this._setDeploySnippets(repoData);
-                this._setReadSnippets(repoData);
-                this._setGeneralSnippets(repoData);
-            }
-
-            //Warn the user if he doesn't have deploy permissions
-            if(!repoData.deploy && (repoData.local || repoData.defaultDeploymentConfigured)) {
-                scope.generalSnippets.push({
-                    title: this.setMeUpScope.$sce.trustAsHtml("<b>You don't have deploy permissions on this repository!<b/>")
-                });
-            }
-
-            if (this.setMeUpScope.selection.repoType.value === 'docker' && resolveDockerReverseProxy && !this.artifactoryFeatures.isAol() && !this.artifactoryFeatures.isOss() && this.user.name !== 'anonymous') {
-                this.artifactViewsDao.getDockerProxySnippet({},{repoKey: "dummy" /*this.selection.repo.text*/}).$promise.then((data)=>{
-                    this.setMeUpDao.reverse_proxy_data({repoKey: this.setMeUpScope.selection.repo.text}).$promise.then((reverseProxiesData)=>{
-
-                        if (reverseProxiesData.methodSelected) this.setMeUpScope.reverseProxySnippet = data.template;
-
-                        let snip;
-                        if (reverseProxiesData.usingPorts) snip = `${reverseProxiesData.serverName}:${reverseProxiesData.repoPort || '<port>'}`;
-                        else snip = `${this.setMeUpScope.selection.repo.text}.${reverseProxiesData.serverName}`;
-
-                        if (reverseProxiesData.methodSelected && !reverseProxiesData.usingHttps) {
-                            this.setMeUpScope.snippets.docker.general[0].title = this.setMeUpScope.snippets.docker.general[0].title_reverse_proxy + this.setMeUpScope.snippets.docker.general[0].title_insecure;
-                            this.setMeUpScope.snippets.docker.general[0].snippet = this.setMeUpScope.snippets.docker.general[0].snippet_insecure.split('<INSECURE_SNIP>').join(snip);
-                        }
-                        else {
-                            this.setMeUpScope.snippets.docker.general[0].title = this.setMeUpScope.snippets.docker.general[0].title_reverse_proxy;
-                            delete this.setMeUpScope.snippets.docker.general[0].snippet;
-                        }
-                        this.setMeUpScope.status.snippetResolved = false;
-                        this.setMeUpScope.resolveSnippet(false);
-                    });
-                })
-                .catch(()=>{
-                    if (!this.artifactoryFeatures.isAol()) this.setMeUpScope.snippets.docker.general[0].title = this.setMeUpScope.snippets.docker.general[0].title_reverse_proxy;
-                    this.setMeUpScope.status.snippetResolved = false;
-                    this.setMeUpScope.resolveSnippet(false);
-                });
-            }
-            else if (resolveDockerReverseProxy){
-                if (this.setMeUpScope.selection.repoType.value === 'docker' && this.artifactoryFeatures.isAol()) {
-                    this.setMeUpScope.status.snippetResolved = false;
-                }
-                delete this.setMeUpScope.reverseProxySnippet;
-                delete this.setMeUpScope.snippets.docker.general[0].snippet;
-            }
-
-            if (this.setMeUpScope.selection.repoType.value === 'docker' && this.artifactoryFeatures.isAol()) {
-                this._resolveDockerAolSnippets(this.setMeUpScope.selection.repo.text);
-            }
-            else if (this.setMeUpScope.selection.repoType.value === 'docker') {
-                this._resolveDockerAolSnippets(null);
-            }
-        };
-
-
-
-        this.setMeUpScope.setDeploySettingsMode = () => {
-
-            let defaultTargetPath;
-
-            switch (this.setMeUpScope.selection.repoType.value) {
-                case "maven":
-                    defaultTargetPath="settings.xml";
-                    break;
-                case "gradle":
-                    defaultTargetPath="build.gradle";
-                    break;
-                case "ivy":
-                    defaultTargetPath="ivysettings.xml";
-                    break;
-            }
-
-            this.setMeUpScope.deploySettingsMode = true;
-            this.setMeUpScope.snippetDeploy = {
-                targetPath:  defaultTargetPath,
-                targetRepo: ''
-            };
-
-            this.repoDataDao.get({user: 'true'}).$promise.then((result)=> {
-                this.setMeUpScope.snippetDeploy.reposList = result.repoTypesList;
-            });
-
-        };
-
-        this.setMeUpScope.deploySettingsSnippet = () => {
-            let doActualDeployment;
-            let scope = this.setMeUpScope.me();
-            if (scope.generate.maven) {
-                setMeUpDao.maven_snippet({deploy:true},{
-                    release: scope.selection.maven.releases,
-                    snapshot: scope.selection.maven.snapshots,
-                    pluginRelease: scope.selection.maven.pluginReleases,
-                    pluginSnapshot: scope.selection.maven.pluginSnapshots,
-                    mirror: (scope.selection.maven.mirror) ? scope.selection.maven.mirrorAny : ''
-                }).$promise.then((result)=> {
-                        doActualDeployment(result);
-                    })
-            }
-            else if (scope.generate.gradle) {
-                setMeUpDao.gradle_snippet({deploy:true},{
-                    pluginRepoKey: scope.selection.gradle.pluginResolver,
-                    libsResolverRepoKey: scope.selection.gradle.libsResolver,
-                    libsPublisherRepoKey: scope.selection.gradle.libsPublisher,
-                    pluginUseMaven: scope.selection.gradle.pluginUseMaven,
-                    resolverUseMaven: scope.selection.gradle.libsUseMaven,
-                    publisherUseMaven: scope.selection.gradle.publishUseMaven,
-                    pluginUseIvy: scope.selection.gradle.pluginUseIvy,
-                    resolverUseIvy: scope.selection.gradle.libsUseIvy,
-                    publisherUseIvy: scope.selection.gradle.publishUseIvy,
-                    pluginResolverLayout: scope.selection.gradle.pluginLayout,
-                    libsResolverLayout: scope.selection.gradle.libsLayout,
-                    libsPublisherLayouts: scope.selection.gradle.publishLayout
-                }).$promise.then((result)=> {
-                        doActualDeployment(result);
-                    })
-            }
-            else if (scope.generate.ivy) {
-                setMeUpDao.ivy_snippet({deploy:true},{
-                    libsRepo: scope.selection.ivy.libsRepository,
-                    libsRepoLayout: scope.selection.ivy.libsRepositoryLayout,
-                    libsResolverName: scope.selection.ivy.libsResolverName,
-                    useIbiblioResolver: !!(scope.selection.ivy.ibiblio),
-                    m2Compatible: !!(scope.selection.ivy.maven2)
-                }).$promise.then((result)=> {
-                        doActualDeployment(result);
-                    })
-            }
-
-
-            doActualDeployment = (config) => {
-                let singleDeploy = {};
-
-                singleDeploy.action = "deploy";
-                singleDeploy.unitInfo = {
-                    artifactType: "base",
-                    path: this.setMeUpScope.snippetDeploy.targetPath
-                };
-                singleDeploy.fileName = config.savedSnippetName;
-                singleDeploy.repoKey = this.setMeUpScope.snippetDeploy.targetRepo.repoKey;
-
-                this.artifactDeployDao.post(singleDeploy).$promise.then((result)=> {
-                    if (result.data) {
-                        this.artifactoryEventBus.dispatch(EVENTS.TREE_REFRESH);
-                        this.artifactoryNotifications.createMessageWithHtml({
-                            type: 'success',
-                            body: `<div id="toaster-with-link">Successfully deployed <a ui-sref="artifacts.browsers.path({tab: 'General', browser: 'tree', artifact: '${result.data.repoKey}/${result.data.artifactPath}'})">${result.data.artifactPath} into ${result.data.repoKey}</a></div>`,
-                            timeout: 10000
-                        });
-                        this.$timeout(()=>{ //compile the element, so the ui-sref will work
-                            let e = angular.element($('#toaster-with-link'));
-                            this.$compile(e)(this.$rootScope);
-                        });
-
-                        this.filteredResourceDao.setFiltered({setFiltered: true},{
-                            repoKey: result.data.repoKey,
-                            path: result.data.artifactPath
-                        });
-                    }
-                });
-            }
-        };
-
-    }
-
-    _fixTPL(tpl) {
-        let temp = tpl;
-        let protocol;
-        if (_.contains(tpl, 'http://')) {
-            protocol = 'http://';
-        }
-        else if (_.contains(tpl, 'https://')) {
-            protocol = 'https://';
-        }
-        temp = temp.split('!'+protocol).join('@@keep_protocol@@');
-        temp = temp.split(protocol).join('@@protocol@@');
-        temp = temp.split('//').join('/');
-        temp = temp.split('@@protocol@@').join(this.setMeUpScope.protocol);
-        temp = temp.split('@@keep_protocol@@').join(protocol);
-
-        if (_.contains(temp, this.setMeUpScope.host + "/artifactory") && this.setMeUpScope.path !== "/artifactory") {
-            temp = temp.replace(this.setMeUpScope.host + "/artifactory", this.setMeUpScope.host + this.setMeUpScope.path);
-        }
-
-        return temp;
-    }
-
-    _setShowSettings(scope) {
-        let selection = this.setMeUpScope.selection;
-        if (scope.selection && selection.repoType && scope.selection.repoType.value.match('(ivy|maven|gradle)')) {
-            scope.showSettings = selection.repoType.text;
-        }
-        else {
-            scope.showSettings = false;
-        }
-    }
-
-    _setRepositories(scope) {
-        scope.shownRepos = this.setMeUpScope.reposAndTypes.filter((d) => {
-            if (!this.setMeUpScope.selection || !this.setMeUpScope.selection.repoType || this.setMeUpScope.selection.repoType.value == 'generic') return d;
-            if (this.setMeUpScope.selection.repoType.value == 'maven' && !d.local && !d.defaultDeploymentConfigured) return false;
-            let isRepoMavenish = this.setMeUpScope.selection.repoType.value.match(/(maven|ivy|gradle|sbt)/gi) ? true : false;
-            let isSelectionMavenish = d.value.match(/(maven|ivy|gradle|sbt)/gi) ? true : false;
-            if (d.value == this.setMeUpScope.selection.repoType.value || d.value == this.setMeUpScope.selection.repoType.value
-                || (isRepoMavenish && isSelectionMavenish)) return d;
-        })
-    }
-
-    _selectRepoByType(scope) {
-        // Select the repo according to current node
-        for (let i = 0; i < scope.reposAndTypes.length; i++) {
-            if (scope.reposAndTypes[i].value.toLowerCase() == scope.selection.repoType.value) {
-                scope.selection.repo = scope.reposAndTypes[i];
-                scope.resolveSnippet();
-                break;
-            }
-        }
-    }
-
-    _getRepoData(scope) {
-        let repoData = this.setMeUpScope.reposAndTypes.filter((item) => {
-            if (scope.selection.repo && item.text == scope.selection.repo.text) {
-                return item;
-            }
-        });
-        repoData = (repoData.length > 0) ? repoData[0] : null;
-
-        return repoData;
-    }
-
-    _setDeploySnippets(repoData) {
-        if (!repoData) return;
-
-        let scope = this.setMeUpScope.me();
-        let repoType = this.setMeUpScope.selection.repoType.value;
-
-        // Maven from server
-        if (repoType == 'maven') {
-            scope.deploySnippets = [];
-            this.setMeUpDao.maven_distribution({repoKey: repoData.text}).$promise.then((result)=> {
-                if (repoData.local || repoData.defaultDeploymentConfigured) {
-                    scope.deploySnippets.push({
-                        before: (this.setMeUpScope.snippets[repoType]['deploy']) ? this.setMeUpScope.snippets[repoType]['deploy']['before'] : '',
-                        snippet: result.distributedManagement,
-                        after: (this.setMeUpScope.snippets[repoType]['deploy']) ? this.setMeUpScope.snippets[repoType]['deploy']['after'] : ''
-                    })
-                }
-            })
-        }
-
-        if (repoType != 'maven' && (repoData.local || repoData.defaultDeploymentConfigured) && this.setMeUpScope.snippets[repoType]['deploy']) {
-            scope.deploySnippets = [];
-            if (this.setMeUpScope.snippets[repoType]['deploy'] instanceof Array) {
-                for (let i = 0; i < this.setMeUpScope.snippets[repoType]['deploy'].length; i++) {
-                    let tpl = (this.setMeUpScope.snippets[repoType]['deploy']) ?
-                        this.setMeUpScope.snippets[repoType]['deploy'][i]['snippet'] : null;
-                    if (tpl) {
-                        tpl = tpl.replace(/\$1/g, repoData.text).replace(/\$2/g, this.setMeUpScope.baseUrl).replace(/\$3/g,
-                            this.setMeUpScope.serverId).replace(/\$4/g, this.setMeUpScope.host);
-                        tpl = this._fixTPL(tpl);
-                        scope.deploySnippets.push({
-                            before: this.$sce.trustAsHtml(this.setMeUpScope.snippets[repoType]['deploy'][i]['before']),
-                            snippet: tpl,
-                            after: this.setMeUpScope.$sce.trustAsHtml(this.setMeUpScope.snippets[repoType]['deploy'][i]['after'])
-                        })
-                    }
-                }
-            }
-            else {
-                let tpl = (this.setMeUpScope.snippets[repoType]['deploy']) ? this.setMeUpScope.snippets[repoType]['deploy']['snippet'] : null;
-                if (tpl) {
-                    tpl = tpl.replace(/\$1/g, repoData.text).replace(/\$2/g, this.setMeUpScope.baseUrl).replace(/\$3/g,
-                        this.setMeUpScope.serverId).replace(/\$4/g, this.setMeUpScope.host);
-                    tpl = this._fixTPL(tpl);
-                    scope.deploySnippets.push({
-                        before: this.setMeUpScope.$sce.trustAsHtml(this.setMeUpScope.snippets[repoType]['deploy']['before']),
-                        snippet: tpl,
-                        after: this.setMeUpScope.$sce.trustAsHtml(this.setMeUpScope.snippets[repoType]['deploy']['after'])
-                    })
-                }
-            }
-        }
-    }
-
-    _setReadSnippets(repoData) {
-        if (!repoData) return;
-
-        let scope = this.setMeUpScope.me();
-        scope.readSnippets = [];
-        let repoType = this.setMeUpScope.selection.repoType.value;
-
-        if (repoData.read && this.setMeUpScope.snippets[repoType]['read']) {
-            if (this.setMeUpScope.snippets[repoType]['read'] instanceof Array) {
-                for (let i = 0; i < this.setMeUpScope.snippets[repoType]['read'].length; i++) {
-                    let tpl = (this.setMeUpScope.snippets[repoType]['read']) ?
-                        this.setMeUpScope.snippets[repoType]['read'][i]['snippet'] : null;
-                    if (tpl) {
-                        tpl = tpl.replace(/\$1/g, repoData.text).replace(/\$2/g, this.setMeUpScope.baseUrl).replace(/\$3/g,
-                            this.setMeUpScope.serverId).replace(/\$4/g, this.setMeUpScope.host);
-                        tpl = this._fixTPL(tpl);
-                        scope.readSnippets.push({
-                            before: this.setMeUpScope.$sce.trustAsHtml(this.setMeUpScope.snippets[repoType]['read'][i]['before']),
-                            snippet: tpl,
-                            after: this.setMeUpScope.$sce.trustAsHtml(this.setMeUpScope.snippets[repoType]['read'][i]['after'])
-                        });
-                    }
-                }
-            }
-            else {
-                let tpl = (this.setMeUpScope.snippets[repoType]['read']) ? this.setMeUpScope.snippets[repoType]['read']['snippet'] : null;
-                if (tpl) {
-                    tpl = tpl.replace(/\$1/g, repoData.text).replace(/\$2/g, this.setMeUpScope.baseUrl).replace(/\$3/g,
-                        this.setMeUpScope.serverId).replace(/\$4/g, this.setMeUpScope.host);
-                    tpl = this._fixTPL(tpl);
-                    scope.readSnippets.push({
-                        before: this.setMeUpScope.$sce.trustAsHtml(this.setMeUpScope.snippets[repoType]['read']['before']),
-                        snippet: tpl,
-                        after: this.setMeUpScope.$sce.trustAsHtml(this.setMeUpScope.snippets[repoType]['read']['after'])
-                    });
-                }
-            }
-        }
-    }
-
-    _setGeneralSnippets(repoData) {
-        if (!repoData) return;
-
-        if (!this.setMeUpScope.selection.repoType) {
-            return;
-        }
-        let scope = this.setMeUpScope.me();
-        let repoType = this.setMeUpScope.selection.repoType.value;
-
-        scope.generalSnippets = [];
-        if (this.setMeUpScope.snippets[repoType]['general']) {
-            if (this.setMeUpScope.snippets[repoType]['general'] instanceof Array) {
-                for (let i = 0; i < this.setMeUpScope.snippets[repoType]['general'].length; i++) {
-                    let tpl = (this.setMeUpScope.snippets[repoType]['general']) ?
-                        this.setMeUpScope.snippets[repoType]['general'][i]['snippet'] : null;
-                    if (tpl && repoData) {
-                        tpl = tpl.replace(/\$1/g, repoData.text).replace(/\$2/g, this.setMeUpScope.baseUrl).replace(/\$3/g,
-                            this.setMeUpScope.serverId).replace(/\$4/g, (repoType === 'cocoapods' ? this.setMeUpScope.host.split(':')[0] : this.setMeUpScope.host));
-                        tpl = this._fixTPL(tpl);
-                    }
-                    scope.generalSnippets.push({
-                        title: this.setMeUpScope.$sce.trustAsHtml(this.setMeUpScope.snippets[repoType]['general'][i]['title']),
-                        before: this.setMeUpScope.$sce.trustAsHtml(this.setMeUpScope.snippets[repoType]['general'][i]['before']),
-                        snippet: tpl,
-                        after: this.setMeUpScope.$sce.trustAsHtml(this.setMeUpScope.snippets[repoType]['general'][i]['after'])
-                    });
-                }
-            }
-            else {
-                let tpl = (this.setMeUpScope.snippets[repoType]['general']) ? this.setMeUpScope.snippets[repoType]['general']['snippet'] : null;
-                if (tpl && repoData) {
-                    tpl = tpl.replace(/\$1/g, repoData.text).replace(/\$2/g, this.setMeUpScope.baseUrl).replace(/\$3/g,
-                        this.setMeUpScope.serverId).replace(/\$4/g, this.setMeUpScope.host);
-                    tpl = this._fixTPL(tpl);
-                }
-                scope.generalSnippets.push({
-                    title: this.setMeUpScope.$sce.trustAsHtml(this.setMeUpScope.snippets[repoType]['general']['title']),
-                    before: this.setMeUpScope.$sce.trustAsHtml(this.setMeUpScope.snippets[repoType]['general']['before']),
-                    snippet: tpl,
-                    after: this.setMeUpScope.$sce.trustAsHtml(this.setMeUpScope.snippets[repoType]['general']['after'])
-                });
-            }
-        }
-    }
-
-    _prepareSnippets(injectUserData) {
-
-        let stringified = JSON.stringify(SNIPPETS);
-
-        var curlAuthString = this.useApiKey ? "-H 'X-JFrog-Art-Api: <API_KEY>'" : "-u<USERNAME>:<PASSWORD>";
-
-        stringified = stringified.split('<CURL_AUTH>').join(curlAuthString);
-
-        if (injectUserData) {
-            if (this.injectionData.userName && this.injectionData.password) stringified = stringified.split('<USERNAME>:<PASSWORD> (converted to base 64)').join(btoa(this.injectionData.userName+':'+this.injectionData.password));
-            if (this.injectionData.userName) stringified = stringified.split('<USERNAME>').join(this.injectionData.userName);
-            if (this.injectionData.password && !this.injectionData.apiKey) stringified = stringified.split('<PASSWORD>').join(this.injectionData.password);
-            if (this.injectionData.password) stringified = stringified.split('<BASE64_PASSWORD>').join(btoa(this.injectionData.password));
-            if (this.injectionData.apiKey) {
-                stringified = stringified.split('<PASSWORD>').join(this.injectionData.apiKey);
-                stringified = stringified.split('<API_KEY>').join(this.injectionData.apiKey);
-            }
-            if (this.injectionData.email) {
-                stringified = stringified.split('youremail at email.com').join(this.injectionData.email);
-            }
-            this.setMeUpScope.userDataInjected = true;
-            this.artifactoryState.setState('setMeUpUserData',this.injectionData);
-        }
-        else {
-            this.setMeUpScope.userDataInjected = false;
-        }
-
-        this.setMeUpScope.snippets = JSON.parse(stringified);
-
-        if (this.setMeUpScope.filterByType) this.setMeUpScope.filterByType();
-    }
-
-    _getUserData(password, inject) {
-
-        let getUnprotected = () => {
-            this.userProfileDao.getApiKey().$promise.then((res)=>{
-                this.useApiKey = !!res.apiKey;
-                this.injectionData.apiKey = res.apiKey;
-                this.injectionData.userName = this.user.name;
-
-                if (this.user.requireProfileUnlock === false && !this.useApiKey) this.setMeUpScope.canInjectUserData = false;
-
-                this._prepareSnippets(inject);
-            });
-        };
-
-        if (password && this.user.requireProfileUnlock !== false) {
-            this.userProfileDao.fetch({password: password || ''}).$promise.then(res => {
-                this.injectionData.password = res.data.user.password;
-                this.injectionData.email = res.data.user.email;
-                getUnprotected();
-            });
-        }
-        else getUnprotected();
-
-    }
-
-    _resolveDockerAolSnippets(repoKey) {
-        if (repoKey===null) this.setMeUpScope.snippets.docker.general[0].after = this.setMeUpScope.snippets.docker.general[0].after_example_server;
-
-        let snippets = ['deploySnippets','readSnippets','generalSnippets'];
-        let snippetsParts = ['before','after','snippet'];
-
-        let loopRun = (serverName) => {
-            snippets.forEach((snippet) => {
-                this.setMeUpScope[snippet].forEach((snip)=>{
-                    snippetsParts.forEach((part) => {
-                        if (snip[part]) {
-                            snip[part] = snip[part].toString();
-                            if (repoKey === null) { //inject the default
-                                snip[part] = snip[part].split('<DOCKER_SERVER>').join('artprod.company.com');
-                            }
-                            else {
-                                if (part === 'after' && snip.after_example_server) {
-                                    delete snip[part];
-                                }
-                                else snip[part] = snip[part].split('<DOCKER_SERVER>').join(serverName);
-                            }
-                        }
-                    })
-                })
-            });
-        };
-
-        if (repoKey) {
-            let serverName = this.setMeUpScope.aolHostName + '-' + repoKey + '.jfrog.io';
-            this.$timeout(()=>{
-                loopRun(serverName);
-            })
-        }
-        else {
-            loopRun(null);
-        }
-
-    }
-
-}
diff --git a/web/angular-web/src/main/webapp/app/services/user.js b/web/angular-web/src/main/webapp/app/services/user.js
deleted file mode 100644
index dace078..0000000
--- a/web/angular-web/src/main/webapp/app/services/user.js
+++ /dev/null
@@ -1,243 +0,0 @@
-import EVENTS from "../constants/artifacts_events.constants";
-const USER_KEY = 'USER';
-const GUEST_USER = {
-    name: 'anonymous',
-    admin: false,
-    profileUpdatable: true,
-    internalPasswordDisabled: false,
-    canDeploy: false,
-    canManage: false,
-    preventAnonAccessBuild: false,
-    proWithoutLicense: false
-};
-
-class User {
-    constructor(data) {
-        User.ArtifactoryEventBus.register(EVENTS.USER_LOGOUT, (confirmDiscard) => {
-            if (!confirmDiscard) User.logout().then(() => {
-                User.$state.go("home");
-            });
-        });
-
-        if (data) {
-            this.setData(data);
-        }
-    }
-
-    setData(data) {
-        if (!_.isEqual(this._data, data)) {
-            data.userPreferences = data.userPreferences || {};
-
-            angular.copy(data, this);
-            this._data = data;
-            User.ArtifactoryEventBus.dispatch(EVENTS.USER_CHANGED);
-        }
-    }
-
-    isProWithoutLicense() {
-        return this.proWithoutLicense
-    }
-
-    // Instance methods:
-    isGuest() {
-        return this.name === GUEST_USER.name;
-    }
-
-    isAdmin() {
-        return this.admin;
-    }
-
-    isRegularUser() {
-        return this.isLoggedIn() && !this.isAdmin();
-    }
-
-    isLoggedIn() {
-        return !this.isGuest();
-    }
-
-    getCanManage() {
-        return this.canManage || this.isProWithoutLicense();
-    }
-
-    getCanDeploy() {
-        if (this.isProWithoutLicense()) {
-            return false
-        }
-        return this.canDeploy;
-    }
-
-    //TODO [by dan]: Decide if we're bringing back push to bintray for builds -> remove this if not
-    /*canPushToBintray() {
-        if (this.isProWithoutLicense()) {
-            return false
-        }
-        return this.canDeploy;
-    }*/
-
-    canViewBuildState(state, stateParams, isChangeTab) {
-        if (this.isProWithoutLicense()) {
-            return false;
-        }
-        if (this.preventAnonAccessBuild && this.isGuest()) {
-            return false;
-        }
-        if (state != 'builds.info') {
-            return true;
-        }
-
-        if (stateParams.tab === 'published') {
-            return true;
-        }
-        return this.getCanDeploy();
-    }
-
-    canView(state, stateParams = {}) {
-        if (this.isProWithoutLicense()) {
-            if (state === "admin.configuration.register_pro" || state === "admin.configuration" || state === "admin" ||
-                    state === "home" || state === "login") {
-                return true;
-            } else {
-                return false;
-            }
-        }
-        if (state === "artifacts") {
-            return true;
-        }
-        if (state.match(/^admin.security.permissions/) || state === "admin") {
-            return this.getCanManage();
-        }
-        else if (state.match(/^admin/)) {
-            return this.isAdmin();
-        }
-        else if (state.match(/^builds/)) {
-            return this.canViewBuildState(state, stateParams, true);
-        }
-        else {
-            return true;
-        }
-    }
-
-    // Class methods:
-    static login(username, remember) {
-        let loginRequest = this.http.post(this.RESOURCE.AUTH_LOGIN + remember,
-                angular.extend(username, {type: 'login'}));
-
-        loginRequest.then(
-                (response) => {
-                    this.setUser(response.data);
-                    return username;
-                });
-        return loginRequest;
-    }
-
-    static logout() {
-        return this.http.get(this.RESOURCE.AUTH_IS_SAML, null, {}).then((res=> {
-            if (res.data) {
-                return this.http.get(this.RESOURCE.SAML_LOGOUT, null, {}).then((res)=> {
-                    this.$window.location.replace(res.data);
-                });
-            }
-            else {
-                return this.http.post(this.RESOURCE.AUTH_LOGOUT, null, {bypassSessionInterceptor: true})
-                        .then((res) => {
-                            let sysMsg = this.artifactoryState.getState('systemMessage'); //we want to keep this value after logout
-                            this.artifactoryState.clearAll();
-                            this.artifactoryState.setState('systemMessage',sysMsg);
-
-                            if (this.$state.current.name === 'home') {
-                                this.$state.go(this.$state.current, this.$stateParams, {reload: true});
-                            }
-
-                            return this.loadUser(true);
-
-                        }
-                );
-            }
-        }));
-    }
-
-    static forgotPassword(user) {
-        return this.http.post(this.RESOURCE.AUTH_FORGOT_PASSWORD, user);
-    }
-
-    static validateKey(key) {
-        return this.http.post(this.RESOURCE.AUTH_VALIDATE_KEY + key);
-    }
-
-    static resetPassword(key, user) {
-        return this.http.post(this.RESOURCE.AUTH_RESET_PASSWORD + key, user);
-    }
-
-    static canAnnotate(repoKey, path) {
-        return this.http.get(this.RESOURCE.AUTH_CAN_ANNOTATE + repoKey + '&path=' + path).then((response) => {
-            return response;
-        });
-    }
-
-    static getLoginData() {
-        return this.http.post(this.RESOURCE.AUTH_LOGIN_DATA).then((response) => {
-            return response.data;//!!response.data.forgotPassword;
-        });
-    }
-
-    static getOAuthLoginData() {
-        return this.http.get(this.RESOURCE.OAUTH_LOGIN).then((response) => {
-            return response.data;
-        });
-    }
-
-    static setUser(user) {
-        this.currentUser.setData(user);
-        this.storage.setItem(USER_KEY, user);
-        return this.currentUser;
-    }
-
-    static loadUser(force = false) {
-        var user = this.storage.getItem(USER_KEY);
-        if (user) {
-            this.currentUser.setData(user);
-        }
-        if (force || !user) {
-            this.whenLoadedFromServer = this.http.get(this.RESOURCE.AUTH_CURRENT, {bypassSessionInterceptor: true})
-                    .then(
-                    (user) => this.setUser(
-                            user.data
-                            //TODO need to verify with Adam
-                            //user.headers && typeof(user.headers) === 'function' && user.headers().sessionvalid && user.headers().sessionvalid === 'false' ? GUEST_USER : user.data
-                    )
-            );
-            return this.whenLoadedFromServer;
-        }
-        else {
-            return this.$q.when(this.currentUser)
-        }
-    }
-
-    static getCurrent() {
-        return this.currentUser;
-    }
-
-    static reload() {
-        this.loadUser(true);
-    }
-}
-
-
-export function UserFactory(ArtifactoryHttpClient, ArtifactoryStorage, RESOURCE, $q, $window, $state, $stateParams, ArtifactoryEventBus,
-        ArtifactoryState) {
-    // Set static members on class:
-    User.http = ArtifactoryHttpClient;
-    User.storage = ArtifactoryStorage;
-    User.RESOURCE = RESOURCE;
-    User.$q = $q;
-    User.$window = $window;
-    User.$state = $state;
-    User.$stateParams = $stateParams;
-    User.artifactoryState = ArtifactoryState;
-    User.ArtifactoryEventBus = ArtifactoryEventBus;
-    User.currentUser = new User();
-    // Load user from localstorage:
-    User.loadUser(/* force */ true);
-
-    return User;
-}
diff --git a/web/angular-web/src/main/webapp/app/states/admin/admin.controller.js b/web/angular-web/src/main/webapp/app/states/admin/admin.controller.js
deleted file mode 100644
index 5fabbf8..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/admin.controller.js
+++ /dev/null
@@ -1,38 +0,0 @@
-export class AdminController {
-
-    constructor($state, AdminMenuItems, ArtifactoryState, User, ArtifactoryFeatures) {
-        this.items = AdminMenuItems;
-        this.state = $state;
-        this.user = User.getCurrent();
-        this.artifactoryState = ArtifactoryState;
-        this.features = ArtifactoryFeatures;
-        this._goToSpecificAdminState();
-    }
-
-    _goToSpecificAdminState() {
-        if (this.state.current.name !== 'admin') {
-            if (!this.state.current.name.match(/(?:.new|.edit)\b/)) {
-                this.artifactoryState.setState('lastAdminState', this.state.current);
-                this.artifactoryState.setState('lastAdminStateParams', this.state.params);
-            }
-            return;
-        }
-        
-        let state = this.artifactoryState.getState('lastAdminState');
-        let stateParams = this.artifactoryState.getState('lastAdminStateParams');
-        let feature = state && state.params && state.params.feature;
-        if (!state ||
-            !this.user.canView(state.name) ||
-            this.features.isDisabled(feature) ||
-            this.features.isHidden(feature)) {
-            state = this.user.isAdmin() ? 'admin.repositories.list' : 'admin.security.permissions';
-            stateParams = this.user.isAdmin() ? {repoType: 'local'} : {};
-        }
-        this.state.go(state, stateParams);
-    }
-
-    isDashboard() {
-        return this.state.$current.includes['admin.dashboard']
-    }
-
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/admin.html b/web/angular-web/src/main/webapp/app/states/admin/admin.html
deleted file mode 100644
index bc2bb44..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/admin.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<div class="admin-wrapper">
-    <ui-view></ui-view>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/states/admin/admin.module.js b/web/angular-web/src/main/webapp/app/states/admin/admin.module.js
deleted file mode 100644
index 85d1172..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/admin.module.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import Configuration     from './configuration/configuration.module';
-import Repositories      from './repositories/repositories.module';
-import Advanced          from './advanced/advanced.module';
-import Dashboard         from './dashboard/dashboard.module';
-import ImportExport      from './import_export/import_export.module';
-import Security          from './security/security.module';
-import Services          from './services/admin.services.module';
-
-import {AdminController} from './admin.controller';
-
-function adminConfig($stateProvider) {
-    $stateProvider
-            .state('admin', {
-                url: '/admin',
-                parent: 'app-layout',
-                templateUrl: "states/admin/admin.html",
-                controller: 'AdminController as Admin'
-            })
-}
-
-export default angular.module('admin.module', [
-    Configuration.name,
-    Repositories.name,
-    Advanced.name,
-    Dashboard.name,
-    ImportExport.name,
-    Security.name,
-    Services.name
-])
-        .config(adminConfig)
-        .controller('AdminController', AdminController)
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/advanced/advanced.controller.js b/web/angular-web/src/main/webapp/app/states/admin/advanced/advanced.controller.js
deleted file mode 100644
index 9572f9e..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/advanced/advanced.controller.js
+++ /dev/null
@@ -1,9 +0,0 @@
-export class AdminAdvancedController {
-
-  constructor () {
-    var AdminAdvanced = this;
-    AdminAdvanced.stateUrl = '/advanced';
-    AdminAdvanced.controllerName = 'AdminAdvancedController'
-  }
-}
-
diff --git a/web/angular-web/src/main/webapp/app/states/admin/advanced/advanced.module.js b/web/angular-web/src/main/webapp/app/states/admin/advanced/advanced.module.js
deleted file mode 100644
index 1e609b8..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/advanced/advanced.module.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import ConfigDescriptor     from './config_descriptor/config_descriptor.module';
-import Maintenance          from './maintenance/maintenance.module';
-import SecurityDescriptor   from './security_descriptor/security_descriptor.module';
-import StorageSummary       from './storage_summary/storage_summary.module';
-import SystemInfo           from './system_info/system_info.module';
-import SystemLogs           from './system_logs/system_logs.module';
-import SupportPage           from './support_page/support_page.module';
-
-
-import {AdminAdvancedController} from './advanced.controller';
-
-function advancedConfig($stateProvider) {
-    $stateProvider
-            .state('admin.advanced', {
-                url: '/advanced',
-                template: '<ui-view></ui-view>',
-                controller: 'AdminAdvancedController as AdminAdvanced'
-            })
-}
-
-export default angular.module('admin.advanced', [
-    ConfigDescriptor.name,
-    Maintenance.name,
-    SecurityDescriptor.name,
-    StorageSummary.name,
-    SystemInfo.name,
-    SystemLogs.name,
-    SupportPage.name
-])
-        .config(advancedConfig)
-        .controller('AdminAdvancedController', AdminAdvancedController);
-
diff --git a/web/angular-web/src/main/webapp/app/states/admin/advanced/config_descriptor/config_descriptor.controller.js b/web/angular-web/src/main/webapp/app/states/admin/advanced/config_descriptor/config_descriptor.controller.js
deleted file mode 100644
index d2ddbdb..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/advanced/config_descriptor/config_descriptor.controller.js
+++ /dev/null
@@ -1,45 +0,0 @@
-export class AdminAdvancedConfigDescriptorController {
-
-    constructor($timeout, ArtifactoryHttpClient, ArtifactoryNotifications, RESOURCE, ArtifactoryModelSaver) {
-        this.$timeout = $timeout;
-        this.RESOURCE = RESOURCE;
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this.artifactoryHttpClient = ArtifactoryHttpClient;
-        this.configDescriptor = '';
-        this.apiAccess = {};
-        this.artifactoryModelSaver = ArtifactoryModelSaver.createInstance(this,['configDescriptor']);
-
-        this._getData();
-    }
-
-    _getData() {
-        this.artifactoryHttpClient.get(this.RESOURCE.CONFIG_DESCRIPTOR).then((response) => {
-                this.configDescriptor = response.data;
-                this.artifactoryModelSaver.save();
-                this.$timeout(()=> {
-                    this.apiAccess.api.clearHistory();
-                });
-            }
-        );
-    }
-
-    save(configXml) {
-        this.artifactoryHttpClient.put(this.RESOURCE.CONFIG_DESCRIPTOR, {configXml})
-            .success(response => {
-                this.artifactoryModelSaver.save();
-                this.artifactoryNotifications.create(response)
-            })
-            .error(response => {
-                if (response.errors && response.errors.length) {
-                    this.artifactoryNotifications.create(angular.fromJson(response.errors[0].message));
-                }
-            });
-    }
-
-    cancel() {
-        this.artifactoryModelSaver.ask().then(()=>{
-            this._getData();
-        });
-    }
-
-}
diff --git a/web/angular-web/src/main/webapp/app/states/admin/advanced/config_descriptor/config_descriptor.html b/web/angular-web/src/main/webapp/app/states/admin/advanced/config_descriptor/config_descriptor.html
deleted file mode 100644
index ff91192..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/advanced/config_descriptor/config_descriptor.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<div class="content-layout-container">
-    <h1>Config Descriptor <jf-clip-copy text-to-copy="ConfigDescriptorController.configDescriptor"
-                                        object-name="XML"></jf-clip-copy>
-    </h1>
-    <div class="field-bottom-remark">
-        <i class="icon icon-notif-warning"></i>Warning: Updating the configuration through direct manipulation of the XML descriptors can be harmful.
-    </div>
-    <form>
-        <div class="content-wrapper">
-            <div class="card stretch card-pole-pad card-side-pad">
-                <div class="content-with-footer">
-                    <jf-code-mirror
-                            ng-if="ConfigDescriptorController.configDescriptor !== undefined"
-                            mime-type="xml"
-                            allow-edit="true"
-                            height="flexible"
-                            model="ConfigDescriptorController.configDescriptor"
-                            autofocus="true"
-                            api-access="ConfigDescriptorController.apiAccess">
-                    </jf-code-mirror>
-                </div>
-            </div>
-
-            <div class="content-footer">
-                <div class="pull-right">
-                    <button class="btn btn-default"
-                            type="button"
-                            ng-click="ConfigDescriptorController.cancel()">Reset
-                    </button>
-                    <button class="btn btn-primary"
-                            type="button"
-                            ng-click="ConfigDescriptorController.save(ConfigDescriptorController.configDescriptor)">Save
-                    </button>
-                </div>
-            </div>
-        </div>
-    </form>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/advanced/config_descriptor/config_descriptor.module.js b/web/angular-web/src/main/webapp/app/states/admin/advanced/config_descriptor/config_descriptor.module.js
deleted file mode 100644
index cecf30e..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/advanced/config_descriptor/config_descriptor.module.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import {AdminAdvancedConfigDescriptorController} from './config_descriptor.controller';
-
-function configDescriptorConfig($stateProvider) {
-
-    $stateProvider
-            .state('admin.advanced.config_descriptor', {
-                params: {feature: 'configDescriptor'},
-                url: '/config_descriptor',
-                templateUrl: 'states/admin/advanced/config_descriptor/config_descriptor.html',
-                controller: 'AdminAdvancedConfigDescriptorController as ConfigDescriptorController'
-            })
-}
-
-export default angular.module('advanced.config_descriptor', [])
-        .config(configDescriptorConfig)
-        .controller('AdminAdvancedConfigDescriptorController', AdminAdvancedConfigDescriptorController);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/advanced/maintenance/maintenance.controller.js b/web/angular-web/src/main/webapp/app/states/admin/advanced/maintenance/maintenance.controller.js
deleted file mode 100644
index 5c5086f..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/advanced/maintenance/maintenance.controller.js
+++ /dev/null
@@ -1,77 +0,0 @@
-import EVENTS from '../../../../constants/common_events.constants.js';
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-
-export class AdminAdvancedMaintenanceController {
-    constructor(MaintenanceDao, ArtifactoryNotifications, ArtifactoryEventBus, ArtifactoryModal, ArtifactoryModelSaver) {
-        this.maintenanceDao = MaintenanceDao;
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.artifactoryModal = ArtifactoryModal;
-        this.artifactoryModelSaver = ArtifactoryModelSaver.createInstance(this,['maintenanceSettings']);
-        this.maintenanceSettings = {};
-        this.TOOLTIP = TOOLTIP.admin.advanced.maintenance;
-
-        this._getData();
-    }
-
-    _getData() {
-        this.maintenanceDao.get().$promise.then(data => {
-            this.backupMaintance = angular.copy(data);
-            this.maintenanceSettings.cleanUnusedCachedCron = data.cleanUnusedCachedCron;
-            this.maintenanceSettings.cleanVirtualRepoCron = data.cleanVirtualRepoCron;
-            this.maintenanceSettings.garbageCollectorCron = data.garbageCollectorCron;
-            this.maintenanceSettings.quotaControl = data.quotaControl;
-            this.maintenanceSettings.storageLimit = data.storageLimit;
-            this.maintenanceSettings.storageWarning = data.storageWarning;
-            this.artifactoryModelSaver.save();
-        });
-    }
-
-    save() {
-        if (this.maintenanceForm.$valid) {
-            this.maintenanceDao.update(this.maintenanceSettings).$promise.then(()=>{
-                this.artifactoryModelSaver.save();
-            });
-        }
-    }
-
-    clear() {
-        this.artifactoryModelSaver.ask().then(()=>{
-            this.artifactoryEventBus.dispatch(EVENTS.FORM_CLEAR_FIELD_VALIDATION, true);
-            this._getData();
-        });
-    }
-
-    resetQuotaFields() {
-        if (!this.maintenanceSettings.quotaControl) {
-            this.maintenanceSettings.storageLimit = this.backupMaintance.storageLimit;
-            this.maintenanceSettings.storageWarning = this.backupMaintance.storageWarning;
-        }
-    }
-
-    _runAction(name) {
-        this.maintenanceDao.perform({module: name});
-    }
-
-    runGarbageCollection() {
-        this._runAction('garbageCollection');
-    }
-
-    runUnusedCachedArtifactsCleanup() {
-        this._runAction('cleanUnusedCache');
-    }
-
-    compressInternalDatabase() {
-        this.artifactoryModal.confirm('Are you sure you want to compress the internal database?')
-            .then(() => this._runAction('compress'));
-    }
-
-    pruneUnreferencedData() {
-        this._runAction('prune');
-    }
-
-    cleanVirtualRepositories() {
-        this._runAction('cleanVirtualRepo');
-    }
-
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/advanced/maintenance/maintenance.html b/web/angular-web/src/main/webapp/app/states/admin/advanced/maintenance/maintenance.html
deleted file mode 100644
index aebafe0..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/advanced/maintenance/maintenance.html
+++ /dev/null
@@ -1,205 +0,0 @@
-<div class="content-layout-container">
-    <h1>Maintenance Configuration</h1>
-
-    <div class="content-wrapper">
-        <form class="form" name="Maintenance.maintenanceForm" ng-submit="Maintenance.save()" novalidate>
-            <div class="card stretch card-pole-pad card-side-pad">
-                <div class="content-with-footer">
-                    <jf-panel jf-panel-heading="Garbage Collection">
-                        <div class="form-group half-margin-bottom">
-                            <div class="form-group-cell">
-                                <jf-field validations="maintenance" autofocus="true">
-                                    <label for="garbageCollectorCron" class="mandatory">Cron Expression</label>
-                                    <jf-help-tooltip html="Maintenance.TOOLTIP.garbageCronExpression"></jf-help-tooltip>
-                                    <input type="text"
-                                           jf-validator-cron
-                                           required
-                                           class="input-text"
-                                           id="garbageCollectorCron"
-                                           name="garbageCollectorCron"
-                                           ng-model="Maintenance.maintenanceSettings.garbageCollectorCron"
-                                           ng-model-options="{debounce: { 'default': 500 } }"/>
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell">
-                                <jf-field>
-                                    <label for="nextGarbageCollectionTime">Next Run Time</label>
-                                    <input type="text"
-                                           id="nextGarbageCollectionTime"
-                                           name="nextGarbageCollectionTime"
-                                           jf-cron-formatter
-                                           class="input-text disabled-look"
-                                           readonly
-                                           ng-model-options="{debounce: { 'default': 500 } }"
-                                           ng-model="Maintenance.maintenanceSettings.garbageCollectorCron"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <div ng-click="Maintenance.runGarbageCollection()"
-                                     class="text-button">
-                                    <span class="icon icon-run"></span>Run Now
-                                </div>
-                            </div>
-                        </div>
-                    </jf-panel>
-
-                    <jf-panel jf-panel-heading="Storage Quota">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Enable Quota Control">
-                                    <input type="checkbox"
-                                           id="quotaControl"
-                                           ng-model="Maintenance.maintenanceSettings.quotaControl"
-                                           ng-change="Maintenance.resetQuotaFields()">
-                                </jf-checkbox>
-                                <jf-help-tooltip html="Maintenance.TOOLTIP.enableQuotaControl"></jf-help-tooltip>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="maintenance">
-                                    <label for="storageSpaceWarning" class="mandatory">Storage Space Warning (Percentage)</label>
-                                    <jf-help-tooltip html="Maintenance.TOOLTIP.storageSpaceWarning"></jf-help-tooltip>
-                                    <input type="number"
-                                           jf-validator-int-value
-                                           ng-model-options="{debounce: { 'default': 500 } }"
-                                           class="input-text"
-                                           id="storageSpaceWarning"
-                                           name="storageSpaceWarning"
-                                           min="0"
-                                           max="99"
-                                           ng-model="Maintenance.maintenanceSettings.storageWarning"
-                                           ng-required="Maintenance.maintenanceSettings.quotaControl"
-                                           ng-disabled="!Maintenance.maintenanceSettings.quotaControl">
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell">
-                                <jf-field validations="maintenance">
-                                    <label for="storageSpaceLimit" class="mandatory">Storage Space Limit (Percentage)</label>
-                                    <jf-help-tooltip html="Maintenance.TOOLTIP.storageSpaceLimit"></jf-help-tooltip>
-                                    <input type="number"
-                                           jf-validator-int-value
-                                           ng-model-options="{debounce: { 'default': 500 } }"
-                                           class="input-text"
-                                           id="storageSpaceLimit"
-                                           name="storageSpaceLimit"
-                                           min="0"
-                                           max="99"
-                                           ng-model="Maintenance.maintenanceSettings.storageLimit"
-                                           ng-required="Maintenance.maintenanceSettings.quotaControl"
-                                           ng-disabled="!Maintenance.maintenanceSettings.quotaControl">
-                                </jf-field>
-                            </div>
-                        </div>
-                    </jf-panel>
-
-                    <jf-panel jf-panel-heading="Cleanup Unused Cached Artifacts">
-                        <div class="form-group half-margin-bottom">
-                            <div class="form-group-cell">
-                                <jf-field validations="maintenance">
-                                    <label for="cleanUnusedCached" class="mandatory">Cron Expression</label>
-                                    <jf-help-tooltip html="Maintenance.TOOLTIP.cleanupCronExpression"></jf-help-tooltip>
-                                    <input type="text"
-                                           class="input-text"
-                                           id="cleanUnusedCached"
-                                           name="cleanUnusedCached"
-                                           required
-                                           jf-validator-cron
-                                           ng-model-options="{debounce: { 'default': 500 } }"
-                                           ng-model="Maintenance.maintenanceSettings.cleanUnusedCachedCron"/>
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell">
-                                <jf-field>
-                                    <label for="cleanUnusedCachedCronDisplay">Next Run Time</label>
-                                    <input type="text"
-                                           id="cleanUnusedCachedCronDisplay"
-                                           name="cleanUnusedCachedCronDisplay"
-                                           jf-cron-formatter
-                                           class="input-text disabled-look"
-                                           readonly
-                                           ng-model="Maintenance.maintenanceSettings.cleanUnusedCachedCron"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <div ng-click="Maintenance.runUnusedCachedArtifactsCleanup()"
-                                     class="text-button">
-                                    <span class="icon icon-run"></span>Cleanup Unused Cached Artifacts
-                                </div>
-                            </div>
-                        </div>
-                    </jf-panel>
-
-                    <jf-panel jf-panel-heading="Cleanup Virtual Repositories">
-                        <div class="form-group half-margin-bottom">
-                            <div class="form-group-cell">
-                                <jf-field validations="maintenance">
-                                    <label for="cronExpression" class="mandatory">Cron Expression</label>
-                                    <jf-help-tooltip html="Maintenance.TOOLTIP.cleanupCronExpression"></jf-help-tooltip>
-                                    <input type="text"
-                                           class="input-text"
-                                           id="cronExpression"
-                                           name="cronExpression"
-                                           required
-                                           jf-validator-cron
-                                           ng-model-options="{debounce: { 'default': 500 } }"
-                                           ng-model="Maintenance.maintenanceSettings.cleanVirtualRepoCron"/>
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell">
-                                <jf-field>
-                                    <label for="nextCleanVirtualTime">Next Run Time</label>
-                                    <input type="text"
-                                           id="nextCleanVirtualTime"
-                                           name="nextCleanVirtualTime"
-                                           jf-cron-formatter
-                                           class="input-text disabled-look"
-                                           readonly
-                                           ng-model="Maintenance.maintenanceSettings.cleanVirtualRepoCron"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <div ng-click="Maintenance.cleanVirtualRepositories()"
-                                     class="text-button">
-                                    <span class="icon icon-run"></span>Clean Virtual Repositories Now
-                                </div>
-                            </div>
-                        </div>
-                    </jf-panel>
-
-                    <jf-panel jf-panel-heading="Storage">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <div ng-click="Maintenance.compressInternalDatabase()"
-                                     class="text-button">
-                                    <span class="icon icon-run"></span>Compress the Internal Database
-                                </div>
-                                <div ng-click="Maintenance.pruneUnreferencedData()"
-                                     class="text-button">
-                                    <span class="icon icon-run"></span>Prune Unreferenced Data
-                                </div>
-                            </div>
-                        </div>
-                    </jf-panel>
-                </div>
-            </div>
-
-            <div class="content-footer">
-                <div class="pull-right">
-                    <button class="btn btn-default" type="button"
-                            ng-click="Maintenance.clear()">Reset
-                    </button>
-                    <button class="btn btn-primary"
-                            ng-disabled="Maintenance.maintenanceForm.$invalid !== false"
-                            type="submit">Save</button>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/advanced/maintenance/maintenance.module.js b/web/angular-web/src/main/webapp/app/states/admin/advanced/maintenance/maintenance.module.js
deleted file mode 100644
index 903cf73..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/advanced/maintenance/maintenance.module.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import {AdminAdvancedMaintenanceController} from './maintenance.controller';
-
-function maintenanceConfig($stateProvider) {
-
-    $stateProvider
-            .state('admin.advanced.maintenance', {
-                params: {feature: 'maintenance'},
-                url: '/maintenance',
-                templateUrl: 'states/admin/advanced/maintenance/maintenance.html',
-                controller: 'AdminAdvancedMaintenanceController as Maintenance'
-            })
-}
-
-export default angular.module('advanced.maintenance', [])
-        .config(maintenanceConfig)
-        .controller('AdminAdvancedMaintenanceController', AdminAdvancedMaintenanceController);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/advanced/security_descriptor/security_descriptor.controller.js b/web/angular-web/src/main/webapp/app/states/admin/advanced/security_descriptor/security_descriptor.controller.js
deleted file mode 100644
index 59f1e4a..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/advanced/security_descriptor/security_descriptor.controller.js
+++ /dev/null
@@ -1,43 +0,0 @@
-export class AdminAdvancedSecurityDescriptorController {
-    constructor($timeout, ArtifactoryHttpClient, ArtifactoryNotifications, RESOURCE, ArtifactoryModelSaver) {
-        this.artifactoryHttpClient = ArtifactoryHttpClient;
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this.RESOURCE = RESOURCE;
-        this.$timeout = $timeout;
-        this.securityDescriptor = '';
-        this.apiAccess = {};
-        this.artifactoryModelSaver = ArtifactoryModelSaver.createInstance(this,['securityDescriptor']);
-
-        this._getData();
-    }
-
-    _getData() {
-        this.artifactoryHttpClient.get(this.RESOURCE.SECURITY_DESCRIPTOR).then((response) => {
-            this.securityDescriptor = response.data;
-            this.artifactoryModelSaver.save();
-            this.$timeout(()=> {
-                this.apiAccess.api.clearHistory();
-            });
-        });
-    }
-
-    save(securityXML) {
-        this.artifactoryHttpClient.put(this.RESOURCE.SECURITY_DESCRIPTOR, {securityXML}).
-            success((response) => {
-                    this.artifactoryModelSaver.save();
-                    this.artifactoryNotifications.create(response);
-                }
-        )
-            .error((response) => {
-                if (response.errors && response.errors.length) {
-                    this.artifactoryNotifications.create(angular.fromJson(response.errors[0].message));
-                }
-            });
-    }
-
-    cancel() {
-        this.artifactoryModelSaver.ask().then(()=>{
-            this._getData();
-        });
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/advanced/security_descriptor/security_descriptor.html b/web/angular-web/src/main/webapp/app/states/admin/advanced/security_descriptor/security_descriptor.html
deleted file mode 100644
index 628ba57..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/advanced/security_descriptor/security_descriptor.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<div class="content-layout-container">
-    <h1>Security Descriptor <jf-clip-copy text-to-copy="SecurityDescriptorController.securityDescriptor"
-                                          object-name="XML"></jf-clip-copy>
-    </h1>
-    <div class="field-bottom-remark">
-        <i class="icon icon-notif-warning"></i>Warning: Updating the configuration through direct manipulation of the XML descriptors can be harmful.
-    </div>
-    <form>
-        <div class="content-wrapper">
-            <div class="card stretch card-pole-pad card-side-pad">
-                <div class="content-with-footer">
-                    <jf-code-mirror
-                            ng-if="SecurityDescriptorController.securityDescriptor !== undefined"
-                            mime-type="xml"
-                            allow-edit="true"
-                            height="flexible"
-                            autofocus="true"
-                            model="SecurityDescriptorController.securityDescriptor"
-                            api-access="SecurityDescriptorController.apiAccess">
-                    </jf-code-mirror>
-                </div>
-            </div>
-
-            <div class="content-footer">
-                <div class="pull-right">
-                    <button class="btn btn-default" type="button"
-                            ng-click="SecurityDescriptorController.cancel()">Reset
-                    </button>
-                    <button class="btn btn-primary" type="button"
-                            ng-click="SecurityDescriptorController.save(SecurityDescriptorController.securityDescriptor)">
-                        Save
-                    </button>
-                </div>
-            </div>
-        </div>
-    </form>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/advanced/security_descriptor/security_descriptor.module.js b/web/angular-web/src/main/webapp/app/states/admin/advanced/security_descriptor/security_descriptor.module.js
deleted file mode 100644
index a21ff0f..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/advanced/security_descriptor/security_descriptor.module.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import {AdminAdvancedSecurityDescriptorController} from './security_descriptor.controller';
-
-function securityDescriptorConfig($stateProvider) {
-
-    $stateProvider
-            .state('admin.advanced.security_descriptor', {
-                params: {feature: 'securityDescriptor'},
-                url: '/security_descriptor',
-                templateUrl: 'states/admin/advanced/security_descriptor/security_descriptor.html',
-                controller: 'AdminAdvancedSecurityDescriptorController as SecurityDescriptorController'
-            })
-}
-
-export default  angular.module('advanced.security_descriptor', [])
-        .config(securityDescriptorConfig)
-        .controller('AdminAdvancedSecurityDescriptorController', AdminAdvancedSecurityDescriptorController)
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/advanced/storage_summary/storage_summary.controller.js b/web/angular-web/src/main/webapp/app/states/admin/advanced/storage_summary/storage_summary.controller.js
deleted file mode 100644
index 05b28bf..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/advanced/storage_summary/storage_summary.controller.js
+++ /dev/null
@@ -1,225 +0,0 @@
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-import FIELD_OPTIONS from '../../../../constants/field_options.constats';
-
-export class AdminAdvancedStorageSummaryController {
-    constructor($scope,$timeout,StorageSummaryDao, ArtifactoryGridFactory, uiGridConstants, commonGridColumns,$compile, ArtifactoryFeatures) {
-        this.$scope = $scope;
-        this.$compile = $compile;
-        this.$timeout = $timeout;
-        this.commonGridColumns = commonGridColumns;
-        this.storageSummary = {};
-        this.gridOption = {};
-        this.uiGridConstants = uiGridConstants;
-        this.storageSummaryDao = StorageSummaryDao.getInstance();
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.features = ArtifactoryFeatures;
-        this.TOOLTIP = TOOLTIP.admin.advanced.storageSummary;
-        this.counterTooltip = 'List includes all Local and Virtual repositories, and Remote repositories configured to store artifacts locally.'
-        this.binariesKeys = ['binariesSize','binariesCount','artifactsSize','artifactsCount','optimization','itemsCount'];
-        this.storageSummaryDao.get().$promise.then((result) => {
-            this.storageSummary = result;
-            this.storageSummary.repositoriesSummaryList = _.map(this.storageSummary.repositoriesSummaryList,(row)=>{
-
-                if (row.repoKey==='TOTAL') {
-                    row.percentage = 100;
-                    row.percentageDisplay = '100%';
-                }
-                else {
-                    row.percentage = !_.isNaN(parseFloat(row.percentage)) ? parseFloat(row.percentage) : row.percentage;
-                    row.percentageDisplay = _.isNumber(row.percentage) ? row.percentage + '%' : 'N/A';
-                }
-
-                if (row.repoType === 'NA') row.repoType = 'N/A';
-                if (row.packageType === 'NA') row.packageType = 'N/A';
-
-                if (row.repoKey === 'TOTAL' || row.repoKey === 'auto-trashcan') {
-                    row['__doNotCount__'] = true;
-                    row.packageType = 'N/A';
-                    row._specialRow = true;
-                }
-
-                if (row.repoKey === 'auto-trashcan') {
-                    row.trashcan = true;
-                    row.packageType = 'Trash';
-                    row.repoKey = "Trash Can";
-                }
-
-                let repoKey = row.repoKey;
-                for (let key in row) {
-                    if (key !== '__doNotCount__' && key !== 'percentageDisplay') row[key] = {value: row[key], repoKey: repoKey};
-                }
-
-                var rowPackageType =_.find(FIELD_OPTIONS.repoPackageTypes, (type) => {
-                    return type.serverEnumName == row.packageType.value;
-                });
-                if (rowPackageType)
-                    row.typeIcon = rowPackageType.icon;
-
-                if (row.packageType.value === 'Trash')
-                    row.typeIcon = 'trash';
-
-                if (row.packageType.value === 'Distribution') {
-                    row.typeIcon = 'distribution-repo';
-                }
-
-                return row;
-            });
-
-            //This is for assuring that even without sorting, total will always be first and trash will be second
-            let total = _.findWhere(this.storageSummary.repositoriesSummaryList,{repoKey: {value:'TOTAL'}});
-            let trash = _.findWhere(this.storageSummary.repositoriesSummaryList,{repoKey: {value:'Trash Can'}});
-            let totalIndex = this.storageSummary.repositoriesSummaryList.indexOf(total);
-            let trashIndex = this.storageSummary.repositoriesSummaryList.indexOf(trash);
-            this.storageSummary.repositoriesSummaryList.splice(totalIndex,1);
-            this.storageSummary.repositoriesSummaryList.splice(trashIndex,1);
-            this.storageSummary.repositoriesSummaryList.unshift(trash);
-            this.storageSummary.repositoriesSummaryList.unshift(total);
-
-            if (this.storageSummary.fileStoreSummary && this.storageSummary.fileStoreSummary.storageDirectory.indexOf(', ') != -1) {
-                this.storageSummary.fileStoreSummary.storageDirectory = '<div class="storage-multiple-mounts">' + this.storageSummary.fileStoreSummary.storageDirectory.replace(/, /g, '<br>') + '</div>';
-                this.storageSummary.fileStoreSummary.storageType = 'Advanced Configuration';
-            }
-            
-            this.createGrid();
-        });
-    }
-
-    createGrid() {
-        this.gridOption = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setColumns(this.getColumns())
-                .setGridData(this.storageSummary.repositoriesSummaryList)
-                .setRowTemplate('default');
-
-        this.gridOption.afterRegister((gridApi)=>{
-            gridApi.pagination.on.paginationChanged(this.$scope, (pageNumber, pageSize) => {
-                let specialsToRemove = $('.ui-grid-row.special-row');
-                specialsToRemove.removeClass('special-row');
-                this.$timeout(()=>{
-                    let specials = $('.special-row');
-                    specials.parent().parent().addClass('special-row');
-                    specials.removeClass('special-row')
-                },100)
-            });
-        });
-
-        this.$timeout(()=>{
-            let counterElem = $('.grid-counter');
-            let tooltipElem = $('<jf-help-tooltip html="StorageSummaryController.counterTooltip"></jf-help-tooltip>');
-            counterElem.append(tooltipElem);
-            this.$compile(tooltipElem)(this.$scope);
-
-            let specials = $('.special-row');
-            specials.parent().parent().addClass('special-row');
-            specials.removeClass('special-row')
-
-        })
-    }
-
-    sortGeneral(a,b) {
-        let dir = 'asc';
-        if (this) {
-            dir = _.findWhere(this.ctrl.gridOption.api.grid.columns, {field: this.column}).sort.direction;
-        }
-        if (a.repoKey === 'TOTAL') return dir === 'desc' ? 1 : -1;
-        else if (b.repoKey === 'TOTAL') return dir === 'desc' ? -1 : 1;
-        else if (a.repoKey === 'Trash Can') return dir === 'desc' ? 1 : -1;
-        else if (b.repoKey === 'Trash Can') return dir === 'desc' ? -1 : 1;
-        else return a.value > b.value ? 1 : a.value < b.value ? -1 : 0;
-    }
-
-    sortByteSizes(a,b) {
-        let dir = 'asc';
-        if (this) {
-            dir = _.findWhere(this.ctrl.gridOption.api.grid.columns, {field: this.column}).sort.direction;
-        }
-
-        let res = 0;
-        if (a===undefined || b===undefined) return res;
-
-        if (a.repoKey === 'TOTAL') return dir === 'desc' ? 1 : -1;
-        else if (b.repoKey === 'TOTAL') return dir === 'desc' ? -1 : 1;
-        else if (a.repoKey === 'Trash Can') return dir === 'desc' ? 1 : -1;
-        else if (b.repoKey === 'Trash Can') return dir === 'desc' ? -1 : 1;
-        else {
-            var tb = [a.value.match('TB'), b.value.match('TB')],
-                gb = [a.value.match('GB'), b.value.match('GB')],
-                mb = [a.value.match('MB'), b.value.match('MB')],
-                kb = [a.value.match('KB'), b.value.match('KB')]
-
-            res = (tb[0] && !tb[1]) ? 1 : (tb[1] && !tb[0]) ? -1 :
-                      (gb[0] && !gb[1]) ? 1 : (gb[1] && !gb[0]) ? -1 :
-                      (mb[0] && !mb[1]) ? 1 : (mb[1] && !mb[0]) ? -1 :
-                      (kb[0] && !kb[1]) ? 1 : (kb[1] && !kb[0]) ? -1 :
-                      (parseFloat(a.value.match(/[+-]?\d+(\.\d+)?/)[0]) > parseFloat(b.value.match(/[+-]?\d+(\.\d+)?/)[0])) ? 1 : -1
-        }
-
-        return res;
-    }
-
-    getColumns() {
-        return [
-            {
-                field: "repoKey",
-                name: "Repository Key",
-                sortingAlgorithm : this.sortGeneral.bind({column: 'repoKey', ctrl: this}),
-                cellTemplate: '<div class="ui-grid-cell-contents" id="repoKey">{{row.entity.repoKey.value}}</div>',
-                displayName: "Repository Key"
-            },
-            {
-                field: "repoType",
-                name: "Repository Type",
-                sortingAlgorithm : this.sortGeneral.bind({column: 'repoType', ctrl: this}),
-                cellTemplate: '<div class="ui-grid-cell-contents" id="repoType">{{row.entity.repoType.value}}</div>',
-                displayName: "Repository Type"
-            },
-            {
-                field: "packageType",
-                name: "Package Type",
-                displayName: "Package Type",
-                sortingAlgorithm : this.sortGeneral.bind({column: 'packageType', ctrl: this}),
-                cellTemplate: this.commonGridColumns.iconColumn('row.entity.packageType.value', 'row.entity.typeIcon', 'repo-type-icon')
-            },
-            {
-                field: "percentage",
-                cellTemplate: '<div class="ui-grid-cell-contents text-center" id="storage-precentage" >{{row.entity.percentageDisplay}}</div>',
-                name: "Percentage",
-                sortingAlgorithm : this.sortGeneral.bind({column: 'percentage', ctrl: this}),
-                displayName: "Percentage"
-            },
-            {
-                field: "usedSpace",
-                name: "Used Space",
-                displayName: "Artifacts Size",
-                cellTemplate: '<div class="ui-grid-cell-contents text-center" id="used-space" >{{row.entity.usedSpace.value}}</div>',
-                sortingAlgorithm : this.sortByteSizes.bind({column: 'usedSpace', ctrl: this}),
-                sort: {
-                    direction: this.uiGridConstants.DESC
-                }
-            },
-            {
-                field: "filesCount",
-                name: "Files",
-                sortingAlgorithm : this.sortGeneral.bind({column: 'filesCount', ctrl: this}),
-                cellTemplate: '<div class="ui-grid-cell-contents" id="files" >  {{row.entity.filesCount.value}}</div>',
-                displayName: "Files"
-            },
-            {
-                field: "foldersCount",
-                name: "Folders",
-                sortingAlgorithm : this.sortGeneral.bind({column: 'foldersCount', ctrl: this}),
-                cellTemplate: '<div class="ui-grid-cell-contents" id="folders" >{{row.entity.foldersCount.value}}</div>',
-                displayName: "Folders"
-            },
-            {
-                field: "itemsCount",
-                name: "Items",
-                sortingAlgorithm : this.sortGeneral.bind({column: 'itemsCount', ctrl: this}),
-                cellTemplate: '<div class="ui-grid-cell-contents" id="items" >{{row.entity.itemsCount.value}}</div>',
-                displayName: "Items"
-            }
-
-        ]
-    }
-
-
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/advanced/storage_summary/storage_summary.html b/web/angular-web/src/main/webapp/app/states/admin/advanced/storage_summary/storage_summary.html
deleted file mode 100644
index 27a125a..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/advanced/storage_summary/storage_summary.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<div class="content-layout-container">
-    <h1>Storage Summary</h1>
-
-    <div class="content-wrapper">
-        <div class="card stretch card-pole-pad card-side-pad">
-            <div class="row">
-                <div class="col-lg-12">
-                    <jf-panel jf-panel-heading="Binaries">
-                        <ul class="storage-binaries-summary">
-                            <li ng-repeat="key in StorageSummaryController.binariesKeys">
-                                <span>{{key | splitWords}}: <jf-help-tooltip ng-if="StorageSummaryController.TOOLTIP[key]" html="StorageSummaryController.TOOLTIP[key]"></jf-help-tooltip></span>
-                                {{StorageSummaryController.storageSummary.binariesSummary[key]}}
-                            </li>
-                        </ul>
-                    </jf-panel>
-                </div>
-            </div>
-
-            <jf-panel jf-panel-heading="Storage" ng-if="!StorageSummaryController.features.isAol()">
-                <rtfact-storage-viewer></rtfact-storage-viewer>
-            </jf-panel>
-
-
-
-            <jf-grid grid-options="StorageSummaryController.gridOption"
-                     filter-field="repoKey.value"
-                     filter-on-change="true"
-                     auto-focus="true"
-                     object-name="Repository/Repositories">
-            </jf-grid>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/advanced/storage_summary/storage_summary.module.js b/web/angular-web/src/main/webapp/app/states/admin/advanced/storage_summary/storage_summary.module.js
deleted file mode 100644
index 620bad0..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/advanced/storage_summary/storage_summary.module.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import {AdminAdvancedStorageSummaryController} from './storage_summary.controller';
-
-function storageSummaryConfig($stateProvider) {
-
-    $stateProvider
-            .state('admin.advanced.storage_summary', {
-                url: '/storage_summary',
-                templateUrl: 'states/admin/advanced/storage_summary/storage_summary.html',
-                controller: 'AdminAdvancedStorageSummaryController as StorageSummaryController'
-            })
-}
-
-export default angular.module('advanced.storage_summary', [])
-        .config(storageSummaryConfig)
-        .controller('AdminAdvancedStorageSummaryController', AdminAdvancedStorageSummaryController)
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/advanced/support_page/support_page.controller.js b/web/angular-web/src/main/webapp/app/states/admin/advanced/support_page/support_page.controller.js
deleted file mode 100644
index c15d632..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/advanced/support_page/support_page.controller.js
+++ /dev/null
@@ -1,299 +0,0 @@
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-
-export class AdminAdvancedSupportPageController {
-    constructor(SupportPageDao, ServerTimeDao, $timeout, $scope, artifactoryIFrameDownload, GeneralConfigDao, RESOURCE, ArtifactoryNotifications, $compile, ArtifactoryModal) {
-
-        this.$scope = $scope;
-        this.$timeout = $timeout;
-        this.$compile = $compile;
-        this.supportPageDao = SupportPageDao;
-        this.serverTimeDao = ServerTimeDao;
-        this.iFrameDownload = artifactoryIFrameDownload;
-        this.RESOURCE = RESOURCE;
-        this.TOOLTIP = TOOLTIP.admin.advanced.supportPage;
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this.modal = ArtifactoryModal;
-
-        this.ready = false;
-
-        this.timePeriodConfig = {
-            maxItems: 1,
-            create: false
-        };
-
-
-        GeneralConfigDao.get().$promise.then((data)=> {
-            this.dateFormat = this._getDatePartFromFormat(data.dateFormat);
-            this._init();
-        });
-
-    }
-
-
-    _init() {
-
-
-        this.serverTimeDao.get().$promise.then((serverTimeResource)=>{
-            let serverTime = "";
-            let json = serverTimeResource.toJSON();
-            for (let i=0;i<Object.keys(json).length;i++) {
-                serverTime += json[i];
-            }
-            serverTime = parseInt(serverTime);
-            let miliDiff = serverTime - (new Date()).getTime();
-            let hourDiff = Math.round(miliDiff/(1000*60*60));
-            this.timeDiff = hourDiff*1000*60*60;
-            this._getOldBundles();
-            this.ready = true;
-        });
-
-        let localNow = new Date();
-        let today = this.today = new Date(localNow.getFullYear(), localNow.getMonth(), localNow.getDate());
-        let minDate = this.minDate = new Date(today.getTime()-14*24*60*60*1000);
-
-        this.initAndBindDatepickerElement('from-date','SupportPage.setup.systemLogsConfiguration.startDate',(date)=>{
-            if (this.setup.systemLogsConfiguration.startDate.getTime() > this.setup.systemLogsConfiguration.endDate.getTime()) {
-                this.setup.systemLogsConfiguration.endDate = new Date(this.setup.systemLogsConfiguration.startDate);
-                $('#to-date').datepicker("setDate", this.setup.systemLogsConfiguration.endDate);
-            }
-        });
-        this.initAndBindDatepickerElement('to-date','SupportPage.setup.systemLogsConfiguration.endDate',(date)=>{
-            if (this.setup.systemLogsConfiguration.startDate.getTime() > this.setup.systemLogsConfiguration.endDate.getTime()) {
-                this.setup.systemLogsConfiguration.startDate = new Date(this.setup.systemLogsConfiguration.endDate);
-                $('#from-date').datepicker("setDate", this.setup.systemLogsConfiguration.startDate);
-            }
-        });
-
-        this.setup = {
-            hideUserDetails: true,
-            systemLogsConfiguration : {
-                enabled: true,
-                startDate: new Date(today.getTime()-2*24*60*60*1000),
-                endDate: today
-            },
-            systemInfoConfiguration : {
-                enabled : true
-            },
-            securityInfoConfiguration : {
-                enabled : true
-            },
-            configDescriptorConfiguration : {
-                enabled : true
-            },
-            configFilesConfiguration : {
-                enabled : true
-            },
-            storageSummaryConfiguration : {
-                enabled : true
-            },
-            threadDumpConfiguration : {
-                enabled : true,
-                count: 1,
-                interval: 0
-            }
-        };
-
-        this.timePeriodOptions = [
-            {text: "Last 24 Hours", value: 1},
-            {text: "Last 3 Days", value: 3},
-            {text: "Last 5 Days", value: 5},
-            {text: "Last 7 Days", value: 7},
-            {text: "Custom Dates", value: 'CUSTOM'}
-        ];
-
-        this.timePeriodSelection = 1;
-
-    }
-
-    _getOldBundles() {
-        this.supportPageDao.listBundles().$promise.then((data)=>{
-            this.oldBundles = _.filter(data,(obj)=>{
-                return typeof obj === 'string';
-            });
-            this.oldBundles = _.map(this.oldBundles,(filename)=>{
-                let filenameNoExt=filename.split('.')[0];
-                let time=parseInt(filenameNoExt.split('-')[filenameNoExt.split('-').length-1]) - this.timeDiff;
-                return {
-                    filename: filename,
-                    date: (new Date(time)).toString()
-                }
-            })
-        });
-    }
-
-    onChangeTimePeriod() {
-
-        if (this.timePeriodSelection !== "CUSTOM") {
-            this.setup.systemLogsConfiguration.endDate = this.today;
-            this.setup.systemLogsConfiguration.startDate = new Date(this.today.getTime() - (this.timePeriodSelection-1) *24*60*60*1000);
-            $('#from-date').datepicker("setDate", this.setup.systemLogsConfiguration.startDate);
-            $('#to-date').datepicker("setDate", this.setup.systemLogsConfiguration.endDate);
-        }
-    }
-
-    initAndBindDatepickerElement(elemId,model,changeCallback) {
-        this.$timeout(()=>{
-            $('#'+elemId).datepicker({
-                dateFormat: this.dateFormat,//'dd-mm-yy',
-                maxDate: this.today,
-                showOn: 'none',
-                onSelect: (date, dp) => {
-                    let selectedDate = new Date(dp.selectedYear,dp.selectedMonth,dp.selectedDay);
-                    _.set(this.$scope,model,selectedDate);
-                    this.$scope.$apply();
-                    changeCallback(selectedDate);
-                }
-            });
-            $('#'+elemId).datepicker("setDate", _.get(this.$scope,model));
-            changeCallback(_.get(this.$scope,model));
-        });
-    }
-
-    openDatePicker(e) {
-        if (this.timePeriodSelection === "CUSTOM" && this.setup.systemLogsConfiguration.enabled) {
-            $(e.srcElement).datepicker("show");
-        }
-    }
-
-    download(link) {
-        this.iFrameDownload(link);
-    }
-
-    downloadOld(filename) {
-        let url = this.RESOURCE.API_URL + '/userSupport/downloadBundle/' + filename;
-        this.iFrameDownload(url);
-    }
-
-    deleteOld(filename) {
-        this.modal.confirm(`Are you sure you want to delete this bundle?`)
-                .then(() => {
-                    this.supportPageDao.deleteBundle({}, {filename: filename}).$promise.then((resp)=> {
-                        this._getOldBundles();
-                    })
-                });
-    }
-
-    create() {
-
-        let payload = angular.copy(this.setup);
-        if (this.timePeriodSelection != 1) {
-            payload.systemLogsConfiguration.startDate = payload.systemLogsConfiguration.startDate.getTime() + this.timeDiff;
-            payload.systemLogsConfiguration.endDate = payload.systemLogsConfiguration.endDate.getTime() + this.timeDiff + 24*60*60*1000;
-        }
-        else {
-            payload.systemLogsConfiguration.endDate = (new Date()).getTime() + this.timeDiff;
-            payload.systemLogsConfiguration.startDate = payload.systemLogsConfiguration.endDate - 24*60*60*1000;
-        }
-
-        payload.configDescriptorConfiguration.hideUserDetails = this.setup.hideUserDetails;
-        payload.securityInfoConfiguration.hideUserDetails = this.setup.hideUserDetails;
-
-        delete payload.hideUserDetails;
-
-        this.supportPageDao.generateBundle({},payload).$promise.then((files)=>{
-            if (files.length) {
-                //this.downloadLinks = files;
-                this.artifactoryNotifications.createMessageWithHtml({
-                    type: 'success',
-                    body: 'Successfully created support information <a href id="link-in-toaster" ng-click="SupportPage.download(\''+files[0]+'\')">bundle</a>',
-                    timeout: 10000
-                });
-                this.$timeout(()=>{
-                    let elem = angular.element($('#link-in-toaster'));
-                    this.$compile(elem)(this.$scope);
-
-                })
-            }
-            this._getOldBundles();
-        });
-    }
-
-    _getDatePartFromFormat(format) {
-        let parts = this._breakFormat(format);
-
-        let currContext = 'U';  //U = Unkown D = Date T = Time
-        let unknowns = [];
-
-        let gotMonth = false;
-        for (let i in parts) {
-            let part = parts[i];
-
-            if (_.contains('dy',part.char)) {
-                part.context = 'D';
-            }
-            else if (_.contains('hs',part.char)) {
-                part.context = 'T';
-            }
-            else if (part.char === 'm') {
-                if (gotMonth) currContext = 'U';
-                part.context = !gotMonth && currContext === 'D' ? 'D' :'U';
-                unknowns.push(part);
-            }
-            if (part.context) currContext = part.context;
-            if (currContext !== 'U' && unknowns.length) {
-                for (let i in unknowns) {
-                    unknowns[i].context = currContext;
-                    if (currContext === 'D') gotMonth = true;
-                }
-                unknowns = [];
-            }
-        }
-
-        let insideDate=false;
-        let justDate = [];
-        for (let i in parts) {
-            let part = parts[i];
-            if (part.context === 'D') {
-                insideDate = true;
-            }
-            else if (part.context === 'T') {
-                insideDate = false;
-            }
-            if (insideDate) justDate.push(part);
-        }
-
-        let trim = 0;
-        for (let i = justDate.length - 1; i>=0; i--) {
-            let part = parts[i];
-            if (part.context) {
-                break;
-            }
-            else justDate.pop();
-        }
-
-        let finalResult = '';
-        for (let i in justDate) {
-            let part = justDate[i];
-            finalResult += part.precise;
-        }
-
-        return finalResult;
-
-    }
-
-    _breakFormat(format) {
-        let parts = [];
-        while (format.length) {
-            let part = this._getNextFormatPart(format);
-            parts.push(part);
-            format = format.substr(part.count);
-        }
-        return parts;
-    }
-
-    _getNextFormatPart(format) {
-        let temp = format.toLowerCase();
-        let char = temp.charAt(0);
-        let count = 0;
-        while (temp.charAt(0) === char) {
-            count++;
-            temp = temp.substr(1);
-        }
-        let precise = format.substr(0,count);
-        return {
-            char: char,
-            count: count,
-            precise: precise
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/advanced/support_page/support_page.html b/web/angular-web/src/main/webapp/app/states/admin/advanced/support_page/support_page.html
deleted file mode 100644
index c47e492..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/advanced/support_page/support_page.html
+++ /dev/null
@@ -1,184 +0,0 @@
-<div class="content-layout-container">
-    <h1>Support Zone</h1>
-
-    <div class="content-wrapper">
-        <form>
-            <div class="card stretch card-pole-pad card-side-pad">
-                <div class="content-with-footer">
-                    <jf-panel jf-panel-heading="Information To Collect">
-                        <div class="alert alert-info">The support info bundle is not sent to JFrog support directly. Once you completed the download log in to JFrog <a href="https://support.jfrog.com/" target="_blank">Support Portal</a> and open a relevant ticket.</div>
-
-                        <div class="form-group form-checkbox">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="System Info">
-                                    <input type="checkbox"
-                                           id="includeSystemInfo"
-                                           ng-model="SupportPage.setup.systemInfoConfiguration.enabled">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                        <div class="form-group form-checkbox">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Security Descriptor">
-                                    <input type="checkbox"
-                                           id="includeSecurityDesc"
-                                           ng-model="SupportPage.setup.securityInfoConfiguration.enabled">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                        <div class="form-group form-checkbox">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Config Descriptor">
-                                    <input type="checkbox"
-                                           id="includeConfigDesc"
-                                           ng-model="SupportPage.setup.configDescriptorConfiguration.enabled">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                        <div class="form-group form-checkbox">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Configuration Files">
-                                    <input type="checkbox"
-                                           id="includeConfigFiles"
-                                           ng-model="SupportPage.setup.configFilesConfiguration.enabled">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                        <div class="form-group form-checkbox">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Storage Summary">
-                                    <input type="checkbox"
-                                           id="includeStorageSummary"
-                                           ng-model="SupportPage.setup.storageSummaryConfiguration.enabled">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                        <div class="form-group form-checkbox">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Scrub Passwords and Private Information">
-                                    <input type="checkbox"
-                                           id="hideUserDetails"
-                                           ng-model="SupportPage.setup.hideUserDetails">
-                                </jf-checkbox>
-                                <jf-help-tooltip html="SupportPage.TOOLTIP.hideUserDetails"></jf-help-tooltip>
-                            </div>
-                        </div>
-
-                        <div class="form-group form-checkbox">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Thread Dump">
-                                    <input type="checkbox"
-                                           id="includeThreadDump"
-                                           ng-model="SupportPage.setup.threadDumpConfiguration.enabled">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                        <div class="form-group form-checkbox-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="common">
-                                    <label for="count">Number of Thread Dumps</label>
-                                    <input type="number"
-                                           class="input-text"
-                                           required
-                                           id="count"
-                                           name="count"
-                                           ng-model="SupportPage.setup.threadDumpConfiguration.count"/>
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell">
-                                <jf-field validations="common">
-                                    <label for="interval">Interval (Milliseconds)</label>
-                                    <input type="number"
-                                           class="input-text"
-                                           required
-                                           id="interval"
-                                           name="interval"
-                                           ng-model="SupportPage.setup.threadDumpConfiguration.interval"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group form-checkbox">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="System Logs">
-                                    <input type="checkbox"
-                                           id="includeLogs"
-                                           ng-model="SupportPage.setup.systemLogsConfiguration.enabled">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                        <div class="form-group form-checkbox-group">
-                            <div class="form-group-cell">
-                                <label class="label-wight">Date Span</label>
-                                <selectize config="SupportPage.timePeriodConfig"
-                                           options="SupportPage.timePeriodOptions"
-                                           ng-change="SupportPage.onChangeTimePeriod()"
-                                           ng-model="SupportPage.timePeriodSelection"
-                                           ng-disabled="!SupportPage.setup.systemLogsConfiguration.enabled">
-                                </selectize>
-                            </div>
-                        </div>
-                        <div class="form-group form-checkbox-group"
-                             ng-show="SupportPage.timePeriodSelection != 1">
-                            <div class="form-group-cell form-calendar">
-                                <label for="from-date">Start Date</label>
-                                <div>
-                                    <input type="text"
-                                           class="input-text"
-                                           readonly
-                                           ng-disabled="!SupportPage.setup.systemLogsConfiguration.enabled || SupportPage.timePeriodSelection !== 'CUSTOM'"
-                                           ng-click="SupportPage.openDatePicker($event)"
-                                           id="from-date">
-                                    <i class="icon icon-docker-created"></i>
-                                </div>
-                            </div>
-                            <div class="form-group-cell form-calendar">
-                                <label for="to-date">End Date</label>
-                                <div>
-                                    <input type="text"
-                                           class="input-text"
-                                           readonly
-                                           ng-disabled="!SupportPage.setup.systemLogsConfiguration.enabled || SupportPage.timePeriodSelection !== 'CUSTOM'"
-                                           ng-click="SupportPage.openDatePicker($event)"
-                                           id="to-date">
-                                    <i class="icon icon-docker-created"
-                                       ng-click="SupportPage.openDatePicker($event)"></i>
-                                </div>
-                            </div>
-                        </div>
-                    </jf-panel>
-
-                    <jf-panel ng-if="SupportPage.oldBundles.length"
-                              jf-panel-heading="Previously Created Bundles">
-                        <div class="form-group">
-                            <div class="form-group-cell double">
-                                <div class="group-list-wrapper">
-                                    <ul class="group-list with-actions">
-                                        <li class="group-list-item"
-                                            ng-repeat="bundle in SupportPage.oldBundles">
-                                            {{bundle.date}} <span ng-if="$index === 0">(Latest)</span>
-                                            <div class="group-list-actions">
-                                                <a class="btn btn-action" ng-click="SupportPage.downloadOld(bundle.filename)" jf-tooltip="Download">
-                                                    <i class="icon-2x icon icon-download"></i>
-                                                </a>
-                                                <a class="btn btn-action" ng-click="SupportPage.deleteOld(bundle.filename)" jf-tooltip="Delete">
-                                                    <i class="icon-2x icon icon-clear"></i>
-                                                </a>
-                                            </div>
-                                        </li>
-                                    </ul>
-                                </div>
-                            </div>
-                        </div>
-                    </jf-panel>
-                </div>
-            </div>
-            <div class="content-footer">
-                <div class="pull-right">
-                    <button class="btn btn-primary"
-                            ng-disabled="!SupportPage.ready"
-                            ng-click="SupportPage.create()">Create</button>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/advanced/support_page/support_page.module.js b/web/angular-web/src/main/webapp/app/states/admin/advanced/support_page/support_page.module.js
deleted file mode 100644
index ea31426..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/advanced/support_page/support_page.module.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import {AdminAdvancedSupportPageController} from './support_page.controller';
-
-
-function supportPageConfig($stateProvider) {
-    $stateProvider
-            .state('admin.advanced.support_page', {
-                params: {feature: 'supportPage'},
-                url: '/support_page',
-                templateUrl: 'states/admin/advanced/support_page/support_page.html',
-                controller: 'AdminAdvancedSupportPageController as SupportPage'
-            })
-}
-
-export default angular.module('advanced.support_page', [])
-        .config(supportPageConfig)
-        .controller('AdminAdvancedSupportPageController', AdminAdvancedSupportPageController);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/advanced/system_info/system_info.controller.js b/web/angular-web/src/main/webapp/app/states/admin/advanced/system_info/system_info.controller.js
deleted file mode 100644
index 2e55851..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/advanced/system_info/system_info.controller.js
+++ /dev/null
@@ -1,22 +0,0 @@
-export class AdminAdvancedSystemInfoController {
-    constructor(SystemInfoDao) {
-       // console.log("log: "+SystemInfoDao);
-        this.systemInfoDao = SystemInfoDao.getInstance();
-        let self=this;
-        this.systemInfo;
-        this.systemInfoJoined;
-        this.systemInfoDao.get().$promise.then(function(data){
-            self.getSystemInfoKeys(data);
-        })
-    }
-    getSystemInfoKeys(data) {
-        this.systemInfo = data.systemInfo;
-        this.systemInfoJoined = JSON.stringify(data.systemInfo);
-        //let headers = Object.keys(systemInfo);
-        //let subTitles = [];
-    }
-
-    replaceNewLines(text) {
-        return text.replace(/\n/g, "<br>");
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/advanced/system_info/system_info.html b/web/angular-web/src/main/webapp/app/states/admin/advanced/system_info/system_info.html
deleted file mode 100644
index 901810e..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/advanced/system_info/system_info.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<div class="content-layout-container">
-    <h1>System Info <jf-clip-copy text-to-copy="SystemInfoController.systemInfoJoined"
-                                  object-name="Data"></jf-clip-copy>
-    </h1>
-
-
-    <div class="content-wrapper">
-        <div class="card stretch card-pole-pad card-side-pad">
-            <table class="jf-data-table">
-                <tbody ng-repeat="(key, value) in SystemInfoController.systemInfo">
-                    <tr><td colspan="3"><h5>{{key}}:</h5></td></tr>
-                    <tr ng-repeat="(_key, _value) in value">
-                        <td></td>
-                        <td>{{_key}}:</td>
-                        <td ng-bind-html="SystemInfoController.replaceNewLines(_value)"></td>
-                    </tr>
-                    <tr><td colspan="3"> </td></tr>
-                </tbody>
-            </table>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/advanced/system_info/system_info.module.js b/web/angular-web/src/main/webapp/app/states/admin/advanced/system_info/system_info.module.js
deleted file mode 100644
index a21878c..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/advanced/system_info/system_info.module.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import {AdminAdvancedSystemInfoController} from './system_info.controller';
-
-
-function systemInfoConfig($stateProvider) {
-    $stateProvider
-            .state('admin.advanced.system_info', {
-                params: {feature: 'systemInfo'},
-                url: '/system_info',
-                templateUrl: 'states/admin/advanced/system_info/system_info.html',
-                controller: 'AdminAdvancedSystemInfoController as SystemInfoController'
-            })
-}
-
-export default angular.module('advanced.system_info', [])
-        .config(systemInfoConfig)
-        .controller('AdminAdvancedSystemInfoController', AdminAdvancedSystemInfoController);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/advanced/system_logs/system_logs.controller.js b/web/angular-web/src/main/webapp/app/states/admin/advanced/system_logs/system_logs.controller.js
deleted file mode 100644
index 6839719..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/advanced/system_logs/system_logs.controller.js
+++ /dev/null
@@ -1,92 +0,0 @@
-import API from '../../../../constants/api.constants';
-
-export class AdminAdvancedSystemLogsController {
-    constructor($scope, SystemLogsDao, $interval, $window, $timeout) {
-
-        this.logsDao = SystemLogsDao;
-        this.$interval = $interval;
-        this.$window = $window;
-        this.$timeout = $timeout;
-
-        this.intervalPromise = null;
-        this.timeoutSpinner = null;
-        this.timeCount = 5;
-
-        this._getInitialData();
-
-        $scope.$on('$destroy', ()=> {
-            this.stopTimeout();
-            this.stopInterval();
-        });
-    }
-
-    _getInitialData() {
-        this.logsDao.getLogs().$promise.then((data)=> {
-            this.refreshRateSecs = data.refreshRateSecs;
-            this.logs = _.map(data.logs, (logName)=>{return {logName:logName}});
-            this.selectedLog = this.logs[0].logName;
-            this.data = {fileSize: 0};
-            this._getLogData();
-        });
-    }
-
-    _getLogData() {
-        this.stopInterval();
-
-        this.logsDao.getLogData({id: this.selectedLog, fileSize: this.data.fileSize, $no_spinner: true}).$promise.then((data)=> {
-            this.stopTimeout();
-
-            if (this.data.fileSize === 0) {
-                this.$timeout(()=> {
-                    var textarea = document.getElementById('textarea');
-                    textarea.scrollTop = textarea.scrollHeight;
-                });
-            }
-
-            if (data.fileSize)
-                this.data = data;
-
-            this.timeCount = this.refreshRateSecs;
-            if (!this.intervalPromise)
-                this.startInterval();
-        });
-
-        this.timeoutSpinner = this.$timeout(() => {
-            this.timeCount--;
-        }, 400);
-    }
-
-    download() {
-        this.$window.open(`${API.API_URL}/systemlogs/downloadFile?id=`+this.selectedLog, '_blank');
-    }
-
-
-    onChangeLog() {
-        this.stopInterval();
-        this.data = {fileSize: 0};
-        this._getLogData();
-    }
-
-    startInterval() {
-        this.intervalPromise = this.$interval(()=> {
-            if (this.timeCount == 0)
-                this._getLogData();
-            else
-                this.timeCount--;
-        }, 1000);
-    }
-
-    stopInterval() {
-        if (this.intervalPromise) {
-            this.$interval.cancel(this.intervalPromise);
-            this.intervalPromise = null;
-        }
-    }
-
-    stopTimeout() {
-        if (this.timeoutSpinner) {
-            this.$timeout.cancel(this.timeoutSpinner);
-            this.timeoutSpinner = null;
-        }
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/states/admin/advanced/system_logs/system_logs.html b/web/angular-web/src/main/webapp/app/states/admin/advanced/system_logs/system_logs.html
deleted file mode 100644
index f270408..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/advanced/system_logs/system_logs.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<div class="content-layout-container">
-    <h1>System Logs</h1>
-
-    <div class="content-wrapper system-logs">
-        <div class="card stretch card-pole-pad card-side-pad">
-            <div class="form-group">
-                <div class="form-group-cell">
-                    <label>View System Logs</label>
-                    <selectize ng-model="SystemLogsController.selectedLog"
-                               ng-change="SystemLogsController.onChangeLog()"
-                               config="{maxItems:1, create: true, labelField: 'logName', valueField: 'logName'}"
-                               options="SystemLogsController.logs"></selectize>
-                </div>
-                <div class="form-group-cell form-button form-link">
-                    <div ng-if="SystemLogsController.timeCount >= 0">Refreshing logs in {{SystemLogsController.timeCount}} seconds</div>
-                    <div ng-if="SystemLogsController.timeCount < 0" class="icon-hourglass"></div>
-                </div>
-            </div>
-
-            <div>
-                <span>File last modified: {{SystemLogsController.data.lastUpdateModified | date:'EEE MMM dd HH:mm:ss IDT yyyy'}}</span>
-                <span>View last updated: {{SystemLogsController.data.lastUpdateLabel | date:'EEE MMM dd HH:mm:ss IDT yyyy'}}</span>
-            </div>
-            <span ng-click="SystemLogsController.download()"><a href="">Download</a> ({{SystemLogsController.data.fileSize | filesize}})</span>
-
-            <div class="fill-screen">
-                <textarea readonly
-                          spellcheck="false"
-                          id="textarea"
-                          class="input-text monospaced">{{SystemLogsController.data.logContent}}</textarea>
-            </div>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/advanced/system_logs/system_logs.module.js b/web/angular-web/src/main/webapp/app/states/admin/advanced/system_logs/system_logs.module.js
deleted file mode 100644
index ae6f42a..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/advanced/system_logs/system_logs.module.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import {AdminAdvancedSystemLogsController} from './system_logs.controller';
-
-function systemLogsConifg($stateProvider) {
-
-    $stateProvider
-            .state('admin.advanced.system_logs', {
-                url: '/system_logs',
-                templateUrl: 'states/admin/advanced/system_logs/system_logs.html',
-                controller: 'AdminAdvancedSystemLogsController as SystemLogsController'
-            })
-}
-
-export default angular.module('advanced.system_logs', [])
-        .config(systemLogsConifg)
-        .controller('AdminAdvancedSystemLogsController', AdminAdvancedSystemLogsController)
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/bintray/bintray.controller.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/bintray/bintray.controller.js
deleted file mode 100644
index ca49de8..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/bintray/bintray.controller.js
+++ /dev/null
@@ -1,35 +0,0 @@
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-
-export class AdminConfigurationBintrayController {
-
-    constructor(BintrayDao) {
-        this.bintrayDao = BintrayDao.getInstance();
-        this.TOOLTIP = TOOLTIP.admin.configuration.bintray;
-        this._init();
-    }
-
-    _init() {
-
-        this.bintrayDao.get().$promise.then((data)=>{
-            this.bintray = data;
-            this.bintray.fileUploadLimit = data.fileUploadLimit || 0;
-        });
-    }
-
-    save(bintray) {
-        this.bintrayDao.update(bintray);
-    }
-
-    cancel() {
-        this._init();
-    }
-
-    fullCredentials() {
-        return this.bintray && this.bintray.userName && this.bintray.apiKey;
-    }
-
-    testBintray() {
-        this.bintrayDao.save(this.bintray).$promise
-            .then(data => {});
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/bintray/bintray.html b/web/angular-web/src/main/webapp/app/states/admin/configuration/bintray/bintray.html
deleted file mode 100644
index e9f018a..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/bintray/bintray.html
+++ /dev/null
@@ -1,96 +0,0 @@
-<div class="content-layout-container">
-    <h1>Configure Default Bintray Credentials</h1>
-
-    <div class="content-wrapper">
-        <form name="bintrayForm" class="form"
-              ng-submit="AdminConfigurationBintray.save(AdminConfigurationBintray.bintray)"
-              novalidate>
-            <div class="card stretch card-pole-pad card-side-pad">
-                <div class="content-with-footer">
-                    <jf-panel jf-panel-heading="Default Bintray Credentials Settings">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="bintray" always-show-errors="true" autofocus="true">
-                                    <label for="username">Bintray Username</label>
-                                    <jf-help-tooltip html="AdminConfigurationBintray.TOOLTIP.bintrayUsername"></jf-help-tooltip>
-
-                                    <input type="text"
-                                           class="input-text"
-                                           name="username"
-                                           id="username"
-                                           ng-required="AdminConfigurationBintray.bintray.apiKey"
-                                           ng-model="AdminConfigurationBintray.bintray.userName">
-                                </jf-field>
-                            </div>
-                            <!-- prevent auto complete -->
-                            <input type="text" class="hidden"/>
-                            <input type="password" class="hidden"/>
-                            <div class="form-group-cell">
-                                <jf-field validations="bintray" always-show-errors="true">
-                                    <label for="apiKey">Bintray API Key</label>
-                                    <jf-help-tooltip html="AdminConfigurationBintray.TOOLTIP.bintrayAPIKey"></jf-help-tooltip>
-
-                                    <input type="password"
-                                           class="input-text"
-                                           name="apiKey"
-                                           id="apiKey"
-                                           ng-required="AdminConfigurationBintray.bintray.userName"
-                                           ng-model="AdminConfigurationBintray.bintray.apiKey">
-
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell auto-width form-button form-link">
-                                <span jf-reveal-input="apiKey"
-                                      object-name="API Key"></span>
-                            </div>
-                            <div class="form-group-cell auto-width form-button form-link">
-                                <jf-clip-copy text-to-copy="AdminConfigurationBintray.bintray.apiKey"
-                                              object-name="Key"></jf-clip-copy>
-
-                            </div>
-                            <div class="form-group-cell form-button">
-                                <buton class="btn btn-secondary"
-                                       ng-click="AdminConfigurationBintray.testBintray()"
-                                       ng-disabled="!AdminConfigurationBintray.fullCredentials()">Test
-                                </buton>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <a ng-hide="AdminConfigurationBintray.bintray.userName || AdminConfigurationBintray.bintray.apiKey"
-                               ng-href="{{AdminConfigurationBintray.bintray.bintrayConfigUrl}}" ;
-                               target="url">Register to Bintray...
-                            </a>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="common">
-                                    <label class="mandatory" for="fileUploadLimit">File Upload Limit</label>
-                                    <input type="number"
-                                           class="input-text"
-                                           required
-                                           min="0"
-                                           name="fileUploadLimit"
-                                           id="fileUploadLimit"
-                                           ng-model="AdminConfigurationBintray.bintray.fileUploadLimit"
-                                           jf-validator-int-value>
-                                </jf-field>
-                            </div>
-                        </div>
-                    </jf-panel>
-
-                </div>
-            </div>
-
-            <div class="content-footer">
-                <div class="pull-right">
-                    <button class="btn btn-default" type="button"
-                            ng-click="AdminConfigurationBintray.cancel()">Reset
-                    </button>
-                    <button class="btn btn-primary" type="submit"
-                            ng-disabled="!bintrayForm.$valid">Save
-                    </button>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/bintray/bintray.module.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/bintray/bintray.module.js
deleted file mode 100644
index 723b05c..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/bintray/bintray.module.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import {AdminConfigurationBintrayController} from './bintray.controller';
-
-function bintrayConfig($stateProvider) {
-    $stateProvider
-            .state('admin.configuration.bintray', {
-                url: '/bintray',
-                templateUrl: 'states/admin/configuration/bintray/bintray.html',
-                controller: 'AdminConfigurationBintrayController as AdminConfigurationBintray'
-            })
-}
-
-export default angular.module('configuration.bintray', [])
-        .config(bintrayConfig)
-        .controller('AdminConfigurationBintrayController', AdminConfigurationBintrayController);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/black_duck/black_duck.controller.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/black_duck/black_duck.controller.js
deleted file mode 100644
index 8c631d6..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/black_duck/black_duck.controller.js
+++ /dev/null
@@ -1,47 +0,0 @@
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-
-export class AdminConfigurationBlack_duckController {
-
-    constructor(BlackDuckDao, ProxiesDao, ArtifactoryModelSaver) {
-        this.blackDuckDao = BlackDuckDao.getInstance();
-        this.artifactoryModelSaver = ArtifactoryModelSaver.createInstance(this,['blackDuck']);
-        this.proxiesDao = ProxiesDao;
-        this.TOOLTIP = TOOLTIP.admin.configuration.blackDuck;
-        this._initBlackDuck();
-    }
-
-    _initBlackDuck() {
-        this.proxiesDao.get().$promise.then((proxies)=> {
-            this.proxies = [''];
-            this.proxies = this.proxies.concat(proxies);
-            this.getBlackduckData();
-        })
-    }
-
-    getBlackduckData() {
-        this.blackDuckDao.get().$promise.then((data)=> {
-//            console.log(data);
-            this.blackDuck = data;
-            this.artifactoryModelSaver.save();
-        });
-    }
-
-    save(duck) {
-        if (duck.proxyRef==='') delete duck.proxyRef;
-        this.blackDuckDao.update(duck).$promise.then(()=>{
-            this.artifactoryModelSaver.save();
-        });
-    }
-
-    testBlackDuck(duck) {
-        this.blackDuckDao.save(duck).$promise.then(function (data) {
-//            console.log(data);
-        });
-    }
-
-    reset() {
-        this.artifactoryModelSaver.ask().then(()=>{
-            this.getBlackduckData();
-        });
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/black_duck/black_duck.html b/web/angular-web/src/main/webapp/app/states/admin/configuration/black_duck/black_duck.html
deleted file mode 100644
index 1bcd03f..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/black_duck/black_duck.html
+++ /dev/null
@@ -1,107 +0,0 @@
-<div class="content-layout-container">
-    <h1>Governance Configuration</h1>
-
-    <div class="content-wrapper">
-        <form class="form" ng-submit="BlackDuck.save(BlackDuck.blackDuck)"
-              name="formBlackDuck" novalidate>
-            <div class="card stretch card-pole-pad card-side-pad">
-                <div class="content-with-footer">
-                    <jf-panel jf-panel-heading="Black Duck Settings">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Enable Black Duck Code Center Integration">
-                                    <input type="checkbox"
-                                           id="enabled"
-                                           ng-model="BlackDuck.blackDuck.enableIntegration">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="blackDuck" autofocus="true">
-                                    <label for="host" class="mandatory">Server URI</label>
-                                    <input type="url"
-                                           required
-                                           class="input-text"
-                                           name="host"
-                                           id="host"
-                                           ng-disabled="!BlackDuck.blackDuck.enableIntegration"
-                                           ng-model="BlackDuck.blackDuck.serverUri">
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell">
-                                <jf-field validations="blackDuck">
-                                    <label for="username" class="mandatory">User Name</label>
-                                    <input type="text"
-                                           class="input-text"
-                                           id="username"
-                                           name="username"
-                                           required
-                                           ng-disabled="!BlackDuck.blackDuck.enableIntegration"
-                                           ng-model="BlackDuck.blackDuck.username">
-                                </jf-field>
-                            </div>
-                        </div>
-                        <!-- prevent auto complete -->
-                        <input type="text" class="hidden"/>
-                        <input type="password" class="hidden"/>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="blackDuck">
-                                    <label for="pwd" class="mandatory">Password</label>
-                                    <input type="password"
-                                           class="input-text"
-                                           id="pwd"
-                                           name="pwd"
-                                           required
-                                           ng-disabled="!BlackDuck.blackDuck.enableIntegration"
-                                           ng-model="BlackDuck.blackDuck.password">
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell">
-                                <jf-field validations="blackDuck">
-                                    <label for="connectionTimeoutMillis" class="mandatory">Connection Timeout</label>
-                                    <jf-help-tooltip html="BlackDuck.TOOLTIP.connectionTimeout"></jf-help-tooltip>
-                                    <input type="number"
-                                           min="0"
-                                           required
-                                           class="input-text"
-                                           id="connectionTimeoutMillis"
-                                           name="connectionTimeoutMillis"
-                                           ng-disabled="!BlackDuck.blackDuck.enableIntegration"
-                                           ng-model="BlackDuck.blackDuck.connectionTimeoutMillis">
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="blackDuck">
-                                    <label>Proxies</label>
-                                    <jf-ui-select jf-select-model="BlackDuck.blackDuck.proxyRef"
-                                                  jf-select-options="BlackDuck.proxies"
-                                                  jf-select-display-attr="key"
-                                                  jf-select-disabled="!BlackDuck.blackDuck.enableIntegration"></jf-ui-select>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="pull-right">
-                            <button class="btn btn-primary" type="button"
-                                    ng-disabled="!formBlackDuck.$valid || !BlackDuck.blackDuck.enableIntegration"
-                                    ng-click="BlackDuck.testBlackDuck(BlackDuck.blackDuck)">Test
-                            </button>
-                        </div>
-                    </jf-panel>
-                </div>
-            </div>
-            <div class="content-footer">
-                <div class="pull-right">
-                    <button class="btn btn-default" type="button"
-                            ng-click="BlackDuck.reset()">Reset</button>
-                    <button class="btn btn-primary" type="submit"
-                            ng-disabled="!formBlackDuck.$valid">Save
-                    </button>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/black_duck/black_duck.module.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/black_duck/black_duck.module.js
deleted file mode 100644
index fe457e9..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/black_duck/black_duck.module.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import {AdminConfigurationBlack_duckController} from './black_duck.controller'
-
-function blackDuckConfig($stateProvider) {
-    $stateProvider
-            .state('admin.configuration.black_duck', {
-                params: {feature: 'blackduck'},
-                url: '/black_duck',
-                templateUrl: 'states/admin/configuration/black_duck/black_duck.html',
-                controller: 'AdminConfigurationBlack_duckController as BlackDuck'
-            })
-}
-
-
-export default angular.module('configuration.black_duck', [])
-        .config(blackDuckConfig)
-        .controller("AdminConfigurationBlack_duckController", AdminConfigurationBlack_duckController);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/configuration.controller.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/configuration.controller.js
deleted file mode 100644
index 4278583..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/configuration.controller.js
+++ /dev/null
@@ -1,9 +0,0 @@
-export class AdminConfigurationController {
-
-    constructor() {
-        var AdminConfiguration = this;
-        AdminConfiguration.stateUrl = '/configuration';
-        AdminConfiguration.controllerName = 'idan'
-
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/configuration.module.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/configuration.module.js
deleted file mode 100644
index 16739ba..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/configuration.module.js
+++ /dev/null
@@ -1,46 +0,0 @@
-import Licenses           from './licenses/licenses.module';
-import Mail               from './mail/mail.module';
-import Proxies            from './proxies/proxies.module';
-import ReverseProxies     from './reverse_proxies/reverse_proxies.module';
-import RegisterPro        from './register_pro/register_pro.module';
-import Bintray            from './bintray/bintray.module';
-import BlackDuck          from './black_duck/black_duck.module'
-import General            from './general/general.module';
-import PropertySets       from './property_sets/property_sets.module';
-import HighAvailability   from './ha/ha.module';
-
-
-import {AdminConfigurationController} from './configuration.controller';
-
-/**
- * configuration and state definition
- * @param $stateProvider
- */
-function configurationConfig($stateProvider) {
-
-    $stateProvider
-            .state('admin.configuration', {
-                url: '/configuration',
-                template: '<ui-view></ui-view>',
-                controller: 'AdminConfigurationController as AdminConfiguration'
-            })
-}
-
-/**
- * Module definition
- */
-export default angular.module('admin.configuration', [
-    Licenses.name,
-    Mail.name,
-    Proxies.name,
-    ReverseProxies.name,
-    RegisterPro.name,
-    Bintray.name,
-    BlackDuck.name,
-    General.name,
-    PropertySets.name,
-    HighAvailability.name
-
-])
-        .config(configurationConfig)
-        .controller('AdminConfigurationController', AdminConfigurationController);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/general/general.controller.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/general/general.controller.js
deleted file mode 100644
index d0349cb..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/general/general.controller.js
+++ /dev/null
@@ -1,236 +0,0 @@
-import EVENTS from '../../../../constants/artifacts_events.constants';
-import API from '../../../../constants/api.constants';
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-
-export class AdminConfigurationGeneralController {
-
-    constructor($scope, $q, $timeout, $stateParams, FileUploader, ArtifactoryNotifications, GeneralConfigDao, FooterDao, ArtifactoryEventBus, ArtifactoryModelSaver, ArtifactActionsDao, ArtifactoryModal, ArtifactoryFeatures) {
-        this.$scope = $scope;
-        this.$q = $q;
-        this.$timeout = $timeout;
-        this.$stateParams = $stateParams;
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.artifactActionsDao = ArtifactActionsDao;
-        this.generalConfigDao = GeneralConfigDao;
-        this.footerDao = FooterDao;
-        this.FileUploader = FileUploader;
-        this.modal = ArtifactoryModal;
-        this.logoType = 'File';
-        this.defaultLogoUrl = 'images/artifactory_logo.svg';
-        this.logoEndPoint = `${API.API_URL}/generalConfig/logo`;
-        this.TOOLTIP = TOOLTIP.admin.configuration.general;
-        this.artifactoryModelSaver = ArtifactoryModelSaver.createInstance(this,['generalConfigData']);
-        this.features = ArtifactoryFeatures;
-
-        this.deleteUserLogo = false;
-
-        this._initUploader();
-
-        this._getGeneralConfigData();
-
-    }
-    customMessageToggle() {
-        this.toggleColorPicker();
-    }
-    toggleColorPicker() {
-        $('.color-picker-input').prop('disabled', !this.generalConfigData.systemMessageEnabled);
-    }
-    _getGeneralConfigData() {
-        this.generalConfigDao.get().$promise.then((data) => {
-            this.generalConfigData = data;
-            this.blockReplications = data.blockPushReplications || data.blockPullReplications;
-            this.generalConfigData.systemMessageTitleColor = this.generalConfigData.systemMessageTitleColor.toUpperCase();
-            this.artifactoryModelSaver.save();
-            this._getCurrentImage();
-            if (this.generalConfigData.systemMessageEnabled == false) {
-                this.toggleColorPicker();
-            }
-        });
-    }
-
-    _getCurrentImage() {
-        this._userLogoExists().then(()=>{
-            $(".artifactory-logo img")[0].src = this.logoEndPoint;
-
-        })
-            .catch(() => {
-                if (this.generalConfigData.logoUrl) {
-                    this.logoUrlInput = this.generalConfigData.logoUrl;
-                    $(".artifactory-logo img")[0].src = this.generalConfigData.logoUrl;
-                }
-                else {
-                    $(".artifactory-logo img")[0].src = this.defaultLogoUrl;
-                }
-            });
-    }
-
-    _updateGeneralConfigData() {
-        this.generalConfigDao.update(this.generalConfigData).$promise.then((data) => {
-            this.artifactoryModelSaver.save();
-            this.artifactoryEventBus.dispatch(EVENTS.FOOTER_DATA_UPDATED);
-        });
-    }
-
-    _deleteUploadedPicture() {
-        this.generalConfigDao.deleteLogo().$promise.then((data) => {
-//            console.log(data);
-        });
-    }
-
-    _initUploader() {
-        this.uploader = new this.FileUploader();
-
-        this.uploader.url = this.logoEndPoint;
-        this.uploader.onSuccessItem = this.onUploadSuccess.bind(this);
-    }
-
-    isSelectedLogoType(type) {
-        return this.logoType === type;
-    }
-
-    onUploadSuccess() {
-//        console.log('onUploadSuccess');
-//        this.generalConfigData.logoUrl = this.logoEndPoint;
-        this.logoUrlInput = undefined;
-        this._updateGeneralConfigData();
-    }
-
-    onAfterAddingFile(fileItem) {
-        this.assertImage(fileItem._file).then(()=> {
-            this.logoFile = fileItem.file.name;
-            this.showPreview(fileItem._file);
-        }).catch((err)=> {
-            this.artifactoryNotifications.create({error: err});
-            this.uploader.clearQueue();
-        });
-    }
-
-    assertImage(file) {
-
-        let deferred = this.$q.defer();
-
-        let reader = new FileReader();
-        reader.onload = function (e) {
-            let buffer = reader.result;
-            let uInt8View = new Uint8Array(buffer);
-            let int32Sample = uInt8View[3] + uInt8View[2] * 256 + uInt8View[1] * (256 * 256) + uInt8View[0] * (256 * 256 * 256);
-
-            switch (int32Sample) {
-                case 2303741511: //png
-                case 1195984440: //gif
-                case 1112360694: //bmp
-                case 4292411360: case 4292411361: //jpg
-                //case 1010792557: case 1014199911: //svg
-                    deferred.resolve();
-                    break;
-                default:
-                    deferred.reject('Not an image file!');
-                    break;
-            }
-        };
-        reader.readAsArrayBuffer(file);
-
-        return deferred.promise;
-
-    }
-
-    showPreview(file) {
-        if (typeof FileReader !== "undefined" && (/image/i).test(file.type)) {
-            let img = $(".artifactory-logo img")[0];
-            let reader = new FileReader();
-            reader.onload = (((theImg) => {
-                return (evt) => {
-                    theImg.src = evt.target.result;
-                }
-            })(img));
-            reader.readAsDataURL(file);
-        }
-    }
-
-
-    clear() {
-        this.generalConfigData.customUrlBase = '';
-
-        this.generalConfigData.logoUrl = '';//this.defaultLogoUrl;
-        this.logoUrlInput = undefined;
-        this.uploader.clearQueue();
-        this.logoFile = undefined;
-
-        this.deleteUserLogo = true;
-
-        this.$timeout(()=>{
-            $(".artifactory-logo img")[0].src = this.defaultLogoUrl;
-        });
-
-    }
-    save() {
-        if (this.isSelectedLogoType('File') && this.uploader.queue.length) {
-            this.uploader.uploadAll();
-        }
-        else {
-            if (this.deleteUserLogo) this._deleteUploadedPicture();
-            this._updateGeneralConfigData();
-        }
-    }
-
-    cancel() {
-        this.artifactoryModelSaver.ask().then(()=>{
-            this.clear();
-            this._getGeneralConfigData();
-        });
-    }
-
-    onChangeLogoUrl() {
-        let form = this.$scope.formGeneral;
-        if (this.logoUrlInput && !form.logoUrlInput.$invalid) {
-            this._imageExists(this.logoUrlInput)
-            .then(()=>{
-                    this.generalConfigData.logoUrl = this.logoUrlInput;
-                    this.deleteUserLogo = true;
-                })
-            .catch((err)=>console.log(err));
-
-        }
-    }
-
-    _userLogoExists() {
-        let deferred = this.$q.defer();
-        this.footerDao.get(true).then(footerData => {
-            if (footerData.userLogo) {
-                deferred.resolve();
-            }
-            else {
-                deferred.reject();
-            }
-        });
-        return deferred.promise;
-    }
-
-    _imageExists(url) {
-        let deferred = this.$q.defer();
-        let img = new Image();
-        img.onload = () => {
-            deferred.resolve();
-        };
-        img.onerror = () => {
-            deferred.reject('no image found');
-        };
-        img.src = url;
-        return deferred.promise;
-    }
-
-    emptyTrashcan() {
-        this.modal.confirm('Are you sure you want to empty the trash can?', 'Empty Trash',
-            {confirm: 'Empty Trash'})
-            .then(() => this.artifactActionsDao.perform({action: 'emptytrash'}, {}));
-    }
-
-    onChangeBlockReplications() {
-        this.generalConfigData.blockPushReplications = this.blockReplications;
-        this.generalConfigData.blockPullReplications = this.blockReplications;
-    }
-    onChangePushPullReplications() {
-        this.blockReplications = this.generalConfigData.blockPushReplications || this.generalConfigData.blockPullReplications
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/general/general.html b/web/angular-web/src/main/webapp/app/states/admin/configuration/general/general.html
deleted file mode 100644
index a771768..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/general/general.html
+++ /dev/null
@@ -1,359 +0,0 @@
-<div class="content-layout-container general-conf">
-    <h1>General Configuration</h1>
-
-    <div class="content-wrapper">
-        <form class="form" ng-submit="AdminConfiguration.save()" name="formGeneral" novalidate>
-            <div class="card stretch card-pole-pad card-side-pad">
-                <div class="content-with-footer">
-                    <jf-panel jf-panel-heading="General Settings">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="adminGeneral" autofocus="!AdminConfiguration.$stateParams.focusOnBaseUrl">
-                                    <label for="serverName">Server Name</label>
-                                    <jf-help-tooltip html="AdminConfiguration.TOOLTIP.serverName"></jf-help-tooltip>
-                                    <input type="text"
-                                           class="input-text"
-                                           jf-validator-name
-                                           ng-model-options="{debounce: { 'default': 500 } }"
-                                           name="serverName"
-                                           id="serverName"
-                                           ng-model="AdminConfiguration.generalConfigData.serverName"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="adminGeneral" autofocus="AdminConfiguration.$stateParams.focusOnBaseUrl">
-                                    <label for="customUrl">Custom Base URL</label>
-                                    <jf-help-tooltip html="AdminConfiguration.TOOLTIP.customURLBase"></jf-help-tooltip>
-                                    <input type="url"
-                                           class="input-text"
-                                           name="customUrl"
-                                           id="customUrl"
-                                           ng-model="AdminConfiguration.generalConfigData.customUrlBase"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="adminGeneral">
-                                    <label class="mandatory" for="maxSize">File Upload Max Size</label>
-                                    <jf-help-tooltip
-                                           html="AdminConfiguration.TOOLTIP.fileUploadMaxSize"></jf-help-tooltip>
-                                    <input type="number"
-                                           required
-                                           min="0" max="2147483647"
-                                           class="input-text"
-                                           name="maxSize"
-                                           id="maxSize"
-                                           ng-model="AdminConfiguration.generalConfigData.fileUploadMaxSize"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="common">
-                                    <label class="mandatory" for="bintrayFilesUploadLimit">Bintray Max Files Upload</label>
-                                    <input type="number"
-                                           class="input-text"
-                                           min="0"
-                                           name="bintrayFilesUploadLimit"
-                                           id="bintrayFilesUploadLimit"
-                                           ng-model="AdminConfiguration.generalConfigData.bintrayFilesUploadLimit"
-                                           jf-validator-int-value>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="adminGeneral">
-                                    <label class="mandatory" for="dateFormat">Date Format</label>
-                                    <jf-help-tooltip html="AdminConfiguration.TOOLTIP.dateFormat">
-                                    </jf-help-tooltip>
-                                    <input type="text"
-                                           jf-validator-date-format
-                                           class="input-text"
-                                           name="dateFormat"
-                                           id="dateFormat"
-                                           required
-                                           ng-model-options="{debounce: { 'default': 500 } }"
-                                           ng-model="AdminConfiguration.generalConfigData.dateFormat"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group form-checkbox">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Global Offline Mode">
-                                    <input id="offlineMode"
-                                           type="checkbox"
-                                           ng-model="AdminConfiguration.generalConfigData.globalOfflineMode"
-                                           name="offlineMode">
-                                </jf-checkbox>
-                                <jf-help-tooltip html="AdminConfiguration.TOOLTIP.globalOfflineMode"></jf-help-tooltip>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Enable Help Component">
-                                    <input id="disableHelp"
-                                           type="checkbox"
-                                           ng-model="AdminConfiguration.generalConfigData.helpLinksEnabled"
-                                           name="disableHelp">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                    </jf-panel>
-                    <jf-panel jf-panel-heading="Global Replication Blocking"
-                              ng-if="!AdminConfiguration.features.isOss()">
-                        <div class="form-group form-checkbox">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Block Replications">
-                                    <input id="blockReplications"
-                                           type="checkbox"
-                                           ng-model="AdminConfiguration.blockReplications"
-                                           ng-change="AdminConfiguration.onChangeBlockReplications()"
-                                           name="blockReplications">
-                                </jf-checkbox>
-                                <jf-help-tooltip html="AdminConfiguration.TOOLTIP.blockReplications"></jf-help-tooltip>
-                            </div>
-                        </div>
-                        <div class="form-group form-checkbox">
-                                <jf-checkbox text="Block Push Replications">
-                                    <input id="blockPushReplications"
-                                           type="checkbox"
-                                           ng-model="AdminConfiguration.generalConfigData.blockPushReplications"
-                                           ng-disabled="!AdminConfiguration.blockReplications"
-                                           ng-change="AdminConfiguration.onChangePushPullReplications()"
-                                           name="blockPushReplications">
-                                </jf-checkbox>
-                                <jf-help-tooltip html="AdminConfiguration.TOOLTIP.blockPushReplications"></jf-help-tooltip>
-                                <span class="cb-sep"></span>
-                                <jf-checkbox text="Block Pull Replications">
-                                    <input id="blockPullReplications"
-                                           type="checkbox"
-                                           ng-model="AdminConfiguration.generalConfigData.blockPullReplications"
-                                           ng-disabled="!AdminConfiguration.blockReplications"
-                                           ng-change="AdminConfiguration.onChangePushPullReplications()"
-                                           name="blockPullReplications">
-                                </jf-checkbox>
-                                <jf-help-tooltip html="AdminConfiguration.TOOLTIP.blockPullReplications"></jf-help-tooltip>
-                        </div>
-                    </jf-panel>
-                    <jf-panel jf-panel-heading="Folder Download Settings">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Enable Folder Download">
-                                    <input id="enableFolderDownload"
-                                           type="checkbox"
-                                           ng-model="AdminConfiguration.generalConfigData.folderDownloadEnabled"
-                                           name="enableFolderDownload">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="adminGeneral">
-                                    <label for="maxFolderSize">Max Size</label>
-                                    <jf-help-tooltip html="AdminConfiguration.TOOLTIP.folderDownloadMaxSize"></jf-help-tooltip>
-                                    <input type="number"
-                                           min = "0"
-                                           class="input-text"
-                                           name="maxFolderSize"
-                                           id="maxFolderSize"
-                                           ng-disabled="!AdminConfiguration.generalConfigData.folderDownloadEnabled"
-                                           ng-model="AdminConfiguration.generalConfigData.folderDownloadMaxSizeMb"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="adminGeneral">
-                                    <label for="maxFolderFiles">Max Number of Files</label>
-                                    <jf-help-tooltip html="AdminConfiguration.TOOLTIP.folderDownloadMaxFiles"></jf-help-tooltip>
-                                    <input type="number"
-                                           min = "0"
-                                           class="input-text"
-                                           name="maxFolderFiles"
-                                           id="maxFolderFiles"
-                                           ng-disabled="!AdminConfiguration.generalConfigData.folderDownloadEnabled"
-                                           ng-model="AdminConfiguration.generalConfigData.maxFolderDownloadFilesLimit"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="folderDownload">
-                                    <label for="maxConcurrent">Max Parallel Folder Downloads</label>
-                                    <jf-help-tooltip html="AdminConfiguration.TOOLTIP.folderDownloadMaxParallel"></jf-help-tooltip>
-                                    <input type="number"
-                                           min = "1"
-                                           class="input-text"
-                                           name="maxConcurrent"
-                                           id="maxConcurrent"
-                                           ng-disabled="!AdminConfiguration.generalConfigData.folderDownloadEnabled"
-                                           ng-model="AdminConfiguration.generalConfigData.folderDownloadMaxConcurrentRequests"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                    </jf-panel>
-
-                    <jf-panel jf-panel-heading="Trash Can Settings">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Enable Trash Can">
-                                    <input id="enableTrashcan"
-                                           type="checkbox"
-                                           ng-model="AdminConfiguration.generalConfigData.trashcanEnabled"
-                                           name="enableTrashcan">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-<!--
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Allow Permanent Deletes">
-                                    <input id="allowPermDeletes"
-                                           type="checkbox"
-                                           ng-model="AdminConfiguration.generalConfigData.allowPermDeletes"
-                                           ng-disabled="!AdminConfiguration.generalConfigData.trashcanEnabled"
-                                           name="allowPermDeletes">
-                                </jf-checkbox>
-                                <jf-help-tooltip html="AdminConfiguration.TOOLTIP.allowPermDeletes"></jf-help-tooltip>
-                            </div>
-                        </div>
--->
-                        <div class="form-group half-margin-bottom">
-                            <div class="form-group-cell">
-                                <jf-field validations="adminGeneral">
-                                    <label for="retentionPeriodDays">Retention Period (Days)</label>
-                                    <jf-help-tooltip html="AdminConfiguration.TOOLTIP.retentionPeriodDays"></jf-help-tooltip>
-                                    <input type="number"
-                                           min = "0"
-                                           class="input-text"
-                                           name="retentionPeriodDays"
-                                           id="retentionPeriodDays"
-                                           ng-disabled="!AdminConfiguration.generalConfigData.trashcanEnabled"
-                                           ng-model="AdminConfiguration.generalConfigData.trashcanRetentionPeriodDays"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <div ng-disabled="!AdminConfiguration.generalConfigData.trashcanEnabled"
-                                     ng-click="AdminConfiguration.generalConfigData.trashcanEnabled && AdminConfiguration.emptyTrashcan()"
-                                     class="text-button warning-button">
-                                    <span class="icon icon-trash"></span>Empty Trashcan
-                                </div>
-                            </div>
-                        </div>
-                    </jf-panel>
-
-                    <jf-panel jf-panel-heading="Look & Feel Settings">
-                        <jf-switch jf-switch-title="Upload From:" ng-model="AdminConfiguration.logoType" options="['File', 'URL']" class="no-margin-top"></jf-switch>
-
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <div ng-switch="AdminConfiguration.logoType">
-                                    <div ng-switch-when="File">
-                                        <jf-field validations="adminGeneral">
-                                            <label>Logo File</label>
-                                            <jf-file-drop jf-file-uploader="AdminConfiguration.uploader"
-                                                          jf-adding-file-callback="AdminConfiguration.onAfterAddingFile(fileItem)"></jf-file-drop>
-                                        </jf-field>
-                                    </div>
-                                    <div ng-switch-when="URL">
-                                        <jf-field validations="adminGeneral">
-                                            <label for="logoUrlInput">Logo URL</label>
-                                            <input type="url"
-                                                   class="input-text"
-                                                   name="logoUrlInput"
-                                                   id="logoUrlInput"
-                                                   ng-change="AdminConfiguration.onChangeLogoUrl()"
-                                                   ng-model="AdminConfiguration.logoUrlInput"/>
-                                        </jf-field>
-                                    </div>
-                                </div>
-                            </div>
-                            <div class="form-group-cell form-button">
-                                <button class="btn btn-secondary"
-                                        type="button"
-                                        ng-click="AdminConfiguration.clear()">Clear
-                                </button>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell double">
-                                <div class="artifactory-logo"><img ng-src="{{AdminConfiguration.generalConfigData.logoUrl}}"></div>
-                            </div>
-                        </div>
-                    </jf-panel>
-
-                    <jf-panel jf-panel-heading="Custom Message">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Enabled">
-                                    <input type="checkbox"
-                                           ng-model="AdminConfiguration.generalConfigData.systemMessageEnabled"
-                                           ng-change="AdminConfiguration.customMessageToggle()"
-                                           name="modEnabled">
-                                </jf-checkbox>
-                            </div>
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Show Only in Home Page">
-                                    <input id="modAllPages"
-                                           type="checkbox"
-                                           ng-model="AdminConfiguration.generalConfigData.showSystemMessageOnAllPages"
-                                           ng-true-value="false"
-                                           ng-false-value="true"
-                                           ng-disabled="!AdminConfiguration.generalConfigData.systemMessageEnabled"
-                                           name="modAllPages">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="common">
-                                    <label for="modTitle">Title</label>
-                                    <input type="text"
-                                           class="input-text"
-                                           name="modTitle"
-                                           id="modTitle"
-                                           ng-disabled="!AdminConfiguration.generalConfigData.systemMessageEnabled"
-                                           ng-model="AdminConfiguration.generalConfigData.systemMessageTitle"/>
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell">
-                                <label>Title Color</label>
-                                <color-picker ng-model="AdminConfiguration.generalConfigData.systemMessageTitleColor"
-                                              color-picker-format="'hex'"
-                                              color-picker-alpha="false"></color-picker>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell double">
-                                <jf-field validations="common">
-                                    <label for="modMessage">Message</label>
-                                    <textarea name="modMessage"
-                                              id="modMessage"
-                                              class="input-text monospaced"
-                                              rows="11"
-                                              cols="18"
-                                              ng-disabled="!AdminConfiguration.generalConfigData.systemMessageEnabled"
-                                              ng-model="AdminConfiguration.generalConfigData.systemMessage"></textarea>
-                                </jf-field>
-                                <div class="field-bottom-remark"><i class="icon icon-info"></i>To embed a link inside the message use : [http://example.com, text]</div>
-                            </div>
-                        </div>
-                    </jf-panel>
-                </div>
-            </div>
-
-            <div class="content-footer">
-                <div class="pull-right">
-                    <button class="btn btn-default" type="button" ng-click="AdminConfiguration.cancel()">Reset</button>
-                    <button class="btn btn-primary" type="submit" ng-disabled="!formGeneral.$valid">Save</button>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/general/general.module.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/general/general.module.js
deleted file mode 100644
index ed2f6d0..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/general/general.module.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import {AdminConfigurationGeneralController} from './general.controller';
-
-function generalConfig($stateProvider) {
-
-    $stateProvider
-            .state('admin.configuration.general', {
-                url: '/general',
-                params: {focusOnBaseUrl: false},
-                templateUrl: 'states/admin/configuration/general/general.html',
-                controller: 'AdminConfigurationGeneralController as AdminConfiguration'
-            })
-}
-
-export default angular.module('configuration.general', [])
-    .config(generalConfig)
-    .controller('AdminConfigurationGeneralController',AdminConfigurationGeneralController)
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/ha/ha.controller.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/ha/ha.controller.js
deleted file mode 100644
index a8d42e2..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/ha/ha.controller.js
+++ /dev/null
@@ -1,123 +0,0 @@
-let HaDao, $scope, artifactoryGridFactory, modal;
-const installLink   = 'https://www.jfrog.com/confluence/display/RTF/Installation+and+Setup#InstallationandSetup-ConfiguringArtifactoryHA';
-const wikiLink = 'https://www.jfrog.com/confluence/display/RTF/Welcome+to+Artifactory';
-
-export class AdminConfigurationHAController {
-
-    constructor(_$scope_, _ArtifactoryModal_, _HaDao_, _ArtifactoryGridFactory_, _ArtifactoryState_) {
-        HaDao = _HaDao_;
-        $scope = _$scope_;
-        artifactoryGridFactory = _ArtifactoryGridFactory_;
-        modal = _ArtifactoryModal_;
-
-        this.installLink = installLink;
-        this.wikiLink = wikiLink;
-        this.gridOptions = {};
-        this._createGrid();
-        this._initHa();
-    }
-
-    _initHa() {
-        HaDao.query().$promise.then((ha)=> {
-            this.ha = ha;
-            this.gridOptions.setGridData(this.ha)
-        });
-    }
-
-    _createGrid() {
-        this.gridOptions = artifactoryGridFactory.getGridInstance($scope)
-                .setColumns(this._getColumns())
-                .setButtons(this._getActions())
-                .setRowTemplate('default');
-    }
-
-
-    _getColumns() {
-        return [
-            {
-                field: "id",
-                name: "ID",
-                displayName: "ID",
-                width: '7%'},
-            {
-                field: "startTime",
-                name: "Start Time",
-                displayName: "Start Time",
-                width: '11%'
-            },
-            {
-                field: "url",
-                name: "URL",
-                displayName: "URL",
-                width: '19%',
-                cellTemplate: '<div class="ui-grid-cell-contents"><a target="_blank" href="{{ COL_FIELD }}">{{ COL_FIELD }}</a></div>'
-            },
-            {
-                field: "memberShipPort",
-                name: "Membership Port",
-                displayName: "Membership Port",
-                width: '11%'
-            },
-            {
-                field: "state",
-                name: "State",
-                displayName: "State",
-                width: '7%'
-            },
-            {
-                field: "role",
-                name: "Role",
-                displayName: "Role",
-                width: '7%'
-            },
-            {
-                field: "lastHeartbeat",
-                name: "Last Heartbeat",
-                displayName: "Last Heartbeat",
-                width: '11%',
-                cellTemplate: `
-                    <div ng-if="row.entity.heartbeatStale"
-                         class="ui-grid-cell-contents ha-heartbeat-stale"
-                         jf-tooltip="Heartbeat is stale. Check if your server is down."><i class="icon icon-notif-warning"></i>{{ COL_FIELD }}</div>
-                    <div ng-if="!row.entity.heartbeatStale"
-                         class="ui-grid-cell-contents">{{ COL_FIELD }}</div>
-                         `
-            },
-            {
-                field: "version",
-                name: "Version",
-                displayName: "Version",
-                width: '9%'
-            },
-            {
-                field: "revision",
-                name: "Revision",
-                displayName: "Revision",
-                width: '7%'
-            },
-            {
-                field: "releaseDate",
-                name: "Release Date",
-                displayName: "Release Date",
-                width: '11%'
-            }
-        ]
-    }
-
-    _deleteNode(node) {
-        modal.confirm('Are you sure you wish to remove ' + node.id + ' from the nodes list?')
-            .then(() => HaDao.delete({id: node.id}))
-            .then(() => this._initHa());
-    }
-
-    _getActions() {
-        return [
-            {
-                icon: 'icon icon-clear',
-                tooltip: 'Delete',
-                visibleWhen: node => node.heartbeatStale,
-                callback: node => this._deleteNode(node)
-            }
-        ];
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/ha/ha.html b/web/angular-web/src/main/webapp/app/states/admin/configuration/ha/ha.html
deleted file mode 100644
index d48f090..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/ha/ha.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<div class="content-layout-container">
-    <h1>High Availability Configuration</h1>
-    <div class="content-wrapper">
-        <div class="card stretch card-pole-pad card-side-pad">
-        	<div ng-if="AdminConfigurationHA.ha">
-                <jf-panel jf-panel-heading="Artifactory Nodes" ng-if="AdminConfigurationHA.ha.length > 0">
-                    <jf-grid ng-if="AdminConfigurationHA.ha.length"
-                             grid-options="AdminConfigurationHA.gridOptions"></jf-grid>
-                </jf-panel>
-	            <div class="alert alert-info" ng-if="AdminConfigurationHA.ha.length === 0">
-					High Availability license is installed but HA feature is not configured.<br>
-					Visit <a target="_blank" href="{{ AdminConfigurationHA.installLink }}">Artifactory High Availability Installation and Setup</a> page in <a target="_blank" href="{{ AdminConfigurationHA.wikiLink }}">JFrog's wiki</a> for detailed instructions.
-            	</div>
-            </div>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/ha/ha.module.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/ha/ha.module.js
deleted file mode 100644
index c72eec5..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/ha/ha.module.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import {AdminConfigurationHAController} from './ha.controller';
-
-function haConfig($stateProvider) {
-    $stateProvider
-            .state('admin.configuration.ha', {
-                params: {feature: 'highavailability'},
-                url: '/ha',
-                templateUrl: 'states/admin/configuration/ha/ha.html',
-                controller: 'AdminConfigurationHAController as AdminConfigurationHA'
-            })
-}
-
-export default angular.module('configuration.ha', [])
-        .config(haConfig)
-        .controller('AdminConfigurationHAController', AdminConfigurationHAController)
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/licenses/license_form.controller.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/licenses/license_form.controller.js
deleted file mode 100644
index 3d08359..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/licenses/license_form.controller.js
+++ /dev/null
@@ -1,51 +0,0 @@
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-
-export class AdminConfigurationLicenseFormController {
-    constructor($stateParams, LicensesDao, $state, ArtifactoryState, ArtifactoryModelSaver) {
-    	this.state = $state;
-    	this.isNew = !$stateParams.licenseName;
-    	this.licensesDao = LicensesDao;
-		this.artifactoryState = ArtifactoryState;
-        this.artifactoryModelSaver = ArtifactoryModelSaver.createInstance(this,['license']);
-
-        this.TOOLTIP = TOOLTIP.admin.configuration.licenseForm;
-
-    	if (this.isNew) {
-    		this.license = new LicensesDao();
-    	}
-    	else {
-            this.license = LicensesDao.getSingleLicense({name: $stateParams.licenseName});
-            this.license.$promise.then((data)=>{
-                this.artifactoryModelSaver.save();
-            });
-    	}
-    }
-
-    save() {
-		let whenSaved = this.isNew ? this.license.$create() : this.license.$update();
-        whenSaved.then(() => {
-            this.artifactoryModelSaver.save();
-            this._end()
-        });
-
-    }
-	cancel() {
-        this._end();
-    }
-    _end() {
-        let prevState = this.artifactoryState.getState('prevState');
-        if (prevState) {
-            this.state.go(prevState.state,prevState.params);
-        }
-        else {
-            this.state.go('^.licenses');
-        }
-    }
-
-    testRegex(value) {
-
-        let regex = new RegExp('^[A-Za-z0-9\._-]*$');
-        return regex.test(value);
-    }
-
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/licenses/license_form.html b/web/angular-web/src/main/webapp/app/states/admin/configuration/licenses/license_form.html
deleted file mode 100644
index 72da8a2..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/licenses/license_form.html
+++ /dev/null
@@ -1,109 +0,0 @@
-<div class="content-layout-container">
-    <h1 ng-if="!AdminLicenseForm.isNew">Edit {{AdminLicenseForm.license.name}} License</h1>
-
-    <h1 ng-if="AdminLicenseForm.isNew">New License</h1>
-
-    <div class="content-wrapper">
-        <form name="newLicenseForm" ng-submit="AdminLicenseForm.save(license)" novalidate>
-            <div class="card stretch card-pole-pad card-side-pad">
-                <div class="content-with-footer">
-                    <jf-panel jf-panel-heading="Artifactory License Details">
-                        <div class="form-group">
-                            <div class="form-group">
-                                <div class="form-group-cell">
-                                    <jf-field validations="licenses" autofocus="true">
-                                        <label class="mandatory" for="licenseName">License Key</label>
-                                        <input type="text"
-                                               class="input-text"
-                                               name="licenseName"
-                                               ng-disabled="!AdminLicenseForm.isNew"
-                                               ui-validate="{validateLicense:'AdminLicenseForm.testRegex($value)'}"
-                                               ng-model="AdminLicenseForm.license.name"
-                                               id="licenseName"
-                                               required/>
-                                    </jf-field>
-                                </div>
-                            </div>
-                            <div class="form-group">
-                                <div class="form-group-cell">
-                                    <jf-field validations="licenses">
-                                        <label for="longName">Long Name</label>
-                                        <input name="longName"
-                                               type="text"
-                                               ng-model="AdminLicenseForm.license.longName"
-                                               class="input-text"
-                                               id="longName">
-                                    </jf-field>
-                                </div>
-                            </div>
-                            <div class="form-group">
-                                <div class="form-group-cell">
-                                    <jf-field validations="licenses">
-                                        <label for="urls">URLs</label>
-                                        <jf-help-tooltip
-                                                html="AdminLicenseForm.TOOLTIP.URLs"></jf-help-tooltip>
-                                    <textarea name="urls"
-                                              type="text"
-                                              ng-model="AdminLicenseForm.license.url"
-                                              class="input-text"
-                                              id="urls"
-                                              rows="2"
-                                              cols="2"></textarea>
-                                    </jf-field>
-                                </div>
-                            </div>
-                            <div class="form-group">
-                                <div class="form-group-cell">
-                                    <jf-field validations="licenses">
-                                        <label for="notes">Notes</label>
-                                        <textarea name="notes"
-                                                  type="text"
-                                                  ng-model="AdminLicenseForm.license.comments"
-                                                  class="input-text"
-                                                  id="notes"
-                                                  rows="2"
-                                                  cols="2"></textarea>
-                                    </jf-field>
-                                </div>
-                            </div>
-                            <div class="form-group">
-                                <div class="form-group-cell">
-                                    <jf-field validations="licenses">
-                                        <label for="regexp">RegExp</label>
-                                        <jf-help-tooltip html="AdminLicenseForm.TOOLTIP.regExp"></jf-help-tooltip>
-                                        <textarea name="regexp"
-                                                  type="text"
-                                                  ng-model="AdminLicenseForm.license.regexp"
-                                                  class="input-text"
-                                                  id="regexp"
-                                                  rows="2"
-                                                  cols="2"></textarea>
-                                    </jf-field>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Approved">
-                                    <input id=""
-                                           type="checkbox"
-                                           ng-model="AdminLicenseForm.license.approved"
-                                           name="">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                    </jf-panel>
-                </div>
-            </div>
-
-            <div class="content-footer">
-                <div class="pull-right">
-                    <button class="btn btn-default" type="button"
-                            ng-click="AdminLicenseForm.cancel()">Cancel
-                    </button>
-                    <button class="btn btn-primary" type="submit" ng-disabled="newLicenseForm.$invalid">Save</button>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/licenses/licenses.controller.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/licenses/licenses.controller.js
deleted file mode 100644
index 94aff23..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/licenses/licenses.controller.js
+++ /dev/null
@@ -1,145 +0,0 @@
-import API from '../../../../constants/api.constants';
-
-export class AdminConfigurationLicensesController {
-
-    constructor($scope, $window, ArtifactoryModal, LicensesDao, ArtifactoryGridFactory, ArtifactoryState, uiGridConstants) {
-        this.$window = $window;
-        this.gridOption = {};
-        this.uiGridConstants = uiGridConstants;
-        this.licensesDao = LicensesDao;
-        this.$scope=$scope;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.modal = ArtifactoryModal;
-
-        this._createGrid();
-        this._initLicenses();
-
-
-        //clear 'prevState' in ArtifactoryState, used to return from license form to another state (Builds->Licenses)
-        ArtifactoryState.setState('prevState', undefined);
-    }
-
-    _initLicenses() {
-        this.licensesDao.getLicense().$promise.then((licenses)=> {
-            this.licenses = licenses;
-            this.gridOption.setGridData(this.licenses.data)
-        });
-    }
-
-    _createGrid() {
-        this.gridOption = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setColumns(this.getCloumns())
-                .setRowTemplate('default')
-                .setMultiSelect()
-                .setButtons(this._getActions())
-                .setBatchActions(this._getBatchActions());
-    }
-
-    deleteLicense(license) {
-        let json = {licenseskeys: [license.name]}
-        this.modal.confirm(`Are you sure you want to delete ${license.name}?`)
-                .then(()=> {
-                    this.licensesDao.delete(json).$promise.then(()=>this.updateListTable());
-                });
-    }
-
-    deleteSelectedLicenses() {
-        //Get All selected licenses
-        let selectedRows = this.gridOption.api.selection.getSelectedGridRows();
-        //Create an array of the selected licenses keys
-        let names = _.map(selectedRows, (row) => {return row.entity.name});
-        //Create Json for the bulk request
-        let json = {licenseskeys: names};
-        //console.log('Bulk delete....');
-        //Ask for confirmation before delete and if confirmed then delete bulk of licenses
-        this.modal.confirm(`Are you sure you want to delete ${selectedRows.length} licenses?`)
-                .then(()=> {
-                    this.licensesDao.delete(json).$promise.then(() => this.updateListTable());
-                });
-    }
-
-    updateListTable() {
-        this.licensesDao.getLicense().$promise.then((licenses)=> {
-            this.licenses = licenses;
-            this.gridOption.setGridData(this.licenses.data)
-            if (this.modalInstance) {
-                this.closeModal();
-            }
-        });
-    }
-
-    setStatus(row) {
-        if (row.approved) {
-            row.approved = false;
-            row.status = "Unapproved";
-        }
-        else {
-            row.approved = true;
-            row.status = "Approved";
-        }
-        this.licensesDao.update(row).$promise.then(()=>this.updateListTable());
-    }
-
-    exportLicenses() {
-        this.$window.open(`${API.API_URL}/licenseexport`, '_self', '');
-    }
-
-    getCloumns() {
-        return [
-            {
-                name: "License Key",
-                displayName: "License Key",
-                field: "name",
-                sort: {
-                    direction: this.uiGridConstants.ASC
-                },
-                cellTemplate: '<div class="ui-grid-cell-contents"><a ui-sref="^.licenses.edit({licenseName: row.entity.name})" id="license-key" class="text-center ui-grid-cell-contents">{{row.entity.name}}</a></div>',
-                width: '15%'
-            },
-            {
-                name: 'Name',
-                displayName: 'Name',
-                field: "longName",
-                cellTemplate: '<div class="ui-grid-cell-contents" id="license-name"><span>{{row.entity.longName}}</span></div>',
-                width: '40%'
-
-            },
-            {
-                name: "URL",
-                displayName: "URL",
-                field: "url",
-                cellTemplate: '<div class="ui-grid-cell-contents" ><a href="{{row.entity.url}}" target="_blank" id="license-url">{{row.entity.url}}</a></div>',
-                width: '30%'
-            },
-            {
-                name: "Status",
-                displayName: "Status",
-                field: "status",
-                cellTemplate: '<div class="ui-grid-cell-contents"><jf-switch-toggle texton="Approved" id="license-status" textoff="Unapproved" ng-click="grid.appScope.AdminConfigurationLicenses.setStatus(row.entity)" ng-class="{\'on\': row.entity.approved, \'off\': !row.entity.approved}"></jf-switch-toggle></div>',
-                width: '15%'
-            }
-        ]
-    }
-
-    _getActions() {
-        return [
-            {
-                icon: 'icon icon-clear',
-                tooltip: 'Delete',
-                callback: license => this.deleteLicense(license)
-            }
-        ];
-    }
-
-    _getBatchActions() {
-        return [
-            {
-                icon: 'clear',
-                name: 'Delete',
-                callback: () => this.deleteSelectedLicenses()
-            },
-        ]
-    }
-
-
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/licenses/licenses.html b/web/angular-web/src/main/webapp/app/states/admin/configuration/licenses/licenses.html
deleted file mode 100644
index 89937e9..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/licenses/licenses.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<div class="content-layout-container">
-    <h1>Licenses Management</h1>
-
-    <div class="content-wrapper">
-        <div class="card stretch card-pole-pad card-side-pad">
-            <div class="pull-right admin-grid-buttons">
-                <a ui-sref="^.licenses.new">
-                    <i class="grid-button-icon icon icon-new"></i>New
-                </a>
-                <a ng-click="AdminConfigurationLicenses.exportLicenses()">
-                    <i class="grid-button-icon icon icon-export"></i>Export
-                </a>
-            </div>
-            <jf-grid grid-options="AdminConfigurationLicenses.gridOption"
-                     filter-field="name"
-                     auto-focus="true"
-                     object-name="License"
-                     class="licenses-management"></jf-grid>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/licenses/licenses.module.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/licenses/licenses.module.js
deleted file mode 100644
index fb0ed36..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/licenses/licenses.module.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import {AdminConfigurationLicensesController} from './licenses.controller';
-import {AdminConfigurationLicenseFormController} from './license_form.controller'
-
-function licensesConfig($stateProvider) {
-    $stateProvider
-            .state('admin.configuration.licenses', {
-                url: '/licenses',
-                params: {feature: 'licenses'},
-                templateUrl: 'states/admin/configuration/licenses/licenses.html',
-                controller: 'AdminConfigurationLicensesController as AdminConfigurationLicenses'
-            })
-            .state('admin.configuration.licenses.edit', {
-                parent: 'admin.configuration',
-                url: '/licenses/{licenseName}/edit',
-                params: {feature: 'licenses'},
-                templateUrl: 'states/admin/configuration/licenses/license_form.html',
-                controller: 'AdminConfigurationLicenseFormController as AdminLicenseForm'
-            })
-            .state('admin.configuration.licenses.new', {
-                parent: 'admin.configuration',
-                url: '/licenses/new',
-                params: {feature: 'licenses'},
-                templateUrl: 'states/admin/configuration/licenses/license_form.html',
-                controller: 'AdminConfigurationLicenseFormController as AdminLicenseForm'
-            })
-}
-
-
-export default angular.module('configuration.licenses', ['ui.router'])
-        .config(licensesConfig)
-        .controller('AdminConfigurationLicensesController', AdminConfigurationLicensesController)
-        .controller('AdminConfigurationLicenseFormController', AdminConfigurationLicenseFormController);        
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/mail/mail.controller.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/mail/mail.controller.js
deleted file mode 100644
index 5934e0d..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/mail/mail.controller.js
+++ /dev/null
@@ -1,46 +0,0 @@
-import EVENTS from '../../../../constants/common_events.constants';
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-
-export class AdminConfigurationMailController {
-
-    constructor(MailDao, ArtifactoryEventBus, $timeout, ArtifactoryModelSaver) {
-        this.mailDao = MailDao.getInstance();
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.getMailData();
-        this.mailSettingsForm = null;
-        this.testReceiptForm = null;
-        this.TOOLTIP = TOOLTIP.admin.configuration.mail;
-        this.artifactoryModelSaver = ArtifactoryModelSaver.createInstance(this,['mail']);
-        this.$timeout = $timeout;
-    }
-
-    getMailData() {
-        this.mailDao.get().$promise.then((mail)=> {
-            this.mail = mail;
-            this.artifactoryModelSaver.save();
-            this.artifactoryEventBus.dispatch(EVENTS.FORM_CLEAR_FIELD_VALIDATION, true);
-        });
-    }
-
-    save(form) {
-        this.artifactoryEventBus.dispatch(EVENTS.FORM_SUBMITTED, form.$name);
-        if (this.mailSettingsForm.$valid) {
-            this.mailDao.update(this.mail).$promise.then(()=>{
-                this.artifactoryModelSaver.save();
-            });
-        }
-    }
-
-    reset() {
-        this.artifactoryModelSaver.ask().then(()=>{
-            this.getMailData();
-        });
-
-    }
-    testReceipt(form) {
-        this.artifactoryEventBus.dispatch(EVENTS.FORM_SUBMITTED, form.$name);
-        if (this.testReceiptForm.$valid) {
-            this.mailDao.save(this.mail);
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/mail/mail.html b/web/angular-web/src/main/webapp/app/states/admin/configuration/mail/mail.html
deleted file mode 100644
index c0f5f89..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/mail/mail.html
+++ /dev/null
@@ -1,167 +0,0 @@
-<div class="content-layout-container">
-    <h1>Mail Configuration</h1>
-
-    <div class="content-wrapper">
-        <div class="card stretch card-pole-pad card-side-pad">
-            <div class="content-with-footer">
-                <jf-panel jf-panel-heading="Mail Server Settings">
-                    <form class="form" name="AdminConfigurationMail.mailSettingsForm" novalidate>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Enable">
-                                    <input type="checkbox" id="enabled" ng-model="AdminConfigurationMail.mail.enabled">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="adminMail" autofocus="true">
-                                    <label class="mandatory" for="host">Host</label>
-                                    <input type="text" class="input-text"
-                                           id="host"
-                                           name="host"
-                                           required
-                                           ng-disabled="!AdminConfigurationMail.mail.enabled"
-                                           ng-model="AdminConfigurationMail.mail.host"/>
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell">
-                                <jf-field validations="adminMail">
-                                    <label class="mandatory" for="port">Port</label>
-                                    <input type="number" class="input-text"
-                                           min="1"
-                                           max="65535"
-                                           id="port"
-                                           name="port"
-                                           required
-                                           ng-disabled="!AdminConfigurationMail.mail.enabled"
-                                           ng-model="AdminConfigurationMail.mail.port"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="adminMail">
-                                    <label for="username">Username</label>
-                                    <input type="text" class="input-text"
-                                           id="username"
-                                           name="username"
-                                           ng-disabled="!AdminConfigurationMail.mail.enabled"
-                                           ng-model="AdminConfigurationMail.mail.username"/>
-                                </jf-field>
-                            </div>
-                            <!-- prevent auto complete -->
-                            <input type="text" class="hidden"/>
-                            <input type="password" class="hidden"/>
-                            <div class="form-group-cell">
-                                <jf-field validations="adminMail">
-                                    <label for="password">Password</label>
-                                    <input type="password" class="input-text"
-                                           id="password"
-                                           name="password"
-                                           ng-disabled="!AdminConfigurationMail.mail.enabled"
-                                           ng-model="AdminConfigurationMail.mail.password"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="adminMail">
-                                    <label for="from">From</label>
-                                    <jf-help-tooltip
-                                            html="AdminConfigurationMail.TOOLTIP.from"></jf-help-tooltip>
-                                    <input type="email" class="input-text"
-                                           id="from"
-                                           name="from"
-                                           ng-disabled="!AdminConfigurationMail.mail.enabled"
-                                           ng-model="AdminConfigurationMail.mail.from"/>
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell">
-                                <jf-field validations="adminMail">
-                                    <label for="subjectPrefix">Subject Prefix</label>
-                                    <jf-help-tooltip
-                                            html="AdminConfigurationMail.TOOLTIP.subjectPrefix"></jf-help-tooltip>
-                                    <input type="text" class="input-text"
-                                           id="subjectPrefix"
-                                           name="subjectPrefix"
-                                           ng-disabled="!AdminConfigurationMail.mail.enabled"
-                                           ng-model="AdminConfigurationMail.mail.subjectPrefix"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="adminMail">
-                                    <label for="artifactoryUrl">Artifactory URL</label>
-                                    <jf-help-tooltip
-                                            html="AdminConfigurationMail.TOOLTIP.artifactoryURL"></jf-help-tooltip>
-                                    <input type="url" class="input-text"
-                                           id="artifactoryUrl"
-                                           name="artifactoryUrl"
-                                           ng-disabled="!AdminConfigurationMail.mail.enabled"
-                                           ng-model="AdminConfigurationMail.mail.artifactoryUrl"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group form-checkbox">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Use TLS">
-                                    <input type="checkbox" id="tls"
-                                           ng-disabled="!AdminConfigurationMail.mail.enabled"
-                                           ng-model="AdminConfigurationMail.mail.tls">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Use SSL">
-                                    <input type="checkbox" id="ssl"
-                                           ng-disabled="!AdminConfigurationMail.mail.enabled"
-                                           ng-model="AdminConfigurationMail.mail.ssl">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                    </form>
-                    <form name="AdminConfigurationMail.testReceiptForm" novalidate>
-                        <div class="form-group margin-top-25">
-                            <div class="form-group-cell">
-                                <jf-field validations="adminMail" invalidate-on-submit="true">
-                                    <input type="email"
-                                           class="input-text"
-                                           id="testReceipt"
-                                           name="testReceipt"
-                                           placeholder="email at example.com"
-                                           ng-disabled="!AdminConfigurationMail.mail.enabled"
-                                           ng-model="AdminConfigurationMail.mail.testReceipt"
-                                           required/>
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell">
-                                <button class="btn btn-secondary" type="button"
-                                        ng-disabled="!AdminConfigurationMail.mail.enabled ||
-                                        !AdminConfigurationMail.mailSettingsForm.$valid ||
-                                        !AdminConfigurationMail.testReceiptForm.$valid"
-                                        ng-click="AdminConfigurationMail.testReceipt(AdminConfigurationMail.testReceiptForm)">
-                                    Send Test Mail
-                                </button>
-                            </div>
-                        </div>
-                    </form>
-                </jf-panel>
-            </div>
-        </div>
-
-        <div class="content-footer">
-            <div class="pull-right">
-                <button class="btn btn-default" type="button"
-                        ng-click="AdminConfigurationMail.reset()">Reset
-                </button>
-                <button class="btn btn-primary" type="button"
-                        ng-disabled="!AdminConfigurationMail.mailSettingsForm.$valid"
-                        ng-click="AdminConfigurationMail.save(AdminConfigurationMail.mailSettingsForm)">Save
-                </button>
-            </div>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/mail/mail.module.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/mail/mail.module.js
deleted file mode 100644
index 953966d..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/mail/mail.module.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import {AdminConfigurationMailController} from './mail.controller';
-
-function mailConfig($stateProvider) {
-    $stateProvider
-            .state('admin.configuration.mail', {
-                params: {feature: 'mail'},
-                url: '/mail',
-                templateUrl: 'states/admin/configuration/mail/mail.html',
-                controller: 'AdminConfigurationMailController as AdminConfigurationMail'
-            })
-}
-
-export default angular.module('configuration.mail', [])
-        .config(mailConfig)
-        .controller('AdminConfigurationMailController', AdminConfigurationMailController)
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/property_sets/property_form_modal.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/property_sets/property_form_modal.js
deleted file mode 100644
index fce2315..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/property_sets/property_form_modal.js
+++ /dev/null
@@ -1,92 +0,0 @@
-// modal
-let $rootScope;
-let ArtifactoryModal;
-let Property, PropertySet;
-class PropertyFormModal {
-    constructor(propertySet, property, isNew) {
-        this.scope = $rootScope.$new();
-        this.scope.PropertyForm = this;
-        this.isNew = isNew;
-        this.originalProperty = property;
-        this.property = angular.copy(this.originalProperty);
-        this.propertySet = propertySet;
-        this.propertyTypes = Property.propertyTypes;
-    }
-
-    launch() {
-        this.modalInstance = ArtifactoryModal.launchModal('property_form_modal', this.scope)
-        return this.modalInstance.result;
-    }
-
-    save() {
-        angular.copy(this.property, this.originalProperty);
-        this.modalInstance.close();
-    }
-
-    cancel() {
-        this.modalInstance.dismiss();
-    }
-
-    isPropertyUnique(propertyName) {
-        return propertyName === this.originalProperty.name || !this.propertySet.getPropertyByName(propertyName);
-    }
-
-    isPredefinedValuesValid() {
-        if (this.property.propertyType === 'ANY_VALUE') return true; // Any Value allows no predefined values
-        else return this.property.predefinedValues.length; // Other types must have predefined values
-    }
-
-    isDefaultValuesValid(propertyType) {
-        if (propertyType === 'MULTI_SELECT') return true;
-        return this.property.getDefaultValues().length < 2;
-    }
-
-    invalidateType() {
-        // By changing the property we use in ui-validate-watch, we force the validation on propertyType to run again
-        this.propertyTypeWatch = this.propertyTypeWatch || 0;
-        this.propertyTypeWatch++;
-    }
-
-    getPredefinedValuesStr() {
-        // This is for watching the propertyType value
-        return JSON.stringify(this.property.predefinedValues);
-    }
-
-    removeValue(value) {
-        _.remove(this.property.predefinedValues, value);
-        this.invalidateType();
-    }
-
-    addValue() {
-        this.newValue = $('#newPredefinedValueName').val();
-        this.errorMessage = null;
-
-        if (this._isValueEmpty(this.newValue)) {
-            this.errorMessage = "Must input value";
-        }
-        else if (!this._isValueUnique(this.newValue)) {
-            this.errorMessage = "Value already exists";
-        }
-        else {
-            this.property.addPredefinedValue(this.newValue);
-            this.newValue = null;
-            $('#newPredefinedValueName').val('');
-            this.invalidateType();
-        }
-    }
-
-    _isValueEmpty(text) {
-        return _.isEmpty(text);
-    }
-    _isValueUnique(text) {
-        return !this.property.getPredefinedValue(text);
-    }
-}
-
-export function PropertyFormModalFactory(_$rootScope_, _ArtifactoryModal_, _Property_, _PropertySet_) {
-    Property = _Property_;
-    PropertySet = _PropertySet_;
-    $rootScope = _$rootScope_;
-    ArtifactoryModal = _ArtifactoryModal_;
-    return PropertyFormModal;
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/property_sets/property_set_form.controller.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/property_sets/property_set_form.controller.js
deleted file mode 100644
index e45d67b..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/property_sets/property_set_form.controller.js
+++ /dev/null
@@ -1,171 +0,0 @@
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-
-// Injectables:
-let $q, $scope, $state, $stateParams, ArtifactoryGridFactory, PropertySetsDao, PropertyFormModal, Property, PropertySet, uiGridConstants, ArtifactoryModal, ArtifactoryModelSaver;
-
-export class AdminConfigurationPropertySetFormController {
-    constructor(_$stateParams_, _$scope_, _PropertySetsDao_, _$state_, _ArtifactoryGridFactory_, _PropertyFormModal_, ArtifactoryState, _$q_, _Property_, _PropertySet_, _uiGridConstants_, _ArtifactoryModal_, _ArtifactoryModelSaver_) {
-        $scope = _$scope_;
-    	$state = _$state_;
-        $stateParams = _$stateParams_;
-        Property = _Property_;
-        PropertySet = _PropertySet_;
-        ArtifactoryModal = _ArtifactoryModal_;
-        ArtifactoryModelSaver = _ArtifactoryModelSaver_.createInstance(this,['propertySet']);;
-
-    	this.isNew = !$stateParams.propertySetName;
-    	PropertySetsDao = _PropertySetsDao_;
-        PropertyFormModal = _PropertyFormModal_;
-		ArtifactoryGridFactory = _ArtifactoryGridFactory_;
-        $q = _$q_;
-        uiGridConstants = _uiGridConstants_;
-
-        this.TOOLTIP = TOOLTIP.admin.configuration.propertySetsForm;
-        this._createGrid();
-        this._initPropertySet();
-        ArtifactoryState.setState('prevState', $state.current);
-    }
-
-    _initPropertySet() {
-        let promise;
-        if (this.isNew) {
-            promise = $q.when();
-        }
-        else {
-            promise = PropertySetsDao.get({name: $stateParams.propertySetName}).$promise;
-        }
-        promise.then((propertySet) => {
-            this.propertySet = new PropertySet(propertySet);
-            ArtifactoryModelSaver.save();
-            this.gridOptions.setGridData(this.propertySet.properties)
-        });
-    }
-
-    _createGrid() {
-        this.gridOptions = ArtifactoryGridFactory.getGridInstance($scope)
-                .setColumns(this.getColumns())
-                .setRowTemplate('default')
-                .setMultiSelect()
-                .setButtons(this._getActions())
-                .setBatchActions(this._getBatchActions());
-    }
-
-    save() {
-		let whenSaved = this.isNew ? PropertySetsDao.save(this.propertySet) : PropertySetsDao.update(this.propertySet);
-        whenSaved.$promise.then(() => {
-            ArtifactoryModelSaver.save();
-            this._end()
-        });
-    }
-
-	cancel() {
-        this._end();
-    }
-
-    _end() {
-        $state.go('^.property_sets');
-    }
-
-    editProperty(property) {
-        // (Adam) Don't take the actual property object because it's different after filtering the GRID
-        // Instead, we find the property in the original propertySet
-        property = this.propertySet.getPropertyByName(property.name);
-        this._launchPropertyEditor(property, false);
-    }
-
-    newProperty(e) {
-        e.preventDefault();
-        let property = new Property();
-        this._launchPropertyEditor(property, true);
-    }
-
-    _launchPropertyEditor(property, isNew) {
-        new PropertyFormModal(this.propertySet, property, isNew).launch()
-        .then(() => {
-            if (isNew) {
-                this.propertySet.addProperty(property);
-            }
-            // (Adam) Must reset the data, because of the filter
-            this.gridOptions.setGridData(this.propertySet.properties);
-        });
-    }
-
-    _doDeleteProperty(property) {
-        this.propertySet.removeProperty(property.name);
-    }
-
-    deleteProperty(property) {
-        ArtifactoryModal.confirm(`Are you sure you want to delete the property '${property.name}?'`)
-            .then(() => {
-                this._doDeleteProperty(property);
-                this.gridOptions.setGridData(this.propertySet.properties);
-            });
-    }
-
-    deleteSelectedProperties() {
-        let selectedRows = this.gridOptions.api.selection.getSelectedGridRows();
-        ArtifactoryModal.confirm(`Are you sure you want to delete ${selectedRows.length} properties?`)
-            .then(() => {
-                selectedRows.forEach((row) => this._doDeleteProperty(row.entity));
-                this.gridOptions.setGridData(this.propertySet.properties);
-            });
-    }
-
-    getColumns() {
-        return [
-            {
-                field: "name",
-                name: "Property Name",
-                displayName: "Property Name",
-                sort: {
-                    direction: uiGridConstants.ASC
-                },
-                cellTemplate: `
-                    <div class="ui-grid-cell-contents">
-                        <a  href=""
-                            ng-click="grid.appScope.PropertySetForm.editProperty(row.entity)"
-                            class="text-center ui-grid-cell-contents">{{row.entity.name}}</a>
-                    </div>`
-            },
-            {
-                name: 'Value Type',
-                displayName: 'Value Type',
-                field: "propertyType",
-                cellTemplate: `<div class="ui-grid-cell-contents">{{ row.entity.getDisplayType() }}</div>`
-            },
-            {
-                field: "predefinedValues",
-                name: "Predefined Values",
-                displayName: "Predefined Values",
-                cellTemplate: `
-                    <div style="padding-left: 10px;  white-space: nowrap; overflow-x: auto;">
-                        <div class="item" ng-repeat="value in row.entity.predefinedValues">
-                            {{value.value}}<span ng-if="value.defaultValue"> (default)</span>
-                        </div>
-                    </div>
-                `
-            }
-        ]
-    }
-
-    _getActions() {
-        return [
-            {
-                icon: 'icon icon-clear',
-                tooltip: 'Delete',
-                callback: propertySet => this.deleteProperty(propertySet)
-            }
-        ];
-    }
-
-    _getBatchActions() {
-        return [
-            {
-                icon: 'clear',
-                name: 'Delete',
-                callback: () => this.deleteSelectedProperties()
-            },
-        ]
-    }
-}
-
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/property_sets/property_set_form.html b/web/angular-web/src/main/webapp/app/states/admin/configuration/property_sets/property_set_form.html
deleted file mode 100644
index 95a7edc..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/property_sets/property_set_form.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<div class="content-layout-container">
-    <h1 ng-if="PropertySetForm.isNew">New Property Set</h1>
-    <h1 ng-if="!PropertySetForm.isNew">Edit {{ PropertySetForm.propertySet.name }} Property Set</h1>
-
-    <div class="content-wrapper">
-        <form name="propertySetForm" ng-submit="PropertySetForm.save()">
-            <div class="card stretch card-pole-pad card-side-pad">
-                <div class="content-with-footer">
-                    <jf-panel jf-panel-heading="Property Set Details">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="propertySet" autofocus="true">
-                                    <label for="propertySetName" class="mandatory">Property Set Name</label>
-                                    <input
-                                            id="propertySetName"
-                                            jf-validator-name
-                                            jf-validator-xml-name
-                                            jf-validator-unique-id
-                                            ng-model-options="{debounce: { 'default': 500 } }"
-                                            class="input-text"
-                                            name="propertySetName"
-                                            ng-disabled="!PropertySetForm.isNew"
-                                            autofocus
-                                            required
-                                            type="text"
-                                            ng-model="PropertySetForm.propertySet.name">
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="pull-right admin-grid-buttons">
-                            <a ng-click="PropertySetForm.newProperty($event)">
-                                <i class="grid-button-icon icon icon-new"></i>New
-                            </a>
-                        </div>
-                        <div class="clearfix"></div>
-                        <jf-grid grid-options="PropertySetForm.gridOptions"
-                                 filter-field="name"
-                                 filter-on-change="true">
-                        </jf-grid>
-                    </jf-panel>
-                </div>
-            </div>
-
-            <div class="content-footer">
-                <div class="pull-right">
-                    <button type="button" class="btn btn-default" ng-click="PropertySetForm.cancel()">
-                        Cancel
-                    </button>
-                    <button type="submit" class="btn btn-primary" ng-disabled="!propertySetForm.$valid">
-                        Save
-                    </button>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/property_sets/property_sets.controller.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/property_sets/property_sets.controller.js
deleted file mode 100644
index 26e800b..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/property_sets/property_sets.controller.js
+++ /dev/null
@@ -1,95 +0,0 @@
-let $timeout, Property, PropertySet, uiGridConstants;
-export class AdminConfigurationPropertySetsController {
-
-    constructor($scope, PropertySetsDao, ArtifactoryGridFactory, _$timeout_, _Property_, _PropertySet_, ArtifactoryModal, _uiGridConstants_) {
-        $timeout = _$timeout_;
-        this.propertySetsDao = PropertySetsDao;
-        this.$scope = $scope;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.modal = ArtifactoryModal;
-        Property = _Property_;
-        PropertySet = _PropertySet_;
-        uiGridConstants = _uiGridConstants_;
-        this._createGrid();
-        this._initPropertySets();
-    }
-
-    _initPropertySets() {
-        this.propertySetsDao.query().$promise.then((propertySets)=> {
-            this.propertySets = propertySets.map((propertySet) => new PropertySet(propertySet));
-            this.gridOptions.setGridData(this.propertySets)
-        });
-    }
-
-    _createGrid() {
-        this.gridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setColumns(this.getColumns())
-                .setRowTemplate('default')
-                .setMultiSelect()
-                .setButtons(this._getActions())
-                .setBatchActions(this._getBatchActions());
-    }
-
-
-    deletePropertySet(propertySet) {
-        this.modal.confirm(`Are you sure you want to delete the property set '${propertySet.name}?'`)
-            .then(() => {
-                let json = {propertySetNames:[propertySet.name]};
-                this.propertySetsDao.delete(json).$promise
-                    .then(()=>this._initPropertySets());
-            });
-    }
-
-    deleteSelectedPropertySets() {
-        //Get All selected users
-        let selectedRows = this.gridOptions.api.selection.getSelectedGridRows();
-        this.modal.confirm(`Are you sure you want to delete ${selectedRows.length} property sets?`)
-            .then(() => {
-                //Create an array of the selected propertySet names
-                let names = selectedRows.map(row => row.entity.name);
-                //Delete bulk of property sets
-                this.propertySetsDao.delete({propertySetNames: names}).$promise
-                        .then(()=>this._initPropertySets());
-            });
-    }
-
-    getColumns() {
-        return [
-            {
-                field: "name",
-                name: "Property Set Name",
-                displayName: "Property Set Name",
-                sort: {
-                    direction: uiGridConstants.ASC
-                },
-                cellTemplate: '<div class="ui-grid-cell-contents"><a ui-sref="^.property_sets.edit({propertySetName: row.entity.name})" class="text-center ui-grid-cell-contents">{{row.entity.name}}</a></div>'
-            },
-            {
-                field: "propertiesCount",
-                name: "Properties Count",
-                displayName: "Properties Count"
-            }
-        ]
-    }
-
-    _getActions() {
-        return [
-            {
-                icon: 'icon icon-clear',
-                tooltip: 'Delete',
-                callback: propertySet => this.deletePropertySet(propertySet)
-            }
-        ];
-    }
-
-    _getBatchActions() {
-        return [
-            {
-                icon: 'clear',
-                name: 'Delete',
-                callback: () => this.deleteSelectedPropertySets()
-            },
-        ]
-    }
-
-}
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/property_sets/property_sets.html b/web/angular-web/src/main/webapp/app/states/admin/configuration/property_sets/property_sets.html
deleted file mode 100644
index 82e907a..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/property_sets/property_sets.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<div class="content-layout-container">
-    <h1>Property Sets Management</h1>
-
-    <div class="content-wrapper">
-        <div class="card stretch card-pole-pad card-side-pad">
-            <div class="pull-right admin-grid-buttons">
-                <a ui-sref="^.property_sets.new">
-                    <i class="grid-button-icon icon icon-new"></i>New
-                </a>
-            </div>
-            <jf-grid grid-options="PropertySets.gridOptions"
-                     filter-field="name"
-                     object-name="property set"
-                     auto-focus="true"></jf-grid>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/property_sets/property_sets.module.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/property_sets/property_sets.module.js
deleted file mode 100644
index 7e8713c..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/property_sets/property_sets.module.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import {AdminConfigurationPropertySetsController}    from './property_sets.controller';
-import {AdminConfigurationPropertySetFormController} from './property_set_form.controller';
-import {PropertyFormModalFactory}                    from './property_form_modal';
-function propertySetsConfig($stateProvider) {
-    $stateProvider
-            .state('admin.configuration.property_sets', {
-                params: {feature: 'properties'},
-                url: '/property_sets',
-                controller: 'AdminConfigurationPropertySetsController as PropertySets',
-                templateUrl: 'states/admin/configuration/property_sets/property_sets.html'
-            })
-            .state('admin.configuration.property_sets.edit', {
-                params: {feature: 'properties'},
-                parent: 'admin.configuration',
-                url: '/property_sets/{propertySetName}/edit',
-                templateUrl: 'states/admin/configuration/property_sets/property_set_form.html',
-                controller: 'AdminConfigurationPropertySetFormController as PropertySetForm'
-            })
-            .state('admin.configuration.property_sets.new', {
-                params: {feature: 'properties'},
-                parent: 'admin.configuration',
-                url: '/property_sets/new',
-                templateUrl: 'states/admin/configuration/property_sets/property_set_form.html',
-                controller: 'AdminConfigurationPropertySetFormController as PropertySetForm'
-            })
-}
-
-export default angular.module('configuration.property_sets', [])
-        .config(propertySetsConfig)
-        .controller('AdminConfigurationPropertySetsController', AdminConfigurationPropertySetsController)
-        .controller('AdminConfigurationPropertySetFormController', AdminConfigurationPropertySetFormController)
-        .factory('PropertyFormModal', PropertyFormModalFactory)
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/proxies/proxies.controller.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/proxies/proxies.controller.js
deleted file mode 100644
index f47a015..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/proxies/proxies.controller.js
+++ /dev/null
@@ -1,117 +0,0 @@
-export class AdminConfigurationProxiesController {
-
-    constructor($scope, ProxiesDao, ArtifactoryGridFactory, ArtifactoryModal, $q, uiGridConstants, commonGridColumns) {
-        this.gridOptions = {};
-        this.commonGridColumns = commonGridColumns;
-        this.uiGridConstants = uiGridConstants;
-        this.proxiesDao = ProxiesDao;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.modal = ArtifactoryModal;
-        this.$scope=$scope;
-        this.$q = $q;
-
-        this._createGrid();
-        this._initProxies();
-    }
-
-    _initProxies() {
-        this.proxiesDao.get().$promise.then((proxies)=> {
-            //console.log(proxies);
-
-            this.gridOptions.setGridData(proxies)
-        });
-    }
-
-    _createGrid() {
-        this.gridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setColumns(this._getColumns())
-                .setMultiSelect()
-                .setButtons(this._getButtons())
-                .setBatchActions(this._getBatchActions())
-                .setRowTemplate('default');
-    }
-
-    deleteSelectedProxies() {
-        let selectedRows = this.gridOptions.api.selection.getSelectedRows();
-        this.modal.confirm(`Are you sure you want to delete ${selectedRows.length} proxies?`)
-            .then(() => {
-                    //Create an array of the selected propertySet names
-                    let keys = _.map(selectedRows, (row) => {return row.key;});
-                    //Create Json for the bulk request
-                    let json = {'proxyKeys': keys};
-                    //console.log('Bulk delete....');
-                    //Delete bulk of property set
-                    this.proxiesDao.delete(json).$promise
-                            .then(()=>this._initProxies());
-            })
-            .then(() => this._initProxies());
-    }
-
-    deleteProxy(key) {
-        this.modal.confirm(`Are you sure you want to delete the proxy '${key}'?`)
-            .then(() => this._doDeleteProxy(key))
-            .then(() => this._initProxies());
-    }
-
-    _doDeleteProxy(key) {
-
-        let json = {proxyKeys:[key]}
-        //console.log(json);
-        return this.proxiesDao.delete(json).$promise;
-    }
-
-    _getColumns() {
-        return [
-            {
-                field: "key",
-                name: "Key",
-                displayName: "Key",
-                sort: {
-                    direction: this.uiGridConstants.ASC
-                },
-                cellTemplate: '<div class="ui-grid-cell-contents"><a ui-sref="^.proxies.edit({proxyKey: row.entity.key})">{{ COL_FIELD }}</a></div>',
-                width: '30%'
-            },
-            {
-                field: "host",
-                name: "Host",
-                displayName: "Host",
-                width: '45%'
-            },
-            {
-                field: "port",
-                name: "Port",
-                displayName: "Port",
-                width: '10%'
-            },
-            {
-                field: "defaultProxy",
-                name: "Default Proxy",
-                displayName: "Default Proxy",
-                cellTemplate: this.commonGridColumns.booleanColumn('row.entity.defaultProxy'),
-                width: '15%'
-            }
-        ]
-    }
-    _getBatchActions() {
-        return [
-            {
-                icon: 'clear',
-                name: 'Delete',
-                callback: () => this.deleteSelectedProxies()
-            }
-        ]
-    }
-
-    _getButtons() {
-        return [
-            {
-                icon: 'icon icon-clear',
-                tooltip: 'Delete',
-                callback: row => this.deleteProxy(row.key)
-            }
-
-        ];
-    }
-
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/proxies/proxies.html b/web/angular-web/src/main/webapp/app/states/admin/configuration/proxies/proxies.html
deleted file mode 100644
index ab1e6fa..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/proxies/proxies.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<div class="content-layout-container">
-    <h1>Proxies Management</h1>
-
-    <div class="content-wrapper">
-        <div class="card stretch card-pole-pad card-side-pad">
-            <div class="pull-right admin-grid-buttons">
-                <a ui-sref="^.proxies.new">
-                    <i class="grid-button-icon icon icon-new"></i>New
-                </a>
-            </div>
-            <jf-grid grid-options="AdminConfigurationProxies.gridOptions"
-                     filter-field="key"
-                     filter-on-change="true"
-                     object-name="proxy/proxies"
-                     auto-focus="true">
-            </jf-grid>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/proxies/proxies.module.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/proxies/proxies.module.js
deleted file mode 100644
index f618416..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/proxies/proxies.module.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import {AdminConfigurationProxiesController} from './proxies.controller';
-import {AdminConfigurationProxyFormController} from './proxy_form.controller';
-
-function proxiesConfig($stateProvider) {
-    $stateProvider
-            .state('admin.configuration.proxies', {
-                params: {feature: 'Proxies'},
-                url: '/proxies',
-                templateUrl: 'states/admin/configuration/proxies/proxies.html',
-                controller: 'AdminConfigurationProxiesController as AdminConfigurationProxies'
-            })
-            .state('admin.configuration.proxies.new', {
-                params: {feature: 'Proxies'},
-                parent: 'admin.configuration',
-                url: '/proxies/new',
-                templateUrl: 'states/admin/configuration/proxies/proxy_form.html',
-                controller: 'AdminConfigurationProxyFormController as ProxyForm'
-            })
-            .state('admin.configuration.proxies.edit', {
-                params: {feature: 'Proxies'},
-                parent: 'admin.configuration',
-                url: '/proxies/:proxyKey/edit',
-                templateUrl: 'states/admin/configuration/proxies/proxy_form.html',
-                controller: 'AdminConfigurationProxyFormController as ProxyForm'
-            })
-}
-
-export default angular.module('configuration.proxies', [])
-        .config(proxiesConfig)
-        .controller('AdminConfigurationProxiesController', AdminConfigurationProxiesController)
-        .controller('AdminConfigurationProxyFormController', AdminConfigurationProxyFormController);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/proxies/proxy_form.controller.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/proxies/proxy_form.controller.js
deleted file mode 100644
index 26719f4..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/proxies/proxy_form.controller.js
+++ /dev/null
@@ -1,57 +0,0 @@
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-
-let $state, $stateParams, ProxiesDao, ArtifactoryModal, ArtifactoryModelSaver;
-
-export class AdminConfigurationProxyFormController {
-
-    constructor(_$state_, _$stateParams_, _ProxiesDao_, _ArtifactoryModal_,_ArtifactoryModelSaver_) {
-        ProxiesDao = _ProxiesDao_;
-        $stateParams = _$stateParams_;
-        $state = _$state_;
-        ArtifactoryModal = _ArtifactoryModal_;
-        ArtifactoryModelSaver = _ArtifactoryModelSaver_.createInstance(this,['proxy']);;
-
-
-        this.isNew = !$stateParams.proxyKey;
-        this.formTitle = `${this.isNew && 'New' || 'Edit ' + $stateParams.proxyKey } Proxy`;
-        this.TOOLTIP = TOOLTIP.admin.configuration.proxyForm;
-        this._initProxy();
-    }
-
-    _initProxy() {
-        if (this.isNew) {
-            this.proxy = {};
-        }
-        else {
-            ProxiesDao.getSingleProxy({key: $stateParams.proxyKey}).$promise
-                .then((proxy) => {
-                        this.proxy = proxy
-                        ArtifactoryModelSaver.save();
-                    });
-        }
-    }
-
-    onChangeDefault() {
-        if (!this.proxy.defaultProxy) return;
-        ArtifactoryModal.confirm('Do you wish to use this proxy with existing remote repositories (and override any assigned proxies)?',
-                '',
-                {confirm: "OK"})
-            .catch(() => this.proxy.defaultProxy = false);
-    }
-
-    save() {
-        let whenSaved = this.isNew ? ProxiesDao.save(this.proxy) : ProxiesDao.update(this.proxy);
-        whenSaved.$promise.then(() => {
-            ArtifactoryModelSaver.save();
-            this._end()
-        });
-    }
-
-    cancel() {
-        this._end();
-    }
-
-    _end() {
-        $state.go('^.proxies');
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/proxies/proxy_form.html b/web/angular-web/src/main/webapp/app/states/admin/configuration/proxies/proxy_form.html
deleted file mode 100644
index 3381687..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/proxies/proxy_form.html
+++ /dev/null
@@ -1,159 +0,0 @@
-<div class="content-layout-container">
-    <h1>{{ ProxyForm.formTitle }}</h1>
-
-    <div class="content-wrapper">
-        <form novalidate name="ProxyForm.proxyEditForm" ng-submit="ProxyForm.save()">
-            <div class="card stretch card-pole-pad card-side-pad">
-                <div class="content-with-footer">
-                    <jf-panel jf-panel-heading="Proxy Settings">
-                        <div class="form-group">
-                            <!-- PROXY KEY -->
-                            <div class="form-group-cell">
-                                <jf-field validations="proxies" autofocus="true">
-                                    <label for="key" class="mandatory">Proxy Key</label>
-                                    <input type="text"
-                                           name="key"
-                                           jf-validator-unique-id
-                                           jf-validator-xml-name
-                                           jf-validator-name
-                                           ng-model-options="{debounce: { 'default': 500 } }"
-                                           ng-disabled="!ProxyForm.isNew"
-                                           autofocus
-                                           class="input-text"
-                                           id="key"
-                                           required
-                                           ng-model="ProxyForm.proxy.key"/>
-                                </jf-field>
-                            </div>
-
-                            <!-- DEFAULT PROXY -->
-                            <div class="form-group-cell form-button">
-                                <jf-checkbox text="System Default">
-                                    <input type="checkbox"
-                                           id="defaultProxy"
-                                           name="defaultProxy"
-                                           ng-model="ProxyForm.proxy.defaultProxy"
-                                           ng-change="ProxyForm.onChangeDefault()">
-                                </jf-checkbox>
-                                <jf-help-tooltip html="ProxyForm.TOOLTIP.systemDefault"></jf-help-tooltip>
-                            </div>
-                        </div>
-
-                        <!-- HOST -->
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="proxies">
-                                    <label for="host" class="mandatory">Host</label>
-                                    <input type="text"
-                                           class="input-text"
-                                           name="host"
-                                           required
-                                           id="host"
-                                           ng-model="ProxyForm.proxy.host">
-                                </jf-field>
-                            </div>
-
-                            <!-- PORT -->
-                            <div class="form-group-cell">
-                                <jf-field validations="proxies">
-                                    <label for="port" class="mandatory">Port</label>
-                                    <input type="number"
-                                           class="input-text"
-                                           required
-                                           id="port"
-                                           name="port"
-                                           min="1"
-                                           max="65535"
-                                           ng-model="ProxyForm.proxy.port">
-                                </jf-field>
-                            </div>
-                        </div>
-
-                        <div class="form-group">
-                            <!-- USER NAME-->
-                            <div class="form-group-cell">
-                                <jf-field validations="proxies">
-                                    <label for="username">User Name</label>
-                                    <input type="text"
-                                           class="input-text"
-                                           id="username"
-                                           name="username"
-                                           ng-model="ProxyForm.proxy.username">
-                                </jf-field>
-                            </div>
-                            <!-- prevent auto complete -->
-                            <input type="text" class="hidden"/>
-                            <input type="password" class="hidden"/>
-                            <!-- PASSWORD -->
-                            <div class="form-group-cell">
-                                <jf-field validations="proxies">
-                                    <label for="password">Password</label>
-                                    <input type="password"
-                                           class="input-text"
-                                           id="password"
-                                           name="password"
-                                           ng-model="ProxyForm.proxy.password">
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <!-- NT HOST -->
-                            <div class="form-group-cell">
-                                <jf-field validations="proxies">
-                                    <label for="nt_host">NT Host</label>
-                                    <input type="text"
-                                           class="input-text"
-                                           id="nt_host"
-                                           name="nt_host"
-                                           ng-model="ProxyForm.proxy.ntHost">
-                                </jf-field>
-                            </div>
-
-                            <!-- NT PORT -->
-                            <div class="form-group-cell">
-                                <jf-field validations="proxies">
-                                    <label for="nt_domain">NT Domain</label>
-                                    <input type="text"
-                                           class="input-text"
-                                           id="nt_domain"
-                                           name="nt_domain"
-                                           ng-model="ProxyForm.proxy.domain">
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="proxies">
-                                    <label for="target_hosts">Redirecting Proxy Target Hosts</label>
-                                    <jf-help-tooltip html="ProxyForm.TOOLTIP.redirectingProxyTargetHosts"></jf-help-tooltip>
-                            <textarea class="input-text"
-                                      id="target_hosts"
-                                      name="target_hosts"
-                                      cols="4"
-                                      rows="4"
-                                      ng-model="ProxyForm.proxy.redirectedToHosts"></textarea>
-                                </jf-field>
-                            </div>
-                        </div>
-                    </jf-panel>
-                </div>
-            </div>
-            <div class="content-footer">
-                <div class="pull-right">
-                    <button
-                            type="button"
-                            class="btn btn-default"
-                            ng-click="ProxyForm.cancel()">
-                        Cancel
-                    </button>
-                    <button
-                            type="submit"
-                            class="btn btn-primary"
-                            ng-disabled="!ProxyForm.proxyEditForm.$valid">Save
-                    </button>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
-
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/register_pro/register_pro.controller.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/register_pro/register_pro.controller.js
deleted file mode 100644
index 44b8d7b..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/register_pro/register_pro.controller.js
+++ /dev/null
@@ -1,42 +0,0 @@
-import EVENTS from '../../../../constants/artifacts_events.constants';
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-
-export class AdminConfigurationRegisterController{
-
-    constructor(RegisterProDao, ArtifactoryEventBus,User, $state,ArtifactoryModelSaver) {
-        this.registerProDao = RegisterProDao;
-        this.$state = $state;
-        this.ArtifactoryEventBus = ArtifactoryEventBus;
-        this.User=User;
-        this.TOOLTIP = TOOLTIP.admin.configuration.registerPro;
-        this.artifactoryModelSaver = ArtifactoryModelSaver.createInstance(this,['registerDetails']);
-        this.getData();
-    }
-
-    save(registerDetails) {
-        this.registerProDao.update(registerDetails).$promise.then( (data)=> {
-            // Refresh the home page footer with the new license details
-            this.ArtifactoryEventBus.dispatch(EVENTS.FOOTER_REFRESH);
-            this.User.loadUser(true);
-            this.artifactoryModelSaver.save();
-            if (data.status === 200) this.$state.go('home');
-        });
-    }
-
-    getData() {
-        if(!this.User.currentUser.isProWithoutLicense()) {
-            this.registerProDao.get().$promise.then((data)=>{
-                this.registerDetails = data;
-                this.artifactoryModelSaver.save();
-            });
-        }
-    }
-
-    reset() {
-        this.artifactoryModelSaver.ask().then(()=>{
-            this.getData();
-        });
-
-    }
-
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/register_pro/register_pro.html b/web/angular-web/src/main/webapp/app/states/admin/configuration/register_pro/register_pro.html
deleted file mode 100644
index baa0d36..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/register_pro/register_pro.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<div class="content-layout-container">
-    <h1>Artifactory License</h1>
-
-    <div class="content-wrapper">
-        <form class="form" ng-submit="AdminConfigurationRegister.save(AdminConfigurationRegister.registerDetails)" novalidate>
-            <div class="card stretch card-pole-pad card-side-pad">
-                <div class="content-with-footer">
-                    <jf-panel ng-if="!AdminConfigurationRegister.User.currentUser.isProWithoutLicense()" jf-panel-heading="License Details">
-                        <table class="jf-data-table">
-                            <tr>
-                                <td>Licensed to:</td>
-                                <td>{{AdminConfigurationRegister.registerDetails.licenseTo}}</td>
-                            </tr>
-                            <tr>
-                                <td>Valid Through:</td>
-                                <td>{{AdminConfigurationRegister.registerDetails.validThough}}</td>
-                            </tr>
-                            <tr>
-                                <td>License Type:</td>
-                                <td>{{AdminConfigurationRegister.registerDetails.licenseType}}</td>
-                            </tr>
-                        </table>
-                    </jf-panel>
-                    <jf-panel jf-panel-heading="License Key">
-                        <div class="form-group">
-                            <div class="form-group-cell double">
-                                <jf-field autofocus="true">
-                                    <label>* The license key is required for using Artifactory Add-ons.</label><br><br>
-                                    <textarea name="key" class="input-text monospaced"
-                                              id="key"
-                                              rows="11"
-                                              cols="9"
-                                              ng-model="AdminConfigurationRegister.registerDetails.key"></textarea>
-                                </jf-field>
-                            </div>
-                        </div>
-                    </jf-panel>
-                </div>
-            </div>
-
-            <div class="content-footer">
-                <div class="pull-right">
-                    <button class="btn btn-default" ng-click="AdminConfigurationRegister.reset()" type="button">
-                        Reset
-                    </button>
-                    <button class="btn btn-primary" ng-disabled="!AdminConfigurationRegister.registerDetails.key"
-                            type="submit">Save
-                    </button>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/register_pro/register_pro.module.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/register_pro/register_pro.module.js
deleted file mode 100644
index d20a8d2..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/register_pro/register_pro.module.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import {AdminConfigurationRegisterController} from './register_pro.controller';
-
-function registerProConfig($stateProvider) {
-    $stateProvider
-            .state('admin.configuration.register_pro', {
-                params: {feature: 'register_pro'},
-                url: '/register_pro',
-                templateUrl: 'states/admin/configuration/register_pro/register_pro.html',
-                controller: 'AdminConfigurationRegisterController as AdminConfigurationRegister'
-            })
-}
-
-export default angular.module('configuration.register_pro', [])
-        .config(registerProConfig)
-        .controller('AdminConfigurationRegisterController', AdminConfigurationRegisterController);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/reverse_proxies/reverse_proxies.controller.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/reverse_proxies/reverse_proxies.controller.js
deleted file mode 100644
index 393a307..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/reverse_proxies/reverse_proxies.controller.js
+++ /dev/null
@@ -1,100 +0,0 @@
-export class AdminConfigurationReverseProxiesController {
-
-    constructor($scope, ReverseProxiesDao, ArtifactoryGridFactory, ArtifactoryModal, $q, uiGridConstants, commonGridColumns) {
-        this.gridOptions = {};
-        this.commonGridColumns = commonGridColumns;
-        this.uiGridConstants = uiGridConstants;
-        this.reverseProxiesDao = ReverseProxiesDao;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.modal = ArtifactoryModal;
-        this.$scope=$scope;
-        this.$q = $q;
-
-        this._createGrid();
-        this._initReverseProxies();
-    }
-
-    _initReverseProxies() {
-        this.reverseProxiesDao.get().$promise.then((reverseProxies)=> {
-            this.gridOptions.setGridData(reverseProxies)
-        });
-    }
-
-    _createGrid() {
-        this.gridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setColumns(this._getColumns())
-                .setMultiSelect()
-                .setButtons(this._getButtons())
-                .setBatchActions(this._getBatchActions())
-                .setRowTemplate('default');
-    }
-
-    deleteSelectedReverseProxies() {
-        let selectedRows = this.gridOptions.api.selection.getSelectedRows();
-        this.modal.confirm(`Are you sure you want to delete ${selectedRows.length} reverse proxies?`)
-            .then(() => {
-                    let keys = _.map(selectedRows, (row) => {return row.key;});
-                    this.reverseProxiesDao.delete({proxyKeys: keys}).$promise
-                            .then(()=>this._initReverseProxies());
-            })
-            .then(() => this._initReverseProxies());
-    }
-
-    deleteReverseProxy(key) {
-        this.modal.confirm(`Are you sure you want to delete the reverse proxy '${key}'?`)
-            .then(() => this._doDeleteReverseProxy(key))
-            .then(() => this._initReverseProxies());
-    }
-
-    _doDeleteReverseProxy(key) {
-        return this.reverseProxiesDao.delete({proxyKeys:[key]}).$promise;
-    }
-
-    _getColumns() {
-        return [
-            {
-                field: "key",
-                name: "Key",
-                displayName: "Key",
-                sort: {
-                    direction: this.uiGridConstants.ASC
-                },
-                cellTemplate: '<div class="ui-grid-cell-contents"><a ui-sref="^.reverse_proxies.edit({reverseProxyKey: row.entity.key})">{{ COL_FIELD }}</a></div>',
-                width: '30%'
-            },
-            {
-                field: "webServerType",
-                name: "Web Server Type",
-                displayName: "Web Server Type",
-                width: '20%'
-            },
-            {
-                field: "serverName",
-                name: "Server Name",
-                displayName: "Server Name",
-                width: '50%'
-            }
-        ]
-    }
-    _getBatchActions() {
-        return [
-            {
-                icon: 'clear',
-                name: 'Delete',
-                callback: () => this.deleteSelectedReverseProxies()
-            }
-        ]
-    }
-
-    _getButtons() {
-        return [
-            {
-                icon: 'icon icon-clear',
-                tooltip: 'Delete',
-                callback: row => this.deleteReverseProxy(row.key)
-            }
-
-        ];
-    }
-
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/reverse_proxies/reverse_proxies.html b/web/angular-web/src/main/webapp/app/states/admin/configuration/reverse_proxies/reverse_proxies.html
deleted file mode 100644
index bcd3b06..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/reverse_proxies/reverse_proxies.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<div class="content-layout-container">
-    <h1>Reverse Proxies Management</h1>
-
-    <div class="content-wrapper">
-        <div class="card stretch card-pole-pad card-side-pad">
-            <div class="pull-right admin-grid-buttons">
-                <a ui-sref="^.reverse_proxies.new">
-                    <i class="grid-button-icon icon icon-new"></i>New
-                </a>
-            </div>
-            <jf-grid grid-options="AdminConfigurationReverseProxies.gridOptions"
-                     filter-field="key"
-                     filter-on-change="true"
-                     object-name="reverse proxy/reverse proxies"
-                     auto-focus="true">
-            </jf-grid>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/reverse_proxies/reverse_proxies.module.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/reverse_proxies/reverse_proxies.module.js
deleted file mode 100644
index d22a24b..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/reverse_proxies/reverse_proxies.module.js
+++ /dev/null
@@ -1,40 +0,0 @@
-import {AdminConfigurationReverseProxiesController} from './reverse_proxies.controller';
-import {AdminConfigurationReverseProxyFormController} from './reverse_proxy_form.controller';
-
-function reverseProxiesConfig($stateProvider) {
-    $stateProvider
-/*
-            .state('admin.configuration.reverse_proxies', {
-                params: {feature: 'ReverseProxies'},
-                url: '/reverse_proxies',
-                templateUrl: 'states/admin/configuration/reverse_proxies/reverse_proxies.html',
-                controller: 'AdminConfigurationReverseProxiesController as AdminConfigurationReverseProxies'
-            })
-            .state('admin.configuration.reverse_proxies.new', {
-                params: {feature: 'ReverseProxies'},
-                parent: 'admin.configuration',
-                url: '/reverse_proxies/new',
-                templateUrl: 'states/admin/configuration/reverse_proxies/reverse_proxy_form.html',
-                controller: 'AdminConfigurationReverseProxyFormController as ReverseProxyForm'
-            })
-            .state('admin.configuration.reverse_proxies.edit', {
-                params: {feature: 'ReverseProxies'},
-                parent: 'admin.configuration',
-                url: '/reverse_proxies/:reverseProxyKey/edit',
-                templateUrl: 'states/admin/configuration/reverse_proxies/reverse_proxy_form.html',
-                controller: 'AdminConfigurationReverseProxyFormController as ReverseProxyForm'
-            })
-*/
-            .state('admin.configuration.reverse_proxy', {
-                params: {feature: 'ReverseProxies', reverseProxyKey: 'nginx'},
-                parent: 'admin.configuration',
-                url: '/reverse_proxy',
-                templateUrl: 'states/admin/configuration/reverse_proxies/reverse_proxy_form.html',
-                controller: 'AdminConfigurationReverseProxyFormController as ReverseProxyForm'
-            })
-}
-
-export default angular.module('configuration.reverse_proxies', [])
-        .config(reverseProxiesConfig)
-        .controller('AdminConfigurationReverseProxiesController', AdminConfigurationReverseProxiesController)
-        .controller('AdminConfigurationReverseProxyFormController', AdminConfigurationReverseProxyFormController);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/reverse_proxies/reverse_proxy_form.controller.js b/web/angular-web/src/main/webapp/app/states/admin/configuration/reverse_proxies/reverse_proxy_form.controller.js
deleted file mode 100644
index 1809f43..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/reverse_proxies/reverse_proxy_form.controller.js
+++ /dev/null
@@ -1,139 +0,0 @@
-import API from '../../../../constants/api.constants';
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-
-let $state, $stateParams, $timeout, ReverseProxiesDao, ArtifactoryModal, ArtifactoryModelSaver, ArtifactViewsDao, HaDao, artifactoryIFrameDownload;
-
-export class AdminConfigurationReverseProxyFormController {
-
-    constructor(_$state_, _$stateParams_, _$timeout_, _ReverseProxiesDao_, _ArtifactoryModal_,_ArtifactoryModelSaver_, _ArtifactViewsDao_,_HaDao_,_artifactoryIFrameDownload_) {
-        ReverseProxiesDao = _ReverseProxiesDao_;
-        $stateParams = _$stateParams_;
-        $state = _$state_;
-        $timeout = _$timeout_;
-        ArtifactoryModal = _ArtifactoryModal_;
-        ArtifactoryModelSaver = _ArtifactoryModelSaver_.createInstance(this,['reverseProxy']);
-        ArtifactViewsDao = _ArtifactViewsDao_;
-        HaDao = _HaDao_;
-        artifactoryIFrameDownload = _artifactoryIFrameDownload_;
-
-        this.selectizeConfig = {
-            sortField: 'text',
-            create: false,
-            maxItems: 1
-        };
-
-        this.webServerTypeOptions = [
-            {text: 'nginx', value: 'NGINX', icon: 'nginx'},
-            {text: 'apache', value: 'APACHE', icon: 'apache'}
-        ];
-        this.dockerReverseProxyMethodSelectizeOptions = [
-            {text: '', value: 'NOVALUE'},
-            {text: 'Port', value: 'PORTPERREPO'},
-            {text: 'Sub Domain', value: 'SUBDOMAIN'}
-        ];
-
-        this.formTitle = `Reverse Proxy Configuration Generator`;
-        this.TOOLTIP = TOOLTIP.admin.configuration.reverseProxy;
-
-        this._checkHaConfiguration();
-
-        this._initReverseProxy();
-    }
-
-    _checkHaConfiguration() {
-        HaDao.query().$promise.then((ha)=> {
-            this.haConfigured = ha.length > 0;
-        });
-    }
-
-    _initReverseProxy() {
-        ReverseProxiesDao.get({key: 'dummy'}).$promise
-            .then((reverseProxy) => {
-                    this.reverseProxy = reverseProxy;
-                    this.reverseProxy.key = 'nginx';
-                    this.reverseProxy.serverNameExpression = '*.'+(this.reverseProxy.serverName ? this.reverseProxy.serverName : '<SERVER_NAME>');
-
-                    this.reverseProxy.httpPort = this.reverseProxy.httpPort || 80;
-                    if (this.reverseProxy.publicAppContext === undefined) this.reverseProxy.publicAppContext = 'artifactory';
-//                    this.reverseProxy.artifactoryServerName = this.reverseProxy.artifactoryServerName || 'localhost';
-                    this.reverseProxy.artifactoryPort = this.reverseProxy.artifactoryPort || 8081;
-                    if (this.reverseProxy.artifactoryAppContext === undefined) this.reverseProxy.artifactoryAppContext = 'artifactory';
-                    if (!this.reverseProxy.useHttp && !this.reverseProxy.useHttps) this.reverseProxy.useHttp = true;
-                    this.reverseProxy.httpsPort = this.reverseProxy.httpsPort || 443;
-                    this.reverseProxy.upStreamName = this.reverseProxy.upStreamName || 'artifactory';
-
-                    this.reverseProxy.dockerReverseProxyMethod = this.reverseProxy.dockerReverseProxyMethod || 'NOVALUE';
-
-                    this.reverseProxy.webServerType = _.findWhere(this.webServerTypeOptions, {value: this.reverseProxy.webServerType});
-                    //this.reverseProxy.webServerType = this.webServerTypeOptions[0];
-
-                    ArtifactoryModelSaver.save();
-
-                    $timeout(()=>{
-                        this.gotData = true;
-                    });
-                });
-    }
-
-    onChangeServerName() {
-        this.reverseProxy.serverNameExpression = '*.'+(this.reverseProxy.serverName ? this.reverseProxy.serverName : '<SERVER_NAME>');
-    }
-
-    save() {
-
-
-        this.reverseProxy.publicAppContext = this.reverseProxy.publicAppContext.split('/').join('');
-        this.reverseProxy.artifactoryAppContext = this.reverseProxy.artifactoryAppContext.split('/').join('');
-
-        let payload = _.cloneDeep(this.reverseProxy);
-
-        payload.webServerType = payload.webServerType.value;
-        payload.key = payload.webServerType.toLowerCase();
-
-        if (payload.dockerReverseProxyMethod !== 'SUBDOMAIN') delete payload.serverNameExpression;
-
-        if (!payload.useHttps) {
-            delete payload.httpsPort;
-            delete payload.sslKey;
-            delete payload.sslCertificate;
-        }
-        if (!payload.useHttp) {
-            delete payload.httpPort;
-        }
-
-        let whenSaved = ReverseProxiesDao.save(payload);
-        whenSaved.$promise.then(() => {
-            ArtifactoryModelSaver.save();
-        });
-    }
-
-    viewSnippet() {
-        if (!this.canViewSnippet()) return;
-
-        ArtifactViewsDao.getDockerProxySnippet({},{repoKey: 'dummy'}).$promise.then((data)=>{
-            let message = "To use your reverse proxy configuration, copy the snippet below and place it in the sites-enabled folder and reload your reverse proxy server. This will affect Artifactory's reverse proxy configuration, and Docker repositories if you have any configured."
-            ArtifactoryModal.launchCodeModal("Reverse Proxy Configuration Snippet", data.template,{name:'text'},message,"Snippet");
-        });
-    }
-    downloadSnippet() {
-        if (!this.canViewSnippet()) return;
-        artifactoryIFrameDownload(`${API.API_URL}/views/dockerproxy/dummy?download=true`);
-    }
-    canViewSnippet() {
-        return ArtifactoryModelSaver.isModelSaved() && this.reverseProxyEditForm.$valid;
-    }
-
-    reset() {
-        ArtifactoryModelSaver.ask().then(()=>{
-            this._initReverseProxy();
-        });
-
-        //        this._end();
-    }
-
-/*
-    _end() {
-        $state.go('^.reverse_proxies');
-    }
-*/
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/configuration/reverse_proxies/reverse_proxy_form.html b/web/angular-web/src/main/webapp/app/states/admin/configuration/reverse_proxies/reverse_proxy_form.html
deleted file mode 100644
index cdb6717..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/configuration/reverse_proxies/reverse_proxy_form.html
+++ /dev/null
@@ -1,307 +0,0 @@
-<div class="content-layout-container">
-    <h1>{{ ReverseProxyForm.formTitle }}</h1>
-
-    <div class="content-wrapper">
-        <form novalidate name="ReverseProxyForm.reverseProxyEditForm" ng-submit="ReverseProxyForm.save()">
-            <div class="card stretch card-pole-pad card-side-pad">
-                <div class="content-with-footer">
-                    <jf-panel jf-panel-heading="Reverse Proxy Settings">
-                        <div class="form-group no-margin-bottom pull-left"
-                             ng-if="ReverseProxyForm.gotData && !ReverseProxyForm.canViewSnippet()">
-                            <div class="form-group-cell double">
-                                <div class="alert alert-warning">
-                                    Please save your changes. You can then view or download the configuration snippet and install it in the corresponding location on your reverse proxy server.
-                                </div>
-                            </div>
-                        </div>
-
-                        <div class="pull-right admin-grid-buttons">
-                            <a ng-disabled="!ReverseProxyForm.canViewSnippet()"
-                               ng-click="ReverseProxyForm.viewSnippet()"
-                               jf-tooltip="View Reverse Proxy Configuration Snippet">
-                                <i class="grid-button-icon icon icon-view"></i>View
-                            </a>
-                            <a ng-disabled="!ReverseProxyForm.canViewSnippet()"
-                               ng-click="ReverseProxyForm.downloadSnippet()"
-                               jf-tooltip="Download Reverse Proxy Configuration Snippet">
-                                <i class="grid-button-icon icon icon-download"></i>Download
-                            </a>
-                        </div>
-
-                        <div class="clearfix"
-                             ng-if="!ReverseProxyForm.canViewSnippet()"></div>
-
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field>
-                                    <label class="mandatory">Server Provider</label>
-                                    <ui-select jf-disable-ng-animate ng-model="ReverseProxyForm.reverseProxy.webServerType">
-                                        <ui-select-match placeholder="Select Type...">
-                                            <i class="icon-reverse icon-reverse-{{$select.selected.text}}"></i>{{$select.selected.text}}
-                                        </ui-select-match>
-                                        <ui-select-choices repeat="serverType in ReverseProxyForm.webServerTypeOptions | filter: $select.search track by $index">
-                                            <i ng-if="serverType.icon" class="icon-reverse icon-reverse-{{serverType.text}}"></i>
-                                            <span ng-bind-html="serverType.text | highlight: $select.search"></span>
-                                        </ui-select-choices>
-                                    </ui-select>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="common">
-                                    <label for="artifactoryServerName" class="mandatory">Internal Hostname</label>
-                                    <jf-help-tooltip html="ReverseProxyForm.TOOLTIP.artifactoryServerName"></jf-help-tooltip>
-                                    <input type="text"
-                                           placeholder="Artifactory IP or hostname"
-                                           name="artifactoryServerName"
-                                           class="input-text"
-                                           id="artifactoryServerName"
-                                           required
-                                           ng-model="ReverseProxyForm.reverseProxy.artifactoryServerName"/>
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell">
-                                <jf-field validations="common">
-                                    <label for="artifactoryPort" class="mandatory">Internal Port</label>
-                                    <input type="number"
-                                           name="artifactoryPort"
-                                           class="input-text"
-                                           id="artifactoryPort"
-                                           min="1"
-                                           max="65535"
-                                           required
-                                           ng-model="ReverseProxyForm.reverseProxy.artifactoryPort"/>
-                                </jf-field>
-                            </div>
-                        </div>
-
-                        <div class="form-group no-margin-bottom">
-                            <div class="form-group-cell">
-                                <jf-field validations="common">
-                                    <label for="artifactoryAppContext">Internal Context Path</label>
-                                    <jf-help-tooltip html="ReverseProxyForm.TOOLTIP.artifactoryAppContext"></jf-help-tooltip>
-                                    <input type="text"
-                                           name="artifactoryAppContext"
-                                           class="input-text"
-                                           id="artifactoryAppContext"
-                                           ng-model="ReverseProxyForm.reverseProxy.artifactoryAppContext"/>
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell" ng-if="ReverseProxyForm.haConfigured">
-                                <jf-field validations="common">
-                                    <label for="upStreamName" class="mandatory">Upstream Name</label>
-                                    <input type="text"
-                                           name="upStreamName"
-                                           class="input-text"
-                                           id="upStreamName"
-                                           required
-                                           ng-model="ReverseProxyForm.reverseProxy.upStreamName"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group margin-top-10">
-                            <div class="form-group-cell double">
-                                <div class="stripped alert alert-info">
-                                    Internal Artifactory URL:
-                                    <b>{{ReverseProxyForm.reverseProxy.artifactoryServerName || '&ltSERVER_NAME&gt'}}:{{ReverseProxyForm.reverseProxy.artifactoryPort || '&ltPORT&gt'}}/{{ReverseProxyForm.reverseProxy.artifactoryAppContext || ''}}</b>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="common">
-                                    <label for="serverName" class="mandatory">Public Server Name</label>
-                                    <jf-help-tooltip html="ReverseProxyForm.TOOLTIP.serverName"></jf-help-tooltip>
-                                    <input type="text"
-                                           name="serverName"
-                                           class="input-text"
-                                           id="serverName"
-                                           required
-                                           placeholder="e.g. myserver.org"
-                                           ng-change="ReverseProxyForm.onChangeServerName()"
-                                           ng-model="ReverseProxyForm.reverseProxy.serverName"/>
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell">
-                                <jf-field validations="common">
-                                    <label for="publicAppContext">Public Context Path</label>
-                                    <jf-help-tooltip html="ReverseProxyForm.TOOLTIP.publicAppContext"></jf-help-tooltip>
-                                    <input type="text"
-                                           name="publicAppContext"
-                                           class="input-text"
-                                           id="publicAppContext"
-                                           ng-model="ReverseProxyForm.reverseProxy.publicAppContext"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group form-checkbox">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Use HTTP">
-                                    <input type="checkbox"
-                                           ng-disabled="!ReverseProxyForm.reverseProxy.useHttps"
-                                           id="useHttp"
-                                           name="useHttp"
-                                           ng-model="ReverseProxyForm.reverseProxy.useHttp">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell" ng-if="ReverseProxyForm.reverseProxy.useHttp">
-                                <jf-field validations="common">
-                                    <label for="httpPort" class="mandatory">HTTP Port</label>
-                                    <input type="number"
-                                           class="input-text"
-                                           required
-                                           id="httpPort"
-                                           name="httpPort"
-                                           min="1"
-                                           max="65535"
-                                           ng-model="ReverseProxyForm.reverseProxy.httpPort">
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group form-checkbox" ng-class="{'no-margin-bottom' : !ReverseProxyForm.reverseProxy.useHttps}">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Use HTTPS">
-                                    <input type="checkbox"
-                                           ng-disabled="!ReverseProxyForm.reverseProxy.useHttp"
-                                           id="useHttps"
-                                           name="useHttps"
-                                           ng-model="ReverseProxyForm.reverseProxy.useHttps">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                        <div ng-if="ReverseProxyForm.reverseProxy.useHttps">
-                            <div class="form-group">
-                                <div class="form-group-cell">
-                                    <jf-field validations="common">
-                                        <label for="sslPort" class="mandatory">HTTPS Port</label>
-                                        <input type="number"
-                                               class="input-text"
-                                               required
-                                               id="sslPort"
-                                               name="sslPort"
-                                               min="1"
-                                               max="65535"
-                                               ng-model="ReverseProxyForm.reverseProxy.httpsPort">
-                                    </jf-field>
-                                </div>
-                            </div>
-                            <div class="form-group no-margin-bottom">
-                                <div class="form-group-cell">
-                                    <jf-field validations="common">
-                                        <label for="sslKey" class="mandatory">SSL Key Path</label>
-                                        <jf-help-tooltip html="ReverseProxyForm.TOOLTIP.sslKey"></jf-help-tooltip>
-                                        <input type="text"
-                                               placeholder="e.g. /etc/ssl/private/myserver.key"
-                                               name="sslKey"
-                                               class="input-text"
-                                               id="sslKey"
-                                               required
-                                               ng-model="ReverseProxyForm.reverseProxy.sslKey"/>
-                                    </jf-field>
-                                </div>
-                                <div class="form-group-cell">
-                                    <jf-field validations="common">
-                                        <label for="sslCertificate" class="mandatory">SSL Certificate Path</label>
-                                        <jf-help-tooltip html="ReverseProxyForm.TOOLTIP.sslCertificate"></jf-help-tooltip>
-                                        <input type="text"
-                                               placeholder="e.g. /etc/ssl/certs/myserver.crt"
-                                               name="sslCertificate"
-                                               class="input-text"
-                                               id="sslCertificate"
-                                               required
-                                               ng-model="ReverseProxyForm.reverseProxy.sslCertificate"/>
-                                    </jf-field>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="form-group margin-top-10">
-                            <div class="form-group-cell double">
-                                <div class="stripped alert alert-info">
-                                    Users will have access to Artifactory at the following URL(s): <br ng-if="ReverseProxyForm.reverseProxy.useHttp && ReverseProxyForm.reverseProxy.useHttps" />
-                                    <span ng-if="!(ReverseProxyForm.reverseProxy.useHttp && ReverseProxyForm.reverseProxy.useHttps)">
-                                        <span ng-if="ReverseProxyForm.reverseProxy.useHttp"><b>http://{{ReverseProxyForm.reverseProxy.serverName || '&ltSERVER_NAME&gt'}}:{{ReverseProxyForm.reverseProxy.httpPort || '&ltPORT&gt'}}/{{ReverseProxyForm.reverseProxy.publicAppContext || ''}}</b></span><br ng-if="ReverseProxyForm.reverseProxy.useHttp && ReverseProxyForm.reverseProxy.useHttps" />
-                                        <span ng-if="ReverseProxyForm.reverseProxy.useHttps"><b>https://{{ReverseProxyForm.reverseProxy.serverName || '&ltSERVER_NAME&gt'}}:{{ReverseProxyForm.reverseProxy.httpsPort || '&ltPORT&gt'}}/{{ReverseProxyForm.reverseProxy.publicAppContext || ''}}</b></span>
-                                    </span>
-                                    <ul ng-if="ReverseProxyForm.reverseProxy.useHttp && ReverseProxyForm.reverseProxy.useHttps">
-                                        <li><b>http://{{ReverseProxyForm.reverseProxy.serverName || '&ltSERVER_NAME&gt'}}:{{ReverseProxyForm.reverseProxy.httpPort || '&ltPORT&gt'}}/{{ReverseProxyForm.reverseProxy.publicAppContext || ''}}</b></li>
-                                        <li><b>https://{{ReverseProxyForm.reverseProxy.serverName || '&ltSERVER_NAME&gt'}}:{{ReverseProxyForm.reverseProxy.httpsPort || '&ltPORT&gt'}}/{{ReverseProxyForm.reverseProxy.publicAppContext || ''}}</b></li>
-                                    </ul>
-                                </div>
-                            </div>
-                        </div>
-                    </jf-panel>
-                    <jf-panel jf-panel-heading="Docker Reverse Proxy Settings">
-                        <div class="form-group" ng-if="!ReverseProxyForm.reverseProxy.useHttps">
-                            <div class="form-group-cell double">
-                                <div class="stripped alert alert-warning">
-                                    Not using HTTPS requires Docker clients to add an --insecure-registry flag to <b>DOCKER_OPTS</b>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="form-group no-margin-bottom">
-                            <div class="form-group-cell">
-                                <jf-field>
-                                    <label>Reverse Proxy Method</label>
-                                    <selectize config='ReverseProxyForm.selectizeConfig'
-                                               options='ReverseProxyForm.dockerReverseProxyMethodSelectizeOptions'
-                                               ng-model='ReverseProxyForm.reverseProxy.dockerReverseProxyMethod'>
-                                    </selectize>
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell" ng-if="ReverseProxyForm.reverseProxy.dockerReverseProxyMethod === 'SUBDOMAIN'">
-                                <jf-field validations="common">
-                                    <label for="serverNameExpression">Server Name Expression</label>
-                                    <input type="text"
-                                           name="serverNameExpression"
-                                           class="input-text"
-                                           id="serverNameExpression"
-                                           disabled
-                                           ng-model="ReverseProxyForm.reverseProxy.serverNameExpression"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group margin-top-10"
-                             ng-if="ReverseProxyForm.reverseProxy.dockerReverseProxyMethod !== 'NOVALUE'">
-                            <div class="form-group-cell double">
-                                <div class="stripped alert alert-info"
-                                     ng-if="ReverseProxyForm.reverseProxy.dockerReverseProxyMethod === 'PORTPERREPO'">
-                                    When using Port as the Reverse Proxy Method, each Docker repository should be bound to a specific port. You can configure the port binding for each Docker repository in the Advanced tab of the Docker repository configuration. Once you configure the ports you can view and download the snippet.<br>
-                                    Example of docker push or pull command:<br>
-                                    <b>docker pull / push {{ReverseProxyForm.reverseProxy.serverName || '&ltSERVER_NAME&gt'}}:<REPOSITORY_PORT>/<IMAGE>:<TAG></b>
-                                </div>
-                                <div class="stripped alert alert-info"
-                                     ng-if="ReverseProxyForm.reverseProxy.dockerReverseProxyMethod === 'SUBDOMAIN'">
-                                    When using Sub Domain method, each Docker repository key will be used as the sub domain. This option requires a wildcard certificate.<br>
-                                    Example of docker push or pull command:<br>
-                                    <b>docker pull / push <REPOSITORY_KEY>.{{ReverseProxyForm.reverseProxy.serverName || '&ltSERVER_NAME&gt'}}/<IMAGE>:<TAG></b>
-                                </div>
-                            </div>
-                        </div>
-                        <div ng-if="ReverseProxyForm.reverseProxy.dockerReverseProxyMethod === 'NOVALUE'">
-                            <br><br><br><br><br>
-                        </div>
-                    </jf-panel>
-                </div>
-            </div>
-            <div class="content-footer">
-                <div class="pull-right">
-                    <button
-                            type="button"
-                            class="btn btn-default"
-                            ng-click="ReverseProxyForm.reset()">
-                        Reset
-                    </button>
-                    <button
-                            type="submit"
-                            class="btn btn-primary"
-                            ng-disabled="!ReverseProxyForm.reverseProxy.webServerType || !ReverseProxyForm.reverseProxyEditForm.$valid">Save
-                    </button>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
-
diff --git a/web/angular-web/src/main/webapp/app/states/admin/dashboard/dashboard.html b/web/angular-web/src/main/webapp/app/states/admin/dashboard/dashboard.html
deleted file mode 100644
index 088dbda..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/dashboard/dashboard.html
+++ /dev/null
@@ -1 +0,0 @@
-<h1>Dashboard</h1>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/dashboard/dashboard.module.js b/web/angular-web/src/main/webapp/app/states/admin/dashboard/dashboard.module.js
deleted file mode 100644
index b335b08..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/dashboard/dashboard.module.js
+++ /dev/null
@@ -1,10 +0,0 @@
-function dashboardConfig($stateProvider) {
-    $stateProvider
-            .state('admin.dashboard', {
-                url: '/dashboard',
-                templateUrl: 'states/admin/dashboard/dashboard.html'
-            })
-}
-
-export default angular.module('admin.dashboard', [])
-        .config(dashboardConfig)
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/import_export/import_export.controller.js b/web/angular-web/src/main/webapp/app/states/admin/import_export/import_export.controller.js
deleted file mode 100644
index 239c63f..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/import_export/import_export.controller.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export class AdminImportExportController {
-  constructor () {
-    var AdminImportExport = this;
-    AdminImportExport.stateUrl = '/import_export';
-    AdminImportExport.controllerName = 'AdminImportExportController'
-  }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/import_export/import_export.module.js b/web/angular-web/src/main/webapp/app/states/admin/import_export/import_export.module.js
deleted file mode 100644
index 35ee46e..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/import_export/import_export.module.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import Repositories from './repositories/repositories.module';
-import System from './system/system.module';
-
-import {AdminImportExportController} from './import_export.controller';
-
-function importExportConfig($stateProvider) {
-    $stateProvider
-            .state('admin.import_export', {
-                url: '/import_export',
-                template: '<ui-view></ui-view>',
-                controller: 'AdminImportExportController as AdminImportExport'
-            })
-}
-
-export default angular.module('admin.import_export', [
-    Repositories.name,
-    System.name
-])
-        .config(importExportConfig)
-        .controller('AdminImportExportController', AdminImportExportController);
-
diff --git a/web/angular-web/src/main/webapp/app/states/admin/import_export/repositories/repositories.controller.js b/web/angular-web/src/main/webapp/app/states/admin/import_export/repositories/repositories.controller.js
deleted file mode 100644
index 010000d..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/import_export/repositories/repositories.controller.js
+++ /dev/null
@@ -1,160 +0,0 @@
-import EVENTS from "../../../../constants/common_events.constants";
-import API from "../../../../constants/api.constants";
-import TOOLTIP from "../../../../constants/artifact_tooltip.constant";
-
-export class ImportExportRepositoriesController {
-    constructor(BrowseFilesDao, ExportDao, ImportDao, ArtifactoryNotifications, FileUploader, RepoDataDao, ArtifactoryEventBus) {
-        this.repoDataDao = RepoDataDao;
-        this.browseFilesDao = BrowseFilesDao.getInstance();
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.FileUploader = FileUploader;
-
-        this.exportDao = ExportDao;
-        this.importDao = ImportDao;
-        this.TOOLTIP = TOOLTIP.admin.import_export.repositories;
-
-
-        this.exportFileBrowserOptions = {
-            canSelectFiles: false,
-            selectionLabel: 'Directory To Export',
-            pathLabel: 'Path to export',
-            confirmButtonLabel: 'Select',
-            showSelectedItem: true,
-            enableSelectedItem: true
-        };
-        this.importFileBrowserOptions = {
-            canSelectFiles: false,
-            selectionLabel: 'Directory To Import',
-            pathLabel: 'Path to import',
-            confirmButtonLabel: 'Select',
-            showSelectedItem: true,
-            enableSelectedItem: false
-        };
-
-
-
-        this.uploadZip = {};
-        this.uploadSuccess = false;
-        this.exportOptions = {
-            action: 'repository',
-            repository: 'All Repositories',
-            path: '',
-            excludeMetadata: false,
-            m2: false,
-            verbose: false
-        };
-        this.importOptions = {
-            action: 'repository',
-            repository: 'All Repositories',
-            path: '',
-            excludeMetadata: false,
-            verbose: false
-        };
-        this.zipOptions = {
-            action: 'repository',
-            repository: 'All Repositories',
-            path: '',
-            verbose: false
-        };
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this._initImportExportRepo();
-
-    }
-
-    _getRootPath() {
-        this.browseFilesDao.query({path: '/'}).$promise.then((result)=> {
-            if (result) {
-                this.rootPath = result.roots[0] || '/';
-                this.roots = result.roots;
-            }
-        });
-    }
-
-    _initImportExportRepo() {
-        this.uploader = new this.FileUploader();
-        this.uploader.url = `${API.API_URL}/artifactimport/upload`;
-        this.uploader.onSuccessItem = this.onUploadSuccess.bind(this);
-        this.uploader.onErrorItem = this.onUploadError.bind(this);
-        this.uploader.onAfterAddingFile = this.onAddingfile.bind(this);
-
-        this.uploader.removeAfterUpload = true;
-        this.repoDataDao.getForBackup().$promise.then((result)=> {
-            this.reposList = _.sortBy(result.repoList,(repo) => repo);
-            this.reposList.unshift('All Repositories');
-        });
-
-        this._getRootPath();
-    }
-
-    onUploadError(fileDetails, response) {
-        this.artifactoryNotifications.create(response);
-    }
-
-    onUploadSuccess(fileDetails, response) {
-        this.uploadSuccess = true;
-        this.zipOptions.path = response.path;
-    }
-
-    onAddingfile(fileItem) {
-        if (fileItem.file.size < 0) {
-            fileItem.okToUploadFile = false;
-            this.uploader.removeFromQueue(fileItem);
-        }
-        else {
-            fileItem.okToUploadFile = true;
-        }
-    }
-
-    updateExportFolderPath(directory) {
-        this.exportOptions.path = directory;
-    }
-
-    updateImportFolderPath(directory) {
-        this.importOptions.path = directory;
-    }
-
-    clearValidations() {
-        this.artifactoryEventBus.dispatch(EVENTS.FORM_CLEAR_FIELD_VALIDATION, true);
-    }
-
-    export(form) {
-        let self = this;
-        if (form.$valid) {
-            let ok = false;
-            for (let i in this.roots) {
-                let root = this.roots[i];
-                if (_.startsWith(this.exportOptions.path.toUpperCase(), root)) {
-                    ok = true;
-                    break;
-                }
-            }
-            if (!ok) {
-                this.exportOptions.path = this.defaultRoot + this.exportOptions.path;
-            }
-            this.exportDao.save(this.exportOptions);
-        }
-    }
-
-
-    import(form) {
-        if (form.$valid) {
-            this.importDao.save(this.importOptions);
-        }
-    }
-
-    importUploadZip() {
-        let importDetails = {
-            path: this.zipOptions.path,
-            verbose: this.zipOptions.verbose,
-            repository: this.zipOptions.repository,
-            zip: true
-        };
-        this.importDao.save({action: 'repository'}, importDetails).$promise
-            .finally(() => this.uploadSuccess = false);
-    }
-
-    upload() {
-        if (this.uploader.queue[0]) this.uploader.queue[0].upload();
-    }
-
-}
diff --git a/web/angular-web/src/main/webapp/app/states/admin/import_export/repositories/repositories.html b/web/angular-web/src/main/webapp/app/states/admin/import_export/repositories/repositories.html
deleted file mode 100644
index 2c20ed9..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/import_export/repositories/repositories.html
+++ /dev/null
@@ -1,189 +0,0 @@
-<div class="content-layout-container">
-    <h1>{{ 'Repositories Import & Export' | replaceStringForAol }}</h1>
-
-    <div class="content-wrapper">
-        <div class="card stretch card-pole-pad card-side-pad">
-            <form class="form" name="exportForm" novalidate>
-                <jf-panel jf-hide-for-aol jf-panel-heading="Export Repository to Path">
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <label class="label-wight">Target Local Repository*</label>
-                            <jf-ui-select jf-select-model="Repositories.exportOptions.repository"
-                                          jf-select-options="Repositories.reposList"></jf-ui-select>
-                        </div>
-                    </div>
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-field validations="common" autofocus="true">
-                                <label for="export-path">Export Path on Server*</label>
-                                <input type="text"
-                                       class="input-text"
-                                       required
-                                       id="export-path"
-                                       name="path"
-                                       ng-model="Repositories.exportOptions.path"
-                                       ng-focus="Repositories.clearValidations()"/>
-                            </jf-field>
-                        </div>
-                        <div class="form-group-cell form-button">
-                            <jf-browse-files browser-resource="Repositories.browseFilesDao"
-                                             uploader="Repositories.uploader"
-                                             start-folder="Repositories.exportOptions.path"
-                                             browser-update-folder="Repositories.updateExportFolderPath(directory)"
-                                             browser-options="Repositories.exportFileBrowserOptions">
-                            </jf-browse-files>
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Exclude Metadata">
-                                <input type="checkbox"
-                                       id="exportExcludeMetadata"
-                                       ng-model="Repositories.exportOptions.excludeMetadata"
-                                       name="excludeMetadata">
-                            </jf-checkbox>
-
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Create .m2 Compatible Export">
-                                <input type="checkbox"
-                                       id="exportCreateM2CompatibleExport"
-                                       ng-model="Repositories.exportOptions.m2"
-                                       name="createM2CompatibleExport">
-                            </jf-checkbox>
-                            <jf-help-tooltip html="Repositories.TOOLTIP.createM2CompatibleExport"></jf-help-tooltip>
-
-                        </div>
-                    </div>
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Output Verbose Log">
-                                <input
-                                        type="checkbox"
-                                        id="exportOutputVerboseLog"
-                                        ng-model="Repositories.exportOptions.verbose"
-                                        name="outputVerboseLog">
-                            </jf-checkbox>
-                            <jf-help-tooltip html="Repositories.TOOLTIP.outputVerboseLog"></jf-help-tooltip>
-
-                        </div>
-                    </div>
-                    <div class="pull-right admin-actions">
-                        <button type="button" class="btn btn-primary"
-                                ng-disabled="!Repositories.exportOptions.path"
-                                ng-click="Repositories.export(exportForm)">
-                            Export
-                        </button>
-                    </div>
-                </jf-panel>
-            </form>
-
-            <form class="form margin-top-20" name="importForm" novalidate>
-                <jf-panel jf-hide-for-aol jf-panel-heading="Import Repository from Path">
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <label class="label-wight">Target Local Repository*</label>
-                            <jf-ui-select jf-select-model="Repositories.importOptions.repository"
-                                          jf-select-options="Repositories.reposList"></jf-ui-select>
-
-                        </div>
-                    </div>
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-field validations="common">
-                                <label for="import-path">Import Path on Server*</label>
-                                <input type="text"
-                                       class="input-text"
-                                       required
-                                       id="import-path"
-                                       name="path"
-                                       ng-model="Repositories.importOptions.path"
-                                       ng-focus="Repositories.clearValidations()"/>
-                            </jf-field>
-                        </div>
-                        <div class="form-group-cell form-button">
-                            <jf-browse-files browser-resource="Repositories.browseFilesDao"
-                                             browser-update-folder="Repositories.updateImportFolderPath(directory)"
-                                             start-folder="Repositories.importOptions.path"
-                                             browser-options="Repositories.importFileBrowserOptions">
-                            </jf-browse-files>
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Exclude Metadata">
-                                <input type="checkbox"
-                                       id="importExcludeMetadata"
-                                       ng-model="Repositories.importOptions.excludeMetadata"
-                                       name="excludeMetadata">
-                            </jf-checkbox>
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Output Verbose Log">
-                                <input
-                                        type="checkbox"
-                                        id="importOutputVerboseLog"
-                                        ng-model="Repositories.importOptions.verbose"
-                                        name="outputVerboseLog">
-                            </jf-checkbox>
-                            <jf-help-tooltip html="Repositories.TOOLTIP.outputVerboseLog"></jf-help-tooltip>
-                        </div>
-                    </div>
-                    <div class="pull-right admin-actions">
-                        <button type="button" class="btn btn-primary"
-                                ng-disabled="!Repositories.importOptions.path"
-                                ng-click="Repositories.import(importForm)">
-                            Import
-                        </button>
-                    </div>
-                </jf-panel>
-            </form>
-            <form class="form margin-top-20" name="zipForm">
-                <jf-panel jf-panel-heading="Import Repository from Zip">
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <label class="label-wight">Target Local Repository*</label>
-                            <jf-help-tooltip html="Repositories.TOOLTIP.repositoryZipFile"></jf-help-tooltip>
-                            <jf-ui-select jf-select-model="Repositories.zipOptions.repository"
-                                          jf-select-options="Repositories.reposList"></jf-ui-select>
-                        </div>
-                    </div>
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <label class="label-wight">Repository Zip File</label>
-                            <jf-file-drop jf-file-uploader="Repositories.uploader" show-progress-bar="true"></jf-file-drop>
-                        </div>
-                        <div class="form-group-cell form-button">
-                            <button type="button" class="btn btn-secondary"
-                                    ng-click="Repositories.upload()" ng-disabled="!Repositories.uploader.queue[0] || Repositories.uploader.queue[0].progress">
-                                Upload
-                            </button>
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Output Verbose Log">
-                                <input type="checkbox"
-                                       id="zipOptionOutputVerboseLog"
-                                       ng-model="Repositories.zipOptions.verbose"
-                                       name="outputVerboseLog">
-                            </jf-checkbox>
-                            <jf-help-tooltip html="Repositories.TOOLTIP.outputVerboseLog"></jf-help-tooltip>
-                        </div>
-                    </div>
-                    <div class="pull-right admin-actions">
-                        <button type="button" class="btn btn-primary"
-                                ng-disabled="!Repositories.uploadSuccess || Repositories.uploader.queue[0]"
-                                ng-click="Repositories.importUploadZip()">
-                            Import
-                        </button>
-                    </div>
-                </jf-panel>
-            </form>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/import_export/repositories/repositories.module.js b/web/angular-web/src/main/webapp/app/states/admin/import_export/repositories/repositories.module.js
deleted file mode 100644
index e74f987..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/import_export/repositories/repositories.module.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import {ImportExportRepositoriesController} from './repositories.controller';
-
-
-function repositoriesConfig($stateProvider) {
-    $stateProvider
-            .state('admin.import_export.repositories', {
-                params: {feature: 'repositories'},
-                url: '/repositories',
-                templateUrl: 'states/admin/import_export/repositories/repositories.html',
-                controller: 'ImportExportRepositoriesController as Repositories'
-            })
-}
-
-export default angular.module('import_export.repositories', [])
-        .config(repositoriesConfig)
-        .controller('ImportExportRepositoriesController', ImportExportRepositoriesController)
-
diff --git a/web/angular-web/src/main/webapp/app/states/admin/import_export/system/system.controller.js b/web/angular-web/src/main/webapp/app/states/admin/import_export/system/system.controller.js
deleted file mode 100644
index 0e7c187..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/import_export/system/system.controller.js
+++ /dev/null
@@ -1,110 +0,0 @@
-import EVENTS from '../../../../constants/common_events.constants';
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-
-export class AdminImportExportSystemController {
-    constructor(BrowseFilesDao, ExportDao, ImportDao, ArtifactoryNotifications, ArtifactoryModal, ArtifactoryEventBus) {
-        this.browseFilesDao = BrowseFilesDao.getInstance();
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.systemExportDao = ExportDao;
-        this.systemImportDao = ImportDao;
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this.modal = ArtifactoryModal;
-        this.TOOLTIP = TOOLTIP.admin.import_export.system;
-
-        this.exportFileBrowserOptions = {
-            canSelectFiles: false,
-            selectionLabel: 'Directory To Export',
-            pathLabel: 'Path to export',
-            confirmButtonLabel: 'Select',
-            showSelectedItem: true,
-            enableSelectedItem: true
-        };
-        this.importFileBrowserOptions = {
-            canSelectFiles: true,
-            selectionLabel: 'Directory Or Zip File To Import',
-            pathLabel: 'Path to import',
-            confirmButtonLabel: 'Select',
-            showSelectedItem: true,
-            enableSelectedItem: false
-        };
-
-
-        this.exportOptions = {
-            path: '',
-            excludeContent: false,
-            excludeMetadata: false,
-            excludeBuilds: false,
-            m2: false,
-            createArchive: false,
-            verbose: false
-        };
-
-        this.importOptions = {
-            path: '',
-            excludeContent: false,
-            excludeMetadata: false,
-            verbose: false
-        };
-
-        this._getRootPath();
-    }
-
-    _getRootPath() {
-        this.browseFilesDao.query({path: '/'}).$promise.then((result) => {
-            if (result) {
-                this.defaultRootPath = result.roots[0] || '/';
-                this.roots = result.roots;
-            }
-        });
-    }
-
-    clearValidations() {
-        this.artifactoryEventBus.dispatch(EVENTS.FORM_CLEAR_FIELD_VALIDATION, true);
-    }
-
-    updateImportFolderPath(directory) {
-        this.importOptions.path = directory;
-    }
-
-    updateExportFolderPath(directory) {
-        this.exportOptions.path = directory;
-    }
-
-    import() {
-        if (this.importForm.$valid) {
-            this.confirmImport();
-        }
-    }
-
-    doImport() {
-        this.importOptions.zip = _.endsWith(this.importOptions.path, '.zip');
-        this.importOptions.action = "system";
-        this.systemImportDao.save(this.importOptions);
-    }
-
-    export() {
-        if (this.exportForm.$valid) {
-            let ok = false;
-            for (let i in this.roots) {
-                let root = this.roots[i];
-                if (_.startsWith(this.exportOptions.path.toUpperCase(), root)) {
-                    ok = true;
-                    break;
-                }
-            }
-            if (!ok) {
-                this.exportOptions.path = this.defaultRootPath + this.exportOptions.path;
-            }
-            this.exportOptions.action = "system";
-            this.systemExportDao.save(this.exportOptions).$promise.then((res)=>{
-                if (res.status = 200) this.exportOptions.path = '';
-            });
-        }
-    }
-
-    confirmImport() {
-        this.modal.confirm('Full system import deletes all existing Artifactory content. <br /> Are you sure you want to continue?')
-                .then(() => this.doImport());
-    }
-
-}
diff --git a/web/angular-web/src/main/webapp/app/states/admin/import_export/system/system.html b/web/angular-web/src/main/webapp/app/states/admin/import_export/system/system.html
deleted file mode 100644
index 3ab5b95..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/import_export/system/system.html
+++ /dev/null
@@ -1,176 +0,0 @@
-<div class="content-layout-container">
-    <h1>System Import & Export</h1>
-
-    <div class="content-wrapper">
-        <div class="card stretch card-pole-pad card-side-pad">
-            <form class="form" name="SystemController.exportForm" novalidate>
-                <jf-panel jf-panel-heading="Export System">
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-field validations="common" autofocus="true">
-                                <label for="export-path">Export Path on Server*</label>
-                                <input type="text"
-                                       class="input-text"
-                                       required
-                                       id="export-path"
-                                       name="path"
-                                       ng-model="SystemController.exportOptions.path"
-                                       ng-focus="SystemController.clearValidations()"/>
-                            </jf-field>
-                        </div>
-                        <div class="form-group-cell form-button">
-                            <jf-browse-files browser-resource="SystemController.browseFilesDao"
-                                             browser-update-folder="SystemController.updateExportFolderPath(directory)"
-                                             start-folder="SystemController.exportOptions.path"
-                                             browser-options="SystemController.exportFileBrowserOptions">
-                            </jf-browse-files>
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Exclude Content">
-                                <input type="checkbox"
-                                       id="exportExcludeContent"
-                                       ng-model="SystemController.exportOptions.excludeContent"
-                                       name="excludeContent">
-                            </jf-checkbox>
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Exclude Metadata">
-                                <input type="checkbox"
-                                       id="exportExcludeMetadata"
-                                       ng-model="SystemController.exportOptions.excludeMetadata"
-                                       name="excludeMetadata">
-                            </jf-checkbox>
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Exclude Builds">
-                                <input type="checkbox"
-                                       id="exportExcludeBuilds"
-                                       ng-model="SystemController.exportOptions.excludeBuilds"
-                                       name="createZipArchive">
-                            </jf-checkbox>
-
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Create .m2 Compatible Export">
-                                <input type="checkbox"
-                                       id="exportCreateM2CompatibleExport"
-                                       ng-model="SystemController.exportOptions.m2"
-                                       name="createM2CompatibleExport">
-                            </jf-checkbox>
-                            <jf-help-tooltip html="SystemController.TOOLTIP.createM2CompatibleExport"></jf-help-tooltip>
-
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Create a Zip Archive (Slow and CPU Intensive!)">
-                                <input
-                                        type="checkbox"
-                                        id="exportCreateZipArchive"
-                                        ng-model="SystemController.exportOptions.createArchive">
-                            </jf-checkbox>
-                        </div>
-                    </div>
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Output Verbose Log">
-                                <input
-                                        type="checkbox"
-                                        id="exportOutputVerboseLog"
-                                        ng-model="SystemController.exportOptions.verbose"
-                                        name="outputVerboseLog">
-                            </jf-checkbox>
-                            <jf-help-tooltip html="SystemController.TOOLTIP.outputVerboseLog"></jf-help-tooltip>
-
-                        </div>
-                    </div>
-
-                    <div class="pull-right admin-actions">
-                        <button class="btn btn-primary" type="button"
-                                ng-disabled="!SystemController.exportOptions.path"
-                                ng-click="SystemController.export(exportForm)">
-                            Export
-                        </button>
-                    </div>
-                </jf-panel>
-            </form>
-
-            <form class="form margin-top-20" name="SystemController.importForm" novalidate>
-                <jf-panel jf-panel-heading="Import System">
-                    <div class="alert alert-warning">
-                        This action will wipe all Artifactory content - make sure to back up before completing this action!
-                    </div>
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-field validations="common">
-                                <label for="import-path">Import Zip or Path on Server*</label>
-                                <input type="text"
-                                       class="input-text"
-                                       required
-                                       id="import-path"
-                                       name="path"
-                                       ng-model="SystemController.importOptions.path"
-                                       ng-focus="SystemController.clearValidations()"/>
-                            </jf-field>
-                        </div>
-                        <div class="form-group-cell form-button">
-                            <jf-browse-files browser-resource="SystemController.browseFilesDao"
-                                             browser-update-folder="SystemController.updateImportFolderPath(directory)"
-                                             start-folder="SystemController.importOptions.path"
-                                             browser-options="SystemController.importFileBrowserOptions">
-                            </jf-browse-files>
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Exclude Content">
-                                <input
-                                        type="checkbox"
-                                        id="importExcludeContent"
-                                        ng-model="SystemController.importOptions.excludeContent">
-                            </jf-checkbox>
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Exclude Metadata">
-                                <input
-                                        ng-checked="SystemController.importOptions.excludeContent"
-                                        ng-disabled="SystemController.importOptions.excludeContent"
-                                        type="checkbox"
-                                        id="importExcludeMetadata"
-                                        ng-model="SystemController.importOptions.excludeMetadata">
-                            </jf-checkbox>
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Output Verbose Log">
-                                <input
-                                        type="checkbox"
-                                        id="importOutputVerboseLog"
-                                        ng-model="SystemController.importOptions.verbose">
-                            </jf-checkbox>
-                            <jf-help-tooltip html="SystemController.TOOLTIP.outputVerboseLog"></jf-help-tooltip>
-                        </div>
-                    </div>
-                    <div class="pull-right admin-actions">
-                        <button class="btn btn-primary" type="button"
-                                ng-disabled="!SystemController.importOptions.path"
-                                ng-click="SystemController.import(importForm)">
-                            Import
-                        </button>
-                    </div>
-                </jf-panel>
-            </form>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/import_export/system/system.module.js b/web/angular-web/src/main/webapp/app/states/admin/import_export/system/system.module.js
deleted file mode 100644
index 55882e5..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/import_export/system/system.module.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import {AdminImportExportSystemController} from './system.controller';
-
-function systemConfig($stateProvider) {
-    $stateProvider
-            .state('admin.import_export.system', {
-                url: '/system',
-                templateUrl: 'states/admin/import_export/system/system.html',
-                controller: 'AdminImportExportSystemController as SystemController'
-            })
-}
-
-export default angular.module('import_export.system', [])
-        .config(systemConfig)
-        .controller('AdminImportExportSystemController', AdminImportExportSystemController)
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/repositories/distribution_repository_form.html b/web/angular-web/src/main/webapp/app/states/admin/repositories/distribution_repository_form.html
deleted file mode 100644
index 515a44e..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/repositories/distribution_repository_form.html
+++ /dev/null
@@ -1,282 +0,0 @@
-<div class="wizard-content">
-<div ng-show="RepositoryForm.isCurrentTab('basic')">
-
-        <div class="form-group">
-            <div class="form-group-cell"
-                 ng-if="RepositoryForm.newRepository">
-                <jf-field validations="repositores"
-                          autofocus="RepositoryForm.isCurrentTab('basic') && !RepositoryForm.isBintrayModalOpen">
-                    <label for="repoKey-new" class="mandatory">Repository Key</label>
-                    <input type="text" class="input-text"
-                           id="repoKey-new"
-                           name="repoKey"
-                           ng-required="!RepositoryForm.isBintrayModalOpen"
-                           jf-repokey-validator="RepositoryForm"
-                           ng-model="RepositoryForm.repoInfo.general.repoKey"
-                           ng-change="RepositoryForm.onChangeRepoKey()"
-                           ng-model-options="{debounce: { 'default': 500 } }"/>
-                </jf-field>
-                <ng-messages for="RepositoryForm.repositoriesForm.repoKey.$error" class="jf-validation">
-                    <div ng-message-exp="'repoKeyValidator'" id="repository-key-validator">{{ RepositoryForm.repoKeyValidatorMessage }}</div>
-                </ng-messages>
-            </div>
-            <div class="form-group-cell"
-                 ng-if="!RepositoryForm.newRepository">
-                <jf-field validations="repositores" autofocus="true">
-                    <label for="repoKey-edit" class="mandatory">Repository Key</label>
-                    <input type="text"
-                           class="input-text"
-                           id="repoKey-edit"
-                           name="repoKey"
-                           ng-model="RepositoryForm.repoInfo.general.repoKey"
-                           ng-disabled="!RepositoryForm.newRepository"/>
-                </jf-field>
-                <ng-messages for="RepositoryForm.repositoriesForm.repoKey.$error" class="jf-validation">
-                    <div ng-message-exp="'repoKeyValidator'" id="repository-key-validator">{{ RepositoryForm.repoKeyValidatorMessage }}</div>
-                </ng-messages>
-            </div>
-        </div>
-
-        <div class="row">
-            <div class="col-lg-6">
-                <jf-panel jf-panel-heading="General">
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-field>
-                                <label>Description</label>
-                <textarea type="text"
-                          class="input-text"
-                          name="publicDescription"
-                          cols="5"
-                          ng-model="RepositoryForm.repoInfo.basic.publicDescription"
-                          id="local-repository-public-description-textarea">
-                </textarea>
-                            </jf-field>
-                        </div>
-                    </div>
-                </jf-panel>
-            </div>
-
-            <div class="col-lg-6">
-                <div>
-                    <jf-panel jf-panel-heading="Bintray Application">  <!--ng-if="!RepositoryForm.newRepository"-->
-                        <div class="alert alert-danger" ng-if="RepositoryForm.repoInfo.typeSpecific.authenticated == false">
-                            Bintray application has been revoked. Generate new <a href="" ng-click="RepositoryForm.openBintrayOAuthModal()">Bintray authorization</a>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field>
-                                    <label>Client ID</label>
-                                    <!--<jf-help-tooltip html="RepositoryForm.TOOLTIP.localForm.maxUniqueSnapshots"></jf-help-tooltip>--> <!--todo-->
-                                    <input type="text"
-                                           class="input-text"
-                                           name="clientId"
-                                           id="clientId"
-                                           readonly
-                                           ng-class="{'invalid ng-invalid': RepositoryForm.repoInfo.typeSpecific.authenticated == false}"
-                                           ng-model="RepositoryForm.repoInfo.typeSpecific.clientId"/>
-                                </jf-field>
-                            </div>
-                        </div>
-
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field>
-                                    <label>Organization</label>
-                                    <!--<jf-help-tooltip html="RepositoryForm.TOOLTIP.localForm.maxUniqueSnapshots"></jf-help-tooltip>--> <!--todo-->
-                                    <input type="text"
-                                           class="input-text"
-                                           id="organizationName"
-                                           value="{{RepositoryForm.repoInfo.typeSpecific.org}}"
-                                           readonly />
-                                </jf-field>
-                            </div>
-                        </div>
-
-                    </jf-panel>
-                </div>
-            </div>
-        </div>
-
-        <div class="row">
-            <div class="col-lg-6">
-                <jf-panel jf-panel-heading="Bintray Product">
-                    <div class="form-group half-margin-bottom">
-                        <div class="form-group-cell form-checkbox">
-                            <jf-checkbox text="Use This Repository To Distribute a Product">
-                                <input type="checkbox"
-                                       id="distributionType"
-                                       ng-model="RepositoryForm.distributionType"
-                                       ng-change="RepositoryForm.changeDistribute()" />
-                            </jf-checkbox>
-                            <jf-help-tooltip html="RepositoryForm.TOOLTIP.distributionForm.distributeProduct"></jf-help-tooltip>
-                        </div>
-                    </div>
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-field validations="distRepo">
-                                <label for="distribute" class="mandatory">Product Name</label>
-                                <input type="text"
-                                       class="input-text"
-                                       id="distribute"
-                                       name="distribute"
-                                       ui-validate="{illegalProductName: 'RepositoryForm.isProductNameValid($value)'}"
-                                       ng-model="RepositoryForm.repoInfo.basic.productName"
-                                       ng-disabled="!RepositoryForm.distributionType"
-                                       ng-required="RepositoryForm.distributionType">
-                            </jf-field>
-                        </div>
-                    </div>
-                </jf-panel>
-                <!--<jf-panel jf-panel-heading="Xray Integration">
-                    <div class="form-group form-checkbox">
-                        <jf-checkbox text="Send Events to Xray">
-                            <input type="checkbox"
-                                   id="xrayIndex"
-                                   ng-model="RepositoryForm.repoInfo.basic.xrayIndex">
-                        </jf-checkbox>
-                    </div>
-                </jf-panel>-->
-            </div>
-
-            <div class="col-lg-6">
-                <jf-panel jf-panel-heading="Default Repository Settings">
-
-                    <div class="form-group repo-visibility">
-                        <div class="info-box">Artifactory will use the configuration below to set visibility when creating a new Bintray repository.<br />
-                            If distributing to existing repository Artifactory will <strong>not</strong> override the configuration.</div>
-                        <jf-switch
-                                jf-switch-title="Repository Visibility"
-                                ng-model="RepositoryForm.defaultNewRepoPrivateSwitch"
-                                ng-change="RepositoryForm.changeDistributeVisibility()"
-                                ng-if="RepositoryForm.repoInfo.typeSpecific.premium || RepositoryForm.isBintrayModalOpen"
-                                options="['Private', 'Public']"></jf-switch>  <!--ng-disabled="!RepositoryForm.repoInfo.typeSpecific.isPremium"-->
-
-                        <div class="jf-switch" ng-if="!RepositoryForm.repoInfo.typeSpecific.premium && !RepositoryForm.isBintrayModalOpen">
-                            <span class="jf-switch-title">Repository Visibility</span>
-                            <ul class="jf-switch-options">
-                                <li jf-tooltip="{{RepositoryForm.TOOLTIP.distributionForm.repositoryVisibility}}">
-                                    <a class="jf-switch-option disabled" href="">Private</a>
-                                    <span class="license-required"> </span>
-                                </li>
-                                <li>
-                                    <a class="jf-switch-option disabled active" href="">Public</a>
-                                </li>
-                            </ul>
-                        </div>
-                    </div>
-                </jf-panel>
-                <jf-panel jf-panel-heading="Default Package Settings">
-                    <div class="info-box">Artifactory will use the configuration below to set the license and VCS URL when creating a new package.<br />
-                        If distributing to existing package in Bintray Artifactory will <strong>not</strong> override the configuration.</div>
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <label ng-class="{'mandatory': !RepositoryForm.repoInfo.basic.defaultNewRepoPrivate}">Licenses</label>
-                            <selectize placeholder='Select Value...'
-                                       config="RepositoryForm.licensesListConfig"
-                                       options="RepositoryForm.licensesList"
-                                       ng-model="RepositoryForm.repoInfo.basic.defaultLicenses"
-                                       ng-required="!RepositoryForm.repoInfo.basic.defaultNewRepoPrivate">
-                            </selectize>
-
-                        </div>
-                    </div>
-
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-field validations="common">
-                                <label for="defaultVcsUrl" ng-class="{'mandatory': !RepositoryForm.repoInfo.basic.defaultNewRepoPrivate}">VCS URL</label>
-                                <input type="url" id="defaultVcsUrl" name="defaultVcsUrl" class="input-text" ng-model="RepositoryForm.repoInfo.basic.defaultVcsUrl" ng-required="!RepositoryForm.repoInfo.basic.defaultNewRepoPrivate">
-                            </jf-field>
-                        </div>
-                    </div>
-                </jf-panel>
-
-            </div>
-        </div>
-    </div>
-
-    <div ng-show="RepositoryForm.isCurrentTab('advanced')">
-
-
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-field>
-                    <label>Proxy</label>
-                    <jf-ui-select jf-select-model="RepositoryForm.repoInfo.advanced.proxy"
-                                  jf-select-options="RepositoryForm.fields.proxies"></jf-ui-select>
-                </jf-field>
-            </div>
-        </div>
-
-        <div class="form-group half-margin-bottom">
-            <div class="form-group-cell">
-                <jf-checkbox text="GPG Signing">
-                    <input type="checkbox"
-                           id="gpg-signing"
-                           ng-model="RepositoryForm.repoInfo.advanced.gpgSign"/>
-                </jf-checkbox>
-            </div>
-        </div>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-field validations="common">
-                    <label for="gpgPassphrase">GPG Passphrase</label>
-                    <input type="password" placeholder="" class="input-text" id="gpgPassphrase" name="gpgPassphrase" ng-model="RepositoryForm.repoInfo.advanced.gpgPassPhrase" ng-disabled="!RepositoryForm.repoInfo.advanced.gpgSign">
-                </jf-field>
-            </div>
-        </div>
-
-        <div class="form-group">
-            <div class="form-group-cell">
-                <div jf-disable-feature="distribution-map-properties">
-                    <jf-list-maker values="RepositoryForm.repoInfo.advanced.whiteListedProperties"
-                                   label="Map Properties to Bintray Attributes"
-                                   help-tooltip="RepositoryForm.TOOLTIP.distributionForm.includesPattern"
-                                   object-name="Property Key...">
-                    </jf-list-maker>
-                </div>
-            </div>
-        </div>
-
-    </div>
-
-    <div ng-show="RepositoryForm.isCurrentTab('rules')">
-
-        <!--<div>
-            <jf-panel jf-panel-heading="Rules Testing" jf-panel-classes="borderless">
-                <div class="form-group">
-
-                    <div class="form-group-cell">
-                        <jf-field>
-                            <label for="testAllRules">Package Repo Path</label>
-                            <input type="text"
-                                   class="input-text"
-                                   name="testAllRules"
-                                   id="testAllRules"
-                                   ng-model="RepositoryForm.testAllRules" />
-                        </jf-field>
-                    </div>
-                    <div class="form-group-cell form-button">
-                        <button class="btn btn-secondary">Test</button>
-                    </div>
-                </div>
-            </jf-panel>
-        </div>-->
-
-        <div class="pull-right admin-grid-buttons">
-            <a ng-click="RepositoryForm.rulesPopup()">
-                <i class="grid-button-icon icon icon-new"></i>New
-            </a>
-        </div>
-
-        <p ng-if="RepositoryForm.noRules">No rules to show</p>
-        <jf-grid ng-if="RepositoryForm.isCurrentTab('rules')"
-                 grid-options="RepositoryForm.rulesGridOptions"
-                 object-name="rule/rules"
-                 auto-focus="true"
-                 filter-field="name"
-                 filter-field2="type">
-        </jf-grid>
-    </div>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/states/admin/repositories/local_repository_form.html b/web/angular-web/src/main/webapp/app/states/admin/repositories/local_repository_form.html
deleted file mode 100644
index d62cbda..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/repositories/local_repository_form.html
+++ /dev/null
@@ -1,490 +0,0 @@
-<div class="wizard-content">
-    <div ng-show="RepositoryForm.isCurrentTab('basic')">
-        <div class="form-group">
-            <label class="input-label-weight label-type-box mandatory">Package Type</label>
-            <ul class="list-unstyled">
-                <li class="inline-block package-type"
-                    ng-class="{typeValidation: !RepositoryForm.repoInfo.typeSpecific.repoType, 'not-clickable': !RepositoryForm.newRepository}"
-                    ng-click="!RepositoryForm.newRepository || RepositoryForm.openRepoTypeModal()"
-                    id="repository-package-type-button">
-                    <span ng-if="!RepositoryForm.repoInfo.typeSpecific.repoType">No Type</span>
-
-                    <div ng-if="RepositoryForm.repoInfo.typeSpecific.repoType"
-                         class="repotype iconrepo iconrepo-{{RepositoryForm.repoInfo.typeSpecific.repoType.toLowerCase()}}">
-                    </div>
-                    <div class="repotitle" ng-if="RepositoryForm.repoInfo.typeSpecific.repoType">
-                        {{ RepositoryForm.repoInfo.typeSpecific.repoType === 'GitLfs' ? 'Git LFS' : RepositoryForm.repoInfo.typeSpecific.repoType }}
-                    </div>
-                </li>
-            </ul>
-            <input class="hidden"
-                   ng-model="RepositoryForm.repoInfo.typeSpecific.repoType"
-                   name="repoType"
-                   required
-                   ng-change="RepositoryForm.setRepoLayout()"/>
-            <span ng-if="!RepositoryForm.repoInfo.typeSpecific.repoType && !RepositoryForm.isTypeModalOpen"
-                  class="repository-error" id="repository-package-type-validator">You must specify a package type</span>
-        </div>
-
-        <div class="form-group">
-            <div class="form-group-cell"
-                 ng-if="RepositoryForm.newRepository">
-                <jf-field validations="repositores"
-                          autofocus="(RepositoryForm.isCurrentTab('basic') && RepositoryForm.repoInfo.typeSpecific.repoType)">
-                    <label for="repoKey-new" class="mandatory">Repository Key</label>
-                    <input type="text" class="input-text"
-                           id="repoKey-new"
-                           name="repoKey"
-                           ng-required="RepositoryForm.repositoriesForm.repoType.$valid || (!RepositoryForm.repositoriesForm.repoType.$valid && !RepositoryForm.isTypeModalOpen)"
-                           jf-repokey-validator="RepositoryForm"
-                           ng-model="RepositoryForm.repoInfo.general.repoKey"
-                           ng-change="RepositoryForm.onChangeRepoKey()"
-                           ng-model-options="{debounce: { 'default': 500 } }"/>
-                </jf-field>
-                <ng-messages for="RepositoryForm.repositoriesForm.repoKey.$error" class="jf-validation">
-                    <div ng-message-exp="'repoKeyValidator'" id="repository-key-validator">{{ RepositoryForm.repoKeyValidatorMessage }}</div>
-                </ng-messages>
-            </div>
-            <div class="form-group-cell"
-                 ng-if="!RepositoryForm.newRepository">
-                <jf-field validations="repositores" autofocus="true">
-                    <label for="repoKey-edit" class="mandatory">Repository Key</label>
-                    <input type="text"
-                           class="input-text"
-                           id="repoKey-edit"
-                           name="repoKey"
-                           ng-model="RepositoryForm.repoInfo.general.repoKey"
-                           ng-disabled="!RepositoryForm.newRepository"/>
-                </jf-field>
-                <ng-messages for="RepositoryForm.repositoriesForm.repoKey.$error" class="jf-validation">
-                    <div ng-message-exp="'repoKeyValidator'" id="repository-key-validator">{{ RepositoryForm.repoKeyValidatorMessage }}</div>
-                </ng-messages>
-            </div>
-        </div>
-
-        <div class="row">
-            <div class="col-lg-6">
-                <jf-panel jf-panel-heading="General">
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-field>
-                                <label>Repository Layout</label>
-                                <ui-select jf-disable-ng-animate ng-model="RepositoryForm.repoInfo.basic.layout">
-                                    <ui-select-match placeholder="Select Repository Layout..."
-                                                     id="local-repository-layout-dropdown">
-                                        {{$select.selected}}
-                                    </ui-select-match>
-                                    <ui-select-choices
-                                            repeat="item in RepositoryForm.repositoryLayouts | filter: $select.search track by $index">
-                                        <div ng-bind-html="item | highlight: $select.search"
-                                             name="local-repository-layout-item"></div>
-                                    </ui-select-choices>
-                                </ui-select>
-                            </jf-field>
-                        </div>
-                    </div>
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-field>
-                                <label>Public Description</label>
-                    <textarea type="text"
-                              class="input-text"
-                              name="publicDescription"
-                              cols="5"
-                              ng-model="RepositoryForm.repoInfo.basic.publicDescription"
-                              id="local-repository-public-description-textarea">
-                    </textarea>
-                            </jf-field>
-                        </div>
-                        <div class="form-group-cell">
-                            <jf-field>
-                                <label>Internal Description</label>
-                    <textarea type="text"
-                              class="input-text"
-                              name="internalDescription"
-                              ng-model="RepositoryForm.repoInfo.basic.internalDescription"
-                              cols="5"
-                              id="local-repository-internal-description-textarea"></textarea>
-                            </jf-field>
-                        </div>
-                    </div>
-                </jf-panel>
-                <jf-panel jf-panel-heading="Include / Exclude Patterns">
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-list-maker values="RepositoryForm.repoInfo.basic.includesPatternArray"
-                                           label="Include Patterns"
-                                           help-tooltip="RepositoryForm.TOOLTIP.localForm.includesPattern"
-                                           object-name="Pattern">
-                            </jf-list-maker>
-<!--
-                            <jf-field>
-                                <label>Include Patterns</label>
-                                <jf-help-tooltip
-                                        html="RepositoryForm.TOOLTIP.localForm.includesPattern"></jf-help-tooltip>
-                    <textarea type="text"
-                              class="input-text"
-                              name="includesPattern"
-                              ng-model="RepositoryForm.repoInfo.basic.includesPattern"
-                              cols="5"
-                              id="local-repository-include-pattern-textarea"></textarea>
-                            </jf-field>
--->
-                        </div>
-                        <div class="form-group-cell">
-                            <jf-list-maker values="RepositoryForm.repoInfo.basic.excludesPatternArray"
-                                           label="Exclude Patterns"
-                                           help-tooltip="RepositoryForm.TOOLTIP.localForm.excludedPattern"
-                                           object-name="Pattern">
-                            </jf-list-maker>
-<!--
-                            <jf-field>
-                                <label>Exclude Patterns</label>
-                                <jf-help-tooltip
-                                        html="RepositoryForm.TOOLTIP.localForm.excludedPattern"></jf-help-tooltip>
-                    <textarea type="text" class="input-text" name="excludesPattern"
-                              ng-model="RepositoryForm.repoInfo.basic.excludesPattern"
-                              cols="5"
-                              id="local-repository-exclude-pattern-textarea"></textarea>
-                            </jf-field>
--->
-                        </div>
-                    </div>
-                </jf-panel>
-            </div>
-
-            <div class="col-lg-6">
-                <div ng-if="RepositoryForm.repoInfo.isType('maven', 'gradle', 'ivy', 'sbt')">
-                    <jf-panel jf-panel-heading="{{RepositoryForm.repoInfo.typeSpecific.repoType}} Settings">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field>
-                                    <label>Checksum Policy</label>
-                                    <jf-help-tooltip
-                                            html="RepositoryForm.TOOLTIP.localForm.checksumPolicy"></jf-help-tooltip>
-                                    <ui-select jf-disable-ng-animate ng-model="RepositoryForm.repoInfo.typeSpecific.localChecksumPolicy">
-                                        <ui-select-match placeholder="Select Checksum Policy..."
-                                                         id="local-repository-checksum-dropdown">
-                                            {{ RepositoryForm.localChecksumPolicies[$select.selected] }}
-                                        </ui-select-match>
-                                        <ui-select-choices
-                                                repeat="item in RepositoryForm.localChecksumPoliciesKeys | filter: $select.search track by $index">
-                                            <div ng-bind-html="RepositoryForm.localChecksumPolicies[item] | highlight: $select.search"
-                                                 id="local-repository-checksum-item"></div>
-                                        </ui-select-choices>
-                                    </ui-select>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field>
-                                    <label>Maven Snapshot Version Behavior</label>
-                                    <jf-help-tooltip
-                                            html="RepositoryForm.TOOLTIP.localForm.mavenSnapshotVersionBehavior"></jf-help-tooltip>
-                                    <ui-select jf-disable-ng-animate ng-model="RepositoryForm.repoInfo.typeSpecific.snapshotVersionBehavior"
-                                               ng-change="RepositoryForm.setSnapshotVersionBehavior()">
-                                        <ui-select-match placeholder="Select Maven Snapshot Version Behavior..."
-                                                         id="local-repository-behavior-dropdown">
-                                            {{RepositoryForm.mavenSnapshotRepositoryBehaviors[$select.selected] }}
-                                        </ui-select-match>
-                                        <ui-select-choices
-                                                repeat="item in RepositoryForm.mavenSnapshotRepositoryBehaviorsKeys | filter: $select.search track by $index">
-                                            <div ng-bind-html="RepositoryForm.mavenSnapshotRepositoryBehaviors[item] | highlight: $select.search"
-                                                 id="local-repository-behavior-item"></div>
-                                        </ui-select-choices>
-                                    </ui-select>
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell">
-                                <jf-field>
-                                    <label for="maxUniqueSnapshots">Max Unique Snapshots</label>
-                                    <jf-help-tooltip
-                                            html="RepositoryForm.TOOLTIP.localForm.maxUniqueSnapshots"></jf-help-tooltip>
-                                    <input type="text"
-                                           class="input-text"
-                                           id="maxUniqueSnapshots"
-                                           name="maxUniqueSnapshots"
-                                           ng-model="RepositoryForm.repoInfo.typeSpecific.maxUniqueSnapshots"
-                                           ng-disabled="RepositoryForm.repoInfo.typeSpecific.snapshotVersionBehavior=='NONUNIQUE'"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group form-checkbox">
-                            <jf-checkbox text="Handle Releases">
-                                <input type="checkbox"
-                                       id="handleReleases"
-                                       ng-model="RepositoryForm.repoInfo.typeSpecific.handleReleases">
-                            </jf-checkbox>
-                        </div>
-                        <div class="form-group form-checkbox">
-                            <jf-checkbox text="Handle Snapshots">
-                                <input type="checkbox"
-                                       id="handleSnapshots"
-                                       ng-model="RepositoryForm.repoInfo.typeSpecific.handleSnapshots">
-                            </jf-checkbox>
-                        </div>
-                        <div class="form-group form-checkbox">
-                            <jf-checkbox text="Suppress POM Consistency Checks">
-                                <input type="checkbox"
-                                       id="suppressPomConsistency"
-                                       ng-model="RepositoryForm.repoInfo.typeSpecific.suppressPomConsistencyChecks">
-                            </jf-checkbox>
-                        </div>
-                    </jf-panel>
-                </div>
-                <div ng-if="RepositoryForm.repoInfo.isType('yum')">
-                    <jf-panel jf-panel-heading="{{RepositoryForm.repoInfo.typeSpecific.repoType}} Settings">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="common">
-                                    <label>YUM Metadata Folder Depth</label>
-                                    <jf-help-tooltip
-                                            html="RepositoryForm.TOOLTIP.localForm.yumMetadataFolderDepth"></jf-help-tooltip>
-                                    <input type="number"
-                                           min="0"
-                                           name="metadataFolderDepth"
-                                           id="metadataFolderDepth"
-                                           ng-model="RepositoryForm.repoInfo.typeSpecific.metadataFolderDepth"
-                                           class="input-text">
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field>
-                                    <label>YUM Group File Names</label>
-                                    <jf-help-tooltip
-                                            html="RepositoryForm.TOOLTIP.localForm.yumGroupFileNames"></jf-help-tooltip>
-                                    <textarea type="text"
-                                              class="input-text"
-                                              name="yumGroupFilenames"
-                                              id="yumGroupFilenames"
-                                              ng-model="RepositoryForm.repoInfo.typeSpecific.groupFileNames">
-                                    </textarea>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group form-checkbox">
-                                <jf-checkbox text="Auto Calculate YUM Metadata">
-                                    <input type="checkbox"
-                                           id="autoCalculateYumMetadata"
-                                           ng-model="RepositoryForm.repoInfo.typeSpecific.autoCalculateYumMetadata">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                    </jf-panel>
-                </div>
-                <div ng-if="RepositoryForm.repoInfo.isType('cocoapods')">
-                    <jf-panel jf-panel-heading="{{RepositoryForm.repoInfo.typeSpecific.repoType}} Settings">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="common">
-                                    <label for="baseUrl">Custom URL Base</label>
-                                    <jf-help-tooltip html="RepositoryForm.TOOLTIP.customURLBase"></jf-help-tooltip>
-                                    <input type="text"
-                                           class="input-text disabled-look"
-                                           name="baseUrl"
-                                           id="baseUrl"
-                                           readonly
-                                           ng-model="RepositoryForm.baseUrl"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                    </jf-panel>
-                </div>
-                <div ng-if="RepositoryForm.repoInfo.isType('debian')">
-                    <jf-panel jf-panel-heading="{{RepositoryForm.repoInfo.typeSpecific.repoType}} Settings">
-                        <div class="form-group no-margin-bottom">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Trivial Layout">
-                                    <input type="checkbox"
-                                           id="trivialLayout"
-                                           ng-model="RepositoryForm.repoInfo.typeSpecific.trivialLayout">
-                                </jf-checkbox>
-                                <jf-help-tooltip
-                                        html="RepositoryForm.TOOLTIP.localForm.trivialLayout"></jf-help-tooltip>
-                            </div>
-                        </div>
-                    </jf-panel>
-                </div>
-                <div ng-if="RepositoryForm.repoInfo.isType('docker')">
-                    <jf-panel jf-panel-heading="{{RepositoryForm.repoInfo.typeSpecific.repoType}} Settings">
-                        <div class="form-group form-checkbox"
-                             ng-if="RepositoryForm.newRepository">
-                            <div class="form-group-cell">
-                                <label class="input-label-weight">API Version</label>
-                                <ul class="radio-select-list">
-                                    <li>
-                                        <input type="radio" id="v1" value="V1"
-                                               ng-model="RepositoryForm.repoInfo.typeSpecific.dockerApiVersion"/>
-                                        <label for="v1" class="input-label-weight">V1</label>
-                                    </li>
-                                    <li>
-                                        <input type="radio" id="v2" value="V2"
-                                               ng-model="RepositoryForm.repoInfo.typeSpecific.dockerApiVersion"/>
-                                        <label for="v2" class="input-label-weight">V2</label>
-                                    </li>
-                                </ul>
-                            </div>
-                        </div>
-                        <div class="form-group"
-                             ng-if="!RepositoryForm.newRepository">
-                            <div class="form-group-cell">
-                                <div class="input-label-weight">API Version: <strong>{{RepositoryForm.repoInfo.typeSpecific.dockerApiVersion.toUpperCase()}}</strong></div>
-                            </div>
-                        </div>
-
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Force Authentication">
-                                    <input type="checkbox"
-                                           id="forceDockerAuth"
-                                           ng-model="RepositoryForm.repoInfo.typeSpecific.forceDockerAuthentication" disabled="disabled">
-                                </jf-checkbox>
-                                <jf-help-tooltip html="RepositoryForm.TOOLTIP.localForm.forceDockerAuth"></jf-help-tooltip>
-                            </div>
-                        </div>
-                    </jf-panel>
-                </div>
-                <div ng-if="RepositoryForm.repoInfo.isType('nuget')">
-                    <jf-panel jf-panel-heading="{{RepositoryForm.repoInfo.typeSpecific.repoType}} Settings">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field>
-                                    <label>Max Unique Snapshots</label>
-                                    <jf-help-tooltip
-                                            html="RepositoryForm.TOOLTIP.localForm.maxUniqueSnapshots"></jf-help-tooltip>
-                                    <input type="text"
-                                           class="input-text"
-                                           name="maxUniqueSnapshots"
-                                           id="nugetMaxUniqueSnapshots"
-                                           ng-model="RepositoryForm.repoInfo.typeSpecific.maxUniqueSnapshots"
-                                           ng-disabled="RepositoryForm.disableMaxUniqueSnapshots"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group form-checkbox">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Force Authentication">
-                                    <input type="checkbox"
-                                           id="forceNuGetAuth"
-                                           ng-model="RepositoryForm.repoInfo.typeSpecific.forceNugetAuthentication">
-                                </jf-checkbox>
-                                <jf-help-tooltip html="RepositoryForm.TOOLTIP.localForm.forceNugetAuth"></jf-help-tooltip>
-                            </div>
-                        </div>
-                    </jf-panel>
-                </div>
-            </div>
-        </div>
-    </div>
-
-    <div ng-show="RepositoryForm.isCurrentTab('replications')">
-        <div class="form-group">
-            <div class="form-group-cell">
-                <!-- Cron expression is required only if there are replications -->
-                <jf-field validations="common" autofocus="RepositoryForm.isCurrentTab('replications')">
-                    <label class="mandatory">Cron Expression</label>
-                    <jf-help-tooltip
-                            html="RepositoryForm.TOOLTIP.localForm.cronExpressionReplication"></jf-help-tooltip>
-                    <input
-                            type="text"
-                            class="input-text"
-                            name="cronExp"
-                            ng-required="RepositoryForm.repoInfo.replications.length"
-                            jf-validator-cron
-                            jf-validator-cron-is-replication="true"
-                            ng-model-options="{debounce: { 'default': 500 } }"
-                            ng-model="RepositoryForm.repoInfo.cronExp"/>
-                </jf-field>
-            </div>
-            <div class="form-group-cell cron-wrapper">
-                <jf-field class="inline-block">
-                    <label>Next Replication Time</label>
-                    <input type="text"
-                           jf-cron-formatter
-                           class="input-text disabled-look"
-                           name="numCron"
-                           placeholder="N/A"
-                           readonly
-                           ng-model="RepositoryForm.repoInfo.cronExp"/>
-                </jf-field>
-            </div>
-        </div>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-checkbox text="Enable Event Replication">
-                    <input type="checkbox"
-                           id="enableEventReplication"
-                           ng-model="RepositoryForm.repoInfo.enableEventReplication">
-                </jf-checkbox>
-                <jf-help-tooltip html="RepositoryForm.TOOLTIP.localForm.enableEventReplication"></jf-help-tooltip>
-            </div>
-        </div>
-
-        <jf-panel jf-panel-heading="Replication">
-            <div class="alert alert-info"
-                 ng-if="RepositoryForm.globalReplicationsStatus.blockPushReplications">
-                Push replications is blocked.
-            </div>
-            <div class="pull-right admin-grid-buttons replications-admin-grid-buttons">
-                <a ng-click="RepositoryForm.newReplication()" >
-                    <i class="grid-button-icon icon icon-new"></i>New
-                </a>
-            </div>
-            <div class="clearfix"></div>
-            <jf-grid ng-if="RepositoryForm.isCurrentTab('replications')"
-                     grid-options="RepositoryForm.replicationsGridOption"
-                     filter-field="repoKey"
-                     filter-on-change="true"
-                     object-name="repository/repositories"
-                     auto-focus="true"></jf-grid>
-        </jf-panel>
-    </div>
-
-    <div ng-show="RepositoryForm.isCurrentTab('advanced')">
-        <div class="row">
-            <div class="col-lg-6">
-                <jf-panel jf-panel-heading="Select Property Sets"
-                          jf-panel-classes="borderless"
-                          jf-disable-feature="properties">
-                    <jf-drag-drop include-list="RepositoryForm.repoInfo.advanced.propertySets"
-                                  ng-if="RepositoryForm.propertiesList && RepositoryForm.repoInfo.advanced.propertySets"
-                                  ng-disabled="RepositoryForm.features.isDisabled('properties')"
-                                  exclude-list="RepositoryForm.propertiesList"
-                                  include-display-field="name"
-                                  exclude-display-field="name"
-                                  objects-name="Property Sets"
-                                  headers="{leftTitle:'Available',rightTitle:'Selected'}"></jf-drag-drop>
-
-                </jf-panel>
-
-                <div class="form-group form-checkbox">
-                    <div class="form-group-cell">
-                        <jf-checkbox text="Blacked Out">
-                            <input type="checkbox"
-                                   id="blackedOut"
-                                   ng-model="RepositoryForm.repoInfo.advanced.blackedOut">
-                        </jf-checkbox>
-                        <jf-help-tooltip html="RepositoryForm.TOOLTIP.localForm.blackedOut"></jf-help-tooltip>
-                    </div>
-                </div>
-                <div class="form-group no-margin-bottom">
-                    <div class="form-group-cell form-checkbox">
-                        <jf-checkbox text="Allow Content Browsing">
-                            <input type="checkbox"
-                                   id="allowContentBrowsing"
-                                   ng-model="RepositoryForm.repoInfo.advanced.allowContentBrowsing">
-                        </jf-checkbox>
-                        <jf-help-tooltip html="RepositoryForm.TOOLTIP.localForm.allowContentBrowsing"></jf-help-tooltip>
-                    </div>
-                </div>
-            </div>
-            <div class="col-lg-6">
-                <ng-include src="'states/admin/repositories/reverse_proxy.html'"></ng-include>
-            </div>
-        </div>
-    </div>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/states/admin/repositories/remote_repository_form.html b/web/angular-web/src/main/webapp/app/states/admin/repositories/remote_repository_form.html
deleted file mode 100644
index da09ef4..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/repositories/remote_repository_form.html
+++ /dev/null
@@ -1,908 +0,0 @@
-<div class="wizard-content">
-    <div ng-show="RepositoryForm.isCurrentTab('basic')">
-        <div class="form-group">
-            <label class="input-label-weight label-type-box mandatory">Package Type</label>
-            <div class="icon-logo-circle smart-repo-ind"
-                 ng-if="RepositoryForm.repoInfo.basic.contentSynchronisation.enabled"></div>
-            <ul class="list-unstyled">
-                <li class="inline-block package-type"
-                    ng-class="{typeValidation: !RepositoryForm.repoInfo.typeSpecific.repoType, 'not-clickable': !RepositoryForm.newRepository}"
-                    ng-click="!RepositoryForm.newRepository || RepositoryForm.openRepoTypeModal()"
-                    id="repository-package-type-button">
-                    <span ng-if="!RepositoryForm.repoInfo.typeSpecific.repoType">No Type</span>
-                    <div ng-if="RepositoryForm.repoInfo.typeSpecific.repoType"
-                         class="repotype iconrepo iconrepo-{{RepositoryForm.repoInfo.typeSpecific.repoType.toLowerCase()}}">
-                    </div>
-                    <div class="repotitle" ng-if="RepositoryForm.repoInfo.typeSpecific.repoType">
-                        {{ RepositoryForm.repoInfo.typeSpecific.repoType === 'GitLfs' ? 'Git LFS' : RepositoryForm.repoInfo.typeSpecific.repoType }}
-                    </div>
-                </li>
-            </ul>
-            <input class="hidden"
-                   ng-model="RepositoryForm.repoInfo.typeSpecific.repoType"
-                   name="repoType"
-                   required/>
-            <span ng-if="!RepositoryForm.repoInfo.typeSpecific.repoType && !RepositoryForm.isTypeModalOpen" class="repository-error" id="repository-package-type-validator">You must specify a package type</span>
-        </div>
-
-        <div class="form-group">
-            <div class="form-group-cell"
-                 ng-if="RepositoryForm.newRepository">
-                <jf-field validations="repositores"
-                          autofocus="(RepositoryForm.isCurrentTab('basic') && RepositoryForm.repoInfo.typeSpecific.repoType)">
-                    <label for="repoKey-new" class="mandatory">Repository Key</label>
-                    <input type="text" class="input-text"
-                           id="repoKey-new"
-                           name="repoKey"
-                           ng-required="RepositoryForm.repositoriesForm.repoType.$valid || (!RepositoryForm.repositoriesForm.repoType.$valid && !RepositoryForm.isTypeModalOpen)"
-                           jf-repokey-validator="RepositoryForm"
-                           ng-change="RepositoryForm.onChangeRepoKey()"
-                           ng-model="RepositoryForm.repoInfo.general.repoKey"
-                           ng-model-options="{debounce: { 'default': 500 } }"/>
-                </jf-field>
-                <ng-messages for="RepositoryForm.repositoriesForm.repoKey.$error" class="jf-validation">
-                    <div ng-message-exp="'repoKeyValidator'" id="repository-key-validator">{{ RepositoryForm.repoKeyValidatorMessage }}</div>
-                </ng-messages>
-            </div>
-            <div class="form-group-cell"
-                 ng-if="!RepositoryForm.newRepository">
-                <jf-field validations="repositores">
-                    <label for="repoKey-edit" class="mandatory">Repository Key</label>
-                    <input type="text" class="input-text"
-                           id="repoKey-edit"
-                           name="repoKey"
-                           ng-model="RepositoryForm.repoInfo.general.repoKey"
-                           ng-disabled="!RepositoryForm.newRepository"/>
-                </jf-field>
-                <ng-messages for="RepositoryForm.repositoriesForm.repoKey.$error" class="jf-validation">
-                    <div ng-message-exp="'repoKeyValidator'" id="repository-key-validator">{{ RepositoryForm.repoKeyValidatorMessage }}</div>
-                </ng-messages>
-            </div>
-
-            <div class="form-group-cell">
-                <jf-field validations="common">
-                    <label for="url" class="mandatory">URL</label>
-                    <input type="url" class="input-text"
-                           id="url"
-                           name="url"
-                           required
-                           ng-model="RepositoryForm.repoInfo.basic.url"
-                           ng-change="RepositoryForm._detectSmartRepository()"
-                           ng-model-options="{updateOn: 'blur'}" />
-                </jf-field>
-                <ng-messages for="RepositoryForm.repositoriesForm.field.$error" class="jf-validation">
-                    <div ng-message-exp="repoKeyValidator">{{ repoKeyValidatorMessage }}</div>
-                </ng-messages>
-            </div>
-            <div class="form-group-cell form-button"
-                 ng-if="RepositoryForm.isCurrentRepoType('remote')">
-                <button class="btn btn-secondary"
-                        type="button"
-                        ng-disabled="!RepositoryForm.repoInfo.typeSpecific.repoType"
-                        ng-click="RepositoryForm.testRemoteUrl()">Test
-                </button>
-            </div>
-        </div>
-
-        <div class="row">
-            <div class="col-lg-6">
-                <jf-panel jf-panel-heading="General">
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-field>
-                                <label>Repository Layout</label>
-                                <ui-select jf-disable-ng-animate ng-model="RepositoryForm.repoInfo.basic.layout">
-                                    <ui-select-match placeholder="Select Repository Layout"
-                                            id="remote-repository-layout-dropdown">
-                                        {{$select.selected}}
-                                    </ui-select-match>
-                                    <ui-select-choices
-                                            repeat="item in RepositoryForm.repositoryLayouts | filter: $select.search track by $index">
-                                        <div ng-bind-html="item | highlight: $select.search"
-                                             name="remote-repository-layout-item"></div>
-                                    </ui-select-choices>
-                                </ui-select>
-                            </jf-field>
-                        </div>
-                        <div class="form-group-cell">
-                            <jf-field>
-                                <label>Remote Layout Mapping</label>
-                                <ui-select jf-disable-ng-animate ng-model="RepositoryForm.repoInfo.basic.remoteLayoutMapping">
-                                    <ui-select-match
-                                            placeholder="Select Remote Layout">
-                                        {{$select.selected}}
-                                    </ui-select-match>
-                                    <ui-select-choices
-                                            repeat="item in RepositoryForm.remoteLayoutMapping | filter: $select.search track by $index">
-                                        <div ng-bind-html="item | highlight: $select.search"></div>
-                                    </ui-select-choices>
-                                </ui-select>
-                            </jf-field>
-                        </div>
-                    </div>
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-field>
-                                <label for="publicDescription">Public Description</label>
-                                <input type="text" class="input-text"
-                                       id="publicDescription"
-                                       name="publicDescription"
-                                       ng-model="RepositoryForm.repoInfo.basic.publicDescription"/>
-                            </jf-field>
-                        </div>
-                        <div class="form-group-cell">
-                            <jf-field>
-                                <label for="internalDescription">Internal Description</label>
-                                <input type="text" class="input-text"
-                                       id="internalDescription"
-                                       name="internalDescription"
-                                       ng-model="RepositoryForm.repoInfo.basic.internalDescription"/>
-                            </jf-field>
-                        </div>
-                    </div>
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-list-maker values="RepositoryForm.repoInfo.basic.includesPatternArray"
-                                           label="Include Patterns"
-                                           help-tooltip="RepositoryForm.TOOLTIP.remoteForm.includesPattern"
-                                           object-name="Pattern">
-                            </jf-list-maker>
-<!--
-                            <jf-field>
-                                <label for="includesPattern">Include Patterns</label>
-                                <jf-help-tooltip html="RepositoryForm.TOOLTIP.remoteForm.includesPattern"></jf-help-tooltip>
-                                <input type="text" class="input-text"
-                                       id="includesPattern"
-                                       name="includesPattern"
-                                       ng-model="RepositoryForm.repoInfo.basic.includesPattern"/>
-                            </jf-field>
--->
-                        </div>
-                        <div class="form-group-cell">
-                            <jf-list-maker values="RepositoryForm.repoInfo.basic.excludesPatternArray"
-                                           label="Exclude Patterns"
-                                           help-tooltip="RepositoryForm.TOOLTIP.remoteForm.excludedPattern"
-                                           object-name="Pattern">
-                            </jf-list-maker>
-<!--
-                            <jf-field>
-                                <label for="excludesPattern">Exclude Patterns</label>
-                                <jf-help-tooltip html="RepositoryForm.TOOLTIP.remoteForm.excludedPattern"></jf-help-tooltip>
-                                <input type="text" class="input-text"
-                                       id="excludesPattern"
-                                       name="excludesPattern"
-                                       ng-model="RepositoryForm.repoInfo.basic.excludesPattern"/>
-                            </jf-field>
--->
-                        </div>
-                    </div>
-
-                    <div class="form-group no-margin-bottom">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Offline">
-                                <input type="checkbox"
-                                       id="offLine"
-                                       ng-model="RepositoryForm.repoInfo.basic.offline">
-                            </jf-checkbox>
-                            <jf-help-tooltip html="RepositoryForm.TOOLTIP.remoteForm.offline"></jf-help-tooltip>
-                        </div>
-                    </div>
-                </jf-panel>
-            </div>
-            <div class="col-lg-6" ng-if="RepositoryForm.repoInfo.basic.contentSynchronisation.enabled">
-                <jf-panel jf-panel-heading="Smart Remote Repository">
-                    <div class="form-group form-checkbox"
-                         ng-if="RepositoryForm.isSmartRepoSupportFeature('SYNC_STATISTICS')">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Report Statistics">
-                                <input type="checkbox"
-                                       ng-model="RepositoryForm.repoInfo.basic.contentSynchronisation.statistics.enabled">
-                            </jf-checkbox>
-                            <jf-help-tooltip html="RepositoryForm.TOOLTIP.remoteForm.smartSyncStatistics"></jf-help-tooltip>
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox"
-                         ng-if="RepositoryForm.isSmartRepoSupportFeature('SYNC_PROPERTIES')">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Sync Properties">
-                                <input type="checkbox"
-                                       ng-model="RepositoryForm.repoInfo.basic.contentSynchronisation.properties.enabled">
-                            </jf-checkbox>
-                            <jf-help-tooltip html="RepositoryForm.TOOLTIP.remoteForm.smartSyncProperties"></jf-help-tooltip>
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox"
-                         ng-if="RepositoryForm.isSmartRepoSupportFeature('LIST_CONTENT')">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="List Remote Folder Items">
-                                <input type="checkbox"
-                                       id="listRemoteFolderItems"
-                                       ng-model="RepositoryForm.repoInfo.typeSpecific.listRemoteFolderItems">
-                            </jf-checkbox>
-                            <jf-help-tooltip
-                                    html="RepositoryForm.TOOLTIP.remoteForm.smartListRemoteFolderItems"></jf-help-tooltip>
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox"
-                         ng-if="RepositoryForm.isSmartRepoSupportFeature('DETECT_ORIGIN_ABSENCE')">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Source Absence Detection">
-                                <input type="checkbox"
-                                       id="SRR_SyncDeletes"
-                                       ng-model="RepositoryForm.repoInfo.basic.contentSynchronisation.source.originAbsenceDetection">
-                            </jf-checkbox>
-                            <jf-help-tooltip
-                                    html="RepositoryForm.TOOLTIP.remoteForm.originAbsenceDetection"></jf-help-tooltip>
-                        </div>
-                    </div>
-                </jf-panel>
-            </div>
-            <div class="col-lg-6" ng-if="RepositoryForm.smartRepoUnknownCapabilities">
-                <jf-panel jf-panel-heading="Smart Remote Repository">
-                    <div class="alert alert-warning">
-                        It seems that you are using Artifactory to serve as a remote repository,
-                        but we cannot determine its capabilities because credentials are missing
-                        and anonymous login is disabled.
-                    </div>
-                </jf-panel>
-            </div>
-            <div class="col-lg-6">
-                <jf-panel jf-panel-heading="{{RepositoryForm.repoInfo.typeSpecific.repoType}} Settings"
-                          ng-if="RepositoryForm.repoInfo.isType('maven','gradle','ivy','sbt')">
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-field>
-                                <label>Checksum Policy</label>
-                                <jf-help-tooltip
-                                        html="RepositoryForm.TOOLTIP.remoteForm.checksumPolicy"></jf-help-tooltip>
-                                <ui-select jf-disable-ng-animate ng-model="RepositoryForm.repoInfo.typeSpecific.remoteChecksumPolicy">
-                                    <ui-select-match placeholder="Select Checksum Policy..."
-                                            id="remote-repository-checksum-dropdown">
-                                        {{RepositoryForm.remoteChecksumPolicies[$select.selected]}}
-                                    </ui-select-match>
-                                    <ui-select-choices
-                                            repeat="item in RepositoryForm.remoteChecksumPoliciesKeys | filter: $select.search track by $index">
-                                        <div ng-bind-html="RepositoryForm.remoteChecksumPolicies[item] | highlight: $select.search"
-                                                id="remote-repository-checksum-item"></div>
-                                    </ui-select-choices>
-                                </ui-select>
-                            </jf-field>
-                        </div>
-                    </div>
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-field>
-                                <label for="maxUniqueSnapshots">Max Unique Snapshots</label>
-                                <jf-help-tooltip html="RepositoryForm.TOOLTIP.localForm.maxUniqueSnapshots"></jf-help-tooltip>
-                                <input type="text"
-                                       class="input-text"
-                                       id="maxUniqueSnapshots"
-                                       name="maxUniqueSnapshots"
-                                       ng-model="RepositoryForm.repoInfo.typeSpecific.maxUniqueSnapshots"
-                                       ng-disabled="RepositoryForm.disableMaxUniqueSnapshots"/>
-                            </jf-field>
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Eagerly Fetch Jars">
-                                <input type="checkbox"
-                                       id="eagerlyFetchJars"
-                                       ng-model="RepositoryForm.repoInfo.typeSpecific.eagerlyFetchJars">
-                            </jf-checkbox>
-                            <jf-help-tooltip
-                                    html="RepositoryForm.TOOLTIP.remoteForm.eagerlyFetchJars"></jf-help-tooltip>
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Suppress POM Consistency Checks">
-                                <input type="checkbox"
-                                       id="suppressPomConsistency"
-                                       ng-model="RepositoryForm.repoInfo.typeSpecific.suppressPomConsistencyChecks">
-                            </jf-checkbox>
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Eagerly Fetch Sources">
-                                <input type="checkbox"
-                                       id="eagerlyFetchSources"
-                                       ng-model="RepositoryForm.repoInfo.typeSpecific.eagerlyFetchSources">
-                            </jf-checkbox>
-                            <jf-help-tooltip
-                                    html="RepositoryForm.TOOLTIP.remoteForm.eagerlyFetchSources"></jf-help-tooltip>
-                            </div>
-                    </div>
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Handle Releases">
-                                <input type="checkbox"
-                                       id="handleReleases"
-                                       ng-model="RepositoryForm.repoInfo.typeSpecific.handleReleases">
-                            </jf-checkbox>
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Handle Snapshots">
-                                <input type="checkbox"
-                                       id="handleSnapshots"
-                                       ng-model="RepositoryForm.repoInfo.typeSpecific.handleSnapshots">
-                            </jf-checkbox>
-                        </div>
-                    </div>
-                </jf-panel>
-
-                <jf-panel jf-panel-heading="Generic"
-                          ng-if="RepositoryForm.repoInfo.isType('generic') && !RepositoryForm.repoInfo.basic.contentSynchronisation.enabled">
-                    <div class="form-group no-margin-bottom">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="List Remote Folder Items ">
-                                <input type="checkbox"
-                                       id="listRemoteFolderItems2"
-                                       ng-model="RepositoryForm.repoInfo.typeSpecific.listRemoteFolderItems">
-                            </jf-checkbox>
-                            <jf-help-tooltip
-                                    html="RepositoryForm.TOOLTIP.remoteForm.listRemoteFolderItems"></jf-help-tooltip>
-                        </div>
-                    </div>
-                </jf-panel>
-
-                <jf-panel jf-panel-heading="{{RepositoryForm.repoInfo.typeSpecific.repoType}} Settings"
-                          ng-if="RepositoryForm.repoInfo.isType('vcs', 'bower', 'cocoapods')">
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-field>
-                                <label>Git Provider</label>
-                                <ui-select jf-disable-ng-animate ng-model="RepositoryForm.repoInfo.typeSpecific.gitProvider">
-                                    <ui-select-match placeholder="Select Git provider..."
-                                            id="remote-repository-git-provider-dropdown">
-                                        {{RepositoryForm.vcsGitProviderOptions[$select.selected] }}
-                                    </ui-select-match>
-                                    <ui-select-choices
-                                            repeat="item in RepositoryForm.vcsGitProviderOptionsKeys | filter: $select.search track by $index">
-                                        <div ng-bind-html="RepositoryForm.vcsGitProviderOptions[item] | highlight: $select.search"
-                                                id="remote-repository-git-provider-item"></div>
-                                    </ui-select-choices>
-                                </ui-select>
-                             </jf-field>
-                        </div>
-                        <div class="form-group-cell"
-                             ng-if="RepositoryForm.repoInfo.isType('vcs')">
-                            <jf-field>
-                                <label for="maxUniqueSnapshots">Max Unique Snapshots</label>
-                                <jf-help-tooltip html="RepositoryForm.TOOLTIP.localForm.maxUniqueSnapshots"></jf-help-tooltip>
-                                <input type="text"
-                                       class="input-text"
-                                       id="maxUniqueSnapshots5"
-                                       name="maxUniqueSnapshots"
-                                       ng-model="RepositoryForm.repoInfo.typeSpecific.maxUniqueSnapshots"/>
-                            </jf-field>
-                        </div>
-                    </div>
-                    <div class="form-group">
-                        <div class="form-group-cell"
-                             ng-if="RepositoryForm.repoInfo.isGitProvider('custom')">
-                            <jf-field>
-                                <label for="downloadUrl">Download URL</label>
-                                <input type="text"
-                                       class="input-text"
-                                       id="downloadUrl"
-                                       name="downloadUrl"
-                                       ng-model="RepositoryForm.repoInfo.typeSpecific.downloadUrl"/>
-                            </jf-field>
-                        </div>
-                        <div class="form-group-cell"
-                             ng-if="RepositoryForm.repoInfo.isType('bower')">
-                            <jf-field>
-                                <label for="registryUrl">Registry URL</label>
-                                <input type="text"
-                                       class="input-text"
-                                       id="registryUrl"
-                                       name="registryUrl"
-                                       ng-model="RepositoryForm.repoInfo.typeSpecific.registryUrl"/>
-                            </jf-field>
-                        </div>
-                        <div class="form-group-cell"
-                             ng-if="RepositoryForm.repoInfo.isType('cocoapods')">
-                            <jf-field>
-                                <label for="specsRepoUrl">Specs Repo URL</label>
-                                <input type="text"
-                                       class="input-text"
-                                       id="specsRepoUrl"
-                                       name="specsRepoUrl"
-                                       ng-model="RepositoryForm.repoInfo.typeSpecific.specsRepoUrl"/>
-                            </jf-field>
-                        </div>
-                        <div class="form-group-cell"
-                             ng-if="RepositoryForm.repoInfo.isType('cocoapods')">
-                            <jf-field validations="common">
-                                <label for="baseUrl">Custom URL Base</label>
-                                <jf-help-tooltip html="RepositoryForm.TOOLTIP.customURLBase"></jf-help-tooltip>
-                                <input type="text"
-                                       class="input-text disabled-look"
-                                       name="baseUrl"
-                                       id="baseUrl"
-                                       readonly
-                                       ng-model="RepositoryForm.baseUrl"/>
-                            </jf-field>
-                        </div>
-                    </div>
-                </jf-panel>
-                <jf-panel jf-panel-heading="{{RepositoryForm.repoInfo.typeSpecific.repoType}} Settings"
-                          ng-if="RepositoryForm.repoInfo.isType('docker')">
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <div class="input-label-weight">API Version: <strong>V2</strong></div>
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox margin-top-20">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Enable Token Authentication">
-                                <input type="checkbox"
-                                       id="enableTokenAuthentication"
-                                       ng-model="RepositoryForm.repoInfo.typeSpecific.enableTokenAuthentication">
-                            </jf-checkbox>
-                            <jf-help-tooltip
-                                    html="RepositoryForm.TOOLTIP.remoteForm.dockerEnableTokenAuthentication"></jf-help-tooltip>
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Force Authentication">
-                                <input type="checkbox"
-                                       id="forceDockerAuth"
-                                       ng-model="RepositoryForm.repoInfo.typeSpecific.forceDockerAuthentication" disabled="disabled">
-                            </jf-checkbox>
-                            <jf-help-tooltip html="RepositoryForm.TOOLTIP.localForm.forceDockerAuth"></jf-help-tooltip>
-                        </div>
-                    </div>
-                </jf-panel>
-
-                <jf-panel jf-panel-heading="{{RepositoryForm.repoInfo.typeSpecific.repoType}} Settings"
-                          ng-if="RepositoryForm.repoInfo.isType('nuget')">
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-field>
-                                <label for="nuGetDownloadContext" class="mandatory">NuGet Download Context Path</label>
-                                <jf-help-tooltip
-                                        html="RepositoryForm.TOOLTIP.remoteForm.nuGetDownloadContextPath"></jf-help-tooltip>
-                                <input type="text"
-                                       id="nuGetDownloadContext"
-                                       ng-model="RepositoryForm.repoInfo.typeSpecific.downloadContextPath"
-                                       required
-                                       class="input-text">
-                            </jf-field>
-                        </div>
-                        <div class="form-group-cell">
-                            <jf-field>
-                                <label for="nuGetFeedContextPath">NuGet Feed Context Path</label>
-                                <jf-help-tooltip
-                                        html="RepositoryForm.TOOLTIP.remoteForm.nuGetFeedContextPath"></jf-help-tooltip>
-                                <input type="text"
-                                       class="input-text"
-                                       id="nuGetFeedContextPath"
-                                       name="nuGetFeedContextPath"
-                                       ng-model="RepositoryForm.repoInfo.typeSpecific.feedContextPath"/>
-                            </jf-field>
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Force Authentication">
-                                <input type="checkbox"
-                                       id="forceNuGetAuth"
-                                       ng-model="RepositoryForm.repoInfo.typeSpecific.forceNugetAuthentication">
-                            </jf-checkbox>
-                            <jf-help-tooltip html="RepositoryForm.TOOLTIP.localForm.forceNugetAuth"></jf-help-tooltip>
-                        </div>
-                    </div>
-                </jf-panel>
-
-                <jf-panel jf-panel-heading="{{RepositoryForm.repoInfo.typeSpecific.repoType}} Settings"
-                          ng-if="RepositoryForm.repoInfo.isType('debian') && !RepositoryForm.repoInfo.basic.contentSynchronisation.enabled">
-                    <div class="form-group no-margin-bottom">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="List Remote Folder Items">
-                                <input type="checkbox"
-                                       id="listRemoteFolderItems3"
-                                       ng-model="RepositoryForm.repoInfo.typeSpecific.listRemoteFolderItems">
-                            </jf-checkbox>
-                            <jf-help-tooltip
-                                    html="RepositoryForm.TOOLTIP.remoteForm.listRemoteFolderItems"></jf-help-tooltip>
-                        </div>
-                    </div>
-                </jf-panel>
-
-                <jf-panel jf-panel-heading="{{RepositoryForm.repoInfo.typeSpecific.repoType}} Settings"
-                          ng-if="RepositoryForm.repoInfo.isType('yum') && !RepositoryForm.repoInfo.basic.contentSynchronisation.enabled">
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="List Remote Folder Items">
-                                <input type="checkbox"
-                                       id="listRemoteFolderItems4"
-                                       ng-model="RepositoryForm.repoInfo.typeSpecific.listRemoteFolderItems">
-                            </jf-checkbox>
-                            <jf-help-tooltip
-                                    html="RepositoryForm.TOOLTIP.remoteForm.listRemoteFolderItems"></jf-help-tooltip>
-                        </div>
-                    </div>
-                </jf-panel>
-
-                <jf-panel jf-panel-heading="{{RepositoryForm.repoInfo.typeSpecific.repoType}} Settings"
-                          ng-if="RepositoryForm.repoInfo.isType('p2') && !RepositoryForm.repoInfo.basic.contentSynchronisation.enabled">
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="List Remote Folder Items">
-                                <input type="checkbox"
-                                       id="listRemoteFolderItems5"
-                                       ng-model="RepositoryForm.repoInfo.typeSpecific.listRemoteFolderItems">
-                            </jf-checkbox>
-                            <jf-help-tooltip
-                                    html="RepositoryForm.TOOLTIP.remoteForm.listRemoteFolderItems"></jf-help-tooltip>
-                        </div>
-                    </div>
-                </jf-panel>
-            </div>
-        </div>
-    </div>
-
-    <div ng-show="RepositoryForm.isCurrentTab('replications')">
-        <div class="alert alert-info"
-             ng-if="RepositoryForm.globalReplicationsStatus.blockPullReplications">
-            Pull replications is blocked.
-        </div>
-        <div class="form-group form-checkbox">
-            <div class="form-group-cell">
-                <jf-checkbox text="Enable Active Replication of This Repository">
-                    <input type="checkbox"
-                           id="enableActiveReplication"
-                           ng-model="RepositoryForm.repoInfo.replication.enabled"
-                           ng-change="">
-                </jf-checkbox>
-            </div>
-        </div>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-field validations="maintenance" autofocus="RepositoryForm.isCurrentTab('replications')">
-                    <label for="cronExp" class="mandatory">Cron Expression</label>
-                    <jf-help-tooltip html="RepositoryForm.TOOLTIP.remoteForm.cronExpressionReplication"></jf-help-tooltip>
-                    <input type="text"
-                           class="input-text"
-                           id="cronExp"
-                           name="cronExp" Enable Active Replication of this Repository
-                           jf-validator-cron
-                           jf-validator-cron-is-replication="true"
-                           ng-disabled="!RepositoryForm.repoInfo.replication.enabled"
-                           ng-model="RepositoryForm.repoInfo.cronExp"
-                           ng-required="RepositoryForm.repoInfo.replication.enabled"
-                           ng-model-options="{onBlur: true, debounce: { 'default': 500}}"/>
-                </jf-field>
-            </div>
-            <div class="form-group-cell cron-wrapper">
-                <jf-field class="inline-block">
-                    <label for="numCron">Next Replication Time</label>
-                    <input type="text"
-                           placeholder="N/A"
-                           jf-cron-formatter
-                           class="input-text disabled-look"
-                           id="numCron"
-                           name="numCron"
-                           readonly
-                           ng-disabled="!RepositoryForm.repoInfo.replication.enabled"
-                           ng-model="RepositoryForm.repoInfo.cronExp"/>
-                </jf-field>
-            </div>
-        </div>
-        <div class="form-group form-checkbox">
-            <div class="form-group-cell">
-                <jf-checkbox text="Sync Deleted Artifacts">
-                    <input type="checkbox"
-                           id="syncDeletes"
-                           ng-disabled="!RepositoryForm.repoInfo.replication.enabled"
-                           ng-model="RepositoryForm.repoInfo.replication.syncDeletes">
-                </jf-checkbox>
-                <jf-help-tooltip html="RepositoryForm.TOOLTIP.remoteForm.syncDeletes"></jf-help-tooltip>
-            </div>
-        </div>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-checkbox text="Sync Artifact Properties">
-                    <input type="checkbox"
-                           id="syncProperties"
-                           ng-disabled="!RepositoryForm.repoInfo.replication.enabled"
-                           ng-model="RepositoryForm.repoInfo.replication.syncProperties">
-                </jf-checkbox>
-                <jf-help-tooltip html="RepositoryForm.TOOLTIP.remoteForm.syncProperties"></jf-help-tooltip>
-            </div>
-        </div>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-field>
-                    <label for="pathPrefix">Path Prefix</label>
-                    <jf-help-tooltip html="RepositoryForm.TOOLTIP.remoteForm.pathPrefix"></jf-help-tooltip>
-                    <input type="text" class="input-text"
-                           id="pathPrefix"
-                           name="pathPrefix"
-                           ng-disabled="!RepositoryForm.repoInfo.replication.enabled"
-                           ng-model="RepositoryForm.repoInfo.replication.pathPrefix"/>
-                </jf-field>
-            </div>
-            <div class="form-group-cell form-button">
-                <button class="btn btn-secondary"
-                        type="button"
-                        ng-disabled="!RepositoryForm.repoInfo.replication
-                        || !RepositoryForm.repoInfo.replication.enabled
-                        || RepositoryForm.repositoriesForm.cronExp.$invalid"
-                        ng-click="RepositoryForm.testRemoteReplication()">Test
-                </button>
-            </div>
-        </div>
-    </div>
-
-    <div ng-show="RepositoryForm.isCurrentTab('advanced')">
-        <div class="row">
-            <div class="col-lg-12">
-                <jf-panel jf-panel-heading="Remote Credentials">
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-field>
-                                <label for="username">Username</label>
-                                <input type="text" class="input-text"
-                                       id="username"
-                                       name="username"
-                                       placeholder="Leave empty to access anonymously"
-                                       ng-blur="RepositoryForm.onBlurCredentials()"
-                                       ng-model="RepositoryForm.repoInfo.advanced.network.username"/>
-                            </jf-field>
-
-                            <!-- prevent auto complete -->
-                            <input type="text" class="hidden"/>
-                            <input type="password" class="hidden"/>
-                        </div>
-                        <div class="form-group-cell">
-                            <jf-field>
-                                <label for="password">Password</label>
-                                <input type="password" class="input-text"
-                                       id="password"
-                                       ng-blur="RepositoryForm.onBlurCredentials()"
-                                       name="password"
-                                       ng-model="RepositoryForm.repoInfo.advanced.network.password"/>
-                            </jf-field>
-                        </div>
-                        <div class="form-group-cell form-button"
-                             ng-if="RepositoryForm.isCurrentRepoType('remote')">
-                            <button class="btn btn-secondary"
-                                    type="button"
-                                    ng-disabled="!RepositoryForm.repoInfo.typeSpecific.repoType"
-                                    ng-click="RepositoryForm.testRemoteUrl()">Test
-                            </button>
-                        </div>
-                    </div>
-                </jf-panel>
-            </div>
-        </div>
-        <div class="row">
-            <div class="col-lg-6">
-                <jf-panel jf-panel-heading="Network">
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-field>
-                                <label>Proxy</label>
-                                <jf-ui-select jf-select-model="RepositoryForm.repoInfo.advanced.network.proxy"
-                                              jf-select-options="RepositoryForm.fields.proxies"></jf-ui-select>
-<!--
-                                <ui-select ng-model="RepositoryForm.repoInfo.advanced.network.proxy">
-                                    <ui-select-match
-                                            placeholder="Select Proxy..."
-                                            allow-clear="true">
-                                        {{ $select.selected }}
-                                    </ui-select-match>
-                                    <ui-select-choices
-                                            repeat="item in RepositoryForm.fields.proxies | filter: $select.search track by $index">
-                                        <div ng-bind-html="item | highlight: $select.search"></div>
-                                    </ui-select-choices>
-                                </ui-select>
--->
-                            </jf-field>
-                        </div>
-                        <div class="form-group-cell">
-                            <jf-field>
-                                <label for="localAddress">Local Address</label>
-                                <jf-help-tooltip html="RepositoryForm.TOOLTIP.remoteForm.localAddress"></jf-help-tooltip>
-                                <input type="text" class="input-text"
-                                       id="localAddress"
-                                       name="localAddress"
-                                       ng-model="RepositoryForm.repoInfo.advanced.network.localAddress"/>
-                            </jf-field>
-                        </div>
-                    </div>
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-field>
-                                <label for="socketTimeout">Socket Timeout (MS)</label>
-                                <jf-help-tooltip html="RepositoryForm.TOOLTIP.remoteForm.socketTimeout"></jf-help-tooltip>
-                                <input type="text" class="input-text"
-                                       id="socketTimeout"
-                                       name="socketTimeout"
-                                       ng-model="RepositoryForm.repoInfo.advanced.network.socketTimeout"/>
-                            </jf-field>
-                        </div>
-                        <div class="form-group-cell">
-                            <jf-field>
-                                <label for="queryParams">Query Params</label>
-                                <jf-help-tooltip html="RepositoryForm.TOOLTIP.remoteForm.queryParams"></jf-help-tooltip>
-                                <input type="text" class="input-text"
-                                       id="queryParams"
-                                       name="queryParams"
-                                       ng-model="RepositoryForm.repoInfo.advanced.queryParams"/>
-                            </jf-field>
-                        </div>
-                    </div>
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Lenient Host Authentication">
-                                <input type="checkbox"
-                                       id="hostAuth"
-                                       ng-model="RepositoryForm.repoInfo.advanced.network.lenientHostAuth">
-                            </jf-checkbox>
-                            <jf-help-tooltip html="RepositoryForm.TOOLTIP.remoteForm.lenientHostAuthentication"></jf-help-tooltip>
-                        </div>
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Cookie Management">
-                                <input type="checkbox"
-                                       id="cookieManagement"
-                                       ng-model="RepositoryForm.repoInfo.advanced.network.cookieManagement">
-                            </jf-checkbox>
-                            <jf-help-tooltip html="RepositoryForm.TOOLTIP.remoteForm.enableCookieManagement"></jf-help-tooltip>
-                        </div>
-                    </div>
-                </jf-panel>
-            </div>
-            <div class="col-lg-6">
-                <jf-panel jf-panel-heading="Select Property Sets"
-                          jf-disable-feature="properties">
-                    <jf-drag-drop include-list="RepositoryForm.repoInfo.advanced.propertySets"
-                                  ng-if="RepositoryForm.propertiesList && RepositoryForm.repoInfo.advanced.propertySets"
-                                  ng-disabled="RepositoryForm.features.isDisabled('properties')"
-                                  exclude-list="RepositoryForm.propertiesList"
-                                  include-display-field="name"
-                                  exclude-display-field="name"
-                                  objects-name="Property Sets"
-                                  headers="{leftTitle:'Available',
-                      rightTitle:'Selected'}"></jf-drag-drop>
-                </jf-panel>
-            </div>
-        </div>
-        <div class="row">
-            <div class="col-lg-6">
-                <jf-panel jf-panel-heading="Cache">
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-field>
-                                <label for="keepUnusedArtifactsHours">Unused Artifacts Cleanup Period (Hr)</label>
-                                <jf-help-tooltip html="RepositoryForm.TOOLTIP.remoteForm.keepUnusedArtifacts"></jf-help-tooltip>
-                                <input type="text" class="input-text"
-                                       id="keepUnusedArtifactsHours"
-                                       name="keepUnusedArtifactsHours"
-                                       ng-model="RepositoryForm.repoInfo.advanced.cache.keepUnusedArtifactsHours"/>
-                            </jf-field>
-                        </div>
-                        <div class="form-group-cell">
-                            <jf-field>
-                                <label for="retrievalCache">Metadata Retrieval Cache Period (Sec)</label>
-                                <jf-help-tooltip html="RepositoryForm.TOOLTIP.remoteForm.retrievalCachePeriod"></jf-help-tooltip>
-                                <input type="text" class="input-text"
-                                       id="retrievalCache"
-                                       name="retrievalCache"
-                                       ng-model="RepositoryForm.repoInfo.advanced.cache.retrievalCachePeriodSecs"/>
-                            </jf-field>
-                        </div>
-                    </div>
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-field>
-                                <label for="assumedOfflineLimitSecs">Assumed Offline Period (Sec)</label>
-                                <jf-help-tooltip html="RepositoryForm.TOOLTIP.remoteForm.assumedOfflineLimit"></jf-help-tooltip>
-                                <input type="text" class="input-text"
-                                       id="assumedOfflineLimitSecs"
-                                       name="assumedOfflineLimitSecs"
-                                       ng-model="RepositoryForm.repoInfo.advanced.cache.assumedOfflineLimitSecs"/>
-                            </jf-field>
-                        </div>
-                        <div class="form-group-cell">
-                            <jf-field>
-                                <label for="MissedRetrievalCache">Missed Retrieval Cache Period (Sec)</label>
-                                <jf-help-tooltip html="RepositoryForm.TOOLTIP.remoteForm.missedRetrievalCachePeriod"></jf-help-tooltip>
-                                <input type="text" class="input-text"
-                                       id="MissedRetrievalCache"
-                                       name="MissedRetrievalCache"
-                                       ng-model="RepositoryForm.repoInfo.advanced.cache.missedRetrievalCachePeriodSecs"/>
-                            </jf-field>
-                        </div>
-                    </div>
-                </jf-panel>
-            </div>
-            <div class="col-lg-6">
-                <jf-panel jf-panel-heading="Others">
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Blacked Out">
-                                <input type="checkbox"
-                                       id="blackedOut"
-                                       ng-model="RepositoryForm.repoInfo.advanced.blackedOut">
-                            </jf-checkbox>
-                            <jf-help-tooltip html="RepositoryForm.TOOLTIP.remoteForm.blackedOut"></jf-help-tooltip>
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Allow Content Browsing">
-                                <input type="checkbox"
-                                       id="allowContentBrowsing"
-                                       ng-model="RepositoryForm.repoInfo.advanced.allowContentBrowsing">
-                            </jf-checkbox>
-                            <jf-help-tooltip html="RepositoryForm.TOOLTIP.remoteForm.allowContentBrowsing"></jf-help-tooltip>
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Store Artifacts Locally">
-                                <input type="checkbox"
-                                       id="storeArtifactsLocally"
-                                       ng-model="RepositoryForm.repoInfo.advanced.storeArtifactsLocally">
-                            </jf-checkbox>
-                            <jf-help-tooltip html="RepositoryForm.TOOLTIP.remoteForm.storeArtifactsLocally"></jf-help-tooltip>
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Synchronize Properties">
-                                <input type="checkbox"
-                                       id="synchronizeProperties"
-                                       ng-model="RepositoryForm.repoInfo.advanced.synchronizeArtifactProperties">
-                            </jf-checkbox>
-                            <jf-help-tooltip html="RepositoryForm.TOOLTIP.remoteForm.synchronizeArtifactoryProperties"></jf-help-tooltip>
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox"
-                         ng-if="RepositoryForm.repoInfo.isType('generic')">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Propagate Query Params">
-                                <input type="checkbox"
-                                       id="propagateQueryParams"
-                                       ng-model="RepositoryForm.repoInfo.advanced.propagateQueryParams">
-                            </jf-checkbox>
-                            <jf-help-tooltip html="RepositoryForm.TOOLTIP.remoteForm.propagateQueryParams"></jf-help-tooltip>
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Block Mismatching Mime Types">
-                                <input type="checkbox"
-                                       id="blockMismatchingMimeTypes"
-                                       ng-model="RepositoryForm.repoInfo.advanced.blockMismatchingMimeTypes">
-                            </jf-checkbox>
-                            <jf-help-tooltip html="RepositoryForm.TOOLTIP.remoteForm.blockMismatchingMimeTypes"></jf-help-tooltip>
-                        </div>
-                    </div>
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-list-maker values="RepositoryForm.repoInfo.advanced.mismatchingMimeTypesOverrideList"
-                                           ng-disabled="!RepositoryForm.repoInfo.advanced.blockMismatchingMimeTypes"
-                                           label="Override Default Blocked Mime Types"
-                                           object-name="Mime Type">
-                            </jf-list-maker>
-                        </div>
-                    </div>
-                </jf-panel>
-            </div>
-        </div>
-        <div class="row">
-            <div class="col-lg-6">
-                <ng-include src="'states/admin/repositories/reverse_proxy.html'"></ng-include>
-            </div>
-        </div>
-    </div>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/states/admin/repositories/repositories.controller.js b/web/angular-web/src/main/webapp/app/states/admin/repositories/repositories.controller.js
deleted file mode 100644
index 5436b21..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/repositories/repositories.controller.js
+++ /dev/null
@@ -1,321 +0,0 @@
-import FIELD_OPTIONS from "../../../constants/field_options.constats";
-
-export class AdminRepositoriesController {
-
-    constructor($scope, $state, ArtifactoryGridFactory, RepositoriesDao, ArtifactoryModal, uiGridConstants,
-            ArtifactActionsDao, ArtifactoryFeatures, commonGridColumns, GlobalReplicationsConfigDao) {
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.$state = $state;
-        this.commonGridColumns = commonGridColumns;
-        this.repositoriesDao = RepositoriesDao;
-        this.globalReplicationsConfigDao = GlobalReplicationsConfigDao;
-        this.$scope = $scope;
-        this.modal = ArtifactoryModal;
-        this.artifactActionsDao = ArtifactActionsDao;
-        this.gridOption = {};
-        this.uiGridConstants = uiGridConstants;
-        this.features = ArtifactoryFeatures;
-        this.currentRepoType = $state.params.repoType;
-        if (!_.contains(['local','remote','virtual', 'distribution'], this.currentRepoType)) {
-            this.$state.go('not_found_404');
-            return;
-        }
-        this._createGrid();
-        this._initRepos();
-        this._getGlobalReplicationsStatus();
-    }
-
-    isCurrentRepoType(type) {
-        return this.currentRepoType == type;
-    }
-
-    /**
-     * Creates the grid according to current repo type, sets draggable according to the global repo status
-     * NOTE: Multi select and batch actions are commented until batch delete repos is approved for prod.
-     */
-    _createGrid() {
-        this.gridOption = this.artifactoryGridFactory.getGridInstance(this.$scope)
-            .setColumns(this._getColumns());
-            //.setMultiSelect()
-            //.setBatchActions(this._getBatchActions())
-        if(this.features.isGlobalRepoEnabled()) {
-            this.gridOption.setDraggable(this.reorderRepositories.bind(this));
-        }
-        else {
-            this.gridOption.setRowTemplate('default');
-        }
-    }
-
-    _initRepos() {
-        this.repositoriesDao.getRepositories({type: this.currentRepoType}).$promise
-                .then((data) => {
-                    _.forEach(data, (row) => {
-                        var rowPackageType =_.find(FIELD_OPTIONS.repoPackageTypes, (type) => {
-                            return type.value == row.repoType.toLowerCase();
-                        });
-                        if (rowPackageType) {
-                            row.displayType = rowPackageType.text;
-                            row.typeIcon = rowPackageType.icon;
-                        } else if (row.repoType.toLowerCase() === FIELD_OPTIONS.REPO_TYPE.DISTRIBUTION) {
-                            row.displayType = "Distribution";
-                            row.typeIcon = "distrepo";
-                        }
-                        else row.ignore = true;
-                    });
-                    data = _.filter(data, (row) => !row.ignore);
-                    this.gridData = data;
-                    this.gridOption.setGridData(data);
-                });
-    }
-
-    reorderRepositories() {
-        return this.repositoriesDao.reorderRepositories({repoType: this.currentRepoType}, this.getRepoOrder()).$promise
-    }
-
-    getRepoOrder() {
-        let repoOrderList = [];
-        this.gridData.forEach((data)=> {
-            repoOrderList.push(data.repoKey);
-        });
-        return repoOrderList;
-    }
-
-    _deleteSelected(row) {
-        this.modal.confirm("Are you sure you wish to delete this repository? All artifacts will be permanently deleted.", 'Delete ' + row.repoKey + " Repository", {confirm: 'Delete'})
-                .then(()=> {
-                    this.repositoriesDao.deleteRepository({
-                        type: this.currentRepoType,
-                        repoKey: row.repoKey
-                    }).$promise.then((result)=> {
-                                this._initRepos();
-                            })
-                });
-    }
-
-    _getBatchActions() {
-        return [
-            {
-                icon: 'clear',
-                name: 'Delete',
-                callback: () => this._deleteSelectedRepos()
-            }
-        ]
-    }
-
-    _deleteSelectedRepos() {
-        let selectedRows = this.gridOption.api.selection.getSelectedGridRows();
-    }
-
-    _editSelected(row) {
-        this.$state.go('^.list.edit', {repoType: this.currentRepoType, repoKey: row.repoKey});
-    }
-
-
-    createNewRepo() {
-        this.$state.go('^.list.new', {repoType: this.currentRepoType});
-    }
-
-    _calculateIndex(row) {
-        this.artifactActionsDao.perform({
-            action: 'calculateIndex',
-            type: row.repoType,
-            repoKey: row.repoKey
-        })
-    }
-
-    localReplicationsRunNow(repoKey) {
-        this.repositoriesDao.runNowReplications({repoKey: repoKey}).$promise.then(()=> {
-        });
-    }
-
-    remoteExecuteReplicationNow(repoKey) {
-        this.repositoriesDao.executeRemoteReplicationNow({repoKey: repoKey},
-                this.repoInfo).$promise.then((result)=> {
-
-                });
-    }
-
-    _getGlobalReplicationsStatus() {
-        this.globalReplicationsConfigDao.status().$promise.then((status) => {
-            this.globalReplicationsStatus = {
-                blockPullReplications: status.blockPullReplications,
-                blockPushReplications: status.blockPushReplications
-            }
-        });
-    }
-
-
-    _getColumns() {
-        switch(this.currentRepoType) {
-            case 'local':
-                return this._getLocalColumns();
-            case 'remote':
-                return this._getRemoteColumns();
-            case 'virtual':
-                return this._getVirtualColumns();
-            case 'distribution':
-                return this._getDistColumns();
-        }
-    }
-
-    _getLocalColumns() {
-        return [
-            {
-                name: 'Repository Key',
-                displayName: 'Repository Key',
-                field: 'repoKey',
-                cellTemplate: '<div class="ui-grid-cell-contents"><a ui-sref="^.list.edit({repoType:\'local\',repoKey: row.entity.repoKey})" id="repositories-local-key">{{COL_FIELD}}</a></div>',
-                width: '55%',
-                enableSorting: !this.features.isGlobalRepoEnabled()
-                //sort: {
-                //    direction: this.uiGridConstants.ASC
-                //}
-            },
-            {
-                name: 'Type',
-                displayName: 'Type',
-                field: 'displayType',
-                cellTemplate: this.commonGridColumns.iconColumn('row.entity.displayType', 'row.entity.typeIcon', 'repo-type-icon'),
-                width: '15%',
-                enableSorting: !this.features.isGlobalRepoEnabled()
-            },
-            {
-                name: 'Recalculate Index',
-                displayName: 'Recalculate Index',
-                field: 'reindex',
-                cellTemplate: '<div class="ui-grid-cell-contents text-center"><a class="grid-column-button icon icon-re-index" ng-click="!row.entity.hasReindexAction || grid.appScope.Repositories._calculateIndex(row.entity)" ng-disabled="!row.entity.hasReindexAction" jf-tooltip="{{row.entity.hasReindexAction ? \'Recalculate Index Now\' : \'Recalculate Not Supported For Repo Type\'}}" id="repositories-local-reindex"></a></div>',
-                width: '15%',
-                enableSorting: false
-            },
-            {
-                name: 'Replications',
-                displayName: 'Replications',
-                field: 'replications',
-                cellTemplate: '<div class="ui-grid-cell-contents text-center" ng-class="{\'replication-disabled\': grid.appScope.Repositories.globalReplicationsStatus.blockPushReplications}"><a class="grid-column-button icon icon-run" ng-click="(!row.entity.replications || grid.appScope.Repositories.globalReplicationsStatus.blockPushReplications) || grid.appScope.Repositories.localReplicationsRunNow(row.entity.repoKey)" ng-disabled="!row.entity.replications" jf-tooltip="{{grid.appScope.R [...]
-                width: '15%',
-                actions: {
-                    delete: row => this._deleteSelected(row)
-                },
-                enableSorting: false
-            }
-        ]
-    }
-
-    _getRemoteColumns() {
-        return [
-            {
-                name: 'Repository Key',
-                displayName: 'Repository Key',
-                field: 'repoKey',
-                cellTemplate: '<div class="ui-grid-cell-contents"><a ui-sref="^.list.edit({repoType:\'remote\',repoKey: row.entity.repoKey})" id="repositories-remote-key">{{COL_FIELD}}</a></div>',
-                width: '20%',
-                enableSorting: !this.features.isGlobalRepoEnabled()
-            },
-            {
-                name: 'Type',
-                displayName: 'Type',
-                field: 'displayType',
-                cellTemplate: this.commonGridColumns.iconColumn('row.entity.displayType', 'row.entity.typeIcon', 'repo-type-icon'),
-                width: '10%',
-                enableSorting: !this.features.isGlobalRepoEnabled()
-            },
-            {
-                name: 'URL',
-                displayName: 'URL',
-                field: 'url',
-                width: '40%',
-                enableSorting: !this.features.isGlobalRepoEnabled()
-            },
-            {
-                name: 'Recalculate Index',
-                displayName: 'Recalculate Index',
-                field: 'reindex',
-                cellTemplate: '<div class="ui-grid-cell-contents text-center"><a class="grid-column-button icon icon-re-index" ng-click="!row.entity.hasReindexAction || grid.appScope.Repositories._calculateIndex(row.entity)" ng-disabled="!row.entity.hasReindexAction" jf-tooltip="{{row.entity.hasReindexAction ? \'Recalculate Index Now\' : \'Recalculate Not Supported For Repo Type\'}}" id="repositories-local-reindex"></a></div>',
-                width: '15%',
-                enableSorting: false
-            },
-            {
-                name: 'Replications',
-                displayName: 'Replications',
-                field: 'hasEnabledReplication',
-                cellTemplate: '<div class="ui-grid-cell-contents text-center" ng-class="{\'replication-disabled\': grid.appScope.Repositories.globalReplicationsStatus.blockPullReplications}"><a class="grid-column-button icon icon-run" ng-click="(!row.entity.hasEnabledReplication || grid.appScope.Repositories.globalReplicationsStatus.blockPullReplications) || grid.appScope.Repositories.remoteExecuteReplicationNow(row.entity.repoKey)" ng-disabled="!row.entity.hasEnabledReplication" jf-tool [...]
-                width: '15%',
-                actions: {
-                    delete: row => this._deleteSelected(row)
-                },
-                enableSorting: false
-            }
-        ]
-    }
-
-    _getVirtualColumns() {
-        return [
-            {
-                name: 'Repository Key',
-                displayName: 'Repository Key',
-                field: 'repoKey',
-                cellTemplate: '<div class="ui-grid-cell-contents"><a ui-sref="^.list.edit({repoType:\'virtual\',repoKey: row.entity.repoKey})" id="repositories-virtual-key">{{COL_FIELD}}</a></div>',
-                width: '20%',
-                enableSorting: !this.features.isGlobalRepoEnabled()
-            },
-            {
-                name: 'Type',
-                displayName: 'Type',
-                field: 'displayType',
-                cellTemplate: this.commonGridColumns.iconColumn('row.entity.displayType', 'row.entity.typeIcon', 'repo-type-icon'),
-                width: '10%',
-                enableSorting: !this.features.isGlobalRepoEnabled()
-            },
-            {
-                name: 'Included Repositories',
-                displayName: 'Included Repositories',
-                field: 'numberOfIncludesRepositories',
-                width: '15%',
-                enableSorting: false
-            },
-            {
-                name: 'Selected Repositories',
-                displayName: 'Selected Repositories',
-                field: 'selectedRepos',
-                cellTemplate: this.commonGridColumns.listableColumn('row.entity.selectedRepos','row.entity.repoKey', null, null, "repositories-virtual-selected"),
-                width: '40%',
-                enableSorting: false
-            },
-            {
-                name: 'Recalculate Index',
-                displayName: 'Recalculate Index',
-                field: 'reindex',
-                cellTemplate: '<div class="ui-grid-cell-contents text-center"><a class="grid-column-button icon icon-re-index" ng-click="!row.entity.hasReindexAction || grid.appScope.Repositories._calculateIndex(row.entity)" ng-disabled="!row.entity.hasReindexAction" jf-tooltip="{{row.entity.hasReindexAction ? \'Recalculate Index Now\' : \'Recalculate Not Supported For Repo Type\'}}" id="repositories-virtual-reindex"></a></div>',
-                width: '15%',
-                actions: {
-                    delete: row => this._deleteSelected(row)
-                },
-                enableSorting: false
-            }
-        ];
-    }
-
-    _getDistColumns() {
-        return [
-            {
-                name: 'Repository Key',
-                displayName: 'Repository Key',
-                field: 'repoKey',
-                cellTemplate: '<div class="ui-grid-cell-contents"><a ui-sref="^.list.edit({repoType:\'distribution\',repoKey: row.entity.repoKey})" id="repositories-local-key">{{COL_FIELD}}</a></div>',
-                width: '85%',
-                enableSorting: true
-            },
-            {
-                name: 'Repository Visibility',
-                displayName: 'Repository Visibility',
-                field: 'visibility',
-                cellTemplate: '<div class="ui-grid-cell-contents">{{row.entity.visibility}}</div>',
-                width: '15%',
-                enableSorting: true,
-                actions: {
-                    delete: row => this._deleteSelected(row)
-                }
-            }
-        ];
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/repositories/repositories.html b/web/angular-web/src/main/webapp/app/states/admin/repositories/repositories.html
deleted file mode 100644
index 134f10f..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/repositories/repositories.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<div class="content-layout-container">
-    <h1 id="repositories-header">{{ Repositories.currentRepoType | capitalize }} Repositories</h1>
-
-    <div class="content-wrapper">
-        <div class="card stretch card-pole-pad card-side-pad">
-            <p ng-if="Repositories.currentRepoType == 'distribution'">Distribution repositories can be used to distribute your products or packages with <a href="https://bintray.com" target="_blank">JFrog Bintray</a> - the universal distribution platform.</p>
-            <div class="pull-right admin-grid-buttons">
-                <a ng-click="Repositories.createNewRepo()" id="repositories-new">
-                    <i class="grid-button-icon icon icon-new"></i>New
-                </a>
-            </div>
-            <jf-grid
-                    grid-options="Repositories.gridOption"
-                    filter-field="repoKey"
-                    filter-field2="repoType"
-                    filter-on-change="true"
-                    object-name="repository/repositories"
-                    auto-focus="true">
-            </jf-grid>
-        </div>
-    </div>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/states/admin/repositories/repositories.module.js b/web/angular-web/src/main/webapp/app/states/admin/repositories/repositories.module.js
deleted file mode 100644
index aa7c22a..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/repositories/repositories.module.js
+++ /dev/null
@@ -1,66 +0,0 @@
-import {AdminRepositoriesController} from './repositories.controller';
-import {AdminRepositoryFormController} from './repository_form.controller';
-import {VirtualRepositoryFormController} from './virtual_repository_form.controller';
-import {AdminRepositoriesLayoutController} from './repositories_layouts.controller';
-import {AdminRepositoryLayoutFormController} from './repository_layout_form.controller';
-
-function repositoriesConfig($stateProvider) {
-    $stateProvider
-        // base state
-        .state('admin.repositories', {
-            url: '',
-            abstract: true,
-            template: '<ui-view></ui-view>'
-        })
-
-        // repository list and forms
-        .state('admin.repositories.list', {
-            url: '/repositories/{repoType}',
-            templateUrl: 'states/admin/repositories/repositories.html',
-            controller: 'AdminRepositoriesController as Repositories'
-        })
-        .state('admin.repositories.list.edit', {
-            parent: 'admin.repositories',
-            url: '/repository/{repoType}/{repoKey}/edit',
-            templateUrl: 'states/admin/repositories/repository_form.html',
-            controller: 'AdminRepositoryFormController as RepositoryForm'
-        })
-        .state('admin.repositories.list.new', {
-            parent: 'admin.repositories',
-            url: '/repository/{repoType}/new',
-            templateUrl: 'states/admin/repositories/repository_form.html',
-            controller: 'AdminRepositoryFormController as RepositoryForm'
-        })
-
-        // repository layout list and forms
-        .state('admin.repositories.repo_layouts', {
-            url: '/repo_layouts',
-            templateUrl: 'states/admin/repositories/repositories_layouts.html',
-            controller: 'AdminRepositoriesLayoutController as RepositoriesLayoutController'
-        })
-        .state('admin.repositories.repo_layouts.edit', {
-            parent: 'admin.repositories',
-            url: '/repo_layouts/{layoutname}/edit',
-            templateUrl: 'states/admin/repositories/repository_layout_form.html',
-            controller: 'AdminRepositoryLayoutFormController as RepositoryLayoutForm',
-            params: {viewOnly: true}
-        })
-        .state('admin.repositories.repo_layouts.new', {
-            parent: 'admin.repositories',
-            url: '/repo_layouts/new?copyFrom',
-            templateUrl: 'states/admin/repositories/repository_layout_form.html',
-            controller: 'AdminRepositoryLayoutFormController as RepositoryLayoutForm'
-        })
-
-}
-
-export default angular.module('admin.repositories', [])
-    .config(repositoriesConfig)
-    .controller('AdminRepositoriesController', AdminRepositoriesController)
-    .controller('AdminRepositoryFormController', AdminRepositoryFormController)
-    .controller('VirtualRepositoryFormController', VirtualRepositoryFormController)
-    .controller('AdminRepositoriesLayoutController', AdminRepositoriesLayoutController)
-    .controller('AdminRepositoryLayoutFormController', AdminRepositoryLayoutFormController);
-
-
-
diff --git a/web/angular-web/src/main/webapp/app/states/admin/repositories/repositories_layouts.controller.js b/web/angular-web/src/main/webapp/app/states/admin/repositories/repositories_layouts.controller.js
deleted file mode 100644
index e650860..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/repositories/repositories_layouts.controller.js
+++ /dev/null
@@ -1,86 +0,0 @@
-export class AdminRepositoriesLayoutController {
-
-    constructor($scope,$state, ArtifactoryGridFactory, RepositoriesLayoutsDao, uiGridConstants, ArtifactoryFeatures, ArtifactoryModal) {
-        this.$scope = $scope;
-        this.$state = $state;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.layoutsDao = RepositoriesLayoutsDao;
-        this.gridOptions = {};
-        this.modal = ArtifactoryModal;
-        this.uiGridConstants = uiGridConstants;
-        this.enableNew = ArtifactoryFeatures.getCurrentLicense() !== 'OSS';
-
-        this._createGrid();
-        this._getLayouts();
-    }
-
-    _createGrid() {
-        this.gridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-            .setColumns(this.getColumns())
-            .setButtons(this.getActions())
-            .setRowTemplate('default');
-
-    }
-
-
-    _getLayouts() {
-        this.layoutsDao.getLayouts().$promise.then((data)=>{
-            this.gridOptions.setGridData(data);
-        });
-
-    }
-
-    getColumns() {
-        return [
-            {
-                field: "name",
-                sort: {
-                    direction: this.uiGridConstants.ASC
-
-                },
-                name: "Name",
-                displayName: "Name",
-                cellTemplate: '<div class="ui-grid-cell-contents" id="layout-name" ui-sref="^.repo_layouts.edit({layoutname: row.entity.name,viewOnly: !row.entity.layoutActions.edit})" ><a href="">{{row.entity.name}}</a></div>',
-                width: '15%'
-            },
-            {
-                field: "artifactPathPattern",
-                name: "Artifact Path Pattern",
-                displayName: "Artifact Path Pattern",
-                cellTemplate: '<div class="ui-grid-cell-contents" id="artifact-pattern">{{row.entity.artifactPathPattern}}</div>',
-                width: '85%'
-            }
-        ]
-    }
-
-    copyLayout(row) {
-        this.$state.go('^.repo_layouts.new',{copyFrom: row.name});
-    }
-
-    deleteLayout(row) {
-        this.modal.confirm(`Are you sure you want to delete layout '${row.name}?'`).then(()=>{
-            this.layoutsDao.deleteLayout({},{layoutName: row.name}).$promise.then((data)=>{
-                this._getLayouts();
-            });
-        });
-    }
-
-    getActions() {
-        return [
-            {
-                icon: 'icon icon-copy',
-                tooltip: 'Duplicate',
-                callback: (row) => this.copyLayout(row),
-                visibleWhen: (row) => row.layoutActions.copy
-            },
-            {
-                icon: 'icon icon-clear',
-                tooltip: 'Delete',
-                callback: (row) => this.deleteLayout(row),
-                visibleWhen: (row) => row.layoutActions.delete
-            }
-
-        ];
-    }
-
-}
diff --git a/web/angular-web/src/main/webapp/app/states/admin/repositories/repositories_layouts.html b/web/angular-web/src/main/webapp/app/states/admin/repositories/repositories_layouts.html
deleted file mode 100644
index db1380a..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/repositories/repositories_layouts.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<div class="content-layout-container">
-    <h1>Repository Layouts</h1>
-
-    <div class="content-wrapper">
-        <div class="card stretch card-pole-pad card-side-pad">
-            <div class="pull-right admin-grid-buttons">
-                <a ui-sref="^.repo_layouts.new" ng-if="RepositoriesLayoutController.enableNew">
-                    <i class="grid-button-icon icon icon-new"></i>New
-                </a>
-            </div>
-
-            <jf-grid grid-options="RepositoriesLayoutController.gridOptions"
-                     filter-field="name"
-                     object-name="repository layout"
-                     auto-focus="true"></jf-grid>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/repositories/repository_form.controller.js b/web/angular-web/src/main/webapp/app/states/admin/repositories/repository_form.controller.js
deleted file mode 100644
index 367db1a..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/repositories/repository_form.controller.js
+++ /dev/null
@@ -1,1419 +0,0 @@
-import fieldsValuesDictionary from "../../../constants/field_options.constats";
-import TOOLTIP from "../../../constants/artifact_tooltip.constant";
-
-export class AdminRepositoryFormController {
-    constructor($q, $scope, $stateParams, $state, $timeout, $location, RepositoriesDao, PropertySetsDao, ArtifactoryGridFactory, ReverseProxiesDao,
-            ArtifactoryModal, ArtifactoryFeatures, ArtifactoryNotifications, commonGridColumns,ArtifactoryModelSaver, GeneralConfigDao, DockerStatusDao, GlobalReplicationsConfigDao) {
-        this.$scope = $scope;
-        this.$q = $q;
-        this.currentTab = 'basic';
-        this.$timeout = $timeout;
-        this.$stateParams = $stateParams;
-        this.$location = $location;
-        this.propertySetsDao = PropertySetsDao;
-        this.globalReplicationsConfigDao = GlobalReplicationsConfigDao;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.commonGridColumns = commonGridColumns;
-        this.notifications = ArtifactoryNotifications;
-        this.modal = ArtifactoryModal;
-        this.generalConfigDao = GeneralConfigDao;
-        this.NO_VALUE_STRING = '** NO VALUE **';
-        this.$state = $state;
-        this.repositoriesDao = RepositoriesDao;
-        this.reverseProxiesDao = ReverseProxiesDao;
-        this.newRepository = false;
-        this.features = ArtifactoryFeatures;
-        this.replicationsGridOption = {};
-        this.replicationScope = $scope.$new();
-        this.TOOLTIP = TOOLTIP.admin.repositories;
-        this.DockerStatusDao = DockerStatusDao.getInstance();
-        this.artifactoryModelSaver = ArtifactoryModelSaver.createInstance(this,['repoInfo'],['replications.*.proxies']);
-        this.reverseProxies = ["**"];
-
-        this.reverseProxiesSelectizeConfig = {
-            sortField: 'text',
-            create: false,
-            maxItems: 1
-        };
-        this._setupDistribution();
-        this.licensesListConfig = {
-            sortField: 'text',
-            maxItems: null,
-            plugins: ['remove_button']
-        };
-
-        this._createGrid();
-        this.initRepoForm();
-        this.repoType = this.$stateParams.repoType;
-        if (this.$stateParams.repoKey) {
-            this.title = "Edit " + this.$stateParams.repoKey + " Repository";
-            this.newRepository = false;
-            this.editRepository(this.$stateParams.repoKey);
-        }
-        else {
-            this.newRepository = true;
-            this.repoInfo = new RepositoriesDao();
-            this.title = "New " + _.capitalize(this.repoType) + " Repository";
-            this._initNewRepositoryTypeConfig();
-
-            if (this.repoType == fieldsValuesDictionary.REPO_TYPE.REMOTE) {
-                if (!this.repoInfo.basic) {
-                    this.repoInfo.basic = {};
-                    this.repoInfo.basic.contentSynchronisation = {};
-                    this.repoInfo.basic.contentSynchronisation.statistics = {};
-                    this.repoInfo.basic.contentSynchronisation.properties = {};
-                }
-                this.repoInfo.basic.contentSynchronisation.enabled = false;
-                this.repoInfo.basic.contentSynchronisation.statistics.enabled = false;
-                this.repoInfo.basic.contentSynchronisation.properties.enabled = false;
-            }
-
-        }
-        this.packageType = fieldsValuesDictionary.repoPackageTypes;
-
-        this._getBaseUrl();
-        this._getGlobalReplicationsStatus();
-
-
-    }
-
-    isCurrentRepoType(type) {
-        return this.repoType == type;
-    }
-
-    /**
-     * init propertiesSets  and replication scope functions for modal and fields options
-     */
-    initRepoForm() {
-        this.replicationScope.replication = {}; //to create a single replication
-        this.replicationScope.testLocalReplicationUrl = (url)=>this.testLocalReplicationUrl(url);
-
-        this.replicationScope.addReplication = (replication)=> this.addReplication(replication);
-        this.replicationScope.closeModal = ()=>this.closeModal();
-        this.replicationScope.RepositoryForm = this;
-    }
-
-    /**
-     * run only if edit repository and get repository data
-     */
-    editRepository(repoKey) {
-        this.repositoriesDao.getRepository({type: this.repoType, repoKey: repoKey}).$promise
-                .then(info => {
-                    this.repoInfo = info;
-
-                    this.repoInfo.basic.includesPatternArray = this.repoInfo.basic.includesPattern ? this.repoInfo.basic.includesPattern.split(',') : [];
-                    this.repoInfo.basic.excludesPatternArray = this.repoInfo.basic.excludesPattern ? this.repoInfo.basic.excludesPattern.split(',') : [];
-
-                    if (this.repoInfo.typeSpecific.repoType === "Docker" && !this.features.isAol() && !this.features.isOss()) {
-                        this._getReveresProxyConfigurations();
-                    }
-
-                    //console.log(info);
-                    if (this.repoInfo.replications && this.repoInfo.replications.length) {
-                        this.repoInfo.cronExp = this.repoInfo.replications[0].cronExp;
-                        this.repoInfo.enableEventReplication = this.repoInfo.replications[0].enableEventReplication;
-                    }
-                    if (this.repoType.toLowerCase() == fieldsValuesDictionary.REPO_TYPE.VIRTUAL) {
-                        this._getRepositoriesByType();
-                    }
-                    if (this.repoType == fieldsValuesDictionary.REPO_TYPE.REMOTE && this.repoInfo.replications) {
-                        this.repoInfo.replication = this.repoInfo.replications[0];
-                    }
-                    else {
-                        this.replicationsGridOption.setGridData(this.repoInfo.replications);
-                    }
-                    this._getFieldsOptions();
-
-                    if (this.repoType == fieldsValuesDictionary.REPO_TYPE.REMOTE) {
-                        this._detectSmartRepository(false).then(()=>{
-                            this.lastSmartRemoteURL = this.repoInfo.basic.url;
-                        });
-                    }
-                    if (this.repoType == fieldsValuesDictionary.REPO_TYPE.DISTRIBUTION) {
-
-                        if (!this.repoInfo.typeSpecific.authenticated && this.$location.search().code) {
-                            this.openBintrayOAuthModal();
-                        }
-
-                        this.defaultNewRepoPrivateSwitch = this.repoInfo.basic.defaultNewRepoPrivate == true ? 'Private' : 'Public';
-                        this.distributionType = this.repoInfo.basic.productName == null ? false : true;
-                        this.distributionRules = this.repoInfo.advanced.distributionRules;
-                        if (this.features.isOss()) {
-                            this.distributionRules = _.filter(this.distributionRules,(rule=> {
-                                return _.contains(['Maven', 'Gradle', 'Ivy', 'SBT'],rule.type)
-                            }))
-                        }
-                        this._createDistributionRulesGrid(); // Edit
-                        this._setupLicenses();
-                        this._setRulesPackages();
-                    }
-                    this.repoInfo.basic.selectedLocalRepositories = _.pluck(_.filter(this.repoInfo.basic.resolvedRepositories, (repo)=>{
-                        return repo.type === 'local';
-                    }),'repoName');
-                    this.repoInfo.basic.selectedRemoteRepositories = _.pluck(_.filter(this.repoInfo.basic.resolvedRepositories, (repo)=>{
-                        return repo.type === 'remote';
-                    }),'repoName');
-                    this.repoInfo.basic.selectedLocalRepositories.unshift('');
-
-                    this.artifactoryModelSaver.save();
-
-                });
-
-    }
-
-    _setDefaultProxy() {
-        if (this.newRepository && this.fields.defaultProxy && _.has(this.repoInfo, 'advanced.network')) {
-            !this.repoInfo.advanced.network.proxy ?
-                    this.repoInfo.advanced.network.proxy = this.fields.defaultProxy : '';
-        }
-    }
-
-    /**
-     *test button  when adding new replication in local repository
-     */
-    testLocalReplicationUrl(url) {
-        // Create a copy of the repo
-        let testRepo = angular.copy(this.repoInfo);
-
-        // Make sure replications is not null
-        testRepo.replications = testRepo.replications || [];
-
-        let testReplication;
-        if (this.replicationScope.sourceReplication) {
-            testReplication = _.findWhere(testRepo.replications, {url: this.replicationScope.sourceReplication.url});
-            angular.copy(this.replicationScope.replication, testReplication);
-        }
-        else {
-            testReplication = angular.copy(this.replicationScope.replication);
-            testRepo.replications.push(testReplication);
-        }
-
-        testReplication.cronExp = this.repoInfo.cronExp;
-        testReplication.nextTime = this.repoInfo.nextTime;
-        testReplication.type = this.repoType;
-        testReplication.enableEventReplication = this.repoInfo.enableEventReplication;
-
-        this.repositoriesDao.testLocalReplication({replicationUrl: url}, testRepo);
-    }
-
-    testRemoteUrl() {
-        this.repositoriesDao.testRemoteUrl(this.repoInfo).$promise.then((result)=> {
-            //console.log(result);
-        });
-
-        this._detectSmartRepository();
-    }
-
-    _detectSmartRepository(showModal=true) {
-        if (this.features.isOss()) {
-            return this.$q.when();
-        }
-
-        let defer = this.$q.defer();
-        this.smartRepoUnknownCapabilities = false;
-
-        let repoInfoCopy = angular.copy(this.repoInfo);
-        if (!repoInfoCopy.typeSpecific.repoType) {
-            repoInfoCopy.typeSpecific.repoType = "Generic";
-        }
-
-        this.repositoriesDao.detectSmartRepository(repoInfoCopy).$promise.then((result)=> {
-            if (result.artifactory && result.version && result.features.length) {
-                if (!this.repoInfo.basic.contentSynchronisation.enabled || this.repoInfo.basic.url != this.lastSmartRemoteURL) {
-                    this.repoInfo.basic.contentSynchronisation.enabled = true;
-                    this.lastSmartRemoteURL = this.repoInfo.basic.url;
-                    this.smartRepoFeatures = result.features;
-
-                    if (localStorage.disableSmartRepoPopup !== "true" && showModal) {
-                        let modalInstance;
-                        let modalScope = this.$scope.$new();
-                        modalScope.smartRepo = this.repoInfo.basic.contentSynchronisation;
-                        modalScope.smartRepo.typeSpecific = this.repoInfo.typeSpecific;
-                        modalScope.closeModal = () => modalInstance.close();
-                        modalScope.options = {dontShowAgain: false};
-                        modalScope.isSmartRepoSupportFeature = (featureName) => this.isSmartRepoSupportFeature(featureName);
-                        modalScope.onDontShowAgain = () => {
-                            localStorage.disableSmartRepoPopup = modalScope.options.dontShowAgain;
-                        };
-                        modalInstance = this.modal.launchModal('smart_remote_repository', modalScope);
-                    }
-
-                    defer.resolve(true);
-                }
-                else
-                    defer.resolve(false);
-            }
-            else {
-                if (result.artifactory && result.version === null) {
-                    this.smartRepoUnknownCapabilities = true;
-                }
-                this.repoInfo.basic.contentSynchronisation.enabled = false;
-                defer.resolve(false);
-            }
-        });
-
-        return defer.promise;
-    }
-
-    isSmartRepoSupportFeature(featureName) {
-        return _.findWhere(this.smartRepoFeatures,{name: featureName}) !== undefined;
-    }
-
-    onBlurCredentials() {
-        if (this.smartRepoUnknownCapabilities && this.repoInfo.advanced.network.username && this.repoInfo.advanced.network.password) {
-            this._detectSmartRepository();
-        }
-    }
-    testRemoteReplication() {
-        this.addReplication(this.repoInfo.replication);
-        this.repositoriesDao.testRemoteReplication(this.repoInfo).$promise.then((result)=> {
-            //            console.log(result);
-        });
-    }
-
-    setSnapshotVersionBehavior() {
-        if (this.repoInfo && this.repoInfo.typeSpecific && this.repoInfo.typeSpecific.snapshotVersionBehavior) {
-            if (this.repoInfo.typeSpecific.snapshotVersionBehavior == 'NONUNIQUE') {
-                this.repoInfo.typeSpecific.maxUniqueSnapshots = 0;
-                this.disableMaxUniqueSnapshots = true;
-            }
-            else {
-                this.disableMaxUniqueSnapshots = false;
-            }
-        }
-    }
-
-    _initNewRepositoryTypeConfig() {
-        if (this.repoType == fieldsValuesDictionary.REPO_TYPE.LOCAL) {
-            this.repoInfo.type = 'localRepoConfig';
-        }
-        if (this.repoType == fieldsValuesDictionary.REPO_TYPE.REMOTE) {
-            this.repoInfo.type = 'remoteRepoConfig';
-        }
-        if (this.repoType == fieldsValuesDictionary.REPO_TYPE.VIRTUAL) {
-            this.repoInfo.type = 'virtualRepoConfig';
-        }
-        if (this.repoType == fieldsValuesDictionary.REPO_TYPE.DISTRIBUTION) {
-            this.repoInfo.type = 'distributionRepoConfig';
-        }
-
-        this._getDefaultModels()
-            .then(()=> {
-                this._getFieldsOptions()
-                    .then(()=> {
-                        this._setDefaultFields();
-                        if (this.repoType == fieldsValuesDictionary.REPO_TYPE.DISTRIBUTION) {
-                            this.openBintrayOAuthModal();
-                        } else {
-                            this.openRepoTypeModal();
-                        }
-                    });
-
-                if (this.repoType == fieldsValuesDictionary.REPO_TYPE.LOCAL) {
-                    this.repoInfo.type = 'localRepoConfig';
-                }
-                if (this.repoType == fieldsValuesDictionary.REPO_TYPE.REMOTE) {
-                    this.repoInfo.type = 'remoteRepoConfig';
-                }
-                if (this.repoType == fieldsValuesDictionary.REPO_TYPE.VIRTUAL) {
-                    this.repoInfo.type = 'virtualRepoConfig';
-                }
-            });
-
-
-
-    }
-
-    /**
-     * get all properties
-     */
-    _populateProperties() {
-        return this.propertySetsDao.query({isRepoForm: true}).$promise.then((properites)=> {
-            this.propertiesList = properites;
-        });
-    }
-
-    /**
-     * set dropdown options and default fields
-     */
-    _getFieldsOptions() {
-        return this.repositoriesDao.getAvailableChoicesOptions().$promise.then((fields)=> {
-            this.fields = fields;
-            this.localChecksumPolicies = fieldsValuesDictionary['localChecksumPolicy'];
-            this.localChecksumPoliciesKeys = Object.keys(this.localChecksumPolicies);
-            this.remoteChecksumPolicies = fieldsValuesDictionary['remoteChecksumPolicy'];
-            this.remoteChecksumPoliciesKeys = Object.keys(fieldsValuesDictionary['remoteChecksumPolicy']);
-            fields.proxies = fields.proxies || [];
-            fields.proxies.unshift('');
-            this.repositoryLayouts = _.sortBy(fields.repositoryLayouts,(layout) => layout);
-
-            if (this.repoType.toLowerCase() == fieldsValuesDictionary.REPO_TYPE.VIRTUAL) {
-                this.repositoryLayouts.unshift('');
-            }
-            if (this.repoType.toLowerCase() == fieldsValuesDictionary.REPO_TYPE.DISTRIBUTION) {
-                this.ruleTokensByType = fields.distributionTokensByType;
-                this.ruleTokensByLayout = fields.distributionTokensByLayout;
-                this.ruleTokensByLayoutKeys = Object.keys(this.ruleTokensByLayout);
-
-                this.distributionDefaultRules = fields.distributionDefaultRules;
-                if (this.features.isOss()) {
-                    this.distributionDefaultRules = _.filter(this.distributionDefaultRules,(rule=> {
-                        return _.contains(['Maven', 'Gradle', 'Ivy', 'SBT'],rule.type)
-                    }))
-                }
-
-                this.distributionDefaultProductRules = fields.distributionDefaultProductRules;
-
-                if (this.newRepository) {
-                    this.repoInfo.type = 'distributionRepoConfig';
-                    this.distributionRules = this.distributionDefaultRules;
-                    this._createDistributionRulesGrid();    // NEW
-                }
-
-            }
-
-            this.remoteLayoutMapping = angular.copy(fields.repositoryLayouts);
-            this.remoteLayoutMapping.unshift('');
-            this.mavenSnapshotRepositoryBehaviors = fieldsValuesDictionary['snapshotRepositoryBehavior'];
-            this.mavenSnapshotRepositoryBehaviorsKeys = Object.keys(fieldsValuesDictionary['snapshotRepositoryBehavior']);
-            this.pomCleanupPolicies = fieldsValuesDictionary['pomCleanupPolicy'];
-            this.pomCleanupPoliciesKeys = Object.keys(fieldsValuesDictionary['pomCleanupPolicy']);
-            this.vcsGitProviderOptions = fieldsValuesDictionary['vcsGitProvider'];
-            this.vcsGitProviderOptionsKeys = Object.keys(fieldsValuesDictionary['vcsGitProvider']);
-            this.setSnapshotVersionBehavior();
-            return this._populateProperties();
-        });
-    }
-
-    /**
-     * fetching from server the default data
-     */
-    _getDefaultModels() {
-        return this.repositoriesDao.getDefaultValues().$promise.then((models)=> {
-            this.defaultModels = models.defaultModels;
-        });
-
-    }
-
-
-    /**
-     * check and set current tab
-     */
-    setCurrentTab(tab) {
-        if (this.features.isDisabled(tab)) {
-            return;
-        }
-        this.currentTab = tab;
-    }
-
-    isCurrentTab(tab) {
-        return this.currentTab === tab;
-    }
-
-    /**
-     * handle save or update click
-     */
-    save() {
-        this.repoInfo.basic.includesPattern = this.repoInfo.basic.includesPatternArray.join(',') || undefined;
-        this.repoInfo.basic.excludesPattern = this.repoInfo.basic.excludesPatternArray.join(',') || undefined;
-
-        if (this.repoType == fieldsValuesDictionary.REPO_TYPE.LOCAL) {
-            if (this.repoInfo.replications && this.repoInfo.replications.length) {
-                this.saveCronAndEventFlagToAllReplicationsAndValidateHa();
-            }
-            //Warn user if saving cron expression without any replication config
-            if (this.repoInfo.cronExp && (!this.repoInfo.replications || !this.repoInfo.replications.length)) {
-                this.notifications.create({warn: 'A cron expression was entered without any replication configuration.'
-                + '\nThe expression will not be saved.'
-                });
-            }
-        }
-
-        if (this.repoType == fieldsValuesDictionary.REPO_TYPE.REMOTE) {
-            this._detectSmartRepository().then((result) => {
-                if (!result) {
-
-                }
-            });
-
-            //Add replication if exists:
-            if (this.repoInfo.replication) {
-                if (this.repoInfo.cronExp && this.repoInfo.replication.enabled
-                    && (!this.repoInfo.advanced.network.username || !this.repoInfo.advanced.network.password)) {
-                    this.notifications.create({
-                        error: 'Pull replication requires non-anonymous authentication to the ' +
-                        'remote repository.\nPlease make sure to fill the \'Username\' and \'Password\' fields in the '
-                        + 'Advanced settings tab or remove the fields you filled in the replication tab.'
-                    });
-                    return false;
-                }
-                this.addReplication(this.repoInfo.replication);
-            }
-
-            if (this.repoInfo.advanced.network.proxy === '') {
-                delete this.repoInfo.advanced.network.proxy;
-            }
-        }
-        if (this.repoType == fieldsValuesDictionary.REPO_TYPE.DISTRIBUTION) {
-            this.repoInfo.advanced.distributionRules = this.distributionRules;
-        }
-        this.save_update();
-    }
-
-    /**
-     * save or update wizard form
-     */
-    save_update(recursed = false,changeState = true) {
-
-        let defer = this.$q.defer();
-
-        if (!recursed && this.repoInfo.isType('cocoapods') && this.baseUrl === this.NO_VALUE_STRING) {
-            this._showUrlBaseAlert().then((gotoGenConf)=>{
-                if (gotoGenConf) {
-                    this.save_update(true).then(()=>{
-                        this.$state.go('admin.configuration.general',{focusOnBaseUrl: true});
-                    });
-                }
-                else {
-                    this.save_update(true);
-                }
-            });
-        }
-        else {
-            if (this.newRepository) {
-                this.repositoriesDao.save(this.repoInfo).$promise.then((result)=> {
-                    this.artifactoryModelSaver.save();
-
-                    if (this.repoInfo.typeSpecific.repoType === "Docker" && this.features.isAol()) {
-                        let modalScope = this.$scope.$new();
-
-
-                        let dockerData = {
-                            repoKey : this.repoInfo.general.repoKey,
-                            packageType: this.repoType
-                        }
-
-                        this.DockerStatusDao.get({repoKey: dockerData.repoKey}).$promise.then((data) => {
-                            dockerData.hostname = data.hostname;
-                            dockerData.dockerPath = data.hostname + '-' + dockerData.repoKey + '.jfrog.io';
-                            dockerData.noDeployToLocal = !this.repoInfo.basic.defaultDeploymentRepo;
-
-                            switch(dockerData.packageType) {
-                                case 'local':
-                                    dockerData.snippets = [
-                                        {message: "According to the repository permission, you will need to login to your repository with docker login command", snippet: "docker login " + dockerData.dockerPath},
-                                        {message: "Pull an image.", snippet: "docker pull hello-world"},
-                                        {message: "Tag an image.", snippet: "docker tag hello-world " + dockerData.dockerPath + "/hello-world"},
-                                        {message: "Then push it to your repository.", snippet: "docker push " + dockerData.dockerPath + "/hello-world"}
-                                    ];
-                                    break;
-                                case 'remote':
-                                    dockerData.snippets = [
-                                        {message: "According to the repository permission, you will need to login to your repository with docker login command", snippet: "docker login " + dockerData.dockerPath},
-                                        {message: "Pull an image from your repository.", snippet: "docker pull " + dockerData.dockerPath + "/hello-world"}
-                                    ];
-                                    break;
-                                case 'virtual':
-                                    if (!dockerData.noDeployToLocal){
-                                        dockerData.snippets = [
-                                            {message: "According to the repository permission, you will need to login to your repository with docker login command", snippet: "docker login " + dockerData.dockerPath},
-                                            {message: "Pull an image.", snippet: "docker pull hello-world"},
-                                            {message: "And to test deploy to virtual, tag an image.", snippet: "docker tag hello-world " + dockerData.dockerPath + "/hello-world"},
-                                            {message: "Then push it.", snippet: "docker push " + dockerData.dockerPath + "/hello-world"},
-                                            {message: "To pull an image from your repository.", snippet: "docker pull " + dockerData.dockerPath + "/hello-world"}
-                                        ];
-                                    } else {
-                                        dockerData.snippets = [
-                                            {message: "According to the repository permission, you will need to login to your repository with docker login command", snippet: "docker login " + dockerData.dockerPath},
-                                            {message: "Pull an image from your repository.", snippet: "docker pull " + dockerData.dockerPath + "/hello-world"}
-                                        ];
-                                    }
-                                    break;
-                            }
-
-                            modalScope.dockerData = dockerData;
-
-                            this.dockerPopup = this.modal.launchModal('new_docker_modal', modalScope).result;
-                            this.dockerPopup.finally(()=>{
-                                if (changeState) this.$state.go('^.list', {repoType: this.repoType});
-                            });
-                        });
-                    }
-                    else if (changeState) this.$state.go('^.list', {repoType: this.repoType});
-                    defer.resolve();
-                });
-            } else {
-                this.repositoriesDao.update(this.repoInfo).$promise.then((result)=> {
-                    this.artifactoryModelSaver.save();
-                    if (changeState) this.$state.go('^.list', {repoType: this.repoType});
-                    defer.resolve();
-                });
-            }
-        }
-
-        return defer.promise;
-    }
-
-    _showUrlBaseAlert() {
-        let modalScope = this.$scope.$new();
-        modalScope.context = 'cocoapods';
-        return this.modal.launchModal('base_url_alert_modal', modalScope, 'md').result;
-    }
-
-    /**
-     * button pre and  forward at the bottom page
-     */
-    prevStep() {
-        if (this.currentTab == 'advanced') {
-            this.setCurrentTab('basic');
-        }
-        else if (this.currentTab == 'replications') {
-            this.setCurrentTab('advanced');
-        }
-        else if (this.currentTab == 'rules') {
-            this.setCurrentTab('advanced');
-        }
-    }
-
-    fwdStep() {
-        if (this.currentTab == 'basic') {
-            this.setCurrentTab('advanced');
-            return;
-        }
-        if (this.currentTab == 'advanced' && this.repoType != fieldsValuesDictionary.REPO_TYPE.VIRTUAL && this.repoType != fieldsValuesDictionary.REPO_TYPE.DISTRIBUTION) {
-            this.setCurrentTab('replications');
-        }
-        if (this.currentTab == 'advanced' && this.repoType == fieldsValuesDictionary.REPO_TYPE.DISTRIBUTION) {
-            this.setCurrentTab('rules');
-        }
-    }
-
-    /**
-     * function for select package type
-     */
-    openRepoTypeModal() {
-        this.$repoTypeScope = this.$scope.$new();
-        this.$repoTypeScope.packageTypes = this.getPackageType();
-        this.$repoTypeScope.highlightCheck = (typeFilter,type) => {
-            if (typeFilter) {
-                let string = type.value,
-                searchstring = typeFilter.toLowerCase().replace(/ /g,'');
-
-
-                if (string.substr(0, searchstring.length) == searchstring) {
-                    type.highlighted = true;
-                    return true;
-                } else {
-                    type.highlighted = false;
-                    return false;
-                };
-            }
-        };
-        this.$repoTypeScope.checkNoResults = (typeFilter) => {
-            if (typeFilter && typeFilter.length > 0 && _.filter(this.packageType,(type)=>type.highlighted).length == 0) {
-                return true;
-            }
-        };
-        this.$repoTypeScope.isSelected = () => {
-            let HighlightedListItems = _.filter(this.packageType,(type)=>type.highlighted);
-            if (HighlightedListItems.length == 1) {
-                return true;
-            }
-        };
-        this.$repoTypeScope.selectPackage = () => {
-            let selectedItem = _.filter(this.packageType,(type)=>type.highlighted);
-            if (selectedItem.length == 1) {
-                this.selectRepoType(selectedItem[0])
-            }
-        }
-        this.$repoTypeScope.closeModal = () =>  this.closeModalPackageType();
-        this.$repoTypeScope.modalClose = ()=> this.modalClose();
-        this.$repoTypeScope.selectRepoType = (type)=>this.selectRepoType(type);
-        this.isTypeModalOpen = true;
-
-        this.repoTypeModal = this.modal.launchModal('repository_type_modal', this.$repoTypeScope, 795);
-        this.repoTypeModal.result.finally(() => {
-            this.repositoriesForm.repoKey.$validate();
-            this.isTypeModalOpen = false;
-        });
-    }
-
-    openBintrayOAuthModal() {
-        this.$bintrayAuthScope = this.$scope.$new();
-        //Stuff for outgoing request
-        this.$bintrayAuthScope.isBackFromBintray = this.$location.search().code;
-        this.$bintrayAuthScope.bintrayBaseUrl = this.repoInfo.typeSpecific.bintrayBaseUrl;
-        this.$bintrayAuthScope.redirectUrl = encodeURIComponent(this.$location.absUrl());
-
-        if (this.$bintrayAuthScope.isBackFromBintray) {
-            this.$bintrayAuthScope.redirectUrl = encodeURIComponent(this.$location.absUrl().split('?')[0]);
-            //this.$bintrayAuthScope.redirectUrl = encodeURIComponent(this.$location.absUrl().substring(0, this.$location.absUrl().indexOf('?')));
-        } else {
-            this.$bintrayAuthScope.redirectUrl = encodeURIComponent(this.$location.absUrl());
-        }
-
-        this.$bintrayAuthScope.config = {bintraySecretString : ''};
-        this.$bintrayAuthScope.saveBintrayAuthInModel = () => this.saveBintrayAuthInModel(this.$bintrayAuthScope.config.bintraySecretString);
-        this.isBintrayModalOpen = true;
-
-        this.bintrayAuthModal = this.modal.launchModal('bintray_oauth_modal', this.$bintrayAuthScope, 600);
-        this.bintrayAuthModal.result.then(() => {
-            this.isBintrayModalOpen = false;
-            this.repositoriesForm.repoKey.$validate();
-        });
-        this.bintrayAuthModal.result.catch(() => {
-            this.artifactoryModelSaver.save();
-            this.$state.go('^.list', {repoType: this.repoType});
-        });
-    }
-    goToBintray() {
-        let url = this.$bintrayAuthScope.bintrayBaseUrl + '/login/oauth/authorize?scope=org:?:admin&redirect_uri=' + this.$bintrayAuthScope.redirectUrl + '&artifactory_originated=Oik=';
-        window.open(url, "_self");
-    }
-    closeModalPackageType() {
-        if (!this.repoType) {
-            return false;
-        }
-        if (this.newRepository) {
-            this.setRepoLayout();
-        }
-        if (this.repoType.toLowerCase() == fieldsValuesDictionary.REPO_TYPE.VIRTUAL) {
-            // Resetting resolved and selected repositories lists in case we are changing package type
-            if (this.newRepository) {
-                this.repoInfo.basic.selectedRepositories = [];
-                this.repoInfo.basic.resolvedRepositories = [];
-            }
-            this._getRepositoriesByType();
-        }
-    }
-
-
-    _getRepositoriesByType() {
-        this.repositoriesDao.availableRepositoriesByType({
-            type: this.repoInfo.typeSpecific.repoType,
-            repoKey: this.repoInfo.general ? this.repoInfo.general.repoKey : ''
-        }).$promise.then((repos)=> {
-                    repos.availableLocalRepos = _.map(repos.availableLocalRepos, (repo)=> {
-                        return {
-                            repoName: repo,
-                            type: 'local',
-                            _iconClass: "icon icon-local-repo"
-                        }
-                    });
-                    repos.availableRemoteRepos = _.map(repos.availableRemoteRepos, (repo)=> {
-                        return {
-                            repoName: repo,
-                            type: 'remote',
-                            _iconClass: "icon icon-remote-repo"
-                        };
-                    });
-                    repos.availableVirtualRepos = _.map(repos.availableVirtualRepos, (repo)=> {
-                        return {
-                            repoName: repo,
-                            type: 'virtual',
-                            _iconClass: "icon icon-virtual-repo"
-                        };
-                    });
-
-                    this.repoInfo.basic.selectedRepositories = _.map(this.repoInfo.basic.selectedRepositories,
-                            (repo)=> {
-                                if (repo.type == 'local') {
-                                    return {
-                                        repoName: repo.repoName,
-                                        type: 'local',
-                                        _iconClass: "icon icon-local-repo"
-                                    }
-                                }
-                                else if (repo.type == 'remote') {
-                                    return {
-                                        repoName: repo.repoName,
-                                        type: 'remote',
-                                        _iconClass: "icon icon-remote-repo"
-                                    }
-                                }
-                                else if (repo.type == 'virtual') {
-                                    return {
-                                        repoName: repo.repoName,
-                                        type: 'virtual',
-                                        _iconClass: "icon icon-virtual-repo"
-                                    }
-                                }
-                            });
-
-
-                    this.repositoriesList = [];
-                    this.repositoriesList = repos.availableLocalRepos.concat(repos.availableRemoteRepos).concat(repos.availableVirtualRepos);
-                    this.artifactoryModelSaver.save();
-
-                });
-    }
-
-    getReplicationActions() {
-        return [
-            {
-                icon: 'icon icon-run',
-                tooltip: 'Run Now',
-                visibleWhen: row => !this.globalReplicationsStatus.blockPushReplications && row.enabled,
-                callback: row => this.executeReplicationNow(row)
-            },
-            {
-                icon: 'icon icon-clear',
-                tooltip: 'Delete',
-                callback: row => this._deleteReplication(row)
-            }
-        ]
-    }
-
-    executeReplicationNow(row) {
-        if (true) {
-            this.repositoriesDao.executeReplicationNow({replicationUrl: row.url},
-                    this.repoInfo).$promise.then((result)=> {
-                        //console.log(result)
-                    });
-        }
-    }
-
-    setRepoLayout() {
-        let foundLayout = false;
-        if (_.has(this.repoInfo, 'typeSpecific.repoType')) {
-            let type = this.repoInfo.typeSpecific.repoType.toLowerCase();
-            let defaultLayouts = fieldsValuesDictionary['defaultLayouts'];
-            if (!this.repoInfo.basic) {
-                this.repoInfo.basic = {};
-                this.repoInfo.basic.repositoryLayout = {};
-            }
-            this.repositoryLayouts = _.filter(this.repositoryLayouts, (layout)=>{return layout !== ''})
-            if (this.repoType.toLowerCase() == fieldsValuesDictionary.REPO_TYPE.VIRTUAL) {
-                this.repositoryLayouts.unshift('');
-            }
-
-            let defaultLayout = defaultLayouts[type];
-            if (defaultLayout && _.includes(this.repositoryLayouts, defaultLayout)) {
-                this.repoInfo.basic.layout = defaultLayout;
-                foundLayout = true;
-            } else {
-                this.repositoryLayouts.forEach((layout)=> {
-                    if (layout.indexOf(type) != -1) {
-                        this.repoInfo.basic.layout = layout;
-                        foundLayout = true;
-                    }
-                });
-            }
-            if (!foundLayout) {
-                this.repoInfo.basic.layout = "simple-default";
-            }
-        }
-    }
-
-    /**
-     * set default fields for new repository
-     */
-    _setDefaultValuesByType() {
-        if (!(this.repoInfo && this.repoInfo.typeSpecific)) {
-            this.repoInfo.typeSpecific = {};
-        }
-        let type = this.repoInfo.typeSpecific.repoType.toLowerCase();
-        if (type && this.defaultModels[type]) {
-            angular.extend(this.repoInfo.typeSpecific, this.defaultModels[type]);
-            // add default remote url for remote repository
-            if (this.repoType.toLocaleLowerCase() == fieldsValuesDictionary.REPO_TYPE.REMOTE) {
-                this.repoInfo.basic.url = this.defaultModels[type].url;
-            }
-        }
-        if (this.repoType.toLowerCase() == fieldsValuesDictionary.REPO_TYPE.VIRTUAL) {
-            this.repoInfo.basic.repositoryLayout = '';
-        }
-
-        if (this.repoInfo.typeSpecific.repoType == "Docker") {
-            this.repoInfo.typeSpecific.forceDockerAuthentication = true;
-        }
-
-    }
-
-    _setDefaultFields() {
-        if (!this.repoInfo.typeSpecific) {
-            this.repoInfo.typeSpecific = {};
-        }
-        this.repoInfo.advanced = {};
-        this.repoInfo.advanced.cache = {};
-        this.repoInfo.advanced.network = {};
-        angular.extend(this.repoInfo.advanced.cache, this.defaultModels['cache']);
-        angular.extend(this.repoInfo.advanced.network, this.defaultModels['network']);
-
-
-        if (this.repoType == fieldsValuesDictionary.REPO_TYPE.REMOTE) {
-            if (!this.repoInfo.advanced) {
-                this.repoInfo.advanced = {};
-            }
-            if (!this.repoInfo.basic) {
-                this.repoInfo.basic = {};
-            }
-
-            angular.extend(this.repoInfo.advanced, this.defaultModels['remoteAdvanced']);
-            angular.extend(this.repoInfo.basic, this.defaultModels['remoteBasic']);
-        }
-        else if (this.repoType == fieldsValuesDictionary.REPO_TYPE.LOCAL
-                    || this.repoType == fieldsValuesDictionary.REPO_TYPE.VIRTUAL
-                    || this.repoType == fieldsValuesDictionary.REPO_TYPE.DISTRIBUTION) {
-            if (!this.repoInfo.advanced) {
-                this.repoInfo.advanced = {};
-            }
-            if (!this.repoInfo.basic) {
-                this.repoInfo.basic = {};
-            }
-            angular.extend(this.repoInfo.advanced, this.defaultModels['localAdvanced']);
-            angular.extend(this.repoInfo.basic, this.defaultModels['localBasic']);
-            this.repoInfo.typeSpecific.localChecksumPolicy = this.defaultModels['maven'].localChecksumPolicy;
-            if(this.repoType == fieldsValuesDictionary.REPO_TYPE.DISTRIBUTION) {
-                this.repoInfo.typeSpecific = this.defaultModels['distribution'];
-                this.repoInfo.basic.layout = "simple-default";
-                this.distributionType = false;
-            }
-        }
-
-        this.repoInfo.basic.includesPatternArray = ['**/*'];
-        this.repoInfo.basic.excludesPatternArray = [];
-        this._setDefaultProxy();
-
-    }
-
-    selectRepoType(type) {
-        if (this.features.isDisabled(type.value)) {
-            return;
-        }
-
-        this.repoTypeModal.close();
-        if (!this.repoInfo.typeSpecific) {
-            this.repoInfo.typeSpecific = {};
-        }
-        this.repoInfo.typeSpecific.repoType = type.serverEnumName;
-        if (this.repoInfo.typeSpecific.repoType === "Docker" && !this.features.isAol() && !this.features.isOss()) {
-            this._getReveresProxyConfigurations();
-        }
-        if(this.repoInfo.typeSpecific.repoType === "CocoaPods" && this.repoType.toLowerCase() == fieldsValuesDictionary.REPO_TYPE.REMOTE) {
-            this.repoInfo.advanced.network.socketTimeout = 45000
-        }
-
-        if (this.newRepository) {
-            this._setDefaultValuesByType();
-        }
-        this.closeModalPackageType();
-    }
-
-    saveBintrayAuthInModel(bintraySecretString) {
-        //todo -- should respond to feature disabled?
-        if (!this.repoInfo.typeSpecific) {
-            this.repoInfo.typeSpecific = {};
-        }
-        this.repoInfo.typeSpecific.repoType = 'Distribution';
-        if (this.newRepository) {
-            this._setDefaultValuesByType();
-        }
-        this.repoInfo.typeSpecific.bintrayAuthString = bintraySecretString;
-        this.repoInfo.typeSpecific.redirectUrl = this.$location.absUrl().split('?')[0];
-        this.repoInfo.typeSpecific.paramClientId = this.$location.search().client_id;
-        this.repoInfo.typeSpecific.code = this.$location.search().code;
-        this.repoInfo.typeSpecific.scope = this.$location.search().scope;
-        this.repositoriesDao.saveBintrayOauthConfig(this.repoInfo.typeSpecific).$promise.then((result)=> {
-            this.bintrayAuthModal.close();
-            //Result from backend contains the key for the newly created OAuth app that this repo must reference.
-            let isPremium = this.repoInfo.typeSpecific.premium;
-            this.repoInfo.typeSpecific = result.data;
-            this._setupLicenses();
-            this._checkVisibility(isPremium)
-            this._setRulesPackages();
-        }).catch(() => {
-
-        });
-    }
-
-    /**
-     * newReplication; editReplication->
-     * functions for replications modal (work only for local repos)
-     */
-    newReplication() {
-        if (this.repoInfo.replications && this.repoInfo.replications.length && this.features.isDisabled('highAvailability') && !this.features.isDedicatedAol()) {
-            this.notifications.create({warn: 'Multi-push replication will only work with an Enterprise license'});
-            return true;
-        }
-        this.replicationScope.replication = {};
-        this.replicationScope.title = 'New Replication';
-        this.replicationScope.replication.socketTimeout = 15000;
-        this.replicationScope.replication.syncProperties = true;
-        this.replicationScope.sourceReplication = null;
-        this.replicationScope.replication.enabled = true;
-        this.replicationModal(false);
-    }
-
-
-    editReplication(row) {
-        this.replicationScope.title = 'Replication Properties';
-        this.replicationScope.replication = angular.copy(row);
-        this.replicationScope.sourceReplication = row;
-        this.replicationModal(true);
-    }
-
-    _deleteReplication(row) {
-        this.modal.confirm("Are you sure you wish to delete this replication?", 'Delete Replication', {confirm: 'Delete'})
-                .then(()=> {
-                    _.remove(this.repoInfo.replications, row);
-                    this.replicationsGridOption.setGridData(this.repoInfo.replications);
-                });
-
-    }
-
-    replicationModal(isEdit) {
-        this.replicationScope.replication.proxies = this.fields.proxies;
-        if(!isEdit) {
-            this.fields.defaultProxy ? this.replicationScope.replication.proxy = this.fields.defaultProxy : '';
-        }
-        this.modalInstance = this.modal.launchModal('replication_modal', this.replicationScope);
-    }
-
-    /**
-     * add replication: function that save fields in form for replication.
-     * if local: push it for grid replication
-     * if remote: clear exsit replication and set the new one
-     */
-    addReplication(replication) {
-
-        if (this.repoType.toLowerCase() == fieldsValuesDictionary.REPO_TYPE.REMOTE) {
-            this.repoInfo.replications = [];
-        }
-        replication.enabled = replication.enabled ? replication.enabled : false;
-        replication.syncDeletes = replication.syncDeletes ? replication.syncDeletes : false;
-        replication.syncProperties = replication.syncProperties ? replication.syncProperties : false;
-        replication.cronExp = this.repoInfo.cronExp;
-        replication.nextTime = this.repoInfo.nextTime;
-        replication.enableEventReplication = this.repoInfo.enableEventReplication;
-        replication.type = this.repoType;
-        if (replication.proxy === '') {
-            delete replication.proxy;
-        }
-        if (this.replicationScope.sourceReplication) {
-            // updating replication
-            angular.copy(replication, this.replicationScope.sourceReplication);
-        } else {
-            // adding new replication
-            this.repoInfo.replications = this.repoInfo.replications || [];
-            this.repoInfo.replications.push(replication);
-        }
-        if (this.repoType.toLocaleLowerCase() == fieldsValuesDictionary.REPO_TYPE.LOCAL) {
-            this.replicationsGridOption.setGridData(this.repoInfo.replications);
-            this.closeModal();
-        }
-    }
-
-    /**
-     * Saves the cron expression and event replication flag to all replications.
-     * Also validates that if HA license is not installed - only one active replication is saved.
-     */
-    saveCronAndEventFlagToAllReplicationsAndValidateHa() {
-        //Signifies save should disable all replications but one because multiple enabled replicaions exist without HA license
-        let notHa = this.features.isDisabled('highAvailability') && !this.features.isDedicatedAol() && this.repoInfo.replications.length > 1;
-        this.repoInfo.replications.forEach((replication) => {
-            replication.cronExp = this.repoInfo.cronExp;
-            replication.enableEventReplication = this.repoInfo.enableEventReplication;
-            if(notHa) {
-                replication.enabled = false;
-            }
-        });
-        if(notHa) {
-            this.notifications.create({warn: 'You saved multiple enabled replication configurations.\n Multi-push ' +
-            'replication is only available with an Enterprise licenses therefore only the first replication will be' +
-            'saved as enabled and the rest will be disabled.'});
-            this.repoInfo.replications[0].enabled = true;
-        }
-    }
-
-    closeModal() {
-        this.modalInstance.close();
-    }
-
-    _createGrid() {
-        this.replicationsGridOption = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setColumns(this._getColumns())
-                .setRowTemplate('default')
-                .setButtons(this.getReplicationActions())
-                .setGridData([]);
-    }
-
-    /**
-     * controller display arrows form
-     */
-    showNextButton() {
-        if (this.repoType == fieldsValuesDictionary.REPO_TYPE.LOCAL || this.repoType == fieldsValuesDictionary.REPO_TYPE.REMOTE) {
-            if (this.features.isDisabled('replications')) {
-                return this.currentTab != 'advanced';
-            }
-            return this.currentTab != 'replications';
-        } else if (this.repoType == fieldsValuesDictionary.REPO_TYPE.DISTRIBUTION) {
-            if (this.features.isDisabled('rules')) {
-                return this.currentTab != 'advanced';
-            }
-            return this.currentTab != 'rules';
-        }
-        else {
-            return this.currentTab != 'advanced';
-        }
-    }
-
-    _getColumns() {
-        return [
-            {
-                name: 'URL',
-                displayName: 'URL',
-                field: 'url',
-                cellTemplate: '<div class="ui-grid-cell-contents"><a ng-click="grid.appScope.RepositoryForm.editReplication(row.entity)">{{row.entity.url}}</a></div>'
-
-            },
-            {
-                name: 'Sync Deletes',
-                displayName: 'Sync Deletes',
-                field: 'syncDeletes',
-                cellTemplate: this.commonGridColumns.checkboxColumn('row.entity.syncDeletes')
-            },
-            {
-                name: 'Sync Properties',
-                displayName: 'Sync Properties',
-                field: 'syncProperties',
-                cellTemplate: this.commonGridColumns.checkboxColumn('row.entity.syncProperties')
-            },
-            {
-                name: 'Enabled',
-                displayName: 'Enabled',
-                field: 'enabled',
-                cellTemplate: this.commonGridColumns.checkboxColumn('row.entity.enabled')
-            }
-        ]
-    }
-
-    /**
-     * all packages sorts by type
-     */
-    getPackageType() {
-        switch (this.repoType) {
-            case fieldsValuesDictionary.REPO_TYPE.LOCAL:
-            {
-                return _.filter(this.packageType,(type) => {
-                   return _.indexOf(type.repoType, fieldsValuesDictionary.REPO_TYPE.LOCAL) != -1});
-            }
-            case fieldsValuesDictionary.REPO_TYPE.REMOTE:
-            {
-                return _.select(this.packageType,(type) => {
-                    return _.indexOf(type.repoType, fieldsValuesDictionary.REPO_TYPE.REMOTE) != -1});
-            }
-            case fieldsValuesDictionary.REPO_TYPE.VIRTUAL:
-            {
-                return _.select(this.packageType,(type) => {
-                    return _.indexOf(type.repoType, fieldsValuesDictionary.REPO_TYPE.VIRTUAL) != -1});
-            }
-            case fieldsValuesDictionary.REPO_TYPE.DISTRIBUTION:
-            {
-                return fieldsValuesDictionary.REPO_TYPE.DISTRIBUTION
-            }
-        }
-    }
-
-    cancel() {
-        this.$state.go('^.list', {repoType: this.repoType});
-    }
-
-    _getReveresProxyConfigurations() {
-        this.reverseProxiesDao.get().$promise.then((reverseProxies)=> {
-
-            this.reverseProxyConfigured = reverseProxies.serverName && reverseProxies.webServerType && (reverseProxies.useHttp || reverseProxies.useHttps) && reverseProxies.dockerReverseProxyMethod !== 'NOVALUE';;
-
-//            this.hideReverseProxy = this.reverseProxyConfigured
-
-            if (this.reverseProxyConfigured) {
-                if (!this.repoInfo.advanced.reverseProxy) {
-                    this.repoInfo.advanced.reverseProxy = {
-                        key: reverseProxies.key,
-                        serverName: reverseProxies.serverName
-                    };
-                }
-                if (reverseProxies.dockerReverseProxyMethod === 'PORTPERREPO') {
-                    this.reverseProxyPortMode = true;
-                    this.repoInfo.advanced.reverseProxy.serverName = reverseProxies.serverName;
-                }
-                else {
-                    this.reverseProxyPortMode = false;
-                    if (this.repoInfo.general && this.repoInfo.general.repoKey) this.repoInfo.advanced.reverseProxy.serverName = reverseProxies.serverNameExpression.replace('*',this.repoInfo.general.repoKey);
-                    this.reverseProxyServerNameExpression = reverseProxies.serverNameExpression;
-                }
-            }
-
-        });
-    }
-    onChangeRepoKey() {
-        if (this.repoInfo.general && this.repoInfo.general.repoKey && this.reverseProxyServerNameExpression) this.repoInfo.advanced.reverseProxy.serverName = this.reverseProxyServerNameExpression.replace('*',this.repoInfo.general.repoKey);
-    }
-
-    _getBaseUrl() {
-        this.generalConfigDao.get().$promise.then((data) => {
-            this.baseUrl = data.customUrlBase || this.NO_VALUE_STRING;
-        });
-    }
-
-    _getGlobalReplicationsStatus() {
-        this.globalReplicationsConfigDao.status().$promise.then((status) => {
-            this.globalReplicationsStatus = {
-                blockPullReplications: status.blockPullReplications,
-                blockPushReplications: status.blockPushReplications
-            }
-        });
-    }
-
-    // DISTRIBUTION RULES
-
-    _setRulesPackages() {
-
-        this.distributionRulesPackages = _.filter(this.packageType, (o) => {
-            if (this.features.isOss()) {
-                return o.value == 'generic' || o.value == 'maven' || o.value == 'gradle' || o.value == 'ivy' || o.value == 'sbt';
-            }
-            else {
-                return o.value != 'gitlfs' && o.value != 'gems' && o.value != 'pypi' && o.value != 'p2' && o.value != 'vcs';
-            }
-        });
-        this.distributionRulesPackages.forEach((pack)=>delete pack.description);
-    }
-
-    _checkVisibility() {
-        if (!this.repoInfo.typeSpecific.premium) {
-            this.defaultNewRepoPrivateSwitch = 'Public';
-            this.repoInfo.basic.defaultNewRepoPrivate = false;
-        } else {
-            this.defaultNewRepoPrivateSwitch = 'Private';
-            this.repoInfo.basic.defaultNewRepoPrivate = true;
-        }
-    }
-
-    _setupLicenses() {
-        // License input configuration
-        this.licensesList = _.map(this.repoInfo.typeSpecific.availableLicenses, (lic) => {
-            return {
-                text: lic,
-                value: lic
-            }
-        });
-    }
-
-    _setupDistribution() {
-        this.rulesGridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-            .setMultiSelect()
-            .setColumns(this._getDistributionRulesColumns())
-            .setButtons(this._getRulesActions())
-            .setBatchActions(this._getBatchActions())
-            .setDraggable(this._reorderRules.bind(this));
-
-
-    }
-
-    _reorderRules() {
-        this.distributionRules = this.rulesGridOptions.data;
-    }
-
-    _getRulesActions() {
-        return [
-            {
-                icon: 'icon icon-clear',
-                tooltip: 'Delete',
-                callback: row => this._deleteRule(row)
-            }
-        ]
-    }
-
-    _deleteRule(row) {
-        this.modal.confirm("Are you sure you wish to delete this rule?", 'Delete Rule', {confirm: 'Delete'})
-            .then(()=> {
-                _.remove(this.distributionRules, row);
-                this._createDistributionRulesGrid();
-            });
-
-    }
-
-    _getBatchActions() {
-        return [
-            {
-                icon: 'clear',
-                name: 'Delete',
-                callback: () => this.bulkDelete()
-            }
-        ]
-    }
-
-    bulkDelete(){
-        // Get All selected rules
-        let selectedRows = this.rulesGridOptions.api.selection.getSelectedRows();
-
-        // Ask for confirmation before delete and if confirmed then delete bulk of rules
-        this.modal.confirm(`Are you sure you want to delete ${selectedRows.length} rules?`)
-            .then(() => {
-                this.distributionRules = _.filter(this.distributionRules, (row)=>{
-                    return !_.find(selectedRows, {name: row.name})
-                });
-                this._createDistributionRulesGrid();
-            });
-    }
-
-    changeDistribute() {
-        if (this.distributionType == false) {
-            this.repoInfo.basic.productName = null;
-        }
-
-    }
-    changeDistributeVisibility() {
-        this.repoInfo.basic.defaultNewRepoPrivate = this.defaultNewRepoPrivateSwitch == 'Private' ? true : false;
-    }
-
-
-    _createDistributionRulesGrid() {
-
-        if (!this.distributionRules && !this.newRepository) {
-            this.distributionRules = this.repoInfo.advanced.distributionRules;
-        }
-
-        _.forEach(this.distributionRules, (row) => {
-            var rowPackageType =_.find(fieldsValuesDictionary.repoPackageTypes, (type) => {
-                return type.value == row.type.toLowerCase();
-            });
-            if (rowPackageType) {
-                row.displayType = rowPackageType.text;
-                row.typeIcon = rowPackageType.icon;
-            } else row.ignore = true;
-        });
-        let distRepoRulesGridData = _.filter(this.distributionRules, (row) => !row.ignore);
-        this.rulesGridOptions.setGridData(distRepoRulesGridData);
-
-    }
-
-    _getDistributionRulesColumns() {
-                return [
-                    {
-                        name: 'Name',
-                        displayName: 'Name',
-                        field: "name",
-                        cellTemplate: '<div class="ui-grid-cell-contents"><a ng-click="grid.appScope.RepositoryForm.editDistributionRule(row.entity)">{{row.entity.name}}</a></div>',
-                        width: '85%',
-                        enableSorting: false
-                    },
-                    {
-                        name: 'Type',
-                        displayName: 'Type',
-                        field: 'displayType',
-                        cellTemplate: this.commonGridColumns.iconColumn('row.entity.displayType', 'row.entity.typeIcon', 'repo-type-icon'),
-                        width: '15%',
-                        enableSorting: false
-                    }
-            ]
-
-    }
-
-
-    rulesPopup() {
-        this.rulesModalScope = this.$scope.$new();
-        this.rulesModalScope.title = "Add New Rule";
-        this.rulesModalScope.itemToEdit = null;
-        this.rulesModalScope.rule = {};
-        this.availableTokens = null;
-        this.modalRules = this.modal.launchModal('add_rule_modal', this.rulesModalScope, 1000);
-    }
-
-    changeRuleRepoType() {
-        let selectedPackageValue = this.rulesModalScope.rule.selectedPackageType.value;
-        if (selectedPackageValue == 'generic') {
-            this.rulesModalScope.rule.RulePackageLayoutSelect = null; // Reset selected layout
-            this.availableTokens = this.ruleTokensByLayout[this.rulesModalScope.rule.selectedPackageType.serverEnumName];
-        } else if (selectedPackageValue == 'nuget' || selectedPackageValue == 'debian') {
-            this.rulesModalScope.rule.distributionCoordinatesPackage = "[packageName]";
-        } else {
-            this.availableTokens = this.ruleTokensByType[this.rulesModalScope.rule.selectedPackageType.serverEnumName];
-            if (!this.distributionType) {
-                this.availableTokens = _.filter(this.availableTokens,(val) => val !== '${productName}');
-            }
-        }
-
-        // Auto fill coordinates from default rules module
-        let coordinates = {};
-        if (selectedPackageValue != 'generic') {
-            coordinates = _.filter(this.distributionDefaultRules, (o) => {
-                return o.type.toLowerCase() === selectedPackageValue;
-            });
-            coordinates = coordinates[0].distributionCoordinates;
-        }
-        this.rulesModalScope.rule.distributionCoordinatesRepo = coordinates.repo || '';
-        this.rulesModalScope.rule.distributionCoordinatesPackage = coordinates.pkg || '';
-        this.rulesModalScope.rule.distributionCoordinatesVersion = coordinates.version || '';
-        this.rulesModalScope.rule.distributionCoordinatesPath = coordinates.path || '';
-    }
-    checkUniqueRuleName(value) {
-        let found = _.find(this.distributionRules, function(o) {
-            return o.name == value;
-        });
-        return !found || value == this.rulesModalScope.originalRuleName;
-    }
-
-    changeRulePackageLayout() {
-        this.availableTokens =  this.ruleTokensByLayout[this.rulesModalScope.rule.RulePackageLayoutSelect];
-    }
-
-    saveDistributionRule() {
-        let ruleObject = {
-                    name: this.rulesModalScope.rule.ruleName,
-                    type: this.rulesModalScope.rule.selectedPackageType.text,
-                    repoFilter: this.rulesModalScope.rule.filterRepo  || '',
-                    pathFilter: this.rulesModalScope.rule.filterPath  || '',
-                    distributionCoordinates: {
-                        repo: this.rulesModalScope.rule.distributionCoordinatesRepo || '',
-                        pkg: this.rulesModalScope.rule.distributionCoordinatesPackage || '',
-                        version: this.rulesModalScope.rule.distributionCoordinatesVersion || '',
-                        path: this.rulesModalScope.rule.distributionCoordinatesPath  || ''
-                    }
-        };
-
-        if (this.rulesModalScope.itemToEdit == null) {
-            this.distributionRules.push(ruleObject);
-        } else {
-            this.distributionRules[this.rulesModalScope.itemToEdit] = ruleObject;
-        }
-
-        this._createDistributionRulesGrid();
-        this.modalRules.close();
-
-    }
-
-    editDistributionRule(row) {
-        let selectedPackageType = _.find(fieldsValuesDictionary.repoPackageTypes, (type) => {
-            return type.value == row.type.toLowerCase();
-        });
-        this.availableTokens = this.ruleTokensByType[row.type];
-
-        if (!this.distributionType) {
-            this.availableTokens = _.filter(this.availableTokens,(val) => val !== '${productName}');
-        }
-
-        this.rulesModalScope = this.$scope.$new();
-        this.rulesModalScope.originalRuleName = row.name;
-        this.rulesModalScope.title = "Edit Rule";
-        this.rulesModalScope.itemToEdit = _.indexOf(this.distributionRules, row);
-        this.rulesModalScope.rule = {
-            ruleName: row.name,
-            selectedPackageType: selectedPackageType,
-            filterRepo: row.repoFilter,
-            filterPath: row.pathFilter,
-            distributionCoordinatesRepo: row.distributionCoordinates.repo,
-            distributionCoordinatesPackage: row.distributionCoordinates.pkg,
-            distributionCoordinatesVersion: row.distributionCoordinates.version,
-            distributionCoordinatesPath: row.distributionCoordinates.path
-
-
-        };
-        this.modalRules = this.modal.launchModal('add_rule_modal', this.rulesModalScope, 1000);
-    }
-
-    isProductNameValid(value) {
-        return !value || value.match(/^[a-zA-Z0-9\-_\.:]+$/)
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/repositories/repository_form.html b/web/angular-web/src/main/webapp/app/states/admin/repositories/repository_form.html
deleted file mode 100644
index cc68a1c..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/repositories/repository_form.html
+++ /dev/null
@@ -1,82 +0,0 @@
-<div class="content-layout-container">
-    <h1 id="repository-header">{{RepositoryForm.title}}</h1>
-
-    <div class="content-wrapper">
-        <form name="RepositoryForm.repositoriesForm" ng-submit="RepositoryForm.save()">
-            <div class="card stretch card-pole-pad card-side-pad">
-                <div class="content-with-footer">
-                    <div class="wizard-container">
-                        <ul class="wizard-tabs">
-                            <li ng-click="RepositoryForm.setCurrentTab('basic')"
-                                ng-class="{active:RepositoryForm.isCurrentTab('basic')}" id="repository-basic-tab">Basic
-                            </li>
-                            <li ng-click="RepositoryForm.setCurrentTab('advanced')"
-                                ng-class="{active:RepositoryForm.isCurrentTab('advanced')}" id="repository-advanced-tab">Advanced
-                            </li>
-                            <li ng-click="RepositoryForm.setCurrentTab('replications')"
-                                ng-class="{active:RepositoryForm.isCurrentTab('replications')}"
-                                jf-disable-feature="replications"
-                                ng-if="!RepositoryForm.isCurrentRepoType('virtual') && !RepositoryForm.isCurrentRepoType('distribution')
-                                && !(RepositoryForm.isCurrentRepoType('remote') && RepositoryForm.repoInfo.typeSpecific.repoType === 'Docker')"
-                                id="repository-replications-tab">Replications
-                                <span ng-if="RepositoryForm.features.isDisabled('replications')"
-                                      class="license-required"></span>
-                            </li>
-
-                            <li ng-click="RepositoryForm.setCurrentTab('rules')"
-                                ng-class="{active:RepositoryForm.isCurrentTab('rules')}"
-                                jf-disable-feature="rules"
-                                ng-if="RepositoryForm.isCurrentRepoType('distribution')"
-                                id="repository-distribution-tab">Rules
-                            </li>
-                        </ul>
-                        <ng-include ng-if="RepositoryForm.repoInfo"
-                                    src="'states/admin/repositories/' + RepositoryForm.repoType + '_repository_form.html'">
-
-                        </ng-include>
-                    </div>
-                </div>
-            </div>
-
-            <div class="content-footer">
-                <div class="pull-right">
-                    <button class="btn btn-default" type="button"
-                           ng-click="RepositoryForm.cancel()" id="repository-cancel-button">Cancel
-                    </button>
-                    <div class="wizard-pager">
-                        <a href=""
-                           ng-disabled="RepositoryForm.currentTab == 'basic'"
-                           ng-click="RepositoryForm.prevStep()" id="repository-back-button">
-                            < Back
-                        </a>
-                        <a href=""
-                           ng-disabled="!RepositoryForm.showNextButton()"
-                           ng-click="RepositoryForm.fwdStep()" id="repository-next-button">
-                            Next >
-                        </a>
-                    </div>
-                    <button type="submit"
-                            class="btn btn-primary"
-                            ng-disabled="!RepositoryForm.repositoriesForm.$valid"
-                            ng-if="RepositoryForm.isCurrentRepoType('local')" id="repository-save-button">Save & Finish
-                    </button>
-                    <button type="submit"
-                            class="btn btn-primary"
-                            ng-if="RepositoryForm.isCurrentRepoType('remote')"
-                            ng-disabled="!RepositoryForm.repositoriesForm.$valid" id="repository-save-button">Save & Finish
-                    </button>
-                    <button type="submit"
-                            class="btn  btn-primary"
-                            ng-if="RepositoryForm.isCurrentRepoType('virtual')"
-                            ng-disabled="!RepositoryForm.repositoriesForm.$valid || !RepositoryForm.isDependencyRewriteOK()" id="repository-save-button">Save & Finish
-                    </button>
-                    <button type="submit"
-                            class="btn btn-primary"
-                            ng-if="RepositoryForm.isCurrentRepoType('distribution')"
-                            ng-disabled="!RepositoryForm.repositoriesForm.$valid" id="repository-save-button">Save & Finish
-                    </button>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/repositories/repository_layout_form.controller.js b/web/angular-web/src/main/webapp/app/states/admin/repositories/repository_layout_form.controller.js
deleted file mode 100644
index c824df0..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/repositories/repository_layout_form.controller.js
+++ /dev/null
@@ -1,117 +0,0 @@
-import TOOLTIP from '../../../constants/artifact_tooltip.constant';
-
-export class AdminRepositoryLayoutFormController {
-    constructor($state,$stateParams, RepositoriesLayoutsDao, ArtifactoryModelSaver) {
-        this.$state = $state;
-        this.$stateParams = $stateParams;
-        this.layoutsDao = RepositoriesLayoutsDao;
-        this.TOOLTIP = TOOLTIP.admin.repositories.layoutsForm;
-        this.artifactoryModelSaver = ArtifactoryModelSaver.createInstance(this,['layoutData']);
-
-        this.input = {};
-        this.testReply = null;
-        this.regexViewData = null;
-
-        this.testReplyDictionary = {
-            organization: 'Organization',
-            module: 'Module',
-            baseRevision: 'Base Revision',
-            folderIntegrationRevision: 'Folder Integration Revision',
-            fileIntegrationRevision: 'File Integration Revision',
-            classifier: 'Classifier',
-            ext: 'Extension',
-            type: 'Type'
-        };
-
-        this.viewOnly = ($stateParams.viewOnly === true);
-
-        if ($stateParams.layoutname) {
-            this.mode = 'edit';
-            this.layoutName = $stateParams.layoutname;
-            this.title = 'Edit ' + this.layoutName + ' Repository Layout';
-            this._getLayoutData(this.layoutName);
-        }
-        else if ($stateParams.copyFrom) {
-            this.mode = 'create';
-            this.title = 'New Repository Layout';
-            this._getLayoutData($stateParams.copyFrom);
-        }
-        else {
-            this.mode = 'create';
-            this.title = 'New Repository Layout';
-            this.layoutData = {};
-        }
-
-    }
-
-    save() {
-        if (this.mode == 'edit')
-        {
-            let payload = angular.copy(this.layoutData);
-            delete (payload.repositoryAssociations);
-
-            this.layoutsDao.update({},payload).$promise.then((data)=>{
-                this.artifactoryModelSaver.save();
-                this.$state.go('^.repo_layouts');
-            });
-        }
-
-        if (this.mode == 'create')
-        {
-            this.layoutsDao.save({},this.layoutData).$promise.then((data)=>{
-                this.artifactoryModelSaver.save();
-                this.$state.go('^.repo_layouts');
-            });
-        }
-    }
-
-    hasAnyAssoc() {
-        return this.layoutData &&
-               (this.layoutData.repositoryAssociations.localRepositories.length ||
-               this.layoutData.repositoryAssociations.remoteRepositories.length ||
-               this.layoutData.repositoryAssociations.virtualRepositories.length);
-    }
-
-    cancel() {
-        this.$state.go('^.repo_layouts');
-    }
-
-
-    test() {
-        let payload = angular.copy(this.layoutData);
-        delete (payload.repositoryAssociations);
-        _.extend(payload,{pathToTest: this.input.testPath});
-        this.testReply = null;
-
-        this.layoutsDao.testArtifactPath({},payload).$promise.then((data)=>{
-            this.testReply = data.data;
-        });
-    }
-
-    isSaveDisabled() {
-        return !this.layoutForm || this.layoutForm.$invalid;
-    }
-
-    resolveRegex() {
-        let payload = angular.copy(this.layoutData);
-        delete (payload.repositoryAssociations);
-        this.regexViewData = null;
-        this.layoutsDao.resolveRegex({},payload).$promise.then((data)=>{
-            this.regexViewData = data;
-        });
-    }
-
-    gotoEditRepo(type,repo) {
-        this.$state.go('admin.repositories.edit',{repoType: type, repoKey: repo});
-    }
-    _getLayoutData(layoutName) {
-        this.layoutsDao.getLayoutData({},{layoutName:layoutName}).$promise.then((data)=>{
-            this.layoutData = data;
-            this.artifactoryModelSaver.save();
-            if (this.$stateParams.copyFrom) {
-                this.layoutData.name = '';
-            }
-        });
-    }
-
-}
diff --git a/web/angular-web/src/main/webapp/app/states/admin/repositories/repository_layout_form.html b/web/angular-web/src/main/webapp/app/states/admin/repositories/repository_layout_form.html
deleted file mode 100644
index 83ca9f2..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/repositories/repository_layout_form.html
+++ /dev/null
@@ -1,211 +0,0 @@
-<div class="content-layout-container"> <!-- classes: with-head-bar -->
-    <h1>{{RepositoryLayoutForm.title}}</h1>
-
-    <div class="content-wrapper">
-        <form name="RepositoryLayoutForm.layoutForm" ng-submit="RepositoryLayoutForm.save()" novalidate>
-            <div class="card stretch card-pole-pad card-side-pad">
-                <div class="content-with-footer">
-                    <div class="repo-layout-form">
-
-                        <jf-panel jf-panel-heading="Repository Layout Settings">
-                            <div class="form-group">
-                                <div class="form-group-cell double">
-                                    <jf-field validations="common">
-                                        <label for="layoutName" class="mandatory">Layout Name</label>
-                                        <input name="layoutName"
-                                               jf-validator-name
-                                               jf-validator-unique-id
-                                               jf-validator-xml-name
-                                               type="text"
-                                               ng-model-options="{debounce: { 'default': 500 } }"
-                                               ng-model="RepositoryLayoutForm.layoutData.name"
-                                               class="input-text"
-                                               ng-disabled="RepositoryLayoutForm.mode!=='create'"
-                                               id="layoutName" required>
-                                    </jf-field>
-                                </div>
-                            </div>
-                            <div class="form-group">
-                                <div class="form-group-cell double">
-                                    <jf-field validations="repoLayouts">
-                                        <label for="artifactPathPattern" class="mandatory">Artifact Path Pattern</label>
-                                        <jf-help-tooltip html="RepositoryLayoutForm.TOOLTIP.artifactPathPattern"></jf-help-tooltip>
-                                        <input name="artifactPathPattern"
-                                               type="text"
-                                               jf-validator-path-pattern
-                                               ng-model="RepositoryLayoutForm.layoutData.artifactPathPattern"
-                                               class="input-text"
-                                               ng-disabled="RepositoryLayoutForm.viewOnly"
-                                               id="artifactPathPattern"
-                                               required>
-                                    </jf-field>
-                                </div>
-                            </div>
-                            <div class="form-group">
-                                <div class="form-group-cell">
-                                    <jf-checkbox text="Distinctive Descriptor Path Pattern">
-                                        <input type="checkbox"
-                                               ng-disabled="RepositoryLayoutForm.viewOnly"
-                                               ng-model="RepositoryLayoutForm.layoutData.distinctiveDescriptorPathPattern">
-                                    </jf-checkbox>
-                                    <jf-help-tooltip html="RepositoryLayoutForm.TOOLTIP.distinctiveDescriptorPathPattern"></jf-help-tooltip>
-                                </div>
-                            </div>
-                            <div class="form-group">
-                                <div class="form-group-cell double" ng-if="RepositoryLayoutForm.layoutData.distinctiveDescriptorPathPattern">
-                                    <jf-field validations="repoLayouts">
-                                        <input name="descriptorPathPattern"
-                                               type="text"
-                                               ng-disabled="RepositoryLayoutForm.viewOnly"
-                                               jf-validator-path-pattern
-                                               ng-model="RepositoryLayoutForm.layoutData.descriptorPathPattern"
-                                               class="input-text"
-                                               id="descriptorPathPattern">
-                                    </jf-field>
-                                </div>
-                            </div>
-                            <div class="form-group">
-                                <div class="form-group-cell double">
-                                    <jf-field validations="common">
-                                        <label for="folderIntegrationRevisionRegExp" class="mandatory">Folder Integration Revision RegExp</label>
-                                        <jf-help-tooltip html="RepositoryLayoutForm.TOOLTIP.folderIntegrationRevisionRegExp"></jf-help-tooltip>
-                                        <input name="folderIntegrationRevisionRegExp"
-                                               type="text"
-                                               ng-model="RepositoryLayoutForm.layoutData.folderIntegrationRevisionRegExp"
-                                               ng-disabled="RepositoryLayoutForm.viewOnly"
-                                               class="input-text"
-                                               id="folderIntegrationRevisionRegExp"
-                                               required>
-                                    </jf-field>
-                                </div>
-                            </div>
-                            <div class="form-group">
-                                <div class="form-group-cell double">
-                                    <jf-field validations="common">
-                                        <label for="fileIntegrationRevisionRegExp" class="mandatory">File Integration Revision RegExp</label>
-                                        <jf-help-tooltip html="RepositoryLayoutForm.TOOLTIP.fileIntegrationRevisionRegExp"></jf-help-tooltip>
-                                        <input name="fileIntegrationRevisionRegExp"
-                                               type="text"
-                                               ng-model="RepositoryLayoutForm.layoutData.fileIntegrationRevisionRegExp"
-                                               ng-disabled="RepositoryLayoutForm.viewOnly"
-                                               class="input-text"
-                                               id="fileIntegrationRevisionRegExp"
-                                               required>
-                                    </jf-field>
-                                </div>
-                            </div>
-                        </jf-panel>
-                        <jf-panel jf-panel-heading="Test Artifact Path Resolution">
-                            <div class="form-group">
-                                <div class="form-group-cell double">
-                                    <jf-field>
-                                        <label for="testPath">Test Path</label>
-                                        <input name="testPath"
-                                               type="text"
-                                               ng-model="RepositoryLayoutForm.input.testPath"
-                                               class="input-text"
-                                               id="testPath">
-                                    </jf-field>
-                                </div>
-                                <div class="form-group-cell form-button">
-                                    <button class="btn btn-secondary"
-                                            type="button"
-                                            ng-click="RepositoryLayoutForm.test()">Test</button>
-                                </div>
-                                <jf-panel ng-if="RepositoryLayoutForm.testReply"
-                                          jf-panel-heading="Result">
-                                    <div>
-                                        <table class="jf-data-table">
-                                            <tr ng-repeat="(key,value) in RepositoryLayoutForm.testReplyDictionary">
-                                                <td>{{value}}:</td>
-                                                <td>{{RepositoryLayoutForm.testReply[key]}}</td>
-                                            </tr>
-                                            <tr ng-repeat="(key,value) in RepositoryLayoutForm.testReply.customFields">
-                                                <td style="color: darkblue">{{key}}:</td>
-                                                <td>{{value}}</td>
-                                            </tr>
-                                        </table>
-                                    </div>
-                                </jf-panel>
-                            </div>
-                        </jf-panel>
-
-                        <jf-panel jf-panel-heading="Regular Expression View">
-                            <div class="form-group">
-                                <div class="form-group-cell">
-                                    <button class="btn btn-secondary"
-                                            type="button"
-                                            ng-click="RepositoryLayoutForm.resolveRegex()">Resolve</button>
-                                </div>
-                            </div>
-                            <div ng-if="RepositoryLayoutForm.regexViewData">
-                                <div class="form-group">
-                                    <div class="form-group-cell double">
-                                        <label for="artifactPath">Artifact Path</label>
-                                        <textarea disabled
-                                                  rows="4"
-                                                  id="artifactPath"
-                                                  class="input-text"
-                                                  ng-model="RepositoryLayoutForm.regexViewData.artifactRegEx">
-
-                                        </textarea>
-                                    </div>
-                                </div>
-                                <div class="form-group">
-                                    <div class="form-group-cell double">
-                                        <label for="descriptorPath">Descriptor Path</label>
-                                        <textarea disabled
-                                                  rows="4"
-                                                  id="descriptorPath"
-                                                  class="input-text"
-                                                  ng-model="RepositoryLayoutForm.regexViewData.descriptorRegEx">
-                                        </textarea>
-                                    </div>
-                                </div>
-                            </div>
-                        </jf-panel>
-
-                        <jf-panel ng-if="RepositoryLayoutForm.mode==='edit' && RepositoryLayoutForm.hasAnyAssoc()" jf-panel-heading="Repository Associations">
-                            <jf-panel ng-if="RepositoryLayoutForm.layoutData.repositoryAssociations.localRepositories.length"
-                                      jf-panel-heading="Local Repositories">
-                                <span class="repo-association"
-                                      ng-repeat="repo in RepositoryLayoutForm.layoutData.repositoryAssociations.localRepositories">
-                                    <a href="" ng-click="RepositoryLayoutForm.gotoEditRepo('local',repo)"><i class="icon icon-local-repo"></i>{{repo}}</a>
-                                </span>
-                            </jf-panel>
-                            <jf-panel ng-if="RepositoryLayoutForm.layoutData.repositoryAssociations.remoteRepositories.length"
-                                      jf-panel-heading="Remote Repositories">
-                                <span class="repo-association"
-                                      ng-repeat="repo in RepositoryLayoutForm.layoutData.repositoryAssociations.remoteRepositories">
-                                    <a href="" ng-click="RepositoryLayoutForm.gotoEditRepo('remote',repo)"><i class="icon icon-cached-repo"></i>{{repo}}</a>
-                                </span>
-                            </jf-panel>
-                            <jf-panel ng-if="RepositoryLayoutForm.layoutData.repositoryAssociations.virtualRepositories.length"
-                                      jf-panel-heading="Virtual Repositories">
-                                <span class="repo-association"
-                                      ng-repeat="repo in RepositoryLayoutForm.layoutData.repositoryAssociations.virtualRepositories">
-                                    <a href="" ng-click="RepositoryLayoutForm.gotoEditRepo('local',repo)"><i class="icon icon-virtual-repo"></i>{{repo}}</a>
-                                </span>
-                            </jf-panel>
-                        </jf-panel>
-                    </div>
-                </div>
-            </div>
-
-            <div class="content-footer">
-                <div class="pull-right">
-                    <button class="btn btn-default" type="button"
-                            ng-click="RepositoryLayoutForm.cancel()">Cancel</button>
-                    <div ng-switch="mode" class="btn-group">
-                        <button ng-if="!RepositoryLayoutForm.viewOnly"
-                                class="btn btn-primary"
-                                type="submit"
-                                ng-disabled="RepositoryLayoutForm.isSaveDisabled()">Save
-                        </button>
-                    </div>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
-
diff --git a/web/angular-web/src/main/webapp/app/states/admin/repositories/reverse_proxy.html b/web/angular-web/src/main/webapp/app/states/admin/repositories/reverse_proxy.html
deleted file mode 100644
index 54356f7..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/repositories/reverse_proxy.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<jf-panel jf-panel-heading="Reverse Proxy"
-          ng-if="RepositoryForm.repoInfo.isType('docker') && !RepositoryForm.features.isAol() && !RepositoryForm.features.isOss()">
-    <div class="alert alert-warning"
-         ng-if="!RepositoryForm.reverseProxyConfigured">
-        To use this feature first <a href ui-sref="admin.configuration.reverse_proxy">configure reverse proxy</a>.
-    </div>
-    <div class="form-group" ng-if="RepositoryForm.reverseProxyConfigured">
-        <div class="form-group-cell">
-            <label for="serverName">Registry Name</label>
-            <input type="text"
-                   class="input-text"
-                   id="serverName"
-                   ng-model="RepositoryForm.repoInfo.advanced.reverseProxy.serverName"
-                   disabled />
-        </div>
-        <div class="form-group-cell" ng-if="RepositoryForm.reverseProxyPortMode">
-            <jf-field validations="reverseProxy">
-                <label for="serverPort">Registry Port</label>
-                <jf-help-tooltip html="RepositoryForm.TOOLTIP.reverseProxy.registryPort"></jf-help-tooltip>
-                <input type="number"
-                       name="serverPort"
-                       min="1"
-                       max="65535"
-                       jf-validator-reverse-proxy-port="{{RepositoryForm.repoInfo.general.repoKey}}"
-                       placeholder="e.g. 6555"
-                       ng-model-options="{debounce: { 'default': 500 } }"
-                       class="input-text"
-                       id="serverPort"
-                       ng-model="RepositoryForm.repoInfo.advanced.reverseProxy.serverPort" />
-            </jf-field>
-        </div>
-    </div>
-    <div class="alert alert-info"
-         ng-if="RepositoryForm.reverseProxyConfigured">
-        To view / download the snippet, go to <a target="_blank" href ui-sref="admin.configuration.reverse_proxy">reverse proxy</a> page.
-    </div>
-</jf-panel>
diff --git a/web/angular-web/src/main/webapp/app/states/admin/repositories/virtual_repository_form.controller.js b/web/angular-web/src/main/webapp/app/states/admin/repositories/virtual_repository_form.controller.js
deleted file mode 100644
index 5624345..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/repositories/virtual_repository_form.controller.js
+++ /dev/null
@@ -1,233 +0,0 @@
-export class VirtualRepositoryFormController {
-    constructor($scope, RepositoriesDao, parseUrl, ArtifactoryNotifications, ArtifactoryFeatures) {
-        this.$scope = $scope;
-        this.parseUrl = parseUrl;
-        this.gridP2Option = {};
-        this.repositoriesDao = RepositoriesDao;
-        this.notifications = ArtifactoryNotifications;
-        this.artifactoryGridFactory = $scope.RepositoryForm.artifactoryGridFactory;
-        this.repositoryForm = $scope.RepositoryForm;
-        this.virtualRepo = {};
-        this.features = ArtifactoryFeatures;
-        this._createGrid();
-        this._initVirtual();
-
-        this.repositoryForm.isDependencyRewriteOK = this.isDependencyRewriteOK.bind(this);
-    }
-
-    isSigningKeysDisable() {
-        if (this.features.isDisabled("signingKeys")) {
-            return true;
-        }
-        else {
-            return false;
-        }
-    }
-
-    _initVirtual() {
-        if (!this.repositoryForm.newRepository) {
-            if (this.repositoryForm.repoInfo.typeSpecific && this.repositoryForm.repoInfo.typeSpecific.p2Repos) {
-                this.gridP2Option.setGridData(this.repositoryForm.repoInfo.typeSpecific.p2Repos);
-            }
-        }
-        this.repositoriesDao.remoteUrlToRepoMap().$promise.then((result)=> {
-            this.remoteUrlMap = result;
-        });
-    }
-
-    _createGrid() {
-        this.gridP2Option = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setColumns(this.getP2Columns())
-                .setRowTemplate('default')
-                .setButtons(this._getActions())
-                .setGridData([]);
-    }
-
-    addP2Local() {
-        let repoToPush = {};
-        let baseUrl = 'local://';
-        if (this.virtualRepo.pathSuffix) {
-            repoToPush.pathSuffix = this.virtualRepo.pathSuffix.startsWith('/') ? this.virtualRepo.pathSuffix.replace(/\/+/, '') : this.virtualRepo.pathSuffix;
-            repoToPush.repoUrl = baseUrl + this.virtualRepo.localRepoKey + "/" + repoToPush.pathSuffix;
-        }
-        else {
-            repoToPush.repoUrl = baseUrl + this.virtualRepo.localRepoKey;
-        }
-        repoToPush.repoKey = this.virtualRepo.localRepoKey;
-        if (this._repoKeyExists(repoToPush.repoKey)) {
-            repoToPush.action = 'included';
-        }
-        else {
-            repoToPush.action = 'include';
-        }
-        this._pushToGrid(repoToPush);
-    }
-
-    _repoKeyExists(repoKey) {
-        let repos = this.repositoryForm.repoInfo.typeSpecific.p2Repos;
-        if (repos) {
-            return _.find(repos, {repoKey: repoKey});
-        }
-        return false;
-    }
-    _repoUrlExists(repoUrl) {
-        let repos = this.repositoryForm.repoInfo.typeSpecific.p2Repos;
-        if (repos) {
-            return _.find(repos, {repoUrl: repoUrl});
-        }
-        return false;
-    }
-
-    addP2Remote() {
-        let indexRepo = 1;
-        let findMatch = false;
-        this.currentRepo = '';
-        _.forOwn(this.remoteUrlMap, (remoteUrl, key) => {
-            if (this.virtualRepo.remoteUrl.startsWith(remoteUrl)) {
-                let action = 'include';
-                if (this._repoKeyExists(key)) {
-                    action = 'included';
-                }
-                if (this._pushToGrid({repoKey: key, repoUrl: this.virtualRepo.remoteUrl, action: action})) {
-                    findMatch = true;
-                    return false;
-                }
-                else {
-                    return true;
-                }
-            }
-        });
-        if (!findMatch) {
-            let fields = this.repositoryForm.fields;
-            let allRepos = fields.availableLocalRepos.concat(fields.availableRemoteRepos).concat(fields.availableVirtualRepos);
-            let parser = this.parseUrl(this.virtualRepo.remoteUrl);
-
-            this.currentRepo = parser.host.replace(':', "-");
-
-            if (_.indexOf(allRepos, this.currentRepo) != -1) {
-                let regexp = new RegExp(this.currentRepo + '-.+');
-                let matchingRepos = _.select(allRepos, (repo) => {
-                    return regexp.test(repo);
-                });
-                if (matchingRepos.length) {
-                    let lastMatchingRepo = _.last(matchingRepos.sort());
-                    indexRepo = lastMatchingRepo.substring(lastMatchingRepo.indexOf('-') + 1);
-                    indexRepo = parseInt(indexRepo) + 1;
-                }
-                this.currentRepo = this.currentRepo + "-" + indexRepo;
-            }
-
-            this.remoteUrlMap[this.currentRepo] = this.virtualRepo.remoteUrl;
-            this._pushToGrid({repoKey: this.currentRepo, repoUrl: this.virtualRepo.remoteUrl, action: 'create'});
-        }
-    }
-
-    onChangeRepo() {
-        this.repositoriesDao.getResolvedRepositories(
-                this.repositoryForm.repoInfo).$promise.then((resolvedRepositories)=> {
-                    this.repositoryForm.repoInfo.basic.resolvedRepositories = resolvedRepositories;
-                    this.repositoryForm.repoInfo.basic.selectedLocalRepositories = _.pluck(_.filter(this.repositoryForm.repoInfo.basic.resolvedRepositories, (repo)=>{
-                        return repo.type === 'local';
-                    }),'repoName');
-                    this.repositoryForm.repoInfo.basic.selectedRemoteRepositories = _.pluck(_.filter(this.repositoryForm.repoInfo.basic.resolvedRepositories, (repo)=>{
-                        return repo.type === 'remote';
-                    }),'repoName');
-                    if (!_.contains(this.repositoryForm.repoInfo.basic.selectedLocalRepositories,this.repositoryForm.repoInfo.basic.defaultDeploymentRepo)) {
-                        this.repositoryForm.repoInfo.basic.defaultDeploymentRepo = null;
-                    }
-                    this.repositoryForm.repoInfo.basic.selectedLocalRepositories.unshift('');
-                });
-    }
-
-    _pushToGrid(repo) {
-        if (this._repoUrlExists(repo.repoUrl)) {
-            this.notifications.create({error: "Repo URL already exists in the list"});
-            return false;
-        }
-        this.repositoryForm.repoInfo.typeSpecific.p2Repos = this.repositoryForm.repoInfo.typeSpecific.p2Repos || [];
-        this.repositoryForm.repoInfo.typeSpecific.p2Repos.push(repo);
-        this.gridP2Option.setGridData(this.repositoryForm.repoInfo.typeSpecific.p2Repos);
-        this.virtualRepo.remoteUrl = '';
-        return true;
-    }
-
-    _deleteRepo(repo) {
-        _.remove(this.repositoryForm.repoInfo.typeSpecific.p2Repos, {repoUrl: repo.repoUrl});
-        this.gridP2Option.setGridData(this.repositoryForm.repoInfo.typeSpecific.p2Repos);
-    }
-
-    isDependencyRewriteRelevant() {
-        return this.repositoryForm.repoInfo.typeSpecific && (this.repositoryForm.repoInfo.typeSpecific.repoType === 'Bower' || this.repositoryForm.repoInfo.typeSpecific.repoType === 'Npm');
-    }
-    addDependencyRewritePattern() {
-        this.newValue = $('#newPatternField').val();
-        this.errorMessage = null;
-
-        if (_.isEmpty(this.newValue)) {
-            this.errorMessage = "Must input value";
-        }
-        //else if (!this._isValueUnique(this.newValue)) {
-        //    this.errorMessage = "Value already exists";
-        //}
-        else {
-            this.repositoryForm.repoInfo.typeSpecific.externalPatterns.push(this.newValue);
-            this.newValue = null;
-            $('#newPatternField').val('');
-            //this.invalidateType();
-        }
-    }
-
-    removeDependencyRewritePattern(index) {
-        this.repositoryForm.repoInfo.typeSpecific.externalPatterns.splice(index,1);
-    }
-
-    onDependencyRewriteEnableChange() {
-        if (this.repositoryForm.repoInfo.typeSpecific.enableExternalDependencies) {
-            if (!this.repositoryForm.repoInfo.typeSpecific.externalRemoteRepo && this.repositoryForm.repoInfo.basic.selectedRemoteRepositories) {
-                this.repositoryForm.repoInfo.typeSpecific.externalRemoteRepo = this.repositoryForm.repoInfo.basic.selectedRemoteRepositories[0];
-            }
-            if (!this.repositoryForm.repoInfo.typeSpecific.externalPatterns) {
-                this.repositoryForm.repoInfo.typeSpecific.externalPatterns = ['**'];
-            }
-        }
-    }
-
-    isDependencyRewriteOK() {
-        return !this.repositoryForm.repoInfo.typeSpecific.enableExternalDependencies || this.repositoryForm.repoInfo.typeSpecific.externalRemoteRepo;
-    }
-
-    getP2Columns() {
-        return [
-            {
-                name: 'Action',
-                displayName: 'Action',
-                field: 'action',
-                cellTemplate: '<div class="ui-grid-cell-contents">{{ row.entity.action || "included" }}</div>'
-            },
-            {
-                name: 'Repository',
-                displayName: 'Repository',
-                field: 'repoKey',
-                enableCellEdit: `{{row.entity.action === 'create'}}`
-
-            }, {
-                name: 'URL',
-                displayName: 'URL',
-                field: 'repoUrl',
-                enableCellEdit: true
-            }
-        ]
-    }
-
-    _getActions() {
-        return [
-            {
-                icon: 'icon icon-clear',
-                tooltip: 'Delete',
-                callback: (repo) => {
-                    this._deleteRepo(repo);
-                }
-            }
-        ];
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/repositories/virtual_repository_form.html b/web/angular-web/src/main/webapp/app/states/admin/repositories/virtual_repository_form.html
deleted file mode 100644
index 14f9390..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/repositories/virtual_repository_form.html
+++ /dev/null
@@ -1,414 +0,0 @@
-<div ng-controller="VirtualRepositoryFormController as VirtualRepository">
-    <div class="wizard-content">
-        <div ng-show="RepositoryForm.isCurrentTab('basic')">
-            <div class="form-group">
-                <label class="input-label-weight label-type-box mandatory">Package Type</label>
-                <ul class="list-unstyled">
-                    <li class="inline-block package-type"
-                        ng-class="{typeValidation: !RepositoryForm.repoInfo.typeSpecific.repoType, 'not-clickable': !RepositoryForm.newRepository}"
-                        ng-click="!RepositoryForm.newRepository || RepositoryForm.openRepoTypeModal()"
-                        id="repository-package-type-button">
-                        <span ng-if="!RepositoryForm.repoInfo.typeSpecific.repoType">No Type</span>
-
-                        <div ng-if="RepositoryForm.repoInfo.typeSpecific.repoType"
-                             class="repotype iconrepo iconrepo-{{RepositoryForm.repoInfo.typeSpecific.repoType.toLowerCase()}}">
-                        </div>
-                        <div class="repotitle" ng-if="RepositoryForm.repoInfo.typeSpecific.repoType">
-                            {{ RepositoryForm.repoInfo.typeSpecific.repoType === 'GitLfs' ? 'Git LFS' : RepositoryForm.repoInfo.typeSpecific.repoType }}
-                        </div>
-                    </li>
-                </ul>
-                <input class="hidden"
-                       ng-model="RepositoryForm.repoInfo.typeSpecific.repoType"
-                       name="repoType"
-                       required
-                       ng-change="RepositoryForm.setRepoLayout()"/>
-                <span ng-if="!RepositoryForm.repoInfo.typeSpecific.repoType && !RepositoryForm.isTypeModalOpen" class="repository-error" id="repository-package-type-validator">You must specify a package type</span>
-            </div>
-            <div class="form-group">
-                <div class="form-group-cell"
-                     ng-if="RepositoryForm.newRepository">
-                    <jf-field validations="repositores"
-                              autofocus="(RepositoryForm.isCurrentTab('basic') && RepositoryForm.repoInfo.typeSpecific.repoType)">
-                        <label for="repoKey-new" class="mandatory">Repository Key</label>
-                        <input type="text" class="input-text"
-                               id="repoKey-new"
-                               name="repoKey"
-                               ng-required="RepositoryForm.repositoriesForm.repoType.$valid || (!RepositoryForm.repositoriesForm.repoType.$valid && !RepositoryForm.isTypeModalOpen)"
-                               jf-repokey-validator="RepositoryForm"
-                               ng-model="RepositoryForm.repoInfo.general.repoKey"
-                               ng-change="RepositoryForm.onChangeRepoKey()"
-                               ng-model-options="{debounce: { 'default': 500 } }"
-                                />
-                    </jf-field>
-                    <ng-messages for="RepositoryForm.repositoriesForm.repoKey.$error" class="jf-validation">
-                        <div ng-message-exp="'repoKeyValidator'" id="repository-key-validator">{{ RepositoryForm.repoKeyValidatorMessage }}</div>
-                    </ng-messages>
-                </div>
-            </div>
-
-            <div class="row">
-                <div class="col-lg-6">
-                    <jf-panel jf-panel-heading="General">
-                        <div class="form-group">
-                            <div class="form-group-cell"
-                                 ng-if="!RepositoryForm.newRepository">
-                                <jf-field validations="repositores">
-                                    <label for="repoKey-edit" class="mandatory">Repository Key</label>
-                                    <input type="text" class="input-text"
-                                           id="repoKey-edit"
-                                           name="repoKey"
-                                           ng-model="RepositoryForm.repoInfo.general.repoKey"
-                                           ng-disabled="!RepositoryForm.newRepository"/>
-                                </jf-field>
-                                <ng-messages for="RepositoryForm.repositoriesForm.repoKey.$error" class="jf-validation">
-                                    <div ng-message-exp="'repoKeyValidator'" id="repository-key-validator">{{ RepositoryForm.repoKeyValidatorMessage }}</div>
-                                </ng-messages>
-                            </div>
-                            <div class="form-group-cell">
-                                <jf-field>
-                                    <label>Repository Layout</label>
-                                    <ui-select jf-disable-ng-animate ng-model="RepositoryForm.repoInfo.basic.layout">
-                                        <ui-select-match
-                                                placeholder="Select Repository Layout"
-                                                id="virtual-repository-layout-dropdown">
-                                            {{$select.selected}}
-                                        </ui-select-match>
-                                        <ui-select-choices
-                                                repeat="item in RepositoryForm.repositoryLayouts | filter: $select.search track by $index">
-                                            <div ng-bind-html="item | highlight: $select.search"
-                                                    name="virtual-repository-layout-item"></div>
-                                        </ui-select-choices>
-                                    </ui-select>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field>
-                                    <label for="publicDescription">Public Description</label>
-                        <textarea type="text"
-                                  class="input-text"
-                                  id="publicDescription"
-                                  name="publicDescription"
-                                  cols="5"
-                                  ng-model="RepositoryForm.repoInfo.basic.publicDescription">
-                        </textarea>
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell">
-                                <jf-field>
-                                    <label for="internalDescription">Internal Description</label>
-                        <textarea type="text"
-                                  class="input-text"
-                                  id="internalDescription"
-                                  name="internalDescription"
-                                  ng-model="RepositoryForm.repoInfo.basic.internalDescription"
-                                  cols="5"></textarea>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-list-maker values="RepositoryForm.repoInfo.basic.includesPatternArray"
-                                               label="Include Patterns"
-                                               help-tooltip="RepositoryForm.TOOLTIP.virtualForm.includesPattern"
-                                               object-name="Pattern">
-                                </jf-list-maker>
-<!--
-                                <jf-field>
-                                    <label for="includesPattern">Include Patterns</label>
-                                    <jf-help-tooltip html="RepositoryForm.TOOLTIP.virtualForm.includesPattern"></jf-help-tooltip>
-                                    <textarea type="text"
-                                              class="input-text"
-                                              id="includesPattern"
-                                              name="includesPattern"
-                                              ng-model="RepositoryForm.repoInfo.basic.includesPattern"
-                                              cols="5"></textarea>
-                                </jf-field>
--->
-                            </div>
-                            <div class="form-group-cell">
-                                <jf-list-maker values="RepositoryForm.repoInfo.basic.excludesPatternArray"
-                                               label="Exclude Patterns"
-                                               help-tooltip="RepositoryForm.TOOLTIP.virtualForm.excludedPattern"
-                                               object-name="Pattern">
-                                </jf-list-maker>
-<!--
-                                <jf-field>
-                                    <label for="excludesPattern">Exclude Patterns</label>
-                                    <jf-help-tooltip html="RepositoryForm.TOOLTIP.virtualForm.excludedPattern"></jf-help-tooltip>
-                                <textarea type="text" class="input-text"
-                                          id="excludesPattern"
-                                          name="excludesPattern"
-                                          ng-model="RepositoryForm.repoInfo.basic.excludesPattern"
-                                          cols="5"></textarea>
-                                </jf-field>
--->
-                            </div>
-                        </div>
-                        <jf-panel jf-panel-heading="{{RepositoryForm.repoInfo.typeSpecific.repoType}} Settings"
-                                  ng-if="RepositoryForm.repoInfo.isType('docker')">
-                            <div class="form-group">
-                                <div class="form-group-cell">
-                                    <div class="input-label-weight">API Version: <strong>V2</strong></div>
-                                </div>
-                            </div>
-                            <div class="form-group no-margin-bottom">
-                                <div class="form-group-cell">
-                                    <jf-checkbox text="Force Authentication">
-                                        <input type="checkbox"
-                                               id="forceDockerAuth"
-                                               ng-model="RepositoryForm.repoInfo.typeSpecific.forceDockerAuthentication" disabled="disabled">
-                                    </jf-checkbox>
-                                    <jf-help-tooltip
-                                            html="RepositoryForm.TOOLTIP.localForm.forceDockerAuth"></jf-help-tooltip>
-                                </div>
-                            </div>
-                        </jf-panel>
-                        <jf-panel jf-panel-heading="{{RepositoryForm.repoInfo.typeSpecific.repoType}} Settings"
-                                  ng-if="RepositoryForm.repoInfo.isType('nuget')">
-                            <div class="form-group no-margin-bottom">
-                                <div class="form-group-cell">
-                                    <jf-checkbox text="Force Authentication">
-                                        <input type="checkbox"
-                                               id="forceNuGetAuth"
-                                               ng-model="RepositoryForm.repoInfo.typeSpecific.forceNugetAuthentication">
-                                    </jf-checkbox>
-                                    <jf-help-tooltip
-                                            html="RepositoryForm.TOOLTIP.localForm.forceNugetAuth"></jf-help-tooltip>
-                                </div>
-                            </div>
-                        </jf-panel>
-                    </jf-panel>
-                </div>
-                <div class="col-lg-6">
-                    <div class="property-set-advanced"
-                         ng-if="!RepositoryForm.repoInfo.isType('p2')">
-                        <jf-panel jf-panel-heading="Repositories"
-                                  ng-if="RepositoryForm.repositoriesList">
-                            <jf-drag-drop include-list="RepositoryForm.repoInfo.basic.selectedRepositories"
-                                          exclude-list="RepositoryForm.repositoriesList"
-                                          include-display-field="repoName"
-                                          exclude-display-field="repoName"
-                                          objects-name="Repositories"
-                                          ng-if="RepositoryForm.repositoriesList && RepositoryForm.repoInfo.basic.selectedRepositories"
-                                          on-change="VirtualRepository.onChangeRepo()"
-                                          headers="{leftTitle:'Available Repositories', rightTitle:'Selected Repositories'}"></jf-drag-drop>
-                        </jf-panel>
-                        <jf-panel jf-panel-heading="Included Repositories"
-                                  ng-if="RepositoryForm.repoInfo.basic.resolvedRepositories.length">
-                            <div class="group-list-wrapper">
-                                <ul class="group-list">
-                                    <li ng-repeat="item in RepositoryForm.repoInfo.basic.resolvedRepositories"
-                                        class="group-list-item"
-                                        ng-disabled="true">{{item.repoName || item}}
-                                    </li>
-                                </ul>
-                            </div>
-                        </jf-panel>
-                        <jf-panel jf-panel-heading="Default Deployment Repository">
-                            <div class="form-group">
-                                <div class="form-group-cell">
-                                    <jf-ui-select jf-select-model="RepositoryForm.repoInfo.basic.defaultDeploymentRepo"
-                                                  jf-select-options="RepositoryForm.repoInfo.basic.selectedLocalRepositories"
-                                                  id="defaultDeploymentRepo"></jf-ui-select>
-                                </div>
-                            </div>
-                        </jf-panel>
-
-                    </div>
-
-                    <div ng-if="RepositoryForm.repoInfo.isType('p2')">
-                        <jf-panel jf-panel-heading="Local P2 Repositories">
-                            <div class="form-group">
-                                <div class="form-group-cell">
-                                    <jf-field>
-                                        <label>Local Repository</label>
-                                        <jf-ui-select jf-select-model="VirtualRepository.virtualRepo.localRepoKey"
-                                                      jf-select-options="RepositoryForm.fields.availableLocalRepos"
-                                                      id="localRepository"></jf-ui-select>
-                                    </jf-field>
-                                </div>
-                            </div>
-                            <div class="form-group">
-                                <div class="form-group-cell">
-                                    <jf-field validations="common">
-                                        <label id="pathSuffix">Path Suffix</label>
-                                        <jf-help-tooltip html="RepositoryForm.TOOLTIP.virtualForm.pathSuffix"></jf-help-tooltip>
-                                        <input type="text"
-                                               id="pathSuffixTxt"
-                                               ng-model="VirtualRepository.virtualRepo.pathSuffix"
-                                               class="input-text">
-                                    </jf-field>
-                                </div>
-                                <div class="form-group-cell form-button">
-                                    <button class="btn btn-secondary"
-                                            type="button"
-                                            ng-click="VirtualRepository.addP2Local()"
-                                            ng-disabled="!VirtualRepository.virtualRepo.localRepoKey">Add
-                                    </button>
-                                </div>
-                            </div>
-                        </jf-panel>
-                        <jf-panel jf-panel-heading="Remote P2 Repositories">
-                            <div class="form-group">
-                                <div class="form-group-cell">
-                                    <jf-field validations="common">
-                                        <label for="p2RepositoryURL">P2 Repository URL</label>
-                                        <input type="url"
-                                               id="p2RepositoryURL"
-                                               ng-model="VirtualRepository.virtualRepo.remoteUrl"
-                                               class="input-text">
-                                    </jf-field>
-                                </div>
-                                <div class="form-group-cell form-button">
-                                    <button class="btn btn-secondary"
-                                            type="button"
-                                            ng-click="VirtualRepository.addP2Remote()"
-                                            ng-disabled="!VirtualRepository.virtualRepo.remoteUrl">Add
-                                    </button>
-                                </div>
-                            </div>
-                        </jf-panel>
-                        <jf-grid grid-options="VirtualRepository.gridP2Option"
-                                 filter-field="repoKey"
-                                 filter-on-change="true"></jf-grid>
-                    </div>
-                </div>
-            </div>
-        </div>
-        <div ng-show="RepositoryForm.isCurrentTab('advanced')">
-            <div class="form-group form-checkbox">
-                <div class="form-group-cell">
-                    <jf-checkbox text="Artifactory Requests Can Retrieve Remote Artifacts">
-                        <input type="checkbox"
-                               id="requestsCanRetrieveRemoteArtifacts"
-                               ng-model="RepositoryForm.repoInfo.advanced.retrieveRemoteArtifacts">
-                    </jf-checkbox>
-                    <jf-help-tooltip html="RepositoryForm.TOOLTIP.virtualForm.artifactoryRequestCanRetrieveRemoteArtifacts"></jf-help-tooltip>
-                </div>
-            </div>
-            <div ng-if="RepositoryForm.repoInfo.isType('maven', 'gradle', 'ivy', 'sbt')">
-                <div class="form-group">
-                    <div class="form-group-cell">
-                        <jf-field>
-                            <label>Cleanup Repository References in POMs</label>
-                            <jf-help-tooltip
-                                    html="RepositoryForm.TOOLTIP.virtualForm.cleanupRepositoryReferencesinPOM"></jf-help-tooltip>
-                            <ui-select jf-disable-ng-animate ng-model="RepositoryForm.repoInfo.typeSpecific.pomCleanupPolicy">
-                                <ui-select-match id="select-header">
-                                    {{RepositoryForm.pomCleanupPolicies[$select.selected] }}
-                                </ui-select-match>
-                                <ui-select-choices
-                                        repeat="item in RepositoryForm.pomCleanupPoliciesKeys | filter: $select.search">
-                                    <div name="select-item" ng-bind-html="RepositoryForm.pomCleanupPolicies[item] | highlight: $select.search"></div>
-                                </ui-select-choices>
-                            </ui-select>
-                        </jf-field>
-                    </div>
-                </div>
-                <div class="form-group">
-                    <div class="form-group-cell" ng-if="!VirtualRepository.isSigningKeysDisable()">
-                        <jf-field>
-                            <label>Key-Pair</label>
-                            <ui-select jf-disable-ng-animate ng-model="RepositoryForm.repoInfo.typeSpecific.keyPair"
-                                       ng-if="RepositoryForm.fields.webStartKeyPairs.length">
-                                <ui-select-match>
-                                    {{$select.selected}}
-                                </ui-select-match>
-                                <ui-select-choices
-                                        repeat="item in RepositoryForm.fields.webStartKeyPairs | filter: $select.search">
-                                    <div ng-bind-html="item | highlight: $select.search"></div>
-                                </ui-select-choices>
-                            </ui-select>
-                            <div ng-if="!RepositoryForm.fields.webStartKeyPairs.length">No key-pairs are currently
-                                configured. You can add new key-pairs <a ui-sref="admin.security.signing_keys" target="_blank">here.</a>
-                            </div>
-                        </jf-field>
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-lg-6">
-                    <jf-panel jf-panel-heading="External Dependency Rewrite"
-                              ng-if="VirtualRepository.isDependencyRewriteRelevant()">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Enable Dependency Rewrite">
-                                    <input type="checkbox"
-                                           id="enableDependencyRewrite"
-                                           ng-change="VirtualRepository.onDependencyRewriteEnableChange()"
-                                           ng-model="RepositoryForm.repoInfo.typeSpecific.enableExternalDependencies">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <label>Remote Repository For Cache</label>
-                                <jf-ui-select jf-select-model="RepositoryForm.repoInfo.typeSpecific.externalRemoteRepo"
-                                              jf-select-options="RepositoryForm.repoInfo.basic.selectedRemoteRepositories"
-                                              jf-select-disabled="!RepositoryForm.repoInfo.typeSpecific.enableExternalDependencies"
-                                              id="externalDepRemoteRepo"></jf-ui-select>
-
-                                <div ng-if="!VirtualRepository.isDependencyRewriteOK()" class="jf-validation">This field is required</div>
-                            </div>
-                        </div>
-
-                        <jf-list-maker values="RepositoryForm.repoInfo.typeSpecific.externalPatterns"
-                                       label="Patterns Whitelist"
-                                       help-tooltip="RepositoryForm.TOOLTIP.virtualForm.externalDependenciesPatterns"
-                                       object-name="Pattern"
-                                       min-length="1"
-                                       ng-disabled="!RepositoryForm.repoInfo.typeSpecific.enableExternalDependencies">
-                        </jf-list-maker>
-<!--
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="properties" autofocus="!PropertyForm.isNew">
-                                    <label>Patterns Whitelist</label>
-                                    <jf-help-tooltip
-                                            html="RepositoryForm.TOOLTIP.virtualForm.externalDependenciesPatterns"></jf-help-tooltip>
-                                    <input
-                                            type="text"
-                                            class="input-text"
-                                            ng-model="RepositoryForm.newValue"
-                                            placeholder="New Pattern"
-                                            id="newPatternField"
-                                            name="newPatternField"
-                                            ng-model-options="{updateOn: 'default blur', debounce: { 'default': 500, 'blur': 0 } }"
-                                            jf-enter-press="VirtualRepository.addDependencyRewritePattern()"
-                                            ng-disabled="!RepositoryForm.repoInfo.typeSpecific.enableExternalDependencies">
-                                </jf-field>
-                                <div class="jf-validation">{{VirtualRepository.errorMessage}}</div>
-                            </div>
-                            <div class="form-group-cell form-button auto-width">
-                                <button type="button" class="btn btn-secondary"
-                                        ng-click="VirtualRepository.addDependencyRewritePattern()"
-                                        ng-disabled="!RepositoryForm.repoInfo.typeSpecific.enableExternalDependencies">Add</button>
-                            </div>
-                        </div>
-
-                        <div id="property-set-list" ng-if="RepositoryForm.repoInfo.typeSpecific.externalPatterns.length">
-                            <div class="property-set-row" ng-repeat="pattern in RepositoryForm.repoInfo.typeSpecific.externalPatterns track by $index">
-                                <div>{{pattern}}</div>
-                                <div class="property-set-buttons">
-                                    <a href="" class="icon icon-clear"
-                                       ng-click="RepositoryForm.repoInfo.typeSpecific.enableExternalDependencies && VirtualRepository.removeDependencyRewritePattern($index)"
-                                       ng-if="RepositoryForm.repoInfo.typeSpecific.externalPatterns.length > 1"
-                                       ng-disabled="!RepositoryForm.repoInfo.typeSpecific.enableExternalDependencies"></a>
-                                </div>
-                            </div>
-                        </div>
--->
-                    </jf-panel>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-lg-6">
-                    <ng-include src="'states/admin/repositories/reverse_proxy.html'"></ng-include>
-                </div>
-            </div>
-        </div>
-    </div>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/crowd_integration/crowd_integration.controller.js b/web/angular-web/src/main/webapp/app/states/admin/security/crowd_integration/crowd_integration.controller.js
deleted file mode 100644
index b212655..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/crowd_integration/crowd_integration.controller.js
+++ /dev/null
@@ -1,193 +0,0 @@
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-
-export class CrowdIntegrationController {
-    constructor($scope, CrowdIntegrationDao, ArtifactoryGridFactory, commonGridColumns, uiGridConstants, ArtifactoryModelSaver) {
-        this.crowdIntegrationDao = CrowdIntegrationDao;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.$scope = $scope;
-        this.crowdGroupsOptions = null;
-        this.crowd = {};
-        this.groupsData = [];
-        this.commonGridColumns = commonGridColumns;
-        this.uiGridConstants = uiGridConstants;
-        this.artifactoryModelSaver = ArtifactoryModelSaver.createInstance(this,['crowd']);
-        this._createGrid();
-        this.crowdGroupsError = null;
-        this.batchActions = this._getBatchActions();
-        this.initCrowd();
-        this.usernameFilter = '';
-        this.filterType = 'User Name';
-        this.TOOLTIP = TOOLTIP.admin.security.crowd_integration;
-        this.connectionMethod = 'Crowd';
-    }
-
-    importCrowd(row) {
-        row.importIntoArtifactory = true;
-        this.crowdIntegrationDao.import({
-            action: 'import'
-        }, [row]).$promise.then((data)=> {
-                    this.initCrowd();
-                });
-    }
-
-    importCrowds() {
-        let selectedCrowds = this.crowdGroupsOptions.api.selection.getSelectedRows();
-        selectedCrowds.forEach(row=> {
-            row.importIntoArtifactory = true
-        });
-        this.crowdIntegrationDao.import({
-            action: 'import'
-        }, selectedCrowds).$promise
-            .then((data)=> {
-                    this.initCrowd();
-            });
-    }
-
-    _getBatchActions() {
-        return [
-            {
-                icon: 'import',
-                name: 'Import',
-                callback: () => this.importCrowds()
-            }
-        ]
-    }
-
-    _getActions() {
-        return [
-            {
-                icon: 'icon icon-import',
-                tooltip: 'Import',
-                callback: row => this.importCrowd(row)
-            }
-        ]
-    }
-
-
-    initCrowd() {
-        this.loadFromServer().then(() => {
-            if (!this.initialized) {
-                this.initialized = true;
-            }
-            else this.getCrowdGroups()
-
-        });
-    }
-
-    loadFromServer(retainEnabled = false) {
-        return this.crowdIntegrationDao.get().$promise.then((data)=> {
-            // Keep enabled
-            if (retainEnabled && this.crowd) data.enableIntegration = this.crowd.enableIntegration;
-            this.connectionMethod = data.directAuthentication ? 'JIRA' : 'Crowd';
-            this.crowd = data;
-            if (!retainEnabled) this.artifactoryModelSaver.save();
-        });
-    }
-
-    getCrowdGroups() {
-        if (this.crowd.enableIntegration && this.crowd.serverUrl && this.crowd.applicationName) {
-            this.crowdIntegrationDao.refresh({name: this.usernameFilter}, {
-                serverUrl: this.crowd.serverUrl,
-                applicationName: this.crowd.applicationName,
-                enableIntegration: this.crowd.enableIntegration,
-                noAutoUserCreation: this.crowd.noAutoUserCreation,
-                useDefaultProxy: this.crowd.useDefaultProxy,
-                directAuthentication: this.crowd.directAuthentication,
-                sessionValidationInterval: this.crowd.sessionValidationInterval,
-                password: this.crowd.password
-            }).$promise
-                .then((result)=> {
-                        this.groupsData = result.data.crowdGroupModels;
-                        this.crowdGroupsOptions.setGridData(this.groupsData);
-                })
-                .catch((result)=> {
-                        console.log("exception")
-                    this.crowdGroupsError = result.data.error;
-                    this.crowdGroupsOptions.setGridData([]);
-                })
-        }
-        else {
-            this.crowdGroupsError = null;
-            if (this.crowdGroupsOptions) this.crowdGroupsOptions.setGridData([]);
-        }
-    }
-    changeFilter() {
-        this.usernameFilter = '';
-        this.getCrowdGroups();
-    }
-    isFilteringBy(filterType) {
-        return this.filterType == filterType;
-    }
-
-    _createGrid() {
-        this.crowdGroupsOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-            .setColumns(this._getColumns())
-            .setRowTemplate('default')
-            .setMultiSelect()
-            .setBatchActions(this._getBatchActions())
-            .setButtons(this._getActions())
-            .setGridData(this.groupsData)
-    }
-
-    _getColumns() {
-        return [
-            {
-                name: 'Group Name',
-                displayName: 'Group Name',
-                field: 'groupName',
-                sort: {
-                    direction: this.uiGridConstants.ASC
-                },
-                width: '45%'
-            },
-            {
-                name: 'Description',
-                displayName: 'Description',
-                field: 'description',
-                width: '45%'
-            },
-            {
-                name: 'Synced',
-                displayName: 'Synced',
-                field: 'existsInArtifactory',
-                cellTemplate: this.commonGridColumns.booleanColumn('row.entity.existsInArtifactory'),
-                width: '10%'
-            }/*,
-            {
-                name: 'Import',
-                field: 'importIntoArtifactory'
-            }*/
-        ]
-    }
-
-    saveCrowd() {
-        this.crowd.directAuthentication = this.connectionMethod === 'JIRA';
-        this.crowdIntegrationDao.update(this.crowd)
-                .$promise.then(() => {
-                    this.artifactoryModelSaver.save();
-                    this.getCrowdGroups()
-                });
-    }
-
-    reset() {
-        this.artifactoryModelSaver.ask().then(()=>{
-            this.initCrowd();
-        });
-    }
-    testCrowd() {
-        this.crowd.directAuthentication = this.connectionMethod === 'JIRA';
-        this.crowd.action = 'test';
-        this.crowdIntegrationDao.test({
-            action: 'test',
-            serverUrl: this.crowd.serverUrl,
-            applicationName: this.crowd.applicationName,
-            enableIntegration: this.crowd.enableIntegration,
-            noAutoUserCreation: this.crowd.noAutoUserCreation,
-            useDefaultProxy: this.crowd.useDefaultProxy,
-            directAuthentication: this.directAuthentication,
-            sessionValidationInterval: this.crowd.sessionValidationInterval,
-            password: this.crowd.password
-
-        }).$promise.then((data)=>{});
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/crowd_integration/crowd_integration.html b/web/angular-web/src/main/webapp/app/states/admin/security/crowd_integration/crowd_integration.html
deleted file mode 100644
index 9c88694..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/crowd_integration/crowd_integration.html
+++ /dev/null
@@ -1,166 +0,0 @@
-<div class="content-layout-container">
-    <h1>Crowd / JIRA Users Management Configuration</h1>
-
-    <div class="content-wrapper">
-        <div class="card stretch card-pole-pad card-side-pad">
-            <div class="content-with-footer">
-                <form class="form" name="crowdForm" novalidate>
-                    <jf-panel jf-panel-heading="Server Settings">
-                        <div class="form-group form-checkbox">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Enable Crowd / JIRA Users Management Integration">
-                                    <input type="checkbox"
-                                           id="enabled"
-                                           ng-model="Crowd.crowd.enableIntegration"
-                                           ng-change="Crowd.loadFromServer(true)">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-switch jf-switch-title="Users Management Server:" ng-model="Crowd.connectionMethod" options="['Crowd', 'JIRA']" ng-disabled="!Crowd.crowd.enableIntegration"></jf-switch>
-                            </div>
-                        </div>
-
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="crowd" autofocus="true">
-                                    <label for="serverUrl" class="mandatory">Server URL</label>
-                                    <input type="url"
-                                           class="input-text"
-                                           id="serverUrl"
-                                           name="serverUrl"
-                                           required
-                                           ng-model="Crowd.crowd.serverUrl"
-                                           ng-disabled="!Crowd.crowd.enableIntegration"/>
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell">
-                                <jf-field validations="crowd">
-                                    <label for="applicationName" class="mandatory">Application Name</label>
-                                    <input type="text"
-                                           class="input-text"
-                                           id="applicationName"
-                                           name="applicationName"
-                                           required
-                                           ng-model="Crowd.crowd.applicationName"
-                                           ng-disabled="!Crowd.crowd.enableIntegration"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="crowd">
-                                    <label for="password" class="mandatory">Application Password</label>
-                                    <input type="password"
-                                           class="input-text"
-                                           id="password"
-                                           name="password"
-                                           required
-                                           ng-model="Crowd.crowd.password"
-                                           ng-disabled="!Crowd.crowd.enableIntegration"/>
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell">
-                                <jf-field validations="crowd">
-                                    <label for="sessionValidationInterval" class="mandatory">Session Validation Interval (Min)</label>
-                                    <jf-help-tooltip html="Crowd.TOOLTIP.sessionValidationInterval"></jf-help-tooltip>
-                                    <input type="number"
-                                           min="0"
-                                           max="9999999999999"
-                                           class="input-text"
-                                           id="sessionValidationInterval"
-                                           name="sessionValidationInterval"
-                                           required
-                                           ng-model="Crowd.crowd.sessionValidationInterval"
-                                           ng-disabled="!Crowd.crowd.enableIntegration"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group form-checkbox">
-                            <!--<div class="form-group-cell">
-                                <jf-checkbox text="Use JIRA User Server">
-                                    <input
-                                            type="checkbox"
-                                            id="directAuthentication"
-                                            ng-model="Crowd.crowd.directAuthentication"
-                                            ng-disabled="!Crowd.crowd.enableIntegration">
-                                </jf-checkbox>
-                                <jf-help-tooltip html="Crowd.TOOLTIP.useJIRAUserServer"></jf-help-tooltip>
-                            </div>-->
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Use Default Proxy Configuration">
-                                    <input
-                                            type="checkbox"
-                                            id="useDefaultProxy"
-                                            ng-model="Crowd.crowd.useDefaultProxy"
-                                            ng-disabled="!Crowd.crowd.enableIntegration">
-                                </jf-checkbox>
-                                <jf-help-tooltip html="Crowd.TOOLTIP.useDefaultProxyConfiguration"></jf-help-tooltip>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Auto Create Artifactory Users">
-                                    <input type="checkbox"
-                                           id="noAutoUserCreation"
-                                           ng-model="Crowd.crowd.noAutoUserCreation"
-                                           ng-disabled="!Crowd.crowd.enableIntegration">
-                                </jf-checkbox>
-                                <jf-help-tooltip html="Crowd.TOOLTIP.autoCreateArtifactoryUsers"></jf-help-tooltip>
-                            </div>
-                        </div>
-                        <div class="pull-right">
-                            <button class="btn btn-secondary"
-                                    type="button"
-                                    ng-click="Crowd.testCrowd()"
-                                    ng-disabled="!Crowd.crowd.enableIntegration || crowdForm.$invalid">
-                                Test
-                            </button>
-                        </div>
-                    </jf-panel>
-
-                    <jf-panel jf-panel-heading="Synchronize Groups">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <input type="text"
-                                       class="input-text"
-                                       jf-validator-max-text-length="1024"
-                                       name="usernameFilter"
-                                       ng-model="Crowd.usernameFilter"
-                                       placeholder="Search Group by Username (leave blank for *)"/>
-                            </div>
-                            <div class="form-group-cell form-link">
-                                <a href="" class="form-search"
-                                   ng-click="Crowd.getCrowdGroups()">
-                                    <i class="icon icon-search-specific"></i>
-                                </a>
-                            </div>
-                        </div>
-
-                        <jf-grid grid-options="Crowd.crowdGroupsOptions"
-                                 filter-field="groupName"
-                                 filter-on-change="true"
-                                 object-name="Group">
-                        </jf-grid>
-                    </jf-panel>
-                </form>
-            </div>
-        </div>
-        <div class="content-footer">
-            <div class="pull-right">
-                <button class="btn btn-default"
-                        type="button"
-                        ng-click="Crowd.reset()">Reset
-                </button>
-                <button class="btn btn-primary"
-                        type="button"
-                        ng-click="Crowd.saveCrowd()"
-                        ng-disabled="crowdForm.$invalid">
-                    Save
-                </button>
-            </div>
-        </div>
-
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/crowd_integration/crowd_integration.module.js b/web/angular-web/src/main/webapp/app/states/admin/security/crowd_integration/crowd_integration.module.js
deleted file mode 100644
index c28f400..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/crowd_integration/crowd_integration.module.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import {CrowdIntegrationController} from './crowd_integration.controller';
-
-function crowdIntegrationConfig($stateProvider) {
-
-    $stateProvider
-            .state('admin.security.crowd_integration', {
-                params: {feature: 'crowd'},
-                url: '/crowd_integration',
-                templateUrl: 'states/admin/security/crowd_integration/crowd_integration.html',
-                controller: 'CrowdIntegrationController as Crowd'
-            })
-}
-
-export default angular.module('security.crowd_integration', [])
-        .config(crowdIntegrationConfig)
-        .controller('CrowdIntegrationController', CrowdIntegrationController);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/general/general.controller.js b/web/angular-web/src/main/webapp/app/states/admin/security/general/general.controller.js
deleted file mode 100644
index 4c8a629..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/general/general.controller.js
+++ /dev/null
@@ -1,103 +0,0 @@
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-
-export class AdminSecurityGeneralController {
-
-    constructor(AdminSecurityGeneralDao, PasswordsEncryptionDao, ArtifactoryModelSaver, UserProfileDao, ArtifactoryModal, UserDao, ArtifactoryNotifications, User) {
-        this.adminSecurityGeneralDao = AdminSecurityGeneralDao;
-        this.passwordsEncryptionDao = PasswordsEncryptionDao.getInstance();
-        this.options = ['SUPPORTED', 'UNSUPPORTED', 'REQUIRED'];
-        this.modal = ArtifactoryModal;
-        this.User = User;
-        this.TOOLTIP = TOOLTIP.admin.security.general;
-        this.artifactoryModelSaver = ArtifactoryModelSaver.createInstance(this,['generalConfig']);
-        this.userProfileDao = UserProfileDao;
-        this.userDao = UserDao.getInstance();
-        this.artifactoryNotifications = ArtifactoryNotifications;
-
-        this.userDao.getAll().$promise.then((users)=> {
-            this.userNames = _.pluck(users,'name');
-        });
-
-        this.getGeneralConfigObject();
-        this.getMasterKeyStatus();
-    }
-
-    getEncryptionButtonText() {
-        return this.materKeyState.hasMasterKey ? "Decrypt" : "Encrypt";
-    }
-
-    getEncryptionStatusText() {
-        return this.materKeyState.hasMasterKey ? "All passwords in your configuration are currently encrypted." :
-                "All passwords in your configuration are currently visible in plain text.";
-    }
-
-    getGeneralConfigObject() {
-        this.adminSecurityGeneralDao.get().$promise.then((data) => {
-            this.generalConfig = data;
-            this.artifactoryModelSaver.save();
-        });
-    }
-
-    getMasterKeyStatus() {
-        this.materKeyState = this.passwordsEncryptionDao.get();
-    }
-    forcePassExpForAll() {
-        if (!this.generalConfig.passwordSettings.expirationPolicy.enabled) return;
-        this.modal.confirm(`Are you sure you want to expire all user's passwords?`)
-            .then(() => {
-                this.userDao.expireAllPassword();
-            });
-    }
-
-    unExpireAll() {
-        if (!this.generalConfig.passwordSettings.expirationPolicy.enabled) return;
-        this.modal.confirm(`Are you sure you want to unexpire all user's expired passwords?`)
-            .then(() => {
-                this.userDao.unExpireAllPassword();
-            });
-    }
-
-    toggleEncryption() {
-        let self = this;
-
-        if (this.materKeyState.hasMasterKey) {
-            this.materKeyState.$decrypt().then(function () {
-                self.getMasterKeyStatus();
-            })
-        } else {
-            this.materKeyState.$encrypt().then(function () {
-                self.getMasterKeyStatus();
-            });
-        }
-    }
-
-    save() {
-        this.adminSecurityGeneralDao.update(this.generalConfig).$promise.then(()=>{
-            this.artifactoryModelSaver.save();
-            this.User.reload();
-        });
-    }
-
-    cancel() {
-        this.artifactoryModelSaver.ask().then(()=>{
-            this.getGeneralConfigObject();
-        });
-    }
-
-    onClickAllowAnonymousAccess() {
-        if (!this.generalConfig.anonAccessEnabled) {
-            this.generalConfig.anonAccessToBuildInfosDisabled = false;
-        }
-    }
-
-    revokeApiKeys() {
-        this.modal.confirm(`Are you sure you want to revoke all users API keys?`)
-                .then(() => {
-                    this.userProfileDao.revokeApiKey({deleteAll: 1});
-                });
-    }
-
-    unlockAllUsers() {
-        this.adminSecurityGeneralDao.unlockAllUsers();
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/general/general.html b/web/angular-web/src/main/webapp/app/states/admin/security/general/general.html
deleted file mode 100644
index 8c1143b..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/general/general.html
+++ /dev/null
@@ -1,190 +0,0 @@
-<div class="content-layout-container">
-    <h1>General Security Configuration</h1>
-
-    <div class="content-wrapper">
-        <div class="card stretch card-pole-pad card-side-pad">
-            <div class="content-with-footer">
-                <jf-panel jf-panel-heading="General Security Settings">
-                    <form class="form" name="AdminSecurityGeneral.genForm">
-                        <div class="form-group form-checkbox">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Allow Anonymous Access">
-                                    <input id="inlineCheckbox1"
-                                           type="checkbox"
-                                           name="inlineCheckbox1"
-                                           ng-click="AdminSecurityGeneral.onClickAllowAnonymousAccess()"
-                                           ng-model="AdminSecurityGeneral.generalConfig.anonAccessEnabled">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                        <div class="form-group form-checkbox">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Prevent Anonymous Access to Build Related Info">
-                                    <input id="inlineCheckbox2"
-                                           type="checkbox"
-                                           name="inlineCheckbox2"
-                                           ng-disabled="!AdminSecurityGeneral.generalConfig.anonAccessEnabled"
-                                           ng-model="AdminSecurityGeneral.generalConfig.anonAccessToBuildInfosDisabled">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Hide Existence of Unauthorized Resources">
-                                    <input type="checkbox"
-                                           id="inlineCheckbox3"
-                                           ng-model="AdminSecurityGeneral.generalConfig.hideUnauthorizedResources">
-                                </jf-checkbox>
-                                <jf-help-tooltip html="AdminSecurityGeneral.TOOLTIP.hideExistenceOfUnauthorizedResources"></jf-help-tooltip>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field>
-                                    <label class="control-label">Password Encryption Policy</label>
-                                    <jf-help-tooltip html="AdminSecurityGeneral.TOOLTIP.passwordEncryptionPolicy"></jf-help-tooltip>
-                                    <jf-ui-select jf-select-model="AdminSecurityGeneral.generalConfig.passwordSettings.encryptionPolicy"
-                                                  jf-select-options="AdminSecurityGeneral.options">
-                                    </jf-ui-select>
-                                </jf-field>
-                            </div>
-                        </div>
-                    </form>
-                </jf-panel>
-                <jf-panel jf-panel-heading="User Locking">
-                    <form class="form">
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Lock User After Exceeding Max Failed Login Attempts">
-                                <input type="checkbox"
-                                       id="lockUsers"
-                                       ng-model="AdminSecurityGeneral.generalConfig.userLockPolicy.enabled">
-                            </jf-checkbox>
-                        </div>
-                    </div>
-                    <div class="form-group half-margin-bottom">
-                        <div class="form-group-cell">
-                            <jf-field validations="common">
-                                <label for="maxAttempts">Max Failed Login Attempts</label>
-                                <input type="number"
-                                       class="input-text"
-                                       required
-                                       min="1"
-                                       max="100"
-                                       ng-disabled="!AdminSecurityGeneral.generalConfig.userLockPolicy.enabled"
-                                       id="maxAttempts"
-                                       name="maxAttempts"
-                                       ng-model="AdminSecurityGeneral.generalConfig.userLockPolicy.loginAttempts"/>
-                            </jf-field>
-                        </div>
-                    </div>
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <div ng-disabled="!AdminSecurityGeneral.generalConfig.userLockPolicy.enabled"
-                                 ng-click="AdminSecurityGeneral.generalConfig.userLockPolicy.enabled && AdminSecurityGeneral.unlockAllUsers()"
-                                 class="text-button">
-                                <span class="icon icon-unlock"></span>Unlock All Users
-                            </div>
-                        </div>
-                    </div>
-                    </form>
-                </jf-panel>
-                <jf-panel jf-panel-heading="Password Expiration Policy">
-                    <form class="form">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Enable Password Expiration Policy">
-                                    <input type="checkbox"
-                                           id="enablePassExp"
-                                           ng-model="AdminSecurityGeneral.generalConfig.passwordSettings.expirationPolicy.enabled">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="common">
-                                    <label for="passExpDays">Password Expires Every (Days)</label>
-                                    <jf-help-tooltip html="AdminSecurityGeneral.TOOLTIP.passwordMaxAge"></jf-help-tooltip>
-                                    <input type="number"
-                                           class="input-text"
-                                           required
-                                           min="1"
-                                           max="999"
-                                           ng-disabled="!AdminSecurityGeneral.generalConfig.passwordSettings.expirationPolicy.enabled"
-                                           id="passExpDays"
-                                           name="passExpDays"
-                                           ng-model="AdminSecurityGeneral.generalConfig.passwordSettings.expirationPolicy.passwordMaxAge"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group half-margin-bottom">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Send Mail Notification Before Password Expiration">
-                                    <input type="checkbox"
-                                           id="sendMailBeforePassExp"
-                                           ng-disabled="!AdminSecurityGeneral.generalConfig.passwordSettings.expirationPolicy.enabled"
-                                           ng-model="AdminSecurityGeneral.generalConfig.passwordSettings.expirationPolicy.notifyByEmail">
-                                </jf-checkbox>
-                                <jf-help-tooltip html="AdminSecurityGeneral.TOOLTIP.notifyByMail"></jf-help-tooltip>
-                            </div>
-                        </div>
-                        <div class="form-group half-margin-bottom">
-                            <div class="form-group-cell">
-                                <div ng-click="AdminSecurityGeneral.forcePassExpForAll()" class="text-button warning-button"
-                                     ng-disabled="!AdminSecurityGeneral.generalConfig.passwordSettings.expirationPolicy.enabled">
-                                    <span class="icon icon-clear"></span>Force Password Expiration For All Users
-                                </div>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <div ng-click="AdminSecurityGeneral.unExpireAll()" class="text-button"
-                                     ng-disabled="!AdminSecurityGeneral.generalConfig.passwordSettings.expirationPolicy.enabled">
-                                    <span class="icon icon-go"></span>Unexpire Expired Passwords For All Users
-                                </div>
-                            </div>
-                        </div>
-
-                    </form>
-                </jf-panel>
-                <jf-panel jf-panel-heading="API Keys Management">
-                    <form>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <div ng-click="AdminSecurityGeneral.revokeApiKeys()" class="text-button warning-button">
-                                    <span class="icon icon-clear"></span>Revoke API Keys For All Users
-                                </div>
-                            </div>
-                        </div>
-                    </form>
-                </jf-panel>
-                <jf-panel jf-panel-heading="Passwords Encryption">
-                    <form class="form">
-                        <div class="alert alert-info">{{AdminSecurityGeneral.getEncryptionStatusText()}}</div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <button class="btn btn-secondary"
-                                        ng-click="AdminSecurityGeneral.toggleEncryption()">
-                                    {{ AdminSecurityGeneral.getEncryptionButtonText() }}
-                                </button>
-                                <!--<jf-help-tooltip ng-if="AdminSecurityGeneral.getEncryptionButtonText() === 'Encrypt'"-->
-                                                 <!--html="AdminSecurityGeneral.TOOLTIP.encrypt"></jf-help-tooltip>-->
-                                <!--<jf-help-tooltip ng-if="AdminSecurityGeneral.getEncryptionButtonText() === 'Decrypt'"-->
-                                                 <!--html="AdminSecurityGeneral.TOOLTIP.decrypt"></jf-help-tooltip>-->
-                            </div>
-                        </div>
-                    </form>
-                </jf-panel>
-            </div>
-        </div>
-
-        <div class="content-footer">
-            <div class="pull-right">
-                <button class="btn btn-default" type="button" ng-click="AdminSecurityGeneral.cancel()">Reset</button>
-                <button class="btn btn-primary"
-                        ng-click="AdminSecurityGeneral.save()"
-                        ng-disabled="!AdminSecurityGeneral.genForm.$valid">Save</button>
-            </div>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/general/general.module.js b/web/angular-web/src/main/webapp/app/states/admin/security/general/general.module.js
deleted file mode 100644
index 8d568cf..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/general/general.module.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import {AdminSecurityGeneralController} from './general.controller';
-
-function securityGeneralConfig($stateProvider) {
-
-    $stateProvider
-            .state('admin.security.general', {
-                url: '/general',
-                templateUrl: 'states/admin/security/general/general.html',
-                controller: 'AdminSecurityGeneralController as AdminSecurityGeneral'
-            })
-}
-
-export default angular.module('security.general', [])
-        .config(securityGeneralConfig)
-        .controller('AdminSecurityGeneralController', AdminSecurityGeneralController);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/groups/group.controller.js b/web/angular-web/src/main/webapp/app/states/admin/security/groups/group.controller.js
deleted file mode 100644
index ccebe26..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/groups/group.controller.js
+++ /dev/null
@@ -1,107 +0,0 @@
-export class AdminSecurityGroupsController {
-
-    constructor(ArtifactoryModal, $scope, $state, GroupsDao, ArtifactoryGridFactory, uiGridConstants, commonGridColumns) {
-        this.DEFAULT_REALM = "artifactory";
-        this.gridOption = {};
-        this.uiGridConstants = uiGridConstants;
-        this.commonGridColumns = commonGridColumns;
-        this.groupsDao = GroupsDao.getInstance();
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.modal = ArtifactoryModal;
-        this.$scope = $scope;
-        this.$state = $state;
-        this._createGrid();
-        this._initGroups();
-    }
-
-    _initGroups() {
-        this.groupsDao.getAll().$promise.then((groups)=> {
-            this.gridOption.setGridData(groups);
-        });
-    }
-
-    _createGrid() {
-        this.gridOption = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setColumns(this.getColumns())
-                .setButtons(this._getActions())
-                .setMultiSelect()
-                .setRowTemplate('default')
-                .setBatchActions(this._getBatchActions());
-    }
-
-    deleteGroup(group) {
-        let json = {groupNames:[group.groupName]}
-        this.modal.confirm(`Are you sure you want to delete group '${group.name}?'`)
-            .then(() => this.groupsDao.delete(json).$promise.then(()=>this._initGroups()));
-    }
-
-    bulkDelete() {
-        //Get All selected users
-        let selectedRows = this.gridOption.api.selection.getSelectedRows();
-        //Create an array of the selected groups names
-        let names = _.map(selectedRows, (group) => {return group.groupName;});
-        //Create Json for the bulk request
-        let json = {groupNames: names};
-        //console.log('Bulk delete....');
-        //Ask for confirmation before delete and if confirmed then delete bulk of users
-        this.modal.confirm(`Are you sure you want to delete ${names.length} groups ?`).
-        then(() => this.groupsDao.delete(json).$promise.then(() => this._initGroups()));
-    }
-    getColumns() {
-        return [
-            {
-                field: "groupName",
-                name: "Group Name",
-                displayName: "Group Name",
-                cellTemplate: '<div class="ui-grid-cell-contents" ui-sref="^.groups.edit({groupname: row.entity.groupName})"><a href="">{{row.entity.groupName}}</a></div>',
-                sort: {
-                    direction: this.uiGridConstants.ASC
-                },
-                width: '20%'
-            },
-            {
-                field: "permissions",
-                name: "Permissions",
-                displayName: "Permissions",
-                cellTemplate: this.commonGridColumns.listableColumn('row.entity.permissions','row.entity.groupName'),
-                width: '60%'
-            },
-            {
-                name: "External",
-                displayName: "External",
-                field: "External",
-                cellTemplate: this.commonGridColumns.booleanColumn('row.entity.external'),
-                width: '10%'
-            },
-
-            {
-                name: "Auto Join",
-                displayName: "Auto Join",
-                field: "Auto Join",
-                cellTemplate: this.commonGridColumns.booleanColumn('row.entity.autoJoin'),
-                width: '10%'
-            }
-        ]
-    }
-
-    _getActions() {
-        return [
-            {
-                icon: 'icon icon-clear',
-                tooltip: 'Delete',
-                callback: (row) => this.deleteGroup(row)
-            }
-
-        ];
-    }
-   _getBatchActions() {
-        return [
-            {
-                icon: 'clear',
-                name: 'Delete',
-                callback: () => this.bulkDelete()
-            }
-        ]
-    }
-
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/groups/group_form.controller.js b/web/angular-web/src/main/webapp/app/states/admin/security/groups/group_form.controller.js
deleted file mode 100644
index 3cd761f..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/groups/group_form.controller.js
+++ /dev/null
@@ -1,215 +0,0 @@
-export class AdminSecurityGroupFormController {
-    constructor($scope, $state, $stateParams, $timeout, $q, ArtifactoryGridFactory, GroupsDao, UserDao, GroupPermissionsDao,
-            commonGridColumns,ArtifactoryModelSaver,RepositoriesDao) {
-        this.DEFAULT_REALM = "artifactory";
-        this.$scope = $scope;
-        this.$state = $state;
-        this.$stateParams = $stateParams;
-        this.$timeout = $timeout;
-        this.$q = $q;
-        this.repositoriesDao = RepositoriesDao;
-        this.userDao = UserDao.getInstance();
-        this.groupsDao = GroupsDao.getInstance();
-        this.groupPermissionsDao = GroupPermissionsDao.getInstance();
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.permissionsGridOptions = {};
-        this.commonGridColumns = commonGridColumns;
-        this.artifactoryModelSaver = ArtifactoryModelSaver.createInstance(this,['groupdata']);
-        this.input = {};
-
-
-        if ($stateParams.groupname) {
-            this.mode = 'edit';
-            this.groupname = $stateParams.groupname;
-            this.title = 'Edit ' + this.groupname + ' Group';
-            this._getGroupData();
-            this._createGrid();
-            this._getPermissions();
-        }
-        else {
-            this.mode = 'create';
-            this.title = 'Add New Group';
-            this.groupdata = {};
-        }
-
-        this._getAllRepos();
-        this._getAllUsers();
-
-    }
-
-    _getAllRepos() {
-        this.reposData = {};
-        this.repositoriesDao.getRepositories({type:'local'}).$promise
-                .then((data) => {
-                    this.reposData.locals = _.map(data,(r)=>{return r.repoKey;});
-                });
-        this.repositoriesDao.getRepositories({type:'remote'}).$promise
-                .then((data) => {
-                    this.reposData.remotes = _.map(data,(r)=>{return r.repoKey;});
-                });
-    }
-
-    _getGroupData() {
-        this.groupsDao.getSingle({name: this.groupname}).$promise.then((data) => {
-            //console.log(data);
-            this.groupdata = data;
-            this.artifactoryModelSaver.save();
-        });
-    }
-
-    _getAllUsers() {
-        this.userDao.getAll().$promise.then((data)=> {
-            this.usersData = data;
-            this.usersList = _.map(data, (user)=> {
-                return user.name;
-            });
-
-        });
-    }
-
-
-    _createGrid() {
-        this.permissionsGridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-            .setColumns(this._getPermissionCloumns())
-            .setRowTemplate('default');
-
-    }
-
-    _getPermissions() {
-        this.groupPermissionsDao.get({groups: [this.groupname]}).$promise.then((data)=> {
-            //console.log(data);
-            this._fixDataFormat(data).then((fixedData)=>{
-                this.permissionsGridOptions.setGridData(fixedData);
-            });
-        });
-    }
-
-    _fixDataFormat(data,defer = null) {
-        let defer = defer || this.$q.defer();
-        if (this.reposData.locals && this.reposData.remotes) {
-            data.forEach((record)=>{
-                if (record.repoKeys.length === 1 && record.repoKeys[0] === 'ANY LOCAL') {
-                    record.repoKeysView = 'ANY LOCAL';
-                    record.reposList = angular.copy(this.reposData.locals);
-                }
-                else if (record.repoKeys.length === 1 && record.repoKeys[0] === 'ANY REMOTE') {
-                    record.repoKeysView = 'ANY REMOTE';
-                    record.reposList = angular.copy(this.reposData.remotes);
-                }
-                else if (record.repoKeys.length === 1 && record.repoKeys[0] === 'ANY') {
-                    record.repoKeysView = 'ANY';
-                    record.reposList = angular.copy(this.reposData.remotes).concat(this.reposData.locals);
-                }
-                else {
-                    record.repoKeysView = record.repoKeys.join(', ');
-                    record.reposList = angular.copy(record.repoKeys);
-                }
-            });
-            defer.resolve(data);
-        }
-        else {
-            this.$timeout(()=>{
-                this._fixDataFormat(data,defer);
-            })
-        }
-        return defer.promise;
-    }
-
-    updateGroup() {
-        let payload = angular.copy(this.groupdata);
-        _.extend(payload, this.input);
-        this.groupsDao.update({name: this.groupdata.groupName}, payload).$promise.then((data) => {
-            this.artifactoryModelSaver.save();
-            this.$state.go('^.groups');
-        });
-    }
-
-    createNewGroup() {
-        let payload = angular.copy(this.groupdata);
-        payload.realm = this.DEFAULT_REALM;
-        _.extend(payload, this.input);
-        this.groupsDao.create(payload).$promise.then((data) => {
-            this.artifactoryModelSaver.save();
-            this.$state.go('^.groups');
-        });
-    }
-
-    save() {
-        if (this.mode === 'edit')
-            this.updateGroup();
-        if (this.mode === 'create')
-            this.createNewGroup();
-    }
-
-    isSaveDisabled() {
-        return this.groupForm.$invalid;
-    }
-
-
-    cancel() {
-        this.$state.go('^.groups');
-    }
-
-    _getPermissionCloumns() {
-
-        let nameCellTemplate = '<div class="ui-grid-cell-contents"><a href ui-sref="admin.security.permissions.edit({permission: row.entity.permissionName})">{{row.entity.permissionName}}</a></div>';
-
-        return [
-            {
-                field: "permissionName",
-                name: "Permission Target",
-                displayName: "Permission Target",
-                cellTemplate: nameCellTemplate,
-                width:'20%'
-            },
-/*
-            {
-                field: "effectivePermission.principal",
-                displayName: "Inherited From"
-            },
-*/
-            {
-                field: "repoKeys",
-                name: "Repositories",
-                displayName: "Repositories",
-                cellTemplate: this.commonGridColumns.listableColumn('row.entity.reposList','row.entity.permissionName','row.entity.repoKeysView',true),
-                width:'25%'
-            },
-            {
-                field: "effectivePermission.managed",
-                cellTemplate: this.commonGridColumns.booleanColumn('row.entity.effectivePermission.managed'),
-                name: "Manage",
-                displayName: "Manage",
-                width:'9%'
-            },
-            {
-                field: "effectivePermission.delete",
-                cellTemplate: this.commonGridColumns.booleanColumn('row.entity.effectivePermission.delete'),
-                name: "Delete/Overwrite",
-                displayName: "Delete/Overwrite",
-                width:'15%'
-            },
-            {
-                field: "effectivePermission.deploy",
-                cellTemplate: this.commonGridColumns.booleanColumn('row.entity.effectivePermission.deploy'),
-                name: "Deploy/Cache",
-                displayName: "Deploy/Cache",
-                width:'14%'
-            },
-            {
-                field: "effectivePermission.annotate",
-                cellTemplate: this.commonGridColumns.booleanColumn('row.entity.effectivePermission.annotate'),
-                name: "Annotate",
-                displayName: "Annotate",
-                width:'9%'
-            },
-            {
-                field: "effectivePermission.read",
-                cellTemplate: this.commonGridColumns.booleanColumn('row.entity.effectivePermission.read'),
-                name: "Read",
-                displayName: "Read",
-                width:'8%'
-            }
-        ]
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/groups/group_form.html b/web/angular-web/src/main/webapp/app/states/admin/security/groups/group_form.html
deleted file mode 100644
index 49a361e..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/groups/group_form.html
+++ /dev/null
@@ -1,78 +0,0 @@
-<div class="content-layout-container"> <!-- classes: with-head-bar -->
-    <h1>{{GroupForm.title}}</h1>
-
-    <div class="content-wrapper">
-        <form name="GroupForm.groupForm" ng-submit="GroupForm.save()">
-            <div class="card stretch card-pole-pad card-side-pad">
-                <div class="content-with-footer">
-                    <div ng-if="(GroupForm.mode === 'edit' && GroupForm.groupdata) || GroupForm.mode === 'create'">
-                        <jf-panel jf-panel-heading="Group Settings">
-                            <div class="form-group">
-                                <div class="form-group-cell">
-                                    <jf-field validations="common" autofocus="true">
-                                        <label for="groupName" class="mandatory">Group Name</label>
-                                        <input name="groupName"
-                                               type="text"
-                                               jf-validator-name
-                                               ng-model-options="{debounce: { 'default': 500 } }"
-                                               ng-model="GroupForm.groupdata.name"
-                                               class="input-text"
-                                               ng-disabled="GroupForm.mode==='edit'"
-                                               id="groupName"
-                                               required>
-                                    </jf-field>
-                                </div>
-                                <div class="form-group-cell">
-                                    <jf-field>
-                                        <label for="description">Description</label>
-                                        <input name="description"
-                                               type="text"
-                                               ng-model="GroupForm.groupdata.description"
-                                               class="input-text"
-                                               id="description">
-                                    </jf-field>
-                                </div>
-                            </div>
-                            <div class="form-group no-margin-bottom">
-                                <div class="form-group-cell">
-                                    <jf-checkbox class="display-block" text="Automatically Join New Users to this Group">
-                                        <input type="checkbox"
-                                               ng-model="GroupForm.groupdata.newUserDefault">
-                                    </jf-checkbox>
-                                </div>
-                            </div>
-                        </jf-panel>
-                        <jf-panel jf-panel-heading="Users">
-                            <div class="form-group">
-                                <div class="form-group-cell double">
-                                    <jf-drag-drop
-                                            ng-if="GroupForm.usersList"
-                                            exclude-list="GroupForm.usersList"
-                                            include-list="GroupForm.groupdata.usersInGroup"
-                                            objects-name="Users">
-                                    </jf-drag-drop>
-                                </div>
-                            </div>
-                        </jf-panel>
-                        <jf-panel jf-panel-heading="Group Permissions" ng-if="GroupForm.mode==='edit'">
-                            <jf-grid grid-options="GroupForm.permissionsGridOptions"
-                                     filter-field="permissionName"
-                                     object-name="Permission"
-                                     filter-on-change="true">
-                            </jf-grid>
-                        </jf-panel>
-                    </div>
-                </div>
-            </div>
-            <div class="content-footer">
-                <div class="pull-right">
-                    <button class="btn btn-default" type="button" ng-click="GroupForm.cancel()">Cancel</button>
-                    <button class="btn btn-primary"
-                            type="submit"
-                            ng-disabled="GroupForm.isSaveDisabled()">Save</button>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
-
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/groups/groups.html b/web/angular-web/src/main/webapp/app/states/admin/security/groups/groups.html
deleted file mode 100644
index 6d751c3..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/groups/groups.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<div class="content-layout-container"> <!-- classes: with-head-bar -->
-    <h1>Groups Management</h1>
-
-    <div class="content-wrapper">
-        <div class="card stretch card-pole-pad card-side-pad">
-            <div class="pull-right admin-grid-buttons">
-                <a ui-sref="^.groups.new">
-                    <i class="grid-button-icon icon icon-new"></i>New
-                </a>
-            </div>
-
-            <jf-grid grid-options="AdminSecurityGroups.gridOption"
-                     filter-field="groupName"
-                     object-name="group"
-                     auto-focus="true"></jf-grid>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/groups/groups.module.js b/web/angular-web/src/main/webapp/app/states/admin/security/groups/groups.module.js
deleted file mode 100644
index d120c9c..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/groups/groups.module.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import {AdminSecurityGroupsController} from './group.controller';
-import {AdminSecurityGroupFormController} from './group_form.controller';
-
-function groupsConfig($stateProvider) {
-
-    $stateProvider
-        .state('admin.security.groups', {
-            url: '/groups',
-            templateUrl: 'states/admin/security/groups/groups.html',
-            controller: 'AdminSecurityGroupsController as AdminSecurityGroups'
-        })
-        .state('admin.security.groups.edit', {
-            parent: 'admin.security',
-            url: '/groups/{groupname}/edit',
-            templateUrl: 'states/admin/security/groups/group_form.html',
-            controller: 'AdminSecurityGroupFormController as GroupForm'
-        })
-        .state('admin.security.groups.new', {
-            parent: 'admin.security',
-            url: '/groups/new',
-            templateUrl: 'states/admin/security/groups/group_form.html',
-            controller: 'AdminSecurityGroupFormController as GroupForm'
-        })
-
-}
-
-export default angular.module('security.groups', [])
-        .config(groupsConfig)
-        .controller('AdminSecurityGroupsController', AdminSecurityGroupsController)
-    .controller('AdminSecurityGroupFormController', AdminSecurityGroupFormController)
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/http_sso/http_sso.controller.js b/web/angular-web/src/main/webapp/app/states/admin/security/http_sso/http_sso.controller.js
deleted file mode 100644
index 4189de0..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/http_sso/http_sso.controller.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import EVENTS     from '../../../../constants/common_events.constants';
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-
-export class AdminSecurityHttpSSoController {
-
-    constructor(HttpSsoDao,ArtifactoryEventBus,ArtifactoryModelSaver) {
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.httpSsoDao = HttpSsoDao.getInstance();
-        this.sso = this.getSsoData();
-        this.TOOLTIP = TOOLTIP.admin.security.HTTPSSO;
-        this.artifactoryModelSaver = ArtifactoryModelSaver.createInstance(this,['sso']);
-
-    }
-
-    getSsoData() {
-        this.httpSsoDao.get().$promise.then((sso)=> {
-            this.sso = sso;
-            this.artifactoryModelSaver.save();
-            this.artifactoryEventBus.dispatch(EVENTS.FORM_CLEAR_FIELD_VALIDATION, true);
-        });
-    }
-
-    reset() {
-        this.artifactoryModelSaver.ask().then(()=>{
-            this.getSsoData();
-        });
-    }
-    save(sso) {
-        this.httpSsoDao.update(sso).$promise.then(()=>{
-            this.artifactoryModelSaver.save();
-        });
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/http_sso/http_sso.html b/web/angular-web/src/main/webapp/app/states/admin/security/http_sso/http_sso.html
deleted file mode 100644
index 8e776ec..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/http_sso/http_sso.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<div class="content-layout-container">
-    <h1>HTTP SSO Configuration</h1>
-
-    <div class="content-wrapper">
-        <form class="form" name="adminSsoForm"
-              ng-submit="AdminSecurityHttpSSo.save(AdminSecurityHttpSSo.sso)" novalidate>
-            <div class="card stretch card-pole-pad card-side-pad">
-                <div class="content-with-footer">
-                    <jf-panel jf-panel-heading="HTTP SSO Settings">
-                        <div class="form-group form-checkbox">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Artifactory is Proxied by a Secure HTTP Server">
-                                    <input type="checkbox"
-                                           id="enabled"
-                                           ng-model="AdminSecurityHttpSSo.sso.httpSsoProxied">
-                                </jf-checkbox>
-                                <jf-help-tooltip html="AdminSecurityHttpSSo.TOOLTIP.artifactoryIsProxiedByASecureHTTPServer"></jf-help-tooltip>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="adminSso" autofocus="true">
-                                    <label for="remote">Remote User Request Variable</label>
-                                    <jf-help-tooltip html="AdminSecurityHttpSSo.TOOLTIP.remoteUserRequestVariable"></jf-help-tooltip>
-                                    <input name="remote"
-                                           id="remote"
-                                           type="text"
-                                           ng-disabled="!AdminSecurityHttpSSo.sso.httpSsoProxied"
-                                           ng-model="AdminSecurityHttpSSo.sso.remoteUserRequestVariable"
-                                           class="input-text">
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group form-checkbox">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Auto Create Artifactory Users">
-                                    <input type="checkbox"
-                                           id="noAutoUserCreation"
-                                           ng-disabled="!AdminSecurityHttpSSo.sso.httpSsoProxied"
-                                           ng-model="AdminSecurityHttpSSo.sso.noAutoUserCreation">
-                                </jf-checkbox>
-                                <jf-help-tooltip html="AdminSecurityHttpSSo.TOOLTIP.autoCreateArtifactoryUsers"></jf-help-tooltip>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Allow Created Users Access To Profile Page">
-                                    <input type="checkbox"
-                                           id="allowUserToAccessProfile"
-                                           ng-disabled="!AdminSecurityHttpSSo.sso.httpSsoProxied"
-                                           ng-model="AdminSecurityHttpSSo.sso.allowUserToAccessProfile">
-                                </jf-checkbox>
-                                <jf-help-tooltip html="AdminSecurityHttpSSo.TOOLTIP.allowUserToAccessProfile"></jf-help-tooltip>
-                            </div>
-                        </div>
-                    </jf-panel>
-                </div>
-            </div>
-
-            <div class="content-footer">
-                <div class="pull-right">
-                    <button class="btn btn-default" type="button"
-                            ng-click="AdminSecurityHttpSSo.reset()">
-                        Reset
-                    </button>
-                    <button class="btn btn-primary" ng-disabled="!adminSsoForm.$valid">Save</button>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/http_sso/http_sso.module.js b/web/angular-web/src/main/webapp/app/states/admin/security/http_sso/http_sso.module.js
deleted file mode 100644
index e62473d..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/http_sso/http_sso.module.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import {AdminSecurityHttpSSoController} from './http_sso.controller';
-
-function httpSsoConfig($stateProvider) {
-
-    $stateProvider
-            .state('admin.security.http_sso', {
-                params: {feature: 'HTTPSSO'},
-                url: '/http_sso',
-                templateUrl: 'states/admin/security/http_sso/http_sso.html',
-                controller: 'AdminSecurityHttpSSoController as AdminSecurityHttpSSo'
-            })
-}
-
-export default angular.module('security.http_sso', [])
-        .config(httpSsoConfig)
-        .controller('AdminSecurityHttpSSoController', AdminSecurityHttpSSoController);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/ldap_settings/ldap_group_form.controller.js b/web/angular-web/src/main/webapp/app/states/admin/security/ldap_settings/ldap_group_form.controller.js
deleted file mode 100644
index 4c428e1..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/ldap_settings/ldap_group_form.controller.js
+++ /dev/null
@@ -1,227 +0,0 @@
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-
-// Injectables:
-let $q, $scope, $state, $stateParams, ArtifactoryGridFactory, LdapGroupsDao, LdapDao, ArtifactoryModelSaver;
-export class LdapGroupFormController {
-
-    constructor(_$q_, _$scope_, _$state_, _$stateParams_, _ArtifactoryGridFactory_, _LdapGroupsDao_, _LdapDao_, _ArtifactoryModelSaver_) {
-        $q = _$q_;
-        $scope = _$scope_;
-        $state = _$state_;
-        $stateParams = _$stateParams_;
-        ArtifactoryGridFactory = _ArtifactoryGridFactory_;
-        ArtifactoryModelSaver = _ArtifactoryModelSaver_.createInstance(this,['ldapGroup']);
-        LdapGroupsDao = _LdapGroupsDao_;
-        LdapDao = _LdapDao_;
-
-        this.isNew = !$stateParams.ldapGroupName;
-        this._initLdapSetting();
-        this._initGroupLabels();
-        this._initSelectizeConfig();
-        this._initGroupSyncGrid();
-        this._initStrategyOptions();
-        this.isImportDisabled = true;
-        this.TOOLTIP = TOOLTIP.admin.security.LDAPGroupsForm;
-    }
-
-    /***************************
-    ** Initialization
-    ****************************/
-    _initLdapSetting() {
-        if (this.isNew) {
-            this.ldapGroup = {
-                enabledLdap: ' ',
-                strategy: "STATIC",
-                subTree: true
-            };
-            this.ldapGroupPromise = $q.when(this.ldapGroup);
-        }
-        else {
-            this.ldapGroupPromise = LdapGroupsDao.get({name: $stateParams.ldapGroupName}).$promise
-                .then((ldapGroup) => {
-                        this.ldapGroup = ldapGroup;
-                        ArtifactoryModelSaver.save();
-                    });
-        }
-    }
-
-    _initGroupLabels() {
-        if (this.isNew) this.onStrategyChange();
-        else {
-            this.ldapGroupPromise.then(() => {            
-                this._setGroupLabels(this.ldapGroup.strategy);
-            })
-        }
-    }
-
-    _initSelectizeConfig() {
-        LdapDao.query().$promise.then((ldapSettingsData) => {
-            this.selectizeConfig = {
-                sortField: 'text',
-                create: true,
-                maxItems: 1
-            };
-
-            this.selectizeOptions = ldapSettingsData.map((ldapSetting) => ldapSetting.key);
-            this.selectizeOptions.push(' ');
-        });
-    }
-
-    _initGroupSyncGrid() {
-        this.syncGroupsGridOptions = ArtifactoryGridFactory.getGridInstance($scope)
-                .setColumns(this._getSyncGroupsGridColumns())
-                .setRowTemplate('default')
-                .setBatchActions(this._getBatchActions())
-                .setMultiSelect()
-                .setGridData([]);
-
-        this.syncGroupsGridOptions.onSelectionChange =
-        this.syncGroupsGridOptions.onSelectionChangeBatch = () => {
-            var selectedRows = this.syncGroupsGridOptions.api.selection.getSelectedRows();
-            this.isImportDisabled = !selectedRows.length;
-        };
-    }
-
-    _initStrategyOptions() {
-        this.strategyOptions = [
-            {value: 'STATIC', text: 'Static'},
-            {value: 'DYNAMIC', text: 'Dynamic'},
-            {value: 'HIERARCHICAL', text: 'Hierarchy'}
-        ];
-    }
-
-    save() {
-        let whenSaved = this.isNew ? LdapGroupsDao.save(this.ldapGroup) : LdapGroupsDao.update(this.ldapGroup);
-        whenSaved.$promise.then(() => {
-            ArtifactoryModelSaver.save();
-            this._end()
-        });
-    }
-
-    cancel() {
-        this._end();
-    }
-
-    _end() {
-        $state.go('^.ldap_settings');
-    }
-
-    _getBatchActions() {
-        return [
-            {
-                icon: 'import',
-                name: 'Import',
-                callback: () => this.importSyncGroups()
-            }
-        ]
-    }
-
-    importSyncGroups() {
-        if (this.isImportDisabled) return;
-
-        var importData = {};
-        var selectedRows = this.syncGroupsGridOptions.api.selection.getSelectedRows();
-        _.extend(importData, {importGroups: selectedRows, ldapGroupSettings: this.ldapGroup});
-        _.extend(importData, {name: this.ldapGroup.name});
-
-        LdapGroupsDao.import(importData).$promise.then((data) => {
-            this.refreshSyncGroups(this.ldapGroup.usernameFilter);
-        })
-    }
-
-    importSyncGroup(row) {
-        var importData = {};
-        _.extend(importData, {importGroups: [row], ldapGroupSettings: this.ldapGroup});
-        _.extend(importData, {name: this.ldapGroup.name});
-
-        LdapGroupsDao.import(importData).$promise.then((data) => {
-            this.refreshSyncGroups(this.ldapGroup.usernameFilter);
-        })
-    }
-
-    refreshSyncGroups(username) {
-        if (!this.ldapGroupsEditForm.$valid) return;
-
-        var refreshData = {};
-        _.extend(refreshData,this.ldapGroup);
-        _.extend(refreshData,{name: refreshData.name, username: username});
-
-        LdapGroupsDao.refresh(refreshData).$promise.then((result) => {
-            result.data.forEach((group)=>{
-                group.syncState = group.requiredUpdate === 'IN_ARTIFACTORY';
-            });
-            this.syncGroupsGridOptions.setGridData(result.data);
-        }).catch(() => {
-            this.syncGroupsGridOptions.setGridData([]);
-        }).finally(() => {
-            if (this) this.isImportDisabled = true;
-        });
-    }
-
-    /***************************
-    ** Strategy
-    ****************************/    
-    _setGroupLabels(strategy) {
-        switch(strategy.toLowerCase()) {
-            case 'static':
-            case 'dynamic':
-                this.labels = {groupKeyMember: 'Group Member Attribute'};
-                break;
-            case 'hierarchical':
-                this.labels = {groupKeyMember: 'User DN Group Key'};
-                break;
-        }
-    }
-
-    onStrategyChange() {
-        var strategy = this.ldapGroup.strategy;
-        this._getStrategy(strategy).then((data) => {
-            this.ldapGroup.groupMemberAttribute = data.groupKeyMember;
-            this.ldapGroup.groupNameAttribute = data.groupNameAttribute;
-            this.ldapGroup.descriptionAttribute = data.description;
-            this.ldapGroup.filter = data.filter;
-        });
-
-        this._setGroupLabels(strategy);
-    }
-
-    _getStrategy(strategy) {
-        return LdapGroupsDao.getstrategy({name:'dummy', strategy: strategy.toLowerCase()}).$promise;
-    }
-
-    /***************************
-    ** Grid
-    ****************************/
-    //get the columns for the synchronize groups grid (inside the ldap groups' modal)
-    _getSyncGroupsGridColumns() {
-
-        return [
-            {
-                name: "Group Name",
-                displayName: "Group Name",
-                field: "groupName",
-                width: '30%'
-            },
-            {
-                name: "Description",
-                displayName: "Description",
-                field: "description",
-                width: '60%'
-            },
-            {
-                name: "Sync State",
-                displayName: "Sync State",
-                field: "syncState",
-                cellTemplate: '<div ng-if="row.entity.syncState" class="grid-checkbox"><input class="text-center" ' +
-                'ng-model="row.entity.syncState" type="checkbox" disabled/><span class="icon icon-v"></span></div>',
-                width: '10%',
-                customActions: [{
-                    icon: 'icon icon-import',
-                    tooltip: 'Import',
-                    name: 'Import',
-                    callback: row => this.importSyncGroup(row)
-                }]
-            }
-        ]
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/ldap_settings/ldap_group_form.html b/web/angular-web/src/main/webapp/app/states/admin/security/ldap_settings/ldap_group_form.html
deleted file mode 100644
index 2ef06fe..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/ldap_settings/ldap_group_form.html
+++ /dev/null
@@ -1,158 +0,0 @@
-<div class="content-layout-container"> <!-- classes: with-head-bar -->
-    <h1>{{ LdapGroupForm.isNew && 'New' || 'Edit' }} LDAP Group Setting</h1>
-
-    <div class="content-wrapper">
-        <form name="LdapGroupForm.ldapGroupsEditForm">
-            <div class="card stretch card-pole-pad card-side-pad">
-                <div class="content-with-footer">
-                    <jf-panel jf-panel-heading="LDAP Group Settings">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field autofocus="true" validations="common">
-                                    <label class="mandatory" for="settingsName">Settings Name</label>
-                                    <jf-help-tooltip html="LdapGroupForm.TOOLTIP.settingsName"></jf-help-tooltip>
-                                    <input id="settingsName"
-                                           ng-disabled="!LdapGroupForm.isNew"
-                                           type="text"
-                                           ng-model="LdapGroupForm.ldapGroup.name"
-                                           name="settingsName"
-                                           class="input-text"
-                                           required>
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell">
-                                <jf-field>
-                                    <label>LDAP Setting</label>
-                                    <jf-help-tooltip html="LdapGroupForm.TOOLTIP.LDAPSetting"></jf-help-tooltip>
-                                    <selectize ng-if="LdapGroupForm.selectizeConfig"
-                                               config='LdapGroupForm.selectizeConfig'
-                                               options='LdapGroupForm.selectizeOptions'
-                                               ng-model='LdapGroupForm.ldapGroup.enabledLdap'>
-                                    </selectize>
-                                </jf-field>
-                            </div>
-                        </div>
-
-                        <div class="form-group">
-                            <jf-switch
-                                    jf-switch-title="Mapping Strategy:"
-                                    ng-model="LdapGroupForm.ldapGroup.strategy"
-                                    ng-change="LdapGroupForm.onStrategyChange()"
-                                    options="LdapGroupForm.strategyOptions">
-                            </jf-switch>
-                        </div>
-
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="common">
-                                    <label class="mandatory" for="groupMemberAttribute">{{LdapGroupForm.labels.groupKeyMember}}</label>
-                                    <jf-help-tooltip html="LdapGroupForm.TOOLTIP.groupMemberAttribute"></jf-help-tooltip>
-                                    <input id="groupMemberAttribute"
-                                           type="text"
-                                           ng-model="LdapGroupForm.ldapGroup.groupMemberAttribute"
-                                           name="groupMemberAttribute"
-                                           class="input-text"
-                                           required>
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell">
-                                <jf-field validations="common">
-                                    <label class="mandatory" for="groupNameAttribute">Group Name Attribute</label>
-                                    <jf-help-tooltip html="LdapGroupForm.TOOLTIP.groupNameAttribute"></jf-help-tooltip>
-                                    <input id="groupNameAttribute"
-                                           type="text"
-                                           ng-model="LdapGroupForm.ldapGroup.groupNameAttribute"
-                                           name="groupNameAttribute"
-                                           class="input-text"
-                                           required>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="common">
-                                    <label class="mandatory" for="descriptionAttribute">Description Attribute</label>
-                                    <jf-help-tooltip html="LdapGroupForm.TOOLTIP.descriptionAttribute"></jf-help-tooltip>
-                                    <input id="descriptionAttribute"
-                                           type="text"
-                                           ng-model="LdapGroupForm.ldapGroup.descriptionAttribute"
-                                           name="descriptionAttribute"
-                                           class="input-text"
-                                           required>
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell">
-                                <jf-field>
-                                    <label class="mandatory" for="filter">Filter</label>
-                                    <jf-help-tooltip html="LdapGroupForm.TOOLTIP.filter"></jf-help-tooltip>
-                                    <input type="text"
-                                           id="filter"
-                                           name="filter"
-                                           class="input-text"
-                                           ng-model='LdapGroupForm.ldapGroup.filter' required>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="common">
-                                    <label for="searchBase">Search Base</label>
-                                    <jf-help-tooltip html="LdapGroupForm.TOOLTIP.searchBase"></jf-help-tooltip>
-                                    <input id="searchBase"
-                                           type="text"
-                                           ng-model="LdapGroupForm.ldapGroup.groupBaseDn"
-                                           ng-disabled="LdapGroupForm.ldapGroup.strategy == 'HIERARCHICAL'"
-                                           name="searchBase"
-                                           class="input-text">
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell form-button"
-                                 ng-if="LdapGroupForm.ldapGroup.strategy != 'HIERARCHICAL'">
-                                <jf-checkbox text="Sub-tree Search">
-                                    <input id="subTreeSearch"
-                                           type="checkbox"
-                                           ng-model="LdapGroupForm.ldapGroup.subTree"
-                                           name="subTreeSearch">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                    </jf-panel>
-
-                    <jf-panel jf-panel-heading="Synchronize LDAP Groups">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <input id="usernameFilter"
-                                       type="text"
-                                       ng-model="LdapGroupForm.ldapGroup.usernameFilter"
-                                       name="usernameFilter"
-                                       class="input-text"
-                                       placeholder="Search Group by Username (leave blank for *)" />
-                                </div>
-                            <div class="form-group-cell form-link">
-                                <a href="" class="form-search"
-                                   ng-click="LdapGroupForm.refreshSyncGroups(LdapGroupForm.ldapGroup.usernameFilter)">
-                                    <i class="icon icon-search-specific"></i>
-                                </a>
-                            </div>
-                        </div>
-
-                            <jf-grid grid-options="LdapGroupForm.syncGroupsGridOptions"
-                                     filter-field="groupName"
-                                     filter-on-change="true">
-                            </jf-grid>
-                    </jf-panel>
-                </div>
-            </div>
-            <div class="content-footer">
-                <div class="pull-right">
-                    <button type="button" class="btn btn-default" ng-click="LdapGroupForm.cancel()">Cancel</button>
-                    <button type="button"
-                            ng-click="LdapGroupForm.save()"
-                            class="btn btn-primary"
-                            ng-disabled="LdapGroupForm.ldapGroupsEditForm.$invalid">Save
-                    </button>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/ldap_settings/ldap_setting_form.controller.js b/web/angular-web/src/main/webapp/app/states/admin/security/ldap_settings/ldap_setting_form.controller.js
deleted file mode 100644
index 6773f54..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/ldap_settings/ldap_setting_form.controller.js
+++ /dev/null
@@ -1,85 +0,0 @@
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-
-let $stateParams, LdapDao, $state, ArtifactoryGridFactory;
-
-export class LdapSettingFormController {
-    constructor(_$stateParams_, _$state_, _LdapDao_, _ArtifactoryGridFactory_, ArtifactoryNotifications, ArtifactoryModelSaver) {
-        $state = _$state_;
-        $stateParams = _$stateParams_;
-        LdapDao = _LdapDao_;
-        ArtifactoryGridFactory = _ArtifactoryGridFactory_;
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this.testConnection = {};
-        this.isNew = !$stateParams.ldapSettingKey;
-        this.TOOLTIP = TOOLTIP.admin.security.LDAPSettingsForm;
-        this.artifactoryModelSaver = ArtifactoryModelSaver.createInstance(this,['ldap']);
-        this._initLdapSetting();
-    }
-
-    _initLdapSetting() {
-        if (this.isNew) {
-            this.ldap = {
-                enabled: true,
-                autoCreateUser: true,
-                search: {searchSubTree: true},
-                emailAttribute: 'mail'
-            };
-        }
-        else {
-            LdapDao.get({key: $stateParams.ldapSettingKey}).$promise
-                    .then((ldapSetting) => {
-                        this.ldap = ldapSetting
-                        this.artifactoryModelSaver.save();
-                    });
-        }
-    }
-
-    save() {
-        if (this.ldapEditForm.$valid) {
-            if (!this.ldap.userDnPattern && !this.ldap.search.searchFilter) {
-                this.messageUserOrSearch();
-            }
-            else {
-                if (this.ldap.search && this._isSearchFieldsNull(this.ldap.search)) {
-                    this.ldap.search = undefined;
-                }
-                let whenSaved = this.isNew ? LdapDao.save(this.ldap) : LdapDao.update(this.ldap);
-                whenSaved.$promise.then(() => {
-                    this.artifactoryModelSaver.save();
-                    this._end()
-                });
-            }
-        }
-    }
-
-    _isSearchFieldsNull(search) {
-        return (!search.managerDn && !search.managerPassword && !search.searchBase && !search.searchFilter);
-    }
-
-    cancel() {
-        this._end();
-    }
-
-    _end() {
-        $state.go('^.ldap_settings');
-    }
-
-    doTestConnection() {
-        if (this.ldapEditForm.$valid) {
-            if (!this.ldap.userDnPattern && !this.ldap.search.searchFilter) {
-                this.messageUserOrSearch();
-            }
-            else {
-                var testData = {};
-                _.extend(testData, this.ldap);
-                _.extend(testData, this.testConnection);
-
-                LdapDao.test(testData);
-            }
-        }
-    }
-
-    messageUserOrSearch() {
-        this.artifactoryNotifications.create({error: 'LDAP settings should provide a userDnPattern or a searchFilter (or both)'});
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/ldap_settings/ldap_setting_form.html b/web/angular-web/src/main/webapp/app/states/admin/security/ldap_settings/ldap_setting_form.html
deleted file mode 100644
index 440f641..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/ldap_settings/ldap_setting_form.html
+++ /dev/null
@@ -1,215 +0,0 @@
-<div class="content-layout-container"> <!-- classes: with-head-bar -->
-    <h1 ng-if="LdapSettingForm.isNew">New LDAP Settings</h1>
-    <h1 ng-if="!LdapSettingForm.isNew">Edit LDAP Settings</h1>
-
-    <div class="content-wrapper">
-        <form name="LdapSettingForm.ldapEditForm" ng-submit="LdapSettingForm.save()">
-            <div class="card stretch card-pole-pad card-side-pad">
-                <div class="content-with-footer">
-                    <jf-panel jf-panel-heading="LDAP Settings">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Enabled">
-                                    <input id="ldapEnabled"
-                                           type="checkbox"
-                                           ng-model="LdapSettingForm.ldap.enabled"
-                                           name="ldapEnabled">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field autofocus="true" validations="ldapSetting">
-                                    <label class="mandatory" for="settingsName">Settings Name</label>
-                                    <input id="settingsName"
-                                           name="settingsName"
-                                           type="text"
-                                           required
-                                           jf-validator-xml-name
-                                           jf-validator-unique-id
-                                           ng-model-options="{debounce: { 'default': 500 } }"
-                                           ng-disabled="!LdapSettingForm.isNew || !LdapSettingForm.ldap.enabled"
-                                           ng-model="LdapSettingForm.ldap.key"
-                                           class="input-text">
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="ldapSettings">
-                                    <label class="mandatory" for="ldapURL">LDAP URL</label>
-                                    <jf-help-tooltip html="LdapSettingForm.TOOLTIP.LDAPURL"></jf-help-tooltip>
-                                    <input jf-validator-ldap-url
-                                           ng-model-options="{debounce: { 'default': 500 } }"
-                                           id="ldapURL"
-                                           type="text"
-                                           ng-disabled="!LdapSettingForm.ldap.enabled"
-                                           ng-model="LdapSettingForm.ldap.ldapUrl"
-                                           name="ldapURL"
-                                           class="input-text"
-                                           placeholder="e.g. ldap://myserver:myport/dc=sampledomain,dc=com"
-                                           required>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Auto Create Artifactory Users">
-                                    <input id="autoCreateUser"
-                                           type="checkbox"
-                                           ng-model="LdapSettingForm.ldap.autoCreateUser"
-                                           ng-disabled="!LdapSettingForm.ldap.enabled"
-                                           name="autoCreateUser">
-                                </jf-checkbox>
-                                <jf-help-tooltip html="LdapSettingForm.TOOLTIP.autoCreateArtifactoryUsers"></jf-help-tooltip>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="ldapSetting">
-                                    <label>User DN Pattern</label>
-                                    <jf-help-tooltip html="LdapSettingForm.TOOLTIP.userDNPattern"></jf-help-tooltip>
-                                    <input id="dnPattern"
-                                           type="text"
-                                           ng-disabled="!LdapSettingForm.ldap.enabled"
-                                           ng-model="LdapSettingForm.ldap.userDnPattern"
-                                           name="dnPattern"
-                                           class="input-text"
-                                            placeholder="e.g. uid={0},ou=People">
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="ldapSetting">
-                                    <label>Email Attribute</label>
-                                    <jf-help-tooltip html="LdapSettingForm.TOOLTIP.emailAttribute"></jf-help-tooltip>
-                                    <input id="emailAttribute"
-                                           type="text"
-                                           ng-disabled="!LdapSettingForm.ldap.enabled"
-                                           ng-model="LdapSettingForm.ldap.emailAttribute"
-                                           name="emailAttribute"
-                                           class="input-text">
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="ldapSetting">
-                                    <label>Search Filter</label>
-                                    <jf-help-tooltip html="LdapSettingForm.TOOLTIP.searchFilter"></jf-help-tooltip>
-                                    <input id="searchFilter"
-                                           type="text"
-                                           ng-disabled="!LdapSettingForm.ldap.enabled"
-                                           ng-model="LdapSettingForm.ldap.search.searchFilter"
-                                           name="searchFilter"
-                                           class="input-text">
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell">
-                                <jf-field validations="ldapSetting">
-                                    <label>Search Base</label>
-                                    <jf-help-tooltip html="LdapSettingForm.TOOLTIP.searchBase"></jf-help-tooltip>
-                                    <input id="searchBase"
-                                           type="text"
-                                           ng-disabled="!LdapSettingForm.ldap.enabled"
-                                           ng-model="LdapSettingForm.ldap.search.searchBase"
-                                           name="searchBase"
-                                           class="input-text"
-                                           placeholder="e.g. ou=internalUsers,ou=hq|ou=externalUsers">
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="ldapSetting">
-                                    <label>Manager DN</label>
-                                    <jf-help-tooltip html="LdapSettingForm.TOOLTIP.manageDN"></jf-help-tooltip>
-                                    <input id="managerDn"
-                                           type="text"
-                                           ng-disabled="!LdapSettingForm.ldap.enabled"
-                                           ng-model="LdapSettingForm.ldap.search.managerDn"
-                                           name="managerDn"
-                                           class="input-text">
-                                </jf-field>
-                            </div>
-                            <!-- prevent auto complete -->
-                            <input type="text" class="hidden"/>
-                            <input type="password" class="hidden"/>
-                            <div class="form-group-cell">
-                                <jf-field validations="ldapSetting">
-                                    <label>Manager Password</label>
-                                    <jf-help-tooltip html="LdapSettingForm.TOOLTIP.managerPassword"></jf-help-tooltip>
-                                    <input id="managerPassword"
-                                           type="password"
-                                           ng-disabled="!LdapSettingForm.ldap.enabled"
-                                           ng-model="LdapSettingForm.ldap.search.managerPassword"
-                                           name="managerPassword"
-                                           class="input-text">
-                                </jf-field>
-                            </div>
-                        </div>
-
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Sub-tree Search">
-                                    <input id="subTreeSearch"
-                                           type="checkbox"
-                                           ng-disabled="!LdapSettingForm.ldap.enabled"
-                                           ng-model="LdapSettingForm.ldap.search.searchSubTree"
-                                           name="subTreeSearch">
-                                </jf-checkbox>
-                                <jf-help-tooltip html="LdapSettingForm.TOOLTIP.subTreeSearch"></jf-help-tooltip>
-                            </div>
-                        </div>
-                    </jf-panel>
-
-                    <jf-panel jf-panel-heading="Test LDAP Connection">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="ldapSetting">
-                                    <label>Test User Name</label>
-                                    <input id="testUsername"
-                                           type="text"
-                                           ng-model="LdapSettingForm.testConnection.testUsername"
-                                           name="testUsername"
-                                           class="input-text">
-                                </jf-field>
-                            </div>
-
-                            <div class="form-group-cell">
-                                <jf-field validations="ldapSetting">
-                                    <label>Test Password</label>
-                                    <input id="testPassword"
-                                           type="password"
-                                           ng-model="LdapSettingForm.testConnection.testPassword"
-                                           name="testPassword"
-                                           class="input-text">
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell form-button">
-                                <button class="btn btn-secondary"
-                                        type="button"
-                                        ng-disabled="LdapSettingForm.ldapEditForm.$invalid || !LdapSettingForm.testConnection.testUsername || !LdapSettingForm.testConnection.testPassword"
-                                        ng-click="LdapSettingForm.doTestConnection()">Test Connection
-                                </button>
-                            </div>
-                            <div class="clearfix"></div>
-                        </div>
-                    </jf-panel>
-                </div>
-            </div>
-            <div class="content-footer">
-                <div class="pull-right">
-                    <button type="button" class="btn btn-default" ng-click="LdapSettingForm.cancel()">Cancel</button>
-                    <button
-                      type="submit"
-                      class="btn btn-primary"
-                      ng-disabled="!LdapSettingForm.ldapEditForm.$valid">Save
-
-                    </button>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/ldap_settings/ldap_settings.controller.js b/web/angular-web/src/main/webapp/app/states/admin/security/ldap_settings/ldap_settings.controller.js
deleted file mode 100644
index 69bbd50..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/ldap_settings/ldap_settings.controller.js
+++ /dev/null
@@ -1,295 +0,0 @@
-export class LdapSettingsController {
-    /*
-     z-index: 999;
-     background-color: red;
-     height: 100%;
-     width: 97%;
-     opacity: tr;
-     position: absolute;
-     */
-
-
-    constructor(ArtifactoryModal, ArtifactoryFeatures, LdapDao, LdapGroupsDao, $timeout, $scope, ArtifactoryGridFactory,
-            uiGridConstants) {
-        this.ldapDao = LdapDao;
-        this.ldapGroupsDao = LdapGroupsDao;
-        this.modal = ArtifactoryModal;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.settingsGridOption = {};
-        this.uiGridConstants = uiGridConstants;
-        this.groupsGridOption = {};
-        this.ldapSettingsData = {};
-        this.ldapGroupsData = {};
-        this.$timeout = $timeout;
-        this.artifactoryFeatures = ArtifactoryFeatures;
-        this.$scope = $scope;
-        this._initLdap();
-
-    }
-
-    resetLdapSettings() {
-        this._getLdapSettingsView();
-    }
-
-    //Call REST API for deletion of ldap settings
-    deleteLdapSetting(key) {
-        this.modal.confirm("Are you sure you want to delete LDAP: '" + key + "'?")
-                .then(() => this._doDeleteLdapSetting(key));
-    }
-
-    _doDeleteLdapSetting(key) {
-        this.ldapDao.delete({key: key}).$promise.then((data) => {
-            this._getLdapSettingsView();
-        })
-    }
-
-    /***************************
-     ** Delete
-     ****************************/
-
-    //Call REST API for deletion of ldap group
-    deleteLdapGroup(name) {
-        this.modal.confirm("Are you sure you want to delete LDAP group: '" + name + "'?")
-                .then(() => this._doDeleteLdapGroup(name));
-    }
-
-    _doDeleteLdapGroup(name) {
-        this.ldapGroupsDao.delete({name: name}).$promise.then((data) => {
-            this._getLdapGroupsView();
-        })
-    }
-
-    deleteSelectedLdapSettings() {
-        let selectedRows = this.settingsGridOption.api.selection.getSelectedGridRows();
-        this.modal.confirm(`Are you sure you want to delete ${selectedRows.length} LDAP settings?`)
-                .then(() => {
-                    selectedRows.forEach((row) => this._doDeleteLdapSetting(row.entity.key));
-                });
-    }
-
-    deleteSelectedLdapGroups() {
-        let selectedRows = this.groupsGridOption.api.selection.getSelectedGridRows();
-        this.modal.confirm(`Are you sure you want to delete ${selectedRows.length} LDAP groups?`)
-                .then(() => {
-                    selectedRows.forEach((row) => this._doDeleteLdapGroup(row.entity.name));
-                });
-    }
-
-    /***************************
-     ** Move up / down
-     ****************************/
-    //check if a row (in the settings grid) can move up or down
-    canMove(key, dir) {
-        var data = this.ldapSettingsData;
-        var index = this._indexOf(key);
-        return ((dir === 'up' && index > 0) || (dir === 'down' && index < data.length - 1));
-    }
-
-    //move a row (in the settings grid) up or down
-    moveLdapSetting(key, dir) {
-        var data = this.ldapSettingsData;
-        var index = this._indexOf(key);
-        if (dir === 'up' && index > 0) {
-            this._swapSettings(index, index - 1);
-        }
-        else if (dir === 'down' && index < data.length - 1) {
-            this._swapSettings(index, index + 1);
-        }
-    }
-
-    /***************************
-     ** Initialization
-     ****************************/
-
-    //initialize everything...
-    _initLdap() {
-
-        this._createGrids();
-        this._getLdapSettingsView();
-        this._getLdapGroupsView().then(()=>this._disableAsOss());
-
-    }
-
-    //get settings ('view') data from the REST API
-    _getLdapSettingsView() {
-        this.ldapDao.query().$promise.then((data) => {
-            this.ldapSettingsData = data;
-            this.settingsGridOption.setGridData(this.ldapSettingsData);
-        })
-    }
-
-    //get ldap groups ('view') data from the REST API
-    _getLdapGroupsView() {
-        return this.ldapGroupsDao.query().$promise.then((data) => {
-            this.ldapGroupsData = data;
-            this.groupsGridOption.setGridData(this.ldapGroupsData);
-        })
-    }
-
-    _disableAsOss() {
-
-    }
-
-    //create both ldap settings grid and ldap groups grid
-    _createGrids() {
-        this.settingsGridOption = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setColumns(this._getSettingsColumns())
-            //.setMultiSelect(this.)
-                .setDraggable(this.reorderLdap.bind(this))
-                .setButtons(this._getSettingsActions());
-        //.setBatchActions(this._getSettingsBatchActions());
-
-        this.groupsGridOption = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setColumns(this._getGroupsColumns())
-            //.setMultiSelect()
-                .setRowTemplate('default')
-                .setButtons(this._getGroupsActions());
-        //.setBatchActions(this._getGroupsBatchActions());
-    }
-
-    reorderLdap() {
-        return this.ldapDao.reorder(this.getLdapOrder()).$promise;
-    }
-
-    getLdapOrder() {
-        let ldapOrderList = [];
-        this.settingsGridOption.data.forEach((data)=> {
-            ldapOrderList.push(data.key);
-        });
-        return ldapOrderList;
-    }
-
-
-    /***************************
-     ** Settings Grid
-     ****************************/
-    //get the columns for the settings grid
-    _getSettingsColumns() {
-
-        return [
-            {
-                name: "Settings Name",
-                displayName: "Settings Name",
-                field: "key",
-                cellTemplate: '<div class="ui-grid-cell-contents"><a ui-sref="^.ldap_settings.edit({ldapSettingKey: row.entity.key})">{{ COL_FIELD }}</a></div>',
-                enableSorting: false
-            },
-            {
-                name: "LDAP URL",
-                displayName: "LDAP URL",
-                field: "ldapUrl",
-                cellTemplate: '<div class="ui-grid-cell-contents"><a ng-href="{{ COL_FIELD }}">{{ COL_FIELD }}</a></div>',
-                enableSorting: false
-            }
-
-        ]
-    }
-
-    //get the actions for the settings grid
-    _getSettingsActions() {
-        return [
-            /*{
-             icon: 'icon icon-angle-double-up',
-             tooltip: 'Move Up',
-             visibleWhen: row => this.canMove(row.key,'up'),
-             callback: row => this.moveLdapSetting(row.key,'up')
-             },
-             {
-             icon: 'icon icon-angle-double-down',
-             tooltip: 'Move Down',
-             visibleWhen: row => this.canMove(row.key,'down'),
-             callback: row => this.moveLdapSetting(row.key,'down')
-             },*/
-            {
-                icon: 'icon icon-clear',
-                tooltip: 'Delete',
-                callback: row => this.deleteLdapSetting(row.key)
-            }
-
-        ];
-    }
-
-    //
-    //_getSettingsBatchActions() {
-    //    return [
-    //        {
-    //            icon: 'clear',
-    //            name: 'Delete',
-    //            callback: () => this.deleteSelectedLdapSettings()
-    //        },
-    //    ]
-    //}
-    /***************************
-     ** Groups Grid
-     ****************************/
-    _getGroupsColumns() {
-        return [
-            {
-                name: "Group Name",
-                displayName: "Group Name",
-                field: "name",
-                sort: {
-                    direction: this.uiGridConstants.ASC
-                },
-                cellTemplate: '<div class="ui-grid-cell-contents"><a ui-sref="^.ldap_settings.edit_ldap_group({ldapGroupName: row.entity.name})">{{ COL_FIELD }}</a></div>'
-            },
-            {
-                name: "LDAP Settings",
-                displayName: "LDAP Settings",
-                field: "enabledLdap"
-            },
-            {
-                name: "Strategy",
-                displayName: "Strategy",
-                field: "strategy"
-            }
-        ]
-    }
-
-    _getGroupsActions() {
-        return [
-            {
-                icon: 'icon icon-clear',
-                tooltip: 'Delete',
-                callback: row => this.deleteLdapGroup(row.name)
-            }
-
-        ];
-    }
-
-
-    _getGroupsBatchActions() {
-        return [
-            {
-                icon: 'clear',
-                name: 'Delete',
-                callback: () => this.deleteSelectedLdapGroups()
-            },
-        ]
-    }
-
-    //get the index of the ldap settings (key) in this.ldapSettingsData
-    _indexOf(key) {
-        var data = this.ldapSettingsData;
-
-        var index = -1;
-
-        for (var i = 0; i < data.length; i++) {
-            if (data[i].key === key) {
-                index = i;
-                break;
-            }
-        }
-
-        return index;
-    }
-
-    //swap the order of two ldap settings
-    _swapSettings(index1, index2) {
-        var data = this.ldapSettingsData;
-
-        var temp = data[index2];
-        data[index2] = data[index1];
-        data[index1] = temp;
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/ldap_settings/ldap_settings.html b/web/angular-web/src/main/webapp/app/states/admin/security/ldap_settings/ldap_settings.html
deleted file mode 100644
index 3e27f81..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/ldap_settings/ldap_settings.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<div class="content-layout-container"> <!-- classes: with-head-bar -->
-    <h1>LDAP Configuration</h1>
-
-    <div class="content-wrapper">
-        <div class="card stretch card-pole-pad card-side-pad">
-            <jf-panel jf-panel-heading="LDAP Settings">
-                <div class="pull-right admin-grid-buttons">
-                    <a ui-sref="^.ldap_settings.new">
-                        <i class="grid-button-icon icon icon-new"></i>New
-                    </a>
-                </div>
-                <div class="clearfix"></div>
-                <jf-grid grid-options="Ldap.settingsGridOption"
-                         filter-field="key"
-                         filter-on-change="true"
-                         object-name="Setting">
-                </jf-grid>
-            </jf-panel>
-            <jf-panel jf-panel-heading="LDAP Groups"
-                      jf-disable-feature="ldap">
-                <div class="pull-right admin-grid-buttons">
-                    <a ui-sref="^.ldap_settings.new_ldap_group">
-                        <i class="grid-button-icon icon icon-new"></i>New
-                    </a>
-                </div>
-                <div class="clearfix"></div>
-                <jf-grid grid-options="Ldap.groupsGridOption"
-                         filter-field="name"
-                         filter-on-change="true"
-                         object-name="Group">
-                </jf-grid>
-            </jf-panel>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/ldap_settings/ldap_settings.module.js b/web/angular-web/src/main/webapp/app/states/admin/security/ldap_settings/ldap_settings.module.js
deleted file mode 100644
index 540938e..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/ldap_settings/ldap_settings.module.js
+++ /dev/null
@@ -1,43 +0,0 @@
-import {LdapSettingsController} from './ldap_settings.controller.js'
-import {LdapSettingFormController} from './ldap_setting_form.controller.js'
-import {LdapGroupFormController} from './ldap_group_form.controller.js'
-
-function ldapSettingConfig($stateProvider) {
-
-    $stateProvider
-            .state('admin.security.ldap_settings', {
-                url: '/ldap_settings',
-                templateUrl: 'states/admin/security/ldap_settings/ldap_settings.html',
-                controller: 'LdapSettingsController as Ldap'
-            })
-            .state('admin.security.ldap_settings.new', {
-                parent: 'admin.security',
-                url: '/ldap_settings/new',
-                templateUrl: 'states/admin/security/ldap_settings/ldap_setting_form.html',
-                controller: 'LdapSettingFormController as LdapSettingForm'
-            })
-            .state('admin.security.ldap_settings.edit', {
-                parent: 'admin.security',
-                url: '/ldap_settings/:ldapSettingKey/edit',
-                templateUrl: 'states/admin/security/ldap_settings/ldap_setting_form.html',
-                controller: 'LdapSettingFormController as LdapSettingForm'
-            })
-            .state('admin.security.ldap_settings.new_ldap_group', {
-                parent: 'admin.security',
-                url: '/ldap_groups/new',
-                templateUrl: 'states/admin/security/ldap_settings/ldap_group_form.html',
-                controller: 'LdapGroupFormController as LdapGroupForm'
-            })
-            .state('admin.security.ldap_settings.edit_ldap_group', {
-                parent: 'admin.security',
-                url: '/ldap_groups/:ldapGroupName/edit',
-                templateUrl: 'states/admin/security/ldap_settings/ldap_group_form.html',
-                controller: 'LdapGroupFormController as LdapGroupForm'
-            })
-}
-
-export default angular.module('security.ldap_settings', [])
-        .config(ldapSettingConfig)
-        .controller('LdapSettingsController', LdapSettingsController)
-        .controller('LdapSettingFormController', LdapSettingFormController)
-        .controller('LdapGroupFormController', LdapGroupFormController);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/oauth/oauth.controller.js b/web/angular-web/src/main/webapp/app/states/admin/security/oauth/oauth.controller.js
deleted file mode 100644
index 1959858..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/oauth/oauth.controller.js
+++ /dev/null
@@ -1,130 +0,0 @@
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-
-export class AdminSecurityOAuthController {
-
-    constructor($scope, ArtifactoryModelSaver, ArtifactoryModal, OAuthDao, ArtifactoryGridFactory, commonGridColumns, uiGridConstants) {
-        this.$scope = $scope;
-        this.OAuthDao = OAuthDao;
-        this.modal = ArtifactoryModal;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.commonGridColumns = commonGridColumns;
-        this.uiGridConstants = uiGridConstants;
-        this.artifactoryModelSaver = ArtifactoryModelSaver.createInstance(this,['oauthData']);
-        this.providersGridOptions = null;
-        this.TOOLTIP = TOOLTIP.admin.security.OAuthSSO;
-        this.selectizeConfig = {
-            sortField: 'text',
-            create: false,
-            maxItems: 1
-        };
-        this._createGrid();
-        this._init();
-    }
-
-    _init() {
-        this.OAuthDao.get().$promise.then((data)=>{
-            this.oauthData = data;
-            this.selectizeOptions = [{text:' ',value: '*'}];
-            let githubProviders = _.filter(data.providers,(p)=>{return p.providerType === 'github'});
-            this.selectizeOptions = this.selectizeOptions.concat(_.map(githubProviders, (p)=>Object({text:p.name,value:p.name})));
-            if (!_.findWhere(githubProviders,{name: data.defaultNpm})) {
-                this.selectizeOptions.push({text: data.defaultNpm,value:data.defaultNpm});
-            }
-            data.providers.forEach((provider) => {
-                provider.typeDisplayName = _.findWhere(data.availableTypes, {type: provider.providerType}).displayName;
-            });
-            this.providersGridOptions.setGridData(data.providers);
-            this.artifactoryModelSaver.save();
-        });
-    }
-
-    _createGrid() {
-        this.providersGridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setColumns(this._getColumns())
-                .setButtons(this._getActions())
-                .setRowTemplate('default');
-    }
-
-    _getColumns() {
-        return [
-            {
-                name: 'Name',
-                displayName: 'Name',
-                field: "name",
-                cellTemplate: '<div class="ui-grid-cell-contents" ui-sref="^.oauth.edit({providerName: row.entity.name})"><a href="">{{row.entity.name}}</a></div>',
-                sort: {
-                    direction: this.uiGridConstants.ASC
-                },
-                width: '20%'
-            },
-            {
-                name: 'Type',
-                displayName: 'Type',
-                field: "typeDisplayName",
-                width: '15%'
-            },
-            {
-                name: 'ID',
-                displayName: 'ID',
-                field: "id",
-                width: '20%'
-            },
-            {
-                name: 'Auth Url',
-                displayName: 'Auth Url',
-                field: "authUrl",
-                width: '35%'
-            },
-            {
-                name: "Enabled",
-                displayName: "Enabled",
-                field: "enabled",
-                cellTemplate: this.commonGridColumns.booleanColumn('row.entity.enabled'),
-                width: '10%'
-            }
-        ]
-    }
-
-    _getActions() {
-        return [
-            {
-                icon: 'icon icon-clear',
-                tooltip: 'Delete',
-                callback: (row) => this.deleteProvider(row)
-            }
-
-        ];
-    }
-
-    deleteProvider(row) {
-        this.modal.confirm(`Are you sure you want to delete provider '${row.name}?'`)
-                .then(() => {
-                    this.OAuthDao.deleteProvider({},{provider: row.name}).$promise.then(()=>{
-                        this._init();
-                    });
-                });
-    }
-
-    save() {
-
-        let payload = _.cloneDeep(this.oauthData);
-
-        if (payload.defaultNpm === '*') delete payload.defaultNpm;
-        delete payload.providers;
-        delete payload.availableTypes;
-
-        this.OAuthDao.update(payload).$promise.then(()=>{
-            this.artifactoryModelSaver.save();
-        });
-
-    }
-
-    cancel() {
-        this.artifactoryModelSaver.ask().then(()=>{
-            this._init();
-        });
-    }
-    canSave() {
-        return this.oauthForm.$valid;
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/oauth/oauth.html b/web/angular-web/src/main/webapp/app/states/admin/security/oauth/oauth.html
deleted file mode 100644
index c35f943..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/oauth/oauth.html
+++ /dev/null
@@ -1,73 +0,0 @@
-<div class="content-layout-container">
-    <h1>OAuth SSO Configuration</h1>
-
-    <div class="content-wrapper">
-        <form class="form" name="AdminSecurityOAuth.oauthForm" ng-submit="AdminSecurityOAuth.save()" novalidate>
-            <div class="card stretch card-pole-pad card-side-pad">
-                <jf-panel jf-panel-heading="General OAuth Settings">
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Enable OAuth">
-                                <input type="checkbox"
-                                       id="enabled"
-                                       ng-model="AdminSecurityOAuth.oauthData.enabled">
-                            </jf-checkbox>
-                        </div>
-                    </div>
-                    <div class="form-group form-checkbox">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Auto Create Artifactory Users">
-                                <input type="checkbox"
-                                       id="persistUsers"
-                                       ng-disabled="!AdminSecurityOAuth.oauthData.enabled"
-                                       ng-model="AdminSecurityOAuth.oauthData.persistUsers">
-                            </jf-checkbox>
-                        </div>
-                    </div>
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-checkbox text="Allow Created Users Access To Profile Page">
-                                <input type="checkbox"
-                                       id="allowUserToAccessProfile"
-                                       ng-disabled="!AdminSecurityOAuth.oauthData.enabled"
-                                       ng-model="AdminSecurityOAuth.oauthData.allowUserToAccessProfile">
-                            </jf-checkbox>
-                            <jf-help-tooltip html="AdminSecurityOAuth.TOOLTIP.allowUserToAccessProfile"></jf-help-tooltip>
-                        </div>
-                    </div>
-                    <div class="form-group-cell">
-                        <jf-field>
-                            <label>Default GitHub Provider</label>
-                            <selectize config='AdminSecurityOAuth.selectizeConfig'
-                                       options='AdminSecurityOAuth.selectizeOptions'
-                                       ng-disabled='!AdminSecurityOAuth.oauthData.enabled'
-                                       ng-model='AdminSecurityOAuth.oauthData.defaultNpm'>
-                            </selectize>
-                        </jf-field>
-                    </div>
-                    <div>
-                        <div class="pull-right">
-                            <button class="btn btn-default" type="button" ng-click="AdminSecurityOAuth.cancel()">
-                                Reset
-                            </button>
-                            <button class="btn btn-primary" ng-disabled="!AdminSecurityOAuth.canSave()">Save</button>
-                        </div>
-                    </div>
-                </jf-panel>
-                <jf-panel jf-panel-heading="Providers">
-                    <div class="pull-right admin-grid-buttons">
-                        <a ui-sref="^.oauth.new">
-                            <i class="grid-button-icon icon icon-new"></i>New
-                        </a>
-                    </div>
-                    <div class="clearfix"></div>
-                    <jf-grid
-                            grid-options="AdminSecurityOAuth.providersGridOptions"
-                            filter-field="name"
-                            object-name="provider">
-                    </jf-grid>
-                </jf-panel>
-            </div>
-        </form>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/oauth/oauth.module.js b/web/angular-web/src/main/webapp/app/states/admin/security/oauth/oauth.module.js
deleted file mode 100644
index 8919d5b..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/oauth/oauth.module.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import {AdminSecurityOAuthController} from './oauth.controller';
-import {AdminSecurityOAuthProviderFormController} from './oauth_provider_form.controller';
-
-function oauthConfig($stateProvider) {
-
-    $stateProvider
-            .state('admin.security.oauth', {
-                params: {feature: 'oauthsso'},
-                url: '/oauth',
-                templateUrl: 'states/admin/security/oauth/oauth.html',
-                controller: 'AdminSecurityOAuthController as AdminSecurityOAuth'
-            })
-            .state('admin.security.oauth.edit', {
-                params: {feature: 'oauthsso'},
-                parent: 'admin.security',
-                url: '/oauth/{providerName}/edit',
-                templateUrl: 'states/admin/security/oauth/oauth_provider_form.html',
-                controller: 'AdminSecurityOAuthProviderFormController as ProviderForm'
-            })
-            .state('admin.security.oauth.new', {
-                params: {feature: 'oauthsso'},
-                parent: 'admin.security',
-                url: '/oauth/newprovider',
-                templateUrl: 'states/admin/security/oauth/oauth_provider_form.html',
-                controller: 'AdminSecurityOAuthProviderFormController as ProviderForm'
-            })
-
-}
-
-export default angular.module('security.oauth', [])
-        .config(oauthConfig)
-        .controller('AdminSecurityOAuthController', AdminSecurityOAuthController)
-        .controller('AdminSecurityOAuthProviderFormController', AdminSecurityOAuthProviderFormController);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/oauth/oauth_provider_form.controller.js b/web/angular-web/src/main/webapp/app/states/admin/security/oauth/oauth_provider_form.controller.js
deleted file mode 100644
index 9a85be6..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/oauth/oauth_provider_form.controller.js
+++ /dev/null
@@ -1,99 +0,0 @@
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-
-export class AdminSecurityOAuthProviderFormController {
-
-    constructor($state, $stateParams, ArtifactoryModelSaver, OAuthDao) {
-        this.OAuthDao = OAuthDao;
-        this.$state = $state;
-        this.TOOLTIP = TOOLTIP.admin.security.OAuthSSO;
-        this.artifactoryModelSaver = ArtifactoryModelSaver.createInstance(this,['providerData']);
-
-        this.selectizeConfig = {
-            sortField: 'text',
-            create: false,
-            maxItems: 1
-        };
-
-
-        if ($stateParams.providerName) {
-            this.mode = 'edit';
-            this.providerName = $stateParams.providerName;
-            this.title = 'Edit ' + this.providerName + ' Provider';
-        }
-        else {
-            this.mode = 'create';
-            this.providerData = {
-                enabled: true
-            };
-            this.title = 'Add New Provider';
-        }
-
-        this._getData();
-
-    }
-
-    _getData() {
-        this.OAuthDao.get().$promise.then((data) => {
-            this._setMandatoryFieldsData(data.availableTypes);
-
-            this.selectizeOptions = _.map(data.availableTypes, (t)=>Object({text:t.displayName,value:t.type}));
-            if (this.mode === 'create') {
-                this.providerData.providerType = data.availableTypes[0].type;
-                this._setDefaultValues();
-            }
-            else if (this.mode === 'edit') {
-                this.providerData = _.findWhere(data.providers,{name: this.providerName});
-            }
-            this.artifactoryModelSaver.save();
-        });
-    }
-
-    _setMandatoryFieldsData(typesData) {
-        this.mandatoryFields = {};
-        this.fieldHolders = {};
-        typesData.forEach((typeRec) => {
-            this.mandatoryFields[typeRec.type] = {};
-            this.fieldHolders[typeRec.type] = {};
-            typeRec.mandatoryFields.forEach((field) => {
-                this.fieldHolders[typeRec.type][field] = typeRec.fieldHolders[typeRec.mandatoryFields.indexOf(field)] || '';
-                this.mandatoryFields[typeRec.type][field] = typeRec.fieldsValues[typeRec.mandatoryFields.indexOf(field)] || '';
-            });
-        });
-    }
-
-    _setDefaultValues() {
-        this.providerData.apiUrl = this.providerData.authUrl = this.providerData.tokenUrl = this.providerData.basicUrl =
-        this.providerData.apiUrlHolder = this.providerData.authUrlHolder = this.providerData.tokenUrlHolder = this.providerData.basicUrlHolder = '';
-        for (let key in this.mandatoryFields[this.providerData.providerType]) {
-            this.providerData[key] = this.mandatoryFields[this.providerData.providerType][key];
-            this.providerData[key + 'Holder'] = this.fieldHolders[this.providerData.providerType][key];
-        };
-    }
-
-    onChangeProviderType() {
-        this._setDefaultValues()
-    }
-
-    save() {
-        if (this.mode === 'edit') {
-            this.OAuthDao.updateProvider(this.providerData).$promise.then(()=>{
-                this.artifactoryModelSaver.save();
-                this.$state.go('^.oauth');
-            })
-        }
-        else if (this.mode === 'create') {
-            this.OAuthDao.createProvider(this.providerData).$promise.then(()=>{
-                this.artifactoryModelSaver.save();
-                this.$state.go('^.oauth');
-            })
-        }
-    }
-
-    cancel() {
-        this.$state.go('^.oauth');
-    }
-
-    isSaveDisabled() {
-        return !this.providerForm.$valid;
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/oauth/oauth_provider_form.html b/web/angular-web/src/main/webapp/app/states/admin/security/oauth/oauth_provider_form.html
deleted file mode 100644
index 4e15c68..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/oauth/oauth_provider_form.html
+++ /dev/null
@@ -1,165 +0,0 @@
-<div class="content-layout-container"> <!-- classes: with-head-bar -->
-    <h1>{{ProviderForm.title}}</h1>
-
-    <div class="content-wrapper">
-        <form name="ProviderForm.providerForm" ng-submit="ProviderForm.save()">
-            <div class="card stretch card-pole-pad card-side-pad">
-                <div class="content-with-footer">
-                    <div class="oauth-provider-form">
-
-                        <jf-panel jf-panel-heading="Provider Settings">
-                            <div class="form-group">
-                                <div class="form-group-cell">
-                                    <jf-checkbox text="Enabled">
-                                        <input type="checkbox"
-                                               id="enabled"
-                                               ng-model="ProviderForm.providerData.enabled">
-                                    </jf-checkbox>
-                                </div>
-                            </div>
-                            <div class="form-group">
-                                <div class="form-group-cell">
-                                    <jf-field validations="common">
-                                        <label class="mandatory" for="providerName">Provider Name</label>
-                                        <input id="providerName"
-                                               ng-disabled="ProviderForm.mode !== 'create'"
-                                               type="text"
-                                               ng-model="ProviderForm.providerData.name"
-                                               name="providerName"
-                                               class="input-text"
-                                               required>
-                                    </jf-field>
-                                </div>
-                            </div>
-                            <div class="form-group">
-                                <div class="form-group-cell">
-                                    <jf-field>
-                                        <label class="mandatory">Provider Type</label>
-                                        <selectize config="ProviderForm.selectizeConfig"
-                                                   options="ProviderForm.selectizeOptions"
-                                                   ng-change="ProviderForm.onChangeProviderType()"
-                                                   ng-model="ProviderForm.providerData.providerType">
-                                        </selectize>
-                                    </jf-field>
-                                </div>
-                            </div>
-                            <div class="form-group">
-                                <div class="form-group-cell">
-                                    <jf-field validations="common">
-                                        <label for="providerID" class="mandatory">Client ID</label>
-                                        <jf-help-tooltip html="ProviderForm.TOOLTIP.id"></jf-help-tooltip>
-                                        <input id="providerID"
-                                               type="text"
-                                               ng-model="ProviderForm.providerData.id"
-                                               name="providerID"
-                                               required
-                                               class="input-text">
-                                    </jf-field>
-                                </div>
-                            </div>
-                            <div class="form-group">
-                                <div class="form-group-cell">
-                                    <jf-field validations="common">
-                                        <label for="secret" class="mandatory">Secret</label>
-                                        <jf-help-tooltip html="ProviderForm.TOOLTIP.secret"></jf-help-tooltip>
-                                        <input id="secret"
-                                               type="password"
-                                               ng-model="ProviderForm.providerData.secret"
-                                               name="secret"
-                                               required
-                                               class="input-text">
-                                    </jf-field>
-                                </div>
-                            </div>
-                            <div class="form-group" ng-if="ProviderForm.mandatoryFields[ProviderForm.providerData.providerType].domain !== undefined">
-                                <div class="form-group-cell">
-                                    <jf-field validations="common">
-                                        <label for="domain" class="mandatory">Domain</label>
-                                        <jf-help-tooltip html="ProviderForm.TOOLTIP.domain"></jf-help-tooltip>
-                                        <input id="domain"
-                                               type="text"
-                                               ng-model="ProviderForm.providerData.domain"
-                                               name="domain"
-                                               required
-                                               class="input-text">
-                                    </jf-field>
-                                </div>
-                            </div>
-                            <div class="form-group" ng-if="ProviderForm.mandatoryFields[ProviderForm.providerData.providerType].basicUrl !== undefined">
-                                <div class="form-group-cell">
-                                    <jf-field validations="common">
-                                        <label for="basicUrl" class="mandatory">Basic URL</label>
-                                        <jf-help-tooltip html="ProviderForm.TOOLTIP.basicUrl"></jf-help-tooltip>
-                                        <input type="url"
-                                               class="input-text"
-                                               id="basicUrl"
-                                               name="basicUrl"
-                                               required
-                                               ng-model="ProviderForm.providerData.basicUrl"/>
-                                    </jf-field>
-                                </div>
-                            </div>
-                            <div class="form-group" ng-if="ProviderForm.mandatoryFields[ProviderForm.providerData.providerType].authUrl !== undefined">
-                                <div class="form-group-cell">
-                                    <jf-field validations="common">
-                                        <label for="authUrl" class="mandatory">Auth URL</label>
-                                        <jf-help-tooltip html="ProviderForm.TOOLTIP.authUrl"></jf-help-tooltip>
-                                        <input type="url"
-                                               class="input-text"
-                                               id="authUrl"
-                                               name="authUrl"
-                                               required
-                                               placeholder="{{ProviderForm.providerData.authUrlHolder}}"
-                                               ng-model="ProviderForm.providerData.authUrl"/>
-                                    </jf-field>
-                                </div>
-                            </div>
-                            <div class="form-group" ng-if="ProviderForm.mandatoryFields[ProviderForm.providerData.providerType].apiUrl !== undefined">
-                                <div class="form-group-cell">
-                                    <jf-field validations="common">
-                                        <label for="apiUrl" class="mandatory">API URL</label>
-                                        <jf-help-tooltip html="ProviderForm.TOOLTIP.apiUrl"></jf-help-tooltip>
-                                        <input type="url"
-                                               class="input-text"
-                                               id="apiUrl"
-                                               name="apiUrl"
-                                               required
-                                               placeholder="{{ProviderForm.providerData.apiUrlHolder}}"
-                                               ng-model="ProviderForm.providerData.apiUrl"/>
-                                    </jf-field>
-                                </div>
-                            </div>
-                            <div class="form-group" ng-if="ProviderForm.mandatoryFields[ProviderForm.providerData.providerType].tokenUrl !== undefined">
-                                <div class="form-group-cell">
-                                    <jf-field validations="common">
-                                        <label for="tokenUrl" class="mandatory">Token URL</label>
-                                        <jf-help-tooltip html="ProviderForm.TOOLTIP.tokenUrl"></jf-help-tooltip>
-                                        <input type="url"
-                                               class="input-text"
-                                               id="tokenUrl"
-                                               name="tokenUrl"
-                                               required
-                                               placeholder="{{ProviderForm.providerData.tokenUrlHolder}}"
-                                               ng-model="ProviderForm.providerData.tokenUrl"/>
-                                    </jf-field>
-                                </div>
-                            </div>
-
-                        </jf-panel>
-
-                    </div>
-                </div>
-            </div>
-
-            <div class="content-footer">
-                <div class="pull-right">
-                    <button class="btn btn-default" type="button"
-                            ng-click="ProviderForm.cancel()">Cancel</button>
-                    <button class="btn btn-primary" type="submit"
-                            ng-disabled="ProviderForm.isSaveDisabled()">Save
-                    </button>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/permissions/permission_form.html b/web/angular-web/src/main/webapp/app/states/admin/security/permissions/permission_form.html
deleted file mode 100644
index 8adf6f4..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/permissions/permission_form.html
+++ /dev/null
@@ -1,177 +0,0 @@
-<div class="content-layout-container permissions-form">
-    <h1>{{PermissionForm.title}}</h1>
-
-    <div class="content-wrapper">
-        <form name="PermissionForm.form" ng-submit="PermissionForm.save()">
-            <div class="card stretch card-pole-pad card-side-pad">
-                <div class="content-with-footer">
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-field validations="common" autofocus="true">
-                                <label class="mandatory">Name</label>
-
-                                <input type="text"
-                                       class="input-text"
-                                       name="name"
-                                       ng-disabled="!PermissionForm.newPermission"
-                                       ng-model="PermissionForm.permission.name" required/>
-                            </jf-field>
-                        </div>
-                    </div>
-
-                    <div class="wizard-container">
-                        <ul class="wizard-tabs">
-                            <li ng-click="PermissionForm.setCurrentTab('repo')"
-                                ng-class="{active:PermissionForm.isCurrentTab('repo')}">Repositories</li>
-                            <li ng-click="PermissionForm.setCurrentTab('groups')"
-                                ng-class="{active:PermissionForm.isCurrentTab('groups')}">Groups</li>
-                            <li ng-click="PermissionForm.setCurrentTab('users')"
-                                ng-class="{active:PermissionForm.isCurrentTab('users')}">Users</li>
-                        </ul>
-
-                        <div class="wizard-content" ng-switch="PermissionForm.currentTab">
-                            <div ng-switch-when="repo">
-                                <div class="form-group">
-                                    <div class="form-group-cell">
-                                        <jf-list-maker values="PermissionForm.permission.includePatternArray"
-                                                       label="Include Pattern"
-                                                       help-tooltip="PermissionForm.TOOLTIP.includePatterns"
-                                                       object-name="Pattern">
-                                        </jf-list-maker>
-                                    </div>
-                                    <div class="form-group-cell">
-                                        <jf-list-maker values="PermissionForm.permission.excludePatternArray"
-                                                       label="Exclude Pattern"
-                                                       help-tooltip="PermissionForm.TOOLTIP.excludePatterns"
-                                                       object-name="Pattern">
-                                        </jf-list-maker>
-                                    </div>
-                                </div>
-                                <div class="form-group">
-                                    <div class="form-group-cell double">
-                                        <jf-drag-drop include-list="PermissionForm.permission.repoKeys"
-                                                      exclude-list="PermissionForm.permission.availableRepoKeys"
-                                                      ng-disabled="PermissionForm.isDisableRepositories()"
-                                                      include-display-field = "repoKey"
-                                                      exclude-display-field = "repoKey"
-                                                      objects-name="Repositories"
-                                                      headers="{leftTitle:'Available Repositories', rightTitle:'Selected Repositories'}"></jf-drag-drop>
-                                    </div>
-                                </div>
-                                <div class="form-group">
-                                    <div class="form-group-cell double">
-                                        <jf-checkbox text="Any Local Repository">
-                                            <input type="checkbox"
-                                                   id="anyLocal"
-                                                   ng-disabled="PermissionForm.isDisableRepositories()"
-                                                   ng-model="PermissionForm.permission.anyLocal"
-                                                   ng-change="PermissionForm.setAnyLocalRepo()">
-                                        </jf-checkbox>
-                                        <jf-checkbox text="Any Remote Repository">
-                                            <input type="checkbox"
-                                                   id="anyRemote"
-                                                   ng-disabled="PermissionForm.isDisableRepositories()"
-                                                   ng-model="PermissionForm.permission.anyRemote"
-                                                   ng-change="PermissionForm.setAnyRemoteRepo()">
-                                        </jf-checkbox>
-                                        <jf-checkbox text="Any Distribution Repository">
-                                            <input type="checkbox"
-                                                   id="anyDistribution"
-                                                   ng-disabled="PermissionForm.isDisableRepositories()"
-                                                   ng-model="PermissionForm.permission.anyDistribution"
-                                                   ng-change="PermissionForm.setAnyDistributionRepo()">
-                                        </jf-checkbox>
-                                    </div>
-                                </div>
-                            </div>
-                            <div ng-switch-when="groups">
-                                <div class="row">
-                                    <div class="col-lg-3">
-                                        <input type="text"
-                                               ng-model="PermissionForm.filterList"
-                                               placeholder="Filter..."
-                                               class="input-text dnd-filter">
-                                        <div class="group-list-wrapper">
-                                            <ul class="group-list">
-                                                <li class="group-list-item"
-                                                    ng-repeat="group in PermissionForm.availableGroups | filter:PermissionForm.filterList track by $index"
-                                                    ng-click="PermissionForm.toggleSelection(group)"
-                                                    ng-dblclick="PermissionForm.addGroup(group)"
-                                                    ng-class="{active:PermissionForm.isSelected(group)}">
-                                                    {{group}}
-                                                    <i class="icon icon-arrow pull-right cursor-pointer" ng-click="PermissionForm.addGroup(group)"></i>
-                                                </li>
-                                            </ul>
-                                        </div>
-                                        <p class="info-bar"><i class="icon icon-info"></i>Double click to add group</p>
-                                    </div>
-                                    <div class="col-lg-9">
-                                        <jf-grid grid-options="PermissionForm.groupsGridOption"
-                                                 filter-field="principal"
-                                                 filter-on-change="true">
-                                        </jf-grid>
-                                    </div>
-                                </div>
-                            </div>
-                            <div ng-switch-when="users">
-                                <div class="row">
-                                    <div class="col-lg-3">
-                                        <input type="text"
-                                               ng-model="PermissionForm.filterList"
-                                               placeholder="Filter..."
-                                               class="input-text dnd-filter">
-                                        <div class="group-list-wrapper">
-                                            <ul class="group-list">
-                                                <li class="group-list-item"
-                                                    ng-repeat="user in PermissionForm.availableUsers | filter:PermissionForm.filterList track by $index"
-                                                    ng-click="PermissionForm.toggleSelection(user)"
-                                                    ng-dblclick="PermissionForm.addUser(user)"
-                                                    ng-class="{active:PermissionForm.isSelected(user)}">
-                                                    {{user}}
-                                                    <i class="icon icon-arrow pull-right cursor-pointer" ng-click="PermissionForm.addUser(user)"></i>
-                                                </li>
-                                            </ul>
-                                        </div>
-                                        <p class="info-bar"><i class="icon icon-info"></i>Double click to add user</p>
-                                    </div>
-                                    <div class="col-lg-9">
-                                        <jf-grid grid-options="PermissionForm.usersGridOption"
-                                                 filter-field="principal"
-                                                 filter-on-change="true">
-                                        </jf-grid>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-
-            <div class="content-footer">
-                <div class="pull-right">
-                    <button class="btn btn-default" type="button"
-                            ui-sref="^.permissions">Cancel
-                    </button>
-
-                    <div class="wizard-pager">
-                        <a href=""
-                           ng-disabled="PermissionForm.currentTab == 'repo'"
-                           ng-click="PermissionForm.prevStep()">
-                            < Back
-                        </a>
-                        <a href=""
-                           ng-disabled="PermissionForm.currentTab == 'users'"
-                           ng-click="PermissionForm.fwdStep()">
-                            Next >
-                        </a>
-                    </div>
-                    <button type="submit"
-                            class="btn  btn-primary"
-                            ng-disabled="PermissionForm.form.$invalid || !PermissionForm.permission.repoKeys.length">
-                        Save & Finish
-                    </button>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/permissions/permissions.controller.js b/web/angular-web/src/main/webapp/app/states/admin/security/permissions/permissions.controller.js
deleted file mode 100644
index 9c65bdb..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/permissions/permissions.controller.js
+++ /dev/null
@@ -1,131 +0,0 @@
-export class AdminSecurityPermissionsController {
-    constructor($scope,$state, ArtifactoryGridFactory, PermissionsDao, ArtifactoryModal, uiGridConstants, User, commonGridColumns) {
-        this.$state=$state;
-        this.currentTab = 'repo';
-        this.modal = ArtifactoryModal;
-        this.permissionsDao = PermissionsDao.getInstance();
-        this.$scope = $scope;
-        this.commonGridColumns = commonGridColumns;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.uiGridConstants = uiGridConstants;
-        this.user = User.getCurrent();
-        this._createGrid();
-        this.initPermission();
-
-    }
-
-    initPermission() {
-        this.permissionsDao.getAll().$promise.then((permissions)=> {
-            permissions.forEach((permission)=>{
-                permission.groupsList = _.pluck(permission.groups,'principal');
-                permission.usersList = _.pluck(permission.users,'principal');
-                permission.reposList = _.pluck(permission.repoKeys,'repoKey');
-                permission.repoKeysView = permission.repoKeysView ? (permission.repoKeysView.indexOf('|') !== -1 ? permission.repoKeysView.split('|')[1].trim() : permission.repoKeysView) : '';
-            });
-
-            this.gridOption.setGridData(permissions);
-        });
-    }
-
-    showNew() {
-        return this.user.isAdmin();
-    }
-
-    _createGrid() {
-
-        this.gridOption = this.artifactoryGridFactory.getGridInstance(this.$scope)
-            .setColumns(this._getColumns())
-            .setRowTemplate('default')
-            .setMultiSelect()
-            .setButtons(this._getActions())
-            .setGridData([])
-            .setBatchActions(this._getBatchActions());
-
-        this.gridOption.isRowSelectable = (row) => {
-            return row.entity.name !== this.user.name;
-        }
-    }
-
-    _getActions() {
-        return [
-            {
-                icon: 'icon icon-clear',
-                tooltip: 'Delete',
-                callback: row => this._deletePermission(row),
-                visibleWhen: row => !_.findWhere(row.users, {principal: this.user.name})
-            }
-/*
-            {
-                icon: 'icon icon-builds',
-                tooltip: 'Edit',
-                callback: row => this._editPermission(row)
-            }
-*/
-        ]
-    }
-
-    editPermission(row) {
-        this.$state.go('^.permissions.edit', {permission: row.name})
-    }
-
-    _deletePermission(row) {
-        let json = {permissionTargetNames:[row.name]};
-        this.modal.confirm(`Are you sure you want to delete permission '${row.name}?'`)
-          .then(() => this.permissionsDao.deletePermission(json).$promise.then(()=>this.initPermission()));
-    }
-
-    bulkDelete() {
-        //Get All selected users
-        let selectedRows = this.gridOption.api.selection.getSelectedRows();
-        //Create an array of the selected permission names
-        let names = _.map(selectedRows, (row) => {return row.name;});
-        //Create Json for the bulk request
-        let json = {permissionTargetNames: names};
-        //console.log('Bulk delete....');
-        //Ask for confirmation before delete and if confirmed then delete bulk of users
-        this.modal.confirm(`Are you sure you want to delete ${names.length} permissions?`).
-        then(() => this.permissionsDao.deletePermission(json).$promise.then(() => this.initPermission()));
-    }
-
-    _getColumns() {
-        return [
-            {
-                name: 'Permission Target Name',
-                displayName: 'Permission Target Name',
-                field: 'name',
-                sort: {
-                    direction: this.uiGridConstants.ASC
-                },
-                cellTemplate: '<div class="ui-grid-cell-contents"><a href ng-click="grid.appScope.Permissions.editPermission(row.entity)">{{row.entity.name}}</a></div>'
-            },
-            {
-                name: 'Repositories',
-                displayName: 'Repositories',
-                cellTemplate: this.commonGridColumns.listableColumn('row.entity.reposList','row.entity.name','row.entity.repoKeysView',true),
-                field: 'repoKeysView'
-            },
-            {
-                name: 'Groups',
-                displayName: 'Groups',
-                cellTemplate: this.commonGridColumns.listableColumn('row.entity.groupsList','row.entity.name'),
-                field: 'groupsList'
-
-            },
-            {
-                name: 'Users',
-                displayName: 'Users',
-                cellTemplate: this.commonGridColumns.listableColumn('row.entity.usersList','row.entity.name'),
-                field: 'usersList'
-            }
-        ]
-    }
-    _getBatchActions() {
-        return [
-            {
-                icon: 'clear',
-                name: 'Delete',
-                callback: () => this.bulkDelete()
-            }
-        ]
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/permissions/permissions.html b/web/angular-web/src/main/webapp/app/states/admin/security/permissions/permissions.html
deleted file mode 100644
index 3306638..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/permissions/permissions.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<div class="content-layout-container">
-    <h1>Permissions Management</h1>
-
-    <div class="content-wrapper">
-        <div class="card stretch card-pole-pad card-side-pad">
-            <div class="pull-right admin-grid-buttons">
-                <a ui-sref="^.permissions.new"
-                        ng-if="Permissions.showNew()">
-                    <i class="grid-button-icon icon icon-new"></i>New
-                </a>
-            </div>
-            <jf-grid grid-options="Permissions.gridOption"
-                     filter-field="name"
-                     filter-field2="repoKeysView"
-                     object-name="permission"
-                     auto-focus="true">
-            </jf-grid>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/permissions/permissions.module.js b/web/angular-web/src/main/webapp/app/states/admin/security/permissions/permissions.module.js
deleted file mode 100644
index 86d8a01..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/permissions/permissions.module.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import {AdminSecurityPermissionsController} from './permissions.controller'
-import {AdminSecurityPermissionsFormController} from './permissons_form.controller'
-
-function permissionsConfig($stateProvider) {
-
-    $stateProvider
-        .state('admin.security.permissions', {
-            url: '/permissions',
-            templateUrl: 'states/admin/security/permissions/permissions.html',
-            controller: 'AdminSecurityPermissionsController as Permissions'
-        })
-        .state('admin.security.permissions.edit', {
-            parent: 'admin.security',
-            url: '/permissions/{permission}/edit',
-            templateUrl: 'states/admin/security/permissions/permission_form.html',
-            controller: 'AdminSecurityPermissionsFormController as PermissionForm'
-        })
-        .state('admin.security.permissions.new', {
-            parent: 'admin.security',
-            url: '/permission/new',
-            templateUrl: 'states/admin/security/permissions/permission_form.html',
-            controller: 'AdminSecurityPermissionsFormController as PermissionForm'
-        })
-}
-
-export default angular.module('security.permissions', [])
-    .config(permissionsConfig)
-    .controller('AdminSecurityPermissionsController', AdminSecurityPermissionsController)
-    .controller('AdminSecurityPermissionsFormController', AdminSecurityPermissionsFormController)
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/permissions/permissons_form.controller.js b/web/angular-web/src/main/webapp/app/states/admin/security/permissions/permissons_form.controller.js
deleted file mode 100644
index 8ed72a2..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/permissions/permissons_form.controller.js
+++ /dev/null
@@ -1,521 +0,0 @@
-import TOOLTIP from "../../../../constants/artifact_tooltip.constant";
-
-export class AdminSecurityPermissionsFormController {
-    constructor($scope, $state, $stateParams, $q, ArtifactoryModal, ArtifactoryGridFactory, RepoDataDao,
-            PermissionsDao, commonGridColumns, User, ArtifactoryModelSaver) {
-        this.$scope = $scope;
-        this.$q = $q;
-        this.repoDataDao = RepoDataDao;
-        this.commonGridColumns = commonGridColumns;
-        this.user = User.getCurrent();
-        this.modal = ArtifactoryModal;
-        this.currentTab = 'repo';
-        this.$state = $state;
-        this.title = "New Permission";
-        this.$stateParams = $stateParams;
-        this.permission = {};
-        this.permissionsDao = PermissionsDao.getInstance();
-        this.newPermission = false;
-        this.groupsGrid = [];
-        this.usersGrid = [];
-        this.selectedItems = [];
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.groupsGridOption = {};
-        this.usersGridOption = {};
-        this.TOOLTIP = TOOLTIP.admin.security.permissionsForm;
-        this.artifactoryModelSaver = ArtifactoryModelSaver.createInstance(this,['permission']);
-        this._createGroupsGrid();
-        this._createUsersGrid();
-        this.artifactoryModelSaver.save();
-
-        if (this.$stateParams.permission) {
-            this.initUpdatePermissionForm(this.$stateParams.permission);
-            this.title = "Edit " + this.$stateParams.permission + ' Permission';
-            this.newPermission = false;
-        }
-        else {
-            this.newPermission = true;
-            this.title = "New Permission";
-            this._initNewPermissionForm();
-        }
-    }
-
-    _getUsersAndGroups() {
-        this.permissionsDao.getAllUsersAndGroups().$promise.then((response)=> {
-            this.allUsers = response.allUsers;
-            this.allGroups = response.allGroups;
-            this._filterAvailableUsers();
-            this._filterAvailableGroups();
-        });
-    }
-
-    _getAllRepos() {
-        let deferred = this.$q.defer();
-
-        this.repoDataDao.getAllForPerms({"permission": true}).$promise.then((result)=> {
-            this.allRepos = result.repoTypesList;
-            deferred.resolve();
-        });
-        return deferred.promise;
-
-    }
-
-    _initNewPermissionForm() {
-
-        this.permission.anyLocal = false;
-        this.permission.anyRemote = false;
-
-        this.permission.includePatternArray = ['**'];
-        this.permission.excludePatternArray = [];
-
-        this.permission.availableRepoKeys = [];
-        this.permission.repoKeys = [];
-
-        this._getUsersAndGroups();
-
-        this._getAllRepos().then(()=>{
-            this.permission.availableRepoKeys = _.map(this.allRepos, (repo)=> {
-                return repo;
-            });
-        });
-    }
-
-    initUpdatePermissionForm(permission) {
-
-        this.permissionsDao.getPermission({name: permission}).$promise.then((result)=> {
-
-            //console.log(result);
-            this.permission = result;
-
-            this.permission.repoKeys = _.map(this.permission.repoKeys,(repo)=>{
-                repo["__fixed__"] = (repo.type === 'local' && this.permission.anyLocal) || (repo.type === 'remote' && this.permission.anyRemote) || (repo.type === 'distribution' && this.permission.anyDistribution);
-                repo._iconClass = "icon " + (repo.type === 'local' ? "icon-local-repo" : (repo.type === 'remote' ? "icon-remote-repo" : (repo.type === 'virtual' ? "icon-virtual-repo" : (repo.type === 'distribution' ? "icon-distribution-repo" : "icon-notif-error"))));
-                return repo;
-            });
-
-            this.permission.availableRepoKeys = _.map(this.permission.availableRepoKeys,(repo)=>{
-                repo._iconClass = "icon " + (repo.type === 'local' ? "icon-local-repo" : (repo.type === 'remote' ? "icon-remote-repo" : (repo.type === 'virtual' ? "icon-virtual-repo" : (repo.type === 'distribution' ? "icon-distribution-repo" : "icon-notif-error"))));
-                return repo;
-            });
-
-            this.usersGridOption.setGridData(result.users);
-            this.groupsGridOption.setGridData(result.groups);
-
-            this.permission.includePatternArray = this.permission.includePattern ? this.permission.includePattern.split(',') : [];
-            this.permission.excludePatternArray = this.permission.excludePattern ? this.permission.excludePattern.split(',') : [];
-
-            this._getUsersAndGroups();
-
-            this.artifactoryModelSaver.save();
-
-        });
-    }
-
-    /**check and set current tab**/
-
-    setCurrentTab(tab) {
-        this.currentTab = tab;
-    }
-
-    isCurrentTab(tab) {
-        return this.currentTab === tab;
-    }
-
-    /**
-     * button pre and  forwd at the bottom page**/
-    prevStep() {
-        if (this.currentTab == 'groups') {
-            this.setCurrentTab('repo');
-            return;
-        }
-        if (this.currentTab == 'users') {
-            this.setCurrentTab('groups');
-            return;
-        }
-    }
-
-    fwdStep() {
-        if (this.currentTab == 'repo') {
-            this.setCurrentTab('groups');
-            return;
-        }
-        if (this.currentTab == 'groups') {
-            this.setCurrentTab('users');
-            return;
-        }
-    }
-
-
-    addGroup(group) {
-        if (!this.permission.groups) this.permission.groups = [];
-        this.permission.groups.push({principal: group,annotate:false,delete:false,deploy:false,managed:false,read:false,mask:31});
-        this.groupsGridOption.setGridData(this.permission.groups);
-        this._filterAvailableGroups();
-
-/*
-        if (group.name) {
-            this.groups = _.remove(this.permission.groups, {name: group.name});
-            this.groupsGrid.push({principal: group.name});
-        }
-        else {
-            this.groups = _.remove(this.permission.groups, group);
-            this.groupsGrid.push(group);
-        }
-
-        this.groupsGridOption.setGridData(this.groupsGrid);
-*/
-
-    }
-
-    addUser(user) {
-        if (!this.permission.users) this.permission.users = [];
-        this.permission.users.push({principal: user,annotate:false,delete:false,deploy:false,managed:false,read:false,mask:31});
-        this.usersGridOption.setGridData(this.permission.users);
-        this._filterAvailableUsers();
-/*
-        if (user.name) {
-            this.users = _.remove(this.permission.users, {name: user.name});
-            this.usersGrid.push({principal: user.name});
-        }
-        else {
-            this.users = _.remove(this.permission.users, user);
-            this.usersGrid.push(user);
-        }
-        this.usersGridOption.setGridData(this.usersGrid);
-*/
-    }
-
-    setAnyLocalRepo() {
-        if (this.permission.anyLocal) {
-            this.permission.availableRepoKeys.forEach((repo)=> {
-                if (repo.type == "local") {
-                    repo["__fixed__"]=true;
-                    if (!_.contains(this.permission.repoKeys, repo)) {
-                        this.permission.repoKeys.push(repo);
-                    }
-                }
-            });
-            this.permission.repoKeys.forEach((repo)=> {
-                if (repo.type == "local") {
-                    repo["__fixed__"] = true;
-                }
-            });
-            _.remove(this.permission.availableRepoKeys, {type: "local"});
-        }
-        else {
-            this.permission.repoKeys.forEach((repo)=> {
-                if (repo.type == "local") {
-                    if (!_.contains(this.permission.availableRepoKeys, repo)) {
-                        this.permission.availableRepoKeys.push(repo);
-                    }
-                }
-            });
-            _.remove(this.permission.repoKeys, {type: "local"});
-        }
-    }
-
-    setAnyRemoteRepo() {
-        if (this.permission.anyRemote) {
-            this.permission.availableRepoKeys.forEach((repo)=> {
-                if (repo.type == "remote") {
-                    repo["__fixed__"]=true;
-                    if (!_.contains(this.permission.repoKeys, repo)) {
-                        this.permission.repoKeys.push(repo);
-                    }
-                }
-            });
-            this.permission.repoKeys.forEach((repo)=> {
-                if (repo.type == "remote") {
-                    repo["__fixed__"] = true;
-                }
-            });
-            _.remove(this.permission.availableRepoKeys, {type: "remote"});
-        }
-        else {
-            this.permission.repoKeys.forEach((repo)=> {
-                if (repo.type == "remote") {
-                    if (!_.contains(this.permission.availableRepoKeys, repo)) {
-                        this.permission.availableRepoKeys.push(repo);
-                    }
-                }
-            });
-            _.remove(this.permission.repoKeys, {type: "remote"});
-        }
-    }
-
-    setAnyDistributionRepo() {
-        if (this.permission.anyDistribution) {
-            this.permission.availableRepoKeys.forEach((repo)=> {
-                if (repo.type == "distribution") {
-                    repo["__fixed__"] = true;
-                    if (!_.contains(this.permission.repoKeys, repo)) {
-                        this.permission.repoKeys.push(repo);
-                    }
-                }
-            });
-            this.permission.repoKeys.forEach((repo)=> {
-                if (repo.type == "distribution") {
-                    repo["__fixed__"] = true;
-                }
-            });
-            _.remove(this.permission.availableRepoKeys, {type: "distribution"});
-        }
-        else {
-            this.permission.repoKeys.forEach((repo)=> {
-                if (repo.type == "distribution") {
-                    if (!_.contains(this.permission.availableRepoKeys, repo)) {
-                        this.permission.availableRepoKeys.push(repo);
-                    }
-                }
-            });
-            _.remove(this.permission.repoKeys, {type: "distribution"});
-        }
-    }
-
-    _createGroupsGrid() {
-        this.groupsGridOption = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setRowTemplate('default')
-                .setMultiSelect()
-                .setColumns(this._getGroupsColumns())
-                .setButtons(this._getGroupsActions())
-                .setGridData([])
-                .setBatchActions(this._getGroupsBatchActions());
-    }
-
-    _createUsersGrid() {
-        this.usersGridOption = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setRowTemplate('default')
-                .setMultiSelect()
-                .setColumns(this._getUsersColumns())
-                .setGridData([])
-                .setButtons(this._getUsersActions())
-                .setBatchActions(this._getUsersBatchActions());
-
-        this.usersGridOption.isRowSelectable = (row) => {
-            return row.entity.principal !== this.user.name;
-        }
-    }
-
-    _getUsersColumns() {
-        return [
-            {
-                name: 'User',
-                displayName: 'User',
-                field: 'principal',
-                width: '26%'
-            },
-            {
-                name: 'Manage',
-                displayName: 'Manage',
-                field: 'managed',
-                cellTemplate: this.commonGridColumns.checkboxColumn('row.entity.managed', 'row.entity.managed?row.entity.delete=row.entity.deploy=row.entity.annotate=row.entity.read=true:null', 'grid.appScope.PermissionForm.isDisableManager(row.entity)'),
-                width: '12%'
-            },
-            {
-                name: 'Delete/Overwrite',
-                displayName: 'Delete/Overwrite',
-                field: 'delete',
-                cellTemplate: this.commonGridColumns.checkboxColumn('row.entity.delete', 'row.entity.delete?row.entity.deploy=row.entity.annotate=row.entity.read=true:null'),
-                width: '20%'
-            },
-            {
-                name: 'Deploy/Cache',
-                displayName: 'Deploy/Cache',
-                field: 'deploy',
-                cellTemplate: this.commonGridColumns.checkboxColumn('row.entity.deploy', 'row.entity.deploy?row.entity.annotate=row.entity.read=true:null'),
-                width: '20%'
-            },
-            {
-                name: 'Annotate',
-                displayName: 'Annotate',
-                field: 'annotate',
-                cellTemplate: this.commonGridColumns.checkboxColumn('row.entity.annotate', 'row.entity.annotate?row.entity.read=true:null'),
-                width: '12%'
-            },
-            {
-                name: 'Read',
-                displayName: 'Read',
-                field: 'read',
-                cellTemplate: this.commonGridColumns.checkboxColumn('row.entity.read'),
-                width: '10%',
-                minWidth: '100'
-            }
-        ]
-    }
-
-    _getGroupsColumns() {
-        return [
-            {
-                name: 'Group',
-                displayName: 'Group',
-                field: 'principal',
-                width: '26%'
-            },
-            {
-                name: 'Manage',
-                displayName: 'Manage',
-                field: 'managed',
-                cellTemplate: this.commonGridColumns.checkboxColumn('row.entity.managed', 'row.entity.managed?row.entity.delete=row.entity.deploy=row.entity.annotate=row.entity.read=true:null'),
-                width: '12%'
-            },
-            {
-                name: 'Delete/Overwrite',
-                displayName: 'Delete/Overwrite',
-                field: 'delete',
-                cellTemplate: this.commonGridColumns.checkboxColumn('row.entity.delete', 'row.entity.delete?row.entity.deploy=row.entity.annotate=row.entity.read=true:null'),
-                width: '20%'
-            },
-            {
-                name: 'Deploy/Cache',
-                displayName: 'Deploy/Cache',
-                field: 'deploy',
-                cellTemplate: this.commonGridColumns.checkboxColumn('row.entity.deploy', 'row.entity.deploy?row.entity.annotate=row.entity.read=true:null'),
-                width: '20%'
-            },
-            {
-                name: 'Annotate',
-                displayName: 'Annotate',
-                field: 'annotate',
-                cellTemplate: this.commonGridColumns.checkboxColumn('row.entity.annotate', 'row.entity.annotate?row.entity.read=true:null'),
-                width: '12%'
-            },
-            {
-                name: 'Read',
-                displayName: 'Read',
-                field: 'read',
-                cellTemplate: this.commonGridColumns.checkboxColumn('row.entity.read'),
-                width: '10%',
-                minWidth: '100'
-            }
-        ]
-    }
-
-
-    _getUsersBatchActions() {
-
-        return [
-            {
-                icon: 'clear',
-                name: 'Remove',
-                callback: () => this._deleteSelectedUsers()
-            }
-        ]
-    }
-
-    _getGroupsBatchActions() {
-
-        return [
-            {
-                icon: 'clear',
-                name: 'Remove',
-                callback: () => this._deleteSelectedGroups()
-            }
-        ]
-    }
-
-    _deleteSelectedGroups() {
-        let self = this;
-        let selectedGroups = this.groupsGridOption.api.selection.getSelectedRows();
-        let confirmMessage = 'Are you sure you wish to delete ' + selectedGroups.length;
-
-        selectedGroups.forEach((group)=> {
-            _.remove(this.permission.groups,group);
-        });
-        this.groupsGridOption.setGridData(this.permission.groups);
-        this._filterAvailableGroups();
-    }
-
-    _deleteSelectedUsers() {
-        let selectedUsers = this.usersGridOption.api.selection.getSelectedRows();
-        selectedUsers.forEach((user)=> {
-            _.remove(this.permission.users, user);
-        });
-        this.usersGridOption.setGridData(this.permission.users);
-        this._filterAvailableUsers();
-    }
-
-    _getGroupsActions() {
-        return [
-            {
-                icon: 'icon icon-clear',
-                tooltip: 'Remove',
-                callback: row => this._deleteGroup(row)
-            }
-        ]
-    }
-
-    _deleteGroup(row) {
-        _.remove(this.permission.groups,row);
-        this.groupsGridOption.setGridData(this.permission.groups);
-        this._filterAvailableGroups();
-
-    }
-
-    _getUsersActions() {
-        return [
-            {
-                icon: 'icon icon-clear',
-                tooltip: 'Remove',
-                callback: row => this._deleteUser(row),
-                visibleWhen: row => row.principal !== this.user.name
-            }
-        ]
-    }
-
-    _deleteUser(row) {
-    //    this.modal.confirm('Are you sure you wish to delete this user?')
-      //      .then(()=> {
-        _.remove(this.permission.users,row);
-        this.usersGridOption.setGridData(this.permission.users);
-
-        this._filterAvailableUsers();
-
-/*
-                _.remove(this.usersGrid, row);
-                this.permission.users.push(row);
-                this.usersGridOption.setGridData(this.usersGrid);
-*/
-        //    });
-    }
-
-    save() {
-//        this.permission.users = this.usersGrid;
-//        this.permission.groups = this.groupsGrid;
-        
-        this.permission.includePattern = this.permission.includePatternArray.join(',') || '';
-        this.permission.excludePattern = this.permission.excludePatternArray.join(',') || '';
-        
-        if (this.newPermission) {
-            this.permissionsDao.create(this.permission).$promise.then(()=> {
-                this.artifactoryModelSaver.save();
-                this.$state.go('^.permissions')
-            });
-        }
-        else {
-            this.permissionsDao.update(this.permission).$promise.then(()=> {
-                this.artifactoryModelSaver.save();
-                this.$state.go('^.permissions')
-            });
-        }
-    }
-
-    isDisableRepositories() {
-        return !this.user.isAdmin() && !this.newPermission;
-    }
-
-    isDisableManager(row) {
-        return row.principal === this.user.name;
-    }
-
-    _filterAvailableGroups() {
-        this.availableGroups = _.filter(this.allGroups,(group)=>{
-            return _.findWhere(this.permission.groups, {principal: group}) === undefined;
-        });
-    }
-    _filterAvailableUsers() {
-        this.availableUsers = _.filter(this.allUsers,(user)=>{
-            return _.findWhere(this.permission.users, {principal: user}) === undefined;
-        });
-    }
-
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/saml_integration/saml_integration.controller.js b/web/angular-web/src/main/webapp/app/states/admin/security/saml_integration/saml_integration.controller.js
deleted file mode 100644
index 8177ab8..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/saml_integration/saml_integration.controller.js
+++ /dev/null
@@ -1,39 +0,0 @@
-import EVENTS from '../../../../constants/artifacts_events.constants';
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-
-export class AdminSecuritySamlIntegrationController {
-
-    constructor(SamlDao, ArtifactoryModelSaver, ArtifactoryEventBus) {
-        this.samlDao = SamlDao.getInstance();
-        this.TOOLTIP = TOOLTIP.admin.security.SAMLSSOSettings;
-        this.artifactoryModelSaver = ArtifactoryModelSaver.createInstance(this,['saml']);
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this._init();
-    }
-
-    _init() {
-        this.samlDao.get().$promise.then((data) => {
-            this.saml = data;
-            if (!angular.isDefined(this.saml.noAutoUserCreation)) {
-                this.saml.noAutoUserCreation = true;
-            }
-            this.artifactoryModelSaver.save();
-        });
-    }
-
-    save() {
-        this.samlDao.update(this.saml).$promise.then(()=>{
-            this.artifactoryModelSaver.save();
-            this.artifactoryEventBus.dispatch(EVENTS.FOOTER_DATA_UPDATED);
-        });
-    }
-
-    cancel() {
-        this.artifactoryModelSaver.ask().then(()=>{
-            this._init();
-        });
-    }
-    canSave() {
-        return this.samlForm.$valid;
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/saml_integration/saml_integration.html b/web/angular-web/src/main/webapp/app/states/admin/security/saml_integration/saml_integration.html
deleted file mode 100644
index 6ff2563..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/saml_integration/saml_integration.html
+++ /dev/null
@@ -1,125 +0,0 @@
-<div class="content-layout-container">
-    <h1>SAML SSO Configuration</h1>
-
-    <div class="content-wrapper">
-        <form class="form" name="AdminSecuritySamlIntegration.samlForm" ng-submit="AdminSecuritySamlIntegration.save()" novalidate>
-            <div class="card stretch card-pole-pad card-side-pad">
-                <div class="content-with-footer">
-                    <jf-panel jf-panel-heading="SAML SSO Settings">
-                        <div class="form-group form-checkbox">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Enable SAML Integration">
-                                    <input type="checkbox"
-                                           id="enabled"
-                                           ng-model="AdminSecuritySamlIntegration.saml.enableIntegration">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field autofocus="true" validations="common">
-                                    <label for="host" class="mandatory">SAML Login URL</label>
-                                    <jf-help-tooltip html="AdminSecuritySamlIntegration.TOOLTIP.SAMLLoginURL"></jf-help-tooltip>
-                                    <input type="url"
-                                           class="input-text"
-                                           id="host"
-                                           name="loginUrl"
-                                           required
-                                           ng-model="AdminSecuritySamlIntegration.saml.loginUrl"
-                                           ng-disabled="!AdminSecuritySamlIntegration.saml.enableIntegration">
-                                </jf-field>
-
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="common">
-                                    <label for="username" class="mandatory">SAML Logout URL</label>
-                                    <jf-help-tooltip html="AdminSecuritySamlIntegration.TOOLTIP.SAMLLogoutURL"></jf-help-tooltip>
-                                    <input type="url"
-                                           class="input-text"
-                                           id="username"
-                                           name="logoutUrl"
-                                           required
-                                           ng-disabled="!AdminSecuritySamlIntegration.saml.enableIntegration"
-                                           ng-model="AdminSecuritySamlIntegration.saml.logoutUrl">
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="common">
-                                    <label for="provider" class="mandatory">SAML Service Provider Name</label>
-                                    <jf-help-tooltip html="AdminSecuritySamlIntegration.TOOLTIP.SAMLServiceProviderName"></jf-help-tooltip>
-                                    <input type="text"
-                                           class="input-text"
-                                           id="provider"
-                                           name="provider"
-                                           required
-                                           ng-disabled="!AdminSecuritySamlIntegration.saml.enableIntegration"
-                                           ng-model="AdminSecuritySamlIntegration.saml.serviceProviderName">
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field>
-                                    <label for="key">SAML Certificate</label>
-                                    <jf-help-tooltip html="AdminSecuritySamlIntegration.TOOLTIP.SAMLCertificate"></jf-help-tooltip>
-                                    <textarea class="input-text"
-                                              id="key"
-                                              rows="4"
-                                              cols="4"
-                                              ng-disabled="!AdminSecuritySamlIntegration.saml.enableIntegration"
-                                              ng-model="AdminSecuritySamlIntegration.saml.certificate">
-                                    </textarea>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group form-checkbox">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Auto Create Artifactory Users">
-                                    <input type="checkbox"
-                                           ng-disabled="!AdminSecuritySamlIntegration.saml.enableIntegration"
-                                           id="createArtifactory"
-                                           ng-model="AdminSecuritySamlIntegration.saml.noAutoUserCreation">
-                                </jf-checkbox>
-                                <jf-help-tooltip html="AdminSecuritySamlIntegration.TOOLTIP.autoCreateArtifactoryUsers"></jf-help-tooltip>
-                            </div>
-                        </div>
-                        <div class="form-group form-checkbox">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Allow Created Users Access To Profile Page">
-                                    <input type="checkbox"
-                                           ng-disabled="!AdminSecuritySamlIntegration.saml.enableIntegration"
-                                           id="allowUserToAccessProfile"
-                                           ng-model="AdminSecuritySamlIntegration.saml.allowUserToAccessProfile">
-                                </jf-checkbox>
-                                <jf-help-tooltip html="AdminSecuritySamlIntegration.TOOLTIP.allowUserToAccessProfile"></jf-help-tooltip>
-                            </div>
-                        </div>
-                        <div class="form-group form-checkbox">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Auto Redirect Login Link To SAML Login">
-                                    <input type="checkbox"
-                                           ng-disabled="!AdminSecuritySamlIntegration.saml.enableIntegration"
-                                           id="autoRedirect"
-                                           ng-model="AdminSecuritySamlIntegration.saml.autoRedirect">
-                                </jf-checkbox>
-                                <jf-help-tooltip html="AdminSecuritySamlIntegration.TOOLTIP.autoRedirect"></jf-help-tooltip>
-                            </div>
-                        </div>
-                    </jf-panel>
-                </div>
-            </div>
-            <div class="content-footer">
-                <div class="pull-right">
-                    <button class="btn btn-default" type="button" ng-click="AdminSecuritySamlIntegration.cancel()">
-                        Reset
-                    </button>
-                    <button class="btn btn-primary" ng-disabled="!AdminSecuritySamlIntegration.canSave()">Save</button>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/saml_integration/saml_integration.module.js b/web/angular-web/src/main/webapp/app/states/admin/security/saml_integration/saml_integration.module.js
deleted file mode 100644
index 60f3a3c..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/saml_integration/saml_integration.module.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import {AdminSecuritySamlIntegrationController} from './saml_integration.controller';
-
-function samlIntegrationConfig($stateProvider) {
-
-    $stateProvider
-            .state('admin.security.saml_integration', {
-                params: {feature: 'samlsso'},
-                url: '/saml_integration',
-                templateUrl: 'states/admin/security/saml_integration/saml_integration.html',
-                controller: 'AdminSecuritySamlIntegrationController as AdminSecuritySamlIntegration'
-            })
-}
-
-export default angular.module('security.saml_integration', [])
-        .config(samlIntegrationConfig)
-        .controller('AdminSecuritySamlIntegrationController', AdminSecuritySamlIntegrationController);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/security.controller.js b/web/angular-web/src/main/webapp/app/states/admin/security/security.controller.js
deleted file mode 100644
index da18e66..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/security.controller.js
+++ /dev/null
@@ -1,22 +0,0 @@
-export class AdminSecurityController {
-  constructor ($modal) {
-   this.userData=this.getUserGridData();
-      this.modal= $modal;
-  }
-
-    getUserGridData(){
-
-        return[
-            {"User Name": "System Info", "Realm": "admin.advanced.system_info", "Admin":true,"Last Login":"12/12/2015","Extrenal Realm Status":"bla bla"},
-            {"User Name": "System Info", "Realm": "admin.advanced.system_info", "Admin":true,"Last Login":"12/12/2015","Extrenal Realm Status":"bla bla"},
-            {"User Name": "System Info", "Realm": "admin.advanced.system_info", "Admin":true,"Last Login":"12/12/2015","Extrenal Realm Status":"bla bla"},
-            {"User Name": "System Info", "Realm": "admin.advanced.system_info", "Admin":true,"Last Login":"12/12/2015","Extrenal Realm Status":"bla bla"}
-
-        ]
-    }
-    addUser() {
-    this.modal.open({template:"<div>test test</div>"})
-        this.userData.push({});
-
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/security.module.js b/web/angular-web/src/main/webapp/app/states/admin/security/security.module.js
deleted file mode 100644
index abbb89b..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/security.module.js
+++ /dev/null
@@ -1,39 +0,0 @@
-import General           from './general/general.module';
-import Groups            from './groups/groups.module';
-import HttpSso           from './http_sso/http_sso.module';
-import SshServer         from './ssh_server/ssh_server.module';
-import Permissions       from './permissions/permissions.module';
-import Users             from './users/users.module';
-import Saml              from './saml_integration/saml_integration.module';
-import CrowdIntegration  from './crowd_integration/crowd_integration.module';
-import OAuth             from './oauth/oauth.module';
-import LdapSettings      from './ldap_settings/ldap_settings.module';
-import SigningKeys       from './signing_keys/signing_keys.module';
-
-import {AdminSecurityController} from './security.controller';
-
-function securityConfig($stateProvider) {
-    $stateProvider
-            .state('admin.security', {
-                url: '/security',
-                template: '<ui-view></ui-view>',
-                controller: 'AdminSecurityController as AdminSecurity'
-            })
-}
-
-
-export default angular.module('admin.security', [
-    General.name,
-    Groups.name,
-    HttpSso.name,
-    SshServer.name,
-    Permissions.name,
-    Users.name,
-    Saml.name,
-    CrowdIntegration.name,
-    OAuth.name,
-    LdapSettings.name,
-    SigningKeys.name
-])
-        .config(securityConfig)
-        .controller('AdminSecurityController', AdminSecurityController);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/signing_keys/signing_keys.controller.js b/web/angular-web/src/main/webapp/app/states/admin/security/signing_keys/signing_keys.controller.js
deleted file mode 100644
index 6c8fca6..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/signing_keys/signing_keys.controller.js
+++ /dev/null
@@ -1,212 +0,0 @@
-import EVENTS     from '../../../../constants/artifacts_events.constants';
-import API from '../../../../constants/api.constants';
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-
-export class SigningKeysController {
-
-    constructor($timeout, FileUploader, ArtifactoryEventBus, SigningKeysDao, KeystoreDao, ArtifactoryNotifications) {
-        this.$timeout = $timeout;
-        this.signingKeysDao = SigningKeysDao;
-        this.keystoreDao = KeystoreDao;
-        this.keyStore = {};
-        this.FileUploader = FileUploader;
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.TOOLTIP = TOOLTIP.admin.security.signingKeys;
-        this.publicKeyValue = 'No public key installed';
-        this.privateKeyValue = 'No private key installed';
-        this.initSigningKeys();
-    }
-
-    initSigningKeys() {
-
-        this.getSigningKeysData();
-        this.keyPairNames = [];
-        this.keystoreFileUploaded = false;
-        this.getKeyStoreData();
-        //-----public key-----//
-        this.uploaderPublicKey = new this.FileUploader();
-        this.uploaderPublicKey.onSuccessItem = this.onUploadPublicKeySuccess.bind(this);
-        this.uploaderPublicKey.onErrorItem = this.onUploadPublicKeyFail.bind(this);
-        this.uploaderPublicKey.url = `${API.API_URL}/signingkeys/install?public=true`;
-        this.uploaderPublicKey.removeAfterUpload = true;
-        //-----private key-----//
-        this.uploaderPrivateKey = new this.FileUploader();
-        this.uploaderPrivateKey.url = `${API.API_URL}/signingkeys/install?public=false`;
-        this.uploaderPrivateKey.onSuccessItem = this.onUploadPrivateKeySuccess.bind(this);
-        this.uploaderPrivateKey.onErrorItem = this.onUploadPrivateKeyFail.bind(this);
-        this.uploaderPrivateKey.removeAfterUpload = true;
-        //------key pair-----//
-        this.uploaderKeyStore = new this.FileUploader();
-        this.uploaderKeyStore.onSuccessItem = this.onUploadKeyStoreSuccess.bind(this);
-        this.uploaderKeyStore.onErrorItem = this.onUploadKeyStoreFail.bind(this);
-        this.uploaderKeyStore.url = `${API.API_URL}/keystore/upload?pass=`;
-        this.uploaderKeyStore.removeAfterUpload = true;
-    }
-
-    getSigningKeysData() {
-        this.signingKeysDao.get().$promise.then((result) => {
-            this.publicKeyInstalled = result.publicKeyInstalled;
-            this.privateKeyInstalled = result.privateKeyInstalled;
-            this.publicKeyValue = result.publicKeyInstalled ? 'Public key is installed' : 'No public key installed';
-            this.privateKeyValue = result.privateKeyInstalled ? 'Private key is installed' : 'No private key installed';
-            this.publicKeyLink = result.publicKeyLink;
-            this.passPhrase = result.passPhrase;
-        });
-    }
-
-    getKeyStoreData() {
-        this.keystoreDao.get().$promise.then((keyStore) => {
-            this.keyStoreExist = keyStore.keyStoreExist;
-            _.map(keyStore.keyStorePairNames, (keypairName) => {
-                this.keyPairNames.push(keypairName);
-            })
-        });
-    }
-
-    onUploadPublicKeySuccess(fileDetails, response) {
-        this.getSigningKeysData();
-        this.artifactoryNotifications.create(response.feedbackMsg);
-    }
-
-    onUploadPrivateKeySuccess(fileDetails, response) {
-        this.getSigningKeysData();
-        this.artifactoryNotifications.create(response.feedbackMsg);
-    }
-
-    onUploadPublicKeyFail(fileDetails, response) {
-        this.artifactoryNotifications.create(response);
-    }
-    onUploadPrivateKeyFail(fileDetails, response) {
-        this.artifactoryNotifications.create(response);
-    }
-
-    upload(type) {
-        if (type === 'public') {
-            this.uploaderPublicKey.queue[0].upload();
-        }
-        if (type === 'private') {
-            this.uploaderPrivateKey.queue[0].upload();
-        }
-        if (type === 'keyStore') {
-            this.uploaderKeyStore.queue[0].url = `${API.API_URL}/keystore/upload?pass=${this.keyPair.keyStorePassword}`;
-            this.uploaderKeyStore.queue[0].upload();
-        }
-    }
-
-    removeKey(isPublic) {
-        this.signingKeysDao.delete({public: isPublic}).$promise.then((result) => this.getSigningKeysData());
-    }
-
-    verifyPhrase(shouldNotify = true) {
-        //this.signingKeysDao.setNotification('post', shouldNotify);
-        let method = shouldNotify ? 'post' : 'postWithoutNotifications';
-        if (this.signingKeysDao[method])
-            return this.signingKeysDao[method]({action: 'verify', passPhrase: this.passPhrase}).$promise;
-    }
-
-    updatePhrase() {
-        let verifyPromise = this.verifyPhrase(false);
-        if (verifyPromise) {
-            verifyPromise
-                .then(() => {
-                    this.signingKeysDao.put({action: 'update', passPhrase: this.passPhrase});
-                })
-                .catch((response) => this.artifactoryNotifications.create(response.data));
-            ;
-        }
-    }
-
-    checkMatchingPasswords() {
-        this.$timeout(() => {
-            if (this.signingKeysForm.password.$valid && this.signingKeysForm.repeatPassword.$valid) {
-                this.artifactoryEventBus.dispatch(EVENTS.FORM_CLEAR_FIELD_VALIDATION);
-            }
-        });
-    }
-
-    updatePassword() {
-        this.keystoreDao.updatePassword({action: 'updatePass'}, {password: this.user.password}).$promise
-            .then(() => {
-                this.keyStoreExist = true;
-            });
-    }
-
-    removeKeyStore() {
-        this.keystoreDao.removeKeystore({action: 'password'}).$promise
-            .then(() => {
-                //_.forEach(this.keyPairNames, this.removeKeypair, this);
-                this.keyStoreExist = false;
-                this.keyPairNames = [];
-                this.keyPairName = '';
-                this.user.password = '';
-                this.repeatPassword = '';
-            })
-    }
-
-    onUploadKeyStoreSuccess(fileDetails, keyStore) {
-        this.keystoreFileUploaded = true;
-        this.keyStore = keyStore;
-        this.alias = keyStore.alias;
-        this.keyPair.keyStorePassword = '';
-        this.artifactoryNotifications.create(keyStore.feedbackMsg);
-    }
-
-    onUploadKeyStoreFail(fileDetails, response) {
-        this.artifactoryNotifications.create(response);
-    }
-
-    saveKeypair() {
-        this.keystoreDao.save({action: 'add'}, this.keyStore).$promise
-            .then((response) => {
-                this.keyPairNames.push(this.keyStore.keyPairName);
-                this.keyStore.keyPairName = '';
-                this.keyStore.privateKeyPassword = '';
-                this.alias = '';
-                this.aliases = [];
-            });
-        //.finally(() => this.keystoreFileUploaded = false);
-    }
-
-;
-
-    removeKeypair() {
-        this.keystoreDao.removeKeypair({name: this.keyPairName}).$promise.then((response) => {
-            _.pull(this.keyPairNames, this.keyPairName);
-            this.keyPairName = '';
-        }).catch((response) => {
-            if (response.error) {
-                let keyPairNames = _.words(response.error);
-                _.pull(this.keyPairNames, keyPairNames.pop());
-            }
-        });
-    }
-
-    cancelKeypairUpload() {
-        //this.keystoreFileUploaded = false;
-        this.keyStore.keyPairName = '';
-        this.keyStore.privateKeyPassword = '';
-    }
-
-    canUpdatePassword() {
-        return this.signingKeysForm.password.$valid && this.signingKeysForm.repeatPassword.$valid;
-    }
-
-    canUploadKeystore() {
-        return this.keyStoreExist &&
-            this.signingKeysForm.keyStorePassword.$valid &&
-            this.uploaderKeyStore.queue.length;
-    }
-
-    canUploadDebianKey(uploader) {
-        return this[uploader].queue.length;
-    }
-
-    canRemoveKeyPairs() {
-        return this.keyStoreExist && this.keyPairNames.length && this.keyPairName;
-    }
-
-    canUpdatePhrase() {
-        return this.publicKeyInstalled && this.privateKeyInstalled && this.passPhrase;
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/signing_keys/signing_keys.html b/web/angular-web/src/main/webapp/app/states/admin/security/signing_keys/signing_keys.html
deleted file mode 100644
index 95892e6..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/signing_keys/signing_keys.html
+++ /dev/null
@@ -1,246 +0,0 @@
-<div class="content-layout-container signing-keys">
-    <h1>Signing Keys Management</h1>
-
-    <div class="content-wrapper">
-        <form name="SigningKeys.signingKeysForm" class="form" novalidate>
-            <div class="card stretch card-pole-pad card-side-pad">
-                <jf-panel jf-panel-heading="Manage Debian Signing Keys">
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <div class="available-key">
-                                <span>Public key</span> : <span class="debian-value"
-                                                                ng-if="!SigningKeys.publicKeyInstalled">{{SigningKeys.publicKeyValue}}</span>
-                                <span  class="key-installed"
-                                       ng-if="SigningKeys.publicKeyInstalled">{{SigningKeys.publicKeyValue}}
-                                       <a href="{{SigningKeys.publicKeyLink}}"
-                                          class="default-link icon icon-download"
-                                          jf-tooltip="Download Key"
-                                          class="debian-value"></a>
-                                </span> 
-                                <a href=""
-                                   ng-click="SigningKeys.removeKey(true)"
-                                   class="default-link icon icon-clear"
-                                   ng-if="SigningKeys.publicKeyInstalled">
-                                </a>
-                            </div>
-                        </div>
-                    </div>
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-file-drop jf-file-uploader="SigningKeys.uploaderPublicKey"></jf-file-drop>
-                        </div>
-                        <div class="form-group-cell">
-                            <button class="btn btn-primary upload-button"
-                                    ng-click="SigningKeys.upload('public')"
-                                    ng-disabled="!SigningKeys.canUploadDebianKey('uploaderPublicKey')">
-                                Upload
-                            </button>
-                        </div>
-                    </div>
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <span>Private key :</span> 
-                            <span class="debian-value"
-                                  ng-class="{'key-installed': SigningKeys.privateKeyInstalled}">{{SigningKeys.privateKeyValue}}</span>
-                            <a href=""
-                               ng-click="SigningKeys.removeKey(false)"
-                               class="default-link icon icon-clear"
-                               ng-if="SigningKeys.privateKeyInstalled">
-                            </a>
-                        </div>
-                    </div>
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-file-drop jf-file-uploader="SigningKeys.uploaderPrivateKey"></jf-file-drop>
-                        </div>
-                        <div class="form-group-cell">
-                            <button class="btn btn-primary upload-button"
-                                    ng-click="SigningKeys.upload('private')"
-                                    ng-disabled="!SigningKeys.canUploadDebianKey('uploaderPrivateKey')">
-                                Upload
-                            </button>
-                        </div>
-                    </div>
-
-
-                    <jf-panel jf-panel-heading="Pass Phrase">
-
-                        <!-- prevent auto complete -->
-                        <input type="password" class="hidden"/>
-
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <label>Pass-phrase</label>
-                                <jf-help-tooltip html="SigningKeys.TOOLTIP.passPhrase"></jf-help-tooltip>
-                                <input type="password"
-                                       ng-model="SigningKeys.passPhrase"
-                                       class="input-text"/>
-                            </div>
-
-                            <div class="form-group-cell form-button">
-                                <button class="btn btn-secondary "
-                                        ng-disabled="!SigningKeys.canUpdatePhrase()"
-                                        ng-click="SigningKeys.verifyPhrase()">
-                                    Verify
-                                </button>
-                                <button class="btn btn-primary "
-                                        ng-click="SigningKeys.updatePhrase()"
-                                        ng-disabled="!SigningKeys.canUpdatePhrase()"
-                                >Save
-                                </button>
-                            </div>
-
-                        </div>
-                    </jf-panel>
-                </jf-panel>
-
-                <jf-panel jf-panel-heading="Manage Artifactory Signing Keys">
-                    <jf-panel jf-panel-heading="Change Key Store Password">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="singingKeys">
-                                    <label class="mandatory">Password</label>
-                                    <input name="password"
-                                           type="password"
-                                           ng-model="SigningKeys.user.password"
-                                           ng-blur="SigningKeys.checkMatchingPasswords()"
-                                           ng-model-options="{updateOn: 'blur'}"
-                                           required
-                                           ng-minlength="4"
-                                           class="input-text"
-                                           id="password">
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell">
-                                <jf-field validations="users">
-                                    <label class="mandatory">Retype Password</label>
-                                    <input name="repeatPassword"
-                                           type="password"
-                                           ui-validate="'$value==SigningKeys.user.password'"
-                                           ui-validate-watch="'SigningKeys.user.password'"
-                                           ng-model="SigningKeys.repeatPassword"
-                                           required
-                                           class="input-text"
-                                           id="repeatpassword">
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell form-button">
-                                <button class="btn btn-secondary"
-                                        ng-if="SigningKeys.keyStoreExist"
-                                        ng-click="SigningKeys.removeKeyStore()"
-                                        ng-disabled="!SigningKeys.keyStoreExist"
-                                >
-                                    Remove
-                                </button>
-                                <button class="btn btn-primary"
-                                        ng-click="SigningKeys.updatePassword()"
-                                        ng-disabled="!SigningKeys.canUpdatePassword()">
-                                    {{SigningKeys.keyStoreExist ? 'Update' : 'Create'}}
-                                </button>
-                            </div>
-                        </div>
-                    </jf-panel>
-
-                    <jf-panel jf-panel-heading="Add Key-Store">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <label class="mandatory">Key-Store</label>
-                                <jf-file-drop jf-file-uploader="SigningKeys.uploaderKeyStore"
-                                              ng-disabled="!SigningKeys.keyStoreExist"></jf-file-drop>
-                            </div>
-                            <div class="form-group-cell">
-                                <!-- prevent auto complete -->
-                                <input type="password" class="hidden"/>
-
-                                <jf-field validations="signingKeys">
-                                    <label class="mandatory">Key-Store Password</label>
-                                    <input name="keyStorePassword"
-                                           type="password"
-                                           ng-disabled="!SigningKeys.keyStoreExist"
-                                           ng-model="SigningKeys.keyPair.keyStorePassword"
-                                           required
-                                           class="input-text">
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell form-button">
-                                <button class="btn btn-primary upload-button"
-                                        type="button"
-                                        ng-click="SigningKeys.upload('keyStore')"
-                                        ng-disabled="!SigningKeys.canUploadKeystore()">
-                                    Unlock
-                                </button>
-                            </div>
-                        </div>
-                    </jf-panel>
-                    <jf-panel jf-panel-heading="Add Key-Pair">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field>
-                                    <label class="mandatory" for="keyPairName">Key-Pair Name</label>
-                                    <input id="keyPairName" type="text" class="input-text"
-                                           ng-model="SigningKeys.keyStore.keyPairName"
-                                           ng-disabled="!SigningKeys.keyStoreExist || !SigningKeys.keystoreFileUploaded"
-                                           jf-select-disabled="!SigningKeys.keyStoreExist || !SigningKeys.keystoreFileUploaded"/>
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell">
-                                <label class="mandatory">Key-Pair Alias Name</label>
-                                <!--<input type="text" class="input-text" disabled ng-model="SigningKeys.alias"/>-->
-                                <jf-ui-select jf-select-model="SigningKeys.alias"
-                                              jf-select-options="SigningKeys.aliases"
-                                              jf-select-disabled="!SigningKeys.keyStoreExist || !SigningKeys.keystoreFileUploaded"
-                                              ng-model="SigningKeys.keyStore.keyPairName">
-                                </jf-ui-select>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field>
-                                    <label class="mandatory" for="privateKeyPassword">Private Key Password</label>
-                                    <input id="privateKeyPassword"
-                                           class="input-text"
-                                           ng-disabled="!SigningKeys.keyStoreExist || !SigningKeys.keystoreFileUploaded"
-                                           ng-model="SigningKeys.keyStore.privateKeyPassword"
-                                           type="password"/>
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell"></div>
-                            <div class="form-group-cell form-button">
-                                <button class="btn btn-secondary"
-                                        type="button"
-                                        ng-click="SigningKeys.cancelKeypairUpload()"
-                                        ng-disabled="!SigningKeys.keyStoreExist || !SigningKeys.keystoreFileUploaded">
-                                    Cancel
-                                </button>
-                                <button class="btn btn-primary"
-                                        type="button"
-                                        ng-click="SigningKeys.saveKeypair()"
-                                        ng-disabled="!SigningKeys.keyStoreExist">
-                                    Save Keypair
-                                </button>
-                            </div>
-                        </div>
-                    </jf-panel>
-                    <jf-panel ng-disabled="true" jf-panel-heading="Remove Key-Pair">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <label>Choose a Key-Pair to Remove</label>
-                                <jf-ui-select jf-select-model="SigningKeys.keyPairName"
-                                              jf-select-options="SigningKeys.keyPairNames"
-                                              jf-select-disabled="SigningKeys.keyPairNames.length == 0">
-                                </jf-ui-select>
-                            </div>
-                            <div class="form-group-cell form-button auto-width">
-                                <button class="btn btn-primary"
-                                        ng-click="SigningKeys.removeKeypair()"
-                                        ng-disabled="!SigningKeys.canRemoveKeyPairs()">
-                                    Remove
-                                </button>
-                            </div>
-                        </div>
-                    </jf-panel>
-                </jf-panel>
-            </div>
-        </form>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/signing_keys/signing_keys.module.js b/web/angular-web/src/main/webapp/app/states/admin/security/signing_keys/signing_keys.module.js
deleted file mode 100644
index bd96d6b..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/signing_keys/signing_keys.module.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import {SigningKeysController} from './signing_keys.controller';
-
-function signingKeysConfig($stateProvider) {
-
-    $stateProvider
-            .state('admin.security.signing_keys', {
-                params: {feature: 'signingkeys'},
-                url: '/signing_keys',
-                templateUrl: 'states/admin/security/signing_keys/signing_keys.html',
-                controller: 'SigningKeysController as SigningKeys'
-            })
-}
-
-export default angular.module('security.signing_keys', [])
-        .config(signingKeysConfig)
-        .controller('SigningKeysController', SigningKeysController);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/ssh_server/ssh_server.controller.js b/web/angular-web/src/main/webapp/app/states/admin/security/ssh_server/ssh_server.controller.js
deleted file mode 100644
index 132aa0e..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/ssh_server/ssh_server.controller.js
+++ /dev/null
@@ -1,133 +0,0 @@
-import EVENTS     from '../../../../constants/common_events.constants';
-import API from '../../../../constants/api.constants';
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-
-export class AdminSecuritySshServerController {
-
-    constructor($timeout, $scope, $state, FileUploader, SshServerDao,ArtifactoryEventBus,ArtifactoryModelSaver, ArtifactoryNotifications, ArtifactoryModal) {
-        this.$timeout = $timeout;
-        this.$scope = $scope;
-        this.$state = $state;
-        this.FileUploader = FileUploader;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this.SshServerDao = SshServerDao.getInstance();
-        this.TOOLTIP = TOOLTIP.admin.security.SSHSERVER;
-        this.modal = ArtifactoryModal;
-        this.artifactoryModelSaver = ArtifactoryModelSaver.createInstance(this,['sshServer']);
-        this.publicKeyValue = 'No public key installed';
-        this.privateKeyValue = 'No private key installed';
-        this.NO_VALUE_STRING = '** NO VALUE **';
-        this.getSshData();
-        this.initKeys();
-    }
-
-    initKeys() {
-        this.uploaderPublicKey = new this.FileUploader();
-        this.uploaderPublicKey.onSuccessItem = this.onUploadPublicKeySuccess.bind(this);
-        this.uploaderPublicKey.url = `${API.API_URL}/sshserver/install?public=true`;
-        this.uploaderPublicKey.removeAfterUpload = true;
-        this.uploaderPrivateKey = new this.FileUploader();
-        this.uploaderPrivateKey.url = `${API.API_URL}/sshserver/install?public=false`;
-        this.uploaderPrivateKey.onSuccessItem = this.onUploadPrivateKeySuccess.bind(this);
-        this.uploaderPrivateKey.removeAfterUpload = true;
-    }
-
-    getSshData(updateKeysStateOnly = false) {
-        this.SshServerDao.get().$promise.then((sshServer)=> {
-            if (!updateKeysStateOnly) this.sshServer = sshServer;
-            this.publicKeyInstalled = sshServer.serverKey && sshServer.serverKey.publicKeyInstalled;
-            this.privateKeyInstalled = sshServer.serverKey && sshServer.serverKey.privateKeyInstalled;
-            this.publicKeyValue = this.publicKeyInstalled ? 'Public key is installed' : 'No public key installed';
-            this.privateKeyValue = this.privateKeyInstalled ? 'Private key is installed' : 'No private key installed';
-            this.publicKeyLink = sshServer.serverKey ? sshServer.serverKey.publicKeyLink : undefined;
-            this.passPhrase = sshServer.serverKey ? sshServer.serverKey.passPhrase : undefined;
-            this.sshServer.customUrlBase = this.sshServer.customUrlBase || this.NO_VALUE_STRING;
-            if (!updateKeysStateOnly) this.artifactoryModelSaver.save();
-            this.artifactoryEventBus.dispatch(EVENTS.FORM_CLEAR_FIELD_VALIDATION, true);
-        });
-    }
-
-    reset() {
-        this.artifactoryModelSaver.ask().then(()=>{
-            this.getSshData();
-        });
-    }
-    save() {
-        if (this.sshServer.enableSshServer && this.sshServer.customUrlBase === this.NO_VALUE_STRING) {
-            this._showUrlBaseAlert().then((gotoGenConf)=>{
-                if (gotoGenConf) {
-                    this.SshServerDao.update(this.sshServer).$promise.then(()=> {
-                        this.artifactoryModelSaver.save();
-                        this.$state.go('admin.configuration.general', {focusOnBaseUrl: true});
-                    });
-                }
-                else {
-                    this.SshServerDao.update(this.sshServer).$promise.then(()=>{
-                        this.artifactoryModelSaver.save();
-                    });
-                }
-            });
-        }
-        else {
-            this.SshServerDao.update(this.sshServer).$promise.then(()=>{
-                this.artifactoryModelSaver.save();
-            });
-        }
-    }
-
-    _showUrlBaseAlert() {
-        let modalScope = this.$scope.$new();
-        modalScope.context='ssh';
-        return this.modal.launchModal('base_url_alert_modal', modalScope, 'md').result;
-    }
-
-    onUploadPublicKeySuccess(fileDetails, response) {
-        this.getSshData(true);
-        this.artifactoryNotifications.create(response.feedbackMsg);
-    }
-
-    onUploadPrivateKeySuccess(fileDetails, response) {
-        this.getSshData(true);
-        this.artifactoryNotifications.create(response.feedbackMsg);
-    }
-
-    upload(type) {
-        if (type === 'public') {
-            this.uploaderPublicKey.queue[0].upload();
-        }
-        if (type === 'private') {
-            this.uploaderPrivateKey.queue[0].upload();
-        }
-    }
-
-    removeKey(isPublic) {
-        this.SshServerDao.delete({public: isPublic}).$promise.then((result) => this.getSshData(true));
-    }
-
-    verifyPhrase(shouldNotify = true) {
-        let method = shouldNotify ? 'post' : 'postWithoutNotifications';
-        if (this.SshServerDao[method])
-            return this.SshServerDao[method]({action: 'verify', passPhrase: this.passPhrase}).$promise;
-    }
-
-    updatePhrase() {
-        let verifyPromise = this.verifyPhrase(false);
-        if (verifyPromise) {
-            verifyPromise
-                    .then(() => {
-                this.SshServerDao.put({action: 'update', passPhrase: this.passPhrase});
-        })
-        .catch((response) => this.artifactoryNotifications.create(response.data));
-            ;
-        }
-    }
-
-    canUploadSshKey(uploader) {
-        return this[uploader].queue.length;
-    }
-
-    canUpdatePhrase() {
-        return this.publicKeyInstalled && this.privateKeyInstalled && this.passPhrase;
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/ssh_server/ssh_server.html b/web/angular-web/src/main/webapp/app/states/admin/security/ssh_server/ssh_server.html
deleted file mode 100644
index 184bf40..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/ssh_server/ssh_server.html
+++ /dev/null
@@ -1,123 +0,0 @@
-<div class="content-layout-container">
-    <h1>SSH Server Configuration</h1>
-
-    <div class="content-wrapper">
-        <form class="form" name="adminSshForm" novalidate>
-            <div class="card stretch card-pole-pad card-side-pad">
-                <div class="content-with-footer">
-                    <jf-panel jf-panel-heading="SSH Server Settings">
-                        <div class="form-group form-checkbox">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Enable SSH Authentication">
-                                    <input type="checkbox"
-                                           id="enableSshServer"
-                                           ng-model="AdminSecuritySshServer.sshServer.enableSshServer">
-                                </jf-checkbox>
-                                <!--<jf-help-tooltip html="AdminSecuritySshServer.TOOLTIP.enableSshServer"></jf-help-tooltip>-->
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="sshServer" autofocus="true">
-                                    <label class="mandatory" for="sshServerPort">Port</label>
-                                    <!--<jf-help-tooltip html="AdminSecuritySshServer.TOOLTIP.sshServerPort"></jf-help-tooltip>-->
-                                    <input name="sshServerPort"
-                                           id="sshServerPort"
-                                           type="number"
-                                           required
-                                           ng-disabled="!AdminSecuritySshServer.sshServer.enableSshServer"
-                                           ng-model="AdminSecuritySshServer.sshServer.sshServerPort"
-                                           class="input-text">
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell">
-                                <jf-field validations="sshServer">
-                                    <label for="customUrl">Custom URL Base</label>
-                                    <jf-help-tooltip html="AdminSecuritySshServer.TOOLTIP.customURLBase"></jf-help-tooltip>
-                                    <input type="text"
-                                           class="input-text disabled-look"
-                                           name="customUrl"
-                                           id="customUrl"
-                                           readonly
-                                           ng-model="AdminSecuritySshServer.sshServer.customUrlBase"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                    </jf-panel>
-                    <jf-panel jf-panel-heading="Server Keys">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <div class="available-key">
-                                    <span>Public key</span> : <span class="debian-value"
-                                                                    ng-if="!AdminSecuritySshServer.publicKeyInstalled">{{AdminSecuritySshServer.publicKeyValue}}</span>
-                                    <span class="key-installed"
-                                          ng-if="AdminSecuritySshServer.publicKeyInstalled">{{AdminSecuritySshServer.publicKeyValue}} 
-                                        <a href="{{AdminSecuritySshServer.publicKeyLink}}"
-                                           class="default-link icon icon-download"
-                                           jf-tooltip="Download Key"
-                                           class="debian-value"></a>
-                                    </span> 
-                                    <a href=""
-                                       ng-click="AdminSecuritySshServer.removeKey(true)"
-                                       class="default-link icon icon-clear"
-                                       ng-if="AdminSecuritySshServer.publicKeyInstalled">
-                                    </a>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-file-drop jf-file-uploader="AdminSecuritySshServer.uploaderPublicKey"></jf-file-drop>
-                            </div>
-                            <div class="form-group-cell">
-                                <button class="btn btn-primary upload-button"
-                                        ng-click="AdminSecuritySshServer.upload('public')"
-                                        ng-disabled="!AdminSecuritySshServer.canUploadSshKey('uploaderPublicKey')">
-                                    Upload
-                                </button>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <span>Private key :</span> 
-                                <span class="debian-value"
-                                      ng-class="{'key-installed': AdminSecuritySshServer.privateKeyInstalled}">{{AdminSecuritySshServer.privateKeyValue}}</span> 
-                                <a href=""
-                                   ng-click="AdminSecuritySshServer.removeKey(false)"
-                                   class="default-link icon icon-clear"
-                                   ng-if="AdminSecuritySshServer.privateKeyInstalled">
-                                </a>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-file-drop jf-file-uploader="AdminSecuritySshServer.uploaderPrivateKey"></jf-file-drop>
-                            </div>
-                            <div class="form-group-cell">
-                                <button class="btn btn-primary upload-button"
-                                        ng-click="AdminSecuritySshServer.upload('private')"
-                                        ng-disabled="!AdminSecuritySshServer.canUploadSshKey('uploaderPrivateKey')">
-                                    Upload
-                                </button>
-                            </div>
-                        </div>
-                    </jf-panel>
-                </div>
-            </div>
-
-            <div class="content-footer">
-                <div class="pull-right">
-                    <button class="btn btn-default"
-                            type="button"
-                            ng-click="AdminSecuritySshServer.reset()">
-                        Reset
-                    </button>
-                    <button type="button"
-                            class="btn btn-primary"
-                            ng-click="AdminSecuritySshServer.save()"
-                            ng-disabled="!adminSshForm.$valid">Save</button>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/ssh_server/ssh_server.module.js b/web/angular-web/src/main/webapp/app/states/admin/security/ssh_server/ssh_server.module.js
deleted file mode 100644
index 0a5c7b0..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/ssh_server/ssh_server.module.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import {AdminSecuritySshServerController} from './ssh_server.controller.js';
-
-function sshServerConfig($stateProvider) {
-
-    $stateProvider
-            .state('admin.security.ssh_server', {
-                params: {feature: 'SSHSERVER'},
-                url: '/ssh_server',
-                templateUrl: 'states/admin/security/ssh_server/ssh_server.html',
-                controller: 'AdminSecuritySshServerController as AdminSecuritySshServer'
-            })
-}
-
-export default angular.module('security.ssh_server', [])
-        .config(sshServerConfig)
-        .controller('AdminSecuritySshServerController', AdminSecuritySshServerController);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/users/user_form.controller.js b/web/angular-web/src/main/webapp/app/states/admin/security/users/user_form.controller.js
deleted file mode 100644
index 5981959..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/users/user_form.controller.js
+++ /dev/null
@@ -1,418 +0,0 @@
-import ACTIONS from '../../../../constants/user_actions.constants';
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-
-export class AdminSecurityUserFormController {
-    constructor($scope, $state, $stateParams, $timeout, $q, ArtifactoryGridFactory, UserDao, GroupsDao, GroupPermissionsDao, AdminSecurityGeneralDao, User,
-            uiGridConstants, commonGridColumns, ArtifactoryModelSaver, RepositoriesDao, UserProfileDao, ArtifactoryModal, ArtifactoryNotifications) {
-
-        this.$scope = $scope;
-        this.$state = $state;
-        this.$stateParams = $stateParams;
-        this.$timeout = $timeout;
-        this.$q = $q;
-        this.User = User;
-        this.repositoriesDao = RepositoriesDao;
-        this.adminSecurityGeneralDao = AdminSecurityGeneralDao;
-        this.modal = ArtifactoryModal;
-        this.userDao = UserDao.getInstance();
-        this.groupsDao = GroupsDao.getInstance();
-        this.groupPermissionsDao = GroupPermissionsDao.getInstance();
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.artifactoryModelSaver = ArtifactoryModelSaver.createInstance(this,['userdata','input'],['locked']);
-        this.permissionsGridOptions = {};
-        this.userProfileDao = UserProfileDao;
-        this.uiGridConstants = uiGridConstants;
-        this.commonGridColumns = commonGridColumns;
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this.TOOLTIP = TOOLTIP.admin.security.usersForm;
-        this.input = {};
-
-        this._getPasswordExpirationState();
-
-        if ($stateParams.username) {
-            this.mode = 'edit';
-            this.username = $stateParams.username;
-            this.title = 'Edit ' + this.username + ' User';
-            this._getUserData();
-            this._getUserPermissions();
-        }
-        else {
-            this.mode = 'create';
-            this.title = 'Add New User';
-            this.userdata = {
-                groups: [],
-                profileUpdatable: true
-            };
-            this.userPermissions = [];
-        }
-
-        this._createGrid();
-
-        this._getAllRepos();
-        this._getAllGroups();
-        this._getGroupsPermissions();
-    }
-
-    _getAllRepos() {
-        this.reposData = {};
-        this.repositoriesDao.getRepositories({type:'local'}).$promise
-                .then((data) => {
-                    this.reposData.locals = _.map(data,(r)=>{return r.repoKey;});
-                });
-        this.repositoriesDao.getRepositories({type:'remote'}).$promise
-                .then((data) => {
-                    this.reposData.remotes = _.map(data,(r)=>{return r.repoKey;});
-                });
-    }
-
-    _createGrid() {
-        this.permissionsGridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-            .setColumns(this._getPermissionCloumns())
-            .setRowTemplate('default');
-
-    }
-
-    _getAllGroups() {
-        this.groupsDao.getAll().$promise.then((data)=> {
-            this.groupsData = data;
-            this.groupsList = _.map(this.groupsData, (group)=> {
-                if (group.autoJoin && this.mode === 'create') {
-                    this.userdata.groups.push(group.groupName);
-                    this.artifactoryModelSaver.save();
-                }
-                return group.groupName;
-            });
-            if (this.mode === 'create') this._getGroupsPermissions();
-        });
-    }
-
-
-    _getUserPermissions() {
-        this.userDao.getPermissions({userOnly: true}, {name: this.username}).$promise.then((data)=> {
-            /*
-            let filteredData = _.filter(data, (perm) => {
-                return perm.effectivePermission.principal === this.username;
-            });
-             */
-            this.userPermissions = data;//filteredData;
-            if (this.groupsPermissions) this._setGridData();
-        });
-    }
-
-    _getGroupsPermissions() {
-        if (!this.userdata) return;
-        if (!this.userdata.groups || !this.userdata.groups.length) {
-            this.groupsPermissions = [];
-            if (this.mode==='create') this.permissionsGridOptions.setGridData(this.groupsPermissions);
-            else if (this.userPermissions) this._setGridData();
-            return;
-        }
-        this.groupPermissionsDao.get({groups: this.userdata.groups}).$promise.then((data)=> {
-            this.groupsPermissions = data;
-            if (this.mode==='create') this.permissionsGridOptions.setGridData(this.groupsPermissions);
-            else if (this.userPermissions) this._setGridData();
-        });
-    }
-
-    _setGridData() {
-        let data = angular.copy(this.groupsPermissions);
-        data = data.concat(this.userPermissions);
-        this._fixDataFormat(data).then((fixedData)=>{
-            this.permissionsGridOptions.setGridData(fixedData);
-        });
-    }
-
-    _fixDataFormat(data,defer = null) {
-        let defer = defer || this.$q.defer();
-        if (this.reposData.locals && this.reposData.remotes) {
-            data.forEach((record)=>{
-                if (record.repoKeys.length === 1 && record.repoKeys[0] === 'ANY LOCAL') {
-                    record.repoKeysView = 'ANY LOCAL';
-                    record.reposList = angular.copy(this.reposData.locals);
-                }
-                else if (record.repoKeys.length === 1 && record.repoKeys[0] === 'ANY REMOTE') {
-                    record.repoKeysView = 'ANY REMOTE';
-                    record.reposList = angular.copy(this.reposData.remotes);
-                }
-                else if (record.repoKeys.length === 1 && record.repoKeys[0] === 'ANY') {
-                    record.repoKeysView = 'ANY';
-                    record.reposList = angular.copy(this.reposData.remotes).concat(this.reposData.locals);
-                }
-                else {
-                    record.repoKeysView = record.repoKeys.join(', ');
-                    record.reposList = angular.copy(record.repoKeys);
-                }
-            });
-            defer.resolve(data);
-        }
-        else {
-            this.$timeout(()=>{
-                this._fixDataFormat(data,defer);
-            })
-        }
-        return defer.promise;
-    }
-
-    _getUserData() {
-
-        this.userDao.getSingle({name: this.username}).$promise.then((data) => {
-            //console.log(data);
-            this.userdata = data;
-            if (data.internalPasswordDisabled) this.passwordOriginalyDisabled = true;
-            if (!this.userdata.groups) this.userdata.groups = [];
-            this.artifactoryModelSaver.save();
-            this._getGroupsPermissions();
-        });
-        this._getApiKeyState();
-    }
-
-    _getApiKeyState() {
-        this.userProfileDao.getApiKey({},{username: this.username}).$promise.then((res)=>{
-            this.apiKeyExist = !!res.apiKey;
-        });
-    }
-
-    _fixGroups(userdata) {
-        let groups = userdata.groups;
-        let groupsObjects = [];
-        groups.forEach((group)=> {
-            let realm = _.findWhere(this.groupsData, {groupName: group}).realm;
-            groupsObjects.push({groupName: group, realm: realm});
-        });
-        delete(userdata.groups);
-        userdata.userGroups = groupsObjects;
-    }
-
-    updateUser() {
-        let payload = angular.copy(this.userdata);
-        _.extend(payload, this.input);
-        this._fixGroups(payload);
-        this.userDao.update({name: this.userdata.name}, payload).$promise.then((data) => {
-            if (this.userdata.name === this.User.currentUser.name) this.User.reload();
-            this.artifactoryModelSaver.save();
-            this.$state.go('^.users');
-        });
-    }
-
-    createNewUser() {
-        let payload = angular.copy(this.userdata);
-        _.extend(payload, this.input);
-        this._fixGroups(payload);
-        this.userDao.create(payload).$promise.then((data) => {
-            this.artifactoryModelSaver.save();
-            this.$state.go('^.users');
-        });
-    }
-
-    save() {
-        if (this.mode == 'edit')
-            this.updateUser();
-        if (this.mode == 'create')
-            this.createNewUser();
-    }
-
-    cancel() {
-        this.$state.go('^.users');
-    }
-
-    deleteUser() {
-        let json = {userNames:[this.username]};
-        this.modal.confirm(`Are you sure you want to delete user '${this.username}?'`)
-            .then(() => this.userDao.delete(json).$promise.then(()=>this.cancel()));
-    }
-
-    onChangeGroups() {
-        this.userPermissions = undefined;
-        this.groupsPermissions = undefined;
-        this._getGroupsPermissions();
-        if (this.mode === 'edit') this._getUserPermissions();
-    }
-
-    onClickAdmin() {
-        if (this.userdata.admin) {
-            this.userdata.profileUpdatable = true;
-            this.userdata.internalPasswordDisabled = false;
-        }
-    }
-
-    _getPermissionCloumns() {
-
-        let nameCellTemplate = '<div class="ui-grid-cell-contents"><a href ui-sref="admin.security.permissions.edit({permission: row.entity.permissionName})">{{row.entity.permissionName}}</a></div>';
-
-        return [
-            {
-                field: "permissionName",
-                name: "Permission Target",
-                displayName: "Permission Target",
-                sort: {
-                    direction: this.uiGridConstants.ASC
-                },
-                cellTemplate: nameCellTemplate,
-                width:'16%'
-            },
-            {
-                field: "effectivePermission.principal",
-                name: "Applied To",
-                displayName: "Applied To",
-                width: '13%'
-            },
-            {
-                field: "repoKeys",
-                name: "Repositories",
-                displayName: "Repositories",
-                cellTemplate: this.commonGridColumns.listableColumn('row.entity.reposList','row.entity.permissionName','row.entity.repoKeysView',true),
-                width:'16%'
-
-            },
-            {
-                field: "effectivePermission.managed",
-                cellTemplate: this.commonGridColumns.booleanColumn('row.entity.effectivePermission.managed'),
-                name: "Manage",
-                displayName: "Manage",
-                width:'9%'
-            },
-            {
-                field: "effectivePermission.delete",
-                cellTemplate: this.commonGridColumns.booleanColumn('row.entity.effectivePermission.delete'),
-                name: "Delete/Overwrite",
-                displayName: "Delete/Overwrite",
-                width:'15%'
-            },
-            {
-                field: "effectivePermission.deploy",
-                cellTemplate: this.commonGridColumns.booleanColumn('row.entity.effectivePermission.deploy'),
-                name: "Deploy/Cache",
-                displayName: "Deploy/Cache",
-                width:'14%'
-            },
-            {
-                field: "effectivePermission.annotate",
-                cellTemplate: this.commonGridColumns.booleanColumn('row.entity.effectivePermission.annotate'),
-                name: "Annotate",
-                displayName: "Annotate",
-                width:'9%'
-            },
-            {
-                field: "effectivePermission.read",
-                cellTemplate: this.commonGridColumns.booleanColumn('row.entity.effectivePermission.read'),
-                name: "Read",
-                displayName: "Read",
-                width:'8%'
-            }
-        ]
-
-    }
-
-    isSaveDisabled() {
-        return !this.userForm || this.userForm.$invalid || ((this.input.password || this.input.retypePassword) && (this.input.password !== this.input.retypePassword));
-    }
-
-    checkPwdMatch(retypeVal) {
-        return !retypeVal || (retypeVal && this.input.password === retypeVal);
-    }
-
-    isAnonymous() {
-        return this.userdata.name === 'anonymous';
-    }
-
-    revokeApiKey() {
-        this.modal.confirm(`Are you sure you want to revoke API key for this user ?`)
-                .then(() => {
-                    this.userProfileDao.revokeApiKey({}, {username: this.username}).$promise.then(()=>{
-                        this.apiKeyExist = false;
-                    });
-
-                });
-    }
-
-    unlockUser() {
-        this.adminSecurityGeneralDao.unlockUsers({},[this.username]).$promise.then((res)=>{
-            if(res.status === 200) {
-                this.userdata.locked = false;
-            }
-        });
-    }
-
-
-    expirePassword() {
-        this.modal.confirm(`Are you sure you want to expire this user's password?`)
-            .then(() => {
-                this.userDao.expirePassword({}, {username: this.username}).$promise.then(()=> {
-                    this._getUserData();
-                })
-            });
-    }
-
-    unexpirePassword() {
-        this.userDao.unExpirePassword({}, {username: this.username}).$promise.then(()=> {
-            this._getUserData();
-        })
-    }
-
-    _getPasswordExpirationState() {
-        this.adminSecurityGeneralDao.get().$promise.then((data) => {
-            this.passwordExpirationEnabled = data.passwordSettings.expirationPolicy.enabled;
-            this.userLockEnabled = data.userLockPolicy.enabled;
-        });
-    }
-
-    revokeApiKey() {
-        this.modal.confirm(`Are you sure you want to revoke API key for user '${this.username}'?`)
-            .then(() => {
-                this.userProfileDao.revokeApiKey({}, {username: this.username}).$promise.then(()=>{
-                    this._getApiKeyState();
-                });
-            });
-    }
-    clearPasswordFields() {
-        delete this.input.password;
-        delete this.input.retypePassword;
-    }
-
-    onChangePasswordDisabled() {
-        if (this.userdata.internalPasswordDisabled) {
-            this.changePassword = false;
-            this.clearPasswordFields();
-            this.passwordReEnabled = false;
-        }
-        else {
-            if (this.passwordOriginalyDisabled) {
-                this.passwordReEnabled = true;
-            }
-        }
-    }
-    initActions(actionsController) {
-
-        this.actionsController = actionsController;
-        actionsController.setActionsDictionary(ACTIONS);
-        actionsController.setActions([
-            {
-                name:'RevokeApiKey',
-                visibleWhen: () => this.userdata && this.apiKeyExist && this.userdata.name !== 'anonymous',
-                action: ()=>this.revokeApiKey()
-            },
-            {
-                name:'UnlockUser',
-                visibleWhen: () => this.userdata && this.userdata.locked && this.userdata.name !== 'anonymous',
-                action: ()=>this.unlockUser()
-            },
-            {
-                name:'ExpirePassword',
-                visibleWhen: () => this.userdata && this.passwordExpirationEnabled && this.mode==='edit' && !this.userdata.credentialsExpired && (this.userdata.realm === 'internal' || !this.userdata.realm)  && this.userdata.name !== 'anonymous',
-                action: ()=>this.expirePassword()
-            },
-            {
-                name:'UnexpirePassword',
-                visibleWhen: () => this.userdata && this.userdata.credentialsExpired && !this.userdata.locked  && this.userdata.name !== 'anonymous',
-                action: ()=>this.unexpirePassword()
-            },
-            {
-                name:'DeleteUser',
-                visibleWhen: () => this.mode === 'edit' && this.userdata && this.userdata.name !== 'anonymous',
-                action: ()=>this.deleteUser()
-            }
-        ]);
-
-    }
-
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/users/user_form.html b/web/angular-web/src/main/webapp/app/states/admin/security/users/user_form.html
deleted file mode 100644
index 0892304..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/users/user_form.html
+++ /dev/null
@@ -1,194 +0,0 @@
-<div class="content-layout-container"> <!-- classes: with-head-bar -->
-    <div class="pull-right text-right user-actions">
-        <jf-actions parent-controller="UserForm" init-method="initActions"></jf-actions>
-    </div>
-
-    <h1>{{UserForm.title}}</h1>
-
-    <div class="content-wrapper">
-        <form name="UserForm.userForm" ng-submit="UserForm.save()">
-            <div class="card stretch card-pole-pad card-side-pad">
-                <div class="content-with-footer">
-                    <div class="user-form"
-                         ng-if="(UserForm.mode==='edit' && UserForm.userdata) || UserForm.mode==='create'">
-
-                        <jf-panel ng-if="UserForm.isAnonymous()" jf-panel-heading="User Settings">
-                            <div class="form-group">
-                                <div class="form-group-cell">
-                                    <jf-field validations="users" autofocus="true">
-                                        <label for="userA" class="mandatory">User Name</label>
-                                        <input name="username"
-                                               type="text"
-                                               jf-validator-name
-                                               jf-validator-max-text-length="100"
-                                               ng-model-options="{debounce: { 'default': 500 } }"
-                                               ng-model="UserForm.userdata.name"
-                                               class="input-text"
-                                               ng-disabled="UserForm.mode==='edit'"
-                                               id="userA"
-                                               autofocus required>
-                                    </jf-field>
-                                </div>
-                            </div>
-                        </jf-panel>
-
-                        <jf-panel ng-if="!UserForm.isAnonymous()" jf-panel-heading="User Settings">
-                            <div class="form-group" ng-if="UserForm.userdata.locked">
-                                <div class="alert alert-warning special-locked-user">User exceeded the max failed login attempts and is now locked out. <a href ng-click="UserForm.unlockUser()">Click to unlock</a>.</div>
-                            </div>
-                            <div class="form-group" ng-if="UserForm.userdata.credentialsExpired && !UserForm.userdata.locked">
-                                <div class="alert alert-warning">This user's credentials was expired. <a href ng-click="UserForm.unexpirePassword()">Click to unexpire</a>.</div>
-                            </div>
-                            <div class="form-group">
-                                <div class="form-group-cell">
-                                    <jf-field validations="users" autofocus="true">
-                                        <label for="username" class="mandatory">User Name</label>
-                                        <input name="username"
-                                               jf-validator-name
-                                               jf-validator-max-text-length="100"
-                                               ng-model-options="{debounce: { 'default': 500 } }"
-                                               type="text"
-                                               ng-model="UserForm.userdata.name"
-                                               class="input-text"
-                                               ng-disabled="UserForm.mode==='edit'"
-                                               id="username"
-                                               autofocus required>
-                                    </jf-field>
-                                </div>
-                                <div class="form-group-cell">
-                                    <jf-field validations="users">
-                                        <label for="email" class="mandatory">Email Address</label>
-                                        <input name="email"
-                                               type="email"
-                                               ng-model="UserForm.userdata.email"
-                                               class="input-text"
-                                               id="email" required>
-                                    </jf-field>
-                                </div>
-                            </div>
-                            <div class="form-group form-checkbox margin-top-25">
-                                <div class="form-group-cell">
-                                    <jf-checkbox text="Admin">
-                                        <input type="checkbox"
-                                               ng-click="UserForm.onClickAdmin()"
-                                               ng-model="UserForm.userdata.admin">
-                                    </jf-checkbox>
-                                </div>
-                            </div>
-                            <div class="form-group form-checkbox">
-                                <div class="form-group-cell">
-                                    <jf-checkbox text="Can Update Profile">
-                                        <input type="checkbox"
-                                               ng-disabled="UserForm.userdata.admin"
-                                               ng-model="UserForm.userdata.profileUpdatable">
-                                    </jf-checkbox>
-                                </div>
-                            </div>
-                            <div class="form-group">
-                                <div class="form-group-cell">
-                                    <jf-checkbox text="Disable Internal Password">
-                                        <input type="checkbox"
-                                               ng-disabled="UserForm.userdata.admin"
-                                               ng-change="UserForm.onChangePasswordDisabled();"
-                                               ng-model="UserForm.userdata.internalPasswordDisabled">
-                                    </jf-checkbox>
-                                    <jf-help-tooltip html="UserForm.TOOLTIP.disableInternalPassword"></jf-help-tooltip>
-                                </div>
-                            </div>
-
-                            <jf-panel jf-panel-heading="{{ UserForm.mode==='edit' ? 'Change Password' : 'Set Password'}}">
-                                <button type="button"
-                                        class="btn btn-secondary"
-                                        ng-if="false && UserForm.mode==='edit' && !UserForm.changePassword"
-                                        ng-disabled="UserForm.userdata.internalPasswordDisabled"
-                                        ng-click="UserForm.changePassword = true">Change Password
-                                </button>
-                                <div>
-                                    <!-- prevent auto complete -->
-                                    <input type="text" class="hidden"/>
-                                    <input type="password" class="hidden"/>
-                                    <div class="form-group">
-                                        <div class="form-group-cell">
-                                            <jf-field validations="users">
-                                                <label for="password" ng-class="{'mandatory':(UserForm.mode==='create' || UserForm.passwordReEnabled || UserForm.changePassword) && !UserForm.userdata.internalPasswordDisabled}">Password</label>
-                                                <input type="password"
-                                                       minlength="4"
-                                                       ng-model="UserForm.input.password"
-                                                       class="input-text"
-                                                       id="password"
-                                                       name = "password"
-                                                       ng-disabled="UserForm.userdata.internalPasswordDisabled"
-                                                       ng-required="(UserForm.mode==='create' || UserForm.passwordReEnabled || UserForm.changePassword) && !UserForm.userdata.internalPasswordDisabled">
-                                            </jf-field>
-                                        </div>
-                                        <div class="form-group-cell margin-top-25">
-                                            <label class="no-margin-bottom">Password Strength</label>
-                                            <div ng-password-strength="UserForm.input.password" strength="passStrength"
-                                                 mode="bootstrap"></div>
-                                        </div>
-                                    </div>
-                                    <div class="form-group half-margin-bottom">
-                                        <div class="form-group-cell">
-                                            <jf-field validations="users">
-                                                <label for="retypePassword" ng-class="{'mandatory':UserForm.mode==='create'}">Retype Password</label>
-                                                <input type="password"
-                                                       name="retypePassword"
-                                                       ng-model="UserForm.input.retypePassword"
-                                                       class="input-text"
-                                                       id="retypePassword"
-                                                       ui-validate="{pwdNoMatch: 'UserForm.checkPwdMatch($value)'}"
-                                                       ng-disabled="UserForm.userdata.internalPasswordDisabled"
-                                                       ng-required="(UserForm.mode==='create' || UserForm.changePassword) && !UserForm.userdata.internalPasswordDisabled">
-                                            </jf-field>
-                                            <span ng-if="UserForm.userForm.retypePassword.$error.pwdNoMatch"
-                                                  class="jf-validation">Passwords do not match</span>
-                                        </div>
-<!--
-                                        <div ng-if="UserForm.mode==='edit'"
-                                             class="form-group-cell margin-top-25">
-                                            <button type="button"
-                                                    class="btn btn-secondary"
-                                                    ng-click="UserForm.changePassword = false; UserForm.clearPasswordFields();">Cancel And Keep Current Password
-                                            </button>
-                                        </div>
--->
-                                    </div>
-                                </div>
-                            </jf-panel>
-                        </jf-panel>
-                        <jf-panel ng-if="!UserForm.isAnonymous()" jf-panel-heading="Related Groups">
-                            <div class="form-group">
-                                <div class="form-group-cell double">
-                                    <jf-drag-drop
-                                            ng-if="UserForm.groupsList"
-                                            on-change="UserForm.onChangeGroups()"
-                                            exclude-list="UserForm.groupsList"
-                                            include-list="UserForm.userdata.groups"
-                                            objects-name="Groups">
-                                    </jf-drag-drop>
-                                </div>
-                            </div>
-                        </jf-panel>
-                        <jf-panel jf-panel-heading="User Permissions">
-                            <jf-grid grid-options="UserForm.permissionsGridOptions"
-                                     filter-field="permissionName"
-                                     object-name="Permission"
-                                     filter-on-change="true">
-                            </jf-grid>
-                        </jf-panel>
-                    </div>
-                </div>
-            </div>
-
-            <div class="content-footer">
-                <div class="pull-right">
-                    <button class="btn btn-default" type="button"
-                            ng-click="UserForm.cancel()">Cancel</button>
-                    <button class="btn btn-primary" type="submit"
-                            ng-disabled="UserForm.isSaveDisabled()">Save
-                    </button>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/users/users.controller.js b/web/angular-web/src/main/webapp/app/states/admin/security/users/users.controller.js
deleted file mode 100644
index 9c0727f..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/users/users.controller.js
+++ /dev/null
@@ -1,188 +0,0 @@
-export class AdminSecurityUserController {
-
-    constructor($state, ArtifactoryModal, UserDao, $scope, GroupsDao, ArtifactoryGridFactory, uiGridConstants, AdminSecurityGeneralDao,
-            commonGridColumns) {
-
-        this.userDao = UserDao.getInstance();
-        this.adminSecurityGeneralDao = AdminSecurityGeneralDao;
-        this.uiGridConstants = uiGridConstants;
-        this.groupsDao = GroupsDao.getInstance();
-        this.modal = ArtifactoryModal;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.commonGridColumns = commonGridColumns;
-        this.$scope = $scope;
-        this.$state = $state;
-        this._createGrid();
-        this._initUsers();
-    }
-
-    _initUsers() {
-        this.userDao.getAll().$promise.then((users)=> {
-            //console.log(users);
-            users.forEach((user)=>{
-                user.permissions = _.pluck(user.permissionsList,'permissionName');
-            });
-            this.gridOption.setGridData(users);
-        });
-    }
-
-    _createGrid() {
-        this.gridOption = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setColumns(this.getColumns())
-                .setMultiSelect()
-                .setButtons(this._getActions())
-                .setRowTemplate('default')
-                .setBatchActions(this._getBatchActions());
-
-        this.gridOption.isRowSelectable = (row) => {
-            return row.entity.name !== 'anonymous';
-        };
-    }
-
-    deleteUser(user) {
-        let json = {userNames:[user.name]};
-        this.modal.confirm(`Are you sure you want to delete user '${user.name}?'`)
-            .then(() => this.userDao.delete(json).$promise.then(()=>this._initUsers()));
-    }
-
-    bulkDelete(){
-        // Get All selected users
-        let selectedRows = this.gridOption.api.selection.getSelectedRows();
-        // Create an array of the selected users names
-        let names = _.map(selectedRows, (user) => {return user.name;});
-        // Create Json for the bulk request
-        let json = {userNames: names};
-        // console.log('Bulk delete....');
-        // Ask for confirmation before delete and if confirmed then delete bulk of users
-        this.modal.confirm(`Are you sure you want to delete ${names.length} users?`)
-            .then(() => this.userDao.delete(json).$promise.then(() => this._initUsers()));
-    }
-
-    updateUser(user) {
-        this.userDao.update(user).$promise.then(()=>this._initUsers());
-    }
-
-    checkExternalStatus(user) {
-        this.userDao.checkExternalStatus(user).$promise.then((dataRes)=>{
-//            console.log(dataRes);
-            user.externalRealmStatus = dataRes.data.externalRealmStatus;
-        });
-
-    }
-
-    getColumns() {
-        return [
-            {
-                name: 'Name',
-                displayName: 'Name',
-                field: "name",
-                cellTemplate: '<div class="ui-grid-cell-contents" ui-sref="^.users.edit({username: row.entity.name})"><a href="">{{row.entity.name}}</a></div>',
-                sort: {
-                    direction: this.uiGridConstants.ASC
-                },
-                width: '15%'
-            },
-            {
-                name: 'Email',
-                displayName: 'Email',
-                field: "email",
-                width: '15%'
-            },
-            {
-                name: "Realm",
-                displayName: "Realm",
-                field: "realm",
-                cellTemplate: '<div class="ui-grid-cell-contents">{{row.entity.realm}}'+
-                              '<span ng-if="row.entity.externalRealmStatus"> | {{row.entity.externalRealmStatus}}</span>' +
-                              '<span ng-if="!row.entity.externalRealmStatus && row.entity.externalRealmLink"> | <a href="" ng-click="grid.appScope.AdminSecurityUser.checkExternalStatus(row.entity)">{{row.entity.externalRealmLink}}</a></span></div>',
-                width: '10%'
-            },
-            {
-                field: "groups",
-                name: "Related Groups",
-                displayName: "Related Groups",
-                cellTemplate: this.commonGridColumns.listableColumn('row.entity.groups','row.entity.name'),
-                width: '18%'
-            },
-            {
-                field: "permissions",
-                name: "Related Permissions",
-                displayName: "Related Permissions",
-                cellTemplate: this.commonGridColumns.listableColumn('row.entity.permissions','row.entity.name'),
-                width: '18%'
-            },
-            {
-                name: "Admin",
-                displayName: "Admin",
-                field: "admin",
-                cellTemplate: this.commonGridColumns.booleanColumn('row.entity.admin'),
-                width: '7%'
-            },
-            {
-                name: "Lock",
-                displayName: "Locked",
-                field: "locked",
-                cellTemplate: '<div class="ui-grid-cell-contents text-center"><a class="grid-column-button icon icon-lock" ng-if="row.entity.locked" cm-aditional-action="Unlock" ng-click="grid.appScope.AdminSecurityUser.unlockUsers(row.entity.name)" jf-tooltip="Unlock"></a></div>',
-                width: '7%'
-            },
-            {
-                field: "lastLoggedInMillis",
-                name: "Last Login",
-                displayName: "Last Login",
-                cellTemplate: '<div class="ui-grid-cell-contents">{{row.entity.lastLoggedIn}}</div>',
-                width: '10%'
-            }
-        ]
-    }
-
-    _getActions() {
-        return [
-            {
-                icon: 'icon icon-clear',
-                tooltip: 'Delete',
-                callback: (row) => this.deleteUser(row),
-                visibleWhen: (row) => row.name != 'anonymous'
-            }
-
-        ];
-    }
-
-    _getBatchActions() {
-        return [
-            {
-                icon: 'clear',
-                name: 'Delete',
-                callback: () => this.bulkDelete()
-            },
-            {
-                icon: 'unlock',
-                name: 'Unlock',
-                callback: () => this.bulkUnlock(),
-                disabledWhen: () => !this.hasSelectedUnlockedUsers()
-            }
-        ]
-    }
-
-    unlockUsers(users) {
-        if (!_.isArray(users)) users = [users];
-
-        this.adminSecurityGeneralDao.unlockUsers({},users).$promise.then((res)=>{
-            if(res.status === 200) {
-                this._initUsers()
-            }
-        });
-    }
-
-    hasSelectedUnlockedUsers() {
-        let selectedRows = this.gridOption.api.selection.getSelectedRows();
-        return _.findWhere(selectedRows,{locked: true});
-    }
-
-    bulkUnlock() {
-        let selectedRows = this.gridOption.api.selection.getSelectedRows();
-        let locked = _.filter(selectedRows,row=>row.locked);
-        let names = _.pluck(locked,"name");
-        this.unlockUsers(names);
-    }
-
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/users/users.html b/web/angular-web/src/main/webapp/app/states/admin/security/users/users.html
deleted file mode 100644
index 860214b..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/users/users.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<div class="content-layout-container"> <!-- classes: with-head-bar -->
-    <h1>Users Management</h1>
-
-    <div class="content-wrapper">
-        <div class="card stretch card-pole-pad card-side-pad">
-            <div class="pull-right admin-grid-buttons">
-                <a ui-sref="^.users.new">
-                    <i class="grid-button-icon icon icon-new"></i>New
-                </a>
-            </div>
-            <jf-grid
-                grid-options="AdminSecurityUser.gridOption"
-                filter-field="name"
-                filter-field2="email"
-                object-name="user"
-                auto-focus="true">
-            </jf-grid>
-                                
-        </div>
-    </div>
-</div>
-
diff --git a/web/angular-web/src/main/webapp/app/states/admin/security/users/users.module.js b/web/angular-web/src/main/webapp/app/states/admin/security/users/users.module.js
deleted file mode 100644
index 1acff9e..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/security/users/users.module.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import {AdminSecurityUserController} from './users.controller';
-import {AdminSecurityUserFormController} from './user_form.controller';
-
-function usersConfig($stateProvider) {
-
-    $stateProvider
-        .state('admin.security.users', {
-            url: '/users',
-            templateUrl: 'states/admin/security/users/users.html',
-            controller: 'AdminSecurityUserController as AdminSecurityUser'
-        })
-        .state('admin.security.users.edit', {
-            parent: 'admin.security',
-            url: '/users/{username}/edit',
-            templateUrl: 'states/admin/security/users/user_form.html',
-            controller: 'AdminSecurityUserFormController as UserForm'
-        })
-        .state('admin.security.users.new', {
-            parent: 'admin.security',
-            url: '/users/new',
-            templateUrl: 'states/admin/security/users/user_form.html',
-            controller: 'AdminSecurityUserFormController as UserForm'
-        })
-
-}
-
-export default angular.module('security.users', [])
-        .config(usersConfig)
-    .controller('AdminSecurityUserController', AdminSecurityUserController)
-    .controller('AdminSecurityUserFormController', AdminSecurityUserFormController);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/services/admin.services.module.js b/web/angular-web/src/main/webapp/app/states/admin/services/admin.services.module.js
deleted file mode 100644
index 6ef5fa8..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/services/admin.services.module.js
+++ /dev/null
@@ -1,20 +0,0 @@
-import Backups from './backups/backups.module';
-import Indexer from './indexer/indexer.module';
-
-import {AdminServicesController} from './services.controller';
-
-function adminServicesConfig($stateProvider) {
-    $stateProvider
-            .state('admin.services', {
-                url: '/services',
-                template: '<ui-view></ui-view>',
-                controller: 'AdminServicesController as AdminServices'
-            })
-}
-
-export default angular.module('admin.services', [
-    Backups.name,
-    Indexer.name
-])
-        .config(adminServicesConfig)
-        .controller('AdminServicesController', AdminServicesController)
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/services/backups/backup_form.controller.js b/web/angular-web/src/main/webapp/app/states/admin/services/backups/backup_form.controller.js
deleted file mode 100644
index f3704a7..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/services/backups/backup_form.controller.js
+++ /dev/null
@@ -1,90 +0,0 @@
-import TOOLTIP from "../../../../constants/artifact_tooltip.constant";
-
-let $state, $stateParams, RepoDataDao, BackupDao;
-
-export class AdminServicesBackupFormController {
-    constructor(_$state_, _$stateParams_, _RepoDataDao_, _BackupDao_, BrowseFilesDao, ArtifactoryModelSaver) {
-        $state = _$state_;
-        $stateParams = _$stateParams_;
-        RepoDataDao = _RepoDataDao_;
-        BackupDao = _BackupDao_;
-        this.browseFilesDao = BrowseFilesDao.getInstance();
-        this.artifactoryModelSaver = ArtifactoryModelSaver.createInstance(this,['backup']);
-
-        this.isNew = !$stateParams.backupKey;
-        this.TOOLTIP = TOOLTIP.admin.services.backupsForm;
-        this.formTitle = `${this.isNew ? 'New' : 'Edit ' + $stateParams.backupKey} Backup`;
-        this._initBackup();
-
-        this.fileBrowserOptions = {
-            canSelectFiles: false,
-            selectionLabel: 'Directory To Export Backup',
-            pathLabel: 'Path to Export Backup',
-            confirmButtonLabel: 'Select',
-            showSelectedItem: true,
-            enableSelectedItem: true
-        }
-    }
-
-    _initBackup() {
-        if (this.isNew) {
-            RepoDataDao.getForBackup().$promise.then((repoData) => {
-                this.backup = {
-                    enabled: true,
-                    sendMailOnError: true,
-                    retentionPeriodHours: 168,
-                    includeRepos: repoData.repoList,
-                    excludeRepos: []
-                };
-                this.artifactoryModelSaver.save();
-            });
-        }
-        else {
-            BackupDao.get({key: $stateParams.backupKey}).$promise
-                .then((backup) => {
-                        this.backup = backup
-                        this.artifactoryModelSaver.save();
-                    });
-        }
-    }
-
-    updateFolderPath(directory) {
-        this.backup.dir = directory;
-    }
-
-    save() {
-        let whenSaved = this.isNew ? BackupDao.save(this.backup) : BackupDao.update(this.backup);
-        whenSaved.$promise.then(() => {
-            this.artifactoryModelSaver.save();
-            this._end()
-        });
-    }
-
-    cancel() {
-        this._end();
-    }
-
-    _end() {
-        $state.go('^.backups');
-    }
-
-    onClickIncremental() {
-        if (this.backup.incremental) {
-            this.backup.retentionPeriodHours = 0;
-            this.backup.createArchive=false;
-        }
-    }
-    onClickZip() {
-        if (this.backup.createArchive) {
-            this.backup.incremental = false;
-        }
-    }
-/*
-    MOVED TO MAIN BACKUPS GRID
-    runNow() {
-        BackupDao.runNow({},this.backup).$promise.then((res)=>{
-           //console.log(res);
-        });
-    }
-*/
-}
diff --git a/web/angular-web/src/main/webapp/app/states/admin/services/backups/backup_form.html b/web/angular-web/src/main/webapp/app/states/admin/services/backups/backup_form.html
deleted file mode 100644
index 481954f..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/services/backups/backup_form.html
+++ /dev/null
@@ -1,182 +0,0 @@
-<div class="content-layout-container">
-    <h1>{{ BackupForm.formTitle }}</h1>
-
-    <div class="content-wrapper">
-        <form novalidate name="BackupForm.backupEditForm" ng-submit="BackupForm.save()">
-            <div class="card stretch card-pole-pad card-side-pad">
-                <div class="content-with-footer">
-                    <jf-panel jf-panel-heading="Backup Settings">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Enabled">
-                                    <input type="checkbox" ng-model="BackupForm.backup.enabled">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="adminBackup" autofocus="true">
-                                    <label for="backupKey" class="mandatory">Backup Key</label>
-                                    <input name="licenseName"
-                                           ng-disabled="!BackupForm.isNew || !BackupForm.backup.enabled"
-                                           jf-validator-unique-id
-                                           jf-validator-name
-                                           jf-validator-xml-name
-                                           required
-                                           type="text"
-                                           ng-model="BackupForm.backup.key"
-                                           ng-model-options="{ debounce: 1000 }"
-                                           class="input-text"
-                                           id="backupKey"/>
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="adminBackup">
-                                    <label for="cronExp" class="mandatory">Cron Expression</label>
-                                    <jf-help-tooltip html="BackupForm.TOOLTIP.cronExpression"></jf-help-tooltip>
-                                    <input type="text"
-                                           class="input-text"
-                                           name="cronExp"
-                                           id="cronExp"
-                                           required
-                                           jf-validator-cron
-                                           ng-model="BackupForm.backup.cronExp"
-                                           ng-model-options="{debounce: { 'default': 500 } }"
-                                           ng-disabled="!BackupForm.backup.enabled"/>
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell">
-                                <label>Next Backup Time</label>
-                                <input type="text"
-                                       placeholder="N/A"
-                                       jf-cron-formatter
-                                       class="input-text disabled-look"
-                                       ng-model="BackupForm.backup.cronExp"
-                                       readonly/>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="adminBackup">
-                                    <label for="directory">Server Path For Backup</label>
-                                    <jf-help-tooltip html="BackupForm.TOOLTIP.serverPathForBackup"></jf-help-tooltip>
-                                    <input name="directory"
-                                           type="text"
-                                           ng-model="BackupForm.backup.dir"
-                                           ng-disabled="!BackupForm.backup.enabled"
-                                           class="input-text"
-                                           id="directory"/>
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell form-button">
-                                <jf-browse-files browser-resource="BackupForm.browseFilesDao"
-                                                 browser-options="BackupForm.fileBrowserOptions"
-                                                 start-folder="BackupForm.backup.dir"
-                                                 browser-update-folder="BackupForm.updateFolderPath(directory)">
-                                </jf-browse-files>
-                            </div>
-                        </div>
-                    </jf-panel>
-
-                    <jf-panel jf-panel-heading="Advanced">
-                        <div class="form-group form-checkbox">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Send Mail to Admins if there are Backup Errors">
-                                    <input type="checkbox"
-                                           ng-model="BackupForm.backup.sendMailOnError">
-                                </jf-checkbox>
-                                <jf-help-tooltip html="BackupForm.TOOLTIP.sendMailToAdminsIfThereAreBackupErrors"></jf-help-tooltip>
-                            </div>
-                        </div>
-                        <div class="form-group form-checkbox">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Exclude Builds">
-                                    <input type="checkbox"
-                                           ng-model="BackupForm.backup.excludeBuilds">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                        <div class="form-group form-checkbox">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Exclude new Repositories">
-                                    <input type="checkbox"
-                                           ng-model="BackupForm.backup.excludeNewRepositories">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                            <jf-checkbox text="Incremental">
-                                <input type="checkbox"
-                                       ng-click="BackupForm.onClickIncremental()"
-                                       ng-disabled="BackupForm.backup.createArchive"
-                                       ng-model="BackupForm.backup.incremental">
-                            </jf-checkbox>
-
-                                <jf-field validations="adminBackup">
-                                    <label for="retentionPeriodHours">Retention Period Hours</label>
-                                    <jf-help-tooltip html="BackupForm.TOOLTIP.retentionPeriod"></jf-help-tooltip>
-                                    <input name="directory"
-                                           type="number"
-                                           min="0"
-                                           ng-model="BackupForm.backup.retentionPeriodHours"
-                                           class="input-text"
-                                           id="retentionPeriodHours"
-                                           ng-disabled="BackupForm.backup.incremental"/>
-
-                                </jf-field>
-                            </div>
-                        </div>
-
-                        <div class="form-group">
-                            <div class="form-group-cell double">
-                                <jf-drag-drop include-list="BackupForm.backup.includeRepos"
-                                              exclude-list="BackupForm.backup.excludeRepos"
-                                              objects-name="Repositories"
-                                              headers="{leftTitle:'Excluded Repositories',
-                                              rightTitle:'Included Repositories'}"></jf-drag-drop>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Back up to a Zip Archive (Slow and CPU Intensive)">
-                                    <input type="checkbox"
-                                           ng-model="BackupForm.backup.createArchive"
-                                           ng-disabled="BackupForm.backup.incremental"
-                                           ng-click="BackupForm.onClickZip()">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                    </jf-panel>
-                </div>
-            </div>
-            <div class="content-footer">
-                <div class="pull-right">
-                    <button
-                            type="button"
-                            class="btn btn-default"
-                            ng-click="BackupForm.cancel()">
-                        Cancel
-                    </button>
-                    <button
-                            type="submit"
-                            class="btn btn-primary"
-                            ng-disabled="!BackupForm.backupEditForm.$valid">
-                        Save
-                    </button>
-<!--
-                    <button
-                            type="button"
-                            class="btn btn-primary"
-                            ng-click="BackupForm.runNow()"
-                            ng-disabled="!BackupForm.backupEditForm.$valid">
-                        Run Now
-                    </button>
--->
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/services/backups/backups.controller.js b/web/angular-web/src/main/webapp/app/states/admin/services/backups/backups.controller.js
deleted file mode 100644
index 0402cf7..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/services/backups/backups.controller.js
+++ /dev/null
@@ -1,121 +0,0 @@
-export class AdminServicesBackupsController {
-    constructor($scope, BackupDao, ArtifactoryGridFactory, ArtifactoryModal, RepoDataDao, $q, commonGridColumns) {
-        this.backupDao = BackupDao;
-        this.repoDataDao = RepoDataDao;
-        this.modal = ArtifactoryModal;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.$scope = $scope;
-        this.commonGridColumns = commonGridColumns;
-        this._createGrid();
-        this._initBackups();
-        this.$q = $q;
-    }
-
-    _initBackups() {
-        this.backupDao.query().$promise.then((backups)=> {
-            this.gridBackupsOptions.setGridData(backups)
-        });
-    }
-
-    _createGrid() {
-        this.gridBackupsOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setColumns(this._getColumns())
-                .setButtons(this._getActions())
-                .setRowTemplate('default')
-                //.setMultiSelect()
-                //.setBatchActions(this._getBatchActions());
-    }
-
-    _doDeleteBackup(key) {
-        return this.backupDao.delete({key: key}).$promise;
-    }
-
-   /* deleteSelectedBackups() {
-        let selectedRows = this.gridBackupsOptions.api.selection.getSelectedGridRows();
-        this.modal.confirm(`Are you sure you want to delete ${selectedRows.length} backups?`)
-            .then(() => {
-                return this.$q.all(selectedRows.map((row) => this._doDeleteBackup(row.entity.key)))
-            })
-            .then(() => this._initBackups())
-    }*/
-
-    deleteBackup(key) {
-        this.modal.confirm(`Are you sure you want to delete the backup '${key}'?`)
-            .then(() => this._doDeleteBackup(key))
-            .then(() => this._initBackups())
-    }
-
-    _getColumns() {
-        return [
-            {
-                field: "key",
-                cellTemplate: '<div class="ui-grid-cell-contents"><a ui-sref="^.backups.edit({backupKey: row.entity.key})">{{ COL_FIELD }}</a></div>',
-                width: "15%"
-            },
-            {
-                name: "Repositories",
-                displayName: "Repositories",
-                field: "includeRepos",
-                cellTemplate: this.commonGridColumns.listableColumn('row.entity.includeRepos','row.entity.key'),
-                width: "30%"
-            },
-            {
-                name: "Cron Expression",
-                displayName: "Cron Expression",
-                field: "cronExp",
-                cellTemplate: '<div class="ui-grid-cell-contents">{{ COL_FIELD }}</div>',
-                width: "15%"
-            },
-            {
-                name: "Next Schedule Backup",
-                displayName: "Next Schedule Backup",
-                field: "cronExp",
-                cellTemplate: '<div class="ui-grid-cell-contents"><input class="not-like-input" type="text" jf-cron-formatter ng-model="row.entity.cronExp" disabled></div>',
-                width: "20%"
-            },
-            {
-                field: "enabled",
-                cellTemplate: this.commonGridColumns.booleanColumn('row.entity.enabled'),
-                width: "10%"
-            },
-            {
-                name: 'Run Now',
-                displayName: 'Run Now',
-                field: 'runnow',
-                cellTemplate: '<div class="ui-grid-cell-contents text-center"><a class="grid-column-button icon icon-run" ng-click="grid.appScope.AdminServicesBackups.runNow(row.entity)" ng-disabled="!row.entity.enabled"></a></div>',
-                width: '10%',
-                enableSorting: false
-            }
-        ]
-    }
-
-    _getActions() {
-        return [
-            {
-                icon: 'icon icon-clear',
-                tooltip: 'Delete',
-                callback: entity => this.deleteBackup(entity.key)
-            }
-        ];
-    }
-
-    runNow(row) {
-        if (row.enabled) {
-            this.backupDao.get({key: row.key}).$promise
-                    .then((backup) => {
-                        this.backupDao.runNow({},backup).$promise.then((res)=>{
-                            //console.log(res);
-                        });
-                    });
-        }
-    }
-/*    _getBatchActions() {
-        return [
-            {
-                icon: 'clear',
-                name: 'Delete',
-                callback: () => this.deleteSelectedBackups()
-            },
-        ]
-    }*/
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/services/backups/backups.html b/web/angular-web/src/main/webapp/app/states/admin/services/backups/backups.html
deleted file mode 100644
index 56b4952..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/services/backups/backups.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<div class="content-layout-container">
-    <h1>Backups Management</h1>
-
-    <div class="content-wrapper">
-        <div class="card stretch card-pole-pad card-side-pad">
-            <div class="pull-right admin-grid-buttons">
-                <a ui-sref="^.backups.new">
-                    <i class="grid-button-icon icon icon-new"></i>New
-                </a>
-            </div>
-            <jf-grid grid-options="AdminServicesBackups.gridBackupsOptions"
-                     filter-field="key"
-                     filter-on-change="true"
-                     object-name="backup"
-                     auto-focus="true">
-            </jf-grid>
-        </div>
-    </div>
-</div>
-
-
-
diff --git a/web/angular-web/src/main/webapp/app/states/admin/services/backups/backups.module.js b/web/angular-web/src/main/webapp/app/states/admin/services/backups/backups.module.js
deleted file mode 100644
index 637e7e1..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/services/backups/backups.module.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import {AdminServicesBackupsController} from './backups.controller';
-import {AdminServicesBackupFormController} from './backup_form.controller';
-
-function backupsConfig($stateProvider) {
-
-    $stateProvider
-            .state('admin.services.backups', {
-                params: {feature: 'backups'},
-                url: '/backups',
-                templateUrl: 'states/admin/services/backups/backups.html',
-                controller: 'AdminServicesBackupsController as AdminServicesBackups'
-            })
-            .state('admin.services.backups.new', {
-                params: {feature: 'backups'},
-                parent: 'admin.services',
-                url: '/backups/new',
-                templateUrl: 'states/admin/services/backups/backup_form.html',
-                controller: 'AdminServicesBackupFormController as BackupForm'
-            })
-            .state('admin.services.backups.edit', {
-                params: {feature: 'backups'},
-                parent: 'admin.services',
-                url: '/backups/:backupKey/edit',
-                templateUrl: 'states/admin/services/backups/backup_form.html',
-                controller: 'AdminServicesBackupFormController as BackupForm'
-            })
-}
-
-export default angular.module('backups', [])
-        .config(backupsConfig)
-        .controller('AdminServicesBackupsController', AdminServicesBackupsController)
-        .controller('AdminServicesBackupFormController', AdminServicesBackupFormController)
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/services/indexer/indexer.controller.js b/web/angular-web/src/main/webapp/app/states/admin/services/indexer/indexer.controller.js
deleted file mode 100644
index 4fc4896..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/services/indexer/indexer.controller.js
+++ /dev/null
@@ -1,46 +0,0 @@
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-
-export class AdminServicesIndexerController {
-    constructor(IndexerDao, RepositoriesDao, ArtifactoryModelSaver) {
-        this.indexerDao = IndexerDao.getInstance();
-        this.repositoriesDao = RepositoriesDao;
-        this.indexer = {};
-        this.TOOLTIP = TOOLTIP.admin.services.mavenIndexer;
-        this.artifactoryModelSaver = ArtifactoryModelSaver.createInstance(this,['indexer']);
-        this.getIndexerObject();
-    }
-
-    getIndexerObject() {
-        this.indexerDao.get().$promise.then((result) => {
-            this.indexer = result;
-            this.artifactoryModelSaver.save();
-            this.getRepoData();
-        });
-    }
-
-    getRepoData() {
-        if (!this.indexer.includedRepos) {
-            this.repositoriesDao.indexerAvailableRepositories({type: 'Maven', layout: 'maven-2-default'}).$promise.then((repos) => {
-                this.indexer.includedRepos = [];
-                this.indexer.excludedRepos = [];
-                this.indexer.includedRepos = repos.availableLocalRepos.concat(repos.availableRemoteRepos).concat(repos.availableVirtualRepos);
-            });
-        }
-    }
-
-    runIndexer() {
-        this.indexerDao.run(this.indexer);
-    }
-
-    save(indexer) {
-        this.indexerDao.save(indexer).$promise.then(()=>{
-            this.artifactoryModelSaver.save();
-        });
-    }
-
-    cancel() {
-        this.artifactoryModelSaver.ask().then(()=>{
-            this.getIndexerObject();
-        });
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/services/indexer/indexer.html b/web/angular-web/src/main/webapp/app/states/admin/services/indexer/indexer.html
deleted file mode 100644
index 6431f84..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/services/indexer/indexer.html
+++ /dev/null
@@ -1,86 +0,0 @@
-<div class="content-layout-container">
-    <h1>Maven Indexer Configuration</h1>
-
-    <div class="content-wrapper">
-        <form name="indexerForm" ng-submit="AdminServicesIndexer.save(AdminServicesIndexer.indexer)">
-            <div class="card stretch card-pole-pad card-side-pad">
-                <div class="content-with-footer">
-                    <jf-panel jf-panel-heading="Maven Indexer Settings">
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-checkbox text="Enabled">
-                                    <input type="checkbox"
-                                           ng-model="AdminServicesIndexer.indexer.enabled">
-                                </jf-checkbox>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field validations="maintenance" autofocus="true" dont-validate-disabled="true">
-                                    <label for="cronExp" class="mandatory">Cron Expression</label>
-                                    <jf-help-tooltip html="AdminServicesIndexer.TOOLTIP.cronExpression"></jf-help-tooltip>
-                                    <input type="text"
-                                           class="input-text"
-                                           name="cronExp"
-                                           id="cronExp"
-                                           required
-                                           jf-validator-cron
-                                           ng-disabled="!AdminServicesIndexer.indexer.enabled"
-                                           ng-model="AdminServicesIndexer.indexer.cronExp"
-                                           ng-model-options="{onBlur: true ,debounce: { 'default': 500 }}"/>
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell">
-                                <jf-field>
-                                    <label for="indexingTime">Next Indexing Time</label>
-                                    <input type="text"
-                                           jf-cron-formatter
-                                           class="input-text disabled-look"
-                                           id="indexingTime"
-                                           ng-disabled="!AdminServicesIndexer.indexer.enabled"
-                                           readonly
-                                           ng-model="AdminServicesIndexer.indexer.cronExp">
-                                </jf-field>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="form-group-cell double">
-                                <button class="btn btn-secondary pull-right"
-                                        name="runIndexingNow"
-                                        type="button"
-                                        ng-disabled="indexerForm.$invalid || !AdminServicesIndexer.indexer.enabled"
-                                        ng-click="AdminServicesIndexer.runIndexer()">Run Indexing Now
-                                </button>
-                            </div>
-                        </div>
-
-                        <div class="form-group">
-                            <div class="form-group-cell double">
-                                <jf-drag-drop include-list="AdminServicesIndexer.indexer.includedRepos"
-                                              exclude-list="AdminServicesIndexer.indexer.excludedRepos"
-                                              objects-name="Repositories"
-                                              ng-disabled="!AdminServicesIndexer.indexer.enabled"
-                                              headers="{leftTitle:'Excluded Repositories',
-                                  rightTitle:'Included Repositories'}">
-                                </jf-drag-drop>
-                            </div>
-                        </div>
-                    </jf-panel>
-                </div>
-            </div>
-
-            <div class="content-footer">
-                <div class="pull-right">
-                    <button type="button" class="btn btn-default" ng-click="AdminServicesIndexer.cancel()"
-                            type="button">
-                        Reset
-                    </button>
-                    <button class="btn btn-primary"
-                            type="submit"
-                            ng-disabled="!indexerForm.$valid && AdminServicesIndexer.indexer.enabled">Save
-                    </button>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/services/indexer/indexer.module.js b/web/angular-web/src/main/webapp/app/states/admin/services/indexer/indexer.module.js
deleted file mode 100644
index f49a10f..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/services/indexer/indexer.module.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import {AdminServicesIndexerController} from './indexer.controller';
-
-function indexerConfig($stateProvider) {
-    $stateProvider
-            .state('admin.services.indexer', {
-                params: {feature: 'indexer'},
-                url: '/indexer',
-                templateUrl: 'states/admin/services/indexer/indexer.html',
-                controller: 'AdminServicesIndexerController as AdminServicesIndexer'
-            })
-}
-
-export default angular.module('indexer', [])
-        .config(indexerConfig)
-        .controller('AdminServicesIndexerController', AdminServicesIndexerController);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/admin/services/services.controller.js b/web/angular-web/src/main/webapp/app/states/admin/services/services.controller.js
deleted file mode 100644
index d05b7e8..0000000
--- a/web/angular-web/src/main/webapp/app/states/admin/services/services.controller.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export class AdminServicesController {
-  constructor () {
-    var AdminServices = this;
-    AdminServices.stateUrl = '/services';
-    AdminServices.controllerName = 'AdminServicesController'
-  }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifactory.states.module.js b/web/angular-web/src/main/webapp/app/states/artifactory.states.module.js
deleted file mode 100644
index d9507d9..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifactory.states.module.js
+++ /dev/null
@@ -1,189 +0,0 @@
-import AdminState       from './admin/admin.module';
-import ArtifactState    from './artifacts/artifacts.module';
-import BuildsState      from './builds/builds.module';
-import HomeModule       from './home/home.module';
-import OAuthErrorModule from './oauth_error/oauth_error.module';
-import notFound404      from './not_found_404/not_found_404.module';
-import Forbidden403     from './forbidden_403/forbidden_403.module';
-import Login            from './login/login.module';
-import ChangePassword   from './change_password/change_password.module';
-import ForgotPassword   from './forgot_password/forgot_password.module';
-import UserProfile      from './user_profile/user_profile.module';
-import ServerError      from './server_error/server_error.module';
-import BaseState        from './base/base.module';
-import EVENTS from '../constants/artifacts_events.constants';
-
-angular.module('artifactory.states', [
-    AdminState.name,
-    ArtifactState.name,
-    BuildsState.name,
-    HomeModule.name,
-    OAuthErrorModule.name,
-    notFound404.name,
-    Forbidden403.name,
-    Login.name,
-    ChangePassword.name,
-    ForgotPassword.name,
-    UserProfile.name,
-    ServerError.name,
-    BaseState.name,
-    'artifactory.services',
-    'artifactory.dao',
-    'cfp.hotkeys',
-    'ui.router'
-]).
-run(changeStateHook);
-function changeStateHook(User, $rootScope, $q, ArtifactoryNotifications, $location, $timeout, $state,
-        ArtifactoryFeatures, FooterDao, ArtifactoryState, ArtifactoryEventBus, ArtifactoryModal) {
-
-    ArtifactoryEventBus.register(EVENTS.USER_LOGOUT, (confirmDiscard) => {
-        if (confirmDiscard) {
-            checkDiscardConfirmation($q).then(()=>{
-                ArtifactoryEventBus.dispatch(EVENTS.USER_LOGOUT);
-            })
-        }
-    });
-
-    $rootScope.$on('$locationChangeStart', (e,newUrl)=>{
-        if (ArtifactoryState.getState('confirmDiscardModalOpen')) {
-            e.preventDefault();
-        }
-    });
-
-    $rootScope.$on('$stateChangeStart', (e, toState, toParams, fromState, fromParams) => {
-
-        if (fromState.name.startsWith('admin.') || fromState.name === 'user_profile') {
-            if (!ArtifactoryState.getState('confirmDiscardModalOpen')) {
-                checkDiscardConfirmation($q, e).then(()=> {
-                    $state.go(toState.name, toParams);
-                });
-            }
-            else {
-                e.preventDefault();
-                return;
-            }
-        }
-        let saveAdminState = ArtifactoryState.getState('saveAdminState');
-        if (toState.name.startsWith('admin.') && !toState.name.match(/(?:.new|.edit)\b/) && saveAdminState && !e.defaultPrevented) {
-            ArtifactoryState.setState('lastAdminState', toState);
-            ArtifactoryState.setState('lastAdminStateParams', toParams);
-            ArtifactoryState.removeState('saveAdminState');
-        }
-        else if (saveAdminState && !e.defaultPrevented) {
-            ArtifactoryState.removeState('saveAdminState');
-        }
-
-
-        if (fromState.name && toState.name && fromState.name != toState.name) {
-            ArtifactoryEventBus.dispatch(EVENTS.CANCEL_SPINNER);
-        }
-
-        if (toState.name === 'artifacts.browsers.search') {
-            //MOVED FROM artifacts.module.js to prevent error message (ui-router bug workaround)
-            ArtifactoryEventBus.dispatch(EVENTS.SEARCH_URL_CHANGED, toParams);
-        }
-        else if (fromState.name === 'artifacts.browsers.search') {
-            ArtifactoryEventBus.dispatch(EVENTS.CLEAR_SEARCH);
-        }
-
-        if (toState.name === 'change-password' && !toParams.username) {
-            e.preventDefault();
-            $state.go('login');
-        }
-
-        if (toState.name === 'oauth_error') {
-            e.preventDefault();
-
-            let message = $location.search().message;
-            let gotoState = localStorage.stateBeforeOAuth;
-
-            if (gotoState === 'login') {
-                $state.go(gotoState,{oauthError: message, location: "replace"});
-            }
-            else if (gotoState === 'user_profile') {
-                ArtifactoryNotifications.create({error: message});
-                $state.go(gotoState,{location: "replace"});
-            }
-            else {
-                ArtifactoryNotifications.create({error: message});
-                $state.go('home',{location: "replace"});
-            }
-        }
-
-        if (toState.name.match(/^builds/) && !User.getCurrent().getCanDeploy()) {
-            toParams.tab = 'published';
-        }
-
-        if (toState.name === 'login' && $location.path() !== '/login' && $location.path() !== '/forgot-password' && $location.path() !== '/change-password' && $location.path() !== '/oauth_error' && !$location.path().startsWith('/resetpassword') && !$location.path().startsWith('/404') && !$location.path().startsWith('/403')) {
-            let afterLogin = ArtifactoryState.getState('urlAfterLogin');
-            if (!afterLogin) ArtifactoryState.setState('urlAfterLogin', $location.path());
-        }
-
-
-        // Permissions:
-
-        if (!User.getCurrent().canView(toState.name, toParams)) {
-            if (User.getCurrent().isProWithoutLicense()) {
-                $timeout(() => $location.path('admin/configuration/register_pro'));
-            }else {
-                if ($location.path() !== '/login') ArtifactoryState.setState('urlAfterLogin', $location.path());
-                e.preventDefault();
-                if (User.getCurrent().name === 'anonymous') {
-                    ArtifactoryNotifications.create({error: 'You are not authorized to view this page'});
-                    $timeout(() => $location.path('/login'));
-                }
-                else {
-                    $timeout(() => $location.path('/403'));
-                }
-            }
-        }
-        // Features per license:
-        else {
-            let feature = toParams.feature;
-            // Must verify footer data is available before checking (for initial page load)
-            FooterDao.get().then(() => {
-                if (ArtifactoryFeatures.isDisabled(feature) || ArtifactoryFeatures.isHidden(feature)) {
-                    ArtifactoryNotifications.create({error: 'Page unavailable'});
-                    e.preventDefault();
-                    $timeout(() => $location.path('/home'));
-                }
-            });
-        }
-
-        if (!e.defaultPrevented) {
-            ArtifactoryEventBus.dispatch(EVENTS.CLOSE_MODAL);
-        }
-    })
-}
-
-
-function checkDiscardConfirmation($q, e) {
-
-    let defer = $q.defer();
-    let forms = $('form');
-    let changeDiscovered = false;
-    for (let i = 0; i< forms.length; i++) {
-        let form = forms[i];
-        let controller = angular.element(form).controller();
-        if (controller && controller._$modelSaver$_ && controller._$modelSaver$_.confirmOnLeave && !controller._$modelSaver$_.isModelSaved()) {
-            changeDiscovered = true;
-
-            controller._$modelSaver$_.ask().then(()=>{
-                controller._$modelSaver$_.confirmOnLeave =   false;
-                defer.resolve();
-            });
-
-            break;
-        }
-    }
-
-    if (!changeDiscovered && !e) {
-        defer.resolve();
-    }
-    else if (changeDiscovered && e) {
-        e.preventDefault();
-    }
-
-    return defer.promise;
-
-}
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/artifacts.html b/web/angular-web/src/main/webapp/app/states/artifacts/artifacts.html
deleted file mode 100644
index d14f866..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/artifacts.html
+++ /dev/null
@@ -1,57 +0,0 @@
-<div ng-show="Artifact.hasData()"
-     class="content-layout-container with-head-bar"
-     id="jf-artifacts">
-    <jf-search></jf-search>
-
-    <div ui-view="search" class="ui-view-search"></div>
-
-    <div class="pull-right text-right deploy-btn disabled"
-         jf-tooltip="{{Artifact.tooltips.artifacts.deploy.disabled}}"
-         ng-if="!Artifact.user.getCanDeploy() && Artifact.$state.params.browser !== 'stash'">
-        <span class="icon icon-deploy"></span> Deploy
-    </div>
-    <div class="pull-right text-right deploy-btn"
-         ng-click="Artifact.openDeploy()"
-         ng-if="Artifact.user.getCanDeploy() && Artifact.$state.params.browser !== 'stash'">
-        <span class="icon icon-deploy"></span> Deploy
-    </div>
-    <div class="pull-right set-me-up"
-         ng-if="Artifact.$state.params.browser !== 'stash'"
-         ng-click="Artifact.openSetMeUp()">
-        <span class="icon icon-set-me-up"></span> Set Me Up
-    </div>
-
-    <h1 id="artifacts-browser-header" ng-if="Artifact.$state.params.browser !== 'stash'">Artifact Repository Browser</h1>
-    <h1 ng-if="Artifact.$state.params.browser === 'stash'">Stash Browser <a class="back-to-repository-browser" href="" ng-click="Artifact.exitStashState()"><span class="back-link-icon">‹</span>Back to Repository Browser</a></h1>
-
-    <div class="content-wrapper" ng-if="!Artifact.isSearchShown">
-        <div ui-layout>
-            <div ui-layout-container class="artifacts-outer-layout-container">
-                <div ui-layout="{flow : 'column', dividerSize : '15'}">
-                    <div ui-layout-container class="artifacts-list card" size="30%" min-size = "15%">
-                        <ui-view></ui-view>
-                    </div>
-
-                    <div ui-layout-container class="artifact-details card" size="70.5%" min-size="30%">
-                        <div class="artifact-details-header">
-                            <div class="pull-right text-right">
-                                <jf-actions parent-controller="Artifact" init-method="initActions" fixed-actions-names="['Download','View']"></jf-actions>
-                            </div>
-                            <div>
-                                <i class="jstree-icon jstree-themeicon jstree-themeicon-custom" ng-class="Artifact.getNodeIcon()" role="presentation"></i>
-                                <h2 class="artifact-name-heading" jf-tooltip-on-overflow>{{Artifact.node.data.isTrashcan() ? 'Trash Can' : Artifact.node.data.text}}</h2>
-                            </div>
-                        </div>
-                        <jf-artifact-info></jf-artifact-info>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
-</div>
-
-<div class="alert alert-warning"
-     ng-if="!Artifact.hasData()">
-    <div>Artifacts data is unavailable.</div>
-    <div>You have no read permissions to any repository.</div>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/artifacts.module.js b/web/angular-web/src/main/webapp/app/states/artifacts/artifacts.module.js
deleted file mode 100644
index 27a8064..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/artifacts.module.js
+++ /dev/null
@@ -1,97 +0,0 @@
-import EVENTS   from '../../constants/artifacts_events.constants';
-import {ArtifactsController} from './artifacts/artifacts.controller';
-import {BrowsersController} from './browsers/browsers.controller';
-import {SearchController} from './search/search.controller';
-import {jfTreeSearch}        from './jf_tree_search/jf_tree_search';
-import {jfTreeBrowser}   from './jf_tree_browser/jf_tree_browser';
-import {jfStashBrowser}   from './jf_stash_browser/jf_stash_browser';
-import {jfSimpleBrowser}   from './jf_simple_browser/jf_simple_browser';
-import {selectTargetPathFactory}   from './services/select_target_path';
-import {commonGridColumns}   from './services/common_grid_columns';
-import {selectDeleteVersionsFactory}   from './services/select_delete_versions';
-import {jfArtifactInfo}  from './jf_artifact_info/jf_artifact_info';
-import infoTabs          from './jf_artifact_info/info_tabs/info_tabs.module';
-
-function artifactsConfig($stateProvider, $urlMatcherFactoryProvider) {
-
-    $urlMatcherFactoryProvider.type('pathParam', {
-        encode: function (item) {
-            return item;
-        },
-        decode: function (item) {
-            return item;
-        },
-        is: function (item) {
-            return true;
-        }
-    });
-    $stateProvider
-            .state('artifacts', {
-                url: '/artifacts',
-                parent: 'app-layout',
-                abstract: true,
-                templateUrl: 'states/artifacts/artifacts.html',
-                controller: 'ArtifactsController as Artifact',
-                onExit: (ArtifactoryState, TreeBrowserDao) => {
-                    // Stop saving last state of tree
-                    ArtifactoryState.removeState('lastTreeState');
-                    // Invalidate the tree node cache
-                    TreeBrowserDao.invalidateRoots();
-                },
-                onEnter: (ArtifactoryState) => {
-                    // This should be true only when going from tree to simple before selecting any node in the tree
-                    ArtifactoryState.setState('tree_touched', false);
-                }
-            })
-            .state('artifacts.browsers', {
-                url: '/browse/{browser}',
-                templateUrl: 'states/artifacts/browsers/browsers.html',
-                controller: 'BrowsersController as Browsers',
-                onEnter: (ArtifactoryStorage, $stateParams) => {
-                    if ($stateParams.browser !== 'stash') ArtifactoryStorage.setItem('BROWSER', $stateParams.browser);
-                }
-            })
-            .state('artifacts.browsers.search', {
-                url: '/search/{searchType}/{params}',
-                params: {searchParams: {}},
-/*
-//              MOVED TO artifactory.states.module.js to prevent error message (ui-router bug workaround)
-
-                onEnter: (ArtifactoryEventBus, $stateParams) => {
-                    ArtifactoryEventBus.dispatch(EVENTS.SEARCH_URL_CHANGED, $stateParams);
-                },
-*/
-                views: {
-                    'search at artifacts': {
-                        templateUrl: 'states/artifacts/search/search.html',
-                        controller: 'SearchController as Search'
-                    }
-                }
-
-            })
-            .state('artifacts.browsers.path', {
-                url: '/{tab}/{artifact:pathParam}',
-                onEnter: (ArtifactoryEventBus, $stateParams, ArtifactoryState) => {
-                    // Save state of tree
-                    ArtifactoryState.setState('lastTreeState', {name: 'artifacts.browsers.path', params: $stateParams});
-                    ArtifactoryEventBus.dispatch(EVENTS.ARTIFACT_URL_CHANGED, $stateParams);
-                },
-                params: {
-                    forceLoad: false // used to force reload of state even if it's the same artifact
-                }
-            })
-}
-
-export default angular.module('artifacts', ['infoTabs'])
-        .config(artifactsConfig)
-        .controller('ArtifactsController', ArtifactsController)
-        .controller('BrowsersController', BrowsersController)
-        .controller('SearchController', SearchController)
-        .directive('jfTreeSearch', jfTreeSearch)
-        .directive('jfTreeBrowser', jfTreeBrowser)
-        .directive('jfSimpleBrowser', jfSimpleBrowser)
-        .directive('jfStashBrowser', jfStashBrowser)
-        .directive('jfArtifactInfo', jfArtifactInfo)
-        .factory('selectTargetPath', selectTargetPathFactory)
-        .factory('commonGridColumns', commonGridColumns)
-        .factory('selectDeleteVersions', selectDeleteVersionsFactory)
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/artifacts/artifacts.controller.js b/web/angular-web/src/main/webapp/app/states/artifacts/artifacts/artifacts.controller.js
deleted file mode 100644
index 61aee71..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/artifacts/artifacts.controller.js
+++ /dev/null
@@ -1,99 +0,0 @@
-import EVENTS   from '../../../constants/artifacts_events.constants';
-import TOOLTIPS from '../../../constants/artifact_tooltip.constant';
-import ICONS from '../constants/artifact_browser_icons.constant';
-import ACTIONS from '../../../constants/artifacts_actions.constants';
-
-export class ArtifactsController {
-    constructor($scope, $state, ArtifactoryEventBus, ArtifactoryState, SetMeUpModal, ArtifactoryDeployModal, User, ArtifactActions) {
-
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.$state = $state;
-        this.$scope = $scope;
-        this.node = null;
-        this.deployModal = ArtifactoryDeployModal;
-        this.setMeUpModal = SetMeUpModal;
-        this.artifactoryState = ArtifactoryState;
-        this.tooltips = TOOLTIPS;
-        this.icons = ICONS;
-        this.artifactActions = ArtifactActions;
-
-        this.user = User.getCurrent();
-
-        this.initEvents();
-    }
-
-
-    getNodeIcon() {
-        if (this.node && this.node.data) {
-            let type = this.icons[this.node.data.iconType];
-            if (!type) type = this.icons['default'];
-            return type && type.icon;
-        }
-    }
-
-
-    openSetMeUp() {
-        this.setMeUpModal.launch(this.node);
-    }
-
-    openDeploy() {
-        this.deployModal.launch(this.node);
-    }
-
-    initEvents() {
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TREE_NODE_SELECT, node => this.selectNode(node));
-
-        this.artifactoryEventBus.registerOnScope(this.$scope, [EVENTS.ACTION_WATCH, EVENTS.ACTION_UNWATCH], () => {
-            this.node.data.refreshWatchActions()
-                .then(() => {
-                    this.actionsController.setActions(this.node.data.actions);
-                });
-        });
-
-    }
-
-    selectNode(node) {
-
-        let previousNode = this.node;
-        this.node = node;
-
-        if (node.data) {
-            this.artifactoryState.setState('repoKey', this.node.data.repoKey);
-            let location = true;
-            if (this.$state.current.name === 'artifacts.browsers.path' && (!previousNode || (!this.$state.params.artifact && this.$state.params.tab !== 'StashInfo'))) {
-                // If no artifact and selecting artifact - replace the location (fix back button bug)
-                location = 'replace';
-            }
-            this.$state.go(this.$state.current, {artifact: node.data.fullpath}, {location: location});
-
-            this.actionsController.setCurrentEntity(node);
-            this.node.data.getDownloadPath()
-                .then(() => {
-                    let downloadAction = _.findWhere(node.data.actions,{name: 'Download'});
-                    if (downloadAction) {
-                        downloadAction.href = node.data.actualDownloadPath;
-                    }
-                    this.actionsController.setActions(node.data.actions)
-                });
-        }
-        else {
-            this.artifactoryState.removeState('repoKey');
-            this.$state.go(this.$state.current, {artifact: ''});
-            this.actionsController.setActions([]);
-        }
-    }
-
-    exitStashState() {
-        this.artifactoryEventBus.dispatch(EVENTS.ACTION_EXIT_STASH);
-    }
-
-    hasData() {
-        return this.artifactoryState.getState('hasArtifactsData') !== false;
-    }
-
-    initActions(actionsController) {
-        this.actionsController = actionsController;
-        actionsController.setActionsHandler(this.artifactActions);
-        actionsController.setActionsDictionary(ACTIONS);
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/browsers/browsers.controller.js b/web/angular-web/src/main/webapp/app/states/artifacts/browsers/browsers.controller.js
deleted file mode 100644
index 6dfcf2b..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/browsers/browsers.controller.js
+++ /dev/null
@@ -1,77 +0,0 @@
-import EVENTS   from '../../../constants/artifacts_events.constants';
-export class BrowsersController {
-    constructor($scope, $stateParams, $state, TreeBrowserDao, ArtifactoryEventBus, hotkeys, ArtifactoryState) {
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.stateParams = $stateParams;
-        this.state = $state;
-        this.treeBrowserDao = TreeBrowserDao;
-        this.artifactoryState = ArtifactoryState;
-        this.compactFolders = TreeBrowserDao.getCompactFolders();
-        this.$scope = $scope;
-        this.hotkeys = hotkeys;
-        this._setupKeyHints();
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TREE_NODE_SELECT, node => this.selectedNode = node);
-
-        let activeFilter = this.artifactoryState.getState('activeFilter');
-        this.activeFilter = activeFilter ? true : false;
-        this.searchText = activeFilter || '';
-
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TREE_SEARCH_RUNNING, (running) => {
-            this.searchInAction = running;
-        });
-    }
-
-    toggleCompactFolders() {
-        this.treeBrowserDao.setCompactFolders(this.compactFolders);
-        this.artifactoryEventBus.dispatch(EVENTS.TREE_COMPACT, this.compactFolders);
-    }
-
-    showTreeSearch() {
-        this.artifactoryEventBus.dispatch(EVENTS.ACTIVATE_TREE_SEARCH);
-    }
-
-    switchBrowser(browser) {
-        this.artifactoryState.setState('activeFilter', this.activeFilter ? this.searchText : undefined);
-
-        // Reclicking simple browser when we are already in simple browser - go to root
-        if (browser === 'simple' && this.stateParams.browser === 'simple') {
-            let repo = this.selectedNode.data.getRoot();
-            // Make sure roots are visible:
-            this.artifactoryState.setState('tree_touched', false);
-            // Use forceLoad as a Date to ensure state transition even if it's the same as before
-            this.state.go(this.state.current.name, {browser: browser, artifact: repo.fullpath, forceLoad: new Date()});
-        }
-        else if (browser === 'tree' && this.stateParams.browser === 'tree') {
-            this.artifactoryEventBus.dispatch(EVENTS.TREE_COLLAPSE_ALL);
-        }
-        else if (browser != this.stateParams.browser) {
-            this.state.go(this.state.current.name, {browser: browser});
-        }
-    }
-
-    _setupKeyHints() {
-        this.hotkeys.bindTo(this.$scope).add({
-            combo: 'Enter',
-            description: 'Select node'
-        }).add({
-            combo: 'Esc',
-            description: 'Cancel search / deselect node'
-        }).add({
-            combo: 'Down',
-            description: 'Navigate down in tree / in search results'
-        }).add({
-            combo: 'Up',
-            description: 'Navigate up in tree / in search results'
-        }).add({
-            combo: 'Right',
-            description: 'Expand folder'
-        }).add({
-            combo: 'Left',
-            description: 'Collapse folder'
-        });
-    }
-
-    clearFilter() {
-        this.artifactoryEventBus.dispatch(EVENTS.TREE_SEARCH_CANCEL);
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/browsers/browsers.html b/web/angular-web/src/main/webapp/app/states/artifacts/browsers/browsers.html
deleted file mode 100644
index fb0b981..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/browsers/browsers.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<div class="tree-browser-header">
-    <div class="tree-browser-header-tabs">
-        <a class="tree-browser-tab" ng-class="{active: Browsers.stateParams.browser === 'tree'}"
-           ng-hide="Browsers.stateParams.browser === 'stash'"
-           ng-click="Browsers.switchBrowser('tree')">Tree</a>
-        <a class="tree-browser-tab" ng-class="{active: Browsers.stateParams.browser === 'simple'}"
-           ng-hide="Browsers.stateParams.browser === 'stash'"
-           ng-click="Browsers.switchBrowser('simple')">Simple</a>
-        <a class="icon icon-search" jf-tooltip="Quick Find" ng-click="Browsers.showTreeSearch()"></a>
-    </div>
-    <div class="tree-browser-header-hide">
-        <div class="hide-empty-folders">
-            <jf-checkbox text="Compress Empty Folders">
-                <input type="checkbox"
-                       ng-change="Browsers.toggleCompactFolders()"
-                       ng-model="Browsers.compactFolders">
-            </jf-checkbox>
-        </div>
-    </div>
-</div>
-<div class="tree-browser-container" ng-class="{'expanded': Browsers.activeFilter}">
-    <div class="tree-head-expansion">
-        <div class="labeled-item"
-             ng-if="Browsers.activeFilter">{{Browsers.searchText}}
-            <a href=""
-               class="remove"
-               tabindex="-1"
-               title="Remove"
-               ng-click="Browsers.clearFilter()">×</a>
-        </div>
-    </div>
-    <jf-tree-search></jf-tree-search>
-    <div ng-if="Browsers.stateParams.browser === 'tree'">
-        <jf-tree-browser browser-controller="Browsers"></jf-tree-browser>
-    </div>
-    <div ng-if="Browsers.stateParams.browser === 'simple'">
-        <jf-simple-browser browser-controller="Browsers"></jf-simple-browser>
-    </div>
-    <div ng-if="Browsers.stateParams.browser === 'stash'">
-        <jf-stash-browser start-compact="Browsers.compactFolders"></jf-stash-browser>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/constants/artifact_browser_icons.constant-old.js b/web/angular-web/src/main/webapp/app/states/artifacts/constants/artifact_browser_icons.constant-old.js
deleted file mode 100644
index 4d54858..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/constants/artifact_browser_icons.constant-old.js
+++ /dev/null
@@ -1,56 +0,0 @@
-export default {
-    "default": {
-        "icon": "icon icon-general"
-    },
-    "go_up": {
-        "icon": ""
-    },
-    "localRepository": {
-        "icon": "icon icon-local-repo"
-    },
-    "cachedRepository": {
-        "icon": "icon icon-cached-repo"
-    },
-    "virtualRepository": {
-        "icon": "icon icon-virtual-repo"
-    },
-    "remoteRepository": {
-        "icon": "icon icon-remote-repo"
-    },
-    "folder": {
-        "icon": "icon icon-folder"
-    },
-    "compactedFolder": {
-        "icon": "icon icon-folder-compact"
-    },
-    "application/java-archive": {
-        "icon": "icon icon-archive"
-    },
-    "application/x-maven-pom+xml": {
-        "icon": "icon icon-pom"
-    },
-    "application/xml": {
-        "icon": "icon icon-xml"
-    },
-    "application/pdf": {
-        "icon": "icon icon-pdf"
-    },
-    "text/html": {
-        "icon": "icon icon-html"
-    },
-    "text/plain": {
-        "icon": "icon icon-txt"
-    },
-    "text/css": {
-        "icon": "icon icon-css"
-    },
-    "application/json": {
-        "icon": "icon icon-json"
-    },
-    "application/x-debian-package": {
-        "icon": "icon icon-deb"
-    },
-    "application/javascript": {
-        "icon": "icon icon-js"
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/constants/artifact_browser_icons.constant.js b/web/angular-web/src/main/webapp/app/states/artifacts/constants/artifact_browser_icons.constant.js
deleted file mode 100644
index 2efc590..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/constants/artifact_browser_icons.constant.js
+++ /dev/null
@@ -1,113 +0,0 @@
-export default {
-    "default": {
-        "icon": "icon icon-general"
-    },
-    "virtualRemoteFile": {
-        "icon": "icon icon-general"
-    },
-    "go_up": {
-        "icon": ""
-    },
-    "localRepository": {
-        "icon": "icon icon-local-repo"
-    },
-    "cachedRepository": {
-        "icon": "icon icon-cached-repo"
-    },
-    "virtualRepository": {
-        "icon": "icon icon-virtual-repo"
-    },
-    "distributionRepository": {
-        "icon": "icon icon-distribution-repo"
-    },
-    "remoteRepository": {
-        "icon": "icon icon-remote-repo"
-    },
-    "stash": {
-        "icon": "icon icon-search"
-    },
-    "trashcan": {
-        "icon": "icon icon-trash"
-    },
-    "folder": {
-        "icon": "icon icon-folder"
-    },
-    "virtualRemoteFolder": {
-        "icon": "icon icon-folder"
-    },
-    "compactedFolder": {
-        "icon": "icon icon-folder"
-    },
-    "application/x-maven-pom+xml": {
-        "icon": "icon icon-pom"
-    },
-    "application/xml": {
-        "icon": "icon icon-xml"
-    },
-    "application/pdf": {
-        "icon": "icon icon-pdf"
-    },
-    "text/html": {
-        "icon": "icon icon-html"
-    },
-    "text/plain": {
-        "icon": "icon icon-txt"
-    },
-    "text/css": {
-        "icon": "icon icon-css"
-    },
-    "application/json": {
-        "icon": "icon icon-json"
-    },
-    "application/x-debian-package": {
-        "icon": "icon icon-deb"
-    },
-    "application/javascript": {
-        "icon": "icon icon-js"
-    },
-    "application/x-rubygems": {
-        "icon": "icon icon-ruby-gems"
-    },
-    "text/x-java-source": {
-        "icon": "icon icon-java"
-    },
-    "x-groovy-source": {
-        "icon": "icon icon-groovy"
-    },
-    "text/x-c": {
-        "icon": "icon icon-c"
-    },
-    "text/x-csharp": {
-        "icon": "icon icon-c-2"
-    },
-    "application/zip": {
-        "icon": "icon icon-zip"
-    },
-    "application/x-gzip": {
-        "icon": "icon icon-gz"
-    },
-    "application/x-gtar": {
-        "icon": "icon icon-gz"
-    },
-    "application/x-tar": {
-        "icon": "icon icon-tar"
-    },
-    "application/x-nupkg": {
-        "icon": "icon icon-nuget"
-    },
-    "application/x-rpm": {
-        "icon": "icon icon-rpm"
-    },
-    "text/x-scala-source": {
-        "icon": "icon icon-scala"
-    },
-    "application/java-archive": {
-        "icon": "icon icon-jar"
-    },
-    "application/octet-stream": {
-        "icon": "icon icon-general"
-    },
-    "docker": {
-        "icon": "icon icon-docker"
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/constants/artifact_general.constant.js b/web/angular-web/src/main/webapp/app/states/artifacts/constants/artifact_general.constant.js
deleted file mode 100644
index 700a8f3..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/constants/artifact_general.constant.js
+++ /dev/null
@@ -1,200 +0,0 @@
-export default {
-    'name': 'Name',
-    'description': 'Description',
-    'artifactsCount': 'Artifact Count',
-    'repositoryPath': 'Repository Path',
-    'bintrayOrg': 'Bintray Organization',
-    'bintrayProduct': 'Bintray Product',
-    'bintrayUrl': 'Bintray Link',
-    'distPackageType': 'Package Type',
-    'repositoryLayout': 'Repository Layout',
-    'repoType': 'Package Type',
-    'remoteRepoUrl': 'Remote Repository URL',
-    'created': 'Created',
-    'deployedBy': 'Deployed by',
-    'licenses': 'Licenses',
-    'filtered': 'Filtered',
-    'downloaded': 'Downloaded',
-    'remoteDownloaded': 'Remote Downloaded',
-    'moduleID': 'Module ID',
-    'size': 'Size',
-    'lastModified': 'Last Modified',
-    'lastDownloaded': 'Last Downloaded',
-    'lastRemoteDownloaded': 'Remote Last Downloaded',
-    'compressed': 'Compressed',
-    'crc': 'CRC',
-    'modificationTime': 'Modification Time',
-    'path': 'Path',
-    'watchingSince': 'Watching Since',
-    'lastDownloadedBy': 'Last Downloaded By',
-    'lastRemoteDownloadedBy': 'Remote Last Downloaded By',
-    'lastReplicationStatus': 'Last Replication Status',
-    'signingKeyLink': 'Signing Key',
-    'externalUrl': 'External URL',
-    tabs: {
-        General: 'General',
-        Properties: 'Properties',
-        EffectivePermission: 'Effective Permissions',
-        Watch: 'Watchers',
-        Builds: 'Builds',
-        BlackDuck: 'Governance',
-        'GeneralXml': 'Xml View',
-        'ViewSource': 'View Source',
-        'NuPkgInfo': 'NuPkg Info',
-        'PomView': 'Pom View',
-        'IVYXml': 'Ivy View',
-        'RubyGems': 'RubyGems',
-        'NpmInfo': 'Npm Info',
-        'PyPIInfo': 'PyPI Info',
-        'BowerInfo': 'Bower Info',
-        'DockerInfo': 'Docker Info',
-        'DockerAncestryInfo': 'Docker Ancestry',
-        'DockerV2Info': 'Docker Info',
-        'Rpm': 'Rpm Info',
-        'Cocoapods': 'Cocoapods Info',
-        'StashInfo': 'Stash Info'
-    },
-    nuget: {
-        authors: 'Authors',
-        owners: 'Owners',
-        pkgTitle: 'Title',
-        tags: 'Tags',
-        version: 'Version',
-        requireLicenseAcceptance: 'Require License Acceptance',
-        id: 'ID',
-        title: 'Title',
-        languages: 'Languages',
-        releaseNotes: 'Release Notes',
-        summary: 'Summary',
-        projectUrl: 'Project URL',
-        copyright: 'Copyright',
-        licenseUrl: 'License URL'
-
-    },
-    docker: {
-        //Info:
-        imageId: 'Image Id',
-        parent: 'Parent Id',
-        created: 'Created',
-        container: 'Container',
-        dockerVersion: 'Docker Version',
-        author: 'Author',
-        architecture: 'Architecture',
-        os: 'OS',
-
-        //Config:
-        size: 'Size',
-        hostname: 'Hostname',
-        domainName: 'DomainName',
-        user: 'User',
-        memory: 'Memory',
-        memorySwap: 'MemorySwap',
-        cpuShares: 'CpuShares',
-        cpuSet: 'CpuSet',
-        attachStdin: 'AttachStdin',
-        attachStdout: 'AttachStdout',
-        attachStderr: 'AttachStderr',
-        portSpecs: 'portSpecs',
-        exposedPorts: 'exposedPorts',
-        tty: 'Tty',
-        openStdin: 'OpenStdin',
-        stdinOnce: 'StdinOnce',
-        env: 'Env',
-        cmd: 'Cmd',
-        image: 'Image',
-        volumes: 'Volumes',
-        workingDir: 'WorkingDir',
-        entryPoint: 'EntryPoint',
-        networkDisabled: 'NetworkDisabled',
-        onBuild: 'OnBuild'
-
-    },
-    dockerAncestry: {
-        size: 'Virtual Size'
-    },
-    dockerV2: {
-        title: 'Title',
-        digest: 'Digest',
-        ports: 'Ports',
-        totalSize: 'Total Size',
-        volumes: 'Volumes'
-    },
-    pyPi: {
-        name: 'Name',
-        author: 'Author',
-        authorEmail : 'Author Email',
-        homepage: 'Homepage',
-        downloadUrl: 'Download URL',
-        platform: 'Platform',
-        version: 'Version',
-        license: 'License',
-        keywords: 'Keywords',
-        summary: 'Summary'
-    },
-    bower: {
-        name: 'Name',
-        description: 'Description',
-        version: 'Version',
-        license: 'License',
-        keywords: 'Keywords',
-        repository: 'Repository'
-    },
-    rubyGems: {
-        authors: 'Authors',
-        owners: 'Owners',
-        description: 'Description',
-        homepage: 'Homepage',
-        name: 'Name',
-        platform: 'Platform',
-        summary: 'Summary',
-        repositoryPath: 'Repository Path',
-        version: 'Version'
-
-    },
-    npm: {
-        name: 'Name',
-        version: 'Version',
-        license: 'License',
-        description: 'Description',
-        keywords: 'Keywords',
-        repository: 'Repository'
-    },
-    rpm: {
-        buildDate: 'Build Date',
-        epoch: 'Epoch',
-        name: "Name",
-        release: "Release",
-        size: 'Size',
-        summary: "Summary",
-        version: "Version",
-        buildHost: "Build Host",
-        packager: "Packager",
-        sourceRpm: "Source Rpm",
-        url: "URL",
-        vendor: "Vendor"
-
-    },
-    cocoapods: {
-        name: 'Name',
-        description: 'Description',
-        version: 'Version',
-        license: 'License',
-        keywords: 'Keywords'
-    },
-    governance: {
-        name: 'Component Name',
-        version: 'Component Version',
-        componentId: 'Component ID',
-        extComponentId: 'External Component ID',
-        homepage: 'Homepage',
-        description: 'Description',
-        catalogComponent: 'Catalog Component'
-    },
-    trash: {
-        deletedTime: 'Deleted Time',
-        deletedBy: 'Deleted By',
-        originalRepository: "Original Repository",
-        originalRepositoryType: "Original Repository Type",
-        originalPath: "Original Path"
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/info_tabs.module.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/info_tabs.module.js
deleted file mode 100644
index a8d2dbf..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/info_tabs.module.js
+++ /dev/null
@@ -1,46 +0,0 @@
-import {jfBuilds}                    from './jf_builds';
-import {jfEffectivePermissions}      from './jf_effective_permissions';
-import {jfWatchers}                  from './jf_watchers';
-import {jfGeneral}                   from './jf_general';
-import {jfGovernance}                from './jf_governance';
-import {jfProperties}                from './jf_properties';
-import {jfViewSource}                from './jf_view_source';
-import {jfPomView}                from './jf_pom_view';
-import {jfXmlView}                from './jf_xml_view';
-import {jfIvyView}                from './jf_ivy_view';
-import {jfNuget}                from './jf_nuget';
-import {jfPyPi}                from './jf_pypi';
-import {jfBower}                from './jf_bower';
-import {jfDocker}                from './jf_docker';
-import {jfDockerAncestry}                from './jf_docker_ancestry';
-import {jfDockerV2}                from './jf_docker_v2';
-import {jfRubyGems}                from './jf_ruby_gems';
-import {jfNpmInfo}                from './jf_npm_info';
-import {jfRpm}                from './jf_rpm_info';
-import {jfCocoapods}                from './jf_cocoapods';
-import {jfStashInfo}                from './jf_stash_info';
-
-export default angular.module('infoTabs', [])
-        .directive({
-            'jfBuilds': jfBuilds,
-            'jfEffectivePermissions': jfEffectivePermissions,
-            'jfWatchers': jfWatchers,
-            'jfGeneral': jfGeneral,
-            'jfGovernance': jfGovernance,
-            'jfProperties': jfProperties,
-            'jfViewSource': jfViewSource,
-            'jfPomView': jfPomView,
-            'jfXmlView': jfXmlView,
-            'jfIvyView': jfIvyView,
-            'jfNuget': jfNuget,
-            'jfPyPi': jfPyPi,
-            'jfBower': jfBower,
-            'jfDocker': jfDocker,
-            'jfDockerAncestry': jfDockerAncestry,
-            'jfDockerV2': jfDockerV2,
-            'jfRubyGems': jfRubyGems,
-            'jfNpmInfo': jfNpmInfo,
-            'jfRpm': jfRpm,
-            'jfCocoapods': jfCocoapods,
-            'jfStashInfo': jfStashInfo
-        });
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_bower.html b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_bower.html
deleted file mode 100644
index 6b8b4eb..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_bower.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<div class="bower">
-    <jf-panel jf-panel-heading="Package Info"
-              ng-if="jfBower.bowerData.bowerPkgInfo">
-
-        <div ng-repeat="(key,value) in jfBower.bowerData.bowerPkgInfo"
-             class="artifact-file-icon"
-             ng-if="key == 'iconUrl'">
-            <img ng-src="{{value}}" alt="logo"/>
-        </div>
-
-        <table class="jf-data-table">
-            <tr ng-repeat="(key,value) in jfBower.bowerData.bowerPkgInfo" ng-if="key != 'iconUrl'">
-                <td>{{jfBower.DICTIONARY[key]}}:</td>
-                <td>{{value}}</td>
-            </tr>
-        </table>
-    </jf-panel>
-    <jf-panel jf-panel-heading="Dependencies"
-              ng-if="jfBower.bowerData.bowerDependencies">
-        <jf-grid grid-options="jfBower.gridDependenciesOptions"
-                no-pagination="true"></jf-grid>
-    </jf-panel>
-    <jf-panel jf-panel-heading="Main Files"
-              ng-if="jfBower.bowerData.mainFiles.length">
-        <ul class="list-group">
-            <li class="list-group-item" ng-repeat="mainFile in jfBower.bowerData.mainFiles">{{mainFile}}</li>
-        </ul>
-    </jf-panel>
-    <jf-panel jf-panel-heading="Ignored Files"
-              ng-if="jfBower.bowerData.ignoredFiles.length">
-        <ul class="list-group">
-            <li class="list-group-item" ng-repeat="ignoredFile in jfBower.bowerData.ignoredFiles">
-                {{ignoredFile}}
-            </li>
-        </ul>
-    </jf-panel>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_bower.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_bower.js
deleted file mode 100644
index a8cf267..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_bower.js
+++ /dev/null
@@ -1,87 +0,0 @@
-import EVENTS from '../../../../constants/artifacts_events.constants';
-import DICTIONARY from './../../constants/artifact_general.constant';
-class jfBowerController {
-    constructor($scope, ArtifactViewsDao, ArtifactoryEventBus, ArtifactoryGridFactory) {
-        this.artifactViewsDao = ArtifactViewsDao;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.DICTIONARY = DICTIONARY.bower;
-        this.gridDependenciesOptions = {};
-        this.bowerData = {};
-        this.$scope = $scope;
-        this._initBower();
-    }
-
-    _initBower() {
-        this._registerEvents();
-        this.getBowerData();
-    }
-
-    getBowerData() {
-        //Temp fix for preventing fetching data for non-file nodes (occurred when pressing "Artifacts" on sidebar)
-        if (!this.currentNode.data.path) {
-            return;
-        }
-
-        this.artifactViewsDao.fetch({
-            "view": "bower",
-            "repoKey": this.currentNode.data.repoKey,
-            "path": this.currentNode.data.path
-        }).$promise
-                .then((data) => {
-                    this.bowerData = data;
-                    this._createGrid();
-                });
-    }
-
-    _createGrid() {
-        if (this.bowerData.bowerDependencies) {
-            if (!Object.keys(this.gridDependenciesOptions).length) {
-                this.gridDependenciesOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                        .setRowTemplate('default')
-                        .setColumns(this._getColumns())
-                        .setGridData(this.bowerData.bowerDependencies)
-            }
-            else {
-                this.gridDependenciesOptions.setGridData(this.bowerData.bowerDependencies)
-            }
-        }
-    }
-
-    _getColumns() {
-        return [{
-            name: 'Name',
-            displayName: 'Name',
-            field: 'name'
-        },
-        {
-            name: 'Version',
-            displayName: 'Version',
-            field: 'version'
-        }];
-    }
-
-    _registerEvents() {
-        let self = this;
-
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TAB_NODE_CHANGED, (node) => {
-            if (this.currentNode != node) {
-                this.currentNode = node;
-                self.getBowerData();
-            }
-        });
-    }
-
-}
-export function jfBower() {
-    return {
-        restrict: 'EA',
-        controller: jfBowerController,
-        controllerAs: 'jfBower',
-        scope: {
-            currentNode: '='
-        },
-        bindToController: true,
-        templateUrl: 'states/artifacts/jf_artifact_info/info_tabs/jf_bower.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_builds.html b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_builds.html
deleted file mode 100644
index 5b00a3a..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_builds.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<div class="builds-tab">
-    <jf-switch jf-switch-title="View:" ng-model="jfBuilds.mode" options="jfBuilds.viewBySwitch" controller="jfBuilds.switchControl"></jf-switch>
-
-    <div ng-switch="jfBuilds.mode">
-        <div ng-switch-when="ProducedBy">
-            <jf-grid grid-options="jfBuilds.producedByGridOptions"
-                     filter-field="name"
-                     filter-field2="number"
-                     filter-on-change="true">
-            </jf-grid>
-        </div>
-        <div ng-switch-when="UsedBy">
-            <jf-grid grid-options="jfBuilds.usedByGridOptions"
-                     filter-field="name"
-                     filter-field2="number"
-                     filter-on-change="true">
-            </jf-grid>
-        </div>
-    </div>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_builds.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_builds.js
deleted file mode 100644
index 84b94b8..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_builds.js
+++ /dev/null
@@ -1,175 +0,0 @@
-import EVENTS from '../../../../constants/artifacts_events.constants';
-let headerCellGroupingTemplate = require("raw!../../../../ui_components/artifactory_grid/templates/headerCellTemplate.html");
-
-class jfBuildsController {
-    constructor($state, ArtifactoryGridFactory, ArtifactBuildsDao, $scope, ArtifactoryEventBus, ArtifactoryModal, uiGridConstants) {
-        this.uiGridConstants = uiGridConstants;
-        this.producedByGridOptions = {};
-        this.usedByGridOptions = {};
-        this.$state = $state;
-        this.buildsDao = ArtifactBuildsDao.getInstance();
-        this.$scope = $scope;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.modal = ArtifactoryModal;
-        this.mode = 'ProducedBy';
-        this.builds = {};
-
-        this._generateViewBySwitch();
-        this._registerEvents();
-        this._createGrids();
-        this._getBuildData();
-    }
-
-    downloadJson(build) {
-        this.buildsDao.getJson({
-            buildNumber: build.number,
-            buildName: build.name,
-            startTime: build.started
-        })
-            .$promise.then((result) => {
-                this.modal.launchCodeModal('Build #' + build.number, result.json,
-                    {name: "javascript", json: true});
-            });
-    }
-
-    _getBuildData() {
-        // if the node does not have a path the build cannot be loaded
-        // this may occur in navigation to a node that does not have a path (repo node)
-        if (!this.currentNode.data.path) {
-            return;
-        }
-
-        this.buildsDao.query({
-            path: this.currentNode.data.path,
-            repoKey: this.currentNode.data.repoKey
-        }).$promise.then((builds) => {
-                    this.builds = builds;
-                    this.producedByGridOptions.setGridData(builds.producedBy);
-                    this.usedByGridOptions.setGridData(builds.usedBy);
-                    this._generateViewBySwitch();
-                });
-    }
-
-    _generateViewBySwitch() {
-        this.viewBySwitch = [
-            {
-                text: 'Produced By' + (this.producedByGridOptions.data && this.producedByGridOptions.data.length ? ' (' + this.builds.producedBy.length + ')' : ''),
-                value: 'ProducedBy'
-            },
-            {
-                text: 'Used By' + (this.usedByGridOptions.data && this.usedByGridOptions.data.length ? ' (' + this.builds.usedBy.length + ')' : ''),
-                value: 'UsedBy'
-            }
-        ];
-
-        if (this.switchControl) {
-            this.switchControl.options = this.viewBySwitch;
-            this.switchControl.updateOptionObjects();
-        }
-    }
-
-    _registerEvents() {
-        let self = this;
-
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TAB_NODE_CHANGED, (node) => {
-            if (this.currentNode !== node) {
-                this.currentNode = node;
-                self._getBuildData();
-            }
-        });
-    }
-
-    _createGrids() {
-        this.producedByGridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-            .setColumns(this._getProducedByColumns())
-            .setRowTemplate('default')
-            .setButtons(this._getActions());
-        this.usedByGridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-            .setColumns(this._getUsedByColumns())
-            .setRowTemplate('default')
-            .setButtons(this._getActions());
-    }
-
-    _getProducedByColumns() {
-        let columns = this._getCommonColumns();
-        columns.splice(4, 0, {
-                displayName: 'Started At',
-                name: 'Started At',
-                cellTemplate: '<div class="ui-grid-cell-contents">{{ row.entity.startedString }}</a>',
-                field: "started",
-                type: 'number'
-            });
-        return columns;
-    }
-
-    _getCommonColumns() {
-        return [{
-            displayName: 'Project Name',
-            sort: {
-                direction: this.uiGridConstants.ASC
-            },
-            name: 'Project Name',
-            headerCellTemplate: headerCellGroupingTemplate,
-            grouped: true,
-            field: "name",
-            cellTemplate: '<div id="project-name" ></div>',
-        }, {
-            displayName: 'Build ID',
-            name: 'Build ID',
-            grouped: true,
-            headerCellTemplate: headerCellGroupingTemplate,
-            field: "number",
-            cellTemplate: '<div class="ui-grid-cell-contents"><a ui-sref="builds.info({buildName:row.entity.name,buildNumber:row.entity.number,tab:\'general\',startTime:row.entity.started})" id="build-id">{{row.entity.number}}</a></div>'
-        }, {
-            name: 'Module ID',
-            displayName: 'Module ID',
-            headerCellTemplate: headerCellGroupingTemplate,
-            grouped: true,
-            field: "moduleID",
-            cellTemplate: '<div class="ui-grid-cell-contents"><a ui-sref="builds.info({buildName:row.entity.name,buildNumber:row.entity.number,tab:\'published\',startTime:row.entity.started,moduleID:row.entity.moduleID})" id="module-id" >{{row.entity.moduleID}}</a></div>'
-        }, {
-            displayName: 'CI Server',
-            name: 'CI Server',
-            field: "ciUrl",
-            cellTemplate: '<div class="ui-grid-cell-contents"><a ng-href="{{row.entity.ciUrl}}" target="_blank" id="ci-server">{{row.entity.ciUrl}}</a></div>'
-        }];
-    }
-
-    _getUsedByColumns() {
-        let columns = this._getCommonColumns();
-        columns.splice(3, 0, {
-            displayName: 'Scope',
-            name: 'Scope',
-            headerCellTemplate: headerCellGroupingTemplate,
-            grouped: true,
-            field: "scope"
-        });
-        return columns;
-    }
-
-    _getActions() {
-        return [
-            {
-                icon: 'icon icon-view',
-                tooltip: 'View Build JSON',
-                callback: row => this.downloadJson(row)
-            }
-
-        ];
-    }
-}
-
-export function jfBuilds() {
-    return {
-        restrict: 'EA',
-        controller: jfBuildsController,
-        controllerAs: 'jfBuilds',
-        scope: {
-            currentNode: '='
-        },
-        bindToController: true,
-        templateUrl: 'states/artifacts/jf_artifact_info/info_tabs/jf_builds.html'
-    }
-}
-
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_cocoapods.html b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_cocoapods.html
deleted file mode 100644
index a92b03f..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_cocoapods.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<div class="cocoapods">
-    <jf-panel jf-panel-heading="Package Info"
-              ng-if="jfCocoapods.cocoapodsData.cocoapodsPkgInfo">
-
-        <div ng-repeat="(key,value) in jfCocoapods.cocoapodsData.cocoapodsPkgInfo"
-             class="artifact-file-icon"
-             ng-if="key == 'iconUrl'">
-            <img ng-src="{{value}}" alt="logo"/>
-        </div>
-
-        <table class="jf-data-table">
-            <tr ng-repeat="(key,value) in jfCocoapods.cocoapodsData.cocoapodsPkgInfo" ng-if="key != 'iconUrl'">
-                <td>{{jfCocoapods.DICTIONARY[key]}}:</td>
-                <td>{{value}}</td>
-            </tr>
-        </table>
-    </jf-panel>
-    <jf-panel jf-panel-heading="Dependencies"
-              ng-if="jfCocoapods.cocoapodsData.dependencies">
-        <jf-grid grid-options="jfCocoapods.gridDependenciesOptions"
-                 no-pagination="true"></jf-grid>
-    </jf-panel>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_cocoapods.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_cocoapods.js
deleted file mode 100644
index 526a094..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_cocoapods.js
+++ /dev/null
@@ -1,86 +0,0 @@
-import EVENTS from '../../../../constants/artifacts_events.constants';
-import DICTIONARY from './../../constants/artifact_general.constant';
-class jfCocoapodsController {
-    constructor($scope, ArtifactViewsDao, ArtifactoryEventBus, ArtifactoryGridFactory) {
-        this.artifactViewsDao = ArtifactViewsDao;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.DICTIONARY = DICTIONARY.cocoapods;
-        this.gridDependenciesOptions = {};
-        this.cocoapodsData = {};
-        this.$scope = $scope;
-        this._initCocoapods();
-    }
-
-    _initCocoapods() {
-        this._registerEvents();
-        this.getCocoapodsData();
-    }
-
-    getCocoapodsData() {
-        //Temp fix for preventing fetching data for non-file nodes (occurred when pressing "Artifacts" on sidebar)
-        if (!this.currentNode.data.path) {
-            return;
-        }
-
-        this.artifactViewsDao.fetch({
-            "view": "cocoapods",
-            "repoKey": this.currentNode.data.repoKey,
-            "path": this.currentNode.data.path
-        }).$promise
-            .then((data) => {
-                this.cocoapodsData = data;
-                this._createGrid();
-            });
-    }
-
-    _createGrid() {
-        if (this.cocoapodsData.dependencies) {
-            if (!Object.keys(this.gridDependenciesOptions).length) {
-                this.gridDependenciesOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                    .setRowTemplate('default')
-                    .setColumns(this._getColumns())
-                    .setGridData(this.cocoapodsData.dependencies)
-            }
-            else {
-                this.gridDependenciesOptions.setGridData(this.cocoapodsData.dependencies)
-            }
-        }
-    }
-
-    _getColumns() {
-        return [{
-            name: 'Name',
-            displayName: 'Name',
-            field: 'name'
-        },
-            {
-                name: 'Version',
-                displayName: 'Version',
-                field: 'version'
-            }];
-    }
-
-    _registerEvents() {
-
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TAB_NODE_CHANGED, (node) => {
-            if (this.currentNode != node) {
-                this.currentNode = node;
-                this.getCocoapodsData();
-            }
-        });
-    }
-
-}
-export function jfCocoapods() {
-    return {
-        restrict: 'EA',
-        controller: jfCocoapodsController,
-        controllerAs: 'jfCocoapods',
-        scope: {
-            currentNode: '='
-        },
-        bindToController: true,
-        templateUrl: 'states/artifacts/jf_artifact_info/info_tabs/jf_cocoapods.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_docker.html b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_docker.html
deleted file mode 100644
index c37aeb6..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_docker.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<div ng-if="jfDocker.dockerData">
-    <jf-panel jf-panel-heading="Package Info"
-              ng-if="jfDocker.dockerData.dockerInfo">
-        <div class="artifact-file-icon"
-             ng-if="jfDocker.dockerData.dockerConfig['iconUrl']">
-            <img ng-src="{{jfDocker.dockerData.dockerConfig['iconUrl']}}" alt="logo"/>
-        </div>
-        <table class="jf-data-table">
-            <tr ng-repeat="(key,value) in jfDocker.dockerData.dockerInfo" ng-if="jfDocker.DICTIONARY[key]">
-                <td>{{jfDocker.DICTIONARY[key]}}:</td>
-                <td>
-                    <span ng-if="key != 'imageId' && key != 'parent'">{{value}}</span>
-                    <span ng-if="key === 'imageId' || key === 'parent'"><a href="" ng-click="jfDocker.gotoPath(key)">{{value}}</a></span>
-                </td>
-            </tr>
-        </table>
-    </jf-panel>
-    
-    <jf-panel jf-panel-heading="Config"
-              ng-if="jfDocker.dockerData.dockerConfig">
-
-        <table class="jf-data-table">
-            <tr ng-repeat="(key,value) in jfDocker.dockerData.dockerConfig" ng-if="key != 'iconUrl'">
-                <td>{{jfDocker.DICTIONARY[key]}}:</td>
-                <td>{{value}}</td>
-            </tr>
-        </table>
-    </jf-panel>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_docker.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_docker.js
deleted file mode 100644
index b232f01..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_docker.js
+++ /dev/null
@@ -1,68 +0,0 @@
-import EVENTS from '../../../../constants/artifacts_events.constants';
-import DICTIONARY from './../../constants/artifact_general.constant';
-
-class jfDockerController {
-    constructor($scope, ArtifactViewsDao, ArtifactoryEventBus) {
-        this.artifactViewsDao = ArtifactViewsDao;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.DICTIONARY = DICTIONARY.docker;
-        this.dockerData = {};
-        this.$scope = $scope;
-        this._initDocker();
-    }
-
-    _initDocker() {
-        this._registerEvents();
-        this.getDockerData();
-    }
-
-    gotoPath(key) {
-        var repoKey = this.currentNode.data.repoKey;
-        var pathField = key === 'imageId' ? 'imageIdPath' : (key === 'parent' ? 'parentIdPath' : undefined);
-        if (pathField) {
-            this.artifactoryEventBus.dispatch(EVENTS.TREE_NODE_OPEN,
-                                              repoKey + '/' + this.dockerData.dockerInfo[pathField]);
-        }
-    }
-
-    getDockerData() {
-        //Temp fix for preventing fetching data for non-file nodes (occurred when pressing "Artifacts" on sidebar)
-        if (!this.currentNode.data.path) {
-            return;
-        }
-
-        this.artifactViewsDao.fetch({
-            "view": "docker",
-            "repoKey": this.currentNode.data.repoKey,
-            "path": this.currentNode.data.path + '/json.json'
-        }).$promise.then((data) => {
-            this.dockerData = data;
-        });
-    }
-
-    _registerEvents() {
-        let self = this;
-
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TAB_NODE_CHANGED, (node) => {
-            if (this.currentNode != node) {
-                this.currentNode = node;
-                self.getDockerData();
-            }
-        });
-    }
-
-
-
-}
-export function jfDocker() {
-    return {
-        restrict: 'EA',
-        controller: jfDockerController,
-        controllerAs: 'jfDocker',
-        scope: {
-            currentNode: '='
-        },
-        bindToController: true,
-        templateUrl: 'states/artifacts/jf_artifact_info/info_tabs/jf_docker.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_docker_ancestry.html b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_docker_ancestry.html
deleted file mode 100644
index e6e5660..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_docker_ancestry.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<div class="docker">
-    <div
-            ng-if="jfDockerAncestry.dockerAncestryData">
-        <div ng-repeat="record in jfDockerAncestry.dockerAncestryData track by $index"
-             class="padded-row-1x">
-            <div>
-                <span class="labeled-value"><a href="" ng-click="jfDockerAncestry.gotoPath($index)">{{record.indent}}{{record.id}}</a></span>
-                <span> {{jfDockerAncestry.DICTIONARY["size"]}}: {{record.size}}</span>
-            </div>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_docker_ancestry.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_docker_ancestry.js
deleted file mode 100644
index 301ab4f..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_docker_ancestry.js
+++ /dev/null
@@ -1,98 +0,0 @@
-import EVENTS from '../../../../constants/artifacts_events.constants';
-import DICTIONARY from './../../constants/artifact_general.constant';
-
-class jfDockerAncestryController {
-    constructor($scope, ArtifactViewsDao, ArtifactoryEventBus, $q) {
-        this.artifactViewsDao = ArtifactViewsDao;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.DICTIONARY = DICTIONARY.dockerAncestry;
-        this.dockerAncestryData = {};
-        this.$scope = $scope;
-        this.$q = $q;
-        this._initDockerAncestry();
-    }
-
-    _initDockerAncestry() {
-        this._registerEvents();
-        this.getDockerAncestryData();
-    }
-
-    getDockerAncestryData() {
-        //Temp fix for preventing fetching data for non-file nodes (occurred when pressing "Artifacts" on sidebar)
-        if (!this.currentNode.data.path) {
-            return;
-        }
-
-        this._findAncestryJsonNode()
-            .then((node) => {
-                return this.artifactViewsDao.fetch({
-                    "view": "dockerancestry",
-                    "repoKey": node.repoKey,
-                    "path": node.path
-                }).$promise;
-            })
-            .then((data) => {
-                this.dockerAncestryData = this._linkedListToArray(data.dockerLinkedImage);
-            });
-    }
-
-
-    _findAncestryJsonNode() {
-        return this.currentNode.data.getChildren()
-        .then((data) => {
-            for (var i=0; i<data.length;i++) {
-                if (data[i].text === 'ancestry.json') {
-                    return data[i];
-                }
-            }
-            return this.$q.reject();
-        });
-    }
-
-    gotoPath(index) {
-        var repoKey = this.currentNode.data.repoKey;
-        var fullpath = repoKey + '/' + this.dockerAncestryData[index].path;
-
-        this.artifactoryEventBus.dispatch(EVENTS.TREE_NODE_OPEN, fullpath);
-    }
-
-    _linkedListToArray(linkedData) {
-        var arr = [];
-        var curr = linkedData;
-        var indent = 1;
-        while (curr) {
-            var rec = {id: curr.id,
-                       size: curr.size,
-                       path: curr.path,
-                       indent: '|' + '__'.repeat(indent)};
-            arr.push(rec);
-            curr = curr.child;
-            indent++;
-        }
-        return  arr;
-    }
-
-    _registerEvents() {
-        let self = this;
-
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TAB_NODE_CHANGED, (node) => {
-            if (this.currentNode != node) {
-                this.currentNode = node;
-                self.getDockerAncestryData();
-            }
-        });
-    }
-
-}
-export function jfDockerAncestry() {
-    return {
-        restrict: 'EA',
-        controller: jfDockerAncestryController,
-        controllerAs: 'jfDockerAncestry',
-        scope: {
-            currentNode: '='
-        },
-        bindToController: true,
-        templateUrl: 'states/artifacts/jf_artifact_info/info_tabs/jf_docker_ancestry.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_docker_v2.html b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_docker_v2.html
deleted file mode 100644
index 70c1501..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_docker_v2.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<jf-panel jf-panel-heading="Tag Info"
-          ng-if="jfDockerV2.dockerV2Data.tagInfo">
-
-    <table class="jf-data-table">
-        <tr ng-repeat="(key,value) in jfDockerV2.dockerV2Data.tagInfo" ng-if="jfDockerV2.DICTIONARY[key] && jfDockerV2.isNotEmptyValue(value)">
-            <td>{{jfDockerV2.DICTIONARY[key]}}:</td>
-            <td>{{jfDockerV2.formatValue(value)}}</td>
-        </tr>
-        <tr ng-if="jfDockerV2.dockerV2Data.tagInfo.labels.length">
-            <td>Label Count:</td>
-            <td><a href ng-click="jfDockerV2.scrollToLabels()">{{jfDockerV2.dockerV2Data.tagInfo.labels.length}}</a></td>
-        </tr>
-    </table>
-
-</jf-panel>
-
-<jf-panel jf-panel-heading="Docker tag Visualization"
-          class="docker-layers-panel"
-          ng-if="jfDockerV2.dockerV2Data.blobsInfo">
-    <jf-docker-v2-layers controller="jfDockerV2"
-                         data="jfDockerV2.dockerV2Data.blobsInfo"
-                         current-path="{{jfDockerV2.currentNode.data.path}}"></jf-docker-v2-layers>
-</jf-panel>
-
-<jf-panel jf-panel-heading="Labels" id="labels"
-          ng-if="jfDockerV2.dockerV2Data.tagInfo.labels.length">
-    <jf-grid grid-options="jfDockerV2.labelGridOptions"
-             filter-field="name">
-    </jf-grid>
-</jf-panel>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_docker_v2.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_docker_v2.js
deleted file mode 100644
index 54b862a..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_docker_v2.js
+++ /dev/null
@@ -1,96 +0,0 @@
-import EVENTS from '../../../../constants/artifacts_events.constants';
-import DICTIONARY from './../../constants/artifact_general.constant';
-
-class jfDockerV2Controller {
-    constructor($scope, $element, ArtifactViewsDao, ArtifactoryEventBus, ArtifactoryGridFactory) {
-        this.$scope = $scope;
-        this.$element = $element;
-        this.artifactViewsDao = ArtifactViewsDao;
-        this.DICTIONARY = DICTIONARY.dockerV2;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.dockerV2Data = {};
-        this.labelGridOptions = {};
-
-        this._getDockerV2Data();
-        this._registerEvents();
-    }
-
-    _getDockerV2Data() {
-        //Temp fix for preventing fetching data for non-file nodes (occurred when pressing "Artifacts" on sidebar)
-        if (!this.currentNode.data.path) {
-            return;
-        }
-
-        this.artifactViewsDao.fetch({
-            "view": "dockerv2",
-            "repoKey": this.currentNode.data.repoKey,
-            "path": this.currentNode.data.path
-        }).$promise.then((data) => {
-            this.dockerV2Data = data;
-            this._createGrid();
-            if (this.layersController)
-                this.layersController.refreshView();
-        });
-    }
-
-    _createGrid() {
-        if (this.dockerV2Data.tagInfo.labels) {
-            if (!Object.keys(this.labelGridOptions).length) {
-                this.labelGridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                    .setRowTemplate('default')
-                    .setColumns(this._getColumns())
-                    .setGridData(this.dockerV2Data.tagInfo.labels);
-            }
-        }
-    }
-
-    _getColumns() {
-        return [
-            {
-                name: 'key',
-                displayName: 'Key',
-                field: 'key'
-            },
-            {
-                name: 'value',
-                displayName: 'Value',
-                field: 'value'
-            }]
-    }
-
-    isNotEmptyValue(value) {
-        return value && (!_.isArray(value) || value.length > 0);
-    }
-
-    formatValue(value) {
-        if (_.isArray(value)) {
-            return value.join(', ');
-        }
-        else return value;
-    }
-
-    _registerEvents() {
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TAB_NODE_CHANGED, (node) => {
-            this.currentNode = node;
-            this._getDockerV2Data();
-        });
-    }
-
-    scrollToLabels() {
-        document.getElementById("labels").scrollIntoView();
-    }
-}
-
-export function jfDockerV2() {
-    return {
-        restrict: 'EA',
-        controller: jfDockerV2Controller,
-        controllerAs: 'jfDockerV2',
-        scope: {
-            currentNode: '='
-        },
-        bindToController: true,
-        templateUrl: 'states/artifacts/jf_artifact_info/info_tabs/jf_docker_v2.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_effective_permissions.html b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_effective_permissions.html
deleted file mode 100644
index f91ef49..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_effective_permissions.html
+++ /dev/null
@@ -1,4 +0,0 @@
-<jf-grid grid-options="jfEffectivePermissions.permissionGridOption"
-         filter-field="principal"
-         auto-focus="true"
-         object-name="Effective Permission"></jf-grid>
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_effective_permissions.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_effective_permissions.js
deleted file mode 100644
index ff69ce4..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_effective_permissions.js
+++ /dev/null
@@ -1,108 +0,0 @@
-import EVENTS from '../../../../constants/artifacts_events.constants';
-
-class jfEffectivePermissionsController {
-    constructor(ArtifactoryGridFactory, ArtifactPermissionsDao, $scope, $timeout, ArtifactoryEventBus,
-            uiGridConstants, commonGridColumns) {
-        this.uiGridConstants = uiGridConstants;
-        this.commonGridColumns = commonGridColumns;
-        this.$scope = $scope;
-        this.$timeout = $timeout;
-        this.permissionGridOption = {};
-        this.permissionsDao = ArtifactPermissionsDao.getInstance();
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.artifactoryEventBus=ArtifactoryEventBus;
-        this._registerEvents();
-        this._createGrid();
-        this._getPermissionsData();
-    }
-
-    _getPermissionsData() {
-        return this.permissionsDao.query({
-            path: this.currentNode.data.path,
-            repoKey: this.currentNode.data.repoKey,
-            pageNum: 1,
-            numOfRows: 25,
-            direction: "asc",
-            orderBy: "principal"
-        }).$promise.then((data)=>{
-                   this.permissionGridOption.setGridData(data.pagingData);
-                });
-    }
-
-    _createGrid() {
-        this.permissionGridOption = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setColumns(this.getColumns())
-                .setRowTemplate('default');
-    }
-    _registerEvents() {
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TAB_NODE_CHANGED, (node) => {
-            this.permissionGridOption.resetPagination();
-            this.permissionGridOption.getPage();
-            this.$timeout(()=>{
-                this._getPermissionsData();
-            });
-        });
-    }
-    getColumns() {
-        return [
-            {
-                name: 'Principal',
-                displayName: 'Principal',
-                field: "principal",
-                cellTemplate: '<div class="ui-grid-cell-contents">{{COL_FIELD CUSTOM_FILTERS}}</div>',
-                sort: {
-                    direction: this.uiGridConstants.ASC
-                },
-                width: '33%'
-            },
-            {
-                name: 'Type',
-                displayName: 'Type',
-                field: "type",
-                cellTemplate: '<div class="ui-grid-cell-contents">{{COL_FIELD CUSTOM_FILTERS}}</div>',
-                width: '8%'
-            },
-            {
-                name: "Delete/Overwrite",
-                displayName: "Delete/Overwrite",
-                field: "permission.delete",
-                cellTemplate: this.commonGridColumns.booleanColumn('MODEL_COL_FIELD'),
-                width: '19%'
-            },
-            {
-                name: "Deploy/Cache",
-                displayName: "Deploy/Cache",
-                field: "permission.deploy",
-                cellTemplate: this.commonGridColumns.booleanColumn('MODEL_COL_FIELD'),
-                width: '17%'
-            },
-            {
-                name: "Annotate",
-                displayName: "Annotate",
-                field: "permission.annotate",
-                cellTemplate: this.commonGridColumns.booleanColumn('MODEL_COL_FIELD'),
-                width: '15%'
-            },
-            {
-                name: "Read",
-                displayName: "Read",
-                field: "permission.read",
-                cellTemplate: this.commonGridColumns.booleanColumn('MODEL_COL_FIELD'),
-                width: '8%'
-            }
-        ]
-    }
-
-}
-export function jfEffectivePermissions() {
-    return {
-        restrict: 'EA',
-        controller: jfEffectivePermissionsController,
-        controllerAs: 'jfEffectivePermissions',
-        scope: {
-            currentNode: '='
-        },
-        bindToController: true,
-        templateUrl: 'states/artifacts/jf_artifact_info/info_tabs/jf_effective_permissions.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_general.html b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_general.html
deleted file mode 100644
index 00051ca..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_general.html
+++ /dev/null
@@ -1,242 +0,0 @@
-<div class="alert alert-warning" ng-if="jfGeneral.generalData.blackedOutMessage">
-    {{ jfGeneral.generalData.blackedOutMessage }}
-</div>
-<div class="alert alert-warning"
-     ng-if="!jfGeneral.generalData.blackedOutMessage && jfGeneral.generalData.offlineMessage">
-    {{ jfGeneral.generalData.offlineMessage }}
-</div>
-<div class="alert alert-warning" ng-if="jfGeneral.currentNode.data.cached === false">
-    This item is not cached.
-</div>
-<jf-panel jf-panel-heading="Info"
-          ng-if="jfGeneral.generalData.info && !jfGeneral.isTrashcan() && !jfGeneral.isInTrashcan()"
-          jf-panel-classes="col-md-12">
-    <div ng-if="jfGeneral.generalData.info.repoType.length"
-         class="repository-type">
-        <div class="repotype iconrepo iconrepo-{{jfGeneral.generalData.info.repoType.toLowerCase()}}"></div>
-        <div ng-if="jfGeneral.generalData.info['smartRepo']"><span class="icon-logo-circle"></span>Smart Repository</div>
-    </div>
-    <table class="jf-data-table">
-        <tr ng-repeat="(key,value) in jfGeneral.generalData.info"
-            ng-if="(key != 'repoType' && key != 'repositoryLayout') || !jfGeneral.isDistRepo()">
-
-            <td ng-if="key != 'licenses' && key != 'filtered' && key != 'smartRepo' && key != 'showFilteredResourceCheckBox' && key != 'artifactsCount' && key != 'artifactsCount'">
-                {{jfGeneral.DICTIONARY[key]}}:
-            </td>
-            <td ng-if="key === 'bintrayUrl'">
-                <a href="{{value}}" target="_blank">{{value}}</a>
-            </td>
-            <td ng-if="key != 'licenses' && key != 'filtered' && key != 'smartRepo' && key != 'showFilteredResourceCheckBox' && key != 'signingKeyLink' && key != 'artifactsCount' && key != 'bintrayUrl'">
-                {{value}}
-                <jf-clip-copy ng-if="key === 'repositoryPath'"
-                              text-to-copy="value" object-name="Path"></jf-clip-copy>
-                <jf-clip-copy ng-if="key === 'name' && !jfGeneral.isCurrentNodeAFolderInArchive()"
-                              text-to-copy="jfGeneral.getFullFilePath()" object-name="full file path"></jf-clip-copy>
-
-                <jf-help-tooltip ng-if="jfGeneral.TOOLTIP[key]" html="jfGeneral.TOOLTIP[key]"></jf-help-tooltip>
-            </td>
-
-            <td ng-if="key == 'licenses'">{{jfGeneral.DICTIONARY[key]}}:</td>
-            <td ng-if="key == 'licenses'">
-                <div class="licenses-list inline-block"
-                     ng-repeat="license in jfGeneral.generalData.info.licenses track by $index">
-                    <a ng-if="license.url !== '' && license.url !== undefined"
-                       href="{{license.url}}" target="_blank">{{license.name}}</a>
-                    <span ng-if="license.url == '' || license.url === undefined">{{license.name}}</span>
-                    <span ng-if="jfGeneral.generalData.info.licenses.length>1 && $index<jfGeneral.generalData.info.licenses.length-1">, </span>
-                </div>
-                <span ng-if="!jfGeneral.generalData.info.licenses.length">Not Found</span>
-
-                <div class="inline-block" ng-if="!jfGeneral.generalData.blackDuckEnabled && jfGeneral.canAnnotate">
-                    <span class="inner-buttons">
-                        <a class="no-separator" ng-click="jfGeneral.editLicenses()">Add</a>
-                        <a ng-click="jfGeneral.scanForLicenses()">Scan</a>
-                        <span ng-if="jfGeneral.generalData.info.licenses.length > 0">
-                            <a ng-click="jfGeneral.deleteLicenses()">Delete</a>
-                        </span>
-                        <span ng-if="jfGeneral.generalData.type==='archive'">
-                            <a ng-click="jfGeneral.searchForArchiveFile()">{{jfGeneral.SearchForArchiveLicense}}</a>
-                        </span>
-                    </span>
-                    <jf-help-tooltip ng-if="jfGeneral.TOOLTIP[key]" html="jfGeneral.TOOLTIP[key]"></jf-help-tooltip>
-                </div>
-                <div class="inline-block" ng-if="jfGeneral.generalData.blackDuckEnabled && jfGeneral.canAnnotate">
-                    <span class="inner-buttons">
-                        <a class="no-separator" ng-click="jfGeneral.queryCodeCenter()">Query Code Center</a>
-                    </span>
-                </div>
-            </td>
-
-            <td ng-if="key == 'filtered'" colspan="2">
-                <label for="filtered" class="weight-normal">
-                    <jf-checkbox text="{{jfGeneral.DICTIONARY[key]}}">
-                        <input type="checkbox"
-                               id="filtered"
-                               ng-model="jfGeneral.generalData.info.filtered"
-                               ng-click="jfGeneral.onFilteredResourceCB()">
-                    </jf-checkbox>
-                </label>
-                <jf-help-tooltip ng-if="jfGeneral.TOOLTIP[key]" html="jfGeneral.TOOLTIP[key]"></jf-help-tooltip>
-            </td>
-
-            <td ng-if="key == 'artifactsCount' && jfGeneral.artifactsCountEnabled()">{{jfGeneral.DICTIONARY[key]}}:</td>
-            <td ng-if="key == 'artifactsCount' &&  jfGeneral.artifactsCountEnabled() && !jfGeneral.calculatingArtifactsCount && !jfGeneral.finishedArtifactCount">
-                <a ng-click="jfGeneral.calculateArtifactsCount()">Show</a>
-            </td>
-            <td ng-if="key == 'artifactsCount' && !jfGeneral.calculatingArtifactsCount &&  jfGeneral.artifactsCountEnabled() && jfGeneral.finishedArtifactCount">
-                {{jfGeneral.generalData.info.artifactsCount}}
-            </td>
-            <td ng-if="key == 'artifactsCount' && jfGeneral.calculatingArtifactsCount && jfGeneral.artifactsCountEnabled()">
-                <div class="icon-hourglass"></div>
-            </td>
-            <td ng-if="key == 'signingKeyLink'">
-                <a href="{{jfGeneral.generalData.info.signingKeyLink}}"
-                   target="_blank" class="debian-value">Download Public Key</a>
-            </td>
-
-        </tr>
-    </table>
-</jf-panel>
-
-<jf-panel jf-panel-heading="Package Information"
-          ng-if="jfGeneral.generalData.bintrayInfoEnabled && !jfGeneral.isTrashcan() && !jfGeneral.isInTrashcan()">
-
-    <div ng-if="jfGeneral.bintrayData.iconURL"
-         class="artifact-file-icon">
-        <img ng-src="{{ jfGeneral.bintrayData.iconURL }}"/>
-    </div>
-
-    <div class="preserve-lb"
-         ng-if="!jfGeneral.bintrayData.errorMessage && !jfGeneral.bintrayData.name">Getting latest package information
-        from Bintray...
-    </div>
-
-    <div class="text-danger preserve-lb"
-         ng-if="jfGeneral.bintrayData.errorMessage">{{jfGeneral.bintrayData.errorMessage}}
-    </div>
-
-    <table class="jf-data-table" ng-if="jfGeneral.bintrayData.name && !jfGeneral.bintrayData.errorMessage">
-        <tr>
-            <td>Name:</td>
-            <td><a href="{{ jfGeneral.bintrayData.nameLink }}" target="_blank">{{ jfGeneral.bintrayData.name }}</a></td>
-        </tr>
-        <tr ng-if="jfGeneral.bintrayData.description">
-            <td>Description:</td>
-            <td>{{ jfGeneral.bintrayData.description }}</td>
-        </tr>
-        <tr>
-            <td>Latest Version:</td>
-            <td><a href="{{ jfGeneral.bintrayData.latestVersionLink }}" target="_blank">{{
-                jfGeneral.bintrayData.latestVersion }}</a></td>
-        </tr>
-    </table>
-</jf-panel>
-
-<jf-panel jf-panel-heading="Dependency Declaration"
-          ng-if="jfGeneral.generalData.dependencyDeclaration && !jfGeneral.isTrashcan() && !jfGeneral.isInTrashcan()">
-    <ul class="list-inline list-declaration">
-        <li>Build Tool:</li>
-        <li ng-repeat="item in jfGeneral.generalData.dependencyDeclaration.types"
-            class="build-tool-btn"
-            ng-class="{active:jfGeneral.isDeclarationSelected(item)}"
-            ng-click="jfGeneral.selectDeclaration(item)"> {{item}}
-        </li>
-    </ul>
-
-    <jf-clip-copy text-to-copy="jfGeneral.generalData.dependencyDeclaration.dependencyData"
-                  class="code-mirror-copy"
-                  object-name="Snippet"></jf-clip-copy>
-
-    <jf-code-mirror mime-type="text/xml"
-                    model="jfGeneral.generalData.dependencyDeclaration.dependencyData">
-    </jf-code-mirror>
-</jf-panel>
-
-<jf-panel jf-panel-heading="Virtual Repository Associations"
-          ng-if="jfGeneral.generalData.virtualRepositories.virtualRepositories.length && !jfGeneral.isTrashcan() && !jfGeneral.isInTrashcan()">
-    <div ng-repeat="item in jfGeneral.generalData.virtualRepositories.virtualRepositories"
-         class="virtual-repo-item">
-        <a target="_blank" ng-href="{{item.linkUrl }}"><i class="icon icon-virtual-repo"></i>{{item.repoKey}}</a>
-    </div>
-</jf-panel>
-
-<jf-panel jf-panel-heading="Included Repositories"
-          ng-if="jfGeneral.generalData.includedRepositories.repositories.length && !jfGeneral.isTrashcan() && !jfGeneral.isInTrashcan()">
-    <div ng-repeat="item in jfGeneral.generalData.includedRepositories.repositories"
-         class="virtual-repo-item">
-        <a target="_blank" ng-href="{{ item.linkUrl }}">
-            <i ng-if="item.type=='local'" class="icon icon-local-repo"></i>
-            <i ng-if="item.type=='remote'" class="icon icon-remote-repo"></i>
-            <i ng-if="item.type=='virtual'" class="icon icon-virtual-repo"></i>
-            {{item.repoKey}}</a>
-    </div>
-</jf-panel>
-
-<jf-panel jf-panel-heading="Checksums"
-          ng-if="jfGeneral.generalData.checksums && !jfGeneral.isTrashcan() && !jfGeneral.isInTrashcan()">
-
-    <div class="jf-data-table-ellipsis">
-        <div ng-if="!jfGeneral.generalData.checksums.sha2">
-            <div class="key-cell">SHA-256:</div>
-            <a ng-if="!jfGeneral.features.isOss()"
-               ng-class="{'not-allowed':!jfGeneral.canCalculateSha256()}"
-               ng-click="jfGeneral.getSha256()">
-                <span ng-if="!jfGeneral.sha256Calculated">Calculate </span><jf-spinner domain="sha256"></jf-spinner>
-            </a>
-            <span class="license-required license-required-PRO"
-                  ng-if="jfGeneral.features.isOss()">
-                <a class="not-allowed">Calculate</a>
-            </span>
-        </div>
-        <div ng-repeat="(_key,_value) in jfGeneral.generalData.checksums"
-             ng-if="_key != 'showFixChecksums' && _key != 'message' && _key != 'sha1Value'"
-             jf-tooltip-on-overflow>
-            <div class="key-cell">{{jfGeneral.getChecksumKey(_value)}}:</div>{{jfGeneral.getChecksumVal(_value)}}
-        </div>
-    </div>
-
-    <div class="clearfix"></div>
-
-    <div ng-if="jfGeneral.generalData.checksums.showFixChecksums">
-        <div class="text-danger preserve-lb"
-             ng-if="jfGeneral.generalData.checksums.message">{{jfGeneral.generalData.checksums.message}}
-        </div>
-        <button class="btn btn-sm btn-primary"
-                ng-click="jfGeneral.fixChecksum()">Fix Checksum
-        </button>
-    </div>
-</jf-panel>
-
-<jf-panel jf-panel-heading="Info"
-          ng-if="jfGeneral.isTrashcan() || jfGeneral.isInTrashcan()">
-
-    <div class="alert alert-warning" ng-if="!jfGeneral.isTrashcanEnabled()">
-        Trashcan feature is currently disabled. Artifacts deletion is permanent!
-    </div>
-
-    <table class="jf-data-table">
-        <tr ng-repeat="(key,value) in jfGeneral.generalData.trash" ng-if="jfGeneral.generalData.trash">
-
-            <td>
-                {{jfGeneral.DICTIONARY.trash[key]}}:
-            </td>
-            <td>
-                {{value}}
-            </td>
-
-        </tr>
-        <tr ng-if="jfGeneral.generalData.type !== 'file' && jfGeneral.generalData.type !== 'archive'">
-            <td>Artifact Count:</td>
-            <td ng-if="!jfGeneral.calculatingArtifactsCount && !jfGeneral.finishedArtifactCount">
-                <a ng-click="jfGeneral.calculateArtifactsCount()">Show</a>
-            </td>
-            <td ng-if="!jfGeneral.calculatingArtifactsCount && jfGeneral.finishedArtifactCount">
-                {{jfGeneral.generalData.info.artifactsCount}}
-            </td>
-            <td ng-if="jfGeneral.calculatingArtifactsCount">
-                <div class="icon-hourglass"></div>
-            </td>
-        </tr>
-
-    </table>
-</jf-panel>
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_general.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_general.js
deleted file mode 100644
index f7d164f..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_general.js
+++ /dev/null
@@ -1,328 +0,0 @@
-import EVENTS from "../../../../constants/artifacts_events.constants";
-import DICTIONARY from "./../../constants/artifact_general.constant";
-import TOOLTIP from "../../../../constants/artifact_tooltip.constant";
-
-class jfGeneralController {
-    constructor($scope, ArtifactGeneralDao, ArtifactoryNotifications, ArtifactLicensesDao, ChecksumsDao, ArtifactActionsDao, ArtifactoryFeatures,
-            FilteredResourceDao, ArtifactoryEventBus, ArtifactoryModal, DependencyDeclarationDao, $compile, User, FooterDao) {
-        this.generalData = {
-            dependencyDeclaration: []
-        };
-        this.$scope = $scope;
-        this.artifactLicensesDao = ArtifactLicensesDao;
-        this.DICTIONARY = DICTIONARY;
-        this.artifactActionsDao = ArtifactActionsDao;
-        this.TOOLTIP = TOOLTIP.artifacts.browse;
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this.artifactGeneralDao = ArtifactGeneralDao;
-        this.filteredResourceDao = FilteredResourceDao;
-        this.dependencyDeclarationDao = DependencyDeclarationDao;
-        this.modal = ArtifactoryModal;
-        this.footerDao = FooterDao;
-        this.currentDeclaration = 'Maven';
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.features = ArtifactoryFeatures;
-        this.$compile = $compile;
-        this.userService = User;
-        this.SearchForArchiveLicense = "Search Archive License File";
-        this.ChecksumsDao = ChecksumsDao;
-        this.editorOptions = {
-            lineNumbers: true,
-            readOnly: 'nocursor',
-            lineWrapping: true,
-            height: 'auto',
-            mode: 'links',
-            mimeType: 'text/xml'
-        };
-        this._getGeneralData();
-        this._registerEvents();
-        this._initModalScope();
-    }
-
-    _registerEvents() {
-
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TAB_NODE_CHANGED, (node) => {
-            if (this.currentNode != node) {
-                this.showArtifactsCount = false;
-                this.calculatingArtifactsCount = false;
-                this.finishedArtifactCount = false;
-                this.currentNode = node;
-                this._getGeneralData();
-            }
-        });
-        this.artifactoryEventBus.registerOnScope(this.$scope, [EVENTS.ACTION_WATCH, EVENTS.ACTION_UNWATCH], () => {
-            this._getGeneralData();
-        });
-    }
-
-    _initModalScope() {
-        this.generalScope = this.$scope.$new();
-        this.generalScope.closeModal = () => this.modalInstance.close();
-        this.generalScope.saveLicenses = (licenses)=>this.saveLicenses(licenses);
-        this.generalScope.modalTitle = 'Add Artifactory License Property';
-    }
-
-    getGeneralTab() {
-        return _.findWhere(this.currentNode.data.tabs, {name: 'General'});
-    }
-
-    _getGeneralData() {
-
-        this.sha256Calculated = false;
-
-        let generalTab = this.getGeneralTab();
-        if (generalTab && generalTab.info) { // If general data already exists on the node (for archive children)
-            this.generalData = generalTab;
-        }
-        else if (this.currentNode.data.className === 'TreeNode') {
-            this.artifactGeneralDao.fetch({
-                "type": this.currentNode.data.type,
-                "repoKey": this.currentNode.data.repoKey,
-                "path": this.currentNode.data.path
-            }).$promise
-                    .then((response) => {
-                        this.showArtifactsCount = this.artifactsCountEnabled();
-                        if (response.info.externalUrl) {
-                            response.info = this._moveObjectElement(response.info, "externalUrl", "repositoryPath");
-                        }
-                        this.generalData = response;
-                        if (this.generalData.dependencyDeclaration) {
-                            this.selectDeclaration(this.currentDeclaration);
-                        }
-                        if (this.generalData.bintrayInfoEnabled) {
-                            this.loadPackageDescription();
-                        }
-                        this.userService.canAnnotate(this.currentNode.data.repoKey,
-                                this.currentNode.data.path).then((response) => {
-                                    this.canAnnotate = response.data;
-                                });
-                    })
-        }
-    }
-
-    calculateArtifactsCount() {
-        this.calculatingArtifactsCount = true;
-        let {name, repositoryPath} = this.generalData.info;
-        this.artifactGeneralDao.artifactsCount({name, repositoryPath}).$promise
-                .then((response) => {
-                    this.generalData.info.artifactsCount = response.artifactsCount;
-                })
-                .finally(() => {
-                    this.calculatingArtifactsCount = false;
-                    this.finishedArtifactCount = true;
-                });
-    }
-
-    artifactsCountEnabled() {
-        return _.contains(['local', 'cached'], this.currentNode.data.repoType);
-    }
-
-    onFilteredResourceCB() {
-        let payload = {repoKey: this.currentNode.data.repoKey, path: this.currentNode.data.path};
-        this.filteredResourceDao.setFiltered({setFiltered: this.generalData.info.filtered},
-                payload).$promise.then((res)=> {
-                    //console.log(res);
-                });
-    }
-
-    fixChecksum() {
-        this.ChecksumsDao.fix({}, {repoKey: this.currentNode.data.repoKey, path: this.currentNode.data.path})
-                .$promise.then((data) => {
-                    this._getGeneralData();
-                })
-    }
-
-    isDeclarationSelected(item) {
-        return this.currentDeclaration == item;
-    }
-
-    selectDeclaration(item) {
-        let self = this;
-        this.currentDeclaration = item;
-        this.dependencyDeclarationDao.get({
-            buildtool: item.toLowerCase(),
-            repoKey: this.currentNode.data.repoKey,
-            path: this.currentNode.data.path
-
-        }).$promise.then((data)=> {
-                    if (data.dependencyData) {
-                        self.generalData.dependencyDeclaration.dependencyData = data.dependencyData;
-                    }
-                });
-    }
-
-    loadPackageDescription() {
-        this.bintrayData = {};
-        this.artifactGeneralDao.bintray({sha1: this.generalData.checksums.sha1Value}).$promise.then((data)=> {
-            if (!data.name && !data.errorMessage) this.generalData.bintrayInfoEnabled = false;
-            else this.bintrayData = data;
-        });
-    }
-
-    /**Licenses actions and display
-     * saving all default licenses on the generalScope for modal display
-     * **/
-    openAddLicenseModal() {
-        this.modalInstance = this.modal.launchModal('add_license_modal', this.generalScope);
-    }
-
-    editLicenses(scan) {
-        this.artifactLicensesDao.getLicenses().$promise.then((licenses)=> {
-            this.generalScope.licenses = _.map(licenses, (rec)=> {
-                return rec.name
-            });
-            if (!scan) {
-                this.generalScope.selectedLicenses = _.filter(this.generalData.info.licenses,(lic)=>{
-                    return lic.name !== 'Not Found';
-                });
-            }
-            this.openAddLicenseModal();
-        })
-    }
-
-    saveLicenses(selectedLicenses) {
-        this.artifactLicensesDao.setLicenses({
-            repoKey: this.currentNode.data.repoKey,
-            path: this.currentNode.data.path
-        }, selectedLicenses).$promise.then((result)=> {
-                    this._getGeneralData();
-                    this.modalInstance.close();
-                });
-    }
-
-    deleteLicenses() {
-        this.modal.confirm("Are you sure you want to delete the license information attached to " + this.generalData.info.name + "?")
-                .then(() => {
-                    this.saveLicenses([]);
-                });
-    }
-
-    scanForLicenses() {
-        this.artifactLicensesDao.scanArtifact({
-            repoKey: this.currentNode.data.repoKey,
-            path: this.currentNode.data.path
-        }).$promise.then((result)=> {
-                    if (result.data.length > 0) {
-                        this.generalScope.selectedLicenses = _.map(result.data, (rec)=> {
-                            return rec.name
-                        });
-                        this.editLicenses(true)
-                    }
-                    else {
-                        this.artifactoryNotifications.create({info: 'No licenses found in scan'})
-                    }
-                });
-    }
-
-    searchForArchiveFile() {
-        this.artifactLicensesDao.getArchiveLicenseFile({
-            repoKey: this.currentNode.data.repoKey,
-            path: this.currentNode.data.path
-        }).$promise.then((data)=> {
-                    this.modal.launchCodeModal('License File', data.data);
-                }, ()=> {
-                    this.SearchForArchiveLicense = "(No archive license file found)";
-                });
-
-    }
-
-    queryCodeCenter() {
-        this.artifactLicensesDao.queryCodeCenter({
-            repoKey: this.currentNode.data.repoKey,
-            path: this.currentNode.data.path
-        }).$promise.then((result)=> {
-                    this._getGeneralData();
-                });
-    }
-
-    getFullFilePath() {
-/*
-        if (!window.location.origin) { // IE compatibility
-            window.location.origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port: '');
-        }
-        return window.location.origin+this.currentNode.data.actualDownloadPath;
-*/
-        return this.currentNode.data.actualDownloadPath;
-    }
-
-    getSha256() {
-        if (this.features.isOss() || !this.canCalculateSha256()) return;
-
-        this.sha256Calculated = true;
-
-        this.artifactActionsDao.getSha256({$spinner_domain: "sha256"}, {
-            repoKey: this.currentNode.data.repoKey,
-            path: this.currentNode.data.path
-        }).$promise.then((result)=> {
-                    this._getGeneralData();
-                });
-    }
-    canCalculateSha256() {
-        return this.canAnnotate && this.userService.currentUser.getCanDeploy();
-    }
-
-    getChecksumKey(keyval) {
-        return keyval.split(':')[0];
-    }
-    getChecksumVal(keyval) {
-        let splitted = keyval.split(':');
-        splitted.shift();
-        return splitted.join(':');
-    }
-
-    isTrashcanEnabled() {
-        return !this.footerDao.getInfo().trashDisabled;
-    }
-    isTrashcan() {
-        return this.currentNode.data && this.currentNode.data.isTrashcan && this.currentNode.data.isTrashcan();
-    }
-    isInTrashcan() {
-        return this.currentNode.data && this.currentNode.data.isInTrashcan && this.currentNode.data.isInTrashcan();
-    }
-
-    isDistRepo() {
-        return this.currentNode.data && this.currentNode.data.repoType === 'distribution';
-    }
-
-    _moveObjectElement(obj, currentKey, afterKey) {
-        var result = {};
-        var val = obj[currentKey];
-        delete obj[currentKey];
-        var next = -1;
-        var i = 0;
-        if(typeof afterKey == 'undefined' || afterKey == null) afterKey = '';
-        $.each(obj, (k, v) => {
-            if((afterKey == '' && i == 0) || next == 1) {
-                result[currentKey] = val;
-                next = 0;
-            }
-            if(k == afterKey) { next = 1; }
-            result[k] = v;
-            ++i;
-        });
-        if(next == 1) {
-            result[currentKey] = val;
-        }
-        if(next !== -1) return result; else return obj;
-    }
-
-
-    isCurrentNodeAFolderInArchive() {
-        let isFolder = this.currentNode.data.folder;
-        let isInArchive = !!this.currentNode.data.archivePath;
-        return isFolder && isInArchive;
-    }
-}
-
-export function jfGeneral() {
-    return {
-        restrict: 'EA',
-        scope: {
-            currentNode: '='
-        },
-        controller: jfGeneralController,
-        controllerAs: 'jfGeneral',
-        bindToController: true,
-        templateUrl: 'states/artifacts/jf_artifact_info/info_tabs/jf_general.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_governance.html b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_governance.html
deleted file mode 100644
index 79bc5c5..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_governance.html
+++ /dev/null
@@ -1,72 +0,0 @@
-<div id="jf_governance">
-    <div class="alert alert-warning" ng-if="jfGovernance.governanceData.feedbackMsg.warn">
-        {{jfGovernance.governanceData.feedbackMsg.warn}}
-    </div>
-
-    <jf-panel jf-panel-heading="Info"
-              ng-click="jfGovernance.cancelEditMode($event)"
-              ng-if="jfGovernance.governanceData.info">
-
-        <table class="jf-data-table">
-            <tr ng-repeat="(key,value) in jfGovernance.governanceData.info track by key" ng-if="jfGovernance.DICTIONARY[key]">
-                <td>{{jfGovernance.DICTIONARY[key]}}:</td>
-                <td>
-                    <span ng-switch="key">
-                        <span ng-switch-when="name">
-                            <a ng-href="{{jfGovernance.governanceData.info.componentLink}}" target="_blank">{{value}}</a>
-                        </span>
-                        <span ng-switch-when="homepage">
-                            <a ng-href="{{value}}" target="_blank">{{value}}</a>
-                        </span>
-                        <span ng-switch-when="description">
-                            {{value}}
-                        </span>
-                        <span ng-switch-when="extComponentId" class="clearfix">
-                            <span ng-if="!jfGovernance.editMode">
-                                {{value}} <span ng-click="jfGovernance.editMode = true" class="fa fa-edit"></span>
-                            </span>
-                            <span ng-if="jfGovernance.editMode">
-                                <input type="text"
-                                       class="input-text input-small"
-                                       ng-model="value">
-                                <button type="button"
-                                        class="btn btn-small"
-                                        ng-click="jfGovernance.updateComponentId(value)">Update
-                                </button>
-                            </span>
-                        </span>
-                        <span ng-switch-default>
-                            {{value}}
-                            <!--<jf-tooltip ng-if="jfGovernance.TOOLTIP[key]"-->
-                            <!--text="{{jfGovernance.TOOLTIP[key]}}"></jf-tooltip>-->
-                        </span>
-                    </span>
-                </td>
-            </tr>
-        </table>
-    </jf-panel>
-
-    <jf-panel jf-panel-heading="License"
-              ng-if="jfGovernance.governanceData.license">
-        <span ng-repeat="license in jfGovernance.governanceData.license track by $index">
-            <a href="{{license.licenseUrl}}" target="_blank">{{license.licenseName}}</a><span ng-if="$index < jfGovernance.governanceData.license.length-1">, </span>
-        </span>
-    </jf-panel>
-
-    <jf-panel jf-panel-heading="Vulnerabilities"
-              ng-if="jfGovernance.governanceData.vulnerabilities">
-
-        <jf-grid grid-options="jfGovernance.governanceGridOptions"
-                 filter-field="name"
-                 filter-field2="number"
-                 filter-on-change="true">
-        </jf-grid>
-
-        <div class="grid-container clearfix no-margin-top">
-            <div ui-grid="jfGovernance.governanceGridOptions"
-                 ui-grid-grouping
-                 class="grid"></div>
-
-        </div>
-    </jf-panel>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_governance.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_governance.js
deleted file mode 100644
index fa4c5c0..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_governance.js
+++ /dev/null
@@ -1,133 +0,0 @@
-import EVENTS from '../../../../constants/artifacts_events.constants';
-import DICTIONARY from './../../constants/artifact_general.constant';
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-const headerCellGroupingTemplate = require("raw!../../../../ui_components/artifactory_grid/templates/headerCellTemplate.html");
-const infoPropertyBlacklist = ['kbComponentId', 'kbReleaseId', 'catalogComponent', 'compponentLink'];
-
-class jfGovernanceController {
-
-    constructor($scope, GovernanceDao, ArtifactoryEventBus, ArtifactoryGridFactory, ArtifactoryNotifications) {
-        this.$scope = $scope;
-        this.GovernanceDao = GovernanceDao;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.DICTIONARY = DICTIONARY.governance;
-        this.governanceGridOptions = null;
-        this.TOOLTIP = TOOLTIP.builds;
-
-        this._init();
-    }
-
-    _init() {
-        this._createGrid();
-        this._getData();
-        this._registerEvents();
-    }
-
-    _getData() {
-        //Temp fix for preventing fetching data for non-file nodes (occurred when pressing "Artifacts" on sidebar)
-        if (!this.currentNode.data.path) {
-            return;
-        }
-
-        this.GovernanceDao.fetch({
-            "repoKey": this.currentNode.data.repoKey,
-            "path": this.currentNode.data.path
-        }).$promise
-            .then((data) => {
-                if (data.warn) {
-                    this.governanceData = {feedbackMsg: data};
-                } else {
-                    this.governanceData = data;
-                    this.governanceGridOptions.setGridData(data.vulnerabilities || []);
-                }
-
-            }).catch((err)=>{
-                    //console.log(err);
-                    if (err.data && err.data.feedbackMsg && err.data.feedbackMsg.error) {
-                        this.artifactoryNotifications.create({error: err.data.feedbackMsg.error});
-                        this.governanceData = err.data;
-                    }
-                });
-    }
-
-    _createGrid() {
-        this.governanceGridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-            .setRowTemplate('default')
-            .setColumns(this._getColumns());
-    }
-
-    _getColumns() {
-        return [
-            {
-                name: "Artifact ID",
-                displayName: 'Artifact ID',
-                field: "artifactID",
-                headerCellTemplate: headerCellGroupingTemplate
-            },
-            {
-                name: "Name",
-                displayName: "Name",
-                field: "name",
-                headerCellTemplate: headerCellGroupingTemplate
-            },
-            {
-                name: "Severity",
-                displayName: "Severity",
-                field: "severity",
-                headerCellTemplate: headerCellGroupingTemplate
-            },
-            {
-                name: "Description",
-                displayName: "Description",
-                field: "description",
-                headerCellTemplate: headerCellGroupingTemplate
-            }
-        ]
-    }
-
-    _registerEvents() {
-        let self = this;
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TAB_NODE_CHANGED, (node) => {
-            if (this.currentNode != node) {
-                this.currentNode = node;
-                self._getData();
-            }
-        });
-    }
-
-    propertyShouldDisplay(property) {
-        return !_.contains(infoPropertyBlacklist, property);
-    }
-
-    updateComponentId(componentId) {
-        this.GovernanceDao.update({
-            "repoKey": this.currentNode.data.repoKey,
-            "path": this.currentNode.data.path,
-            "componentId": componentId,
-            "origComponentId": this.governanceData.info.componentId
-        }).$promise.then(() => this._getData());
-        this.editMode = false;
-    }
-
-    cancelEditMode($event) {
-        let element = $($event.toElement);
-        if (!element.hasClass('fa') && element.prop('tagName') !== 'INPUT') {
-            this.editMode = false;
-        }
-    }
-
-}
-export function jfGovernance() {
-    return {
-        restrict: 'EA',
-        controller: jfGovernanceController,
-        controllerAs: 'jfGovernance',
-        bindToController: true,
-        templateUrl: 'states/artifacts/jf_artifact_info/info_tabs/jf_governance.html',
-        scope: {
-            currentNode: '='
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_ivy_view.html b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_ivy_view.html
deleted file mode 100644
index d213d96..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_ivy_view.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<jf-panel jf-panel-heading="Ivy Content"
-          ng-if="jfIvyView.ivyViewData.fileContent">
-
-    <jf-clip-copy text-to-copy="jfIvyView.ivyViewData.fileContent"
-                  class="code-mirror-copy"
-                  object-name="Content"></jf-clip-copy>
-
-    <jf-code-mirror mime-type="text/xml"
-                    model="jfIvyView.ivyViewData.fileContent">
-    </jf-code-mirror>
-</jf-panel>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_ivy_view.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_ivy_view.js
deleted file mode 100644
index c7e9aa7..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_ivy_view.js
+++ /dev/null
@@ -1,54 +0,0 @@
-import EVENTS from '../../../../constants/artifacts_events.constants';
-
-class jfIvyViewController {
-    constructor($scope, ArtifactViewsDao, ArtifactoryEventBus) {
-        this.artifactIvyViewDao = ArtifactViewsDao;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.$scope = $scope;
-        this._initIvyView();
-    }
-
-    _initIvyView() {
-        this._registerEvents();
-        this._getIvyViewData();
-    }
-
-    _getIvyViewData() {
-        //Temp fix for preventing fetching data for non-file nodes (occurred when pressing "Artifacts" on sidebar)
-        if (!this.currentNode.data.path) {
-            return;
-        }
-
-        this.artifactIvyViewDao.fetch({
-            "view": "pom",
-            "repoKey": this.currentNode.data.repoKey,
-            "path": this.currentNode.data.path
-        }).$promise
-                .then((data) => {
-                    //console.log(data);
-                    this.ivyViewData= data;
-                    this.ivyViewData.fileContent=data.fileContent.trim();
-                })
-    }
-
-    _registerEvents() {
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TAB_NODE_CHANGED, (node) => {
-            if (this.currentNode != node) {
-                this.currentNode = node;
-                this._getIvyViewData();
-            }
-        });
-    }
-}
-export function jfIvyView() {
-    return {
-        restrict: 'EA',
-        controller: jfIvyViewController,
-        controllerAs: 'jfIvyView',
-        scope: {
-            currentNode: '='
-        },
-        bindToController: true,
-        templateUrl: 'states/artifacts/jf_artifact_info/info_tabs/jf_ivy_view.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_npm_info.html b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_npm_info.html
deleted file mode 100644
index 940ed20..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_npm_info.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<div ng-if="jfNpmInfo.npmData">
-    <jf-panel jf-panel-heading="Package Info">
-        <table class="jf-data-table">
-            <tr ng-repeat="(key,value) in jfNpmInfo.npmData.npmInfo">
-                <td>{{jfNpmInfo.DICTIONARY[key]}}:</td>
-                <td>
-                    <span ng-if="key != 'repository'">{{value}}</span>
-                    <span ng-if="key === 'repository'"><a target="_blank" ng-href="{{value}}">{{value}}</a></span>
-                </td>
-            </tr>
-        </table>
-    </jf-panel>
-
-    <jf-panel jf-panel-heading="Dependencies"
-              ng-if="jfNpmInfo.npmData.npmDependencies.length">
-
-        <jf-grid grid-options="jfNpmInfo.npmDependenciesGridOptions"
-                filter-field="name">
-        </jf-grid>
-    </jf-panel>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_npm_info.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_npm_info.js
deleted file mode 100644
index b4d3e2f..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_npm_info.js
+++ /dev/null
@@ -1,87 +0,0 @@
-import EVENTS from '../../../../constants/artifacts_events.constants';
-import DICTIONARY from './../../constants/artifact_general.constant';
-class jfNpmInfoController {
-    constructor($scope, ArtifactViewsDao, ArtifactoryEventBus, ArtifactoryGridFactory) {
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.artifactViewsDao = ArtifactViewsDao;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.DICTIONARY = DICTIONARY.npm;
-        this.npmData = {};
-        this.npmDependenciesGridOptions = {};
-        this.$scope = $scope;
-
-        this._initNpmInfo();
-    }
-
-    _initNpmInfo() {
-        this._getNpmInfoData();
-        this._registerEvents();
-    }
-
-    _getNpmInfoData() {
-        //Temp fix for preventing fetching data for non-file nodes (occurred when pressing "Artifacts" on sidebar)
-        if (!this.currentNode.data.path) {
-            return;
-        }
-
-        this.artifactViewsDao.fetch({
-            "view": "npm",
-            "repoKey": this.currentNode.data.repoKey,
-            "path": this.currentNode.data.path
-        }).$promise
-            .then((data) => {
-                this.npmData = data;
-                this._createGrid();
-            })
-    }
-
-    _createGrid() {
-        if (this.npmData.npmDependencies) {
-            if (!Object.keys(this.npmDependenciesGridOptions).length) {
-                this.npmDependenciesGridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                    .setRowTemplate('default')
-                    .setColumns(this._getColumns())
-                    .setGridData(this.npmData.npmDependencies);
-            } else {
-                this.npmDependenciesGridOptions.setGridData(this.npmData.npmDependencies)
-            }
-        }
-    }
-
-    _getColumns() {
-        return [
-            {
-                name: 'name',
-                displayName: 'Name',
-                field: 'name'
-            },
-            {
-                name: 'Version',
-                displayName: 'Version',
-                field: 'version'
-            }]
-    }
-
-    _registerEvents() {
-        let self = this;
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TAB_NODE_CHANGED, (node) => {
-            if (this.currentNode != node) {
-                this.currentNode = node;
-                self._getNpmInfoData();
-            }
-        });
-    }
-}
-
-export function jfNpmInfo() {
-    return {
-        restrict: 'EA',
-        controller: jfNpmInfoController,
-        controllerAs: 'jfNpmInfo',
-        scope: {
-            currentNode: '='
-        },
-        bindToController: true,
-        templateUrl: 'states/artifacts/jf_artifact_info/info_tabs/jf_npm_info.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_nuget.html b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_nuget.html
deleted file mode 100644
index f4c65ec..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_nuget.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<div ng-if="jfNuget.nugetData">
-    <jf-panel jf-panel-heading="Package Info"
-              ng-if="jfNuget.nugetData.nugetGeneralInfo">
-
-        <div ng-repeat="(key,value) in jfNuget.nugetData.nugetGeneralInfo"
-             class="artifact-file-icon"
-             ng-if="key == 'iconUrl'">
-            <img ng-src="{{value}}" alt="logo"/>
-        </div>
-
-        <table class="jf-data-table">
-            <tr ng-repeat="(key,value) in jfNuget.nugetData.nugetGeneralInfo" ng-if="key != 'description' && key != 'iconUrl'">
-                <td>{{jfNuget.DICTIONARY[key]}}:</td>
-                <td>
-                    <span ng-if="key != 'id' && key != 'description' && key != 'iconUrl' && key != 'licenseUrl' && key != 'projectUrl'">{{value}}</span>
-                    <span ng-if="key === 'licenseUrl' || key === 'projectUrl'"><a ng-href="{{value}}" target="_blank">{{value}}</a></span>
-                    <span ng-if="key === 'id'"><a ng-href="{{jfNuget.nugetData.nugetGeneralInfo.projectUrl}}" target="_blank">{{value}}</a></span>
-                </td>
-            </tr>
-        </table>
-    </jf-panel>
-
-    <jf-panel jf-panel-heading="Description"
-              ng-if="jfNuget.nugetData.nugetDescription">
-        <p>{{jfNuget.nugetData.nugetDescription.description}}</p>
-    </jf-panel>
-
-    <jf-panel jf-panel-heading="Dependencies"
-              ng-if="jfNuget.nugetData.dependencies">
-        <jf-grid grid-options="jfNuget.gridDependenciesOptions"
-                 no-pagination="true"></jf-grid>
-    </jf-panel>
-
-    <jf-panel jf-panel-heading="Framework Assemblies"
-              ng-if="jfNuget.nugetData.frameworkAssemblies">
-        <jf-grid grid-options="jfNuget.gridFrameworkAssembliesOptions"
-                 no-pagination="true"></jf-grid>
-    </jf-panel>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_nuget.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_nuget.js
deleted file mode 100644
index ac2c1a4..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_nuget.js
+++ /dev/null
@@ -1,121 +0,0 @@
-import EVENTS from '../../../../constants/artifacts_events.constants';
-import DICTIONARY from './../../constants/artifact_general.constant';
-class jfNugetController {
-    constructor($scope, ArtifactViewsDao, ArtifactoryEventBus, ArtifactoryGridFactory) {
-        this.artifactViewsDao = ArtifactViewsDao;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.DICTIONARY = DICTIONARY.nuget;
-        this.gridDependenciesOptions = {};
-        this.gridFrameworkAssembliesOptions = {};
-        this.nugetData = {};
-        this.$scope = $scope;
-        this._initNuget();
-    }
-
-    _initNuget() {
-        this._registerEvents();
-        this.getNugetData();
-    }
-
-    getNugetData() {
-
-        //Temp fix for preventing fetching data for non-file nodes (occurred when pressing "Artifacts" on sidebar)
-        if (!this.currentNode.data.path) {
-            return;
-        }
-
-        this.artifactViewsDao.fetch({
-            "view": "nuget",
-            "repoKey": this.currentNode.data.repoKey,
-            "path": this.currentNode.data.path
-        }).$promise
-                .then((data) => {
-                    this.nugetData = data;
-                        this._createGrid();
-                });
-    }
-
-    _createGrid() {
-        if (this.nugetData.dependencies) {
-            if (!Object.keys(this.gridDependenciesOptions).length) {
-                this.gridDependenciesOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                        .setRowTemplate('default')
-                        .setColumns(this._getColumns('dependencies'))
-                        .setGridData(this.nugetData.dependencies)
-            }
-            else {
-                this.gridDependenciesOptions.setGridData(this.nugetData.dependencies)
-            }
-        }
-        if (this.nugetData.frameworkAssemblies) {
-            if (!Object.keys(this.gridFrameworkAssembliesOptions).length) {
-                this.gridFrameworkAssembliesOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                        .setColumns(this._getColumns('frameworkAssemblies'))
-                        .setRowTemplate('default')
-                        .setGridData(this.nugetData.frameworkAssemblies)
-            }
-            else {
-                this.gridFrameworkAssembliesOptions.setGridData(this.nugetData.frameworkAssemblies);
-            }
-        }
-    }
-
-    _getColumns(gridType) {
-        if (gridType === 'dependencies') {
-            return [{
-                name: 'Id',
-                displayName: 'Id',
-                field: 'id'
-            },
-                {
-                    name: 'Version',
-                    displayName: 'Version',
-                    field: 'version'
-                },
-                {
-                    name: 'Target Framework',
-                    displayName: 'Target Framework',
-                    field: 'targetFramework'
-                }]
-        }
-        if (gridType === 'frameworkAssemblies') {
-            return [
-                {
-                    name: 'Assembly Name',
-                    displayName: 'Assembly Name',
-                    field: 'assemblyName'
-                },
-                {
-                    name: 'Target Framework',
-                    displayName: 'Target Framework',
-                    field: 'targetFramework'
-                }
-            ]
-        }
-    }
-
-    _registerEvents() {
-        let self = this;
-
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TAB_NODE_CHANGED, (node) => {
-            if (this.currentNode != node) {
-                this.currentNode = node;
-                self.getNugetData();
-            }
-        });
-    }
-
-}
-export function jfNuget() {
-    return {
-        restrict: 'EA',
-        controller: jfNugetController,
-        controllerAs: 'jfNuget',
-        scope: {
-            currentNode: '='
-        },
-        bindToController: true,
-        templateUrl: 'states/artifacts/jf_artifact_info/info_tabs/jf_nuget.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_pom_view.html b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_pom_view.html
deleted file mode 100644
index 907da06..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_pom_view.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<jf-panel jf-panel-heading="POM Content"
-          ng-if="jfPomView.pomViewData.fileContent">
-
-    <jf-clip-copy text-to-copy="jfPomView.pomViewData.fileContent"
-                  class="code-mirror-copy"
-                  object-name="Content"></jf-clip-copy>
-
-    <jf-code-mirror mime-type="text/xml"
-                    height="500px"
-                    model="jfPomView.pomViewData.fileContent">
-    </jf-code-mirror>
-</jf-panel>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_pom_view.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_pom_view.js
deleted file mode 100644
index c5a85ae..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_pom_view.js
+++ /dev/null
@@ -1,55 +0,0 @@
-import EVENTS from '../../../../constants/artifacts_events.constants';
-
-class jfPomViewController {
-    constructor($scope, ArtifactViewsDao, ArtifactoryEventBus) {
-        this.artifactPomViewDao = ArtifactViewsDao;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.$scope = $scope;
-        this._initPomView();
-    }
-
-    _initPomView() {
-        this._registerEvents();
-        this._getPomViewData();
-    }
-
-    _getPomViewData() {
-
-        //Temp fix for preventing fetching data for non-file nodes (occurred when pressing "Artifacts" on sidebar)
-        if (!this.currentNode.data.path) {
-            return;
-        }
-
-        this.artifactPomViewDao.fetch({
-            "view": "pom",
-            "repoKey": this.currentNode.data.repoKey,
-            "path": this.currentNode.data.path
-        }).$promise
-                .then((data) => {
-                    this.pomViewData= data;
-                    this.pomViewData.fileContent=data.fileContent.trim();
-                })
-    }
-
-    _registerEvents() {
-        let self = this;
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TAB_NODE_CHANGED, (node) => {
-            if (this.currentNode != node) {
-                this.currentNode = node;
-                self._getPomViewData();
-            }
-        });
-    }
-}
-export function jfPomView() {
-    return {
-        restrict: 'EA',
-        controller: jfPomViewController,
-        controllerAs: 'jfPomView',
-        scope: {
-            currentNode: '='
-        },
-        bindToController: true,
-        templateUrl: 'states/artifacts/jf_artifact_info/info_tabs/jf_pom_view.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_properties.html b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_properties.html
deleted file mode 100644
index 87c8ecb..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_properties.html
+++ /dev/null
@@ -1,101 +0,0 @@
-<div class="properties">
-    <div ng-if="jfProperties.canAnnotate">
-        <jf-switch jf-switch-title="Add:" ng-model="jfProperties.propertyType" options="['Property', 'Property Set']"></jf-switch>
-        <div ng-switch="jfProperties.propertyType">
-            <div ng-switch-when="Property">
-                <form name="propertyForm">
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <jf-field validations="properties" autofocus="true">
-                                <input type="text" class="input-text" placeholder="Name *"
-                                       name="propertyName"
-                                       ng-model="jfProperties.repoPropertySelected.name"
-                                       jf-validator-name
-                                       jf-validator-xml-name/>
-                            </jf-field>
-                        </div>
-                        <div class="form-group-cell">
-                            <input type="text" class="input-text" placeholder="Value"
-                                   ng-model="jfProperties.repoPropertySelected.value"/>
-                        </div>
-                        <div class="form-group-cell auto-width">
-                            <button class="btn btn-primary"
-                                    ng-click="jfProperties.addProperty()"
-                                    ng-disabled="!jfProperties.repoPropertySelected.name || !propertyForm.$valid">Add
-                            </button>
-                        </div>
-                    </div>
-                </form>
-            </div>
-            <div ng-switch-when="Property Set">
-                <div class="form-group">
-                    <div class="form-group-cell">
-                        <ui-select jf-disable-ng-animate ng-model="jfProperties.repoPropertySetSelected"
-                                   ng-change="jfProperties.getPropertySetValues()">
-                            <ui-select-match placeholder="Property Name">
-                                {{$select.selected.parent.name}}.{{$select.selected.property.name}}
-                            </ui-select-match>
-                            <ui-select-choices
-                                    repeat="property in jfProperties.propertiesOptions | filter: $select.search track by $index">
-                                <div ng-bind-html="property.parent.name+'.'+property.property.name | highlight: $select.search"></div>
-                            </ui-select-choices>
-                        </ui-select>
-                    </div>
-                    <div class="form-group-cell">
-                        <selectize placeholder='Select Value...'
-                                   config="jfProperties.propertySetMultiValuesConfig"
-                                   options="jfProperties.propertyValuesOptions"
-                                   ng-model="jfProperties.repoPropertySetSelected.value"
-                                   ng-if="jfProperties.isCurrentPropertyType('MULTI_SELECT')">
-                        </selectize>
-                        <selectize placeholder='Select Value...'
-                                   config="jfProperties.propertySetSingleValueConfig"
-                                   options="jfProperties.propertyValuesOptions"
-                                   ng-model="jfProperties.repoPropertySetSelected.value"
-                                   ng-if="jfProperties.isCurrentPropertyType('SINGLE_SELECT')">
-                        </selectize>
-
-                        <selectize placeholder='Select Value...'
-                                   config="jfProperties.propertySetAnyValueConfig"
-                                   options="jfProperties.propertyValuesOptions"
-                                   ng-model="jfProperties.repoPropertySetSelected.value"
-                                   ng-if="jfProperties.isCurrentPropertyType('ANY_VALUE')">
-                        </selectize>
-<!--
-                        <input type="text"
-                               ng-model="jfProperties.repoPropertySetSelected.value"
-                               typeahead="state.property.name for state in jfProperties.propertyValuesOptions | filter:$viewValue | limitTo:8"
-                               class="input-text any-property"
-                               ng-disabled="!jfProperties.repoPropertySetSelected"
-                               placeholder='Select Value...'
-                               ng-if="jfProperties.isCurrentPropertyType('ANY_VALUE')">
--->
-                    </div>
-                    <div class="form-group-cell auto-width">
-                        <button class="btn btn-primary"
-                                ng-click="jfProperties.addPropertySet()"
-                                ng-disabled="!jfProperties.propertySetMultiValuesConfig || !jfProperties.repoPropertySetSelected.propertyType
-                                    || !jfProperties.repoPropertySetSelected.property || !jfProperties.repoPropertySetSelected.value.length">
-                            Add
-                        </button>
-                    </div>
-                </div>
-            </div>
-        </div>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-checkbox text="Recursive">
-                    <input type="checkbox" id="inlineCheckbox1" ng-model="jfProperties.repoPropertyRecursive.recursive">
-
-                </jf-checkbox>
-                <jf-help-tooltip
-                        html="jfProperties.TOOLTIP.recursive"></jf-help-tooltip>
-            </div>
-        </div>
-    </div>
-    <jf-grid grid-options="jfProperties.propertyGridOption"
-             filter-field="name"
-             filter-on-change="true"
-             object-name="property/properties">
-    </jf-grid>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_properties.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_properties.js
deleted file mode 100644
index cc4b6c3..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_properties.js
+++ /dev/null
@@ -1,452 +0,0 @@
-import EVENTS from '../../../../constants/artifacts_events.constants';
-import KEYS       from '../../../../constants/keys.constants';
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-
-class jfPropertiesController {
-    constructor($q, $scope, ArtifactoryGridFactory, ArtifactPropertyDao, ArtifactoryEventBus, ArtifactoryModal,
-                PredefineDao, RepoPropertySetDao, ArtifactoryNotifications, $timeout, User) {
-
-        this.propertyGridOption = {};
-        this.$timeout = $timeout;
-        this.$q = $q;
-        this.user = User;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.artifactPropertyDao = ArtifactPropertyDao.getInstance();
-        this.predefineDao = PredefineDao.getInstance();
-        this.repoPropertySetDao = RepoPropertySetDao.getInstance();
-        this.modal = ArtifactoryModal;
-        this.$scope = $scope;
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this.propertyTypeKeys = KEYS.PROPERTY_TYPE;
-        this.propertyType = 'Property';
-        this.propertiesOptions = [];
-        this.repoPropertyRecursive = {recursive: false};
-        this.TOOLTIP = TOOLTIP.artifacts.browse;
-        this._createGrid();
-        this._getPropertiesData();
-        this._createModalScope();
-
-        ArtifactoryEventBus.registerOnScope($scope, EVENTS.TAB_NODE_CHANGED, (node) => {
-            this.currentNode = node;
-            this.clearFields();
-            this._getPropertiesData();
-        });
-
-        /**
-         *  config selectize inputs
-         *  **/
-        this.propertySetMultiValuesConfig = {
-            sortField: 'text',
-            maxItems: null,
-            plugins: ['remove_button']
-        }
-        this.propertySetSingleValueConfig = {
-            sortField: 'text',
-            maxItems: 1
-        }
-        this.propertySetAnyValueConfig = {
-            sortField: 'text',
-            maxItems: 1,
-            create: true,
-            createOnBlur: true,
-            persist: true
-        }
-    }
-
-    /**
-     * delete Selected properties by batch
-     * **/
-    deleteSelectedProperties(recursive) {
-        let self = this;
-        let selectedProperties = this.propertyGridOption.api.selection.getSelectedRows();
-        let confirmMessage = 'Are you sure you wish to delete ' + selectedProperties.length;
-        confirmMessage += selectedProperties.length > 1 ? ' properties?' : ' property?';
-
-        this.modal.confirm(confirmMessage)
-            .then(() => {
-                let propertiesToDelete = selectedProperties.map(property => {
-                    return {
-                        name: property.name,
-                        path: self.currentNode.data.path,
-                        repoKey: self.currentNode.data.repoKey,
-                        recursive: recursive
-                    }
-                });
-                this.artifactPropertyDao.deleteBatch({properties:propertiesToDelete}).$promise.then(()=> {
-                    this._getPropertiesData();
-                })
-            });
-    }
-
-    /**
-     * delete single proerty
-     * ***/
-    deleteSingleProperty(row, recursive) {
-
-        let json ={properties:[
-            {
-                name: row.name,
-                path: this.currentNode.data.path,
-                repoKey: this.currentNode.data.repoKey,
-                recursive: recursive
-            }
-        ]
-    }
-
-        this.modal.confirm('Are you sure you wish to delete this property?')
-            .then(() => {
-                this.artifactPropertyDao.deleteBatch(json).$promise.then(()=> {
-                        this._getPropertiesData();
-                    })
-            });
-    }
-
-    clearFields() {
-        if (this.repoPropertySetSelected) {
-            if (this.repoPropertySetSelected.parent) {
-                delete this.repoPropertySetSelected.parent;
-            }
-            if (this.repoPropertySetSelected.property) {
-                delete this.repoPropertySetSelected.property;
-            }
-            if (this.repoPropertySetSelected.value) {
-                delete this.repoPropertySetSelected.value;
-            }
-        }
-    }
-
-    isSelected(propertyType) {
-        return this.propertyType == propertyType;
-    }
-
-    setProperty(propertyType) {
-        this.propertyType = propertyType;
-    }
-
-    /**
-     * add Property Set to list
-     * **/
-    addPropertySet() {
-        if (this.repoPropertySetSelected) {
-            this._savePropertySetValues(this.repoPropertySetSelected);
-        }
-        this.repoPropertySetSelected = '';
-        this.propertyValuesOptions = [];
-    }
-
-    /**
-     * add single property to list
-     * **/
-    addProperty() {
-        let objProperty = this._createNewRepoObject(this.repoPropertySelected.name)
-        delete objProperty.text;
-        delete objProperty.value;
-        this._savePropertyValues(objProperty);
-
-        this.repoPropertySelected.name = '';
-        this.repoPropertySelected.value = '';
-    }
-
-    /**
-     * pouplited values to input propertyValuesOptions
-     *
-     * **/
-    getPropertySetValues() {
-        if (this.repoPropertySetSelected) {
-            this.predefineDao.get({
-                name: this.repoPropertySetSelected.parent.name + "." + this.repoPropertySetSelected.property.name,
-                path: this.currentNode.data.path,
-                repoKey: this.currentNode.data.repoKey,
-                recursive: this.recursive
-            }).$promise.then((predefineValues)=> {
-
-                    this._getPropertySetPreDefinedValues(predefineValues);
-                });
-        }
-    }
-
-    isCurrentPropertyType(type) {
-        if (!this.repoPropertySetSelected && type === 'ANY_VALUE') {
-            return true;
-        }
-        else if (this.repoPropertySetSelected) {
-            if(!this.repoPropertySetSelected.propertyType && type === 'ANY_VALUE') {
-                return true;
-            }
-            return this.propertyTypeKeys[this.repoPropertySetSelected.propertyType] === this.propertyTypeKeys[type]
-        }
-    }
-
-    setModalData(selectedProperty, predefineValues) {
-        this.modalScope.property = selectedProperty;
-        this.modalScope.property.predefineValues = predefineValues ? predefineValues.predefinedValues : null;
-        this.modalScope.property.selectedValues = [];
-        this.modalScope.property.modalTitle = "Add New '" + selectedProperty.property.name + "' Property";
-        this.modalScope.save = (property) =>this._savePropertySetValues(property);
-        this._propertyFormModal();
-    }
-
-
-    editSelectedProperty(row) {
-
-        let selectedProperty = row;
-
-        this.artifactPropertyDao.get({
-            name: selectedProperty.name,
-            path: this.currentNode.data.path,
-            repoKey: this.currentNode.data.repoKey
-
-        }).$promise.then((currentProperty)=> {
-                    //console.log('currentProperty=',currentProperty);
-                this.modalScope.property = currentProperty;
-                this.modalScope.property.selectedValues = this.modalScope.property.propertyType !== 'MULTI_SELECT' && _.isArray(this.modalScope.property.selectedValues) ? this.modalScope.property.selectedValues.join(';') : this.modalScope.property.selectedValues;
-                this.modalScope.selectizeConfig = {
-                    create: currentProperty.propertyType === 'ANY_VALUE',
-                    maxItems: 1
-                };
-//                this.modalScope.property.multiValue = currentProperty.propertyType && currentProperty.propertyType === 'MULTI_SELECT';
-                this.modalScope.property.modalTitle = "Edit '" + selectedProperty.name + "' Property";
-                this.modalScope.property.name = selectedProperty.name;
-                this.modalScope.save = (property) =>this._updatePropertySetValues(property)
-                this._propertyFormModal();
-
-            });
-    }
-
-    /**
-     * build defulat template proerty
-     * **/
-    _createNewRepoObject(repoName) {
-        return {
-            multiValue: false,
-            property: {name: repoName},
-            text: repoName,
-            value: repoName
-        }
-    }
-
-    /**
-     * popluted grid data and property Set list name
-     * **/
-    _getPropertiesData() {
-        this.user.canAnnotate(this.currentNode.data.repoKey, this.currentNode.data.path).then((response) => {
-            this.canAnnotate = response.data;
-        });
-        this.artifactPropertyDao.query({
-            path: this.currentNode.data.path,
-            repoKey: this.currentNode.data.repoKey
-        }).$promise.then((properties) => {
-
-                this.properties = properties.artifactProperties ? properties.artifactProperties.map(this._formatToArray) : [];
-                this._createDisplayValues();
-                this.propertyGridOption.setGridData(this.properties);
-
-                this._getPropertySetData();
-            });
-    }
-
-    _getPropertySetData() {
-        this.repoPropertySetDao.query({
-            path: this.currentNode.data.path,
-            repoKey: this.currentNode.data.repoKey
-        }).$promise.then((_propertyOptionList)=> {
-                let propertyOptionList = [];
-                _propertyOptionList.forEach((propertyOption)=> {
-                    propertyOption.value = propertyOption.property.name;
-                    propertyOption.text = propertyOption.property.name;
-                    propertyOptionList.push(propertyOption);
-                });
-                this.propertiesOptions = propertyOptionList;
-
-            });
-    }
-
-    _createModalScope() {
-        this.modalScope = this.$scope.$new();
-        this.modalScope.closeModal = () => this.modalInstance.close();
-    }
-
-    _createGrid() {
-        this.propertyGridOption = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setColumns(this._getColumns())
-                .setRowTemplate('default')
-                .setMultiSelect()
-                .setButtons(this._getActions())
-                .setBatchActions(this._getBatchActions());
-    }
-
-    _getActions() {
-        return [
-            {
-                icon: 'icon icon-clear',
-                tooltip: 'Delete',
-                callback: row => this.deleteSingleProperty(row, false),
-                visibleWhen: () => this.canAnnotate
-            },
-            {
-                icon: 'icon icon-delete-versions',
-                tooltip: 'Delete Recursively',
-                callback: row => this.deleteSingleProperty(row, true),
-                visibleWhen: () => this.canAnnotate && (this.currentNode.data.type == 'folder' || this.currentNode.data.type == 'repository')
-            }
-        ];
-    }
-
-    _getBatchActions() {
-        return [
-            {
-                icon: 'clear',
-                name: 'Delete',
-                callback: () => this.deleteSelectedProperties(false),
-                visibleWhen: () => this.canAnnotate
-            },
-            {
-                icon: 'delete-recursive',
-                name: 'Delete Recursively',
-                callback: () => this.deleteSelectedProperties(true),
-                visibleWhen: () => this.canAnnotate && (this.currentNode.data.type == 'folder' || this.currentNode.data.type == 'repository')
-            }
-        ]
-    }
-
-    _propertyFormModal() {
-        this.modalInstance = this.modal.launchModal("property_modal", this.modalScope, (this.modalScope.property.propertyType != 'MULTI_SELECT' ? 'sm' : 'lg'));
-    }
-
-    _savePropertyValues(property) {
-        if (this.repoPropertySelected.value.indexOf(';') >= 0) {
-            property.selectedValues = _.filter(this.repoPropertySelected.value.split(';'),(val)=>!!val);
-        }
-        else {
-            property.selectedValues = [];
-            property.selectedValues.push(this.repoPropertySelected.value);
-        }
-        this.artifactPropertyDao.save({
-            path: this.currentNode.data.path,
-            repoKey: this.currentNode.data.repoKey,
-            recursive: this.repoPropertyRecursive.recursive
-        }, property).$promise.then(()=> {
-                this._getPropertiesData();
-            });
-    }
-
-    _savePropertySetValues(property) {
-        if (property.propertyType==='MULTI_SELECT') {
-            this._addValuesToMulti(property, this.repoPropertySetSelected.value);
-        }
-        else {
-            property.selectedValues = this.repoPropertySetSelected.value;
-        }
-
-        if (!property.multiValue && !_.isArray(property.selectedValues)) {
-            let selectedValuesToArray = angular.copy(property.selectedValues);
-            property.selectedValues = [];
-            property.selectedValues.push(selectedValuesToArray);
-
-        }
-
-        this.artifactPropertyDao.save({
-            path: this.currentNode.data.path,
-            repoKey: this.currentNode.data.repoKey,
-            recursive: this.repoPropertyRecursive.recursive
-        }, property).$promise.then(()=> {
-                    this._getPropertiesData();
-                });
-    }
-
-    _addValuesToMulti(property, addedValues) {
-        //console.log(property);
-        let theProperty = _.findWhere(this.properties, {name: property.parent.name+'.'+property.property.name});
-        if (theProperty) {
-            property.selectedValues = theProperty.value.concat(addedValues);
-        }
-        else {
-            property.selectedValues = addedValues;
-        }
-    }
-
-
-    _updatePropertySetValues(property) {
-        if (property.selectedValues.indexOf(';') >= 0) property.selectedValues = _.filter(property.selectedValues.split(';'),(val)=>!!val);
-        if (!property.multiValue && !_.isArray(property.selectedValues)) {
-            let selectedValuesToArray = angular.copy(property.selectedValues);
-            property.selectedValues = [];
-            property.selectedValues.push(selectedValuesToArray);
-
-        }
-        //console.log(property);
-        this.artifactPropertyDao.update({
-            path: this.currentNode.data.path,
-            repoKey: this.currentNode.data.repoKey,
-            recursive: this.repoPropertyRecursive.recursive
-        }, property).$promise.then(()=> {
-                    this._getPropertiesData();
-                    this.modalInstance.close();
-                });
-    }
-
-    _getPropertySetPreDefinedValues(predefineValues) {
-        this.propertyValuesOptions = [];
-        predefineValues.predefinedValues.forEach((preValue)=> {
-            this.propertyValuesOptions.push(this._createNewRepoObject(preValue));
-            this.repoPropertySetSelected.value = [];
-        });
-        this.repoPropertySetSelected.value = predefineValues.selectedValues;
-    }
-
-    _getColumns() {
-
-        let cellTemplate = '<div class="grid-items-container"><div class="item" ng-if="row.entity.value.length>1" ng-repeat="col in row.entity.value track by $index">{{col}}</div>' +
-            '<div class="ui-grid-cell-contents" ng-if="row.entity.value.length==1"><span ng-if="!row.entity.displayValues[0]">{{row.entity.value[0]}}</span><span ng-if="row.entity.displayValues[0]" ng-bind-html="row.entity.displayValues[0]"></span></div></div>';
-
-        let keyCellTemplate = '<div ng-if="!grid.appScope.jfProperties.canAnnotate" class="ui-grid-cell-contents">{{row.entity.name}}</div>' +
-                '<div ng-if="grid.appScope.jfProperties.canAnnotate" class="ui-grid-cell-contents"><a href="" ng-click="grid.appScope.jfProperties.editSelectedProperty(row.entity)">{{row.entity.name}}</a></div>'
-
-        return [
-            {
-                name: "Property",
-                displayName: "Property",
-                field: "name",
-                cellTemplate: keyCellTemplate
-            },
-            {
-                name: "Value(s)",
-                displayName: "Value(s)",
-                field: "value",
-                cellTemplate: cellTemplate
-            }
-        ]
-    }
-
-    _formatToArray(list) {
-        return {name: list.name, value: _.trimRight(list.value.toString(), ';').split(';')};
-    }
-
-    _createDisplayValues() {
-        var urlRegex = /^https?:\/\/[a-zA-Z]+(\.)?(:[0-9]+)?.+?(?=\s|$|"|'|>|<)/;
-        _.map(this.properties,(prop) => {
-            let displayValues = [];
-            for (let i = 0; i<prop.value.length; i++) {
-                let val = prop.value[i];
-                if (val.match(urlRegex)) {
-                    displayValues[i] = `<a href="${val}" target="_blank">${val}</a>`;
-                }
-                else displayValues[i] = undefined;
-            }
-            prop.displayValues = displayValues;
-        });
-    }
-
-}
-export function jfProperties() {
-    return {
-        restrict: 'EA',
-        controller: jfPropertiesController,
-        scope: {
-            currentNode: '='
-        },
-        controllerAs: 'jfProperties',
-        bindToController: true,
-        templateUrl: 'states/artifacts/jf_artifact_info/info_tabs/jf_properties.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_pypi.html b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_pypi.html
deleted file mode 100644
index d9cc292..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_pypi.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<div class="pypi">
-    <jf-panel jf-panel-heading="Package Info"
-              ng-if="jfPyPi.pyPiData.pypiPkgInfo">
-        <table class="jf-data-table">
-            <tr ng-repeat="(key,value) in jfPyPi.pyPiData.pypiPkgInfo"
-                 class="padded-row-1x">
-                <td ng-if="(key!='license' && key!='homepage') || !jfPyPi.isValidUrl(value)">{{jfPyPi.DICTIONARY[key]}}:</td>
-                <td ng-if="(key!='license' && key!='homepage') || !jfPyPi.isValidUrl(value)">{{value}}</td>
-
-                <td ng-if="(key==='license' || key==='homepage') && jfPyPi.isValidUrl(value)">{{jfPyPi.DICTIONARY[key]}}:</td>
-                <td ng-if="(key==='license' || key==='homepage') && jfPyPi.isValidUrl(value)"><a ng-href="{{value}}" target="_blank">{{value}}</a></td>
-            </tr>
-        </table>
-    </jf-panel>
-
-    <jf-panel jf-panel-heading="Categories"
-              ng-if="jfPyPi.pyPiData.categories.length">
-
-        <jf-grid grid-options="jfPyPi.categoriesGridOptions"></jf-grid>
-    </jf-panel>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_pypi.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_pypi.js
deleted file mode 100644
index 26057a0..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_pypi.js
+++ /dev/null
@@ -1,86 +0,0 @@
-import EVENTS from '../../../../constants/artifacts_events.constants';
-import DICTIONARY from './../../constants/artifact_general.constant';
-class jfPyPiController {
-    constructor($scope, ArtifactViewsDao, ArtifactoryEventBus, ArtifactoryGridFactory) {
-        this.artifactViewsDao = ArtifactViewsDao;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.DICTIONARY = DICTIONARY.pyPi;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.pyPiData = {};
-        this.$scope = $scope;
-        this.categoriesGridOptions = {};
-        this._initPyPi();
-
-        this._createGrid();
-    }
-
-    _initPyPi() {
-        this._registerEvents();
-        this.getPyPiData();
-    }
-
-    _createGrid() {
-        this.categoriesGridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-            .setColumns(this._getCategoriesColumns())
-            .setRowTemplate('default');
-    }
-
-    _getCategoriesColumns() {
-        return [
-            {
-                name: "Category",
-                displayName: "Category",
-                field: "category"
-//                cellTemplate: '<div class="ui-grid-cell-contents">{{row.entity}}</div>'
-            }
-        ]
-    }
-
-    isValidUrl(str) {
-        var regex = /^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/ [...]
-        return regex.test(str);
-    }
-
-    getPyPiData() {
-        //Temp fix for preventing fetching data for non-file nodes (occurred when pressing "Artifacts" on sidebar)
-        if (!this.currentNode.data.path) {
-            return;
-        }
-
-        this.artifactViewsDao.fetch({
-            "view": "pypi",
-            "repoKey": this.currentNode.data.repoKey,
-            "path": this.currentNode.data.path
-        }).$promise
-            .then((data) => {
-                this.pyPiData = data;
-                this.categoriesGridOptions.setGridData(data.categories.map((cat) => {
-                    return {category:cat};
-                }));
-            });
-    }
-
-    _registerEvents() {
-        let self = this;
-
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TAB_NODE_CHANGED, (node) => {
-            if (self.currentNode != node) {
-                self.currentNode = node;
-                self.getPyPiData();
-            }
-        });
-    }
-
-}
-export function jfPyPi() {
-    return {
-        restrict: 'EA',
-        controller: jfPyPiController,
-        controllerAs: 'jfPyPi',
-        scope: {
-            currentNode: '='
-        },
-        bindToController: true,
-        templateUrl: 'states/artifacts/jf_artifact_info/info_tabs/jf_pypi.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_rpm_info.html b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_rpm_info.html
deleted file mode 100644
index a0a2cd1..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_rpm_info.html
+++ /dev/null
@@ -1,88 +0,0 @@
-<div class="rpm">
-    <jf-panel jf-panel-heading="Package Info"
-              ng-if="jfRpm.rpmData.generalRpmMetadata">
-        <table class="jf-data-table">
-            <tr ng-repeat="(key,value) in jfRpm.rpmData.generalRpmMetadata">
-                <td>{{jfRpm.DICTIONARY[key]}}:</td>
-                <td>{{value}}</td>
-            </tr>
-        </table>
-    </jf-panel>
-
-    <jf-panel jf-panel-heading="Miscellaneous"
-              ng-if="jfRpm.rpmData.miscRpmMetadata">
-        <table class="jf-data-table">
-            <tr ng-repeat="(key,value) in jfRpm.rpmData.miscRpmMetadata">
-                <td ng-if="key === 'url'">{{jfRpm.DICTIONARY[key]}}:</td>
-                <td ng-if="key === 'url'"><a ng-href="{{value}}" target="_blank">{{value}}</a></td>
-
-                <td ng-if="key !== 'url'">{{jfRpm.DICTIONARY[key]}}:</td>
-                <td ng-if="key !== 'url'">{{value}}</td>
-            </tr>
-        </table>
-    </jf-panel>
-
-    <jf-panel jf-panel-heading="Description">
-        <div class="panel-body general-info" ng-if="jfRpm.rpmData.description">
-            <p class="preserve-lb">{{jfRpm.rpmData.description}}</p>
-        </div>
-    </jf-panel>
-
-    <jf-panel jf-panel-heading="Provides"
-              ng-if="jfRpm.rpmData.provide.length">
-        <div class="grid-container clearfix">
-            <jf-grid-pagination grid-api="jfRpm.gridProvideOptions.api"></jf-grid-pagination>
-            <div ui-grid="jfRpm.gridProvideOptions"
-                 ui-grid-pagination
-                 class="grid"></div>
-        </div>
-    </jf-panel>
-
-    <jf-panel jf-panel-heading="Requires"
-              ng-if="jfRpm.rpmData.require.length">
-        <div class="grid-container clearfix">
-            <jf-grid-pagination grid-api="jfRpm.gridRequireOptions.api"></jf-grid-pagination>
-            <div ui-grid="jfRpm.gridRequireOptions"
-                 ui-grid-pagination
-                 class="grid"></div>
-        </div>
-    </jf-panel>
-
-    <jf-panel jf-panel-heading="Obsoletes"
-              ng-if="jfRpm.rpmData.obsolete.length">
-        <div class="grid-container clearfix">
-            <jf-grid-pagination grid-api="jfRpm.gridObsoleteOptions.api"></jf-grid-pagination>
-            <div ui-grid="jfRpm.gridObsoleteOptions"
-                 ui-grid-pagination
-                 class="grid"></div>
-        </div>
-    </jf-panel>
-
-    <jf-panel jf-panel-heading="Conflicts"
-              ng-if="jfRpm.rpmData.conflict.length">
-        <div class="grid-container clearfix">
-            <jf-grid-pagination grid-api="jfRpm.gridConflictOptions.api"></jf-grid-pagination>
-            <div ui-grid="jfRpm.gridConflictOptions"
-                 ui-grid-pagination
-                 class="grid"></div>
-        </div>
-    </jf-panel>
-
-    <jf-panel jf-panel-heading="Change Log"
-              jf-panel-classes="event-container changelogs"
-              ng-if="jfRpm.rpmData.changeLogs">
-        <div ng-repeat="item in jfRpm.rpmData.changeLogs track by $index"
-             class="padded-row-1x">
-
-            <jf-panel jf-panel-heading="{{item.date}}">
-                <!--<div class="pull-right">
-                            <a clip-copy="item.text"
-                               tooltip="Copy" class="copy-to-clip icon icon-copy-to-clipboard"></a>
-                        </div> -->
-                <div class="event-author">{{item.author}}</div>
-                <div class="preserve-lb">{{item.text}}</div>
-            </jf-panel>
-
-        </div>
-    </jf-panel>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_rpm_info.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_rpm_info.js
deleted file mode 100644
index 80697ac..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_rpm_info.js
+++ /dev/null
@@ -1,150 +0,0 @@
-import EVENTS from '../../../../constants/artifacts_events.constants';
-import DICTIONARY from './../../constants/artifact_general.constant';
-class jfRpmController {
-    constructor($scope, ArtifactViewsDao, ArtifactoryEventBus, ArtifactoryGridFactory) {
-        this.artifactViewsDao = ArtifactViewsDao;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.DICTIONARY = DICTIONARY.rpm;
-        this.gridProvideOptions = {};
-        this.gridRequireOptions = {};
-        this.gridObsoleteOptions = {};
-        this.gridConflictOptions = {};
-        this.rpmData = {};
-        this.$scope = $scope;
-        this._initRpm();
-    }
-
-    _initRpm() {
-        this._registerEvents();
-        this.getRpmData();
-    }
-
-    getRpmData() {
-        //Temp fix for preventing fetching data for non-file nodes (occurred when pressing "Artifacts" on sidebar)
-        if (!this.currentNode.data.path) {
-            return;
-        }
-
-        this.artifactViewsDao.fetch({
-            "view": "rpm",
-            "repoKey": this.currentNode.data.repoKey,
-            "path": this.currentNode.data.path
-        }).$promise
-                .then((data) => {
-                    this.rpmData = data;
-                    this._createGrid();
-                });
-    }
-
-    _createGrid() {
-        if (this.rpmData.provide) {
-            if (!Object.keys(this.gridProvideOptions).length) {
-                this.gridProvideOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                        .setRowTemplate('default')
-                        .setColumns(this._getColumns('provide'))
-                        .setGridData(this.rpmData.provide)
-            }
-            else {
-                this.gridProvideOptions.setGridData(this.rpmData.provide)
-            }
-        }
-        if (this.rpmData.require) {
-            if (!Object.keys(this.gridRequireOptions).length) {
-                this.gridRequireOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                        .setColumns(this._getColumns())
-                        .setRowTemplate('default')
-                        .setGridData(this.rpmData.require)
-            }
-            else {
-                this.gridRequireOptions.setGridData(this.rpmData.require);
-            }
-        }
-        if (this.rpmData.obsolete) {
-            if (!Object.keys(this.gridObsoleteOptions).length) {
-                this.gridObsoleteOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                        .setColumns(this._getColumns())
-                        .setRowTemplate('default')
-                        .setGridData(this.rpmData.obsolete)
-            }
-            else {
-                this.gridObsoleteOptions.setGridData(this.rpmData.obsolete);
-            }
-        }
-
-        if (this.rpmData.conflict) {
-            if (!Object.keys(this.gridConflictOptions).length) {
-                this.gridConflictOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                        .setColumns(this._getColumns())
-                        .setRowTemplate('default')
-                        .setGridData(this.rpmData.conflict)
-            }
-            else {
-                this.gridConflictOptions.setGridData(this.rpmData.conflict);
-            }
-        }
-    }
-
-    _getColumns() {
-        return [
-            {
-                name: 'Name',
-                displayName: 'Name',
-                field: 'name',
-                width: '25%'
-            },
-            {
-                name: 'Flags',
-                displayName: 'Flags',
-                field: 'flags',
-                width: '15%'
-            },
-            {
-                name: 'Epoch',
-                displayName: 'Epoch',
-                field: 'epoch',
-                width: '15%'
-            },
-            {
-                name: 'Version',
-                displayName: 'Version',
-                field: 'version',
-                width: '15%'
-            }, {
-                name: 'Release',
-                displayName: 'Release',
-                field: 'release',
-                width: '15%'
-            },
-            {
-                name: 'Pre',
-                displayName: 'Pre',
-                field: 'pre',
-                width: '15%'
-            }]
-    }
-
-    _registerEvents() {
-        let self = this;
-
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TAB_NODE_CHANGED, (node) => {
-            if (this.currentNode != node) {
-                this.currentNode = node;
-                self.getRpmData();
-            }
-        });
-    }
-
-}
-export function jfRpm() {
-    return {
-        restrict: 'EA',
-        controller: jfRpmController,
-        controllerAs: 'jfRpm',
-        scope: {
-            currentNode: '='
-        },
-        bindToController: true,
-        templateUrl: 'states/artifacts/jf_artifact_info/info_tabs/jf_rpm_info.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_ruby_gems.html b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_ruby_gems.html
deleted file mode 100644
index 079612d..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_ruby_gems.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<div ng-if="jfRubyGems.gemsRubyData">
-    <jf-panel jf-panel-heading="Package Info"
-              ng-if="jfRubyGems.gemsRubyData.gemsInfo">
-        <table class="jf-data-table">
-            <tr ng-repeat="(key,value) in jfRubyGems.gemsRubyData.gemsInfo">
-                <td ng-if="key == 'homepage'" class="gems-key">Homepage :</td>
-                <td ng-if="key == 'homepage'"><a ng-href="{{value}}" target="_blank" class="gems-value">{{value}}</a></td>
-
-                <td ng-if="key != 'homepage'">{{jfRubyGems.DICTIONARY[key]}} :</td>
-                <td ng-if="key != 'homepage'" class="gems-value">{{value}}
-                    <jf-clip-copy ng-if="key === 'repositoryPath'"
-                                  text-to-copy="jfRubyGems.getRepoPath()"
-                                  object-name="Path"></jf-clip-copy>
-
-                </td>
-            </tr>
-        </table>
-    </jf-panel>
-
-    <jf-panel jf-panel-heading="Dependencies"
-              ng-if="jfRubyGems.gemsRubyData.gemsDependencies && jfRubyGems.gemsRubyData.gemsDependencies.length">
-        <div class="grid-container clearfix">
-            <jf-grid-pagination grid-api="jfRubyGems.gemsRubyGridOptions.api"></jf-grid-pagination>
-            <div ui-grid="jfRubyGems.gemsRubyGridOptions"
-                 class="grid"></div>
-        </div>
-    </jf-panel>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_ruby_gems.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_ruby_gems.js
deleted file mode 100644
index 9f587c7..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_ruby_gems.js
+++ /dev/null
@@ -1,93 +0,0 @@
-import EVENTS from '../../../../constants/artifacts_events.constants';
-import DICTIONARY from './../../constants/artifact_general.constant';
-class jfRubyGemsController {
-    constructor($scope, ArtifactViewsDao, ArtifactoryEventBus, ArtifactoryGridFactory) {
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.artifactViewsDao = ArtifactViewsDao;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.DICTIONARY = DICTIONARY.rubyGems;
-        this.gemsRubyGridOptions = {};
-        this.$scope = $scope;
-        this._initRubyGems();
-    }
-
-    getRepoPath() {
-        return this.currentNode.data.repoKey + "/" + this.currentNode.data.path;
-    }
-
-    _initRubyGems() {
-        this._createGrid();
-        this._registerEvents();
-        this._getRubyGemsData();
-    }
-    _getColumns() {
-        return [
-            {
-                name: 'Name',
-                displayName: 'Name',
-                field:'name'
-            },
-            {
-                name: 'Version',
-                displayName: 'Version',
-                field:'version'
-            },
-            {
-                name: 'Type',
-                displayName: 'Type',
-                field:'type'
-            }
-        ]
-    }
-
-    _getRubyGemsData() {
-        //Temp fix for preventing fetching data for non-file nodes (occurred when pressing "Artifacts" on sidebar)
-        if (!this.currentNode.data.path) {
-            return;
-        }
-
-        this.artifactViewsDao.fetch({
-            "view": "gems",
-            "repoKey": this.currentNode.data.repoKey,
-            "path": this.currentNode.data.path
-        }).$promise
-                .then((data) => {
-                    //console.log(data);
-                    this.gemsRubyData = data;
-                    this.gemsRubyGridOptions.setGridData(this.gemsRubyData.gemsDependencies);
-                })
-    }
-
-    _createGrid() {
-        if (!this.gridFrameworkAssembliesOptions || !Object.keys(this.gridFrameworkAssembliesOptions).length) {
-            this.gemsRubyGridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                    .setColumns(this._getColumns())
-                    .setRowTemplate('default');
-        }
-        else{
-            this._getRubyGemsData();
-        }
-    }
-
-    _registerEvents() {
-        let self = this;
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TAB_NODE_CHANGED, (node) => {
-            if (this.currentNode != node) {
-                this.currentNode = node;
-                self._getRubyGemsData();
-            }
-        });
-    }
-}
-export function jfRubyGems() {
-    return {
-        restrict: 'EA',
-        controller: jfRubyGemsController,
-        controllerAs: 'jfRubyGems',
-        scope: {
-            currentNode: '='
-        },
-        bindToController: true,
-        templateUrl: 'states/artifacts/jf_artifact_info/info_tabs/jf_ruby_gems.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_stash_info.html b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_stash_info.html
deleted file mode 100644
index 7b3208c..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_stash_info.html
+++ /dev/null
@@ -1,97 +0,0 @@
-<div ng-if="!jfStashInfo.currentNode.data.info.artifactCount">
-    <div class="alert alert-warning">
-        You currently do not have any saved search results.
-        You can save new search results after <a href="" ng-click="jfStashInfo.gotoSearch()">searching artifacts</a>.
-    </div>
-</div>
-
-<jf-panel jf-panel-heading="Info" ng-if="jfStashInfo.currentNode.data.info.artifactCount">
-    <table class="jf-data-table">
-        <tr>
-            <td>Artifact Count:</td>
-            <td>{{jfStashInfo.currentNode.data.info.artifactCount}}</td>
-        </tr>
-    </table>
-</jf-panel>
-
-<jf-panel jf-panel-heading="Export Stashed Results" ng-if="jfStashInfo.currentNode.data.info.artifactCount && jfStashInfo.allowExport">
-    <form class="form" name="exportForm" novalidate>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-field validations="common">
-                    <label for="export-path">Export Path on Server*</label>
-                    <input type="text"
-                           class="input-text"
-                           required
-                           id="export-path"
-                           name="path"
-                           ng-model="jfStashInfo.exportOptions.path"
-                           ng-focus="jfStashInfo.clearValidations()"/>
-                </jf-field>
-            </div>
-            <div class="form-group-cell form-button">
-                <jf-browse-files browser-resource="jfStashInfo.browseFilesDao"
-                                 start-folder="jfStashInfo.exportOptions.path"
-                                 browser-update-folder="jfStashInfo.updateExportFolderPath(directory)"
-                                 browser-options="jfStashInfo.exportFileBrowserOptions">
-                </jf-browse-files>
-            </div>
-        </div>
-        <div class="form-group form-checkbox">
-            <div class="form-group-cell">
-                <jf-checkbox text="Exclude Metadata">
-                    <input type="checkbox"
-                           id="exportExcludeMetadata"
-                           ng-model="jfStashInfo.exportOptions.excludeMetadata"
-                           name="excludeMetadata">
-                </jf-checkbox>
-
-            </div>
-        </div>
-        <div class="form-group form-checkbox">
-            <div class="form-group-cell">
-                <jf-checkbox text="Create .m2 Compatible Export">
-                    <input type="checkbox"
-                           id="exportCreateM2CompatibleExport"
-                           ng-model="jfStashInfo.exportOptions.m2"
-                           name="createM2CompatibleExport">
-                </jf-checkbox>
-                <jf-help-tooltip html="jfStashInfo.TOOLTIP.createM2CompatibleExport"></jf-help-tooltip>
-
-            </div>
-        </div>
-        <div class="form-group form-checkbox">
-            <div class="form-group-cell">
-                <jf-checkbox text="Create a Zip Archive (Slow and CPU Intensive!)">
-                    <input
-                            type="checkbox"
-                            id="createArchive"
-                            ng-model="jfStashInfo.exportOptions.createArchive"
-                            name="createArchive">
-                </jf-checkbox>
-                <jf-help-tooltip html="jfStashInfo.TOOLTIP.createArchive"></jf-help-tooltip>
-
-            </div>
-        </div>
-        <div class="form-group form-checkbox">
-            <div class="form-group-cell">
-                <jf-checkbox text="Output Verbose Log">
-                    <input
-                            type="checkbox"
-                            id="exportOutputVerboseLog"
-                            ng-model="jfStashInfo.exportOptions.verbose"
-                            name="outputVerboseLog">
-                </jf-checkbox>
-                <jf-help-tooltip html="jfStashInfo.TOOLTIP.outputVerboseLog"></jf-help-tooltip>
-
-            </div>
-        </div>
-        <div class="pull-right admin-actions">
-            <button type="button" class="btn btn-primary"
-                    ng-disabled="!jfStashInfo.exportOptions.path"
-                    ng-click="jfStashInfo.export(exportForm)">
-                Export
-            </button>
-        </div>
-    </form>
-</jf-panel>
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_stash_info.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_stash_info.js
deleted file mode 100644
index ff07309..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_stash_info.js
+++ /dev/null
@@ -1,68 +0,0 @@
-import ART_EVENTS     from '../../../../constants/artifacts_events.constants';
-import COMM_EVENTS from '../../../../constants/common_events.constants';
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-
-class jfStashInfoController {
-    constructor($state, BrowseFilesDao, StashResultsDao, ArtifactoryEventBus) {
-        this.$state = $state;
-        this.browseFilesDao = BrowseFilesDao.getInstance();
-        this.stashResultsDao = StashResultsDao;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-
-        this.TOOLTIP = TOOLTIP.admin.import_export.stash;
-
-        this.exportOptions = {};
-
-        this.exportFileBrowserOptions = {
-            canSelectFiles: false,
-            selectionLabel: 'Directory To Export',
-            pathLabel: 'Path to export',
-            confirmButtonLabel: 'Select',
-            showSelectedItem: true,
-            enableSelectedItem: true
-        };
-
-
-    }
-
-    updateExportFolderPath(directory) {
-        this.exportOptions.path = directory;
-    }
-
-    clearValidations() {
-        this.artifactoryEventBus.dispatch(COMM_EVENTS.FORM_CLEAR_FIELD_VALIDATION, true);
-    }
-
-    export() {
-        let payload = {
-            path: this.exportOptions.path,
-            excludeMetadata: this.exportOptions.excludeMetadata || false,
-            m2: this.exportOptions.createM2CompatibleExport || false,
-            createArchive: this.exportOptions.createArchive || false,
-            verbose: this.exportOptions.verbose || false
-        };
-
-        this.stashResultsDao.export({name: 'stash'},payload).$promise.then((response)=>{
-//            console.log(response);
-        });
-    }
-
-    gotoSearch() {
-        this.artifactoryEventBus.dispatch(ART_EVENTS.SEARCH_URL_CHANGED,{searchType:'quick'});
-    }
-
-}
-
-export function jfStashInfo() {
-    return {
-        restrict: 'EA',
-        scope: {
-            currentNode: '=',
-            allowExport: '='
-        },
-        controller: jfStashInfoController,
-        controllerAs: 'jfStashInfo',
-        bindToController: true,
-        templateUrl: 'states/artifacts/jf_artifact_info/info_tabs/jf_stash_info.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_view_source.html b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_view_source.html
deleted file mode 100644
index 15e98e7..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_view_source.html
+++ /dev/null
@@ -1,7 +0,0 @@
-<jf-clip-copy text-to-copy="jfViewSource.sourceData"
-              class="code-mirror-copy"
-              object-name="Code"></jf-clip-copy>
-
-<jf-code-mirror mime-type="text/xml"
-                model="jfViewSource.sourceData">
-</jf-code-mirror>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_view_source.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_view_source.js
deleted file mode 100644
index 66a6a5c..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_view_source.js
+++ /dev/null
@@ -1,57 +0,0 @@
-import EVENTS from '../../../../constants/artifacts_events.constants';
-
-class jfViewSourceController {
-    constructor($scope, ArtifactViewSourceDao, ArtifactoryEventBus) {
-        this.sourceData = '';
-        this.artifactViewSourceDao = ArtifactViewSourceDao.getInstance();
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.$scope = $scope;
-        this.editorOptions = {
-            lineNumbers: true,
-            readOnly: 'nocursor',
-            lineWrapping: true,
-            viewportMargin: Infinity
-        };
-        this.loadSourceData();
-        this._registerEvents();
-    }
-
-    loadSourceData() {
-        if (this.currentNode.data.mimeType) {
-            this.editorOptions.mode = this.currentNode.data.mimeType;
-        }
-        // get source path from general info
-        let sourcePath = _.findWhere(this.currentNode.data.tabs, {name: 'General'}).info.path;
-        // fetch source from server
-        this.artifactViewSourceDao.fetch({
-            "archivePath": this.currentNode.data.archivePath,
-            "repoKey": this.currentNode.data.repoKey,
-            "sourcePath": sourcePath
-        }).$promise
-                .then((result) => {
-                    this.sourceData = result.source;
-                })
-
-    }
-
-    _registerEvents() {
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TAB_NODE_CHANGED, (node) => {
-            if (this.currentNode != node) {
-                this.currentNode = node;
-                this.loadSourceData();
-            }
-        });
-    }
-}
-export function jfViewSource() {
-    return {
-        restrict: 'EA',
-        scope: {
-            currentNode: '='
-        },
-        controller: jfViewSourceController,
-        controllerAs: 'jfViewSource',
-        bindToController: true,
-        templateUrl: 'states/artifacts/jf_artifact_info/info_tabs/jf_view_source.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_watchers.html b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_watchers.html
deleted file mode 100644
index de8b826..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_watchers.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<jf-grid ng-if="jfWatchers.watchersGridOption.data"
-         grid-options="jfWatchers.watchersGridOption"
-         filter-field="watcherName"
-         object-name="watcher"
-         auto-focus="true"></jf-grid>
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_watchers.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_watchers.js
deleted file mode 100644
index d0ed3fc..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_watchers.js
+++ /dev/null
@@ -1,137 +0,0 @@
-import EVENTS from '../../../../constants/artifacts_events.constants';
-
-class jfWatchersController {
-
-    constructor($scope, $state, ArtifactWatchesDao, ArtifactoryGridFactory, ArtifactoryEventBus, $q,
-            ArtifactoryStorage) {
-        this.$scope = $scope;
-        this.$state = $state;
-        this.watchersGridOption = {};
-        this.artifactWatchesDao = ArtifactWatchesDao;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.artifactoryStorage = ArtifactoryStorage;
-        this.$q = $q;
-        this._createGrid();
-        this._getWatchesData();
-        this._registerEvents();
-    }
-
-    _registerEvents() {
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TAB_NODE_CHANGED, (node) => {
-            this.currentNode = node;
-            this._getWatchesData();
-        });
-        this.artifactoryEventBus.registerOnScope(this.$scope, [EVENTS.ACTION_WATCH, EVENTS.ACTION_UNWATCH], () => {
-            this._getWatchesData();
-        });
-    }
-
-    _deleteWatches(watches) {
-        let data = watches.map((watch) => {
-            let selectedWachers = {
-                name: watch.watcherName,
-                repoKey: watch.watchConfigureOn.split(':')[0],
-                path: watch.watchConfigureOn.split(':')[1]
-            }
-            return selectedWachers;
-        });
-        let json = {watches: data};
-
-        return this.artifactWatchesDao.delete(json).$promise
-                .then(() => {
-                    this.artifactoryEventBus.dispatch(EVENTS.ACTION_UNWATCH, this.currentNode);
-                    this._getWatchesData();
-                });
-    }
-
-    _createGrid() {
-        let batchActions = [{
-            callback: (watches) => this._deleteWatches(watches),
-            name: "Delete",
-            icon: 'clear'
-        }];
-
-        this.watchersGridOption = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setColumns(this._getColumns())
-                .setRowTemplate('default')
-                .setMultiSelect()
-                .setBatchActions(batchActions)
-                .setButtons(this._getActions());
-
-    }
-
-    _getColumns() {
-        return [
-            {
-                name: "Watcher Name",
-                displayName: "Watcher Name",
-                field: "watcherName",
-                width: '20%'
-            },
-            {
-                name: "Watching Since",
-                displayName: "Watching Since",
-                field: "watchingSince",
-                width: '30%'
-            },
-            {
-                name: "Watch Configured On",
-                displayName: "Watch Configured On",
-                field: 'watchConfigureOn',
-                width: '50%'
-            }
-
-        ]
-    }
-
-    showInTree(row) {
-        let browser = this.artifactoryStorage.getItem('BROWSER') || 'tree';
-        let repoKey = row.watchConfigureOn.split(':')[0];
-        let path = row.watchConfigureOn.split(':')[1];
-        let artifactPath = repoKey + "/" + (path);
-        let archivePath = '';
-        this.$state.go('artifacts.browsers.path', {
-            "tab": "General",
-            "browser": browser,
-            "artifact": artifactPath
-        });
-    }
-
-    _getActions() {
-        return [{
-            icon: 'icon icon-show-in-tree',
-            tooltip: 'Show In Tree',
-            callback: row => this.showInTree(row)
-        },
-            {
-                icon: 'icon icon-clear',
-                tooltip: 'Delete',
-                callback: (watch) => this._deleteWatches([watch])
-            }];
-    }
-
-    _getWatchesData() {
-        let self = this;
-        this.artifactWatchesDao.query({
-            path: self.currentNode.data.path,
-            repoKey: self.currentNode.data.repoKey
-        }).$promise.then((watchers) => {
-                    this.watchers = watchers;
-                    this.watchersGridOption.setGridData(watchers);
-                });
-    }
-
-}
-export function jfWatchers() {
-    return {
-        restrict: 'EA',
-        scope: {
-            currentNode: '='
-        },
-        controller: jfWatchersController,
-        controllerAs: 'jfWatchers',
-        bindToController: true,
-        templateUrl: 'states/artifacts/jf_artifact_info/info_tabs/jf_watchers.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_xml_view.html b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_xml_view.html
deleted file mode 100644
index 7cde24e..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_xml_view.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<jf-panel jf-panel-heading="XML Content"
-          ng-if="jfXmlView.xmlViewData.fileContent">
-
-    <jf-clip-copy text-to-copy="jfXmlView.xmlViewData.fileContent"
-                  class="code-mirror-copy"
-                  object-name="Content"></jf-clip-copy>
-
-    <jf-code-mirror mime-type="text/xml"
-                    height="500px"
-                    model="jfXmlView.xmlViewData.fileContent">
-    </jf-code-mirror>
-</jf-panel>
-
-
-
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_xml_view.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_xml_view.js
deleted file mode 100644
index 8e950ba..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/info_tabs/jf_xml_view.js
+++ /dev/null
@@ -1,54 +0,0 @@
-import EVENTS from '../../../../constants/artifacts_events.constants';
-
-class jfXmlViewController {
-    constructor($scope, ArtifactViewsDao, ArtifactoryEventBus) {
-        this.artifactXmlViewDao = ArtifactViewsDao;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.$scope = $scope;
-        this._initXmlView();
-    }
-
-    _initXmlView() {
-        this._registerEvents();
-        this._getXmlViewData();
-    }
-
-    _getXmlViewData() {
-        //Temp fix for preventing fetching data for non-file nodes (occurred when pressing "Artifacts" on sidebar)
-        if (!this.currentNode.data.path) {
-            return;
-        }
-
-        this.artifactXmlViewDao.fetch({
-            "view": "pom",
-            "repoKey": this.currentNode.data.repoKey,
-            "path": this.currentNode.data.path
-        }).$promise
-            .then((data) => {
-                this.xmlViewData = data;
-                this.xmlViewData.fileContent = data.fileContent.trim();
-            })
-    }
-
-    _registerEvents() {
-        let self = this;
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TAB_NODE_CHANGED, (node) => {
-            if (this.currentNode != node) {
-                this.currentNode = node;
-                self._getXmlViewData();
-            }
-        });
-    }
-}
-export function jfXmlView() {
-    return {
-        restrict: 'EA',
-        controller: jfXmlViewController,
-        controllerAs: 'jfXmlView',
-        scope: {
-            currentNode: '='
-        },
-        bindToController: true,
-        templateUrl: 'states/artifacts/jf_artifact_info/info_tabs/jf_xml_view.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/jf_artifact_info.html b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/jf_artifact_info.html
deleted file mode 100644
index ee4bcf7..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/jf_artifact_info.html
+++ /dev/null
@@ -1,75 +0,0 @@
-<div ng-if="jfArtifactInfo.currentNode">
-
-    <jf-tabs tabs="jfArtifactInfo.infoTabs"
-             dictionary="jfArtifactInfo.DICTIONARY"
-             tab-width="165"
-             container-margin="35"
-             >
-        <div class="main-view">
-            <jf-tab name="General">
-                <jf-general current-node="jfArtifactInfo.currentNode"></jf-general>
-            </jf-tab>
-            <jf-tab name="EffectivePermission">
-                <jf-effective-permissions current-node="jfArtifactInfo.currentNode"></jf-effective-permissions>
-            </jf-tab>
-            <jf-tab name="Builds">
-                <jf-builds current-node="jfArtifactInfo.currentNode"></jf-builds>
-            </jf-tab>
-            <jf-tab name="Watch" feature="watchers">
-                <jf-watchers current-node="jfArtifactInfo.currentNode"></jf-watchers>
-            </jf-tab>
-            <jf-tab name="BlackDuck">
-                <jf-governance current-node="jfArtifactInfo.currentNode"></jf-governance>
-            </jf-tab>
-            <jf-tab name="Properties">
-                <jf-properties current-node="jfArtifactInfo.currentNode"></jf-properties>
-            </jf-tab>
-            <jf-tab name="ViewSource">
-                <jf-view-source current-node="jfArtifactInfo.currentNode"></jf-view-source>
-            </jf-tab>
-            <jf-tab name="PomView">
-                <jf-pom-view current-node="jfArtifactInfo.currentNode"></jf-pom-view>
-            </jf-tab>
-            <jf-tab name="IVYXml">
-                <jf-ivy-view current-node="jfArtifactInfo.currentNode"></jf-ivy-view>
-            </jf-tab>
-            <jf-tab name="GeneralXml">
-                <jf-xml-view current-node="jfArtifactInfo.currentNode"></jf-xml-view>
-            </jf-tab>
-            <jf-tab name="NuPkgInfo">
-                <jf-nuget current-node="jfArtifactInfo.currentNode"></jf-nuget>
-            </jf-tab>
-            <jf-tab name="PyPIInfo">
-                <jf-py-pi current-node="jfArtifactInfo.currentNode"></jf-py-pi>
-            </jf-tab>
-            <jf-tab name="BowerInfo">
-                <jf-bower current-node="jfArtifactInfo.currentNode"></jf-bower>
-            </jf-tab>
-            <jf-tab name="DockerInfo">
-                <jf-docker current-node="jfArtifactInfo.currentNode"></jf-docker>
-            </jf-tab>
-            <jf-tab name="DockerAncestryInfo">
-                <jf-docker-ancestry current-node="jfArtifactInfo.currentNode"></jf-docker-ancestry>
-            </jf-tab>
-            <jf-tab name="DockerV2Info">
-                <jf-docker-v2 current-node="jfArtifactInfo.currentNode"></jf-docker-v2>
-            </jf-tab>
-            <jf-tab name="RubyGems">
-                <jf-ruby-gems current-node="jfArtifactInfo.currentNode"></jf-ruby-gems>
-            </jf-tab>
-            <jf-tab name="NpmInfo">
-                <jf-npm-info current-node="jfArtifactInfo.currentNode"></jf-npm-info>
-            </jf-tab>
-            <jf-tab name="Rpm">
-                <jf-rpm current-node="jfArtifactInfo.currentNode"></jf-rpm>
-            </jf-tab>
-            <jf-tab name="Cocoapods">
-                <jf-cocoapods current-node="jfArtifactInfo.currentNode"></jf-cocoapods>
-            </jf-tab>
-            <jf-tab name="StashInfo">
-                <jf-stash-info current-node="jfArtifactInfo.currentNode"
-                               allow-export="jfArtifactInfo.user.currentUser.isAdmin() && !jfArtifactInfo.features.isAol()"></jf-stash-info>
-            </jf-tab>
-        </div>
-    </jf-tabs>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/jf_artifact_info.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/jf_artifact_info.js
deleted file mode 100644
index 60ccd5e..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_artifact_info/jf_artifact_info.js
+++ /dev/null
@@ -1,66 +0,0 @@
-import EVENTS from '../../../constants/artifacts_events.constants';
-import DICTIONARY from './../constants/artifact_general.constant';
-
-class jfArtifactInfoController {
-    constructor($element, $stateParams, $state, $scope, ArtifactoryEventBus, $timeout, User, ArtifactoryFeatures) {
-        this.$element = $element;
-        this.stateParams = $stateParams;
-        this.state = $state;
-        this.features = ArtifactoryFeatures;
-        this.$timeout = $timeout;
-        this.user = User;
-        this.DICTIONARY = DICTIONARY.tabs;
-        this.isDropdownOpen = false;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        ArtifactoryEventBus.registerOnScope($scope, EVENTS.TREE_NODE_SELECT, node => this.selectNode(node));
-        $scope.$on('ui-layout.resize', () => this._refreshTabs());
-
-    }
-
-    selectNode(node) {
-        if (node.data) {
-            // wait for the element to render and calculate how many tabs should display
-            if (!angular.equals(this.infoTabs, node.data.tabs)) {
-                this._refreshTabs();
-            }
-            this.infoTabs = node.data.tabs;
-            this._transformInfoTabs();
-            this.currentNode = node;
-            // if current tab exists in the new node - dispatch an event:
-            if (_.findWhere(this.infoTabs, {name: this.stateParams.tab}) && this.stateParams.tab !== 'StashInfo') {
-                this.artifactoryEventBus.dispatch(EVENTS.TAB_NODE_CHANGED, node);
-            }
-        }
-        else {
-            this.currentNode = null;
-        }
-    }
-
-    _refreshTabs() {
-        this.artifactoryEventBus.dispatch(EVENTS.TABS_REFRESH);
-    }
-
-    _transformInfoTabs() {
-        let features = {
-            'Watch': 'watches',
-            'Properties': 'properties',
-            'Builds': 'builds',
-            'BlackDuck': 'blackDuck'
-        };
-        this.infoTabs.forEach((tab) => {
-            tab.feature = features[tab.name];
-        });
-    }
-}
-export function jfArtifactInfo() {
-    return {
-        restrict: 'E',
-        controller: jfArtifactInfoController,
-        controllerAs: 'jfArtifactInfo',
-        templateUrl: 'states/artifacts/jf_artifact_info/jf_artifact_info.html',
-        bindToController: true
-    }
-}
-
-
-
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_common_browser/jf_common_browser.config.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_common_browser/jf_common_browser.config.js
deleted file mode 100644
index 5382bc4..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_common_browser/jf_common_browser.config.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import types from '../constants/artifact_browser_icons.constant';
-module.exports = {
-
-    "core": {
-        "animation": false,
-        "multiple": false
-    },
-
-    "types": types,
-    "search": {
-        "depthFirst": true,
-        "close_opened_onclear": false
-    },
-    
-    "contextmenu": {
-        "select_node": false,
-        "show_at_node": false
-    },
-
-    "plugins": ["search", "types", "contextmenu", "sort"]
-};
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_common_browser/jf_common_browser.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_common_browser/jf_common_browser.js
deleted file mode 100644
index ff79b31..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_common_browser/jf_common_browser.js
+++ /dev/null
@@ -1,735 +0,0 @@
-import EVENTS from "../../../constants/artifacts_events.constants";
-import KEYS from "../../../constants/keys.constants";
-import ACTIONS from "../../../constants/artifacts_actions.constants";
-
-const JSTREE_ROW_HOVER_CLASS = 'jstree-hovered';
-const REGEXP = /(pkg|repo)\:(.*)/g;
-
-export default class JFCommonBrowser {
-    constructor(ArtifactActions, AdvancedStringMatch, $timeout) {
-        this.advancedStringMatch = AdvancedStringMatch;
-        this.artifactActions = ArtifactActions;
-        this.$timeout = $timeout;
-        this.activeFilter = false;
-
-        if (this.browserController) {
-            this.activeFilter = this.browserController.activeFilter || false;
-            this.searchText = this.browserController.searchText || '';
-            if (this.searchText.endsWith('*')) this.searchText = this.searchText.substr(0,this.searchText.length-1);
-        }
-
-        this._initJSTreeSorting();
-    }
-
-    /****************************
-     * Context menu items
-     ****************************/
-
-    _getContextMenuItems(obj, cb) {
-        let actionItems = {};
-        if (obj.data) {
-            let node = obj.data;
-            node.load()
-            .then(() => node.refreshWatchActions())
-            .then(() => node.getDownloadPath())
-            .then(() => {
-                if (node.actions) {
-                    node.actions.forEach((actionObj) => {
-                        let name = actionObj.name;
-                        let action = angular.copy(ACTIONS[name]);
-                        if (!action) {
-                            console.log("Unrecognized action", name);
-                            return true;
-                        }
-                        action._class = 'menu-item-' + action.icon;
-                        action.icon = 'action-icon icon ' + action.icon;
-                        action.label = action.title;
-                        if (actionObj.name === 'Download') {
-                            action.link = node.actualDownloadPath;
-                        }
-                        else {                        
-                            action.action = () => {
-                                this.artifactActions.perform(actionObj, obj);
-                            }
-                        }
-                        if (actionObj.name === 'Distribute' && node.repoType === 'distribution') {
-                            action = angular.copy(ACTIONS['Redistribute']);;
-                        }
-                        actionItems[name] = action;
-                    });
-
-                    cb(actionItems);
-                }
-                else {
-                    cb([]);
-                }
-            });
-        }
-        else {
-            cb([]);
-        }
-    }
-
-    /****************************
-     * Access methods
-     ****************************/
-    jstree() {
-        return $(this.treeElement).jstree();
-    }
-
-    _getSelectedTreeNode() {
-        let selectedJsNode = this.jstree().get_node(this._getSelectedNode());
-        return selectedJsNode && selectedJsNode.data;
-    }
-
-    _getSelectedNode() {
-        return this.jstree().get_selected()[0];
-    }
-
-    /****************************
-     * access the tree
-     ****************************/
-
-    _isVisible(jsTreeNode) {
-        // If the node is hidden, the get_node as DOM returns empty result
-        return this.jstree().get_node(jsTreeNode, true).length && $('#'+this._getSafeId(jsTreeNode.id)).css('display') !== 'none';
-    } 
-
-    _isRootRepoVisible(jsTreeNode) {
-        return this.jstree().get_node(this._getRootRepo(jsTreeNode), true).length;
-    }
-
-    _getFirstVisibleNode() {
-        let json = this.jstree().get_json();
-        for (let node of json) {
-            if (this._isVisible(node)) {
-                return node;
-            }
-        }
-    }
-
-    _getRootRepo(jsTreeNode) {
-        if (!jsTreeNode.parents || jsTreeNode.parents.length === 1) return jsTreeNode;
-        let rootRepoId = jsTreeNode.parents[jsTreeNode.parents.length-2];
-        return this.jstree().get_node(rootRepoId);
-    }
-
-    _unhoverAll() {
-        $('.' + JSTREE_ROW_HOVER_CLASS).removeClass(JSTREE_ROW_HOVER_CLASS);
-    }
-
-    _hover(domElement) {
-        domElement.find('.jstree-anchor').first().addClass(JSTREE_ROW_HOVER_CLASS);
-    }
-
-    _focusOnTree() {
-        // Make sure we can continue navigating the tree with the keys
-        this._getSelectedJQueryElement().focus();
-    }
-
-    _getSelectedJQueryElement() {
-        let nodeID = this._getSafeId(this.jstree().get_selected()[0]);
-        return $('.jstree #' + nodeID + '_anchor');
-    }
-
-    _getSafeId(id) {
-        return this._escapeChars(id,['/','.','$','{','}','(',')','[',']']);
-    }
-
-    _escapeChars(str,chars) {
-        let newStr = str;
-        chars.forEach((char)=>{
-            newStr = newStr ? newStr.split(char).join('\\'+char) : newStr;
-        });
-        return newStr;
-    }
-
-    _getDomElement(node) {
-        return this.jstree().get_node(node, true);
-    }
-
-    _scrollIntoView(domElement) {
-        if (!domElement || !domElement[0]) return;
-
-/*
-        if (domElement[0].scrollIntoViewIfNeeded) {
-            domElement[0].scrollIntoViewIfNeeded(true);
-        }
-        else {
-*/
-        this._scrollToViewIfNeededReplacement(domElement[0],true);
-        if (domElement[0].scrollIntoViewIfNeeded) {
-            domElement[0].scrollIntoViewIfNeeded(true);
-        }
-/*
-        }
-*/
-    }
-
-
-    _scrollToViewIfNeededReplacement(elem,centerIfNeeded,runAgain = true) {
-        function withinBounds(value, min, max, extent) {
-            if (false === centerIfNeeded || max <= value + extent && value <= min + extent) {
-                return Math.min(max, Math.max(min, value));
-            } else {
-                return (min + max) / 2;
-            }
-        }
-
-        function makeArea(left, top, width, height) {
-            return  { "left": left, "top": top, "width": width, "height": height
-                , "right": left + width, "bottom": top + height
-                , "translate":
-                    function (x, y) {
-                        return makeArea(x + left, y + top, width, height);
-                    }
-                , "relativeFromTo":
-                    function (lhs, rhs) {
-                        var newLeft = left, newTop = top;
-                        lhs = lhs.offsetParent;
-                        rhs = rhs.offsetParent;
-                        if (lhs === rhs) {
-                            return area;
-                        }
-                        for (; lhs; lhs = lhs.offsetParent) {
-                            newLeft += lhs.offsetLeft + lhs.clientLeft;
-                            newTop += lhs.offsetTop + lhs.clientTop;
-                        }
-                        for (; rhs; rhs = rhs.offsetParent) {
-                            newLeft -= rhs.offsetLeft + rhs.clientLeft;
-                            newTop -= rhs.offsetTop + rhs.clientTop;
-                        }
-                        return makeArea(newLeft, newTop, width, height);
-                    }
-            };
-        }
-
-        var parent, area = makeArea(
-            elem.offsetLeft, elem.offsetTop,
-            elem.offsetWidth, elem.offsetHeight);
-        while ((parent = elem.parentNode) instanceof HTMLElement) {
-            var clientLeft = parent.offsetLeft + parent.clientLeft;
-            var clientTop = parent.offsetTop + parent.clientTop;
-
-            // Make area relative to parent's client area.
-            area = area.
-            relativeFromTo(elem, parent).
-            translate(-clientLeft, -clientTop);
-
-            parent.scrollLeft = withinBounds(
-                parent.scrollLeft,
-                area.right - parent.clientWidth, area.left,
-                parent.clientWidth);
-
-            parent.scrollTop = withinBounds(
-                parent.scrollTop,
-                area.bottom - parent.clientHeight, area.top,
-                parent.clientHeight);
-
-            // Determine actual scroll amount by reading back scroll properties.
-            area = area.translate(clientLeft - parent.scrollLeft,
-                clientTop - parent.scrollTop);
-            elem = parent;
-        }
-
-        if (runAgain) this._scrollToViewIfNeededReplacement(elem,centerIfNeeded,false); //hackish fix
-
-    }
-
-    _initJSTreeSorting() {
-        let jstree;
-        $.jstree.defaults.sort = (a,b) => {
-            if (!jstree) jstree = this.jstree();
-            let aNode = jstree.get_node(a);
-            let bNode = jstree.get_node(b);
-
-            if (!aNode || !bNode) {
-                jstree = this.jstree();
-                aNode = jstree.get_node(a);
-                bNode = jstree.get_node(b);
-            }
-
-            let aText = aNode.data ? aNode.data.text.toLowerCase() : '*';
-            let bText = bNode.data ? bNode.data.text.toLowerCase() : '*';
-
-            let aType = aNode.data ? aNode.data.type : '*';
-            let bType = bNode.data ? bNode.data.type : '*';
-            let aRepoType = aNode.data ? aNode.data.repoType : '*';
-            let bRepoType = bNode.data ? bNode.data.repoType : '*';
-
-            let aScore=0,bScore=0;
-
-            if (aNode.data && aNode.data.isTrashcan && aNode.data.isTrashcan() && aNode.text !== '..') return 1;
-            else if (bNode.data && bNode.data.isTrashcan && bNode.data.isTrashcan() && bNode.text !== '..') return -1;
-            else if ((aType === 'repository' || aType === 'virtualRemoteRepository') &&
-                (bType === 'repository' || bType === 'virtualRemoteRepository')) {
-                //both repos - top level sort
-
-                if (aRepoType==='distribution') aScore+=100000;
-                if (bRepoType==='distribution') bScore+=100000;
-                
-                if (aRepoType==='local') aScore+=10000;
-                if (bRepoType==='local') bScore+=10000;
-
-                if (aRepoType==='cached') aScore+=1000;
-                if (bRepoType==='cached') bScore+=1000;
-
-                if (aRepoType==='remote') aScore+=100;
-                if (bRepoType==='remote') bScore+=100;
-
-                if (aRepoType==='virtual') aScore+=10;
-                if (bRepoType==='virtual') bScore+=10;
-
-                if (aText<bText) aScore++;
-                if (aText>bText) bScore++;
-
-                return aScore<bScore?1:-1;
-            }
-            else if ((aType !== 'repository' && aType !== 'virtualRemoteRepository') &&
-                     (bType !== 'repository' && bType !== 'virtualRemoteRepository')) {
-                //both files or folders
-
-                if (aType==='folder') aScore+=10000;
-                if (bType==='folder') bScore+=10000;
-
-                if (aNode.text === '..') aScore+=100000;
-                if (bNode.text === '..') aScore+=100000;
-
-                let aHasNumVal = !_.isNaN(parseInt(aText));
-                let bHasNumVal = !_.isNaN(parseInt(bText));
-
-                if (aHasNumVal && bHasNumVal) {
-
-                    let addTo = this._compareVersions(aText,bText);
-
-                    if (addTo==='a') aScore += 100;
-                    if (addTo==='b') bScore += 100;
-                }
-                else {
-
-                    let aDigitIndex = aText.search(/\d/);
-                    let bDigitIndex = bText.search(/\d/);
-
-                    if (aDigitIndex === bDigitIndex && aDigitIndex !== -1) {
-                        let aBeforeNum = aText.substr(0,aDigitIndex);
-                        let bBeforeNum = bText.substr(0,bDigitIndex);
-                        if (aBeforeNum === bBeforeNum) {
-                            let aFromNum = aText.substr(aDigitIndex);
-                            let bFromNum = bText.substr(bDigitIndex);
-
-                            let addTo = this._compareVersions(aFromNum,bFromNum);
-
-                            if (addTo==='a') aScore += 100;
-                            if (addTo==='b') bScore += 100;
-
-                        }
-                    }
-
-                    if (aText<bText) aScore++;
-                    if (aText>bText) bScore++;
-                }
-                return aScore<bScore?1:-1;
-            }
-            else {
-                if (!aNode.data) return -1; //special node
-                else if (!bNode.data) return 1; //special node
-                else if ((aType === 'repository' || aType === 'virtualRemoteRepository')) return -1;
-                else if ((bType === 'repository' || bType === 'virtualRemoteRepository')) return 1;
-                else return aText>bText?1:-1;
-            }
-        }
-    }
-
-    _compareVersions(aText,bText) {
-        let splitters = /\-|\.|_/
-        let aArr = aText.split(splitters);
-        let bArr = bText.split(splitters);
-        let minLength = Math.min(aArr.length,bArr.length);
-
-        let addTo;
-        for (let i = 0; i<minLength; i++) {
-            let aNum = parseInt(aArr[i]);
-            let bNum = parseInt(bArr[i]);
-            let aIsNum = !_.isNaN(aNum);
-            let bIsNum = !_.isNaN(bNum);
-            if (aIsNum && bIsNum && aNum<bNum) {
-                addTo = 'a';
-                break;
-            }
-            else if (aIsNum && bIsNum && aNum>bNum) {
-                addTo = 'b';
-                break;
-            }
-            else if (!aIsNum || !bIsNum) {
-                if (aArr[i]<bArr[i]) {
-                    addTo = 'a';
-                    break;
-                }
-                else if (aArr[i]>bArr[i]) {
-                    addTo = 'b';
-                    break;
-                }
-            }
-        }
-
-        if (!addTo) {
-            if (aArr.length > bArr.length) addTo = 'b';
-            else if (aArr.length < bArr.length) addTo = 'a';
-        }
-
-        return addTo;
-    }
-
-
-
-    /************************************************************************************************************************************
-     * New Advanced Quick Find !!
-     ************************************************************************************************************************************/
-
-    /********************************************
-     * Is the node matching the search criteria
-     ********************************************/
-    _searchCallback(str, jsTreeNode, elem) {
-
-        if (jsTreeNode.parent === '#' && jsTreeNode.text === '..' && jsTreeNode.type === 'go_up') return true;
-        if (!jsTreeNode.data) return false;
-        let treeNode = jsTreeNode.data;
-
-        // Special filters:
-        let filterRegexp = new RegExp(REGEXP);
-        let matches = filterRegexp.exec(str);
-        if (matches && matches[2].trim()) {
-            let filterType = matches[1];
-            let filterText = matches[2];
-            let rootRepo = this._getRootRepo(jsTreeNode).data;
-
-            switch(filterType) {
-                case 'pkg':
-                    return ((treeNode.isRepo() && treeNode.repoPkgType && treeNode.repoPkgType.toLowerCase().indexOf(filterText.toLowerCase()) != -1) || (!treeNode.isRepo() && this.activeFilter && (rootRepo.isRepo() && rootRepo.repoPkgType.toLowerCase().indexOf(filterText.toLowerCase()) != -1)) || (((treeNode.isTrashcan && treeNode.isTrashcan()) || (treeNode.isInTrashcan && treeNode.isInTrashcan())) && localStorage.pinnedTrash && this.type === 'tree'));
-                case 'repo':
-                    return ((treeNode.isRepo() && treeNode.repoType.toLowerCase().indexOf(filterText.toLowerCase()) != -1) || (!treeNode.isRepo() && this.activeFilter && (rootRepo.isRepo() && rootRepo.repoType.toLowerCase().indexOf(filterText.toLowerCase()) != -1)) || (((treeNode.isTrashcan && treeNode.isTrashcan()) || (treeNode.isInTrashcan && treeNode.isInTrashcan())) && localStorage.pinnedTrash && this.type === 'tree'));
-            }
-        }
-        // Regular text search:
-        else {
-            if (!this._isVisible(jsTreeNode)) return false;
-            window.matcher = this.advancedStringMatch.match;
-            let matchObj = this.advancedStringMatch.match(this.type === 'stash' ? jsTreeNode.text : treeNode.isTrashcan() ? "Trash Can" : treeNode.text,str);
-            if (elem) {
-                if (matchObj.matched) $(elem).prop('segments',matchObj.segments);
-                else $(elem).prop('segments',null);
-            }
-            return matchObj.matched;
-        }
-
-    }
-
-    /****************************
-     * Searching the tree
-     ****************************/
-    _searchTree(text,gotoFirst = true, showSpinner = true) {
-        this.searchText = text || '';
-        let showOnlyMatches = text ? text.match(new RegExp(REGEXP)) || false : false;
-        this._jsQuickFind(this.searchText, showOnlyMatches, gotoFirst, showSpinner);
-    }
-
-    _cancelRunningSearch() {
-        if (this.searchTimeoutPromise) {
-            this.$timeout.cancel(this.searchTimeoutPromise);
-            this.searchTimeoutPromise = null;
-            this.artifactoryEventBus.dispatch(EVENTS.TREE_SEARCH_RUNNING, false);
-//            console.log('Quick Find Ended.')
-        }
-    }
-
-    _jsQuickFind(searchText, showOnlyMatches, gotoFirst = true, showSpinner = true) {
-        this._cancelRunningSearch();
-        if (!searchText || this._isInActiveFilterMode() === 'empty') {
-            this._clear_search();
-            return;
-        }
-        let res = [];
-        let nodes = [];
-        let nodesParents = [];
-        let nomatches = [];
-        let nomatchesParents = [];
-        var all = $('.jstree-anchor');
-
-        let i = 0;
-        let doIteration = () => {
-//            console.log('Quick Find Running...')
-            let startI = i;
-            while (i < startI + 500 && i<all.length) {
-                let e = $(all[i]);
-                if (searchText && e.text()) {
-                    let id = e.prop('id');
-                    id = id.substr(0, id.length - '_anchor'.length);
-                    let treeNode = this.jstree().get_node(id);
-                    if (this._searchCallback(searchText, treeNode, e[0])) {
-                        let goneToFirst = false;
-                        if (gotoFirst && !nodes.length) { //goto first result
-                            goneToFirst = true;
-                            this.searchResults = [id];
-                            this._initCurrentSearchResult([e[0]]);
-                            this._gotoCurrentSearchResult();
-                        }
-                        res.push(id);
-                        nodes.push(e[0]);
-                        nodesParents.push(e[0].parentElement);
-
-
-                        if ((goneToFirst || this._isScrolledIntoView(e[0], 0)) && !showOnlyMatches) {
-                            e.addClass('jstree-search');
-                            let jqe = $(e[0]);
-                            jqe.unhighlight();
-                            let segs = jqe.prop('segments');
-                            if (segs) this.advancedStringMatch.highlight(jqe,segs);
-                        }
-                        else if (showOnlyMatches) {
-//                            e.addClass('jstree-search');
-                        }
-                    }
-                    else {
-                        nomatches.push(e[0]);
-                        nomatchesParents.push(e[0].parentElement);
-                        if (this._isScrolledIntoView(e[0], 0) && !showOnlyMatches) {
-                            e.removeClass('jstree-search');
-                            $(e[0]).unhighlight();
-                        }
-                        else if (showOnlyMatches) {
-//                            e.removeClass('jstree-search');
-                        }
-                    }
-                }
-                else {
-                    nomatches.push(e[0]);
-                    nomatchesParents.push(e[0].parentElement);
-                    if (this._isScrolledIntoView(e[0], 0) && !showOnlyMatches) {
-                        e.removeClass('jstree-search');
-                        $(e[0]).unhighlight();
-                    }
-                    else if (showOnlyMatches) {
-//                        e.removeClass('jstree-search');
-                    }
-                }
-                i++;
-                this.searchResults = res;
-                this.searchNodes = nodes;
-                this.searchParentNodes = nodes;
-                this.nomatchNodes = nomatches;
-                this.nomatchParentNodes = nomatchesParents;
-            }
-
-        };
-
-        let timeOutFunc = () => {
-            if (i < all.length) {
-                if (showSpinner && i===0 && all.length > 250) this.artifactoryEventBus.dispatch(EVENTS.TREE_SEARCH_RUNNING, true);
-                doIteration();
-                this.searchTimeoutPromise = this.$timeout(() => timeOutFunc());
-            }
-            else { // finish
-
-                this.searchTimeoutPromise = null;
-                if (showOnlyMatches && res.length) {
-                    $('.hidden:has(".jstree-anchor")').removeClass('hidden');
-                    $(this.searchParentNodes).removeClass('hidden');
-                    $(this.nomatchParentNodes).addClass('hidden');
-                }
-                else {
-                    $('.hidden:has(".jstree-anchor")').removeClass('hidden');
-                }
-
-                this.artifactoryEventBus.dispatch(EVENTS.TREE_SEARCH_RUNNING, false);
-//                console.log('Quick Find Ended.')
-            }
-        };
-// console.log('Starting Quick Find...')
-        this.searchTimeoutPromise = this.$timeout(() => timeOutFunc());
-
-    }
-
-    _onScroll() {
-        if (!this.searchNodes || this._isInActiveFilterMode()) return;
-        for (let i = 0; i<this.searchNodes.length; i++) {
-            if (this._isScrolledIntoView(this.searchNodes[i], 0)) {
-                let jqe = $(this.searchNodes[i]);
-                jqe.addClass('jstree-search');
-                jqe.unhighlight();
-                let segs = jqe.prop('segments');
-                if (segs) this.advancedStringMatch.highlight(jqe,segs);
-            }
-        }
-        for (let i = 0; i<this.nomatchNodes.length; i++) {
-            if (this._isScrolledIntoView(this.nomatchNodes[i], 0)) {
-                let jqe = $(this.nomatchNodes[i]);
-                jqe.removeClass('jstree-search');
-                jqe.unhighlight();
-            }
-        }
-    }
-
-
-    _isScrolledIntoView(el, marginSize = 0) {
-        let elemTop = el.getBoundingClientRect().top;
-        let elemBottom = el.getBoundingClientRect().bottom;
-
-        var isVisible = (elemTop >= -marginSize) && (elemBottom <= window.innerHeight + marginSize);
-        return isVisible;
-    }
-
-    _initCurrentSearchResult(nodes) {
-        if (!this.currentResult || !_.include(this.searchResults, this.currentResult)) {
-            // there is no previous result, or previous result is not included in the search results
-            // select first result that's below the node we started the search from
-            let startFromDom = this.jstree().get_node(this._getSelectedNode(), /* as_dom = */ true)[0];
-            let firstNodeBelow = _.find(nodes, (node) => {
-                if (!startFromDom) return true;
-                return node.offsetTop > startFromDom.offsetTop;
-            });
-            // if found - select as first result, if not - select first search result
-            this.currentResult = firstNodeBelow ? firstNodeBelow.id.substr(0,firstNodeBelow.id.length - '_anchor'.length) : this.searchResults[0];
-        }
-    }
-
-    _isInActiveFilterMode(checkIfMatchesFound = false) {
-        if (this.searchText.match(new RegExp(REGEXP))) {
-            let justSearchTerm = this.searchText.substr(this.searchText.indexOf(':')+1).trim();
-            if (justSearchTerm) {
-                if (checkIfMatchesFound) {
-                    let json = this.jstree().get_json();
-                    let matchesFound = false;
-                    for (let node of json) {
-                        node.data.isRepo = () => {
-                            return node.data.type === 'repository' ||
-                                node.data.type === 'virtualRemoteRepository' ||
-                                node.data.type === 'localRepository' ||
-                                node.data.type === 'remoteRepository' ||
-                                node.data.type === 'cachedRepository' ||
-                                node.data.type === 'virtualRepository';
-                        };
-                        if (this._searchCallback(this.searchText,node)) {
-                            matchesFound = true;
-                            break;
-                        }
-                    }
-                    return matchesFound ? true : 'no results';
-                }
-                else {
-                    return true;
-                }
-            }
-            else return 'empty';
-        }
-        else return false;
-    }
-
-    _searchTreeKeyDown(key) {
-        let jstree = this.jstree();
-        if (key == KEYS.DOWN_ARROW) {
-            this._selectNextSearchResult();
-        }
-        else if (key == KEYS.UP_ARROW) {
-            this._selectPreviousSearchResult();
-        }
-        else if (key == KEYS.ENTER) {
-            //manually set the model to the input element's value (because the model is debounced...)
-            this.searchText = $('.jf-tree-search').val();
-
-            let isInActiveFilterMode = this._isInActiveFilterMode(true);
-
-            if (isInActiveFilterMode === true) {
-                this.activeFilter = true;
-                if (this.browserController) {
-                    this.browserController.activeFilter = true;
-                    this.browserController.searchText = this.searchText + '*';
-                }
-                this._searchTree(this.searchText);
-                this._focusOnTree();
-                if (!this._isVisible(jstree.get_node(this._getSelectedNode()))) {
-                    jstree.select_node(this._getFirstVisibleNode());
-                }
-            }
-            else if (isInActiveFilterMode === 'no results') {
-                if (this.artifactoryNotifications) this.artifactoryNotifications.create({warn: "No repositories matches the filtered " + (this.searchText.startsWith('pkg:') ? 'package' : 'repository') + " type"});
-            }
-            else {
-                this.activeFilter = false;
-                if (this.browserController) this.browserController.activeFilter = false;
-                this._selectCurrentSearchResult();
-                jstree.open_node(this.currentResult);
-                this._clear_search();
-                this._focusOnTree();
-                this.currentResult = null;
-            }
-        }
-        else if (key == KEYS.ESC) {
-            this.activeFilter = false;
-            if (this.browserController) this.browserController.activeFilter = false;
-            this._clear_search();
-            this._focusOnTree();
-            this.currentResult = null;
-        }
-        else {
-            this.$timeout(()=>{
-                this.searchText = $('.jf-tree-search').val();
-                if (this.searchText === '') {
-                    $(this.treeElement).unhighlight();
-                }
-            })
-        }
-    }
-
-    _clear_search() {
-        this._cancelRunningSearch();
-        this.activeFilter = false;
-        if (this.browserController) this.browserController.activeFilter = false;
-        this._unhoverAll();
-        this.jstree().clear_search();
-        $('.hidden:has(".jstree-anchor")').removeClass('hidden');
-        $('.jstree-anchor.jstree-search').removeClass('jstree-search');
-        $(this.treeElement).unhighlight();
-        this.searchNodes = null;
-        this.searchParentNodes = null;
-        this.nomatchNodes = null;
-        this.nomatchParentNodes = null;
-        this.searchText = '';
-    }
-
-    _selectNextSearchResult() {
-        let index = this.searchResults.indexOf(this.currentResult);
-        index++;
-        if (index > this.searchResults.length - 1) {
-            index = 0;
-        }
-        this.currentResult = this.searchResults[index];
-        this._gotoCurrentSearchResult();
-    }
-
-    _selectPreviousSearchResult() {
-        let index = this.searchResults.indexOf(this.currentResult);
-        index--;
-        if (index < 0) {
-            index = this.searchResults.length - 1;
-        }
-        this.currentResult = this.searchResults[index];
-        this._gotoCurrentSearchResult();
-    }
-
-    _gotoCurrentSearchResult() {
-        this._unhoverAll();
-        if (this.currentResult) {
-            let domElement = this._getDomElement(this.currentResult);
-            this._hover(domElement);
-            this._scrollIntoView(domElement);
-        }
-    }
-
-    _selectCurrentSearchResult() {
-        if (this.currentResult) {
-            this.jstree().deselect_all();
-            this.jstree().select_node(this.currentResult);
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_simple_browser/jf_simple_browser.html b/web/angular-web/src/main/webapp/app/states/artifacts/jf_simple_browser/jf_simple_browser.html
deleted file mode 100644
index dca804a..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_simple_browser/jf_simple_browser.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!-- 
-<div>
-    <ul class="simple-tabs-list">
-        <li class="simple-tab"
-            ng-repeat="tab in SimpleBrowser.simpleTabs"
-            ng-class="{active:SimpleBrowser.isCurrentTab(tab)}"
-            ng-click="SimpleBrowser.setCurrentTab(tab)"><a href="">{{tab}}</a></li>
-    </ul>
-</div>
-
- -->
-<!-- On this element we will activate the JSTree plugin: -->
-
-<div
-    class="simple-browser"
-    id="tree-element">
-    
-</div>
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_simple_browser/jf_simple_browser.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_simple_browser/jf_simple_browser.js
deleted file mode 100644
index b3cd4fa..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_simple_browser/jf_simple_browser.js
+++ /dev/null
@@ -1,290 +0,0 @@
-import TreeConfig from './jf_simple_tree.config';
-import EVENTS     from '../../../constants/artifacts_events.constants';
-import JFCommonBrowser from '../jf_common_browser/jf_common_browser';
-
-class JfSimpleBrowserController extends JFCommonBrowser {
-    constructor($element, $stateParams, $scope, $timeout, $q, TreeBrowserDao, ArtifactoryEventBus, NativeBrowser, ArtifactoryState, ArtifactActions, AdvancedStringMatch) {
-        super(ArtifactActions, AdvancedStringMatch);
-        this.$stateParams = $stateParams;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.$scope = $scope;
-        this.$timeout = $timeout;
-        this.$element = $element;
-        this.$q = $q;
-        this.currentNode = {};
-        this.treeBrowserDao = TreeBrowserDao;
-        this.nativeBrowser = NativeBrowser;
-        this.artifactoryState = ArtifactoryState;
-        this.treeElement = $(this.$element).find('#tree-element');
-        this._registerEvents();
-
-
-        let doRefresh = this.artifactoryState.getState('refreshTreeNextTime');
-        if (doRefresh) {
-            this.treeBrowserDao.invalidateRoots();
-            this.artifactoryState.setState('refreshTreeNextTime',false);
-        }
-    }
-
-    // This is called from link function
-    initJSTree() {
-        if (_.isEmpty(this.$stateParams.artifact)) {
-            // load empty parent (roots)
-            this._loadNodeIntoView();
-        }
-        else {
-            // load artifact by path
-            this._loadNodeByPath(this.$stateParams.artifact);
-        }
-    }
-
-     // Preload data for the selected artifact and load it into view
-    _loadNodeByPath(path) {
-        if (path) {
-            this.treeBrowserDao.findNodeByFullPath(path, /* includeArchives = */false)
-                .then((node) => this._loadNodeIntoView(node));
-        }
-        else {
-            this._loadNodeIntoView();
-        }
-    }
-
-    /***************************************************
-     * Load the node's data and children (if applicable)
-     ***************************************************/
-    _loadNodeIntoView(node) {
-        if (node) this.selectedNode = node;
-        let promise;
-         // Not drilling down to repo if didn't click on it
-        if (node && (node.parent || this.artifactoryState.getState('tree_touched'))) {
-            if (!node.isFolder() && !node.isRepo()) // Not drilling down to files / archives
-            {
-                this.currentParentNode = node.parent;
-            }
-            else {
-                this.currentParentNode = node;
-            }
-            promise = this._loadParentIntoView(this.currentParentNode);
-        }
-        else {
-            this.currentParentNode = null;
-            promise = this._loadRootsIntoView();
-        }
-        promise.then(() => this._dispatchEvent());
-    }
-
-    _loadParentIntoView(node) {
-        // (Adam) Don't use ng-class, it causes major performance issue on large data sets
-        this.treeElement.addClass('has-parent');
-        return this._loadChildren(node.getChildren());
-    }
-    
-    _loadRootsIntoView() {
-        // (Adam) Don't use ng-class, it causes major performance issue on large data sets
-        this.treeElement.removeClass('has-parent');   
-        return this._loadChildren(this.treeBrowserDao.getRoots());
-    }
-
-    _loadChildren(promise) {
-        return promise.then((children) => {
-            // select first child if none selected
-            this.selectedNode = this.selectedNode || children[0];
-            children = this._transformData(children || []);
-            if (this.currentParentNode) {
-                // Create a tree with parent and children
-                let goUp = {
-                    type: 'go_up',
-                    data: this.currentParentNode.parent,
-                    text: '..'
-                };
-                let parentTreeNode = this._transformNode(this.currentParentNode);
-                parentTreeNode.children = children;
-                parentTreeNode.state.opened = true;
-
-                this._buildTree([goUp, parentTreeNode]);
-            }
-            else {
-                // Create a tree with only children
-
-                this._buildTree(children);
-            }
-        });
-    }
-
-    _transformData(data) {
-        return data.map((node) => this._transformNode(node));
-    }
-
-    _transformNode(node) {
-        let nodeText;
-        if (false) {///this.nativeBrowser.isAllowed(node)) {
-            // TODO: remove -> once we have the icon in the SVG
-            nodeText = `${ node.text }
-                <a onclick="event.stopImmediatePropagation()"
-                   class="view-in-simple-mode"
-                   target="_blank"
-                   title="Directory Browsing"
-                   href="${ this.nativeBrowser.pathFor(node) }">
-                    <i class="icon icon-simple-browser"></i>
-                </a>`;
-        }
-        else {
-            if (node.isTrashcan()) nodeText = `<span class="no-simple-browsing trashcan-node">Trash Can</span>`;
-            else nodeText = `<span class="no-simple-browsing">${ node.text }</span>`;
-        }
-        return {
-            text: nodeText,
-            data: node,
-            type: node.iconType,
-            li_attr: node.isTrashcan() || (node.isInTrashcan() && node == this.selectedNode) ? {class:"-the-trashcan"} : {},
-            state: {
-                selected: this.selectedNode === node
-            }
-        };
-    }
-
-    _toggleCompactFolders() {
-        this.treeBrowserDao.invalidateRoots();
-        this.initJSTree();
-    }
-
-    _registerTreeEvents() {
-//        $(this.treeElement).on("search.jstree", (e, data) => this._onSearch(e, data));
-
-        $(this.treeElement).on("ready.jstree", (e) => this._onReady(e));
-        $(this.treeElement).on("close_node.jstree", (e, args) => {
-            this.jstree().open_node(args.node);
-        });
-        $(this.treeElement).on("select_node.jstree", (e, args) => {
-            this.artifactoryState.setState('tree_touched', true);
-            let treeNode = args.node.data;
-
-            if (treeNode !== this.currentParentNode && // Not selecting the current parent
-                (!treeNode || // going up to roots
-                treeNode.isFolder() || treeNode.isRepo())) // drilling down to folder or repo
-            {
-                this._loadNodeIntoView(treeNode);
-            }
-            else {
-                // just select (no need to refresh current tree)
-                this.selectedNode = treeNode;
-                this._dispatchEvent();
-            }
-        });
-
-        $(this.treeElement).scroll(()=>this._onScroll());
-    }
-    
-    _dispatchEvent() {
-        if (!this.selectedNode) return;
-        // Make sure tree data is loaded
-        this.selectedNode.load().then(() => {
-            // Then dispatch TREE_NODE_SELECT event
-            this.artifactoryEventBus.dispatch(EVENTS.TREE_NODE_SELECT, {data: this.selectedNode});
-        });
-    }
-
-    _onReady() {
-        if (!this.selectedNode.parent && this.activeFilter) this._searchTree(this.searchText,false,false);
-
-        this.jstree().show_dots();
-        this._focusOnTree();
-    }
-
-
-    /****************************
-     * Event registration
-     ****************************/
-    _registerEvents() {
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TREE_SEARCH_CHANGE, text => this._searchTree(text));
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TREE_SEARCH_CANCEL, text => this._clear_search());
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TREE_SEARCH_KEYDOWN, key => this._searchTreeKeyDown(key));
-
-        // Must destroy jstree on scope destroy to prevent memory leak:
-        this.$scope.$on('$destroy', () => {
-            if (this.jstree()) {
-                this.jstree().destroy();
-            }
-        });
-
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.ACTION_DEPLOY, (repoKey) => {
-            this.artifactoryState.setState('tree_touched', true); // Make sure we go inside the repo and not stay at the root level
-            this.treeBrowserDao.findRepo(repoKey)
-                .then((repoNode) => this._loadNodeIntoView(repoNode));
-        });
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.ACTION_REFRESH, (node) => {
-            if (node.data != this.currentParentNode) return;
-            if (node.data) node.data.invalidateChildren();
-            else this.treeBrowserDao.invalidateRoots();
-            this._loadNodeIntoView(node.data);
-        });
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.ACTION_DELETE, (node) => {
-            this.$timeout(() => this._loadNodeIntoView(this.currentParentNode.parent), 500);
-        });
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.ACTION_MOVE, (options) => this._openTargetNode(options));
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.ACTION_COPY, (options) => this._openTargetNode(options));
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TREE_COMPACT, () => this._toggleCompactFolders());
-
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.ARTIFACT_URL_CHANGED, (stateParams) => {
-            if (stateParams.browser != 'simple') return;
-            // URL changed (like back button / forward button / someone input a URL)
-            let currentNodePath = this.selectedNode && this.selectedNode.fullpath || '';
-            if (currentNodePath != stateParams.artifact || stateParams.forceLoad) {
-                this._loadNodeByPath(stateParams.artifact);
-            }
-        });
-
-    }
-
-    _openTargetNode(options) {
-        this.$timeout(() => {
-            let fullpath = _.compact([options.target.targetRepoKey, options.target.targetPath, options.node.data.text]).join('/');
-            this.treeBrowserDao.invalidateRoots();
-            this._loadNodeByPath(fullpath);
-        }, 500);
-    }
-
-
-    /****************************
-     * Build the JSTree from the nodes
-     ****************************/
-    _buildTree(data) {
-        this.artifactoryState.setState("hasArtifactsData", data.length > 0);
-
-        TreeConfig.core.data = data;
-
-        TreeConfig.contextmenu.items = this._getContextMenuItems.bind(this);
-
-        // Search by node text only (otherwise searches the whole HTML)
-        TreeConfig.search.search_callback = this._searchCallback.bind(this);
-
-        if (this.built) this.jstree().destroy();
-        $(this.treeElement).jstree(TreeConfig);
-        this.built = true;
-        this._registerTreeEvents();
-    }
-
-
-    // setCurrentTab(tab) {
-    //     this.currentTab = tab;
-    // }
-
-    // isCurrentTab(tab) {
-    //     return this.currentTab === tab;
-    // }
-
-}
-
-export function jfSimpleBrowser() {
-    return {
-        scope: {
-            browserController: '='
-        },
-        restrict: 'E',
-        controller: JfSimpleBrowserController,
-        controllerAs: 'SimpleBrowser',
-        bindToController: true,
-        link: ($scope, attrs, $element, SimpleBrowser) => SimpleBrowser.initJSTree(),
-        templateUrl: 'states/artifacts/jf_simple_browser/jf_simple_browser.html'
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_simple_browser/jf_simple_tree.config.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_simple_browser/jf_simple_tree.config.js
deleted file mode 100644
index 61cea80..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_simple_browser/jf_simple_tree.config.js
+++ /dev/null
@@ -1,2 +0,0 @@
-import TreeConfig from '../jf_common_browser/jf_common_browser.config';
-export default _.cloneDeep(TreeConfig);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_stash_browser/jf_stash_browser.config.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_stash_browser/jf_stash_browser.config.js
deleted file mode 100644
index ff79b87..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_stash_browser/jf_stash_browser.config.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import TreeConfig from '../jf_common_browser/jf_common_browser.config';
-let conf = _.cloneDeep(TreeConfig);
-_.extend(conf.core,{'check_callback':true});
-export default conf;
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_stash_browser/jf_stash_browser.html b/web/angular-web/src/main/webapp/app/states/artifacts/jf_stash_browser/jf_stash_browser.html
deleted file mode 100644
index 51ffbd2..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_stash_browser/jf_stash_browser.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<!-- On this element we will activate the JSTree plugin: -->
-<div id="tree-element"></div>
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_stash_browser/jf_stash_browser.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_stash_browser/jf_stash_browser.js
deleted file mode 100644
index ac7d0bc..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_stash_browser/jf_stash_browser.js
+++ /dev/null
@@ -1,422 +0,0 @@
-import TreeConfig from "./jf_stash_browser.config";
-import EVENTS from "../../../constants/artifacts_events.constants";
-import JFCommonBrowser from "../jf_common_browser/jf_common_browser";
-/**
- * wrapper around the jstree jquery component
- * @url http://www.jstree.com/
- *
- * @returns {{restrict: string, controller, controllerAs: string, bindToController: boolean}}
- */
-export function jfStashBrowser() {
-    return {
-        scope: {
-            startCompact: '='
-        },
-        restrict: 'E',
-        controller: JFStashBrowserController,
-        controllerAs: 'jfStashBrowser',
-        templateUrl: 'states/artifacts/jf_stash_browser/jf_stash_browser.html',
-        bindToController: true,
-        link: function ($scope) {
-            $scope.jfStashBrowser.initJSTree();
-        }
-    }
-}
-
-class JFStashBrowserController extends JFCommonBrowser {
-    constructor($timeout, $injector, ArtifactoryEventBus, $element, $scope, $state, $stateParams, $location, $q, ArtifactoryState, ArtifactActions, StashResultsDao, User, AdvancedStringMatch) {
-        super(ArtifactActions, AdvancedStringMatch);
-
-        this.rootID = '____root_node____';
-
-        this.type="stash";
-        this.$scope = $scope;
-        this.$timeout = $timeout;
-        this.$location = $location;
-        this.$state = $state;
-        this.$stateParams = $stateParams;
-        this.$q = $q;
-        this.user = User;
-        this.TreeNode = $injector.get('TreeNode');
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.stashResultsDao = StashResultsDao;
-
-        this.whenTreeDataLoaded = $q.when([]);
-
-        this.$element = $element;
-
-        this.compactMode = this.startCompact || false;
-
-        this.filteredActions = ['Copy','Move','Watch', 'Unwatch', 'UploadToBintray', 'Distribute', 'Refresh', 'DeleteVersions', 'DownloadFolder', 'Zap', 'ZapCaches'];
-
-        this.discardedCount = 0;
-    }
-
-
-    /****************************
-     * Init code
-     ****************************/
-
-    // This is called from link function
-    initJSTree() {
-        this.whenTreeDataLoaded.then(() => {
-            this.treeElement = $(this.$element).find('#tree-element');
-            this._registerEvents();
-            this._buildStashedTree();
-        });
-    }
-
-    _onReady() {
-        let currentPath = this.$stateParams.artifact ? this.$stateParams.artifact.substring(this.$stateParams.artifact.indexOf('/')+1).split(' ').join('') : null;
-
-        if (currentPath) {
-            this.$timeout(()=>{
-                this.jstree().deselect_all();
-                this.jstree().select_node(currentPath);
-                this.jstree().open_node(currentPath);
-
-                let domElement = this._getDomElement(currentPath);
-                this._scrollIntoView(domElement);
-                this._focusOnTree();
-            })
-        }
-        else {
-//            this.artifactoryEventBus.dispatch(EVENTS.TREE_NODE_SELECT,this._getSelectedTreeNode());
-            this.jstree().select_node(this.rootID);
-            this.jstree().open_node(this.rootID);
-        }
-    }
-
-    /****************************
-     * Event registration
-     ****************************/
-    _registerEvents() {
-        // Must destroy jstree on scope destroy to prevent memory leak:
-        this.$scope.$on('$destroy', () => {
-            if (this.jstree()) {
-                this.jstree().destroy();
-            }
-        });
-
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TREE_SEARCH_CHANGE, text => this._searchTree(text));
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TREE_SEARCH_CANCEL, text => this._clear_search());
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TREE_SEARCH_KEYDOWN, key => this._searchTreeKeyDown(key));
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.ACTION_DELETE, (node) => {
-            node.alreadyDeleted = true;
-            this.artifactActions.perform({name: 'DiscardFromStash'},node);
-        });
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.ACTION_MOVE_STASH, (options) => {
-            this.exitStashState(options);
-        });
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.ACTION_COPY_STASH, (options) => {
-            this.exitStashState(options);
-        });
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.ACTION_DISCARD_STASH, () => {
-            this._buildStashedTree();
-        });
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.ACTION_DISCARD_FROM_STASH, (node) => {
-            this._discardFromStash(node);
-        });
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.ACTION_REFRESH_STASH, () => {
-            this._buildStashedTree();
-        });
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.ACTION_EXIT_STASH, (node) => {
-            if (node) this.jstree().select_node(node.id);
-            this.$timeout(()=>this.exitStashState());
-        });
-
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TREE_NODE_OPEN, path => {
-            this._openTreeNode(path)
-        });
-
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TREE_COMPACT, (compact) => this._toggleCompactFolders(compact));
-
-        // URL changed (like back button / forward button / someone input a URL)
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.ARTIFACT_URL_CHANGED, (stateParams) => {
-
-            if (stateParams.browser !== 'stash' || !this.jstree()) return;
-
-            let path;
-            path = stateParams.artifact ? stateParams.artifact.substring(stateParams.artifact.indexOf('/')+1) : this.rootID;
-
-            let selectedNode = this._getSelectedTreeNode();
-            if (selectedNode && selectedNode.fullpath === stateParams.artifact) return;
-
-            this.jstree().deselect_all();
-            this.jstree().select_node(path);
-            let domElement = this._getDomElement(path);
-            this._scrollIntoView(domElement);
-            this._focusOnTree();
-        });
-    }
-
-    /**
-     * register a listener on the tree and delegate to
-     * relevant methods
-     *
-     * @param element
-     * @private
-     */
-    _registerTreeEvents() {
-//        $(this.treeElement).on("search.jstree", (e, data) => this._onSearch(e, data));
-        $(this.treeElement).on("ready.jstree", (e) => this._onReady(e));
-        $(this.treeElement).on("select_node.jstree", (e, args) => {
-            if (this.$stateParams.tab === 'StashInfo' && args.node.id !== this.rootID) {
-                this.$stateParams.tab = 'General';
-            }
-            this._loadNode(args.node);
-        });
-        $(this.treeElement).on("activate_node.jstree", (e, args) => {
-            this.jstree().open_node(args.node);
-        });
-
-        $('#tree-element').on('keydown',(e) => {
-            if (e.keyCode === 37 && e.ctrlKey) { //CTRL + LEFT ARROW --> Collapse All !
-                let node = this.jstree().get_selected(true)[0];
-
-                let parentRepoNode = this.jstree().get_node(node.parent);
-                if (parentRepoNode.id === this.rootID) parentRepoNode = node;
-                else {
-                    while (parentRepoNode.parent !== this.rootID) {
-                        parentRepoNode = this.jstree().get_node(parentRepoNode.parent);
-                    }
-                }
-
-                $('#tree-element').jstree('close_all');
-                this.jstree().select_node(parentRepoNode);
-                this.$timeout(()=>{
-                    this.jstree().close_node(parentRepoNode);
-                });
-            }
-        })
-
-        $(this.treeElement).scroll(()=>this._onScroll());
-
-    }
-
-    _loadNode(item) {
-        if (item.data.load) item.data.load().then(() => {
-            this.artifactoryEventBus.dispatch(EVENTS.TREE_NODE_SELECT, item);
-        });
-    }
-
-
-    /****************************
-     * Compact folders
-     ****************************/
-    _toggleCompactFolders(compact) {
-        this.compactMode = compact;
-        this._buildStashedTree();
-    }
-
-    _buildStashedTree() {
-
-        this.stashResultsDao.get({name: 'stash'}).$promise.then((data)=>{
-            TreeConfig.core.data = this._transformStashDataToTree(data);
-            TreeConfig.contextmenu.items = this._getContextMenuItems.bind(this);
-            if (this.built) this.jstree().destroy();
-            TreeConfig.search.search_callback = this._searchCallback.bind(this);
-            $(this.treeElement).jstree(TreeConfig);
-            this.built = true;
-            if (this.compactMode) {
-                this._compactTree();
-            }
-            this._registerTreeEvents();
-        });
-
-    }
-
-    _createRootNode(stashData) {
-        let THIS = this;
-        let node;
-        node = {
-            id: this.rootID,
-            parent: '#',
-            text: 'Stashed Search Results',
-            type: 'stash',
-            data: {
-                text: 'Stashed Search Results',
-                iconType: 'stash',
-                load: function() {
-
-                    THIS.$stateParams.artifact = '';
-                    THIS.$stateParams.tab = 'StashInfo';
-
-
-                    this.tabs = [{name: "StashInfo"}];
-                    this.actions = stashData.length ? [
-                        {title: "Copy Stash to Repository", name: "CopyStash", icon: "icon-copy"},
-                        {title: "Move Stash to Repository", name: "MoveStash", icon: "icon-move"},
-                        {title: "Discard Search Results", name: "DiscardStash", icon: "icon-delete-content"}
-                    ] : [];
-                    if (!THIS.user.currentUser.getCanDeploy()) {
-                        this.actions.shift();
-                        this.actions.shift();
-                    }
-                    this.info = {
-                        artifactCount: stashData.length - THIS.discardedCount
-                    };
-                    return THIS.$q.when(this);
-                },
-                getDownloadPath: () => {return this.$q.when(this);},
-                refreshWatchActions: () => {return this.$q.when(this);},
-                isRepo: () => {return false;}
-            }
-
-        }
-        return node;
-    }
-
-    _transformStashDataToTree(stashData) {
-
-        let treeData = [];
-
-        let pushToTree = (treeItemData) => {
-            if (!_.findWhere(treeData,{id:treeItemData.id})) {
-                treeData.push(treeItemData);
-            }
-        };
-
-        pushToTree(this._createRootNode(stashData));
-
-        stashData.forEach((result)=>{
-            result.path = result.relativePath;
-            result.text = result.name;
-            result.type = 'file';
-
-            let dirArray = (result.relativePath).split('/');
-            dirArray.pop();
-
-            pushToTree({
-                id: result.relativePath.split(' ').join(''),
-                text: result.name,
-                parent: dirArray.join('/').split(' ').join('') || this.rootID,
-                type: result.mimeType,
-                data: this._filterActions(new this.TreeNode(result))
-            });
-
-            for (let i = dirArray.length-1; i>=0; i--) {
-                let up = _.clone(dirArray);
-                up.pop();
-                pushToTree({
-                    id: dirArray.join('/').split(' ').join(''),
-                    text: dirArray[i],
-                    parent: up.join('/').split(' ').join('') || this.rootID,
-                    type: 'folder',
-                    data: this._filterActions(new this.TreeNode({
-                        repoKey: result.repoKey,
-                        path: dirArray.join('/'),
-                        text: dirArray[i],
-                        type: 'folder'
-                    }))
-                });
-                dirArray.pop();
-            }
-
-        });
-
-        return treeData;
-    }
-
-    _compactTree() {
-
-        let recursiveCompact;
-        recursiveCompact = (node) => {
-            if (node.type !== 'folder') {
-                node.data = this.jstree().get_node(node.id).data;
-                return;
-            }
-
-            if (node.children.length === 1 && node.children[0].type === 'folder') {
-                node.text += '/' + node.children[0].text;
-
-                if (this.$stateParams.artifact === node.data.repoKey+'/'+node.data.path) {
-                    this.$stateParams.artifact = this.jstree().get_node(node.children[0].id).data.repoKey+'/'+this.jstree().get_node(node.children[0].id).data.path;
-                }
-
-                node.data = this.jstree().get_node(node.children[0].id).data;
-                node.id = node.children[0].id;
-                node.children = node.children[0].children;
-                recursiveCompact(node);
-            }
-            else if (node.children.length > 0) {
-                node.data = this.jstree().get_node(node.children[0].id).data;
-                node.children.forEach((child) => {
-                    child.data = this.jstree().get_node(child.id).data;
-                    recursiveCompact(child)
-                });
-            }
-        };
-
-        let json = this.jstree().get_json();
-        json[0].children.forEach((node) => recursiveCompact(node));
-
-        TreeConfig.core.data = json;
-        if (this.built) this.jstree().destroy();
-        $(this.treeElement).jstree(TreeConfig);
-    }
-
-    _filterActions(treeNode) {
-        let origLoad = treeNode.load.bind(treeNode);
-        treeNode.load = () => {
-            return origLoad().then(()=> {
-
-                treeNode.actions = _.filter(treeNode.actions, (action)=> {
-                    return this.filteredActions.indexOf(action.name) === -1;
-                });
-
-                let deleteAction = _.findWhere(treeNode.actions, {name: "Delete"});
-                if (deleteAction) treeNode.actions.splice(treeNode.actions.indexOf(deleteAction), 1);
-
-
-                if (!_.findWhere(treeNode.actions, {name: "ShowInTree"})) {
-                    treeNode.actions.push({
-                        title: "Show In Tree",
-                        name: "ShowInTree",
-                        icon: "icon-show-in-tree"
-                    });
-                }
-
-                if (!_.findWhere(treeNode.actions, {name: "DiscardFromStash"})) {
-                    treeNode.actions.push({
-                        title: "Discard from Stash",
-                        name: "DiscardFromStash",
-                        icon: "icon-delete-content"
-                    });
-                }
-
-                if (deleteAction) treeNode.actions.push(deleteAction);
-
-            });
-        };
-
-        return treeNode;
-    }
-
-    _discardFromStash(node) {
-        let jstree = this.jstree();
-
-        let deletePoint = node;
-        let parent = jstree.get_node(node.parent);
-        while (parent.children.length === 1 && parent.id !== this.rootID) {
-            deletePoint = parent;
-            parent = jstree.get_node(parent.parent);
-        }
-
-        jstree.select_node(parent.id);
-        jstree.delete_node([deletePoint.id]);
-
-        this.discardedCount++;
-    }
-
-    exitStashState(options) {
-        let artifact = options && options.target ? options.target.targetRepoKey || '/' : this.$stateParams.artifact || '';
-        this.$state.go('artifacts.browsers.path', {tab: 'General', artifact: artifact, browser: 'tree'});
-        this.$timeout(()=> {
-            this.artifactoryEventBus.dispatch(EVENTS.TREE_REFRESH);
-            if (options) {
-                this.artifactoryEventBus.dispatch(EVENTS.ACTION_COPY, {node: options.node, target: options.target});
-            }
-        })
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_tree_browser/jf_tree_browser.config.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_tree_browser/jf_tree_browser.config.js
deleted file mode 100644
index 61eba57..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_tree_browser/jf_tree_browser.config.js
+++ /dev/null
@@ -1,2 +0,0 @@
-import TreeConfig from '../jf_common_browser/jf_common_browser.config';
-export default _.cloneDeep(TreeConfig);
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_tree_browser/jf_tree_browser.html b/web/angular-web/src/main/webapp/app/states/artifacts/jf_tree_browser/jf_tree_browser.html
deleted file mode 100644
index 51ffbd2..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_tree_browser/jf_tree_browser.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<!-- On this element we will activate the JSTree plugin: -->
-<div id="tree-element"></div>
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_tree_browser/jf_tree_browser.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_tree_browser/jf_tree_browser.js
deleted file mode 100644
index b42d99f..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_tree_browser/jf_tree_browser.js
+++ /dev/null
@@ -1,600 +0,0 @@
-import TreeConfig from "./jf_tree_browser.config";
-import EVENTS from "../../../constants/artifacts_events.constants";
-import JFCommonBrowser from "../jf_common_browser/jf_common_browser";
-/**
- * wrapper around the jstree jquery component
- * @url http://www.jstree.com/
- *
- * @returns {{restrict: string, controller, controllerAs: string, bindToController: boolean}}
- */
-export function jfTreeBrowser() {
-    return {
-        scope: {
-            browserController: '='
-        },
-        restrict: 'E',
-        controller: JFTreeBrowserController,
-        controllerAs: 'jfTreeBrowser',
-        templateUrl: 'states/artifacts/jf_tree_browser/jf_tree_browser.html',
-        bindToController: true,
-        link: function ($scope) {
-            $scope.jfTreeBrowser.initJSTree();
-        }
-    }
-}
-
-const ARCHIVE_MARKER = '!';
-
-class JFTreeBrowserController extends JFCommonBrowser {
-    constructor($timeout, $compile, ArtifactoryEventBus, $element, $scope, TreeBrowserDao, $stateParams, $q, ArtifactoryState, ArtifactActions, ArtifactoryNotifications, NativeBrowser, User, AdvancedStringMatch) {
-        super(ArtifactActions, AdvancedStringMatch);
-        this.type="tree";
-        this.$scope = $scope;
-        this.$timeout = $timeout;
-        this.$compile = $compile;
-        this.$stateParams = $stateParams;
-        this.$q = $q;
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.treeBrowserDao = TreeBrowserDao;
-        this.artifactoryState = ArtifactoryState;
-        this.user = User.currentUser;
-        this.nativeBrowser = NativeBrowser;
-        if (_.isEmpty($stateParams.artifact)) {
-            // Important to know for switching to simple browser
-            this.whenTreeDataLoaded = $q.when([]);
-        }
-        else {
-            this.whenTreeDataLoaded = TreeBrowserDao.findNodeByFullPath($stateParams.artifact); // Preload data for the current selected artifact
-        }
-
-        this.$element = $element;
-
-        let doRefresh = this.artifactoryState.getState('refreshTreeNextTime');
-        if (doRefresh) {
-            $timeout(()=>this._refreshTree());
-            this.artifactoryState.setState('refreshTreeNextTime',false);
-        }
-
-    }
-
-
-    /****************************
-     * Init code
-     ****************************/
-
-    // This is called from link function
-    initJSTree() {
-        // preload artifact
-        this.whenTreeDataLoaded.then(() => {
-            this.treeElement = $(this.$element).find('#tree-element');
-            this._registerEvents();
-            this._buildTree();
-            this._registerTreeEvents();
-        });
-    }
-
-    /**
-     * When JStree is ready load the current browsing path from URL
-     * and restore the nodes open and selected state.
-     * @param e
-     * @private
-     */
-    _openTreeNode(artifact) {
-        let deferred = this.$q.defer();
-        let jstree = this.jstree();
-        let root = jstree.get_node('#');
-        let path = _.trim(artifact?artifact.replace('//', '/'):'', '/').split('/');
-
-        this._openNodePath(root, path, jstree.get_node(root.children[0]), (selectedNode) => {
-            jstree.deselect_all();
-            // Select the node
-            jstree.select_node(selectedNode);
-
-            // scroll the node into view
-            let domElement = this._getDomElement(selectedNode);
-            this._scrollIntoView(domElement);
-            this._focusOnTree();
-            deferred.resolve();
-        });
-        return deferred.promise
-    }
-
-    _onReady() {
-
-        this.$timeout(()=>{
-            this._initTrashPin();
-        },100);
-
-        this._openTreeNode(this.$stateParams.artifact);
-        this.jstree().show_dots();
-    }
-
-    /****************************
-     * Event registration
-     ****************************/
-    _registerEvents() {
-        // Must destroy jstree on scope destroy to prevent memory leak:
-        this.$scope.$on('$destroy', () => {
-            if (this.jstree()) {
-                this.jstree().destroy();
-            }
-            $(window).off('resize');
-        });
-
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TREE_SEARCH_CHANGE, text => this._searchTree(text));
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TREE_SEARCH_CANCEL, text => this._clear_search());
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TREE_SEARCH_KEYDOWN, key => this._searchTreeKeyDown(key));
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.ACTION_DEPLOY, repoKey => this._refreshRepo(repoKey));
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.ACTION_REFRESH, node => this._refreshFolder(node));
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TREE_REFRESH, (node) => node ? this._refreshFolder(node) : this._refreshTree());
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.ACTION_DELETE, (node) => {
-            this._refreshParentFolder(node); // Refresh folder of node's parent
-            this.refreshTrashCan();
-        });
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.ACTION_MOVE, (options) => {
-            this._refreshParentFolder(options.node); // Refresh folder of node's parent
-            this._refreshFolderPath(options); // Refresh target folder where node was copied
-        });
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.ACTION_COPY, (options) => {
-            this._refreshFolderPath(options);
-        });
-
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TREE_NODE_OPEN, path => {
-            this._openTreeNode(path)
-        });
-
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TREE_COLLAPSE_ALL, () => {
-            this._collapseAll();
-        });
-
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.TREE_COMPACT, () => this._toggleCompactFolders());
-
-        // URL changed (like back button / forward button / someone input a URL)
-        this.artifactoryEventBus.registerOnScope(this.$scope, EVENTS.ARTIFACT_URL_CHANGED, (stateParams) => {
-            if (stateParams.browser != 'tree') return;
-            // Check if it's already the current selected node (to prevent opening the same tree node twice)
-            let selectedNode = this._getSelectedTreeNode();
-            if (selectedNode && selectedNode.fullpath === stateParams.artifact) return;
-            this.treeBrowserDao.findNodeByFullPath(stateParams.artifact)
-                .then(() => this._openTreeNode(stateParams.artifact));
-        });
-
-        $(window).on('resize', () => this._resizePinnedTrash());
-        this.$scope.$on('ui-layout.resize', () => this._resizePinnedTrash());
-
-
-    }
-
-    /**
-     * register a listener on the tree and delegate to
-     * relevant methods
-     *
-     * @param element
-     * @private
-     */
-    _registerTreeEvents() {
-//        $(this.treeElement).on("search.jstree", (e, data) => this._onSearch(e, data));
-        $(this.treeElement).on("ready.jstree", (e) => this._onReady(e));
-
-        $(this.treeElement).on("select_node.jstree", (e, args) => {
-            if (args.event) { // User clicked / pressed enter
-                this.artifactoryState.setState('tree_touched', true);
-            }
-            this._loadNode(args.node);
-        });
-        $(this.treeElement).on("activate_node.jstree", (e, args) => {
-            if (args.event) { // User clicked / pressed enter
-                this.artifactoryState.setState('tree_touched', true);
-            }
-
-            if (!args.node.data.isArchive() && args.node.data.icon !== 'docker') this.jstree().open_node(args.node);
-        });
-
-        $(this.treeElement).on("after_open.jstree",(e, args)=>{
-            let nodeIsTrash = args.node && args.node.data && args.node.data.isTrashcan && args.node.data.isTrashcan();
-            if (nodeIsTrash) this._initTrashPin();
-
-            this._focusOnTree();
-            if (this.activeFilter) this._searchTree(this.searchText,false,false);
-
-            if (args.node.$autoScroll) {
-                this._autoScroll(args.node);
-                delete args.node.$autoScroll;
-            }
-
-        });
-
-        $(this.treeElement).on("click",(e) => {
-            let node = this.jstree().get_node($(e.target));
-            let nodeIsTrash = node.data && node.data.isTrashcan && node.data.isTrashcan();
-            let nodeIsInTrash = node.data && node.data.isInTrashcan && node.data.isInTrashcan();
-
-            if ((!nodeIsTrash && !nodeIsInTrash) || !this.isTrashPinned()) {
-                node.$autoScroll = true;
-            }
-        });
-
-
-        $(this.treeElement).on("after_close.jstree",(e, args)=> {
-            let nodeIsTrash = args.node && args.node.data && args.node.data.isTrashcan && args.node.data.isTrashcan();
-            if (nodeIsTrash) this._initTrashPin();
-        });
-        $(this.treeElement).on("load_node.jstree",(e, args)=> {
-            let nodeIsTrash = args.node && args.node.data && args.node.data.isTrashcan && args.node.data.isTrashcan();
-            if (nodeIsTrash || args.node.id === '#') this._initTrashPin();
-        });
-
-        $('#tree-element').on('keydown',(e) => {
-            if (e.keyCode === 37 && e.ctrlKey) { //CTRL + LEFT ARROW --> Collapse All !
-                this._collapseAll();
-            }
-        });
-
-        $(this.treeElement).scroll(()=>this._onScroll());
-
-
-    }
-
-    _autoScroll(node) {
-        let treeItem = $('#' + node.id).find('.jstree-children')[0];
-        if (!treeItem) return;
-
-        let numOfChildrens = $(treeItem).find('> div').length,
-                heightOfElement = $('.jstree-anchor').first().height(),
-                treeWrapperHeight = $('#tree-element').offset().top + $('#tree-element').height();
-
-        if ($(treeItem).offset().top + (heightOfElement *2) > treeWrapperHeight) {
-            let currentScroll = $('#tree-element').scrollTop();
-
-            if (numOfChildrens > 3) {
-                this.$timeout(()=> {
-                    $('#tree-element').animate({scrollTop: currentScroll + ((heightOfElement * 3) + (heightOfElement/2) + 5)})
-                });
-            }
-            if (numOfChildrens <= 3) {
-                this.$timeout(()=> {
-                    $('#tree-element').animate({scrollTop: currentScroll + (heightOfElement * numOfChildrens)});
-                });
-            }
-        }
-    }
-    _resizePinnedTrash() {
-        let e = $('.jstree-li-the-trashcan');
-        if (e.hasClass('pinned')) {
-            let p = e.parent().parent();
-            e.css('width',p.outerWidth()+'px');
-
-            this.treeElement.css('height','auto');
-            var h = parseInt(this.treeElement.css('height'));
-            this.treeElement.css('height',h-e.height() + 'px');
-
-        }
-        else {
-            e.css('width','auto');
-            this.treeElement.css('height','auto');
-        }
-
-        let trashPin = $('.trash-pin');
-        trashPin.css('left', e.parent().parent().width() - 50 + 'px')
-
-
-    }
-
-    _collapseAll() {
-        let node = this.jstree().get_selected(true)[0];
-
-        let parentRepoNode = this.jstree().get_node(node.parent);
-        if (parentRepoNode.id === '#') parentRepoNode = node;
-        else {
-            while (parentRepoNode.parent !== '#') {
-                parentRepoNode = this.jstree().get_node(parentRepoNode.parent);
-            }
-        }
-
-        $('#tree-element').jstree('close_all');
-        this.jstree().select_node(parentRepoNode);
-        this.$timeout(()=>{
-            this.jstree().close_node(parentRepoNode);
-        });
-    }
-
-    _loadNode(item) {
-        item.data.load().then(() => {
-            this.artifactoryEventBus.dispatch(EVENTS.TREE_NODE_SELECT, item)
-        });
-    }
-
-    /****************************
-     * Compact folders
-     ****************************/
-    _toggleCompactFolders() {
-        this._refreshTree();
-    }
-
-    /****************************
-     * Building the tree
-     ****************************/
-    _buildTree() {
-        let asyncStateLoad = (obj, cb) => {
-            let promise;
-            if (obj.id === '#') {
-                promise = this.treeBrowserDao.getRoots();
-            }
-            else {
-                promise = obj.data.getChildren();
-            }
-            promise.then((data) => {
-                if (obj.id === '#') {
-                    data.forEach((node)=>{
-                        let removeIndex = node.actions.indexOf(_.findWhere(node.actions, {name: "NativeBrowser"}));
-                        if (removeIndex !== -1) node.actions.splice(removeIndex,1);
-
-                        let index = node.actions.indexOf(_.findWhere(node.actions, {name: "Watch"}));
-                        if (index===-1) index = node.actions.indexOf(_.findWhere(node.actions, {name: "Unwatch"}));
-                        if (index===-1) index = node.actions.indexOf(_.findWhere(node.actions, {name: "Move"}));
-                        if (index===-1) index = node.actions.indexOf(_.findWhere(node.actions, {name: "Refresh"}));
-                        if (this.nativeBrowser.isAllowed(node)) node.actions.splice(index+1,0,{
-                            icon: "icon-simple-browser",
-                            name: "NativeBrowser",
-                            title: "Native Browser"
-                        });
-
-                    })
-                }
-                this.artifactoryState.setState("hasArtifactsData", data.length > 0 || obj.id !== '#');
-                cb(this._transformData(data));
-            });
-        };
-
-        TreeConfig.core.data = asyncStateLoad;
-        TreeConfig.contextmenu.items = this._getContextMenuItems.bind(this);
-
-                // Search by node text only (otherwise searches the whole HTML)
-        TreeConfig.search.search_callback = this._searchCallback.bind(this);
-
-        $(this.treeElement).jstree(TreeConfig);
-    }
-
-    _transformData(data) {
-        data = data || [];
-        return data.map((node) => {
-            let item = {};
-            item.children = node.hasChild;
-            item.text = node.isTrashcan() ? '<span class="trashcan-node">Trash Can<i ng-show="!jfTreeBrowser.isTrashPinned()" ng-click="jfTreeBrowser.toggleTrashPin($event)" class="icon icon-pin trash-pin" jf-tooltip="Pin Trash Can"></i><i ng-show="jfTreeBrowser.isTrashPinned()" ng-click="jfTreeBrowser.toggleTrashPin($event)" class="icon icon-unpin trash-pin" jf-tooltip="Unpin Trash Can"></i></span>'
-                : node.text;
-            item.data = node;
-            item.type=node.iconType;
-            if (node.isTrashcan())
-                item.li_attr={class:"-the-trashcan"};
-            return item;
-        });
-    }
-
-    /****************************
-     * Refreshing the tree
-     ****************************/
-
-    /**
-     * refresh children of folder
-     *
-     * @param node
-     * @private
-     */
-    _refreshRepo(repoKey) {
-        let jstree = this.jstree();
-        let root = jstree.get_node('#');
-        let repoJsNode;
-        _.each(root.children, (child) => {
-            repoJsNode = jstree.get_node(child);
-            if (repoJsNode && repoJsNode.data && repoJsNode.data.repoKey === repoKey) return false;
-        });
-        //console.log(repoJsNode.data.repoKey);
-        if (repoJsNode) {
-            repoJsNode.data.invalidateChildren();
-            jstree.load_node(repoJsNode, () => {
-                jstree.select_node(repoJsNode);
-            });
-        }
-    }
-
-    _refreshFolder(node) {
-        if (node.data) node.data.invalidateChildren();
-        else this.treeBrowserDao.invalidateRoots();
-        this.jstree().load_node(node);
-    }
-
-    _refreshParentFolder(node) {
-        node.data.invalidateParent();
-        let parentNodeItem = this.jstree().get_node(node.parent);
-        this.$timeout(() => {        
-            this._refreshFolder(parentNodeItem);
-            this.jstree().select_node(parentNodeItem);
-        }, 500);
-    }
-
-    _refreshFolderPath(option) {
-        let targetPath = _.compact(option.target.targetPath.split('/'));
-        let path = [option.target.targetRepoKey].concat(targetPath);
-
-        let curNode = this.jstree().get_node('#');
-
-        let childNode = this._getChildByPath(curNode, path);
-        if (childNode && _.isArray(childNode.children)) {
-            curNode = childNode;
-        }
-
-        // Data is still not refreshed on server
-        this.$timeout(()=> {
-            if (curNode && curNode.data) {
-                this._refreshFolder(curNode);
-                curNode.data.getChildren().then(()=> {
-                    this._openTreeNode(option.target.targetRepoKey + '/' + option.target.targetPath + '/' + option.node.data.text)
-                });
-            }
-            else {
-                this._openTreeNode(option.target.targetRepoKey + '/' + option.target.targetPath + '/' + option.node.data.text);
-            }
-        }, 500);
-    }
-
-    _refreshTree() {
-        this.treeBrowserDao.invalidateRoots();
-        if (this.jstree() && this.jstree().refresh) this.jstree().refresh();
-    }
-
-    /****************************
-     * Traversing the tree
-     ****************************/
-
-     /**
-     * Find the next child by path. Take into account the node's text by consist of some of the path elements (in compact mode)
-     * @param parentNode:Object node object from where to start
-     * @param path:Array array of path elements
-     * @returns childNode or undefined
-     * @private
-     */    
-    _getChildByPath(parentNode, path) {
-        let jstree = this.jstree();
-        let children = this._getChildrenOf(parentNode);
-        // Find the node that conforms to the largest subpath of path 
-        for(let i = path.length; i > 0; i--) {
-            let subpath = path.slice(0, i);
-            let testPathStr = _.trimRight(subpath.join('/'), ARCHIVE_MARKER);
-            let result = _.find(children, (childNode) => {
-                // Sometimes the node's text is not the full text (like for docker images)
-                let childPath = childNode.data.fullpath;
-
-                if (childPath === testPathStr || childPath === testPathStr + '/') {
-                    return childNode;
-                }
-            });
-            if (result) return result;
-        }
-    }
-
-    _getChildrenOf(parentNode) {
-        let jstree = this.jstree();
-        return _.compact(parentNode.children.map((jsTreeNodeId) => jstree.get_node(jsTreeNodeId)));
-    }
-
-    /**
-     * Open the path starting from the root node, and call the callback with the leaf node
-     * and restore the nodes open and selected state.
-     * @param node:Object node object from where to start
-     * @param path:Array array of path elements
-     * @param selectedNode:Object default node to return if not found
-     * @param callback:Function callback to call with leaf node once the traversing is complete
-     * @private
-     */
-    _openNodePath(node, path, leafNode, callback, pathStopIndex = 1) {
-        let jstree = this.jstree();
-        let childNode;
-        while(pathStopIndex <= path.length) {
-            let testPath = path.slice(0, pathStopIndex);
-            childNode = this._getChildByPath(node, testPath);
-            if (childNode) break;
-            pathStopIndex++;
-        }
-
-        if (childNode) {
-            leafNode = childNode;
-            if (path.length === 0) {
-                callback(leafNode);
-            }
-            else {
-                if (!leafNode.data.isArchive() && leafNode.data.icon !== 'docker') {
-                    jstree.open_node(leafNode, (node) => {
-                        this._openNodePath(leafNode, path, leafNode, callback, pathStopIndex + 1);
-                    }, false);
-                }
-                else {
-                    callback(leafNode);
-                }
-            }
-        }
-        else {
-            callback(leafNode);
-        }
-    }
-    refreshTrashCan() {
-        let trashID = $('.trashcan-node').parent().parent().prop('id');
-        let trashNode = this.jstree().get_node(trashID);
-        this.artifactoryEventBus.dispatch(EVENTS.TREE_REFRESH, trashNode);
-    }
-
-
-    pinTrash() {
-        let trashElem = $('.jstree-li-the-trashcan');
-        if (!trashElem.length) return;
-
-        let trashPin = $('.trash-pin');
-        this.tempScrollTop = trashElem.scrollParent().scrollTop();
-        let wasPinned = trashElem.hasClass('pinned');
-        trashElem.addClass('pinned');
-        localStorage.pinnedTrash = true;
-
-        this.$scope.$broadcast('ui-layout.resize');
-
-        trashElem.offset({left: trashElem.closest('#tree-element').offset().left});
-        $(trashElem.children()[0]).css('margin-left','-10px');
-        $(trashElem.find('.jstree-children')[0]).css('margin-left','-10px');
-        trashElem.on('scroll', () => {
-            let target = trashElem.scrollTop();
-//            trashPin.css('top',target);
-            trashPin.css('left', trashElem.scrollLeft() + trashElem.parent().parent().width() - 50 + 'px')
-        });
-        if (!wasPinned) trashPin.scrollParent().scrollTop(0);
-
-    }
-
-    unpinTrash() {
-        let trashElem = $('.jstree-li-the-trashcan');
-        if (!trashElem.length) return;
-
-        let trashPin = $('.trash-pin');
-        trashElem.removeClass('pinned');
-        delete localStorage.pinnedTrash;
-//        trashPin.css('top','auto');
-        trashElem.scrollParent().scrollTop(this.tempScrollTop);
-        $(trashElem.children()[0]).css('margin-left','0px');
-        $(trashElem.find('.jstree-children')[0]).css('margin-left','0px');
-
-        if (!this._isScrolledIntoView(trashElem.find('.jstree-anchor')[0],0)) {
-            this._scrollIntoView($(trashElem.find('.jstree-anchor')[0]));
-        }
-
-        this.$scope.$broadcast('ui-layout.resize');
-    }
-
-    toggleTrashPin(e) {
-        e.stopImmediatePropagation()
-        e.preventDefault();
-
-        let trashElem = $('.jstree-li-the-trashcan');
-        if (trashElem.hasClass('pinned')) {
-            this.unpinTrash();
-        }
-        else {
-            this.pinTrash();
-       }
-    }
-
-    _initTrashPin() {
-        let e = $('.trash-pin');
-        if (!e.prop('compiled')) {
-            this.$compile(e)(this.$scope);
-            e.prop('compiled',true);
-        }
-
-        if (this.isTrashPinned()) {
-            this.pinTrash();
-        }
-        this.$scope.$broadcast('ui-layout.resize');
-    }
-
-    isTrashPinned() {
-        return localStorage.pinnedTrash;
-    }
-
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_tree_search/jf_tree_search.html b/web/angular-web/src/main/webapp/app/states/artifacts/jf_tree_search/jf_tree_search.html
deleted file mode 100644
index de0b470..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_tree_search/jf_tree_search.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<div
-	class="jf-tree-search-container"
-	ng-class="{'jf-tree-search-active': TreeSearch.showSearch}">
-	<input type="search"
-	       class="jf-tree-search"
-	       ng-model="TreeSearch.term"
-		   ng-model-options="{debounce: 250}"
-		   ng-keydown="TreeSearch.onKeydown($event)"
-		   placeholder="Find..."
-		   ng-change="TreeSearch.onChange()"/>
-	<div class="spinner-msg-local" ng-if="Browsers.searchInAction">
-		<div class="icon-hourglass-local"></div>
-	</div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/jf_tree_search/jf_tree_search.js b/web/angular-web/src/main/webapp/app/states/artifacts/jf_tree_search/jf_tree_search.js
deleted file mode 100644
index 07296a6..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/jf_tree_search/jf_tree_search.js
+++ /dev/null
@@ -1,92 +0,0 @@
-import EVENTS     from '../../../constants/artifacts_events.constants';
-import KEYS       from '../../../constants/keys.constants';
-export function jfTreeSearch() {
-    return {
-        restrict: 'E',
-        controller: TreeSearchController,
-        controllerAs: 'TreeSearch',
-        templateUrl: 'states/artifacts/jf_tree_search/jf_tree_search.html',
-        bindToController: true
-    }
-}
-
-class TreeSearchController {
-    constructor(ArtifactoryEventBus, $element, hotkeys, $scope, $timeout) {
-        this.$scope = $scope;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.$element = $element;
-        this.$timeout = $timeout;
-        this.term = '';
-        this.showSearch = false;
-        this.hotkeys = hotkeys;
-        this._setupHotkeys();
-
-
-        this.artifactoryEventBus.registerOnScope(this.$scope,EVENTS.ACTIVATE_TREE_SEARCH,()=>{
-            $timeout(()=>{
-                this._activateSearch();
-            });
-        });
-    }
-
-    onChange() {
-        this.artifactoryEventBus.dispatch(EVENTS.TREE_SEARCH_CHANGE, this.term);
-    }
-    onKeydown($event) {
-        // Send events to tree on key down / up / enter
-        if (_.include([KEYS.ENTER, KEYS.DOWN_ARROW, KEYS.UP_ARROW, KEYS.ESC], $event.keyCode)) {
-            $event.preventDefault();
-            // Deactivate on enter press
-            if (_.include([KEYS.ENTER, KEYS.ESC], $event.keyCode)) {
-                this._deactivateSearch();
-            }
-        }
-        this.artifactoryEventBus.dispatch(EVENTS.TREE_SEARCH_KEYDOWN, $event.keyCode);
-    }
-    _deactivateSearch() {
-        this.term = '';
-        this.showSearch = false;
-        this.$searchInput().blur();
-        $('body').off('click.outsideTreeSearch');
-    }
-
-    _activateSearch(key) {
-        this.artifactoryEventBus.dispatch(EVENTS.TREE_SEARCH_CANCEL);
-        this.showSearch = true;
-        this.$timeout(()=>{
-            if (!this.term) { //fix for firefox not showing the first key
-                this.term = key;
-                this.artifactoryEventBus.dispatch(EVENTS.TREE_SEARCH_CHANGE, this.term);
-            }
-        });
-        this.$searchInput().focus();
-        $('body').on('click.outsideTreeSearch', (e) => {
-            if (!$(this.$element).has(e.target).length) {
-                this.artifactoryEventBus.dispatch(EVENTS.TREE_SEARCH_CANCEL);
-                this._deactivateSearch();
-                if (!this.$scope.$$phase) this.$scope.$digest();
-            }
-        });
-
-    }
-
-    $searchInput() {
-        return this.$element.find('input')[0];
-    }
-
-    _setupHotkeys() {
-        this.hotkeys.bindTo(this.$scope).add({
-            combo: KEYS.HOTKEYS.ALPHANUMERIC.split(''),
-            description: 'Any alphanumeric key to search the tree',
-            callback: (event, hotkey) => {
-                if (_.contains(event.target.classList, 'jstree-anchor')) {
-//                    var key = hotkey.format()[0];
-                    var key = String.fromCharCode(event.which);
-                    this._activateSearch(key);
-                }
-            }
-        });
-
-    }
-
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/search/search.controller.js b/web/angular-web/src/main/webapp/app/states/artifacts/search/search.controller.js
deleted file mode 100644
index ac0ad0d..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/search/search.controller.js
+++ /dev/null
@@ -1,1218 +0,0 @@
-import EVENTS from "../../../constants/artifacts_events.constants";
-import TOOLTIP from "../../../constants/artifact_tooltip.constant";
-
-let headerCellGroupingTemplate = require("raw!../../../ui_components/artifactory_grid/templates/headerCellTemplate.html");
-export class SearchController {
-    constructor($scope, $stateParams, $window, $state, ArtifactoryGridFactory, ArtifactSearchDao, ArtifactPackageSearchDao, ArtifactoryEventBus,
-                ArtifactActionsDao, artifactoryDownload, RepoDataDao, ArtifactoryState, uiGridConstants, $timeout, ArtifactActions, FooterDao,
-            commonGridColumns,ArtifactoryModal, ArtifactViewSourceDao, StashResultsDao, ArtifactoryNotifications, User, SetMeUpDao, UserProfileDao) {
-        this.$window = $window;
-        this.$timeout = $timeout;
-        this.repoDataDao = RepoDataDao;
-        this.artifactSearchDao = ArtifactSearchDao;
-        this.userProfileDao = UserProfileDao;
-        this.footerDao = FooterDao;
-        this.setMeUpDao = SetMeUpDao;
-        this.artifactPackageSearchDao = ArtifactPackageSearchDao;
-        this.stashResultsDao = StashResultsDao;
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.artifactoryState = ArtifactoryState;
-        this.$stateParams = $stateParams;
-        this.actions = ArtifactActions;
-        this.user = User;
-        this.currentSearch = $stateParams.searchType || "";
-        this.download = artifactoryDownload;
-        this.artifactActionsDao = ArtifactActionsDao;
-        this.gridOptions = {};
-        this.uiGridConstants = uiGridConstants;
-        this.commonGridColumns = commonGridColumns;
-        this.artifactViewSourceDao = ArtifactViewSourceDao.getInstance();
-        this.$state = $state;
-        this.$scope = $scope;
-        this.repos = {};
-        this.repoList = [];
-        this.isOpenRepoList = true;
-        this.resultsMsg = 'Search Results';
-        this.TOOLTIP = TOOLTIP.artifacts.search;
-        this.modal=ArtifactoryModal;
-        this.query = {
-            selectedRepositories: []
-        };
-
-        if (this.currentSearch === 'package') {
-            this._createPackageSearchColumnsObject();
-        }
-        this._initSearch();
-        this._createGrid();
-
-        this.showAQL = false;
-
-        // isSearchShown is used to show / hide the tree
-        $scope.Artifact.isSearchShown = true;
-        $scope.$on('$destroy', () => {
-            $scope.Artifact.isSearchShown = false;
-        });
-
-        ArtifactoryEventBus.registerOnScope($scope, EVENTS.SEARCH_COLLAPSE, (collapse) => {
-            this.closeSearchPanel(collapse);
-        });
-
-        this.results = [];
-        this.savedToStash = false;
-
-        this._updateStashStatus();
-    }
-
-
-    showInTree(row) {
-        let relativePath;
-        let artifactPath;
-        if (this.currentSearch === 'trash') {
-            relativePath = (row.originRepository + "/" + row.relativeDirPath).split('[root]').join('');
-            artifactPath = (row.repoKey + "/" + relativePath + "/" + row.name).split('//').join('/');
-        }
-        else {
-            relativePath = row.relativePath ? (row.relativePath.startsWith('./') ? row.relativePath.substr(2) : row.relativePath) : '';
-            artifactPath = row.repoKey + "/" + (relativePath || row.path);
-        }
-
-
-        let archivePath = '';
-        if (row.archiveName) {
-            if(row.archivePath === '[root]') {
-                row.archivePath = '';
-            }
-            archivePath = row.repoKey + "/" + row.archivePath + row.archiveName;
-        }
-        let path = (archivePath || artifactPath );
-        this.$state.go('artifacts.browsers.path', {
-            "browser": "tree",
-            "tab": "General",
-            "artifact": path
-        });
-
-        this._clearSearchTab();
-
-    }
-
-    showInBintray(row) {
-        this.$window.open('https://bintray.com/bintray/jcenter/' + row.package, '')
-    }
-
-    openRepoList() {
-        this.isOpenRepoList = !this.isOpenRepoList;
-    }
-
-    downloadSelectedItems(row) {
-//        this.download(row.downloadLink);
-    }
-
-    restoreTrashItem(row) {
-        this.actions.perform({name: 'RestoreToOriginalPath'},
-            {
-                data: {
-                    path: (row.originRepository + '/' + row.relativeDirPath + '/' + row.name).split('[root]').join(''),
-                    repoKey: row.repoKey
-                }
-            }
-        )
-        .then(()=>{
-            this._getGridData()
-        })
-    }
-
-    viewCodeArtifact(row) {
-        let name = row.name;
-        if(_.startsWith(name, './')) {
-            name = name.slice(2);
-        }
-        if (row.archiveName) {
-            if(row.archivePath === '[root]') {
-                row.archivePath = '';
-            }
-            this.artifactViewSourceDao.fetch({
-                archivePath: row.archivePath + row.archiveName,
-                repoKey: row.repoKey,
-                sourcePath: name
-            }).$promise
-                    .then((result) => {
-                        this.modal.launchCodeModal(row.name, result.source,
-                                {name: row.type, json: true});
-                    })
-        } else {
-            let data = {
-                repoKey: row.repoKey,
-                path: (row.relativePath || row.path)
-            };
-            this.artifactActionsDao.perform({action: 'view'}, data).$promise
-                    .then((result) => {
-                        this.modal.launchCodeModal(row.name, result.data.fileContent,
-                                {name: row.type, json: true});
-                    });
-        }
-    }
-
-    _initSearch() {
-        if (this.$stateParams.searchType) {
-            this.closeSearchPanel(false);
-        }
-        if (!this.repoList.length) {
-            let getFuncName = this.currentSearch === 'package' ? 'getForPackageSearch' : 'getForSearch';
-            this.repoDataDao[getFuncName]().$promise.then((result)=> {
-                result.repoTypesList = _.map(result.repoTypesList,(repo)=>{
-                    repo._iconClass = "icon " + (repo.type === 'local' ? "icon-local-repo" : (repo.type === 'remote' ? "icon-remote-repo" : (repo.type === 'virtual' ? "icon-virtual-repo" : (repo.type === 'distribution' ? "icon-distribution-repo" : "icon-notif-error"))));
-                    return repo;
-                });
-
-                let dists = _.filter(result.repoTypesList,(repo)=>repo.type==='distribution');
-                let locals = _.filter(result.repoTypesList,(repo)=>repo.type==='local');
-                let caches = _.filter(result.repoTypesList,(repo)=>repo.type==='remote');
-
-                this.allRepoList = _.cloneDeep(_.union(dists,locals,caches));
-
-                let lastIncluded = (this.$stateParams.searchParams && this.$stateParams.searchParams.selectedRepos) ? this.$stateParams.searchParams.selectedRepos : [];
-                this.repoList = _.filter(this.allRepoList,(repo)=>{
-                    return !_.find(lastIncluded,{repoKey: repo.repoKey});
-                });
-            });
-        }
-        if (this.$stateParams.params) {
-            this.query = JSON.parse(atob(this.$stateParams.params));
-
-            if (this.currentSearch === 'package') {
-                this.packageSearchColumns = this.query.columns;
-            }
-            this._getGridData();
-        }
-        else {
-            if (this.currentSearch === 'package') {
-                this.packageSearchColumns = ['artifact','path','repo','modified'];
-            }
-        }
-        //get set me up data (for baseUrl)
-        this.setMeUpDao.get().$promise.then((result)=> {
-            this.baseUrl = result.baseUrl;
-            this._updateAQL();
-        });
-
-        this.userProfileDao.getApiKey().$promise.then((res)=>{
-            this.apiKey = res.apiKey;
-            this._updateAQL();
-        });
-
-
-
-    }
-
-    _updateAQL() {
-        if (this.cleanAql) this.aql = `curl -H 'X-JFrog-Art-Api: ${this.apiKey || '<YOUR_API_KEY>'}' -X POST ${this.baseUrl}/api/search/aql -d '\n${this.cleanAql}'`;
-    }
-    _createGrid() {
-        if (this.currentSearch === 'package' && !this.packageSearchColumns) return;
-
-        if(this.currentSearch == "remote" || this.currentSearch == "class") {
-            this.gridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                    .setColumns(this._getColumns())
-                    .setRowTemplate('default')
-                    .setGridData([]);
-        } else {
-            this.gridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                    .setColumns(this._getColumns())
-                    .setRowTemplate('default')
-                    .setMultiSelect()
-                    .setBatchActions(this._getBatchActions())
-                    .setGridData([]);
-        }
-
-        this.gridOptions.isRowSelectable = (row) => {
-            var notRepository = row.entity.relativeDirPath !== '[repo]';
-            return notRepository && _.contains(row.entity.actions, 'Delete');
-        };
-    }
-
-    setBatchActions(batchActions) {
-        this.batchActions = batchActions;
-        this.setMultiSelect();
-        return this;
-    }
-
-    _getBatchActions() {
-        return [
-            {
-                icon: 'clear',
-                name: 'Delete',
-                callback: () => this.bulkDelete(this.currentSearch === 'trash')
-            }
-        ]
-    }
-
-    _getGridData() {
-
-        //we work with a copy of the query, because we don't want to change our model, but we want to change the data we send (e.g. add wildcards)
-        let tempQuery = this.query;
-        this.query = angular.copy(this.query);
-        this._handleExplicitWildCard(this.query);
-
-        if (this.currentSearch === 'package' && !this.packageSearchColumns) return;
-
-        if (this.currentSearch == "property") {
-            this.artifactSearchDao.fetch({
-                search: "property",
-                propertyKeyValues: this.query.properties,
-                selectedRepositories: _.pluck(this.query.selectedRepositories,'repoKey')
-            }).$promise.then((result)=> {
-                    this.resultsMsg = result.data.message;
-                    this.gridOptions.setGridData(result.data.results);
-                    this.results = result.data.results;
-                    this.savedToStash = false;
-                });
-        }
-        else if (this.currentSearch === "package" && this.query.query.search !== 'gavc') {
-            this.artifactPackageSearchDao.runQuery({},this.query.query).$promise.then((result)=>{
-                result = result.data;
-
-                _.map(result.results, (result)=>{
-                    if (result.extraFields) {
-                        for (let key in result.extraFields) {
-                            result['extraField_'+key] = result.extraFields[key].join(', ');
-                        }
-                        delete result.extraFields;
-                    }
-                });
-
-                this.resultsMsg = result.message;
-                this.gridOptions.setGridData(result.results);
-                this.results = result.results;
-                this.savedToStash = false;
-                if (result.searchExpression) {
-                    this.cleanAql = result.searchExpression;
-                    this._updateAQL();
-                    this.$timeout(()=>{
-                        let showAqlButtonElem = $('#show-aql-button');
-                        let aqlViewerElem = $('#aql-viewer');
-                        let gridFilterElem = $('jf-grid-filter');
-                        let gridActionElem = $('.wrapper-grid-actions');
-                        gridFilterElem.append(showAqlButtonElem);
-                        showAqlButtonElem.css('display','block');
-
-                        gridActionElem.after(aqlViewerElem);
-                    })
-                }
-            });
-        }
-        else {
-            let theQuery = _.cloneDeep(this.currentSearch === "package" ? this.query.query : this.query);
-            theQuery.selectedRepositories = _.pluck(theQuery.selectedRepositories,'repoKey');
-            this.artifactSearchDao.fetch(theQuery).$promise.then((result)=> {
-                this.resultsMsg = result.data.message;
-                this.gridOptions.setGridData(result.data.results);
-                this.results = result.data.results;
-                this.savedToStash = false;
-            });
-        }
-
-        // restore original query model
-        this.query = tempQuery;
-    }
-
-    closeSearchPanel(collapse) {
-
-        this.collapseSearchPanel = collapse;
-    }
-
-    _clearSearchTab() {
-        this.artifactoryEventBus.dispatch(EVENTS.CLEAR_SEARCH);
-    }
-
-    bulkDelete(permanent){
-        let selectedRows = this.gridOptions.api.selection.getSelectedRows();
-        permanent = permanent || this.footerDao.getInfo().trashDisabled;
-        //console.log(selectedRows);
-        // Ask for confirmation before delete and if confirmed then delete bulk of users
-        this.modal.confirm(`Are you sure you want to ${permanent ? ' <span class="highlight-alert">permanently</span> ' : ' '} delete ${selectedRows.length} items?`).then(() =>{this._deleteSingleSelected(selectedRows)});
-    }
-
-    _deleteSingleSelected(rows){
-        //console.log(rows);
-        let elementsToDelete = _.map(rows, (row) => {
-            return {
-                name: row.name,
-                path: this.currentSearch === 'trash'? ((row.originRepository + '/' + row.relativeDirPath).split('[root]').join('') + '/' + row.name).split('//').join('/') : row.relativePath,
-                repoKey: row.repoKey
-            }
-
-        });
-        this.artifactSearchDao.delete({artifacts:elementsToDelete}).$promise.then(() => {
-            // refresh the gridData in any case
-        }).finally(()=>{
-            this._getGridData();
-            this.artifactoryState.setState('refreshTreeNextTime',true);
-        });
-    }
-
-    _deleteSelected(rows, permanent){
-        permanent = permanent || this.footerDao.getInfo().trashDisabled;
-        this.modal.confirm(`Are you sure you wish to ${permanent ? ' <span class="highlight-alert">permanently</span> ' : ' '} delete ${rows[0].name}?`)
-                .then(() => this._deleteSingleSelected(rows));
-    }
-
-    backToBrowse() {
-        this._clearSearchTab();
-        var tree = this.artifactoryState.getState('lastTreeState');
-        if (tree) {
-            this.$state.go(tree.name, tree.params)
-        }
-        else {
-            this.$state.go('artifacts.browsers.path', {tab: 'General', artifact: ''});
-        }
-    }
-
-    showRepoList() {
-        return this.$stateParams.searchType !== 'remote' && this.$stateParams.searchType !== 'trash';
-    }
-
-
-    _buildPayloadForStash() {
-        let searchType = this.$stateParams.searchType;
-        if (searchType === 'checksum') searchType='quick';
-        let selectedRows = this.gridOptions.api.selection.getSelectedRows();
-        let rawResults = selectedRows.length ? selectedRows : this.results;
-
-        rawResults = _.filter(rawResults, (result)=> {
-            return !result.resultType || result.resultType == 'File';
-        });
-
-        let payload = _.map(rawResults, (result)=>{
-            let retObj = {};
-            retObj.type = searchType;
-            retObj.repoKey = result.repoKey;
-
-            if (searchType === 'class') {
-                if (result.archivePath==='[root]') result.archivePath = '';
-                retObj.name = result.name;
-                retObj.archivePath = result.archivePath + result.archiveName;
-            }
-            else {
-                if (result.relativePath==='[root]') result.relativePath = '';
-                retObj.relativePath = result.relativePath;
-            }
-
-            return retObj;
-        });
-
-        return payload;
-    }
-
-    _doStashAction(action) {
-
-        let payload = this._buildPayloadForStash();
-        this.stashResultsDao[action]({name: 'stash'},payload).$promise.then((response)=>{
-            if (action === 'save' && response.status === 200) {
-                this.savedToStash = true;
-                this.duringStashAnimation = false;
-            }
-            this._updateStashStatus();
-        });
-    }
-    saveToStash() {
-        this.showStashBox = true;
-
-
-        /*let distanceRight = $('.repo-list-dropdown').width() + $('.repo-list-dropdown').offset().left - $('.repo-dnd-title').width() - $('.repo-dnd-title').offset().left;
-        $('#stash-animation').css('right', distanceRight);*/
-        let distanceRight = $(document).width() - $('.repo-dnd-title').offset().left - $('.repo-dnd-title').width() - 200;
-        $('#stash-animation').css({
-            'right' : distanceRight,
-            'animation-duration' : $(document).width() / 960
-        });
-
-        this.$timeout(()=>{
-            this.duringStashAnimation = true;
-            $('#stash-container').addClass('animate');
-
-            this.duringStashAnimation = true;
-
-            this._doStashAction('save');
-        });
-
-    }
-
-    addToStash() {
-        this._doStashAction('add');
-    }
-
-    subtractFromStash() {
-        this._doStashAction('subtract');
-    }
-
-    intersectWithStash() {
-        this._doStashAction('intersect');
-    }
-
-    gotoStash() {
-        this._clearSearchTab();
-        this.artifactoryEventBus.dispatch(EVENTS.ACTION_REFRESH_STASH);
-        this.$state.go('artifacts.browsers.path', {browser: 'stash', artifact: '', tab: 'StashInfo'});
-    }
-
-    clearStash() {
-        this.modal.confirm('Are you sure you want to clear stashed results? All items will be removed from stash.','Clear Stashed Results', {confirm: 'Clear'})
-                .then(() => {
-                    this.stashResultsDao.delete({name: 'stash'}).$promise.then((response)=> {
-                        this.artifactoryEventBus.dispatch(EVENTS.ACTION_DISCARD_STASH);
-                        if (response.status === 200) {
-                            this.savedToStash = false;
-                            this._updateStashStatus();
-                            $('#stash-container').removeClass('animate');
-                        }
-                    });
-                });
-    }
-
-    _updateStashStatus() {
-        this.stashResultsDao.get({name:'stash'}).$promise.then((data)=>{
-            this.stashedItemsCount = data.length;
-            this.showStashBox = true;
-            if (data.length === 0) {
-                this.showStashBox = false;
-                this.savedToStash = false;
-            }
-        });
-    }
-
-    hasStashPerms() {
-        return true;//this.user.currentUser.getCanDeploy();
-    }
-
-    getSelectedRecords() {
-        if (!this.gridOptions.multiSelect || !this.gridOptions.api || !this.gridOptions.api.selection) return '';
-
-        let count = this.gridOptions.api.selection.getSelectedRows().length;
-
-        return count;
-    }
-
-    setShowAQL(show) {
-        this.showAQL = show;
-    }
-
-    filterReposLimitByPackageType(packageType) {
-
-        let lastIncluded = this.query.selectedRepositories;// (this.$stateParams.searchParams && this.$stateParams.searchParams.selectedRepos) ? this.$stateParams.searchParams.selectedRepos : [];
-
-        let filterFunc = (repo)=>{
-            let ret;
-            if (packageType.startsWith('docker')) {
-                if (packageType.endsWith('V1')) ret = repo.repoType.toLowerCase() === 'docker' && repo.dockerApiVersion === 'V1';
-                else if (packageType.endsWith('V2')) ret = repo.repoType.toLowerCase() === 'docker' && repo.dockerApiVersion === 'V2';
-            }
-            else if (packageType === 'rpm') {
-                ret = repo.repoType.toLowerCase() === 'yum';
-            }
-            else if (packageType === 'gavc') {
-                ret = repo.repoType.toLowerCase() === 'maven' || repo.repoType.toLowerCase() === 'ivy' || repo.repoType.toLowerCase() === 'sbt' || repo.repoType.toLowerCase() === 'gradle';
-            }
-            else ret = repo.repoType.toLowerCase() === packageType.toLowerCase();
-
-            return ret;
-        };
-
-        this.query.selectedRepositories = _.filter(lastIncluded, filterFunc);;
-
-        this.repoList = _.filter(this.allRepoList,(repo)=>{
-            return filterFunc(repo) && !_.find(lastIncluded,{repoKey: repo.repoKey})
-        });
-    }
-
-
-    _getColumns() {
-
-        switch (this.currentSearch) {
-            case 'package':
-            {
-                return this._getColumnsForPackageSearch(this.packageSearchColumns)
-            }
-            case 'quick':
-            {
-                return [
-                    {
-                        name: "Artifact",
-                        displayName: "Artifact",
-                        field: "name",
-                        sort: {
-                            direction: this.uiGridConstants.ASC
-                        },
-                        cellTemplate: this.commonGridColumns.downloadableColumn('autotest-quick-artifact'),
-                        width: '25%',
-                        customActions: [{
-                            icon: 'icon icon-view',
-                            tooltip: 'View',
-                            callback: row => this.viewCodeArtifact(row),
-                            visibleWhen: row => _.contains(row.actions, 'View')
-                        }],
-                        actions: {
-                            download: {
-                                callback: row => this.downloadSelectedItems(row),
-                                visibleWhen: row => _.contains(row.actions, 'Download')
-                            }
-                        }
-                    },
-                    {
-                        name: "Path",
-                        displayName: "Path",
-                        field: "relativeDirPath",
-                        headerCellTemplate: headerCellGroupingTemplate,
-                        cellTemplate: '<div class="autotest-quick-path ui-grid-cell-contents">{{ row.entity.relativeDirPath}}</div>',
-                        width: '40%',
-                        customActions: [{
-                            icon: 'icon icon-show-in-tree',
-                            tooltip: 'Show In Tree',
-                            callback: row => this.showInTree(row),
-                            visibleWhen: row => _.contains(row.actions, 'ShowInTree')
-                        }]
-                    },
-                      {
-                        name: "Repository",
-                        displayName: "Repository",
-                        field: "repoKey",
-                        headerCellTemplate: headerCellGroupingTemplate,
-                        cellTemplate: '<div class="autotest-quick-repository ui-grid-cell-contents">{{ row.entity.repoKey}}</div>',
-                        width: '15%'
-                    },
-                    {
-                        name: "Modified",
-                        displayName: "Modified",
-                        cellTemplate: '<div class="autotest-quick-modified ui-grid-cell-contents">{{ row.entity.modifiedString }}</div>',
-                        field: "modifiedDate",
-                        width: '20%',
-                        actions: {
-                            delete: {
-                                callback: row => this._deleteSelected([row]),
-                                visibleWhen: row => _.contains(row.actions, 'Delete')
-                            }
-                        }
-                    }
-                ]
-            }
-            case 'class':
-            {
-                return [
-                    {
-                        name: "Name",
-                        displayName: "Name",
-                        field: "name",
-                        sort: {
-                            direction: this.uiGridConstants.ASC
-                        },
-                        width: '30%'
-                    },
-
-                    {
-                        name: "Artifact",
-                        displayName: "Artifact",
-                        field: "archiveName",
-                        headerCellTemplate: headerCellGroupingTemplate,
-                        width: '20%',
-                        customActions: [{
-                            icon: 'icon icon-view',
-                            tooltip: 'View',
-                            callback: row => this.viewCodeArtifact(row),
-                            visibleWhen: row => _.contains(row.actions, 'View')
-                        }],
-                        actions: {
-                            download: {
-                                callback: row => this.downloadSelectedItems(row),
-                                visibleWhen: row => _.contains(row.actions, 'Download')
-                            }
-                        }
-                    },
-                    {
-                        name: "Artifact Path",
-                        displayName: "Artifact Path",
-                        field: "archivePath",
-                        headerCellTemplate: headerCellGroupingTemplate,
-                        width: '25%',
-                        customActions: [{
-                            icon: 'icon icon-show-in-tree',
-                            tooltip: 'Show In Tree',
-                            callback: row => this.showInTree(row),
-                            visibleWhen: row => _.contains(row.actions, 'ShowInTree')
-                        }]
-                    },
-                    {
-                        name: "Repository",
-                        displayName: "Repository",
-                        field: "repoKey",
-                        headerCellTemplate: headerCellGroupingTemplate,
-                        width: '10%'
-                    },
-                    {
-                        name: "Modified",
-                        displayName: "Modified",
-                        cellTemplate: '<div class="ui-grid-cell-contents">{{ row.entity.modifiedString }}</div>',
-                        field: "modifiedDate",
-                        width: '15%',
-                        actions: {
-                            delete: {
-                                callback: row => this._deleteSelected([row]),
-                                visibleWhen: row => _.contains(row.actions, 'Delete')
-                            }
-                        }
-                    }
-                ]
-            }
-            case 'gavc':
-            {
-                return [
-                    {
-                        name: 'Artifact',
-                        displayName: 'Artifact',
-                        field: 'name',
-                        sort: {
-                            direction: this.uiGridConstants.ASC
-                        },
-                        width: '20%',
-                        customActions: [{
-                            icon: 'icon icon-view',
-                            tooltip: 'View',
-                            callback: row => this.viewCodeArtifact(row),
-                            visibleWhen: row => _.contains(row.actions, 'View')
-                        }, {
-                            icon: 'icon icon-show-in-tree',
-                            tooltip: 'Show In Tree',
-                            callback: row => this.showInTree(row),
-                            visibleWhen: row => _.contains(row.actions, 'ShowInTree')
-                        }],
-                        actions: {
-                            download: {
-                                callback: row => this.downloadSelectedItems(row),
-                                visibleWhen: row => _.contains(row.actions, 'Download')
-                            }
-                        }
-                    },
-                    {
-                        name: 'Group ID',
-                        displayName: 'Group ID',
-                        field: 'groupID',
-                        headerCellTemplate: headerCellGroupingTemplate,
-                        width: '15%'
-                    },
-                    {
-                        name: 'Artifact ID',
-                        displayName: 'Artifact ID',
-                        field: 'artifactID',
-                        headerCellTemplate: headerCellGroupingTemplate,
-                        width: '17%'
-                    },
-                    {
-                        name: 'Version',
-                        displayName: 'Version',
-                        field: 'version',
-                        headerCellTemplate: headerCellGroupingTemplate,
-                        width: '13%'
-                    },
-                    {
-                        name: 'Classifier',
-                        displayName: 'Classifier',
-                        field: 'classifier',
-                        headerCellTemplate: headerCellGroupingTemplate,
-                        width: '10%'
-                    },
-                    {
-                        name: 'Repository',
-                        displayName: 'Repository',
-                        field: 'repoKey',
-                        headerCellTemplate: headerCellGroupingTemplate,
-                        width: '10%'
-                    },
-                    {
-                        name: "Modified",
-                        displayName: "Modified",
-                        cellTemplate: '<div class="ui-grid-cell-contents">{{ row.entity.modifiedString }}</div>',
-                        field: "modifiedDate",
-                        width: '15%',
-                        actions: {
-                            delete: {
-                                callback: row => this._deleteSelected([row]),
-                                visibleWhen: row => _.contains(row.actions, 'Delete')
-                            }
-                        }
-                    }
-                ]
-            }
-            case 'property':
-            {
-                return [
-                    {
-                        name: "Item",
-                        displayName: "Item",
-                        field: "name",
-                        sort: {
-                            direction: this.uiGridConstants.ASC
-                        },
-                        width: '25%',
-                        customActions: [{
-                            icon: 'icon icon-view',
-                            tooltip: 'View',
-                            callback: row => this.viewCodeArtifact(row),
-                            visibleWhen: row => _.contains(row.actions, 'View')
-                        }],
-                        actions: {
-                            download: {
-                                callback: row => this.downloadSelectedItems(row),
-                                visibleWhen: row => _.contains(row.actions, 'Download')
-                            }
-                        }
-                    },
-                    {
-                        name: "Type",
-                        displayName: "Type",
-                        field: "resultType",
-                        cellTemplate: '<div class="ui-grid-cell-contents">' +
-                        '<span jf-tooltip="{{ row.entity.resultType }}" class="icon" ng-class="{ \'icon-local-repo\': row.entity.resultType === \'Repository\', \'icon-folder\': row.entity.resultType === \'Directory\', \'icon-general\': row.entity.resultType === \'File\'}"></span></div>',
-                        headerCellTemplate: headerCellGroupingTemplate,
-                        width: '8%'
-                    },
-                    {
-                        name: "Path",
-                        displayName: "Path",
-                        field: "relativeDirPath",
-                        headerCellTemplate: headerCellGroupingTemplate,
-                        width: '37%',
-                        customActions: [{
-                            icon: 'icon icon-show-in-tree',
-                            tooltip: 'Show In Tree',
-                            callback: row => this.showInTree(row),
-                            visibleWhen: row => _.contains(row.actions, 'ShowInTree')
-                        }]
-                    },
-                    {
-                        name: "Repository",
-                        displayName: "Repository",
-                        field: "repoKey",
-                        headerCellTemplate: headerCellGroupingTemplate,
-                        width: '15%'
-                    },
-                    {
-                        name: "Modified",
-                        displayName: "Modified",
-                        cellTemplate: '<div class="ui-grid-cell-contents">{{ row.entity.modifiedString }}</div>',
-                        field: "modifiedDate",
-                        width: '15%',
-                        actions: {
-                            delete: {
-                                callback: row => this._deleteSelected([row]),
-                                visibleWhen: row => _.contains(row.actions, 'Delete')
-                            }
-                        }
-                    }
-                ]
-            }
-            case 'checksum':
-            {
-                return [
-                    {
-                        name: "Artifact",
-                        displayName: "Artifact",
-                        field: "name",
-                        sort: {
-                            direction: this.uiGridConstants.ASC
-                        },
-                        width: '25%',
-                        customActions: [{
-                            icon: 'icon icon-view',
-                            tooltip: 'View',
-                            callback: row => this.viewCodeArtifact(row),
-                            visibleWhen: row => _.contains(row.actions, 'View')
-                        }],
-                        actions: {
-                            download: {
-                                callback: row => this.downloadSelectedItems(row),
-                                visibleWhen: row => _.contains(row.actions, 'Download')
-                            }
-                        }
-                    },
-                    {
-                        name: "Path",
-                        displayName: "Path",
-                        field: "relativeDirPath",
-                        headerCellTemplate: headerCellGroupingTemplate,
-                        width: '45%',
-                        customActions: [{
-                            icon: 'icon icon-show-in-tree',
-                            tooltip: 'Show In Tree',
-                            callback: row => this.showInTree(row),
-                            visibleWhen: row => _.contains(row.actions, 'ShowInTree')
-                        }]
-                    },
-                    {
-                        name: "Repository",
-                        displayName: "Repository",
-                        field: "repoKey",
-                        headerCellTemplate: headerCellGroupingTemplate,
-                        width: '15%'
-                    },
-                    {
-                        name: "Modified",
-                        displayName: "Modified",
-                        cellTemplate: '<div class="ui-grid-cell-contents">{{ row.entity.modifiedString }}</div>',
-                        field: "modifiedDate",
-                        width: '15%',
-                        actions: {
-                            delete: {
-                                callback: row => this._deleteSelected([row]),
-                                visibleWhen: row => _.contains(row.actions, 'Delete')
-                            }
-                        }
-                    }
-                ]
-            }
-            case 'remote':
-            {
-                return [
-                    {
-                        name: "Name",
-                        displayName: "Name",
-                        field: "name",
-                        sort: {
-                            direction: this.uiGridConstants.ASC
-                        },
-                        width: '20%',
-                        actions: {
-                            download: {
-                                callback: row => this.downloadSelectedItems(row),
-                                visibleWhen: row => _.contains(row.actions, 'Download')
-                            }
-                        }
-                    },
-                    {
-                        name: "Path",
-                        displayName: "Path",
-                        field: "path",
-                        customActions: [{
-                            icon: 'icon icon-bintray',
-                            tooltip: 'Show In Bintray',
-                            callback: row => this.showInBintray(row)
-                        }],
-                        width: '30%'
-                    },
-                    {
-                        name: "Package",
-                        displayName: "Package",
-                        field: "package",
-                        width: '25%'
-                    },
-                    {
-                        name: "Released",
-                        displayName: "Released",
-                        field: "release",
-                        width: '15%'
-                    },
-                    {
-                        name: "Cached",
-                        displayName: "Cached",
-                        field: "cached",
-                        cellTemplate: this.commonGridColumns.booleanColumn('MODEL_COL_FIELD'),
-                        width: '10%'
-                    }
-                ]
-            }
-            case 'trash':
-            {
-                return [
-                    {
-                        name: "Artifact",
-                        displayName: "Artifact",
-                        field: "name",
-                        sort: {
-                            direction: this.uiGridConstants.ASC
-                        },
-                        cellTemplate: this.commonGridColumns.downloadableColumn('autotest-trash-artifact'),
-                        width: '25%',
-                        customActions: [
-                            {
-                                icon: 'icon icon-view',
-                                tooltip: 'View',
-                                callback: row => this.viewCodeArtifact(row),
-                                visibleWhen: row => _.contains(row.actions, 'View')
-                            },
-                            {
-                                icon: 'icon icon-trashcan-restore',
-                                tooltip: 'Restore To Original Path',
-                                callback: row => this.restoreTrashItem(row),
-                                visibleWhen: row => _.contains(row.actions, 'Restore')
-                            }
-                        ],
-                        actions: {
-                            download: {
-                                callback: row => this.downloadSelectedItems(row),
-                                visibleWhen: row => _.contains(row.actions, 'Download')
-                            }
-                        }
-                    },
-                    {
-                        name: "Original Path",
-                        displayName: "Original Path",
-                        field: "relativeDirPath",
-                        headerCellTemplate: headerCellGroupingTemplate,
-                        cellTemplate: '<div class="autotest-trash-origin-path ui-grid-cell-contents">{{ row.entity.relativeDirPath}}</div>',
-                        width: '40%',
-                        customActions: [{
-                            icon: 'icon icon-show-in-tree',
-                            tooltip: 'Show In Tree',
-                            callback: row => this.showInTree(row),
-                            visibleWhen: row => _.contains(row.actions, 'ShowInTree')
-                        }]
-                    },
-                    {
-                        name: "Original Repository",
-                        displayName: "Original Repository",
-                        field: "originRepository",
-                        headerCellTemplate: headerCellGroupingTemplate,
-                        cellTemplate: '<div class="autotest-trash-origin-repository ui-grid-cell-contents">{{ row.entity.originRepository}}</div>',
-                        width: '15%'
-                    },
-                    {
-                        name: "Deleted Time",
-                        displayName: "Deleted Time",
-                        cellTemplate: '<div class="autotest-trash-deleted ui-grid-cell-contents">{{ row.entity.deletedTimeString }}</div>',
-                        field: "deletedTime",
-                        width: '20%',
-                        customActions: [
-                            {
-                                icon: 'icon icon-clear',
-                                tooltip: 'Delete Permanently',
-                                callback: row => this._deleteSelected([row],true),
-                                visibleWhen: row => _.contains(row.actions, 'Delete'),
-                            }
-                        ]
-                    }
-                ]
-            }
-
-        }
-    }
-
-    _createPackageSearchColumnsObject() {
-        this.packageSearchColumnsObject = {
-            artifact: {
-                name: "Artifact",
-                displayName: "Artifact",
-                field: "name",
-                sort: {
-                    direction: this.uiGridConstants.ASC
-                },
-                cellTemplate: this.commonGridColumns.downloadableColumn(),
-                width: '25%',
-                customActions: [{
-                    icon: 'icon icon-view',
-                    tooltip: 'View',
-                    callback: row => this.viewCodeArtifact(row),
-                    visibleWhen: row => _.contains(row.actions, 'View')
-                }],
-                actions: {
-                    download: {
-                        callback: row => this.downloadSelectedItems(row),
-                        visibleWhen: row => _.contains(row.actions, 'Download')
-                    }
-                }
-            },
-            path: {
-                name: "Path",
-                displayName: "Path",
-                field: "relativePath",
-                headerCellTemplate: headerCellGroupingTemplate,
-                width: '40%',
-                customActions: [{
-                    icon: 'icon icon-show-in-tree',
-                    tooltip: 'Show In Tree',
-                    callback: row => this.showInTree(row),
-                    visibleWhen: row => _.contains(row.actions, 'ShowInTree')
-                }]
-            },
-            repo: {
-                name: "Repository",
-                displayName: "Repository",
-                field: "repoKey",
-                headerCellTemplate: headerCellGroupingTemplate,
-                width: '15%'
-            },
-            modified: {
-                name: "Modified",
-                displayName: "Modified",
-                cellTemplate: '<div class="ui-grid-cell-contents">{{ row.entity.modifiedString }}</div>',
-                field: "modifiedDate",
-                width: '20%',
-                actions: {
-                    delete: {
-                        callback: row => this._deleteSelected([row]),
-                        visibleWhen: row => _.contains(row.actions, 'Delete')
-                    }
-                }
-            },
-            groupID: {
-                name: 'Group ID',
-                displayName: 'Group ID',
-                field: 'groupID',
-                headerCellTemplate: headerCellGroupingTemplate,
-                width: '18%'
-            },
-            artifactID: {
-                name: 'Artifact ID',
-                displayName: 'Artifact ID',
-                field: 'artifactID',
-                headerCellTemplate: headerCellGroupingTemplate,
-                width: '18%'
-            },
-            version: {
-                name: 'Version',
-                displayName: 'Version',
-                field: 'version',
-                headerCellTemplate: headerCellGroupingTemplate,
-                width: '18%'
-            },
-            classifier: {
-                name: 'Classifier',
-                displayName: 'Classifier',
-                field: 'classifier',
-                headerCellTemplate: headerCellGroupingTemplate,
-                width: '18%'
-            }
-        }
-
-    }
-
-    _getColumnsForPackageSearch(columns) {
-        let columnsArray = [];
-        columns.forEach((column)=>{
-            if (!_.contains(column,'*')) {
-                columnsArray.push(_.clone(this.packageSearchColumnsObject[column]));
-            }
-            else {
-                let groupable = false;
-                let width;
-                if (_.contains(column,'@')) {
-                    column = column.split('@').join('');
-                    groupable = true;
-                }
-                if (_.contains(column,'!')) {
-                    let splitted = column.split('!');
-                    column = splitted[0];
-                    width = splitted[1];
-                }
-
-                let splitted = column.split('*');
-                let field = splitted[0];
-                let name = splitted[1];
-                columnsArray.push({
-                    name: name,
-                    displayName: name,
-                    field: 'extraField_'+field,
-                    width: width || '18%',
-                    headerCellTemplate: groupable ? headerCellGroupingTemplate : undefined
-
-                });
-            }
-        });
-
-        this._normalizeGridColumnWidths(columnsArray);
-
-        if (!columnsArray[0].actions) columnsArray[0].actions = {};
-        if (!columnsArray[0].actions.download) {
-            columnsArray[0].actions.download =  {
-                callback: row => this.downloadSelectedItems(row),
-                visibleWhen: row => _.contains(row.actions, 'Download')
-            }
-        }
-
-        //If no path field add 'show in tree' action to first column
-        if(_.findIndex(columnsArray, 'name', 'Path') < 0) {
-            if (!columnsArray[0].customActions) columnsArray[0].customActions = [];
-            columnsArray[0].customActions = [{
-                icon: 'icon icon-show-in-tree',
-                tooltip: 'Show In Tree',
-                callback: row => this.showInTree(row),
-                visibleWhen: row => _.contains(row.actions, 'ShowInTree')
-            }]
-        }
-
-        return columnsArray;
-    }
-
-    _normalizeGridColumnWidths(columnsArray) {
-        let totalWidth = 0;
-        for (let key in columnsArray) {
-            let obj = columnsArray[key];
-            totalWidth += parseInt(obj.width);
-        }
-        let scale = 100/totalWidth;
-        for (let key in columnsArray) {
-            let obj = columnsArray[key];
-            let origWidth = parseInt(obj.width);
-            obj.width = (origWidth*scale) + '%';
-        }
-
-    }
-
-    _handleExplicitWildCard(q) {
-
-        let getNewVal = (oldVal) => {
-            if (!oldVal) return oldVal;
-
-            oldVal = oldVal.trim();
-            let newVal;
-            if (oldVal.startsWith('"') && oldVal.endsWith('"')) {
-                newVal = oldVal.substr(1,oldVal.length-2);
-            }
-            else if (!oldVal.endsWith('*')){
-                newVal = oldVal + '*';
-            }
-            else {
-                newVal = oldVal;
-            }
-
-            return newVal;
-        };
-
-
-        switch(q.search) {
-            case "quick":
-                q.query = getNewVal(q.query);
-                break;
-            case "class":
-                q.name = getNewVal(q.name);
-                q.path = getNewVal(q.path);
-                break;
-            case "property":
-                q.properties.forEach((prop) => {
-                    prop.key = getNewVal(prop.key);
-                    let newVals = [];
-                    prop.values.forEach((val) => {
-                        newVals.push(getNewVal(val));
-                    })
-                    prop.values = newVals;
-                });
-                break;
-            default:
-                if (this.currentSearch === 'package') {
-                    if (q.query.search === 'gavc') {
-                        q.query.artifactID = getNewVal(q.query.artifactID);
-                        q.query.classifier = getNewVal(q.query.classifier);
-                        q.query.groupID = getNewVal(q.query.groupID);
-                        q.query.version = getNewVal(q.query.version);
-                    }
-                    else { //standard package search, not gavc
-                        q.query.forEach((cond) => {
-                            let newVals = [];
-                            cond.values.forEach((val) => {
-                                newVals.push(getNewVal(val));
-                            })
-                            cond.values = newVals;
-                        });
-                    }
-                }
-        }
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/search/search.html b/web/angular-web/src/main/webapp/app/states/artifacts/search/search.html
deleted file mode 100644
index 5018218..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/search/search.html
+++ /dev/null
@@ -1,127 +0,0 @@
-<div class="search-panel-container" jf-disable-ng-animate>
-    <div collapse="Search.collapseSearchPanel">
-        <div class="search-panel" ng-style="Search.collapseStyle()">
-            <div class="pull-right back-to-browse">
-                <a href=""
-                   ng-click="Search.backToBrowse()"><span class="back-link-icon">‹</span>Back To Browse
-                </a>
-            </div>
-            <form>
-                <div ng-switch="Search.currentSearch">
-                    <div ng-switch-when="quick">
-                        <jf-quick query="Search.query"></jf-quick>
-                    </div>
-                    <div ng-switch-when="class">
-                        <jf-class query="Search.query"></jf-class>
-                    </div>
-                    <div ng-switch-when="package">
-                        <jf-package query="Search.query" parent-controller="Search"></jf-package>
-                    </div>
-                    <div ng-switch-when="property">
-                        <jf-property query="Search.query"></jf-property>
-                    </div>
-                    <div ng-switch-when="checksum">
-                        <jf-checksum query="Search.query"></jf-checksum>
-                    </div>
-                    <div ng-switch-when="remote">
-                        <jf-remote query="Search.query"></jf-remote>
-                    </div>
-                    <div ng-switch-when="trash" ng-if="Search.user.currentUser.isAdmin()">
-                        <jf-trash query="Search.query"></jf-trash>
-                    </div>
-                </div>
-
-                <div ng-if="Search.aql">
-                    <div id="show-aql-button" style="display:none">
-                        <button class="btn btn-small" jf-tooltip="Show AQL Query"
-                                ng-click="Search.setShowAQL(true)"
-                                ng-if="!Search.showAQL"><i class="icon iconrepo iconrepo-aql"></i></button>
-                        <button class="btn btn-small" jf-tooltip="Hide AQL Query"
-                                ng-click="Search.setShowAQL(false)"
-                                ng-if="Search.showAQL"><i class="icon iconrepo iconrepo-aql"></i></button>
-                    </div>
-                    <div collapse="!Search.showAQL" class="no-margin-top" id="aql-viewer">
-                        <jf-clip-copy text-to-copy="Search.aql"
-                                      class="code-mirror-copy"
-                                      object-name="Query"></jf-clip-copy>
-                        <jf-code-mirror ng-if="Search.showAQL"
-                                        mime-type="json"
-                                        mode="aql"
-                                        model="Search.aql"
-                                        height="275px">
-                        </jf-code-mirror>
-                        <jf-code-mirror ng-if="!Search.showAQL"
-                                        mime-type="json"
-                                        mode="aql"
-                                        model="Search.aql"
-                                        height="275px">
-                        </jf-code-mirror>
-                    </div>
-                </div>
-
-                <div class="clearfix"></div>
-                <div class="repo-list-dropdown"
-                     ng-if="Search.showRepoList()">
-                    <div ng-click="Search.openRepoList()"
-                         class="repo-dnd-title">
-                        <span class="icon icon-search"></span>
-                        <span ng-if="!Search.query.selectedRepositories.length">Limit to Specific Repositories</span>
-                        <span ng-if="Search.query.selectedRepositories.length==1">Searching 1 Repository</span>
-                        <span ng-if="Search.query.selectedRepositories.length>1">Searching {{Search.query.selectedRepositories.length}} Repositories</span>
-                    </div>
-                </div>
-                <div class="form-group" collapse="Search.isOpenRepoList">
-                    <div class="form-group-cell double">
-                        <jf-drag-drop
-                                ng-if="Search.repoList"
-                                exclude-list="Search.repoList"
-                                include-list="Search.query.selectedRepositories"
-                                objects-name="Repositories"
-                                include-display-field="repoKey"
-                                exclude-display-field="repoKey"
-                                headers="{leftTitle:'Available Repositories', rightTitle:'Selected Repositories'}">
-                        </jf-drag-drop>
-                    </div>
-                </div>
-            </form>
-
-            <div id="stash-container" ng-if="Search.hasStashPerms() && (Search.currentSearch !== 'remote' && Search.currentSearch !== 'trash')">
-                <i id="stash-animation" class="icon icon-copy"></i>
-                <div id="stash-menu" ng-if="Search.stashedItemsCount">
-                    <div id="calc-actions">
-                        <div><span class="icon-stash-add"
-                                   ng-click="Search.addToStash()"
-                                   jf-tooltip="Add"></span></div>
-                        <div><span class="icon-stash-subtract"
-                                   ng-click="Search.subtractFromStash()"
-                                   jf-tooltip="Subtract"></span></div>
-                        <div><span class="icon-stash-intersect"
-                                   ng-click="Search.intersectWithStash()"
-                                   jf-tooltip="Intersect"></span></div>
-                    </div>
-                    <div id="general-actions">
-                        <a ng-click="Search.gotoStash()"><i class="icon icon-show-in-tree"></i>View</a>
-                        <a ng-click="Search.clearStash()"><i class="icon icon-clear"></i>Clear</a>
-                    </div>
-                </div>
-                <div id="stash-box" ng-if="Search.showStashBox">
-                    <span ng-class="{'icon-stash-stash-empty': Search.stashedItemsCount === 0, 'icon-stash-stash-full': Search.stashedItemsCount}"></span>
-                    <br>{{Search.stashedItemsCount}} Items
-                </div>
-            </div>
-            <div class="search-results-title">
-                {{Search.resultsMsg}} <span ng-if="Search.getSelectedRecords()"> ({{Search.getSelectedRecords()}} Selected)</span>
-                <span ng-if="Search.gridOptions.data.length && !Search.gridOptions.data[0]._emptyRow && Search.hasStashPerms() && Search.stashedItemsCount === 0 && Search.currentSearch !== 'remote' && Search.currentSearch !== 'trash' && !Search.duringStashAnimation">
-                    <span>|</span><a href="" id="stash-results-button" ng-click="Search.saveToStash()">Stash Results</a><jf-help-tooltip html="Search.TOOLTIP.stash"></jf-help-tooltip>
-                </span>
-            </div>
-
-
-            <jf-grid
-                    grid-options="Search.gridOptions"
-                    filter-field="name"
-                    no-count>
-            </jf-grid>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/services/common_grid_columns.js b/web/angular-web/src/main/webapp/app/states/artifacts/services/common_grid_columns.js
deleted file mode 100644
index d98454f..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/services/common_grid_columns.js
+++ /dev/null
@@ -1,44 +0,0 @@
-export function commonGridColumns() {
-    let nextId = 0;
-    return {
-        repoPathColumn: function(specialClass) {
-            return '<div ng-if="row.entity.repoKey" class="ui-grid-cell-contents '+specialClass+'">{{row.entity.repoKey}}/{{row.entity.path}}</div>' +
-                    '<div ng-if="!row.entity.repoKey" class="ui-grid-cell-contents '+specialClass+'">{{row.entity.path}}</div>';
-        },
-
-        downloadableColumn: function(specialClass) {
-            return '<div ng-if="row.entity.downloadLink"" class="ui-grid-cell-contents '+specialClass+'">{{row.entity.name}}</div>' +
-                    '<div ng-if="!row.entity.downloadLink" class="ui-grid-cell-contents '+specialClass+'">{{row.entity.name}}</div>';
-        },
-
-        booleanColumn: function(model) {
-            return '<div class="grid-checkbox"><input ng-model="' +
-                    model + '" type="checkbox" disabled/><span class="icon icon-v"></span></div>';
-        },
-        checkboxColumn: function(model, click, disabled) {
-            return '<div ng-if="!row.entity._emptyRow" class="grid-cell-checkbox"><jf-checkbox><input ng-model="' + model + '"' +
-                    (click && click.length ? ' ng-click="' + click + '"' : '') +
-                    (disabled && disabled.length ? ' ng-disabled="' + disabled + '"' : '') +
-                    ' type="checkbox"/></jf-checkbox></div>';
-        },
-        listableColumn: function(listModel,rowNameModel,displayModel,alwaysShow,testIdPrefix=null) {
-
-            testIdPrefix = testIdPrefix ? testIdPrefix + '-' : '';
-
-            displayModel = displayModel ? `{{${listModel}.length}} | {{${displayModel}}}` : `{{${listModel}.length}} | {{${listModel}.join(\', \')}}`;
-
-            let id = `${testIdPrefix}{{row.uid}}_${nextId}`;
-
-            let alwaysShowClass = alwaysShow ? 'always-show' : '';
-
-            let template =  `<div ng-if="${listModel}.length" class="ui-grid-cell-contents no-tooltip ${alwaysShowClass}" id="${id}"><span class="gridcell-content-text">${displayModel}</span><a class="gridcell-showall" ng-if="grid.options.isOverflowing('${testIdPrefix}'+row.uid+'_'+${nextId}) || ${alwaysShow}" href ng-click="grid.options.showAll(${listModel},${rowNameModel},col)"> (See All)</a></div>
-                             <div ng-if="!${listModel}.length" class="ui-grid-cell-contents no-tooltip" id="${id}">-</div>`;
-
-            nextId++;
-            return template;
-        },
-        iconColumn: function(cellText, cellIcon, iconClass) {
-            return '<div class="ui-grid-cell-contents"><i class="icon icon-{{' + cellIcon + '}}' + (iconClass ? ' ' + iconClass : '') + '"></i>{{' + cellText + '}}</div>';
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/services/select_delete_versions.js b/web/angular-web/src/main/webapp/app/states/artifacts/services/select_delete_versions.js
deleted file mode 100644
index 0bdd4fa..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/services/select_delete_versions.js
+++ /dev/null
@@ -1,60 +0,0 @@
-'use strict';
-/**
- * launch a modal that prompts the user to select a target repo & path to do move / copy
- *
- * @param action:String - either 'copy' or 'move'
- * @returns promise - resolved with Object({targetRepoKey: String, targetPath: String}) if the user confirmed, rejected otherwise
- */
-export function selectDeleteVersionsFactory(ArtifactActionsDao, $rootScope, ArtifactoryModal, ArtifactoryGridFactory) {
-    return function selectDeleteVersions(node) {
-        let modalInstance;
-        let modalScope = $rootScope.$new();
-        modalScope.noData = false;
-
-        // Grid
-        modalScope.versionsGridOptions = ArtifactoryGridFactory
-                .getGridInstance(modalScope)
-                .setColumns(
-                [
-                    {
-                        name: 'Group ID',
-                        displayName: 'Group ID',
-                        field: 'groupId'
-                    },
-                    {
-                        name: 'Version',
-                        displayName: 'Version',
-                        field: 'version'
-                    },
-                    {
-                        name: 'Directories Count',
-                        displayName: 'Directories Count',
-                        field: 'directoriesCount'
-                    }
-                ])
-                .setRowTemplate('default')
-                .setMultiSelect();
-
-        ArtifactActionsDao.getDeleteVersions({repoKey: node.data.repoKey, path: node.data.path})
-                .$promise.then((versions) => {
-                    modalScope.versions = versions.data.versions;
-                    modalScope.versionsGridOptions.setGridData(versions.data.versions);
-                    if (versions.data.versions.length == 0) {
-                        modalScope.noData = true;
-                    }
-                });
-
-        // Scope functions
-        modalScope.selectedVersions = () => {
-            return (modalScope.versions && modalScope.versionsGridOptions.api) && modalScope.versionsGridOptions.api.selection.getSelectedRows() || [];
-        };
-
-        modalScope.close = (version) => {
-            modalInstance.close(version);
-        };
-
-        // Launch modal
-        modalInstance = ArtifactoryModal.launchModal('select_delete_versions', modalScope);
-        return modalInstance.result;
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/states/artifacts/services/select_target_path.js b/web/angular-web/src/main/webapp/app/states/artifacts/services/select_target_path.js
deleted file mode 100644
index 69db6d4..0000000
--- a/web/angular-web/src/main/webapp/app/states/artifacts/services/select_target_path.js
+++ /dev/null
@@ -1,101 +0,0 @@
-import TOOLTIPS from '../../../constants/artifact_tooltip.constant';
-
-'use strict';
-/**
- * launch a modal that prompts the user to select a target repo & path to do move / copy
- *
- * @param action:String - either 'copy' or 'move'
- * @returns promise - resolved with Object({targetRepoKey: String, targetPath: String}) if the user confirmed, rejected otherwise
- */
-export function selectTargetPathFactory(ArtifactActionsDao, $q, $rootScope, ArtifactoryModal, RepoDataDao) {
-    return function selectTargetPath(action, node, useNodePath, customDryRun, defaultValues) {
-
-        if (useNodePath === undefined) useNodePath = true;
-
-        let deferred = $q.defer();
-        let modalInstance;
-
-        // init modal scope
-        let modalScope = $rootScope.$new();
-        modalScope.action = action;
-        modalScope.node = node;
-        modalScope.target = {
-            repoList: [],
-            repoKey: defaultValues ? defaultValues.targetRepoKey : '',
-            path: useNodePath ? angular.copy(node.data.path) : (defaultValues ? defaultValues.targetPath : '/'),
-            isCustomPath: false
-        };
-        modalScope.tooltips = TOOLTIPS.selectTargetPathModal;
-
-        // get local repo list that match the original's repo pkg type
-        let isMavinish = (pkgType) => {
-            return _.contains(['maven','ivy','gradle','sbt'],pkgType.toLowerCase());
-        };
-        RepoDataDao.get({user: true}).$promise.then((result)=> {
-            if (node.data.getRoot && node.data.getRoot().repoPkgType && action !== "restore") {
-                result.repoTypesList = _.filter(result.repoTypesList,(repo)=>{
-                    return repo.repoType === node.data.getRoot().repoPkgType || repo.repoType === 'Generic' || (isMavinish(repo.repoType) && isMavinish(node.data.getRoot().repoPkgType));
-                });
-            }
-            else {
-
-            }
-            modalScope.target.repoList = result.repoTypesList.map(repo => {return {value: repo.repoKey, text: repo.repoKey}});
-        });
-
-        if (action === "restore") modalScope.noDryRun = true;
-
-        // scope functions for modal
-        modalScope.cancel = () => {
-            modalInstance.close();
-            deferred.reject();
-        };
-        modalScope.confirm = () => {
-            deferred.resolve({
-                target: {
-                    targetRepoKey: modalScope.target.repoKey,
-                    targetPath: modalScope.getTargetPath()
-                },
-                onSuccess: ()=>{
-                    modalInstance.close();
-                    deferred = $q.defer();
-                    deferred.resolve();
-                    return deferred.promise;
-                },
-                onFail: (msg)=>{
-                    modalScope.resultError = true;
-                    modalScope.dryRunResults = msg;
-                    deferred = $q.defer();
-                    return deferred.promise;
-                }
-            });
-        };
-        modalScope.getTargetPath = () => {
-            return modalScope.target.isCustomPath && modalScope.target.path || modalScope.target.path
-        };
-        modalScope.dryRun = customDryRun || (() => {
-            var data = {
-                repoKey: node.data.repoKey,
-                path: node.data.path,
-                targetRepoKey: modalScope.target.repoKey,
-                targetPath: modalScope.getTargetPath(),
-                dryRun: true
-            };
-            var params = {action: action};
-            ArtifactActionsDao.dryRun(params, data).$promise
-                    .then((response) => {
-                        modalScope.resultError = false;
-                        modalScope.dryRunResults = [response.info];
-                    }).catch((response) => {
-                        modalScope.resultError = true;
-                        modalScope.dryRunResults = response.data.errors;
-                    });
-        });
-
-        if (customDryRun) customDryRun.scope = modalScope;
-
-        // Launch modal
-        modalInstance = ArtifactoryModal.launchModal('select_target_path', modalScope, 'sm');
-        return deferred.promise;
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/base/base.controller.js b/web/angular-web/src/main/webapp/app/states/base/base.controller.js
deleted file mode 100644
index 9bb9836..0000000
--- a/web/angular-web/src/main/webapp/app/states/base/base.controller.js
+++ /dev/null
@@ -1,6 +0,0 @@
-export class BaseController {
-    constructor(FooterDao) {
-        // Ensure page is not displayed before we get the footer data
-        FooterDao.get().then(footerData => this.footerData = footerData);
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/base/base.module.js b/web/angular-web/src/main/webapp/app/states/base/base.module.js
deleted file mode 100644
index f71e433..0000000
--- a/web/angular-web/src/main/webapp/app/states/base/base.module.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import {BaseController} from './base.controller';
-
-function baseConfig($stateProvider) {
-	$stateProvider
-		// Base state for all application states
-        .state('app-layout', {
-            url: '',
-            abstract: true,
-            templateUrl: 'layouts/application.html',
-            controller: 'BaseController as Base'
-        })
-		// Base state for all login related states (login, forgot password, etc.)
-        .state('login-layout', {
-            url: '',
-            abstract: true,
-            templateUrl: 'layouts/login.html'
-        })
-
-}
-
-export default angular.module('base.module', [])
-		.config(baseConfig)
-        .controller('BaseController', BaseController)
diff --git a/web/angular-web/src/main/webapp/app/states/builds/all_builds.controller.js b/web/angular-web/src/main/webapp/app/states/builds/all_builds.controller.js
deleted file mode 100644
index 11483af..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/all_builds.controller.js
+++ /dev/null
@@ -1,151 +0,0 @@
-import EVENTS from '../../constants/artifacts_events.constants';
-
-export class AllBuildsController {
-    constructor($scope, $q, $timeout, ArtifactoryGridFactory, BuildsDao, ArtifactoryEventBus, ArtifactoryModal,
-            ArtifactoryNotifications, uiGridConstants, User) {
-
-        this.$scope = $scope;
-        this.uiGridConstants = uiGridConstants;
-        this.user = User.getCurrent();
-        this.$timeout = $timeout;
-        this.$q = $q;
-        this.allBuildsGridOptions = {};
-        this.buildsDao = BuildsDao;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this.modal = ArtifactoryModal;
-        this._createGrid();
-        this._getBuildsData();
-        this.firstFetch = true;
-
-        this.updateBreadcrumbs();
-    }
-
-    updateBreadcrumbs() {
-        this.artifactoryEventBus.dispatch(EVENTS.BUILDS_BREADCRUMBS, name);
-    }
-
-    deleteBuild(row) {
-        let json ={
-            buildsCoordinates:[
-                {
-                    buildName:row.buildName
-                }
-            ]
-        }
-        this.modal.confirm("Are you sure you wish to delete all the builds '" + row.buildName + "'?")
-            .then(() => {
-                this.buildsDao.deleteAll(json).$promise.then(() => {
-                    this._getBuildsData();
-                });
-            })
-    }
-
-    bulkDelete() {
-        let selectedRows = this.allBuildsGridOptions.api.selection.getSelectedRows();
-        let confirmMessage = 'Are you sure you wish to delete ' + selectedRows.length;
-        confirmMessage += selectedRows.length > 1 ? ' build projects?' : ' build project?';
-
-        this.modal.confirm(confirmMessage)
-            .then(() => {
-                    let buildsToDelete = selectedRows.map(build => {
-                        return {
-                            buildName:build.buildName
-                        }
-                    });
-                    //console.log(buildsToDelete);
-                    let json = {
-                        buildsCoordinates:buildsToDelete
-                    }
-                    this.buildsDao.deleteAll(json).$promise.then(() => {
-                        this._getBuildsData();
-                    });
-                    //this.artifactoryNotifications.create({info: 'Builds deleted'})
-            });
-    }
-
-    _getBuildsData(pagination) {
-
-        let defaultPagination = {
-            pageNum: 1,
-            numOfRows: 25,
-            direction: "asc",
-            orderBy: "lastBuildTime"
-        };
-        this.buildsDao.get(defaultPagination).$promise.then((data) => {
-
-            this.allBuildsGridOptions.setGridData(data.pagingData);
-        });
-    }
-
-    _createGrid() {
-
-        this.allBuildsGridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-            .setColumns(this._getColumns())
-                .setRowTemplate('default')
-                .setMultiSelect()
-                .setButtons(this._getActions())
-                .setBatchActions(this._getBatchActions());
-
-    }
-
-    _getColumns() {
-
-        let nameCellTemplate = '<div ng-click="grid.appScope.AllBuilds.updateBreadcrumbs()" ' +
-            'class="ui-grid-cell-contents"><a href="" id="project-name" ui-sref="builds.history({buildName:row.entity.buildName})" >{{row.entity.buildName}}</a></div>';
-        let numberCellTemplate = '<div ng-click="grid.appScope.AllBuilds.updateBreadcrumbs()" ' +
-                'class="ui-grid-cell-contents"><a href="" id="last-build-id" ui-sref="builds.info({buildName:row.entity.buildName,buildNumber:row.entity.buildNumber,startTime:row.entity.time})" >{{row.entity.buildNumber}}</a></div>';
-        let timeCellTemplate = '<div class="ui-grid-cell-contents" id="last-build-time">  {{row.entity.lastBuildTime }}</a>';
-
-        return [
-            {
-                name: "Project Name",
-                displayName: "Project Name",
-                field: "buildName",
-                cellTemplate: nameCellTemplate,
-                width: '60%'
-            },
-            {
-                name: "Last Build ID",
-                displayName: "Last Build ID",
-                field: "buildNumber",
-                cellTemplate: numberCellTemplate,
-                width: '20%'
-            },
-            {
-                name: "Last Build Time",
-                displayName: "Last Build Time",
-                cellTemplate: timeCellTemplate,
-                field: "time",
-                sort: {
-                    direction: this.uiGridConstants.DESC
-                },
-                type: 'number',
-                width: '20%'
-            }
-        ]
-    }
-
-    _getActions() {
-        return [
-            {
-                icon: 'icon icon-clear',
-                tooltip: 'Delete',
-                callback: row => this.deleteBuild(row),
-                visibleWhen: () => this.user.isAdmin()
-            }
-        ];
-    }
-
-    _getBatchActions() {
-        return [
-            {
-                icon: 'clear',
-                name: 'Delete',
-                callback: () => this.bulkDelete(),
-                visibleWhen: () => this.user.isAdmin()
-            }
-        ]
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/states/builds/all_builds.html b/web/angular-web/src/main/webapp/app/states/builds/all_builds.html
deleted file mode 100644
index ee3147c..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/all_builds.html
+++ /dev/null
@@ -1,8 +0,0 @@
-<div class="card-side-pad">
-    <jf-grid grid-options="AllBuilds.allBuildsGridOptions"
-             filter-field="buildName"
-             filter-on-change="true"
-             object-name="build"
-             auto-focus="true">
-    </jf-grid>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds.html b/web/angular-web/src/main/webapp/app/states/builds/builds.html
deleted file mode 100644
index 7cf2dad..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<div class="content-layout-container with-head-bar" id="jf-builds">
-
-    <jf-breadcrumb></jf-breadcrumb>
-
-    <h1>Build Browser</h1>
-
-    <div class="content-wrapper">
-        <div class="card stretch">
-            <ui-view></ui-view>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds.module.js b/web/angular-web/src/main/webapp/app/states/builds/builds.module.js
deleted file mode 100644
index 326f12d..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds.module.js
+++ /dev/null
@@ -1,42 +0,0 @@
-import {AllBuildsController} from './all_builds.controller';
-import {BuildsInfoController} from './builds_info/builds_info.controller';
-import {BuildsHistoryController} from './builds_history/builds_history.controller';
-import {BuildsLocateController} from './builds_locate/builds_locate.controller';
-import buildTabs          from './builds_info/build_tabs/build_tabs.module';
-
-function buildsConfig($stateProvider) {
-    $stateProvider
-            .state('builds', {
-                url: '/builds',
-                parent: 'app-layout',
-                abstract: true,
-                templateUrl: 'states/builds/builds.html'
-            })
-            .state('builds.all', {
-                url: '/',
-                templateUrl: 'states/builds/all_builds.html',
-                controller: 'AllBuildsController as AllBuilds'
-            })
-            .state('builds.history', {
-                url: '/{buildName}',
-                templateUrl: 'states/builds/builds_history/builds_history.html',
-                controller: 'BuildsHistoryController as BuildsHistory'
-            })
-            .state('builds.locate', {
-                url: '/{buildName}/{buildNumber}',
-                templateUrl: 'states/builds/builds_locate/builds_locate.html',
-                controller: 'BuildsLocateController as BuildsLocate'
-            })
-            .state('builds.info', {
-                url: '/{buildName}/{buildNumber}/{startTime}/{tab}/{moduleID}',
-                templateUrl: 'states/builds/builds_info/builds_info.html',
-                controller: 'BuildsInfoController as BuildsInfo'
-            })
-}
-
-export default angular.module('builds', ['buildTabs'])
-        .config(buildsConfig)
-        .controller('AllBuildsController', AllBuildsController)
-        .controller('BuildsInfoController', BuildsInfoController)
-        .controller('BuildsHistoryController', BuildsHistoryController)
-        .controller('BuildsLocateController', BuildsLocateController)
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds_history/builds_history.controller.js b/web/angular-web/src/main/webapp/app/states/builds/builds_history/builds_history.controller.js
deleted file mode 100644
index dbec1f5..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds_history/builds_history.controller.js
+++ /dev/null
@@ -1,180 +0,0 @@
-import EVENTS from '../../../constants/artifacts_events.constants';
-let headerCellGroupingTemplate = require("raw!../../../ui_components/artifactory_grid/templates/headerCellTemplate.html");
-
-export class BuildsHistoryController {
-    constructor($scope, $q, $timeout, $stateParams, ArtifactoryGridFactory, BuildsDao, ArtifactoryEventBus, ArtifactoryModal,
-            ArtifactoryNotifications, uiGridConstants, User) {
-        this.$stateParams = $stateParams;
-        this.$scope = $scope;
-        this.uiGridConstants = uiGridConstants;
-        this.user = User.getCurrent();
-        this.$timeout = $timeout;
-        this.$q = $q;
-        this.buildsHistoryGridOption = {};
-        this.buildTitle='History for Build  \''+this.$stateParams.buildName+'\'';
-        this.totalBuilds='';
-        this.buildsDao = BuildsDao;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this.modal = ArtifactoryModal;
-        this.firstFetch = true;
-
-        this.artifactoryEventBus.dispatch(EVENTS.BUILDS_BREADCRUMBS);
-
-
-        this._createGrid();
-        this._getBuildsData();
-    }
-
-    deleteBuild(row) {
-        let json ={
-            buildsCoordinates:[
-                {
-                    buildName:this.$stateParams.buildName,
-                    buildNumber:row.buildNumber,
-                    date:row.time
-                }
-            ]
-        }
-        this.modal.confirm("Are you sure you wish to delete the build '"+this.$stateParams.buildName+"' #"+row.buildNumber+"?")
-                .then(() => {
-                    this.buildsDao.delete(json).$promise.then(() => {
-                        this._getBuildsData();
-                    });
-                })
-    }
-
-    bulkDelete() {
-        let selectedRows = this.buildsHistoryGridOption.api.selection.getSelectedRows();
-        let confirmMessage = 'Are you sure you wish to delete ' + selectedRows.length;
-        confirmMessage += selectedRows.length > 1 ? ' builds?' : ' build?';
-
-        this.modal.confirm(confirmMessage)
-                .then(() => {
-                    let buildsToDelete = selectedRows.map(build => {
-                        return {
-                            buildName:this.$stateParams.buildName,
-                            buildNumber:build.buildNumber,
-                            date:build.time
-                        }
-                    });
-                    //console.log(buildsToDelete);
-                    let json = {
-                        buildsCoordinates:buildsToDelete
-                    }
-                    this.buildsDao.delete(json).$promise.then(() => {
-                        this._getBuildsData();
-                    });
-                });
-    }
-
-    _getBuildsData(pagination) {
-        if (pagination) {
-            if (this.firstFetch) {
-                this.firstFetch = false;
-                pagination.orderBy = 'buildNumber';
-                pagination.direction =  'asc';
-            }
-            return this.buildsDao.getData(pagination, {
-                action: 'history',
-                name: this.$stateParams.buildName
-            }).$promise;
-        }
-        else {
-            let defaultPagination = {
-                pageNum: 1,
-                numOfRows: 25,
-                direction: "asc",
-                orderBy: "buildNumber"
-            };
-
-            this.buildsDao.getData(defaultPagination, {
-                action: 'history',
-                name: this.$stateParams.buildName
-            })
-            .$promise.then((data) => {
-                this.buildsHistoryGridOption.setGridData(data.pagingData);
-            });
-        }
-    }
-
-    _createGrid() {
-        this.buildsHistoryGridOption = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setColumns(this._getColumns())
-                .setRowTemplate('default')
-            //            .setExternalPagination((pagination) => this._getBuildsData(pagination))
-                .setMultiSelect()
-                .setButtons(this._getActions())
-                .setBatchActions(this._getBatchActions());
-
-    }
-
-    _getColumns() {
-
-        return [
-            {
-                name: "Build ID",
-                displayName: "Build ID",
-                field: "buildNumber",
-                cellTemplate: '<div class="ui-grid-cell-contents"><a href="" ng-click="grid.appScope.BuildsHistory.onClick(row.entity.build_number)" ui-sref="builds.info({buildName:grid.appScope.BuildsHistory.$stateParams.buildName,buildNumber:row.entity.buildNumber,startTime:row.entity.time,tab:\'general\'})" id="build-id">{{row.entity.buildNumber}}</a></div>',
-                width: '40%'
-            },
-            {
-                name: "CI Server",
-                displayName: "CI Server",
-                field: 'ciUrl',
-                cellTemplate: '<div class="ui-grid-cell-contents"><a href="{{row.entity.ciUrl}}" target="_blank" id="ci-server">{{row.entity.ciUrl}}</a></div>',
-                width: '30%'
-            },
-            {
-                name: "Status",
-                displayName: "Status",
-                field: "releaseStatus",
-                cellTemplate: '<div class="ui-grid-cell-contents" id="status">{{row.entity.releaseStatus}}</div>',
-                headerCellTemplate: headerCellGroupingTemplate,
-                width: '10%'
-            },
-            {
-                name: "Build Time",
-                displayName: "Build Time",
-                cellTemplate: '<div class="ui-grid-cell-contents" id="build-time">{{row.entity.lastBuildTime}}</div>',
-                field: "time",
-                sort: {
-                    direction: this.uiGridConstants.DESC
-                },
-                type: 'number',
-                width: '20%'
-            }
-
-        ]
-    }
-
-
-    onClick(name) {
-        this.artifactoryEventBus.dispatch(EVENTS.BUILDS_BREADCRUMBS, name);
-    }
-
-    _getActions() {
-        return [
-            {
-                icon: 'icon icon-clear',
-                tooltip: 'Delete',
-                callback: row => this.deleteBuild(row),
-                visibleWhen: () => this.user.isAdmin()
-            }
-
-        ];
-    }
-
-    _getBatchActions() {
-        return [
-            {
-                icon: 'clear',
-                name: 'Delete',
-                callback: () => this.bulkDelete(),
-                visibleWhen: () => this.user.isAdmin()
-            }
-        ]
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds_history/builds_history.html b/web/angular-web/src/main/webapp/app/states/builds/builds_history/builds_history.html
deleted file mode 100644
index 7e09850..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds_history/builds_history.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<div class="card-side-pad">
-    <h2>{{ BuildsHistory.buildTitle }}</h2>
-
-    <jf-grid grid-options="BuildsHistory.buildsHistoryGridOption"
-             filter-field="buildNumber"
-             filter-on-change="true"
-             object-name="build"
-             auto-focus="true">
-    </jf-grid>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/build_tabs.module.js b/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/build_tabs.module.js
deleted file mode 100644
index 13b9718..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/build_tabs.module.js
+++ /dev/null
@@ -1,22 +0,0 @@
-import {jfGeneralInfo}                    from './jf_general_info';
-import {jfPublishedModules}                    from './jf_published_modules';
-import {jfBuildInfoJson}                    from './jf_build_info_json';
-import {jfEnvironment}                    from './jf_environment';
-import {jfIssues}                    from './jf_issues';
-import {jfDiff}                    from './jf_diff';
-import {jfReleaseHistory}                    from './jf_release_history';
-import {jfLicenses}                    from './jf_licenses';
-import {jfBuildsGovernance}                    from './jf_builds_governance';
-
-export default angular.module('buildTabs', [])
-        .directive({
-            'jfGeneralInfo': jfGeneralInfo,
-            'jfPublishedModules': jfPublishedModules,
-            'jfBuildInfoJson': jfBuildInfoJson,
-            'jfEnvironment': jfEnvironment,
-            'jfIssues': jfIssues,
-            'jfDiff': jfDiff,
-            'jfReleaseHistory': jfReleaseHistory,
-            'jfLicenses': jfLicenses,
-            'jfBuildsGovernance': jfBuildsGovernance
-    });
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_build_info_json.html b/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_build_info_json.html
deleted file mode 100644
index d39feb8..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_build_info_json.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<jf-panel jf-panel-heading="Build Info JSON">
-
-    <jf-clip-copy text-to-copy="jfBuildInfoJson.json"
-                  class="code-mirror-copy pull-right"
-                  object-name="JSON"></jf-clip-copy>
-
-    <jf-code-mirror mime-type="application/json"
-                    model="jfBuildInfoJson.json"
-                    height="500px">
-    </jf-code-mirror>
-</jf-panel>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_build_info_json.js b/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_build_info_json.js
deleted file mode 100644
index 250c7f0..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_build_info_json.js
+++ /dev/null
@@ -1,40 +0,0 @@
-class jfBuildInfoJsonController {
-    constructor($stateParams, BuildsDao) {
-        this.$stateParams = $stateParams;
-        this.json = '';
-        this.buildsDao = BuildsDao;
-
-
-        this._getJson();
-
-    }
-
-
-    _getJson() {
-
-        this.buildsDao.getData({
-            name: this.$stateParams.buildName,
-            number: this.$stateParams.buildNumber,
-            time: this.$stateParams.startTime,
-            action: 'buildJson'
-        }).$promise.then((data) => {
-            this.json = data.fileContent;
-        })
-    }
-
-}
-
-
-
-
-export function jfBuildInfoJson() {
-    return {
-        restrict: 'EA',
-        controller: jfBuildInfoJsonController,
-        controllerAs: 'jfBuildInfoJson',
-        scope: {
-        },
-        bindToController: true,
-        templateUrl: 'states/builds/builds_info/build_tabs/jf_build_info_json.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_builds_governance.html b/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_builds_governance.html
deleted file mode 100644
index b511f4e..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_builds_governance.html
+++ /dev/null
@@ -1,83 +0,0 @@
-<div class="governance-tab container-fluid" ng-if="jfBuildsGovernance.gotData">
-
-    <jf-panel jf-panel-heading="Code Center Application" ng-if="jfBuildsGovernance.hasAppInfo()">
-        <table class="jf-data-table">
-            <tr ng-repeat="(key,value) in jfBuildsGovernance.codeCenterApp" ng-if="jfBuildsGovernance.DICTIONARY[key]">
-                <td>{{jfBuildsGovernance.DICTIONARY[key]}}:</td>
-                <td>
-                    <span ng-if="key!=='name'">{{value}}</span>
-                    <a ng-if="key==='name'" ng-href="{{jfBuildsGovernance.codeCenterApp['link']}}" target="_blank">{{value}}</a>
-                </td>
-            </tr>
-        </table>
-    </jf-panel>
-
-    <jf-panel jf-panel-heading="Includes">
-        <div class="form-group form-checkbox">
-            <div class="form-group-cell">
-                <jf-checkbox class="display-block" text="Include Published Artifacts">
-                    <input id="includePublished"
-                           type="checkbox"
-                           ng-model="jfBuildsGovernance.includePublished"
-                           name="includePublished">
-                </jf-checkbox>
-            </div></div>
-        <div class="form-group no-margin-bottom">
-            <div class="form-group-cell">
-                <jf-checkbox class="display-block" text="Include dependencies of the following scopes:">
-                    <input id="includeByScopes"
-                           type="checkbox"
-                           ng-model="jfBuildsGovernance.includeByScopes"
-                           ng-click="jfBuildsGovernance.onIncludeByScopes()"
-                           name="includeByScopes">
-                </jf-checkbox>
-            </div>
-        </div>
-        <div class="form-group no-margin-bottom">
-            <div class="form-group-cell double">
-                <div class="scopes-options">
-                    <jf-checkbox ng-repeat="(key,value) in jfBuildsGovernance.scopesOptions"
-                                 text="{{key}}">
-                        <input id="{{key}}"
-                               type="checkbox"
-                               ng-model="jfBuildsGovernance.scopesOptions[key]"
-                               ng-disabled="!jfBuildsGovernance.includeByScopes"
-                               ng-click="jfBuildsGovernance.onScopeOptionChange()"
-                               name="{{key}}">
-                    </jf-checkbox>
-                </div>
-            </div>
-        </div>
-    </jf-panel>
-
-    <jf-panel jf-panel-heading="Components">
-        <div class="general-summary governance-summary">
-            <i class="icon"
-               ng-class="{'icon-notif-success': jfBuildsGovernance.componentsSummary.ok,'icon-notif-warning': !jfBuildsGovernance.componentsSummary.ok}"></i>
-            <span ng-class="{'summary-ok': jfBuildsGovernance.componentsSummary.ok,'summary-warn': !jfBuildsGovernance.componentsSummary.ok}">Summary:</span>
-                    <span ng-repeat="(key,val) in jfBuildsGovernance.componentsSummary">
-                        {{key}}:
-                        <span ng-class="{'status-pending': key==='Pending','status-approved': key==='Approved'}"> {{val}}
-                        </span>
-                    </span>
-        </div>
-        <div class="clearfix"></div>
-        <jf-grid grid-options="jfBuildsGovernance.componentsGridOptions"></jf-grid>
-    </jf-panel>
-
-    <jf-panel jf-panel-heading="Vulnerabilities">
-        <div class="general-summary governance-summary">
-            <i class="icon"
-               ng-class="{'icon-notif-success': jfBuildsGovernance.vulnerabilitiesSummary.ok,'icon-notif-warning': !jfBuildsGovernance.vulnerabilitiesSummary.ok}"></i>
-            <span ng-class="{'summary-ok': jfBuildsGovernance.vulnerabilitiesSummary.ok,'summary-warn': !jfBuildsGovernance.vulnerabilitiesSummary.ok}">Summary:</span>
-            <span ng-repeat="(key,val) in jfBuildsGovernance.vulnerabilitiesSummary">
-                {{key}}: {{val}}
-            </span>
-        </div>
-        <div class="clearfix"></div>
-        <jf-grid grid-options="jfBuildsGovernance.vulnerabilitiesGridOptions"></jf-grid>
-    </jf-panel>
-</div>
-<div class="alert alert-warning" ng-if="!jfBuildsGovernance.gotData && jfBuildsGovernance.noData">
-    Governance integration is not enabled. Check the configuration on the Admin section to enable.
-</div>
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_builds_governance.js b/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_builds_governance.js
deleted file mode 100644
index e8cdfac..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_builds_governance.js
+++ /dev/null
@@ -1,317 +0,0 @@
-import DICTIONARY from './../../constants/builds.constants';
-
-let headerCellGroupingTemplate = require("raw!../../../../ui_components/artifactory_grid/templates/headerCellTemplate.html");
-
-class jfBuildsGovernanceController {
-    constructor($scope, $state, $stateParams, $window, uiGridConstants, BuildsDao, ArtifactoryGridFactory,
-            ArtifactoryNotifications, ArtifactoryStorage) {
-        this.$scope = $scope;
-        this.$state = $state;
-        this.$stateParams = $stateParams;
-        this.$window = $window;
-        this.uiGridConstants = uiGridConstants;
-        this.buildsDao = BuildsDao;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this.artifactoryStorage = ArtifactoryStorage;
-        this.DICTIONARY = DICTIONARY.governance.codeCenterApp;
-        this.componentsGridOptions = {};
-        this.vulnerabilitiesGridOptions = {};
-        this.extendedGridOptions = {};
-
-        this.allData = {};
-        this.gotData = false;
-        this.noData = true;
-        this.filteredData = {};
-        this.vulnerabilitiesData = [];
-        this.includePublished = true;
-        this.scopesOptions = {};
-        this.scopesOptionsCopy = {};
-
-        this._createGrids();
-
-        this._getGovernanceData();
-
-    }
-
-    showInTree(row) {
-        let browser = this.artifactoryStorage.getItem('BROWSER') || 'tree';
-        if (browser === 'stash') browser = 'tree';
-        let path = row.repoKey + '/' + row.path;
-        this.$state.go('artifacts.browsers.path', {
-            tab: "General",
-            artifact: path,
-            browser: browser
-        });
-    }
-
-    showRequest(row) {
-        this.$window.open(row.requestLink, "_blank", "");
-    }
-
-    updateRequest(row) {
-
-        let objToSend = {
-            name: this.$stateParams.buildName,
-            number: this.$stateParams.buildNumber,
-            time: this.$stateParams.startTime,
-            components: [row]
-        };
-
-        this.buildsDao.updateGovernanceRequest(objToSend).$promise.then((data)=> {
-            //console.log(data);
-        });
-
-    }
-
-
-    onIncludeByScopes() {
-        if (this.includeByScopes) {
-            angular.copy(this.scopesOptionsCopy, this.scopesOptions);
-        }
-        else {
-            angular.copy(this.scopesOptions, this.scopesOptionsCopy);
-            for (let key in this.scopesOptions) {
-                this.scopesOptions[key] = true;
-            }
-        }
-        this._filterData();
-
-    }
-
-    onScopeOptionChange() {
-        this._filterData();
-    }
-
-    _filterData() {
-
-        this.vulnerabilitiesData = [];
-
-        let relevantData = this.allData.components;
-
-        if (this.includePublished) {
-            relevantData = relevantData.concat(this.allData.publishedArtifacts);
-        }
-
-        if (this.includeByScopes) {
-            this.filteredData = _.filter(relevantData, (component) => {
-                {
-                    let ret = false;
-                    if (component.scopes.length) {
-                        for (let key in this.scopesOptions) {
-                            if (this.scopesOptions[key] && (component.scopes.indexOf(key) !== -1)) {
-                                ret = true;
-                                break;
-                            }
-                        }
-                    }
-                    else {
-                        ret = true;
-                    }
-                    return ret;
-                }
-            });
-        }
-        else {
-            this.filteredData = relevantData;
-        }
-
-        for (let index in this.filteredData) {
-            let vulnerabilities = this.filteredData[index].vulnerabilities;
-            if (vulnerabilities.length) {
-                vulnerabilities = _.map(vulnerabilities, (v)=> {
-                    v.artifactId = this.filteredData[index].componentId;
-                    return v;
-                });
-                this.vulnerabilitiesData = this.vulnerabilitiesData.concat(vulnerabilities);
-            }
-        }
-
-        this.componentsGridOptions.setGridData(this.filteredData);
-
-        this.vulnerabilitiesGridOptions.setGridData(this.vulnerabilitiesData);
-
-        this.componentsSummary = this._getSummaries(this.filteredData, 'status');
-        this.vulnerabilitiesSummary = this._getSummaries(this.vulnerabilitiesData, 'severity');
-    }
-
-
-    _getGovernanceData() {
-        this.buildsDao.getData({
-            name: this.$stateParams.buildName,
-            number: this.$stateParams.buildNumber,
-            time: this.$stateParams.startTime,
-            action: 'buildGovernance'
-        }).$promise.then((data) => {
-//                    console.log(data);
-
-                    this.gotData = true;
-                    if (data.feedbackMsg && data.feedbackMsg.warn) {
-                        this.artifactoryNotifications.create({error: data.feedbackMsg.warn});
-                    }
-
-                    _.map(data.scopes, (scope)=> {
-                        this.scopesOptions[scope] = true;
-                    });
-                    angular.copy(this.scopesOptions, this.scopesOptionsCopy);
-                    this.allData = data;
-
-                    this._filterData();
-
-                    this.codeCenterApp = data.applicationInfo;
-
-                }).catch((err)=> {
-                    console.log('err',err);
-                    this.noData = true;
-                    if (err.data && err.data.error) {
-                        this.artifactoryNotifications.create({error: err.data.error});
-                    }
-                });
-
-
-    }
-
-    _getSummaries(data, field) {
-        let sums = {'Total': 0};
-        for (let i in data) {
-            let record = data[i];
-            if (sums[record[field]]) {
-                sums[record[field]]++;
-            }
-            else {
-                sums[record[field]] = 1;
-            }
-            sums['Total']++;
-        }
-        return sums;
-    }
-
-    _createGrids() {
-        this.componentsGridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setColumns(this._getComponentsColumns())
-                .setRowTemplate('default')
-        this.vulnerabilitiesGridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setColumns(this._getVulnerabilitiesColumns())
-                .setRowTemplate('default')
-    }
-
-    _getComponentsColumns() {
-
-        let idCellTemplate = '<div ng-if="row.entity.status !== \'Stale\'" class="ui-grid-cell-contents"><a href="" class="no-cm-action" ng-click="grid.appScope.jfBuildsGovernance.showRequest(row.entity)">{{row.entity.componentName}}</a></div>' +
-            '<div ng-if="row.entity.status === \'Stale\'" class="ui-grid-cell-contents"><a href="" class="no-cm-action" ng-click="grid.appScope.jfBuildsGovernance.showRequest(row.entity)">{{row.entity.componentName}}</a> <span class="not-in-build">(Not in build)<span></span></div>';
-
-        let scopesCellTemplate = '<div class="ui-grid-cell-contents">{{row.entity.scopes.join(", ")}}</div>';
-        let statusCellTemplate = '<div class="ui-grid-cell-contents"' +
-                'ng-class="{\'status-pending\': row.entity.status===\'Pending\',' +
-                '\'status-approved\': row.entity.status===\'Approved\'}"' +
-                '>{{row.entity.status}}</div>';
-
-        return [
-            {
-                displayName: "Artifact ID",
-                field: "componentName",
-                width: '20%',
-                cellTemplate: idCellTemplate,
-                customActions: [{
-                    icon: 'icon icon-blackduck',
-                    tooltip: 'Go To Blackduck',
-                    callback: row => this.showRequest(row),
-                    visibleWhen: row => _.contains(row.actions, 'ShowRequest')
-                }]
-            },
-            {
-                name: "Licenses",
-                field: "license",
-                headerCellTemplate: headerCellGroupingTemplate,
-                grouped: true,
-                width: '15%'
-            },
-            {
-                name: "Status",
-                field: "status",
-                cellTemplate: statusCellTemplate,
-                headerCellTemplate: headerCellGroupingTemplate,
-                sort: {direction: this.uiGridConstants.ASC},
-                grouped: true,
-                width: '10%'
-            },
-            {
-                name: "Scopes",
-                field: "scopes",
-                cellTemplate: scopesCellTemplate,
-                headerCellTemplate: headerCellGroupingTemplate,
-                grouped: true,
-                width: '15%'
-            },
-            {
-                name: "Repo Path",
-                field: "path",
-                width: '40%',
-                customActions: [
-                    {
-                        icon: 'icon icon-show-in-tree',
-                        tooltip: 'Show In Tree',
-                        callback: row => this.showInTree(row),
-                        visibleWhen: row => _.contains(row.actions, 'ShowInTree') && row.repoKey != ""
-                    }, {
-                        icon: 'icon icon-refresh',
-                        tooltip: 'Update Request',
-                        callback: row => this.updateRequest(row),
-                        visibleWhen: row => _.contains(row.actions, 'UpdateRequest')
-                    }
-                ]
-            }
-        ];
-    }
-
-    _getVulnerabilitiesColumns() {
-
-        let vulnerabilityCellTemplate = '<div class="ui-grid-cell-contents"><a target="_blank" ng-href="{{row.entity.link}}">{{row.entity.name}}</a></div>';
-
-        return [
-            {
-                displayName: "Artifact ID",
-                field: "artifactId",
-                headerCellTemplate: headerCellGroupingTemplate,
-                sort: {direction: this.uiGridConstants.ASC},
-                grouped: true,
-                width: '25%'
-            },
-            {
-                name: "Vulnerability",
-                cellTemplate: vulnerabilityCellTemplate,
-                field: "name",
-                width: '10%'
-            },
-            {
-                name: "Severity",
-                field: "severity",
-                headerCellTemplate: headerCellGroupingTemplate,
-                grouped: true,
-                width: '10%'
-            },
-            {
-                name: "Description",
-                field: "description",
-                width: '55%'
-            }
-        ];
-    }
-
-    hasAppInfo() {
-        return this.codeCenterApp && Object.keys(this.codeCenterApp).length > 0;
-    }
-}
-
-
-export function jfBuildsGovernance() {
-    return {
-
-        restrict: 'EA',
-        controller: jfBuildsGovernanceController,
-        controllerAs: 'jfBuildsGovernance',
-        scope: {},
-        bindToController: true,
-        templateUrl: 'states/builds/builds_info/build_tabs/jf_builds_governance.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_diff.html b/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_diff.html
deleted file mode 100644
index c9ebbfa..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_diff.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<div class="builds-diff">
-    <div class="form-group">
-        <div class="form-group-cell">
-            <label>Select A Build To Compare Against:</label>
-            <ui-select jf-disable-ng-animate ng-model="jfDiff.selectedBuildNumber"
-                       ng-change="jfDiff.getDiffData()">
-                <ui-select-match>
-                    {{$select.selected.buildNumber}}
-                </ui-select-match>
-                <ui-select-choices repeat="data in jfDiff.comparableBuildNumbers">
-                    <div ng-bind-html="data.buildNumber | highlight: $select.search"></div>
-                </ui-select-choices>
-            </ui-select>
-        </div>
-    </div>
-    <div class="form-group">
-        <div class="form-group-cell">
-            <jf-checkbox text="Exclude Internal Dependencies">
-                <input id="excludeInternalDeps"
-                       type="checkbox"
-                       ng-model="jfDiff.excludeInternalDeps"
-                       name="excludeInternalDeps">
-            </jf-checkbox>
-        </div>
-    </div>
-
-    <div ng-if="jfDiff.selectedBuildNumber">
-        <jf-panel jf-panel-heading="Artifacts ({{jfDiff.artifactsLength}} Results)">
-            <jf-grid grid-options="jfDiff.artifactsGridOptions" filter-field="name" no-count></jf-grid>
-        </jf-panel>
-
-        <jf-panel jf-panel-heading="Dependencies ({{jfDiff.dependenciesLength}} Results)">
-            <jf-grid grid-options="jfDiff.dependenciesGridOptions" filter-field="name" no-count></jf-grid>
-        </jf-panel>
-
-        <jf-panel jf-panel-heading="Environment Variables ({{jfDiff.variablesLength}} Results)">
-            <jf-grid grid-options="jfDiff.envVarsGridOptions" filter-field="key" no-count></jf-grid>
-        </jf-panel>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_diff.js b/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_diff.js
deleted file mode 100644
index c399c9c..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_diff.js
+++ /dev/null
@@ -1,277 +0,0 @@
-let headerCellGroupingTemplate = require("raw!../../../../ui_components/artifactory_grid/templates/headerCellTemplate.html");
-let headerCellDefaultTemplate = require("raw!../../../../ui_components/artifactory_grid/templates/headerCellDefaultTemplate.html");
-import EVENTS     from '../../../../constants/artifacts_events.constants';
-class jfDiffController {
-    constructor($scope, $stateParams, $state, $window, BuildsDao, ArtifactoryGridFactory, uiGridConstants,
-            commonGridColumns, ArtifactoryEventBus, artifactoryDownload, ArtifactActionsDao, ArtifactoryStorage) {
-        this.$stateParams = $stateParams;
-        this.$scope = $scope;
-        this.$window = $window;
-        this.$state = $state;
-        this.uiGridConstants = uiGridConstants;
-        this.commonGridColumns = commonGridColumns;
-        this.artifactoryStorage = ArtifactoryStorage;
-        this.artifactActionsDao = ArtifactActionsDao;
-        this.buildsDao = BuildsDao;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.artifactsGridOptions = {};
-        this.dependenciesGridOptions = {};
-        this.envVarsGridOptions = {};
-        this.download = artifactoryDownload;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-
-
-        this.comparableBuildNumbers = [];
-
-        this.selectedBuildNumber = '';
-        this.excludeInternalDeps = false;
-
-        this._createGrids();
-
-        this._getComparableBuildNumbers();
-
-    }
-
-    _getCellTemplate(field) {
-        return '<div class="ui-grid-cell-contents status-{{(row.entity.status).toLowerCase()}}">{{row.entity.' + field + '}}</div>';
-    }
-
-    _addCellTemplates(colDef) {
-        for (let i = 0; i < colDef.length; i++) {
-            let col = colDef[i];
-            if (!col.cellTemplate) {
-                col.cellTemplate = this._getCellTemplate(col.field);
-            }
-        }
-        return colDef;
-    }
-
-    _getComparableBuildNumbers() {
-
-        this.buildsDao.getDataArray({
-            name: this.$stateParams.buildName,
-            number: this.$stateParams.buildNumber,
-            time: this.$stateParams.startTime,
-            action: 'prevBuild'
-        }).$promise.then((data) => {
-                    data = _.sortBy(data, (r)=>-r.buildNumber);
-                    this.comparableBuildNumbers = data;
-                    //            this.comparableBuildNumbers.unshift({buildNumber:''});
-                })
-
-    }
-
-    getDiffData() {
-        if (this.selectedBuildNumber.buildNumber) {
-            this.buildsDao.getData({
-                name: this.$stateParams.buildName,
-                number: this.$stateParams.buildNumber,
-                time: this.$stateParams.startTime,
-                action: 'buildDiff',
-                otherNumber: this.selectedBuildNumber.buildNumber,
-                otherDate: this.selectedBuildNumber.time,
-                exDep: this.excludeInternalDeps
-            }).$promise.then((data) => {
-                        if (data) {
-                            this.variablesLength = data.props.length ? data.props.length : 0;
-                            this.dependenciesLength = data.dependencies.length ? data.dependencies.length : 0;
-                            this.artifactsLength = data.artifacts.length ? data.artifacts.length : 0;
-
-                            if (data.artifacts) {
-                                this.artifactsGridOptions.setGridData(data.artifacts || []);
-                            }
-                            if (data.dependencies) {
-                                this.dependenciesGridOptions.setGridData(data.dependencies || []);
-                            }
-                            if (data.props) {
-                                this.envVarsGridOptions.setGridData(data.props || []);
-                            }
-                        }
-                    });
-        }
-    }
-
-    showInTree(row) {
-        let browser = this.artifactoryStorage.getItem('BROWSER') || 'tree';
-        if (browser === 'stash') browser = 'tree';
-        let artifactPath = row.repoKey + "/" + (row.path);
-        let archivePath = '';
-        this.$state.go('artifacts.browsers.path', {
-            "tab": "General",
-            "browser": browser,
-            "artifact": artifactPath
-        });
-        this.artifactoryEventBus.dispatch(EVENTS.TREE_NODE_OPEN, artifactPath);
-    }
-
-
-    downloadArtifact(row) {
-        this.download(row.downloadLink);
-    }
-
-    _createGrids() {
-
-        this.artifactsGridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setColumns(this._getArtifactsColumns())
-                .setRowTemplate('default');
-        this.dependenciesGridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setColumns(this._getDependenciesColumns())
-                .setRowTemplate('default');
-        this.envVarsGridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setColumns(this._getEnvVarsColumns())
-                .setRowTemplate('default');
-
-    }
-
-    _getArtifactsColumns() {
-
-        return this._addCellTemplates([
-            {
-                name: "Name (Current Build)",
-                field: "name",
-                cellTemplate: this.commonGridColumns.downloadableColumn('status-{{(row.entity.status).toLowerCase()}}'),
-                width: '20%',
-                actions: {
-                    download: {
-                        callback: row => this.downloadArtifact(row),
-                        visibleWhen: row => _.findWhere(row.actions, {name: "Download"})
-                    }
-                }
-            },
-            {
-                name: "Name",
-                field: "prevName",
-                headerCellTemplate: headerCellDefaultTemplate.replace('{{ col.displayName CUSTOM_FILTERS }}','Name (Build #{{grid.appScope.jfDiff.selectedBuildNumber.buildNumber}})'),
-                width: '20%'
-            },
-            {
-                name: "Status",
-                field: "status",
-                headerCellTemplate: headerCellGroupingTemplate,
-                sort: {direction: this.uiGridConstants.DESC},
-                grouped: true,
-                width: '10%'
-            },
-            {
-                name: "Module",
-                field: "moduleName",
-                headerCellTemplate: headerCellGroupingTemplate,
-                grouped: true,
-                width: '20%'
-            },
-            {
-                name: "Repo path",
-                field: "downloadLink",
-                cellTemplate: this.commonGridColumns.repoPathColumn('status-{{(row.entity.status).toLowerCase()}}'),
-                width: '30%',
-                customActions: [{
-                    icon: 'icon icon-show-in-tree',
-                    tooltip: 'Show In Tree',
-                    callback: row => this.showInTree(row),
-                    visibleWhen: row => _.findWhere(row.actions, {name: "ShowInTree"})
-                }]
-            }
-        ]);
-    }
-
-    _getDependenciesColumns() {
-        return this._addCellTemplates([
-            {
-                name: "Dependency ID (Current Build)",
-                displayName: "Dependency ID (Current Build)",
-                field: "name",
-                cellTemplate: this.commonGridColumns.downloadableColumn('status-{{(row.entity.status).toLowerCase()}}'),
-                width: '20%',
-                actions: {
-                    download: {
-                        callback: row => this.downloadArtifact(row),
-                        visibleWhen: row => _.findWhere(row.actions, {name: "Download"})
-                    }
-                }
-            },
-            {
-                name: "Id",
-                field: "prevName",
-                headerCellTemplate: headerCellDefaultTemplate.replace('{{ col.displayName CUSTOM_FILTERS }}','Id (Build #{{grid.appScope.jfDiff.selectedBuildNumber.buildNumber}})'),
-                width: '20%'
-            },
-            {
-                name: "Status",
-                field: "status",
-                headerCellTemplate: headerCellGroupingTemplate,
-                sort: {direction: this.uiGridConstants.DESC},
-                grouped: true,
-                width: '10%'
-            },
-            {
-                name: "Module",
-                field: "moduleName",
-                headerCellTemplate: headerCellGroupingTemplate,
-                grouped: true,
-                width: '20%'
-            },
-            {
-                name: "Repo path",
-                field: "downloadLink",
-                cellTemplate: this.commonGridColumns.repoPathColumn('status-{{(row.entity.status).toLowerCase()}}'),
-                width: '30%',
-                customActions: [{
-                    icon: 'icon icon-show-in-tree',
-                    tooltip: 'Show In Tree',
-                    callback: row => this.showInTree(row),
-                    visibleWhen: row => _.findWhere(row.actions, {name: "ShowInTree"})
-                }]
-            }
-        ])
-    }
-
-    _getEnvVarsColumns() {
-        return this._addCellTemplates([
-            {
-                name: "Current Key",
-                field: 'key',
-                cellTemplate: '<div class="ui-grid-cell-contents status-{{(row.entity.status).toLowerCase()}}">{{row.entity.key}}</div>',
-                width: '20%'
-            },
-            {
-                name: "Current Value",
-                field: 'value',
-                cellTemplate: '<div class="ui-grid-cell-contents status-{{(row.entity.status).toLowerCase()}}">{{row.entity.value}}</div>',
-                width: '20%'
-            },
-            {
-                name: "Prev Key",
-                field: 'prevKey',
-                cellTemplate: '<div class="ui-grid-cell-contents status-{{(row.entity.status).toLowerCase()}}">{{row.entity.prevKey}}</div>',
-                headerCellTemplate: headerCellDefaultTemplate.replace('{{ col.displayName CUSTOM_FILTERS }}','Build#{{grid.appScope.jfDiff.selectedBuildNumber.buildNumber}} Key'),
-                width: '20%'
-            },
-            {
-                name: "Prev Value",
-                field: 'prevValue',
-                cellTemplate: '<div class="ui-grid-cell-contents status-{{(row.entity.status).toLowerCase()}}">{{row.entity.prevValue}}</div>',
-                headerCellTemplate: headerCellDefaultTemplate.replace('{{ col.displayName CUSTOM_FILTERS }}','Build#{{grid.appScope.jfDiff.selectedBuildNumber.buildNumber}} Value'),
-                width: '20%'
-            },
-            {
-                name: "Status",
-                field: "status",
-                sort: {direction: this.uiGridConstants.DESC},
-                headerCellTemplate: headerCellGroupingTemplate,
-                grouped: true,
-                width: '20%'
-            }
-        ])
-    }
-}
-
-export function jfDiff() {
-    return {
-        restrict: 'EA',
-        controller: jfDiffController,
-        controllerAs: 'jfDiff',
-        scope: {},
-        bindToController: true,
-        templateUrl: 'states/builds/builds_info/build_tabs/jf_diff.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_environment.html b/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_environment.html
deleted file mode 100644
index 40ae2fe..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_environment.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<jf-panel jf-panel-heading="Environment Variables">
-    <jf-grid grid-options="jfEnvironment.environmentGridOptions"
-             filter-field="key"
-             object-name="Variable"></jf-grid>
-</jf-panel>
-
-<jf-panel jf-panel-heading="System Variables">
-    <jf-grid grid-options="jfEnvironment.systemGridOptions"
-             filter-field="key"
-             object-name="Variable"></jf-grid>
-</jf-panel>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_environment.js b/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_environment.js
deleted file mode 100644
index 3dcf225..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_environment.js
+++ /dev/null
@@ -1,95 +0,0 @@
-import DICTIONARY from './../../constants/builds.constants';
-
-class jfEnvironmentController {
-    constructor($scope, BuildsDao, ArtifactoryGridFactory, $stateParams, uiGridConstants) {
-        this.$scope = $scope;
-        this.$stateParams = $stateParams;
-        this.buildsDao = BuildsDao;
-        this.uiGridConstants = uiGridConstants;
-        this.environmentGridOptions = {};
-        this.systemGridOptions = {};
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.DICTIONARY = DICTIONARY.generalInfo;
-        this._getEnvironmentData();
-        this._createGrids();
-    }
-
-    _getEnvironmentData() {
-        this._getEnvVars();
-        this._getSysVars();
-    }
-
-    _getEnvVars() {
-        return this.buildsDao.getData({
-//            name: this.$stateParams.buildName,
-            number: this.$stateParams.buildNumber,
-            time: this.$stateParams.startTime,
-            action: 'buildProps',
-            subAction: 'env',
-            orderBy: 'key',
-            numOfRows: 25,
-            pageNum: 1,
-            direction: 'asc'
-        }).$promise.then((data) => {
-                if (data.pagingData) this.environmentGridOptions.setGridData(data.pagingData);
-            });
-    }
-
-    _getSysVars() {
-        return this.buildsDao.getData({
-//            name: this.$stateParams.buildName,
-            number: this.$stateParams.buildNumber,
-            time: this.$stateParams.startTime,
-            action: 'buildProps',
-            subAction: 'system',
-            orderBy: 'key',
-            numOfRows: 25,
-            pageNum: 1,
-            direction: 'asc'
-        }).$promise.then((data) => {
-                if (data.pagingData) this.systemGridOptions.setGridData(data.pagingData);
-            });
-    }
-
-    _createGrids() {
-
-        this.environmentGridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-            .setColumns(this._getColumns())
-            .setRowTemplate('default')
-            .setGridData([]);
-
-        this.systemGridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-            .setColumns(this._getColumns())
-            .setRowTemplate('default')
-            .setGridData([]);
-    }
-
-    _getColumns() {
-        return [
-            {
-                name: "Key",
-                displayName: "Key",
-                field: "key",
-                sort: {
-                    direction: this.uiGridConstants.ASC
-                }
-            },
-            {
-                name: "Value",
-                displayName: "Value",
-                field: "value"
-            }
-        ]
-    }
-}
-
-export function jfEnvironment() {
-    return {
-        restrict: 'EA',
-        controller: jfEnvironmentController,
-        controllerAs: 'jfEnvironment',
-        scope: {},
-        bindToController: true,
-        templateUrl: 'states/builds/builds_info/build_tabs/jf_environment.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_general_info.html b/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_general_info.html
deleted file mode 100644
index 64b9a75..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_general_info.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<div class="builds-general-info">
-    <jf-panel jf-panel-heading="General Info">
-        <a ng-if="jfGeneralInfo.userCanDistribute"
-           class="push-to-bintray-btn"
-           ng-click="jfGeneralInfo.distribute()"><span class="icon icon-distribution-repo"></span>Distribute
-        </a>
-        <table class="jf-data-table">
-            <tr ng-repeat="(key,value) in jfGeneralInfo.generalData" ng-if="jfGeneralInfo.DICTIONARY[key]">
-                <td>{{jfGeneralInfo.DICTIONARY[key]}}:</td>
-                <td ng-if="key === 'url'">
-                    <a ng-href="{{value}}" target="_blank">{{value}}</a>
-                </td>
-                <td ng-if="key !== 'url'">{{value}}</td>
-            </tr>
-        </table>
-    </jf-panel>
-</div>
-
-
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_general_info.js b/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_general_info.js
deleted file mode 100644
index ea40c45..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_general_info.js
+++ /dev/null
@@ -1,88 +0,0 @@
-import DICTIONARY from "./../../constants/builds.constants";
-
-class jfGeneralInfoController {
-    constructor($scope, $stateParams, BuildsDao, PushToBintrayModal, User, DistributionDao, ArtifactoryModal) {
-        this.$scope = $scope;
-        this.$stateParams = $stateParams;
-        this.buildsDao = BuildsDao;
-        this.pushToBintrayModal = PushToBintrayModal;
-        this.generalData = {};
-        this.distributionDao = DistributionDao;
-        this.DICTIONARY = DICTIONARY.generalInfo;
-        this.User = User;
-        this.modal = ArtifactoryModal;
-
-        //TODO [by dan]: Decide if we're bringing back push to bintray for builds -> remove this if not
-        // this.userCanPushToBintray = false;
-        this.userCanDistribute = false;
-
-        this._getGeneralInfo();
-    }
-
-    pushToBintray() {
-        this.modalInstance = this.pushToBintrayModal.launchModal('build');
-    }
-
-    distribute() {
-        this.distributionDao.getAvailableDistributionRepos({}).$promise.then((data)=>{
-            let modalInstance;
-            this.distributeModalScope = this.$scope.$new();
-
-            this.distributeModalScope.title = "Distribute " + this.$stateParams.buildName + " #" + this.$stateParams.buildNumber;
-            this.distributeModalScope.distributionRepositoriesOptions = _.map(data, 'repoKey');
-
-            this.distributeModalScope.data = {};
-            this.distributeModalScope.data.async = true;
-            this.distributeModalScope.data.publish = true;
-            this.distributeModalScope.data.publish = true;
-            this.distributeModalScope.data.overrideExistingFiles = false;
-            this.distributeModalScope.data.selectedRepo = null;
-            this.distributeModalScope.distType = "build";
-
-            this.distributeModalScope.distribute = () => {
-                this.distributionDao.distributeBuild({
-                    targetRepo: this.distributeModalScope.data.selectedRepo,
-                    async: this.distributeModalScope.data.async,
-                    overrideExistingFiles: this.distributeModalScope.data.overrideExistingFiles
-                },{
-                    buildName: this.$stateParams.buildName,
-                    buildNumber: this.$stateParams.buildNumber,
-                    date: this.$stateParams.startTime
-                }).$promise.then((res)=>{
-                    // Success
-                    modalInstance.close();
-                });
-            };
-
-            modalInstance = this.modal.launchModal('distribute_modal', this.distributeModalScope, 'sm');
-        });
-    }
-
-    _getGeneralInfo() {
-        return this.buildsDao.getData({
-            name: this.$stateParams.buildName,
-            number: this.$stateParams.buildNumber,
-            time: this.$stateParams.startTime,
-            action:'buildInfo'
-        }).$promise.then((data) => {
-            //TODO [by dan]: Decide if we're bringing back push to bintray for builds -> remove this if not
-            // this.userCanPushToBintray = data.allowPushToBintray && this.User.getCurrent().canPushToBintray();
-            this.userCanDistribute = data.userCanDistribute;
-            this.generalData = data;
-        });
-
-    }
-
-}
-
-
-export function jfGeneralInfo() {
-    return {
-        restrict: 'EA',
-        controller: jfGeneralInfoController,
-        controllerAs: 'jfGeneralInfo',
-        scope: {},
-        bindToController: true,
-        templateUrl: 'states/builds/builds_info/build_tabs/jf_general_info.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_issues.html b/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_issues.html
deleted file mode 100644
index e58cbd5..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_issues.html
+++ /dev/null
@@ -1,7 +0,0 @@
-<jf-grid ng-if="!jfIssues.noData"
-         grid-options="jfIssues.gridOptions"
-         object-name="Issue"></jf-grid>
-
-<div class="alert alert-warning" ng-if="jfIssues.noData">
-    No issues were recorded during this build.
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_issues.js b/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_issues.js
deleted file mode 100644
index 4fb3508..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_issues.js
+++ /dev/null
@@ -1,92 +0,0 @@
-
-class jfIssuesController {
-    constructor($scope, $stateParams, BuildsDao, ArtifactoryGridFactory, uiGridConstants, commonGridColumns) {
-        this.$stateParams = $stateParams;
-        this.$scope = $scope;
-        this.uiGridConstants=uiGridConstants;
-        this.buildsDao = BuildsDao;
-        this.gridOptions = {};
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.commonGridColumns = commonGridColumns;
-
-        this.noData = false;
-
-        this._createGrid();
-        this._getIssuesData();
-    }
-
-    _getIssuesData() {
-        this.buildsDao.getDataArray({
-            name: this.$stateParams.buildName,
-            number: this.$stateParams.buildNumber,
-            time: this.$stateParams.startTime,
-            action: 'buildIssues'
-        }).$promise.then((data) => {
-                if (data.length) {
-                    this.gridOptions.setGridData(data);
-                }
-                else {
-                    this.noData = true;
-                }
-
-            }).catch(() => {
-                this.noData = true;
-                this.gridOptions.setGridData([]);
-        });
-    }
-
-    _createGrid() {
-
-        this.gridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-            .setColumns(this._getColumns())
-            .setRowTemplate('default')
-            .setButtons(this._getActions());
-
-    }
-
-    _getColumns() {
-        let cellTemplate = '<div class="ui-grid-cell-contents"><a target="_blank" ng-href="{{row.entity.url}}">{{row.entity.key}}</a></div>';
-
-        return [
-            {
-                name: "Key",
-                displayName: "Key",
-                field: "key",
-                cellTemplate: cellTemplate,
-            },
-            {
-                name: "Summary",
-                displayName: "Summary",
-                field: "summary"
-            },
-            {
-                name: "Previous Build",
-                displayName: "Previous Build",
-                field: "aggregated",
-                cellTemplate: this.commonGridColumns.booleanColumn('row.entity.aggregated'),
-                sort: {
-                    direction: this.uiGridConstants.ASC
-                }
-            }
-
-        ]
-    }
-
-    _getActions() {
-        return [
-        ];
-    }
-
-}
-
-
-export function jfIssues() {
-    return {
-        restrict: 'EA',
-        controller: jfIssuesController,
-        controllerAs: 'jfIssues',
-        scope: {},
-        bindToController: true,
-        templateUrl: 'states/builds/builds_info/build_tabs/jf_issues.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_licenses.html b/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_licenses.html
deleted file mode 100644
index 3014fa4..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_licenses.html
+++ /dev/null
@@ -1,75 +0,0 @@
-<div class="licenses-tab container-fluid">
-    <div class="general-summary licenses-summary">
-        <i class="icon"
-           ng-class="{'icon-notif-success': jfLicenses.summary.ok,'icon-notif-warning': !jfLicenses.summary.ok}"></i>
-        <span>Summary:</span>
-        <span class="license-unapproved">Unapproved: {{jfLicenses.summary.notApproved}}</span>
-        <span class="license-notfound">Not Found: {{jfLicenses.summary.notFound}}</span>
-        <span>Unknown: {{jfLicenses.summary.unknown}}</span>
-        <span class="license-neutral">Neutral: {{jfLicenses.summary.neutral}}</span>
-        <span class="license-approved">Approved: {{jfLicenses.summary.approved}}</span>
-    </div>
-
-    <jf-panel jf-panel-heading="Includes">
-        <div class="form-group form-checkbox">
-            <div class="form-group-cell">
-                <jf-checkbox text="Include Published Artifacts">
-                    <input id="includePublished"
-                           type="checkbox"
-                           ng-model="jfLicenses.includePublished"
-                           ng-click="jfLicenses.onIncludePublish()"
-                           name="includePublished">
-                </jf-checkbox>
-            </div>
-        </div>
-        <div ng-if="jfLicenses.hasScopesOptions()" class="form-group no-margin-bottom">
-            <div class="form-group-cell">
-                <jf-checkbox text="Include Dependencies of the Following Scopes:">
-                    <input id="includeByScopes"
-                           type="checkbox"
-                           ng-model="jfLicenses.includeByScopes"
-                           ng-click="jfLicenses.onIncludeByScopes()"
-                           name="includeByScopes">
-                </jf-checkbox>
-            </div>
-        </div>
-        <div class="form-group no-margin-bottom"
-             ng-if="jfLicenses.hasScopesOptions()">
-            <div class="form-group-cell double">
-                <div class="scopes-options">
-                    <jf-checkbox ng-repeat="(key,value) in jfLicenses.scopesOptions"
-                                 text="{{key}}">
-                        <input id="{{key}}"
-                               type="checkbox"
-                               ng-model="jfLicenses.scopesOptions[key]"
-                               ng-disabled="!jfLicenses.includeByScopes"
-                               ng-click="jfLicenses.onScopeOptionChange()"
-                               name="{{key}}">
-                    </jf-checkbox>
-                </div>
-            </div>
-        </div>
-    </jf-panel>
-
-    <div class="btn-group">
-        <form method="post" action="../ui/builds/exportLicenses/">
-            <input name="data" type="hidden" ng-value="jfLicenses.getFilteredData()">
-            <button class="btn btn-secondary" ng-disabled="!jfLicenses.filteredData.length">Export to CSV</button>
-        </form>
-    </div>
-
-    <button class="btn btn-secondary" ng-click="jfLicenses.autoLink()" ng-disabled="!jfLicenses.filteredData.length">Auto Find Licenses</button>
-
-    <div ng-if="jfLicenses.showExtendedGrid && jfLicenses.canOverride" class="pull-right">
-        <button class="btn btn-primary" ng-click="jfLicenses.overrideSelected()">Override Selected Licenses</button>
-        <button class="btn btn-secondary" ng-click="jfLicenses.cancel()">Cancel</button>
-    </div>
-
-    <jf-grid ng-if="!jfLicenses.showExtendedGrid"
-             grid-options="jfLicenses.gridOptions"
-             filter-field="id"></jf-grid>
-    <jf-grid ng-if="jfLicenses.showExtendedGrid"
-             grid-options="jfLicenses.extendedGridOptions"
-             filter-field="id"></jf-grid>
-
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_licenses.js b/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_licenses.js
deleted file mode 100644
index cc17a65..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_licenses.js
+++ /dev/null
@@ -1,416 +0,0 @@
-import TOOLTIP from '../../../../constants/artifact_tooltip.constant';
-let headerCellGroupingTemplate = require("raw!../../../../ui_components/artifactory_grid/templates/headerCellTemplate.html");
-
-
-class jfLicensesController {
-    constructor($scope, $state, $window, $stateParams, BuildsDao, ArtifactPropertyDao,
-            ArtifactoryGridFactory, ArtifactoryModal, ArtifactoryState, artifactoryDownload, commonGridColumns,
-            ArtifactActionsDao, ArtifactoryStorage) {
-        this.TOOLTIP = TOOLTIP.builds;
-        this.$stateParams = $stateParams;
-        this.$state = $state;
-        this.$scope = $scope;
-        this.$window = $window;
-        this.buildsDao = BuildsDao;
-        this.propsDao = ArtifactPropertyDao.getInstance();
-        this.artifactActionsDao = ArtifactActionsDao;
-        this.modal = ArtifactoryModal;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.artifactoryStorage = ArtifactoryStorage;
-        this.download = artifactoryDownload;
-        this.artifactoryState = ArtifactoryState;
-        this.gridOptions = {};
-        this.commonGridColumns = commonGridColumns;
-        this.extendedGridOptions = {};
-
-
-        this.modalInstance = null;
-
-        this.includePublished = false;
-
-        this.allData = {};
-
-        this.filteredData = {};
-
-        this.scopesOptions = {}
-        this.scopesOptionsCopy = {};
-
-        this.showExtendedGrid = false;
-
-        this.canOverride = true;
-
-        this._createGrids();
-
-        this._getLicensesData();
-
-        this.toOverride = [];
-
-    }
-
-    getFilteredData() {
-        let data = _.map(angular.copy(this.filteredData),(obj)=>{
-            delete(obj.$$hashKey);
-            return obj;
-        });
-
-        return JSON.stringify({licenses: data});
-    }
-
-    downloadArtifact(row) {
-        let params = {action: 'download'};
-        this.artifactActionsDao.perform(params, {
-            path: row.path,
-            repoKey: row.repoKey
-        }).$promise.then((response) => {
-                    this.download(response.data.path)
-                });
-    }
-
-    showInTree(row) {
-        let browser = this.artifactoryStorage.getItem('BROWSER') || 'tree';
-        if (browser === 'stash') browser = 'tree';
-        let path = row.repoKey + '/' + row.path;
-        this.$state.go('artifacts.browsers.path',{
-            tab: "General",
-            artifact: path,
-            browser: browser
-        });
-    }
-
-    editLicense(row) {
-        let prevState = {state: this.$state.current.name, params: angular.copy(this.$stateParams)};
-        this.artifactoryState.setState('prevState', prevState);
-        this.$state.go('admin.configuration.editLicense',{licenseName: row.license.name});
-    }
-
-    changeLicense(row) {
-        this._getLicensesPredefineValues(row).then((data) => {
-            let modalScope = this.$scope.$new();
-            modalScope.saveLicenses = (licenses) => {
-                this.propsDao.update({
-                        repoKey: row.repoKey,
-                        path: row.path
-                    },
-                    {
-                        parent: {name: 'artifactory'},
-                        property: {name: 'licenses'},
-                        selectedValues: licenses
-                    })
-                    .$promise.then((res)=>{
-                        //console.log(res);
-                        this.modalInstance.close();
-                        this._getLicensesData();
-                    })
-            };
-            modalScope.closeModal = () => this.modalInstance.close();
-
-            if (this.showExtendedGrid && row.extractedLicense.name !== 'Not Found') {
-                modalScope.foundLicense = row.extractedLicense.name;
-
-                if (row.extractedLicense.found && row.extractedLicense.name !== row.license.name)
-                    modalScope.foundLicenseClass = row.extractedLicense.approved ? 'license-approved' : 'license-unapproved';
-                else if (!row.extractedLicense.found || row.extractedLicense.name === row.license.name)
-                    modalScope.foundLicenseClass = 'license-found-same-or-notfound';
-
-                if (row.overridable) {
-                    modalScope.overridable = true;
-                    modalScope.override = () => {
-                        modalScope.selectedLicenses = [row.extractedLicense.name];
-                    }
-                }
-            }
-            modalScope.modalTitle = "Edit 'artifactory.licenses' Property";
-            modalScope.licenses = data.predefinedValues;
-            modalScope.selectedLicenses = data.selectedValues;
-            this.modalInstance = this.modal.launchModal('add_license_modal', modalScope);
-        });
-    }
-
-    autoLink() {
-        this.showExtendedGrid = true;
-        this._getLicensesData();
-    }
-
-    overrideSelected() {
-        if (this.toOverride.length) {
-            let requestObject = {
-                name: this.$stateParams.buildName,
-                number: this.$stateParams.buildNumber,
-                time: this.$stateParams.startTime,
-                licenses: this.toOverride
-            };
-
-            this.buildsDao.overrideLicenses(requestObject).$promise.then((data) => {
-                this.cancel();
-            });
-        }
-    }
-
-    cancel() {
-        this.showExtendedGrid = false;
-        this._getLicensesData();
-    }
-
-    onIncludePublish() {
-        this._filterData();
-    }
-
-    onIncludeByScopes() {
-        if (this.includeByScopes) {
-            angular.copy(this.scopesOptionsCopy,this.scopesOptions);
-        }
-        else {
-            angular.copy(this.scopesOptions,this.scopesOptionsCopy);
-            for (let key in this.scopesOptions) {
-                this.scopesOptions[key] = true;
-            }
-        }
-        this._filterData();
-    }
-
-    onScopeOptionChange() {
-        this._filterData();
-    }
-
-    _getLicensesPredefineValues(row) {
-        return this.buildsDao.getData({
-            name: this.$stateParams.buildName,
-            number: this.$stateParams.buildNumber,
-            time: this.$stateParams.startTime,
-            autoFind: this.showExtendedGrid,
-            id: row.id,
-            repoKey: row.repoKey,
-            path: row.path,
-            action: 'changeLicenses'
-        }).$promise;
-    }
-
-    _getLicensesData() {
-        this.buildsDao.getData({
-            name: this.$stateParams.buildName,
-            number: this.$stateParams.buildNumber,
-            time: this.$stateParams.startTime,
-            autoFind: this.showExtendedGrid,
-            action: 'buildLicenses'
-        }).$promise.then((data) => {
-                //console.log(data);
-                _.map(data.scopes, (scope)=> {
-                    this.scopesOptions[scope] = true;
-                });
-                angular.copy(this.scopesOptions,this.scopesOptionsCopy);
-                this.allData = data;
-                this._filterData();
-            });
-    }
-
-    _filterData() {
-        let relevantData = this.allData.licenses;
-
-        if (this.includePublished) {
-            relevantData = relevantData.concat(this.allData.publishedModules);
-        }
-
-        this.filteredData = _.filter(relevantData,(license) => {
-            if (!this.includeByScopes) return true;
-            else {
-                let ret = false;
-                for (let key in this.scopesOptions) {
-                    if (this.scopesOptions[key] && license.scopeNames.includes(key)) {
-                        ret = true;
-                        break;
-                    }
-                }
-                return ret;
-            }
-        });
-        if (this.showExtendedGrid) {
-            this.extendedGridOptions.setGridData(this.filteredData);
-        }
-        else {
-            this.gridOptions.setGridData(this.filteredData);
-        }
-
-        this._calculateSummary();
-    }
-
-    _calculateSummary() {
-        this.summary = {
-            notApproved: _.filter(this.filteredData, (license) => {return license.license.found && !license.license.approved}).length,
-            notFound: _.filter(this.filteredData, (license) => {return license.license.notFound}).length,
-            unknown: _.filter(this.filteredData, (license) => {return license.license.unknown}).length,
-            neutral: _.filter(this.filteredData, (license) => {return license.license.notSearched}).length,
-            approved: _.filter(this.filteredData, (license) => {return license.license.approved}).length,
-        };
-
-        this.summary.ok = this.summary.notApproved === 0 && this.summary.notFound === 0 && this.summary.unknown === 0;
-    }
-
-    _createGrids() {
-        this.gridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-            .setColumns(this._getColumns())
-            .setRowTemplate('default')
-        this.extendedGridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-            .setColumns(this._getExtendedColumns())
-            .setRowTemplate('default')
-    }
-
-    _getColumns() {
-        let nameCellTemplate = '<div ng-if="row.entity.repoKey" class="ui-grid-cell-contents">{{row.entity.id}}</div>' +
-                               '<div ng-if="!row.entity.repoKey" class="ui-grid-cell-contents">{{row.entity.id}}</div>';
-
-        let licenseCellTemplate = '<div class="ui-grid-cell-contents"' +
-                'ng-class="{\'license-unapproved\': row.entity.license.found && !row.entity.license.approved,' +
-                '\'license-approved\': row.entity.license.approved,'+
-                '\'license-notfound\': row.entity.license.notFound,' +
-                '\'license-neutral\': row.entity.license.notSearched}"'+
-                '><div ng-if="row.groupHeader">{{row.entity[\'license.name\']}}</div>' +
-                '<div ng-if="!row.groupHeader">' +
-                '<span ng-if="row.entity.actions.indexOf(\'ChangeLicense\') !== -1"><a href="" ng-click="grid.appScope.jfLicenses.changeLicense(row.entity)">{{row.entity.license.name === "Unknown" ? "Unknown(" + row.entity.license.longName + ")" : row.entity.license.name}}</a></span>' +
-                '<span ng-if="row.entity.actions.indexOf(\'ChangeLicense\') === -1">{{row.entity.license.name === "Unknown" ? "Unknown(" + row.entity.license.longName + ")" : row.entity.license.name}}</span>' +
-                '</div></div>';
-        return [
-            {
-                name: "Artifact ID",
-                displayName: "Artifact ID",
-                field: "id",
-                cellTemplate: nameCellTemplate,
-                width: '25%',
-                actions: {
-                    download: {
-                        callback: row => this.downloadArtifact(row),
-                        visibleWhen: row => row.actions.indexOf('Download') !== -1
-                    }
-                }
-            },
-            {
-                name: "Scopes",
-                displayName: "Scopes",
-                field: "scopeNames",
-                headerCellTemplate: headerCellGroupingTemplate,
-                grouped: true,
-                width: '12%'
-            },
-            {
-                name: "Repo Path",
-                displayName: "Repo Path",
-                cellTemplate: this.commonGridColumns.repoPathColumn(),
-                field: "path",
-                width: '50%',
-                customActions: [{
-                    icon: 'icon icon-show-in-tree',
-                    tooltip: 'Show In Tree',
-                    callback: row => this.showInTree(row),
-                    visibleWhen: row => row.actions.indexOf('ShowInTree') !== -1
-                }]
-            },
-            {
-                name: "License",
-                displayName: "License",
-                field: "license.name",
-                headerCellTemplate: headerCellGroupingTemplate,
-                cellTemplate: licenseCellTemplate,
-                grouped: true,
-                width: '13%'
-            }
-        ];
-    }
-
-    _getExtendedColumns() {
-        let nameCellTemplate = '<div ng-if="row.entity.repoKey" class="ui-grid-cell-contents">{{row.entity.id}}</div>' +
-                '<div ng-if="!row.entity.repoKey" class="ui-grid-cell-contents">{{row.entity.id}}</div>';
-
-        let licenseCellTemplate = '<div class="ui-grid-cell-contents"' +
-                'ng-class="{\'license-unapproved\': row.entity.license.found && !row.entity.license.approved,' +
-                '\'license-approved\': row.entity.license.approved,'+
-                '\'license-notfound\': row.entity.license.notFound}"'+
-                '><div ng-if="row.groupHeader">{{row.entity[\'license.name\']}}</div>' +
-                '<div ng-if="!row.groupHeader">' +
-                '<span ng-if="row.entity.actions.indexOf(\'ChangeLicense\') !== -1"><a href="" ng-click="grid.appScope.jfLicenses.changeLicense(row.entity)">{{row.entity.license.name === "Unknown" ? "Unknown(" + row.entity.license.longName + ")" : row.entity.license.name}}</a></span>' +
-                '<span ng-if="row.entity.actions.indexOf(\'ChangeLicense\') === -1">{{row.entity.license.name === "Unknown" ? "Unknown(" + row.entity.license.longName + ")" : row.entity.license.name}}</span>' +
-                '</div></div>';
-
-        let foundLicenseCellTemplate = '<div class="ui-grid-cell-contents"' +
-            'ng-class="{\'license-approved\': row.entity.extractedLicense.found && row.entity.extractedLicense.name !== row.entity.license.name && row.entity.extractedLicense.approved,' +
-                '\'license-unapproved\': row.entity.extractedLicense.found && row.entity.extractedLicense.name !== row.entity.license.name && !row.entity.extractedLicense.approved,' +
-                '\'license-found-same-or-notfound\': !row.entity.extractedLicense.found || row.entity.extractedLicense.name === row.entity.license.name}"' +
-                '>{{row.entity.extractedLicense.name === "Unknown" ? "Unknown(" + row.entity.extractedLicense.longName + ")" : row.entity.extractedLicense.name}}</div>';
-
-        return [
-            {
-                name: "Artifact ID",
-                displayName: "Artifact ID",
-                field: "id",
-                cellTemplate: nameCellTemplate,
-                width: '25%',
-                actions: {
-                    download: {
-                        callback: row => this.downloadArtifact(row),
-                        visibleWhen: row => row.actions.indexOf('Download') !== -1
-                    }
-                }
-            },
-            {
-                name: "Scopes",
-                field: "scopeNames",
-                headerCellTemplate: headerCellGroupingTemplate,
-                grouped: true
-            },
-            {
-                name: "Repo Path",
-                cellTemplate: this.commonGridColumns.repoPathColumn(),
-                field: "path",
-                customActions: [{
-                    icon: 'icon icon-show-in-tree',
-                    tooltip: 'Show In Tree',
-                    callback: row => this.showInTree(row),
-                    visibleWhen: row => row.actions.indexOf('ShowInTree') !== -1
-                }]
-            },
-            {
-                name: "License",
-                field: "license.name",
-                headerCellTemplate: headerCellGroupingTemplate,
-                cellTemplate: licenseCellTemplate,
-                grouped: true
-            },
-            {
-                name: "Found Licenses",
-                field: "extractedLicense.name",
-                cellTemplate: foundLicenseCellTemplate
-            },
-            {
-                name: "Override",
-                field: "selected",
-                cellTemplate: this.commonGridColumns.checkboxColumn('row.entity.selected', 'grid.appScope.jfLicenses.setSelected(row.entity)', '!row.entity.overridable')
-            }
-
-        ];
-    }
-
-    setSelected(row) {
-        if (row.selected) {
-            this.toOverride.push(row);
-        }
-        else {
-            let index = this.toOverride.indexOf(row);
-            if (index != -1) {
-                this.toOverride.splice(index,1);
-            }
-        }
-    }
-
-    hasScopesOptions() {
-        return Object.keys(this.scopesOptions).length > 0;
-    }
-}
-
-export function jfLicenses() {
-    return {
-        restrict: 'EA',
-        controller: jfLicensesController,
-        controllerAs: 'jfLicenses',
-        scope: {},
-        bindToController: true,
-        templateUrl: 'states/builds/builds_info/build_tabs/jf_licenses.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_published_modules.html b/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_published_modules.html
deleted file mode 100644
index 9ff1190..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_published_modules.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<div class="builds-published-modules" jf-disable-feature="publishedmodule">
-<!--    <h4 ng-if="!jfPublishedModules.selectedModule"><span>{{jfPublishedModules.modulesCount}} matches found</span></h4>-->
-    <div class="pull-right back-to-modules" ng-if="jfPublishedModules.selectedModule">
-        <a href=""
-           ng-click="jfPublishedModules.backToModules()"><span class="back-link-icon">‹</span>Back To All Modules
-        </a>
-    </div>
-    <div class="clearfix"></div>
-    <jf-grid ng-if="!jfPublishedModules.selectedModule"
-             grid-options="jfPublishedModules.modulesGridOptions"
-             filter-field="moduleId"
-             object-name="module"
-             auto-focus="true"></jf-grid>
-
-    <jf-panel jf-panel-heading="Module Details: {{ jfPublishedModules.selectedModule }}"
-              ng-if="jfPublishedModules.selectedModule">
-
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-checkbox text="Compare With Previous Build:">
-                    <input type="checkbox"
-                           ng-model="jfPublishedModules.compare"
-                           ng-change="jfPublishedModules.onCompareChanged()"
-                           name="compare">
-                </jf-checkbox>
-
-                <ui-select jf-disable-ng-animate ng-model="jfPublishedModules.selectedBuildNumber"
-                           ng-change="jfPublishedModules.getSubData()"
-                           ng-disabled="!jfPublishedModules.compare">
-                    <ui-select-match>
-                        {{$select.selected.buildNumber}}
-                    </ui-select-match>
-                    <ui-select-choices repeat="data in jfPublishedModules.comparableBuildNumbers">
-                        <div ng-bind-html="data.buildNumber | highlight: $select.search"></div>
-                    </ui-select-choices>
-                </ui-select>
-            </div>
-        </div>
-
-        <jf-panel jf-panel-heading="Artifacts ({{jfPublishedModules.artifactsCount}} matches found)">
-            <jf-grid grid-options="jfPublishedModules.artifactsGridOptions" filter-field="name" no-count></jf-grid>
-        </jf-panel>
-
-        <jf-panel jf-panel-heading="Dependencies ({{jfPublishedModules.dependenciesCount}} matches found)">
-            <jf-grid grid-options="jfPublishedModules.dependenciesGridOptions" filter-field="name" no-count></jf-grid>
-        </jf-panel>
-    </jf-panel>
-</div>
-
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_published_modules.js b/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_published_modules.js
deleted file mode 100644
index 04d4fd1..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_published_modules.js
+++ /dev/null
@@ -1,423 +0,0 @@
-import EVENTS from '../../../../constants/artifacts_events.constants';
-import DICTIONARY from './../../constants/builds.constants';
-let headerCellGroupingTemplate = require("raw!../../../../ui_components/artifactory_grid/templates/headerCellTemplate.html");
-
-const defaultPagination = {
-    pageNum: 1,
-    numOfRows: 25,
-    direction: "asc",
-    orderBy: "name"
-}
-
-
-class jfPublishedModulesController {
-    constructor($scope, $state, $stateParams, BuildsDao, ArtifactBuildsDao, ArtifactActionsDao, ArtifactoryGridFactory,
-            artifactoryDownload, ArtifactoryModal, ArtifactoryFeatures, ArtifactoryEventBus, $timeout, uiGridConstants,
-            commonGridColumns,
-            User, ArtifactoryStorage) {
-        this.$timeout = $timeout;
-        this.$stateParams = $stateParams;
-        this.$state = $state;
-        this.$scope = $scope;
-        this.uiGridConstants = uiGridConstants;
-        this.commonGridColumns = commonGridColumns;
-        this.initialModuleId = $stateParams.moduleID;
-        this.buildsDao = BuildsDao;
-        this.artifactActionsDao = ArtifactActionsDao;
-        this.artifactBuildsDao = ArtifactBuildsDao.getInstance();
-        this.download = artifactoryDownload;
-        this.modal = ArtifactoryModal;
-        this.modulesGridOptions = {};
-        this.artifactsGridOptions = {};
-        this.dependenciesGridOptions = {};
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.user = User;
-        this.modulesCount = 0;
-        this.artifactsCount = 0;
-        this.dependenciesCount = 0;
-        this.DICTIONARY = DICTIONARY.generalInfo;
-        this.selectedModule = null;
-        this.artifactoryStorage = ArtifactoryStorage;
-        this.comparableNumbers = [''];
-        this.selectedBuildNumber = '';
-        this.artifactoryFeatures = ArtifactoryFeatures;
-
-        this._getComparableBuildNumbers();
-        this._createGrids();
-
-        if ($stateParams.moduleID) {
-            this.selectedModule = $stateParams.moduleID;
-            this.getSubData();
-        }
-        else {
-            this.selectedModule = null;
-        }
-
-    }
-
-    showArtifactInTree(row) {
-        let browser = this.artifactoryStorage.getItem('BROWSER') || 'tree';
-        if (browser === 'stash') browser = 'tree';
-        let path = row.repoKey + '/' + row.path;
-        this.$state.go('artifacts.browsers.path', {
-            tab: "General",
-            artifact: path,
-            browser: browser
-        });
-    }
-
-    downloadArtifact(row) {
-        this.download(row.downloadLink);
-    }
-
-    viewCodeArtifact(row) {
-        this.artifactActionsDao.perform(
-                {action: 'view'},
-                {
-                    repoKey: row.repoKey,
-                    path: row.path
-                })
-                .$promise.then((result) => {
-                    this.modal.launchCodeModal(row.name, result.data.fileContent,
-                            {name: row.type, json: true});
-                });
-    }
-
-    selectModule(entity) {
-        if (!this.artifactoryFeatures.isDisabled("publishedmodule")) {
-            this.$state.go('builds.info', {
-                buildName: this.$stateParams.buildName,
-                buildNumber: this.$stateParams.buildNumber,
-                startTime: this.$stateParams.startTime,
-                tab: this.$stateParams.tab,
-                moduleID: entity.moduleId
-            });
-        }
-    }
-
-    getSubData() {
-        if (this.compare && this.selectedBuildNumber && this.selectedBuildNumber.buildNumber) {
-            this._getArtifactsDiff();
-            this._getDependenciesDiff();
-        }
-        else {
-            this._getArtifacts();
-            this._getDependencies();
-        }
-    }
-
-    onCompareChanged() {
-        if (!(this.selectedBuildNumber && this.selectedBuildNumber.buildNumber)) {
-            // Don't get data if haven't selected build number yet
-            return;
-        }
-        this.getSubData();
-    }
-
-    _getModulesData() {
-        this.buildsDao.getData(defaultPagination, {
-            name: this.$stateParams.buildName,
-            number: this.$stateParams.buildNumber,
-            time: this.$stateParams.startTime,
-            action: 'publishedModules'
-        })
-                .$promise.then((data) => {
-                    this.modulesCount = data.pagingData.length;
-                    this.modulesGridOptions.setGridData(data.pagingData);
-                    if (this.initialModuleId) {
-                        this.initialModuleId = null;
-                        let module = _.findWhere(data.pagingData, {moduleId: this.$stateParams.moduleID})
-                        //                        this.modulesGridOptions.selectItem(module);
-                    }
-                });
-    }
-
-    _getArtifacts() {
-        this.buildsDao.getData(defaultPagination, {
-            name: this.$stateParams.buildName,
-            number: this.$stateParams.buildNumber,
-            time: this.$stateParams.startTime,
-            action: 'modulesArtifact',
-            moduleId: this.selectedModule
-        }).$promise.then((data) => {
-                    this.artifactsCount = data.pagingData.length;
-                    this.artifactsGridOptions.setGridData(data.pagingData);
-                });
-    }
-
-    _getDependencies() {
-
-        let defaultPagination = {
-            pageNum: 1,
-            numOfRows: 25,
-            direction: "asc",
-            orderBy: "id"
-        };
-        this.buildsDao.getData(defaultPagination, {
-            name: this.$stateParams.buildName,
-            number: this.$stateParams.buildNumber,
-            time: this.$stateParams.startTime,
-            action: 'modulesDependency',
-            moduleId: this.selectedModule
-        }).$promise.then((data) => {
-                    this.dependenciesCount = data.pagingData.length;
-                    this.dependenciesGridOptions.setGridData(data.pagingData);
-                });
-
-    }
-
-    _getArtifactsDiff() {
-        return this.buildsDao.getData({
-            name: this.$stateParams.buildName,
-            number: this.$stateParams.buildNumber,
-            time: this.$stateParams.startTime,
-            action: 'artifactDiff',
-            moduleId: this.selectedModule,
-
-            otherNumber: this.selectedBuildNumber.buildNumber,
-            otherDate: this.selectedBuildNumber.time,
-
-            pageNum: 1,
-            numOfRows: 25,
-            direction: "asc",
-            orderBy: "name",
-        }).$promise.then((data) => {
-                    this.artifactsCount = data.pagingData.length;
-                    this.artifactsGridOptions.setGridData(data.pagingData);
-                });
-        ;
-    }
-
-    _getDependenciesDiff() {
-
-        this.buildsDao.getData({
-            name: this.$stateParams.buildName,
-            number: this.$stateParams.buildNumber,
-            time: this.$stateParams.startTime,
-            action: 'dependencyDiff',
-            moduleId: this.selectedModule,
-            otherNumber: this.selectedBuildNumber.buildNumber,
-            otherDate: this.selectedBuildNumber.time,
-
-            pageNum: 1,
-            numOfRows: 25,
-            direction: "asc",
-            orderBy: "id"
-        }).$promise.then((data) => {
-                    this.dependenciesCount = data.pagingData.length;//data.totalItems ? data.totalItems : 0;
-                    this.dependenciesGridOptions.setGridData(data.pagingData);
-                });
-
-    }
-
-    _getComparableBuildNumbers() {
-
-        this.buildsDao.getDataArray({
-            name: this.$stateParams.buildName,
-            number: this.$stateParams.buildNumber,
-            time: this.$stateParams.startTime,
-            action: 'prevBuild'
-        }).$promise.then((data) => {
-                    this.comparableBuildNumbers = data;
-                })
-
-    }
-
-
-    _createGrids() {
-
-        this.modulesGridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setColumns(this._getModulesColumns())
-                .setRowTemplate('default');
-
-        this.modulesGridOptions.onSelectionChange = (data) => {
-            this.selectModule(data.entity);
-        }
-
-        this.artifactsGridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setColumns(this._getArtifactsColumns())
-                .setRowTemplate('default')
-
-        this.dependenciesGridOptions = this.artifactoryGridFactory.getGridInstance(this.$scope)
-                .setColumns(this._getDependenciesColumns())
-                .setRowTemplate('default');
-
-        this._getModulesData();
-    }
-
-    _getModulesColumns() {
-        let cellTemplate = '<div ng-click="grid.appScope.jfPublishedModules.selectModule(row.entity)" class="ui-grid-cell-contents"><a href="">{{row.entity.moduleId}}</a></div>';
-
-        return [
-            {
-                name: "Module ID",
-                displayName: "Module ID",
-                field: "moduleId",
-                sort: {
-                    direction: this.uiGridConstants.ASC
-                },
-                cellTemplate: cellTemplate,
-                width: '60%'
-            },
-            {
-                name: "Number Of Artifacts",
-                displayName: "Number Of Artifacts",
-                field: "numOfArtifacts",
-                width: '20%'
-            },
-            {
-                name: "Number Of Dependencies",
-                displayName: "Number Of Dependencies",
-                field: "numOfDependencies",
-                width: '20%'
-            }
-
-        ]
-    }
-
-    _getArtifactsColumns() {
-
-        let typeCellTemplate = '<div class="ui-grid-cell-contents status-{{(row.entity.status).toLowerCase()}}">{{row.entity.type}}</div>';
-
-        return [
-            {
-                name: "Artifact Name",
-                displayName: "Artifact Name",
-                field: "name",
-                sort: {
-                    direction: this.uiGridConstants.ASC
-                },
-                width: '40%',
-                cellTemplate: this.commonGridColumns.downloadableColumn('status-{{(row.entity.status).toLowerCase()}}'),
-                customActions: [{
-                    icon: 'icon icon-view',
-                    tooltip: 'View',
-                    callback: row => this.viewCodeArtifact(row),
-                    visibleWhen: row => _.findWhere(row.actions, {name: "View"})
-                }],
-                actions: {
-                    download: {
-                        callback: row => this.downloadArtifact(row),
-                        visibleWhen: row => _.findWhere(row.actions, {name: "Download"})
-                    }
-                }
-            },
-            {
-                name: "Type",
-                displayName: "Type",
-                field: "type",
-                cellTemplate: typeCellTemplate,
-                headerCellTemplate: headerCellGroupingTemplate,
-                grouped: true,
-                width: '10%'
-            },
-            {
-                name: "Repo Path",
-                displayName: "Repo Path",
-                field: "repoPath",
-                width: '50%',
-                cellTemplate: this.commonGridColumns.repoPathColumn('status-{{(row.entity.status).toLowerCase()}}'),
-                customActions: [{
-                    icon: 'icon icon-show-in-tree',
-                    tooltip: 'Show In Tree',
-                    callback: row => this.showArtifactInTree(row),
-                    visibleWhen: row => _.findWhere(row.actions, {name: "ShowInTree"})
-                }]
-            }
-
-        ];
-    }
-
-    _getDependenciesColumns() {
-
-        let typeCellTemplate = '<div class="ui-grid-cell-contents status-{{(row.entity.status).toLowerCase()}}">{{row.entity.type}}</div>';
-        let scopeCellTemplate = '<div class="ui-grid-cell-contents status-{{(row.entity.status).toLowerCase()}}">{{row.entity.scope}}</div>';
-
-        return [
-            {
-                name: "Dependency ID",
-                displayName: "Dependency ID",
-                field: "name",
-                sort: {
-                    direction: this.uiGridConstants.ASC
-                },
-                width: '30%',
-                cellTemplate: this.commonGridColumns.downloadableColumn('status-{{(row.entity.status).toLowerCase()}}'),
-                actions: {
-                    download: {
-                        callback: row => this.downloadArtifact(row),
-                        visibleWhen: row => _.findWhere(row.actions, {name: "Download"})
-                    }
-                }
-            },
-            {
-                name: "Scope",
-                displayName: "Scope",
-                field: "scope",
-                cellTemplate: scopeCellTemplate,
-                headerCellTemplate: headerCellGroupingTemplate,
-                grouped: true,
-                width: '10%'
-            },
-            {
-                name: "Type",
-                displayName: "Type",
-                field: "type",
-                cellTemplate: typeCellTemplate,
-                headerCellTemplate: headerCellGroupingTemplate,
-                grouped: true,
-                width: '10%'
-            },
-            {
-                name: "Repo Path",
-                displayName: "Repo Path",
-                field: "repoPath",
-                width: '50%',
-                cellTemplate: this.commonGridColumns.repoPathColumn('status-{{(row.entity.status).toLowerCase()}}'),
-                customActions: [{
-                    icon: 'icon icon-show-in-tree',
-                    tooltip: 'Show In Tree',
-                    callback: row => this.showArtifactInTree(row),
-                    visibleWhen: row => _.findWhere(row.actions, {name: "ShowInTree"})
-                }]
-            }
-        ];
-    }
-
-    _installWatchers() {
-        this.$scope.$watch('jfPublishedModules.selectedBuildNumber', (val) => {
-            if (val.length) {
-                this.getSubData();
-            }
-        });
-        this.$scope.$watch('jfPublishedModules.compare', (val) => {
-            if (val !== undefined) {
-                this.getSubData();
-            }
-        });
-    }
-
-    backToModules() {
-        this.$state.go('builds.info', {
-            buildName: this.$stateParams.buildName,
-            buildNumber: this.$stateParams.buildNumber,
-            startTime: this.$stateParams.startTime,
-            tab: this.$stateParams.tab,
-            moduleID: ''
-        });
-    }
-
-}
-
-
-export function jfPublishedModules() {
-    return {
-        restrict: 'EA',
-        controller: jfPublishedModulesController,
-        controllerAs: 'jfPublishedModules',
-        scope: {},
-        bindToController: true,
-        templateUrl: 'states/builds/builds_info/build_tabs/jf_published_modules.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_release_history.html b/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_release_history.html
deleted file mode 100644
index 8873122..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_release_history.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<div class="builds-release-history">
-    <jf-panel ng-repeat="history in jfReleaseHistory.historyData"
-              jf-panel-heading="{{history.status}}">
-
-        <table class="jf-data-table">
-            <tr ng-repeat="(key,value) in history" ng-if="jfReleaseHistory.DICTIONARY[key]">
-                <td>{{jfReleaseHistory.DICTIONARY[key]}}:</td>
-                <td ng-if="key === 'url'">
-                    <a ng-href="{{value}}"
-                       target="_blank">{{value}}</a>
-                </td>
-                <td ng-if="key !== 'url'">
-                    <td>{{value}}</td>
-                </td>
-            </tr>
-        </table>
-    </jf-panel>
-
-    <div class="alert alert-warning" ng-if="jfReleaseHistory.historyData && !jfReleaseHistory.historyData.length">
-        This build has no release history.
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_release_history.js b/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_release_history.js
deleted file mode 100644
index 5ab71ff..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds_info/build_tabs/jf_release_history.js
+++ /dev/null
@@ -1,36 +0,0 @@
-import DICTIONARY from './../../constants/builds.constants';
-
-class jfReleaseHistoryController {
-    constructor($stateParams, BuildsDao) {
-        this.$stateParams = $stateParams;
-        this.buildsDao = BuildsDao;
-        this.historyData = null;
-        this.DICTIONARY = DICTIONARY.releaseHistory;
-
-        this._getData();
-    }
-
-    _getData() {
-        return this.buildsDao.getDataArray({
-            name: this.$stateParams.buildName,
-            number: this.$stateParams.buildNumber,
-            time: this.$stateParams.startTime,
-            action:'releaseHistory'
-        }).$promise.then((data) => {
-            this.historyData = data;                    
-        }).catch(() => {
-            this.historyData = [];
-        });
-    }
-}
-
-export function jfReleaseHistory() {
-    return {
-        restrict: 'EA',
-        controller: jfReleaseHistoryController,
-        controllerAs: 'jfReleaseHistory',
-        scope: {},
-        bindToController: true,
-        templateUrl: 'states/builds/builds_info/build_tabs/jf_release_history.html'
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds_info/builds_info.controller.js b/web/angular-web/src/main/webapp/app/states/builds/builds_info/builds_info.controller.js
deleted file mode 100644
index 3716097..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds_info/builds_info.controller.js
+++ /dev/null
@@ -1,35 +0,0 @@
-import EVENTS from '../../../constants/artifacts_events.constants';
-import DICTIONARY from '../constants/builds.constants';
-const tabWidth = 165;
-export class BuildsInfoController {
-    constructor($stateParams, $timeout, User, ArtifactoryEventBus, ArtifactoryFeatures) {
-        this.$stateParams = $stateParams;
-        this.$timeout = $timeout;
-        this.user = User.getCurrent();
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.features = ArtifactoryFeatures;
-        this.DICTIONARY = DICTIONARY.tabs;
-        this.buildTitle='Build #'+this.$stateParams.buildNumber;
-        this.tabs = [
-            {name: 'general'},
-            {name: 'published'},
-            {name: 'environment'},
-            {name: 'issues'},
-            {name: 'licenses', feature: 'licenses'},
-            {name: 'governance', feature: 'blackduck'},
-            {name: 'diff', feature: 'diff'},
-            {name: 'history'},
-            {name: 'json'}
-        ];
-        this.tabs.forEach((tab) => {
-            tab.isDisabled = this._isTabDisabled(tab);
-        });
-
-        this.artifactoryEventBus.dispatch(EVENTS.BUILDS_BREADCRUMBS);
-    }
-
-    _isTabDisabled(tab) {
-        return !this.user.canViewBuildState('builds.info', {tab: tab.name})
-            || this.features.isDisabled(tab.feature);
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds_info/builds_info.html b/web/angular-web/src/main/webapp/app/states/builds/builds_info/builds_info.html
deleted file mode 100644
index 04601d4..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds_info/builds_info.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<div class="build-info">
-    <h2>{{ BuildsInfo.buildTitle }}</h2>
-    <jf-tabs tabs="BuildsInfo.tabs"
-             dictionary="BuildsInfo.DICTIONARY"
-             tab-width="165"
-             container-margin="35">
-
-        <div class="main-view">
-            <jf-tab name="general">
-                <jf-general-info></jf-general-info>
-            </jf-tab>
-            <jf-tab name="published">
-                <jf-published-modules></jf-published-modules>
-            </jf-tab>
-            <jf-tab name="environment">
-                <jf-environment></jf-environment>
-            </jf-tab>
-            <jf-tab name="json">
-                <jf-build_info_json></jf-build_info_json>
-            </jf-tab>
-            <jf-tab name="issues">
-                <jf-issues></jf-issues>
-            </jf-tab>
-            <jf-tab name="diff">
-                <jf-diff></jf-diff>
-            </jf-tab>
-            <jf-tab name="history">
-                <jf-release-history></jf-release-history>
-            </jf-tab>
-            <jf-tab name="licenses">
-                <jf-licenses></jf-licenses>
-            </jf-tab>
-            <jf-tab name="governance">
-                <jf-builds-governance></jf-builds-governance>
-            </jf-tab>
-        </div>
-    </jf-tabs>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds_locate/builds_locate.controller.js b/web/angular-web/src/main/webapp/app/states/builds/builds_locate/builds_locate.controller.js
deleted file mode 100644
index 4649cc0..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds_locate/builds_locate.controller.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import EVENTS from '../../../constants/artifacts_events.constants';
-let headerCellGroupingTemplate = require("raw!../../../ui_components/artifactory_grid/templates/headerCellTemplate.html");
-
-export class BuildsLocateController {
-    constructor($scope, $timeout, $location, $stateParams, BuildsDao) {
-        this.$scope = $scope;
-        this.$stateParams = $stateParams;
-        this.$timeout = $timeout;
-        this.$location = $location;
-        this.buildsDao = BuildsDao;
-        this._getBuildsData();
-    }
-
-    _getBuildsData() {
-        return this.buildsDao.lastBuild({
-            name: this.$stateParams.buildName,
-            number: this.$stateParams.buildNumber
-        }).$promise.then((data) => {
-            //
-            this.$location.path('/builds/'+this.$stateParams.buildName+'/'+this.$stateParams.buildNumber+'/'+data.time+'/general/')
-        });
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/builds/builds_locate/builds_locate.html b/web/angular-web/src/main/webapp/app/states/builds/builds_locate/builds_locate.html
deleted file mode 100644
index 0aa2c0c..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/builds_locate/builds_locate.html
+++ /dev/null
@@ -1,8 +0,0 @@
-<div class="card-side-pad">
-    <h2>{{ BuildsHistory.buildTitle }}</h2>
-
-    <jf-grid grid-options="BuildsHistory.buildsHistoryGridOption"
-             filter-field="buildNumber"
-             filter-on-change="true">
-    </jf-grid>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/states/builds/constants/builds.constants.js b/web/angular-web/src/main/webapp/app/states/builds/constants/builds.constants.js
deleted file mode 100644
index b8e6ac8..0000000
--- a/web/angular-web/src/main/webapp/app/states/builds/constants/builds.constants.js
+++ /dev/null
@@ -1,39 +0,0 @@
-export default {
-    tabs: {
-        'general': 'General Build Info',
-        'published': 'Published Modules',
-        'environment': 'Environment',
-        'issues': 'Issues',
-        'licenses':'Licenses',
-        'governance':'Governance',
-        'diff':'Diff',
-        'history':'Release History',
-        'json':'Build Info JSON'
-    },
-    generalInfo : {
-        buildName: 'Name',
-        buildNumber: 'Number',
-        agent: 'Agent',
-        buildAgent: 'Build Agent',
-        lastBuildTime: 'Started',
-        duration: 'Duration',
-        principal: 'Principal',
-        artifactoryPrincipal: 'Artifactory Principal',
-        url: 'URL'
-    },
-    releaseHistory: {
-        repository: 'Repository',
-        comment: 'Comment',
-        ciUser: 'CI User',
-        user: 'Artifactory User'
-    },
-    governance: {
-        codeCenterApp: {
-            name: 'Name',
-            version: 'Version',
-            description: 'Description',
-            approvalStatus: 'ApprovalStatus',
-            owner: 'Owner User'
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/change_password/change_password.controller.js b/web/angular-web/src/main/webapp/app/states/change_password/change_password.controller.js
deleted file mode 100644
index a0fb158..0000000
--- a/web/angular-web/src/main/webapp/app/states/change_password/change_password.controller.js
+++ /dev/null
@@ -1,27 +0,0 @@
-export class ChangePasswordController {
-
-    constructor(UserDao, $state, $stateParams) {
-        this.$state = $state;
-        this.userDao = UserDao.getInstance();
-        this.fields = {};
-        this.username = $stateParams.username;
-    }
-
-    passwordsMatch() {
-        return this.fields.newPassword === this.fields.retypeNewPassword;
-    }
-
-    change() {
-        this.userDao.changePassword({},{
-            userName: this.username,
-            oldPassword: this.fields.oldPassword,
-            newPassword1: this.fields.newPassword,
-            newPassword2: this.fields.retypeNewPassword
-        }).$promise.then((res)=>{
-            if (res.status === 200) {
-                this.$state.go('login');
-            }
-
-        })
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/states/change_password/change_password.html b/web/angular-web/src/main/webapp/app/states/change_password/change_password.html
deleted file mode 100644
index 356ef54..0000000
--- a/web/angular-web/src/main/webapp/app/states/change_password/change_password.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<div class="center-login">
-    <form name="ChangePassword.changePasswordForm" class="jumbotron login-form change-password-form" ng-submit="ChangePassword.change()" novalidate id="login-form">
-        <div class="login-inner">
-            <h3>Your Password Has Expired.<br>Change Password:</h3>
-            <div class="form-group">
-                <div class="form-group-cell">
-                    <jf-field validations="users" autofocus="true">
-                        <input type="password"
-                               name="oldPassword"
-                               ng-model="ChangePassword.fields.oldPassword"
-                               class="input-text"
-                               placeholder="Old Password *"
-                               id="oldPassword"
-                               required>
-                    </jf-field>
-                </div>
-            </div>
-            <div class="form-group">
-                <div class="form-group-cell">
-                    <jf-field validations="users">
-                        <input type="password"
-                               name="newPassword"
-                               ng-model="ChangePassword.fields.newPassword"
-                               class="input-text"
-                               minlength="4"
-                               placeholder="New Password *"
-                               id="newPassword"
-                               required>
-                    </jf-field>
-                </div>
-            </div>
-            <div class="form-group">
-                <div class="form-group-cell">
-                    <jf-field validations="users">
-                        <input type="password"
-                               name="retypeNewPassword"
-                               ng-model="ChangePassword.fields.retypeNewPassword"
-                               class="input-text"
-                               placeholder="Retype New Password *"
-                               id="password"
-                               required>
-                    </jf-field>
-                    <div class="jf-form-errors preserve-lb" ng-if="ChangePassword.fields.newPassword && ChangePassword.fields.retypeNewPassword && ChangePassword.fields.retypeNewPassword !== ChangePassword.fields.newPassword">Passwords do not match</div>
-                </div>
-            </div>
-
-        </div>
-
-        <div class="login-button-bar">
-            <button type="submit" class="btn btn-primary pull-right" ng-disabled="!ChangePassword.changePasswordForm.$valid || !ChangePassword.passwordsMatch()" id="login">
-                Change Password
-            </button>
-        </div>
-    </form>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/states/change_password/change_password.module.js b/web/angular-web/src/main/webapp/app/states/change_password/change_password.module.js
deleted file mode 100644
index 85dc7ab..0000000
--- a/web/angular-web/src/main/webapp/app/states/change_password/change_password.module.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import {ChangePasswordController} from './change_password.controller';
-
-function changePasswordConfig ($stateProvider) {
-    $stateProvider
-            .state('change-password', {
-                url: '/change-password',
-                templateUrl: 'states/change_password/change_password.html',
-                controller: 'ChangePasswordController as ChangePassword',
-                parent: 'login-layout',
-                params: {username: ''},
-            })
-}
-
-export default angular.module('login', [])
-        .config(changePasswordConfig)
-        .controller('ChangePasswordController', ChangePasswordController);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/forbidden_403/forbidden_403.html b/web/angular-web/src/main/webapp/app/states/forbidden_403/forbidden_403.html
deleted file mode 100644
index e2277fd..0000000
--- a/web/angular-web/src/main/webapp/app/states/forbidden_403/forbidden_403.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<div class="error_page">
-    <div class="forbidden">
-        <h1>403 Forbidden<img src="images/403_image.svg" alt="" class="forbidden_image" /></h1>
-        <p>We're sorry but you do not have the access to this page.</p>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/forbidden_403/forbidden_403.module.js b/web/angular-web/src/main/webapp/app/states/forbidden_403/forbidden_403.module.js
deleted file mode 100644
index 3e1e8ec..0000000
--- a/web/angular-web/src/main/webapp/app/states/forbidden_403/forbidden_403.module.js
+++ /dev/null
@@ -1,12 +0,0 @@
-function forbidden403 ($stateProvider) {
-
-    $stateProvider
-        .state('forbidden_403', {
-            url: '/403',
-            templateUrl: 'states/forbidden_403/forbidden_403.html',
-            parent: 'app-layout',
-        })
-}
-
-export default angular.module('forbidden_403', [])
-    .config(forbidden403)
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/forgot_password/forgot_password.controller.js b/web/angular-web/src/main/webapp/app/states/forgot_password/forgot_password.controller.js
deleted file mode 100644
index fce06e1..0000000
--- a/web/angular-web/src/main/webapp/app/states/forgot_password/forgot_password.controller.js
+++ /dev/null
@@ -1,39 +0,0 @@
-import EVENTS     from '../../constants/common_events.constants';
-
-const EMAIL_SENT_MESSAGE = "Reset password email was sent. \nDidn't received it? Contact your system administrator.";
-
-export class ForgotPasswordController {
-
-    constructor($state, User, ArtifactoryNotifications, ArtifactoryEventBus) {
-        this.user = {};
-        this.UserService = User;
-        this.$state = $state;
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.forgotPasswordForm = null;
-        this.message = '';
-    }
-
-    forgot() {
-        let self = this;
-
-        this.artifactoryEventBus.dispatch(EVENTS.FORM_SUBMITTED);
-        if (this.forgotPasswordForm.$valid) {
-            this.pending = true;
-            this.UserService.forgotPassword(this.user).then(success, error)
-        } else {
-            form.user.$dirty = true;
-        }
-
-        function success(result) {
-            self.pending = false;
-            self.$state.go('login');
-            self.artifactoryNotifications.create({info: EMAIL_SENT_MESSAGE});
-        }
-
-        function error(errors) {
-            self.pending = false;
-            self.$state.go('login');
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/forgot_password/forgot_password.html b/web/angular-web/src/main/webapp/app/states/forgot_password/forgot_password.html
deleted file mode 100644
index ff219ff..0000000
--- a/web/angular-web/src/main/webapp/app/states/forgot_password/forgot_password.html
+++ /dev/null
@@ -1,35 +0,0 @@
- <div class="center-login">
-
-        <form name="ForgotPassword.forgotPasswordForm" class="jumbotron login-form" ng-submit="ForgotPassword.forgot()" novalidate>
-
-            <a class="pull-right close-button" ui-sref="login" jf-clear-errors>✕</a>
-
-            <div class="login-inner">
-                <h3>Forgot Password</h3>
-
-                <div class="form-group">
-
-                    <div class="form-group">
-
-                        <jf-field validations="users" autofocus="true">
-                            <input name="user"
-                                   type="text"
-                                   ng-model="ForgotPassword.user.user"
-                                   ng-maxlength="100"
-                                   class="input-text"
-                                   placeholder="Username *"
-                                   required
-                                   id="user">
-                        </jf-field>
-                    </div>
-
-                </div>
-
-            </div>
-
-            <div class="login-button-bar">
-                <button type="submit" class="btn btn-primary pull-right" ng-disabled="!ForgotPassword.forgotPasswordForm.$valid || ForgotPassword.pending">Submit</button>
-            </div>
-        </form>
-    </div>
-
diff --git a/web/angular-web/src/main/webapp/app/states/forgot_password/forgot_password.module.js b/web/angular-web/src/main/webapp/app/states/forgot_password/forgot_password.module.js
deleted file mode 100644
index 0de5d79..0000000
--- a/web/angular-web/src/main/webapp/app/states/forgot_password/forgot_password.module.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import {ForgotPasswordController} from './forgot_password.controller.js';
-import {ResetPasswordController} from './reset_password.controller.js';
-
-function forgotPasswordConfig ($stateProvider) {
-    $stateProvider
-
-            .state('forgot-password', {
-                url: '/forgot-password',
-                templateUrl: 'states/forgot_password/forgot_password.html',
-                controller: 'ForgotPasswordController as ForgotPassword',
-                parent: 'login-layout'
-            })
-
-            .state('reset-password', {
-                url: '/resetpassword?key',
-                templateUrl: 'states/forgot_password/reset_password.html',
-                controller: 'ResetPasswordController as ResetPassword',
-                parent: 'login-layout'
-            })
-}
-
-export default angular.module('forgotPassword', [])
-        .config(forgotPasswordConfig)
-        .controller('ForgotPasswordController', ForgotPasswordController)
-        .controller('ResetPasswordController', ResetPasswordController);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/forgot_password/reset_password.controller.js b/web/angular-web/src/main/webapp/app/states/forgot_password/reset_password.controller.js
deleted file mode 100644
index b41c689..0000000
--- a/web/angular-web/src/main/webapp/app/states/forgot_password/reset_password.controller.js
+++ /dev/null
@@ -1,52 +0,0 @@
-import EVENTS     from '../../constants/common_events.constants';
-
-const PASSWORD_CHANGED_MESSAGE = 'Password changed successfully';
-
-export class ResetPasswordController {
-
-    constructor($stateParams, User, $state, ArtifactoryNotifications, ArtifactoryEventBus, $timeout) {
-        this.$stateParams = $stateParams;
-        this.userService = User;
-        this.$state = $state;
-        this.key = $stateParams.key;
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.ResetPasswordForm = null;
-        this.$timeout = $timeout;
-        this.user = {};
-    }
-
-    resetPassword() {
-        var self = this;
-
-        this.artifactoryEventBus.dispatch(EVENTS.FORM_SUBMITTED);
-
-        if (this.ResetPasswordForm.$valid) {
-            this.userService.validateKey(this.key).then(success, error);
-        }
-
-        function success(response) {
-            if (response.data.user) {
-                self.user.user = response.data.user;
-                self.userService.resetPassword(self.key, self.user).then(function (response) {
-                    self.artifactoryNotifications.create(response.data);
-                    self.$state.go('login');
-                });
-            }
-        }
-
-        function error(errors) {
-            if (errors.data.error) {
-                self.artifactoryNotifications.create({error: errors.data.error});
-            }
-        }
-    }
-
-    checkMatchingPasswords() {
-        this.$timeout(() => {
-            if (this.ResetPasswordForm.password.$valid && this.ResetPasswordForm.repeatPassword.$valid) {
-                this.artifactoryEventBus.dispatch(EVENTS.FORM_CLEAR_FIELD_VALIDATION);
-            }
-        });
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/forgot_password/reset_password.html b/web/angular-web/src/main/webapp/app/states/forgot_password/reset_password.html
deleted file mode 100644
index 2ee24f0..0000000
--- a/web/angular-web/src/main/webapp/app/states/forgot_password/reset_password.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<div class="center-login">
-
-    <form name="ResetPassword.ResetPasswordForm" ng-submit="ResetPassword.resetPassword()" class="jumbotron login-form">
-
-
-        <a class="pull-right close-button" ui-sref="login">✕</a>
-
-        <div class="login-inner">
-            <h3>Reset Password</h3>
-
-            <div class="form-group">
-
-                <div class="form-group">
-
-                    <jf-field validations="users" autofocus="true">
-                        <input name="password"
-                               type="password"
-                               ng-model="ResetPassword.user.password"
-                               ng-blur="ResetPassword.checkMatchingPasswords()"
-                               ng-model-options="{updateOn: 'blur'}"
-                               required
-                               ng-minlength="4"
-                               class="input-text"
-                               placeholder="Password*"
-                               id="password">
-                    </jf-field>
-                </div>
-
-            </div>
-
-            <div class="form-group">
-                <div class="form-group-cell">
-
-                    <jf-field validations="users">
-                        <input name="repeatPassword"
-                               type="password"
-                               ui-validate="'$value==ResetPassword.user.password'"
-                               ui-validate-watch="'ResetPassword.user.password'"
-                               ng-model="ResetPassword.repeatPassword"
-                               required
-                               placeholder="Retype Password*"
-                               class="input-text"
-                               id="repeatpassword">
-                    </jf-field>
-
-                </div>
-
-
-            </div>
-
-        </div>
-
-        <div class="login-button-bar">
-            <button type="submit"
-                    class="btn btn-primary pull-right"
-                    ng-disabled="ResetPassword.ResetPasswordForm.$error.required || ResetPassword.repeatPassword !== ResetPassword.user.password">Submit</button>
-        </div>
-    </form>
-</div>
-
diff --git a/web/angular-web/src/main/webapp/app/states/home/home.controller.js b/web/angular-web/src/main/webapp/app/states/home/home.controller.js
deleted file mode 100644
index 36c197f..0000000
--- a/web/angular-web/src/main/webapp/app/states/home/home.controller.js
+++ /dev/null
@@ -1,104 +0,0 @@
-export class HomeController {
-    constructor(HomePageDao, $scope, $timeout, User) {
-        this.$scope = $scope;
-        this.$timeout = $timeout;
-        this.userService = User;
-        this.offlineMode = this.userService.getCurrent().offlineMode;
-
-        this.homePageDao = HomePageDao;
-        this.homepageData = {};
-        this.allAddons = {};
-        this.addons = {};
-        this.initHomePage();
-
-        this.tabOptions = ['All', 'Package Management', 'Features', 'Ecosystem', 'Available'];
-        this.currentType = this.tabOptions[0];
-
-        this.showNews = false;
-    }
-
-    initHomePage() {
-        if (!this.offlineMode) this.readUpdateHTML();
-        this.homePageDao.get().$promise.then((data)=> {
-            this.homepageData = data;
-            this.allAddons = data.addons;
-
-            this.sortByCurrentType();
-        });
-    }
-
-    animateAddons() {
-        var count = 0, animationInterval = 30
-        $(".addon-icon")
-                .removeClass('swelling')
-                .each(function() {
-                    setTimeout(function() {
-                        $(this).addClass('swelling')
-                    }.bind(this), count)
-                    count += animationInterval
-                })
-    }
-
-    sortByCurrentType() {
-        this.addons = _.filter(this.allAddons, (addon)=> {
-            return addon.categories.indexOf(this._camelize(this.currentType)) !== -1;
-        });
-        $(".addon-icon")
-                .removeClass('swelling')
-
-        // Commented out until we get a clearance from Yoav
-        // setTimeout(this.animateAddons.bind(this),100)
-
-        this.$timeout(()=>{
-            this.freezeSwitchMenu();
-        });
-
-    }
-
-    _camelize(str) {
-        return str.replace(/(?:^\w|[A-Z]|\b\w)/g, function (letter, index) {
-            return index == 0 ? letter.toLowerCase() : letter.toUpperCase();
-        }).replace(/\s+/g, '');
-    }
-
-    readUpdateHTML() {
-        var xhr = new XMLHttpRequest();
-        xhr.open('GET', 'https://service.jfrog.org/artifactory/updatesv4', true);
-        xhr.onreadystatechange= ()=>{
-            this.updateHTML=xhr.response;
-            this.$scope.$apply();
-
-            //twitter button javascript !
-            !function(d,s,id){
-                var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';
-                if(!d.getElementById(id)){
-                    js=d.createElement(s);
-                    js.id=id;js.src=p+'://platform.twitter.com/widgets.js';
-                    fjs.parentNode.insertBefore(js,fjs);
-                }
-            }(document, 'script', 'twitter-wjs');
-
-            this.$scope.$on('$destroy', () => {
-                let twitter = document.getElementById('twitter-wjs');
-                if (twitter) twitter.remove();
-            });
-
-            if(xhr.response) {
-                this.$timeout(()=>{
-                    this.showNews = true;
-                },200);
-            }
-        };
-        xhr.send();
-    }
-
-    freezeSwitchMenu() {
-            let swichMenu = $('.jf-switch');
-            swichMenu.css({
-                position: 'fixed',
-                width: $('.card.stretch').prop("clientWidth")
-            });
-            $('.addon-list').css('padding-top', 100);
-    }
-
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/home/home.html b/web/angular-web/src/main/webapp/app/states/home/home.html
deleted file mode 100644
index ad222d4..0000000
--- a/web/angular-web/src/main/webapp/app/states/home/home.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<div class="content-layout-container home-page">
-    <div class="home-page-head">
-        <div class="home-page-intro">
-            <div class="jfrog-news" ng-show="Home.showNews">
-                <div class="headline">
-                    JFrog News<i class="icon icon-megaphone-on"></i>
-
-                    <div class="twitter-follow"><a href="https://twitter.com/jfrog" class="twitter-follow-button" data-show-count="false"></a></div>
-                </div>
-                <div class="news-content" ng-bind-html="Home.updateHTML"></div>
-            </div>
-
-            <h3>JFrog Artifactory is happily serving <span class="number-artifacts">{{Home.homepageData.artifacts | number}}</span> artifacts</h3>
-            <p jf-hide-for-aol class="artifactory-version">
-                Artifactory Version {{Home.homepageData.version}} <a ng-if="Home.homepageData.latestRelease" target="_blank" ng-href="{{Home.homepageData.latestReleaseLink}}">(latest release is
-                {{Home.homepageData.latestRelease}})</a>
-            </p>
-
-            <p jf-hide-for-aol class="artifactory-version" ng-if="Home.homepageData.upTime">
-                Uptime is {{Home.homepageData.upTime}}
-            </p>
-            <p ng-if="Home.homepageData.displayAccountManagementLink" class="artifactory-version">
-                <a target="_blank" ng-href="{{Home.homepageData.accountManagementLink}}">
-                    <i class="icon icon-padlock"></i>Log in to account management
-                </a>
-            </p>
-        </div>
-    </div>
-
-    <div class="content-wrapper">
-        <div class="card stretch">
-            <div class="text-center">
-                <jf-switch ng-model="Home.currentType"
-                           options="Home.tabOptions"
-                           ng-change="Home.sortByCurrentType()"></jf-switch>
-            </div>
-
-            <ul class="addon-list">
-                <li ng-class="{'license-required': addon.status != 'Available'}"
-                    ng-repeat="addon in Home.addons track by $index"
-                    ng-mouseleave="addon.mouseover = false"
-                    data-index="{{$index}}"
-                    class="addon-container" jf-disable-ng-animate>
-                    <div class="addon-icon iconrepo iconrepo-{{addon.name}}"></div>
-                    <div class="addon-name">{{addon.displayName}}</div>
-                    <div class="addon-status" ng-class="{available: addon.status == 'Available'}">{{addon.status}}</div>
-                    <div class="addon-links">
-                        <a ng-href="{{addon.learnMoreUrl}}" target="_blank">More Info</a>
-                        <span>·</span>
-                        <a ng-href="{{addon.configurationUrl}}" target="_blank">User Guide</a>
-                    </div>
-                </li>
-            </ul>
-        </div>
-    </div>
-</div>
-
-<div id="home-disclaimer">
-    Other than JFrog's trademarks, marks and logos, all other trademarks displayed in this application are owned
-    by their respective holders. JFrog is not sponsored by, endorsed by or affiliated with the holders of these
-    trademarks. More info here - <a target=_blank" href="http://www.jfrog.com/artifactory/artifactory-cloud">Terms of Use</a>,
-    <a target=_blank" href="http://www.jfrog.com/artifactory/artifactory-pro/">EULA</a>.
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/home/home.module.js b/web/angular-web/src/main/webapp/app/states/home/home.module.js
deleted file mode 100644
index e1490b8..0000000
--- a/web/angular-web/src/main/webapp/app/states/home/home.module.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import {HomeController} from "./home.controller";
-
-function homeConfig ($stateProvider) {
-
-    $stateProvider
-            .state('home', {
-                url: '/home',
-                parent: 'app-layout',
-                templateUrl: 'states/home/home.html',
-                controller: 'HomeController as Home'
-            })
-}
-
-export default angular.module('home', [])
-        .config(homeConfig)
-        .controller('HomeController', HomeController)
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/login/login.controller.js b/web/angular-web/src/main/webapp/app/states/login/login.controller.js
deleted file mode 100644
index c3974ed..0000000
--- a/web/angular-web/src/main/webapp/app/states/login/login.controller.js
+++ /dev/null
@@ -1,115 +0,0 @@
-import EVENTS     from '../../constants/common_events.constants';
-
-export class LoginController {
-
-    constructor($state, $stateParams, User, $location, $window, ArtifactoryState, ArtifactoryEventBus, ArtifactoryNotifications) {
-        this.user = {};
-        this.rememberMe = false;
-        this.UserService = User;
-        this.$state = $state;
-        this.$window = $window;
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this.$location = $location;
-        this.ArtifactoryState = ArtifactoryState;
-        this.canResetPassword = false;
-        this.canRememberMe = false;
-        this.loginForm = null;
-        this.pending = false;
-
-        this.canExit = (User.currentUser.name !== 'anonymous' || User.currentUser.anonAccessEnabled);
-
-        this.oauth = {}
-        User.getOAuthLoginData().then((response) => {
-            this.oauth.providers = response;
-        });
-
-        if ($stateParams.oauthError) this.errorMessage = $stateParams.oauthError;
-
-        this.checkResetPassword();
-    }
-
-    login() {
-
-        this.artifactoryEventBus.dispatch(EVENTS.FORM_SUBMITTED);
-
-        if (this.loginForm.$valid && !this.pending) {
-            this.pending = true;
-            this.UserService.login(this.user, this.rememberMe).then(success.bind(this), error.bind(this))
-        }
-
-        function success(result) {
-            this.pending = false;
-            this.user = result.data;
-            let urlAfterLogin = this.ArtifactoryState.getState('urlAfterLogin');
-            if (urlAfterLogin) {
-                this.$location.path(urlAfterLogin)
-            }
-            else {
-                this.$state.go('home');
-            }
-        }
-
-        function error(response) {
-            this.pending = false;
-            if (response.data) {
-                if (!this.catchExpired(response)) {
-                    this.errorMessage = response.data.error;
-                }
-            }
-        }
-
-    }
-
-    catchExpired(response) {
-        let code = 'CREDENTIALS_EXPIRED';
-        if (response.data && response.data.code && response.data.code === code) {
-            let msg = response.data.feedbackMsg.error;
-            if (response.data.profileUpdatable) {
-                this.$state.go('change-password', {username: this.user.user});
-            }
-            else {
-                msg += '.\nPlease contact your system administrator.'
-                this.artifactoryNotifications.create({error: msg});
-            }
-            return true;
-        }
-        return false;
-    }
-
-    userPasswordChanged() {
-        this.errorMessage = null;
-    }
-
-
-    checkResetPassword() {
-        this.UserService.getLoginData().then((response) => {
-            this.canResetPassword = response.forgotPassword;
-            this.canRememberMe = response.canRememberMe;
-            this.ssoProviderLink = response.ssoProviderLink;
-            this.oauthProviderLink = response.oauthProviderLink;
-        });
-    }
-
-    gotoForgotPwd() {
-        this.$state.go('forgot-password');
-    }
-
-/*
-    oauthLogin() {
-        this.$window.open(this.oauthProviderLink,'_self');
-    }
-*/
-
-    ssoLogin() {
-        this.$window.open(this.ssoProviderLink,'_self');
-    }
-
-    isOAuthEnabled() {
-        return this.oauth.providers && this.oauth.providers.length > 0;
-    }
-
-    onGotoOAuth() {
-        localStorage.stateBeforeOAuth = this.$state.current.name;
-    }
-}
diff --git a/web/angular-web/src/main/webapp/app/states/login/login.html b/web/angular-web/src/main/webapp/app/states/login/login.html
deleted file mode 100644
index 1114077..0000000
--- a/web/angular-web/src/main/webapp/app/states/login/login.html
+++ /dev/null
@@ -1,74 +0,0 @@
-<div class="center-login">
-    <form name="Login.loginForm" class="jumbotron login-form" ng-submit="Login.login()" novalidate id="login-form">
-        <a ng-if="Login.canExit" class="pull-right close-button" ui-sref="home">✕</a>
-        <div class="login-inner">
-            <h3>Welcome to JFrog Artifactory!</h3>
-            <div class="form-group">
-                <div class="form-group-cell">
-                    <jf-field validations="users" autofocus="true">
-                        <input name="user"
-                               type="text"
-                               ng-model="Login.user.user"
-                               class="input-text"
-                               placeholder="Username *"
-                               ng-change="Login.userPasswordChanged()"
-                               required
-                               id="user">
-                    </jf-field>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'no-margin-bottom': Login.errorMessage}">
-                <div class="form-group-cell">
-                    <jf-field validations="users">
-                        <input type="password"
-                               name="password"
-                               ng-model="Login.user.password"
-                               class="input-text"
-                               placeholder="Password *"
-                               ng-change="Login.userPasswordChanged()"
-                               id="password"
-                               required>
-                    </jf-field>
-                </div>
-            </div>
-
-            <div class="jf-form-errors preserve-lb" ng-if="Login.errorMessage" ng-bind="Login.errorMessage"></div>
-
-            <div class="form-group form-checkbox" ng-if="Login.canRememberMe">
-                <div class="form-group-cell">
-                    <a href tabindex="-1" ng-click="Login.gotoForgotPwd()" jf-clear-errors ng-if="Login.canResetPassword" id="forgot-password">Forgot Password?</a>
-
-
-                </div>
-            </div>
-            <div class="form-group oauth-login" ng-if="Login.isOAuthEnabled() || Login.ssoProviderLink">
-                <div class="form-group-cell">
-                    <div class="oauth-login-title">Or sign in with:</div>
-                    <div class="oauth-login-links-container">
-
-                        <a ng-repeat="provider in Login.oauth.providers" ng-if="Login.isOAuthEnabled()" ng-mousedown="Login.onGotoOAuth()" ng-href="{{provider.url}}" class="icon-oauth-{{provider.type.toLowerCase()}}" jf-clear-errors>
-                            <span jf-tooltip="Login to {{provider.name}}">{{provider.name}}</span>
-                        </a>
-
-                        <a href
-                           ng-click="Login.ssoLogin()"
-                           jf-clear-errors
-                           target="_blank"
-                           id="sso-login"
-                           ng-if="Login.ssoProviderLink"
-                           class="icon-oauth-sso"><span>SAML SSO</span></a>
-                    </div>
-                </div>
-            </div>
-        </div>
-
-        <div class="login-button-bar">
-            <jf-checkbox text="Remember me" tabindex="2" class="remember-me">
-                <input type="checkbox" id="remember-me" ng-model="Login.rememberMe">
-            </jf-checkbox>
-            <button type="submit" class="btn btn-primary pull-right" ng-disabled="!Login.loginForm.$valid || Login.pending" id="login">
-                Log In
-            </button>
-        </div>
-    </form>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/states/login/login.module.js b/web/angular-web/src/main/webapp/app/states/login/login.module.js
deleted file mode 100644
index 90b9456..0000000
--- a/web/angular-web/src/main/webapp/app/states/login/login.module.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import {LoginController} from './login.controller';
-
-function loginCOnfig ($stateProvider) {
-    $stateProvider
-
-            .state('login', {
-                url: '/login',
-                templateUrl: 'states/login/login.html',
-                controller: 'LoginController as Login',
-                params: {oauthError: null},
-                parent: 'login-layout'
-            })
-}
-
-export default angular.module('changePassword', [])
-        .config(loginCOnfig)
-        .controller('LoginController', LoginController);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/not_found_404/not_found_404.html b/web/angular-web/src/main/webapp/app/states/not_found_404/not_found_404.html
deleted file mode 100644
index 9e870e2..0000000
--- a/web/angular-web/src/main/webapp/app/states/not_found_404/not_found_404.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<div class="error_page">
-    <div>
-        <h1><span>404</span>Page Not Found<img src="images/404_image.svg" alt="" class="notfound_image" /></h1>
-        <p>We're sorry, but the page you requested could not be found.<br/>Please check the URL you were trying to access or contact<br/>your system administrator.</p>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/not_found_404/not_found_404.module.js b/web/angular-web/src/main/webapp/app/states/not_found_404/not_found_404.module.js
deleted file mode 100644
index 7f67d63..0000000
--- a/web/angular-web/src/main/webapp/app/states/not_found_404/not_found_404.module.js
+++ /dev/null
@@ -1,12 +0,0 @@
-function notFound404 ($stateProvider) {
-
-    $stateProvider
-        .state('not_found_404', {
-            url: '/404',
-            templateUrl: 'states/not_found_404/not_found_404.html',
-            parent: 'app-layout',
-        })
-}
-
-export default angular.module('not_found_404', [])
-    .config(notFound404)
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/oauth_error/oauth_error.module.js b/web/angular-web/src/main/webapp/app/states/oauth_error/oauth_error.module.js
deleted file mode 100644
index b9ea3bb..0000000
--- a/web/angular-web/src/main/webapp/app/states/oauth_error/oauth_error.module.js
+++ /dev/null
@@ -1,11 +0,0 @@
-function oauthErrorConfig ($stateProvider) {
-
-    $stateProvider
-            .state('oauth_error', {
-                url: '/oauth_error',
-                parent: 'app-layout',
-            })
-}
-
-export default angular.module('oauth_error', [])
-        .config(oauthErrorConfig)
diff --git a/web/angular-web/src/main/webapp/app/states/server_error/server_error.html b/web/angular-web/src/main/webapp/app/states/server_error/server_error.html
deleted file mode 100644
index 0fd5a01..0000000
--- a/web/angular-web/src/main/webapp/app/states/server_error/server_error.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<div id="server-error">
-    <div class="error-box">
-        <span class="icon icon-notif-warning"></span>
-        <h1>Unable to reach JFrog Artifactory</h1>
-        <p>
-            JFrog Artifactory server is not available.<br/>
-            This issue might be caused due to connection issues.<br/>
-            Please check your network connection and if this problem persists contact your system administrator.
-        </p>
-        <p>Try to refresh <i onclick="location.reload();" class="icon icon-refresh"></i></p>
-    </div>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/states/server_error/server_error.module.js b/web/angular-web/src/main/webapp/app/states/server_error/server_error.module.js
deleted file mode 100644
index 5431aa7..0000000
--- a/web/angular-web/src/main/webapp/app/states/server_error/server_error.module.js
+++ /dev/null
@@ -1,10 +0,0 @@
-function config ($stateProvider) {
-
-    $stateProvider
-            .state('server_error', {
-                templateUrl: 'states/server_error/server_error.html'
-            })
-}
-
-export default angular.module('server_error', [])
-        .config(config)
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/user_profile/user_profile.controller.js b/web/angular-web/src/main/webapp/app/states/user_profile/user_profile.controller.js
deleted file mode 100644
index 07ab643..0000000
--- a/web/angular-web/src/main/webapp/app/states/user_profile/user_profile.controller.js
+++ /dev/null
@@ -1,162 +0,0 @@
-import EVENTS from '../../constants/common_events.constants.js';
-import TOOLTIPS from '../../constants/artifact_tooltip.constant';
-
-export class UserProfileController {
-
-    constructor($state,$scope,UserProfileDao, ArtifactoryFeatures, BintrayDao, SshClientDao, ArtifactoryNotifications, User, ArtifactoryEventBus, ArtifactoryModelSaver, OAuthDao, ArtifactoryGridFactory, ArtifactoryModal) {
-        this.$scope = $scope;
-        this.$state = $state;
-        this.userProfileDao = UserProfileDao;
-        this.bintrayDao = BintrayDao.getInstance();
-        this.sshClientDao = SshClientDao;
-        this.artifactoryNotifications = ArtifactoryNotifications;
-        this.User = User;
-        this.currentUser = User.getCurrent();
-        this.artifactoryEventBus = ArtifactoryEventBus;
-        this.artifactoryGridFactory = ArtifactoryGridFactory;
-        this.OAuthDao = OAuthDao;
-        this.features = ArtifactoryFeatures;
-        this.artifactoryModelSaver = ArtifactoryModelSaver.createInstance(this,['userInfo'],['apiKey']);
-        this.modal = ArtifactoryModal;
-
-        this.userInfo = {};
-        this.currentPassword = null;
-        this.showUserApiKey = false;
-        this.showBintrayApiKey = false;
-        this.profileLocked = true;
-
-        this.tooltips = TOOLTIPS.userProfile;
-
-
-        if(this.currentUser.name=='anonymous'){
-            $state.go('login');
-        }
-
-        $('body').addClass('load-complete');
-
-        if (this.User.currentUser.requireProfileUnlock === false && this.User.currentUser.existsInDB) {
-            this.unlock();
-        }
-    }
-
-    unlock() {
-        this.userProfileDao.fetch({password: this.User.currentUser.requireProfileUnlock === true ? this.currentPassword : ''}).$promise
-            .then(response => {
-                this.userInfo = response.data;
-                    this.artifactoryModelSaver.save();
-                //console.log(this.userInfo);
-                this.profileLocked = false;
-
-                if (!this.features.isOss()) {
-                    this._initOAuthData();
-                }
-
-                this._getApiKey();
-
-            });
-    }
-
-    _getApiKey() {
-        this.userProfileDao.getApiKey().$promise.then((res)=>{
-            this.userInfo.apiKey = res.apiKey;
-        });
-    }
-
-
-    revokeApiKey() {
-        this.modal.confirm(`Are you sure you want to revoke your API key?`)
-                .then(() => {
-                    this.userProfileDao.revokeApiKey().$promise.then((res)=> {
-                        this._getApiKey();
-                    });
-                });
-    }
-    regenerateApiKey() {
-        this.userProfileDao.regenerateApiKey().$promise.then((res)=>{
-            if (res.apiKey) {
-                this.artifactoryNotifications.create({info: 'Successfully regenerated API key'});
-                this.userInfo.apiKey = res.apiKey;
-            }
-            else {
-                this.artifactoryNotifications.create({error: 'Failed to regenerate API key'});
-            }
-        });
-    }
-    generateApiKey() {
-        this.userProfileDao.getAndCreateApiKey().$promise.then((res)=>{
-            if (res.apiKey) {
-                this.artifactoryNotifications.create({info: 'Successfully generated API key'});
-                this.userInfo.apiKey = res.apiKey;
-            }
-            else {
-                this.artifactoryNotifications.create({error: 'Failed to generate API key'});
-            }
-        });
-    }
-
-    _initOAuthData() {
-
-        this.oauth = {};
-
-        this.User.getOAuthLoginData().then((response) => {
-            this.oauth.providers = response;
-
-            this.OAuthDao.getUserTokens().$promise.then((data)=>{
-                data.forEach((providerName) => {
-                    let provider = _.findWhere(this.oauth.providers, {name: providerName});
-                    if (provider) {
-                        provider.binded = true;
-                    }
-                });
-            });
-        });
-
-    }
-
-    unbindOAuthProvider(providerName) {
-        this.OAuthDao.deleteUserToken({},{username: this.currentUser.name, provider: providerName}).$promise.then((res)=>{
-            this._initOAuthData();
-        });
-    }
-
-    save() {
-        if (this.userInfo.user.newPassword && this.userInfo.user.newPassword !== this.userInfo.user.retypePassword) {
-            this.artifactoryNotifications.create({error: 'Passwords do not match'});
-            return;
-        }
-
-        let params = {
-            user: {
-                email: this.userInfo.user.email,
-                password: this.userInfo.user.newPassword
-            },
-            bintray: this.userInfo.bintray,
-            ssh: this.userInfo.ssh
-        };
-        this.userProfileDao.update(params).$promise.then(()=>{
-            this.artifactoryModelSaver.save();
-            this.changePassword = false;
-            this.clearPasswordFields();
-            this.User.reload();
-        });
-    }
-
-    clearPasswordFields() {
-        delete this.userInfo.user.newPassword;
-        delete this.userInfo.user.retypePassword;
-    }
-
-    testBintray() {
-        this.artifactoryEventBus.dispatch(EVENTS.FORM_SUBMITTED, this.bintrayForm.$name);
-        this.bintrayDao.fetch(this.userInfo.bintray);
-    }
-
-    isOAuthEnabled() {
-        return this.oauth && this.oauth.providers && this.oauth.providers.length > 0 && this.userInfo.user.realm === 'internal';
-    }
-
-    onGotoOAuth() {
-        localStorage.stateBeforeOAuth = this.$state.current.name;
-    }
-
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/user_profile/user_profile.html b/web/angular-web/src/main/webapp/app/states/user_profile/user_profile.html
deleted file mode 100644
index b4218f6..0000000
--- a/web/angular-web/src/main/webapp/app/states/user_profile/user_profile.html
+++ /dev/null
@@ -1,330 +0,0 @@
-<div class="content-layout-container">
-    <h1>User Profile: {{ UserProfile.currentUser.name}}</h1>
-
-    <div class="content-wrapper">
-        <div class="card stretch card-pole-pad card-side-pad">
-            <div class="content-with-footer">
-                <form name="UserProfile.unlockform"
-                      ng-submit="UserProfile.unlock()"
-                      ng-if="UserProfile.User.currentUser.existsInDB && UserProfile.User.currentUser.requireProfileUnlock && UserProfile.User.currentUser.requireProfilePassword && UserProfile.profileLocked">
-                    <div class="form-group current-password">
-                        <div class="form-group-cell">
-                            <jf-field validations="users" autofocus="true">
-                                <label>Current Password</label>
-                                <input type="password"
-                                       class="input-text"
-                                       ng-model="UserProfile.currentPassword"
-                                       name="password"
-                                       required/>
-                            </jf-field>
-                        </div>
-                        <div class="form-group-cell margin-top-25">
-                            <button
-                                    type="submit"
-                                    ng-disabled="UserProfile.unlockForm.$invalid"
-                                    class="btn btn-primary">
-                                Unlock
-                            </button>
-                        </div>
-                    </div>
-                    <div class="alert alert-info">Insert the password and press the Unlock button to edit the profile.</div>
-                </form>
-                <div class = "alert alert-warning"
-                     ng-if="!UserProfile.User.currentUser.existsInDB || (UserProfile.User.currentUser.requireProfileUnlock && !UserProfile.User.currentUser.requireProfilePassword)">
-                    You must have an internal user with password to access user profile page.
-                </div>
-                <div class = "alert alert-warning"
-                     ng-if="UserProfile.User.currentUser.currentPasswordValidFor <= 10 && !UserProfile.profileLocked">
-                    Your password will expire in {{UserProfile.User.currentUser.currentPasswordValidFor}} days.
-                    <span ng-if="!UserProfile.userInfo.user.profileUpdatable"><br>Please contact your system administrator.</span>
-                </div>
-
-                <jf-panel jf-panel-heading="Personal Settings" ng-if="UserProfile.userInfo.user.profileUpdatable && UserProfile.User.currentUser.requireProfileUnlock">
-                    <div ng-class="{disabled: UserProfile.profileLocked}">
-                        <form name="UserProfile.userForm" ng-submit="UserProfile.save()">
-
-                            <div class="form-group">
-                                <div class="form-group-cell">
-                                    <jf-field validations="users">
-                                        <label class="mandatory">Email Address</label>
-                                        <input type="email"
-                                               class="input-text"
-                                               ng-model="UserProfile.userInfo.user.email"
-                                               ng-disabled="UserProfile.profileLocked"
-                                               name="email"
-                                               required/>
-                                    </jf-field>
-                                </div>
-                            </div>
-<!--
-                            <button type="button"
-                                    class="btn btn-secondary"
-                                    ng-if="!UserProfile.changePassword"
-                                    ng-click="UserProfile.changePassword = true;">Change Password
-                            </button>
--->
-                            <jf-panel jf-panel-heading="Change Password"
-                                      ng-if="!UserProfile.userInfo.user.internalPasswordDisabled">
-                                <div class="form-group">
-                                    <div class="form-group-cell">
-                                        <jf-field validations="users">
-                                            <label>New Password</label>
-                                            <input type="password"
-                                                   class="input-text"
-                                                   ng-model="UserProfile.userInfo.user.newPassword"
-                                                   minlength="4"
-                                                   ng-disabled="UserProfile.profileLocked"
-                                                   name="newPassword"
-                                                    />
-                                        </jf-field>
-                                    </div>
-                                    <div class="form-group-cell margin-top-25">
-                                        <label class="no-margin-bottom">Password Strength</label>
-                                        <div ng-password-strength="UserProfile.userInfo.user.newPassword" strength="passStrength" mode="bootstrap"></div>
-                                    </div>
-                                </div>
-                                <div class="form-group">
-                                    <div class="form-group-cell">
-                                        <jf-field validations="users">
-                                            <label>Retype Password</label>
-                                            <input type="password"
-                                                   class="input-text"
-                                                   ui-validate="'$value==UserProfile.userInfo.user.newPassword'"
-                                                   ui-validate-watch="'UserProfile.userInfo.user.newPassword'"
-                                                   ng-model="UserProfile.userInfo.user.retypePassword"
-                                                   ng-disabled="UserProfile.profileLocked"
-                                                   name="retypePassword"
-                                                    />
-                                        </jf-field>
-                                    </div>
-<!--
-                                    <div class="form-group-cell margin-top-25">
-                                        <button type="button"
-                                                class="btn btn-secondary"
-                                                ng-click="UserProfile.changePassword = false; UserProfile.clearPasswordFields();">Cancel And Keep Current Password
-                                        </button>
-                                    </div>
--->
-                                </div>
-                            </jf-panel>
-                        </form>
-                    </div>
-                </jf-panel>
-
-                <jf-panel jf-panel-heading="Authentication Settings">
-                    <form name="UserProfile.userForm" ng-submit="UserProfile.save()">
-                        <div class="form-group no-margin-bottom">
-                            <div class="form-group-cell">
-                                <jf-field>
-                                    <label>API Key</label>
-                                    <jf-help-tooltip html="UserProfile.tooltips.apiKey"></jf-help-tooltip>
-                                    <input ng-if="UserProfile.profileLocked || UserProfile.userInfo.apiKey"
-                                           jf-disable-ng-animate
-                                           type="password"
-                                           class="input-text"
-                                           ng-model="UserProfile.userInfo.apiKey"
-                                           disabled
-                                           id="apiKey"
-                                           name="apiKey"
-                                            />
-                                    <input ng-if="!UserProfile.userInfo.apiKey && !UserProfile.profileLocked"
-                                           jf-disable-ng-animate
-                                           type="text"
-                                           disabled
-                                           value="Click on Generate to create Key"
-                                           class="input-text"/>
-                                </jf-field>
-                            </div>
-                            <div ng-if="UserProfile.profileLocked || UserProfile.userInfo.apiKey"
-                                 class="form-group-cell auto-width form-button form-link profile-reveal">
-                                    <span jf-reveal-input="apiKey"
-                                          object-name="API Key"></span>
-                            </div>
-                            <div ng-if="UserProfile.profileLocked || UserProfile.userInfo.apiKey"
-                                 class="form-group-cell auto-width form-button form-link profile-copy">
-                                <jf-clip-copy text-to-copy="UserProfile.userInfo.apiKey"
-                                              object-name="Key"></jf-clip-copy>
-                            </div>
-                            <div ng-if="UserProfile.userInfo.apiKey"
-                                 class="form-group-cell auto-width form-button form-link profile-generate">
-                                <a class="generate-button"
-                                   ng-click="UserProfile.regenerateApiKey()"
-                                   ng-if="!UserProfile.profileLocked"
-                                   jf-tooltip="Regenerate">
-                                    <span class="icon-generate"></span>
-                                </a>
-                            </div>
-                            <div ng-if="!UserProfile.userInfo.apiKey && !UserProfile.profileLocked"
-                                 class="form-group-cell auto-width form-button form-link profile-generate">
-                                <a class="generate-button"
-                                   ng-click="UserProfile.generateApiKey()"
-                                   ng-if="!UserProfile.profileLocked"
-                                   jf-tooltip="Generate">
-                                    <span class="icon-generate"></span>
-                                </a>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div ng-click="UserProfile.revokeApiKey()" class="text-button warning-button"
-                                 ng-if="!UserProfile.profileLocked && UserProfile.userInfo.apiKey">
-                                <span class="icon icon-clear"></span>Revoke API Key
-                            </div>
-                        </div>
-
-                        <div class="form-group">
-                            <div class="form-group-cell">
-                                <jf-field>
-                                    <label>Encrypted Password</label>
-                                    <input type="password"
-                                           class="input-text"
-                                           ng-model="UserProfile.userInfo.user.password"
-                                           disabled
-                                           id="password"
-                                           name="password"
-                                            />
-                                </jf-field>
-                            </div>
-                            <div class="form-group-cell auto-width form-button form-link profile-reveal">
-                                    <span jf-reveal-input="password"
-                                          object-name="Encrypted Password"></span>
-                            </div>
-                            <div class="form-group-cell auto-width form-button form-link profile-copy">
-                                <jf-clip-copy text-to-copy="UserProfile.userInfo.user.password"
-                                              object-name="Encrypted Password"></jf-clip-copy>
-
-                            </div>
-                        </div>
-                    </form>
-                </jf-panel>
-
-                <jf-panel jf-panel-heading="Bintray Settings">
-                    <div ng-class="{disabled: UserProfile.profileLocked}">
-                        <form name="UserProfile.bintrayForm" ng-submit="UserProfile.testBintray()">
-                            <div class="form-group">
-                                <div class="form-group-cell">
-                                    <jf-field validations="bintray" always-show-errors="true">
-                                        <label>Bintray Username</label>
-                                        <input type="text"
-                                               class="input-text"
-                                               ng-model="UserProfile.userInfo.bintray.userName"
-                                               ng-disabled="UserProfile.profileLocked || !UserProfile.userInfo.user.profileUpdatable"
-                                               ng-required="UserProfile.userInfo.bintray.apiKey"
-                                               name="userName"
-                                        />
-                                    </jf-field>
-                                </div>
-                            </div>
-                            <!-- prevent auto complete -->
-                            <input type="text" class="hidden"/>
-                            <input type="password" class="hidden"/>
-
-                            <div class="form-group">
-                                <div class="form-group-cell">
-                                    <jf-field validations="bintray" always-show-errors="true">
-                                        <label>Bintray API Key</label>
-                                        <input type="password"
-                                               id="bintrayApiKey"
-                                               class="input-text"
-                                               ng-model="UserProfile.userInfo.bintray.apiKey"
-                                               ng-disabled="UserProfile.profileLocked || !UserProfile.userInfo.user.profileUpdatable"
-                                               ng-required="UserProfile.userInfo.bintray.userName"
-                                               name="bintrayApiKey"
-                                                />
-                                    </jf-field>
-                                </div>
-                                <div class="form-group-cell auto-width form-button form-link profile-reveal">
-                                  <span jf-reveal-input="bintrayApiKey"
-                                        object-name="API Key"></span>
-                                </div>
-                                <div class="form-group-cell auto-width form-button form-link profile-copy">
-                                    <jf-clip-copy text-to-copy="UserProfile.userInfo.bintray.apiKey"
-                                                  object-name="Key"></jf-clip-copy>
-                                </div>
-                            </div>
-
-                            <div class="form-group" ng-if="!UserProfile.userInfo.bintray.userName">
-                                <div class="form-group-cell">
-                                    Not yet a memeber?
-                                    <a href="https://bintray.com/?source=artifactory:356d529ef09f486b75e16e0237a7c4336cecfe0d2"
-                                                          target="_blank">Register </a> to <span class="register-to-bintray"><i class="icon icon-bintray"></i> Bintray</span>
-
-                                </div>
-                            </div>
-
-                            <div class="form-group" ng-if="UserProfile.userInfo.user.profileUpdatable">
-                                <div class="form-group-cell margin-top-25">
-                                    <button type="submit" class="btn btn-primary"
-                                            ng-disabled="UserProfile.profileLocked || UserProfile.bintrayForm.$invalid">
-                                        Test
-                                    </button>
-                                </div>
-                            </div>
-                        </form>
-                    </div>
-                </jf-panel>
-                <jf-panel jf-panel-heading="SSH"
-                          ng-if="!UserProfile.features.isAol()">
-                    <div ng-class="{disabled: UserProfile.profileLocked}">
-                        <form name="UserProfile.sshForm">
-                            <div class="form-group">
-                                <div class="form-group-cell">
-                                    <jf-field validations="ssh" always-show-errors="true">
-                                        <label>SSH Public Key (RSA)</label>
-                                        <textarea type="text"
-                                                  ng-model="UserProfile.userInfo.ssh.publicKey"
-                                                  ng-disabled="UserProfile.profileLocked || !UserProfile.userInfo.user.profileUpdatable"
-                                                  placeholder="Starts with 'ssh-rsa', 'ssh-dss', 'ssh-ed25519', 'ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', or 'ecdsa-sha2-nistp521'"
-                                                  name="publicKey"
-                                                  id="publicKey"
-                                                  class="input-text monospaced"
-                                                  rows="10"
-                                                  cols="40">
-                                        </textarea>
-                                    </jf-field>
-                                </div>
-                                <div class="form-group-cell auto-width form-button form-link">
-                                    <jf-clip-copy text-to-copy="UserProfile.userInfo.ssh.publicKey"
-                                                  object-name="PublicKey"></jf-clip-copy>
-                                </div>
-                            </div>
-                        </form>
-                    </div>
-                </jf-panel>
-                <jf-panel jf-panel-heading="OAuth User Binding"
-                          ng-if="!UserProfile.profileLocked && UserProfile.isOAuthEnabled()">
-                    <div id="user-profile-oauth">
-                        <div ng-repeat="provider in UserProfile.oauth.providers" class="user-profile-oauth-row">
-                            <div class="icon-oauth"
-                                 ng-class="{'icon-oauth-{{provider.type.toLowerCase()}}-dark': provider.binded, 'icon-oauth-{{provider.type.toLowerCase()}}': !provider.binded}"></div>
-                            <div class="provider-name" jf-tooltip-on-overflow>{{provider.name}}</div>
-                            <div ng-if="!provider.binded"><a href ng-href="{{provider.url}}"
-                                                             ng-mousedown="UserProfile.onGotoOAuth()">Click to bind</a>
-                            </div>
-                            <div ng-if="provider.bindeduu" class="unbind-link"><a href
-                                                                                ng-click="UserProfile.unbindOAuthProvider(provider.name)">Click
-                                to unbind</a></div>
-
-                            <div class="clearfix"></div>
-                            <!--div class="clearfix oauth-username">Username : {{provider.username}}</div-->
-                        </div>
-                    </div>
-                </jf-panel>
-            </div>
-        </div>
-
-        <div class="content-footer">
-            <div class="pull-right admin-actions">
-                <button type="button"
-                        class="btn btn-default"
-                        ui-sref="home">Cancel
-                </button>
-                <button type="button"
-                        class="btn btn-primary"
-                        ng-disabled="(!UserProfile.userForm.$valid && UserProfile.currentUser.name !== 'admin') || !UserProfile.bintrayForm.$valid || (UserProfile.sshForm && !UserProfile.sshForm.$valid)"
-                        ng-click="UserProfile.save()"
-                        ng-if="UserProfile.userInfo.user.profileUpdatable">Save
-                </button>
-            </div>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/states/user_profile/user_profile.module.js b/web/angular-web/src/main/webapp/app/states/user_profile/user_profile.module.js
deleted file mode 100644
index fa35167..0000000
--- a/web/angular-web/src/main/webapp/app/states/user_profile/user_profile.module.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import {UserProfileController} from "./user_profile.controller";
-
-function config ($stateProvider) {
-
-    $stateProvider
-            .state('user_profile', {
-                url: '/profile',
-                parent: 'app-layout',
-                templateUrl: 'states/user_profile/user_profile.html',
-                controller: 'UserProfileController as UserProfile'
-            })
-}
-
-export default angular.module('user_profile', [])
-        .config(config)
-        .controller('UserProfileController', UserProfileController)
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/styleguide.html b/web/angular-web/src/main/webapp/app/styleguide.html
deleted file mode 100644
index ebdd637..0000000
--- a/web/angular-web/src/main/webapp/app/styleguide.html
+++ /dev/null
@@ -1,924 +0,0 @@
-<!DOCTYPE html>
-<html ng-app="artifactory.ui">
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
-
-    <!-- Stylesheets -->
-    <link rel="stylesheet" href="css/vendorStyles.css"/>
-    <link rel="stylesheet" href="css/_icons.css"/>
-    <link rel="stylesheet" href="css/application.css"/>
-
-    <title>Artifactory</title>
-
-    <style type="text/css">
-        .small{font-size:14px;color:#a5adb4;}
-        .small a{color:#a5adb4;}
-        .small a:hover{color:#fb565e}
-        .glyphs.character-mapping{margin:0 0 20px 0;padding:20px 0 20px 30px;color:rgba(0,0,0,0.5);border:1px solid #d8e0e5;-webkit-border-radius:3px;border-radius:3px;}
-        .glyphs.character-mapping li{margin:0 30px 20px 0;display:inline-block;width:90px}
-        .glyphs.character-mapping .icon{margin:10px 0 10px 15px;padding:15px;position:relative;width:55px;height:55px;color:#162a36 !important;overflow:hidden;-webkit-border-radius:3px;border-radius:3px;font-size:32px;}
-        .glyphs.character-mapping .icon svg{fill:#000}
-        .glyphs.character-mapping input{margin:0;padding:5px 0;line-height:12px;font-size:12px;display:block;width:100%;border:1px solid #d8e0e5;-webkit-border-radius:5px;border-radius:5px;text-align:center;outline:0;}
-        .glyphs.character-mapping input:focus{border:1px solid #fbde4a;-webkit-box-shadow:inset 0 0 3px #fbde4a;box-shadow:inset 0 0 3px #fbde4a}
-        .glyphs.character-mapping input:hover{-webkit-box-shadow:inset 0 0 3px #fbde4a;box-shadow:inset 0 0 3px #fbde4a}
-        .glyphs.css-mapping{margin:0 0 60px 0;padding:30px 0 20px 30px;color:rgba(0,0,0,0.5);border:1px solid #d8e0e5;-webkit-border-radius:3px;border-radius:3px;}
-        .glyphs.css-mapping li{margin:0 30px 20px 0;padding:0;display:inline-block;overflow:hidden}
-        .glyphs.css-mapping .icon{margin:0;margin-right:10px;padding:13px;height:50px;width:50px;color:#162a36 !important;overflow:hidden;float:left;font-size:24px}
-        .glyphs.css-mapping input{margin:0;margin-top:5px;padding:8px;line-height:16px;font-size:16px;display:block;width:150px;height:40px;border:1px solid #d8e0e5;-webkit-border-radius:5px;border-radius:5px;background:#fff;outline:0;float:right;}
-        .glyphs.css-mapping input:focus{border:1px solid #fbde4a;-webkit-box-shadow:inset 0 0 3px #fbde4a;box-shadow:inset 0 0 3px #fbde4a}
-        .glyphs.css-mapping input:hover{-webkit-box-shadow:inset 0 0 3px #fbde4a;box-shadow:inset 0 0 3px #fbde4a}
-
-        .animated-input input:focus ~ label, .animated-input label.hascontent {
-          color: #66A523 !important;
-          top: 0;
-          font-size: .8em;
-          padding: 0 .3em;
-          color: #286ebb;
-        }
-
-        .animated-input.animated-input {
-            width: 100%;
-        }
-        .animated-input label {
-          -webkit-transform: translateY(-50%);
-          -moz-transform: translateY(-50%);
-          -ms-transform: translateY(-50%);
-          -o-transform: translateY(-50%);
-          transform: translateY(-50%);
-          -webkit-transition: all 0.2s ease-in-out;
-          -moz-transition: all 0.2s ease-in-out;
-          transition: all 0.2s ease-in-out;
-          position: absolute;
-          top: 50%;
-          left: 1em;
-          background-color: #fff;
-          color: #b3b3b3;
-          font-weight: normal;
-          cursor: text;
-          pointer-events: none;
-        }
-
-    </style>
-</head>
-
-<body>
-
-<div style="padding: 60px;" ng-controller="StyleGuideController as StyleGuide">
-
-    <h1>Styleguide</h1>
-
-    <ul>
-        <li ng-repeat="item in ctrl.tableOfContents" ng-click="">
-            <a href="" ng-click="ctrl.goToItem(item)">
-                <span ng-if="item.subtitle">    </span>
-                {{ item.title }}
-            </a>
-        </li>
-    </ul>
-
-    <h2>Basic content layout</h2>
-    <script type="text/ng-template" id="content-layout-container.html">
-        <div class="content-layout-container"> <!-- classes: with-head-bar -->
-           <h1></h1>
-        
-           <div class="content-wrapper">
-               <div class="card stretch card-pole-pad card-side-pad">
-                   <!-- Content Comes Here -->
-               </div>
-           </div>
-        </div>
-    </script>
-    <sg-demo template="content-layout-container.html" hide-html="true"></sg-demo>
-
-    <h2>Basic content layout with footer (buttons)</h2>
-    <script type="text/ng-template" id="content-layout-container-footer.html">
-        <div class="content-layout-container"> <!-- classes: with-head-bar -->
-           <h1></h1>
-        
-           <div class="content-wrapper">
-               <div class="card stretch card-pole-pad card-side-pad">
-                   <div class="content-with-footer">
-                       <!-- Content Comes Here -->
-                  </div>
-               </div>
-        
-               <div class="content-footer">
-                   <!-- Content Footer Comes Here -->
-               </div>
-           </div>
-        </div>
-    </script>
-    <sg-demo template="content-layout-container-footer.html" hide-html="true"></sg-demo>
-
-    <h2>Buttons</h2>
-
-    <script type="text/ng-template" id="buttons.html">
-        <p>
-            <button class="btn btn-primary">Primary</button>
-        </p>
-        <p>
-            <button class="btn btn-secondary">Secondary</button>
-        </p>
-        <p>
-            <button class="btn btn-small">Small</button>
-        </p>        
-    </script>
-    <sg-demo template="buttons.html"></sg-demo>
-
-    <h2>Inputs</h2>
-
-    <h3>Text box Admin style</h3>
-    <script type="text/ng-template" id="admin-text-box.html">
-        <form name="adminForm" ng-submit="void()">
-           <jf-field validations="common">
-               <label class="mandatory">Input</label>
-               <input required ng-model="ctrl.adminInputModel" type="text" name="fieldName" class="input-text" />
-           </jf-field>
-        </form>
-    </script>
-    <sg-demo template="admin-text-box.html"></sg-demo>
-
-    <h3>Text box</h3>
-    <script type="text/ng-template" id="text-box.html">
-        <form name="commonForm" ng-submit="void()">
-           <jf-field animated="true" validations="common">
-               <input required ng-model="ctrl.inputModel" type="text" name="fieldName" class="input-text" placeholder="Input *" />
-           </jf-field>
-        </form>
-    </script>
-    <sg-demo template="text-box.html"></sg-demo>
-
-
-    <h3>File input</h3>
-    <script type="text/ng-template" id="jf-file-drop-demo.html">
-        <jf-file-drop jf-file-uploader="ctrl.uploader"></jf-file-drop>
-    </script>
-    <sg-demo template="jf-file-drop-demo.html"></sg-demo>
-
-    <h3>Select</h3>
-    <selectize placeholder='Select a Property...'
-       config='ctrl.selectizeConfig'
-       options='ctrl.selectizeOptions'
-       ng-model='ctrl.repoPropertySelected'>
-    </selectize>
-    <script type="text/ng-template" id="selectize-demo.html" ng-if="ctrl.selectizeOptions">
-        <selectize placeholder='Select a Property...'
-           config='ctrl.selectizeConfig'
-           options='ctrl.selectizeOptions'
-           ng-model='ctrl.repoPropertySelected'>
-        </selectize>
-    </script>
-    <sg-demo template="selectize-demo.html" hide-html="true"></sg-demo>
-
-    <script type="text/ng-template" id="selectizeConfig.js">
-        ctrl.selectizeConfig = {
-            create: true,
-            sortField: 'text',
-            maxItems: 1
-        };
-
-        ctrl.selectizeOptions = [
-            {value: 1, text: 'Chuck Testa'},
-            {value: 2, text:'Nikola Tesla'}
-        ];
-    </script>
-    <sg-demo javascript="true" template="selectizeConfig.js"></sg-demo>
-
-    <h3>jf-ui-select</h3>
-    <b>by function</b>
-    <script type="text/ng-template" id="jf-ui-select-func.html">
-        <jf-ui-select
-           jf-select-model='ctrl.jfUiSelectModel'
-           jf-select-options='ctrl.jfSelectOptions'
-           jf-select-display-func='ctrl.jfSelectDictionary[$item]'>
-        </jf-ui-select>
-    </script>
-    <sg-demo template="jf-ui-select-func.html"></sg-demo>
-
-    <script type="text/ng-template" id="jf-ui-select-func.js">
-        ctrl.jfUiSelectModel = 1;
-        ctrl.jfSelectOptions = [0, 1, 2];
-        ctrl.jfSelectDictionary = ['one', 'two', 'three'];
-    </script>
-    <sg-demo javascript="true" template="jf-ui-select-func.js"></sg-demo>
-
-    <b>by attribute</b>
-    <script type="text/ng-template" id="jf-ui-select-attr.html">
-        <jf-ui-select
-           jf-select-model='ctrl.jfUiSelectModel2'
-           jf-select-options='ctrl.jfSelectOptions2'
-           jf-select-display-attr='title'>
-        </jf-ui-select>
-    </script>
-    <sg-demo template="jf-ui-select-attr.html"></sg-demo>
-    <script type="text/ng-template" id="jf-ui-select-attr.js">
-        ctrl.jfUiSelectModel2 = {id: '1', title: 'one'};
-        ctrl.jfSelectOptions2 = [
-            {id: '1', title: 'one'},
-            {id: '2', title: 'two'},
-            {id: '3', title: 'three'}
-        ];
-    </script>
-    <sg-demo javascript="true" template="jf-ui-select-attr.js"></sg-demo>
-
-    <b>string array</b>
-    <script type="text/ng-template" id="jf-ui-select-strings.html">
-        <jf-ui-select
-           jf-select-model='ctrl.jfUiSelectModel3'
-           jf-select-options='ctrl.jfSelectOptions3'>
-        </jf-ui-select>
-    </script>
-    <sg-demo template="jf-ui-select-strings.html"></sg-demo>
-    <script type="text/ng-template" id="jf-ui-select-strings.js">
-        ctrl.jfUiSelectModel3 = 'one';
-        ctrl.jfSelectOptions3 = ['one', 'two', 'three'];
-    </script>
-    <sg-demo javascript="true" template="jf-ui-select-strings.js"></sg-demo>
-    
-    <h2>Checkboxes</h2>
-
-    <script type="text/ng-template" id="jf-checkbox-demo.html">
-        <jf-checkbox text="Label">
-            <input
-                type="checkbox"
-                id="myId"
-                ng-model="ctrl.myModel"
-                ng-disabled="ctrl.disabled"
-                ng-change="ctrl.changeFn"/>
-        </jf-checkbox>
-    </script>
-    <sg-demo template="jf-checkbox-demo.html"></sg-demo>
-
-    <h2>Switch (radio buttons)</h2>
-
-    ctrl.switchedValue == {{ctrl.switchedValue}}
-    <script type="text/ng-template" id="jf-switch-demo.html">
-        <jf-switch
-            ng-change="ctrl.onChange()"
-            jf-switch-title="Select:"
-            ng-model="ctrl.switchedValue"
-            options="['One', 'Two', 'Three']">
-        </jf-switch>
-    </script>
-    <sg-demo template="jf-switch-demo.html"></sg-demo>
-    <br>
-
-    <h3>Switch with objects (text & value)</h3>
-
-    ctrl.switchedObjectValue == {{ctrl.switchedObjectValue}}
-    <script type="text/ng-template" id="jf-switch-objects.html">
-        <jf-switch
-            ng-model="ctrl.switchedObjectValue"
-            options="ctrl.switchedOptions"></jf-switch>
-    </script>
-    <sg-demo template="jf-switch-objects.html"></sg-demo>
-    <script type="text/ng-template" id="jf-switch-objects.js">
-        ctrl.switchedOptions = [
-            {text: 'One', value: 1},
-            {text: 'Two', value: 2},
-            {text: 'Three', value: 3}
-        ];
-    </script>
-    <sg-demo javascript="true" template="jf-switch-objects.js"></sg-demo>
-
-    <br>
-
-    <h2>Panels</h2>
-
-    <script type="text/ng-template" id="jf-panel-demo.html">
-        <jf-panel jf-panel-heading="Panel Name" jf-panel-classes=""></jf-panel>
-    </script>
-    <sg-demo template="jf-panel-demo.html"></sg-demo>
-
-    <h2>Tooltips</h2>
-
-    <b>Tooltip button text</b>
-    <script type="text/ng-template" id="jf-help-tooltip-demo.html">
-        <jf-help-tooltip text="Check it out this tooltip!">
-        </jf-help-tooltip>
-    </script>
-    <sg-demo template="jf-help-tooltip-demo.html"></sg-demo>
-
-    <b>Tooltip button html</b>
-    <script type="text/ng-template" id="jf-help-tooltip-html-demo.html">
-        <jf-help-tooltip html="ctrl.tooltiphtml">
-        </jf-help-tooltip>
-    </script>
-    <sg-demo template="jf-help-tooltip-html-demo.html"></sg-demo>
-    <script type="text/ng-template" id="jf-help-tooltip-html.js">
-        ctrl.tooltiphtml = 'Check out this tooltip : <a href=".">New Tooltip</a>';
-    </script>
-    <sg-demo javascript="true" template="jf-help-tooltip-html.js">
-    </sg-demo>
-
-    <b>Tooltip attribute</b>
-    <script type="text/ng-template" id="jf-tooltip.html">
-        <img
-            src="images/artifactory_logo.png"
-            jf-tooltip="Check it out this tooltip!">
-        </img>
-    </script>
-    <sg-demo template="jf-tooltip.html"></sg-demo>
-
-    <h2>Standard Grid</h2>
-
-
-    <script type="text/ng-template" id="jf-grid.html">
-        <jf-grid grid-options="ctrl.gridOptions"
-           filter-field="name"
-           filter-field2="value"
-           filter-on-change="true">
-        </jf-grid>
-    </script>
-    <sg-demo template="jf-grid.html"></sg-demo>
-    <script type="text/ng-template" id="jf-grid.js">
-        ctrl.visibleWhen = function(entity) {
-            return entity.name === 'Test';
-        }
-        ctrl.callback = function(row) {
-            console.log(row);
-        }
-
-        ctrl.gridOptions = ArtifactoryGridFactory.getGridInstance(scope)
-            .setColumns([
-                {
-                    name: "Property",
-                    field: "name",
-                    actions: {
-                        delete: ctrl.callback
-                    }
-                },
-                {
-                    name: "Value(s)",
-                    field: "value",
-                    actions: {
-                        download: {
-                            callback: ctrl.callback,
-                            visibleWhen: ctrl.visibleWhen
-                        }
-                    },
-                    customActions: [{
-                        icon: 'icon icon-import',
-                        tooltip: 'Import',
-                        name: 'Import',
-                        callback: ctrl.callback
-                    }]
-                }
-            ])
-            .setRowTemplate('default')
-            .setGridData([
-                {name: 'Test', value: 'Working'},
-                {name: 'Test2', value: 'Working Also'}
-            ])
-            .setBatchActions([
-               {
-                    icon: 'icon icon-delete',
-                    name: 'Delete',
-                    callback: ctrl.callback
-               },
-               {
-                   icon: 'icon delete-recursive',
-                   name: 'Delete recursive',
-                   callback: ctrl.callback
-               }
-           ]);
-    </script>
-    <sg-demo javascript="true" template="jf-grid.js">
-    </sg-demo>
-
-    <h2>jfClipCopy</h2>
-    Click the button to copy the text 'This text was copied':
-    <script type="text/ng-template" id="jf-clip-copy.html">
-        <jf-clip-copy
-            text-to-copy="'This text was copied'"
-            object-name="XML">
-        </jf-clip-copy>
-    </script>
-    <sg-demo template="jf-clip-copy.html"></sg-demo>
-
-    <h2>jfCodeMirror</h2>
-    <script type="text/ng-template" id="jf_code_mirror.html">
-        <jf-code-mirror mime-type="xml"
-                model="ctrl.xmlFile"
-                height="200px"
-                allowEdit="false">
-        </jf-code-mirror>
-    </script>
-    <sg-demo template="jf_code_mirror.html"></sg-demo>
-
-    <script type="text/ng-template" id="jf_code_mirror.js">ctrl.xmlFile = `
-    <parent>
-        <child attr="value">
-            Text
-        </child>
-    </parent>`;
-    </script>
-    <sg-demo javascript="true" template="jf_code_mirror.js">
-    </sg-demo>
-
-    <h2>Modals</h2>
-    <h3>Confirm</h3>
-
-    <button ng-click="ctrl.demoConfirm()">Confirm</button>
-    <script type="text/ng-template" id="confirmModal.js">
-        ctrl.demoConfirm = function() {
-            ArtifactoryModal.confirm('Are you sure?')
-                .then(function() { alert('resolved')})
-                .catch(function() { alert('rejected')});
-        }
-    </script>
-    <sg-demo javascript="true" template="confirmModal.js">
-    </sg-demo>
-
-    <h3>Launch code modal</h3>
-
-    <button ng-click="ctrl.demoCodeModal()">Launch code modal</button>
-    <script type="text/ng-template" id="codeModal.js">
-        ctrl.demoCodeModal = function() {
-            ArtifactoryModal.launchCodeModal('file.json', "{key: 'value'}", {name: "javascript", json: true});
-        }
-    </script>
-    <sg-demo javascript="true" template="codeModal.js">
-    </sg-demo>
-
-    <div class="container">
-        <h1>Artifactory</h1>
-        <p class="small">This font was created with<a href="http://fontastic.me/">Fontastic</a></p>
-        <h2>CSS mapping</h2>
-        <ul class="glyphs css-mapping">
-            <li>
-                <div class="icon icon-terminal"></div>
-                <input type="text" readonly="readonly" value="terminal">
-            </li>
-            <li>
-                <div class="icon icon-scala"></div>
-                <input type="text" readonly="readonly" value="scala">
-            </li>
-            <li>
-                <div class="icon icon-ruby-gems"></div>
-                <input type="text" readonly="readonly" value="ruby-gems">
-            </li>
-            <li>
-                <div class="icon icon-rpm"></div>
-                <input type="text" readonly="readonly" value="rpm">
-            </li>
-            <li>
-                <div class="icon icon-refresh"></div>
-                <input type="text" readonly="readonly" value="refresh">
-            </li>
-            <li>
-                <div class="icon icon-home"></div>
-                <input type="text" readonly="readonly" value="home">
-            </li>
-            <li>
-                <div class="icon icon-gradle"></div>
-                <input type="text" readonly="readonly" value="gradle">
-            </li>
-            <li>
-                <div class="icon icon-download"></div>
-                <input type="text" readonly="readonly" value="download">
-            </li>
-            <li>
-                <div class="icon icon-more"></div>
-                <input type="text" readonly="readonly" value="more">
-            </li>
-            <li>
-                <div class="icon icon-c-source"></div>
-                <input type="text" readonly="readonly" value="c-source">
-            </li>
-            <li>
-                <div class="icon icon-c"></div>
-                <input type="text" readonly="readonly" value="c">
-            </li>
-            <li>
-                <div class="icon icon-builds"></div>
-                <input type="text" readonly="readonly" value="builds">
-            </li>
-            <li>
-                <div class="icon icon-artifacts"></div>
-                <input type="text" readonly="readonly" value="artifacts">
-            </li>
-            <li>
-                <div class="icon icon-zip"></div>
-                <input type="text" readonly="readonly" value="zip">
-            </li>
-            <li>
-                <div class="icon icon-groovy"></div>
-                <input type="text" readonly="readonly" value="groovy">
-            </li>
-            <li>
-                <div class="icon icon-html"></div>
-                <input type="text" readonly="readonly" value="html">
-            </li>
-            <li>
-                <div class="icon icon-javascript"></div>
-                <input type="text" readonly="readonly" value="javascript">
-            </li>
-            <li>
-                <div class="icon icon-json"></div>
-                <input type="text" readonly="readonly" value="json">
-            </li>
-            <li>
-                <div class="icon icon-local-repo"></div>
-                <input type="text" readonly="readonly" value="local-repo">
-            </li>
-            <li>
-                <div class="icon icon-move"></div>
-                <input type="text" readonly="readonly" value="move">
-            </li>
-            <li>
-                <div class="icon icon-nuget"></div>
-                <input type="text" readonly="readonly" value="nuget">
-            </li>
-            <li>
-                <div class="icon icon-pdf"></div>
-                <input type="text" readonly="readonly" value="pdf">
-            </li>
-            <li>
-                <div class="icon icon-pom"></div>
-                <input type="text" readonly="readonly" value="pom">
-            </li>
-            <li>
-                <div class="icon icon-remote-repo"></div>
-                <input type="text" readonly="readonly" value="remote-repo">
-            </li>
-            <li>
-                <div class="icon icon-cached-repo"></div>
-                <input type="text" readonly="readonly" value="cached-repo">
-            </li>
-            <li>
-                <div class="icon icon-txt"></div>
-                <input type="text" readonly="readonly" value="txt">
-            </li>
-            <li>
-                <div class="icon icon-virtual-repo"></div>
-                <input type="text" readonly="readonly" value="virtual-repo">
-            </li>
-            <li>
-                <div class="icon icon-xml"></div>
-                <input type="text" readonly="readonly" value="xml">
-            </li>
-            <li>
-                <div class="icon icon-general"></div>
-                <input type="text" readonly="readonly" value="general">
-            </li>
-            <li>
-                <div class="icon icon-folder-compact"></div>
-                <input type="text" readonly="readonly" value="folder-compact">
-            </li>
-            <li>
-                <div class="icon icon-folder"></div>
-                <input type="text" readonly="readonly" value="folder">
-            </li>
-            <li>
-                <div class="icon icon-docker"></div>
-                <input type="text" readonly="readonly" value="docker">
-            </li>
-            <li>
-                <div class="icon icon-delete-versions-26"></div>
-                <input type="text" readonly="readonly" value="delete-versions-26">
-            </li>
-            <li>
-                <div class="icon icon-deb"></div>
-                <input type="text" readonly="readonly" value="deb">
-            </li>
-            <li>
-                <div class="icon icon-delete-content"></div>
-                <input type="text" readonly="readonly" value="delete-content">
-            </li>
-            <li>
-                <div class="icon icon-css"></div>
-                <input type="text" readonly="readonly" value="css">
-            </li>
-            <li>
-                <div class="icon icon-copy"></div>
-                <input type="text" readonly="readonly" value="copy">
-            </li>
-            <li>
-                <div class="icon icon-archive-2"></div>
-                <input type="text" readonly="readonly" value="archive-2">
-            </li>
-            <li>
-                <div class="icon icon-archive"></div>
-                <input type="text" readonly="readonly" value="archive">
-            </li>
-            <li>
-                <div class="icon icon-admin"></div>
-                <input type="text" readonly="readonly" value="admin">
-            </li>
-            <li>
-                <div class="icon icon-view"></div>
-                <input type="text" readonly="readonly" value="view">
-            </li>
-            <li>
-                <div class="icon icon-android"></div>
-                <input type="text" readonly="readonly" value="android">
-            </li>
-            <li>
-                <div class="icon icon-angle-double-right"></div>
-                <input type="text" readonly="readonly" value="angle-double-right">
-            </li>
-            <li>
-                <div class="icon icon-angle-double-down"></div>
-                <input type="text" readonly="readonly" value="angle-double-down">
-            </li>
-            <li>
-                <div class="icon icon-angle-double-left"></div>
-                <input type="text" readonly="readonly" value="angle-double-left">
-            </li>
-            <li>
-                <div class="icon icon-angle-double-up"></div>
-                <input type="text" readonly="readonly" value="angle-double-up">
-            </li>
-            <li>
-                <div class="icon icon-caret-down"></div>
-                <input type="text" readonly="readonly" value="caret-down">
-            </li>
-            <li>
-                <div class="icon icon-caret-right"></div>
-                <input type="text" readonly="readonly" value="caret-right">
-            </li>
-        </ul>
-        <h2>Character mapping</h2>
-        <ul class="glyphs character-mapping">
-            <li>
-                <div data-icon="a" class="icon"></div>
-                <input type="text" readonly="readonly" value="a">
-            </li>
-            <li>
-                <div data-icon="b" class="icon"></div>
-                <input type="text" readonly="readonly" value="b">
-            </li>
-            <li>
-                <div data-icon="c" class="icon"></div>
-                <input type="text" readonly="readonly" value="c">
-            </li>
-            <li>
-                <div data-icon="d" class="icon"></div>
-                <input type="text" readonly="readonly" value="d">
-            </li>
-            <li>
-                <div data-icon="e" class="icon"></div>
-                <input type="text" readonly="readonly" value="e">
-            </li>
-            <li>
-                <div data-icon="f" class="icon"></div>
-                <input type="text" readonly="readonly" value="f">
-            </li>
-            <li>
-                <div data-icon="g" class="icon"></div>
-                <input type="text" readonly="readonly" value="g">
-            </li>
-            <li>
-                <div data-icon="h" class="icon"></div>
-                <input type="text" readonly="readonly" value="h">
-            </li>
-            <li>
-                <div data-icon="i" class="icon"></div>
-                <input type="text" readonly="readonly" value="i">
-            </li>
-            <li>
-                <div data-icon="j" class="icon"></div>
-                <input type="text" readonly="readonly" value="j">
-            </li>
-            <li>
-                <div data-icon="k" class="icon"></div>
-                <input type="text" readonly="readonly" value="k">
-            </li>
-            <li>
-                <div data-icon="l" class="icon"></div>
-                <input type="text" readonly="readonly" value="l">
-            </li>
-            <li>
-                <div data-icon="m" class="icon"></div>
-                <input type="text" readonly="readonly" value="m">
-            </li>
-            <li>
-                <div data-icon="n" class="icon"></div>
-                <input type="text" readonly="readonly" value="n">
-            </li>
-            <li>
-                <div data-icon="o" class="icon"></div>
-                <input type="text" readonly="readonly" value="o">
-            </li>
-            <li>
-                <div data-icon="p" class="icon"></div>
-                <input type="text" readonly="readonly" value="p">
-            </li>
-            <li>
-                <div data-icon="q" class="icon"></div>
-                <input type="text" readonly="readonly" value="q">
-            </li>
-            <li>
-                <div data-icon="r" class="icon"></div>
-                <input type="text" readonly="readonly" value="r">
-            </li>
-            <li>
-                <div data-icon="s" class="icon"></div>
-                <input type="text" readonly="readonly" value="s">
-            </li>
-            <li>
-                <div data-icon="t" class="icon"></div>
-                <input type="text" readonly="readonly" value="t">
-            </li>
-            <li>
-                <div data-icon="u" class="icon"></div>
-                <input type="text" readonly="readonly" value="u">
-            </li>
-            <li>
-                <div data-icon="v" class="icon"></div>
-                <input type="text" readonly="readonly" value="v">
-            </li>
-            <li>
-                <div data-icon="w" class="icon"></div>
-                <input type="text" readonly="readonly" value="w">
-            </li>
-            <li>
-                <div data-icon="x" class="icon"></div>
-                <input type="text" readonly="readonly" value="x">
-            </li>
-            <li>
-                <div data-icon="y" class="icon"></div>
-                <input type="text" readonly="readonly" value="y">
-            </li>
-            <li>
-                <div data-icon="z" class="icon"></div>
-                <input type="text" readonly="readonly" value="z">
-            </li>
-            <li>
-                <div data-icon="A" class="icon"></div>
-                <input type="text" readonly="readonly" value="A">
-            </li>
-            <li>
-                <div data-icon="B" class="icon"></div>
-                <input type="text" readonly="readonly" value="B">
-            </li>
-            <li>
-                <div data-icon="C" class="icon"></div>
-                <input type="text" readonly="readonly" value="C">
-            </li>
-            <li>
-                <div data-icon="D" class="icon"></div>
-                <input type="text" readonly="readonly" value="D">
-            </li>
-            <li>
-                <div data-icon="E" class="icon"></div>
-                <input type="text" readonly="readonly" value="E">
-            </li>
-            <li>
-                <div data-icon="F" class="icon"></div>
-                <input type="text" readonly="readonly" value="F">
-            </li>
-            <li>
-                <div data-icon="G" class="icon"></div>
-                <input type="text" readonly="readonly" value="G">
-            </li>
-            <li>
-                <div data-icon="H" class="icon"></div>
-                <input type="text" readonly="readonly" value="H">
-            </li>
-            <li>
-                <div data-icon="I" class="icon"></div>
-                <input type="text" readonly="readonly" value="I">
-            </li>
-            <li>
-                <div data-icon="J" class="icon"></div>
-                <input type="text" readonly="readonly" value="J">
-            </li>
-            <li>
-                <div data-icon="K" class="icon"></div>
-                <input type="text" readonly="readonly" value="K">
-            </li>
-            <li>
-                <div data-icon="L" class="icon"></div>
-                <input type="text" readonly="readonly" value="L">
-            </li>
-            <li>
-                <div data-icon="M" class="icon"></div>
-                <input type="text" readonly="readonly" value="M">
-            </li>
-            <li>
-                <div data-icon="N" class="icon"></div>
-                <input type="text" readonly="readonly" value="N">
-            </li>
-            <li>
-                <div data-icon="O" class="icon"></div>
-                <input type="text" readonly="readonly" value="O">
-            </li>
-            <li>
-                <div data-icon="P" class="icon"></div>
-                <input type="text" readonly="readonly" value="P">
-            </li>
-            <li>
-                <div data-icon="Q" class="icon"></div>
-                <input type="text" readonly="readonly" value="Q">
-            </li>
-            <li>
-                <div data-icon="R" class="icon"></div>
-                <input type="text" readonly="readonly" value="R">
-            </li>
-            <li>
-                <div data-icon="S" class="icon"></div>
-                <input type="text" readonly="readonly" value="S">
-            </li>
-            <li>
-                <div data-icon="T" class="icon"></div>
-                <input type="text" readonly="readonly" value="T">
-            </li>
-            <li>
-                <div data-icon="U" class="icon"></div>
-                <input type="text" readonly="readonly" value="U">
-            </li>
-        </ul>
-    </div>
-
-</div>
-
-
-<!-- Javascript -->
-<script type="text/javascript" src="vendorScripts.js"></script>
-<script type="text/javascript" src="templates.js"></script>
-
-<!-- Application code -->
-<script src="artifactory_core.js"></script>
-<script src="artifactory_services.js"></script>
-<script src="artifactory_dao.js"></script>
-
-<script src="artifactory_ui.js"></script>
-<script src="artifactory_ui_components.js"></script>
-<script src="artifactory_directives.js"></script>
-<script src="artifactory_filters.js"></script>
-
-<script src="artifactory_views.js"></script>
-<script src="artifactory_states.js"></script>
-<script src="artifactory_main.js"></script>
-
-<script>
-    angular.module('artifactory.ui')
-            .config(function($sceProvider) {
-                $sceProvider.enabled(false);
-            })
-            .controller('StyleGuideController', function ($scope, ArtifactoryGridFactory, ArtifactoryModal) {
-                window.ctrl = $scope.ctrl = this;
-                window.scope = $scope;
-                window.ArtifactoryGridFactory = ArtifactoryGridFactory;
-                window.ArtifactoryModal = ArtifactoryModal;
-                this.titleId = 0;
-                this.tableOfContents = [];
-                this.onChange = angular.noop;
-                this.goToItem = function(item) {
-                    document.getElementById(item.id).scrollIntoView();
-                }
-            })
-            .directive('sgDemo', function($templateCache) {
-                return {
-                    restrict: 'E',
-                    scope: true,
-                    controller: function($scope, $attrs) {
-                        $scope.options = {
-                            mode: $attrs.javascript ? 'javascript' : 'xml',
-                            readOnly: true
-                        };
-                        $scope.hideHtml = $attrs.hideHtml || $attrs.javascript;
-                        $scope.template = $attrs.template;
-                        $scope.title = $attrs.javascript ? 'code' : 'html';
-                    },
-                    link: function ($scope, $element, $attrs) {
-                        $scope.code = $templateCache.get($scope.template);
-                        if ($attrs.javascript) eval($scope.code);   
-                    },
-                    template: `
-                        <span ng-if="!hideHtml" ng-include src="template"></span>
-                        <div>{{ title }}:</div>
-                        <pre ui-codemirror="options" ng-model="code"></pre>
-                    `
-                }
-            })
-            .directive('h2', function() {
-                return {
-                    restrict: 'E',
-                    scope: false,
-                    controller: function($element) {
-                        var id = ctrl.titleId++;
-                        $element[0].id = id;
-                        ctrl.tableOfContents.push({id: id, title: $element.text()});
-                    }
-                };
-            })
-            .directive('h3', function() {
-                return {
-                    restrict: 'E',
-                    scope: false,
-                    controller: function($element) {
-                        var id = ctrl.titleId++;
-                        $element[0].id = id;
-                        ctrl.tableOfContents.push({id: id, title: $element.text(), subtitle: true});
-                    }
-                };
-            })
-            ;
-</script>
-
-</body>
-</html>
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_grid/artifactory_grid.js b/web/angular-web/src/main/webapp/app/ui_components/artifactory_grid/artifactory_grid.js
deleted file mode 100644
index 06d96d6..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_grid/artifactory_grid.js
+++ /dev/null
@@ -1,756 +0,0 @@
-const TEMPLATES_FOLDER = "ui_components/artifactory_grid/templates/",
-        MIN_COLUMN_WIDTH = 50;
-let headerCellTemplate = require("raw!./templates/headerCellDefaultTemplate.html");
-let $timeout, $window, $state, $modal, $rootScope, download;
-
-const COMMON_ACTIONS = {
-    delete: {
-        icon: 'icon icon-clear',
-        tooltip: 'Delete'
-    },
-    download: {
-        icon: 'icon icon-download',
-        href: row => {return row.downloadLink},
-        tooltip: 'Download'
-    }
-};
-
-class ArtifactoryGrid {
-
-    constructor(scope, uiGridConstants) {
-        this.scope = scope;
-
-        if (scope) {
-            this.appScopeProvider = scope;
-        }
-        this.enableRowSelection = true;
-        this.enableRowHeaderSelection = false;
-        this.modifierKeysToMultiSelect = false;
-        this.multiSelect = false;
-        this.noUnselect = false;
-        this.enableColumnMenus = false;
-        this.rowHeight = 40;
-        this.headerRowHeight = 41;
-        this.enableHorizontalScrollbar = uiGridConstants.scrollbars.NEVER;
-        this.enableVerticalScrollbar = uiGridConstants.scrollbars.NEVER;
-        this.groupingShowCounts = false;
-        this._afterRegister = [];
-
-        // pagination
-        this.paginationCallback = null;
-        this.enablePagination = true;
-        this.enablePaginationControls = false;
-        this.paginationPageSize = 25;
-        this.resetPagination();
-        this._handleColumnResize();
-
-        this.scope.$on('$destroy', () => this.onDestroy());
-    }
-
-    resetPagination() {
-        this.paginationCurrentPage = 1;
-    }
-
-    getPagination() {
-        let pagination = {
-            pageNum: this.paginationCurrentPage,
-            numOfRows: this.paginationPageSize
-        };
-        let sortColumn = this.getSortColumn();
-        if (sortColumn) {
-            pagination.direction = sortColumn.sort.direction;
-            pagination.orderBy = sortColumn.field || sortColumn.name;
-        }
-        else {
-            pagination.direction = 'asc';
-            pagination.orderBy = this.columnDefs[0].field;
-        }
-        return pagination;
-    }
-
-    getSortColumn() {
-        if (_.isEmpty(this.api.grid.columns)) {
-            return _.findWhere(this.columnDefs, {sort: {}});
-        }
-        else {
-            return this.api.grid.getColumnSorting()[0];
-        }
-    }
-
-    setExternalPagination(callback) {
-        // set external pagination params
-        this.useExternalPagination = true;
-        this.useExternalSorting = true;
-        this.paginationCallback = callback;
-        // register on sort and on page change callbacks
-        this.afterRegister((gridApi) => {
-            gridApi.core.on.sortChanged(this.scope, (grid, sortColumns) => {
-                this.getPage();
-            });
-            gridApi.pagination.on.paginationChanged(this.scope, (pageNumber, pageSize) => {
-                this.getPage();
-            });
-            // get initial page
-            this.getPage();
-        });
-        return this;
-    }
-
-    getPage() {
-        if (!this.paginationCallback) {
-            return;
-        }
-        this.paginationCallback(this.getPagination())
-                .then((pagedResponse) => {
-                    this.totalItems = pagedResponse.totalItems;
-                    this.setGridData(pagedResponse.pagingData);
-                });
-    }
-
-    afterRegister(callback) {
-        // If api is already registered - invoke the callback
-        if (this.api) {
-            callback(this.api);
-        }
-
-
-        // Add it to array anyway (for cases when grid element is removed and added to DOM with ng-if)
-        this._afterRegister.push(callback);
-    }
-
-    fixGroupingUndefinedValues() {
-        if (this.api.grouping) {
-            let origFunc = this.api.grouping.groupColumn;
-            this.api.grouping.groupColumn = (columnName) => {
-                let column = _.findWhere(this.api.grid.columns,{displayName: columnName});
-                let field = column.field;
-                this.api.grid.rows.forEach((row)=>{
-                    if (row.entity[field] === undefined) {
-                        row.entity[field] = '';
-                    }
-                });
-                origFunc(columnName);
-            }
-        }
-    }
-
-    setColumns(columnDefs) {
-        this.columnDefs = columnDefs;
-
-        this.columnDefs.forEach((item, index) => {
-            if (!item.headerCellTemplate) {
-                item.headerCellTemplate = headerCellTemplate;
-            }
-            // enableCellEdit is by default true. If not defined - we want it to be false
-            if (!item.enableCellEdit) {
-                item.enableCellEdit = false;
-            }
-            // If given default actions, fetch their data from the default actions dictionary and add to the actions array
-            if (item.actions) {
-                item.customActions = item.customActions || [];
-                _.forEach(item.actions, (callback, key) => {
-                    let action;
-                    if (callback.visibleWhen) {
-                        action = this._getCommonAction(key, callback.callback, callback.visibleWhen);
-                    } else {
-                        action = this._getCommonAction(key, callback.callback || callback);
-                    }
-                    item.customActions.push(action);
-                });
-            }
-            if (!item.minWidth)
-                item.minWidth = MIN_COLUMN_WIDTH;
-        });
-        return this;
-    }
-
-    // Get default action by key and append the callback
-    _getCommonAction(key, callback, visibleWhen) {
-        let action = COMMON_ACTIONS[key];
-        action = angular.extend({callback: callback}, action);
-        if (visibleWhen) {
-            action = angular.extend({visibleWhen: visibleWhen}, action);
-        }
-        return action;
-    }
-
-    _isElementVisible(e) {
-        if(e.css('display') === 'none') return false;
-        else if (e.parent()[0] !== document) {
-            return this._isElementVisible(e.parent());
-        }
-        else {
-            return true;
-        }
-    }
-
-    // Recalculates and sets the width of every column when the window resizes
-    _calculateColumnsWidthByPercent(gridApi) {
-        if(!this._isElementVisible($(gridApi.grid.element[0]))) return;
-
-        let gridSize = $(gridApi.grid.element[0]).width(),
-                resizedColumns = [],
-                fieldColumnCounter = 0,
-                columnWidthCounter = 0;
-
-        // Resize the columns with percentage width
-        gridApi.grid.columns.forEach((item, index) => {
-            if (item.visible) {
-                if (item.colDef.field) {
-                    if (item.originalWidth && item.originalWidth.indexOf && item.originalWidth.indexOf('%') != -1) {
-                        let newColSize = Math.floor(gridSize * (item.originalWidth.replace('%', '') / 100));
-                        
-                        if (gridApi.grid.columns[index].colDef.minWidth && parseInt(gridApi.grid.columns[index].colDef.minWidth) > newColSize)
-                            newColSize = parseInt(gridApi.grid.columns[index].colDef.minWidth);
-                        
-                        gridApi.grid.columns[index].width = gridApi.grid.columns[index].colDef.width = newColSize;
-
-                        columnWidthCounter = columnWidthCounter + gridApi.grid.columns[index].width;
-                        resizedColumns.push(index);
-                    }
-
-                    fieldColumnCounter++;
-                }
-                else
-                    gridSize = gridSize - item.width;
-            }
-        });
-
-        // Resize the columns that weren't set with percentage width with the remaining space
-        if (resizedColumns.length < fieldColumnCounter) {
-            let columnWidthDiff = Math.floor((gridSize - columnWidthCounter) / (fieldColumnCounter - resizedColumns.length));
-
-            gridApi.grid.columns.forEach((item, index) => {
-                if (item.visible && item.colDef.field && resizedColumns.indexOf(index) == -1)
-                    gridApi.grid.columns[index].width = gridApi.grid.columns[index].colDef.width = columnWidthDiff;
-            });
-        }
-        else if (columnWidthCounter > gridSize) {
-            let columnWidthDiff = columnWidthCounter - gridSize,
-                indexIterate = 0;
-            
-            while (columnWidthDiff > 0) {
-                if (indexIterate == gridApi.grid.columns.length)
-                    indexIterate = 0;
-
-                if (gridApi.grid.columns[indexIterate].visible && gridApi.grid.columns[indexIterate].colDef.field) {
-                    gridApi.grid.columns[indexIterate].width = gridApi.grid.columns[indexIterate].colDef.width = gridApi.grid.columns[indexIterate].width - 1;
-                    columnWidthDiff = columnWidthDiff - 1;
-                }
-
-                indexIterate++;
-            }
-        }
-
-        gridApi.grid.refreshCanvas(true);
-    }
-
-    // Set the columns width to a fixed pixel size, only on load, so the ui-grid itself won't resize them on window resize
-    _fixColumnsWidthFromPercentToPixel(gridApi) {
-        if (!this.firstRenderedIteration) {
-            let firstRun = false;
-
-            gridApi.grid.columns.forEach((item) => {
-                if (item.colDef.field && item.drawnWidth) {
-                    item.originalWidth = item.colDef.width;
-                    item.colDef.width = item.width;
-
-                    firstRun = true;
-                }
-            });
-
-            if (firstRun) {
-                this._calculateColumnsWidthByPercent(gridApi);
-                this.firstRenderedIteration = true;
-            }
-        }
-    }
-
-    // Resize the columns based on one column that is resized
-    _calculateColumnsWidthOnResize(gridApi, colDef, deltaChange) {
-        let indexChanged = -1,
-                indexIterate,
-                pixelsToDivide,
-                totalColumnWidth = 0;
-
-        // Check what column was actually resized
-        gridApi.grid.columns.forEach((item, index) => {
-            if (item.colDef === colDef)
-                indexChanged = index;
-
-            if (item.visible)
-                totalColumnWidth = totalColumnWidth + item.width;
-        });
-
-        indexIterate = indexChanged + 1;
-        pixelsToDivide = $(gridApi.grid.element[0]).width() - totalColumnWidth;
-        gridApi.grid.columns[indexChanged].colDef.width = gridApi.grid.columns[indexChanged].width;
-
-        // Resize the columns that follow the resized column
-        while (pixelsToDivide != 0 && indexIterate < gridApi.grid.columns.length) {
-            if (indexIterate == gridApi.grid.columns.length)
-                indexIterate = 0;
-            while (!gridApi.grid.columns[indexIterate].colDef.field)
-                indexIterate++;
-
-            if (gridApi.grid.columns[indexIterate].width + pixelsToDivide < MIN_COLUMN_WIDTH) {
-                pixelsToDivide = pixelsToDivide + (gridApi.grid.columns[indexIterate].width - MIN_COLUMN_WIDTH);
-                gridApi.grid.columns[indexIterate].width = gridApi.grid.columns[indexIterate].colDef.width = MIN_COLUMN_WIDTH;
-            }
-            else {
-                gridApi.grid.columns[indexIterate].width = gridApi.grid.columns[indexIterate].colDef.width = gridApi.grid.columns[indexIterate].width + pixelsToDivide;
-                pixelsToDivide = 0;
-            }
-
-            indexIterate++;
-        }
-
-        // If the column was resized too much, shorten it so the grid won't overflow
-        if (pixelsToDivide != 0)
-            gridApi.grid.columns[indexChanged].width = gridApi.grid.columns[indexChanged].colDef.width = gridApi.grid.columns[indexChanged].width + pixelsToDivide;
-
-        gridApi.grid.refreshCanvas(true);
-    }
-
-    _handleColumnResize() {
-        this.afterRegister((gridApi) => {
-            this.calculateFn = () => this._calculateColumnsWidthByPercent(gridApi);
-
-            $($window).resize(this.calculateFn);
-            gridApi.core.on.rowsRendered(this.scope, () => this._fixColumnsWidthFromPercentToPixel(gridApi));
-            if (gridApi.colResizable)
-                gridApi.colResizable.on.columnSizeChanged(this.scope, (colDef, deltaChange) => this._calculateColumnsWidthOnResize(gridApi, colDef, deltaChange));
-        });
-    }
-
-    setButtons(buttons) {
-        if (!this.scope) {
-            throw 'Must set scope to use buttons';
-        }
-        this.buttons = buttons;
-        return this;
-    }
-
-    setBatchActions(batchActions) {
-        this.batchActions = batchActions;
-        this.setMultiSelect();
-        return this;
-    }
-
-    setGridData(data) {
-        this.data = data;
-        this.afterRegister((gridApi) => {
-            gridApi.grid.element.css('visibility', 'visible');
-            this.fixGroupingUndefinedValues()
-        });
-
-        if (!this.data || !this.data.length) {
-            // if the grid is empty push an empty object
-            this.data = [{_emptyRow: true}];
-            // Also disable select all in header
-            this.enableSelectAll = false;
-        }
-        else {
-            // In case select all was chosen, re-enable it after data was added
-            this.enableSelectAll = this._allowMultiSelect;
-        }
-
-        this._resize();
-
-        return this;
-    }
-
-
-    _resize() {
-        let dataLen = this.api ? this.api.core.getVisibleRows().length : this.data.length;
-        // at least 1 row
-        this.minRowsToShow = Math.max(1, dataLen);
-
-        // if grid is already displayed - recalculate its height. ui-grid doesn't have an API call for this
-        if (this.api) {
-            let grid = this.api.grid;
-            let height = this.minRowsToShow * grid.options.rowHeight + grid.options.headerRowHeight;
-
-            // (Adam) This is instead of ui-grid-auto-resize which has a 250ms interval that causes the grid to flicker
-            grid.element.css('height', height + 'px');
-            grid.element.find('.ui-grid-viewport').css('height', height - this.headerRowHeight + 'px');
-            grid.gridHeight = height;
-        }
-    }
-
-    onRegisterApi(gridApi) {
-        this.api = gridApi;
-
-        if (this.scope === undefined) {
-            this.scope = null;
-        }
-
-        this.api.core.on.rowsRendered(this.scope, () => {
-            this._resize();
-        });
-
-        if (this.onSelectionChange && this.api.selection) {
-            this.api.selection.on.rowSelectionChanged(this.scope, this.onSelectionChange);
-        }
-        if (this.onSelectionChangeBatch && this.api.selection) {
-            this.api.selection.on.rowSelectionChangedBatch(this.scope, this.onSelectionChangeBatch);
-        }
-
-
-        if (this.scope) {
-            if (!this.scope.grids) {
-                this.scope.grids = {};
-            }
-            this.scope.grids[gridApi.grid.id] = {buttons: this.buttons};
-        }
-
-        this._afterRegister.forEach((callback) => {
-            callback(gridApi);
-        });
-        return this;
-    }
-
-    setRowTemplate(fileName) {
-        if (fileName) {
-            this.rowTemplate = TEMPLATES_FOLDER + fileName + '.html';
-        }
-        return this;
-    }
-
-    setDraggable(callbackFunc) {
-        this.setRowTemplate('drag_rows');
-        this.draggablefunc = callbackFunc;
-        this.afterRegister((gridApi) => {
-            gridApi.draggableRows.on.rowDropped(this.scope, (info, dropTarget) => {
-                this.draggablefunc(info, dropTarget);
-            });
-        });
-        return this;
-    }
-
-    setMultiSelect() {
-        this.enableRowHeaderSelection = true;
-
-        this.multiSelect = true;
-        this.enableSelectAll = true;
-        this._allowMultiSelect = true;
-        this.selectionRowHeaderWidth = 40;
-        return this;
-    }
-
-    setSingleSelect() {
-        this.enableRowHeaderSelection = true;
-        this.multiSelect = false;
-        this.enableSelectAll = true;
-        this._allowMultiSelect = false;
-        this.selectionRowHeaderWidth = 40;
-
-        return this;
-    }
-
-    setMinRowToShow(number) {
-        this.minRowsToShow = number;
-        return this;
-    }
-
-    selectItem(item) {
-        $timeout(() => this.api.selection.selectRow(item));
-    }
-
-    onDestroy() {
-        $($window).off('resize', this.calculateFn);
-    }
-
-    isOverflowing(cellId) {
-
-        let elem = $('#'+cellId);
-        let text = elem.children('.gridcell-content-text');
-        let showAll = elem.children('.gridcell-showall');
-        let cellItemContent = elem.text().trim();
-        let width = 0;
-        if (showAll.length) {
-            width = showAll.outerWidth();
-        }
-//        showAll.css('background-color',elem.parent().css('background-color'));
-        if (cellItemContent.length > 0 && elem[0].scrollWidth > elem.innerWidth()) {
-//            elem.css('padding-right',width+'px');
-            elem.addClass('overflow')
-            return true;
-        }
-        else {
-            elem.removeClass('overflow')
-//            elem.css('padding-right','5px');
-            return false;
-        }
-
-    }
-
-    showAll(model,rowName,col) {
-
-        let objectName = _.startCase(this.gridObjectName.indexOf('/')>=0 ? this.gridObjectName.split('/')[0] : this.gridObjectName);
-
-        let modalScope = $rootScope.$new();
-
-        modalScope.items = model;
-        modalScope.colName = col.displayName || col.name;
-        modalScope.rowName = rowName;
-        modalScope.objectName = objectName;
-
-        modalScope.filter = {};
-        modalScope.filterItem = (item) => {
-            if (modalScope.filter.text) {
-                let regex = new RegExp('.*' + modalScope.filter.text.split('*').join('.*') + '.*', "i");
-                return regex.test(item);
-            }
-            else return true;
-        };
-
-        modalScope.noResults = () => {
-            let filteredResults = _.filter(modalScope.items, (item)=>{
-                return modalScope.filterItem(item);
-            });
-            return filteredResults.length === 0;
-        };
-
-        $modal.open({
-            scope: modalScope,
-            templateUrl: 'ui_components/artifactory_grid/show_all_modal.html',
-            backdrop: true,
-            size: 'sm'
-        });
-    }
-}
-
-
-export class ArtifactoryGridFactory {
-    constructor(uiGridConstants, _$timeout_, _$window_, _$state_, _$modal_,_$rootScope_, _artifactoryDownload_) {
-        $timeout = _$timeout_;
-        $window = _$window_;
-        $state = _$state_;
-        $modal = _$modal_;
-        download = _artifactoryDownload_;
-        $rootScope = _$rootScope_;
-
-        this.uiGridConstants = uiGridConstants;
-        this.createContextMenu();
-
-   }
-
-    getGridInstance(scope) {
-        return new ArtifactoryGrid(scope, this.uiGridConstants);
-    }
-
-    createContextMenu() {
-        $.contextMenu({
-            selector: '.ui-grid-cell-contents, .grid-cell-checkbox',
-            build: ($trigger,e) => {
-
-                let row = angular.element($trigger[0]).scope().row;
-                let grid = angular.element($trigger[0]).controller('uiGrid').grid;
-                let rowActions = grid.appScope.grids[grid.id].buttons;
-                let customActionsRaw = _.pluck(grid.columns,'colDef.customActions');
-                let allActions = [];
-                if (customActionsRaw) {
-                    customActionsRaw.forEach((acts)=>{
-                        if (acts) {
-                            acts.forEach((act)=>{
-                                allActions.push(act);
-                            })
-                        }
-                    });
-                }
-                if (rowActions) {
-                    rowActions.forEach((act)=>{
-                        allActions.push(act);
-                    });
-                }
-
-                allActions = _.filter(allActions,(act)=>{
-                    return row && (!act.visibleWhen || act.visibleWhen(row.entity));
-                });
-
-                let editAction = this._getEditAction($trigger,row,grid);
-                let additionalActions = this._getAdditionalActions($trigger,row,grid);
-
-                if ((!allActions.length && !editAction && additionalActions.length === 0) || !row) {
-                    return false;
-                }
-                else {
-                    let cmItems = {};
-
-                    if (editAction) {
-                        cmItems['*edit*'] = {
-                            name: 'Edit',
-                            icon: 'artifactory-edit'
-                        }
-                    }
-
-                    let getIconName = (classdef) => {
-                        let iconName;
-                        let classes = classdef.split(' ');
-                        classes.forEach((cls)=>{
-                            if (cls.startsWith('icon-')) {
-                                iconName = cls.substr(5);
-                            }
-                        });
-                        return iconName;
-                    };
-
-                    if (additionalActions) {
-                        for (let i in additionalActions) {
-                            let action = additionalActions[i];
-                            cmItems['@'+action.name] = {
-                                name: action.name,
-                                icon: getIconName(action.icon)
-                            }
-                        }
-                    }
-
-                    for (let actI in allActions) {
-                        let act = allActions[actI];
-                        act.key = act.tooltip.split(' ').join('').toLowerCase();
-                        cmItems[act.key] = {
-                            name: act.tooltip,
-                            icon: getIconName(act.icon)
-                        }
-                    }
-
-                    $timeout(()=>{
-                        $('.context-menu-item').on('click',(e)=>{
-                            if (this.actionToDo) {
-                                $(e.target).trigger('contextmenu:hide');
-                                $timeout(()=>{
-                                    this.actionToDo();
-                                    delete this.actionToDo;
-                                },100);
-                            }
-                        });
-                    });
-
-                    return {
-                        callback: (key, options) => {
-                            this.actionToDo = () => {
-                                if (key === '*edit*') {
-                                    editAction.do();
-                                }
-                                else if (key.startsWith('@')) {
-                                    let actionName = key.substr(1);
-                                    let action = _.findWhere(additionalActions, {name: actionName});
-                                    action.do();
-                                }
-                                else {
-                                    let act = _.findWhere(allActions,{key: key});
-                                    act.callback(row.entity);
-                                    if (act.href) {
-                                        let url = act.href(row.entity);
-                                        download(url);
-                                    }
-                                }
-                            };
-                            return false;
-                        },
-                        items: cmItems
-                    }
-
-                }
-
-            }
-        });
-    }
-
-    _getEditAction($trigger,row,grid) {
-        let objScope = {row:row,grid:grid};
-        let editState = $trigger.parent().parent().find('[ui-sref]:not(.no-cm-action)').length ? $trigger.parent().parent().find('[ui-sref]:not(.no-cm-action)')[0].attributes['ui-sref'].textContent : null;
-        if (editState) {
-            let parenthesesOpenIndex = editState.indexOf('(');
-            let state = editState.substr(0,parenthesesOpenIndex);
-            let paramsString = editState.substr(parenthesesOpenIndex);
-            let openBraceIndex = paramsString.indexOf('{');
-            let closeBraceIndex = paramsString.lastIndexOf('}');
-            paramsString = paramsString.substr(openBraceIndex+1,closeBraceIndex-openBraceIndex-1);
-
-            let paramsObj = {};
-
-            let paramsSplit = paramsString.split(',');
-
-            paramsSplit.forEach((param)=>{
-                let keyVal = param.split(':');
-                let key = keyVal[0].trim();
-                let val = keyVal[1].trim();
-                if (val.startsWith('row.') || val.startsWith('grid.')) val = _.get(objScope,val);
-                else if (val.startsWith('!row.') || val.startsWith('!grid.')) val = !_.get(objScope,val);
-
-                else if (val.startsWith("'")) val = val.split("'").join('');
-                else if (val.startsWith('"')) val = val.split('"').join('');
-                paramsObj[key]=val;
-            });
-
-            return {
-                do: ()=>{
-                    $state.go(state,paramsObj);
-                }
-            }
-        }
-        else {
-            let ngClicks = $trigger.parent().parent().find('[ng-click]:not(.no-cm-action)');
-            let clickCommand;
-            for (let i in ngClicks) {
-                let ngClick = ngClicks[i];
-                if (ngClick.attributes && ngClick.attributes['ng-click'] && ngClick.attributes['ng-click'].textContent.startsWith('grid.appScope')) {
-                    clickCommand = ngClick.attributes['ng-click'].textContent;
-                    break;
-                }
-            }
-
-            if (clickCommand) {
-                let parenthesesOpenIndex = clickCommand.indexOf('(');
-                let funcName = clickCommand.substr(0,parenthesesOpenIndex);
-                let paramsString = clickCommand.substr(parenthesesOpenIndex).split('(').join('').split(')').join('').trim();
-                let param = _.get(objScope,paramsString);
-
-                let funcThis = _.get(objScope,funcName.substr(0,funcName.lastIndexOf('.')));
-                let func = _.get(objScope,funcName).bind(funcThis);
-
-                return {
-                    do: () => {
-                        func(param);
-                    }
-                }
-            }
-            else return null;
-
-        }
-    }
-
-    _getAdditionalActions($trigger,row,grid) {
-        let objScope = {row:row,grid:grid};
-        let additionalCommands = [];
-        let additionalElems = $trigger.parent().parent().find('[cm-aditional-action]');
-        for (let i = 0; i<additionalElems.length; i++) {
-            let elem = additionalElems[i];
-            let clickCommand = elem.attributes['ng-click'].textContent;
-            let icon = elem.attributes['class'].textContent;
-            let commandName = elem.attributes['cm-aditional-action'].textContent;
-
-            if (clickCommand) {
-                let parenthesesOpenIndex = clickCommand.indexOf('(');
-                let funcName = clickCommand.substr(0,parenthesesOpenIndex);
-                let paramsString = clickCommand.substr(parenthesesOpenIndex).split('(').join('').split(')').join('').trim();
-                let param = _.get(objScope,paramsString);
-
-                let funcThis = _.get(objScope,funcName.substr(0,funcName.lastIndexOf('.')));
-                let func = _.get(objScope,funcName).bind(funcThis);
-
-                additionalCommands.push({
-                    name: commandName,
-                    icon: icon,
-                    do: () => {
-                        func(param);
-                    }
-                });
-            }
-        }
-
-        return additionalCommands;
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_grid/artifactory_grid.module.js b/web/angular-web/src/main/webapp/app/ui_components/artifactory_grid/artifactory_grid.module.js
deleted file mode 100644
index 2aa9a3d..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_grid/artifactory_grid.module.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import {ArtifactoryGridFactory} from './artifactory_grid';
-import {ARTIFACTORY_GRID} from './artifactory_grid_constants'
-
-export default angular.module('artifactory_grid', [
-		'ui.grid',
-		'ui.grid.autoResize',
-	    'ui.grid.edit',
-	    'ui.grid.selection',
-	    'ui.grid.pagination',
-	    'ui.grid.grouping',
-		'ui.grid.resizeColumns'
-	])
-    .service('ArtifactoryGridFactory', ArtifactoryGridFactory)
-    .constant('ARTIFACTORY_GRID', ARTIFACTORY_GRID);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_grid/artifactory_grid_constants.js b/web/angular-web/src/main/webapp/app/ui_components/artifactory_grid/artifactory_grid_constants.js
deleted file mode 100644
index c61cab8..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_grid/artifactory_grid_constants.js
+++ /dev/null
@@ -1,9 +0,0 @@
-export const ARTIFACTORY_GRID = {
-    TEMPLATES_FOLDER : "main/webapp/app/ui_components/artifactory_grid/artifactory_grid_constants.js"
-}
-
-//angular.module('Webapp.services').constant('ARTIFACTORY_GRID', {
-//
-//    TEMPLATES_FOLDER : "main/webapp/app/ui_components/artifactory_grid/artifactory_grid_constants.js"
-//
-//});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_grid/show_all_modal.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_grid/show_all_modal.html
deleted file mode 100644
index 887aaa2..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_grid/show_all_modal.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<div id="show-all-modal">
-    <div class="modal-header">
-        <button type="button" class="close" data-dismiss="close" aria-label="Close" ng-click="$dismiss()"><span aria-hidden="true">×</span></button>
-        <h4 class="modal-title" id="popup-header">{{items.length}} {{colName}} For {{objectName}} '{{rowName}}'</h4>
-    </div>
-    <div class="modal-body clearfix">
-        <input type="text"
-               name="filter"
-               class="input-text"
-               ng-model="filter.text"
-               placeholder="Filter"/>
-
-
-        <div class="group-list-wrapper" ng-if="!noResults()">
-            <ul class="group-list">
-                <li class="group-list-item"
-                    ng-repeat="item in items"
-                    ng-if="filterItem(item)">
-                    {{item}}
-                </li>
-            </ul>
-        </div>
-
-        <div class="alert alert-warning margin-top-10" ng-if="noResults()">
-            No results match the provided filter
-        </div>
-    </div>
-    <div class="modal-footer">
-        <button class="btn btn-default" ng-click="$dismiss()" id="popup-cancel">Close</button>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_grid/templates/default.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_grid/templates/default.html
deleted file mode 100644
index e6f7fd0..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_grid/templates/default.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!-- When there are no results, we push an element with _emptyRow propery -->
-<div ng-if="row.entity._emptyRow">
-    <div
-            ng-repeat="(colRenderIndex, col) in colContainer.renderedColumns track by col.colDef.name"
-            class="ui-grid-cell grid-cell-empty"
-            ui-grid-cell>
-    </div>
-</div>
-<!-- When there are results -->
-<div ng-if="!row.entity._emptyRow" ng-class="{'special-row': row.entity._specialRow}">
-    <div class="grid-action-bar"
-         ng-if="!row.groupHeader">
-        <a ng-repeat="button in grid.appScope.grids[grid.id].buttons" ng-if="!button.visibleWhen || button.visibleWhen(row.entity)"
-           class="btn btn-action"
-           ng-click="button.callback(row.entity, row)"
-           jf-tooltip="{{button.tooltip}}">
-            <i class="icon-2x {{button.icon}}"></i>
-        </a>
-    </div>
-
-    <div
-            ng-repeat="(colRenderIndex, col) in colContainer.renderedColumns track by col.colDef.name"
-            class="ui-grid-cell"
-            ng-class="{ 'ui-grid-row-header-cell': col.isRowHeader,'expandedRow':row.expandedState.state==='expanded',
-                        'grouped-column': (col.grouping.groupPriority >= 0 && (row.groupLevel === null || row.groupLevel === undefined) ) }"
-            ui-grid-cell>
-        <div class="grid-action-bar"
-         ng-if="!row.groupHeader">
-            <a ng-repeat="action in col.colDef.customActions" ng-if="!action.visibleWhen || action.visibleWhen(row.entity)"
-               class="btn btn-action"
-               ng-click="action.callback(row.entity, row)"
-               jf-tooltip="{{action.tooltip}}"
-               ng-href="{{action.href(row.entity)}}">
-                <i class="{{action.icon}}"></i>
-            </a>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_grid/templates/drag_rows.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_grid/templates/drag_rows.html
deleted file mode 100644
index 8a275e2..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_grid/templates/drag_rows.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!-- When there are no results, we push an element with _emptyRow propery -->
-
-<div grid="grid" class="ui-grid-draggable-row" draggable="true">
-    <div ng-if="row.entity._emptyRow">
-        <div
-                ng-repeat="(colRenderIndex, col) in colContainer.renderedColumns track by col.colDef.name"
-                class="ui-grid-cell grid-cell-empty"
-                ui-grid-cell>
-        </div>
-    </div>
-    <!-- When there are results -->
-    <div ng-if="!row.entity._emptyRow">
-        <div class="grid-action-bar"
-             ng-if="!row.groupHeader">
-            <a ng-repeat="button in grid.appScope.grids[grid.id].buttons"
-               ng-if="!button.visibleWhen || button.visibleWhen(row.entity)"
-               class="btn btn-action"
-               ng-click="button.callback(row.entity, row)"
-               jf-tooltip="{{button.tooltip}}">
-                <i class="icon-2x {{button.icon}}"></i>
-            </a>
-        </div>
-
-        <div
-                ng-repeat="(colRenderIndex, col) in colContainer.renderedColumns track by col.colDef.name"
-                class="ui-grid-cell"
-                ng-class="{ 'ui-grid-row-header-cell': col.isRowHeader,'expandedRow':row.expandedState.state==='expanded',
-                        'grouped-column': (col.grouping.groupPriority >= 0 && (row.groupLevel === null || row.groupLevel === undefined) ) }"
-                ui-grid-cell>
-            <div class="grid-action-bar"
-                 ng-if="!row.groupHeader">
-                <a ng-repeat="action in col.colDef.customActions"
-                   ng-if="!action.visibleWhen || action.visibleWhen(row.entity)"
-                   class="btn btn-action"
-                   ng-click="action.callback(row.entity, row)"
-                   jf-tooltip="{{action.tooltip}}">
-                    <i class="{{action.icon}}"></i>
-                </a>
-            </div>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_grid/templates/headerCellDefaultTemplate.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_grid/templates/headerCellDefaultTemplate.html
deleted file mode 100644
index 1d08307..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_grid/templates/headerCellDefaultTemplate.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<div ng-class="{ 'sortable': sortable, 'sorting-active': col.sort.direction }">
-    <!-- <div class="ui-grid-vertical-bar"> </div> -->
-    <div class="ui-grid-cell-contents" col-index="renderIndex">
-        <span>{{ col.displayName CUSTOM_FILTERS }}</span>
-
-    <span ui-grid-visible="col.sort.direction" ng-class="{ 'ui-grid-icon-up-dir': col.sort.direction == asc, 'ui-grid-icon-down-dir': col.sort.direction == desc, 'ui-grid-icon-blank': !col.sort.direction }">
-       
-    </span>
-    </div>
-
-    <div class="ui-grid-column-menu-button" ng-if="grid.options.enableColumnMenus && !col.isRowHeader  && col.colDef.enableColumnMenu !== false" ng-click="toggleMenu($event)" ng-class="{'ui-grid-column-menu-button-last-col': isLastCol}">
-        <i class="ui-grid-icon-angle-down"> </i>
-    </div>
-
-    <div ui-grid-filter></div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_grid/templates/headerCellTemplate.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_grid/templates/headerCellTemplate.html
deleted file mode 100644
index d67ec45..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_grid/templates/headerCellTemplate.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<div ng-class="{ 'sortable': sortable, 'sorting-active': col.sort.direction }">
-    <!-- <div class="ui-grid-vertical-bar"> </div> -->
-    <div class="ui-grid-cell-contents" col-index="renderIndex">
-        <!--<span>{{ col.displayName CUSTOM_FILTERS }}</span>-->
-        <span>{{ col.displayName}}</span>
-        <div class="group-button icon-grouping-off"
-             jf-tooltip="Group By"
-             ng-click="grid.api.grouping.clearGrouping(); grid.api.grouping.groupColumn(col.displayName)"
-             ng-if="grid.api.grid.rows.length > 0 && grid.api.grid.rows[0].entity._emptyRow === undefined &&
-             (!grid.api.grouping.getGrouping().grouping.length || grid.api.grouping.getGrouping().grouping[0].colName != col.displayName)"></div>
-        <div class="group-button icon-grouping-on"
-             jf-tooltip="Ungroup"
-             ng-click="grid.api.grouping.clearGrouping()"
-             ng-if="grid.api.grid.rows.length>0 && grid.api.grid.rows[0].entity._emptyRow === undefined && grid.api.grouping.getGrouping().grouping.length
-             && grid.api.grouping.getGrouping().grouping[0].colName==col.displayName"></div>
-        <span ui-grid-visible="col.sort.direction" ng-class="{ 'ui-grid-icon-up-dir': col.sort.direction == asc, 'ui-grid-icon-down-dir': col.sort.direction == desc, 'ui-grid-icon-blank': !col.sort.direction }">
-           
-        </span>
-    </div>
-
-    <!--<div class="ui-grid-column-menu-button" ng-if="grid.options.enableColumnMenus && !col.isRowHeader  && col.colDef.enableColumnMenu !== false" ng-click="toggleMenu($event)" ng-class="{'ui-grid-column-menu-button-last-col': isLastCol}">-->
-    <!--<i class="ui-grid-icon-angle-down"> </i>-->
-    <!--</div>-->
-
-    <div ui-grid-filter></div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/artifactory_modal.js b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/artifactory_modal.js
deleted file mode 100644
index 734e080..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/artifactory_modal.js
+++ /dev/null
@@ -1,106 +0,0 @@
-
-import EVENTS     from '../../constants/artifacts_events.constants';
-
-/**
- * @desc wrapper around the $modal service
- * @url http://angular-ui.github.io/bootstrap/#/modal
- */
-export class ArtifactoryModal {
-
-    constructor($modal, $rootScope, $q, $sce, ArtifactoryEventBus, $timeout) {
-        this.modal = $modal;
-        this.$timeout = $timeout;
-        this.$rootScope = $rootScope;
-        this.$q = $q;
-        this.$sce = $sce;
-        this.templatesBaseUrl = 'ui_components/artifactory_modal/templates/';
-        this.artifactoryEventBus = ArtifactoryEventBus;
-
-
-
-    }
-
-    /**
-     * build the path to the template location
-     * and delegate to the $modal service
-     * return the modal instance
-     *
-     * @param template
-     * @param scope
-     * @returns {{Modal instance}}
-     */
-    launchModal(template, scope, size) {
-        if (!size) size = 'lg';
-
-        let templateUrl = this.templatesBaseUrl + template + '.html';
-        let modalInstance =  this.modal.open({
-            templateUrl: templateUrl,
-            scope: scope,
-            size: size
-        });
-        this.artifactoryEventBus.registerOnScope(this.$rootScope, EVENTS.CLOSE_MODAL, () => {
-            modalInstance.dismiss();
-        });
-
-        if (typeof size == 'number') {
-            this.$timeout(() => {
-                $('.modal-dialog').css('max-width', size)
-            });
-        }
-
-        return modalInstance;
-    }
-
-    /**
-     * launch a modal that shows content in a codemirror container
-     *
-     * @param title - title of the modal
-     * @param content - content for the code mirror container
-     * @param mode - mode for code mirror editor options (usually {name: <mimetype>}
-     * @param beforeMessage - message to insert before the codemirror element
-     * @returns {{Modal instance}}
-     */
-    launchCodeModal(title, content, mode, beforeMessage = undefined,objectName = undefined) {
-        let modalInstance;
-        let modalScope = this.$rootScope.$new();
-        modalScope.closeModal = () => modalInstance.close();
-        modalScope.content = content;
-        modalScope.mode = mode;
-        modalScope.title = title;
-        modalScope.beforeMessage = beforeMessage;
-        modalScope.objectName = objectName;
-        return modalInstance = this.launchModal('code_modal', modalScope);
-    }
-
-
-    /**
-     * launch a modal that shows a confirmation box, and returns a promise
-     *
-     * @param title - title of the confirmation box
-     * @param content - HTML content of the confirmation box
-     * @param buttons - button text (Object(confirm: String, cancel: String))
-     * @returns promise - resolved if the user confirmed, rejected otherwise
-     */
-    confirm(content, title, buttons, checkboxLabel, checkBoxChangeListener) {
-        buttons = buttons || {};
-        buttons.confirm = buttons.confirm || 'Confirm';
-        buttons.cancel = buttons.cancel || 'Cancel';
-        title = title || 'Are you sure?';
-
-        let modalInstance;
-        let modalScope = this.$rootScope.$new();
-
-        modalScope.buttons = buttons;
-        modalScope.content = this.$sce.trustAsHtml(content);
-        modalScope.title = title;
-        modalScope.checkboxLabel = checkboxLabel;
-        modalScope.checkbox = {checked: false};
-        modalScope.onCheckboxStateChange = (state) => {
-            if (checkBoxChangeListener) checkBoxChangeListener(state,modalScope);
-        };
-
-        return this.launchModal('confirm_modal', modalScope, 'sm').result;
-    }
-
-}
-
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/artifactory_modal.module.js b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/artifactory_modal.module.js
deleted file mode 100644
index 6d12b59..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/artifactory_modal.module.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import {ArtifactoryModal} from './artifactory_modal.js';
-import {PushToBintrayModal} from './push_to_bintray_modal.js';
-
-export default angular.module('artifactory_modal', ['ui.bootstrap'])
-    .service('ArtifactoryModal', ArtifactoryModal)
-    .service('PushToBintrayModal', PushToBintrayModal);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/push_to_bintray_modal.js b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/push_to_bintray_modal.js
deleted file mode 100644
index d74807e..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/push_to_bintray_modal.js
+++ /dev/null
@@ -1,262 +0,0 @@
-import TOOLTIP from '../../constants/artifact_tooltip.constant';
-
-export class PushToBintrayModal {
-    constructor($stateParams, $rootScope, $q, ArtifactoryModal, PushToBintrayDao, ArtifactoryNotifications) {
-
-        this.ArtifactoryNotifications = ArtifactoryNotifications;
-        this.$rootScope = $rootScope;
-        this.$stateParams = $stateParams;
-        this.$q = $q;
-        this.modal = ArtifactoryModal;
-        this.ptbDao = PushToBintrayDao;
-    }
-
-    _getBuildBintrayRepositories() {
-        this.ptbDao.getBuildRepos().$promise.then((data) => {
-            this.modalScope.data.bintrayRepos = _.map(data.binTrayRepositories,(repo) => {return {text:repo ,value: repo}});
-
-        })
-            .catch((err) => {
-                if (err.data && err.data.feedbackMsg && err.data.feedbackMsg.error) {
-                    let msg = err.data.feedbackMsg.error;
-                    this.ArtifactoryNotifications.create({error: msg});
-                }
-            });
-
-    }
-
-    _getBuildBintrayPackages() {
-        this.ptbDao.getBuildPacks({key: this.modalScope.selection.bintrayRepo}).$promise.then((data) => {
-            data.binTrayPackages = _.filter(data.binTrayPackages,(pack) => {return pack!=='_'});
-            this.modalScope.data.bintrayPackages = _.map(data.binTrayPackages,(pack) => {return {text:pack ,value: pack}});
-            if (data.binTrayPackages && data.binTrayPackages.length) {
-                if (!this.modalScope.selection.bintrayPackageName) this.modalScope.selection.bintrayPackageName = data.binTrayPackages[0];
-            }
-            if (this.modalScope.selection.bintrayPackageName) {
-                this._getBuildBintrayVersions();
-            }
-            else {
-                this.modalScope.data.bintrayPackageVersions = [{text:'1.0' ,value: '1.0'}];
-                this.modalScope.selection.bintrayPackageVersion = '1.0';
-            }
-        });
-    }
-
-    _getBuildBintrayVersions() {
-        this.ptbDao.getBuildVersions({
-            key: this.modalScope.selection.bintrayRepo,
-            id: this.modalScope.selection.bintrayPackageName
-        }).$promise.then((data) => {
-                    this.modalScope.data.bintrayPackageVersions = _.map(data.binTrayVersions,(ver) => {return {text:ver ,value: ver}});
-                    if (data.binTrayVersions && data.binTrayVersions.length && !this.modalScope.selection.bintrayPackageVersion) {
-                        this.modalScope.selection.bintrayPackageVersion = data.binTrayVersions[0];
-                    }
-
-                })
-        .catch(()=>{
-                    this.modalScope.data.bintrayPackageVersions = [{text:'1.0' ,value: '1.0'}];
-                    this.modalScope.selection.bintrayPackageVersion = '1.0';
-                })
-    }
-
-    _pushBuildToBintray(backgroundPush) {
-
-        let payload = {
-
-            buildName: this.$stateParams.buildName,
-            buildNumber: this.$stateParams.buildNumber,
-            buildTime: this.$stateParams.startTime,
-            bintrayParams: {
-                useExistingProps: this.modalScope.selection.useSpecificProperties,
-                notify: this.modalScope.selection.sendEmail,
-                repo: this.modalScope.selection.bintrayRepo,
-                packageId: this.modalScope.selection.bintrayPackageName,
-                version: this.modalScope.selection.bintrayPackageVersion
-            }
-        };
-
-        this.ptbDao.pushBuildToBintray({background: backgroundPush}, payload).$promise.then((response)=> {
-            this.createPushToBintrayResponse(response);
-        }).finally(() => this.modalInstance.close());
-    }
-
-    _pushArtifactToBintray() {
-
-        let payload = {
-            bintrayParams: this.bintrayParams
-        };
-
-        payload.bintrayParams.repo = this.modalScope.selection.bintrayRepo;
-        payload.bintrayParams.packageId = this.modalScope.selection.bintrayPackageName;
-        payload.bintrayParams.version = this.modalScope.selection.bintrayPackageVersion;
-        payload.bintrayParams.path = this.modalScope.selection.filePath;
-
-        this.ptbDao.pushArtifactToBintray({
-            repoKey: this.params.repoKey,
-            path: this.params.path
-        }, payload).$promise.then((response)=> {
-                this.createPushToBintrayResponse(response);
-            }).finally(() => this.modalInstance.close());
-
-    }
-
-
-    _getArtifactBintrayData() {
-
-        this.ptbDao.getArtifactData({repoKey: this.params.repoKey, path: this.params.path}).$promise.then((data) => {
-            this.bintrayParams = data.bintrayParams;
-            this.modalScope.selection.bintrayRepo = data.bintrayParams.repo;
-            this.modalScope.selection.bintrayPackageName = data.bintrayParams.packageId;
-            this.modalScope.selection.filePath = data.bintrayParams.path;
-            this.modalScope.selection.bintrayPackageVersion = data.bintrayParams.version;
-
-            this.modalScope.data.bintrayRepos = _.map(data.binTrayRepositories, (repo) => {
-                return {text: repo, value: repo}
-            });//data.binTrayRepositories;
-            if (data.bintrayParams.packageId) this.modalScope.data.bintrayPackages = [data.bintrayParams.packageId];
-            if (data.bintrayParams.version) this.modalScope.data.bintrayPackageVersions = [{
-                text: data.bintrayParams.version,
-                value: data.bintrayParams.version
-            }];
-
-            if (this.modalScope.selection.bintrayRepo) this._getBuildBintrayPackages();
-        })
-            .catch((err) => {
-                if (err.data && err.data.feedbackMsg && err.data.feedbackMsg.error) {
-                    let msg = err.data.feedbackMsg.error;
-                    this.ArtifactoryNotifications.create({error: msg});
-                }
-            });
-    }
-
-
-    _pushDockerTagToBintray() {
-        let payload = {
-            bintrayParams: this.bintrayParams
-        };
-
-        payload.bintrayParams.repo = this.modalScope.selection.bintrayRepo;
-        payload.bintrayParams.path = this.modalScope.selection.filePath;
-
-        this.ptbDao.pushDockerTagToBintray({
-            repoKey: this.params.repoKey,
-            path: this.params.path
-        }, payload).$promise.then((response)=> {
-            this.createPushToBintrayResponse(response);
-        }).finally(() => this.modalInstance.close());
-    }
-
-    launchModal(type, params) {
-
-        let deferred = this.$q.defer();
-        this.modalScope = this.$rootScope.$new();
-        this.modalScope.selection = {};
-        this.modalScope.data = {};
-        this.modalScope.tooltip = TOOLTIP.artifacts.pushToBintray;
-
-        this.modalScope.cancel = () => {
-            this.modalInstance.close();
-            deferred.reject();
-        };
-
-        this.modalScope.onRepoSelect = () => {
-            if (type !== 'docker') this._getBuildBintrayPackages();
-        };
-        this.modalScope.onPackageSelect = () => {
-            this._getBuildBintrayVersions();
-        };
-
-        this.modalScope.selectizeConfigAdd = {
-            sortField: 'number',
-            create: true,
-            maxItems: 1
-        };
-        this.modalScope.selectizeConfigNoAdd = {
-            sortField: 'number',
-            create: false,
-            maxItems: 1
-        };
-
-
-        this.modalScope.pushType = type;
-
-        switch(type) {
-            case 'build': {
-                this.modalScope.push = () => {
-                    this._pushBuildToBintray(false);
-                };
-
-                this.modalScope.backgroundPush = () => {
-
-                    this._pushBuildToBintray(true);
-                };
-
-                this._getBuildBintrayRepositories();
-
-                break;
-            }
-            case 'artifact': {
-                this.modalScope.push = () => {
-                    this._pushArtifactToBintray();
-                };
-
-                let repoPath = params.repoPath;
-                let arr = repoPath.split(':');
-                let repoKey = arr[0];
-                let path = arr[1];
-
-                this.params = {repoKey: repoKey, path: path};
-
-                this._getArtifactBintrayData();
-
-                break;
-            }
-            case 'docker': {
-                this.modalScope.push = () => {
-                    this._pushDockerTagToBintray();
-                };
-
-                let repoPath = params.repoPath;
-                let arr = repoPath.split(':');
-                let repoKey = arr[0];
-                let path = arr[1];
-
-                let pathArr = path.split('/');
-                this.modalScope.docker = {
-                    tagName: pathArr.splice(pathArr.length-1,1),
-                    packageName: pathArr.join(':')
-                };
-
-                this.params = {repoKey: repoKey, path: path};
-
-                this._getArtifactBintrayData();
-
-                break;
-            }
-        }
-        this.modalInstance = this.modal.launchModal("push_to_bintray", this.modalScope);
-
-        return deferred.promise;
-
-    }
-
-    createPushToBintrayResponse(response) {
-        if (response.data.error) {
-            this.createPushToBintrayErrorResponse(response.data);
-            return;
-        }
-        let artifactBintrayUrl = response.data.url;
-        if (artifactBintrayUrl) {
-            this.ArtifactoryNotifications.createMessageWithHtml({
-                type: 'success',
-                body: `${response.data.info} <a href="${artifactBintrayUrl}" target="_blank">${artifactBintrayUrl}</a>`
-            });
-        }
-    }
-
-    createPushToBintrayErrorResponse(response) {
-        if (response.error) {
-            this.ArtifactoryNotifications.create(response);
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/add_license_modal.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/add_license_modal.html
deleted file mode 100644
index c1ceb78..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/add_license_modal.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<div class="modal-header">
-    <button type="button" class="close" data-dismiss="close" aria-label="Close" ng-click="closeModal()"><span
-            aria-hidden="true">×</span>
-    </button>
-    <h3 class="modal-title">{{modalTitle}}</h3>
-</div>
-<div class="modal-body clearfix">
-    <div class="found-license-container"
-         ng-if="foundLicense">Found License:
-        <span class="{{foundLicenseClass}}"> {{foundLicense}}</span>
-        <button class="btn btn-primary"
-                ng-if="overridable"
-                ng-click="override()">Select
-        </button>
-    </div>
-    <jf-drag-drop include-list="selectedLicenses"
-                  exclude-list="licenses"
-                  objects-name="Licenses"
-                  include-display-field="name"
-                  exclude-display-field="name"
-                  headers="{leftTitle:'Available Predefined Values',
-                            rightTitle:'Selected Predefined Values'}">
-
-    </jf-drag-drop>
-</div>
-<div class="modal-footer">
-    <div class="pull-right">
-        <button class="btn btn-default" ng-click="closeModal()">Cancel</button>
-        <button class="btn btn-primary" ng-click="saveLicenses(selectedLicenses)">Save</button>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/add_rule_modal.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/add_rule_modal.html
deleted file mode 100644
index 5737801..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/add_rule_modal.html
+++ /dev/null
@@ -1,186 +0,0 @@
-<form name="RepositoryForm.ruleForm">
-<div class="modal-header">
-    <button type="button" class="close" data-dismiss="close" aria-label="Close" ng-click="$dismiss()"><span
-            aria-hidden="true">×</span>
-    </button>
-    <h3 class="modal-title">{{title}}</h3>
-</div>
-<div class="modal-body clearfix rules-popup">
-
-    <div class="form-group">
-        <div class="form-group-cell">
-            <jf-field validations="distRepo">
-                <label class="mandatory" for="ruleName">Name</label>
-                <input type="text"
-                       class="input-text"
-                       name="ruleName"
-                       id="ruleName"
-                       ui-validate="{existRuleName: 'RepositoryForm.checkUniqueRuleName($value)'}"
-                       ng-model="rule.ruleName"
-                       autofocus
-                       required />
-            </jf-field>
-        </div>
-    </div>
-
-    <div>
-        <jf-panel jf-panel-heading="Artifactory Input" jf-panel-classes="borderless">
-            <div class="form-group">
-                <div class="form-group-cell">
-                    <label class="mandatory">Package Type</label>
-                    <ui-select ng-model="rule.selectedPackageType" ng-change="RepositoryForm.changeRuleRepoType();">
-                        <ui-select-match placeholder="Select Package Type...">
-                            <i ng-if="$select.selected.icon" class="select-repo-icon icon icon-{{$select.selected.icon}}"></i>
-                            {{$select.selected.text}}
-                        </ui-select-match>
-                        <ui-select-choices
-                                repeat="property in RepositoryForm.distributionRulesPackages | filter: $select.search track by property.text">
-                            <i ng-if="property.icon" class="select-repo-icon icon icon-{{property.icon}}"></i>
-                            <span ng-bind-html="property.text| highlight: $select.search"></span>
-                        </ui-select-choices>
-                    </ui-select>
-
-                </div>
-                <div class="form-group-cell" ng-if="RepositoryForm.rulesModalScope.rule.selectedPackageType.value == 'generic'">
-                    <label>Choose Layout</label>
-                    <ui-select ng-model="rule.RulePackageLayoutSelect" ng-change="RepositoryForm.changeRulePackageLayout();">
-                        <ui-select-match placeholder="Select Layout...">
-                            {{$select.selected}}
-                        </ui-select-match>
-
-                        <ui-select-choices
-                                repeat="property in RepositoryForm.ruleTokensByLayoutKeys | filter: $select.search track by property">
-                            <span ng-bind-html="property| highlight: $select.search"></span>
-                        </ui-select-choices>
-                    </ui-select>
-                </div>
-            </div>
-            <div class="form-group">
-                <div class="form-group-cell" ng-if="RepositoryForm.availableTokens.length">
-                    <label>Available Tokens</label>
-                    <div class="available-tokens"><ul><li ng-repeat="item in RepositoryForm.availableTokens | orderBy: item">{{item}}</li></ul></div>
-                </div>
-            </div>
-            <div class="form-group">
-                <div class="form-group-cell">
-                    <jf-field validations="text">
-                        <label>Repository Filter</label>
-                        <input type="text"
-                               class="input-text"
-                               name="filterRepo"
-                               id="filterRepo"
-                               placeholder="e.g. (.*)-local"
-                               ng-model="rule.filterRepo"/>
-                    </jf-field>
-                </div>
-            <!--</div>-->
-            <!--<div class="form-group">-->
-                <div class="form-group-cell">
-                    <jf-field validations="text">
-                        <label>Path Filter</label>
-                        <input type="text"
-                               class="input-text"
-                               name="filterPath"
-                               id="filterPath"
-                               placeholder="e.g. (.*).zip"
-                               ng-model="rule.filterPath"/>
-                    </jf-field>
-                </div>
-            </div>
-        </jf-panel>
-
-
-        <jf-panel jf-panel-heading="Bintray Output" jf-panel-classes="borderless">
-
-            <div class="form-group">
-                <div class="form-group-cell">
-
-                    <jf-field validations="text">
-                        <label for="distributionCoordinatesRepo" class="mandatory">Repository</label>
-                        <input type="text"
-                               class="input-text"
-                               name="distributionCoordinatesRepo"
-                               id="distributionCoordinatesRepo"
-                               ng-model="rule.distributionCoordinatesRepo"
-                               required />
-                    </jf-field>
-                </div>
-                <div class="form-group-cell">
-                    <jf-field validations="text">
-                        <label for="distributionCoordinatesPackage" class="mandatory">Package</label>
-                        <input type="text"
-                               class="input-text"
-                               name="distributionCoordinatesPackage"
-                               id="distributionCoordinatesPackage"
-                               ng-model="rule.distributionCoordinatesPackage"
-                               ng-disabled="rule.selectedPackageType.value === 'nuget' || rule.selectedPackageType.value === 'debian'"
-                               required />
-                    </jf-field>
-                    <span class="input-help-text" ng-style="{'visibility': rule.selectedPackageType.value === 'nuget' || rule.selectedPackageType.value === 'debian' ? 'visible' : 'hidden'}">Bintray package name must match the {{rule.selectedPackageType.serverEnumName}} package name</span>
-                </div>
-            </div>
-
-
-            <div class="form-group">
-
-                <div class="form-group-cell">
-                    <jf-field validations="text">
-                        <label for="distributionCoordinatesVersion" class="mandatory">Version</label>
-                        <input type="text"
-                               class="input-text"
-                               name="distributionCoordinatesVersion"
-                               id="distributionCoordinatesVersion"
-                               ng-model="rule.distributionCoordinatesVersion"
-                               required />
-                    </jf-field>
-                </div>
-
-                <div class="form-group-cell">
-                    <jf-field validations="text">
-                        <label for="distributionCoordinatesPath" class="mandatory">Path</label>
-                        <input type="text"
-                               class="input-text"
-                               name="distributionCoordinatesPath"
-                               id="distributionCoordinatesPath"
-                               ng-model="rule.distributionCoordinatesPath"
-                               ng-disabled="rule.selectedPackageType.value === 'docker'"
-                               required />
-                    </jf-field>
-                </div>
-            </div>
-
-        </jf-panel>
-
-    </div>
-
-    <!--<div>
-        <jf-panel jf-panel-heading="Rule Testing" jf-panel-classes="borderless">
-            <div class="form-group">
-
-                <div class="form-group-cell">
-                    <jf-field>
-                        <label for="testPath">Package Repo Path</label>
-                        <jf-help-tooltip text="Lorem ipsum dolor sit"></jf-help-tooltip>
-                        <input type="text"
-                               class="input-text"
-                               name="testPath"
-                               id="testPath"
-                               ng-model="rule.testPath" />
-                    </jf-field>
-                </div>
-                <div class="form-group-cell form-button">
-                    <button class="btn btn-secondary">Test</button>
-                </div>
-            </div>
-
-        </jf-panel>
-    </div>-->
-
-
-</div>
-
-<div class="modal-footer">
-    <button class="btn btn-default" type="button" ng-click="$dismiss()">Close</button>
-    <button class="btn btn-primary btn-dark" type="button" ng-click="RepositoryForm.saveDistributionRule()" ng-disabled="RepositoryForm.ruleForm.$invalid">Save</button>
-</div>
-</form>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/base_url_alert_modal.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/base_url_alert_modal.html
deleted file mode 100644
index f897eee..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/base_url_alert_modal.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<div class="modal-header">
-    <button type="button" class="close" data-dismiss="close" aria-label="Close" ng-click="$dismiss()"><span aria-hidden="true">×</span></button>
-    <h4 class="modal-title" id="popup-header">Notice</h4>
-</div>
-<div class="modal-body clearfix">
-    <h4 style="font-size: 15px"><b>Custom URL Base is not defined.</b></h4>
-    <div class="form-group" ng-if="context==='ssh'">
-        If Artifactory is installed behind a reverse proxy, it needs a URL base for you to use SSH authentication.<br>
-        Therefore, you must either configure the <a target="_blank" href="https://www.jfrog.com/confluence/display/RTF/Configuring+Artifactory#ConfiguringArtifactory-CustomURLBase">Custom URL Base</a> field, or pass the X-Artifactory-Override-Base-Url header.<br>
-        <br>
-        <a href ng-click="$close(true)">Click to save and go to configure the Custom URL Base</a>
-    </div>
-    <div class="form-group" ng-if="context==='cocoapods'">
-        If Artifactory is installed behind a reverse proxy, it needs a URL base to rewrite the cocoapods source reference URL.<br>
-        Therefore, you must either configure the <a target="_blank" href="https://www.jfrog.com/confluence/display/RTF/Configuring+Artifactory#ConfiguringArtifactory-CustomURLBase">Custom URL Base</a> field, or pass the X-Artifactory-Override-Base-Url header.<br>
-        <br>
-        <a href ng-click="$close(true)">Click to save and go to configure the Custom URL Base</a>
-    </div>
-
-</div>
-<div class="modal-footer">
-    <button class="btn btn-default" ng-click="$close(false)" id="popup-cancel">Save and Close</button>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/bintray_oauth_modal.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/bintray_oauth_modal.html
deleted file mode 100644
index 398cd56..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/bintray_oauth_modal.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<div class="modal-header">
-    <button type="button" class="close" data-dismiss="close" aria-label="Close" ng-click="$dismiss()"><span
-            aria-hidden="true">×</span></button>
-    <h3 class="modal-title">Bintray Authorization</h3>
-</div>
-<div class="modal-body property-modal">
-    <div ng-if="!isBackFromBintray">
-        <p>To use the distribution repository you will need to provide Artifactory with permission to your Bintray organization. In order to authorize Artifactory you will need to authenticate with Bintray admin credentials.</p>
-        <p class="text-right retrieve-token"><a href="" ng-click="RepositoryForm.goToBintray()"><i class="icon icon-bintray"></i> Get Authorization</a></p>
-    </div>
-    <div ng-if="isBackFromBintray">
-        Paste authorization code here:
-            <textarea rows="3"
-                      cols="5"
-                      class="input-text"
-                      ng-model="config.bintraySecretString"
-                      jf-enter-press="saveBintrayAuthInModel()"
-                      autofocus="true">
-            </textarea>
-        If you do not have an authorization code <a href="" ng-click="RepositoryForm.goToBintray()">navigate to Bintray</a> to retrieve code.
-    </div>
-</div>
-
-<div class="modal-footer" ng-if="isBackFromBintray">
-    <div class="pull-right">
-        <button class="btn btn-primary"
-                ng-click="saveBintrayAuthInModel()" ng-disabled="config.bintraySecretString == ''">Save
-        </button>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/browse_files_modal.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/browse_files_modal.html
deleted file mode 100644
index ef2ff28..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/browse_files_modal.html
+++ /dev/null
@@ -1,78 +0,0 @@
-<div class="modal-header">
-    <button type="button" class="close" data-dismiss="close" aria-label="Close" ng-click="closeModal()"><span aria-hidden="true">×</span></button>
-    <h4 class="modal-title">{{modalTitle}}</h4>
-</div>
-<div class="modal-body artifactory-browser noselect">
-    <div class="form-group">
-        <div class="form-group-cell root-select-cell">
-            <label>{{mountLabel}}</label>
-            <jf-ui-select jf-select-model="folder.currentRoot"
-                          jf-select-options="rootsList"
-                          jf-select-change="onChangeRoot()"></jf-ui-select>
-        </div>
-        <div class="form-group-cell folder-select-cell">
-            <label>{{pathLabel}}</label>
-            <input type="text"
-                   class="input-text"
-                   ng-model="folder.selectedFolder"
-                   ng-keypress="onPathKeyPress($event)"
-                   jf-auto-complete ui-items="pathAutoComplete" on-select="onPathAutoCompleteSelect(selection)">
-        </div>
-        <div class="form-group-cell form-button form-link">
-            <a href class="up-folder"
-               ng-click="upperFolder()"
-               ng-disabled="folderList.length == 0">
-                <i class="icon icon-folder"
-                   jf-tooltip="Up"></i>
-            </a>
-        </div>
-    </div>
-
-    <div class="browse-container">
-        <div ng-repeat="item in fileList"
-             class="browse-item-row"
-             ng-keypress="onKeyPress($event)"
-             tabindex="0"
-             ng-class="{selected: item===selectedItem}">
-            <div ng-click="setSelectedItem(item)"
-                 ng-dblclick="getDataList(item.fileSystemItemName)"
-                 class="file-wrapper browse-item"
-                 ng-if="item.folder">
-                    <span class="icon icon-folder"></span>
-                <span>{{item.fileSystemItemName}}</span>
-            </div>
-
-            <div ng-click="setSelectedItem(item)"
-                 class="file-wrapper browse-item"
-                 ng-if="!item.folder">
-                    <span class="icon icon-general"></span>
-                <span>{{item.fileSystemItemName}}</span>
-            </div>
-        </div>
-    </div>
-    <div class="form-group no-margin-bottom" ng-if="showSelectedItem">
-        <div class="form-group-cell">
-            <label for="description">{{selectionLabel}}</label>
-            <jf-help-tooltip ng-if="enableSelectedItem" html="createDirHelp"></jf-help-tooltip>
-            <input ng-disabled="!enableSelectedItem"
-                   name="description"
-                   type="text"
-                   ng-model="folder.currentFolder"
-                   class="input-text"
-                   jf-auto-complete ui-items="selectionAutoComplete"
-                   ng-change="onSelectionChange()"
-                   id="description">
-        </div>
-    </div>
-</div>
-<div class="modal-footer">
-    <div class="pull-right">
-        <div class="btn-group">
-            <button class="btn btn-default" ng-click="closeModal()">Cancel</button>
-        </div>
-        <div class="btn-group">
-            <button class="btn btn-primary" ng-click="save()">{{confirmButtonLabel}}
-            </button>
-        </div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/code_modal.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/code_modal.html
deleted file mode 100644
index d700200..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/code_modal.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<div class="modal-header">
-    <button type="button" class="close" data-dismiss="close" aria-label="Close" ng-click="closeModal()"><span aria-hidden="true">×</span></button>
-    <h4 class="modal-title">{{title}}</h4>
-</div>
-<div class="modal-body">
-    <p ng-if="beforeMessage" ng-bind-html="beforeMessage"></p>
-    <div class="clearfix">
-        <jf-clip-copy text-to-copy="content"
-                      class="code-mirror-copy"
-                      object-name="{{objectName || 'Content'}}"></jf-clip-copy>
-
-    </div>
-
-    <jf-code-mirror height="400px"
-                    mime-type="{{mode.name}}"
-                    model="content">
-    </jf-code-mirror>
-</div>
-<div class="modal-footer">
-    <div class="pull-right">
-        <button class="btn btn-default" ng-click="closeModal()">Close</button>
-    </div>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/confirm_modal.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/confirm_modal.html
deleted file mode 100644
index c5eac5b..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/confirm_modal.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<div class="modal-header">
-    <button type="button" class="close" data-dismiss="close" aria-label="Close" ng-click="$dismiss()"><span aria-hidden="true">×</span></button>
-    <h4 class="modal-title" id="popup-header">{{title}}</h4>
-</div>
-<div class="modal-body clearfix">
-    <div class="form-group" ng-bind-html="content"></div>
-</div>
-<div class="modal-footer">
-    <jf-checkbox ng-if="checkboxLabel"
-                 class="pull-left"
-                 text="{{checkboxLabel}}">
-        <input type="checkbox"
-               ng-change="onCheckboxStateChange(checkbox.checked)"
-               ng-model="checkbox.checked">
-    </jf-checkbox>
-    <button class="btn btn-default" ng-click="$dismiss()" id="popup-cancel">{{buttons.cancel}}</button>
-    <button class="btn btn-primary" ng-click="$close(checkbox.checked)" id="popup-confirm">{{buttons.confirm}}</button>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/deploy_modal.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/deploy_modal.html
deleted file mode 100644
index 3d1008e..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/deploy_modal.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<div class="modal-header deploy">
-    <button type="button"
-            class="close"
-            data-dismiss="close"
-            aria-label="Close"
-            ng-click="Deploy.modalInstance.dismiss()"><span
-            aria-hidden="true">×</span>
-    </button>
-    <h4 class="modal-title">Deploy</h4>
-</div>
-<div class="modal-body deploy-body clearfix">
-    <div class="deploy">
-        <div class="form-group">
-            <div class="form-group-cell target-path">
-                <label>Target Repository</label>
-                <jf-ui-select jf-select-model="Deploy.deployFile.repoDeploy"
-                              jf-select-options="Deploy.comm.reposList"
-                              jf-select-change="Deploy.onRepoChange()"
-                              onclick-func=""
-                              jf-select-display-attr="repoKey">
-
-                </jf-ui-select>
-            </div>
-        </div>
-        <div class="form-group">
-            <div class="form-group-cell auto-width deploy-repo-data">
-                <div><label>Package Type:</label> <i class="icon icon-{{Deploy.deployFile.repoDeploy.repoTypeIcon}} repo-type-icon"></i> {{Deploy.deployFile.repoDeploy.repoType}}</div>
-                <div id="repo-layout" ng-if="Deploy.deployFile.repoDeploy.layoutPattern"><label>Repository Layout:</label>
-                    <small ng-bind-html="Deploy.deployFile.repoDeploy.layoutPatternDisplay"></small></div>
-            </div>
-        </div>
-        <div>
-            <jf-switch jf-switch-title="Type:" ng-model="Deploy.currentDeploy"
-                       options="['Single', 'Multi']"></jf-switch>
-        </div>
-        <div ng-if="Deploy.comm.reposList && Deploy.isSelectedDeploy('Single')" class="deploy-drop">
-            <jf-single-deploy node="Deploy.node"
-                              comm="Deploy.comm"
-                              deploy-file="Deploy.deployFile"
-                              on-success="Deploy.onDeploySuccess()"></jf-single-deploy>
-        </div>
-
-        <div ng-if="Deploy.comm.reposList && Deploy.isSelectedDeploy('Multi')" class="deploy-drop">
-            <jf-multi-deploy node="Deploy.node"
-                             comm="Deploy.comm"
-                             deploy-file="Deploy.deployFile"
-                             on-success="Deploy.onDeploySuccess()"></jf-multi-deploy>
-        </div>
-    </div>
-</div>
-<div class=" clearfix modal-footer deploy-footer">
-    <div class="btn-group">
-        <button class="btn btn-primary"
-                ng-disabled="!Deploy.deployController.isReady()"
-                ng-click="Deploy.deploy();">Deploy
-        </button>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/distribute_modal.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/distribute_modal.html
deleted file mode 100644
index 13d675b..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/distribute_modal.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<div class="modal-header">
-    <button type="button" class="close" data-dismiss="close" aria-label="Close" ng-click="$close()"><span
-            aria-hidden="true">×</span>
-    </button>
-    <h3 class="modal-title">{{title}}</h3>
-</div>
-<div class="modal-body">
-    <form name="distributeRepo">
-
-
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-field>
-                    <label>Distribution Repository</label>
-                    <jf-ui-select jf-select-model="data.selectedRepo"
-                                  jf-select-disabled="redistribute"
-                                  jf-select-options="distributionRepositoriesOptions"></jf-ui-select>
-                </jf-field>
-                <div class="jf-validation"
-                     ng-if="distType==='build' && !distributionRepositoriesOptions.length">To use the build distribution<br>you must configure a distribution repository</div>
-            </div>
-        </div>
-
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-checkbox text="Distribute Artifacts Asynchronously">
-                    <input type="checkbox"
-                           id="async"
-                           ng-model="data.async"/>
-                </jf-checkbox>
-            </div>
-        </div>
-
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-checkbox text="Publish Distributed Artifacts">
-                    <input type="checkbox"
-                           id="publish"
-                           ng-model="data.publish"/>
-                </jf-checkbox>
-            </div>
-        </div>
-
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-checkbox text="Override Existing Files">
-                    <input type="checkbox"
-                           id="overrideExistingFiles"
-                           ng-model="data.overrideExistingFiles"/>
-                </jf-checkbox>
-            </div>
-        </div>
-
-    </form>
-</div>
-<div class="modal-footer">
-    <!--<button class="btn btn-secondary">Dry Run</button>-->
-    <button class="btn btn-default" ng-click="$dismiss()">Cancel</button>
-    <button class="btn btn-primary" ng-click="distribute()" ng-disabled="!data.selectedRepo">Distribute</button>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/download_folder_modal.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/download_folder_modal.html
deleted file mode 100644
index 835cf59..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/download_folder_modal.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<div class="modal-header">
-    <button type="button" class="close" data-dismiss="close" aria-label="Close" ng-click="cancel()"><span
-            aria-hidden="true">×</span>
-    </button>
-    <h4 class="modal-title">Download Folder</h4>
-</div>
-<div class="modal-body select-target-path">
-    <form name="downloadFolder">
-        <div class="form-group">
-            <table class="jf-data-table">
-                <tr><td>Folder Name:</td><td>{{folderName}}</td></tr>
-                <tr><td>Files Count:</td><td>{{filesCount}}</td></tr>
-                <tr><td>Total Size:</td><td>{{totalSize}} MB</td></tr>
-            </table>
-        </div>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <label>Archive Type</label>
-                <jf-ui-select jf-select-model="selection.archiveType" jf-select-options="archiveTypes"></jf-ui-select>
-            </div>
-        </div>
-    </form>
-</div>
-<div class="modal-footer">
-    <button class="btn btn-primary" ng-click="download()">Download
-    </button>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/group_modal.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/group_modal.html
deleted file mode 100644
index bfe8fb2..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/group_modal.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<div class="modal-header">
-    <h3 class="modal-title">{{groupModalTitle}}</h3>
-</div>
-<div class="modal-body">
-
-    <form name="newUserForm">
-        <div class="form-group">
-            <label for="groupName">Group Name:</label>
-
-            <input name="groupName"
-                   type="text"
-                   ng-model="group.name"
-                   class="form-control"
-                   id="groupName" required>
-
-            <div class="form-group">
-                <label for="description">Description</label>
-                <input name="description"
-                       type="text"
-                       ng-model="group.description"
-                       class="form-control"
-                       id="description" required>
-            </div>
-        </div>
-        <div class="checkbox">
-            <label><input type="checkbox"
-                          ng-model="group.newUserDefault"> Automatically Join New Users to this Group</label>
-        </div>
-
-        <div class="">
-            <div ng-switch="mode"
-                 class="btn-group">
-                <button ng-switch-when="edit"
-                        class=" btn btn-primary" ng-click="updateGroup(group)">Save
-                </button>
-                <button ng-switch-default
-                        class="btn btn-primary" ng-click="createNewGroup(group)">Save
-                </button>
-            </div>
-            <div class="btn-group">
-                <button class="btn btn-default" ng-click="closeModal()
-                ">Cancel
-                </button>
-            </div>
-        </div>
-    </form>
-
-
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/new_docker_modal.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/new_docker_modal.html
deleted file mode 100644
index dcca1b5..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/new_docker_modal.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<div class="modal-header">
-    <button type="button" class="close" data-dismiss="close" aria-label="Close" ng-click="$dismiss()"><span
-            aria-hidden="true">×</span>
-    </button>
-    <h3 class="modal-title">Updating DNS Record</h3>
-</div>
-<div class="modal-body clearfix docker-popup">
-    <div class="text-center">
-
-        <div class="new-docker">
-            <div class="dockerlogo"></div>
-            <div class="docker-container">
-                <div class="cont"></div>
-                <div class="sep"></div>
-                <div class="cont"></div>
-            </div>
-            <div class="artilogo"></div>
-        </div>
-
-        <h1>Adding a DNS record for your new Docker {{dockerData.packageType}} repository</h1>
-        <p>This process may take a few minutes to complete.</p>
-    </div>
-
-    <p>Once the DNS record is added you can test the configuration as follows:</p>
-
-
-    <div ng-repeat="snippet in dockerData.snippets" class="snippet-wrapper">
-        <p>{{snippet.message}}</p>    <!-- ng-if="snippet.message && dockerData.packageType != 'virtual'"-->
-        <jf-clip-copy
-                text-to-copy="snippet.snippet"
-                object-name=""
-                class="code-mirror-copy"
-        >
-        </jf-clip-copy>
-
-        <jf-code-mirror mime-type="xml"
-                        model="snippet.snippet"
-                        allowEdit="false">
-        </jf-code-mirror>
-
-
-    </div>
-
-    <p ng-if="dockerData.packageType == 'virtual' && dockerData.deployToLocal == false">Note that you can configure your virtual repository to support docker push. For more details please refer to <a href="https://www.jfrog.com/confluence/display/RTF/Deploying+Artifacts#DeployingArtifacts-DeployingtoaVirtualRepository">deploy to virtual</a> page in the user guide.</p>
-
-
-
-    <p>For additional information please refer to wiki, in case this repository is still no available in a few minutes please contact <a href="mailto:support at jfrog.com?subject=Configure Docker Repository on {{dockerData.hostname}}">support</a></p>
-</div>
-
-<div class="modal-footer">
-    <button class="btn btn-secondary btn-dark" type="button" ng-click="$dismiss()">Close</button>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/property_form_modal.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/property_form_modal.html
deleted file mode 100644
index dcbbb87..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/property_form_modal.html
+++ /dev/null
@@ -1,87 +0,0 @@
-<div class="modal-header">
-    <button type="button" class="close" data-dismiss="close" aria-label="Close" ng-click="PropertyForm.cancel()">
-        <span aria-hidden="true">×</span>
-    </button>
-    <h4 class="modal-title" class="panel-heading">{{ PropertyForm.isNew && 'New' || 'Edit'}} Property</h4>
-</div>
-<form name="propertyForm" ng-submit="PropertyForm.save()">
-    <div class="modal-body clearfix">
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-field validations="propertySet" autofocus="PropertyForm.isNew">
-                    <label for="propertyName" class="mandatory">Property Name</label>
-                    <input class="input-text"
-                           type="text"
-                           required
-                           jf-validator-name
-                           jf-validator-xml-name
-                           ng-model-options="{updateOn: 'default blur', debounce: { 'default': 500, 'blur': 0 } }"
-                           ui-validate="{unique:'PropertyForm.isPropertyUnique($value)'}"
-                           id="propertyName"
-                           name="name"
-                           ng-model="PropertyForm.property.name">
-                </jf-field>
-            </div>
-        </div>
-        <jf-switch
-                jf-switch-title="Type:"
-                ng-model="PropertyForm.property.propertyType"
-                options="PropertyForm.propertyTypes"
-                name="propertyType"
-                ng-change="PropertyForm.invalidateType()"
-                ui-validate="{defaultValues: 'PropertyForm.isDefaultValuesValid($value)'}"
-                ui-validate-watch="'PropertyForm.propertyTypeWatch'">
-        </jf-switch>
-
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-field validations="properties" autofocus="!PropertyForm.isNew">
-                    <input
-                            type="text"
-                            class="input-text"
-                            ng-model="PropertyForm.newValue"
-                            placeholder="New Value (enter to add)"
-                            id="newPredefinedValueName"
-                            name="newPredefinedValueName"
-                            ng-model-options="{updateOn: 'default blur', debounce: { 'default': 500, 'blur': 0 } }"
-                            jf-validator-name
-                            ui-validate="{predefinedValues: 'PropertyForm.isPredefinedValuesValid()'}"
-                            ui-validate-watch="'PropertyForm.propertyTypeWatch'"
-                            jf-enter-press="PropertyForm.addValue()"
-                            ng-blur="PropertyForm.errorMessage = null"
-                            ng-change="PropertyForm.errorMessage = null">
-                </jf-field>
-            </div>
-            <div class="form-group-cell auto-width">
-                <button type="button"
-                        ng-disabled="!propertyForm.newPredefinedValueName.$valid && !propertyForm.newPredefinedValueName.$error.predefinedValues"
-                        class="btn btn-secondary"
-                        ng-click="PropertyForm.addValue()">Add</button>
-            </div>
-            <div class="jf-validation" ng-if="propertyForm.propertyType.$error.defaultValues">
-                Cannot select multiple default values for the selected type
-            </div>
-            <div class="jf-validation">{{PropertyForm.errorMessage}}</div>
-        </div>
-
-        <div id="property-set-list" ng-if="PropertyForm.property.predefinedValues.length">
-            <div class="property-set-row" ng-repeat="value in PropertyForm.property.predefinedValues">
-                <div>{{value.value}}</div>
-                <div>
-                    <a href="" class="icon icon-clear" ng-click="PropertyForm.removeValue(value)"></a>
-                    <jf-checkbox text="Default">
-                        <input id="default_{{$index}}"
-                               type="checkbox"
-                               value="default"
-                               ng-change="PropertyForm.invalidateType()"
-                               ng-model="value.defaultValue"/>
-                    </jf-checkbox>
-                </div>
-            </div>
-        </div>
-    </div>
-    <div class="modal-footer">
-        <button class="btn btn-default" type="button" jf-clear-errors ng-click="PropertyForm.cancel()">Cancel</button>
-        <button class="btn btn-primary" type="submit" ng-disabled="!propertyForm.$valid">Save</button>
-    </div>
-</form>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/property_modal.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/property_modal.html
deleted file mode 100644
index 22c437a..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/property_modal.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<div class="modal-header">
-    <button type="button" class="close" data-dismiss="close" aria-label="Close" ng-click="closeModal()"><span aria-hidden="true">×</span></button>
-    <h3 class="modal-title">{{property.modalTitle}}</h3>
-</div>
-<div class="modal-body property-modal">
-    <div ng-switch="property.propertyType">
-        <div ng-switch-when="MULTI_SELECT">
-            <jf-drag-drop include-list="property.selectedValues"
-                          exclude-list="property.predefineValues"
-                          headers="{leftTitle:'Available Predefined Values',
-                                    rightTitle:'Selected Predefined Values'}"></jf-drag-drop>
-        </div>
-        <div ng-switch-when="SINGLE_SELECT" class="dropdown-min-height">
-            <selectize config="selectizeConfig"
-                       options="property.predefineValues"
-                       ng-model="property.selectedValues">
-            </selectize>
-        </div>
-        <div ng-switch-when="ANY_VALUE" class="dropdown-min-height">
-            <selectize config="selectizeConfig"
-                       options="property.predefineValues"
-                       ng-model="property.selectedValues">
-            </selectize>
-        </div>
-        <div ng-switch-default>
-            <textarea rows="5"
-                      cols="5"
-                      class="input-text"
-                      ng-model="property.selectedValues">
-            </textarea>
-        </div>
-    </div>
-</div>
-<div class="modal-footer">
-    <div class="pull-right">
-        <button class="btn btn-default" ng-click="closeModal()">Cancel</button>
-        <button class="btn btn-primary"
-                ng-disabled="property.propertyType==='SINGLE_SELECT' && !property.selectedValues"
-                ng-click="save(property)">Save
-        </button>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/push_to_bintray.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/push_to_bintray.html
deleted file mode 100644
index dd54db9..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/push_to_bintray.html
+++ /dev/null
@@ -1,133 +0,0 @@
-<div class="push-to-bintray">
-    <div class="modal-header">
-        <button type="button" class="close" data-dismiss="close" aria-label="Close" ng-click="cancel()"><span
-                aria-hidden="true">×</span>
-        </button>
-        <h3 class="modal-title">Push To Bintray</h3>
-    </div>
-    <form name="pushToBintrayForm">
-        <div class="modal-body">
-            <div class="bintray-info-container">
-                <span ng-if="pushType==='build'">
-                    Distribute this build's artifacts to users by uploading them to
-                </span>
-                <span ng-if="pushType==='artifact'">
-                    Distribute this artifact to users by uploading it to
-                </span>
-                <span ng-if="pushType==='docker'">
-                    Distribute this docker tag to users by uploading it to
-                </span>
-                <a href="https://bintray.com" target="blank"> Bintray</a><br>
-                <span class="bintray-info">Bintray is a public online service through which you can share your release binaries with the world.</span>
-            </div>
-
-
-            <div class="form-group">
-                <div class="form-group-cell">
-                    <label>Bintray Repository *</label>
-                    <selectize config="selectizeConfigNoAdd"
-                               options="data.bintrayRepos"
-                               ng-change="onRepoSelect()"
-                               ng-disabled="selection.useSpecificProperties"
-                               ng-model="selection.bintrayRepo">
-                    </selectize>
-                </div>
-            </div>
-
-            <div class="form-group" ng-if="pushType!=='docker'">
-                <div class="form-group-cell">
-                    <label>Bintray Package Name *</label>
-                    <jf-help-tooltip html="tooltip.bintrayPackageName"></jf-help-tooltip>
-                    <selectize config="selectizeConfigNoAdd"
-                               options="data.bintrayPackages"
-                               ng-change="onPackageSelect()"
-                               ng-disabled="selection.useSpecificProperties"
-                               ng-model="selection.bintrayPackageName">
-                    </selectize>
-                </div>
-            </div>
-            <div class="form-group" ng-if="pushType==='docker'">
-                <div class="form-group-cell">
-                    <label>Bintray Package Name</label>
-                    <jf-field>
-                        <input id="dockerPackageName"
-                               type="text"
-                               ng-model="docker.packageName"
-                               readonly
-                               name="dockerPackageName"
-                               class="input-text disabled-look">
-                    </jf-field>
-                </div>
-            </div>
-            <div class="form-group" ng-if="pushType!=='docker'">
-                <div class="form-group-cell">
-                    <label>Bintray Package Version *</label>
-                    <jf-help-tooltip html="tooltip.bintrayPackageVersion"></jf-help-tooltip>
-                    <selectize config="selectizeConfigAdd"
-                               options="data.bintrayPackageVersions"
-                               ng-disabled="selection.useSpecificProperties"
-                               ng-model="selection.bintrayPackageVersion">
-                    </selectize>
-                </div>
-            </div>
-            <div class="form-group" ng-if="pushType==='docker'">
-                <div class="form-group-cell">
-                    <label style="padding-left: 2px;">Tag</label>
-                    <jf-field>
-                        <input id="dockerTagName"
-                               type="text"
-                               ng-model="docker.tagName"
-                               readonly
-                               name="dockerTagName"
-                               class="input-text disabled-look">
-                    </jf-field>
-                </div>
-            </div>
-            <div class="form-group" ng-if="pushType==='artifact'">
-                <div class="form-group-cell">
-                    <label>File Path *</label>
-                    <jf-field validations="common">
-                        <input id="filePath"
-                               type="text"
-                               ng-model="selection.filePath"
-                               name="filePath"
-                               class="input-text">
-                    </jf-field>
-                </div>
-            </div>
-            <div ng-if="pushType==='build'">
-                <div class="form-group form-checkbox">
-                    <div class="form-group-cell">
-                        <jf-checkbox text="Use Bintray-Specific Artifact Properties">
-                            <input id="useSpecificProperties"
-                                   type="checkbox"
-                                   ng-model="selection.useSpecificProperties"
-                                   name="useSpecificProperties">
-                        </jf-checkbox>
-                    </div>
-                </div>
-                <div class="form-group">
-                    <div class="form-group-cell">
-                        <jf-checkbox text="Send Email Notification">
-                            <input id="sendEmail"
-                                   type="checkbox"
-                                   ng-model="selection.sendEmail"
-                                   name="sendEmail">
-                        </jf-checkbox>
-                    </div>
-                </div>
-            </div>
-        </div>
-        <div class="modal-footer">
-            <button class="btn btn-primary"
-                    ng-disabled="(!selection.bintrayRepo || (pushType !== 'docker' && !selection.bintrayPackageName) || (pushType !== 'docker' && !selection.bintrayPackageVersion) || (pushType==='artifact' && !selection.filePath)) && !selection.useSpecificProperties"
-                    ng-click="push()">Push
-            </button>
-            <button ng-if="pushType==='build'"
-                    ng-disabled="(!selection.bintrayRepo || !selection.bintrayPackageName || !selection.bintrayPackageVersion) && !selection.useSpecificProperties"
-                    class="btn btn-primary"
-                    ng-click="backgroundPush()">Background Push
-            </button>
-        </div>
-    </form>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/replication_modal.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/replication_modal.html
deleted file mode 100644
index 6236daf..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/replication_modal.html
+++ /dev/null
@@ -1,137 +0,0 @@
-<div class="modal-header">
-    <button type="button" class="close" data-dismiss="close" aria-label="Close" ng-click="closeModal()"><span aria-hidden="true">×</span>
-    </button>
-    <h3 class="modal-title">{{title}}</h3>
-</div>
-<form name="replicationForm" ng-submit="addReplication(replication)">
-    <div class="modal-body">
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-checkbox text="Enabled">
-                    <input type="checkbox"
-                           id="enableActiveReplication"
-                           ng-model="replication.enabled">
-                </jf-checkbox>
-            </div>
-        </div>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-field validations="repositories" autofocus="true">
-                    <label for="path" class="mandatory">URL</label>
-                    <input type="url"
-                           id="path"
-                           name="path"
-                           class="input-text"
-                           required
-                           ng-model="replication.url"/>
-                </jf-field>
-            </div>
-        </div>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-field validations="repositories">
-                    <label for="username" class="mandatory">Username</label>
-                    <input type="text"
-                           class="input-text"
-                           id="username"
-                           name="username"
-                           required
-                           ng-model="replication.username"/>
-                </jf-field>
-            </div>
-            <!-- prevent auto complete -->
-            <input type="text" class="hidden"/>
-            <input type="password" class="hidden"/>
-
-            <div class="form-group-cell">
-                <jf-field validations="repositories">
-                    <label for="password">Password</label>
-                    <input type="password"
-                           id="password"
-                           name="password"
-                           class="input-text"
-                           ng-model="replication.password"/>
-                </jf-field>
-            </div>
-        </div>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-field validations="repositories">
-                    <label>Network Proxy Reference</label>
-
-                    <ui-select jf-disable-ng-animate ng-model="replication.proxy">
-                        <ui-select-match placeholder="Select Proxy">
-                            {{ $select.selected }}
-                        </ui-select-match>
-                        <ui-select-choices
-                                repeat="item in replication.proxies | filter: $select.search track by $index">
-                            <div ng-bind-html="item | highlight: $select.search"></div>
-                        </ui-select-choices>
-                    </ui-select>
-                </jf-field>
-            </div>
-            <div class="form-group-cell">
-                <jf-field validations="repositories">
-                    <label for="timeOut" class="mandatory">Socket Timeout</label>
-                    <input type="number"
-                           min="0"
-                           id="timeOut"
-                           name="timeOut"
-                           class="input-text"
-                           required
-                           ng-model="replication.socketTimeout"/>
-                </jf-field>
-            </div>
-        </div>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-checkbox text="Sync Deleted Artifacts">
-                    <input type="checkbox"
-                           id="syncDeleted"
-                           ng-model="replication.syncDeletes">
-                </jf-checkbox>
-            </div>
-            <div class="form-group-cell">
-                <jf-checkbox text="Sync Artifact Properties">
-                    <input type="checkbox"
-                           id="syncProperties"
-                           ng-model="replication.syncProperties">
-                </jf-checkbox>
-            </div>
-        </div>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-field validations="repositories">
-                    <label for="pathPrefix">Path Prefix</label>
-                    <jf-help-tooltip html="RepositoryForm.TOOLTIP.localForm.pathPrefix"></jf-help-tooltip>
-                    <input type="text"
-                           id="pathPrefix"
-                           name="pathPrefix"
-                           class="input-text"
-                           ng-model="replication.pathPrefix"/>
-                </jf-field>
-            </div>
-        </div>
-        <div class="pull-right">
-            <button class="btn btn-secondary"
-                    type="button"
-                    ng-disabled="!replication.url"
-                    ng-click="testLocalReplicationUrl(replication.url)">Test
-            </button>
-        </div>
-    </div>
-
-    <div class="modal-footer">
-        <div class="pull-right">
-            <button class="btn btn-default"
-                    jf-clear-errors
-                    type="button"
-                    ng-click="closeModal()">Cancel</button>
-            <button class="btn btn-primary"
-                    type="submit"
-                    ng-disabled="!(replicationForm.timeOut.$valid && replicationForm.path.$valid &&
-                    replicationForm.username.$valid && replicationForm.password.$valid)">Save
-            </button>
-        </div>
-    </div>
-</form>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/repository_type_modal.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/repository_type_modal.html
deleted file mode 100644
index c7a8bb9..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/repository_type_modal.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<div class="repository-type-modal">
-    <div class="modal-header">
-        <button type="button" class="close" data-dismiss="close" aria-label="Close" ng-click="$close()"
-                id="repository-select-package-type-close"><span
-                aria-hidden="true">×</span>
-        </button>
-        <h3 class="modal-title">Select Package Type</h3>
-    </div>
-    <div class="modal-body">
-        <div class="form-group">
-            <div class="form-group-cell"><input type="text" class="input-text" ng-model="typeFilter" placeholder="Filter by package type" id="package-type-filter" autofocus="autofocus" jf-enter-press="selectPackage()" ng-style="{color:checkNoResults(typeFilter) ? 'red' : '#707070'}" jf-auto-focus></div>
-        </div>
-        <ul class="list-unstyled">
-            <li ng-repeat="type in packageTypes"
-                class="inline-block package-type"
-                ng-class="{'package-highlight': highlightCheck(typeFilter,type), 'package-selected': isSelected()}"
-                jf-disable-feature="{{ type.value }}"
-                ng-click="selectRepoType(type)"
-                id="repository-select-package-type-{{ type.value }}"
-                ng-mouseover="RepositoryForm.currentDesc = type.description">
-                <div class="repotype iconrepo iconrepo-{{type.value}}"></div>
-                <div class="repotitle">{{ type.text }}</div>
-            </li>
-        </ul>
-    </div>
-    <div class="modal-footer">
-        <div id="package-description" class="text-left">{{RepositoryForm.currentDesc}}</div>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/reverse_proxy_modal.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/reverse_proxy_modal.html
deleted file mode 100644
index 0206847..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/reverse_proxy_modal.html
+++ /dev/null
@@ -1,109 +0,0 @@
-<div class="modal-header">
-    <button type="button" class="close" data-dismiss="close" aria-label="Close" ng-click="$close()"><span
-            aria-hidden="true">×</span>
-    </button>
-    <h4 class="modal-title">Reverse Proxy Config Generator</h4>
-</div>
-<div class="modal-body">
-    <jf-panel jf-panel-heading="Artifactory Settings">
-        <div class="form-group">
-            <div class="form-group-cell">
-                <label for="repositoryKey" class="mandatory">Repository Key</label>
-                <jf-help-tooltip html=""></jf-help-tooltip>
-                <input type="text"
-                       class="input-text"
-                       id="repositoryKey"
-                       name="repositoryKey"
-                       required/>
-            </div>
-            <div class="form-group-cell">
-                <label for="artifactoryURL" class="mandatory">Artifactory URL</label>
-                <jf-help-tooltip html=""></jf-help-tooltip>
-                <input type="text"
-                       class="input-text"
-                       id="artifactoryURL"
-                       name="artifactoryURL"
-                       required/>
-            </div>
-        </div>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <label>Docker Version</label>
-                <ul class="radio-select-list">
-                    <li>
-                        <input type="radio" id="v1" value="V1"
-                               name="docker-version"/>
-                        <label for="v1" class="input-label-weight">V1</label>
-                    </li>
-                    <li>
-                        <input type="radio" id="v2" value="V2"
-                               name="docker-version"/>
-                        <label for="v2" class="input-label-weight">V2</label>
-                    </li>
-                </ul>
-            </div>
-        </div>
-    </jf-panel>
-    <jf-panel jf-panel-heading="Proxy Settings">
-        <div class="form-group">
-            <div class="form-group-cell">
-                <label class="mandatory">Web Server Provider</label>
-                <ul class="radio-select-list">
-                    <li>
-                        <input type="radio" id="provider-nginx" value="nginx"
-                               name="provider"/>
-                        <label for="provider-nginx" class="input-label-weight">NGINX</label>
-                    </li>
-                    <li>
-                        <input type="radio" id="provider-apache" value="apache"
-                               name="provider"/>
-                        <label for="provider-apache" class="input-label-weight">Apache</label>
-                    </li>
-                </ul>
-            </div>
-        </div>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <label for="serverName" class="mandatory">Server Name</label>
-                <jf-help-tooltip html=""></jf-help-tooltip>
-                <input type="text"
-                       class="input-text"
-                       id="serverName"
-                       name="serverName"
-                       required/>
-            </div>
-            <div class="form-group-cell">
-                <label for="certificatePath" class="mandatory">Certificate Path</label>
-                <jf-help-tooltip html=""></jf-help-tooltip>
-                <input type="text"
-                       class="input-text"
-                       id="certificatePath"
-                       name="certificatePath"
-                       required/>
-            </div>
-        </div>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <label for="serverPort" class="mandatory">Port</label>
-                <jf-help-tooltip html=""></jf-help-tooltip>
-                <input type="text"
-                       class="input-text"
-                       id="serverPort"
-                       name="serverPort"
-                       required/>
-            </div>
-            <div class="form-group-cell">
-                <label for="keyPath" class="mandatory">Key Path</label>
-                <jf-help-tooltip html=""></jf-help-tooltip>
-                <input type="text"
-                       class="input-text"
-                       id="keyPath"
-                       name="keyPath"
-                       required/>
-            </div>
-        </div>
-    </jf-panel>
-</div>
-<div class="modal-footer">
-    <button class="btn btn-primary" ng-click="">Generate Configuration</button>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/select_delete_versions.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/select_delete_versions.html
deleted file mode 100644
index 411d46d..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/select_delete_versions.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<div class="modal-header">
-    <button type="button" class="close" data-dismiss="close" aria-label="Close" ng-click="$dismiss()"><span aria-hidden="true">×</span></button>
-    <h4 class="modal-title">Delete Versions</h4>
-</div>
-<div class="modal-body">
-    <div class="alert alert-warning" ng-if="noData">
-        No versions found.
-    </div>
-
-    <jf-grid ng-if="versions && !noData"
-             grid-options="versionsGridOptions"
-             filter-field="groupId" filter-field2="version"></jf-grid>
-</div>
-
-<div class="modal-footer">
-    <button class="btn btn-default" ng-click="$dismiss()">Cancel</button>
-    <button class="btn btn-primary" ng-disabled="selectedVersions().length === 0" ng-click="close(selectedVersions())">Delete Selected</button>
-</div>
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/select_target_path.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/select_target_path.html
deleted file mode 100644
index 2d12337..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/select_target_path.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<div class="modal-header">
-    <button type="button" class="close" data-dismiss="close" aria-label="Close" ng-click="cancel()"><span
-            aria-hidden="true">×</span>
-    </button>
-    <h4 class="modal-title">{{action | splitWords}} {{::node.data.text}}</h4>
-</div>
-<div class="modal-body select-target-path">
-    <form name="selectTargetPath" class="clearfix">
-        <div class="form-group">
-            <div class="form-group-cell">
-                <label>
-                    Target Repository
-                </label>
-                <selectize placeholder='Select Repository'
-                           config="{maxItems:1}"
-                           options="target.repoList"
-                           ng-model="target.repoKey"
-                           ng-required="true"></selectize>
-            </div>
-        </div>
-        <div class="form-group" ng-if="action !== 'copyStash' && action !== 'moveStash'">
-            <div class="form-group-cell">
-                <jf-checkbox text="{{action | splitWords}} to a Custom Path">
-                    <input type="checkbox" id="custom-path" ng-model="target.isCustomPath">
-                </jf-checkbox>
-            </div>
-        </div>
-        <div  class="form-group" ng-if="action !== 'copyStash' && action !== 'moveStash'">
-            <div class="form-group-cell">
-            <label for="target-path">Target Path</label>
-            <input type="text"
-                   id="target-path"
-                   class="input-text"
-                   ng-model="target.path"
-                   ng-required="true"
-                   ng-disabled="!target.isCustomPath">
-            </div>
-        </div>
-    </form>
-
-
-    <div class="dry-run-result alert"
-         ng-class="resultError ? 'alert-danger' : 'alert-success'"
-         ng-if="dryRunResults.length">
-        <div ng-repeat="result in dryRunResults" ng-bind="result"></div>
-    </div>
-</div>
-<div class="modal-footer">
-    <button class="btn btn-secondary" ng-if="!noDryRun" ng-disabled="!selectTargetPath.$valid" ng-click="dryRun()">Dry Run
-    </button>
-    <button class="btn btn-primary" ng-disabled="!selectTargetPath.$valid" ng-click="confirm()">{{action | splitWords}}
-    </button>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/set_me_up_modal.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/set_me_up_modal.html
deleted file mode 100644
index bf6fe97..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/set_me_up_modal.html
+++ /dev/null
@@ -1,477 +0,0 @@
-<div class="modal-header deploy">
-    <button type="button"
-            class="close"
-            data-dismiss="close"
-            aria-label="Close"
-            ng-click="close()"><span
-            aria-hidden="true">×</span>
-    </button>
-    <h4 class="modal-title">{{title}}</h4>
-</div>
-<div class="modal-body clearfix set-me-up-modal">
-    <div class="form-group">
-        <div class="pull-right" ng-if="canInjectUserData">
-            <a ng-if="!injectionMode && !userDataInjected"
-               ng-click="gotoInjectionMode()">Insert Credentials</a>
-            <a ng-if="userDataInjected"
-               ng-click="removeUserData()">Remove User Data</a>
-            <div id="insert-credentials-box">
-                <form>
-                    <i class="icon icon-go pull-right"
-                       ng-disabled="!injection.password"
-                       ng-click="injection.password && injectUserData()"></i>
-                    <jf-field autofocus="true">
-                        <input type="password"
-                               ng-model="injection.password"
-                               class="input-text"
-                               placeholder="Type Password"
-                               autofocus
-                               jf-enter-press="injectUserData()"
-                               id="password">
-                    </jf-field>
-                </form>
-            </div>
-        </div>
-        <div class="form-group-cell">
-            <label>Tool</label>
-            <ui-select jf-disable-ng-animate ng-model="selection.repoType" ng-change="filterByType(true)">
-                <ui-select-match placeholder="Select Package Type...">
-                    <i ng-if="$select.selected.icon" class="select-repo-icon icon icon-{{$select.selected.icon}}"></i>{{$select.selected.text}}
-                </ui-select-match>
-                <ui-select-choices repeat="property in repoTypes | filter: $select.search track by $index">
-                    <i ng-if="property.icon" class="select-repo-icon icon icon-{{property.icon}}"></i>
-                    <span ng-bind-html="property.text | highlight: $select.search"></span>
-                </ui-select-choices>
-            </ui-select>
-        </div>
-        <div class="form-group-cell form-button form-link" ng-if="showSettings">
-            <a href="" ng-if="!generateSettings" ng-click="getGeneratorRepos(showSettings)">Generate {{showSettings}} Settings</a>
-            <a href="" ng-if="generateSettings" ng-click="filterByType()">Back to Set Me Up</a>
-        </div>
-    </div>
-
-    <!-- Maven Build Settings -->
-    <div ng-if="generate.maven">
-        <div class="form-group">
-            <div class="form-group-cell">
-                <label>Releases</label>
-                <jf-help-tooltip>The chosen releases repository.</jf-help-tooltip>
-                <ui-select jf-disable-ng-animate ng-model="selection.maven.releases">
-                    <ui-select-match placeholder="Releases">
-                        {{$select.selected}}
-                    </ui-select-match>
-                    <ui-select-choices repeat="property in settings.maven.releases | filter: $select.search track by $index">
-                        <div ng-bind-html="property | highlight: $select.search"></div>
-                    </ui-select-choices>
-                </ui-select>
-            </div>
-            <div class="form-group-cell">
-                <label>Snapshots</label>
-                <jf-help-tooltip>The chosen snapshots repository.</jf-help-tooltip>
-                <ui-select jf-disable-ng-animate ng-model="selection.maven.snapshots">
-                    <ui-select-match placeholder="Snapshots">
-                        {{$select.selected}}
-                    </ui-select-match>
-                    <ui-select-choices repeat="property in settings.maven.snapshots | filter: $select.search track by $index">
-                        <div ng-bind-html="property | highlight: $select.search"></div>
-                    </ui-select-choices>
-                </ui-select>
-            </div>
-            <div class="form-group-cell">
-                <!--<label><input type="checkbox" ng-model="selection.maven.mirror" /> Mirror Any</label>-->
-                <jf-checkbox text="Mirror Any"><input type="checkbox" ng-model="selection.maven.mirror" /></jf-checkbox>
-                <jf-help-tooltip>Check if you want to mirror a repository.</jf-help-tooltip>
-                <ui-select jf-disable-ng-animate ng-model="selection.maven.mirrorAny" ng-disabled="!selection.maven.mirror">
-                    <ui-select-match placeholder="Plugin Releases">
-                        {{$select.selected}}
-                    </ui-select-match>
-                    <ui-select-choices repeat="property in settings.maven.anyMirror">
-                        <div ng-bind-html="property"></div>
-                    </ui-select-choices>
-                </ui-select>
-            </div>
-        </div>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <label>Plugin Releases</label>
-                <jf-help-tooltip>The chosen plugins releases repository.</jf-help-tooltip>
-                <ui-select jf-disable-ng-animate ng-model="selection.maven.pluginReleases">
-                    <ui-select-match placeholder="Plugin Releases">
-                        {{$select.selected}}
-                    </ui-select-match>
-                    <ui-select-choices repeat="property in settings.maven.pluginReleases | filter: $select.search track by $index">
-                        <div ng-bind-html="property | highlight: $select.search"></div>
-                    </ui-select-choices>
-                </ui-select>
-            </div>
-            <div class="form-group-cell">
-                <label>Plugin Snapshots</label>
-                <jf-help-tooltip>The chosen plugins snapshots repository.</jf-help-tooltip>
-                <ui-select jf-disable-ng-animate ng-model="selection.maven.pluginSnapshots">
-                    <ui-select-match placeholder="Plugin Snapshots">
-                        {{$select.selected}}
-                    </ui-select-match>
-                    <ui-select-choices repeat="property in settings.maven.pluginSnapshots | filter: $select.search track by $index">
-                        <div ng-bind-html="property | highlight: $select.search"></div>
-                    </ui-select-choices>
-                </ui-select>
-            </div>
-        </div>
-    </div>
-
-    <!-- Gradle Build Settings -->
-    <div ng-if="generate.gradle">
-        <div class="form-group">
-            <div class="form-group-cell">
-                <div class="generate-title-label">Plugin Resolver</div>
-                <label>Repository Key</label>
-                <jf-help-tooltip>Repository to use for Gradle plugin resolution.</jf-help-tooltip>
-                <ui-select jf-disable-ng-animate ng-model="selection.gradle.pluginResolver">
-                    <ui-select-match placeholder="Select Repository Key">
-                        {{$select.selected}}
-                    </ui-select-match>
-                    <ui-select-choices repeat="property in settings.gradle.pluginResolver | filter: $select.search track by $index">
-                        <div ng-bind-html="property | highlight: $select.search"></div>
-                    </ui-select-choices>
-                </ui-select>
-            </div>
-
-            <div class="form-group-cell">
-                <div class="generate-title-label">Libs Resolver</div>
-                <label>Repository Key</label>
-                <jf-help-tooltip>Repository to use for libs resolution.</jf-help-tooltip>
-                <ui-select jf-disable-ng-animate ng-model="selection.gradle.libsResolver">
-                    <ui-select-match placeholder="Select Repository Key">
-                        {{$select.selected}}
-                    </ui-select-match>
-                    <ui-select-choices repeat="property in settings.gradle.libsResolver | filter: $select.search track by $index">
-                        <div ng-bind-html="property | highlight: $select.search"></div>
-                    </ui-select-choices>
-                </ui-select>
-            </div>
-
-            <div class="form-group-cell">
-                <div class="generate-title-label">Libs Publisher</div>
-                <label>Repository Key</label>
-                <jf-help-tooltip>Repository to use for publication.</jf-help-tooltip>
-                <ui-select jf-disable-ng-animate ng-model="selection.gradle.libsPublisher">
-                    <ui-select-match placeholder="Select Repository Key">
-                        {{$select.selected}}
-                    </ui-select-match>
-                    <ui-select-choices repeat="property in settings.gradle.libsPublisher | filter: $select.search track by $index">
-                        <div ng-bind-html="property | highlight: $select.search"></div>
-                    </ui-select-choices>
-                </ui-select>
-            </div>
-        </div>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <div>
-                    <jf-checkbox text="Use Maven">
-                        <input type="checkbox" ng-model="selection.gradle.pluginUseMaven" ng-change="checkLayoutSettings('plugin','maven')" />
-                    </jf-checkbox>
-                    <jf-help-tooltip>Mark to use Maven pattern.</jf-help-tooltip>
-                </div>
-                <div>
-                    <jf-checkbox text="Use Ivy">
-                        <input type="checkbox" ng-model="selection.gradle.pluginUseIvy" ng-change="checkLayoutSettings('plugin','ivy')" />
-                    </jf-checkbox>
-                    <jf-help-tooltip>Mark to use Ivy pattern.</jf-help-tooltip>
-                </div>
-            </div>
-            <div class="form-group-cell">
-                <div>
-                    <jf-checkbox text="Use Maven">
-                        <input type="checkbox" ng-model="selection.gradle.libsUseMaven" ng-change="checkLayoutSettings('libs','maven')" />
-                    </jf-checkbox>
-                    <jf-help-tooltip>Mark to use Maven pattern.</jf-help-tooltip>
-                </div>
-                <div>
-                    <jf-checkbox text="Use Ivy">
-                        <input type="checkbox" ng-model="selection.gradle.libsUseIvy" ng-change="checkLayoutSettings('libs','ivy')" />
-                    </jf-checkbox>
-                    <jf-help-tooltip>Mark to use Ivy pattern.</jf-help-tooltip>
-                </div>
-            </div>
-            <div class="form-group-cell">
-                <div>
-                    <jf-checkbox text="Use Maven">
-                        <input type="checkbox" ng-model="selection.gradle.publishUseMaven" ng-change="checkLayoutSettings('publish','maven')" />
-                    </jf-checkbox>
-                    <jf-help-tooltip>Mark to use Maven pattern.</jf-help-tooltip>
-                </div>
-                <div>
-                    <jf-checkbox text="Use Ivy">
-                        <input type="checkbox" ng-model="selection.gradle.publishUseIvy" ng-change="checkLayoutSettings('publish','ivy')" />
-                    </jf-checkbox>
-                    <jf-help-tooltip>Mark to use Ivy pattern.</jf-help-tooltip>
-                </div>
-            </div>
-        </div>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <label>Repository Layout</label>
-                <jf-help-tooltip>Repository layout to build the artifact and Maven/Ivy patterns from.</jf-help-tooltip>
-                <ui-select jf-disable-ng-animate ng-model="selection.gradle.pluginLayout" ng-disabled="selection.gradle.pluginUseMaven && !selection.gradle.pluginUseIvy">
-                    <ui-select-match placeholder="Select Repository Layout">
-                        {{$select.selected}}
-                    </ui-select-match>
-                    <ui-select-choices repeat="property in settings.gradle.layouts">
-                        <div ng-bind-html="property"></div>
-                    </ui-select-choices>
-                </ui-select>
-            </div>
-            <div class="form-group-cell">
-                <label>Repository Layout</label>
-                <jf-help-tooltip>Repository layout to build the artifact and Maven/Ivy patterns from.</jf-help-tooltip>
-                <ui-select jf-disable-ng-animate ng-model="selection.gradle.libsLayout" ng-disabled="selection.gradle.libsUseMaven && !selection.gradle.libsUseIvy">
-                    <ui-select-match placeholder="Select Repository Layout">
-                        {{$select.selected}}
-                    </ui-select-match>
-                    <ui-select-choices repeat="property in settings.gradle.layouts">
-                        <div ng-bind-html="property"></div>
-                    </ui-select-choices>
-                </ui-select>
-            </div>
-            <div class="form-group-cell">
-                <label>Repository Layout</label>
-                <jf-help-tooltip>Repository layout to build the artifact and Maven/Ivy patterns from.</jf-help-tooltip>
-                <ui-select jf-disable-ng-animate ng-model="selection.gradle.publishLayout" ng-disabled="selection.gradle.publishUseMaven && !selection.gradle.publishUseIvy">
-                    <ui-select-match placeholder="Select Repository Layout">
-                        {{$select.selected}}
-                    </ui-select-match>
-                    <ui-select-choices repeat="property in settings.gradle.layouts">
-                        <div ng-bind-html="property"></div>
-                    </ui-select-choices>
-                </ui-select>
-            </div>
-        </div>
-    </div>
-
-    <!-- Ivy Build Settings -->
-    <div ng-if="generate.ivy">
-        <div class="form-group">
-            <div class="form-group-cell">
-                <label>Libs Repository</label>
-                <jf-help-tooltip>Repository to use for resolution.</jf-help-tooltip>
-                <ui-select jf-disable-ng-animate ng-model="selection.ivy.libsRepository">
-                    <ui-select-match placeholder="Plugin Releases">
-                        {{$select.selected}}
-                    </ui-select-match>
-                    <ui-select-choices repeat="property in settings.ivy.libsRepository | filter: $select.search track by $index">
-                        <div ng-bind-html="property | highlight: $select.search"></div>
-                    </ui-select-choices>
-                </ui-select>
-            </div>
-            <div class="form-group-cell">
-                <label>Libs Repository Layout</label>
-                <jf-help-tooltip>Repository Layout to build the artifact and Ivy patterns from.</jf-help-tooltip>
-                <ui-select jf-disable-ng-animate ng-model="selection.ivy.libsRepositoryLayout">
-                    <ui-select-match placeholder="Plugin Releases">
-                        {{$select.selected}}
-                    </ui-select-match>
-                    <ui-select-choices repeat="property in settings.ivy.libsRepositoryLayout | filter: $select.search track by $index">
-                        <div ng-bind-html="property | highlight: $select.search"></div>
-                    </ui-select-choices>
-                </ui-select>
-            </div>
-            <div class="form-group-cell">
-                <label>Libs Resolver Name</label>
-                <jf-help-tooltip>An optional name for the generated resolver.</jf-help-tooltip>
-                <input type="text"
-                       ng-model="selection.ivy.libsResolverName"
-                       class="input-text"
-                       id="user" required>
-            </div>
-        </div>
-        <div class="form-group">
-            <div class="form-group-cell">
-                <jf-checkbox text="Use Ibiblio Resolver">
-                    <input type="checkbox" ng-model="selection.ivy.ibiblio" />
-                </jf-checkbox>
-                <jf-help-tooltip>Check if the resolver should use Ivy's ibiblio.</jf-help-tooltip>
-            </div>
-            <div class="form-group-cell">
-                <jf-checkbox text="Maven 2 Compatible">
-                    <input type="checkbox" ng-model="selection.ivy.maven2" ng-checked="selection.ivy.maven2 || selection.ivy.ibiblio" ng-disabled="selection.ivy.ibiblio" />
-                </jf-checkbox>
-                <jf-help-tooltip>Check if the resolver should use a Maven 2 compatible pattern.</jf-help-tooltip>
-            </div>
-        </div>
-    </div>
-
-    <div class="set-me-up-actions" ng-if="generateSettings">
-        <button class="btn btn-secondary" ng-click="generateBuildSettings()">Generate Settings</button>
-        <div class="pull-right text-button-group">
-            <form ng-if="generate.maven && snippet" class="inline" method="post" action="../ui/setMeUp/downloadBuildMaven?downloadScript=true">
-                <input name="data" type="hidden" ng-value="getMavenProps()">
-                <div onclick="javascript:$(this).parents('form').submit()" class="text-button">
-                    <span class="icon icon-download"></span>Download Snippet
-                </div>
-            </form>
-            <form ng-if="generate.gradle && snippet" class="inline" method="post" action="../ui/setMeUp/downloadBuildGradle?downloadScript=true">
-                <input name="data" type="hidden" ng-value="getGradleProps()">
-                <div onclick="javascript:$(this).parents('form').submit()" class="text-button">
-                    <span class="icon icon-download"></span>Download Snippet
-                </div>
-            </form>
-            <form ng-if="generate.gradle && snippet" class="inline" method="post" action="../ui/setMeUp/downloadBuildGradle?gradleProps=true">
-                <input name="data" type="hidden" ng-value="getGradleProps()">
-                <div onclick="javascript:$(this).parents('form').submit()" class="text-button">
-                    <span class="icon icon-download"></span>Download gradle.properties
-                </div>
-            </form>
-            <form ng-if="generate.ivy && snippet" class="inline" method="post" action="../ui/setMeUp/downloadBuildIvy?downloadScript=true">
-                <input name="data" type="hidden" ng-value="getIvyProps()">
-                <div onclick="javascript:$(this).parents('form').submit()" class="text-button">
-                    <span class="icon icon-download"></span>Download Snippet
-                </div>
-            </form>
-
-            <div class="text-button"
-                 ng-if="(generate.maven || generate.gradle || generate.ivy) && snippet && !deploySettingsMode"
-                 ng-click="setDeploySettingsMode()">
-                <span class="icon icon-upload"></span>Deploy Settings
-            </div>
-        </div>
-        <div ng-if="deploySettingsMode" class="margin-top-20">
-            <form>
-                <jf-panel jf-panel-heading="Deploy Snippet">
-                    <div class="form-group">
-                        <div class="form-group-cell">
-                            <label>Target Repository</label>
-                            <jf-ui-select jf-select-model="snippetDeploy.targetRepo"
-                                          jf-select-options="snippetDeploy.reposList"
-                                          jf-select-display-attr="repoKey">
-
-                            </jf-ui-select>
-                        </div>
-                        <div class="form-group-cell">
-                            <jf-field>
-                                <label for="target-file">Target Path
-                                </label>
-                                <input type="text"
-                                       class="input-text"
-                                       id="target-file"
-                                       ng-model="snippetDeploy.targetPath">
-                            </jf-field>
-                        </div>
-                            <button class="btn btn-secondary margin-top-25"
-                                    ng-disabled="!snippetDeploy.targetRepo"
-                                    type="button"
-                                    ng-click="deploySettingsSnippet()">Deploy
-                            </button>
-                    </div>
-                </jf-panel>
-            </form>
-        </div>
-    </div>
-
-    <!-- Repo selection -->
-    <div class="form-group deploy" ng-if="(selection.repoType.value !== 'ivy' && selection.repoType.value !== 'gradle')
-    && (!generateSettings || !showSettings)">
-        <div class="form-group-cell">
-            <label>Repository</label>
-            <ui-select jf-disable-ng-animate ng-model="selection.repo" ng-change="status.snippetResolved = false; resolveSnippet()"
-                       ng-disabled="shownRepos.length == 0">
-                <ui-select-match placeholder="Select Repository">
-                    {{$select.selected.text}}
-                </ui-select-match>
-                <ui-select-choices repeat="property in shownRepos | filter: $select.search track by $index">
-                    <div ng-bind-html="property.text | highlight: $select.search"></div>
-                </ui-select-choices>
-            </ui-select>
-        </div>
-        <div class="alert alert-warning" ng-if="shownRepos.length == 0">
-            No repositories match the selected tool
-        </div>
-
-    </div>
-
-    <div class="clearfix"></div>
-
-    <!-- Build Snippet -->
-    <div ng-if="shownRepos.length > 0">
-        <div class="settings-view" ng-if="snippet">
-            <div class="clearfix"></div>
-            <jf-clip-copy text-to-copy="snippet"
-                          class="code-mirror-copy"
-                          object-name="Snippet"></jf-clip-copy>
-            <jf-code-mirror mime-type="text/xml"
-                            model="snippet">
-            </jf-code-mirror>
-        </div>
-
-        <!-- General Snippet -->
-        <div class="settings-view" ng-if="generalSnippets && generalSnippets.length > 0 && !settingPage">
-            <label class="snippet">General</label>
-            <div ng-repeat="snip in generalSnippets">
-                <p ng-if="snip.title" ng-bind-html="snip.title"><p>
-                <p ng-if="snip.before" ng-bind-html="snip.before"></p>
-                <jf-clip-copy ng-if="snip.snippet"
-                              text-to-copy="snip.snippet"
-                              class="code-mirror-copy"
-                              object-name="Snippet"></jf-clip-copy>
-                <jf-code-mirror ng-if="snip.snippet"
-                                mime-type="text/xml"
-                                model="snip.snippet">
-                </jf-code-mirror>
-                <p ng-if="snip.after" ng-bind-html="snip.after"></p>
-            </div>
-        </div>
-
-        <!-- Deploy Snippet -->
-        <div class="settings-view" ng-if="deploySnippets && deploySnippets.length > 0 && !settingPage">
-            <label class="snippet">Deploy</label>
-            <div ng-repeat="snip in deploySnippets">
-                <p ng-if="snip.before" ng-bind-html="snip.before"></p>
-                <jf-clip-copy text-to-copy="snip.snippet"
-                              class="code-mirror-copy"
-                              object-name="Snippet"></jf-clip-copy>
-                <jf-code-mirror mime-type="text/xml"
-                                model="snip.snippet">
-                </jf-code-mirror>
-                <p ng-if="snip.after" ng-bind-html="snip.after"></p>
-            </div>
-        </div>
-
-        <!-- Resolve Snippet -->
-        <div class="settings-view" ng-if="readSnippets && readSnippets.length > 0 && !settingPage">
-            <label class="snippet">Resolve</label>
-            <div ng-repeat="snip in readSnippets">
-                <p ng-if="snip.before" ng-bind-html="snip.before"></p>
-                <jf-clip-copy text-to-copy="snip.snippet"
-                              class="code-mirror-copy"
-                              object-name="Snippet"></jf-clip-copy>
-                <jf-code-mirror mime-type="text/xml"
-                                model="snip.snippet">
-                </jf-code-mirror>
-                <p ng-if="snip.after" ng-bind-html="snip.after"></p>
-            </div>
-        </div>
-
-
-        <!-- Reverse Proxy Snippet -->
-        <div class="settings-view" ng-if="reverseProxySnippet">
-            <label class="snippet">Reverse Proxy</label>
-            <p><a href ng-click="showReverseProxy = !showReverseProxy">Click here</a> to {{showReverseProxy ? 'hide' : 'view'}} reverse proxy configuration snippet.</p>
-            <p>To use reverse proxy configuration, place the snippet in the sites-enabled directory and reload. This will effect Artifactory reverse proxy configuration and Docker repositories if configured.</p>
-            <div ng-if="showReverseProxy">
-                <jf-clip-copy text-to-copy="reverseProxySnippet"
-                              class="code-mirror-copy"
-                              object-name="Snippet"></jf-clip-copy>
-                <jf-code-mirror mime-type="text"
-                                model="reverseProxySnippet">
-                </jf-code-mirror>
-            </div>
-        </div>
-    </div>
-</div>
-<div class="modal-footer"
-     ng-if="selection.repoType && selection.repoType.wiki">
-    <div id="package-description" class="text-left">
-        <a href="https://www.jfrog.com/confluence/display/RTF/{{selection.repoType.wiki}}" target="_blank">
-            Learn more about Artifactory support for {{selection.repoType.text}} <span ng-if="selection.repoType.value !== 'docker'">repository</span><span ng-if="selection.repoType.value === 'docker'">registry</span>
-        </a>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/smart_remote_repository.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/smart_remote_repository.html
deleted file mode 100644
index e09a04e..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/smart_remote_repository.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<div id="smart-remote-repository">
-    <div class="modal-header">
-        <h3 class="modal-title">Artifactory Remote Repository Detected</h3>
-    </div>
-    <div class="modal-body">
-        <p>The remote repository at the URL you specified is hosted by another instance of Artifactory. This exposes additional capabilities you may configure:</p>
-        <div class="sync-checkbox"
-             ng-if="isSmartRepoSupportFeature('SYNC_STATISTICS')">
-            <jf-checkbox text="Report Statistics">
-                <input type="checkbox"
-                       ng-model="smartRepo.statistics.enabled">
-            </jf-checkbox>
-            <p>
-                If set, download statistics for the artifact at the remote Artifactory instance will be updated each time a cached item is downloaded from your repository.
-            </p>
-        </div>
-        <div class="sync-checkbox"
-             ng-if="isSmartRepoSupportFeature('SYNC_PROPERTIES')">
-            <jf-checkbox text="Sync Properties">
-                <input type="checkbox"
-                       ng-model="smartRepo.properties.enabled">
-            </jf-checkbox>
-            <p>
-                If set, properties for artifacts that have been cached in this repository will be updated if they are modified in the artifact hosted at the remote Artifactory instance.
-            </p>
-        </div>
-        <div class="sync-checkbox"
-             ng-if="isSmartRepoSupportFeature('LIST_CONTENT')">
-            <jf-checkbox text="List Remote Folder Items">
-                <input type="checkbox"
-                       ng-model="smartRepo.typeSpecific.listRemoteFolderItems">
-            </jf-checkbox>
-            <p>
-                If set, Artifactory lets you navigate the contents of the repository at the remote Artifactory instance for all package types, even if the artifacts have not been cached in this repository.
-            </p>
-        </div>
-        <div class="sync-checkbox"
-             ng-if="isSmartRepoSupportFeature('DETECT_ORIGIN_ABSENCE')">
-            <jf-checkbox text="Source Absence Detection">
-                <input type="checkbox"
-                       ng-model="smartRepo.source.originAbsenceDetection">
-            </jf-checkbox>
-            <p>
-                If set, you will see an indication if a cached artifact has been deleted from the repository at the remote Artifactory instance.
-            </p>
-        </div>
-        <p>These settings are also available in the Edit Repository screen.</p>
-    </div>
-    <div class="modal-footer">
-        <jf-checkbox class="pull-left"
-                     text="Do not show this message again">
-            <input type="checkbox"
-                   ng-change="onDontShowAgain()"
-                   ng-model="options.dontShowAgain">
-        </jf-checkbox>
-        <button class="btn btn-primary" ng-click="closeModal()">OK</button>
-    </div>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/user_modal.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/user_modal.html
deleted file mode 100644
index 12deb26..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/user_modal.html
+++ /dev/null
@@ -1,74 +0,0 @@
-<div class="modal-header">
-    <h3 class="modal-title">{{formUserTitle}}</h3>
-</div>
-<div class="modal-body">
-
-
-    <form name="newUserForm" class="">
-        <div class="row">
-            <div class="form-group col-lg-6">
-                <label for="user">Username:</label>
-
-                <input name="username"
-                       type="text"
-                       ng-model="user.name"
-                       class="form-control"
-                       id="user" required>
-
-                <label for="email">Email Address</label>
-                <input name="email"
-                       type="email"
-                       ng-model="user.email"
-                       class="form-control"
-                       id="email" required>
-            </div>
-
-            <div class="form-group col-lg-6">
-
-                <label for="password">Password:</label>
-                <input type="password"
-                       ng-model="user.password"
-                       class="form-control"
-                       id="password"
-                       required>
-
-                <label for="retypePassword">Retype Password:</label>
-                <input type="password"
-                       ng-model="user.retypePassword"
-                       class="form-control"
-                       id="retypePassword"
-                       required>
-
-            </div>
-        </div>
-
-        <div class="checkbox">
-            <label><input type="checkbox"
-                          ng-model="user.profileUpdatable"> Can Update Profile</label>
-        </div>
-        <div class="checkbox">
-            <label><input type="checkbox"
-                          ng-model="user.admin"> Admin</label>
-        </div>
-        <div class="checkbox">
-            <label><input type="checkbox"
-                          g-model="user.internalPasswordDisable"> Disable Internal
-                Password</label>
-        </div>
-
-        <div>
-            <div ng-switch="mode" class="btn-group">
-                <button class=" btn btn-primary" ng-switch-when="edit" ng-click="updateUser(user)">Save</button>
-                <button class=" btn btn-primary" ng-switch-default ng-click="createNewUser(user)">Save</button>
-
-            </div>
-            <div class="btn-group">
-                <button class="btn btn-default"  ng-click="closeModal()">Cancel</button>
-            </div>
-        </div>
-
-    </form>
-
-
-</div>
-
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/warning_modal.html b/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/warning_modal.html
deleted file mode 100644
index 6af4e4e..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_modal/templates/warning_modal.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<div class="modal-header">
-    <h3 class="modal-title">Warning!</h3>
-</div>
-<div class="modal-body">
-    Are you sure you want to delete {{itemName}} ?
-</div>
-<div class="modal-footer">
-    <button class="btn btn-primary" ng-click="AdminSecurityUser.closeModal(true)">Yes</button>
-    <button class="btn btn-warning" ng-click="cancel()">No</button>
-</div>
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_uploader/artifactory_uploader.js b/web/angular-web/src/main/webapp/app/ui_components/artifactory_uploader/artifactory_uploader.js
deleted file mode 100644
index a1eb98d..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_uploader/artifactory_uploader.js
+++ /dev/null
@@ -1,185 +0,0 @@
-/**
- * Created by idannaim on 8/4/15.
- */
-let controller;
-class ArtifactoryUploader {
-    constructor(FileUploader, _controller_) {
-        controller = _controller_;
-        this.fileUploader = new FileUploader();
-
-    }
-
-    /**
-     * Path on the server to upload files
-     * @param path
-     * @returns {ArtifactoryUploader}
-     */
-    setUrl(path) {
-        this.fileUploader.url = path;
-        return this;
-    }
-
-    /**
-     *
-     * @returns {the uploader instance}
-     */
-    getUploader() {
-        return this.fileUploader;
-    }
-
-    /**
-     *  Fires after adding a single file to the queue.
-     * @param func
-     * @returns {ArtifactoryUploader}
-     */
-    setOnAfterAddingFile(func) {
-        this.fileUploader.onAfterAddingFile = func.bind(controller);
-        return this;
-    }
-
-    /**
-     * When adding a file failed.
-     * @param func
-     * @returns {ArtifactoryUploader}
-     */
-    setOnWhenAddingFileFailed(func) {
-        this.fileUploader.onWhenAddingFileFailed = func.bind(this);
-        return this;
-    }
-
-    /**
-     * Fires after adding all the dragged or selected files to the queue.
-     * @param func
-     * @returns {ArtifactoryUploader}
-     */
-    setOnAfterAddingAll(func) {
-        this.fileUploader.onAfterAddingAll = func.bind(controller);
-        return this;
-    }
-
-    /**
-     * Fires before uploading an item.
-     * @param func
-     * @returns {ArtifactoryUploader}
-     */
-    setOnBeforeUploadItem(func) {
-        this.fileUploader.onBeforeUploadItem = func.bind(controller);
-        return this;
-    }
-
-    /**
-     *  On file upload progress
-     * @param func
-     * @returns {ArtifactoryUploader}
-     */
-    setOnProgressItem(func) {
-        this.fileUploader.onProgressItem = func.bind(controller);
-        return this;
-    }
-
-    /**
-     * On file successfully uploaded
-     * @param func
-     * @returns {ArtifactoryUploader}
-     */
-    setOnSuccessItem(func) {
-        this.fileUploader.onSuccessItem = func.bind(controller);
-        return this;
-    }
-
-    /**
-     *  On upload error
-     * @param func
-     * @returns {ArtifactoryUploader}
-     */
-
-    setOnErrorItem(func) {
-        this.fileUploader.onErrorItem = func.bind(controller);
-        return this;
-    }
-
-    /**
-     * On cancel uploading
-     * @param func
-     * @returns {ArtifactoryUploader}
-     */
-    setOnCancelItem(func) {
-        this.fileUploader.onCancelItem = func.bind(controller);
-        return this;
-    }
-
-    /**
-     * On file upload complete (independently of the success of the operation)
-     * @param func
-     * @returns {ArtifactoryUploader}
-     */
-    setOnCompleteItem(func) {
-        this.fileUploader.onCompleteItem = func.bind(controller);
-        return this;
-    }
-
-    /**
-     * On upload queue progress
-     * @param func
-     * @returns {ArtifactoryUploader}
-     */
-    setOnProgressAll(func) {
-        this.fileUploader.onProgressAll = func.bind(controller);
-        return this;
-    }
-
-    /**
-     *  On all loaded when uploading an entire queue, or on file loaded when uploading a single independent file
-     * @param func
-     * @returns {ArtifactoryUploader}
-     */
-    setOnCompleteAll(func) {
-        this.fileUploader.onCompleteAll = func.bind(controller);
-        return this;
-    }
-
-    /**
-     *
-     * @returns { files queue}
-     */
-    getQueue() {
-        return this.fileUploader.queue || [];
-    }
-
-    /**
-     * clear all files from queue
-     */
-    clearQueue() {
-        this.fileUploader.queue = [];
-    }
-
-    /**
-     * upload all files in queue
-     */
-    uploadAll() {
-        this.fileUploader.uploadAll();
-    }
-
-    /**
-     * remove file from queue
-     * @param fileItem
-     * @returns {queue}
-     */
-    removeFileFromQueue(fileItem) {
-        this.fileUploader.removeFromQueue(fileItem);
-        return this.fileUploader.queue;
-    }
-
-}
-
-
-export class ArtifactoryUploaderFactory {
-    constructor(FileUploader) {
-        this.fileUploader = FileUploader;
-    }
-
-    getUploaderInstance(controller) {
-        return new ArtifactoryUploader(this.fileUploader, controller);
-    }
-
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/artifactory_uploader/artifactory_uploader.module.js b/web/angular-web/src/main/webapp/app/ui_components/artifactory_uploader/artifactory_uploader.module.js
deleted file mode 100644
index 33cf0dd..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/artifactory_uploader/artifactory_uploader.module.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * Created by idannaim on 8/4/15.
- */
-import{ArtifactoryUploaderFactory}   from'./artifactory_uploader'
-
-export default angular.module('artifactory_uploader', ['angularFileUpload'])
-        .service('ArtifactoryUploaderFactory', ArtifactoryUploaderFactory)
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/ui_components/ui_components.module.js b/web/angular-web/src/main/webapp/app/ui_components/ui_components.module.js
deleted file mode 100644
index 8944260..0000000
--- a/web/angular-web/src/main/webapp/app/ui_components/ui_components.module.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import Grid     from './artifactory_grid/artifactory_grid.module';
-import Modal    from './artifactory_modal/artifactory_modal.module';
-import Uploader from './artifactory_uploader/artifactory_uploader.module'
-angular.module('artifactory.ui_components', [
-    Grid.name,
-    Modal.name,
-    Uploader.name
-]);
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/app/vendor.js b/web/angular-web/src/main/webapp/app/vendor.js
deleted file mode 100644
index 3c82f30..0000000
--- a/web/angular-web/src/main/webapp/app/vendor.js
+++ /dev/null
@@ -1,86 +0,0 @@
-/**
- * those files will be loaded and concat by gulp
- * @type {{JS: string[], CSS: string[]}}
- */
-module.exports = {
-
-    JS: [
-        'components/angular/angular.js',
-        'components/angular-animate/angular-animate.min.js',
-        'components/angular-mocks/angular-mocks.js',
-        'components/angular-cookies/angular-cookies.js',
-        'components/angular-sanitize/angular-sanitize.js',
-        'components/angular-messages/angular-messages.js',
-        'components/angular-ui-layout/ui-layout.js',
-        'components/angular-ui-router/release/angular-ui-router.js',
-        'components/angular-bootstrap/ui-bootstrap-tpls.js',
-        'components/angular-ui-grid/ui-grid.js',
-        'components/angular-resource/angular-resource.js',
-        'components/angularjs-toaster/toaster.js',
-        'components/jquery/dist/jquery.js',
-        'components/jQuery-contextMenu/dist/jquery.contextMenu.min.js',
-        'components/jquery-ui/jquery-ui.js',
-        'components/lodash/lodash.js',
-        'components/codemirror/lib/codemirror.js',
-        'components/codemirror/addon/mode/overlay.js',
-        'components/codemirror/mode/xml/xml.js',
-        'components/codemirror/mode/javascript/javascript.js',
-        'components/codemirror/mode/clike/clike.js',
-        'components/codemirror/addon/dialog/dialog.js',
-        'components/codemirror/addon/search/searchcursor.js',
-        'components/angular-ui-codemirror/ui-codemirror.js',
-        'components/x2js/xml2json.js',
-        'components/angular-hotkeys/build/hotkeys.js',
-        'components/jstree/dist/jstree.js',
-        'components/angular-ui-select/dist/select.js',
-        'components/selectize/dist/js/standalone/selectize.js',
-        'components/angular-selectize2/dist/selectize.js',
-        'components/zeroclipboard/dist/ZeroClipboard.js',
-        'components/ng-clip/src/ngClip.js',
-        'components/angular-file-upload/angular-file-upload.js',
-        'components/angular-ui-utils/ui-utils.js',
-        'components/later/later.js',
-        'vendor/jquery.highlight.js',
-        'components/ng-password-strength/dist/scripts/ng-password-strength.js',
-        'components/tooltipster/js/jquery.tooltipster.min.js',
-        'components/angular-capitalize-filter/capitalize.js',
-        'components/tinycolor/tinycolor.js',
-        'components/angularjs-color-picker/angularjs-color-picker.min.js',
-        'components/deep-diff/releases/deep-diff-0.3.2.min.js',
-        'vendor/draggable-rows.js',
-        'components/clipboard/dist/clipboard.min.js'
-    ],
-
-    CSS: [
-        'components/jquery-ui/themes/smoothness/jquery-ui.css',
-        'components/jQuery-contextMenu/dist/jquery.contextMenu.min.css',
-        'components/bootstrap/dist/css/bootstrap.css',
-        'components/angular-ui-layout/ui-layout.css',
-        'components/angular-ui-grid/ui-grid.min.css',
-        'components/angularjs-color-picker/angularjs-color-picker.min.css',
-        'components/animate.css/animate.css',
-        'components/angularjs-toaster/toaster.css',
-        'components/codemirror/lib/codemirror.css',
-        'components/codemirror/lib/codemirror.css',
-        'components/angular-hotkeys/build/hotkeys.css',
-        'components/jstree/dist/themes/default/style.css',
-        'components/angular-ui-select/dist/select.css',
-        'components/lessfonts-open-sans/dist/css/open-sans.css',
-        //'components/selectize/dist/css/selectize.css',
-        'components/selectize/dist/css/selectize.bootstrap3.css',
-        'components/font-awesome/css/font-awesome.css',
-        'components/tooltipster/css/tooltipster.css',
-        'components/codemirror/addon/dialog/dialog.css'
-    ],
-
-    FONTS: [
-        'components/lessfonts-open-sans/dist/fonts/**/*.{svg,woff,ttf,eot}',
-        'components/font-awesome/fonts/*.{svg,woff,ttf,eot}'
-    ],
-
-    ASSETS: [
-        'components/jstree/dist/themes/default/*.{png,gif}',
-        'components/angular-ui-grid/*.{svg,woff,ttf,eot}',
-        'components/zeroclipboard/dist/ZeroClipboard.swf'
-    ]
-};
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/artifactory.config.js b/web/angular-web/src/main/webapp/artifactory.config.js
deleted file mode 100644
index 749c641..0000000
--- a/web/angular-web/src/main/webapp/artifactory.config.js
+++ /dev/null
@@ -1,30 +0,0 @@
-var vendorPaths = require('./app/vendor');
-
-module.exports = {
-
-    SOURCES: {
-        APPLICATION_JS: 'app/**/*.js',
-        TEMPLATES: 'app/**/**/*.html',
-        REQUIRED_TEMPLATES: 'app/ui_components/artifactory_grid/templates/*.html',
-        VENDOR_SCRIPTS : vendorPaths.JS,
-        VENDOR_CSS : vendorPaths.CSS,
-        VENDOR_ASSETS: vendorPaths.ASSETS,
-        VENDOR_FONTS: vendorPaths.FONTS,
-        LESS: 'app/assets/stylesheets/**/*.less',
-        LESS_MAIN_FILE: 'app/assets/stylesheets/main.less',
-        INDEX : 'app/app.html',
-        STYLEGUIDE: 'app/styleguide.html',
-        FONTS : 'app/assets/fonts/**',
-        VENDOR_JS : 'app/vendor.js',
-        IMAGES : 'app/assets/images/**',
-        JQUERY_UI_IMAGES : 'app/assets/images/jqueryui/**',
-        MEDIUM_SVG_ICONS: 'app/assets/svgicons/*.svg'
-    },
-
-    DESTINATIONS: {
-        TARGET: '../../../../war/src/main/webapp/webapp',
-        TARGET_REV: [
-            '../../../../war/src/main/webapp/webapp/**'
-        ]
-    }
-};
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/bower.json b/web/angular-web/src/main/webapp/bower.json
deleted file mode 100644
index b369465..0000000
--- a/web/angular-web/src/main/webapp/bower.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{
-  "name": "Webapp",
-  "version": "1.0.0",
-  "homepage": "",
-  "description": "AngularJS Application",
-  "license": "",
-  "ignore": [
-    "**/.*",
-    "node_modules",
-    "bower_components",
-    "test"
-  ],
-  "dependencies": {
-    "angular": "1.4.8",
-    "angular-sanitize": "1.4.8",
-    "angular-ui-router": "0.2.13",
-    "angular-mocks": "1.4.8",
-    "bootstrap": "3.1.1",
-    "angular-cookies": "1.3.13",
-    "angular-ui-layout": "500tech/ui-layout#broadcast_on_resize",
-    "angular-bootstrap": "0.12.1",
-    "angular-ui-grid": "500tech/bower-ui-grid#v3.0.0-rc.21-patch4",
-    "angular-resource": "1.4.8",
-    "angular-animate": "1.4.8",
-    "animate.css": "3.2.1",
-    "angularjs-toaster": "*",
-    "jquery": "2.1.3",
-    "jquery-ui": "1.11.4",
-    "lodash": "3.9.3",
-    "x2js": "1.1.7",
-    "angular-ui-codemirror": "0.2.3",
-    "codemirror": "5.0.0",
-    "angular-hotkeys": "chieffancypants/angular-hotkeys#1.4.5",
-    "jstree": "500tech/jstree#3.0.0-beta10-patch7",
-    "angular-ui-select": "0.11.2",
-    "lessfonts-open-sans": "1.0.2",
-    "selectize": "0.12.1",
-    "angular-selectize2": "500tech/angular-selectize#master",
-    "zeroclipboard": "2.2.0",
-    "ng-clip": "0.2.6",
-    "angular-file-upload": "1.1.5",
-    "angular-ui-utils": "bower",
-    "angular-messages": "1.4.8",
-    "later": "*",
-    "font-awesome": "4.3.0",
-    "ng-password-strength": "0.2.1",
-    "tooltipster": "3.3.0",
-    "jQuery-contextMenu": "~1.8.1",
-    "deep-diff": "~0.3.2",
-    "clipboard": "~1.5.5",
-    "angularjs-color-picker": "0.6.6",
-    "tinycolor": "1.2.1"
-  },
-  "resolutions": {
-    "angular": "1.4.8",
-    "codemirror": "5.0.0",
-    "bootstrap": "3.1.1"
-  },
-  "devDependencies": {
-    "angular-capitalize-filter": "2.1.0",
-    "jasmine-jquery": "2.1.0"
-  }
-}
diff --git a/web/angular-web/src/main/webapp/browser_stack.config.js b/web/angular-web/src/main/webapp/browser_stack.config.js
deleted file mode 100644
index bb0efb4..0000000
--- a/web/angular-web/src/main/webapp/browser_stack.config.js
+++ /dev/null
@@ -1,34 +0,0 @@
-module.exports = {
-  browsers: {
-    bs_chrome_mac: {
-      base: 'BrowserStack',
-      browser: 'chrome',
-      os: 'OS X',
-      os_version: 'Mountain Lion'
-    },
-    bs_safari_mac: {
-      base: 'BrowserStack',
-      browser: 'safari',
-      os: 'OS X',
-      os_version: 'Mountain Lion'
-    },
-    bs_firefox_win: {
-      base: 'BrowserStack',
-      browser: 'firefox',
-      os: 'Windows',
-      os_version: '8.1'
-    },
-    bs_chrome_win: {
-      base: 'BrowserStack',
-      browser: 'chrome',
-      os: 'Windows',
-      os_version: '8.1'
-    },
-    bs_ie_win: {
-      base: 'BrowserStack',
-      browser: 'ie',
-      os: 'Windows',
-      os_version: '8.1'
-    },
-  }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/karma.conf.js b/web/angular-web/src/main/webapp/karma.conf.js
deleted file mode 100644
index 1ba3cb3..0000000
--- a/web/angular-web/src/main/webapp/karma.conf.js
+++ /dev/null
@@ -1,62 +0,0 @@
-var browserStack = require('./browser_stack.config');
-module.exports = function (config) {
-    config.set({
-        basePath: '',
-        frameworks: ['jasmine', 'browserify'],
-        files: [
-            '../../../../war/src/main/webapp/webapp/vendorScripts*.js',
-            '../../../../war/src/main/webapp/webapp/templates*.js',
-            '../../../../war/src/main/webapp/webapp/artifactory_core*.js',
-            '../../../../war/src/main/webapp/webapp/artifactory_services*.js',
-            '../../../../war/src/main/webapp/webapp/artifactory_dao*.js',
-            '../../../../war/src/main/webapp/webapp/artifactory_ui*.js',
-            '../../../../war/src/main/webapp/webapp/artifactory_directives*.js',
-            '../../../../war/src/main/webapp/webapp/artifactory_ui_components*.js',
-            '../../../../war/src/main/webapp/webapp/artifactory_views*.js',
-            '../../../../war/src/main/webapp/webapp/artifactory_filters*.js',
-            '../../../../war/src/main/webapp/webapp/artifactory_states*.js',
-            '../../../../war/src/main/webapp/webapp/artifactory_main*.js',
-            'specs/spec_helper.js',
-            'components/jasmine-jquery/lib/jasmine-jquery.js',
-            'mocks/**/**.js',
-            'specs/**/**.js'
-        ],
-        exclude: [
-            "open/web/war/src/main/webapp/webapp/css/**",
-            "open/web/war/src/main/webapp/webapp/fonts/**"
-        ],
-        preprocessors: {
-            '{specs,mocks}/**/**.js': [],
-            '{specs,mocks}/**/**.browserify.js': ['browserify'],
-            'mocks/tree_node_mock.browserify.js': ['browserify']
-        },
-        browserify: {
-            debug: true,
-            transform: ['babelify']
-        },
-        junitReporter: {
-            outputDir: 'test_results'
-        },
-        reporters: ['progress'],
-        port: 9876,
-        colors: true,
-        logLevel: config.LOG_INFO,
-        autoWatch: true,
-
-        browserStack: {
-            project: 'Artifactory Karma',
-            build: process.env.BUILD_NUMBER
-        },
-
-        browserDisconnectTimeout: 20000,
-        browserDisconnectTolerance: 3,
-        browserNoActivityTimeout: 60000,        
-
-        // define browsers
-        customLaunchers: browserStack.browsers,
-
-        browsers: ['Chrome'],
-
-        singleRun: false
-    });
-};
diff --git a/web/angular-web/src/main/webapp/mocks/artifactory_storage_mock.browserify.js b/web/angular-web/src/main/webapp/mocks/artifactory_storage_mock.browserify.js
deleted file mode 100644
index c2c5b61..0000000
--- a/web/angular-web/src/main/webapp/mocks/artifactory_storage_mock.browserify.js
+++ /dev/null
@@ -1,18 +0,0 @@
-angular.module('artifactory.mocks', [])
-	.run(function($window) {
-		var store = {};
-		spyOn($window.localStorage, 'getItem').and.callFake((key) => {
-			return store[key];
-		});
-		spyOn($window.localStorage, 'setItem').and.callFake((key, value) => {
-			return store[key] = value;
-		});
-		spyOn($window.localStorage, 'removeItem').and.callFake((key) => {
-			delete store[key];
-		});
-	});
-
-// The mock function loads the above module before each
-export default function mock() {
-	beforeEach(m('artifactory.mocks'));
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/mocks/footer_mock.browserify.js b/web/angular-web/src/main/webapp/mocks/footer_mock.browserify.js
deleted file mode 100644
index 3ef9054..0000000
--- a/web/angular-web/src/main/webapp/mocks/footer_mock.browserify.js
+++ /dev/null
@@ -1,32 +0,0 @@
-class FooterMock {
-  constructor() {
-    this.mockData = {
-      isAol: false,
-      versionID: 'OSS'
-    };
-    beforeEach(inject(($httpBackend, RESOURCE) => {
-      $httpBackend.whenGET(RESOURCE.API_URL + RESOURCE.FOOTER).respond(() => {
-        return [200, this.mockData];
-      });
-    }));
-  }
-
-  mockOss() {
-    this.mockData.versionID = 'OSS';
-    return this;
-  };
-  mockPro() {
-    this.mockData.versionID = 'PRO';
-    return this;
-  };
-  mockEnt() {
-    this.mockData.versionID = 'ENT';
-    return this;
-  };
-  mockAol() {
-    this.mockData.isAol = true;
-    return this;
-  };
-}
-
-export default FooterMock;
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/mocks/grid_api_mock.browserify.js b/web/angular-web/src/main/webapp/mocks/grid_api_mock.browserify.js
deleted file mode 100644
index e0ef30f..0000000
--- a/web/angular-web/src/main/webapp/mocks/grid_api_mock.browserify.js
+++ /dev/null
@@ -1,43 +0,0 @@
-export default function GridApiMock(gridOptions) {
-  let elementMock = {
-    css: jasmine.createSpy('css')
-  };
-  elementMock.find = jasmine.createSpy('find').and.returnValue(elementMock);
-  
-  return {
-    grid: {
-      id: '1234',
-      element: elementMock,
-      options: gridOptions
-    },
-    core: {
-      getVisibleRows: jasmine.createSpy('rowsRendered').and.returnValue([]),
-      on: {
-        rowsRendered: jasmine.createSpy('rowsRendered'),
-        sortChanged: jasmine.createSpy('sortChanged')
-      }
-    },
-    selection: {
-      on: {
-        rowSelectionChanged: jasmine.createSpy('rowSelectionChanged'),
-        rowSelectionChangedBatch: jasmine.createSpy('rowSelectionChangedBatch')
-      },
-      selectRow: jasmine.createSpy('selectRow')
-    },
-    draggableRows: {
-      on: {
-        rowDropped: jasmine.createSpy('rowDropped')
-      }
-    },
-    pagination: {
-      on: {
-        paginationChanged: jasmine.createSpy('paginationChanged')
-      }
-    },
-    colResizable: {
-      on: {
-        columnSizeChanged: jasmine.createSpy('columnSizeChanged')
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/mocks/ha_mock.browserify.js b/web/angular-web/src/main/webapp/mocks/ha_mock.browserify.js
deleted file mode 100644
index 708a3a9..0000000
--- a/web/angular-web/src/main/webapp/mocks/ha_mock.browserify.js
+++ /dev/null
@@ -1,36 +0,0 @@
-export const regularResponse = [{
-  "id" : "art-8080",
-  "startTime" : "14-07-15 13:51:45 IDT",
-  "url" : "http://127.0.0.1:8080/artifactory",
-  "memberShipPort" : 53701,
-  "state" : "Running",
-  "role" : "Primary",
-  "lastHeartbeat" : "14-07-15 14:00:49 IDT",
-  "version" : "4.x-SNAPSHOT",
-  "revision" : 0,
-  "heartbeatStale": true,
-  "releaseDate" : "01-01-70 02:00:00 IST"
-}, {
-  "id" : "art-8081",
-  "startTime" : "14-07-15 13:52:43 IDT",
-  "url" : "http://127.0.0.1:8081/artifactory",
-  "memberShipPort" : 53763,
-  "state" : "Running",
-  "role" : "Member",
-  "lastHeartbeat" : "14-07-15 14:00:48 IDT",
-  "version" : "4.x-SNAPSHOT",
-  "revision" : 0,
-  "releaseDate" : "01-01-70 02:00:00 IST"
-}, {
-  "id" : "art-8082",
-  "startTime" : "14-07-15 13:53:43 IDT",
-  "url" : "http://127.0.0.1:8082/artifactory",
-  "memberShipPort" : 53991,
-  "state" : "Running",
-  "role" : "Member",
-  "lastHeartbeat" : "14-07-15 14:00:48 IDT",
-  "version" : "4.x-SNAPSHOT",
-  "revision" : 0,
-  "releaseDate" : "01-01-70 02:00:00 IST"
-}];
-
diff --git a/web/angular-web/src/main/webapp/mocks/property_sets_mocks.browserify.js b/web/angular-web/src/main/webapp/mocks/property_sets_mocks.browserify.js
deleted file mode 100644
index 2bf0aa6..0000000
--- a/web/angular-web/src/main/webapp/mocks/property_sets_mocks.browserify.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var faker = require('faker');
-export function PropertyMock(data = {}) {
-  let defaults = {
-    name: faker.name.firstName(),
-    propertyType: "ANY_VALUE",
-    predefinedValues: [
-      {value: 'value1', defaultValue: false},
-      {value: 'value2', defaultValue: true}
-    ]
-  };
-  data = angular.extend(defaults, data);
-
-  return data;
-}
-
-export function PropertySetMock(data = {}) {
-  let defaults = {
-    name: faker.name.firstName(),
-    properties: [new PropertyMock(), new PropertyMock()]
-  };
-  data = angular.extend(defaults, data);
-
-  return data;
-}
-
diff --git a/web/angular-web/src/main/webapp/mocks/state_params_mock.browserify.js b/web/angular-web/src/main/webapp/mocks/state_params_mock.browserify.js
deleted file mode 100644
index f4a9ef6..0000000
--- a/web/angular-web/src/main/webapp/mocks/state_params_mock.browserify.js
+++ /dev/null
@@ -1,10 +0,0 @@
-export default function StateParamsMock(stateParams) {
-  angular.mock.module(($provide) => {
-    // mock the entire $state provider
-    $provide.provider('$stateParams', () => {
-        return {
-            $get: () => { return stateParams}
-        };
-    });
-  });
-}
diff --git a/web/angular-web/src/main/webapp/mocks/tree_node_mock.browserify.js b/web/angular-web/src/main/webapp/mocks/tree_node_mock.browserify.js
deleted file mode 100644
index 16e9d6c..0000000
--- a/web/angular-web/src/main/webapp/mocks/tree_node_mock.browserify.js
+++ /dev/null
@@ -1,89 +0,0 @@
-var faker = require('faker');
-function TreeNodeMock(data) {
-  data = data || {};
-  var name = data.text || faker.name.firstName();
-  var treeNodeMock = angular.extend(
-    {
-      type: _.sample(['file', 'folder', 'archive', 'repository']),
-      repoKey: faker.name.firstName(),
-      path: faker.name.firstName() + '/' + name,
-      archivePath: undefined,
-      repoPkgType: 'Maven',
-      repoType: 'local',
-      local: true,
-      text: name,
-      trashcan: false
-    },
-    data
-  );
-  treeNodeMock.withChildren = function(number) {
-    this.children = TreeNodeMock.array(number);
-    return this;
-  };
-  treeNodeMock.expectGetChildren = function(children) {
-    inject(function ($httpBackend, RESOURCE) {
-      $httpBackend.expectPOST(RESOURCE.API_URL + RESOURCE.TREE_BROWSER + '?compacted=true',
-          {type: 'junction', repoKey: treeNodeMock.repoKey, repoType: treeNodeMock.repoType, path: treeNodeMock.path, text: treeNodeMock.text, trashcan: treeNodeMock.trashcan})
-          .respond(children);            
-    });
-  };
-  treeNodeMock.expectLoad = function(data) {
-    data = data || [{tabs: [], actions: []}];
-    inject(function ($httpBackend, RESOURCE) {
-      $httpBackend.expectPOST(RESOURCE.API_URL + RESOURCE.TREE_BROWSER,
-          {type: treeNodeMock.type, repoKey: treeNodeMock.repoKey, path: treeNodeMock.path, text: treeNodeMock.text, repoType: treeNodeMock.repoType})
-          .respond(data);
-    });
-  };
-  return treeNodeMock;
-}
-TreeNodeMock.array = function(length) {
-  var result = [];
-  for (var i = 0; i < length; i++) {
-    result[i] = TreeNodeMock();
-  }
-  return result;
-};
-TreeNodeMock.data = function(data) {
-  return [angular.extend(
-    {
-      tabs: [],
-      actions: []
-    },
-    data || {}
-  )];
-};
-TreeNodeMock.repo = function(name) {
-  name = name || 'repo';
-  return TreeNodeMock({repoKey: name, path: '', text: name, type: 'repository', hasChild: true, tabs: [], actions: []});
-};
-TreeNodeMock.folder = function(options = {}) {
-  return TreeNodeMock(angular.extend(options, {type: 'folder', hasChild: true}));
-};
-TreeNodeMock.file = function(options = {}) {
-  return TreeNodeMock(angular.extend(options, {type: 'file', hasChild: false}));
-};
-TreeNodeMock.archive = function(options = {}) {
-  return TreeNodeMock(angular.extend(options, {type: 'archive', hasChild: true}));
-};
-
-TreeNodeMock.expectGetRoots = function(compacted = true, repos = null) {
-  repos = repos || [TreeNodeMock.repo('repo1'), TreeNodeMock.repo('repo2')];
-  inject(function ($httpBackend, RESOURCE) {
-    $httpBackend.expectPOST(RESOURCE.API_URL + RESOURCE.TREE_BROWSER + '?compacted=' + compacted, {"type": "root"})
-            .respond(repos);
-  });
-};
-TreeNodeMock.expectGetFooterData = function() {
-  inject(function ($httpBackend, RESOURCE) {
-    $httpBackend.expectGET(RESOURCE.API_URL + RESOURCE.FOOTER)
-            .respond(200);
-  });
-};
-TreeNodeMock.expectGetChildren = function(children, compacted = true) {
-  inject(function ($httpBackend, RESOURCE) {
-    $httpBackend.expectPOST(RESOURCE.API_URL + RESOURCE.TREE_BROWSER + '?compacted=' + compacted)
-        .respond(children);            
-  });
-};
-module.exports = TreeNodeMock;
diff --git a/web/angular-web/src/main/webapp/mocks/user_mock.browserify.js b/web/angular-web/src/main/webapp/mocks/user_mock.browserify.js
deleted file mode 100644
index 4b6323d..0000000
--- a/web/angular-web/src/main/webapp/mocks/user_mock.browserify.js
+++ /dev/null
@@ -1,48 +0,0 @@
-var faker = require('faker');
-class UserMock {
-  constructor(data = {}) {
-    let defaults = {
-      name: faker.name.firstName(),
-      admin: true,
-      profileUpdatable: true,
-      internalPasswordDisabled: false,
-      canManage: true,
-      canDeploy: true,
-      preventAnonAccessBuild: true
-    };
-    data = angular.extend(defaults, data);
-
-    angular.copy(data, this);
-  }
-
-  mockUserMethods() {
-    inject((User, $q) => {
-      let user = new User(this);
-      spyOn(User, 'getCurrent').and.returnValue(user);
-      spyOn(User, 'loadUser').and.returnValue($q.when(user));
-    });
-  }
-  getUserObj() {
-    let user;
-    inject((User) => {
-      user = new User(this);
-    });    
-    return user;
-  }
-
-  static regularUser(data) {
-    data = data || {};
-    data.admin = false;
-    return new UserMock(data);
-  };
-  static guest() {
-    return new UserMock({name: 'anonymous', admin: false, canManage: false, canDeploy: false, preventAnonAccessBuild: true});
-  };
-  static mockCurrentUser() {
-    inject(($httpBackend, RESOURCE) => {
-      $httpBackend.whenGET(RESOURCE.API_URL + RESOURCE.AUTH_CURRENT).respond(this.guest());
-    });
-  }
-}
-
-export default UserMock;
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/package.json b/web/angular-web/src/main/webapp/package.json
deleted file mode 100644
index 54dc8d7..0000000
--- a/web/angular-web/src/main/webapp/package.json
+++ /dev/null
@@ -1,69 +0,0 @@
-{
-  "name": "Webapp",
-  "version": "1.0.0",
-  "description": "AngularJS Application",
-  "main": "app.js",
-  "scripts": {
-    "setup": "bower install",
-    "build": "gulp"
-  },
-  "repository": {
-    "type": "git",
-    "url": ""
-  },
-  "author": "",
-  "license": "ISC",
-  "bugs": {
-    "url": ""
-  },
-  "homepage": "",
-  "dependencies": {
-    "bower": "1.6.2",
-    "bower-art-resolver": "2.0.2",
-    "gulp": "3.8.11",
-    "gulp-install": "^0.2.0",
-    "gulp-ng-annotate": "0.5.2",
-    "gulp-sourcemaps": "1.3.0",
-    "jquery": "2.1.4",
-    "jquery-ui": "1.10.5",
-    "raw-loader": "0.5.1",
-    "run-sequence": "1.0.2"
-  },
-  "devDependencies": {
-    "babel-core": "^4.7.12",
-    "babel-loader": "^4.1.0",
-    "babelify": "^6.1.2",
-    "brfs": "^1.4.0",
-    "browser-sync": "^2.5.3",
-    "browserify": "^10.0.0",
-    "browserify-shim": "^3.8.6",
-    "faker": "^2.1.2",
-    "gulp-autoprefixer": "^2.3.0",
-    "gulp-concat": "^2.4.3",
-    "gulp-html2js": "^0.2.0",
-    "gulp-iconfont": "^1.0.0",
-    "gulp-iconfont-css": "0.0.9",
-    "gulp-less": "^3.0.1",
-    "gulp-minify-css": "^1.2.0",
-    "gulp-rev-all": "^0.8.21",
-    "gulp-rev-replace": "^0.4.2",
-    "gulp-rimraf": "^0.1.1",
-    "gulp-sourcemaps": "^1.3.0",
-    "gulp-uglify": "^1.2.0",
-    "gulp-util": "*",
-    "gulp-webpack": "^1.3.0",
-    "gulp-webpack-build": "0.13.1",
-    "gulp-webserver": "^0.9.0",
-    "karma": "0.12.31",
-    "karma-browserify": "^4.1.2",
-    "karma-browserstack-launcher": "^0.1.2",
-    "karma-chrome-launcher": "0.1.7",
-    "karma-jasmine": "0.3.5",
-    "karma-junit-reporter": "^0.3.1",
-    "run-sequence": "^1.0.2",
-    "stream-combiner2": "^1.0.2",
-    "webpack": "^1.7.3",
-    "webpack-core": "^0.5.0",
-    "gulp-rev-napkin": "~0.1.0"
-  }
-}
diff --git a/web/angular-web/src/main/webapp/specs/dao/Config_descriptor_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/Config_descriptor_dao.spec.js
deleted file mode 100644
index a92ecbb..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/Config_descriptor_dao.spec.js
+++ /dev/null
@@ -1,26 +0,0 @@
-describe('unit test:configDescriptorDao', function () {
-
-    var configDescriptorDao;
-    var RESOURCE;
-    var server;
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        configDescriptorDao = $injector.get('ConfigDescriptorDao').getInstance();
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('configDescriptorDao should return a resource object', function () {
-        expect(configDescriptorDao.name).toBe('Resource');
-    });
-
-    it('configDescriptorDao send an PUT request', function () {
-        server.expectPUT(RESOURCE.API_URL + RESOURCE.CONFIG_DESCRIPTOR).respond(200);
-        configDescriptorDao.update();
-        server.flush();
-    });
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/admin_security_general_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/admin_security_general_dao.spec.js
deleted file mode 100644
index be02c7d..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/admin_security_general_dao.spec.js
+++ /dev/null
@@ -1,53 +0,0 @@
-describe('Unit: admin security general dao', function () {
-
-    var adminSecurityGeneralDao;
-    var RESOURCE;
-    var server;
-
-    var securityConfigMock = {
-
-        "anonAccessEnabled": false,
-        "anonAccessToBuildInfosDisabled": "true",
-        "hideUnauthorizedResources": "false",
-        "passwordSettings": {
-            "encryptionPolicy": "SUPPORTED"
-        }
-    };
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        adminSecurityGeneralDao = $injector.get('AdminSecurityGeneralDao');
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-
-    it('passwordEncryptionDao should return a resource object', function () {
-        //expect(adminSecurityGeneralDao.name).toBe('Resource')
-    });
-
-    it('sould send an update request with the updated object', function () {
-        server.expectPUT(RESOURCE.API_URL + RESOURCE.SECURITY_CONFIG, securityConfigMock).respond(200);
-        adminSecurityGeneralDao.update(securityConfigMock);
-        server.flush();
-    });
-
-    it('hit a server with a get request', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.SECURITY_CONFIG).respond(200);
-        adminSecurityGeneralDao.get();
-        server.flush();
-    });
-
-    it('should post new security config mock', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.SECURITY_CONFIG, securityConfigMock).respond(200);
-        var SecurityGeneraData = new adminSecurityGeneralDao(securityConfigMock);
-        SecurityGeneraData.$save();
-        server.flush();
-    });
-
-
-})
-;
diff --git a/web/angular-web/src/main/webapp/specs/dao/artifact/artifact_actions_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/artifact/artifact_actions_dao.spec.js
deleted file mode 100644
index 6d1990e..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/artifact/artifact_actions_dao.spec.js
+++ /dev/null
@@ -1,35 +0,0 @@
-describe('unit test:artifact actions dao', function () {
-
-    var artifactActionsDao;
-    var RESOURCE;
-    var server;
-    var artifactData = {"repoKey": "libs-release-local", "path": "c/d.bin"};
-    var artifactParams = {};
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function (ArtifactActionsDao, _RESOURCE_, _$httpBackend_) {
-        artifactActionsDao = ArtifactActionsDao;
-        RESOURCE = _RESOURCE_;
-        server = _$httpBackend_;
-    }));
-    afterEach(function() {
-        server.flush();
-    });
-
-    //// Generic perform function:
-    it('perform should send the correct POST request', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.ARTIFACT_ACTIONS + '/someAction?searchKey=searchValue').respond(200);
-        artifactParams.action = 'someAction';
-        artifactParams.searchKey = 'searchValue';
-        artifactActionsDao.perform(artifactParams, artifactData);
-    });
-    it('perform should send the correct POST request for dry run', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.ARTIFACT_ACTIONS + '/someAction?searchKey=searchValue').respond(200);
-        artifactParams.action = 'someAction';
-        artifactParams.searchKey = 'searchValue';
-        artifactActionsDao.dryRun(artifactParams, artifactData);
-    });
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/artifact/artifact_builds_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/artifact/artifact_builds_dao.spec.js
deleted file mode 100644
index c126b48..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/artifact/artifact_builds_dao.spec.js
+++ /dev/null
@@ -1,30 +0,0 @@
-describe('unit test:artifact builds dao', function () {
-
-    var artifactBuildsDao;
-    var RESOURCE;
-    var server;
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function (ArtifactBuildsDao, _RESOURCE_, _$httpBackend_) {
-        artifactBuildsDao = ArtifactBuildsDao.getInstance();
-        RESOURCE = _RESOURCE_;
-        server = _$httpBackend_;
-    }));
-
-    it('artifactBuildsDao should return a resource object', function () {
-        expect(artifactBuildsDao.name).toBe('Resource');
-    });
-
-    it('query should send the correct GET request', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.ARTIFACT_BUILDS + '?repoKey=libs-release-local&path=c/d.bin').respond({});
-        artifactBuildsDao.query({"repoKey": "libs-release-local", "path": "c/d.bin"});
-    });
-
-    it('getJSON should send the correct GET request', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.ARTIFACT_BUILDS + '/json/123').respond({});
-        artifactBuildsDao.getJson({buildId: '123'});
-    });
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/artifact/artifact_general_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/artifact/artifact_general_dao.spec.js
deleted file mode 100644
index 35b599c..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/artifact/artifact_general_dao.spec.js
+++ /dev/null
@@ -1,30 +0,0 @@
-describe('unit test:artifact general dao', function () {
-
-    var artifactGeneralDao;
-    var RESOURCE;
-    var generalTabDataMock = {"type": "repository", "repoKey": "libs-release-local", "path": ""}
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function (ArtifactGeneralDao, _RESOURCE_, $httpBackend) {
-        artifactGeneralDao = ArtifactGeneralDao;
-        RESOURCE = _RESOURCE_;
-        server = $httpBackend;
-    }));
-
-    afterEach(function() {
-        server.flush();
-    });
-
-    it('fetch should send a put request to server', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.ARTIFACT_GENERAL).respond(200);
-        artifactGeneralDao.fetch(generalTabDataMock);
-    });
-
-    it('bintray should send a post request to server', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.ARTIFACT_GENERAL_BINTRAY + '?$no_spinner=true&sha1=asdf').respond(200);
-        artifactGeneralDao.bintray({sha1: 'asdf'});
-    });    
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/artifact/artifact_permissions_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/artifact/artifact_permissions_dao.spec.js
deleted file mode 100644
index 45e9c19..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/artifact/artifact_permissions_dao.spec.js
+++ /dev/null
@@ -1,27 +0,0 @@
-describe('unit test:general tab dao', function () {
-
-    var artifactPermissionsDao;
-    var RESOURCE;
-    var mockPermissionsData = {pagingData: [{principal: 'adam', type: 'user', permission: {'delete': true, 'deploy': true, 'annotate': true, 'read': true}}], totalItems: 4};
-    var permissionsParams = {"type": "repository", "repoKey": "libs-release-local", "path": "c.bin", pageNum: 1, numOfRows: 4, orderBy: 'principal', direction: 'asc'};
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function (ArtifactPermissionsDao, _RESOURCE_, $httpBackend) {
-        artifactPermissionsDao = ArtifactPermissionsDao.getInstance();
-        RESOURCE = _RESOURCE_;
-        server = $httpBackend;
-    }));
-
-    afterEach(function() {
-        server.flush();
-    });
-
-    it('query should send a GET request', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.ARTIFACT_PERMISSIONS + "?direction=asc&numOfRows=4&orderBy=principal&pageNum=1&path=c.bin&repoKey=libs-release-local&type=repository")
-                .respond(mockPermissionsData);
-        artifactPermissionsDao.query(permissionsParams);
-    });
-});
diff --git a/web/angular-web/src/main/webapp/specs/dao/artifact/artifact_property_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/artifact/artifact_property_dao.spec.js
deleted file mode 100644
index 7b358d6..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/artifact/artifact_property_dao.spec.js
+++ /dev/null
@@ -1,39 +0,0 @@
-describe('unit test:artifact property dao', function () {
-
-    var artifactPropertyDao;
-    var RESOURCE;
-    var propertyNameParams = {name: 'name'};
-    var propertyArtifactParams = {"repoKey": "libs-release-local", "path": "file.bin"};
-    var propertyData = {key: 'value'};
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function (ArtifactPropertyDao, _RESOURCE_, $httpBackend) {
-        artifactPropertyDao = ArtifactPropertyDao.getInstance();
-        RESOURCE = _RESOURCE_;
-        server = $httpBackend;
-    }));
-
-    afterEach(function() {
-        server.flush();
-    });
-
-    it('get should send a GET request to server', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.ARTIFACT_PROPERTIES + '/name').respond(200);
-        artifactPropertyDao.get(propertyNameParams);
-    });
-    it('query should send a POST request to server', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.ARTIFACT_PROPERTIES).respond(200);
-        artifactPropertyDao.query();
-    });
-    it('update should send a PUT request to server', function () {
-        server.expectPUT(RESOURCE.API_URL + RESOURCE.ARTIFACT_PROPERTIES + '?path=file.bin&repoKey=libs-release-local').respond(200);
-        artifactPropertyDao.update(propertyArtifactParams, propertyData);
-    });
-    it('delete should send a DELETE request to server', function () {
-        server.expectDELETE(RESOURCE.API_URL + RESOURCE.ARTIFACT_PROPERTIES + '/name').respond(200);
-        artifactPropertyDao.delete(propertyNameParams);
-    });
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/artifact/artifact_views_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/artifact/artifact_views_dao.spec.js
deleted file mode 100644
index 0beb4ed..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/artifact/artifact_views_dao.spec.js
+++ /dev/null
@@ -1,29 +0,0 @@
-describe('unit test:pom view tab dao', function () {
-
-    var artifactViewsDao;
-    var RESOURCE;
-    var pomViewTabDataMock = {
-        "view":"pom",
-        "path": "DecodedBase64/DecodedBase64/DecodedBase64/DecodedBase64-DecodedBase64.pom",
-        "repoKey": "ext-releases-local"
-    };
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function (ArtifactViewsDao, _RESOURCE_, $httpBackend) {
-        artifactViewsDao = ArtifactViewsDao;
-        RESOURCE = _RESOURCE_;
-        server = $httpBackend;
-    }));
-
-    afterEach(function () {
-        server.flush();
-    });
-
-    it('fetch should send a put request to serve', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.VIEWS+"/pom").respond(200);
-        artifactViewsDao.fetch(pomViewTabDataMock);
-    });
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/artifact/artifact_viewsource_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/artifact/artifact_viewsource_dao.spec.js
deleted file mode 100644
index 60d3bd2..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/artifact/artifact_viewsource_dao.spec.js
+++ /dev/null
@@ -1,23 +0,0 @@
-describe('unit test:tree browser tab dao', function () {
-
-    var viewSourceDao;
-    var RESOURCE;
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function (ArtifactViewSourceDao, _RESOURCE_, $httpBackend) {
-        viewSourceDao = ArtifactViewSourceDao.getInstance();
-        RESOURCE = _RESOURCE_;
-        server = $httpBackend;
-    }));
-    afterEach(function() {
-        server.flush();
-    });
-
-    it('fetch should send a POST request to server', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.ARTIFACT_VIEW_SOURCE).respond(200);
-        viewSourceDao.fetch({"type": "file", "repoKey": "libs-release-local", "path": ""});
-    })
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/artifact/artifact_watches_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/artifact/artifact_watches_dao.spec.js
deleted file mode 100644
index dcbc18e..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/artifact/artifact_watches_dao.spec.js
+++ /dev/null
@@ -1,32 +0,0 @@
-describe('unit test:artifact watches dao', function () {
-
-    var artifactWatchesDao;
-    var RESOURCE;
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function (ArtifactWatchesDao, _RESOURCE_, $httpBackend) {
-        artifactWatchesDao = ArtifactWatchesDao;
-        RESOURCE = _RESOURCE_;
-        server = $httpBackend;
-    }));
-
-    afterEach(function() {
-        server.flush();
-    });
-
-    it('query should send a GET request to server', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.ARTIFACT_WATCHES+ '?path=file.bin&repoKey=libs-release-local').respond(200);
-        artifactWatchesDao.query({"repoKey": "libs-release-local", "path": "file.bin"});
-    });
-    it('delete should send a DELETE request to server', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.ARTIFACT_WATCHES + '/remove').respond(200);
-        artifactWatchesDao.delete({watches:[{"repoKey": "libs-release-local", "path": "file.bin", name: 'name'}]});
-    });
-    it('status should send a GET request to server', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.ARTIFACT_WATCHES + '/status?path=file.bin&repoKey=libs-release-local').respond(200);
-        artifactWatchesDao.status({"repoKey": "libs-release-local", "path": "file.bin"});
-    });
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/artifact/tree_browser_dao.spec.browserify.js b/web/angular-web/src/main/webapp/specs/dao/artifact/tree_browser_dao.spec.browserify.js
deleted file mode 100644
index 920c1ab..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/artifact/tree_browser_dao.spec.browserify.js
+++ /dev/null
@@ -1,130 +0,0 @@
-'use strict';
-var TreeNodeMock = require('../../../mocks/tree_node_mock.browserify.js');
-var mockStorage = require('../../../mocks/artifactory_storage_mock.browserify.js');
-describe('unit test:tree browser dao', function () {
-
-    var treeBrowserDao;
-    var RESOURCE;
-    var httpBackend;
-    var children;
-    var subchildren;
-    var archive;
-    mockStorage();
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
- 
-    beforeEach(inject(function (TreeBrowserDao, _RESOURCE_, $httpBackend) {
-        treeBrowserDao = TreeBrowserDao;
-        RESOURCE = _RESOURCE_;
-        httpBackend = $httpBackend;
-        children = [
-                TreeNodeMock.folder({text: 'folder', repoKey: 'repo1', path: 'folder'}),
-                TreeNodeMock.file({text: 'file', repoKey: 'repo1', path: 'file'}),
-                TreeNodeMock.archive({text: 'archive', repoKey: 'repo1', path: 'archive'})
-            ];
-        subchildren = [
-                TreeNodeMock.file({text: 'file1', repoKey: 'repo1', path: 'folder/file1'}),
-                TreeNodeMock.file({text: 'file2', repoKey: 'repo1', path: 'folder/file2'})
-            ];
-        archive = [
-                TreeNodeMock.folder({text: 'folder', repoKey: 'repo1', archivePath: 'archive!/folder', path: 'archive/folder', children:[
-                    TreeNodeMock.file({text: 'file1', repoKey: 'repo1', archivePath: 'archive!/folder/file1', path: 'archive/folder/file1'}),
-                    TreeNodeMock.file({text: 'file2', repoKey: 'repo1', archivePath: 'archive!/folder/file2', path: 'archive/folder/file2'})
-                ]})
-            ];
-    }));
-
-    function flush() {
-        httpBackend.flush();
-    }
-
-    describe('compactFolders', function() {
-        it('should allow to get compactFolders', function() {
-            expect(treeBrowserDao.getCompactFolders()).toBe(true);
-        });
-        it('should allow to set compactFolders', function() {
-            treeBrowserDao.setCompactFolders(false);
-            expect(treeBrowserDao.getCompactFolders()).toBe(false);
-        });
-    });
-
-    describe('getRoots', function() {
-        it('should send a POST request and return an array of TreeNodes', function (done) {
-            TreeNodeMock.expectGetRoots();
-            treeBrowserDao.getRoots()
-            .then(function(roots) {
-                expect(roots.length).toBe(2);
-                expect(roots[0].constructor.name).toBe('TreeNode');
-                done();
-            });
-            flush();
-        });
-        it('should send a POST request with compacted = true', function (done) {
-            TreeNodeMock.expectGetRoots(false);
-            treeBrowserDao.setCompactFolders(false);
-            treeBrowserDao.getRoots()
-            .then(function(roots) {
-                expect(roots.length).toBe(2);
-                expect(roots[0].constructor.name).toBe('TreeNode');
-                done();
-            });
-            flush();
-        });
-        it('should return the cached promise if called twice', function () {
-            TreeNodeMock.expectGetRoots();
-            var first = treeBrowserDao.getRoots();
-            var second = treeBrowserDao.getRoots();
-            expect(second).toBe(first);
-        });
-
-        it('should make another POST request if force = true', function () {
-            TreeNodeMock.expectGetRoots();
-            TreeNodeMock.expectGetRoots();
-            var first = treeBrowserDao.getRoots();
-            var second = treeBrowserDao.getRoots(true);
-            expect(second).not.toBe(first);
-        });
-
-        it('should make another POST request if invalidating roots', function () {
-            TreeNodeMock.expectGetRoots();
-            TreeNodeMock.expectGetRoots();
-            var first = treeBrowserDao.getRoots();
-            treeBrowserDao.invalidateRoots();
-            var second = treeBrowserDao.getRoots();
-            expect(second).not.toBe(first);
-        });
-    });
-
-    describe('findNodeByFullPath', function() {
-        it('should allow to load a path to a regular file / folder', function(done) {
-            TreeNodeMock.expectGetRoots();
-            TreeNodeMock.expectGetChildren(children);
-            TreeNodeMock.expectGetChildren(subchildren);
-            treeBrowserDao.findNodeByFullPath('repo1/folder/file1')
-                .then((node) => {
-                    expect(node.type).toEqual('file');
-                    expect(node.text).toEqual('file1');
-                    expect(node.parent.text).toEqual('folder');
-                    expect(node.parent.parent.text).toEqual('repo1');
-                    done();
-                });
-            flush();
-        });
-        it('should allow to load a path to a file inside an archive', function(done) {
-            TreeNodeMock.expectGetRoots();
-            TreeNodeMock.expectGetChildren(children);
-            TreeNodeMock.expectGetChildren(archive);
-            treeBrowserDao.findNodeByFullPath('repo1/archive!/folder/file1')
-                .then((node) => {                    
-                    expect(node.type).toEqual('file');
-                    expect(node.text).toEqual('file1');
-                    expect(node.parent.text).toEqual('folder');
-                    expect(node.parent.parent.text).toEqual('archive');
-                    expect(node.parent.parent.parent.text).toEqual('repo1');
-                    done();
-                });
-            flush();
-        });
-    });
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/artifact/tree_node.spec.browserify.js b/web/angular-web/src/main/webapp/specs/dao/artifact/tree_node.spec.browserify.js
deleted file mode 100644
index 7f026ef..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/artifact/tree_node.spec.browserify.js
+++ /dev/null
@@ -1,147 +0,0 @@
-'use strict';
-var TreeNodeMock = require('../../../mocks/tree_node_mock.browserify.js');
-var mockStorage = require('../../../mocks/artifactory_storage_mock.browserify.js');
-describe('unit test:tree node dao', function () {
-
-    var node;
-    var leafnode;
-    var RESOURCE;
-    var httpBackend;
-    var treeBrowserDao;
-    var TreeNode;
-    var $rootScope;
-    mockStorage();
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
- 
-    beforeEach(inject(function (TreeBrowserDao, _RESOURCE_, $httpBackend, _TreeNode_, _$rootScope_) {
-        RESOURCE = _RESOURCE_;
-        httpBackend = $httpBackend;
-        TreeNode = _TreeNode_;
-        $rootScope = _$rootScope_;
-        node = new TreeNode(TreeNodeMock.folder());
-        leafnode = new TreeNode(TreeNodeMock.file());
-        treeBrowserDao = TreeBrowserDao;
-        spyOn(treeBrowserDao, 'invalidateRoots').and.callThrough();
-    }));
-
-    function flush() {
-        httpBackend.flush();
-    }
-
-    describe('data transform', function() {
-        it('should fill in fullpath for repo', function() {
-            node = new TreeNode(TreeNodeMock.repo('repository'));
-            expect(node.fullpath).toEqual('repository');
-        });
-        it('should fill in fullpath for file / folder', function() {
-            node = new TreeNode(TreeNodeMock({repoKey: 'repo', path: 'path/c.bin'}));
-            expect(node.fullpath).toEqual('repo/path/c.bin');
-        });
-        it('should fill in fullpath for archive', function() {
-            node = new TreeNode(TreeNodeMock({repoKey: 'repo', path: 'archive.jar/c.bin', archivePath: 'archive.jar'}));
-            expect(node.fullpath).toEqual('repo/archive.jar!/c.bin');
-        });
-        it('should fill in hasChild for a node with children', function() {
-            node = new TreeNode(TreeNodeMock().withChildren(3));
-            expect(node.hasChild).toBe(true);
-        });
-        it('should not fill in hasChild for a node with no children', function() {
-            node = new TreeNode(TreeNodeMock());
-            expect(node.hasChild).toBeFalsy();
-        });
-    });
-
-    it('getChildren for leaf node', function(done) {
-        leafnode.getChildren()
-        .then((children) => {
-            expect(children).toBeNull();
-            done();
-        });
-        $rootScope.$digest();
-    });
-    describe('getChildren', function() {
-        beforeEach(function() {
-            node.expectGetChildren(TreeNodeMock.array(2));
-        });
-        it('should send a POST request and return an array of TreeNodes', function (done) {
-            node.getChildren()
-            .then(function(children) {
-                expect(children.length).toBe(2);
-                expect(children[0].constructor.name).toBe('TreeNode');
-                expect(children[0].parent).toBe(node);
-                done();
-            });
-            flush();
-        });
-
-        it('should return the cached promise if called twice', function () {
-            var first = node.getChildren();
-            var second = node.getChildren();
-            expect(second).toBe(first);
-        });
-
-        it('should make another POST request if force = true', function () {
-            node.expectGetChildren(TreeNodeMock.array(2));
-            var first = node.getChildren();
-            var second = node.getChildren(true);
-            expect(second).not.toBe(first);
-        });
-
-        it('should make another POST request if invalidating children', function () {
-            node.expectGetChildren(TreeNodeMock.array(2));
-            var first = node.getChildren();
-            node.invalidateChildren();
-            var second = node.getChildren();
-            expect(second).not.toBe(first);
-        });
-        it('should allow to invalidate parent', function (done) {
-            node.getChildren()
-            .then(function(children) {
-                children[0].invalidateParent();
-                node.expectGetChildren(TreeNodeMock.array(2));
-                node.getChildren();
-                done();
-            });
-            flush();
-        });    
-    });
-    describe('invalidate parents', function() {
-        it('should allow to invalidate parent of root', function () {
-            node.invalidateParent();
-            expect(treeBrowserDao.invalidateRoots).toHaveBeenCalled();
-        });    
-    });
-    describe('load', function() {
-        it('should send a POST request', function(done) {
-            var loadedNodeData = TreeNodeMock.data();
-            node.expectLoad(loadedNodeData);
-            node.load().then(function(result) {
-                expect(result).toBe(node);
-                expect(node.tabs).toEqual(loadedNodeData[0].tabs);
-                expect(node.actions).toEqual([{icon: "icon-simple-browser",name: "NativeBrowser",title: "Native Browser"}]);
-                done();
-            });
-            flush();
-        });
-        it('should not send a POST request if tabs already exist', function() {
-            node.tabs = [];
-            node.load().then(function(result) {
-                expect(result).toBe(node);
-                expect(node.tabs).toEqual([]);
-                expect(node.actions).not.toBeDefined();
-            });
-        });
-        it('should not have NativeBrowser action in context menu for files', function(done) {
-            var loadedNodeData = TreeNodeMock.data();
-            leafnode.expectLoad(loadedNodeData);
-            leafnode.load().then(function(result) {
-                expect(leafnode.actions).toEqual([]);
-                done();
-            });
-            flush();
-        });
-    });
-
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/artifactory_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/artifactory_dao.spec.js
deleted file mode 100644
index 4e4b4a2..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/artifactory_dao.spec.js
+++ /dev/null
@@ -1,110 +0,0 @@
-describe('unit test:artifactory dao', function () {
-    var artifactoryDao;
-    var RESOURCE;
-    var $resource;
-    var server;
-    var artifactoryNotificationsInterceptor;
-    var expectedActions;
-    function initExpectedActions() {
-        expectedActions = {
-            'update': {
-                method: 'PUT',
-                interceptor: artifactoryNotificationsInterceptor
-            },
-            'delete': {
-                method: 'DELETE',
-                interceptor: artifactoryNotificationsInterceptor
-            },
-            'fetch': {
-                method: 'POST',
-            },
-            'save': {
-                method: 'POST',
-                interceptor: artifactoryNotificationsInterceptor
-            }
-        };
-    };
-    // inject the DAO module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function (ArtifactoryDao, _$resource_, _RESOURCE_, _$httpBackend_, _artifactoryNotificationsInterceptor_) {
-        artifactoryDao = ArtifactoryDao;
-        RESOURCE = _RESOURCE_;
-        server = _$httpBackend_;
-        artifactoryNotificationsInterceptor = _artifactoryNotificationsInterceptor_;
-        $resource = spyOn(ArtifactoryDao, '$resource').and.callThrough();
-        initExpectedActions();
-    }));
-
-    it('should return a $resource', function() {
-        expect(artifactoryDao.getInstance().name).toBe('Resource');
-    });
-    //
-    it('should have default custom actions', function() {
-        artifactoryDao.getInstance();
-        expect($resource).toHaveBeenCalledWith(null, null, expectedActions);
-    });
-
-    it('should allow to set URL', function() {
-        artifactoryDao.setUrl('my url')
-            .getInstance();
-        expect($resource).toHaveBeenCalledWith('my url', null, expectedActions);
-    });
-
-    it('should allow to set relative path', function() {
-        artifactoryDao.setPath('/mypath')
-            .getInstance();
-        expect($resource).toHaveBeenCalledWith(RESOURCE.API_URL + '/mypath', null, expectedActions);
-    });
-    describe('custom actions', function() {
-        it('should allow to add custom actions', function () {
-            artifactoryDao.setCustomActions({action: {}})
-                .getInstance();
-            expectedActions.action = {};
-            expect($resource).toHaveBeenCalledWith(null, null, expectedActions);
-        });
-        it('should allow to override existing custom actions', function () {
-            artifactoryDao.setCustomActions({update: {method: 'POST'}})
-                .getInstance();
-            expectedActions.update.method = 'POST';
-            expect($resource).toHaveBeenCalledWith(null, null, expectedActions);
-        });
-        it('should allow to set relative path on actions', function() {
-            artifactoryDao.setCustomActions({action: {path: '/actionpath'}})
-                .getInstance();
-            expectedActions.action = {url: RESOURCE.API_URL + '/actionpath'};
-            expect($resource).toHaveBeenCalledWith(null, null, expectedActions);
-        });
-        it('should allow to add notifications interceptor on actions', function() {
-            artifactoryDao.setCustomActions({action: {notifications: true}})
-                .getInstance();
-            expectedActions.action = {interceptor: artifactoryNotificationsInterceptor};
-            expect($resource).toHaveBeenCalledWith(null, null, expectedActions);
-        });
-    });
-    describe('setDefaults', function() {
-        it('should allow to set default method for custom actions', function () {
-            artifactoryDao.setDefaults({method: 'POST'})
-                .setCustomActions({action: {}})
-                .getInstance();
-            expectedActions.action = {method: 'POST'};
-            expect($resource).toHaveBeenCalledWith(null, null, expectedActions);
-        });
-        it('should allow to override default method in custom action', function () {
-            artifactoryDao.setDefaults({method: 'POST'})
-                .setCustomActions({action: {method: 'PUT'}})
-                .getInstance();
-            expectedActions.action = {method: 'PUT'};
-            expect($resource).toHaveBeenCalledWith(null, null, expectedActions);
-        });
-    });
-    describe('extendPrototype', function() {
-        it('should allow to extend the prototype of the resource', function () {
-            var method = function() {};
-            var resource = artifactoryDao.extendPrototype({method: method})
-                .getInstance();
-            expect(resource.prototype.method).toBe(method);
-        });
-    });
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/backup_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/backup_dao.spec.js
deleted file mode 100644
index e4550ca..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/backup_dao.spec.js
+++ /dev/null
@@ -1,46 +0,0 @@
-describe('unit test:backup dao', function () {
-
-    var backupDao;
-    var RESOURCE;
-    var server;
-    var groupMock = {
-        "key": "hhhh",
-        "enabled": true,
-        "cronExp": "hhhh"
-    };
-    var queryParams = "?hhhh&&cronExp=hhhh&enabled=true";
-
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        backupDao = $injector.get('BackupDao');
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('groupDao should return a resource object', function () {
-        expect(backupDao.name).toBe('Resource');
-    });
-
-    it('send an update request group dao', function () {
-        server.expectPUT(RESOURCE.API_URL + RESOURCE.BACKUP + '/hhhh' , groupMock).respond(200);
-        backupDao.update(groupMock);
-        server.flush();
-    });
-
-    it('send an save request  with group dao', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.BACKUP, groupMock).respond(200);
-        backupDao.save(groupMock);
-        server.flush();
-    });
-
-    it('send a delete request group dao', function () {
-        server.expectDELETE(RESOURCE.API_URL + RESOURCE.BACKUP + '/hhhh').respond(200);
-        backupDao.delete({key: 'hhhh'});
-        server.flush();
-    });
-
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/bintray_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/bintray_dao.spec.js
deleted file mode 100644
index 9943c40..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/bintray_dao.spec.js
+++ /dev/null
@@ -1,46 +0,0 @@
-describe('unit test:bintray dao', function () {
-
-    var bintrayDao;
-    var RESOURCE;
-    var server;
-    var bintrayMock = {
-        "userName": "chenk",
-        "apiKey": "165af2caacac2a636038ac7609eb7215170d946d",
-        "fileUploadLimit": 0,
-        "bintrayAuth": "chenk:165af2caacac2a636038ac7609eb7215170d946d"
-    };
-
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        bintrayDao = $injector.get('BintrayDao').getInstance();
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('bintrayDao should return a resource object', function () {
-        expect(bintrayDao.name).toBe('Resource');
-    });
-
-    it('bintrayDao send an put request', function () {
-        server.expectPUT(RESOURCE.API_URL + RESOURCE.BINTRAY_SETTING).respond(200);
-        bintrayDao.update(bintrayMock);
-        server.flush();
-    });
-    it('bintrayDao send an post request', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.BINTRAY_SETTING).respond(200);
-        var obj = new bintrayDao(bintrayMock);
-        obj.$save();
-        server.flush();
-    });
-
-    it('bintrayDao send an get request', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.BINTRAY_SETTING).respond(200);
-        bintrayDao.get();
-        server.flush();
-    });
-
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/black_duck_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/black_duck_dao.spec.js
deleted file mode 100644
index 91638d0..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/black_duck_dao.spec.js
+++ /dev/null
@@ -1,44 +0,0 @@
-describe('unit test:blackDuck dao', function () {
-
-    var blackDuck;
-    var RESOURCE;
-    var server;
-    var blackDuckMock = {
-        enableIntegration: true, "serverUri": "https://jfrogcc.blackducksoftware.com/"
-        , "username": "jfrog", "password": "Msmpn6wpAfFDZ7jxteAMyDP", "connectionTimeoutMillis": 20000
-    };
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        blackDuck = $injector.get('BlackDuckDao').getInstance();
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('groupDao should return a resource object', function () {
-        expect(blackDuck.name).toBe('Resource');
-    });
-
-    it('blackDuckDao send a put request to serve', function () {
-        server.expectPUT(RESOURCE.API_URL + RESOURCE.BLACK_DUCK).respond(200);
-        blackDuck.update(blackDuckMock);
-        server.flush();
-    });
-
-    it('blackDuckDao send a post request to serve', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.BLACK_DUCK).respond(200);
-        var obj = new blackDuck(blackDuckMock);
-        obj.$save();
-        server.flush();
-    });
-
-    it('blackDuckDao send a get request t', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.BLACK_DUCK).respond(200);
-        blackDuck.get();
-        server.flush();
-    });
-
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/builds_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/builds_dao.spec.js
deleted file mode 100644
index a0e6bd3..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/builds_dao.spec.js
+++ /dev/null
@@ -1,40 +0,0 @@
-describe('unit test:builds dao', function () {
-
-    var buildsDao;
-    var RESOURCE;
-    var server;
-    var buildsMock = {
-        pagingData: [
-            {name: 'asdf', lastBuildTime: '12.12.14'},
-            {name: 'alf', lastBuildTime: '12.11.13'},
-            {name: 'gradle', lastBuildTime: '12.10.12'},
-        ],
-        totalItems: 30
-    }
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        buildsDao = $injector.get('BuildsDao');
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('buildsDao should return a resource object', function () {
-        expect(buildsDao.name).toBe('Resource');
-    });
-
-    it('send a get request with builds dao ', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.BUILDS).respond(200);
-        buildsDao.get();
-        server.flush();
-    });
-    it('send a getHistory request with builds dao ', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.BUILDS + '/buildname').respond(200);
-        buildsDao.getData({name: 'buildname'});
-        server.flush();
-    });
-
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/checksums_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/checksums_dao.spec.js
deleted file mode 100644
index ba9b462..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/checksums_dao.spec.js
+++ /dev/null
@@ -1,31 +0,0 @@
-describe('unit test:checksums dao', function () {
-
-    var checksumsDao;
-    var RESOURCE;
-    var server;
-    var checksumsMock = {
-        repoKey: 'libs-release-local',
-        path: 'aopalliance/aopalliance/1.0/aopalliance-1.0.jar'
-    };
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        checksumsDao = $injector.get('ChecksumsDao');
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('checksumsDao should return a resource object', function () {
-        expect(checksumsDao.name).toBe('Resource');
-    });
-
-    it('send a fix request to checksums dao', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.CHECKSUMS + '/fix').respond(200);
-        checksumsDao.fix({}, checksumsMock);
-        server.flush();
-    });
-
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/cron_time_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/cron_time_dao.spec.js
deleted file mode 100644
index 0369221..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/cron_time_dao.spec.js
+++ /dev/null
@@ -1,30 +0,0 @@
-describe('unit test:crontime dao', function () {
-
-    var cornTimeDao;
-    var RESOURCE;
-    var server;
-    var cornMock = {
-        "cron": "0 23 5 * * ?"
-    };
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        cronTimeDao = $injector.get('CronTimeDao').getInstance();
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('cornTimeDao should return a resource object', function () {
-      //  console.log(cornTimeDao);
-       expect(cronTimeDao.name).toBe('Resource');
-    });
-    //
-    it('should send a get request to return an cornTimeDao', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.CRON_TIME).respond(200);
-        cronTimeDao.get();
-        server.flush();
-    })
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/crowd_integration_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/crowd_integration_dao.spec.js
deleted file mode 100644
index fe11784..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/crowd_integration_dao.spec.js
+++ /dev/null
@@ -1,48 +0,0 @@
-describe('unit test:crowd integration dao', function () {
-
-    var crowdIntegrationDao;
-    var RESOURCE;
-    var server;
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function (CrowdIntegrationDao, _RESOURCE_, _$httpBackend_) {
-        crowdIntegrationDao = CrowdIntegrationDao;
-        RESOURCE = _RESOURCE_;
-        server = _$httpBackend_;
-    }));
-
-    it('artifactBuildsDao should return a resource object', function () {
-        expect(crowdIntegrationDao.name).toBe('Resource');
-    });
-
-    it('query should send the correct GET request', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.CROWD + '/test').respond({});
-        crowdIntegrationDao.test({
-            "enableIntegration": true,
-            "serverUrl": "http://localhost:8095/crowd",
-            "applicationName": "artifactory",
-            "password": "password",
-            "sessionValidationInterval": 0,
-            "useDefaultProxy": false,
-            "noAutoUserCreation": true,
-            "directAuthentication": false
-        });
-    });
-
-    it('refresh data should send the correct GET request', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.CROWD + '/refresh/chenk').respond({});
-        crowdIntegrationDao.refresh({
-            "enableIntegration": true,
-            "serverUrl": "http://localhost:8095/crowd",
-            "applicationName": "artifactory",
-            "password": "password",
-            "sessionValidationInterval": 0,
-            "useDefaultProxy": false,
-            "noAutoUserCreation": true,
-            "directAuthentication": false
-        });
-    });
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/export_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/export_dao.spec.js
deleted file mode 100644
index 202cc59..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/export_dao.spec.js
+++ /dev/null
@@ -1,39 +0,0 @@
-describe('unit test: export dao', function () {
-
-    var ExportDao;
-    var RESOURCE;
-    var server;
-
-
-    var exportMock = {
-        path: '/home/jfrog/export',
-        action:'system',
-        excludeContent: false,
-        excludeMetadata: false,
-        excludeBuilds: false,
-        m2: false,
-        createArchive: false,
-        verbose: false
-    };
-
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        ExportDao = $injector.get('ExportDao');
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('ExportDao should return a resource object', function () {
-        expect(ExportDao.name).toBe('Resource');
-    });
-
-    it('send an export request', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.EXPORT+"/system" , exportMock).respond(200);
-        ExportDao.save(exportMock);
-        server.flush();
-    });
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/filtered_resource_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/filtered_resource_dao.spec.js
deleted file mode 100644
index 9e500fe..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/filtered_resource_dao.spec.js
+++ /dev/null
@@ -1,31 +0,0 @@
-describe('unit test:filteredResource dao', function () {
-
-    var filteredResourceDao;
-    var RESOURCE;
-    var server;
-    var filteredResourceMock = {
-        repoKey: 'libs-release-local',
-        path: 'aopalliance/aopalliance/1.0/aopalliance-1.0.jar'
-    };
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        filteredResourceDao = $injector.get('FilteredResourceDao');
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('filteredResourceDao should return a resource object', function () {
-        expect(filteredResourceDao.name).toBe('Resource');
-    });
-
-    it('send a fix request to filteredResourceDao', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.FILTERED_RESOURCE + '?setFiltered=true').respond(200);
-        filteredResourceDao.setFiltered({setFiltered: true}, filteredResourceMock);
-        server.flush();
-    });
-
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/footer_dao.spec.browserify.js b/web/angular-web/src/main/webapp/specs/dao/footer_dao.spec.browserify.js
deleted file mode 100644
index 4d112ce..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/footer_dao.spec.browserify.js
+++ /dev/null
@@ -1,38 +0,0 @@
-var mockStorage = require('../../mocks/artifactory_storage_mock.browserify.js');
-
-describe('unit test:footer dao', function () {
-
-    var footerDao;
-    var RESOURCE;
-    var server;
-    var footerResponse = {"isAol": false, "versionID": "PRO", "versionInfo":"Artifactory Professional","buildNumber":"4.x-SNAPSHOT rev ${buildNumber.prop}","licenseInfo":"Licensed to JFrog","copyRights":"© Copyright 2015 JFrog Ltd","copyRightsUrl":"http://www.jfrog.org"};
-    mockStorage();
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        footerDao = $injector.get('FooterDao');
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    //
-    it('should send a get request to return an footerDao', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.FOOTER).respond(footerResponse);
-        footerDao.get();
-        server.flush();
-    });
-    it('should cache the result', function (finito) {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.FOOTER).respond(footerResponse);
-        footerDao.get();
-        footerDao.get()
-            .then(function(footerInfo) {
-                expect(footerDao.getInfo()).toEqual(footerInfo);
-                finito();
-            });
-        server.flush();
-    });
-
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/general_config_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/general_config_dao.spec.js
deleted file mode 100644
index eae43b8..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/general_config_dao.spec.js
+++ /dev/null
@@ -1,23 +0,0 @@
-describe('unit test:generalConfig dao', function () {
-
-    var generalConfigDao;
-    var RESOURCE;
-    var server;
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        generalConfigDao = $injector.get('GeneralConfigDao');
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('send deleteLogo request with generalConfig dao', function () {
-        server.expectDELETE(RESOURCE.API_URL + RESOURCE.GENERAL_CONFIG + "/logo").respond(200);
-        generalConfigDao.deleteLogo();
-        server.flush();
-    });
-
-});
diff --git a/web/angular-web/src/main/webapp/specs/dao/governance_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/governance_dao.spec.js
deleted file mode 100644
index 1059c9b..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/governance_dao.spec.js
+++ /dev/null
@@ -1,44 +0,0 @@
-describe('unit test:governance dao', function () {
-
-    var governance;
-    var RESOURCE;
-    var server;
-
-    var governanceParams = {
-        "repoKey": 'libs-releases-local',
-        "path": 'com/fasterxml/jackson/core/jackson-databind/2.4.5/jackson-databind-2.4.5.jar'
-    };
-
-    var componentIdChangeParams = {
-        "repoKey":"libs-releases-local",
-        "path":"org/glassfish/jersey/media/jersey-media-multipart2/2.0-m11/jersey-media-multipart2-2.0-m11.jar",
-        "componentId":"123456",
-        "origComponentId":""
-    };
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        governanceDao = $injector.get('GovernanceDao');
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('governance should return a resource object', function () {
-        expect(governanceDao.name).toBe('Resource');
-    });
-
-    it('should fetch data', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.ARTIFACT_GOVERNANCE).respond(200);
-        governanceDao.fetch(governanceParams);
-        server.flush();
-    });
-
-    it('should update component id', function() {
-        server.expectPUT(RESOURCE.API_URL + RESOURCE.ARTIFACT_GOVERNANCE).respond(200);
-        governanceDao.update(componentIdChangeParams);
-        server.flush();
-    });
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/group_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/group_dao.spec.js
deleted file mode 100644
index 8db29a2..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/group_dao.spec.js
+++ /dev/null
@@ -1,49 +0,0 @@
-describe('unit test:groups dao', function () {
-
-    var groupsDao;
-    var RESOURCE;
-    var server;
-    var groupMock = {
-        "name": "idan",
-        "description": "idan group bla bla",
-        "autoJoin": false,
-        "realm": "artifactory",
-        "groupName": "idan",
-        "newUserDefault": false
-    };
-    var queryParams = "?autoJoin=false&description=idan+group+bla+bla&groupName=idan&newUserDefault=false&realm=artifactory";
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        groupsDao = $injector.get('GroupsDao').getInstance();
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('groupDao should return a resource object', function () {
-        expect(groupsDao.name).toBe('Resource');
-    });
-
-    it('send an update request group dao', function () {
-        server.expectPUT(RESOURCE.API_URL + RESOURCE.GROUPS + "/idan", groupMock).respond(200);
-        groupsDao.update(groupMock);
-        server.flush();
-    });
-
-    it('send delete request with group dao', function () {
-
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.GROUPS + "/groupsDelete", groupMock).respond(200);
-        groupsDao.delete(groupMock);
-        server.flush();
-    });
-
-    it('send an save request  with group dao', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.GROUPS, groupMock).respond(200);
-        groupsDao.save(groupMock);
-        server.flush();
-    });
-
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/ha_dao.spec.browserify.js b/web/angular-web/src/main/webapp/specs/dao/ha_dao.spec.browserify.js
deleted file mode 100644
index b9d9d1d..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/ha_dao.spec.browserify.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import {regularResponse as haMock} from '../../mocks/ha_mock.browserify.js';
-
-describe('unit test:ha dao', () => {
-    let haDao;
-    let RESOURCE;
-    let server;
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject( ($injector) => {
-        haDao = $injector.get('HaDao');
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('haDao should return a resource object',  () => {
-        expect(haDao.name).toBe('Resource');
-    });
-
-    it('send a get request with ha dao ',  () => {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.HIGH_AVAILABILITY).respond(haMock);
-        haDao.query();
-        server.flush();
-    });
-    it('send a delete request with ha dao ',  () => {
-        server.expectDELETE(RESOURCE.API_URL + RESOURCE.HIGH_AVAILABILITY + '/art-8080').respond(200);
-        haDao.delete({id: haMock[0].id});
-        server.flush();
-    });
-
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/http_sso_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/http_sso_dao.spec.js
deleted file mode 100644
index e2aeb43..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/http_sso_dao.spec.js
+++ /dev/null
@@ -1,39 +0,0 @@
-describe('Unit: http sso dao', function () {
-
-    var httpSsoDao;
-    var RESOURCE;
-    var server;
-    var ssoMock = {
-        "httpSsoProxied": true,
-        "noAutoUserCreation": false,
-        "remoteUserRequestVariable": "REMOTE_USER"
-    };
-
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        httpSsoDao = $injector.get('HttpSsoDao').getInstance();
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('passwordEncryptionDao should return a resource object', function () {
-        expect(httpSsoDao.name).toBe('Resource')
-    });
-
-    it('should send a get request when query for proxies', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.HTTPSSO).respond(200);
-        httpSsoDao.get();
-        server.flush();
-    });
-
-    it('should send a get request when query for proxies', function () {
-        server.expectPUT(RESOURCE.API_URL + RESOURCE.HTTPSSO, ssoMock).respond(200);
-        httpSsoDao.update(ssoMock);
-        server.flush();
-    });
-
-});
diff --git a/web/angular-web/src/main/webapp/specs/dao/import_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/import_dao.spec.js
deleted file mode 100644
index cdab4cb..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/import_dao.spec.js
+++ /dev/null
@@ -1,36 +0,0 @@
-describe('unit test: import dao', function () {
-
-    var ImportDao;
-    var RESOURCE;
-    var server;
-
-
-    var importMock = {
-        action:'system',
-        path: '/home/jfrog/import',
-        excludeContent: false,
-        excludeMetadata: false,
-        verbose: false
-    };
-
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        ImportDao = $injector.get('ImportDao');
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('ImportDao should return a resource object', function () {
-        expect(ImportDao.name).toBe('Resource');
-    });
-
-    it('send an import request', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.IMPORT+"/system" , importMock).respond(200);
-        ImportDao.save(importMock);
-        server.flush();
-    });
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/indexer_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/indexer_dao.spec.js
deleted file mode 100644
index 74e1384..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/indexer_dao.spec.js
+++ /dev/null
@@ -1,43 +0,0 @@
-describe('unit test:indexer dao', function () {
-
-    var indexerDao;
-    var RESOURCE;
-    var server;
-    var indexerMock = {
-        "enabled": true,
-        "cronExp":"0 23 5 * * ?",
-        "excludedRepos":["libs-release-local"]
-    };
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        indexerDao = $injector.get('IndexerDao').getInstance();
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('licensesDao should return a resource object', function () {
-        expect(indexerDao.name).toBe('Resource');
-    });
-
-    it('send an update request with indexer dao', function () {
-        server.expectPUT(RESOURCE.API_URL + RESOURCE.INDEXER).respond(200);
-        indexerDao.update(indexerMock);
-        server.flush();
-    });
-
-    it('should send a post request to run the indexer ', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.INDEXER).respond(200);
-        indexerDao.run();
-        server.flush();
-    });
-
-    it('should send a get request to return an indexer', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.INDEXER).respond(200);
-        indexerDao.get();
-        server.flush();
-    })
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/ldap_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/ldap_dao.spec.js
deleted file mode 100644
index 1254870..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/ldap_dao.spec.js
+++ /dev/null
@@ -1,70 +0,0 @@
-describe('unit test:ldap dao', function () {
-
-    var ldapDao;
-    var RESOURCE;
-    var server;
-    var ldapMock = {
-        "key": "frogs",
-        "enabled": true,
-        "ldapUrl": "ldap://win2012:389/dc=jfrog,dc=local",
-        "search": {
-            "searchFilter": "sAMAccountName={0}",
-            "searchBase": "ou=il,ou=frogs|ou=us,ou=frogs",
-            "searchSubTree": true,
-            "managerDn": "cn=Administrator,cn=Users,dc=jfrog,dc=local",
-            "managerPassword": "Win20132013"
-        },
-        "autoCreateUser": true,
-        "emailAttribute": "mail"
-    }
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        ldapDao = $injector.get('LdapDao');
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('ldapDao should return a resource object', function () {
-        expect(ldapDao.name).toBe('Resource');
-    });
-
-    it('send a query request with ldap dao ', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.LDAP).respond(200);
-        ldapDao.query();
-        server.flush();
-    });
-
-    it('send a get a single ldap setting request with ldap dao ', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.LDAP + "/frogs").respond(200);
-        ldapDao.get({key:'frogs'});
-        server.flush();
-    });
-
-    it('send a create request to ldap dao', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.LDAP, ldapMock).respond(200);
-        ldapDao.save(ldapMock);
-        server.flush();
-    });
-
-    it('send an update request ldap dao', function () {
-        server.expectPUT(RESOURCE.API_URL + RESOURCE.LDAP + "/frogs").respond(200);
-        ldapDao.update(ldapMock);
-        server.flush();
-    });
-
-    it('send delete request with ldap dao', function () {
-        server.expectDELETE(RESOURCE.API_URL + RESOURCE.LDAP + "/frogs").respond(200);
-        ldapDao.delete({key:'frogs'});
-        server.flush();
-    });
-
-    it('send a test request to ldap dao', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.LDAP + "/test/frogs").respond(200);
-        ldapDao.test({key:'frogs'});
-        server.flush();
-    });
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/ldap_groups_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/ldap_groups_dao.spec.js
deleted file mode 100644
index b1f7b6f..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/ldap_groups_dao.spec.js
+++ /dev/null
@@ -1,75 +0,0 @@
-describe('unit test:ldap groups dao', function () {
-
-    var ldapGroupsDao;
-    var RESOURCE;
-    var server;
-    var ldapMock = {
-        "name": "il-users",
-        "groupBaseDn": "ou=frogs",
-        "groupNameAttribute": "cn",
-        "groupMemberAttribute": "memberOf",
-        "subTree": true,
-        "filter": "description",
-        "descriptionAttribute": "description",
-        "enabledLdap": "frogs",
-        "strategy": "DYNAMIC",
-        "enabled": true
-    }
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        ldapGroupsDao = $injector.get('LdapGroupsDao');
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('ldapGroupsDao should return a resource object', function () {
-        expect(ldapGroupsDao.name).toBe('Resource');
-    });
-
-    it('send a get (query) request with ldap groups dao ', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.LDAP_GROUPS).respond(200);
-        ldapGroupsDao.query();
-        server.flush();
-    });
-
-    it('send a get request with ldap groups dao ', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.LDAP_GROUPS + "/il-users").respond(200);
-        ldapGroupsDao.get({name:'il-users'});
-        server.flush();
-    });
-
-    it('send a POST request to ldap groups dao', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.LDAP_GROUPS, ldapMock).respond(200);
-        ldapGroupsDao.save(ldapMock);
-        server.flush();
-    });
-
-    it('send an update request ldap groups dao', function () {
-        server.expectPUT(RESOURCE.API_URL + RESOURCE.LDAP_GROUPS + "/il-users").respond(200);
-        ldapGroupsDao.update({name:'il-users'});
-        server.flush();
-    });
-
-    it('send delete request with ldap groups dao', function () {
-        server.expectDELETE(RESOURCE.API_URL + RESOURCE.LDAP_GROUPS + "/il-users").respond(200);
-        ldapGroupsDao.delete({name:'il-users'});
-        server.flush();
-    });
-
-    it('send a refresh request to ldap groups dao', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.LDAP_GROUPS + "/il-users/refresh").respond(200);
-        ldapGroupsDao.refresh({name:'il-users'});
-        server.flush();
-    });
-
-    it('send an import request to ldap groups dao', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.LDAP_GROUPS + "/il-users/import").respond(200);
-        ldapGroupsDao.import({name:'il-users'});
-        server.flush();
-    });
-
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/licenses_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/licenses_dao.spec.js
deleted file mode 100644
index 3c36b4b..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/licenses_dao.spec.js
+++ /dev/null
@@ -1,44 +0,0 @@
-describe('unit test:licenses dao', function () {
-
-    var licensesDao;
-    var RESOURCE;
-    var server;
-    var licenseMock = {
-        "name": "AFL-3.0",
-        "longName": "The Academic Free License 3.0"
-        ,
-        "url": "http://www.opensource.org/licenses/afl-3.0.php"
-        ,
-        "regexp": "((.*)(academic)(.*)|(AFL)+(.*))(3)(.*)",
-        "approved": true,
-        "status": "Approved",
-        "comments": "my comments"
-    };
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        licensesDao = $injector.get('LicensesDao');
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('licensesDao should return a resource object', function () {
-        expect(licensesDao.name).toBe('Resource');
-    });
-
-    it('send an update request with licenses dao', function () {
-        server.expectPUT(RESOURCE.API_URL + RESOURCE.LICENSES + '/crud/' + licenseMock.name).respond(200);
-        licensesDao.update(licenseMock);
-        server.flush();
-    });
-
-    it('should post a new license data object', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.LICENSES, licenseMock).respond(200);
-        var licenseDataObject = new licensesDao(licenseMock);
-        licenseDataObject.$save();
-        server.flush();
-    });
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/mail_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/mail_dao.spec.js
deleted file mode 100644
index 318e237..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/mail_dao.spec.js
+++ /dev/null
@@ -1,27 +0,0 @@
-describe('Unit: mail dao', function () {
-
-    var mailDao;
-    var RESOURCE;
-    var server;
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        mailDao = $injector.get('MailDao').getInstance();
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('mailDao should return a resource object', function () {
-        expect(mailDao.name).toBe('Resource');
-    });
-
-    it('send an update request to serve', function () {
-        server.expectPUT(RESOURCE.API_URL + RESOURCE.MAIL).respond(200);
-        mailDao.update();
-        server.flush();
-    })
-
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/maintenance_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/maintenance_dao.spec.js
deleted file mode 100644
index 3d538ca..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/maintenance_dao.spec.js
+++ /dev/null
@@ -1,77 +0,0 @@
-describe('unit test:maintenance dao', function () {
-
-    var maintenanceDao;
-    var RESOURCE;
-    var server;
-
-    var settingsParams = {
-        cleanUnusedCachedCron: '',
-        cleanVirtualRepoCron: '*/5 * * * *',
-        garbageCollectorCron: '* */5 * * *',
-        quotaControl: true,
-        storageLimit: '95',
-        storageWarning: '85'
-    };
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        maintenanceDao = $injector.get('MaintenanceDao');
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('maintenanceDao should return a resource object', function () {
-        expect(maintenanceDao.name).toBe('Resource');
-    });
-
-    it('should get settings', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.MAINTENANCE).respond(200);
-        maintenanceDao.get();
-        server.flush();
-    });
-
-    it('should save settings', function() {
-        server.expectPUT(RESOURCE.API_URL + RESOURCE.MAINTENANCE).respond(200);
-        maintenanceDao.update(settingsParams);
-        server.flush();
-    });
-
-    it('should run garbage collection', function() {
-        var moduleName = 'garbageCollection';
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.MAINTENANCE + '/' + moduleName).respond(200);
-        maintenanceDao.perform({module: moduleName});
-        server.flush();
-    });
-
-    it('should clean unused  cache', function() {
-        var moduleName = 'cleanUnusedCache';
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.MAINTENANCE + '/' + moduleName).respond(200);
-        maintenanceDao.perform({module: moduleName});
-        server.flush();
-    });
-
-    it('should clean Virtual Repositories', function() {
-        var moduleName = 'cleanVirtualRepo';
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.MAINTENANCE + '/' + moduleName).respond(200);
-        maintenanceDao.perform({module: moduleName});
-        server.flush();
-    });
-
-    it('should prune Unreferenced Data', function() {
-        var moduleName = 'prune';
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.MAINTENANCE + '/' + moduleName).respond(200);
-        maintenanceDao.perform({module: moduleName});
-        server.flush();
-    });
-
-    it('should compress internal data', function() {
-        var moduleName = 'compress';
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.MAINTENANCE + '/' + moduleName).respond(200);
-        maintenanceDao.perform({module: moduleName});
-        server.flush();
-    });
-
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/oauth_dao_spec.js b/web/angular-web/src/main/webapp/specs/dao/oauth_dao_spec.js
deleted file mode 100644
index 59702e4..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/oauth_dao_spec.js
+++ /dev/null
@@ -1,65 +0,0 @@
-describe('unit test:oauth dao', function () {
-
-    var oauthDao;
-    var RESOURCE;
-    var server;
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        oauthDao = $injector.get('OAuthDao');
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('oauthDao should return a resource object', function () {
-        expect(oauthDao.name).toBe('Resource');
-    });
-
-
-    it('send a get request with oauth dao ', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.OAUTH).respond(200);
-        oauthDao.get();
-        server.flush();
-    });
-
-
-    it('send an update request with oauth dao ', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.OAUTH).respond(200);
-        oauthDao.update();
-        server.flush();
-    });
-
-    it('send an createProvider request with oauth dao ', function () {
-        server.expectPUT(RESOURCE.API_URL + RESOURCE.OAUTH + '/provider').respond(200);
-        oauthDao.createProvider();
-        server.flush();
-    });
-
-    it('send an updateProvider request with oauth dao ', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.OAUTH + '/provider').respond(200);
-        oauthDao.updateProvider();
-        server.flush();
-    });
-
-    it('send an deleteProvider request with oauth dao ', function () {
-        server.expectDELETE(RESOURCE.API_URL + RESOURCE.OAUTH + '/provider/provider1').respond(200);
-        oauthDao.deleteProvider({},{provider:'provider1'});
-        server.flush();
-    });
-
-    it('send an getUserTokens request with oauth dao ', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.OAUTH + '/user/tokens').respond(200);
-        oauthDao.getUserTokens();
-        server.flush();
-    });
-
-    it('send an deleteUserToken request with oauth dao ', function () {
-        server.expectDELETE(RESOURCE.API_URL + RESOURCE.OAUTH + '/user/tokens/a_username/a_provider').respond(200);
-        oauthDao.deleteUserToken({},{username: 'a_username',provider: 'a_provider'});
-        server.flush();
-    });
-
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/passwords_encryption_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/passwords_encryption_dao.spec.js
deleted file mode 100644
index bfe6362..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/passwords_encryption_dao.spec.js
+++ /dev/null
@@ -1,41 +0,0 @@
-describe('Unit: password encryption dao', function () {
-
-    var passwordEncryptionDao;
-    var RESOURCE;
-    var server;
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        passwordEncryptionDao = $injector.get('PasswordsEncryptionDao').getInstance();
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-
-    it('passwordEncryptionDao should return a resource object', function () {
-        expect(passwordEncryptionDao.name).toBe('Resource')
-    });
-
-    it('send an encrypt request to the server', function () {
-
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.CRYPTO + "/encrypt")
-                .respond(200);
-
-        passwordEncryptionDao.encrypt();
-        server.flush();
-    });
-
-    it('send an decrypt request to the server', function () {
-
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.CRYPTO + "/decrypt")
-                .respond(200);
-
-        passwordEncryptionDao.decrypt();
-        server.flush();
-    });
-
-
-});
diff --git a/web/angular-web/src/main/webapp/specs/dao/permissions_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/permissions_dao.spec.js
deleted file mode 100644
index 8bc1505..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/permissions_dao.spec.js
+++ /dev/null
@@ -1,29 +0,0 @@
-describe('unit test:permissions dao', function () {
-
-    var permissionsDao;
-    var RESOURCE;
-    var server;
-
-    var settingsParams = {
-
-    };
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        permissionsDao = $injector.get('PermissionsDao').getInstance();
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('permissionsDao should return a resource object', function () {
-        expect(permissionsDao.name).toBe('Resource');
-    });
-    it('permissionsDao should return a resource object', function () {
-        server.expectGET(RESOURCE.API_URL +RESOURCE.TARGET_PERMISSIONS +'/crud/Anything').respond(200);
-        permissionsDao.getPermission({name: 'Anything'});
-        server.flush();
-    });
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/property_sets.spec.browserify.js b/web/angular-web/src/main/webapp/specs/dao/property_sets.spec.browserify.js
deleted file mode 100644
index 88ab016..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/property_sets.spec.browserify.js
+++ /dev/null
@@ -1,194 +0,0 @@
-import {PropertySetMock, PropertyMock} from '../../mocks/property_sets_mocks.browserify.js';
-describe('unit test:propertysets', () => {
-    let propertysetsDao;
-    let PropertySet;
-    let Property;
-    let RESOURCE;
-    let server;
-    let propertyMock = PropertyMock({name: 'testprop'});
-    let propertySetsMock = [PropertySetMock(), PropertySetMock()];
-    let propertySetMock = PropertySetMock({
-        name: 'test',
-        properties: [propertyMock]
-    });
-    let propertyObject;
-    let propertySetObject;
-
-    let value1 = {value: 'one', defaultValue: false};
-    let defaultValue1 = {value: 'two', defaultValue: true};
-    let value2 = {value: 'three', defaultValue: false};
-    let defaultValue2 = {value: 'four', defaultValue: true};
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(($injector) => {
-        propertysetsDao = $injector.get('PropertySetsDao');
-        PropertySet = $injector.get('PropertySet');
-        Property = $injector.get('Property');
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    beforeEach(() => {
-        propertySetObject = new PropertySet(propertySetMock);
-        propertyObject = new Property(propertyMock);
-    });
-
-    describe('PropertySetsDao', () => {
-        it('propertysetsDao should return a resource object', () => {
-            expect(propertysetsDao.name).toBe('Resource');
-        });
-
-        it('should query all property sets', () => {
-            server.expectGET(RESOURCE.API_URL + RESOURCE.PROPERTY_SETS).respond(propertySetsMock);
-            propertysetsDao.query();
-            server.flush();
-        });
-
-        it('should get a single property set', () => {
-            server.expectGET(RESOURCE.API_URL + RESOURCE.PROPERTY_SETS + '/' + propertySetMock.name).respond(propertySetMock);
-            propertysetsDao.get({name: propertySetMock.name});
-            server.flush();
-        });
-
-        it('should save an existing propertyset data object', () => {
-            server.expectPUT(RESOURCE.API_URL + RESOURCE.PROPERTY_SETS + '/' + propertySetMock.name, propertySetMock).respond(200);
-            var propertysetDataObject = new propertysetsDao(propertySetMock);
-            propertysetDataObject.$update();
-            server.flush();
-        });
-
-        it('should post a new propertyset data object', () => {
-            server.expectPOST(RESOURCE.API_URL + RESOURCE.PROPERTY_SETS, propertySetMock).respond(200);
-            var propertysetDataObject = new propertysetsDao(propertySetMock);
-            propertysetDataObject.$save();
-            server.flush();
-        });
-    });
-    describe('PropertySet', () => {
-        describe('constructor', () => {
-            it('should create property set with default values', () => {
-                let propertySet = new PropertySet();
-                expect(propertySet.properties).toEqual([]);
-            });
-            it('should create property set with given values', () => {
-                let propertySet = new PropertySet(propertySetMock);
-                expect(propertySet.name).toEqual(propertySetMock.name);
-                let properties = propertySetMock.properties.map((prop) => new Property(prop));
-                expect(propertySet.properties).toEqual(properties);
-            });
-        });
-        describe('getPropertyByName', () => {
-            it('should return property', () => {
-                expect(propertySetObject.getPropertyByName('testprop')).toEqual(propertyObject);
-            });
-            it('should return undefined if not found', () => {
-                expect(propertySetObject.getPropertyByName('not found')).not.toBeDefined();
-            });
-        });
-        describe('addProperty', () => {
-            it('should add a property to the end of the properties list', () => {
-                let newProperty = new Property();
-                propertySetObject.addProperty(newProperty);
-                expect(propertySetObject.properties[1]).toEqual(newProperty);
-            });
-        });
-        describe('removeProperty', () => {
-            it('should remove a property by name', () => {
-                propertySetObject.removeProperty('testprop');
-                expect(propertySetObject.properties).toEqual([]);
-            });
-            it('should not do anything if property is not found', () => {
-                propertySetObject.removeProperty('not found');
-                expect(propertySetObject.properties).toEqual([propertyObject]);
-            });
-        });
-    });
-    describe('Property', () => {
-        describe('Property.propertyTypes', () => {
-            it('should be defined', () => {
-                expect(Property.propertyTypes).toBeDefined();
-            });
-            it('should be an array', () => {
-                expect(angular.isArray(Property.propertyTypes)).toBeTruthy();
-            });
-            it('should have elements with text and value', () => {
-                let keys = Object.keys(Property.propertyTypes[0]);
-                expect(keys).toEqual(['value', 'text']);
-            });
-        });
-        describe('constructor', () => {
-            it('should create property with default values', () => {
-                let property = new Property();
-                expect(property.propertyType).toEqual('ANY_VALUE');
-                expect(property.predefinedValues).toEqual([]);
-            });
-            it('should create property with given values', () => {
-                let property = new Property(propertyMock);
-                expect(property.name).toEqual(propertyMock.name);
-                expect(property.propertyType).toEqual(propertyMock.propertyType);
-                expect(property.predefinedValues).toEqual(propertyMock.predefinedValues);
-            });
-        });
-        describe('getDisplayType', () => {
-            it('should return Any Value', () => {
-                propertyObject.propertyType = 'ANY_VALUE';
-                expect(propertyObject.getDisplayType()).toEqual('Any Value');
-            });
-            it('should return Single Select', () => {
-                propertyObject.propertyType = 'SINGLE_SELECT';
-                expect(propertyObject.getDisplayType()).toEqual('Single Select');
-            });
-            it('should return Multi Select', () => {
-                propertyObject.propertyType = 'MULTI_SELECT';
-                expect(propertyObject.getDisplayType()).toEqual('Multi Select');
-            });
-        });
-        describe('getDefaultValues', () => {
-            it('should return the array of default values', () => {
-                let property = new Property({ predefinedValues:[
-                    value1,
-                    defaultValue1,
-                    value2,
-                    defaultValue2
-                ]});
-                expect(property.getDefaultValues()).toEqual([defaultValue1, defaultValue2]);
-            });
-            it('should return an empty array if no default values', () => {
-                let property = new Property({predefinedValues:[{value: 'one'}]});
-                expect(property.getDefaultValues()).toEqual([]);
-            });
-            it('should return an empty array if no predefined values', () => {
-                let property = new Property();
-                expect(property.getDefaultValues()).toEqual([]);
-            });
-        });
-        describe('getPredefinedValue', () => {
-            it('should return a predefined value by name', () => {
-                let property = new Property({ predefinedValues:[
-                    value1,
-                    value2
-                ]});
-                expect(property.getPredefinedValue('one')).toEqual(value1);
-            });
-            it('should return undefined if not found', () => {
-                let property = new Property({ predefinedValues:[
-                    value1,
-                    value2
-                ]});
-                expect(property.getPredefinedValue('not found')).not.toBeDefined();
-            });
-        });
-        describe('addPredefinedValue', () => {
-            it('should allow to add a predefined value, and set it to default = false', () => {
-                let property = new Property({ predefinedValues:[
-                    value1
-                ]});
-                property.addPredefinedValue('three');
-                expect(property.predefinedValues).toEqual([value1, value2]);
-            });
-        });
-    });
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/proxies_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/proxies_dao.spec.js
deleted file mode 100644
index 83594d0..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/proxies_dao.spec.js
+++ /dev/null
@@ -1,59 +0,0 @@
-describe('Unit: proxies Dao', function () {
-
-    var proxiesDao;
-    var RESOURCE;
-    var server;
-    var proxyMock = {
-        "key": "charls",
-        "host": "localhost",
-        "port": 8888,
-        "defaultProxy": false
-    };
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        proxiesDao = $injector.get('ProxiesDao');
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-
-    it('passwordEncryptionDao should return a resource object', function () {
-        expect(proxiesDao.name).toBe('Resource')
-    });
-
-    it('should send a get request when query for proxies', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.PROXIES + '/crud').respond(200);
-        proxiesDao.get();
-        server.flush();
-    });
-
-    it('should send a get request when get for single proxy', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.PROXIES + '/crud/charls').respond(200);
-        proxiesDao.get({key: 'charls'});
-        server.flush();
-    });
-
-    it('should send a delete request with the key as parameter', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.PROXIES + '/deleteProxies', proxyMock).respond(200);
-        proxiesDao.delete(proxyMock);
-        server.flush()
-    });
-
-    it('should perform an update request with an proxyMock object', function () {
-        server.expectPUT(RESOURCE.API_URL + RESOURCE.PROXIES + '/crud/charls', proxyMock).respond(200);
-        proxiesDao.update(proxyMock);
-        server.flush()
-    });
-
-    it('should post a new proxy data object', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.PROXIES, proxyMock).respond(200);
-        var proxiesDataObject = new proxiesDao(proxyMock);
-        proxiesDataObject.$save();
-        server.flush();
-    })
-
-});
diff --git a/web/angular-web/src/main/webapp/specs/dao/push_to_bintray_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/push_to_bintray_dao.spec.js
deleted file mode 100644
index a9445be..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/push_to_bintray_dao.spec.js
+++ /dev/null
@@ -1,57 +0,0 @@
-describe('unit test:push_to_bintray dao', function () {
-
-    var ptbDao;
-    var RESOURCE;
-    var server;
-    var ptbMock = {};
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        ptbDao = $injector.get('PushToBintrayDao');
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('ptbDao should return a resource object', function () {
-        expect(ptbDao.name).toBe('Resource');
-    });
-
-    it('send a getBuildRepos request with ptb dao ', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.PUSH_TO_BINTRAY).respond(200);
-        ptbDao.getBuildRepos();
-        server.flush();
-    });
-
-    it('send a getBuildPacks request with ptb dao ', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.PUSH_TO_BINTRAY + '/build/pkg').respond(200);
-        ptbDao.getBuildPacks();
-        server.flush();
-    });
-
-    it('send a getBuildVersions request with ptb dao ', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.PUSH_TO_BINTRAY + '/build/versions').respond(200);
-        ptbDao.getBuildVersions();
-        server.flush();
-    });
-
-    it('send a pushBuildToBintray request with ptb dao ', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.PUSH_TO_BINTRAY + '/build').respond(200);
-        ptbDao.pushBuildToBintray();
-        server.flush();
-    });
-
-    it('send a getArtifactData request with ptb dao ', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.PUSH_TO_BINTRAY + '/artifact').respond(200);
-        ptbDao.getArtifactData();
-        server.flush();
-    });
-
-    it('send a pushArtifactToBintray request with ptb dao ', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.PUSH_TO_BINTRAY + '/artifact').respond(200);
-        ptbDao.pushArtifactToBintray();
-        server.flush();
-    });
-});
diff --git a/web/angular-web/src/main/webapp/specs/dao/register_pro_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/register_pro_dao.spec.js
deleted file mode 100644
index 42e7439..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/register_pro_dao.spec.js
+++ /dev/null
@@ -1,40 +0,0 @@
-describe('Unit: register Pro Dao', function () {
-
-    var registerProDao;
-    var RESOURCE;
-    var server;
-    var licenseMock = {"key" : "1234567890abcdefg"};
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        registerProDao = $injector.get('RegisterProDao');
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('passwordEncryptionDao should return a resource object', function () {
-        expect(registerProDao.name).toBe('Resource')
-    });
-
-    it('should send a get request to the server', function () {
-        server.expectGET(RESOURCE.API_URL+RESOURCE.REGISTER_PRO).respond(200);
-        registerProDao.get();
-        server.flush();
-    });
-
-    it('should send a get request to the server', function () {
-        server.expectGET(RESOURCE.API_URL+RESOURCE.REGISTER_PRO).respond(200);
-        registerProDao.get();
-        server.flush();
-    });
-
-    it('should update the license by sending a put request', function () {
-        server.expectPUT(RESOURCE.API_URL+RESOURCE.REGISTER_PRO, licenseMock).respond(200);
-        registerProDao.update(licenseMock);
-        server.flush();
-    });
-
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/saml_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/saml_dao.spec.js
deleted file mode 100644
index a1c70f3..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/saml_dao.spec.js
+++ /dev/null
@@ -1,36 +0,0 @@
-describe('unit test:saml dao', function () {
-
-    var samlDao;
-    var RESOURCE;
-    var server;
-    var samlMock = {
-        "enableIntegration": true,
-        "loginUrl": "http://login",
-        "logoutUrl": "http://logout",
-        "certificate": "MIICQDCCAakCBEeNB0swDQYJKoZIhvcNAQEEBQAwZzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFDASBgNVBAcTC1NhbnRhIENsYXJhMQwwCgYDVQQKEwNTdW4xEDAOBgNVBAsTB09wZW5TU08xDTALBgNVBAMTBHRlc3QwHhcNMDgwMTE1MTkxOTM5WhcNMTgwMTEyMTkxOTM5WjBnMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEUMBIGA1UEBxMLU2FudGEgQ2xhcmExDDAKBgNVBAoTA1N1bjEQMA4GA1UECxMHT3BlblNTTzENMAsGA1UEAxMEdGVzdDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEArSQc/U75GB2AtKhbGS5piiLkmJzqEsp64rDxbMJ+xDrye0EN/q1U5Of+RkDsaN/igkAv [...]
-        "serviceProviderName": "test",
-        "noAutoUserCreation": true
-    };
-
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        samlDao = $injector.get('SamlDao').getInstance();
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('samlDao should return a resource object', function () {
-        expect(samlDao.name).toBe('Resource');
-    });
-
-    it('samlDao send a put request to serve', function () {
-        server.expectPUT(RESOURCE.API_URL + RESOURCE.SAML_CONFIG).respond(200);
-        samlDao.update(samlMock);
-        server.flush();
-    })
-
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/security_descriptor_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/security_descriptor_dao.spec.js
deleted file mode 100644
index a09acde..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/security_descriptor_dao.spec.js
+++ /dev/null
@@ -1,26 +0,0 @@
-describe('unit test:SecurityDescriptorDao', function () {
-
-    var securityDescriptorDao;
-    var RESOURCE;
-    var server;
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        securityDescriptorDao = $injector.get('SecurityDescriptorDao').getInstance();
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('configDescriptorDao should return a resource object', function () {
-        expect(securityDescriptorDao.name).toBe('Resource');
-    });
-
-    it('SecurityDescriptorDao send an PUT request', function () {
-        server.expectPUT(RESOURCE.API_URL + RESOURCE.SECURITY_DESCRIPTOR).respond(200);
-        securityDescriptorDao.update();
-        server.flush();
-    });
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/ssh_client_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/ssh_client_dao.spec.js
deleted file mode 100644
index ca949de..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/ssh_client_dao.spec.js
+++ /dev/null
@@ -1,38 +0,0 @@
-describe('unit test:ssh client dao', function () {
-
-    var sshClientDao;
-    var RESOURCE;
-    var server;
-    var userParams =  {
-        "publicKey": "aKey"
-    };
-
-    var userParms = "?publicKey=aKey";
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        sshClientDao = $injector.get('SshClientDao');
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('sshClientDao should return a resource object', function () {
-        expect(sshClientDao.name).toBe('Resource');
-    });
-
-    it('should fetch data', function() {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.SSH_CLIENT).respond(200);
-        sshClientDao.fetch({publicKey: 'aKey'});
-        server.flush();
-    });
-
-    it('should update data', function() {
-        server.expectPUT(RESOURCE.API_URL + RESOURCE.SSH_CLIENT).respond(200);
-        sshClientDao.update({publicKey: 'aKey'});
-        server.flush();
-    });
-
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/storage_summary_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/storage_summary_dao.spec.js
deleted file mode 100644
index f17926c..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/storage_summary_dao.spec.js
+++ /dev/null
@@ -1,27 +0,0 @@
-describe('Unit: Storage Summary  dao', function () {
-
-    var storageSummaryDao;
-    var RESOURCE;
-    var server;
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        storageSummaryDao = $injector.get('StorageSummaryDao').getInstance();
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('storageSummaryDao should return a resource object', function () {
-        expect(storageSummaryDao.name).toBe('Resource');
-    });
-
-    it('storageSummaryDao send an Get request ', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.STORAGE_SUMMARY).respond(200);
-        storageSummaryDao.get();
-        server.flush();
-    });
-
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/user_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/user_dao.spec.js
deleted file mode 100644
index 39dc89f..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/user_dao.spec.js
+++ /dev/null
@@ -1,51 +0,0 @@
-describe('unit test:user dao', function () {
-
-    var userDao;
-    var RESOURCE;
-    var server;
-    var userParams =  {
-        "name": "idan",
-        "email": "idanaim at gmail.com",
-        "admin": false,
-        "profileUpdatable": true,
-        "internalPasswordDisabled": false
-    };
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        userDao = $injector.get('UserDao').getInstance();
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('groupDao should return a resource object', function () {
-        expect(userDao.name).toBe('Resource');
-    });
-    //
-    it('send an update request with user dao ', function () {
-        server.expectPUT(RESOURCE.API_URL + RESOURCE.USERS + "/idan").respond(200);
-        userDao.update(userParams);
-        server.flush();
-    });
-
-    it('send a get request  with user dao ', function () {
-        server.expectGET(RESOURCE.API_URL + RESOURCE.USERS).respond(200);
-        userDao.get();
-        server.flush();
-    });
-
-    it('send a get request  with user dao ', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.USERS).respond(200);
-        userDao.save(userParams);
-        server.flush();
-    });
-
-    it('send delete request with user dao', function () {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.USERS +"/userDelete", userParams).respond(200);
-        userDao.delete(userParams);
-        server.flush();
-    });
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/dao/user_profile_dao.spec.js b/web/angular-web/src/main/webapp/specs/dao/user_profile_dao.spec.js
deleted file mode 100644
index f058499..0000000
--- a/web/angular-web/src/main/webapp/specs/dao/user_profile_dao.spec.js
+++ /dev/null
@@ -1,42 +0,0 @@
-describe('unit test:user profile dao', function () {
-
-    var userProfileDao;
-    var RESOURCE;
-    var server;
-    var userParams =  {
-        "name": "idan",
-        "email": "idanaim at gmail.com",
-        "admin": false,
-        "profileUpdatable": true,
-        "internalPasswordDisabled": false
-    };
-
-    var userParms = "?admin=false&email=idanaim at gmail.com&internalPasswordDisabled=false&profileUpdatable=true";
-
-    // inject the main module
-    beforeEach(m('artifactory.dao'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        userProfileDao = $injector.get('UserProfileDao');
-        RESOURCE = $injector.get('RESOURCE');
-        server = $injector.get('$httpBackend');
-    }));
-
-    it('userProfileDao should return a resource object', function () {
-        expect(userProfileDao.name).toBe('Resource');
-    });
-
-    it('should fetch data', function() {
-        server.expectPOST(RESOURCE.API_URL + RESOURCE.USER_PROFILE).respond(200);
-        userProfileDao.fetch({password: 'password'});
-        server.flush();
-    });
-
-    it('should update data', function() {
-        server.expectPUT(RESOURCE.API_URL + RESOURCE.USER_PROFILE).respond(200);
-        userProfileDao.update({password: 'password'});
-        server.flush();
-    });
-
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/directives/jf_disable_feature.spec.browserify.js b/web/angular-web/src/main/webapp/specs/directives/jf_disable_feature.spec.browserify.js
deleted file mode 100644
index fcac229..0000000
--- a/web/angular-web/src/main/webapp/specs/directives/jf_disable_feature.spec.browserify.js
+++ /dev/null
@@ -1,110 +0,0 @@
-'use strict';
-import FooterMock from '../../mocks/footer_mock.browserify';
-
-let FooterDao, $httpBackend, $scope, divJqueryElement, anchorJqueryElement, $timeout;
-
-describe('unit test:jf_disable_feature directive', () => {
-  function compileDirective(feature) {
-    $scope = compileHtml('<div jf-disable-feature="' + feature + '"><a href="#">first link</a><a href="#">second link</a></div>');
-    $timeout.flush();
-    divJqueryElement = $('[jf-disable-feature]');
-    anchorJqueryElement = $('[jf-disable-feature] a');
-  }
-  
-  function setup(_FooterDao_, _$httpBackend_, _$timeout_) {
-  	FooterDao = _FooterDao_;
-  	$httpBackend = _$httpBackend_;
-  	$timeout = _$timeout_;
-	}
-
-  function getFooterData() {
-  	FooterDao.get(true);
-  	$httpBackend.flush();
-  }
-
-  function expectToBeEnabled() {
-		expect(anchorJqueryElement).not.toHaveAttr('disabled');
-		expect(divJqueryElement).not.toHaveClass('license-required');
-  }
-
-  function expectToBeDisabled() {
-		expect(anchorJqueryElement).toHaveAttr('disabled');
-  }
-
-  function expectToHaveClass(license) {
-		expect(divJqueryElement).toHaveClass('license-required');
-		expect(divJqueryElement).toHaveClass('license-required-' + license);
-  }
-
-  function expectToBeHidden() {
-		expect(anchorJqueryElement).toBeHidden();
-  }
-  function expectToBeVisible() {
-		expect(anchorJqueryElement).toBeVisible();
-  }
-
-  beforeEach(m('artifactory.templates', 'artifactory.directives'));
-  beforeEach(inject(setup));
-
-  describe('OSS license', () => {
-  	new FooterMock().mockOss();
-  	beforeEach(getFooterData);
-	  it('should disable a PRO feature', () => {
-			compileDirective('stash');
-			expectToBeDisabled();
-			expectToHaveClass('PRO');
-	  });
-	  it('should disable an ENT feature', () => {
-			compileDirective('highavailability');
-			expectToBeDisabled();
-			expectToHaveClass('ENT');
-	  });
-	  it('should hide a hidden OSS feature', () => {
-			compileDirective('register_pro');
-			expectToBeHidden();
-	  });
-  });
-
-  describe('PRO license', () => {
-  	new FooterMock().mockPro();
-  	beforeEach(getFooterData);
-	  it('should not disable a PRO feature', () => {
-			compileDirective('stash');
-			expectToBeEnabled();
-	  });
-	  it('should hide an ENT feature', () => {
-			compileDirective('highavailability');
-			expectToBeHidden();
-	  });
-	  it('should not hide a hidden OSS feature', () => {
-			compileDirective('register_pro');
-			expectToBeVisible();
-	  });
-  });
-
-  describe('ENT license', () => {
-  	new FooterMock().mockEnt();
-  	beforeEach(getFooterData);
-	  it('should not disable a PRO feature', () => {
-			compileDirective('stash');
-			expectToBeEnabled();
-	  });
-	  it('should not disable an ENT feature', () => {
-			compileDirective('highavailability');
-			expectToBeEnabled();
-	  });
-	  it('should not hide a hidden OSS feature', () => {
-			compileDirective('register_pro');
-			expectToBeVisible();
-	  });
-  });
-
-  describe('AOL', () => {
-  	new FooterMock().mockAol();
-  	beforeEach(getFooterData);
-	  it('should hide for AOL', () => {
-			compileDirective('backups');
-			expectToBeHidden();
-	  });
-  });
-});
diff --git a/web/angular-web/src/main/webapp/specs/directives/jf_field.spec.browserify.js b/web/angular-web/src/main/webapp/specs/directives/jf_field.spec.browserify.js
deleted file mode 100644
index d87fa6a..0000000
--- a/web/angular-web/src/main/webapp/specs/directives/jf_field.spec.browserify.js
+++ /dev/null
@@ -1,45 +0,0 @@
-'use strict';
-describe('unit test:jf_field directive', function () {
-  var element,
-    inputElement,
-    getErrorElement,
-    buttonElement,
-    $timeout,
-    $scope,
-    ArtifactoryEventBus;
-
-  function setup(_ArtifactoryEventBus_, _$timeout_) {
-      ArtifactoryEventBus = _ArtifactoryEventBus_;
-      $timeout = _$timeout_;
-  }
-
-  function compileDirective() {
-    $scope = compileHtml('<form novalidate><jf-field validations="test"><input required name="name" minlength="0" ng-model="name"/></jf-field><button></button></form>');
-    $scope.$digest();
-    element = $(document.body).find('jf-field');
-    inputElement = element.find('input');
-    buttonElement = $(document.body).find('form');
-    getErrorElement = () => $(document.body).find('[ng-message-exp]');
-  }
-
-  beforeEach(m('artifactory.templates', 'artifactory.directives'));
-  beforeEach(inject(setup));
-  beforeEach(compileDirective);
-
-  it('should show elements', function() {
-    expect(element.length).not.toEqual(0);
-    expect(buttonElement.length).not.toEqual(0);
-    expect(inputElement.length).not.toEqual(0);
-  });
-
-  it('should not show error', function() {
-    expect(getErrorElement().length).toEqual(0);
-  });
-
-  it('should show error after submitting', function() {
-    $(inputElement).trigger('blur');
-    $scope.$digest();
-    $timeout.flush();
-    expect(getErrorElement().length).not.toEqual(0);
-  });
-});
diff --git a/web/angular-web/src/main/webapp/specs/directives/jf_grid.spec.browserify.js b/web/angular-web/src/main/webapp/specs/directives/jf_grid.spec.browserify.js
deleted file mode 100644
index 8188a1c..0000000
--- a/web/angular-web/src/main/webapp/specs/directives/jf_grid.spec.browserify.js
+++ /dev/null
@@ -1,94 +0,0 @@
-import {JFGridElement} from '../page_objects/jf_grid_element.browserify';
-
-let artifactoryGrid, $scope, timeout, element, jfGridElement, actionMock;
-
-describe('jf_grid', () => {
-    function setup(ArtifactoryGridFactory, $rootScope, $timeout) {
-        artifactoryGrid = ArtifactoryGridFactory;
-        $scope = $rootScope.$new();
-        timeout = $timeout;
-    }
-
-    function compileDirective() {
-        actionMock = jasmine.createSpy('actionMock');
-        let data = [{name: 'user', role: 'admin'},{name: 'another user', role: 'worker'}];
-        let columns = [
-            {
-                field: 'name',
-                displayName: 'Name'
-            },
-            {
-                field: 'role',
-                displayName: 'Role',
-                actions: {
-                    delete:  actionMock
-                }
-            }
-        ];
-        window.options = artifactoryGrid.getGridInstance($scope)
-            .setGridData(data)
-            .setColumns(columns)
-            .setRowTemplate('default')
-            .setMultiSelect();
-
-        $scope = compileHtml('<jf-grid filter-field="name" grid-options="options"></jf-grid>', {options: options});
-        jfGridElement = new JFGridElement($('jf-grid'));
-    }
-
-    beforeEach(m('artifactory.templates', 'artifactory.directives', 'artifactory.ui_components'));
-    beforeEach(inject(setup));
-
-    beforeEach(compileDirective);
-
-    it ('should display data', () => {
-        expect(jfGridElement.getCellData(0)).toEqual('user');
-        expect(jfGridElement.getCellData(1)).toEqual('admin');
-    });
-
-    it ('should display counter with number of records', () => {
-        let counterElement = jfGridElement.getCounter();
-        expect(counterElement).toBeDefined();
-        expect(counterElement.text()).toEqual('2 Records');
-    });
-
-    it ('should display pagination', () =>{
-        expect(jfGridElement.getGridPagination().length).toEqual(1);
-    });
-
-    it ('should display actions', () => {
-        expect(jfGridElement.getActions(0).length).toEqual(0);
-        expect(jfGridElement.getActions(1).length).toEqual(1);
-    });
-
-    describe('filter', () => {
-        it ('should filter matching data', () => {
-            jfGridElement.applyFilter('se');
-            timeout.flush();
-            expect(options.api.grid.getVisibleRows().length).toEqual(2);
-            expect(jfGridElement.getCellData(0)).toEqual('user');
-            expect(jfGridElement.getCellData(1)).toEqual('admin');
-        });
-
-        it ('should filter out non matching data', () => {
-            jfGridElement.applyFilter('noth');
-            timeout.flush();
-            expect(options.api.grid.getVisibleRows().length).toEqual(1);
-            expect(jfGridElement.getCellData(0)).toEqual('another user');
-            expect(jfGridElement.getCellData(1)).toEqual('worker');
-
-            jfGridElement.applyFilter('asdfasdf');
-            timeout.flush();
-            expect(options.api.grid.getVisibleRows().length).toEqual(1);
-            expect(options.api.grid.getVisibleRows()[0].entity).toEqual(jasmine.objectContaining({_emptyRow: true}));
-
-            expect(jfGridElement.getCellData(0)).toEqual('');
-            expect(jfGridElement.getCellData(1)).toEqual('');
-        });
-    });
-
-    it ('should call the actions on click', () => {
-        jfGridElement.getActions(1)[0].click();
-        expect(actionMock).toHaveBeenCalled();
-    });
-
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/directives/jf_hide_for_aol.spec.browserify.js b/web/angular-web/src/main/webapp/specs/directives/jf_hide_for_aol.spec.browserify.js
deleted file mode 100644
index 8efbe8b..0000000
--- a/web/angular-web/src/main/webapp/specs/directives/jf_hide_for_aol.spec.browserify.js
+++ /dev/null
@@ -1,49 +0,0 @@
-'use strict';
-import FooterMock from '../../mocks/footer_mock.browserify';
-
-let FooterDao, $httpBackend, $scope, jqueryElement;
-
-describe('unit test:jf_disable_feature directive', () => {
-  function compileDirective() {
-    $scope = compileHtml('<div jf-hide-for-aol></div>');
-    jqueryElement = $('[jf-hide-for-aol]');
-  }
-  
-  function setup(_FooterDao_, _$httpBackend_) {
-  	FooterDao = _FooterDao_;
-  	$httpBackend = _$httpBackend_;
-	}
-
-  function getFooterData() {
-  	FooterDao.get(true);
-  	$httpBackend.flush();
-  }
-
-  function expectToBeHidden() {
-		expect(jqueryElement).toBeHidden();
-  }
-  function expectToBeVisible() {
-		expect(jqueryElement).toBeVisible();
-  }
-
-  beforeEach(m('artifactory.templates', 'artifactory.directives'));
-  beforeEach(inject(setup));
-
-  describe('AOL', () => {
-  	new FooterMock().mockAol();
-  	beforeEach(getFooterData);
-	  it('should hide the element', () => {
-			compileDirective();
-			expectToBeHidden();
-	  });
-  });
-
-  describe('not AOL', () => {
-  	new FooterMock();
-  	beforeEach(getFooterData);
-	  it('should not hide the element', () => {
-			compileDirective();
-			expectToBeVisible();
-	  });
-  });
-});
diff --git a/web/angular-web/src/main/webapp/specs/directives/jf_simple_browser.spec.browserify.js b/web/angular-web/src/main/webapp/specs/directives/jf_simple_browser.spec.browserify.js
deleted file mode 100644
index 2c44208..0000000
--- a/web/angular-web/src/main/webapp/specs/directives/jf_simple_browser.spec.browserify.js
+++ /dev/null
@@ -1,327 +0,0 @@
-'use strict';
-import StateParamsMock from '../../mocks/state_params_mock.browserify';
-import UserMock from '../../mocks/user_mock.browserify';
-import TreeNodeMock from '../../mocks/tree_node_mock.browserify';
-import JsTreeObject from '../page_objects/js_tree_object.browserify';
-import mockStorage from '../../mocks/artifactory_storage_mock.browserify';
-import EVENTS     from '../../app/constants/artifacts_events.constants';
-import KEYS       from '../../app/constants/keys.constants';
-describe('unit test:jf_simple_browser directive', () => {
-  let simpleBrowserElement,
-    $scope,
-    $timeout,
-    httpBackend,
-    RESOURCE,
-    TreeBrowserDao,
-    repo1,
-    repo2,
-    child,
-    jsTreeObject,
-    stateParams,
-    ArtifactoryEventBus,
-    ArtifactoryState;
-
-  mockStorage();
-
-  function setup(_TreeBrowserDao_, TreeNode, _$timeout_, $httpBackend, _RESOURCE_, _ArtifactoryEventBus_, _ArtifactoryState_) {
-      httpBackend = $httpBackend;
-      RESOURCE = _RESOURCE_;
-      $timeout = _$timeout_;
-      TreeBrowserDao = _TreeBrowserDao_;
-      repo1 = new TreeNode(TreeNodeMock.repo('repo1'));
-      repo2 = new TreeNode(TreeNodeMock.repo('repo2'));
-      child = new TreeNode(TreeNodeMock.file({text: 'file', path: 'file'}));
-      ArtifactoryEventBus = _ArtifactoryEventBus_;
-      ArtifactoryState = _ArtifactoryState_;
-      spyOn(ArtifactoryEventBus, 'dispatch').and.callThrough();
-      UserMock.mockCurrentUser();      
-  }
-
-  function compileDirective() {
-    $scope = compileHtml('<jf-simple-browser></jf-simple-browser>');
-    flush();
-    simpleBrowserElement = angular.element(document.body).find('jf-simple-browser')[0];
-    jsTreeObject = new JsTreeObject();
-  }
-
-  function twoDotsItem() {
-    return jsTreeObject.getNodeWithText(/\.\./);
-  }
-  function repo1Item() {
-    return jsTreeObject.getNodeWithText('repo1');
-  }
-  function repo2Item() {
-    return jsTreeObject.getNodeWithText('repo2');
-  }
-  function fileItem() {
-    return jsTreeObject.getNodeWithText('file');
-  }
-
-  function flush() {
-      httpBackend.flush();
-  }
-
-  function drillDownRepo1() {
-    repo1.expectGetChildren([child]);
-    repo1Item().click();
-    flush();
-  }
-
-  beforeEach(m('artifactory.templates', 'artifactory.states'));
-  beforeEach(() => {
-    stateParams = {};
-    StateParamsMock(stateParams);
-  });
-
-  beforeEach(inject(setup));
-
-  beforeEach(() => {
-    TreeNodeMock.expectGetFooterData();
-  });
-  beforeEach(() => {
-    TreeNodeMock.expectGetRoots();
-  });
-
-  describe('with no artifact in stateParams', () => {
-    beforeEach(compileDirective);
-
-    it('should show tree', () => {
-      expect(simpleBrowserElement).toBeDefined();
-      expect(repo1Item()).toBeDefined();
-      expect(repo2Item()).toBeDefined();
-      expect(fileItem()).not.toBeDefined();
-      expect(twoDotsItem()).not.toBeDefined();
-    });
-
-    it('should allow to drill down to a repo', (done) => {
-      drillDownRepo1();
-      expect(repo1Item()).toBeDefined();
-      expect(fileItem()).toBeDefined();
-      expect(repo2Item()).not.toBeDefined();
-      TreeBrowserDao.getRoots()
-        .then((roots) => {
-          expect(ArtifactoryEventBus.dispatch).toHaveBeenCalledWith('tree:node:select', {data: roots[0]});
-          done();
-        });
-      $scope.$digest();
-    });
-
-    it('should not drill down to a file', (done) => {
-      drillDownRepo1();
-      child.expectLoad(TreeNodeMock.data());
-      fileItem().click();
-      flush();
-      expect(repo1Item()).toBeDefined();
-      expect(fileItem()).toBeDefined();
-      TreeBrowserDao.getRoots()
-        .then((roots) => {
-          return roots[0].getChildren();
-        })
-        .then((children) => {
-          expect(ArtifactoryEventBus.dispatch).toHaveBeenCalledWith('tree:node:select', {data: children[0]});
-          done();
-        });
-      $scope.$digest();
-    });
-
-    it('should allow to go up', () => {
-      drillDownRepo1();
-      twoDotsItem().click();
-      $scope.$digest();
-      expect(repo1Item()).toBeDefined();
-      expect(repo2Item()).toBeDefined();
-    });
-  });
-  describe('with artifact in stateParams, tree untouched', () => {
-    beforeEach(() => {
-      stateParams.artifact = 'repo1';
-      compileDirective();
-    });
-    it('should activate repo1 but not drill down', (done) => {
-      expect(simpleBrowserElement).toBeDefined();
-      expect(repo1Item()).toBeDefined();
-      expect(repo2Item()).toBeDefined();
-      expect(fileItem()).not.toBeDefined();
-      expect(twoDotsItem()).not.toBeDefined();
-      expect($(repo1Item())).toHaveClass('jstree-clicked');
-      TreeBrowserDao.getRoots()
-        .then((roots) => {
-          expect(ArtifactoryEventBus.dispatch).toHaveBeenCalledWith('tree:node:select', {data: roots[0]});
-          done();
-        });
-      $scope.$digest();
-    });
-  });
-  describe('with artifact state, tree touched', () => {
-    beforeEach(() => {
-      ArtifactoryState.setState('tree_touched', true);
-      stateParams.artifact = 'repo1';
-      repo1.expectGetChildren([child]);
-      compileDirective();
-    });
-    it('should activate repo1 & drill down into it', (done) => {
-      expect(simpleBrowserElement).toBeDefined();
-      expect(repo1Item()).toBeDefined();
-      expect(fileItem()).toBeDefined();
-      expect(repo2Item()).not.toBeDefined();
-      expect(twoDotsItem()).toBeDefined();
-      expect($(repo1Item())).toHaveClass('jstree-clicked');
-      TreeBrowserDao.getRoots()
-        .then((roots) => {
-          expect(ArtifactoryEventBus.dispatch).toHaveBeenCalledWith('tree:node:select', {data: roots[0]});
-          done();
-        });
-      $scope.$digest();
-    });
-  });
-  describe('with artifact in stateParams of file', () => {
-    beforeEach(() => {
-      stateParams.artifact = 'repo1/file';
-      repo1.expectGetChildren([child]);
-      child.expectLoad();
-      compileDirective();
-    });
-    it('should activate repo1/file', (done) => {
-      expect(simpleBrowserElement).toBeDefined();
-      expect(repo1Item()).toBeDefined();
-      expect(repo2Item()).not.toBeDefined();
-      expect(fileItem()).toBeDefined();
-      expect(twoDotsItem()).toBeDefined();
-      expect($(fileItem())).toHaveClass('jstree-clicked');
-      TreeBrowserDao.getRoots()
-        .then((roots) => {
-          return roots[0].getChildren();
-        })
-        .then((children) => {
-          expect(ArtifactoryEventBus.dispatch).toHaveBeenCalledWith('tree:node:select', {data: children[0]});
-          done();
-        });
-      $scope.$digest();
-    });
-  });
-  describe('events', () => {
-    beforeEach(compileDirective);
-    describe('search', () => {
-      beforeEach(() => {
-        ArtifactoryEventBus.dispatch(EVENTS.TREE_SEARCH_CHANGE, "rep");
-      });
-      it('should mark search results', () => {
-        $timeout(()=>{
-          expect($(repo1Item())).toHaveClass('jstree-search');
-          expect($(repo2Item())).toHaveClass('jstree-search');
-          expect($(repo1Item())).not.toHaveClass('jstree-hovered');
-          expect($(repo2Item())).toHaveClass('jstree-hovered');
-        },500)
-      });
-      it('should search next result when pressing arrow key down', () => {
-        $timeout(()=>{
-          ArtifactoryEventBus.dispatch(EVENTS.TREE_SEARCH_KEYDOWN, KEYS.DOWN_ARROW);
-          expect($(repo1Item())).toHaveClass('jstree-hovered');
-          expect($(repo2Item())).not.toHaveClass('jstree-hovered');
-        },500)
-      });
-      it('should search next result when pressing arrow key up', () => {
-        $timeout(()=>{
-          ArtifactoryEventBus.dispatch(EVENTS.TREE_SEARCH_KEYDOWN, KEYS.UP_ARROW);
-          expect($(repo1Item())).toHaveClass('jstree-hovered');
-          expect($(repo2Item())).not.toHaveClass('jstree-hovered');
-        },500)
-      });
-      it('should cancel search', () => {
-        ArtifactoryEventBus.dispatch(EVENTS.TREE_SEARCH_CANCEL);
-        expect($(repo1Item())).not.toHaveClass('jstree-search');
-        expect($(repo2Item())).not.toHaveClass('jstree-search');
-      });
-    });
-    it('should drill down to repo after deploy', () => {
-      repo1.expectGetChildren([child]);
-      ArtifactoryEventBus.dispatch(EVENTS.ACTION_DEPLOY, "repo1");
-      flush();
-      expect(repo1Item()).toBeDefined();
-      expect(fileItem()).toBeDefined();
-      expect(repo2Item()).not.toBeDefined();
-    });
-    it('should reload node after refresh', (done) => {
-      drillDownRepo1();
-      repo1.expectGetChildren([child]);
-      TreeBrowserDao.getRoots()
-        .then((roots) => {
-          ArtifactoryEventBus.dispatch(EVENTS.ACTION_REFRESH, roots[0]);
-          done();
-        });
-      $scope.$digest();
-    });
-    it('should go up after delete', (done) => {
-      drillDownRepo1();
-      TreeNodeMock.expectGetRoots();
-      TreeBrowserDao.getRoots()
-        .then((roots) => {
-          ArtifactoryEventBus.dispatch(EVENTS.ACTION_DELETE, roots[0]);
-          setTimeout(() => { // Must put in timeout, because can't call $timeout.flush when digest is going on
-            $timeout.flush();
-            expect(repo1Item()).toBeDefined();
-            expect(repo2Item()).toBeDefined();
-            done();
-          });
-        });
-      $scope.$digest();
-    });
-    let targetOptions = {
-      target: {
-        targetRepoKey: 'repo1',
-        targetPath: '',
-      },
-      node: {
-        data: {
-          text: 'file'
-        }
-      }
-    };
-    it('should open target node after move', () => {
-      ArtifactoryState.setState('tree_touched', true);
-      TreeNodeMock.expectGetRoots();
-      repo1.expectGetChildren([child]);
-      child.expectLoad(TreeNodeMock.data());
-      ArtifactoryEventBus.dispatch(EVENTS.ACTION_MOVE, targetOptions);
-      $timeout.flush();
-      flush();
-      expect(repo1Item()).toBeDefined();
-      expect(fileItem()).toBeDefined();
-      expect(repo2Item()).not.toBeDefined();
-      expect($(fileItem())).toHaveClass('jstree-clicked');
-    });
-
-    it('should open target node after copy', () => {
-      ArtifactoryState.setState('tree_touched', true);
-      TreeNodeMock.expectGetRoots();
-      repo1.expectGetChildren([child]);
-      child.expectLoad(TreeNodeMock.data());
-      ArtifactoryEventBus.dispatch(EVENTS.ACTION_COPY, targetOptions);
-      $timeout.flush();
-      flush();
-      expect(repo1Item()).toBeDefined();
-      expect(fileItem()).toBeDefined();
-      expect(repo2Item()).not.toBeDefined();
-      expect($(fileItem())).toHaveClass('jstree-clicked');
-    });
-
-    it('should reload node after refresh', () => {
-      TreeNodeMock.expectGetRoots();
-      ArtifactoryEventBus.dispatch(EVENTS.TREE_COMPACT);
-      flush();
-      expect(repo1Item()).toBeDefined();
-      expect(repo2Item()).toBeDefined();
-      expect(fileItem()).not.toBeDefined();
-    });
-    it('should reload node after change url', () => {
-      repo1.expectGetChildren([child]);
-      child.expectLoad(TreeNodeMock.data());
-      ArtifactoryEventBus.dispatch(EVENTS.ARTIFACT_URL_CHANGED, {browser: 'simple', artifact: 'repo1/file'});
-      flush();
-      expect(repo1Item()).toBeDefined();
-      expect(repo2Item()).not.toBeDefined();
-      expect(fileItem()).toBeDefined();
-      expect($(fileItem())).toHaveClass('jstree-clicked');
-    });
-  });
-});
diff --git a/web/angular-web/src/main/webapp/specs/directives/jf_switch.spec.browserify.js b/web/angular-web/src/main/webapp/specs/directives/jf_switch.spec.browserify.js
deleted file mode 100644
index 72a5803..0000000
--- a/web/angular-web/src/main/webapp/specs/directives/jf_switch.spec.browserify.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * Created by idannaim on 8/12/15.
- */
-'use strict';
-import {JfSwitchElement} from './../page_objects/jf_switch_element.browserify'
-let scope;
-describe('unit test:jf_switch directive', function () {
-
-    let jfSwitchElement = new JfSwitchElement();
-    beforeEach(m('artifactory.templates', 'artifactory.directives'));
-
-    describe('with objects options', () => {
-        beforeEach(() => {
-            var switchedOptions = [{text: 'One', value: 1}, {text: 'Two', value: 2}, {text: 'Three', value: 3}];
-
-            scope = compileHtml('<jf-switch options="switchedOptions" ng-model="selectedSwitch"></jf-switch>',
-                    {switchedOptions: switchedOptions, selectedSwitch: 1});
-        });
-
-        it('should create the options', () => {
-            expect(jfSwitchElement.getItem(0).text()).toEqual('One');
-            expect(jfSwitchElement.isActive(0)).toBe(true);
-        });
-
-        it('should select an item after changing the model', ()=> {
-            scope.selectedSwitch = 2;
-            scope.$digest();
-            expect(jfSwitchElement.isActive(1)).toBe(true);
-        });
-    });
-
-    describe('with strings options', ()=> {
-        beforeEach(() => {
-
-            let switchedOptions = ['stringOne', 'stringTwo', 'stringThree'];
-            scope = compileHtml('<jf-switch options="switchedOptions" ng-model="selectedSwitch"></jf-switch>',
-                    {switchedOptions: switchedOptions, selectedSwitch: 'stringOne'});
-        });
-
-        it('should create the options', ()=> {
-            expect(jfSwitchElement.getItem(0).text()).toEqual('stringOne');
-            expect(jfSwitchElement.isActive(0)).toBe(true);
-        });
-
-        it('should select an item after changing the model', ()=> {
-            scope.selectedSwitch = 'stringTwo';
-            scope.$digest();
-            expect(jfSwitchElement.isActive(1)).toBe(true);
-        });
-    });
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/directives/jf_tree_browser.spec.browserify.js b/web/angular-web/src/main/webapp/specs/directives/jf_tree_browser.spec.browserify.js
deleted file mode 100644
index 9d3b436..0000000
--- a/web/angular-web/src/main/webapp/specs/directives/jf_tree_browser.spec.browserify.js
+++ /dev/null
@@ -1,84 +0,0 @@
-'use strict';
-var UserMock = require('../../mocks/user_mock.browserify.js');
-var TreeNodeMock = require('../../mocks/tree_node_mock.browserify.js');
-var JsTreeObject = require('../page_objects/js_tree_object.browserify.js');
-var mockStorage = require('../../mocks/artifactory_storage_mock.browserify.js');
-describe('unit test:jf_tree_browser directive', function () {
-  var element,
-    $scope,
-    httpBackend,
-    RESOURCE,
-    repo1,
-    repo2,
-    child,
-    jsTreeObject,
-    ArtifactoryEventBus;
-
-  mockStorage();
-
-  function setup(TreeBrowserDao, TreeNode, $q, $httpBackend, _RESOURCE_, _ArtifactoryEventBus_) {
-      httpBackend = $httpBackend;
-      RESOURCE = _RESOURCE_;
-      repo1 = new TreeNode(TreeNodeMock.repo('repo1'));
-      repo2 = new TreeNode(TreeNodeMock.repo('repo2'));
-      child = new TreeNode(TreeNodeMock.file({text: 'file'}));
-      ArtifactoryEventBus = _ArtifactoryEventBus_;
-      spyOn(ArtifactoryEventBus, 'dispatch').and.callThrough();
-      UserMock.mockCurrentUser();
-  }
-
-  function compileDirective() {
-    $scope = compileHtml('<jf-tree-browser></jf-tree-browser>');
-    flush();
-    element = angular.element(document.body).find('jf-tree-browser')[0];
-    jsTreeObject = new JsTreeObject();
-  }
-
-  function repo1Item() {
-    return jsTreeObject.getNode(jsTreeObject.getRootItem().children[0]);
-  }
-  function childItem() {
-    return jsTreeObject.getNode(repo1Item().children[0]);
-  }
-
-  function flush() {
-      httpBackend.flush();
-  }
-
-  beforeEach(m('artifactory.templates', 'artifactory.states'));
-  beforeEach(inject(setup));
-  beforeEach(() => {
-    TreeNodeMock.expectGetFooterData();
-  });
-  beforeEach(function() {
-    TreeNodeMock.expectGetRoots();
-  });
-  beforeEach(compileDirective);
-
-  it('should show tree', function() {
-    expect(element).toBeDefined();
-    expect(jsTreeObject.getNodeWithText('repo1')).toBeDefined();
-  });
-  it('should allow to expand a repo', function() {
-    repo1.expectGetChildren([child]);
-    jsTreeObject.expandFirstItem();
-    flush();
-    expect(jsTreeObject.getNodeWithText('file')).toBeDefined();
-  });
-  it('should allow to load a repo and its children on click', function() {
-    repo1.expectGetChildren([child]);
-    jsTreeObject.loadNodeItem('repo1');
-    $scope.$digest();
-    expect(ArtifactoryEventBus.dispatch).toHaveBeenCalledWith('tree:node:select', repo1Item());
-  });
-  it('should allow to load a node', function() {
-    repo1.expectGetChildren([child]);
-    jsTreeObject.expandFirstItem();
-    flush();
-    child.expectLoad(TreeNodeMock.data());
-    jsTreeObject.loadNodeItem('file');
-    flush();
-    expect(ArtifactoryEventBus.dispatch).toHaveBeenCalledWith('tree:node:select', childItem());
-  });
-
-});
diff --git a/web/angular-web/src/main/webapp/specs/directives/jf_ui_select.spec.browserify.js b/web/angular-web/src/main/webapp/specs/directives/jf_ui_select.spec.browserify.js
deleted file mode 100644
index a2bc877..0000000
--- a/web/angular-web/src/main/webapp/specs/directives/jf_ui_select.spec.browserify.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * Created by idannaim on 8/3/15.
- */
-import {JfUiSelectElement} from '../page_objects/jf_ui_select_element.browserify';
-let scope, jfUiSelectElement, $timeout;
-
-describe('unit test: jfUiSelect', ()=> {
-    function setup(_$timeout_) {
-        $timeout = _$timeout_;
-    }
-
-    let jfUiSelectElement = new JfUiSelectElement();
-
-    beforeEach(m('artifactory.templates', 'artifactory.directives'));
-    beforeEach(inject(setup));
-
-    it('should filter matching data', ()=> {
-        let dataList = ['admin', 'user'];
-        scope = compileHtml('<jf-ui-select jf-select-model="selected" jf-select-options="dataList"  autofocus  ></jf-ui-select>',
-                {dataList: dataList});
-        jfUiSelectElement.applySelect('ad');
-        $timeout.flush();
-        expect(jfUiSelectElement.getShownItem(0)).toBe('admin');
-    });
-
-
-    it('should filter matching data with display attr', ()=> {
-        let dataList = [{name: 'admin', role: 'admin'}, {name: 'user', role: 'anonymous'}];
-        scope = compileHtml('<jf-ui-select jf-select-model="selected" jf-select-options="dataList" jf-select-display-attr="name" autofocus  ></jf-ui-select>',
-                {dataList: dataList});
-        jfUiSelectElement.applySelect('ad');
-        $timeout.flush();
-        expect(jfUiSelectElement.getShownItem(0)).toBe('admin');
-    });
-
-    it('should filter matching data with display func', ()=> {
-        let dataList = [{name: 'admin', role: 'admin'}, {name: 'user', role: 'anonymous'}];
-
-        function myFunc(item) {
-            return item.name + ": " + item.role
-        }
-
-        scope = compileHtml('<jf-ui-select jf-select-model="selected" jf-select-options="dataList" jf-select-display-func="myFunc($item)" autofocus></jf-ui-select>',
-                {dataList: dataList, myFunc: myFunc});
-        jfUiSelectElement.applySelect('ad');
-        $timeout.flush();
-        expect(jfUiSelectElement.getShownItem(0)).toBe('admin: admin');
-    });
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/page_objects/jf_grid_element.browserify.js b/web/angular-web/src/main/webapp/specs/page_objects/jf_grid_element.browserify.js
deleted file mode 100644
index 892888d..0000000
--- a/web/angular-web/src/main/webapp/specs/page_objects/jf_grid_element.browserify.js
+++ /dev/null
@@ -1,32 +0,0 @@
-export class JFGridElement {
-	constructor(element) {
-		this.element = element;
-	}
-
-	getCell(index) {
-		return $('.ui-grid-render-container-body .ui-grid-cell').eq(index);
-	}
-
-	getCellData(index) {
-		return this.getCell(index).find('.ui-grid-cell-contents').text();
-	}
-
-	getActions(index) {
-		return this.getCell(index)
-			.find('.grid-action-bar .btn-action');
-	}
-
-	getGridPagination() {
-		return $('.grid-pagination');
-	}
-	getCounter() {
-		return $('.grid-counter');
-	}
-
-	applyFilter(text) {
-		let input = $('jf-grid-filter input[type=text]');
-		input.val(text);
-		let ngModelController = angular.element(input).controller('ngModel');
-  		ngModelController.$setViewValue(text);
-	}
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/page_objects/jf_switch_element.browserify.js b/web/angular-web/src/main/webapp/specs/page_objects/jf_switch_element.browserify.js
deleted file mode 100644
index 5ab77c5..0000000
--- a/web/angular-web/src/main/webapp/specs/page_objects/jf_switch_element.browserify.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * Created by idannaim on 8/12/15.
- */
-export class JfSwitchElement {
-
-    getItem(index) {
-        return $($('.jf-switch-options li')[index]).find('a');
-    }
-
-    isActive(index) {
-        return this.getItem(index).hasClass('active');
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/page_objects/jf_ui_select_element.browserify.js b/web/angular-web/src/main/webapp/specs/page_objects/jf_ui_select_element.browserify.js
deleted file mode 100644
index 7812cce..0000000
--- a/web/angular-web/src/main/webapp/specs/page_objects/jf_ui_select_element.browserify.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * Created by idannaim on 8/3/15.
- */
-export class JfUiSelectElement {
-    setSearchText(el, text) {
-        el.scope().$select.search = text;
-        scope.$digest();
-        $timeout.flush();
-    }
-
-    _openDropdown(el) {
-        let scope = angular.element(el).scope();
-        let $select = scope.$select;
-        $select.open = true;
-        scope.$digest();
-    }
-
-
-    applySelect(text) {
-        let input = $('jf-ui-select input[type=text]');
-
-        input.val(text);
-        let ngModelController = angular.element(input).controller('ngModel');
-        ngModelController.$setViewValue(text);
-        this._openDropdown($('jf-ui-select .ui-select-container'));
-    }
-
-    getItem(index) {
-        return $('.ui-select-choices-row-inner').eq(index);
-    }
-
-    getShownItem(index) {
-        return this.getItem(index).text().trim();
-    }
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/page_objects/js_tree_object.browserify.js b/web/angular-web/src/main/webapp/specs/page_objects/js_tree_object.browserify.js
deleted file mode 100644
index fa56941..0000000
--- a/web/angular-web/src/main/webapp/specs/page_objects/js_tree_object.browserify.js
+++ /dev/null
@@ -1,27 +0,0 @@
-'use strict';
-function JsTreeObject(jsTreeElement) {
-  this.jstree = function() {
-    return $('.jstree').jstree();
-  }
-  this.getNode = function(node) {
-    return this.jstree().get_node(node);
-  };
-  
-  this.expandFirstItem = function() {
-    $('.jstree-node:first-child .jstree-ocl').click();
-  };
-
-  this.loadNodeItem = function(text) {
-    this.getNodeWithText(text).click();
-  };
-
-  this.getNodeWithText = function(text) {
-    return _.find($('.jstree-anchor'), function(el) {
-      return $(el).text().match(new RegExp(text));
-    });
-  };
-  this.getRootItem = function() {
-    return this.jstree().get_node('#');
-  }
-}
-module.exports = JsTreeObject;
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/services/artifactory notifications.spec.browserify.js b/web/angular-web/src/main/webapp/specs/services/artifactory notifications.spec.browserify.js
deleted file mode 100644
index 57fa564..0000000
--- a/web/angular-web/src/main/webapp/specs/services/artifactory notifications.spec.browserify.js	
+++ /dev/null
@@ -1,101 +0,0 @@
-/**
- * Created by idannaim on 8/2/15.
- */
-let artifactoryNotifications;
-let toast;
-let timeout;
-describe('Unit test: ArtifactoryNotifications', () => {
-
-
-    beforeEach(m('artifactory.services'));
-    beforeEach(inject(($timeout, ArtifactoryNotifications, toaster) => {
-        toast = toaster;
-        timeout = $timeout;
-        spyOn(toast, 'pop');
-        artifactoryNotifications = ArtifactoryNotifications;
-    }));
-
-    it('should pop success message with options', ()=> {
-        let messageOptions = {
-            type: 'success',
-            timeout: 5000,
-            body: 'my message success',
-            showCloseButton: true,
-            bodyOutputType: undefined,
-            clickHandler: artifactoryNotifications.notifClickHandle
-        };
-        let message = {
-            info: 'my message success'
-        };
-        artifactoryNotifications.create(message);
-        expect(toast.pop).toHaveBeenCalledWith(messageOptions);
-    });
-
-    it('should pop error message with options', ()=> {
-        let message = {error: 'my error message'};
-        let messageOptions = {
-            type: 'error',
-            timeout: 10000,
-            body: 'my error message',
-            showCloseButton: true,
-            bodyOutputType: undefined,
-            clickHandler: artifactoryNotifications.notifClickHandle
-        };
-        artifactoryNotifications.create(message);
-        expect(toast.pop).toHaveBeenCalledWith(messageOptions);
-    });
-
-    it('should pop warn message with options', ()=> {
-        let messageOptions = {
-            type: 'warning',
-            timeout: 4000,
-            body: 'my message warn',
-            showCloseButton: true,
-            bodyOutputType: undefined,
-            clickHandler: artifactoryNotifications.notifClickHandle
-        };
-        let message = {
-            warn: 'my message warn'
-        };
-        artifactoryNotifications.create(message);
-        expect(toast.pop).toHaveBeenCalledWith(messageOptions);
-    });
-
-    it('should pop message with html template', ()=> {
-        let tempHtml = {
-            type: 'success',
-            body: 'test content',
-            timeout: 60 * 60000
-        };
-        artifactoryNotifications.createMessageWithHtml(tempHtml);
-        let tempHtmlOptions = {
-            type: tempHtml.type,
-            body: tempHtml.body,
-            bodyOutputType: 'trustedHtml',
-            timeout: tempHtml.timeout,
-            showCloseButton: true,
-            clickHandler: artifactoryNotifications.notifClickHandle
-        };
-        expect(toast.pop).toHaveBeenCalledWith(tempHtmlOptions);
-    });
-
-    it('should clear all toasts', ()=> {
-        spyOn(toast, 'clear');
-        artifactoryNotifications.clear();
-        expect(toast.clear).toHaveBeenCalled();
-    });
-
-    it('should not have duplicate  toast ', ()=> {
-        let message = {warn: 'my message warn'};
-        artifactoryNotifications.create(message);
-        artifactoryNotifications.create(message);
-        expect(toast.pop.calls.count()).toEqual(1);
-    });
-    it('should show next toast when timeout finish ', ()=> {
-        let message = {warn: 'my message warn'};
-        artifactoryNotifications.create(message);
-        timeout.flush();
-        artifactoryNotifications.create(message);
-        expect(toast.pop.calls.count()).toEqual(2);
-    });
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/services/artifactory_eventBus.spec.js b/web/angular-web/src/main/webapp/specs/services/artifactory_eventBus.spec.js
deleted file mode 100644
index c7fb01c..0000000
--- a/web/angular-web/src/main/webapp/specs/services/artifactory_eventBus.spec.js
+++ /dev/null
@@ -1,85 +0,0 @@
-describe('Unit: Artifactory EventBus Service', function () {
-
-    var scope;
-    var eventBus;
-
-    var EVENT_MOCKS = {
-        EVENT_NAME: 'action:watch',
-        EVENT_NAME2: 'action:copy',
-        CALLBACK_FN: function () {}
-    };
-
-    // inject the main module
-    beforeEach(m('artifactory.services'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector, $rootScope) {
-        scope = $rootScope.$new();
-        eventBus = $injector.get('ArtifactoryEventBus');
-        spyOn(EVENT_MOCKS, 'CALLBACK_FN');
-
-    }));
-
-    it('should be initialized', function () {
-        expect(eventBus).toBeDefined();
-    });
-
-    it('should allow to register and dispatch event', function () {
-        eventBus.register(EVENT_MOCKS.EVENT_NAME, EVENT_MOCKS.CALLBACK_FN);
-        eventBus.dispatch(EVENT_MOCKS.EVENT_NAME);
-        expect(EVENT_MOCKS.CALLBACK_FN).toHaveBeenCalled();
-    });
-
-    it('should allow to register events on scope and dispatch event', function () {
-        eventBus.registerOnScope(scope, EVENT_MOCKS.EVENT_NAME, EVENT_MOCKS.CALLBACK_FN);
-        eventBus.dispatch(EVENT_MOCKS.EVENT_NAME);
-        expect(EVENT_MOCKS.CALLBACK_FN).toHaveBeenCalled();
-    });
-
-    it('should allow to register multiple events on scope and dispatch event', function () {
-        eventBus.registerOnScope(scope, [EVENT_MOCKS.EVENT_NAME, EVENT_MOCKS.EVENT_NAME2], EVENT_MOCKS.CALLBACK_FN);
-        eventBus.dispatch(EVENT_MOCKS.EVENT_NAME2);
-        expect(EVENT_MOCKS.CALLBACK_FN).toHaveBeenCalled();
-        eventBus.dispatch(EVENT_MOCKS.EVENT_NAME);
-        expect(EVENT_MOCKS.CALLBACK_FN).toHaveBeenCalled();
-    });
-
-    it('should be able to deregister a callback', function () {
-        var deregisterFunction = eventBus.register(EVENT_MOCKS.EVENT_NAME, EVENT_MOCKS.CALLBACK_FN);
-        deregisterFunction();
-        try {
-            eventBus.dispatch(EVENT_MOCKS.EVENT_NAME);
-        } catch(e) {}
-        expect(EVENT_MOCKS.CALLBACK_FN).not.toHaveBeenCalled();
-    });
-
-    it('should be able to deregister a callback on multiple events', function () {
-        var deregisterFunctions = eventBus.register([EVENT_MOCKS.EVENT_NAME, EVENT_MOCKS.EVENT_NAME2], EVENT_MOCKS.CALLBACK_FN);
-        deregisterFunctions[0]();
-        try {
-            eventBus.dispatch(EVENT_MOCKS.EVENT_NAME);
-        } catch(e) {}
-        expect(EVENT_MOCKS.CALLBACK_FN).not.toHaveBeenCalled();
-        eventBus.dispatch(EVENT_MOCKS.EVENT_NAME2);
-        expect(EVENT_MOCKS.CALLBACK_FN).toHaveBeenCalled();
-    });
-
-    it('should deregister automatically on scope destroy', function () {
-        eventBus.registerOnScope(scope, EVENT_MOCKS.EVENT_NAME, EVENT_MOCKS.CALLBACK_FN);
-        scope.$destroy();
-        try {
-            eventBus.dispatch(EVENT_MOCKS.EVENT_NAME);
-        } catch(e) {}
-        expect(EVENT_MOCKS.CALLBACK_FN).not.toHaveBeenCalled();
-    });
-    it('should deregister automatically on scope destroy with multiple events', function () {
-        eventBus.registerOnScope(scope, [EVENT_MOCKS.EVENT_NAME, EVENT_MOCKS.EVENT_NAME2], EVENT_MOCKS.CALLBACK_FN);
-        scope.$destroy();
-        try {
-            eventBus.dispatch(EVENT_MOCKS.EVENT_NAME);
-            eventBus.dispatch(EVENT_MOCKS.EVENT_NAME2);
-        } catch(e) {}
-        expect(EVENT_MOCKS.CALLBACK_FN).not.toHaveBeenCalled();
-    });
-
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/services/artifactory_features.spec.browserify.js b/web/angular-web/src/main/webapp/specs/services/artifactory_features.spec.browserify.js
deleted file mode 100644
index 6a5fe88..0000000
--- a/web/angular-web/src/main/webapp/specs/services/artifactory_features.spec.browserify.js
+++ /dev/null
@@ -1,111 +0,0 @@
-'use strict';
-import FooterMock from '../../mocks/footer_mock.browserify';
-describe('ArtifactoryFeatures', () => {
-	let ArtifactoryFeatures;
-
-	beforeEach(m('artifactory.services', 'artifactory.dao'));
-	function setup(_ArtifactoryFeatures_) {
-		ArtifactoryFeatures = _ArtifactoryFeatures_;
-	}
-  function getFooterData(FooterDao, $httpBackend) {
-  	FooterDao.get(true);
-  	$httpBackend.flush();
-  }
-	beforeEach(inject(setup));
-
-	describe('OSS', () => {
-		new FooterMock().mockOss();
-		beforeEach(inject(getFooterData));
-		it('isDisabled should return false for OSS feature', () => {
-			expect(ArtifactoryFeatures.isDisabled('Ruby')).toBeFalsy();
-		});
-		it('isDisabled should return true for PRO feature', () => {
-			expect(ArtifactoryFeatures.isDisabled('NuGet')).toBeTruthy();
-		});
-		it('isDisabled should return true for ENT feature', () => {
-			expect(ArtifactoryFeatures.isDisabled('highAvailability')).toBeTruthy();
-		});
-		it('isHidden should return true for hidden OSS feature', () => {
-			expect(ArtifactoryFeatures.isHidden('register_pro')).toBeTruthy();
-		});
-		it('isHidden should return false for non hidden OSS feature', () => {
-			expect(ArtifactoryFeatures.isHidden('highAvailability')).toBeFalsy();
-		});
-	});
-
-	describe('PRO', () => {
-		new FooterMock().mockPro()
-		beforeEach(inject(getFooterData));
-		it('isDisabled should return false for OSS feature', () => {
-			expect(ArtifactoryFeatures.isDisabled('Ruby')).toBeFalsy();
-		});
-		it('isDisabled should return false for PRO feature', () => {
-			expect(ArtifactoryFeatures.isDisabled('NuGet')).toBeFalsy();
-		});
-		it('isDisabled should return true for ENT feature', () => {
-			expect(ArtifactoryFeatures.isDisabled('highAvailability')).toBeTruthy();
-		});
-		it('isHidden should return false for hidden OSS feature', () => {
-			expect(ArtifactoryFeatures.isHidden('register_pro')).toBeFalsy();
-		});
-		it('isHidden should return false for non hidden OSS feature', () => {
-			expect(ArtifactoryFeatures.isHidden('highAvailability')).toBeFalsy();
-		});
-	});
-
-	describe('ENT', () => {
-		new FooterMock().mockEnt();
-		beforeEach(inject(getFooterData));
-		it('isDisabled should return false for OSS feature', () => {
-			expect(ArtifactoryFeatures.isDisabled('Ruby')).toBeFalsy();
-		});
-		it('isDisabled should return false for PRO feature', () => {
-			expect(ArtifactoryFeatures.isDisabled('NuGet')).toBeFalsy();
-		});
-		it('isDisabled should return false for ENT feature', () => {
-			expect(ArtifactoryFeatures.isDisabled('highAvailability')).toBeFalsy();
-		});
-		it('isHidden should return false for hidden OSS feature', () => {
-			expect(ArtifactoryFeatures.isHidden('register_pro')).toBeFalsy();
-		});
-		it('isHidden should return false for non hidden OSS feature', () => {
-			expect(ArtifactoryFeatures.isHidden('highAvailability')).toBeFalsy();
-		});
-	});
-
-	describe('offline', () => {
-		new FooterMock();
-		beforeEach(inject(getFooterData));
-		it('isHidden should return false for hidden AOL feature', () => {
-			expect(ArtifactoryFeatures.isHidden('backups')).toBeFalsy();
-		});
-		it('isHidden should return false for non-hidden AOL feature', () => {
-			expect(ArtifactoryFeatures.isHidden('properties')).toBeFalsy();
-		});
-	});
-
-	describe('online', () => {
-		new FooterMock().mockAol();
-		beforeEach(inject(getFooterData));
-		it('isHidden should return true for hidden AOL feature', () => {
-			expect(ArtifactoryFeatures.isHidden('backups')).toBeTruthy();
-		});
-		it('isHidden should return false for non-hidden AOL feature', () => {
-			expect(ArtifactoryFeatures.isHidden('properties')).toBeFalsy();
-		});
-	});
-
-	describe('getAllowedLicense', () => {
-		new FooterMock();
-		beforeEach(inject(getFooterData));
-		it ('should return OSS', () => {
-			expect(ArtifactoryFeatures.getAllowedLicense('Ruby')).toEqual("OSS");
-		});
-		it ('should return PRO', () => {
-			expect(ArtifactoryFeatures.getAllowedLicense('NuGet')).toEqual("PRO");
-		});
-		it ('should return ENT', () => {
-			expect(ArtifactoryFeatures.getAllowedLicense('highAvailability')).toEqual("ENT");
-		});
-	});
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/services/artifactory_http_client.spec.browserify.js b/web/angular-web/src/main/webapp/specs/services/artifactory_http_client.spec.browserify.js
deleted file mode 100644
index df8f96d..0000000
--- a/web/angular-web/src/main/webapp/specs/services/artifactory_http_client.spec.browserify.js
+++ /dev/null
@@ -1,47 +0,0 @@
-describe('Unit test: ArtifactoryHttpClient', () => {
-	let httpBackend;
-	let ArtifactoryHttpClient;
-	let data = {};
-	beforeEach(m('artifactory.services'));
-	function setup($httpBackend, RESOURCE, _ArtifactoryHttpClient_) {
-		httpBackend = $httpBackend;
-		RESOURCE.API_URL = '/base';
-		ArtifactoryHttpClient = _ArtifactoryHttpClient_;
-	}
-	beforeEach(inject(setup));
-	describe('post', () => {
-		it('should make a post request', () => {
-			httpBackend.expectPOST('/base/path', data, {'Content-Type': 'application/json'});
-			ArtifactoryHttpClient.post('/path', data);
-		});
-
-		it('should allow to extend the headers', () => {
-			httpBackend.expectPOST('/base/path', data, {'Content-Type': 'application/json', 'X-Custom1': 'value'});
-			ArtifactoryHttpClient.post('/path', data, {headers: {'X-Custom1': 'value'}});
-		});
-	});
-
-	describe('put', () => {
-		it('should make a put request', () => {
-			httpBackend.expectPUT('/base/path', data, {'Content-Type': 'application/json'});
-			ArtifactoryHttpClient.put('/path', data);
-		});
-
-		it('should allow to extend the headers', () => {
-			httpBackend.expectPUT('/base/path', data, {'Content-Type': 'application/json', 'X-Custom1': 'value'});
-			ArtifactoryHttpClient.put('/path', data, {headers: {'X-Custom1': 'value'}});
-		});
-	});
-
-	describe('get', () => {
-		it('should make a get request', () => {
-			httpBackend.expectGET('/base/path', {'Content-Type': 'application/json'});
-			ArtifactoryHttpClient.get('/path');
-		});
-
-		it('should allow to extend the headers', () => {
-			httpBackend.expectGET('/base/path', {'Content-Type': 'application/json', 'X-Custom1': 'value'});
-			ArtifactoryHttpClient.get('/path', {headers: {'X-Custom1': 'value'}});
-		});
-	});
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/services/artifactory_modal.spec.browserify.js b/web/angular-web/src/main/webapp/specs/services/artifactory_modal.spec.browserify.js
deleted file mode 100644
index be7619c..0000000
--- a/web/angular-web/src/main/webapp/specs/services/artifactory_modal.spec.browserify.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * Created by idannaim on 8/3/15.
- */
-let artifactoryModal, modal, scope;
-let modalInstanceMock = {};
-describe('unit test: ArtifactoryModal', ()=> {
-
-    beforeEach(m('artifactory.services'));
-    beforeEach(inject(($modal, $rootScope, ArtifactoryModal) => {
-        artifactoryModal = ArtifactoryModal;
-        modal = $modal;
-        scope = $rootScope.$new();
-        spyOn(modal, 'open').and.returnValue(modalInstanceMock);
-    }));
-    it('should open modal', ()=> {
-        artifactoryModal.launchModal('user_modal', scope);
-        expect(modal.open).toHaveBeenCalled();
-    });
-    it('should open modal', ()=> {
-        let response = artifactoryModal.launchModal('user_modal', scope);
-        expect(response).toBe(modalInstanceMock);
-    });
-
-    it('should set default size', ()=> {
-        artifactoryModal.launchModal('user_modal', scope);
-        let option = {
-            templateUrl: 'ui_components/artifactory_modal/templates/user_modal.html',
-            scope: scope,
-            size: 'lg'
-        };
-        expect(modal.open).toHaveBeenCalledWith(option);
-    });
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/services/artifactory_session_interceptor.spec.browserify.js b/web/angular-web/src/main/webapp/specs/services/artifactory_session_interceptor.spec.browserify.js
deleted file mode 100644
index f7c0750..0000000
--- a/web/angular-web/src/main/webapp/specs/services/artifactory_session_interceptor.spec.browserify.js
+++ /dev/null
@@ -1,154 +0,0 @@
-import UserMock from '../../mocks/user_mock.browserify.js';
-describe('Unit: User Service', function () {
-    var User;
-    var ArtifactoryEventBus;
-    var ArtifactoryState;
-    var $state;
-    var RESOURCE;
-    var sessionInterceptor;
-    var path = 'path';
-    var res = {
-        headers:null,
-        config: {
-            url: null
-        }
-    };
-
-    var USER_KEY = 'USER';
-
-    function mockSessionValid(value) {
-        res.headers = function() {
-            return {sessionvalid: value && 'true' || 'false'};
-        };
-    }
-
-    function mockApiRequest(value) {
-        res.config.url = value && RESOURCE.API_URL || '';
-    }
-
-    function setup(_User_, _ArtifactoryEventBus_, _$state_, _RESOURCE_, artifactorySessionInterceptor, $location, _ArtifactoryState_) {
-        RESOURCE = _RESOURCE_;
-        ArtifactoryState = _ArtifactoryState_;
-    	User = _User_;
-    	ArtifactoryEventBus = _ArtifactoryEventBus_;
-    	$state = _$state_;
-        sessionInterceptor = artifactorySessionInterceptor;
-    	spyOn(ArtifactoryEventBus, 'dispatch');
-        spyOn(ArtifactoryState, 'setState');
-    	spyOn($state, 'go');
-        spyOn($location, 'path').and.returnValue(path);
-    }
-
-    function mockGuest(isGuest) {
-        var user = isGuest ? UserMock.guest() : new UserMock();
-        user.mockUserMethods();
-    }
-
-    function expectExpireSession() {
-        it('should reload the user from localstorage', function() {
-            expect(User.loadUser).toHaveBeenCalled();
-        });
-        it('should reload user from server', function() {
-            expect(User.loadUser).toHaveBeenCalledWith(true);
-        });
-        it('should send the user to login page', function() {
-            expect($state.go).toHaveBeenCalledWith('login');
-        });
-        it('should save path for after login', function() {
-            expect(ArtifactoryState.setState).toHaveBeenCalledWith('urlAfterLogin', path);
-        });
-    }
-
-    function expectNotExpireSession() {
-        it('should not reload user from server', function() {
-            expect(User.loadUser).not.toHaveBeenCalledWith(true);
-        });
-        it('should save path for after login', function() {
-            expect(ArtifactoryState.setState).not.toHaveBeenCalled();
-        });
-        it('should not send the user to login page', function() {
-            expect($state.go).not.toHaveBeenCalled();
-        });
-    }
-
-    // inject the services module
-    beforeEach(m('artifactory.services'));
-    beforeEach(inject(setup));
-
-    describe('session expired', function() {
-        beforeEach(function() {
-            mockGuest(false);
-            mockApiRequest(true);
-            mockSessionValid(false);
-            sessionInterceptor.response(res);
-        });
-        expectExpireSession();
-    });
-    describe('session invalid but was guest', function() {
-        beforeEach(function() {
-            mockGuest(true);
-            mockApiRequest(true);
-            mockSessionValid(false);
-            sessionInterceptor.response(res);
-        });
-        it('should reload the user from localstorage', function() {
-            expect(User.loadUser).toHaveBeenCalled();
-        });
-        expectNotExpireSession();
-    });
-    describe('session invalid but not api request', function() {
-        beforeEach(function() {
-            mockGuest(false);
-            mockApiRequest(false);
-            mockSessionValid(false);
-            sessionInterceptor.response(res);
-        });
-        it('should reload the user from localstorage', function() {
-            expect(User.loadUser).toHaveBeenCalled();
-        });
-        expectNotExpireSession();
-    });
-    describe('session valid', function() {
-        beforeEach(function() {
-            mockGuest(false);
-            mockApiRequest(true);
-            mockSessionValid(true);
-            sessionInterceptor.response(res);
-        });
-        it('should reload the user from localstorage', function() {
-            expect(User.loadUser).toHaveBeenCalled();
-        });
-        expectNotExpireSession();
-    });
-    describe('currently in login page', function() {
-        beforeEach(function() {
-            $state.current = 'login';
-            mockGuest(false);
-            mockApiRequest(true);
-            mockSessionValid(false);
-            sessionInterceptor.response(res);
-        });
-        it('should reload the user from localstorage', function() {
-            expect(User.loadUser).toHaveBeenCalled();
-        });
-        it('should reload user from server', function() {
-            expect(User.loadUser).toHaveBeenCalledWith(true);
-        });
-        it('should not send the user to login page', function() {
-            expect($state.go).not.toHaveBeenCalledWith('login');
-        });
-    });
-    describe('session expired but bypass interceptor', function() {
-        beforeEach(function() {
-            mockGuest(false);
-            mockApiRequest(true);
-            mockSessionValid(true);
-            res.config.bypassSessionInterceptor = true;
-            sessionInterceptor.response(res);
-        });
-        it('should not reload the user from localstorage', function() {
-            expect(User.loadUser).not.toHaveBeenCalled();
-        });
-        expectNotExpireSession();
-    });
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/services/artifactory_state.spec.browserify.js b/web/angular-web/src/main/webapp/specs/services/artifactory_state.spec.browserify.js
deleted file mode 100644
index 06601b6..0000000
--- a/web/angular-web/src/main/webapp/specs/services/artifactory_state.spec.browserify.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * Created by idannaim on 8/2/15.
- */
-let artifactoryState;
-
-describe('Unit test: ArtifactoryState', () => {
-    let mockState = {
-        name: 'test',
-        state: 'myState'
-    };
-    beforeEach(m('artifactory.services'));
-    beforeEach(inject((ArtifactoryState) => {
-        artifactoryState = ArtifactoryState;
-    }));
-
-    it('should save new state', ()=> {
-        artifactoryState.setState(mockState.name, mockState.state);
-
-        expect(artifactoryState.getState(mockState.name)).toEqual(mockState.state);
-    });
-
-    it('should remove saved state', ()=> {
-        artifactoryState.setState(mockState.name, mockState.state);
-        artifactoryState.removeState(mockState.name);
-        expect(artifactoryState.getState(mockState.name)).not.toBeDefined();
-    });
-
-    it('should check if get undefined not get error', ()=> {
-        expect(artifactoryState.getState(mockState.name)).not.toBeDefined();
-    });
-
-    it('should remove all saved states', ()=> {
-        artifactoryState.setState(mockState.name, mockState.state);
-        artifactoryState.clearAll();
-        expect(artifactoryState.getState(mockState.name)).not.toBeDefined();
-    });
-});
-
diff --git a/web/angular-web/src/main/webapp/specs/services/artifactory_storage.spec.js b/web/angular-web/src/main/webapp/specs/services/artifactory_storage.spec.js
deleted file mode 100644
index eb98b81..0000000
--- a/web/angular-web/src/main/webapp/specs/services/artifactory_storage.spec.js
+++ /dev/null
@@ -1,39 +0,0 @@
-describe('Unit: ArtifactoryStorage Service', function () {
-
-    var artifactoryStorage;
-    var TEST_KEY = 'TEST';
-    var ITEM = {uid: 2582};
-
-    // inject the main module
-    beforeEach(m('artifactory.services'));
-
-    // run this code before each case
-    beforeEach(inject(function ($injector) {
-        artifactoryStorage = $injector.get('ArtifactoryStorage');
-    }));
-
-
-    it('artifactoryStorage should be defined', function () {
-        expect(artifactoryStorage).toBeDefined();
-    });
-
-    it('should save and retrieve an object from storage', function () {
-        expect(artifactoryStorage.setItem(TEST_KEY,ITEM)).toEqual(  ITEM)
-    });
-
-    it('should be able to remove an item by key', function () {
-        expect(artifactoryStorage.setItem(TEST_KEY,ITEM)).toEqual(ITEM);
-        artifactoryStorage.removeItem(TEST_KEY);
-        expect(artifactoryStorage.getItem(TEST_KEY)).toBeNull();
-    });
-
-    it('should return default value if not exist', function () {
-        expect(artifactoryStorage.getItem(TEST_KEY, 10)).toBe(10);
-    });
-
-    it('should not return default value if exists', function () {
-        artifactoryStorage.setItem(TEST_KEY,ITEM);
-        expect(artifactoryStorage.getItem(TEST_KEY, 10)).toEqual(ITEM);
-    });
-
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/services/native_browser.spec.browserify.js b/web/angular-web/src/main/webapp/specs/services/native_browser.spec.browserify.js
deleted file mode 100644
index 02528b9..0000000
--- a/web/angular-web/src/main/webapp/specs/services/native_browser.spec.browserify.js
+++ /dev/null
@@ -1,39 +0,0 @@
-import TreeNodeMock from '../../mocks/tree_node_mock.browserify';
-
-describe('native browser', () => {
-	let nativeBrowser, TreeNode;
-	function setup(NativeBrowser, _TreeNode_) {
-		nativeBrowser = NativeBrowser;
-		TreeNode = _TreeNode_;
-	}
-	beforeEach(m('artifactory.services', 'artifactory.dao'));
-	beforeEach(inject(setup));
-	describe('isAllowed', () => {
-		it('should be true for repo', () => {
-			let node = new TreeNode(TreeNodeMock.repo());
-			expect(nativeBrowser.isAllowed(node)).toBe(true);
-		});
-		it('should be true for folder', () => {
-			let node = new TreeNode(TreeNodeMock.folder());
-			expect(nativeBrowser.isAllowed(node)).toBe(true);
-		});
-		it('should be false for file', () => {
-			let node = new TreeNode(TreeNodeMock.file());
-			expect(nativeBrowser.isAllowed(node)).toBe(false);
-		});
-		it('should be false for folder inside archive', () => {
-			let node = new TreeNode(TreeNodeMock.folder({archivePath: 'archive'}));
-			expect(nativeBrowser.isAllowed(node)).toBe(false);
-		});
-	});
-	describe('pathFor', () => {
-		it('should return the path of the native browser', () => {
-			let node = new TreeNode(TreeNodeMock.file({repoKey: 'repo1', path: 'file'}));
-			expect(nativeBrowser.pathFor(node)).toBe('../list/repo1/file/');
-		});
-		it('should not add a / in the end if it already exists', () => {
-			let node = new TreeNode(TreeNodeMock.file({repoKey: 'repo1', path: 'file'}));
-			expect(nativeBrowser.pathFor(node)).toBe('../list/repo1/file/');
-		});
-	});
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/services/parse_url.spec.browserify.js b/web/angular-web/src/main/webapp/specs/services/parse_url.spec.browserify.js
deleted file mode 100644
index fdd57df..0000000
--- a/web/angular-web/src/main/webapp/specs/services/parse_url.spec.browserify.js
+++ /dev/null
@@ -1,18 +0,0 @@
-describe('parseUrl', () => {
-	let parseUrl, parser, url;
-	function setup(_parseUrl_) {
-		parseUrl = _parseUrl_;
-	}
-	beforeEach(m('artifactory.services'));
-	beforeEach(inject(setup));
-	beforeEach(() => {
-		url = 'http://www.google.com:8080/test?a=b';
-    parser = parseUrl(url);
-	});
-	it('should return the host', () => {
-    expect(parser.host).toEqual('www.google.com:8080');
-	});
-	it('should return the href', () => {
-    expect(parser.href).toEqual(url);
-	});
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/services/user.spec.browserify.js b/web/angular-web/src/main/webapp/specs/services/user.spec.browserify.js
deleted file mode 100644
index 15fd122..0000000
--- a/web/angular-web/src/main/webapp/specs/services/user.spec.browserify.js
+++ /dev/null
@@ -1,219 +0,0 @@
-import UserMock from '../../mocks/user_mock.browserify.js';
-var GUEST = 1;
-var USER = 2;
-var ADMIN = 3;
-describe('Unit: User Service', function () {
-    var User;
-    var RESOURCE;
-    var artifactoryStorage;
-    var server;
-    var $rootScope;
-    var $window;
-    var USER_KEY = 'USER';
-    
-    var user = new UserMock({name: 'admin'});
-    var regularUser = UserMock.regularUser();
-    var guestUser = UserMock.guest();
-    var guestUserObj;
-    var regularUserObj;
-    var adminUserObj;
-
-
-    useAngularEquality();
-
-    // inject the main module
-    beforeEach(m('artifactory.services'));
-
-    // must run this before injecting User Service
-    beforeEach(inject(function (ArtifactoryStorage) {
-        artifactoryStorage = ArtifactoryStorage;
-        artifactoryStorage.removeItem(USER_KEY);
-    }));
-
-    // run this code before each case
-    function setup(initialUser) {
-        if (initialUser) {
-            artifactoryStorage.setItem(USER_KEY, initialUser);
-        }
-        inject(function ($injector, _RESOURCE_, _User_, _$rootScope_, _$window_) {
-            RESOURCE = _RESOURCE_;
-            User = _User_;
-            server = $injector.get('$httpBackend');
-            $rootScope = _$rootScope_;
-            $window = _$window_;
-            guestUserObj = guestUser.getUserObj();
-            regularUserObj = regularUser.getUserObj();
-            adminUserObj = user.getUserObj();
-            server.expectGET(RESOURCE.API_URL + RESOURCE.AUTH_CURRENT).respond(user);
-//            spyOn($window.location, 'replace');
-        });
-    }
-
-    describe('static methods', () => {
-        describe('start as guest', () => {
-            beforeEach(() => {
-                setup();
-            });
-
-            it('User should be defined', function () {
-                expect(User).toBeDefined();
-            });
-
-            it('should save user data after logging in', function(done) {
-                server.expectPOST(RESOURCE.API_URL + RESOURCE.AUTH_LOGIN + 'false').respond(user);
-                User.login({username: 'admin', password: '123123'}, false).then(() => {
-                    var userResponse = artifactoryStorage.getItem(USER_KEY);
-                    expect(userResponse).not.toBeNull();
-                    expect(userResponse.name).toBe('admin');
-                    done();
-                });
-                server.flush();
-            });
-
-            it('should reload user from server after logging out', function(done) {
-                server.expectGET(RESOURCE.API_URL + RESOURCE.AUTH_IS_SAML).respond(false);
-                server.expectPOST(RESOURCE.API_URL + RESOURCE.AUTH_LOGOUT).respond(200);
-                server.expectGET(RESOURCE.API_URL + RESOURCE.AUTH_CURRENT).respond(guestUser);
-                User.logout().then(() => {
-                    expect(artifactoryStorage.getItem(USER_KEY)).toEqual(guestUser);
-                    done();
-                });
-                server.flush();
-            });
-
-            //it('should redirect user to SAML logout', function(done) {
-            //    server.expectGET(RESOURCE.API_URL + RESOURCE.AUTH_IS_SAML).respond(true);
-            //    server.expectGET(RESOURCE.API_URL + RESOURCE.SAML_LOGOUT).respond('url');
-            //    User.logout().then(() => {
-            //        expect($window.location.replace).toHaveBeenCalledWith('url');
-            //        done();
-            //    });
-            //    server.flush();
-            //});
-
-            it('should send password reset email', function(done) {
-                server.expectPOST(RESOURCE.API_URL + RESOURCE.AUTH_FORGOT_PASSWORD).respond(200);
-                User.forgotPassword({username: 'admin'}).then(function(response) {
-                    expect(response.status).toBe(200);
-                    done();
-                });
-                server.flush();
-            });
-
-            it('should validate reset password key', function(done) {
-                var key = 'YHSH8@(@&!773';
-                var serverResponse = {"user": "admin"};
-                server.expectPOST(RESOURCE.API_URL + RESOURCE.AUTH_VALIDATE_KEY + key).respond(serverResponse);
-                User.validateKey(key).then(function(response) {
-                    expect(response.status).toBe(200);
-                    expect(response.data.user).toBe('admin');
-                    done();
-                });
-                server.flush();
-            });
-
-            it('should reset password', function(done) {
-                var key = 'YHSH8@(@&!773';
-                server.expectPOST(RESOURCE.API_URL + RESOURCE.AUTH_RESET_PASSWORD + key).respond(200);
-                User.resetPassword(key, user).then(function(response) {
-                    expect(response.status).toBe(200);
-                    done();
-                });
-                server.flush();
-            });
-
-            it('should allow to setUser', () => {
-                User.setUser(user);
-                expect(artifactoryStorage.getItem(USER_KEY)).toEqual(user);
-            });    
-
-            it('should allow to getCurrent when there is no user', () => {
-                expect(User.getCurrent()).toEqual({});
-            });
-
-            it('should allow to reload the user from localstorage', function(finito) {
-                artifactoryStorage.setItem(USER_KEY, user);
-                User.loadUser().then((user) => {
-                    expect(user).toEqual(adminUserObj);
-                    finito();
-                });
-                $rootScope.$digest();
-            });
-
-            it('should allow to reload the user from the server', function(voila) {
-                server.expectGET(RESOURCE.API_URL + RESOURCE.AUTH_CURRENT).respond(regularUser);
-                User.loadUser(true).then((response) => {
-                    expect(response).toEqual(regularUserObj);
-                    voila();
-                });
-                server.flush();
-                $rootScope.$digest();
-            });
-
-            it('should have a whenLoadedFromServer variable', function(voila) {
-                User.whenLoadedFromServer.then((response) => {
-                    expect(response).toEqual(adminUserObj);
-                    voila();
-                });
-                server.flush();
-                $rootScope.$digest();
-            });
-
-            it('should not change reference after reloading from localstorage', () => {
-                var getCurrent = User.getCurrent();
-                artifactoryStorage.setItem(USER_KEY, user);
-                User.loadUser();
-                expect(User.getCurrent()).toBe(getCurrent);
-            });
-        });
-        describe('start as logged in user', () => {
-            beforeEach(() => {
-                setup(user);
-            });
-            it ('should allow to getCurrent when there is a user', () => {
-                expect(User.getCurrent()).toEqual(adminUserObj);
-            });
-        });
-    });
-    describe('instance methods', () => {
-        it('should have an isGuest method', () => {
-            expect(guestUserObj.isGuest()).toBeTruthy();
-            expect(regularUserObj.isGuest()).toBeFalsy();
-            expect(adminUserObj.isGuest()).toBeFalsy();
-        });
-        it('should have an isAdmin method', () => {
-            expect(guestUserObj.isAdmin()).toBeFalsy();
-            expect(regularUserObj.isAdmin()).toBeFalsy();
-            expect(adminUserObj.isAdmin()).toBeTruthy();
-        });
-        it('should have an isRegularUser method', () => {
-            expect(guestUserObj.isRegularUser()).toBeFalsy();
-            expect(regularUserObj.isRegularUser()).toBeTruthy();
-            expect(adminUserObj.isRegularUser()).toBeFalsy();
-        });
-        it('should have an isLoggedIn method', () => {
-            expect(guestUserObj.isLoggedIn()).toBeFalsy();
-            expect(regularUserObj.isLoggedIn()).toBeTruthy();
-            expect(adminUserObj.isLoggedIn()).toBeTruthy();
-        });
-        it('should have a getCanManage method', () => {
-            expect(guestUserObj.getCanManage()).toBeFalsy();
-            expect(adminUserObj.getCanManage()).toBeTruthy();
-        });
-        it('should have a getCanDeploy method', () => {
-            expect(guestUserObj.getCanDeploy()).toBeFalsy();
-            expect(adminUserObj.getCanDeploy()).toBeTruthy();
-        });
-        it('should have a canView method', () => {
-            expect(guestUserObj.canView('builds')).toBeFalsy();
-            expect(adminUserObj.canView('builds')).toBeTruthy();
-            expect(guestUserObj.canView('admin.security.permission')).toBeFalsy();
-            expect(adminUserObj.canView('admin.security.permission')).toBeTruthy();
-            expect(regularUserObj.canView('admin.security.general')).toBeFalsy();
-            expect(adminUserObj.canView('admin.security.general')).toBeTruthy();
-            expect(guestUserObj.canView('home')).toBeTruthy();
-            expect(regularUserObj.canView('home')).toBeTruthy();
-            expect(adminUserObj.canView('home')).toBeTruthy();
-        });
-    });
-});
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/spec_helper.js b/web/angular-web/src/main/webapp/specs/spec_helper.js
deleted file mode 100644
index a7184ce..0000000
--- a/web/angular-web/src/main/webapp/specs/spec_helper.js
+++ /dev/null
@@ -1,23 +0,0 @@
-window.m = angular.mock.module;
-window.compileHtml = function(htmlStr, data) {
-    data = data || {};
-    var $scope;
-    inject(function($compile, $rootScope) {
-      angular.element(document.body).html(htmlStr);
-      $scope = $rootScope.$new();
-      angular.extend($scope, data);
-      $compile(document.body)($scope);
-      $scope.$digest();
-    });
-    return $scope;
-}
-
-function angularEquality(first, second) {
-  return angular.equals(first, second);
-}
-
-window.useAngularEquality = function() {
-    beforeEach(function() {
-      jasmine.addCustomEqualityTester(angularEquality);
-    });
-}
\ No newline at end of file
diff --git a/web/angular-web/src/main/webapp/specs/ui_components/artifactory_grid.spec.browserify.js b/web/angular-web/src/main/webapp/specs/ui_components/artifactory_grid.spec.browserify.js
deleted file mode 100644
index d2cf10a..0000000
--- a/web/angular-web/src/main/webapp/specs/ui_components/artifactory_grid.spec.browserify.js
+++ /dev/null
@@ -1,238 +0,0 @@
-const TEMPLATES_FOLDER = "ui_components/artifactory_grid/templates/";
-import GridApiMock from '../../mocks/grid_api_mock.browserify'
-describe('unit test: artifactory_grid ui component', () => {
-  let gridOptions;
-  let gridApi;
-  let result;
-  let timeout;
-  let q;
-  let rootScope;
-  let data = [{name: 'moshe', role: 'admin'}, {name: 'avi', role: 'user'}];
-  function setup(ArtifactoryGridFactory, $rootScope, $timeout, $q) {
-    gridOptions = ArtifactoryGridFactory.getGridInstance($rootScope);
-    gridApi = GridApiMock(gridOptions);
-    timeout = $timeout;
-    q = $q;
-    rootScope = $rootScope;
-  }
-
-  beforeEach(m('artifactory.ui_components'));
-  beforeEach(m('artifactory.services'));
-  beforeEach(m('ui.router'));
-  beforeEach(inject(setup));
-
-  describe('initial state', () => {
-    it('should start with empty data', () => {
-      expect(gridOptions.data).toBeFalsy();
-    });
-    it('should start with empty columns', () => {
-      expect(gridOptions.columnDefs).toBeFalsy();
-    });
-  });
-
-  describe('setGridData', () => {
-    it('should return the gridOptions', () => {
-      expect(gridOptions.setGridData(data)).toBe(gridOptions);
-    });
-    it('should allow to set data', () => {
-      gridOptions.setGridData(data);
-      expect(gridOptions.data).toBe(data);
-    });
-    it('should seed a stub row for empty data', () => {
-      gridOptions.setGridData([]);
-      expect(gridOptions.data).toEqual([{_emptyRow: true}]);
-      expect(gridOptions.enableSelectAll).toEqual(false);
-    });
-  });
-
-  describe('setColumns', () => {
-    let downloadCallback = angular.noop;
-    let deleteCallback = angular.noop;
-    let customCallback = angular.noop;
-    let customAction = {callback: customCallback};
-    let columns;
-    beforeEach(() => {
-      columns = [{
-        field: 'name',
-        actions: {
-          download: downloadCallback,
-          delete: {callback: deleteCallback, visibleWhen: angular.noop}
-        },
-        customActions: [customAction]
-      }];
-      result = gridOptions.setColumns(columns);
-    });
-    it('should return the gridOptions', () => {
-      expect(result).toBe(gridOptions);
-    });    
-    it('should allow to set columns', () => {
-      expect(gridOptions.columnDefs).toBe(columns);
-    });
-    it('should set default headerCellTemplate', () => {
-      expect(gridOptions.columnDefs[0].headerCellTemplate).toBeDefined();
-    });
-    it('should set default enableCellEdit', () => {
-      expect(gridOptions.columnDefs[0].enableCellEdit).toBe(false);
-    });
-    it('should set actions', () => {
-      expect(gridOptions.columnDefs[0].customActions).toEqual([
-        customAction,
-        {
-            icon: 'icon icon-download',
-            href: gridOptions.columnDefs[0].customActions[1].href,
-            tooltip: 'Download',
-            callback: downloadCallback,
-        },
-        {
-            icon: 'icon icon-clear',
-            tooltip: 'Delete',
-            callback: deleteCallback,
-            visibleWhen: angular.noop
-        }
-      ]);
-    });
-  });
-
-  describe('afterRegister', () => {
-    let callback;
-    beforeEach(() => {
-      callback = jasmine.createSpy();
-      gridOptions.afterRegister(callback);
-      gridOptions.onSelectionChangeBatch = angular.noop;
-      gridOptions.onSelectionChange = angular.noop;
-      gridOptions.onRegisterApi(gridApi);
-    });
-    it('should call the callback after register', () => {
-      expect(callback).toHaveBeenCalledWith(gridApi);
-    });
-    it('should set the grid api listeners', () => {
-      expect(gridApi.selection.on.rowSelectionChanged).toHaveBeenCalled();
-      expect(gridApi.selection.on.rowSelectionChangedBatch).toHaveBeenCalled();
-      expect(gridApi.core.on.rowsRendered).toHaveBeenCalled();
-    });
-  });
-  describe('setDraggable', () => {
-    let draggableCallback = angular.noop;
-    beforeEach(() => {
-      result = gridOptions.setDraggable(draggableCallback);
-    });
-    it('should return the gridOptions', () => {
-      expect(result).toBe(gridOptions);
-    });
-    it('should allow to setDraggable', () => {
-      expect(gridOptions.draggablefunc).toBe(draggableCallback);
-    });
-    it('should set the row template', () => {
-      expect(gridOptions.rowTemplate).toEqual(TEMPLATES_FOLDER + 'drag_rows.html');
-    });
-    it('should set the drop listener', () => {
-      gridOptions.onRegisterApi(gridApi);
-
-      expect(gridApi.draggableRows.on.rowDropped).toHaveBeenCalled();
-    });
-  });
-  describe('setRowTemplate', () => {
-    it('should return itself', () => {
-      expect(gridOptions.setRowTemplate('test')).toBe(gridOptions);
-    });
-    it('should fix the row template', () => {
-      gridOptions.setRowTemplate('test');
-      expect(gridOptions.rowTemplate).toEqual(TEMPLATES_FOLDER + 'test.html');
-    });
-  });
-  describe('setMultiSelect', () => {
-    it('should return itself', () => {
-      expect(gridOptions.setMultiSelect()).toBe(gridOptions);
-    });
-    it('should set multiSelect to true', () => {
-      gridOptions.setMultiSelect();
-      expect(gridOptions.multiSelect).toBe(true);
-    });
-  });
-  describe('setSingleSelect', () => {
-    it('should return itself', () => {
-      expect(gridOptions.setSingleSelect()).toBe(gridOptions);
-    });
-    it('should set multiSelect to false', () => {
-      gridOptions.setSingleSelect();
-      expect(gridOptions.multiSelect).toBe(false);
-    });
-  });
-  describe('selectItem', () => {
-    it('should call selectItem after timeout', () => {
-      gridOptions.onRegisterApi(gridApi);
-      gridOptions.selectItem();
-      expect(gridOptions.api.selection.selectRow).not.toHaveBeenCalled();
-      timeout.flush();
-      expect(gridOptions.api.selection.selectRow).toHaveBeenCalled();
-    });
-  });
-  describe('setBatchActions', () => {
-    let batchActions = [];
-    beforeEach(() => {
-      result = gridOptions.setBatchActions(batchActions);
-    })
-    it('should return itself', () => {
-      expect(result).toBe(gridOptions);
-    });
-    it('should set batchActions', () => {
-      expect(gridOptions.batchActions).toBe(batchActions);
-    });
-    it('should set multiSelect to true', () => {
-      expect(gridOptions.multiSelect).toBe(true);
-    });
-  });
-  describe('external pagination', () => {
-    let whenPagingComplete;
-    let paginationCallback;
-    beforeEach(() => {
-      spyOn(gridOptions, 'setGridData').and.callThrough();
-      spyOn(gridOptions, 'getPage').and.callThrough();
-      whenPagingComplete = q.when({totalItems: 10, pagingData: data});
-      paginationCallback = jasmine.createSpy().and.returnValue(whenPagingComplete);
-      gridOptions.setColumns([{field: 'name'}]);
-      result = gridOptions.setExternalPagination(paginationCallback);
-      gridOptions.onRegisterApi(gridApi);
-    });
-
-    it('should return itself', () => {
-      expect(result).toBe(gridOptions);
-    });
-
-    it('should set the correct fields for ui-grid', () => {
-        expect(gridOptions.useExternalPagination).toBe(true);
-        expect(gridOptions.useExternalSorting).toBe(true);
-    });
-
-    it('should set the listeners on gridApi', () => {
-      expect(gridApi.pagination.on.paginationChanged).toHaveBeenCalled();
-      expect(gridApi.core.on.sortChanged).toHaveBeenCalled();
-    });
-
-    it('should set the listeners on gridApi', () => {
-      expect(gridOptions.getPage).toHaveBeenCalled();
-    });
-
-    describe('getPage', () => {
-      beforeEach(() => {
-        gridOptions.getPage();
-      });
-      it('should call the pagination callback', () => {
-        expect(paginationCallback).toHaveBeenCalledWith({
-          pageNum: 1,
-          numOfRows: 25,
-          direction: 'asc',
-          orderBy: 'name'
-        });
-      });
-      it('should set the data and total items', (done) => {
-        whenPagingComplete.then(() => {
-          expect(gridOptions.totalItems).toEqual(10);
-          expect(gridOptions.setGridData).toHaveBeenCalledWith(data);
-          done();
-        });
-        rootScope.$digest();
-      });
-    });
-  });
-});
diff --git a/web/angular-web/src/main/webapp/vendor/draggable-rows.js b/web/angular-web/src/main/webapp/vendor/draggable-rows.js
deleted file mode 100644
index e9094a8..0000000
--- a/web/angular-web/src/main/webapp/vendor/draggable-rows.js
+++ /dev/null
@@ -1,203 +0,0 @@
-(function() {
-    'use strict';
-
-    angular.module('ui.grid.draggable-rows', ['ui.grid'])
-
-    .constant('uiGridDraggableRowsConstants', {
-        featureName: 'draggableRows',
-        ROW_OVER_CLASS: 'ui-grid-draggable-row-over',
-        ROW_OVER_ABOVE_CLASS: 'ui-grid-draggable-row-over--above',
-        ROW_OVER_BELOW_CLASS: 'ui-grid-draggable-row-over--below',
-        POSITION_ABOVE: 'above',
-        POSITION_BELOW: 'below',
-        publicEvents: {
-            draggableRows: {
-                rowDragged: function(scope, info, rowElement) {},
-                rowDropped: function(scope, info, targetElement) {},
-                rowOverRow: function(scope, info, rowElement) {},
-                rowEnterRow: function(scope, info, rowElement) {},
-                rowLeavesRow: function(scope, info, rowElement) {},
-                rowFinishDrag: function(scope) {}
-            }
-        }
-    })
-
-    .factory('uiGridDraggableRowsCommon', [function() {
-        return {
-            draggedRow: null,
-            draggedRowEntity: null,
-            position: null,
-            fromIndex: null,
-            toIndex: null
-        };
-    }])
-
-    .service('uiGridDraggableRowsService', ['uiGridDraggableRowsConstants', function(uiGridDraggableRowsConstants) {
-        this.initializeGrid = function(grid, $scope, $element) {
-            grid.api.registerEventsFromObject(uiGridDraggableRowsConstants.publicEvents);
-
-            grid.api.draggableRows.on.rowFinishDrag($scope, function() {
-                angular.forEach($element[0].querySelectorAll('.' + uiGridDraggableRowsConstants.ROW_OVER_CLASS), function(row) {
-                    row.classList.remove(uiGridDraggableRowsConstants.ROW_OVER_CLASS);
-                    row.classList.remove(uiGridDraggableRowsConstants.ROW_OVER_ABOVE_CLASS);
-                    row.classList.remove(uiGridDraggableRowsConstants.ROW_OVER_BELOW_CLASS);
-                });
-            });
-        };
-    }])
-
-    .service('uiGridDraggableRowService', ['uiGridDraggableRowsConstants', 'uiGridDraggableRowsCommon', '$parse', function(uiGridDraggableRowsConstants, uiGridDraggableRowsCommon, $parse) {
-        var move = function(from, to) {
-            /*jshint validthis: true */
-            this.splice(to, 0, this.splice(from, 1)[0]);
-        };
-
-        this.prepareDraggableRow = function($scope, $element) {
-            var grid = $scope.grid;
-            var row = $element[0];
-
-            var data = function() {
-                if (angular.isString(grid.options.data)) {
-                    return $parse(grid.options.data)(grid.appScope);
-                }
-
-                return grid.options.data;
-            };
-
-            var listeners = {
-                onDragOverEventListener: function(e) {
-                    if (e.preventDefault) {
-                        e.preventDefault();
-                    }
-
-                    var dataTransfer = e.dataTransfer || e.originalEvent.dataTransfer;
-                    dataTransfer.effectAllowed = 'copyMove';
-                    dataTransfer.dropEffect = 'move';
-
-                    var offset = e.offsetY || e.layerY || (e.originalEvent ? e.originalEvent.offsetY : 0);
-
-                    if (offset < this.offsetHeight / 2) {
-                        uiGridDraggableRowsCommon.position = uiGridDraggableRowsConstants.POSITION_ABOVE;
-
-                        $element.removeClass(uiGridDraggableRowsConstants.ROW_OVER_BELOW_CLASS);
-                        $element.addClass(uiGridDraggableRowsConstants.ROW_OVER_ABOVE_CLASS);
-
-                    } else {
-                        uiGridDraggableRowsCommon.position = uiGridDraggableRowsConstants.POSITION_BELOW;
-
-                        $element.removeClass(uiGridDraggableRowsConstants.ROW_OVER_ABOVE_CLASS);
-                        $element.addClass(uiGridDraggableRowsConstants.ROW_OVER_BELOW_CLASS);
-                    }
-
-                    grid.api.draggableRows.raise.rowOverRow(uiGridDraggableRowsCommon, this);
-                },
-
-                onDragStartEventListener: function(e) {
-                    e.dataTransfer.setData('Text', 'move'); // Need to set some data for FF to work
-                    uiGridDraggableRowsCommon.draggedRow = this;
-                    uiGridDraggableRowsCommon.draggedRowEntity = $scope.$parent.$parent.row.entity;
-
-                    uiGridDraggableRowsCommon.position = null;
-
-                    uiGridDraggableRowsCommon.fromIndex = data().indexOf(uiGridDraggableRowsCommon.draggedRowEntity);
-                    uiGridDraggableRowsCommon.toIndex = null;
-
-                    grid.api.draggableRows.raise.rowDragged(uiGridDraggableRowsCommon, this);
-                },
-
-                onDragLeaveEventListener: function(e) {
-                    grid.api.draggableRows.raise.rowLeavesRow(uiGridDraggableRowsCommon, this);
-                },
-
-                onDragEnterEventListener: function(e) {
-                    var offset = e.offsetY || e.layerY || (e.originalEvent ? e.originalEvent.offsetY : 0);
-
-                    $('.' + uiGridDraggableRowsConstants.ROW_OVER_CLASS).removeClass(uiGridDraggableRowsConstants.ROW_OVER_CLASS);
-
-                    $element.addClass(uiGridDraggableRowsConstants.ROW_OVER_CLASS);
-
-                    grid.api.draggableRows.raise.rowEnterRow(uiGridDraggableRowsCommon, this);
-                },
-
-                onDragEndEventListener: function() {
-                    grid.api.draggableRows.raise.rowFinishDrag();
-                },
-
-                onDropEventListener: function(e) {
-                    var draggedRow = uiGridDraggableRowsCommon.draggedRow;
-
-                    if (e.stopPropagation) {
-                        e.stopPropagation();
-                    }
-
-                    if (e.preventDefault) {
-                        e.preventDefault();
-                    }
-
-                    if (draggedRow === this) {
-                        return false;
-                    }
-
-                    uiGridDraggableRowsCommon.toIndex = data().indexOf($scope.$parent.$parent.row.entity);
-
-                    if (uiGridDraggableRowsCommon.position === uiGridDraggableRowsConstants.POSITION_ABOVE) {
-                        if (uiGridDraggableRowsCommon.fromIndex < uiGridDraggableRowsCommon.toIndex) {
-                            uiGridDraggableRowsCommon.toIndex -= 1;
-                        }
-
-                    } else if (uiGridDraggableRowsCommon.fromIndex >= uiGridDraggableRowsCommon.toIndex) {
-                        uiGridDraggableRowsCommon.toIndex += 1;
-                    }
-
-                    $scope.$apply(function() {
-                        move.apply(data(), [uiGridDraggableRowsCommon.fromIndex, uiGridDraggableRowsCommon.toIndex]);
-                    });
-
-                    grid.api.draggableRows.raise.rowDropped(uiGridDraggableRowsCommon, this);
-
-                    e.preventDefault();
-                }
-            };
-
-            row.addEventListener('dragover', listeners.onDragOverEventListener, false);
-            row.addEventListener('dragstart', listeners.onDragStartEventListener, false);
-            row.addEventListener('dragleave', listeners.onDragLeaveEventListener, false);
-            row.addEventListener('dragenter', listeners.onDragEnterEventListener, false);
-            row.addEventListener('dragend', listeners.onDragEndEventListener, false);
-            row.addEventListener('drop', listeners.onDropEventListener);
-        };
-    }])
-
-    .directive('uiGridDraggableRow', ['uiGridDraggableRowService', function(uiGridDraggableRowService) {
-        return {
-            restrict: 'ACE',
-            scope: {
-                grid: '='
-            },
-            compile: function() {
-                return {
-                    pre: function($scope, $element) {
-                        uiGridDraggableRowService.prepareDraggableRow($scope, $element);
-                    }
-                };
-            }
-        };
-    }])
-
-    .directive('uiGridDraggableRows', ['uiGridDraggableRowsService', function(uiGridDraggableRowsService) {
-        return {
-            restrict: 'A',
-            replace: true,
-            priority: 0,
-            require: 'uiGrid',
-            scope: false,
-            compile: function() {
-                return {
-                    pre: function($scope, $element, $attrs, uiGridCtrl) {
-                        uiGridDraggableRowsService.initializeGrid(uiGridCtrl.grid, $scope, $element);
-                    }
-                };
-            }
-        };
-    }]);
-}());
diff --git a/web/angular-web/src/main/webapp/vendor/jquery.highlight.js b/web/angular-web/src/main/webapp/vendor/jquery.highlight.js
deleted file mode 100644
index 9dcf3c7..0000000
--- a/web/angular-web/src/main/webapp/vendor/jquery.highlight.js
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * jQuery Highlight plugin
- *
- * Based on highlight v3 by Johann Burkard
- * http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html
- *
- * Code a little bit refactored and cleaned (in my humble opinion).
- * Most important changes:
- *  - has an option to highlight only entire words (wordsOnly - false by default),
- *  - has an option to be case sensitive (caseSensitive - false by default)
- *  - highlight element tag and class names can be specified in options
- *
- * Usage:
- *   // wrap every occurrance of text 'lorem' in content
- *   // with <span class='highlight'> (default options)
- *   $('#content').highlight('lorem');
- *
- *   // search for and highlight more terms at once
- *   // so you can save some time on traversing DOM
- *   $('#content').highlight(['lorem', 'ipsum']);
- *   $('#content').highlight('lorem ipsum');
- *
- *   // search only for entire word 'lorem'
- *   $('#content').highlight('lorem', { wordsOnly: true });
- *
- *   // don't ignore case during search of term 'lorem'
- *   $('#content').highlight('lorem', { caseSensitive: true });
- *
- *   // wrap every occurrance of term 'ipsum' in content
- *   // with <em class='important'>
- *   $('#content').highlight('ipsum', { element: 'em', className: 'important' });
- *
- *   // remove default highlight
- *   $('#content').unhighlight();
- *
- *   // remove custom highlight
- *   $('#content').unhighlight({ element: 'em', className: 'important' });
- *
- *
- * Copyright (c) 2009 Bartek Szopka
- *
- * Licensed under MIT license.
- *
- */
-
-jQuery.extend({
-    highlight: function (node, re, nodeName, className) {
-        if (node.nodeType === 3) {
-            var match = node.data.match(re);
-            if (match) {
-                var highlight = document.createElement(nodeName || 'span');
-                highlight.className = className || 'highlight';
-                var wordNode = node.splitText(match.index);
-                wordNode.splitText(match[0].length);
-                var wordClone = wordNode.cloneNode(true);
-                highlight.appendChild(wordClone);
-                wordNode.parentNode.replaceChild(highlight, wordNode);
-                return 1; //skip added node in parent
-            }
-        } else if ((node.nodeType === 1 && node.childNodes) && // only element nodes that have children
-                !/(script|style)/i.test(node.tagName) && // ignore script and style nodes
-                !(node.tagName === nodeName.toUpperCase() && node.className === className)) { // skip if already highlighted
-            for (var i = 0; i < node.childNodes.length; i++) {
-                i += jQuery.highlight(node.childNodes[i], re, nodeName, className);
-            }
-        }
-        return 0;
-    }
-});
-
-jQuery.fn.unhighlight = function (options) {
-    var settings = { className: 'highlight', element: 'span' };
-    jQuery.extend(settings, options);
-
-    return this.find(settings.element + "." + settings.className).each(function () {
-        var parent = this.parentNode;
-        parent.replaceChild(this.firstChild, this);
-        parent.normalize();
-    }).end();
-};
-
-jQuery.fn.highlight = function (words, options) {
-    var settings = { className: 'highlight', element: 'span', caseSensitive: false, wordsOnly: false };
-    jQuery.extend(settings, options);
-    
-    if (words.constructor === String) {
-        words = [words];
-    }
-    words = jQuery.grep(words, function(word, i){
-      return word != '';
-    });
-    words = jQuery.map(words, function(word, i) {
-      return word.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
-    });
-    if (words.length == 0) { return this; };
-
-    var flag = settings.caseSensitive ? "" : "i";
-    var pattern = "(" + words.join("|") + ")";
-    if (settings.wordsOnly) {
-        pattern = "\\b" + pattern + "\\b";
-    }
-    var re = new RegExp(pattern, flag);
-    
-    return this.each(function () {
-        jQuery.highlight(this, re, settings.element, settings.className);
-    });
-};
-
diff --git a/web/angular-web/src/main/webapp/webpack.config.js b/web/angular-web/src/main/webapp/webpack.config.js
deleted file mode 100644
index 5be26db..0000000
--- a/web/angular-web/src/main/webapp/webpack.config.js
+++ /dev/null
@@ -1,51 +0,0 @@
-var path = require('path');
-var webpack = require('webpack');
-var CommonsChunkPlugin = require('./node_modules/webpack/lib/optimize/CommonsChunkPlugin');
-var CONFIG = require('./artifactory.config');
-
-module.exports = {
-
-    context: __dirname + '/app',
-    entry: {
-        artifactory_main: './app.js',
-        artifactory_services: './services/artifactory.services.module.js',
-        artifactory_directives: './directives/artifactory.directives.module.js',
-        artifactory_dao: './data/artifactory_dao_module',
-        artifactory_ui_components: './ui_components/ui_components.module',
-        artifactory_states: './states/artifactory.states.module',
-        artifactory_filters: './filters/artifactory.filters.module'
-    },
-
-    output: {
-        path: CONFIG.DESTINATIONS.TARGET,
-        filename: '[name].js'
-    },
-
-    plugins: [
-
-        new CommonsChunkPlugin({
-            name: "artifactory_core",
-            filename: "artifactory_core.js",
-            chunks: ["artifactory_services", "artifactory_dao"]
-        }),
-
-        new CommonsChunkPlugin({
-            name: "artifactory_ui",
-            filename: "artifactory_ui.js",
-            chunks: ["artifactory_directives", "artifactory_ui_components", "artifactory_filters"]
-        }),
-
-        new CommonsChunkPlugin({
-            name: "artifactory_views",
-            filename: "artifactory_views.js",
-            chunks: ["artifactory_states"]
-        })
-
-    ],
-
-    module: {
-        loaders: [{test: /\.js$/, loader: 'babel'}]
-    },
-
-    devtool: "#source-map"
-};
\ No newline at end of file
diff --git a/web/application/pom.xml b/web/application/pom.xml
deleted file mode 100644
index e7e2f69..0000000
--- a/web/application/pom.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0          http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>artifactory-web-application</artifactId>
-    <packaging>jar</packaging>
-    <name>Artifactory Web Application</name>
-
-    <parent>
-        <artifactId>artifactory-web-parent</artifactId>
-        <groupId>org.artifactory</groupId>
-        <version>4.8.0</version>
-    </parent>
-
-    <build>
-        <resources>
-            <resource>
-                <directory>src/main/java</directory>
-                <excludes>
-                    <exclude>**/*.java</exclude>
-                </excludes>
-            </resource>
-            <resource>
-                <directory>src/main/resources</directory>
-                <includes>
-                    <include>**/*</include>
-                </includes>
-                <excludes>
-                    <exclude>**/*.java</exclude>
-                </excludes>
-            </resource>
-        </resources>
-    </build>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-log</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-common</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-traffic</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.jfrog.storage</groupId>
-            <artifactId>binary-store-core</artifactId>
-            <scope>runtime</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-rest</artifactId>
-            <scope>runtime</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-rest-ui</artifactId>
-            <scope>runtime</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-core</artifactId>
-            <scope>runtime</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-config</artifactId>
-            <type>test-jar</type>
-        </dependency>
-
-        <dependency>
-            <groupId>org.codehaus.plexus</groupId>
-            <artifactId>plexus-utils</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.jdom</groupId>
-            <artifactId>jdom2</artifactId>
-        </dependency>
-
-        <!-- for cron expressions validation -->
-        <dependency>
-            <groupId>org.quartz-scheduler</groupId>
-            <artifactId>quartz</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.ocpsoft.prettytime</groupId>
-            <artifactId>prettytime</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.easymock</groupId>
-            <artifactId>easymock</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.mockito</groupId>
-            <artifactId>mockito-core</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-test</artifactId>
-        </dependency>
-    </dependencies>
-</project>
diff --git a/web/application/src/main/java/org/artifactory/addon/web/WebAddonsImpl.java b/web/application/src/main/java/org/artifactory/addon/web/WebAddonsImpl.java
deleted file mode 100644
index e406d8b..0000000
--- a/web/application/src/main/java/org/artifactory/addon/web/WebAddonsImpl.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.web;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonType;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.CoreAddons;
-import org.artifactory.addon.build.BuildAddon;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.config.VersionInfo;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.DockerRepositoryAction;
-import org.artifactory.api.rest.build.artifacts.BuildArtifactsRequest;
-import org.artifactory.api.rest.build.diff.BuildsDiff;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.build.ArtifactoryBuildArtifact;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.mail.MailServerDescriptor;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.security.UserInfo;
-import org.artifactory.util.HttpUtils;
-import org.jfrog.build.api.BaseBuildFileBean;
-import org.jfrog.build.api.Build;
-import org.jfrog.build.api.BuildRetention;
-import org.jfrog.build.api.Dependency;
-import org.jfrog.build.api.dependency.BuildPatternArtifacts;
-import org.jfrog.build.api.dependency.BuildPatternArtifactsRequest;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import javax.annotation.Nonnull;
-import java.io.File;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import static java.lang.String.format;
-
-/**
- * Default implementation of the addons interface. Represents a normal execution of artifactory.
- * <p/>
- * <strong>NOTE!</strong> Do not create anonymous or non-static inner classes in addon
- *
- * @author freds
- * @author Yossi Shaul
- */
- at org.springframework.stereotype.Component
-public final class WebAddonsImpl implements CoreAddons, BuildAddon {
-    private static final Logger log = LoggerFactory.getLogger(WebAddonsImpl.class);
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public Set<ArtifactoryBuildArtifact> getBuildArtifactsFileInfosWithFallback(Build build) {
-        return Sets.newHashSet();
-    }
-
-    @Override
-    public Set<ArtifactoryBuildArtifact> getBuildArtifactsFileInfos(Build build) {
-        return Sets.newHashSet();
-    }
-
-    @Override
-    public Map<Dependency, FileInfo> getBuildDependenciesFileInfos(Build build) {
-        return Maps.newHashMap();
-    }
-
-    @Override
-    public void renameBuildNameProperty(String from,
-            String to) {
-    }
-
-    @Override
-    public void discardOldBuildsByDate(String buildName, BuildRetention buildRetention,
-            BasicStatusHolder multiStatusHolder) {
-        // nop
-    }
-
-    @Override
-    public void discardOldBuildsByCount(String buildName, BuildRetention discard, BasicStatusHolder multiStatusHolder) {
-        // nop
-    }
-
-    @Override
-    public BuildPatternArtifacts getBuildPatternArtifacts(
-            @Nonnull BuildPatternArtifactsRequest buildPatternArtifactsRequest, String servletContextUrl) {
-        return new BuildPatternArtifacts();
-    }
-
-    @Override
-    public Map<FileInfo, String> getBuildArtifacts(BuildArtifactsRequest buildArtifactsRequest) {
-        return null;
-    }
-
-    @Override
-    public File getBuildArtifactsArchive(BuildArtifactsRequest buildArtifactsRequest) {
-        return null;
-    }
-
-    @Override
-    public BuildsDiff getBuildsDiff(Build firstBuild, Build secondBuild, String baseStorageInfoUri) {
-        return null;
-    }
-
-    @Override
-    public FileInfo getFileBeanInfo(BaseBuildFileBean artifact, Build build) {
-        return null;
-    }
-
-    @Override
-    public String getListBrowsingVersion() {
-        VersionInfo versionInfo = centralConfigService.getVersionInfo();
-        return format("Artifactory/%s", versionInfo.getVersion());
-    }
-
-    @Override
-    public String getArtifactoryServerName() {
-        MutableCentralConfigDescriptor mutableCentralConfigDescriptor = centralConfigService.getMutableDescriptor();
-        return mutableCentralConfigDescriptor.getServerName();
-    }
-
-    @Override
-    public String getArtifactoryUrl() {
-        MutableCentralConfigDescriptor mutableCentralConfigDescriptor = centralConfigService.getMutableDescriptor();
-        MailServerDescriptor mailServer = mutableCentralConfigDescriptor.getMailServer();
-        if (mailServer != null && StringUtils.isNotBlank(mailServer.getArtifactoryUrl())) {
-            return mailServer.getArtifactoryUrl();
-        }
-        return null;
-    }
-
-    @Override
-    public boolean isDefault() {
-        return true;
-    }
-
-    @Override
-    public boolean isCreateDefaultAdminAccountAllowed() {
-        return true;
-    }
-
-    @Override
-    public boolean isAolAdmin() {
-        return false;
-    }
-
-    @Override
-    public boolean isAolAdmin(UserInfo userInfo) {
-        return false;
-    }
-
-    @Override
-    public boolean isAol() {
-        return false;
-    }
-
-    @Override
-    @Nonnull
-    public List<String> getUsersForBackupNotifications() {
-        List<UserInfo> allUsers = ContextHelper.get().beanForType(UserGroupService.class).getAllUsers(true);
-        List<String> adminEmails = Lists.newArrayList();
-        for (UserInfo user : allUsers) {
-            if (user.isAdmin()) {
-                if (StringUtils.isNotBlank(user.getEmail())) {
-                    adminEmails.add(user.getEmail());
-                } else {
-                    log.debug("User '{}' has no email address.", user.getUsername());
-                }
-            }
-        }
-        return adminEmails;
-    }
-
-    /**
-     * Validates that given licenseHash is different from license installed on this instance,
-     * unless artifactoryId and current instance artifactoryId are equal (e.g same Artifactory)
-     *
-     * @param licenseHash license to check
-     * @param artifactoryId artifactory id of the checked license
-     */
-    @Override
-    public boolean validateTargetHasDifferentLicense(String licenseHash, String artifactoryId) {
-        AddonsManager addonsManager = getAddonsManager();
-        if (Strings.isNullOrEmpty(licenseHash)) {
-            log.debug("LicenseHash is empty, validation isn't possible");
-        } else {
-            if (!addonsManager.getLicenseKeyHash().equals(licenseHash)) {
-                return true;
-            } else {
-                if (!Strings.isNullOrEmpty(artifactoryId)) {
-                    if(HttpUtils.getHostId().equals(artifactoryId))
-                        return true;
-                } else {
-                    log.debug("LicenseHash is equal to currently used license, but artifactoryId is empty, " +
-                            "validation of destination and source artifactories being same instance isn't possible");
-                }
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public void validateTargetHasDifferentLicenseKeyHash(String targetLicenseHash, List<String> addons) {
-        AddonsManager addonsManager = getAddonsManager();
-        // Skip Trial license
-        if (isTrial(addonsManager)) {
-            log.debug("Source has trial license, skipping target instance license validation.");
-            return;
-        }
-        if (StringUtils.isBlank(targetLicenseHash)) {
-            if (addons == null || !addons.contains(AddonType.REPLICATION.getAddonName())) {
-                throw new IllegalArgumentException(
-                        "Replication between an open-source Artifactory instance is not supported.");
-            }
-
-            throw new IllegalArgumentException(
-                    "Could not retrieve license key from remote target, user must have deploy permissions.");
-        }
-        if (addonsManager.getLicenseKeyHash().equals(targetLicenseHash)) {
-            throw new IllegalArgumentException("Replication between same-license servers is not supported.");
-        }
-    }
-
-    @Override
-    public void validateMultiPushReplicationSupportedForTargetLicense(String targetLicenseKey,
-            boolean isMultiPushConfigure, String targetUrl) {
-        AddonsManager addonsManager = getAddonsManager();
-        if (!addonsManager.isLicenseKeyHashHAType(targetLicenseKey) && isMultiPushConfigure) {
-            log.info("Multi Push Replication is not supported for target :" + targetUrl);
-            throw new IllegalArgumentException(
-                    "Multi Push Replication is supported for targets with an enterprise license only");
-        }
-    }
-
-    @Override
-    public String getBuildNum() {
-        VersionInfo versionInfo = centralConfigService.getVersionInfo();
-        return format("%s rev %s", versionInfo.getVersion(), versionInfo.getRevision());
-    }
-
-    private boolean isTrial(AddonsManager addonsManager) {
-        return addonsManager.isLicenseInstalled() && "Trial".equalsIgnoreCase(addonsManager.getLicenseDetails()[2]);
-    }
-
-    private AddonsManager getAddonsManager() {
-        return ContextHelper.get().beanForType(AddonsManager.class);
-    }
-
-    @Override
-    public void sendDockerRepoEvent(String repoName, String dockerApiVersion, DockerRepositoryAction action) {
-
-    }
-}
diff --git a/web/application/src/main/java/org/artifactory/webapp/WebappServiceImpl.java b/web/application/src/main/java/org/artifactory/webapp/WebappServiceImpl.java
deleted file mode 100644
index d294aa3..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/WebappServiceImpl.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.webapp;
-
-import org.artifactory.api.web.WebappService;
-import org.artifactory.util.HttpUtils;
-import org.springframework.stereotype.Service;
-
-/**
- * Implementation of services given by the webapp to lower level components.
- *
- * @author Yossi Shaul
- */
- at Service
-public class WebappServiceImpl implements WebappService {
-
-    private static final String ANGULAR_URL_BROWSE_REPO = "/#/artifacts/browse/tree/General/";
-
-    @Override
-    public String createLinkToBrowsableArtifact(String artifactoryUrl, String repoPathId, String linkLabel) {
-        String encodedPathId = HttpUtils.encodeQuery(repoPathId);
-        String url = new StringBuilder().append(artifactoryUrl).append(HttpUtils.WEBAPP_URL_PATH_PREFIX)
-                .append(ANGULAR_URL_BROWSE_REPO).append(encodedPathId)
-                .toString();
-
-        StringBuilder builder = new StringBuilder();
-        builder.append("<a href=").append(url).append(" target=\"blank\"").append(">").append(linkLabel).append("</a>");
-        return builder.toString();
-
-    }
-}
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/AccessFilter.java b/web/application/src/main/java/org/artifactory/webapp/servlet/AccessFilter.java
deleted file mode 100644
index 7ee0c8b..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/AccessFilter.java
+++ /dev/null
@@ -1,479 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.webapp.servlet;
-
-import com.google.common.cache.CacheBuilder;
-import org.apache.commons.codec.digest.DigestUtils;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.SecurityListener;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.common.property.ArtifactorySystemProperties;
-import org.artifactory.security.HttpAuthenticationDetailsSource;
-import org.artifactory.security.UserInfo;
-import org.artifactory.util.HttpUtils;
-import org.artifactory.util.UiRequestUtils;
-import org.artifactory.webapp.servlet.authentication.ArtifactoryAuthenticationFilter;
-import org.artifactory.webapp.servlet.authentication.ArtifactoryAuthenticationFilterChain;
-import org.artifactory.webapp.servlet.authentication.interceptor.anonymous.AnonymousAuthenticationInterceptor;
-import org.artifactory.webapp.servlet.authentication.interceptor.anonymous.AnonymousAuthenticationInterceptors;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.authentication.AuthenticationDetailsSource;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.authentication.InsufficientAuthenticationException;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContext;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.web.authentication.logout.LogoutHandler;
-import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint;
-
-import javax.servlet.*;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.TimeUnit;
-
-public class AccessFilter extends DelayedFilterBase implements SecurityListener {
-    private static final Logger log = LoggerFactory.getLogger(AccessFilter.class);
-    public static final String AUTHENTICATED_USERNAME_ATTRIBUTE = "authenticated_username";
-
-    private ArtifactoryContext context;
-    private ArtifactoryAuthenticationFilterChain authFilterChain;
-    private BasicAuthenticationEntryPoint authenticationEntryPoint;
-    private AnonymousAuthenticationInterceptors authInterceptors;
-
-    /**
-     * holds cached Authentication instances for the non ui requests based on the Authorization header and client ip
-     */
-    private ConcurrentMap<AuthCacheKey, Authentication> nonUiAuthCache;
-    private ConcurrentMap<String, AuthenticationCache> userChangedCache;
-
-    @Override
-    public void initLater(FilterConfig filterConfig) throws ServletException {
-        ServletContext servletContext = filterConfig.getServletContext();
-        this.context = RequestUtils.getArtifactoryContext(servletContext);
-        this.authenticationEntryPoint = context.beanForType(BasicAuthenticationEntryPoint.class);
-        this.authFilterChain = new ArtifactoryAuthenticationFilterChain(authenticationEntryPoint);
-        // Add all the authentication filters
-        authFilterChain.addFilters(context.beansForType(ArtifactoryAuthenticationFilter.class).values());
-        initCaches(filterConfig);
-        authFilterChain.init(filterConfig);
-        authInterceptors = new AnonymousAuthenticationInterceptors();
-        RequestUtils.setPackagesEndpointUseBasicAuth();
-        authInterceptors.addInterceptors(context.beansForType(AnonymousAuthenticationInterceptor.class).values());
-    }
-
-    private void initCaches(FilterConfig filterConfig) {
-        ArtifactorySystemProperties properties =
-                ((ArtifactoryHome) filterConfig.getServletContext().getAttribute(ArtifactoryHome.SERVLET_CTX_ATTR))
-                        .getArtifactoryProperties();
-        ConstantValues idleTimeSecsProp = ConstantValues.securityAuthenticationCacheIdleTimeSecs;
-        long cacheIdleSecs = properties.getLongProperty(idleTimeSecsProp);
-        ConstantValues initSizeProp = ConstantValues.securityAuthenticationCacheInitSize;
-        long initSize = properties.getLongProperty(initSizeProp);
-        nonUiAuthCache = CacheBuilder.newBuilder().softValues()
-                .initialCapacity((int) initSize)
-                .expireAfterWrite(cacheIdleSecs, TimeUnit.SECONDS)
-                .<AuthCacheKey, Authentication>build().asMap();
-        userChangedCache = CacheBuilder.newBuilder().softValues()
-                .initialCapacity((int) initSize)
-                .expireAfterWrite(cacheIdleSecs, TimeUnit.SECONDS)
-                .<String, AuthenticationCache>build().asMap();
-        SecurityService securityService = context.beanForType(SecurityService.class);
-        securityService.addListener(this);
-    }
-
-    @Override
-    public void onClearSecurity() {
-        nonUiAuthCache.clear();
-        userChangedCache.clear();
-    }
-
-    @Override
-    public void onUserUpdate(String username) {
-        invalidateUserAuthCache(username);
-    }
-
-    @Override
-    public void onUserDelete(String username) {
-        invalidateUserAuthCache(username);
-    }
-
-    private void invalidateUserAuthCache(String username) {
-        // Flag change to force re-login
-        AuthenticationCache authenticationCache = userChangedCache.get(username);
-        if (authenticationCache != null) {
-            authenticationCache.changed();
-        }
-    }
-
-    @Override
-    public void destroy() {
-        //May not be inited yet
-        if (authFilterChain != null) {
-            authFilterChain.destroy();
-        }
-        if (nonUiAuthCache != null) {
-            nonUiAuthCache.clear();
-            nonUiAuthCache = null;
-        }
-        if (userChangedCache != null) {
-            userChangedCache.clear();
-            userChangedCache = null;
-        }
-    }
-
-    @Override
-    public void doFilter(final ServletRequest req, final ServletResponse resp, final FilterChain chain)
-            throws IOException, ServletException {
-        doFilterInternal((HttpServletRequest) req, ((HttpServletResponse) resp), chain);
-    }
-
-    private void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
-            throws IOException, ServletException {
-        final String servletPath = RequestUtils.getServletPathFromRequest(request);
-        // add no cache header to web app request
-        RequestUtils.addAdditionalHeadersToWebAppRequest(request, response);
-        String method = request.getMethod();
-        if ((servletPath == null || "/".equals(servletPath) || servletPath.length() == 0) &&
-                "get".equalsIgnoreCase(method)) {
-            //We were called with an empty path - redirect to the app main page
-            response.sendRedirect(HttpUtils.WEBAPP_URL_PATH_PREFIX + "/");
-            return;
-        }
-        // Reuse the authentication if it exists
-        Authentication authentication = RequestUtils.getAuthentication(request);
-        boolean isAuthenticated = authentication != null && authentication.isAuthenticated();
-
-        // Find the good filter chain for this request
-        ArtifactoryAuthenticationFilter authenticationFilter = authFilterChain.acceptFilter(request);
-
-        // Make sure this is called only once (FRED: it's called twice ?!?)
-        boolean reAuthRequired = reAuthenticationRequired(request, authentication, authenticationFilter);
-        if (reAuthRequired) {
-            /**
-             * A re-authentication is required but we might still have data that needs to be invalidated (like the
-             * web session)
-             */
-            Map<String, LogoutHandler> logoutHandlers = ContextHelper.get().beansForType(LogoutHandler.class);
-            for (LogoutHandler logoutHandler : logoutHandlers.values()) {
-                logoutHandler.logout(request, response, authentication);
-            }
-        }
-        boolean authenticationRequired = !isAuthenticated || reAuthRequired;
-        SecurityContext securityContext = SecurityContextHolder.getContext();
-        if (authenticationRequired) {
-            if (authenticationFilter != null && authenticationFilter.acceptFilter(request)) {
-                authenticateAndExecute(request, response, chain, securityContext, authenticationFilter, authFilterChain);
-            } else {
-                useAnonymousIfPossible(request, response, chain, securityContext, authenticationFilter);
-            }
-        } else {
-            log.debug("Using authentication {} from Http session.", authentication);
-            useAuthentication(request, response, chain, authentication, securityContext);
-        }
-    }
-
-    private boolean reAuthenticationRequired(HttpServletRequest request, Authentication authentication,
-            ArtifactoryAuthenticationFilter authenticationFilter) {
-        // Not authenticated so not required to redo ;-)
-        if (authentication == null || !authentication.isAuthenticated()) {
-            return false;
-        }
-
-        // If the user object changed in the DB: new groups or became admin since last login,
-        // Then we need to force re-authentication
-        String username = authentication.getName();
-        AuthenticationCache authenticationCache = userChangedCache.get(username);
-        if (authenticationCache != null && authenticationCache.isChanged(authentication)) {
-            authenticationCache.loggedOut(authentication);
-            return true;
-        }
-        if (isAuthenticatedUIRequest(request, authenticationFilter,authentication)) {
-            return false;
-        }
-        if (authenticationFilter != null) {
-            // Ask the filter chain if we need to re authenticate
-            return authenticationFilter.requiresReAuthentication(request, authentication);
-        } else {
-            return true;
-        }
-    }
-
-    /**
-     *  if request related to UI and already authenticated the it do not require re-authentication
-     * @param request - http servlet request
-     * @param authenticationFilter - accepted authentication filter if null no filter accept this request
-     * @return true if require authentication
-     */
-    private boolean isAuthenticatedUIRequest(HttpServletRequest request,
-            ArtifactoryAuthenticationFilter authenticationFilter,Authentication authentication) {
-        // @Todo need to do the ui request identification from the UI by sending to user Agent
-        // @Todo header to identified UI request for download and upload requests
-        if (authenticationFilter == null && (authentication.getClass().getSimpleName()
-                .equals("HttpSsoAuthenticationToken"))){
-            return false;
-        }
-        return UiRequestUtils.isUiRestRequest(request) ||
-                ((request.getRequestURI().indexOf("webapp") != -1) && authenticationFilter == null) ||
-                authenticationFilter == null;
-    }
-
-
-    private void authenticateAndExecute(HttpServletRequest request, HttpServletResponse response,
-            FilterChain chain, SecurityContext securityContext,
-            ArtifactoryAuthenticationFilter authFilter, ArtifactoryAuthenticationFilterChain authFilterChain)
-            throws IOException, ServletException {
-        // Try to see if authentication in cache based on the hashed header and client ip
-        String cacheKey = authFilter.getCacheKey(request);
-        log.debug("'{}' Cached key has been found for request: '{}' with method: '{}'", cacheKey,
-                request.getRequestURI(), request.getMethod());
-        AuthCacheKey authCacheKey = new AuthCacheKey(cacheKey, request.getRemoteAddr());
-        Authentication authentication = getNonUiCachedAuthentication(request, authCacheKey);
-        if (authentication != null && authentication.isAuthenticated()
-                && !reAuthenticationRequired(request, authentication, authFilter)) {
-            log.debug("Header authentication {} found in cache.", authentication);
-            useAuthentication(request, response, chain, authentication, securityContext);
-            // Add to user change cache the login state
-            addToUserChange(authentication);
-            return;
-        }
-        try {
-            authFilterChain.doFilter(request, response, authFilter, chain);
-        } finally {
-            String username = "non_authenticated_user";
-            Authentication newAuthentication = securityContext.getAuthentication();
-            if (newAuthentication != null && newAuthentication.isAuthenticated()) {
-                // Add to user change cache the login state
-                addToUserChange(newAuthentication);
-                // Save authentication (if session exists)
-                if (RequestUtils.setAuthentication(request, newAuthentication, false)) {
-                    log.debug("Added authentication {} in Http session.", newAuthentication);
-                    username = newAuthentication.getName();
-                } else {
-                    // If it did not work use the header cache
-                    // An authorization cache key with no header can only be used for Anonymous authentication
-                    username = newAuthentication.getName();
-                    if ((UserInfo.ANONYMOUS.equals(username) && authCacheKey.hasEmptyHeader()) ||
-                            (!UserInfo.ANONYMOUS.equals(username) && !authCacheKey.hasEmptyHeader())) {
-                        nonUiAuthCache.put(authCacheKey, newAuthentication);
-                        userChangedCache.get(username).addAuthCacheKey(authCacheKey);
-                        log.debug("Added authentication {} in cache.", newAuthentication);
-                    }
-                }
-            }
-            securityContext.setAuthentication(null);
-            request.setAttribute(AUTHENTICATED_USERNAME_ATTRIBUTE, username);
-        }
-    }
-
-    private void addToUserChange(Authentication authentication) {
-        String username = authentication.getName();
-        if (!UserInfo.ANONYMOUS.equals(username)) {
-            AuthenticationCache existingCache = userChangedCache.putIfAbsent(username,
-                    new AuthenticationCache(authentication));
-            if (existingCache != null) {
-                existingCache.loggedIn(authentication);
-            }
-        }
-    }
-
-    @SuppressWarnings({"ThrowableInstanceNeverThrown"})
-    private void useAnonymousIfPossible(HttpServletRequest request, HttpServletResponse response,
-            FilterChain chain, SecurityContext securityContext,
-            ArtifactoryAuthenticationFilter authFilter) throws IOException, ServletException {
-        boolean anonAccessEnabled = context.getAuthorizationService().isAnonAccessEnabled();
-        if ((anonAccessEnabled && !isAllowUIBuildsRequest(request, context.getCentralConfig())) || authInterceptors.accept(request)) {
-            log.debug("Using anonymous");
-            AuthCacheKey authCacheKey = getAuthCacheKey(request, authFilter);
-            Authentication authentication = getNonUiCachedAuthentication(request, authCacheKey);
-            if (authentication == null) {
-                log.debug("Creating the Anonymous token");
-                final UsernamePasswordAuthenticationToken authRequest =
-                        new UsernamePasswordAuthenticationToken(UserInfo.ANONYMOUS, "");
-                AuthenticationDetailsSource ads = new HttpAuthenticationDetailsSource();
-                //noinspection unchecked
-                authRequest.setDetails(ads.buildDetails(request));
-                // explicitly ask for the default spring authentication manager by name (we have another one which
-                // is only used by the basic authentication filter)
-                AuthenticationManager authenticationManager =
-                        context.beanForType("authenticationManager", AuthenticationManager.class);
-                authentication = authenticationManager.authenticate(authRequest);
-                if (authentication != null && authentication.isAuthenticated() && !RequestUtils.isUiRequest(request)) {
-                    nonUiAuthCache.put(authCacheKey, authentication);
-                    log.debug("Added anonymous authentication {} to cache", authentication);
-                }
-            } else {
-                log.debug("Using cached anonymous authentication");
-            }
-            useAuthentication(request, response, chain, authentication, securityContext);
-        } else {
-            if (!RequestUtils.isUiRequest(request)) {
-                log.debug("Sending request requiring authentication");
-                authenticationEntryPoint.commence(request, response,
-                        new InsufficientAuthenticationException("Authentication is required"));
-            } else {
-                log.debug("No filter or entry just chain");
-                chain.doFilter(request, response);
-            }
-        }
-    }
-
-    private boolean isAllowUIBuildsRequest(HttpServletRequest request, CentralConfigService centralConfig) {
-        // TODO: [by sy] should not be here like that, should be implemented as an aspect
-        return request.getRequestURI().contains("/ui/builds/")
-                && centralConfig.getDescriptor().getSecurity().isAnonAccessToBuildInfosDisabled();
-    }
-
-    private AuthCacheKey getAuthCacheKey(HttpServletRequest request,
-            ArtifactoryAuthenticationFilter authFilter) {
-        AuthCacheKey authCacheKey;
-        if (authFilter != null) {
-            authCacheKey = new AuthCacheKey(authFilter.getCacheKey(request), request.getRemoteAddr());
-        } else {
-            authCacheKey = new AuthCacheKey(null, request.getRemoteAddr());
-        }
-        return authCacheKey;
-    }
-
-    private Authentication getNonUiCachedAuthentication(HttpServletRequest request,
-            AuthCacheKey authCacheKey) {
-        // return cached authentication only if this is a non ui request (this guards the case when user accessed
-        // Artifactory both from external tool and from the ui)
-        return RequestUtils.isUiRequest(request) ? null : nonUiAuthCache.get(authCacheKey);
-    }
-
-    private void useAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain,
-            Authentication authentication, SecurityContext securityContext) throws IOException, ServletException {
-        try {
-            securityContext.setAuthentication(authentication);
-            chain.doFilter(request, response);
-            addToUserChange(authentication);
-        } finally {
-            securityContext.setAuthentication(null);
-            request.setAttribute(AUTHENTICATED_USERNAME_ATTRIBUTE,
-                    authentication != null ? authentication.getName() : "non_authenticated_user");
-        }
-    }
-
-    @Override
-    public int compareTo(SecurityListener o) {
-        return 0;
-    }
-
-    private static class AuthCacheKey {
-        private static final String EMPTY_HEADER = DigestUtils.shaHex("");
-
-        private final String hashedHeader;
-        private final String ip;
-
-        private AuthCacheKey(String header, String ip) {
-            if (header == null) {
-                this.hashedHeader = EMPTY_HEADER;
-            } else {
-                this.hashedHeader = DigestUtils.shaHex(header);
-            }
-            this.ip = ip;
-        }
-
-        public boolean hasEmptyHeader() {
-            return this.hashedHeader.equals(EMPTY_HEADER);
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (this == o) {
-                return true;
-            }
-            if (o == null || getClass() != o.getClass()) {
-                return false;
-            }
-            AuthCacheKey key = (AuthCacheKey) o;
-            return hashedHeader.equals(key.hashedHeader) && ip.equals(key.ip);
-        }
-
-        @Override
-        public int hashCode() {
-            int result = hashedHeader.hashCode();
-            result = 31 * result + ip.hashCode();
-            return result;
-        }
-    }
-
-    class AuthenticationCache {
-        Set<AuthCacheKey> authCacheKeys;
-        Map<Integer, Integer> authState = new HashMap<>(3);
-
-        AuthenticationCache(Authentication first) {
-            authState.put(first.hashCode(), 0);
-        }
-
-        synchronized void addAuthCacheKey(AuthCacheKey authCacheKey) {
-            if (authCacheKeys == null) {
-                authCacheKeys = new HashSet<>();
-            }
-            authCacheKeys.add(authCacheKey);
-        }
-
-        synchronized void changed() {
-            if (authCacheKeys != null) {
-                for (AuthCacheKey authCacheKey : authCacheKeys) {
-                    Authentication removed = nonUiAuthCache.remove(authCacheKey);
-                    if (removed != null) {
-                        Integer key = removed.hashCode();
-                        log.debug("Removed {}:{} from the non-ui authentication cache", removed.getName(), key);
-                        authState.put(key, 1);
-                    }
-                }
-                authCacheKeys.clear();
-            }
-            Set<Integer> keys = new HashSet<>(authState.keySet());
-            for (Integer key : keys) {
-                authState.put(key, 1);
-            }
-        }
-
-        boolean isChanged(Authentication auth) {
-            int key = auth.hashCode();
-            Integer state = authState.get(key);
-            if (state != null) {
-                return state == 1;
-            }
-            return false;
-        }
-
-        void loggedOut(Authentication auth) {
-            authState.put(auth.hashCode(), 2);
-        }
-
-        void loggedIn(Authentication auth) {
-            authState.put(auth.hashCode(), 0);
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/ArtifactoryContextConfigListener.java b/web/application/src/main/java/org/artifactory/webapp/servlet/ArtifactoryContextConfigListener.java
deleted file mode 100644
index c43bb9d..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/ArtifactoryContextConfigListener.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.webapp.servlet;
-
-import com.google.common.base.Charsets;
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.time.DurationFormatUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.common.ha.HaNodeProperties;
-import org.artifactory.converters.ConverterManager;
-import org.artifactory.converters.VersionProviderImpl;
-import org.artifactory.file.lock.ArtifactoryLockFile;
-import org.artifactory.log.logback.LogbackContextSelector;
-import org.artifactory.log.logback.LoggerConfigInfo;
-import org.artifactory.spring.SpringConfigPaths;
-import org.artifactory.spring.SpringConfigResourceLoader;
-import org.artifactory.util.ExceptionUtils;
-import org.artifactory.util.HttpUtils;
-import org.artifactory.util.ResourceUtils;
-import org.artifactory.version.CompoundVersionDetails;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.support.AbstractApplicationContext;
-import org.springframework.util.ClassUtils;
-import org.springframework.util.ReflectionUtils;
-
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
-import javax.servlet.ServletException;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
-
-public class ArtifactoryContextConfigListener implements ServletContextListener {
-
-    private static final String LOCK_FILENAME = ".lock";
-
-    private ArtifactoryLockFile artifactoryLockFile;
-
-    @Override
-    public void contextInitialized(ServletContextEvent event) {
-        final ServletContext servletContext = event.getServletContext();
-
-        setSessionTrackingMode(servletContext);
-
-        final Thread initThread = new Thread("art-init") {
-            boolean success = true;
-
-            @SuppressWarnings({"unchecked"})
-            @Override
-            public void run() {
-                try {
-                    //Use custom logger
-                    String contextId = HttpUtils.getContextId(servletContext);
-                    //Build a partial config, since we expect the logger-context to exit in the selector cache by only contextId
-                    LoggerConfigInfo configInfo = new LoggerConfigInfo(contextId);
-                    LogbackContextSelector.bindConfig(configInfo);
-                    //No log field since needs to lazy initialize only after logback customization listener has run
-                    Logger log = getLogger();
-                    configure(servletContext, log);
-
-                    LogbackContextSelector.unbindConfig();
-                } catch (Exception e) {
-                    getLogger().error("Application could not be initialized: " +
-                            ExceptionUtils.getRootCause(e).getMessage(), e);
-                    success = false;
-                } finally {
-                    if (success) {
-                        //Run the waiting filters
-                        BlockingQueue<DelayedInit> waitingFiltersQueue = (BlockingQueue<DelayedInit>) servletContext
-                                .getAttribute(DelayedInit.APPLICATION_CONTEXT_LOCK_KEY);
-                        List<DelayedInit> waitingInits = new ArrayList<>();
-                        waitingFiltersQueue.drainTo(waitingInits);
-                        for (DelayedInit filter : waitingInits) {
-                            try {
-                                filter.delayedInit();
-                            } catch (ServletException e) {
-                                getLogger().error("Could not init {}.", filter.getClass().getName(), e);
-                                success = false;
-                                break;
-                            }
-                        }
-                    }
-                    //Remove the lock and open the app to requests
-                    servletContext.removeAttribute(DelayedInit.APPLICATION_CONTEXT_LOCK_KEY);
-                }
-            }
-        };
-        initThread.setDaemon(true);
-        servletContext.setAttribute(DelayedInit.APPLICATION_CONTEXT_LOCK_KEY, new LinkedBlockingQueue<DelayedInit>());
-        initThread.start();
-        if (Boolean.getBoolean("artifactory.init.useServletContext")) {
-            try {
-                getLogger().info("Waiting for servlet context initialization ...");
-                initThread.join();
-            } catch (InterruptedException e) {
-                getLogger().error("Artifactory initialization thread got interrupted", e);
-            }
-        }
-    }
-
-    /**
-     * Disable sessionId in URL (Servlet 3.0 containers) by setting the session tracking mode to SessionTrackingMode.COOKIE
-     * For Servlet container < 3.0 we use different method (for tomcat 6 we use custom context.xml and for jetty
-     * there is a custom jetty.xml file).
-     */
-    @SuppressWarnings("unchecked")
-    private void setSessionTrackingMode(ServletContext servletContext) {
-        // Only for Servlet container version 3.0 and above
-        if (servletContext.getMajorVersion() < 3) {
-            return;
-        }
-
-        // We cannot use ConstantValue.enableURLSessionId.getBoolean() since ArtifactoryHome is not binded yet.
-        ArtifactoryHome artifactoryHome = (ArtifactoryHome) servletContext.getAttribute(
-                ArtifactoryHome.SERVLET_CTX_ATTR);
-        if (artifactoryHome == null) {
-            throw new IllegalStateException("Artifactory home not initialized.");
-        }
-
-        if (artifactoryHome.getArtifactoryProperties().getBooleanProperty(ConstantValues.supportUrlSessionTracking)) {
-            getLogger().debug("Skipping setting session tracking mode to COOKIE, enableURLSessionId flag it on.");
-            return;
-        }
-
-        try {
-            // load enum with reflection
-            ClassLoader cl = ClassUtils.getDefaultClassLoader();
-            Class<Enum> trackingModeEnum = (Class<Enum>) cl.loadClass("javax.servlet.SessionTrackingMode");
-            Enum cookieTrackingMode = Enum.valueOf(trackingModeEnum, "COOKIE");
-
-            // reflective call servletContext.setSessionTrackingModes(trackingModes)
-            Method method = servletContext.getClass().getMethod("setSessionTrackingModes", Set.class);
-            method.setAccessible(true);
-            ReflectionUtils.invokeMethod(method, servletContext, Sets.newHashSet(cookieTrackingMode));
-            getLogger().debug("Successfully set session tracking mode to COOKIE");
-        } catch (Exception e) {
-            getLogger().warn("Failed to set session tracking mode: " + e.getMessage());
-        }
-    }
-
-    private Logger getLogger() {
-        return LoggerFactory.getLogger(ArtifactoryContextConfigListener.class);
-    }
-
-    private void configure(ServletContext servletContext, Logger log) throws Exception {
-        long start = System.currentTimeMillis();
-
-        ArtifactoryHome artifactoryHome =
-                (ArtifactoryHome) servletContext.getAttribute(ArtifactoryHome.SERVLET_CTX_ATTR);
-        VersionProviderImpl versionProvider = (VersionProviderImpl) servletContext.getAttribute(
-                ArtifactoryHome.ARTIFACTORY_VERSION_PROVIDER_OBJ);
-        ConverterManager converterManager = (ConverterManager) servletContext.getAttribute(
-                ArtifactoryHome.ARTIFACTORY_CONVERTER_OBJ);
-
-        if (artifactoryHome == null) {
-            throw new IllegalStateException("Artifactory home not initialized.");
-        }
-        CompoundVersionDetails runningVersionDetails = versionProvider.getRunning();
-
-        logAsciiArt(log, artifactoryHome, runningVersionDetails);
-
-        ApplicationContext context;
-        try {
-            ArtifactoryHome.bind(artifactoryHome);
-
-            //todo consider moving to org.artifactory.webapp.servlet.ArtifactoryHomeConfigListener.contextInitialized()
-            if (artifactoryHome.isHaConfigured()) {
-                log.debug("Not using Artifactory lock file on HA environment");
-            } else {
-                artifactoryLockFile = new ArtifactoryLockFile(new File(artifactoryHome.getDataDir(), LOCK_FILENAME));
-                artifactoryLockFile.tryLock();
-            }
-
-            Class<?> contextClass = ClassUtils.forName(
-                    "org.artifactory.spring.ArtifactoryApplicationContext", ClassUtils.getDefaultClassLoader());
-            Constructor<?> constructor = contextClass.
-                    getConstructor(String.class, SpringConfigPaths.class, ArtifactoryHome.class,
-                            ConverterManager.class, VersionProviderImpl.class);
-            //Construct the context name based on the context path
-            //(will not work with multiple servlet containers on the same vm!)
-            String contextUniqueName = HttpUtils.getContextId(servletContext);
-            SpringConfigPaths springConfigPaths = SpringConfigResourceLoader.getConfigurationPaths(artifactoryHome);
-            context = (ApplicationContext) constructor.newInstance(
-                    contextUniqueName, springConfigPaths, artifactoryHome, converterManager, versionProvider);
-        } finally {
-            ArtifactoryHome.unbind();
-        }
-        log.info("\n" +
-                "###########################################################\n" +
-                "### Artifactory successfully started (" +
-                String.format("%-17s", (DurationFormatUtils.formatPeriod(start, System.currentTimeMillis(), "s.S")) +
-                        " seconds)") + " ###\n" +
-                "###########################################################\n");
-
-        //Register the context for easy retrieval for faster destroy
-        servletContext.setAttribute(ArtifactoryContext.APPLICATION_CONTEXT_KEY, context);
-    }
-
-    @Override
-    public void contextDestroyed(ServletContextEvent event) {
-        AbstractApplicationContext context = (AbstractApplicationContext) event.getServletContext().getAttribute(
-                ArtifactoryContext.APPLICATION_CONTEXT_KEY);
-        try {
-            getLogger().debug("Context shutdown started");
-            if (context != null) {
-                if (context instanceof ArtifactoryContext) {
-                    AddonsManager addonsManager = ((ArtifactoryContext) context).beanForType(AddonsManager.class);
-                    addonsManager.addonByType(HaCommonAddon.class).shutdown();
-                }
-                context.destroy();
-            }
-            if (artifactoryLockFile != null) {
-                artifactoryLockFile.release();
-            }
-            getLogger().debug("Context shutdown Finished");
-        } finally {
-            event.getServletContext().removeAttribute(ArtifactoryContext.APPLICATION_CONTEXT_KEY);
-            event.getServletContext().removeAttribute(ArtifactoryHome.SERVLET_CTX_ATTR);
-        }
-    }
-
-    private void logAsciiArt(Logger log, ArtifactoryHome artifactoryHome, CompoundVersionDetails versionDetails) {
-        String message = null;
-        try {
-            message = buildEditionMessage(artifactoryHome, versionDetails);
-        } catch (Exception e) {
-            log.warn("Failed to detect edition {}", e.getMessage());
-            log.debug("Failed to detect edition {}", e.getMessage(), e);
-        }
-
-        // artifactory home location
-        message += " Artifactory Home: '" + artifactoryHome.getHomeDir().getAbsolutePath() + "'\n";
-
-        //optionally log HA properties
-        if (artifactoryHome.isHaConfigured()) {
-            HaNodeProperties haNodeProperties = artifactoryHome.getHaNodeProperties();
-            if (haNodeProperties != null) {
-                message += " Artifactory Cluster Home: '" + haNodeProperties.getClusterHome().getAbsolutePath()
-                        + "'\n HA Node ID: '" + haNodeProperties.getServerId() + "'\n";
-            }
-        }
-        log.info(message);
-    }
-
-    private String buildEditionMessage(ArtifactoryHome artifactoryHome, CompoundVersionDetails version)
-            throws Exception {
-        ArtifactoryEdition runningEdition = ArtifactoryEdition.detect(artifactoryHome);
-        InputStream resource = ResourceUtils.getResource("/ascii-editions.txt");
-        try (BufferedReader reader = new BufferedReader(new InputStreamReader(resource, Charsets.UTF_8))) {
-            String edition;
-            while ((edition = reader.readLine()) != null) {
-                if (!runningEdition.name().equalsIgnoreCase(edition)) {
-                    // skip 8 lines to get to the next chunk
-                    for (int i = 0; i < 8; i++) {
-                        reader.readLine();
-                    }
-
-                } else {
-                    StringBuilder sb = new StringBuilder("\n");
-                    // height of the ascii art with no modifications
-                    for (int i = 0; i < 6; i++) {
-                        sb.append(reader.readLine()).append("\n");
-                    }
-                    // line 7 prepend the version
-                    String versionLine = reader.readLine();
-                    String versionStr = " Version:  " + version.getVersionName();
-                    sb.append(versionStr).append(versionLine.substring(versionStr.length())).append("\n");
-
-                    // line 8 prepend the revision
-                    String revisionLine = reader.readLine();
-                    String revisionStr = " Revision: " + version.getRevision();
-                    sb.append(revisionStr).append(revisionLine.substring(revisionStr.length())).append("\n");
-
-                    return sb.toString();
-                }
-            }
-        }
-        throw new IllegalArgumentException("Couldn't find matching art for " + runningEdition);
-    }
-}
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/ArtifactoryEdition.java b/web/application/src/main/java/org/artifactory/webapp/servlet/ArtifactoryEdition.java
deleted file mode 100644
index bbdfef6..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/ArtifactoryEdition.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.webapp.servlet;
-
-import org.artifactory.common.ArtifactoryHome;
-
-/**
- * Enum of the various Artifactory editions.
- *
- * @author Yossi Shaul
- */
-public enum ArtifactoryEdition {
-    oss, pro, aol, ha;
-
-    /**
-     * Detects the edition based on configuration and available add-on implementations.
-     *
-     * @param artifactoryHome Running Artifactory home
-     * @return The running Artifactory edition
-     */
-    public static ArtifactoryEdition detect(ArtifactoryHome artifactoryHome) {
-        if (classExists("org.artifactory.addon.aol.webapp.AolCoreAddons")) {
-            return aol;
-        }
-        if (artifactoryHome.isHaConfigured() && classExists("org.artifactory.addon.ha.HaAddonImpl")) {
-            return ha;
-        }
-        if (classExists("org.artifactory.license.License")) {
-            return pro;
-        }
-        return oss;
-    }
-
-    private static boolean classExists(String clazz) {
-        try {
-            Class.forName(clazz);
-            return true;
-        } catch (Exception e) {
-            return false;
-        }
-    }
-}
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/ArtifactoryFilter.java b/web/application/src/main/java/org/artifactory/webapp/servlet/ArtifactoryFilter.java
deleted file mode 100644
index 785f7db..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/ArtifactoryFilter.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.webapp.servlet;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ArtifactoryContextThreadBinder;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.security.HttpAuthenticationDetails;
-import org.artifactory.util.HttpUtils;
-import org.artifactory.util.ResourceUtils;
-import org.artifactory.webapp.servlet.redirection.*;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.transaction.support.TransactionSynchronizationManager;
-
-import javax.servlet.*;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.util.List;
-
-public class ArtifactoryFilter implements Filter {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryFilter.class);
-
-    private boolean contextFailed = false;
-
-    private FilterConfig filterConfig;
-    private List<RedirectionHandler> redirectionHandlers = Lists.newArrayList(new SamlRedirectionHandler(),
-            new OldHomeRedirectionHandler(), new OldLoginRedirectionHandler(), new OldBuildsRedirectionHandler());
-
-    @Override
-    public void init(FilterConfig filterConfig) throws ServletException {
-        this.filterConfig = filterConfig;
-    }
-
-    @Override
-    public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain)
-            throws IOException, ServletException {
-        // Redirect or forward if need
-        for (RedirectionHandler redirectionHandler : redirectionHandlers) {
-            if (redirectionHandler.shouldRedirect(request)) {
-                redirectionHandler.redirect(request, response);
-                return;
-            }
-        }
-        if (filterConfig.getServletContext()
-                .getAttribute(DelayedInit.APPLICATION_CONTEXT_LOCK_KEY) != null) {
-            String requestURI = ((HttpServletRequest) request).getRequestURI();
-            if (requestURI.endsWith("artifactory-splash.gif")) {
-                ((HttpServletResponse) response).setStatus(200);
-                ServletOutputStream out = response.getOutputStream();
-                ResourceUtils.copyResource("/artifactory-splash.gif", out, null, getClass());
-                return;
-            }
-            response.setContentType("text/html");
-            ((HttpServletResponse) response).setStatus(HttpStatus.SC_SERVICE_UNAVAILABLE);
-            ServletOutputStream out = response.getOutputStream();
-            ResourceUtils.copyResource("/startup.html", out, null, getClass());
-            return;
-        }
-        try {
-            ServletContext servletContext = filterConfig.getServletContext();
-            ArtifactoryContext context = RequestUtils.getArtifactoryContext(servletContext);
-            if (context == null) {
-                respondFailedToInitialize(response);
-                return;
-            }
-            bind(context);
-            if (response instanceof HttpServletResponse) {
-                HttpServletResponse httpResponse = (HttpServletResponse) response;
-                if (!httpResponse.containsHeader("Server")) {
-                    //Add the server header (curl -I http://localhost:8080/artifactory/)
-                    httpResponse.setHeader("Server", HttpUtils.getArtifactoryUserAgent());
-                }
-
-                // set the Artifactory instance id header
-                String hostId = ContextHelper.get().beanForType(AddonsManager.class).addonByType(
-                        HaCommonAddon.class).getHostId();
-                httpResponse.setHeader(ArtifactoryResponse.ARTIFACTORY_ID, hostId);
-
-                String serverId = ContextHelper.get().getServerId();
-                if (StringUtils.isNotBlank(serverId) && !HaCommonAddon.ARTIFACTORY_PRO.equals(serverId)) {
-                    httpResponse.setHeader(HaCommonAddon.ARTIFACTORY_NODE_ID, serverId);
-                }
-            }
-            chain.doFilter(request, response);
-        } finally {
-            unbind();
-            // Check Transaction state of the thread
-            if (TransactionSynchronizationManager.isActualTransactionActive()) {
-                // Should not have transaction at this stage
-                debugTransaction(request);
-                TransactionSynchronizationManager.clear();
-            }
-        }
-    }
-
-    private void debugTransaction(ServletRequest req) {
-        try {
-            StringBuilder sb = new StringBuilder("Artifactory Storage Session transaction still active in RepoFilter!\n");
-            sb.append("TX Name: '").append(TransactionSynchronizationManager.getCurrentTransactionName()).append("' ");
-            sb.append("Isolation level: ").append(TransactionSynchronizationManager.getCurrentTransactionIsolationLevel());
-            sb.append(" TX active: ").append(TransactionSynchronizationManager.isActualTransactionActive());
-            sb.append(" read only: ").append(TransactionSynchronizationManager.isCurrentTransactionReadOnly());
-            sb.append(" sync active: ").append(TransactionSynchronizationManager.isSynchronizationActive());
-            if (TransactionSynchronizationManager.isSynchronizationActive()) {
-                sb.append("\nTX sync: ").append(TransactionSynchronizationManager.getSynchronizations());
-            }
-            sb.append("\nTX resources: ").append(TransactionSynchronizationManager.getResourceMap());
-            sb.append("\nRequest: ").append(requestDebugString((HttpServletRequest) req));
-            log.error(sb.toString());
-        } catch (Throwable t) {
-            log.error("Artifactory Storage Session transaction still active in RepoFilter! Failed to collect more info");
-        }
-    }
-
-    private static String requestDebugString(HttpServletRequest request) {
-        String queryString = request.getQueryString();
-        String str = request.getMethod() + " (" + new HttpAuthenticationDetails(request).getRemoteAddress() + ") " +
-                RequestUtils.getServletPathFromRequest(request) + (queryString != null ? queryString : "");
-        return str;
-    }
-
-    private void bind(ArtifactoryContext context) {
-        ArtifactoryContextThreadBinder.bind(context);
-        ArtifactoryHome.bind(context.getArtifactoryHome());
-    }
-
-    private void unbind() {
-        ArtifactoryContextThreadBinder.unbind();
-        ArtifactoryHome.unbind();
-    }
-
-    private void respondFailedToInitialize(ServletResponse response) throws IOException {
-        if (!contextFailed) {
-            org.slf4j.Logger log = LoggerFactory.getLogger(ArtifactoryFilter.class);
-            log.error("Artifactory failed to initialize: Context is null");
-            contextFailed = true;
-        }
-
-        if (response instanceof HttpServletResponse) {
-            HttpUtils.sendErrorResponse((HttpServletResponse) response, HttpStatus.SC_INTERNAL_SERVER_ERROR,
-                    "Artifactory failed to initialize: check Artifactory logs for errors.");
-        }
-    }
-
-    @Override
-    public void destroy() {
-        unbind();
-    }
-}
\ No newline at end of file
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/ArtifactoryHomeConfigListener.java b/web/application/src/main/java/org/artifactory/webapp/servlet/ArtifactoryHomeConfigListener.java
deleted file mode 100644
index 2f5f01a..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/ArtifactoryHomeConfigListener.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.webapp.servlet;
-
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.converters.ConvertersManagerImpl;
-import org.artifactory.converters.VersionProviderImpl;
-import org.artifactory.log.BootstrapLogger;
-
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
-import java.io.File;
-
-/**
- * @author yoavl
- */
-public class ArtifactoryHomeConfigListener implements ServletContextListener {
-
-    @Override
-    public void contextInitialized(ServletContextEvent event) {
-        ServletContext servletContext = event.getServletContext();
-        String artHomeCtx = servletContext.getInitParameter(ArtifactoryHome.SYS_PROP);
-        ArtifactoryHome artifactoryHome;
-        if (artHomeCtx != null) {
-            // Use home dir from Context
-            artifactoryHome = new ArtifactoryHome(new File(artHomeCtx));
-        } else {
-            // Initialize home dir using default behavior
-            artifactoryHome = new ArtifactoryHome(new ServletLogger(servletContext));
-        }
-        BootstrapLogger.info("Starting Artifactory [artifactory.home=" +
-                artifactoryHome.getHomeDir().getAbsolutePath() + "].");
-        // add the artifactory home to the servlet context
-        servletContext.setAttribute(ArtifactoryHome.SERVLET_CTX_ATTR, artifactoryHome);
-        VersionProviderImpl versionProvider = new VersionProviderImpl(artifactoryHome);
-        ConvertersManagerImpl convertersManager = new ConvertersManagerImpl(artifactoryHome, versionProvider);
-        convertersManager.convertHomes();
-        // add the converterManager to the servlet context
-        servletContext.setAttribute(ArtifactoryHome.ARTIFACTORY_CONVERTER_OBJ, convertersManager);
-        servletContext.setAttribute(ArtifactoryHome.ARTIFACTORY_VERSION_PROVIDER_OBJ, versionProvider);
-        // Init System properties
-        artifactoryHome.initAndLoadSystemPropertyFile();
-        // Init and load Mimetypes
-        artifactoryHome.initAndLoadMimeTypes();
-    }
-
-    private static class ServletLogger implements ArtifactoryHome.SimpleLog {
-        private final ServletContext servletContext;
-
-        private ServletLogger(ServletContext servletContext) {
-            this.servletContext = servletContext;
-        }
-
-        @Override
-        public void log(String message) {
-            servletContext.log(message);
-        }
-    }
-
-    @Override
-    public void contextDestroyed(ServletContextEvent sce) {
-    }
-}
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/DelayedFilterBase.java b/web/application/src/main/java/org/artifactory/webapp/servlet/DelayedFilterBase.java
deleted file mode 100644
index 12ee380..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/DelayedFilterBase.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.webapp.servlet;
-
-import javax.servlet.Filter;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import java.util.concurrent.BlockingQueue;
-
-public abstract class DelayedFilterBase implements DelayedInit, Filter {
-
-    private FilterConfig filterConfig;
-
-    @Override
-    @SuppressWarnings({"unchecked"})
-    public final void init(FilterConfig filterConfig) throws ServletException {
-        BlockingQueue<Filter> waiters = (BlockingQueue<Filter>) filterConfig.getServletContext()
-                .getAttribute(APPLICATION_CONTEXT_LOCK_KEY);
-        this.filterConfig = filterConfig;
-        if (waiters != null) {
-            waiters.add(this);
-        } else {
-            //Servlet 2.5 lazy filter initing
-            delayedInit();
-        }
-    }
-
-    @Override
-    public void delayedInit() throws ServletException {
-        initLater(filterConfig);
-    }
-
-    protected abstract void initLater(FilterConfig config) throws ServletException;
-}
\ No newline at end of file
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/HttpArtifactoryRequest.java b/web/application/src/main/java/org/artifactory/webapp/servlet/HttpArtifactoryRequest.java
deleted file mode 100644
index 4d1e49a..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/HttpArtifactoryRequest.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.webapp.servlet;
-
-import org.apache.http.HttpHeaders;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.request.ArtifactoryRequestBase;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.request.ArtifactoryRequest;
-import org.artifactory.util.HttpUtils;
-
-import javax.servlet.http.HttpServletRequest;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
-
-public class HttpArtifactoryRequest extends ArtifactoryRequestBase {
-
-    private final HttpServletRequest httpRequest;
-
-    public HttpArtifactoryRequest(HttpServletRequest httpRequest) throws UnsupportedEncodingException {
-        this.httpRequest = httpRequest;
-        String servletPath = RequestUtils.getServletPathFromRequest(httpRequest);
-        RepoPath repoPath = calculateRepoPath(servletPath);
-        setRepoPath(repoPath);
-    }
-
-    @Override
-    public long getLastModified() {
-        return httpRequest.getDateHeader(HttpHeaders.LAST_MODIFIED);
-    }
-
-    @Override
-    public boolean isHeadOnly() {
-        return "HEAD".equalsIgnoreCase(httpRequest.getMethod());
-    }
-
-    @Override
-    public String getClientAddress() {
-        return HttpUtils.getRemoteClientAddress(httpRequest);
-    }
-
-    @Override
-    public String getServletContextUrl() {
-        return HttpUtils.getServletContextUrl(httpRequest);
-    }
-
-    @Override
-    public long getIfModifiedSince() {
-        return httpRequest.getDateHeader(HttpHeaders.IF_MODIFIED_SINCE);
-    }
-
-    @Override
-    public boolean hasIfModifiedSince() {
-        return getIfModifiedSince() != -1;
-    }
-
-    @Override
-    public boolean isFromAnotherArtifactory() {
-        Enumeration origins = getOrigins();
-        return origins.hasMoreElements();
-    }
-
-    @Override
-    public boolean isRecursive() {
-        Enumeration<String> origins = getOrigins();
-        if (origins != null && origins.hasMoreElements()) {
-            ArrayList<String> originsList = Collections.list(origins);
-            String currentHostId = ContextHelper.get().beanForType(AddonsManager.class).addonByType(
-                    HaCommonAddon.class).getHostId();
-            int numOfOrigins = originsList.size();
-            for (String origin : originsList) {
-                if (numOfOrigins > 1 && currentHostId.equals(origin)) {
-                    return true;
-                }
-            }
-        }
-
-        return false;
-    }
-
-    @Override
-    public InputStream getInputStream() throws IOException {
-        return httpRequest.getInputStream();
-    }
-
-    /**
-     * @see javax.servlet.ServletRequest#getContentLength()
-     */
-    @Override
-    public long getContentLength() {
-        return HttpUtils.getContentLength(httpRequest);
-    }
-
-    @Override
-    public String getHeader(String headerName) {
-        return httpRequest.getHeader(headerName);
-    }
-
-    @Override
-    public Enumeration getHeaders(String headerName) {
-        return httpRequest.getHeaders(headerName);
-    }
-
-    @Override
-    public Map<String, String> getHeaders() {
-        String headerName;
-        Map<String, String> headers = new HashMap<>();
-        Enumeration enumeration = httpRequest.getHeaderNames();
-        while (enumeration != null && enumeration.hasMoreElements()) {
-            headerName = (String)enumeration.nextElement();
-            headers.put(headerName, httpRequest.getHeader(headerName));
-        }
-        return headers;
-    }
-
-    @Override
-    public String getUri() {
-        return httpRequest.getRequestURI();
-    }
-
-    @Override
-    public Map<String, String[]> getParameters() {
-        return httpRequest.getParameterMap();
-    }
-
-    @Override
-    public String getParameter(String name) {
-        return httpRequest.getParameter(name);
-    }
-
-    @Override
-    public String[] getParameterValues(String name) {
-        return httpRequest.getParameterValues(name);
-    }
-
-    @Override
-    public String toString() {
-        return getUri();
-    }
-
-    private Enumeration getOrigins() {
-        Enumeration origins = getHeaders(ArtifactoryRequest.ARTIFACTORY_ORIGINATED);
-        if (origins == null) {
-            origins = getHeaders(ArtifactoryRequest.ORIGIN_ARTIFACTORY);
-        }
-        return origins;
-    }
-}
\ No newline at end of file
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/RepoFilter.java b/web/application/src/main/java/org/artifactory/webapp/servlet/RepoFilter.java
deleted file mode 100644
index 6249faa..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/RepoFilter.java
+++ /dev/null
@@ -1,397 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.webapp.servlet;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpHeaders;
-import org.apache.http.HttpStatus;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.exception.FileExpectedException;
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.api.request.DownloadService;
-import org.artifactory.api.request.UploadService;
-import org.artifactory.api.rest.constant.ArtifactRestConstants;
-import org.artifactory.api.rest.constant.GitLfsResourceConstants;
-import org.artifactory.api.webdav.WebdavService;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-import org.artifactory.exception.CancelException;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.request.ArtifactoryRequest;
-import org.artifactory.request.RepoRequests;
-import org.artifactory.security.HttpAuthenticationDetails;
-import org.artifactory.util.HttpUtils;
-import org.artifactory.util.PathUtils;
-import org.artifactory.util.UiRequestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.http.MediaType;
-
-import javax.servlet.*;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletRequestWrapper;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.List;
-
-public class RepoFilter extends DelayedFilterBase {
-    private static final Logger log = LoggerFactory.getLogger(RepoFilter.class);
-
-    public static final String ATTR_ARTIFACTORY_REPOSITORY_PATH = "artifactory.repository_path";
-    public static final String ATTR_ARTIFACTORY_REQUEST_PROPERTIES = "artifactory.request_properties";
-    public static final String ATTR_ARTIFACTORY_REMOVED_REPOSITORY_PATH =
-            "artifactory.removed_repository_path";
-
-    @Override
-    public void initLater(FilterConfig filterConfig) throws ServletException {
-        String nonUiPathPrefixes = filterConfig.getInitParameter("nonUiPathPrefixes");
-        String uiPathPrefixes = filterConfig.getInitParameter("UiPathPrefixes");
-        List<String> nonUiPrefixes = PathUtils.delimitedListToStringList(nonUiPathPrefixes, ",");
-        UiRequestUtils.setNonUiPathPrefixes(nonUiPrefixes);
-        RequestUtils.setNonUiPathPrefixes(nonUiPrefixes);
-        List<String> uiPrefixes = PathUtils.delimitedListToStringList(uiPathPrefixes, ",");
-        uiPrefixes.add(HttpUtils.WEBAPP_URL_PATH_PREFIX);
-        RequestUtils.setUiPathPrefixes(uiPrefixes);
-        UiRequestUtils.setUiPathPrefixes(uiPrefixes);
-    }
-
-    @Override
-    public void destroy() {
-    }
-
-    @Override
-    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
-            throws IOException, ServletException {
-        HttpServletRequest request = (HttpServletRequest) req;
-        HttpServletResponse response = (HttpServletResponse) resp;
-        final String servletPath = RequestUtils.getServletPathFromRequest(request);
-        execute(chain, request, response, servletPath);
-    }
-
-    @SuppressWarnings("OverlyComplexMethod")
-    private void execute(FilterChain chain, final HttpServletRequest request, HttpServletResponse response,
-                         String servletPath) throws IOException, ServletException {
-        if (log.isDebugEnabled()) {
-            log.debug("Entering request {}.", requestDebugString(request));
-        }
-        if (request.getRequestURI().endsWith("treebrowser")) {
-            ArtifactoryRequest artifactoryRequest = new HttpArtifactoryRequest(request);
-            request.setAttribute(ATTR_ARTIFACTORY_REPOSITORY_PATH, artifactoryRequest.getRepoPath());
-            request.setAttribute(ATTR_ARTIFACTORY_REQUEST_PROPERTIES, artifactoryRequest.getProperties());
-        }
-        boolean repoRequest = servletPath != null && RequestUtils.isRepoRequest(request, true);
-        if (repoRequest && servletPath.startsWith("/" + ArtifactoryRequest.LIST_BROWSING_PATH)
-                && servletPath.endsWith("/")) {
-            ArtifactoryRequest artifactoryRequest = new HttpArtifactoryRequest(request);
-            String repoKey = artifactoryRequest.getRepoKey();
-            if (VirtualRepoDescriptor.GLOBAL_VIRTUAL_REPO_KEY.equals(repoKey)
-                    && ConstantValues.disableGlobalRepoAccess.getBoolean()) {
-                // The global /repo is disabled. Cannot be used here, returning 403!
-                String msg = "Accessing the global virtual repository /repo is disabled!";
-                log.warn(msg);
-                response.sendError(HttpStatus.SC_FORBIDDEN, msg);
-                return;
-            }
-            doRepoListing(request, response, servletPath, artifactoryRequest);
-            return;
-        }
-
-        String method = request.getMethod().toLowerCase().intern();
-
-        if (repoRequest) {
-            ArtifactoryRequest artifactoryRequest = new HttpArtifactoryRequest(request);
-            //Handle upload and download requests
-            ArtifactoryResponse artifactoryResponse = new HttpArtifactoryResponse(response);
-
-            if (artifactoryRequest.isDirectoryRequest() && isGetOrHeadRequest(method)) {
-                //Check that this is not a recursive call
-                if (artifactoryRequest.isRecursive()) {
-                    String msg = "Recursive call detected for '" + request + "'. Returning nothing.";
-                    artifactoryResponse.sendError(HttpStatus.SC_NOT_FOUND, msg, log);
-                    return;
-                }
-                log.debug("Serving a directory get request.");
-                String repoKey = artifactoryRequest.getRepoKey();
-                if (VirtualRepoDescriptor.GLOBAL_VIRTUAL_REPO_KEY.equals(repoKey)
-                        && ConstantValues.disableGlobalRepoAccess.getBoolean()) {
-                    // The global /repo is disabled. Cannot be used here, returning 403!
-                    String msg = "Accessing the global virtual repository /repo is disabled!";
-                    log.warn(msg);
-                    response.sendError(HttpStatus.SC_FORBIDDEN, msg);
-                    return;
-                }
-                doRepoListing(request, response, servletPath, artifactoryRequest);
-                return;
-            }
-
-            try {
-                initRequestContext(method, artifactoryRequest, artifactoryResponse);
-                if (isGetOrHeadRequest(method)) {
-
-                    /**
-                     * Do not check for this parameter when not performing a get/head request so that the container
-                     * doesn't try to read the parameters and verify the size of the form in case of an upload
-                     */
-                    if (artifactoryRequest.getParameter(ArtifactRestConstants.TRACE_PARAM) != null) {
-                        //Re-init the context with the trace logging response
-                        artifactoryResponse = new TraceLoggingResponse(artifactoryResponse);
-                        initRequestContext(method, artifactoryRequest, artifactoryResponse);
-                    }
-
-                    // TODO: Should we return 405 Method not allowed for head request on properties:
-                    // TODO: For now the HEAD request will ignore this properties query param
-                    if (artifactoryRequest.getParameter(ArtifactRestConstants.PROPERTIES_PARAM) != null) {
-                        //Set the response to return only the properties of the item in json format
-                        artifactoryResponse.setPropertiesMediaType(MediaType.APPLICATION_JSON.toString());
-                    }
-                    if (artifactoryRequest.getParameter(ArtifactRestConstants.PROPERTIES_XML_PARAM) != null) {
-                        //Set the response to return only the properties of the item in json format
-                        artifactoryResponse.setPropertiesMediaType(MediaType.APPLICATION_XML.toString());
-                    }
-
-                    doDownload(request, response, method, artifactoryRequest, artifactoryResponse);
-                    return;
-                }
-
-                if ("put".equals(method)) {
-                    doUpload(artifactoryRequest, artifactoryResponse);
-                    return;
-                }
-
-                doWebDavMethod(request, response, method, artifactoryRequest, artifactoryResponse);
-            } finally {
-                RepoRequests.destroy();
-            }
-
-        } else if (!response.isCommitted()) {
-            // Webdav request not on repository, return 403
-            if (RequestUtils.isWebdavRequest(request)) {
-                response.setStatus(HttpServletResponse.SC_FORBIDDEN);
-                if (log.isDebugEnabled()) {
-                    log.debug("Received webdav request on " + servletPath + " which is not a repository!\n" +
-                            "Returning " + HttpServletResponse.SC_FORBIDDEN);
-                }
-            } else {
-                // TODO: [by dan] this is a workaround for the Git LFS bug in 0.5.1 - see RTFACT-7587 remove this ugly
-                // TODO: hack when we decide we can drop support for versions < 0.5.2 or when Jersey is updated above 2.0
-                chain.doFilter(wrapRequestIfNeeded(request), response);
-            }
-        }
-        if (log.isDebugEnabled()) {
-            log.debug("Exiting request " + requestDebugString(request));
-        }
-    }
-
-    private boolean isGetOrHeadRequest(String method) {
-        return "get".equals(method) || "head".equals(method);
-    }
-
-    private void initRequestContext(String method, ArtifactoryRequest artifactoryRequest,
-                                    ArtifactoryResponse artifactoryResponse) {
-        RepoRequests.set(method, getContext().getAuthorizationService().currentUsername(),
-                artifactoryRequest, artifactoryResponse);
-    }
-
-    private void doWebDavMethod(HttpServletRequest request, HttpServletResponse response, String method,
-                                ArtifactoryRequest artifactoryRequest, ArtifactoryResponse artifactoryResponse) throws IOException {
-        if (!getWebdavService().handleRequest(method, artifactoryRequest, artifactoryResponse)) {
-            response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
-            response.setHeader("Allow", PathUtils.collectionToDelimitedString(getWebdavService().supportedMethods()));
-            log.info("Received unsupported request method: {} from:{ }.", method, request.getRemoteAddr());
-        }
-    }
-
-    private void doUpload(ArtifactoryRequest artifactoryRequest, ArtifactoryResponse artifactoryResponse)
-            throws IOException {
-        try {
-            log.debug("Serving an upload request.");
-            getUploadEngine().upload(artifactoryRequest, artifactoryResponse);
-        } catch (CancelException e) {
-            log.debug("Upload request has been canceled", e.getMessage());
-            artifactoryResponse.sendInternalError(e, log);
-        } catch (Exception e) {
-            log.debug("Upload request of {} failed due to {}", artifactoryRequest.getRepoPath(), e);
-            artifactoryResponse.sendInternalError(e, log);
-        }
-    }
-
-    private void doDownload(HttpServletRequest request, HttpServletResponse response, String method,
-                            ArtifactoryRequest artifactoryRequest, ArtifactoryResponse artifactoryResponse) throws IOException {
-
-        if (redirectLegacyMetadataRequest(request, response, artifactoryRequest)) {
-            return;
-        }
-
-        try {
-            RepoRequests.logToContext("Received request");
-            getDownloadService().process(artifactoryRequest, artifactoryResponse);
-        } catch (FileExpectedException e) {
-            // If we try to get a file but encounter a folder and the request does not end with a '/' send a redirect
-            // that adds the slash with the request with a 302 status code. In the next request if it is a head request,
-            // then it is ok since the resource was found and avoid an infinite redirect situation, however if it is a
-            // GET, then return a 404 since it is the incorrect resource to get (we mimic was apache servers are doing).
-            // see RTFACT-2738 and RTFACT-3510
-            if (!request.getServletPath().endsWith("/")) {
-                String dirPath = request.getRequestURL().append("/").toString();
-                RepoRequests.logToContext("Redirecting to the directory path '%s'", dirPath);
-                response.sendRedirect(dirPath);
-            } else if ("head".equals(method)) {
-                RepoRequests.logToContext("Handling directory HEAD request ");
-            } else {
-                RepoRequests.logToContext("Expected file but received a directory - returning a %s response",
-                        HttpServletResponse.SC_NOT_FOUND);
-                artifactoryResponse.sendError(HttpServletResponse.SC_NOT_FOUND,
-                        "Expected file response but received a directory response: " + e.getRepoPath(), log);
-            }
-        } catch (CancelException e) {
-            RepoRequests.logToContext("Request has been canceled", e.getMessage(), e.getErrorCode());
-            artifactoryResponse.sendError(e.getErrorCode(), "Download request has been canceled: " + e.getMessage(),
-                    log);
-            log.debug("Download request has been canceled" + e.getMessage(), e);
-        } catch (Exception e) {
-            RepoRequests.logToContext("Error handling request: %s - returning a %s response", e.getMessage(),
-                    HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-            if (!(e instanceof IOException) && !artifactoryResponse.isCommitted()) {
-                // io exception is handled by the download service
-                artifactoryResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
-                        "Could not process download request: " + e.getMessage(), log);
-            }
-            log.debug("Could not process download request: " + e.getMessage(), e);
-        }
-    }
-
-    private void doRepoListing(HttpServletRequest request, HttpServletResponse response, String servletPath,
-                               ArtifactoryRequest artifactoryRequest) throws ServletException, IOException {
-        log.debug("Forwarding internally to an apache-style listing page.");
-        if (!servletPath.endsWith("/")) {
-            response.sendRedirect(HttpUtils.getServletContextUrl(request) + servletPath + "/");
-            return;
-        }
-        request.setAttribute(ATTR_ARTIFACTORY_REPOSITORY_PATH, artifactoryRequest.getRepoPath());
-        request.setAttribute(ATTR_ARTIFACTORY_REQUEST_PROPERTIES, artifactoryRequest.getProperties());
-
-        RequestDispatcher dispatcher = request.getRequestDispatcher("/ui/nativeBrowser");
-        dispatcher.forward(request, response);
-    }
-
-    private ArtifactoryContext getContext() {
-        return ContextHelper.get();
-    }
-
-    private WebdavService getWebdavService() {
-        return getContext().beanForType(WebdavService.class);
-    }
-
-    private DownloadService getDownloadService() {
-        return getContext().beanForType(DownloadService.class);
-    }
-
-    private UploadService getUploadEngine() {
-        return getContext().beanForType(UploadService.class);
-    }
-
-    private static String requestDebugString(HttpServletRequest request) {
-        String queryString = request.getQueryString();
-        String str = request.getMethod() + " (" + new HttpAuthenticationDetails(request).getRemoteAddress() + ") " +
-                RequestUtils.getServletPathFromRequest(request) + (queryString != null ? queryString : "");
-        return str;
-    }
-
-    private boolean redirectLegacyMetadataRequest(HttpServletRequest request, HttpServletResponse response,
-                                                  ArtifactoryRequest artifactoryRequest) throws IOException {
-        // redirect to the appropriate REST api for legacy metadata requests
-        // for example '/path/to/item:properties' is redirected to 'api/storage/path/to/item?propertiesXml'
-        String requestPath = artifactoryRequest.getPath();
-        if (NamingUtils.isProperties(requestPath)) {
-            RepoPath repoPath = artifactoryRequest.getRepoPath();
-            log.debug("Deprecated metadata download detected: {}", request.getRequestURL());
-            String location = HttpUtils.getServletContextUrl(request) +
-                    "/api/storage/" + repoPath.getRepoKey() + "/" +
-                    NamingUtils.stripMetadataFromPath(repoPath.getPath()) + "?" +
-                    NamingUtils.getMetadataName(artifactoryRequest.getPath()) + "Xml";
-            RepoRequests.logToContext("Redirecting to path '%s'", location);
-            response.sendRedirect(HttpUtils.encodeQuery(location));
-            return true;
-        }
-        return false;
-    }
-
-    private HttpServletRequest wrapRequestIfNeeded(HttpServletRequest request) {
-        if (isGitLfsRequest(request)) {
-            log.debug("Identified '/api/lfs' in incoming ServletRequest path. " +
-                    "Wrapping it with a GitLfsMalformedRequestWrapper");
-            return new GitLfsMalformedRequestWrapper(request);
-        }
-        if (isDockerRequest(request)) {
-            log.debug("Identified '/api/lfs' in incoming ServletRequest path. " +
-                    "Wrapping it with a GitLfsMalformedRequestWrapper");
-            return new DockerMalformedRequestWrapper(request);
-        }
-        return request;
-    }
-
-    private boolean isGitLfsRequest(HttpServletRequest request) {
-        String lfsApiPath = "/api/" + GitLfsResourceConstants.PATH_ROOT;
-        String joinedRequestPath = request.getServletPath() + request.getPathInfo();
-        return joinedRequestPath.contains(lfsApiPath) || request.getRequestURL().toString().contains(lfsApiPath);
-    }
-
-    private boolean isDockerRequest(HttpServletRequest request) {
-        String dockerApiPath = "/api/docker";
-        String joinedRequestPath = request.getServletPath() + request.getPathInfo();
-        return joinedRequestPath.contains(dockerApiPath) || request.getRequestURL().toString().contains(dockerApiPath);
-    }
-
-    private static class GitLfsMalformedRequestWrapper extends HttpServletRequestWrapper {
-        public GitLfsMalformedRequestWrapper(HttpServletRequest request) {
-            super(request);
-        }
-
-        @Override
-        public Enumeration getHeaders(String name) {
-            if (name.equalsIgnoreCase(HttpHeaders.ACCEPT) || name.equalsIgnoreCase(HttpHeaders.CONTENT_TYPE)) {
-                log.debug("Returning fixed Git LFS header {}", name);
-                return Collections.enumeration(Lists.newArrayList(GitLfsResourceConstants.LFS_JSON));
-            } else {
-                return super.getHeaders(name);
-            }
-        }
-    }
-
-    private static class DockerMalformedRequestWrapper extends HttpServletRequestWrapper {
-        public DockerMalformedRequestWrapper(HttpServletRequest request) {
-            super(request);
-        }
-
-        @Override
-        public Enumeration getHeaders(String name) {
-            if (name.equalsIgnoreCase(HttpHeaders.CONTENT_TYPE) && StringUtils.isBlank(getRequest().getContentType())) {
-                log.debug("Returning fixed Docker Content-Type header {}", name);
-                return Collections.enumeration(Lists.newArrayList("application/octet-stream"));
-            } else {
-                return super.getHeaders(name);
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/RequestFilter.java b/web/application/src/main/java/org/artifactory/webapp/servlet/RequestFilter.java
deleted file mode 100644
index 2bd10e0..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/RequestFilter.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.webapp.servlet;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpHeaders;
-import org.artifactory.request.RequestThreadLocal;
-import org.artifactory.request.RequestWrapper;
-import org.artifactory.security.HttpAuthenticationDetails;
-import org.artifactory.traffic.RequestLogger;
-import org.artifactory.util.HttpUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.core.Authentication;
-
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpServletResponseWrapper;
-import java.io.IOException;
-
-/**
- * A dedicated filter for the Request Logger that sits after the ArtifactoryFilter
- *
- * @author Noam Tenne
- */
-public class RequestFilter extends DelayedFilterBase {
-    private static final Logger log = LoggerFactory.getLogger(RequestFilter.class);
-
-    @Override
-    public void initLater(FilterConfig filterConfig) throws ServletException {
-    }
-
-    @Override
-    public void doFilter(final ServletRequest req, final ServletResponse resp, final FilterChain chain)
-            throws IOException, ServletException {
-        long start = System.currentTimeMillis();
-        //Wrap the response
-        HttpServletRequest request = (HttpServletRequest) req;
-        HttpServletResponse response = (HttpServletResponse) resp;
-        CapturingHttpServletResponseWrapper responseWrapper = new CapturingHttpServletResponseWrapper(response);
-        try {
-            RequestWrapper requestWrapper = new RequestWrapper(request);
-            RequestThreadLocal.set(requestWrapper);
-            chain.doFilter(req, responseWrapper);
-            String servletPath = RequestUtils.getServletPathFromRequest(request);
-            String method = request.getMethod();
-            long contentLength = 0;
-            if ("get".equalsIgnoreCase(method)) {
-                contentLength = responseWrapper.getContentLength();
-            }
-            if (("put".equalsIgnoreCase(method)) || ("post".equalsIgnoreCase(method))) {
-                contentLength = HttpUtils.getContentLength(request);
-            }
-            Object userAtt = req.getAttribute(AccessFilter.AUTHENTICATED_USERNAME_ATTRIBUTE);
-            String username = userAtt != null ? userAtt.toString() : "non_authenticated_user";
-            String remoteAddress = HttpUtils.getRemoteClientAddress(request);
-            RequestLogger.request(remoteAddress, username, method, servletPath, request.getProtocol(),
-                    responseWrapper.getStatus(), contentLength, System.currentTimeMillis() - start);
-        } finally {
-            RequestThreadLocal.destroy();
-        }
-    }
-
-    /**
-     * find user name from props toke
-     *
-     * @param request  - http servlet request
-     * @param username - user name
-     * @return user name for request log
-     */
-    private String findPropAuthUserNameByToken(HttpServletRequest request, String username) {
-        if (StringUtils.isEmpty(username) && RequestUtils.getApiKeyTokenKeyValue(request) != null) {
-            String userNameByPropsAuth = RequestUtils.getUserNameByPropsAuth(request);
-            if (userNameByPropsAuth != null) {
-                username = userNameByPropsAuth;
-            } else {
-                username = "non_authenticated_user";
-            }
-        }
-        return username;
-    }
-
-    @Override
-    public void destroy() {
-    }
-
-    /**
-     * A custom response wrapper the helps capture the return code and the content length
-     */
-    private static class CapturingHttpServletResponseWrapper extends HttpServletResponseWrapper {
-        private int status;
-        private long contentLength;
-
-        /**
-         * Constructs a response adaptor wrapping the given response.
-         *
-         * @throws IllegalArgumentException if the response is null
-         */
-        public CapturingHttpServletResponseWrapper(HttpServletResponse response) {
-            super(response);
-            status = 200;
-        }
-
-        public int getStatus() {
-            return status;
-        }
-
-        public long getContentLength() {
-            return contentLength;
-        }
-
-        @Override
-        public void addHeader(String name, String value) {
-            super.addHeader(name, value);
-            captureString(name, value);
-        }
-
-        @Override
-        public void addIntHeader(String name, int value) {
-            super.addIntHeader(name, value);
-            captureInt(name, value);
-        }
-
-        @Override
-        public void setHeader(String name, String value) {
-            super.setHeader(name, value);
-            captureString(name, value);
-        }
-
-        @Override
-        public void setIntHeader(String name, int value) {
-            super.setIntHeader(name, value);
-            captureInt(name, value);
-        }
-
-        @Override
-        public void setContentLength(int len) {
-            contentLength = len;
-            super.setContentLength(len);
-        }
-
-        @Override
-        public void setStatus(int sc) {
-            if (notCommitted(sc)) {
-                status = sc;
-                super.setStatus(sc);
-            }
-        }
-
-        @Override
-        public void setStatus(int sc, String sm) {
-            if (notCommitted(sc, sm)) {
-                status = sc;
-                super.setStatus(sc, sm);
-            }
-        }
-
-        @Override
-        public void sendError(int sc) throws IOException {
-            if (notCommitted(sc)) {
-                status = sc;
-                HttpUtils.sendErrorResponse((HttpServletResponse) getResponse(), sc, null);
-            }
-        }
-
-        @Override
-        public void sendError(int sc, String msg) throws IOException {
-            if (notCommitted(sc, msg)) {
-                status = sc;
-                if (status == SC_NOT_FOUND) {
-                    msg = "Not Found";
-                }
-                HttpUtils.sendErrorResponse((HttpServletResponse) getResponse(), sc, msg);
-            }
-        }
-
-        @Override
-        public void sendRedirect(String location) throws IOException {
-            super.sendRedirect(location);
-            status = SC_FOUND;
-        }
-
-        private boolean notCommitted(int status) {
-            return notCommitted(status, null);
-        }
-
-        private boolean notCommitted(int status, String reason) {
-            if (isCommitted()) {
-                log.debug("Cannot change status " + status + (reason != null ? " (" + reason + ")" : "") + ": " +
-                        "response already committed.");
-                return false;
-            }
-            return true;
-        }
-
-        private void captureString(String name, String value) {
-            if (name.equals(HttpHeaders.CONTENT_LENGTH) && StringUtils.isNumeric(value)) {
-                contentLength = Long.parseLong(value);
-            }
-        }
-
-        private void captureInt(String name, int value) {
-            captureString(name, value + "");
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/RequestUtils.java b/web/application/src/main/java/org/artifactory/webapp/servlet/RequestUtils.java
deleted file mode 100644
index 8526ba0..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/RequestUtils.java
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.webapp.servlet;
-
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpHeaders;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.webdav.WebdavService;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.md.Properties;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.request.ArtifactoryRequest;
-import org.artifactory.security.props.auth.ApiKeyManager;
-import org.artifactory.security.props.auth.model.TokenKeyValue;
-import org.artifactory.util.HttpUtils;
-import org.artifactory.util.PathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.core.Authentication;
-
-import javax.servlet.ServletContext;
-import javax.servlet.ServletRequest;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Locale;
-import java.util.Set;
-
-import static org.apache.commons.lang.StringUtils.EMPTY;
-import static org.artifactory.webapp.servlet.RepoFilter.ATTR_ARTIFACTORY_REPOSITORY_PATH;
-
-/**
- * User: freds Date: Aug 13, 2008 Time: 10:56:25 AM
- */
-public abstract class RequestUtils {
-    private static final Logger log = LoggerFactory.getLogger(RequestUtils.class);
-
-    private static final Set<String> NON_UI_PATH_PREFIXES = new HashSet<>();
-    private static final Set<String> PACKAGES_ENDPOINT_USE_BASIC_AUTH = new HashSet<>();
-    private static final Set<String> UI_PATH_PREFIXES = new HashSet<>();
-    public static final String LAST_USER_KEY = "artifactory:lastUserId";
-    private static final String DEFAULT_ENCODING = "utf-8";
-
-    private RequestUtils() {
-        // utility class
-    }
-
-    public static void setNonUiPathPrefixes(Collection<String> uriPathPrefixes) {
-        NON_UI_PATH_PREFIXES.clear();
-        NON_UI_PATH_PREFIXES.addAll(uriPathPrefixes);
-    }
-
-    public static void setUiPathPrefixes(Collection<String> uriPathPrefixes) {
-        UI_PATH_PREFIXES.clear();
-        UI_PATH_PREFIXES.addAll(uriPathPrefixes);
-    }
-
-    public static void setPackagesEndpointUseBasicAuth() {
-        PACKAGES_ENDPOINT_USE_BASIC_AUTH.clear();
-        PACKAGES_ENDPOINT_USE_BASIC_AUTH.add("/api/docker/");
-        PACKAGES_ENDPOINT_USE_BASIC_AUTH.add("/api/nuget/");
-        PACKAGES_ENDPOINT_USE_BASIC_AUTH.add("/api/vagrant/");
-    }
-
-    @SuppressWarnings({"IfMayBeConditional"})
-    public static String getContextPrefix(HttpServletRequest request) {
-        String contextPrefix;
-        String requestUri = request.getRequestURI();
-        int contextPrefixEndIdx = requestUri.indexOf('/', 1);
-        if (contextPrefixEndIdx > 0) {
-            contextPrefix = requestUri.substring(1, contextPrefixEndIdx);
-        } else {
-            contextPrefix = "";
-        }
-        return contextPrefix;
-    }
-
-    public static boolean matchPkgEndpoint(HttpServletRequest request, String pkgUri) {
-        String requestUri = request.getRequestURI();
-        String packageEndPoint = request.getContextPath() + pkgUri;
-        return requestUri.startsWith(packageEndPoint);
-    }
-
-
-    public static boolean pkgEndpointMatchBasicAuth(HttpServletRequest request) {
-        String requestUri = request.getRequestURI();
-        return PACKAGES_ENDPOINT_USE_BASIC_AUTH.stream().anyMatch(pkgUri ->
-                requestUri.startsWith(request.getContextPath() + pkgUri));
-    }
-
-    public static boolean isRepoRequest(HttpServletRequest request) {
-        return isRepoRequest(request, false);
-    }
-
-    public static boolean isRepoRequest(HttpServletRequest request, boolean warnIfRepoDoesNotExist) {
-        String servletPath = getServletPathFromRequest(request);
-        String pathPrefix = PathUtils.getFirstPathElement(servletPath);
-        if (pathPrefix == null || pathPrefix.length() == 0) {
-            return false;
-        }
-        if (ArtifactoryRequest.LIST_BROWSING_PATH.equals(pathPrefix)) {
-            pathPrefix = PathUtils.getFirstPathElement(servletPath.substring("list/".length()));
-        }
-        if (ArtifactoryRequest.SIMPLE_BROWSING_PATH.equals(pathPrefix)) {
-            pathPrefix = PathUtils.getFirstPathElement(servletPath.substring("simple/".length()));
-        }
-        if (UI_PATH_PREFIXES.contains(pathPrefix)) {
-            return false;
-        }
-        if (NON_UI_PATH_PREFIXES.contains(pathPrefix)) {
-            return false;
-        }
-        String repoKey = pathPrefix;
-        //Support repository-level metadata requests
-        repoKey = NamingUtils.stripMetadataFromPath(repoKey);
-        //Strip any matrix params
-        int paramsIdx = repoKey.indexOf(Properties.MATRIX_PARAMS_SEP);
-        if (paramsIdx > 0) {
-            repoKey = repoKey.substring(0, paramsIdx);
-        }
-        RepositoryService repositoryService = ContextHelper.get().getRepositoryService();
-        Set<String> allRepos = repositoryService.getAllRepoKeys();
-        try {
-            repoKey = URLDecoder.decode(repoKey, "utf-8");
-        } catch (UnsupportedEncodingException e) {
-            log.warn("Could not decode repo key '" + repoKey + "' in utf-8");
-            return false;
-        }
-        if (!allRepos.contains(repoKey)) {
-            if (warnIfRepoDoesNotExist) {
-                log.warn("Request " + servletPath + " should be a repo request and does not match any repo key");
-            }
-            return false;
-        }
-        return true;
-    }
-
-    public static boolean isWebdavRequest(HttpServletRequest request) {
-        if (!isRepoRequest(request)) {
-            return false;
-        }
-        if (WebdavService.WEBDAV_METHODS.contains(request.getMethod().toLowerCase(Locale.ENGLISH))) {
-            return true;
-        }
-        String wagonProvider = request.getHeader("X-wagon-provider");
-        return wagonProvider != null && wagonProvider.contains("webdav");
-    }
-
-    public static boolean isUiRequest(HttpServletRequest request) {
-        if (isWebdavRequest(request)) {
-            return false;
-        }
-        String pathPrefix = PathUtils.getFirstPathElement(getServletPathFromRequest(request));
-        return isUiPathPrefix(pathPrefix);
-    }
-
-    public static boolean isUiPathPrefix(String pathPrefix) {
-        if (UI_PATH_PREFIXES.contains(pathPrefix)) {
-            return true;
-        }
-        if (NON_UI_PATH_PREFIXES.contains(pathPrefix)) {
-            return false;
-        }
-        return false;
-    }
-
-    public static boolean isAuthHeaderPresent(HttpServletRequest request) {
-        String header = request.getHeader("Authorization");
-        if (header != null && header.startsWith("Basic ")) {
-            String auth = header.substring(6);
-            return !"Og==".equals(auth);
-        }
-
-        return false;
-    }
-
-    public static Authentication getAuthentication(HttpServletRequest request) {
-        HttpSession session = request.getSession(false);
-        if (session == null) {
-            return null;
-        }
-        return (Authentication) session.getAttribute(LAST_USER_KEY);
-    }
-
-    public static boolean setAuthentication(HttpServletRequest request, Authentication authentication,
-            boolean createSession) {
-        HttpSession session = request.getSession(createSession);
-        if (session == null) {
-            return false;
-        }
-        session.setAttribute(LAST_USER_KEY, authentication);
-        return true;
-    }
-
-    /**
-     * Returns the un-decoded servlet path from the request
-     *
-     * @param req The received request
-     * @return String - Servlet path
-     */
-    public static String getServletPathFromRequest(HttpServletRequest req) {
-        String contextPath = req.getContextPath();
-        if (StringUtils.isBlank(contextPath)) {
-            return req.getRequestURI();
-        }
-        return req.getRequestURI().substring(contextPath.length());
-    }
-
-    /**
-     * @param servletContext The servlet context
-     * @return The artifactory spring context
-     */
-    public static ArtifactoryContext getArtifactoryContext(ServletContext servletContext) {
-        return (ArtifactoryContext) servletContext.getAttribute(ArtifactoryContext.APPLICATION_CONTEXT_KEY);
-    }
-
-    public static RepoPath getRepoPath(HttpServletRequest servletRequest) {
-        return (RepoPath) servletRequest.getAttribute(ATTR_ARTIFACTORY_REPOSITORY_PATH);
-    }
-
-    /**
-     * Extract the username out of the request, by checking the the header for the {@code Authorization} and then if it
-     * starts with {@code Basic} get it as a base 64 token and decode it.
-     *
-     * @param request The request to examine
-     * @return The extracted username
-     */
-    public static String extractUsernameFromRequest(ServletRequest request) {
-        String header = ((HttpServletRequest) request).getHeader("Authorization");
-        if ((header != null) && header.startsWith("Basic ")) {
-            String token;
-            byte[] base64Token;
-            try {
-                base64Token = header.substring(6).getBytes(DEFAULT_ENCODING);
-                token = new String(org.apache.commons.codec.binary.Base64.decodeBase64(base64Token), DEFAULT_ENCODING);
-            } catch (UnsupportedEncodingException e) {
-                log.info("the encoding is not supported");
-                return EMPTY;
-            }
-            String username = EMPTY;
-            int delim = token.indexOf(':');
-            if (delim != -1) {
-                username = token.substring(0, delim);
-            }
-            return username;
-        }
-        return EMPTY;
-    }
-
-    /**
-     * add no cache and no store header to response in order to avoid java script caching on browser.
-     * In addition adds a compatibility header for IE (where needed) to avoid default compatibility view for
-     * intranet sites.
-     *
-     * @param request     - http servlet request
-     * @param response    - http servlet response
-     */
-    public static void addAdditionalHeadersToWebAppRequest(HttpServletRequest request, HttpServletResponse response) {
-        final String servletPath = RequestUtils.getServletPathFromRequest(request);
-        if (servletPath.contains(HttpUtils.WEBAPP_URL_PATH_PREFIX)) {
-            verifyExplorerUserAgentAndSetHeader(request, response);
-            if (servletPath.endsWith("/app.html") || servletPath.equals("/webapp/")) {
-                // don't store (cache) the app.html in the browser. other resources contain unique version identifier
-                response.setHeader("Cache-Control", "no-store,max-age=0");
-            }
-            if (!ConstantValues.enableUiPagesInIframe.getBoolean()) {
-                response.setHeader("X-FRAME-OPTIONS", "DENY");
-            }
-        }
-    }
-
-    /**
-     * Verifies user agent is Internet Explorer according to:
-     * https://msdn.microsoft.com/en-us/library/hh869301(v=vs.85).aspx
-     * https://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx
-     * http://www.useragentstring.com/pages/Internet%20Explorer/
-     *
-     * And adds the compatibility header to avoid explorer defaulting to IE7 mode when launching compatibility view.
-     * see RTFACT-7928
-     */
-    private static void verifyExplorerUserAgentAndSetHeader(HttpServletRequest request, HttpServletResponse response) {
-        String userAgent = request.getHeader(HttpHeaders.USER_AGENT);
-        if(isNewExplorer(userAgent)) {
-            response.setHeader("X-UA-Compatible", "IE=Edge");
-        }
-    }
-
-    private static boolean isNewExplorer(String userAgent) {
-        return StringUtils.isNotEmpty(userAgent) && (userAgent.contains("MSIE") || userAgent.contains("Trident")
-                || (userAgent.contains("Windows") && userAgent.contains("Edge"))
-                || userAgent.contains("IEMobile"));
-    }
-
-    /**
-     * return user name by props auth
-     *
-     * @param request - http servlet request
-     * @return user name
-     */
-    public static String getUserNameByPropsAuth(HttpServletRequest request) {
-        TokenKeyValue tokenKeyValue;
-        if ((tokenKeyValue = getApiKeyTokenKeyValue(request)) != null) {
-            String userByPropAuth = ContextHelper.get().getAuthorizationService().
-                    findUserByPropAuth(tokenKeyValue.getKey(), tokenKeyValue.getToken());
-            if (userByPropAuth != null) {
-                return userByPropAuth;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * check weather api key is found on request
-     *
-     * @param request - http servlet request
-     * @return Token key value
-     */
-    public static TokenKeyValue getApiKeyTokenKeyValue(HttpServletRequest request) {
-        String apiKeyValue = request.getHeader("X-Api-Key");
-        if (apiKeyValue != null) {
-            return new TokenKeyValue(ApiKeyManager.API_KEY, apiKeyValue);
-        }
-        return null;
-    }
-}
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/ArtifactoryAuthenticationFilter.java b/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/ArtifactoryAuthenticationFilter.java
deleted file mode 100644
index 6118bff..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/ArtifactoryAuthenticationFilter.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.webapp.servlet.authentication;
-
-import org.springframework.security.core.Authentication;
-
-import javax.servlet.Filter;
-import javax.servlet.ServletRequest;
-
-/**
- * @author freds
- * @date Mar 10, 2009
- */
-public interface ArtifactoryAuthenticationFilter extends Filter {
-    /**
-     * Authentications might get expired for various reasons, depending on the authenticator. This method is called
-     * whenever the {@link org.artifactory.webapp.servlet.AccessFilter} detects a valid authentication.
-     * The implementer should return true if it is
-     * the one "responsible" for this request or was the one authenticated this session and it determines that the
-     * authentication is not valid anymore (for example an expired cookie).
-     *
-     * @param request        The http request
-     * @param authentication A valid authenticated authentication
-     * @return True if the client should be re-authenticated
-     */
-    boolean requiresReAuthentication(ServletRequest request, Authentication authentication);
-
-    /**
-     * Return true if the current Artifactory entry point should be authenticated and managed by this filter.
-     *
-     * @param request The original HTTP request
-     * @return True if the filter manage this request for Authentication
-     */
-    boolean acceptFilter(ServletRequest request);
-
-    /**
-     * The value of usually the header used to authenticate for this filter.
-     *
-     * @param request
-     * @return A unique string for this authentication in this request
-     */
-    String getCacheKey(ServletRequest request);
-
-    /**
-     * @param request        The http request
-     * @return Login identifier such as user, sessionId, apiKey, etc.
-     */
-    String getLoginIdentifier(ServletRequest request);
-}
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/ArtifactoryAuthenticationFilterChain.java b/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/ArtifactoryAuthenticationFilterChain.java
deleted file mode 100644
index 3478ff0..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/ArtifactoryAuthenticationFilterChain.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.webapp.servlet.authentication;
-
-import com.google.common.base.Strings;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.plugin.PluginsAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.security.exceptions.LoginDisabledException;
-import org.artifactory.util.HttpUtils;
-import org.artifactory.webapp.servlet.HttpArtifactoryRequest;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.authentication.BadCredentialsException;
-import org.springframework.security.authentication.CredentialsExpiredException;
-import org.springframework.security.authentication.LockedException;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint;
-
-import javax.servlet.*;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * @author freds
- * @date Mar 10, 2009
- */
-public class ArtifactoryAuthenticationFilterChain {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryAuthenticationFilterChain.class);
-
-    private SecurityService securityService;
-
-    private BasicAuthenticationEntryPoint authenticationEntryPoint;
-
-    private final List<ArtifactoryAuthenticationFilter> authenticationFilters = new ArrayList<>();
-
-    public ArtifactoryAuthenticationFilterChain(BasicAuthenticationEntryPoint authenticationEntryPoint) {
-        this.authenticationEntryPoint = authenticationEntryPoint;
-    }
-
-    public void addFilters(Collection<ArtifactoryAuthenticationFilter> filters) {
-        ArtifactoryAuthenticationFilter beforeLast = null;
-        ArtifactoryAuthenticationFilter last = null;
-        for (ArtifactoryAuthenticationFilter filter : filters) {
-            if (filter instanceof ArtifactoryBasicAuthenticationFilter) {
-                //TODO: [by YS] Not sure the comment below is true. All basic authentications are done by the same filter
-                //HACK! ArtifactoryBasicAuthenticationFilter should always be last so it doesn't handle basic auth intended
-                //for other sso filters
-                last = filter;
-            } else if (filter.getClass().getName().endsWith("CasAuthenticationFilter")) {
-                // Other Hack! The CAS should be after other SSO filter
-                beforeLast = filter;
-            } else {
-                this.authenticationFilters.add(filter);
-            }
-        }
-        if (beforeLast != null) {
-            this.authenticationFilters.add(beforeLast);
-        }
-        if (last != null) {
-            this.authenticationFilters.add(last);
-        }
-    }
-
-    /**
-     * Find the correct Artifactory Authentication filter for the request
-     *
-     * @param request The HTTP request object
-     * @return The correct auth filter
-     */
-    public ArtifactoryAuthenticationFilter acceptFilter(ServletRequest request) {
-        ArtifactoryAuthenticationFilter matchFilter = null;
-        int matchFilterCounter = 0;
-        for (ArtifactoryAuthenticationFilter filter : authenticationFilters) {
-            if (filter.acceptFilter(request)) {
-                matchFilterCounter++;
-                matchFilter = filter;
-            }
-        }
-        if (matchFilterCounter > 1) {
-            log.error("2nd matching filter " + matchFilter.getClass().getSimpleName());
-            throw new RuntimeException("more then one filter accept this request");
-        }
-        return matchFilter;
-    }
-
-    public void init(FilterConfig filterConfig) throws ServletException {
-
-        for (ArtifactoryAuthenticationFilter filter : authenticationFilters) {
-            filter.init(filterConfig);
-        }
-    }
-
-    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
-            ArtifactoryAuthenticationFilter authFilter,
-            final FilterChain servletChain)
-            throws IOException, ServletException {
-        FilterChain chainWithAdditive = (request, response) -> {
-            try {
-                AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-                addonsManager.addonByType(PluginsAddon.class)
-                        .executeAdditiveRealmPlugins(new HttpArtifactoryRequest((HttpServletRequest) request));
-                servletChain.doFilter(request, response);
-            } catch (AuthenticationException e) {
-                ContextHelper.get().beanForType(BasicAuthenticationEntryPoint.class).commence(
-                        (HttpServletRequest) request, (HttpServletResponse) response, e);
-            }
-        };
-
-        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
-        HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
-        long accessTime = HttpUtils.getSessionAccessTime(httpServletRequest);
-        String remoteClientAddress = HttpUtils.getRemoteClientAddress((HttpServletRequest) servletRequest);
-
-        String loginIdentifier = null;
-        try {
-            loginIdentifier = getLoginIdentifier(servletRequest, authFilter);
-            if (loginIdentifier == null) {
-                log.debug("Login identifier was not resolved");
-                authFilter.doFilter(servletRequest, servletResponse, chainWithAdditive);
-            } else {
-                if (Strings.isNullOrEmpty(loginIdentifier)) {
-                    // makes sure that session is not locked
-                    getSecurityService().ensureSessionIsNotLocked(loginIdentifier);
-
-                    // delay session if applicable
-                    getSecurityService().ensureSessionShouldNotBeDelayed(loginIdentifier);
-                } else {
-                    // makes sure that user is not locked
-                    getSecurityService().ensureUserIsNotLocked(loginIdentifier);
-
-                    // delay login if applicable
-                    getSecurityService().ensureLoginShouldNotBeDelayed(loginIdentifier);
-                }
-
-                // memorise user last access time
-                getSecurityService().updateUserLastAccess(loginIdentifier, remoteClientAddress, accessTime);
-
-                authFilter.doFilter(servletRequest, servletResponse, chainWithAdditive);
-
-                HttpServletResponse response = (HttpServletResponse) servletResponse;
-
-                if (response.getStatus() == 401) {
-                    log.debug("Filter responded with code {}, registering authentication failure!", response.getStatus());
-                    // register incorrect login attempt
-                    getSecurityService().interceptLoginFailure(loginIdentifier, accessTime);
-                } else if (response.getStatus() < 400 && response.getStatus() >= 200) {
-                    log.debug("Filter responded with code {}, registering authentication success!", response.getStatus());
-                    // intercept successful login
-                    getSecurityService().interceptLoginSuccess(loginIdentifier);
-                } else {
-                    log.debug("Filter responded with code {}, skipping result interception", response.getStatus());
-                }
-            }
-        } catch (LockedException | LoginDisabledException | CredentialsExpiredException e) {
-            log.debug("{}, cause: {}", e.getMessage(), e);
-            authenticationEntryPoint.commence(httpServletRequest, httpServletResponse, e);
-        } catch (AuthenticationException e) {
-            log.debug("User authentication has failed, {}", e);
-            if (!Strings.isNullOrEmpty(loginIdentifier)) {
-                // register incorrect login attempt (may be caused by CredentialsExpired)
-                getSecurityService().interceptLoginFailure(loginIdentifier, accessTime);
-            }
-            authenticationEntryPoint.commence(httpServletRequest, httpServletResponse, e);
-        }
-    }
-
-    /**
-     * @param servletRequest
-     * @param filter
-     * @return login identifier
-     */
-    private String getLoginIdentifier(ServletRequest servletRequest, ArtifactoryAuthenticationFilter filter) {
-        String loginIdentifier = filter.getCacheKey(servletRequest);
-        try {
-            // fetch context LoginIdentifier
-            loginIdentifier = filter.getLoginIdentifier(servletRequest);
-        } catch (BadCredentialsException e) {
-            log.debug("Resolving uses access details has failed, {}", e.getMessage());
-            if (loginIdentifier == null)
-                loginIdentifier = "";
-        }
-        return loginIdentifier;
-    }
-
-    public void destroy() {
-        for (ArtifactoryAuthenticationFilter filter : authenticationFilters) {
-            filter.destroy();
-        }
-    }
-
-    private SecurityService getSecurityService() {
-        if (securityService == null)
-            securityService = ContextHelper.get().beanForType(SecurityService.class);
-        return securityService;
-    }
-}
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/ArtifactoryBasicAuthenticationEntryPoint.java b/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/ArtifactoryBasicAuthenticationEntryPoint.java
deleted file mode 100644
index bde6b8d..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/ArtifactoryBasicAuthenticationEntryPoint.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.webapp.servlet.authentication;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpHeaders;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.security.exceptions.LoginDisabledException;
-import org.artifactory.security.props.auth.ApiKeyManager;
-import org.artifactory.util.HttpUtils;
-import org.artifactory.util.UiRequestUtils;
-import org.springframework.security.authentication.BadCredentialsException;
-import org.springframework.security.authentication.CredentialsExpiredException;
-import org.springframework.security.authentication.LockedException;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-import static javax.servlet.http.HttpServletResponse.SC_FORBIDDEN;
-import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED;
-
-/**
- * Intercept spring security exceptions and transforms the response into a JSON object.
- *
- * @author Shay Yaakov
- */
-public class ArtifactoryBasicAuthenticationEntryPoint extends BasicAuthenticationEntryPoint {
-
-    public static final String REALM = "Artifactory Realm";
-
-    @Override
-    public void afterPropertiesSet() throws Exception {
-        // the inherited afterPropertiesSet checks that realmName is set
-        setRealmName(REALM);
-        super.afterPropertiesSet();
-    }
-
-    @Override
-    public void commence(HttpServletRequest request, HttpServletResponse response,
-            AuthenticationException authException) throws IOException, ServletException {
-        sendErrorResponseToClient(request, response, authException);
-    }
-
-    /**
-     * if ivy request send error response with 403 error code else send 401
-     * @param request http request
-     * @param response http response
-     * @param authException - authentication exception
-     * @throws IOException
-     */
-    private void sendErrorResponseToClient(HttpServletRequest request, HttpServletResponse response,
-            AuthenticationException authException) throws IOException {
-        if (isIvyRequest(request,authException) || isAlreadyAuthedNuGetRequest(request, authException)
-                || isUserLocked(authException) || isLoginDisabled(authException)
-                || isCredentialsExpired(authException) || isAlreadyAuthedApiKeyRequest(request, authException)) {
-            sendErrorResponse(request, response, authException, SC_FORBIDDEN);
-        }
-        else {
-            sendErrorResponse(request, response, authException, SC_UNAUTHORIZED);
-        }
-    }
-
-    /**
-     * Checks whether {@link AuthenticationException} is caused by {@link UserCredentialsExpiredException}
-     *
-     * @param authException auth exception
-     * @return true if {@link AuthenticationException} instanceof {@link UserCredentialsExpiredException}
-     */
-    private boolean isCredentialsExpired(AuthenticationException authException) {
-        return authException instanceof CredentialsExpiredException;
-    }
-
-    /**
-     * Checks whether {@link AuthenticationException} is caused by {@link LockedException}
-     *
-     * @param authException auth exception
-     * @return true if {@link AuthenticationException} instanceof {@link LockedException}
-     */
-    private boolean isUserLocked(AuthenticationException authException) {
-        return authException instanceof LockedException;
-    }
-
-    /**
-     * Checks whether {@link AuthenticationException} is caused
-     * by {@link org.artifactory.security.exceptions.LoginDisabledException}
-     *
-     * @param authException auth exception
-     * @return true if {@link AuthenticationException} instanceof
-     *         {@link org.artifactory.security.exceptions.LoginDisabledException}
-     */
-    private boolean isLoginDisabled(AuthenticationException authException) {
-        return authException instanceof LoginDisabledException;
-    }
-
-    /**
-     * send error response to client
-     * @param response - http response
-     * @param authException authentication exception
-     * @param responseStatusCode - http response status code
-     * @throws IOException
-     */
-    private void sendErrorResponse(HttpServletRequest request, HttpServletResponse response,
-            AuthenticationException authException, int responseStatusCode)
-            throws IOException {
-        if (!UiRequestUtils.isUiRestRequest(request)) {
-            response.addHeader("WWW-Authenticate", "Basic realm=\"" + getRealmName() + "\"");
-        }
-        HttpUtils.sendErrorResponse(response, responseStatusCode, authException.getMessage());
-    }
-
-    @Override
-    public String getRealmName() {
-        return REALM;
-    }
-
-    /**
-     * @param request http request
-     * @param authException auth exception
-     * @return true if httpForceForbiddenResponse system properties is configure and ivy request
-     */
-    private boolean isIvyRequest(HttpServletRequest request,AuthenticationException authException){
-        return ConstantValues.httpForceForbiddenResponse.getBoolean() && authException instanceof BadCredentialsException &&
-                request.getHeader("User-Agent").toLowerCase().indexOf("Ivy".toLowerCase()) != -1;
-    }
-
-    /**
-     * Return 403 to nuget client if bad credentials error, if not the client keeps asking for credentials
-     * indefinitely on 401 responses.
-     */
-    private boolean isAlreadyAuthedNuGetRequest(HttpServletRequest request, AuthenticationException authException) {
-        return authException instanceof BadCredentialsException
-                && request.getHeader(HttpHeaders.USER_AGENT).toLowerCase().contains("nuget")
-                && (StringUtils.isNotBlank(request.getHeader(HttpHeaders.AUTHORIZATION))
-                    || StringUtils.isNotBlank(request.getHeader("X-NuGet-ApiKey")));
-    }
-
-    /**
-     * Return 403 to any API client that used the API Key header, and the header generated bad credentials error.
-     * If not the client keeps asking for credentials indefinitely on 401 responses.
-     */
-    private boolean isAlreadyAuthedApiKeyRequest(HttpServletRequest request, AuthenticationException authException) {
-        // TODO: Should test it's a BadPropsException
-        return StringUtils.isNotBlank(request.getHeader(ApiKeyManager.API_KEY_HEADER)) || StringUtils.isNotBlank(request.getHeader(ApiKeyManager.OLD_API_KEY_HEADER));
-    }
-}
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/ArtifactoryBasicAuthenticationFilter.java b/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/ArtifactoryBasicAuthenticationFilter.java
deleted file mode 100644
index 23e5d7f..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/ArtifactoryBasicAuthenticationFilter.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.webapp.servlet.authentication;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.webapp.servlet.RequestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.authentication.BadCredentialsException;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.crypto.codec.Base64;
-import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
-
-import javax.servlet.*;
-import javax.servlet.http.HttpServletRequest;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-
-/**
- * @author freds
- */
-public class ArtifactoryBasicAuthenticationFilter implements ArtifactoryAuthenticationFilter {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryBasicAuthenticationFilter.class);
-
-    private BasicAuthenticationFilter springBasicAuthenticationFilter;
-
-    @Autowired
-    SecurityService securityService;
-
-    @Override
-    public void init(FilterConfig filterConfig) throws ServletException {
-        ServletContext servletContext = filterConfig.getServletContext();
-        ArtifactoryContext context = RequestUtils.getArtifactoryContext(servletContext);
-        springBasicAuthenticationFilter = context.beanForType(BasicAuthenticationFilter.class);
-        springBasicAuthenticationFilter.init(filterConfig);
-    }
-
-    public boolean requiresReAuthentication(ServletRequest request, Authentication authentication) {
-        if (acceptFilter(request)) {
-            String authUsername = authentication.getPrincipal().toString();
-            String username = RequestUtils.extractUsernameFromRequest(request);
-            return !username.equals(authUsername);
-        }
-        return false;
-    }
-
-    @Override
-    public boolean acceptFilter(ServletRequest request) {
-        HttpServletRequest req = (HttpServletRequest) request;
-        boolean sso = StringUtils.isNotBlank(PropsAuthenticationHelper.getRemoteUserName(securityService, (HttpServletRequest) request));
-        boolean isPkgEndPointMatches = RequestUtils.pkgEndpointMatchBasicAuth(req);
-        return !sso && !isPkgEndPointMatches && RequestUtils.isAuthHeaderPresent((HttpServletRequest) request);
-    }
-
-    @Override
-    public String getCacheKey(ServletRequest request) {
-        return ((HttpServletRequest) request).getHeader("Authorization");
-    }
-
-    @Override
-    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
-            throws IOException, ServletException {
-        springBasicAuthenticationFilter.doFilter(request, response, chain);
-    }
-
-    @Override
-    public void destroy() {
-        springBasicAuthenticationFilter.destroy();
-    }
-
-    /**
-     * @param req        The http request
-     * @return Login identifier such as user, sessionId, apiKey, etc.
-     *
-     * @throws org.springframework.security.authentication.BadCredentialsException
-     * if the Basic header is not present or is not valid Base64
-     */
-    @Override
-    public String getLoginIdentifier(ServletRequest req) throws BadCredentialsException {
-        HttpServletRequest request = (HttpServletRequest) req;
-        String header = request.getHeader("Authorization");
-
-        if (header == null || !header.startsWith("Basic ")) {
-            return null;
-        }
-        return extractAndDecodeUser(header);
-    }
-
-    /**
-     * Decodes the header into a username and password.
-     *
-     * @throws org.springframework.security.authentication.BadCredentialsException
-     * if the Basic header is not present or is not valid Base64
-     */
-    private String extractAndDecodeUser(String header) throws BadCredentialsException {
-
-        try {
-            byte[] base64Token = header.substring(6).getBytes("UTF-8");
-            byte[] decoded;
-            try {
-                decoded = Base64.decode(base64Token);
-            } catch (IllegalArgumentException e) {
-                throw new BadCredentialsException("Failed to decode basic authentication token");
-            }
-
-            String token = new String(decoded, "UTF-8");
-
-            int delim = token.indexOf(":");
-
-            if (delim == -1) {
-                throw new BadCredentialsException("Invalid basic authentication token");
-            }
-            return token.substring(0, delim);
-        } catch (UnsupportedEncodingException e) {
-            log.debug("Cause: {}", e);
-            return "";
-        }
-    }
-}
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/ArtifactoryRememberMeFilter.java b/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/ArtifactoryRememberMeFilter.java
deleted file mode 100644
index f894f48..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/ArtifactoryRememberMeFilter.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.webapp.servlet.authentication;
-
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.common.property.ArtifactorySystemProperties;
-import org.artifactory.webapp.servlet.RequestUtils;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices;
-import org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter;
-
-import javax.servlet.*;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import java.io.IOException;
-
-/**
- * @author Eli Givoni
- */
-public class ArtifactoryRememberMeFilter implements ArtifactoryAuthenticationFilter {
-
-    private RememberMeAuthenticationFilter rememberMeDelegateFilter;
-
-    @Override
-    public void init(FilterConfig filterConfig) throws ServletException {
-        ArtifactorySystemProperties properties =
-                ((ArtifactoryHome) filterConfig.getServletContext().getAttribute(ArtifactoryHome.SERVLET_CTX_ATTR))
-                        .getArtifactoryProperties();
-        ConstantValues disableRememberMeProp = ConstantValues.securityDisableRememberMe;
-        Boolean disableRememberMe = properties.getBooleanProperty(disableRememberMeProp);
-        if (!disableRememberMe) {
-            ServletContext servletContext = filterConfig.getServletContext();
-            ArtifactoryContext context = RequestUtils.getArtifactoryContext(servletContext);
-            rememberMeDelegateFilter = context.beanForType(RememberMeAuthenticationFilter.class);
-            rememberMeDelegateFilter.init(filterConfig);
-        }
-    }
-
-    public boolean requiresReAuthentication(ServletRequest request, Authentication authentication) {
-        return false;
-    }
-
-    @Override
-    public boolean acceptFilter(ServletRequest request) {
-        if (rememberMeDelegateFilter == null) {
-            return false;
-        }
-
-        Cookie[] cookies = ((HttpServletRequest) request).getCookies();
-
-        if ((cookies == null) || (cookies.length == 0)) {
-            return false;
-        }
-
-        for (Cookie cookie : cookies) {
-            if (AbstractRememberMeServices.SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY.equals(cookie.getName())) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public String getCacheKey(ServletRequest request) {
-        return ((HttpServletRequest) request).getHeader("Authorization");
-    }
-
-    /**
-     * @param request        The http request
-     * @return Login identifier such as user, sessionId, apiKey, etc.
-     */
-    @Override
-    public String getLoginIdentifier(ServletRequest request) {
-        // TODO: [mp] check what authorization identifier is used in this context
-        return getCacheKey(request);
-    }
-
-    @Override
-    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
-            throws IOException, ServletException {
-        if (rememberMeDelegateFilter != null) {
-            rememberMeDelegateFilter.doFilter(request, response, chain);
-        }
-    }
-
-    @Override
-    public void destroy() {
-        if (rememberMeDelegateFilter != null) {
-            rememberMeDelegateFilter.destroy();
-        }
-    }
-}
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/MissionControlAuthenticationFilter.java b/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/MissionControlAuthenticationFilter.java
deleted file mode 100644
index 34f31d7..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/MissionControlAuthenticationFilter.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- */
-package org.artifactory.webapp.servlet.authentication;
-
-import com.google.common.base.Strings;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.security.SaltedPassword;
-import org.artifactory.security.UserInfo;
-import org.artifactory.security.mission.control.MissionControlAuthenticationProvider;
-import org.artifactory.security.mission.control.MissionControlProperties;
-import org.artifactory.util.PathUtils;
-import org.artifactory.webapp.servlet.RequestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-
-import javax.servlet.*;
-import javax.servlet.http.HttpServletRequest;
-import java.io.IOException;
-
-import static org.artifactory.security.mission.control.MissionControlAuthenticationProvider.HEADER_NAME;
-
-/**
- * @author Gidi Shabat
- */
-public class MissionControlAuthenticationFilter implements ArtifactoryAuthenticationFilter {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryBasicAuthenticationFilter.class);
-    private MissionControlProperties missionControlProperties;
-
-
-    @Override
-    public void init(FilterConfig filterConfig) throws ServletException {
-        log.trace("Initializing filter");
-        ServletContext servletContext = filterConfig.getServletContext();
-        ArtifactoryContext context = RequestUtils.getArtifactoryContext(servletContext);
-        missionControlProperties = context.beanForType(MissionControlProperties.class);
-        log.trace("Successfully Initialized filter");
-    }
-
-    public boolean requiresReAuthentication(ServletRequest request, Authentication authentication) {
-        // TODO: [by FSI] Why this cannot use the Authentication cache?
-        // By forcing re-auth all the time Authentication caching is disabled
-        return acceptFilter(request);
-    }
-
-    @Override
-    public boolean acceptFilter(ServletRequest request) {
-        HttpServletRequest httpRequest = (HttpServletRequest) request;
-        String path = httpRequest.getRequestURI();
-        String contextPrefix = RequestUtils.getContextPrefix((HttpServletRequest) request);
-        path = PathUtils.trimLeadingSlashes(path);
-        if (path != null && !path.startsWith(contextPrefix + "/mc")) {
-            return false;
-        }
-        String header = ((HttpServletRequest) request).getHeader(HEADER_NAME);
-        String token = missionControlProperties.getToken();
-        String url = missionControlProperties.getUrl();
-        return token != null && header != null && url != null;
-    }
-
-    @Override
-    public String getCacheKey(ServletRequest request) {
-        return ((HttpServletRequest) request).getHeader(HEADER_NAME);
-    }
-
-    /**
-     * @param request        The http request
-     * @return Login identifier such as user, sessionId, apiKey, etc.
-     */
-    @Override
-    public String getLoginIdentifier(ServletRequest request) {
-        String missionControlToken = ((HttpServletRequest) request).getHeader(HEADER_NAME);
-        if (!Strings.isNullOrEmpty(missionControlToken)) {
-            int index = missionControlToken.indexOf('@');
-            String userName= UserInfo.MISSION_CONTROLL;
-            if(index>0){
-                userName=missionControlToken.substring(0, index)+"-from-MC";
-            }
-            return userName;
-        }
-        return getCacheKey(request);
-    }
-
-    @Override
-    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
-            throws IOException, ServletException {
-        log.trace("Starting to validate authentication");
-        String missionControlToken = ((HttpServletRequest) request).getHeader(HEADER_NAME);
-        SecurityService securityService = ContextHelper.get().beanForType(SecurityService.class);
-        int index = missionControlToken.indexOf('@');
-        String userName= UserInfo.MISSION_CONTROLL;
-        if(index>0){
-            userName=missionControlToken.substring(0, index)+"-from-MC";
-            missionControlToken=missionControlToken.substring(index+1,missionControlToken.length());
-        }
-        SaltedPassword saltedPassword = securityService.generateSaltedPassword(missionControlToken);
-        HttpServletRequest httpRequest = (HttpServletRequest) request;
-        String path = httpRequest.getRequestURI();
-        String contextPrefix = RequestUtils.getContextPrefix((HttpServletRequest) request);
-        path = PathUtils.trimLeadingSlashes(path);
-        String token = missionControlProperties.getToken();
-
-        if (token.equals(saltedPassword.getPassword()) && path != null && path.startsWith(contextPrefix + "/mc")) {
-            MissionControlAuthenticationProvider provider = ContextHelper.get()
-                    .beanForType(MissionControlAuthenticationProvider.class);
-            Authentication auth = provider.getFullAuthentication(userName);
-            RequestUtils.setAuthentication((HttpServletRequest) request, auth, true);
-            SecurityContextHolder.getContext().setAuthentication(auth);
-            log.trace("Successful Mission Control Authentication ");
-        } else {
-            MissionControlAuthenticationProvider provider = ContextHelper.get()
-                    .beanForType(MissionControlAuthenticationProvider.class);
-            Authentication auth = provider.getAnonymousAuthentication();
-            RequestUtils.setAuthentication((HttpServletRequest) request, auth, true);
-            SecurityContextHolder.getContext().setAuthentication(auth);
-            log.trace("Mission Control failed to authenticate request.");
-        }
-        chain.doFilter(request, response);
-    }
-
-    @Override
-    public void destroy() {
-    }
-}
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/PropsAuthenticationFilter.java b/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/PropsAuthenticationFilter.java
deleted file mode 100644
index d2105b2..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/PropsAuthenticationFilter.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- */
-package org.artifactory.webapp.servlet.authentication;
-
-import org.artifactory.security.props.auth.PropsAuthenticationToken;
-import org.artifactory.security.props.auth.model.TokenKeyValue;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.authentication.AuthenticationDetailsSource;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.web.authentication.NullRememberMeServices;
-import org.springframework.security.web.authentication.RememberMeServices;
-import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
-import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint;
-
-import javax.servlet.*;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-/**
- * @author Chen Keinan
- */
-public class PropsAuthenticationFilter implements ArtifactoryAuthenticationFilter {
-    private static final Logger log = LoggerFactory.getLogger(PropsAuthenticationFilter.class);
-
-    private AuthenticationDetailsSource<HttpServletRequest, ?> authenticationDetailsSource = new WebAuthenticationDetailsSource();
-    private RememberMeServices rememberMeServices = new NullRememberMeServices();
-    private AuthenticationManager authenticationManager;
-    private BasicAuthenticationEntryPoint authenticationEntryPoint;
-
-    public PropsAuthenticationFilter(AuthenticationManager authenticationManager,
-                                     BasicAuthenticationEntryPoint authenticationEntryPoint) {
-        this.authenticationManager = authenticationManager;
-        this.authenticationEntryPoint = authenticationEntryPoint;
-    }
-
-    @Override
-    public void init(FilterConfig filterConfig) throws ServletException {
-        // do nothing
-    }
-
-    public boolean requiresReAuthentication(ServletRequest request, Authentication authentication) {
-        boolean requireAuthentication = true;
-        HttpServletRequest req = (HttpServletRequest) request;
-        TokenKeyValue tokenKeyValue = PropsAuthenticationHelper.getTokenKeyValueFromHeader(req);
-        if (tokenKeyValue != null && authentication != null) {
-            try {
-                // try authenticate via token
-                Authentication authFoundOnDB = tryAuthenticate(req, tokenKeyValue);
-                if (authFoundOnDB != null) {
-                    if (authFoundOnDB.getPrincipal().equals(authentication.getPrincipal())) {
-                        requireAuthentication = false;
-                    }
-                }
-            } catch (Exception e) {
-                log.debug("re-authentication failed", e);
-            }
-            return requireAuthentication;
-        }
-        return acceptFilter(request);
-    }
-
-    @Override
-    public boolean acceptFilter(ServletRequest request) {
-        return PropsAuthenticationHelper.getTokenKeyValueFromHeader((HttpServletRequest) request) != null;
-    }
-
-    @Override
-    public String getCacheKey(ServletRequest request) {
-        TokenKeyValue tokenKeyValue = PropsAuthenticationHelper.getTokenKeyValueFromHeader((HttpServletRequest) request);
-        if (tokenKeyValue != null) {
-            return tokenKeyValue.getToken();
-        }
-        return null;
-    }
-
-    /**
-     * @param request        The http request
-     * @return Login identifier such as user, sessionId, apiKey, etc.
-     */
-    @Override
-    public String getLoginIdentifier(ServletRequest request) {
-        TokenKeyValue tokenKeyValue = PropsAuthenticationHelper.getTokenKeyValueFromHeader((HttpServletRequest) request);
-        return tokenKeyValue != null ? tokenKeyValue.getToken() : getCacheKey(request);
-    }
-
-    @Override
-    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
-            throws IOException, ServletException {
-        HttpServletRequest request = (HttpServletRequest) req;
-        HttpServletResponse response = (HttpServletResponse) res;
-        try {
-            // try authenticate
-            TokenKeyValue tokenKeyValue = PropsAuthenticationHelper.getTokenKeyValueFromHeader(request);
-            if (tokenKeyValue != null) {
-                log.trace("try authenticate with {} : {}", tokenKeyValue.getKey(), tokenKeyValue.getToken());
-                // try authenticate with prop token
-                Authentication authResult = tryAuthenticate(request, tokenKeyValue);
-                // update security context with new authentication
-                updateContext(request, response, authResult);
-                log.trace("authentication with props token {} : {} succeeded", tokenKeyValue.getKey()
-                        , tokenKeyValue.getToken());
-            }
-        } catch (AuthenticationException failed) {
-            // clear security context
-            clearContext(request, response, failed);
-            authenticationEntryPoint.commence(request, response, failed);
-            return;
-        }
-        chain.doFilter(request, response);
-    }
-
-    /**
-     * clear security context from authentication data
-     *
-     * @param request  - http servlet request
-     * @param response - http servlet response
-     * @param failed   - authentication run time exception
-     */
-    private void clearContext(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed) {
-        SecurityContextHolder.clearContext();
-        log.debug("Authentication request for failed: " + failed);
-        rememberMeServices.loginFail(request, response);
-    }
-
-    /**
-     * update security context with new authentication
-     *
-     * @param request    - http servlet request
-     * @param response   - http servlet response
-     * @param authResult - new authentication
-     */
-    private void updateContext(HttpServletRequest request, HttpServletResponse response, Authentication authResult) {
-        SecurityContextHolder.getContext().setAuthentication(authResult);
-        rememberMeServices.loginSuccess(request, response, authResult);
-    }
-
-
-    /**
-     * create pre authentication instance
-     *
-     * @param request - http servlet request
-     * @param tokenKeyValue  - token key and value
-     * @return authentication
-     */
-    private Authentication tryAuthenticate(HttpServletRequest request, TokenKeyValue tokenKeyValue) {
-        // create pre authentication
-        PropsAuthenticationToken authentication = new PropsAuthenticationToken(null,
-                tokenKeyValue.getKey(), tokenKeyValue.getToken(), null);
-        authentication.setDetails(authenticationDetailsSource.buildDetails(request));
-        // try authenticate via token
-        Authentication authResult;
-        authResult = authenticationManager.authenticate(authentication);
-        return authResult;
-    }
-
-    @Override
-    public void destroy() {
-    }
-}
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/PropsAuthenticationHelper.java b/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/PropsAuthenticationHelper.java
deleted file mode 100644
index 9e5a661..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/PropsAuthenticationHelper.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package org.artifactory.webapp.servlet.authentication;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.security.props.auth.ApiKeyManager;
-import org.artifactory.security.props.auth.OauthManager;
-import org.artifactory.security.props.auth.model.TokenKeyValue;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * @author Chen Keinan
- */
-public class PropsAuthenticationHelper {
-
-    private static final Logger log = LoggerFactory.getLogger(PropsAuthenticationHelper.class);
-
-    public static TokenKeyValue getTokenKeyValueFromHeader(HttpServletRequest request) {
-        TokenKeyValue tokenKeyValue;
-        // 1st check if api key token exist
-        if ((tokenKeyValue = getApiKeyTokenKeyValue(request)) != null) {
-            return tokenKeyValue;
-            // 2nd check if oauth token exist
-        }
-        if ((tokenKeyValue = getOauthTokenKeyValue(request)) != null) {
-            return tokenKeyValue;
-        }
-        return null;
-    }
-
-    /**
-     * check weather api key is found on request
-     *
-     * @param request - http servlet request
-     * @return Token key value
-     */
-    private static TokenKeyValue getApiKeyTokenKeyValue(HttpServletRequest request) {
-        String apiKeyValue = request.getHeader(ApiKeyManager.API_KEY_HEADER);
-        if (StringUtils.isBlank(apiKeyValue)) {
-            apiKeyValue = request.getHeader(ApiKeyManager.OLD_API_KEY_HEADER);
-        }
-        if (apiKeyValue != null) {
-            return new TokenKeyValue(ApiKeyManager.API_KEY, apiKeyValue);
-        }
-        return null;
-    }
-
-    /**
-     * check weather oauth key is found on request
-     *
-     * @param request - http servlet request
-     * @return Token key value
-     */
-    private static TokenKeyValue getOauthTokenKeyValue(HttpServletRequest request) {
-        String oauthToken = request.getHeader(OauthManager.AUTHORIZATION_HEADER);
-        if (oauthToken != null && oauthToken.startsWith(OauthManager.OAUTH_TOKEN_PREFIX) && oauthToken.length() > 8) {
-            oauthToken = oauthToken.substring(7);
-            return new TokenKeyValue(OauthManager.OAUTH_KEY, oauthToken);
-        }
-        return null;
-    }
-
-    /**
-     * Extracts the remote user name from the request, either from an attribute/header whose name was defined in the
-     * SSO config or from the {@link javax.servlet.http.HttpServletRequest#getRemoteUser()} method.
-     *
-     * @param request HTTP request
-     * @return Remote user name if found. Null or blank if not.
-     */
-    public static String getRemoteUserName(SecurityService securityService, HttpServletRequest request) {
-        log.debug("Entering ArtifactorySsoAuthenticationFilter.getRemoteUserName");
-
-        String ssoUserName = null;
-
-        String requestVariable = securityService.getHttpSsoRemoteUserRequestVariable();
-        if (StringUtils.isNotBlank(requestVariable)) {
-            log.debug("Remote user request variable = '{}'.", requestVariable);
-            // first attempt to read from attribute (to support custom filters)
-            Object userAttribute = request.getAttribute(requestVariable);
-            if (userAttribute != null) {
-                ssoUserName = userAttribute.toString();
-                log.debug("Remote user attribute: '{}'.", ssoUserName);
-            }
-
-            if (StringUtils.isBlank(ssoUserName)) {
-                // check if the container got the remote user (e.g., using ajp)
-                ssoUserName = request.getRemoteUser();
-                log.debug("Remote user from request: '{}'.", ssoUserName);
-            }
-
-            if (StringUtils.isBlank(ssoUserName)) {
-                // check if the request header contains the remote user
-                ssoUserName = request.getHeader(requestVariable);
-                log.debug("Remote user from header: '{}'.", ssoUserName);
-            }
-        }
-        return ssoUserName != null ? ssoUserName.toLowerCase() : null;
-    }
-}
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/interceptor/anonymous/AnonymousAuthenticationInterceptor.java b/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/interceptor/anonymous/AnonymousAuthenticationInterceptor.java
deleted file mode 100644
index ff86c95..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/interceptor/anonymous/AnonymousAuthenticationInterceptor.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.artifactory.webapp.servlet.authentication.interceptor.anonymous;
-
-import org.artifactory.interceptor.Interceptor;
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * Interceptors that are called by {@link org.artifactory.webapp.servlet.AccessFilter#useAnonymousIfPossible}
- * and signify if a request should be allowed to authenticate as Anonymous by the
- * {@link org.artifactory.webapp.servlet.authentication.ArtifactoryAuthenticationFilterChain}
- *
- * @see org.artifactory.webapp.servlet.AccessFilter
- * @author Dan Feldman
- */
-public interface AnonymousAuthenticationInterceptor extends Interceptor {
-
-    boolean accept(HttpServletRequest request);
-}
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/interceptor/anonymous/AnonymousAuthenticationInterceptors.java b/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/interceptor/anonymous/AnonymousAuthenticationInterceptors.java
deleted file mode 100644
index 14aa2de..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/interceptor/anonymous/AnonymousAuthenticationInterceptors.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.artifactory.webapp.servlet.authentication.interceptor.anonymous;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Implementation that holds and calls all registered {@link AnonymousAuthenticationInterceptor} instances that
- * were added to it.
- *
- * @author Dan Feldman
- */
-public class AnonymousAuthenticationInterceptors implements AnonymousAuthenticationInterceptor {
-
-    private final List<AnonymousAuthenticationInterceptor> interceptors = new ArrayList<>();
-
-    public void addInterceptors(Collection<AnonymousAuthenticationInterceptor> interceptors) {
-        this.interceptors.addAll(interceptors);
-    }
-
-    @Override
-    public boolean accept(HttpServletRequest request) {
-        for (AnonymousAuthenticationInterceptor interceptor : interceptors) {
-            if(interceptor.accept(request)) {
-                return true;
-            }
-        }
-        return false;
-    }
-}
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/interceptor/anonymous/AnonymousLoginInterceptor.java b/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/interceptor/anonymous/AnonymousLoginInterceptor.java
deleted file mode 100644
index da1b830..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/interceptor/anonymous/AnonymousLoginInterceptor.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.artifactory.webapp.servlet.authentication.interceptor.anonymous;
-
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * Allows anonymous to login if anonymous access is disabled (RTFACT-7073)
- *
- * @author Dan Feldman
- */
-public class AnonymousLoginInterceptor implements AnonymousAuthenticationInterceptor {
-
-    @Override
-    public boolean accept(HttpServletRequest request) {
-        return request.getRequestURI().contains("auth")||request.getRequestURI().matches(".*npm\\/.*\\/-\\/user\\/.*");
-    }
-}
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/interceptor/anonymous/AnonymousPingInterceptor.java b/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/interceptor/anonymous/AnonymousPingInterceptor.java
deleted file mode 100644
index 44795da..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/authentication/interceptor/anonymous/AnonymousPingInterceptor.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.webapp.servlet.authentication.interceptor.anonymous;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.rest.constant.SystemRestConstants;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.webapp.servlet.RequestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * Allows anonymous to ping this instance even if anonymous access is disabled  when the 'ping.allowUnauthenticated'
- * flag is set (RTFACT-8239).
- *
- * @author Dan Feldman
- */
-public class AnonymousPingInterceptor implements AnonymousAuthenticationInterceptor {
-    private static final Logger log = LoggerFactory.getLogger(AnonymousPingInterceptor.class);
-
-    @Override
-    public boolean accept(HttpServletRequest request) {
-        return unauthenticatedPingAllowed(request);
-    }
-
-    private boolean unauthenticatedPingAllowed(HttpServletRequest request) {
-        try {
-            return request.getMethod().equals("GET")
-                    && StringUtils.startsWith(RequestUtils.getServletPathFromRequest(request),
-                        "/api/" + SystemRestConstants.PATH_ROOT + "/" + SystemRestConstants.PATH_PING)
-                    && (!RequestUtils.isAuthHeaderPresent(request)
-                        || RequestUtils.extractUsernameFromRequest(request).equalsIgnoreCase("anonymous"))
-                    && ConstantValues.allowUnauthenticatedPing.getBoolean();
-        } catch (Exception e) {
-            log.debug("Caught exception: ", e);
-            return false;
-        }
-    }
-}
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/logback/LogbackConfigListener.java b/web/application/src/main/java/org/artifactory/webapp/servlet/logback/LogbackConfigListener.java
deleted file mode 100644
index db670cc..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/logback/LogbackConfigListener.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.webapp.servlet.logback;
-
-import ch.qos.logback.classic.LoggerContext;
-import ch.qos.logback.classic.selector.ContextSelector;
-import ch.qos.logback.classic.util.ContextSelectorStaticBinder;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.log.BootstrapLogger;
-import org.artifactory.log.logback.LogbackContextHelper;
-import org.artifactory.log.logback.LogbackContextSelector;
-import org.artifactory.log.logback.LoggerConfigInfo;
-import org.artifactory.util.FileWatchDog;
-import org.artifactory.util.HttpUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
-
-/**
- * Configured logback with the config file from etc directory.
- *
- * @author Yossi Shaul
- * @author Yoav Landman
- */
-public class LogbackConfigListener implements ServletContextListener {
-
-    private ArtifactoryHome home;
-    LogbackConfigWatchDog configWatchDog;
-
-    @Override
-    public void contextInitialized(ServletContextEvent event) {
-        ServletContext servletContext = event.getServletContext();
-        home = (ArtifactoryHome) servletContext.getAttribute(ArtifactoryHome.SERVLET_CTX_ATTR);
-        if (home == null) {
-            throw new IllegalStateException("Artifactory home not initialized");
-        }
-
-        //Install the juli to slf4j bridge (disabled dur to RTFACT-1283)
-        //SLF4JBridgeHandler.install();
-
-        boolean selectorUsed = System.getProperty("logback.ContextSelector") != null;
-        LoggerContext context;
-        if (selectorUsed) {
-            String contextId = HttpUtils.getContextId(servletContext);
-            LoggerConfigInfo configInfo = new LoggerConfigInfo(contextId, home);
-            LogbackContextSelector.bindConfig(configInfo);
-            try {
-                //This load should already use a context from the selector
-                context = getOrInitLoggerContext();
-            } finally {
-                LogbackContextSelector.unbindConfig();
-            }
-        } else {
-            context = getOrInitLoggerContext();
-            LogbackContextHelper.configure(context, home);
-        }
-
-        //Configure and start the watchdog
-        configWatchDog = new LogbackConfigWatchDog(context, servletContext);
-        configureWatchdog(servletContext);
-        configWatchDog.start();
-    }
-
-    @Override
-    public void contextDestroyed(ServletContextEvent sce) {
-        configWatchDog.interrupt();
-        ContextSelector selector = ContextSelectorStaticBinder.getSingleton().getContextSelector();
-        String contextId = HttpUtils.getContextId(sce.getServletContext());
-        selector.detachLoggerContext(contextId);
-        configWatchDog.loggerContext.stop();
-    }
-
-    private static LoggerContext getOrInitLoggerContext() {
-        return (LoggerContext) LoggerFactory.getILoggerFactory();
-    }
-
-    private void configureWatchdog(ServletContext servletContext) {
-        String intervalString = servletContext.getInitParameter("logbackRefreshInterval");
-        if (intervalString != null) {
-            try {
-                long refreshInterval = Long.parseLong(intervalString);
-                configWatchDog.setDelay(refreshInterval);
-            } catch (NumberFormatException e) {
-                BootstrapLogger.error("Failed to parse logbackRefreshInterval. Log refresh will not be active.");
-                getOrInitLoggerContext();
-            }
-        }
-    }
-
-    private class LogbackConfigWatchDog extends FileWatchDog {
-
-        private final Logger log = LoggerFactory.getLogger(LogbackConfigListener.LogbackConfigWatchDog.class);
-
-        private LoggerContext loggerContext;
-        private ServletContext servletContext;
-        private final boolean selectorUsed;
-
-        public LogbackConfigWatchDog(LoggerContext loggerContext, ServletContext servletContext) {
-            super(home.getLogbackConfig(), false);
-            setName("logback-watchdog");
-            this.selectorUsed = System.getProperty("logback.ContextSelector") != null;
-            this.servletContext = servletContext;
-            this.loggerContext = loggerContext;
-            checkAndConfigure();
-        }
-
-        @Override
-        protected void doOnChange() {
-            String contextId = null;
-            if (selectorUsed) {
-                // if the selector is used, then bind a new LoggerConfigInfo.
-                // see JFW-1180
-                contextId = HttpUtils.getContextId(servletContext);
-                bind(contextId);
-            }
-            try {
-                LogbackContextHelper.configure(loggerContext, home, contextId);
-                //Log after re-config, since this class logger is constructed before config with the default warn level
-                log.info("Reloaded logback config from: {}.", file.getAbsolutePath());
-            } finally {
-                if (selectorUsed) {
-                    unbind();
-                }
-            }
-        }
-
-        private void bind(String contextId) {
-            LoggerConfigInfo configInfo = new LoggerConfigInfo(contextId, home);
-            LogbackContextSelector.bindConfig(configInfo);
-        }
-
-        private void unbind() {
-            LogbackContextSelector.unbind();
-        }
-    }
-}
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/redirection/OldBuildsRedirectionHandler.java b/web/application/src/main/java/org/artifactory/webapp/servlet/redirection/OldBuildsRedirectionHandler.java
deleted file mode 100644
index 1d051d0..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/redirection/OldBuildsRedirectionHandler.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.webapp.servlet.redirection;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.util.PathUtils;
-import org.artifactory.webapp.servlet.RequestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * @author Gidi Shabat
- */
-public class OldBuildsRedirectionHandler implements RedirectionHandler {
-    private static final Logger log = LoggerFactory.getLogger(OldHomeRedirectionHandler.class);
-
-    @Override
-    public boolean shouldRedirect(ServletRequest request) {
-        String servletPath = RequestUtils.getServletPathFromRequest((HttpServletRequest) request);
-        servletPath = servletPath.trim();
-        servletPath = servletPath.toLowerCase();
-        servletPath = PathUtils.trimLeadingSlashes(servletPath);
-        servletPath = PathUtils.trimTrailingSlashes(servletPath);
-        return servletPath.startsWith("webapp/builds");
-    }
-
-    @Override
-    public void redirect(ServletRequest request, ServletResponse response) {
-        try {
-            HttpServletResponse httpResponse = (HttpServletResponse) response;
-            HttpServletRequest httpRequest = (HttpServletRequest) request;
-            String sourceUrl = httpRequest.getRequestURI();
-            String queryString = httpRequest.getQueryString()!=null?"?"+httpRequest.getQueryString():"";
-            String targetUrl = StringUtils.replace(sourceUrl,"/webapp/builds","/webapp/#/builds")+queryString;
-            httpResponse.sendRedirect(targetUrl);
-        } catch (Exception e) {
-            log.error("Failed to redirect Old generation builds page to new generation builds page request.",e);
-        }
-    }
-}
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/redirection/OldHomeRedirectionHandler.java b/web/application/src/main/java/org/artifactory/webapp/servlet/redirection/OldHomeRedirectionHandler.java
deleted file mode 100644
index 1cd90a4..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/redirection/OldHomeRedirectionHandler.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.artifactory.webapp.servlet.redirection;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.util.PathUtils;
-import org.artifactory.webapp.servlet.RequestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * @author Gidi Shabat
- */
-public class OldHomeRedirectionHandler implements RedirectionHandler {
-    private static final Logger log = LoggerFactory.getLogger(OldHomeRedirectionHandler.class);
-    @Override
-    public boolean shouldRedirect(ServletRequest request) {
-        HttpServletRequest httpRequest = (HttpServletRequest) request;
-        String path = httpRequest.getRequestURI();
-        path = PathUtils.trimLeadingSlashes(path);
-        path = path.toLowerCase();
-        return path.endsWith("/webapp/home.html");
-    }
-
-    @Override
-    public void redirect(ServletRequest request, ServletResponse response) {
-        try {
-            HttpServletResponse httpResponse = (HttpServletResponse) response;
-            HttpServletRequest httpRequest = (HttpServletRequest) request;
-            String queryString = httpRequest.getQueryString()!=null?"?"+httpRequest.getQueryString():"";
-            String sourceUrl = httpRequest.getRequestURI();
-            String targetUrl = StringUtils.replace(sourceUrl,"/webapp/home.html","/webapp/#/home")+queryString;
-            httpResponse.sendRedirect(targetUrl);
-        } catch (Exception e) {
-            log.error("Failed to redirect Old generation home page to new generation home page request.",e);
-        }
-    }
-}
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/redirection/OldLoginRedirectionHandler.java b/web/application/src/main/java/org/artifactory/webapp/servlet/redirection/OldLoginRedirectionHandler.java
deleted file mode 100644
index 0c76bbc..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/redirection/OldLoginRedirectionHandler.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.artifactory.webapp.servlet.redirection;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.util.PathUtils;
-import org.artifactory.webapp.servlet.RequestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * @author Gidi Shabat
- */
-public class OldLoginRedirectionHandler implements RedirectionHandler {
-    private static final Logger log = LoggerFactory.getLogger(OldLoginRedirectionHandler.class);
-    @Override
-    public boolean shouldRedirect(ServletRequest request) {
-        HttpServletRequest httpRequest = (HttpServletRequest) request;
-        String path = httpRequest.getRequestURI();
-        path = PathUtils.trimLeadingSlashes(path);
-        path = path.toLowerCase();
-        return path.endsWith("/webapp/login.html");
-    }
-
-    @Override
-    public void redirect(ServletRequest request, ServletResponse response) {
-        try {
-            HttpServletResponse httpResponse = (HttpServletResponse) response;
-            HttpServletRequest httpRequest = (HttpServletRequest) request;
-            String queryString = httpRequest.getQueryString()!=null?"?"+httpRequest.getQueryString():"";
-            String sourceUrl = httpRequest.getRequestURI();
-            String targetUrl = StringUtils.replace(sourceUrl,"/webapp/login.html","/webapp/#/login")+queryString;
-            httpResponse.sendRedirect(targetUrl);
-        } catch (Exception e) {
-            log.error("Failed to redirect Old generation login page to new generation login page request.",e);
-        }
-    }
-}
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/redirection/RedirectionHandler.java b/web/application/src/main/java/org/artifactory/webapp/servlet/redirection/RedirectionHandler.java
deleted file mode 100644
index 26b4aa2..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/redirection/RedirectionHandler.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.artifactory.webapp.servlet.redirection;
-
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * @author Gidi Shabat
- */
-public interface RedirectionHandler {
-    boolean shouldRedirect(ServletRequest request);
-    void redirect(ServletRequest request,ServletResponse response);
-}
diff --git a/web/application/src/main/java/org/artifactory/webapp/servlet/redirection/SamlRedirectionHandler.java b/web/application/src/main/java/org/artifactory/webapp/servlet/redirection/SamlRedirectionHandler.java
deleted file mode 100644
index 3dd1b36..0000000
--- a/web/application/src/main/java/org/artifactory/webapp/servlet/redirection/SamlRedirectionHandler.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.artifactory.webapp.servlet.redirection;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.util.PathUtils;
-import org.artifactory.webapp.servlet.RequestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * @author Gidi Shabat
- */
-public class SamlRedirectionHandler implements RedirectionHandler {
-    private static final Logger log = LoggerFactory.getLogger(SamlRedirectionHandler.class);
-    @Override
-    public boolean shouldRedirect(ServletRequest request) {
-        HttpServletRequest httpRequest = (HttpServletRequest) request;
-        String path = httpRequest.getRequestURI();
-        path = PathUtils.trimLeadingSlashes(path);
-        path = path.toLowerCase();
-        return path.endsWith("/webapp/saml/loginrequest") ||
-                path.endsWith("/webapp/saml/loginresponse") ||
-                path.endsWith("/webapp/saml/logoutrequest");
-    }
-
-    @Override
-    public void redirect(ServletRequest request, ServletResponse response) {
-        try {
-            String path = RequestUtils.getServletPathFromRequest((HttpServletRequest) request);
-            String targetUrl = StringUtils.replace(path, "webapp", "ui");
-            RequestDispatcher dispatcher = request.getRequestDispatcher(targetUrl);
-            dispatcher.forward(request, response);
-        } catch (Exception e) {
-            log.error("Failed to redirect SAML request.",e);
-        }
-    }
-}
diff --git a/web/application/src/main/resources/artifactory-splash.gif b/web/application/src/main/resources/artifactory-splash.gif
deleted file mode 100644
index 5167d7a..0000000
Binary files a/web/application/src/main/resources/artifactory-splash.gif and /dev/null differ
diff --git a/web/application/src/main/resources/ascii-editions.txt b/web/application/src/main/resources/ascii-editions.txt
deleted file mode 100644
index 45feb27..0000000
--- a/web/application/src/main/resources/ascii-editions.txt
+++ /dev/null
@@ -1,54 +0,0 @@
-default
-                _   _  __           _
-     /\        | | (_)/ _|         | |
-    /  \   _ __| |_ _| |_ __ _  ___| |_ ___  _ __ _   _
-   / /\ \ | '__| __| |  _/ _` |/ __| __/ _ \| '__| | | |
-  / ____ \| |  | |_| | || (_| | (__| || (_) | |  | |_| |
- /_/    \_\_|   \__|_|_| \__,_|\___|\__\___/|_|   \__, |
-                                                   __/ |
-                                                  |___/
-oss
-                _   _  __           _                      ____   _____ _____
-     /\        | | (_)/ _|         | |                    / __ \ / ____/ ____|
-    /  \   _ __| |_ _| |_ __ _  ___| |_ ___  _ __ _   _  | |  | | (___| (___
-   / /\ \ | '__| __| |  _/ _` |/ __| __/ _ \| '__| | | | | |  | |\___ \\___ \
-  / ____ \| |  | |_| | || (_| | (__| || (_) | |  | |_| | | |__| |____) |___) |
- /_/    \_\_|   \__|_|_| \__,_|\___|\__\___/|_|   \__, |  \____/|_____/_____/
-                                                   __/ |
-                                                  |___/
-pro
-                _   _  __           _                     _____
-     /\        | | (_)/ _|         | |                   |  __ \
-    /  \   _ __| |_ _| |_ __ _  ___| |_ ___  _ __ _   _  | |__) | __ ___
-   / /\ \ | '__| __| |  _/ _` |/ __| __/ _ \| '__| | | | |  ___/ '__/ _ \
-  / ____ \| |  | |_| | || (_| | (__| || (_) | |  | |_| | | |   | | | (_) |
- /_/    \_\_|   \__|_|_| \__,_|\___|\__\___/|_|   \__, | |_|   |_|  \___/
-                                                   __/ |
-                                                  |___/
-ha
-                _   _  __           _                     _    _
-     /\        | | (_)/ _|         | |                   | |  | |   /\
-    /  \   _ __| |_ _| |_ __ _  ___| |_ ___  _ __ _   _  | |__| |  /  \
-   / /\ \ | '__| __| |  _/ _` |/ __| __/ _ \| '__| | | | |  __  | / /\ \
-  / ____ \| |  | |_| | || (_| | (__| || (_) | |  | |_| | | |  | |/ ____ \
- /_/    \_\_|   \__|_|_| \__,_|\___|\__\___/|_|   \__, | |_|  |_/_/    \_\
-                                                   __/ |
-                                                  |___/
-aol
-                _   _  __           _                      _____ _                 _
-     /\        | | (_)/ _|         | |                    / ____| |               | |
-    /  \   _ __| |_ _| |_ __ _  ___| |_ ___  _ __ _   _  | |    | | ___  _   _  __| |
-   / /\ \ | '__| __| |  _/ _` |/ __| __/ _ \| '__| | | | | |    | |/ _ \| | | |/ _` |
-  / ____ \| |  | |_| | || (_| | (__| || (_) | |  | |_| | | |____| | (_) | |_| | (_| |
- /_/    \_\_|   \__|_|_| \__,_|\___|\__\___/|_|   \__, |  \_____|_|\___/ \__,_|\__,_|
-                                                   __/ |
-                                                  |___/
-aol2
-                _   _  __           _                              ____  _
-     /\        | | (_)/ _|         | |                       /\   / __ \| |
-    /  \   _ __| |_ _| |_ __ _  ___| |_ ___  _ __ _   _     /  \ | |  | | |
-   / /\ \ | '__| __| |  _/ _` |/ __| __/ _ \| '__| | | |   / /\ \| |  | | |
-  / ____ \| |  | |_| | || (_| | (__| || (_) | |  | |_| |  / ____ \ |__| | |____
- /_/    \_\_|   \__|_|_| \__,_|\___|\__\___/|_|   \__, | /_/    \_\____/|______|
-                                                   __/ |
-                                                  |___/
diff --git a/web/application/src/main/resources/build.gradle.creds.template b/web/application/src/main/resources/build.gradle.creds.template
deleted file mode 100644
index 24979b1..0000000
--- a/web/application/src/main/resources/build.gradle.creds.template
+++ /dev/null
@@ -1,3 +0,0 @@
-credentials {
-${gradle.build.4tabs}username = "${artifactory_user}"${creds.line.break}${gradle.build.1tab}password = "${artifactory_password}"
-${gradle.build.3tabs}}
\ No newline at end of file
diff --git a/web/application/src/main/resources/build.gradle.ivy.publisher.template b/web/application/src/main/resources/build.gradle.ivy.publisher.template
deleted file mode 100644
index 64fcafb..0000000
--- a/web/application/src/main/resources/build.gradle.ivy.publisher.template
+++ /dev/null
@@ -1,5 +0,0 @@
-ivy {
-${gradle.build.4tabs}ivyLayout = '${libs.publisher.ivy.pattern}'
-${gradle.build.4tabs}artifactLayout = '${libs.publisher.artifact.pattern}'
-${gradle.build.4tabs}mavenCompatible = ${libs.publisher.maven.compatible}
-${gradle.build.3tabs}}
\ No newline at end of file
diff --git a/web/application/src/main/resources/build.gradle.ivy.repo.template b/web/application/src/main/resources/build.gradle.ivy.repo.template
deleted file mode 100644
index a7e5aaf..0000000
--- a/web/application/src/main/resources/build.gradle.ivy.repo.template
+++ /dev/null
@@ -1,4 +0,0 @@
-ivy {
-${gradle.build.3tabs}url '${plugins.repository.url}'
-${gradle.build.3tabs}${repo.creds}
-${gradle.build.2tabs}}
\ No newline at end of file
diff --git a/web/application/src/main/resources/build.gradle.ivy.resolver.template b/web/application/src/main/resources/build.gradle.ivy.resolver.template
deleted file mode 100644
index c410b07..0000000
--- a/web/application/src/main/resources/build.gradle.ivy.resolver.template
+++ /dev/null
@@ -1,5 +0,0 @@
-ivy {
-${gradle.build.4tabs}ivyLayout = '${libs.resolver.ivy.pattern}'
-${gradle.build.4tabs}artifactLayout = '${libs.resolver.artifact.pattern}'
-${gradle.build.4tabs}mavenCompatible = ${libs.resolver.maven.compatible}
-${gradle.build.3tabs}}
\ No newline at end of file
diff --git a/web/application/src/main/resources/build.gradle.maven.repo.template b/web/application/src/main/resources/build.gradle.maven.repo.template
deleted file mode 100644
index fbc721d..0000000
--- a/web/application/src/main/resources/build.gradle.maven.repo.template
+++ /dev/null
@@ -1,4 +0,0 @@
-maven {
-${gradle.build.3tabs}url '${plugins.repository.url}'
-${gradle.build.3tabs}${repo.creds}
-${gradle.build.2tabs}}
\ No newline at end of file
diff --git a/web/application/src/main/resources/build.gradle.publish.creds.template b/web/application/src/main/resources/build.gradle.publish.creds.template
deleted file mode 100644
index 40d3ed6..0000000
--- a/web/application/src/main/resources/build.gradle.publish.creds.template
+++ /dev/null
@@ -1 +0,0 @@
-username = "${artifactory_user}"${creds.line.break}password = "${artifactory_password}"${creds.line.break}
\ No newline at end of file
diff --git a/web/application/src/main/resources/build.gradle.resolve.creds.template b/web/application/src/main/resources/build.gradle.resolve.creds.template
deleted file mode 100644
index 40d3ed6..0000000
--- a/web/application/src/main/resources/build.gradle.resolve.creds.template
+++ /dev/null
@@ -1 +0,0 @@
-username = "${artifactory_user}"${creds.line.break}password = "${artifactory_password}"${creds.line.break}
\ No newline at end of file
diff --git a/web/application/src/main/resources/build.gradle.template b/web/application/src/main/resources/build.gradle.template
deleted file mode 100644
index a89ca97..0000000
--- a/web/application/src/main/resources/build.gradle.template
+++ /dev/null
@@ -1,32 +0,0 @@
-buildscript {
-    repositories {
-        ${maven.repo}
-        ${ivy.repo}
-    }
-    dependencies {
-        //Check for the latest version here: http://plugins.gradle.org/plugin/com.jfrog.artifactory
-        classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4+"
-    }
-}
-
-allprojects {
-    apply plugin: "com.jfrog.artifactory"
-}
-
-artifactory {
-    contextUrl = "${artifactory_contextUrl}"   //The base Artifactory URL if not overridden by the publisher/resolver
-    publish {
-        repository {
-            repoKey = '${libs.publisher.repoKey}'
-            ${publish.creds}maven = ${libs.publisher.maven}
-            ${ivy.publisher}
-        }
-    }
-    resolve {
-        repository {
-            repoKey = '${libs.resolver.repoKey}'
-            ${resolve.creds}maven = ${libs.resolver.maven}
-            ${ivy.resolver}
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/application/src/main/resources/gradle.properties.template b/web/application/src/main/resources/gradle.properties.template
deleted file mode 100644
index c28345c..0000000
--- a/web/application/src/main/resources/gradle.properties.template
+++ /dev/null
@@ -1,3 +0,0 @@
-artifactory_user=${auth.username}
-artifactory_password=${auth.password}
-artifactory_contextUrl=${auth.contextUrl}
\ No newline at end of file
diff --git a/web/application/src/main/resources/startup.html b/web/application/src/main/resources/startup.html
deleted file mode 100644
index 49e9145..0000000
--- a/web/application/src/main/resources/startup.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html>
-<head>
-    <title>Artifactory :: Starting Up...</title>
-    <meta http-equiv="refresh" content="30"/>
-    <style type="text/css">
-        body {
-            margin: 0;
-            padding: 0;
-            font-family: Arial, Myriad, Helvetica, clean, sans-serif;
-            font-size: 13px;
-            text-align: center;
-            background: #2b2b2b;
-        }
-
-        .wrapper {
-            position: absolute;
-            top: 0;
-            bottom: 0;
-            left: 0;
-            right: 0;
-
-            text-align: center;
-        }
-
-        .wrapper img {
-            height: 95%;
-        }
-    </style>
-</head>
-<body>
-
-<div class="wrapper">
-    <img src="artifactory-splash.gif"/>
-</div>
-
-<script type="text/javascript">
-    var xhr = new XMLHttpRequest();
-    setInterval(function () {
-        xhr.open('GET', window.location, true);
-        xhr.onreadystatechange = function () {
-            if (xhr.readyState == 4 && xhr.status == 200) {
-                location.reload();
-            }
-        };
-        xhr.send();
-    }, 2000)
-</script>
-</body>
-</html>
\ No newline at end of file
diff --git a/web/application/src/test/java/org/artifactory/webapp/servlet/AccessFilterTest.java b/web/application/src/test/java/org/artifactory/webapp/servlet/AccessFilterTest.java
deleted file mode 100644
index 299b479..0000000
--- a/web/application/src/test/java/org/artifactory/webapp/servlet/AccessFilterTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.webapp.servlet;
-
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.security.props.auth.ApiKeyManager;
-import org.artifactory.webapp.servlet.authentication.ArtifactoryBasicAuthenticationEntryPoint;
-import org.springframework.http.MediaType;
-import org.springframework.security.authentication.InsufficientAuthenticationException;
-import org.testng.annotations.Test;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.File;
-import java.io.IOException;
-import java.io.PrintWriter;
-
-import static org.easymock.EasyMock.*;
-
-/**
- * @author Yoav Luft
- */
- at Test
-public class AccessFilterTest {
-
-    public void testAuthenticationChallenge() throws IOException, ServletException {
-        ArtifactoryHome.bind(new ArtifactoryHome(new File("./target/test/testAuthenticationChallenge")));
-        ArtifactoryHome.get().getArtifactoryProperties().setProperty(
-                ConstantValues.locksTimeoutSecs.getPropertyName(), "10");
-        ArtifactoryBasicAuthenticationEntryPoint authenticationEntryPoint =
-                new ArtifactoryBasicAuthenticationEntryPoint();
-        HttpServletRequest request = createMock(HttpServletRequest.class);
-
-        HttpServletResponse response = createMock(HttpServletResponse.class);
-        response.addHeader("WWW-Authenticate", "Basic realm=\"Artifactory Realm\"");
-        response.setContentType(MediaType.APPLICATION_JSON_VALUE);
-        response.setStatus(401);
-        PrintWriter printWriter = createMock(PrintWriter.class);
-        printWriter.write(anyObject(String.class));
-        expect(response.getWriter()).andReturn(printWriter);
-        expect(request.getRequestURI()).andReturn("testuri");
-        expect(request.getHeader("Request-Agent")).andStubReturn("xx");
-        expect(request.getHeader(ApiKeyManager.API_KEY_HEADER)).andStubReturn(null);
-        expect(request.getHeader(ApiKeyManager.OLD_API_KEY_HEADER)).andStubReturn(null);
-        expect(request.getContextPath()).andReturn("/artifactory");
-        replay(request, response, printWriter);
-        authenticationEntryPoint.commence(request, response,
-                new InsufficientAuthenticationException("Authentication required"));
-        verify(response);
-    }
-}
diff --git a/web/pom.xml b/web/pom.xml
deleted file mode 100644
index 702383c..0000000
--- a/web/pom.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0          http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.artifactory</groupId>
-        <artifactId>artifactory-parent</artifactId>
-        <version>4.8.0</version>
-    </parent>
-
-    <artifactId>artifactory-web-parent</artifactId>
-    <packaging>pom</packaging>
-    <name>Artifactory Web</name>
-
-    <modules>
-        <module>rest-common</module>
-        <module>rest</module>
-        <module>rest-ui</module>
-        <module>angular-web</module>
-        <module>application</module>
-        <module>war</module>
-    </modules>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-checkstyle-plugin</artifactId>
-                <configuration>
-                    <configLocation>${project.basedir}/../../devenv/checkstyle.xml</configLocation>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/web/rest-common/pom.xml b/web/rest-common/pom.xml
deleted file mode 100644
index b84679c..0000000
--- a/web/rest-common/pom.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2015 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0          http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>artifactory-rest-common</artifactId>
-    <packaging>jar</packaging>
-    <name>Artifactory REST Common</name>
-
-    <parent>
-        <artifactId>artifactory-web-parent</artifactId>
-        <groupId>org.artifactory</groupId>
-        <version>4.8.0</version>
-    </parent>
-    <dependencies>
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-common</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.sun.jersey</groupId>
-            <artifactId>jersey-server</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.sun.jersey.contribs</groupId>
-            <artifactId>jersey-spring</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.sun.jersey.contribs</groupId>
-            <artifactId>jersey-multipart</artifactId>
-        </dependency>
-    </dependencies>
-</project>
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/dataholder/PasswordContainer.java b/web/rest-common/src/main/java/org/artifactory/rest/common/dataholder/PasswordContainer.java
deleted file mode 100644
index 3794608..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/dataholder/PasswordContainer.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package org.artifactory.rest.common.dataholder;
-
-import org.artifactory.rest.common.model.RestModel;
-import org.codehaus.jackson.annotate.JsonAutoDetect;
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.springframework.security.core.CredentialsContainer;
-
-/**
- * Object used to hold password change data
- *
- * Created by Michael Pasternak on 1/5/16.
- */
- at JsonAutoDetect(
-        fieldVisibility = JsonAutoDetect.Visibility.NONE,
-        getterVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY,
-        setterVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY
-)
-public class PasswordContainer implements RestModel, CredentialsContainer {
-
-    private String userName;
-    private char[] oldPassword;
-    private char[] newPassword1;
-    private char[] newPassword2;
-
-    public PasswordContainer() {
-    }
-
-    public PasswordContainer(String userName, char[] oldPassword, char[] newPassword1, char[] newPassword2) {
-        this.userName = userName;
-        this.oldPassword = oldPassword;
-        this.newPassword1 = newPassword1;
-        this.newPassword2 = newPassword2;
-    }
-
-    public PasswordContainer(String userName, String oldPassword, String newPassword1, String newPassword2) {
-        this.userName = userName;
-        setOldPassword(oldPassword);
-        setNewPassword1(newPassword1);
-        setNewPassword2(newPassword2);
-    }
-
-    @JsonProperty("oldPassword")
-    public String getOldPassword() {
-        return oldPassword != null ? new String(oldPassword) : null;
-    }
-
-    @JsonProperty("oldPassword")
-    public void setOldPassword(String oldPassword) {
-        this.oldPassword = oldPassword != null ? oldPassword.toCharArray() : null;
-    }
-
-    @JsonProperty("newPassword1")
-    public String getNewPassword1() {
-        return newPassword1 != null ? new String(newPassword1) : null;
-    }
-
-    @JsonProperty("newPassword1")
-    public void setNewPassword1(String newPassword1) {
-        this.newPassword1 = newPassword1 != null ? newPassword1.toCharArray() : null;
-    }
-
-    @JsonProperty("newPassword2")
-    public String getNewPassword2() {
-        return newPassword2 != null ? new String(newPassword2) : null;
-    }
-
-    @JsonProperty("newPassword2")
-    public void setNewPassword2(String newPassword2) {
-        this.newPassword2 = newPassword2 != null ? newPassword2.toCharArray() : null;
-    }
-
-    @JsonProperty("userName")
-    public String getUserName() {
-        return userName;
-    }
-
-    @JsonProperty("userName")
-    public void setUserName(String userName) {
-        this.userName = userName;
-    }
-
-    @Override
-    public void eraseCredentials() {
-        userName = null;
-        oldPassword = null;
-        newPassword1 = null;
-        newPassword2 = null;
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/exception/BadRequestException.java b/web/rest-common/src/main/java/org/artifactory/rest/common/exception/BadRequestException.java
deleted file mode 100644
index f8a8e91..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/exception/BadRequestException.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common.exception;
-
-/**
- * Represents a REST API client error request which will get responded by a 400 HTTP status code.
- *
- * @author Shay Yaakov
- * @see BadRequestExceptionMapper
- */
-
-public class BadRequestException extends RuntimeException {
-
-    public BadRequestException(String message) {
-        super(message);
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/exception/BadRequestExceptionMapper.java b/web/rest-common/src/main/java/org/artifactory/rest/common/exception/BadRequestExceptionMapper.java
deleted file mode 100644
index d57441a..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/exception/BadRequestExceptionMapper.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common.exception;
-
-import com.sun.jersey.api.Responses;
-import org.artifactory.rest.ErrorResponse;
-import org.springframework.stereotype.Component;
-
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.ext.ExceptionMapper;
-import javax.ws.rs.ext.Provider;
-
-/**
- * Intercepts and maps {@link BadRequestException} exceptions thrown by the REST API.
- *
- * @author Shay Yaakov
- */
- at Component
- at Provider
-public class BadRequestExceptionMapper implements ExceptionMapper<BadRequestException> {
-
-    @Override
-    public Response toResponse(BadRequestException exception) {
-        ErrorResponse errorResponse = new ErrorResponse(Response.Status.BAD_REQUEST.getStatusCode(),
-                exception.getMessage());
-        return Responses.clientError().type(MediaType.APPLICATION_JSON).entity(errorResponse).build();
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/exception/ForbiddenException.java b/web/rest-common/src/main/java/org/artifactory/rest/common/exception/ForbiddenException.java
deleted file mode 100644
index 6837b08..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/exception/ForbiddenException.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common.exception;
-
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.Response;
-
-/**
- * Represents a REST API client error request which will get responded by a 403 HTTP status code.
- *
- * @author Lior Azar
- * @see ForbiddenException
- */
-
-public class ForbiddenException extends WebApplicationException {
-
-    public ForbiddenException() {
-        super(Response.status(Response.Status.FORBIDDEN).build());
-    }
-
-    public ForbiddenException(String message) {
-        super(Response.status(new Response.StatusType() {
-            @Override
-            public int getStatusCode() {
-                return Response.Status.FORBIDDEN.getStatusCode();
-            }
-
-            @Override
-            public Response.Status.Family getFamily() {
-                return Response.Status.FORBIDDEN.getFamily();
-            }
-
-            @Override
-            public String getReasonPhrase() {
-                return message;
-            }
-        }).build());
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/exception/UnauthorizedException.java b/web/rest-common/src/main/java/org/artifactory/rest/common/exception/UnauthorizedException.java
deleted file mode 100644
index 57f03f6..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/exception/UnauthorizedException.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common.exception;
-
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.Response;
-
-/**
- * Represents a REST API client error request which will get responded by a 401 HTTP status code.
- *
- * @author Dan Feldman
- */
-
-public class UnauthorizedException extends WebApplicationException {
-
-    public UnauthorizedException() {
-        super(Response.status(Response.Status.UNAUTHORIZED).build());
-    }
-
-    public UnauthorizedException(String message) {
-        super(Response.status(new Response.StatusType() {
-            @Override
-            public int getStatusCode() {
-                return Response.Status.FORBIDDEN.getStatusCode();
-            }
-
-            @Override
-            public Response.Status.Family getFamily() {
-                return Response.Status.UNAUTHORIZED.getFamily();
-            }
-
-            @Override
-            public String getReasonPhrase() {
-                return message;
-            }
-        }).build());
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/handler/RestLogoutHandler.java b/web/rest-common/src/main/java/org/artifactory/rest/common/handler/RestLogoutHandler.java
deleted file mode 100644
index 2d33da7..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/handler/RestLogoutHandler.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.artifactory.rest.common.handler;
-
-import org.springframework.security.core.Authentication;
-import org.springframework.security.web.authentication.logout.LogoutHandler;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-
-/**
- * @author Chen Keinan
- */
- at Component
-public class RestLogoutHandler implements LogoutHandler {
-
-    @Override
-    public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
-        HttpSession session = request.getSession(false);
-        if (session != null) {
-            session.invalidate();
-        }
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/model/BaseModel.java b/web/rest-common/src/main/java/org/artifactory/rest/common/model/BaseModel.java
deleted file mode 100644
index 97d3e47..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/model/BaseModel.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.artifactory.rest.common.model;
-
-import org.artifactory.rest.common.util.JsonUtil;
-
-/**
- * @author Chen Keinan
- */
-public class BaseModel implements RestModel {
-
-    FeedbackMsg feedbackMsg;
-
-    public FeedbackMsg getFeedbackMsg() {
-        return feedbackMsg;
-    }
-
-    public void setFeedbackMsg(FeedbackMsg feedbackMsg) {
-        this.feedbackMsg = feedbackMsg;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/model/FeedbackMsg.java b/web/rest-common/src/main/java/org/artifactory/rest/common/model/FeedbackMsg.java
deleted file mode 100644
index e74caf1..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/model/FeedbackMsg.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.artifactory.rest.common.model;
-
-import org.apache.commons.lang.StringUtils;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at JsonIgnoreProperties({"hasMessages"})
-public class FeedbackMsg extends BaseModel {
-
-    String error;
-    String warn;
-    String info;
-    String url;
-    List<String> errors;
-    boolean hasMessages;
-
-    public boolean hasMessages() {
-        return hasMessages;
-    }
-
-    public void setHasMessages(boolean hasMessages) {
-        this.hasMessages = hasMessages;
-    }
-
-    public String getError() {
-        return error;
-    }
-
-    public void setError(String error) {
-        if (StringUtils.isNotBlank(error)) {
-            this.hasMessages = true;
-            this.error = error;
-        }
-    }
-
-    @JsonIgnore
-    public boolean hasError() {
-        return StringUtils.isNotBlank(error);
-    }
-
-    public String getWarn() {
-        return warn;
-    }
-
-    public void setWarn(String warn) {
-        if (StringUtils.isNotBlank(warn)) {
-            this.hasMessages = true;
-            this.warn = warn;
-        }
-    }
-
-    public String getInfo() {
-        return info;
-    }
-
-    public void setInfo(String info) {
-        if (StringUtils.isNotBlank(info)) {
-            this.hasMessages = true;
-            this.info = info;
-        }
-    }
-
-    public List<String> getErrors() {
-        return errors;
-    }
-
-    public void setErrors(List<String> errors) {
-        this.hasMessages = true;
-        this.errors = errors;
-    }
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.hasMessages = true;
-        this.url = url;
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/model/FileData.java b/web/rest-common/src/main/java/org/artifactory/rest/common/model/FileData.java
deleted file mode 100644
index 630dda8..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/model/FileData.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.artifactory.rest.common.model;
-
-/**
- * @author Chen Keinan
- */
-public interface FileData {
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/model/FileModel.java b/web/rest-common/src/main/java/org/artifactory/rest/common/model/FileModel.java
deleted file mode 100644
index 7e75a66..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/model/FileModel.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.artifactory.rest.common.model;
-
-/**
- * @author Chen Keinan
- */
-public interface FileModel {
-
-    public Object getFileResource();
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/model/RestModel.java b/web/rest-common/src/main/java/org/artifactory/rest/common/model/RestModel.java
deleted file mode 100644
index 557fc50..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/model/RestModel.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.artifactory.rest.common.model;
-
-
-/**
- * @author Chen Keinan
- */
-public interface RestModel {
-
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/model/RestPaging.java b/web/rest-common/src/main/java/org/artifactory/rest/common/model/RestPaging.java
deleted file mode 100644
index 93141a9..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/model/RestPaging.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.artifactory.rest.common.model;
-
-/**
- * @author Chen Keinan
- */
-public interface RestPaging {
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/model/RestSpecialFields.java b/web/rest-common/src/main/java/org/artifactory/rest/common/model/RestSpecialFields.java
deleted file mode 100644
index 7652d6f..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/model/RestSpecialFields.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.artifactory.rest.common.model;
-
-/**
- * @author Chen Keinan
- */
-public interface RestSpecialFields {
-
-    /**
-     * conditional ignore special fields
-     * @IgnoreSpecialFields will be ignores during json serialization
-     * when overriding toString with the following:
-     * JsonUtil.jsonToStringIgnoreSpecialFields()
-     */
-    boolean ignoreSpecialFields();
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/model/artifact/BaseArtifact.java b/web/rest-common/src/main/java/org/artifactory/rest/common/model/artifact/BaseArtifact.java
deleted file mode 100644
index c3a63fb..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/model/artifact/BaseArtifact.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.artifactory.rest.common.model.artifact;
-
-import org.artifactory.rest.common.model.BaseModel;
-import org.artifactory.rest.common.util.JsonUtil;
-
-/**
- * @author Chen Keinan
- */
-public class BaseArtifact extends BaseModel implements IAction {
-
-    private String name;
-
-    private String repoKey;
-
-    private String path;
-
-    private String param;
-
-    public BaseArtifact(String name) {
-        this.name = name;
-    }
-
-    public BaseArtifact() {
-
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    public String getParam() {
-        return param;
-    }
-
-    public void setParam(String param) {
-        this.param = param;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/model/artifact/IAction.java b/web/rest-common/src/main/java/org/artifactory/rest/common/model/artifact/IAction.java
deleted file mode 100644
index 4c34459..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/model/artifact/IAction.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.artifactory.rest.common.model.artifact;
-
-/**
- * @author Chen Keinan
- */
-public interface IAction {
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/model/proxies/ProxiesModel.java b/web/rest-common/src/main/java/org/artifactory/rest/common/model/proxies/ProxiesModel.java
deleted file mode 100644
index bd4cd30..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/model/proxies/ProxiesModel.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.artifactory.rest.common.model.proxies;
-
-import com.google.common.collect.Lists;
-import org.artifactory.rest.common.model.BaseModel;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class ProxiesModel extends BaseModel {
-    private List<String> proxyKeys = Lists.newArrayList();
-    private Boolean portAvailable;
-
-    public Boolean getPortAvailable() {
-        return portAvailable;
-    }
-
-    public void setPortAvailable(Boolean portAvailable) {
-        this.portAvailable = portAvailable;
-    }
-
-    public List<String> getProxyKeys() {
-        return proxyKeys;
-    }
-
-    public void addProxy(String proxyKey) {
-        proxyKeys.add(proxyKey);
-    }
-
-    public void setProxyKeys(List<String> proxyKeys) {
-        this.proxyKeys = proxyKeys;
-    }
-}
-
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/model/reverseproxy/CommonFile.java b/web/rest-common/src/main/java/org/artifactory/rest/common/model/reverseproxy/CommonFile.java
deleted file mode 100644
index 273e5da..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/model/reverseproxy/CommonFile.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.rest.common.model.reverseproxy;
-
-import org.artifactory.rest.common.model.FileModel;
-import org.artifactory.rest.common.model.RestModel;
-
-/**
- * @author Chen Keinan
- */
-public class CommonFile implements RestModel, FileModel {
-
-    private String file;
-
-    public CommonFile(String file) {
-        this.file = file;
-    }
-
-    public String toString() {
-        return file.toString();
-    }
-
-    @Override
-    public Object getFileResource() {
-        return file;
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/model/reverseproxy/ReverseProxyDescriptorModel.java b/web/rest-common/src/main/java/org/artifactory/rest/common/model/reverseproxy/ReverseProxyDescriptorModel.java
deleted file mode 100644
index e85cf1f..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/model/reverseproxy/ReverseProxyDescriptorModel.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common.model.reverseproxy;
-
-import org.artifactory.descriptor.repo.ReverseProxyMethod;
-import org.artifactory.descriptor.repo.WebServerType;
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.annotate.JsonPropertyOrder;
-
-
- at JsonPropertyOrder(value = {"key", "webServerType", "artifactoryAppContext", "publicAppContext",
-        "serverName", "serverNameExpression", "artifactoryServerName", "artifactoryPort", "sslCertificate", "sslKey",
-        "dockerReverseProxyMethod", "useHttps", "useHttp", "httpsPort", "httpPort"})
-public class ReverseProxyDescriptorModel {
-    
-    private String key = "nginx";
-    private WebServerType webServerType;
-    private String artifactoryAppContext;
-    private String publicAppContext;
-    private String serverName;
-    private String serverNameExpression;
-    private String artifactoryServerName;
-    private String upStreamName;
-    private int artifactoryPort = 8081;
-    private String sslCertificate;
-    private String sslKey;
-    private ReverseProxyMethod dockerReverseProxyMethod;
-    private boolean useHttps;
-    private boolean useHttp;
-    @JsonProperty("httpsPort")
-    private int sslPort = 443;
-    private int httpPort= 80;
-
-    private ReverseProxyRepositories reverseProxyRepositories;
-
-    public ReverseProxyRepositories getReverseProxyRepositories() {
-        return reverseProxyRepositories;
-    }
-
-    public void setReverseProxyRepositories(ReverseProxyRepositories reverseProxyRepositories) {
-        this.reverseProxyRepositories = reverseProxyRepositories;
-    }
-
-    public String getKey() {
-        return key;
-    }
-
-    public void setKey(String key) {
-        this.key = key;
-    }
-
-    public WebServerType getWebServerType() {
-        return webServerType;
-    }
-
-    public void setWebServerType(WebServerType webServerType) {
-        this.webServerType = webServerType;
-    }
-
-    public String getArtifactoryAppContext() {
-        return artifactoryAppContext;
-    }
-
-
-    public void setArtifactoryAppContext(String artifactoryAppContext) {
-        this.artifactoryAppContext = artifactoryAppContext;
-    }
-
-
-
-    public String getPublicAppContext() {
-        return publicAppContext;
-    }
-
-    public void setPublicAppContext(String publicAppContext) {
-        this.publicAppContext = publicAppContext;
-    }
-
-    public String getServerName() {
-        return serverName;
-    }
-
-    public void setServerName(String serverName) {
-        this.serverName = serverName;
-    }
-
-    public String getServerNameExpression() {
-        return serverNameExpression;
-    }
-
-    public void setServerNameExpression(String serverNameExpression) {
-        this.serverNameExpression = serverNameExpression;
-    }
-
-    public String getSslCertificate() {
-        return sslCertificate;
-    }
-
-    public void setSslCertificate(String sslCertificate) {
-        this.sslCertificate = sslCertificate;
-    }
-
-    public String getSslKey() {
-        return sslKey;
-    }
-
-    public void setSslKey(String sslKey) {
-        this.sslKey = sslKey;
-    }
-
-    public ReverseProxyMethod getDockerReverseProxyMethod() {
-        return dockerReverseProxyMethod;
-    }
-
-    public void setDockerReverseProxyMethod(ReverseProxyMethod dockerReverseProxyMethod) {
-        this.dockerReverseProxyMethod = dockerReverseProxyMethod;
-    }
-
-    public boolean isUseHttps() {
-        return useHttps;
-    }
-
-    public void setUseHttps(boolean useHttps) {
-        this.useHttps = useHttps;
-    }
-
-    public int getSslPort() {
-        return sslPort;
-    }
-
-    public void setSslPort(int sslPort) {
-        this.sslPort = sslPort;
-    }
-
-    public int getHttpPort() {
-        return httpPort;
-    }
-
-    public void setHttpPort(int httpPort) {
-        this.httpPort = httpPort;
-    }
-
-    public String getUpStreamName() {
-        return upStreamName;
-    }
-
-    public void setUpStreamName(String upStreamName) {
-        this.upStreamName = upStreamName;
-    }
-
-    public String getArtifactoryServerName() {
-        return artifactoryServerName;
-    }
-
-    public void setArtifactoryServerName(String artifactoryServerName) {
-        this.artifactoryServerName = artifactoryServerName;
-    }
-
-    public int getArtifactoryPort() {
-        return artifactoryPort;
-    }
-
-    public void setArtifactoryPort(int artifactoryPort) {
-        this.artifactoryPort = artifactoryPort;
-    }
-
-    public boolean isUseHttp() {
-        return useHttp;
-    }
-
-    public void setUseHttp(boolean useHttp) {
-        this.useHttp = useHttp;
-    }
-
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        ReverseProxyDescriptorModel that = (ReverseProxyDescriptorModel) o;
-        return key.equals(that.key);
-    }
-
-    @Override
-    public int hashCode() {
-        return key.hashCode();
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/model/reverseproxy/ReverseProxyRepoConfigs.java b/web/rest-common/src/main/java/org/artifactory/rest/common/model/reverseproxy/ReverseProxyRepoConfigs.java
deleted file mode 100644
index 44ae3b7..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/model/reverseproxy/ReverseProxyRepoConfigs.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.artifactory.rest.common.model.reverseproxy;
-
-import org.artifactory.descriptor.repo.ReverseProxyRepoConfig;
-
-/**
- * @author Chen Keinan
- */
-public class ReverseProxyRepoConfigs {
-    private String repoRef;
-    private String serverName;
-    private int port;
-
-    public ReverseProxyRepoConfigs() {
-        // for jackson
-    }
-
-        public ReverseProxyRepoConfigs(ReverseProxyRepoConfig reverseProxyRepoConfig){
-        this.repoRef = reverseProxyRepoConfig.getRepoRef().getKey();
-        this.serverName = reverseProxyRepoConfig.getServerName();
-        this.port = reverseProxyRepoConfig.getPort();
-    }
-
-    public String getRepoRef() {
-        return repoRef;
-    }
-
-    public void setRepoRef(String repoRef) {
-        this.repoRef = repoRef;
-    }
-
-    public String getServerName() {
-
-        return serverName;
-    }
-
-    public void setServerName(String serverName) {
-        this.serverName = serverName;
-    }
-
-    public int getPort() {
-        return port;
-    }
-
-    public void setPort(int port) {
-        this.port = port;
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/model/reverseproxy/ReverseProxyRepositories.java b/web/rest-common/src/main/java/org/artifactory/rest/common/model/reverseproxy/ReverseProxyRepositories.java
deleted file mode 100644
index 67c737d..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/model/reverseproxy/ReverseProxyRepositories.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common.model.reverseproxy;
-
-import java.util.List;
-
-public class ReverseProxyRepositories {
-    
-   private List<ReverseProxyRepoConfigs> reverseProxyRepoConfigs;
-
-    public List<ReverseProxyRepoConfigs> getReverseProxyRepoConfigs() {
-        return reverseProxyRepoConfigs;
-    }
-
-    public void setReverseProxyRepoConfigs(List<ReverseProxyRepoConfigs> reverseProxyRepoConfigs) {
-        this.reverseProxyRepoConfigs = reverseProxyRepoConfigs;
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/model/storagesummary/StorageSummaryModel.java b/web/rest-common/src/main/java/org/artifactory/rest/common/model/storagesummary/StorageSummaryModel.java
deleted file mode 100644
index 34acbbb..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/model/storagesummary/StorageSummaryModel.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.artifactory.rest.common.model.storagesummary;
-
-import org.artifactory.rest.common.model.BaseModel;
-import org.artifactory.storage.BinariesSummary;
-import org.artifactory.storage.FileStoreSummary;
-import org.artifactory.storage.RepositorySummary;
-import org.artifactory.storage.StorageSummary;
-import org.artifactory.storage.StorageSummaryImpl;
-import org.artifactory.storage.StorageSummaryInfo;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class StorageSummaryModel extends BaseModel implements StorageSummary {
-
-    StorageSummaryImpl storageSummary;
-
-    /**
-     * serialization .ctr
-     */
-    public StorageSummaryModel() {
-    }
-
-    public StorageSummaryModel(StorageSummaryInfo storageSummaryInfo) {
-        storageSummary = new StorageSummaryImpl(storageSummaryInfo);
-    }
-
-    @Override
-    public BinariesSummary getBinariesSummary() {
-        return storageSummary.getBinariesSummary();
-    }
-
-    @Override
-    public void setBinariesSummary(BinariesSummary binariesSummary) {
-        storageSummary.setBinariesSummary(binariesSummary);
-    }
-
-    @Override
-    public FileStoreSummary getFileStoreSummary() {
-        return storageSummary.getFileStoreSummary();
-    }
-
-    @Override
-    public void setFileStoreSummary(FileStoreSummary fileStoreSummary) {
-        storageSummary.setFileStoreSummary(fileStoreSummary);
-    }
-
-    @Override
-    public List<RepositorySummary> getRepositoriesSummaryList() {
-        return storageSummary.getRepositoriesSummaryList();
-    }
-
-    @Override
-    public void setRepositoriesSummaryList(List<RepositorySummary> repositoriesSummaryList) {
-        storageSummary.setRepositoriesSummaryList(repositoriesSummaryList);
-    }
-
-    public StorageSummaryImpl getStorageSummary() {
-        return storageSummary;
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/model/trash/RestoreArtifact.java b/web/rest-common/src/main/java/org/artifactory/rest/common/model/trash/RestoreArtifact.java
deleted file mode 100644
index bfdbb30..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/model/trash/RestoreArtifact.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common.model.trash;
-
-
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-
-/**
- * @author Shay Yaakov
- */
-public class RestoreArtifact extends BaseArtifact {
-
-    private String targetRepoKey;
-    private String targetPath;
-
-    public RestoreArtifact() {
-    }
-
-    public RestoreArtifact(String name) {
-        super(name);
-    }
-
-    public String getTargetRepoKey() {
-        return targetRepoKey;
-    }
-
-    public void setTargetRepoKey(String targetRepoKey) {
-        this.targetRepoKey = targetRepoKey;
-    }
-
-    public String getTargetPath() {
-        return targetPath;
-    }
-
-    public void setTargetPath(String targetPath) {
-        this.targetPath = targetPath;
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/model/userprofile/UserProfileModel.java b/web/rest-common/src/main/java/org/artifactory/rest/common/model/userprofile/UserProfileModel.java
deleted file mode 100644
index 22b5aeb..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/model/userprofile/UserProfileModel.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.artifactory.rest.common.model.userprofile;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Chen Keinan
- */
-public class UserProfileModel extends BaseModel {
-
-    private String userName;
-    private String apiKey;
-
-    public UserProfileModel() {
-        // for jackson
-    }
-
-    public UserProfileModel(String apiKey) {
-        this.apiKey = apiKey;
-    }
-
-    public UserProfileModel(String apiKey, String userName) {
-        this.apiKey = apiKey;
-        this.userName = userName;
-    }
-
-    public String getApiKey() {
-        return apiKey;
-    }
-
-    public void setApiKey(String apiKey) {
-        this.apiKey = apiKey;
-    }
-
-    public String getUserName() {
-        return userName;
-    }
-
-    public void setUserName(String userName) {
-        this.userName = userName;
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/resource/BaseResource.java b/web/rest-common/src/main/java/org/artifactory/rest/common/resource/BaseResource.java
deleted file mode 100644
index 75980a9..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/resource/BaseResource.java
+++ /dev/null
@@ -1,119 +0,0 @@
-package org.artifactory.rest.common.resource;
-
-import org.artifactory.rest.common.service.*;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.core.*;
-import java.util.List;
-
-/**
- * @author chen keinan
- */
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public abstract class BaseResource {
-    @Context
-    protected HttpServletRequest servletRequest;
-    @Context
-    protected HttpServletResponse servletResponse;
-    @Autowired
-    protected ServiceExecutor serviceExecutor;
-    protected RestResponse artifactoryResponse;
-
-    @Context Request request;
-    @Context UriInfo uriInfo;
-    @Context HttpHeaders httpHeaders;
-
-    @Autowired
-    @Qualifier("artifactoryUiResponse")
-    public void setArtifactoryResponse(RestResponse artifactoryResponse) {
-        this.artifactoryResponse = artifactoryResponse;
-    }
-
-    /**
-     * return ArtifactoryRestRequest instance with http servlet response property
-     * @param modelData - rest data type
-     * @return instance of ArtifactoryRestRequest
-     */
-    protected <Y> ArtifactoryRestRequest<Y> getArtifactoryRestRequest(Y modelData) {
-        ArtifactoryRestRequest.RequestBuilder builder = new ArtifactoryRestRequest.
-                RequestBuilder(servletRequest, request, uriInfo, httpHeaders)
-                .model(modelData);
-        return new ArtifactoryRestRequest(builder);
-     }
-
-    /**
-     * return ArtifactoryRestRequest instance with http servlet response property
-     * @param modelsData - rest data type List
-     * @return instance of ArtifactoryRestRequest
-     */
-    protected <Y> ArtifactoryRestRequest<Y> getArtifactoryRestRequest(List<Y> modelsData) {
-        ArtifactoryRestRequest.RequestBuilder builder = new ArtifactoryRestRequest.
-                RequestBuilder(servletRequest, request, uriInfo, httpHeaders)
-                .models(modelsData);
-        return new ArtifactoryRestRequest(builder);
-    }
-
-    /**
-     * execute service operation (i.e.: create user , login and etc) with  model
-     *
-     * @param service - service type (Login Service and etc)
-     * @return - rest response
-     */
-    protected <Y> Response runService(RestService<Y> service, Y model) {
-        // get encapsulated request data
-        ArtifactoryRestRequest artifactoryRequest = getArtifactoryRestRequest(model);
-        updateServletData();
-        // process service request
-        return serviceExecutor.process(artifactoryRequest,artifactoryResponse,service);
-    }
-
-    /**
-     * update http servlet request and response
-     */
-    private void updateServletData() {
-        ((ArtifactoryRestResponse) artifactoryResponse).setServletResponse(servletResponse);
-        ((ArtifactoryRestResponse) artifactoryResponse).setServletRequest(servletRequest);
-    }
-
-    /**
-     * execute service operation (i.e.: create user , login and etc) with  model
-     *
-     * @param service - service type (Login Service and etc)
-     * @return rest response
-     */
-    protected <Y> Response runService(RestService<List<Y>> service, List<Y> model) {
-        // get encapsulated request data
-        ArtifactoryRestRequest artifactoryRequest = getArtifactoryRestRequest(model);
-        updateServletData();
-        // process service request
-        return serviceExecutor.process(artifactoryRequest, artifactoryResponse, service);
-    }
-
-    /**
-     * execute service operation (i.e.: create user , login and etc) without model
-     * @param service - service type (Login Service and etc)
-     * @return - rest response
-     */
-    protected <Y> Response runService(RestService<Y> service) {
-        // get encapsulated request data
-        ArtifactoryRestRequest artifactoryRequest = getArtifactoryRestRequest();
-        updateServletData();
-        // process service request
-        return serviceExecutor.process(artifactoryRequest,artifactoryResponse,service);
-    }
-
-    /**
-     * return ArtifactoryRestRequest instance with http servlet response property
-     * @return instance of ArtifactoryRestRequest
-     */
-    protected <Y> ArtifactoryRestRequest<Y> getArtifactoryRestRequest() {
-        ArtifactoryRestRequest.RequestBuilder builder = new ArtifactoryRestRequest.
-                RequestBuilder(servletRequest, request, uriInfo, httpHeaders);
-        return new ArtifactoryRestRequest(builder);
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/AbstractResearchService.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/AbstractResearchService.java
deleted file mode 100644
index 06c583f..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/AbstractResearchService.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common.service;
-
-import org.artifactory.api.jackson.JacksonFactory;
-import org.codehaus.jackson.JsonParser;
-import org.codehaus.jackson.map.DeserializationConfig;
-import org.codehaus.jackson.map.ObjectMapper;
-
-import java.io.IOException;
-
-/**
- * Created by michaelp on 9/30/15.
- */
-public abstract class AbstractResearchService {
-    /**
-     * Creates a JSON parser for the given bytes to parse
-     *
-     * @param bytesToParse Byte[] to parse
-     * @return JSON Parser
-     * @throws java.io.IOException
-     */
-    protected JsonParser getJsonParser(byte[] bytesToParse) throws IOException {
-        return JacksonFactory.createJsonParser(bytesToParse);
-    }
-
-    /**
-     * Creates a Jackson object mapper
-     *
-     * @return Object mapper
-     */
-    protected ObjectMapper getObjectMapper() {
-        ObjectMapper mapper = new ObjectMapper();
-        mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-        return mapper;
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/ArtifactoryRestRequest.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/ArtifactoryRestRequest.java
deleted file mode 100644
index 5e62f3a..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/ArtifactoryRestRequest.java
+++ /dev/null
@@ -1,175 +0,0 @@
-package org.artifactory.rest.common.service;
-
-import org.artifactory.repo.RepoPath;
-import org.artifactory.util.HttpUtils;
-import org.artifactory.util.UiRequestUtils;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.Request;
-import javax.ws.rs.core.UriInfo;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class ArtifactoryRestRequest<T> {
-
-    private HttpServletRequest servletRequest;
-    private Request request;
-    private UriInfo uriInfo;
-    private HttpHeaders httpHeaders;
-    private T imodel;
-    private List<T> models;
-    private boolean uiRestCall;
-
-    public ArtifactoryRestRequest(RequestBuilder<T> requestBuilder) {
-        this.servletRequest = requestBuilder.servletRequest;
-        this.request = requestBuilder.request;
-        this.uriInfo = requestBuilder.uriInfo;
-        this.httpHeaders = requestBuilder.httpHeaders;
-        imodel = requestBuilder.imodel;
-        models = requestBuilder.imodels;
-        this.uiRestCall = UiRequestUtils.isUiRestRequest(servletRequest);
-     }
-
-    /**
-     * return path param by key
-     * @param key - path param key
-     * @return path param value
-     */
-    public String getPathParamByKey(String key){
-        String value="";
-        List<String> valueList = uriInfo.getPathParameters().get(key);
-        if (valueList != null && !valueList.isEmpty()){
-            String currentValue = valueList.get(0);
-            value = (currentValue == null) ? currentValue :
-                    currentValue.startsWith("/") ? currentValue.substring(1, currentValue.length())
-                            :
-                            currentValue;
-        }
-        return value;
-    }
-
-    /**
-     * return path param by key
-     *
-     * @param key - path param key
-     * @return path param value
-     */
-    public String getQueryParamByKey(String key) {
-        String value = "";
-        List<String> valueList = uriInfo.getQueryParameters().get(key);
-        if (valueList != null && !valueList.isEmpty()) {
-            String currentValue = valueList.get(0);
-            value = (currentValue == null) ? currentValue : currentValue;
-        }
-        return value;
-    }
-
-    public boolean isUiRestCall() {
-        return uiRestCall;
-    }
-
-    public void setUiRestCall(boolean uiRestCall) {
-        this.uiRestCall = uiRestCall;
-    }
-
-    public Request getRequest() {
-        return request;
-    }
-
-    public void setRequest(Request request) {
-        this.request = request;
-    }
-
-    public UriInfo getUriInfo() {
-        return uriInfo;
-    }
-
-    public void setUriInfo(UriInfo uriInfo) {
-        this.uriInfo = uriInfo;
-    }
-
-    public HttpHeaders getHttpHeaders() {
-        return httpHeaders;
-    }
-
-    public void setHttpHeaders(HttpHeaders httpHeaders) {
-        this.httpHeaders = httpHeaders;
-    }
-
-    public HttpServletRequest getServletRequest() {
-        return servletRequest;
-    }
-
-    public void setServletRequest(HttpServletRequest servletRequest) {
-        this.servletRequest = servletRequest;
-    }
-
-    public List<T> getModels() {
-        return models;
-    }
-
-    public void setModels(List<T> models) {
-        this.models = models;
-    }
-
-    public T getImodel() {
-        return (T) imodel;
-    }
-
-    public void setImodel(T imodel) {
-        this.imodel = imodel;
-    }
-
-    public PagingData getPagingData() {
-        return new PagingData(this);
-    }
-
-    public long getPages(long allUsersGroupsCount, long currentPageSize, String limit, String offset) {
-        long numOfPages = allUsersGroupsCount / currentPageSize;
-        long mod = allUsersGroupsCount % currentPageSize;
-        if (mod > 0 && numOfPages == Integer.parseInt(limit) - Integer.parseInt(offset)) {
-            numOfPages = numOfPages + 1;
-        }
-        return numOfPages;
-    }
-
-    public String getDownloadLink(RepoPath repoPath){
-        if (repoPath != null) {
-            return HttpUtils.getServletContextUrl(servletRequest) + "/" + repoPath.getRepoKey() + "/" + repoPath.getPath();
-        }else{
-            return  "";
-        }
-    }
-
-    public static class RequestBuilder<T> {
-        private HttpServletRequest servletRequest;
-        private Request request;
-        private UriInfo uriInfo;
-        private HttpHeaders httpHeaders;
-        private T imodel;
-        private String id;
-        private List<T> imodels;
-
-
-        public RequestBuilder(HttpServletRequest servletRequest, Request request, UriInfo uriInfo,
-                HttpHeaders httpHeaders) {
-            this.servletRequest = servletRequest;
-            this.request = request;
-            this.uriInfo = uriInfo;
-            this.httpHeaders = httpHeaders;
-        }
-
-        public RequestBuilder model(T imodel) {
-            this.imodel = imodel;
-            return this;
-        }
-
-        public RequestBuilder models(List<T> iModels) {
-            this.imodels = iModels;
-            return this;
-        }
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/ArtifactoryRestResponse.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/ArtifactoryRestResponse.java
deleted file mode 100644
index 45cf915..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/ArtifactoryRestResponse.java
+++ /dev/null
@@ -1,247 +0,0 @@
-package org.artifactory.rest.common.service;
-
-import org.artifactory.rest.common.model.BaseModel;
-import org.artifactory.rest.common.model.FeedbackMsg;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.ResponseHandler;
-import org.artifactory.util.UiRequestUtils;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.core.Response;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import static org.apache.http.HttpStatus.SC_BAD_REQUEST;
-import static org.apache.http.HttpStatus.SC_OK;
-
-/**
- * @author Chen Keinan
- */
- at Component("artifactoryUiResponse")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ArtifactoryRestResponse<T> implements RestResponse<T> {
-    private Collection<T> iModelList;
-    private T iModel;
-    private HttpServletResponse servletResponse;
-    private HttpServletRequest servletRequest;
-    private FeedbackMsg feedbackMsg = new FeedbackMsg();
-    private Object entity;
-    private boolean hasModelList;
-    private boolean hasModel;
-    boolean uiCall;
-    boolean failed;
-
-    public FeedbackMsg getFeedbackMsg() {
-        return feedbackMsg;
-    }
-
-    public boolean hasModel() {
-        return hasModel;
-    }
-
-    private int responseCode = SC_OK;
-
-    public ArtifactoryRestResponse() {
-    }
-
-    public ArtifactoryRestResponse(HttpServletResponse servletResponse) {
-        this.servletResponse = servletResponse;
-    }
-
-    public int getResponseCode() {
-        return responseCode;
-    }
-
-    public ArtifactoryRestResponse responseCode(int responseCode) {
-        this.responseCode = responseCode;
-        if (responseCode <= 199 || responseCode >= 400) failed = true;
-        return this;
-    }
-
-    public HttpServletResponse getServletResponse() {
-        return servletResponse;
-    }
-
-    public void setServletResponse(HttpServletResponse servletResponse) {
-        this.servletResponse = servletResponse;
-    }
-
-    public Collection<T> getiModelList() {
-        return iModelList;
-    }
-
-    @Override
-    public Object getEntity() {
-        if (this.hasModel) {
-            // return object entity
-
-            return getObject();
-        } else if (this.hasModelList) {
-            //return collection entity
-            Collection<T> ts = getiModelList();
-            Iterator<T> iterator = ts.iterator();
-            Object entity = getObject(iterator, ts);
-            if (entity != null) return entity;
-        } else {// send feedback message
-            if (getFeedbackMsg().hasMessages()) {
-                return getFeedbackMsg().toString();
-            }
-        }
-        return null;
-    }
-
-    /**
-     * return collection entity
-     *
-     * @param iterator   - collection iterator
-     * @param collection - collection
-     * @return response entity
-     */
-    private Object getObject(Iterator<T> iterator, Collection<T> collection) {
-        if (iterator.hasNext()) {
-            // serialize model with object mapper
-            if (iterator.next() instanceof RestModel) {
-                return collection.toString();
-            } else {
-                return collection;
-            }
-        }
-        return collection.toString();
-    }
-
-
-    /**
-     * return object entityr
-     *
-     * @return entity
-     */
-    private Object getObject() {
-        if (getIModel() instanceof RestModel) {
-            return getIModel().toString();
-        } else {
-            return getIModel();
-        }
-    }
-
-    /**
-     *
-     * @param iModelList
-     * @return
-     */
-    public ArtifactoryRestResponse iModelList(Collection<T> iModelList) {
-        this.iModelList = iModelList;
-        if (iModelList != null) {
-            hasModelList = true;
-        } else {
-            hasModelList = false;
-        }
-        return this;
-    }
-
-    public <T> T getIModel() {
-        return (T) iModel;
-    }
-
-    /**
-     *
-     * @param iModel
-     * @return
-     */
-    public ArtifactoryRestResponse iModel(T iModel) {
-        this.iModel = iModel;
-        if (iModel != null) {
-            hasModel = true;
-        } else {
-            hasModel = false;
-        }
-        return this;
-    }
-
-
-    /**
-     * update response data with model data
-     */
-    public Response buildResponse() {
-        Response serviceResponse;
-        if (feedbackMsg.hasError() && responseCode == SC_OK) {
-            responseCode = SC_BAD_REQUEST;
-        }
-        // add feedback msg to model if exist
-        updateFeedbackMsgOnTopModel();
-        serviceResponse = ResponseHandler.buildJerseyResponse(this);
-        return serviceResponse;
-    }
-
-    /**
-     * update feedback msg to model if exist
-     */
-    private void updateFeedbackMsgOnTopModel() {
-        if (hasModel && feedbackMsg.hasMessages() && getIModel() instanceof BaseModel) {
-            ((BaseModel) getIModel()).setFeedbackMsg(feedbackMsg);
-        }
-    }
-
-    public ArtifactoryRestResponse error(String error) {
-        feedbackMsg.setError(error);
-        return this;
-    }
-
-    public ArtifactoryRestResponse warn(String warn) {
-        feedbackMsg.setWarn(warn);
-        return this;
-    }
-
-    public ArtifactoryRestResponse info(String info) {
-        feedbackMsg.setInfo(info);
-        return this;
-    }
-
-    @Override
-    public ArtifactoryRestResponse entity(Object entity) {
-        this.entity = entity;
-        return this;
-    }
-
-    @Override
-    public ArtifactoryRestResponse errors(List<String> errors) {
-        feedbackMsg.setErrors(errors);
-        return this;
-    }
-
-    @Override
-    public ArtifactoryRestResponse url(String url) {
-        feedbackMsg.setUrl(url);
-        return this;
-    }
-
-    public HttpServletRequest getServletRequest() {
-        return servletRequest;
-    }
-
-    public void setServletRequest(HttpServletRequest servletRequest) {
-        this.servletRequest = servletRequest;
-        if (UiRequestUtils.isUiRestRequest(servletRequest)) {
-            setUiCall(true);
-        }
-    }
-
-    public boolean isUiCall() {
-        return uiCall;
-    }
-
-    public void setUiCall(boolean uiCall) {
-        this.uiCall = uiCall;
-    }
-
-    /**
-     * @return whether request has failed
-     */
-    public boolean isFailed() {
-        return failed;
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/IgnoreSpecialFields.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/IgnoreSpecialFields.java
deleted file mode 100644
index d9b6bf4..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/IgnoreSpecialFields.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.artifactory.rest.common.service;
-
-import java.lang.annotation.*;
-
-/**
- * @author Chen Keinan
- */
- at Target({ElementType.TYPE})
- at Retention(RetentionPolicy.RUNTIME)
- at Inherited
- at Documented
-public @interface IgnoreSpecialFields {
-    /**
-     *  list of fields define in this method will be ignored during json serialization
-     *  the class that have this annotation need to :
-     *  1.  override toString by calling this function: JsonUtil.jsonToStringIgnoreSpecialFields(this);
-     *  2.  set @JsonFilter("exclude fields") annotation for this class
-     *
-     *  Note: for conditional ignore special fields
-     *  must implements ISpecialFields interface
-     * @return list of fields to be ignored on return
-     */
-    String[] value() default {};
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/PagingData.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/PagingData.java
deleted file mode 100644
index 2eb65bc..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/PagingData.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.artifactory.rest.common.service;
-
-/**
- * @author Chen Keinan
- */
-public class PagingData {
-
-    private String orderBy;
-    private String startOffset;
-    private String limit;
-    private String direction;
-
-    public PagingData(ArtifactoryRestRequest restRequest) {
-        this.orderBy = restRequest.getQueryParamByKey("orderBy");
-        limit = restRequest.getQueryParamByKey("numOfRows");
-        if (!limit.isEmpty()) {
-            int numOfRows = Integer.parseInt(limit);
-            int startRowNumber = ((Integer.parseInt(restRequest.getQueryParamByKey("pageNum")) - 1) * numOfRows);
-            this.startOffset = startRowNumber + "";
-        }
-        this.direction = restRequest.getQueryParamByKey("direction");
-    }
-
-    public String getOrderBy() {
-        return orderBy;
-    }
-
-    public void setOrderBy(String orderBy) {
-        this.orderBy = orderBy;
-    }
-
-    public String getStartOffset() {
-        return startOffset;
-    }
-
-    public void setStartOffset(String startOffset) {
-        this.startOffset = startOffset;
-    }
-
-    public String getLimit() {
-        return limit;
-    }
-
-    public void setLimit(String limit) {
-        this.limit = limit;
-    }
-
-    public String getDirection() {
-        return direction;
-    }
-
-    public void setDirection(String direction) {
-        this.direction = direction;
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/ResearchService.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/ResearchService.java
deleted file mode 100644
index d92b479..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/ResearchService.java
+++ /dev/null
@@ -1,566 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common.service;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import org.apache.commons.compress.utils.IOUtils;
-import org.apache.http.Header;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpRequestBase;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.util.EntityUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.CoreAddons;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.config.VersionInfo;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.jackson.JacksonReader;
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.api.rest.search.result.VersionRestResult;
-import org.artifactory.descriptor.repo.HttpRepoDescriptor;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.features.VersionFeature;
-import org.artifactory.features.matrix.SmartRepoVersionFeatures;
-import org.artifactory.repo.HttpRepositoryConfiguration;
-import org.artifactory.repo.HttpRepositoryConfigurationImpl;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.util.HttpClientConfigurator;
-import org.artifactory.util.PathUtils;
-import org.codehaus.jackson.type.TypeReference;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Nullable;
-import java.io.IOException;
-import java.io.Serializable;
-import java.net.URI;
-import java.util.List;
-
-import static org.artifactory.request.ArtifactoryRequest.ARTIFACTORY_ORIGINATED;
-
-/**
- * Service used to discover capabilities of another artifactory
- *
- * @author michaelp
- */
- at Component
-public class ResearchService extends AbstractResearchService {
-
-    private static final Logger log = LoggerFactory.getLogger(ResearchService.class);
-    private static final String ARTIFACTORY_SYSTEM_VERSION_PATH = "/api/system/version";
-    private static final String ARTIFACTORY_REPOSITORIES_PATH = "/api/repositories";
-    private static final String ARTIFACTORY_APP_PATH = "/artifactory";
-
-    @Lazy(true)
-    @Autowired
-    private SmartRepoVersionFeatures smartRepoVersionFeatures;
-
-    @Autowired
-    private CentralConfigService configService;
-
-    public ResearchResponse getSmartRepoCapabilities(HttpRepositoryConfigurationImpl configuration) {
-        if(!Strings.isNullOrEmpty(configuration.getUrl())) {
-            URI uri = URI.create(configuration.getUrl());
-            if (uri != null) {
-                if (uri.getPath().startsWith(ARTIFACTORY_APP_PATH)) {
-                    return getArtifactoryCapabilities(getHttpClient(configuration), uri, true);
-                } else {
-                    return getArtifactoryCapabilities(getHttpClient(configuration), uri, false);
-                }
-            } else {
-                log.debug("Url is malformed.");
-            }
-        } else {
-            log.debug("Url is a mandatory (query) parameter.");
-        }
-        return ResearchResponse.notArtifactory();
-    }
-
-    /**
-     * Checks whether given target is another artifactory instance
-     * and if true, retrieves SmartRepo capabilities based on artifactory
-     * version
-     *
-     * @param httpRepoDescriptor {@link HttpRepoDescriptor}
-     *
-     * @return {@link ResearchResponse}
-     */
-    public ResearchResponse getSmartRepoCapabilities(HttpRepoDescriptor httpRepoDescriptor) {
-        if(!Strings.isNullOrEmpty(httpRepoDescriptor.getUrl())) {
-            URI uri = URI.create(httpRepoDescriptor.getUrl());
-            if (uri != null) {
-                if (uri.getPath().startsWith(ARTIFACTORY_APP_PATH)) {
-                    return getArtifactoryCapabilities(getHttpClient(httpRepoDescriptor), uri, true);
-                } else {
-                    return getArtifactoryCapabilities(getHttpClient(httpRepoDescriptor), uri, false);
-                }
-            } else {
-                log.debug("Url is malformed.");
-            }
-        } else {
-            log.debug("Url is a mandatory (query) parameter.");
-        }
-        return ResearchResponse.notArtifactory();
-    }
-
-    /**
-     * Checks whether given target is another artifactory instance
-     * and if true, retrieves SmartRepo capabilities based on artifactory
-     * version
-     *
-     * @param url url to test against
-     * @param client http client to be used
-     *
-     * @return {@link ResearchResponse}
-     *
-     * @return boolean
-     */
-    public ResearchResponse getSmartRepoCapabilities(String url, CloseableHttpClient client) {
-        assert client != null : "HttpClient cannot be empty";
-
-        if(!Strings.isNullOrEmpty(url)) {
-            URI uri = URI.create(url);
-            VersionInfo versionInfo;
-            if (uri != null) {
-                if (uri.getPath().startsWith(ARTIFACTORY_APP_PATH)){
-                    return getArtifactoryCapabilities(client, uri, true);
-                } else {
-                    return getArtifactoryCapabilities(client, uri, false);
-                }
-            } else {
-                log.debug("Url is malformed.");
-            }
-        } else {
-            log.debug("Url is a mandatory (query) parameter.");
-        }
-        return ResearchResponse.notArtifactory();
-    }
-
-    /**
-     * Fetches artifactory capabilities (if target is artifactory)
-     *
-     * @param client http client to use
-     * @param uri remote uri to test against
-     * @param inArtifactoryContext whether given app deployed
-     *                             in /artifactory context or not
-     *
-     * @return {@link VersionInfo} if target is artifactory or null
-     */
-    private ResearchResponse getArtifactoryCapabilities(CloseableHttpClient client, URI uri,
-            boolean inArtifactoryContext) {
-        assert client != null : "HttpClient cannot be empty";
-
-        CloseableHttpResponse response = null;
-        String requestUrl = produceVersionUrl(uri, inArtifactoryContext);
-        HttpGet getMethod = new HttpGet(requestUrl);
-        addOriginatedHeader(getMethod);
-        try {
-            response = client.execute(getMethod);
-            String returnedInfo = null;
-            if (response != null ) {
-                if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
-                    returnedInfo = EntityUtils.toString(response.getEntity());
-                    if (!Strings.isNullOrEmpty(returnedInfo)) {
-                        VersionRestResult vrr = parseVersionRestResult(returnedInfo);
-                        if (vrr != null && !Strings.isNullOrEmpty(vrr.version) &&
-                                validateLicense(vrr.license, getArtifactoryId(response))) {
-
-                            Boolean isRealRepo = isRealRepo(client, uri, // make sure it not a virt repo
-                                    PathUtils.getLastPathElement(uri.getPath()),
-                                    inArtifactoryContext
-                            );
-
-                            if (isRealRepo == null) {
-                                                    // we were unable to check repoType
-                                                    // what may happen if config doesn't
-                                                    // have credentials or has insufficient permissions
-                                                    // (api requires it even if anonymous login is on)
-                                log.debug("We were unable to check repoType, it may happen if config doesn't have " +
-                                        "credentials or user permissions insufficient");
-                            }
-
-                            if (isRealRepo == null || isRealRepo.booleanValue()) {
-                                log.debug("Repo '{}' is artifactory repository (not virtual) and has supported version for SmartRepo");
-                                VersionInfo versionInfo =  vrr.toVersionInfo();
-                                return ResearchResponse.artifactoryMeta(
-                                        true,
-                                        versionInfo,
-                                        smartRepoVersionFeatures.getFeaturesByVersion(versionInfo)
-                                );
-                            } else {
-                                log.debug("Virtual repository is not supported in this version of SmartRepo");
-                            }
-                        } else {
-                            log.debug("Unsupported version: {}", vrr);
-                        }
-                    }
-                } else if (response.getStatusLine().getStatusCode() == HttpStatus.SC_UNAUTHORIZED) {
-                    return ResearchResponse.artifactory();
-                }
-            }
-        } catch (IOException | IllegalArgumentException e) {
-            log.debug("Checking remote artifactory version has failed: {}.", e);
-        } finally {
-            IOUtils.closeQuietly(response);
-        }
-        return ResearchResponse.notArtifactory();
-    }
-
-    /**
-     * add originated header to request
-     *
-     * @param request - http servlet request
-     */
-    private static void addOriginatedHeader(HttpRequestBase request) {
-        String hostId = ContextHelper.get().beanForType(AddonsManager.class).addonByType(HaCommonAddon.class).getHostId();
-        request.addHeader(ARTIFACTORY_ORIGINATED, hostId);
-    }
-
-    /**
-     * Validates that remote Artifactory uses different license and it is PRO license
-     *
-     * @param license remote license
-     * @param artifactoryId remote artifactory id
-     *
-     * @return true if both constraints are true otherwise false
-     */
-    private boolean validateLicense(String license, String artifactoryId) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        CoreAddons coreAddons = addonsManager.addonByType(CoreAddons.class);
-
-        boolean isDifferentLicense = coreAddons.validateTargetHasDifferentLicense(license, artifactoryId);
-        boolean isProLicensed = addonsManager.isProLicensed(license);
-
-        boolean result = isDifferentLicense && isProLicensed;
-        if(!result) {
-            if (!isDifferentLicense)
-                log.warn("License uniqueness validation against target repository " +
-                        "has failed, SmartRepo capabilities won't be enabled");
-            if (!isProLicensed)
-                log.warn("License PRO validation against target repository has failed, " +
-                        "SmartRepo capabilities won't be enabled");
-        }
-        return result;
-    }
-
-    /**
-     * Fetches ARTIFACTORY_ID header from {@link CloseableHttpResponse}
-     *
-     * @param response
-     *
-     * @return ArtifactoryId if present or null
-     */
-    @Nullable
-    private String getArtifactoryId(CloseableHttpResponse response) {
-        assert response != null : "HttpResponse cannot be empty";
-        Header artifactoryIdHeader = response.getFirstHeader(ArtifactoryResponse.ARTIFACTORY_ID);
-        if (artifactoryIdHeader != null && !Strings.isNullOrEmpty(artifactoryIdHeader.getValue())) {
-            return artifactoryIdHeader.getValue();
-        }
-        return null;
-    }
-
-    /**
-     * Produces url to be used against target host
-     * @param uri original URI
-     * @param inArtifactoryContext if application resides under
-     *                             /artifactory path
-     *
-     * @return url to be used
-     */
-    private String produceVersionUrl(URI uri, boolean inArtifactoryContext) {
-        return new StringBuilder()
-                .append(uri.getScheme())
-                .append("://")
-                .append(uri.getHost())
-                .append(uri.getPort() != -1 ?
-                        ":" + uri.getPort()
-                        :
-                        ""
-                )
-                .append(getServiceName(uri, inArtifactoryContext))
-                .append(ARTIFACTORY_SYSTEM_VERSION_PATH)
-                .toString();
-    }
-
-    /**
-     * Fetches service name from the original URI
-     *
-     * @param uri
-     * @param inArtifactoryContext
-     * @return service name
-     */
-    private String getServiceName(URI uri, boolean inArtifactoryContext) {
-        if(inArtifactoryContext)
-            return ARTIFACTORY_APP_PATH;
-        if(uri.getPath() != null) {
-            String[] parts = uri.getPath().split("/");
-            if(parts.length >= 2) {
-                if (!(parts.length == 2 && uri.getPath().startsWith("/") && uri.getPath().endsWith("/")))
-                    return "/" + PathUtils.getFirstPathElement(uri.getPath()); // .../serviceName/repoName
-            }
-        }
-        return ""; // repoName
-    }
-
-    /**
-     * Produces CloseableHttpClient
-     *
-     * @param configuration {@link HttpRepositoryConfigurationImpl}
-     *
-     * @return CloseableHttpClient
-     */
-    private CloseableHttpClient getHttpClient(HttpRepositoryConfigurationImpl configuration) {
-        ProxyDescriptor proxyDescriptor = configService.getDescriptor().getProxy(configuration.getProxy());
-        return new HttpClientConfigurator()
-                .hostFromUrl(configuration.getUrl())
-                .connectionTimeout(configuration.getSocketTimeoutMillis())
-                .soTimeout(configuration.getSocketTimeoutMillis())
-                .staleCheckingEnabled(true)
-                .retry(0, false)
-                .localAddress(configuration.getLocalAddress())
-                .proxy(proxyDescriptor)
-                .authentication(
-                        configuration.getUsername(),
-                        CryptoHelper.decryptIfNeeded(configuration.getPassword()),
-                        configuration.isAllowAnyHostAuth())
-                .enableCookieManagement(configuration.isEnableCookieManagement())
-                .getClient();
-    }
-
-    /**
-     * Produces CloseableHttpClient
-     *
-     * @param httpRepoDescriptor {@link HttpRepoDescriptor}
-     *
-     * @return CloseableHttpClient
-     */
-    private CloseableHttpClient getHttpClient(HttpRepoDescriptor httpRepoDescriptor) {
-        return new HttpClientConfigurator()
-                .hostFromUrl(httpRepoDescriptor.getUrl())
-                .connectionTimeout(httpRepoDescriptor.getSocketTimeoutMillis())
-                .soTimeout(httpRepoDescriptor.getSocketTimeoutMillis())
-                .staleCheckingEnabled(true)
-                .retry(0, false)
-                .localAddress(httpRepoDescriptor.getLocalAddress())
-                .proxy(httpRepoDescriptor.getProxy())
-                .authentication(
-                        httpRepoDescriptor.getUsername(),
-                        CryptoHelper.decryptIfNeeded(httpRepoDescriptor.getPassword()),
-                        httpRepoDescriptor.isAllowAnyHostAuth())
-                .enableCookieManagement(httpRepoDescriptor.isEnableCookieManagement())
-                .getClient();
-    }
-
-    /**
-     * Unmarshals VersionRestResult from string response
-     *
-     * @param versionRestResult
-     * @return {@link VersionRestResult}
-     *
-     * @throws IOException if conversion fails
-     */
-    private VersionRestResult parseVersionRestResult(String versionRestResult) throws IOException {
-        return getObjectMapper().readValue(
-                getJsonParser(versionRestResult.getBytes()),
-                new TypeReference<VersionRestResult>() {}
-        );
-    }
-
-    /**
-     * Checks if target repository is Virtual
-     *
-     * @param client
-     * @param repoKey
-     * @param inArtifactoryContext
-     *
-     * @return true if not virtual, otherwise false
-     */
-    private final Boolean isRealRepo(CloseableHttpClient client, URI uri, String repoKey,
-            boolean inArtifactoryContext) {
-
-        assert client != null : "HttpClient cannot be empty";
-
-        CloseableHttpResponse response = null;
-        String requestUrl = produceRepoInfoUrl(uri, repoKey, inArtifactoryContext);
-        HttpGet getMethod = new HttpGet(requestUrl);
-        addOriginatedHeader(getMethod);
-        try {
-            response = client.execute(getMethod);
-            if (response != null ) {
-                if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
-                    HttpRepositoryConfiguration httpRepositoryConfiguration =
-                            JacksonReader.streamAsClass(
-                                    response.getEntity().getContent(),
-                                    HttpRepositoryConfigurationImpl.class
-                            );
-                    if (httpRepositoryConfiguration != null) {
-                        if(httpRepositoryConfiguration.getType().equals("virtual")) {
-                            log.debug("Found virtual repository '{}'", repoKey);
-                            return false;
-                        } else {
-                            log.debug("Found real repository '{}'", repoKey);
-                            return true;
-                        }
-                    } else {
-                        log.debug("Cannot fetch '{}' metadata, no response received", repoKey);
-                    }
-                } else {
-                    log.debug("Cannot fetch '{}' metadata, cause: ", response);
-                }
-            }
-        } catch (IOException | IllegalArgumentException e) {
-            log.debug(
-                    "Checking remote artifactory type has failed: {}.",
-                    e.getMessage()
-            );
-        } finally {
-            IOUtils.closeQuietly(response);
-        }
-        return null;
-    }
-
-    /**
-     * Generates repository info URL
-     *
-     * @param uri default target URI
-     * @param repoKey
-     * @param inArtifactoryContext
-     *
-     * @return url
-     */
-    private String produceRepoInfoUrl(URI uri, String repoKey, boolean inArtifactoryContext) {
-        return new StringBuilder()
-                .append(uri.getScheme())
-                .append("://")
-                .append(uri.getHost())
-                .append(uri.getPort() != -1 ?
-                                ":" + uri.getPort()
-                                :
-                                ""
-                )
-                .append(getServiceName(uri, inArtifactoryContext))
-                .append(ARTIFACTORY_REPOSITORIES_PATH)
-                .append("/")
-                .append(repoKey)
-                .toString();
-    }
-
-    /**
-     * ResearchResponse
-     */
-    @XStreamAlias("researchResponse")
-    public static class ResearchResponse implements Serializable {
-
-        private final boolean isArtifactory;
-        private final VersionInfo versionInfo;
-        private final List<VersionFeature> features;
-
-        /**
-         * Produces response with artifactory=false
-         *
-         * @return {@link ResearchResponse}
-         */
-        private ResearchResponse() {
-            this.isArtifactory = false;
-            this.versionInfo = null;
-            this.features = Lists.newLinkedList();
-        }
-
-        /**
-         * Produces response with metadata describing remote
-         * artifactory instance
-         *
-         * @param isArtifactory
-         * @param versionInfo
-         * @param features
-         *
-         * @return {@link ResearchResponse}
-         */
-        private ResearchResponse(boolean isArtifactory, VersionInfo versionInfo,
-                List<VersionFeature> features) {
-            this.isArtifactory = isArtifactory;
-            this.versionInfo = versionInfo;
-            this.features = features;
-        }
-
-        /**
-         * @return definition of remote host being artifactory or not
-         */
-        public boolean isArtifactory() {
-            return isArtifactory;
-        }
-
-        /**
-         * @return remote artifactory version
-         */
-        public VersionInfo getVersion() {
-            return versionInfo;
-        }
-
-        /**
-         * @return available features for remote artifactory
-         *         (based on its version)
-         */
-        public List<VersionFeature> getFeatures() {
-            return features;
-        }
-
-        /**
-         * Produces response with artifactory=false
-         *
-         * @return {@link ResearchResponse}
-         */
-        public static ResearchResponse notArtifactory () {
-            return new ResearchResponse();
-        }
-
-        /**
-         * Produces response with metadata describing remote
-         * artifactory instance
-         *
-         * @param isArtifactory
-         * @param versionInfo
-         * @param features
-         *
-         * @return {@link ResearchResponse}
-         */
-        public static ResearchResponse artifactoryMeta (boolean isArtifactory, VersionInfo versionInfo,
-                List<VersionFeature> features) {
-            return new ResearchResponse(isArtifactory, versionInfo, features);
-        }
-
-        /**
-         * Produces response without any metadata, but implies artifactory=true
-         *
-         * @return {@link ResearchResponse}
-         */
-        public static ResearchResponse artifactory () {
-            return new ResearchResponse(true, null, Lists.newLinkedList());
-        }
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/RestResponse.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/RestResponse.java
deleted file mode 100644
index 5eb1273..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/RestResponse.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package org.artifactory.rest.common.service;
-
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.core.Response;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public interface RestResponse<T> {
-
-    /**
-     * build rest response instance with status code and entity (if needed)
-     *
-     * @return standard Rest Response instance
-     */
-     Response buildResponse();
-
-    /**
-     * set the status code following to rest request to be send back
-     * with response if not set , default code  = 200
-     *
-     * @param responseCode - status code
-     */
-    ArtifactoryRestResponse responseCode(int responseCode);
-
-    /**
-     * set List of model (i.e. users list and etc) to be send in entity
-     * with rest response
-     *
-     * @param iModelList
-     */
-    ArtifactoryRestResponse iModelList(Collection<T> iModelList);
-
-    /**
-     * set single model (i.e. users  and etc) to be send in entity
-     * with rest response
-     *
-     * @param iModel
-     */
-    ArtifactoryRestResponse iModel(T iModel);
-
-    /**
-     * feedback error msg
-     *
-     * @param error - error msg
-     */
-    ArtifactoryRestResponse error(String error);
-
-    /**
-     * feedback warn msg
-     *
-     * @param warn - warn msg
-     */
-    ArtifactoryRestResponse warn(String warn);
-
-    /**
-     * feedback info msg
-     *
-     * @param info - info msg
-     */
-    ArtifactoryRestResponse info(String info);
-
-    /**
-     * feedback entity
-     *
-     * @param entity
-     */
-    ArtifactoryRestResponse entity(Object entity);
-
-    ArtifactoryRestResponse errors(List<String> errors);
-
-    ArtifactoryRestResponse url(String url);
-
-    /**
-     * return rest servlet response
-     *
-     * @return HttpServletResponse instance for this rest call
-     */
-     HttpServletResponse getServletResponse();
-
-    <T> T getIModel();
-
-    Collection<T> getiModelList();
-
-    Object getEntity();
-
-    int getResponseCode();
-
-    /**
-     * @return whether request has failed
-     */
-    public boolean isFailed();
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/RestService.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/RestService.java
deleted file mode 100644
index e128e73..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/RestService.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.artifactory.rest.common.service;
-
-/**
- * @author Chen Keinan
- */
-public interface RestService<T> {
-
-    /**
-     * Execute service method (i.e:login,create user and etc)
-     *
-     * @param request  - encapsulate all data require for request processing
-     * @param response - encapsulate all data require from response
-     * @return data model to be build in response
-     */
-    void execute(ArtifactoryRestRequest<T> request, RestResponse response);
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/ServiceExecutor.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/ServiceExecutor.java
deleted file mode 100644
index ed5f3fc..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/ServiceExecutor.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.artifactory.rest.common.service;
-
-import javax.ws.rs.core.Response;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-/**
- * @author Chen Keinan
- */
- at Component("serviceUiExecutor")
-public class ServiceExecutor {
-    private static final Logger log = LoggerFactory.getLogger(ServiceExecutor.class);
-
-    public Response process(ArtifactoryRestRequest restReq, RestResponse restRes, RestService serviceAction) {
-        log.trace("calling rest service :" + serviceAction.getClass().getSimpleName());
-        // execute service method
-        serviceAction.execute(restReq,restRes);
-        // build response
-        Response response = restRes.buildResponse();
-        return response;
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/StreamResponse.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/StreamResponse.java
deleted file mode 100644
index 9a1ce43..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/StreamResponse.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.artifactory.rest.common.service;
-
-/**
- * @author Chen Keinan
- */
-public interface StreamResponse {
-
-    public void setDownloadFile(String fileName);
-
-    public String getFileName();
-
-    public void setDownload(boolean isDownload);
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/StreamRestResponse.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/StreamRestResponse.java
deleted file mode 100644
index 23ab755..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/StreamRestResponse.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.artifactory.rest.common.service;
-
-import java.io.File;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.StreamingOutput;
-
-import org.artifactory.rest.common.model.FileData;
-import org.artifactory.rest.common.model.FileModel;
-import org.artifactory.rest.common.util.ResponseHandler;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component("streamingRestResponse")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class StreamRestResponse extends ArtifactoryRestResponse implements StreamResponse {
-
-    private String fileName;
-    private boolean isDownload;
-    private File file;
-    private boolean fileEntity;
-
-    @Override
-    public Response buildResponse() {
-        if (super.getIModel() != null && super.getIModel() instanceof FileModel) {
-            fileEntity = true;
-            return ResponseHandler.buildFileResponse(this, isDownload);
-        } else if (super.getIModel() != null && super.getIModel() instanceof StreamingOutput) {
-            fileEntity = false;
-            return ResponseHandler.buildFileResponse(this, isDownload);
-        } else {
-            fileEntity = false;
-            return super.buildResponse();
-        }
-
-    }
-
-    @Override
-    public void setDownloadFile(String fileName) {
-        this.fileName = fileName;
-    }
-
-    @Override
-    public String getFileName() {
-        return fileName;
-    }
-
-    @Override
-    public void setDownload(boolean isDownload) {
-        this.isDownload = isDownload;
-    }
-
-    public File getFile() {
-        return file;
-    }
-
-    public void setFile(File file) {
-        this.file = file;
-    }
-
-    @Override
-    public Object getEntity() {
-        if (fileEntity) {
-            return ((FileModel) getIModel()).getFileResource();
-        } else if (getIModel() instanceof FileData) {
-            return file;
-        } else {
-            return super.getEntity();
-        }
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/advance/GetStorageSummaryService.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/advance/GetStorageSummaryService.java
deleted file mode 100644
index 5f0bfaa..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/advance/GetStorageSummaryService.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.artifactory.rest.common.service.admin.advance;
-
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.storage.StorageService;
-import org.artifactory.storage.StorageSummaryInfo;
-import org.artifactory.rest.common.model.storagesummary.StorageSummaryModel;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetStorageSummaryService implements RestService {
-
-    @Autowired
-    private StorageService storageService;
-
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        StorageSummaryInfo storageSummaryInfo = storageService.getStorageSummaryInfo();
-        StorageSummaryModel storageSummaryModel = new StorageSummaryModel(storageSummaryInfo);
-        response.iModel(storageSummaryModel);
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/reverseProxies/CheckReverseProxyPortAvailabilityService.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/reverseProxies/CheckReverseProxyPortAvailabilityService.java
deleted file mode 100644
index 87e829b..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/reverseProxies/CheckReverseProxyPortAvailabilityService.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.artifactory.rest.common.service.admin.reverseProxies;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.repo.ReverseProxyDescriptor;
-import org.artifactory.descriptor.repo.ReverseProxyRepoConfig;
-import org.artifactory.rest.common.model.proxies.ProxiesModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * @author Chen  Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CheckReverseProxyPortAvailabilityService implements RestService {
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        int portToCheck = Integer.parseInt(request.getPathParamByKey("port"));
-        String repoKey = request.getQueryParamByKey("repoKey");
-
-        boolean isPortInUse = false;
-        MutableCentralConfigDescriptor mutableDescriptor = ContextHelper.get().getCentralConfig().getMutableDescriptor();
-        ReverseProxyDescriptor reverseProxyDescriptor = mutableDescriptor.getCurrentReverseProxy();
-        if (reverseProxyDescriptor != null) {
-            List<ReverseProxyRepoConfig> reverseProxyRepoConfigs = reverseProxyDescriptor.getReverseProxyRepoConfigs();
-            for (ReverseProxyRepoConfig reverseProxyRepoConfig : reverseProxyRepoConfigs) {
-                if (reverseProxyRepoConfig != null && (reverseProxyRepoConfig.getPort() == portToCheck)) {
-                    if (!reverseProxyRepoConfig.getRepoRef().getKey().equals(repoKey)) {
-                        isPortInUse = true;
-                        break;
-                    }
-                }
-            }
-        }
-        ProxiesModel proxiesModel = new ProxiesModel();
-        proxiesModel.setPortAvailable(!isPortInUse);
-        response.iModel(proxiesModel);
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/reverseProxies/CreateReverseProxyService.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/reverseProxies/CreateReverseProxyService.java
deleted file mode 100644
index c0242d0..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/reverseProxies/CreateReverseProxyService.java
+++ /dev/null
@@ -1,156 +0,0 @@
-package org.artifactory.rest.common.service.admin.reverseProxies;
-
-import com.google.common.collect.Sets;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.repo.*;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.rest.common.model.reverseproxy.ReverseProxyDescriptorModel;
-import org.artifactory.rest.common.model.reverseproxy.ReverseProxyRepoConfigs;
-import org.artifactory.rest.common.model.reverseproxy.ReverseProxyRepositories;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Shay Yaakov
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CreateReverseProxyService implements RestService {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("CreateReverseProxy");
-        ReverseProxyDescriptorModel descriptor = (ReverseProxyDescriptorModel) request.getImodel();
-        ReverseProxyDescriptor reverseProxyDescriptor = modelToDescriptor(descriptor);
-        if (reverseProxyDescriptor == null){
-            return;
-        }
-        addNewReverseProxy(reverseProxyDescriptor);
-        updateResponse(response, reverseProxyDescriptor);
-    }
-
-    /**
-     * add new reverse proxy descriptor
-     * @param descriptor - new reverse proxy descriptor to add
-     */
-    private void addNewReverseProxy(ReverseProxyDescriptor descriptor) {
-        MutableCentralConfigDescriptor configDescriptor = centralConfigService.getMutableDescriptor();
-        configDescriptor.updateReverseProxy(descriptor);
-        centralConfigService.saveEditedDescriptorAndReload(configDescriptor);
-    }
-
-
-    /**
-     * update response
-     * @param artifactoryResponse - reverse proxy response
-     * @param descriptor - descriptor
-     */
-    private void updateResponse(RestResponse artifactoryResponse, ReverseProxyDescriptor descriptor) {
-        artifactoryResponse.info("Successfully update reverse proxy '" + descriptor.getKey() + "'");
-        artifactoryResponse.responseCode(HttpServletResponse.SC_CREATED);
-    }
-
-    /**
-     * map reverse proxy model to descriptor
-     * @param reverseProxyDescriptorModel - reverse proxy model
-     * @return reverse proxy descriptor
-     */
-    private ReverseProxyDescriptor modelToDescriptor(ReverseProxyDescriptorModel reverseProxyDescriptorModel){
-        MutableCentralConfigDescriptor configDescriptor = centralConfigService.getMutableDescriptor();
-        ReverseProxyDescriptor reverseProxy = configDescriptor.getCurrentReverseProxy();
-        if (reverseProxy == null) {
-            reverseProxy = new ReverseProxyDescriptor();
-            reverseProxy.setKey(reverseProxyDescriptorModel.getKey());
-        }
-        else {
-            if (!(reverseProxy.getKey().equals(WebServerType.NGINX.toString()) || reverseProxy.getKey().equals(WebServerType.APACHE.toString()))) {
-                return null;
-            }
-
-        }
-        List<ReverseProxyRepoConfig> reverseProxyRepos = new ArrayList<>();
-        ReverseProxyRepositories reverseProxyRepositories = reverseProxyDescriptorModel.getReverseProxyRepositories();
-        if (reverseProxyRepositories != null) {
-            List<ReverseProxyRepoConfigs> reverseProxyRepoConfigs = reverseProxyRepositories.getReverseProxyRepoConfigs();
-            updateRepoReverseProxies(reverseProxyRepoConfigs, reverseProxyRepos);
-        }
-        reverseProxy.setKey(reverseProxyDescriptorModel.getKey());
-        reverseProxy.setArtifactoryPort(reverseProxyDescriptorModel.getArtifactoryPort());
-        reverseProxy.setArtifactoryServerName(reverseProxyDescriptorModel.getArtifactoryServerName());
-        reverseProxy.setDockerReverseProxyMethod(reverseProxyDescriptorModel.getDockerReverseProxyMethod());
-        reverseProxy.setArtifactoryAppContext(reverseProxyDescriptorModel.getArtifactoryAppContext());
-        reverseProxy.setHttpPort(reverseProxyDescriptorModel.getHttpPort());
-        reverseProxy.setSslPort(reverseProxyDescriptorModel.getSslPort());
-        reverseProxy.setPublicAppContext(reverseProxyDescriptorModel.getPublicAppContext());
-        reverseProxy.setServerNameExpression(reverseProxyDescriptorModel.getServerNameExpression());
-        reverseProxy.setUpStreamName(reverseProxyDescriptorModel.getUpStreamName());
-        reverseProxy.setUseHttp(reverseProxyDescriptorModel.isUseHttp());
-        reverseProxy.setUseHttps(reverseProxyDescriptorModel.isUseHttps());
-        reverseProxy.setWebServerType(reverseProxyDescriptorModel.getWebServerType());
-        reverseProxy.setSslKey(reverseProxyDescriptorModel.getSslKey());
-        reverseProxy.setSslCertificate(reverseProxyDescriptorModel.getSslCertificate());
-        reverseProxy.setServerName(reverseProxyDescriptorModel.getServerName());
-        if (!reverseProxyRepos.isEmpty()){
-            reverseProxy.setReverseProxyRepoConfigs(reverseProxyRepos);
-        }
-        return reverseProxy;
-    }
-
-    /**
-     * update repo reverse proxy
-     * @param reverseProxyRepoConfigs - reverse proxy reppo config
-     * @param reverseProxyRepos  - reverse proxy repo
-     */
-    private void updateRepoReverseProxies(List<ReverseProxyRepoConfigs> reverseProxyRepoConfigs, List<ReverseProxyRepoConfig> reverseProxyRepos) {
-        reverseProxyRepoConfigs.forEach(reverseProxyRepo -> {
-            ReverseProxyRepoConfig proxyRepoConfig = new ReverseProxyRepoConfig();
-            getAllRepos().forEach(repoDescriptor -> {
-                if (repoDescriptor.getKey().equals(reverseProxyRepo.getRepoRef())) {
-                    proxyRepoConfig.setRepoRef(repoDescriptor);
-                    proxyRepoConfig.setPort(reverseProxyRepo.getPort());
-                    proxyRepoConfig.setServerName(reverseProxyRepo.getServerName());
-                    reverseProxyRepos.add(proxyRepoConfig);
-                }
-            });
-        });
-    }
-
-    /**
-     * get all local , remote and virtual repositories
-     * @return set of repositories
-     */
-    private Set<RepoBaseDescriptor> getAllRepos() {
-        RepositoryService repositoryService = ContextHelper.get().getRepositoryService();
-        Set<RepoBaseDescriptor> baseDescriptors = Sets.newTreeSet();
-        List<LocalRepoDescriptor> localDescriptors = repositoryService.getLocalAndCachedRepoDescriptors();
-        baseDescriptors.addAll(localDescriptors);
-        // add remote repo
-        List<RemoteRepoDescriptor> remoteDescriptors = repositoryService.getRemoteRepoDescriptors();
-        baseDescriptors.addAll(remoteDescriptors);
-        // add virtual repo
-        List<VirtualRepoDescriptor> virtualDescriptors = repositoryService.getVirtualRepoDescriptors();
-        baseDescriptors.addAll(virtualDescriptors);
-        // distribution repos
-        List<DistributionRepoDescriptor> distributionDescriptors = repositoryService.getDistributionRepoDescriptors();
-        baseDescriptors.addAll(distributionDescriptors);
-
-        return baseDescriptors;
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/reverseProxies/DockerProxyTemplateInfo.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/reverseProxies/DockerProxyTemplateInfo.java
deleted file mode 100644
index 711f06c..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/reverseProxies/DockerProxyTemplateInfo.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.rest.common.service.admin.reverseProxies;
-
-/**
- * @author Shay Yaakov
- */
-public class DockerProxyTemplateInfo {
-
-    private String template;
-
-    public DockerProxyTemplateInfo(String template) {
-        this.template = template;
-    }
-
-    public String getTemplate() {
-        return template;
-    }
-
-    public void setTemplate(String template) {
-        this.template = template;
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/reverseProxies/GetReverseProxiesService.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/reverseProxies/GetReverseProxiesService.java
deleted file mode 100644
index 00e5714..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/reverseProxies/GetReverseProxiesService.java
+++ /dev/null
@@ -1,152 +0,0 @@
-package org.artifactory.rest.common.service.admin.reverseProxies;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.repo.ReverseProxyDescriptor;
-import org.artifactory.descriptor.repo.ReverseProxyRepoConfig;
-import org.artifactory.descriptor.repo.WebServerType;
-import org.artifactory.rest.common.model.reverseproxy.ReverseProxyDescriptorModel;
-import org.artifactory.rest.common.model.reverseproxy.ReverseProxyRepoConfigs;
-import org.artifactory.rest.common.model.reverseproxy.ReverseProxyRepositories;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Shay Yaakov
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetReverseProxiesService implements RestService {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("GetReverseProxies");
-        fetchSingleOrMultiReverseProxy(response, request);
-    }
-
-    private void fetchSingleOrMultiReverseProxy(RestResponse artifactoryResponse,
-            ArtifactoryRestRequest artifactoryRequest) {
-        String proxyKey = artifactoryRequest.getPathParamByKey("id");
-        if (StringUtils.isEmpty(proxyKey)) {
-            proxyKey = "dummy";
-        }
-        if (StringUtils.isEmpty(proxyKey)) {
-            buildBadRequestResponse(artifactoryResponse);
-            return;
-        }
-        if (!(proxyKey.equals(WebServerType.NGINX.toString()) ||
-                proxyKey.equals(WebServerType.APACHE.toString()) || proxyKey.equals("dummy"))) {
-            artifactoryResponse.responseCode(HttpServletResponse.SC_NOT_FOUND);
-            artifactoryResponse.error("Reverse proxy id is missing");
-            return;
-        }
-        if (isMultiProxy(proxyKey)) {
-            updateResponseWithMultiProxyInfo(artifactoryResponse);
-        } else {
-            updateResponseWithSingleProxyInfo(artifactoryResponse, proxyKey);
-        }
-    }
-
-    /**
-     * build bad request response
-     *
-     * @param artifactoryResponse - artifactory response
-     */
-    private void buildBadRequestResponse(RestResponse artifactoryResponse) {
-        artifactoryResponse.responseCode(HttpServletResponse.SC_BAD_REQUEST);
-        artifactoryResponse.error("Reverse proxy id is missing");
-    }
-
-    /**
-     * build response with multi proxy info
-     *
-     * @param artifactoryResponse
-     */
-    private void updateResponseWithMultiProxyInfo(RestResponse artifactoryResponse) {
-        List<ReverseProxyDescriptor> reverseProxies = centralConfigService.getMutableDescriptor().getReverseProxies();
-        artifactoryResponse.iModelList(reverseProxies);
-    }
-
-    /**
-     * update response with single proxy response
-     *
-     * @param artifactoryResponse - artifactory response
-     * @param proxyKey
-     */
-    private void updateResponseWithSingleProxyInfo(RestResponse artifactoryResponse, String proxyKey) {
-        ReverseProxyDescriptor reverseProxy = centralConfigService.getMutableDescriptor().getCurrentReverseProxy();
-        if (reverseProxy != null) {
-            if (!((reverseProxy.getKey().equals(proxyKey)) || (proxyKey.equals("dummy")))) {
-                artifactoryResponse.responseCode(HttpServletResponse.SC_NOT_FOUND);
-                artifactoryResponse.error("Reverse proxy with id:" + proxyKey + " not found");
-                return;
-            }
-        }
-        ReverseProxyDescriptorModel reverseProxyDescriptorModel = descriptorToModel(reverseProxy);
-        artifactoryResponse.iModel(reverseProxyDescriptorModel);
-    }
-
-    /**
-     * check if multi proxy
-     *
-     * @param proxyKey - proxy key
-     * @return if true - return multi proxy
-     */
-    private boolean isMultiProxy(String proxyKey) {
-        return proxyKey == null || proxyKey.length() == 0;
-    }
-
-
-    /**
-     * convert descriptor to ui model
-     * @param descriptor - reverse proxy descriptor
-     * @return - reverse proxy model
-     */
-    private ReverseProxyDescriptorModel descriptorToModel(ReverseProxyDescriptor descriptor){
-        if (descriptor == null){
-            return new ReverseProxyDescriptorModel();
-        }
-
-        List<ReverseProxyRepoConfig> reverseProxyRepoConfigs = descriptor.getReverseProxyRepoConfigs();
-        ReverseProxyRepositories reverseProxyRepositories = new ReverseProxyRepositories();
-         final List<ReverseProxyRepoConfigs> finalReverseProxyRepositoriesList = new ArrayList<>();
-        reverseProxyRepoConfigs.forEach(reverseProxyRepoConfig -> {
-            finalReverseProxyRepositoriesList.add(new ReverseProxyRepoConfigs(reverseProxyRepoConfig));
-         });
-        ReverseProxyDescriptorModel reverseProxyDescriptorModel = new ReverseProxyDescriptorModel();
-        reverseProxyDescriptorModel.setKey(descriptor.getKey());
-        reverseProxyDescriptorModel.setArtifactoryPort(descriptor.getArtifactoryPort());
-        reverseProxyDescriptorModel.setArtifactoryServerName(descriptor.getArtifactoryServerName());
-        reverseProxyDescriptorModel.setDockerReverseProxyMethod(descriptor.getDockerReverseProxyMethod());
-        reverseProxyDescriptorModel.setArtifactoryAppContext(descriptor.getArtifactoryAppContext());
-        reverseProxyDescriptorModel.setHttpPort(descriptor.getHttpPort());
-        reverseProxyDescriptorModel.setSslPort(descriptor.getSslPort());
-        reverseProxyDescriptorModel.setPublicAppContext(descriptor.getPublicAppContext());
-        reverseProxyDescriptorModel.setServerNameExpression(descriptor.getServerNameExpression());
-        reverseProxyDescriptorModel.setUpStreamName(descriptor.getUpStreamName());
-        reverseProxyDescriptorModel.setUseHttp(descriptor.isUseHttp());
-        reverseProxyDescriptorModel.setUseHttps(descriptor.isUseHttps());
-        reverseProxyDescriptorModel.setWebServerType(descriptor.getWebServerType());
-        reverseProxyDescriptorModel.setSslKey(descriptor.getSslKey());
-        reverseProxyDescriptorModel.setSslCertificate(descriptor.getSslCertificate());
-        reverseProxyDescriptorModel.setServerName(descriptor.getServerName());
-        if (!finalReverseProxyRepositoriesList.isEmpty()){
-            reverseProxyRepositories.setReverseProxyRepoConfigs(finalReverseProxyRepositoriesList);
-            reverseProxyDescriptorModel.setReverseProxyRepositories(reverseProxyRepositories);
-        }
-        return reverseProxyDescriptorModel;
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/reverseProxies/ReverseProxySnippetService.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/reverseProxies/ReverseProxySnippetService.java
deleted file mode 100644
index d81933a..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/reverseProxies/ReverseProxySnippetService.java
+++ /dev/null
@@ -1,168 +0,0 @@
-package org.artifactory.rest.common.service.admin.reverseProxies;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.ReverseProxyDescriptor;
-import org.artifactory.descriptor.repo.ReverseProxyMethod;
-import org.artifactory.descriptor.repo.WebServerType;
-import org.artifactory.repo.reverseProxy.ApacheTemplateProvider;
-import org.artifactory.repo.reverseProxy.NginxTemplateProvider;
-import org.artifactory.repo.reverseProxy.ReverseProxyTemplateProvider;
-import org.artifactory.rest.common.model.reverseproxy.CommonFile;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.service.StreamRestResponse;
-import org.artifactory.rest.common.util.AolUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.List;
-
-/**
- * @author Shay Yaakov
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ReverseProxySnippetService implements RestService {
-
-    ReverseProxyTemplateProvider templateProvider;
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("ReverseProxySnippet");
-        if (authorizationService.isAnonymous()) {
-            response.responseCode(HttpServletResponse.SC_UNAUTHORIZED);
-            return;
-        }
-        String reverseProxyKey = request.getPathParamByKey("id");
-        if (StringUtils.isEmpty(reverseProxyKey)) {
-            response.responseCode(HttpServletResponse.SC_NOT_FOUND);
-            response.error("Reverse proxy id is missing");
-        }
-
-        ReverseProxyDescriptor currentReverseProxy = centralConfigService.getDescriptor().getCurrentReverseProxy();
-        if (currentReverseProxy != null) {
-            if (!((currentReverseProxy.getKey().equals(reverseProxyKey)) || (reverseProxyKey.equals("dummy")))) {
-                response.responseCode(HttpServletResponse.SC_NOT_FOUND);
-                response.error("Reverse proxy with id:" + reverseProxyKey + " not found");
-                return;
-            }
-        }
-        boolean isDownload = Boolean.valueOf(request.getQueryParamByKey("download"));
-        // get reverse proxy config descriptor
-        CentralConfigService centralConfig = ContextHelper.get().getCentralConfig();
-        ReverseProxyDescriptor reverseProxy = centralConfig.getMutableDescriptor().getCurrentReverseProxy();
-        if (reverseProxy == null) {
-            response.error("No such reverse proxy config '" + reverseProxyKey + "'");
-        } else {
-            List<String> repoKeys = Lists.newArrayList();
-            StringBuilder reverseProxySnippetbuilder = new StringBuilder();
-            ReverseProxyMethod dockerReverseProxyMethod = reverseProxy.getDockerReverseProxyMethod();
-            setReverseProxyTemplateProvider(reverseProxy);
-            String dockerConfig = templateProvider.provideDockerReverseProxyServerSnippet(repoKeys);
-            // update general data
-            updateGeneralData(reverseProxySnippetbuilder, dockerReverseProxyMethod, reverseProxyKey, repoKeys);
-            // update docker data
-            updateDockerData(reverseProxySnippetbuilder, dockerReverseProxyMethod, dockerConfig);
-            // update response with snippet
-            updateResponseWithSnippet(request, response, reverseProxySnippetbuilder, isDownload);
-        }
-    }
-
-    /**
-     * return template provider based on reverse proxy type
-     *
-     * @param reverseProxy - reverse proxy
-     */
-    private void setReverseProxyTemplateProvider(ReverseProxyDescriptor reverseProxy) {
-        if (reverseProxy.getKey().equals(WebServerType.NGINX.toString())) {
-            templateProvider = ContextHelper.get().beanForType(NginxTemplateProvider.class);
-        } else {
-            templateProvider = ContextHelper.get().beanForType(ApacheTemplateProvider.class);
-        }
-    }
-
-    /**
-     * update response with generated reverse proxy snippet
-     * @param request - encapsulate data related to request
-     * @param response - encapsulate data related to response
-     * @param reverseProxySnippetbuilder - reverse proxy string builder
-     */
-    private void updateResponseWithSnippet(ArtifactoryRestRequest request, RestResponse response,
-                                           StringBuilder reverseProxySnippetbuilder,boolean isDownload) {
-        boolean uiPath = request.getUriInfo().getPath().indexOf("/ui/") != -1;
-        if (request.isUiRestCall() || uiPath || isDownload ) {
-            if (isDownload){
-                ((StreamRestResponse) response).setDownloadFile("artifactory.conf");
-                ((StreamRestResponse) response).setDownload(true);
-                CommonFile commonFile = new CommonFile(reverseProxySnippetbuilder.toString());
-                (response).iModel(commonFile);
-            }else {
-                response.iModel(new DockerProxyTemplateInfo(reverseProxySnippetbuilder.toString()));
-            }
-        } else {
-            response.iModel(reverseProxySnippetbuilder.toString());
-        }
-    }
-
-    /**
-     * update docker reverse proxy snippet
-     * @param reverseProxySnippetbuilder - reverse proxy snippet builder
-     * @param dockerReverseProxyMethod - docker reverse proxy method (port / sub domain)
-     */
-    private void updateDockerData(StringBuilder reverseProxySnippetbuilder, ReverseProxyMethod dockerReverseProxyMethod, String dockerConfig) {
-        if (addDockerRelatedSnippet(dockerConfig, dockerReverseProxyMethod)) {
-            reverseProxySnippetbuilder.append("\n");
-            reverseProxySnippetbuilder.append(dockerConfig);
-        }
-    }
-
-    /**
-     * update reverse proxy general data
-     * @param reverseProxySnippetbuilder - reverse proxy snippet builder
-     * @param dockerReverseProxyMethod - docker reverse proxy method (port / sub domain)
-     */
-    private void updateGeneralData(StringBuilder reverseProxySnippetbuilder, ReverseProxyMethod dockerReverseProxyMethod
-            , String reverseProxyKey, List<String> repoKeys) {
-        String generalConfig = templateProvider.provideGeneralServerConfigServer(repoKeys);
-        if (generateGeneralReverseProxySnippet(dockerReverseProxyMethod)) {
-            reverseProxySnippetbuilder.append(generalConfig);
-        }
-    }
-
-    /**
-     * add docker related snippet
-     *
-     * @param dockerConfig             - docker snippet setting
-     * @param dockerReverseProxyMethod - docker reverse proxy method
-     * @return - if true - add docker snippet
-     */
-    private boolean addDockerRelatedSnippet(String dockerConfig, ReverseProxyMethod dockerReverseProxyMethod) {
-        return !StringUtils.isBlank(dockerConfig) && !dockerReverseProxyMethod.toString().equals("subDomain") &&
-                !dockerReverseProxyMethod.toString().equals("noValue");
-    }
-
-    /**
-     * generate general reverse proxy snippet
-     *
-     * @param dockerReverseProxyMethod - docker reverse proxy method
-     * @return if true - generate general reverse proxy snippet
-     */
-    private boolean generateGeneralReverseProxySnippet(ReverseProxyMethod dockerReverseProxyMethod) {
-        return (dockerReverseProxyMethod != null);
-    }
-}
\ No newline at end of file
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/reverseProxies/UpdateReverseProxyService.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/reverseProxies/UpdateReverseProxyService.java
deleted file mode 100644
index 7ce690a..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/reverseProxies/UpdateReverseProxyService.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.artifactory.rest.common.service.admin.reverseProxies;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.repo.ReverseProxyDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Shay Yaakov
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateReverseProxyService implements RestService {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("UpdateReverseProxy");
-        String proxyKey = request.getPathParamByKey("id");
-        ReverseProxyDescriptor descriptor = (ReverseProxyDescriptor) request.getImodel();
-        updateReverseProxy(descriptor, proxyKey);
-        response.info("Successfully updated reverse proxy '" + proxyKey + "'");
-    }
-
-    /**
-     * update reverse proxy descriptor˜
-     *
-     * @param newReverseProxy - new reverse proxy
-     * @param proxyKey        - reverse proxy key
-     */
-    private void updateReverseProxy(ReverseProxyDescriptor newReverseProxy, String proxyKey) {
-        MutableCentralConfigDescriptor configDescriptor = centralConfigService.getMutableDescriptor();
-        ReverseProxyDescriptor currentReverseProxy = configDescriptor.getReverseProxy(proxyKey);
-        if (currentReverseProxy != null) {
-            populateReverseProxyData(currentReverseProxy, newReverseProxy);
-            centralConfigService.saveEditedDescriptorAndReload(configDescriptor);
-        }
-    }
-
-    /**
-     * map data from new reverse proxy to current reverse proxy
-     * @param currentReverseProxy - current reverse proxy descriptor
-     * @param newReverseProxy - new reverse proxy
-     */
-    private void populateReverseProxyData(ReverseProxyDescriptor currentReverseProxy, ReverseProxyDescriptor newReverseProxy) {
-        currentReverseProxy.setWebServerType(newReverseProxy.getWebServerType());
-        currentReverseProxy.setArtifactoryAppContext(newReverseProxy.getArtifactoryAppContext());
-        currentReverseProxy.setPublicAppContext(newReverseProxy.getPublicAppContext());
-        currentReverseProxy.setServerName(newReverseProxy.getServerName());
-        currentReverseProxy.setServerNameExpression(newReverseProxy.getServerNameExpression());
-        currentReverseProxy.setDockerReverseProxyMethod(newReverseProxy.getDockerReverseProxyMethod());
-        currentReverseProxy.setSslCertificate(newReverseProxy.getSslCertificate());
-        currentReverseProxy.setSslKey(newReverseProxy.getSslKey());
-        currentReverseProxy.setUseHttps(newReverseProxy.isUseHttps());
-        currentReverseProxy.setSslPort(newReverseProxy.getSslPort());
-        currentReverseProxy.setArtifactoryServerName(newReverseProxy.getArtifactoryServerName());
-        currentReverseProxy.setArtifactoryPort(newReverseProxy.getArtifactoryPort());
-        currentReverseProxy.setHttpPort(newReverseProxy.getHttpPort());
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/userprofile/CreateApiKeyService.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/userprofile/CreateApiKeyService.java
deleted file mode 100644
index 8c00223..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/userprofile/CreateApiKeyService.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package org.artifactory.rest.common.service.admin.userprofile;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.model.userprofile.UserProfileModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.props.auth.ApiKeyManager;
-import org.artifactory.security.props.auth.model.TokenKeyValue;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CreateApiKeyService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(CreateApiKeyService.class);
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Autowired
-    ApiKeyManager apiKeyManager;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-
-        if (authorizationService.isAnonymous()) {
-            response.responseCode(HttpServletResponse.SC_FORBIDDEN);
-            return;
-        }
-        String userName = authorizationService.currentUsername();
-        TokenKeyValue token = apiKeyManager.getToken(userName);
-        if (token != null) {
-            log.error("Api key already exists for user: '{}'", userName);
-            response.error("Api key already exists for user: " + userName);
-            return;
-        }
-        token = apiKeyManager.createToken(userName);
-        if (token == null) {
-            log.error("Error while generating api key for user '{}'", userName);
-            response.error("Failed to create api key for user: " + userName);
-            return;
-        }
-        log.debug("User '{}' successfully created api key", userName);
-        response.responseCode(HttpServletResponse.SC_CREATED);
-        if (token != null) {
-            UserProfileModel userProfileModel = new UserProfileModel(token.getToken());
-            response.iModel(userProfileModel);
-
-        }
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/userprofile/GetApiKeyService.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/userprofile/GetApiKeyService.java
deleted file mode 100644
index 36e2c23..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/userprofile/GetApiKeyService.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.artifactory.rest.common.service.admin.userprofile;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.model.userprofile.UserProfileModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.props.auth.ApiKeyManager;
-import org.artifactory.security.props.auth.model.TokenKeyValue;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetApiKeyService implements RestService {
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Autowired
-    ApiKeyManager apiKeyManager;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-
-        if (authorizationService.isAnonymous()) {
-            return;
-        }
-        String userName;
-        String id = request.getPathParamByKey("id");
-        if (!StringUtils.isEmpty(id) && authorizationService.isAdmin()) {
-            userName = id;
-        } else {
-            userName = authorizationService.currentUsername();
-        }
-        TokenKeyValue token = apiKeyManager.getToken(userName);
-        UserProfileModel userProfileModel;
-        if (token != null) {
-            userProfileModel = new UserProfileModel(token.getToken());
-        } else {
-            userProfileModel = new UserProfileModel();
-        }
-        response.iModel(userProfileModel);
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/userprofile/GetUsersAndApiKeys.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/userprofile/GetUsersAndApiKeys.java
deleted file mode 100644
index 20fc567..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/userprofile/GetUsersAndApiKeys.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.rest.common.service.admin.userprofile;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.rest.common.model.userprofile.UserProfileModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.UserInfo;
-import org.artifactory.security.props.auth.ApiKeyManager;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetUsersAndApiKeys implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(GetUsersAndApiKeys.class);
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Autowired
-    UserGroupService userGroupService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        List<UserProfileModel> userProfileModels = new ArrayList<>();
-        if (authorizationService.isAdmin()) {
-            List<UserInfo> allUsers = userGroupService.getAllUsers(true);
-            allUsers.forEach(userInfo -> {
-                String username = userInfo.getUsername();
-                userInfo.getUserProperties().forEach(userPropertyInfo -> {
-                    if (userPropertyInfo.getPropKey().equals(ApiKeyManager.API_KEY)) {
-                        userProfileModels.add(new UserProfileModel(userPropertyInfo.getPropValue(), username));
-                    }
-                });
-            });
-        }
-        response.iModelList(userProfileModels);
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/userprofile/RevokeApiKeyService.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/userprofile/RevokeApiKeyService.java
deleted file mode 100644
index 1d28026..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/userprofile/RevokeApiKeyService.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package org.artifactory.rest.common.service.admin.userprofile;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.service.*;
-import org.artifactory.security.props.auth.ApiKeyManager;
-import org.artifactory.security.props.auth.DockerTokenManager;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class RevokeApiKeyService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(RevokeApiKeyService.class);
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Autowired
-    ApiKeyManager apiKeyManager;
-
-    @Autowired
-    DockerTokenManager dockerTokenManager;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        if (authorizationService.isAnonymous()) {
-            return;
-        }
-        String userName = request.getPathParamByKey("id");
-        boolean deleteAll = request.getQueryParamByKey("deleteAll").equals("1") ? true : false;
-        String authUserName = authorizationService.currentUsername();
-        if (StringUtils.isEmpty(userName) && !deleteAll) {
-            userName = authUserName;
-        }
-        boolean isAdmin = authorizationService.isAdmin();
-        if (((!StringUtils.isEmpty(userName) && isAdmin) || (userName.equals(authUserName)) && !deleteAll)) {
-            // revoke apiKey
-            revokeApiKey(response, userName);
-        } else {
-            if (StringUtils.isEmpty(userName) && isAdmin && deleteAll) {
-                // revoke all api keys
-                revokeAllApiKeys(response);
-            } else {
-                response.responseCode(HttpServletResponse.SC_FORBIDDEN);
-            }
-        }
-    }
-
-    /**
-     * revoke all api keys
-     *
-     * @param response - encapsulate data related tto response
-     */
-    private void revokeAllApiKeys(RestResponse response) {
-        boolean revokeSucceeded = apiKeyManager.revokeAllTokens();
-        if (revokeSucceeded) {
-            dockerTokenManager.revokeAllTokens();
-            response.info("All api keys have been successfully revoked");
-            log.debug("All api keys have been successfully revoked by: '{}'", authorizationService.currentUsername());
-        } else {
-            log.error("Error revoking all api keys");
-            response.error("Error revoking all api keys");
-        }
-    }
-
-    /**
-     * revoke api key for specific user
-     *
-     * @param response - artifactory rest response
-     * @param userName - user name to revoke api
-     */
-    private void revokeApiKey(RestResponse response, String userName) {
-        if (apiKeyManager.revokeToken(userName)) {
-            dockerTokenManager.revokeToken(userName);
-            response.info("Api key for user: '" + userName + "' has been successfully revoked");
-            log.debug("Api key for user: '" + userName + "' has been successfully revoked by user : '{}'", authorizationService.currentUsername());
-        } else {
-            log.error("Error revoking api key for user '{}'", userName);
-            response.error("Error revoking api key for user: " + userName);
-        }
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/userprofile/SyncUsersAndApiKeys.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/userprofile/SyncUsersAndApiKeys.java
deleted file mode 100644
index da8bc9f..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/userprofile/SyncUsersAndApiKeys.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.artifactory.rest.common.service.admin.userprofile;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.model.userprofile.UserProfileModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.props.auth.ApiKeyManager;
-import org.artifactory.security.props.auth.model.TokenKeyValue;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class SyncUsersAndApiKeys implements RestService {
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Autowired
-    ApiKeyManager apiKeyManager;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        if (authorizationService.isAdmin()) {
-            List<UserProfileModel> userProfileModels = request.getModels();
-            StringBuilder syncErrorBuilder = new StringBuilder();
-            userProfileModels.forEach(userProfileModel -> {
-                TokenKeyValue updatedToken = apiKeyManager.updateToken(userProfileModel.getUserName(), userProfileModel.getApiKey());
-                if (updatedToken == null) {
-                    syncErrorBuilder.append("Error while syncing api key for user: ")
-                            .append(userProfileModel.getUserName()).append("\n");
-                }
-            });
-            if (StringUtils.isEmpty(syncErrorBuilder.toString())) {
-                response.error(syncErrorBuilder.toString());
-            }
-        }
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/userprofile/UpdateApiKeyService.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/userprofile/UpdateApiKeyService.java
deleted file mode 100644
index 11c3f2a..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/admin/userprofile/UpdateApiKeyService.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.artifactory.rest.common.service.admin.userprofile;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.model.userprofile.UserProfileModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.props.auth.ApiKeyManager;
-import org.artifactory.security.props.auth.model.TokenKeyValue;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateApiKeyService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(UpdateApiKeyService.class);
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Autowired
-    ApiKeyManager apiKeyManager;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        if (authorizationService.isAnonymous()) {
-            return;
-        }
-        String userName = authorizationService.currentUsername();
-        updateApiKeys(userName, response);
-    }
-
-    /**
-     * revoke all api keys
-     *
-     * @param response - encapsulate data related tto response
-     */
-    private void updateApiKeys(String userName, RestResponse response) {
-        TokenKeyValue token = apiKeyManager.refreshToken(userName);
-        if (token != null) {
-            UserProfileModel userProfileModel = new UserProfileModel(token.getToken());
-                response.iModel(userProfileModel);
-                log.debug("user: {} successfuly updated it apiKey", userName);
-        } else {
-            log.error("Error updating api key for user '{}'", userName);
-            response.error("Error updating api key for user " + userName);
-        }
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/artifact/AddSha256ToArtifactService.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/artifact/AddSha256ToArtifactService.java
deleted file mode 100644
index dc77612..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/artifact/AddSha256ToArtifactService.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.artifactory.rest.common.service.artifact;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.properties.ArtifactPropertiesAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class AddSha256ToArtifactService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(AddSha256ToArtifactService.class);
-
-    @Autowired
-    AuthorizationService authService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        BaseArtifact baseArtifact = (BaseArtifact) request.getImodel();
-        String repoKey = baseArtifact.getRepoKey();
-        String path = baseArtifact.getPath();
-        RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-
-        // TODO: [by dan] This half-baked check is placed here because it's a last minute change - need to include a
-        // TODO: [by dan] thorough check for recursive calls! (RTFACT-8474)
-        if(!authService.canDeployToLocalRepository() || !authService.canDeploy(repoPath)
-                || !authService.canAnnotate(repoPath)) {
-            String authErr = "User '" + authService.currentUsername() + "' is missing the required permissions to " +
-                    "trigger a sha256 calculation on path '" + repoPath.toPath() + "'";
-            log.error(authErr);
-            response.error(authErr);
-            return;
-        }
-         try {
-            addSha256ToArtifact(repoPath);
-        } catch (IOException e) {
-           log.error("error adding sha256 property");
-        } catch (RepoRejectException e) {
-            log.error("error adding sha256 property");
-             response.error("error adding sha256 property");
-        }
-    }
-
-
-    /**
-     * add sha256 to repo path
-     *
-     * @param repoPath - artifact repo path
-     */
-    protected void addSha256ToArtifact(RepoPath repoPath) throws IOException, RepoRejectException {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        ArtifactPropertiesAddon artifactPropertiesAddon = addonsManager.addonByType(ArtifactPropertiesAddon.class);
-        artifactPropertiesAddon.addPropertySha256RecursivelyMultiple(repoPath);
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/trash/EmptyTrashService.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/trash/EmptyTrashService.java
deleted file mode 100644
index caefbbf..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/trash/EmptyTrashService.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.rest.common.service.trash;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.common.StatusHolder;
-import org.artifactory.repo.trash.TrashService;
-import org.artifactory.rest.common.exception.BadRequestException;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Shay Yaakov
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class EmptyTrashService implements RestService {
-
-    @Autowired
-    TrashService trashService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        StatusHolder statusHolder = trashService.empty();
-        if (request.isUiRestCall()) {
-            uiResponse(statusHolder, response);
-        } else {
-            apiResponse(statusHolder, response);
-        }
-    }
-
-    private void uiResponse(StatusHolder statusHolder, RestResponse response) {
-        if (statusHolder.isError()) {
-            response.error(statusHolder.getLastError().getMessage());
-        } else {
-            response.info("Successfully deleted all trashcan items");
-        }
-    }
-
-    private void apiResponse(StatusHolder statusHolder, RestResponse response) {
-        if (statusHolder.isError()) {
-            throw new BadRequestException(statusHolder.getLastError().getMessage());
-        } else {
-            response.iModel("Successfully deleted all trashcan items");
-            response.responseCode(HttpStatus.SC_ACCEPTED);
-        }
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/service/trash/RestoreArtifactService.java b/web/rest-common/src/main/java/org/artifactory/rest/common/service/trash/RestoreArtifactService.java
deleted file mode 100644
index 188ed47..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/service/trash/RestoreArtifactService.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.artifactory.rest.common.service.trash;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.api.common.MoveMultiStatusHolder;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.trash.TrashService;
-import org.artifactory.rest.common.exception.BadRequestException;
-import org.artifactory.rest.common.model.trash.RestoreArtifact;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * Restore an artifact from the trashcan to it's original repository (or to the given destination)
- *
- * @author Shay Yaakov
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class RestoreArtifactService implements RestService {
-
-    @Autowired
-    TrashService trashService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        RestoreArtifact restoreArtifact = (RestoreArtifact) request.getImodel();
-        String repoKey = restoreArtifact.getRepoKey();
-        String path = restoreArtifact.getPath();
-        MoveMultiStatusHolder status = trashService.restore(InternalRepoPathFactory.create(repoKey, path),
-                restoreArtifact.getTargetRepoKey(), restoreArtifact.getTargetPath());
-        if (request.isUiRestCall()) {
-            uiResponse(status, response);
-        } else {
-            apiResponse(status, response);
-        }
-    }
-
-    private void uiResponse(MoveMultiStatusHolder status, RestResponse response) {
-        if (status.isError()) {
-            response.error(status.getLastError().getMessage());
-        } else if (status.hasWarnings()) {
-            response.warn(status.getLastWarning().getMessage());
-        } else {
-            response.info("Successfully restored trash items");
-        }
-    }
-
-    private void apiResponse(MoveMultiStatusHolder statusHolder, RestResponse response) {
-        if (statusHolder.isError()) {
-            throw new BadRequestException(statusHolder.getLastError().getMessage());
-        } else if (statusHolder.hasWarnings()) {
-            throw new BadRequestException(statusHolder.getLastWarning().getMessage());
-        } else {
-            response.iModel("Successfully restored trash items");
-            response.responseCode(HttpStatus.SC_ACCEPTED);
-        }
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/util/AolUtils.java b/web/rest-common/src/main/java/org/artifactory/rest/common/util/AolUtils.java
deleted file mode 100644
index e513956..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/util/AolUtils.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.artifactory.rest.common.util;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.CoreAddons;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.DockerRepositoryAction;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.rest.common.exception.ForbiddenException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * @author Lior Azar
- */
-public class AolUtils {
-    private static final Logger log = LoggerFactory.getLogger(AolUtils.class);
-
-    public static void assertNotAol(String functionName) {
-        if (ContextHelper.get().beanForType(AddonsManager.class).addonByType(CoreAddons.class).isAol()) {
-            log.warn("{} is not supported when running on the cloud", functionName);
-            throw new ForbiddenException("Function is not supported when running on the cloud");
-        }
-    }
-
-    public static void sendDockerRepoEvent(String repoKey, String version, DockerRepositoryAction action) {
-        CoreAddons coreAddons = ContextHelper.get().beanForType(AddonsManager.class).addonByType(CoreAddons.class);
-        if(coreAddons.isAol() && !ConstantValues.dev.getBoolean()){
-               coreAddons.sendDockerRepoEvent(repoKey,version, action);
-        }
-    }
-
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/util/BintrayRestHelper.java b/web/rest-common/src/main/java/org/artifactory/rest/common/util/BintrayRestHelper.java
deleted file mode 100644
index d1039d6..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/util/BintrayRestHelper.java
+++ /dev/null
@@ -1,141 +0,0 @@
-package org.artifactory.rest.common.util;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.CoreAddons;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.jackson.JacksonFactory;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.common.StatusEntry;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.repo.RepoPathFactory;
-import org.codehaus.jackson.JsonGenerator;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.Nullable;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.StreamingOutput;
-import java.io.IOException;
-import java.util.List;
-
-import static org.apache.http.HttpStatus.SC_FORBIDDEN;
-
-/**
- * Helper class containing shared functions for bintray rest endpoints in Artifactory
- *
- * @author Dan Feldman
- */
-public class BintrayRestHelper {
-    private static final Logger log = LoggerFactory.getLogger(BintrayRestHelper.class);
-
-    private static final String ERR_FILED_NAME = "Errors";
-    private static final String WARN_FILED_NAME = "Warnings";
-
-    public static boolean isPushToBintrayAllowed(@Nullable BasicStatusHolder status, @Nullable String distRepoKey) {
-        boolean userCanDeploy = userCanDeploy(distRepoKey);
-        if (!validUserForOperation() || !userCanDeploy) {
-            UserGroupService userGroupService = ContextHelper.get().beanForType(UserGroupService.class);
-            if (status != null) {
-                status.error("Invalid user for operation - you do not have the required permission, user: "
-                        + userGroupService.currentUser().getUsername(), SC_FORBIDDEN, log);
-            }
-            return false;
-        }
-        if (ConstantValues.bintrayUIHideUploads.getBoolean()) {
-            if (status != null) {
-                status.error("Your system administrator has disabled uploads to Bintray", SC_FORBIDDEN, log);
-            }
-            return false;
-        }
-        CentralConfigService centralConfigService = ContextHelper.get().beanForType(CentralConfigService.class);
-        boolean offlineMode = centralConfigService.getDescriptor().isOfflineMode();
-        if (offlineMode) {
-            if (status != null) {
-                status.error("Artifactory is in global offline mode", SC_FORBIDDEN, log);
-            }
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * Used by the UI builds pane
-     */
-    public static boolean userCanDistributeBuild() {
-        AuthorizationService authService = ContextHelper.get().beanForType(AuthorizationService.class);
-        boolean canDeployToDist = ContextHelper.get().beanForType(RepositoryService.class)
-                .getDistributionRepoDescriptors().stream()
-                .map(RepoDescriptor::getKey)
-                .filter(repoKey -> authService.canDeploy(RepoPathFactory.create(repoKey, ".")))
-                .findAny()
-                .isPresent();
-        return canDeployToDist && validUserForOperation();
-    }
-
-    private static boolean validUserForOperation() {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        CoreAddons addons = addonsManager.addonByType(CoreAddons.class);
-        AuthorizationService authorizationService = ContextHelper.get().beanForType(AuthorizationService.class);
-        UserGroupService userGroupService = ContextHelper.get().beanForType(UserGroupService.class);
-        boolean userExists = !addons.isAolAdmin() && !userGroupService.currentUser().isTransientUser();
-        boolean anonymousUser = authorizationService.isAnonymous();
-        return userExists && !anonymousUser;
-    }
-
-    private static boolean userCanDeploy(@Nullable String distRepoKey) {
-        boolean userCanDeploy;
-        AuthorizationService authService = ContextHelper.get().beanForType(AuthorizationService.class);
-        if (StringUtils.isNotBlank(distRepoKey)) {
-            userCanDeploy = authService.canDeploy(RepoPathFactory.create(distRepoKey, ""));
-        } else {
-            userCanDeploy = authService.canDeployToLocalRepository();
-        }
-        return userCanDeploy;
-    }
-
-    public static Response createAggregatedResponse(final BasicStatusHolder status, final String performedOn, boolean async) {
-        StreamingOutput streamingOutput = outputStream -> {
-            JsonGenerator jsonGenerator = JacksonFactory.createJsonGenerator(outputStream);
-            jsonGenerator.writeStartObject();
-            if (status.hasErrors()) {
-                writeEntries(jsonGenerator, ERR_FILED_NAME, status.getErrors());
-                if (status.hasWarnings()) {
-                    writeEntries(jsonGenerator, WARN_FILED_NAME, status.getWarnings());
-                }
-            } else {
-                String msg = "Pushing " + performedOn + " to Bintray " + (async ? "Scheduled to run " : "finished ")
-                        + ((status.hasWarnings() ? "with warnings, view the log for details" : "successfully."));
-                jsonGenerator.writeStringField("message", msg);
-            }
-            jsonGenerator.writeEndObject();
-            jsonGenerator.close();
-        };
-        int statusCode = HttpStatus.SC_OK;
-        if (status.hasErrors()) {
-            statusCode = status.getErrors().size() > 1 ? HttpStatus.SC_CONFLICT : status.getStatusCode();
-        }
-        return Response.status(statusCode).entity(streamingOutput).type(MediaType.APPLICATION_JSON_TYPE).build();
-    }
-
-    private static void writeEntries(JsonGenerator jsonGenerator, String fieldName,
-            List<StatusEntry> entries) throws IOException {
-        jsonGenerator.writeArrayFieldStart(fieldName);
-        for (StatusEntry entry : entries) {
-            jsonGenerator.writeStartObject();
-            if (entry.getStatusCode() != 0 && entry.getStatusCode() != HttpStatus.SC_BAD_REQUEST) {
-                jsonGenerator.writeNumberField("status", entry.getStatusCode());
-            }
-            jsonGenerator.writeStringField("message", entry.getMessage());
-            jsonGenerator.writeEndObject();
-        }
-        jsonGenerator.writeEndArray();
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/util/BuildResourceHelper.java b/web/rest-common/src/main/java/org/artifactory/rest/common/util/BuildResourceHelper.java
deleted file mode 100644
index 2f8dc10..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/util/BuildResourceHelper.java
+++ /dev/null
@@ -1,126 +0,0 @@
-package org.artifactory.rest.common.util;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.bintray.distribution.Distribution;
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.build.BuildInfoUtils;
-import org.artifactory.build.BuildRun;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.util.DoesNotExistException;
-import org.jfrog.build.api.Build;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.text.ParseException;
-import java.util.Date;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * @author Dan Feldman
- */
-public class BuildResourceHelper {
-    private static final Logger log = LoggerFactory.getLogger(BuildResourceHelper.class);
-
-    public static Build getBuild(String buildName, String buildNumber, BasicStatusHolder status) {
-        Build build = null;
-        try {
-            BuildRun buildRun = BuildResourceHelper.validateParamsAndGetBuildInfo(buildName, buildNumber, null);
-            build = ContextHelper.get().beanForType(BuildService.class).getBuild(buildRun);
-        } catch (Exception e) {
-            status.error("Can't get build: " + buildName + ":" + buildNumber + " - " + e.getMessage(), log);
-        }
-        return build;
-    }
-
-    /**
-     * Executes a build artifact search that excludes results from all distribution repos to avoid the search
-     * finding artifacts that were already distributed which will cause the distribution to deploy them in their already
-     * existing paths in Bintray (because they already have the bintray coordinates properties)
-     */
-    public static void populateBuildPaths(Build build, Distribution distribution, BasicStatusHolder status) {
-        BuildService buildService = ContextHelper.get().beanForType(BuildService.class);
-        List<String> buildArtifactPaths =
-                buildService.collectBuildArtifacts(build, distribution.getSourceRepos(), getAllDistRepoKeys(), status)
-                .stream()
-                .map(FileInfo::getRepoPath)
-                .map(RepoPath::toPath)
-                .collect(Collectors.toList());
-        distribution.setPackagesRepoPaths(buildArtifactPaths);
-    }
-
-    private static List<String> getAllDistRepoKeys() {
-        return ContextHelper.get().beanForType(RepositoryService.class).getDistributionRepoDescriptors().stream()
-                .map(RepoDescriptor::getKey)
-                .collect(Collectors.toList());
-    }
-
-    /**
-     * Validates the parameters of the move\copy request and returns the basic build info object if found
-     *
-     * @param buildName   Name of build to target
-     * @param buildNumber Number of build to target
-     * @param started     Start date of build to target (can be null)
-     * @return Basic info of build to target
-     */
-    public static BuildRun validateParamsAndGetBuildInfo(String buildName, String buildNumber, String started)
-            throws ParseException {
-
-        if (StringUtils.isBlank(buildName)) {
-            throw new IllegalArgumentException("Build name cannot be blank.");
-        }
-        if (StringUtils.isBlank(buildNumber)) {
-            throw new IllegalArgumentException("Build number cannot be blank.");
-        }
-
-        BuildRun toReturn = getRequestedBuildInfo(buildName, buildNumber, started);
-
-        if (toReturn == null) {
-            throw new DoesNotExistException("Cannot find build by the name '" + buildName + "' and the number '" +
-                    buildNumber + "' which started on " + started + ".");
-        }
-
-        return toReturn;
-    }
-
-    /**
-     * Returns the basic info object of the build to target
-     *
-     * @param buildName   Name of build to target
-     * @param buildNumber Number of build to target
-     * @param started     Start date of build to target (can be null)
-     * @return Basic info of build to target
-     */
-    public static BuildRun getRequestedBuildInfo(String buildName, String buildNumber, String started) {
-        BuildService buildService = ContextHelper.get().beanForType(BuildService.class);
-        Set<BuildRun> buildRunSet = buildService.searchBuildsByNameAndNumber(buildName, buildNumber);
-        if (buildRunSet.isEmpty()) {
-            throw new DoesNotExistException("Cannot find builds by the name '" + buildName + "' and the number '" +
-                    buildNumber + "'.");
-        }
-        BuildRun toReturn = null;
-
-        if (StringUtils.isBlank(started)) {
-            for (BuildRun buildRun : buildRunSet) {
-                if ((toReturn == null) || toReturn.getStartedDate().before(buildRun.getStartedDate())) {
-                    toReturn = buildRun;
-                }
-            }
-        } else {
-            Date requestedStartDate = new Date(BuildInfoUtils.parseBuildTime(started));
-            for (BuildRun buildRun : buildRunSet) {
-                if (buildRun.getStartedDate().equals(requestedStartDate)) {
-                    toReturn = buildRun;
-                    break;
-                }
-            }
-        }
-        return toReturn;
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/util/JsonUtil.java b/web/rest-common/src/main/java/org/artifactory/rest/common/util/JsonUtil.java
deleted file mode 100644
index f981a11..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/util/JsonUtil.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package org.artifactory.rest.common.util;
-
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.model.RestSpecialFields;
-import org.artifactory.rest.common.service.IgnoreSpecialFields;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.map.ObjectWriter;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.codehaus.jackson.map.ser.FilterProvider;
-import org.codehaus.jackson.map.ser.impl.SimpleBeanPropertyFilter;
-import org.codehaus.jackson.map.ser.impl.SimpleFilterProvider;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-
-/**
- * @author Chen Keinan
- */
-public class JsonUtil {
-    private static final Logger log = LoggerFactory.getLogger(JsonUtil.class);
-    private static final ObjectMapper mapper = new ObjectMapper();
-
-    /**
-     * json to String exclude null data
-     *
-     * @param model - model data to String
-     * @return - model data with json format
-     */
-    public static String jsonToString(RestModel model) {
-        mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
-        mapper.disableDefaultTyping();
-        String jasonString = null;
-        try {
-            jasonString = mapper.writeValueAsString(model);
-        } catch (IOException e) {
-            log.debug(e.toString());
-        }
-        return jasonString;
-    }
-
-    /**
-     * jsonToString exclude null data end edit fields
-     *
-     * @param model - model data to String
-     * @return - model data with json format
-     */
-    public static String jsonToStringIgnoreSpecialFields(RestModel model) {
-        String[] ExcludedFieldsFromView = getExcludedFields(model);
-        ObjectMapper specialMapper = new ObjectMapper();
-        specialMapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
-        String data = null;
-        FilterProvider filters = new SimpleFilterProvider()
-                .addFilter("exclude fields",
-                        SimpleBeanPropertyFilter.serializeAllExcept(
-                                (ExcludedFieldsFromView)));
-        ObjectWriter writer = specialMapper.writer(filters);
-        try {
-            data = writer.writeValueAsString(model);
-        } catch (IOException e) {
-            log.debug(e.getMessage());
-        }
-        return data;
-    }
-
-    /**
-     * return json with ignored fields
-     *
-     * @param model model data
-     * @return
-     */
-    private static String[] getExcludedFields(RestModel model) {
-        if (model instanceof RestSpecialFields) {
-            if (!((RestSpecialFields) model).ignoreSpecialFields()) {
-                return new String[]{};
-            }
-        }
-        IgnoreSpecialFields ignoreSpecialFields = model.getClass().getAnnotation(IgnoreSpecialFields.class);
-        return ignoreSpecialFields.value();
-    }
-
-    public static RestModel mapDataToModel(String data, Class valueType) throws IOException {
-        ObjectMapper mapper = new ObjectMapper();
-        RestModel model = (RestModel) mapper.readValue(data, valueType);
-        return model;
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/util/PermissionHelper.java b/web/rest-common/src/main/java/org/artifactory/rest/common/util/PermissionHelper.java
deleted file mode 100644
index 61e6ae5..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/util/PermissionHelper.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package org.artifactory.rest.common.util;
-
-import com.sun.jersey.api.NotFoundException;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.rest.common.exception.ForbiddenException;
-import org.artifactory.security.ArtifactoryPermission;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-/**
- * Helper that check if a user has permission on a repo. In case of virtual, it checks if a user has permission on
- * All of the virtual aggregated repos
- *
- * @author Shay Bagants
- */
- at Component
-public class PermissionHelper {
-
-    @Autowired
-    RepositoryService repoService;
-
-    @Autowired
-    AuthorizationService authService;
-
-    public void assertPermission(String repositoryPath, ArtifactoryPermission permission) {
-        RepoPath repoPath = RepoPathFactory.create(repositoryPath);
-        String repoKey = repoPath.getRepoKey();
-        RepoDescriptor repoDescriptor = repoService.repoDescriptorByKey(repoKey);
-        if (repoDescriptor == null) {
-            throw new NotFoundException("Repository '" + repoKey + "' not found");
-        }
-
-        if (repoDescriptor.isReal()) {
-            assertPermissionForRealRepo(repoPath, permission);
-        } else {
-            assertPermissionForVirtual(repoPath, permission);
-        }
-    }
-
-    private void assertPermissionForVirtual(RepoPath repoPath, ArtifactoryPermission permission) {
-        repoService.getVirtualResolvedLocalAndCacheDescriptors(repoPath.getRepoKey())
-                .forEach(localRepoDescriptor -> {
-                    RepoPath pathToCheck = RepoPathFactory.create(localRepoDescriptor.getKey(), repoPath.getPath());
-                    assertPermissionForRealRepo(pathToCheck, permission);
-                });
-    }
-
-    private void assertPermissionForRealRepo(RepoPath repoPath, ArtifactoryPermission permission) {
-        boolean hasPermission = false;
-        switch (permission) {
-            case READ:
-                hasPermission = authService.canRead(repoPath);
-                break;
-            case ANNOTATE:
-                hasPermission = authService.canAnnotate(repoPath);
-                break;
-            case DEPLOY:
-                hasPermission = authService.canDeploy(repoPath);
-                break;
-            case DELETE:
-                hasPermission = authService.canDelete(repoPath);
-                break;
-            case MANAGE:
-                hasPermission = authService.canManage(repoPath);
-                break;
-        }
-        if (!hasPermission) {
-            throw new ForbiddenException();
-        }
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/util/ResponseHandler.java b/web/rest-common/src/main/java/org/artifactory/rest/common/util/ResponseHandler.java
deleted file mode 100644
index d3ee076..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/util/ResponseHandler.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package org.artifactory.rest.common.util;
-
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.StreamRestResponse;
-
-import javax.ws.rs.core.Response;
-
-/**
- * @author chen keinan
- */
-public class ResponseHandler {
-
-    /**
-     * @return response code and data for Post Request
-     */
-    public static Response buildJerseyResponse(RestResponse response) {
-        Response.ResponseBuilder responseBuilder = getResponseBuilder();
-        Object entity = response.getEntity();
-        if (entity != null) {
-            return responseBuilder.status(response.getResponseCode()).entity(
-                    entity).build();
-        } else {
-            return responseBuilder.status(response.getResponseCode()).build();
-        }
-    }
-
-    /**
-     * @return response code and data for Post Request
-     */
-    public static Response buildFileResponse(RestResponse response, boolean downloadFile) {
-        Response.ResponseBuilder responseBuilder;
-        if (downloadFile) {
-            responseBuilder = getFileDownloadResponseBuilder(((StreamRestResponse) response).getFileName());
-        } else {
-            responseBuilder = getResponseBuilder();
-        }
-        return responseBuilder.status(response.getResponseCode()).entity(response.getEntity()).build();
-    }
-
-    /**
-     * create Response with support for cross site
-     *
-     * @return rest Response
-     */
-    private static Response.ResponseBuilder getResponseBuilder() {
-        Response.ResponseBuilder responseBuilder = Response.ok();
-        updateCorsHeaders(responseBuilder);
-        return responseBuilder;
-    }
-
-    /**
-     * create Response with support for cross site
-     *
-     * @return rest Response
-     */
-    private static Response.ResponseBuilder getFileDownloadResponseBuilder(String fileName) {
-        Response.ResponseBuilder responseBuilder = Response.ok();
-        updateCorsHeaders(responseBuilder);
-        // add file attachment header
-        responseBuilder.header("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
-        return responseBuilder;
-    }
-
-    /**
-     * update CORS headers
-     *
-     * @param responseBuilder response builder
-     */
-    private static void updateCorsHeaders(Response.ResponseBuilder responseBuilder) {
-        responseBuilder.header("Access-Control-Allow-Origin", "*");
-        responseBuilder.header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
-        responseBuilder.header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, X-Codingpedia");
-        responseBuilder.header("Cache-Control", "no-store");
-    }
-}
diff --git a/web/rest-common/src/main/java/org/artifactory/rest/common/util/RestUtils.java b/web/rest-common/src/main/java/org/artifactory/rest/common/util/RestUtils.java
deleted file mode 100644
index a53843f..0000000
--- a/web/rest-common/src/main/java/org/artifactory/rest/common/util/RestUtils.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common.util;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpHeaders;
-import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.rest.constant.ArtifactRestConstants;
-import org.artifactory.api.rest.constant.BuildRestConstants;
-import org.artifactory.api.rest.constant.RestConstants;
-import org.artifactory.api.rest.constant.SecurityRestConstants;
-import org.artifactory.api.search.SearchResultBase;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.util.HttpUtils;
-import org.artifactory.util.PathUtils;
-import org.joda.time.format.ISODateTimeFormat;
-
-import javax.servlet.http.HttpServletRequest;
-import java.io.UnsupportedEncodingException;
-
-/**
- * @author yoavl
- */
-public abstract class RestUtils {
-
-    private RestUtils() {
-        // utility class
-    }
-
-    public static String getServletContextUrl(HttpServletRequest request) {
-        return HttpUtils.getServletContextUrl(request);
-    }
-
-    public static String getRestApiUrl(HttpServletRequest request) {
-        return HttpUtils.getRestApiUrl(request);
-    }
-
-    /**
-     * Creates a date formatted string in the ISO8601 format - yyyy-MM-dd'T'HH:mm:ss.SSSZ.<p/>
-     * For example: <pre>2015-15-05T11:49:04.804+02:00</pre>
-     *
-     * @param time Time in millis
-     * @return String representing a date formatted in ISO8601
-     */
-    public static String toIsoDateString(long time) {
-        return ISODateTimeFormat.dateTime().print(time);
-    }
-
-    /**
-     * Parses an ISO8601 date formatted string - yyyy-MM-dd'T'HH:mm:ss.SSSZ and return the time in millis.<p/>
-     * For example: <pre>2015-15-05T11:49:04.804+02:00</pre>
-     *
-     * @param dateTime Time in millis
-     * @return String representing a date formatted in ISO8601
-     */
-    public static long fromIsoDateString(String dateTime) {
-        return ISODateTimeFormat.dateTime().parseMillis(dateTime);
-    }
-
-    public static String buildStorageInfoUri(HttpServletRequest request, SearchResultBase result) {
-        return buildStorageInfoUri(request, result.getRepoKey(), result.getRelativePath());
-    }
-
-    public static String getBaseStorageInfoUri(HttpServletRequest request) {
-        String servletContextUrl = HttpUtils.getServletContextUrl(request);
-        StringBuilder sb = new StringBuilder(servletContextUrl);
-        sb.append("/").append(RestConstants.PATH_API).append("/").append(ArtifactRestConstants.PATH_ROOT);
-        return sb.toString();
-    }
-
-    public static String buildStorageInfoUri(HttpServletRequest request, String repoKey, String relativePath) {
-        String servletContextUrl = HttpUtils.getServletContextUrl(request);
-        StringBuilder sb = new StringBuilder(servletContextUrl);
-        sb.append("/").append(RestConstants.PATH_API).append("/").append(ArtifactRestConstants.PATH_ROOT);
-        sb.append("/").append(repoKey);
-        if (StringUtils.isNotBlank(relativePath)) {
-            sb.append("/").append(relativePath);
-        }
-        return sb.toString();
-    }
-
-    public static String buildDownloadUri(HttpServletRequest request, String repoKey, String relativePath) {
-        String servletContextUrl = HttpUtils.getServletContextUrl(request);
-        StringBuilder sb = new StringBuilder(servletContextUrl);
-        sb.append("/").append(repoKey).append("/").append(relativePath);
-        return sb.toString();
-    }
-
-    public static String buildSecurityInfoUri(HttpServletRequest request, String entityType, String entityKey)
-            throws UnsupportedEncodingException {
-        String servletContextUrl = HttpUtils.getServletContextUrl(request);
-        return new StringBuilder(servletContextUrl).append("/").append(RestConstants.PATH_API).append("/")
-                .append(SecurityRestConstants.PATH_ROOT).append("/").append(entityType).append("/")
-                .append(HttpUtils.encodeQuery(entityKey)).toString();
-    }
-
-    public static RepoPath calcRepoPathFromRequestPath(String path) {
-        String repoKey = PathUtils.getFirstPathElement(path);
-        String relPath = PathUtils.getRelativePath(repoKey, path);
-        if (relPath.endsWith("/")) {
-            int index = relPath.length() - 1;
-            relPath = relPath.substring(0, index);
-        }
-        return InternalRepoPathFactory.create(repoKey, relPath);
-    }
-
-    public static String getBaseBuildsHref(HttpServletRequest request) {
-        return RestUtils.getRestApiUrl(request) + "/" + BuildRestConstants.PATH_ROOT;
-    }
-
-    public static String getBuildRelativeHref(String buildName) throws UnsupportedEncodingException {
-        return "/" + HttpUtils.encodeQuery(buildName);
-    }
-
-    public static String getBuildNumberRelativeHref(String buildNumber) throws UnsupportedEncodingException {
-        return "/" + HttpUtils.encodeQuery(buildNumber);
-    }
-
-    public static String getBuildInfoHref(HttpServletRequest request, String buildName, String buildNumber)
-            throws UnsupportedEncodingException {
-        return getBaseBuildsHref(request) + getBuildRelativeHref(buildName) + getBuildNumberRelativeHref(buildNumber);
-    }
-
-    /**
-     * For backward compatability, if the build info version is less or equals to 2.0.11
-     * then we need to decode the request parameters since we used a different encoding technique in the past,
-     * otherwise we simply let Jersey do the decoding for us
-     *
-     * @return True if we need to manually decode the request params, false otherwise
-     */
-    public static boolean shouldDecodeParams(HttpServletRequest request) {
-        String userAgent = request.getHeader(HttpHeaders.USER_AGENT);
-
-        // If the request didn't come from build info let Jersey do the work
-        if (StringUtils.isBlank(userAgent) || !userAgent.startsWith("ArtifactoryBuildClient/")) {
-            return false;
-        }
-
-        String buildInfoVersion = StringUtils.removeStart(userAgent, "ArtifactoryBuildClient/");
-        boolean snapshotCondition = StringUtils.contains(buildInfoVersion, "SNAPSHOT");
-        boolean newVersionCondition = new DefaultArtifactVersion("2.0.11").compareTo(
-                new DefaultArtifactVersion(buildInfoVersion)) < 0;
-
-        // Build info version is SNAPSHOT or newer than 2.0.11 we also let Jersey do the work
-        if (snapshotCondition || newVersionCondition) {
-            return false;
-        }
-
-        // If we got here it means client is using an old build-info (<= 2.0.11) we must manually decode the http params
-        return true;
-    }
-
-    public static Long extractLongEpoch(String from) {
-        Long fromLong = null;
-        if (from != null) {
-            if (from.contains("T")) {
-                fromLong = fromIsoDateString(from);
-            } else {
-                if (StringUtils.isNotBlank(from)) {
-                    fromLong = Long.valueOf(from);
-                }
-            }
-        }
-        return fromLong;
-    }
-
-    public enum RepoType {LOCAL, REMOTE, VIRTUAL}
-
-    /**
-     * @return the {@link RestUtils.RepoType} for the given {@code repoKey},
-     * or null if not found
-     */
-    public static RepoType repoType(String repoKey) {
-        RepositoryService repoService = ContextHelper.get().getRepositoryService();
-        if (repoService.localRepoDescriptorByKey(repoKey) != null) {
-            return RepoType.LOCAL;
-        } else if (repoService.remoteRepoDescriptorByKey(repoKey) != null) {
-            return RepoType.REMOTE;
-        } else if (repoService.virtualRepoDescriptorByKey(repoKey) != null) {
-            return RepoType.VIRTUAL;
-        } else {
-            return null;
-        }
-    }
-}
diff --git a/web/rest-ui/pom.xml b/web/rest-ui/pom.xml
deleted file mode 100644
index b0a0fb9..0000000
--- a/web/rest-ui/pom.xml
+++ /dev/null
@@ -1,101 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0          http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>artifactory-rest-ui</artifactId>
-    <packaging>jar</packaging>
-    <name>Artifactory REST UI API</name>
-
-    <parent>
-        <artifactId>artifactory-web-parent</artifactId>
-        <groupId>org.artifactory</groupId>
-        <version>4.8.0</version>
-    </parent>
-    <dependencies>
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-log</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-common</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-support-core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-capi</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-rest-common</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.ocpsoft.prettytime</groupId>
-            <artifactId>prettytime</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.sun.jersey</groupId>
-            <artifactId>jersey-server</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-beans</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-context</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.sun.jersey.contribs</groupId>
-            <artifactId>jersey-spring</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.sun.jersey.contribs</groupId>
-            <artifactId>jersey-multipart</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>javax.annotation</groupId>
-            <artifactId>jsr250-api</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.easymock</groupId>
-            <artifactId>easymock</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-test</artifactId>
-        </dependency>
-
-    </dependencies>
-</project>
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/exception/BadRequestException.java b/web/rest-ui/src/main/java/org/artifactory/ui/exception/BadRequestException.java
deleted file mode 100644
index cd2eb11..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/exception/BadRequestException.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ui.exception;
-
-/**
- * Represents a REST API client error request which will get responded by a 400 HTTP status code.
- *
- * @author Chen  Keinan
- * @see BadRequestExceptionMapper
- */
-
-public class BadRequestException extends RuntimeException {
-
-    public BadRequestException(String message) {
-        super(message);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/common/ConfigModelPopulator.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/common/ConfigModelPopulator.java
deleted file mode 100644
index 3c364e5..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/common/ConfigModelPopulator.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.artifactory.ui.rest.common;
-
-import org.artifactory.api.license.LicenseInfo;
-import org.artifactory.descriptor.bintray.BintrayConfigDescriptor;
-import org.artifactory.descriptor.external.BlackDuckSettingsDescriptor;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.ui.rest.model.admin.configuration.bintray.BintrayUIModel;
-import org.artifactory.ui.rest.model.admin.configuration.blackduck.BlackDuck;
-import org.artifactory.ui.rest.model.admin.configuration.licenses.License;
-import org.artifactory.ui.rest.model.admin.configuration.proxy.Proxy;
-import org.artifactory.ui.rest.model.empty.EmptyModel;
-
-import javax.annotation.Nonnull;
-
-/**
- * @author Chen Keinan
- */
-public class ConfigModelPopulator {
-
-    /**
-     * populate proxy descriptor data to Proxy model
-     *
-     * @param proxyDescriptor - proxy descriptor
-     * @return proxy model
-     */
-    @Nonnull
-    public static Proxy populateProxyConfiguration(@Nonnull ProxyDescriptor proxyDescriptor) {
-        Proxy proxy = null;
-        if (proxyDescriptor != null) {
-            proxy = new Proxy(proxyDescriptor);
-        }
-        return proxy;
-    }
-
-    /**
-     * populate licenseInfo descriptor data to licenseInfo model
-     * @param licenseInfo - licenseInfo descriptor
-     * @return licenseInfo model
-     */
-    @Nonnull
-    public static License populateLicenseInfo(@Nonnull LicenseInfo licenseInfo) {
-        License license = null;
-        if (licenseInfo != null) {
-            license = new License(licenseInfo);
-        }
-        return license;
-    }
-
-    /**
-     * populate blackDuckSettingsDescriptor descriptor data to blackDuck model
-     *
-     * @param blackDuckSettingsDescriptor - blackDuck  descriptor
-     * @return licenseInfo model
-     */
-    @Nonnull
-    public static RestModel populateBlackDuckInfo(BlackDuckSettingsDescriptor blackDuckSettingsDescriptor) {
-        if (blackDuckSettingsDescriptor != null) {
-            return  new BlackDuck(blackDuckSettingsDescriptor);
-
-        }
-        return new EmptyModel();
-    }
-
-    /**
-     * populate bintrayConfigDescriptor descriptor data to bintray  model
-     *
-     * @param bintrayConfigDescriptor - bintray  descriptor
-     * @return licenseInfo model
-     */
-    @Nonnull
-    public static RestModel populateBintrayInfo(BintrayConfigDescriptor bintrayConfigDescriptor, String bintrayUrl) {
-        BintrayUIModel bintrayUIModel = new BintrayUIModel(bintrayConfigDescriptor);
-        bintrayUIModel.setBintrayConfigUrl(bintrayUrl);
-        return bintrayUIModel;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/common/SecurityModelPopulator.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/common/SecurityModelPopulator.java
deleted file mode 100644
index 08f1d17..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/common/SecurityModelPopulator.java
+++ /dev/null
@@ -1,159 +0,0 @@
-package org.artifactory.ui.rest.common;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.security.sso.CrowdSettings;
-import org.artifactory.descriptor.security.sso.SamlSettings;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.sapi.security.SecurityConstants;
-import org.artifactory.security.*;
-import org.artifactory.ui.rest.model.admin.security.crowdsso.CrowdIntegration;
-import org.artifactory.ui.rest.model.admin.security.group.Group;
-import org.artifactory.ui.rest.model.admin.security.saml.Saml;
-import org.artifactory.ui.rest.model.admin.security.user.BaseUser;
-import org.artifactory.ui.rest.model.empty.EmptyModel;
-import org.joda.time.format.DateTimeFormatter;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Chen Keinan
- */
-public class SecurityModelPopulator {
-
-        @Nonnull
-        public static BaseUser getUserConfiguration(@Nonnull UserInfo user,DateTimeFormatter dateFormatter) {
-            BaseUser userConfiguration = new BaseUser();
-            long lastLoginTimeMillis = user.getLastLoginTimeMillis();
-            if (lastLoginTimeMillis > 0) {
-                userConfiguration.setLastLoggedIn(dateFormatter.print(lastLoginTimeMillis));
-                userConfiguration.setLastLoggedInMillis(lastLoginTimeMillis);
-            }
-            userConfiguration.setRealm(user.getRealm());
-            userConfiguration.setAdmin(user.isAdmin());
-            userConfiguration.setEmail(user.getEmail());
-            userConfiguration.setName(user.getUsername());
-            userConfiguration.setProfileUpdatable(user.isUpdatableProfile());
-            userConfiguration.setLocked(user.isLocked());
-            userConfiguration.setCredentialsExpired(user.isCredentialsExpired());
-            if (StringUtils.isBlank(user.getPassword())){
-                userConfiguration.setInternalPasswordDisabled(true);
-            }
-            if (!("internal".equals(user.getRealm()) || "system".equals(
-                    user.getRealm()) || user.getRealm() == null || user.getRealm().isEmpty() || user.isAnonymous())) {
-                userConfiguration.setExternalRealmLink("Check external status");
-            }
-            Set<UserGroupInfo> groups = user.getGroups();
-            if ((groups != null) && !groups.isEmpty()) {
-                userConfiguration.setGroups(Sets.newHashSet(Iterables.transform(groups,
-                                new Function<UserGroupInfo, String>() {
-                                    @Override
-                                    public String apply(@Nullable UserGroupInfo input) {
-                                        if (input == null) {
-                                            return null;
-                                        }
-                                        return input.getGroupName();
-                                    }
-                                })
-                ));
-            }
-            return userConfiguration;
-        }
-
-        @Nonnull
-        public static Group getGroupConfiguration(@Nonnull GroupInfo group) {
-            Group groupConfiguration = new Group();
-            groupConfiguration.setDescription(group.getDescription());
-            groupConfiguration.setAutoJoin(group.isNewUserDefault());
-            groupConfiguration.setName(group.getGroupName());
-            groupConfiguration.setRealm(group.getRealm());
-            groupConfiguration.setRealmAttributes(group.getRealmAttributes());
-            groupConfiguration.setExternal(group.getRealm() != null && !SecurityConstants.DEFAULT_REALM.equals(group.getRealm()));
-            return groupConfiguration;
-        }
-
-        @Nonnull
-        public static PermissionTargetConfigurationImpl getPermissionTargetConfiguration(@Nonnull AclInfo acl) {
-            PermissionTargetConfigurationImpl permissionTargetConfiguration = new PermissionTargetConfigurationImpl();
-            PermissionTargetInfo permissionTarget = acl.getPermissionTarget();
-            permissionTargetConfiguration.setName(permissionTarget.getName());
-            permissionTargetConfiguration.setIncludesPattern(permissionTarget.getIncludesPattern());
-            permissionTargetConfiguration.setExcludesPattern(permissionTarget.getExcludesPattern());
-            permissionTargetConfiguration.setRepositories(permissionTarget.getRepoKeys());
-
-            Set<AceInfo> aces = acl.getAces();
-            Map<String, Set<String>> users = Maps.newHashMap();
-            Map<String, Set<String>> groups = Maps.newHashMap();
-
-            for (AceInfo ace : aces) {
-                String principal = ace.getPrincipal();
-                Set<String> permissionsAsString = ace.getPermissionsAsString();
-                if (ace.isGroup()) {
-                    groups.put(principal, permissionsAsString);
-                } else {
-                    users.put(principal, permissionsAsString);
-                }
-            }
-
-            PrincipalConfigurationImpl principalConfiguration = new PrincipalConfigurationImpl();
-            if (!users.isEmpty()) {
-                principalConfiguration.setUsers(users);
-            }
-            if (!groups.isEmpty()) {
-                principalConfiguration.setGroups(groups);
-            }
-            permissionTargetConfiguration.setPrincipals(principalConfiguration);
-            return permissionTargetConfiguration;
-        }
-
-        public static Set<String> getPermissionsAsString(boolean canRead, boolean canAnnotate, boolean canDeploy,
-                boolean canDelete, boolean canAdmin) {
-
-            Set<String> permissionsAsString = Sets.newHashSet();
-            if (canRead) {
-                appendPermissionString(permissionsAsString, ArtifactoryPermission.READ);
-            }
-            if (canAnnotate) {
-                appendPermissionString(permissionsAsString, ArtifactoryPermission.ANNOTATE);
-            }
-            if (canDeploy) {
-                appendPermissionString(permissionsAsString, ArtifactoryPermission.DEPLOY);
-            }
-            if (canDelete) {
-                appendPermissionString(permissionsAsString, ArtifactoryPermission.DELETE);
-            }
-            if (canAdmin) {
-                appendPermissionString(permissionsAsString, ArtifactoryPermission.MANAGE);
-            }
-            return permissionsAsString;
-        }
-
-        private static void appendPermissionString(Set<String> permissionsAsString, ArtifactoryPermission permission) {
-            permissionsAsString.add(permission.getString());
-        }
-
-    /**
-     * populate samlSettings descriptor data to Saml model
-     *
-     * @param samlSettings - blackDuck  descriptor
-     * @return licenseInfo model
-     */
-    public static RestModel populateSamlInfo(SamlSettings samlSettings) {
-        if (samlSettings != null) {
-            return new Saml(samlSettings);
-        }
-        return new EmptyModel();
-    }
-
-    @Nonnull
-    public static CrowdIntegration getCrowdConfiguration(@Nonnull CrowdSettings crowdSettings) {
-        CrowdIntegration crowdIntegration = new CrowdIntegration(crowdSettings);
-        return crowdIntegration;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/common/ServiceModelPopulator.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/common/ServiceModelPopulator.java
deleted file mode 100644
index eb35037..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/common/ServiceModelPopulator.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.artifactory.ui.rest.common;
-
-import org.artifactory.descriptor.index.IndexerDescriptor;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.ui.rest.model.admin.services.indexer.Indexer;
-import org.artifactory.ui.rest.model.empty.EmptyModel;
-
-import javax.annotation.Nonnull;
-
-/**
- * @author Chen Keinan
- */
-public class ServiceModelPopulator {
-
-    /**
-     * populate indexer descriptor data to indexer model
-     *
-     * @param indexerDescriptor - indexer descriptor
-     * @return indexer model
-     */
-    @Nonnull
-    public static RestModel populateIndexerConfiguration(IndexerDescriptor indexerDescriptor) {
-        if (indexerDescriptor != null) {
-            return new Indexer(indexerDescriptor);
-        }
-        return new EmptyModel();
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/advanced/configdescriptor/ConfigDescriptorModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/advanced/configdescriptor/ConfigDescriptorModel.java
deleted file mode 100644
index 7758447..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/advanced/configdescriptor/ConfigDescriptorModel.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.artifactory.ui.rest.model.admin.advanced.configdescriptor;
-
-import org.artifactory.api.rest.restmodel.JsonUtil;
-import org.artifactory.rest.common.model.RestModel;
-
-/**
- * @author Chen Keinan
- */
-public class ConfigDescriptorModel implements RestModel {
-
-    private String configXml;
-
-    public ConfigDescriptorModel() {
-    }
-
-    public ConfigDescriptorModel(String configXml) {
-        this.configXml = configXml;
-    }
-
-    public String getConfigXml() {
-        return configXml;
-    }
-
-    public void setConfigXml(String configXml) {
-        this.configXml = configXml;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(configXml);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/advanced/maintenance/Maintenance.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/advanced/maintenance/Maintenance.java
deleted file mode 100644
index 5aa01ee..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/advanced/maintenance/Maintenance.java
+++ /dev/null
@@ -1,130 +0,0 @@
-package org.artifactory.ui.rest.model.admin.advanced.maintenance;
-
-import org.artifactory.descriptor.cleanup.CleanupConfigDescriptor;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.gc.GcConfigDescriptor;
-import org.artifactory.descriptor.quota.QuotaConfigDescriptor;
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Chen Keinan
- */
-public class Maintenance extends BaseModel {
-    private String garbageCollectorCron;
-    private String cleanUnusedCachedCron;
-    private String cleanVirtualRepoCron;
-    private boolean quotaControl;
-    private Integer storageLimit;
-    private Integer storageWarning;
-
-    public Maintenance() {
-    }
-
-    public Maintenance(MutableCentralConfigDescriptor mutableDescriptor) {
-        updateGcConfig(mutableDescriptor);
-        updateCleanUnusedCache(mutableDescriptor);
-        updateCacheCleanupConfig(mutableDescriptor);
-        updateQuotaConfig(mutableDescriptor);
-    }
-
-    /**
-     * update gc config
-     *
-     * @param mutableDescriptor - config descriptor
-     */
-    private void updateGcConfig(MutableCentralConfigDescriptor mutableDescriptor) {
-        GcConfigDescriptor gcConfig = mutableDescriptor.getGcConfig();
-        if (gcConfig != null) {
-            this.garbageCollectorCron = gcConfig.getCronExp();
-        }
-    }
-
-    /**
-     * update clean unused cached config
-     *
-     * @param mutableDescriptor - config descriptor
-     */
-    private void updateCleanUnusedCache(MutableCentralConfigDescriptor mutableDescriptor) {
-        CleanupConfigDescriptor cleanupConfig = mutableDescriptor.getCleanupConfig();
-        if (cleanupConfig != null) {
-            this.cleanUnusedCachedCron = cleanupConfig.getCronExp();
-        }
-    }
-
-    /**
-     * update virtual cache cleanup config
-     *
-     * @param mutableDescriptor - config descriptor
-     */
-    private void updateCacheCleanupConfig(MutableCentralConfigDescriptor mutableDescriptor) {
-        CleanupConfigDescriptor virtualCacheCleanupConfig = mutableDescriptor.getVirtualCacheCleanupConfig();
-        if (virtualCacheCleanupConfig != null) {
-            this.cleanVirtualRepoCron = virtualCacheCleanupConfig.getCronExp();
-        }
-    }
-
-    /**
-     * update quota  config
-     *
-     * @param mutableDescriptor - config descriptor
-     */
-    private void updateQuotaConfig(MutableCentralConfigDescriptor mutableDescriptor) {
-        QuotaConfigDescriptor quotaConfig = mutableDescriptor.getQuotaConfig();
-        if (quotaConfig != null) {
-            this.quotaControl = quotaConfig.isEnabled();
-            this.storageLimit = quotaConfig.getDiskSpaceLimitPercentage();
-            this.storageWarning = quotaConfig.getDiskSpaceWarningPercentage();
-        } else {
-            this.storageLimit = 95;
-            this.storageWarning = 85;
-        }
-    }
-
-    public String getGarbageCollectorCron() {
-        return garbageCollectorCron;
-    }
-
-    public void setGarbageCollectorCron(String garbageCollectorCron) {
-        this.garbageCollectorCron = garbageCollectorCron;
-    }
-
-    public String getCleanUnusedCachedCron() {
-        return cleanUnusedCachedCron;
-    }
-
-    public void setCleanUnusedCachedCron(String cleanUnusedCachedCron) {
-        this.cleanUnusedCachedCron = cleanUnusedCachedCron;
-    }
-
-    public String getCleanVirtualRepoCron() {
-        return cleanVirtualRepoCron;
-    }
-
-    public void setCleanVirtualRepoCron(String cleanVirtualRepoCron) {
-        this.cleanVirtualRepoCron = cleanVirtualRepoCron;
-    }
-
-    public Boolean isQuotaControl() {
-        return quotaControl;
-    }
-
-    public void setQuotaControl(Boolean quotaControl) {
-        this.quotaControl = quotaControl;
-    }
-
-    public Integer getStorageLimit() {
-        return storageLimit;
-    }
-
-    public void setStorageLimit(Integer storageLimit) {
-        this.storageLimit = storageLimit;
-    }
-
-    public Integer getStorageWarning() {
-        return storageWarning;
-    }
-
-    public void setStorageWarning(Integer storageWarning) {
-        this.storageWarning = storageWarning;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/advanced/securitydescriptor/SecurityDescriptorModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/advanced/securitydescriptor/SecurityDescriptorModel.java
deleted file mode 100644
index a187ec8..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/advanced/securitydescriptor/SecurityDescriptorModel.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.artifactory.ui.rest.model.admin.advanced.securitydescriptor;
-
-import org.artifactory.api.rest.restmodel.JsonUtil;
-import org.artifactory.rest.common.model.RestModel;
-
-/**
- * @author Chen Keinan
- */
-public class SecurityDescriptorModel implements RestModel {
-
-    private String securityXML;
-
-    SecurityDescriptorModel() {
-    }
-
-    public SecurityDescriptorModel(String securityXML) {
-        this.securityXML = securityXML;
-    }
-
-    public String getSecurityXML() {
-        return securityXML;
-    }
-
-    public void setSecurityXML(String securityXML) {
-        this.securityXML = securityXML;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(securityXML);
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/advanced/systeminfo/SystemInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/advanced/systeminfo/SystemInfo.java
deleted file mode 100644
index 42bded2..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/advanced/systeminfo/SystemInfo.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.artifactory.ui.rest.model.admin.advanced.systeminfo;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Chen Keinan
- */
-public class SystemInfo extends BaseModel {
-
-    private Map<String, Map<String, String>> systemInfo = new LinkedHashMap<>();
-
-    public Map<String, Map<String, String>> getSystemInfo() {
-        return systemInfo;
-    }
-
-    public void setSystemInfo(Map<String, Map<String, String>> systemInfo) {
-        this.systemInfo = systemInfo;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/advanced/systemlogs/SystemLogData.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/advanced/systemlogs/SystemLogData.java
deleted file mode 100644
index b073c11..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/advanced/systemlogs/SystemLogData.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.artifactory.ui.rest.model.admin.advanced.systemlogs;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-import java.util.Date;
-
-/**
- * @author Lior Hasson
- */
-public class SystemLogData extends BaseModel {
-    private Date lastUpdateModified;
-    private Date lastUpdateLabel;
-    private String logContent;
-    private long fileSize;
-
-    public long getFileSize() {
-        return fileSize;
-    }
-
-    public Date getLastUpdateModified() {
-        return lastUpdateModified;
-    }
-
-    public Date getLastUpdateLabel() {
-        return lastUpdateLabel;
-    }
-
-    public String getLogContent() {
-        return logContent;
-    }
-
-    public void setLastUpdateModified(Date lastUpdateModified) {
-        this.lastUpdateModified = lastUpdateModified;
-    }
-
-    public void setLastUpdateLabel(Date lastUpdateLabel) {
-        this.lastUpdateLabel = lastUpdateLabel;
-    }
-
-    public void setLogContent(String logContent) {
-        this.logContent = logContent;
-    }
-
-    public void setFileSize(long fileSize) {
-        this.fileSize = fileSize;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/advanced/systemlogs/SystemLogFile.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/advanced/systemlogs/SystemLogFile.java
deleted file mode 100644
index 5a95a05..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/advanced/systemlogs/SystemLogFile.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.artifactory.ui.rest.model.admin.advanced.systemlogs;
-
-import org.artifactory.rest.common.model.FileModel;
-import org.artifactory.rest.common.model.RestModel;
-
-import java.io.FileInputStream;
-
-/**
- * @author Lior Hasson
- */
-public class SystemLogFile implements RestModel, FileModel {
-    private FileInputStream stream;
-
-    @Override
-    public Object getFileResource() {
-        return getStream();
-    }
-
-    public FileInputStream getStream() {
-        return stream;
-    }
-
-    public void setStream(FileInputStream stream) {
-        this.stream = stream;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/advanced/systemlogs/SystemLogsInitialize.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/advanced/systemlogs/SystemLogsInitialize.java
deleted file mode 100644
index eef4df3..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/advanced/systemlogs/SystemLogsInitialize.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.ui.rest.model.admin.advanced.systemlogs;
-
-import org.artifactory.common.ConstantValues;
-import org.artifactory.rest.common.model.BaseModel;
-
-import java.util.List;
-
-import static java.util.Arrays.asList;
-
-/**
- * @author Lior Hasson
- */
-public class SystemLogsInitialize extends BaseModel {
-    private final List<String> logs = asList("artifactory.log", "access.log", "import.export.log", "request.log");
-
-    private int refreshRateSecs = ConstantValues.logsViewRefreshRateSecs.getInt();
-
-    public List<String> getLogs() {
-        return logs;
-    }
-
-    public int getRefreshRateSecs() {
-        return refreshRateSecs;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/bintray/BintrayUIModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/bintray/BintrayUIModel.java
deleted file mode 100644
index b490619..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/bintray/BintrayUIModel.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.bintray;
-
-import org.artifactory.descriptor.bintray.BintrayConfigDescriptor;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-
-/**
- * @author Chen Keinan
- */
-public class BintrayUIModel extends BintrayConfigDescriptor implements RestModel {
-
-    private String BintrayAuth;
-    private String bintrayConfigUrl;
-
-    public BintrayUIModel() {
-    }
-
-    public BintrayUIModel(BintrayConfigDescriptor bintrayConfigDescriptor) {
-        if (bintrayConfigDescriptor != null) {
-            super.setApiKey(bintrayConfigDescriptor.getApiKey());
-            super.setFileUploadLimit(bintrayConfigDescriptor.getFileUploadLimit());
-            super.setUserName(bintrayConfigDescriptor.getUserName());
-        }
-    }
-
-    public void setBintrayAuth(String bintrayAuth) {
-        BintrayAuth = bintrayAuth;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-
-    @Override
-    public String getBintrayAuth() {
-        return BintrayAuth;
-    }
-
-    public String getBintrayConfigUrl() {
-        return bintrayConfigUrl;
-    }
-
-    public void setBintrayConfigUrl(String bintrayConfigUrl) {
-        this.bintrayConfigUrl = bintrayConfigUrl;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/blackduck/BlackDuck.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/blackduck/BlackDuck.java
deleted file mode 100644
index dce059b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/blackduck/BlackDuck.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.blackduck;
-
-import org.artifactory.descriptor.external.BlackDuckSettingsDescriptor;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-
-/**
- * @author Chen Keinan
- */
-public class BlackDuck extends BlackDuckSettingsDescriptor implements RestModel {
-
-    public BlackDuck() {
-    }
-
-    public BlackDuck(BlackDuckSettingsDescriptor blackDuckSettingsDescriptor) {
-        super.setPassword(blackDuckSettingsDescriptor.getPassword());
-        super.setConnectionTimeoutMillis(blackDuckSettingsDescriptor.getConnectionTimeoutMillis());
-        super.setUsername(blackDuckSettingsDescriptor.getUsername());
-        super.setServerUri(blackDuckSettingsDescriptor.getServerUri());
-        super.setEnableIntegration(blackDuckSettingsDescriptor.isEnableIntegration());
-        super.setProxy(blackDuckSettingsDescriptor.getProxy());
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/docker/repo/DockerRepo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/docker/repo/DockerRepo.java
deleted file mode 100644
index 149a5aa..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/docker/repo/DockerRepo.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.docker.repo;
-
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-
-/**
- * @author Shay Yaakov
- */
-public class DockerRepo implements RestModel {
-
-    private String hostname;
-    private Boolean deployToLocal;
-
-    public String getHostname() {
-        return hostname;
-    }
-
-    public void setHostname(String hostname) {
-        this.hostname = hostname;
-    }
-
-    public Boolean getDeployToLocal() {
-        return deployToLocal;
-    }
-
-    public void setDeployToLocal(Boolean deployToLocal) {
-        this.deployToLocal = deployToLocal;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/generalconfig/GeneralConfig.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/generalconfig/GeneralConfig.java
deleted file mode 100644
index 9f17556..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/generalconfig/GeneralConfig.java
+++ /dev/null
@@ -1,283 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.generalconfig;
-
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.download.FolderDownloadConfigDescriptor;
-import org.artifactory.descriptor.message.SystemMessageDescriptor;
-import org.artifactory.descriptor.replication.GlobalReplicationsConfigDescriptor;
-import org.artifactory.descriptor.trashcan.TrashcanConfigDescriptor;
-import org.artifactory.rest.common.model.BaseModel;
-
-import java.util.Optional;
-
-/**
- * @author Chen Keinan
- */
-public class GeneralConfig extends BaseModel {
-
-    private String serverName;
-    private String customUrlBase;
-    private Integer fileUploadMaxSize;
-    private String dateFormat;
-    private Boolean globalOfflineMode;
-    private Boolean showAddonSettings;
-    private String logoUrl;
-    private int bintrayFilesUploadLimit;
-    private Boolean helpLinksEnabled;
-    private Boolean forceBaseUrl;
-
-    //System message
-    private Boolean systemMessageEnabled;
-    private String systemMessageTitle;
-    private String systemMessageTitleColor;
-    private String systemMessage;
-    private Boolean showSystemMessageOnAllPages;
-    //Folder download
-    private Boolean folderDownloadEnabled;
-    private Integer folderDownloadMaxSizeMb;
-    private Long maxFolderDownloadFilesLimit;
-    private Integer FolderDownloadMaxConcurrentRequests;
-    //Trashcan
-    private Boolean trashcanEnabled;
-    private Boolean allowPermDeletes;
-    private Integer trashcanRetentionPeriodDays;
-    //Global replication config
-    private Boolean blockPullReplications;
-    private Boolean blockPushReplications;
-    public GeneralConfig(){}
-
-    public GeneralConfig(MutableCentralConfigDescriptor mutableDescriptor) {
-        serverName =  mutableDescriptor.getServerName();
-        customUrlBase = mutableDescriptor.getUrlBase();
-        fileUploadMaxSize = mutableDescriptor.getFileUploadMaxSizeMb();
-        dateFormat = mutableDescriptor.getDateFormat();
-        globalOfflineMode = mutableDescriptor.isOfflineMode();
-        showAddonSettings = mutableDescriptor.getAddons().isShowAddonsInfo();
-        logoUrl = mutableDescriptor.getLogo();
-        bintrayFilesUploadLimit = getBintrayFileUploadLimit(mutableDescriptor);
-        helpLinksEnabled = mutableDescriptor.isHelpLinksEnabled();
-        //System Message
-        SystemMessageDescriptor messageDescriptor = Optional.ofNullable(mutableDescriptor.getSystemMessageConfig())
-                .orElse(new SystemMessageDescriptor());
-        systemMessageEnabled = messageDescriptor.isEnabled();
-        systemMessageTitle = messageDescriptor.getTitle();
-        systemMessageTitleColor = messageDescriptor.getTitleColor();
-        systemMessage = messageDescriptor.getMessage();
-        showSystemMessageOnAllPages = messageDescriptor.isShowOnAllPages();
-        //Folder Download
-        FolderDownloadConfigDescriptor folderDownloadDescriptor = mutableDescriptor.getFolderDownloadConfig();
-        folderDownloadEnabled = folderDownloadDescriptor.isEnabled();
-        folderDownloadMaxSizeMb = folderDownloadDescriptor.getMaxDownloadSizeMb();
-        maxFolderDownloadFilesLimit = folderDownloadDescriptor.getMaxFiles();
-        FolderDownloadMaxConcurrentRequests = folderDownloadDescriptor.getMaxConcurrentRequests();
-        //Trashcan
-        TrashcanConfigDescriptor trashcanConfigDescriptor = mutableDescriptor.getTrashcanConfig();
-        trashcanEnabled = trashcanConfigDescriptor.isEnabled();
-        trashcanRetentionPeriodDays = trashcanConfigDescriptor.getRetentionPeriodDays();
-        allowPermDeletes = trashcanConfigDescriptor.isAllowPermDeletes();
-        //Global replication config
-        GlobalReplicationsConfigDescriptor replicationsConfig = mutableDescriptor.getReplicationsConfig();
-        blockPullReplications = replicationsConfig.isBlockPullReplications();
-        blockPushReplications = replicationsConfig.isBlockPushReplications();
-    }
-
-    private int getBintrayFileUploadLimit(MutableCentralConfigDescriptor mutableDescriptor) {
-        if(mutableDescriptor.getBintrayConfig() != null){
-            return mutableDescriptor.getBintrayConfig().getFileUploadLimit();
-        }
-        else {
-            return 0;
-        }
-    }
-
-    public String getServerName() {
-        return serverName;
-    }
-
-    public void setServerName(String serverName) {
-        this.serverName = serverName;
-    }
-
-    public String getCustomUrlBase() {
-        return customUrlBase;
-    }
-
-    public void setCustomUrlBase(String customUrlBase) {
-        this.customUrlBase = customUrlBase;
-    }
-
-    public Integer getFileUploadMaxSize() {
-        return fileUploadMaxSize;
-    }
-
-    public void setFileUploadMaxSize(Integer fileUploadMaxSize) {
-        this.fileUploadMaxSize = fileUploadMaxSize;
-    }
-
-    public String getDateFormat() {
-        return dateFormat;
-    }
-
-    public void setDateFormat(String dateFormat) {
-        this.dateFormat = dateFormat;
-    }
-
-    public Boolean isGlobalOfflineMode() {
-        return globalOfflineMode;
-    }
-
-    public void setGlobalOfflineMode(Boolean globalOfflineMode) {
-        this.globalOfflineMode = globalOfflineMode;
-    }
-
-    public Boolean isShowAddonSettings() {
-        return showAddonSettings;
-    }
-
-    public void setShowAddonSettings(Boolean showAddonSettings) {
-        this.showAddonSettings = showAddonSettings;
-    }
-
-    public String getLogoUrl() {
-        return logoUrl;
-    }
-
-    public void setLogoUrl(String logoUrl) {
-        this.logoUrl = logoUrl;
-    }
-
-    public int getBintrayFilesUploadLimit() {
-        return bintrayFilesUploadLimit;
-    }
-
-    public void setBintrayFilesUploadLimit(int bintrayFilesUploadLimit) {
-        this.bintrayFilesUploadLimit = bintrayFilesUploadLimit;
-    }
-
-    public Boolean isHelpLinksEnabled() {
-        return helpLinksEnabled;
-    }
-
-    public void setHelpLinksEnabled(Boolean helpLinksEnabled) {
-        this.helpLinksEnabled = helpLinksEnabled;
-    }
-
-    public boolean isSystemMessageEnabled() {
-        return systemMessageEnabled;
-    }
-
-    public void setSystemMessageEnabled(boolean systemMessageEnabled) {
-        this.systemMessageEnabled = systemMessageEnabled;
-    }
-
-    public String getSystemMessageTitle() {
-        return systemMessageTitle;
-    }
-
-    public void setSystemMessageTitle(String systemMessageTitle) {
-        this.systemMessageTitle = systemMessageTitle;
-    }
-
-    public String getSystemMessageTitleColor() {
-        return systemMessageTitleColor;
-    }
-
-    public void setSystemMessageTitleColor(String systemMessageTitleColor) {
-        this.systemMessageTitleColor = systemMessageTitleColor;
-    }
-
-    public String getSystemMessage() {
-        return systemMessage;
-    }
-
-    public void setSystemMessage(String systemMessage) {
-        this.systemMessage = systemMessage;
-    }
-
-    public boolean isShowSystemMessageOnAllPages() {
-        return showSystemMessageOnAllPages;
-    }
-
-    public void setShowSystemMessageOnAllPages(boolean showSystemMessageOnAllPages) {
-        this.showSystemMessageOnAllPages = showSystemMessageOnAllPages;
-    }
-
-    public Boolean isFolderDownloadEnabled() {
-        return folderDownloadEnabled;
-    }
-
-    public void setFolderDownloadEnabled(boolean folderDownloadEnabled) {
-        this.folderDownloadEnabled = folderDownloadEnabled;
-    }
-
-    public Integer getFolderDownloadMaxSizeMb() {
-        return folderDownloadMaxSizeMb;
-    }
-
-    public void setFolderDownloadMaxSizeMb(int folderDownloadMaxSizeMb) {
-        this.folderDownloadMaxSizeMb = folderDownloadMaxSizeMb;
-    }
-
-    public Long getMaxFolderDownloadFilesLimit() {
-        return maxFolderDownloadFilesLimit;
-    }
-
-    public void setMaxFolderDownloadFilesLimit(long maxFolderDownloadFilesLimit) {
-        this.maxFolderDownloadFilesLimit = maxFolderDownloadFilesLimit;
-    }
-
-    public Integer getFolderDownloadMaxConcurrentRequests() {
-        return FolderDownloadMaxConcurrentRequests;
-    }
-
-    public void setFolderDownloadMaxConcurrentRequests(int folderDownloadMaxConcurrentRequests) {
-        FolderDownloadMaxConcurrentRequests = folderDownloadMaxConcurrentRequests;
-    }
-
-    public Boolean getTrashcanEnabled() {
-        return trashcanEnabled;
-    }
-
-    public void setTrashcanEnabled(Boolean trashcanEnabled) {
-        this.trashcanEnabled = trashcanEnabled;
-    }
-
-    public Integer getTrashcanRetentionPeriodDays() {
-        return trashcanRetentionPeriodDays;
-    }
-
-    public void setTrashcanRetentionPeriodDays(Integer trashcanRetentionPeriodDays) {
-        this.trashcanRetentionPeriodDays = trashcanRetentionPeriodDays;
-    }
-
-    public Boolean getAllowPermDeletes() {
-        return allowPermDeletes;
-    }
-
-    public void setAllowPermDeletes(Boolean allowPermDeletes) {
-        this.allowPermDeletes = allowPermDeletes;
-    }
-
-    public Boolean getForceBaseUrl() {
-        return forceBaseUrl;
-    }
-
-    public void setForceBaseUrl(Boolean forceBaseUrl) {
-        this.forceBaseUrl = forceBaseUrl;
-    }
-
-    public Boolean getBlockPullReplications() {
-        return blockPullReplications;
-    }
-
-    public void setBlockPullReplications(Boolean blockPullReplications) {
-        this.blockPullReplications = blockPullReplications;
-    }
-
-    public Boolean getBlockPushReplications() {
-        return blockPushReplications;
-    }
-
-    public void setBlockPushReplications(Boolean blockPushReplications) {
-        this.blockPushReplications = blockPushReplications;
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/generalconfig/LogoFileUpload.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/generalconfig/LogoFileUpload.java
deleted file mode 100644
index 73635d4..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/generalconfig/LogoFileUpload.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.generalconfig;
-
-import org.artifactory.rest.common.model.FileData;
-import org.artifactory.ui.rest.model.utils.FileUpload;
-
-/**
- * @author chen keinan
- */
-public class LogoFileUpload extends FileUpload implements FileData {
-
-    public LogoFileUpload(){}
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/generalconfig/LookAndFeelSettings.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/generalconfig/LookAndFeelSettings.java
deleted file mode 100644
index f8f5762..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/generalconfig/LookAndFeelSettings.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.generalconfig;
-
-import org.artifactory.rest.common.model.BaseModel;
-import org.artifactory.ui.rest.model.utils.FileUpload;
-
-/**
- * @author Chen keinan
- */
-public class LookAndFeelSettings extends BaseModel {
-
-    private FileUpload fileUpload;
-    private String logoUrl;
-
-    public FileUpload getFileUpload() {
-        return fileUpload;
-    }
-
-    public void setFileUpload(FileUpload fileUpload) {
-        this.fileUpload = fileUpload;
-    }
-
-    public String getLogoUrl() {
-        return logoUrl;
-    }
-
-    public void setLogoUrl(String logoUrl) {
-        this.logoUrl = logoUrl;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/ha/ConfigureHaModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/ha/ConfigureHaModel.java
deleted file mode 100644
index cf96e27..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/ha/ConfigureHaModel.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.ha;
-
-/**
- * @author Chen keinan
- */
-public class ConfigureHaModel {
-
-    private String jfrogWikiLink = "http://www.jfrog.com/confluence/";
-    private String configureLink = "http://www.jfrog.com/confluence/display/RTF/Installation+and+Setup";
-
-    public String getJfrogWikiLink() {
-        return jfrogWikiLink;
-    }
-
-    public void setJfrogWikiLink(String jfrogWikiLink) {
-        this.jfrogWikiLink = jfrogWikiLink;
-    }
-
-    public String getConfigureLink() {
-        return configureLink;
-    }
-
-    public void setConfigureLink(String configureLink) {
-        this.configureLink = configureLink;
-    }
-}
-
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/ha/HaModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/ha/HaModel.java
deleted file mode 100644
index a8da876..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/ha/HaModel.java
+++ /dev/null
@@ -1,127 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.ha;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.storage.db.servers.model.ArtifactoryServer;
-
-/**
- * @author Chen Keinan
- */
-public class HaModel {
-
-    private String id;
-    private String startTime;
-    private String url;
-    private int memberShipPort;
-    private String state;
-    private String role;
-    private String lastHeartbeat;
-    private String version;
-    private int revision;
-    private String releaseDate;
-    private boolean isHeartbeatStale;
-
-    public HaModel(ArtifactoryServer server, boolean isHeartbeatStale) {
-        id = server.getServerId();
-        CentralConfigService centralConfig = ContextHelper.get().getCentralConfig();
-        startTime = centralConfig.getDateFormatter().print(server.getStartTime());
-        url = server.getContextUrl();
-        memberShipPort = server.getMembershipPort();
-        state = server.getServerState().getPrettyName();
-        role = server.getServerRole().getPrettyName();
-        lastHeartbeat = centralConfig.getDateFormatter().print(server.getLastHeartbeat());
-        version = server.getArtifactoryVersion();
-        revision = server.getArtifactoryRevision();
-        releaseDate = centralConfig.getDateFormatter().print(server.getArtifactoryRelease());
-        this.isHeartbeatStale = isHeartbeatStale;
-    }
-
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public String getStartTime() {
-        return startTime;
-    }
-
-    public void setStartTime(String startTime) {
-        this.startTime = startTime;
-    }
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    public int getMemberShipPort() {
-
-        return memberShipPort;
-    }
-
-    public void setMemberShipPort(int memberShipPort) {
-        this.memberShipPort = memberShipPort;
-    }
-
-    public String getState() {
-        return state;
-    }
-
-    public void setState(String state) {
-        this.state = state;
-    }
-
-    public String getRole() {
-        return role;
-    }
-
-    public void setRole(String role) {
-        this.role = role;
-    }
-
-    public String getLastHeartbeat() {
-        return lastHeartbeat;
-    }
-
-    public void setLastHeartbeat(String lastHeartbeat) {
-        this.lastHeartbeat = lastHeartbeat;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public int getRevision() {
-        return revision;
-    }
-
-    public void setRevision(int revision) {
-        this.revision = revision;
-    }
-
-    public String getReleaseDate() {
-        return releaseDate;
-    }
-
-    public void setReleaseDate(String releaseDate) {
-        this.releaseDate = releaseDate;
-    }
-
-    public boolean isHeartbeatStale() {
-        return isHeartbeatStale;
-    }
-
-    public void setIsHeartbeatStale(boolean isHeartbeatStale) {
-        this.isHeartbeatStale = isHeartbeatStale;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/layouts/LayoutActionsModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/layouts/LayoutActionsModel.java
deleted file mode 100644
index 0eabbfa..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/layouts/LayoutActionsModel.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.layouts;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Lior Hasson
- */
-public class LayoutActionsModel extends BaseModel{
-    private boolean copy;
-    private boolean edit;
-    private boolean delete;
-
-    public LayoutActionsModel() {
-        this.copy = true;
-        this.edit = true;
-        this.delete = true;
-    }
-
-    public boolean isCopy() {
-        return copy;
-    }
-
-    public void setCopy(boolean copy) {
-        this.copy = copy;
-    }
-
-    public boolean isEdit() {
-        return edit;
-    }
-
-    public void setEdit(boolean edit) {
-        this.edit = edit;
-    }
-
-    public boolean isDelete() {
-        return delete;
-    }
-
-    public void setDelete(boolean delete) {
-        this.delete = delete;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/layouts/LayoutConfigViewModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/layouts/LayoutConfigViewModel.java
deleted file mode 100644
index ba9dd6f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/layouts/LayoutConfigViewModel.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.layouts;
-
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-
-/**
- * @author Lior Hasson
- */
-public class LayoutConfigViewModel extends RepoLayout implements RestModel {
-    private String pathToTest;
-
-    public LayoutConfigViewModel() {}
-
-    public LayoutConfigViewModel(RepoLayout copy) {
-        super(copy);
-    }
-
-    public String getPathToTest() {
-        return pathToTest;
-    }
-
-    public void setPathToTest(String pathToTest) {
-        this.pathToTest = pathToTest;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/layouts/LayoutGridModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/layouts/LayoutGridModel.java
deleted file mode 100644
index ea7455e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/layouts/LayoutGridModel.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.layouts;
-
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Lior Hasson
- */
-public class LayoutGridModel extends BaseModel {
-    private String name;
-    private String artifactPathPattern;
-    private LayoutActionsModel layoutActions;
-
-    public LayoutGridModel(RepoLayout repoLayout) {
-        this.name = repoLayout.getName();
-        this.artifactPathPattern = repoLayout.getArtifactPathPattern();
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getArtifactPathPattern() {
-        return artifactPathPattern;
-    }
-
-    public void setArtifactPathPattern(String artifactPathPattern) {
-        this.artifactPathPattern = artifactPathPattern;
-    }
-
-    public LayoutActionsModel getLayoutActions() {
-        return layoutActions;
-    }
-
-    public void setLayoutActions(LayoutActionsModel layoutActions) {
-        this.layoutActions = layoutActions;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/layouts/RegExResolverModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/layouts/RegExResolverModel.java
deleted file mode 100644
index 868efb0..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/layouts/RegExResolverModel.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.layouts;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Lior Hasson
- */
-public class RegExResolverModel extends BaseModel {
-    private String artifactRegEx;
-    private String descriptorRegEx;
-
-    public RegExResolverModel(String artifactRegEx, String descriptorRegEx) {
-        this.artifactRegEx = artifactRegEx;
-        this.descriptorRegEx = descriptorRegEx;
-    }
-
-    public String getArtifactRegEx() {
-        return artifactRegEx;
-    }
-
-    public void setArtifactRegEx(String artifactRegEx) {
-        this.artifactRegEx = artifactRegEx;
-    }
-
-    public String getDescriptorRegEx() {
-        return descriptorRegEx;
-    }
-
-    public void setDescriptorRegEx(String descriptorRegEx) {
-        this.descriptorRegEx = descriptorRegEx;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/layouts/RepositoryAssociationsModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/layouts/RepositoryAssociationsModel.java
deleted file mode 100644
index fa1c38b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/layouts/RepositoryAssociationsModel.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.layouts;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-import java.util.List;
-
-/**
- * @author Lior Hasson
- */
-public class RepositoryAssociationsModel extends BaseModel {
-    List<String> localRepositories;
-    List<String> remoteRepositories;
-    List<String> virtualRepositories;
-
-    public List<String> getLocalRepositories() {
-        return localRepositories;
-    }
-
-    public void setLocalRepositories(List<String> localRepositories) {
-        this.localRepositories = localRepositories;
-    }
-
-    public List<String> getRemoteRepositories() {
-        return remoteRepositories;
-    }
-
-    public void setRemoteRepositories(List<String> remoteRepositories) {
-        this.remoteRepositories = remoteRepositories;
-    }
-
-    public List<String> getVirtualRepositories() {
-        return virtualRepositories;
-    }
-
-    public void setVirtualRepositories(List<String> virtualRepositories) {
-        this.virtualRepositories = virtualRepositories;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/layouts/RepositoryLayoutModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/layouts/RepositoryLayoutModel.java
deleted file mode 100644
index e0fa91a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/layouts/RepositoryLayoutModel.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.layouts;
-
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-
-/**
- * @author Lior Hasson
- */
-public class RepositoryLayoutModel extends RepoLayout implements RestModel {
-    public RepositoryLayoutModel() {}
-
-    public RepositoryLayoutModel(RepoLayout copy) {
-        super(copy);
-    }
-
-    private RepositoryAssociationsModel repositoryAssociations;
-
-    public RepositoryAssociationsModel getRepositoryAssociations() {
-        return repositoryAssociations;
-    }
-
-    public void setRepositoryAssociations(RepositoryAssociationsModel repositoryAssociations) {
-        this.repositoryAssociations = repositoryAssociations;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/licenses/DeleteLicensesModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/licenses/DeleteLicensesModel.java
deleted file mode 100644
index fde5c84..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/licenses/DeleteLicensesModel.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.licenses;
-
-import com.google.common.collect.Lists;
-import org.artifactory.rest.common.model.RestModel;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class DeleteLicensesModel implements RestModel {
-    private List<String> licenseskeys = Lists.newArrayList();
-
-    public List<String> getLicenseskeys() {
-        return licenseskeys;
-    }
-
-    public void addLicenseKey(String licenseKey) {
-        licenseskeys.add(licenseKey);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/licenses/ExportLicense.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/licenses/ExportLicense.java
deleted file mode 100644
index fa54875..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/licenses/ExportLicense.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.licenses;
-
-import org.artifactory.rest.common.model.FileModel;
-import org.artifactory.rest.common.model.RestModel;
-
-/**
- * @author Chen Keinan
- */
-public class ExportLicense implements RestModel, FileModel {
-
-    private String licenseXMLFile;
-
-    public ExportLicense(String licenseXMLFile) {
-        this.licenseXMLFile = licenseXMLFile;
-    }
-
-    public String toString() {
-        return licenseXMLFile.toString();
-    }
-
-    @Override
-    public Object getFileResource() {
-        return licenseXMLFile;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/licenses/License.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/licenses/License.java
deleted file mode 100644
index 3da95dc..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/licenses/License.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.licenses;
-
-import org.artifactory.api.license.ArtifactLicenseModel;
-import org.artifactory.api.license.LicenseInfo;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-
-/**
- * @author Chen Kainan
- */
-public class License extends ArtifactLicenseModel implements RestModel {
-
-    private String status;
-    License() {
-    }
-
-    public License(LicenseInfo licenseInfo) {
-        if (licenseInfo != null) {
-            super.setApproved(licenseInfo.isApproved());
-            super.setComments(licenseInfo.getComments());
-            super.setLongName(licenseInfo.getLongName());
-            super.setName(licenseInfo.getName());
-            super.setRegexp(licenseInfo.getRegexp());
-            super.setUrl(licenseInfo.getUrl());
-        }
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/mail/MailServer.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/mail/MailServer.java
deleted file mode 100644
index aa5cf0a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/mail/MailServer.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.mail;
-
-import org.artifactory.descriptor.mail.MailServerDescriptor;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-
-/**
- * @author Chen Keinan
- */
-public class MailServer extends MailServerDescriptor implements RestModel {
-
-    private String testReceipt;
-
-    public String getTestReceipt() {
-        return testReceipt;
-    }
-
-    public void setTestReceipt(String testReceipt) {
-        this.testReceipt = testReceipt;
-    }
-
-    public MailServer() {
-        super.setEnabled(false);
-    }
-
-    public MailServer(MailServerDescriptor mailServerDescriptor) {
-        super.setEnabled(mailServerDescriptor.isEnabled());
-        super.setHost(mailServerDescriptor.getHost());
-        super.setPassword(mailServerDescriptor.getPassword());
-        super.setUsername(mailServerDescriptor.getUsername());
-        super.setArtifactoryUrl(mailServerDescriptor.getArtifactoryUrl());
-        super.setFrom(mailServerDescriptor.getFrom());
-        super.setPort(mailServerDescriptor.getPort());
-        super.setTls(mailServerDescriptor.isTls());
-        super.setSsl(mailServerDescriptor.isSsl());
-        super.setSubjectPrefix(mailServerDescriptor.getSubjectPrefix());
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/propertysets/AdminPropertiesModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/propertysets/AdminPropertiesModel.java
deleted file mode 100644
index 4cf9846..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/propertysets/AdminPropertiesModel.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.propertysets;
-
-import org.artifactory.descriptor.property.Property;
-import org.artifactory.descriptor.property.PropertyType;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-
-/**
- * @author Dan Feldman
- */
- at JsonIgnoreProperties({"closedPredefinedValues", "multipleChoice", "getFormattedValues", "valueCount"})
-public class AdminPropertiesModel extends Property implements RestModel {
-
-    public PropertyType propertyType; //Will be null - gets populated during serialization chain
-
-    public AdminPropertiesModel() {
-    }
-
-    public AdminPropertiesModel(Property that) {
-        this.setName(that.getName());
-        this.setPredefinedValues(that.getPredefinedValues());
-        this.setPropertyType(that.getPropertyType().toString());
-    }
-
-    public Property toProperty() {
-        return this;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/propertysets/AdminPropertySetModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/propertysets/AdminPropertySetModel.java
deleted file mode 100644
index 2726235..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/propertysets/AdminPropertySetModel.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.propertysets;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-
-import com.google.common.collect.Lists;
-
-/**
- * Model for the admin's Property Set dialog
- *
- * @author Dan Feldman
- */
- at JsonIgnoreProperties({"visible"})
-public class AdminPropertySetModel implements RestModel {
-
-    String name;
-    List<AdminPropertiesModel> properties = Lists.newArrayList();
-    Boolean visible;
-
-    public AdminPropertySetModel() {
-    }
-
-    public AdminPropertySetModel(PropertySet propertySet) {
-        this.name = propertySet.getName();
-        this.visible = propertySet.isVisible();
-        this.properties = propertySet.getProperties().stream()
-                .map(AdminPropertiesModel::new)
-                .collect(Collectors.toList());
-    }
-
-    @JsonIgnore
-    public PropertySet getPropertySetFromModel() {
-        PropertySet fromModel = new PropertySet();
-        fromModel.setName(name);
-        fromModel.setProperties(properties.stream()
-                .map(AdminPropertiesModel::toProperty)
-                .collect(Collectors.toList()));
-        return fromModel;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public List<AdminPropertiesModel> getProperties() {
-        return properties;
-    }
-
-    public void setProperties(List<AdminPropertiesModel> properties) {
-        this.properties = properties;
-    }
-
-    public Boolean getVisible() {
-        return visible;
-    }
-
-    public void setVisible(Boolean visible) {
-        this.visible = visible;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof AdminPropertySetModel)) return false;
-
-        AdminPropertySetModel that = (AdminPropertySetModel) o;
-
-        if (getName() != null ? !getName().equals(that.getName()) : that.getName() != null) return false;
-        if (getProperties() != null ? !getProperties().equals(that.getProperties()) : that.getProperties() != null)
-            return false;
-        return !(getVisible() != null ? !getVisible().equals(that.getVisible()) : that.getVisible() != null);
-
-    }
-
-    @Override
-    public int hashCode() {
-        int result = getName() != null ? getName().hashCode() : 0;
-        result = 31 * result + (getProperties() != null ? getProperties().hashCode() : 0);
-        result = 31 * result + (getVisible() != null ? getVisible().hashCode() : 0);
-        return result;
-    }
-
-    /**
-     * Serialization
-     */
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/propertysets/DeletePropertySetModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/propertysets/DeletePropertySetModel.java
deleted file mode 100644
index a319181..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/propertysets/DeletePropertySetModel.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.propertysets;
-
-import com.google.common.collect.Lists;
-import org.artifactory.rest.common.model.RestModel;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class DeletePropertySetModel implements RestModel {
-    private List<String> propertySetNames = Lists.newArrayList();
-
-    public List<String> getPropertySetNames(){
-        return propertySetNames;
-    }
-    public void addPropertySet(String propertyName) {
-        propertySetNames.add(propertyName);
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/propertysets/PropertySetNameModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/propertysets/PropertySetNameModel.java
deleted file mode 100644
index 8385618..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/propertysets/PropertySetNameModel.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.propertysets;
-
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Dan Feldman
- */
-public class PropertySetNameModel extends BaseModel {
-
-    String name;
-    Integer propertiesCount;
-
-    public PropertySetNameModel() {
-
-    }
-
-    public PropertySetNameModel(String name, int propertiesCount) {
-        this.name = name;
-        this.propertiesCount = propertiesCount;
-    }
-
-    public PropertySetNameModel(PropertySet propertySet) {
-        this.name = propertySet.getName();
-        this.propertiesCount = propertySet.getProperties().size();
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public Integer getPropertiesCount() {
-        return propertiesCount;
-    }
-
-    public void setPropertiesCount(Integer count) {
-        this.propertiesCount = count;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/proxy/Proxy.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/proxy/Proxy.java
deleted file mode 100644
index 8d40700..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/proxy/Proxy.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.proxy;
-
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-
-/**
- * @author Chen Keinan
- */
-public class Proxy extends ProxyDescriptor implements RestModel {
-
-    public Proxy() {
-    }
-
-    public Proxy(ProxyDescriptor proxyDescriptor) {
-        if (proxyDescriptor != null) {
-            super.setDefaultProxy(proxyDescriptor.isDefaultProxy());
-            super.setKey(proxyDescriptor.getKey());
-            super.setPort(proxyDescriptor.getPort());
-            super.setHost(proxyDescriptor.getHost());
-            super.setUsername(proxyDescriptor.getUsername());
-            super.setDomain(proxyDescriptor.getDomain());
-            super.setNtHost(proxyDescriptor.getNtHost());
-            super.setRedirectedToHosts(proxyDescriptor.getRedirectedToHosts());
-            super.setPassword(proxyDescriptor.getPassword());
-        }
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
-
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/registerpro/ProLicense.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/registerpro/ProLicense.java
deleted file mode 100644
index 166a95b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/registerpro/ProLicense.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.registerpro;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Chen Keinan
- */
-public class ProLicense extends BaseModel {
-
-    public ProLicense() {
-    }
-
-    public ProLicense(String[] licenseDetails, String key) {
-        if (licenseDetails != null && licenseDetails.length > 0) {
-            this.setLicenseTo(licenseDetails[0]);
-            this.setValidThough(licenseDetails[1]);
-            this.setLicenseType(licenseDetails[2]);
-            this.setKey(key);
-        }
-    }
-
-    private String key;
-    private String licenseTo;
-    private String validThough;
-    private String licenseType;
-
-    public String getKey() {
-        return key;
-    }
-
-    public void setKey(String key) {
-        this.key = key;
-    }
-
-    public String getLicenseTo() {
-        return licenseTo;
-    }
-
-    public void setLicenseTo(String licenseTo) {
-        this.licenseTo = licenseTo;
-    }
-
-    public String getValidThough() {
-        return validThough;
-    }
-
-    public void setValidThough(String validThough) {
-        this.validThough = validThough;
-    }
-
-    public String getLicenseType() {
-        return licenseType;
-    }
-
-    public void setLicenseType(String licenseType) {
-        this.licenseType = licenseType;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/AdvancedRepositoryConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/AdvancedRepositoryConfigModel.java
deleted file mode 100644
index 0749e77..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/AdvancedRepositoryConfigModel.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository;
-
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.ui.rest.model.admin.configuration.propertysets.PropertySetNameModel;
-import org.artifactory.ui.rest.model.admin.configuration.reverseProxy.ReverseProxyRepoModel;
-
-import java.util.List;
-
-/**
- * @author Dan Feldman
- */
-public interface AdvancedRepositoryConfigModel extends RestModel {
-
-    List<PropertySetNameModel> getPropertySets();
-
-    void setPropertySets(List<PropertySetNameModel> propertySets);
-
-    Boolean isBlackedOut();
-
-    void setBlackedOut(Boolean blackedOut);
-
-    Boolean getAllowContentBrowsing();
-
-    void setAllowContentBrowsing(Boolean allowContentBrowsing);
-
-    ReverseProxyRepoModel getReverseProxy();
-
-    void setReverseProxy(ReverseProxyRepoModel reverseProxy);
-
-    String toString();
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/BasicRepositoryConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/BasicRepositoryConfigModel.java
deleted file mode 100644
index 9862242..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/BasicRepositoryConfigModel.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository;
-
-import org.artifactory.rest.common.model.RestModel;
-
-/**
- * @author Dan Feldman
- */
-public interface BasicRepositoryConfigModel extends RestModel {
-
-    void setPublicDescription(String publicDescription);
-
-    String getPublicDescription();
-
-    void setInternalDescription(String internalDescription);
-
-    String getInternalDescription();
-
-    String getIncludesPattern();
-
-    void setIncludesPattern(String includesPattern);
-
-    String getExcludesPattern();
-
-    void setExcludesPattern(String excludesPattern);
-
-    String getLayout();
-
-    void setLayout(String layout);
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/GeneralRepositoryConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/GeneralRepositoryConfigModel.java
deleted file mode 100644
index 224d439..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/GeneralRepositoryConfigModel.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository;
-
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-
-/**
- * @author Dan Feldman
- * @author Aviad Shikloshi
- */
-public class GeneralRepositoryConfigModel implements RestModel {
-
-    protected String repoKey;
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/RepoConfigDefaultValues.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/RepoConfigDefaultValues.java
deleted file mode 100644
index cfa6587..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/RepoConfigDefaultValues.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository;
-
-import org.artifactory.descriptor.delegation.ContentSynchronisation;
-import org.artifactory.descriptor.repo.*;
-import org.artifactory.descriptor.repo.vcs.VcsGitProvider;
-import org.artifactory.descriptor.repo.vcs.VcsType;
-
-/**
- * @author Dan Feldman
- */
-public abstract class RepoConfigDefaultValues {
-
-    //local basic
-    public static final String DEFAULT_INCLUDES_PATTERN = "**/*";
-    public static final String DEFAULT_REPO_LAYOUT = "simple-default";
-
-    //local advanced
-    public static final boolean DEFAULT_BLACKED_OUT = false;
-    public static final boolean DEFAULT_ALLOW_CONTENT_BROWSING = false;
-
-    //remote basic
-    public static final boolean DEFAULT_OFFLINE = false;
-    public static final ContentSynchronisation DEFAULT_DELEGATION_CONTEXT = null;
-
-    //remote advanced
-    public static final boolean DEFAULT_HARD_FAIL = false;
-    public static final boolean DEFAULT_STORE_ARTIFACTS_LOCALLY = true;
-    public static final boolean DEFAULT_SYNC_PROPERTIES = false;
-    public static final boolean DEFAULT_SHARE_CONFIG = false;
-    public static final boolean DEFAULT_BLOCK_MISMATCHING_MIME_TYPES = true;
-
-    public static final boolean DEFAULT_LIST_REMOTE_ITEMS_SUPPORTED_TYPE = true;
-    public static final boolean DEFAULT_LIST_REMOTE_ITEMS_UNSUPPORTED_TYPE = false;
-
-    //network
-    public static final int DEFAULT_SOCKET_TIMEOUT = 15000;
-    public static final boolean DEFAULT_LENIENENT_HOST_AUTH = false;
-    public static final boolean DEFAULT_COOKIE_MANAGEMENT = false;
-
-    //cache
-    public static final int DEFAULT_KEEP_UNUSED_ARTIFACTS = 0;
-    public static final long DEFAULT_RETRIEVAL_CACHE_PERIOD = 600;
-    public static final long DEFAULT_ASSUMED_OFFLINE = 300;
-    public static final long DEFAULT_MISSED_RETRIEVAL_PERIOD = 1800;
-
-    //replication
-    public static final boolean DEFAULT_LOCAL_REPLICATION_ENABLED = true;
-    public static final boolean DEFAULT_REMOTE_REPLICATION_ENABLED = false;
-    public static final boolean DEFAULT_EVENT_REPLICATION = false;
-    public static final boolean DEFAULT_REPLICATION_SYNC_DELETES = false;
-
-    //virtual
-    public static final boolean DEFAULT_VIRTUAL_CAN_RETRIEVE_FROM_REMOTE = false;
-
-    //distribution
-    public static final boolean DEFAULT_GPG_SIGN = false;
-    public static final boolean DEFAULT_NEW_BINTRAY_REPO_PRIVATE = true;
-    public static final boolean DEFAULT_NEW_BINTRAY_REPO_PREMIUM = true;
-
-    //bower
-    public static final String DEFAULT_BOWER_REGISTRY = "https://bower.herokuapp.com";
-
-    //CocoaPods
-    public static final String DEFAULT_PODS_SPECS_REPO = "https://github.com/CocoaPods/Specs";
-
-    //debian
-    public static final boolean DEFAULT_DEB_TRIVIAL_LAYOUT = false;
-
-    //docker
-    public static final DockerApiVersion DEFAULT_DOCKER_API_VER = DockerApiVersion.V2;
-    public static final boolean DEFAULT_TOKEN_AUTH = true;
-    public static final boolean DEFAULT_FORCE_DOCKER_AUTH = false;
-
-    //maven / gradle / ivy / sbt
-    public static final int DEFAULT_MAX_UNIQUE_SNAPSHOTS = 0;
-    public static final boolean DEFAULT_HANDLE_RELEASES = true;
-    public static final boolean DEFAULT_HANDLE_SNAPSHOTS = true;
-    public static final boolean DEFAULT_SUPPRESS_POM_CHECKS = true;
-    public static final boolean DEFAULT_SUPPRESS_POM_CHECKS_MAVEN = false;
-    public static final SnapshotVersionBehavior DEFAULT_SNAPSHOT_BEHAVIOR = SnapshotVersionBehavior.UNIQUE;
-    public static final LocalRepoChecksumPolicyType DEFAULT_CHECKSUM_POLICY = LocalRepoChecksumPolicyType.CLIENT;
-    public static final boolean DEFAULT_EAGERLY_FETCH_JARS = false;
-    public static final boolean DEFAULT_EAGERLY_FETCH_SOURCES = false;
-    public static final ChecksumPolicyType DEFAULT_REMOTE_CHECKSUM_POLICY = ChecksumPolicyType.GEN_IF_ABSENT;
-    public static final boolean DEFAULT_REJECT_INVALID_JARS = false;
-    public static final PomCleanupPolicy DEFAULT_POM_CLEANUP_POLICY = PomCleanupPolicy.discard_active_reference;
-
-    //nuget
-    public static final String DEFAULT_NUGET_FEED_PATH = "api/v2";
-    public static final String DEFAULT_NUGET_DOWNLOAD_PATH = "api/v2/package";
-    public static final boolean DEFAULT_FORCE_NUGET_AUTH = false;
-
-    //vcs
-    public static final VcsType DEFAULT_VCS_TYPE = VcsType.GIT;
-    public static final VcsGitProvider DEFAULT_GIT_PROVIDER = VcsGitProvider.GITHUB;
-    public static final VcsGitConfiguration DEFAULT_VCS_GIT_CONFIG = new VcsGitConfiguration();
-
-    //yum
-    public static final int DEFAULT_YUM_METADATA_DEPTH = 0;
-    public static final String DEFAULT_YUM_GROUPFILE_NAME = "groups.xml";
-    public static final boolean DEFAULT_YUM_AUTO_CALCULATE = true;
-
-    // default remote registry urls
-    public static final String NUGET_URL = "https://www.nuget.org/";
-    public static final String RUBYGEMS_URL = "https://rubygems.org/";
-    public static final String MAVEN_GROUP_URL = "https://jcenter.bintray.com";
-    public static final String NPM_URL = "https://registry.npmjs.org";
-    public static final String PYPI_URL = "https://pypi.python.org";
-    public static final String DOCKER_URL = "https://registry-1.docker.io/";
-    public static final String VCS_URL = "https://github.com/";
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/RepositoryConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/RepositoryConfigModel.java
deleted file mode 100644
index 92ada44..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/RepositoryConfigModel.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository;
-
-import org.artifactory.descriptor.repo.RepoBaseDescriptor;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.ReverseProxyDescriptor;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.distribution.DistributionRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.local.LocalRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.RemoteRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.replication.RepositoryReplicationConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.typespecific.TypeSpecificConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.virtual.VirtualRepositoryConfigModel;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.CreateRepoConfigHelper;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.UpdateRepoConfigHelper;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.builder.RepoConfigDescriptorBuilder;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.builder.RepoConfigModelBuilder;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.exception.RepoConfigException;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.validator.RepoConfigValidator;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonSubTypes;
-import org.codehaus.jackson.annotate.JsonTypeInfo;
-
-import java.io.IOException;
-import java.util.List;
-
-/**
- * @author Dan Feldman
- * @author Aviad Shikloshi
- */
-// TODO: [by dan] we need visible = true (Jackson 2) to see the type property, so we are forced to use instanceof
- at JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
- at JsonSubTypes({
-        @JsonSubTypes.Type(value = LocalRepositoryConfigModel.class, name = "localRepoConfig"),
-        @JsonSubTypes.Type(value = RemoteRepositoryConfigModel.class, name = "remoteRepoConfig"),
-        @JsonSubTypes.Type(value = VirtualRepositoryConfigModel.class, name = "virtualRepoConfig"),
-        @JsonSubTypes.Type(value = DistributionRepositoryConfigModel.class, name = "distributionRepoConfig")
-})
-public interface RepositoryConfigModel<B extends BasicRepositoryConfigModel, A extends AdvancedRepositoryConfigModel,
-        R extends RepositoryReplicationConfigModel> extends RestModel {
-
-    GeneralRepositoryConfigModel getGeneral();
-
-    void setGeneral(GeneralRepositoryConfigModel general);
-
-    B getBasic();
-
-    void setBasic(B basic);
-
-    A getAdvanced();
-
-    void setAdvanced(A advanced);
-
-    List<R> getReplications();
-
-    void setReplications(List<R> replication);
-
-    TypeSpecificConfigModel getTypeSpecific();
-
-    void setTypeSpecific(TypeSpecificConfigModel typeSpecific);
-
-
-    ReverseProxyDescriptor getReverseProxyDescriptor(RepoBaseDescriptor repoDescriptor,
-                              RepoConfigDescriptorBuilder builder);
-
-    /**
-     * Uses the builder to produce a descriptor from this model
-     */
-    @JsonIgnore
-    RepoDescriptor toDescriptor(RepoConfigValidator validator, RepoConfigDescriptorBuilder builder)
-            throws RepoConfigException;
-
-    @JsonIgnore
-    RepositoryConfigModel fromDescriptor(RepoConfigModelBuilder builder, RepoDescriptor descriptor);
-
-    @JsonIgnore
-    void createRepo(CreateRepoConfigHelper creator) throws IOException, RepoConfigException;
-
-    @JsonIgnore
-    void updateRepo(UpdateRepoConfigHelper updater) throws IOException, RepoConfigException;
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/RepositoryNetworkConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/RepositoryNetworkConfigModel.java
deleted file mode 100644
index 60d491c..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/RepositoryNetworkConfigModel.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository;
-
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.DEFAULT_SOCKET_TIMEOUT;
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.DEFAULT_SYNC_PROPERTIES;
-
-/**
- * @author Aviad Shikloshi
- * @author Dan Feldman
- */
-public class RepositoryNetworkConfigModel implements RestModel {
-
-    protected String url;
-    protected String username;
-    protected String password;
-    protected String proxy;
-    protected Integer socketTimeout = DEFAULT_SOCKET_TIMEOUT;
-    protected Boolean syncProperties = DEFAULT_SYNC_PROPERTIES;
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    public String getUsername() {
-        return username;
-    }
-
-    public void setUsername(String username) {
-        this.username = username;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public void setPassword(String password) {
-        this.password = password;
-    }
-
-    public String getProxy() {
-        return proxy;
-    }
-
-    public void setProxy(String proxy) {
-        this.proxy = proxy;
-    }
-
-    public Integer getSocketTimeout() {
-        return socketTimeout;
-    }
-
-    public void setSocketTimeout(Integer socketTimeout) {
-        this.socketTimeout = socketTimeout;
-    }
-
-    public Boolean isSyncProperties() {
-        return syncProperties;
-    }
-
-    public void setSyncProperties(Boolean syncProperties) {
-        this.syncProperties = syncProperties;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/distribution/DistributionAdvancedRepositoryConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/distribution/DistributionAdvancedRepositoryConfigModel.java
deleted file mode 100644
index f289785..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/distribution/DistributionAdvancedRepositoryConfigModel.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.distribution;
-
-import com.google.common.collect.Lists;
-import org.artifactory.descriptor.repo.distribution.rule.DistributionRule;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.admin.configuration.repository.local.LocalAdvancedRepositoryConfigModel;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.DEFAULT_GPG_SIGN;
-
-/**
- * @author Dan Feldman
- */
-public class DistributionAdvancedRepositoryConfigModel extends LocalAdvancedRepositoryConfigModel {
-
-    private List<DistributionRule> distributionRules = Lists.newArrayList();
-    private String proxy;
-    private boolean gpgSign = DEFAULT_GPG_SIGN;
-    private String gpgPassPhrase;
-    private Set<String> whiteListedProperties = new HashSet<>();
-
-    public List<DistributionRule> getDistributionRules() {
-        return distributionRules;
-    }
-
-    public void setDistributionRules(List<DistributionRule> distributionRules) {
-        this.distributionRules = distributionRules;
-    }
-
-    public String getProxy() {
-        return proxy;
-    }
-
-    public void setProxy(String proxy) {
-        this.proxy = proxy;
-    }
-
-    public Set<String> getWhiteListedProperties() {
-        return whiteListedProperties;
-    }
-
-    public void setWhiteListedProperties(Set<String> whiteListedProperties) {
-        this.whiteListedProperties = whiteListedProperties;
-    }
-
-    public boolean isGpgSign() {
-        return gpgSign;
-    }
-
-    public void setGpgSign(boolean gpgSign) {
-        this.gpgSign = gpgSign;
-    }
-
-    public String getGpgPassPhrase() {
-        return gpgPassPhrase;
-    }
-
-    public void setGpgPassPhrase(String gpgPassPhrase) {
-        this.gpgPassPhrase = gpgPassPhrase;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/distribution/DistributionBasicRepositoryConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/distribution/DistributionBasicRepositoryConfigModel.java
deleted file mode 100644
index 01523d6..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/distribution/DistributionBasicRepositoryConfigModel.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.distribution;
-
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.admin.configuration.repository.local.LocalBasicRepositoryConfigModel;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.*;
-
-/**
- * @author Dan Feldman
- */
-public class DistributionBasicRepositoryConfigModel extends LocalBasicRepositoryConfigModel {
-
-    protected String layout = DEFAULT_REPO_LAYOUT;
-    private String productName;
-    private boolean defaultNewRepoPrivate = DEFAULT_NEW_BINTRAY_REPO_PRIVATE;
-    private boolean defaultNewRepoPremium = DEFAULT_NEW_BINTRAY_REPO_PREMIUM;
-    private Set<String> defaultLicenses = new HashSet<>();
-    private String defaultVcsUrl;
-
-    @Override
-    public String getLayout() {
-        return layout;
-    }
-
-    @Override
-    public void setLayout(String layout) {
-        //Always generic
-    }
-
-    public String getProductName() {
-        return productName;
-    }
-
-    public void setProductName(String productName) {
-        this.productName = productName;
-    }
-
-    public boolean getDefaultNewRepoPrivate() {
-        return defaultNewRepoPrivate;
-    }
-
-    public void setDefaultNewRepoPrivate(boolean defaultNewRepoPrivate) {
-        this.defaultNewRepoPrivate = defaultNewRepoPrivate;
-    }
-
-    public boolean getDefaultNewRepoPremium() {
-        return defaultNewRepoPremium;
-    }
-
-    public void setDefaultNewRepoPremium(boolean defaultNewRepoPremium) {
-        this.defaultNewRepoPremium = defaultNewRepoPremium;
-    }
-
-    public Set<String> getDefaultLicenses() {
-        return defaultLicenses;
-    }
-
-    public void setDefaultLicenses(Set<String> defaultLicenses) {
-        this.defaultLicenses = defaultLicenses;
-    }
-
-    public String getDefaultVcsUrl() {
-        return defaultVcsUrl;
-    }
-
-    public void setDefaultVcsUrl(String defaultVcsUrl) {
-        this.defaultVcsUrl = defaultVcsUrl;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/distribution/DistributionRepositoryConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/distribution/DistributionRepositoryConfigModel.java
deleted file mode 100644
index 6f5755e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/distribution/DistributionRepositoryConfigModel.java
+++ /dev/null
@@ -1,122 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.distribution;
-
-import org.artifactory.descriptor.repo.*;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.admin.configuration.repository.GeneralRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.RepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.replication.local.LocalReplicationConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.typespecific.DistRepoTypeSpecificConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.typespecific.TypeSpecificConfigModel;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.CreateRepoConfigHelper;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.UpdateRepoConfigHelper;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.builder.RepoConfigDescriptorBuilder;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.builder.RepoConfigModelBuilder;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.exception.RepoConfigException;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.validator.RepoConfigValidator;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Dan Feldman
- */
- at JsonTypeName("distributionRepoConfig")
-public class DistributionRepositoryConfigModel implements RepositoryConfigModel<DistributionBasicRepositoryConfigModel,
-        DistributionAdvancedRepositoryConfigModel, LocalReplicationConfigModel> {
-
-    protected GeneralRepositoryConfigModel general;
-    protected DistributionBasicRepositoryConfigModel basic;
-    protected DistributionAdvancedRepositoryConfigModel advanced;
-    private List<LocalReplicationConfigModel> replications = new ArrayList<>(); //TODO [by dan]: replications?
-    private DistRepoTypeSpecificConfigModel typeSpecific;
-
-    @Override
-    public GeneralRepositoryConfigModel getGeneral() {
-        return general;
-    }
-
-    @Override
-    public void setGeneral(GeneralRepositoryConfigModel general) {
-        this.general = general;
-    }
-
-    @Override
-    public DistributionBasicRepositoryConfigModel getBasic() {
-        return basic;
-    }
-
-    @Override
-    public void setBasic(DistributionBasicRepositoryConfigModel basic) {
-        this.basic = basic;
-    }
-
-    @Override
-    public DistributionAdvancedRepositoryConfigModel getAdvanced() {
-        return advanced;
-    }
-
-    @Override
-    public void setAdvanced(DistributionAdvancedRepositoryConfigModel advanced) {
-        this.advanced = advanced;
-    }
-
-    @Override
-    public List<LocalReplicationConfigModel> getReplications() {
-        return replications;
-    }
-
-    @Override
-    public void setReplications(List<LocalReplicationConfigModel> replication) {
-        //TODO [by dan]:
-    }
-
-    @Override
-    public DistRepoTypeSpecificConfigModel getTypeSpecific() {
-        return typeSpecific;
-    }
-
-    @Override
-    public void setTypeSpecific(TypeSpecificConfigModel typeSpecific) {
-        if (!(typeSpecific instanceof DistRepoTypeSpecificConfigModel)) {
-            throw new RuntimeException("Type specific configuration for Distribution repo must be Distribution type.");
-        }
-        this.typeSpecific = (DistRepoTypeSpecificConfigModel) typeSpecific;
-    }
-
-    @Override
-    public ReverseProxyDescriptor getReverseProxyDescriptor(RepoBaseDescriptor repoDescriptor,
-            RepoConfigDescriptorBuilder builder) {
-        return builder.buildReverseProxyDescriptor(this.advanced, repoDescriptor);
-    }
-
-    @Override
-    public DistributionRepoDescriptor toDescriptor(RepoConfigValidator validator, RepoConfigDescriptorBuilder builder)
-            throws RepoConfigException {
-        validator.validateDistribution(this);
-        return builder.buildDistributionDescriptor(this);
-    }
-
-    @Override
-    public DistributionRepositoryConfigModel fromDescriptor(RepoConfigModelBuilder builder, RepoDescriptor descriptor) {
-        builder.populateDistributionDescriptorValuesToModel((DistributionRepoDescriptor)descriptor, this);
-        return this;
-    }
-
-    @Override
-    public void createRepo(CreateRepoConfigHelper creator) throws IOException, RepoConfigException {
-        creator.handleDistribution(this);
-    }
-
-    @Override
-    public void updateRepo(UpdateRepoConfigHelper updater) throws IOException, RepoConfigException {
-        updater.handleDistribution(this);
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/distribution/rule/DistributionCoordinatesModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/distribution/rule/DistributionCoordinatesModel.java
deleted file mode 100644
index 1647d29..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/distribution/rule/DistributionCoordinatesModel.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.distribution.rule;
-
-import org.artifactory.descriptor.repo.distribution.DistributionCoordinates;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-
-import static org.artifactory.util.distribution.DistributionConstants.PATH_TOKEN;
-
-
-/**
- * @author Dan Feldman
- */
-public class DistributionCoordinatesModel implements RestModel {
-
-    private String repo;
-    private String pkg;
-    private String version;
-    private String path = PATH_TOKEN;
-
-    public DistributionCoordinatesModel() {
-
-    }
-
-    public DistributionCoordinatesModel(DistributionCoordinates coordinates) {
-        this.repo = coordinates.getRepo();
-        this.pkg = coordinates.getPkg();
-        this.version = coordinates.getVersion();
-        this.path = coordinates.getPath();
-    }
-
-    public DistributionCoordinates toCoordinates() {
-        return new DistributionCoordinates(this.repo, this.pkg, this.version, this.path);
-    }
-
-
-    public String getRepo() {
-        return repo;
-    }
-
-    public void setRepo(String repo) {
-        this.repo = repo;
-    }
-
-    public String getPkg() {
-        return pkg;
-    }
-
-    public void setPkg(String pkg) {
-        this.pkg = pkg;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/distribution/rule/DistributionRuleModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/distribution/rule/DistributionRuleModel.java
deleted file mode 100644
index 49f82a9..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/distribution/rule/DistributionRuleModel.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.distribution.rule;
-
-import org.artifactory.api.bintray.distribution.rule.DistributionRuleTokens;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.descriptor.repo.distribution.rule.DistributionRule;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author Dan Feldman
- */
-public class DistributionRuleModel implements RestModel {
-
-    private String name;
-    private String packageType;
-    private String repoFilter;
-    private String pathFilter;
-    private DistributionCoordinatesModel distributionCoordinates;
-    private List<DistributionRuleTokenModel> availableTokens;
-
-    public DistributionRuleModel() {
-
-    }
-
-    public DistributionRuleModel(DistributionRule distRule) {
-        this.name = distRule.getName();
-        this.packageType = distRule.getType().name();
-        this.repoFilter = distRule.getRepoFilter();
-        this.pathFilter = distRule.getPathFilter();
-        this.distributionCoordinates = new DistributionCoordinatesModel(distRule.getDistributionCoordinates());
-        this.availableTokens = DistributionRuleTokens.tokensByType(distRule.getType())
-                .stream()
-                .map(DistributionRuleTokenModel::new)
-                .collect(Collectors.toList());
-        this.availableTokens.add(new DistributionRuleTokenModel(DistributionRuleTokens.getProductNameToken()));
-    }
-
-    public static DistributionRule ruleFromModel(DistributionRuleModel model) {
-        DistributionRule rule = new DistributionRule();
-        rule.setName(model.name);
-        rule.setType(RepoType.fromType(model.packageType));
-        rule.setRepoFilter(model.repoFilter);
-        rule.setPathFilter(model.pathFilter);
-        rule.setDistributionCoordinates(model.distributionCoordinates.toCoordinates());
-        return rule;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getPackageType() {
-        return packageType;
-    }
-
-    public void setPackageType(String packageType) {
-        this.packageType = packageType;
-    }
-
-    public String getRepoFilter() {
-        return repoFilter;
-    }
-
-    public void setRepoFilter(String repoFilter) {
-        this.repoFilter = repoFilter;
-    }
-
-    public String getPathFilter() {
-        return pathFilter;
-    }
-
-    public void setPathFilter(String pathFilter) {
-        this.pathFilter = pathFilter;
-    }
-
-    public DistributionCoordinatesModel getDistributionCoordinates() {
-        return distributionCoordinates;
-    }
-
-    public void setDistributionCoordinates(DistributionCoordinatesModel distributionCoordinates) {
-        this.distributionCoordinates = distributionCoordinates;
-    }
-
-    public List<DistributionRuleTokenModel> getAvailableTokens() {
-        return availableTokens;
-    }
-
-    public void setAvailableTokens(List<DistributionRuleTokenModel> availableTokens) {
-        this.availableTokens = availableTokens;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/distribution/rule/DistributionRuleTokenModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/distribution/rule/DistributionRuleTokenModel.java
deleted file mode 100644
index 6f5c008..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/distribution/rule/DistributionRuleTokenModel.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.distribution.rule;
-
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.api.bintray.distribution.rule.DistributionRuleToken;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-
-/**
- * @author Dan Feldman
- */
-public class DistributionRuleTokenModel implements DistributionRuleToken, RestModel {
-
-    private String token;
-    private String value;
-
-    public DistributionRuleTokenModel() {
-
-    }
-
-    public DistributionRuleTokenModel(DistributionRuleToken distToken) {
-        this.token = distToken.getToken();
-        this.value = distToken.getValue();
-    }
-
-    @Override
-    public String getToken() {
-        return token;
-    }
-
-    @Override
-    public String getValue() {
-        return value;
-    }
-
-    @Override
-    public void populateValue(RepoPath path, Properties pathProperties) {
-        //No need to set value on the model itself.
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/AvailableRepositories.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/AvailableRepositories.java
deleted file mode 100644
index 45f8919..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/AvailableRepositories.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.info;
-
-import org.artifactory.api.rest.restmodel.JsonUtil;
-import org.artifactory.rest.common.model.RestModel;
-
-import java.util.List;
-
-/**
- * @author Aviad Shikloshi
- */
-public class AvailableRepositories implements RestModel {
-
-    private List<String> availableLocalRepos;
-    private List<String> availableRemoteRepos;
-    private List<String> availableVirtualRepos;
-
-    public AvailableRepositories() {
-    }
-
-    public AvailableRepositories(List<String> availableLocalRepos, List<String> availableRemoteRepos,
-            List<String> availableVirtualRepos) {
-        this.availableLocalRepos = availableLocalRepos;
-        this.availableRemoteRepos = availableRemoteRepos;
-        this.availableVirtualRepos = availableVirtualRepos;
-    }
-
-    public List<String> getAvailableLocalRepos() {
-        return availableLocalRepos;
-    }
-
-    public List<String> getAvailableRemoteRepos() {
-        return availableRemoteRepos;
-    }
-
-    public List<String> getAvailableVirtualRepos() {
-        return availableVirtualRepos;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/DistributionRepositoryInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/DistributionRepositoryInfo.java
deleted file mode 100644
index 16a0d62..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/DistributionRepositoryInfo.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.info;
-
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-
-/**
- * @author Dan Feldman
- */
-public class DistributionRepositoryInfo extends RepositoryInfo {
-
-    private String visibility;
-
-    public DistributionRepositoryInfo() {
-    }
-
-    public DistributionRepositoryInfo(DistributionRepoDescriptor descriptor) {
-        repoKey = descriptor.getKey();
-        repoType = descriptor.getType().toString();
-        hasReindexAction = false;
-        visibility = descriptor.getDefaultNewRepoPrivate() ? "Private" : "Public";
-    }
-
-    public String getVisibility() {
-        return visibility;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/LocalRepositoryInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/LocalRepositoryInfo.java
deleted file mode 100644
index 799b5a2..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/LocalRepositoryInfo.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.info;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.replication.ReplicationBaseDescriptor;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.ui.utils.RegExUtils;
-
-/**
- * @author Aviad Shikloshi
- */
-public class LocalRepositoryInfo extends RepositoryInfo {
-
-    private Boolean replications;
-
-    public LocalRepositoryInfo() {
-    }
-
-    public LocalRepositoryInfo(LocalRepoDescriptor repoDescriptor, CentralConfigService configService) {
-        repoKey = repoDescriptor.getKey();
-        repoType = repoDescriptor.getType().toString();
-        // checks if there is at least one enabled replication
-        replications = (configService.getDescriptor().getMultiLocalReplications(repoKey).stream()
-                .filter(ReplicationBaseDescriptor::isEnabled).findFirst().isPresent());
-        hasReindexAction = RegExUtils.LOCAL_REPO_REINDEX_PATTERN.matcher(repoType).matches();
-    }
-
-    public Boolean getReplications() {
-        return replications;
-    }
-
-    public void setReplications(Boolean replications) {
-        this.replications = replications;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/RemoteRepositoryInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/RemoteRepositoryInfo.java
deleted file mode 100644
index 116ba6f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/RemoteRepositoryInfo.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.info;
-
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.replication.RemoteReplicationDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.ui.utils.RegExUtils;
-
-/**
- * @author Aviad Shikloshi
- */
-public class RemoteRepositoryInfo extends RepositoryInfo {
-
-    private String url;
-    private Boolean hasEnabledReplication; //for 'run now' in grid actions
-    private Boolean blackedOut;
-    private Boolean offline;
-
-    public RemoteRepositoryInfo() {
-    }
-
-    public RemoteRepositoryInfo(RemoteRepoDescriptor remoteDesc, CentralConfigDescriptor configDescriptor) {
-        repoKey = remoteDesc.getKey();
-        repoType = remoteDesc.getType().toString();
-        url = remoteDesc.getUrl();
-        RemoteReplicationDescriptor replication = configDescriptor.getRemoteReplication(repoKey);
-        hasEnabledReplication = (replication != null && replication.isEnabled());
-        blackedOut = remoteDesc.isBlackedOut();
-        offline = remoteDesc.isOffline();
-        hasReindexAction = RegExUtils.REMOTE_REPO_REINDEX_PATTERN.matcher(repoType).matches();
-    }
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    public Boolean isHasEnabledReplication() {
-        return hasEnabledReplication;
-    }
-
-    public void setHasEnabledReplication(Boolean replication) {
-        this.hasEnabledReplication = replication;
-    }
-
-    public Boolean isBlackedOut() {
-        return blackedOut;
-    }
-
-    public void setBlackedOut(Boolean enabled) {
-        this.blackedOut = enabled;
-    }
-
-    public Boolean getOffline() {
-        return offline;
-    }
-
-    public void setOffline(Boolean offline) {
-        this.offline = offline;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/RepositoryDefaultValuesModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/RepositoryDefaultValuesModel.java
deleted file mode 100644
index 6882281..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/RepositoryDefaultValuesModel.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.info;
-
-import com.google.common.collect.Maps;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.distribution.DistributionAdvancedRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.local.LocalAdvancedRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.local.LocalBasicRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.RemoteAdvancedRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.RemoteBasicRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.RemoteCacheRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.RemoteNetworkRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.typespecific.*;
-import org.artifactory.ui.rest.model.admin.configuration.repository.virtual.VirtualAdvancedRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.virtual.VirtualBasicRepositoryConfigModel;
-
-import java.util.Map;
-
-/**
- * @author Dan Feldman
- */
-public class RepositoryDefaultValuesModel {
-
-    private Map<String, RestModel> defaultModels = Maps.newHashMap();
-
-    public RepositoryDefaultValuesModel() {
-        // Construct models with default values
-        defaultModels.put("localBasic", new LocalBasicRepositoryConfigModel());
-        defaultModels.put("localAdvanced", new LocalAdvancedRepositoryConfigModel());
-        defaultModels.put("remoteBasic", new RemoteBasicRepositoryConfigModel());
-        defaultModels.put("remoteAdvanced", new RemoteAdvancedRepositoryConfigModel());
-        defaultModels.put("virtualBasic", new VirtualBasicRepositoryConfigModel());
-        defaultModels.put("virtualAdvanced", new VirtualAdvancedRepositoryConfigModel());
-        defaultModels.put("network", new RemoteNetworkRepositoryConfigModel());
-        defaultModels.put("cache", new RemoteCacheRepositoryConfigModel());
-        defaultModels.put("bower", new BowerTypeSpecificConfigModel());
-        defaultModels.put("cocoapods", new CocoaPodsTypeSpecificConfigModel());
-        defaultModels.put("gradle", new GradleTypeSpecificConfigModel());
-        defaultModels.put("ivy", new IvyTypeSpecificConfigModel());
-        defaultModels.put("debian", new DebTypeSpecificConfigModel());
-        defaultModels.put("distribution", new DistRepoTypeSpecificConfigModel());
-        defaultModels.put("distributionAdvanced", new DistributionAdvancedRepositoryConfigModel());
-        defaultModels.put("docker", new DockerTypeSpecificConfigModel());
-        defaultModels.put("gradle", new GradleTypeSpecificConfigModel());
-        defaultModels.put("ivy", new IvyTypeSpecificConfigModel());
-        defaultModels.put("maven", new MavenTypeSpecificConfigModel());
-        defaultModels.put("nuget", new NugetTypeSpecificConfigModel());
-        defaultModels.put("npm", new NpmTypeSpecificConfigModel());
-        defaultModels.put("p2", new P2TypeSpecificConfigModel());
-        defaultModels.put("sbt", new SbtTypeSpecificConfigModel());
-        defaultModels.put("vcs", new VcsTypeSpecificConfigModel());
-        defaultModels.put("yum", new YumTypeSpecificConfigModel());
-        defaultModels.put("pypi", new PypiTypeSpecificConfigModel());
-        defaultModels.put("generic", new GenericTypeSpecificConfigModel());
-        defaultModels.put("gems", new GemsTypeSpecificConfigModel());
-    }
-
-    public Map<String, RestModel> getDefaultModels() {
-        return defaultModels;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/RepositoryFieldsValuesModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/RepositoryFieldsValuesModel.java
deleted file mode 100644
index e9ff7e9..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/RepositoryFieldsValuesModel.java
+++ /dev/null
@@ -1,156 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.info;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.webstart.ArtifactWebstartAddon;
-import org.artifactory.api.bintray.distribution.rule.DistributionRuleToken;
-import org.artifactory.api.bintray.distribution.rule.DistributionRuleTokens;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.repo.*;
-import org.artifactory.descriptor.repo.distribution.rule.DefaultDistributionRules;
-import org.artifactory.descriptor.repo.distribution.rule.DistributionRule;
-import org.artifactory.util.RepoLayoutUtils;
-import org.artifactory.util.distribution.DistributionConstants;
-
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-/**
- * @author Aviad Shikloshi
- */
-public class RepositoryFieldsValuesModel {
-
-    private List<String> repositoryLayouts;
-    private List<String> packageTypes;
-    private List<String> webStartKeyPairs;
-    private List<String> availableLocalRepos;
-    private List<String> availableRemoteRepos;
-    private List<String> availableVirtualRepos;
-    private List<String> proxies;
-    private String defaultProxy;
-    private Map<RepoType, List<String>> distributionTokensByType;
-    private Map<String, List<String>> distributionTokensByLayout;
-    private List<DistributionRule> distributionDefaultRules;
-    private List<DistributionRule> distributionDefaultProductRules;
-
-    public RepositoryFieldsValuesModel(CentralConfigDescriptor descriptor, RepositoryService repositoryService) {
-        repositoryLayouts = descriptor.getRepoLayouts().stream()
-                .map(RepoLayout::getName)
-                .collect(Collectors.toList());
-
-        packageTypes = Lists.newArrayList(RepoType.values()).stream()
-                .map(RepoType::name)
-                .collect(Collectors.toList());
-
-        webStartKeyPairs = ContextHelper.get().beanForType(AddonsManager.class).addonByType(ArtifactWebstartAddon.class)
-                .getKeyPairNames();
-
-        availableLocalRepos = repositoryService.getLocalRepoDescriptors().stream()
-                .map(LocalRepoDescriptor::getKey)
-                .collect(Collectors.toList());
-
-        availableRemoteRepos = repositoryService.getRemoteRepoDescriptors().stream()
-                .map(RemoteRepoDescriptor::getKey)
-                .collect(Collectors.toList());
-
-        availableVirtualRepos = repositoryService.getVirtualRepoDescriptors()
-                .stream()
-                .map(VirtualRepoDescriptor::getKey)
-                .collect(Collectors.toList());
-
-        CentralConfigDescriptor centralDescriptor = ContextHelper.get().beanForType(CentralConfigService.class)
-                .getDescriptor();
-
-        proxies = Lists.newArrayList(centralDescriptor.getProxies().stream()
-                .map(ProxyDescriptor::getKey)
-                .collect(Collectors.toList()));
-
-        ProxyDescriptor proxy = descriptor.getDefaultProxy();
-        if (proxy != null) {
-            defaultProxy = proxy.getKey();
-        }
-
-        distributionTokensByType = Maps.newHashMap();
-        for (RepoType type : RepoType.values()) {
-            List<String> models = DistributionRuleTokens.tokensByType(type)
-                    .stream()
-                    .map(DistributionRuleToken::getToken)
-                    .collect(Collectors.toList());
-            models.add(DistributionRuleTokens.getProductNameToken().getToken());
-            distributionTokensByType.put(type, models);
-        }
-
-        distributionTokensByLayout = populateLayoutTokens(centralDescriptor);
-
-        distributionDefaultRules = DefaultDistributionRules.getDefaultRules();
-        distributionDefaultProductRules = DefaultDistributionRules.getDefaultProductRules();
-    }
-
-    private Map<String, List<String>> populateLayoutTokens(CentralConfigDescriptor centralDescriptor) {
-        Map<String, List<String>> layoutTokens = Maps.newHashMap();
-        centralDescriptor.getRepoLayouts()
-                .stream()
-                .forEach(layout -> layoutTokens.put(layout.getName(), tokensForLayout(layout)));
-        return layoutTokens;
-    }
-
-    private List<String> tokensForLayout(RepoLayout layout) {
-        return RepoLayoutUtils.getLayoutTokens(layout)
-                .stream()
-                .map(s -> DistributionConstants.wrapToken(s.replace("[", "").replace("]", "")))
-                .collect(Collectors.toList());
-    }
-
-    public List<String> getRepositoryLayouts() {
-        return repositoryLayouts;
-    }
-
-    public List<String> getPackageTypes() {
-        return packageTypes;
-    }
-
-    public List<String> getAvailableLocalRepos() {
-        return availableLocalRepos;
-    }
-
-    public List<String> getAvailableRemoteRepos() {
-        return availableRemoteRepos;
-    }
-
-    public List<String> getAvailableVirtualRepos() {
-        return availableVirtualRepos;
-    }
-
-    public List<String> getWebStartKeyPairs() {
-        return webStartKeyPairs;
-    }
-
-    public List<String> getProxies() {
-        return proxies;
-    }
-
-    public String getDefaultProxy() {
-        return defaultProxy;
-    }
-
-    public Map<RepoType, List<String>> getDistributionTokensByType() {
-        return distributionTokensByType;
-    }
-
-    public Map<String, List<String>> getDistributionTokensByLayout() {
-        return distributionTokensByLayout;
-    }
-
-    public List<DistributionRule> getDistributionDefaultRules() {
-        return distributionDefaultRules;
-    }
-
-    public List<DistributionRule> getDistributionDefaultProductRules() {
-        return distributionDefaultProductRules;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/RepositoryInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/RepositoryInfo.java
deleted file mode 100644
index cf445d7..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/RepositoryInfo.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.info;
-
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-
-/**
- * @author Aviad Shikloshi
- */
-public abstract class RepositoryInfo implements RestModel {
-
-    protected String repoKey;
-    protected String repoType;
-    protected Boolean hasReindexAction;
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    public String getRepoType() {
-        return repoType;
-    }
-
-    public void setRepoType(String repoType) {
-        this.repoType = repoType;
-    }
-
-    public Boolean getHasReindexAction() {
-        return hasReindexAction;
-    }
-
-    public void setHasReindexAction(Boolean hasReindexAction) {
-        this.hasReindexAction = hasReindexAction;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/RepositoryInfoListFactory.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/RepositoryInfoListFactory.java
deleted file mode 100644
index 1153a51..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/RepositoryInfoListFactory.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.info;
-
-import com.google.common.collect.Lists;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author Aviad Shikloshi
- */
-public class RepositoryInfoListFactory {
-
-    public static List<RepositoryInfo> createRepositoryInfo(String repoType, CentralConfigService configService,
-            RepositoryService repositoryService) {
-        List<RepositoryInfo> repoInfo;
-        switch (repoType) {
-            case "local":
-                repoInfo = repositoryService.getLocalRepoDescriptors().stream()
-                        .map(repoDesc -> new LocalRepositoryInfo(repoDesc, configService)).collect(Collectors.toList());
-                break;
-            case "remote":
-                List<RemoteRepoDescriptor> remoteRepoDescriptorList = repositoryService.getRemoteRepoDescriptors();
-                repoInfo = remoteRepoDescriptorList.stream()
-                        .map(repoDesc -> new RemoteRepositoryInfo(repoDesc, configService.getDescriptor())).collect(Collectors.toList());
-                break;
-            case "virtual":
-                List<VirtualRepoDescriptor> virtualRepoDescriptorList = repositoryService.getVirtualRepoDescriptors();
-                repoInfo = virtualRepoDescriptorList.stream()
-                        .filter(virtualDescriptor -> !virtualDescriptor.getKey()
-                                .equals(VirtualRepoDescriptor.GLOBAL_VIRTUAL_REPO_KEY))
-                        .map(VirtualRepositoryInfo::new).collect(Collectors.toList());
-                break;
-            case "distribution":
-                repoInfo = repositoryService.getDistributionRepoDescriptors().stream()
-                        .map(DistributionRepositoryInfo::new)
-                        .collect(Collectors.toList());
-                break;
-            default:
-                repoInfo = Lists.newArrayList();
-        }
-        return repoInfo;
-    }
-
-    private RepositoryInfoListFactory() {
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/VirtualRepositoryInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/VirtualRepositoryInfo.java
deleted file mode 100644
index 1c5d5fa..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/info/VirtualRepositoryInfo.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.info;
-
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-import org.artifactory.ui.utils.RegExUtils;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author Aviad Shikloshi
- */
-public class VirtualRepositoryInfo extends RepositoryInfo {
-
-    protected List<String> selectedRepos;
-    private Integer numberOfIncludesRepositories;
-
-    public VirtualRepositoryInfo() {
-    }
-
-    public VirtualRepositoryInfo(VirtualRepoDescriptor repoDescriptor) {
-        repoKey = repoDescriptor.getKey();
-        repoType = repoDescriptor.getType().toString();
-        numberOfIncludesRepositories = repoDescriptor.getRepositories().size();
-        selectedRepos = repoDescriptor.getRepositories().stream()
-                .map(RepoDescriptor::getKey)
-                .collect(Collectors.toList());
-        hasReindexAction = RegExUtils.VIRTUAL_REPO_REINDEX_PATTERN.matcher(repoType).matches();
-    }
-
-    public Integer getNumberOfIncludesRepositories() {
-        return numberOfIncludesRepositories;
-    }
-
-    public void setNumberOfIncludesRepositories(Integer numberOfIncludesRepositories) {
-        this.numberOfIncludesRepositories = numberOfIncludesRepositories;
-    }
-
-    public List<String> getSelectedRepos() {
-        return selectedRepos;
-    }
-
-    public void setSelectedRepos(List<String> selectedRepos) {
-        this.selectedRepos = selectedRepos;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/local/LocalAdvancedRepositoryConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/local/LocalAdvancedRepositoryConfigModel.java
deleted file mode 100644
index 83ebaae..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/local/LocalAdvancedRepositoryConfigModel.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.local;
-
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.admin.configuration.propertysets.PropertySetNameModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.AdvancedRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.reverseProxy.ReverseProxyRepoModel;
-
-import java.util.List;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.DEFAULT_ALLOW_CONTENT_BROWSING;
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.DEFAULT_BLACKED_OUT;
-
-/**
- * @author Dan Feldman
- * @author Aviad Shikloshi
- */
-public class LocalAdvancedRepositoryConfigModel implements AdvancedRepositoryConfigModel {
-
-    protected List<PropertySetNameModel> propertySets;
-    protected Boolean blackedOut = DEFAULT_BLACKED_OUT;
-    protected Boolean allowContentBrowsing = DEFAULT_ALLOW_CONTENT_BROWSING;
-    protected ReverseProxyRepoModel reverseProxy;
-
-    @Override
-    public List<PropertySetNameModel> getPropertySets() {
-        return propertySets;
-    }
-
-    @Override
-    public void setPropertySets(List<PropertySetNameModel> propertySets) {
-        this.propertySets = propertySets;
-    }
-
-    @Override
-    public Boolean isBlackedOut() {
-        return blackedOut;
-    }
-
-    @Override
-    public void setBlackedOut(Boolean blackedOut) {
-        this.blackedOut = blackedOut;
-    }
-
-    @Override
-    public Boolean getAllowContentBrowsing() {
-        return allowContentBrowsing;
-    }
-
-    @Override
-    public void setAllowContentBrowsing(Boolean allowContentBrowsing) {
-        this.allowContentBrowsing = allowContentBrowsing;
-    }
-
-    @Override
-    public ReverseProxyRepoModel getReverseProxy() {
-        return reverseProxy;
-    }
-
-    @Override
-    public void setReverseProxy(ReverseProxyRepoModel reverseProxy) {
-        this.reverseProxy = reverseProxy;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/local/LocalBasicRepositoryConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/local/LocalBasicRepositoryConfigModel.java
deleted file mode 100644
index 3953032..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/local/LocalBasicRepositoryConfigModel.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.local;
-
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.admin.configuration.repository.BasicRepositoryConfigModel;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.DEFAULT_INCLUDES_PATTERN;
-
-/**
- * @author Dan Feldman
- * @author Aviad Shikloshi
- */
-public class LocalBasicRepositoryConfigModel implements BasicRepositoryConfigModel {
-
-    protected String publicDescription;
-    protected String internalDescription;
-    protected String includesPattern = DEFAULT_INCLUDES_PATTERN;
-    protected String excludesPattern;
-    protected String layout;
-
-    @Override
-    public String getPublicDescription() {
-        return publicDescription;
-    }
-
-    @Override
-    public void setPublicDescription(String publicDescription) {
-        this.publicDescription = publicDescription;
-    }
-
-    @Override
-    public String getInternalDescription() {
-        return internalDescription;
-    }
-
-    @Override
-    public void setInternalDescription(String internalDescription) {
-        this.internalDescription = internalDescription;
-    }
-
-    @Override
-    public String getIncludesPattern() {
-        return includesPattern;
-    }
-
-    @Override
-    public void setIncludesPattern(String includesPattern) {
-        this.includesPattern = includesPattern;
-    }
-
-    @Override
-    public String getExcludesPattern() {
-        return excludesPattern;
-    }
-
-    @Override
-    public void setExcludesPattern(String excludesPattern) {
-        this.excludesPattern = excludesPattern;
-    }
-
-    @Override
-    public String getLayout() {
-        return layout;
-    }
-
-    @Override
-    public void setLayout(String layout) {
-        this.layout = layout;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/local/LocalRepositoryConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/local/LocalRepositoryConfigModel.java
deleted file mode 100644
index 447c0ab..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/local/LocalRepositoryConfigModel.java
+++ /dev/null
@@ -1,127 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.local;
-
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoBaseDescriptor;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.ReverseProxyDescriptor;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.admin.configuration.repository.GeneralRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.RepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.replication.local.LocalReplicationConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.typespecific.TypeSpecificConfigModel;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.CreateRepoConfigHelper;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.UpdateRepoConfigHelper;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.builder.ReplicationConfigDescriptorBuilder;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.builder.RepoConfigDescriptorBuilder;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.builder.RepoConfigModelBuilder;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.exception.RepoConfigException;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.validator.ReplicationConfigValidator;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.validator.RepoConfigValidator;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Aviad Shikloshi
- * @author Dan Feldman
- */
- at JsonTypeName("localRepoConfig")
-public class LocalRepositoryConfigModel implements RepositoryConfigModel<LocalBasicRepositoryConfigModel,
-        LocalAdvancedRepositoryConfigModel, LocalReplicationConfigModel> {
-
-    protected GeneralRepositoryConfigModel general;
-    protected LocalBasicRepositoryConfigModel basic;
-    protected LocalAdvancedRepositoryConfigModel advanced;
-    private List<LocalReplicationConfigModel> replications;
-    protected TypeSpecificConfigModel typeSpecific;
-
-    @Override
-    public GeneralRepositoryConfigModel getGeneral() {
-        return general;
-    }
-
-    public void setGeneral(GeneralRepositoryConfigModel general) {
-        this.general = general;
-    }
-
-    @Override
-    public LocalBasicRepositoryConfigModel getBasic() {
-        return basic;
-    }
-
-    @Override
-    public void setBasic(LocalBasicRepositoryConfigModel basic) {
-        this.basic = basic;
-    }
-
-    @Override
-    public LocalAdvancedRepositoryConfigModel getAdvanced() {
-        return advanced;
-    }
-
-    @Override
-    public void setAdvanced(LocalAdvancedRepositoryConfigModel advanced) {
-        this.advanced = advanced;
-    }
-
-    @Override
-    public List<LocalReplicationConfigModel> getReplications() {
-        return replications;
-    }
-
-    @Override
-    public void setReplications(List<LocalReplicationConfigModel> replications) {
-        this.replications = replications;
-    }
-
-    @Override
-    public TypeSpecificConfigModel getTypeSpecific() {
-        return typeSpecific;
-    }
-
-    public void setTypeSpecific(TypeSpecificConfigModel typeSpecific) {
-        this.typeSpecific = typeSpecific;
-    }
-
-    @Override
-    public LocalRepoDescriptor toDescriptor(RepoConfigValidator validator, RepoConfigDescriptorBuilder builder)
-            throws RepoConfigException {
-        validator.validateLocal(this);
-        return builder.buildLocalDescriptor(this);
-    }
-
-    public ReverseProxyDescriptor getReverseProxyDescriptor(RepoBaseDescriptor repoDescriptor,
-                                                            RepoConfigDescriptorBuilder builder){
-        return builder.buildReverseProxyDescriptor(this.advanced, repoDescriptor);
-    }
-
-    @Override
-    public LocalRepositoryConfigModel fromDescriptor(RepoConfigModelBuilder builder, RepoDescriptor descriptor) {
-        builder.populateLocalDescriptorValuesToModel((LocalRepoDescriptor) descriptor, this);
-        return this;
-    }
-
-    public Set<LocalReplicationDescriptor> getReplicationDescriptors(ReplicationConfigValidator validator,
-            ReplicationConfigDescriptorBuilder builder) throws RepoConfigException {
-        validator.validateLocalModels(replications);
-        return builder.buildLocalReplications(replications, general.getRepoKey());
-    }
-
-    @Override
-    public void createRepo(CreateRepoConfigHelper creator) throws IOException, RepoConfigException {
-        creator.handleLocal(this);
-    }
-
-    @Override
-    public void updateRepo(UpdateRepoConfigHelper updater) throws IOException, RepoConfigException {
-        updater.handleLocal(this);
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/remote/RemoteAdvancedRepositoryConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/remote/RemoteAdvancedRepositoryConfigModel.java
deleted file mode 100644
index 49fd706..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/remote/RemoteAdvancedRepositoryConfigModel.java
+++ /dev/null
@@ -1,119 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.remote;
-
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.admin.configuration.repository.local.LocalAdvancedRepositoryConfigModel;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-
-import java.util.List;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.*;
-
-/**
- * @author Aviad Shikloshi
- * @author Dan Feldman
- */
- at JsonIgnoreProperties("localChecksumPolicy")
- at JsonSerialize(include = JsonSerialize.Inclusion.NON_EMPTY)
-public class RemoteAdvancedRepositoryConfigModel extends LocalAdvancedRepositoryConfigModel {
-
-    protected RemoteNetworkRepositoryConfigModel network;
-    protected RemoteCacheRepositoryConfigModel cache;
-    protected String queryParams;
-    protected boolean propagateQueryParams;
-    protected List<String> mismatchingMimeTypesOverrideList;
-
-    @JsonIgnore
-    protected Boolean hardFail = DEFAULT_HARD_FAIL;
-    protected Boolean storeArtifactsLocally = DEFAULT_STORE_ARTIFACTS_LOCALLY;
-    protected Boolean synchronizeArtifactProperties = DEFAULT_SYNC_PROPERTIES;
-    private Boolean shareConfiguration = DEFAULT_SHARE_CONFIG;
-    protected boolean blockMismatchingMimeTypes = DEFAULT_BLOCK_MISMATCHING_MIME_TYPES;
-
-    public RemoteNetworkRepositoryConfigModel getNetwork() {
-        return network;
-    }
-
-    public void setNetwork(RemoteNetworkRepositoryConfigModel network) {
-        this.network = network;
-    }
-
-    public RemoteCacheRepositoryConfigModel getCache() {
-        return cache;
-    }
-
-    public void setCache(RemoteCacheRepositoryConfigModel cache) {
-        this.cache = cache;
-    }
-
-    public String getQueryParams() {
-        return queryParams;
-    }
-
-    public void setQueryParams(String queryParams) {
-        this.queryParams = queryParams;
-    }
-
-    public Boolean getHardFail() {
-        return hardFail;
-    }
-
-    public void setHardFail(Boolean hardFail) {
-        this.hardFail = hardFail;
-    }
-
-
-    public Boolean isStoreArtifactsLocally() {
-        return storeArtifactsLocally;
-    }
-
-    public void setStoreArtifactsLocally(Boolean storeArtifactsLocally) {
-        this.storeArtifactsLocally = storeArtifactsLocally;
-    }
-
-    public Boolean getSynchronizeArtifactProperties() {
-        return synchronizeArtifactProperties;
-    }
-
-    public void setSynchronizeArtifactProperties(Boolean synchronizeArtifactProperties) {
-        this.synchronizeArtifactProperties = synchronizeArtifactProperties;
-    }
-
-    public Boolean isShareConfiguration() {
-        return shareConfiguration;
-    }
-
-    public void setShareConfiguration(Boolean shareConfiguration) {
-        this.shareConfiguration = shareConfiguration;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-
-    public boolean isPropagateQueryParams() {
-        return propagateQueryParams;
-    }
-
-    public void setPropagateQueryParams(boolean propagateQueryParams) {
-        this.propagateQueryParams = propagateQueryParams;
-    }
-
-    public List<String> getMismatchingMimeTypesOverrideList() {
-        return mismatchingMimeTypesOverrideList;
-    }
-
-    public void setMismatchingMimeTypesOverrideList(List<String> mismatchingMimeTypesOverrideList) {
-        this.mismatchingMimeTypesOverrideList = mismatchingMimeTypesOverrideList;
-    }
-
-    public boolean isBlockMismatchingMimeTypes() {
-        return blockMismatchingMimeTypes;
-    }
-
-    public void setBlockMismatchingMimeTypes(boolean blockMismatchingMimeTypes) {
-        this.blockMismatchingMimeTypes = blockMismatchingMimeTypes;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/remote/RemoteBasicRepositoryConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/remote/RemoteBasicRepositoryConfigModel.java
deleted file mode 100644
index 84b88f0..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/remote/RemoteBasicRepositoryConfigModel.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.remote;
-
-import org.artifactory.descriptor.delegation.ContentSynchronisation;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.admin.configuration.repository.local.LocalBasicRepositoryConfigModel;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.DEFAULT_DELEGATION_CONTEXT;
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.DEFAULT_OFFLINE;
-
-/**
- * @author Aviad Shikloshi
- * @author Dan Feldman
- */
-public class RemoteBasicRepositoryConfigModel extends LocalBasicRepositoryConfigModel {
-
-    protected String url;
-    protected String remoteLayoutMapping;
-    protected Boolean offline = DEFAULT_OFFLINE;
-    protected ContentSynchronisation contentSynchronisation = DEFAULT_DELEGATION_CONTEXT;
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    public String getRemoteLayoutMapping() {
-        return remoteLayoutMapping;
-    }
-
-    public void setRemoteLayoutMapping(String remoteLayoutMapping) {
-        this.remoteLayoutMapping = remoteLayoutMapping;
-    }
-
-    public Boolean isOffline() {
-        return offline;
-    }
-
-    public void setOffline(Boolean offline) {
-        this.offline = offline;
-    }
-
-
-    public ContentSynchronisation getContentSynchronisation() {
-        return contentSynchronisation;
-    }
-
-    public void setContentSynchronisation(ContentSynchronisation contentSynchronisation) {
-        this.contentSynchronisation = contentSynchronisation;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/remote/RemoteCacheRepositoryConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/remote/RemoteCacheRepositoryConfigModel.java
deleted file mode 100644
index 57c8ec4..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/remote/RemoteCacheRepositoryConfigModel.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.remote;
-
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.*;
-
-/**
- * @author Dan Feldman
- * @author Aviad Shikloshi
- */
-public class RemoteCacheRepositoryConfigModel implements RestModel {
-
-    protected Integer keepUnusedArtifactsHours = DEFAULT_KEEP_UNUSED_ARTIFACTS;
-    protected Long retrievalCachePeriodSecs = DEFAULT_RETRIEVAL_CACHE_PERIOD;
-    protected Long assumedOfflineLimitSecs = DEFAULT_ASSUMED_OFFLINE;
-    protected Long missedRetrievalCachePeriodSecs = DEFAULT_MISSED_RETRIEVAL_PERIOD;
-
-    public Integer getKeepUnusedArtifactsHours() {
-        return keepUnusedArtifactsHours;
-    }
-
-    public void setKeepUnusedArtifactsHours(Integer keepUnusedArtifactsHours) {
-        this.keepUnusedArtifactsHours = keepUnusedArtifactsHours;
-    }
-
-    public Long getRetrievalCachePeriodSecs() {
-        return retrievalCachePeriodSecs;
-    }
-
-    public void setRetrievalCachePeriodSecs(Long retrievalCachePeriodSecs) {
-        this.retrievalCachePeriodSecs = retrievalCachePeriodSecs;
-    }
-
-    public Long getAssumedOfflineLimitSecs() {
-        return assumedOfflineLimitSecs;
-    }
-
-    public void setAssumedOfflineLimitSecs(Long assumedOfflineLimitSecs) {
-        this.assumedOfflineLimitSecs = assumedOfflineLimitSecs;
-    }
-
-    public Long getMissedRetrievalCachePeriodSecs() {
-        return missedRetrievalCachePeriodSecs;
-    }
-
-    public void setMissedRetrievalCachePeriodSecs(Long missedRetrievalCachePeriodSecs) {
-        this.missedRetrievalCachePeriodSecs = missedRetrievalCachePeriodSecs;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/remote/RemoteNetworkRepositoryConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/remote/RemoteNetworkRepositoryConfigModel.java
deleted file mode 100644
index 82fd671..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/remote/RemoteNetworkRepositoryConfigModel.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.remote;
-
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.admin.configuration.repository.RepositoryNetworkConfigModel;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.DEFAULT_COOKIE_MANAGEMENT;
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.DEFAULT_LENIENENT_HOST_AUTH;
-
-/**
- * @author Aviad Shikloshi
- * @author Dan Feldman
- */
-public class RemoteNetworkRepositoryConfigModel extends RepositoryNetworkConfigModel {
-
-    protected String localAddress;
-    protected Boolean lenientHostAuth = DEFAULT_LENIENENT_HOST_AUTH;
-    protected Boolean cookieManagement = DEFAULT_COOKIE_MANAGEMENT;
-
-    public String getLocalAddress() {
-        return localAddress;
-    }
-
-    public void setLocalAddress(String localAddress) {
-        this.localAddress = localAddress;
-    }
-
-    public Boolean getLenientHostAuth() {
-        return lenientHostAuth;
-    }
-
-    public void setLenientHostAuth(Boolean lenientHostAuth) {
-        this.lenientHostAuth = lenientHostAuth;
-    }
-
-    public Boolean getCookieManagement() {
-        return cookieManagement;
-    }
-
-    public void setCookieManagement(Boolean cookieManagement) {
-        this.cookieManagement = cookieManagement;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/remote/RemoteRepositoryConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/remote/RemoteRepositoryConfigModel.java
deleted file mode 100644
index cae3a1e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/remote/RemoteRepositoryConfigModel.java
+++ /dev/null
@@ -1,132 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.remote;
-
-import org.artifactory.descriptor.replication.RemoteReplicationDescriptor;
-import org.artifactory.descriptor.repo.HttpRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoBaseDescriptor;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.ReverseProxyDescriptor;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.admin.configuration.repository.GeneralRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.RepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.replication.remote.RemoteReplicationConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.typespecific.TypeSpecificConfigModel;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.CreateRepoConfigHelper;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.UpdateRepoConfigHelper;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.builder.ReplicationConfigDescriptorBuilder;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.builder.RepoConfigDescriptorBuilder;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.builder.RepoConfigModelBuilder;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.exception.RepoConfigException;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.validator.ReplicationConfigValidator;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.validator.RepoConfigValidator;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-import java.io.IOException;
-import java.util.List;
-
-/**
- * @author Dan Feldman
- * @author Aviad Shikloshi
- */
- at JsonTypeName("remoteRepoConfig")
-public class RemoteRepositoryConfigModel implements RepositoryConfigModel<RemoteBasicRepositoryConfigModel,
-        RemoteAdvancedRepositoryConfigModel, RemoteReplicationConfigModel> {
-
-    protected GeneralRepositoryConfigModel general;
-    protected RemoteBasicRepositoryConfigModel basic;
-    protected RemoteAdvancedRepositoryConfigModel advanced;
-    protected List<RemoteReplicationConfigModel> replications;
-    protected TypeSpecificConfigModel typeSpecific;
-
-    @Override
-    public GeneralRepositoryConfigModel getGeneral() {
-        return general;
-    }
-
-    @Override
-    public void setGeneral(GeneralRepositoryConfigModel general) {
-        this.general = general;
-    }
-
-    @Override
-    public RemoteBasicRepositoryConfigModel getBasic() {
-        return basic;
-    }
-
-    @Override
-    public void setBasic(RemoteBasicRepositoryConfigModel basic) {
-        this.basic = basic;
-    }
-
-    @Override
-    public RemoteAdvancedRepositoryConfigModel getAdvanced() {
-        return advanced;
-    }
-
-    @Override
-    public void setAdvanced(RemoteAdvancedRepositoryConfigModel advanced) {
-        this.advanced = advanced;
-    }
-
-    @Override
-    public List<RemoteReplicationConfigModel> getReplications() {
-        return replications;
-    }
-
-    @Override
-    public void setReplications(List<RemoteReplicationConfigModel> replications) {
-        this.replications = replications;
-    }
-
-    @Override
-    public TypeSpecificConfigModel getTypeSpecific() {
-        return typeSpecific;
-    }
-
-    @Override
-    public void setTypeSpecific(TypeSpecificConfigModel typeSpecific) {
-        this.typeSpecific = typeSpecific;
-    }
-
-    @Override
-    public HttpRepoDescriptor toDescriptor(RepoConfigValidator validator, RepoConfigDescriptorBuilder builder)
-            throws RepoConfigException {
-        validator.validateRemote(this);
-        return builder.buildRemoteDescriptor(this);
-    }
-
-    public ReverseProxyDescriptor getReverseProxyDescriptor(RepoBaseDescriptor repoDescriptor,
-                                                            RepoConfigDescriptorBuilder builder){
-        return builder.buildReverseProxyDescriptor(this.advanced, repoDescriptor);
-    }
-
-    @Override
-    public RemoteRepositoryConfigModel fromDescriptor(RepoConfigModelBuilder builder, RepoDescriptor descriptor) {
-        builder.populateRemoteRepositoryConfigValuesToModel((HttpRepoDescriptor) descriptor, this);
-        return this;
-    }
-
-    @Override
-    public void createRepo(CreateRepoConfigHelper creator) throws IOException, RepoConfigException {
-        creator.handleRemote(this);
-    }
-
-    @Override
-    public void updateRepo(UpdateRepoConfigHelper updater) throws IOException, RepoConfigException {
-        updater.handleRemote(this);
-    }
-
-    public RemoteReplicationDescriptor getReplicationDescriptor(ReplicationConfigValidator validator,
-            ReplicationConfigDescriptorBuilder builder) throws RepoConfigException {
-        RemoteReplicationDescriptor descriptor = null;
-        RemoteReplicationConfigModel validatedReplication = validator.validateRemoteModel(this);
-        if (validatedReplication != null) {
-            descriptor = builder.buildRemoteReplication(validatedReplication, general.getRepoKey());
-        }
-        return descriptor;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/replication/RepositoryReplicationConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/replication/RepositoryReplicationConfigModel.java
deleted file mode 100644
index 65e1641..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/replication/RepositoryReplicationConfigModel.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.replication;
-
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.replication.local.LocalReplicationConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.replication.remote.RemoteReplicationConfigModel;
-import org.codehaus.jackson.annotate.JsonSubTypes;
-import org.codehaus.jackson.annotate.JsonTypeInfo;
-
-/**
- * @author Aviad Shikloshi
- * @author Dan Feldman
- */
- at JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
- at JsonSubTypes({
-        @JsonSubTypes.Type(value = LocalReplicationConfigModel.class, name = "localReplication"),
-        @JsonSubTypes.Type(value = RemoteReplicationConfigModel.class, name = "remoteReplication")
-})
-public interface RepositoryReplicationConfigModel extends RestModel {
-
-    Boolean isEnabled();
-
-    void setEnabled(Boolean enabled);
-
-    String getCronExp();
-
-    void setCronExp(String cronExp);
-
-    String getPathPrefix();
-
-    void setPathPrefix(String pathPrefix);
-
-    Boolean isSyncDeletes();
-
-    void setSyncDeletes(Boolean syncDeletes);
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/replication/local/LocalReplicationConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/replication/local/LocalReplicationConfigModel.java
deleted file mode 100644
index b79c90f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/replication/local/LocalReplicationConfigModel.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.replication.local;
-
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.admin.configuration.repository.RepositoryNetworkConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.replication.RepositoryReplicationConfigModel;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.*;
-
-/**
- * @author Dan Feldman
- * @author Aviad Shikloshi
- */
- at JsonTypeName("local")
-public class LocalReplicationConfigModel extends RepositoryNetworkConfigModel implements RepositoryReplicationConfigModel {
-
-    protected Boolean enabled = DEFAULT_LOCAL_REPLICATION_ENABLED;
-    protected String cronExp;
-    protected Boolean enableEventReplication = DEFAULT_EVENT_REPLICATION;
-    protected String pathPrefix;
-    protected Boolean syncDeletes = DEFAULT_REPLICATION_SYNC_DELETES;
-
-    @Override
-    public Boolean isEnabled() {
-        return enabled;
-    }
-
-    @Override
-    public void setEnabled(Boolean enabled) {
-        this.enabled = enabled;
-    }
-
-    @Override
-    public String getCronExp() {
-        return cronExp;
-    }
-
-    @Override
-    public void setCronExp(String cronExp) {
-        this.cronExp = cronExp;
-    }
-
-    public Boolean isEnableEventReplication() {
-        return enableEventReplication;
-    }
-
-    public void setEnableEventReplication(Boolean enableEventReplication) {
-        this.enableEventReplication = enableEventReplication;
-    }
-
-    @Override
-    public String getPathPrefix() {
-        return pathPrefix;
-    }
-
-    @Override
-    public void setPathPrefix(String pathPrefix) {
-        this.pathPrefix = pathPrefix;
-    }
-
-    @Override
-    public Boolean isSyncDeletes() {
-        return syncDeletes;
-    }
-
-    @Override
-    public void setSyncDeletes(Boolean syncDeletes) {
-        this.syncDeletes = syncDeletes;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/replication/remote/RemoteReplicationConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/replication/remote/RemoteReplicationConfigModel.java
deleted file mode 100644
index 1dcb904..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/replication/remote/RemoteReplicationConfigModel.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.replication.remote;
-
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.admin.configuration.repository.replication.RepositoryReplicationConfigModel;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.*;
-
-/**
- * @author Aviad Shikloshi
- * @author Dan Feldman
- */
- at JsonTypeName("remote")
-public class RemoteReplicationConfigModel implements RepositoryReplicationConfigModel {
-
-    protected Boolean enabled = DEFAULT_REMOTE_REPLICATION_ENABLED;
-    protected String cronExp;
-    protected Boolean syncDeletes = DEFAULT_REPLICATION_SYNC_DELETES;
-    protected Boolean syncProperties = DEFAULT_SYNC_PROPERTIES;
-    protected String pathPrefix;
-
-    @Override
-    public Boolean isEnabled() {
-        return enabled;
-    }
-
-    @Override
-    public void setEnabled(Boolean enabled) {
-        this.enabled = enabled;
-    }
-
-    @Override
-    public String getCronExp() {
-        return cronExp;
-    }
-
-    @Override
-    public void setCronExp(String cronExp) {
-        this.cronExp = cronExp;
-    }
-
-    @Override
-    public Boolean isSyncDeletes() {
-        return syncDeletes;
-    }
-
-    @Override
-    public void setSyncDeletes(Boolean syncDeletes) {
-        this.syncDeletes = syncDeletes;
-    }
-
-    public Boolean isSyncProperties() {
-        return syncProperties;
-    }
-
-    public void setSyncProperties(Boolean syncProperties) {
-        this.syncProperties = syncProperties;
-    }
-
-    @Override
-    public String getPathPrefix() {
-        return pathPrefix;
-    }
-
-    @Override
-    public void setPathPrefix(String pathPrefix) {
-        this.pathPrefix = pathPrefix;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/BowerTypeSpecificConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/BowerTypeSpecificConfigModel.java
deleted file mode 100644
index 9f00f1f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/BowerTypeSpecificConfigModel.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.typespecific;
-
-import com.google.common.collect.Lists;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues;
-
-import java.util.List;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.DEFAULT_BOWER_REGISTRY;
-
-/**
- * @author Dan Feldman
- */
-public class BowerTypeSpecificConfigModel extends VcsTypeSpecificConfigModel {
-
-    //remote
-    private String registryUrl = DEFAULT_BOWER_REGISTRY;
-
-    //virtual
-    private Boolean enableExternalDependencies = false;
-    private List<String> externalPatterns = Lists.newArrayList("**");
-    private String externalRemoteRepo = "";
-
-    public String getRegistryUrl() {
-        return registryUrl;
-    }
-
-    public void setRegistryUrl(String registryUrl) {
-        this.registryUrl = registryUrl;
-    }
-
-    public Boolean getEnableExternalDependencies() {
-        return enableExternalDependencies;
-    }
-
-    public void setEnableExternalDependencies(Boolean enableExternalDependencies) {
-        this.enableExternalDependencies = enableExternalDependencies;
-    }
-
-    public List<String> getExternalPatterns() {
-        return externalPatterns;
-    }
-
-    public void setExternalPatterns(List<String> externalPatterns) {
-        this.externalPatterns = externalPatterns;
-    }
-
-    public String getExternalRemoteRepo() {
-        return externalRemoteRepo;
-    }
-
-    public void setExternalRemoteRepo(String externalRemoteRepo) {
-        this.externalRemoteRepo = externalRemoteRepo;
-    }
-
-    @Override
-    public RepoType getRepoType() {
-        return RepoType.Bower;
-    }
-
-    @Override
-    public String getUrl() {
-        return RepoConfigDefaultValues.VCS_URL;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/CocoaPodsTypeSpecificConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/CocoaPodsTypeSpecificConfigModel.java
deleted file mode 100644
index b2a94c9..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/CocoaPodsTypeSpecificConfigModel.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.typespecific;
-
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.descriptor.repo.VcsGitConfiguration;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.DEFAULT_PODS_SPECS_REPO;
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.DEFAULT_VCS_GIT_CONFIG;
-
-/**
- * @author Dan Feldman
- */
-public class CocoaPodsTypeSpecificConfigModel extends VcsTypeSpecificConfigModel {
-
-    //remote
-    private String specsRepoUrl = DEFAULT_PODS_SPECS_REPO;
-    private VcsGitConfiguration specsRepoProvider = DEFAULT_VCS_GIT_CONFIG;
-
-    //TODO [by dan]: ?
-    //virtual
-    //private Boolean enableExternalDependencies = false;
-    //private List<String> externalPatterns = Lists.newArrayList("**");
-    //private String externalRemoteRepo = "";
-
-    public String getSpecsRepoUrl() {
-        return specsRepoUrl;
-    }
-
-    public void setSpecsRepoUrl(String specsRepoUrl) {
-        this.specsRepoUrl = specsRepoUrl;
-    }
-
-    public VcsGitConfiguration getSpecsRepoProvider() {
-        return specsRepoProvider;
-    }
-
-    public void setSpecsRepoProvider(VcsGitConfiguration specsRepoProvider) {
-        this.specsRepoProvider = specsRepoProvider;
-    }
-
-    /*  public Boolean getEnableExternalDependencies() {
-        return enableExternalDependencies;
-    }
-
-    public void setEnableExternalDependencies(Boolean enableExternalDependencies) {
-        this.enableExternalDependencies = enableExternalDependencies;
-    }
-
-    public List<String> getExternalPatterns() {
-        return externalPatterns;
-    }
-
-    public void setExternalPatterns(List<String> externalPatterns) {
-        this.externalPatterns = externalPatterns;
-    }
-
-    public String getExternalRemoteRepo() {
-        return externalRemoteRepo;
-    }
-
-    public void setExternalRemoteRepo(String externalRemoteRepo) {
-        this.externalRemoteRepo = externalRemoteRepo;
-    }*/
-
-    @Override
-    public RepoType getRepoType() {
-        return RepoType.CocoaPods;
-    }
-
-    @Override
-    public String getUrl() {
-        return RepoConfigDefaultValues.VCS_URL;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/DebTypeSpecificConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/DebTypeSpecificConfigModel.java
deleted file mode 100644
index cbf8ec7..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/DebTypeSpecificConfigModel.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.typespecific;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.rest.common.util.JsonUtil;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.DEFAULT_DEB_TRIVIAL_LAYOUT;
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.DEFAULT_LIST_REMOTE_ITEMS_SUPPORTED_TYPE;
-
-/**
- * @author Dan Feldman
- */
-public class DebTypeSpecificConfigModel implements TypeSpecificConfigModel {
-
-    //local
-    protected Boolean trivialLayout = DEFAULT_DEB_TRIVIAL_LAYOUT;
-
-    //remote
-    protected Boolean listRemoteFolderItems = DEFAULT_LIST_REMOTE_ITEMS_SUPPORTED_TYPE;
-
-    public Boolean getTrivialLayout() {
-        return trivialLayout;
-    }
-
-    public void setTrivialLayout(Boolean trivialLayout) {
-        this.trivialLayout = trivialLayout;
-    }
-
-    public Boolean isListRemoteFolderItems() {
-        return listRemoteFolderItems;
-    }
-
-    public void setListRemoteFolderItems(Boolean listRemoteFolderItems) {
-        this.listRemoteFolderItems = listRemoteFolderItems;
-    }
-
-    @Override
-    public RepoType getRepoType() {
-        return RepoType.Debian;
-    }
-
-    @Override
-    public String getUrl() {
-        return StringUtils.EMPTY;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/DistRepoTypeSpecificConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/DistRepoTypeSpecificConfigModel.java
deleted file mode 100644
index 0d5c176..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/DistRepoTypeSpecificConfigModel.java
+++ /dev/null
@@ -1,147 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.typespecific;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-
-import java.util.List;
-
-/**
- * @author Dan Feldman
- */
- at JsonIgnoreProperties(ignoreUnknown = true)
-public class DistRepoTypeSpecificConfigModel implements TypeSpecificConfigModel {
-
-    private String clientId;
-    //The Bintray App Config associated with this repo - it's hidden for now but is interchangeable between repos
-    private String bintrayAppConfig;
-
-    /**
-     * These are 'hidden' values used in creation - they are not visible to the user, and are not part of the config
-     */
-    private String bintrayAuthString; //The auth string Bintray returns, which is Base64(clientId:secret)
-    private String paramClientId;     //clientId that was passed as url param - for verification against the auth string
-    private String code;              //The temp code Bintray returns after oauth app setup in the redirect request
-    private String scope;               //The scope field sent back by Bintray which signifies the org this app has been created for
-    private String redirectUrl;       //The redirect url the UI gave when executing the initial request - used for verification by Bintray
-    //The base url UI should use when going to Bintray - mainly for our testing purposes so we can go to staging
-    private String bintrayBaseUrl = ConstantValues.bintrayUrl.getString();
-    //Need this here because we populate custom licenses for the specific org as well
-    List<String> availableLicenses;
-    private boolean isPremium;
-    private String org;
-    private Boolean isAuthenticated;
-
-    public String getClientId() {
-        return clientId;
-    }
-
-    public void setClientId(String clientId) {
-        this.clientId = clientId;
-    }
-
-    public String getCode() {
-        return code;
-    }
-
-    public void setCode(String code) {
-        this.code = code;
-    }
-
-    public String getScope() {
-        return scope;
-    }
-
-    public void setScope(String scope) {
-        this.scope = scope;
-    }
-
-    public String getBintrayAppConfig() {
-        return bintrayAppConfig;
-    }
-
-    public void setBintrayAppConfig(String bintrayAppConfig) {
-        this.bintrayAppConfig = bintrayAppConfig;
-    }
-
-    public String getBintrayAuthString() {
-        return bintrayAuthString;
-    }
-
-    public void setBintrayAuthString(String bintrayAuthString) {
-        this.bintrayAuthString = bintrayAuthString;
-    }
-
-    public String getParamClientId() {
-        return paramClientId;
-    }
-
-    public void setParamClientId(String paramClientId) {
-        this.paramClientId = paramClientId;
-    }
-
-    public String getBintrayBaseUrl() {
-        return bintrayBaseUrl;
-    }
-
-    public void setBintrayBaseUrl(String bintrayBaseUrl) {
-        this.bintrayBaseUrl = bintrayBaseUrl;
-    }
-
-    public String getRedirectUrl() {
-        return redirectUrl;
-    }
-
-    public void setRedirectUrl(String redirectUrl) {
-        this.redirectUrl = redirectUrl;
-    }
-
-    public boolean isPremium() {
-        return isPremium;
-    }
-
-    public void setPremium(boolean premium) {
-        isPremium = premium;
-    }
-
-    public List<String> getAvailableLicenses() {
-        return availableLicenses;
-    }
-
-    public void setAvailableLicenses(List<String> availableLicenses) {
-        this.availableLicenses = availableLicenses;
-    }
-
-    public String getOrg() {
-        return org;
-    }
-
-    public void setOrg(String org) {
-        this.org = org;
-    }
-
-    public Boolean getAuthenticated() {
-        return isAuthenticated;
-    }
-
-    public void setAuthenticated(Boolean authenticated) {
-        isAuthenticated = authenticated;
-    }
-
-    @Override
-    public RepoType getRepoType() {
-        return RepoType.Distribution;
-    }
-
-    @Override
-    public String getUrl() {
-        return StringUtils.EMPTY;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/DockerTypeSpecificConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/DockerTypeSpecificConfigModel.java
deleted file mode 100644
index 3e8e5b3..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/DockerTypeSpecificConfigModel.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.typespecific;
-
-import org.artifactory.descriptor.repo.DockerApiVersion;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.*;
-
-/**
- * @author Dan Feldman
- */
-public class DockerTypeSpecificConfigModel implements TypeSpecificConfigModel {
-
-    protected Boolean forceDockerAuthentication = DEFAULT_FORCE_DOCKER_AUTH;
-
-    //local
-    protected DockerApiVersion dockerApiVersion = DEFAULT_DOCKER_API_VER;
-
-    //remote
-    protected Boolean enableTokenAuthentication = DEFAULT_TOKEN_AUTH;
-    protected Boolean listRemoteFolderItems = DEFAULT_LIST_REMOTE_ITEMS_UNSUPPORTED_TYPE;
-
-
-    public DockerApiVersion getDockerApiVersion() {
-        return dockerApiVersion;
-    }
-
-    public void setDockerApiVersion(DockerApiVersion dockerApiVersion) {
-        this.dockerApiVersion = dockerApiVersion;
-    }
-
-    public Boolean isEnableTokenAuthentication() {
-        return enableTokenAuthentication;
-    }
-
-    public void setEnableTokenAuthentication(Boolean enableTokenAuthentication) {
-        this.enableTokenAuthentication = enableTokenAuthentication;
-    }
-
-    public Boolean isForceDockerAuthentication() {
-        return forceDockerAuthentication;
-    }
-
-    public void setForceDockerAuthentication(Boolean forceDockerAuthentication) {
-        this.forceDockerAuthentication = forceDockerAuthentication;
-    }
-
-    public Boolean isListRemoteFolderItems() {
-        return listRemoteFolderItems;
-    }
-
-    public void setListRemoteFolderItems(Boolean listRemoteFolderItems) {
-        this.listRemoteFolderItems = listRemoteFolderItems;
-    }
-
-    @Override
-    public RepoType getRepoType() {
-        return RepoType.Docker;
-    }
-
-    @Override
-    public String getUrl() {
-        return RepoConfigDefaultValues.DOCKER_URL;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/GemsTypeSpecificConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/GemsTypeSpecificConfigModel.java
deleted file mode 100644
index d5705dd..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/GemsTypeSpecificConfigModel.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.typespecific;
-
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.DEFAULT_LIST_REMOTE_ITEMS_UNSUPPORTED_TYPE;
-
-/**
- * @author Dan Feldman
- */
-public class GemsTypeSpecificConfigModel implements TypeSpecificConfigModel {
-
-    //remote
-    protected Boolean listRemoteFolderItems = DEFAULT_LIST_REMOTE_ITEMS_UNSUPPORTED_TYPE;
-
-    public Boolean isListRemoteFolderItems() {
-        return listRemoteFolderItems;
-    }
-
-    public void setListRemoteFolderItems(Boolean listRemoteFolderItems) {
-        this.listRemoteFolderItems = listRemoteFolderItems;
-    }
-
-    @Override
-    public RepoType getRepoType() {
-        return RepoType.Gems;
-    }
-
-    @Override
-    public String getUrl() {
-        return RepoConfigDefaultValues.RUBYGEMS_URL;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/GenericTypeSpecificConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/GenericTypeSpecificConfigModel.java
deleted file mode 100644
index 13ee561..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/GenericTypeSpecificConfigModel.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.typespecific;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.rest.common.util.JsonUtil;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.DEFAULT_LIST_REMOTE_ITEMS_SUPPORTED_TYPE;
-
-/**
- * @author Dan Feldman
- */
-public class GenericTypeSpecificConfigModel implements TypeSpecificConfigModel {
-
-    //remote
-    protected Boolean listRemoteFolderItems = DEFAULT_LIST_REMOTE_ITEMS_SUPPORTED_TYPE;
-
-    public Boolean isListRemoteFolderItems() {
-        return listRemoteFolderItems;
-    }
-
-    public void setListRemoteFolderItems(Boolean listRemoteFolderItems) {
-        this.listRemoteFolderItems = listRemoteFolderItems;
-    }
-
-    @Override
-    public RepoType getRepoType() {
-        return RepoType.Generic;
-    }
-
-    @Override
-    public String getUrl() {
-        return StringUtils.EMPTY;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/GitLfsTypeSpecificConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/GitLfsTypeSpecificConfigModel.java
deleted file mode 100644
index 92b6065..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/GitLfsTypeSpecificConfigModel.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.typespecific;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.rest.common.util.JsonUtil;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.DEFAULT_LIST_REMOTE_ITEMS_UNSUPPORTED_TYPE;
-
-/**
- * @author Dan Feldman
- */
-public class GitLfsTypeSpecificConfigModel implements TypeSpecificConfigModel {
-
-    //remote
-    protected Boolean listRemoteFolderItems = DEFAULT_LIST_REMOTE_ITEMS_UNSUPPORTED_TYPE;
-
-    public Boolean isListRemoteFolderItems() {
-        return listRemoteFolderItems;
-    }
-
-    public void setListRemoteFolderItems(Boolean listRemoteFolderItems) {
-        this.listRemoteFolderItems = listRemoteFolderItems;
-    }
-
-    @Override
-    public RepoType getRepoType() {
-        return RepoType.GitLfs;
-    }
-
-    @Override
-    public String getUrl() {
-        return StringUtils.EMPTY;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/GradleTypeSpecificConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/GradleTypeSpecificConfigModel.java
deleted file mode 100644
index e34b491..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/GradleTypeSpecificConfigModel.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.typespecific;
-
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.rest.common.util.JsonUtil;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.DEFAULT_SUPPRESS_POM_CHECKS;
-
-/**
- * @author Dan Feldman
- */
-public class GradleTypeSpecificConfigModel extends MavenTypeSpecificConfigModel {
-
-    //local
-    private Boolean suppressPomConsistencyChecks = DEFAULT_SUPPRESS_POM_CHECKS;
-
-    @Override
-    public Boolean getSuppressPomConsistencyChecks() {
-        return this.suppressPomConsistencyChecks;
-    }
-
-    @Override
-    public void setSuppressPomConsistencyChecks(Boolean suppressPomConsistencyChecks) {
-        this.suppressPomConsistencyChecks = suppressPomConsistencyChecks;
-    }
-
-    @Override
-    public RepoType getRepoType() {
-        return RepoType.Gradle;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/IvyTypeSpecificConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/IvyTypeSpecificConfigModel.java
deleted file mode 100644
index 1e31155..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/IvyTypeSpecificConfigModel.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.typespecific;
-
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.rest.common.util.JsonUtil;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.DEFAULT_SUPPRESS_POM_CHECKS;
-
-/**
- * @author Dan Feldman
- */
-public class IvyTypeSpecificConfigModel extends MavenTypeSpecificConfigModel {
-
-    //local
-    private Boolean suppressPomConsistencyChecks = DEFAULT_SUPPRESS_POM_CHECKS;
-
-    @Override
-    public Boolean getSuppressPomConsistencyChecks() {
-        return this.suppressPomConsistencyChecks;
-    }
-
-    @Override
-    public void setSuppressPomConsistencyChecks(Boolean suppressPomConsistencyChecks) {
-        this.suppressPomConsistencyChecks = suppressPomConsistencyChecks;
-    }
-
-    @Override
-    public RepoType getRepoType() {
-        return RepoType.Ivy;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/MavenTypeSpecificConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/MavenTypeSpecificConfigModel.java
deleted file mode 100644
index 5b4c2b7..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/MavenTypeSpecificConfigModel.java
+++ /dev/null
@@ -1,155 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.typespecific;
-
-import org.artifactory.descriptor.repo.ChecksumPolicyType;
-import org.artifactory.descriptor.repo.LocalRepoChecksumPolicyType;
-import org.artifactory.descriptor.repo.PomCleanupPolicy;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.descriptor.repo.SnapshotVersionBehavior;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.*;
-
-/**
- * @author Dan Feldman
- */
-public class MavenTypeSpecificConfigModel implements TypeSpecificConfigModel {
-
-    //local
-    protected Integer maxUniqueSnapshots = DEFAULT_MAX_UNIQUE_SNAPSHOTS;
-    protected Boolean handleReleases = DEFAULT_HANDLE_RELEASES;
-    protected Boolean handleSnapshots = DEFAULT_HANDLE_SNAPSHOTS;
-    protected Boolean suppressPomConsistencyChecks = DEFAULT_SUPPRESS_POM_CHECKS_MAVEN;
-    protected SnapshotVersionBehavior snapshotVersionBehavior = DEFAULT_SNAPSHOT_BEHAVIOR;
-    protected LocalRepoChecksumPolicyType localChecksumPolicy = DEFAULT_CHECKSUM_POLICY;
-
-    //remote
-    protected Boolean eagerlyFetchJars = DEFAULT_EAGERLY_FETCH_JARS;
-    protected Boolean eagerlyFetchSources = DEFAULT_EAGERLY_FETCH_SOURCES;
-    protected ChecksumPolicyType remoteChecksumPolicy = DEFAULT_REMOTE_CHECKSUM_POLICY;
-    protected Boolean listRemoteFolderItems = DEFAULT_LIST_REMOTE_ITEMS_SUPPORTED_TYPE;
-    protected Boolean rejectInvalidJars = DEFAULT_REJECT_INVALID_JARS;
-
-    //virtual
-    protected PomCleanupPolicy pomCleanupPolicy = DEFAULT_POM_CLEANUP_POLICY;
-    protected String keyPair;
-
-    public Integer getMaxUniqueSnapshots() {
-        return maxUniqueSnapshots;
-    }
-
-    public void setMaxUniqueSnapshots(Integer maxUniqueSnapshots) {
-        this.maxUniqueSnapshots = maxUniqueSnapshots;
-    }
-
-    public Boolean getHandleReleases() {
-        return handleReleases;
-    }
-
-    public void setHandleReleases(Boolean handleReleases) {
-        this.handleReleases = handleReleases;
-    }
-
-    public Boolean getHandleSnapshots() {
-        return handleSnapshots;
-    }
-
-    public void setHandleSnapshots(Boolean handleSnapshots) {
-        this.handleSnapshots = handleSnapshots;
-    }
-
-    public Boolean getSuppressPomConsistencyChecks() {
-        return suppressPomConsistencyChecks;
-    }
-
-    public void setSuppressPomConsistencyChecks(Boolean suppressPomConsistencyChecks) {
-        this.suppressPomConsistencyChecks = suppressPomConsistencyChecks;
-    }
-
-    public SnapshotVersionBehavior getSnapshotVersionBehavior() {
-        return snapshotVersionBehavior;
-    }
-
-    public void setSnapshotVersionBehavior(SnapshotVersionBehavior snapshotVersionBehavior) {
-        this.snapshotVersionBehavior = snapshotVersionBehavior;
-    }
-
-    public LocalRepoChecksumPolicyType getLocalChecksumPolicy() {
-        return localChecksumPolicy;
-    }
-
-    public void setLocalChecksumPolicy(LocalRepoChecksumPolicyType localChecksumPolicy) {
-        this.localChecksumPolicy = localChecksumPolicy;
-    }
-
-    public Boolean getEagerlyFetchJars() {
-        return eagerlyFetchJars;
-    }
-
-    public void setEagerlyFetchJars(Boolean eagerlyFetchJars) {
-        this.eagerlyFetchJars = eagerlyFetchJars;
-    }
-
-    public Boolean getEagerlyFetchSources() {
-        return eagerlyFetchSources;
-    }
-
-    public void setEagerlyFetchSources(Boolean eagerlyFetchSources) {
-        this.eagerlyFetchSources = eagerlyFetchSources;
-    }
-
-    public ChecksumPolicyType getRemoteChecksumPolicy() {
-        return remoteChecksumPolicy;
-    }
-
-    public void setRemoteChecksumPolicy(ChecksumPolicyType remoteChecksumPolicy) {
-        this.remoteChecksumPolicy = remoteChecksumPolicy;
-    }
-
-    public Boolean isListRemoteFolderItems() {
-        return listRemoteFolderItems;
-    }
-
-    public void setListRemoteFolderItems(Boolean listRemoteFolderItems) {
-        this.listRemoteFolderItems = listRemoteFolderItems;
-    }
-
-    public Boolean getRejectInvalidJars() {
-        return rejectInvalidJars;
-    }
-
-    public void setRejectInvalidJars(Boolean rejectInvalidJars) {
-        this.rejectInvalidJars = rejectInvalidJars;
-    }
-
-    public void setPomCleanupPolicy(PomCleanupPolicy pomCleanupPolicy) {
-        this.pomCleanupPolicy = pomCleanupPolicy;
-    }
-
-    public PomCleanupPolicy getPomCleanupPolicy() {
-        return pomCleanupPolicy;
-    }
-
-    public String getKeyPair() {
-        return keyPair;
-    }
-
-    public void setKeyPair(String keyPair) {
-        this.keyPair = keyPair;
-    }
-
-    @Override
-    public RepoType getRepoType() {
-        return RepoType.Maven;
-    }
-
-    @Override
-    public String getUrl() {
-        return RepoConfigDefaultValues.MAVEN_GROUP_URL;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/NpmTypeSpecificConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/NpmTypeSpecificConfigModel.java
deleted file mode 100644
index e422c52..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/NpmTypeSpecificConfigModel.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.typespecific;
-
-import com.google.common.collect.Lists;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues;
-
-import java.util.List;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.DEFAULT_LIST_REMOTE_ITEMS_UNSUPPORTED_TYPE;
-
-/**
- * @author Dan Feldman
- */
-public class NpmTypeSpecificConfigModel implements TypeSpecificConfigModel {
-
-    //virtual
-    private Boolean enableExternalDependencies = false;
-    private List<String> externalPatterns = Lists.newArrayList("**");
-    private String externalRemoteRepo = "";
-
-    public Boolean getEnableExternalDependencies() {
-        return enableExternalDependencies;
-    }
-
-    public void setEnableExternalDependencies(Boolean enableExternalDependencies) {
-        this.enableExternalDependencies = enableExternalDependencies;
-    }
-
-    public List<String> getExternalPatterns() {
-        return externalPatterns;
-    }
-
-    public void setExternalPatterns(List<String> externalPatterns) {
-        this.externalPatterns = externalPatterns;
-    }
-
-    public String getExternalRemoteRepo() {
-        return externalRemoteRepo;
-    }
-
-    public void setExternalRemoteRepo(String externalRemoteRepo) {
-        this.externalRemoteRepo = externalRemoteRepo;
-    }
-
-    @Override
-    public RepoType getRepoType() {
-        return RepoType.Npm;
-    }
-
-    protected Boolean listRemoteFolderItems = DEFAULT_LIST_REMOTE_ITEMS_UNSUPPORTED_TYPE;
-
-    public Boolean isListRemoteFolderItems() {
-        return listRemoteFolderItems;
-    }
-
-    public void setListRemoteFolderItems(Boolean listRemoteFolderItems) {
-        this.listRemoteFolderItems = listRemoteFolderItems;
-    }
-
-    @Override
-    public String getUrl() {
-        return RepoConfigDefaultValues.NPM_URL;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/NugetTypeSpecificConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/NugetTypeSpecificConfigModel.java
deleted file mode 100644
index 4d6994a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/NugetTypeSpecificConfigModel.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.typespecific;
-
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.*;
-
-/**
- * @author Dan Feldman
- */
-public class NugetTypeSpecificConfigModel implements TypeSpecificConfigModel {
-
-    protected Boolean forceNugetAuthentication = DEFAULT_FORCE_NUGET_AUTH;
-
-    //local
-    protected Integer maxUniqueSnapshots = DEFAULT_MAX_UNIQUE_SNAPSHOTS;
-
-    //remote
-    protected String feedContextPath = DEFAULT_NUGET_FEED_PATH;
-    protected String downloadContextPath = DEFAULT_NUGET_DOWNLOAD_PATH;
-    protected Boolean listRemoteFolderItems = DEFAULT_LIST_REMOTE_ITEMS_UNSUPPORTED_TYPE;
-
-    public String getFeedContextPath() {
-        return feedContextPath;
-    }
-
-    public void setFeedContextPath(String feedContextPath) {
-        this.feedContextPath = feedContextPath;
-    }
-
-    public String getDownloadContextPath() {
-        return downloadContextPath;
-    }
-
-    public void setDownloadContextPath(String downloadContextPath) {
-        this.downloadContextPath = downloadContextPath;
-    }
-
-    public Integer getMaxUniqueSnapshots() {
-        return maxUniqueSnapshots;
-    }
-
-    public void setMaxUniqueSnapshots(Integer maxUniqueSnapshots) {
-        this.maxUniqueSnapshots = maxUniqueSnapshots;
-    }
-
-    public Boolean isListRemoteFolderItems() {
-        return listRemoteFolderItems;
-    }
-
-    public void setListRemoteFolderItems(Boolean listRemoteFolderItems) {
-        this.listRemoteFolderItems = listRemoteFolderItems;
-    }
-
-    public Boolean isForceNugetAuthentication() {
-        return forceNugetAuthentication;
-    }
-
-    public void setForceNugetAuthentication(Boolean forceNugetAuthentication) {
-        this.forceNugetAuthentication = forceNugetAuthentication;
-    }
-
-    @Override
-    public RepoType getRepoType() {
-        return RepoType.NuGet;
-    }
-
-    @Override
-    public String getUrl() {
-        return RepoConfigDefaultValues.NUGET_URL;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/OpkgTypeSpecificConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/OpkgTypeSpecificConfigModel.java
deleted file mode 100644
index 6db55e9..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/OpkgTypeSpecificConfigModel.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.typespecific;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.rest.common.util.JsonUtil;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.DEFAULT_LIST_REMOTE_ITEMS_SUPPORTED_TYPE;
-
-/**
- * @author Noam Y. Tenne
- */
-public class OpkgTypeSpecificConfigModel implements TypeSpecificConfigModel {
-
-    //remote
-    protected Boolean listRemoteFolderItems = DEFAULT_LIST_REMOTE_ITEMS_SUPPORTED_TYPE;
-
-    public Boolean isListRemoteFolderItems() {
-        return listRemoteFolderItems;
-    }
-
-    public void setListRemoteFolderItems(Boolean listRemoteFolderItems) {
-        this.listRemoteFolderItems = listRemoteFolderItems;
-    }
-
-    @Override
-    public RepoType getRepoType() {
-        return RepoType.Opkg;
-    }
-
-    @Override
-    public String getUrl() {
-        return StringUtils.EMPTY;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/P2TypeSpecificConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/P2TypeSpecificConfigModel.java
deleted file mode 100644
index daab844..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/P2TypeSpecificConfigModel.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.typespecific;
-
-import org.artifactory.addon.p2.P2Repo;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.rest.common.util.JsonUtil;
-
-import java.util.List;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.DEFAULT_SUPPRESS_POM_CHECKS;
-
-/**
- * @author Dan Feldman
- */
-public class P2TypeSpecificConfigModel extends MavenTypeSpecificConfigModel {
-
-    //local
-    private Boolean suppressPomConsistencyChecks = DEFAULT_SUPPRESS_POM_CHECKS;
-
-    //virtual
-    protected List<P2Repo> P2Repos; // TODO: [by dan] verify descriptor is not de\serialized
-
-    public List<P2Repo> getP2Repos() {
-        return P2Repos;
-    }
-
-    public void setP2Repos(List<P2Repo> P2Repos) {
-        this.P2Repos = P2Repos;
-    }
-
-    @Override
-    public Boolean getSuppressPomConsistencyChecks() {
-        return this.suppressPomConsistencyChecks;
-    }
-
-    @Override
-    public void setSuppressPomConsistencyChecks(Boolean suppressPomConsistencyChecks) {
-        this.suppressPomConsistencyChecks = suppressPomConsistencyChecks;
-    }
-
-    @Override
-    public RepoType getRepoType() {
-        return RepoType.P2;
-    }
-
-    @Override
-    public String getUrl() {
-        return null;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/PypiTypeSpecificConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/PypiTypeSpecificConfigModel.java
deleted file mode 100644
index b2253e5..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/PypiTypeSpecificConfigModel.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.typespecific;
-
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.DEFAULT_LIST_REMOTE_ITEMS_UNSUPPORTED_TYPE;
-
-/**
- * @author Dan Feldman
- */
-public class PypiTypeSpecificConfigModel implements TypeSpecificConfigModel {
-
-    //remote
-    protected Boolean listRemoteFolderItems = DEFAULT_LIST_REMOTE_ITEMS_UNSUPPORTED_TYPE;
-
-    public Boolean isListRemoteFolderItems() {
-        return listRemoteFolderItems;
-    }
-
-    public void setListRemoteFolderItems(Boolean listRemoteFolderItems) {
-        this.listRemoteFolderItems = listRemoteFolderItems;
-    }
-
-    @Override
-    public RepoType getRepoType() {
-        return RepoType.Pypi;
-    }
-
-    @Override
-    public String getUrl() {
-        return RepoConfigDefaultValues.PYPI_URL;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/SbtTypeSpecificConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/SbtTypeSpecificConfigModel.java
deleted file mode 100644
index c09f97f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/SbtTypeSpecificConfigModel.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.typespecific;
-
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.rest.common.util.JsonUtil;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.DEFAULT_SUPPRESS_POM_CHECKS;
-
-/**
- * @author Dan Feldman
- */
-public class SbtTypeSpecificConfigModel extends MavenTypeSpecificConfigModel {
-
-    //local
-    private Boolean suppressPomConsistencyChecks = DEFAULT_SUPPRESS_POM_CHECKS;
-
-    @Override
-    public Boolean getSuppressPomConsistencyChecks() {
-        return this.suppressPomConsistencyChecks;
-    }
-
-    @Override
-    public void setSuppressPomConsistencyChecks(Boolean suppressPomConsistencyChecks) {
-        this.suppressPomConsistencyChecks = suppressPomConsistencyChecks;
-    }
-
-    @Override
-    public RepoType getRepoType() {
-        return RepoType.SBT;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/TypeSpecificConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/TypeSpecificConfigModel.java
deleted file mode 100644
index 6d1ce1f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/TypeSpecificConfigModel.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.typespecific;
-
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.rest.common.model.RestModel;
-import org.codehaus.jackson.annotate.JsonSubTypes;
-import org.codehaus.jackson.annotate.JsonTypeInfo;
-
-/**
- * @author Dan Feldman
- */
- at JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "repoType")
- at JsonSubTypes({
-        @JsonSubTypes.Type(value = BowerTypeSpecificConfigModel.class, name = "Bower"),
-        @JsonSubTypes.Type(value = CocoaPodsTypeSpecificConfigModel.class, name = "CocoaPods"),
-        @JsonSubTypes.Type(value = DebTypeSpecificConfigModel.class, name = "Debian"),
-        @JsonSubTypes.Type(value = DistRepoTypeSpecificConfigModel.class, name = "Distribution"),
-        @JsonSubTypes.Type(value = OpkgTypeSpecificConfigModel.class, name = "Opkg"),
-        @JsonSubTypes.Type(value = DockerTypeSpecificConfigModel.class, name = "Docker"),
-        @JsonSubTypes.Type(value = GemsTypeSpecificConfigModel.class, name = "Gems"),
-        @JsonSubTypes.Type(value = GenericTypeSpecificConfigModel.class, name = "Generic"),
-        @JsonSubTypes.Type(value = GitLfsTypeSpecificConfigModel.class, name = "GitLfs"),
-        @JsonSubTypes.Type(value = GradleTypeSpecificConfigModel.class, name = "Gradle"),
-        @JsonSubTypes.Type(value = IvyTypeSpecificConfigModel.class, name = "Ivy"),
-        @JsonSubTypes.Type(value = MavenTypeSpecificConfigModel.class, name = "Maven"),
-        @JsonSubTypes.Type(value = NpmTypeSpecificConfigModel.class, name = "Npm"),
-        @JsonSubTypes.Type(value = NugetTypeSpecificConfigModel.class, name = "NuGet"),
-        @JsonSubTypes.Type(value = P2TypeSpecificConfigModel.class, name = "P2"),
-        @JsonSubTypes.Type(value = PypiTypeSpecificConfigModel.class, name = "Pypi"),
-        @JsonSubTypes.Type(value = SbtTypeSpecificConfigModel.class, name = "SBT"),
-        @JsonSubTypes.Type(value = VagrantTypeSpecificConfigModel.class, name = "Vagrant"),
-        @JsonSubTypes.Type(value = VcsTypeSpecificConfigModel.class, name = "VCS"),
-        @JsonSubTypes.Type(value = YumTypeSpecificConfigModel.class, name = "YUM"),
-})
-public interface TypeSpecificConfigModel extends RestModel {
-
-    RepoType getRepoType();
-
-    /**
-     * This should retrieve the default remote url for each package type
-     * For instance: Maven, Gradle, Ivy and SBT should return http://jcenter.bintray.com
-     * <p>
-     * Notice: method name corresponds to the JSON model field name and is used by the UI.
-     */
-    String getUrl();
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/VagrantTypeSpecificConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/VagrantTypeSpecificConfigModel.java
deleted file mode 100644
index 0a06a5f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/VagrantTypeSpecificConfigModel.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.typespecific;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.rest.common.util.JsonUtil;
-
-/**
- * @author Dan Feldman
- */
-public class VagrantTypeSpecificConfigModel implements TypeSpecificConfigModel {
-
-    @Override
-    public RepoType getRepoType() {
-        return RepoType.Vagrant;
-    }
-
-    @Override
-    public String getUrl() {
-        return StringUtils.EMPTY;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/VcsTypeSpecificConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/VcsTypeSpecificConfigModel.java
deleted file mode 100644
index a4c0533..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/VcsTypeSpecificConfigModel.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.typespecific;
-
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.descriptor.repo.vcs.VcsGitProvider;
-import org.artifactory.descriptor.repo.vcs.VcsType;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues;
-import org.codehaus.jackson.annotate.JsonIgnore;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.*;
-
-/**
- * @author Dan Feldman
- */
-public class VcsTypeSpecificConfigModel implements TypeSpecificConfigModel {
-
-    //remote
-    // TODO: [by dan] when this enum has more than one value and UI will give choice - remove annotation and add enum to RepositoryFieldValues
-    @JsonIgnore
-    protected VcsType vcsType = DEFAULT_VCS_TYPE;
-    protected VcsGitProvider gitProvider = DEFAULT_GIT_PROVIDER;
-    protected Integer maxUniqueSnapshots = DEFAULT_MAX_UNIQUE_SNAPSHOTS;
-    protected String downloadUrl;
-    protected Boolean listRemoteFolderItems = DEFAULT_LIST_REMOTE_ITEMS_UNSUPPORTED_TYPE;
-
-    public VcsType getVcsType() {
-        return vcsType;
-    }
-
-    public void setVcsType(VcsType vcsType) {
-        this.vcsType = vcsType;
-    }
-
-    public VcsGitProvider getGitProvider() {
-        return gitProvider;
-    }
-
-    public void setGitProvider(VcsGitProvider gitProvider) {
-        this.gitProvider = gitProvider;
-    }
-
-    public Integer getMaxUniqueSnapshots() {
-        return maxUniqueSnapshots;
-    }
-
-    public void setMaxUniqueSnapshots(Integer maxUniqueSnapshots) {
-        this.maxUniqueSnapshots = maxUniqueSnapshots;
-    }
-
-    public String getDownloadUrl() {
-        return downloadUrl;
-    }
-
-    public void setDownloadUrl(String downloadUrl) {
-        this.downloadUrl = downloadUrl;
-    }
-
-    public Boolean isListRemoteFolderItems() {
-        return listRemoteFolderItems;
-    }
-
-    public void setListRemoteFolderItems(Boolean listRemoteFolderItems) {
-        this.listRemoteFolderItems = listRemoteFolderItems;
-    }
-
-    @Override
-    public RepoType getRepoType() {
-        return RepoType.VCS;
-    }
-
-    @Override
-    public String getUrl() {
-        return RepoConfigDefaultValues.VCS_URL;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/YumTypeSpecificConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/YumTypeSpecificConfigModel.java
deleted file mode 100644
index 2d9f5e9..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/typespecific/YumTypeSpecificConfigModel.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.typespecific;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.rest.common.util.JsonUtil;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.*;
-
-/**
- * @author Dan Feldman
- */
-public class YumTypeSpecificConfigModel implements TypeSpecificConfigModel {
-
-    //local
-    protected Integer metadataFolderDepth = DEFAULT_YUM_METADATA_DEPTH;
-    protected String groupFileNames = DEFAULT_YUM_GROUPFILE_NAME;
-    protected Boolean autoCalculateYumMetadata = DEFAULT_YUM_AUTO_CALCULATE;
-    protected Boolean listRemoteFolderItems = DEFAULT_LIST_REMOTE_ITEMS_SUPPORTED_TYPE;
-
-    public Integer getMetadataFolderDepth() {
-        return metadataFolderDepth;
-    }
-
-    public void setMetadataFolderDepth(Integer metadataFolderDepth) {
-        this.metadataFolderDepth = metadataFolderDepth;
-    }
-
-    public String getGroupFileNames() {
-        return groupFileNames;
-    }
-
-    public void setGroupFileNames(String groupFileNames) {
-        this.groupFileNames = groupFileNames;
-    }
-
-    public Boolean isAutoCalculateYumMetadata() {
-        return autoCalculateYumMetadata;
-    }
-
-    public void setAutoCalculateYumMetadata(Boolean autoCalculateYumMetadata) {
-        this.autoCalculateYumMetadata = autoCalculateYumMetadata;
-    }
-
-    public Boolean isListRemoteFolderItems() {
-        return listRemoteFolderItems;
-    }
-
-    public void setListRemoteFolderItems(Boolean listRemoteFolderItems) {
-        this.listRemoteFolderItems = listRemoteFolderItems;
-    }
-
-    @Override
-    public RepoType getRepoType() {
-        return RepoType.YUM;
-    }
-
-    @Override
-    public String getUrl() {
-        return StringUtils.EMPTY;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/virtual/VirtualAdvancedRepositoryConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/virtual/VirtualAdvancedRepositoryConfigModel.java
deleted file mode 100644
index 0e47e87..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/virtual/VirtualAdvancedRepositoryConfigModel.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.virtual;
-
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.admin.configuration.propertysets.PropertySetNameModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.AdvancedRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.reverseProxy.ReverseProxyRepoModel;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-
-import java.util.List;
-
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.DEFAULT_VIRTUAL_CAN_RETRIEVE_FROM_REMOTE;
-
-/**
- * @author Aviad Shikloshi
- * @author Dan Feldman
- */
- at JsonIgnoreProperties({"propertySets", "blackedOut", "allowContentBrowsing"})
-public class VirtualAdvancedRepositoryConfigModel implements AdvancedRepositoryConfigModel {
-
-    private Boolean retrieveRemoteArtifacts = DEFAULT_VIRTUAL_CAN_RETRIEVE_FROM_REMOTE;
-    private ReverseProxyRepoModel reverseProxy;
-
-    public Boolean getRetrieveRemoteArtifacts() {
-        return retrieveRemoteArtifacts;
-    }
-
-    public void isRetreiveRemoteArtifacts(Boolean retreiveRemoteArtifacts) {
-        this.retrieveRemoteArtifacts = retreiveRemoteArtifacts;
-    }
-
-    public void setRetrieveRemoteArtifacts(Boolean retrieveRemoteArtifacts) {
-        this.retrieveRemoteArtifacts = retrieveRemoteArtifacts;
-    }
-
-    @Override
-    public List<PropertySetNameModel> getPropertySets() {
-        return null;
-    }
-
-    @Override
-    public void setPropertySets(List<PropertySetNameModel> propertySets) {
-
-    }
-
-    @Override
-    public Boolean isBlackedOut() {
-        return null;
-    }
-
-    @Override
-    public void setBlackedOut(Boolean blackedOut) {
-
-    }
-
-    @Override
-    public Boolean getAllowContentBrowsing() {
-        return null;
-    }
-
-    @Override
-    public void setAllowContentBrowsing(Boolean allowContentBrowsing) {
-
-    }
-
-    @Override
-    public ReverseProxyRepoModel getReverseProxy() {
-        return reverseProxy;
-    }
-
-    @Override
-    public void setReverseProxy(ReverseProxyRepoModel reverseProxy) {
-        this.reverseProxy = reverseProxy;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/virtual/VirtualBasicRepositoryConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/virtual/VirtualBasicRepositoryConfigModel.java
deleted file mode 100644
index c35624d..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/virtual/VirtualBasicRepositoryConfigModel.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.virtual;
-
-import org.artifactory.api.rest.restmodel.JsonUtil;
-import org.artifactory.ui.rest.model.admin.configuration.repository.local.LocalBasicRepositoryConfigModel;
-
-import java.util.List;
-
-/**
- * @author Dan Feldman
- * @author Aviad Shikloshi
- */
-public class VirtualBasicRepositoryConfigModel extends LocalBasicRepositoryConfigModel {
-
-    private List<VirtualSelectedRepository> selectedRepositories;
-    private List<VirtualSelectedRepository> resolvedRepositories;
-    private String defaultDeploymentRepo;
-
-    public List<VirtualSelectedRepository> getSelectedRepositories() {
-        return selectedRepositories;
-    }
-
-    public void setSelectedRepositories(
-            List<VirtualSelectedRepository> selectedRepositories) {
-        this.selectedRepositories = selectedRepositories;
-    }
-
-    public List<VirtualSelectedRepository> getResolvedRepositories() {
-        return resolvedRepositories;
-    }
-
-    public void setResolvedRepositories(
-            List<VirtualSelectedRepository> resolvedRepositories) {
-        this.resolvedRepositories = resolvedRepositories;
-    }
-
-    public String getDefaultDeploymentRepo() {
-        return defaultDeploymentRepo;
-    }
-
-    public void setDefaultDeploymentRepo(String defaultDeploymentRepo) {
-        this.defaultDeploymentRepo = defaultDeploymentRepo;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/virtual/VirtualRepositoryConfigModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/virtual/VirtualRepositoryConfigModel.java
deleted file mode 100644
index 76293e8..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/virtual/VirtualRepositoryConfigModel.java
+++ /dev/null
@@ -1,119 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.virtual;
-
-import org.artifactory.descriptor.repo.RepoBaseDescriptor;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.ReverseProxyDescriptor;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.admin.configuration.repository.GeneralRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.RepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.replication.RepositoryReplicationConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.typespecific.TypeSpecificConfigModel;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.CreateRepoConfigHelper;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.UpdateRepoConfigHelper;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.builder.RepoConfigDescriptorBuilder;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.builder.RepoConfigModelBuilder;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.exception.RepoConfigException;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.validator.RepoConfigValidator;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-import java.io.IOException;
-import java.util.List;
-
-/**
- * @author Aviad Shikloshi
- * @author Dan Feldman
- */
- at JsonTypeName("virtualRepoConfig")
-public class VirtualRepositoryConfigModel implements RepositoryConfigModel<VirtualBasicRepositoryConfigModel,
-        VirtualAdvancedRepositoryConfigModel, RepositoryReplicationConfigModel> {
-
-    private GeneralRepositoryConfigModel general;
-    private VirtualBasicRepositoryConfigModel basic;
-    private VirtualAdvancedRepositoryConfigModel advanced;
-    private TypeSpecificConfigModel typeSpecific;
-
-    @Override
-    public VirtualBasicRepositoryConfigModel getBasic() {
-        return basic;
-    }
-
-    @Override
-    public void setBasic(VirtualBasicRepositoryConfigModel basic) {
-        this.basic = basic;
-    }
-
-    @Override
-    public VirtualAdvancedRepositoryConfigModel getAdvanced() {
-        return advanced;
-    }
-
-    @Override
-    public void setAdvanced(VirtualAdvancedRepositoryConfigModel advanced) {
-        this.advanced = advanced;
-    }
-
-    @Override
-    public GeneralRepositoryConfigModel getGeneral() {
-        return general;
-    }
-
-    @Override
-    public void setGeneral(GeneralRepositoryConfigModel general) {
-        this.general = general;
-    }
-
-    @Override
-    public List<RepositoryReplicationConfigModel> getReplications() {
-        return null;
-    }
-
-    @Override
-    public void setReplications(List<RepositoryReplicationConfigModel> replication) {
-
-    }
-
-    @Override
-    public ReverseProxyDescriptor getReverseProxyDescriptor(RepoBaseDescriptor repoDescriptor,
-                                                            RepoConfigDescriptorBuilder builder){
-        return builder.buildReverseProxyDescriptor(this.advanced, repoDescriptor);
-    }
-
-    @Override
-    public TypeSpecificConfigModel getTypeSpecific() {
-        return typeSpecific;
-    }
-
-    @Override
-    public void setTypeSpecific(TypeSpecificConfigModel typeSpecific) {
-        this.typeSpecific = typeSpecific;
-    }
-
-    @Override
-    public VirtualRepoDescriptor toDescriptor(RepoConfigValidator validator, RepoConfigDescriptorBuilder builder)
-            throws RepoConfigException {
-        validator.validateVirtual(this);
-        return builder.buildVirtualDescriptor(this);
-    }
-
-    @Override
-    public VirtualRepositoryConfigModel fromDescriptor(RepoConfigModelBuilder builder, RepoDescriptor descriptor) {
-        builder.populateVirtualRepositoryConfigValuesToModel((VirtualRepoDescriptor) descriptor, this);
-        return this;
-    }
-
-    @Override
-    public void createRepo(CreateRepoConfigHelper creator) throws IOException, RepoConfigException {
-        creator.handleVirtual(this);
-    }
-
-    @Override
-    public void updateRepo(UpdateRepoConfigHelper updater) throws IOException, RepoConfigException {
-        updater.handleVirtual(this);
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/virtual/VirtualSelectedRepository.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/virtual/VirtualSelectedRepository.java
deleted file mode 100644
index 255e8e9..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/repository/virtual/VirtualSelectedRepository.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.repository.virtual;
-
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-
-/**
- * @author Shay Yaakov
- */
-public class VirtualSelectedRepository {
-
-    private String repoName;
-    private String type; // local/remote/virtual
-
-    public VirtualSelectedRepository() {
-    }
-
-    public VirtualSelectedRepository(RepoDescriptor descriptor) {
-        this.repoName = descriptor.getKey();
-        if (descriptor instanceof LocalRepoDescriptor) {
-            this.type = "local";
-        } else if (descriptor instanceof RemoteRepoDescriptor) {
-            this.type = "remote";
-        } else {
-            this.type = "virtual";
-        }
-    }
-
-    public String getRepoName() {
-        return repoName;
-    }
-
-    public void setRepoName(String repoName) {
-        this.repoName = repoName;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/reverseProxy/ReverseProxyRepoModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/reverseProxy/ReverseProxyRepoModel.java
deleted file mode 100644
index e0068f2..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/reverseProxy/ReverseProxyRepoModel.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.reverseProxy;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Shay Yaakov
- */
-public class ReverseProxyRepoModel extends BaseModel {
-
-    private String configurationKey;
-    private String serverName;
-    private Integer serverPort;
-
-    public String getConfigurationKey() {
-        return configurationKey;
-    }
-
-    public void setConfigurationKey(String configurationKey) {
-        this.configurationKey = configurationKey;
-    }
-
-    public String getServerName() {
-        return serverName;
-    }
-
-    public void setServerName(String serverName) {
-        this.serverName = serverName;
-    }
-
-    public Integer getServerPort() {
-        return serverPort;
-    }
-
-    public void setServerPort(Integer serverPort) {
-        if (serverPort != null && serverPort > 0) {
-            this.serverPort = serverPort;
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/ssh/SshClientUIModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/ssh/SshClientUIModel.java
deleted file mode 100644
index b29a582..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/configuration/ssh/SshClientUIModel.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.artifactory.ui.rest.model.admin.configuration.ssh;
-
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-
-/**
- * @author Noam Y. Tenne
- */
-public class SshClientUIModel implements RestModel {
-
-    private String publicKey;
-
-    public String getPublicKey() {
-        return publicKey;
-    }
-
-    public void setPublicKey(String publicKey) {
-        this.publicKey = publicKey;
-    }
-
-    public SshClientUIModel() {
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/importexport/ImportExportSettings.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/importexport/ImportExportSettings.java
deleted file mode 100644
index 26d2a97..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/importexport/ImportExportSettings.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package org.artifactory.ui.rest.model.admin.importexport;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Chen Keinan
- */
-public class ImportExportSettings extends BaseModel {
-
-    private String path;
-    private boolean excludeMetadata;
-    private boolean verbose;
-    private boolean excludeContent;
-    private String repository;
-    private boolean excludeBuilds;
-    private boolean m2;
-    private boolean createArchive;
-    private boolean zip;
-
-    ImportExportSettings() {
-    }
-
-    public ImportExportSettings(String path) {
-        this.path = path;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    public Boolean isExcludeMetadata() {
-        return excludeMetadata;
-    }
-
-    public void setExcludeMetadata(Boolean excludeMetadata) {
-        this.excludeMetadata = excludeMetadata;
-    }
-
-    public Boolean isVerbose() {
-        return verbose;
-    }
-
-    public void setVerbose(Boolean verbose) {
-        this.verbose = verbose;
-    }
-
-    public Boolean isExcludeContent() {
-        return excludeContent;
-    }
-
-    public void setExcludeContent(Boolean excludeContent) {
-        this.excludeContent = excludeContent;
-    }
-
-    public String getRepository() {
-        return repository;
-    }
-
-    public void setRepository(String repository) {
-        this.repository = repository;
-    }
-
-    public Boolean isExcluudeBuillds() {
-        return excludeBuilds;
-    }
-
-    public void setExcludeBuilds(Boolean excludeBuilds) {
-        this.excludeBuilds = excludeBuilds;
-    }
-
-    public Boolean isCreateM2CompatibleExport() {
-        return m2;
-    }
-
-    public void setM2(Boolean m2) {
-        this.m2 = m2;
-    }
-
-    public Boolean isCreateZipArchive() {
-        return createArchive;
-    }
-
-    public void setCreateArchive(Boolean createArchive) {
-        this.createArchive = createArchive;
-    }
-
-    public boolean isZip() {
-        return zip;
-    }
-
-    public void setZip(boolean zip) {
-        this.zip = zip;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/crowdsso/CrowdGroupModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/crowdsso/CrowdGroupModel.java
deleted file mode 100644
index 0493067..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/crowdsso/CrowdGroupModel.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.crowdsso;
-
-import org.artifactory.addon.sso.crowd.CrowdExtGroup;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-
-/**
- * @author Chen Keinan
- */
-public class CrowdGroupModel extends CrowdExtGroup implements RestModel {
-
-    public CrowdGroupModel(String groupName, String description) {
-        super(groupName, description);
-    }
-
-    public CrowdGroupModel() {
-        super();
-    }
-
-    public CrowdGroupModel(CrowdExtGroup crowdExtGroup) {
-        super.setDescription(crowdExtGroup.getDescription());
-        super.setGroupName(crowdExtGroup.getGroupName());
-        super.setExistsInArtifactory(crowdExtGroup.isExistsInArtifactory());
-        super.setImportIntoArtifactory(crowdExtGroup.isExistsInArtifactory());
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/crowdsso/CrowdGroupsModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/crowdsso/CrowdGroupsModel.java
deleted file mode 100644
index 8cca7b5..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/crowdsso/CrowdGroupsModel.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.crowdsso;
-
-import com.google.common.collect.Lists;
-import org.artifactory.rest.common.model.BaseModel;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class CrowdGroupsModel extends BaseModel {
-    private List<CrowdGroupModel> crowdGroupModels= Lists.newArrayList();
-
-    public List<CrowdGroupModel> getCrowdGroupModels() {
-        return crowdGroupModels;
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/crowdsso/CrowdIntegration.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/crowdsso/CrowdIntegration.java
deleted file mode 100644
index 0a2ea26..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/crowdsso/CrowdIntegration.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.crowdsso;
-
-import org.artifactory.descriptor.security.sso.CrowdSettings;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-
-/**
- * @author Chen Keinan
- */
-public class CrowdIntegration extends CrowdSettings implements RestModel {
-
-    public CrowdIntegration() {
-    }
-
-    public CrowdIntegration(CrowdSettings crowdSettings) {
-        if (crowdSettings != null) {
-            setApplicationName(crowdSettings.getApplicationName());
-            setDirectAuthentication(crowdSettings.isDirectAuthentication());
-            setEnableIntegration(crowdSettings.isEnableIntegration());
-            setNoAutoUserCreation(crowdSettings.isNoAutoUserCreation());
-            setPassword(crowdSettings.getPassword());
-            setServerUrl(crowdSettings.getServerUrl());
-            setUseDefaultProxy(crowdSettings.isUseDefaultProxy());
-            setSessionValidationInterval(crowdSettings.getSessionValidationInterval());
-        }
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/general/MasterKey.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/general/MasterKey.java
deleted file mode 100644
index 3bcc7d6..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/general/MasterKey.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.general;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Chen Keinan
- */
-public class MasterKey extends BaseModel {
-
-    private boolean hasMasterKey = false;
-
-    public boolean isHasMasterKey() {
-        return hasMasterKey;
-    }
-
-    public void setHasMasterKey(boolean hasMasterKey) {
-        this.hasMasterKey = hasMasterKey;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/general/SecurityConfig.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/general/SecurityConfig.java
deleted file mode 100644
index 7a3e27e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/general/SecurityConfig.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.general;
-
-import org.artifactory.descriptor.security.PasswordSettings;
-import org.artifactory.descriptor.security.UserLockPolicy;
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Chen Keinan
- */
-public class SecurityConfig extends BaseModel {
-
-    boolean anonAccessEnabled;
-    boolean anonAccessToBuildInfosDisabled;
-    boolean hideUnauthorizedResources;
-    PasswordSettings passwordSettings;
-    UserLockPolicy userLockPolicy;
-
-    public SecurityConfig(){}
-
-    public SecurityConfig(boolean anonAccessEnabled,boolean anonAccessToBuildInfosDisabled,boolean hideUnauthorizedResources,
-            PasswordSettings passwordSetting, UserLockPolicy userLockPolicy){
-        this.setAnonAccessEnabled(anonAccessEnabled);
-        this.setAnonAccessToBuildInfosDisabled(anonAccessToBuildInfosDisabled);
-        this.setHideUnauthorizedResources(hideUnauthorizedResources);
-        this.setPasswordSettings(passwordSetting);
-        this.setUserLockPolicy(userLockPolicy);
-    }
-
-    public boolean isAnonAccessEnabled() {
-        return anonAccessEnabled;
-    }
-
-    public void setAnonAccessEnabled(boolean anonAccessEnabled) {
-        this.anonAccessEnabled = anonAccessEnabled;
-    }
-
-    public boolean isAnonAccessToBuildInfosDisabled() {
-        return anonAccessToBuildInfosDisabled;
-    }
-
-    public void setAnonAccessToBuildInfosDisabled(boolean anonAccessToBuildInfosDisabled) {
-        this.anonAccessToBuildInfosDisabled = anonAccessToBuildInfosDisabled;
-    }
-
-    public boolean isHideUnauthorizedResources() {
-        return hideUnauthorizedResources;
-    }
-
-    public void setHideUnauthorizedResources(boolean hideUnauthorizedResources) {
-        this.hideUnauthorizedResources = hideUnauthorizedResources;
-    }
-
-    public PasswordSettings getPasswordSettings() {
-        return passwordSettings;
-    }
-
-    public void setPasswordSettings(PasswordSettings passwordSettings) {
-        this.passwordSettings = passwordSettings;
-    }
-
-    public UserLockPolicy getUserLockPolicy() {
-        return userLockPolicy;
-    }
-
-    public void setUserLockPolicy(UserLockPolicy userLockPolicy) {
-        this.userLockPolicy = userLockPolicy;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/group/BaseGroup.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/group/BaseGroup.java
deleted file mode 100644
index f84b1a0..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/group/BaseGroup.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.group;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Chen Keinan
- */
-public class BaseGroup extends BaseModel {
-
-    private String groupName;
-    private String realm;
-
-    public String getGroupName() {
-        return groupName;
-    }
-
-    public void setGroupName(String groupName) {
-        this.groupName = groupName;
-    }
-
-    public String getRealm() {
-        return realm;
-    }
-
-    public void setRealm(String realm) {
-        this.realm = realm;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/group/DeleteGroupsModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/group/DeleteGroupsModel.java
deleted file mode 100644
index 96ff1c0..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/group/DeleteGroupsModel.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.group;
-
-import com.google.common.collect.Lists;
-import org.artifactory.rest.common.model.RestModel;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class DeleteGroupsModel implements RestModel {
-    private List<String> groupNames = Lists.newArrayList();
-
-    public List<String> getGroupNames() {
-        return groupNames;
-    }
-
-    public void addGroup(String groupName) {
-        groupNames.add(groupName);
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/group/Group.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/group/Group.java
deleted file mode 100644
index 65a791e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/group/Group.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.group;
-
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.sapi.security.SecurityConstants;
-import org.artifactory.security.GroupConfigurationImpl;
-import org.artifactory.security.MutableGroupInfo;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class Group extends GroupConfigurationImpl implements RestModel, MutableGroupInfo {
-
-    private boolean external;
-
-    public Group(){}
-
-    private List<String> usersInGroup = new ArrayList<>();
-
-    private List<String> groups;
-
-    private List<String> permissions;
-
-    public Group(String groupName) {
-        setGroupName(groupName);
-    }
-
-    @Override
-    public String getGroupName() {
-        return super.getName();
-    }
-
-    @Override
-    public void setGroupName(String groupName) {
-        super.setName(groupName);
-    }
-
-    @Override
-    public boolean isNewUserDefault() {
-        return super.isAutoJoin();
-    }
-
-    @Override
-    public void setNewUserDefault(boolean newUserDefault) {
-        super.setAutoJoin(newUserDefault);
-    }
-
-    @Override
-    public boolean isExternal() {
-        return external;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-
-    public List<String> getUsersInGroup() {
-        return usersInGroup;
-    }
-
-    public void setUsersInGroup(List<String> usersInGroup) {
-        this.usersInGroup = usersInGroup;
-    }
-
-    public List<String> getGroups() {
-        return groups;
-    }
-
-    public void setGroups(List<String> groups) {
-        this.groups = groups;
-    }
-
-    public void setExternal(boolean external) {
-        this.external = external;
-    }
-
-    public List<String> getPermissions() {
-        return permissions;
-    }
-
-    public void setPermissions(List<String> permissions) {
-        this.permissions = permissions;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/group/UserGroup.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/group/UserGroup.java
deleted file mode 100644
index 9a6b98c..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/group/UserGroup.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.group;
-
-import org.artifactory.security.UserGroupInfo;
-
-/**
- * @author Chen Keinan
- */
-public class UserGroup extends BaseGroup implements UserGroupInfo{
-
-    private boolean isExternal;
-
-    @Override
-    public boolean isExternal() {
-        return isExternal;
-    }
-
-    public void setExternal(boolean isExternal) {
-        this.isExternal = isExternal;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/httpsso/HttpSso.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/httpsso/HttpSso.java
deleted file mode 100644
index b7434fe..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/httpsso/HttpSso.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.httpsso;
-
-import org.artifactory.descriptor.security.sso.HttpSsoSettings;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-
-/**
- * @author Chen Keinan
- */
-public class HttpSso extends HttpSsoSettings implements RestModel {
-
-    public HttpSso() {
-    }
-
-    public HttpSso(HttpSsoSettings httpSsoSettings) {
-        if (httpSsoSettings != null) {
-            super.setHttpSsoProxied(httpSsoSettings.isHttpSsoProxied());
-            super.setNoAutoUserCreation(!httpSsoSettings.isNoAutoUserCreation());
-            super.setRemoteUserRequestVariable(httpSsoSettings.getRemoteUserRequestVariable());
-            super.setAllowUserToAccessProfile(httpSsoSettings.isAllowUserToAccessProfile());
-        }
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/ldap/GroupMappingStrategy.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/ldap/GroupMappingStrategy.java
deleted file mode 100644
index a6958a1..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/ldap/GroupMappingStrategy.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.ldap;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Chen Keinan
- */
-public class GroupMappingStrategy extends BaseModel {
-
-    private String groupKeyMember;
-    private String filter;
-    private String groupNameAttribute;
-    private String description;
-
-    public GroupMappingStrategy(String groupKeyMember, String filter, String groupNameAttribute, String description) {
-        this.groupKeyMember = groupKeyMember;
-        this.filter = filter;
-        this.groupNameAttribute = groupNameAttribute;
-        this.description = description;
-    }
-
-    public String getGroupKeyMember() {
-        return groupKeyMember;
-    }
-
-    public void setGroupKeyMember(String groupKeyMember) {
-        this.groupKeyMember = groupKeyMember;
-    }
-
-    public String getFilter() {
-        return filter;
-    }
-
-    public void setFilter(String filter) {
-        this.filter = filter;
-    }
-
-    public String getGroupNameAttribute() {
-        return groupNameAttribute;
-    }
-
-    public void setGroupNameAttribute(String groupNameAttribute) {
-        this.groupNameAttribute = groupNameAttribute;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/ldap/LdapGroupModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/ldap/LdapGroupModel.java
deleted file mode 100644
index bfec47b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/ldap/LdapGroupModel.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.ldap;
-
-import org.artifactory.descriptor.security.ldap.group.LdapGroupSetting;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.model.RestSpecialFields;
-import org.artifactory.rest.common.service.IgnoreSpecialFields;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.codehaus.jackson.map.annotate.JsonFilter;
-
-/**
- * @author Chen Keinan
- */
- at JsonFilter("exclude fields")
- at IgnoreSpecialFields({"descriptionAttribute", "subTree", "groupMemberAttribute", "groupNameAttribute", "groupBaseDn", "filter", "enabled"})
-public class LdapGroupModel extends LdapGroupSetting implements RestModel, RestSpecialFields {
-    private boolean isView;
-
-    public LdapGroupModel() {
-    }
-
-    public LdapGroupModel(LdapGroupSetting ldapGroupSetting, boolean isView) {
-        if (ldapGroupSetting != null) {
-            super.setName(ldapGroupSetting.getName());
-            super.setStrategy(ldapGroupSetting.getStrategy());
-            super.setEnabledLdap(ldapGroupSetting.getEnabledLdap());
-            if (isView) {
-                this.isView = isView;
-            } else {
-                super.setDescriptionAttribute(ldapGroupSetting.getDescriptionAttribute());
-                super.setFilter(ldapGroupSetting.getFilter());
-                super.setGroupBaseDn(ldapGroupSetting.getGroupBaseDn());
-                super.setGroupMemberAttribute(ldapGroupSetting.getGroupMemberAttribute());
-                super.setGroupNameAttribute(ldapGroupSetting.getGroupNameAttribute());
-                super.setSubTree(ldapGroupSetting.isSubTree());
-            }
-        }
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToStringIgnoreSpecialFields(this);
-    }
-
-    @Override
-    public boolean ignoreSpecialFields() {
-        return isView;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || !(this.getClass().getSuperclass().getSimpleName().equals(o.getClass().getSimpleName()))) {
-            return false;
-        }
-        LdapGroupSetting that = (LdapGroupSetting) o;
-        return this.getName().equals(that.getName());
-    }
-
-    @Override
-    public int hashCode() {
-        return this.getName().hashCode();
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/ldap/LdapImportModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/ldap/LdapImportModel.java
deleted file mode 100644
index 4338331..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/ldap/LdapImportModel.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.ldap;
-
-import java.util.List;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Chen Keinan
- */
-public class LdapImportModel extends BaseModel {
-
-    private LdapGroupModel ldapGroupSettings;
-    private List<LdapUserGroupModel> importGroups;
-
-    public LdapGroupModel getLdapGroupSettings() {
-        return ldapGroupSettings;
-    }
-
-    public void setLdapGroupSettings(LdapGroupModel ldapGroupSettings) {
-        this.ldapGroupSettings = ldapGroupSettings;
-    }
-
-    public List<LdapUserGroupModel> getImportGroups() {
-        return importGroups;
-    }
-
-    public void setImportGroups(
-            List<LdapUserGroupModel> importGroups) {
-        this.importGroups = importGroups;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/ldap/LdapSettingModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/ldap/LdapSettingModel.java
deleted file mode 100644
index ec1e44e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/ldap/LdapSettingModel.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.ldap;
-
-import org.artifactory.descriptor.security.ldap.LdapSetting;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.model.RestSpecialFields;
-import org.artifactory.rest.common.service.IgnoreSpecialFields;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.codehaus.jackson.map.annotate.JsonFilter;
-
-/**
- * @author chen Keinan
- */
- at JsonFilter("exclude fields")
- at IgnoreSpecialFields({"autoCreateUser", "enabled", "emailAttribute"})
-public class LdapSettingModel extends LdapSetting implements RestModel, RestSpecialFields {
-
-    private boolean isView;
-    private String testUsername;
-    private String testPassword;
-
-    LdapSettingModel() {
-    }
-
-    public LdapSettingModel(LdapSetting ldapSetting, boolean isView) {
-        if (ldapSetting != null) {
-            super.setKey(ldapSetting.getKey());
-            super.setLdapUrl(ldapSetting.getLdapUrl());
-            if (isView) {
-                this.isView = true;
-            } else {
-                super.setEnabled(ldapSetting.isEnabled());
-                super.setAutoCreateUser(ldapSetting.isAutoCreateUser());
-                super.setEmailAttribute(ldapSetting.getEmailAttribute());
-                super.setSearch(ldapSetting.getSearch());
-                super.setUserDnPattern(ldapSetting.getUserDnPattern());
-            }
-        }
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToStringIgnoreSpecialFields(this);
-    }
-
-    @Override
-    public boolean ignoreSpecialFields() {
-        return isView;
-    }
-
-
-    public String getTestUsername() {
-        return testUsername;
-    }
-
-    public void setTestUsername(String testUsername) {
-        this.testUsername = testUsername;
-    }
-
-    public String getTestPassword() {
-        return testPassword;
-    }
-
-    public void setTestPassword(String testPassword) {
-        this.testPassword = testPassword;
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/ldap/LdapUserGroupModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/ldap/LdapUserGroupModel.java
deleted file mode 100644
index cc382b2..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/ldap/LdapUserGroupModel.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.ldap;
-
-import org.artifactory.addon.ldapgroup.LdapUserGroup;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-
-/**
- * @author Chen Keinan
- */
-public class LdapUserGroupModel extends LdapUserGroup implements RestModel {
-
-    public LdapUserGroupModel() {
-        super();
-    }
-
-    public LdapUserGroupModel(String groupName, String description, String groupDn) {
-        super(groupName, description, groupDn);
-    }
-
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/login/UserLogin.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/login/UserLogin.java
deleted file mode 100644
index 03ef706..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/login/UserLogin.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.login;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author chen keinan
- */
-public class UserLogin extends BaseModel{
-
-    private String user;
-    private  String password;
-    Boolean forgotPassword;
-    Boolean canRememberMe;
-    private String ssoProviderLink;
-
-    public UserLogin(){}
-
-    public UserLogin(String user) {
-        this.user = user;
-    }
-
-    public String getUser() {
-        return user;
-    }
-
-    public void setUser(String user) {
-        this.user = user;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public void setPassword(String password) {
-        this.password = password;
-    }
-
-    public Boolean getForgotPassword() {
-        return forgotPassword;
-    }
-
-    public void setForgotPassword(Boolean forgotPassword) {
-        this.forgotPassword = forgotPassword;
-    }
-
-    public Boolean getCanRememberMe() {
-        return canRememberMe;
-    }
-
-    public void setCanRememberMe(Boolean canRememberMe) {
-        this.canRememberMe = canRememberMe;
-    }
-
-    public String getSsoProviderLink() {
-        return ssoProviderLink;
-    }
-
-    public void setSsoProviderLink(String ssoProviderLink) {
-        this.ssoProviderLink = ssoProviderLink;
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/oauth/OAuthProviderInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/oauth/OAuthProviderInfo.java
deleted file mode 100644
index 488c063..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/oauth/OAuthProviderInfo.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.oauth;
-
-import org.artifactory.api.rest.restmodel.IModel;
-
-/**
- * @author Gidi Shabat
- */
-public class OAuthProviderInfo implements IModel {
-    private String displayName;
-    private String type;
-    private String[] mandatoryFields;
-    private String[] fieldHolders;
-    private String[] fieldsValues;
-
-
-    public String getDisplayName() {
-        return displayName;
-    }
-
-    public void setDisplayName(String displayName) {
-        this.displayName = displayName;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public String[] getMandatoryFields() {
-        return mandatoryFields;
-    }
-
-    public void setMandatoryFields(String[] mandatoryFields) {
-        this.mandatoryFields = mandatoryFields;
-    }
-
-    public String[] getFieldHolders() {
-        return fieldHolders;
-    }
-
-    public void setFieldHolders(String[] fieldHolders) {
-        this.fieldHolders = fieldHolders;
-    }
-
-    public String[] getFieldsValues() {
-        return fieldsValues;
-    }
-
-    public void setFieldsValues(String[] fieldsValues) {
-        this.fieldsValues = fieldsValues;
-    }
-}
-
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/oauth/OAuthProviderUIModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/oauth/OAuthProviderUIModel.java
deleted file mode 100644
index b12d28f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/oauth/OAuthProviderUIModel.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.oauth;
-
-/**
- * @author Gidi Shabat
- */
-public class OAuthProviderUIModel {
-    private String name;
-    private boolean enabled;
-    private String providerType;
-    private String id;
-    private String secret;
-    private String apiUrl;
-    private String authUrl;
-    private String tokenUrl;
-    private String basicUrl;
-    private String domain;
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public boolean isEnabled() {
-        return enabled;
-    }
-
-    public void setEnabled(boolean enabled) {
-        this.enabled = enabled;
-    }
-
-    public String getProviderType() {
-        return providerType;
-    }
-
-    public void setProviderType(String providerType) {
-        this.providerType = providerType;
-    }
-
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public String getSecret() {
-        return secret;
-    }
-
-    public void setSecret(String secret) {
-        this.secret = secret;
-    }
-
-    public String getApiUrl() {
-        return apiUrl;
-    }
-
-    public void setApiUrl(String apiUrl) {
-        this.apiUrl = apiUrl;
-    }
-
-    public String getAuthUrl() {
-        return authUrl;
-    }
-
-    public void setAuthUrl(String authUrl) {
-        this.authUrl = authUrl;
-    }
-
-    public String getTokenUrl() {
-        return tokenUrl;
-    }
-
-    public void setTokenUrl(String tokenUrl) {
-        this.tokenUrl = tokenUrl;
-    }
-
-    public String getBasicUrl() {
-        return basicUrl;
-    }
-
-    public void setBasicUrl(String basicUrl) {
-        this.basicUrl = basicUrl;
-    }
-
-    public void setDomain(String domain) {
-        this.domain = domain;
-    }
-
-    public String getDomain() {
-        return domain;
-    }
-
-
-}
-
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/oauth/OAuthUIModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/oauth/OAuthUIModel.java
deleted file mode 100644
index fab6247..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/oauth/OAuthUIModel.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.oauth;
-
-import org.artifactory.api.rest.restmodel.IModel;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class OAuthUIModel implements IModel {
-    private boolean enabled;
-    private boolean persistUsers;
-    private String defaultNpm;
-    private List<OAuthProviderInfo> availableTypes;
-    private List<OAuthProviderUIModel> providers;
-    private boolean allowUserToAccessProfile;
-
-    public boolean isEnabled() {
-        return enabled;
-    }
-
-    public void setEnabled(boolean enabled) {
-        this.enabled = enabled;
-    }
-
-    public List<OAuthProviderInfo> getAvailableTypes() {
-        return availableTypes;
-    }
-
-    public void setAvailableTypes(List<OAuthProviderInfo> availableTypes) {
-        this.availableTypes = availableTypes;
-    }
-
-    public List<OAuthProviderUIModel> getProviders() {
-        return providers;
-    }
-
-    public void setProviders(List<OAuthProviderUIModel> providers) {
-        this.providers = providers;
-    }
-
-    public boolean isPersistUsers() {
-        return persistUsers;
-    }
-
-    public void setPersistUsers(boolean persistUsers) {
-        this.persistUsers = persistUsers;
-    }
-
-    public String getDefaultNpm() {
-        return defaultNpm;
-    }
-
-    public void setDefaultNpm(String defaultNpm) {
-        this.defaultNpm = defaultNpm;
-    }
-
-    public boolean isAllowUserToAccessProfile() {
-        return allowUserToAccessProfile;
-    }
-
-    public void setAllowUserToAccessProfile(boolean allowUserToAccessProfile) {
-        this.allowUserToAccessProfile = allowUserToAccessProfile;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/oauth/OAuthUIProvidersTypeEnum.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/oauth/OAuthUIProvidersTypeEnum.java
deleted file mode 100644
index b3f6742..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/oauth/OAuthUIProvidersTypeEnum.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.oauth;
-
-import org.artifactory.addon.oauth.OAuthProvidersTypeEnum;
-
-/**
- * @author Gidi Shabat
- */
-public enum OAuthUIProvidersTypeEnum {
-    //Second set of values is for ui placeholders
-
-    github("GitHub", OAuthProvidersTypeEnum.github,
-            new String[]{"apiUrl", "authUrl", "tokenUrl", "basicUrl"},
-            new String[]{"https://api.github.com/user", "https://github.com/login/oauth/authorize", "https://github.com/login/oauth/access_token", "https://github.com/"},
-            new String[]{"<base_url>/api/v3/user", "<base_url>/login/oauth/authorize", "<base_url>/login/oauth/access_token", null}),
-
-    google("Google", OAuthProvidersTypeEnum.google,
-            new String[]{"apiUrl", "authUrl", "tokenUrl", "domain"},
-            new String[]{"https://www.googleapis.com/oauth2/v1/userinfo", "https://accounts.google.com/o/oauth2/auth", "https://www.googleapis.com/oauth2/v3/token", null},
-            new String[]{null, null, null, null}),
-
-    cloudfoundry("Cloud Foundry", OAuthProvidersTypeEnum.cloudfoundry,
-            new String[]{"apiUrl", "authUrl", "tokenUrl"},
-            new String[]{null, null, null},
-            new String[]{"<base_url>/userinfo", "<base_url>/oauth/authorize", "<base_url>/oauth/token"}),
-
-    openId("OpenID", OAuthProvidersTypeEnum.openId,
-            new String[]{"apiUrl",  "authUrl", "tokenUrl"},
-            new String[]{null, null, null},
-            new String[]{null, null, null});
-
-    private String signature;
-    private OAuthProvidersTypeEnum providerType;
-    private String[] mandatoryFields;
-    private String[] fieldsValues;
-    private String[] fieldHolders;
-
-    OAuthUIProvidersTypeEnum(String signature, OAuthProvidersTypeEnum providerType, String[] mandatoryFields, String[] fieldsValues, String[] fieldHolders) {
-        this.providerType = providerType;
-        this.signature = signature;
-        this.mandatoryFields = mandatoryFields;
-        this.fieldsValues = fieldsValues;
-        this.fieldHolders = fieldHolders;
-    }
-
-    public OAuthProviderInfo getProviderInfo() {
-        OAuthProviderInfo oAuthProviderInfo = new OAuthProviderInfo();
-        oAuthProviderInfo.setFieldHolders(fieldHolders);
-        oAuthProviderInfo.setFieldsValues(fieldsValues);
-        oAuthProviderInfo.setDisplayName(signature);
-        oAuthProviderInfo.setType(name());
-        oAuthProviderInfo.setMandatoryFields(mandatoryFields);
-        return oAuthProviderInfo;
-    }
-
-    public OAuthProvidersTypeEnum getProviderType() {
-        return providerType;
-    }
-
-    public String getSignature() {
-        return signature;
-    }
-
-    public String[] getMandatoryFields() {
-        return mandatoryFields;
-    }
-
-    public String[] getFieldsValues() {
-        return fieldsValues;
-    }
-
-    public String[] getFieldHolders() {
-        return fieldHolders;
-    }
-
-    public static OAuthUIProvidersTypeEnum fromProviderType(OAuthProvidersTypeEnum providerType) {
-        for (OAuthUIProvidersTypeEnum oAuthUIProvidersTypeEnum : values()) {
-            if (providerType == oAuthUIProvidersTypeEnum.getProviderType()) {
-                return oAuthUIProvidersTypeEnum;
-            }
-        }
-        return null;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/oauth/OAuthUserToken.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/oauth/OAuthUserToken.java
deleted file mode 100644
index a6fa16e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/oauth/OAuthUserToken.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.oauth;
-
-import org.artifactory.api.rest.restmodel.IModel;
-
-/**
- * @author Gidi Shabat
- */
-public class OAuthUserToken implements IModel {
-    private String userName;
-    private String providerName;
-
-    public OAuthUserToken(String userName, String providerName) {
-        this.userName = userName;
-        this.providerName = providerName;
-    }
-
-    public String getUserName() {
-        return userName;
-    }
-
-    public String getProviderName() {
-        return providerName;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/permissions/AllUsersAndGroupsModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/permissions/AllUsersAndGroupsModel.java
deleted file mode 100644
index 677096e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/permissions/AllUsersAndGroupsModel.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.permissions;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Shay Yaakov
- */
-public class AllUsersAndGroupsModel extends BaseModel {
-
-    private List<String> allGroups = new ArrayList<>();
-    private List<String> allUsers = new ArrayList<>();
-
-    public List<String> getAllGroups() {
-        return allGroups;
-    }
-
-    public void setAllGroups(List<String> allGroups) {
-        this.allGroups = allGroups;
-    }
-
-    public List<String> getAllUsers() {
-        return allUsers;
-    }
-
-    public void setAllUsers(List<String> allUsers) {
-        this.allUsers = allUsers;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/permissions/DeletePermissionTargetModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/permissions/DeletePermissionTargetModel.java
deleted file mode 100644
index a2fc934..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/permissions/DeletePermissionTargetModel.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.permissions;
-
-import com.google.common.collect.Lists;
-import org.artifactory.rest.common.model.RestModel;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class DeletePermissionTargetModel implements RestModel {
-    private List<String> permissionTargetNames = Lists.newArrayList();
-
-    public List<String> getPermissionTargetNames() {
-        return permissionTargetNames;
-    }
-
-    public void addPermissionTargetName(String permissionTargetName) {
-        permissionTargetNames.add(permissionTargetName);
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/permissions/PermissionTargetModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/permissions/PermissionTargetModel.java
deleted file mode 100644
index c0f03a1..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/permissions/PermissionTargetModel.java
+++ /dev/null
@@ -1,244 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.permissions;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.rest.common.model.BaseModel;
-import org.artifactory.security.PermissionTargetInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.permission.EffectivePermission;
-import org.artifactory.ui.rest.model.utils.repositories.RepoKeyType;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
-public class PermissionTargetModel extends BaseModel {
-    private String name;
-    private List<RepoKeyType> repoKeys = new ArrayList<>();
-    private List<String> includes;
-    private List<String> exclude;
-    private String includePattern;
-    private String excludePattern;
-    private List<RepoKeyType> availableRepoKeys = new ArrayList<>();
-    private List<EffectivePermission> groups = new ArrayList<>();
-    private List<EffectivePermission> users = new ArrayList<>();
-    private boolean anyRemote;
-    private boolean anyLocal;
-    private boolean anyDistribution;
-    private String repoKeysView;
-    private String userView;
-    private String groupsView;
-    private transient int numOfDistRepos = 0;
-
-    public PermissionTargetModel() {
-    }
-
-    public PermissionTargetModel(PermissionTargetInfo permissionTargetInfo) {
-        this.name = permissionTargetInfo.getName();
-        updateRepoKeysData(permissionTargetInfo);
-        this.includes = permissionTargetInfo.getIncludes();
-        this.exclude = permissionTargetInfo.getExcludes();
-        this.includePattern = permissionTargetInfo.getIncludesPattern();
-        this.excludePattern = permissionTargetInfo.getExcludesPattern();
-    }
-
-    /**
-     * update repo  key value data
-     * @param permissionTargetInfo - permission target info
-     */
-    private void updateRepoKeysData(PermissionTargetInfo permissionTargetInfo) {
-        updateRepoKeyView(permissionTargetInfo);
-        Map<String, DistributionRepoDescriptor> distRepos =
-                ContextHelper.get().getCentralConfig().getDescriptor().getDistributionRepositoriesMap();
-        permissionTargetInfo.getRepoKeys().forEach(repoKey-> {
-            if (repoKey.equals("ANY REMOTE")) {
-                anyRemote = true;
-            }
-            if (repoKey.equals("ANY LOCAL")) {
-                anyLocal = true;
-            }
-            if (repoKey.equals("ANY")) {
-                anyLocal = true;
-                anyRemote = true;
-                anyDistribution = true;
-            }
-            if (repoKey.endsWith("-cache")) {
-                this.repoKeys.add(new RepoKeyType("remote", repoKey.replace("-cache", "")));
-            }
-            if (!repoKey.endsWith("-cache") && !repoKey.equals("ANY REMOTE") &&
-                    !repoKey.equals("ANY LOCAL") && !repoKey.equals("ANY")) {
-                if (distRepos.containsKey(repoKey)) {
-                    this.repoKeys.add(new RepoKeyType("distribution", repoKey));
-                    numOfDistRepos++;
-                } else {
-                    this.repoKeys.add(new RepoKeyType("local", repoKey));
-                }
-            }
-        });
-        anyDistribution = distRepos.size() == numOfDistRepos;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public List<RepoKeyType> getRepoKeys() {
-        return repoKeys;
-    }
-
-    public void setRepoKeys(List<RepoKeyType> repoKeys) {
-        this.repoKeys = repoKeys;
-    }
-
-    public List<RepoKeyType> getAvailableRepoKeys() {
-        return availableRepoKeys;
-    }
-
-    public void setAvailableRepoKeys(List<RepoKeyType> availableRepoKeys) {
-        this.availableRepoKeys = availableRepoKeys;
-    }
-
-    public List<String> getIncludes() {
-        return includes;
-    }
-
-    public void setIncludes(List<String> includes) {
-        this.includes = includes;
-    }
-
-    public List<String> getExclude() {
-        return exclude;
-    }
-
-    public void setExclude(List<String> exclude) {
-        this.exclude = exclude;
-    }
-
-    public String getIncludePattern() {
-        return includePattern;
-    }
-
-    public void setIncludePattern(String includePattern) {
-        this.includePattern = includePattern;
-    }
-
-    public String getExcludePattern() {
-        return excludePattern;
-    }
-
-    public void setExcludePattern(String excludePattern) {
-        this.excludePattern = excludePattern;
-    }
-
-    /**
-     * update repositories column data for grid
-     *
-     * @param permissionTargetInfo - permission target data
-     */
-    void updateRepoKeyView(PermissionTargetInfo permissionTargetInfo) {
-        if (permissionTargetInfo.getRepoKeys() != null && !permissionTargetInfo.getRepoKeys().isEmpty()) {
-            StringBuilder keysBuilder = new StringBuilder();
-            permissionTargetInfo.getRepoKeys().forEach(repoKey -> {
-                if (repoKey != null) {
-                    keysBuilder.append(repoKey);
-                    keysBuilder.append(", ");
-                }
-            });
-            repoKeysView = keysBuilder.toString();
-        }
-    }
-
-    public String getRepoKeysView() {
-        if (repoKeys != null && !repoKeys.isEmpty()) {
-            return repoKeys.size() + " | " + repoKeysView.substring(0, repoKeysView.length() - 2).toString();
-        } else {
-            return "";
-        }
-    }
-
-    public String getUserView() {
-        if (users != null && !users.isEmpty()) {
-            StringBuilder keysBuilder = new StringBuilder();
-            users.forEach(user -> {
-                keysBuilder.append(user.getPrincipal());
-                keysBuilder.append(", ");
-            });
-            String keyChain = keysBuilder.toString();
-            return users.size() + " | " + keyChain.substring(0, keyChain.length() - 2).toString();
-        } else {
-            return "";
-        }
-    }
-
-    public String getGroupsView() {
-        if (groups != null && !groups.isEmpty()) {
-            StringBuilder keysBuilder = new StringBuilder();
-            groups.forEach(group -> {
-                keysBuilder.append(group.getPrincipal());
-                keysBuilder.append(", ");
-            });
-            String keyChain = keysBuilder.toString();
-            return groups.size() + " | " + keyChain.substring(0, keyChain.length() - 2).toString();
-        } else {
-            return "";
-        }
-    }
-
-    public List<EffectivePermission> getGroups() {
-        return groups;
-    }
-
-    public void setGroups(List<EffectivePermission> groups) {
-        this.groups = groups;
-    }
-
-    public List<EffectivePermission> getUsers() {
-        return users;
-    }
-
-    public void setUsers(List<EffectivePermission> users) {
-        this.users = users;
-    }
-
-    public boolean isAnyRemote() {
-        return anyRemote;
-    }
-
-    public void setAnyRemote(boolean anyRemote) {
-        this.anyRemote = anyRemote;
-    }
-
-    public boolean isAnyLocal() {
-        return anyLocal;
-    }
-
-    public void setAnyLocal(boolean anyLocal) {
-        this.anyLocal = anyLocal;
-    }
-
-    public boolean isAnyDistribution() {
-        return anyDistribution;
-    }
-
-    public void setAnyDistribution(boolean anyDistribution) {
-        this.anyDistribution = anyDistribution;
-    }
-
-    public void setRepoKeysView(String repoKeysView) {
-        this.repoKeysView = repoKeysView;
-    }
-
-    public void setUserView(String userView) {
-        this.userView = userView;
-    }
-
-    public void setGroupsView(String groupsView) {
-        this.groupsView = groupsView;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/saml/Saml.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/saml/Saml.java
deleted file mode 100644
index df65798..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/saml/Saml.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.saml;
-
-import org.artifactory.descriptor.security.sso.SamlSettings;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-
-/**
- * @author Chen Keinan
- */
-public class Saml extends SamlSettings implements RestModel {
-
-    Saml() {
-    }
-
-    public Saml(SamlSettings samlSettings) {
-        if (samlSettings != null) {
-            super.setEnableIntegration(samlSettings.isEnableIntegration());
-            super.setCertificate(samlSettings.getCertificate());
-            super.setLoginUrl(samlSettings.getLoginUrl());
-            super.setLogoutUrl(samlSettings.getLogoutUrl());
-            super.setNoAutoUserCreation(samlSettings.getNoAutoUserCreation());
-            super.setServiceProviderName(samlSettings.getServiceProviderName());
-            super.setAllowUserToAccessProfile(samlSettings.isAllowUserToAccessProfile());
-            super.setAutoRedirect(samlSettings.isAutoRedirect());
-        }
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/signingkey/KeyStore.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/signingkey/KeyStore.java
deleted file mode 100644
index f0d56ff..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/signingkey/KeyStore.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.signingkey;
-
-import java.util.List;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Chen Keinan
- */
-public class KeyStore extends BaseModel {
-
-    private Boolean isKeyValid;
-    private String password;
-    private String alias;
-    private String keyPairName;
-    private String fileName;
-    private String privateKeyPassword;
-    private boolean keyStoreExist;
-    List<String> keyStorePairNames;
-
-    public KeyStore() {
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public void setPassword(String password) {
-        this.password = password;
-    }
-
-    public KeyStore(Boolean isKeyValid, String alias, String fileName, String password) {
-        this.isKeyValid = isKeyValid;
-        this.alias = alias;
-        this.fileName = fileName;
-        this.password = password;
-    }
-
-    public Boolean isKeyValid() {
-        return isKeyValid;
-    }
-
-    public void setIsKeyValid(Boolean isKeyValid) {
-        this.isKeyValid = isKeyValid;
-    }
-
-    public String getAlias() {
-        return alias;
-    }
-
-    public void setAlias(String alias) {
-        this.alias = alias;
-    }
-
-    public String getKeyPairName() {
-        return keyPairName;
-    }
-
-    public void setKeyPairName(String keyPairName) {
-        this.keyPairName = keyPairName;
-    }
-
-
-    public String getFileName() {
-        return fileName;
-    }
-
-    public void setFileName(String fileName) {
-        this.fileName = fileName;
-    }
-
-    public String getPrivateKeyPassword() {
-        return privateKeyPassword;
-    }
-
-    public void setPrivateKeyPassword(String privateKeyPassword) {
-        this.privateKeyPassword = privateKeyPassword;
-    }
-
-    public boolean isKeyStoreExist() {
-        return keyStoreExist;
-    }
-
-    public void setKeyStoreExist(boolean keyStoreExist) {
-        this.keyStoreExist = keyStoreExist;
-    }
-
-    public List<String> getKeyStorePairNames() {
-        return keyStorePairNames;
-    }
-
-    public void setKeyStorePairNames(List<String> keyStorePairNames) {
-        this.keyStorePairNames = keyStorePairNames;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/signingkey/SignKey.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/signingkey/SignKey.java
deleted file mode 100644
index cd526c4..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/signingkey/SignKey.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.signingkey;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Chen Keinan
- */
-public class SignKey extends BaseModel {
-
-    private String publicKeyLink;
-    private String passPhrase;
-    boolean publicKeyInstalled;
-    boolean privateKeyInstalled;
-
-    public SignKey() {
-    }
-
-    public SignKey(String publicKeyDownloadTarget) {
-        this.publicKeyLink = publicKeyDownloadTarget;
-    }
-
-    public String getPublicKeyLink() {
-        return publicKeyLink;
-    }
-
-    public void setPublicKeyLink(String publicKeyLink) {
-        this.publicKeyLink = publicKeyLink;
-    }
-
-    public String getPassPhrase() {
-        return passPhrase;
-    }
-
-    public void setPassPhrase(String passPhrase) {
-        this.passPhrase = passPhrase;
-    }
-
-    public boolean isPublicKeyInstalled() {
-        return publicKeyInstalled;
-    }
-
-    public void setPublicKeyInstalled(boolean publicKeyInstalled) {
-        this.publicKeyInstalled = publicKeyInstalled;
-    }
-
-    public boolean isPrivateKeyInstalled() {
-        return privateKeyInstalled;
-    }
-
-    public void setPrivateKeyInstalled(boolean privateKeyInstalled) {
-        this.privateKeyInstalled = privateKeyInstalled;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/sshserver/SshServer.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/sshserver/SshServer.java
deleted file mode 100644
index 9ec30b7..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/sshserver/SshServer.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.sshserver;
-
-import org.artifactory.descriptor.security.sshserver.SshServerSettings;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.admin.security.signingkey.SignKey;
-
-/**
- * @author Noam Y. Tenne
- */
-public class SshServer extends SshServerSettings implements RestModel {
-
-    private SignKey serverKey;
-
-    private String customUrlBase;
-
-    public SshServer() {
-    }
-
-    public SshServer(SshServerSettings sshServerSettings) {
-        if (sshServerSettings != null) {
-            super.setEnableSshServer(sshServerSettings.isEnableSshServer());
-            super.setSshServerPort(sshServerSettings.getSshServerPort());
-        }
-    }
-
-    public SignKey getServerKey() {
-        return serverKey;
-    }
-
-    public void setServerKey(SignKey serverKey) {
-        this.serverKey = serverKey;
-    }
-
-    public String getCustomUrlBase() { return customUrlBase; }
-
-    public void setCustomUrlBase(String customUrlBase) { this.customUrlBase = customUrlBase; }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/user/BaseUser.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/user/BaseUser.java
deleted file mode 100644
index 2206188..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/user/BaseUser.java
+++ /dev/null
@@ -1,147 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.user;
-
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.security.UserConfigurationImpl;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class BaseUser extends UserConfigurationImpl implements RestModel {
-
-    private boolean proWithoutLicense;
-
-    public BaseUser(){}
-
-    private Boolean canDeploy;
-    private Boolean canManage;
-    private Boolean preventAnonAccessBuild;
-    private List<UserPermissions> permissionsList;
-    private String externalRealmLink;
-    private Boolean anonAccessEnabled;
-    private boolean existsInDB;
-    private boolean requireProfileUnlock;
-    private boolean requireProfilePassword;
-    private Boolean locked;
-    private Boolean credentialsExpired;
-    private Integer currentPasswordValidFor;
-
-    public void setProWithoutLicense(boolean proWithoutLicense) {
-        this.proWithoutLicense = proWithoutLicense;
-    }
-
-    public boolean isProWithoutLicense() {
-        return proWithoutLicense;
-    }
-
-    public BaseUser (String userName,boolean admin){
-        super.setAdmin(admin);
-        super.setName(userName);
-    }
-
-    public Boolean isCanDeploy() {
-        return canDeploy;
-    }
-
-    public void setCanDeploy(Boolean canDeploy) {
-        this.canDeploy = canDeploy;
-    }
-
-    public Boolean isCanManage() {
-        return canManage;
-    }
-
-    public void setCanManage(Boolean canManage) {
-        this.canManage = canManage;
-    }
-
-    public Boolean isPreventAnonAccessBuild() {
-        return preventAnonAccessBuild;
-    }
-
-    public void setPreventAnonAccessBuild(Boolean preventAnonAccessBuild) {
-        this.preventAnonAccessBuild = preventAnonAccessBuild;
-    }
-
-    public List<UserPermissions> getPermissionsList() {
-        return permissionsList;
-    }
-
-    public void setPermissionsList(List<UserPermissions> permissionsList) {
-        this.permissionsList = permissionsList;
-    }
-
-
-    public String getExternalRealmLink() {
-        return externalRealmLink;
-    }
-
-    public void setExternalRealmLink(String externalRealmLink) {
-        this.externalRealmLink = externalRealmLink;
-    }
-
-    public Boolean getAnonAccessEnabled() {
-        return anonAccessEnabled;
-    }
-
-    public void setAnonAccessEnabled(Boolean anonAccessEnabled) {
-        this.anonAccessEnabled = anonAccessEnabled;
-    }
-
-    public Boolean getLocked() {
-        return locked;
-    }
-
-    public void setLocked(Boolean locked) {
-        this.locked = locked;
-    }
-
-    public boolean isExistsInDB() { return existsInDB; }
-
-    public void setExistsInDB(boolean existsInDB) { this.existsInDB = existsInDB; }
-
-    public boolean isRequireProfileUnlock() {
-        return requireProfileUnlock;
-    }
-
-    public boolean isRequireProfilePassword() {
-        return requireProfilePassword;
-    }
-
-    public void setRequireProfilePassword(boolean requireProfilePassword) {
-        this.requireProfilePassword = requireProfilePassword;
-    }
-
-    public void setRequireProfileUnlock(boolean requireProfileUnlock) {
-        this.requireProfileUnlock = requireProfileUnlock;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-
-    public Boolean getCredentialsExpired() {
-        return credentialsExpired;
-    }
-
-    public void setCredentialsExpired(Boolean credentialsExpired) {
-        this.credentialsExpired = credentialsExpired;
-    }
-
-    /**
-     * @return number of days till password should be changed
-     */
-    public Integer getCurrentPasswordValidFor() {
-        return currentPasswordValidFor;
-    }
-
-    /**
-     * @param currentPasswordValidFor number of days till password should be changed
-     */
-    public void setCurrentPasswordValidFor(Integer currentPasswordValidFor) {
-        this.currentPasswordValidFor = currentPasswordValidFor;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/user/DeleteUsersModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/user/DeleteUsersModel.java
deleted file mode 100644
index 230268e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/user/DeleteUsersModel.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.user;
-
-import com.google.common.collect.Lists;
-import org.artifactory.rest.common.model.RestModel;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- *
- * Transfer Object that alloes to delete bulk of users
- */
-public class DeleteUsersModel implements RestModel {
-    private List<String> userNames = Lists.newArrayList();
-
-    public List<String> getUserNames() {
-        return userNames;
-    }
-
-    public void addUser(String userName) {
-        userNames.add(userName);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/user/User.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/user/User.java
deleted file mode 100644
index a06c0ed..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/user/User.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.user;
-
-import org.artifactory.security.UserGroupInfo;
-import org.artifactory.ui.rest.model.admin.security.group.UserGroup;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * @author chen keinan
- */
-public class User extends BaseUser{
-
-    private Set<UserGroup> userGroups;
-    private String externalRealmStatus;
-
-    public User() {}
-
-    public Set<UserGroupInfo> getUserGroups() {
-       if (userGroups == null){
-           return null;
-       }
-
-        Set<UserGroupInfo> userGroupInfos = new HashSet<>();
-        for (UserGroup group : userGroups){
-            userGroupInfos.add(group);
-        }
-        return userGroupInfos;
-    }
-
-    public String getExternalRealmStatus() {
-        return externalRealmStatus;
-    }
-
-    public void setExternalRealmStatus(String externalRealmStatus) {
-        this.externalRealmStatus = externalRealmStatus;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/user/UserPermissions.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/user/UserPermissions.java
deleted file mode 100644
index 48156ff..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/user/UserPermissions.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.user;
-
-import org.artifactory.rest.common.model.BaseModel;
-import org.artifactory.security.AceInfo;
-import org.artifactory.security.PermissionTargetInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.permission.EffectivePermission;
-
-import java.util.List;
-
-/**
- * @author Chen keinan
- */
-public class UserPermissions extends BaseModel {
-
-    private String permissionName;
-    private List<String> repoKeys;
-    private EffectivePermission effectivePermission;
-    private int numOfRepos;
-
-    UserPermissions() {
-    }
-
-    public UserPermissions(AceInfo aceInfo, PermissionTargetInfo permissionTargetInfo, int numOfRepos) {
-        this.permissionName = permissionTargetInfo.getName();
-        this.repoKeys = permissionTargetInfo.getRepoKeys();
-        this.effectivePermission = new EffectivePermission(aceInfo);
-        this.numOfRepos = numOfRepos;
-    }
-    public UserPermissions(AceInfo aceInfo, PermissionTargetInfo permissionTargetInfo) {
-        this.permissionName = permissionTargetInfo.getName();
-        this.repoKeys = permissionTargetInfo.getRepoKeys();
-        this.effectivePermission = new EffectivePermission(aceInfo);
-    }
-
-    public String getPermissionName() {
-        return permissionName;
-    }
-
-    public void setPermissionName(String permissionName) {
-        this.permissionName = permissionName;
-    }
-
-    public List<String> getRepoKeys() {
-        return repoKeys;
-    }
-
-    public void setRepoKeys(List<String> repoKeys) {
-        this.repoKeys = repoKeys;
-    }
-
-    public EffectivePermission getEffectivePermission() {
-        return effectivePermission;
-    }
-
-    public void setEffectivePermission(EffectivePermission effectivePermission) {
-        this.effectivePermission = effectivePermission;
-    }
-
-    public int getNumOfRepos() {
-        return numOfRepos;
-    }
-
-    public void setNumOfRepos(int numOfRepos) {
-        this.numOfRepos = numOfRepos;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/user/UserProfile.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/user/UserProfile.java
deleted file mode 100644
index 2781fb1..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/security/user/UserProfile.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.ui.rest.model.admin.security.user;
-
-import org.artifactory.rest.common.model.BaseModel;
-import org.artifactory.ui.rest.model.admin.configuration.bintray.BintrayUIModel;
-import org.artifactory.ui.rest.model.admin.configuration.ssh.SshClientUIModel;
-
-/**
- * @author Chen Keinan
- */
-public class UserProfile extends BaseModel {
-
-    private User user;
-    private BintrayUIModel bintray;
-    private SshClientUIModel ssh;
-
-    public User getUser() {
-        return user;
-    }
-
-    public void setUser(User user) {
-        this.user = user;
-    }
-
-    public BintrayUIModel getBintray() {
-        return bintray;
-    }
-
-    public void setBintray(BintrayUIModel bintray) {
-        this.bintray = bintray;
-    }
-
-    public SshClientUIModel getSsh() {
-        return ssh;
-    }
-
-    public void setSsh(SshClientUIModel ssh) {
-        this.ssh = ssh;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/services/backups/Backup.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/services/backups/Backup.java
deleted file mode 100644
index bf824f2..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/services/backups/Backup.java
+++ /dev/null
@@ -1,155 +0,0 @@
-package org.artifactory.ui.rest.model.admin.services.backups;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.descriptor.backup.BackupDescriptor;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RealRepoDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.model.RestSpecialFields;
-import org.artifactory.rest.common.service.IgnoreSpecialFields;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.codehaus.jackson.map.annotate.JsonFilter;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
- at JsonFilter("exclude fields")
- at IgnoreSpecialFields(value = {"excludeRepos", "dir", "retentionPeriodHours",
-        "excludedRepositories", "sendMailOnError", "excludeBuilds", "incremental"})
-public class Backup extends BackupDescriptor implements RestModel, RestSpecialFields {
-
-    private List<String> excludeRepos;
-    private List<String> includeRepos;
-    private boolean isEdit = false;
-    private boolean incremental;
-
-    Backup() {
-    }
-
-    public Backup(BackupDescriptor backupDescriptor, boolean isEdit) {
-        if (backupDescriptor != null) {
-            super.setCronExp(backupDescriptor.getCronExp());
-            super.setEnabled(backupDescriptor.isEnabled());
-            super.setKey(backupDescriptor.getKey());
-            super.setExcludeNewRepositories(backupDescriptor.isExcludeNewRepositories());
-            populateditFields(backupDescriptor, isEdit);
-        }
-    }
-
-    /**
-     * populate extra fields require for edit
-     *
-     * @param backupDescriptor - back up descriptor data
-     * @param isEdit           - if true , populate fields for edit
-     */
-    private void populateditFields(BackupDescriptor backupDescriptor, boolean isEdit) {
-        if (isEdit) {
-            this.isEdit = isEdit;
-            super.setRetentionPeriodHours(backupDescriptor.getRetentionPeriodHours());
-            super.setCreateArchive(backupDescriptor.isCreateArchive());
-            super.setDir(backupDescriptor.getDir());
-            super.setExcludeBuilds(backupDescriptor.isExcludeBuilds());
-            super.setSendMailOnError(backupDescriptor.isSendMailOnError());
-            super.setCreateArchive(backupDescriptor.isCreateArchive());
-        }
-        populateExcludeRepo(backupDescriptor.getExcludedRepositories());
-        populateIncludeRepo();
-    }
-
-    /**
-     * populate exclude Real repo keys
-     *
-     * @param realRepoDescriptors - real repo descriptors
-     */
-    private void populateExcludeRepo(List<RealRepoDescriptor> realRepoDescriptors) {
-        List<String> excludeRealRepo = new ArrayList<>();
-        realRepoDescriptors.forEach(realRepo -> excludeRealRepo.add(realRepo.getKey()));
-        excludeRepos = excludeRealRepo;
-    }
-
-    /**
-     * populate exclude Real repo keys
-     */
-    private void populateIncludeRepo() {
-        List<String> repos = new ArrayList<>();
-        CentralConfigService centralConfigService = ContextHelper.get().beanForType(CentralConfigService.class);
-        Map<String, LocalRepoDescriptor> localRepoDescriptorMap = centralConfigService.getDescriptor().getLocalRepositoriesMap();
-        Map<String, RemoteRepoDescriptor> remoteRepoDescriptorMap = centralConfigService.getDescriptor().getRemoteRepositoriesMap();
-        Map<String, DistributionRepoDescriptor> distributionRepositoriesMap = centralConfigService.getDescriptor().getDistributionRepositoriesMap();
-        repos.addAll(localRepoDescriptorMap.keySet());
-        repos.addAll(remoteRepoDescriptorMap.keySet());
-        repos.addAll(distributionRepositoriesMap.keySet());
-        excludeRepos.forEach(repo -> {
-            if (localRepoDescriptorMap.get(repo) != null || remoteRepoDescriptorMap.get(repo) != null
-                    || distributionRepositoriesMap.get(repo) != null) {
-                repos.remove(repo);
-            }
-        });
-        includeRepos = repos;
-    }
-
-    public List<String> getIncludeRepos() {
-        return includeRepos;
-    }
-
-    public void setIncludeRepos(List<String> includeRepos) {
-        this.includeRepos = includeRepos;
-    }
-
-    /**
-     * populate local and remote repositories to map
-     *  @param repoKeys                - remote repo key
-     * @param realRepoDescriptors     - real repo descriptor list
-     * @param localRepoDescriptorMap  - local repo descriptor map
-     * @param remoteRepoDescriptorMap - remote repo descriptor map
-     * @param distributionRepositoriesMap
-     */
-    private void populateRealRepoToMap(List<String> repoKeys, List<RealRepoDescriptor> realRepoDescriptors,
-            Map<String, LocalRepoDescriptor> localRepoDescriptorMap,
-            Map<String, RemoteRepoDescriptor> remoteRepoDescriptorMap,
-            Map<String, DistributionRepoDescriptor> distributionRepositoriesMap) {
-        repoKeys.forEach(repoKey -> {
-            if (localRepoDescriptorMap.get(repoKey) != null) {
-                realRepoDescriptors.add(localRepoDescriptorMap.get(repoKey));
-            } else if (remoteRepoDescriptorMap.get(repoKey) != null) {
-                    realRepoDescriptors.add(remoteRepoDescriptorMap.get(repoKey));
-            } else if (distributionRepositoriesMap.get(repoKey) != null) {
-                    realRepoDescriptors.add(distributionRepositoriesMap.get(repoKey));
-            }
-        });
-    }
-    public List<String> getExcludeRepos() {
-        return excludeRepos;
-    }
-
-    /**
-     * get list of repo key and build list of Real repo descriptors
-     *
-     * @param excludeRepos - list of repos key to exclude
-     */
-    public void setExcludeRepos(List<String> excludeRepos) {
-        this.excludeRepos = excludeRepos;
-        List<RealRepoDescriptor> realRepoDescriptors = new ArrayList<>();
-        CentralConfigService centralConfigService = ContextHelper.get().beanForType(CentralConfigService.class);
-        Map<String, LocalRepoDescriptor> localRepoDescriptorMap = centralConfigService.getDescriptor().getLocalRepositoriesMap();
-        Map<String, RemoteRepoDescriptor> remoteRepoDescriptorMap = centralConfigService.getDescriptor().getRemoteRepositoriesMap();
-        Map<String, DistributionRepoDescriptor> distributionRepositoriesMap = centralConfigService.getDescriptor().getDistributionRepositoriesMap();
-        populateRealRepoToMap(excludeRepos, realRepoDescriptors, localRepoDescriptorMap, remoteRepoDescriptorMap, distributionRepositoriesMap);
-        super.setExcludedRepositories(realRepoDescriptors);
-    }
-    public String toString() {
-        return JsonUtil.jsonToStringIgnoreSpecialFields(this);
-    }
-
-    @Override
-    public boolean ignoreSpecialFields() {
-        return !isEdit;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/services/filesystem/FileSystemBrowser.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/services/filesystem/FileSystemBrowser.java
deleted file mode 100644
index b072b05..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/services/filesystem/FileSystemBrowser.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.artifactory.ui.rest.model.admin.services.filesystem;
-
-import java.util.List;
-
-import org.artifactory.rest.common.model.BaseModel;
-import org.artifactory.rest.common.model.RestModel;
-
-/**
- * @author Chen Keinan
- */
-public class FileSystemBrowser extends BaseModel {
-
-    private List<String> roots;
-    private List<RestModel> fileSystemItems;
-    private Boolean isWindows;
-
-    public List<String> getRoots() {
-        return roots;
-    }
-
-    public void setRoots(List<String> roots) {
-        this.roots = roots;
-    }
-
-    public List<RestModel> getFileSystemItems() {
-        return fileSystemItems;
-    }
-
-    public void setFileSystemItems(List<RestModel> fileSystemItems) {
-        this.fileSystemItems = fileSystemItems;
-    }
-
-    public boolean isWindows() {
-        return isWindows;
-    }
-
-    public void setIsWindows(boolean isWindows) {
-        this.isWindows = isWindows;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/services/filesystem/FileSystemItem.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/services/filesystem/FileSystemItem.java
deleted file mode 100644
index e38995c..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/services/filesystem/FileSystemItem.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.artifactory.ui.rest.model.admin.services.filesystem;
-
-import java.io.File;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Chen Keinan
- */
-public class FileSystemItem extends BaseModel {
-    private String fileSystemItemName;
-    private boolean isFolder;
-
-    public FileSystemItem(File file) {
-        fileSystemItemName = file.getName();
-        isFolder = file.isDirectory();
-    }
-
-    public boolean isFolder() {
-        return isFolder;
-    }
-
-    public void setFolder(boolean isFolder) {
-        this.isFolder = isFolder;
-    }
-
-    public String getFileSystemItemName() {
-        return fileSystemItemName;
-    }
-
-    public void setFileSystemItemName(String fileSystemItemName) {
-        this.fileSystemItemName = fileSystemItemName;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/services/indexer/Indexer.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/services/indexer/Indexer.java
deleted file mode 100644
index 111f93f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/admin/services/indexer/Indexer.java
+++ /dev/null
@@ -1,132 +0,0 @@
-package org.artifactory.ui.rest.model.admin.services.indexer;
-
-import com.google.common.collect.Lists;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.descriptor.index.IndexerDescriptor;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoBaseDescriptor;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.util.CollectionUtils;
-
-import java.util.List;
-import java.util.Map;
-import java.util.SortedSet;
-import java.util.TreeSet;
-
-/**
- * @author Chen Keinan
- */
-public class Indexer implements RestModel {
-
-    private boolean enabled;
-    private String cronExp;
-
-    private List<String> includedRepos = Lists.newArrayList();
-    private List<String> excludedRepos = Lists.newArrayList();
-
-    Indexer() {
-    }
-
-    public Indexer(IndexerDescriptor indexerDescriptor) {
-        if (indexerDescriptor != null) {
-            setEnabled(indexerDescriptor.isEnabled());
-            setCronExp(indexerDescriptor.getCronExp());
-            populateRepos(indexerDescriptor.getIncludedRepositories());
-        }
-    }
-
-    private void populateRepos(SortedSet<? extends RepoBaseDescriptor> configIncludedRepos) {
-        List<String> availableMavenRepos = Lists.newArrayList();
-        CentralConfigService centralConfigService = ContextHelper.get().beanForType(CentralConfigService.class);
-        Map<String, LocalRepoDescriptor> localRepoDescriptorMap = centralConfigService.getDescriptor().getLocalRepositoriesMap();
-        addMavenRepos(availableMavenRepos, localRepoDescriptorMap);
-        Map<String, RemoteRepoDescriptor> remoteRepoDescriptorMap = centralConfigService.getDescriptor().getRemoteRepositoriesMap();
-        addMavenRepos(availableMavenRepos, remoteRepoDescriptorMap);
-        Map<String, VirtualRepoDescriptor> virtualRepoDescriptorMap = centralConfigService.getDescriptor().getVirtualRepositoriesMap();
-        addMavenRepos(availableMavenRepos, virtualRepoDescriptorMap);
-        if (!CollectionUtils.isNullOrEmpty(configIncludedRepos)) {
-            configIncludedRepos.forEach(includedRepo -> includedRepos.add(includedRepo.getKey()));
-        }
-
-        // add all the rest of the repos to the exclude list
-        availableMavenRepos.removeAll(includedRepos);
-        excludedRepos.addAll(availableMavenRepos);
-    }
-
-    private void addMavenRepos(List<String> repos, Map<String, ? extends RepoBaseDescriptor> descriptors) {
-        descriptors.values()
-                .stream()
-                .filter(descriptor -> descriptor.getType().isMavenGroup())
-                .filter(descriptor -> !descriptor.getKey().equals(VirtualRepoDescriptor.GLOBAL_VIRTUAL_REPO_KEY))
-                .forEach(descriptor -> repos.add(descriptor.getKey()));
-    }
-
-    public List<String> getIncludedRepos() {
-        return includedRepos;
-    }
-
-    public void setIncludedRepos(List<String> includedRepos) {
-        this.includedRepos = includedRepos;
-    }
-
-    public List<String> getExcludedRepos() {
-        return excludedRepos;
-    }
-
-    public void setExcludedRepos(List<String> excludedRepos) {
-        this.excludedRepos = excludedRepos;
-    }
-
-    private SortedSet<RepoBaseDescriptor> populateDescriptors(List<String> repoKeys,
-            Map<String, LocalRepoDescriptor> locals, Map<String, RemoteRepoDescriptor> remotes,
-            Map<String, VirtualRepoDescriptor> virtuals) {
-        SortedSet<RepoBaseDescriptor> descriptors = new TreeSet<>();
-        repoKeys.forEach(repoKey -> {
-            if (locals.get(repoKey) != null) {
-                descriptors.add(locals.get(repoKey));
-            } else if (remotes.get(repoKey) != null) {
-                descriptors.add(remotes.get(repoKey));
-            } else if (virtuals.get(repoKey) != null) {
-                descriptors.add(virtuals.get(repoKey));
-            }
-        });
-        return descriptors;
-    }
-
-    public IndexerDescriptor toDescriptor() {
-        final IndexerDescriptor desc = new IndexerDescriptor();
-        desc.setCronExp(cronExp);
-        desc.setEnabled(enabled);
-        CentralConfigService centralConfigService = ContextHelper.get().beanForType(CentralConfigService.class);
-        Map<String, LocalRepoDescriptor> locals = centralConfigService.getDescriptor().getLocalRepositoriesMap();
-        Map<String, RemoteRepoDescriptor> remotes = centralConfigService.getDescriptor().getRemoteRepositoriesMap();
-        Map<String, VirtualRepoDescriptor> virtuals = centralConfigService.getDescriptor().getVirtualRepositoriesMap();
-        desc.setIncludedRepositories(populateDescriptors(includedRepos, locals, remotes, virtuals));
-        return desc;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-
-    public boolean isEnabled() {
-        return enabled;
-    }
-
-    public void setEnabled(boolean enabled) {
-        this.enabled = enabled;
-    }
-
-    public String getCronExp() {
-        return cronExp;
-    }
-
-    public void setCronExp(String cronExp) {
-        this.cronExp = cronExp;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/simplebrowser/SimpleBrowser.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/simplebrowser/SimpleBrowser.java
deleted file mode 100644
index 35432af..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/simplebrowser/SimpleBrowser.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.simplebrowser;
-
-/**
- * @author Chen Keinan
- */
-public class SimpleBrowser {
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/CopyArtifact.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/CopyArtifact.java
deleted file mode 100644
index 853c95a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/CopyArtifact.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action;
-
-
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-
-/**
- * @author Chen Keinan
- */
-public class CopyArtifact extends BaseArtifact {
-
-    private String targetRepoKey;
-    private String targetPath;
-    private boolean dryRun;
-    private boolean suppressLayouts;
-    private boolean failFast;
-
-    public CopyArtifact() {
-    }
-
-    public boolean isDryRun() {
-        return dryRun;
-    }
-
-    public void setDryRun(boolean dryRun) {
-        this.dryRun = dryRun;
-    }
-
-    public boolean isSuppressLayouts() {
-        return suppressLayouts;
-    }
-
-    public void setSuppressLayouts(boolean suppressLayouts) {
-        this.suppressLayouts = suppressLayouts;
-    }
-
-    public boolean isFailFast() {
-        return failFast;
-    }
-
-    public void setFailFast(boolean failFast) {
-        this.failFast = failFast;
-    }
-
-    public String getTargetRepoKey() {
-        return targetRepoKey;
-    }
-
-    public void setTargetRepoKey(String targetRepoKey) {
-        this.targetRepoKey = targetRepoKey;
-    }
-
-    public String getTargetPath() {
-        return targetPath;
-    }
-
-    public void setTargetPath(String targetPath) {
-        this.targetPath = targetPath;
-    }
-
-    public CopyArtifact(String name) {
-        super(name);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/DeleteArtifact.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/DeleteArtifact.java
deleted file mode 100644
index 191f5b3..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/DeleteArtifact.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action;
-
-
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-
-/**
- * @author Chen Keinan
- */
-public class DeleteArtifact extends BaseArtifact {
-
-    private Boolean permDelete;
-
-    DeleteArtifact() {
-    }
-
-    public DeleteArtifact(String name) {
-        super(name);
-    }
-
-    public Boolean getPermDelete() {
-        return permDelete;
-    }
-
-    public void setPermDelete(Boolean permDelete) {
-        this.permDelete = permDelete;
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/DeleteArtifactVersion.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/DeleteArtifactVersion.java
deleted file mode 100644
index b81396c..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/DeleteArtifactVersion.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action;
-
-import org.artifactory.api.module.VersionUnit;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-import org.artifactory.ui.rest.model.common.RepoKeyPath;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * @author Chen Keinan
- */
-public class DeleteArtifactVersion extends BaseArtifact {
-    private String groupId;
-    private String version;
-    private Integer directoriesCount;
-    private String folderIntegrationRevision = "";
-    private Set<RepoKeyPath> repoPaths = new HashSet<>();
-
-    DeleteArtifactVersion() {
-
-    }
-
-    public DeleteArtifactVersion(String name) {
-        super(name);
-    }
-
-    public DeleteArtifactVersion(VersionUnit result) {
-        groupId = result.getModuleInfo().getOrganization();
-        version = buildVersion(result);
-        result.getRepoPaths().forEach(repoPath ->
-                repoPaths.add(new RepoKeyPath(repoPath.getPath(), repoPath.getRepoKey())));
-    }
-
-    /**
-     * build version full name
-     *
-     * @param result - version unit result
-     * @return full version name
-     */
-    private String buildVersion(VersionUnit result) {
-        StringBuilder groupVersionKeyBuilder = new StringBuilder(result.getModuleInfo().getBaseRevision());
-        if (result.getModuleInfo().isIntegration()) {
-            groupVersionKeyBuilder.append("-");
-            if (MavenNaming.SNAPSHOT.equals(result.getModuleInfo().getFolderIntegrationRevision())) {
-                groupVersionKeyBuilder.append(MavenNaming.SNAPSHOT);
-            } else {
-                groupVersionKeyBuilder.append("INTEGRATION");
-            }
-        }
-        return groupVersionKeyBuilder.toString();
-    }
-
-    public String getGroupId() {
-        return groupId;
-    }
-
-    public void setGroupId(String groupId) {
-        this.groupId = groupId;
-    }
-
-    public String getVersion() {
-        return version + folderIntegrationRevision;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public Integer getDirectoriesCount() {
-        return directoriesCount;
-    }
-
-    public void setDirectoriesCount(Integer directoriesCount) {
-        this.directoriesCount = directoriesCount;
-    }
-
-    public Set<RepoKeyPath> getRepoPaths() {
-        return repoPaths;
-    }
-
-    public void setRepoPaths(Set<RepoKeyPath> repoPaths) {
-        this.repoPaths = repoPaths;
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/DeleteArtifactVersions.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/DeleteArtifactVersions.java
deleted file mode 100644
index ad577f1..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/DeleteArtifactVersions.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action;
-
-import org.artifactory.rest.common.model.BaseModel;
-import org.artifactory.rest.common.util.JsonUtil;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Holder for multiple {@link DeleteArtifactVersion}, needed for sending back warnings about the search operation.
- *
- * @author Dan Feldman
- */
-public class DeleteArtifactVersions extends BaseModel {
-
-    Collection<DeleteArtifactVersion> versions;
-
-    public DeleteArtifactVersions() {
-
-    }
-
-    public DeleteArtifactVersions(Collection<DeleteArtifactVersion> versions) {
-        this.versions = versions;
-    }
-
-    public Collection<DeleteArtifactVersion> getVersions() {
-        return versions;
-    }
-
-    public void setVersions(List<DeleteArtifactVersion> versions) {
-        this.versions = versions;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/DownloadArtifact.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/DownloadArtifact.java
deleted file mode 100644
index 9bcf5c5..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/DownloadArtifact.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action;
-
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-
-/**
- * @author Chen Keinan
- */
-public class DownloadArtifact extends BaseArtifact {
-
-    private String downloadPath;
-
-    public DownloadArtifact() {
-        super();
-    }
-
-    public DownloadArtifact(String name)
-    {
-        super(name);
-    }
-
-    public String getDownloadPath() {
-        return downloadPath;
-    }
-
-    public void setDownloadPath(String downloadPath) {
-        this.downloadPath = downloadPath;
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/DownloadFolder.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/DownloadFolder.java
deleted file mode 100644
index c5862b9..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/DownloadFolder.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.archive.ArchiveType;
-import org.artifactory.api.download.FolderDownloadInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.ui.utils.RequestUtils;
-
-/**
- * @author Dan Feldman
- */
-public class DownloadFolder extends BaseArtifact {
-
-    public static final String ARCHIVE_TYPE_QUERY_PARAM = "archiveType";
-
-    private String sizeMB;
-    private long filesUnderFolder;
-    private ArchiveType archiveType;
-
-    public DownloadFolder() {
-        super();
-    }
-
-    public DownloadFolder(FolderDownloadInfo folderDownloadInfo) {
-        super();
-        this.sizeMB = String.format("%.2f", folderDownloadInfo.getSizeMb());
-        this.filesUnderFolder = folderDownloadInfo.getTotalFiles();
-    }
-
-    public DownloadFolder(ArtifactoryRestRequest request) {
-        super();
-        RepoPath path = RequestUtils.getPathFromRequest(request);
-        setPath(path.getPath());
-        setRepoKey(path.getRepoKey());
-        String archiveTypeParam = request.getQueryParamByKey(ARCHIVE_TYPE_QUERY_PARAM);
-        if(StringUtils.isNotBlank(archiveTypeParam)) {
-            this.archiveType = ArchiveType.fromValue(archiveTypeParam);
-        } else {
-            this.archiveType = ArchiveType.TARGZ;
-        }
-    }
-
-    public String getSizeMB() {
-        return sizeMB;
-    }
-
-    public void setSizeMB(String sizeMB) {
-        this.sizeMB = sizeMB;
-    }
-
-    public long getTotalFiles() {
-        return filesUnderFolder;
-    }
-
-    public void setTotalFiles(long totalFiles) {
-        this.filesUnderFolder = totalFiles;
-    }
-
-    public ArchiveType getArchiveType() {
-        return archiveType;
-    }
-
-    public void setArchiveType(ArchiveType archiveType) {
-        this.archiveType = archiveType;
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/MoveArtifact.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/MoveArtifact.java
deleted file mode 100644
index 6e8be9b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/MoveArtifact.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action;
-
-
-/**
- * @author Chen Keinan
- */
-public class MoveArtifact extends CopyArtifact {
-
-    MoveArtifact() {
-    }
-    public MoveArtifact(String name)
-    {
-        super(name);
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/RefreshArtifact.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/RefreshArtifact.java
deleted file mode 100644
index f9632e9..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/RefreshArtifact.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action;
-
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-
-/**
- * Refresh the tree node data and children recursively.
- *
- * @author Chen Keinan
- */
-public class RefreshArtifact extends BaseArtifact {
-
-    public RefreshArtifact(String name)
-    {
-        super(name);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/ShowInBintrayArtifact.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/ShowInBintrayArtifact.java
deleted file mode 100644
index 0582dd8..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/ShowInBintrayArtifact.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action;
-
-
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-
-/**
- *
- * @author Chen Keinan
- */
-public class ShowInBintrayArtifact extends BaseArtifact {
-
-    public ShowInBintrayArtifact(String name) {
-        super(name);
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/ShowInTreeArtifact.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/ShowInTreeArtifact.java
deleted file mode 100644
index 453f16c..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/ShowInTreeArtifact.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action;
-
-
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-
-/**
- * @author Yossi Shaul
- */
-public class ShowInTreeArtifact extends BaseArtifact {
-
-    public ShowInTreeArtifact(String name) {
-        super(name);
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/ViewArtifact.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/ViewArtifact.java
deleted file mode 100644
index 8d034b8..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/ViewArtifact.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action;
-
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-
-/**
- * Base class for actions viewing text resources.
- *
- * @author Chen Keinan
- */
-public class ViewArtifact extends BaseArtifact {
-
-    private String fileContent;
-
-    public ViewArtifact(String name) {
-        super(name);
-    }
-
-    public ViewArtifact() {
-    }
-
-    public String getFileContent() {
-        return fileContent;
-    }
-
-    public void setFileContent(String fileContent) {
-        this.fileContent = fileContent;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/ViewSourceArtifact.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/ViewSourceArtifact.java
deleted file mode 100644
index 8b9fe9a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/ViewSourceArtifact.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action;
-
-
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-
-/**
- * Action to view source of class files or text files inside an archive.
- *
- * @author Chen Keinan
- */
-public class ViewSourceArtifact extends BaseArtifact {
-
-    public ViewSourceArtifact(String name) {
-        super(name);
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/ViewTextFileArtifact.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/ViewTextFileArtifact.java
deleted file mode 100644
index 717e1f8..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/ViewTextFileArtifact.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action;
-
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-
-/**
- * This action will display a popup windows with the content of the selected text file.
- *
- * @author Chen Keinan
- */
-public class ViewTextFileArtifact extends BaseArtifact {
-
-
-    public ViewTextFileArtifact(String name) {
-        super(name);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/WatchArtifact.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/WatchArtifact.java
deleted file mode 100644
index 70a4fbf..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/WatchArtifact.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action;
-
-
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-
-/**
- * @author Chen Keinan
- */
-public class WatchArtifact extends BaseArtifact {
-
-    public WatchArtifact() {
-    }
-
-    public WatchArtifact(String name) {
-        super(name);
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/ZapArtifact.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/ZapArtifact.java
deleted file mode 100644
index f63d660..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/ZapArtifact.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action;
-
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-
-/**
- * @author Chen Keinan
- */
-public class ZapArtifact extends BaseArtifact {
-
-    public ZapArtifact(String name) {
-        super(name);
-    }
-
-    ZapArtifact() {
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/BaseIndexCalculator.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/BaseIndexCalculator.java
deleted file mode 100644
index bebc020..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/BaseIndexCalculator.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.recalculateindex;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.api.context.ContextHelper;
-import org.codehaus.jackson.annotate.JsonSubTypes;
-import org.codehaus.jackson.annotate.JsonTypeInfo;
-
-/**
- * @author Chen Keinan
- */
-
- at JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
- at JsonSubTypes({@JsonSubTypes.Type(value = GemsIndexCalculator.class, name = "Gems"),
-        @JsonSubTypes.Type(value = NpmIndexCalculator.class, name = "Npm"),
-        @JsonSubTypes.Type(value = DebianIndexCalculator.class, name = "Debian"),
-        @JsonSubTypes.Type(value = OpkgIndexCalculator.class, name = "Opkg"),
-        @JsonSubTypes.Type(value = YumIndexCalculator.class, name = "YUM"),
-        @JsonSubTypes.Type(value = NuGetIndexCalculator.class, name = "NuGet"),
-        @JsonSubTypes.Type(value = PypiIndexCalculator.class, name = "Pypi"),
-        @JsonSubTypes.Type(value = BowerIndexCalculator.class, name = "Bower"),
-        @JsonSubTypes.Type(value = PodsIndexCalculator.class, name = "CocoaPods")})
-public abstract class BaseIndexCalculator {
-
-    protected AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-
-    private String repoKey;
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    public abstract void calculateIndex() throws Exception;
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/BowerIndexCalculator.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/BowerIndexCalculator.java
deleted file mode 100644
index 74ce6d9..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/BowerIndexCalculator.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.recalculateindex;
-
-import org.artifactory.addon.bower.BowerAddon;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-/**
- * @author Chen Keinan
- */
- at JsonTypeName("Bower")
-public class BowerIndexCalculator extends BaseIndexCalculator {
-
-    @Override
-    public void calculateIndex() throws Exception {
-        BowerAddon bowerAddon = addonsManager.addonByType(BowerAddon.class);
-        if (bowerAddon != null) {
-            bowerAddon.requestAsyncReindexBowerPackages(getRepoKey());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/DebianIndexCalculator.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/DebianIndexCalculator.java
deleted file mode 100644
index 439caf9..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/DebianIndexCalculator.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.recalculateindex;
-
-import org.artifactory.addon.debian.DebianAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
- at JsonTypeName("Debian")
-public class DebianIndexCalculator extends BaseIndexCalculator {
-
-    @Override
-    public void calculateIndex() throws Exception {
-        DebianAddon debianAddon = addonsManager.addonByType(DebianAddon.class);
-        Map<String, LocalRepoDescriptor> localRepositoriesMap = ContextHelper.get().getCentralConfig().getDescriptor().getLocalRepositoriesMap();
-        LocalRepoDescriptor debianRepoDescriptor = localRepositoriesMap.get(getRepoKey());
-        if (debianAddon != null) {
-            debianAddon.recalculateAll(debianRepoDescriptor, null, true, false);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/GemsIndexCalculator.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/GemsIndexCalculator.java
deleted file mode 100644
index ab0c7fc..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/GemsIndexCalculator.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.recalculateindex;
-
-import org.artifactory.addon.gems.GemsAddon;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-/**
- * @author Chen Keinan
- */
- at JsonTypeName("Gems")
-public class GemsIndexCalculator extends BaseIndexCalculator {
-
-    @Override
-    public void calculateIndex() throws Exception {
-        GemsAddon gemsAddon = addonsManager.addonByType(GemsAddon.class);
-        if (gemsAddon != null) {
-            gemsAddon.reindexAsync(getRepoKey());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/NpmIndexCalculator.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/NpmIndexCalculator.java
deleted file mode 100644
index f419cf2..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/NpmIndexCalculator.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.recalculateindex;
-
-import org.artifactory.addon.npm.NpmAddon;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-/**
- * @author Chen Keinan
- */
- at JsonTypeName("Npm")
-public class NpmIndexCalculator extends BaseIndexCalculator {
-
-    @Override
-    public void calculateIndex() throws Exception {
-        NpmAddon npmAddon = addonsManager.addonByType(NpmAddon.class);
-        if (npmAddon != null) {
-            npmAddon.reindexAsync(getRepoKey());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/NuGetIndexCalculator.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/NuGetIndexCalculator.java
deleted file mode 100644
index 98113ee..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/NuGetIndexCalculator.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.recalculateindex;
-
-import org.artifactory.addon.nuget.UiNuGetAddon;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-/**
- * @author Chen Keinan
- */
- at JsonTypeName("NuGet")
-public class NuGetIndexCalculator extends BaseIndexCalculator {
-
-    @Override
-    public void calculateIndex() throws Exception {
-        UiNuGetAddon npmAddon = addonsManager.addonByType(UiNuGetAddon.class);
-        if (npmAddon != null) {
-            npmAddon.requestAsyncReindexNuPkgs(getRepoKey());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/OpkgIndexCalculator.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/OpkgIndexCalculator.java
deleted file mode 100644
index f179309..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/OpkgIndexCalculator.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.recalculateindex;
-
-import org.artifactory.addon.opkg.OpkgAddon;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-/**
- * @author Dan Feldman
- */
- at JsonTypeName("Opkg")
-public class OpkgIndexCalculator extends BaseIndexCalculator {
-
-    @Override
-    public void calculateIndex() throws Exception {
-        OpkgAddon opkgAddon = addonsManager.addonByType(OpkgAddon.class);
-        if(opkgAddon != null) {
-            opkgAddon.recalculateEntireRepo(getRepoKey(), null, true, false);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/PodsIndexCalculator.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/PodsIndexCalculator.java
deleted file mode 100644
index e5011bf..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/PodsIndexCalculator.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.recalculateindex;
-
-import org.artifactory.addon.cocoapods.CocoaPodsAddon;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-/**
- * @author Dan Feldman
- */
- at JsonTypeName("CocoaPods")
-public class PodsIndexCalculator extends BaseIndexCalculator {
-
-    @Override
-    public void calculateIndex() throws Exception {
-        CocoaPodsAddon podsAddon = addonsManager.addonByType(CocoaPodsAddon.class);
-        if (podsAddon != null) {
-            podsAddon.reindexAsync(getRepoKey());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/PypiIndexCalculator.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/PypiIndexCalculator.java
deleted file mode 100644
index 364b8f7..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/PypiIndexCalculator.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.recalculateindex;
-
-import org.artifactory.addon.pypi.PypiAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
- at JsonTypeName("Pypi")
-public class PypiIndexCalculator extends BaseIndexCalculator {
-
-    @Override
-    public void calculateIndex() throws Exception {
-        PypiAddon pypiAddon = addonsManager.addonByType(PypiAddon.class);
-        Map<String, LocalRepoDescriptor> localRepositoriesMap = ContextHelper.get().getCentralConfig().getDescriptor().getLocalRepositoriesMap();
-        LocalRepoDescriptor PypiRepoDescriptor = localRepositoriesMap.get(getRepoKey());
-        if (pypiAddon != null) {
-            pypiAddon.reindex(PypiRepoDescriptor, true);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/YumIndexCalculator.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/YumIndexCalculator.java
deleted file mode 100644
index 37e302b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/action/recalculateindex/YumIndexCalculator.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.recalculateindex;
-
-import org.artifactory.addon.yum.YumAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
- at JsonTypeName("YUM")
-public class YumIndexCalculator extends BaseIndexCalculator {
-
-    @Override
-    public void calculateIndex() throws Exception {
-        YumAddon yumAddon = addonsManager.addonByType(YumAddon.class);
-        Map<String, LocalRepoDescriptor> localRepositoriesMap = ContextHelper.get().getCentralConfig().getDescriptor().getLocalRepositoriesMap();
-        LocalRepoDescriptor YumRepoDescriptor = localRepositoriesMap.get(getRepoKey());
-        if (yumAddon != null) {
-            yumAddon.requestAsyncRepositoryYumMetadataCalculation(YumRepoDescriptor);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/BaseNode.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/BaseNode.java
deleted file mode 100644
index 25d6980..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/BaseNode.java
+++ /dev/null
@@ -1,454 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.nodes;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonType;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.watch.ArtifactWatchAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.fs.WatchersInfo;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-import org.artifactory.rest.common.model.artifact.IAction;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.BaseArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.IArtifactInfo;
-import org.artifactory.util.Pair;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-
-import javax.annotation.Nullable;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author Chen Keinan
- */
- at JsonIgnoreProperties("repoPath")
-public abstract class BaseNode implements INode {
-
-    public BaseNode() {
-    }
-    private List<IAction> actions = null;
-    private List<INode> childrens = null;
-    private List<IArtifactInfo> tabs = null;
-    private boolean hasChild = false;
-    private RepoPath repoPath;
-    private String repoKey;
-    private String path;
-    private String text;
-    private boolean local = true;
-    String repoType;
-    private String icon;
-
-    public String getText() {
-        return text;
-    }
-
-    public void setText(String text) {
-        this.text = text;
-    }
-
-    public List<IArtifactInfo> getTabs() {
-        return tabs;
-    }
-
-    public List<IArtifactInfo> fetchTabs() {
-        if (tabs == null) {
-            tabs = new ArrayList<>();
-        }
-        return tabs;
-    }
-
-    public void setTabs(List<IArtifactInfo> tabs) {
-        this.tabs = tabs;
-    }
-
-    public BaseNode(RepoPath repoPath) {
-        this.repoPath = repoPath;
-        this.repoKey = repoPath.getRepoKey();
-        this.path = repoPath.getPath();
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    public RepoPath getRepoPath() {
-        return repoPath;
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    public void setRepoPath(RepoPath repoPath) {
-        this.repoPath = repoPath;
-        if (repoPath != null) {
-            this.repoKey = repoPath.getRepoKey();
-            this.path = repoPath.getPath();
-        }
-    }
-
-    public boolean isHasChild() {
-        return hasChild;
-    }
-
-    public void setHasChild(boolean hasChild) {
-        this.hasChild = hasChild;
-    }
-
-    public List<IAction> getActions() {
-        return actions;
-    }
-
-    public void setActions(List<IAction> actions) {
-        this.actions = actions;
-    }
-
-    public List<INode> getChildrens() {
-        return childrens;
-    }
-
-    public void setChildrens(List<INode> childrens) {
-        this.childrens = childrens;
-    }
-
-    protected RepositoryService getRepoService() {
-        return ContextHelper.get().beanForType(RepositoryService.class);
-    }
-
-    /**
-     * retrieve item info
-     *
-     * @param repoPath - repo path
-     * @return - item info
-     */
-    public org.artifactory.fs.ItemInfo retrieveItemInfo(RepoPath repoPath) {
-        return getRepoService().getItemInfo(repoPath);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof BaseNode)) {
-            return false;
-        }
-        BaseNode base = (BaseNode) o;
-        return repoPath.equals(base.repoPath);
-    }
-
-    @Override
-    public int hashCode() {
-        return repoPath.hashCode();
-    }
-
-    /**
-     * populate watch action
-     *
-     * @param authService - authorization service
-     * @param actions     - list of action
-     * @param canRead     - if true , can read
-     */
-    public void addWatchAction(AuthorizationService authService, List<IAction> actions, boolean canRead) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        ArtifactWatchAddon watchAddon = addonsManager.addonByType(ArtifactWatchAddon.class);
-        if (userCanWatch(authService, canRead, addonsManager, watchAddon)) {
-            if (isUserWatchingRepoPath(authService, getRepoPath(), watchAddon)) {
-                actions.add(new BaseArtifact("Unwatch"));
-            } else {
-                actions.add(new BaseArtifact("Watch"));
-            }
-        }
-    }
-
-    private boolean userCanWatch(AuthorizationService authService, boolean canRead, AddonsManager addonsManager,
-            ArtifactWatchAddon watchAddon) {
-        return canRead && addonsManager.isAddonSupported(AddonType.WATCH) && !authService.isAnonymous()
-                && !authService.isTransientUser() && !isThisBranchHasWatchAlready(authService, watchAddon);
-    }
-
-    /**
-     * check if anyone is watching this path branch already
-     *
-     * @param authService - authorization service
-     * @param watchAddon  - watch addon
-     * @return if true - this path branch has watch already
-     */
-    private boolean isThisBranchHasWatchAlready(AuthorizationService authService,
-            ArtifactWatchAddon watchAddon) {
-        Pair<RepoPath, WatchersInfo> nearestWatch = watchAddon.getNearestWatchDefinition(
-                getRepoPath(), authService.currentUsername());
-        return nearestWatch != null && !(nearestWatch.getFirst().getPath().equals(getRepoPath().getPath()));
-    }
-
-    public abstract void populateActions(AuthorizationService authService);
-
-    @Override
-    public void populateTabs(AuthorizationService authService) {
-        List<IArtifactInfo> tabs = new ArrayList<>();
-        if (isLocal()) {
-            if (isTrash()) {
-                addGeneralTab(tabs);
-            } else {
-                boolean canAdminRepoPath = authService.canManage(getRepoPath());
-                addGeneralTab(tabs);
-                addEffectivePermissionTab(tabs, canAdminRepoPath);
-                addPropertiesTab(tabs);
-                addWatchTab(tabs, canAdminRepoPath);
-            }
-            this.tabs = tabs;
-        }
-    }
-
-    protected abstract RepoPath fetchRepoPath();
-
-    /**
-     * add properties tab
-     *
-     * @param tabs - ttabs list
-     */
-    protected void addPropertiesTab(List<IArtifactInfo> tabs) {
-        tabs.add(new BaseArtifactInfo("Properties"));
-    }
-
-    /**
-     * add general tab
-     *
-     * @param tabs - tabs list
-     */
-    protected void addGeneralTab(List<IArtifactInfo> tabs) {
-        tabs.add(new BaseArtifactInfo("General"));
-    }
-
-    /**
-     * populate watch tab
-     *
-     * @param tabs             - tabs list
-     * @param canAdminRepoPath - if true , has admin permission for this repo
-     */
-    protected void addWatchTab(List<IArtifactInfo> tabs, boolean canAdminRepoPath) {
-        if (canAdminRepoPath) {
-            tabs.add(new BaseArtifactInfo("Watch"));
-        }
-    }
-
-    /**
-     * populate effective permission tab
-     *
-     * @param tabs             - tabs list
-     * @param canAdminRepoPath - if true , has admin permission for this repo
-     */
-    protected void addEffectivePermissionTab(List<IArtifactInfo> tabs, boolean canAdminRepoPath) {
-        if (canAdminRepoPath) {
-            tabs.add(new BaseArtifactInfo("EffectivePermission"));
-        }
-    }
-
-    @Override
-    public void updateNodeData() {
-        if (isLocal()) {
-            hasChild = getRepoService().hasChildren(repoPath);
-        }
-    }
-
-    /**
-     * retrieve local or cached repo descriptor
-     *
-     * @param repoPath - repo path
-     * @return local repo descriptor
-     */
-    public LocalRepoDescriptor localOrCachedRepoDescriptor(RepoPath repoPath) {
-        String repoKey = repoPath.getRepoKey();
-        return getRepoService().localOrCachedRepoDescriptorByKey(repoKey);
-    }
-
-    /**
-     * check if user watching repo path
-     *
-     * @param authService - authorization service
-     * @param repoPath    - repo path
-     * @param artifactWatchAddon watch addon
-     * @return if true - user is watching repo service
-     */
-    protected boolean isUserWatchingRepoPath(AuthorizationService authService, RepoPath repoPath,
-            ArtifactWatchAddon artifactWatchAddon) {
-        return artifactWatchAddon.isUserWatchingRepo(repoPath, authService.currentUsername());
-    }
-
-
-    /**
-     * add delete action
-     *
-     * @param actions   - actions list
-     * @param canDelete - can user delete
-     */
-    protected void addDeleteAction(List<IAction> actions, boolean canDelete) {
-        if (canDelete) {
-            actions.add(new BaseArtifact("Delete"));
-        }
-    }
-
-    /**
-     * populate zap actions
-     *
-     * @param actions  - list of actions
-     * @param repoPath - repo path
-     * @param canAdmin -if true , has admin permission
-     */
-    protected void addZapAction(List<IAction> actions, RepoPath repoPath, boolean canAdmin) {
-        LocalRepoDescriptor localRepoDescriptor = localOrCachedRepoDescriptor(repoPath);
-        if (canAdmin && localRepoDescriptor != null && localRepoDescriptor.isCache()) {
-            actions.add(new BaseArtifact("Zap"));
-        }
-    }
-
-    /**
-     * populate Move action
-     *
-     * @param authService - authorization serivce
-     * @param actions     - list of actions
-     * @param repoPath    - repo path
-     * @param canDelete   - if true , can delete
-     */
-    protected void addMoveAction(AuthorizationService authService, List<IAction> actions, RepoPath repoPath,
-            boolean canDelete) {
-        if (canDelete && !NamingUtils.isSystem(repoPath.getPath()) && authService.canDeployToLocalRepository()) {
-            actions.add(new BaseArtifact("Move"));
-        }
-    }
-
-    /**
-     * populate copy action
-     *
-     * @param authService - authorization service
-     * @param actions     - list of action
-     * @param repoPath    - repo path
-     * @return can read permission
-     */
-    protected boolean addCopyAction(AuthorizationService authService, List<IAction> actions, RepoPath repoPath) {
-        boolean canRead = authService.canRead(repoPath);
-        if (canRead && !NamingUtils.isSystem(repoPath.getPath()) && authService.canDeployToLocalRepository()) {
-            actions.add(new BaseArtifact("Copy"));
-        }
-        return canRead;
-    }
-
-    protected void addRestoreAction(List<IAction> actions, boolean isAdmin) {
-        if (isAdmin) {
-            actions.add(new BaseArtifact("Restore"));
-        }
-    }
-
-    public String getRepoType() {
-        return repoType;
-    }
-
-    public void setRepoType(String repoType) {
-        this.repoType = repoType;
-    }
-
-    public boolean isLocal() {
-        return local;
-    }
-
-    public void setLocal(boolean local) {
-        this.local = local;
-    }
-
-    public String getIcon() {
-        return icon;
-    }
-
-    public void setIcon(String icon) {
-        this.icon = icon;
-    }
-
-    public boolean isTrash() {
-        return "trash".equals(repoType);
-    }
-
-    public boolean isDistribution() {
-        return "distribution".equals(repoType);
-    }
-
-    /**
-     * @return true if containing repo supports {@param type} which means it's either of that type or a distribution
-     * repo which supports all types for the purpose of viewing info about artifacts.
-     */
-    boolean isRepoSupportType(RepoType type) {
-        LocalRepoDescriptor descriptor =
-                getRepoService().localCachedOrDistributionRepoDescriptorByKey(getRepoPath().getRepoKey());
-        return isRepoSupportType(type, descriptor);
-    }
-
-    private boolean isRepoSupportType(RepoType type, LocalRepoDescriptor descriptor) {
-        return descriptor != null && (descriptor.getType().equals(type) || isDistributionRepo(descriptor));
-    }
-
-    private boolean isDistributionRepo(LocalRepoDescriptor descriptor) {
-        return descriptor.getType().equals(RepoType.Distribution);
-    }
-
-    /**
-     * Either this node is in a Distribution Repo --> add Redistribute action
-     * Or check if user can deploy to any Dist repo and show Distribute action.
-     * @param actions
-     */
-    void addDistributionActions(List<IAction> actions) {
-        if (ContextHelper.get().beanForType(CentralConfigService.class).getDescriptor().isOfflineMode()) {
-            return;
-        }
-        RepositoryService repositoryService = ContextHelper.get().beanForType(RepositoryService.class);
-        LocalRepoDescriptor descriptor = repositoryService.localCachedOrDistributionRepoDescriptorByKey(getRepoKey());
-        if (descriptor != null && isDistributionRepo(descriptor) && userCanDeployToDistRepo(getRepoKey())) {
-            actions.add(new BaseArtifact("Distribute"));
-        } else if (userCanDeployToDistRepo(null)) {
-            if (descriptor != null && !descriptor.isCache()) {
-                actions.add(new BaseArtifact("Distribute"));
-            }
-        }
-    }
-
-    /**
-     * @return true if repo is not Docker and not distribution
-     */
-    boolean repoCanPushToBintray() {
-        LocalRepoDescriptor descriptor =
-                getRepoService().localOrCachedRepoDescriptorByKey(getRepoPath().getRepoKey());
-        return descriptor != null && !descriptor.getType().equals(RepoType.Docker) && !isDistributionRepo(descriptor);
-    }
-
-    private boolean userCanDeployToDistRepo(@Nullable String repoKey) {
-        AuthorizationService authService = ContextHelper.get().beanForType(AuthorizationService.class);
-        List<String> repoKeys = new ArrayList<>();
-        if (StringUtils.isBlank(repoKey)) {
-            repoKeys.addAll(getRepoService().getDistributionRepoDescriptors().stream()
-                    .map(RepoDescriptor::getKey)
-                    .collect(Collectors.toList()));
-        } else {
-            repoKeys.add(repoKey);
-        }
-        return repoKeys.stream()
-                .map(key -> RepoPathFactory.create(key, "."))
-                .filter(authService::canDeploy)
-                .findAny()
-                .isPresent();
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/DistributionRepositoryNode.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/DistributionRepositoryNode.java
deleted file mode 100644
index 6965960..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/DistributionRepositoryNode.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.nodes;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.RepoBaseDescriptor;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-import org.artifactory.rest.common.model.artifact.IAction;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.RefreshArtifact;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * @author Dan Feldman
- */
- at JsonTypeName("distributionRepository")
- at JsonIgnoreProperties("repoPath")
-public class DistributionRepositoryNode extends BaseNode {
-
-    DistributionRepositoryNode(RepoBaseDescriptor repo) {
-        super(InternalRepoPathFactory.create(repo.getKey(), ""));
-        this.repoType = "distribution";
-        RepoPath repoPath = InternalRepoPathFactory.create(repo.getKey(), "");
-        super.setText(repoPath.getRepoKey());
-        setLocal(true);
-    }
-
-    public String getType() {
-        return "repository";
-    }
-
-    @Override
-    public Collection<? extends RestTreeNode> getChildren(AuthorizationService authService, boolean isCompact,
-            ArtifactoryRestRequest request) {
-        List<INode> childNodeList = new ArrayList<>();
-        childNodeList.add(this);
-        return childNodeList;
-    }
-
-    @Override
-    public void populateActions(AuthorizationService authService) {
-        List<IAction> actions = new ArrayList<>();
-        // update repo path and auth data
-        RepoPath repoPath = getRepoPath();
-        boolean canDelete = authService.canDelete(repoPath);
-        boolean canRead = authService.canRead(repoPath);
-        addRefreshAction(actions);
-        addWatchAction(authService, actions, canRead);
-        addDeleteAction(actions, canDelete);
-        setActions(actions);
-    }
-
-    @Override
-    protected RepoPath fetchRepoPath() {
-        return super.getRepoPath();
-    }
-
-    /**
-     * add refresh action
-     *
-     * @param actions - action list
-     */
-    private void addRefreshAction(List<IAction> actions) {
-        actions.add(new RefreshArtifact("Refresh"));
-    }
-
-    @Override
-    protected void addDeleteAction(List<IAction> actions, boolean canDelete) {
-        if (canDelete) {
-            actions.add(new BaseArtifact("DeleteContent"));
-        }
-    }
-
-    @Override
-    public Collection<? extends RestModel> fetchItemTypeData(AuthorizationService authService, boolean isCompact,
-            Properties props, ArtifactoryRestRequest request) {
-        return getRepoOrFolderChildren(authService, isCompact, request);
-    }
-
-    /**
-     * get repository or folder children
-     *
-     * @param authService - authorization service
-     * @param isCompact   - is compacted
-     * @param request
-     * @return
-     */
-    private Collection<? extends RestModel> getRepoOrFolderChildren(AuthorizationService authService, boolean isCompact,
-            ArtifactoryRestRequest request) {
-        Collection<? extends RestTreeNode> items = getChildren(authService, isCompact, request);
-        List<RestModel> treeModel = new ArrayList<>();
-        items.forEach(item -> {
-            // update additional data
-            ((INode) item).updateNodeData();
-            treeModel.add(item);
-        });
-        return treeModel;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/FileNode.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/FileNode.java
deleted file mode 100644
index f8d60fa..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/FileNode.java
+++ /dev/null
@@ -1,412 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.nodes;
-
-import org.artifactory.addon.AddonType;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.bower.BowerAddon;
-import org.artifactory.addon.pypi.PypiAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.fs.MutableFileInfo;
-import org.artifactory.ivy.IvyNaming;
-import org.artifactory.md.Properties;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.mime.MimeType;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-import org.artifactory.rest.common.model.artifact.IAction;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.util.BintrayRestHelper;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.BaseArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.IArtifactInfo;
-import org.artifactory.util.PathUtils;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at JsonTypeName("file")
-public class FileNode extends BaseNode {
-
-    private FileInfo fileInfo;
-    private String type ="file";
-    private String mimeType;
-
-    FileNode(){}
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public FileNode(FileInfo fileInfo,String text) {
-        super(fileInfo.getRepoPath());
-        this.fileInfo = fileInfo;
-        super.setText(text);
-        setLocal(true);
-    }
-
-
-    @Override
-    public void populateTabs(AuthorizationService authorizationService) {
-        List<IArtifactInfo> tabs = super.fetchTabs();
-        if (isLocal()) {
-            if (isDistribution()) {
-                boolean canAdmin = authorizationService.canManage(getRepoPath());
-                addGeneralTab(tabs);
-                addEffectivePermissionTab(tabs, canAdmin);
-                addPropertiesTab(tabs);
-                addWatchTab(tabs, canAdmin);
-            } else if (isTrash()) {
-                addGeneralTab(tabs);
-            } else {
-                AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-                RepoPath repoPath = fetchRepoPath();
-                ItemInfo itemInfo = this.retrieveItemInfo(getRepoPath());
-                boolean canAdmin = authorizationService.canManage(repoPath);
-                Properties properties = getRepoService().getProperties(getRepoPath());
-                //add addons  tabs
-                addGeneralTab(tabs);
-                addPomTab(tabs);
-                addXmlTab(tabs);
-                //addJnplTab(tabs);
-                addRpmTab(tabs, addonsManager);
-                addNuGetTab(tabs, addonsManager);
-                addRubyGemsTab(tabs, addonsManager);
-                addNpmTab(tabs, addonsManager, properties);
-                addBowerTab(tabs, addonsManager, properties);
-                addPypiTab(tabs, addonsManager, properties);
-                addEffectivePermissionTab(tabs, canAdmin);
-                addPropertiesTab(tabs);
-                addWatchTab(tabs, canAdmin);
-                addBuildTab(authorizationService, tabs, itemInfo);
-                addBlackDuckTab(tabs, itemInfo);
-            }
-        }
-    }
-
-
-    /**
-     * populate black duck tab
-     *
-     * @param tabs     - tabs list
-     * @param itemInfo - item info
-     */
-    private void addBlackDuckTab(List<IArtifactInfo> tabs, ItemInfo itemInfo) {
-        if (!itemInfo.isFolder()) {
-            tabs.add(new BaseArtifactInfo("BlackDuck"));
-        }
-    }
-
-    /**
-     * populate build tab
-     *
-     * @param authService - authorization service
-     * @param tabs        -tabs list
-     * @return - item info
-     */
-    private void addBuildTab(AuthorizationService authService, List<IArtifactInfo> tabs, ItemInfo itemInfo) {
-        if (!itemInfo.isFolder() && itemInfo instanceof MutableFileInfo
-                && !authService.isAnonUserAndAnonBuildInfoAccessDisabled()) {
-            tabs.add(new BaseArtifactInfo("Builds"));
-        }
-    }
-
-    @Override
-    public void populateActions(AuthorizationService authService) {
-        RepoPath repoPath = InternalRepoPathFactory.create(getRepoKey(), getPath());
-        boolean canRead = authService.canRead(repoPath);
-        boolean canDelete = authService.canDelete(repoPath);
-        updateFileInfo();
-        List<IAction> actions = new ArrayList<>();
-        if (isDistribution()) {
-            addWatchAction(authService, actions, canRead);
-            addDistributionActions(actions);
-            addDeleteAction(actions, canDelete);
-        } else if (isTrash()) {
-            addRestoreAction(actions, authService.isAdmin());
-            addDeleteAction(actions, authService.isAdmin());
-        } else {
-            addDownloadAction(actions);
-            addViewAction(actions);
-            addCopyAction(authService, actions, repoPath);
-            addMoveAction(authService, actions, repoPath, canDelete);
-            addWatchAction(authService, actions, canRead);
-            addDistributionActions(actions);
-            addBintrayActions(fileInfo, actions);
-            addDeleteAction(actions, canDelete);
-        }
-        setActions(actions);
-    }
-
-    private void addBintrayActions(ItemInfo itemInfo, List<IAction> actions) {
-        if (!itemInfo.isFolder()) {
-            if (repoCanPushToBintray() && BintrayRestHelper.isPushToBintrayAllowed(null, null)) {
-                actions.add(new BaseArtifact("UploadToBintray"));
-            }
-        }
-    }
-
-    @Override
-    protected RepoPath fetchRepoPath() {
-        return fileInfo.getRepoPath();
-    }
-
-    /**
-     * add rpm tab
-     *
-     * @param tabs - tabs list
-     */
-    private void addRpmTab(List<IArtifactInfo> tabs, AddonsManager addonsManager) {
-        boolean repoSupportsRpm = isRepoSupportType(RepoType.YUM);
-        if (isRpmFile() && repoSupportsRpm && addonsManager.isAddonSupported(AddonType.YUM)) {
-            tabs.add(new BaseArtifactInfo("Rpm"));
-        }
-    }
-
-    /**
-     * add jnpl tabs
-     *
-     * @param tabs - tabs list
-     */
-    private void addJnplTab(List<IArtifactInfo> tabs) {
-        if (isJnlpFile()) {
-            tabs.add(new BaseArtifactInfo("JNPL"));
-        }
-    }
-
-    /**
-     * add xml tab
-     *
-     * @param tabs list
-     */
-    private void addXmlTab(List<IArtifactInfo> tabs) {
-        if (isXmlFile() && !isPomFile()) {
-                //xml tab
-            IArtifactInfo xmlTab = isIvyFile() ? new BaseArtifactInfo("IVYXml") : new BaseArtifactInfo("GeneralXml");
-                tabs.add(xmlTab);
-        }
-    }
-
-    /**
-     * add nuGet tab
-     *
-     * @param tabs          - tabs list
-     * @param addonsManager - add on managers
-     */
-    private void addNuGetTab(List<IArtifactInfo> tabs, AddonsManager addonsManager) {
-        boolean repoSupportsNuget = isRepoSupportType(RepoType.NuGet);
-        if (isNuPkgFile() && repoSupportsNuget && addonsManager.isAddonSupported(AddonType.NUGET)) {
-            tabs.add(new BaseArtifactInfo("NuPkgInfo"));
-        }
-    }
-
-    /**
-     * add RubyGems tab
-     *
-     * @param tabs          - tabs list
-     * @param addonsManager - add on managers
-     */
-    private void addRubyGemsTab(List<IArtifactInfo> tabs, AddonsManager addonsManager) {
-        boolean repoSupportsGem = isRepoSupportType(RepoType.Gems);
-        if (isGemFile() && repoSupportsGem && addonsManager.isAddonSupported(AddonType.GEMS)) {
-            tabs.add(new BaseArtifactInfo("RubyGems"));
-        }
-    }
-
-    /**
-     * add Pypi tab
-     *
-     * @param tabs          - tabs list
-     * @param addonsManager - add on managers
-     */
-    private void addPypiTab(List<IArtifactInfo> tabs, AddonsManager addonsManager, Properties properties) {
-        boolean repoSupportsPypi = isRepoSupportType(RepoType.Pypi);
-        if (isPypiFile(properties) && repoSupportsPypi && addonsManager.isAddonSupported(AddonType.PYPI)) {
-            tabs.add(new BaseArtifactInfo("PyPIInfo"));
-        }
-    }
-
-    /**
-     * add ppom tab
-     *
-     * @param tabs - tabs list
-     */
-    private void addPomTab(List<IArtifactInfo> tabs) {
-        if (isPomFile()) {
-            // add pom view panel
-            tabs.add(new BaseArtifactInfo("PomView"));
-        }
-    }
-
-    /**
-     * add Npm tab
-     *
-     * @param tabs          - tabs list
-     * @param addonsManager - add on managers
-     */
-    private void addNpmTab(List<IArtifactInfo> tabs, AddonsManager addonsManager, Properties properties) {
-        boolean isNpmFileTypeAndSupported = isRepoSupportType(RepoType.Npm) && isNpmFile(properties)
-                && addonsManager.isAddonSupported(AddonType.NPM);
-        if (isNpmFileTypeAndSupported) {
-            tabs.add(new BaseArtifactInfo("NpmInfo"));
-        }
-    }
-
-    /**
-     * add Bower tab
-     *
-     * @param tabs          - tabs list
-     * @param addonsManager - add on managers
-     */
-    private void addBowerTab(List<IArtifactInfo> tabs, AddonsManager addonsManager, Properties properties) {
-        boolean isBowerFileTypeAndSupported = isRepoSupportType(RepoType.Bower)
-                && isBowerFile(addonsManager, properties) && addonsManager.isAddonSupported(AddonType.BOWER);
-        if (isBowerFileTypeAndSupported) {
-            tabs.add(new BaseArtifactInfo("BowerInfo"));
-        }
-    }
-
-    public String getMimeType() {
-        return mimeType;
-    }
-
-    public void setMimeType(String mimeType) {
-        this.mimeType = mimeType;
-    }
-
-    private boolean isXmlFile() {
-        return NamingUtils.isXml(fileInfo.getName());
-    }
-
-    private boolean isIvyFile() {
-        return IvyNaming.isIvyFileName(fileInfo.getName());
-    }
-
-    private boolean isPomFile() {
-        return MavenNaming.isPom((fileInfo.getName()));
-    }
-
-    private boolean isJnlpFile() {
-        MimeType mimeType = NamingUtils.getMimeType((fileInfo.getName()));
-        return "application/x-java-jnlp-file".equalsIgnoreCase(mimeType.getType());
-    }
-
-    private boolean isRpmFile() {
-        return fileInfo.getName().endsWith(".rpm");
-    }
-
-    private boolean isNuPkgFile() {
-        MimeType mimeType = NamingUtils.getMimeType((fileInfo.getName()));
-        return "application/x-nupkg".equalsIgnoreCase(mimeType.getType());
-    }
-
-    private boolean isGemFile() {
-        MimeType mimeType = NamingUtils.getMimeType((fileInfo.getName()));
-        return "application/x-rubygems".equalsIgnoreCase(mimeType.getType());
-    }
-
-    private boolean isBowerFile(AddonsManager addonsManager, Properties properties ){
-        return addonsManager.addonByType(BowerAddon.class).isBowerFile(fileInfo.getName())
-                && properties != null && properties.containsKey("bower.name");
-    }
-
-    private boolean isNpmFile(Properties properties) {
-        return fileInfo.getName().endsWith(".tgz") && properties != null && properties.containsKey("npm.name");
-    }
-
-    private boolean isPypiFile(Properties properties) {
-        AddonsManager addonsProvider = ContextHelper.get().beanForType(AddonsManager.class);
-        PypiAddon pypiWebAddon = addonsProvider.addonByType(PypiAddon.class);
-        return pypiWebAddon.isPypiFile((fileInfo)) && properties != null && properties.containsKey("pypi.name");
-    }
-
-    @Override
-    public List<? extends RestTreeNode> getChildren(AuthorizationService authService, boolean isCompact,
-            ArtifactoryRestRequest request) {
-        List<INode>  childNodeList = new ArrayList<>();
-        childNodeList.add(this);
-        return childNodeList;
-    }
-
-
-    /**
-     * add download actions
-     *
-     * @param actions - actions list
-     */
-    private void addDownloadAction(List<IAction> actions) {
-        actions.add(new BaseArtifact("Download"));
-    }
-
-    /**
-     *  add view action
-     * @param actions - action list
-     */
-    private void addViewAction(List<IAction> actions) {
-        if (NamingUtils.isViewable(getPath()) || "class".equals(PathUtils.getExtension(getPath()))) {
-            actions.add(new BaseArtifact("View"));
-        }
-    }
-
-
-    /**
-     * update additional file info data
-     */
-    private void updateFileInfo() {
-        if (fileInfo == null){
-            super.setRepoPath(InternalRepoPathFactory.create(getRepoKey(), getPath()));
-            fileInfo = getRepoService().getFileInfo(getRepoPath());
-        }
-    }
-
-
-    @Override
-    public void updateNodeData() {
-        if (isLocal()) {
-            if (fileInfo != null) {
-                mimeType = NamingUtils.getMimeType(fileInfo.getRelPath()).getType();
-            } else {
-                mimeType = NamingUtils.getMimeType(this.getPath()).getType();
-            }
-        }
-    }
-
-    protected void updateHasChild(boolean hasChild){
-        super.setHasChild(hasChild);
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-
-    @Override
-    public List<RestModel> fetchItemTypeData(AuthorizationService authService, boolean isCompact, Properties props,
-            ArtifactoryRestRequest request) {
-        Collection<? extends RestTreeNode> items = getChildren(authService, isCompact, request);
-        List<RestModel> treeModel = new ArrayList<>();
-        items.forEach(item -> {
-            ((INode) item).populateActions(authService);
-            // populate tabs
-            ((INode) item).populateTabs(authService);
-            // update additional data
-            ((INode) item).updateNodeData();
-            treeModel.add(item);
-        });
-        return treeModel;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/FolderNode.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/FolderNode.java
deleted file mode 100644
index 7953a79..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/FolderNode.java
+++ /dev/null
@@ -1,318 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.nodes;
-
-import org.artifactory.addon.AddonType;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-import org.artifactory.rest.common.model.artifact.IAction;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.util.BintrayRestHelper;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.RefreshArtifact;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.BaseArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.IArtifactInfo;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at JsonTypeName("folder")
-public class FolderNode extends BaseNode {
-
-    private FolderInfo folderInfo;
-    private String type = "folder";
-    private boolean compacted;
-
-    public String getType() {
-        return type;
-    }
-
-    public void setFolderInfo(FolderInfo folderInfo) {
-        this.folderInfo = folderInfo;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public boolean isCompacted() {
-        return compacted;
-    }
-
-    public FolderInfo fetchFolderInfo() {
-        return this.folderInfo;
-    }
-
-    public void setCompacted(boolean compacted) {
-        this.compacted = compacted;
-        updateNodeIcon();
-    }
-
-    public FolderNode() {
-    }
-
-    public FolderNode(FolderInfo folderInfo, String text) {
-        super(folderInfo.getRepoPath());
-        this.folderInfo = folderInfo;
-        this.setLocal(true);
-        setRepoType("local");
-        // update node display name
-        updateNodeDisplayName(text);
-        updateNodeIcon();
-    }
-
-    private void updateNodeIcon() {
-        if (isDockerManifestFolder()) {
-            super.setIcon("docker");
-        }
-    }
-
-    /**
-     * update node display name
-     *
-     * @param text - node orig name
-     */
-    private void updateNodeDisplayName(String text) {
-        if (isLocal() && isDockerFileTypeAndSupported()) {
-            super.setText(text.substring(0, 12));
-        } else {
-            super.setText(text);
-        }
-    }
-
-    @Override
-    public List<? extends RestTreeNode> getChildren(AuthorizationService authService, boolean isCompact,
-            ArtifactoryRestRequest request) {
-        List<INode> childNodeList = new ArrayList<>();
-        childNodeList.add(this);
-        return childNodeList;
-    }
-
-    @Override
-    public void populateActions(AuthorizationService authService) {
-        if (isLocal()) {
-            RepoPath repoPath = InternalRepoPathFactory.create(getRepoKey(), getPath());
-            boolean canRead = authService.canRead(repoPath);
-            boolean canDelete = authService.canDelete(repoPath);
-            boolean canAdmin = authService.canManage(repoPath);
-            boolean isAnonymous = authService.isAnonymous();
-            createFolderInfo();
-            List<IAction> actions = new ArrayList<>();
-            // add specific actions
-            if (isDistribution()) {
-                addRefreshAction(actions);
-                addWatchAction(authService, actions, canRead);
-                addDistributionActions(actions);
-                addDeleteAction(actions, canDelete);
-            } else if (isTrash()) {
-                addRefreshAction(actions);
-                addRestoreAction(actions, authService.isAdmin());
-                addDeleteAction(actions, authService.isAdmin());
-            } else {
-                addDownloadAction(actions, isAnonymous, canRead);
-                addRefreshAction(actions);
-                addCopyAction(authService, actions, repoPath);
-                addMoveAction(authService, actions, repoPath, canDelete);
-                addWatchAction(authService, actions, canRead);
-                addDistributionActions(actions);
-                addBintrayActions(actions);
-                addZapAction(actions, repoPath, canAdmin);
-                addDeleteVersionAction(actions, repoPath, canRead, canDelete, canAdmin);
-                addDeleteAction(actions, canDelete);
-            }
-            setActions(actions);
-        }
-    }
-
-    @Override
-    public void populateTabs(AuthorizationService authService) {
-        List<IArtifactInfo> tabs = new ArrayList<>();
-        if (isLocal()) {
-            if (isDistribution()) {
-                boolean canAdminRepoPath = authService.canManage(getRepoPath());
-                addGeneralTab(tabs);
-                addEffectivePermissionTab(tabs, canAdminRepoPath);
-                addPropertiesTab(tabs);
-                addWatchTab(tabs, canAdminRepoPath);
-            } else if (isTrash()) {
-                addGeneralTab(tabs);
-            } else {
-                boolean canAdminRepoPath = authService.canManage(getRepoPath());
-                addGeneralTab(tabs);
-                addDockerTab(tabs);
-                addDockerV2Tab(tabs);
-                addEffectivePermissionTab(tabs, canAdminRepoPath);
-                addPropertiesTab(tabs);
-                addWatchTab(tabs, canAdminRepoPath);
-            }
-            setTabs(tabs);
-        }
-    }
-
-    /**
-     * add Docker tab
-     *
-     * @param tabs          - tabs list
-     */
-    private void addDockerTab(List<IArtifactInfo> tabs) {
-        boolean isDockerFileTypeAndSupported = isDockerFileTypeAndSupported();
-        if (isDockerFileTypeAndSupported) {
-            tabs.add(new BaseArtifactInfo("DockerInfo"));
-            tabs.add(new BaseArtifactInfo("DockerAncestryInfo"));
-        }
-    }
-
-    private void addDockerV2Tab(List<IArtifactInfo> tabs) {
-        if (isDockerManifestFolder()) {
-            tabs.add(new BaseArtifactInfo("DockerV2Info"));
-        }
-    }
-
-    /**
-     * @return true if docker file is supported
-     */
-    private boolean isDockerFileTypeAndSupported() {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        boolean isDockerEnabled = isRepoSupportType(RepoType.Docker) && addonsManager.isAddonSupported(AddonType.DOCKER);
-        return isDockerEnabled && getRepoService().getChildrenNames(folderInfo.getRepoPath()).contains("json.json");
-    }
-
-    private boolean isDockerManifestFolder() {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        boolean isDockerEnabled = isRepoSupportType(RepoType.Docker) && addonsManager.isAddonSupported(AddonType.DOCKER);
-        return isDockerEnabled && getRepoService().getChildrenNames(folderInfo.getRepoPath()).contains("manifest.json");
-    }
-
-    @Override
-    protected RepoPath fetchRepoPath() {
-        return folderInfo.getRepoPath();
-    }
-
-    /**
-     * create folder info if not exist
-     */
-    private void createFolderInfo() {
-        if (folderInfo == null) {
-            super.setRepoPath(InternalRepoPathFactory.create(getRepoKey(), getPath()));
-            folderInfo = getRepoService().getFolderInfo(getRepoPath());
-        }
-    }
-
-    /**
-     * add delete version action
-     *
-     * @param path        - path
-     * @param canDelete   - user has delete permissions on path?
-     * @param actions     - actions list
-     */
-    private void addDeleteVersionAction(List<IAction> actions, RepoPath path, boolean canRead, boolean canDelete,
-            boolean canManage) {
-        LocalRepoDescriptor localRepoDescriptor = localOrCachedRepoDescriptor(path);
-        if ((canManage || canDelete) && canRead && localRepoDescriptor != null && localRepoDescriptor.isLocal()) {
-            actions.add(new BaseArtifact("DeleteVersions"));
-        }
-    }
-
-    /**
-     * add refresh action
-     *
-     * @param actions - actions list
-     */
-    private void addRefreshAction(List<IAction> actions) {
-        actions.add(new RefreshArtifact("Refresh"));
-    }
-
-    /**
-     * add download action
-     *
-     * @param actions - actions list
-     */
-    private void addDownloadAction(List<IAction> actions, boolean isAnonymous, boolean canRead) {
-        if(!isAnonymous && isLocal() && canRead && ContextHelper.get().beanForType(CentralConfigService.class)
-                .getDescriptor().getFolderDownloadConfig().isEnabled()) {
-            actions.add(new BaseArtifact("DownloadFolder"));
-        }
-    }
-
-    private void addBintrayActions(List<IAction> actions) {
-        if (isDockerManifestFolder()) {
-            if (BintrayRestHelper.isPushToBintrayAllowed(null, null)) {
-                actions.add(new BaseArtifact("UploadToBintray"));
-            }
-        }
-    }
-
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-
-    /**
-     * fetch next child for compact
-     * @return folder child
-     */
-    public FolderNode fetchNextChild(){
-        RepositoryService repoService = getRepoService();
-        // create repo path
-        RepoPath repositoryPath = InternalRepoPathFactory.create(getRepoKey(),getPath());
-        // get child's from repo service
-        List<ItemInfo> items = repoService.getChildren(repositoryPath);
-        if (items.size() != 1){
-            return null;
-        }
-        // is only item is folder
-        ItemInfo singleItem = items.get(0);
-        if (!singleItem.isFolder()){
-            return null;
-        }
-        return new FolderNode((FolderInfo)singleItem,singleItem.getName());
-    }
-
-    @Override
-    public List<RestModel> fetchItemTypeData(AuthorizationService authService, boolean isCompact, Properties props,
-            ArtifactoryRestRequest request) {
-        Collection<? extends RestTreeNode> items = getChildren(authService, isCompact, request);
-        List<RestModel> treeModel = new ArrayList<>();
-        items.forEach(item -> {
-            ((INode) item).populateActions(authService);
-            // populate tabs
-            ((INode) item).populateTabs(authService);
-            // update additional data
-            ((INode) item).updateNodeData();
-            treeModel.add(item);
-        });
-        return treeModel;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/INode.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/INode.java
deleted file mode 100644
index e0d7411..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/INode.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.nodes;
-
-import org.artifactory.api.security.AuthorizationService;
-
-
-/**
- * @author Chen Keinan
- */
-
-public interface INode extends RestTreeNode {
-
-    /**
-     * populate action for this node by auth
-     *
-     * @param authService - auth service
-     */
-    void populateActions(AuthorizationService authService);
-
-    /**
-     * populate tabs for this node by auth
-     *
-     * @param authorizationService - auth service
-     */
-    void populateTabs(AuthorizationService authorizationService);
-
-    /**
-     * update additional child data
-     */
-    void updateNodeData();
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/JunctionNode.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/JunctionNode.java
deleted file mode 100644
index bfb2bd2..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/JunctionNode.java
+++ /dev/null
@@ -1,390 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.nodes;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.compress.archivers.ArchiveEntry;
-import org.apache.commons.compress.archivers.ArchiveInputStream;
-import org.apache.commons.io.IOUtils;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.BaseBrowsableItem;
-import org.artifactory.api.repo.BrowsableItemCriteria;
-import org.artifactory.api.repo.RepositoryBrowsingService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.mime.MimeType;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.nodes.archive.ArchiveEntriesTree;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.nodes.archive.ArchiveTreeNode;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-import org.codehaus.jackson.annotate.JsonTypeName;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.*;
-
-/**
- * Junction node represents an action of which the user wishes to view an item children.
- * The user clicks the little arrow on the tree and the junction node request
- * gets populated with the children names (without their data to save network bandwidth)
- *
- * @author Chen  Keinan
- */
- at JsonTypeName("junction")
- at JsonIgnoreProperties("repoPath")
-public class JunctionNode implements RestTreeNode {
-    private static final Logger log = LoggerFactory.getLogger(JunctionNode.class);
-    private String repoKey;
-    private String path;
-    private String repoType;
-    private Properties props;
-
-
-    @Override
-    public Collection<? extends RestTreeNode> getChildren(AuthorizationService authService, boolean isCompact,
-            ArtifactoryRestRequest request) {
-        List<RestTreeNode> children;
-        // create repo path
-        RepoPath repositoryPath = InternalRepoPathFactory.create(getRepoKey(), getPath());
-        RepositoryService repoService = getRepoService();
-        BrowsableItemCriteria criteria;
-        List<ItemInfo> items;
-        // get child's from repo service
-        RepositoryBrowsingService repositoryBrowsingService = ContextHelper.get().beanForType(RepositoryBrowsingService.class);
-        switch (repoType) {
-            case "local":
-            case "cache":
-            case "distribution":
-            case "trash": {
-                items = repoService.getChildren(repositoryPath);
-                children = Lists.newArrayListWithExpectedSize(items.size());
-                // populate child data
-                populateChildData(children, repoService, items, isCompact);
-                break;
-            }
-            case "remote": {
-                RepoPath remoteRepoPath = InternalRepoPathFactory.create(getRepoKey(), getPath(), true);
-                criteria = getBrowsableItemCriteria(remoteRepoPath);
-                List<BaseBrowsableItem> remoteChildren = repositoryBrowsingService.getRemoteRepoBrowsableChildren(criteria);
-                children = Lists.newArrayListWithExpectedSize(remoteChildren.size());
-                Collections.sort(remoteChildren);
-                populateRemoteData(children, remoteChildren, "remote");
-                break;
-            }
-            case "virtual": {
-                RepoPath virtualRepoPath = InternalRepoPathFactory.create(getRepoKey(), getPath(), true);
-                criteria = getBrowsableItemCriteria(virtualRepoPath);
-                List<BaseBrowsableItem> virtualChildren = repositoryBrowsingService.getVirtualRepoBrowsableChildren(criteria);
-                children = Lists.newArrayListWithExpectedSize(virtualChildren.size());
-                Collections.sort(virtualChildren);
-                populateRemoteData(children, virtualChildren, "virtual");
-                break;
-            }
-            default: {
-                items = repoService.getChildren(repositoryPath);
-                children = Lists.newArrayListWithExpectedSize(items.size());
-                // populate child data
-                populateChildData(children, repoService, items, isCompact);
-                break;
-            }
-        }
-        return children;
-}
-
-    /**
-     * get remote and virtual browsable item criteria
-     *
-     * @param repositoryPath - repository path
-     * @return browsable item criteria
-     */
-    private BrowsableItemCriteria getBrowsableItemCriteria(RepoPath repositoryPath) {
-        return new BrowsableItemCriteria.Builder(repositoryPath)
-                .requestProperties(props)
-                .includeChecksums(false).build();
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    /**
-     * get archive children nodes
-     * @return List or archive nodes
-     */
-    public Collection<? extends RestModel> getArchiveChildren() {
-        // create archive tree data
-        ArchiveEntriesTree  tree = buildArchiveEntriesTree();
-        // fetch root element
-        RestModel root = tree.getRoot();
-            if (!((ArchiveTreeNode)root).hasChildren()) {
-                return Collections.emptyList();
-            }
-        // create archive nodes from main root elements
-        return getArchiveNodes(root);
-    }
-
-    /**
-     * create archive nodes from tree data
-     * @param root
-     * @return
-     */
-    private Set<RestModel> getArchiveNodes(RestModel root) {
-         return  ((ArchiveTreeNode) root).getChildren();
-    }
-
-    /**
-     * build archive entries tree from archive data
-     * @return archive entries tree instance
-     */
-    private ArchiveEntriesTree buildArchiveEntriesTree() {
-        ArchiveEntriesTree tree = new ArchiveEntriesTree();
-        String repoKey = getRepoKey();
-        ArchiveInputStream archiveInputStream = null;
-        try {
-            ArchiveEntry archiveEntry;
-            // create repo path
-            RepoPath repositoryPath = InternalRepoPathFactory.create(repoKey, getPath());
-            archiveInputStream = getRepoService().archiveInputStream(repositoryPath);
-            while ((archiveEntry = archiveInputStream.getNextEntry()) != null) {
-                tree.insert(InfoFactoryHolder.get().createArchiveEntry(archiveEntry), repoKey, getPath());
-            }
-        } catch (IOException e) {
-            log.error("Failed to get  zip Input Stream: " + e.getMessage());
-        } finally {
-            if (archiveInputStream != null) {
-                IOUtils.closeQuietly(archiveInputStream);
-            }
-            return tree;
-        }
-    }
-
-    /**
-     * populate File or Folder Data
-     * @param children - list of child's
-     * @param repoService - repository service
-     * @param items - nodes items ( File or Folder)
-     */
-    private void populateChildData(List<RestTreeNode> children, RepositoryService repoService, List<ItemInfo> items,
-            boolean isCompact) {
-        for (ItemInfo pathItem : items) {
-            RepoPath repoPath = pathItem.getRepoPath();
-            if (!repoService.isRepoPathVisible(repoPath)) {
-                continue;
-            }
-            children.add(getChildItem(pathItem, pathItem.getRelPath(),repoPath,isCompact));
-        }
-    }
-
-    /**
-     * populate File or Folder Data
-     * @param children - list of child's
-     * @param items - nodes items ( File or Folder)
-     */
-    private void populateRemoteData(List<RestTreeNode> children,
-            List<BaseBrowsableItem> items, String repoType) {
-        for (BaseBrowsableItem pathItem : items) {
-            children.add(getRemoteChildItem(pathItem, repoType));
-        }
-    }
-
-    /**
-     * Returns a new child  node item
-     *
-     * @param pathItem       The path to the child content
-     * @param relativePath   The relative path to the child itself
-     * @return File or folder node
-     */
-    protected RestTreeNode getChildItem(ItemInfo pathItem, String relativePath, RepoPath repoPath, boolean isCompact) {
-        RestTreeNode child;
-        if (pathItem.isFolder()) {
-            child = new FolderNode(((FolderInfo) pathItem),pathItem.getName());
-            if  (isCompact){
-                // compact child folder
-                compactFolder(child);
-           }
-            ((FolderNode) child).setHasChild(getRepoService().hasChildren(repoPath));
-            ((FolderNode) child).setRepoType(repoType);
-        } else {
-            MimeType mimeType = NamingUtils.getMimeType(relativePath);
-            if (mimeType.isArchive()) {
-                child =  new ZipFileNode((FileInfo) pathItem,pathItem.getName());
-                ((FileNode) child).setHasChild(true);
-                ((FileNode) child).setRepoType(repoType);
-            } else {
-                child = new FileNode ((FileInfo) pathItem,pathItem.getName());
-                ((FileNode) child).setRepoType(repoType);
-            }
-        }
-        return child;
-    }
-
-    /**
-     * Returns a new child  node item
-     *
-     * @param pathItem       The path to the child content
-     * @return File or folder node
-     */
-    protected RestTreeNode getRemoteChildItem(BaseBrowsableItem pathItem, String repoType) {
-        RestTreeNode child;
-        RepoPath repositoryPath = null;
-        if (pathItem.isFolder()) {
-            child = createRemoteOrVirtualFolderNode(pathItem, repoType, repositoryPath);
-
-        } else {
-            child = new VirtualRemoteFileNode(pathItem, pathItem.getName(), repoType);
-        }
-        return child;
-    }
-
-    /**
-     * create remote or virtual folder node
-     *
-     * @param pathItem       - path item
-     * @param repoType       - repo type
-     * @param repositoryPath - repository path
-     * @return - tree node
-     */
-    private RestTreeNode createRemoteOrVirtualFolderNode(BaseBrowsableItem pathItem, String repoType,
-            RepoPath repositoryPath) {
-        RestTreeNode child;
-        String repoKey = pathItem.getRepoKey();
-        repositoryPath = pathItem.getRepoPath();
-        if (repoKey.endsWith("-cache")) {
-            repoKey = repoKey.replace("-cache", "");
-            repositoryPath = InternalRepoPathFactory.create(repoKey, pathItem.getRepoPath().getPath());
-        }
-        child = new VirtualRemoteFolderNode(repositoryPath, pathItem, pathItem.getName(), repoType);
-        return child;
-    }
-
-    /**
-     * compact 1sr folder child  by looking for empty child folders
-     * @param child - 1st folder child
-     */
-    private void compactFolder(RestTreeNode child) {
-
-        FolderNode folder = (FolderNode) child;
-        StringBuilder nameBuilder = new StringBuilder(folder.getText());
-        FolderNode next = folder.fetchNextChild();
-        // look for empty folders
-        while (next != null){
-            folder.setFolderInfo(next.fetchFolderInfo());
-            folder.setRepoPath(next.getRepoPath());
-            folder.setCompacted(true);
-            // update compact name
-            nameBuilder.append('/').append(next.getText());
-            next = next.fetchNextChild();
-        }
-        folder.setText(nameBuilder.toString());
-    }
-
-    @Override
-    public Collection<? extends RestModel> fetchItemTypeData(AuthorizationService authService,
-            boolean isCompact, Properties props, ArtifactoryRestRequest request) {
-        if ((repoType.equals("local") || repoType.equals("cached") || repoType.equals("distribution")) && isArchive()) {
-            // get all archive children
-            return getArchiveChildren();
-        } else {
-            this.props = props;
-            // get repository or folder children 1st depth
-            return getRepoOrFolderChildren(authService, isCompact, request);
-        }
-    }
-
-    /**
-     * get repository or folder children
-     *
-     * @param authService - authorization service
-     * @param isCompact   - is compacted
-     * @param request
-     * @return
-     */
-    private Collection<? extends RestModel> getRepoOrFolderChildren(AuthorizationService authService, boolean isCompact,
-            ArtifactoryRestRequest request) {
-        Collection<? extends RestTreeNode> items = getChildren(authService, isCompact, request);
-        List<RestModel> treeModel = new ArrayList<>();
-        items.forEach(item -> {
-            // update additional data
-            ((INode) item).updateNodeData();
-            treeModel.add(item);
-        });
-        return treeModel;
-    }
-
-    /**
-     * check if folder type is archive
-     *
-     * @return if true , folder type is archive
-     */
-    private boolean isArchive() {
-        RepoPath repositoryPath = InternalRepoPathFactory.create(getRepoKey(), getPath());
-        ItemInfo fileInfo = retrieveItemInfo(repositoryPath);
-        return NamingUtils.getMimeType(fileInfo.getRelPath()).isArchive();
-    }
-
-    protected RepositoryService getRepoService() {
-        return ContextHelper.get().beanForType(RepositoryService.class);
-    }
-
-    /**
-     * retrieve item info
-     *
-     * @param repoPath - repo path
-     * @return - item info
-     */
-    public org.artifactory.fs.ItemInfo retrieveItemInfo(RepoPath repoPath) {
-        return getRepoService().getItemInfo(repoPath);
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-
-    public String getRepoType() {
-        return repoType;
-    }
-
-    public void setRepoType(String repoType) {
-        this.repoType = repoType;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/RepositoryNode.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/RepositoryNode.java
deleted file mode 100644
index 8639193..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/RepositoryNode.java
+++ /dev/null
@@ -1,331 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.nodes;
-
-import org.apache.commons.io.IOUtils;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.RepoBaseDescriptor;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-import org.artifactory.rest.common.model.artifact.IAction;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.RefreshArtifact;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.nodes.archive.ArchiveEntriesTree;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.nodes.archive.ArchiveTreeNode;
-import org.artifactory.ui.utils.RegExUtils;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-import org.codehaus.jackson.annotate.JsonTypeName;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.*;
-import java.util.regex.Matcher;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-
-/**
- * @author Chen  Keinan
- */
- at JsonTypeName("repository")
- at JsonIgnoreProperties("repoPath")
-public class RepositoryNode extends BaseNode {
-
-    private static final Logger log = LoggerFactory.getLogger(JunctionNode.class);
-    private String type = "repository";
-    private RepoType repoPkgType;
-    public RepositoryNode(RepoBaseDescriptor repo,String repoType) {
-        super(InternalRepoPathFactory.create(repo.getKey(), ""));
-        setRepoType(repoType);
-        RepoPath repoPath = InternalRepoPathFactory.create(repo.getKey(), "");
-        super.setText(repoPath.getRepoKey());
-        updateLocalFlag();
-        repoPkgType = repo.getType();
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    @Override
-    public Collection<? extends RestTreeNode> getChildren(AuthorizationService authService, boolean isCompact,
-            ArtifactoryRestRequest request) {
-        List<INode> childNodeList = new ArrayList<>();
-        childNodeList.add(this);
-        return childNodeList;
-    }
-
-    /**
-     * get archive children nodes
-     *
-     * @param authService - authorization service
-     * @param compacted   - is compact mode
-     * @return List or archive nodes
-     */
-    public Collection<? extends RestModel> getArchiveChildren(AuthorizationService authService, boolean compacted) {
-        // create archive tree data
-        ArchiveEntriesTree tree = buildArchiveEntriesTree();
-        // fetch root element
-        RestModel root = tree.getRoot();
-        if (!((ArchiveTreeNode) root).hasChildren()) {
-            return Collections.emptyList();
-        }
-        // create archive nodes from main root elements
-        Collection<RestModel> items = getArchiveNodes(root);
-        return items;
-    }
-
-    /**
-     * create archive nodes from tree data
-     *
-     * @param root
-     * @return
-     */
-    private Set<RestModel> getArchiveNodes(RestModel root) {
-        return ((ArchiveTreeNode) root).getChildren();
-    }
-
-    /**
-     * build archive entries tree from archive data
-     *
-     * @return archive entries tree instance
-     */
-    private ArchiveEntriesTree buildArchiveEntriesTree() {
-        ArchiveEntriesTree tree = new ArchiveEntriesTree();
-        String repoKey = getRepoKey();
-        ZipInputStream zipInputStream = null;
-        try {
-            ZipEntry zipEntry;
-            // create repo path
-            RepoPath repositoryPath = InternalRepoPathFactory.create(repoKey, getPath());
-            zipInputStream = getRepoService().zipInputStream(repositoryPath);
-            while ((zipEntry = zipInputStream.getNextEntry()) != null) {
-                tree.insert(InfoFactoryHolder.get().createZipEntry(zipEntry), repoKey, getPath());
-            }
-        } catch (IOException e) {
-            log.error("Failed to get  zip Input Stream: " + e.getMessage());
-        } finally {
-            if (zipInputStream != null) {
-                IOUtils.closeQuietly(zipInputStream);
-            }
-            return tree;
-        }
-    }
-
-    @Override
-    public void populateActions(AuthorizationService authService) {
-        List<IAction> actions = new ArrayList<>();
-        // update repo path and auth data
-        RepoPath repoPath = getRepoPath();
-        if (isTrash()) {
-            addRefreshAction(actions);
-            actions.add(new BaseArtifact("SearchTrash"));
-            actions.add(new BaseArtifact("EmptyTrash"));
-        } else {
-            boolean canDelete = authService.canDelete(repoPath);
-            boolean canRead = authService.canRead(repoPath);
-            boolean canManage = authService.canManage(repoPath);
-            boolean isAnonymous = authService.isAnonymous();
-            // add specific actions
-            addDownloadAction(actions, isAnonymous, canRead);
-            addRefreshAction(actions);
-            addCopyAction(authService, actions, repoPath);
-            addMoveAction(authService, actions, repoPath, canDelete);
-            addWatchAction(authService, actions, canRead);
-            addZapAction(actions, repoPath, canManage);
-            addPackageReindexAction(actions, canManage);
-            addDeleteVersionAction(actions, repoPath, canRead, canDelete, canManage);
-            addDeleteAction(actions, canDelete);
-        }
-        setActions(actions);
-    }
-
-    /**
-     * add package reindex action for repositories which support it
-     *
-     * @param actions - actions list
-     */
-    private void addPackageReindexAction(List<IAction> actions, boolean isAllowed) {
-        Matcher matcher = RegExUtils.LOCAL_REPO_REINDEX_PATTERN.matcher(this.repoPkgType.name());
-        boolean foundMatch = matcher.matches();
-        if (isAllowed && foundMatch && getRepoType().equals("local")) {
-            actions.add(new BaseArtifact("RecalculateIndex"));
-        }
-    }
-
-    @Override
-    protected RepoPath fetchRepoPath() {
-        return super.getRepoPath();
-    }
-
-    /**
-     * add refresh action
-     *
-     * @param actions - action list
-     */
-    private void addRefreshAction(List<IAction> actions) {
-        actions.add(new RefreshArtifact("Refresh"));
-    }
-
-    /**
-     * populate copy action
-     *
-     * @param authService - authorization service
-     * @param actions     - list of actions
-     * @param repoPath    - repo path
-     * @return if true - has can  read permission
-     */
-    @Override
-    protected boolean addCopyAction(AuthorizationService authService, List<IAction> actions, RepoPath repoPath) {
-        boolean canRead = authService.canRead(repoPath);
-        if (canRead && !NamingUtils.isSystem(repoPath.getPath()) && authService.canDeployToLocalRepository()) {
-            actions.add(new BaseArtifact("CopyContent"));
-        }
-        return canRead;
-    }
-
-    /**
-     * populate MoveArtifact
-     *
-     * @param authService - authorization service
-     * @param actions     - list of actions
-     * @param repoPath    - repo path
-     * @return if true - has can  read permission
-     */
-
-    @Override
-    protected void addMoveAction(AuthorizationService authService, List<IAction> actions, RepoPath repoPath,
-            boolean canDelete) {
-        if (canDelete && !NamingUtils.isSystem(repoPath.getPath()) && authService.canDeployToLocalRepository()) {
-            actions.add(new BaseArtifact("MoveContent"));
-        }
-    }
-
-    /**
-     * add delete version action
-     *
-     * @param path        - path
-     * @param canDelete   - user has delete permissions on path?
-     * @param actions     - actions list
-     */
-    private void addDeleteVersionAction(List<IAction> actions, RepoPath path, boolean canRead, boolean canDelete,
-            boolean canManage) {
-        if ((canManage || canDelete) && canRead && localOrCachedRepoDescriptor(path).isLocal()) {
-            actions.add(new BaseArtifact("DeleteVersions"));
-        }
-    }
-
-    /**
-     * populate delete action
-     *
-     * @param actions   - list of actions
-     * @param canDelete - if true can delete
-     */
-    @Override
-    protected void addDeleteAction(List<IAction> actions, boolean canDelete) {
-        if (canDelete) {
-            actions.add(new BaseArtifact("DeleteContent"));
-        }
-    }
-
-    /**
-     * add download action
-     *
-     * @param actions - actions list
-     */
-    private void addDownloadAction(List<IAction> actions, boolean isAnonymous, boolean canRead) {
-        if(!isAnonymous && isLocal() && canRead && ContextHelper.get().beanForType(CentralConfigService.class)
-                .getDescriptor().getFolderDownloadConfig().isEnabled()) {
-            actions.add(new BaseArtifact("DownloadFolder"));
-        }
-    }
-
-    @Override
-    public Collection<? extends RestModel> fetchItemTypeData(AuthorizationService authService, boolean isCompact,
-            Properties props, ArtifactoryRestRequest request) {
-        if (isArchive()) {
-            // get all archive children
-            return getArchiveChildren(authService, isCompact);
-        } else {
-            // get repository or folder children 1st depth
-            return getRepoOrFolderChildren(authService, isCompact, request);
-        }
-    }
-
-    /**
-     * get repository or folder children
-     *
-     * @param authService - authorization service
-     * @param isCompact   - is compacted
-     * @param request
-     * @return
-     */
-    private Collection<? extends RestModel> getRepoOrFolderChildren(AuthorizationService authService, boolean isCompact,
-            ArtifactoryRestRequest request) {
-        Collection<? extends RestTreeNode> items = getChildren(authService, isCompact, request);
-        List<RestModel> treeModel = new ArrayList<>();
-        items.forEach(item -> {
-            // update additional data
-            ((INode) item).updateNodeData();
-            treeModel.add(item);
-        });
-        return treeModel;
-    }
-
-    /**
-     * check if folder type is archive
-     *
-     * @return if true , folder type is archive
-     */
-    private boolean isArchive() {
-        RepoPath repositoryPath = InternalRepoPathFactory.create(getRepoKey(), getPath());
-        ItemInfo fileInfo = retrieveItemInfo(repositoryPath);
-        return NamingUtils.getMimeType(fileInfo.getRelPath()).isArchive();
-    }
-
-    private void updateLocalFlag(){
-        switch (repoType){
-            case "remote" : {
-                setLocal(false);
-                setHasChild(true);
-            }
-                break;
-            case "virtual" : {
-                setLocal(false);
-                setHasChild(true);
-            }
-                break;
-            case "cached" : {
-                setLocal(true);
-            }
-                break;
-            case "local" : setLocal(true);
-                break;
-        }
-    }
-
-    public RepoType getRepoPkgType() {
-        return repoPkgType;
-    }
-
-    public void setRepoPkgType(RepoType repoPkgType) {
-        this.repoPkgType = repoPkgType;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/RestTreeNode.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/RestTreeNode.java
deleted file mode 100644
index 1fe8420..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/RestTreeNode.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.nodes;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.md.Properties;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.codehaus.jackson.annotate.JsonSubTypes;
-import org.codehaus.jackson.annotate.JsonTypeInfo;
-
-import java.util.Collection;
-
-/**
- * @author Chen Keinan
- */
- at JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
- at JsonSubTypes({@JsonSubTypes.Type(value = JunctionNode.class, name = "junction"),
-        @JsonSubTypes.Type(value = RootNode.class, name = "root"),
-        @JsonSubTypes.Type(value = FolderNode.class, name = "folder"),
-        @JsonSubTypes.Type(value = RepositoryNode.class, name = "repository"),
-        @JsonSubTypes.Type(value = ZipFileNode.class, name = "archive"),
-        @JsonSubTypes.Type(value = FileNode.class, name = "file")})
-public interface RestTreeNode extends RestModel {
-
-    /**
-     * update additional tree data
-     */
-    Collection<? extends RestModel> fetchItemTypeData(AuthorizationService authService, boolean isCompact,
-            Properties props, ArtifactoryRestRequest request);
-
-    /**
-     * get node child's by authorization service service
-     *
-     * @param authService - authorization service
-     * @param request
-     * @return list for tee nodes
-     */
-    Collection<? extends RestTreeNode> getChildren(AuthorizationService authService, boolean isCompact,
-            ArtifactoryRestRequest request);
-
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/RootNode.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/RootNode.java
deleted file mode 100644
index 3e93428..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/RootNode.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.nodes;
-
-import com.google.common.collect.Lists;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.*;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.trash.TrashService;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-import java.util.*;
-import java.util.stream.Collectors;
-
-/**
- * This is the root node of the tree browser. It contains all the repository nodes.
- *
- * @author Chen Keinan
- *
- */
- at JsonTypeName("root")
-public class RootNode implements RestTreeNode {
-
-    @Override
-    public List<? extends INode> getChildren(AuthorizationService authService, boolean isCompact,
-            ArtifactoryRestRequest request) {
-        List<INode> repoNodes = new ArrayList<>();
-        //Add a tree node for each file repository and local cache repository
-        RepositoryService repositoryService = ContextHelper.get().getRepositoryService();
-        //add distribution repos
-        addDistributionRepoNodes(repoNodes, repositoryService);
-        // get local repo descriptors
-        addLocalRepoNodes(repoNodes, repositoryService);
-        // add remote repo
-        addRemoteRepoNodes(repoNodes, repositoryService, request);
-        // add virtual repo
-        addVirtualRepoNodes(repoNodes, repositoryService, request);
-        // add the trash
-        addTrashRepo(repoNodes, repositoryService);
-        return repoNodes;
-    }
-
-    private void addTrashRepo(List<INode> repoNodes, RepositoryService repositoryService) {
-        AuthorizationService authService = ContextHelper.get().beanForType(AuthorizationService.class);
-        if (authService.isAdmin()) {
-            LocalRepoDescriptor trashDescriptor = repositoryService.localRepoDescriptorByKey(TrashService.TRASH_KEY);
-            repoNodes.add(new RepositoryNode(trashDescriptor, "trash"));
-        }
-    }
-
-    /**
-     * add local repo nodes to repo list
-     *
-     * @param repoNodes         - repository nodes list
-     * @param repositoryService - repository service
-     */
-    private void addLocalRepoNodes(List<INode> repoNodes, RepositoryService repositoryService) {
-        List<LocalRepoDescriptor> localRepos = repositoryService.getLocalAndCachedRepoDescriptors();
-        removeNonPermissionRepositories(localRepos);
-        Collections.sort(localRepos, new LocalRepoAlphaComparator());
-        repoNodes.addAll(getLocalNodes(localRepos));
-    }
-
-    /**
-     * get Root Node items
-     *
-     * @param repos - list of repositories
-     * @return - list of root node items
-     */
-    private List<INode> getLocalNodes(List<LocalRepoDescriptor> repos) {
-        List<INode> items = Lists.newArrayListWithCapacity(repos.size());
-        repos.forEach(repo -> {
-            String repoType = repo.getKey().endsWith("-cache") ? "cached" : "local";
-            RepositoryNode itemNodes = new RepositoryNode(repo, repoType);
-            items.add(itemNodes);
-        });
-        return items;
-    }
-
-    /**
-     * add remote repo nodes to repo list
-     *  @param repoNodes         - repository nodes list
-     * @param repositoryService - repository service
-     * @param request
-     */
-    private void addRemoteRepoNodes(List<INode> repoNodes, RepositoryService repositoryService,
-                                    ArtifactoryRestRequest request) {
-        List<RemoteRepoDescriptor> remoteDescriptors = repositoryService.getRemoteRepoDescriptors();
-        removeNonPermissionRepositories(remoteDescriptors);
-        Collections.sort(remoteDescriptors, new RepoComparator());
-        repoNodes.addAll(getRemoteNodes(remoteDescriptors, request));
-    }
-
-    /**
-     * get Root Node items
-     * @param repos - list of repositories
-     * @param request
-     * @return - list of root node items
-     */
-    private List<INode> getRemoteNodes(List<RemoteRepoDescriptor> repos, ArtifactoryRestRequest request) {
-        List<INode> items = Lists.newArrayListWithCapacity(repos.size());
-        repos.forEach(repo -> {
-            if (repo.isListRemoteFolderItems()) {
-                String repoType = "remote";
-                VirtualRemoteRepositoryNode itemNodes = new VirtualRemoteRepositoryNode(repo, repoType, request);
-                items.add(itemNodes);
-            }
-        });
-        return items;
-    }
-
-    /**
-     * add virtual repo nodes to repo list
-     *  @param repoNodes         - repository nodes list
-     * @param repositoryService - repository service
-     * @param request
-     */
-    private void addVirtualRepoNodes(List<INode> repoNodes, RepositoryService repositoryService,
-            ArtifactoryRestRequest request) {
-        List<VirtualRepoDescriptor> virtualDescriptors = repositoryService.getVirtualRepoDescriptors();
-        removeNonPermissionRepositories(virtualDescriptors);
-        Collections.sort(virtualDescriptors, new RepoComparator());
-        repoNodes.addAll(getVirtualNodes(virtualDescriptors, request));
-    }
-
-    /**
-     * get Root Node items
-     *
-     * @param repos - list of repositories
-     * @param request
-     * @return - list of root node items
-     */
-    private List<INode> getVirtualNodes(List<VirtualRepoDescriptor> repos, ArtifactoryRestRequest request) {
-        List<INode> items = Lists.newArrayListWithCapacity(repos.size());
-        repos.forEach(repo -> {
-            String repoType = "virtual";
-            VirtualRemoteRepositoryNode itemNodes = new VirtualRemoteRepositoryNode(repo, repoType, request);
-            items.add(itemNodes);
-        });
-        return items;
-    }
-
-    private void addDistributionRepoNodes(List<INode> repoNodes, RepositoryService repositoryService) {
-        List<DistributionRepoDescriptor> distributionDescriptors = repositoryService.getDistributionRepoDescriptors();
-        removeNonPermissionRepositories(distributionDescriptors);
-        Collections.sort(distributionDescriptors, new RepoComparator());
-        repoNodes.addAll(getDistributionNodes(distributionDescriptors));
-    }
-
-    private List<INode> getDistributionNodes(List<DistributionRepoDescriptor> repos) {
-        return repos.stream()
-                .map(DistributionRepositoryNode::new)
-                .collect(Collectors.toList());
-    }
-
-    /**
-     * remove repositories which user not permit to access
-     *
-     * @param repositories
-     */
-    private void removeNonPermissionRepositories(List<? extends RepoDescriptor> repositories) {
-        AuthorizationService authorizationService = ContextHelper.get().getAuthorizationService();
-        Iterator<? extends RepoDescriptor> repoDescriptors = repositories.iterator();
-        while (repoDescriptors.hasNext()) {
-            RepoDescriptor repoDescriptor = repoDescriptors.next();
-            if (!authorizationService.userHasPermissionsOnRepositoryRoot(repoDescriptor.getKey())) {
-                repoDescriptors.remove();
-            }
-        }
-    }
-
-    @Override
-    public List<RestModel> fetchItemTypeData(AuthorizationService authService, boolean isCompact,
-            Properties props, ArtifactoryRestRequest request) {
-        Collection<? extends RestTreeNode> items = getChildren(authService, isCompact, request);
-        List<RestModel> treeModel = new ArrayList<>();
-        items.forEach(item -> {
-            ((INode) item).populateActions(authService);
-            // populate tabs
-            ((INode) item).populateTabs(authService);
-            // update additional data
-            ((INode) item).updateNodeData();
-            treeModel.add(item);
-        });
-        return treeModel;
-    }
-
-    private static class RepoComparator implements Comparator<RepoBaseDescriptor> {
-        @Override
-        public int compare(RepoBaseDescriptor descriptor1, RepoBaseDescriptor descriptor2) {
-
-            //Local repositories can be either ordinary or caches
-            if (descriptor1 instanceof LocalRepoDescriptor) {
-                boolean repo1IsCache = ((LocalRepoDescriptor) descriptor1).isCache();
-                boolean repo2IsCache = ((LocalRepoDescriptor) descriptor2).isCache();
-
-                //Cache repositories should appear in a higher priority
-                if (repo1IsCache && !repo2IsCache) {
-                    return 1;
-                } else if (!repo1IsCache && repo2IsCache) {
-                    return -1;
-                }
-            }
-            return descriptor1.getKey().compareTo(descriptor2.getKey());
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/VirtualRemoteFileNode.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/VirtualRemoteFileNode.java
deleted file mode 100644
index d130e10..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/VirtualRemoteFileNode.java
+++ /dev/null
@@ -1,165 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.nodes;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.BaseBrowsableItem;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-import org.artifactory.rest.common.model.artifact.IAction;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.IArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.VirtualRemoteFileGeneralArtifactInfo;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at JsonTypeName("virtualRemoteFile")
-public class VirtualRemoteFileNode extends BaseNode {
-
-    private FileInfo fileInfo;
-    private String type = "virtualRemoteFile";
-    private String mimeType;
-    private BaseBrowsableItem browsableItem;
-    private boolean cached;
-
-    VirtualRemoteFileNode() {
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public VirtualRemoteFileNode(BaseBrowsableItem fileInfo, String text, String repoType) {
-        super(fileInfo.getRepoPath());
-        initFileNode(fileInfo, text, repoType);
-        AuthorizationService authorizationService = ContextHelper.get().getAuthorizationService();
-        populateActions(authorizationService);
-        populateTabs(authorizationService);
-    }
-
-    /**
-     * init virtual remote file node
-     *
-     * @param fileInfo - file item
-     * @param text     - file text
-     * @param repoType - repository type
-     */
-    private void initFileNode(BaseBrowsableItem fileInfo, String text, String repoType) {
-        setLocal(false);
-        setRepoType(repoType);
-        super.setText(text);
-        browsableItem = fileInfo;
-        cached = !fileInfo.isRemote();
-    }
-
-    @Override
-    public void populateTabs(AuthorizationService authorizationService) {
-        List<IArtifactInfo> tabs = new ArrayList<>();
-        addVirtualRemoteGeneralTab(tabs);
-        super.setTabs(tabs);
-    }
-
-    /**
-     * add virtual remote general tab info
-     *
-     * @param tabs
-     */
-    private void addVirtualRemoteGeneralTab(List<IArtifactInfo> tabs) {
-        VirtualRemoteFileGeneralArtifactInfo general = new VirtualRemoteFileGeneralArtifactInfo("General");
-        general.populateVirtualRemoteFileInfo(browsableItem);
-        tabs.add(general);
-    }
-
-    @Override
-    public void populateActions(AuthorizationService authService) {
-        List<IAction> actions = new ArrayList<>();
-        // add actions
-        addDownloadAction(actions);
-        setActions(actions);
-    }
-
-    /**
-     * add download actions
-     *
-     * @param actions - actions list
-     */
-    private void addDownloadAction(List<IAction> actions) {
-        actions.add(new BaseArtifact("Download"));
-    }
-
-
-    @Override
-    protected RepoPath fetchRepoPath() {
-        return fileInfo.getRepoPath();
-    }
-
-    public String getMimeType() {
-        return mimeType;
-    }
-
-    public void setMimeType(String mimeType) {
-        this.mimeType = mimeType;
-    }
-
-
-    @Override
-    public List<? extends RestTreeNode> getChildren(AuthorizationService authService, boolean isCompact,
-            ArtifactoryRestRequest request) {
-        List<INode> childNodeList = new ArrayList<>();
-        childNodeList.add(this);
-        return childNodeList;
-    }
-
-
-    @Override
-    public void updateNodeData() {
-        mimeType = NamingUtils.getMimeType(this.getPath()).getType();
-    }
-
-    protected void updateHasChild(boolean hasChild) {
-        super.setHasChild(hasChild);
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-
-    @Override
-    public List<RestModel> fetchItemTypeData(AuthorizationService authService, boolean isCompact, Properties props,
-            ArtifactoryRestRequest request) {
-        Collection<? extends RestTreeNode> items = getChildren(authService, isCompact, request);
-        List<RestModel> treeModel = new ArrayList<>();
-        items.forEach(item -> {
-            ((INode) item).populateActions(authService);
-            // populate tabs
-            ((INode) item).populateTabs(authService);
-            // update additional data
-            ((INode) item).updateNodeData();
-            treeModel.add(item);
-        });
-        return treeModel;
-    }
-
-    public boolean isCached() {
-        return cached;
-    }
-
-    public void setCached(boolean cached) {
-        this.cached = cached;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/VirtualRemoteFolderNode.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/VirtualRemoteFolderNode.java
deleted file mode 100644
index b32a8fc..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/VirtualRemoteFolderNode.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.nodes;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.BaseBrowsableItem;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.model.artifact.IAction;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.RefreshArtifact;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.IArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.VirtualRemoteFolderGeneralArtifactInfo;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at JsonTypeName("virtualRemoteFolder")
-public class VirtualRemoteFolderNode extends BaseNode {
-
-    private FolderInfo folderInfo;
-    private String type = "virtualRemoteFolder";
-    private boolean compacted;
-    private BaseBrowsableItem pathItem;
-    private boolean cached;
-
-
-    public String getType() {
-        return type;
-    }
-
-    public void setFolderInfo(FolderInfo folderInfo) {
-        this.folderInfo = folderInfo;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public boolean isCompacted() {
-        return compacted;
-    }
-
-    public FolderInfo fetchFolderInfo() {
-        return this.folderInfo;
-    }
-
-    public void setCompacted(boolean compacted) {
-        this.compacted = compacted;
-    }
-
-    VirtualRemoteFolderNode() {
-    }
-
-    public VirtualRemoteFolderNode(RepoPath repoPath, BaseBrowsableItem pathItem, String text,
-            String repoType) {
-        super(repoPath);
-        initFolderNode(pathItem, text, repoType);
-        AuthorizationService authorizationService = ContextHelper.get().getAuthorizationService();
-        populateActions(authorizationService);
-        populateTabs(authorizationService);
-        cached = !pathItem.isRemote();
-    }
-
-
-    /**
-     * initialize folder node
-     *
-     * @param pathItem - item
-     * @param text     - item text
-     * @param repoType - repository type
-     */
-    private void initFolderNode(BaseBrowsableItem pathItem, String text, String repoType) {
-        this.setLocal(false);
-        setRepoType(repoType);
-        setHasChild(pathItem.isFolder());
-        updateNodeDisplayName(text);
-        this.pathItem = pathItem;
-    }
-
-    /**
-     * update node display name
-     *
-     * @param text - node orig name
-     */
-    private void updateNodeDisplayName(String text) {
-        super.setText(text);
-    }
-
-    @Override
-    public List<? extends RestTreeNode> getChildren(AuthorizationService authService, boolean isCompact,
-            ArtifactoryRestRequest request) {
-        List<INode> childNodeList = new ArrayList<>();
-        childNodeList.add(this);
-        return childNodeList;
-    }
-
-    @Override
-    public void populateActions(AuthorizationService authService) {
-        List<IAction> actions = new ArrayList<>();
-        addRefreshAction(actions);
-        setActions(actions);
-    }
-
-    /**
-     * add refresh action
-     *
-     * @param actions - actions list
-     */
-    private void addRefreshAction(List<IAction> actions) {
-        actions.add(new RefreshArtifact("Refresh"));
-    }
-
-    @Override
-    public void populateTabs(AuthorizationService authService) {
-        List<IArtifactInfo> tabs = new ArrayList<>();
-        VirtualRemoteFolderGeneralArtifactInfo general = new VirtualRemoteFolderGeneralArtifactInfo("General");
-        general.populateGeneralData(pathItem);
-        tabs.add(general);
-        super.setTabs(tabs);
-    }
-
-    @Override
-    protected RepoPath fetchRepoPath() {
-        return folderInfo.getRepoPath();
-    }
-
-
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-
-    @Override
-    public List<RestModel> fetchItemTypeData(AuthorizationService authService, boolean isCompact, Properties props,
-            ArtifactoryRestRequest request) {
-        Collection<? extends RestTreeNode> items = getChildren(authService, isCompact, request);
-        List<RestModel> treeModel = new ArrayList<>();
-        items.forEach(item -> {
-            ((INode) item).populateActions(authService);
-            // populate tabs
-            ((INode) item).populateTabs(authService);
-            // update additional data
-            ((INode) item).updateNodeData();
-            treeModel.add(item);
-        });
-        return treeModel;
-    }
-
-    public boolean isCached() {
-        return cached;
-    }
-
-    public void setCached(boolean cached) {
-        this.cached = cached;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/VirtualRemoteRepositoryNode.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/VirtualRemoteRepositoryNode.java
deleted file mode 100644
index c2838ce..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/VirtualRemoteRepositoryNode.java
+++ /dev/null
@@ -1,205 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.nodes;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.RepoBaseDescriptor;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-import org.artifactory.rest.common.model.artifact.IAction;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.util.JsonUtil;
- import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.RefreshArtifact;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.BaseArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.IArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.VirtualRemoteRepoGeneralArtifactInfo;
-import org.artifactory.ui.utils.RegExUtils;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-import org.codehaus.jackson.annotate.JsonTypeName;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.regex.Matcher;
-
-/**
- * @author Chen  Keinan
- */
- at JsonTypeName("virtualRemoteRepository")
- at JsonIgnoreProperties("repoPath")
-public class VirtualRemoteRepositoryNode extends BaseNode {
-
-    private static final Logger log = LoggerFactory.getLogger(JunctionNode.class);
-    private String type = "virtualRemoteRepository";
-    private RepoType repoPkgType;
-    private RepoBaseDescriptor repoBaseDescriptor;
-    private HttpServletRequest request;
-
-    public VirtualRemoteRepositoryNode(RepoBaseDescriptor repo, String repoType, ArtifactoryRestRequest request) {
-        super(InternalRepoPathFactory.create(repo.getKey(), ""));
-        initRepositoryNode(repo, repoType);
-        AuthorizationService authorizationService = ContextHelper.get().getAuthorizationService();
-        this.repoBaseDescriptor = repo;
-        populateActions(authorizationService);
-        this.request = request.getServletRequest();
-        populateTabs(authorizationService);
-    }
-
-    /**
-     * initialize repository node
-     *
-     * @param repo     - repository descriptor
-     * @param repoType - repo type
-     */
-    private void initRepositoryNode(RepoBaseDescriptor repo, String repoType) {
-        setRepoType(repoType);
-        RepoPath repoPath = InternalRepoPathFactory.create(repo.getKey(), "");
-        super.setText(repoPath.getRepoKey());
-        setLocal(false);
-        setHasChild(true);
-        repoPkgType = repo.getType();
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    @Override
-    public Collection<? extends RestTreeNode> getChildren(AuthorizationService authService, boolean isCompact,
-            ArtifactoryRestRequest request) {
-        List<INode> childNodeList = new ArrayList<>();
-        childNodeList.add(this);
-        return childNodeList;
-    }
-
-    @Override
-    public void populateActions(AuthorizationService authService) {
-        List<IAction> actions = new ArrayList<>();
-        boolean admin = authService.isAdmin();
-        addRefreshAction(actions);
-        addVirtualZapCaches(actions, admin);
-        addRecalculateIndexAction(actions, admin);
-        setActions(actions);
-    }
-
-    /**
-     * add refresh action
-     *
-     * @param actions - actions list
-     */
-    private void addRefreshAction(List<IAction> actions) {
-        actions.add(new RefreshArtifact("Refresh"));
-    }
-
-    /**
-     * add recalculate index for remote/virtual repositories
-     *
-     * @param actions - actions list
-     */
-    private void addRecalculateIndexAction(List<IAction> actions, boolean isAdmin) {
-        if (isAdmin) {
-            if (RegExUtils.REMOTE_REPO_REINDEX_PATTERN.matcher(this.repoPkgType.name()).matches()
-                    && getRepoType().equals("remote")) {
-                actions.add(new BaseArtifact("RecalculateIndex"));
-            } else {
-                Matcher matcher = RegExUtils.VIRTUAL_REPO_REINDEX_PATTERN.matcher(this.repoPkgType.name());
-                boolean foundMatch = matcher.matches();
-                if (foundMatch && getRepoType().equals("virtual")) {
-                    actions.add(new BaseArtifact("RecalculateIndex"));
-                }
-            }
-        }
-    }
-
-    /**
-     * add zap caches action to virtual
-     *
-     * @param actions - actions list
-     * @param isAdmin - if true use is admin
-     */
-    private void addVirtualZapCaches(List<IAction> actions, boolean isAdmin) {
-        if (isAdmin) {
-            if (getRepoType().equals("virtual")) {
-                actions.add(new BaseArtifact("ZapCaches"));
-            }
-        }
-    }
-
-    @Override
-    public void populateTabs(AuthorizationService authService) {
-        List<IArtifactInfo> tabs = new ArrayList<>();
-        BaseArtifactInfo general = addGeneralArtifactInfo();
-        tabs.add(general);
-        super.setTabs(tabs);
-    }
-
-    /**
-     * addd general tab for remote and virtual repo
-     *
-     * @return
-     */
-    private BaseArtifactInfo addGeneralArtifactInfo() {
-        VirtualRemoteRepoGeneralArtifactInfo general = new VirtualRemoteRepoGeneralArtifactInfo("General");
-        general.setPath(getPath());
-        general.setRepoKey(getRepoKey());
-        general.populateGeneralData(repoBaseDescriptor, request);
-        return general;
-    }
-
-
-    @Override
-    protected RepoPath fetchRepoPath() {
-        return super.getRepoPath();
-    }
-
-
-    @Override
-    public Collection<? extends RestModel> fetchItemTypeData(AuthorizationService authService, boolean isCompact,
-            Properties props, ArtifactoryRestRequest request) {
-        // get repository or folder children 1st depth
-        return getRepoOrFolderChildren(authService, isCompact, request);
-    }
-
-    /**
-     * get repository or folder children
-     *
-     * @param authService - authorization service
-     * @param isCompact   - is compacted
-     * @param request
-     * @return
-     */
-    private Collection<? extends RestModel> getRepoOrFolderChildren(AuthorizationService authService,
-            boolean isCompact, ArtifactoryRestRequest request) {
-        Collection<? extends RestTreeNode> items = getChildren(authService, isCompact, request);
-        List<RestModel> treeModel = new ArrayList<>();
-        items.forEach(item -> {
-            // update additional data
-            ((INode) item).updateNodeData();
-            treeModel.add(item);
-        });
-        return treeModel;
-    }
-
-    public RepoType getRepoPkgType() {
-        return repoPkgType;
-    }
-
-    public void setRepoPkgType(RepoType repoPkgType) {
-        this.repoPkgType = repoPkgType;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/ZipFileNode.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/ZipFileNode.java
deleted file mode 100644
index 0fe451f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/ZipFileNode.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.nodes;
-
-import org.artifactory.fs.FileInfo;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-/**
- * @author Chen Keinan
- */
- at JsonTypeName("archive")
-public class ZipFileNode extends FileNode {
-    private String type;
-
-    public ZipFileNode() {
-    }
-
-    public ZipFileNode(FileInfo fileInfo,String text) {
-        super(fileInfo,text);
-        setRepoType("local");
-    }
-
-    @Override
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    @Override
-    public String getType() {
-        return "archive";
-    }
-
-    @Override
-    public void updateNodeData() {
-        if (isLocal()) {
-            super.updateNodeData();
-            super.updateHasChild(true);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/archive/ArchiveEntriesTree.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/archive/ArchiveEntriesTree.java
deleted file mode 100644
index 13abc33..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/archive/ArchiveEntriesTree.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.nodes.archive;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.fs.ZipEntryInfo;
-import org.artifactory.rest.common.model.RestModel;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
-public class ArchiveEntriesTree  {
-
-    ArchiveTreeNode root;
-
-    public ArchiveEntriesTree() {
-        this.root = new ArchiveTreeNode("", true, "root", "");
-    }
-
-    Map<String,ArchiveTreeNode> treeNodeMap = new HashMap<>();
-
-    public RestModel getRoot() {
-        return root;
-    }
-
-    public void insert(ZipEntryInfo entry, String repoKey, String archivePath) {
-        String[] pathElements = entry.getPath().split("/");
-        ArchiveTreeNode parent = root;
-        // get or create parent nodes
-        StringBuilder pathBuilder = new StringBuilder();
-        // iterate and create node parent folder if not exist already
-        for (int i = 0; i < pathElements.length - 1; i++) {
-            pathBuilder.append(pathElements[i] + "/");
-            parent = addNode(parent, pathElements[i], true, pathBuilder.toString(), archivePath, repoKey, entry);
-        }
-        // create node for current entry
-        addNode(parent, pathElements[pathElements.length - 1],
-                entry.isDirectory(), entry.getPath(), archivePath, repoKey, entry);
-    }
-
-    /**
-     * get parent child from map or create new child if needed
-     * @param parent - node parent
-     * @param pathElement - node path
-     * @param directory - if true is a directory
-     * @param fullPath - node full path
-     * @param archivePath - archive path
-     * @param repoKey - repository key
-     * @param entry - entry
-     * @return
-     */
-    private ArchiveTreeNode addNode(ArchiveTreeNode parent, String pathElement,
-            boolean directory, String fullPath, String archivePath, String repoKey, ZipEntryInfo entry) {
-        // get child/ parent ref in map
-        ArchiveTreeNode child = treeNodeMap.get(fullPath);
-        if (child == null) {
-            // create new child
-            String path = StringUtils.isNotBlank(parent.getTempPath()) ?
-                    parent.getTempPath() + "/" + pathElement : pathElement;
-            child = new ArchiveTreeNode(path, directory, pathElement, archivePath);
-            child.setRepoKey(repoKey);
-            child.setZipEntry(entry);
-            parent.addChild(child);
-            treeNodeMap.put(fullPath, child);
-        }
-        return child;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/archive/ArchiveTreeNode.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/archive/ArchiveTreeNode.java
deleted file mode 100644
index f8c96e4..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/nodes/archive/ArchiveTreeNode.java
+++ /dev/null
@@ -1,239 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.nodes.archive;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.OssAddonsManager;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.fs.ZipEntryInfo;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.model.artifact.IAction;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.DownloadArtifact;
- import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.BaseArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.IArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.GeneralArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.info.ArchiveInfo;
-import org.artifactory.util.PathUtils;
-import org.artifactory.util.TreeNode;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonProperty;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
-
-/**
- * @author Chen Keinan
- */
-public class ArchiveTreeNode implements Serializable, Comparable<ArchiveTreeNode>, RestModel {
-    private String tempPath;
-    private boolean directory;
-    private ZipEntryInfo zipEntry;
-    private Set<RestModel> children;
-    private String name;
-    private String text;
-    private String repoKey;
-    private String archivePath;
-    private String downloadPath;
-    private String path;
-    private String mimeType;
-
-    @JsonIgnore
-    public boolean isDirectory() {
-        return directory;
-    }
-
-    public void setZipEntry(ZipEntryInfo zipEntry) {
-        this.zipEntry = zipEntry;
-    }
-
-    public ArchiveTreeNode(String entryPath, boolean directory, String text, String archive) {
-        this.tempPath = entryPath;
-        this.archivePath = archive;
-        this.directory=directory;
-        name = PathUtils.getFileName(entryPath);
-        this.text = text;
-    }
-
-    public String getText() {
-        return text;
-    }
-
-    public String getPath() {
-        if ((!zipEntry.isDirectory() && !isDirectory())
-                || (zipEntry.isDirectory() && isDirectory())) {
-            return archivePath + "/" + zipEntry.getPath();
-        } else {
-            return archivePath + "/" + tempPath;
-        }
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    public String getDownloadPath() {
-        if (!hasChildren()) {
-            return archivePath + "!" + "/" + zipEntry.getPath();
-        } else {
-            return null;
-        }
-    }
-
-    public void setDownloadPath(String downloadPath) {
-        this.downloadPath = downloadPath;
-    }
-
-    public void setText(String text) {
-        this.text = text;
-    }
-
-     @JsonIgnore
-    public ZipEntryInfo getData() {
-        return zipEntry;    }
-
-    public List<IArtifactInfo> getTabs(){
-        GeneralArtifactInfo artifactInfo = new GeneralArtifactInfo("General");
-        ArchiveInfo archiveInfo = new ArchiveInfo(zipEntry, this);
-        artifactInfo.setInfo(archiveInfo);
-        List<IArtifactInfo> archiveInfoList =  new ArrayList<>();
-        archiveInfoList.add(artifactInfo);
-        if (NamingUtils.isViewable(getTempPath()) || "class".equals(PathUtils.getExtension(getTempPath()))) {
-            archiveInfoList.add(new BaseArtifactInfo("ViewSource"));
-        }
-        return archiveInfoList;
-    }
-
-    public String getType() {
-        return isDirectory() ? "folder" : "file";
-    }
-
-    public List<IAction> getActions(){
-        List<IAction> actions = null;
-        if (!isDirectory()) {
-            actions = new ArrayList<>();
-            AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-            if (!(addonsManager instanceof OssAddonsManager)) {
-                actions.add(new DownloadArtifact("Download"));
-            }
-        }
-        return actions;
-    }
-
-    public Set<RestModel> getChildren() {
-        return children;
-    }
-
-    public void setChildren(
-            Set<RestModel> children) {
-        this.children = children;
-    }
-
-    public String getArchivePath() {
-        return archivePath;
-    }
-
-    public void setArchivePath(String archivePath) {
-        this.archivePath = archivePath;
-    }
-
-    public boolean hasChildren() {
-       return children != null && !children.isEmpty();
-    }
-
-     @JsonProperty("folder")
-    public boolean isLeaf() {
-        return hasChildren();
-    }
-
-     public TreeNode<ZipEntryInfo> getChild(ZipEntryInfo data) {
-        return null;
-    }
-
-    @JsonIgnore
-    public String getTempPath() {
-        return tempPath;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-
-        ArchiveTreeNode that = (ArchiveTreeNode) o;
-
-        if (!zipEntry.equals(that.zipEntry)) {
-            return false;
-        }
-        return true;
-    }
-
-    public String getMimeType() {
-        if (NamingUtils.isViewable(getTempPath()) || "class".equals(PathUtils.getExtension(getTempPath()))) {
-            return NamingUtils.getMimeType(getTempPath()).getType();
-        } else {
-            return null;
-        }
-    }
-
-    public void setMimeType(String mimeType) {
-        this.mimeType = mimeType;
-    }
-
-    RestModel getChild(String relativePath) {
-        if (children != null) {
-            for (RestModel child : children) {
-                if (((ArchiveTreeNode)child).getName().equals(relativePath)) {
-                    return child;
-                }
-            }
-        }
-        return null;
-    }
-
-    public void addChild(RestModel child) {
-        if (!directory) {
-            throw new IllegalStateException("Cannot add children to a leaf node");
-        }
-        if (children == null) {
-            children = new TreeSet<>();
-        }
-        children.add(child);
-    }
-    private String getName(){
-        return name;
-    }
-    @Override
-    public int hashCode() {
-        return zipEntry.hashCode();
-    }
-
-    @Override
-    public int compareTo(ArchiveTreeNode o) {
-        if (o.isDirectory() && !isDirectory()) {
-            return 1;
-        }
-        if (!o.isDirectory() && isDirectory()) {
-            return -1;
-        }
-        return getName().compareTo(o.getName());
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/BaseArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/BaseArtifactInfo.java
deleted file mode 100644
index ff4b6bd..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/BaseArtifactInfo.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Chen Keinan
- */
-public class BaseArtifactInfo extends BaseModel implements IArtifactInfo {
-
-    private String name;
-    private String repoKey;
-    private String path;
-
-    public BaseArtifactInfo(String name){
-        this.name = name;
-    }
-
-    public BaseArtifactInfo(){}
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    public void clearRepoData() {
-        this.repoKey = null;
-        this.path = null;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/GeneralXmlArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/GeneralXmlArtifactInfo.java
deleted file mode 100644
index 0057e3b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/GeneralXmlArtifactInfo.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs;
-
-/**
- * @author Chen Keinan
- */
-public class GeneralXmlArtifactInfo extends BaseArtifactInfo {
-
-    public GeneralXmlArtifactInfo(String name) {
-        super(name);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/IArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/IArtifactInfo.java
deleted file mode 100644
index f537607..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/IArtifactInfo.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs;
-
-/**
- * @author Chen Keinan
- */
-public interface IArtifactInfo {
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/IvyXmlArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/IvyXmlArtifactInfo.java
deleted file mode 100644
index afa4bae..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/IvyXmlArtifactInfo.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs;
-
-/**
- * @author  Chen Keinan
- */
-public class IvyXmlArtifactInfo extends BaseArtifactInfo {
-
-    public IvyXmlArtifactInfo(String name) {
-        super(name);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/JNLPArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/JNLPArtifactInfo.java
deleted file mode 100644
index 7416012..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/JNLPArtifactInfo.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs;
-
-/**
- * @author Chen Keinan
- */
-public class JNLPArtifactInfo extends BaseArtifactInfo {
-
-    public JNLPArtifactInfo(String name) {
-        super(name);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/blackduck/BlackDuckArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/blackduck/BlackDuckArtifactInfo.java
deleted file mode 100644
index 6a2e698..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/blackduck/BlackDuckArtifactInfo.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.blackduck;
-
-import java.util.List;
-
-import org.artifactory.addon.blackduck.BlackDuckVulnerabilities;
-import org.artifactory.addon.blackduck.BlackduckInfo;
-import org.artifactory.addon.blackduck.LicensePair;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.BaseArtifactInfo;
-
-/**
- * @author Chen Keinan
- */
-public class BlackDuckArtifactInfo extends BaseArtifactInfo implements RestModel {
-
-    public BlackDuckArtifactInfo(String name) {
-        super(name);
-    }
-
-    public BlackDuckArtifactInfo() {
-    }
-
-    private String componentId;
-    private String origComponentId;
-    private BlackduckInfo info;
-    private List<LicensePair> license;
-    private List<BlackDuckVulnerabilities> vulnerabilities;
-
-    public BlackduckInfo getInfo() {
-        return info;
-    }
-
-    public void setInfo(BlackduckInfo info) {
-        this.info = info;
-    }
-
-    public List<LicensePair> getLicense() {
-        return license;
-    }
-
-    public void setLicense(List<LicensePair> license) {
-        this.license = license;
-    }
-
-    public List<BlackDuckVulnerabilities> getVulnerabilities() {
-        return vulnerabilities;
-    }
-
-    public void setVulnerabilities(List<BlackDuckVulnerabilities> vulnerabilities) {
-        this.vulnerabilities = vulnerabilities;
-    }
-
-    public String getComponentId() {
-        return componentId;
-    }
-
-    public void setComponentId(String componentId) {
-        this.componentId = componentId;
-    }
-
-    public String getOrigComponentId() {
-        return origComponentId;
-    }
-
-    public void setOrigComponentId(String origComponentId) {
-        this.origComponentId = origComponentId;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/bower/BowerArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/bower/BowerArtifactInfo.java
deleted file mode 100644
index 429adf7..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/bower/BowerArtifactInfo.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.bower;
-
-import org.artifactory.addon.bower.BowerDependencies;
-import org.artifactory.addon.bower.BowerMetadataInfo;
-import org.artifactory.addon.bower.BowerPkgInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.BaseArtifactInfo;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class BowerArtifactInfo extends BaseArtifactInfo {
-    private BowerPkgInfo bowerPkgInfo;
-    private List<BowerDependencies> bowerDependencies;
-    private List<String> mainFiles;
-    private List<String> ignoredFiles;
-
-    BowerArtifactInfo() {
-    }
-
-    public BowerArtifactInfo(BowerMetadataInfo bowerMetadataInfo) {
-        this.bowerPkgInfo = bowerMetadataInfo.getBowerPkgInfo();
-        this.bowerDependencies = bowerMetadataInfo.getBowerDependencies();
-        this.mainFiles = bowerMetadataInfo.getMainFiles();
-        this.ignoredFiles = bowerMetadataInfo.getIgnoredFiles();
-    }
-
-    public BowerPkgInfo getBowerPkgInfo() {
-        return bowerPkgInfo;
-    }
-
-    public void setBowerPkgInfo(BowerPkgInfo bowerPkgInfo) {
-        this.bowerPkgInfo = bowerPkgInfo;
-    }
-
-    public List<BowerDependencies> getBowerDependencies() {
-        return bowerDependencies;
-    }
-
-    public void setBowerDependencies(List<BowerDependencies> bowerDependencies) {
-        this.bowerDependencies = bowerDependencies;
-    }
-
-    public List<String> getMainFiles() {
-        return mainFiles;
-    }
-
-    public void setMainFiles(List<String> mainFiles) {
-        this.mainFiles = mainFiles;
-    }
-
-    public List<String> getIgnoredFiles() {
-        return ignoredFiles;
-    }
-
-    public void setIgnoredFiles(List<String> ignoredFiles) {
-        this.ignoredFiles = ignoredFiles;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/builds/BuildJsonInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/builds/BuildJsonInfo.java
deleted file mode 100644
index b9cb6d6..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/builds/BuildJsonInfo.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.builds;
-
-import org.artifactory.rest.common.model.FileModel;
-import org.artifactory.rest.common.model.RestModel;
-
-/**
- * @author chen Keinan
- */
-public class BuildJsonInfo implements RestModel, FileModel {
-
-    private String buildJson;
-
-    public BuildJsonInfo(String buildJson){
-        this.buildJson = buildJson;
-    }
-
-    @Override
-    public Object getFileResource() {
-        return buildJson;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/builds/BuildsArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/builds/BuildsArtifactInfo.java
deleted file mode 100644
index 37ba6bf..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/builds/BuildsArtifactInfo.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.builds;
-
-import java.util.List;
-
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.BaseArtifactInfo;
-
-/**
- * @author Chen Keinan
- */
-public class BuildsArtifactInfo extends BaseArtifactInfo implements RestModel {
-
-    private List<ProduceBy> producedBy;
-    private List<UsedBy> usedBy;
-
-    public BuildsArtifactInfo() {
-    }
-
-    public BuildsArtifactInfo(String name) {
-        super(name);
-    }
-    public BuildsArtifactInfo(List<ProduceBy> produceByRows ,List<UsedBy> usedByRows) {
-        this.producedBy = produceByRows;
-        this.usedBy = usedByRows;
-    }
-    public List<ProduceBy> getProducedBy() {
-            return producedBy;
-        }
-
-    public void setProducedBy(List<ProduceBy> producedBy) {
-        this.producedBy = producedBy;
-    }
-
-    public List<UsedBy> getUsedBy() {
-        return usedBy;
-    }
-
-    public void setUsedBy(List<UsedBy> usedBy) {
-        this.usedBy = usedBy;
-    }
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/builds/ProduceBy.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/builds/ProduceBy.java
deleted file mode 100644
index ece27b0..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/builds/ProduceBy.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.builds;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.build.BuildRun;
-
-/**
- * @author Chen Keinan
- */
-public class ProduceBy {
-
-    private String name;
-    private String number;
-    private long started;
-    private String startedString;
-    private String ciUrl;
-    private String releaseStatus;
-    private String moduleID;
-
-    public ProduceBy(BuildRun artifactBuild, String module) {
-        if (artifactBuild != null) {
-            this.name = artifactBuild.getName();
-            this.number = artifactBuild.getNumber();
-            this.started = artifactBuild.getStartedDate().getTime();
-            this.startedString = ContextHelper.get().getCentralConfig().format(this.started);
-            this.ciUrl = artifactBuild.getCiUrl();
-            this.releaseStatus = artifactBuild.getReleaseStatus();
-            this.moduleID = module;
-        }
-    }
-
-    public ProduceBy() {
-    }
-
-    public String getModuleID() {
-        return moduleID;
-    }
-
-    public void setModuleID(String module) {
-        this.moduleID = module;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getNumber() {
-        return number;
-    }
-
-    public void setNumber(String number) {
-        this.number = number;
-    }
-
-    public long getStarted() {
-        return started;
-    }
-
-    public void setStarted(long started) {
-        this.started = started;
-    }
-
-    public String getStartedString() {
-        return startedString;
-    }
-
-    public void setStartedString(String startedString) {
-        this.startedString = startedString;
-    }
-
-    public String getCiUrl() {
-        return ciUrl;
-    }
-
-    public void setCiUrl(String ciUrl) {
-        this.ciUrl = ciUrl;
-    }
-
-    public String getReleaseStatus() {
-        return releaseStatus;
-    }
-
-    public void setReleaseStatus(String releaseStatus) {
-        this.releaseStatus = releaseStatus;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/builds/UsedBy.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/builds/UsedBy.java
deleted file mode 100644
index 9c91025..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/builds/UsedBy.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.builds;
-
-import org.artifactory.build.BuildRun;
-/**
- * @author Chen Keinan
- */
-public class UsedBy {
-
-    private String name;
-    private String number;
-    private String ciUrl;
-    private String releaseStatus;
-    private String moduleID;
-    private String scope;
-    private String started;
-
-    public UsedBy(BuildRun dependencyBuild,String moduleID,String scope) {
-        if (dependencyBuild != null){
-            this.name = dependencyBuild.getName();
-            this.number = dependencyBuild.getNumber();
-             this.ciUrl = dependencyBuild.getCiUrl();
-            this.releaseStatus = dependencyBuild.getReleaseStatus();
-            this.moduleID = moduleID;
-            this.scope = scope;
-            this.started= new Long(dependencyBuild.getStartedDate().getTime()).toString();
-        }
-    }
-
-    public UsedBy() {
-    }
-
-
-    public String getStarted() {
-        return started;
-    }
-
-    public void setStarted(String started) {
-        this.started = started;
-    }
-
-    public String getScope() {
-        return scope;
-    }
-
-    public void setScope(String scope) {
-        this.scope = scope;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getNumber() {
-        return number;
-    }
-
-    public void setNumber(String number) {
-        this.number = number;
-    }
-
-    public String getCiUrl() {
-        return ciUrl;
-    }
-
-    public void setCiUrl(String ciUrl) {
-        this.ciUrl = ciUrl;
-    }
-
-    public String getReleaseStatus() {
-        return releaseStatus;
-    }
-
-    public void setReleaseStatus(String releaseStatus) {
-        this.releaseStatus = releaseStatus;
-    }
-
-    public String getModuleID() {
-        return moduleID;
-    }
-
-    public void setModuleID(String moduleID) {
-        this.moduleID = moduleID;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/docker/DockerArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/docker/DockerArtifactInfo.java
deleted file mode 100644
index 52a8ba7..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/docker/DockerArtifactInfo.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.docker;
-
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.BaseArtifactInfo;
-
-/**
- * @author Chen Keinan
- */
-public class DockerArtifactInfo extends BaseArtifactInfo {
-
-    private DockerInfoModel dockerInfo;
-    private DockerConfig dockerConfig;
-
-    public DockerInfoModel getDockerInfo() {
-        return dockerInfo;
-    }
-
-    public void setDockerInfo(DockerInfoModel dockerInfo) {
-        this.dockerInfo = dockerInfo;
-    }
-
-    public DockerConfig getDockerConfig() {
-        return dockerConfig;
-    }
-
-    public void setDockerConfig(
-            DockerConfig dockerConfig) {
-        this.dockerConfig = dockerConfig;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/docker/DockerConfig.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/docker/DockerConfig.java
deleted file mode 100644
index 8c9877a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/docker/DockerConfig.java
+++ /dev/null
@@ -1,217 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.docker;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class DockerConfig {
-
-    private String hostname;
-    private String domainName;
-    private String user;
-    private String memory;
-    private String memorySwap;
-    private String cpuShares;
-    private String cpuSet;
-    private String attachStdin;
-    private boolean attachStdout;
-    private String attachStderr;
-    private String portSpecs;
-    private String exposedPorts;
-    private String tty;
-    private String openStdin;
-    private String stdinOnce;
-    private String env;
-    private String cmd;
-    private String image;
-    private String volumes;
-    private String workingDir;
-    private List<String> entryPoint;
-    private String networkDisabled;
-    private String onBuild;
-
-    public String getHostname() {
-        return hostname;
-    }
-
-    public void setHostname(String hostname) {
-        this.hostname = hostname;
-    }
-
-    public String getDomainName() {
-        return domainName;
-    }
-
-    public void setDomainName(String domainName) {
-        this.domainName = domainName;
-    }
-
-    public String getUser() {
-        return user;
-    }
-
-    public void setUser(String user) {
-        this.user = user;
-    }
-
-    public String getMemory() {
-        return memory;
-    }
-
-    public void setMemory(String memory) {
-        this.memory = memory;
-    }
-
-    public String getMemorySwap() {
-        return memorySwap;
-    }
-
-    public void setMemorySwap(String memorySwap) {
-        this.memorySwap = memorySwap;
-    }
-
-    public String getVolumes() {
-        return volumes;
-    }
-
-    public String getCpuShares() {
-        return cpuShares;
-    }
-
-    public void setCpuShares(String cpuShares) {
-        this.cpuShares = cpuShares;
-    }
-
-    public String getCpuSet() {
-        return cpuSet;
-    }
-
-    public void setCpuSet(String cpuSet) {
-        this.cpuSet = cpuSet;
-    }
-
-    public String getAttachStdin() {
-        return attachStdin;
-    }
-
-    public void setAttachStdin(String attachStdin) {
-        this.attachStdin = attachStdin;
-    }
-
-    public String getAttachStderr() {
-        return attachStderr;
-    }
-
-    public void setAttachStderr(String attachStderr) {
-        this.attachStderr = attachStderr;
-    }
-
-    public boolean isAttachStdout() {
-        return attachStdout;
-    }
-
-    public void setAttachStdout(boolean attachStdout) {
-        this.attachStdout = attachStdout;
-    }
-
-    public String getPortSpecs() {
-        return portSpecs;
-    }
-
-    public void setPortSpecs(String portSpecs) {
-        this.portSpecs = portSpecs;
-    }
-
-    public String getExposedPorts() {
-        return exposedPorts;
-    }
-
-    public void setExposedPorts(String exposedPorts) {
-        this.exposedPorts = exposedPorts;
-    }
-
-    public void setVolumes(String volumes) {
-        this.volumes = volumes;
-    }
-
-    public String getTty() {
-        return tty;
-    }
-
-    public void setTty(String tty) {
-        this.tty = tty;
-    }
-
-    public String getOpenStdin() {
-        return openStdin;
-    }
-
-    public void setOpenStdin(String openStdin) {
-        this.openStdin = openStdin;
-    }
-
-    public String getStdinOnce() {
-        return stdinOnce;
-    }
-
-    public void setStdinOnce(String stdinOnce) {
-        this.stdinOnce = stdinOnce;
-    }
-
-    public String getEnv() {
-        return env;
-    }
-
-    public void setEnv(String env) {
-        this.env = env;
-    }
-
-    public String getCmd() {
-        return cmd;
-    }
-
-    public void setCmd(String cmd) {
-        this.cmd = cmd;
-    }
-
-    public String getImage() {
-        return image;
-    }
-
-    public void setImage(String image) {
-        this.image = image;
-    }
-
-    public String getWorkingDir() {
-        return workingDir;
-    }
-
-    public void setWorkingDir(String workingDir) {
-        this.workingDir = workingDir;
-    }
-
-    public List<String> getEntryPoint() {
-        return entryPoint;
-    }
-
-    public void setEntryPoint(List<String> entryPoint) {
-        this.entryPoint = entryPoint;
-    }
-
-    public String getNetworkDisabled() {
-        return networkDisabled;
-    }
-
-    public void setNetworkDisabled(String networkDisabled) {
-        this.networkDisabled = networkDisabled;
-    }
-
-    public String getOnBuild() {
-        return onBuild;
-    }
-
-    public void setOnBuild(String onBuild) {
-        this.onBuild = onBuild;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/docker/DockerInfoModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/docker/DockerInfoModel.java
deleted file mode 100644
index 726cb7e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/docker/DockerInfoModel.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.docker;
-
-/**
- * @author Chen Keinan
- */
-public class DockerInfoModel {
-
-    private String imageId;
-    private String imageIdPath;
-    private String parent;
-    private String parentIdPath;
-    private String created;
-    private String container;
-    private String dockerVersion;
-    private String author;
-    private String architecture;
-    private String os;
-    private String size;
-
-    public String getImageId() {
-
-        return imageId;
-    }
-
-    public void setImageId(String imageId) {
-        this.imageId = imageId;
-    }
-
-    public String getParent() {
-        return parent;
-    }
-
-    public void setParent(String parent) {
-        this.parent = parent;
-    }
-
-    public String getCreated() {
-        return created;
-    }
-
-    public void setCreated(String created) {
-        this.created = created;
-    }
-
-    public String getContainer() {
-        return container;
-    }
-
-    public void setContainer(String container) {
-        this.container = container;
-    }
-
-    public String getDockerVersion() {
-        return dockerVersion;
-    }
-
-    public void setDockerVersion(String dockerVersion) {
-        this.dockerVersion = dockerVersion;
-    }
-
-    public String getAuthor() {
-        return author;
-    }
-
-    public void setAuthor(String author) {
-        this.author = author;
-    }
-
-    public String getArchitecture() {
-        return architecture;
-    }
-
-    public void setArchitecture(String architecture) {
-        this.architecture = architecture;
-    }
-
-    public String getOs() {
-        return os;
-    }
-
-    public void setOs(String os) {
-        this.os = os;
-    }
-
-    public String getSize() {
-        return size;
-    }
-
-    public void setSize(String size) {
-        this.size = size;
-    }
-
-    public String getImageIdPath() {
-        return imageIdPath;
-    }
-
-    public void setImageIdPath(String imageIdPath) {
-        this.imageIdPath = imageIdPath;
-    }
-
-    public String getParentIdPath() {
-        return parentIdPath;
-    }
-
-    public void setParentIdPath(String parentIdPath) {
-        this.parentIdPath = parentIdPath;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/docker/DockerMetadata.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/docker/DockerMetadata.java
deleted file mode 100644
index 5730363..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/docker/DockerMetadata.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.docker;
-
-import org.codehaus.jackson.JsonNode;
-import org.codehaus.jackson.annotate.JsonProperty;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class DockerMetadata {
-
-    @JsonProperty("id")
-    public String id;
-    @JsonProperty("parent")
-    public String parent;
-    @JsonProperty("created")
-    public String created;
-    @JsonProperty("container")
-    public String container;
-    @JsonProperty("docker_version")
-    public String dockerVersion;
-    @JsonProperty("author")
-    public String author;
-    @JsonProperty("config")
-    public Config config;
-    @JsonProperty("architecture")
-    public String architecture;
-    @JsonProperty("os")
-    public String os;
-    @JsonProperty("Size")
-    public long size;
-
-    public static class Config implements Serializable {
-        @JsonProperty("Hostname")
-        public String hostname;
-        @JsonProperty("Domainname")
-        public String domainname;
-        @JsonProperty("User")
-        public String user;
-        @JsonProperty("Memory")
-        public long memory;
-        @JsonProperty("MemorySwap")
-        public long memorySwap;
-        @JsonProperty("CpuShares")
-        public long cpuShares;
-        @JsonProperty("CpuSet")
-        public String cpuSet;
-        @JsonProperty("AttachStdin")
-        public boolean attachStdin;
-        @JsonProperty("AttachStdout")
-        public boolean attachStdout;
-        @JsonProperty("AttachStderr")
-        public boolean attachStderr;
-        @JsonProperty("PortSpecs")
-        public List<String> portSpecs;
-        @JsonProperty("ExposedPorts")
-        public JsonNode exposedPorts;
-        @JsonProperty("Tty")
-        public boolean tty;
-        @JsonProperty("OpenStdin")
-        public boolean openStdin;
-        @JsonProperty("StdinOnce")
-        public boolean stdinOnce;
-        @JsonProperty("Env")
-        public List<String> env;
-        @JsonProperty("Cmd")
-        public List<String> cmd;
-        @JsonProperty("Image")
-        public String image;
-        @JsonProperty("Volumes")
-        public JsonNode volumes;
-        @JsonProperty("WorkingDir")
-        public String workingDir;
-        @JsonProperty("Entrypoint")
-        public List<String> entrypoint;
-        @JsonProperty("NetworkDisabled")
-        public boolean networkDisabled;
-        @JsonProperty("OnBuild")
-        public List<String> onBuild;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/docker/ancestry/DockerAncestryArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/docker/ancestry/DockerAncestryArtifactInfo.java
deleted file mode 100644
index 69465c1..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/docker/ancestry/DockerAncestryArtifactInfo.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.docker.ancestry;
-
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.BaseArtifactInfo;
-
-public class DockerAncestryArtifactInfo extends BaseArtifactInfo {
-
-    private DockerLinkedImage dockerLinkedImage;
-
-    public DockerLinkedImage getDockerLinkedImage() {
-        return dockerLinkedImage;
-    }
-
-    public void setDockerLinkedImage(
-            DockerLinkedImage dockerLinkedImage) {
-        this.dockerLinkedImage = dockerLinkedImage;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/docker/ancestry/DockerLinkedImage.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/docker/ancestry/DockerLinkedImage.java
deleted file mode 100644
index 6abdfb0..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/docker/ancestry/DockerLinkedImage.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.docker.ancestry;
-
-/**
- * @author Chen Keinan
- */
-public class DockerLinkedImage {
-    private String id;
-    private String size;
-    private DockerLinkedImage child;
-    private String path;
-
-    public DockerLinkedImage(String id, String size, String path) {
-        this.id = id;
-        this.size = size;
-        this.path = path;
-    }
-
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public String getSize() {
-        return size;
-    }
-
-    public void setSize(String size) {
-        this.size = size;
-    }
-
-    public DockerLinkedImage getChild() {
-        return child;
-    }
-
-    public void setChild(
-            DockerLinkedImage child) {
-        this.child = child;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    public void addChild(DockerLinkedImage dockerLinkedImage) {
-        child = dockerLinkedImage;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/gems/GemsArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/gems/GemsArtifactInfo.java
deleted file mode 100644
index 5a39a83..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/gems/GemsArtifactInfo.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.gems;
-
-import org.artifactory.nuget.NuMetaData;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.BaseArtifactInfo;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class GemsArtifactInfo extends BaseArtifactInfo {
-
-    private GemsInfo gemsInfo;
-    private List<GemsDependency> gemsDependencies;
-
-    public GemsArtifactInfo() {
-    }
-
-    public GemsArtifactInfo(NuMetaData nuMetaData) {
-        super.setRepoKey(null);
-        super.setPath(null);
-    }
-
-    public GemsInfo getGemsInfo() {
-        return gemsInfo;
-    }
-
-    public void setGemsInfo(GemsInfo gemsInfo) {
-        this.gemsInfo = gemsInfo;
-    }
-
-    public List<GemsDependency> getGemsDependencies() {
-        return gemsDependencies;
-    }
-
-    public void setGemsDependencies(
-            List<GemsDependency> gemsDependencies) {
-        this.gemsDependencies = gemsDependencies;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/gems/GemsDependency.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/gems/GemsDependency.java
deleted file mode 100644
index d28f7c1..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/gems/GemsDependency.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.gems;
-
-/**
- * @author Chen Keinan
- */
-public class GemsDependency {
-    private String name;
-    private String version;
-    private String type;
-
-    public GemsDependency(String name, String requirements, String type) {
-        this.name = name;
-        this.version = requirements;
-        this.type = type;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/gems/GemsInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/gems/GemsInfo.java
deleted file mode 100644
index a29a65e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/gems/GemsInfo.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.gems;
-
-import org.artifactory.addon.gems.ArtifactGemsInfo;
-
-/**
- * @author Chen Keinan
- */
-public class GemsInfo {
-
-    private String name;
-    private String version;
-    private String platform;
-    private String summary;
-    private String authors;
-    private String homepage;
-    private String repositoryPath;
-    private String description;
-
-    public GemsInfo(ArtifactGemsInfo gemsInfo, String repoKey, String path) {
-        this.version = gemsInfo.getVersion();
-        this.homepage = gemsInfo.getHomepage();
-        this.summary = gemsInfo.getSummary();
-        this.name = gemsInfo.getName();
-        this.platform = gemsInfo.getPlatform();
-        this.authors = gemsInfo.getAuthors();
-        this.description = gemsInfo.getInfo();
-        this.repositoryPath = repoKey + ":" + path;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public String getPlatform() {
-        return platform;
-    }
-
-    public void setPlatform(String platform) {
-        this.platform = platform;
-    }
-
-    public String getSummary() {
-        return summary;
-    }
-
-    public void setSummary(String summary) {
-        this.summary = summary;
-    }
-
-    public String getAuthors() {
-        return authors;
-    }
-
-    public void setAuthors(String authors) {
-        this.authors = authors;
-    }
-
-    public String getHomepage() {
-        return homepage;
-    }
-
-    public void setHomepage(String homepage) {
-        this.homepage = homepage;
-    }
-
-    public String getRepositoryPath() {
-        return repositoryPath;
-    }
-
-    public void setRepositoryPath(String repositoryPath) {
-        this.repositoryPath = repositoryPath;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/ArchiveGeneralArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/ArchiveGeneralArtifactInfo.java
deleted file mode 100644
index 9563911..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/ArchiveGeneralArtifactInfo.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general;
-
-import org.artifactory.rest.common.service.IgnoreSpecialFields;
-import org.codehaus.jackson.annotate.JsonTypeName;
-import org.codehaus.jackson.map.annotate.JsonFilter;
-
-/**
- * @author Chen Keinan
- */
- at JsonTypeName("archive")
- at JsonFilter("exclude fields")
- at IgnoreSpecialFields(value = {"repoKey", "path"})
-public class ArchiveGeneralArtifactInfo extends FileGeneralArtifactInfo {
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/FileGeneralArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/FileGeneralArtifactInfo.java
deleted file mode 100644
index b31787a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/FileGeneralArtifactInfo.java
+++ /dev/null
@@ -1,219 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.CoreAddons;
-import org.artifactory.addon.blackduck.BlackDuckAddon;
-import org.artifactory.api.bintray.BintrayService;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.trash.TrashService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.IgnoreSpecialFields;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.checksums.Checksums;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.dependecydeclaration.DependencyDeclaration;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.info.BaseInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.info.FileInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.trash.TrashItemDetails;
-import org.artifactory.util.HttpUtils;
-import org.codehaus.jackson.annotate.JsonTypeName;
-import org.codehaus.jackson.map.annotate.JsonFilter;
-
-/**
- * @author Chen Keinan
- */
- at JsonTypeName("file")
- at JsonFilter("exclude fields")
- at IgnoreSpecialFields(value = {"repoKey", "path"})
-public class FileGeneralArtifactInfo extends GeneralArtifactInfo implements RestGeneralTab {
-
-    FileGeneralArtifactInfo() {
-    }
-
-    private DependencyDeclaration dependencyDeclaration;
-
-    private Checksums checksums;
-
-    private Boolean blackDuckEnabled;
-
-    private boolean bintrayInfoEnabled;
-
-    private TrashItemDetails trash;
-
-    public FileGeneralArtifactInfo(String name) {
-        super(name);
-    }
-
-    public Checksums getChecksums() {
-        return checksums;
-    }
-
-    public void setChecksums(Checksums checksums) {
-        this.checksums = checksums;
-    }
-
-    public TrashItemDetails getTrash() {
-        return trash;
-    }
-
-    public void setTrash(TrashItemDetails trash) {
-        this.trash = trash;
-    }
-
-    public void setDependencyDeclaration(DependencyDeclaration dependencyDeclaration) {
-        this.dependencyDeclaration = dependencyDeclaration;
-    }
-
-    @Override
-    public void populateGeneralData(ArtifactoryRestRequest artifactoryRestRequest, AuthorizationService authService) {
-        RepoPath repoPath = retrieveRepoPath();
-        CentralConfigService centralConfigService = retrieveCentralConfigService();
-        RepositoryService repoService = retrieveRepoService();
-        ItemInfo itemInfo = retrieveItemInfo(repoPath);
-        LocalRepoDescriptor localRepoDescriptor =
-                repoService.localCachedOrDistributionRepoDescriptorByKey(repoPath.getRepoKey());
-        blackDuckEnabled = ContextHelper.get().beanForType(AddonsManager.class).addonByType(BlackDuckAddon.class)
-                .isEnableIntegration();
-        // populate file info data
-        BaseInfo baseInfo = populateFileInfo(repoService, repoPath, centralConfigService, authService);
-        super.setInfo(baseInfo);
-        markIfBintrayIsEnabled(itemInfo);
-        // update file info checksum
-        updateFileInfoCheckSum((org.artifactory.fs.FileInfo) itemInfo, localRepoDescriptor, authService);
-        if (localRepoDescriptor.getType() != RepoType.Distribution) {
-            // update virtual repositories
-            super.populateVirtualRepositories(HttpUtils.getServletContextUrl(artifactoryRestRequest.getServletRequest()));
-            //update Dependency Declaration
-            updateDependencyDeclaration(artifactoryRestRequest, repoService, itemInfo, localRepoDescriptor);
-            updateTrashDetails(repoPath);
-        }
-    }
-
-    private void updateTrashDetails(RepoPath repoPath) {
-        if (!TrashService.TRASH_KEY.equals(repoPath.getRepoKey())) {
-            return;
-        }
-
-        Properties properties = retrieveRepoService().getProperties(repoPath);
-        if (properties != null) {
-            trash = new TrashItemDetails(properties);
-        }
-    }
-
-    private void markIfBintrayIsEnabled(ItemInfo itemInfo) {
-        boolean hideInfo = ConstantValues.bintrayUIHideInfo.getBoolean();
-        if (hideInfo) {
-            bintrayInfoEnabled = false;
-            return;
-        }
-
-        boolean validFile = isValidFile(itemInfo);
-        if (!validFile) {
-            bintrayInfoEnabled = false;
-            return;
-        }
-
-        boolean offlineMode = retrieveCentralConfigService().getDescriptor().isOfflineMode();
-        if (offlineMode) {
-            bintrayInfoEnabled = false;
-            return;
-        }
-
-        ModuleInfo moduleInfo = retrieveRepoService().getItemModuleInfo(itemInfo.getRepoPath());
-        if (moduleInfo.isIntegration()) {
-            bintrayInfoEnabled = false;
-            return;
-        }
-
-        BintrayService bintrayService = ContextHelper.get().beanForType(BintrayService.class);
-        boolean hasSystemAPIKey = bintrayService.hasBintraySystemUser();
-        boolean userExists = isUserExists();
-        if (!hasSystemAPIKey && !userExists) {
-            bintrayInfoEnabled = false;
-            return;
-        }
-
-        // All good, enable it
-        bintrayInfoEnabled = true;
-    }
-
-    private boolean isValidFile(ItemInfo itemInfo) {
-        return NamingUtils.isJarVariant(itemInfo.getName()) || NamingUtils.isPom(itemInfo.getName());
-    }
-
-    private boolean isUserExists() {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        CoreAddons addons = addonsManager.addonByType(CoreAddons.class);
-        return !addons.isAolAdmin() &&
-                !ContextHelper.get().beanForType(UserGroupService.class).currentUser().isTransientUser();
-    }
-
-    /**
-     * update dependency declaration
-     *
-     * @param artifactoryRestRequest - encapsulate data related to request
-     * @param repoService            - repository service
-     * @param itemInfo               - repository item info
-     * @param localRepoDescriptor    - repository descriptor
-     */
-    private void updateDependencyDeclaration(ArtifactoryRestRequest artifactoryRestRequest,
-                                             RepositoryService repoService, ItemInfo itemInfo,
-                                             LocalRepoDescriptor localRepoDescriptor) {
-        DependencyDeclaration localDependencyDeclaration = new DependencyDeclaration();
-        localDependencyDeclaration.updateDependencyDeclaration(artifactoryRestRequest,
-                repoService, itemInfo, localRepoDescriptor);
-        if (localDependencyDeclaration.getTypes() != null) {
-            dependencyDeclaration = localDependencyDeclaration;
-        }
-    }
-
-    private void updateFileInfoCheckSum(org.artifactory.fs.FileInfo itemInfo, LocalRepoDescriptor localRepoDescriptor,
-                                        AuthorizationService authService) {
-        boolean hasPermissions = authService.canDeploy(itemInfo.getRepoPath()) && !authService.isAnonymous();
-        checksums = new Checksums();
-        checksums.updateFileInfoCheckSum(itemInfo, localRepoDescriptor, hasPermissions);
-        checksums.updatePropertiesChecksums(itemInfo);
-    }
-
-    /**
-     * populate File info data
-     *
-     * @param repoService          -repository service
-     * @param repoPath             - repo path
-     * @param centralConfigService - central config service
-     * @return File info instance
-     */
-    private BaseInfo populateFileInfo(RepositoryService repoService, RepoPath repoPath,
-                                      CentralConfigService centralConfigService, AuthorizationService authService) {
-        FileInfo fileInfo = new FileInfo();
-        fileInfo.populateFileInfo(repoService, repoPath, centralConfigService, authService, blackDuckEnabled);
-        return fileInfo;
-    }
-
-    public DependencyDeclaration getDependencyDeclaration() {
-        return dependencyDeclaration;
-    }
-
-    public String toString() {
-        return JsonUtil.jsonToStringIgnoreSpecialFields(this);
-    }
-
-    public Boolean getBlackDuckEnabled() {
-        return blackDuckEnabled;
-    }
-
-    public boolean isBintrayInfoEnabled() {
-        return bintrayInfoEnabled;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/FolderGeneralArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/FolderGeneralArtifactInfo.java
deleted file mode 100644
index 52b8bb2..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/FolderGeneralArtifactInfo.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.IgnoreSpecialFields;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.info.BaseInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.info.FolderInfo;
-import org.artifactory.util.HttpUtils;
-import org.codehaus.jackson.annotate.JsonTypeName;
-import org.codehaus.jackson.map.annotate.JsonFilter;
-
-/**
- * @author Chen Keinan
- */
- at JsonTypeName("folder")
- at JsonFilter("exclude fields")
- at IgnoreSpecialFields(value = {"repoKey", "path"})
-public class FolderGeneralArtifactInfo extends GeneralArtifactInfo implements RestGeneralTab {
-
-    private int artifactsCount;
-
-    public FolderGeneralArtifactInfo(String name) {
-        super(name);
-    }
-
-    FolderGeneralArtifactInfo(){}
-
-    @Override
-    public void populateGeneralData(ArtifactoryRestRequest artifactoryRestRequest, AuthorizationService authService) {
-        RepoPath repoPath = retrieveRepoPath();
-        CentralConfigService centralConfigService = retrieveCentralConfigService();
-        RepositoryService repoService = retrieveRepoService();
-        BaseInfo baseInfo = populateFolderInfo(repoService, repoPath, centralConfigService, authService);
-        // populate folder info
-        super.setInfo(baseInfo);
-        // populate virtual repositories
-        super.populateVirtualRepositories(HttpUtils.getServletContextUrl(artifactoryRestRequest.getServletRequest()));
-    }
-
-    /**
-     * populate folder info data
-     * @param repoService  -repository service
-     * @param repoPath - repo path
-     * @param centralConfigService - central config service
-     * @return folder info instance
-     */
-    private BaseInfo populateFolderInfo(RepositoryService repoService,RepoPath repoPath,
-            CentralConfigService centralConfigService, AuthorizationService authService) {
-        FolderInfo folderInfo = new FolderInfo();
-        folderInfo.populateFolderInfo(repoService, repoPath, centralConfigService, authService.currentUsername());
-        return folderInfo;
-    }
-
-    public int getArtifactsCount() {
-        return artifactsCount;
-    }
-
-    public void setArtifactsCount(int artifactsCount) {
-        this.artifactsCount = artifactsCount;
-    }
-
-    public String toString() {
-        return JsonUtil.jsonToStringIgnoreSpecialFields(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/GeneralArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/GeneralArtifactInfo.java
deleted file mode 100644
index c2907d4..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/GeneralArtifactInfo.java
+++ /dev/null
@@ -1,143 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.BaseArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.info.BaseInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.relatedrepositories.RelatedRepositories;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.virtualrepositories.VirtualRepositories;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class GeneralArtifactInfo extends BaseArtifactInfo {
-
-    private BaseInfo info;
-    private VirtualRepositories virtualRepositories;
-    private String repoKey;
-    private String path;
-    private RelatedRepositories relatedRepositories;
-
-    GeneralArtifactInfo() {
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    public GeneralArtifactInfo(String name) {
-        super(name);
-    }
-
-    public BaseInfo getInfo() {
-        return info;
-    }
-
-    public void setInfo(BaseInfo info) {
-        this.info = info;
-    }
-
-    public VirtualRepositories getVirtualRepositories() {
-        return virtualRepositories;
-    }
-
-    public void setVirtualRepositories(VirtualRepositories virtualRepositories) {
-        this.virtualRepositories = virtualRepositories;
-    }
-
-    public RepoPath retrieveRepoPath() {
-        return InternalRepoPathFactory.create(getRepoKey(), getPath());
-    }
-
-    /**
-     * retrieve Repository Service
-     *
-     * @return instance of repository service
-     */
-    protected RepositoryService retrieveRepoService() {
-        return ContextHelper.get().beanForType(RepositoryService.class);
-    }
-
-    /**
-     * @param repoPath - repository path
-     * @return Item info for specific repo path
-     */
-    protected ItemInfo retrieveItemInfo(RepoPath repoPath) {
-        return retrieveRepoService().getItemInfo(repoPath);
-    }
-
-    /**
-     * return central config service
-     *
-     * @return central config service instance
-     */
-    protected CentralConfigService retrieveCentralConfigService() {
-        return ContextHelper.get().beanForType(CentralConfigService.class);
-    }
-
-    /**
-     * populate virtual repositories list
-     * @param baseURL
-     */
-    void populateVirtualRepositories(String baseURL) {
-        RepositoryService repositoryService = retrieveRepoService();
-        LocalRepoDescriptor repoDescriptor =
-                repositoryService.localOrCachedRepoDescriptorByKey(retrieveRepoPath().getRepoKey());
-        List<VirtualRepoDescriptor> virtualRepoList = new ArrayList<>();
-        if(repoDescriptor != null) {
-            virtualRepoList = repositoryService.getVirtualReposContainingRepo(repoDescriptor);
-        }
-        virtualRepositories = new VirtualRepositories(virtualRepoList, baseURL);
-    }
-
-    /**
-     * retrieve local or cached repo descriptor
-     *
-     * @param repoPath - repo path
-     * @return local repo descriptor
-     */
-    protected RemoteRepoDescriptor remoteRepoDescriptor(RepoPath repoPath) {
-        return retrieveRepoService().remoteRepoDescriptorByKey(repoPath.getRepoKey());
-    }
-
-    /**
-     * retrieve local or cached repo descriptor
-     *
-     * @param repoPath - repo path
-     * @return local repo descriptor
-     */
-    protected VirtualRepoDescriptor virtualRepoDescriptor(RepoPath repoPath) {
-        return retrieveRepoService().virtualRepoDescriptorByKey(repoPath.getRepoKey());
-    }
-
-    public RelatedRepositories getRelatedRepositories() {
-        return relatedRepositories;
-    }
-
-    public void setRelatedRepositories(
-            RelatedRepositories relatedRepositories) {
-        this.relatedRepositories = relatedRepositories;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/RepositoryGeneralArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/RepositoryGeneralArtifactInfo.java
deleted file mode 100644
index 21c8401..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/RepositoryGeneralArtifactInfo.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general;
-
-import com.google.common.base.Joiner;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.debian.DebianAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RealRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoBaseDescriptor;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.info.BaseInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.info.RepositoryInfo;
-import org.artifactory.util.HttpUtils;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-/**
- * @author Chen Keinan
- */
- at JsonTypeName("repository")
-public class RepositoryGeneralArtifactInfo extends GeneralArtifactInfo implements RestGeneralTab {
-
-    private String blackedOutMessage;
-
-    RepositoryGeneralArtifactInfo(){}
-    public RepositoryGeneralArtifactInfo(String name) {
-        super(name);
-    }
-
-
-    @Override
-    public void populateGeneralData(ArtifactoryRestRequest artifactoryRestRequest, AuthorizationService authService) {
-        RepoPath repoPath = retrieveRepoPath();
-        CentralConfigService centralConfigService = retrieveCentralConfigService();
-        RepositoryService repoService = retrieveRepoService();
-        LocalRepoDescriptor repoDescriptor =
-                repoService.localCachedOrDistributionRepoDescriptorByKey(repoPath.getRepoKey());
-        String baseUrl = HttpUtils.getServletContextUrl(artifactoryRestRequest.getServletRequest());
-        //populate repository info
-        BaseInfo baseInfo = populateRepositoryInfo(repoService, repoDescriptor, repoPath, centralConfigService,
-                authService, baseUrl);
-        super.setInfo(baseInfo);
-        // populate virtual repositories
-        populateVirtualRepositories(HttpUtils.getServletContextUrl(artifactoryRestRequest.getServletRequest()));
-        setRepositoryBlackedOut(repoDescriptor);
-    }
-
-    /**
-     * populate Repository info data
-     * @param repoService  -repository service
-     * @param repoDescriptor - repo descriptor
-     * @param repoPath - repo path
-     * @param centralConfigService - central config service
-     * @return
-     */
-    private BaseInfo populateRepositoryInfo(RepositoryService repoService ,
-            LocalRepoDescriptor repoDescriptor, RepoPath repoPath, CentralConfigService centralConfigService,
-            AuthorizationService authService, String baseUrl) {
-        RepositoryInfo repoInfo = new RepositoryInfo();
-        repoInfo.populateRepositoryInfo(repoService, repoDescriptor, repoPath, centralConfigService,
-                authService.currentUsername());
-        setGpgKeyLink(repoDescriptor, repoInfo, baseUrl);
-        return repoInfo;
-    }
-
-    private void setRepositoryBlackedOut(RepoBaseDescriptor repoDescriptor) {
-        if (repoDescriptor != null && repoDescriptor instanceof RealRepoDescriptor) {
-            if (((RealRepoDescriptor) repoDescriptor).isBlackedOut()) {
-                this.setBlackedOutMessage("This repository is blacked out, " +
-                        "items can only be viewed but cannot be resolved or deployed.");
-            }
-        }
-    }
-
-    //Add gpg public key under general info in Debian repository only
-    private void setGpgKeyLink(RepoBaseDescriptor repoDescriptor, RepositoryInfo repoInfo, String baseUrl) {
-        RepoType repoType = repoDescriptor.getType();
-        if(repoType.equals(RepoType.Debian) || repoType.equals(RepoType.Opkg)){
-            AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-            DebianAddon debianAddon = addonsManager.addonByType(DebianAddon.class);
-            if (debianAddon.hasPublicKey()) {
-                String gpgLink = Joiner.on('/').join(baseUrl, "api", "gpg", "key/public");
-                repoInfo.setSigningKeyLink(gpgLink);
-            }
-        }
-    }
-
-    public String getBlackedOutMessage() {
-        return blackedOutMessage;
-    }
-
-    public void setBlackedOutMessage(String blackedOutMessage) {
-        this.blackedOutMessage = blackedOutMessage;
-    }
-
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/RestGeneralTab.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/RestGeneralTab.java
deleted file mode 100644
index d81d649..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/RestGeneralTab.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.codehaus.jackson.annotate.JsonSubTypes;
-import org.codehaus.jackson.annotate.JsonTypeInfo;
-
-/**
- * @author Chen Keinan
- */
- at JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
- at JsonSubTypes({ @JsonSubTypes.Type(value = FileGeneralArtifactInfo.class, name = "file"),
-                @JsonSubTypes.Type(value = FolderGeneralArtifactInfo.class, name = "folder"),
-                @JsonSubTypes.Type(value = ArchiveGeneralArtifactInfo.class, name = "archive"),
-                @JsonSubTypes.Type(value = RepositoryGeneralArtifactInfo.class, name = "repository")})
-public interface RestGeneralTab extends RestModel {
-
-    /**
-     * populate general tab data base on type (repository /folder / file)
-     */
-    void populateGeneralData(ArtifactoryRestRequest artifactoryRestRequest, AuthorizationService authService);
-
-    RepoPath retrieveRepoPath();
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/VirtualRemoteFileGeneralArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/VirtualRemoteFileGeneralArtifactInfo.java
deleted file mode 100644
index 900b58d..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/VirtualRemoteFileGeneralArtifactInfo.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.BaseBrowsableItem;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.repo.VirtualBrowsableItem;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.BaseArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.info.BaseInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.info.FileInfo;
-
-/**
- * @author Chen Keinan
- */
-public class VirtualRemoteFileGeneralArtifactInfo extends BaseArtifactInfo {
-
-    private BaseInfo info;
-
-    public VirtualRemoteFileGeneralArtifactInfo() {
-    }
-
-    public VirtualRemoteFileGeneralArtifactInfo(String name) {
-        super(name);
-    }
-
-    /***
-     * @param item
-     * @return
-     */
-    public void populateVirtualRemoteFileInfo(BaseBrowsableItem item) {
-        FileInfo fileInfo = new FileInfo();
-        if (item instanceof VirtualBrowsableItem || item.isRemote()) {
-            fileInfo.populateVirtualRemoteFileInfo(item);
-            this.info = fileInfo;
-        } else {
-            // get local or cached repo key
-            String repoKey = item.getRepoKey();
-            RepositoryService repoService = ContextHelper.get().getRepositoryService();
-            RepoPath repoPath = InternalRepoPathFactory.create(repoKey, item.getRelativePath());
-            CentralConfigService centralConfigService = ContextHelper.get().getCentralConfig();
-            AuthorizationService authService = ContextHelper.get().getAuthorizationService();
-            fileInfo.populateFileInfo(repoService, repoPath, centralConfigService, authService, false);
-            this.info = fileInfo;
-        }
-    }
-
-    public BaseInfo getInfo() {
-        return info;
-    }
-
-    public void setInfo(BaseInfo info) {
-        this.info = info;
-    }
-
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/VirtualRemoteFolderGeneralArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/VirtualRemoteFolderGeneralArtifactInfo.java
deleted file mode 100644
index 3e04ffd..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/VirtualRemoteFolderGeneralArtifactInfo.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.BaseBrowsableItem;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.repo.VirtualBrowsableItem;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.BaseArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.info.BaseInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.info.FolderInfo;
-
-/**
- * @author Chen Keinan
- */
-public class VirtualRemoteFolderGeneralArtifactInfo extends BaseArtifactInfo {
-
-    private BaseInfo info;
-
-    public VirtualRemoteFolderGeneralArtifactInfo() {
-    }
-
-    public VirtualRemoteFolderGeneralArtifactInfo(String name) {
-        super(name);
-    }
-
-    public void populateGeneralData(BaseBrowsableItem item) {
-        BaseInfo baseInfo;
-        if (item instanceof VirtualBrowsableItem || item.isRemote()) {
-            baseInfo = populateVirtualRemoteFolderInfo(item);
-            this.info = baseInfo;
-        } else {
-            // get local or cached repo key
-            String repoKey = item.getRepoKey();
-            RepositoryService repositoryService = ContextHelper.get().getRepositoryService();
-            FolderInfo folderInfo = new FolderInfo();
-            CentralConfigService centralConfig = ContextHelper.get().getCentralConfig();
-            AuthorizationService authService = ContextHelper.get().getAuthorizationService();
-            RepoPath repoPath = InternalRepoPathFactory.create(repoKey, item.getRelativePath());
-            folderInfo.populateFolderInfo(repositoryService, repoPath, centralConfig, authService.currentUsername());
-            this.info = folderInfo;
-        }
-    }
-
-    /***
-     * @param item
-     * @return
-     */
-    private BaseInfo populateVirtualRemoteFolderInfo(BaseBrowsableItem item) {
-        FolderInfo repoInfo = new FolderInfo();
-        repoInfo.populateVirtualRemoteFolderInfo(item);
-        return repoInfo;
-    }
-
-    public BaseInfo getInfo() {
-        return info;
-    }
-
-    public void setInfo(BaseInfo info) {
-        this.info = info;
-    }
-
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/VirtualRemoteRepoGeneralArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/VirtualRemoteRepoGeneralArtifactInfo.java
deleted file mode 100644
index 8f9e458..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/VirtualRemoteRepoGeneralArtifactInfo.java
+++ /dev/null
@@ -1,148 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general;
-
-import org.artifactory.descriptor.repo.HttpRepoDescriptor;
-import org.artifactory.descriptor.repo.RealRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoBaseDescriptor;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.BaseArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.includedRepositories.IncludedRepositories;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.info.BaseInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.info.RepositoryInfo;
-
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * @author Chen Keinan
- */
-public class VirtualRemoteRepoGeneralArtifactInfo extends BaseArtifactInfo {
-
-    private BaseInfo info;
-    private IncludedRepositories includedRepositories;
-    private String offlineMessage;
-    private String blackedOutMessage;
-
-    public VirtualRemoteRepoGeneralArtifactInfo() {
-    }
-
-    public VirtualRemoteRepoGeneralArtifactInfo(String name) {
-        super(name);
-    }
-
-    public void populateGeneralData(RepoBaseDescriptor repoBaseDescriptor, HttpServletRequest request) {
-        RepoPath repoPath = InternalRepoPathFactory.create(repoBaseDescriptor.getKey(), "");
-        // update general info
-        BaseInfo baseInfo = populateVirtualRemoteRepositoryInfo(repoBaseDescriptor, repoPath);
-        // update included repositories data
-        updateVirtualIncludedRepositories(repoBaseDescriptor, request);
-
-        this.info = baseInfo;
-    }
-
-    /**
-     * populate Repository info data
-     *
-     * @param repoDescriptor - repo descriptor
-     * @param repoPath       - repo path
-     * @return
-     */
-    private BaseInfo populateVirtualRemoteRepositoryInfo(RepoBaseDescriptor repoDescriptor, RepoPath repoPath) {
-        RepositoryInfo repoInfo = new RepositoryInfo();
-        if (repoDescriptor instanceof VirtualRepoDescriptor) {
-            VirtualRepoDescriptor virtualRepoDescriptor = (VirtualRepoDescriptor) repoDescriptor;
-            repoInfo.populateVirtualRepositoryInfo(virtualRepoDescriptor, repoPath);
-        } else {
-            repoInfo.populateRemoteRepositoryInfo(repoDescriptor, repoPath);
-        }
-        setRepositoryOffline(repoDescriptor);
-        setRepositoryBlackedOut(repoDescriptor);
-        return repoInfo;
-    }
-
-    /**
-     * update included repositories data
-     *
-     * @param repoDescriptor - repo descriptor
-     * @param request        - http servlet request
-     */
-    private void updateVirtualIncludedRepositories(RepoBaseDescriptor repoDescriptor, HttpServletRequest request) {
-        if (repoDescriptor instanceof VirtualRepoDescriptor) {
-            VirtualRepoDescriptor virtualRepoDescriptor = (VirtualRepoDescriptor) repoDescriptor;
-            updateIncludedRepositories(virtualRepoDescriptor, request);
-        }
-    }
-
-
-    /**
-     * update included repositories data
-     *
-     * @param virtualRepoDescriptor - virtual repo descriptor
-     * @param request
-     */
-    private void updateIncludedRepositories(VirtualRepoDescriptor virtualRepoDescriptor, HttpServletRequest request) {
-        IncludedRepositories includedRepositories = new IncludedRepositories(virtualRepoDescriptor.getRepositories(),
-                request);
-        this.includedRepositories = includedRepositories;
-    }
-
-    /**
-     * set repositories  offline data
-     *
-     * @param repoDescriptor - repo descriptor
-     */
-    private void setRepositoryOffline(RepoBaseDescriptor repoDescriptor) {
-        if (repoDescriptor != null && repoDescriptor instanceof HttpRepoDescriptor) {
-            if (((HttpRepoDescriptor) repoDescriptor).isOffline()) {
-                this.setOfflineMessage("This repository is offline, content is served from the cache only.");
-            }
-        }
-    }
-
-    private void setRepositoryBlackedOut(RepoBaseDescriptor repoDescriptor) {
-        if (repoDescriptor != null && repoDescriptor instanceof RealRepoDescriptor) {
-            if (((RealRepoDescriptor) repoDescriptor).isBlackedOut()) {
-                this.setBlackedOutMessage("This repository is blacked out, " +
-                        "items can only be viewed but cannot be resolved or deployed.");
-            }
-        }
-    }
-
-    public BaseInfo getInfo() {
-        return info;
-    }
-
-    public void setInfo(BaseInfo info) {
-        this.info = info;
-    }
-
-    public String getOfflineMessage() {
-        return offlineMessage;
-    }
-
-    public void setOfflineMessage(String offlineMessage) {
-        this.offlineMessage = offlineMessage;
-    }
-
-    public String getBlackedOutMessage() {
-        return blackedOutMessage;
-    }
-
-    public void setBlackedOutMessage(String blackedOutMessage) {
-        this.blackedOutMessage = blackedOutMessage;
-    }
-
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-
-    public IncludedRepositories getIncludedRepositories() {
-        return includedRepositories;
-    }
-
-    public void setIncludedRepositories(
-            IncludedRepositories includedRepositories) {
-        this.includedRepositories = includedRepositories;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/bintray/BintrayInfoModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/bintray/BintrayInfoModel.java
deleted file mode 100644
index 5797da3..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/bintray/BintrayInfoModel.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.bintray;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Shay Yaakov
- */
-public class BintrayInfoModel extends BaseModel {
-
-    private String name;
-    private String nameLink;
-    private String description;
-    private String latestVersion;
-    private String latestVersionLink;
-    private String iconURL;
-    private String errorMessage;
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getNameLink() {
-        return nameLink;
-    }
-
-    public void setNameLink(String nameLink) {
-        this.nameLink = nameLink;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public String getLatestVersion() {
-        return latestVersion;
-    }
-
-    public void setLatestVersion(String latestVersion) {
-        this.latestVersion = latestVersion;
-    }
-
-    public String getLatestVersionLink() {
-        return latestVersionLink;
-    }
-
-    public void setLatestVersionLink(String latestVersionLink) {
-        this.latestVersionLink = latestVersionLink;
-    }
-
-    public String getIconURL() {
-        return iconURL;
-    }
-
-    public void setIconURL(String iconURL) {
-        this.iconURL = iconURL;
-    }
-
-    public String getErrorMessage() {
-        return errorMessage;
-    }
-
-    public void setErrorMessage(String errorMessage) {
-        this.errorMessage = errorMessage;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/checksums/Checksums.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/checksums/Checksums.java
deleted file mode 100644
index e4f6418..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/checksums/Checksums.java
+++ /dev/null
@@ -1,218 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.checksums;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.md.Properties;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-
-/**
- * @author Chen Keinan
- */
- at JsonIgnoreProperties("checksumsMatch")
-public class Checksums {
-
-    private String sha2;
-    private String sha1;
-    private String sha1Value;
-    private String md5;
-    private boolean showFixChecksums; //Signifies if the 'fix checksums' button should be shown on UI
-    private String message;           //If show fix checksums button this holds the relevant warning
-
-    public String getSha2() {
-        return sha2;
-    }
-
-    public void setSha2(String sha2) {
-        this.sha2 = sha2;
-    }
-
-    public String getMd5() {
-        return md5;
-    }
-
-    public void setMd5(String md5) {
-        this.md5 = md5;
-    }
-
-    public String getSha1() {
-        return sha1;
-    }
-
-    public void setSha1(String sha1) {
-        this.sha1 = sha1;
-    }
-
-    public String getSha1Value() {
-        return sha1Value;
-    }
-
-    public void setSha1Value(String sha1Value) {
-        this.sha1Value = sha1Value;
-    }
-
-    public boolean isShowFixChecksums() {
-        return showFixChecksums;
-    }
-
-    public void setShowFixChecksums(boolean showFixChecksums) {
-        this.showFixChecksums = showFixChecksums;
-    }
-
-    public String getMessage() {
-        return message;
-    }
-
-    public void setMessage(String message) {
-        this.message = message;
-    }
-
-    public void updateFileInfoCheckSum(FileInfo itemInfo, LocalRepoDescriptor localRepoDescriptor,
-                                       boolean userHasPermissionsToFix) {
-        boolean isLocalRepo = localRepoDescriptor.isLocal();
-        String md5 = "";
-        boolean checksumsMatch = true;
-        ChecksumInfo md5Info = getChecksumOfType(itemInfo, ChecksumType.md5);
-        if (md5Info != null) {
-            checksumsMatch &= md5Info.checksumsMatch();
-            md5 = buildChecksumString(md5Info, isLocalRepo);
-        }
-
-        String sha1 = "";
-        ChecksumInfo sha1Info = getChecksumOfType(itemInfo, ChecksumType.sha1);
-        if (sha1Info != null) {
-            checksumsMatch &= sha1Info.checksumsMatch();
-            sha1 = buildChecksumString(sha1Info, isLocalRepo);
-            sha1Value = sha1Info.getActual();
-        }
-        this.setMd5(md5);
-        this.setSha1(sha1);
-
-        if (checksumsMatch || isOneMissingOtherMatches(sha1Info, md5Info)) {
-            showFixChecksums = false;
-        } else {
-            if (userHasPermissionsToFix && !RepoType.Docker.equals(localRepoDescriptor.getType())) {
-                showFixChecksums = true;
-            }
-            message = prepareFixChecksumsMessage(userHasPermissionsToFix, isLocalRepo, md5Info, sha1Info);
-        }
-    }
-
-    public void updatePropertiesChecksums(FileInfo fileInfo) {
-        Properties properties = ContextHelper.get().getRepositoryService().getProperties(fileInfo.getRepoPath());
-        if (properties != null) {
-            String sha256 = properties.getFirst("sha256");
-            if (StringUtils.isNotBlank(sha256)) {
-                this.setSha2("SHA-256: " + sha256);
-            }
-        }
-    }
-
-    private ChecksumInfo getChecksumOfType(org.artifactory.fs.FileInfo file, ChecksumType checksumType) {
-        return file.getChecksumsInfo().getChecksumInfo(checksumType);
-    }
-
-    private String prepareFixChecksumsMessage(boolean userHasPermissionsToFix, boolean isLocalRepo,
-                                              ChecksumInfo md5Info, ChecksumInfo sha1Info) {
-        StringBuilder message = new StringBuilder();
-        if (isAllChecksumsMissing(sha1Info, md5Info)) {
-            if (isLocalRepo) {
-                message.append("Client did not publish a checksum value.\n");
-            } else {
-                message.append("Remote checksum doesn't exist.\n");
-            }
-        } else if (isAllChecksumsBroken(sha1Info, md5Info) || isOneOkOtherBroken(sha1Info, md5Info) ||
-                isOneMissingOtherBroken(sha1Info, md5Info)) {
-            String repoClass = isLocalRepo ? "Uploaded" : "Remote";
-            message = new StringBuilder().append(repoClass).append(" checksum doesn't match the actual checksum.\n ")
-                    .append("Please redeploy the artifact with a correct checksum.");
-        }
-        if (userHasPermissionsToFix) {
-            message.append("If you trust the ").append(isLocalRepo ? "uploaded" : "remote")
-                    .append(" artifact you can accept the actual checksum by clicking the 'Fix Checksum' button.");
-        }
-        return message.toString();
-    }
-
-    private boolean isChecksumMatch(ChecksumInfo info) {
-        return info != null && info.checksumsMatch();
-    }
-
-    private boolean isChecksumBroken(ChecksumInfo info) {
-        return info != null && !info.checksumsMatch();
-    }
-
-    private boolean isChecksumMissing(ChecksumInfo info) {
-        return info == null || info.getOriginal() == null;
-    }
-
-    /**
-     * @return Check if one of the {@link ChecksumType} is ok and the other broken
-     */
-    private boolean isOneOkOtherBroken(ChecksumInfo sha1Info, ChecksumInfo md5Info) {
-        return (isChecksumMatch(sha1Info) && isChecksumBroken(md5Info))
-                || (isChecksumMatch(md5Info) && isChecksumBroken(sha1Info));
-    }
-
-    /**
-     * @return Check if one of the {@link ChecksumType} is missing and the other is broken (i.e don't match).
-     */
-    private boolean isOneMissingOtherBroken(ChecksumInfo sha1Info, ChecksumInfo md5Info) {
-        return isChecksumMatch(sha1Info) && isChecksumBroken(md5Info) || (isChecksumMatch(md5Info)
-                && isChecksumBroken(sha1Info));
-    }
-
-    /**
-     * @return Check if one of the {@link ChecksumType} is missing and the other matches.
-     */
-    private boolean isOneMissingOtherMatches(ChecksumInfo sha1Info, ChecksumInfo md5Info) {
-        return isChecksumMatch(sha1Info) && (isChecksumMissing(md5Info)) || ((isChecksumMatch(md5Info)) &&
-                (isChecksumMissing(sha1Info)));
-    }
-
-    /**
-     * @return Check that all {@link ChecksumType}s are broken (but are <b>NOT<b/> missing)
-     */
-    private boolean isAllChecksumsBroken(ChecksumInfo... checksumInfos) {
-        for (ChecksumInfo type : checksumInfos) {
-            if (!isChecksumBroken(type)) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * @return Check that all {@link ChecksumType}s are <b>missing<b/>
-     */
-    private boolean isAllChecksumsMissing(ChecksumInfo... checksumInfos) {
-        for (ChecksumInfo type : checksumInfos) {
-            if (!isChecksumMissing(type)) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    private String buildChecksumString(ChecksumInfo checksumInfo, boolean isLocalRepo) {
-        StringBuilder sb = new StringBuilder()
-                .append(checksumInfo.getType()).append(": ")
-                .append(checksumInfo.getActual()).append(" (")
-                .append(isLocalRepo ? "Uploaded" : "Remote").append(": ");
-        if (checksumInfo.getOriginal() != null) {
-            if (checksumInfo.checksumsMatch()) {
-                sb.append("Identical");
-            } else {
-                sb.append(checksumInfo.getOriginal());
-            }
-        } else {
-            sb.append("None");
-        }
-
-        return sb.append(")").toString();
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/dependecydeclaration/DependencyDeclaration.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/dependecydeclaration/DependencyDeclaration.java
deleted file mode 100644
index 1383f37..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/dependecydeclaration/DependencyDeclaration.java
+++ /dev/null
@@ -1,241 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.dependecydeclaration;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.maven.MavenArtifactInfo;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.module.ModuleInfoBuilder;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.rest.common.model.BaseModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.util.RepoLayoutUtils;
-
-/**
- * @author Chen Keinan
- */
-public class DependencyDeclaration extends BaseModel {
-
-    private String[] types;
-    private String dependencyData;
-
-    public String[] getTypes() {
-        return types;
-    }
-
-    public void setTypes(String[] types) {
-        this.types = types;
-    }
-
-    public String getDependencyData() {
-        return dependencyData;
-    }
-
-    public void setDependencyData(String dependencyData) {
-        this.dependencyData = dependencyData;
-    }
-
-    /**
-     * update dependency declaration
-     *
-     * @param artifactoryRestRequest - encapsulate data related to request
-     * @param repoService            - repository service
-     * @param itemInfo               - repository item info
-     * @param localRepoDescriptor    - repository descriptor
-     */
-    public void updateDependencyDeclaration(ArtifactoryRestRequest artifactoryRestRequest,
-            RepositoryService repoService, ItemInfo itemInfo, LocalRepoDescriptor localRepoDescriptor) {
-        RepoLayout repoLayout = localRepoDescriptor.getRepoLayout();
-        ModuleInfo moduleInfo = getModuleInfo(repoService, itemInfo, repoLayout);
-        if (moduleInfo != null && moduleInfo.isValid()) {
-            if (artifactoryRestRequest.getQueryParamByKey("buildtool").length() > 0) {
-                updateDependencyDeclarationData(artifactoryRestRequest, moduleInfo);
-            }
-            String[] buildTypes = {"Maven", "Ivy", "Gradle", "Sbt"};
-            types = buildTypes;
-        }
-    }
-
-    /**
-     * get declaration data by type and update declaration dependency model
-     *
-     * @param artifactoryRestRequest - encapsulate data related to request
-     * @param moduleInfo             - artifact module data
-     * @return dependency declaration instance
-     */
-    private void updateDependencyDeclarationData(ArtifactoryRestRequest artifactoryRestRequest,
-            ModuleInfo moduleInfo) {
-        String declaration;
-        String buildTool = artifactoryRestRequest.getQueryParamByKey("buildtool");
-        DependencyDeclaration dependencyDeclaration = this;
-        switch (buildTool) {
-            case "maven":
-                declaration = this.getMavenDependencyDeclaration(moduleInfo);
-                break;
-            case "gradle":
-                declaration = this.getGradleDependencyDeclaration(moduleInfo);
-                break;
-            case "ivy":
-                declaration = this.getIvyDependencyDeclaration(moduleInfo);
-                break;
-            case "sbt":
-                declaration = this.getSbtDependency(moduleInfo);
-                break;
-            default:
-                declaration = this.getMavenDependencyDeclaration(moduleInfo);
-                break;
-        }
-        dependencyDeclaration.setDependencyData(declaration);
-    }
-
-    /**
-     * get module info data
-     *
-     * @param repositoryService - repository service
-     * @param itemInfo          - item info
-     * @param repoLayout        repository layout
-     * @return - item module info
-     */
-    private ModuleInfo getModuleInfo(RepositoryService repositoryService, ItemInfo itemInfo, RepoLayout repoLayout) {
-        ModuleInfo moduleInfo = null;
-        if (!itemInfo.isFolder()) {
-            boolean defaultM2 = RepoLayoutUtils.isDefaultM2(repoLayout);
-            if (defaultM2) {
-                MavenArtifactInfo mavenArtifactInfo = MavenArtifactInfo.fromRepoPath(itemInfo.getRepoPath());
-                if (mavenArtifactInfo.isValid()) {
-                    moduleInfo = new ModuleInfoBuilder()
-                            .organization(mavenArtifactInfo.getGroupId())
-                            .module(mavenArtifactInfo.getArtifactId())
-                            .baseRevision(mavenArtifactInfo.getVersion())
-                            .classifier(mavenArtifactInfo.getClassifier())
-                            .ext(mavenArtifactInfo.getType())
-                            .build();
-                }
-            }
-            if (moduleInfo == null) {
-                moduleInfo = repositoryService.getItemModuleInfo(itemInfo.getRepoPath());
-            }
-        }
-        return moduleInfo;
-    }
-
-    /**
-     * get Gradle Dependency Declaration
-     * @param moduleInfo  - item module info
-     * @return Dependency Declaration as String
-     */
-    public String getGradleDependencyDeclaration(ModuleInfo moduleInfo) {
-        StringBuilder sb = new StringBuilder("compile(group: '").append(moduleInfo.getOrganization()).
-                append("', name: '").append(moduleInfo.getModule()).append("', version: '").
-                append(moduleInfo.getBaseRevision());
-
-        String artifactRevisionIntegration = moduleInfo.getFileIntegrationRevision();
-        if (StringUtils.isNotBlank(artifactRevisionIntegration)) {
-            sb.append("-").append(artifactRevisionIntegration);
-        }
-        sb.append("'");
-
-        String classifier = moduleInfo.getClassifier();
-        if (StringUtils.isNotBlank(classifier)) {
-            sb.append(", classifier: '").append(classifier).append("'");
-        }
-
-        String ext = moduleInfo.getExt();
-        if (StringUtils.isNotBlank(ext) && !"jar".equalsIgnoreCase(ext)) {
-            sb.append(", ext: '").append(ext).append("'");
-        }
-        return sb.append(")").toString();
-    }
-
-    /**
-     * get sbt Dependency Declaration
-     *
-     * @param moduleInfo - item module info
-     * @return Dependency Declaration as String
-     */
-    public String getSbtDependency(ModuleInfo moduleInfo) {
-        StringBuilder sb = new StringBuilder("libraryDependencies += ").
-                append("\"").append(moduleInfo.getOrganization()).append("\"").
-                append(" % ").
-                append("\"").append(moduleInfo.getModule()).append("\"").
-                append(" % ").
-                append("\"").append(moduleInfo.getBaseRevision()).append("\"");
-        return sb.toString();
-    }
-
-    /**
-     * get Ivy Dependency Declaration
-     * @param moduleInfo  - item module info
-     * @return Dependency Declaration as String
-     */
-    public String getIvyDependencyDeclaration(ModuleInfo moduleInfo) {
-        String module = moduleInfo.getModule();
-
-        StringBuilder sb = new StringBuilder("<dependency org=\"").append(moduleInfo.getOrganization()).append("\" ")
-                .append("name=\"").append(module).append("\" ").append("rev=\"").append(moduleInfo.getBaseRevision());
-
-        String artifactRevisionIntegration = moduleInfo.getFileIntegrationRevision();
-        if (StringUtils.isNotBlank(artifactRevisionIntegration)) {
-            sb.append("-").append(artifactRevisionIntegration);
-        }
-        sb.append("\"");
-
-        String classifier = moduleInfo.getClassifier();
-        String type = moduleInfo.getType();
-
-        boolean validClassifier = StringUtils.isNotBlank(classifier);
-        boolean validType = StringUtils.isNotBlank(type);
-
-        if (validClassifier || !"jar".equals(type)) {
-            sb.append(">\n")
-                    .append("    <artifact name=\"").append(module).append("\"");
-
-            if (validType && (validClassifier || !"jar".equals(type))) {
-                sb.append(" type=\"").append(type).append("\"");
-            }
-
-            if (validClassifier) {
-                sb.append(" m:classifier=\"").append(classifier).append("\"");
-            }
-
-            sb.append(" ext=\"").append(moduleInfo.getExt()).append("\"/>\n")
-                    .append("</dependency>");
-        } else {
-            sb.append("/>");
-        }
-        return sb.toString();
-    }
-
-
-    /**
-     * get Maven Dependency Declaration
-     * @param moduleInfo  - item module info
-     * @return Dependency Declaration as String
-     */
-    public String getMavenDependencyDeclaration(ModuleInfo moduleInfo) {
-        StringBuilder sb = new StringBuilder();
-        sb.append("<dependency>\n");
-        sb.append("    <groupId>").append(moduleInfo.getOrganization()).append("</groupId>\n");
-        sb.append("    <artifactId>").append(moduleInfo.getModule()).append("</artifactId>\n");
-        sb.append("    <version>").append(moduleInfo.getBaseRevision());
-
-        String artifactRevisionIntegration = moduleInfo.getFileIntegrationRevision();
-        if (StringUtils.isNotBlank(artifactRevisionIntegration)) {
-            sb.append("-").append(artifactRevisionIntegration);
-        }
-        sb.append("</version>\n");
-
-        String classifier = moduleInfo.getClassifier();
-        if (StringUtils.isNotBlank(classifier)) {
-            sb.append("    <classifier>").append(classifier).append("</classifier>\n");
-        }
-
-        String ext = moduleInfo.getExt();
-        if (StringUtils.isNotBlank(ext) && !"jar".equalsIgnoreCase(ext)) {
-            sb.append("    <type>").append(moduleInfo.getExt()).append("</type>\n");
-        }
-
-        return sb.append("</dependency>").toString();
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/distributionmngt/DistributionManagement.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/distributionmngt/DistributionManagement.java
deleted file mode 100644
index 6ddde7b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/distributionmngt/DistributionManagement.java
+++ /dev/null
@@ -1,131 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.distributionmngt;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.repo.LocalCacheRepoDescriptor;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.rest.common.model.BaseModel;
-import org.artifactory.util.HttpUtils;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * @author Chen Keinan
- */
- at JsonIgnoreProperties({"repoKey", "path","httpServletRequest","firstIndention","secondIndention","isCache"})
-public class DistributionManagement extends BaseModel {
-
-    private String firstIndention = "";
-    private String secondIndention = "    ";
-    private boolean isCache = false;
-    private String distributedManagement;
-
-
-    public String getDistributedManagement() {
-        return distributedManagement;
-    }
-
-    public void setDistributedManagement(String distributedManagement) {
-        this.distributedManagement = distributedManagement;
-    }
-
-
-    public StringBuilder populateDistributionManagement(RepoDescriptor repo, CentralConfigService cc, HttpServletRequest httpServletRequest) {
-         final StringBuilder sb = new StringBuilder();
-        sb.delete(0, sb.length());
-         String id = cc.getServerName();
-        String repoUrl = buildRepoUrl(repo,httpServletRequest);
-        isCache = repo instanceof LocalRepoDescriptor && ((LocalRepoDescriptor)repo).isCache();
-
-        boolean handleReleases = false, handleSnapshots = false;
-        if (repo instanceof VirtualRepoDescriptor) {
-            VirtualRepoDescriptor virtualRepo = (VirtualRepoDescriptor)repo;
-            LocalRepoDescriptor defaultLocal = virtualRepo.getDefaultDeploymentRepo();
-            if (defaultLocal != null) {
-                handleReleases = defaultLocal.isHandleReleases();
-                handleSnapshots = defaultLocal.isHandleSnapshots();
-            }
-        }
-        else {
-            LocalRepoDescriptor localRepo = (LocalRepoDescriptor)repo;
-            handleReleases = localRepo.isHandleReleases();
-            handleSnapshots = localRepo.isHandleSnapshots();
-        }
-
-        setIndentions(isCache);
-        if (!isCache) {
-            sb.append("<distributionManagement>\n");
-        }
-        if (handleReleases) {
-            sb.append(firstIndention);
-            sb.append("<repository>\n");
-            sb.append(secondIndention);
-            sb.append("<id>");
-            sb.append("central");
-            sb.append("</id>\n");
-            sb.append(secondIndention);
-            sb.append("<name>");
-            sb.append(id);
-            sb.append("-releases</name>\n");
-            sb.append(secondIndention);
-            sb.append("<url>");
-            sb.append(repoUrl);
-            sb.append("</url>\n");
-            sb.append(firstIndention);
-            sb.append("</repository>\n");
-        }
-
-        if (handleSnapshots) {
-            sb.append(firstIndention);
-            sb.append("<snapshotRepository>\n");
-            sb.append(secondIndention);
-            sb.append("<id>");
-            sb.append("snapshots");
-            sb.append("</id>\n");
-            sb.append(secondIndention);
-            sb.append("<name>");
-            sb.append(id);
-            sb.append("-snapshots</name>\n");
-            sb.append(secondIndention);
-            sb.append("<url>");
-            sb.append(repoUrl);
-            sb.append("</url>\n");
-            sb.append(firstIndention);
-            sb.append("</snapshotRepository>\n");
-        }
-        if (!isCache) {
-            sb.append("</distributionManagement>");
-        }
-        return sb;
-    }
-
-    private String buildRepoUrl(RepoDescriptor repo,HttpServletRequest httpServletRequest) {
-        String servletContextUrl = HttpUtils.getServletContextUrl(httpServletRequest);
-        if (!servletContextUrl.endsWith("/")) {
-            servletContextUrl += "/";
-        }
-        StringBuilder sb = new StringBuilder();
-        if (repo instanceof LocalCacheRepoDescriptor) {
-            RemoteRepoDescriptor remoteRepoDescriptor = ((LocalCacheRepoDescriptor) repo).getRemoteRepo();
-            if (remoteRepoDescriptor != null) {
-                sb.append(servletContextUrl).append(remoteRepoDescriptor.getKey());
-            } else {
-                String fixedKey = StringUtils.remove(repo.getKey(), "-cache");
-                sb.append(servletContextUrl).append(fixedKey);
-            }
-        } else {
-            sb.append(servletContextUrl).append(repo.getKey());
-        }
-        return sb.toString();
-    }
-    private void setIndentions(boolean isCache) {
-        if (!isCache) {
-            firstIndention += "    ";
-            secondIndention += "    ";
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/includedRepositories/IncludedRepositories.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/includedRepositories/IncludedRepositories.java
deleted file mode 100644
index 85471cf..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/includedRepositories/IncludedRepositories.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.includedRepositories;
-
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.util.HttpUtils;
-import org.artifactory.util.PathUtils;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author chen Keinan
- */
-public class IncludedRepositories {
-
-    private List<Repository> repositories = new ArrayList<>();
-
-    public IncludedRepositories() {
-    }
-
-    public IncludedRepositories(List<RepoDescriptor> descriptors, HttpServletRequest request) {
-        String baseUrl = HttpUtils.getServletContextUrl(request);
-        String urlWithSlash = PathUtils.addTrailingSlash(baseUrl);
-        descriptors.forEach(descriptor -> repositories.add(new Repository(descriptor
-                , urlWithSlash + descriptor.getKey())));
-    }
-
-    public List<Repository> getRepositories() {
-        return repositories;
-    }
-
-    public void setRepositories(
-            List<Repository> repositories) {
-        this.repositories = repositories;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/includedRepositories/Repository.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/includedRepositories/Repository.java
deleted file mode 100644
index 315079a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/includedRepositories/Repository.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.includedRepositories;
-
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-
-/**
- * @author Chen Keinan
- */
-public class Repository {
-
-    private String repoKey;
-    private String linkUrl;
-    private String type;
-
-    public Repository() {
-        // For Jackson
-    }
-
-    public Repository(RepoDescriptor repoDescriptor, String linkUrl) {
-        this.repoKey = repoDescriptor.getKey();
-        this.linkUrl = linkUrl;
-        if (repoDescriptor instanceof VirtualRepoDescriptor) {
-            this.type = "virtual";
-        } else if (repoDescriptor instanceof RemoteRepoDescriptor) {
-            this.type = "remote";
-        } else if (repoDescriptor instanceof LocalRepoDescriptor) {
-            this.type = "local";
-        }
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    public String getLinkUrl() {
-        return linkUrl;
-    }
-
-    public void setLinkUrl(String linkUrl) {
-        this.linkUrl = linkUrl;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/info/ArchiveInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/info/ArchiveInfo.java
deleted file mode 100644
index 24290c6..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/info/ArchiveInfo.java
+++ /dev/null
@@ -1,114 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.info;
-
-import org.artifactory.fs.ZipEntryInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.nodes.archive.ArchiveTreeNode;
-
-/**
- * @author Chen Keinan
- */
-public class ArchiveInfo extends BaseInfo {
-
-    private String path;
-    private String size;
-    private String compressed;
-    private String modificationTime;
-    private String crc;
-    private String comments;
-
-    public ArchiveInfo(ZipEntryInfo zipData, ArchiveTreeNode archiveTreeNode) {
-        if (isRealZipEntry(zipData, archiveTreeNode)) {
-            updateInfoFromZipEntryData(zipData);
-        } else {
-            updateInfoFromArchiveData(archiveTreeNode);
-        }
-    }
-
-    /**
-     * check if entry origin from archive file or re-created during child entry processing
-     *
-     * @param zipData         - zip data
-     * @param archiveTreeNode - archive tree node
-     * @return
-     */
-    private boolean isRealZipEntry(ZipEntryInfo zipData, ArchiveTreeNode archiveTreeNode) {
-        return (!zipData.isDirectory() && !archiveTreeNode.isDirectory())
-                || (zipData.isDirectory() && archiveTreeNode.isDirectory());
-    }
-
-    /**
-     * update entry from auto created data during child node process
-     *
-     * @param archiveTreeNode - archive node
-     */
-    private void updateInfoFromArchiveData(ArchiveTreeNode archiveTreeNode) {
-        super.setName(archiveTreeNode.getText());
-        this.size = new Long(0).toString();
-        this.path = archiveTreeNode.getTempPath();
-        this.compressed = new Long(0).toString();
-        this.modificationTime = new Long(0).toString();
-        this.crc = new Long(0).toString();
-    }
-
-    /**
-     * update entry data from real archive entry
-     *
-     * @param zipData - real zip / archive data
-     */
-    private void updateInfoFromZipEntryData(ZipEntryInfo zipData) {
-        super.setName(zipData.getName());
-        this.size = new Long(zipData.getSize()).toString();
-        this.path = zipData.getPath();
-        this.compressed = new Long(zipData.getCompressedSize()).toString();
-        this.modificationTime = new Long(zipData.getTime()).toString();
-        this.crc = new Long(zipData.getCrc()).toString();
-        this.comments = zipData.getComment();
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    public String getSize() {
-        return size;
-    }
-
-    public void setSize(String size) {
-        this.size = size;
-    }
-
-    public String getCompressed() {
-        return compressed;
-    }
-
-    public void setCompressed(String compressed) {
-        this.compressed = compressed;
-    }
-
-    public String getModificationTime() {
-        return modificationTime;
-    }
-
-    public void setModificationTime(String modificationTime) {
-        this.modificationTime = modificationTime;
-    }
-
-    public String getCrc() {
-        return crc;
-    }
-
-    public void setCrc(String crc) {
-        this.crc = crc;
-    }
-
-    public String getComments() {
-        return comments;
-    }
-
-    public void setComments(String comments) {
-        this.comments = comments;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/info/BaseInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/info/BaseInfo.java
deleted file mode 100644
index b0a6ce9..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/info/BaseInfo.java
+++ /dev/null
@@ -1,180 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.info;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.replication.ReplicationAddon;
-import org.artifactory.addon.watch.ArtifactWatchAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.rest.replication.ReplicationStatus;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.replication.RemoteReplicationDescriptor;
-import org.artifactory.descriptor.repo.LocalCacheRepoDescriptor;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.fs.WatcherInfo;
-import org.artifactory.fs.WatchersInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.util.Pair;
-
-/**
- * @author Chen Keinan
- */
-public class BaseInfo {
-
-    protected final String SLASH = "/";
-    private String name;
-    private String repoType;
-    private String repositoryPath;
-    private String externalUrl;
-    private Boolean smartRepo;
-    private Boolean remoteDeleted;
-    private String bintrayUrl;
-    private String distPackageType;
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getRepositoryPath() {
-        return repositoryPath;
-    }
-
-    public void setRepositoryPath(String repositoryPath) {
-        this.repositoryPath = repositoryPath;
-    }
-
-    public Boolean getRemoteDeleted() {
-        return remoteDeleted;
-    }
-
-    public void setRemoteDeleted(Boolean remoteDeleted) {
-        this.remoteDeleted = remoteDeleted;
-    }
-
-    public String getBintrayUrl() {
-        return bintrayUrl;
-    }
-
-    public void setBintrayUrl(String bintrayUrl) {
-        this.bintrayUrl = bintrayUrl;
-    }
-
-    public String getDistPackageType() {
-        return distPackageType;
-    }
-
-    public void setDistPackageType(String distPackageType) {
-        this.distPackageType = distPackageType;
-    }
-
-    /**
-     * get watching since for specific repo path if exist
-     *
-     * @param userName - user watching
-     * @return - if not null - watching since in pretty date format
-     */
-    protected String fetchWatchingSince(String userName, RepoPath repoPath) {
-        String watchingSince = null;
-        ArtifactWatchAddon artifactWatchAddon = ContextHelper.get().beanForType(AddonsManager.class).addonByType(
-                ArtifactWatchAddon.class);
-        Pair<RepoPath, WatchersInfo> nearestWatchFound = artifactWatchAddon.getNearestWatchDefinition(repoPath,
-                userName);
-        if(nearestWatchFound != null) {
-            WatchersInfo watchers = nearestWatchFound.getSecond();
-            if (watchers != null) {
-                WatcherInfo watcher = watchers.getWatcher(userName);
-                if (watcher != null) {
-                    CentralConfigService centralConfig = ContextHelper.get().getCentralConfig();
-                    watchingSince = centralConfig.format(watcher.getWatchingSinceTime());
-
-                }
-            }
-        }
-
-        return watchingSince;
-    }
-
-    /**
-     * get last replication status for repo path if replication is enable
-     *
-     * @param repoPath - repository path
-     * @return - last replication status
-     */
-    protected String getLastReplicationInfo(RepoPath repoPath) {
-        String repoKey = repoPath.getRepoKey();
-        RepositoryService repositoryService = ContextHelper.get().getRepositoryService();
-        LocalRepoDescriptor repoDescriptor = repositoryService.localCachedOrDistributionRepoDescriptorByKey(repoKey);
-        final boolean isCache = repoDescriptor.isCache();
-        AuthorizationService authorizationService = ContextHelper.get().getAuthorizationService();
-        boolean isAdmin = authorizationService.isAdmin();
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        String lastReplicationStatus = null;
-        if (isAdmin) {
-            ReplicationAddon replicationAddon = addonsManager.addonByType(ReplicationAddon.class);
-            ReplicationStatus replicationStatus = replicationAddon.getReplicationStatus(repoPath);
-            if (replicationStatus != null && isReplicationEnabled(isCache, repoKey)) {
-                lastReplicationStatus = replicationStatus.getDisplayName();
-            }
-        }
-        return lastReplicationStatus;
-    }
-
-    /**
-     * check weather replication is enable
-     *
-     * @return - if true - replication is enable
-     */
-    private boolean isReplicationEnabled(boolean isCache, String repoKey) {
-        CentralConfigService centralConfigService = ContextHelper.get().getCentralConfig();
-        CentralConfigDescriptor descriptor = centralConfigService.getDescriptor();
-        if (isCache) {
-            return isRemoteReplicationEnabled(descriptor, repoKey);
-        } else {
-            return isLocalReplicationEnabled(descriptor, repoKey);
-        }
-    }
-
-    private boolean isRemoteReplicationEnabled(CentralConfigDescriptor descriptor, String repoKey) {
-        String remoteRepoKey = StringUtils.remove(repoKey, LocalCacheRepoDescriptor.PATH_SUFFIX);
-        RemoteReplicationDescriptor remoteReplication = descriptor.getRemoteReplication(remoteRepoKey);
-        boolean blockPullReplications = descriptor.getReplicationsConfig().isBlockPullReplications();
-        return remoteReplication != null && remoteReplication.isEnabled() && ! blockPullReplications;
-    }
-
-    private boolean isLocalReplicationEnabled(CentralConfigDescriptor descriptor, String repoKey) {
-        LocalReplicationDescriptor localReplication = descriptor.getLocalReplication(repoKey);
-        boolean blockPushReplications = descriptor.getReplicationsConfig().isBlockPushReplications();
-        return localReplication != null && localReplication.isEnabled() && !blockPushReplications;
-    }
-
-    public String getRepoType() {
-        return repoType;
-    }
-
-    public void setRepoType(String repoType) {
-        this.repoType = repoType;
-    }
-
-    public void setSmartRepo(Boolean smartRepo) {
-        this.smartRepo = smartRepo;
-    }
-
-    public Boolean isSmartRepo() {
-        return smartRepo;
-    }
-
-    public String getExternalUrl() {
-        return externalUrl;
-    }
-
-    public void setExternalUrl(String externalUrl) {
-        this.externalUrl = externalUrl;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/info/FileInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/info/FileInfo.java
deleted file mode 100644
index 9e39aa5..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/info/FileInfo.java
+++ /dev/null
@@ -1,401 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.info;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.Sets;
-import org.artifactory.addon.AddonType;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.blackduck.BlackDuckAddon;
-import org.artifactory.addon.filteredresources.FilteredResourcesAddon;
-import org.artifactory.addon.license.LicensesAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.license.LicenseInfo;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.repo.BaseBrowsableItem;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.api.storage.StorageUnit;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.fs.StatsInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.licenses.GeneralTabLicenseModel;
-import org.codehaus.jackson.annotate.JsonPropertyOrder;
-
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * @author Chen Keinan
- */
- at JsonPropertyOrder(
-    {
-        "name", "repositoryPath",
-        "moduleID","deployedBy", "size", "created", "lastModified", "licenses", "downloaded",
-        "lastDownloadedBy", "lastDownloaded", "remoteDownloaded", "lastRemoteDownloadedBy", "lastRemoteDownloaded",
-        "watchingSince", "showFilteredResourceCheckBox","filtered"
-    }
-)
-public class FileInfo extends BaseInfo {
-
-    private String moduleID;
-    private String deployedBy;
-    private String size;
-    private String created;
-    private String lastModified;
-    Set<GeneralTabLicenseModel> licenses = Sets.newHashSet();
-
-    private Long downloaded;
-    private String lastDownloaded;
-    private String lastDownloadedBy;
-
-    private Long remoteDownloaded;
-    private String lastRemoteDownloaded;
-    private String lastRemoteDownloadedBy;
-
-    private String watchingSince;
-    private String lastReplicationStatus;
-    private Boolean filtered;
-    private Boolean showFilteredResourceCheckBox;
-
-    public String getSize() {
-        return size;
-    }
-
-    public void setSize(String size) {
-        this.size = size;
-    }
-
-    public String getLastModified() {
-        return lastModified;
-    }
-
-    public void setLastModified(String lastModified) {
-        this.lastModified = lastModified;
-    }
-
-    public String getModuleID() {
-        return moduleID;
-    }
-
-    public void setModuleID(String moduleID) {
-        this.moduleID = moduleID;
-    }
-
-    public Set<GeneralTabLicenseModel> getLicenses() {
-        return licenses;
-    }
-
-    public void setLicenses(Set<GeneralTabLicenseModel> licenses) {
-        this.licenses = licenses;
-    }
-
-    public Boolean getFiltered() {
-        return filtered;
-    }
-
-    public void setFiltered(Boolean filtered) {
-        this.filtered = filtered;
-    }
-
-    public Boolean getShowFilteredResourceCheckBox() {
-        return showFilteredResourceCheckBox;
-    }
-
-    public void setShowFilteredResourceCheckBox(Boolean showFilteredResourceCheckBox) {
-        this.showFilteredResourceCheckBox = showFilteredResourceCheckBox;
-    }
-
-    public Long getDownloaded() {
-        return downloaded;
-    }
-
-    public void setDownloaded(Long downloaded) {
-        this.downloaded = downloaded;
-    }
-
-    public String getLastDownloaded() {
-        return lastDownloaded;
-    }
-
-    public void setLastDownloaded(String lastDownloaded) {
-        this.lastDownloaded = lastDownloaded;
-    }
-
-    public String getLastDownloadedBy() {
-        return lastDownloadedBy;
-    }
-
-    public void setLastDownloadedBy(String lastDownloadedBy) {
-        this.lastDownloadedBy = lastDownloadedBy;
-    }
-
-    public String getDeployedBy() {
-        return deployedBy;
-    }
-
-    public void setDeployedBy(String deployedBy) {
-        this.deployedBy = deployedBy;
-    }
-
-    public String getCreated() {
-        return created;
-    }
-
-    public void setCreated(String created) {
-        this.created = created;
-    }
-
-    public String getWatchingSince() {
-        return watchingSince;
-    }
-
-    public void setWatchingSince(String watchingSince) {
-        this.watchingSince = watchingSince;
-    }
-
-    public String getLastReplicationStatus() {
-        return lastReplicationStatus;
-    }
-
-    public void setLastReplicationStatus(String lastReplicationStatus) {
-        this.lastReplicationStatus = lastReplicationStatus;
-    }
-
-    /**
-     * populate File info data
-     *
-     * @param repoService          -repository service
-     * @param repoPath             - repo path
-     * @param centralConfigService - central config service
-     */
-    public void populateFileInfo(RepositoryService repoService, RepoPath repoPath,
-                                 CentralConfigService centralConfigService, AuthorizationService authService,
-                                 boolean isBlackDuckEnabled) {
-        // update name
-        this.setName(repoPath.getName());
-        // update path
-        this.setRepositoryPath(repoPath.getRepoKey()+"/"+repoPath.getPath());
-        ItemInfo itemInfo = repoService.getItemInfo(repoPath);
-        // update file info created
-        updateFileInfoCreated(centralConfigService, itemInfo);
-        // update deployed by
-        this.setDeployedBy(itemInfo.getModifiedBy());
-        // update last modified
-        updateFileInfoLastModified(centralConfigService, itemInfo);
-        // update size
-        this.setSize(StorageUnit.toReadableString(((org.artifactory.fs.FileInfo) itemInfo).getSize()));
-        // update file filtered module id
-        updateFileInfoModuleID(repoService, repoPath);
-        // update filtered file info
-        updateFilteredResourceInfo(repoPath, authService);
-        // update file info stats
-        updateFileInfoStats(repoService, repoPath, centralConfigService);
-        // update file info licenses
-        updateFileInfoLicenses(repoPath, itemInfo, isBlackDuckEnabled);
-        // set watching since
-        setWatchingSince(fetchWatchingSince(authService.currentUsername(), repoPath));
-        // set last replication status
-        setLastReplicationStatus(getLastReplicationInfo(repoPath));
-        // set RemoteDeleted indication and externalUrl from properties
-        updateFileProperties(repoPath, repoService);
-    }
-
-    /**
-     * If SmartRepo is on and file was deleted on attached
-     * (remote) artifactory instance, this method will set
-     * remoteDeleted = True;
-     *
-     * @param repoPath
-     * @param repoService
-     */
-    private void updateFileProperties(RepoPath repoPath, RepositoryService repoService) {
-        Properties properties = repoService.getProperties(repoPath);
-        if (properties != null) {
-            this.setExternalUrl(properties.getFirst("externalUrl"));
-            if (isSmartRepo()!= null && isSmartRepo().booleanValue()) {
-                if (properties != null) {
-                    this.setRemoteDeleted(Boolean.valueOf(
-                            !properties.entries().parallelStream()
-                                    .filter(p -> p.getKey().equals("sourceDeleted") && p.getValue().equals("true"))
-                                    .collect(Collectors.toList()).isEmpty()
-                            )
-                    );
-                }
-            }
-        }
-    }
-
-    /**
-     * update file info statistics data
-     *
-     * @param repoService          - repository service
-     * @param repoPath             - repository path
-     * @param centralConfigService - central config service
-     */
-    private void updateFileInfoStats(RepositoryService repoService, RepoPath repoPath,
-                                     CentralConfigService centralConfigService) {
-        StatsInfo statsInfo = repoService.getStatsInfo(repoPath);
-        if (statsInfo == null) {
-            statsInfo = InfoFactoryHolder.get().createStats();
-        }
-
-        // local stats
-        this.setDownloaded(statsInfo.getDownloadCount());
-        this.setLastDownloadedBy(statsInfo.getLastDownloadedBy());
-        if (statsInfo.getLastDownloaded() != 0) {
-            String lastDownloadedString = centralConfigService.format(statsInfo.getLastDownloaded());
-            this.setLastDownloaded(lastDownloadedString);
-        }
-
-        // remote stats
-        this.setRemoteDownloaded(statsInfo.getRemoteDownloadCount());
-        if (Strings.isNullOrEmpty(statsInfo.getOrigin())) {
-            this.setLastRemoteDownloadedBy(statsInfo.getRemoteLastDownloadedBy());
-        } else {
-            this.setLastRemoteDownloadedBy(statsInfo.getRemoteLastDownloadedBy() + "@" + statsInfo.getOrigin());
-        }
-        if (statsInfo.getRemoteLastDownloaded() != 0) {
-            String lastRemoteDownloadedString = centralConfigService.format(statsInfo.getRemoteLastDownloaded());
-            this.setLastRemoteDownloaded(lastRemoteDownloadedString);
-        }
-    }
-
-    /**
-     * update fine info created
-     *
-     * @param centralConfigService - central configuration service
-     * @param itemInfo             - item info
-     */
-    private void updateFileInfoCreated(CentralConfigService centralConfigService, ItemInfo itemInfo) {
-        String created = centralConfigService.format(itemInfo.getCreated());
-        this.setCreated(created);
-    }
-
-    /**
-     * update fine info created
-     *
-     * @param centralConfigService - central configuration service
-     * @param itemInfo             - item info
-     */
-    private void updateFileInfoLastModified(CentralConfigService centralConfigService, ItemInfo itemInfo) {
-        String created = centralConfigService.format(itemInfo.getLastModified());
-        this.setLastModified(created);
-    }
-
-    /**
-     * update file info module id
-     *
-     * @param repoService - repository service
-     * @param repoPath    - repository path
-     */
-    private void updateFileInfoModuleID(RepositoryService repoService, RepoPath repoPath) {
-        ModuleInfo moduleInfo = repoService.getItemModuleInfo(repoPath);
-        String moduleID;
-        if (moduleInfo.isValid()) {
-            moduleID = moduleInfo.getPrettyModuleId();
-        } else {
-            moduleID = "N/A";
-        }
-        this.setModuleID(moduleID);
-    }
-
-    /**
-     * update file filtered info
-     */
-    private void updateFilteredResourceInfo(RepoPath path, AuthorizationService authService) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        if (authService.canAnnotate(path) && addonsManager.isAddonSupported(AddonType.FILTERED_RESOURCES)) {
-            showFilteredResourceCheckBox = true;
-            filtered = addonsManager.addonByType(FilteredResourcesAddon.class).isFilteredResourceFile(path);
-        } else {
-            showFilteredResourceCheckBox = false;
-        }
-    }
-
-    /**
-     * Returns a list of all licenses set as properties on this path, including black duck licenses if available
-     */
-    private void updateFileInfoLicenses(RepoPath path, ItemInfo itemInfo, boolean isBlackDuckEnabled) {
-        boolean hasLicenses = false;
-        if (itemInfo.isFolder()) {
-            return;
-        }
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        if (isBlackDuckEnabled) {
-            Set<String> pathLicensesFromProperties = addonsManager.addonByType(
-                    BlackDuckAddon.class).getPathLicensesFromProperties(path);
-            if (pathLicensesFromProperties != null) {
-                hasLicenses = true;
-                List<GeneralTabLicenseModel> licenseModels = pathLicensesFromProperties
-                        .stream()
-                        .map(GeneralTabLicenseModel::blackDuckOf)
-                        .collect(Collectors.toList());
-                licenses.addAll(licenseModels);
-
-            }
-        } else {
-            Set<LicenseInfo> pathLicensesByProps = addonsManager.addonByType(
-                    LicensesAddon.class).getPathLicensesByProps(path);
-            if (pathLicensesByProps != null) {
-                hasLicenses = true;
-                licenses.addAll(pathLicensesByProps
-                        .stream()
-                        .map(GeneralTabLicenseModel::new)
-                        .collect(Collectors.toList()));
-
-                //Remove not found - UI gets an empty array and handles.
-                licenses.remove(GeneralTabLicenseModel.NOT_FOUND);
-            }
-        }
-        if (!hasLicenses) {
-            licenses = null;
-        }
-    }
-
-    /**
-     * populate remote / virtual file info
-     *
-     * @param item - remote virtual browsable item
-     */
-    public void populateVirtualRemoteFileInfo(BaseBrowsableItem item) {
-        CentralConfigService centralConfig = ContextHelper.get().getCentralConfig();
-        // update name
-        this.setName(item.getName());
-        // update path
-        this.setRepositoryPath(item.getRepoKey() + "/" + item.getRelativePath());
-        // init licenses to null not require for remove and virtual
-        licenses = null;
-        if (!item.isRemote()) {
-            this.setCreated(centralConfig.format(item.getCreated()));
-            this.setLastModified(centralConfig.format(item.getLastModified()));
-            this.setSize(StorageUnit.toReadableString(item.getSize()));
-        }
-    }
-
-    public Long getRemoteDownloaded() {
-        return remoteDownloaded;
-    }
-
-    public void setRemoteDownloaded(Long remoteDownloaded) {
-        this.remoteDownloaded = remoteDownloaded;
-    }
-
-    public String getLastRemoteDownloaded() {
-        return lastRemoteDownloaded;
-    }
-
-    public void setLastRemoteDownloaded(String lastRemoteDownloaded) {
-        this.lastRemoteDownloaded = lastRemoteDownloaded;
-    }
-
-    public String getLastRemoteDownloadedBy() {
-        return lastRemoteDownloadedBy;
-    }
-
-    public void setLastRemoteDownloadedBy(String lastRemoteDownloadedBy) {
-        this.lastRemoteDownloadedBy = lastRemoteDownloadedBy;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/info/FolderInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/info/FolderInfo.java
deleted file mode 100644
index ba7fd4f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/info/FolderInfo.java
+++ /dev/null
@@ -1,168 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.info;
-
-import org.apache.commons.lang.time.DurationFormatUtils;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.BaseBrowsableItem;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.repo.BintrayApplicationConfig;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.util.PathUtils;
-import org.artifactory.util.distribution.DistributionConstants;
-import org.codehaus.jackson.annotate.JsonPropertyOrder;
-
-/**
- * @author Chen Keinan
- */
- at JsonPropertyOrder(
-    {
-        "name", "repositoryPath", "distPackageType", "bintrayUrl",
-        "deployedBy", "artifactsCount", "created", "watchingSince", "lastReplicationStatus"
-    }
-)
-public class FolderInfo extends BaseInfo {
-
-    private String deployedBy;
-    private String created;
-    private String watchingSince;
-    private String lastReplicationStatus;
-    private int artifactsCount;
-    private String distPackageType;
-
-    public String getDeployedBy() {
-        return deployedBy;
-    }
-
-    public void setDeployedBy(String deployedBy) {
-        this.deployedBy = deployedBy;
-    }
-
-    /**
-     * populate folder info data
-     *
-     * @param repoService          -repository service
-     * @param repoPath             - repo path
-     * @param centralConfigService - central config service
-     * @return
-     */
-    public void populateFolderInfo(RepositoryService repoService, RepoPath repoPath,
-                                   CentralConfigService centralConfigService, String userName) {
-        // set name
-        this.setName(repoPath.getName());
-        // set repository path
-        this.setRepositoryPath(repoPath.getRepoKey() + SLASH + repoPath.getPath() + SLASH);
-        ItemInfo itemInfo = repoService.getItemInfo(repoPath);
-        // set watching since
-        setWatchingSince(fetchWatchingSince(userName, repoPath));
-        // set created
-        setCreated(centralConfigService, itemInfo);
-        // set deployed by
-        this.setDeployedBy(itemInfo.getModifiedBy());
-        // set last replication status
-        setLastReplicationStatus(getLastReplicationInfo(repoPath));
-        setBintrayUrl(fetchBintrayUrl(repoService, repoPath));
-        setDistPackageType(fetchDistributionPackageType(repoService, repoPath));
-    }
-
-    private String fetchDistributionPackageType(RepositoryService repoService, RepoPath repoPath) {
-        LocalRepoDescriptor repoDescriptor = repoService.localCachedOrDistributionRepoDescriptorByKey(repoPath.getRepoKey());
-        if (repoDescriptor != null && repoDescriptor instanceof DistributionRepoDescriptor) {
-            Properties properties = repoService.getProperties(repoPath);
-            if (properties != null) {
-                return properties.getFirst(DistributionConstants.ARTIFACT_TYPE_OVERRIDE_PROP);
-            }
-        }
-        return null;
-    }
-
-    private String fetchBintrayUrl(RepositoryService repoService, RepoPath repoPath) {
-        LocalRepoDescriptor repoDescriptor = repoService.localCachedOrDistributionRepoDescriptorByKey(repoPath.getRepoKey());
-        if (repoDescriptor != null && repoDescriptor instanceof DistributionRepoDescriptor) {
-            DistributionRepoDescriptor descriptor = (DistributionRepoDescriptor) repoDescriptor;
-            BintrayApplicationConfig bintrayApplication = descriptor.getBintrayApplication();
-            if (bintrayApplication != null) {
-                String path = repoPath.getPath();
-                boolean isFileOrFolder = PathUtils.getPathElements(path).length > 3;
-                if (!isFileOrFolder) {
-                    return ConstantValues.bintrayUrl.getString() + "/" + bintrayApplication.getOrg() + "/" + path;
-                }
-            }
-        }
-        return null;
-    }
-
-    public String getCreated() {
-        return created;
-    }
-
-    public void setCreated(String created) {
-        this.created = created;
-    }
-
-    public String getWatchingSince() {
-        return watchingSince;
-    }
-
-    public void setWatchingSince(String watchingSince) {
-        this.watchingSince = watchingSince;
-    }
-
-    public String getLastReplicationStatus() {
-        return lastReplicationStatus;
-    }
-
-    public void setLastReplicationStatus(String lastReplicationStatus) {
-        this.lastReplicationStatus = lastReplicationStatus;
-    }
-
-    public int getArtifactsCount() {
-        return artifactsCount;
-    }
-
-    public void setArtifactsCount(int artifactsCount) {
-        this.artifactsCount = artifactsCount;
-    }
-
-    @Override
-    public String getDistPackageType() {
-        return distPackageType;
-    }
-
-    @Override
-    public void setDistPackageType(String distPackageType) {
-        this.distPackageType = distPackageType;
-    }
-
-    /**
-     * @param item
-     */
-    public void populateVirtualRemoteFolderInfo(BaseBrowsableItem item) {
-        CentralConfigService centralConfig = ContextHelper.get().getCentralConfig();
-        // set name
-        this.setName(item.getName());
-        // set repository path
-        this.setRepositoryPath(item.getRepoKey() + SLASH + item.getRelativePath() + SLASH);
-
-        if (!item.isRemote()) {
-            this.setCreated(centralConfig.format(item.getCreated()));
-        }
-    }
-
-    /**
-     * set created data
-     *
-     * @param centralConfigService - central configuration service
-     * @param itemInfo             - item info
-     */
-    private void setCreated(CentralConfigService centralConfigService, ItemInfo itemInfo) {
-        String created = centralConfigService.format(itemInfo.getCreated()) + " " + DurationFormatUtils.formatDuration(
-                System.currentTimeMillis() - itemInfo.getCreated(), "(d'd' H'h' m'm' s's' ago)");
-        this.setCreated(created);
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/info/RepositoryInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/info/RepositoryInfo.java
deleted file mode 100644
index 3075eae..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/info/RepositoryInfo.java
+++ /dev/null
@@ -1,238 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.info;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.descriptor.repo.BintrayApplicationConfig;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoBaseDescriptor;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.RepoPath;
-import org.codehaus.jackson.annotate.JsonPropertyOrder;
-
-/**
- * @author Chen Keinan
- */
- at JsonPropertyOrder(
-    {
-        "name", "repoType", "repositoryPath", "repositoryLayout","description", "artifactsCount", "bintrayOrg", "bintrayProduct",
-            "created", "watchingSince", "lastReplicationStatus", "signingKeyLink"
-    }
-)
-public class RepositoryInfo extends BaseInfo {
-    private String remoteRepoUrl;
-    private String repositoryLayout;
-    private String description;
-    private int artifactsCount;
-    private String bintrayOrg;
-    private String bintrayProduct;
-    private String created;
-    private String watchingSince;
-    private String lastReplicationStatus;
-    private String signingKeyLink;
-
-    public String getCreated() {
-        return created;
-    }
-
-    public void setCreated(String created) {
-        this.created = created;
-    }
-
-    public String getWatchingSince() {
-        return watchingSince;
-    }
-
-    public void setWatchingSince(String watchingSince) {
-        this.watchingSince = watchingSince;
-    }
-
-    public String getLastReplicationStatus() {
-        return lastReplicationStatus;
-    }
-
-    public void setLastReplicationStatus(String lastReplicationStatus) {
-        this.lastReplicationStatus = lastReplicationStatus;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public String getRepositoryLayout() {
-        return repositoryLayout;
-    }
-
-    public void setRepositoryLayout(String repositoryLayout) {
-        this.repositoryLayout = repositoryLayout;
-    }
-
-    public String getSigningKeyLink() {
-        return signingKeyLink;
-    }
-
-    public void setSigningKeyLink(String signingKeyLink) {
-        this.signingKeyLink = signingKeyLink;
-    }
-
-    public int getArtifactsCount() {
-        return artifactsCount;
-    }
-
-    public void setArtifactsCount(int artifactsCount) {
-        this.artifactsCount = artifactsCount;
-    }
-
-    public String getBintrayOrg() {
-        return bintrayOrg;
-    }
-
-    public void setBintrayOrg(String bintrayOrg) {
-        this.bintrayOrg = bintrayOrg;
-    }
-
-    public String getBintrayProduct() {
-        return bintrayProduct;
-    }
-
-    public void setBintrayProduct(String bintrayProduct) {
-        this.bintrayProduct = bintrayProduct;
-    }
-
-    /**
-     * populate Repository info data
-     * @param repoService  -repository service
-     * @param repoDescriptor - repo descriptor
-     * @param repoPath - repo path
-     * @param centralConfigService - central config service
-     * @return
-     */
-    public void populateRepositoryInfo(RepositoryService repoService ,
-            LocalRepoDescriptor repoDescriptor,RepoPath repoPath,
-            CentralConfigService centralConfigService, String userName) {
-
-        // set repository description
-        setRepositoryDescription(repoDescriptor);
-        // repository name
-        this.setName(repoPath.getRepoKey());
-        // set repository path
-        this.setRepositoryPath(repoPath.getRepoKey() + SLASH);
-        // set repository layout
-        setRepositoryLayout(repoDescriptor);
-        // set created since data
-        setCreatedSinceData(repoService, repoPath, centralConfigService, userName);
-        // set last replication status
-        setLastReplicationStatus(getLastReplicationInfo(repoPath));
-
-        setRepoType(repoDescriptor.getType().name());
-
-        setDistributionDetails(repoDescriptor);
-    }
-
-    /**
-     * populate Repository info data
-     *
-     * @param repoDescriptor - repo descriptor
-     * @param repoPath       - repo path
-     * @return
-     */
-    public void populateVirtualRepositoryInfo(RepoBaseDescriptor repoDescriptor, RepoPath repoPath) {
-        // set repository description
-        setRepositoryDescription(repoDescriptor);
-        // repository name
-        this.setName(repoPath.getRepoKey());
-        // set repository path
-        this.setRepositoryPath(repoPath.getRepoKey() + SLASH);
-        // set repository layout
-        setRepositoryLayout(repoDescriptor);
-
-        setRepoType(repoDescriptor.getType().name());
-    }
-
-    /**
-     * populate Repository info data
-     *
-     * @param repoDescriptor - repo descriptor
-     * @param repoPath       - repo path
-     * @return
-     */
-    public void populateRemoteRepositoryInfo(RepoBaseDescriptor repoDescriptor, RepoPath repoPath) {
-        // set repository description
-        setRepositoryDescription(repoDescriptor);
-        // repository name
-        this.setName(repoPath.getRepoKey());
-        // set repository path
-        this.setRepositoryPath(repoPath.getRepoKey() + SLASH);
-        // set repository url
-        setRemoteRepositoryUrl(repoDescriptor);
-
-        setRepoType(repoDescriptor.getType().name());
-
-        setIsSmart(repoDescriptor);
-    }
-
-    private void setIsSmart(RepoBaseDescriptor repoDescriptor) {
-        if (repoDescriptor != null) {
-            this.setSmartRepo(((RemoteRepoDescriptor) repoDescriptor)
-                    .getContentSynchronisation().isEnabled());
-        }
-    }
-
-    private void setRemoteRepositoryUrl(RepoBaseDescriptor repoDescriptor) {
-        if (repoDescriptor != null) {
-            this.setRemoteRepoUrl(((RemoteRepoDescriptor) repoDescriptor).getUrl());
-        }
-    }
-
-    private void setRepositoryDescription(RepoBaseDescriptor repoDescriptor) {
-        if (repoDescriptor != null) {
-            this.setDescription(repoDescriptor.getDescription());
-        }
-    }
-
-    private void setRepositoryLayout(RepoBaseDescriptor repoDescriptor) {
-        if (repoDescriptor != null && repoDescriptor.getRepoLayout() != null) {
-            this.setRepositoryLayout(repoDescriptor.getRepoLayout().getName());
-        }
-    }
-
-    private void setDistributionDetails(LocalRepoDescriptor repoDescriptor) {
-        if (repoDescriptor != null && repoDescriptor instanceof DistributionRepoDescriptor) {
-            DistributionRepoDescriptor descriptor = (DistributionRepoDescriptor) repoDescriptor;
-            BintrayApplicationConfig bintrayApplication = descriptor.getBintrayApplication();
-            if (bintrayApplication != null) {
-                this.setBintrayOrg(bintrayApplication.getOrg());
-            }
-            this.setBintrayProduct(descriptor.getProductName());
-        }
-    }
-
-    /**
-     * set created since data
-     *
-     * @param repoService          - repository service
-     * @param repoPath             - repository path
-     * @param centralConfigService - central config service
-     * @param userName             - user name
-     */
-    private void setCreatedSinceData(RepositoryService repoService, RepoPath repoPath, CentralConfigService centralConfigService, String userName) {
-        ItemInfo itemInfo = repoService.getItemInfo(repoPath);
-        setWatchingSince(fetchWatchingSince(userName, repoPath));
-        String created = centralConfigService.format(itemInfo.getCreated());
-        this.setCreated(created);
-    }
-
-    public String getRemoteRepoUrl() {
-        return remoteRepoUrl;
-    }
-
-    public void setRemoteRepoUrl(String remoteRepoUrl) {
-        this.remoteRepoUrl = remoteRepoUrl;
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/licenses/GeneralTabLicenseModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/licenses/GeneralTabLicenseModel.java
deleted file mode 100644
index 4f4bdf2..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/licenses/GeneralTabLicenseModel.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.licenses;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.blackduck.BlackDuckAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.license.LicenseInfo;
-import org.artifactory.rest.common.model.BaseModel;
-import org.codehaus.jackson.annotate.JsonIgnore;
-
-/**
- * @author Dan Feldman
- */
-public class GeneralTabLicenseModel extends BaseModel {
-
-    private String name;
-    private String url;
-    private Boolean approved = null;
-
-    @JsonIgnore
-    public static final GeneralTabLicenseModel NOT_FOUND = createNotFound();
-
-    public GeneralTabLicenseModel() {
-
-    }
-
-    public GeneralTabLicenseModel(String name) {
-        this.name = name;
-        this.url = null;
-    }
-
-    /**
-     * Constructor for Black Duck licenses retrieved from props
-     */
-    public static GeneralTabLicenseModel blackDuckOf(String name) {
-        GeneralTabLicenseModel model = new GeneralTabLicenseModel();
-        model.name = name;
-        model.url = getLicenseUrl(name);
-        return model;
-    }
-
-    /**
-     * Constructor for licenseInfo
-     */
-    public GeneralTabLicenseModel(LicenseInfo licenseInfo) {
-        if (licenseInfo.getName().equals(LicenseInfo.UNKNOWN)) {
-            this.name = LicenseInfo.UNKNOWN + "(" + licenseInfo.getLongName() + ")";
-            this.approved = false;
-        } else {
-            this.name = licenseInfo.getName();
-            this.approved = licenseInfo.isApproved();
-        }
-        this.url = StringUtils.isNotBlank(licenseInfo.getUrl()) ? licenseInfo.getUrl() : null;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    public Boolean getApproved() {
-        return approved;
-    }
-
-    public void setApproved(Boolean approved) {
-        this.approved = approved;
-    }
-
-    private static String getLicenseUrl(String license) {
-        return ContextHelper.get().beanForType(AddonsManager.class).addonByType(BlackDuckAddon.class)
-                .getLicenseUrl(license);
-    }
-
-    @JsonIgnore
-    private static GeneralTabLicenseModel createNotFound() {
-        GeneralTabLicenseModel notFound = new GeneralTabLicenseModel();
-        notFound.url = "";
-        notFound.approved = false;
-        notFound.name = LicenseInfo.NOT_FOUND;
-        return notFound;
-    }
-
-    @JsonIgnore
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof GeneralTabLicenseModel)) return false;
-
-        GeneralTabLicenseModel that = (GeneralTabLicenseModel) o;
-
-        if (getName() != null ? !getName().equals(that.getName()) : that.getName() != null) return false;
-        if (getUrl() != null ? !getUrl().equals(that.getUrl()) : that.getUrl() != null) return false;
-        return !(getApproved() != null ? !getApproved().equals(that.getApproved()) : that.getApproved() != null);
-
-    }
-
-    @JsonIgnore
-    @Override
-    public int hashCode() {
-        int result = getName() != null ? getName().hashCode() : 0;
-        result = 31 * result + (getUrl() != null ? getUrl().hashCode() : 0);
-        result = 31 * result + (getApproved() != null ? getApproved().hashCode() : 0);
-        return result;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/relatedrepositories/RelatedRepositories.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/relatedrepositories/RelatedRepositories.java
deleted file mode 100644
index 7f0069c..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/relatedrepositories/RelatedRepositories.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.relatedrepositories;
-
-import org.artifactory.api.repo.VirtualBrowsableItem;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class RelatedRepositories {
-
-    private List<String> relatedRepositories;
-
-    public RelatedRepositories() {
-    }
-
-    public List<String> getRelatedRepositories() {
-        return relatedRepositories;
-    }
-
-    public void setRelatedRepositories(List<String> relatedRepositories) {
-        this.relatedRepositories = relatedRepositories;
-    }
-
-    /**
-     * populate virtual repositories list
-     */
-    public void populateRelatedRepositories(VirtualBrowsableItem virtualBrowsableItem) {
-        this.setRelatedRepositories(virtualBrowsableItem.getRepoKeys());
-    }
-
-    /**
-     * populate virtual repositories list
-     */
-    public void populateRelatedRepositories(List<RepoDescriptor> repoDescriptors) {
-        List<String> relatedRepositories = new ArrayList<>();
-        repoDescriptors.forEach(repoDescriptor -> relatedRepositories.add(repoDescriptor.getKey()));
-        this.setRelatedRepositories(relatedRepositories);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/trash/TrashItemDetails.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/trash/TrashItemDetails.java
deleted file mode 100644
index 1e6a92f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/trash/TrashItemDetails.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.trash;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.trash.TrashService;
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Shay Yaakov
- */
-public class TrashItemDetails extends BaseModel {
-
-    private String deletedTime;
-    private String deletedBy;
-    private String originalRepository;
-    private String originalRepositoryType;
-    private String originalPath;
-
-    public TrashItemDetails() {
-    }
-
-    public TrashItemDetails(Properties properties) {
-        String deleted = properties.getFirst(TrashService.PROP_TRASH_TIME);
-        if (StringUtils.isNotBlank(deleted)) {
-            deletedTime = ContextHelper.get().getCentralConfig().format(Long.parseLong(deleted));
-        }
-        deletedBy = properties.getFirst(TrashService.PROP_DELETED_BY);
-        originalRepository = properties.getFirst(TrashService.PROP_ORIGIN_REPO);
-        originalRepositoryType = properties.getFirst(TrashService.PROP_ORIGIN_REPO_TYPE);
-        originalPath = properties.getFirst(TrashService.PROP_ORIGIN_PATH);
-    }
-
-    public String getDeletedTime() {
-        return deletedTime;
-    }
-
-    public void setDeletedTime(String deletedTime) {
-        this.deletedTime = deletedTime;
-    }
-
-    public String getDeletedBy() {
-        return deletedBy;
-    }
-
-    public void setDeletedBy(String deletedBy) {
-        this.deletedBy = deletedBy;
-    }
-
-    public String getOriginalRepository() {
-        return originalRepository;
-    }
-
-    public void setOriginalRepository(String originalRepository) {
-        this.originalRepository = originalRepository;
-    }
-
-    public String getOriginalRepositoryType() {
-        return originalRepositoryType;
-    }
-
-    public void setOriginalRepositoryType(String originalRepositoryType) {
-        this.originalRepositoryType = originalRepositoryType;
-    }
-
-    public String getOriginalPath() {
-        return originalPath;
-    }
-
-    public void setOriginalPath(String originalPath) {
-        this.originalPath = originalPath;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/virtualrepositories/VirtualRepositories.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/virtualrepositories/VirtualRepositories.java
deleted file mode 100644
index 01069ef..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/virtualrepositories/VirtualRepositories.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.virtualrepositories;
-
-import com.google.common.collect.Lists;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-import org.artifactory.util.PathUtils;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class VirtualRepositories {
-
-    private List<VirtualRepository> virtualRepositories = Lists.newArrayList();
-
-    public VirtualRepositories() {
-        // For Jackson
-    }
-
-    public VirtualRepositories(List<VirtualRepoDescriptor> virtualRepoList, String baseURL) {
-        String urlWithSlash = PathUtils.addTrailingSlash(baseURL);
-        virtualRepoList.forEach(descriptor ->
-                this.virtualRepositories.add(new VirtualRepository(descriptor.getKey(),
-                        urlWithSlash + descriptor.getKey())));
-    }
-
-    public List<VirtualRepository> getVirtualRepositories() {
-        return virtualRepositories;
-    }
-
-    public void setVirtualRepositories(
-            List<VirtualRepository> virtualRepositories) {
-        this.virtualRepositories = virtualRepositories;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/virtualrepositories/VirtualRepository.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/virtualrepositories/VirtualRepository.java
deleted file mode 100644
index 434511d..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/general/virtualrepositories/VirtualRepository.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.virtualrepositories;
-
-/**
- * @author Shay Yaakov
- */
-public class VirtualRepository {
-
-    private String repoKey;
-    private String linkUrl;
-
-    public VirtualRepository() {
-        // For Jackson
-    }
-
-    public VirtualRepository(String repoKey, String linkUrl) {
-        this.repoKey = repoKey;
-        this.linkUrl = linkUrl;
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    public String getLinkUrl() {
-        return linkUrl;
-    }
-
-    public void setLinkUrl(String linkUrl) {
-        this.linkUrl = linkUrl;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/npm/NpmArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/npm/NpmArtifactInfo.java
deleted file mode 100644
index 0a09b6a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/npm/NpmArtifactInfo.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.npm;
-
-import org.artifactory.addon.npm.NpmDependency;
-import org.artifactory.addon.npm.NpmInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.BaseArtifactInfo;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class NpmArtifactInfo extends BaseArtifactInfo {
-
-    private NpmInfo npmInfo;
-    private List<NpmDependency> npmDependencies;
-
-    public NpmInfo getNpmInfo() {
-        return npmInfo;
-    }
-
-    public void setNpmInfo(NpmInfo npmInfo) {
-        this.npmInfo = npmInfo;
-    }
-
-    public List<NpmDependency> getNpmDependencies() {
-        return npmDependencies;
-    }
-
-    public void setNpmDependencies(List<NpmDependency> npmDependencies) {
-        this.npmDependencies = npmDependencies;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/nugetinfo/NugetArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/nugetinfo/NugetArtifactInfo.java
deleted file mode 100644
index 2b7c702..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/nugetinfo/NugetArtifactInfo.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.nugetinfo;
-
-import org.artifactory.nuget.NuMetaData;
-import org.artifactory.nuget.NuSpecFrameworkAssembly;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.BaseArtifactInfo;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class NugetArtifactInfo extends BaseArtifactInfo {
-
-    private NugetGeneralInfo nugetGeneralInfo;
-    private NugetDescription nugetDescription;
-    private List dependencies;
-    private List<NuSpecFrameworkAssembly> frameworkAssemblies;
-    private List references;
-    public NugetArtifactInfo() {
-    }
-
-    public NugetArtifactInfo(NuMetaData nuMetaData) {
-        nugetGeneralInfo = new NugetGeneralInfo(nuMetaData);
-        nugetDescription = new NugetDescription(nuMetaData);
-        this.dependencies = nuMetaData.getDependencies();
-        this.frameworkAssemblies = nuMetaData.getFrameworkAssemblies();
-        this.references = nuMetaData.getReferences();
-        super.setRepoKey(null);
-        super.setPath(null);
-    }
-
-    public NugetGeneralInfo getNugetGeneralInfo() {
-        return nugetGeneralInfo;
-    }
-
-    public void setNugetGeneralInfo(
-            NugetGeneralInfo nugetGeneralInfo) {
-        this.nugetGeneralInfo = nugetGeneralInfo;
-    }
-
-    public NugetDescription getNugetDescription() {
-        return nugetDescription;
-    }
-
-    public void setNugetDescription(
-            NugetDescription nugetDescription) {
-        this.nugetDescription = nugetDescription;
-    }
-
-    public List getDependencies() {
-        return dependencies;
-    }
-
-    public void setDependencies(List dependencies) {
-        this.dependencies = dependencies;
-    }
-
-    public List<NuSpecFrameworkAssembly> getFrameworkAssemblies() {
-        return frameworkAssemblies;
-    }
-
-    public void setFrameworkAssemblies(List<NuSpecFrameworkAssembly> frameworkAssemblies) {
-        this.frameworkAssemblies = frameworkAssemblies;
-    }
-
-    public List getReferences() {
-        return references;
-    }
-
-    public void setReferences(List references) {
-        this.references = references;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/nugetinfo/NugetDescription.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/nugetinfo/NugetDescription.java
deleted file mode 100644
index 8a97889..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/nugetinfo/NugetDescription.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.nugetinfo;
-
-import org.artifactory.nuget.NuMetaData;
-
-/**
- * @author Chen Keinan
- */
-public class NugetDescription {
-
-    private String description;
-
-    public NugetDescription(NuMetaData nuMetaData) {
-        this.description = nuMetaData.getDescription();
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/nugetinfo/NugetGeneralInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/nugetinfo/NugetGeneralInfo.java
deleted file mode 100644
index 5935d59..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/nugetinfo/NugetGeneralInfo.java
+++ /dev/null
@@ -1,163 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.nugetinfo;
-
-import org.artifactory.nuget.NuMetaData;
-
-/**
- * @author Chen Keinan
- */
-public class NugetGeneralInfo {
-
-    private String iconUrl;
-    private String id;
-    private String pkgTitle;
-    private String version;
-    private String authors;
-    private String owners;
-    private String licenseUrl;
-    private String languages;
-    private boolean requireLicenseAcceptance;
-    private String summary;
-    private String projectUrl;
-    private String description;
-    private String tags;
-    private String releaseNotes;
-    private String copyright;
-
-    public NugetGeneralInfo(NuMetaData nuMetaData) {
-        this.id = nuMetaData.getId();
-        this.pkgTitle = nuMetaData.getTitle();
-        this.authors = nuMetaData.getAuthors();
-        this.version = nuMetaData.getVersion();
-        this.owners = nuMetaData.getOwners();
-        this.licenseUrl = nuMetaData.getLicenseUrl();
-        this.requireLicenseAcceptance = nuMetaData.isRequireLicenseAcceptance();
-        this.summary = nuMetaData.getSummary();
-        this.tags = nuMetaData.getTags();
-        this.languages = nuMetaData.getLanguage();
-        this.projectUrl = nuMetaData.getProjectUrl();
-        this.iconUrl = nuMetaData.getIconUrl();
-        this.description = nuMetaData.getDescription();
-        this.releaseNotes = nuMetaData.getReleaseNotes();
-        this.copyright = nuMetaData.getCopyright();
-    }
-
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public String getPkgTitle() {
-        return pkgTitle;
-    }
-
-    public void setPkgTitle(String pkgTitle) {
-        this.pkgTitle = pkgTitle;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public String getAuthors() {
-        return authors;
-    }
-
-    public void setAuthors(String authors) {
-        this.authors = authors;
-    }
-
-    public String getOwners() {
-        return owners;
-    }
-
-    public void setOwners(String owners) {
-        this.owners = owners;
-    }
-
-    public String getLicenseUrl() {
-        return licenseUrl;
-    }
-
-    public void setLicenseUrl(String licenseUrl) {
-        this.licenseUrl = licenseUrl;
-    }
-
-    public boolean isRequireLicenseAcceptance() {
-        return requireLicenseAcceptance;
-    }
-
-    public void setRequireLicenseAcceptance(boolean requireLicenseAcceptance) {
-        this.requireLicenseAcceptance = requireLicenseAcceptance;
-    }
-
-    public String getSummary() {
-        return summary;
-    }
-
-    public void setSummary(String summary) {
-        this.summary = summary;
-    }
-
-    public String getTags() {
-        return tags;
-    }
-
-    public void setTags(String tags) {
-        this.tags = tags;
-    }
-
-    public String getLanguages() {
-        return languages;
-    }
-
-    public void setLanguages(String languages) {
-        this.languages = languages;
-    }
-
-    public String getProjectUrl() {
-        return projectUrl;
-    }
-
-    public void setProjectUrl(String projectUrl) {
-        this.projectUrl = projectUrl;
-    }
-
-    public String getIconUrl() {
-        return iconUrl;
-    }
-
-    public void setIconUrl(String iconUrl) {
-        this.iconUrl = iconUrl;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public String getReleaseNotes() {
-        return releaseNotes;
-    }
-
-    public void setReleaseNotes(String releaseNotes) {
-        this.releaseNotes = releaseNotes;
-    }
-
-    public String getCopyright() {
-        return copyright;
-    }
-
-    public void setCopyright(String copyright) {
-        this.copyright = copyright;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/permission/EffectivePermission.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/permission/EffectivePermission.java
deleted file mode 100644
index 325cbb8..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/permission/EffectivePermission.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.permission;
-
-import org.artifactory.security.AceInfo;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-
-/**
- * @author Chen Keinan
- */
- at JsonIgnoreProperties("hasAtLeastOnePermission")
-public class EffectivePermission {
-
-    private String principal;
-    private boolean delete;
-    private boolean deploy;
-    private boolean annotate;
-    private boolean read;
-    private Boolean managed;
-    private boolean hasAtLeastOnePermission;
-    private Integer mask;
-
-    public EffectivePermission() {
-    }
-
-    public EffectivePermission(AceInfo aceInfo) {
-        principal = aceInfo.getPrincipal();
-        delete = aceInfo.canDelete();
-        deploy = aceInfo.canDeploy();
-        annotate = aceInfo.canAnnotate();
-        read = aceInfo.canRead();
-        managed = aceInfo.canManage();
-        mask = aceInfo.getMask();
-    }
-
-    public boolean isHasAtLeastOnePermission() {
-        return hasAtLeastOnePermission;
-    }
-
-    public boolean isDelete() {
-        return delete;
-    }
-
-    public void setDelete(boolean delete) {
-        this.delete = delete;
-        if (delete){
-            hasAtLeastOnePermission = true;
-        }
-    }
-
-    public boolean isDeploy() {
-        return deploy;
-    }
-
-    public void setDeploy(boolean deploy) {
-        this.deploy = deploy;
-        if (deploy){
-            hasAtLeastOnePermission = true;
-        }
-    }
-
-    public boolean isAnnotate() {
-        return annotate;
-    }
-
-    public void setAnnotate(boolean annotate) {
-        this.annotate = annotate;
-        if (annotate){
-            hasAtLeastOnePermission = true;
-        }
-    }
-
-    public boolean isRead() {
-        return read;
-    }
-
-    public void setRead(boolean read) {
-        this.read = read;
-        if (read){
-            hasAtLeastOnePermission = true;
-        }
-    }
-
-    public String getPrincipal() {
-        return principal;
-    }
-
-    public void setPrincipal(String principal) {
-        this.principal = principal;
-    }
-
-    public Boolean isManaged() {
-        return managed;
-    }
-
-    public void setManaged(Boolean managed) {
-        this.managed = managed;
-    }
-
-    public Integer getMask() {
-        return mask;
-    }
-
-    public void setMask(Integer mask) {
-        this.mask = mask;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/permission/EffectivePermissionsArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/permission/EffectivePermissionsArtifactInfo.java
deleted file mode 100644
index 2c06631..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/permission/EffectivePermissionsArtifactInfo.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.permission;
-
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.model.RestPaging;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.BaseArtifactInfo;
-
-/**
- * @author Chen Keinan
- */
-public class EffectivePermissionsArtifactInfo extends BaseArtifactInfo implements RestModel, RestPaging {
-    private String principal;
-    private String type;
-    private EffectivePermission permission;
-
-    public EffectivePermissionsArtifactInfo() {
-    }
-
-    public EffectivePermissionsArtifactInfo(String name) {
-        super(name);
-    }
-
-    public EffectivePermissionsArtifactInfo(String type, String principalName, EffectivePermission permission) {
-        this.permission = permission;
-        this.type = type;
-        this.principal = principalName;
-    }
-
-    public String getPrincipal() {
-        return principal;
-    }
-
-    public void setPrincipal(String principal) {
-        this.principal = principal;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public EffectivePermission getPermission() {
-        return permission;
-    }
-
-    public void setPermission(EffectivePermission permission) {
-        this.permission = permission;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/permission/PagingModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/permission/PagingModel.java
deleted file mode 100644
index c45cf8f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/permission/PagingModel.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.permission;
-
-import java.util.List;
-
-import org.artifactory.rest.common.model.BaseModel;
-import org.artifactory.rest.common.model.RestPaging;
-
-/**
- * @author Chen Keinan
- */
-public class PagingModel extends BaseModel {
-
-    PagingModel() {
-    }
-
-    private String totalItems;
-
-    private List<? extends RestPaging> pagingData;
-
-    public PagingModel(
-            long numOfPages, List<? extends RestPaging> pagingData) {
-        this.totalItems = Long.toString(numOfPages);
-        this.pagingData = pagingData;
-    }
-
-    public String getTotalItems() {
-        return totalItems;
-    }
-
-    public void setTotalItems(String totalItems) {
-        this.totalItems = totalItems;
-    }
-
-    public List<? extends RestPaging> getPagingData() {
-        return pagingData;
-
-    }
-
-    public void setPagingData(
-            List<EffectivePermissionsArtifactInfo> pagingData) {
-        this.pagingData = pagingData;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/properties/ArtifactProperty.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/properties/ArtifactProperty.java
deleted file mode 100644
index 5b11dde..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/properties/ArtifactProperty.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.properties;
-
-/**
- * Chen Keinan
- */
-public class ArtifactProperty  {
-
-    private String name;
-    private String value;
-
-    public ArtifactProperty() {
-    }
-
-    public ArtifactProperty(String name,String value){
-        this.name = name;
-        this.value = value;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getValue() {
-        return value;
-    }
-
-    public void setValue(String value) {
-        this.value = value;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/properties/DeletePropertyModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/properties/DeletePropertyModel.java
deleted file mode 100644
index 0ed6220..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/properties/DeletePropertyModel.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.properties;
-
-import com.google.common.collect.Lists;
-import org.artifactory.rest.common.model.BaseModel;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class DeletePropertyModel extends BaseModel {
-    private List<PropertyWithPath> properties= Lists.newArrayList();
-
-    public List<PropertyWithPath> getProperties() {
-        return properties;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/properties/PropertiesArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/properties/PropertiesArtifactInfo.java
deleted file mode 100644
index b1f83e8..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/properties/PropertiesArtifactInfo.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.properties;
-
-import java.util.List;
-import java.util.Set;
-
-import org.artifactory.descriptor.property.Property;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.model.RestSpecialFields;
-import org.artifactory.rest.common.service.IgnoreSpecialFields;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.BaseArtifactInfo;
-import org.codehaus.jackson.map.annotate.JsonFilter;
-
-/**
- * @author Chen Keinan
- */
- at JsonFilter("exclude fields")
- at IgnoreSpecialFields(value = {"multiValue"})
-public class PropertiesArtifactInfo extends BaseArtifactInfo implements RestModel, RestSpecialFields {
-
-     public PropertiesArtifactInfo(String name){
-        super(name);
-    }
-    public PropertiesArtifactInfo(){}
-
-    private PropertySet parent;
-    private Property property;
-    private List<String> names;
-    private Set<String> selectedValues;
-    private List<String> predefineValues;
-    private List<ArtifactProperty> artifactProperties;
-    private String propertyType;
-
-    public PropertiesArtifactInfo(PropertySet propertySet, Property property) {
-        this.parent = propertySet;
-        this.property = property;
-    }
-
-    public String getPropertyType() {
-        return propertyType;
-    }
-
-    public void setPropertyType(String propertyType) {
-        this.propertyType = propertyType;
-    }
-
-    public List<ArtifactProperty> getArtifactProperties() {
-        return artifactProperties;
-    }
-
-    public void setArtifactProperties(List<ArtifactProperty> artifactProperties) {
-        this.artifactProperties = artifactProperties;
-    }
-
-    public List<String> getPredefineValues() {
-        return predefineValues;
-    }
-
-    public void setPredefineValues(List<String> predefineValues) {
-        this.predefineValues = predefineValues;
-    }
-
-    public String[] getSelectedValues()
-    {
-        if (selectedValues != null) {
-            return selectedValues.toArray(new String[selectedValues.size()]);
-        }
-        else{
-            return null;
-        }
-    }
-
-    public void setSelectedValues(Set<String> selectedValues) {
-        this.selectedValues = selectedValues;
-    }
-
-    public List<String> getNames() {
-        return names;
-    }
-
-    public void setNames(List<String> names) {
-        this.names = names;
-    }
-
-    public PropertySet getParent() {
-        return parent;
-    }
-
-    public void setParent(PropertySet parent) {
-        this.parent = parent;
-    }
-
-    public Property getProperty() {
-        return property;
-    }
-
-    public void setProperty(Property property) {
-        this.property = property;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToStringIgnoreSpecialFields(this);
-    }
-
-    @Override
-    public boolean ignoreSpecialFields() {
-        return artifactProperties!=null;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/properties/PropertyWithPath.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/properties/PropertyWithPath.java
deleted file mode 100644
index a4429e2..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/properties/PropertyWithPath.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.properties;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Gidi Shabat
- */
-public class PropertyWithPath extends BaseModel{
-    private String name;
-    private String path;
-    private String repoKey;
-    private boolean recursive;
-
-    public boolean isRecursive() {
-        return recursive;
-    }
-
-    public void setRecursive(boolean recursive) {
-        this.recursive = recursive;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/properties/RepoProperty.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/properties/RepoProperty.java
deleted file mode 100644
index 4861001..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/properties/RepoProperty.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.properties;
-
-import org.artifactory.descriptor.property.Property;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-
-/**
- * @author Chen Keinan
- */
- at JsonIgnoreProperties(value = {"closedPredefinedValues","multipleChoice","predefinedValues","valueCount","formattedValues","propertyType"})
-public class RepoProperty extends Property {
-
-    public RepoProperty (String name){
-        super.setName(name);
-    }
-
-    public RepoProperty(){}
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/properties/RepoPropertySet.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/properties/RepoPropertySet.java
deleted file mode 100644
index c669061..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/properties/RepoPropertySet.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.properties;
-
-import org.artifactory.descriptor.property.PropertySet;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-
-/**
- * @author Chen Keinan
- */
- at JsonIgnoreProperties(value = {"properties","visible"})
-public class RepoPropertySet extends PropertySet {
-
-    public RepoPropertySet(String name){
-        super.setName(name);
-    }
-
-    public RepoPropertySet(){}
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/pypi/PypiArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/pypi/PypiArtifactInfo.java
deleted file mode 100644
index 2eee259..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/pypi/PypiArtifactInfo.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.pypi;
-
-import org.artifactory.addon.pypi.PypiPkgInfo;
-import org.artifactory.addon.pypi.PypiPkgMetadata;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.BaseArtifactInfo;
-
-import javax.annotation.Nullable;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class PypiArtifactInfo extends BaseArtifactInfo {
-
-    private PypiPkgInfo pypiPkgInfo;
-    @Nullable
-    public List<String> categories;
-    @Nullable
-    public List<String> requires;
-    @Nullable
-    public List<String> provides;
-    @Nullable
-    public List<String> obsoletes;
-
-    public PypiArtifactInfo(String name) {
-        super(name);
-    }
-
-    PypiArtifactInfo() {
-    }
-
-    public PypiArtifactInfo(PypiPkgMetadata pypiPkgMetadata) {
-        this.pypiPkgInfo = pypiPkgMetadata.getPypiPkgInfo();
-        this.categories = pypiPkgMetadata.getCategories();
-        this.requires = pypiPkgMetadata.getRequires();
-        this.provides = pypiPkgMetadata.getProvides();
-        this.obsoletes = pypiPkgMetadata.getObsoletes();
-        clearRepoData();
-    }
-
-    public PypiPkgInfo getPypiPkgInfo() {
-        return pypiPkgInfo;
-    }
-
-    public void setPypiPkgInfo(PypiPkgInfo pypiPkgInfo) {
-        this.pypiPkgInfo = pypiPkgInfo;
-    }
-
-    @Nullable
-    public List<String> getCategories() {
-        return categories;
-    }
-
-    public void setCategories(@Nullable List<String> categories) {
-        this.categories = categories;
-    }
-
-    @Nullable
-    public List<String> getRequires() {
-        return requires;
-    }
-
-    public void setRequires(@Nullable List<String> requires) {
-        this.requires = requires;
-    }
-
-    @Nullable
-    public List<String> getProvides() {
-        return provides;
-    }
-
-    public void setProvides(@Nullable List<String> provides) {
-        this.provides = provides;
-    }
-
-    @Nullable
-    public List<String> getObsoletes() {
-        return obsoletes;
-    }
-
-    public void setObsoletes(@Nullable List<String> obsoletes) {
-        this.obsoletes = obsoletes;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/rpm/RpmArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/rpm/RpmArtifactInfo.java
deleted file mode 100644
index d58f111..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/rpm/RpmArtifactInfo.java
+++ /dev/null
@@ -1,118 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.rpm;
-
-import org.artifactory.addon.yum.ArtifactRpmMetadata;
-import org.artifactory.addon.yum.GeneralRpmMetadata;
-import org.artifactory.addon.yum.MetadataChangeLog;
-import org.artifactory.addon.yum.MetadataEntry;
-import org.artifactory.addon.yum.MiscRpmMetadata;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.BaseArtifactInfo;
-
-import java.io.File;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class RpmArtifactInfo extends BaseArtifactInfo {
-
-    public RpmArtifactInfo(String name) {
-        super(name);
-    }
-
-    RpmArtifactInfo() {
-    }
-
-    private GeneralRpmMetadata generalRpmMetadata;
-    private MiscRpmMetadata miscRpmMetadata;
-    private String description;
-    private List<MetadataEntry> provide;
-    private List<MetadataEntry> require;
-    private List<MetadataEntry> conflict;
-    private List<MetadataEntry> obsolete;
-    private List<File> files;
-    private List<MetadataChangeLog> changeLogs;
-
-    public RpmArtifactInfo(ArtifactRpmMetadata artifactRpmMetadata) {
-        this.generalRpmMetadata = artifactRpmMetadata.getGeneralRpmMetadata();
-        this.miscRpmMetadata = artifactRpmMetadata.getMiscRpmMetadata();
-        this.description = artifactRpmMetadata.getDescription();
-        this.provide = artifactRpmMetadata.getProvide();
-        this.require = artifactRpmMetadata.getRequire();
-        this.conflict = artifactRpmMetadata.getConflict();
-        this.obsolete = artifactRpmMetadata.getObsolete();
-        this.files = artifactRpmMetadata.getFiles();
-        this.changeLogs = artifactRpmMetadata.getChangeLogs();
-    }
-
-    public GeneralRpmMetadata getGeneralRpmMetadata() {
-        return generalRpmMetadata;
-    }
-
-    public void setGeneralRpmMetadata(GeneralRpmMetadata generalRpmMetadata) {
-        this.generalRpmMetadata = generalRpmMetadata;
-    }
-
-    public MiscRpmMetadata getMiscRpmMetadata() {
-        return miscRpmMetadata;
-    }
-
-    public void setMiscRpmMetadata(MiscRpmMetadata miscRpmMetadata) {
-        this.miscRpmMetadata = miscRpmMetadata;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public List<MetadataEntry> getProvide() {
-        return provide;
-    }
-
-    public void setProvide(List<MetadataEntry> provide) {
-        this.provide = provide;
-    }
-
-    public List<MetadataEntry> getRequire() {
-        return require;
-    }
-
-    public void setRequire(List<MetadataEntry> require) {
-        this.require = require;
-    }
-
-    public List<MetadataEntry> getConflict() {
-        return conflict;
-    }
-
-    public void setConflict(List<MetadataEntry> conflict) {
-        this.conflict = conflict;
-    }
-
-    public List<MetadataEntry> getObsolete() {
-        return obsolete;
-    }
-
-    public void setObsolete(List<MetadataEntry> obsolete) {
-        this.obsolete = obsolete;
-    }
-
-    public List<File> getFiles() {
-        return files;
-    }
-
-    public void setFiles(List<File> files) {
-        this.files = files;
-    }
-
-    public List<MetadataChangeLog> getChangeLogs() {
-        return changeLogs;
-    }
-
-    public void setChangeLogs(List<MetadataChangeLog> changeLogs) {
-        this.changeLogs = changeLogs;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/viewsource/ViewArtifactSource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/viewsource/ViewArtifactSource.java
deleted file mode 100644
index f49b166..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/viewsource/ViewArtifactSource.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.viewsource;
-
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.BaseArtifactInfo;
-
-/**
- * @author Chen Keinan
- */
-public class ViewArtifactSource extends BaseArtifactInfo {
-
-    public ViewArtifactSource(String name) {
-        super(name);
-    }
-
-    public ViewArtifactSource() {
-    }
-
-    private String source;
-    private String archivePath;
-    private String sourcePath;
-    private String repoKey;
-
-    public String getArchivePath() {
-        return archivePath;
-    }
-
-    public void setArchivePath(String archivePath) {
-        this.archivePath = archivePath;
-    }
-
-    public String getSourcePath() {
-        return sourcePath;
-    }
-
-    public void setSourcePath(String sourcePath) {
-        this.sourcePath = sourcePath;
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    public String getSource() {
-        return source;
-    }
-
-    public void setSource(String source) {
-        this.source = source;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/watchers/DeleteWatcher.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/watchers/DeleteWatcher.java
deleted file mode 100644
index f8b4db7..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/watchers/DeleteWatcher.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.watchers;
-
-import org.artifactory.rest.common.model.RestModel;
-
-/**
- * @author Gidi Shabat
- */
-public class DeleteWatcher  implements RestModel {
-    private String name;
-    private String repoKey;
-    private String path;
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/watchers/DeleteWatchersModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/watchers/DeleteWatchersModel.java
deleted file mode 100644
index 98a9000..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/watchers/DeleteWatchersModel.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.watchers;
-
-import com.google.common.collect.Lists;
-import org.artifactory.rest.common.model.RestModel;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class DeleteWatchersModel implements RestModel {
-    private List<DeleteWatcher> watches = Lists.newArrayList();
-
-    public List<DeleteWatcher> getWatches() {
-        return watches;
-    }
-
-    public void addUser(DeleteWatcher watcher) {
-        watches.add(watcher);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/watchers/WatchersArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/watchers/WatchersArtifactInfo.java
deleted file mode 100644
index 5567b67..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/browse/treebrowser/tabs/watchers/WatchersArtifactInfo.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.watchers;
-
-import java.util.Date;
-
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.BaseArtifactInfo;
-import org.ocpsoft.prettytime.PrettyTime;
-
-/**
- * @author Chen Keinan
- */
-public class WatchersArtifactInfo extends BaseArtifactInfo implements RestModel {
-
-    public WatchersArtifactInfo(String name) {
-        super(name);
-    }
-
-    WatchersArtifactInfo() {
-    }
-
-    private String watcherName;
-    private String watchingSince;
-    private String watchConfigureOn;
-    private String action;
-
-    public WatchersArtifactInfo(String username, long watchingSinceTime, RepoPath watchedPath,
-            String removeWatcher) {
-        this.watcherName = username;
-        setFormattedDate(watchingSinceTime);
-        this.watchConfigureOn = watchedPath.toString();
-        this.action = removeWatcher;
-    }
-
-    /**
-     * set data with pretty time format
-     * @param watchingSinceTime  - date in long , milliseconds since 1970
-     */
-    private void setFormattedDate(long watchingSinceTime) {
-        PrettyTime prettyTime = new PrettyTime();
-        Date sinceDate = new Date(watchingSinceTime);
-        this.watchingSince=  prettyTime.format(sinceDate) + " (" + sinceDate.toString() + ")";
-    }
-
-    public String getWatcherName() {
-        return watcherName;
-    }
-
-    public void setWatcherName(String watcherName) {
-        this.watcherName = watcherName;
-    }
-
-    public String getWatchingSince() {
-        return watchingSince;
-    }
-
-    public void setWatchingSince(String watchingSince) {
-        this.watchingSince = watchingSince;
-    }
-
-    public String getWatchConfigureOn() {
-        return watchConfigureOn;
-    }
-
-    public void setWatchConfigureOn(String watchConfigureOn) {
-        this.watchConfigureOn = watchConfigureOn;
-    }
-
-    public String getAction() {
-        return action;
-    }
-
-    public void setAction(String action) {
-        this.action = action;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/deploy/UploadArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/deploy/UploadArtifactInfo.java
deleted file mode 100644
index 15d4a60..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/deploy/UploadArtifactInfo.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.deploy;
-
-import com.sun.jersey.multipart.FormDataMultiPart;
-import org.artifactory.api.artifact.UnitInfo;
-import org.artifactory.rest.common.model.BaseModel;
-import org.artifactory.ui.rest.model.utils.FileUpload;
-
-/**
- * @author Chen Keinan
- */
-public class UploadArtifactInfo extends BaseModel {
-
-    private FileUpload fileUpload;
-    private UnitInfo unitInfo;
-    private String fileName;
-    private String repoKey;
-    private String unitConfigFileContent;
-    private boolean publishUnitConfigFile;
-
-    public UploadArtifactInfo() {
-    }
-    public UploadArtifactInfo(FormDataMultiPart fileUpload) {
-        this.fileUpload = new FileUpload(fileUpload);
-    }
-
-    public FormDataMultiPart fetchFormDataMultiPart() {
-        return fileUpload.getFormDataMultiPart();
-    }
-
-    public UnitInfo getUnitInfo() {
-        return unitInfo;
-    }
-
-    public void setUnitInfo(UnitInfo unitInfo) {
-        this.unitInfo = unitInfo;
-    }
-
-    public void cleanData() {
-        fileUpload = null;
-    }
-
-    public String getFileName() {
-        verifyFileName(fileName);
-        return fileName;
-    }
-
-    public void setFileName(String fileName) {
-        verifyFileName(fileName);
-        this.fileName = fileName;
-    }
-
-    private void verifyFileName(String fileName) {
-        // security check
-        if (fileName != null && fileName.contains("..")) {
-            throw new IllegalArgumentException("File name cannot contain relative paths");
-        }
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    public String getUnitConfigFileContent() {
-        return unitConfigFileContent;
-    }
-
-    public void setUnitConfigFileContent(String unitConfigFileContent) {
-        this.unitConfigFileContent = unitConfigFileContent;
-    }
-
-    public boolean isPublishUnitConfigFile() {
-        return publishUnitConfigFile;
-    }
-
-    public void setPublishUnitConfigFile(boolean publishUnitConfigFile) {
-        this.publishUnitConfigFile = publishUnitConfigFile;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/deploy/UploadedArtifactInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/deploy/UploadedArtifactInfo.java
deleted file mode 100644
index 14d3188..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/deploy/UploadedArtifactInfo.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.deploy;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * Describes a Response from UI Deploy
- *
- * @author Aviad Shikloshi
- */
-public class UploadedArtifactInfo extends BaseModel {
-
-    private Boolean showUrl;
-    private String repoKey;
-    private String artifactPath;
-
-    public UploadedArtifactInfo() {
-    }
-
-    public UploadedArtifactInfo(Boolean showUrl, String repoKey, String artifactPath) {
-        this.showUrl = showUrl;
-        this.repoKey = repoKey;
-        this.artifactPath = artifactPath;
-    }
-
-    public Boolean isShowUrl() {
-        return showUrl;
-    }
-
-    public void setShowUrl(Boolean showUrl) {
-        this.showUrl = showUrl;
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    public String getArtifactPath() {
-        return artifactPath;
-    }
-
-    public void setArtifactPath(String artifactPath) {
-        this.artifactPath = artifactPath;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/distribute/DistributeArtifactStatusModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/distribute/DistributeArtifactStatusModel.java
deleted file mode 100644
index ff8a4a6..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/distribute/DistributeArtifactStatusModel.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.distribute;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * <p>Created on 19/05/16
- *
- * @author Yinon Avraham
- */
-public class DistributeArtifactStatusModel extends BaseModel {
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/BaseSearch.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/BaseSearch.java
deleted file mode 100644
index 916aee2..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/BaseSearch.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.search;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Chen Keinan
- */
-public class BaseSearch extends BaseModel {
-
-    private List<String> selectedRepositories = new ArrayList<>();
-
-    public void setSelectedRepositories(List<String> selectedRepositories) {
-        this.selectedRepositories = selectedRepositories;
-    }
-
-    public List<String> getSelectedRepositories() {
-        return selectedRepositories;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/BaseSearchResult.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/BaseSearchResult.java
deleted file mode 100644
index 802d53b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/BaseSearchResult.java
+++ /dev/null
@@ -1,129 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.search;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.search.ItemSearchResult;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.model.BaseModel;
-import org.artifactory.ui.rest.model.artifacts.search.classsearch.ClassSearchResult;
-import org.artifactory.ui.rest.model.artifacts.search.gavcsearch.GavcResult;
-import org.artifactory.ui.rest.model.artifacts.search.packagesearch.result.PackageSearchResult;
-import org.artifactory.ui.rest.model.artifacts.search.propertysearch.PropertyResult;
-import org.artifactory.ui.rest.model.artifacts.search.quicksearch.QuickSearchResult;
-import org.artifactory.ui.rest.model.artifacts.search.trashsearch.TrashSearchResult;
-import org.artifactory.util.PathUtils;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-import org.codehaus.jackson.annotate.JsonSubTypes;
-import org.codehaus.jackson.annotate.JsonTypeInfo;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-
- at JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
- at JsonSubTypes({@JsonSubTypes.Type(value = ClassSearchResult.class, name = "class"),
-        @JsonSubTypes.Type(value = GavcResult.class, name = "gavc"),
-        @JsonSubTypes.Type(value = PropertyResult.class, name = "property"),
-        @JsonSubTypes.Type(value = StashResult.class, name = "stash"),
-        @JsonSubTypes.Type(value = QuickSearchResult.class, name = "quick"),
-        @JsonSubTypes.Type(value = PackageSearchResult.class, name = "package"),
-        @JsonSubTypes.Type(value = TrashSearchResult.class, name = "trash")})
- at JsonIgnoreProperties("searchResult")
-public abstract class BaseSearchResult extends BaseModel {
-
-    private String repoKey;
-    private String name;
-    protected RepoPath repoPath;
-    private long modifiedDate;
-    private String modifiedString;
-    private List<String> actions;
-    private String downloadLink;
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public long getModifiedDate() {
-        return modifiedDate;
-    }
-
-    public void setModifiedDate(long modifiedDate) {
-        this.modifiedDate = modifiedDate;
-    }
-
-    public String getModifiedString() {
-        return modifiedString;
-    }
-
-    public void setModifiedString(String modifiedString) {
-        this.modifiedString = modifiedString;
-    }
-
-    public List<String> getActions() {
-        return actions;
-    }
-
-    public void setActions(List<String> actions) {
-        this.actions = actions;
-    }
-
-    public String getDownloadLink() {
-        return downloadLink;
-    }
-
-    public void setDownloadLink(String downloadLink) {
-        this.downloadLink = downloadLink;
-    }
-
-    protected void updateActions() {
-        AuthorizationService authorizationService = ContextHelper.get().getAuthorizationService();
-        List<String> actions = new ArrayList<>();
-        if (NamingUtils.isViewable(getName()) || "class".equals(PathUtils.getExtension(getName()))) {
-            actions.add("View");
-        }
-        if(StringUtils.isNotEmpty(downloadLink)) {
-            actions.add("Download");
-        }
-        actions.add("ShowInTree");
-        if (authorizationService.canDelete(repoPath)) {
-            actions.add("Delete");
-        }
-        setActions(actions);
-    }
-
-    public abstract ItemSearchResult getSearchResult();
-
-    /**
-     * return item info by repo key and path
-     *
-     * @return
-     */
-    protected ItemInfo getItemInfo(RepoPath repoPath) {
-        ItemInfo itemInfo;
-        if (repoPath.isFile()) {
-            itemInfo = InfoFactoryHolder.get().createFileInfo(repoPath);
-        } else {
-            itemInfo = InfoFactoryHolder.get().createFolderInfo(repoPath);
-        }
-        return itemInfo;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/DeleteArtifactsModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/DeleteArtifactsModel.java
deleted file mode 100644
index 7578f01..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/DeleteArtifactsModel.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.search;
-
-import org.artifactory.rest.common.model.BaseModel;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.DeleteArtifact;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class DeleteArtifactsModel extends BaseModel {
-    private List<DeleteArtifact> artifacts;
-
-    public List<DeleteArtifact> getArtifacts() {
-        return artifacts;
-    }
-
-    public void setArtifacts(List<DeleteArtifact> artifacts) {
-        this.artifacts = artifacts;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/SearchResult.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/SearchResult.java
deleted file mode 100644
index 08e0a98..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/SearchResult.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.search;
-
-import org.artifactory.common.ConstantValues;
-import org.artifactory.rest.common.model.BaseModel;
-import org.artifactory.rest.common.service.RestResponse;
-
-/**
- * @author Shay Yaakov
- */
-public class SearchResult extends BaseModel {
-
-    private Object results;
-    private String searchExpression;
-    private long resultsCount;
-    private boolean isLimitSearchResults;
-
-    public SearchResult(){} // for jackson
-
-    public SearchResult(Object results, String searchExpression, long resultsCount, boolean isLimitSearchResults) {
-        this.results = results;
-        this.searchExpression = searchExpression;
-        this.resultsCount = resultsCount;
-        this.isLimitSearchResults = isLimitSearchResults;
-    }
-
-    public String getSearchExpression() {
-        return searchExpression;
-    }
-
-    public Object getResults() {
-        return results;
-    }
-
-    public String getMessage() {
-        int maxResults = ConstantValues.searchMaxResults.getInt();
-        int queryLimit = ConstantValues.searchUserQueryLimit.getInt();
-
-        StringBuilder msg = new StringBuilder();
-        //Return this only if we limit the search results and don't return the full number of results found
-        if (isLimitSearchResults && resultsCount > maxResults) {
-            msg.append("Showing first ").append(maxResults).append(" out of ").
-                    append(resultsCount == queryLimit ? "more than " : "")
-                    .append(resultsCount).append(" matches found");
-        } else if (isLimitSearchResults && resultsCount == -1) {
-            msg.append("Showing first ").append(maxResults).append(" found matches");
-        } else {
-            msg.append("Search Results - ").append(resultsCount).append(" Items");
-        }
-        return msg.toString();
-    }
-
-    public void addNotifications(RestResponse response) {
-        if (resultsCount == 0) {
-            response.warn("No artifacts found. You can broaden your search by using the * and ? wildcards");
-        }
-        if (isLimitSearchResults && resultsCount >= ConstantValues.searchMaxResults.getInt()) {
-            response.warn("Search results are limited. Please consider refining your search.");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/StashResult.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/StashResult.java
deleted file mode 100644
index 28ddd88..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/StashResult.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.search;
-
-import org.artifactory.api.search.ItemSearchResult;
-import org.artifactory.api.search.property.PropertySearchResult;
-import org.artifactory.mime.NamingUtils;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-/**
- * @author Chen Keinan
- */
- at JsonTypeName("stash")
-public class StashResult extends BaseSearchResult {
-
-    private String relativePath;
-    private String relativeDirPath;
-    private String resultType;
-    private String mimeType;
-
-    public StashResult(PropertySearchResult propertyResult) {
-        super.setRepoKey(propertyResult.getRepoKey());
-
-    }
-
-    public StashResult(String name, String relativePath, String repoKey) {
-        super.setRepoKey(repoKey);
-        setName(name);
-        this.relativePath = relativePath;
-        this.setRepoKey(repoKey);
-        this.mimeType = NamingUtils.getMimeType(relativePath).getType();
-    }
-
-    public String getRelativePath() {
-        return relativePath;
-    }
-
-    public void setRelativePath(String relativePath) {
-        this.relativePath = relativePath;
-    }
-
-    public String getRelativeDirPath() {
-        return relativeDirPath;
-    }
-
-    public void setRelativeDirPath(String relativeDirPath) {
-        this.relativeDirPath = relativeDirPath;
-    }
-
-    public String getResultType() {
-        return resultType;
-    }
-
-    public void setResultType(String resultType) {
-        this.resultType = resultType;
-    }
-
-    public String getMimeType() {
-        return mimeType;
-    }
-
-    public void setMimeType(String mimeType) {
-        this.mimeType = mimeType;
-    }
-
-    @Override
-    public ItemSearchResult getSearchResult() {
-        return null;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/checksumsearch/ChecksumSearch.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/checksumsearch/ChecksumSearch.java
deleted file mode 100644
index 6f4cf63..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/checksumsearch/ChecksumSearch.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.search.checksumsearch;
-
-import org.artifactory.ui.rest.model.artifacts.search.BaseSearch;
-
-/**
- * @author Chen Keinan
- */
-public class ChecksumSearch extends BaseSearch {
-
-    private String checksum;
-
-    public String getChecksum() {
-        return checksum;
-    }
-
-    public void setChecksum(String checksum) {
-        this.checksum = checksum;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/classsearch/ClassSearch.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/classsearch/ClassSearch.java
deleted file mode 100644
index 6c1caf2..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/classsearch/ClassSearch.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.search.classsearch;
-
-import org.artifactory.ui.rest.model.artifacts.search.BaseSearch;
-
-/**
- * @author Chen Keinan
- */
-public class ClassSearch extends BaseSearch {
-
-    private String name;
-    private String path;
-    private boolean searchClassOnly;
-    private boolean excludeInnerClasses;
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    public boolean isSearchClassOnly() {
-        return searchClassOnly;
-    }
-
-    public void setSearchClassOnly(boolean searchClassOnly) {
-        this.searchClassOnly = searchClassOnly;
-    }
-
-    public boolean isExcludeInnerClasses() {
-        return excludeInnerClasses;
-    }
-
-    public void setExcludeInnerClasses(boolean excludeInnerClasses) {
-        this.excludeInnerClasses = excludeInnerClasses;
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/classsearch/ClassSearchResult.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/classsearch/ClassSearchResult.java
deleted file mode 100644
index 3aabe4c..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/classsearch/ClassSearchResult.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.search.classsearch;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.exception.ItemNotFoundRuntimeException;
-import org.artifactory.api.search.ItemSearchResult;
-import org.artifactory.api.search.archive.ArchiveSearchResult;
-import org.artifactory.api.search.artifact.ArtifactSearchResult;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.ui.rest.model.artifacts.search.BaseSearchResult;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-/**
- * @author Chen Keinan
- */
- at JsonTypeName("class")
-public class ClassSearchResult extends BaseSearchResult {
-
-    private String archiveName;
-    private String archivePath;
-
-    public ClassSearchResult() {
-    }
-
-    public ClassSearchResult(ArchiveSearchResult archiveSearchResult,ArtifactoryRestRequest request) {
-        super.setRepoKey(archiveSearchResult.getRepoKey());
-        super.setName(archiveSearchResult.getEntryPath());
-        super.setModifiedDate(archiveSearchResult.getLastModified());
-        super.setModifiedString(archiveSearchResult.getLastModifiedString());
-        archiveName = archiveSearchResult.getItemInfo().getName();
-        archivePath = archiveSearchResult.getItemInfo().getRelPath();
-        RepoPath repoPath = InfoFactoryHolder.get().createRepoPath(archiveSearchResult.getRepoKey(),
-                archiveSearchResult.getRelativePath());
-        setDownloadLink(request.getDownloadLink(repoPath));
-        this.repoPath = repoPath;
-        updateActions();
-    }
-
-    public String getArchiveName() {
-        return archiveName;
-    }
-
-    public void setArchiveName(String archiveName) {
-        this.archiveName = archiveName;
-    }
-
-    public String getArchivePath() {
-        String path = archivePath.replaceAll(archiveName, "");
-        return StringUtils.isBlank(path) ? "[root]" : path;
-    }
-
-    public void setArchivePath(String archivePath) {
-        this.archivePath = archivePath;
-    }
-
-    @Override
-    protected void updateActions() {
-        super.updateActions();
-        getActions().remove("Delete");
-    }
-
-    @Override
-    public ItemSearchResult getSearchResult() {
-        RepoPath repoPath = InternalRepoPathFactory.create(getRepoKey(), archivePath);
-        ItemInfo itemInfo;
-        try {
-            itemInfo = ContextHelper.get().getRepositoryService().getItemInfo(repoPath);
-        } catch (ItemNotFoundRuntimeException e) {
-            itemInfo = getItemInfo(repoPath);
-        }
-        return new ArtifactSearchResult(itemInfo);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/gavcsearch/GavcResult.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/gavcsearch/GavcResult.java
deleted file mode 100644
index 4ba754a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/gavcsearch/GavcResult.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.search.gavcsearch;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.exception.ItemNotFoundRuntimeException;
-import org.artifactory.api.search.ItemSearchResult;
-import org.artifactory.api.search.artifact.ArtifactSearchResult;
-import org.artifactory.api.search.gavc.GavcSearchResult;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.ui.rest.model.artifacts.search.BaseSearchResult;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-/**
- * @author Chen Keinan
- */
- at JsonTypeName("gavc")
-public class GavcResult extends BaseSearchResult {
-
-    private String relativePath;
-    private String classifier;
-    private String version;
-    private String artifactID;
-    private String groupID;
-
-    public GavcResult() {
-    }
-
-    public GavcResult(GavcSearchResult gavcSearchResult,ArtifactoryRestRequest request) {
-        super.setRepoKey(gavcSearchResult.getRepoKey());
-        super.setName(gavcSearchResult.getName());
-        super.setModifiedDate(gavcSearchResult.getLastModified());
-        super.setModifiedString(gavcSearchResult.getLastModifiedString());
-        classifier = gavcSearchResult.getClassifier();
-        artifactID = gavcSearchResult.getArtifactId();
-        groupID = gavcSearchResult.getGroupId();
-        version = gavcSearchResult.getVersion();
-        relativePath = gavcSearchResult.getItemInfo().getRelPath();
-        RepoPath repoPath = InfoFactoryHolder.get().createRepoPath(gavcSearchResult.getRepoKey(),
-                gavcSearchResult.getRelativePath());
-        setDownloadLink(request.getDownloadLink(repoPath));
-        this.repoPath = repoPath;
-        super.updateActions();
-    }
-
-    public String getRelativePath() {
-        return relativePath;
-    }
-
-    public void setRelativePath(String relativePath) {
-        this.relativePath = relativePath;
-    }
-
-    public String getClassifier() {
-        return classifier;
-    }
-
-    public void setClassifier(String classifier) {
-        this.classifier = classifier;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public String getArtifactID() {
-        return artifactID;
-    }
-
-    public void setArtifactID(String artifactID) {
-        this.artifactID = artifactID;
-    }
-
-    public String getGroupID() {
-        return groupID;
-    }
-
-    public void setGroupID(String groupID) {
-        this.groupID = groupID;
-    }
-
-
-    @Override
-    public ItemSearchResult getSearchResult() {
-        RepoPath repoPath = InternalRepoPathFactory.create(getRepoKey(), getRelativePath());
-        ItemInfo itemInfo;
-        try {
-            itemInfo = ContextHelper.get().getRepositoryService().getItemInfo(repoPath);
-        } catch (ItemNotFoundRuntimeException e) {
-            itemInfo = getItemInfo(repoPath);
-        }
-        return new ArtifactSearchResult(itemInfo);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/gavcsearch/GavcSearch.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/gavcsearch/GavcSearch.java
deleted file mode 100644
index 46fe178..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/gavcsearch/GavcSearch.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.search.gavcsearch;
-
-import org.artifactory.ui.rest.model.artifacts.search.BaseSearch;
-
-/**
- * @author Chen Keinan
- */
-public class GavcSearch extends BaseSearch {
-
-    private String groupID;
-    private String artifactID;
-    private String version;
-    private String classifier;
-
-    public String getGroupID() {
-        return groupID;
-    }
-
-    public void setGroupID(String groupID) {
-        this.groupID = groupID;
-    }
-
-    public String getArtifactID() {
-        return artifactID;
-    }
-
-    public void setArtifactID(String artifactID) {
-        this.artifactID = artifactID;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public String getClassifier() {
-        return classifier;
-    }
-
-    public void setClassifier(String classifier) {
-        this.classifier = classifier;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/packagesearch/criteria/FieldSearchCriteria.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/packagesearch/criteria/FieldSearchCriteria.java
deleted file mode 100644
index 1d2bbae..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/packagesearch/criteria/FieldSearchCriteria.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.search.packagesearch.criteria;
-
-import org.artifactory.aql.model.AqlComparatorEnum;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.ui.rest.model.artifacts.search.packagesearch.search.AqlUISearchModel;
-import org.artifactory.ui.rest.service.artifacts.search.packagesearch.strategy.AqlUIFieldSearchStrategy;
-import org.artifactory.ui.rest.service.artifacts.search.packagesearch.strategy.AqlUISearchStrategy;
-
-/**
- * Contains all available field criteria that is globally supported for every package
- *
- * @author Dan Feldman
- */
-public enum FieldSearchCriteria {
-
-    repo(new AqlUISearchModel("repo", "Repository", "Repository", new AqlComparatorEnum[]{AqlComparatorEnum.equals}),
-            new AqlUIFieldSearchStrategy(AqlFieldEnum.itemRepo, new AqlDomainEnum[]{AqlDomainEnum.items}));
-
-    AqlUISearchModel model;
-    AqlUISearchStrategy strategy;
-
-    FieldSearchCriteria(AqlUISearchModel model, AqlUISearchStrategy strategy) {
-        this.model = model;
-        this.strategy = strategy;
-    }
-
-
-    public AqlUISearchModel getModel() {
-        return model;
-    }
-
-    public AqlUISearchStrategy getStrategy() {
-        return strategy;
-    }
-
-    public static AqlUISearchStrategy getStrategyByFieldId(String id) {
-        return valueOf(id).strategy;
-    }
-
-    /**
-     * Returns criteria that matches the AQL field name or the property key that {@param aqlName} references
-     *//*
-    public static FieldSearchCriteria getCriteriaByAqlFieldOrPropName(String aqlName) {
-        return Stream.of(values())
-                .filter(value -> value.aqlName.equalsIgnoreCase(aqlName))
-                .findFirst()
-                .orElseThrow(() -> new IllegalArgumentException("Unsupported field or property '" + aqlName + "'."));
-    }
-    */
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/packagesearch/criteria/PackageSearchCriteria.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/packagesearch/criteria/PackageSearchCriteria.java
deleted file mode 100644
index 8171299..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/packagesearch/criteria/PackageSearchCriteria.java
+++ /dev/null
@@ -1,454 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.search.packagesearch.criteria;
-
-import org.artifactory.aql.model.AqlComparatorEnum;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.ui.rest.model.artifacts.search.packagesearch.search.AqlUISearchModel;
-import org.artifactory.ui.rest.service.artifacts.search.packagesearch.result.AqlUISearchDockerV1ResultManipulator;
-import org.artifactory.ui.rest.service.artifacts.search.packagesearch.result.AqlUISearchDummyResultManipulator;
-import org.artifactory.ui.rest.service.artifacts.search.packagesearch.result.AqlUISearchNpmResultManipulator;
-import org.artifactory.ui.rest.service.artifacts.search.packagesearch.result.AqlUISearchResultManipulator;
-import org.artifactory.ui.rest.service.artifacts.search.packagesearch.strategy.AqlUIDockerV1ImageSearchStrategy;
-import org.artifactory.ui.rest.service.artifacts.search.packagesearch.strategy.AqlUIDockerV2ImageDigestSearchStrategy;
-import org.artifactory.ui.rest.service.artifacts.search.packagesearch.strategy.AqlUIDockerV2ImageSearchStrategy;
-import org.artifactory.ui.rest.service.artifacts.search.packagesearch.strategy.AqlUINpmNameSearchStrategy;
-import org.artifactory.ui.rest.service.artifacts.search.packagesearch.strategy.AqlUINpmScopeSearchStrategy;
-import org.artifactory.ui.rest.service.artifacts.search.packagesearch.strategy.AqlUIPropertySearchStrategy;
-import org.artifactory.ui.rest.service.artifacts.search.packagesearch.strategy.AqlUISearchStrategy;
-
-import java.util.List;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-/**
- * Contains all available criteria specific to each package type the search supports
- *
- * @author Dan Feldman
- */
-public enum PackageSearchCriteria {
-
-    npmName(PackageSearchType.npm, "npm.name",
-            new AqlUISearchModel("npmName", "Name", "Npm Name",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUINpmNameSearchStrategy("npm.name",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    npmVersion(PackageSearchType.npm, "npm.version",
-            new AqlUISearchModel("npmVersion", "Version", "Npm Version",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("npm.version",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    npmScope(PackageSearchType.npm, "npm.name",
-            new AqlUISearchModel("npmScope", "Scope", "Npm Scope",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUINpmScopeSearchStrategy("npm.name",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchNpmResultManipulator()),
-
-    debianName(PackageSearchType.debian, "deb.name",
-            new AqlUISearchModel("debianName", "Name", "Debian Name",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("deb.name",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    debianVersion(PackageSearchType.debian, "deb.version",
-            new AqlUISearchModel("debianVersion", "Version", "Debian Version",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("deb.version",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    debianPriority(PackageSearchType.debian, "deb.priority",
-            new AqlUISearchModel("debianPriority", "Priority", "Debian Priority",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("deb.priority",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    debianMaintainer(PackageSearchType.debian, "deb.maintainer",
-            new AqlUISearchModel("debianMaintainer", "Maintainer", "Debian Maintainer",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("deb.maintainer",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    debianDistribution(PackageSearchType.debian, "deb.distribution",
-            new AqlUISearchModel("debianDistribution", "Distribution", "Debian Distribution",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("deb.distribution",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    debianComponent(PackageSearchType.debian, "deb.component",
-            new AqlUISearchModel("debianComponent", "Component", "Debian Component",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("deb.component",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    debianArchitecture(PackageSearchType.debian, "deb.architecture",
-            new AqlUISearchModel("debianArchitecture", "Architecture", "Debian Architecture",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("deb.architecture",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    opkgName(PackageSearchType.opkg, "opkg.name",
-            new AqlUISearchModel("opkgName", "Name", "Opkg Name",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("opkg.name",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    opkgVersion(PackageSearchType.opkg, "opkg.version",
-            new AqlUISearchModel("opkgVersion", "Version", "Opkg Version",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("opkg.version",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    opkgArchitecture(PackageSearchType.opkg, "opkg.architecture",
-            new AqlUISearchModel("opkgArchitecture", "Architecture", "Opkg Architecture",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("opkg.architecture",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    opkgPriority(PackageSearchType.opkg, "opkg.priority",
-            new AqlUISearchModel("opkgPriority", "Priority", "Opkg Priority",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("opkg.priority",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    opkgMaintainer(PackageSearchType.opkg, "opkg.maintainer",
-            new AqlUISearchModel("opkgMaintainer", "Maintainer", "Opkg Maintainer",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("opkg.maintainer",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    dockerV1Image(PackageSearchType.dockerV1, "path",
-            new AqlUISearchModel("dockerV1Image", "Image", "Docker V1 Image",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.matches}),
-            new AqlUIDockerV1ImageSearchStrategy(AqlFieldEnum.itemPath,
-                    new AqlDomainEnum[]{AqlDomainEnum.items}),
-            new AqlUISearchDockerV1ResultManipulator()),
-
-    dockerV1Tag(PackageSearchType.dockerV1, "docker.tag.name",
-            new AqlUISearchModel("dockerV1Tag", "Tag", "Docker V1 Tag",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("docker.tag.name",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    dockerV2Image(PackageSearchType.dockerV2, "docker.repoName",
-            new AqlUISearchModel("dockerV2Image", "Image", "Docker V2 Image",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIDockerV2ImageSearchStrategy("docker.repoName",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    dockerV2Tag(PackageSearchType.dockerV2, "docker.manifest",
-            new AqlUISearchModel("dockerV2Tag", "Tag", "Docker V2 Tag",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("docker.manifest",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    dockerV2ImageDigest(PackageSearchType.dockerV2, "sha256",
-            new AqlUISearchModel("dockerV2ImageDigest", "Image Digest", "Docker V2 Image Digest",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIDockerV2ImageDigestSearchStrategy("sha256",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    nugetPackageId(PackageSearchType.nuget, "nuget.id",
-            new AqlUISearchModel("nugetPackageId", "ID", "NuGet Package ID",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("nuget.id",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    nugetVersion(PackageSearchType.nuget, "nuget.version",
-            new AqlUISearchModel("nugetVersion", "Version", "NuGet Package Version",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("nuget.version",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-/*    nugetTags(PackageSearchType.nuget, "nuget.tags",
-            new AqlUISearchModel("nugetTags", "Tags", "NuGet Tags",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("nuget.tags",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    nugetDigest(PackageSearchType.nuget, "nuget.digest",
-            new AqlUISearchModel("nugetDigest", "Digest", "NuGet Digest",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("nuget.digest",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),*/
-
-    bowerName(PackageSearchType.bower, "bower.name",
-            new AqlUISearchModel("bowerName", "Name", "Bower Package Name",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("bower.name",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    bowerVersion(PackageSearchType.bower, "bower.version",
-            new AqlUISearchModel("bowerVersion", "Version", "Bower Version",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("bower.version",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    cocoapodsName(PackageSearchType.cocoapods, "pods.name",
-            new AqlUISearchModel("cocoapodsName", "Name", "CocoaPods Package Name",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("pods.name",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    cocoapodsVersion(PackageSearchType.cocoapods, "pods.version",
-            new AqlUISearchModel("cocoapodsVersion", "Version", "CocoaPods Version",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("pods.version",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-
-    pypiName(PackageSearchType.pypi, "pypi.name",
-            new AqlUISearchModel("pypiName", "Name", "PyPi Name",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("pypi.name",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    pypiVersion(PackageSearchType.pypi, "pypi.version",
-            new AqlUISearchModel("pypiVersion", "Version", "Pypi Version",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("pypi.version",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    rpmName(PackageSearchType.rpm, "rpm.metadata.name",
-            new AqlUISearchModel("rpmName", "Name", "RPM Name",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("rpm.metadata.name",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    rpmVersion(PackageSearchType.rpm, "rpm.metadata.version",
-            new AqlUISearchModel("rpmVersion", "Version", "RPM Version",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("rpm.metadata.version",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    rpmArchitecture(PackageSearchType.rpm, "rpm.metadata.arch",
-            new AqlUISearchModel("rpmArchitecture", "Architecture", "RPM Architecture",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("rpm.metadata.arch",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-   /* rpmRelease(PackageSearchType.rpm, "rpm.metadata.release",
-            new AqlUISearchModel("rpmRelease", "Release", "RPM Release",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("rpm.metadata.release",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),*/
-
-    gemName(PackageSearchType.gems, "gem.name",
-            new AqlUISearchModel("gemName", "Name", "Gem Name",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("gem.name",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    gemVersion(PackageSearchType.gems, "gem.version",
-            new AqlUISearchModel("gemVersion", "Version", "Gem Version",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("gem.version",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    vagrantName(PackageSearchType.vagrant, "box_name",
-            new AqlUISearchModel("vagrantName", "Box Name", "Vagrant Box Name",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("box_name",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    vagrantVersion(PackageSearchType.vagrant, "box_version",
-            new AqlUISearchModel("vagrantVersion", "Box Version", "Vagrant Box Version",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("box_version",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator()),
-
-    vagrantProvider(PackageSearchType.vagrant, "box_provider",
-            new AqlUISearchModel("vagrantProvider", "Box Provider", "Vagrant Box Provider",
-                    new AqlComparatorEnum[]{AqlComparatorEnum.equals, AqlComparatorEnum.matches}),
-            new AqlUIPropertySearchStrategy("box_provider",
-                    new AqlDomainEnum[]{AqlDomainEnum.items, AqlDomainEnum.properties}),
-            new AqlUISearchDummyResultManipulator());
-
-    PackageSearchType type;
-    String aqlName;
-    AqlUISearchModel model;
-    AqlUISearchStrategy strategy;
-    AqlUISearchResultManipulator resultManipulator;
-
-    PackageSearchCriteria(PackageSearchType type, String aqlName, AqlUISearchModel model,
-            AqlUISearchStrategy strategy, AqlUISearchResultManipulator resultManipulator) {
-        this.type = type;
-        this.aqlName = aqlName;
-        this.model = model;
-        this.strategy = strategy;
-        this.resultManipulator = resultManipulator;
-    }
-
-    public PackageSearchType getType() {
-        return type;
-    }
-
-    public AqlUISearchModel getModel() {
-        return model;
-    }
-
-    public AqlUISearchStrategy getStrategy() {
-        return strategy;
-    }
-
-    public static AqlUISearchStrategy getStrategyByFieldId(String id) {
-        return valueOf(id).strategy;
-    }
-
-    public AqlUISearchResultManipulator getResultManipulator() {
-        return resultManipulator;
-    }
-
-    /**
-     * Returns the criteria that matches the AQL field name or the property key that {@param aqlName} references
-     */
-    public static PackageSearchCriteria getCriteriaByAqlFieldOrPropName(String aqlName) {
-        return Stream.of(values())
-                .filter(value -> value.aqlName.equalsIgnoreCase(aqlName))
-                .findAny()
-                .orElseThrow(() -> new IllegalArgumentException("Unsupported field or property '" + aqlName + "'."));
-    }
-
-    public static List<PackageSearchCriteria> getCriteriaByPackage(String packageType) {
-        return Stream.of(values())
-                .filter(searchCriterion -> searchCriterion.type.equals(PackageSearchType.getById(packageType)))
-                .collect(Collectors.toList());
-    }
-
-    public static List<PackageSearchCriteria> getCriteriaByPackage(PackageSearchType packageType) {
-        return Stream.of(values())
-                .filter(searchCriterion -> searchCriterion.type.equals(packageType))
-                .collect(Collectors.toList());
-    }
-
-    /**
-     * Returns the {@link AqlUISearchResultManipulator} the AQL field name or the property key that {@param aqlName}
-     * references
-     */
-    public static AqlUISearchResultManipulator getResultManipulatorByAqlFieldOrPropName(String aqlName) {
-        return Stream.of(values())
-                .filter(value -> value.aqlName.equalsIgnoreCase(aqlName))
-                .findAny()
-                .orElseThrow(() -> new IllegalArgumentException("Unsupported field or property '" + aqlName + "'."))
-                .getResultManipulator();
-    }
-
-    public static List<AqlUISearchResultManipulator> getResultManipulatorsByPackage(PackageSearchType packageType) {
-        return getCriteriaByPackage(packageType)
-                .stream()
-                .map(PackageSearchCriteria::getResultManipulator)
-                .collect(Collectors.toList());
-    }
-
-    public static PackageSearchType getPackageTypeByFieldId(String fieldId) {
-        try {
-            return valueOf(fieldId).getType();
-        } catch (IllegalArgumentException iae) {
-            //no such fieldId
-        }
-        return null;
-    }
-
-    public static List<AqlUISearchStrategy> getStartegiesByPackageSearchType(PackageSearchType type) {
-        return getCriteriaByPackage(type).stream()
-                .map(PackageSearchCriteria::getStrategy)
-                .collect(Collectors.toList());
-    }
-
-    public enum PackageSearchType {
-        dockerV1(RepoType.Docker, true, "docker"), dockerV2(RepoType.Docker, true, "docker"),
-        nuget(RepoType.NuGet, true, "nuget"), npm(RepoType.Npm, true, "npm"), bower(RepoType.Bower, true, "bower"),
-        gems(RepoType.Gems, false, "ruby-gems"), rpm(RepoType.YUM, true, "yum"), debian(RepoType.Debian, false, "deb"),
-        opkg(RepoType.Opkg, false, "opkg"), pypi(RepoType.Pypi, false, "pypi"), gavc(RepoType.Maven, true, "pom"),
-        vagrant(RepoType.Vagrant, false, "vagrant"), cocoapods(RepoType.CocoaPods, true, "cocoapods");
-        /*, all(""),*/ /*gitlfs(RepoType.GitLfs, false, "git-lfs"),*/
-
-        boolean remoteCachesProps;
-        RepoType repoType;
-        String icon;
-
-        PackageSearchType(RepoType repoType, boolean remoteCachesProps, String icon) {
-            this.repoType = repoType;
-            this.remoteCachesProps = remoteCachesProps;
-            this.icon = icon;
-        }
-
-        public static PackageSearchType getById(String id) {
-            for (PackageSearchType type : values()) {
-                if (type.name().equalsIgnoreCase(id)) {
-                    return type;
-                }
-            }
-            throw new UnsupportedOperationException("Unsupported package " + id);
-        }
-
-        public String getDisplayName() {
-            if (this.equals(dockerV1)) {
-                return "Docker V1";
-            } else if (this.equals(dockerV2)) {
-                return "Docker V2";
-            } else if (this.equals(rpm)) {
-                return "RPM";
-            } else if (this.equals(gavc)) {
-                return "GAVC";
-            } else if (this.equals(pypi)) {
-                return "PyPI";
-            }
-            return repoType.name();
-        }
-
-        public boolean isRemoteCachesProps() {
-            return remoteCachesProps;
-        }
-
-        public String getId() {
-            return this.name();
-        }
-
-        public RepoType getRepoType() {
-            return repoType;
-        }
-
-        public String getIcon() {
-            return icon;
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/packagesearch/result/AqlUISearchResult.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/packagesearch/result/AqlUISearchResult.java
deleted file mode 100644
index 98efe2c..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/packagesearch/result/AqlUISearchResult.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.search.packagesearch.result;
-
-import com.google.common.collect.HashMultimap;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.result.rows.FullRow;
-import org.codehaus.jackson.annotate.JsonIgnore;
-
-import java.util.Collection;
-import java.util.Map;
-
-/**
- * Interface for all 'Package Search' results (that can actually be any result) - basic fields are members based on
- * the domain, any extra included fields (i.e. AqlApiItem.create().filter(...).include()) are inserted in the map.
- *
- * @author Dan Feldman
- */
-public interface AqlUISearchResult {
-
-    @JsonIgnore
-    AqlDomainEnum getDomain();
-
-    //Returns a Jackson serializable map representing the extra fields multimap.
-    Map<String, Collection<String>> getExtraFields();
-
-    //Used by AqlUISearchResultManipulator to change or add values to the extra fields multimap.
-    HashMultimap<String, String> getExtraFieldsMap();
-
-    AqlUISearchResult aggregateRow(FullRow row);
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/packagesearch/result/PackageSearchResult.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/packagesearch/result/PackageSearchResult.java
deleted file mode 100644
index c615bce..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/packagesearch/result/PackageSearchResult.java
+++ /dev/null
@@ -1,196 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.search.packagesearch.result;
-
-import com.google.common.collect.HashMultimap;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.exception.ItemNotFoundRuntimeException;
-import org.artifactory.api.search.ItemSearchResult;
-import org.artifactory.api.search.artifact.ArtifactSearchResult;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.result.rows.FullRow;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.ui.rest.model.artifacts.search.BaseSearchResult;
-import org.artifactory.ui.rest.model.artifacts.search.packagesearch.criteria.PackageSearchCriteria;
-import org.artifactory.ui.rest.service.artifacts.search.packagesearch.PackageSearchService;
-import org.artifactory.ui.rest.service.artifacts.search.packagesearch.util.PackageSearchHelper;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonTypeName;
-import org.codehaus.jackson.annotate.JsonUnwrapped;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Collection;
-import java.util.Map;
-
-import static org.artifactory.ui.rest.model.artifacts.search.packagesearch.criteria.PackageSearchCriteria.PackageSearchType;
-
-/**
- * An Aql result containing relevant fields for a UI item domain search (single row) with any extra fields and
- * properties that were part of the query (if requested)
- *
- * @author Dan Feldman
- */
- at JsonTypeName("package")
-public class PackageSearchResult extends BaseSearchResult implements AqlUISearchResult {
-    private static final Logger log = LoggerFactory.getLogger(PackageSearchResult.class);
-
-    @JsonUnwrapped
-    protected HashMultimap<String, String> extraFields = HashMultimap.create();
-    private PackageSearchType packageType;
-    protected String relativePath;
-
-    public PackageSearchResult(FullRow row) {
-        super.setRepoKey(row.getRepo());
-        super.setName(row.getName());
-        super.setModifiedDate(row.getModified().getTime());
-        super.setModifiedString(row.getModified().toString());
-        this.repoPath = InfoFactoryHolder.get().createRepoPath(row.getRepo(), row.getPath() + "/" + row.getName());
-        this.relativePath = repoPath.getPath();
-    }
-
-    //For Stash results
-    public PackageSearchResult() {
-    }
-
-    public PackageSearchType getPackageType() {
-        return packageType;
-    }
-
-    public String getRelativePath() {
-        return relativePath;
-    }
-
-    @Override
-    public Map<String, Collection<String>> getExtraFields() {
-        return extraFields.asMap();
-    }
-
-    @Override
-    public HashMultimap<String, String> getExtraFieldsMap() {
-        return extraFields;
-    }
-
-    @Override
-    @JsonIgnore
-    public AqlDomainEnum getDomain() {
-        return AqlDomainEnum.items;
-    }
-
-    @JsonIgnore
-    public RepoPath getRepoPath() {
-        return repoPath;
-    }
-
-    public PackageSearchResult setDownloadLinkAndActions(ArtifactoryRestRequest request) {
-        if (repoPath != null) {
-            //No sense in downloading a manifest.json or tag.json for docker images
-            if (packageType != PackageSearchType.dockerV1 && packageType != PackageSearchType.dockerV2) {
-                setDownloadLink(request.getDownloadLink(repoPath));
-            }
-            super.updateActions();
-        }
-        return this;
-    }
-
-    @Override
-    public ItemSearchResult getSearchResult() {
-        RepoPath repoPath = InternalRepoPathFactory.create(getRepoKey(), getRelativePath());
-        ItemInfo itemInfo;
-        try {
-            itemInfo = ContextHelper.get().getRepositoryService().getItemInfo(repoPath);
-        } catch (ItemNotFoundRuntimeException e) {
-            itemInfo = getItemInfo(repoPath);
-        }
-        return new ArtifactSearchResult(itemInfo);
-    }
-
-    /**
-     * Used by the {@link PackageSearchService}'s reduction mechanism to aggregate result rows into one result
-     * NOTE: assumes this model is already constructed using a row representing the same path as all rows being
-     * aggregated.
-     */
-    @Override
-    public PackageSearchResult aggregateRow(FullRow row) {
-        //Row contains a property
-        if (row.getKey() != null) {
-            PackageSearchCriteria criterion;
-            try {
-                criterion = PackageSearchHelper.getMatchingPackageSearchCriteria(row);
-            } catch (IllegalArgumentException iae) {
-                //This is a property that doesn't exist in the criteria enum - do not add it to extra fields map
-                log.debug("Unable to match a search criterion for prop {} on path {}", row.getKey(),
-                        row.getRepo() + ":" + row.getPath() + "/" + row.getName());
-                return this;
-            }
-            if (packageType == null) {
-                packageType = criterion.getType();
-            }
-            //Only add properties that correlate to the same package type
-            if (PackageSearchCriteria.getCriteriaByPackage(packageType).contains(criterion)) {
-                log.debug("Found matching criterion {} for row package type {}, aggregating into result",
-                        criterion.name(), packageType);
-                extraFields.put(criterion.name(), row.getValue());
-            }
-        }
-        //else check if row contains some extra field
-        // TODO: [by dan] check if row has any fields that are not in items domain and add to the map with
-        // TODO: [by dan] AqlUISearchCriteria.getCriteriaByAqlFieldOrPropName if yes.
-        return this;
-    }
-
-    /**
-     * Used by the {@link PackageSearchService}'s reduction mechanism to aggregate result rows into one result
-     * NOTE: Assumes both results were constructed from rows referencing the same path!
-     */
-    public static PackageSearchResult merge(PackageSearchResult res1, PackageSearchResult res2) {
-        if (res1.repoPath == null && res2.repoPath != null) {
-            res1.repoPath = res2.repoPath;
-        }
-        if (StringUtils.isBlank(res1.getRepoKey()) && StringUtils.isNotBlank(res2.getRepoKey())) {
-            res1.setRepoKey(res2.getRepoKey());
-        }
-        if (StringUtils.isBlank(res1.getName()) && StringUtils.isNotBlank(res2.getName())) {
-            res1.setRepoKey(res2.getName());
-        }
-        if (StringUtils.isBlank(res1.getModifiedString()) && StringUtils.isNotBlank(res2.getModifiedString())) {
-            res1.setModifiedDate(res2.getModifiedDate());
-            res1.setModifiedString(res2.getModifiedString());
-        }
-        return res1;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof PackageSearchResult)) {
-            return false;
-        }
-
-        PackageSearchResult that = (PackageSearchResult) o;
-
-        if (getExtraFields() != null ? !getExtraFields().equals(that.getExtraFields()) :
-                that.getExtraFields() != null) {
-            return false;
-        }
-        if (getPackageType() != that.getPackageType()) {
-            return false;
-        }
-        return !(getRepoPath() != null ? !getRepoPath().equals(that.getRepoPath()) :
-                that.getRepoPath() != null);
-
-    }
-
-    @Override
-    public int hashCode() {
-        int result = getExtraFields() != null ? getExtraFields().hashCode() : 0;
-        result = 31 * result + (getPackageType() != null ? getPackageType().hashCode() : 0);
-        result = 31 * result + (getRepoPath() != null ? getRepoPath().hashCode() : 0);
-        return result;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/packagesearch/search/AqlUIDockerSearchModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/packagesearch/search/AqlUIDockerSearchModel.java
deleted file mode 100644
index 183d7ce..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/packagesearch/search/AqlUIDockerSearchModel.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.search.packagesearch.search;
-
-import org.artifactory.aql.model.AqlComparatorEnum;
-import org.artifactory.descriptor.repo.DockerApiVersion;
-import org.codehaus.jackson.annotate.JsonCreator;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-import org.codehaus.jackson.annotate.JsonProperty;
-
-import java.util.List;
-
-/**
- * @author Dan Feldman
- */
- at JsonIgnoreProperties(ignoreUnknown = true)
-public class AqlUIDockerSearchModel extends AqlUISearchModel {
-
-    private DockerApiVersion version;
-
-    //Used for Serialization
-    public AqlUIDockerSearchModel(String id, String displayName, String fullName,
-            AqlComparatorEnum[] allowedComparators) {
-        super(id, displayName, fullName, allowedComparators);
-    }
-
-    @JsonCreator //Used for Deserialization
-    public AqlUIDockerSearchModel(@JsonProperty("id") String id,
-            @JsonProperty("comparator") AqlComparatorEnum comparator,
-            @JsonProperty("values") List<String> values, @JsonProperty("dockerVersion") String version) {
-        super(id, comparator, values);
-        this.version = DockerApiVersion.valueOf(version);
-    }
-
-    @JsonIgnore
-    public DockerApiVersion getVersion() {
-        return version;
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/packagesearch/search/AqlUISearchModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/packagesearch/search/AqlUISearchModel.java
deleted file mode 100644
index cdd8ef2..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/packagesearch/search/AqlUISearchModel.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.search.packagesearch.search;
-
-import org.artifactory.aql.model.AqlComparatorEnum;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.codehaus.jackson.annotate.JsonCreator;
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-import org.codehaus.jackson.annotate.JsonProperty;
-
-import java.util.List;
-
-/**
- * @author Dan Feldman
- */
- at JsonIgnoreProperties(ignoreUnknown = true)
-public class AqlUISearchModel implements RestModel {
-
-    //both
-    protected String id;
-
-    //out
-    protected String displayName;
-    protected String fullName;
-    protected AqlComparatorEnum[] allowedComparators;
-
-    //in
-    protected AqlComparatorEnum comparator;
-    protected List<String> values;
-
-    //Used for Serialization
-    public AqlUISearchModel(String id, String displayName, String fullName, AqlComparatorEnum[] allowedComparators) {
-        this.id = id;
-        this.displayName = displayName;
-        this.fullName = fullName;
-        this.allowedComparators = allowedComparators;
-    }
-
-    @JsonCreator //Used for Deserialization
-    public AqlUISearchModel(@JsonProperty("id") String id, @JsonProperty("comparator") AqlComparatorEnum comparator,
-            @JsonProperty("values") List<String> values) {
-        this.id = id;
-        this.values = values;
-        if (values.stream().filter(value -> value.contains("*") || value.contains("?")).findAny().isPresent()) {
-            this.comparator = AqlComparatorEnum.matches;
-        } else if (comparator != null) {
-            this.comparator = comparator;
-        } else {
-            this.comparator = AqlComparatorEnum.equals;
-        }
-    }
-
-    public String getId() {
-        return id;
-    }
-
-    public String getDisplayName() {
-        return displayName;
-    }
-
-    public String getFullName() {
-        return fullName;
-    }
-
-    public AqlComparatorEnum[] getAllowedComparators() {
-        return allowedComparators;
-    }
-
-    @JsonIgnore
-    public AqlComparatorEnum getComparator() {
-        return comparator;
-    }
-
-    @JsonIgnore
-    public List<String> getValues() {
-        return values;
-    }
-
-    @Override
-    public String toString() {
-        return JsonUtil.jsonToString(this);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/packagesearch/search/AqlUISearchPackageTypeModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/packagesearch/search/AqlUISearchPackageTypeModel.java
deleted file mode 100644
index dcf4075..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/packagesearch/search/AqlUISearchPackageTypeModel.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.search.packagesearch.search;
-
-import org.artifactory.rest.common.model.BaseModel;
-import org.artifactory.ui.rest.model.artifacts.search.packagesearch.criteria.PackageSearchCriteria;
-import org.codehaus.jackson.annotate.JsonIgnoreProperties;
-
-/**
- * @author Dan Feldman
- */
- at JsonIgnoreProperties(ignoreUnknown = true)
-public class AqlUISearchPackageTypeModel extends BaseModel {
-
-    //both
-    private String id;
-    private String displayName;
-    private String icon;
-
-    public AqlUISearchPackageTypeModel(PackageSearchCriteria.PackageSearchType type) {
-        this.id = type.getId();
-        this.displayName = type.getDisplayName();
-        this.icon = type.getIcon();
-    }
-
-    public String getId() {
-        return id;
-    }
-
-    public String getDisplayName() {
-        return displayName;
-    }
-
-    public String getIcon() {
-        return icon;
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/propertysearch/PropertyKeyValues.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/propertysearch/PropertyKeyValues.java
deleted file mode 100644
index 594c174..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/propertysearch/PropertyKeyValues.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.search.propertysearch;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.artifactory.descriptor.property.Property;
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Chen Keinan
- */
-public class PropertyKeyValues extends BaseModel {
-    private String key;
-    private List<String> values = new ArrayList<>();
-    private String propertyType;
-
-    PropertyKeyValues() {
-    }
-
-    public PropertyKeyValues(String propertySetName, Property property) {
-        updateProps(propertySetName, property);
-
-    }
-
-    /**
-     * update props data
-     *
-     * @param propertySetName - property Set Name
-     * @param property        - property instance
-     */
-    private void updateProps(String propertySetName, Property property) {
-        if (propertySetName != null) {
-            this.key = propertySetName + "." + property.getName();
-        }else{
-            key = property.getName();
-        }
-        property.getPredefinedValues().forEach(preValue -> values.add(preValue.getValue()));
-    }
-
-    public String getKey() {
-        return key;
-    }
-
-    public void setKey(String key) {
-        this.key = key;
-    }
-
-    public List<String> getValues() {
-        return values;
-    }
-
-    public void setValues(List<String> values) {
-        this.values = values;
-    }
-
-    public String getPropertyType() {
-        return propertyType;
-    }
-
-    public void setPropertyType(String propertyType) {
-        this.propertyType = propertyType;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/propertysearch/PropertyResult.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/propertysearch/PropertyResult.java
deleted file mode 100644
index 9ce344b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/propertysearch/PropertyResult.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.search.propertysearch;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.exception.ItemNotFoundRuntimeException;
-import org.artifactory.api.search.ItemSearchResult;
-import org.artifactory.api.search.artifact.ArtifactSearchResult;
-import org.artifactory.api.search.property.PropertySearchResult;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.ui.rest.model.artifacts.search.BaseSearchResult;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-/**
- * @author Chen Keinan
- */
- at JsonTypeName("property")
-public class PropertyResult extends BaseSearchResult {
-
-    private String relativePath;
-    private String relativeDirPath;
-    private String resultType;
-
-    public PropertyResult() {
-    }
-
-    public PropertyResult(PropertySearchResult propertyResult,ArtifactoryRestRequest request) {
-        super.setRepoKey(propertyResult.getRepoKey());
-        this.relativePath = propertyResult.getRelativePath();
-        String relDirPath = propertyResult.getRelDirPath();
-        if (StringUtils.isBlank(relDirPath)) {
-            relDirPath = StringUtils.equals(propertyResult.getName(), ".") ? "[repo]" : "[root]";
-        }
-        ItemInfo itemInfo = propertyResult.getItemInfo();
-        if (!itemInfo.isFolder()) {
-            this.resultType = "File"; //file
-        } else if (".".equals(itemInfo.getRepoPath().getPath())) {
-            this.resultType = "Repository"; //repository
-        } else {
-            this.resultType = "Directory"; //directory
-        }
-        this.relativeDirPath = relDirPath;
-        super.setName(StringUtils.equals(propertyResult.getName(), ".") ? propertyResult.getRepoKey() : propertyResult.getName());
-        super.setModifiedDate(itemInfo.getLastModified());
-        super.setModifiedDate(itemInfo.getLastModified());
-        super.setModifiedString(ContextHelper.get().getCentralConfig().format(getModifiedDate()));
-        this.repoPath = InfoFactoryHolder.get().createRepoPath(propertyResult.getRepoKey(),
-                propertyResult.getRelativePath(), itemInfo instanceof FolderInfo);
-        setDownloadLink(request.getDownloadLink(repoPath));
-        updateActions();
-    }
-
-    public String getRelativePath() {
-        return relativePath;
-    }
-
-    public void setRelativePath(String relativePath) {
-        this.relativePath = relativePath;
-    }
-
-    public String getRelativeDirPath() {
-        return relativeDirPath;
-    }
-
-    public void setRelativeDirPath(String relativeDirPath) {
-        this.relativeDirPath = relativeDirPath;
-    }
-
-    public String getResultType() {
-        return resultType;
-    }
-
-    public void setResultType(String resultType) {
-        this.resultType = resultType;
-    }
-
-    @Override
-    protected void updateActions() {
-        super.updateActions();
-        if (resultType.equals("Directory") || resultType.equals("Repository")) {
-            getActions().remove("Download");
-            if (resultType.equals("Repository")) {
-                getActions().remove("Delete");
-            }
-        }
-    }
-
-    @Override
-    public ItemSearchResult getSearchResult() {
-        ItemInfo itemInfo;
-        RepoPath repoPath = InternalRepoPathFactory.create(getRepoKey(), getRelativePath());
-        try {
-            itemInfo = ContextHelper.get().getRepositoryService().getItemInfo(repoPath);
-        } catch (ItemNotFoundRuntimeException e) {
-            itemInfo = getItemInfo(repoPath);
-        }
-        return new ArtifactSearchResult(itemInfo);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/propertysearch/PropertySearch.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/propertysearch/PropertySearch.java
deleted file mode 100644
index 53f095d..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/propertysearch/PropertySearch.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.search.propertysearch;
-
-import org.artifactory.descriptor.property.PredefinedValue;
-import org.artifactory.descriptor.property.Property;
-import org.artifactory.ui.rest.model.artifacts.search.BaseSearch;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class PropertySearch extends BaseSearch {
-
-    private List<PropertyKeyValues> propertyKeyValues;
-
-    public List<PropertyKeyValues> getPropertyKeyValues() {
-        return propertyKeyValues;
-    }
-
-    public void setPropertyKeyValues(
-            List<PropertyKeyValues> propertyKeyValues) {
-        this.propertyKeyValues = propertyKeyValues;
-    }
-
-    public void updatePropertySearchData(String key, String value){
-        Property property = new Property(key);
-        List<PredefinedValue> predefinedValues = new ArrayList<>();
-        predefinedValues.add(new PredefinedValue(value,true));
-        property.setPredefinedValues(predefinedValues);
-        PropertyKeyValues propertyKeyValues = new PropertyKeyValues(null,property);
-        List<PropertyKeyValues> propertyKeyValuesList = new ArrayList<>();
-        propertyKeyValuesList.add(propertyKeyValues);
-        this.setPropertyKeyValues(propertyKeyValuesList);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/quicksearch/QuickSearch.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/quicksearch/QuickSearch.java
deleted file mode 100644
index a02ac51..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/quicksearch/QuickSearch.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.search.quicksearch;
-
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.artifact.ArtifactSearchResult;
-import org.artifactory.ui.rest.model.artifacts.search.BaseSearch;
-
-
-/**
- * @author Chen Keinan
- */
-public class QuickSearch extends BaseSearch {
-    private String query;
-    private String relativePath;
-    private ItemSearchResults<ArtifactSearchResult> searchResultItemSearchResults;
-
-    public QuickSearch() {
-    }
-
-    public String getQuery() {
-        return query;
-    }
-
-    public void setQuery(String query) {
-        this.query = query;
-    }
-
-    public String getRelativePath() {
-        return relativePath;
-    }
-
-    public void setRelativePath(String relativePath) {
-        this.relativePath = relativePath;
-    }
-
-    public ItemSearchResults<ArtifactSearchResult> getSearchResultItemSearchResults() {
-        return searchResultItemSearchResults;
-    }
-
-    public void setSearchResultItemSearchResults(
-            ItemSearchResults<ArtifactSearchResult> searchResultItemSearchResults) {
-        this.searchResultItemSearchResults = searchResultItemSearchResults;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/quicksearch/QuickSearchResult.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/quicksearch/QuickSearchResult.java
deleted file mode 100644
index 400d2e5..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/quicksearch/QuickSearchResult.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.search.quicksearch;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.exception.ItemNotFoundRuntimeException;
-import org.artifactory.api.search.ItemSearchResult;
-import org.artifactory.api.search.artifact.ArtifactSearchResult;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.ui.rest.model.artifacts.search.BaseSearchResult;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-/**
- * @author Chen Keinan
- */
- at JsonTypeName("quick")
-public class QuickSearchResult extends BaseSearchResult {
-
-    private String relativePath;
-    private String relativeDirPath;
-
-    public QuickSearchResult() {
-        // for jackson
-    }
-
-    public QuickSearchResult(ArtifactSearchResult artifactSearchResult,ArtifactoryRestRequest request) {
-        super.setModifiedDate(artifactSearchResult.getLastModified());
-        super.setModifiedString(artifactSearchResult.getLastModifiedString());
-        this.relativePath = artifactSearchResult.getRelativePath();
-        String relDirPath = artifactSearchResult.getRelDirPath();
-        if (StringUtils.isBlank(relDirPath)) {
-            relDirPath = "[root]";
-        }
-        this.relativeDirPath = relDirPath;
-        super.setRepoKey(artifactSearchResult.getRepoKey());
-        super.setName(artifactSearchResult.getName());
-        RepoPath repoPath = InfoFactoryHolder.get().createRepoPath(artifactSearchResult.getRepoKey(),
-                artifactSearchResult.getRelativePath());
-        setDownloadLink(request.getDownloadLink(repoPath));
-        this.repoPath = repoPath;
-        super.updateActions();
-    }
-
-    public String getRelativePath() {
-        return relativePath;
-    }
-
-    public void setRelativePath(String relativePath) {
-        this.relativePath = relativePath;
-    }
-
-    public String getRelativeDirPath() {
-        return relativeDirPath;
-    }
-
-    public void setRelativeDirPath(String relativeDirPath) {
-        this.relativeDirPath = relativeDirPath;
-    }
-
-    @Override
-    public ItemSearchResult getSearchResult() {
-        ItemInfo itemInfo;
-        RepoPath repoPath = InternalRepoPathFactory.create(getRepoKey(), getRelativePath());
-        try {
-            itemInfo = ContextHelper.get().getRepositoryService().getItemInfo(repoPath);
-        } catch (ItemNotFoundRuntimeException e) {
-            itemInfo = getItemInfo(repoPath);
-        }
-        return new ArtifactSearchResult(itemInfo);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/remotesearch/RemoteResult.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/remotesearch/RemoteResult.java
deleted file mode 100644
index ff25744..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/remotesearch/RemoteResult.java
+++ /dev/null
@@ -1,118 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.search.remotesearch;
-
-import org.artifactory.api.bintray.BintrayItemInfo;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.search.ItemSearchResult;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.ui.rest.model.artifacts.search.BaseSearchResult;
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class RemoteResult extends BaseSearchResult {
-    private static final Logger log = LoggerFactory.getLogger(RemoteResult.class);
-    private static final String STARTED_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
-
-    private String path;
-    private String packageName;
-    private String release;
-    private boolean cached;
-    private long releaseAsLong;
-
-    public RemoteResult(BintrayItemInfo bintrayItemInfo,ArtifactoryRestRequest request) {
-        this.setName(bintrayItemInfo.getName());
-        path = bintrayItemInfo.getPath();
-        packageName = bintrayItemInfo.getPackage();
-        formatReleaseDate(bintrayItemInfo);
-        cached = bintrayItemInfo.isCached();
-        setRepoKey(bintrayItemInfo.getRepo());
-        RepoPath repoPath = InfoFactoryHolder.get().createRepoPath(getRepoKey(),getPath());
-        setDownloadLink(request.getDownloadLink(repoPath));
-        updateActions();
-    }
-
-    /**
-     * format release date
-     *
-     * @param bintrayItemInfo
-     * @throws ParseException
-     */
-    private void formatReleaseDate(BintrayItemInfo bintrayItemInfo) {
-        DateFormat simpleDateFormat = new SimpleDateFormat(STARTED_FORMAT);
-        try {
-            releaseAsLong = simpleDateFormat.parse(bintrayItemInfo.getCreated()).getTime();
-            release = ContextHelper.get().getCentralConfig().format(releaseAsLong);
-        } catch (Exception e) {
-            log.error(e.toString());
-        }
-    }
-
-    @JsonProperty("package")
-    public String getPackageName() {
-        return packageName;
-    }
-
-    public void setPackageName(String packageName) {
-        this.packageName = packageName;
-    }
-
-    public String getRelease() {
-        return release;
-    }
-
-    public void setRelease(String release) {
-        this.release = release;
-    }
-
-    public String getPath() {
-
-        return path;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    public boolean isCached() {
-        return cached;
-    }
-
-    public void setCached(boolean cached) {
-        this.cached = cached;
-    }
-
-    @Override
-    protected void updateActions() {
-        List<String> actions = new ArrayList<>();
-        if (ContextHelper.get().getAuthorizationService().canDeploy(RepoPathFactory.create("jcenter", path))) {
-            actions.add("Download");
-        }
-        actions.add("ShowInBintray");
-        setActions(actions);
-    }
-
-    public long getReleaseAsLong() {
-        return releaseAsLong;
-    }
-
-    public void setReleaseAsLong(long releaseAsLong) {
-        this.releaseAsLong = releaseAsLong;
-    }
-
-    @Override
-    public ItemSearchResult getSearchResult() {
-        return null;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/remotesearch/RemoteSearch.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/remotesearch/RemoteSearch.java
deleted file mode 100644
index b22b9f6..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/remotesearch/RemoteSearch.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.search.remotesearch;
-
-import org.artifactory.ui.rest.model.artifacts.search.BaseSearch;
-
-/**
- * @author Chen Keinan
- */
-public class RemoteSearch extends BaseSearch {
-
-    private String searchKey;
-
-    public String getSearchKey() {
-        return searchKey;
-    }
-
-    public void setSearchKey(String searchKey) {
-        this.searchKey = searchKey;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/trashsearch/TrashSearch.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/trashsearch/TrashSearch.java
deleted file mode 100644
index 4685b58..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/trashsearch/TrashSearch.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.search.trashsearch;
-
-import org.artifactory.ui.rest.model.artifacts.search.BaseSearch;
-
-
-/**
- * @author Shay Yaakov
- */
-public class TrashSearch extends BaseSearch {
-
-    private String query;
-    private Boolean isChecksum;
-
-    public String getQuery() {
-        return query;
-    }
-
-    public void setQuery(String query) {
-        this.query = query;
-    }
-
-    public Boolean getIsChecksum() {
-        return isChecksum;
-    }
-
-    public void setIsChecksum(Boolean isChecksum) {
-        this.isChecksum = isChecksum;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/trashsearch/TrashSearchResult.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/trashsearch/TrashSearchResult.java
deleted file mode 100644
index 012317e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/artifacts/search/trashsearch/TrashSearchResult.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.search.trashsearch;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.search.ItemSearchResult;
-import org.artifactory.api.search.artifact.ArtifactSearchResult;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.trash.TrashService;
-import org.artifactory.ui.rest.model.artifacts.search.BaseSearchResult;
-import org.artifactory.util.PathUtils;
-import org.codehaus.jackson.annotate.JsonTypeName;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Shay Yaakov
- */
- at JsonTypeName("trash")
-public class TrashSearchResult extends BaseSearchResult {
-
-    private String originRepository;
-    private long deletedTime;
-    private String deletedTimeString;
-    private String relativeDirPath;
-
-    public TrashSearchResult() {
-        // for jackson
-    }
-
-    public TrashSearchResult(ArtifactSearchResult artifactSearchResult, Properties properties) {
-        super.setRepoKey(artifactSearchResult.getRepoKey());
-        super.setName(artifactSearchResult.getName());
-        this.repoPath = artifactSearchResult.getItemInfo().getRepoPath();
-        String relDirPath = PathUtils.stripFirstPathElement(artifactSearchResult.getRelDirPath());
-        if (StringUtils.isBlank(relDirPath)) {
-            relDirPath = "[root]";
-        }
-        this.relativeDirPath = relDirPath;
-        this.originRepository = properties.getFirst(TrashService.PROP_ORIGIN_REPO);
-        String trashTime = properties.getFirst(TrashService.PROP_TRASH_TIME);
-        if (StringUtils.isNotBlank(trashTime)) {
-            this.deletedTime = Long.parseLong(trashTime);
-            this.deletedTimeString = ContextHelper.get().getCentralConfig().format(deletedTime);
-        }
-        List<String> actions = new ArrayList<>();
-        actions.add("ShowInTree");
-        actions.add("Restore");
-        actions.add("Delete");
-        setActions(actions);
-    }
-
-    public String getOriginRepository() {
-        return originRepository;
-    }
-
-    public void setOriginRepository(String originRepository) {
-        this.originRepository = originRepository;
-    }
-
-    public long getDeletedTime() {
-        return deletedTime;
-    }
-
-    public void setDeletedTime(long deletedTime) {
-        this.deletedTime = deletedTime;
-    }
-
-    public String getDeletedTimeString() {
-        return deletedTimeString;
-    }
-
-    public void setDeletedTimeString(String deletedTimeString) {
-        this.deletedTimeString = deletedTimeString;
-    }
-
-    public String getRelativeDirPath() {
-        return relativeDirPath;
-    }
-
-    public void setRelativeDirPath(String relativeDirPath) {
-        this.relativeDirPath = relativeDirPath;
-    }
-
-    @Override
-    protected void updateActions() {
-        List<String> actions = new ArrayList<>();
-        actions.add("ShowInTree");
-        actions.add("Restore");
-        actions.add("Delete");
-        setActions(actions);
-    }
-
-    @Override
-    public ItemSearchResult getSearchResult() {
-        return null;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/BintrayModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/BintrayModel.java
deleted file mode 100644
index 4f5baac..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/BintrayModel.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.artifactory.ui.rest.model.builds;
-
-import org.artifactory.api.bintray.BintrayParams;
-import org.artifactory.rest.common.model.BaseModel;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class BintrayModel extends BaseModel {
-
-    private List<String> binTrayRepositories;
-    private List<String> binTrayPackages;
-    private List<String> binTrayVersions;
-    private BintrayParams bintrayParams;
-
-
-    public List<String> getBinTrayRepositories() {
-        return binTrayRepositories;
-    }
-
-    public void setBinTrayRepositories(List<String> binTrayRepositories) {
-        this.binTrayRepositories = binTrayRepositories;
-    }
-
-    public List<String> getBinTrayPackages() {
-        return binTrayPackages;
-    }
-
-    public void setBinTrayPackages(List<String> binTrayPackages) {
-        this.binTrayPackages = binTrayPackages;
-    }
-
-    public List<String> getBinTrayVersions() {
-        return binTrayVersions;
-    }
-
-    public void setBinTrayVersions(List<String> binTrayVersions) {
-        this.binTrayVersions = binTrayVersions;
-    }
-
-    public BintrayParams getBintrayParams() {
-        return bintrayParams;
-    }
-
-    public void setBintrayParams(BintrayParams bintrayParams) {
-        this.bintrayParams = bintrayParams;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/BuildCoordinate.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/BuildCoordinate.java
deleted file mode 100644
index 50ae448..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/BuildCoordinate.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.artifactory.ui.rest.model.builds;
-
-/**
- * @author Gidi Shabat
- */
-public class BuildCoordinate {
-    private String buildName;
-    private String buildNumber;
-    private long date;
-
-    /**
-     * Need the constructor for JSON mapping
-     */
-    public BuildCoordinate() {
-    }
-
-    public BuildCoordinate(String buildName, String buildNumber, long date) {
-        this.buildName = buildName;
-        this.buildNumber = buildNumber;
-        this.date = date;
-    }
-
-    public BuildCoordinate(String buildName) {
-        this.buildName = buildName;
-    }
-
-    public String getBuildName() {
-        return buildName;
-    }
-
-    public String getBuildNumber() {
-        return buildNumber;
-    }
-
-    public long getDate() {
-        return date;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/BuildDiffModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/BuildDiffModel.java
deleted file mode 100644
index f74b774..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/BuildDiffModel.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.ui.rest.model.builds;
-
-import java.util.List;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Chen Keinan
- */
-public class BuildDiffModel extends BaseModel {
-
-    private List<ModuleArtifactModel> artifacts;
-    private List<ModuleDependencyModel> dependencies;
-    private List<BuildPropsModel> props;
-
-    public List<ModuleArtifactModel> getArtifacts() {
-        return artifacts;
-    }
-
-    public void setArtifacts(List<ModuleArtifactModel> artifacts) {
-        this.artifacts = artifacts;
-    }
-
-    public List<ModuleDependencyModel> getDependencies() {
-        return dependencies;
-    }
-
-    public void setDependencies(List<ModuleDependencyModel> dependencies) {
-        this.dependencies = dependencies;
-    }
-
-    public List<BuildPropsModel> getProps() {
-        return props;
-    }
-
-    public void setProps(List<BuildPropsModel> props) {
-        this.props = props;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/BuildGovernanceInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/BuildGovernanceInfo.java
deleted file mode 100644
index a11833e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/BuildGovernanceInfo.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package org.artifactory.ui.rest.model.builds;
-
-import org.artifactory.api.governance.BlackDuckApplicationInfo;
-import org.artifactory.api.governance.GovernanceRequestInfo;
-import org.artifactory.rest.common.model.BaseModel;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Chen Keinan
- */
-public class BuildGovernanceInfo extends BaseModel {
-
-    private List<GovernanceRequestInfo> components = new ArrayList<>();
-    private List<GovernanceRequestInfo> publishedArtifacts = new ArrayList<>();
-    private Set<String> scopes = new HashSet<>();
-    private BlackDuckApplicationInfo applicationInfo;
-
-    public BuildGovernanceInfo() {
-    }
-
-
-    public BuildGovernanceInfo(List<GovernanceRequestInfo> components, List<GovernanceRequestInfo> publishedArtifacts,
-                               Set<String> scopes, BlackDuckApplicationInfo applicationInfo) {
-        this.components = components;
-        this.publishedArtifacts = publishedArtifacts;
-        this.scopes = scopes;
-        this.applicationInfo = applicationInfo;
-    }
-
-    public List<GovernanceRequestInfo> getComponents() {
-        return components;
-    }
-
-    public void setComponents(List<GovernanceRequestInfo> components) {
-        this.components = components;
-    }
-
-    public List<GovernanceRequestInfo> getPublishedArtifacts() {
-        return publishedArtifacts;
-    }
-
-    public void setPublishedArtifacts(List<GovernanceRequestInfo> publishedArtifacts) {
-        this.publishedArtifacts = publishedArtifacts;
-    }
-
-    public Set<String> getScopes() {
-        return scopes;
-    }
-
-    public void setScopes(Set<String> scopes) {
-        this.scopes = scopes;
-    }
-
-    public BlackDuckApplicationInfo getApplicationInfo() {
-        return applicationInfo;
-    }
-
-    public void setApplicationInfo(BlackDuckApplicationInfo applicationInfo) {
-        this.applicationInfo = applicationInfo;
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/BuildLicenseModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/BuildLicenseModel.java
deleted file mode 100644
index c3e1a3e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/BuildLicenseModel.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.ui.rest.model.builds;
-
-import java.util.Collection;
-import java.util.Set;
-
-import org.artifactory.api.license.ModuleLicenseModel;
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Chen Keinan
- */
-public class BuildLicenseModel extends BaseModel {
-
-    private Collection<ModuleLicenseModel> licenses;
-    private Set<ModuleLicenseModel> publishedModules;
-    private Set<String> scopes;
-
-    public BuildLicenseModel() {
-    }
-
-    public BuildLicenseModel(Collection<ModuleLicenseModel> values,
-                             Set<ModuleLicenseModel> publishedModules, Set<String> scopes) {
-        this.licenses = values;
-        this.publishedModules = publishedModules;
-        this.scopes = scopes;
-    }
-
-    public Collection<ModuleLicenseModel> getLicenses() {
-        return licenses;
-    }
-
-    public void setLicenses(Collection<ModuleLicenseModel> licenses) {
-        this.licenses = licenses;
-    }
-
-    public Set<ModuleLicenseModel> getPublishedModules() {
-        return publishedModules;
-    }
-
-    public void setPublishedModules(Set<ModuleLicenseModel> publishedModules) {
-        this.publishedModules = publishedModules;
-    }
-
-    public Set<String> getScopes() {
-        return scopes;
-    }
-
-    public void setScopes(Set<String> scopes) {
-        this.scopes = scopes;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/BuildModule.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/BuildModule.java
deleted file mode 100644
index 2889834..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/BuildModule.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.ui.rest.model.builds;
-
-import org.artifactory.api.build.PublishedModule;
-import org.artifactory.rest.common.model.BaseModel;
-import org.artifactory.rest.common.model.RestPaging;
-
-/**
- * @author Chen Keinan
- */
-public class BuildModule extends BaseModel implements RestPaging {
-
-    private String moduleId;
-    private String numOfArtifacts;
-    private String numOfDependencies;
-
-    public BuildModule(PublishedModule module) {
-        moduleId = module.getId();
-        numOfArtifacts = module.getNumOfArtifact();
-        numOfDependencies = module.getNumOfDependencies();
-    }
-
-    public String getModuleId() {
-        return moduleId;
-    }
-
-    public void setModuleId(String moduleId) {
-        this.moduleId = moduleId;
-    }
-
-    public String getNumOfArtifacts() {
-        return numOfArtifacts;
-    }
-
-    public void setNumOfArtifacts(String numOfArtifacts) {
-        this.numOfArtifacts = numOfArtifacts;
-    }
-
-    public String getNumOfDependencies() {
-        return numOfDependencies;
-    }
-
-    public void setNumOfDependencies(String numOfDependencies) {
-        this.numOfDependencies = numOfDependencies;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/BuildPropsModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/BuildPropsModel.java
deleted file mode 100644
index 5b33fad..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/BuildPropsModel.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package org.artifactory.ui.rest.model.builds;
-
-import org.artifactory.api.build.BuildProps;
-import org.artifactory.api.build.diff.BuildsDiffPropertyModel;
-import org.artifactory.rest.common.model.BaseModel;
-import org.artifactory.rest.common.model.RestPaging;
-
-/**
- * @author Chen Keinan
- */
-public class BuildPropsModel extends BaseModel implements RestPaging {
-
-    private String key;
-    private String value;
-    private String status;
-    private String prevValue;
-    private String prevKey;
-
-    public BuildPropsModel(BuildsDiffPropertyModel buildProps) {
-        this.key = buildProps.getKey();
-        this.value = buildProps.getValue();
-        this.status = buildProps.getStatus().toString();
-        updateArtifactNames(buildProps);
-    }
-
-    public BuildPropsModel(BuildProps buildProps) {
-        this.key = buildProps.getKey();
-        this.value = buildProps.getValue();
-        if (buildProps.getStatus() != null) {
-            this.status = buildProps.getStatus().toString();
-        }
-    }
-
-    public String getKey() {
-        return key;
-    }
-
-    public void setKey(String key) {
-        this.key = key;
-    }
-
-    public String getValue() {
-        return value;
-    }
-
-    public void setValue(String value) {
-        this.value = value;
-    }
-
-    public String getStatus() {
-        return status;
-    }
-
-    public void setStatus(String status) {
-        this.status = status;
-    }
-
-    public String getPrevValue() {
-        return prevValue;
-    }
-
-    public void setPrevValue(String prevValue) {
-        this.prevValue = prevValue;
-    }
-
-    /**
-     * update current and prev build props name base on diff status
-     *
-     * @param buildProps - build props as updated from db
-     */
-    private void updateArtifactNames(BuildsDiffPropertyModel buildProps) {
-        if (buildProps != null) {
-            String status = buildProps.getStatus().toString();
-            switch (status) {
-                case "Removed": {
-                    prevKey = buildProps.getKey();
-                    key = "";
-                    value = "";
-                    prevValue = buildProps.getValue();
-                }
-                break;
-                case "Add": {
-                    prevKey = "";
-                    prevValue = "";
-                }
-                break;
-                case "Updated": {
-                    prevValue = buildProps.getDiffValue();
-                    prevKey = key;
-                }
-                break;
-                case "Unchanged": {
-                    prevKey = key;
-                    prevValue = value;
-                }
-                break;
-            }
-        }
-    }
-
-    public String getPrevKey() {
-        return prevKey;
-    }
-
-    public void setPrevKey(String prevKey) {
-        this.prevKey = prevKey;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/DeleteBuildsModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/DeleteBuildsModel.java
deleted file mode 100644
index 8e39351..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/DeleteBuildsModel.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.ui.rest.model.builds;
-
-import com.google.common.collect.Lists;
-import org.artifactory.rest.common.model.BaseModel;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
-public class DeleteBuildsModel extends BaseModel {
-    private List<BuildCoordinate> buildsCoordinates = Lists.newArrayList();
-
-    public List<BuildCoordinate> getBuildsCoordinates() {
-        return buildsCoordinates;
-    }
-
-    public void addBuildCuordianate(String buildName, String buildNumber, long date) {
-        buildsCoordinates.add(new BuildCoordinate(buildName, buildNumber, date));
-    }
-
-    public void addBuildCuordianate(String buildName) {
-        buildsCoordinates.add(new BuildCoordinate(buildName));
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/DistributeBuildStatusModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/DistributeBuildStatusModel.java
deleted file mode 100644
index 9f326db..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/DistributeBuildStatusModel.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.artifactory.ui.rest.model.builds;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * <p>Created on 19/05/16
- *
- * @author Yinon Avraham
- */
-public class DistributeBuildStatusModel extends BaseModel {
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/GeneralBuildInfo.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/GeneralBuildInfo.java
deleted file mode 100644
index dee74ca..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/GeneralBuildInfo.java
+++ /dev/null
@@ -1,240 +0,0 @@
-package org.artifactory.ui.rest.model.builds;
-
-import org.artifactory.rest.common.model.BaseModel;
-import org.artifactory.rest.common.model.RestPaging;
-import org.artifactory.rest.common.util.BintrayRestHelper;
-
-/**
- * @author Chen Keinan
- */
-public class GeneralBuildInfo extends BaseModel implements RestPaging {
-
-    private String buildName;
-    private String buildNumber;
-    private String ciUrl;
-    private String releaseStatus;
-    private String agent;
-    private String buildAgent;
-    private String lastBuildTime;
-    private String duration;
-    private String principal;
-    private  String artifactoryPrincipal;
-    private String url;
-    private  Long time;
-    private String buildStat;
-    // private Boolean allowPushToBintray;
-    private Boolean userCanDistribute;
-
-
-    public GeneralBuildInfo() {}
-
-    public GeneralBuildInfo(BuildBuilder buildBuilder) {
-        this.buildName = buildBuilder.buildName;
-        this.lastBuildTime = buildBuilder.lastBuildTime;
-        this.buildNumber = buildBuilder.buildNumber;
-        this.ciUrl = buildBuilder.ciUrl;
-        this.releaseStatus = buildBuilder.releaseStatus;
-        this.agent = buildBuilder.agent;
-        this.buildAgent = buildBuilder.buildAgent;
-        this.duration = buildBuilder.duration;
-        this.principal = buildBuilder.principal;
-        this.artifactoryPrincipal = buildBuilder.artifactoryPrincipal;
-        this.url = buildBuilder.url;
-        this.time = (buildBuilder.time == null) ? null : buildBuilder.time;
-        this.buildStat = buildBuilder.buildStat;
-        //TODO [by dan]: Decide if we're bringing back push to bintray for builds -> remove this if not
-        // allowPushToBintray = BintrayRestHelper.isPushToBintrayAllowed(null, null);
-        userCanDistribute = BintrayRestHelper.userCanDistributeBuild();
-    }
-
-    public Long getTime() {
-        return time;
-    }
-
-    public void setTime(Long time) {
-        this.time = time;
-    }
-
-    public String getBuildName() {
-        return buildName;
-    }
-
-    public void setBuildName(String buildName) {
-        this.buildName = buildName;
-    }
-
-    public String getLastBuildTime() {
-        return lastBuildTime;
-    }
-
-    public void setLastBuildTime(String lastBuildTime) {
-        this.lastBuildTime = lastBuildTime;
-    }
-
-    public String getBuildNumber() {
-        return buildNumber;
-    }
-
-    public void setBuildNumber(String buildNumber) {
-        this.buildNumber = buildNumber;
-    }
-
-    public String getCiUrl() {
-        return ciUrl;
-    }
-
-    public void setCiUrl(String ciUrl) {
-        this.ciUrl = ciUrl;
-    }
-
-    public String getReleaseStatus() {
-        return releaseStatus;
-    }
-
-    public void setReleaseStatus(String releaseStatus) {
-        this.releaseStatus = releaseStatus;
-    }
-
-    public String getAgent() {
-        return agent;
-    }
-
-    public void setAgent(String agent) {
-        this.agent = agent;
-    }
-
-    public String getBuildAgent() {
-        return buildAgent;
-    }
-
-    public void setBuildAgent(String buildAgent) {
-        this.buildAgent = buildAgent;
-    }
-
-    public String getDuration() {
-        return duration;
-    }
-
-    public void setDuration(String duration) {
-        this.duration = duration;
-    }
-
-    public String getPrincipal() {
-        return principal;
-    }
-
-    public void setPrincipal(String principal) {
-        this.principal = principal;
-    }
-
-    public String getArtifactoryPrincipal() {
-        return artifactoryPrincipal;
-    }
-
-    public void setArtifactoryPrincipal(String artifactoryPrincipal) {
-        this.artifactoryPrincipal = artifactoryPrincipal;
-    }
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    public String getBuildStat() {
-        return buildStat;
-    }
-
-    public void setBuildStat(String buildStat) {
-        this.buildStat = buildStat;
-    }
-
-    /*public Boolean getAllowPushToBintray() {
-        return allowPushToBintray;
-    }*/
-
-    public Boolean getUserCanDistribute() {
-        return userCanDistribute;
-    }
-
-    public static class BuildBuilder {
-
-        private String buildName;
-        private String lastBuildTime;
-        private String buildNumber;
-        private String ciUrl;
-        private String releaseStatus;
-        private String agent;
-        private String buildAgent;
-        private String duration;
-        private String principal;
-        private String artifactoryPrincipal;
-        private String url;
-        private Long time;
-        private String buildStat;
-
-        public BuildBuilder() {
-        }
-
-        public BuildBuilder buildName(String buildName) {
-            this.buildName = buildName;
-            return this;
-        }
-
-        public BuildBuilder lastBuildTime(String lastBuildTime) {
-            this.lastBuildTime = lastBuildTime;
-            return this;
-        }
-
-        public BuildBuilder buildNumber(String buildNumber) {
-            this.buildNumber = buildNumber;
-            return this;
-        }
-
-        public BuildBuilder ciUrl(String ciUrl) {
-            this.ciUrl = ciUrl;
-            return this;
-        }
-
-        public BuildBuilder releaseStatus(String releaseStatus) {
-            this.releaseStatus = releaseStatus;
-            return this;
-        }
-        public BuildBuilder agent(String agent) {
-            this.agent = agent;
-            return this;
-        }
-        public BuildBuilder buildAgent(String buildAgent) {
-            this.buildAgent = buildAgent;
-            return this;
-        }
-        public BuildBuilder duration(String duration) {
-            this.duration = duration;
-            return this;
-        }
-        public BuildBuilder principal(String principal) {
-            this.principal = principal;
-            return this;
-        }
-        public BuildBuilder artifactoryPrincipal(String artifactoryPrincipal) {
-            this.artifactoryPrincipal = artifactoryPrincipal;
-            return this;
-        }
-        public BuildBuilder url(String url) {
-            this.url = url;
-            return this;
-        }
-
-        public BuildBuilder time(Long time) {
-            this.time = time;
-            return this;
-        }
-
-        public BuildBuilder buildStat(String buildStat) {
-            this.buildStat = buildStat;
-            return this;
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/IssueModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/IssueModel.java
deleted file mode 100644
index cc00641..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/IssueModel.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package org.artifactory.ui.rest.model.builds;
-
-import org.artifactory.rest.common.model.BaseModel;
-import org.jfrog.build.api.Issue;
-
-/**
- * @author Chen Keinan
- */
-public class IssueModel extends BaseModel {
-
-    private String key;
-    private String url;
-    private String summary;
-    private boolean aggregated;
-
-    public IssueModel(Issue issue) {
-        setAggregated(issue.isAggregated());
-        setKey(issue.getKey());
-        setSummary(issue.getSummary());
-        setUrl(issue.getUrl());
-    }
-
-    public IssueModel(String key, String url, String summary) {
-        this.key = key;
-        this.url = url;
-        this.summary = summary;
-        this.aggregated = false;
-    }
-
-    public String getKey() {
-        return key;
-    }
-
-    public void setKey(String key) {
-        this.key = key;
-    }
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    public String getSummary() {
-        return summary;
-    }
-
-    public void setSummary(String summary) {
-        this.summary = summary;
-    }
-
-    public boolean isAggregated() {
-        return aggregated;
-    }
-
-    public void setAggregated(boolean aggregated) {
-        this.aggregated = aggregated;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof IssueModel)) {
-            return false;
-        }
-
-        IssueModel that = (IssueModel) o;
-
-        if (key != null ? !key.equals(that.key) : that.key != null) {
-            return false;
-        }
-
-        if (url != null ? !url.equals(that.url) : that.url != null) {
-            return false;
-        }
-
-        if (summary != null ? !summary.equals(that.summary) : that.summary != null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = (key != null ? key.hashCode() : 0);
-        result = 31 * result + (url != null ? url.hashCode() : 0);
-        result = 31 * result + (summary != null ? summary.hashCode() : 0);
-        return result;
-    }
-
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/LicenseBuildSummary.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/LicenseBuildSummary.java
deleted file mode 100644
index 81295e3..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/LicenseBuildSummary.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package org.artifactory.ui.rest.model.builds;
-
-/**
- * @author Chen Keinan
- */
-public class LicenseBuildSummary {
-
-    private Integer approved;
-    private Integer notFound;
-    private Integer neutral;
-    private Integer notApproved;
-    private Integer unknown;
-
-    public LicenseBuildSummary() {
-    }
-
-    public LicenseBuildSummary(int unknown, int approved, int neutral, int notApproved, int notFound) {
-        this.unknown = unknown;
-        this.approved = approved;
-        this.neutral = neutral;
-        this.notApproved = notApproved;
-        this.notFound = notFound;
-    }
-
-    public Integer getApproved() {
-        return approved;
-    }
-
-    public void setApproved(Integer approved) {
-        this.approved = approved;
-    }
-
-    public Integer getNotFound() {
-        return notFound;
-    }
-
-    public void setNotFound(Integer notFound) {
-        this.notFound = notFound;
-    }
-
-    public Integer getNeutral() {
-        return neutral;
-    }
-
-    public void setNeutral(Integer neutral) {
-        this.neutral = neutral;
-    }
-
-    public Integer getNotApproved() {
-        return notApproved;
-    }
-
-    public void setNotApproved(Integer notApproved) {
-        this.notApproved = notApproved;
-    }
-
-    public Integer getUnknown() {
-        return unknown;
-    }
-
-    public void setUnknown(Integer unknown) {
-        this.unknown = unknown;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/ModuleArtifactModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/ModuleArtifactModel.java
deleted file mode 100644
index 5da0e56..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/ModuleArtifactModel.java
+++ /dev/null
@@ -1,210 +0,0 @@
-package org.artifactory.ui.rest.model.builds;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.build.ModuleArtifact;
-import org.artifactory.api.build.diff.BuildsDiffArtifactModel;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.rest.common.model.BaseModel;
-import org.artifactory.rest.common.model.RestPaging;
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-import org.artifactory.util.PathUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-
-
-/**
- * @author Chen Keinan
- */
-public class ModuleArtifactModel extends BaseModel implements RestPaging {
-
-    private String repoKey;
-    private String path;
-    private String name;
-    private String type;
-    private String repoPath;
-    private String downloadLink;
-    private List<BaseArtifact> actions = new ArrayList<>();
-    private String status;
-    private String moduleName;
-    private String prevName;
-
-    public ModuleArtifactModel(ModuleArtifact moduleArtifact, String downloadLink) {
-        this.repoKey = moduleArtifact.getRepoKey();
-        this.path = moduleArtifact.getPath();
-        this.name = moduleArtifact.getName();
-        this.type = moduleArtifact.getType();
-        this.moduleName = moduleArtifact.getModule();
-        this.status = moduleArtifact.getStatus();
-        updateArtifactActions(downloadLink);
-    }
-
-    /**
-     * update artifact actions
-     *
-     * @param downloadLink - artifact download link
-     */
-    private void updateArtifactActions(String downloadLink) {
-        if (StringUtils.isNotBlank(repoKey)) {
-            this.downloadLink = downloadLink;
-            repoPath = repoKey + ":" + path;
-            if (ContextHelper.get().getAuthorizationService().canRead(RepoPathFactory.create(repoKey, path))) {
-                actions.add(new BaseArtifact("Download"));
-                actions.add(new BaseArtifact("ShowInTree"));
-                if (NamingUtils.isViewable(path) || "class".equals(PathUtils.getExtension(getPath()))) {
-                    actions.add(new BaseArtifact("View"));
-                }
-            }
-        } else {
-            path = "No path found (externally resolved or deleted/overwritten)";
-        }
-    }
-
-
-    public ModuleArtifactModel(BuildsDiffArtifactModel artifact) {
-        if (artifact.getRepoPath() != null) {
-            this.repoKey = artifact.getRepoPath().getRepoKey();
-            this.path = artifact.getRepoPath().getPath();
-        }
-        this.name = artifact.getName();
-        this.type = artifact.getType();
-        this.moduleName = artifact.getModule();
-        updateArtifactNames(artifact);
-        this.status = artifact.getStatus().toString();
-        if (artifact.getRepoPath() != null){
-            this.downloadLink = artifact.getUri();
-            repoPath = repoKey + ":" + path;
-            if (ContextHelper.get().getAuthorizationService().canRead(RepoPathFactory.create(repoKey, path))) {
-                actions.add(new BaseArtifact("Download"));
-                actions.add(new BaseArtifact("ShowInTree"));
-                if (NamingUtils.isViewable(path) || "class".equals(PathUtils.getExtension(getPath()))) {
-                    actions.add(new BaseArtifact("View"));
-                }
-            }
-        }
-    }
-
-    /**
-     * update current and prev artifact name base on diff status
-     *
-     * @param moduleArtifact - module artifact as updated from db
-     */
-    private void updateArtifactNames(BuildsDiffArtifactModel moduleArtifact) {
-        if (moduleArtifact != null) {
-            String status = moduleArtifact.getStatus().toString();
-            switch (status) {
-                case "Removed": {
-                    prevName = moduleArtifact.getName();
-                    name = "";
-                }
-                break;
-                case "Add": {
-                    prevName = "";
-                }
-                break;
-                case "Updated": {
-                    String diffName = moduleArtifact.getDiffName();
-                    if (diffName != null && diffName.length() > 0) {
-                        prevName = diffName;
-                    } else {
-                        prevName = name;
-                    }
-                }
-                break;
-                case "Unchanged": {
-                    prevName = name;
-                }
-                break;
-            }
-        }
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public String getRepoPath() {
-        return repoPath;
-    }
-
-    public void setRepoPath(String repoPath) {
-        this.repoPath = repoPath;
-    }
-
-    public String getDownloadLink() {
-        return downloadLink;
-    }
-
-    public void setDownloadLink(String downloadLink) {
-        this.downloadLink = downloadLink;
-    }
-
-    public List<BaseArtifact> getActions() {
-        return actions;
-    }
-
-    public void setActions(List<BaseArtifact> actions) {
-        this.actions = actions;
-    }
-
-    public void cleanData() {
-        this.repoKey = null;
-        this.repoPath = null;
-        this.actions = null;
-        this.repoPath = null;
-    }
-
-    public String getStatus() {
-        return status;
-    }
-
-    public void setStatus(String status) {
-        this.status = status;
-    }
-
-    public String getModuleName() {
-        return moduleName;
-    }
-
-    public void setModuleName(String moduleName) {
-        this.moduleName = moduleName;
-    }
-
-    public String getPrevName() {
-        return prevName;
-    }
-
-    public void setPrevName(String prevName) {
-        this.prevName = prevName;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/ModuleDependencyModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/ModuleDependencyModel.java
deleted file mode 100644
index aa56865..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/ModuleDependencyModel.java
+++ /dev/null
@@ -1,233 +0,0 @@
-package org.artifactory.ui.rest.model.builds;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.build.ModuleDependency;
-import org.artifactory.api.build.diff.BuildsDiffDependencyModel;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.rest.common.model.BaseModel;
-import org.artifactory.rest.common.model.RestPaging;
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-import org.artifactory.util.PathUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-
-
-/**
- * @author Chen Keinan
- */
-public class ModuleDependencyModel extends BaseModel implements RestPaging {
-
-    private String repoKey;
-    private String path;
-    private String name;
-    private String type;
-    private String scope;
-    private String repoPath;
-    private String downloadLink;
-    private List<BaseArtifact> actions = new ArrayList<>();
-    private String status;
-    private String moduleName;
-    private String prevName;
-
-
-    public ModuleDependencyModel(ModuleDependency moduleDependency, String downloadLink) {
-        this.repoKey = moduleDependency.getRepoKey();
-        this.path = moduleDependency.getPath();
-        this.name = moduleDependency.getName();
-        this.type = moduleDependency.getType();
-        this.scope = moduleDependency.getScope();
-        this.status = moduleDependency.getStatus();
-        this.moduleName = moduleDependency.getModule();
-        //    updateArtifactNames(moduleDependency);
-        if (StringUtils.isNotBlank(repoKey)) {
-            this.downloadLink = downloadLink;
-            repoPath = repoKey + ":" + path;
-            if (ContextHelper.get().getAuthorizationService().canRead(RepoPathFactory.create(repoKey, path))) {
-                actions.add(new BaseArtifact("Download"));
-                actions.add(new BaseArtifact("ShowInTree"));
-                if (NamingUtils.isViewable(path) || "class".equals(PathUtils.getExtension(getPath()))) {
-                    actions.add(new BaseArtifact("View"));
-                }
-            }
-        } else {
-            path = "No path found (externally resolved or deleted/overwritten)";
-        }
-    }
-
-    public ModuleDependencyModel(BuildsDiffDependencyModel dependency) {
-        updateRepoKeyAndPath(dependency);
-        this.name = dependency.getName();
-        this.type = dependency.getType();
-        this.moduleName = dependency.getModule();
-        updateArtifactNames(dependency);
-        this.status = dependency.getStatus().toString();
-        updateDependencyAction(dependency);
-    }
-
-    /**
-     * update repo key and path
-     *
-     * @param dependency - dependency
-     */
-    private void updateRepoKeyAndPath(BuildsDiffDependencyModel dependency) {
-        if (dependency.getRepoPath() != null) {
-            this.repoKey = dependency.getRepoPath().getRepoKey();
-            this.path = dependency.getRepoPath().getPath();
-        }
-    }
-
-    /**
-     * update dependency actions
-     *
-     * @param dependency
-     */
-    private void updateDependencyAction(BuildsDiffDependencyModel dependency) {
-        if (dependency.getRepoPath() != null) {
-            this.downloadLink = dependency.getUri();
-            repoPath = repoKey + ":" + path;
-            if (ContextHelper.get().getAuthorizationService().canRead(RepoPathFactory.create(repoKey, path))) {
-                actions.add(new BaseArtifact("Download"));
-                actions.add(new BaseArtifact("ShowInTree"));
-                if (NamingUtils.isViewable(path) || "class".equals(PathUtils.getExtension(getPath()))) {
-                    actions.add(new BaseArtifact("View"));
-                }
-            }
-        } else {
-            path = "No path found (externally resolved or deleted/overwritten)";
-        }
-    }
-
-
-    /**
-     * update current and prev artifact name base on diff status
-     *
-     * @param moduleDependency - module artifact as updated from db
-     */
-    private void updateArtifactNames(BuildsDiffDependencyModel moduleDependency) {
-        if (moduleDependency != null) {
-            String status = moduleDependency.getStatus().toString();
-            switch (status) {
-                case "Removed": {
-                    prevName = moduleDependency.getName();
-                    name = "";
-                }
-                break;
-                case "Add": {
-                    prevName = "";
-                }
-                break;
-                case "Updated": {
-                    String diffName = moduleDependency.getDiffName();
-                    if (diffName != null && diffName.length() > 0) {
-                        prevName = diffName;
-                    } else {
-                        prevName = name;
-                    }
-                }
-                break;
-                case "Unchanged": {
-                    prevName = name;
-                }
-                break;
-            }
-        }
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public String getRepoPath() {
-        return repoPath;
-    }
-
-    public void setRepoPath(String repoPath) {
-        this.repoPath = repoPath;
-    }
-
-    public String getDownloadLink() {
-        return downloadLink;
-    }
-
-    public void setDownloadLink(String downloadLink) {
-        this.downloadLink = downloadLink;
-    }
-
-    public String getScope() {
-        return scope;
-    }
-
-    public void setScope(String scope) {
-        this.scope = scope;
-    }
-
-    public List<BaseArtifact> getActions() {
-        return actions;
-    }
-
-    public void setActions(List<BaseArtifact> actions) {
-        this.actions = actions;
-    }
-
-    public void cleanData() {
-        this.repoKey = null;
-        this.repoPath = null;
-        this.actions = null;
-        this.repoPath = null;
-    }
-
-    public String getStatus() {
-        return status;
-    }
-
-    public void setStatus(String status) {
-        this.status = status;
-    }
-
-    public String getModuleName() {
-        return moduleName;
-    }
-
-    public void setModuleName(String moduleName) {
-        this.moduleName = moduleName;
-    }
-
-    public String getPrevName() {
-        return prevName;
-    }
-
-    public void setPrevName(String prevName) {
-        this.prevName = prevName;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/PromotionStatusModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/PromotionStatusModel.java
deleted file mode 100644
index 87f1f06..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/builds/PromotionStatusModel.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package org.artifactory.ui.rest.model.builds;
-
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-import org.artifactory.rest.common.model.BaseModel;
-import org.jfrog.build.api.Build;
-import org.jfrog.build.api.release.PromotionStatus;
-
-/**
- * @author Chen Keinan
- */
-public class PromotionStatusModel extends BaseModel {
-
-
-    public static final String RELEASED = "Released";
-
-    private String repository;
-    private String comment;
-    private String ciUser;
-    private String user;
-    private String status;
-    private String timestamp;
-
-    public PromotionStatusModel(PromotionStatus promotionStatus) {
-        setStatus(promotionStatus.getStatus());
-        setCiUser(promotionStatus.getCiUser());
-        setComment(promotionStatus.getComment());
-        setRepository(promotionStatus.getRepository());
-        setTimestamp(promotionStatus.getTimestamp());
-        setUser(promotionStatus.getUser());
-    }
-
-    public PromotionStatusModel(String status, String comment, String repository, String timestamp, String user,
-                                String ciUser) {
-        this.status = status;
-        this.comment = comment;
-        this.repository = repository;
-        this.timestamp = timestamp;
-        this.user = user;
-        this.ciUser = ciUser;
-    }
-
-    public String getStatus() {
-        return status;
-    }
-
-    public void setStatus(String status) {
-        this.status = status;
-    }
-
-    public String getComment() {
-        return comment;
-    }
-
-    public void setComment(String comment) {
-        this.comment = comment;
-    }
-
-    public String getRepository() {
-        return repository;
-    }
-
-    public void setRepository(String repository) {
-        this.repository = repository;
-    }
-
-    public String getTimestamp() {
-        return timestamp;
-    }
-
-    public Date getTimestampDate() {
-        if (timestamp == null) {
-            throw new IllegalArgumentException("Cannot parse a null timestamp as a date");
-        }
-        SimpleDateFormat format = new SimpleDateFormat(Build.STARTED_FORMAT);
-        try {
-            return format.parse(timestamp);
-        } catch (ParseException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    public void setTimestamp(String timestamp) {
-        this.timestamp = timestamp;
-    }
-
-    public String getUser() {
-        return user;
-    }
-
-    public void setUser(String user) {
-        this.user = user;
-    }
-
-    public String getCiUser() {
-        return ciUser;
-    }
-
-    public void setCiUser(String ciUser) {
-        this.ciUser = ciUser;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/common/RepoKeyPath.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/common/RepoKeyPath.java
deleted file mode 100644
index 5653f76..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/common/RepoKeyPath.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.artifactory.ui.rest.model.common;
-
-/**
- * @author Chen Keinan
- */
-public class RepoKeyPath {
-
-    private String path;
-    private String repoKey;
-
-    RepoKeyPath() {
-    }
-
-    public RepoKeyPath(String path, String repoKey) {
-        this.path = path;
-        this.repoKey = repoKey;
-    }
-
-    public String getPath() {
-        return path;
-    }
-
-    public void setPath(String path) {
-        this.path = path;
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/empty/EmptyModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/empty/EmptyModel.java
deleted file mode 100644
index a2d637b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/empty/EmptyModel.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.artifactory.ui.rest.model.empty;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Chen Keinan
- */
-public class EmptyModel extends BaseModel {
-    private String empty;
-
-    public String getEmpty() {
-        return empty;
-    }
-
-    public void setEmpty(String empty) {
-        this.empty = empty;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/general/Footer.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/general/Footer.java
deleted file mode 100644
index f41061d..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/general/Footer.java
+++ /dev/null
@@ -1,195 +0,0 @@
-package org.artifactory.ui.rest.model.general;
-
-import org.artifactory.descriptor.message.SystemMessageDescriptor;
-import org.artifactory.rest.common.model.BaseModel;
-import org.codehaus.jackson.annotate.JsonProperty;
-
-/**
- * @author Chen Keinan
- */
-public class Footer extends BaseModel {
-    private String versionInfo;
-    private String buildNumber;
-    private String licenseInfo;
-    private String copyRights;
-    private String copyRightsUrl;
-    private boolean isAol;
-    private boolean isDedicatedAol;
-    private String versionID;
-    private boolean globalRepoEnabled;
-    private boolean userLogo;
-    private String logoUrl;
-    private String serverName;
-    private boolean helpLinksEnabled;
-    private boolean systemMessageEnabled;
-    private String systemMessageTitle;
-    private String systemMessageTitleColor;
-    private String systemMessage;
-    private boolean showSystemMessageOnAllPages;
-    private String serverId;
-    private boolean trashDisabled;
-    private boolean allowPermDeletes;
-    private boolean samlRedirectEnabled;
-
-    public Footer(String licenseInfo, String versionInfo, String copyRights, String copyRightsUrl,
-                  String buildNumber, boolean isAol, boolean isDedicatedAol, boolean isGlobalRepoEnabled, String versionID, boolean userLogo,
-                  String logoUrl, String serverName, SystemMessageDescriptor systemMessageDescriptor,
-                  boolean helpLinksEnabled, String serverId, boolean trashDisabled, boolean allowPermDeletes, boolean samlRedirectEnabled) {
-        this.licenseInfo = licenseInfo;
-        this.versionInfo = versionInfo;
-        this.copyRights = copyRights;
-        this.copyRightsUrl = copyRightsUrl;
-        this.buildNumber = buildNumber;
-        this.isAol = isAol;
-        this.isDedicatedAol = isDedicatedAol;
-        this.globalRepoEnabled = isGlobalRepoEnabled;
-        this.versionID = versionID;
-        this.userLogo = userLogo;
-        this.logoUrl = logoUrl;
-        this.serverName = serverName;
-        this.trashDisabled = trashDisabled;
-        this.allowPermDeletes = allowPermDeletes;
-        this.systemMessageEnabled = systemMessageDescriptor.isEnabled();
-        this.systemMessageTitle = systemMessageDescriptor.getTitle();
-        this.systemMessageTitleColor = systemMessageDescriptor.getTitleColor();
-        this.systemMessage = systemMessageDescriptor.getMessage();
-        this.showSystemMessageOnAllPages = systemMessageDescriptor.isShowOnAllPages();
-        this.helpLinksEnabled = helpLinksEnabled;
-        this.serverId = serverId;
-        this.samlRedirectEnabled = samlRedirectEnabled;
-    }
-
-    public String getLicenseInfo() {
-        return licenseInfo;
-    }
-
-    public void setLicenseInfo(String licenseInfo) {
-        this.licenseInfo = licenseInfo;
-    }
-
-    public String getVersionInfo() {
-        return versionInfo;
-    }
-
-    public void setVersionInfo(String versionInfo) {
-        this.versionInfo = versionInfo;
-    }
-
-    public String getCopyRights() {
-        return copyRights;
-    }
-
-    public void setCopyRights(String copyRights) {
-        this.copyRights = copyRights;
-    }
-
-    public String getCopyRightsUrl() {
-        return copyRightsUrl;
-    }
-
-    public void setCopyRightsUrl(String copyRightsUrl) {
-        this.copyRightsUrl = copyRightsUrl;
-    }
-
-    public String getBuildNumber() {
-        return buildNumber;
-    }
-
-    public void setBuildNumber(String buildNumber) {
-        this.buildNumber = buildNumber;
-    }
-
-    @JsonProperty("isAol")
-    public boolean isAol() {
-        return isAol;
-    }
-
-    public String getVersionID() {
-        return versionID;
-    }
-
-    public void setVersionID(String versionID) {
-        this.versionID = versionID;
-    }
-
-    public boolean isGlobalRepoEnabled() {
-        return globalRepoEnabled;
-    }
-
-    public boolean isUserLogo() {
-        return userLogo;
-    }
-
-    public void setUserLogo(boolean userLogo) {
-        this.userLogo = userLogo;
-    }
-
-    public String getLogoUrl() {
-        return logoUrl;
-    }
-
-    public void setLogoUrl(String logoUrl) {
-        this.logoUrl = logoUrl;
-    }
-
-    public String getServerName() {
-        return serverName;
-    }
-
-    public void setServerName(String serverName) {
-        this.serverName = serverName;
-    }
-
-    public boolean isSystemMessageEnabled() {
-        return systemMessageEnabled;
-    }
-
-    public String getSystemMessageTitle() {
-        return systemMessageTitle;
-    }
-
-    public String getSystemMessageTitleColor() {
-        return systemMessageTitleColor;
-    }
-
-    public String getSystemMessage() {
-        return systemMessage;
-    }
-
-    public boolean isShowSystemMessageOnAllPages() {
-        return showSystemMessageOnAllPages;
-    }
-
-    public boolean isHelpLinksEnabled() {
-        return helpLinksEnabled;
-    }
-
-    public String getServerId() {
-        return serverId;
-    }
-
-    public void setServerId(String serverId) {
-        this.serverId = serverId;
-    }
-
-    public boolean isTrashDisabled() {
-        return trashDisabled;
-    }
-
-    public boolean isAllowPermDeletes() {
-        return allowPermDeletes;
-    }
-
-    @JsonProperty("isDedicatedAol")
-    public boolean isDedicatedAol() { return isDedicatedAol; }
-
-    public void setDedicatedAol(boolean dedicatedAol) { isDedicatedAol = dedicatedAol; }
-
-    public boolean isSamlRedirectEnabled() {
-        return samlRedirectEnabled;
-    }
-
-    public void setSamlRedirectEnabled(boolean samlRedirectEnabled) {
-        this.samlRedirectEnabled = samlRedirectEnabled;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/home/AddonModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/home/AddonModel.java
deleted file mode 100644
index 13f4895..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/home/AddonModel.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package org.artifactory.ui.rest.model.home;
-
-import org.artifactory.addon.AddonInfo;
-import org.artifactory.addon.AddonState;
-import org.artifactory.addon.AddonType;
-import org.artifactory.rest.common.model.BaseModel;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class AddonModel extends BaseModel {
-
-    private String name;
-    private String configurationUrl;
-    private String learnMoreUrl;
-    private String status;
-    private String[] categories;
-    private String type;
-    private String displayName;
-
-    public AddonModel(AddonType addonType, AddonInfo addonInfo, String url, String configurationUrl) {
-        this.learnMoreUrl = url;
-        updateAddonState(addonInfo);
-        setCategoriesData(addonType);
-        this.type = addonType.getType();
-        this.setName(addonType.getAddonName());
-        this.setDisplayName(addonType.getAddonDisplayName());
-        this.configurationUrl = configurationUrl;
-    }
-
-    /**
-     * set categories data
-     *
-     * @param addonType - addon type (docker,aql,build and etc)
-     */
-    private void setCategoriesData(AddonType addonType) {
-        if (status.equals("Available")) {
-            List<String> categoriesList = new ArrayList<>();
-            if (addonType.getCategories() != null && addonType.getCategories().length > 0) {
-                for (String catgor : addonType.getCategories()) {
-                    categoriesList.add(catgor);
-                }
-                categoriesList.add("available");
-                categories = categoriesList.toArray(new String[categoriesList.size()]);
-                ;
-            }
-        } else {
-            this.categories = addonType.getCategories();
-        }
-    }
-
-    private void updateAddonState(AddonInfo addonInfo) {
-        if (addonInfo != null) {
-            this.status = getAddonStatus(addonInfo.getAddonState());
-        } else {
-            this.status = AddonState.INACTIVATED.name();
-        }
-    }
-
-
-    public String getConfigurationUrl() {
-        return configurationUrl;
-    }
-
-    public void setConfigurationUrl(String configurationUrl) {
-        this.configurationUrl = configurationUrl;
-    }
-
-    public String getLearnMoreUrl() {
-        return learnMoreUrl;
-    }
-
-    public void setLearnMoreUrl(String learnMoreUrl) {
-        this.learnMoreUrl = learnMoreUrl;
-    }
-
-    public String getStatus() {
-        return status;
-    }
-
-    public void setStatus(String status) {
-        this.status = status;
-    }
-
-    public String[] getCategories() {
-        return categories;
-    }
-
-    public void setCategories(String[] categories) {
-        this.categories = categories;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    private String getAddonStatus(AddonState addonState) {
-        switch (addonState) {
-            case NOT_CONFIGURED:    // Fall-through
-            case ACTIVATED:
-                return "Available";
-            case DISABLED:
-                return "Disabled";
-            case INACTIVATED:   // Fall-through
-            case NOT_LICENSED:  // Fall-through
-            default:
-                return "Not Available";
-        }
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public String getDisplayName() {
-        return displayName;
-    }
-
-    public void setDisplayName(String displayName) {
-        this.displayName = displayName;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/home/HomeModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/home/HomeModel.java
deleted file mode 100644
index fc6d1f7..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/home/HomeModel.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package org.artifactory.ui.rest.model.home;
-
-import org.artifactory.rest.common.model.BaseModel;
-import org.codehaus.jackson.annotate.JsonProperty;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class HomeModel extends BaseModel {
-
-    private long artifacts;
-    private String version;
-    private String latestRelease;
-    private String upTime;
-    private String latestReleaseLink;
-    private List<AddonModel> addons;
-    private String accountManagementLink;
-    private boolean displayAccountManagementLink;
-
-
-    public long getArtifacts() {
-        return artifacts;
-    }
-
-    public void setArtifacts(long artifacts) {
-        this.artifacts = artifacts;
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public String getLatestRelease() {
-        return latestRelease;
-    }
-
-    public void setLatestRelease(String latestRelease) {
-        this.latestRelease = latestRelease;
-    }
-
-    public List<AddonModel> getAddons() {
-        return addons;
-    }
-
-    public void setAddons(List<AddonModel> addons) {
-        this.addons = addons;
-    }
-
-    public String getLatestReleaseLink() {
-        return latestReleaseLink;
-    }
-
-    public void setLatestReleaseLink(String latestReleaseLink) {
-        this.latestReleaseLink = latestReleaseLink;
-    }
-
-
-    public String getUpTime() {
-        return upTime;
-    }
-
-    public void setUpTime(String upTime) {
-        this.upTime = upTime;
-    }
-
-    public String getAccountManagementLink() {
-        return accountManagementLink;
-    }
-
-    public void setAccountManagementLink(String accountManagementLink) {
-        this.accountManagementLink = accountManagementLink;
-    }
-
-    public boolean isDisplayAccountManagementLink() {
-        return displayAccountManagementLink;
-    }
-
-    public void setDisplayAccountManagementLink(boolean displayAccountManagementLink) {
-        this.displayAccountManagementLink = displayAccountManagementLink;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/replication/GlobalReplicationConfig.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/replication/GlobalReplicationConfig.java
deleted file mode 100644
index d8f3e22..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/replication/GlobalReplicationConfig.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.artifactory.ui.rest.model.replication;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author gidis
- */
-public class GlobalReplicationConfig extends BaseModel {
-    private boolean blockPullReplications;
-
-    private boolean blockPushReplications;
-
-    public boolean isBlockPullReplications() {
-        return blockPullReplications;
-    }
-
-    public void setBlockPullReplications(boolean blockPullReplications) {
-        this.blockPullReplications = blockPullReplications;
-    }
-
-    public boolean isBlockPushReplications() {
-        return blockPushReplications;
-    }
-
-    public void setBlockPushReplications(boolean blockPushReplications) {
-        this.blockPushReplications = blockPushReplications;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/setmeup/GradleSettingModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/setmeup/GradleSettingModel.java
deleted file mode 100644
index 8564be3..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/setmeup/GradleSettingModel.java
+++ /dev/null
@@ -1,211 +0,0 @@
-package org.artifactory.ui.rest.model.setmeup;
-
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.rest.common.model.BaseModel;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author chen keinan
- */
-public class GradleSettingModel extends BaseModel {
-
-    private String pluginRepoKey;
-    private String libsResolverRepoKey;
-    private String libsPublisherRepoKey;
-    private Boolean pluginUseMaven;
-    private Boolean resolverUseMaven;
-    private Boolean publisherUseMaven;
-    private Boolean pluginUseIvy;
-    private Boolean resolverUseIvy;
-    private Boolean publisherUseIvy;
-    private String pluginResolverLayout;
-    private String libsResolverLayout;
-    private String libsPublisherLayouts;
-    private String snippetName;
-    private String savedSnippetName;
-
-    private Set<String> libsPublisher = Sets.newTreeSet((o1, o2) ->
-            StringUtils.containsIgnoreCase(o1, "release") && !StringUtils.containsIgnoreCase(o1, "plugin") ? -1 : 1);
-    private Set<String> pluginResolver = Sets.newTreeSet(
-            (o1, o2) -> StringUtils.containsIgnoreCase(o1, "plugin") && StringUtils.containsIgnoreCase(o1, "release") ?
-                    -1 : 1);
-    private Set<String> LibsResolver = Sets.newTreeSet((o1, o2) ->
-            StringUtils.containsIgnoreCase(o1, "release") && !StringUtils.containsIgnoreCase(o1, "plugin") ? -1 : 1);
-    private List<String> layouts = new ArrayList<>();
-    private String gradleSnippet;
-
-    public GradleSettingModel() {}
-
-    public GradleSettingModel(String gradleSnippet) {
-        this.gradleSnippet=gradleSnippet;
-    }
-
-    public GradleSettingModel(String snippetName, String savedSnippetName) {
-        this.snippetName = snippetName;
-        this.savedSnippetName = savedSnippetName;
-    }
-
-
-    public Set<String> getLibsPublisher() {
-        return libsPublisher;
-    }
-
-    public void setLibsPublisher(Set<String> libsPublisher) {
-        this.libsPublisher = libsPublisher;
-    }
-
-    public Set<String> getPluginResolver() {
-        return pluginResolver;
-    }
-
-    public void setPluginResolver(Set<String> pluginResolver) {
-        this.pluginResolver = pluginResolver;
-    }
-
-    public Set<String> getLibsResolver() {
-        return LibsResolver;
-    }
-
-    public void setLibsResolver(Set<String> libsResolver) {
-        LibsResolver = libsResolver;
-    }
-
-    public List<String> getLayouts() {
-        return layouts;
-    }
-
-    public void setLayouts(List<String> layouts) {
-        this.layouts = layouts;
-    }
-
-    public String getPluginRepoKey() {
-        return pluginRepoKey;
-    }
-
-    public void setPluginRepoKey(String pluginRepoKey) {
-        this.pluginRepoKey = pluginRepoKey;
-    }
-
-    public String getLibsResolverRepoKey() {
-        return libsResolverRepoKey;
-    }
-
-    public void setLibsResolverRepoKey(String libsResolverRepoKey) {
-        this.libsResolverRepoKey = libsResolverRepoKey;
-    }
-
-    public String getLibsPublisherRepoKey() {
-        return libsPublisherRepoKey;
-    }
-
-    public void setLibsPublisherRepoKey(String libsPublisherRepoKey) {
-        this.libsPublisherRepoKey = libsPublisherRepoKey;
-    }
-
-    public String getPluginResolverLayout() {
-        return pluginResolverLayout;
-    }
-
-    public void setPluginResolverLayout(String pluginResolverLayout) {
-        this.pluginResolverLayout = pluginResolverLayout;
-    }
-
-    public String getLibsResolverLayout() {
-        return libsResolverLayout;
-    }
-
-    public void setLibsResolverLayout(String libsResolverLayout) {
-        this.libsResolverLayout = libsResolverLayout;
-    }
-
-    public String getLibsPublisherLayouts() {
-        return libsPublisherLayouts;
-    }
-
-    public void setLibsPublisherLayouts(String libsPublisherLayouts) {
-        this.libsPublisherLayouts = libsPublisherLayouts;
-    }
-
-    public Boolean getPluginUseMaven() {
-        return pluginUseMaven;
-    }
-
-    public void setPluginUseMaven(Boolean pluginUseMaven) {
-        this.pluginUseMaven = pluginUseMaven;
-    }
-
-    public Boolean getResolverUseMaven() {
-        return resolverUseMaven;
-    }
-
-    public void setResolverUseMaven(Boolean resolverUseMaven) {
-        this.resolverUseMaven = resolverUseMaven;
-    }
-
-    public Boolean getPublisherUseMaven() {
-        return publisherUseMaven;
-    }
-
-    public void setPublisherUseMaven(Boolean publisherUseMaven) {
-        this.publisherUseMaven = publisherUseMaven;
-    }
-
-    public Boolean getPluginUseIvy() {
-        return pluginUseIvy;
-    }
-
-    public void setPluginUseIvy(Boolean pluginUseIvy) {
-        this.pluginUseIvy = pluginUseIvy;
-    }
-
-    public Boolean getResolverUseIvy() {
-        return resolverUseIvy;
-    }
-
-    public void setResolverUseIvy(Boolean resolverUseIvy) {
-        this.resolverUseIvy = resolverUseIvy;
-    }
-
-    public Boolean getPublisherUseIvy() {
-        return publisherUseIvy;
-    }
-
-    public void setPublisherUseIvy(Boolean publisherUseIvy) {
-        this.publisherUseIvy = publisherUseIvy;
-    }
-
-    public String getGradleSnippet() {
-        return gradleSnippet;
-    }
-
-    public void setGradleSnippet(String gradleSnippet) {
-        this.gradleSnippet = gradleSnippet;
-    }
-
-    public String getSnippetName() {
-        return snippetName;
-    }
-
-    public void setSnippetName(String snippetName) {
-        this.snippetName = snippetName;
-    }
-
-    public String getSavedSnippetName() {
-        return savedSnippetName;
-    }
-
-    public void setSavedSnippetName(String savedSnippetName) {
-        this.savedSnippetName = savedSnippetName;
-    }
-
-    public void clearProps(){
-       pluginResolver = null;
-        LibsResolver = null;
-       libsPublisher = null;
-       layouts = null;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/setmeup/IvySettingModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/setmeup/IvySettingModel.java
deleted file mode 100644
index 5beeeba..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/setmeup/IvySettingModel.java
+++ /dev/null
@@ -1,124 +0,0 @@
-package org.artifactory.ui.rest.model.setmeup;
-
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.rest.common.model.BaseModel;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author chen keinan
- */
-public class IvySettingModel extends BaseModel {
-
-    private Set<String> libsRepository = Sets.newTreeSet((o1, o2) ->
-            StringUtils.containsIgnoreCase(o1, "release") && !StringUtils.containsIgnoreCase(o1, "plugin") ? -1 : 1);
-    private List<String> libsRepositoryLayout = new ArrayList<>();
-    private String libsRepo;
-    private String libsRepoLayout;
-    private String libsResolverName;
-    private Boolean useIbiblioResolver;
-    private Boolean m2Compatible;
-    private String ivySnippet;
-    private String settings;
-    private String savedSnippetName;
-
-    public IvySettingModel() {
-    }
-
-    public IvySettingModel(String ivySnippet) {
-        this.ivySnippet = ivySnippet;
-    }
-
-    public IvySettingModel(String settings, String savedSnippetName) {
-        this.settings = settings;
-        this.savedSnippetName = savedSnippetName;
-    }
-
-    public Set<String> getLibsRepository() {
-        return libsRepository;
-    }
-
-    public void setLibsRepository(Set<String> libsRepository) {
-        this.libsRepository = libsRepository;
-    }
-
-    public List<String> getLibsRepositoryLayout() {
-        return libsRepositoryLayout;
-    }
-
-    public void setLibsRepositoryLayout(List<String> libsRepositoryLayout) {
-        this.libsRepositoryLayout = libsRepositoryLayout;
-    }
-
-    public String getLibsRepo() {
-        return libsRepo;
-    }
-
-    public void setLibsRepo(String libsRepo) {
-        this.libsRepo = libsRepo;
-    }
-
-    public String getLibsRepoLayout() {
-        return libsRepoLayout;
-    }
-
-    public void setLibsRepoLayout(String libsRepoLayout) {
-        this.libsRepoLayout = libsRepoLayout;
-    }
-
-    public String getLibsResolverName() {
-        return libsResolverName;
-    }
-
-    public void setLibsResolverName(String libsResolverName) {
-        this.libsResolverName = libsResolverName;
-    }
-
-    public Boolean getUseIbiblioResolver() {
-        return useIbiblioResolver;
-    }
-
-    public void setUseIbiblioResolver(Boolean useIbiblioResolver) {
-        this.useIbiblioResolver = useIbiblioResolver;
-    }
-
-    public Boolean getM2Compatible() {
-        return m2Compatible;
-    }
-
-    public void setM2Compatible(Boolean m2Compatible) {
-        this.m2Compatible = m2Compatible;
-    }
-
-    public String getIvySnippet() {
-        return ivySnippet;
-    }
-
-    public void setIvySnippet(String ivySnippet) {
-        this.ivySnippet = ivySnippet;
-    }
-
-    public String getSettings() {
-        return settings;
-    }
-
-    public void setSettings(String settings) {
-        this.settings = settings;
-    }
-
-    public String getSavedSnippetName() {
-        return savedSnippetName;
-    }
-
-    public void setSavedSnippetName(String savedSnippetName) {
-        this.savedSnippetName = savedSnippetName;
-    }
-
-    public void clearProps() {
-        libsRepository = null;
-        libsRepositoryLayout = null;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/setmeup/MavenSettingModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/setmeup/MavenSettingModel.java
deleted file mode 100644
index a6cd532..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/setmeup/MavenSettingModel.java
+++ /dev/null
@@ -1,157 +0,0 @@
-package org.artifactory.ui.rest.model.setmeup;
-
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.rest.common.model.BaseModel;
-
-import java.util.Set;
-
-/**
- * @author chen keinan
- */
-public class MavenSettingModel extends BaseModel {
-
-    private String release;
-    private String snapshot;
-    private String pluginRelease;
-    private String pluginSnapshot;
-    private String mirror;
-    private String mavenSnippet;
-    private String settings;
-    private String savedSnippetName;
-    private Set<String> releases = Sets.newTreeSet(
-            (o1, o2) -> StringUtils.containsIgnoreCase(o1, "release") && !StringUtils.containsIgnoreCase(o1, "plugin") ?
-                    -1 : 1);
-    private Set<String> pluginReleases = Sets.newTreeSet(
-            (o1, o2) -> StringUtils.containsIgnoreCase(o1, "plugin") && StringUtils.containsIgnoreCase(o1, "release") ?
-                    -1 : 1);
-    private Set<String> snapshots = Sets.newTreeSet((o1, o2) ->
-            StringUtils.containsIgnoreCase(o1, "snapshot") && !StringUtils.containsIgnoreCase(o1, "plugin") ? -1 : 1);
-    private Set<String> pluginSnapshots = Sets.newTreeSet(
-            (o1, o2) -> StringUtils.containsIgnoreCase(o1, "plugin") && StringUtils.containsIgnoreCase(o1, "snapshot") ?
-                    -1 : 1);
-    private Set<String> anyMirror = Sets.newTreeSet((o1, o2) -> StringUtils.containsIgnoreCase(o1, "release") ? 1 : -1);
-
-    public MavenSettingModel(){}
-
-    public MavenSettingModel (String mavenSnippet){
-        this.mavenSnippet = mavenSnippet;
-    }
-
-    public MavenSettingModel(String settings, String savedSnippetName) {
-        this.settings = settings;
-        this.savedSnippetName = savedSnippetName;
-    }
-
-    public Set<String> getReleases() {
-        return releases;
-    }
-
-    public void setReleases(Set<String> releases) {
-        this.releases = releases;
-    }
-
-    public Set<String> getPluginReleases() {
-        return pluginReleases;
-    }
-
-    public void setPluginReleases(Set<String> pluginReleases) {
-        this.pluginReleases = pluginReleases;
-    }
-
-    public Set<String> getSnapshots() {
-        return snapshots;
-    }
-
-    public void setSnapshots(Set<String> snapshots) {
-        this.snapshots = snapshots;
-    }
-
-    public Set<String> getPluginSnapshots() {
-        return pluginSnapshots;
-    }
-
-    public void setPluginSnapshots(Set<String> pluginSnapshots) {
-        this.pluginSnapshots = pluginSnapshots;
-    }
-
-    public Set<String> getAnyMirror() {
-        return anyMirror;
-    }
-
-    public void setAnyMirror(Set<String> anyMirror) {
-        this.anyMirror = anyMirror;
-    }
-
-    public String getRelease() {
-        return release;
-    }
-
-    public void setRelease(String release) {
-        this.release = release;
-    }
-
-    public String getSnapshot() {
-        return snapshot;
-    }
-
-    public void setSnapshot(String snapshot) {
-        this.snapshot = snapshot;
-    }
-
-    public String getPluginRelease() {
-        return pluginRelease;
-    }
-
-    public void setPluginRelease(String pluginRelease) {
-        this.pluginRelease = pluginRelease;
-    }
-
-    public String getPluginSnapshot() {
-        return pluginSnapshot;
-    }
-
-    public void setPluginSnapshot(String pluginSnapshot) {
-        this.pluginSnapshot = pluginSnapshot;
-    }
-
-    public String getMirror() {
-        return mirror;
-    }
-
-    public void setMirror(String mirror) {
-        this.mirror = mirror;
-    }
-
-    public String getMavenSnippet() {
-        return mavenSnippet;
-    }
-
-    public void setMavenSnippet(String mavenSnippet) {
-        this.mavenSnippet = mavenSnippet;
-    }
-
-    public String getSettings() {
-        return settings;
-    }
-
-    public void setSettings(String settings) {
-        this.settings = settings;
-    }
-
-    public String getSavedSnippetName() {
-        return savedSnippetName;
-    }
-
-    public void setSavedSnippetName(String savedSnippetName) {
-        this.savedSnippetName = savedSnippetName;
-    }
-
-    public void clearProps(){
-        releases = null;
-        pluginReleases = null;
-        snapshots = null;
-        pluginSnapshots = null;
-        anyMirror = null;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/setmeup/ReverseProxySetMeUpDataModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/setmeup/ReverseProxySetMeUpDataModel.java
deleted file mode 100644
index 7832127..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/setmeup/ReverseProxySetMeUpDataModel.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.artifactory.ui.rest.model.setmeup;
-
-import org.artifactory.rest.common.model.BaseModel;
-import org.artifactory.ui.rest.model.utils.repositories.RepoKeyType;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class ReverseProxySetMeUpDataModel extends BaseModel {
-
-    private boolean usingHttps;
-    private boolean methodSelected;
-    private boolean usingPorts;
-    private String  serverName;
-    private Integer repoPort;
-
-    public boolean isUsingPorts() {
-        return usingPorts;
-    }
-
-    public void setUsingPorts(boolean usingPorts) {
-        this.usingPorts = usingPorts;
-    }
-
-    public boolean isUsingHttps() {
-        return usingHttps;
-    }
-
-    public void setUsingHttps(boolean usingHttps) {
-        this.usingHttps = usingHttps;
-    }
-
-    public boolean isMethodSelected() {
-        return methodSelected;
-    }
-
-    public void setMethodSelected(boolean methodSelected) {
-        this.methodSelected = methodSelected;
-    }
-
-    public String getServerName() {
-        return serverName;
-    }
-
-    public void setServerName(String serverName) {
-        this.serverName = serverName;
-    }
-
-    public Integer getRepoPort() {
-        return repoPort;
-    }
-
-    public void setRepoPort(Integer repoPort) {
-        this.repoPort = repoPort;
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/setmeup/ScriptDownload.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/setmeup/ScriptDownload.java
deleted file mode 100644
index 9e54519..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/setmeup/ScriptDownload.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.artifactory.ui.rest.model.setmeup;
-
-import org.artifactory.rest.common.model.FileModel;
-import org.artifactory.rest.common.model.RestModel;
-
-/**
- * @author chen keinan
- */
-public class ScriptDownload implements RestModel, FileModel {
-    private String fileContent;
-
-    @Override
-    public Object getFileResource() {
-        return fileContent;
-    }
-
-    public String getFileContent() {
-        return fileContent;
-    }
-
-    public void setFileContent(String fileContent) {
-        this.fileContent = fileContent;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/setmeup/SetMeUpModel.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/setmeup/SetMeUpModel.java
deleted file mode 100644
index f938aa5..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/setmeup/SetMeUpModel.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.artifactory.ui.rest.model.setmeup;
-
-import org.artifactory.rest.common.model.BaseModel;
-import org.artifactory.ui.rest.model.utils.repositories.RepoKeyType;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class SetMeUpModel extends BaseModel {
-
-    private List<RepoKeyType> repoKeyTypes;
-
-    public List<RepoKeyType> getRepoKeyTypes() {
-        return repoKeyTypes;
-    }
-
-    private String baseUrl;
-
-    private String serverId;
-
-    private String hostname;
-
-    public void setRepoKeyTypes(List<RepoKeyType> repoKeyTypes) {
-        this.repoKeyTypes = repoKeyTypes;
-    }
-
-    public String getBaseUrl() {
-        return baseUrl;
-    }
-
-    public void setBaseUrl(String baseUrl) {
-        this.baseUrl = baseUrl;
-    }
-
-    public String getServerId() {
-        return serverId;
-    }
-
-    public void setServerId(String serverId) {
-        this.serverId = serverId;
-    }
-
-    public String getHostname() {
-        return hostname;
-    }
-
-    public void setHostname(String hostname) {
-        this.hostname = hostname;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/utils/FileUpload.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/utils/FileUpload.java
deleted file mode 100644
index a7b1b84..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/utils/FileUpload.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.ui.rest.model.utils;
-
-import java.io.File;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-import com.sun.jersey.multipart.FormDataMultiPart;
-
-/**
- * @author Chen Keinan
- */
-public class FileUpload extends BaseModel {
-
-    private String folderName;
-    private FormDataMultiPart formDataMultiPart;
-    private File file;
-
-    public FileUpload(FormDataMultiPart fileUpload) {
-        this.formDataMultiPart = fileUpload;
-    }
-
-    public FileUpload(String folderName) {
-        this.folderName = folderName;
-    }
-
-    public FileUpload() {}
-
-    public FormDataMultiPart getFormDataMultiPart() {
-        return formDataMultiPart;
-    }
-
-    public void setFormDataMultiPart(FormDataMultiPart formDataMultiPart) {
-        this.formDataMultiPart = formDataMultiPart;
-    }
-
-    public String getFolderName() {
-        return folderName;
-    }
-
-    public void setFolderName(String folderName) {
-        this.folderName = folderName;
-    }
-
-    public File getFile() {
-        return file;
-    }
-
-    public void setFile(File file) {
-        this.file = file;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/utils/cron/CronTime.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/utils/cron/CronTime.java
deleted file mode 100644
index 5c082d9..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/utils/cron/CronTime.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.artifactory.ui.rest.model.utils.cron;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Chen Keinan
- */
-public class CronTime extends BaseModel {
-
-    private String nextTime;
-
-    public CronTime(String nextExecutionTime) {
-        this.nextTime = nextExecutionTime;
-    }
-
-    public String getNextTime() {
-        return nextTime;
-    }
-
-    public void setNextTime(String nextTime) {
-        this.nextTime = nextTime;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/utils/licenses/ArtifactLicenses.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/utils/licenses/ArtifactLicenses.java
deleted file mode 100644
index deceeb2..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/utils/licenses/ArtifactLicenses.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.artifactory.ui.rest.model.utils.licenses;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class ArtifactLicenses {
-
-    List<String> predefineValues;
-    List<String> selectedValues;
-
-    public List<String> getPredefineValues() {
-        return predefineValues;
-    }
-
-    public void setPredefineValues(List<String> predefineValues) {
-        this.predefineValues = predefineValues;
-    }
-
-    public List<String> getSelectedValues() {
-        return selectedValues;
-    }
-
-    public void setSelectedValues(List<String> selectedValues) {
-        this.selectedValues = selectedValues;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/utils/predefinevalues/PreDefineValues.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/utils/predefinevalues/PreDefineValues.java
deleted file mode 100644
index 9ab889d..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/utils/predefinevalues/PreDefineValues.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.artifactory.ui.rest.model.utils.predefinevalues;
-
-import java.util.List;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Chen Keinan
- */
-public class PreDefineValues extends BaseModel {
-
-    List<String> predefinedValues;
-    List<String> selectedValues;
-
-    public List<String> getSelectedValues() {
-        return selectedValues;
-    }
-
-    public void setSelectedValues(List<String> selectedValues) {
-        this.selectedValues = selectedValues;
-    }
-
-    public List<String> getPredefinedValues() {
-        return predefinedValues;
-    }
-
-    public void setPredefinedValues(List<String> predefinedValues) {
-        this.predefinedValues = predefinedValues;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/utils/repositories/RepoKeyType.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/utils/repositories/RepoKeyType.java
deleted file mode 100644
index 6a739c0..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/utils/repositories/RepoKeyType.java
+++ /dev/null
@@ -1,135 +0,0 @@
-package org.artifactory.ui.rest.model.utils.repositories;
-
-import org.artifactory.descriptor.repo.DockerApiVersion;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Chen keinan
- */
-public class RepoKeyType extends BaseModel {
-
-    private String repoKey;
-    private RepoType RepoType;
-    private String layoutPattern;
-    private String layoutFolderItegRevRegex;
-    private String layoutFileItegRevRegex;
-    private String dockerApiVersion;
-    private String type;
-    private Boolean canDeploy;
-    private Boolean canRead;
-    private Boolean isLocal;
-    private Boolean isRemote;
-    private Boolean isVirtual;
-    private Boolean isDefaultLocalConfigured;
-
-    public RepoKeyType(){}
-
-    public RepoKeyType(String type, String repoKey) {
-        this.repoKey = repoKey;
-        this.type = type;
-    }
-
-    public RepoKeyType(RepoType repoType, String repoKey) {
-        this.repoKey = repoKey;
-        this.RepoType = repoType;
-    }
-
-    public RepoKeyType(String type, RepoType repoType, String repoKey) {
-        this.type = type;
-        this.repoKey = repoKey;
-        this.RepoType = repoType;
-    }
-
-    public RepoKeyType(String type, RepoType repoType, String repoKey, DockerApiVersion dockerApiVersion) {
-        this.repoKey = repoKey;
-        this.RepoType = repoType;
-        this.type = type;
-        this.dockerApiVersion = dockerApiVersion.name();
-    }
-
-    public String getRepoKey() {
-        return repoKey;
-    }
-
-    public void setRepoKey(String repoKey) {
-        this.repoKey = repoKey;
-    }
-
-    public org.artifactory.descriptor.repo.RepoType getRepoType() {
-        return RepoType;
-    }
-
-    public void setRepoType(org.artifactory.descriptor.repo.RepoType repoType) {
-        RepoType = repoType;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public Boolean getCanDeploy() {
-        return canDeploy;
-    }
-
-    public void setCanDeploy(Boolean canDeploy) {
-        this.canDeploy = canDeploy;
-    }
-
-    public Boolean getCanRead() {
-        return canRead;
-    }
-
-    public void setCanRead(Boolean canRead) {
-        this.canRead = canRead;
-    }
-
-    public Boolean getIsLocal() {
-        return isLocal;
-    }
-
-    public void setIsLocal(Boolean isLocal) {
-        this.isLocal = isLocal;
-    }
-
-    public Boolean getIsRemote() {
-        return isRemote;
-    }
-
-    public void setIsRemote(Boolean isRemote) {
-        this.isRemote = isRemote;
-    }
-
-    public Boolean getIsVirtual() {
-        return isVirtual;
-    }
-
-    public void setIsVirtual(Boolean isVirtual) {
-        this.isVirtual = isVirtual;
-    }
-
-    public String getDockerApiVersion() {
-        return dockerApiVersion;
-    }
-
-    public Boolean getIsDefaultDeploymentConfigured() { return isDefaultLocalConfigured; }
-
-    public void setIsDefaultDeploymentConfigured(Boolean isDefaultLocalConfigured) { this.isDefaultLocalConfigured = isDefaultLocalConfigured; }
-
-    public String getLayoutPattern() { return layoutPattern; }
-
-    public void setLayoutPattern(String layoutPattern) { this.layoutPattern = layoutPattern; }
-
-    public String getLayoutFileItegRevRegex() { return layoutFileItegRevRegex; }
-
-    public void setLayoutFileItegRevRegex(String layoutFileItegRevRegex) { this.layoutFileItegRevRegex = layoutFileItegRevRegex; }
-
-    public String getLayoutFolderItegRevRegex() { return layoutFolderItegRevRegex; }
-
-    public void setLayoutFolderItegRevRegex(String layoutFolderItegRevRegex) { this.layoutFolderItegRevRegex = layoutFolderItegRevRegex; }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/utils/repositories/RepositoriesData.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/utils/repositories/RepositoriesData.java
deleted file mode 100644
index 14ae67f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/model/utils/repositories/RepositoriesData.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.artifactory.ui.rest.model.utils.repositories;
-
-import java.util.List;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * @author Chen Keinan
- */
-public class RepositoriesData extends BaseModel {
-
-    private List<String> repoList;
-    private List<RepoKeyType> repoTypesList;
-
-    public RepositoriesData() {
-    }
-
-    public RepositoriesData(List<String> repoData) {
-        this.repoList = repoData;
-    }
-
-    public List<String> getRepoList() {
-        return repoList;
-    }
-
-    public void setRepoList(List<String> repoList) {
-        this.repoList = repoList;
-    }
-
-    public List<RepoKeyType> getRepoTypesList() {
-        return repoTypesList;
-    }
-
-    public void setRepoTypesList(List<RepoKeyType> repoTypesList) {
-        this.repoTypesList = repoTypesList;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/configdescriptor/ConfigDescriptorResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/configdescriptor/ConfigDescriptorResource.java
deleted file mode 100644
index 301bfcd..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/configdescriptor/ConfigDescriptorResource.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.advanced.configdescriptor;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.admin.advanced.configdescriptor.ConfigDescriptorModel;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.advanced.AdvancedServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Path("configdescriptor")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ConfigDescriptorResource extends BaseResource {
-
-    @Autowired
-    protected AdvancedServiceFactory advanceFactory;
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getConfigDescriptor()
-            throws Exception {
-        return runService(advanceFactory.getConfigDescriptorService());
-    }
-
-    @PUT
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response updateConfigDescriptor(ConfigDescriptorModel configXml)
-            throws Exception {
-        return runService(advanceFactory.updateConfigDescriptorService(), configXml);
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/maintenance/MaintenanceResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/maintenance/MaintenanceResource.java
deleted file mode 100644
index de624ac..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/maintenance/MaintenanceResource.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.advanced.maintenance;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.admin.advanced.maintenance.Maintenance;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.advanced.AdvancedServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Path("maintenance")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class MaintenanceResource extends BaseResource {
-
-    @Autowired
-    protected AdvancedServiceFactory advanceFactory;
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getMaintenance()
-            throws Exception {
-        return runService(advanceFactory.getMaintenance());
-    }
-
-    @PUT
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response saveMaintenance(Maintenance maintenance)
-            throws Exception {
-        return runService(advanceFactory.saveMaintenance(), maintenance);
-    }
-
-    @POST
-    @Path("garbageCollection")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response garbageCollection()
-            throws Exception {
-        return runService(advanceFactory.garbageCollection());
-    }
-
-    @POST
-    @Path("cleanUnusedCache")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response cleanUnusedCache()
-            throws Exception {
-        return runService(advanceFactory.cleanUnusedCached());
-    }
-
-    @POST
-    @Path("cleanVirtualRepo")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response cleanVirtualRepo()
-            throws Exception {
-        return runService(advanceFactory.cleanupVirtualRepo());
-    }
-
-    @POST
-    @Path("prune")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response pruneUnreferencedData()
-            throws Exception {
-        return runService(advanceFactory.pruneUnReferenceData());
-    }
-
-    @POST
-    @Path("compress")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response compressInternalData()
-            throws Exception {
-        return runService(advanceFactory.compressInternalData());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/replication/GlobalReplicationsUIResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/replication/GlobalReplicationsUIResource.java
deleted file mode 100644
index 9ea77bb..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/replication/GlobalReplicationsUIResource.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.advanced.replication;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.model.replication.GlobalReplicationConfig;
-import org.artifactory.ui.rest.service.admin.advanced.AdvancedServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author gidis
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Path("global/replications/config")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GlobalReplicationsUIResource extends BaseResource {
-    @Autowired
-    protected AdvancedServiceFactory advanceFactory;
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getGlobalReplicationConfig() {
-        return runService(advanceFactory.getGlobalReplicationConfig());
-    }
-
-    @PUT
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response setGlobalReplicationConfig(GlobalReplicationConfig config) {
-        return runService(advanceFactory.updateGlobalReplicationConfig(),config);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/securitydescriptor/SecurityDescriptorResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/securitydescriptor/SecurityDescriptorResource.java
deleted file mode 100644
index e0be24c..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/securitydescriptor/SecurityDescriptorResource.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.advanced.securitydescriptor;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.admin.advanced.securitydescriptor.SecurityDescriptorModel;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.advanced.AdvancedServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Path("securitydescriptor")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class SecurityDescriptorResource extends BaseResource {
-
-    @Autowired
-    protected AdvancedServiceFactory advanceFactory;
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getSecurityDescriptor()
-            throws Exception {
-        return runService(advanceFactory.getSecurityDescriptorService());
-    }
-
-    @PUT
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response updateSecurityDescriptor(SecurityDescriptorModel securityXml)
-            throws Exception {
-        return runService(advanceFactory.updateSecurityConfigService(), securityXml);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/storage/StorageResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/storage/StorageResource.java
deleted file mode 100644
index dc3a04d..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/storage/StorageResource.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.advanced.storage;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.advanced.AdvancedServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Gidi Shabat
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Path("binary/providers")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class StorageResource extends BaseResource {
-
-    @Autowired
-    protected AdvancedServiceFactory advanceFactory;
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    @Path("info")
-    public Response getBinaryProvidersInfoService()throws Exception {
-        return runService(advanceFactory.getBinaryProvidersInfoService());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/storagesummary/StorageSummaryResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/storagesummary/StorageSummaryResource.java
deleted file mode 100644
index 9f10f18..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/storagesummary/StorageSummaryResource.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.advanced.storagesummary;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.advanced.AdvancedServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Path("storagesummary")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class StorageSummaryResource extends BaseResource {
-
-    @Autowired
-    protected AdvancedServiceFactory advanceFactory;
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getStorageSummary()
-            throws Exception {
-        return runService(advanceFactory.getStorageSummaryService());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/support/UserSupportResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/support/UserSupportResource.java
deleted file mode 100644
index ca4a15d..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/support/UserSupportResource.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.advanced.support;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.support.config.bundle.BundleConfigurationImpl;
-import org.artifactory.ui.rest.service.admin.advanced.AdvancedServiceFactory;
-import org.artifactory.ui.rest.service.admin.advanced.support.BundleConfigurationWrapper;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Michael Pasternak
- */
- at Path("userSupport")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UserSupportResource extends BaseResource {
-
-    @Autowired
-    private AdvancedServiceFactory advancedServiceFactory;
-
-    @Autowired
-    private AuthorizationService authorizationService;
-
-    @Context
-    private HttpServletRequest httpServletRequest;
-
-    @Path("generateBundle")
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response generateBundle(BundleConfigurationImpl bundleConfiguration) throws Exception {
-        if (authorizationService.isAnonymous() || !authorizationService.isAdmin()) {
-            return Response.status(Response.Status.UNAUTHORIZED).build();
-        }
-        return runService(advancedServiceFactory.getSupportServiceGenerateBundle(),
-                new BundleConfigurationWrapper(bundleConfiguration, httpServletRequest)
-        );
-    }
-
-    @Path("downloadBundle/{archive: .+}")
-    @GET
-    @Produces(MediaType.APPLICATION_OCTET_STREAM)
-    public Response downloadBundle(@PathParam("archive") String archive) throws Exception {
-        if (authorizationService.isAnonymous() || !authorizationService.isAdmin()) {
-            return Response.status(Response.Status.UNAUTHORIZED).build();
-        }
-        return runService(advancedServiceFactory.getSupportServiceDownloadBundle(), archive);
-    }
-
-    @Path("listBundles")
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response listBundles() throws Exception {
-        if (authorizationService.isAnonymous() || !authorizationService.isAdmin()) {
-            return Response.status(Response.Status.UNAUTHORIZED).build();
-        }
-        return runService(advancedServiceFactory.getSupportServiceListBundles());
-    }
-
-    @Path("deleteBundle/{archive: .+}")
-    @DELETE
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response deleteBundle(@PathParam("archive") String archive) throws Exception {
-        if (authorizationService.isAnonymous() || !authorizationService.isAdmin()) {
-            return Response.status(Response.Status.UNAUTHORIZED).build();
-        }
-        return runService(advancedServiceFactory.getSupportServiceDeleteBundle(), archive);
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/systeminfo/SystemInfoResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/systeminfo/SystemInfoResource.java
deleted file mode 100644
index 8e0e528..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/systeminfo/SystemInfoResource.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.advanced.systeminfo;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.advanced.AdvancedServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Path("systeminfo")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class SystemInfoResource extends BaseResource {
-
-    @Autowired
-    protected AdvancedServiceFactory advanceFactory;
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getSystemInfo()
-            throws Exception {
-        return runService(advanceFactory.getSystemInfoService());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/systemlogs/SystemLogsResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/systemlogs/SystemLogsResource.java
deleted file mode 100644
index ded4832..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/advanced/systemlogs/SystemLogsResource.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.advanced.systemlogs;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.advanced.AdvancedServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Lior Hasson
- */
-
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Path("systemlogs")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class SystemLogsResource extends BaseResource {
-    @Autowired
-    protected AdvancedServiceFactory advanceFactory;
-
-    @Autowired
-    @Qualifier("streamingRestResponse")
-    public void setArtifactoryResponse(RestResponse artifactoryResponse) {
-        this.artifactoryResponse = artifactoryResponse;
-    }
-
-    @GET
-    @Path("initialize")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getLogsInitialize() throws Exception{
-        return runService(advanceFactory.getSystemLogsInitialize());
-    }
-
-    @GET
-    @Path("logData")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getLogData(){
-        return runService(advanceFactory.getSystemLogData());
-    }
-
-    @GET
-    @Path("downloadFile")
-    @Produces(MediaType.APPLICATION_OCTET_STREAM)
-    public Response logDownloadLink() throws Exception{
-        return runService(advanceFactory.getSystemLogDownloadLink());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/bintray/BintrayUIResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/bintray/BintrayUIResource.java
deleted file mode 100644
index 2536548..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/bintray/BintrayUIResource.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.configuration.bintray;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.admin.configuration.bintray.BintrayUIModel;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.configuration.ConfigServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Path("bintraysetting")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class BintrayUIResource extends BaseResource {
-
-    @Autowired
-    protected ConfigServiceFactory configServiceFactory;
-
-    @PUT
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response updateBintray(BintrayUIModel bintray)
-            throws Exception {
-        return runService(configServiceFactory.updateBintrayService(), bintray);
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getBintray()
-            throws Exception {
-        return runService(configServiceFactory.getBintrayService());
-    }
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    @RolesAllowed({AuthorizationService.ROLE_USER, AuthorizationService.ROLE_ADMIN})
-    public Response testBintray(BintrayUIModel bintray)
-            throws Exception {
-        return runService(configServiceFactory.testBintrayService(), bintray);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/blackduck/BlackDuckResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/blackduck/BlackDuckResource.java
deleted file mode 100644
index bde9831..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/blackduck/BlackDuckResource.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.configuration.blackduck;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.admin.configuration.blackduck.BlackDuck;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.configuration.ConfigServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Path("blackduck")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class BlackDuckResource extends BaseResource {
-
-    @Autowired
-    protected ConfigServiceFactory configServiceFactory;
-
-    @PUT
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response updateBlackDuck(BlackDuck blackDuck)
-            throws Exception {
-        return runService(configServiceFactory.updateBlackDuckService(), blackDuck);
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getBlackDuck()
-            throws Exception {
-        return runService(configServiceFactory.getBlackDuckService());
-    }
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response testBlackDuck(BlackDuck blackDuck)
-            throws Exception {
-        return runService(configServiceFactory.testBlackDuckService(), blackDuck);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/generalconfiguration/GeneralConfigurationResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/generalconfiguration/GeneralConfigurationResource.java
deleted file mode 100644
index 6248caa..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/generalconfiguration/GeneralConfigurationResource.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.configuration.generalconfiguration;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.ui.rest.model.admin.configuration.generalconfig.GeneralConfig;
-import org.artifactory.ui.rest.model.utils.FileUpload;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.configuration.ConfigServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import com.sun.jersey.multipart.FormDataMultiPart;
-
-/**
- * @author Chen Keinan
- */
- at Path("generalConfig")
- at RolesAllowed(AuthorizationService.ROLE_ADMIN)
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GeneralConfigurationResource extends BaseResource {
-
-    @Autowired
-    protected ConfigServiceFactory configServiceFactory;
-
-    @Autowired
-    @Qualifier("streamingRestResponse")
-    public void setArtifactoryResponse(RestResponse artifactoryResponse) {
-        this.artifactoryResponse = artifactoryResponse;
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getGeneralConfig()
-            throws Exception {
-        return runService(configServiceFactory.getGeneralConfig());
-    }
-
-    @GET
-    @Path("data")
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN,AuthorizationService.ROLE_USER})
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getGeneralConfigData()
-            throws Exception {
-        return runService(configServiceFactory.getGeneralConfigData());
-    }
-
-    @POST
-    @Path("logo")
-    @Consumes(MediaType.MULTIPART_FORM_DATA)
-    public Response uploadLogo(FormDataMultiPart formDataMultiPart) throws Exception {
-        FileUpload fileUpload = new FileUpload(formDataMultiPart);
-        return runService(configServiceFactory.uploadLogo(), fileUpload);
-    }
-
-    @PUT
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response saveGeneralConfig(GeneralConfig generalConfig)
-            throws Exception {
-        return runService(configServiceFactory.updateGeneralConfig(), generalConfig);
-    }
-
-    @GET
-    @Produces("image/*")
-    @Path("logo")
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN,AuthorizationService.ROLE_USER})
-    public Response getUploadLogo() throws Exception {
-        return runService(configServiceFactory.getUploadLogo());
-    }
-
-    @DELETE
-    @Path("logo")
-    public Response deleteUploadLogo() throws Exception {
-        return runService(configServiceFactory.deleteUploadedLogo());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/ha/HighAvailabilityResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/ha/HighAvailabilityResource.java
deleted file mode 100644
index c898beb..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/ha/HighAvailabilityResource.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.configuration.ha;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.configuration.ConfigServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Path("highAvailability")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class HighAvailabilityResource extends BaseResource {
-
-    @Autowired
-    protected ConfigServiceFactory configServiceFactory;
-
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getHighAvailabilityData()
-            throws Exception {
-        return runService(configServiceFactory.getHighAvailabilityMembers());
-    }
-
-    @DELETE
-    @Path("{id}")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response removeServer() throws Exception {
-        return runService(configServiceFactory.removeServer());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/layouts/RepoLayoutsResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/layouts/RepoLayoutsResource.java
deleted file mode 100644
index c1c8997..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/layouts/RepoLayoutsResource.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.configuration.layouts;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.ui.rest.model.admin.configuration.layouts.LayoutConfigViewModel;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.configuration.ConfigServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Lior Hasson
- */
- at Component
- at Path("admin/repolayouts")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at Produces(MediaType.APPLICATION_JSON)
-public class RepoLayoutsResource extends BaseResource {
-
-    @Autowired
-    protected ConfigServiceFactory configServiceFactory;
-
-    @Autowired
-    protected CentralConfigService centralConfigService;
-
-    @GET
-    public Response getLayouts() throws Exception {
-        return runService(configServiceFactory.getLayoutsService());
-    }
-
-    @GET
-    @Path("{layoutKey}")
-    public Response getLayoutConfig() throws Exception {
-        return runService(configServiceFactory.getLayoutInfoService());
-    }
-
-    @PUT
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response updateLayout(RepoLayout repoLayout) throws Exception {
-        return runService(configServiceFactory.updateLayoutService(), repoLayout);
-    }
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response createLayout(RepoLayout repoLayout) throws Exception {
-        return runService(configServiceFactory.createLayoutService(), repoLayout);
-    }
-
-    @DELETE
-    @Path("{layoutKey}")
-    public Response deleteLayout() throws Exception {
-        return runService(configServiceFactory.deleteLayoutService());
-    }
-
-    @POST
-    @Path("testArtPath")
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response testArtifactPathLayout(LayoutConfigViewModel repositoryLayoutModel) throws Exception {
-        return runService(configServiceFactory.testArtPathService(), repositoryLayoutModel);
-    }
-
-    @POST
-    @Path("resolveRegex")
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response resolveRegexLayout(RepoLayout repoLayout) throws Exception {
-        return runService(configServiceFactory.resolveRegexService(), repoLayout);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/licenses/ArtifactLicenseResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/licenses/ArtifactLicenseResource.java
deleted file mode 100644
index 2e93282..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/licenses/ArtifactLicenseResource.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.configuration.licenses;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.admin.configuration.licenses.DeleteLicensesModel;
-import org.artifactory.ui.rest.model.admin.configuration.licenses.License;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.configuration.ConfigServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Kainan
- */
- at Path("licenses")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ArtifactLicenseResource extends BaseResource {
-    @Autowired
-    protected ConfigServiceFactory configServiceFactory;
-
-    @POST
-    @Path("crud{id:(/[^/]+?)?}")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response createLicense(License license)
-            throws Exception {
-        return runService(configServiceFactory.createArtifactLicenseService(), license);
-    }
-
-    @PUT
-    @Path("crud{id:(/[^/]+?)?}")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response updateLicense(License license)
-            throws Exception {
-        return runService(configServiceFactory.updateArtifactLicenseService(), license);
-    }
-
-    @GET
-    @Path("crud{id:(/[^/]+?)?}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getLicense()
-            throws Exception {
-        return runService(configServiceFactory.getArtifactLicenseService());
-    }
-
-    @POST
-    @Path("deleteLicense")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response deleteLicense(DeleteLicensesModel deleteLicensesModel)
-            throws Exception {
-        return runService(configServiceFactory.deleteArtifactLicenseService(),deleteLicensesModel);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/licenses/LicenseExportResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/licenses/LicenseExportResource.java
deleted file mode 100644
index e0399e9..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/licenses/LicenseExportResource.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.configuration.licenses;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.configuration.ConfigServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Path("licenseexport")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class LicenseExportResource extends BaseResource {
-
-    @Autowired
-    protected ConfigServiceFactory configServiceFactory;
-
-    @Autowired
-    @Qualifier("streamingRestResponse")
-    public void setArtifactoryResponse(RestResponse artifactoryResponse) {
-        this.artifactoryResponse = artifactoryResponse;
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_XML)
-    public Response exportLicenseFile()
-            throws Exception {
-        return runService(configServiceFactory.exportLicenseFileService());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/mail/MailResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/mail/MailResource.java
deleted file mode 100644
index f3ff18b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/mail/MailResource.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.configuration.mail;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.admin.configuration.mail.MailServer;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.configuration.ConfigServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Path("mail")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class MailResource extends BaseResource {
-
-    @Autowired
-    protected ConfigServiceFactory configServiceFactory;
-
-    @PUT
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response updateMail(MailServer mailServer)
-            throws Exception {
-        return runService(configServiceFactory.updateMailService(), mailServer);
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getMail()
-            throws Exception {
-        return runService(configServiceFactory.getMailService());
-    }
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response testMail(MailServer mailServer)
-            throws Exception {
-        return runService(configServiceFactory.testMailService(), mailServer);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/propertysets/PropertySetsResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/propertysets/PropertySetsResource.java
deleted file mode 100644
index ca7cd84..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/propertysets/PropertySetsResource.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.configuration.propertysets;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.admin.configuration.propertysets.AdminPropertySetModel;
-import org.artifactory.ui.rest.model.admin.configuration.propertysets.DeletePropertySetModel;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.configuration.ConfigServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Dan Feldman
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Path("propertysets")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class PropertySetsResource extends BaseResource {
-
-    public static final String PROP_SET_NAME = "name";
-    public static final String PATH_PROP_SET_NAME = "{" + PROP_SET_NAME + "}";
-
-    @Autowired
-    protected ConfigServiceFactory configServiceFactory;
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response createPropertySet(AdminPropertySetModel propertySet) throws Exception {
-        return runService(configServiceFactory.createPropertySet(), propertySet);
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getPropertySetNames() throws Exception {
-        return runService(configServiceFactory.getPropertySetNames());
-    }
-
-    @GET
-    @Path(PATH_PROP_SET_NAME)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getPropertySet() throws Exception {
-        return runService(configServiceFactory.getPropertySet());
-    }
-
-    @PUT
-    @Path(PATH_PROP_SET_NAME)
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response updatePropertySet(AdminPropertySetModel propertySet) throws Exception {
-        return runService(configServiceFactory.updatePropertySet(), propertySet);
-    }
-
-    @POST
-    @Path("deletePropertySet")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response deletePropertySet(DeletePropertySetModel propertySetModel) throws Exception {
-        return runService(configServiceFactory.deletePropertySet(),propertySetModel);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/proxies/ProxyResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/proxies/ProxyResource.java
deleted file mode 100644
index e54684e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/proxies/ProxyResource.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.configuration.proxies;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.model.proxies.ProxiesModel;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.model.admin.configuration.proxy.Proxy;
-import org.artifactory.ui.rest.service.admin.configuration.ConfigServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Path("proxies")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ProxyResource extends BaseResource {
-
-    @Autowired
-    protected ConfigServiceFactory configServiceFactory;
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response createProxies(Proxy proxy)
-            throws Exception {
-        return runService(configServiceFactory.createProxiesService(), proxy);
-    }
-
-
-    @PUT
-    @Path("crud{id:(/[^/]+?)?}")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response updateProxies(Proxy proxy)
-            throws Exception {
-        return runService(configServiceFactory.updateProxiesService(), proxy);
-    }
-
-    @GET
-    @Path("crud{id:(/[^/]+?)?}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getProxies()
-            throws Exception {
-        return runService(configServiceFactory.getProxiesService());
-    }
-
-    @Path("deleteProxies")
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response deleteProxies(ProxiesModel proxiesModel)
-            throws Exception {
-        return runService(configServiceFactory.deleteProxiesService(), proxiesModel);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/registerpro/ProLicenseResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/registerpro/ProLicenseResource.java
deleted file mode 100644
index f7e09f5..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/registerpro/ProLicenseResource.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.configuration.registerpro;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.admin.configuration.registerpro.ProLicense;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.configuration.ConfigServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Path("registerlicense")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ProLicenseResource extends BaseResource {
-    @Autowired
-    protected ConfigServiceFactory configServiceFactory;
-
-    @PUT
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response updateLicense(ProLicense proLicense)
-            throws Exception {
-        return runService(configServiceFactory.updateLicenseKeyService(), proLicense);
-    }
-
-    @GET
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getLicense()
-            throws Exception {
-        return runService(configServiceFactory.getLicenseKeyService());
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/repositories/RepoConfigResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/repositories/RepoConfigResource.java
deleted file mode 100644
index d165821..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/repositories/RepoConfigResource.java
+++ /dev/null
@@ -1,196 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.configuration.repositories;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.model.admin.configuration.repository.RepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.local.LocalRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.RemoteRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.replication.local.LocalReplicationConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.typespecific.DistRepoTypeSpecificConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.virtual.VirtualRepositoryConfigModel;
-import org.artifactory.ui.rest.service.admin.configuration.ConfigServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.List;
-
-import static org.artifactory.ui.rest.resource.admin.configuration.repositories.RepoResourceConstants.PATH_REPOSITORIES;
-
-/**
- * @author Aviad Shikloshi
- * @author Dan Feldman
- */
- at Component
- at Path(PATH_REPOSITORIES)
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at Produces(MediaType.APPLICATION_JSON)
-public class RepoConfigResource extends BaseResource {
-
-    @Autowired
-    protected ConfigServiceFactory configServiceFactory;
-
-    @PUT
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response updateRepositoryConfig(RepositoryConfigModel repositoryConfigModel) throws Exception {
-        return runService(configServiceFactory.updateRepositoryConfig(), repositoryConfigModel);
-    }
-
-    @GET
-    @Path("validatereponame")
-    public Response validateRepoName() throws Exception {
-        return runService(configServiceFactory.validateRepoName());
-    }
-
-    @GET
-    @Path("{repoType: local|remote|virtual|distribution}/{repoKey}")
-    public Response getRepositoryConfigByType() throws Exception {
-        return runService(configServiceFactory.getRepositoryConfig());
-    }
-
-    @GET
-    @Path("availablechoices")
-    public Response getAvailableRepositoryFieldChoices() throws Exception {
-        return runService(configServiceFactory.getAvailableRepositoryFieldChoices());
-    }
-
-    @GET
-    @Path("defaultvalues")
-    public Response getRepoConfigDefaultValues() throws Exception {
-        return runService(configServiceFactory.getDefaultRepositoryValues());
-    }
-
-    @GET
-    @Path("remoteUrlMap")
-    public Response getRemoteReposUrlMapping() throws Exception {
-        return runService(configServiceFactory.getRemoteReposUrlMapping());
-    }
-
-    @GET
-    @Path("{repoType: local|remote|virtual|distribution}/info")
-    public Response getRepositoriesInfo() throws Exception {
-        return runService(configServiceFactory.getRepositoriesInfo());
-    }
-
-    @GET
-    @Path("availablerepositories")
-    public Response getAvailableRepositories() {
-        return runService(configServiceFactory.getAvailableRepositories());
-    }
-
-    @GET
-    @Path("indexeravailablerepositories")
-    public Response getIndexerAvailableRepositories() {
-        return runService(configServiceFactory.getIndexerAvailableRepositories());
-    }
-
-    @POST
-    @Path("resolvedrepositories")
-    public Response getResolvedRepositories(VirtualRepositoryConfigModel virtualConfigModel) {
-        return runService(configServiceFactory.getResolvedRepositories(), virtualConfigModel);
-    }
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response createRepository(RepositoryConfigModel repositoryConfigModel) throws Exception {
-        return runService(configServiceFactory.createRepositoryConfig(), repositoryConfigModel);
-    }
-
-    @POST
-    @Path("testremote")
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response remoteRepositoryUrlTest(RemoteRepositoryConfigModel remoteRepositoryModel) {
-        return runService(configServiceFactory.remoteRepositoryTestUrl(), remoteRepositoryModel);
-    }
-
-    @POST
-    @Path("discoversmartrepocapabilities")
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response discoverSmartRepoCapabilities(RemoteRepositoryConfigModel remoteRepositoryModel) {
-        return runService(configServiceFactory.discoverSmartRepoCapabilities(), remoteRepositoryModel);
-    }
-
-    @POST
-    @Path("validatelocalreplication")
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response validateLocalReplicationConfig(LocalReplicationConfigModel localReplication) {
-        return runService(configServiceFactory.validateLocalReplication(), localReplication);
-    }
-
-    @POST
-    @Path("testlocalreplication")
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response testLocalReplicationConfig(LocalRepositoryConfigModel localRepoModel) {
-        return runService(configServiceFactory.testLocalReplication(), localRepoModel);
-    }
-
-    @POST
-    @Path("testremotereplication")
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response testRemoteReplicationConfig(RemoteRepositoryConfigModel remoteRepositoryModel) {
-        return runService(configServiceFactory.testRemoteReplication(), remoteRepositoryModel);
-    }
-
-    @POST
-    @Path("exeucteremotereplication")
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response executeRemoteReplicationNow() {
-        return runService(configServiceFactory.executeImmediateReplication());
-    }
-
-    @DELETE
-    @Path("{repoKey}")
-    public Response deleteRepository() throws Exception {
-        return runService(configServiceFactory.deleteRepositoryConfig());
-    }
-
-    @POST
-    @Path("executeall")
-    public Response executeAllLocalReplications() throws Exception {
-        return runService(configServiceFactory.executeAllLocalReplications());
-    }
-
-    @POST
-    @Path("executereplicationnow")
-    public Response executeLocalReplication(LocalRepositoryConfigModel localRepoModel) {
-        return runService(configServiceFactory.executeLocalReplication(), localRepoModel);
-    }
-
-    @POST
-    @Path("{repoType: local|remote|virtual|distribution}/reorderrepositories")
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response reorderRepositories(List<String> newOrderList) {
-        return runService(configServiceFactory.reorderRepositories(), newOrderList);
-    }
-
-    @GET
-    @Path("isjcenterconfigured")
-    @RolesAllowed({AuthorizationService.ROLE_USER, AuthorizationService.ROLE_ADMIN})
-    public Response isJcenterConfigured() {
-        return runService(configServiceFactory.isJcenterConfigured());
-    }
-
-    @POST
-    @Path("createdefaultjcenterrepo")
-    public Response createDefaultJcenterRepo() {
-        return runService(configServiceFactory.createDefaultJcenterRepo());
-    }
-
-    @GET
-    @Path("docker")
-    public Response docker() {
-        return runService(configServiceFactory.getDockerRepo());
-    }
-
-    @PUT
-    @Path("savebintrayoauthconfig")
-    public Response saveBintrayOauthConfig(DistRepoTypeSpecificConfigModel distTypeSpecific) {
-        return runService(configServiceFactory.saveBintrayOauthConfig(), distTypeSpecific);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/repositories/RepoResourceConstants.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/repositories/RepoResourceConstants.java
deleted file mode 100644
index 0a7ff16..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/repositories/RepoResourceConstants.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.configuration.repositories;
-
-/**
- * @author Dan Feldman
- */
-public interface RepoResourceConstants {
-
-    String PATH_REPOSITORIES = "admin/repositories";
-    String PATH_REPLICATION = PATH_REPOSITORIES + "/replication";
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/reverseProxy/ReverseProxyResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/reverseProxy/ReverseProxyResource.java
deleted file mode 100644
index 1c39f41..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/configuration/reverseProxy/ReverseProxyResource.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.configuration.reverseProxy;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.ReverseProxyDescriptor;
-import org.artifactory.rest.common.model.reverseproxy.ReverseProxyDescriptorModel;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.configuration.ConfigServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Shay Yaakov
- */
- at Path("reverseProxies")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ReverseProxyResource extends BaseResource {
-
-    @Autowired
-    protected ConfigServiceFactory configServiceFactory;
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response createReverseProxy(ReverseProxyDescriptorModel reverseProxy) throws Exception {
-        return runService(configServiceFactory.createReverseProxy(), reverseProxy);
-    }
-
-
-    @PUT
-    @Path("crud{id:(/[^/]+?)?}")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response updateReverseProxy(ReverseProxyDescriptor reverseProxy) throws Exception {
-        return runService(configServiceFactory.updateReverseProxy(), reverseProxy);
-    }
-
-    @GET
-    @Path("crud{id:(/[^/]+?)?}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getReverseProxies() throws Exception {
-        return runService(configServiceFactory.getReverseProxies());
-    }
-
-    @GET
-    @Path("checkPort{port:(/[^/]+?)?}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response checkReverseProxyPortAvailability() throws Exception {
-        return runService(configServiceFactory.checkReverseProxyPortAvailability());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/importexport/ExportArtifactResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/importexport/ExportArtifactResource.java
deleted file mode 100644
index 47d4c6f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/importexport/ExportArtifactResource.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.importexport;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.admin.importexport.ImportExportSettings;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.importexport.ImportExportServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Path("artifactexport")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ExportArtifactResource extends BaseResource {
-
-    @Autowired
-    protected ImportExportServiceFactory importExportFactory;
-
-    @POST
-    @Path("repository")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response exportRepository(ImportExportSettings importExportSettings)
-            throws Exception {
-        return runService(importExportFactory.exportRepository(), importExportSettings);
-    }
-
-    @POST
-    @Path("system")
-    public Response exportSystem(ImportExportSettings systemImport)
-            throws Exception {
-        return runService(importExportFactory.exportSystem(), systemImport);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/importexport/ImportArtifactResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/importexport/ImportArtifactResource.java
deleted file mode 100644
index 702fafd..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/importexport/ImportArtifactResource.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.importexport;
-
-import com.sun.jersey.multipart.FormDataMultiPart;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.admin.importexport.ImportExportSettings;
-import org.artifactory.ui.rest.model.utils.FileUpload;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.importexport.ImportExportServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author chen keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Path("artifactimport")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ImportArtifactResource extends BaseResource {
-
-    @Autowired
-    protected ImportExportServiceFactory importExportFactory;
-
-    @POST
-    @Path("repository")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response importRepository(ImportExportSettings importExportSettings)
-            throws Exception {
-        return runService(importExportFactory.importRepositoryService(), importExportSettings);
-    }
-
-    @POST
-    @Path("upload")
-    @Consumes(MediaType.MULTIPART_FORM_DATA)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response uploadExtractedZip(FormDataMultiPart formParams)
-            throws Exception {
-        FileUpload fileUpload = new FileUpload(formParams);
-        return runService(importExportFactory.uploadExtractedZip(), fileUpload);
-    }
-
-    @POST
-    @Path("system")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response importSystem(ImportExportSettings systemImport)
-            throws Exception {
-        return runService(importExportFactory.importSystem(), systemImport);
-    }
-
-    @POST
-    @Path("systemUpload")
-    @Consumes(MediaType.MULTIPART_FORM_DATA)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response systemExtractedZip(FormDataMultiPart formParams)
-            throws Exception {
-        FileUpload fileUpload = new FileUpload(formParams);
-        return runService(importExportFactory.uploadSystemExtractedZip(), fileUpload);
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/apikey/UserApiKeyResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/apikey/UserApiKeyResource.java
deleted file mode 100644
index 99fa6b7..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/apikey/UserApiKeyResource.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.security.apikey;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.security.SecurityServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Path("userApiKey{id:(/[^/]+?)?}")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UserApiKeyResource extends BaseResource {
-
-    @Autowired
-    protected SecurityServiceFactory securityFactory;
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getApiKey()
-            throws Exception {
-        return runService(securityFactory.getApiKey());
-    }
-
-
-    @DELETE
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response revokeApiKey()
-            throws Exception {
-        return runService(securityFactory.revokeApiKey());
-    }
-
-    @PUT
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response regenerateApiKey()
-            throws Exception {
-        return runService(securityFactory.regenerateApiKey());
-    }
-
-    @POST
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response createApiKey()
-            throws Exception {
-        return runService(securityFactory.createApiKey());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/auth/AuthResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/auth/AuthResource.java
deleted file mode 100644
index d6b88f3..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/auth/AuthResource.java
+++ /dev/null
@@ -1,114 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.security.auth;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.dataholder.PasswordContainer;
-import org.artifactory.ui.rest.model.admin.security.login.UserLogin;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.security.SecurityServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-
-/**
- * @author chen keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Path("auth")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class AuthResource extends BaseResource {
-
-    @Autowired
-    protected SecurityServiceFactory securityFactory;
-
-    @POST
-    @Path("login")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response login(UserLogin userLoginModel) throws Exception {
-        return runService(securityFactory.loginService(), userLoginModel);
-    }
-
-    @POST
-    @Path("logout")
-    public Response logout()
-            throws Exception {
-        return runService(securityFactory.logoutService());
-    }
-
-    @GET
-    @Path("issaml")
-    public Response isSamlAuthentication() throws Exception {
-        return runService(securityFactory.isSamlAuthentication());
-    }
-
-
-    @POST
-    @Path("forgotpassword")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response forgotPassword(UserLogin userLoginModel)
-            throws Exception {
-        return runService(securityFactory.forgotPassword(),userLoginModel);
-    }
-
-    @POST
-    @Path("validatetoken")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response validateToken()
-            throws Exception {
-        return runService(securityFactory.validateToken());
-    }
-
-    @POST
-    @Path("resetpassword")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response resetPassword(UserLogin userLoginModel)
-            throws Exception {
-        return runService(securityFactory.resetPassword(), userLoginModel);
-    }
-
-    @POST
-    @Path("changePassword")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response changePassword(PasswordContainer passwordContainer)
-            throws Exception {
-        return runService(securityFactory.changePassword(), passwordContainer);
-    }
-
-    @POST
-    @Path("loginRelatedData")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response fetchLoginRelatedData()
-            throws Exception {
-        return runService(securityFactory.loginRelatedData());
-    }
-
-    @GET
-    @Path("current")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getCurrentUser()
-            throws Exception {
-        return runService(securityFactory.getCurrentUser());
-    }
-
-    @GET
-    @Path("canAnnotate")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response canAnnotate() throws Exception {
-        return runService(securityFactory.getCanAnnotateService());
-    }
-}
-
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/crowdsso/CrowdSsoResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/crowdsso/CrowdSsoResource.java
deleted file mode 100644
index e5e9850..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/crowdsso/CrowdSsoResource.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.security.crowdsso;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.admin.security.crowdsso.CrowdGroupModel;
-import org.artifactory.ui.rest.model.admin.security.crowdsso.CrowdIntegration;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.security.SecurityServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Path("crowd")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CrowdSsoResource extends BaseResource {
-
-    @Autowired
-    private SecurityServiceFactory securityFactory;
-
-    @PUT
-    public Response updateCrowdIntegration(CrowdIntegration crowdIntegration)
-            throws Exception {
-        return runService(securityFactory.updateCrowdIntegration(), crowdIntegration);
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getCrowdIntegration() {
-        return runService(securityFactory.getCrowdIntegration());
-    }
-
-    @POST
-    @Path("refresh{name:(/[^/]+?)?}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response refreshCrowdGroups(CrowdIntegration crowdIntegration) {
-        return runService(securityFactory.refreshCrowdGroups(), crowdIntegration);
-    }
-
-    @POST
-    @Path("import")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response importCrowdGroups(List<CrowdGroupModel> crowdGroupsModelList) {
-        return runService(securityFactory.importCrowdGroups(), crowdGroupsModelList);
-    }
-
-    @POST
-    @Path("test")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response testConnection(CrowdIntegration crowdIntegration) {
-        return runService(securityFactory.testCrowdConnectionService(), crowdIntegration);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/general/CryptoSecurityDescriptorResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/general/CryptoSecurityDescriptorResource.java
deleted file mode 100644
index 04bb4db..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/general/CryptoSecurityDescriptorResource.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.security.general;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.security.SecurityServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Path("crypto{action:(/[^/]+?)?}")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CryptoSecurityDescriptorResource extends BaseResource{
-
-    @Autowired
-    private SecurityServiceFactory securityFactory;
-
-    @POST
-    public Response encryptDecrypt()
-            throws Exception {
-        return runService(securityFactory.encryptPassword());
-    }
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response hasMasterKey(){
-        return runService(securityFactory.getMasterKey());
-    }
-}
-
-
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/general/GeneralSecurityConfigResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/general/GeneralSecurityConfigResource.java
deleted file mode 100644
index 75b8ddf..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/general/GeneralSecurityConfigResource.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.security.general;
-
-import com.google.common.base.Strings;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.descriptor.security.UserLockPolicy;
-import org.artifactory.ui.rest.model.admin.security.general.SecurityConfig;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.security.SecurityServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Path("securityconfig")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GeneralSecurityConfigResource extends BaseResource {
-
-    @Autowired
-    private SecurityServiceFactory securityFactory;
-
-    @PUT
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response updateConfig(SecurityConfig securityConfig)
-            throws Exception {
-        return runService(securityFactory.updateSecurityConfig(),securityConfig);
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getConfig()
-            throws Exception {
-        return runService(securityFactory.getSecurityConfig());
-    }
-
-    @PUT
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Path("userLockPolicy")
-    public Response updateUserLockPolicy(UserLockPolicy userLockPolicy) {
-        return runService(securityFactory.updateUserLockPolicy(), userLockPolicy);
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    @Path("userLockPolicy")
-    public Response getUserLockPolicy() {
-        return runService(securityFactory.getUserLockPolicy());
-    }
-
-    @POST
-    @Path("unlockUsers/{userName}")
-    public Response unlockUser(@PathParam("userName") String userName) {
-        return runService(securityFactory.unlockUser(), userName);
-    }
-
-    @POST
-    @Path("unlockAllUsers")
-    public Response unlockAllUsers() {
-        return runService(securityFactory.unlockAllUsers());
-    }
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Path("unlockUsers")
-    public Response unlockUsers(List<String> users) {
-        return runService(securityFactory.unlockUsers(), users);
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    @Path("lockedUsers")
-    public Response getAllLockedUsers() {
-        return runService(securityFactory.getAllLockedUsers());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/group/GroupResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/group/GroupResource.java
deleted file mode 100644
index 14b40bc..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/group/GroupResource.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.security.group;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.admin.security.group.DeleteGroupsModel;
-import org.artifactory.ui.rest.model.admin.security.group.Group;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.security.SecurityServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Path("groups")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GroupResource extends BaseResource {
-
-    @Autowired
-    protected SecurityServiceFactory securityFactory;
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response createGroup(Group groupModel)
-            throws Exception {
-        return runService(securityFactory.createGroup(), groupModel);
-    }
-
-    @PUT
-    @Path("{id : [^/]+}")
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response updateGroup(Group groupModel)
-            throws Exception {
-        return runService(securityFactory.updateGroup(), groupModel);
-    }
-
-    @POST
-    @Path("groupsDelete")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response deleteGroups(DeleteGroupsModel deleteGroupsModel) throws Exception {
-        return runService(securityFactory.deleteGroup(), deleteGroupsModel);
-    }
-
-    @GET
-    @Path("crud{id:(/[^/]+?)?}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getGroup()
-            throws Exception {
-        return runService(securityFactory.getGroup());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/httpsso/HttpSsoResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/httpsso/HttpSsoResource.java
deleted file mode 100644
index 5d0c3c2..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/httpsso/HttpSsoResource.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.security.httpsso;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.admin.security.httpsso.HttpSso;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.security.SecurityServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Path("httpsso")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class HttpSsoResource extends BaseResource {
-    @Autowired
-    private SecurityServiceFactory securityFactory;
-
-    @PUT
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response updateHttpSso(HttpSso httpSso)
-            throws Exception {
-        return runService(securityFactory.updateHttpSso(), httpSso);
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getHttpSso()
-            throws Exception {
-        return runService(securityFactory.getHttpSso());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/ldap/LdapGroupResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/ldap/LdapGroupResource.java
deleted file mode 100644
index a20e9f4..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/ldap/LdapGroupResource.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.security.ldap;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.admin.security.ldap.LdapGroupModel;
-import org.artifactory.ui.rest.model.admin.security.ldap.LdapImportModel;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.security.SecurityServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Path("ldapgroups{id:(/[^/]+?)?}")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class LdapGroupResource extends BaseResource {
-
-    @Autowired
-    private SecurityServiceFactory securityFactory;
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response createLdapGroup(LdapGroupModel ldapGroupModel)
-            throws Exception {
-        return runService(securityFactory.createLdapGroup(), ldapGroupModel);
-    }
-
-    @PUT
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response updateLdapGroup(LdapGroupModel ldapGroupModel)
-            throws Exception {
-        return runService(securityFactory.updateLdapGroup(), ldapGroupModel);
-    }
-
-    @DELETE
-    public Response deleteLdapGroup()
-            throws Exception {
-        return runService(securityFactory.deleteLdapGroup());
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getLdapGroup()
-            throws Exception {
-        return runService(securityFactory.getLdapGroup());
-    }
-
-    @POST
-    @Path("refresh{name:(/[^/]+?)?}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response refreshLdapGroup(LdapGroupModel ldapGroupModel)
-            throws Exception {
-        return runService(securityFactory.refreshLdapGroup(), ldapGroupModel);
-    }
-
-    @POST
-    @Path("import")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response importLdapGroup(LdapImportModel ldapImportModel)
-            throws Exception {
-        return runService(securityFactory.importLdapGroup(), ldapImportModel);
-    }
-
-    @GET
-    @Path("strategy")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response ldapGroupMappingStrategy()
-            throws Exception {
-        return runService(securityFactory.groupMappingStrategy());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/ldap/LdapSettingResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/ldap/LdapSettingResource.java
deleted file mode 100644
index 1e5b41b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/ldap/LdapSettingResource.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.security.ldap;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.admin.security.ldap.LdapSettingModel;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.security.SecurityServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Path("ldap")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class LdapSettingResource extends BaseResource {
-
-    @Autowired
-    private SecurityServiceFactory securityFactory;
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response createLdapSetting(LdapSettingModel ldapSettingModel) throws Exception {
-        return runService(securityFactory.createLdapSettings(), ldapSettingModel);
-    }
-
-    @PUT
-    @Path("{id}")
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response updateLdapSetting(LdapSettingModel ldapSettingModel) {
-        return runService(securityFactory.updateLdapSettings(), ldapSettingModel);
-    }
-
-    @DELETE
-    @Path("{id}")
-    public Response deleteLdapSetting() {
-        return runService(securityFactory.deleteLdapSettings());
-    }
-
-
-    //Due to a stupid Jersey bug with their regexes we have to split
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getLdapSettings() {
-        return runService(securityFactory.getLdapSettings());
-    }
-
-    @GET
-    @Path("{id}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getLdapSetting() {
-        return runService(securityFactory.getLdapSettings());
-    }
-
-    @POST
-    @Path("test/{id}")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response testLdapSetting(LdapSettingModel ldapSettingModel) {
-        return runService(securityFactory.testLdapSettingsService(), ldapSettingModel);
-    }
-
-    @POST
-    @Path("reorder")
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response reorderLdapSettings(List<String> newOrderList) {
-        return runService(securityFactory.reorderLdapSettings(), newOrderList);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/oauth/OAuthUIResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/oauth/OAuthUIResource.java
deleted file mode 100644
index 2fb3b1b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/oauth/OAuthUIResource.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.security.oauth;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.admin.security.oauth.OAuthProviderUIModel;
-import org.artifactory.ui.rest.model.admin.security.oauth.OAuthUIModel;
-import org.artifactory.ui.rest.model.admin.security.oauth.OAuthUserToken;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.security.SecurityServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Gidi Shabat
- */
- at Component
- at Path("oauth")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN,AuthorizationService.ROLE_USER})
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class OAuthUIResource extends BaseResource {
-    @Autowired
-    protected SecurityServiceFactory securityFactory;
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    public Response updateOAuthSettings(OAuthUIModel oAuthUIModel)
-            throws Exception {
-        return runService(securityFactory.updateOAuthSettings(), oAuthUIModel);
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    public Response getOAuthSettings()
-            throws Exception {
-        return runService(securityFactory.getOAuthtSettings());
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    @RolesAllowed({AuthorizationService.ROLE_USER,AuthorizationService.ROLE_ADMIN})
-    @Path("user/tokens")
-    public Response getOAuthTokensForUser()
-            throws Exception {
-        return runService(securityFactory.getOAuthTokensForUser());
-    }
-
-    @PUT
-    @Path("provider")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    public Response addAuthProviderSettings(OAuthProviderUIModel model)
-            throws Exception {
-        return runService(securityFactory.addOAuthProviderSettings(), model);
-    }
-
-    @POST
-    @Path("provider")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    public Response updateAuthProviderSettings(OAuthProviderUIModel model)
-            throws Exception {
-        return runService(securityFactory.updateOAuthProviderSettings(), model);
-    }
-
-
-    @DELETE
-    @Path("provider/{name}")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    public Response deleteAuthProviderSettings(@PathParam("name") String name)
-            throws Exception {
-        return runService(securityFactory.deleteOAuthProviderSettings(), name);
-    }
-
-    @DELETE
-    @Path("user/tokens/{userName}/{providerName}")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @RolesAllowed({AuthorizationService.ROLE_USER,AuthorizationService.ROLE_ADMIN})
-    public Response deleteOAuthUserToken(@PathParam("userName") String userName, at PathParam("providerName") String providerName)
-            throws Exception {
-        return runService(securityFactory.deleteOAuthUserToken(),new OAuthUserToken(userName,providerName));
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/permissions/PermissionsResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/permissions/PermissionsResource.java
deleted file mode 100644
index 9337894..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/permissions/PermissionsResource.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.security.permissions;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.admin.security.permissions.DeletePermissionTargetModel;
-import org.artifactory.ui.rest.model.admin.security.permissions.PermissionTargetModel;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.security.SecurityServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Path("targetPermissions")
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class PermissionsResource extends BaseResource {
-
-    @Autowired
-    private SecurityServiceFactory securityFactory;
-
-    @GET
-    @Path("crud{name:(/[^/]+?)?}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getPermissionTarget()
-            throws Exception {
-        return runService(securityFactory.getPermissionsTarget());
-    }
-
-    @GET
-    @Path("allUsersGroups")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getAllUsersGroups() throws Exception {
-        return runService(securityFactory.getAllUsersAndGroups());
-    }
-
-    @PUT
-    @Path("{name : [^/]+}")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response updatePermissionTarget(PermissionTargetModel permissionTargetModel)
-            throws Exception {
-        return runService(securityFactory.updatePermissionsTarget(), permissionTargetModel);
-    }
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    public Response createPermissionTarget(PermissionTargetModel permissionTargetModel)
-            throws Exception {
-        return runService(securityFactory.createPermissionsTarget(), permissionTargetModel);
-    }
-
-    @POST
-    @Path("deleteTargetPermissions")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response deletePermissionTarget(DeletePermissionTargetModel deletePermissionTargetModel) throws Exception {
-        return runService(securityFactory.deletePermissionsTarget(), deletePermissionTargetModel);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/saml/SamLoginLogoutResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/saml/SamLoginLogoutResource.java
deleted file mode 100644
index 605f648..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/saml/SamLoginLogoutResource.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.security.saml;
-
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.security.SecurityServiceFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Gidi Shabat
- */
- at Component
- at Path("saml")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class SamLoginLogoutResource extends BaseResource {
-    private static final Logger log = LoggerFactory.getLogger(SamlResource.class);
-
-    @Autowired
-    private SecurityServiceFactory securityFactory;
-
-    @Path("loginRequest")
-    @GET
-    public Response loginRequest() {
-        return runService(securityFactory.handleLoginRequest());
-    }
-
-
-    @Path("loginResponse")
-    @POST
-    public Response loginResponse() {
-        return runService(securityFactory.handleLoginResponse());
-    }
-
-    @Path("logoutRequest")
-    @GET
-    @Produces(MediaType.TEXT_PLAIN)
-    public Response logoutRequest() {
-        return runService(securityFactory.handleLogoutRequest());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/saml/SamlResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/saml/SamlResource.java
deleted file mode 100644
index 02bffc7..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/saml/SamlResource.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.security.saml;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.admin.security.saml.Saml;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.security.SecurityServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Path("saml/config")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class SamlResource extends BaseResource {
-
-    @Autowired
-    private SecurityServiceFactory securityFactory;
-
-    @PUT
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response updateSaml(Saml saml)
-            throws Exception {
-        return runService(securityFactory.updateSaml(), saml);
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getSaml()
-            throws Exception {
-        return runService(securityFactory.getSaml());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/signingkeys/DebianSigningKeyResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/signingkeys/DebianSigningKeyResource.java
deleted file mode 100644
index 4a80f09..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/signingkeys/DebianSigningKeyResource.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.security.signingkeys;
-
-import com.sun.jersey.multipart.FormDataMultiPart;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.admin.security.signingkey.SignKey;
-import org.artifactory.ui.rest.model.utils.FileUpload;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.security.SecurityServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Path("signingkeys")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DebianSigningKeyResource extends BaseResource {
-
-    @Autowired
-    private SecurityServiceFactory securityFactory;
-
-    @POST
-    @Path("install")
-    @Consumes(MediaType.MULTIPART_FORM_DATA)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response uploadDebianKey(FormDataMultiPart formParams)
-            throws Exception {
-        FileUpload fileUpload = new FileUpload(formParams);
-        return runService(securityFactory.uploadDebianKey(), fileUpload);
-    }
-
-    @DELETE
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response removeSigningKey()
-            throws Exception {
-        return runService(securityFactory.removeDebianKeyService());
-    }
-
-
-    @POST
-    @Path("verify")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response verifySigningKey(SignKey signKey)
-            throws Exception {
-        return runService(securityFactory.verifyDebianKey(), signKey);
-    }
-
-    @PUT
-    @Path("update")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response updatePassPhrase(SignKey signKey)
-            throws Exception {
-        return runService(securityFactory.updateDebianKey(), signKey);
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getSigningKey()
-            throws Exception {
-        return runService(securityFactory.getDebianSigningKey());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/signingkeys/KeyStoreResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/signingkeys/KeyStoreResource.java
deleted file mode 100644
index ed0649a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/signingkeys/KeyStoreResource.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.security.signingkeys;
-
-import com.sun.jersey.multipart.FormDataMultiPart;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.admin.security.signingkey.KeyStore;
-import org.artifactory.ui.rest.model.utils.FileUpload;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.security.SecurityServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Path("keystore")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class KeyStoreResource extends BaseResource {
-
-    @Autowired
-    private SecurityServiceFactory securityFactory;
-
-    @POST
-    @Path("upload")
-    @Consumes(MediaType.MULTIPART_FORM_DATA)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response uploadKeyStore(FormDataMultiPart formParams)
-            throws Exception {
-        FileUpload fileUpload = new FileUpload(formParams);
-        return runService(securityFactory.addKeyStore(), fileUpload);
-    }
-
-    @PUT
-    @Path("updatePass")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response updateKeyStorePass(KeyStore keyStore)
-            throws Exception {
-        return runService(securityFactory.changeKeyStorePassword(), keyStore);
-    }
-
-    @POST
-    @Path("add")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response addKeyStorePass(KeyStore keyStore)
-            throws Exception {
-        return runService(securityFactory.saveKeyStore(), keyStore);
-    }
-
-    @POST
-    @Path("cancel")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response cancelKeyStorePass(KeyStore keyStore)
-            throws Exception {
-        return runService(securityFactory.cancelKeyPair(), keyStore);
-    }
-
-    @DELETE
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response removeKeyStore()
-            throws Exception {
-        return runService(securityFactory.removeKeyStore());
-    }
-
-    @DELETE
-    @Path("password")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response removeKeyStorePassword() {
-        return runService(securityFactory.removeKeystorePassword());
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getKeyStore()
-            throws Exception {
-        return runService(securityFactory.getKeyStore());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/sshserver/SshServerResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/sshserver/SshServerResource.java
deleted file mode 100644
index 9cdc0b5..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/sshserver/SshServerResource.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.security.sshserver;
-
-import com.sun.jersey.multipart.FormDataMultiPart;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.model.admin.security.sshserver.SshServer;
-import org.artifactory.ui.rest.model.utils.FileUpload;
-import org.artifactory.ui.rest.service.admin.security.SecurityServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Noam Y. Tenne
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Path("sshserver")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class SshServerResource extends BaseResource {
-    @Autowired
-    private SecurityServiceFactory securityFactory;
-
-    @PUT
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response updateSshServer(SshServer sshServer)
-            throws Exception {
-        return runService(securityFactory.updateSshServer(), sshServer);
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getSshServer()
-            throws Exception {
-        return runService(securityFactory.getSshServer());
-    }
-
-    @POST
-    @Path("install")
-    @Consumes(MediaType.MULTIPART_FORM_DATA)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response uploadSshKey(FormDataMultiPart formParams) throws Exception {
-        FileUpload fileUpload = new FileUpload(formParams);
-        return runService(securityFactory.uploadSshServerKey(), fileUpload);
-    }
-
-    @DELETE
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response removeSigningKey()
-            throws Exception {
-        return runService(securityFactory.removeSshServerKeyService());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/user/UserProfileResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/user/UserProfileResource.java
deleted file mode 100644
index f4fc0f1..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/user/UserProfileResource.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.security.user;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.model.admin.security.login.UserLogin;
-import org.artifactory.ui.rest.model.admin.security.user.UserProfile;
-import org.artifactory.ui.rest.service.admin.security.SecurityServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN,AuthorizationService.ROLE_USER})
- at Component
- at Path("userProfile")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UserProfileResource extends BaseResource {
-
-    @Autowired
-    protected SecurityServiceFactory securityFactory;
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response unlockUserProfile(UserLogin userLogin)
-            throws Exception {
-        return runService(securityFactory.unlockUserProfile(), userLogin);
-    }
-
-    @PUT
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response updateUserProfile(UserProfile userProfile)
-            throws Exception {
-        return runService(securityFactory.updateUserProfile(), userProfile);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/user/UserResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/user/UserResource.java
deleted file mode 100644
index 2dd00a2..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/security/user/UserResource.java
+++ /dev/null
@@ -1,114 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.security.user;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.model.admin.security.user.DeleteUsersModel;
-import org.artifactory.ui.rest.model.admin.security.user.User;
-import org.artifactory.ui.rest.service.admin.security.SecurityServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Path("users")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UserResource extends BaseResource {
-
-    @Autowired
-    protected SecurityServiceFactory securityFactory;
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response createUser(User userModel)
-            throws Exception {
-        return runService(securityFactory.createUser(), userModel);
-    }
-
-    @POST
-    @Path("{userName}/expirePassword")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    public Response expireUserPassword(@PathParam("userName") String userName)
-            throws Exception {
-        return runService(securityFactory.expireUserPassword(), userName);
-    }
-
-    @POST
-    @Path("{userName}/unexpirePassword")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    public Response unexpirePassword(@PathParam("userName") String userName)
-            throws Exception {
-        return runService(securityFactory.unexpirePassword(), userName);
-    }
-
-    @POST
-    @Path("expirePasswordForAllUsers")
-    @Produces(MediaType.APPLICATION_JSON)
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    public Response expirePasswordForAllUsers()
-            throws Exception {
-        return runService(securityFactory.expirePasswordForAllUsers());
-    }
-
-    @POST
-    @Path("unexpirePasswordForAllUsers")
-    @Produces(MediaType.APPLICATION_JSON)
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    public Response unexpirePasswordForAllUsers()
-            throws Exception {
-        return runService(securityFactory.unexpirePasswordForAllUsers());
-    }
-
-    @PUT
-    @Path("{id : [^/]+}")
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response updateUser(User userModel)
-            throws Exception {
-        return runService(securityFactory.updateUser(), userModel);
-    }
-
-    @POST
-    @Path("userDelete")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response deleteUsers(DeleteUsersModel deleteUsersModel) throws Exception {
-        return runService(securityFactory.deleteUser(), deleteUsersModel);
-    }
-
-    @GET
-    @Path("crud{id : (/[^/]+?)?}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getUser()
-            throws Exception {
-        return runService(securityFactory.getUsers());
-    }
-
-    @GET
-    @Path("permissions{id : /[^/]+}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getUserPermissions()
-            throws Exception {
-        return runService(securityFactory.getUserPermissions());
-    }
-
-    @POST
-    @Path("externalStatus")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response checkExternalStatus(User user)
-            throws Exception {
-        return runService(securityFactory.checkExternalStatus(), user);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/services/backups/BackupResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/services/backups/BackupResource.java
deleted file mode 100644
index e046e58..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/services/backups/BackupResource.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.services.backups;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.admin.services.backups.Backup;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.services.ServicesServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Path("backup{id:(/[^/]+?)?}")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class BackupResource extends BaseResource {
-
-    @Autowired
-    protected ServicesServiceFactory serviceFactory;
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response createBackup(Backup backup)
-            throws Exception {
-        return runService(serviceFactory.createBackupService(), backup);
-    }
-
-    @PUT
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response updateBackup(Backup backup)
-            throws Exception {
-        return runService(serviceFactory.updateBackupService(), backup);
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getBackup()
-            throws Exception {
-        return runService(serviceFactory.getBackupService());
-    }
-
-    @DELETE
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response deleteBackup()
-            throws Exception {
-        return runService(serviceFactory.deleteBackupService());
-    }
-
-    @Path("runnow")
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response runNowBackup(Backup backup)
-            throws Exception {
-        return runService(serviceFactory.runNowBackupService(), backup);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/services/filesystem/FileSystemBrowserResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/services/filesystem/FileSystemBrowserResource.java
deleted file mode 100644
index 909cc14..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/services/filesystem/FileSystemBrowserResource.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.services.filesystem;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.services.ServicesServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Path("browsefilesystem{path:(/[^/]+?)?}")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class FileSystemBrowserResource extends BaseResource {
-
-    @Autowired
-    protected ServicesServiceFactory serviceFactory;
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response browseFileSystem()
-            throws Exception {
-        return runService(serviceFactory.browseFileSystemService());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/services/indexer/MavenIndexerResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/services/indexer/MavenIndexerResource.java
deleted file mode 100644
index f928f26..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/admin/services/indexer/MavenIndexerResource.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package org.artifactory.ui.rest.resource.admin.services.indexer;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.admin.services.indexer.Indexer;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.admin.services.ServicesServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
-
- at Path("indexer")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class MavenIndexerResource extends BaseResource {
-
-    @Autowired
-    protected ServicesServiceFactory serviceFactory;
-
-    @PUT
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response updateIndexer(Indexer indexer)
-            throws Exception {
-        return runService(serviceFactory.updateIndexerService(), indexer);
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getIndexer()
-            throws Exception {
-        return runService(serviceFactory.getIndexerService());
-    }
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response runIndexNow()
-            throws Exception {
-        return runService(serviceFactory.runIndexNowService());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/generic/NativeBrowserResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/generic/NativeBrowserResource.java
deleted file mode 100644
index 7819ee0..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/generic/NativeBrowserResource.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.artifactory.ui.rest.resource.artifacts.browse.generic;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.artifacts.browse.BrowseServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Path("nativeBrowser")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class NativeBrowserResource extends BaseResource {
-
-    @Autowired
-    BrowseServiceFactory browseFactory;
-
-    @GET
-    @Produces(MediaType.TEXT_HTML)
-    public Response nativeBrowser() throws Exception {
-        return runService(browseFactory.browseNative());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/actions/ArtifactActionsResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/actions/ArtifactActionsResource.java
deleted file mode 100644
index 1ffb083..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/actions/ArtifactActionsResource.java
+++ /dev/null
@@ -1,161 +0,0 @@
-package org.artifactory.ui.rest.resource.artifacts.browse.treebrowser.actions;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-import org.artifactory.rest.common.model.trash.RestoreArtifact;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.*;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.recalculateindex.BaseIndexCalculator;
-import org.artifactory.ui.rest.service.artifacts.browse.BrowseServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Path("artifactactions")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ArtifactActionsResource extends BaseResource {
-
-    @Autowired
-    BrowseServiceFactory browseFactory;
-
-    @Autowired
-    @Qualifier("streamingRestResponse")
-    public void setArtifactoryResponse(RestResponse artifactoryResponse) {
-        this.artifactoryResponse = artifactoryResponse;
-    }
-
-    @POST
-    @Path("copy")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response copyArtifact(CopyArtifact copyArtifact)
-            throws Exception {
-        return runService(browseFactory.copyArtifactService(), copyArtifact);
-    }
-
-    @POST
-    @Path("move")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response moveArtifact(MoveArtifact copyAction)
-            throws Exception {
-        return runService(browseFactory.moveArtifactService(), copyAction);
-    }
-
-    @POST
-    @Path("download")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response downloadArtifact(DownloadArtifact downloadArtifact)
-            throws Exception {
-        return runService(browseFactory.downloadArtifactService(), downloadArtifact);
-    }
-
-    @GET
-    @Path("downloadfolderinfo")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getFolderDownloadInfo() throws Exception {
-        return runService(browseFactory.getDownloadFolderInfo());
-    }
-
-    @POST
-    @Path("emptytrash")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response emptyTrash() throws Exception {
-        return runService(browseFactory.emptyTrashService());
-    }
-
-    @POST
-    @Path("restore")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response restoreFromTrash(RestoreArtifact artifact) throws Exception {
-        return runService(browseFactory.restoreArtifactService(), artifact);
-    }
-
-    @GET
-    @Path("downloadfolder")
-    @Produces(MediaType.APPLICATION_OCTET_STREAM)
-    public Response downloadFolder() throws Exception {
-        return runService(browseFactory.downloadFolder());
-    }
-
-    @POST
-    @Path("watch")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response watchArtifact(WatchArtifact watchArtifact)
-            throws Exception {
-        return runService(browseFactory.watchArtifactService(), watchArtifact);
-    }
-
-    @POST
-    @Path("delete")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response deleteArtifact(DeleteArtifact deleteArtifact)
-            throws Exception {
-        return runService(browseFactory.deleteArtifactService(), deleteArtifact);
-    }
-
-    @POST
-    @Path("view")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response viewArtifact(ViewArtifact viewArtifact)
-            throws Exception {
-        return runService(browseFactory.viewArtifactService(), viewArtifact);
-    }
-
-    @POST
-    @Path("zap")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response zapArtifact(ZapArtifact zapArtifact)
-            throws Exception {
-        return runService(browseFactory.zapArtifactService(), zapArtifact);
-    }
-
-    @POST
-    @Path("calculateIndex")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response calculateIndex(BaseIndexCalculator baseIndexCalculator)
-            throws Exception {
-        return runService(browseFactory.recalculateIndex(), baseIndexCalculator);
-    }
-
-    @POST
-    @Path("zapVirtual")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response zapVirtual(ZapArtifact zapArtifact)
-            throws Exception {
-        return runService(browseFactory.zapCachesVirtual(), zapArtifact);
-    }
-
-    @POST
-    @Path("addSha256")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response addSha256(BaseArtifact baseArtifact)
-            throws Exception {
-        return runService(browseFactory.addSha256ToArtifact(), baseArtifact);
-    }
-
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/actions/deleteversions/DeleteVersionsResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/actions/deleteversions/DeleteVersionsResource.java
deleted file mode 100644
index 26e0dc0..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/actions/deleteversions/DeleteVersionsResource.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.artifactory.ui.rest.resource.artifacts.browse.treebrowser.actions.deleteversions;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.DeleteArtifactVersion;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.artifacts.browse.BrowseServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Path("artifactactions/deleteversions")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DeleteVersionsResource extends BaseResource {
-
-    @Autowired
-    BrowseServiceFactory browseFactory;
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getDeleteVersionList()
-            throws Exception {
-        return runService(browseFactory.getDeleteVersionsService());
-    }
-
-    @POST
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response deleteVersionList(List<DeleteArtifactVersion> deleteArtifactVersions)
-            throws Exception {
-        return runService(browseFactory.deleteVersionService(), deleteArtifactVersions);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/ArtifactBlackDuckResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/ArtifactBlackDuckResource.java
deleted file mode 100644
index 5401989..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/ArtifactBlackDuckResource.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.artifactory.ui.rest.resource.artifacts.browse.treebrowser.tabs;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.blackduck.BlackDuckArtifactInfo;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.artifacts.browse.BrowseServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Path("artifactblackduck")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ArtifactBlackDuckResource extends BaseResource {
-
-    @Autowired
-    BrowseServiceFactory browseFactory;
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response fetchBlackDuck(BlackDuckArtifactInfo blackDuckArtifactInfo)
-            throws Exception {
-        return runService(browseFactory.getBlackDuckArtifact(), blackDuckArtifactInfo);
-    }
-
-    @PUT
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response updateBlackDuckComponentId(BlackDuckArtifactInfo blackDuckArtifactInfo)
-            throws Exception {
-        return runService(browseFactory.updateBlackDuckComponentId(), blackDuckArtifactInfo);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/ArtifactBuildsResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/ArtifactBuildsResource.java
deleted file mode 100644
index bf8810f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/ArtifactBuildsResource.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.artifactory.ui.rest.resource.artifacts.browse.treebrowser.tabs;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.artifacts.browse.BrowseServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Path("artifactbuilds")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN,AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ArtifactBuildsResource extends BaseResource {
-
-    @Autowired
-    BrowseServiceFactory browseFactory;
-
-    @Autowired
-    @Qualifier("streamingRestResponse")
-    public void setArtifactoryResponse(RestResponse artifactoryResponse) {
-        this.artifactoryResponse = artifactoryResponse;
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getArtifactBuild()
-            throws Exception {
-        return runService(browseFactory.getArtifactBuildsService());
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    @Path("json{id:(/[^/]+?)?}")
-    public Response getArtifactBuildJson()
-            throws Exception {
-        return runService(browseFactory.getArtifactBuildJsonService());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/ArtifactsPropertiesResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/ArtifactsPropertiesResource.java
deleted file mode 100644
index cc1ac22..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/ArtifactsPropertiesResource.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.artifactory.ui.rest.resource.artifacts.browse.treebrowser.tabs;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.properties.PropertiesArtifactInfo;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.artifacts.browse.BrowseServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Path("artifactproperties{name:(/[^/]+?)?}")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN,AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ArtifactsPropertiesResource extends BaseResource {
-    @Autowired
-    BrowseServiceFactory browseFactory;
-
-    @POST
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response createProperty(PropertiesArtifactInfo propertiesTab)
-            throws Exception {
-        return runService(browseFactory.getCreatePropertyService(),propertiesTab);
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-     public Response getProperty()
-            throws Exception {
-        return runService(browseFactory.getGetPropertyService());
-    }
-
-    @PUT
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response updateProperty(PropertiesArtifactInfo propertiesTab)
-            throws Exception {
-        return runService(browseFactory.getUpdatePropertyService(),propertiesTab);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/DeletePropertiesResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/DeletePropertiesResource.java
deleted file mode 100644
index f8576b6..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/DeletePropertiesResource.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.artifactory.ui.rest.resource.artifacts.browse.treebrowser.tabs;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.properties.DeletePropertyModel;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.artifacts.browse.BrowseServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Gidi Shabat
- */
- at Path("deleteproperties")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DeletePropertiesResource extends BaseResource {
-    @Autowired
-    BrowseServiceFactory browseFactory;
-
-
-    @POST
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response deleteProperty(DeletePropertyModel deletePropertyModel)
-            throws Exception {
-        return runService(browseFactory.getDeletePropertyService(), deletePropertyModel);
-    }
-}
-
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/EffectivePermissionResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/EffectivePermissionResource.java
deleted file mode 100644
index 3463fc3..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/EffectivePermissionResource.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.ui.rest.resource.artifacts.browse.treebrowser.tabs;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.artifacts.browse.BrowseServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Path("artifactpermissions{name:(/[^/]+?)?}")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN,AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class EffectivePermissionResource extends BaseResource {
-
-    @Autowired
-    BrowseServiceFactory browseFactory;
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getEffectivePermission()
-            throws Exception {
-        return runService(browseFactory.getGetEffectivePermissionService());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/ViewSourceResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/ViewSourceResource.java
deleted file mode 100644
index 923a6d6..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/ViewSourceResource.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.ui.rest.resource.artifacts.browse.treebrowser.tabs;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.viewsource.ViewArtifactSource;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.artifacts.browse.BrowseServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Path("archiveViewSource")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ViewSourceResource extends BaseResource {
-
-    @Autowired
-    BrowseServiceFactory browseFactory;
-
-    @POST
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response viewArchiveSource(ViewArtifactSource viewArtifactSource)
-            throws Exception {
-        return runService(browseFactory.archiveViewSourceService(), viewArtifactSource);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/checksums/ChecksumsResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/checksums/ChecksumsResource.java
deleted file mode 100644
index a0e083b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/checksums/ChecksumsResource.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.ui.rest.resource.artifacts.browse.treebrowser.tabs.checksums;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.GeneralArtifactInfo;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.artifacts.browse.BrowseServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Dan Feldman
- */
- at Path("checksums")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ChecksumsResource extends BaseResource {
-
-    @Autowired
-    BrowseServiceFactory browseFactory;
-
-    @POST
-    @Path("fix")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response fixChecksums(GeneralArtifactInfo artifactInfo) throws Exception {
-        return runService(browseFactory.fixChecksums(), artifactInfo);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/generalinfo/DependencyDeclarationResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/generalinfo/DependencyDeclarationResource.java
deleted file mode 100644
index 9999b4d..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/generalinfo/DependencyDeclarationResource.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.ui.rest.resource.artifacts.browse.treebrowser.tabs.generalinfo;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.artifacts.browse.BrowseServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Path("dependencydeclaration")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DependencyDeclarationResource extends BaseResource {
-
-    @Autowired
-    BrowseServiceFactory browseFactory;
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getDependencyDeclaration()
-            throws Exception {
-        return runService(browseFactory.getGetDependencyDeclarationService());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/generalinfo/FilteredResourceResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/generalinfo/FilteredResourceResource.java
deleted file mode 100644
index 777e8ef..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/generalinfo/FilteredResourceResource.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.artifactory.ui.rest.resource.artifacts.browse.treebrowser.tabs.generalinfo;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.GeneralArtifactInfo;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.artifacts.browse.BrowseServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Dan Feldman
- */
- at Path("filteredResource")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class FilteredResourceResource extends BaseResource {
-
-    public static final String SET_FILTERED_QUERY_PARAM = "setFiltered";
-
-    @Autowired
-    BrowseServiceFactory browseFactory;
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response setFilteredResource(GeneralArtifactInfo artifact) throws Exception {
-        return runService(browseFactory.setFilteredResource(), artifact);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/generalinfo/GeneralArtifactResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/generalinfo/GeneralArtifactResource.java
deleted file mode 100644
index 3e2db17..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/generalinfo/GeneralArtifactResource.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.artifactory.ui.rest.resource.artifacts.browse.treebrowser.tabs.generalinfo;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.RestGeneralTab;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.info.BaseInfo;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.artifacts.browse.BrowseServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Path("artifactgeneral")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GeneralArtifactResource extends BaseResource {
-
-    @Autowired
-    BrowseServiceFactory browseFactory;
-
-    @POST
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response populateTreeBrowser(RestGeneralTab generalTab) throws Exception {
-        return runService(browseFactory.getGetGeneralArtifactsService(), generalTab);
-    }
-
-    @POST
-    @Path("bintray")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response populateBintrayInfo() throws Exception {
-        return runService(browseFactory.getGetGeneralBintrayService());
-    }
-
-    @POST
-    @Path("artifactsCount")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response getArtifactCount(BaseInfo baseInfo) {
-        return runService(browseFactory.getArtifactsCount(), baseInfo);
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/generalinfo/licenses/GeneralInfoTabLicensesResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/generalinfo/licenses/GeneralInfoTabLicensesResource.java
deleted file mode 100644
index a8b5e19..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/generalinfo/licenses/GeneralInfoTabLicensesResource.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.artifactory.ui.rest.resource.artifacts.browse.treebrowser.tabs.generalinfo.licenses;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.licenses.GeneralTabLicenseModel;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.artifacts.browse.BrowseServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.List;
-
-/**
- * @author Dan Feldman
- */
- at Path("generalTabLicenses")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GeneralInfoTabLicensesResource extends BaseResource {
-
-    @Autowired
-    BrowseServiceFactory browseFactory;
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getAllAvailableLicenses() throws Exception {
-        return runService(browseFactory.getAllAvailableLicenses());
-    }
-
-    @GET
-    @Path("getArchiveLicenseFile")
-    @Produces(MediaType.TEXT_PLAIN)
-    public Response getArchiveLicenseFile() throws Exception {
-        return runService(browseFactory.getArchiveLicenseFile());
-    }
-
-    @PUT
-    @Path("setLicensesOnPath")
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response setLicensesOnPath(List<GeneralTabLicenseModel> licenses) throws Exception {
-        return runService(browseFactory.setLicensesOnPath(), licenses);
-    }
-
-    @GET
-    @Path("scanArtifact")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response scanArtifactForLicenses() throws Exception {
-        return runService(browseFactory.scanArtifactForLicenses());
-    }
-
-    @POST
-    @Path("queryCodeCenter")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response queryCodeCenter() throws Exception {
-        return runService(browseFactory.queryCodeCenter());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/views/ViewsResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/views/ViewsResource.java
deleted file mode 100644
index 6e9efbc..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/views/ViewsResource.java
+++ /dev/null
@@ -1,144 +0,0 @@
-package org.artifactory.ui.rest.resource.artifacts.browse.treebrowser.tabs.views;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.ViewArtifact;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.bower.BowerArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.docker.DockerArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.docker.ancestry.DockerAncestryArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.gems.GemsArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.npm.NpmArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.nugetinfo.NugetArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.pypi.PypiArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.rpm.RpmArtifactInfo;
-import org.artifactory.ui.rest.service.artifacts.browse.BrowseServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Path("views")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ViewsResource extends BaseResource {
-
-    @Autowired
-    BrowseServiceFactory browseFactory;
-
-    @Autowired
-    @Qualifier("streamingRestResponse")
-    @Override
-    public void setArtifactoryResponse(RestResponse artifactoryResponse) {
-        this.artifactoryResponse = artifactoryResponse;
-    }
-
-    @POST
-    @Path("pom")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response viewPom(ViewArtifact viewArtifact)
-            throws Exception {
-        return runService(browseFactory.viewArtifactService(), viewArtifact);
-    }
-
-    @POST
-    @Path("nuget")
-
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response viewNuget(NugetArtifactInfo nugetArtifactInfo)
-            throws Exception {
-        return runService(browseFactory.nugetViewService(), nugetArtifactInfo);
-    }
-
-    @POST
-    @Path("gems")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response viewGems(GemsArtifactInfo gemsArtifactInfo)
-            throws Exception {
-        return runService(browseFactory.gemsViewService(), gemsArtifactInfo);
-    }
-
-    @POST
-    @Path("npm")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response viewGems(NpmArtifactInfo npmArtifactInfo)
-            throws Exception {
-        return runService(browseFactory.npmViewService(), npmArtifactInfo);
-    }
-
-    @POST
-    @Path("rpm")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response viewRpm(RpmArtifactInfo rpmArtifactInfo)
-            throws Exception {
-        return runService(browseFactory.rpmViewService(), rpmArtifactInfo);
-    }
-
-    @POST
-    @Path("pypi")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response viewPypi(PypiArtifactInfo pypiArtifactInfo)
-            throws Exception {
-        return runService(browseFactory.pypiViewService(), pypiArtifactInfo);
-    }
-
-    @POST
-    @Path("bower")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response viewBower(BowerArtifactInfo bowerArtifactInfo)
-            throws Exception {
-        return runService(browseFactory.bowerViewService(), bowerArtifactInfo);
-    }
-
-    @POST
-    @Path("docker")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response viewDocker(DockerArtifactInfo dockerArtifactInfo)
-            throws Exception {
-        return runService(browseFactory.dockerViewService(), dockerArtifactInfo);
-    }
-
-    @POST
-    @Path("dockerv2")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response viewDockerV2(DockerArtifactInfo dockerArtifactInfo)
-            throws Exception {
-        return runService(browseFactory.dockerV2ViewService(), dockerArtifactInfo);
-    }
-
-    @POST
-    @Path("dockerancestry")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response viewDockerAncestry(DockerAncestryArtifactInfo dockerAncestryArtifactInfo)
-            throws Exception {
-        return runService(browseFactory.dockerAncestryViewService(), dockerAncestryArtifactInfo);
-    }
-
-    @GET
-    @Path("dockerproxy{id:(/[^/]+?)?}")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response viewDockerProxyConfig() throws Exception {
-        return runService(browseFactory.dockerProxyViewService());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/watches/WatchersResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/watches/WatchersResource.java
deleted file mode 100644
index b1eb4aa..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tabs/watches/WatchersResource.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.artifactory.ui.rest.resource.artifacts.browse.treebrowser.tabs.watches;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.watchers.DeleteWatchersModel;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.artifacts.browse.BrowseServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Path("artifactwatches")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN,AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class WatchersResource extends BaseResource {
-
-    @Autowired
-    BrowseServiceFactory browseFactory;
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getWatchers()
-            throws Exception {
-        return runService(browseFactory.getWatchersService());
-    }
-
-    @POST
-    @Path("remove")
-    public Response removeWatchers(DeleteWatchersModel model)
-            throws Exception {
-        return runService(browseFactory.getRemoveWatchersService(),model);
-    }
-
-    @GET
-    @Path("status")
-    public Response watchersStatus()
-            throws Exception {
-        return runService(browseFactory.watchStatusService());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tree/TreeBrowserResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tree/TreeBrowserResource.java
deleted file mode 100644
index 0b96c52..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/browse/treebrowser/tree/TreeBrowserResource.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.ui.rest.resource.artifacts.browse.treebrowser.tree;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.nodes.RestTreeNode;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.artifacts.browse.BrowseServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Path("treebrowser")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN,AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class TreeBrowserResource extends BaseResource {
-
-    @Autowired
-    BrowseServiceFactory browseFactory;
-
-    @POST
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response browseTreeNodes(RestTreeNode node)
-            throws Exception {
-        return runService(browseFactory.getBrowseTreeNodesService(), node);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/deploy/DeployArtifactResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/deploy/DeployArtifactResource.java
deleted file mode 100644
index 2d6105e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/deploy/DeployArtifactResource.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package org.artifactory.ui.rest.resource.artifacts.deploy;
-
-import com.sun.jersey.multipart.FormDataMultiPart;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.artifacts.deploy.UploadArtifactInfo;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.artifacts.deploy.DeployServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Path("artifact")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DeployArtifactResource extends BaseResource {
-
-    @Autowired
-    DeployServiceFactory deployFactory;
-
-    @POST
-    @Path("upload")
-    @Consumes(MediaType.MULTIPART_FORM_DATA)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response uploadArtifact(FormDataMultiPart formParams)
-            throws Exception {
-        UploadArtifactInfo uploadArtifactInfo = new UploadArtifactInfo(formParams);
-        return runService(deployFactory.artifactUpload(), uploadArtifactInfo);
-    }
-
-    @POST
-    @Path("cancelupload")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response cancelUploadArtifact(UploadArtifactInfo uploadArtifactInfo)
-            throws Exception {
-        return runService(deployFactory.cancelArtifactUpload(), uploadArtifactInfo);
-    }
-
-    @POST
-    @Path("deploy")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response deployArtifact(UploadArtifactInfo uploadArtifactInfo)
-            throws Exception {
-        return runService(deployFactory.deployArtifact(), uploadArtifactInfo);
-    }
-
-    @POST
-    @Path("deploy/bundle")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response uploadBundleArtifact(UploadArtifactInfo uploadArtifactInfo)
-            throws Exception {
-        return runService(deployFactory.artifactDeployBundle(), uploadArtifactInfo);
-    }
-
-    @POST
-    @Path("deploy/multi")
-    @Consumes(MediaType.MULTIPART_FORM_DATA)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response deployMultiArtifact(FormDataMultiPart formParams)
-            throws Exception {
-        UploadArtifactInfo uploadArtifactInfo = new UploadArtifactInfo(formParams);
-        return runService(deployFactory.artifactMultiDeploy(), uploadArtifactInfo);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/search/ArtifactSearchResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/search/ArtifactSearchResource.java
deleted file mode 100644
index 301e8bb..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/search/ArtifactSearchResource.java
+++ /dev/null
@@ -1,150 +0,0 @@
-package org.artifactory.ui.rest.resource.artifacts.search;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.model.artifacts.search.DeleteArtifactsModel;
-import org.artifactory.ui.rest.model.artifacts.search.checksumsearch.ChecksumSearch;
-import org.artifactory.ui.rest.model.artifacts.search.classsearch.ClassSearch;
-import org.artifactory.ui.rest.model.artifacts.search.gavcsearch.GavcSearch;
-import org.artifactory.ui.rest.model.artifacts.search.packagesearch.search.AqlUISearchModel;
-import org.artifactory.ui.rest.model.artifacts.search.propertysearch.PropertySearch;
-import org.artifactory.ui.rest.model.artifacts.search.quicksearch.QuickSearch;
-import org.artifactory.ui.rest.model.artifacts.search.remotesearch.RemoteSearch;
-import org.artifactory.ui.rest.model.artifacts.search.trashsearch.TrashSearch;
-import org.artifactory.ui.rest.service.artifacts.search.SearchServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Path("artifactsearch")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ArtifactSearchResource extends BaseResource {
-
-    @Autowired
-    SearchServiceFactory searchFactory;
-
-    @POST
-    @Path("quick")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response quickSearch(QuickSearch quickSearch)
-            throws Exception {
-        return runService(searchFactory.quickSearchService(), quickSearch);
-    }
-
-    @POST
-    @Path("class")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response classSearch(ClassSearch classSearch)
-            throws Exception {
-        return runService(searchFactory.classSearchService(), classSearch);
-    }
-
-    @POST
-    @Path("gavc")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response gavcSearch(GavcSearch gavcSearch)
-            throws Exception {
-        return runService(searchFactory.gavcSearchService(), gavcSearch);
-    }
-
-    @POST
-    @Path("pkg{type:.*}")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response pkgSearch(List<AqlUISearchModel> search) throws Exception {
-        return runService(searchFactory.packageSearch(), search);
-    }
-
-    @GET
-    @Path("pkg{type:.*}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getPkgSearchOptions() throws Exception {
-        return runService(searchFactory.packageSearchOptions());
-    }
-
-    @POST
-    @Path("pkg/tonative")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response searchCriteriaToNativeAql(List<AqlUISearchModel> search) throws Exception {
-        return runService(searchFactory.PackageSearchCriteriaToNativeAql(), search);
-    }
-
-    @POST
-    @Path("checksum")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response checksumSearch(ChecksumSearch checksumSearch)
-            throws Exception {
-        if (matchToSha256Length(checksumSearch)){
-            PropertySearch sha256Property = getPropertySearchModel("sha256", checksumSearch.getChecksum());
-            return runService(searchFactory.propertySearchService(), sha256Property);
-        }
-        return runService(searchFactory.checksumSearchService(), checksumSearch);
-    }
-
-
-    @POST
-    @Path("remote")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response remoteSearch(RemoteSearch remoteSearch)
-            throws Exception {
-        return runService(searchFactory.remoteSearchService(), remoteSearch);
-    }
-
-    @POST
-    @Path("trash")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response trashSearch(TrashSearch trashSearch)
-            throws Exception {
-        return runService(searchFactory.trashSearchService(), trashSearch);
-    }
-
-    @POST
-    @Path("deleteArtifact")
-    public Response deleteArtifacts(DeleteArtifactsModel deleteArtifactsModel)
-            throws Exception {
-        return runService(searchFactory.deleteArtifactsService(), deleteArtifactsModel);
-    }
-
-    /**
-     * check if checksum length match sha 256 length
-     * @param checksumSearch - checksum search object
-     * @return - true if match sha256
-     */
-    private boolean matchToSha256Length(ChecksumSearch checksumSearch) {
-        return StringUtils.length(checksumSearch.getChecksum()) == ChecksumType.sha256.length();
-    }
-
-    /**
-     * create and return property search model
-     * @param key - property key
-     * @param value property value
-     * @return property search model
-     */
-    private PropertySearch getPropertySearchModel(String key,String value){
-        PropertySearch propertySearch = new PropertySearch();
-        propertySearch.updatePropertySearchData(key, value);
-        return propertySearch;
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/search/PropertySearchResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/search/PropertySearchResource.java
deleted file mode 100644
index 5f2a779..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/search/PropertySearchResource.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.ui.rest.resource.artifacts.search;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.artifacts.search.propertysearch.PropertySearch;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.artifacts.search.SearchServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Path("artifactsearch/property")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class PropertySearchResource extends BaseResource {
-
-    @Autowired
-    SearchServiceFactory searchFactory;
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response propertySearch(PropertySearch propertySearch)
-            throws Exception {
-        return runService(searchFactory.propertySearchService(), propertySearch);
-    }
-
-
-    @GET
-    @Path("keyvalue")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getPropertySets()
-            throws Exception {
-        return runService(searchFactory.getPropertySetsService());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/search/SearchResultsResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/search/SearchResultsResource.java
deleted file mode 100644
index 5d4b8d8..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/search/SearchResultsResource.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.ui.rest.resource.artifacts.search;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.artifacts.search.BaseSearchResult;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.artifacts.search.SearchServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Path("searchResults")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class SearchResultsResource extends BaseResource {
-
-    @Autowired
-    SearchServiceFactory searchFactory;
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response saveSearchResults(BaseSearchResult baseSearchResult)
-            throws Exception {
-        return runService(searchFactory.propertySearchService(), baseSearchResult);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/search/StashSearchResultsResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/search/StashSearchResultsResource.java
deleted file mode 100644
index e23798f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/search/StashSearchResultsResource.java
+++ /dev/null
@@ -1,114 +0,0 @@
-package org.artifactory.ui.rest.resource.artifacts.search;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.admin.importexport.ImportExportSettings;
-import org.artifactory.ui.rest.model.artifacts.search.BaseSearchResult;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.artifacts.search.SearchServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.List;
-
-/**
- * @author Chen keinan
- */
- at Path("stashResults")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class StashSearchResultsResource extends BaseResource {
-
-    @Autowired
-    SearchServiceFactory searchFactory;
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response saveSearchResults(List<BaseSearchResult> baseSearchResults)
-            throws Exception {
-        return runService(searchFactory.saveSearchResults(), baseSearchResults);
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getSearchResults()
-            throws Exception {
-        return runService(searchFactory.getSearchResults());
-    }
-
-    @DELETE
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response deleteSearchResults()
-            throws Exception {
-        return runService(searchFactory.removeSearchResults());
-    }
-
-    @POST
-    @Path("subtract")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response subtractSearchResults(List<BaseSearchResult> baseSearchResults)
-            throws Exception {
-        return runService(searchFactory.subtractSearchResults(), baseSearchResults);
-    }
-
-    @POST
-    @Path("intersect")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response intersectSearchResults(List<BaseSearchResult> baseSearchResults)
-            throws Exception {
-        return runService(searchFactory.intersectSearchResults(), baseSearchResults);
-    }
-
-    @POST
-    @Path("add")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response addSearchResults(List<BaseSearchResult> baseSearchResults)
-            throws Exception {
-        return runService(searchFactory.addSearchResults(), baseSearchResults);
-    }
-
-    @POST
-    @Path("export")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response exportSearchResults(ImportExportSettings importExportSettings)
-            throws Exception {
-        return runService(searchFactory.exportSearchResults(), importExportSettings);
-    }
-
-    @POST
-    @Path("copy")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response copySearchResults()
-            throws Exception {
-        return runService(searchFactory.copySearchResults());
-    }
-
-    @POST
-    @Path("move")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response moveSearchResults()
-            throws Exception {
-        return runService(searchFactory.moveSearchResults());
-    }
-
-    @POST
-    @Path("discard")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response discardResults()
-            throws Exception {
-        return runService(searchFactory.discardResults());
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/setmeup/SetMeUpResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/setmeup/SetMeUpResource.java
deleted file mode 100644
index 7c6667f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/artifacts/setmeup/SetMeUpResource.java
+++ /dev/null
@@ -1,151 +0,0 @@
-package org.artifactory.ui.rest.resource.artifacts.setmeup;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.setmeup.GradleSettingModel;
-import org.artifactory.ui.rest.model.setmeup.IvySettingModel;
-import org.artifactory.ui.rest.model.setmeup.MavenSettingModel;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.general.GeneralServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.FormParam;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- *
- */
- at Path("setMeUp")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class SetMeUpResource extends BaseResource {
-
-    @Autowired
-    @Qualifier("streamingRestResponse")
-    public void setArtifactoryResponse(RestResponse artifactoryResponse) {
-        this.artifactoryResponse = artifactoryResponse;
-    }
-
-    @Autowired
-    GeneralServiceFactory generalFactory;
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getRepoKeyTypeForSetMeUp()
-            throws Exception {
-        return runService(generalFactory.getSetMeUp());
-    }
-
-    @GET
-    @Path("mavenSettings")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getMavenSettings()
-            throws Exception {
-        return runService(generalFactory.mavenSettingGenerator());
-    }
-
-    @GET
-    @Path("gradleSettings")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getGradleSettings()
-            throws Exception {
-        return runService(generalFactory.gradleSettingGenerator());
-    }
-
-    @GET
-    @Path("ivySettings")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getIvySettings()
-            throws Exception {
-        return runService(generalFactory.ivySettingGenerator());
-    }
-
-    @GET
-    @Path("reverseProxyData")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getReverseProxyData()
-            throws Exception {
-        return runService(generalFactory.getReverseProxySetMeUpData());
-    }
-
-    @POST
-    @Path("mavenSnippet")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response generateMavenSnippet(MavenSettingModel mavenSettingModel)
-    throws Exception {
-        return runService(generalFactory.getMavenSettingSnippet(),mavenSettingModel);
-    }
-
-    @POST
-    @Path("gradleSnippet")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response generateGradleSnippet(GradleSettingModel gradleSettingModel)
-            throws Exception {
-        return runService(generalFactory.getGradleSettingSnippet(),gradleSettingModel);
-    }
-
-    @POST
-    @Path("ivySnippet")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response generateIvySnippet(IvySettingModel ivySettingModel)
-            throws Exception {
-        return runService(generalFactory.GetIvySettingSnippet(), ivySettingModel);
-    }
-
-    @POST
-    @Path("downloadBuildGradle")
-    @Consumes("application/x-www-form-urlencoded")
-    @Produces(MediaType.TEXT_PLAIN)
-    public Response downloadGradleProperties(@FormParam("data") String data)
-            throws Exception {
-        GradleSettingModel gradleSettingModel = (GradleSettingModel) JsonUtil.mapDataToModel(data,
-                GradleSettingModel.class);
-        return runService(generalFactory.getGradleSettingSnippet(), gradleSettingModel);
-    }
-
-    @POST
-    @Path("downloadBuildMaven")
-    @Consumes("application/x-www-form-urlencoded")
-    @Produces(MediaType.APPLICATION_XML)
-    public Response downloadMavenSnippet(@FormParam("data") String data)
-            throws Exception {
-        MavenSettingModel mavenSettingModel = (MavenSettingModel) JsonUtil.mapDataToModel(data,
-                MavenSettingModel.class);
-        return runService(generalFactory.getMavenSettingSnippet(), mavenSettingModel);
-    }
-
-    @POST
-    @Path("downloadBuildIvy")
-    @Consumes("application/x-www-form-urlencoded")
-    @Produces(MediaType.APPLICATION_XML)
-    public Response generateIvySnippet(@FormParam("data") String data)
-            throws Exception {
-        IvySettingModel ivySettingModel = (IvySettingModel) JsonUtil.mapDataToModel(data,
-                IvySettingModel.class);
-        return runService(generalFactory.GetIvySettingSnippet(), ivySettingModel);
-    }
-
-    @GET
-    @Path("mavenDistributionManagement")
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response mavenDistributionManagement()
-            throws Exception {
-        return runService(generalFactory.getMavenDistributionMgnt());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/builds/BuildBintrayResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/builds/BuildBintrayResource.java
deleted file mode 100644
index 7b2ae74..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/builds/BuildBintrayResource.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package org.artifactory.ui.rest.resource.builds;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.ui.rest.model.builds.BintrayModel;
-import org.artifactory.ui.rest.service.builds.BuildsServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Path("pushToBintray")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class BuildBintrayResource extends BaseResource {
-
-    @Autowired
-    @Qualifier("streamingRestResponse")
-    public void setArtifactoryResponse(RestResponse artifactoryResponse) {
-        this.artifactoryResponse = artifactoryResponse;
-    }
-
-    @Autowired
-    BuildsServiceFactory buildsFactory;
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getBintrayRepositories()
-            throws Exception {
-        return runService(buildsFactory.getBintrayRepositories());
-    }
-
-    @GET
-    @Path("build/pkg")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getBintrayPackages()
-            throws Exception {
-        return runService(buildsFactory.getBintrayPackages());
-    }
-
-    @GET
-    @Path("build/versions")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getBintrayVersions()
-            throws Exception {
-        return runService(buildsFactory.getBintrayVersions());
-    }
-
-    @POST
-    @Path("build/{name}/{number}/{date}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response pushToBintray(BintrayModel bintrayModel)
-            throws Exception {
-        return runService(buildsFactory.pushToBintray(), bintrayModel);
-    }
-
-    @GET
-    @Path("artifact")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getBintrayArtifactData()
-            throws Exception {
-        return runService(buildsFactory.getBintrayArtifact());
-    }
-
-    @POST
-    @Path("artifact")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response pushArtifactToBintray(BintrayModel bintrayModel)
-            throws Exception {
-        return runService(buildsFactory.pushArtifactToBintray(), bintrayModel);
-    }
-
-    @POST
-    @Path("dockerTag")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response pushDockerTag(BintrayModel bintrayModel)
-            throws Exception {
-        return runService(buildsFactory.pushDockerTagToBintray(), bintrayModel);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/builds/BuildsResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/builds/BuildsResource.java
deleted file mode 100644
index e419c5e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/builds/BuildsResource.java
+++ /dev/null
@@ -1,258 +0,0 @@
-package org.artifactory.ui.rest.resource.builds;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.util.JsonUtil;
-import org.artifactory.ui.rest.model.builds.BuildGovernanceInfo;
-import org.artifactory.ui.rest.model.builds.BuildLicenseModel;
-import org.artifactory.ui.rest.model.builds.DeleteBuildsModel;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.builds.BuildsServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.FormParam;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Path("builds")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class BuildsResource extends BaseResource {
-
-    @Autowired
-    BuildsServiceFactory buildsFactory;
-
-    @Autowired
-    @Qualifier("streamingRestResponse")
-    public void setArtifactoryResponse(RestResponse artifactoryResponse) {
-        this.artifactoryResponse = artifactoryResponse;
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getAllBuilds()
-            throws Exception {
-        return runService(buildsFactory.getAllBuilds());
-    }
-
-    @GET
-    @Path("history{name:(/[^/]+?)?}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getBuildHistory()
-            throws Exception {
-        return runService(buildsFactory.getBuildHistory());
-    }
-
-    @GET
-    @Path("buildInfo/{name}/{number}{date:(/[^/]+?)?}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getBuildGeneralInfo()
-            throws Exception {
-        return runService(buildsFactory.getBuildGeneralInfo());
-    }
-
-    @GET
-    @Path("publishedModules/{name}/{number}/{date}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getPublishedModules()
-            throws Exception {
-        return runService(buildsFactory.getPublishedModules());
-    }
-
-    @GET
-    @Path("modulesArtifact/{name}/{number}/{date}/{id}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getModulesArtifact()
-            throws Exception {
-        return runService(buildsFactory.getModuleArtifacts());
-    }
-
-    @GET
-    @Path("modulesDependency/{name}/{number}/{date}/{id}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getModulesDependency()
-            throws Exception {
-        return runService(buildsFactory.getModuleDependency());
-    }
-
-    @POST
-    @Path("buildsDelete")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response deleteBuild(DeleteBuildsModel deleteBuildsModel) throws Exception {
-        return runService(buildsFactory.deleteBuild(), deleteBuildsModel);
-    }
-
-    @POST
-    @Path("deleteAllBuilds")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response deleteAllBuild(DeleteBuildsModel deleteBuildsModel)
-            throws Exception {
-        return runService(buildsFactory.deleteAllBuilds(),deleteBuildsModel);
-    }
-
-    @GET
-    @Path("buildJson/{name}/{number}/{date}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getBuildJson()
-            throws Exception {
-        return runService(buildsFactory.getBuildJson());
-    }
-
-    @GET
-    @Path("artifactDiff/{name}/{number}/{date}/{id}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response artifactDiff()
-            throws Exception {
-        return runService(buildsFactory.diffBuildModuleArtifact());
-    }
-
-    @GET
-    @Path("buildArtifactDiff/{name}/{number}/{date}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response buildArtifactDiff()
-            throws Exception {
-        return runService(buildsFactory.diffBuildArtifact());
-    }
-
-    @GET
-    @Path("buildDependencyDiff/{name}/{number}/{date}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response buildDependencyDiff()
-            throws Exception {
-
-        return runService(buildsFactory.diffBuildDependencies());
-    }
-
-    @GET
-    @Path("buildPropsDiff/{name}/{number}/{date}/")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response buildPropsDiff()
-            throws Exception {
-        return runService(buildsFactory.diffBuildProps());
-    }
-
-    @GET
-    @Path("buildProps/env/{number}/{date}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getEnvBuildProps()
-            throws Exception {
-        return runService(buildsFactory.getEnvBuildProps());
-    }
-
-
-    @GET
-    @Path("buildDiff/{name}/{number}/{date}/")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response buildDiff()
-            throws Exception {
-        return runService(buildsFactory.buildDiff());
-    }
-
-
-    @GET
-    @Path("buildProps/system/{number}/{date}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getSystemBuildProps()
-            throws Exception {
-        return runService(buildsFactory.getSystemBuildProps());
-    }
-
-
-    @GET
-    @Path("buildIssues/{name}/{number}/{date}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getBuildIssues()
-            throws Exception {
-        return runService(buildsFactory.getBuildIssues());
-    }
-
-    @GET
-    @Path("buildLicenses/{name}/{number}/{date}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getBuildLicense()
-            throws Exception {
-        return runService(buildsFactory.buildLicenses());
-    }
-
-    @POST
-    @Path("exportLicenses")
-    @Consumes("application/x-www-form-urlencoded")
-    public Response exportLicense(@FormParam("data") String data)
-            throws Exception {
-        BuildLicenseModel buildLicenseModel = (BuildLicenseModel) JsonUtil.mapDataToModel(data, BuildLicenseModel.class);
-        return runService(buildsFactory.exportLicenseToCsv(), buildLicenseModel);
-    }
-
-    @PUT
-    @Path("overrideLicenses/{name}/{number}/{date}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response overrideLicense(BuildLicenseModel buildLicenseModel)
-            throws Exception {
-        return runService(buildsFactory.overrideSelectedLicenses(), buildLicenseModel);
-    }
-
-    @GET
-    @Path("changeLicenses/{name}/{number}/{date}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getChangeLicenseValues()
-            throws Exception {
-        return runService(buildsFactory.changeBuildLicense());
-    }
-
-
-    @GET
-    @Path("releaseHistory/{name}/{number}/{date}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getBuildReleaseHistory()
-            throws Exception {
-        return runService(buildsFactory.buildReleaseHistory());
-    }
-
-
-    @GET
-    @Path("dependencyDiff/{name}/{number}/{date}/{id}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response dependencyDiff()
-            throws Exception {
-        return runService(buildsFactory.diffBuildModuleDependency());
-    }
-
-    @GET
-    @Path("prevBuild/{name}/{number}/{date}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getPrevBuild()
-            throws Exception {
-        return runService(buildsFactory.getPrevBuildList());
-    }
-
-    @GET
-    @Path("buildGovernance/{name}/{number}/{date}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getBuildGovernance()
-            throws Exception {
-        return runService(buildsFactory.getBuildGovernance());
-    }
-
-    @PUT
-    @Path("updateGovernance/{name}/{number}/{date}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response updateBuildGovernance(BuildGovernanceInfo buildGovernanceInfo)
-            throws Exception {
-        return runService(buildsFactory.updateGovernanceRequest(), buildGovernanceInfo);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/distribution/UIDistributionResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/distribution/UIDistributionResource.java
deleted file mode 100644
index d2063e5..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/distribution/UIDistributionResource.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.artifactory.ui.rest.resource.distribution;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.ui.rest.model.builds.BuildCoordinate;
-import org.artifactory.ui.rest.service.artifacts.browse.BrowseServiceFactory;
-import org.artifactory.ui.rest.service.builds.BuildsServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Dan Feldman
- */
- at Path("distribution")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UIDistributionResource extends BaseResource {
-
-    @Autowired
-    BrowseServiceFactory browseFactory;
-
-    @Autowired
-    BuildsServiceFactory buildsFactory;
-
-    @Autowired
-    @Qualifier("streamingRestResponse")
-    public void setArtifactoryResponse(RestResponse artifactoryResponse) {
-        this.artifactoryResponse = artifactoryResponse;
-    }
-
-    @POST
-    @Path("distributeArtifact")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response distributeArtifact(BaseArtifact baseArtifact) throws Exception {
-        return runService(browseFactory.distributeArtifact(), baseArtifact);
-    }
-
-    @POST
-    @Path("distributeBuild")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response distributeBuild(BuildCoordinate buildCoordinate) throws Exception {
-        return runService(buildsFactory.distributeBuild(), buildCoordinate);
-    }
-
-    @GET
-    @Path("getAvailableDistributionRepos")
-    @Produces(MediaType.APPLICATION_JSON)
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response getAvailableDistributionRepos() throws Exception {
-        return runService(browseFactory.getAvailableDistributionRepos());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/general/GeneralScreenResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/general/GeneralScreenResource.java
deleted file mode 100644
index 6c307d3..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/general/GeneralScreenResource.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.artifactory.ui.rest.resource.general;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.general.GeneralServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Path("auth/screen")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GeneralScreenResource extends BaseResource {
-
-    @Autowired
-    GeneralServiceFactory generalFactory;
-
-    @Autowired
-    @Qualifier("streamingRestResponse")
-    public void setArtifactoryResponse(RestResponse artifactoryResponse) {
-        this.artifactoryResponse = artifactoryResponse;
-    }
-
-    @GET
-    @Path("footer")
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response getFooter() {
-        return runService(generalFactory.getFooterService());
-    }
-
-    @GET
-    @Produces("image/*")
-    @Path("logo")
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
-    public Response getUploadLogo() throws Exception {
-        return runService(generalFactory.getUploadLogo());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/home/HomeResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/home/HomeResource.java
deleted file mode 100644
index 13651dc..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/home/HomeResource.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.artifactory.ui.rest.resource.home;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.general.GeneralServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen keinan
- */
-
- at Path("home")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class HomeResource extends BaseResource {
-
-
-    @Autowired
-    GeneralServiceFactory generalFactory;
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getHomeData()
-            throws Exception {
-        return runService(generalFactory.getHomePage());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/utils/cron/CronTimeResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/utils/cron/CronTimeResource.java
deleted file mode 100644
index 2ba8e90..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/utils/cron/CronTimeResource.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.artifactory.ui.rest.resource.utils.cron;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.utils.UtilsServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Path("crontime")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CronTimeResource extends BaseResource {
-    @Autowired
-    protected UtilsServiceFactory utilsFactory;
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getNextTime() throws Exception {
-        return runService(utilsFactory.getGetCronNextTimeService());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/utils/group/GroupPermissionResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/utils/group/GroupPermissionResource.java
deleted file mode 100644
index 0341e4b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/utils/group/GroupPermissionResource.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.artifactory.ui.rest.resource.utils.group;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.ui.rest.model.admin.security.group.Group;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.utils.UtilsServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Path("groupPermission")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GroupPermissionResource extends BaseResource {
-
-    @Autowired
-    protected UtilsServiceFactory utilsFactory;
-
-    @POST
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getGroup(Group group)
-            throws Exception {
-        return runService(utilsFactory.getGroupPermissions(), group);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/utils/predefinevalues/PreDefineValuesResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/utils/predefinevalues/PreDefineValuesResource.java
deleted file mode 100644
index 6b41ee6..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/utils/predefinevalues/PreDefineValuesResource.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.artifactory.ui.rest.resource.utils.predefinevalues;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.utils.UtilsServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN,AuthorizationService.ROLE_USER})
- at Component
- at Path("predefinevalues{name:(/[^/]+?)?}")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class PreDefineValuesResource extends BaseResource {
-
-    @Autowired
-    protected UtilsServiceFactory utilsFactory;
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getPreDefineValues()
-            throws Exception {
-        return runService(utilsFactory.getGetPreDefineValuesService());
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/utils/propertyset/RepoPropertySet.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/utils/propertyset/RepoPropertySet.java
deleted file mode 100644
index 958b2e4..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/utils/propertyset/RepoPropertySet.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.ui.rest.resource.utils.propertyset;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.utils.UtilsServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN,AuthorizationService.ROLE_USER})
- at Component
- at Path("repopropertyset{name:(/[^/]+?)?}")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class RepoPropertySet extends BaseResource {
-
-    @Autowired
-    protected UtilsServiceFactory utilsFactory;
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getRepoProperties()
-            throws Exception {
-        return runService(utilsFactory.getGetRepoPropertySetService());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/utils/repositories/RepositoriesDataResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/utils/repositories/RepositoriesDataResource.java
deleted file mode 100644
index 94d57d5..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/utils/repositories/RepositoriesDataResource.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.ui.rest.resource.utils.repositories;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.utils.UtilsServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Path("repodata")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class RepositoriesDataResource extends BaseResource {
-
-    @Autowired
-    protected UtilsServiceFactory utilsFactory;
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getRepoData()
-            throws Exception {
-        return runService(utilsFactory.getGetAllRepositoriesService());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/utils/validation/UiValidationsResource.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/utils/validation/UiValidationsResource.java
deleted file mode 100644
index f1f4993..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/resource/utils/validation/UiValidationsResource.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.artifactory.ui.rest.resource.utils.validation;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.ui.rest.service.utils.validation.ValidationsServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * Resource for server side validations sent from the UI forms.
- *
- * @author Yossi Shaul
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Path("validations")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UiValidationsResource extends BaseResource {
-
-    @Autowired
-    private ValidationsServiceFactory validatorsFactory;
-
-    @GET
-    @Path("dateformat")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response validateDateFormat() throws Exception {
-        return runService(validatorsFactory.getTimeFormatValidatorService());
-    }
-
-    @GET
-    @Path("name")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response validateName() throws Exception {
-        return runService(validatorsFactory.getNameValidatorService());
-    }
-
-    @GET
-    @Path("uniqueid")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response validateUniqueXmlKey() throws Exception {
-        return runService(validatorsFactory.getUniqueXmlIdValidatorService());
-    }
-
-    @GET
-    @Path("xmlname")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response validateXsdCName() throws Exception {
-        return runService(validatorsFactory.getXmlNameValidatorService());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/AdvancedServiceFactory.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/AdvancedServiceFactory.java
deleted file mode 100644
index c9fdb7a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/AdvancedServiceFactory.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package org.artifactory.ui.rest.service.admin.advanced;
-
-import org.artifactory.rest.common.service.admin.advance.GetStorageSummaryService;
-import org.artifactory.ui.rest.model.replication.GlobalReplicationConfig;
-import org.artifactory.ui.rest.service.admin.advanced.configDescriptor.GetConfigDescriptorService;
-import org.artifactory.ui.rest.service.admin.advanced.configDescriptor.UpdateConfigDescriptorService;
-import org.artifactory.ui.rest.service.admin.advanced.maintenance.*;
-import org.artifactory.ui.rest.service.admin.advanced.replication.GetGlobalReplicationsConfigService;
-import org.artifactory.ui.rest.service.admin.advanced.replication.UpdateGlobalReplicationsConfigService;
-import org.artifactory.ui.rest.service.admin.advanced.securitydescriptor.GetSecurityDescriptorService;
-import org.artifactory.ui.rest.service.admin.advanced.securitydescriptor.UpdateSecurityDescriptorService;
-import org.artifactory.ui.rest.service.admin.advanced.storage.GetBinaryProvidersInfoService;
-import org.artifactory.ui.rest.service.admin.advanced.support.*;
-import org.artifactory.ui.rest.service.admin.advanced.systeminfo.GetSystemInfoService;
-import org.artifactory.ui.rest.service.admin.advanced.systemlogs.GetSysLogDataService;
-import org.artifactory.ui.rest.service.admin.advanced.systemlogs.GetSysLogDownloadLinkService;
-import org.artifactory.ui.rest.service.admin.advanced.systemlogs.GetSysLogsInitializeService;
-import org.springframework.beans.factory.annotation.Lookup;
-
-/**
- * @author Chen Keinan
- */
-public abstract class AdvancedServiceFactory {
-
-    // storage summary service
-    @Lookup
-    public abstract GetStorageSummaryService getStorageSummaryService();
-    // system info service
-    @Lookup
-    public abstract GetSystemInfoService getSystemInfoService();
-    // config descriptor service
-    @Lookup
-    public abstract UpdateConfigDescriptorService updateConfigDescriptorService();
-
-    @Lookup
-    public abstract GetConfigDescriptorService getConfigDescriptorService();
-    // security descriptor service
-    @Lookup
-    public abstract UpdateSecurityDescriptorService updateSecurityConfigService();
-
-    @Lookup
-    public abstract GetBinaryProvidersInfoService getBinaryProvidersInfoService();
-
-    @Lookup
-    public abstract GetSecurityDescriptorService getSecurityDescriptorService();
-
-    @Lookup
-    public abstract CleanUnusedCachedService cleanUnusedCached();
-
-    @Lookup
-    public abstract CleanupVirtualRepoService cleanupVirtualRepo();
-
-    @Lookup
-    public abstract GarbageCollectionService garbageCollection();
-
-    @Lookup
-    public abstract SaveMaintenanceService saveMaintenance();
-
-    @Lookup
-    public abstract PruneUnReferenceDataService pruneUnReferenceData();
-
-    @Lookup
-    public abstract CompressInternalDataService compressInternalData();
-
-    @Lookup
-    public abstract GetMaintenanceService getMaintenance();
-
-    @Lookup
-    public abstract GetSysLogDataService getSystemLogData();
-
-    @Lookup
-    public abstract GetSysLogsInitializeService getSystemLogsInitialize();
-
-    @Lookup
-    public abstract GetSysLogDownloadLinkService getSystemLogDownloadLink();
-
-    @Lookup
-    public abstract SupportServiceGenerateBundle<BundleConfigurationWrapper> getSupportServiceGenerateBundle();
-
-    @Lookup
-    public abstract SupportServiceDownloadBundle<String> getSupportServiceDownloadBundle();
-
-    @Lookup
-    public abstract SupportServiceListBundles getSupportServiceListBundles();
-
-    @Lookup
-    public abstract SupportServiceDeleteBundle getSupportServiceDeleteBundle();
-
-    @Lookup
-    public abstract GetGlobalReplicationsConfigService getGlobalReplicationConfig();
-
-    @Lookup
-    public abstract UpdateGlobalReplicationsConfigService updateGlobalReplicationConfig();
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/configDescriptor/GetConfigDescriptorService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/configDescriptor/GetConfigDescriptorService.java
deleted file mode 100644
index be5919a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/configDescriptor/GetConfigDescriptorService.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.artifactory.ui.rest.service.admin.advanced.configDescriptor;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.artifactory.ui.rest.model.admin.advanced.configdescriptor.ConfigDescriptorModel;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetConfigDescriptorService implements RestService {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("GetConfigDescriptor");
-        // get config descriptor model
-        ConfigDescriptorModel configDescriptorModel = getConfigDescriptorModel();
-        // update response data
-        response.iModel(configDescriptorModel);
-    }
-
-    /**
-     * get config descriptor model
-     *
-     * @return config descriptor model
-     */
-    private ConfigDescriptorModel getConfigDescriptorModel() {
-        String configXml = centralConfigService.getConfigXml();
-        return new ConfigDescriptorModel(configXml);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/configDescriptor/UpdateConfigDescriptorService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/configDescriptor/UpdateConfigDescriptorService.java
deleted file mode 100644
index ca4a8d0..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/configDescriptor/UpdateConfigDescriptorService.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.artifactory.ui.rest.service.admin.advanced.configDescriptor;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.artifactory.security.AccessLogger;
-import org.artifactory.ui.rest.model.admin.advanced.configdescriptor.ConfigDescriptorModel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateConfigDescriptorService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(UpdateConfigDescriptorService.class);
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("UpdateConfigDescriptor");
-        /// save updated config descriptor
-        updateConfigXml(request, response);
-    }
-
-    /**
-     * save updated config xml and update feedback response
-     *
-     * @param artifactoryRequest  encapsulate data related to request
-     * @param artifactoryResponse - encapsulate data related to response
-     */
-    private void updateConfigXml(ArtifactoryRestRequest artifactoryRequest, RestResponse artifactoryResponse) {
-        String configXml = ((ConfigDescriptorModel) artifactoryRequest.getImodel()).getConfigXml();
-        if (StringUtils.isEmpty(configXml)) {
-            artifactoryResponse.error("Cannot save null or empty central configuration");
-        } else if (ContextHelper.get().isOffline()) {
-            artifactoryResponse.error("Cannot save config descriptor during offline state");
-        } else {
-            try {
-                centralConfigService.setConfigXml(configXml, true);
-                AccessLogger.configurationChanged();
-                artifactoryResponse.info("Central configuration successfully saved");
-            } catch (Exception e) {
-                log.error("Error while manually saving the central configuration.", e);
-                artifactoryResponse.error("Unable to save configuration, Please verify the validity of your input");
-            }
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/maintenance/CleanUnusedCachedService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/maintenance/CleanUnusedCachedService.java
deleted file mode 100644
index 7e92fca..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/maintenance/CleanUnusedCachedService.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.ui.rest.service.admin.advanced.maintenance;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.repo.cleanup.ArtifactCleanupService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CleanUnusedCachedService implements RestService {
-
-    @Autowired
-    private ArtifactCleanupService artifactCleanupService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        runCleanUpUnusedCached(response);
-    }
-
-    /**
-     * run cleanup unused cached;
-     *
-     * @param artifactoryResponse - encapsulate data related to response
-     */
-    private void runCleanUpUnusedCached(RestResponse artifactoryResponse) {
-        AolUtils.assertNotAol("CleanUnusedCached");
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-        artifactCleanupService.callManualArtifactCleanup(statusHolder);
-        if (statusHolder.isError()) {
-            artifactoryResponse.error(
-                    "Could not run the artifact cleanup: " + statusHolder.getLastError().getMessage() + ".");
-        } else {
-            artifactoryResponse.info("Artifact cleanup was successfully scheduled to run in the background.");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/maintenance/CleanupVirtualRepoService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/maintenance/CleanupVirtualRepoService.java
deleted file mode 100644
index 9b27ccd..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/maintenance/CleanupVirtualRepoService.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.artifactory.ui.rest.service.admin.advanced.maintenance;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.repo.cleanup.VirtualCacheCleanupService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CleanupVirtualRepoService implements RestService {
-
-    @Autowired
-    VirtualCacheCleanupService virtualCacheCleanupService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("CleanupVirtualRepo");
-        //  run virtual cache clean up
-        runVirtualCacheCleanUp(response);
-    }
-
-    /**
-     * run virtual cache clean up
-     *
-     * @param artifactoryResponse - encapsulate data related tto response
-     */
-    private void runVirtualCacheCleanUp(RestResponse artifactoryResponse) {
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-        virtualCacheCleanupService.callVirtualCacheCleanup(statusHolder);
-        if (statusHolder.isError()) {
-            artifactoryResponse.error(
-                    "Could not run the virtual cache cleanup: " + statusHolder.getLastError().getMessage() + ".");
-        } else {
-            artifactoryResponse.info("Virtual cache cleanup was successfully scheduled to run in the background.");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/maintenance/CompressInternalDataService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/maintenance/CompressInternalDataService.java
deleted file mode 100644
index eff26d3..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/maintenance/CompressInternalDataService.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.artifactory.ui.rest.service.admin.advanced.maintenance;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CompressInternalDataService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(CompressInternalDataService.class);
-
-
-    @Autowired
-    org.artifactory.storage.StorageService storageService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("CompressInternalData");
-        // compress internal data
-        compressInternalData(response);
-    }
-
-    /**
-     * compress internal data
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     */
-    private void compressInternalData(RestResponse artifactoryResponse) {
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-        try {
-            storageService.compress(statusHolder);
-        } catch (Exception e) {
-            statusHolder.error(e.getMessage(), log);
-        } finally {
-            if (statusHolder.isError()) {
-                artifactoryResponse.error("Failed to compress database: " + statusHolder.getLastError().getMessage());
-            } else {
-                artifactoryResponse.info("Database successfully compressed.");
-            }
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/maintenance/GarbageCollectionService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/maintenance/GarbageCollectionService.java
deleted file mode 100644
index 7f72eab..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/maintenance/GarbageCollectionService.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.artifactory.ui.rest.service.admin.advanced.maintenance;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GarbageCollectionService implements RestService {
-    @Autowired
-    org.artifactory.storage.StorageService storageService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("GarbageCollection");
-        // run now GC
-        runNowGc(response);
-    }
-
-    /**
-     * run now garbage collection
-     *
-     * @param artifactoryResponse - encapsulate data rellaateed to response
-     */
-    private void runNowGc(RestResponse artifactoryResponse) {
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-        storageService.callManualGarbageCollect(statusHolder);
-        if (statusHolder.isError()) {
-            artifactoryResponse.error(
-                    "Could not run the garbage collector: " + statusHolder.getLastError().getMessage() + ".");
-        } else {
-            artifactoryResponse.info("Garbage collector was successfully scheduled to run in the background");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/maintenance/GetMaintenanceService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/maintenance/GetMaintenanceService.java
deleted file mode 100644
index 442a742..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/maintenance/GetMaintenanceService.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.artifactory.ui.rest.service.admin.advanced.maintenance;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.artifactory.ui.rest.model.admin.advanced.maintenance.Maintenance;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetMaintenanceService implements RestService {
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("GetMaintenance");
-        MutableCentralConfigDescriptor mutableDescriptor = centralConfigService.getMutableDescriptor();
-        Maintenance maintenance = new Maintenance(mutableDescriptor);
-        response.iModel(maintenance);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/maintenance/PruneUnReferenceDataService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/maintenance/PruneUnReferenceDataService.java
deleted file mode 100644
index 221d469..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/maintenance/PruneUnReferenceDataService.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.artifactory.ui.rest.service.admin.advanced.maintenance;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class PruneUnReferenceDataService implements RestService {
-
-    @Autowired
-    org.artifactory.storage.StorageService storageService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("PruneUnReferenceData");
-        // prune Unreferenced files in data
-        pruneUnreferencedFileInData(response);
-    }
-
-    /**
-     * prune Unreferenced FileIn Data
-     *
-     * @param artifactoryResponse
-     */
-    private void pruneUnreferencedFileInData(RestResponse artifactoryResponse) {
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-        storageService.pruneUnreferencedFileInDataStore(statusHolder);
-        if (statusHolder.isError()) {
-            artifactoryResponse.error("Pruning unreferenced data completed with an error:\n" +
-                    statusHolder.getLastError().getMessage() + ".");
-        } else {
-            artifactoryResponse.info(
-                    "Pruning unreferenced data completed successfully!\n" + statusHolder.getStatusMsg());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/maintenance/SaveMaintenanceService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/maintenance/SaveMaintenanceService.java
deleted file mode 100644
index 7bc885d..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/maintenance/SaveMaintenanceService.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package org.artifactory.ui.rest.service.admin.advanced.maintenance;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.cleanup.CleanupConfigDescriptor;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.gc.GcConfigDescriptor;
-import org.artifactory.descriptor.quota.QuotaConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.artifactory.ui.rest.model.admin.advanced.maintenance.Maintenance;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class SaveMaintenanceService implements RestService {
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("SaveMaintenance");
-        Maintenance maintenance = (Maintenance) request.getImodel();
-        MutableCentralConfigDescriptor mutableDescriptor = centralConfigService.getMutableDescriptor();
-        updateGarbageCollection(maintenance, mutableDescriptor);
-        // update quota
-        updateQuotaConfig(maintenance, mutableDescriptor);
-        // update cleanup
-        updateCleanUpConfig(maintenance, mutableDescriptor);
-        // update virtual repo
-        updateVirtualRepoCleanUp(maintenance, mutableDescriptor);
-        centralConfigService.saveEditedDescriptorAndReload(mutableDescriptor);
-        response.info("Maintenance settings were successfully saved.");
-    }
-
-    /**
-     * update virtual repo clean up
-     *
-     * @param maintenance       -- maintenance model
-     * @param mutableDescriptor config descriptor
-     */
-    private void updateVirtualRepoCleanUp(Maintenance maintenance, MutableCentralConfigDescriptor mutableDescriptor) {
-        CleanupConfigDescriptor virtualCacheCleanupConfig = mutableDescriptor.getVirtualCacheCleanupConfig();
-        if (virtualCacheCleanupConfig == null) {
-            virtualCacheCleanupConfig = new CleanupConfigDescriptor();
-        }
-        virtualCacheCleanupConfig.setCronExp(maintenance.getCleanVirtualRepoCron());
-        mutableDescriptor.setVirtualCacheCleanupConfig(virtualCacheCleanupConfig);
-    }
-
-    /**
-     * update clean up config
-     *
-     * @param maintenance       - maintenance model
-     * @param mutableDescriptor - config descriptor
-     */
-    private void updateCleanUpConfig(Maintenance maintenance, MutableCentralConfigDescriptor mutableDescriptor) {
-        CleanupConfigDescriptor cleanupConfig = mutableDescriptor.getCleanupConfig();
-        if (cleanupConfig == null) {
-            cleanupConfig = new CleanupConfigDescriptor();
-        }
-        cleanupConfig.setCronExp(maintenance.getCleanUnusedCachedCron());
-        mutableDescriptor.setCleanupConfig(cleanupConfig);
-    }
-
-    /**
-     * update quota config data
-     *
-     * @param maintenance       - maintenance model
-     * @param mutableDescriptor - config descriptor
-     */
-    private void updateQuotaConfig(Maintenance maintenance, MutableCentralConfigDescriptor mutableDescriptor) {
-        QuotaConfigDescriptor quotaConfig = mutableDescriptor.getQuotaConfig();
-        if (quotaConfig == null) {
-            quotaConfig = new QuotaConfigDescriptor();
-        }
-        quotaConfig.setEnabled(maintenance.isQuotaControl());
-        quotaConfig.setDiskSpaceLimitPercentage(maintenance.getStorageLimit());
-        quotaConfig.setDiskSpaceWarningPercentage(maintenance.getStorageWarning());
-        mutableDescriptor.setQuotaConfig(quotaConfig);
-    }
-
-    /**
-     * update garbage collection config
-     *
-     * @param maintenance       -- maintenance model
-     * @param mutableDescriptor - config descriptor
-     */
-    private void updateGarbageCollection(Maintenance maintenance, MutableCentralConfigDescriptor mutableDescriptor) {
-        GcConfigDescriptor gcConfig = mutableDescriptor.getGcConfig();
-        if (gcConfig == null) {
-            gcConfig = new GcConfigDescriptor();
-        }
-        gcConfig.setCronExp(maintenance.getGarbageCollectorCron());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/replication/GetGlobalReplicationsConfigService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/replication/GetGlobalReplicationsConfigService.java
deleted file mode 100644
index 79b2a89..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/replication/GetGlobalReplicationsConfigService.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.artifactory.ui.rest.service.admin.advanced.replication;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.replication.GlobalReplicationConfig;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author gidis
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetGlobalReplicationsConfigService implements RestService<GlobalReplicationConfig> {
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<GlobalReplicationConfig> request, RestResponse response) {
-        GlobalReplicationConfig model = new GlobalReplicationConfig();
-        CentralConfigDescriptor descriptor = centralConfigService.getDescriptor();
-        model.setBlockPullReplications(descriptor.getReplicationsConfig().isBlockPullReplications());
-        model.setBlockPushReplications(descriptor.getReplicationsConfig().isBlockPushReplications());
-        response.iModel(model);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/replication/UpdateGlobalReplicationsConfigService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/replication/UpdateGlobalReplicationsConfigService.java
deleted file mode 100644
index 88157ea..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/replication/UpdateGlobalReplicationsConfigService.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.artifactory.ui.rest.service.admin.advanced.replication;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.replication.GlobalReplicationsConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.replication.GlobalReplicationConfig;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author gidis
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateGlobalReplicationsConfigService implements RestService<GlobalReplicationConfig> {
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<GlobalReplicationConfig> request, RestResponse response) {
-        GlobalReplicationConfig model = request.getImodel();
-        MutableCentralConfigDescriptor toSave = centralConfigService.getMutableDescriptor();
-        GlobalReplicationsConfigDescriptor configDescriptor = new GlobalReplicationsConfigDescriptor();
-        configDescriptor.setBlockPullReplications(model.isBlockPullReplications());
-        configDescriptor.setBlockPushReplications(model.isBlockPushReplications());
-        toSave.setGlobalReplicationConfig(configDescriptor);
-        centralConfigService.saveEditedDescriptorAndReload(toSave);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/securitydescriptor/GetSecurityDescriptorService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/securitydescriptor/GetSecurityDescriptorService.java
deleted file mode 100644
index 465f750..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/securitydescriptor/GetSecurityDescriptorService.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.artifactory.ui.rest.service.admin.advanced.securitydescriptor;
-
-import com.thoughtworks.xstream.XStream;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.artifactory.security.SecurityInfo;
-import org.artifactory.ui.rest.model.admin.advanced.securitydescriptor.SecurityDescriptorModel;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetSecurityDescriptorService implements RestService {
-
-    @Autowired
-    private SecurityService securityService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("GetSecurityDescriptor");
-        // get security descriptor model
-        SecurityDescriptorModel securityDescriptorModel = getSecurityDescriptorModel();
-        // update response data
-        response.iModel(securityDescriptorModel);
-    }
-
-    /**
-     * get security descriptor model from security descriptor info
-     *
-     * @return security descriptor model
-     */
-    private SecurityDescriptorModel getSecurityDescriptorModel() {
-        SecurityInfo securityData = securityService.getSecurityData();
-        XStream xstream = InfoFactoryHolder.get().getSecurityXStream();
-        return new SecurityDescriptorModel(xstream.toXML(securityData));
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/securitydescriptor/UpdateSecurityDescriptorService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/securitydescriptor/UpdateSecurityDescriptorService.java
deleted file mode 100644
index e356803..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/securitydescriptor/UpdateSecurityDescriptorService.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.artifactory.ui.rest.service.admin.advanced.securitydescriptor;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.artifactory.ui.rest.model.admin.advanced.securitydescriptor.SecurityDescriptorModel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateSecurityDescriptorService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(UpdateSecurityDescriptorService.class);
-
-    @Autowired
-    private SecurityService securityService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("UpdateSecurityDescriptor");
-        //update security xml
-        updateSecurityXml(request, response);
-    }
-
-    /**
-     * save updated security xml and update response feedback
-     *
-     * @param artifactoryRequest  - encapsulate data related to request
-     * @param artifactoryResponse - encapsulate data require for response
-     */
-    private void updateSecurityXml(ArtifactoryRestRequest artifactoryRequest, RestResponse artifactoryResponse) {
-        String securityXML = ((SecurityDescriptorModel) artifactoryRequest.getImodel()).getSecurityXML();
-        if (StringUtils.isEmpty(securityXML)) {
-            artifactoryResponse.error("Cannot save null or empty security configuration.");
-        } else {
-            try {
-                securityService.importSecurityData(securityXML);
-                artifactoryResponse.info("Security configuration successfully saved.");
-            } catch (Exception e) {
-                log.error("Error while manually saving the security configuration.", e);
-                artifactoryResponse.error("Unable to save configuration, Please verify the validity of your input");
-            }
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/storage/GetBinaryProvidersInfoService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/storage/GetBinaryProvidersInfoService.java
deleted file mode 100644
index 8e63d65..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/storage/GetBinaryProvidersInfoService.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.artifactory.ui.rest.service.admin.advanced.storage;
-
-import org.artifactory.api.jackson.JacksonFactory;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.storage.StorageService;
-import org.jfrog.storage.binstore.ifc.model.BinaryTreeElement;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.Map;
-
-/**
- * @author Gidi Shabat
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetBinaryProvidersInfoService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(GetBinaryProvidersInfoService.class);
-
-    @Autowired
-    private StorageService storageService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        BinaryTreeElement<Map<String, String>> binaryProviderInfo = storageService.getBinaryProviderInfo();
-        // Serialize the result to Json
-        ObjectMapper objectMapper = JacksonFactory.createObjectMapper();
-        String info = null;
-        try {
-            info = objectMapper.writeValueAsString(binaryProviderInfo);
-        } catch (IOException e) {
-            String message = "Failed to serialize the binary provider info to JSON";
-            log.error(message, e);
-            response.error(message);
-        }
-        //noinspection unchecked
-        response.iModel(info);
-    }
-
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/support/BundleConfigurationWrapper.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/support/BundleConfigurationWrapper.java
deleted file mode 100644
index 0d74f63..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/support/BundleConfigurationWrapper.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.ui.rest.service.admin.advanced.support;
-
-import org.artifactory.support.config.bundle.BundleConfiguration;
-
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * A container for {@link BundleConfiguration} and
- * {@link HttpServletRequest}
- *
- * @author Michael Pasternak
- */
-public class BundleConfigurationWrapper {
-    private final BundleConfiguration bundleConfiguration;
-    private final HttpServletRequest httpServletRequest;
-
-    public BundleConfigurationWrapper(BundleConfiguration bundleConfiguration,
-            HttpServletRequest httpServletRequest) {
-        this.bundleConfiguration = bundleConfiguration;
-        this.httpServletRequest = httpServletRequest;
-    }
-
-    public BundleConfiguration getBundleConfiguration() {
-        return bundleConfiguration;
-    }
-
-    public HttpServletRequest getHttpServletRequest() {
-        return httpServletRequest;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/support/SupportServiceDeleteBundle.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/support/SupportServiceDeleteBundle.java
deleted file mode 100644
index c9de76a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/support/SupportServiceDeleteBundle.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.artifactory.ui.rest.service.admin.advanced.support;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.support.SupportAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-
-/**
- * @author Michael Pasternak
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class SupportServiceDeleteBundle<String> implements RestService<String> {
-
-    @Override
-    public void execute(ArtifactoryRestRequest<String> request, RestResponse response) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        SupportAddon supportAddon = addonsManager.addonByType(SupportAddon.class);
-
-        if (supportAddon.isSupportAddonEnabled()) {
-            String bundle = request.getImodel();
-            try {
-                // we use sync delete to return callback to UI
-                // once operation is completed
-                supportAddon.delete(bundle.toString(), false);
-            } catch (FileNotFoundException e) {
-                response.error("Support bundle \"" + bundle + "\" does not exist");
-                return;
-            }
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/support/SupportServiceDownloadBundle.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/support/SupportServiceDownloadBundle.java
deleted file mode 100644
index 2f98682..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/support/SupportServiceDownloadBundle.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.ui.rest.service.admin.advanced.support;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.support.SupportAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-
-/**
- * @author Michael Pasternak
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class SupportServiceDownloadBundle<String> implements RestService<String> {
-
-    @Override
-    public void execute(ArtifactoryRestRequest<String> request, RestResponse response) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        SupportAddon supportAddon = addonsManager.addonByType(SupportAddon.class);
-
-        if (supportAddon.isSupportAddonEnabled()) {
-            String bundle = request.getImodel();
-
-            InputStream is = null;
-            try {
-                is = supportAddon.download(bundle.toString());
-                if (is != null) {
-                    response.iModel(is);
-                } else {
-                    response.error("No content could be found, see log for more details");
-                }
-            } catch (FileNotFoundException e) {
-                response.error("Support bundle \"" + bundle + "\" does not exist");
-                return;
-            }
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/support/SupportServiceGenerateBundle.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/support/SupportServiceGenerateBundle.java
deleted file mode 100644
index d3b07c9..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/support/SupportServiceGenerateBundle.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package org.artifactory.ui.rest.service.admin.advanced.support;
-
-import com.google.common.collect.Lists;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.support.SupportAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.support.config.bundle.BundleConfiguration;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.core.Context;
-import java.io.File;
-import java.util.List;
-
-/**
- * @author Michael Pasternak
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class SupportServiceGenerateBundle<T extends BundleConfigurationWrapper> implements RestService<T> {
-
-    private static final String UI_SUPPORT_DOWNLOAD_BUNDLE = "/ui/userSupport/downloadBundle/";
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        SupportAddon supportAddon = addonsManager.addonByType(SupportAddon.class);
-
-        if (supportAddon.isSupportAddonEnabled()) {
-            BundleConfigurationWrapper bundleConfigurationContainer = request.getImodel();
-            List<String> resources = supportAddon.generate(
-                    bundleConfigurationContainer.getBundleConfiguration()
-            );
-
-            if (resources != null) {
-                response.iModel(
-                        wrapResponse(
-                                resources,
-                                bundleConfigurationContainer.getHttpServletRequest()
-                        )
-                );
-            } else {
-                response.error("No content was collected, see log for more details");
-            }
-        }
-    }
-
-    /**
-     * Wraps generated bundles to relative links
-     *
-     * @param bundles bundle names
-     *
-     * @param httpServletRequest
-     * @return list of relative paths to download bundle/s
-     */
-    private List<String> wrapResponse(List<String> bundles, HttpServletRequest httpServletRequest) {
-        if (bundles.size() > 0) {
-            List<String> links = Lists.newArrayList();
-            for(String item : bundles) {
-                links.add(httpServletRequest.getContextPath() + UI_SUPPORT_DOWNLOAD_BUNDLE + item);
-            }
-            return links;
-        }
-        return bundles;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/support/SupportServiceListBundles.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/support/SupportServiceListBundles.java
deleted file mode 100644
index 87ab735..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/support/SupportServiceListBundles.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.ui.rest.service.admin.advanced.support;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.support.SupportAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Michael Pasternak
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class SupportServiceListBundles implements RestService {
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        SupportAddon supportAddon = addonsManager.addonByType(SupportAddon.class);
-
-        if(supportAddon.isSupportAddonEnabled())
-        {
-            response.iModel(supportAddon.list());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/systeminfo/GetSystemInfoService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/systeminfo/GetSystemInfoService.java
deleted file mode 100644
index fe7cf8c..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/systeminfo/GetSystemInfoService.java
+++ /dev/null
@@ -1,175 +0,0 @@
-package org.artifactory.ui.rest.service.admin.advanced.systeminfo;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.plugin.PluginsAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.common.ha.HaNodeProperties;
-import org.artifactory.info.InfoWriter;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.artifactory.storage.StorageProperties;
-import org.artifactory.ui.rest.model.admin.advanced.systeminfo.SystemInfo;
-import org.artifactory.util.Strings;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.lang.management.*;
-import java.util.*;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetSystemInfoService implements RestService {
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("GetSystemInfo");
-        SystemInfo systemInfo = new SystemInfo();
-        // collect system info
-        collectSystemInfo(systemInfo.getSystemInfo());
-        // update response with system info
-        response.iModel(systemInfo);
-    }
-
-    /**
-     * Return a formatted string of the system info to display
-     *
-     * @return
-     */
-    private void collectSystemInfo(Map<String, Map<String, String>> systemInfo) {
-        Map<String, String> storageInfo = new LinkedHashMap<>();
-        // update storage info
-        updateStorageInfo(systemInfo, storageInfo);
-        // update system properties
-        updateSystemProperties(systemInfo);
-        // update jvm info
-        updateJvmInfo(systemInfo);
-        // update vm args
-        updateVmArgs(systemInfo);
-        // update plugins status
-        updatePluginsInfo(systemInfo);
-    }
-
-    /**
-     * update system info with  vm args
-     *
-     * @param systemInfo - storage info map
-     */
-    private void updateVmArgs(Map<String, Map<String, String>> systemInfo) {
-        Map<String, String> vmArgs = new LinkedHashMap<>();
-        RuntimeMXBean RuntimemxBean = ManagementFactory.getRuntimeMXBean();
-        StringBuilder vmArgumentBuilder = new StringBuilder();
-        List<String> vmArguments = RuntimemxBean.getInputArguments();
-        if (vmArguments != null) {
-            for (String vmArgument : vmArguments) {
-                if (InfoWriter.shouldMaskValue(vmArgument)) {
-                    vmArgument = Strings.maskKeyValue(vmArgument);
-                }
-                vmArgumentBuilder.append(vmArgument);
-                if (vmArguments.indexOf(vmArgument) != (vmArguments.size() - 1)) {
-                    vmArgumentBuilder.append("\n");
-                }
-            }
-        }
-        vmArgs.put("Args", vmArgumentBuilder.toString());
-        systemInfo.put("JVM Arguments", vmArgs);
-    }
-
-    /**
-     * update system info with jvm info
-     *
-     * @param systemInfo - storage info map
-     */
-    private void updateJvmInfo(Map<String, Map<String, String>> systemInfo) {
-        Map<String, String> generalJvmInfo = new LinkedHashMap<>();
-        OperatingSystemMXBean systemBean = ManagementFactory.getOperatingSystemMXBean();
-        generalJvmInfo.put("Available Processors", Integer.toString(systemBean.getAvailableProcessors()));
-        MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
-        MemoryUsage heapMemoryUsage = memoryBean.getHeapMemoryUsage();
-        generalJvmInfo.put("Heap Memory Usage-Committed", Long.toString(heapMemoryUsage.getCommitted()));
-        generalJvmInfo.put("Heap Memory Usage-Init", Long.toString(heapMemoryUsage.getInit()));
-        generalJvmInfo.put("Heap Memory Usage-Max", Long.toString(heapMemoryUsage.getMax()));
-        generalJvmInfo.put("Heap Memory Usage-Used", Long.toString(heapMemoryUsage.getUsed()));
-        MemoryUsage nonHeapMemoryUsage = memoryBean.getNonHeapMemoryUsage();
-        generalJvmInfo.put("Non-Heap Memory Usage-Committed", Long.toString(nonHeapMemoryUsage.getCommitted()));
-        generalJvmInfo.put("Non-Heap Memory Usage-Init", Long.toString(nonHeapMemoryUsage.getInit()));
-        generalJvmInfo.put("Non-Heap Memory Usage-Max", Long.toString(nonHeapMemoryUsage.getMax()));
-        generalJvmInfo.put("Non-Heap Memory Usage-Used", Long.toString(nonHeapMemoryUsage.getUsed()));
-        systemInfo.put("General JVM Info", generalJvmInfo);
-    }
-
-    /**
-     * update system properties info
-     *
-     * @param systemInfo
-     */
-    private void updateSystemProperties(Map<String, Map<String, String>> systemInfo) {
-        Map<String, String> systemProperties = new LinkedHashMap<>();
-        Properties properties = System.getProperties();
-        properties.setProperty(ConstantValues.artifactoryVersion.getPropertyName(),
-                ConstantValues.artifactoryVersion.getString());
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        systemProperties.put("artifactory.running.mode", addonsManager.getArtifactoryRunningMode().name());
-        systemProperties.put("artifactory.running.state", ContextHelper.get().isOffline() ? "Offline" : "Online");
-        addFromProperties(properties, systemProperties);
-        addHaProperties(systemProperties);
-        systemInfo.put("System Properties", systemProperties);
-    }
-
-    /**
-     * update system info with storage info
-     *
-     * @param systemInfo  - system info
-     * @param storageInfo - storage info
-     */
-    private void updateStorageInfo(Map<String, Map<String, String>> systemInfo, Map<String, String> storageInfo) {
-        StorageProperties storageProperties = ContextHelper.get().beanForType(StorageProperties.class);
-        storageInfo.put("Database Type", storageProperties.getDbType().toString());
-        storageInfo.put("Storage Type", storageProperties.getBinariesStorageType().toString());
-        storageInfo.put("Connection Url", storageProperties.getConnectionUrl());
-        systemInfo.put("Storage Info", storageInfo);
-    }
-
-    private void updatePluginsInfo(Map<String, Map<String, String>> systemInfo) {
-        Map<String, String> pluginsStatus = ContextHelper.get().beanForType(AddonsManager.class)
-                .addonByType(PluginsAddon.class).getPluginsStatus();
-        if(!pluginsStatus.isEmpty()) {
-            systemInfo.put("User Plugins Status", pluginsStatus);
-        }
-    }
-
-    /**
-     * add properties to system info
-     *
-     * @param properties       = system properties
-     * @param systemProperties - system info map
-     */
-    private void addFromProperties(Properties properties, Map<String, String> systemProperties) {
-        TreeSet sortedSystemPropKeys = new TreeSet<>(properties.keySet());
-        for (Object key : sortedSystemPropKeys) {
-            systemProperties.put(String.valueOf(key), String.valueOf(properties.get(key)));
-        }
-    }
-
-    /**
-     * update ha properties to system info
-     *
-     * @param systemProperties - system info map
-     */
-    private void addHaProperties(Map<String, String> systemProperties) {
-        ArtifactoryHome artifactoryHome = ContextHelper.get().getArtifactoryHome();
-        if (artifactoryHome.isHaConfigured()) {
-            HaNodeProperties haNodeProperties = artifactoryHome.getHaNodeProperties();
-            if (haNodeProperties != null) {
-                addFromProperties(haNodeProperties.getProperties(), systemProperties);
-            }
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/systemlogs/GetSysLogDataService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/systemlogs/GetSysLogDataService.java
deleted file mode 100644
index 55b8c2f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/systemlogs/GetSysLogDataService.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package org.artifactory.ui.rest.service.admin.advanced.systemlogs;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.advanced.systemlogs.SystemLogData;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.File;
-import java.io.RandomAccessFile;
-import java.util.Date;
-
-/**
- * @author Lior Hasson
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetSysLogDataService implements RestService {
-    private static final int FIRST_READ_BLOCK_SIZE = 100 * 1024;
-    private File logDir = ContextHelper.get().getArtifactoryHome().getLogDir();
-    /**
-     * Pointer to indicate the last position (in bytes) the log file was read from and showed in the page
-     */
-    private long lastPointer = 0;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        SystemLogData sys = new SystemLogData();
-        String selectedLog = request.getQueryParamByKey("id");
-        // Check log file exists. Protect against LFI security RTFACT-8215
-        File[] logFiles = logDir.listFiles();
-        File systemLogFile = null;
-        for (File logFile : logFiles) {
-            if (logFile.getName().equalsIgnoreCase(selectedLog)) {
-                systemLogFile = logFile;
-                break;
-            }
-        }
-        if (systemLogFile == null) {
-            response.responseCode(HttpStatus.SC_NOT_FOUND).error("Log named " + selectedLog + " not found!");
-            return;
-        }
-        readLogFile(request, systemLogFile, sys);
-        setLogInfo(systemLogFile, sys);
-
-        response.iModel(sys);
-    }
-
-    private void readLogFile(ArtifactoryRestRequest artifactoryRequest, File systemLogFile, SystemLogData sys) {
-        StringBuilder sb = new StringBuilder();
-        if (StringUtils.isNotBlank(artifactoryRequest.getQueryParamByKey("fileSize"))) {
-            lastPointer = Long.parseLong(artifactoryRequest.getQueryParamByKey("fileSize"));
-        }
-
-        long fileSize = systemLogFile.length();
-
-        //The file didn't changed, return zero to the client
-        if (!systemLogFile.exists() || fileSize == lastPointer) {
-            sys.setLogContent(StringUtils.EMPTY);
-            lastPointer = 0;
-            return;
-        }
-
-        try (RandomAccessFile logRandomAccessFile = new RandomAccessFile(systemLogFile, "r")) {
-            String line;
-            //If the log file is larger than 100K
-            if (logRandomAccessFile.length() > FIRST_READ_BLOCK_SIZE) {
-                //Point to the beginning of the last 100K
-                lastPointer = logRandomAccessFile.length() - FIRST_READ_BLOCK_SIZE;
-            } else {
-                lastPointer = 0;
-            }
-
-            logRandomAccessFile.seek(lastPointer);
-            while ((line = logRandomAccessFile.readLine()) != null) {
-                sb.append(line).append(System.lineSeparator());
-            }
-            lastPointer = logRandomAccessFile.getFilePointer();
-
-        } catch (Exception e) {
-            throw new RuntimeException(e.getMessage());
-        }
-
-        sys.setLogContent(sb.toString());
-    }
-
-    private void setLogInfo(File systemLogFile, SystemLogData sys) {
-        Date logLastModified = new Date(systemLogFile.lastModified());
-        Date viewLastUpdate = new Date(System.currentTimeMillis());
-        sys.setLastUpdateLabel(viewLastUpdate);
-        sys.setLastUpdateModified(logLastModified);
-        sys.setFileSize(lastPointer);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/systemlogs/GetSysLogDownloadLinkService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/systemlogs/GetSysLogDownloadLinkService.java
deleted file mode 100644
index a3cc179..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/systemlogs/GetSysLogDownloadLinkService.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.artifactory.ui.rest.service.admin.advanced.systemlogs;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.service.StreamRestResponse;
-import org.artifactory.ui.rest.model.admin.advanced.systemlogs.SystemLogFile;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-
-/**
- * @author Lior Hasson
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetSysLogDownloadLinkService implements RestService {
-    private File logDir = ContextHelper.get().getArtifactoryHome().getLogDir();
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        updateResponseWithLogFile(request, response);
-    }
-
-    /**
-     * update response with the log data file
-     *
-     * @param artifactoryRequest  - encapsulate data related to the request
-     * @param artifactoryResponse - encapsulate data related to the response
-     */
-    private void updateResponseWithLogFile(ArtifactoryRestRequest artifactoryRequest,
-            RestResponse artifactoryResponse) {
-        String selectedLog = artifactoryRequest.getQueryParamByKey("id");
-        if (StringUtils.isEmpty(selectedLog)) {
-            artifactoryResponse.error("Log file name (id) cannot be empty");
-            return;
-        }
-
-        if (selectedLog.contains("..")) {
-            artifactoryResponse.error("Log file name (id) cannot contain relative paths");
-            return;
-        }
-
-        File systemLogFile = new File(logDir, selectedLog);
-        if (!systemLogFile.exists()) {
-            artifactoryResponse.error("Log file name (id) not found: " + selectedLog);
-            return;
-        }
-
-        ((StreamRestResponse) artifactoryResponse).setDownloadFile(systemLogFile.getName());
-        ((StreamRestResponse) artifactoryResponse).setDownload(true);
-        SystemLogFile logFileModel = new SystemLogFile();
-
-        try {
-            FileInputStream stream = new FileInputStream(systemLogFile);
-            logFileModel.setStream(stream);
-            artifactoryResponse.iModel(logFileModel);
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/systemlogs/GetSysLogsInitializeService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/systemlogs/GetSysLogsInitializeService.java
deleted file mode 100644
index 56a7a8e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/advanced/systemlogs/GetSysLogsInitializeService.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.artifactory.ui.rest.service.admin.advanced.systemlogs;
-
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.advanced.systemlogs.SystemLogsInitialize;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Lior Hasson
- */
-
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetSysLogsInitializeService implements RestService {
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        // update response with system log comboBox
-        response.iModel(new SystemLogsInitialize());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/ConfigServiceFactory.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/ConfigServiceFactory.java
deleted file mode 100644
index 7ca6254..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/ConfigServiceFactory.java
+++ /dev/null
@@ -1,261 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration;
-
-import org.artifactory.rest.common.service.admin.reverseProxies.CheckReverseProxyPortAvailabilityService;
-import org.artifactory.rest.common.service.admin.reverseProxies.CreateReverseProxyService;
-import org.artifactory.rest.common.service.admin.reverseProxies.GetReverseProxiesService;
-import org.artifactory.rest.common.service.admin.reverseProxies.UpdateReverseProxyService;
-import org.artifactory.ui.rest.model.admin.configuration.repository.local.LocalRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.RemoteRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.virtual.VirtualRepositoryConfigModel;
-import org.artifactory.ui.rest.service.admin.configuration.bintray.GetBintrayUIService;
-import org.artifactory.ui.rest.service.admin.configuration.bintray.TestBintrayUIService;
-import org.artifactory.ui.rest.service.admin.configuration.bintray.UpdateBintrayUIService;
-import org.artifactory.ui.rest.service.admin.configuration.blackduck.GetBlackDuckService;
-import org.artifactory.ui.rest.service.admin.configuration.blackduck.TestBlackDuckService;
-import org.artifactory.ui.rest.service.admin.configuration.blackduck.UpdateBlackDuckService;
-import org.artifactory.ui.rest.service.admin.configuration.general.*;
-import org.artifactory.ui.rest.service.admin.configuration.ha.GetHighAvailabilityMembersService;
-import org.artifactory.ui.rest.service.admin.configuration.ha.RemoveServerService;
-import org.artifactory.ui.rest.service.admin.configuration.layouts.*;
-import org.artifactory.ui.rest.service.admin.configuration.licenses.*;
-import org.artifactory.ui.rest.service.admin.configuration.mail.GetMailService;
-import org.artifactory.ui.rest.service.admin.configuration.mail.TestMailService;
-import org.artifactory.ui.rest.service.admin.configuration.mail.UpdateMailService;
-import org.artifactory.ui.rest.service.admin.configuration.propertysets.*;
-import org.artifactory.ui.rest.service.admin.configuration.proxies.CreateProxyService;
-import org.artifactory.ui.rest.service.admin.configuration.proxies.DeleteProxyService;
-import org.artifactory.ui.rest.service.admin.configuration.proxies.GetProxiesService;
-import org.artifactory.ui.rest.service.admin.configuration.proxies.UpdateProxyService;
-import org.artifactory.ui.rest.service.admin.configuration.registerpro.GetLicenseKeyService;
-import org.artifactory.ui.rest.service.admin.configuration.registerpro.UpdateLicenseKeyService;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.CreateRepositoryConfigService;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.DeleteRepositoryConfigService;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.GetRepositoryConfigService;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.UpdateRepositoryConfigService;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.distribution.SaveBintrayOauthConfigService;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.replication.*;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.*;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.validator.ValidateRepoNameService;
-import org.springframework.beans.factory.annotation.Lookup;
-
-/**
- * @author Chen Keinan
- */
-public abstract class ConfigServiceFactory {
-
-
-    // mail services
-    @Lookup
-    public abstract UpdateMailService updateMailService();
-
-    @Lookup
-    public abstract GetMailService getMailService();
-
-    @Lookup
-    public abstract TestMailService testMailService();
-
-    //register pro service
-    @Lookup
-    public abstract GetLicenseKeyService getLicenseKeyService();
-
-    @Lookup
-    public abstract UpdateLicenseKeyService updateLicenseKeyService();
-
-    // proxies services
-    @Lookup
-    public abstract CreateProxyService createProxiesService();
-
-    @Lookup
-    public abstract UpdateProxyService updateProxiesService();
-
-    @Lookup
-    public abstract GetProxiesService getProxiesService();
-
-    @Lookup
-    public abstract DeleteProxyService deleteProxiesService();
-
-    // reverse proxies services
-    @Lookup
-    public abstract CreateReverseProxyService createReverseProxy();
-
-    @Lookup
-    public abstract UpdateReverseProxyService updateReverseProxy();
-
-    @Lookup
-    public abstract GetReverseProxiesService getReverseProxies();
-
-    // licenses services
-    @Lookup
-    public abstract ExportLicenseFileService exportLicenseFileService();
-
-    @Lookup
-    public abstract CreateArtifactLicenseService createArtifactLicenseService();
-
-    @Lookup
-    public abstract UpdateArtifactLicenseService updateArtifactLicenseService();
-
-    @Lookup
-    public abstract GetArtifactLicenseService getArtifactLicenseService();
-
-    @Lookup
-    public abstract DeleteArtifactLicenseService deleteArtifactLicenseService();
-
-    // black duck services
-    @Lookup
-    public abstract UpdateBlackDuckService updateBlackDuckService();
-
-    @Lookup
-    public abstract GetBlackDuckService getBlackDuckService();
-
-    @Lookup
-    public abstract TestBlackDuckService testBlackDuckService();
-
-    // bintray services
-    @Lookup
-    public abstract UpdateBintrayUIService updateBintrayService();
-
-    @Lookup
-    public abstract GetBintrayUIService getBintrayService();
-
-    @Lookup
-    public abstract TestBintrayUIService testBintrayService();
-
-    @Lookup
-    public abstract GetGeneralConfigService getGeneralConfig();
-
-    @Lookup
-    public abstract GetGeneralConfigDataService getGeneralConfigData();
-
-    @Lookup
-    public abstract UpdateGeneralConfigService updateGeneralConfig();
-
-    @Lookup
-    public abstract UploadLogoService uploadLogo();
-
-    @Lookup
-    public abstract GetUploadLogoService getUploadLogo();
-
-    @Lookup
-    public abstract DeleteUploadedLogoService deleteUploadedLogo();
-
-    @Lookup
-    public abstract CreatePropertySetService createPropertySet();
-
-    @Lookup
-    public abstract GetConfigPropertySetNamesService getPropertySetNames();
-
-    @Lookup
-    public abstract GetConfigPropertySetService getPropertySet();
-
-    @Lookup
-    public abstract UpdatePropertySetService updatePropertySet();
-
-    @Lookup
-    public abstract DeletePropertySetService deletePropertySet();
-
-    // configuration repository service
-    @Lookup
-    public abstract CreateRepositoryConfigService createRepositoryConfig();
-
-    @Lookup
-    public abstract GetRepositoryConfigService getRepositoryConfig();
-
-    @Lookup
-    public abstract UpdateRepositoryConfigService updateRepositoryConfig();
-
-    @Lookup
-    public abstract DeleteRepositoryConfigService deleteRepositoryConfig();
-
-    @Lookup
-    public abstract GetRepositoryInfoService getRepositoriesInfo();
-
-    @Lookup
-    public abstract RemoteRepositoryTestUrl<RemoteRepositoryConfigModel> remoteRepositoryTestUrl();
-
-    @Lookup
-    public abstract SmartRepoCapabilitiesDiscoveringService<RemoteRepositoryConfigModel> discoverSmartRepoCapabilities();
-
-    @Lookup
-    public abstract GetAvailableRepositoryFields getAvailableRepositoryFieldChoices();
-
-    @Lookup
-    public abstract GetDefaultRepositoryValues getDefaultRepositoryValues();
-
-    @Lookup
-    public abstract GetRemoteRepoUrlMappingService getRemoteReposUrlMapping();
-
-    @Lookup
-    public abstract ValidateRepoNameService validateRepoName();
-
-    @Lookup
-    public abstract ExecuteRemoteReplicationService executeImmediateReplication();
-
-    @Lookup
-    public abstract TestLocalReplicationService testLocalReplication();
-
-    @Lookup
-    public abstract ValidateLocalReplicationService validateLocalReplication();
-
-    @Lookup
-    public abstract TestRemoteReplicationService testRemoteReplication();
-
-    @Lookup
-    public abstract GetLayoutsService getLayoutsService();
-
-    @Lookup
-    public abstract GetLayoutInfoService getLayoutInfoService();
-
-    @Lookup
-    public abstract UpdateLayoutService updateLayoutService();
-
-    @Lookup
-    public abstract CreateLayoutService createLayoutService();
-
-    @Lookup
-    public abstract DeleteLayoutService deleteLayoutService();
-
-    @Lookup
-    public abstract TestArtPathService testArtPathService();
-
-    @Lookup
-    public abstract ResolveRegexService resolveRegexService();
-
-    @Lookup(value = "allAvailableRepositories")
-    public abstract GetAvailableRepositories getAvailableRepositories();
-
-    @Lookup
-    public abstract GetIndexerAvailableRepositories getIndexerAvailableRepositories();
-
-    @Lookup
-    public abstract GetResolvedRepositories<VirtualRepositoryConfigModel> getResolvedRepositories();
-
-    @Lookup
-    public abstract ExecuteAllLocalReplicationsService executeAllLocalReplications();
-
-    @Lookup
-    public abstract ExecuteLocalReplicationService<LocalRepositoryConfigModel> executeLocalReplication();
-
-    @Lookup
-    public abstract ReorderRepositoriesService reorderRepositories();
-
-    @Lookup
-    public abstract IsJcenterConfiguredService isJcenterConfigured();
-
-    @Lookup
-    public abstract GetDockerRepoService getDockerRepo();
-
-    @Lookup
-    public abstract CreateDefaultJcenterRepoService createDefaultJcenterRepo();
-
-    @Lookup
-    public abstract GetHighAvailabilityMembersService getHighAvailabilityMembers();
-
-    @Lookup
-    public abstract RemoveServerService removeServer();
-
-    @Lookup
-    public abstract CheckReverseProxyPortAvailabilityService checkReverseProxyPortAvailability();
-
-    @Lookup
-    public abstract SaveBintrayOauthConfigService saveBintrayOauthConfig();
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/bintray/GetBintrayUIService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/bintray/GetBintrayUIService.java
deleted file mode 100644
index 9355088..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/bintray/GetBintrayUIService.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.bintray;
-
-import org.artifactory.api.bintray.BintrayService;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.bintray.BintrayConfigDescriptor;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.common.ConfigModelPopulator;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetBintrayUIService implements RestService {
-    @Autowired
-    private CentralConfigService centralConfigService;
-    @Autowired
-    BintrayService bintrayService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        MutableCentralConfigDescriptor mutableDescriptor = centralConfigService.getMutableDescriptor();
-        BintrayConfigDescriptor bintrayConfigDescriptor = mutableDescriptor.getBintrayConfig();
-        String bintrayRegistrationUrl = bintrayService.getBintrayRegistrationUrl();
-        response.iModel(ConfigModelPopulator.populateBintrayInfo(bintrayConfigDescriptor, bintrayRegistrationUrl));
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/bintray/TestBintrayUIService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/bintray/TestBintrayUIService.java
deleted file mode 100644
index 07108eb..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/bintray/TestBintrayUIService.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.bintray;
-
-import org.artifactory.api.bintray.BintrayService;
-import org.artifactory.api.bintray.BintrayUser;
-import org.artifactory.api.bintray.exception.BintrayException;
-import org.artifactory.descriptor.bintray.BintrayConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletRequest;
-import java.io.IOException;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class TestBintrayUIService implements RestService {
-
-    @Autowired
-    private BintrayService bintrayService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        BintrayConfigDescriptor bintrayConfigDescriptor = (BintrayConfigDescriptor) request.getImodel();
-        Map<String, String> headersMap = getHeadersMap(request);
-        // test connection to bintray
-        testConnectionToBintray(response, bintrayConfigDescriptor, headersMap);
-    }
-
-    /**
-     * test connection to bintray and update feedback msg
-     *
-     * @param artifactoryResponse     - encapsulate data require for response
-     * @param bintrayConfigDescriptor - bintray config descriptor
-     * @param headersMap              - header Map
-     */
-    private void testConnectionToBintray(RestResponse artifactoryResponse, BintrayConfigDescriptor bintrayConfigDescriptor,
-                                         Map<String, String> headersMap) {
-        BintrayUser bintrayUser;
-        try {
-            String apiKey = CryptoHelper.decryptIfNeeded(bintrayConfigDescriptor.getApiKey());
-            bintrayUser = bintrayService.getBintrayUser(bintrayConfigDescriptor.getUserName(),
-                    apiKey, headersMap);
-            artifactoryResponse.info("Successfully authenticated '" + bintrayUser.getFullName() + "'");
-        } catch (IOException | BintrayException e) {
-            artifactoryResponse.error("Authentication failed");
-        } catch (IllegalArgumentException e) {
-            artifactoryResponse.error(e.getMessage());
-        }
-    }
-
-    /**
-     * get request header map
-     *
-     * @param artifactoryRequest - encapsulate data related to request
-     * @return - map of http request header
-     */
-    public static Map<String, String> getHeadersMap(ArtifactoryRestRequest artifactoryRequest) {
-        Map<String, String> map = new HashMap<>();
-        HttpServletRequest request = artifactoryRequest.getServletRequest();
-        if (request != null) {
-            Enumeration headerNames = request.getHeaderNames();
-            while (headerNames.hasMoreElements()) {
-                String headerName = (String) headerNames.nextElement();
-                map.put(headerName.toUpperCase(), request.getHeader(headerName));
-            }
-        }
-        return map;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/bintray/UpdateBintrayUIService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/bintray/UpdateBintrayUIService.java
deleted file mode 100644
index e886895..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/bintray/UpdateBintrayUIService.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.bintray;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.bintray.BintrayConfigDescriptor;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateBintrayUIService implements RestService {
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        // update bintray setting
-        updateBintraySetting(request);
-        //send feedback msg
-        response.info("Successfully updated Bintray settings");
-    }
-
-    /**
-     * update bintray setting to config descriptor
-     *
-     * @param artifactoryRequest - encapsulate data related to request
-     */
-    private void updateBintraySetting(ArtifactoryRestRequest artifactoryRequest) {
-        MutableCentralConfigDescriptor cc = centralConfigService.getMutableDescriptor();
-        BintrayConfigDescriptor bintrayConfigDescriptor = (BintrayConfigDescriptor) artifactoryRequest.getImodel();
-        cc.setBintrayConfig(bintrayConfigDescriptor);
-        centralConfigService.saveEditedDescriptorAndReload(cc);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/blackduck/GetBlackDuckService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/blackduck/GetBlackDuckService.java
deleted file mode 100644
index a780fb3..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/blackduck/GetBlackDuckService.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.blackduck;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.external.BlackDuckSettingsDescriptor;
-import org.artifactory.descriptor.external.ExternalProvidersDescriptor;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.common.ConfigModelPopulator;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetBlackDuckService implements RestService {
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        RestModel blackDuck = getBlackDuckModel();
-        response.iModel(blackDuck);
-    }
-
-    /**
-     * get black duck descriptor and populate it data to black duck model
-     *
-     * @return black duck or empty model
-     */
-    private RestModel getBlackDuckModel() {
-        CentralConfigDescriptor centralConfig = centralConfigService.getDescriptor();
-        ExternalProvidersDescriptor external = centralConfig.getExternalProvidersDescriptor();
-        BlackDuckSettingsDescriptor blackDuckDescriptor = null;
-        if (external != null) {
-            blackDuckDescriptor = external.getBlackDuckSettingsDescriptor();
-        }
-
-        if (blackDuckDescriptor == null) {
-            blackDuckDescriptor = new BlackDuckSettingsDescriptor();
-            // set default values
-            blackDuckDescriptor.setConnectionTimeoutMillis(20000l);
-            if (centralConfigService.defaultProxyDefined()) {
-                ProxyDescriptor defaultProxy = centralConfigService.getDescriptor().getDefaultProxy();
-                blackDuckDescriptor.setProxy(defaultProxy);
-            }
-        }
-        return ConfigModelPopulator.populateBlackDuckInfo(blackDuckDescriptor);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/blackduck/TestBlackDuckService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/blackduck/TestBlackDuckService.java
deleted file mode 100644
index 689f833..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/blackduck/TestBlackDuckService.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.blackduck;
-
-import java.io.IOException;
-import java.net.UnknownHostException;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.blackduck.BlackDuckAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.descriptor.external.BlackDuckSettingsDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.util.ExceptionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class TestBlackDuckService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(TestBlackDuckService.class);
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-
-        BlackDuckSettingsDescriptor blackDuckSettingsDescriptor = (BlackDuckSettingsDescriptor) request.getImodel();
-        // get black duck addon
-        BlackDuckAddon blackDuckAddon = ContextHelper.get().beanForType(AddonsManager.class).addonByType(
-                BlackDuckAddon.class);
-        // test connection to black duck
-        testBlackDuckConnection(response, blackDuckSettingsDescriptor, blackDuckAddon);
-    }
-
-    /**
-     * Test connection to black duck
-     *
-     * @param artifactoryResponse         - encapsulate data related to response
-     * @param blackDuckSettingsDescriptor - black duck descriptor
-     * @param blackDuckAddon              - black duck add on
-     */
-    private void testBlackDuckConnection(RestResponse artifactoryResponse,
-            BlackDuckSettingsDescriptor blackDuckSettingsDescriptor, BlackDuckAddon blackDuckAddon) {
-        try {
-            blackDuckAddon.testConnection(blackDuckSettingsDescriptor);
-            artifactoryResponse.info("Target is a valid Code Center instance.");
-        } catch (Exception e) {
-            log.error("Error testing connection to black duck URI: {}",
-                    blackDuckSettingsDescriptor.getServerUri(), e);
-            artifactoryResponse.error("Couldn't connect to code center: " + getErrorMessage(e));
-        }
-    }
-
-    private String getErrorMessage(Exception e) {
-        String message = e.getMessage(); // default message
-        Throwable ioException = ExceptionUtils.getCauseOfTypes(e, IOException.class);
-        if (ioException != null) {
-            if (ioException instanceof UnknownHostException) {
-                message = "Unknown host - " + ioException.getMessage();
-            } else {
-                message = ioException.getMessage();
-            }
-        }
-        if (StringUtils.isBlank(message)) {
-            message = ioException.getClass().toString();
-        }
-        return message;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/blackduck/UpdateBlackDuckService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/blackduck/UpdateBlackDuckService.java
deleted file mode 100644
index e6d2207..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/blackduck/UpdateBlackDuckService.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.blackduck;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.external.BlackDuckSettingsDescriptor;
-import org.artifactory.descriptor.external.ExternalProvidersDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateBlackDuckService implements RestService {
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        // update black suck setting
-        updateBlackDuckSetting(request);
-        // update response feedback
-        response.info("Successfully updated Black Duck settings");
-    }
-
-    /**
-     * update central config with and external provider with black duck setting
-     *
-     * @param artifactoryRequest
-     */
-    private void updateBlackDuckSetting(ArtifactoryRestRequest artifactoryRequest) {
-        MutableCentralConfigDescriptor centralConfig = centralConfigService.getMutableDescriptor();
-        BlackDuckSettingsDescriptor blackDuckSettingsDescriptor = (BlackDuckSettingsDescriptor) artifactoryRequest.getImodel();
-        if (blackDuckSettingsDescriptor != null) {
-            setExternalProviderWithBlackDuckSetting(blackDuckSettingsDescriptor, centralConfig);
-            centralConfigService.saveEditedDescriptorAndReload(centralConfig);
-        }
-    }
-
-    /**
-     * set external provider with black duck setting
-     *
-     * @param blackDuckSettingsDescriptor - black duck setting descriptor
-     */
-    private void setExternalProviderWithBlackDuckSetting(BlackDuckSettingsDescriptor blackDuckSettingsDescriptor,
-            MutableCentralConfigDescriptor centralConfig) {
-        ExternalProvidersDescriptor external = centralConfig.getExternalProvidersDescriptor();
-        if (external == null) {
-            external = new ExternalProvidersDescriptor();
-        }
-        external.setBlackDuckSettingsDescriptor(blackDuckSettingsDescriptor);
-        centralConfig.setExternalProvidersDescriptor(external);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/general/DeleteUploadedLogoService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/general/DeleteUploadedLogoService.java
deleted file mode 100644
index 632c6b8..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/general/DeleteUploadedLogoService.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.general;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-
-/**
- * @author chen keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DeleteUploadedLogoService implements RestService {
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        try {
-            String logoDir = ContextHelper.get().getArtifactoryHome().getLogoDir().getAbsolutePath();
-            File file = new File(logoDir, "logo");
-            Files.deleteIfExists(file.toPath());
-        } catch (IOException e) {
-            response.error("error with deleting logo");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/general/GetGeneralConfigDataService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/general/GetGeneralConfigDataService.java
deleted file mode 100644
index 2489123..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/general/GetGeneralConfigDataService.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.general;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.generalconfig.GeneralConfig;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetGeneralConfigDataService implements RestService {
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        CentralConfigDescriptor descriptor = centralConfigService.getDescriptor();
-        // update general config data
-        GeneralConfig generalconfig = new GeneralConfig();
-        generalconfig.setServerName(descriptor.getServerName());
-        generalconfig.setLogoUrl(descriptor.getLogo());
-        response.iModel(generalconfig);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/general/GetGeneralConfigService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/general/GetGeneralConfigService.java
deleted file mode 100644
index a8485ad..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/general/GetGeneralConfigService.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.general;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.repo.RepoBaseDescriptor;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.descriptor.security.sshserver.SshServerSettings;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.generalconfig.GeneralConfig;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.stream.Stream;
-
-import static java.util.stream.Stream.concat;
-
-/**
- * @author Chenk
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetGeneralConfigService implements RestService<GeneralConfig> {
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<GeneralConfig> request, RestResponse response) {
-        MutableCentralConfigDescriptor mutableDescriptor = centralConfigService.getMutableDescriptor();
-        // update general config
-        GeneralConfig generalconfig = new GeneralConfig(mutableDescriptor);
-        generalconfig.setForceBaseUrl(isForceBaseUrl(mutableDescriptor));
-        response.iModel(generalconfig);
-    }
-
-    private boolean isForceBaseUrl(MutableCentralConfigDescriptor mutableDescriptor) {
-        Stream<? extends RepoBaseDescriptor> local = mutableDescriptor.getLocalRepositoriesMap().values().stream();
-        Stream<? extends RepoBaseDescriptor> remote = mutableDescriptor.getRemoteRepositoriesMap().values().stream();
-        Stream<? extends RepoBaseDescriptor> virtual = mutableDescriptor.getVirtualRepositoriesMap().values().stream();
-        Stream<RepoBaseDescriptor> concat = concat(local, concat(remote, virtual));
-        SshServerSettings sshServerSettings = mutableDescriptor.getSecurity().getSshServerSettings();
-        boolean activeSshServer = sshServerSettings != null && sshServerSettings.isEnableSshServer();
-        boolean cocoaPodsRepoExist = concat.anyMatch(descriptor -> RepoType.CocoaPods.equals(descriptor.getType()));
-        return cocoaPodsRepoExist || activeSshServer;
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/general/GetUploadLogoService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/general/GetUploadLogoService.java
deleted file mode 100644
index b8a0f49..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/general/GetUploadLogoService.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.general;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.service.StreamRestResponse;
-import org.artifactory.ui.rest.model.admin.configuration.generalconfig.LogoFileUpload;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.File;
-
-/**
- * @author Chen keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetUploadLogoService implements RestService {
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String logoDir = ContextHelper.get().getArtifactoryHome().getLogoDir().getAbsolutePath();
-        // update response with logo file
-        updateResponseWithLogoFile("logo", logoDir, response);
-    }
-
-    /**
-     * update response with logo file
-     * @param  name - save logo file list
-     * @param logoDir - logo dir
-     */
-    private void updateResponseWithLogoFile(String name, String logoDir, RestResponse response) {
-        File sourceFile = new File(logoDir,name);
-        boolean fileExist = sourceFile.canRead();
-        if (fileExist) {
-            LogoFileUpload fileResponse = new LogoFileUpload();
-            fileResponse.setFile(sourceFile);
-            ((StreamRestResponse) response).setFile(sourceFile);
-            response.iModel(fileResponse);
-        } else {
-            response.error("no user logo found");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/general/UpdateGeneralConfigService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/general/UpdateGeneralConfigService.java
deleted file mode 100644
index 8fd4a4b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/general/UpdateGeneralConfigService.java
+++ /dev/null
@@ -1,128 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.general;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.bintray.BintrayConfigDescriptor;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.download.FolderDownloadConfigDescriptor;
-import org.artifactory.descriptor.message.SystemMessageDescriptor;
-import org.artifactory.descriptor.replication.GlobalReplicationsConfigDescriptor;
-import org.artifactory.descriptor.trashcan.TrashcanConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.generalconfig.GeneralConfig;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.Optional;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateGeneralConfigService implements RestService {
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        GeneralConfig generalConfig = (GeneralConfig) request.getImodel();
-        // update general setting and set config descriptor
-        updateDescriptorAndSave(generalConfig);
-        response.info("Successfully updated settings");
-    }
-
-    /**
-     * update config descriptor with general config setting and save
-     *
-     * @param generalConfig - general setting sent from client
-     */
-    private void updateDescriptorAndSave(GeneralConfig generalConfig) {
-        MutableCentralConfigDescriptor mutableDescriptor = centralConfigService.getMutableDescriptor();
-        mutableDescriptor.setServerName(generalConfig.getServerName());
-        mutableDescriptor.setDateFormat(generalConfig.getDateFormat());
-        mutableDescriptor.setUrlBase(generalConfig.getCustomUrlBase());
-        mutableDescriptor.setFileUploadMaxSizeMb(generalConfig.getFileUploadMaxSize());
-        mutableDescriptor.setOfflineMode(generalConfig.isGlobalOfflineMode());
-        mutableDescriptor.getAddons().setShowAddonsInfo(generalConfig.isShowAddonSettings());
-        mutableDescriptor.setLogo(generalConfig.getLogoUrl());
-        mutableDescriptor.setHelpLinksEnabled(generalConfig.isHelpLinksEnabled());
-        // update bintray config descriptor
-        updateBintrayDescriptor(generalConfig, mutableDescriptor);
-        //System message config
-        updateSystemMessageConfig(generalConfig, mutableDescriptor);
-        //Folder download config
-        updateFolderDownloadConfig(generalConfig, mutableDescriptor);
-        //Trashcan config
-        updateTrashcanConfig(generalConfig, mutableDescriptor);
-        //Update global replication config
-        updateGlobalReplicationConfig(generalConfig,mutableDescriptor);
-        centralConfigService.saveEditedDescriptorAndReload(mutableDescriptor);
-    }
-
-    private void updateBintrayDescriptor(GeneralConfig generalConfig,
-            MutableCentralConfigDescriptor mutableDescriptor) {
-        BintrayConfigDescriptor bintrayMutableDescriptor = Optional.ofNullable(mutableDescriptor.getBintrayConfig())
-                .orElse(new BintrayConfigDescriptor());
-        bintrayMutableDescriptor.setFileUploadLimit(generalConfig.getBintrayFilesUploadLimit());
-        mutableDescriptor.setBintrayConfig(bintrayMutableDescriptor);
-    }
-
-    //Does not override defaults if UI sent empty model.
-    private void updateSystemMessageConfig(GeneralConfig generalConfig, MutableCentralConfigDescriptor descriptor) {
-        SystemMessageDescriptor systemMessageDescriptor =
-                Optional.ofNullable(descriptor.getSystemMessageConfig()).orElse(new SystemMessageDescriptor());
-        systemMessageDescriptor.setEnabled(Optional.ofNullable(
-                generalConfig.isSystemMessageEnabled()).orElse(systemMessageDescriptor.isEnabled()));
-        systemMessageDescriptor.setTitle(Optional.ofNullable(
-                generalConfig.getSystemMessageTitle()).orElse(systemMessageDescriptor.getTitle()));
-        systemMessageDescriptor.setTitleColor(Optional.ofNullable(
-                generalConfig.getSystemMessageTitleColor()).orElse(systemMessageDescriptor.getTitleColor()));
-        systemMessageDescriptor.setMessage(Optional.ofNullable(
-                generalConfig.getSystemMessage()).orElse(systemMessageDescriptor.getMessage()));
-        systemMessageDescriptor.setShowOnAllPages(Optional.ofNullable(
-                generalConfig.isShowSystemMessageOnAllPages()).orElse(systemMessageDescriptor.isShowOnAllPages()));
-        descriptor.setSystemMessageConfig(systemMessageDescriptor);
-    }
-
-    //Does not override defaults if UI sent empty model.
-    private void updateFolderDownloadConfig(GeneralConfig generalConfig, MutableCentralConfigDescriptor descriptor) {
-        FolderDownloadConfigDescriptor folderDownloadConfig = descriptor.getFolderDownloadConfig();
-        folderDownloadConfig.setEnabled(
-                Optional.ofNullable(generalConfig.isFolderDownloadEnabled()).orElse(folderDownloadConfig.isEnabled()));
-        folderDownloadConfig.setMaxConcurrentRequests(Optional.ofNullable(
-                generalConfig.getFolderDownloadMaxConcurrentRequests())
-                .orElse(folderDownloadConfig.getMaxConcurrentRequests()));
-        folderDownloadConfig.setMaxDownloadSizeMb(Optional.ofNullable(
-                generalConfig.getFolderDownloadMaxSizeMb()).orElse(folderDownloadConfig.getMaxDownloadSizeMb()));
-        folderDownloadConfig.setMaxFiles(Optional.ofNullable(
-                generalConfig.getMaxFolderDownloadFilesLimit()).orElse(folderDownloadConfig.getMaxFiles()));
-        descriptor.setFolderDownloadConfig(folderDownloadConfig);
-    }
-
-    //Does not override defaults if UI sent empty model.
-    private void updateTrashcanConfig(GeneralConfig generalConfig, MutableCentralConfigDescriptor descriptor) {
-        TrashcanConfigDescriptor trashcanConfig = descriptor.getTrashcanConfig();
-        trashcanConfig.setEnabled(Optional.ofNullable(
-                generalConfig.getTrashcanEnabled()).orElse(trashcanConfig.isEnabled()));
-        trashcanConfig.setAllowPermDeletes(Optional.ofNullable(
-                generalConfig.getAllowPermDeletes()).orElse(trashcanConfig.isAllowPermDeletes()));
-        trashcanConfig.setRetentionPeriodDays(Optional.ofNullable(
-                generalConfig.getTrashcanRetentionPeriodDays()).orElse(trashcanConfig.getRetentionPeriodDays()));
-        descriptor.setTrashcanConfig(trashcanConfig);
-    }
-
-    //Does not override defaults if UI sent empty model.
-    private void updateGlobalReplicationConfig(GeneralConfig generalConfig, MutableCentralConfigDescriptor descriptor) {
-        GlobalReplicationsConfigDescriptor replicationsConfig = descriptor.getReplicationsConfig();
-        replicationsConfig.setBlockPullReplications(Optional.ofNullable(
-                generalConfig.getBlockPullReplications()).orElse(replicationsConfig.isBlockPullReplications()));
-        replicationsConfig.setBlockPushReplications(Optional.ofNullable(
-                generalConfig.getBlockPushReplications()).orElse(replicationsConfig.isBlockPushReplications()));
-
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/general/UploadLogoService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/general/UploadLogoService.java
deleted file mode 100644
index e35406d..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/general/UploadLogoService.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.general;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.utils.FileUpload;
-import org.artifactory.ui.utils.MultiPartUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.imageio.ImageIO;
-import javax.imageio.ImageReader;
-import javax.imageio.stream.ImageInputStream;
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.StandardCopyOption;
-import java.util.Iterator;
-import java.util.UUID;
-
-/**
- * @author Chen keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UploadLogoService implements RestService {
-
-    private static final Logger log = LoggerFactory.getLogger(UploadLogoService.class);
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        try {
-            File tempWorkingDir = ContextHelper.get().getArtifactoryHome().getTempWorkDir();
-            String tempFileName = UUID.randomUUID().toString();
-            // save file to logo folder
-            saveFileToTempLocation(request, tempWorkingDir, tempFileName);
-            File tempLogoFile = new File(tempWorkingDir, tempFileName);
-            boolean fakeImage = isImageFake(tempLogoFile);
-            if (fakeImage) {
-                tempLogoFile.delete();
-                response.error("Invalid file type");
-                return;
-            } else {
-                String logoDir = ContextHelper.get().getArtifactoryHome().getLogoDir().getAbsolutePath();
-                File finalLogoFile = new File(logoDir, "logo");
-                java.nio.file.Files.move(tempLogoFile.toPath(), finalLogoFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
-                response.info("Logo Uploaded Successfully");
-            }
-        } catch (Exception e) {
-            log.error("The cause for uploading file failure is: " + e.getMessage(), e);
-            response.error("error uploading file to server");
-        }
-    }
-
-    /**
-     * save logo to logo folder
-     *
-     * @param artifactoryRequest - encapsulate data related to request
-     */
-    private void saveFileToTempLocation(ArtifactoryRestRequest artifactoryRequest, File tempWorkingDir, String tempFileName) {
-        FileUpload fileUpload = (FileUpload) artifactoryRequest.getImodel();
-        MultiPartUtils.saveSpecificFile(centralConfigService, fileUpload.getFormDataMultiPart(), tempWorkingDir.getAbsolutePath(),
-                tempFileName);
-    }
-
-    /**
-     * check if the image has fake format , its not a real image
-     * this check done to eliminate security issue
-     */
-    private boolean isImageFake(File file) throws Exception {
-        boolean isFakeImage = false;
-        ImageInputStream imageInputStream = null;
-        try {
-            Path path = Paths.get(file.getCanonicalPath());
-            byte[] data = Files.readAllBytes(path);
-            imageInputStream = ImageIO.createImageInputStream(new ByteArrayInputStream(data));
-            Iterator<ImageReader> iter = ImageIO.getImageReaders(imageInputStream);
-            if (!iter.hasNext()) {
-                isFakeImage = true;
-            }
-        } finally {
-            if (imageInputStream != null) {
-                try {
-                    imageInputStream.close();
-                } catch (IOException e) {
-                    throw new IOException(e);
-                }
-            }
-        }
-        return isFakeImage;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/ha/GetHighAvailabilityMembersService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/ha/GetHighAvailabilityMembersService.java
deleted file mode 100644
index 6e10676..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/ha/GetHighAvailabilityMembersService.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.ha;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.artifactory.storage.db.servers.model.ArtifactoryServer;
-import org.artifactory.ui.rest.model.admin.configuration.ha.HaModel;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetHighAvailabilityMembersService implements RestService {
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("GetHighAvailabilityMembers");
-            List<HaModel> artifactoryServers = getArtifactoryServers();
-                response.iModelList(artifactoryServers);
-    }
-
-    /**
-     * return artifactory server list if has HA license and configure
-     * @return - list of artifactory servers
-     */
-    private List<HaModel> getArtifactoryServers() {
-        List<HaModel> haModels = new ArrayList<>();
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        HaCommonAddon haCommonAddon = addonsManager.addonByType(HaCommonAddon.class);
-        List<ArtifactoryServer> allArtifactoryServers = haCommonAddon.getAllArtifactoryServers();
-        if (allArtifactoryServers != null && !allArtifactoryServers.isEmpty()) {
-            allArtifactoryServers.forEach(server -> {
-                boolean hasHeartbeat = haCommonAddon.artifactoryServerHasHeartbeat(server);
-                haModels.add(new HaModel(server, !hasHeartbeat));
-            });
-        }
-        return haModels;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/ha/RemoveServerService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/ha/RemoveServerService.java
deleted file mode 100644
index 0368dbe..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/ha/RemoveServerService.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.ha;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class RemoveServerService implements RestService {
-
-    private static final Logger log = LoggerFactory.getLogger(RemoveServerService.class);
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("RemoveServer");
-        String serverID = request.getPathParamByKey("id");
-        // remove server and update response
-        removeServer(serverID, response);
-    }
-
-    /**
-     * remove server from cluster if not responding
-     *
-     * @param id - server id
-     */
-    private void removeServer(String id, RestResponse response) {
-
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        HaCommonAddon haAddon = addonsManager.addonByType(HaCommonAddon.class);
-
-        try {
-            boolean success = haAddon.deleteArtifactoryServer(id);
-            if (success) {
-                response.info(String.format("Successfully removed '%s'.", id));
-            } else {
-                response.warn(String.format("Unable to remove '%s'", id));
-            }
-        } catch (Exception e) {
-            String errorMessage = String.format("Exception occurred while removing '%s'", id);
-            response.error(errorMessage);
-            log.error(errorMessage, e);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/CreateLayoutService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/CreateLayoutService.java
deleted file mode 100644
index 1adb5e9..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/CreateLayoutService.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.layouts;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.service.admin.configuration.layouts.validation.LayoutFieldRequiredTokenValidator;
-import org.artifactory.ui.rest.service.admin.configuration.layouts.validation.ReservedLayoutNameValidator;
-import org.artifactory.exception.ValidationException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Lior Hasson
- */
- at Component
-public class CreateLayoutService implements RestService<RepoLayout> {
-    private static final Logger log = LoggerFactory.getLogger(CreateLayoutService.class);
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<RepoLayout> request, RestResponse response) {
-        RepoLayout repoLayout = request.getImodel();
-        try {
-            validation(repoLayout);
-
-            MutableCentralConfigDescriptor mutableDescriptor = getMutableDescriptor();
-            mutableDescriptor.addRepoLayout(repoLayout);
-            centralConfigService.saveEditedDescriptorAndReload(mutableDescriptor);
-
-            String message = "Successfully created layout '" + repoLayout.getName() + "'";
-            response.info(message);
-        } catch (ValidationException e) {
-            response.error(e.getMessage());
-            log.debug(e.getMessage());
-        }
-    }
-
-    /**
-     * @see LayoutFieldRequiredTokenValidator
-     * @see ReservedLayoutNameValidator
-     */
-    private void validation(RepoLayout repoLayout) throws ValidationException {
-            ReservedLayoutNameValidator.onValidate(repoLayout.getName());
-            LayoutFieldRequiredTokenValidator.onValidate(repoLayout.getArtifactPathPattern());
-            LayoutFieldRequiredTokenValidator.onValidate(repoLayout.getDescriptorPathPattern());
-    }
-
-    private MutableCentralConfigDescriptor getMutableDescriptor() {
-        return centralConfigService.getMutableDescriptor();
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/DeleteLayoutService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/DeleteLayoutService.java
deleted file mode 100644
index 0640207..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/DeleteLayoutService.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.layouts;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Lior Hasson
- */
- at Component
-public class DeleteLayoutService implements RestService {
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String layoutKey = request.getPathParamByKey("layoutKey");
-        MutableCentralConfigDescriptor mutableDescriptor = getMutableDescriptor();
-        mutableDescriptor.removeRepoLayout(layoutKey);
-        centralConfigService.saveEditedDescriptorAndReload(mutableDescriptor);
-
-        String message = "Layout '" + layoutKey + "' successfully deleted";
-        response.info(message).responseCode(HttpStatus.SC_OK);
-    }
-
-    private MutableCentralConfigDescriptor getMutableDescriptor() {
-        return centralConfigService.getMutableDescriptor();
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/GetLayoutInfoService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/GetLayoutInfoService.java
deleted file mode 100644
index c8e7156..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/GetLayoutInfoService.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.layouts;
-
-import com.google.common.collect.Lists;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.layouts.RepositoryAssociationsModel;
-import org.artifactory.ui.rest.model.admin.configuration.layouts.RepositoryLayoutModel;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
-/**
- * @author Lior Hasson
- */
- at Component
-public class GetLayoutInfoService implements RestService<RepositoryLayoutModel> {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Autowired
-    private RepositoryService repositoryService;
-
-    private List<RepoDescriptor> descriptors;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<RepositoryLayoutModel> artifactoryRequest,
-                        RestResponse artifactoryResponse) {
-        List<RepoLayout> repoLayouts = getMutableDescriptor().getRepoLayouts();
-
-        RepositoryLayoutModel layoutModel = getRepositoryLayoutModel(artifactoryRequest, repoLayouts);
-        createAssociations(layoutModel);
-
-        artifactoryResponse.iModel(layoutModel);
-    }
-
-    private RepositoryLayoutModel getRepositoryLayoutModel(ArtifactoryRestRequest<RepositoryLayoutModel> artifactoryRequest,
-                                                           List<RepoLayout> repoLayouts) {
-        String layoutKey = artifactoryRequest.getPathParamByKey("layoutKey");
-        Optional<RepositoryLayoutModel> layoutModel = repoLayouts.stream()
-                .filter(repoLayout -> repoLayout.getName().equals(layoutKey))
-                .map(RepositoryLayoutModel::new)
-                .findFirst();
-
-        return layoutModel.get();
-    }
-
-
-    private void createAssociations(RepositoryLayoutModel layoutModel){
-        descriptors = getAllDescriptors();
-            RepositoryAssociationsModel ra = new RepositoryAssociationsModel();
-
-            ra.setLocalRepositories(filterLocalRepos(filterDescriptorsWithLayout(layoutModel)));
-            ra.setRemoteRepositories(filterRemoteRepos(filterDescriptorsWithLayout(layoutModel)));
-            ra.setVirtualRepositories(filterVirtualRepos(filterDescriptorsWithLayout(layoutModel)));
-
-        layoutModel.setRepositoryAssociations(ra);
-    }
-
-    private List<String> filterLocalRepos(List<RepoDescriptor> layoutDescriptors) {
-        return layoutDescriptors.stream()
-                .filter(desc -> desc instanceof LocalRepoDescriptor)
-                .sorted((o1, o2) -> o1.getKey().compareTo(o2.getKey()))
-                .map(RepoDescriptor::getKey)
-                .collect(Collectors.toList());
-    }
-
-    private List<String> filterRemoteRepos(List<RepoDescriptor> layoutDescriptors) {
-        return layoutDescriptors.stream()
-                .filter(desc -> desc instanceof RemoteRepoDescriptor)
-                .sorted((o1, o2) -> o1.getKey().compareTo(o2.getKey()))
-                .map(RepoDescriptor::getKey)
-                .collect(Collectors.toList());
-    }
-
-    private List<String> filterVirtualRepos(List<RepoDescriptor> layoutDescriptors) {
-        return layoutDescriptors.stream()
-                .filter(desc -> !desc.isReal())
-                .sorted((o1, o2) -> o1.getKey().compareTo(o2.getKey()))
-                .map(RepoDescriptor::getKey)
-                .collect(Collectors.toList());
-    }
-
-    private List<RepoDescriptor> filterDescriptorsWithLayout(final RepoLayout layout) {
-        return descriptors.stream()
-                .filter(desc -> (desc.getRepoLayout() != null && desc.getRepoLayout().equals(layout)))
-                .collect(Collectors.toList());
-    }
-
-    private List<RepoDescriptor> getAllDescriptors() {
-        descriptors = Lists.newArrayList();
-        descriptors.addAll(repositoryService.getLocalRepoDescriptors());
-        descriptors.addAll(repositoryService.getRemoteRepoDescriptors());
-        descriptors.addAll(repositoryService.getVirtualRepoDescriptors());
-        return descriptors;
-    }
-
-    private MutableCentralConfigDescriptor getMutableDescriptor() {
-        return centralConfigService.getMutableDescriptor();
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/GetLayoutsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/GetLayoutsService.java
deleted file mode 100644
index da378d3..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/GetLayoutsService.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.layouts;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.layouts.LayoutActionsModel;
-import org.artifactory.ui.rest.model.admin.configuration.layouts.LayoutGridModel;
-import org.artifactory.util.RepoLayoutUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author Lior Hasson
- */
- at Component
-public class GetLayoutsService implements RestService<LayoutGridModel> {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<LayoutGridModel> artifactoryRequest,
-                        RestResponse artifactoryResponse) {
-        List<RepoLayout> repoLayouts = getMutableDescriptor().getRepoLayouts();
-        List<LayoutGridModel> layoutModels = repoLayouts.stream()
-                                                        .map(LayoutGridModel::new)
-                                                        .collect(Collectors.toList());
-
-        addActions(layoutModels);
-
-        artifactoryResponse.iModelList(layoutModels);
-    }
-
-    private void addActions(List<LayoutGridModel> layoutModels) {
-        layoutModels.forEach(layoutGridModel -> {
-            LayoutActionsModel actions = new LayoutActionsModel();
-            boolean licenseInstalled = addonsManager.isLicenseInstalled();
-            boolean reservedName = RepoLayoutUtils.isReservedName(layoutGridModel.getName());
-            actions.setDelete(!reservedName);
-            actions.setEdit(licenseInstalled && !reservedName);
-            actions.setCopy(licenseInstalled);
-            layoutGridModel.setLayoutActions(actions);
-        });
-    }
-
-    private MutableCentralConfigDescriptor getMutableDescriptor() {
-        return centralConfigService.getMutableDescriptor();
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/ResolveRegexService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/ResolveRegexService.java
deleted file mode 100644
index 0941837..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/ResolveRegexService.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.layouts;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.layouts.RegExResolverModel;
-import org.artifactory.util.ExceptionUtils;
-import org.artifactory.util.RepoLayoutUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Lior Hasson
- */
- at Component
-public class ResolveRegexService implements RestService<RepoLayout> {
-    private static final Logger log = LoggerFactory.getLogger(ResolveRegexService.class);
-
-    @Override
-    public void execute(ArtifactoryRestRequest<RepoLayout> request, RestResponse response) {
-        RepoLayout layout = request.getImodel();
-
-        try {
-            String artifactRegEx = RepoLayoutUtils.generateRegExpFromPattern(layout, layout.getArtifactPathPattern());
-
-            String descriptorRegEx = StringUtils.EMPTY;
-            if (layout.isDistinctiveDescriptorPathPattern()) {
-                descriptorRegEx = RepoLayoutUtils.generateRegExpFromPattern(layout, layout.getDescriptorPathPattern());
-            }
-
-            RegExResolverModel regExResolverModel = new RegExResolverModel(artifactRegEx, descriptorRegEx);
-            response.iModel(regExResolverModel);
-        }
-        catch (Exception e) {
-            String message = "Failed to resolve regular expression: " + ExceptionUtils.getRootCause(e).getMessage();
-            response.error(message);
-            log.debug(message);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/TestArtPathService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/TestArtPathService.java
deleted file mode 100644
index 119d0f0..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/TestArtPathService.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.layouts;
-
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.module.ModuleInfoUtils;
-import org.artifactory.api.module.regex.NamedMatcher;
-import org.artifactory.api.module.regex.NamedPattern;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.layouts.LayoutConfigViewModel;
-import org.artifactory.util.ExceptionUtils;
-import org.artifactory.util.RepoLayoutUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Lior Hasson
- */
- at Component
-public class TestArtPathService implements RestService<LayoutConfigViewModel> {
-    private static final Logger log = LoggerFactory.getLogger(TestArtPathService.class);
-
-    @Override
-    public void execute(ArtifactoryRestRequest<LayoutConfigViewModel> request, RestResponse response) {
-        LayoutConfigViewModel layout = request.getImodel();
-        try {
-            ModuleInfo moduleInfo = null;
-            if (layout.isDistinctiveDescriptorPathPattern()) {
-                String pathPattern = layout.getDescriptorPathPattern();
-                String regExp = RepoLayoutUtils.generateRegExpFromPattern(layout, pathPattern, true);
-                moduleInfo = ModuleInfoUtils.moduleInfoFromDescriptorPath(layout.getPathToTest(), layout);
-                checkIfEmptyCapturingGroup(moduleInfo, regExp, layout.getPathToTest());
-            }
-
-            if ((moduleInfo == null) || !moduleInfo.isValid()) {
-                String pathPattern = layout.getArtifactPathPattern();
-                String regExp = RepoLayoutUtils.generateRegExpFromPattern(layout, pathPattern, true);
-                moduleInfo = ModuleInfoUtils.moduleInfoFromArtifactPath(layout.getPathToTest(), layout);
-                checkIfEmptyCapturingGroup(moduleInfo, regExp, layout.getPathToTest());
-            }
-
-            response.iModel(moduleInfo);
-
-        } catch (Exception e) {
-            String message = "Failed to test path: " + ExceptionUtils.getRootCause(e).getMessage();
-            response.error(message);
-            log.debug(message);
-        }
-    }
-
-    private void checkIfEmptyCapturingGroup(ModuleInfo moduleInfo, String regExp, String pathToTest) throws Exception {
-        if (!moduleInfo.isValid()) {
-            // May be due to empty capturing blocks
-            NamedPattern compileArtifactRegex = NamedPattern.compile(regExp);
-            NamedMatcher matcher = compileArtifactRegex.matcher(pathToTest);
-            if (matcher.regexpMatches() && !matcher.matches()) {
-                throw new Exception("Non named capturing groups are not allowed! Use (?:XXX)");
-            }
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/UpdateLayoutService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/UpdateLayoutService.java
deleted file mode 100644
index 79d3d7a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/UpdateLayoutService.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.layouts;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.service.admin.configuration.layouts.validation.LayoutFieldRequiredTokenValidator;
-import org.artifactory.exception.ValidationException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Lior Hasson
- */
- at Component
-public class UpdateLayoutService implements RestService<RepoLayout> {
-    private static final Logger log = LoggerFactory.getLogger(UpdateLayoutService.class);
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<RepoLayout> request, RestResponse response) {
-        RepoLayout repoLayout = request.getImodel();
-        try {
-            validation(repoLayout);
-            MutableCentralConfigDescriptor configDescriptor = getMutableDescriptor();
-            RepoLayout savedRepoLayout = configDescriptor.getRepoLayout(repoLayout.getName());
-            if (savedRepoLayout != null) {
-                savedRepoLayout.setArtifactPathPattern(repoLayout.getArtifactPathPattern());
-                savedRepoLayout.setDescriptorPathPattern(repoLayout.getDescriptorPathPattern());
-                savedRepoLayout.setDistinctiveDescriptorPathPattern(repoLayout.isDistinctiveDescriptorPathPattern());
-                savedRepoLayout.setFileIntegrationRevisionRegExp(repoLayout.getFileIntegrationRevisionRegExp());
-                savedRepoLayout.setFolderIntegrationRevisionRegExp(repoLayout.getFolderIntegrationRevisionRegExp());
-                centralConfigService.saveEditedDescriptorAndReload(configDescriptor);
-            }
-
-            String message = "Successfully updated layout '" + repoLayout.getName() + "'";
-            response.info(message);
-        } catch (ValidationException e) {
-            response.error(e.getMessage());
-            log.debug(e.getMessage());
-        }
-    }
-
-    /**
-    * @see LayoutFieldRequiredTokenValidator
-    */
-    private void validation(RepoLayout repoLayout) throws ValidationException {
-            LayoutFieldRequiredTokenValidator.onValidate(repoLayout.getArtifactPathPattern());
-            LayoutFieldRequiredTokenValidator.onValidate(repoLayout.getDescriptorPathPattern());
-    }
-
-    private MutableCentralConfigDescriptor getMutableDescriptor() {
-        return centralConfigService.getMutableDescriptor();
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/validation/LayoutFieldRequiredTokenValidator.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/validation/LayoutFieldRequiredTokenValidator.java
deleted file mode 100644
index bd72b3a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/validation/LayoutFieldRequiredTokenValidator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ui.rest.service.admin.configuration.layouts.validation;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.exception.ValidationException;
-
-import java.util.regex.Pattern;
-
-/**
- * Verifies that the repository pattern fields contain all the required tokens
- *
- * @author Lior Hasson
- */
-public class LayoutFieldRequiredTokenValidator {
-    private static String[] requiredTokens = new String[]{"(org|orgPath)", "module", "baseRev"};
-
-    public static void onValidate(String validatable) throws ValidationException{
-        if (StringUtils.isNotBlank(validatable)) {
-            for (String requiredToken : requiredTokens) {
-                if (!Pattern.compile("\\[" + requiredToken + "\\]").matcher(validatable).find()) {
-                    throw new ValidationException("Pattern '" + validatable +
-                            "' must at-least contain the tokens 'module', " +
-                            "'baseRev' and 'org' or 'orgPath'.");
-                }
-            }
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/validation/ReservedLayoutNameValidator.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/validation/ReservedLayoutNameValidator.java
deleted file mode 100644
index 56fdb37..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/layouts/validation/ReservedLayoutNameValidator.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.layouts.validation;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.exception.ValidationException;
-import org.artifactory.util.RepoLayoutUtils;
-
-/**
- *
- *
- * @author Lior Hasson
- */
-public class ReservedLayoutNameValidator {
-    public static void onValidate(String validatable) throws ValidationException {
-        if (StringUtils.isNotBlank(validatable)) {
-            if (RepoLayoutUtils.isReservedName(validatable)) {
-                throw new ValidationException("The layout name '" + validatable + "' is reserved.");
-            }
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/licenses/CreateArtifactLicenseService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/licenses/CreateArtifactLicenseService.java
deleted file mode 100644
index 0885988..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/licenses/CreateArtifactLicenseService.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.licenses;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.license.LicensesAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.license.ArtifactLicenseModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CreateArtifactLicenseService implements RestService {
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        // get license addon
-        LicensesAddon licensesAddon = ContextHelper.get().beanForType(AddonsManager.class).addonByType(
-                LicensesAddon.class);
-        // add artifact license
-        ArtifactLicenseModel artifactLicenseModel = (ArtifactLicenseModel) request.getImodel();
-        licensesAddon.addLicenseInfo(artifactLicenseModel.buildLicenseInfo());
-        response.responseCode(HttpServletResponse.SC_CREATED);
-        response.info("Successfully created license '" + artifactLicenseModel.getName() + "'");
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/licenses/DeleteArtifactLicenseService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/licenses/DeleteArtifactLicenseService.java
deleted file mode 100644
index 9322268..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/licenses/DeleteArtifactLicenseService.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.licenses;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.license.LicensesAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.license.LicenseInfo;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.licenses.DeleteLicensesModel;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DeleteArtifactLicenseService<T extends DeleteLicensesModel> implements RestService<T> {
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-        T model = request.getImodel();
-        for (String licenseId : model.getLicenseskeys()) {
-            // get license addon
-            LicensesAddon licensesAddon = ContextHelper.get().beanForType(AddonsManager.class).addonByType(
-                    LicensesAddon.class);
-            // delete artifact license
-            LicenseInfo licenseInfo = licensesAddon.getLicenseByName(licenseId);
-            licensesAddon.deleteLicenseInfo(licenseInfo);
-        }
-        if(model.getLicenseskeys().size()>1){
-            response.info("Successfully removed "+model.getLicenseskeys().size()+" licenses");
-        }else if(model.getLicenseskeys().size()==1){
-            response.info("Successfully removed license '" + model.getLicenseskeys().get(0) + "'");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/licenses/ExportLicenseFileService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/licenses/ExportLicenseFileService.java
deleted file mode 100644
index 45ed50a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/licenses/ExportLicenseFileService.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.licenses;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.license.LicensesAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.license.LicensesInfo;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.service.StreamRestResponse;
-import org.artifactory.ui.rest.model.admin.configuration.licenses.ExportLicense;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinann
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ExportLicenseFileService implements RestService {
-
-    String LICENSES_FILE_NAME = "licenses.xml";
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        LicensesAddon licensesAddon = ContextHelper.get().beanForType(AddonsManager.class).addonByType(
-                LicensesAddon.class);
-        LicensesInfo artifactLicensesInfo = licensesAddon.getArtifactsLicensesInfo();
-        updateResponseWithLicenseFile(response, licensesAddon, artifactLicensesInfo);
-    }
-
-    /**
-     * update response with license data
-     *
-     * @param artifactoryResponse  - encapsulate data related to response
-     * @param licensesAddon        - license add on
-     * @param artifactLicensesInfo - artifacts license info
-     */
-    private void updateResponseWithLicenseFile(RestResponse artifactoryResponse, LicensesAddon licensesAddon,
-            LicensesInfo artifactLicensesInfo) {
-        if (artifactLicensesInfo != null) {
-            String licenseXml = licensesAddon.writeLicenseXML(artifactLicensesInfo);
-            ((StreamRestResponse) artifactoryResponse).setDownloadFile(LICENSES_FILE_NAME);
-            ((StreamRestResponse) artifactoryResponse).setDownload(true);
-            ExportLicense exportLicense = new ExportLicense(licenseXml);
-            artifactoryResponse.iModel(exportLicense);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/licenses/GetArtifactLicenseService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/licenses/GetArtifactLicenseService.java
deleted file mode 100644
index 204f7e2..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/licenses/GetArtifactLicenseService.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.licenses;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.license.LicensesAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.license.LicenseInfo;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.common.ConfigModelPopulator;
-import org.artifactory.ui.rest.model.admin.configuration.licenses.License;
-import org.artifactory.ui.rest.model.empty.EmptyModel;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetArtifactLicenseService implements RestService {
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        fetchSingleOrMultiArtifactLicense(response, request);
-    }
-
-    /**
-     * fetch single or multi license info objects
-     *
-     * @param response - encapsulate all data require for response
-     * @param request  - encapsulate data related to request
-     */
-    private void fetchSingleOrMultiArtifactLicense(RestResponse response, ArtifactoryRestRequest request) {
-        String licenseName = request.getPathParamByKey("id");
-        // get license addon
-        LicensesAddon licensesAddon = ContextHelper.get().beanForType(AddonsManager.class).addonByType(
-                LicensesAddon.class);
-        if (isMultiLicense(licenseName)) {
-            List<LicenseInfo> licenseInfos = licensesAddon.getArtifactsLicensesInfo().getLicenses();
-            // update response with license info data
-            updateResponseWithMultiLicensesInfo(response, licenseInfos);
-        } else {
-            updateResponseWithSingleArtifactLicenseInfo(response, licenseName, licensesAddon);
-        }
-    }
-
-    /**
-     * get Single license info and update response
-     *
-     * @param artifactoryResponse - encapsulate Data require for response
-     * @param licenseName         - license name from path param
-     */
-    private void updateResponseWithSingleArtifactLicenseInfo(RestResponse artifactoryResponse, String licenseName,
-            LicensesAddon licensesAddon) {
-        RestModel license = getSingleLicense(licenseName, licensesAddon);
-        if (license == null) {
-            license = new EmptyModel();
-        }
-        artifactoryResponse.iModel(license);
-    }
-
-    /**
-     * get Multi artifact license info and update response
-     *
-     * @param artifactoryResponse - encapsulate Data require for response
-     * @param licenseInfos        - list of all artifact license Found in DB
-     */
-    private void updateResponseWithMultiLicensesInfo(RestResponse artifactoryResponse,
-            List<LicenseInfo> licenseInfos) {
-        List<RestModel> licenseInfoList = new ArrayList<>();
-        // populate artifact license info data to license model
-        licenseInfos.stream().forEach(
-                licenseInfo -> licenseInfoList.add(ConfigModelPopulator.populateLicenseInfo(licenseInfo)));
-        // update response with artifact license model data
-        artifactoryResponse.iModelList(licenseInfoList);
-    }
-
-    /**
-     * check if  single or multi license is require based on path param data
-     *
-     * @param licenseName - path param
-     * @return if true require multi license
-     */
-    private boolean isMultiLicense(String licenseName) {
-        return licenseName == null || licenseName.length() == 0;
-    }
-
-    /**
-     * get license from addon by name
-     *
-     * @param licenseName - license name
-     * @return - license info instance for specific license name
-     */
-    private License getSingleLicense(String licenseName, LicensesAddon licensesAddon) {
-        License license = null;
-        LicenseInfo licenseInfo = licensesAddon.getLicenseByName(licenseName);
-        if (!licenseInfo.isNotFound()) {
-            license = ConfigModelPopulator.populateLicenseInfo(licenseInfo);
-        }
-        return license;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/licenses/UpdateArtifactLicenseService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/licenses/UpdateArtifactLicenseService.java
deleted file mode 100644
index 916ea45..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/licenses/UpdateArtifactLicenseService.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.licenses;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.license.LicensesAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.license.ArtifactLicenseModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateArtifactLicenseService implements RestService {
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        // get license addon
-        LicensesAddon licensesAddon = ContextHelper.get().beanForType(AddonsManager.class).addonByType(
-                LicensesAddon.class);
-        // update artifact license
-        ArtifactLicenseModel artifactLicenseModel = (ArtifactLicenseModel) request.getImodel();
-        licensesAddon.updateLicenseInfo(artifactLicenseModel.buildLicenseInfo());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/mail/GetMailService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/mail/GetMailService.java
deleted file mode 100644
index 67b26f3..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/mail/GetMailService.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.mail;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.artifactory.ui.rest.model.admin.configuration.mail.MailServer;
-import org.artifactory.util.HttpUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetMailService implements RestService {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("GetMail");
-        String contextUrl = HttpUtils.getServletContextUrl(request.getServletRequest());
-        MailServer mailServer = getMailServerFromConfigDescriptor(contextUrl);
-        // update response with mail server model
-        response.iModel(mailServer);
-    }
-
-    /**
-     * get mail server from config descriptor and populate data to mail server model
-     *
-     * @return mail server model
-     * @param contextUrl
-     */
-    private MailServer getMailServerFromConfigDescriptor(String contextUrl) {
-        MutableCentralConfigDescriptor configDescriptor = centralConfigService.getMutableDescriptor();
-        if (configDescriptor.getMailServer() != null) {
-            return new MailServer(configDescriptor.getMailServer());
-        } else {
-            MailServer mailServer = new MailServer();
-            mailServer.setArtifactoryUrl(contextUrl);
-            return mailServer;
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/mail/TestMailService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/mail/TestMailService.java
deleted file mode 100644
index 0bf47f6..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/mail/TestMailService.java
+++ /dev/null
@@ -1,139 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.mail;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.mail.MailServerConfiguration;
-import org.artifactory.api.mail.MailService;
-import org.artifactory.descriptor.mail.MailServerDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.ui.rest.model.admin.configuration.mail.MailServer;
-import org.artifactory.util.EmailException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class TestMailService<T extends MailServer> implements RestService<T> {
-    private static final Logger log = LoggerFactory.getLogger(TestMailService.class);
-
-    @Autowired
-    private MailService mailService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-        AolUtils.assertNotAol("TestMail");
-        // get mail configuration instance
-        MailServerConfiguration mailServerConfiguration = getMailServerConfiguration(request);
-        // validate configuration data
-        if (!validateConfig(mailServerConfiguration)) {
-            response.error("Sending a test message requires the configuration to be enabled with " +
-                    "defined host and port properties, at least.");
-            return;
-        }
-        // send Test mail
-        sendMail(mailServerConfiguration, request.getImodel(), response);
-    }
-
-    /**
-     * get mail server configuration
-     *
-     * @param artifactoryRequest - encapsulate all date related to request
-     * @return instance of mail server configuration data
-     */
-    private MailServerConfiguration getMailServerConfiguration(ArtifactoryRestRequest artifactoryRequest) {
-        MailServerDescriptor serverData = (MailServerDescriptor) artifactoryRequest.getImodel();
-        return new MailServerConfiguration(
-                serverData.isEnabled(), serverData.getHost(), serverData.getPort(), serverData.getUsername(),
-                CryptoHelper.decryptIfNeeded(serverData.getPassword()), serverData.getFrom(),
-                serverData.getSubjectPrefix(),
-                serverData.isTls(), serverData.isSsl(), serverData.getArtifactoryUrl());
-    }
-
-    /**
-     * validate mail server setting
-     *
-     * @param mailServerConfiguration - mail server configuration
-     * @return if true - configuration is valid
-     */
-    public boolean validateConfig(MailServerConfiguration mailServerConfiguration) {
-        boolean hasHost = false;
-        boolean hasPort = false;
-        if (mailServerConfiguration != null) {
-            hasHost = !StringUtils.isEmpty(mailServerConfiguration.getHost());
-            hasPort = (mailServerConfiguration.getPort() > 0);
-        }
-        return hasHost && hasPort && mailServerConfiguration.isEnabled();
-    }
-
-    /**
-     * send test mail to receipt
-     *
-     * @param configuration - mail server configuration
-     * @param model         - mail server model
-     * @param response      - encapsulate all data require for response
-     */
-    private void sendMail(MailServerConfiguration configuration, MailServer model, RestResponse response) {
-        MailServer mailServer = model;
-        String testRecipient = mailServer.getTestReceipt();
-        if (!StringUtils.isEmpty(testRecipient)) {
-            try {
-                mailService.sendMail(new String[]{testRecipient}, "Test", createTestMessage(configuration),
-                        configuration);
-                String confirmMessage = "A test message has been sent successfully to '" + testRecipient + "'";
-                response.info(confirmMessage);
-                log.info(confirmMessage);
-            } catch (EmailException e) {
-                String message = e.getMessage();
-                if (message == null) {
-                    message = "An error has occurred while sending an e-mail.";
-                }
-                log.error(message, e);
-                response.error(message);
-            }
-        } else {
-            response.error("Test recipient field cannot be empty");
-        }
-    }
-
-    /**
-     * create test mail message
-     *
-     * @param configuration - mail server configuration
-     * @return test message
-     */
-    private String createTestMessage(MailServerConfiguration configuration) {
-        StringBuilder message = new StringBuilder();
-        message.append("This is a test message from Artifactory").append("<br/>");
-        String artifactoryUrl = configuration.getArtifactoryUrl();
-        if (StringUtils.isNotBlank(artifactoryUrl)) {
-            String artifactoryLink = createArtifactoryLinkFromUrl(artifactoryUrl);
-            message.append("Your Artifactory base URL is: ").append(artifactoryLink);
-        } else {
-            message.append("No Artifactory base URL is configured");
-        }
-        return message.toString();
-    }
-
-    /**
-     * create artifactory link from url
-     *
-     * @param artifactoryUrl - artifactory url
-     * @return url
-     */
-    private String createArtifactoryLinkFromUrl(String artifactoryUrl) {
-        StringBuilder builder = new StringBuilder();
-        builder.append("<a href=").append(artifactoryUrl).append(" target=\"blank\"").append(">")
-                .append(artifactoryUrl).append("<a/>");
-        return builder.toString();
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/mail/UpdateMailService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/mail/UpdateMailService.java
deleted file mode 100644
index befc30f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/mail/UpdateMailService.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.mail;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.artifactory.ui.rest.model.admin.configuration.mail.MailServer;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateMailService implements RestService {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("UpdateMail");
-        MutableCentralConfigDescriptor configDescriptor = centralConfigService.getMutableDescriptor();
-        saveMailChangesToDescriptor(request, configDescriptor, response);
-    }
-
-    /**
-     * save mail changes to descriptor
-     *
-     * @param artifactoryRequest - encapsulate artifactory data related  to request
-     * @param configDescriptor   - config descriptor without new maul changes
-     */
-    private void saveMailChangesToDescriptor(ArtifactoryRestRequest artifactoryRequest,
-            MutableCentralConfigDescriptor configDescriptor, RestResponse artifactoryResponse) {
-        MailServer mailServer = (MailServer) artifactoryRequest.getImodel();
-        configDescriptor.setMailServer(mailServer);
-        centralConfigService.saveEditedDescriptorAndReload(configDescriptor);
-        artifactoryResponse.info("Successfully updated Mail server settings");
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/propertysets/CreatePropertySetService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/propertysets/CreatePropertySetService.java
deleted file mode 100644
index f5a2f95..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/propertysets/CreatePropertySetService.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.propertysets;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.propertysets.AdminPropertySetModel;
-import org.artifactory.util.stream.BiOptional;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CreatePropertySetService implements RestService<AdminPropertySetModel> {
-    private static final Logger log = LoggerFactory.getLogger(CreatePropertySetService.class);
-
-    @Autowired
-    CentralConfigService configService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AdminPropertySetModel toAdd = (AdminPropertySetModel) request.getImodel();
-        MutableCentralConfigDescriptor descriptor = configService.getMutableDescriptor();
-        BiOptional.of(descriptor.getPropertySets().stream()
-                .filter(prop -> prop.getName().equals(toAdd.getName()))
-                .findFirst())
-                .ifNotPresent(() -> addPropertySet(descriptor, toAdd, response))
-                .ifPresent(() -> error(response, toAdd.getName()));
-    }
-
-    private void addPropertySet(MutableCentralConfigDescriptor descriptor, AdminPropertySetModel propertySet,
-            RestResponse artifactoryResponse) {
-        descriptor.addPropertySet(propertySet.getPropertySetFromModel());
-        configService.saveEditedDescriptorAndReload(descriptor);
-        String msg = "Successfully add property Set '" + propertySet.getName() + "'";
-        log.info(msg);
-        artifactoryResponse.info(msg).responseCode(HttpStatus.SC_CREATED);
-    }
-
-    private void error(RestResponse response, String propName) {
-        String msg = "Property set '" + propName + "' already exists";
-        log.debug(msg + " canceling create operation");
-        response.responseCode(HttpStatus.SC_BAD_REQUEST).error(msg);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/propertysets/DeletePropertySetService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/propertysets/DeletePropertySetService.java
deleted file mode 100644
index 0eab0ed..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/propertysets/DeletePropertySetService.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.propertysets;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.propertysets.DeletePropertySetModel;
-import org.artifactory.util.stream.BiOptional;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DeletePropertySetService<T extends DeletePropertySetModel> implements RestService<T> {
-
-    @Autowired
-    CentralConfigService configService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-        T model = request.getImodel();
-        for (String toDelete : model.getPropertySetNames()) {
-            MutableCentralConfigDescriptor descriptor = configService.getMutableDescriptor();
-            BiOptional.of(descriptor.getPropertySets().stream()
-                    .filter(prop -> prop.getName().equals(toDelete))
-                    .findFirst())
-                    .ifPresent(foundProp -> deleteProp(descriptor, foundProp.getName()))
-                    .ifNotPresent(() -> response.error("Property set '" + toDelete + "' does not exist.")
-                            .responseCode(HttpStatus.SC_NOT_FOUND));
-        }
-        if(model.getPropertySetNames().size()>1){
-            response.info("Successfully removed "+model.getPropertySetNames().size()+" property sets");
-        }else if(model.getPropertySetNames().size()==1){
-            response.info("Successfully removed property set '" + model.getPropertySetNames().get(0) + "'");
-        }
-    }
-
-    private void deleteProp(MutableCentralConfigDescriptor descriptor, String toDelete) {
-        descriptor.removePropertySet(toDelete);
-        configService.saveEditedDescriptorAndReload(descriptor);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/propertysets/GetConfigPropertySetNamesService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/propertysets/GetConfigPropertySetNamesService.java
deleted file mode 100644
index f577478..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/propertysets/GetConfigPropertySetNamesService.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.propertysets;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.propertysets.PropertySetNameModel;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.function.Predicate;
-import java.util.stream.Collectors;
-
-/**
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetConfigPropertySetNamesService implements RestService {
-
-    private static final String INCOMING_FROM_REPO_FORM = "isRepoForm";
-
-    @Autowired
-    CentralConfigService configService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        response.iModelList(configService.getDescriptor().getPropertySets().stream()
-                //UI doesn't show the artifactory. prop set and non-visible sets
-                .filter(filterPropSetsByCallingScreen(request.getQueryParamByKey(INCOMING_FROM_REPO_FORM)))
-                .map(PropertySetNameModel::new)
-                .collect(Collectors.toList()));
-    }
-
-    /**
-     * The Property Set config screen(in admin) does not show the 'artifactory' property set.
-     * The repo wizard does show it as a valid selection but not all other invisible prop sets.
-     * @return
-     */
-    private Predicate<PropertySet> filterPropSetsByCallingScreen(String isRepoFormParam) {
-        if(Boolean.valueOf(isRepoFormParam)) {
-
-            return propertySet -> propertySet.isVisible()
-                    || propertySet.getName().equals(PropertySet.ARTIFACTORY_RESERVED_PROP_SET);
-        }
-        return propertySet -> !propertySet.getName().equals(PropertySet.ARTIFACTORY_RESERVED_PROP_SET);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/propertysets/GetConfigPropertySetService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/propertysets/GetConfigPropertySetService.java
deleted file mode 100644
index 8d4a20b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/propertysets/GetConfigPropertySetService.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.propertysets;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.propertysets.AdminPropertySetModel;
-import org.artifactory.ui.rest.resource.admin.configuration.propertysets.PropertySetsResource;
-import org.artifactory.util.stream.BiOptional;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetConfigPropertySetService implements RestService {
-
-    @Autowired
-    CentralConfigService configService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String propName = request.getPathParamByKey(PropertySetsResource.PROP_SET_NAME);
-        BiOptional.of(configService.getDescriptor().getPropertySets().stream()
-                .filter(propertySet -> propertySet.getName().equals(propName))
-                .map(AdminPropertySetModel::new)
-                .findFirst())
-                .ifPresent(response::iModel)
-                .ifNotPresent(() -> response.error("Property set '" + propName + "' does not exists")
-                        .responseCode(HttpStatus.SC_NOT_FOUND));
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/propertysets/UpdatePropertySetService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/propertysets/UpdatePropertySetService.java
deleted file mode 100644
index e22338f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/propertysets/UpdatePropertySetService.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.propertysets;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.propertysets.AdminPropertiesModel;
-import org.artifactory.ui.rest.model.admin.configuration.propertysets.AdminPropertySetModel;
-import org.artifactory.util.stream.BiOptional;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.stream.Collectors;
-
-import static org.artifactory.ui.rest.resource.admin.configuration.propertysets.PropertySetsResource.PROP_SET_NAME;
-
-/**
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdatePropertySetService implements RestService<AdminPropertySetModel> {
-
-    @Autowired
-    CentralConfigService configService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<AdminPropertySetModel> request, RestResponse response) {
-        AdminPropertySetModel newSet = request.getImodel();
-        MutableCentralConfigDescriptor descriptor = configService.getMutableDescriptor();
-        newSet.setName(request.getPathParamByKey(PROP_SET_NAME)); //Force propSet name according to endpoint
-        BiOptional.of(descriptor.getPropertySets().stream()
-                .filter(prop -> prop.getName().equals(newSet.getName()))
-                .findFirst())
-                .ifPresent(toUpdate -> updatePropertySet(descriptor, toUpdate, newSet, response))
-                .ifNotPresent(() -> response.error("Property set '" + newSet.getName() + "' does not exist")
-                        .responseCode(HttpStatus.SC_NOT_FOUND));
-    }
-
-    private void updatePropertySet(MutableCentralConfigDescriptor descriptor, PropertySet toUpdate,
-            AdminPropertySetModel newSet, RestResponse artifactoryResponse) {
-        //Unfortunately need to convert model to property
-        toUpdate.setProperties(newSet.getProperties().stream()
-                .map(AdminPropertiesModel::toProperty)
-                .collect(Collectors.toList()));
-        configService.saveEditedDescriptorAndReload(descriptor);
-        artifactoryResponse.info("Successfully updated property set '" + toUpdate.getName() + "'");
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/proxies/CreateProxyService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/proxies/CreateProxyService.java
deleted file mode 100644
index 4895bb4..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/proxies/CreateProxyService.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.proxies;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CreateProxyService implements RestService {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("CreateProxy");
-        ProxyDescriptor proxyDescriptor = (ProxyDescriptor) request.getImodel();
-        // add new proxy to configuration
-        addNewProxy(proxyDescriptor);
-        // update response feedback
-        updateResponse(response, proxyDescriptor);
-    }
-
-    /**
-     * update response with created status and feedback
-     *
-     * @param artifactoryResponse - encapsulate all data require for response
-     * @param proxyDescriptor     - proxy descriptor
-     */
-    private void updateResponse(RestResponse artifactoryResponse, ProxyDescriptor proxyDescriptor) {
-        artifactoryResponse.info("Successfully created proxy '" + proxyDescriptor.getKey() + "'");
-        artifactoryResponse.responseCode(HttpServletResponse.SC_CREATED);
-    }
-
-    /**
-     * add new proxy to descriptor to configuration descriptor
-     *
-     * @param proxyDescriptor - new proxy descriptor
-     */
-    private void addNewProxy(ProxyDescriptor proxyDescriptor) {
-        boolean isDefaultProxy = proxyDescriptor.isDefaultProxy();
-        MutableCentralConfigDescriptor configDescriptor = centralConfigService.getMutableDescriptor();
-        configDescriptor.proxyChanged(proxyDescriptor, isDefaultProxy);
-        configDescriptor.addProxy(proxyDescriptor, isDefaultProxy);
-        centralConfigService.saveEditedDescriptorAndReload(configDescriptor);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/proxies/DeleteProxyService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/proxies/DeleteProxyService.java
deleted file mode 100644
index c793355..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/proxies/DeleteProxyService.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.proxies;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.rest.common.model.proxies.ProxiesModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DeleteProxyService<T extends ProxiesModel> implements RestService<T> {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-        AolUtils.assertNotAol("DeleteProxy");
-        T model = request.getImodel();
-        for (String proxyKey : model.getProxyKeys()) {
-            // remove proxy from config descriptor
-            deleteProxy(proxyKey);
-            // update response feedback
-        }
-        if(model.getProxyKeys().size()>1){
-            response.info("Successfully removed "+model.getProxyKeys().size()+" proxies");
-        }else if(model.getProxyKeys().size()==1){
-            response.info("Successfully removed proxy '" + model.getProxyKeys().get(0) + "'");
-        }
-    }
-
-    /**
-     * remove proxy from config descriptor
-     *
-     * @param proxyKey - proxy key
-     */
-    private void deleteProxy(String proxyKey) {
-        MutableCentralConfigDescriptor configDescriptor = centralConfigService.getMutableDescriptor();
-        configDescriptor.removeProxy(proxyKey);
-        centralConfigService.saveEditedDescriptorAndReload(configDescriptor);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/proxies/GetProxiesService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/proxies/GetProxiesService.java
deleted file mode 100644
index 5b9a2c8..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/proxies/GetProxiesService.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.proxies;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.common.ConfigModelPopulator;
-import org.artifactory.ui.rest.model.admin.configuration.proxy.Proxy;
-import org.artifactory.ui.rest.model.empty.EmptyModel;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetProxiesService implements RestService {
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        fetchSingleOrMultiProxy(response, request);
-    }
-
-    /**
-     * fetch single or multi group depend on query and path param
-     *
-     * @param artifactoryResponse - encapsulate all data related to response
-     *                            artifactoryRequest - encapsulate data related to request
-     */
-    private void fetchSingleOrMultiProxy(RestResponse artifactoryResponse,
-            ArtifactoryRestRequest artifactoryRequest) {
-        String proxyKey = artifactoryRequest.getPathParamByKey("id");
-        if (isMultiProxy(proxyKey)) {
-            updateResponseWithMultiProxyInfo(artifactoryResponse);
-        } else {
-            updateResponseWithSinglePrxyInfo(artifactoryResponse, proxyKey);
-        }
-    }
-
-    /**
-     * get Single Group info and update response
-     *
-     * @param artifactoryResponse - encapsulate Data require for response
-     * @param proxyKey            - proxy Key from path param
-     */
-    private void updateResponseWithSinglePrxyInfo(RestResponse artifactoryResponse, String proxyKey) {
-        RestModel proxy = getProxy(proxyKey);
-        if (proxy == null) {
-            proxy = new EmptyModel();
-        }
-        artifactoryResponse.iModel(proxy);
-    }
-
-    /**
-     * get Multi Group info and update response
-     *
-     * @param artifactoryResponse - encapsulate Data require for response
-     */
-    private void updateResponseWithMultiProxyInfo(RestResponse artifactoryResponse) {
-        List<ProxyDescriptor> proxyDescriptors = getProxyInfos();
-        // add groups to List
-        List<RestModel> proxyList = new ArrayList<>();
-        proxyDescriptors.stream().forEach(
-                proxyInfo -> proxyList.add(ConfigModelPopulator.populateProxyConfiguration(proxyInfo)));
-        artifactoryResponse.iModelList(proxyList);
-    }
-
-    /**
-     * check id require to get single / multi group
-     *
-     * @param proxyKey - single group name
-     * @return if true require multi group
-     */
-    private boolean isMultiProxy(String proxyKey) {
-        return proxyKey == null || proxyKey.length() == 0;
-    }
-
-    /**
-     * return group by name
-     *
-     * @param proxyKey - proxy key
-     * @return
-     */
-    private Proxy getProxy(String proxyKey) {
-        ProxyDescriptor proxyDescriptor = centralConfigService.getMutableDescriptor().getProxy(proxyKey);
-        Proxy proxy = ConfigModelPopulator.populateProxyConfiguration(proxyDescriptor);
-        return proxy;
-    }
-
-    /**
-     * return all groups / default groups
-     *
-     * @return - list of groups info
-     */
-    private List<ProxyDescriptor> getProxyInfos() {
-        List<ProxyDescriptor> proxyDescriptors = centralConfigService.getMutableDescriptor().getProxies();
-        return proxyDescriptors;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/proxies/UpdateProxyService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/proxies/UpdateProxyService.java
deleted file mode 100644
index 9b2503f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/proxies/UpdateProxyService.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.proxies;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateProxyService implements RestService {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("UpdateProxy");
-        String proxyKey = request.getPathParamByKey("id");
-        ProxyDescriptor proxyDescriptor = (ProxyDescriptor) request.getImodel();
-        // update proxy
-        updateProxy(proxyDescriptor, proxyKey);
-        // update response feedback
-        response.info("Successfully updated proxy '" + proxyKey + "'");
-    }
-
-    /**
-     * add new proxy to descriptor to configuration descriptor
-     *
-     * @param newProxy - new proxy descriptor
-     */
-    private void updateProxy(ProxyDescriptor newProxy, String proxyKey) {
-        boolean isDefaultProxy = newProxy.isDefaultProxy();
-        MutableCentralConfigDescriptor configDescriptor = centralConfigService.getMutableDescriptor();
-        ProxyDescriptor currentProxy = configDescriptor.getProxy(proxyKey);
-        if (currentProxy != null) {
-            populateProxyData(currentProxy, newProxy);
-            configDescriptor.proxyChanged(currentProxy, isDefaultProxy);
-            centralConfigService.saveEditedDescriptorAndReload(configDescriptor);
-        }
-    }
-
-    /**
-     * populate proxy changed data
-     *
-     * @param currentProxyDesc - proxy descriptor before update
-     * @param newProxy  - update proxy descriptor
-     */
-    private void populateProxyData(ProxyDescriptor currentProxyDesc, ProxyDescriptor newProxy) {
-        currentProxyDesc.setDefaultProxy(newProxy.isDefaultProxy());
-        currentProxyDesc.setPort(newProxy.getPort());
-        currentProxyDesc.setHost(newProxy.getHost());
-        currentProxyDesc.setUsername(newProxy.getUsername());
-        currentProxyDesc.setDomain(newProxy.getDomain());
-        currentProxyDesc.setNtHost(newProxy.getNtHost());
-        currentProxyDesc.setRedirectedToHosts(newProxy.getRedirectedToHosts());
-        currentProxyDesc.setPassword(newProxy.getPassword());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/registerpro/GetLicenseKeyService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/registerpro/GetLicenseKeyService.java
deleted file mode 100644
index 188055d..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/registerpro/GetLicenseKeyService.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.registerpro;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.artifactory.ui.rest.model.admin.configuration.registerpro.ProLicense;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
-public class GetLicenseKeyService implements RestService {
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("GetLicenseKey");
-        AddonsManager addonsManager = getAddonsManager();
-        String[] licenseDetails = null;
-        if (addonsManager.isLicenseInstalled()) {
-            licenseDetails = addonsManager.getLicenseDetails();
-        }
-        // update response with license details
-        updateResponseWithLicenseDetails(response, addonsManager, licenseDetails);
-    }
-
-    /**
-     * update response with license details
-     *
-     * @param artifactoryResponse - encapsulate all data require for response
-     * @param addonsManager       - add on manager
-     * @param licenseDetails      - license details array
-     */
-    private void updateResponseWithLicenseDetails(RestResponse artifactoryResponse, AddonsManager addonsManager,
-            String[] licenseDetails) {
-        ProLicense proLicense = new ProLicense(licenseDetails, addonsManager.getLicenseKey());
-        artifactoryResponse.iModel(proLicense);
-    }
-
-    /**
-     * get addon manager from application context
-     *
-     * @return addon manager
-     */
-    private AddonsManager getAddonsManager() {
-        ArtifactoryContext artifactoryContext = ContextHelper.get();
-        return artifactoryContext.beanForType(AddonsManager.class);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/registerpro/UpdateLicenseKeyService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/registerpro/UpdateLicenseKeyService.java
deleted file mode 100644
index c021c0e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/registerpro/UpdateLicenseKeyService.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.registerpro;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.license.VerificationResult;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.artifactory.ui.rest.model.admin.configuration.registerpro.ProLicense;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
-public class UpdateLicenseKeyService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(UpdateLicenseKeyService.class);
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("UpdateLicenseKey");
-        AddonsManager addonsManager = getAddonsManager();
-        boolean hasLicenseAlready = addonsManager.isLicenseInstalled();
-        try {
-            ProLicense proLicense = (ProLicense) request.getImodel();
-            // try to install license
-            VerificationResult verificationResult = addonsManager.installLicense(proLicense.getKey());
-            // update response with license validation result
-            updateResponseWithLicenseInstallResult(response, verificationResult, addonsManager,
-                    hasLicenseAlready);
-        } catch (Exception e) {
-            response.error("The license key is not valid");
-            log.error(e.toString());
-        }
-    }
-
-    /**
-     * update response with license install result
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param verificationResult  - license install validation result
-     */
-    private void updateResponseWithLicenseInstallResult(RestResponse artifactoryResponse,
-            VerificationResult verificationResult, AddonsManager addonsManager, boolean hasLicenseAlready) {
-        String installResult = verificationResult.showMassage();
-        if (verificationResult.isValid()) {
-            updateFeedbackMessage(artifactoryResponse, addonsManager, hasLicenseAlready);
-        } else {
-            artifactoryResponse.error(installResult);
-        }
-    }
-
-    /**
-     * update feedback message for new license or update license
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param addonsManager       - add on manager
-     * @param hasLicenseAlready   - if true license installed already
-     */
-    private void updateFeedbackMessage(RestResponse artifactoryResponse, AddonsManager addonsManager,
-            boolean hasLicenseAlready) {
-        String licenseType=addonsManager.getProductName();
-        if (addonsManager.isLicenseInstalled()) {
-            String[] licenseDetails = addonsManager.getLicenseDetails();
-            licenseType=licenseDetails[2];
-        }
-        if (hasLicenseAlready) {
-            artifactoryResponse.info("Successfully updated " + licenseType + " license");
-        } else {
-            artifactoryResponse.info("Successfully created " + licenseType + " license");
-        }
-    }
-
-    /**
-     * get addon manager from application context
-     *
-     * @return addon manager
-     */
-    private AddonsManager getAddonsManager() {
-        ArtifactoryContext artifactoryContext = ContextHelper.get();
-        return artifactoryContext.beanForType(AddonsManager.class);
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/CreateRepositoryConfigService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/CreateRepositoryConfigService.java
deleted file mode 100644
index a987b32..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/CreateRepositoryConfigService.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.repository.RepositoryConfigModel;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.CreateRepoConfigHelper;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.validator.RepoConfigValidator;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Aviad Shikloshi
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CreateRepositoryConfigService implements RestService<RepositoryConfigModel> {
-    private static final Logger log = LoggerFactory.getLogger(CreateRepositoryConfigService.class);
-
-    @Autowired
-    private CentralConfigService configService;
-
-    @Autowired
-    private RepoConfigValidator repoValidator;
-
-    @Autowired
-    private CreateRepoConfigHelper creator;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        RepositoryConfigModel model = (RepositoryConfigModel) request.getImodel();
-        createRepo(response, model);
-    }
-
-    public boolean createRepo(RestResponse response, RepositoryConfigModel model) {
-        MutableCentralConfigDescriptor configDescriptor = configService.getMutableDescriptor();
-        String repoKey = model.getGeneral().getRepoKey();
-        if (configDescriptor.isRepositoryExists(repoKey)) {
-            response.error("Repository " + repoKey + " already exists").responseCode(HttpStatus.SC_BAD_REQUEST);
-            return false;
-        }
-        log.info("Creating repository {}", repoKey);
-        try {
-            //Run repo name validation only on create
-            repoValidator.validateRepoName(model.getGeneral().getRepoKey());
-            model.createRepo(creator);
-            response.info("Successfully added repository '" + repoKey + "'");
-        } catch (Exception e) {
-            log.error("Failed to create repository '" + repoKey + "': ", e);
-            response.error("Failed to create repository " + repoKey + ": " + e.getMessage());
-            return false;
-        }
-        return true;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/DeleteRepositoryConfigService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/DeleteRepositoryConfigService.java
deleted file mode 100644
index 2f2dba0..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/DeleteRepositoryConfigService.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.repository.RepositoryConfigModel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Aviad Shikloshi
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DeleteRepositoryConfigService<T extends RepositoryConfigModel> implements RestService<T> {
-    private static final Logger log = LoggerFactory.getLogger(DeleteRepositoryConfigService.class);
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        MutableCentralConfigDescriptor configDescriptor = centralConfigService.getMutableDescriptor();
-        String repoKey = request.getPathParamByKey("repoKey");
-        if (!configDescriptor.isRepositoryExists(repoKey)) {
-            response.error("Repository '" + repoKey + "' does not exist").responseCode(HttpStatus.SC_NOT_FOUND);
-        } else if (configDescriptor.getLocalRepositoriesMap().keySet().contains(repoKey)
-                && configDescriptor.getLocalRepositoriesMap().size() == 1) {
-            //Don't allow deleting the last local repo
-            response.error("Deleting the last local repository is not allowed").responseCode(HttpStatus.SC_FORBIDDEN);
-        } else {
-            try {
-                log.info("Deleting repository {}", repoKey);
-                configDescriptor.removeRepository(repoKey);
-                centralConfigService.saveEditedDescriptorAndReload(configDescriptor);
-                response.info("Successfully deleted '" + repoKey + "' repository")
-                        .responseCode(HttpStatus.SC_OK);
-            } catch (Exception e) {
-                log.debug("Descriptor save failed: ", e);
-                log.error("Deleting repo '{}' failed: {}", repoKey, e.getMessage());
-                response.error("Deleting repo '" + repoKey + "' failed: " + e.getMessage());
-            }
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/GetRepositoryConfigService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/GetRepositoryConfigService.java
deleted file mode 100644
index 5c89a58..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/GetRepositoryConfigService.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.descriptor.repo.RepoBaseDescriptor;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.repository.RepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.distribution.DistributionRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.local.LocalRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.RemoteRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.virtual.VirtualRepositoryConfigModel;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.builder.RepoConfigModelBuilder;
-import org.artifactory.util.stream.BiOptional;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author Aviad Shikloshi
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetRepositoryConfigService implements RestService {
-
-    private static final String LOCAL = "local";
-    private static final String REMOTE = "remote";
-    private static final String VIRTUAL = "virtual";
-    private static final String DISTRIBUTION = "distribution";
-
-    @Autowired
-    private RepositoryService repositoryService;
-
-    @Autowired
-    private RepoConfigModelBuilder configBuilder;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String repoType = request.getPathParamByKey("repoType");
-        String repoKey = request.getPathParamByKey("repoKey");
-        List<? extends RepoDescriptor> repoDescList = getAllRepositoriesDescriptors(repoType);
-        if (StringUtils.isBlank(repoKey)) {
-            List<RepositoryConfigModel> repositoryConfigModels =
-                    repoDescList.stream()
-                            .map(repoDesc -> createModelFromDescriptor(repoType, repoDesc))
-                            .collect(Collectors.toList());
-
-            response.iModelList(repositoryConfigModels)
-                    .responseCode(HttpStatus.SC_OK);
-        } else {
-            BiOptional.of(repoDescList.stream()
-                    .filter(repoDesc -> repoDesc.getKey().equals(repoKey))
-                    .findFirst())
-                    .ifPresent(repoDesc -> response.iModel(createModelFromDescriptor(repoType, repoDesc)))
-                    .ifNotPresent(() -> response.error("Repository '" + repoKey + "' does not exists.")
-                            .responseCode(HttpStatus.SC_NOT_FOUND));
-        }
-    }
-
-    private RepositoryConfigModel createModelFromDescriptor(String repoType, RepoDescriptor repoDesc) {
-        return getRepoDescriptorByType(repoType).fromDescriptor(configBuilder, repoDesc);
-    }
-
-    private List<? extends RepoBaseDescriptor> getAllRepositoriesDescriptors(String repoType) {
-        List<? extends RepoBaseDescriptor> descriptors = Lists.newArrayList();
-        switch (repoType) {
-            case LOCAL:
-                descriptors = repositoryService.getLocalRepoDescriptors();
-                break;
-            case REMOTE:
-                descriptors = repositoryService.getRemoteRepoDescriptors();
-                break;
-            case VIRTUAL:
-                descriptors = repositoryService.getVirtualRepoDescriptors();
-                break;
-            case DISTRIBUTION:
-                descriptors = repositoryService.getDistributionRepoDescriptors();
-                break;
-        }
-        return descriptors;
-    }
-
-    private RepositoryConfigModel getRepoDescriptorByType(String repoType) {
-        RepositoryConfigModel configModel = null;
-        switch (repoType) {
-            case LOCAL:
-                configModel = new LocalRepositoryConfigModel();
-                break;
-            case REMOTE:
-                configModel = new RemoteRepositoryConfigModel();
-                break;
-            case VIRTUAL:
-                configModel = new VirtualRepositoryConfigModel();
-                break;
-            case DISTRIBUTION:
-                configModel = new DistributionRepositoryConfigModel();
-                break;
-        }
-        return configModel;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/UpdateRepositoryConfigService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/UpdateRepositoryConfigService.java
deleted file mode 100644
index 374fcc5..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/UpdateRepositoryConfigService.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.repository.RepositoryConfigModel;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.UpdateRepoConfigHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Dan Feldman
- * @author Aviad Shikloshi
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateRepositoryConfigService implements RestService<RepositoryConfigModel> {
-    private static final Logger log = LoggerFactory.getLogger(UpdateRepositoryConfigService.class);
-
-    @Autowired
-    private CentralConfigService configService;
-
-    @Autowired
-    private UpdateRepoConfigHelper updater;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        RepositoryConfigModel model = (RepositoryConfigModel) request.getImodel();
-        MutableCentralConfigDescriptor configDescriptor = configService.getMutableDescriptor();
-        log.debug("Creating descriptor from received model");
-        String repoKey = model.getGeneral().getRepoKey();
-        if (!configDescriptor.isRepositoryExists(repoKey)) {
-            response.error("Repository '" + repoKey + "' doesn't exist.").responseCode(HttpStatus.SC_BAD_REQUEST);
-            return;
-        }
-        log.info("Updating repository {}", repoKey);
-        try {
-            model.updateRepo(updater);
-            response.info("Successfully updated repository '" + repoKey + "'");
-        } catch (Exception e) {
-            log.error("Failed to update repository {}: {}", repoKey, e.getMessage());
-            log.debug("Failed to update repository: ", e);
-            response.error("Failed to update repository '" + repoKey + "'");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/distribution/SaveBintrayOauthConfigService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/distribution/SaveBintrayOauthConfigService.java
deleted file mode 100644
index 5e67d31..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/distribution/SaveBintrayOauthConfigService.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.distribution;
-
-import com.sun.jersey.core.util.Base64;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.bintray.distribution.DistributionService;
-import org.artifactory.api.bintray.distribution.model.DistributionRepoCreationDetails;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.repository.typespecific.DistRepoTypeSpecificConfigModel;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.exception.RepoConfigException;
-import org.artifactory.util.AlreadyExistsException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-
-import static org.apache.http.HttpStatus.SC_BAD_REQUEST;
-
-/**
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class SaveBintrayOauthConfigService implements RestService<DistRepoTypeSpecificConfigModel> {
-
-    @Autowired
-    DistributionService distributionService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        DistRepoTypeSpecificConfigModel distModel = (DistRepoTypeSpecificConfigModel) request.getImodel();
-
-        DistributionRepoCreationDetails creationDetails = null;
-        try {
-            creationDetails = createBintrayAppConfig(distModel);
-            //Messed up response but no exception - shouldn't happen.
-            if (!response.isFailed()
-                    && (creationDetails == null || StringUtils.isBlank(creationDetails.oauthAppConfigKey))) {
-                response.error("Failed to establish trust with Bintray, check the logs for more info.")
-                        .responseCode(SC_BAD_REQUEST);
-            }
-        } catch (RepoConfigException rce) {
-            response.error(rce.getMessage()).responseCode(rce.getStatusCode());
-        }
-        if (response.isFailed() || creationDetails == null) {
-            return;
-        }
-        //We just need to return the key of the newly created OAuth app
-        DistRepoTypeSpecificConfigModel newModel = new DistRepoTypeSpecificConfigModel();
-        newModel.setBintrayAppConfig(creationDetails.oauthAppConfigKey);
-        newModel.setPremium(creationDetails.isOrgPremium);
-        newModel.setAvailableLicenses(creationDetails.orgLicenses);
-        newModel.setOrg(creationDetails.org);
-        newModel.setClientId(creationDetails.clientId);
-        response.iModel(newModel);
-    }
-
-    private DistributionRepoCreationDetails createBintrayAppConfig(DistRepoTypeSpecificConfigModel distModel)
-            throws RepoConfigException {
-        String[] clientIdAndSecret = validateDistributionRepoParams(distModel);
-        try {
-            return distributionService.createBintrayAppConfig(clientIdAndSecret[0], clientIdAndSecret[1],
-                    distModel.getCode(), distModel.getScope(), distModel.getRedirectUrl());
-        } catch (IOException ioe) {
-            throw new RepoConfigException("Error executing OAuth token creation request: " + ioe.getMessage(),
-                    SC_BAD_REQUEST, ioe);
-        } catch (AlreadyExistsException aee) {
-            throw new RepoConfigException(aee.getMessage(), SC_BAD_REQUEST);
-        }
-    }
-
-    /**
-     * @return the client id and secret returned from bintray in the {@param distModel}'s getBintrayAuthString()
-     * @throws RepoConfigException
-     */
-    private String[] validateDistributionRepoParams(DistRepoTypeSpecificConfigModel distModel)
-            throws RepoConfigException {
-        if (StringUtils.isBlank(distModel.getBintrayAuthString())) {
-            throw new RepoConfigException("Bintray authorization code provided is valid. Try to authorize again", SC_BAD_REQUEST);
-        } else if (StringUtils.isBlank(distModel.getParamClientId())) {
-            throw new RepoConfigException("The Bintray client id parameter is empty. Try to authorize again",
-                    SC_BAD_REQUEST);
-        } else if (StringUtils.isBlank(distModel.getCode())) {
-            throw new RepoConfigException("The Bintray code parameter is empty. Try to authorize again",
-                    SC_BAD_REQUEST);
-        } else if (StringUtils.isBlank(distModel.getRedirectUrl())) {
-            throw new RepoConfigException("The redirect url parameter is empty. Try to authorize again", SC_BAD_REQUEST);
-        } else if (StringUtils.isBlank(distModel.getScope())) {
-            throw new RepoConfigException("The Bintray scope parameter is empty. Try to authorize again",
-                    SC_BAD_REQUEST);
-        }
-
-        String decodedAuthString = Base64.base64Decode(distModel.getBintrayAuthString());
-        //Auth String is client_id:<client_id>:client_secret:<client_secret>
-        String[] clientIdAndSecret = decodedAuthString.split(":");
-        if (!(clientIdAndSecret.length == 2)) {
-            throw new RepoConfigException("An invalid authentication string was pasted in the text box.", SC_BAD_REQUEST);
-        } else if (!clientIdAndSecret[0].equals(distModel.getParamClientId())) {
-            throw new RepoConfigException("There is a mismatch between the client ID you pasted in the box and the " +
-                    "one returned from Bintray. This can pose a security risk.", SC_BAD_REQUEST);
-        }
-        return clientIdAndSecret;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/replication/ExecuteAllLocalReplicationsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/replication/ExecuteAllLocalReplicationsService.java
deleted file mode 100644
index 74ba691..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/replication/ExecuteAllLocalReplicationsService.java
+++ /dev/null
@@ -1,122 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.replication;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.replication.ReplicationAddon;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.util.CollectionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.net.UnknownHostException;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import static org.apache.http.HttpStatus.SC_NOT_FOUND;
-
-/**
- * @author Aviad Shikloshi
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ExecuteAllLocalReplicationsService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(ExecuteAllLocalReplicationsService.class);
-
-    @Autowired
-    private RepositoryService repoService;
-
-    @Autowired
-    private CentralConfigService configService;
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String repoKey = request.getQueryParamByKey("repoKey");
-        LocalRepoDescriptor repo = repoService.localRepoDescriptorByKey(repoKey);
-        if (repo == null) {
-            response.error("Repository '" + repoKey + "' doesn't exist, the 'run now' button only works for exiting " +
-                    "repositories").responseCode(SC_NOT_FOUND);
-            return;
-        }
-
-        log.info("Scheduling all enabled push replications tasks for repository {}", repoKey);
-        CentralConfigDescriptor descriptor = configService.getDescriptor();
-        boolean blockPushReplications = descriptor.getReplicationsConfig().isBlockPushReplications();
-        if(blockPushReplications){
-            response.warn("Blocking push replication , to unblock replication please update accordingly the " +
-                    "replication section in the configuration");
-            return;
-        }
-        List<LocalReplicationDescriptor> enabledReplications = descriptor
-                .getMultiLocalReplications(repoKey)
-                .stream().filter(LocalReplicationDescriptor::isEnabled).collect(Collectors.toList());
-        if(CollectionUtils.isNullOrEmpty(enabledReplications)) {
-            String warn = "No active push replications are configured for";
-            log.warn(warn + " repo '{}'.", repoKey);
-            response.warn(warn + "this repo.");
-            return;
-        }
-        boolean moreThenOneActiveAndNotHa = false;
-        String moreThenOneActiveAndNotHaError = "Only an enterprise license can run a multi-push replication setup. " +
-                "Only the first enabled replication";
-        if(!addonsManager.isHaLicensed() && enabledReplications.size() > 1) {
-            moreThenOneActiveAndNotHa = true;
-            log.warn(moreThenOneActiveAndNotHaError + " will run.");
-            LocalReplicationDescriptor firstEnabled = enabledReplications.get(0);
-            enabledReplications.clear();
-            enabledReplications.add(firstEnabled);
-        }
-
-        boolean hadErrors = false;
-        for (LocalReplicationDescriptor replication : enabledReplications) {
-            log.info("Scheduling push replication task for repo {} and url {}", repoKey, replication.getUrl());
-            BasicStatusHolder status = new BasicStatusHolder();
-            ReplicationAddon replicationAddon = addonsManager.addonByType(ReplicationAddon.class);
-            try {
-                replicationAddon.validateTargetLicense(replication, repo, enabledReplications.size());
-                replicationAddon.scheduleImmediateLocalReplicationTask(replication, status);
-            } catch (Exception e) {
-                String error = "Error scheduling push replication task: ";
-                if (e instanceof UnknownHostException) {
-                    error += "\nUnknown host: ";
-                    if (e.getMessage().equalsIgnoreCase("api")) {
-                        error += replication.getUrl();
-                    } else {
-                        error += e.getMessage();
-                    }
-                } else {
-                    error += e.getMessage();
-                }
-                hadErrors = true;
-                log.debug(error, e);
-            }
-            if (status.hasErrors()) {
-                hadErrors = true;
-                log.error(status.getLastError().getMessage(), status.getLastError().getException());
-            } else if (!hadErrors) {
-                log.debug("Replication task for {} was successfully scheduled to run in the background",
-                        replication.getUrl());
-            }
-        }
-        if (hadErrors) {
-            response.error("Replication tasks scheduling finished with errors. Check Artifactory logs for more details.");
-        } else if (moreThenOneActiveAndNotHa) {
-            response.warn(moreThenOneActiveAndNotHaError + " was successfully scheduled to run");
-        } else {
-            response.info("Replication tasks scheduling finished successfully");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/replication/ExecuteLocalReplicationService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/replication/ExecuteLocalReplicationService.java
deleted file mode 100644
index b915e57..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/replication/ExecuteLocalReplicationService.java
+++ /dev/null
@@ -1,137 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.replication;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.replication.ReplicationAddon;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.repository.GeneralRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.local.LocalRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.replication.local.LocalReplicationConfigModel;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.builder.ReplicationConfigDescriptorBuilder;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.exception.RepoConfigException;
-import org.artifactory.util.stream.BiOptional;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.net.UnknownHostException;
-import java.util.List;
-import java.util.Optional;
-
-import static org.apache.http.HttpStatus.SC_BAD_REQUEST;
-import static org.apache.http.HttpStatus.SC_NOT_FOUND;
-
-/**
- * @author Aviad Shikloshi
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ExecuteLocalReplicationService<T extends LocalRepositoryConfigModel> implements RestService<T> {
-    private static final Logger log = LoggerFactory.getLogger(ExecuteLocalReplicationService.class);
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Autowired
-    private RepositoryService repoService;
-
-    @Autowired
-    private CentralConfigService configService;
-
-    @Autowired
-    private ReplicationConfigDescriptorBuilder builder;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-        LocalRepositoryConfigModel model = request.getImodel();
-        GeneralRepositoryConfigModel general = model.getGeneral();
-        if (general == null || general.getRepoKey() == null) {
-            response.error("Repository key is not configured.");
-            return;
-        }
-        String repoKey = general.getRepoKey();
-        String remoteUrl = request.getQueryParamByKey("replicationUrl");
-        List<LocalReplicationConfigModel> localReplicationDescriptorList = model.getReplications();
-        Optional<LocalReplicationConfigModel> optionalDesc = localReplicationDescriptorList.stream().filter(
-                replicationModel -> StringUtils.equals(remoteUrl, replicationModel.getUrl())).findFirst();
-
-        BiOptional.of(optionalDesc).ifPresent(replication -> {
-            try {
-                boolean success = runSinglePushReplication(repoKey, remoteUrl, replication, new BasicStatusHolder());
-                if (success) {
-                    response.info("The replication tasks was successfully scheduled to run");
-                    log.info("Replication task for repo {} and url {} successfully scheduled to run", repoKey, remoteUrl);
-                } else {
-                    response.error("Replication tasks scheduling finished with errors. Check Artifactory logs for more "
-                                    + "details.").responseCode(SC_BAD_REQUEST);
-                }
-            } catch (Exception e) {
-                String error = "Error scheduling push replication task: ";
-                if (e instanceof UnknownHostException) {
-                    error += "\nUnknown host: ";
-                    if (e.getMessage().equalsIgnoreCase("api")) {
-                        error += replication.getUrl();
-                    } else {
-                        error += e.getMessage();
-                    }
-                } else {
-                    error += e.getMessage();
-                }
-                response.error(error).responseCode(SC_BAD_REQUEST);
-                log.error(error);
-            }
-        }).ifNotPresent(() -> response.error("Could not find replication."));
-    }
-
-    private boolean runSinglePushReplication(String repoKey, String url, LocalReplicationConfigModel replicationModel,
-            BasicStatusHolder status) throws RepoConfigException, IOException {
-        log.debug("Model resolved to local, retrieving replication descriptor.");
-        log.info("immediate schedule of push replication task for repo {} and url {} was requested.", repoKey, url);
-        LocalRepoDescriptor localRepo = repoService.localRepoDescriptorByKey(repoKey);
-        if (localRepo == null) {
-            log.debug("No such repo {}", repoKey);
-            throw new RepoConfigException("Repository '" + repoKey + "' doesn't exist, the 'run now' function only " +
-                    "works for exiting repositories", SC_NOT_FOUND);
-        }
-        LocalReplicationDescriptor replication = builder.buildLocalReplication(replicationModel, repoKey);
-        if (replication == null) {
-            log.warn("No such replication config for repo {} and url {}", repoKey, url);
-            throw new RepoConfigException("Replication config for repository '" + repoKey + "' and url '" + url +
-                    "' doesn't exist, the 'run now' button only works for exiting replication configurations - " +
-                    "save the configuration and try again.", SC_NOT_FOUND);
-        }
-        int numberOfReplications = configService.getDescriptor().getTotalNumOfActiveLocalReplication(repoKey);
-        return scheduleSinglePushReplication(repoKey, url, status, localRepo, replication, numberOfReplications);
-    }
-
-    public boolean scheduleSinglePushReplication(String repoKey, String url, BasicStatusHolder status,
-            LocalRepoDescriptor repo, LocalReplicationDescriptor replication, int numOfReplications) throws IOException {
-        ReplicationAddon replicationAddon = addonsManager.addonByType(ReplicationAddon.class);
-        log.info("Scheduling remote replication task for repository {}", repoKey);
-        replicationAddon.validateTargetLicense(replication, repo, numOfReplications);
-        replicationAddon.scheduleImmediateLocalReplicationTask(replication, status);
-        if(status.hasErrors()) {
-            status.getErrors().forEach(error -> {
-                log.error("Error scheduling push replication for repo {} and url {}: {}", repoKey, url,
-                        error.getMessage());
-                if (error.getException() != null) {
-                    log.debug("Error scheduling push replication for repo {} and url {}: {} -> {}", repoKey, url,
-                            error.getMessage(), error.getException());
-                }
-            });
-            return false;
-        }
-        return true;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/replication/ExecuteRemoteReplicationService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/replication/ExecuteRemoteReplicationService.java
deleted file mode 100644
index 8eeb59c..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/replication/ExecuteRemoteReplicationService.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.replication;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.replication.ReplicationAddon;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.descriptor.replication.RemoteReplicationDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.repository.RepositoryConfigModel;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.exception.RepoConfigException;
-import org.artifactory.ui.utils.RequestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-
-import static org.apache.http.HttpStatus.SC_BAD_REQUEST;
-import static org.apache.http.HttpStatus.SC_FORBIDDEN;
-import static org.apache.http.HttpStatus.SC_NOT_FOUND;
-
-/**
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ExecuteRemoteReplicationService<T extends RepositoryConfigModel> implements RestService<T> {
-    private static final Logger log = LoggerFactory.getLogger(ExecuteRemoteReplicationService.class);
-
-    @Autowired
-    AddonsManager addonsManager;
-
-    @Autowired
-    CentralConfigService configService;
-
-    @Autowired
-    RepositoryService repoService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String repoKey = RequestUtils.getRepoKeyFromRequest(request);
-        RemoteReplicationDescriptor replicationDesc = configService.getDescriptor().getRemoteReplication(repoKey);
-        if (replicationDesc == null) {
-            response.error("Repository does not exists");
-            return;
-        }
-        BasicStatusHolder status = new BasicStatusHolder();
-        try {
-            runPullReplication(repoKey, status);
-            if (status.hasErrors()) {
-                log.debug(status.getLastError().getMessage(), status.getLastError().getException());
-                response.error("Error scheduling replication task: "
-                        + status.getLastError().getMessage()).responseCode(SC_BAD_REQUEST);
-            } else {
-                response.info("Replication task was successfully scheduled to run in the background.");
-            }
-        } catch (Exception e) {
-            response.error(e.getMessage()).responseCode(SC_BAD_REQUEST);
-        }
-    }
-
-    private void runPullReplication(String repoKey, BasicStatusHolder status) throws RepoConfigException, IOException {
-        log.debug("Model resolved to remote replication, retrieving replication descriptor.");
-        if (!addonsManager.isLicenseInstalled()) {
-            throw new RepoConfigException("Replication is only available with a pro license and above", SC_FORBIDDEN);
-        }
-        RemoteRepoDescriptor remoteRepo = repoService.remoteRepoDescriptorByKey(repoKey);
-        if (remoteRepo == null) {
-            throw new RepoConfigException("Repository '" + repoKey + "' doesn't exist, the 'run now' button only " +
-                    "works for exiting repositories", SC_NOT_FOUND);
-        }
-        RemoteReplicationDescriptor replication = configService.getDescriptor().getRemoteReplication(repoKey);
-        if (replication == null) {
-            throw new RepoConfigException("Replication configuration for repository '" + repoKey + "' doesn't exist, " +
-                    "the 'run now' button only works for exiting replication configurations - save the configuration and"
-                    + " try again.", SC_NOT_FOUND);
-        }
-        log.info("Scheduling remote replication task for repository {}", repoKey);
-        addonsManager.addonByType(ReplicationAddon.class).scheduleImmediateRemoteReplicationTask(replication, status);
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/replication/ReplicationConfigService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/replication/ReplicationConfigService.java
deleted file mode 100644
index 5fca0ea..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/replication/ReplicationConfigService.java
+++ /dev/null
@@ -1,134 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.replication;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.replication.ReplicationAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.replication.RemoteReplicationDescriptor;
-import org.artifactory.descriptor.replication.ReplicationBaseDescriptor;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.exception.RepoConfigException;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.validator.ReplicationConfigValidator;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import static org.apache.http.HttpStatus.SC_FORBIDDEN;
-
-/**
- * Service to handle replication specific operations for the repo config services.
- *
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ReplicationConfigService {
-    public static final String IS_REPLICATION_QUERY_PARAM = "isReplication";
-    private static final Logger log = LoggerFactory.getLogger(ReplicationConfigService.class);
-    @Autowired
-    AddonsManager addonsManager;
-
-    @Autowired
-    CentralConfigService configService;
-
-    @Autowired
-    ReplicationConfigValidator validator;
-
-
-    public void addLocalReplications(Set<LocalReplicationDescriptor> replications, LocalRepoDescriptor repo,
-            MutableCentralConfigDescriptor configDescriptor) throws RepoConfigException, IOException {
-        String repoKey = repo.getKey();
-        if (replications.size() == 0) {
-            log.debug("No replication config received for repo {} creation", repoKey);
-        } else if (replications.size() > 1) {   //multi-push
-            addMultiPushReplications(replications, repo, configDescriptor);
-        } else {
-            log.info("Adding push replication config for repo {}", repoKey);
-            LocalReplicationDescriptor replication = replications.iterator().next();
-            configDescriptor.addLocalReplication(replication);
-        }
-    }
-
-    private void addMultiPushReplications(Set<LocalReplicationDescriptor> replications, LocalRepoDescriptor repo,
-            MutableCentralConfigDescriptor configDescriptor) throws RepoConfigException {
-        if (!addonsManager.isHaLicensed()) {
-            throw new RepoConfigException(
-                    "Multi-push replication is only available with an Enterprise license.", SC_FORBIDDEN);
-        }
-        String repoKey = repo.getKey();
-        validator.validateAllTargetReplicationLicenses(repo, Lists.newArrayList(replications));
-        log.info("Adding multi-push replication configurations for repo {}", repoKey);
-        replications.forEach(configDescriptor::addLocalReplication);
-    }
-
-    public void addRemoteReplication(RemoteReplicationDescriptor replication, RemoteRepoDescriptor repo,
-            MutableCentralConfigDescriptor configDescriptor) throws RepoConfigException, IOException {
-        log.info("Adding pull replication config for repo {}", repo.getKey());
-        configDescriptor.addRemoteReplication(replication);
-    }
-
-    public void updateLocalReplications(Set<LocalReplicationDescriptor> replications, String repoKey,
-            MutableCentralConfigDescriptor configDescriptor) throws RepoConfigException {
-        if (replications.size() == 0) {
-            log.debug("No replication config received for repo {}, deleting existing ones", repoKey);
-            List<LocalReplicationDescriptor> currentReplications = configDescriptor.getMultiLocalReplications(repoKey);
-            cleanupLocalReplications(currentReplications);
-            currentReplications.forEach(configDescriptor::removeLocalReplication);
-            updateAddedAndRemovedReplications(replications, repoKey, configDescriptor);
-        } else {
-            LocalReplicationDescriptor replicationDescriptor = replications.iterator().next();
-            setRepoKey(replicationDescriptor, repoKey);
-            updateAddedAndRemovedReplications(replications, repoKey, configDescriptor);
-        }
-    }
-
-    public void updateRemoteReplication(RemoteReplicationDescriptor replication, RemoteRepoDescriptor repo,
-            MutableCentralConfigDescriptor configDescriptor) throws IOException {
-        String repoKey = repo.getKey();
-        log.info("Updating remote replication config for repo {}", repoKey);
-        configDescriptor.removeRemoteReplication(configDescriptor.getRemoteReplication(repoKey));
-        configDescriptor.addRemoteReplication(replication);
-    }
-
-    private void updateAddedAndRemovedReplications(Set<LocalReplicationDescriptor> replications, String repoKey,
-            MutableCentralConfigDescriptor configDescriptor) {
-        log.info("Updating replication configurations for repo {}", repoKey);
-        // Remove all replication configs for this repo and re-add all newly received ones and do cleanup for
-        // descriptors that had their url changed
-        Set<String> newUrls = replications.stream()
-                .map(LocalReplicationDescriptor::getUrl)
-                .collect(Collectors.toSet());
-        List<LocalReplicationDescriptor> currentLocalReplications = configDescriptor.getMultiLocalReplications(repoKey);
-        cleanupLocalReplications(currentLocalReplications.stream()
-                .filter(replication -> !newUrls.contains(replication.getUrl()))
-                .collect(Collectors.toList()));
-        currentLocalReplications.forEach(configDescriptor::removeLocalReplication);
-        replications.forEach(configDescriptor::addLocalReplication);
-    }
-
-    /**
-     * Cleans up properties left over from a local replication in the relevant repo.
-     * Use only when deleting repos and when a url changes in a replication config.
-     */
-    public void cleanupLocalReplications(List<LocalReplicationDescriptor> toRemove) {
-        toRemove.forEach(addonsManager.addonByType(ReplicationAddon.class)::cleanupLocalReplicationProperties);
-    }
-
-    private void setRepoKey(ReplicationBaseDescriptor replication, String repoKey) {
-        if (StringUtils.isBlank(replication.getRepoKey())) {
-            replication.setRepoKey(repoKey);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/replication/TestLocalReplicationService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/replication/TestLocalReplicationService.java
deleted file mode 100644
index 212a75b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/replication/TestLocalReplicationService.java
+++ /dev/null
@@ -1,175 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.replication;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpHead;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.replication.ReplicationAddon;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.repository.local.LocalRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.RemoteNetworkRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.replication.local.LocalReplicationConfigModel;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.TestMethodFactory;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.builder.ReplicationConfigDescriptorBuilder;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.builder.RepoConfigDescriptorBuilder;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.exception.RepoConfigException;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.validator.ReplicationConfigValidator;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.validator.RepoConfigValidator;
-import org.artifactory.util.stream.BiOptional;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.net.UnknownHostException;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-
-import static org.apache.http.HttpStatus.*;
-import static org.artifactory.ui.rest.service.admin.configuration.repositories.util.RemoteRepositoryProvider.getRemoteRepoHttpClient;
-
-/**
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class TestLocalReplicationService implements RestService<LocalRepositoryConfigModel> {
-    public static final String REPLICATION_URL_PARAM = "replicationUrl";
-    public static final String FAKE_CRON = "0 0 12 1/1 * ? *";
-    private static final Logger log = LoggerFactory.getLogger(TestLocalReplicationService.class);
-
-    @Autowired
-    AddonsManager addonsManager;
-
-    @Autowired
-    ReplicationConfigDescriptorBuilder replicationDescriptorBuilder;
-
-    @Autowired
-    RepoConfigValidator repoValidator;
-
-    @Autowired
-    RepoConfigDescriptorBuilder repoDescriptorBuilder;
-
-    @Autowired
-    ReplicationConfigValidator replicationValidator;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<LocalRepositoryConfigModel> request, RestResponse response) {
-        String replicationUrl = request.getQueryParamByKey(REPLICATION_URL_PARAM);
-        LocalRepositoryConfigModel model = request.getImodel();
-        if (model == null) {
-            response.error("No repository configuration given to test replication with.").responseCode(SC_BAD_REQUEST);
-            return;
-        } else if (StringUtils.isBlank(replicationUrl)) {
-            response.error("No url given to identify which replication target to test").responseCode(SC_BAD_REQUEST);
-            return;
-        }
-        try {
-            setFakeCronExpForTestIfNeeded(model);
-            LocalRepoDescriptor repo = model.toDescriptor(repoValidator, repoDescriptorBuilder);
-            Set<LocalReplicationDescriptor> replications = model.getReplicationDescriptors(replicationValidator,
-                    replicationDescriptorBuilder);
-            int activeReplications = (int) replications.stream()
-                    .filter(LocalReplicationDescriptor::isEnabled)
-                    .count();
-            BiOptional.of(replications.stream()
-                    .filter(replication -> replicationUrl.equals(replication.getUrl()))
-                    .findFirst())
-                    .ifNotPresent(() -> response.error("No replication configuration exists for this repo  and url '"
-                            + replicationUrl + "'"))
-                    .ifPresent(replication -> testReplicationTarget(repo, replication, response, activeReplications));
-        } catch (RepoConfigException rce) {
-            log.debug("Error testing local replication: ", rce);
-            response.error(rce.getMessage()).responseCode(SC_BAD_REQUEST);
-        }
-    }
-
-    private void testReplicationTarget(LocalRepoDescriptor repoDescriptor, LocalReplicationDescriptor replication,
-            RestResponse response, int totalActiveReplications) {
-        if (StringUtils.isBlank(replication.getRepoKey())) {
-            replication.setRepoKey(repoDescriptor.getKey());
-        }
-        try {
-            if (!testValidReplicationLocation(replication, response)) {
-                return;
-            }
-            addonsManager.addonByType(ReplicationAddon.class).validateTargetLicense(replication, repoDescriptor,
-                    totalActiveReplications);
-            response.info("Push replication target url '" + replication.getUrl() + "' tested successfully")
-                    .responseCode(HttpStatus.SC_OK);
-        } catch (Exception e) {
-            log.debug("Error testing push replication config: ", e);
-            String error = "Error testing push replication config: ";
-            if (e instanceof UnknownHostException) {
-                error += "unknown host '";
-                if (e.getMessage().equalsIgnoreCase("api")) {
-                    error += replication.getUrl();
-                } else {
-                    error += e.getMessage();
-                }
-            } else {
-                error += e.getMessage();
-            }
-            response.error(error).responseCode(SC_BAD_REQUEST);
-        }
-    }
-
-    /**
-     * Sets fake cron expressions in the replication descriptors just to allow for the test to run
-     * if non were set by the ui
-     */
-    private void setFakeCronExpForTestIfNeeded(LocalRepositoryConfigModel model) {
-        List<LocalReplicationConfigModel> replications =
-                Optional.ofNullable(model.getReplications()).orElse(Lists.newArrayList());
-        replications.stream()
-                .filter(replication -> StringUtils.isBlank(replication.getCronExp()))
-                .forEach(emptyReplication -> emptyReplication.setCronExp(FAKE_CRON));
-    }
-
-    private boolean testValidReplicationLocation(LocalReplicationDescriptor replication,
-            RestResponse artifactoryResponse) throws IOException {
-        CloseableHttpResponse response = null;
-        CloseableHttpClient client = null;
-        try {
-            HttpHead test = new HttpHead(replication.getUrl());
-            TestMethodFactory.addOriginatedHeader(test);
-            client = getClientForReplicationUrl(replication, replication.getUrl());
-            response = client.execute(test);
-            int status = response.getStatusLine().getStatusCode();
-            if (status != SC_OK && status != SC_MOVED_TEMPORARILY) {
-                artifactoryResponse.error("Connection failed: Error " + status + ": "
-                        + response.getStatusLine().getReasonPhrase()).responseCode(SC_BAD_REQUEST);
-                return false;
-            }
-        } finally {
-            IOUtils.closeQuietly(response);
-            IOUtils.closeQuietly(client);
-        }
-        return true;
-    }
-
-    private CloseableHttpClient getClientForReplicationUrl(LocalReplicationDescriptor replication, String url) {
-        RemoteNetworkRepositoryConfigModel network = new RemoteNetworkRepositoryConfigModel();
-        network.setUrl(url);
-        network.setUsername(replication.getUsername());
-        network.setPassword(replication.getPassword());
-        if (replication.getProxy() != null) {
-            network.setProxy(replication.getProxy().getKey());
-        }
-        network.setSocketTimeout(replication.getSocketTimeoutMillis());
-        network.setSyncProperties(replication.isSyncProperties());
-        return getRemoteRepoHttpClient(url, network);
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/replication/TestRemoteReplicationService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/replication/TestRemoteReplicationService.java
deleted file mode 100644
index b79c37b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/replication/TestRemoteReplicationService.java
+++ /dev/null
@@ -1,122 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.replication;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.replication.ReplicationAddon;
-import org.artifactory.descriptor.replication.RemoteReplicationDescriptor;
-import org.artifactory.descriptor.repo.HttpRepoDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.RemoteRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.replication.remote.RemoteReplicationConfigModel;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.RemoteRepositoryTestUrl;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.builder.ReplicationConfigDescriptorBuilder;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.builder.RepoConfigDescriptorBuilder;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.exception.RepoConfigException;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.validator.ReplicationConfigValidator;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.validator.RepoConfigValidator;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.net.UnknownHostException;
-import java.util.List;
-import java.util.Optional;
-
-import static org.apache.http.HttpStatus.SC_BAD_REQUEST;
-import static org.apache.http.HttpStatus.SC_OK;
-import static org.artifactory.ui.rest.service.admin.configuration.repositories.replication.TestLocalReplicationService.FAKE_CRON;
-
-/**
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class TestRemoteReplicationService implements RestService<RemoteRepositoryConfigModel> {
-    private static final Logger log = LoggerFactory.getLogger(TestRemoteReplicationService.class);
-
-    @Autowired
-    AddonsManager addonsManager;
-
-    @Autowired
-    ReplicationConfigDescriptorBuilder replicationDescriptorBuilder;
-
-    @Autowired
-    RepoConfigValidator repoValidator;
-
-    @Autowired
-    RepoConfigDescriptorBuilder repoDescriptorBuilder;
-
-    @Autowired
-    ReplicationConfigValidator replicationValidator;
-
-    @Autowired
-    RemoteRepositoryTestUrl remoteURlTester;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<RemoteRepositoryConfigModel> request, RestResponse response) {
-        RemoteRepositoryConfigModel model = request.getImodel();
-        if (model == null) {
-            response.error("No repository configuration given to test.").responseCode(SC_BAD_REQUEST);
-            return;
-        }
-        HttpRepoDescriptor repo = null;
-        try {
-            setFakeCronExpForTestIfNeeded(model);
-            repo = model.toDescriptor(repoValidator, repoDescriptorBuilder);
-            RemoteReplicationDescriptor replication = model.getReplicationDescriptor(replicationValidator, replicationDescriptorBuilder);
-            if (replication == null) {
-                response.error("No Replication configuration was sent to test.").responseCode(HttpStatus.SC_NOT_FOUND);
-                return;
-            }
-            remoteURlTester.testConnection(response, model);
-            if (response.getResponseCode() != SC_OK) {
-                return;
-            }
-            testRemoteReplication(replication, repo);
-            response.info("Pull replication configuration tested successfully").responseCode(HttpStatus.SC_OK);
-        } catch (Exception e) {
-            log.debug("Error testing pull replication config: ", e);
-            String error = "Error testing pull replication config: ";
-            if (e instanceof UnknownHostException) {
-                error += "\nUnknown host '";
-                if (e.getMessage().equalsIgnoreCase("api") && repo != null) {
-                    error += repo.getUrl();
-                } else {
-                    error += e.getMessage();
-                }
-            } else {
-                error += e.getMessage();
-            }
-            response.error(error).responseCode(SC_BAD_REQUEST);
-        }
-    }
-
-    private void testRemoteReplication(RemoteReplicationDescriptor replication, RemoteRepoDescriptor repo)
-            throws RepoConfigException, IOException {
-        if (StringUtils.isBlank(replication.getRepoKey())) {
-            replication.setRepoKey(repo.getKey());
-        }
-        addonsManager.addonByType(ReplicationAddon.class).validateTargetIsDifferentInstance(replication, repo);
-    }
-
-    /**
-     * Sets fake cron expressions in the replication descriptors just to allow for the test to run
-     * if non were set by the ui
-     */
-    private void setFakeCronExpForTestIfNeeded(RemoteRepositoryConfigModel model) {
-        List<RemoteReplicationConfigModel> replications =
-                Optional.ofNullable(model.getReplications()).orElse(Lists.newArrayList());
-        replications.stream()
-                .filter(replication -> StringUtils.isBlank(replication.getCronExp()))
-                .forEach(emptyReplication -> emptyReplication.setCronExp(FAKE_CRON));
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/replication/ValidateLocalReplicationService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/replication/ValidateLocalReplicationService.java
deleted file mode 100644
index 1649460..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/replication/ValidateLocalReplicationService.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.replication;
-
-import com.google.common.collect.Lists;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.repository.replication.local.LocalReplicationConfigModel;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.exception.RepoConfigException;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.validator.ReplicationConfigValidator;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import static org.apache.http.HttpStatus.SC_BAD_REQUEST;
-
-/**
- * Executes validation on the replication model - called by the save button in the local replication modal
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ValidateLocalReplicationService implements RestService<LocalReplicationConfigModel> {
-
-    @Autowired
-    ReplicationConfigValidator replicationValidator;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<LocalReplicationConfigModel> request, RestResponse response) {
-        LocalReplicationConfigModel model = request.getImodel();
-        if (model == null) {
-            response.error("No repository configuration given to test replication with.").responseCode(SC_BAD_REQUEST);
-            return;
-        }
-        try {
-            model.setEnabled(true); //For the sake of validation mark model as enabled
-            replicationValidator.validateLocalModels(Lists.newArrayList(model));
-        } catch (RepoConfigException e) {
-            response.error(e.getMessage()).responseCode(e.getStatusCode());
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/CreateDefaultJcenterRepoService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/CreateDefaultJcenterRepoService.java
deleted file mode 100644
index 7de5ae2..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/CreateDefaultJcenterRepoService.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.util;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.propertysets.PropertySetNameModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.GeneralRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.RemoteAdvancedRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.RemoteBasicRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.RemoteRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.typespecific.MavenTypeSpecificConfigModel;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.CreateRepositoryConfigService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.Set;
-
-/**
- * Serves the remote search tab, when no JCenter repo is configured in Artifactory and user has opted to
- * create one automatically.
- *
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CreateDefaultJcenterRepoService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(CreateDefaultJcenterRepoService.class);
-
-    private static final String DEFAULT_JCENTER_NAME = "jcenter";
-    private static final String MAVEN_2_DEFAULT_LAYOUT = "maven-2-default";
-
-    @Autowired
-    private CentralConfigService configService;
-
-    @Autowired
-    private CreateRepositoryConfigService createRepoService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        log.debug("Creating the default JCenter remote repository");
-        String repoKey = guessNameForJcenter();
-        if (StringUtils.isBlank(repoKey)) {
-            response.error("repositories with the name 'jcenter' and 'jcenter-default' already exist, can't resolve " +
-                    "a proper name for the new repo.").responseCode(HttpStatus.SC_BAD_REQUEST);
-            return;
-        }
-        RemoteRepositoryConfigModel model = createDefaultModel(repoKey);
-        if (createRepoService.createRepo(response, model)) {
-            response.info("Successfully created repository '" + repoKey + "'");
-        }
-    }
-
-    private RemoteRepositoryConfigModel createDefaultModel(String repoKey) {
-        CentralConfigDescriptor configDescriptor = configService.getDescriptor();
-        RemoteRepositoryConfigModel model = new RemoteRepositoryConfigModel();
-        GeneralRepositoryConfigModel general = new GeneralRepositoryConfigModel();
-        general.setRepoKey(repoKey);
-        RemoteBasicRepositoryConfigModel basic = new RemoteBasicRepositoryConfigModel();
-        basic.setUrl(RepoConfigDefaultValues.MAVEN_GROUP_URL); //jcenter
-        if (configDescriptor.getRepoLayout(MAVEN_2_DEFAULT_LAYOUT) != null) {
-            basic.setLayout(MAVEN_2_DEFAULT_LAYOUT);
-            basic.setRemoteLayoutMapping(MAVEN_2_DEFAULT_LAYOUT);
-        } else {
-            basic.setLayout(RepoConfigDefaultValues.DEFAULT_REPO_LAYOUT);
-        }
-        RemoteAdvancedRepositoryConfigModel advanced = new RemoteAdvancedRepositoryConfigModel();
-        if (configDescriptor.getPropertySets().stream()
-                .filter(propertySet -> propertySet.getName().equalsIgnoreCase("artifactory")).findAny().isPresent()) {
-            advanced.setPropertySets(Lists.newArrayList(new PropertySetNameModel("artifactory", 0)));
-        }
-        ProxyDescriptor defaultProxy = configDescriptor.getDefaultProxy();
-        if (defaultProxy != null) {
-            advanced.getNetwork().setProxy(defaultProxy.getKey());
-        }
-        MavenTypeSpecificConfigModel typeSpecific = new MavenTypeSpecificConfigModel();
-        model.setGeneral(general);
-        model.setBasic(basic);
-        model.setAdvanced(advanced);
-        model.setTypeSpecific(typeSpecific);
-        return model;
-    }
-
-    private String guessNameForJcenter() {
-        String jcenterDef = DEFAULT_JCENTER_NAME + "-default";
-        Set<String> remoteRepoKeys = configService.getDescriptor().getLocalRepositoriesMap().keySet();
-        if (!remoteRepoKeys.contains(DEFAULT_JCENTER_NAME)) {
-            return DEFAULT_JCENTER_NAME;
-        } else if (!remoteRepoKeys.contains(jcenterDef)) {
-            return jcenterDef;
-        } else {
-            for (int i = 1; i < 5; i++) {
-                String suggestedName = jcenterDef + '-' + i;
-                if (!remoteRepoKeys.contains(suggestedName)) {
-                    return suggestedName;
-                }
-            }
-        }
-        return null;
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/CreateRepoConfigHelper.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/CreateRepoConfigHelper.java
deleted file mode 100644
index 82207a4..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/CreateRepoConfigHelper.java
+++ /dev/null
@@ -1,187 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.util;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.p2.P2Addon;
-import org.artifactory.addon.p2.P2Repo;
-import org.artifactory.api.bintray.distribution.DistributionService;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.replication.RemoteReplicationDescriptor;
-import org.artifactory.descriptor.repo.*;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues;
-import org.artifactory.ui.rest.model.admin.configuration.repository.RepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.distribution.DistributionRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.local.LocalRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.RemoteRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.typespecific.P2TypeSpecificConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.virtual.VirtualRepositoryConfigModel;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.replication.ReplicationConfigService;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.builder.ReplicationConfigDescriptorBuilder;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.builder.RepoConfigDescriptorBuilder;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.exception.RepoConfigException;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.validator.ReplicationConfigValidator;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.validator.RepoConfigValidator;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import static org.apache.http.HttpStatus.SC_BAD_REQUEST;
-
-/**
- * Delegate helper for creating and persisting repo config
- *
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CreateRepoConfigHelper {
-    private static final Logger log = LoggerFactory.getLogger(CreateRepoConfigHelper.class);
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Autowired
-    private RepoConfigDescriptorBuilder repoBuilder;
-
-    @Autowired
-    private ReplicationConfigDescriptorBuilder replicationBuilder;
-
-    @Autowired
-    private ReplicationConfigService replicationConfigService;
-
-    @Autowired
-    private ReplicationConfigValidator replicationValidator;
-
-    @Autowired
-    private RepoConfigValidator repoValidator;
-
-    @Autowired
-    private CentralConfigService configService;
-
-    @Autowired
-    private DistributionService distributionService;
-
-
-    public void handleLocal(LocalRepositoryConfigModel model) throws RepoConfigException, IOException {
-        MutableCentralConfigDescriptor configDescriptor = configService.getMutableDescriptor();
-        log.debug("Model resolved to local repo descriptor, adding.");
-        log.debug("Creating descriptor from received model");
-        LocalRepoDescriptor repoDescriptor = model.toDescriptor(repoValidator, repoBuilder);
-        configDescriptor.addLocalRepository(repoDescriptor);
-        configDescriptor.conditionallyAddToBackups(repoDescriptor);
-        ReverseProxyDescriptor reverseProxyDescriptor = getReverseProxyDescriptor(repoDescriptor, model);
-        configDescriptor.updateReverseProxy(reverseProxyDescriptor);
-        if (model.getReplications() != null) {
-            log.debug("Creating push replication descriptor(s) from received model");
-            Set<LocalReplicationDescriptor> replications = model.getReplicationDescriptors(replicationValidator,
-                    replicationBuilder);
-            replicationConfigService.addLocalReplications(replications, repoDescriptor, configDescriptor);
-        }
-        configService.saveEditedDescriptorAndReload(configDescriptor);
-    }
-
-    public void handleRemote(RemoteRepositoryConfigModel model) throws RepoConfigException, IOException {
-        MutableCentralConfigDescriptor configDescriptor = configService.getMutableDescriptor();
-        log.debug("Model resolved to remote repo descriptor, adding.");
-        log.debug("Creating descriptor from received model");
-        HttpRepoDescriptor repoDescriptor = model.toDescriptor(repoValidator, repoBuilder);
-        ReverseProxyDescriptor reverseProxyDescriptor = getReverseProxyDescriptor(repoDescriptor, model);
-        configDescriptor.updateReverseProxy(reverseProxyDescriptor);
-        configDescriptor.addRemoteRepository(repoDescriptor);
-        if (model.getReplications() != null) {
-            log.debug("Creating pull replication descriptor from received model");
-            RemoteReplicationDescriptor replicationDescriptor = model.getReplicationDescriptor(replicationValidator,
-                    replicationBuilder);
-            replicationConfigService.addRemoteReplication(replicationDescriptor, repoDescriptor, configDescriptor);
-        }
-        configService.saveEditedDescriptorAndReload(configDescriptor);
-    }
-
-    public void handleVirtual(VirtualRepositoryConfigModel model) throws RepoConfigException {
-        log.debug("Model resolved to virtual repo descriptor, adding.");
-        log.debug("Creating descriptor from received model");
-        VirtualRepoDescriptor repoDescriptor = model.toDescriptor(repoValidator, repoBuilder);
-        ReverseProxyDescriptor reverseProxyDescriptor = getReverseProxyDescriptor(repoDescriptor, model);
-        MutableCentralConfigDescriptor configDescriptor = configService.getMutableDescriptor();
-        configDescriptor.updateReverseProxy(reverseProxyDescriptor);
-        if (repoDescriptor.getType().equals(RepoType.P2)) {
-            log.debug("Creating P2 config for repo {}", repoDescriptor.getKey());
-            repoDescriptor.setRepositories(validateAndCreateP2ConfigRepos(configDescriptor, repoDescriptor,
-                    ((P2TypeSpecificConfigModel) model.getTypeSpecific()).getP2Repos()));
-        }
-        configDescriptor.addVirtualRepository(repoDescriptor);
-        configService.saveEditedDescriptorAndReload(configDescriptor);
-    }
-
-    public void handleDistribution(DistributionRepositoryConfigModel model) throws RepoConfigException {
-        log.debug("Model resolved to distribution repo descriptor, adding.");
-        log.debug("Creating descriptor from received model");
-        if (!model.getTypeSpecific().getRepoType().equals(RepoType.Distribution)) {
-            throw new RepoConfigException("Distribution repo's type specific configuration must be of type" +
-                    " Distribution", SC_BAD_REQUEST);
-        }
-        DistributionRepoDescriptor repoDescriptor = model.toDescriptor(repoValidator, repoBuilder);
-        MutableCentralConfigDescriptor configDescriptor = configService.getMutableDescriptor();
-        configDescriptor.addDistributionRepository(repoDescriptor);
-        //TODO [by dan]: dist repo backups?
-        //configDescriptor.conditionallyAddToBackups(repoDescriptor);
-        ReverseProxyDescriptor reverseProxyDescriptor = getReverseProxyDescriptor(repoDescriptor, model);
-        configDescriptor.updateReverseProxy(reverseProxyDescriptor);
-        /*if (model.getReplications() != null) {
-            log.debug("Creating push replication descriptor(s) from received model");
-            Set<LocalReplicationDescriptor> replications = model.getReplicationDescriptors(replicationValidator,
-                    replicationBuilder);
-            replicationConfigService.addLocalReplications(replications, repoDescriptor, configDescriptor);
-        }*/
-        configService.saveEditedDescriptorAndReload(configDescriptor);
-    }
-
-    List<RepoDescriptor> validateAndCreateP2ConfigRepos(MutableCentralConfigDescriptor configDescriptor,
-            VirtualRepoDescriptor repoDescriptor, List<P2Repo> requestedRepos) {
-        BasicStatusHolder status = new BasicStatusHolder();
-        Map<String, List<String>> subCompositeUrls = Maps.newHashMap();
-        //Addon verifies each url and crunches out a list of local and remote repositories that should be aggregated
-        //In this virtual based on the URLs passed to it
-        List<P2Repo> p2Repos = addonsManager.addonByType(P2Addon.class).verifyRemoteRepositories(configDescriptor,
-                repoDescriptor, null, requestedRepos, subCompositeUrls, status);
-        List<RepoDescriptor> descriptorsToAdd = Lists.newArrayList();
-        for (P2Repo repo : p2Repos) {
-            RepoDescriptor newDescriptor = repo.getDescriptor();
-            if (!configDescriptor.isRepositoryExists(repo.getRepoKey())) {
-                if (repo.getDescriptor() instanceof HttpRepoDescriptor) {
-                    HttpRepoDescriptor newRemoteDescriptor = (HttpRepoDescriptor) newDescriptor;
-                    //Set default proxy for automatically created new remote repos
-                    newRemoteDescriptor.setProxy(configDescriptor.defaultProxyDefined());
-                    //P2 remote repos list remote items by default, as we're not creating through the normal
-                    //model chain we have to set it here for new repos
-                    newRemoteDescriptor.setListRemoteFolderItems(
-                            RepoConfigDefaultValues.DEFAULT_LIST_REMOTE_ITEMS_SUPPORTED_TYPE);
-                    configDescriptor.addRemoteRepository(newRemoteDescriptor);
-                }
-                log.info("Remote repository {} is being created based on {}'s P2 config", newDescriptor.getKey(),
-                        repoDescriptor.getKey());
-            }
-            descriptorsToAdd.add(newDescriptor);
-        }
-        return descriptorsToAdd.stream().distinct().collect(Collectors.toList());
-    }
-
-    private ReverseProxyDescriptor getReverseProxyDescriptor(RepoBaseDescriptor repoDescriptor,
-            RepositoryConfigModel model) {
-        return model.getReverseProxyDescriptor(repoDescriptor, repoBuilder);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/GetAvailableRepositories.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/GetAvailableRepositories.java
deleted file mode 100644
index 9b681e7..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/GetAvailableRepositories.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.util;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.descriptor.repo.DockerApiVersion;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.repository.info.AvailableRepositories;
-import org.artifactory.ui.utils.RequestUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.function.Predicate;
-import java.util.stream.Collectors;
-
-
-/**
- * Retrieves the available repositories in the Virtual repository creation process
- *
- * @author Aviad Shikloshi
- */
- at Component("allAvailableRepositories")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetAvailableRepositories implements RestService {
-
-    @Autowired
-    private RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String type = request.getQueryParamByKey("type");
-        if (StringUtils.isBlank(type)) {
-            response.responseCode(HttpStatus.SC_BAD_REQUEST).error("Request must specify package type.");
-            return;
-        }
-        Predicate<RepoDescriptor> filter = getFilter(request, type);
-        List<String> localRepos = availableRepos(repositoryService.getLocalRepoDescriptors(), filter);
-        List<String> remoteRepos = availableRepos(repositoryService.getRemoteRepoDescriptors(), filter);
-        String currentRepoKey = RequestUtils.getRepoKeyFromRequest(request);
-        List<String> virtualRepos = availableVirtualRepos(currentRepoKey, filter);
-        AvailableRepositories allRepos = new AvailableRepositories(localRepos, remoteRepos, virtualRepos);
-        response.iModel(allRepos);
-    }
-
-    protected Predicate<RepoDescriptor> getFilter(ArtifactoryRestRequest request, String type) {
-        return repo -> filterByType(RepoType.valueOf(type), repo);
-    }
-
-    private boolean filterByType(RepoType type, RepoDescriptor repo) {
-        boolean isGeneric = type.equals(RepoType.Generic);
-        if (isGeneric) {
-            return true;
-        }
-
-        if (type.isMavenGroup()) {
-            return repo.getType().isMavenGroup();
-        }
-
-        boolean isDocker = type.equals(RepoType.Docker) && repo.getType().equals(RepoType.Docker);
-        if (isDocker) {
-            boolean isLocal = repo instanceof LocalRepoDescriptor;
-            if (isLocal) {
-                return DockerApiVersion.V2.equals(repo.getDockerApiVersion());
-            }
-        }
-
-        return repo.getType().equals(type);
-    }
-
-    /**
-     * List all available repositories that has the same package type as the new repository
-     *
-     * @param descriptors list of existing repository descriptors
-     * @param filter      The filter predicate
-     * @return repositories keys
-     */
-    private List<String> availableRepos(List<? extends RepoDescriptor> descriptors, Predicate<RepoDescriptor> filter) {
-        return descriptors.stream()
-                .filter(filter)
-                .map(RepoDescriptor::getKey)
-                .collect(Collectors.toList());
-    }
-
-    /**
-     * Collect all available virtual repositories keys, excluding the current repo key (in edit mode)
-     *
-     * @param repoKey the requesting current repo key
-     * @param filter  The filter predicate
-     * @return list of available keys
-     */
-    private List<String> availableVirtualRepos(String repoKey, Predicate<RepoDescriptor> filter) {
-        return repositoryService.getVirtualRepoDescriptors().stream()
-                .filter(filter)
-                .filter(virtualDescriptor -> !virtualDescriptor.getKey().equals(VirtualRepoDescriptor.GLOBAL_VIRTUAL_REPO_KEY))
-                .map(VirtualRepoDescriptor::getKey)
-                .filter(currentKey -> !StringUtils.equals(repoKey, currentKey)) //exclude current to avoid cycles
-                .collect(Collectors.toList());
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/GetAvailableRepositoryFields.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/GetAvailableRepositoryFields.java
deleted file mode 100644
index 96c0e56..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/GetAvailableRepositoryFields.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.util;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.repository.info.RepositoryFieldsValuesModel;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Aviad Shikloshi
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetAvailableRepositoryFields implements RestService<RepositoryFieldsValuesModel> {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Autowired
-    private RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        RepositoryFieldsValuesModel fields = new RepositoryFieldsValuesModel(centralConfigService.getDescriptor(),
-                repositoryService);
-        response.iModel(fields);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/GetDefaultRepositoryValues.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/GetDefaultRepositoryValues.java
deleted file mode 100644
index b05ed0d..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/GetDefaultRepositoryValues.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.util;
-
-import com.google.common.collect.Lists;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.propertysets.PropertySetNameModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.info.RepositoryDefaultValuesModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.local.LocalAdvancedRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.RemoteAdvancedRepositoryConfigModel;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetDefaultRepositoryValues implements RestService<RepositoryDefaultValuesModel> {
-
-    @Autowired
-    CentralConfigService configService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<RepositoryDefaultValuesModel> request, RestResponse response) {
-        RepositoryDefaultValuesModel defaultValues = new RepositoryDefaultValuesModel();
-        //Add artifactory prop set as default
-        configService.getDescriptor().getPropertySets().stream()
-                .filter(propertySet -> propertySet.getName().equals(PropertySet.ARTIFACTORY_RESERVED_PROP_SET))
-                .findAny().ifPresent(
-                artPropSet -> {
-                    ((LocalAdvancedRepositoryConfigModel) defaultValues.getDefaultModels()
-                            .get("localAdvanced")).setPropertySets(Lists.newArrayList(new PropertySetNameModel(artPropSet)));
-                    ((RemoteAdvancedRepositoryConfigModel) defaultValues.getDefaultModels()
-                            .get("remoteAdvanced")).setPropertySets(Lists.newArrayList(new PropertySetNameModel(artPropSet)));
-                });
-        response.iModel(defaultValues);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/GetDockerRepoService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/GetDockerRepoService.java
deleted file mode 100644
index 2a79144..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/GetDockerRepoService.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.util;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.CoreAddons;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.docker.repo.DockerRepo;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Shay Yaakov
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetDockerRepoService implements RestService {
-
-    @Autowired
-    private CentralConfigService configService;
-
-    @Autowired
-    private RepositoryService repoService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String repoKey = request.getQueryParamByKey("repoKey");
-        DockerRepo dockerRepo = new DockerRepo();
-        dockerRepo.setHostname(ContextHelper.get().beanForType(AddonsManager.class).addonByType(CoreAddons.class).getArtifactoryServerName());
-        if (repoService.localRepoDescriptorByKey(repoKey) != null) {
-            boolean deployToLocal = configService.getDescriptor().getVirtualRepositoriesMap().values().stream()
-                    .filter(descriptor -> RepoType.Docker.equals(descriptor.getType()))
-                    .anyMatch(descriptor -> {
-                        LocalRepoDescriptor defaultDeploymentRepo = descriptor.getDefaultDeploymentRepo();
-                        return defaultDeploymentRepo != null && repoKey.equals(defaultDeploymentRepo.getKey());
-                    });
-            dockerRepo.setDeployToLocal(deployToLocal);
-        }
-
-        response.responseCode(HttpStatus.SC_OK);
-        response.iModel(dockerRepo);
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/GetIndexerAvailableRepositories.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/GetIndexerAvailableRepositories.java
deleted file mode 100644
index 92173ee..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/GetIndexerAvailableRepositories.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.util;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.function.Predicate;
-
-
-/**
- * Retrieves the available repositories for maven indexer
- *
- * @author Shay Yaakov
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetIndexerAvailableRepositories extends GetAvailableRepositories {
-
-    @Override
-    protected Predicate<RepoDescriptor> getFilter(ArtifactoryRestRequest request, String type) {
-        String layout = request.getQueryParamByKey("layout");
-        return repo -> filterByType(RepoType.valueOf(type), repo) && filterByLayout(layout, repo);
-    }
-
-    private boolean filterByType(RepoType type, RepoDescriptor repo) {
-        return type.isMavenGroup() ? repo.getType().isMavenGroup() : repo.getType().equals(type);
-    }
-
-    private boolean filterByLayout(String layout, RepoDescriptor repo) {
-        RepoLayout repoLayout = repo.getRepoLayout();
-        return repo.getRepoLayout() == null || StringUtils.isNotBlank(layout) && layout.equals(repoLayout.getName());
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/GetRemoteRepoUrlMappingService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/GetRemoteRepoUrlMappingService.java
deleted file mode 100644
index 4fef038..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/GetRemoteRepoUrlMappingService.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.util;
-
-import com.google.common.collect.Maps;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.Map;
-import java.util.concurrent.ConcurrentMap;
-import java.util.stream.Collectors;
-
-/**
- * Maps all available urls FOR P2 ONLY (filtered by maven types)
- *
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetRemoteRepoUrlMappingService implements RestService<Map<String, String>> {
-
-    @Autowired
-    RepositoryService repoService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<Map<String, String>> request, RestResponse response) {
-        ConcurrentMap<String, String> repoKeyToUrl = Maps.newConcurrentMap();
-        repoService.getRemoteRepoDescriptors().parallelStream()
-                .filter(repoDesc -> repoDesc.getType().isMavenGroup())
-                .map(repoDesc -> repoKeyToUrl.put(repoDesc.getKey(), repoDesc.getUrl()))
-                .collect(Collectors.toList());
-        response.iModel(repoKeyToUrl);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/GetRepositoryInfoService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/GetRepositoryInfoService.java
deleted file mode 100644
index 24cbf7b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/GetRepositoryInfoService.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.util;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.repository.info.RepositoryInfo;
-import org.artifactory.ui.rest.model.admin.configuration.repository.info.RepositoryInfoListFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * @author Aviad Shikloshi
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetRepositoryInfoService implements RestService {
-
-    @Autowired
-    private RepositoryService repositoryService;
-
-    @Autowired
-    private CentralConfigService configService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String repoType = request.getPathParamByKey("repoType");
-        List<RepositoryInfo> repoInfo = RepositoryInfoListFactory.createRepositoryInfo(repoType, configService, repositoryService);
-        response.iModelList(repoInfo);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/GetResolvedRepositories.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/GetResolvedRepositories.java
deleted file mode 100644
index 80091de..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/GetResolvedRepositories.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.util;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.descriptor.repo.RealRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-import org.artifactory.descriptor.repo.VirtualRepoResolver;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.repository.GeneralRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.virtual.VirtualBasicRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.virtual.VirtualRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.virtual.VirtualSelectedRepository;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.exception.RepoConfigException;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.validator.RepoConfigValidator;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * Get all resolved repositories for the current virtual repository
- *
- * @author Aviad Shikloshi
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetResolvedRepositories<T extends VirtualRepositoryConfigModel> implements RestService<T> {
-
-    @Autowired
-    private RepositoryService repositoryService;
-
-    @Autowired
-    private RepoConfigValidator repoValidator;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-
-        VirtualRepositoryConfigModel virtualModel = request.getImodel();
-        VirtualBasicRepositoryConfigModel basic = virtualModel.getBasic();
-
-        try {
-            List<VirtualSelectedRepository> selectedRepositories = basic.getSelectedRepositories();
-            List<RepoDescriptor> selectedRepoDesc = selectedRepositories.stream()
-                    .map(this::getDescriptorFromKey)
-                    .collect(Collectors.toList());
-            repoValidator.validateSelectedReposInVirtualExist(selectedRepositories);
-            VirtualRepoResolver resolver = initRepositoriesResolverWithCurrentRepos(selectedRepoDesc,
-                    virtualModel.getGeneral());
-            List<RealRepoDescriptor> orderedRepos = resolver.getOrderedRepos();
-            selectedRepositories = orderedRepos.stream().map(VirtualSelectedRepository::new).collect(Collectors.toList());
-            response.iModelList(selectedRepositories);
-        } catch (RepoConfigException e) {
-            response.error(e.getMessage()).responseCode(e.getStatusCode());
-        }
-    }
-
-    // To avoid cache repository descriptor we will look the repository key first in virtual and than in remote and local
-    private RepoDescriptor getDescriptorFromKey(VirtualSelectedRepository repository) {
-        String repoKey = repository.getRepoName();
-        RepoDescriptor descriptor = repositoryService.virtualRepoDescriptorByKey(repoKey);
-        if (descriptor == null) {
-            descriptor = repositoryService.remoteRepoDescriptorByKey(repoKey);
-        }
-        if (descriptor == null) {
-            descriptor = repositoryService.localRepoDescriptorByKey(repoKey);
-        }
-        return descriptor;
-    }
-
-    /**
-     * Create repository resolver with our current data
-     *
-     * @param general        the repository general representation to extract repository key if exists
-     * @return virtual repository resolver using our up to date data
-     */
-    private VirtualRepoResolver initRepositoriesResolverWithCurrentRepos(List<RepoDescriptor> selectedRepoDesc,
-            GeneralRepositoryConfigModel general) {
-        VirtualRepoDescriptor virtualRepoDescriptor = new VirtualRepoDescriptor();
-        virtualRepoDescriptor.setRepositories(selectedRepoDesc);
-        String repoKey = StringUtils.EMPTY;
-        if (general != null && general.getRepoKey() != null) {
-            repoKey = general.getRepoKey();
-        }
-        virtualRepoDescriptor.setKey(repoKey);
-        return new VirtualRepoResolver(virtualRepoDescriptor);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/IsJcenterConfiguredService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/IsJcenterConfiguredService.java
deleted file mode 100644
index 6ea2a0e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/IsJcenterConfiguredService.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.util;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * Serves the remote search tab, when verifying if a  JCenter repo is configured in Artifactory.
- *
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class IsJcenterConfiguredService implements RestService {
-    private static final String DEFAULT_JCENTER_URL = "jcenter.bintray.com";
-
-    @Autowired
-    private CentralConfigService configService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        if (configService.getDescriptor().getRemoteRepositoriesMap().values().stream()
-                .filter(remoteRepoDescriptor -> remoteRepoDescriptor.getUrl().contains(DEFAULT_JCENTER_URL))
-                .findAny().isPresent()) {
-            response.responseCode(HttpStatus.SC_OK);
-        } else {
-            response.responseCode(HttpStatus.SC_NOT_FOUND);
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/RemoteRepositoryProvider.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/RemoteRepositoryProvider.java
deleted file mode 100644
index 556e831..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/RemoteRepositoryProvider.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.util;
-
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.RemoteNetworkRepositoryConfigModel;
-import org.artifactory.util.HttpClientConfigurator;
-
-/**
- * @author Aviad Shikloshi
- */
-public class RemoteRepositoryProvider {
-    protected static final int RETRY_COUNT = 1;
-    protected static final int DEFAULT_TIMEOUT = 15000;
-
-    public static CloseableHttpClient getRemoteRepoHttpClient(String remoteUrl,
-            RemoteNetworkRepositoryConfigModel networkConfig) {
-        // In case network model was not sent in the request we are using the default values
-        if (networkConfig == null) {
-            networkConfig = new RemoteNetworkRepositoryConfigModel();
-        }
-        CentralConfigService configService = ContextHelper.get().getCentralConfig();
-        ProxyDescriptor proxyDescriptor = configService.getDescriptor().getProxy(networkConfig.getProxy());
-        int socketTimeout =
-                networkConfig.getSocketTimeout() == null ? DEFAULT_TIMEOUT : networkConfig.getSocketTimeout();
-        return new HttpClientConfigurator()
-                .hostFromUrl(remoteUrl)
-                .connectionTimeout(socketTimeout)
-                .soTimeout(socketTimeout)
-                .staleCheckingEnabled(true)
-                .retry(RETRY_COUNT, false)
-                .localAddress(networkConfig.getLocalAddress())
-                .proxy(proxyDescriptor)
-                .authentication(networkConfig.getUsername(), CryptoHelper.decryptIfNeeded(networkConfig.getPassword()),
-                        networkConfig.getLenientHostAuth() != null)
-                .enableCookieManagement(networkConfig.getCookieManagement() != null)
-                .getClient();
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/RemoteRepositoryTestUrl.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/RemoteRepositoryTestUrl.java
deleted file mode 100644
index 10070aa..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/RemoteRepositoryTestUrl.java
+++ /dev/null
@@ -1,134 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.util;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.Header;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpRequestBase;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.RemoteAdvancedRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.RemoteBasicRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.RemoteNetworkRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.RemoteRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.typespecific.TypeSpecificConfigModel;
-import org.artifactory.util.HttpClientUtils;
-import org.artifactory.util.PathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-
-import static org.apache.http.HttpStatus.*;
-import static org.artifactory.ui.rest.service.admin.configuration.repositories.util.RemoteRepositoryProvider.getRemoteRepoHttpClient;
-
-/**
- * @author Aviad Shikloshi
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class RemoteRepositoryTestUrl<T extends RemoteRepositoryConfigModel> implements RestService<T> {
-    protected static final Logger log = LoggerFactory.getLogger(RemoteRepositoryTestUrl.class);
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> artifactoryRequest, RestResponse artifactoryResponse) {
-        RemoteRepositoryConfigModel repositoryModel = artifactoryRequest.getImodel();
-        testConnection(artifactoryResponse, repositoryModel);
-    }
-
-    public void testConnection(RestResponse artifactoryResponse, RemoteRepositoryConfigModel repositoryModel) {
-        RemoteAdvancedRepositoryConfigModel remoteRepoAdvancedModel = repositoryModel.getAdvanced();
-        RemoteBasicRepositoryConfigModel basicModel = repositoryModel.getBasic();
-        TypeSpecificConfigModel repoTypeModel = repositoryModel.getTypeSpecific();
-        if (!validateModels(artifactoryResponse, basicModel, remoteRepoAdvancedModel, repoTypeModel)) {
-            return;
-        }
-        String remoteRepoUrl = PathUtils.addTrailingSlash(basicModel.getUrl());
-        RemoteNetworkRepositoryConfigModel networkModel = remoteRepoAdvancedModel.getNetwork();
-        CloseableHttpResponse response = null;
-        CloseableHttpClient client = null;
-        try {
-            client = getRemoteRepoHttpClient(remoteRepoUrl, networkModel);
-            HttpRequestBase request = TestMethodFactory.createTestMethod(remoteRepoUrl, repoTypeModel.getRepoType(),
-                    remoteRepoAdvancedModel.getQueryParams());
-            response = client.execute(request);
-            int statusCode = response.getStatusLine().getStatusCode();
-            boolean success = testSucceeded(statusCode);
-            if (!success) {
-                IOUtils.closeQuietly(response);
-                success = handleSpecialCases(repositoryModel, client, response);
-            }
-            if (!success) {
-                artifactoryResponse.error("Connection failed: Error " + statusCode + ": "
-                        + response.getStatusLine().getReasonPhrase()).responseCode(SC_BAD_REQUEST);
-            } else {
-                artifactoryResponse.info("Successfully connected to server");
-            }
-        } catch (IOException e) {
-            artifactoryResponse.error("Connection failed with exception: " + HttpClientUtils.getErrorMessage(e))
-                    .responseCode(SC_BAD_REQUEST);
-            log.debug("Test connection to '" + remoteRepoUrl + "' failed with exception", e);
-        } finally {
-            IOUtils.closeQuietly(response);
-            IOUtils.closeQuietly(client);
-        }
-    }
-
-    private boolean handleSpecialCases(RemoteRepositoryConfigModel repositoryModel, CloseableHttpClient client,
-            CloseableHttpResponse response) throws IOException {
-        boolean success;
-        success = tryS3(client, repositoryModel, response.getFirstHeader("Server"));
-        if (!success) {
-            success = testDockerHub(response);
-        }
-        return success;
-    }
-
-    public boolean validateModels(RestResponse artifactoryResponse, RemoteBasicRepositoryConfigModel basicModel,
-            RemoteAdvancedRepositoryConfigModel remoteRepoAdvancedModel, TypeSpecificConfigModel repoTypeModel) {
-        if (remoteRepoAdvancedModel == null) {
-            artifactoryResponse.error("Network details was not sent.").responseCode(SC_BAD_REQUEST);
-            return false;
-        }
-        if (basicModel == null || StringUtils.isEmpty(basicModel.getUrl())) {
-            artifactoryResponse.error("Remote Url was not sent.").responseCode(SC_BAD_REQUEST);
-            return false;
-        }
-        if (repoTypeModel == null) {
-            artifactoryResponse.error("Package type was not sent.").responseCode(SC_BAD_REQUEST);
-            return false;
-        }
-        return true;
-    }
-
-    public boolean tryS3(CloseableHttpClient client, RemoteRepositoryConfigModel repoModel, final Header serverHeader)
-            throws IOException {
-        // S3 hosted repositories are not hierarchical and does not have a notion of "collection" (folder, directory)
-        // Therefore we should not add the trailing slash when testing them
-        if (serverHeader != null && "AmazonS3".equals(serverHeader.getValue())) {
-            log.debug("Remote repository is hosted on Amazon S3, trying without a trailing slash");
-            String remoteRepoUrl = repoModel.getAdvanced().getNetwork().getUrl();
-            HttpRequestBase request = TestMethodFactory.createTestMethod(remoteRepoUrl,
-                    repoModel.getTypeSpecific().getRepoType(), repoModel.getAdvanced().getQueryParams());
-            try (CloseableHttpResponse response = client.execute(request)) {
-                return testSucceeded(response.getStatusLine().getStatusCode());
-            }
-        }
-        return false;
-    }
-
-    private boolean testDockerHub(CloseableHttpResponse response) {
-        // Docker Hub is stupid
-        Header dockerHeader = response.getFirstHeader("Docker-Distribution-Api-Version");
-        return dockerHeader != null && dockerHeader.getValue().contains("registry");
-    }
-
-    private boolean testSucceeded(int statusCode) {
-        return (statusCode == SC_OK || statusCode == SC_NO_CONTENT || statusCode == SC_MOVED_TEMPORARILY);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/ReorderRepositoriesService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/ReorderRepositoriesService.java
deleted file mode 100644
index 8690ed2..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/ReorderRepositoriesService.java
+++ /dev/null
@@ -1,134 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.util;
-
-import com.google.common.collect.Maps;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.util.CollectionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import static org.apache.http.HttpStatus.SC_BAD_REQUEST;
-
-/**
- * Reorders the list of repositories based on a list sent by the UI
- *
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ReorderRepositoriesService implements RestService<List<String>> {
-    private static final Logger log = LoggerFactory.getLogger(ReorderRepositoriesService.class);
-
-    private static final String LOCAL_TYPE = "local";
-    private static final String REMOTE_TYPE = "remote";
-    private static final String VIRTUAL_TYPE = "virtual";
-    private static final String DISTRIBUTION_TYPE = "distribution";
-
-    @Autowired
-    private CentralConfigService configService;
-
-    @Override
-    @SuppressWarnings("unchecked") //yeah this code is disgusting, no time for something else
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String repoType = request.getPathParamByKey("repoType");
-        log.debug("Processing reorder repos request for type {}", repoType);
-        if (StringUtils.isBlank(repoType)) {
-            response.error("The type of repositories to reorder must be specified").responseCode(SC_BAD_REQUEST);
-        }
-        List<String> newOrderRepoKeyList = request.getModels();
-        if (CollectionUtils.isNullOrEmpty(newOrderRepoKeyList)) {
-            response.error("No list to reorder by was sent.").responseCode(SC_BAD_REQUEST);
-            return;
-        }
-        Map<String, ? extends RepoDescriptor> currentRepoMap;
-        MutableCentralConfigDescriptor mutableDescriptor = configService.getMutableDescriptor();
-        switch (repoType) {
-            case LOCAL_TYPE:
-                currentRepoMap = configService.getDescriptor().getLocalRepositoriesMap();
-                LinkedHashMap<String, LocalRepoDescriptor> localMap = (LinkedHashMap<String, LocalRepoDescriptor>)
-                        getNewOrderRepoMap(response, repoType, newOrderRepoKeyList, currentRepoMap);
-                if (localMap.size() > 0) {
-                    mutableDescriptor.setLocalRepositoriesMap(localMap);
-                    configService.saveEditedDescriptorAndReload(mutableDescriptor);
-                }
-                break;
-            case REMOTE_TYPE:
-                currentRepoMap = configService.getDescriptor().getRemoteRepositoriesMap();
-                LinkedHashMap<String, RemoteRepoDescriptor> remoteMap = (LinkedHashMap<String, RemoteRepoDescriptor>)
-                        getNewOrderRepoMap(response, repoType, newOrderRepoKeyList, currentRepoMap);
-                if (remoteMap.size() > 0) {
-                    mutableDescriptor.setRemoteRepositoriesMap(remoteMap);
-                    configService.saveEditedDescriptorAndReload(mutableDescriptor);
-                }
-                break;
-            case VIRTUAL_TYPE:
-                currentRepoMap = configService.getDescriptor().getVirtualRepositoriesMap();
-                LinkedHashMap<String, VirtualRepoDescriptor> virtualMap = (LinkedHashMap<String, VirtualRepoDescriptor>)
-                        getNewOrderRepoMap(response, repoType, newOrderRepoKeyList, currentRepoMap);
-                if (virtualMap.size() > 0) {
-                    mutableDescriptor.setVirtualRepositoriesMap(virtualMap);
-                    configService.saveEditedDescriptorAndReload(mutableDescriptor);
-                }
-                break;
-            case DISTRIBUTION_TYPE:
-                currentRepoMap = configService.getDescriptor().getDistributionRepositoriesMap();
-                LinkedHashMap<String, DistributionRepoDescriptor> distributionMap = (LinkedHashMap<String, DistributionRepoDescriptor>)
-                        getNewOrderRepoMap(response, repoType, newOrderRepoKeyList, currentRepoMap);
-                if (distributionMap.size() > 0) {
-                    mutableDescriptor.setDistributionRepositoriesMap(distributionMap);
-                    configService.saveEditedDescriptorAndReload(mutableDescriptor);
-                }
-                break;
-            default:
-                response.error("Invalid repository type given: " + repoType).responseCode(SC_BAD_REQUEST);
-        }
-    }
-
-    private LinkedHashMap<String, ? extends RepoDescriptor> getNewOrderRepoMap(RestResponse<? extends Object> response,
-            String repoType,
-            List<String> newOrderRepoKeyList, Map<String, ? extends RepoDescriptor> currentRepoMap) {
-        LinkedHashMap<String, RepoDescriptor> newRepoMap = Maps.newLinkedHashMap();
-        if (isLegalReorder(response, repoType, newOrderRepoKeyList, currentRepoMap)) {
-            for (String repoKey : newOrderRepoKeyList) {
-                newRepoMap.put(repoKey, currentRepoMap.get(repoKey));
-            }
-            log.info("Reordering {} repositories list.", repoType);
-        }
-        return newRepoMap;
-    }
-
-    private boolean isLegalReorder(RestResponse response, String repoType, List<String> newOrderRepoKeyList,
-            Map<String, ? extends RepoDescriptor> currentRepoMap) {
-        Set<String> oldOrderRepoKeys = currentRepoMap.keySet();
-        if (oldOrderRepoKeys.size() != newOrderRepoKeyList.size()) {
-            log.debug("Current {} repo map size: {}", repoType, oldOrderRepoKeys.size());
-            log.debug("New Order list size : {}", newOrderRepoKeyList.size());
-            response.error("The size of the list to order by does not match the size of the current repo list, " +
-                    "aborting.").responseCode(SC_BAD_REQUEST);
-            return false;
-        } else if (!newOrderRepoKeyList.containsAll(oldOrderRepoKeys)) {
-            response.error("The new order list is missing \\ has excess repositories that are currently saved." +
-                    repoType).responseCode(SC_BAD_REQUEST);
-            return false;
-        }
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/SmartRepoCapabilitiesDiscoveringService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/SmartRepoCapabilitiesDiscoveringService.java
deleted file mode 100644
index 439a67c..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/SmartRepoCapabilitiesDiscoveringService.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ui.rest.service.admin.configuration.repositories.util;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.artifactory.api.jackson.JacksonFactory;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.ResearchService;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.RemoteAdvancedRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.RemoteBasicRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.RemoteNetworkRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.RemoteRepositoryConfigModel;
-import org.artifactory.util.PathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-
-/**
- * Checks whether remoteRepo is an Artifactory instance and if
- * so, retrieves its capabilities for the given version
- *
- * @author Michael Pasternak
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class SmartRepoCapabilitiesDiscoveringService<T extends RemoteRepositoryConfigModel> implements RestService<T> {
-    protected static final Logger log = LoggerFactory.getLogger(SmartRepoCapabilitiesDiscoveringService.class);
-
-    @Autowired
-    ResearchService researchService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> artifactoryRequest, RestResponse artifactoryResponse) {
-
-        RemoteRepositoryConfigModel repositoryModel = artifactoryRequest.getImodel();
-        RemoteAdvancedRepositoryConfigModel remoteRepoAdvancedModel = repositoryModel.getAdvanced();
-        if (remoteRepoAdvancedModel == null) {
-            artifactoryResponse.error("Network details was not sent.")
-                    .responseCode(HttpStatus.SC_BAD_REQUEST);
-            return;
-        }
-        RemoteBasicRepositoryConfigModel basicModel = repositoryModel.getBasic();
-        if (basicModel == null || StringUtils.isEmpty(basicModel.getUrl())) {
-            artifactoryResponse.error("Remote Url was not sent.")
-                    .responseCode(HttpStatus.SC_BAD_REQUEST);
-            return;
-        }
-        String remoteRepoUrl = PathUtils.addTrailingSlash(basicModel.getUrl());
-        if (remoteRepoUrl == null) {
-            artifactoryResponse.error("Remote repo url was not sent.")
-                    .responseCode(HttpStatus.SC_BAD_REQUEST);
-            return;
-        }
-        RemoteNetworkRepositoryConfigModel networkModel = remoteRepoAdvancedModel.getNetwork();
-        CloseableHttpClient client = null;
-        try {
-            client = RemoteRepositoryProvider.getRemoteRepoHttpClient(remoteRepoUrl, networkModel);
-            artifactoryResponse
-                    .iModel(JacksonFactory.createObjectMapper().writeValueAsString(
-                            researchService.getSmartRepoCapabilities(remoteRepoUrl, client)))
-                    .responseCode(HttpStatus.SC_OK);
-        } catch (IOException e) {
-            log.error("Cannot serialize SmartRepoCapabilities", e);
-            artifactoryResponse.responseCode(HttpStatus.SC_INTERNAL_SERVER_ERROR);
-        } finally {
-            IOUtils.closeQuietly(client);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/TestMethodFactory.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/TestMethodFactory.java
deleted file mode 100644
index 926f623..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/TestMethodFactory.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.util;
-
-
-import com.google.common.base.Charsets;
-import com.sun.istack.internal.Nullable;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.NameValuePair;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpHead;
-import org.apache.http.client.methods.HttpRequestBase;
-import org.apache.http.client.utils.URIBuilder;
-import org.apache.http.client.utils.URLEncodedUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.util.HttpUtils;
-import org.artifactory.util.PathUtils;
-
-import java.net.URISyntaxException;
-import java.util.List;
-
-import static org.artifactory.request.ArtifactoryRequest.ARTIFACTORY_ORIGINATED;
-
-/**
- * Create Http request for test replication button
- *
- * @author Aviad Shikloshi
- */
-public class TestMethodFactory {
-
-    public static HttpRequestBase createTestMethod(String repoUrl, RepoType repoType, @Nullable String queryParams) {
-
-        if (repoType == null) {
-            throw new RuntimeException("Missing repository type");
-        }
-        HttpRequestBase request;
-        switch (repoType) {
-            case NuGet:
-                request = createNuGetTestMethod(repoUrl, queryParams);
-                break;
-            case Gems:
-                request = createGemsTestMethod(repoUrl);
-                break;
-            case Docker:
-                request = createDockerTestMethod(repoUrl);
-                break;
-            default:
-                request = new HttpHead(HttpUtils.encodeQuery(repoUrl));
-                //Add the current requester host id
-        }
-        addOriginatedHeader(request);
-        return request;
-    }
-
-    /**
-     * add originated header to request
-     *
-     * @param request - http servlet request
-     */
-    public static void addOriginatedHeader(HttpRequestBase request) {
-        String hostId = ContextHelper.get().beanForType(AddonsManager.class).addonByType(HaCommonAddon.class).getHostId();
-        request.addHeader(ARTIFACTORY_ORIGINATED, hostId);
-    }
-
-    private static HttpRequestBase createGemsTestMethod(String repoUrl) {
-        String path = repoUrl;
-        if (path.endsWith("/")) {
-            path = PathUtils.trimTrailingSlashes(path);
-        }
-        path += "/api/v1/dependencies";
-        return new HttpGet(path);
-    }
-
-    private static HttpRequestBase createNuGetTestMethod(String repoUrl, String queryParams) {
-        try {
-            URIBuilder uriBuilder = new URIBuilder(repoUrl);
-            HttpRequestBase request = new HttpGet();
-            if(StringUtils.isNotBlank(queryParams)) {
-                List<NameValuePair> queryParamsMap = URLEncodedUtils.parse(queryParams, Charsets.UTF_8);
-                uriBuilder.setParameters(queryParamsMap);
-            }
-            request.setURI(uriBuilder.build());
-            return request;
-        } catch (URISyntaxException e) {
-            throw new RuntimeException("Failed to build test URI", e);
-        }
-    }
-
-    private static HttpRequestBase createDockerTestMethod(String repoUrl) {
-        String path = repoUrl;
-        if (path.endsWith("/")) {
-            path = PathUtils.trimTrailingSlashes(path);
-        }
-        path += "/v2/";
-        return new HttpGet(path);
-    }
-
-    private TestMethodFactory() {
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/UpdateRepoConfigHelper.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/UpdateRepoConfigHelper.java
deleted file mode 100644
index 709bde2..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/UpdateRepoConfigHelper.java
+++ /dev/null
@@ -1,145 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.util;
-
-import org.artifactory.addon.p2.P2Repo;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.replication.RemoteReplicationDescriptor;
-import org.artifactory.descriptor.repo.*;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.ui.rest.model.admin.configuration.repository.distribution.DistributionRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.local.LocalRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.RemoteRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.typespecific.P2TypeSpecificConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.virtual.VirtualRepositoryConfigModel;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.replication.ReplicationConfigService;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.builder.ReplicationConfigDescriptorBuilder;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.builder.RepoConfigDescriptorBuilder;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.exception.RepoConfigException;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.validator.ReplicationConfigValidator;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.validator.RepoConfigValidator;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * Delegate helper for creating and persisting repo config
- *
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateRepoConfigHelper {
-    private static final Logger log = LoggerFactory.getLogger(UpdateRepoConfigHelper.class);
-
-    @Autowired
-    private RepositoryService repoService;
-
-    @Autowired
-    private RepoConfigDescriptorBuilder builder;
-
-    @Autowired
-    private RepoConfigValidator validator;
-
-    @Autowired
-    private ReplicationConfigDescriptorBuilder replicationBuilder;
-
-    @Autowired
-    private ReplicationConfigService replicationConfigService;
-
-    @Autowired
-    private ReplicationConfigValidator replicationValidator;
-
-    @Autowired
-    private CentralConfigService configService;
-
-    @Autowired
-    private CreateRepoConfigHelper creator;
-
-    public void handleLocal(LocalRepositoryConfigModel model) throws RepoConfigException {
-        MutableCentralConfigDescriptor configDescriptor = configService.getMutableDescriptor();
-        log.debug("Model resolved to local repo descriptor, updating.");
-        String repoKey = model.getGeneral().getRepoKey();
-        LocalRepoDescriptor repoDescriptor = model.toDescriptor(validator, builder);
-        ReverseProxyDescriptor reverseProxyDescriptor = model.getReverseProxyDescriptor(repoDescriptor, builder);
-        Set<LocalReplicationDescriptor> replications = model.getReplicationDescriptors(replicationValidator,
-                replicationBuilder);
-        log.debug("Updating descriptor for {}.", repoKey);
-        configDescriptor.updateReverseProxy(reverseProxyDescriptor);
-        configDescriptor.getLocalRepositoriesMap().put(repoDescriptor.getKey(), repoDescriptor);
-        replicationConfigService.updateLocalReplications(replications, repoKey, configDescriptor);
-        configService.saveEditedDescriptorAndReload(configDescriptor);
-    }
-
-    public void handleRemote(RemoteRepositoryConfigModel model) throws IOException, RepoConfigException {
-        log.debug("Model resolved to remote repo descriptor, updating.");
-        MutableCentralConfigDescriptor configDescriptor = configService.getMutableDescriptor();
-        String repoKey = model.getGeneral().getRepoKey();
-        HttpRepoDescriptor repoDescriptor = model.toDescriptor(validator, builder);
-        ReverseProxyDescriptor reverseProxyDescriptor = model.getReverseProxyDescriptor(repoDescriptor, builder);
-        configDescriptor.updateReverseProxy(reverseProxyDescriptor);
-        RemoteReplicationDescriptor replication = model.getReplicationDescriptor(replicationValidator,
-                replicationBuilder);
-        log.debug("Updating descriptor for {}.", repoDescriptor.getKey());
-        if (replication != null) {
-            replicationConfigService.updateRemoteReplication(replication, repoDescriptor, configDescriptor);
-        }
-
-        configDescriptor.getRemoteRepositoriesMap().put(repoKey, repoDescriptor);
-        configService.saveEditedDescriptorAndReload(configDescriptor);
-    }
-
-    public void handleVirtual(VirtualRepositoryConfigModel model) throws RepoConfigException {
-        log.debug("Model resolved to virtual repo descriptor, updating.");
-        MutableCentralConfigDescriptor configDescriptor = configService.getMutableDescriptor();
-        String repoKey = model.getGeneral().getRepoKey();
-        VirtualRepoDescriptor repoDescriptor = model.toDescriptor(validator, builder);
-        ReverseProxyDescriptor reverseProxyDescriptor = model.getReverseProxyDescriptor(repoDescriptor, builder);
-        configDescriptor.updateReverseProxy(reverseProxyDescriptor);
-        if (repoDescriptor.getType().equals(RepoType.P2)) {
-            updateP2Config(configDescriptor, repoDescriptor,
-                    ((P2TypeSpecificConfigModel) model.getTypeSpecific()).getP2Repos());
-        }
-        log.debug("Updating descriptor for {}.", repoDescriptor.getKey());
-        configDescriptor.getVirtualRepositoriesMap().put(repoKey, repoDescriptor);
-        configService.saveEditedDescriptorAndReload(configDescriptor);
-    }
-
-    public void handleDistribution(DistributionRepositoryConfigModel model) throws RepoConfigException {
-        MutableCentralConfigDescriptor configDescriptor = configService.getMutableDescriptor();
-        log.debug("Model resolved to distribution repo descriptor, updating.");
-        String repoKey = model.getGeneral().getRepoKey();
-        DistributionRepoDescriptor repoDescriptor = model.toDescriptor(validator, builder);
-        ReverseProxyDescriptor reverseProxyDescriptor = model.getReverseProxyDescriptor(repoDescriptor, builder);
-        //TODO [by dan]:
-        /*Set<LocalReplicationDescriptor> replications = model.getReplicationDescriptors(replicationValidator,
-                replicationBuilder);*/
-        log.debug("Updating descriptor for {}.", repoKey);
-        configDescriptor.updateReverseProxy(reverseProxyDescriptor);
-        configDescriptor.getDistributionRepositoriesMap().put(repoDescriptor.getKey(), repoDescriptor);
-        //TODO [by dan]:
-        //replicationConfigService.updateLocalReplications(replications, repoKey, configDescriptor);
-        configService.saveEditedDescriptorAndReload(configDescriptor);
-    }
-
-    private void updateP2Config(MutableCentralConfigDescriptor configDescriptor, VirtualRepoDescriptor repoDescriptor,
-            List<P2Repo> requestedRepos) {
-        log.debug("Updating P2 config for repo {}", repoDescriptor.getKey());
-        //Preserve all already-aggregated virtual repos this repo might have for backwards compatibility although
-        // we don't allow adding new ones anymore, and append to the ones returned by the P2 config logic
-        List<RepoDescriptor> reposToAdd = repoService.virtualRepoDescriptorByKey(repoDescriptor.getKey())
-                .getRepositories().stream()
-                .filter(aggregatedRepo -> !aggregatedRepo.isReal()).collect(Collectors.toList());
-        reposToAdd.addAll(creator.validateAndCreateP2ConfigRepos(configDescriptor, repoDescriptor, requestedRepos));
-        repoDescriptor.setRepositories(reposToAdd);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/builder/ReplicationConfigDescriptorBuilder.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/builder/ReplicationConfigDescriptorBuilder.java
deleted file mode 100644
index 4d5466d..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/builder/ReplicationConfigDescriptorBuilder.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.util.builder;
-
-import com.google.common.collect.Sets;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.replication.RemoteReplicationDescriptor;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.ui.rest.model.admin.configuration.repository.replication.local.LocalReplicationConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.replication.remote.RemoteReplicationConfigModel;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.Set;
-
-/**
- * Utility class for converting model to descriptor
- *
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ReplicationConfigDescriptorBuilder {
-
-    @Autowired
-    CentralConfigService centralConfig;
-
-    public Set<LocalReplicationDescriptor> buildLocalReplications(List<LocalReplicationConfigModel> models, String repoKey) {
-        Set<LocalReplicationDescriptor> descriptors = Sets.newHashSet();
-        for (LocalReplicationConfigModel model : models) {
-            LocalReplicationDescriptor descriptor = buildLocalReplication(model, repoKey);
-            descriptors.add(descriptor);
-        }
-        return descriptors;
-    }
-
-    public LocalReplicationDescriptor buildLocalReplication(LocalReplicationConfigModel model, String repoKey) {
-        LocalReplicationDescriptor descriptor = new LocalReplicationDescriptor();
-        descriptor.setEnableEventReplication(model.isEnableEventReplication());
-        descriptor.setUrl(model.getUrl());
-        descriptor.setUsername(model.getUsername());
-        descriptor.setPassword(CryptoHelper.encryptIfNeeded(model.getPassword()));
-        descriptor.setProxy(centralConfig.getDescriptor().getProxy(model.getProxy()));
-        descriptor.setSocketTimeoutMillis(model.getSocketTimeout());
-        descriptor.setCronExp(model.getCronExp());
-        descriptor.setEnabled(model.isEnabled());
-        descriptor.setRepoKey(repoKey);
-        descriptor.setSyncDeletes(model.isSyncDeletes());
-        descriptor.setSyncProperties(model.isSyncProperties());
-        descriptor.setPathPrefix(model.getPathPrefix());
-        return descriptor;
-    }
-
-    public RemoteReplicationDescriptor buildRemoteReplication(RemoteReplicationConfigModel model, String repoKey) {
-        RemoteReplicationDescriptor descriptor = new RemoteReplicationDescriptor();
-        descriptor.setSyncDeletes(model.isSyncDeletes());
-        descriptor.setSyncProperties(model.isSyncProperties());
-        descriptor.setRepoKey(repoKey);
-        descriptor.setEnabled(model.isEnabled());
-        descriptor.setCronExp(model.getCronExp());
-        descriptor.setPathPrefix(model.getPathPrefix());
-        return descriptor;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/builder/RepoConfigDescriptorBuilder.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/builder/RepoConfigDescriptorBuilder.java
deleted file mode 100644
index 27603ba..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/builder/RepoConfigDescriptorBuilder.java
+++ /dev/null
@@ -1,494 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.util.builder;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.p2.P2Repo;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.descriptor.repo.*;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.ui.rest.model.admin.configuration.propertysets.PropertySetNameModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.AdvancedRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.BasicRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.GeneralRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.distribution.DistributionAdvancedRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.distribution.DistributionBasicRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.distribution.DistributionRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.local.LocalRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.*;
-import org.artifactory.ui.rest.model.admin.configuration.repository.typespecific.*;
-import org.artifactory.ui.rest.model.admin.configuration.repository.virtual.VirtualAdvancedRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.virtual.VirtualBasicRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.virtual.VirtualRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.reverseProxy.ReverseProxyRepoModel;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.validator.RepoConfigValidator;
-import org.artifactory.util.PathUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * Utility class for converting model to descriptor
- *
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class RepoConfigDescriptorBuilder {
-
-    @Autowired
-    CentralConfigService centralConfig;
-
-    @Autowired
-    AddonsManager addonsManager;
-
-    @Autowired
-    RepositoryService repoService;
-
-    @Autowired
-    RepoConfigValidator configValidator;
-
-    public LocalRepoDescriptor buildLocalDescriptor(LocalRepositoryConfigModel model) {
-        LocalRepoDescriptor descriptor = new LocalRepoDescriptor();
-        populateSharedGeneralDescriptorValues(model.getGeneral(), descriptor);
-        populateSharedBasicDescriptorValues(model.getBasic(), descriptor);
-        populateSharedAdvancedDescriptorValues(model.getAdvanced(), descriptor);
-        populateSharedTypeSpecificDescriptorValues(model.getTypeSpecific(), descriptor);
-        populateLocalTypeSpecificDescriptorValues(model.getTypeSpecific(), descriptor);
-        return descriptor;
-    }
-
-    public HttpRepoDescriptor buildRemoteDescriptor(RemoteRepositoryConfigModel model) {
-        HttpRepoDescriptor descriptor = new HttpRepoDescriptor();
-        populateSharedGeneralDescriptorValues(model.getGeneral(), descriptor);
-        populateSharedBasicDescriptorValues(model.getBasic(), descriptor);
-        populateRemoteBasicDescriptorValues(model.getBasic(), descriptor);
-        populateSharedAdvancedDescriptorValues(model.getAdvanced(), descriptor);
-        populateRemoteAdvancedDescriptorValues(model.getAdvanced(), descriptor);
-        populateSharedTypeSpecificDescriptorValues(model.getTypeSpecific(), descriptor);
-        populateRemoteTypeSpecificDescriptorValues(model.getTypeSpecific(), descriptor);
-        return descriptor;
-    }
-
-    public VirtualRepoDescriptor buildVirtualDescriptor(VirtualRepositoryConfigModel model) {
-        VirtualRepoDescriptor descriptor = new VirtualRepoDescriptor();
-        populateSharedGeneralDescriptorValues(model.getGeneral(), descriptor);
-        populateSharedBasicDescriptorValues(model.getBasic(), descriptor);
-        populateVirtualBasicDescriptorValues(model.getBasic(), descriptor);
-        populateVirtualAdvancedDescriptorValues(model.getAdvanced(), descriptor);
-        populateVirtualTypeSpecific(model.getTypeSpecific(), descriptor);
-        return descriptor;
-    }
-
-    public DistributionRepoDescriptor buildDistributionDescriptor(DistributionRepositoryConfigModel model) {
-        DistributionRepoDescriptor descriptor = new DistributionRepoDescriptor();
-        populateSharedGeneralDescriptorValues(model.getGeneral(), descriptor);
-        populateSharedBasicDescriptorValues(model.getBasic(), descriptor);
-        populateDistributionBasicDescriptorValues(model.getBasic(), descriptor);
-        populateSharedAdvancedDescriptorValues(model.getAdvanced(), descriptor);
-        populateDistributionAdvancedDescriptorValues(model.getAdvanced(), descriptor);
-        descriptor.setType(RepoType.Distribution);
-        descriptor.setBintrayApplication(centralConfig.getDescriptor()
-                .getBintrayApplication(model.getTypeSpecific().getBintrayAppConfig()));
-        return descriptor;
-    }
-
-    private void populateDistributionBasicDescriptorValues(DistributionBasicRepositoryConfigModel basic,
-            DistributionRepoDescriptor descriptor) {
-        descriptor.setProductName(basic.getProductName());
-        descriptor.setDefaultNewRepoPrivate(basic.getDefaultNewRepoPrivate());
-        descriptor.setDefaultNewRepoPremium(basic.getDefaultNewRepoPremium());
-        descriptor.setDefaultLicenses(basic.getDefaultLicenses());
-        descriptor.setDefaultVcsUrl(basic.getDefaultVcsUrl());
-    }
-
-    private void populateDistributionAdvancedDescriptorValues(DistributionAdvancedRepositoryConfigModel advanced,
-            DistributionRepoDescriptor descriptor) {
-        descriptor.setRules(advanced.getDistributionRules());
-        if(StringUtils.isNotBlank(advanced.getProxy())) {
-            descriptor.setProxy(centralConfig.getDescriptor().getProxy(advanced.getProxy()));
-        }
-        descriptor.setWhiteListedProperties(advanced.getWhiteListedProperties());
-        descriptor.setGpgSign(advanced.isGpgSign());
-        descriptor.setGpgPassPhrase(advanced.getGpgPassPhrase());
-    }
-
-    private void populateSharedGeneralDescriptorValues(GeneralRepositoryConfigModel model, RepoBaseDescriptor descriptor) {
-        descriptor.setKey(model.getRepoKey());
-    }
-
-    /**
-     * Populates basic descriptor values that are shared between local and remote repos
-     */
-    private void populateSharedBasicDescriptorValues(BasicRepositoryConfigModel model, RepoBaseDescriptor descriptor) {
-        descriptor.setDescription(model.getPublicDescription());
-        descriptor.setNotes(model.getInternalDescription());
-        descriptor.setIncludesPattern(model.getIncludesPattern());
-        descriptor.setExcludesPattern(model.getExcludesPattern());
-        if (StringUtils.isNotBlank(model.getLayout())) { //Don't enforce on virtual
-            descriptor.setRepoLayout(centralConfig.getDescriptor().getRepoLayout(model.getLayout()));
-        }
-    }
-
-    /**
-     * Populates remote basic descriptor values
-     */
-    private void populateRemoteBasicDescriptorValues(RemoteBasicRepositoryConfigModel model,
-            HttpRepoDescriptor descriptor) {
-        descriptor.setUrl(model.getUrl());
-        if (model.getRemoteLayoutMapping() != null) {
-            descriptor.setRemoteRepoLayout(centralConfig.getDescriptor().getRepoLayout(model.getRemoteLayoutMapping()));
-        }
-        descriptor.setOffline(model.isOffline());
-        descriptor.setContentSynchronisation(model.getContentSynchronisation());
-    }
-
-    private void populateVirtualBasicDescriptorValues(VirtualBasicRepositoryConfigModel model,
-            VirtualRepoDescriptor descriptor) {
-        descriptor.setRepositories(model.getSelectedRepositories().stream()
-                .map(configValidator::mapRepoKeyToDescriptor)
-                .filter(selectedDescriptor -> selectedDescriptor != null)
-                .collect(Collectors.toList()));
-        if (StringUtils.isNotBlank(model.getDefaultDeploymentRepo())) {
-            descriptor.setDefaultDeploymentRepo(repoService.localRepoDescriptorByKey(model.getDefaultDeploymentRepo()));
-        }
-    }
-
-    private void populateVirtualAdvancedDescriptorValues(VirtualAdvancedRepositoryConfigModel model,
-                                                         VirtualRepoDescriptor descriptor) {
-        descriptor.setArtifactoryRequestsCanRetrieveRemoteArtifacts(model.getRetrieveRemoteArtifacts());
-        buildReverseProxyDescriptor(model, descriptor);
-    }
-
-    /**
-     * Populates advanced descriptor values that are shared between local and remote repos
-     */
-    private void populateSharedAdvancedDescriptorValues(AdvancedRepositoryConfigModel model,
-                                                        RealRepoDescriptor descriptor) {
-        descriptor.setBlackedOut(model.isBlackedOut());
-        descriptor.setArchiveBrowsingEnabled(model.getAllowContentBrowsing());
-        List<PropertySetNameModel> propertySets = model.getPropertySets();
-        if (propertySets != null) {
-            descriptor.setPropertySets(model.getPropertySets().stream()
-                    .map(propSet -> getPropSetByName(propSet.getName()))
-                    .filter(propSet -> propSet != null)
-                    .collect(Collectors.toList()));
-        }
-        buildReverseProxyDescriptor(model, descriptor);
-    }
-
-    public ReverseProxyDescriptor buildReverseProxyDescriptor(AdvancedRepositoryConfigModel model,
-                                                              RepoBaseDescriptor descriptor){
-        ReverseProxyRepoModel reverseProxy = model.getReverseProxy();
-        MutableCentralConfigDescriptor mutableDescriptor = ContextHelper.get().getCentralConfig().getMutableDescriptor();
-        ReverseProxyDescriptor reverseProxyDescriptor = mutableDescriptor.getCurrentReverseProxy();
-        if (reverseProxy != null && reverseProxyDescriptor != null) {
-            if (reverseProxy.getServerPort() == null) {
-                reverseProxyDescriptor.deleteReverseProxyConfig(descriptor.getKey());
-            } else {
-                ReverseProxyRepoConfig reverseProxyRepoConfig = new ReverseProxyRepoConfig();
-                reverseProxyRepoConfig.setServerName(reverseProxy.getServerName());
-                reverseProxyRepoConfig.setPort(reverseProxy.getServerPort());
-                reverseProxyRepoConfig.setRepoRef(descriptor);
-                reverseProxyDescriptor.addReverseProxyRepoConfig(reverseProxyRepoConfig);
-            }
-        }
-        return reverseProxyDescriptor;
-    }
-
-    /**
-     * Populates remote advanced descriptor values
-     */
-    private void populateRemoteAdvancedDescriptorValues(RemoteAdvancedRepositoryConfigModel model,
-            HttpRepoDescriptor descriptor) {
-        //network
-        RemoteNetworkRepositoryConfigModel network = model.getNetwork();
-        if (network != null) {
-            if(StringUtils.isNotBlank(network.getProxy())) {
-                descriptor.setProxy(centralConfig.getDescriptor().getProxy(network.getProxy()));
-            }
-            descriptor.setLocalAddress(network.getLocalAddress());
-            descriptor.setUsername(network.getUsername());
-            descriptor.setPassword(CryptoHelper.encryptIfNeeded(network.getPassword()));
-            descriptor.setSocketTimeoutMillis(network.getSocketTimeout());
-            descriptor.setAllowAnyHostAuth(network.getLenientHostAuth());
-            descriptor.setEnableCookieManagement(network.getCookieManagement());
-        }
-        //cache
-        RemoteCacheRepositoryConfigModel cache = model.getCache();
-        if (cache != null) {
-            descriptor.setUnusedArtifactsCleanupPeriodHours(cache.getKeepUnusedArtifactsHours());
-            descriptor.setRetrievalCachePeriodSecs(cache.getRetrievalCachePeriodSecs());
-            descriptor.setAssumedOfflinePeriodSecs(cache.getAssumedOfflineLimitSecs());
-            descriptor.setMissedRetrievalCachePeriodSecs(cache.getMissedRetrievalCachePeriodSecs());
-        }
-        //other
-        descriptor.setQueryParams(model.getQueryParams());
-        descriptor.setPropagateQueryParams(model.isPropagateQueryParams());
-        descriptor.setHardFail(model.getHardFail());
-        descriptor.setStoreArtifactsLocally(model.isStoreArtifactsLocally());
-        descriptor.setSynchronizeProperties(model.getSynchronizeArtifactProperties());
-        descriptor.setShareConfiguration(model.isShareConfiguration());
-        descriptor.setBlockMismatchingMimeTypes(model.isBlockMismatchingMimeTypes());
-        descriptor.setMismatchingMimeTypesOverrideList(
-                PathUtils.collectionToDelimitedString(model.getMismatchingMimeTypesOverrideList()));
-    }
-
-    /**
-     * Populates type specific values shared by local and remote repos
-     */
-    private void populateSharedTypeSpecificDescriptorValues(TypeSpecificConfigModel type,
-            RealRepoDescriptor descriptor) {
-        descriptor.setType(type.getRepoType());
-        switch (type.getRepoType()) {
-            case Maven:
-            case Gradle:
-            case Ivy:
-            case SBT:
-                MavenTypeSpecificConfigModel maven = (MavenTypeSpecificConfigModel) type;
-                descriptor.setMaxUniqueSnapshots(maven.getMaxUniqueSnapshots());
-                descriptor.setHandleReleases(maven.getHandleReleases());
-                descriptor.setHandleSnapshots(maven.getHandleSnapshots());
-                descriptor.setSuppressPomConsistencyChecks(maven.getSuppressPomConsistencyChecks());
-                break;
-            case NuGet:
-                descriptor.setForceNugetAuthentication(((NugetTypeSpecificConfigModel) type).isForceNugetAuthentication());
-                break;
-        }
-    }
-
-    /**
-     * Populates type specific values for local repos
-     */
-    private void populateLocalTypeSpecificDescriptorValues(TypeSpecificConfigModel type,
-            LocalRepoDescriptor descriptor) {
-        switch (type.getRepoType()) {
-            case Maven:
-            case Gradle:
-            case Ivy:
-            case SBT:
-                MavenTypeSpecificConfigModel maven = (MavenTypeSpecificConfigModel) type;
-                descriptor.setSnapshotVersionBehavior(maven.getSnapshotVersionBehavior());
-                descriptor.setChecksumPolicyType(maven.getLocalChecksumPolicy());
-                break;
-            case YUM:
-                YumTypeSpecificConfigModel yum = (YumTypeSpecificConfigModel) type;
-                descriptor.setYumGroupFileNames(yum.getGroupFileNames());
-                descriptor.setYumRootDepth(yum.getMetadataFolderDepth());
-                descriptor.setCalculateYumMetadata(yum.isAutoCalculateYumMetadata());
-                break;
-            case Docker:
-                DockerTypeSpecificConfigModel docker = (DockerTypeSpecificConfigModel) type;
-                descriptor.setDockerApiVersion(docker.getDockerApiVersion().toString());
-                descriptor.setForceDockerAuthentication(docker.isForceDockerAuthentication());
-                break;
-            case Debian:
-                DebTypeSpecificConfigModel deb = (DebTypeSpecificConfigModel) type;
-                descriptor.setDebianTrivialLayout(deb.getTrivialLayout());
-                break;
-            case NuGet:
-                NugetTypeSpecificConfigModel nuget = (NugetTypeSpecificConfigModel) type;
-                descriptor.setMaxUniqueSnapshots(nuget.getMaxUniqueSnapshots());
-                break;
-        }
-    }
-
-    /**
-     * Populates type specific values for remote repos
-     */
-    private void populateRemoteTypeSpecificDescriptorValues(TypeSpecificConfigModel type,
-            HttpRepoDescriptor descriptor) {
-        descriptor.setType(type.getRepoType());
-        switch (type.getRepoType()) {
-            case P2:
-            case Maven:
-            case Gradle:
-            case Ivy:
-            case SBT:
-                MavenTypeSpecificConfigModel maven = (MavenTypeSpecificConfigModel) type;
-                descriptor.setFetchJarsEagerly(maven.getEagerlyFetchJars());
-                descriptor.setFetchSourcesEagerly(maven.getEagerlyFetchSources());
-                descriptor.setRejectInvalidJars(maven.getRejectInvalidJars());
-                descriptor.setListRemoteFolderItems(maven.isListRemoteFolderItems());
-                descriptor.setChecksumPolicyType(maven.getRemoteChecksumPolicy());
-
-                //Set p2 url for supporting repos
-                if (descriptor.getUrl() != null) { //Should always be true, but this is to avoid accidental nulls
-                    descriptor.setP2OriginalUrl(descriptor.getUrl());
-                }
-                break;
-            case Bower:
-                BowerTypeSpecificConfigModel bower = (BowerTypeSpecificConfigModel) type;
-                buildAndSetBowerConfig(descriptor, bower);
-                descriptor.setListRemoteFolderItems(bower.isListRemoteFolderItems());
-                break;
-            case CocoaPods:
-                CocoaPodsTypeSpecificConfigModel pods = (CocoaPodsTypeSpecificConfigModel) type;
-                buildAndSetPodsConfig(descriptor, pods);
-                descriptor.setListRemoteFolderItems(pods.isListRemoteFolderItems());
-                break;
-            case VCS:
-                VcsTypeSpecificConfigModel vcs = (VcsTypeSpecificConfigModel) type;
-                buildAndSetVcsConfig(descriptor, vcs);
-                descriptor.setListRemoteFolderItems(vcs.isListRemoteFolderItems());
-                break;
-            case Docker:
-                DockerTypeSpecificConfigModel docker = (DockerTypeSpecificConfigModel) type;
-                descriptor.setEnableTokenAuthentication(docker.isEnableTokenAuthentication());
-                descriptor.setForceDockerAuthentication(docker.isForceDockerAuthentication());
-                descriptor.setListRemoteFolderItems(docker.isListRemoteFolderItems());
-                break;
-            case Debian:
-                DebTypeSpecificConfigModel deb = (DebTypeSpecificConfigModel) type;
-                descriptor.setListRemoteFolderItems(deb.isListRemoteFolderItems());
-                break;
-            case NuGet:
-                NugetTypeSpecificConfigModel nuGet = (NugetTypeSpecificConfigModel) type;
-                descriptor.setListRemoteFolderItems(nuGet.isListRemoteFolderItems());
-                buildAndSetNugetConfig(descriptor, nuGet);
-                break;
-            case Generic:
-                GenericTypeSpecificConfigModel generic = (GenericTypeSpecificConfigModel) type;
-                descriptor.setListRemoteFolderItems(generic.isListRemoteFolderItems());
-                break;
-            case YUM:
-                YumTypeSpecificConfigModel yum = (YumTypeSpecificConfigModel) type;
-                descriptor.setListRemoteFolderItems(yum.isListRemoteFolderItems());
-                break;
-            case Npm:
-                NpmTypeSpecificConfigModel npm = (NpmTypeSpecificConfigModel) type;
-                descriptor.setListRemoteFolderItems(npm.isListRemoteFolderItems());
-                break;
-            case Gems:
-                GemsTypeSpecificConfigModel gems = (GemsTypeSpecificConfigModel) type;
-                descriptor.setListRemoteFolderItems(gems.isListRemoteFolderItems());
-                break;
-            case Pypi:
-                PypiTypeSpecificConfigModel pypi = (PypiTypeSpecificConfigModel) type;
-                descriptor.setListRemoteFolderItems(pypi.isListRemoteFolderItems());
-                break;
-            case GitLfs:
-                GitLfsTypeSpecificConfigModel gitlfs = (GitLfsTypeSpecificConfigModel) type;
-                descriptor.setListRemoteFolderItems(gitlfs.isListRemoteFolderItems());
-                break;
-        }
-    }
-
-    private void populateVirtualTypeSpecific(TypeSpecificConfigModel type, VirtualRepoDescriptor descriptor) {
-        descriptor.setType(type.getRepoType());
-        switch (type.getRepoType()) {
-            case P2:
-                buildAndSetVirtualP2Config(descriptor, (P2TypeSpecificConfigModel) type);
-                break;
-            case Docker:
-                DockerTypeSpecificConfigModel docker = (DockerTypeSpecificConfigModel) type;
-                descriptor.setForceDockerAuthentication(docker.isForceDockerAuthentication());
-                break;
-            case NuGet:
-                NugetTypeSpecificConfigModel nuget = (NugetTypeSpecificConfigModel) type;
-                descriptor.setForceNugetAuthentication(nuget.isForceNugetAuthentication());
-                break;
-            case Bower:
-                BowerTypeSpecificConfigModel bower = (BowerTypeSpecificConfigModel) type;
-                if (descriptor.getExternalDependencies() == null) {
-                    descriptor.setExternalDependencies(new ExternalDependenciesConfig());
-                }
-                descriptor.getExternalDependencies().setEnabled(bower.getEnableExternalDependencies());
-                descriptor.getExternalDependencies().getPatterns().clear();
-                descriptor.getExternalDependencies().getPatterns().addAll(bower.getExternalPatterns());
-                descriptor.getExternalDependencies().setRemoteRepo(
-                        centralConfig.getDescriptor().getRemoteRepositoriesMap().get(bower.getExternalRemoteRepo()));
-                break;
-            case Npm:
-                NpmTypeSpecificConfigModel npm = (NpmTypeSpecificConfigModel) type;
-                if (descriptor.getExternalDependencies() == null) {
-                    descriptor.setExternalDependencies(new ExternalDependenciesConfig());
-                }
-                descriptor.getExternalDependencies().setEnabled(npm.getEnableExternalDependencies());
-                descriptor.getExternalDependencies().getPatterns().clear();
-                descriptor.getExternalDependencies().getPatterns().addAll(npm.getExternalPatterns());
-                descriptor.getExternalDependencies().setRemoteRepo(
-                        centralConfig.getDescriptor().getRemoteRepositoriesMap().get(npm.getExternalRemoteRepo()));
-                break;
-            case Maven: //P2 reaches maven also
-            case Gradle:
-            case Ivy:
-            case SBT:
-                MavenTypeSpecificConfigModel maven = (MavenTypeSpecificConfigModel) type;
-                descriptor.setKeyPair(maven.getKeyPair());
-                descriptor.setPomRepositoryReferencesCleanupPolicy(maven.getPomCleanupPolicy());
-                break;
-            case GitLfs:
-                break;
-        }
-    }
-
-    private void buildAndSetNugetConfig(HttpRepoDescriptor descriptor, NugetTypeSpecificConfigModel nuGet) {
-        NuGetConfiguration nugetConfig = new NuGetConfiguration();
-        nugetConfig.setDownloadContextPath(nuGet.getDownloadContextPath());
-        nugetConfig.setFeedContextPath(nuGet.getFeedContextPath());
-        descriptor.setNuget(nugetConfig);
-    }
-
-    private void buildAndSetVcsConfig(HttpRepoDescriptor descriptor, VcsTypeSpecificConfigModel vcs) {
-        VcsConfiguration vcsConfig = new VcsConfiguration();
-        VcsGitConfiguration vcsGitConfig = new VcsGitConfiguration();
-        vcsGitConfig.setProvider(vcs.getGitProvider());
-        vcsGitConfig.setDownloadUrl(vcs.getDownloadUrl());
-        vcsConfig.setType(vcs.getVcsType());
-        vcsConfig.setGit(vcsGitConfig);
-        descriptor.setVcs(vcsConfig);
-        descriptor.setMaxUniqueSnapshots(vcs.getMaxUniqueSnapshots());
-        descriptor.setListRemoteFolderItems(vcs.isListRemoteFolderItems());
-    }
-
-    private void buildAndSetBowerConfig(HttpRepoDescriptor descriptor, BowerTypeSpecificConfigModel bower) {
-        buildAndSetVcsConfig(descriptor, bower);
-        BowerConfiguration bowerConfig = new BowerConfiguration();
-        bowerConfig.setBowerRegistryUrl(bower.getRegistryUrl());
-        descriptor.setBower(bowerConfig);
-    }
-
-    private void buildAndSetPodsConfig(HttpRepoDescriptor descriptor, CocoaPodsTypeSpecificConfigModel pods) {
-        buildAndSetVcsConfig(descriptor, pods);
-        CocoaPodsConfiguration podsConfig = new CocoaPodsConfiguration();
-        podsConfig.setCocoaPodsSpecsRepoUrl(pods.getSpecsRepoUrl());
-        //Specs repo provider must be Artifactory or the same as the remote's Git provider - from UI it should always
-        // match in any case, users can change it from the descriptor manually.
-        VcsGitConfiguration podsGitProvider = new VcsGitConfiguration();
-        podsGitProvider.setProvider(pods.getGitProvider());
-        podsConfig.setSpecRepoProvider(podsGitProvider);
-        descriptor.setCocoaPods(podsConfig);
-    }
-
-    private void buildAndSetVirtualP2Config(VirtualRepoDescriptor descriptor, P2TypeSpecificConfigModel p2) {
-        P2Configuration p2Config = new P2Configuration();
-        //This just adds the selected urls - creating repos etc is done at the service
-        p2Config.setUrls(p2.getP2Repos().stream()
-                .map(P2Repo::getRepoUrl)
-                .distinct()
-                .collect(Collectors.toList()));
-        descriptor.setP2(p2Config);
-    }
-
-    private PropertySet getPropSetByName(String name) {
-        return centralConfig.getDescriptor().getPropertySets().stream()
-                .filter(propertySet -> propertySet.getName().equals(name))
-                .findFirst()
-                .orElseGet(null);
-    }
-
-    public static String getUrlWithoutSubpath(String url) {
-        int slashslash = url.indexOf("//") + 2;
-        int nextSlash = url.indexOf('/', slashslash);
-        return nextSlash < 0 ? url : PathUtils.trimSlashes(url.substring(0, nextSlash)).toString();
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/builder/RepoConfigModelBuilder.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/builder/RepoConfigModelBuilder.java
deleted file mode 100644
index 3f926b4..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/builder/RepoConfigModelBuilder.java
+++ /dev/null
@@ -1,724 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.util.builder;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.jfrog.bintray.client.api.BintrayCallException;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.p2.P2Repo;
-import org.artifactory.api.bintray.distribution.DistributionService;
-import org.artifactory.api.bintray.distribution.model.DistributionRepoCreationDetails;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.replication.RemoteReplicationDescriptor;
-import org.artifactory.descriptor.repo.*;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.ui.rest.model.admin.configuration.propertysets.PropertySetNameModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.AdvancedRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.BasicRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.GeneralRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.distribution.DistributionAdvancedRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.distribution.DistributionBasicRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.distribution.DistributionRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.local.LocalAdvancedRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.local.LocalBasicRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.local.LocalRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.*;
-import org.artifactory.ui.rest.model.admin.configuration.repository.replication.local.LocalReplicationConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.replication.remote.RemoteReplicationConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.typespecific.*;
-import org.artifactory.ui.rest.model.admin.configuration.repository.virtual.VirtualAdvancedRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.virtual.VirtualBasicRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.virtual.VirtualRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.virtual.VirtualSelectedRepository;
-import org.artifactory.ui.rest.model.admin.configuration.reverseProxy.ReverseProxyRepoModel;
-import org.artifactory.util.ExceptionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.concurrent.ConcurrentMap;
-import java.util.stream.Collectors;
-
-/**
- * Utility class for converting descriptor to model
- *
- * @author Aviad Shikloshi
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class RepoConfigModelBuilder {
-    private static final Logger log = LoggerFactory.getLogger(RepoConfigModelBuilder.class);
-
-    @Autowired
-    private CentralConfigService centralConfig;
-
-    /**
-     * Populate model configuration from local repository descriptor
-     */
-    public void populateLocalDescriptorValuesToModel(LocalRepoDescriptor descriptor, LocalRepositoryConfigModel model) {
-        GeneralRepositoryConfigModel general = createGeneralConfig(descriptor);
-        LocalBasicRepositoryConfigModel basic = createLocalBasicConfig(descriptor);
-        LocalAdvancedRepositoryConfigModel advanced = createLocalAdvancedConfig(descriptor);
-        TypeSpecificConfigModel typeSpecific = createLocalTypeSpecific(descriptor.getType(), descriptor);
-
-        List<LocalReplicationDescriptor> replicationDescriptors = centralConfig.getDescriptor()
-                .getMultiLocalReplications(descriptor.getKey());
-        List<LocalReplicationConfigModel> replications = replicationDescriptors.stream()
-                .map(this::createLocalReplicationConfig)
-                .collect(Collectors.toList());
-
-        model.setGeneral(general);
-        model.setBasic(basic);
-        model.setAdvanced(advanced);
-        model.setTypeSpecific(typeSpecific);
-        model.setReplications(replications);
-    }
-
-    /**
-     * Populate model configuration from remote repository descriptor
-     */
-    public void populateRemoteRepositoryConfigValuesToModel(HttpRepoDescriptor descriptor,
-            RemoteRepositoryConfigModel model) {
-        GeneralRepositoryConfigModel general = createGeneralConfig(descriptor);
-        model.setGeneral(general);
-
-        RemoteBasicRepositoryConfigModel basic = createRemoteBasicConfig(descriptor);
-        model.setBasic(basic);
-
-        RemoteReplicationDescriptor replicationDescriptor = centralConfig.getDescriptor().getRemoteReplication(
-                descriptor.getKey());
-        if (replicationDescriptor != null) {
-            RemoteReplicationConfigModel replication = createRemoteReplicationConfigModel(replicationDescriptor);
-            model.setReplications(Lists.newArrayList(replication));
-        }
-        RemoteAdvancedRepositoryConfigModel advanced = createRemoteAdvancedConfig(descriptor);
-        model.setAdvanced(advanced);
-        TypeSpecificConfigModel typeSpecific = createRemoteTypeSpecific(descriptor.getType(), descriptor);
-        model.setTypeSpecific(typeSpecific);
-    }
-
-    /**
-     * Populate model configuration from virtual repository descriptor
-     */
-    public void populateVirtualRepositoryConfigValuesToModel(VirtualRepoDescriptor descriptor,
-            VirtualRepositoryConfigModel model) {
-        // General
-        GeneralRepositoryConfigModel general = new GeneralRepositoryConfigModel();
-        general.setRepoKey(descriptor.getKey());
-        model.setGeneral(general);
-
-        // Basic
-        VirtualBasicRepositoryConfigModel basic = new VirtualBasicRepositoryConfigModel();
-        Optional.ofNullable(descriptor.getRepoLayout()).ifPresent(layout -> basic.setLayout(layout.getName()));
-        basic.setPublicDescription(descriptor.getDescription());
-        basic.setInternalDescription(descriptor.getNotes());
-        basic.setExcludesPattern(descriptor.getExcludesPattern());
-        basic.setIncludesPattern(descriptor.getIncludesPattern());
-        List<RepoDescriptor> repositories = descriptor.getRepositories();
-        VirtualRepoResolver resolver = new VirtualRepoResolver(descriptor);
-        basic.setResolvedRepositories(resolver.getOrderedRepos().stream().map(VirtualSelectedRepository::new).collect(Collectors.toList()));
-        basic.setSelectedRepositories(repositories.stream().map(VirtualSelectedRepository::new).collect(Collectors.toList()));
-        Optional.ofNullable(descriptor.getDefaultDeploymentRepo())
-                .ifPresent(localRepoDescriptor -> basic.setDefaultDeploymentRepo(localRepoDescriptor.getKey()));
-        model.setBasic(basic);
-
-        // Advanced
-        VirtualAdvancedRepositoryConfigModel advanced = new VirtualAdvancedRepositoryConfigModel();
-        advanced.setRetrieveRemoteArtifacts(descriptor.isArtifactoryRequestsCanRetrieveRemoteArtifacts());
-        addReverseProxyConfig(advanced, descriptor.getKey());
-        model.setAdvanced(advanced);
-
-        // Type specific
-        TypeSpecificConfigModel typeSpecific = createVirtualTypeSpecific(descriptor.getType(), descriptor);
-        model.setTypeSpecific(typeSpecific);
-    }
-
-    /**
-     * Populate model configuration from local repository descriptor
-     */
-    public void populateDistributionDescriptorValuesToModel(DistributionRepoDescriptor descriptor,
-            DistributionRepositoryConfigModel model) {
-        GeneralRepositoryConfigModel general = createGeneralConfig(descriptor);
-        DistributionBasicRepositoryConfigModel basic = createDistBasicConfig(descriptor);
-        DistributionAdvancedRepositoryConfigModel advanced = createDistAdvancedConfig(descriptor);
-        DistRepoTypeSpecificConfigModel typeSpecific = new DistRepoTypeSpecificConfigModel();
-        populateDistributionValues(typeSpecific, descriptor);
-        model.setGeneral(general);
-        model.setBasic(basic);
-        model.setAdvanced(advanced);
-        model.setTypeSpecific(typeSpecific);
-    }
-
-
-    private LocalReplicationConfigModel createLocalReplicationConfig(LocalReplicationDescriptor replicationDescriptor) {
-        LocalReplicationConfigModel replication = new LocalReplicationConfigModel();
-        replication.setUrl(replicationDescriptor.getUrl());
-        replication.setCronExp(replicationDescriptor.getCronExp());
-        replication.setEnableEventReplication(replicationDescriptor.isEnableEventReplication());
-        replication.setEnabled(replicationDescriptor.isEnabled());
-
-        ProxyDescriptor proxyDescriptor = replicationDescriptor.getProxy();
-        if (proxyDescriptor != null) {
-            replication.setProxy(proxyDescriptor.getKey());
-        }
-        replication.setSocketTimeout(replicationDescriptor.getSocketTimeoutMillis());
-        replication.setSyncDeletes(replicationDescriptor.isSyncDeletes());
-        replication.setSyncProperties(replicationDescriptor.isSyncProperties());
-        replication.setUsername(replicationDescriptor.getUsername());
-        replication.setPassword(replicationDescriptor.getPassword());
-        replication.setPathPrefix(replicationDescriptor.getPathPrefix());
-        return replication;
-    }
-
-    private RemoteReplicationConfigModel createRemoteReplicationConfigModel(
-            RemoteReplicationDescriptor replicationDescriptor) {
-        RemoteReplicationConfigModel replication = new RemoteReplicationConfigModel();
-        replication.setCronExp(replicationDescriptor.getCronExp());
-        replication.setEnabled(replicationDescriptor.isEnabled());
-        replication.setSyncDeletes(replicationDescriptor.isSyncDeletes());
-        replication.setSyncProperties(replicationDescriptor.isSyncProperties());
-        replication.setPathPrefix(replicationDescriptor.getPathPrefix());
-        return replication;
-    }
-
-    private GeneralRepositoryConfigModel createGeneralConfig(RepoBaseDescriptor descriptor) {
-        GeneralRepositoryConfigModel general = new GeneralRepositoryConfigModel();
-        general.setRepoKey(descriptor.getKey());
-        return general;
-    }
-
-    private LocalBasicRepositoryConfigModel createLocalBasicConfig(LocalRepoDescriptor descriptor) {
-        LocalBasicRepositoryConfigModel basic = new LocalBasicRepositoryConfigModel();
-        addSharedBasicConfigModel(basic, descriptor);
-        return basic;
-    }
-
-    private RemoteBasicRepositoryConfigModel createRemoteBasicConfig(HttpRepoDescriptor descriptor) {
-        RemoteBasicRepositoryConfigModel basic = new RemoteBasicRepositoryConfigModel();
-        addSharedBasicConfigModel(basic, descriptor);
-        basic.setUrl(descriptor.getUrl());
-        basic.setContentSynchronisation(descriptor.getContentSynchronisation());
-        RepoLayout remoteRepoLayout = descriptor.getRemoteRepoLayout();
-        if (remoteRepoLayout != null) {
-            basic.setRemoteLayoutMapping(remoteRepoLayout.getName());
-        }
-        basic.setOffline(descriptor.isOffline());
-        return basic;
-    }
-
-    private DistributionBasicRepositoryConfigModel createDistBasicConfig(DistributionRepoDescriptor descriptor) {
-        DistributionBasicRepositoryConfigModel basic = new DistributionBasicRepositoryConfigModel();
-        addSharedBasicConfigModel(basic, descriptor);
-        basic.setProductName(descriptor.getProductName());
-        basic.setDefaultNewRepoPrivate(descriptor.getDefaultNewRepoPrivate());
-        basic.setDefaultNewRepoPremium(descriptor.getDefaultNewRepoPremium());
-        basic.setDefaultLicenses(descriptor.getDefaultLicenses());
-        basic.setDefaultVcsUrl(descriptor.getDefaultVcsUrl());
-        return basic;
-    }
-
-    private void addSharedBasicConfigModel(BasicRepositoryConfigModel basic, RepoDescriptor descriptor) {
-        basic.setPublicDescription(descriptor.getDescription());
-        basic.setInternalDescription(descriptor.getNotes());
-        basic.setIncludesPattern(descriptor.getIncludesPattern());
-        basic.setExcludesPattern(descriptor.getExcludesPattern());
-        Optional.ofNullable(descriptor.getRepoLayout()).ifPresent(repoLayout -> basic.setLayout(repoLayout.getName()));
-    }
-
-    private LocalAdvancedRepositoryConfigModel createLocalAdvancedConfig(LocalRepoDescriptor descriptor) {
-        LocalAdvancedRepositoryConfigModel advanced = new LocalAdvancedRepositoryConfigModel();
-        addSharedAdvancedConfigModel(advanced, descriptor);
-        return advanced;
-    }
-
-    private RemoteAdvancedRepositoryConfigModel createRemoteAdvancedConfig(HttpRepoDescriptor descriptor) {
-        RemoteAdvancedRepositoryConfigModel advanced = new RemoteAdvancedRepositoryConfigModel();
-        addSharedAdvancedConfigModel(advanced, descriptor);
-        RemoteNetworkRepositoryConfigModel networkModel = createNetworkConfig(descriptor);
-        advanced.setNetwork(networkModel);
-        RemoteCacheRepositoryConfigModel cacheConfig = createCacheConfig(descriptor);
-        advanced.setCache(cacheConfig);
-        advanced.setStoreArtifactsLocally(descriptor.isStoreArtifactsLocally());
-        advanced.setSynchronizeArtifactProperties(descriptor.isSynchronizeProperties());
-        advanced.setHardFail(descriptor.isHardFail());
-        advanced.setQueryParams(descriptor.getQueryParams());
-        advanced.setPropagateQueryParams(descriptor.isPropagateQueryParams());
-        advanced.setShareConfiguration(descriptor.isShareConfiguration());
-        advanced.setBlockMismatchingMimeTypes(descriptor.isBlockMismatchingMimeTypes());
-        if(StringUtils.isNotBlank(descriptor.getMismatchingMimeTypesOverrideList())) {
-            advanced.setMismatchingMimeTypesOverrideList(
-                    Lists.newArrayList(descriptor.getMismatchingMimeTypesOverrideList().split(",")));
-        }
-        return advanced;
-    }
-
-    private DistributionAdvancedRepositoryConfigModel createDistAdvancedConfig(DistributionRepoDescriptor descriptor) {
-        DistributionAdvancedRepositoryConfigModel advanced = new DistributionAdvancedRepositoryConfigModel();
-        addSharedAdvancedConfigModel(advanced, descriptor);
-        advanced.setDistributionRules(descriptor.getRules());
-        if (descriptor.getProxy() != null) {
-            advanced.setProxy(descriptor.getProxy().getKey());
-        }
-        advanced.setWhiteListedProperties(descriptor.getWhiteListedProperties());
-        advanced.setGpgSign(descriptor.isGpgSign());
-        advanced.setGpgPassPhrase(descriptor.getGpgPassPhrase());
-        return advanced;
-    }
-
-    private void addSharedAdvancedConfigModel(AdvancedRepositoryConfigModel advanced, RealRepoDescriptor descriptor) {
-        advanced.setAllowContentBrowsing(descriptor.isArchiveBrowsingEnabled());
-        advanced.setBlackedOut(descriptor.isBlackedOut());
-        List<PropertySet> propertySetsList = descriptor.getPropertySets();
-        List<PropertySetNameModel> propertySetNameModelList = collectPropertySets(propertySetsList);
-        advanced.setPropertySets(propertySetNameModelList);
-        addReverseProxyConfig(advanced, descriptor.getKey());
-    }
-
-    private RemoteCacheRepositoryConfigModel createCacheConfig(HttpRepoDescriptor descriptor) {
-        RemoteCacheRepositoryConfigModel cacheConfig = new RemoteCacheRepositoryConfigModel();
-        cacheConfig.setKeepUnusedArtifactsHours(descriptor.getUnusedArtifactsCleanupPeriodHours());
-        cacheConfig.setRetrievalCachePeriodSecs(descriptor.getRetrievalCachePeriodSecs());
-        cacheConfig.setAssumedOfflineLimitSecs(descriptor.getAssumedOfflinePeriodSecs());
-        cacheConfig.setMissedRetrievalCachePeriodSecs(descriptor.getMissedRetrievalCachePeriodSecs());
-        return cacheConfig;
-    }
-
-    private RemoteNetworkRepositoryConfigModel createNetworkConfig(HttpRepoDescriptor descriptor) {
-        RemoteNetworkRepositoryConfigModel networkModel = new RemoteNetworkRepositoryConfigModel();
-        if (descriptor.getProxy() != null) {
-            networkModel.setProxy(descriptor.getProxy().getKey());
-        }
-        networkModel.setLocalAddress(descriptor.getLocalAddress());
-        networkModel.setUsername(descriptor.getUsername());
-        networkModel.setPassword(descriptor.getPassword());
-        networkModel.setSocketTimeout(descriptor.getSocketTimeoutMillis());
-        networkModel.setLenientHostAuth(descriptor.isAllowAnyHostAuth());
-        networkModel.setCookieManagement(descriptor.isEnableCookieManagement());
-        networkModel.setSyncProperties(descriptor.isSynchronizeProperties());
-        return networkModel;
-    }
-
-    private TypeSpecificConfigModel createLocalTypeSpecific(RepoType type, LocalRepoDescriptor descriptor) {
-        MavenTypeSpecificConfigModel mavenModel = null;
-        TypeSpecificConfigModel model = null;
-        switch (type) {
-            case Bower:
-                model = new BowerTypeSpecificConfigModel();
-                break;
-            case CocoaPods:
-                model = new CocoaPodsTypeSpecificConfigModel();
-                break;
-            case Docker:
-                DockerTypeSpecificConfigModel dockerType = new DockerTypeSpecificConfigModel();
-                DockerApiVersion dockerApiVersion = descriptor.getDockerApiVersion();
-                if (dockerApiVersion != null) {
-                    dockerType.setDockerApiVersion(dockerApiVersion);
-                }
-                dockerType.setForceDockerAuthentication(descriptor.isForceDockerAuthentication());
-                model = dockerType;
-                break;
-            case NuGet:
-                NugetTypeSpecificConfigModel nugetType = new NugetTypeSpecificConfigModel();
-                populateSharedNuGetValues(nugetType, descriptor);
-                nugetType.setMaxUniqueSnapshots(descriptor.getMaxUniqueSnapshots());
-                model = nugetType;
-                break;
-            case Npm:
-                model = new NpmTypeSpecificConfigModel();
-                break;
-            case Pypi:
-                model = new PypiTypeSpecificConfigModel();
-                break;
-            case Vagrant:
-                model = new VagrantTypeSpecificConfigModel();
-                break;
-            case GitLfs:
-                model = new GitLfsTypeSpecificConfigModel();
-                break;
-            case Debian:
-                DebTypeSpecificConfigModel debType = new DebTypeSpecificConfigModel();
-                debType.setTrivialLayout(descriptor.isDebianTrivialLayout());
-                model = debType;
-                break;
-            case Opkg:
-                model = new OpkgTypeSpecificConfigModel();
-                break;
-            case YUM:
-                YumTypeSpecificConfigModel yumType = new YumTypeSpecificConfigModel();
-                yumType.setMetadataFolderDepth(descriptor.getYumRootDepth());
-                yumType.setGroupFileNames(descriptor.getYumGroupFileNames());
-                yumType.setAutoCalculateYumMetadata(descriptor.isCalculateYumMetadata());
-                model = yumType;
-                break;
-            case Gems:
-                model = new GemsTypeSpecificConfigModel();
-                break;
-            case Generic:
-                model = new GenericTypeSpecificConfigModel();
-                break;
-            case Maven:
-                mavenModel = new MavenTypeSpecificConfigModel();
-                break;
-            case Gradle:
-                mavenModel = new GradleTypeSpecificConfigModel();
-                break;
-            case Ivy:
-                mavenModel = new IvyTypeSpecificConfigModel();
-                break;
-            case SBT:
-                mavenModel = new SbtTypeSpecificConfigModel();
-                break;
-        }
-        if (model != null) {
-            return model;
-        }
-        // We will get here only if our model is maven / gradle / ivy / sbt and we populate the values
-        populateMavenLocalValues(mavenModel, descriptor);
-        return mavenModel;
-    }
-
-    private TypeSpecificConfigModel createRemoteTypeSpecific(RepoType type, HttpRepoDescriptor descriptor) {
-        MavenTypeSpecificConfigModel mavenModel = null;
-        TypeSpecificConfigModel model = null;
-        switch (type) {
-            case Maven:
-                mavenModel = new MavenTypeSpecificConfigModel();
-                break;
-            case Gradle:
-                mavenModel = new GradleTypeSpecificConfigModel();
-                break;
-            case Ivy:
-                mavenModel = new IvyTypeSpecificConfigModel();
-                break;
-            case SBT:
-                mavenModel = new SbtTypeSpecificConfigModel();
-                break;
-            case P2:
-                mavenModel = new P2TypeSpecificConfigModel();
-                break;
-            case Debian:
-                DebTypeSpecificConfigModel debType = new DebTypeSpecificConfigModel();
-                debType.setListRemoteFolderItems(descriptor.isListRemoteFolderItems());
-                model = debType;
-                break;
-            case Opkg:
-                OpkgTypeSpecificConfigModel opkgType = new OpkgTypeSpecificConfigModel();
-                opkgType.setListRemoteFolderItems(descriptor.isListRemoteFolderItems());
-                model = opkgType;
-                break;
-            case Docker:
-                DockerTypeSpecificConfigModel dockerType = new DockerTypeSpecificConfigModel();
-                dockerType.setEnableTokenAuthentication(descriptor.isEnableTokenAuthentication());
-                dockerType.setForceDockerAuthentication(descriptor.isForceDockerAuthentication());
-                dockerType.setListRemoteFolderItems(descriptor.isListRemoteFolderItems());
-                model = dockerType;
-                break;
-            case NuGet:
-                NugetTypeSpecificConfigModel nugetType = new NugetTypeSpecificConfigModel();
-                populateSharedNuGetValues(nugetType, descriptor);
-                NuGetConfiguration nuget = descriptor.getNuget();
-                if (nuget != null) {
-                    nugetType.setDownloadContextPath(nuget.getDownloadContextPath());
-                    nugetType.setFeedContextPath(nuget.getFeedContextPath());
-                }
-                nugetType.setListRemoteFolderItems(descriptor.isListRemoteFolderItems());
-                model = nugetType;
-                break;
-            case Npm:
-                NpmTypeSpecificConfigModel npmType = new NpmTypeSpecificConfigModel();
-                npmType.setListRemoteFolderItems(descriptor.isListRemoteFolderItems());
-                model = npmType;
-                break;
-            case Pypi:
-                PypiTypeSpecificConfigModel pypiType = new PypiTypeSpecificConfigModel();
-                pypiType.setListRemoteFolderItems(descriptor.isListRemoteFolderItems());
-                model = pypiType;
-                break;
-            case VCS:
-                VcsTypeSpecificConfigModel vcsType = new VcsTypeSpecificConfigModel();
-                populateVcsValues(vcsType, descriptor);
-                model = vcsType;
-                break;
-            case Bower:
-                BowerTypeSpecificConfigModel bowerType = new BowerTypeSpecificConfigModel();
-                populateVcsValues(bowerType, descriptor);
-                BowerConfiguration bowerConfiguration = descriptor.getBower();
-                if (bowerConfiguration != null) {
-                    bowerType.setRegistryUrl(bowerConfiguration.getBowerRegistryUrl());
-                }
-                model = bowerType;
-                break;
-            case CocoaPods:
-                CocoaPodsTypeSpecificConfigModel podsType = new CocoaPodsTypeSpecificConfigModel();
-                populateVcsValues(podsType, descriptor);
-                CocoaPodsConfiguration podsConfiguration = descriptor.getCocoaPods();
-                if(podsConfiguration != null) {
-                    podsType.setSpecsRepoUrl(podsConfiguration.getCocoaPodsSpecsRepoUrl());
-                    podsType.setSpecsRepoProvider(podsConfiguration.getSpecRepoProvider());
-                }
-                model = podsType;
-                break;
-            case Gems:
-                GemsTypeSpecificConfigModel gemsType = new GemsTypeSpecificConfigModel();
-                gemsType.setListRemoteFolderItems(descriptor.isListRemoteFolderItems());
-                model = gemsType;
-                break;
-            case Generic:
-                GenericTypeSpecificConfigModel genericType = new GenericTypeSpecificConfigModel();
-                genericType.setListRemoteFolderItems(descriptor.isListRemoteFolderItems());
-                model = genericType;
-                break;
-            case YUM:
-                YumTypeSpecificConfigModel yumType = new YumTypeSpecificConfigModel();
-                yumType.setListRemoteFolderItems(descriptor.isListRemoteFolderItems());
-                yumType.setAutoCalculateYumMetadata(null);
-                yumType.setMetadataFolderDepth(null);
-                yumType.setGroupFileNames(null);
-                model = yumType;
-                break;
-            case GitLfs:
-                GitLfsTypeSpecificConfigModel gitLfsType = new GitLfsTypeSpecificConfigModel();
-                gitLfsType.setListRemoteFolderItems(descriptor.isListRemoteFolderItems());
-                model = gitLfsType;
-                break;
-
-        }
-        if (model != null) {
-            return model;
-        }
-        populateMavenRemoteValues(mavenModel, descriptor);
-        return mavenModel;
-    }
-
-    private TypeSpecificConfigModel createVirtualTypeSpecific(RepoType type, VirtualRepoDescriptor descriptor) {
-        TypeSpecificConfigModel typeSpecific = null;
-        MavenTypeSpecificConfigModel mavenModel = null;
-        switch (type) {
-            case Maven:
-                mavenModel = new MavenTypeSpecificConfigModel();
-                break;
-            case Gradle:
-                mavenModel = new GradleTypeSpecificConfigModel();
-                break;
-            case Ivy:
-                mavenModel = new IvyTypeSpecificConfigModel();
-                break;
-            case SBT:
-                mavenModel = new SbtTypeSpecificConfigModel();
-                break;
-            case P2:
-                P2TypeSpecificConfigModel p2 = new P2TypeSpecificConfigModel();
-                populateVirtualP2Values(p2, descriptor);
-                mavenModel = p2;
-                break;
-            case Gems:
-                typeSpecific = new GemsTypeSpecificConfigModel();
-                break;
-            case GitLfs:
-                typeSpecific = new GitLfsTypeSpecificConfigModel();
-                break;
-            case Npm:
-                NpmTypeSpecificConfigModel npmType = new NpmTypeSpecificConfigModel();
-                ExternalDependenciesConfig npmExternalDependencies = descriptor.getExternalDependencies();
-                if (npmExternalDependencies != null) {
-                    npmType.setEnableExternalDependencies(npmExternalDependencies.isEnabled());
-                    if (npmExternalDependencies.getRemoteRepo() != null) {
-                        npmType.setExternalRemoteRepo(npmExternalDependencies.getRemoteRepo().getKey());
-                    }
-                    npmType.setExternalPatterns(npmExternalDependencies.getPatterns());
-                }
-                typeSpecific = npmType;
-                break;
-            case Bower:
-                BowerTypeSpecificConfigModel bowerType = new BowerTypeSpecificConfigModel();
-                ExternalDependenciesConfig bowerExternalDependencies = descriptor.getExternalDependencies();
-                if (bowerExternalDependencies != null) {
-                    bowerType.setEnableExternalDependencies(bowerExternalDependencies.isEnabled());
-                    if (bowerExternalDependencies.getRemoteRepo() != null) {
-                        bowerType.setExternalRemoteRepo(bowerExternalDependencies.getRemoteRepo().getKey());
-                    }
-                    bowerType.setExternalPatterns(bowerExternalDependencies.getPatterns());
-                }
-                typeSpecific = bowerType;
-                break;
-            case NuGet:
-                typeSpecific = new NugetTypeSpecificConfigModel();
-                populateSharedNuGetValues((NugetTypeSpecificConfigModel) typeSpecific, descriptor);
-                break;
-            case Pypi:
-                typeSpecific = new PypiTypeSpecificConfigModel();
-                break;
-            case Docker:
-                DockerTypeSpecificConfigModel dockerType = new DockerTypeSpecificConfigModel();
-                dockerType.setForceDockerAuthentication(descriptor.isForceDockerAuthentication());
-                typeSpecific = dockerType;
-                break;
-            case Generic:
-                typeSpecific = new GenericTypeSpecificConfigModel();
-                break;
-        }
-        if (typeSpecific != null) {
-            return typeSpecific;
-        }
-        populateMavenVirtualValues(mavenModel, descriptor);
-        return mavenModel;
-    }
-
-    private void populateVcsValues(VcsTypeSpecificConfigModel vcsType, HttpRepoDescriptor descriptor) {
-        vcsType.setMaxUniqueSnapshots(descriptor.getMaxUniqueSnapshots());
-        VcsConfiguration vcsConf = descriptor.getVcs();
-        vcsType.setListRemoteFolderItems(descriptor.isListRemoteFolderItems());
-        if (vcsConf != null) {
-            vcsType.setVcsType(vcsConf.getType());
-            VcsGitConfiguration git = vcsConf.getGit();
-            if (git != null) {
-                vcsType.setGitProvider(git.getProvider());
-                vcsType.setDownloadUrl(git.getDownloadUrl());
-            }
-        }
-    }
-
-    private void populateSharedMavenValues(MavenTypeSpecificConfigModel model, RealRepoDescriptor descriptor) {
-        model.setMaxUniqueSnapshots(descriptor.getMaxUniqueSnapshots());
-        model.setHandleReleases(descriptor.isHandleReleases());
-        model.setHandleSnapshots(descriptor.isHandleSnapshots());
-        model.setSuppressPomConsistencyChecks(descriptor.isSuppressPomConsistencyChecks());
-    }
-
-    private void populateMavenLocalValues(MavenTypeSpecificConfigModel model, LocalRepoDescriptor descriptor) {
-        populateSharedMavenValues(model, descriptor);
-        model.setSnapshotVersionBehavior(descriptor.getSnapshotVersionBehavior());
-        model.setLocalChecksumPolicy(descriptor.getChecksumPolicyType());
-    }
-
-    private void populateMavenRemoteValues(MavenTypeSpecificConfigModel model, HttpRepoDescriptor descriptor) {
-        populateSharedMavenValues(model, descriptor);
-        model.setEagerlyFetchJars(descriptor.isFetchJarsEagerly());
-        model.setEagerlyFetchSources(descriptor.isFetchSourcesEagerly());
-        model.setRemoteChecksumPolicy(descriptor.getChecksumPolicyType());
-        model.setListRemoteFolderItems(descriptor.isListRemoteFolderItems());
-        model.setRejectInvalidJars(descriptor.isRejectInvalidJars());
-    }
-
-    private void populateMavenVirtualValues(MavenTypeSpecificConfigModel model, VirtualRepoDescriptor descriptor) {
-        model.setPomCleanupPolicy(descriptor.getPomRepositoryReferencesCleanupPolicy());
-        model.setKeyPair(descriptor.getKeyPair());
-    }
-
-    private void populateVirtualP2Values(P2TypeSpecificConfigModel model, VirtualRepoDescriptor descriptor) {
-        if (descriptor.getP2() == null || descriptor.getP2().getUrls() == null) {
-            return;
-        }
-        Map<String, String> urlToRepoKeyMap = getUrlToRepoKeyMapping(descriptor.getRepositories());
-        List<P2Repo> p2Repos = Lists.newArrayList();
-        descriptor.getP2().getUrls().stream().forEach(url -> {
-            if (StringUtils.startsWith(url, "local://")) {
-                Optional.ofNullable(resolveLocalP2RepoFromUrl(url)).ifPresent(p2Repos::add);
-            } else {
-                urlToRepoKeyMap.keySet().stream()
-                        .map(RepoConfigDescriptorBuilder::getUrlWithoutSubpath)
-                        .filter(p2Url -> RepoConfigDescriptorBuilder.getUrlWithoutSubpath(url).equals(p2Url))
-                        .findAny()
-                        .ifPresent(containingUrl ->
-                                p2Repos.add(new P2Repo(null, urlToRepoKeyMap.get(containingUrl), url)));
-            }
-        });
-        model.setP2Repos(p2Repos);
-    }
-
-    private P2Repo resolveLocalP2RepoFromUrl(String url) {
-        String rpp = StringUtils.removeStart(url, "local://");
-        //rpp = rpp.substring(0, rpp.indexOf('/'));
-        RepoPath repoPath = RepoPathFactory.create(rpp);
-        LocalRepoDescriptor localRepoDescriptor = centralConfig.getMutableDescriptor().getLocalRepositoriesMap()
-                .get(repoPath.getRepoKey());
-        if (localRepoDescriptor != null) {
-            return new P2Repo(null, repoPath.getRepoKey(), url);
-        }
-        return null;
-    }
-
-    private List<PropertySetNameModel> collectPropertySets(List<PropertySet> propertySetsList) {
-        return propertySetsList.stream()
-                .map(PropertySetNameModel::new)
-                .collect(Collectors.toList());
-    }
-
-    /**
-     * Creates a mapping of url -> remote repo key to help build the P2 model (maps 'maven group' repos only)
-     */
-    private Map<String, String> getUrlToRepoKeyMapping(List<RepoDescriptor> descriptors) {
-        ConcurrentMap<String, String> mapping = Maps.newConcurrentMap();
-        descriptors.stream()
-                .filter(repoDescriptor -> repoDescriptor instanceof HttpRepoDescriptor)
-                .filter(repoDescriptor -> repoDescriptor.getType().isMavenGroup())
-                .forEach(remoteDescriptor ->
-                        mapping.put(((HttpRepoDescriptor) remoteDescriptor).getUrl(), remoteDescriptor.getKey()));
-        return mapping;
-    }
-
-    private void populateSharedNuGetValues(NugetTypeSpecificConfigModel nuget, RepoBaseDescriptor descriptor) {
-        nuget.setForceNugetAuthentication(descriptor.isForceNugetAuthentication());
-    }
-
-    private void populateDistributionValues(DistRepoTypeSpecificConfigModel dist, DistributionRepoDescriptor descriptor) {
-        if(descriptor.getBintrayApplication() == null) {
-            log.error("Repository {} is missing it's Bintray OAuth config.", descriptor.getKey());
-            return;
-        }
-        BintrayApplicationConfig appConfig = descriptor.getBintrayApplication();
-        dist.setBintrayAppConfig(appConfig.getKey());
-        dist.setClientId(CryptoHelper.decryptIfNeeded(appConfig.getClientId()));
-        dist.setOrg(appConfig.getOrg());
-        try {
-            DistributionService distributionService = ContextHelper.get().beanForType(DistributionService.class);
-            DistributionRepoCreationDetails orgDetails = distributionService.getRepoCreationDetails(descriptor.getKey());
-            if (orgDetails != null) {
-                dist.setPremium(orgDetails.isOrgPremium);
-                dist.setAvailableLicenses(orgDetails.orgLicenses);
-            }
-        } catch (Exception e) {
-            String err = "Error retrieving Bintray org-specific data for repo wizard: ";
-            log.error(err + ExceptionUtils.getRootCause(e).getMessage(), e);
-            Throwable bintrayException = ExceptionUtils.getCauseOfTypes(e, BintrayCallException.class);
-            if (bintrayException != null) {
-                int statusCode = ((BintrayCallException) bintrayException).getStatusCode();
-                if (statusCode == 401 || statusCode == 403) {
-                    dist.setAuthenticated(false);
-                }
-            }
-        }
-    }
-
-    private void addReverseProxyConfig(AdvancedRepositoryConfigModel advanced, String repoKey) {
-        CentralConfigDescriptor configDescriptor = centralConfig.getDescriptor();
-        ReverseProxyDescriptor reverseProxyDescriptor = configDescriptor.getCurrentReverseProxy();
-        if (reverseProxyDescriptor != null) {
-            ReverseProxyRepoConfig reverseProxyRepoConfig = reverseProxyDescriptor.getReverseProxyRepoConfig(repoKey);
-            advanced.setReverseProxy(reverseProxyToModel(reverseProxyRepoConfig, reverseProxyDescriptor));
-        }
-    }
-
-    private ReverseProxyRepoModel reverseProxyToModel(ReverseProxyRepoConfig reverseProxy,ReverseProxyDescriptor reverseProxyDescriptor) {
-        if (reverseProxy != null) {
-            ReverseProxyRepoModel model = new ReverseProxyRepoModel();
-            model.setConfigurationKey(reverseProxyDescriptor.getKey());
-            model.setServerName(reverseProxy.getServerName());
-            model.setServerPort(reverseProxy.getPort());
-            return model;
-        }
-        return null;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/exception/RepoConfigException.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/exception/RepoConfigException.java
deleted file mode 100644
index c4fa96a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/exception/RepoConfigException.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.util.exception;
-
-/**
- * Exception to propagate replication errors back to UI
- *
- * @author Dan Feldman
- */
-public class RepoConfigException extends Exception {
-
-    int statusCode;
-
-    public RepoConfigException(String message, int statusCode) {
-        super(message);
-        this.statusCode = statusCode;
-    }
-
-    public RepoConfigException(String message, int statusCode, Throwable cause) {
-        super(message, cause);
-        this.statusCode = statusCode;
-    }
-
-    public int getStatusCode() {
-        return statusCode;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/validator/ReplicationConfigValidator.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/validator/ReplicationConfigValidator.java
deleted file mode 100644
index e8e4b69..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/validator/ReplicationConfigValidator.java
+++ /dev/null
@@ -1,180 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.util.validator;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.replication.ReplicationAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.RemoteRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.replication.local.LocalReplicationConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.replication.remote.RemoteReplicationConfigModel;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.exception.RepoConfigException;
-import org.artifactory.cron.CronUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import static org.apache.http.HttpStatus.SC_BAD_REQUEST;
-import static org.apache.http.HttpStatus.SC_FORBIDDEN;
-import static org.apache.http.HttpStatus.SC_UNAUTHORIZED;
-
-/**
- * Service validates values in the model and sets default values as needed.
- *
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ReplicationConfigValidator {
-    private static final Logger log = LoggerFactory.getLogger(ReplicationConfigValidator.class);
-
-    @Autowired
-    AddonsManager addonsManager;
-
-    @Autowired
-    CentralConfigService configService;
-
-    @Autowired
-    RepositoryService repoService;
-
-    /**
-     * Validates the given local repo replication models and sets default values where needed and nulls are given
-     *
-     * @throws RepoConfigException
-     */
-    public void validateLocalModels(List<LocalReplicationConfigModel> replications) throws RepoConfigException {
-        long enabledReplications = replications.stream()
-                .filter(LocalReplicationConfigModel::isEnabled)
-                .count();
-        if (replications.size() > 0 && !addonsManager.isLicenseInstalled()) {
-            throw new RepoConfigException("Replication is only available with a pro license and above", SC_FORBIDDEN);
-        } else if (enabledReplications > 1 && !addonsManager.isHaLicensed()) {
-            throw new RepoConfigException("Multi-push replication is only available with an Enterprise license.",
-                    SC_FORBIDDEN);
-        }
-        if (replications.size() > 1) {
-            checkForDuplicateUrls(replications);
-        }
-        for (LocalReplicationConfigModel replication : replications) {
-            if (!CronUtils.isValid(replication.getCronExp())) {
-                throw new RepoConfigException("Invalid cron expression", SC_BAD_REQUEST);
-            }
-            replication.setEnabled(Optional.of(replication.isEnabled()).orElse(false));
-            //Required field, but don't fail validation for it as default is in place
-            replication.setSocketTimeout(Optional.of(replication.getSocketTimeout()).orElse(15000));
-            replication.setSyncDeletes(Optional.of(replication.isSyncDeletes()).orElse(false));
-            replication.setSyncProperties(Optional.of(replication.isSyncProperties()).orElse(false));
-            replication.setEnableEventReplication(Optional.of(replication.isEnableEventReplication()).orElse(false));
-            String proxyKey = replication.getProxy();
-            if ((StringUtils.isNotBlank(proxyKey)) && (configService.getDescriptor().getProxy(proxyKey) == null)) {
-                throw new RepoConfigException("Invalid proxy configuration name", SC_BAD_REQUEST);
-            }
-            if (StringUtils.isBlank(replication.getUrl())) {
-                throw new RepoConfigException("Replication url is required", SC_BAD_REQUEST);
-            }
-            if (StringUtils.isBlank(replication.getUsername())) {
-                throw new RepoConfigException("Replication username is required", SC_BAD_REQUEST);
-            }
-        }
-    }
-
-    /**
-     * Validates the given local repo replication models and sets default values where needed and nulls are given
-     * Returns one remote Config model(because only one is allowed) or fails if the model contains more than one
-     *
-     * @throws RepoConfigException
-     */
-    public RemoteReplicationConfigModel validateRemoteModel(RemoteRepositoryConfigModel repo)
-            throws RepoConfigException {
-
-        //No config given
-        List<RemoteReplicationConfigModel> replications = repo.getReplications();
-        if (replications == null || replications.size() < 1 || replications.get(0) == null) {
-            log.debug("No replication configuration given for repo {}", repo.getGeneral().getRepoKey());
-            return null;
-        }
-        if (!addonsManager.isLicenseInstalled()) {
-            throw new RepoConfigException("Replication is only available with a pro license", SC_FORBIDDEN);
-        } else if (repo.getReplications().size() > 1) {
-            throw new RepoConfigException("Only one pull replication configuration is allowed", SC_BAD_REQUEST);
-        }
-        RemoteReplicationConfigModel replication = replications.get(0);
-        if (StringUtils.isNotBlank(replication.getCronExp()) && replication.isEnabled()
-                && !CronUtils.isValid(replication.getCronExp())) {
-            throw new RepoConfigException("Invalid cron expression", SC_BAD_REQUEST);
-        }
-        if (replication.isEnabled() &&
-                (repo.getAdvanced().getNetwork() == null
-                        || StringUtils.isBlank(repo.getAdvanced().getNetwork().getUsername())
-                        || StringUtils.isBlank(repo.getAdvanced().getNetwork().getPassword()))) {
-            throw new RepoConfigException("Pull replication requires non-anonymous authentication to the remote " +
-                    "repository.\nPlease make sure to fill-in the 'Username' and 'Password' fields in the " +
-                    "'Advanced Settings' tab. ", SC_UNAUTHORIZED);
-        }
-        replication.setEnabled(Optional.of(replication.isEnabled()).orElse(false));
-        replication.setSyncDeletes(Optional.of(replication.isSyncDeletes()).orElse(false));
-        replication.setSyncProperties(Optional.of(replication.isSyncProperties()).orElse(false));
-        return replication;
-    }
-
-    public void validateAllTargetReplicationLicenses(LocalRepoDescriptor repo,
-            List<LocalReplicationDescriptor> replications) throws RepoConfigException {
-        String failMessage = "Multi Push Replication is supported for targets with an enterprise license only";
-        String errorMessage = null; //is returned if something unexpected happened during tests
-        int numOfActiveReplication = 0;
-        int numOfTargetsFailed = 0;
-        int numberOfTargetSucceeded = 0;
-        int numOfReplications = replications.size();
-        for (LocalReplicationDescriptor replication : replications) {
-            try {
-                if (!replication.isEnabled()) {
-                    continue;
-                }
-                numOfActiveReplication++;
-                addonsManager.addonByType(ReplicationAddon.class).validateTargetLicense(replication, repo,
-                        numOfReplications);
-                numberOfTargetSucceeded++;
-            } catch (Exception error) {
-                if (error.getMessage().equals(failMessage)) {
-                    numOfTargetsFailed++;
-                } else {
-                    errorMessage = "Error occurred while testing replication config for url '" + replication.getUrl()
-                            + "': " + error.getMessage();
-                }
-            }
-        }
-        if (numOfActiveReplication == numberOfTargetSucceeded) {
-            log.debug("All replication targets for repo {} tested successfully", repo.getKey());
-        } else if (StringUtils.isNotBlank(errorMessage)) {
-            throw new RepoConfigException(errorMessage, SC_BAD_REQUEST);
-        } else if (numOfActiveReplication == numOfTargetsFailed && numOfActiveReplication != 0) {
-            throw new RepoConfigException(failMessage, SC_BAD_REQUEST);
-        } else {
-            throw new RepoConfigException("Note: " + failMessage, SC_BAD_REQUEST);
-        }
-    }
-
-    private void checkForDuplicateUrls(List<LocalReplicationConfigModel> replications) throws RepoConfigException {
-        Set<String> allItems = new HashSet<>(); //util set to catch duplicate urls
-        Set<String> duplicates = replications.stream()
-                .map(LocalReplicationConfigModel::getUrl)
-                .filter(url -> !allItems.add(url))
-                .collect(Collectors.toSet());
-        //duplicates now contains all duplicate urls if any
-        if (duplicates.size() > 0) {
-            throw new RepoConfigException("Url '" + duplicates.iterator().next() + "' already exists as a " +
-                    "replication target for this repository", SC_BAD_REQUEST);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/validator/RepoConfigValidator.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/validator/RepoConfigValidator.java
deleted file mode 100644
index efce006..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/validator/RepoConfigValidator.java
+++ /dev/null
@@ -1,549 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.util.validator;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.webstart.ArtifactWebstartAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.RepoType;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-import org.artifactory.descriptor.repo.vcs.VcsGitProvider;
-import org.artifactory.ui.rest.model.admin.configuration.propertysets.PropertySetNameModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.AdvancedRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.BasicRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.RepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.distribution.DistributionAdvancedRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.distribution.DistributionBasicRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.distribution.DistributionRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.local.LocalAdvancedRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.local.LocalBasicRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.local.LocalRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.remote.*;
-import org.artifactory.ui.rest.model.admin.configuration.repository.typespecific.*;
-import org.artifactory.ui.rest.model.admin.configuration.repository.virtual.VirtualBasicRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.virtual.VirtualRepositoryConfigModel;
-import org.artifactory.ui.rest.model.admin.configuration.repository.virtual.VirtualSelectedRepository;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.exception.RepoConfigException;
-import org.artifactory.util.CollectionUtils;
-import org.artifactory.util.UiRequestUtils;
-import org.artifactory.util.UrlValidator;
-import org.jdom2.Verifier;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-
-import static org.apache.http.HttpStatus.*;
-import static org.artifactory.ui.rest.model.admin.configuration.repository.RepoConfigDefaultValues.*;
-
-/**
- * Service validates values in the model and sets default values as needed.
- *
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class RepoConfigValidator {
-
-    private static final int REPO_KEY_MAX_LENGTH = 64;
-    private static final List<Character> forbiddenChars = Lists.newArrayList('/', '\\', ':', '|', '?', '*', '"', '<', '>');
-    private final transient UrlValidator urlValidator = new UrlValidator("http", "https");
-
-    @Autowired
-    private CentralConfigService centralConfig;
-
-    @Autowired
-    private RepositoryService repoService;
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    public void validateLocal(LocalRepositoryConfigModel model) throws RepoConfigException {
-        verifyAllSectionsExist(model);
-        LocalBasicRepositoryConfigModel basic = model.getBasic();
-        LocalAdvancedRepositoryConfigModel advanced = model.getAdvanced();
-        TypeSpecificConfigModel typeSpecific = model.getTypeSpecific();
-
-        //basic
-        validateSharedBasic(basic);
-
-        //advanced
-        validateSharedAdvanced(advanced);
-
-        //type specific
-        validateSharedTypeSpecific(typeSpecific);
-        validateLocalTypeSpecific(typeSpecific);
-    }
-
-    public void validateRemote(RemoteRepositoryConfigModel model) throws RepoConfigException {
-        verifyAllSectionsExist(model);
-        RemoteBasicRepositoryConfigModel basic = model.getBasic();
-        RemoteAdvancedRepositoryConfigModel advanced = model.getAdvanced();
-        TypeSpecificConfigModel typeSpecific = model.getTypeSpecific();
-
-        //basic
-        validateSharedBasic(basic);
-        if (StringUtils.isBlank(basic.getUrl())) {
-            throw new RepoConfigException("URL cannot be empty", SC_BAD_REQUEST);
-        }
-        try {
-            urlValidator.validate(basic.getUrl());
-        } catch (UrlValidator.UrlValidationException e) {
-            throw new RepoConfigException("Invalid URL: " + e.getMessage(), SC_BAD_REQUEST, e);
-        }
-        if (basic.getRemoteLayoutMapping() != null
-                && centralConfig.getDescriptor().getRepoLayout(basic.getLayout()) == null) {
-            throw new RepoConfigException("Invalid remote repository layout", SC_BAD_REQUEST);
-        }
-        basic.setOffline(Optional.ofNullable(basic.isOffline()).orElse(DEFAULT_OFFLINE));
-
-        //advanced
-        validateSharedAdvanced(advanced);
-        advanced.setHardFail(Optional.ofNullable(advanced.getHardFail()).orElse(DEFAULT_HARD_FAIL));
-        advanced.setStoreArtifactsLocally(
-                Optional.ofNullable(advanced.isStoreArtifactsLocally()).orElse(DEFAULT_STORE_ARTIFACTS_LOCALLY));
-        advanced.setSynchronizeArtifactProperties(
-                Optional.ofNullable(advanced.getSynchronizeArtifactProperties()).orElse(DEFAULT_SYNC_PROPERTIES));
-        advanced.setShareConfiguration(
-                Optional.ofNullable(advanced.isShareConfiguration()).orElse(DEFAULT_SHARE_CONFIG));
-        advanced.setBlockMismatchingMimeTypes(
-                Optional.ofNullable(advanced.isBlockMismatchingMimeTypes()).orElse(DEFAULT_BLOCK_MISMATCHING_MIME_TYPES));
-
-        //network
-        RemoteNetworkRepositoryConfigModel network = advanced.getNetwork();
-        if (network != null) {
-            if (StringUtils.isNotBlank(network.getProxy()) && centralConfig.getDescriptor().getProxy(network.getProxy()) == null) {
-                throw new RepoConfigException("Invalid proxy configuration", SC_BAD_REQUEST);
-            }
-            network.setSocketTimeout(Optional.ofNullable(network.getSocketTimeout()).orElse(DEFAULT_SOCKET_TIMEOUT));
-            network.setSyncProperties(Optional.ofNullable(network.isSyncProperties()).orElse(DEFAULT_SYNC_PROPERTIES));
-            network.setCookieManagement(
-                    Optional.ofNullable(network.getCookieManagement()).orElse(DEFAULT_COOKIE_MANAGEMENT));
-            network.setLenientHostAuth(
-                    Optional.ofNullable(network.getLenientHostAuth()).orElse(DEFAULT_LENIENENT_HOST_AUTH));
-        }
-
-        //cache
-        RemoteCacheRepositoryConfigModel cache = advanced.getCache();
-        if (cache != null) {
-
-            cache.setKeepUnusedArtifactsHours(
-                    Optional.ofNullable(cache.getKeepUnusedArtifactsHours()).orElse(DEFAULT_KEEP_UNUSED_ARTIFACTS));
-            cache.setRetrievalCachePeriodSecs(
-                    Optional.ofNullable(cache.getRetrievalCachePeriodSecs()).orElse(DEFAULT_RETRIEVAL_CACHE_PERIOD));
-            cache.setAssumedOfflineLimitSecs(
-                    Optional.ofNullable(cache.getAssumedOfflineLimitSecs()).orElse(DEFAULT_ASSUMED_OFFLINE));
-            cache.setMissedRetrievalCachePeriodSecs(
-                    Optional.ofNullable(cache.getMissedRetrievalCachePeriodSecs()).orElse(
-                            DEFAULT_MISSED_RETRIEVAL_PERIOD));
-        }
-        //type specific
-        validateSharedTypeSpecific(typeSpecific);
-        validateRemoteTypeSpecific(typeSpecific);
-    }
-
-    public void validateVirtual(VirtualRepositoryConfigModel model) throws RepoConfigException {
-        //Sections and aggregated repos validation
-        verifyAllSectionsExist(model);
-        validateAggregatedReposExistAndTypesMatch(model);
-
-        //basic
-        VirtualBasicRepositoryConfigModel basic = model.getBasic();
-        basic.setIncludesPattern(Optional.ofNullable(model.getBasic().getIncludesPattern())
-                .orElse(DEFAULT_INCLUDES_PATTERN));
-
-        //advanced
-        model.getAdvanced().setRetrieveRemoteArtifacts(Optional.ofNullable(model.getAdvanced()
-                .getRetrieveRemoteArtifacts()).orElse(DEFAULT_VIRTUAL_CAN_RETRIEVE_FROM_REMOTE));
-
-        //type specific
-        validateVirtualTypeSpecific(model.getTypeSpecific());
-    }
-
-    public void validateDistribution(DistributionRepositoryConfigModel model) throws RepoConfigException {
-        verifyAllSectionsExist(model);
-        DistributionBasicRepositoryConfigModel basic = model.getBasic();
-        DistributionAdvancedRepositoryConfigModel advanced = model.getAdvanced();
-        DistRepoTypeSpecificConfigModel typeSpecific = model.getTypeSpecific();
-
-        //basic
-        validateSharedBasic(basic);
-        basic.setDefaultNewRepoPrivate(Optional.ofNullable(basic.getDefaultNewRepoPrivate())
-                .orElse(DEFAULT_NEW_BINTRAY_REPO_PRIVATE));
-        basic.setDefaultNewRepoPremium(Optional.ofNullable(basic.getDefaultNewRepoPremium())
-                .orElse(DEFAULT_NEW_BINTRAY_REPO_PREMIUM));
-
-        //advanced
-        validateSharedAdvanced(advanced);
-        advanced.setDistributionRules(Optional.ofNullable(advanced.getDistributionRules()).orElse(Lists.newArrayList()));
-        //type specific
-        validateDistConfig(typeSpecific);
-    }
-
-    /**
-     * Validates all given repo keys exist - throws an error for the first not found one.
-     *
-     * @param repoKeys - Keys to check if existing
-     * @throws RepoConfigException
-     */
-    public void validateSelectedReposInVirtualExist(List<VirtualSelectedRepository> repoKeys)
-            throws RepoConfigException {
-        Set<String> allRepoKeys = repoService.getAllRepoKeys();
-        String nonExistentKey = repoKeys.stream()
-                .map(VirtualSelectedRepository::getRepoName)
-                .filter(repoKey -> !allRepoKeys.contains(repoKey)).findAny().orElse(null);
-        if (StringUtils.isNotBlank(nonExistentKey)) {
-            throw new RepoConfigException("Repository '" + nonExistentKey + "' does not exist", SC_NOT_FOUND);
-        }
-    }
-
-    private void validateAggregatedReposExistAndTypesMatch(VirtualRepositoryConfigModel model)
-            throws RepoConfigException {
-        List<VirtualSelectedRepository> repoKeys = Optional.ofNullable(model.getBasic().getSelectedRepositories())
-                .orElse(Lists.newArrayList());
-        if (CollectionUtils.isNullOrEmpty(repoKeys)) {
-            model.getBasic().setSelectedRepositories(repoKeys);
-        } else {
-            validateSelectedReposInVirtualExist(repoKeys);
-            RepoDescriptor invalidTypeDescriptor = repoKeys.stream()
-                    .map(this::mapRepoKeyToDescriptor)
-                    .filter(repoDescriptor -> !filterByType(model.getTypeSpecific().getRepoType(), repoDescriptor))
-                    .findAny().orElse(null);
-            if (invalidTypeDescriptor != null) {
-                throw new RepoConfigException("Repository '" + model.getGeneral().getRepoKey()
-                        + "' aggregates another repository '" + invalidTypeDescriptor.getKey() + "' that has a "
-                        + "mismatching package type " + invalidTypeDescriptor.getType().name(), SC_FORBIDDEN);
-            }
-        }
-    }
-
-    private boolean filterByType(RepoType type, RepoDescriptor repo) {
-        return repo != null && (type.equals(RepoType.Generic) || type.equals(RepoType.P2) ||
-                (type.isMavenGroup() ? repo.getType().isMavenGroup() : repo.getType().equals(type)));
-    }
-
-    //(RTFACT-4891) and no time to dilly-dally on this
-    public RepoDescriptor mapRepoKeyToDescriptor(VirtualSelectedRepository repository) {
-        String repoKey = repository.getRepoName();
-        RepoDescriptor descriptor = repoService.localRepoDescriptorByKey(repoKey);
-        if (descriptor == null) {
-            descriptor = repoService.remoteRepoDescriptorByKey(repoKey);
-        }
-        if (descriptor == null) {
-            descriptor = repoService.virtualRepoDescriptorByKey(repoKey);
-        }
-        return descriptor;
-    }
-
-
-    private void validateSharedBasic(BasicRepositoryConfigModel basic) throws RepoConfigException {
-        basic.setIncludesPattern(Optional.ofNullable(basic.getIncludesPattern()).orElse(DEFAULT_INCLUDES_PATTERN));
-        if (basic.getLayout() == null || centralConfig.getDescriptor().getRepoLayout(basic.getLayout()) == null) {
-            throw new RepoConfigException("Invalid repository layout", SC_BAD_REQUEST);
-        }
-    }
-
-    private void validateSharedAdvanced(AdvancedRepositoryConfigModel model) throws RepoConfigException {
-        if (model.getPropertySets() == null) {
-            return;
-        }
-        String invalidPropSet = model.getPropertySets().stream()
-                .map(PropertySetNameModel::getName)
-                .filter(propSetName -> !centralConfig.getMutableDescriptor().isPropertySetExists(propSetName))
-                .findAny().orElse(null);
-        if (StringUtils.isNotBlank(invalidPropSet)) {
-            throw new RepoConfigException("Property set " + invalidPropSet + " doesn't exist", SC_NOT_FOUND);
-        }
-        model.setAllowContentBrowsing(
-                Optional.ofNullable(model.getAllowContentBrowsing()).orElse(DEFAULT_ALLOW_CONTENT_BROWSING));
-        model.setBlackedOut(Optional.ofNullable(model.isBlackedOut()).orElse(DEFAULT_BLACKED_OUT));
-    }
-
-    private void validateSharedTypeSpecific(TypeSpecificConfigModel model) {
-        switch (model.getRepoType()) {
-            case Gradle:
-            case Ivy:
-            case SBT:
-                //Maven types suppress pom checks by default, maven does not
-                MavenTypeSpecificConfigModel mavenTypes = (MavenTypeSpecificConfigModel) model;
-                mavenTypes.setSuppressPomConsistencyChecks(Optional.ofNullable(mavenTypes.getSuppressPomConsistencyChecks())
-                        .orElse(DEFAULT_SUPPRESS_POM_CHECKS));
-            case Maven:
-                MavenTypeSpecificConfigModel maven = (MavenTypeSpecificConfigModel) model;
-                maven.setMaxUniqueSnapshots(
-                        Optional.ofNullable(maven.getMaxUniqueSnapshots()).orElse(DEFAULT_MAX_UNIQUE_SNAPSHOTS));
-                maven.setHandleReleases(Optional.ofNullable(maven.getHandleReleases()).orElse(DEFAULT_HANDLE_RELEASES));
-                maven.setHandleSnapshots(
-                        Optional.ofNullable(maven.getHandleSnapshots()).orElse(DEFAULT_HANDLE_SNAPSHOTS));
-                maven.setSuppressPomConsistencyChecks(Optional.ofNullable(maven.getSuppressPomConsistencyChecks())
-                        .orElse(DEFAULT_SUPPRESS_POM_CHECKS));
-                break;
-            case NuGet:
-                NugetTypeSpecificConfigModel nuget = ((NugetTypeSpecificConfigModel) model);
-                nuget.setForceNugetAuthentication(
-                        Optional.ofNullable(nuget.isForceNugetAuthentication()).orElse(DEFAULT_FORCE_NUGET_AUTH));
-                break;
-        }
-    }
-
-    private void validateLocalTypeSpecific(TypeSpecificConfigModel model) throws RepoConfigException {
-        validateSharedTypeSpecific(model);
-        switch (model.getRepoType()) {
-            case YUM:
-                YumTypeSpecificConfigModel yum = (YumTypeSpecificConfigModel) model;
-                yum.setGroupFileNames(Optional.ofNullable(yum.getGroupFileNames()).orElse(DEFAULT_YUM_GROUPFILE_NAME));
-                yum.setMetadataFolderDepth(
-                        Optional.ofNullable(yum.getMetadataFolderDepth()).orElse(DEFAULT_YUM_METADATA_DEPTH));
-                yum.setAutoCalculateYumMetadata(
-                        Optional.ofNullable(yum.isAutoCalculateYumMetadata()).orElse(DEFAULT_YUM_AUTO_CALCULATE));
-                break;
-            case Debian:
-                DebTypeSpecificConfigModel deb = (DebTypeSpecificConfigModel) model;
-                deb.setListRemoteFolderItems(
-                        Optional.ofNullable(deb.isListRemoteFolderItems()).orElse(
-                                DEFAULT_LIST_REMOTE_ITEMS_SUPPORTED_TYPE));
-                deb.setTrivialLayout(Optional.ofNullable(deb.getTrivialLayout()).orElse(DEFAULT_DEB_TRIVIAL_LAYOUT));
-                break;
-            case Opkg:
-                OpkgTypeSpecificConfigModel opkg = (OpkgTypeSpecificConfigModel) model;
-                opkg.setListRemoteFolderItems(Optional.ofNullable(opkg.isListRemoteFolderItems())
-                        .orElse(DEFAULT_LIST_REMOTE_ITEMS_SUPPORTED_TYPE));
-                break;
-            case Docker:
-                DockerTypeSpecificConfigModel docker = (DockerTypeSpecificConfigModel) model;
-                docker.setDockerApiVersion(
-                        Optional.ofNullable(docker.getDockerApiVersion()).orElse(DEFAULT_DOCKER_API_VER));
-                docker.setForceDockerAuthentication(
-                        Optional.ofNullable(docker.isForceDockerAuthentication()).orElse(DEFAULT_FORCE_DOCKER_AUTH));
-                break;
-            case NuGet:
-                NugetTypeSpecificConfigModel nuget = (NugetTypeSpecificConfigModel) model;
-                nuget.setMaxUniqueSnapshots(
-                        Optional.ofNullable(nuget.getMaxUniqueSnapshots()).orElse(DEFAULT_MAX_UNIQUE_SNAPSHOTS));
-                break;
-            case VCS:
-                //Don't fail on bower or pods local
-                if (model.getRepoType().equals(RepoType.Bower) || model.getRepoType().equals(RepoType.CocoaPods)) {
-                    break;
-                }
-            case Distribution:
-            case P2:
-                throw new RepoConfigException("Package type " + model.getRepoType().name()
-                        + " is unsupported in local repositories", SC_BAD_REQUEST);
-        }
-    }
-
-    private void validateRemoteTypeSpecific(TypeSpecificConfigModel model) throws RepoConfigException {
-        validateSharedTypeSpecific(model);
-        switch (model.getRepoType()) {
-            case P2:
-                P2TypeSpecificConfigModel p2 = (P2TypeSpecificConfigModel) model;
-                p2.setSuppressPomConsistencyChecks(Optional.ofNullable(p2.getSuppressPomConsistencyChecks())
-                        .orElse(DEFAULT_SUPPRESS_POM_CHECKS));
-            case Maven:
-            case Gradle:
-            case Ivy:
-            case SBT:
-                MavenTypeSpecificConfigModel maven = (MavenTypeSpecificConfigModel) model;
-                maven.setEagerlyFetchJars(
-                        Optional.ofNullable(maven.getEagerlyFetchJars()).orElse(DEFAULT_EAGERLY_FETCH_JARS));
-                maven.setEagerlyFetchSources(
-                        Optional.ofNullable(maven.getEagerlyFetchSources()).orElse(DEFAULT_EAGERLY_FETCH_SOURCES));
-                maven.setListRemoteFolderItems(Optional.ofNullable(maven.isListRemoteFolderItems())
-                                .orElse(DEFAULT_LIST_REMOTE_ITEMS_SUPPORTED_TYPE));
-                break;
-            case Docker:
-                DockerTypeSpecificConfigModel docker = (DockerTypeSpecificConfigModel) model;
-                docker.setEnableTokenAuthentication(
-                        Optional.ofNullable(docker.isEnableTokenAuthentication()).orElse(DEFAULT_TOKEN_AUTH));
-                docker.setForceDockerAuthentication(
-                        Optional.ofNullable(docker.isForceDockerAuthentication()).orElse(DEFAULT_FORCE_DOCKER_AUTH));
-                docker.setListRemoteFolderItems(Optional.ofNullable(docker.isListRemoteFolderItems())
-                        .orElse(DEFAULT_LIST_REMOTE_ITEMS_UNSUPPORTED_TYPE));
-                break;
-            case Bower:
-                BowerTypeSpecificConfigModel bower = (BowerTypeSpecificConfigModel) model;
-                bower.setRegistryUrl(Optional.ofNullable(bower.getRegistryUrl()).orElse(DEFAULT_BOWER_REGISTRY));
-                validateVcsConfig(bower);
-                break;
-            case CocoaPods:
-                CocoaPodsTypeSpecificConfigModel pods = (CocoaPodsTypeSpecificConfigModel) model;
-                pods.setSpecsRepoUrl(Optional.ofNullable(pods.getSpecsRepoUrl()).orElse(DEFAULT_PODS_SPECS_REPO));
-                pods.setSpecsRepoProvider(Optional.ofNullable(pods.getSpecsRepoProvider()).orElse(DEFAULT_VCS_GIT_CONFIG));
-                validateVcsConfig(pods);
-            case VCS:
-                VcsTypeSpecificConfigModel vcs = (VcsTypeSpecificConfigModel) model;
-                validateVcsConfig(vcs);
-                break;
-            case NuGet:
-                NugetTypeSpecificConfigModel nuGet = (NugetTypeSpecificConfigModel) model;
-                nuGet.setDownloadContextPath(
-                        Optional.ofNullable(nuGet.getDownloadContextPath()).orElse(DEFAULT_NUGET_DOWNLOAD_PATH));
-                nuGet.setFeedContextPath(
-                        Optional.ofNullable(nuGet.getFeedContextPath()).orElse(DEFAULT_NUGET_FEED_PATH));
-                nuGet.setListRemoteFolderItems(Optional.ofNullable(nuGet.isListRemoteFolderItems())
-                        .orElse(DEFAULT_LIST_REMOTE_ITEMS_UNSUPPORTED_TYPE));
-                break;
-            case Debian:
-                DebTypeSpecificConfigModel deb = (DebTypeSpecificConfigModel) model;
-                deb.setListRemoteFolderItems(Optional.ofNullable(deb.isListRemoteFolderItems())
-                        .orElse(DEFAULT_LIST_REMOTE_ITEMS_SUPPORTED_TYPE));
-                break;
-            case Opkg:
-                OpkgTypeSpecificConfigModel opkg = (OpkgTypeSpecificConfigModel) model;
-                opkg.setListRemoteFolderItems(Optional.ofNullable(opkg.isListRemoteFolderItems())
-                        .orElse(DEFAULT_LIST_REMOTE_ITEMS_SUPPORTED_TYPE));
-                break;
-            case YUM:
-                YumTypeSpecificConfigModel yum = (YumTypeSpecificConfigModel) model;
-                yum.setListRemoteFolderItems(Optional.ofNullable(yum.isListRemoteFolderItems())
-                        .orElse(DEFAULT_LIST_REMOTE_ITEMS_SUPPORTED_TYPE));
-                break;
-            case Npm:
-                NpmTypeSpecificConfigModel npm = (NpmTypeSpecificConfigModel) model;
-                npm.setListRemoteFolderItems(Optional.ofNullable(npm.isListRemoteFolderItems())
-                        .orElse(DEFAULT_LIST_REMOTE_ITEMS_SUPPORTED_TYPE));
-                break;
-            case Generic:
-                GenericTypeSpecificConfigModel generic = (GenericTypeSpecificConfigModel) model;
-                generic.setListRemoteFolderItems(Optional.ofNullable(generic.isListRemoteFolderItems())
-                        .orElse(DEFAULT_LIST_REMOTE_ITEMS_SUPPORTED_TYPE));
-                break;
-            case Gems:
-                GemsTypeSpecificConfigModel gems = (GemsTypeSpecificConfigModel) model;
-                gems.setListRemoteFolderItems(Optional.ofNullable(gems.isListRemoteFolderItems())
-                        .orElse(DEFAULT_LIST_REMOTE_ITEMS_SUPPORTED_TYPE));
-                break;
-            case Pypi:
-                PypiTypeSpecificConfigModel pypi = (PypiTypeSpecificConfigModel) model;
-                pypi.setListRemoteFolderItems(Optional.ofNullable(pypi.isListRemoteFolderItems())
-                        .orElse(DEFAULT_LIST_REMOTE_ITEMS_SUPPORTED_TYPE));
-                break;
-            case GitLfs:
-                GitLfsTypeSpecificConfigModel gitlfs = (GitLfsTypeSpecificConfigModel) model;
-                gitlfs.setListRemoteFolderItems(Optional.ofNullable(gitlfs.isListRemoteFolderItems())
-                        .orElse(DEFAULT_LIST_REMOTE_ITEMS_SUPPORTED_TYPE));
-                break;
-            case Vagrant:
-            case Distribution:
-                throw new RepoConfigException("Package type " + model.getRepoType().name()
-                        + " is unsupported in remote repositories", SC_BAD_REQUEST);
-        }
-    }
-
-    private void validateVirtualTypeSpecific(TypeSpecificConfigModel model) throws RepoConfigException {
-        switch (model.getRepoType()) {
-            case P2:
-                P2TypeSpecificConfigModel p2 = (P2TypeSpecificConfigModel) model;
-                p2.setP2Repos(Optional.ofNullable(p2.getP2Repos()).orElse(Lists.newArrayList()));
-            case Maven:
-            case Gradle:
-            case Ivy:
-            case SBT:
-                MavenTypeSpecificConfigModel maven = (MavenTypeSpecificConfigModel) model;
-                maven.setPomCleanupPolicy(
-                        Optional.ofNullable(maven.getPomCleanupPolicy()).orElse(DEFAULT_POM_CLEANUP_POLICY));
-                if (maven.getKeyPair() != null && !addonsManager.addonByType(ArtifactWebstartAddon.class)
-                        .getKeyPairNames().contains(maven.getKeyPair())) {
-                    throw new RepoConfigException("Keypair '" + maven.getKeyPair() + "' doesn't exist", SC_NOT_FOUND);
-                }
-                break;
-            case VCS:
-                //Don't fail on bower and pods virtual
-                if (model.getRepoType().equals(RepoType.Bower) || model.getRepoType().equals(RepoType.CocoaPods)) {
-                    break;
-                }
-            case GitLfs:
-                GitLfsTypeSpecificConfigModel gitlfs = (GitLfsTypeSpecificConfigModel) model;
-                gitlfs.setListRemoteFolderItems(Optional.ofNullable(gitlfs.isListRemoteFolderItems())
-                        .orElse(DEFAULT_LIST_REMOTE_ITEMS_SUPPORTED_TYPE));
-                break;
-            case CocoaPods:
-            case Debian:
-            case Opkg:
-            case Vagrant:
-            case YUM:
-            case Distribution:
-                throw new RepoConfigException("Package type " + model.getRepoType().name()
-                        + " is unsupported in virtual repositories", SC_BAD_REQUEST);
-        }
-    }
-
-    private void verifyAllSectionsExist(RepositoryConfigModel model) throws RepoConfigException {
-        if (model.getGeneral() == null) {
-            throw new RepoConfigException("Repository Key cannot be empty", SC_BAD_REQUEST);
-        } else if (model.getBasic() == null) {
-            throw new RepoConfigException("Basic configuration cannot be empty", SC_BAD_REQUEST);
-        }
-        if (model.getAdvanced() == null) {
-            throw new RepoConfigException("Advanced configuration cannot be empty", SC_BAD_REQUEST);
-        }
-        if (model.getTypeSpecific() == null) {
-            throw new RepoConfigException("Package type configuration cannot be empty", SC_BAD_REQUEST);
-        }
-    }
-
-    public void validateRepoName(String repoKey) throws RepoConfigException {
-        if (StringUtils.isBlank(repoKey)) {
-            throw new RepoConfigException("Repository key cannot be empty", SC_BAD_REQUEST);
-        }
-        if (StringUtils.length(repoKey) > REPO_KEY_MAX_LENGTH) {
-            throw new RepoConfigException("Repository key exceed maximum length", SC_BAD_REQUEST);
-        }
-        if (UiRequestUtils.isReservedName(repoKey)
-                || VirtualRepoDescriptor.GLOBAL_VIRTUAL_REPO_KEY.equalsIgnoreCase(repoKey)) {
-            throw new RepoConfigException("Repository key '" + repoKey + "' is a reserved name", SC_BAD_REQUEST);
-        }
-        if (repoKey.equals(".") || repoKey.equals("..") || repoKey.equals("&")) {
-            throw new RepoConfigException("Invalid Repository key", SC_BAD_REQUEST);
-        }
-        // TODO: [by dan] make this stream-ey
-        char[] nameChars = repoKey.toCharArray();
-        for (char c : nameChars) {
-            for (char fc : forbiddenChars) {
-                if (c == fc) {
-                    throw new RepoConfigException("Repository key contains illegal character '" + c + "'", SC_BAD_REQUEST);
-                }
-            }
-        }
-        String error = Verifier.checkXMLName(repoKey);
-        if (StringUtils.isNotBlank(error)) {
-            throw new RepoConfigException("Repository key contains illegal character", SC_BAD_REQUEST);
-        }
-
-        if (!centralConfig.getMutableDescriptor().isKeyAvailable(repoKey)) {
-            throw new RepoConfigException("Repository key already exist", SC_BAD_REQUEST);
-        }
-    }
-
-    private void validateVcsConfig(VcsTypeSpecificConfigModel vcs) throws RepoConfigException {
-        vcs.setVcsType(Optional.ofNullable(vcs.getVcsType()).orElse(DEFAULT_VCS_TYPE));
-        vcs.setGitProvider(Optional.ofNullable(vcs.getGitProvider()).orElse(DEFAULT_GIT_PROVIDER));
-        if (vcs.getGitProvider().equals(VcsGitProvider.CUSTOM)) {
-            if (StringUtils.isBlank(vcs.getDownloadUrl())) {
-                throw new RepoConfigException("Git Download URL is required for custom Git providers", SC_BAD_REQUEST);
-            }
-        } else if (StringUtils.isNotBlank(vcs.getDownloadUrl())) {
-        //custom url is sent in model but not for custom provider
-            vcs.setDownloadUrl(null);
-        }
-        vcs.setMaxUniqueSnapshots(
-                Optional.ofNullable(vcs.getMaxUniqueSnapshots()).orElse(DEFAULT_MAX_UNIQUE_SNAPSHOTS));
-        vcs.setListRemoteFolderItems(
-                Optional.ofNullable(vcs.isListRemoteFolderItems()).orElse(DEFAULT_LIST_REMOTE_ITEMS_UNSUPPORTED_TYPE));
-    }
-
-    private void validateDistConfig(DistRepoTypeSpecificConfigModel model) throws RepoConfigException {
-        //New repo without authentication string
-        if (StringUtils.isBlank(model.getBintrayAppConfig()) && StringUtils.isBlank(model.getBintrayAuthString())) {
-            throw new RepoConfigException("Bintray OAuth authentication string cannot be empty", HttpStatus.SC_BAD_REQUEST);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/validator/ValidateRepoNameService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/validator/ValidateRepoNameService.java
deleted file mode 100644
index bef1104..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/configuration/repositories/util/validator/ValidateRepoNameService.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.artifactory.ui.rest.service.admin.configuration.repositories.util.validator;
-
-import com.google.common.collect.Maps;
-import org.apache.http.HttpStatus;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.util.exception.RepoConfigException;
-import org.artifactory.ui.utils.RequestUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.Map;
-
-/**
- * Provides the entire validation logic for a repository key for the ui in a single REST call
- *
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ValidateRepoNameService implements RestService {
-
-    @Autowired
-    RepoConfigValidator repoConfigValidator;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String repoKey = RequestUtils.getRepoKeyFromRequest(request);
-        try {
-            repoConfigValidator.validateRepoName(repoKey);
-        } catch (RepoConfigException e) {
-            Map<String, String> errorMap = Maps.newHashMap();
-            errorMap.put("error", e.getMessage());
-            response.iModel(errorMap);
-        }
-        //Always return OK for ui validation
-        response.responseCode(HttpStatus.SC_OK);
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/importexport/ImportExportServiceFactory.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/importexport/ImportExportServiceFactory.java
deleted file mode 100644
index 9723c98..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/importexport/ImportExportServiceFactory.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.artifactory.ui.rest.service.admin.importexport;
-
-import org.artifactory.ui.rest.service.admin.importexport.exportdata.ExportRepositoryService;
-import org.artifactory.ui.rest.service.admin.importexport.exportdata.ExportSystemService;
-import org.artifactory.ui.rest.service.admin.importexport.importdata.ImportRepositoryService;
-import org.artifactory.ui.rest.service.admin.importexport.importdata.ImportSystemService;
-import org.artifactory.ui.rest.service.admin.importexport.importdata.UploadExtractedZipService;
-import org.artifactory.ui.rest.service.admin.importexport.importdata.UploadSystemExtractedZipService;
-import org.springframework.beans.factory.annotation.Lookup;
-
-/**
- * @author Chen Keinan
- */
-public abstract class ImportExportServiceFactory {
-
-    @Lookup
-    public abstract ImportRepositoryService importRepositoryService();
-
-    @Lookup
-    public abstract UploadExtractedZipService uploadExtractedZip();
-
-    @Lookup
-    public abstract ImportSystemService importSystem();
-
-    @Lookup
-    public abstract ExportRepositoryService exportRepository();
-
-    @Lookup
-    public abstract ExportSystemService exportSystem();
-
-    @Lookup
-    public abstract UploadSystemExtractedZipService uploadSystemExtractedZip();
-
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/importexport/exportdata/ExportRepositoryService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/importexport/exportdata/ExportRepositoryService.java
deleted file mode 100644
index bd66c7a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/importexport/exportdata/ExportRepositoryService.java
+++ /dev/null
@@ -1,130 +0,0 @@
-package org.artifactory.ui.rest.service.admin.importexport.exportdata;
-
-import org.artifactory.api.common.ImportExportStatusHolder;
-import org.artifactory.api.config.ExportSettingsImpl;
-import org.artifactory.api.repo.BackupService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.common.StatusEntry;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.importexport.ImportExportSettings;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.File;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ExportRepositoryService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(ExportRepositoryService.class);
-    private static final String ALL_REPOS = "All Repositories";
-
-    @Autowired
-    private RepositoryService repositoryService;
-    @Autowired
-    BackupService backupService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        ImportExportSettings importExportSettings = (ImportExportSettings) request.getImodel();
-        /// get export flags from model
-        File exportToPath = new File(importExportSettings.getPath());
-        boolean excludeMetadata = importExportSettings.isExcludeMetadata();
-        boolean m2Compatible = importExportSettings.isCreateM2CompatibleExport();
-        boolean verbose = importExportSettings.isVerbose();
-        String sourceRepoKey = importExportSettings.getRepository();
-        ImportExportStatusHolder status = new ImportExportStatusHolder();
-        ExportSettingsImpl exportSettings = new ExportSettingsImpl(exportToPath, status);
-        // update export settings flags
-        updateExportSettings(excludeMetadata, m2Compatible, verbose, exportSettings);
-        try {
-            // export repository data
-            exportRepository(exportToPath, sourceRepoKey, exportSettings);
-            // update response with export status
-            updateResponseWithExportStatus(response, exportToPath, sourceRepoKey, status);
-        } catch (Exception e) {
-            updateErrorStatus(response, e);
-        }
-    }
-
-    /**
-     * update export settings flags
-     *
-     * @param excludeMetadata
-     * @param m2Compatible
-     * @param verbose
-     * @param exportSettings
-     */
-    private void updateExportSettings(boolean excludeMetadata, boolean m2Compatible, boolean verbose,
-            ExportSettingsImpl exportSettings) {
-        exportSettings.setIncludeMetadata(!excludeMetadata);
-        exportSettings.setM2Compatible(m2Compatible);
-        exportSettings.setVerbose(verbose);
-    }
-
-    /**
-     * update export error status
-     *
-     * @param artifactoryResponse
-     * @param e
-     */
-    private void updateErrorStatus(RestResponse artifactoryResponse, Exception e) {
-        String message = "Exception occurred during export: ";
-        artifactoryResponse.error(message + e.getMessage());
-        log.error(message, e);
-    }
-
-    /**
-     * update response with info , warn and error status
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param exportToPath        - export to path
-     * @param sourceRepoKey       - export repo key or all
-     * @param status              - export status
-     */
-    private void updateResponseWithExportStatus(RestResponse artifactoryResponse, File exportToPath, String sourceRepoKey,
-            ImportExportStatusHolder status) {
-        List<StatusEntry> warnings = status.getWarnings();
-        if (!warnings.isEmpty()) {
-            artifactoryResponse.warn(
-                    "Warnings have been produces during the export. Please review the logs further information.");
-        }
-        if (status.isError()) {
-            String message = status.getStatusMsg();
-            Throwable exception = status.getException();
-            if (exception != null) {
-                message = exception.getMessage();
-            }
-            artifactoryResponse.error(
-                    "Failed to export from: " + sourceRepoKey + "' to '" + exportToPath + "'. Cause: " +
-                            message);
-        } else {
-            artifactoryResponse.info("Successfully exported '" + sourceRepoKey + "' to '" + exportToPath + "'.");
-        }
-    }
-
-    /**
-     * export repository data to path
-     *
-     * @param exportToPath   - export to path
-     * @param sourceRepoKey  - specific repo key or all
-     * @param exportSettings - export settings
-     */
-    private void exportRepository(File exportToPath, String sourceRepoKey, ExportSettingsImpl exportSettings) {
-        if (ALL_REPOS.equals(sourceRepoKey)) {
-            backupService.backupRepos(exportToPath, exportSettings);
-        } else {
-            repositoryService.exportRepo(sourceRepoKey, exportSettings);
-        }
-    }
-}
-
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/importexport/exportdata/ExportSystemService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/importexport/exportdata/ExportSystemService.java
deleted file mode 100644
index 7745707..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/importexport/exportdata/ExportSystemService.java
+++ /dev/null
@@ -1,128 +0,0 @@
-package org.artifactory.ui.rest.service.admin.importexport.exportdata;
-
-import com.google.common.collect.Lists;
-import org.artifactory.api.common.ImportExportStatusHolder;
-import org.artifactory.api.config.ExportSettingsImpl;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.common.StatusEntry;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.sapi.common.ExportSettings;
-import org.artifactory.ui.rest.model.admin.importexport.ImportExportSettings;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.File;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ExportSystemService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(ExportSystemService.class);
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        final ImportExportStatusHolder status = new ImportExportStatusHolder();
-        ArtifactoryContext context = ContextHelper.get();
-        ImportExportSettings importExportSettings = (ImportExportSettings) request.getImodel();
-        File exportToPath = new File(importExportSettings.getPath());
-        try {
-            ExportSettings settings = new ExportSettingsImpl(exportToPath, status);
-            // update export settings
-            updateExportSettings(importExportSettings, settings);
-            // export system
-            context.exportTo(settings);
-            // update response export feedback
-            updateResponseFeedbackAfterSystemExport(response, status, exportToPath, settings);
-        } catch (Exception e) {
-            updateExceptionFeedback(response, exportToPath, e);
-        }
-    }
-
-    /**
-     * update response with exception feedback
-     *
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param exportToPath        - export to path
-     * @param e                   - exception
-     */
-    private void updateExceptionFeedback(RestResponse artifactoryResponse, File exportToPath, Exception e) {
-        artifactoryResponse.error("Failed to export system to '" + exportToPath + "': " + e.getMessage());
-        log.error("Failed to export system.", e);
-    }
-
-    /**
-     * update response fee
-     *
-     * @param artifactoryResponse
-     * @param status
-     * @param exportToPath
-     * @param settings
-     */
-    private void updateResponseFeedbackAfterSystemExport(RestResponse artifactoryResponse, ImportExportStatusHolder status,
-            File exportToPath, ExportSettings settings) {
-        List<StatusEntry> warnings = status.getWarnings();
-        if (!warnings.isEmpty()) {
-            artifactoryResponse.warn(
-                    warnings.size() + " warning(s) reported during the export. Please review the ");
-        }
-        if (status.isError()) {
-            String message = status.getStatusMsg();
-            Throwable exception = status.getException();
-            if (exception != null) {
-                message = exception.getMessage();
-            }
-            artifactoryResponse.error("Failed to export system to '" + exportToPath + "': " + message);
-        } else {
-            File exportFile = settings.getOutputFile();
-            artifactoryResponse.info("Successfully exported system to '" + exportFile.getPath() + "'.");
-        }
-    }
-
-    /**
-     * update export settings with data from import expport model
-     *
-     * @param importExportSettings import export model (send from client)
-     * @param settings             - export settings
-     */
-    private void updateExportSettings(ImportExportSettings importExportSettings, ExportSettings settings) {
-        settings.setCreateArchive(importExportSettings.isCreateZipArchive());
-        settings.setFailFast(false);
-        settings.setVerbose(importExportSettings.isVerbose());
-        settings.setFailIfEmpty(true);
-        Boolean excludeMetadata = importExportSettings.isExcludeMetadata();
-        settings.setIncludeMetadata(!excludeMetadata);
-        settings.setExcludeBuilds(importExportSettings.isExcluudeBuillds());
-        settings.setM2Compatible(importExportSettings.isCreateM2CompatibleExport());
-        Boolean excludeContent = importExportSettings.isExcludeContent();
-        settings.setExcludeContent(excludeContent);
-        if (!excludeMetadata || !excludeContent) {
-            settings.setRepositories(getAllLocalRepoKeys());
-        }
-    }
-
-    /**
-     * get all local repositories keys
-     *
-     * @return - list of repo keys
-     */
-    private List<String> getAllLocalRepoKeys() {
-        List<String> repoKeys = Lists.newArrayList();
-        repositoryService.getLocalAndCachedRepoDescriptors().forEach(descriptor -> repoKeys.add(descriptor.getKey()));
-        repositoryService.getDistributionRepoDescriptors().forEach(descriptor -> repoKeys.add(descriptor.getKey()));
-        return repoKeys;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/importexport/importdata/ImportRepositoryService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/importexport/importdata/ImportRepositoryService.java
deleted file mode 100644
index a879e35..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/importexport/importdata/ImportRepositoryService.java
+++ /dev/null
@@ -1,189 +0,0 @@
-package org.artifactory.ui.rest.service.admin.importexport.importdata;
-
-import org.apache.commons.io.FileUtils;
-import org.artifactory.api.common.ImportExportStatusHolder;
-import org.artifactory.api.config.ImportSettingsImpl;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.common.StatusEntry;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.importexport.ImportExportSettings;
-import org.artifactory.util.Files;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.File;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ImportRepositoryService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(ImportRepositoryService.class);
-
-    @Autowired
-    private RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        ImportExportStatusHolder status = new ImportExportStatusHolder();
-        ImportExportSettings importExportSettings = (ImportExportSettings) request.getImodel();
-        boolean isZip = importExportSettings.isZip();
-
-        try {
-            // get folder path
-            String filePath = importExportSettings.getPath();
-            String uploadDir = ContextHelper.get().getArtifactoryHome().getTempUploadDir().getAbsolutePath();
-            if (isZip) {
-                filePath = uploadDir + "/" + filePath;
-            }
-            String repoKey = importExportSettings.getRepository();
-            boolean importAllRepos = isImportAllRepos(repoKey);
-            boolean verbose = importExportSettings.isVerbose();
-            boolean excludeMetadata = importExportSettings.isExcludeMetadata();
-            File folder = new File(filePath);
-            folder = setImportAllRepo(filePath, importAllRepos, folder);
-            status.setVerbose(verbose);
-            // create import setting
-            ImportSettingsImpl importSettings = new ImportSettingsImpl(folder, status);
-            // import repository
-            importRepository(response, status, repoKey, filePath, importAllRepos, verbose, excludeMetadata,
-                    importSettings);
-            // delete temp folder after import
-            File fileToDelete = new File(uploadDir, filePath);
-            if (fileToDelete.exists() && isZip) {
-                fileToDelete.delete();
-            }
-            if (status.isError()) {
-                response.error(status.getLastError().getMessage());
-            }
-        } catch (Exception e) {
-            if (isZip) {
-                Files.removeFile(new File(importExportSettings.getPath()));
-            }
-            response.error(e.getMessage());
-        }
-    }
-
-    /**
-     * update import all flag
-     *
-     * @param repoKey - repo key
-     * @return if true - import all repositories
-     */
-    private boolean isImportAllRepos(String repoKey) {
-        if (repoKey.equals("All Repositories")) {
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * import repositories data
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param status              - import status
-     * @param repoKey             - repository key
-     * @param folderPath          - folder path
-     * @param importAllRepos      - if true import to all repositories
-     * @param verbose             - if true set logging verbose
-     * @param excludeMetadata     - if true exclude meta data
-     * @param importSettings      - import setting data
-     */
-    private void importRepository(RestResponse artifactoryResponse, ImportExportStatusHolder status, String repoKey,
-                                  String folderPath, boolean importAllRepos, boolean verbose, boolean excludeMetadata,
-                                  ImportSettingsImpl importSettings) {
-        try {
-            importRepository(repoKey, importAllRepos, verbose, excludeMetadata, importSettings);
-            // update response feedback
-            updateResponseFeedback(artifactoryResponse, status, repoKey, folderPath);
-            // delete folder
-            String uploadDir = ContextHelper.get().getArtifactoryHome().getTempUploadDir().getAbsolutePath();
-            if (folderPath.startsWith(uploadDir)) {
-                FileUtils.deleteDirectory(new File(folderPath));
-            }
-        } catch (Exception e) {
-            status.error(e.getMessage(), log);
-        }
-    }
-
-    /**
-     * update response feedback with import status
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param status              - import status
-     * @param repoKey             - repository key
-     * @param folderPath          - folder path
-     */
-    private void updateResponseFeedback(RestResponse artifactoryResponse, ImportExportStatusHolder status, String repoKey,
-                                        String folderPath) {
-        List<StatusEntry> errors = status.getErrors();
-        List<StatusEntry> warnings = status.getWarnings();
-        if (!errors.isEmpty()) {
-            artifactoryResponse.error(" error(s) reported during the import. ");
-        } else if (!warnings.isEmpty()) {
-            artifactoryResponse.warn(" warning(s) reported during the import.");
-        } else {
-            artifactoryResponse.info("Successfully imported '" + folderPath + "' into '" + repoKey + "'.");
-        }
-    }
-
-    /**
-     * import repository from folder
-     *
-     * @param repoKey         - repository key
-     * @param importAllRepos  - if true import to all repositories
-     * @param verbose         - if true set logging verbose
-     * @param excludeMetadata - if true exclude meta data
-     * @param importSettings  - import setting data
-     */
-    private void importRepository(String repoKey, boolean importAllRepos, boolean verbose, boolean excludeMetadata,
-                                  ImportSettingsImpl importSettings) {
-        updateImportSetting(verbose, excludeMetadata, importSettings);
-        if (importAllRepos) {
-            repositoryService.importAll(importSettings);
-        } else {
-            importSettings.setIndexMarkedArchives(true);
-            repositoryService.importRepo(repoKey, importSettings);
-        }
-    }
-
-    /**
-     * udpate import setting data
-     *
-     * @param verbose         - if true set logging verbose
-     * @param excludeMetadata - if true exclude meta data
-     * @param importSettings  - import setting data
-     */
-    private void updateImportSetting(boolean verbose, boolean excludeMetadata, ImportSettingsImpl importSettings) {
-        importSettings.setFailIfEmpty(true);
-        importSettings.setVerbose(verbose);
-        importSettings.setIncludeMetadata(!excludeMetadata);
-    }
-
-    /**
-     * set import all repo settings
-     *
-     * @param folderPath
-     * @param importAllRepos - if true impport to all repositories
-     * @param folder         - folder path
-     * @return folder path
-     */
-    private File setImportAllRepo(String folderPath, boolean importAllRepos, File folder) {
-        if (importAllRepos) {
-            File repositoriesExportDir = new File(folderPath, "repositories");
-            if (repositoriesExportDir.isDirectory()) {
-                folder = repositoriesExportDir;
-            }
-        }
-        return folder;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/importexport/importdata/ImportSystemService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/importexport/importdata/ImportSystemService.java
deleted file mode 100644
index 7732d95..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/importexport/importdata/ImportSystemService.java
+++ /dev/null
@@ -1,184 +0,0 @@
-package org.artifactory.ui.rest.service.admin.importexport.importdata;
-
-import org.apache.commons.io.FileUtils;
-import org.artifactory.api.common.ImportExportStatusHolder;
-import org.artifactory.api.config.ImportSettingsImpl;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.StatusEntry;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.importexport.ImportExportSettings;
-import org.artifactory.util.ZipUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ImportSystemService implements RestService {
-
-    private static final Logger log = LoggerFactory.getLogger(ImportSystemService.class);
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        ImportExportSettings importExportSettings = (ImportExportSettings) request.getImodel();
-        ImportExportStatusHolder status = new ImportExportStatusHolder();
-        boolean isZip = importExportSettings.isZip();
-        File importFromFolder = null;
-        File importFromPath = null;
-        try {
-            String pathname = importExportSettings.getPath();
-            importFromFolder = new File(pathname);
-            String uploadDir = ContextHelper.get().getArtifactoryHome().getTempUploadDir().getAbsolutePath();
-            if (isZip) {
-                importFromPath = new File(uploadDir, importFromFolder.getName() + "_extract");
-                ZipUtils.extract(importFromFolder, importFromPath);
-            } else {
-                importFromPath = new File(pathname);
-            }
-            // return if path not exist
-            if (!importFromPath.exists()) {
-                updateResponseFeedback(response, importFromPath);
-                return;
-            }
-            // return if folder path do not contain files
-            if (importFromPath.isDirectory()) {
-                if (updateResponse(response, importFromPath)) {
-                    return;
-                }
-                importFromFolder = importFromPath;
-            }
-            // import system data
-            List<StatusEntry> warnings = importSystem(status, importExportSettings, importFromFolder);
-            // update response with post import warnings
-            updateResponsePostImport(response, status, importFromPath, warnings);
-        } catch (Exception e) {
-            response.error("Failed to import system from '" + importFromPath + "': " +
-                    e.getMessage());
-            log.error("Failed to import system.", e);
-        } finally {
-            cleanFolderAndStatus(status, importFromFolder, importFromPath, isZip);
-        }
-    }
-
-    /**
-     * delete folder and clean status
-     *
-     * @param status           - import status
-     * @param importFromFolder - import folder
-     * @param importFromPath   - import folder path
-     */
-    private void cleanFolderAndStatus(ImportExportStatusHolder status, File importFromFolder, File importFromPath,
-                                      boolean isZip) {
-        if (importFromPath != null && isZip(importFromPath)) {
-            //Delete the extracted dir
-            try {
-                if (importFromFolder != null && isZip) {
-                    FileUtils.deleteDirectory(importFromFolder);
-                }
-            } catch (IOException e) {
-                log.warn("Failed to delete export directory: " +
-                        importFromFolder, e);
-            }
-        }
-        status.reset();
-    }
-
-    private void updateResponsePostImport(RestResponse artifactoryResponse, ImportExportStatusHolder status,
-                                          File importFromPath, List<StatusEntry> warnings) {
-        if (!warnings.isEmpty()) {
-            artifactoryResponse.warn(" Warnings have been produces during the export. Please ");
-        }
-        List<String> errors = new ArrayList<>();
-        if (status.isError()) {
-            int errorCount = status.getErrors().size();
-            if (errorCount > 1) {
-                String msg = errorCount + " errors occurred while importing system from '" + importFromPath + "': For more accurate information, please look at the log.";
-                status.getErrors().forEach(error -> errors.add(error.getMessage()));
-                artifactoryResponse.error(msg);
-            } else {
-                String msg = "Error while importing system from '" + importFromPath + "': " + status.getStatusMsg();
-                artifactoryResponse.errors(errors);
-                log.error(msg);
-            }
-        } else {
-            artifactoryResponse.info("Successfully imported system from '" + importFromPath + "'.");
-        }
-    }
-
-    /**
-     * import system data
-     *
-     * @param status               - import status
-     * @param importExportSettings - data import model - hold imports flags
-     * @param importFromFolder     - import folder path
-     * @return
-     */
-    private List<StatusEntry> importSystem(ImportExportStatusHolder status, ImportExportSettings importExportSettings,
-                                           File importFromFolder) {
-        status.status("Importing from directory...", log);
-        boolean verbose = importExportSettings.isVerbose();
-        boolean excludeMetadata = importExportSettings.isExcludeMetadata();
-        boolean excludeContent = importExportSettings.isExcludeContent();
-        ArtifactoryContext context = ContextHelper.get();
-        // update import system flags data
-        ImportSettingsImpl importSettings = new ImportSettingsImpl(importFromFolder, status);
-        importSettings.setFailFast(false);
-        importSettings.setFailIfEmpty(true);
-        importSettings.setVerbose(verbose);
-        importSettings.setIncludeMetadata(!excludeMetadata);
-        importSettings.setExcludeContent(excludeContent);
-        // import system data
-        context.importFrom(importSettings);
-        return status.getWarnings();
-    }
-
-    /**
-     * update response
-     *
-     * @param artifactoryResponse
-     * @param importFromPath
-     * @return
-     */
-    private boolean updateResponse(RestResponse artifactoryResponse, File importFromPath) {
-        if (importFromPath != null && importFromPath.list().length == 0) {
-            artifactoryResponse.error("Directory '" + importFromPath + "' is empty.");
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * update response feedback
-     *
-     * @param artifactoryResponse - encapsulate
-     * @param importFromPath      - import folder path
-     */
-    private void updateResponseFeedback(RestResponse artifactoryResponse, File importFromPath) {
-        artifactoryResponse.error("Specified location '" + importFromPath +
-                "' does not exist.");
-    }
-
-    /**
-     * check if file is zip or not
-     *
-     * @param file - file to upload
-     * @return if true file is zip
-     */
-    private boolean isZip(File file) {
-        return file.getName().toLowerCase(Locale.ENGLISH).endsWith(".zip_extract");
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/importexport/importdata/UploadExtractedZipService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/importexport/importdata/UploadExtractedZipService.java
deleted file mode 100644
index 4e50c9b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/importexport/importdata/UploadExtractedZipService.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.artifactory.ui.rest.service.admin.importexport.importdata;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.importexport.ImportExportSettings;
-import org.artifactory.ui.rest.model.utils.FileUpload;
-import org.artifactory.ui.utils.MultiPartUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UploadExtractedZipService implements RestService {
-
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        List<String> fileNames = new ArrayList<>();
-        FileUpload uploadFile = (FileUpload) request.getImodel();
-        try {
-            String uploadDir = ContextHelper.get().getArtifactoryHome().getTempUploadDir().getAbsolutePath();
-            MultiPartUtils.createTempFolderIfNotExist(uploadDir);
-            // save file to temp folder
-            MultiPartUtils.saveFileDataToTemp(centralConfigService, uploadFile.getFormDataMultiPart(), uploadDir,
-                    fileNames, false);
-            // extract file to temp folder
-            MultiPartUtils.saveUploadFileAsExtracted(new File(uploadDir, fileNames.get(0)), response);
-            ImportExportSettings importExportSettings = new ImportExportSettings(fileNames.get(0) + "_extract");
-            response.iModel(importExportSettings);
-        } catch (Exception e) {
-            response.error(e.getMessage());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/importexport/importdata/UploadSystemExtractedZipService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/importexport/importdata/UploadSystemExtractedZipService.java
deleted file mode 100644
index 5ff1d1e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/importexport/importdata/UploadSystemExtractedZipService.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.artifactory.ui.rest.service.admin.importexport.importdata;
-
-import org.apache.commons.io.FileUtils;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.importexport.ImportExportSettings;
-import org.artifactory.ui.rest.model.utils.FileUpload;
-import org.artifactory.ui.utils.MultiPartUtils;
-import org.artifactory.util.ZipUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UploadSystemExtractedZipService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(UploadSystemExtractedZipService.class);
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        List<String> fileNames = new ArrayList<>();
-        FileUpload uploadFile = (FileUpload) request.getImodel();
-        try {
-            String uploadDir = ContextHelper.get().getArtifactoryHome().getTempUploadDir().getAbsolutePath();
-            MultiPartUtils.createTempFolderIfNotExist(uploadDir);
-            // save file to temp folder
-            MultiPartUtils.saveFileDataToTemp(centralConfigService, uploadFile.getFormDataMultiPart(), uploadDir,
-                    fileNames, false);
-            // extract file to temp folder
-            String importFromFolder = fileNames.get(0) + "_extract";
-            String pathname = uploadDir + "/" + importFromFolder;
-            File extractedDirectory = new File(pathname);
-            FileUtils.deleteDirectory(extractedDirectory);
-            FileUtils.forceMkdir(extractedDirectory);
-            try {
-                File sourceArchive = new File(uploadDir + "/" + fileNames.get(0));
-                ZipUtils.extract(sourceArchive, extractedDirectory);
-                // delete zip file
-                sourceArchive.delete();
-            } catch (Exception e) {
-                String message = "Failed to extract file " + fileNames.get(0);
-                response.error(message);
-                log.error(message, e);
-                return;
-            }
-            ImportExportSettings importExportSettings = new ImportExportSettings(fileNames.get(0) + "_extract");
-
-            response.iModel(importExportSettings);
-        } catch (Exception e) {
-            response.error(e.getMessage());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/replication/BlockGlobalPullReplicationService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/replication/BlockGlobalPullReplicationService.java
deleted file mode 100644
index 7d07862..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/replication/BlockGlobalPullReplicationService.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.artifactory.ui.rest.service.admin.replication;
-
-/**
- * @author gidis
- */
-public interface BlockGlobalPullReplicationService {
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/replication/BlockGlobalPushReplicationService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/replication/BlockGlobalPushReplicationService.java
deleted file mode 100644
index 6fe1b10..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/replication/BlockGlobalPushReplicationService.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.artifactory.ui.rest.service.admin.replication;
-
-/**
- * @author gidis
- */
-public interface BlockGlobalPushReplicationService {
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/SecurityServiceFactory.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/SecurityServiceFactory.java
deleted file mode 100644
index 6dd6acc..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/SecurityServiceFactory.java
+++ /dev/null
@@ -1,260 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security;
-
-import org.artifactory.descriptor.security.UserLockPolicy;
-import org.artifactory.rest.common.dataholder.PasswordContainer;
-import org.artifactory.rest.common.service.admin.userprofile.CreateApiKeyService;
-import org.artifactory.rest.common.service.admin.userprofile.GetApiKeyService;
-import org.artifactory.rest.common.service.admin.userprofile.RevokeApiKeyService;
-import org.artifactory.rest.common.service.admin.userprofile.UpdateApiKeyService;
-import org.artifactory.ui.rest.model.admin.security.oauth.OAuthUserToken;
-import org.artifactory.ui.rest.model.admin.security.user.User;
-import org.artifactory.ui.rest.service.admin.security.auth.annotate.GetCanAnnotateService;
-import org.artifactory.ui.rest.service.admin.security.auth.currentuser.GetCurrentUserService;
-import org.artifactory.ui.rest.service.admin.security.auth.forgotpassword.ForgotPasswordService;
-import org.artifactory.ui.rest.service.admin.security.auth.forgotpassword.LoginRelatedDataService;
-import org.artifactory.ui.rest.service.admin.security.auth.forgotpassword.ResetPasswordService;
-import org.artifactory.ui.rest.service.admin.security.auth.forgotpassword.ValidateResetTokenService;
-import org.artifactory.ui.rest.service.admin.security.auth.login.LoginService;
-import org.artifactory.ui.rest.service.admin.security.auth.logout.LogoutService;
-import org.artifactory.ui.rest.service.admin.security.crowdsso.*;
-import org.artifactory.ui.rest.service.admin.security.general.*;
-import org.artifactory.ui.rest.service.admin.security.group.CreateGroupService;
-import org.artifactory.ui.rest.service.admin.security.group.DeleteGroupService;
-import org.artifactory.ui.rest.service.admin.security.group.GetGroupService;
-import org.artifactory.ui.rest.service.admin.security.group.UpdateGroupService;
-import org.artifactory.ui.rest.service.admin.security.httpsso.GetHttpSsoService;
-import org.artifactory.ui.rest.service.admin.security.httpsso.UpdateHttpSsoService;
-import org.artifactory.ui.rest.service.admin.security.ldap.groups.*;
-import org.artifactory.ui.rest.service.admin.security.ldap.ldapsettings.*;
-import org.artifactory.ui.rest.service.admin.security.oauth.*;
-import org.artifactory.ui.rest.service.admin.security.permissions.*;
-import org.artifactory.ui.rest.service.admin.security.saml.*;
-import org.artifactory.ui.rest.service.admin.security.signingkeys.debiankeys.*;
-import org.artifactory.ui.rest.service.admin.security.signingkeys.keystore.*;
-import org.artifactory.ui.rest.service.admin.security.sshserver.*;
-import org.artifactory.ui.rest.service.admin.security.user.*;
-import org.artifactory.ui.rest.service.admin.security.user.userprofile.UnlockUserProfileService;
-import org.artifactory.ui.rest.service.admin.security.user.userprofile.UpdateUserProfileService;
-import org.springframework.beans.factory.annotation.Lookup;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public abstract class SecurityServiceFactory {
-
-    //authentication service
-    @Lookup
-    public abstract LoginService loginService();
-    @Lookup
-    public abstract ForgotPasswordService forgotPassword();
-    @Lookup
-    public abstract IsSamlAuthentication isSamlAuthentication();
-    @Lookup
-    public abstract GetOAuthSettings getOAuthtSettings();
-    @Lookup
-    public abstract UpdateOrCreateOAuthSettings updateOAuthSettings();
-    @Lookup
-    public abstract AddOAuthProviderSettings addOAuthProviderSettings();
-    @Lookup
-    public abstract UpdateOAuthProviderSettings updateOAuthProviderSettings();
-    @Lookup
-    public abstract DeleteOAuthProviderSettings deleteOAuthProviderSettings();
-
-    @Lookup
-    public abstract GetOAuthTokensForUser getOAuthTokensForUser();
-
-    @Lookup
-    public abstract DeleteOAuthUserToken<OAuthUserToken> deleteOAuthUserToken();
-
-    @Lookup
-    public abstract ValidateResetTokenService validateToken();
-
-    @Lookup
-    public abstract LoginRelatedDataService loginRelatedData();
-
-    @Lookup
-    public abstract GetCurrentUserService getCurrentUser();
-
-    @Lookup
-    public abstract GetCanAnnotateService getCanAnnotateService();
-
-    @Lookup
-    public abstract ResetPasswordService resetPassword();
-
-    @Lookup
-    public abstract LogoutService logoutService();
-    // user services
-    @Lookup
-    public abstract CreateUserService<User> createUser();
-
-    @Lookup
-    public abstract ChangePasswordService<PasswordContainer> changePassword();
-
-    @Lookup
-    public abstract ExpireUserPasswordService<String> expireUserPassword();
-
-    @Lookup
-    public abstract RevalidatePasswordService<String> unexpirePassword();
-
-    @Lookup
-    public abstract ExpirePasswordForAllUsersService expirePasswordForAllUsers();
-
-    @Lookup
-    public abstract RevalidatePasswordForAllUsersService unexpirePasswordForAllUsers();
-
-    @Lookup
-    public abstract CheckExternalStatusService<User> checkExternalStatus();
-
-    @Lookup
-    public abstract UpdateUserService<User> updateUser();
-    @Lookup
-    public abstract DeleteUserService deleteUser();
-    @Lookup
-    public abstract GetUsersService getUsers();
-
-    @Lookup
-    public abstract GetUserPermissionsService getUserPermissions();
-    @Lookup
-    public abstract CreateGroupService createGroup();
-    @Lookup
-    public abstract UpdateGroupService updateGroup();
-    @Lookup
-    public abstract DeleteGroupService deleteGroup();
-    @Lookup
-    public abstract GetGroupService getGroup();
-    @Lookup
-    public abstract UpdateSecurityConfigService updateSecurityConfig();
-    @Lookup
-    public abstract EncryptDecryptService encryptPassword();
-    @Lookup
-    public abstract GetSecurityConfigService getSecurityConfig();
-    @Lookup
-    public abstract UpdateUserLockPolicyService<UserLockPolicy> updateUserLockPolicy();
-    @Lookup
-    public abstract GetUserLockPolicyService getUserLockPolicy();
-    @Lookup
-    public abstract UnlockUserService<String> unlockUser();
-    @Lookup
-    public abstract UnlockUsersService<List> unlockUsers();
-    @Lookup
-    public abstract UnlockAllUsersService unlockAllUsers();
-    @Lookup
-    public abstract GetAllLockedUsersService getAllLockedUsers();
-    @Lookup
-    public abstract GetMasterKeyService getMasterKey();
-    @Lookup
-    public abstract UpdateHttpSsoService updateHttpSso();
-    @Lookup
-    public abstract GetHttpSsoService getHttpSso();
-    @Lookup
-    public abstract UpdateSshServerService updateSshServer();
-    @Lookup
-    public abstract GetSshServerService getSshServer();
-    @Lookup
-    public abstract InstallSshServerKeyService uploadSshServerKey();
-    @Lookup
-    public abstract GetSshServerKeyService getSshServerKey();
-    @Lookup
-    public abstract RemoveSshServerKeyService removeSshServerKeyService();
-    @Lookup
-    public abstract UpdateSamlService updateSaml();
-    @Lookup
-    public abstract GetSamlService getSaml();
-    @Lookup
-    public abstract GetSamlLoginRequestService handleLoginRequest();
-    @Lookup
-    public abstract GetSamlLoginResponseService handleLoginResponse();
-    @Lookup
-    public abstract GetSamlLogoutRequestService handleLogoutRequest();
-    @Lookup
-    public abstract GetCrowdIntegrationService getCrowdIntegration();
-    @Lookup
-    public abstract UpdateCrowdIntegration updateCrowdIntegration();
-    @Lookup
-    public abstract RefreshCrowdGroupsService refreshCrowdGroups();
-    @Lookup
-    public abstract ImportCrowdGroupsService importCrowdGroups();
-    @Lookup
-    public abstract TestCrowdConnectionService testCrowdConnectionService();
-    @Lookup
-    public abstract CreateLdapSettingsService createLdapSettings();
-    @Lookup
-    public abstract UpdateLdapSettingsService updateLdapSettings();
-    @Lookup
-    public abstract GetLdapSettingsService getLdapSettings();
-    @Lookup
-    public abstract DeleteLdapSettingsService deleteLdapSettings();
-    @Lookup
-    public abstract TestLdapSettingsService testLdapSettingsService();
-    @Lookup
-    public abstract ReorderLdapSettingsService reorderLdapSettings();
-    @Lookup
-    public abstract CreateLdapGroupService createLdapGroup();
-    @Lookup
-    public abstract UpdateLdapGroupService updateLdapGroup();
-    @Lookup
-    public abstract GetLdapGroupService getLdapGroup();
-    @Lookup
-    public abstract GroupMappingStrategyService groupMappingStrategy();
-    @Lookup
-    public abstract DeleteLdapGroupService deleteLdapGroup();
-    @Lookup
-    public abstract RefreshLdapGroupService refreshLdapGroup();
-    @Lookup
-    public abstract ImportLdapGroupService importLdapGroup();
-    @Lookup
-    public abstract UnlockUserProfileService unlockUserProfile();
-    @Lookup
-    public abstract UpdateUserProfileService updateUserProfile();
-
-    @Lookup
-    public abstract GetApiKeyService getApiKey();
-
-    @Lookup
-    public abstract CreateApiKeyService createApiKey();
-
-    @Lookup
-    public abstract RevokeApiKeyService revokeApiKey();
-
-    @Lookup
-    public abstract UpdateApiKeyService regenerateApiKey();
-
-    @Lookup
-    public abstract InstallDebianKeyService uploadDebianKey();
-    @Lookup
-    public abstract GetDebianSigningKeyService getDebianSigningKey();
-    @Lookup
-    public abstract RemoveDebianKeyService removeDebianKeyService();
-    @Lookup
-    public abstract VerifyDebianKeyService verifyDebianKey();
-    @Lookup
-    public abstract UpdateDebianKeyService updateDebianKey();
-    @Lookup
-    public abstract AddKeyStoreService addKeyStore();
-    @Lookup
-    public abstract SaveKeyStoreService saveKeyStore();
-    @Lookup
-    public abstract GetKeyStoreService getKeyStore();
-
-    @Lookup
-    public abstract RemoveKeyStorePasswordService removeKeystorePassword();
-    @Lookup
-    public abstract CancelKeyPairService cancelKeyPair();
-    @Lookup
-    public abstract RemoveKeyStoreService removeKeyStore();
-    @Lookup
-    public abstract ChangeKeyStorePasswordService changeKeyStorePassword();
-    @Lookup
-    public abstract GetPermissionsTargetService getPermissionsTarget();
-    @Lookup
-    public abstract GetAllUsersAndGroupsService getAllUsersAndGroups();
-    @Lookup
-    public abstract UpdatePermissionsTargetService updatePermissionsTarget();
-    @Lookup
-    public abstract CreatePermissionsTargetService createPermissionsTarget();
-    @Lookup
-    public abstract DeletePermissionsTargetService deletePermissionsTarget();
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/annotate/GetCanAnnotateService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/annotate/GetCanAnnotateService.java
deleted file mode 100644
index 5ec61f8..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/annotate/GetCanAnnotateService.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.auth.annotate;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.utils.RequestUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Shay Yaakov
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetCanAnnotateService implements RestService {
-
-    @Autowired
-    private AuthorizationService authService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        RepoPath repoPath = RequestUtils.getPathFromRequest(request);
-        response.iModel(authService.canAnnotate(repoPath));
-
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/currentuser/GetCurrentUserService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/currentuser/GetCurrentUserService.java
deleted file mode 100644
index fbce8d6..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/currentuser/GetCurrentUserService.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.auth.currentuser;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.OssAddonsManager;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.ArtifactoryPermission;
-import org.artifactory.ui.rest.model.admin.security.general.SecurityConfig;
-import org.artifactory.ui.rest.model.admin.security.user.BaseUser;
-import org.artifactory.ui.rest.service.admin.security.general.GetSecurityConfigService;
-import org.artifactory.util.Strings;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetCurrentUserService implements RestService {
-
-    @Autowired
-    AddonsManager addonsManager;
-
-    @Autowired
-    AuthorizationService authService;
-
-    @Autowired
-    GetSecurityConfigService getSecurityConfigService;
-
-    @Autowired
-    private SecurityService securityService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        boolean proWithoutLicense=false;
-        if ( ! (addonsManager instanceof OssAddonsManager) && ! addonsManager.isLicenseInstalled()){
-            proWithoutLicense=true;
-        }
-        boolean offlineMode=true;
-        CentralConfigDescriptor descriptor = ContextHelper.get().getCentralConfig().getDescriptor();
-        if (ConstantValues.versionQueryEnabled.getBoolean() && !descriptor.isOfflineMode()) {
-            offlineMode=false;
-        }
-        getSecurityConfigService.execute(request, response);
-        SecurityConfig securityConfig = (SecurityConfig) response.getIModel();
-        boolean canManage = authService.hasPermission(ArtifactoryPermission.MANAGE);
-        BaseUser baseUser = new BaseUser(authService.currentUsername(), authService.isAdmin());
-        baseUser.setCanDeploy(authService.canDeployToLocalRepository());
-        baseUser.setCanManage(canManage || proWithoutLicense);
-        baseUser.setProfileUpdatable(authService.isUpdatableProfile());
-        baseUser.setPreventAnonAccessBuild(securityConfig.isAnonAccessToBuildInfosDisabled());
-        baseUser.setProWithoutLicense(proWithoutLicense);
-        baseUser.setAnonAccessEnabled(securityConfig.isAnonAccessEnabled());
-        baseUser.setRequireProfileUnlock(authService.requireProfileUnlock());
-        baseUser.setRequireProfilePassword(authService.requireProfilePassword());
-        baseUser.setOfflineMode(offlineMode);
-        baseUser.setExistsInDB(!authService.isTransientUser());
-
-        if(!Strings.isNullOrEmpty(authService.currentUsername())) {
-            Integer userPasswordDaysLeft = securityService.getUserPasswordDaysLeft(authService.currentUsername());
-            if (userPasswordDaysLeft != null) {
-                baseUser.setCurrentPasswordValidFor(userPasswordDaysLeft);
-            }
-        }
-
-        response.iModel(baseUser);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/forgotpassword/ForgotPasswordService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/forgotpassword/ForgotPasswordService.java
deleted file mode 100644
index 387f85e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/forgotpassword/ForgotPasswordService.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.auth.forgotpassword;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.CoreAddons;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.login.UserLogin;
-import org.artifactory.util.HttpUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ForgotPasswordService implements RestService {
-
-    @Autowired
-    UserGroupService userGroupService;
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        UserLogin userLogin = (UserLogin) request.getImodel();
-        String resetPasswordUrl = getResetPasswordPageUrl();
-        String username = userLogin.getUser();
-        //Check if username is valid
-        if (StringUtils.isEmpty(username)) {
-            response.error(
-                    "We have sent you via email a link for resetting your password. Please check your inbox.");
-            response.responseCode(500);
-            return;
-        }
-        // rest user password
-        resetPassword(request, response, username,resetPasswordUrl);
-    }
-
-    /**
-     * reset user password
-     * @param artifactoryRequest - encapsulate data require for request
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param username - username
-     */
-    private void resetPassword(ArtifactoryRestRequest artifactoryRequest, RestResponse artifactoryResponse,
-            String username,String resetPasswordUrl) {
-        // if in aol mode then have to go to the dashboard to reset password
-        String remoteAddress = HttpUtils.getRemoteClientAddress(artifactoryRequest.getServletRequest());
-         try {
-            String status = userGroupService.resetPassword(username, remoteAddress, resetPasswordUrl);
-            artifactoryResponse.info(status);
-        } catch (Exception e) {
-            artifactoryResponse.error(e.getMessage());
-        }
-    }
-
-    /**
-     * Get the bookmarkable URL of the reset password page
-     *
-     * @return String - URL to reset password page
-     */
-
-    private String getResetPasswordPageUrl() {
-        CoreAddons addon = ContextHelper.get().beanForType(AddonsManager.class).addonByType(CoreAddons.class);
-        String resetPageUrl = addon.getArtifactoryUrl();
-        if (resetPageUrl != null &&  StringUtils.isNotBlank(resetPageUrl)) {
-            if (!resetPageUrl.endsWith("/")) {
-                resetPageUrl += "/";
-            }
-            if (addon.isAol()) {
-                resetPageUrl += "#/resetpassword";
-            } else {
-                resetPageUrl += HttpUtils.WEBAPP_URL_PATH_PREFIX + "/#/resetpassword";
-            }
-        }
-        return resetPageUrl;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/forgotpassword/LoginRelatedDataService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/forgotpassword/LoginRelatedDataService.java
deleted file mode 100644
index af726ea..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/forgotpassword/LoginRelatedDataService.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.auth.forgotpassword;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.sso.saml.SamlSsoAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.mail.MailServerDescriptor;
-import org.artifactory.descriptor.security.sso.SamlSettings;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.login.UserLogin;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class LoginRelatedDataService implements RestService {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        CentralConfigDescriptor descriptor = centralConfigService.getDescriptor();
-        UserLogin userLogin = new UserLogin();
-        // update saml provider link
-        updateSamlLinkIfEnable(request, descriptor, userLogin);
-        // update display forgot password flag
-        updateDisplayForgotFlag(descriptor, userLogin);
-        updateCanRememberMeFlag(userLogin);
-        response.iModel(userLogin);
-    }
-
-    /**
-     * update display forgot password flag
-     *
-     * @param descriptor - config descriptor
-     * @param userLogin  - user details
-     */
-    private void updateDisplayForgotFlag(CentralConfigDescriptor descriptor, UserLogin userLogin) {
-        MailServerDescriptor mailServer = descriptor.getMailServer();
-        boolean isMailServerEnable = (mailServer != null && mailServer.isEnabled()) ? true : false;
-        if (isMailServerEnable) {
-            userLogin.setForgotPassword(true);
-        } else {
-            userLogin.setForgotPassword(false);
-        }
-    }
-
-    private void updateCanRememberMeFlag(UserLogin userLogin) {
-        userLogin.setCanRememberMe(!ConstantValues.securityDisableRememberMe.getBoolean());
-    }
-
-    /**
-     * @param request    - encapsulate data related to request
-     * @param descriptor - config descriptor
-     * @param userLogin  - user login details
-     */
-    private void updateSamlLinkIfEnable(ArtifactoryRestRequest request, CentralConfigDescriptor descriptor,
-            UserLogin userLogin) {
-        SamlSettings samlSettings = descriptor.getSecurity().getSamlSettings();
-        if (samlSettings != null && samlSettings.isEnableIntegration()) {
-            AddonsManager addons = ContextHelper.get().beanForType(AddonsManager.class);
-            SamlSsoAddon samlSsoAddon = addons.addonByType(SamlSsoAddon.class);
-            String samlLoginIdentityProviderUrl = samlSsoAddon.getSamlLoginIdentityProviderUrl(
-                    request.getServletRequest());
-            // add sso lin if available
-            userLogin.setSsoProviderLink(samlLoginIdentityProviderUrl);
-        }
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/forgotpassword/ResetPasswordService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/forgotpassword/ResetPasswordService.java
deleted file mode 100644
index 2db0d13..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/forgotpassword/ResetPasswordService.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.auth.forgotpassword;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.MutableUserInfo;
-import org.artifactory.ui.rest.model.admin.security.login.UserLogin;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ResetPasswordService<T extends UserLogin> implements RestService<T> {
-    private static final Logger log = LoggerFactory.getLogger(ResetPasswordService.class);
-
-    @Autowired
-    UserGroupService userGroupService;
-    @Autowired
-    SecurityService securityService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-        String passwordGenKey = request.getQueryParamByKey("key");
-        String userName = request.getImodel().getUser();
-        String newPassword = request.getImodel().getPassword();
-        // save new generated password
-        saveNewPassword(response, passwordGenKey, userName, newPassword);
-    }
-
-    /**
-     * validate generated key and save user new password
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param passwordGenKey      - reset password generated key
-     * @param userName            - user name  which run reset passsword
-     * @param newPassword         - new updated password
-     */
-    private void saveNewPassword(RestResponse artifactoryResponse, String passwordGenKey, String userName, String newPassword) {
-        MutableUserInfo user = InfoFactoryHolder.get().copyUser(userGroupService.findUser(userName));
-        // perform key validation before saving new password
-        boolean isKeyValid = validateKey(artifactoryResponse, passwordGenKey, user);
-        if (!isKeyValid) {
-            return;
-        }
-        // key is valid continue with reset password
-        user.setPassword(securityService.generateSaltedPassword(newPassword));
-        user.setGenPasswordKey(null);
-        userGroupService.updateUser(user, true);
-        log.info("The user: '{}' has successfully reset his password.", user.getUsername());
-        artifactoryResponse.info("Password reset successfully.");
-    }
-
-    /**
-     * validate generated key before saving password
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param passwordGenKey      - generated key
-     * @param user                - user which run user password
-     * @Return - if true - reset key is valid
-     */
-    private boolean validateKey(RestResponse artifactoryResponse, String passwordGenKey, MutableUserInfo user) {
-        String passwordKey = user.getGenPasswordKey();
-        if ((StringUtils.isEmpty(passwordKey)) || (!passwordKey.equals(passwordGenKey))) {
-            artifactoryResponse.error("key is not valid");
-            return false;
-        }
-        return true;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/forgotpassword/ValidateResetTokenService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/forgotpassword/ValidateResetTokenService.java
deleted file mode 100644
index 7078030..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/forgotpassword/ValidateResetTokenService.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.auth.forgotpassword;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.UserInfo;
-import org.artifactory.ui.rest.model.admin.security.login.UserLogin;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ValidateResetTokenService implements RestService {
-
-    @Autowired
-    UserGroupService userGroupService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String key = request.getQueryParamByKey("key");
-        // validate key , return user info id found
-        UserInfo userByKey = findUserByKey(key, response);
-        updateResponseModel(response, userByKey);
-    }
-
-    private void updateResponseModel(RestResponse artifactoryResponse, UserInfo userByKey) {
-        if (userByKey != null) {
-            UserLogin userLogin = new UserLogin(userByKey.getUsername());
-            artifactoryResponse.iModel(userLogin);
-        }
-    }
-
-    /**
-     * Returns a user info object that belongs to the user which is associated with the given key If the user is not
-     * found, display a warning and redirect to the login page
-     *
-     * @param key GenPasswordKey
-     * @return UserInfo - UserInfo object of the user that's associated with the given key. Null
-     */
-    public UserInfo findUserByKey(String key, RestResponse artifactoryResponse) {
-        List<UserInfo> userInfoList = userGroupService.getAllUsers(true);
-        for (UserInfo userInfo : userInfoList) {
-            String userKey = userInfo.getGenPasswordKey();
-            if ((!StringUtils.isEmpty(userKey)) && userKey.equals(key)) {
-                return userInfo;
-            }
-        }
-        artifactoryResponse.error("The reset link is invalid.");
-        artifactoryResponse.responseCode(HttpServletResponse.SC_UNAUTHORIZED);
-        return null;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/login/AbstractLoginService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/login/AbstractLoginService.java
deleted file mode 100644
index 2bfc0c4..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/login/AbstractLoginService.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.ui.rest.service.admin.security.auth.login;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.exceptions.LoginDisabledException;
-import org.artifactory.security.exceptions.UserCredentialsExpiredException;
-import org.artifactory.ui.rest.model.admin.security.login.UserLogin;
-import org.artifactory.util.HttpUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.authentication.CredentialsExpiredException;
-import org.springframework.security.authentication.LockedException;
-import org.springframework.security.core.AuthenticationException;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * Provides login services
- *
- * @author Michael Pasternak
- */
-public abstract class AbstractLoginService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(AbstractLoginService.class);
-
-    @Autowired
-    protected SecurityService securityService;
-
-    @Autowired
-    protected UserGroupService userGroupService;
-
-
-    /**
-     * Performs login administration
-     *
-     * @param request  - encapsulate all data require for request processing
-     * @param response - encapsulate all data require from response
-     */
-    @Override
-    public final void execute(ArtifactoryRestRequest request, RestResponse response) {
-        UserLogin userLogin = (UserLogin) request.getImodel();
-
-        try {
-            // makes sure that user is not locked
-            securityService.ensureUserIsNotLocked(userLogin.getUser());
-
-            // delay login if necessary
-            securityService.ensureLoginShouldNotBeDelayed(userLogin.getUser());
-
-            // memorise user last access time
-            securityService.updateUserLastAccess(
-                    userLogin.getUser(),
-                    HttpUtils.getRemoteClientAddress(request.getServletRequest()),
-                    HttpUtils.getSessionAccessTime(request.getServletRequest())
-            );
-
-            doExecute(request, response);
-
-            if(!response.isFailed()) {
-                log.debug("User {} has logged in successfully", userLogin.getUser());
-                // reset any previously registered incorrect login attempts
-                securityService.interceptLoginSuccess(userLogin.getUser());
-            }
-        } catch (LockedException | LoginDisabledException e) {
-            log.debug("{}, cause: {}", e.getMessage(), e);
-            response.error(e.getMessage());
-            response.responseCode(HttpServletResponse.SC_FORBIDDEN);
-        } catch (CredentialsExpiredException e) {
-            response.error(e.getMessage()).responseCode(HttpStatus.SC_FORBIDDEN);
-            response.iModel(new CredentialsExpiredFailedLoginResponse(userGroupService.findUser(userLogin.getUser()).isUpdatableProfile()));
-            return;
-        } catch (AuthenticationException e) {
-            log.debug("Username or password are incorrect, cause: {}", e);
-
-            // register incorrect login attempt and lock user (if enabled)
-            securityService.interceptLoginFailure(
-                    userLogin.getUser(),
-                    HttpUtils.getSessionAccessTime(request.getServletRequest())
-            );
-
-            response.error("Username or Password Are Incorrect");
-            response.responseCode(HttpServletResponse.SC_UNAUTHORIZED);
-        }
-    }
-
-    /**
-     * Performs login
-     *
-     * @param request  - encapsulate all data require for request processing
-     * @param response - encapsulate all data require from response
-     */
-    abstract void doExecute(ArtifactoryRestRequest request, RestResponse response);
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/login/CredentialsExpiredFailedLoginResponse.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/login/CredentialsExpiredFailedLoginResponse.java
deleted file mode 100644
index 471939a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/login/CredentialsExpiredFailedLoginResponse.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.auth.login;
-
-import org.artifactory.rest.common.model.BaseModel;
-
-/**
- * On failed login due to expired credentials, also signifies if the user is updatable or not
- * so that the UI can decide which error message to show (either lets the user change credentials or
- * instructs user to contact admin)
- *
- * @author Dan Feldman
- */
-public class CredentialsExpiredFailedLoginResponse extends BaseModel {
-    private static final String CREDENTIALS_EXPIRED_CODE = "CREDENTIALS_EXPIRED";
-
-    private boolean profileUpdatable;
-    private String code;
-
-    public CredentialsExpiredFailedLoginResponse() {
-    }
-
-    public CredentialsExpiredFailedLoginResponse(boolean profileUpdatable) {
-        this.profileUpdatable = profileUpdatable;
-        this.code = CREDENTIALS_EXPIRED_CODE;
-    }
-
-    public boolean isProfileUpdatable() {
-        return profileUpdatable;
-    }
-
-    public void setProfileUpdatable(boolean profileUpdatable) {
-        this.profileUpdatable = profileUpdatable;
-    }
-
-    public String getCode() {
-        return code;
-    }
-
-    public void setCode(String code) {
-        this.code = code;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/login/HttpLoginArtifactoryRequest.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/login/HttpLoginArtifactoryRequest.java
deleted file mode 100644
index 477a2fa..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/login/HttpLoginArtifactoryRequest.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ui.rest.service.admin.security.auth.login;
-
-import org.apache.http.HttpHeaders;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.request.ArtifactoryRequestBase;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.request.ArtifactoryRequest;
-import org.artifactory.util.HttpUtils;
-
-import javax.servlet.http.HttpServletRequest;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
-
-public class HttpLoginArtifactoryRequest extends ArtifactoryRequestBase {
-
-    private final HttpServletRequest httpRequest;
-
-    public HttpLoginArtifactoryRequest(HttpServletRequest httpRequest) {
-        this.httpRequest = httpRequest;
-        // Login root repo path
-        RepoPath repoPath = InfoFactoryHolder.get().createRepoPath("repo","");
-        setRepoPath(repoPath);
-    }
-
-    @Override
-    public long getLastModified() {
-        return httpRequest.getDateHeader(HttpHeaders.LAST_MODIFIED);
-    }
-
-    @Override
-    public boolean isHeadOnly() {
-        return "HEAD".equalsIgnoreCase(httpRequest.getMethod());
-    }
-
-    @Override
-    public String getClientAddress() {
-        return HttpUtils.getRemoteClientAddress(httpRequest);
-    }
-
-    @Override
-    public String getServletContextUrl() {
-        return HttpUtils.getServletContextUrl(httpRequest);
-    }
-
-    @Override
-    public long getIfModifiedSince() {
-        return httpRequest.getDateHeader(HttpHeaders.IF_MODIFIED_SINCE);
-    }
-
-    @Override
-    public boolean hasIfModifiedSince() {
-        return getIfModifiedSince() != -1;
-    }
-
-    @Override
-    public boolean isFromAnotherArtifactory() {
-        Enumeration origins = getOrigins();
-        return origins.hasMoreElements();
-    }
-
-    @Override
-    public boolean isRecursive() {
-        Enumeration<String> origins = getOrigins();
-        if (origins != null && origins.hasMoreElements()) {
-            ArrayList<String> originsList = Collections.list(origins);
-            String currentHostId = ContextHelper.get().beanForType(AddonsManager.class).addonByType(
-                    HaCommonAddon.class).getHostId();
-            int numOfOrigins = originsList.size();
-            for (String origin : originsList) {
-                if (numOfOrigins > 1 && currentHostId.equals(origin)) {
-                    return true;
-                }
-            }
-        }
-
-        return false;
-    }
-
-    @Override
-    public InputStream getInputStream() throws IOException {
-        return httpRequest.getInputStream();
-    }
-
-    /**
-     * @see javax.servlet.ServletRequest#getContentLength()
-     */
-    @Override
-    public long getContentLength() {
-        return HttpUtils.getContentLength(httpRequest);
-    }
-
-    @Override
-    public String getHeader(String headerName) {
-        return httpRequest.getHeader(headerName);
-    }
-
-    @Override
-    public Enumeration getHeaders(String headerName) {
-        return httpRequest.getHeaders(headerName);
-    }
-
-    @Override
-    public Map<String, String> getHeaders() {
-        String headerName;
-        Map<String, String> headers = new HashMap<>();
-        Enumeration enumeration = httpRequest.getHeaderNames();
-        while (enumeration != null && enumeration.hasMoreElements()) {
-            headerName = (String)enumeration.nextElement();
-            headers.put(headerName, httpRequest.getHeader(headerName));
-        }
-        return headers;
-    }
-
-    @Override
-    public String getUri() {
-        return httpRequest.getRequestURI();
-    }
-
-    @Override
-    public Map<String, String[]> getParameters() {
-        return httpRequest.getParameterMap();
-    }
-
-    @Override
-    public String getParameter(String name) {
-        return httpRequest.getParameter(name);
-    }
-
-    @Override
-    public String[] getParameterValues(String name) {
-        return httpRequest.getParameterValues(name);
-    }
-
-    @Override
-    public String toString() {
-        return getUri();
-    }
-
-    private Enumeration getOrigins() {
-        Enumeration origins = getHeaders(ArtifactoryRequest.ARTIFACTORY_ORIGINATED);
-        if (origins == null) {
-            origins = getHeaders(ArtifactoryRequest.ORIGIN_ARTIFACTORY);
-        }
-        return origins;
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/login/LoginService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/login/LoginService.java
deleted file mode 100644
index 00e92de..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/login/LoginService.java
+++ /dev/null
@@ -1,295 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.auth.login;
-
-import org.artifactory.UiAuthenticationDetails;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.OssAddonsManager;
-import org.artifactory.addon.plugin.PluginsAddon;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.AclService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.security.*;
-import org.artifactory.ui.rest.model.admin.security.general.SecurityConfig;
-import org.artifactory.ui.rest.model.admin.security.login.UserLogin;
-import org.artifactory.ui.rest.model.admin.security.user.BaseUser;
-import org.artifactory.ui.rest.service.admin.security.general.GetSecurityConfigService;
-import org.artifactory.util.UiRequestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.core.context.SecurityContext;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.security.web.authentication.RememberMeServices;
-import org.springframework.security.web.authentication.WebAuthenticationDetails;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import static org.apache.commons.lang.StringUtils.isNotBlank;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class LoginService extends AbstractLoginService {
-    private static final Logger log = LoggerFactory.getLogger(LoginService.class);
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Autowired
-    private AclService aclService;
-
-    @Autowired
-    private GetSecurityConfigService getSecurityConfigService;
-
-    /**
-     * Performs login
-     *
-     * @param request  - encapsulate all data require for request processing
-     * @param response - encapsulate all data require from response
-     */
-    @Override
-    public void doExecute(ArtifactoryRestRequest request, RestResponse response) {
-        UserLogin userLogin = (UserLogin) request.getImodel();
-        ArtifactoryContext artifactoryContext = ContextHelper.get();
-        String userName = userLogin.getUser();
-        UsernamePasswordAuthenticationToken authenticationToken =
-                new UsernamePasswordAuthenticationToken(userName, userLogin.getPassword());
-
-        // authenticate user
-        Authentication authentication = authenticateCredential(
-                authenticationToken, artifactoryContext, request, response
-        );
-
-        // authenticate credential against security providers
-        if (authentication != null) {
-            getSecurityConfigService.execute(request, response);
-            SecurityConfig securityConfig = (SecurityConfig) response.getIModel();
-            // update session and remember me service with login data
-            updateSessionAndRememberMeServiceWithLoginData(request, response, userLogin,
-                    artifactoryContext, authenticationToken, authentication);
-            AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-            addonsManager.addonByType(PluginsAddon.class).executeAdditiveRealmPlugins(
-                    new HttpLoginArtifactoryRequest(request.getServletRequest()));
-            //update response with user login data
-            updateResponseWithLoginUser(response, userLogin, artifactoryContext, securityConfig);
-            // TODO: [chenk] fix this ^^^, not reachable without dependency to artifactory-core
-        }
-    }
-
-    /**
-     * update session and remember me service with user login data
-     *
-     * @param artifactoryRequest  - encapsulate all data related for request
-     * @param artifactoryResponse - encapsulate all data require for response
-     * @param userLogin           - user login data
-     * @param artifactoryContext  - artifactory application context
-     * @param authenticationToken - authentication token created with username and password
-     * @param authentication      - authentication created after authenticating the token against providers
-     */
-    private void updateSessionAndRememberMeServiceWithLoginData(ArtifactoryRestRequest artifactoryRequest,
-            RestResponse artifactoryResponse, UserLogin userLogin, ArtifactoryContext artifactoryContext,
-            UsernamePasswordAuthenticationToken authenticationToken, Authentication authentication) {
-        // update authentication data to session and DB
-        boolean isUpdateSucceeded = updateSessionAndDB(artifactoryContext, userLogin.getUser(),
-                authenticationToken, authentication, artifactoryRequest);
-        // update remember me service if session update succeeded
-        updateRememberMeService(artifactoryContext, isUpdateSucceeded, artifactoryRequest, artifactoryResponse);
-    }
-
-    /**
-     * update response with Login User data
-     *  @param artifactoryResponse - encapsulate all data require for response
-     * @param userLogin           - user login data
-     * @param artifactoryContext  - artifactory application context
-     * @param securityConfig
-     */
-    private void updateResponseWithLoginUser(RestResponse artifactoryResponse, UserLogin userLogin,
-                                             ArtifactoryContext artifactoryContext, SecurityConfig securityConfig) {
-        RestModel responseModel = getResponseModel(artifactoryContext, userLogin, securityConfig);
-        artifactoryResponse.iModel(responseModel);
-    }
-
-    /**
-     * update response data with user login model data
-     * @param artifactoryContext - artifactory web context
-     * @param userLogin - user login nae
-     * @param securityConfig
-     */
-    private RestModel getResponseModel(ArtifactoryContext artifactoryContext, UserLogin userLogin, SecurityConfig securityConfig) {
-        boolean proWithoutLicense=false;
-        if ( ! (addonsManager instanceof OssAddonsManager) && ! addonsManager.isLicenseInstalled()){
-            proWithoutLicense=true;
-        }
-        boolean offlineMode=true;
-        CentralConfigDescriptor descriptor = ContextHelper.get().getCentralConfig().getDescriptor();
-        if (ConstantValues.versionQueryEnabled.getBoolean() && !descriptor.isOfflineMode()) {
-            offlineMode=false;
-        }
-        AuthorizationService authService = artifactoryContext.beanForType(AuthorizationService.class);
-        boolean isAdmin = authService.isAdmin();
-        boolean canDeploy = !aclService.getPermissionTargets(
-                ArtifactoryPermission.DEPLOY).isEmpty();
-        boolean canManage = !aclService.getPermissionTargets(
-                ArtifactoryPermission.MANAGE).isEmpty();
-        BaseUser baseUser = new BaseUser(userLogin.getUser(), isAdmin);
-        baseUser.setCanDeploy(canDeploy);
-        baseUser.setCanManage(canManage);
-        baseUser.setProfileUpdatable(authService.isUpdatableProfile());
-        baseUser.setPreventAnonAccessBuild(securityConfig.isAnonAccessToBuildInfosDisabled());
-        baseUser.setProWithoutLicense(proWithoutLicense);
-        baseUser.setOfflineMode(offlineMode);
-        baseUser.setRequireProfileUnlock(authService.requireProfileUnlock());
-        baseUser.setRequireProfilePassword(authService.requireProfilePassword());
-        baseUser.setExistsInDB(!authService.isTransientUser());
-        baseUser.setCurrentPasswordValidFor(securityConfig.getPasswordSettings().getExpirationPolicy().getCurrentPasswordValidFor());
-        return baseUser;
-    }
-
-
-    /**
-     * update spring remember me service with login status
-     * @param artifactoryContext - artifactory web context
-     * @param isUpdateSucceeded - if true authentication has been updated successfully
-     * @param artifactoryRestRequest - encapsulate data related to request
-     * @param artifactoryRestResponse - encapsulate data needed for response
-     */
-    private void updateRememberMeService(ArtifactoryContext artifactoryContext,
-            boolean isUpdateSucceeded,ArtifactoryRestRequest artifactoryRestRequest,
-            RestResponse artifactoryRestResponse) {
-        HttpServletRequest servletRequest = artifactoryRestRequest.getServletRequest();
-        HttpServletResponse servletResponse = artifactoryRestResponse.getServletResponse();
-        if (isUpdateSucceeded) {
-            RememberMeServices rememberMeServices = (RememberMeServices) artifactoryContext.getBean(
-                    "rememberMeServices");
-            if (!ConstantValues.securityDisableRememberMe.getBoolean()) {
-                try {
-                    rememberMeServices.loginSuccess(servletRequest, servletResponse,
-                            AuthenticationHelper.getAuthentication());
-                } catch (UsernameNotFoundException e) {
-                    log.warn("Remember Me service is not supported for transient external users.");
-                }
-            } else {
-                if (!ConstantValues.securityDisableRememberMe.getBoolean()) {
-                    rememberMeServices.loginFail(servletRequest, servletResponse);
-                }
-            }
-        }
-    }
-
-    /**
-     * authenticate credential against Security providers (Artifactory,Ldap , crown and etc)
-     * @param authenticationToken - user credentials
-     * @param artifactoryContext - artifactory web context
-     * @param artifactoryRestRequest - encapsulate data related to request
-     * @param artifactoryRestResponse - encapsulate data related to response
-     * @return Authentication Data
-     */
-    private Authentication authenticateCredential(UsernamePasswordAuthenticationToken authenticationToken,
-            ArtifactoryContext artifactoryContext,ArtifactoryRestRequest artifactoryRestRequest,
-            RestResponse artifactoryRestResponse) {
-        WebAuthenticationDetails details = new UiAuthenticationDetails(artifactoryRestRequest.getServletRequest(),
-                artifactoryRestResponse.getServletResponse());
-        authenticationToken.setDetails(details);
-        AuthenticationManager authenticationManager = (AuthenticationManager) artifactoryContext.getBean("authenticationManager");
-        Authentication authentication = authenticationManager.authenticate(authenticationToken);
-        return authentication;
-    }
-
-    /**
-     * update session and DB with authentication data
-     * @param artifactoryContext - artifactory web context
-     * @param userName - login user name
-     * @param authenticationToken - login authentication token
-     * @param authentication - spring authentication
-     * @param artifactoryRestRequest - encapsulate data related to request
-     * @return if true  data save successfully
-     */
-    private boolean updateSessionAndDB(ArtifactoryContext artifactoryContext, String userName,
-            UsernamePasswordAuthenticationToken authenticationToken, Authentication authentication,
-            ArtifactoryRestRequest artifactoryRestRequest) {
-        boolean isAuthenticate = true;
-        try{
-            if (authentication.isAuthenticated()) {
-                SecurityContext securityContext = SecurityContextHolder.getContext();
-                securityContext.setAuthentication(authenticationToken);
-                setLoginDataToSessionAndDB(securityContext, userName, artifactoryContext, authentication,
-                        artifactoryRestRequest.getServletRequest());
-            }
-        } catch (AuthenticationException e) {
-            isAuthenticate = false;
-            AccessLogger.loginDenied(authenticationToken);
-            if (log.isDebugEnabled()) {
-                log.debug("Failed to authenticate " + userName, e);
-            }
-        }
-        return isAuthenticate;
-    }
-
-    /**
-     * set login data to session and db if succeeded
-     * @param securityContext - spring security context
-     * @param userName - user name
-     * @param context
-     * @param authentication
-     */
-    private void setLoginDataToSessionAndDB(SecurityContext securityContext, String userName,
-            ArtifactoryContext context, Authentication authentication,HttpServletRequest servletRequest) {
-        setAuthentication(authentication,securityContext,servletRequest);
-        if (isNotBlank(userName) && (!userName.equals(UserInfo.ANONYMOUS))) {
-            SecurityService securityService = context.beanForType(SecurityService.class);
-            String remoteAddress = new HttpAuthenticationDetails(servletRequest).getRemoteAddress();
-            securityService.updateUserLastLogin(userName, remoteAddress, System.currentTimeMillis());
-        }
-    }
-
-    /**
-     * set session with authentication data
-     * @param authentication - spring authentication
-     * @param securityContext - spring security context
-     * @param servletRequest - http servlet request
-     */
-    void setAuthentication(Authentication authentication,SecurityContext securityContext,HttpServletRequest servletRequest) {
-        if (authentication.isAuthenticated()) {
-            //Log authentication if not anonymous
-            if (!isAnonymous(authentication)) {
-                AccessLogger.loggedIn(authentication);
-            }
-            //Set a http session token so that we can reuse the login in direct repo browsing
-            UiRequestUtils.setAuthentication(servletRequest, authentication, true);
-            //Update the spring  security context
-            bindAuthentication(securityContext,authentication);
-        }
-    }
-
-    /**
-     * @return True is anonymous user is logged in to this session.
-     */
-    boolean isAnonymous(Authentication authentication) {
-        return authentication != null && UserInfo.ANONYMOUS.equals(authentication.getPrincipal().toString());
-    }
-
-    /**
-     * bind authentication to spring security context
-     * @param securityContext
-     */
-    void bindAuthentication(SecurityContext securityContext,Authentication authentication) {
-        securityContext.setAuthentication(authentication);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/logout/LogoutService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/logout/LogoutService.java
deleted file mode 100644
index 5876d9b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/auth/logout/LogoutService.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.auth.logout;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.AuthenticationHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.web.authentication.logout.LogoutHandler;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class LogoutService implements RestService {
-
-    private static final Logger log = LoggerFactory.getLogger(LogoutService.class);
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        try {
-            Map<String, LogoutHandler> logoutHandlers = ContextHelper.get().beansForType(LogoutHandler.class);
-            tryToLogoutFromProviders(request, response, logoutHandlers);
-        }catch (Exception e){
-            log.debug("failed to perform session logout" , e);
-        }
-    }
-
-    /**
-     * iterate security providers and try to logout
-     *
-     * @param artifactoryRequest  - encapsulate data related to request
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param logoutHandlers      - map of logout handlers
-     */
-    private void tryToLogoutFromProviders(ArtifactoryRestRequest artifactoryRequest,
-            RestResponse artifactoryResponse, Map<String, LogoutHandler> logoutHandlers) {
-        HttpServletRequest servletRequest = artifactoryRequest.getServletRequest();
-        HttpServletResponse servletResponse = artifactoryResponse.getServletResponse();
-        Authentication authentication = AuthenticationHelper.getAuthentication();
-        // logout from all providers
-        for (LogoutHandler logoutHandler : logoutHandlers.values()) {
-            logoutHandler.logout(servletRequest, servletResponse, authentication);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/crowdsso/GetCrowdIntegrationService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/crowdsso/GetCrowdIntegrationService.java
deleted file mode 100644
index 29d6d2e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/crowdsso/GetCrowdIntegrationService.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.crowdsso;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.security.SecurityDescriptor;
-import org.artifactory.descriptor.security.sso.CrowdSettings;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.common.SecurityModelPopulator;
-import org.artifactory.ui.rest.model.admin.security.crowdsso.CrowdIntegration;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetCrowdIntegrationService implements RestService {
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        CrowdSettings crowdSettings = getCrowdSettingsFromDescriptor();
-        // populate crowd setting to model
-        CrowdIntegration crowdConfiguration = SecurityModelPopulator.getCrowdConfiguration(crowdSettings);
-        // update response with model
-        response.iModel(crowdConfiguration);
-    }
-
-    /**
-     * get crowd setting from descriptor
-     *
-     * @return crowd setting model
-     */
-    private CrowdSettings getCrowdSettingsFromDescriptor() {
-        MutableCentralConfigDescriptor centralConfig = centralConfigService.getMutableDescriptor();
-        SecurityDescriptor securityDescriptor = centralConfig.getSecurity();
-        return securityDescriptor.getCrowdSettings();
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/crowdsso/ImportCrowdGroupsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/crowdsso/ImportCrowdGroupsService.java
deleted file mode 100644
index 09569e2..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/crowdsso/ImportCrowdGroupsService.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.crowdsso;
-
-import com.google.common.collect.Iterables;
-import org.artifactory.addon.sso.crowd.CrowdAddon;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.factory.InfoFactory;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.GroupInfo;
-import org.artifactory.security.MutableGroupInfo;
-import org.artifactory.ui.rest.model.admin.security.crowdsso.CrowdGroupModel;
-import org.artifactory.util.CollectionUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ImportCrowdGroupsService implements RestService {
-
-    @Autowired
-    UserGroupService userGroupService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        List<CrowdGroupModel> groups = (List<CrowdGroupModel>) request.getModels();
-        if (CollectionUtils.isNullOrEmpty(groups)) {
-            response.warn("No groups were selected for import");
-            return;
-        }
-        Iterable<CrowdGroupModel> groupsToImport = Iterables.filter(groups, CrowdGroupModel::isImportIntoArtifactory);
-        if (Iterables.isEmpty(groupsToImport)) {
-            response.warn("No groups were selected for import");
-            return;
-        }
-        // import groups
-        importCrowdGroups(groupsToImport);
-        // update feedback
-        response.info("Groups imported successfully");
-    }
-
-    /**
-     * import crowd groups
-     *
-     * @param groupsToImport - liist of groups to import
-     */
-    private void importCrowdGroups(Iterable<CrowdGroupModel> groupsToImport) {
-        List<GroupInfo> artifactoryExternalGroups = userGroupService.getAllExternalGroups();
-        InfoFactory factory = InfoFactoryHolder.get();
-        for (CrowdGroupModel group : groupsToImport) {
-            MutableGroupInfo newGroup = factory.createGroup(group.getGroupName());
-            if (!artifactoryExternalGroups.contains(newGroup)) {
-                newGroup.setDescription(group.getDescription());
-                newGroup.setRealm(CrowdAddon.REALM);
-                userGroupService.createGroup(newGroup);
-                group.setExistsInArtifactory(true);
-            }
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/crowdsso/RefreshCrowdGroupsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/crowdsso/RefreshCrowdGroupsService.java
deleted file mode 100644
index d81a6d6..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/crowdsso/RefreshCrowdGroupsService.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.crowdsso;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.sso.crowd.CrowdAddon;
-import org.artifactory.addon.sso.crowd.CrowdExtGroup;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.factory.InfoFactory;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.GroupInfo;
-import org.artifactory.security.MutableGroupInfo;
-import org.artifactory.ui.rest.model.admin.security.crowdsso.CrowdGroupModel;
-import org.artifactory.ui.rest.model.admin.security.crowdsso.CrowdGroupsModel;
-import org.artifactory.ui.rest.model.admin.security.crowdsso.CrowdIntegration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class RefreshCrowdGroupsService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(RefreshCrowdGroupsService.class);
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Autowired
-    UserGroupService userGroupService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String userName = request.getPathParamByKey("name");
-        // fetch crowd groups
-        CrowdGroupsModel crowdGroupsModels = fetchCrowdGroups(request, response, userName);
-        if (crowdGroupsModels != null) {
-            if(crowdGroupsModels.getCrowdGroupModels().isEmpty()){
-                if (StringUtils.isBlank(userName)){
-                    response.warn("No group found");
-                }else{
-                    response.warn("No group found for filter: " + userName);
-                }
-            }
-            // update response with model
-            response.iModel(crowdGroupsModels);
-        }
-    }
-
-    /**
-     * fetch crowd groups
-     *
-     * @param artifactoryRequest  - encapsulate data related to request
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param userName            - user name
-     */
-    private CrowdGroupsModel fetchCrowdGroups(ArtifactoryRestRequest artifactoryRequest,
-            RestResponse artifactoryResponse,
-            String userName) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        CrowdAddon ssoAddon = addonsManager.addonByType(CrowdAddon.class);
-        Set<CrowdExtGroup> groups;
-        try {
-            CrowdIntegration crowdIntegration   = (CrowdIntegration) artifactoryRequest.getImodel();
-            groups = ssoAddon.findCrowdExtGroups(userName, crowdIntegration);
-        } catch (Exception e) {
-            artifactoryResponse.error(e.getMessage());
-            return null;
-        }
-        updateGroupExistInArtifactory(groups);
-        List<CrowdGroupModel> list = new ArrayList<>();
-        groups.forEach(group -> list.add(new CrowdGroupModel(group)));
-        CrowdGroupsModel crowdGroupsModel = new CrowdGroupsModel();
-        crowdGroupsModel.getCrowdGroupModels().addAll(list);
-        return crowdGroupsModel;
-    }
-
-
-    /**
-     * update exist in artifactory flag data
-     *
-     * @param groups - crowd group
-     */
-    private void updateGroupExistInArtifactory(Set<CrowdExtGroup> groups) {
-        if (!groups.isEmpty()) {
-            InfoFactory factory = InfoFactoryHolder.get();
-            List<GroupInfo> artifactoryExternalGroups = userGroupService.getAllExternalGroups();
-            for (CrowdExtGroup group : groups) {
-                MutableGroupInfo groupToFind = factory.createGroup(group.getGroupName());
-                if (artifactoryExternalGroups.contains(groupToFind)) {
-                    group.setExistsInArtifactory(true);
-                }
-            }
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/crowdsso/TestCrowdConnectionService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/crowdsso/TestCrowdConnectionService.java
deleted file mode 100644
index befc032..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/crowdsso/TestCrowdConnectionService.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.crowdsso;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.sso.crowd.CrowdAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.descriptor.security.sso.CrowdSettings;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class TestCrowdConnectionService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(TestCrowdConnectionService.class);
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        CrowdSettings crowdSettings = (CrowdSettings) request.getImodel();
-        // test crowd connection
-        TestCrowdConnection(response, crowdSettings);
-    }
-
-    /**
-     * test crowd connection to server
-     *
-     * @param artifactoryResponse - encapsulate data require to response
-     * @param crowdSettings       - crowd settings
-     */
-    private void TestCrowdConnection(RestResponse artifactoryResponse, CrowdSettings crowdSettings) {
-        crowdSettings.setPassword(CryptoHelper.encryptIfNeeded(crowdSettings.getPassword()));
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        CrowdAddon crowdAddon = addonsManager.addonByType(CrowdAddon.class);
-        try {
-            if (crowdSettings.isEnableIntegration()) {
-                crowdAddon.testCrowdConnection(crowdSettings);
-                artifactoryResponse.info("Successfully connected to Crowd / Jira users management server");
-            }
-        }
-        catch (Exception e) {
-            if(e.getMessage().contains("java.net.UnknownHostException")){
-                artifactoryResponse.error("Could not access \"" + crowdSettings.getServerUrl() + "\". Verify that host is available");
-            }
-            else {
-                artifactoryResponse.error("An error occurred while testing the settings. View logs for more details");
-            }
-            log.error("An error occurred while testing the new Crowd SSO settings", e);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/crowdsso/UpdateCrowdIntegration.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/crowdsso/UpdateCrowdIntegration.java
deleted file mode 100644
index 3f3dfe4..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/crowdsso/UpdateCrowdIntegration.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.crowdsso;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.security.SecurityDescriptor;
-import org.artifactory.descriptor.security.sso.CrowdSettings;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateCrowdIntegration implements RestService {
-
-    private static final Logger log = LoggerFactory.getLogger(UpdateCrowdIntegration.class);
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        CrowdSettings crowdSettings = (CrowdSettings) request.getImodel();
-        // save crowd settings to config descriptor
-        saveCrowdSettings(response, crowdSettings);
-    }
-
-    /**
-     * save crowd settings to config descriptor
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param crowdSettings       - crowd settings
-     */
-    private void saveCrowdSettings(RestResponse artifactoryResponse, CrowdSettings crowdSettings) {
-        crowdSettings.setPassword(CryptoHelper.encryptIfNeeded(crowdSettings.getPassword()));
-        try {
-            MutableCentralConfigDescriptor centralConfig = centralConfigService.getMutableDescriptor();
-            SecurityDescriptor securityDescriptor = centralConfig.getSecurity();
-            securityDescriptor.setCrowdSettings(crowdSettings);
-            centralConfigService.saveEditedDescriptorAndReload(centralConfig);
-            artifactoryResponse.info("Successfully updated Atlassian Crowd / Jira settings");
-        } catch (Exception e) {
-            artifactoryResponse.error("Failed to save new settings");
-            log.error("An error occurred while saving new Crowd SSO settings", e);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/EncryptDecryptService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/EncryptDecryptService.java
deleted file mode 100644
index 3297bb6..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/EncryptDecryptService.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.general;
-
-import org.artifactory.api.security.MasterEncryptionService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class EncryptDecryptService implements RestService {
-
-    @Autowired
-    MasterEncryptionService masterEncryptionService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String id = request.getPathParamByKey("action");
-        if (id == null || id.length() == 0) {
-            response.responseCode(HttpServletResponse.SC_NOT_FOUND);
-            return;
-        }
-        //encrypt / decrypt password
-        encryptDecryptSecurityConfig(id,response);
-    }
-
-    /**
-     * encrypt / decrypt security config by
-     * @param id - encrypt or decrypt
-     */
-    private void encryptDecryptSecurityConfig(String id,RestResponse restResponse) {
-        if (id.equals("encrypt")){
-            masterEncryptionService.encrypt();
-            restResponse.info("All passwords in your configuration are currently encrypted.");
-        }
-        else{
-            masterEncryptionService.decrypt();
-            restResponse.info("All passwords in your configuration are currently visible in plain text.");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/GetAllLockedUsersService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/GetAllLockedUsersService.java
deleted file mode 100644
index a49dea5..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/GetAllLockedUsersService.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.general;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Michael Pasternak
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetAllLockedUsersService implements RestService {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Autowired
-    private SecurityService securityService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        response.iModel(((UserGroupService)securityService).getLockedUsers());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/GetMasterKeyService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/GetMasterKeyService.java
deleted file mode 100644
index 2bc311e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/GetMasterKeyService.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.general;
-
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.ui.rest.model.admin.security.general.MasterKey;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetMasterKeyService implements RestService {
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        MasterKey masterKey = new MasterKey();
-        masterKey.setHasMasterKey(CryptoHelper.hasMasterKey());
-        response.iModel(masterKey);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/GetSecurityConfigService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/GetSecurityConfigService.java
deleted file mode 100644
index 051a01c..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/GetSecurityConfigService.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.general;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.security.SecurityDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.general.SecurityConfig;
-import org.artifactory.ui.rest.model.admin.security.login.UserLogin;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetSecurityConfigService implements RestService {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Autowired
-    private SecurityService securityService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        UserLogin userLogin = (UserLogin) request.getImodel();
-
-        MutableCentralConfigDescriptor centralConfig = centralConfigService.getMutableDescriptor();
-        SecurityDescriptor securityDescriptor =  centralConfig.getSecurity();
-        SecurityConfig securityConfig = new SecurityConfig(securityDescriptor.isAnonAccessEnabled(),
-                securityDescriptor.isAnonAccessToBuildInfosDisabled(),
-                securityDescriptor.isHideUnauthorizedResources(),
-                securityDescriptor.getPasswordSettings(),
-                securityDescriptor.getUserLockPolicy());
-
-        // set number of days left till password expires, userLogin !=null only when UI logs a user in
-        if(userLogin != null) {
-            Integer userPasswordDaysLeft = securityService.getUserPasswordDaysLeft(userLogin.getUser());
-            if (userPasswordDaysLeft != null) {
-                securityConfig.getPasswordSettings().getExpirationPolicy().setCurrentPasswordValidFor(userPasswordDaysLeft);
-            }
-        }
-
-        response.iModel(securityConfig);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/GetUserLockPolicyService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/GetUserLockPolicyService.java
deleted file mode 100644
index 1ae6c69..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/GetUserLockPolicyService.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.general;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Michael Pasternak
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetUserLockPolicyService implements RestService {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        response.iModel(centralConfigService.getDescriptor().getSecurity().getUserLockPolicy());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/UnlockAllUsersService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/UnlockAllUsersService.java
deleted file mode 100644
index 119fd9a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/UnlockAllUsersService.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.general;
-
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * @author Michael Pasternak
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UnlockAllUsersService implements RestService {
-
-    @Autowired
-    private SecurityService securityService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        ((UserGroupService)securityService).unlockAllUsers();
-        response.info("All users were successfully unlocked");
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/UnlockUserService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/UnlockUserService.java
deleted file mode 100644
index 1a3c672..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/UnlockUserService.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.general;
-
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Michael Pasternak
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UnlockUserService<T extends String> implements RestService<T> {
-
-    @Autowired
-    private SecurityService securityService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-        String userName = request.getImodel();
-        ((UserGroupService)securityService).unlockUser(userName);
-        response.info(String.format("User '%s' was successfully unlocked", userName));
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/UnlockUsersService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/UnlockUsersService.java
deleted file mode 100644
index b44e7ae..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/UnlockUsersService.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.general;
-
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * @author Michael Pasternak
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UnlockUsersService<T extends List> implements RestService<T> {
-
-    @Autowired
-    private SecurityService securityService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-        List<String> users = request.getImodel();
-
-        if(users != null && users.size() > 0) {
-            users.parallelStream().forEach(u -> {
-                ((UserGroupService)securityService).unlockUser(u);
-            });
-            response.info(
-                users.size() > 1 ?
-                    String.format("All users were successfully unlocked", users)
-                    :
-                    String.format("User '%s' was successfully unlocked", users.get(0))
-            );
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/UpdateSecurityConfigService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/UpdateSecurityConfigService.java
deleted file mode 100644
index bf36f0a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/general/UpdateSecurityConfigService.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.general;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.security.SecurityDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.general.SecurityConfig;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateSecurityConfigService implements RestService {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        MutableCentralConfigDescriptor centralConfig = centralConfigService.getMutableDescriptor();
-        SecurityConfig editedDescriptor = (SecurityConfig) request.getImodel();
-        SecurityDescriptor securityDescriptor = centralConfig.getSecurity();
-        updateSecurityDescriptor(editedDescriptor, securityDescriptor);
-        centralConfig.setSecurity(securityDescriptor);
-        centralConfigService.saveEditedDescriptorAndReload(centralConfig);
-        response.info("Successfully updated security settings");
-    }
-
-    /**
-     * update security descriptor general data
-     *
-     * @param editedDescriptor   - changed general data
-     * @param securityDescriptor - config descriptor from memory
-     */
-    private void updateSecurityDescriptor(SecurityConfig editedDescriptor, SecurityDescriptor securityDescriptor) {
-        securityDescriptor.setAnonAccessEnabled(editedDescriptor.isAnonAccessEnabled());
-        securityDescriptor.setAnonAccessToBuildInfosDisabled(editedDescriptor.isAnonAccessToBuildInfosDisabled());
-        securityDescriptor.setHideUnauthorizedResources(editedDescriptor.isHideUnauthorizedResources());
-        securityDescriptor.setPasswordSettings(editedDescriptor.getPasswordSettings());
-        securityDescriptor.setUserLockPolicy(editedDescriptor.getUserLockPolicy());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/group/BaseGroupService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/group/BaseGroupService.java
deleted file mode 100644
index bdfec11..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/group/BaseGroupService.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.group;
-
-import java.util.List;
-
-import org.artifactory.api.security.GroupNotFoundException;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-
-/**
- * @author chen keinan
- */
-public abstract class BaseGroupService implements RestService {
-
-    /**
-     * @param users     - user list to be added to group
-     * @param groupName - group name
-     */
-    protected void addUsertoGroup(List<String> users, String groupName, RestResponse response,
-                                  UserGroupService userGroupService) {
-        if (users != null && !users.isEmpty()) {
-            try {
-                userGroupService.addUsersToGroup(
-                        groupName, users);
-                response.info("Successfully added selected users to group '" + groupName + "'");
-            } catch (GroupNotFoundException gnfe) {
-                response.error("Could not find group '" + groupName + "': " + gnfe.getMessage());
-            }
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/group/CreateGroupService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/group/CreateGroupService.java
deleted file mode 100644
index 6b0ea27..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/group/CreateGroupService.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.group;
-
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.security.MutableGroupInfo;
-import org.artifactory.ui.rest.model.admin.security.group.Group;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CreateGroupService extends BaseGroupService {
-    @Autowired
-    protected SecurityService securityService;
-    @Autowired
-    protected UserGroupService userGroupService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        MutableGroupInfo group = (MutableGroupInfo) request.getImodel();
-        if (userGroupService.findGroup(group.getGroupName()) != null) {
-            response.error("Group '" + group.getGroupName() + "' already exists.");
-            return;
-        }
-        boolean created = userGroupService.createGroup(group);
-        addUsertoGroup(((Group) group).getUsersInGroup(), group.getGroupName(), response, userGroupService);
-        // update response data
-        updateResponse(response, group, created);
-    }
-
-
-    /**
-     * create group in DB and update response
-     * @param restResponse - encapsulate data require for response
-     * @param created - if true group successfully created
-     */
-    private void updateResponse(RestResponse restResponse,
-            MutableGroupInfo group,boolean created) {
-        if (!created) {
-            String errorMsg = "Error with creating group: " + group.getGroupName() ;
-            restResponse.error(errorMsg);
-            return;
-        }
-        else{
-            restResponse.info("Successfully created group '" + group.getGroupName() + "'");
-            restResponse.responseCode(HttpServletResponse.SC_CREATED);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/group/DeleteGroupService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/group/DeleteGroupService.java
deleted file mode 100644
index 86e98fe..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/group/DeleteGroupService.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.group;
-
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.group.DeleteGroupsModel;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletResponse;
-
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DeleteGroupService<T extends DeleteGroupsModel> implements RestService<T> {
-    @Autowired
-    protected UserGroupService userGroupService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-        T model = request.getImodel();
-        for (String groupName : model.getGroupNames()) {
-            if (groupName == null || groupName.length() == 0) {
-                response.responseCode(HttpServletResponse.SC_NOT_FOUND);
-                return;
-            }
-            userGroupService.deleteGroup(groupName);
-
-        }
-        if(model.getGroupNames().size()>1){
-            response.info("Successfully removed "+model.getGroupNames().size()+" groups");
-        }else if(model.getGroupNames().size()==1){
-            response.info("Successfully removed group '" + model.getGroupNames().get(0) + "'");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/group/GetGroupService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/group/GetGroupService.java
deleted file mode 100644
index 20b8c2b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/group/GetGroupService.java
+++ /dev/null
@@ -1,136 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.group;
-
-import org.artifactory.api.security.AclService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.AceInfo;
-import org.artifactory.security.GroupInfo;
-import org.artifactory.security.PermissionTargetInfo;
-import org.artifactory.security.UserInfo;
-import org.artifactory.ui.rest.common.SecurityModelPopulator;
-import org.artifactory.ui.rest.model.admin.security.group.Group;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetGroupService implements RestService {
-
-    @Autowired
-    UserGroupService userGroupService;
-
-    @Autowired
-    AclService aclService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        fetchSingleOrMultiGroup(response, request);
-    }
-
-    /**
-     * fetch single or multi group depend on query and path param
-     *
-     * @param artifactoryResponse   - encapsulate all data related to response
-     * artifactoryRequest - encapsulate data related to request
-     */
-    private void fetchSingleOrMultiGroup(RestResponse artifactoryResponse,
-            ArtifactoryRestRequest artifactoryRequest) {
-        String groupName = artifactoryRequest.getPathParamByKey("id");
-        boolean isDefaultGroupRequire = Boolean.valueOf(artifactoryRequest.getQueryParamByKey("default"));
-        if (isMultiGroup(groupName)) {
-            updateResponseWithMultiGroupInfo(artifactoryResponse, isDefaultGroupRequire);
-        } else {
-            updateResponseWithSingleGroupInfo(artifactoryResponse, groupName);
-        }
-    }
-
-    /**
-     * get Single Group info and update response
-     *
-     * @param artifactoryResponse - encapsulate Data require for response
-     * @param groupName           - group name from path param
-     */
-    private void updateResponseWithSingleGroupInfo(RestResponse artifactoryResponse, String groupName) {
-        Group group = getGroup(groupName);
-        List<UserInfo> usersInGroup = userGroupService.findUsersInGroup(groupName);
-        if (usersInGroup != null) {
-            usersInGroup.forEach(userInfo ->
-                    group.getUsersInGroup().add(userInfo.getUsername()));
-            artifactoryResponse.iModel(group);
-        }
-    }
-
-    /**
-     * get Multi Group info and update response
-     *
-     * @param artifactoryResponse   - encapsulate Data require for response
-     * @param isDefaultGroupRequire - if true , then need to get default groups only
-     */
-    private void updateResponseWithMultiGroupInfo(RestResponse artifactoryResponse,
-            boolean isDefaultGroupRequire) {
-        List<GroupInfo> groupInfos = getGroupInfos(isDefaultGroupRequire);
-        // add groups to List
-        List<RestModel> groupList = new ArrayList<>();
-        groupInfos.stream().forEach(
-                groupInfo -> {
-                    List<String> groups = new ArrayList<>();
-                    groups.add(groupInfo.getGroupName());
-                    Group groupConfiguration = SecurityModelPopulator.getGroupConfiguration(groupInfo);
-                    Map<PermissionTargetInfo, AceInfo> groupsPermissions = aclService.getGroupsPermissions(groups);
-                    List<String> permissions = new ArrayList<>();
-                    groupsPermissions.forEach((perm, acl) -> permissions.add(perm.getName()));
-                    groupConfiguration.setPermissions(permissions);
-                    groupList.add(groupConfiguration);
-                });
-        artifactoryResponse.iModelList(groupList);
-    }
-
-    /**
-     * check id require to get single / multi group
-     *
-     * @param groupName - single group name
-     * @return if true require multi group
-     */
-    private boolean isMultiGroup(String groupName) {
-        return groupName == null || groupName.length() == 0;
-    }
-
-    /**
-     * return group by name
-     *
-     * @param groupName - group name
-     * @return
-     */
-    private Group getGroup(String groupName) {
-        GroupInfo localGroup = userGroupService.findGroup(groupName);
-        Group group = SecurityModelPopulator.getGroupConfiguration(localGroup);
-        return group;
-    }
-    /**
-     * return all groups / default groups
-     *
-     * @param isDefaultGroupRequire - is default group require query param
-     * @return - list of groups info
-     */
-    private List<GroupInfo> getGroupInfos(boolean isDefaultGroupRequire) {
-        List<GroupInfo> groupInfos;
-        if (isDefaultGroupRequire) {
-            groupInfos = userGroupService.getNewUserDefaultGroups();
-        } else {
-            groupInfos = userGroupService.getAllGroups();
-        }
-        return groupInfos;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/group/UpdateGroupService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/group/UpdateGroupService.java
deleted file mode 100644
index 610c71a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/group/UpdateGroupService.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.group;
-
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.security.MutableGroupInfo;
-import org.artifactory.security.UserInfo;
-import org.artifactory.ui.rest.model.admin.security.group.Group;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
-import java.util.List;
-
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateGroupService extends BaseGroupService {
-    private static final Logger log = LoggerFactory.getLogger(UpdateGroupService.class);
-
-    @Autowired
-    protected UserGroupService userGroupService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        MutableGroupInfo group = (MutableGroupInfo) request.getImodel();
-
-        if (isResourceIDNotFound(request)) {
-            response.responseCode(HttpServletResponse.SC_NOT_FOUND);
-            return;
-        }
-        try {
-            // update group model changed data
-            updateGroupInfoData(group);
-            // update users group
-            userGroupService.updateGroupUsers(group, ((Group) group).getUsersInGroup());
-            //update response
-            response.info("Successfully updated group '" + group.getGroupName() + "'");
-        } catch (Exception e) {
-            log.error("error updating group {} users", group.getGroupName());
-        }
-    }
-
-    /**
-     * remove group users before update
-     *
-     * @param group - group data
-     */
-    private void removePrevGroupUsers(MutableGroupInfo group) {
-        List<UserInfo> usersInGroup = userGroupService.findUsersInGroup(group.getGroupName());
-        if (usersInGroup != null && !usersInGroup.isEmpty()) {
-            List<String> userInGroupList = new ArrayList<>();
-            usersInGroup.forEach(userInGroup -> userInGroupList.add(userInGroup.getUsername()));
-            userGroupService.removeUsersFromGroup(group.getGroupName(), userInGroupList);
-        }
-    }
-
-    /**
-     * update group info data
-     *
-     * @param group - group data to be updated
-     */
-    private void updateGroupInfoData(MutableGroupInfo group) {
-        userGroupService.updateGroup(group);
-    }
-
-    /**
-     * check if resource id has been send on path param
-     * artifactoryRequest - encapsulate data related to request
-     *
-     * @return if true resource id not found on path param
-     */
-    private boolean isResourceIDNotFound(ArtifactoryRestRequest artifactoryRequest) {
-        String id = artifactoryRequest.getPathParamByKey("id");
-        return id == null || id.length() == 0;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/httpsso/GetHttpSsoService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/httpsso/GetHttpSsoService.java
deleted file mode 100644
index d2be675..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/httpsso/GetHttpSsoService.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.httpsso;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.security.SecurityDescriptor;
-import org.artifactory.descriptor.security.sso.HttpSsoSettings;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.artifactory.ui.rest.model.admin.security.httpsso.HttpSso;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetHttpSsoService implements RestService {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("GetHttpSso");
-        // get security descriptor
-        SecurityDescriptor securityDescriptor = getSecurityDescriptor();
-        // get http sso
-        HttpSso httpSso = getHttpSso(securityDescriptor);
-        // update response entity
-        response.iModel(httpSso);
-    }
-
-    /**
-     * get Http Sso instance
-     *
-     * @param securityDescriptor - security descriptor
-     * @return security descriptor
-     */
-    private HttpSso getHttpSso(SecurityDescriptor securityDescriptor) {
-        HttpSsoSettings httpSsoSetting = securityDescriptor.getHttpSsoSettings();
-        if (httpSsoSetting == null) {
-            HttpSso httpSso = new HttpSso();
-            httpSso.setNoAutoUserCreation(false);
-            flipCreationLogic(httpSso);
-            return httpSso;
-        }
-        return new HttpSso(httpSsoSetting);
-    }
-
-    /**
-     * get config descriptor
-     *
-     * @return config descriptor
-     */
-    private SecurityDescriptor getSecurityDescriptor() {
-        MutableCentralConfigDescriptor centralConfig = centralConfigService.getMutableDescriptor();
-        return centralConfig.getSecurity();
-    }
-
-    /**
-     * flip logic as descriptor expect not auth user creation
-     * and ui expect auto user creation
-     *
-     * @param httpSsoSettings
-     */
-    private void flipCreationLogic(HttpSsoSettings httpSsoSettings) {
-        boolean creation = httpSsoSettings.isNoAutoUserCreation();
-        httpSsoSettings.setNoAutoUserCreation(!creation);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/httpsso/UpdateHttpSsoService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/httpsso/UpdateHttpSsoService.java
deleted file mode 100644
index 2c43ff0..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/httpsso/UpdateHttpSsoService.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.httpsso;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.security.SecurityDescriptor;
-import org.artifactory.descriptor.security.sso.HttpSsoSettings;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateHttpSsoService implements RestService {
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("UpdateHttpSso");
-        // get config descriptor
-        MutableCentralConfigDescriptor centralConfig = centralConfigService.getMutableDescriptor();
-        SecurityDescriptor securityDescriptor = centralConfig.getSecurity();
-        // update sso setting
-        HttpSsoSettings httpSsoSettings = (HttpSsoSettings) request.getImodel();
-        flipCreationLogic(httpSsoSettings);
-        // save sso setting to descriptor
-        saveSsoSetting(centralConfig, securityDescriptor, httpSsoSettings);
-        response.info("Successfully updated HTTP SSO settings");
-    }
-
-    /**
-     * save sso setting to descriptor
-     *
-     * @param centralConfig      - config descriptor
-     * @param securityDescriptor - security descriptor
-     * @param httpSsoSettings    - http sso setting
-     */
-    private void saveSsoSetting(MutableCentralConfigDescriptor centralConfig, SecurityDescriptor securityDescriptor,
-            HttpSsoSettings httpSsoSettings) {
-        securityDescriptor.setHttpSsoSettings(httpSsoSettings);
-        centralConfigService.saveEditedDescriptorAndReload(centralConfig);
-    }
-
-    /**
-     * flip user creation setting
-     *
-     * @param httpSsoSettings - http sso setting
-     */
-    private void flipCreationLogic(HttpSsoSettings httpSsoSettings) {
-        boolean creation = httpSsoSettings.isNoAutoUserCreation();
-        httpSsoSettings.setNoAutoUserCreation(!creation);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/groups/CreateLdapGroupService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/groups/CreateLdapGroupService.java
deleted file mode 100644
index fc5f908..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/groups/CreateLdapGroupService.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.ldap.groups;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.ldap.LdapGroupModel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CreateLdapGroupService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(CreateLdapGroupService.class);
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        LdapGroupModel ldapSetting = (LdapGroupModel) request.getImodel();
-        // create ldap group
-        createLdapGroup(response, ldapSetting);
-    }
-
-    /**
-     * create ldap group
-     *
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param ldapSetting         - ldap group model
-     */
-    private void createLdapGroup(RestResponse artifactoryResponse, LdapGroupModel ldapSetting) {
-        try {
-            MutableCentralConfigDescriptor configDescriptor = centralConfigService.getMutableDescriptor();
-            configDescriptor.getSecurity().addLdapGroup(ldapSetting);
-            centralConfigService.saveEditedDescriptorAndReload(configDescriptor);
-            artifactoryResponse.info("Successfully created LDAP group '" + ldapSetting.getName() + "'");
-        } catch (Exception e) {
-            log.error("Could not save LDAP group Settings {}", e);
-            artifactoryResponse.error(" Could not be save LDAP group'" + ldapSetting.getName() + "'");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/groups/DeleteLdapGroupService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/groups/DeleteLdapGroupService.java
deleted file mode 100644
index deab3ba..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/groups/DeleteLdapGroupService.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.ldap.groups;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DeleteLdapGroupService implements RestService {
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String groupId = request.getPathParamByKey("id");
-        // delete ldap group
-        deleteLdapGroup(groupId, response);
-    }
-
-    /**
-     * delete ldap group
-     *
-     * @param groupId - group id to be deleted
-     */
-    private void deleteLdapGroup(String groupId, RestResponse artifactoryResponse) {
-        MutableCentralConfigDescriptor configDescriptor = centralConfigService.getMutableDescriptor();
-        configDescriptor.getSecurity().removeLdapGroup(groupId);
-        centralConfigService.saveEditedDescriptorAndReload(configDescriptor);
-        artifactoryResponse.info("Ldap Group " + groupId + " successfully deleted");
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/groups/GetLdapGroupService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/groups/GetLdapGroupService.java
deleted file mode 100644
index cfab8ee..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/groups/GetLdapGroupService.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.ldap.groups;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.security.ldap.group.LdapGroupSetting;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.ldap.LdapGroupModel;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author Chen keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetLdapGroupService implements RestService {
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String groupId = request.getPathParamByKey("id");
-        // fetch ldap groups for view or edit
-        fetchLdapGroupsForViewOrEdit(response, groupId);
-    }
-
-    /**
-     * fetch ldap group for view or edit
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param groupId             - group id
-     */
-    private void fetchLdapGroupsForViewOrEdit(RestResponse artifactoryResponse, String groupId) {
-        MutableCentralConfigDescriptor configDescriptor = centralConfigService.getMutableDescriptor();
-        if (groupId.length() == 0) {
-            // fetch ldap groups for view
-            fetchLdapGroupsForView(artifactoryResponse, configDescriptor);
-        } else {
-            // fetch ldap groups for edit
-            fetchLdapGroupForEdit(artifactoryResponse, groupId, configDescriptor);
-        }
-    }
-
-    /**
-     * fetch ldap group for edit
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param groupId             - group id
-     * @param configDescriptor    - config descriptor
-     */
-    private void fetchLdapGroupForEdit(RestResponse artifactoryResponse, String groupId,
-            MutableCentralConfigDescriptor configDescriptor) {
-        List<LdapGroupSetting> collect = configDescriptor.getSecurity().getLdapGroupSettings().stream().filter(
-                ldapGroupSetting -> ldapGroupSetting.getName().equals(groupId)).collect(
-                Collectors.toList());
-        LdapGroupModel ldapGroupModel = new LdapGroupModel(collect.get(0), false);
-        artifactoryResponse.iModel(ldapGroupModel);
-    }
-
-    /**
-     * fetch ldap group for view
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param configDescriptor    - config descriptor
-     */
-    private void fetchLdapGroupsForView(RestResponse artifactoryResponse,
-            MutableCentralConfigDescriptor configDescriptor) {
-        List<LdapGroupModel> ldapGroupModels = new ArrayList<>();
-        List<LdapGroupSetting> ldapGroupSettings = configDescriptor.getSecurity().getLdapGroupSettings();
-        ldapGroupSettings.forEach(
-                ldapGroupSetting -> ldapGroupModels.add(new LdapGroupModel(ldapGroupSetting, true)));
-        artifactoryResponse.iModelList(ldapGroupModels);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/groups/GroupMappingStrategyService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/groups/GroupMappingStrategyService.java
deleted file mode 100644
index 46a797e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/groups/GroupMappingStrategyService.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.ldap.groups;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.ldap.GroupMappingStrategy;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GroupMappingStrategyService implements RestService {
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String strategy = request.getQueryParamByKey("strategy");
-        if (strategy.length() > 0) {
-            switch (strategy) {
-                case "static":
-                    response.iModel(getStaticGroupMappingStrategy());
-                    break;
-                case "dynamic":
-                    response.iModel(getDynamicGroupMappingStrategy());
-                    break;
-                case "hierarchy":
-                    response.iModel(getHierarchyGroupMappingStrategy());
-                    break;
-                default:
-                    response.iModel(getStaticGroupMappingStrategy());
-                    break;
-            }
-        }
-    }
-
-    /**
-     * get dynamic group mapping strategy
-     *
-     * @return dynamic group mapping strategy
-     */
-    private GroupMappingStrategy getDynamicGroupMappingStrategy() {
-        GroupMappingStrategy groupMappingStrategy = new GroupMappingStrategy("memberOf", "(objectClass=group)", "cn", "description");
-        return groupMappingStrategy;
-    }
-
-    /**
-     * get dynamic group mapping strategy
-     *
-     * @return dynamic group mapping strategy
-     */
-    private GroupMappingStrategy getStaticGroupMappingStrategy() {
-        GroupMappingStrategy groupMappingStrategy = new GroupMappingStrategy("uniqueMember", "(objectClass=groupOfNames)", "cn", "description");
-        return groupMappingStrategy;
-    }
-
-    /**
-     * get dynamic group mapping strategy
-     *
-     * @return dynamic group mapping strategy
-     */
-    private GroupMappingStrategy getHierarchyGroupMappingStrategy() {
-        GroupMappingStrategy groupMappingStrategy = new GroupMappingStrategy("ou", "(objectClass=organizationalUnit)", "cn", "");
-        return groupMappingStrategy;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/groups/ImportLdapGroupService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/groups/ImportLdapGroupService.java
deleted file mode 100644
index 2ad8a02..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/groups/ImportLdapGroupService.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.ldap.groups;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.ldapgroup.LdapUserGroupAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.ldap.LdapGroupModel;
-import org.artifactory.ui.rest.model.admin.security.ldap.LdapImportModel;
-import org.artifactory.ui.rest.model.admin.security.ldap.LdapUserGroupModel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * @author Chen keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ImportLdapGroupService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(ImportLdapGroupService.class);
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        LdapImportModel ldapImportModel = (LdapImportModel) request.getImodel();
-        // import ldap groups to artifactory
-        importGroupsToArtifactory(ldapImportModel, response);
-    }
-
-    /**
-     * import ldap groups to artifactory
-     * @param ldapImportModel -  ldap import model include group setting and groups to import
-     * @param artifactoryResponse - encapsulate data require for response
-     */
-    private void importGroupsToArtifactory(LdapImportModel ldapImportModel, RestResponse artifactoryResponse) {
-        List<LdapUserGroupModel> importGroups = ldapImportModel.getImportGroups();
-        LdapGroupModel ldapGroupModel = ldapImportModel.getLdapGroupSettings();
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        LdapUserGroupAddon ldapGroupWebAddon = addonsManager.addonByType(LdapUserGroupAddon.class);
-        try {
-            ldapGroupWebAddon.importLdapGroupsToArtifactory(importGroups, ldapGroupModel.getStrategy());
-        } catch (Exception e) {
-            String message = "An error occurred during group import" + e.getMessage();
-            log.error(message);
-            artifactoryResponse.error(message);
-            return;
-        }
-        artifactoryResponse.info("Groups successfully imported");
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/groups/RefreshLdapGroupService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/groups/RefreshLdapGroupService.java
deleted file mode 100644
index e2cb337..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/groups/RefreshLdapGroupService.java
+++ /dev/null
@@ -1,155 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.ldap.groups;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.ldapgroup.LdapUserGroup;
-import org.artifactory.addon.ldapgroup.LdapUserGroupAddon;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.GroupInfo;
-import org.artifactory.security.MutableGroupInfo;
-import org.artifactory.ui.rest.model.admin.security.ldap.LdapGroupModel;
-import org.artifactory.ui.rest.model.admin.security.ldap.LdapUserGroupModel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-import static org.apache.commons.lang.StringUtils.isBlank;
-
-/**
- * @author Chen keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class RefreshLdapGroupService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(RefreshLdapGroupService.class);
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Autowired
-    UserGroupService userGroupService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String userName = request.getPathParamByKey("name");
-        LdapGroupModel ldapGroupSetting = (LdapGroupModel) request.getImodel();
-        // refresh ldap group list from ldap server
-        refreshLdapGroups(response, userName, ldapGroupSetting);
-    }
-
-    /**
-     * refresh ldap group list from ldap server
-     * @param artifactoryResponse - encapsulate date require for response
-     * @param userName - user name to filter by
-     * @param ldapGroupSetting - ldap group setting
-     */
-    private void refreshLdapGroups(RestResponse artifactoryResponse, String userName, LdapGroupModel ldapGroupSetting) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        LdapUserGroupAddon ldapGroupWebAddon = addonsManager.addonByType(LdapUserGroupAddon.class);
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-        Set<LdapUserGroup> ldapGroups = ldapGroupWebAddon.refreshLdapGroups(userName, ldapGroupSetting, statusHolder);
-        if (ldapGroups != null && !ldapGroups.isEmpty()) {
-            populateLdapGroupToUserGroupModel(artifactoryResponse, statusHolder, ldapGroups);
-        } else {
-            if (StringUtils.isNotBlank(userName)) {
-                artifactoryResponse.error("Could not find DN for user '" + userName + "'");
-            } else {
-                artifactoryResponse.error("Could not find LDAP groups");
-            }
-        }
-    }
-
-    /**
-     * populate ldap user groups to user groups model
-     *
-     * @param artifactoryResponse - encapsulate date require for response
-     * @param statusHolder        -  ldap user refresh action status holder
-     * @param ldapGroups          - ldap groups
-     */
-    private void populateLdapGroupToUserGroupModel(RestResponse artifactoryResponse, BasicStatusHolder statusHolder,
-            Set<LdapUserGroup> ldapGroups) {
-        log.debug("Retrieved {} groups from LDAP", ldapGroups.size());
-        if (statusHolder.isError()) {
-            artifactoryResponse.error(statusHolder.getLastError().getMessage());
-        } else if (statusHolder.getWarnings().size() != 0) {
-            artifactoryResponse.error(statusHolder.getWarnings().get(0).getMessage());
-        } else {
-            List<GroupInfo> groupInfos = userGroupService.getAllGroups();
-            List<LdapUserGroupModel> ldapGroupModels = new ArrayList<>();
-            ldapGroups.forEach(group -> {
-                MutableGroupInfo artifactoryGroup = InfoFactoryHolder.get().createGroup(group.getGroupName());
-                LdapUserGroupModel groupModel = new LdapUserGroupModel(group.getGroupName(),
-                        group.getDescription(), group.getGroupDn());
-                int groupIndex = groupInfos.indexOf(artifactoryGroup);
-                // update group status
-                updateGroupStatus(groupInfos, group, groupModel, groupIndex);
-                // add group model to list
-                ldapGroupModels.add(groupModel);
-            });
-            artifactoryResponse.info("Successfully retrieved LDAP groups");
-            artifactoryResponse.iModelList(ldapGroupModels);
-        }
-    }
-
-    /**
-     * update group status data
-     *
-     * @param groups     - artifactory groups
-     * @param group      - ldap group
-     * @param groupModel - ldap group model
-     * @param groupIndex - group index in artifactory group
-     */
-    private void updateGroupStatus(List<GroupInfo> groups, LdapUserGroup group, LdapUserGroupModel groupModel,
-            int groupIndex) {
-        if (groupIndex != -1) {
-            GroupInfo groupInfo = groups.get(groupIndex);
-            String realmAttributes = groupInfo.getRealmAttributes();
-            String dn = getDnFromRealmAttributes(realmAttributes);
-            if (!dn.equals(group.getGroupDn())) {
-                groupModel.setRequiredUpdate(LdapUserGroup.Status.REQUIRES_UPDATE);
-            } else {
-                groupModel.setRequiredUpdate(LdapUserGroup.Status.IN_ARTIFACTORY);
-            }
-        } else {
-            groupModel.setRequiredUpdate(LdapUserGroup.Status.DOES_NOT_EXIST);
-        }
-    }
-
-    /**
-     * Get the group DN from a group info realm attributes.
-     *
-     * @param realmAttributes The realm attributes.
-     * @return The group DN
-     */
-    public static String getDnFromRealmAttributes(String realmAttributes) {
-        if (isBlank(realmAttributes)) {
-            log.warn(
-                    "Realm attributes are empty, group was probably created manually in Artifactory, needs to be updated");
-            return "";
-        }
-        int startIndexDn = realmAttributes.indexOf("groupDn=");
-        if (startIndexDn == -1) {
-            return "";
-        }
-        String groupDn = realmAttributes.substring(startIndexDn, realmAttributes.length());
-        startIndexDn = groupDn.indexOf('=');
-        if (startIndexDn == -1) {
-            return "";
-        }
-        return groupDn.substring(startIndexDn + 1, groupDn.length());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/groups/UpdateLdapGroupService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/groups/UpdateLdapGroupService.java
deleted file mode 100644
index 7242eeb..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/groups/UpdateLdapGroupService.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.ldap.groups;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.security.ldap.group.LdapGroupSetting;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateLdapGroupService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(UpdateLdapGroupService.class);
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        LdapGroupSetting ldapSetting = (LdapGroupSetting) request.getImodel();
-        // update ldap group settings
-        updateLdapSettings(response, ldapSetting);
-    }
-
-    /**
-     * update ldap settings
-     *
-     * @param artifactoryResponse - encapsulate data require forr response
-     * @param ldapSetting         ldap group settings
-     */
-    private void updateLdapSettings(RestResponse artifactoryResponse, LdapGroupSetting ldapSetting) {
-        MutableCentralConfigDescriptor configDescriptor = centralConfigService.getMutableDescriptor();
-        try {
-            configDescriptor.getSecurity().ldapGroupSettingChanged(ldapSetting);
-            centralConfigService.saveEditedDescriptorAndReload(configDescriptor);
-            artifactoryResponse.info("Successfully updated LDAP '" + ldapSetting.getName() + "'");
-        } catch (Exception e) {
-            log.error("Failed to save LDAP group settings {}", e);
-            artifactoryResponse.error("Failed to save LDAP '" + ldapSetting.getName() + "'");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/ldapsettings/CreateLdapSettingsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/ldapsettings/CreateLdapSettingsService.java
deleted file mode 100644
index ae3d843..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/ldapsettings/CreateLdapSettingsService.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.ldap.ldapsettings;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.ldap.LdapSettingModel;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CreateLdapSettingsService implements RestService {
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        LdapSettingModel ldapSetting = (LdapSettingModel) request.getImodel();
-        // create New Ldap Setting
-        createNewLdapSetting(response, ldapSetting);
-    }
-
-    /**
-     * create new ldap settings
-     *
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param ldapSetting         - ldap setting model
-     */
-    private void createNewLdapSetting(RestResponse artifactoryResponse, LdapSettingModel ldapSetting) {
-        MutableCentralConfigDescriptor configDescriptor = centralConfigService.getMutableDescriptor();
-        configDescriptor.getSecurity().addLdap(ldapSetting);
-        centralConfigService.saveEditedDescriptorAndReload(configDescriptor);
-        artifactoryResponse.info("Successfully created LDAP settings '" + ldapSetting.getKey() + "'");
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/ldapsettings/DeleteLdapSettingsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/ldapsettings/DeleteLdapSettingsService.java
deleted file mode 100644
index 996ff30..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/ldapsettings/DeleteLdapSettingsService.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.ldap.ldapsettings;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DeleteLdapSettingsService implements RestService {
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String ldapKey = request.getPathParamByKey("id");
-        deleteLdapSetting(ldapKey, response);
-    }
-
-    private void deleteLdapSetting(String ldapKey, RestResponse artifactoryResponse) {
-        MutableCentralConfigDescriptor mutableDescriptor = centralConfigService.getMutableDescriptor();
-        mutableDescriptor.getSecurity().removeLdap(ldapKey);
-        centralConfigService.saveEditedDescriptorAndReload(mutableDescriptor);
-        artifactoryResponse.info("LDAP " + ldapKey + " successfully deleted");
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/ldapsettings/GetLdapSettingsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/ldapsettings/GetLdapSettingsService.java
deleted file mode 100644
index 985366b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/ldapsettings/GetLdapSettingsService.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.ldap.ldapsettings;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.security.ldap.LdapSetting;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.ldap.LdapSettingModel;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetLdapSettingsService implements RestService {
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String ldapKey = request.getPathParamByKey("id");
-        // retrieve ldap data for view or edit
-        fetchLdapViewOrEditData(response, ldapKey);
-    }
-
-    private void fetchLdapViewOrEditData(RestResponse artifactoryResponse, String ldapKey) {
-        if (ldapKey.length() == 0) {
-            List<LdapSettingModel> ldapSettingForView = getLdapSettingForView();
-            artifactoryResponse.iModelList(ldapSettingForView);
-        } else {
-            LdapSettingModel ldapSettingForEdit = getLdapSettingForEdit(ldapKey);
-            artifactoryResponse.iModel(ldapSettingForEdit);
-        }
-    }
-
-    /**
-     * get Ldap setting for edit
-     *
-     * @param ldapKey - ldap repo key
-     * @return ldap setting model
-     */
-    private LdapSettingModel getLdapSettingForEdit(String ldapKey) {
-        LdapSetting ldapSettings = centralConfigService.getMutableDescriptor().getSecurity().getLdapSettings(
-                ldapKey);
-        LdapSettingModel ldapSettingModel = new LdapSettingModel(ldapSettings, false);
-        return ldapSettingModel;
-    }
-
-    /**
-     * return list of ldap settings for view
-     */
-    private List<LdapSettingModel> getLdapSettingForView() {
-        List<LdapSettingModel> settingModelList = new ArrayList<>();
-        List<LdapSetting> ldapSettings =
-                centralConfigService.getMutableDescriptor().getSecurity().getLdapSettings();
-        ldapSettings.forEach(ldapSetting -> settingModelList.add(new LdapSettingModel(ldapSetting, true)));
-        return settingModelList;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/ldapsettings/ReorderLdapSettingsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/ldapsettings/ReorderLdapSettingsService.java
deleted file mode 100644
index d2a8899..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/ldapsettings/ReorderLdapSettingsService.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.ldap.ldapsettings;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.security.SecurityDescriptor;
-import org.artifactory.descriptor.security.ldap.LdapSetting;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.util.CollectionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ReorderLdapSettingsService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(ReorderLdapSettingsService.class);
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        List<String> newOrderList = request.getModels();
-        log.debug("Changing order of ldap settings by new input: {}", newOrderList);
-        if (CollectionUtils.isNullOrEmpty(newOrderList)) {
-            log.debug("Got empty list from UI - aborting");
-            return;
-        }
-        MutableCentralConfigDescriptor descriptor = centralConfigService.getMutableDescriptor();
-        SecurityDescriptor security = descriptor.getSecurity();
-        List<LdapSetting> listToSave = Lists.newArrayList();
-
-        //Map ldap settings by key and use the input (ordered list) to insert into actual list
-        Map<String, LdapSetting> ldapSettingNameMap = Maps.newHashMap();
-        security.getLdapSettings().stream()
-                .forEach(ldapSetting -> ldapSettingNameMap.put(ldapSetting.getKey(), ldapSetting));
-        newOrderList.stream()
-                .forEach(ldapSettingKey -> listToSave.add(ldapSettingNameMap.get(ldapSettingKey)));
-        security.setLdapSettings(listToSave);
-        descriptor.setSecurity(security);
-        centralConfigService.saveEditedDescriptorAndReload(descriptor);
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/ldapsettings/TestLdapSettingsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/ldapsettings/TestLdapSettingsService.java
deleted file mode 100644
index d34b6ce..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/ldapsettings/TestLdapSettingsService.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.ldap.ldapsettings;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.common.StatusEntry;
-import org.artifactory.common.StatusEntryLevel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.ldap.LdapSettingModel;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * @author Chen keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class TestLdapSettingsService implements RestService {
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Autowired
-    SecurityService securityService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        LdapSettingModel ldapSetting = (LdapSettingModel) request.getImodel();
-        String testUsername = ldapSetting.getTestUsername();
-        String testPassword = ldapSetting.getTestPassword();
-        // validate if user name and password exist
-        if (testUsername == null || testPassword == null) {
-            response.error("Please enter test username and password to test the LDAP settings");
-            return;
-        }
-        // test ldap connection
-        testLdapConnection(response, ldapSetting, testUsername, testPassword);
-    }
-
-    /**
-     * test ldap connection
-     *
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param ldapSetting         - ldap setting model
-     * @param testUsername        - test user name
-     * @param testPassword        - test password
-     */
-    private void testLdapConnection(RestResponse artifactoryResponse, LdapSettingModel ldapSetting, String testUsername,
-            String testPassword) {
-        BasicStatusHolder status = securityService.testLdapConnection(ldapSetting, testUsername, testPassword);
-        List<StatusEntry> infos = status.getEntries(StatusEntryLevel.INFO);
-        if (status.isError()) {
-            artifactoryResponse.error(status.getStatusMsg());
-            for (StatusEntry info : infos) {
-                artifactoryResponse.info(info.getMessage());
-            }
-            List<StatusEntry> warnings = status.getEntries(StatusEntryLevel.WARNING);
-            for (StatusEntry warning : warnings) {
-                artifactoryResponse.warn(warning.getMessage());
-            }
-        } else {
-            artifactoryResponse.info("Successfully connected and authenticated the test user");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/ldapsettings/UpdateLdapSettingsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/ldapsettings/UpdateLdapSettingsService.java
deleted file mode 100644
index 3aab32d..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/ldap/ldapsettings/UpdateLdapSettingsService.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.ldap.ldapsettings;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.security.SecurityDescriptor;
-import org.artifactory.descriptor.security.ldap.LdapSetting;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.ldap.LdapSettingModel;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * @author Chen keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateLdapSettingsService implements RestService {
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String ldapKey = request.getPathParamByKey("id");
-        LdapSettingModel ldapSetting = (LdapSettingModel) request.getImodel();
-        // update Ldap Setting
-        updateLdapSetting(centralConfigService.getMutableDescriptor(), ldapSetting, ldapKey, response);
-    }
-
-    /**
-     * update ldap settings
-     *
-     * @param configDescriptor - config descriptor
-     * @param ldapSetting      - ldap setting config
-     */
-    public void updateLdapSetting(MutableCentralConfigDescriptor configDescriptor, LdapSetting ldapSetting,
-            String ldapKey, RestResponse response) {
-        SecurityDescriptor securityDescriptor = configDescriptor.getSecurity();
-        LdapSetting setting = securityDescriptor.getLdapSettings(ldapKey);
-        if (setting != null) {
-            List<LdapSetting> ldapSettings = securityDescriptor.getLdapSettings();
-            int indexOfLdapSetting = ldapSettings.indexOf(ldapSetting);
-            if (indexOfLdapSetting != -1) {
-                ldapSettings.set(indexOfLdapSetting, ldapSetting);
-            }
-            centralConfigService.saveEditedDescriptorAndReload(configDescriptor);
-            response.info("Successfully updated LDAP settings '" + ldapSetting.getKey() + "'");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/oauth/AddOAuthProviderSettings.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/oauth/AddOAuthProviderSettings.java
deleted file mode 100644
index 10de791..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/oauth/AddOAuthProviderSettings.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.oauth;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.oauth.OAuthHandler;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.security.oauth.OAuthProviderSettings;
-import org.artifactory.descriptor.security.oauth.OAuthSettings;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.oauth.OAuthProviderUIModel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Gidi Shabat
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class AddOAuthProviderSettings implements RestService<OAuthProviderUIModel> {
-    private static final Logger log = LoggerFactory.getLogger(AddOAuthProviderSettings.class);
-
-    @Autowired
-    CentralConfigService centralConfigService;
-    @Autowired
-    OAuthHandler oAuthHandler;
-
-
-    @Override
-    public void execute(ArtifactoryRestRequest<OAuthProviderUIModel> request, RestResponse response) {
-        OAuthProviderUIModel imodel = request.getImodel();
-        OAuthProviderSettings oAuthProviderSettings = new OAuthProviderSettings();
-        oAuthProviderSettings.setEnabled(imodel.isEnabled());
-        oAuthProviderSettings.setName(imodel.getName());
-        oAuthProviderSettings.setProviderType(imodel.getProviderType());
-        oAuthProviderSettings.setId(imodel.getId());
-        oAuthProviderSettings.setSecret(imodel.getSecret());
-        oAuthProviderSettings.setApiUrl(imodel.getApiUrl());
-        oAuthProviderSettings.setBasicUrl(imodel.getBasicUrl());
-        oAuthProviderSettings.setAuthUrl(imodel.getAuthUrl());
-        oAuthProviderSettings.setDomain(imodel.getDomain());
-        oAuthProviderSettings.setTokenUrl(imodel.getTokenUrl());
-        if(StringUtils.isBlank(oAuthProviderSettings.getName())){
-            response.error("Missing provider name");
-            return;
-        }
-        log.debug("Adding OAuth provider '{}'",imodel.getName());
-        if(StringUtils.isBlank(oAuthProviderSettings.getProviderType())){
-            response.error("Missing provider name");
-            return;
-        }
-        MutableCentralConfigDescriptor mutableDescriptor = centralConfigService.getMutableDescriptor();
-        OAuthSettings oauthSettings = mutableDescriptor.getSecurity().getOauthSettings();
-        if (oauthSettings != null) {
-            if(isProviderExist(oAuthProviderSettings, oauthSettings)){
-                response.error("Couldn't add provider, already exists.");
-                return;
-            }
-            oauthSettings.getOauthProvidersSettings().add(oAuthProviderSettings);
-            centralConfigService.saveEditedDescriptorAndReload(mutableDescriptor);
-            response.info("Successfully add OAuth provider " + imodel.getName());
-            log.debug("Successfully added OAuth provider '{}'", imodel.getName());
-        } else {
-            response.error("Couldn't add OAuth provider, OAuth settings doesn't exist");
-        }
-    }
-
-    private boolean isProviderExist(OAuthProviderSettings oAuthProviderUIModel, OAuthSettings oauthSettings) {
-        return oauthSettings.getOauthProvidersSettings().stream().anyMatch(
-                e -> e.getName().equals(oAuthProviderUIModel.getName()));
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/oauth/DeleteOAuthProviderSettings.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/oauth/DeleteOAuthProviderSettings.java
deleted file mode 100644
index c974150..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/oauth/DeleteOAuthProviderSettings.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.oauth;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.oauth.OAuthHandler;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.security.oauth.OAuthProviderSettings;
-import org.artifactory.descriptor.security.oauth.OAuthSettings;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author Gidi Shabat
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DeleteOAuthProviderSettings implements RestService<String> {
-    private static final Logger log = LoggerFactory.getLogger(DeleteOAuthProviderSettings.class);
-    @Autowired
-    CentralConfigService centralConfigService;
-    @Autowired
-    OAuthHandler oAuthHandler;
-    @Autowired
-    UserGroupService userGroupService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<String> request, RestResponse response) {
-        String providerName = request.getImodel();
-        if(StringUtils.isBlank(providerName)){
-            response.error("Couldn't delete provider, missing provider name");
-            return;
-        }
-        log.debug("Deleting OAuth provider '{}'", providerName);
-        MutableCentralConfigDescriptor mutableDescriptor = centralConfigService.getMutableDescriptor();
-        OAuthSettings oauthSettings = mutableDescriptor.getSecurity().getOauthSettings();
-        if (oauthSettings != null) {
-            // Remove provider to delete
-            List<OAuthProviderSettings> providers = oauthSettings.getOauthProvidersSettings().stream().filter(
-                    e -> !e.getName().equals(providerName)).collect(Collectors.toList());
-            // Override providers
-            oauthSettings.setOauthProvidersSettings(providers);
-            centralConfigService.saveEditedDescriptorAndReload(mutableDescriptor);
-            userGroupService.deletePropertyFromAllUsers("authinfo." + providerName);
-            response.info("Successfully deleting OAuth provider "+providerName);
-            log.debug("Successfully deleting OAuth provider '{}'", providerName);
-        } else {
-            response.error("Couldn't delete OAuth provider, OAuth settings doesn't exist");
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/oauth/DeleteOAuthUserToken.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/oauth/DeleteOAuthUserToken.java
deleted file mode 100644
index adeae83..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/oauth/DeleteOAuthUserToken.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.oauth;
-
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.oauth.OAuthUserToken;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Gidi Shabat
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DeleteOAuthUserToken <T extends OAuthUserToken>implements RestService<T> {
-    private static final Logger log = LoggerFactory.getLogger(DeleteOAuthProviderSettings.class);
-
-    @Autowired
-    UserGroupService userGroupService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-        T userToken = request.getImodel();
-        log.debug("Deleting OAuth token for provider: '{}' for user: '{}'", userToken.getProviderName(),
-                userToken.getUserName());
-        userGroupService.deleteProperty(userToken.getUserName(), "authinfo."+userToken.getProviderName());
-        log.debug("Successfully deleted token for provider: '{}' for user: '{}'",userToken.getProviderName(),
-                userToken.getUserName());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/oauth/GetOAuthSettings.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/oauth/GetOAuthSettings.java
deleted file mode 100644
index 4275f3a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/oauth/GetOAuthSettings.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.oauth;
-
-import com.google.common.collect.Lists;
-import org.artifactory.addon.oauth.OAuthHandler;
-import org.artifactory.addon.oauth.OAuthProvidersTypeEnum;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.security.oauth.OAuthProviderSettings;
-import org.artifactory.descriptor.security.oauth.OAuthSettings;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.oauth.OAuthProviderInfo;
-import org.artifactory.ui.rest.model.admin.security.oauth.OAuthProviderUIModel;
-import org.artifactory.ui.rest.model.admin.security.oauth.OAuthUIModel;
-import org.artifactory.ui.rest.model.admin.security.oauth.OAuthUIProvidersTypeEnum;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-import static org.artifactory.addon.oauth.OAuthProvidersTypeEnum.valueOf;
-
-/**
- * @author Gidi Shabat
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetOAuthSettings implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(GetOAuthSettings.class);
-    @Autowired
-    CentralConfigService centralConfigService;
-    @Autowired
-    OAuthHandler oAuthHandler;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        log.debug("Retrieving OAuth settings ");
-        OAuthSettings oauthSettings = centralConfigService.getDescriptor().getSecurity().getOauthSettings();
-        OAuthUIModel model;
-        if(oauthSettings!=null){
-             model=createUIModel(oauthSettings);
-        }else{
-            OAuthSettings oAuthSettings = new OAuthSettings();
-            MutableCentralConfigDescriptor mutableDescriptor = centralConfigService.getMutableDescriptor();
-            mutableDescriptor.getSecurity().setOauthSettings(oAuthSettings);
-            centralConfigService.saveEditedDescriptorAndReload(mutableDescriptor);
-            model=createUIModel(oAuthSettings);
-        }
-        response.iModel(model);
-    }
-
-    private OAuthUIModel createUIModel(OAuthSettings oauthSettings) {
-        OAuthUIModel oAuthUIModel = new OAuthUIModel();
-        oAuthUIModel.setEnabled(oauthSettings.getEnableIntegration());
-        oAuthUIModel.setProviders(getProvidersFromSettings(oauthSettings));
-        oAuthUIModel.setAvailableTypes(getAvailableProviders());
-        oAuthUIModel.setDefaultNpm(oauthSettings.getDefaultNpm());
-        oAuthUIModel.setPersistUsers(oauthSettings.getPersistUsers());
-        oAuthUIModel.setAllowUserToAccessProfile(oauthSettings.isAllowUserToAccessProfile());
-        return oAuthUIModel;
-    }
-
-    private List<OAuthProviderUIModel> getProvidersFromSettings(OAuthSettings oauthSettings) {
-        return oauthSettings.getOauthProvidersSettings().
-                    stream().filter(Objects::nonNull).map(this::toModel).collect(Collectors.toList());
-    }
-
-    private List<OAuthProviderInfo> getAvailableProviders() {
-        ArrayList<OAuthUIProvidersTypeEnum> es = Lists.newArrayList(OAuthUIProvidersTypeEnum.values());
-        return es.stream().filter(Objects::nonNull).map(OAuthUIProvidersTypeEnum::getProviderInfo)
-                .collect(Collectors.toList());
-    }
-
-    private OAuthProviderUIModel toModel(OAuthProviderSettings oAuthProviderSettings) {
-        OAuthProviderUIModel oAuthProviderUIModel = new OAuthProviderUIModel();
-        oAuthProviderUIModel.setId(oAuthProviderSettings.getId());
-        oAuthProviderUIModel.setSecret(oAuthProviderSettings.getSecret());
-        oAuthProviderUIModel.setApiUrl(oAuthProviderSettings.getApiUrl());
-        oAuthProviderUIModel.setBasicUrl(oAuthProviderSettings.getBasicUrl());
-        oAuthProviderUIModel.setAuthUrl(oAuthProviderSettings.getAuthUrl());
-        oAuthProviderUIModel.setTokenUrl(oAuthProviderSettings.getTokenUrl());
-        oAuthProviderUIModel.setEnabled(oAuthProviderSettings.getEnabled());
-        oAuthProviderUIModel.setDomain(oAuthProviderSettings.getDomain());
-        OAuthProvidersTypeEnum providerType = valueOf(oAuthProviderSettings.getProviderType());
-        OAuthUIProvidersTypeEnum uiProviderType=OAuthUIProvidersTypeEnum.fromProviderType(providerType);
-        oAuthProviderUIModel.setProviderType(uiProviderType.name());
-        oAuthProviderUIModel.setName(oAuthProviderSettings.getName());
-        return oAuthProviderUIModel;
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/oauth/GetOAuthTokensForUser.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/oauth/GetOAuthTokensForUser.java
deleted file mode 100644
index b611907..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/oauth/GetOAuthTokensForUser.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.oauth;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Multiset;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.md.Properties;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.UserInfo;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetOAuthTokensForUser implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(DeleteOAuthProviderSettings.class);
-
-    @Autowired
-    UserGroupService userGroupService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        UserInfo userInfo = userGroupService.currentUser();
-        if(userInfo==null){
-            String msg = "Invalid request, only authenticated user can call this service";
-            log.debug(msg);
-            response.error(msg);
-            return;
-        }
-        log.debug("Retrieving OAuth tokens for user: '{}'",userInfo.getUsername());
-        List<String>result= Lists.newArrayList();
-        Properties properties = userGroupService.findPropertiesForUser(userInfo.getUsername());
-        Multiset<String> keys = properties.keys();
-        for (String key : keys) {
-            result.add(key.replace("authinfo.",""));
-        }
-        response.iModelList(result);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/oauth/UpdateOAuthProviderSettings.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/oauth/UpdateOAuthProviderSettings.java
deleted file mode 100644
index 48b7dfb..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/oauth/UpdateOAuthProviderSettings.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.oauth;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.oauth.OAuthHandler;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.security.oauth.OAuthProviderSettings;
-import org.artifactory.descriptor.security.oauth.OAuthSettings;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.oauth.OAuthProviderUIModel;
-import org.artifactory.ui.rest.model.admin.security.oauth.OAuthUIProvidersTypeEnum;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.Optional;
-
-import static org.artifactory.ui.rest.model.admin.security.oauth.OAuthUIProvidersTypeEnum.valueOf;
-
-/**
- * @author Gidi Shabat
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateOAuthProviderSettings implements RestService<OAuthProviderUIModel> {
-    private static final Logger log = LoggerFactory.getLogger(UpdateOAuthProviderSettings.class);
-    @Autowired
-    CentralConfigService centralConfigService;
-    @Autowired
-    OAuthHandler oAuthHandler;
-
-
-    @Override
-    public void execute(ArtifactoryRestRequest<OAuthProviderUIModel> request, RestResponse response) {
-        OAuthProviderUIModel imodel = request.getImodel();
-        String providerName = imodel.getName();
-        if(StringUtils.isBlank(providerName)){
-            response.error("Missing provider name");
-            return;
-        }
-        log.debug("Updating OAuth provider '{}'",providerName);
-        MutableCentralConfigDescriptor mutableDescriptor = centralConfigService.getMutableDescriptor();
-        OAuthSettings oauthSettings = mutableDescriptor.getSecurity().getOauthSettings();
-        if (oauthSettings != null) {
-            OAuthProviderSettings providerToUpdate = getProviderToUpdate(providerName, oauthSettings);
-            if(providerToUpdate ==null){
-                response.error("Couldn't update provider, not exist.");
-            }else {
-                providerToUpdate.setId(imodel.getId());
-                providerToUpdate.setSecret(imodel.getSecret());
-                providerToUpdate.setApiUrl(imodel.getApiUrl());
-                providerToUpdate.setBasicUrl(imodel.getBasicUrl());
-                providerToUpdate.setAuthUrl(imodel.getAuthUrl());
-                providerToUpdate.setTokenUrl(imodel.getTokenUrl());
-                OAuthUIProvidersTypeEnum uiProviderType = valueOf(imodel.getProviderType());
-                providerToUpdate.setProviderType(uiProviderType.getProviderType().name());
-                providerToUpdate.setProviderType(imodel.getProviderType());
-                providerToUpdate.setDomain(imodel.getDomain());
-                providerToUpdate.setEnabled(imodel.isEnabled());
-                providerToUpdate.setName(imodel.getName());
-                centralConfigService.saveEditedDescriptorAndReload(mutableDescriptor);
-                response.info("Successfully update OAuth provider "+providerName);
-                log.debug("Successfully update OAuth provider '{}'",providerName);
-            }
-        } else {
-            response.error("Couldn't add OAuth provider, OAuth settings doesn't exist");
-        }
-    }
-
-    private OAuthProviderSettings getProviderToUpdate(String providerName,
-            OAuthSettings oauthSettings) {
-        Optional<OAuthProviderSettings> first = oauthSettings.getOauthProvidersSettings().stream().filter(
-                e -> e.getName().equals(providerName)).findFirst();
-        return first.isPresent()?first.get():null;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/oauth/UpdateOrCreateOAuthSettings.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/oauth/UpdateOrCreateOAuthSettings.java
deleted file mode 100644
index d7f5144..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/oauth/UpdateOrCreateOAuthSettings.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.oauth;
-
-import com.google.common.collect.Lists;
-import org.artifactory.addon.oauth.OAuthHandler;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.security.oauth.OAuthProviderSettings;
-import org.artifactory.descriptor.security.oauth.OAuthSettings;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.oauth.OAuthProviderUIModel;
-import org.artifactory.ui.rest.model.admin.security.oauth.OAuthUIModel;
-import org.artifactory.ui.rest.model.admin.security.oauth.OAuthUIProvidersTypeEnum;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-
-/**
- * @author Gidi Shabat
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateOrCreateOAuthSettings implements RestService<OAuthUIModel> {
-    private static final Logger log = LoggerFactory.getLogger(UpdateOrCreateOAuthSettings.class);
-    @Autowired
-    CentralConfigService centralConfigService;
-    @Autowired
-    OAuthHandler oAuthHandler;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<OAuthUIModel> request, RestResponse response) {
-        log.debug("Updating OAuth settings");
-        OAuthUIModel imodel = request.getImodel();
-        MutableCentralConfigDescriptor mutableDescriptor = centralConfigService.getMutableDescriptor();
-        OAuthSettings oauthSettings = mutableDescriptor.getSecurity().getOauthSettings();
-        if(oauthSettings!=null){
-            oauthSettings.setEnableIntegration(imodel.isEnabled());
-            oauthSettings.setDefaultNpm(imodel.getDefaultNpm());
-            oauthSettings.setPersistUsers(imodel.isPersistUsers());
-            oauthSettings.setAllowUserToAccessProfile(imodel.isAllowUserToAccessProfile());
-        }else{
-            oauthSettings=new OAuthSettings();
-            oauthSettings.setEnableIntegration(imodel.isEnabled());
-            oauthSettings.setDefaultNpm(imodel.getDefaultNpm());
-            oauthSettings.setPersistUsers(imodel.isPersistUsers());
-            oauthSettings.setOauthProvidersSettings(getProviders(imodel));
-            mutableDescriptor.getSecurity().setOauthSettings(oauthSettings);
-            oauthSettings.setAllowUserToAccessProfile(imodel.isAllowUserToAccessProfile());
-        }
-        centralConfigService.saveEditedDescriptorAndReload(mutableDescriptor);
-        response.info("Successfully update OAuth settings");
-        log.debug("Successfully Updated OAuth settings");
-
-    }
-
-    private List<OAuthProviderSettings> getProviders(OAuthUIModel imodel) {
-        List<OAuthProviderSettings> result= Lists.newArrayList();
-        List<OAuthProviderUIModel> providers = imodel.getProviders();
-        if(providers!=null){
-            for (OAuthProviderUIModel uiProvider : providers) {
-                OAuthProviderSettings oAuthProviderModel = new OAuthProviderSettings();
-                oAuthProviderModel.setName(uiProvider.getName());
-                oAuthProviderModel.setEnabled(uiProvider.isEnabled());
-                oAuthProviderModel.setId(uiProvider.getId());
-                oAuthProviderModel.setSecret(uiProvider.getSecret());
-                oAuthProviderModel.setApiUrl(uiProvider.getApiUrl());
-                oAuthProviderModel.setAuthUrl(uiProvider.getAuthUrl());
-                oAuthProviderModel.setTokenUrl(uiProvider.getTokenUrl());
-                oAuthProviderModel.setBasicUrl(uiProvider.getBasicUrl());
-                oAuthProviderModel.setDomain(uiProvider.getDomain());
-                OAuthUIProvidersTypeEnum uiProviderType = OAuthUIProvidersTypeEnum.valueOf(uiProvider.getProviderType());
-                oAuthProviderModel.setProviderType(uiProviderType.getProviderType().name());
-                oAuthProviderModel.setProviderType(uiProvider.getProviderType());
-                result.add(oAuthProviderModel);
-            }
-        }
-        return result;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/permissions/BasePermissionsTargetService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/permissions/BasePermissionsTargetService.java
deleted file mode 100644
index cf3e6bc..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/permissions/BasePermissionsTargetService.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.permissions;
-
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.permissions.PermissionTargetModel;
-import org.artifactory.ui.rest.model.utils.repositories.RepoKeyType;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public abstract class BasePermissionsTargetService<T> implements RestService<T> {
-
-    /**
-     * filter repo keys based on if any remote or any local has been choose
-     *
-     * @param permissionTarget - permission target model
-     */
-    protected void filteredRepoKey(PermissionTargetModel permissionTarget) {
-        List<RepoKeyType> filteredRepoKeys = new ArrayList<>();
-        if (permissionTarget.isAnyLocal() && permissionTarget.isAnyRemote() && permissionTarget.isAnyDistribution()) {
-            filteredRepoKeys.add(new RepoKeyType("ANY", "ANY"));
-        } else if (permissionTarget.isAnyLocal() && !permissionTarget.isAnyRemote()) {
-            List<RepoKeyType> repoKeys = permissionTarget.getRepoKeys();
-            repoKeys.stream()
-                    .filter(repoKeyType -> repoKeyType.getType().equals("remote") || repoKeyType.getType().equals("distribution"))
-                    .forEach(filteredRepoKeys::add);
-            filteredRepoKeys.add(new RepoKeyType("ANY LOCAL", "ANY LOCAL"));
-        } else if (!permissionTarget.isAnyLocal() && permissionTarget.isAnyRemote()) {
-            List<RepoKeyType> repoKeys = permissionTarget.getRepoKeys();
-            repoKeys.stream()
-                    .filter(repoKeyType -> repoKeyType.getType().equals("local") || repoKeyType.getType().equals("distribution"))
-                    .forEach(filteredRepoKeys::add);
-            filteredRepoKeys.add(new RepoKeyType("ANY REMOTE", "ANY REMOTE"));
-        } else if (permissionTarget.isAnyLocal() && permissionTarget.isAnyRemote()) {
-            List<RepoKeyType> repoKeys = permissionTarget.getRepoKeys();
-            repoKeys.stream()
-                    .filter(repoKeyType -> repoKeyType.getType().equals("distribution"))
-                    .forEach(filteredRepoKeys::add);
-            filteredRepoKeys.add(new RepoKeyType("ANY LOCAL", "ANY LOCAL"));
-            filteredRepoKeys.add(new RepoKeyType("ANY REMOTE", "ANY REMOTE"));
-        }
-        if (!filteredRepoKeys.isEmpty()) {
-            permissionTarget.setRepoKeys(filteredRepoKeys);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/permissions/CreatePermissionsTargetService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/permissions/CreatePermissionsTargetService.java
deleted file mode 100644
index dfca1fd..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/permissions/CreatePermissionsTargetService.java
+++ /dev/null
@@ -1,145 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.permissions;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.security.AclService;
-import org.artifactory.factory.InfoFactory;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.security.AceInfo;
-import org.artifactory.security.MutableAceInfo;
-import org.artifactory.security.MutableAclInfo;
-import org.artifactory.security.MutablePermissionTargetInfo;
-import org.artifactory.ui.rest.model.admin.security.permissions.PermissionTargetModel;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.permission.EffectivePermission;
-import org.artifactory.util.AlreadyExistsException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Chen keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CreatePermissionsTargetService extends BasePermissionsTargetService {
-    private static final Logger log = LoggerFactory.getLogger(CreatePermissionsTargetService.class);
-    @Autowired
-    AclService aclService;
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        PermissionTargetModel permissionTarget = (PermissionTargetModel) request.getImodel();
-        try {
-
-            // check if anny remote/local/distribution is set and filter repo keys list accordingly
-            filteredRepoKey(permissionTarget);
-            InfoFactory infoFactory = InfoFactoryHolder.get();
-            // create new acl
-            MutableAclInfo mutableAclInfo = infoFactory.createAcl();
-            // update permission target data
-            updatePermissionTarget(permissionTarget, infoFactory, mutableAclInfo);
-            // update user and groups permissions
-            updateAcesPermissions(permissionTarget, infoFactory, mutableAclInfo);
-            // update acl
-            aclService.createAcl(mutableAclInfo);
-            response.info("Successfully Created permission target '" + permissionTarget.getName() + "'");
-        }
-        catch (Exception e) {
-            if (e instanceof AlreadyExistsException) {
-                response.error("Permission target '" + permissionTarget.getName() + "' already exists");
-            } else {
-                response.error("Unexpected error has occurred please review the logs");
-            }
-            log.debug(e.toString());
-        }
-    }
-
-    /**
-     * update user and groups permissions
-     *
-     * @param permissionTarget - permission target
-     * @param infoFactory      - info factory
-     * @param mutableAclInfo   - ace info new instance
-     */
-    private void updateAcesPermissions(PermissionTargetModel permissionTarget, InfoFactory infoFactory, MutableAclInfo mutableAclInfo) {
-        Set<AceInfo> aclInfos = new HashSet<>();
-        // update group permission
-        permissionTarget.getGroups().forEach(permissionModel -> {
-            MutableAceInfo ace = infoFactory.createAce(permissionModel.getPrincipal(), true, permissionModel.getMask());
-            // update ace permissions
-            updateAcePermission(permissionModel, ace);
-            aclInfos.add(ace);
-        });
-        // update user permission
-        permissionTarget.getUsers().forEach(permissionModel -> {
-            MutableAceInfo ace = infoFactory.createAce(permissionModel.getPrincipal(), false, permissionModel.getMask());
-            // update ace permissions
-            updateAcePermission(permissionModel, ace);
-            aclInfos.add(ace);
-        });
-        mutableAclInfo.setAces(aclInfos);
-    }
-
-    /**
-     * update permission target data from model
-     *
-     * @param permissionTarget - model permission target data
-     * @param infoFactory      - info factory (create permission and ace objects)
-     * @param mutableAclInfo   - ace info new instance
-     */
-    private void updatePermissionTarget(PermissionTargetModel permissionTarget, InfoFactory infoFactory, MutableAclInfo mutableAclInfo) {
-        MutablePermissionTargetInfo permission = infoFactory.createPermissionTarget();
-        populatePermissionData(permissionTarget, permission);
-        mutableAclInfo.setPermissionTarget(permission);
-    }
-
-    /**
-     * update ace permissions
-     *
-     * @param permissionModel - permission model data
-     * @param ace             - ace new instance
-     */
-    private void updateAcePermission(EffectivePermission permissionModel, MutableAceInfo ace) {
-        ace.setAnnotate(permissionModel.isAnnotate());
-        ace.setDelete(permissionModel.isDelete());
-        ace.setDeploy(permissionModel.isDeploy());
-        ace.setManage(permissionModel.isManaged());
-        ace.setRead(permissionModel.isRead());
-    }
-
-    /**
-     * populate permission data
-     *
-     * @param permissionTarget - permission target new instance
-     * @param permission       - permission model
-     */
-    private void populatePermissionData(PermissionTargetModel permissionTarget, MutablePermissionTargetInfo permission) {
-        permission.setExcludes(permissionTarget.getExclude());
-        permission.setExcludesPattern(permissionTarget.getExcludePattern());
-        permission.setIncludes(permissionTarget.getIncludes());
-        permission.setIncludesPattern(permissionTarget.getIncludePattern());
-        permission.setName(permissionTarget.getName());
-        if (!permissionTarget.getRepoKeys().isEmpty()) {
-            List<String> keys = new ArrayList<>();
-            permissionTarget.getRepoKeys().forEach(repoKeyType -> {
-                String repoKey = repoKeyType.getRepoKey();
-                if (repoKeyType.getType().equals("remote")){
-                        repoKey = repoKey+"-cache";
-                        }
-                keys.add(repoKey);
-                    });
-                    permission.setRepoKeys(keys);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/permissions/DeletePermissionsTargetService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/permissions/DeletePermissionsTargetService.java
deleted file mode 100644
index 89e2356..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/permissions/DeletePermissionsTargetService.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.permissions;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.security.AclService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.AclInfo;
-import org.artifactory.ui.rest.model.admin.security.permissions.DeletePermissionTargetModel;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DeletePermissionsTargetService<T extends DeletePermissionTargetModel> implements RestService<T> {
-    @Autowired
-    AclService aclService;
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-        T model = request.getImodel();
-        for (String permissionId : model.getPermissionTargetNames()) {
-            if (StringUtils.isNotBlank(permissionId)) {
-                // get acl to delete
-                AclInfo aclInfo = aclService.getAcl(permissionId);
-                // delete acl
-                aclService.deleteAcl(aclInfo.getPermissionTarget());
-            }
-        }
-        if(model.getPermissionTargetNames().size() > 1) {
-            response.info("Successfully removed "+model.getPermissionTargetNames().size()+" permission targets");
-        }else if(model.getPermissionTargetNames().size()==1){
-            response.info("Successfully removed permission target '" + model.getPermissionTargetNames().get(0) + "'");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/permissions/GetAllUsersAndGroupsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/permissions/GetAllUsersAndGroupsService.java
deleted file mode 100644
index d38bb86..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/permissions/GetAllUsersAndGroupsService.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.permissions;
-
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.GroupInfo;
-import org.artifactory.security.UserInfo;
-import org.artifactory.ui.rest.model.admin.security.permissions.AllUsersAndGroupsModel;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author Chen keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetAllUsersAndGroupsService implements RestService {
-
-    @Autowired
-    UserGroupService userGroupService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        List<String> allUsers = userGroupService.getAllUsers(false)
-                .stream()
-                .map(UserInfo::getUsername)
-                .collect(Collectors.toList());
-
-        List<String> allGroups = userGroupService.getAllGroups()
-                .stream()
-                .map(GroupInfo::getGroupName)
-                .collect(Collectors.toList());
-
-        AllUsersAndGroupsModel allUsersAndGroups = new AllUsersAndGroupsModel();
-        allUsersAndGroups.setAllUsers(allUsers);
-        allUsersAndGroups.setAllGroups(allGroups);
-        response.iModel(allUsersAndGroups);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/permissions/GetPermissionsTargetService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/permissions/GetPermissionsTargetService.java
deleted file mode 100644
index 6009cc3..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/permissions/GetPermissionsTargetService.java
+++ /dev/null
@@ -1,238 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.permissions;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.security.AclService;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.AceInfo;
-import org.artifactory.security.AclInfo;
-import org.artifactory.security.ArtifactoryPermission;
-import org.artifactory.security.PermissionTargetInfo;
-import org.artifactory.ui.rest.model.admin.security.permissions.PermissionTargetModel;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.permission.EffectivePermission;
-import org.artifactory.ui.rest.model.utils.repositories.RepoKeyType;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-import org.springframework.util.StringUtils;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Chen keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetPermissionsTargetService implements RestService {
-    @Autowired
-    AclService aclService;
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String id = request.getPathParamByKey("name");
-        List<RepoKeyType> repoList = getAllRepositoriesData();
-        if (StringUtils.isEmpty(id)) {
-            fetchAllTargetPermission(response, repoList);
-        }
-        else {
-            fetchSingleTargetPermission(response, id, repoList);
-        }
-    }
-
-    /**
-     * fetch Single target permission
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param id - permission id
-     * @param repoList - repository list
-     */
-    private void fetchSingleTargetPermission(RestResponse artifactoryResponse, String id, List<RepoKeyType> repoList) {
-        AclInfo aclInfo = aclService.getAcl(id);
-        // populate permission model data
-        PermissionTargetInfo permission = aclInfo.getPermissionTarget();
-        if (!aclService.canManage(permission)){
-            artifactoryResponse.responseCode(HttpServletResponse.SC_FORBIDDEN);
-            return;
-        }
-        PermissionTargetModel permissionTarget = new PermissionTargetModel(permission);
-        // filter included repo key from available repo keys
-        updateSelectedAndAvailableRepo(repoList, permission, permissionTarget);
-        // get groups
-        aclInfo.getAces().stream().filter(AceInfo::isGroup).forEach(aceInfo ->
-                permissionTarget.getGroups().add(new EffectivePermission(aceInfo)));
-        // get users
-        aclInfo.getAces().stream().filter(ace -> !ace.isGroup()).forEach(aceInfo ->
-                permissionTarget.getUsers().add(new EffectivePermission(aceInfo)));
-        artifactoryResponse.iModel(permissionTarget);
-    }
-
-    /**
-     * fetch All target permission
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param repoList - repository list
-     */
-    private void fetchAllTargetPermission(RestResponse artifactoryResponse, List<RepoKeyType> repoList) {
-        List<PermissionTargetInfo> permissionTargets = aclService.getPermissionTargets(ArtifactoryPermission.MANAGE);
-        List<PermissionTargetModel> permissionTargetModels = new ArrayList<>();
-        permissionTargets.forEach(permissionTargetInfo -> {
-            AclInfo aclInfos = aclService.getAcl(permissionTargetInfo.getName());
-            // populate permission model data
-            PermissionTargetModel permissionTarget = new PermissionTargetModel(permissionTargetInfo);
-            // filter included repo key from available repo keys
-            updateSelectedAndAvailableRepo(repoList, permissionTargetInfo, permissionTarget);
-            // get groups
-            aclInfos.getAces().stream().filter(AceInfo::isGroup).forEach(aceInfo ->
-                    permissionTarget.getGroups().add(new EffectivePermission(aceInfo)));
-            // get users
-            aclInfos.getAces().stream().filter(ace -> !ace.isGroup()).forEach(aceInfo ->
-                    permissionTarget.getUsers().add(new EffectivePermission(aceInfo)));
-            permissionTargetModels.add(permissionTarget);
-        });
-        artifactoryResponse.iModelList(permissionTargetModels);
-    }
-
-    /**
-     * update selected and available repo
-     * @param repoList - repository list
-     * @param permissionTargetInfo - permission target info
-     * @param permissionTarget - permission target
-     */
-    private void updateSelectedAndAvailableRepo(List<RepoKeyType> repoList, PermissionTargetInfo permissionTargetInfo,
-                                                PermissionTargetModel permissionTarget) {
-        List<RepoKeyType> repoKeys = permissionTarget.getRepoKeys();
-        List<String> tempRepoKeysList = new ArrayList<>();
-        // selected include remote and local repositories
-        if (permissionTargetInfo.getRepoKeys().contains("ANY")){
-            // update select all
-            updateSelectAll(repoList, permissionTarget, repoKeys);
-        }else {
-            updateSpecifiedRepos(repoList, permissionTargetInfo, permissionTarget, repoKeys, tempRepoKeysList);
-
-        }
-    }
-
-    /**
-     * update repositories for specified list
-     *
-     * @param repoList             - repo list
-     * @param permissionTargetInfo - permission target info
-     * @param permissionTarget     - permission targer
-     * @param repoKeys             - repo keys list
-     * @param tempRepoKeysList     - temp repo list
-     */
-    private void updateSpecifiedRepos(List<RepoKeyType> repoList, PermissionTargetInfo permissionTargetInfo,
-            PermissionTargetModel permissionTarget, List<RepoKeyType> repoKeys, List<String> tempRepoKeysList) {
-
-
-        permissionTargetInfo.getRepoKeys()
-                .forEach(repoKey -> {
-                    boolean anyLocal = repoKey.equals("ANY LOCAL");
-                    if (anyLocal) {
-                        updateSelectedAnyLocal(repoList, permissionTarget, repoKeys, tempRepoKeysList);
-                    }
-                    boolean anyRemote = repoKey.equals("ANY REMOTE");
-                    if (anyRemote) {
-                        updateSelectedAnyRemote(repoList, permissionTarget, repoKeys, tempRepoKeysList);
-                    }
-                    if (!anyLocal && !anyRemote) {
-                        if (repoKey.endsWith("-cache")) {
-                            tempRepoKeysList.add(repoKey.substring(0, repoKey.length() - 6));
-                        } else {
-                            tempRepoKeysList.add(repoKey);
-                        }
-                    }
-                });
-        // update available repo keys
-        updateAvailableRepoKeys(repoList, permissionTarget, tempRepoKeysList);
-    }
-
-    /**
-     * update permission Available repo keys list
-     *
-     * @param repoList         - all repo list keys
-     * @param permissionTarget - target permission selected repo keys
-     * @param tempRepoKeysList - temp repo keys list
-     */
-    private void updateAvailableRepoKeys(List<RepoKeyType> repoList, PermissionTargetModel permissionTarget,
-            List<String> tempRepoKeysList) {
-        repoList.stream().filter((RepoKeyType key) -> !tempRepoKeysList.contains(key.getRepoKey())).
-                forEach(key -> permissionTarget.getAvailableRepoKeys().add(new RepoKeyType(key.getType(),key.getRepoKey())));
-            }
-
-    /**
-     * update selected list for ANY repo keys
-     *
-     * @param repoList         - full repo list
-     * @param permissionTarget - permission target include selected repo keys
-     * @param repoKeys         - selected repo list
-     */
-    private void updateSelectAll(List<RepoKeyType> repoList, PermissionTargetModel permissionTarget,
-            List<RepoKeyType> repoKeys) {
-        repoList.forEach(key -> repoKeys.add(new RepoKeyType(key.getType(),key.getRepoKey())));
-        permissionTarget.setAnyLocal(true);
-        permissionTarget.setAnyRemote(true);
-        permissionTarget.setAnyDistribution(true);
-    }
-
-
-    /**
-     * update selected any local
-     * @param repoList - all repo list
-     * @param permissionTarget - permission target model
-     * @param repoKeys - repo keys
-     */
-    private void updateSelectedAnyLocal(List<RepoKeyType> repoList,
-            PermissionTargetModel permissionTarget, List<RepoKeyType> repoKeys, List<String> tempList) {
-        repoKeys.forEach(key -> tempList.add(key.getRepoKey()));
-        repoList.stream().forEach(key -> {
-            if (key.getType().equals("local")) {
-                repoKeys.add(new RepoKeyType(key.getType(), key.getRepoKey()));
-                tempList.add(key.getRepoKey());
-            }
-        });
-        permissionTarget.setAnyLocal(true);
-    }
-
-    /**
-     * update selected any remote
-     * @param repoList - all repo list
-     * @param permissionTarget - permission target model
-     * @param repoKeys - repo keys
-     */
-    private void updateSelectedAnyRemote(List<RepoKeyType> repoList,
-            PermissionTargetModel permissionTarget, List<RepoKeyType> repoKeys, List<String> tempList) {
-        repoKeys.forEach(key -> tempList.add(key.getRepoKey()));
-        repoList.stream().filter(key -> key.getType().equals("remote")).forEach(key -> {
-            if (key.getType().equals("remote")) {
-                repoKeys.add(new RepoKeyType(key.getType(), key.getRepoKey()));
-            }
-            tempList.add(key.getRepoKey());
-        });
-        permissionTarget.setAnyRemote(true);
-    }
-
-    /**
-     * return remote and local repository data
-     *
-     * @return list of repositories repo keys
-     */
-    private List<RepoKeyType> getAllRepositoriesData() {
-        List<RepoKeyType> repos = new ArrayList<>();
-        Map<String, LocalRepoDescriptor> localRepoDescriptorMap = centralConfigService.getDescriptor().getLocalRepositoriesMap();
-        localRepoDescriptorMap.keySet().forEach(key -> repos.add(new RepoKeyType("local", key)));
-        Map<String, RemoteRepoDescriptor> remoteRepoDescriptorMap = centralConfigService.getDescriptor().getRemoteRepositoriesMap();
-        remoteRepoDescriptorMap.keySet().forEach(key -> repos.add(new RepoKeyType("remote", key)));
-        Map<String, DistributionRepoDescriptor> distRepoDescriptorMap = centralConfigService.getDescriptor().getDistributionRepositoriesMap();
-        distRepoDescriptorMap.keySet().forEach(key -> repos.add(new RepoKeyType("distribution", key)));
-        return repos;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/permissions/UpdatePermissionsTargetService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/permissions/UpdatePermissionsTargetService.java
deleted file mode 100644
index f42bc33..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/permissions/UpdatePermissionsTargetService.java
+++ /dev/null
@@ -1,169 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.permissions;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.security.AclService;
-import org.artifactory.factory.InfoFactory;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.security.AceInfo;
-import org.artifactory.security.AclInfo;
-import org.artifactory.security.MutableAceInfo;
-import org.artifactory.security.MutableAclInfo;
-import org.artifactory.security.MutablePermissionTargetInfo;
-import org.artifactory.ui.rest.model.admin.security.permissions.PermissionTargetModel;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.permission.EffectivePermission;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-import org.springframework.util.StringUtils;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Chen keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdatePermissionsTargetService<T extends PermissionTargetModel> extends BasePermissionsTargetService<T> {
-    @Autowired
-    AclService aclService;
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String permissionId = request.getPathParamByKey("name");
-        if (!StringUtils.isEmpty(permissionId)) {
-            // update permission target
-            updatePermissionTarget(request, response, permissionId);
-        } else {
-            response.responseCode(HttpServletResponse.SC_NOT_FOUND);
-        }
-    }
-
-    /**
-     * update target permission by id
-     *
-     * @param artifactoryRequest  - encapsulate data related to request
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param permissionId        - permission id
-     */
-    private void updatePermissionTarget(ArtifactoryRestRequest<T> artifactoryRequest, RestResponse artifactoryResponse, String permissionId) {
-        PermissionTargetModel permissionTarget = artifactoryRequest.getImodel();
-        // check if anny remote or any local is set and filter repo keys list accordingly
-        filteredRepoKey(permissionTarget);
-        AclInfo aclInfo = aclService.getAcl(permissionId);
-        if (!aclService.canManage(aclInfo.getPermissionTarget())){
-            artifactoryResponse.responseCode(HttpServletResponse.SC_FORBIDDEN);
-            return;
-        }
-        InfoFactory infoFactory = InfoFactoryHolder.get();
-        MutableAclInfo mutableAclInfo = infoFactory.copyAcl(aclInfo);
-        // update permission target data
-        updatePermissionTarget(permissionTarget, infoFactory, mutableAclInfo);
-        // update user and groups permissions
-        updateAcesPermissions(permissionTarget, infoFactory, mutableAclInfo);
-        // update acl
-        aclService.updateAcl(mutableAclInfo);
-        artifactoryResponse.info("Successfully updated permission target '" + permissionTarget.getName() + "'");
-    }
-
-
-    /**
-     * update user and groups permissions
-     * @param permissionTarget - permission target
-     * @param infoFactory - info factory
-     * @param mutableAclInfo - ace info new instance
-     */
-    private void updateAcesPermissions(PermissionTargetModel permissionTarget, InfoFactory infoFactory, MutableAclInfo mutableAclInfo) {
-        Set<AceInfo> aclInfos = new HashSet<>();
-        // update group permission
-        permissionTarget.getGroups().forEach(permissionModel -> {
-            MutableAceInfo ace = infoFactory.createAce(permissionModel.getPrincipal(), true, permissionModel.getMask());
-            // update ace permissions
-            updateAcePermission(permissionModel, ace);
-            aclInfos.add(ace);
-        });
-        // update user permission
-        permissionTarget.getUsers().forEach(permissionModel -> {
-            MutableAceInfo ace = infoFactory.createAce(permissionModel.getPrincipal(), false, permissionModel.getMask());
-            // update ace permissions
-            updateAcePermission(permissionModel, ace);
-            aclInfos.add(ace);
-        });
-        mutableAclInfo.setAces(aclInfos);
-    }
-
-    /**
-     * update permission target data from model
-     *
-     * @param permissionTarget - model permission target data
-     * @param infoFactory      - info factory (create permission and ace objects)
-     * @param mutableAclInfo   - ace info new instance
-     */
-    private void updatePermissionTarget(PermissionTargetModel permissionTarget, InfoFactory infoFactory, MutableAclInfo mutableAclInfo) {
-        MutablePermissionTargetInfo permission = infoFactory.createPermissionTarget();
-        permission.getRepoKeys().remove("ANY");
-        populatePermissionData(permissionTarget, permission);
-        mutableAclInfo.setPermissionTarget(permission);
-    }
-
-    /**
-     * update ace permissions
-     *
-     * @param permissionModel - permission model data
-     * @param ace             - ace new instance
-     */
-    private void updateAcePermission(EffectivePermission permissionModel, MutableAceInfo ace) {
-        ace.setAnnotate(permissionModel.isAnnotate());
-        ace.setDelete(permissionModel.isDelete());
-        ace.setDeploy(permissionModel.isDeploy());
-        ace.setManage(permissionModel.isManaged());
-        ace.setRead(permissionModel.isRead());
-    }
-
-    /**
-     * populate permission data
-     *
-     * @param permissionTarget - permission target new instance
-     * @param permission       - permission model
-     */
-    private void populatePermissionData(PermissionTargetModel permissionTarget, MutablePermissionTargetInfo permission) {
-        if (!StringUtils.isEmpty(permissionTarget.getExclude())) {
-            permission.setExcludes(permissionTarget.getExclude());
-        }
-        if (permissionTarget.getExcludePattern() != null) {
-            permission.setExcludesPattern(permissionTarget.getExcludePattern());
-        }
-        if (permissionTarget.getIncludes() != null) {
-            permission.setIncludes(permissionTarget.getIncludes());
-        }
-        if (permissionTarget.getIncludePattern() != null) {
-            permission.setIncludesPattern(permissionTarget.getIncludePattern());
-        }
-        if (!StringUtils.isEmpty(permissionTarget.getName())) {
-            permission.setName(permissionTarget.getName());
-        }
-        List<String> keys = new ArrayList<>();
-        if (!StringUtils.isEmpty(permissionTarget.getRepoKeys())) {
-            if (!permissionTarget.getRepoKeys().isEmpty()) {
-                permissionTarget.getRepoKeys().forEach(repoKeyType -> {
-                    String repoKey = repoKeyType.getRepoKey();
-                    if (repoKeyType.getType().equals("remote")) {
-                        repoKey = repoKey + "-cache";
-                    }
-                    keys.add(repoKey);
-                    permission.setRepoKeys(keys);
-                });
-            }else{
-                permission.setRepoKeys(keys);
-            }
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/saml/GetSamlLoginRequestService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/saml/GetSamlLoginRequestService.java
deleted file mode 100644
index 6e76488..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/saml/GetSamlLoginRequestService.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.saml;
-
-import org.artifactory.addon.sso.saml.SamlHandler;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Gidi Shabat
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetSamlLoginRequestService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(GetSamlLoginRequestService.class);
-
-    @Autowired
-    private SamlHandler samlHandler;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        try {
-            samlHandler.handleLoginRequest(request.getServletRequest(), response.getServletResponse());
-        } catch (Exception e) {
-            log.error(e.getMessage(), e);
-            response.error(e.getMessage());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/saml/GetSamlLoginResponseService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/saml/GetSamlLoginResponseService.java
deleted file mode 100644
index d919ab4..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/saml/GetSamlLoginResponseService.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.saml;
-
-import com.sun.jersey.spi.container.ContainerRequest;
-import org.artifactory.addon.sso.saml.SamlHandler;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.HashMap;
-import java.util.List;
-
-/**
- * @author Gidi Shabat
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetSamlLoginResponseService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(GetSamlLoginResponseService.class);
-    @Autowired
-    private SamlHandler samlHandler;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        try {
-            HashMap<String, List<String>> formParameters = ((ContainerRequest) request.getRequest()).getFormParameters();
-            samlHandler.handleLoginResponse(request.getServletRequest(), response.getServletResponse(), formParameters);
-        } catch (Exception e) {
-            log.error(e.getMessage(), e);
-            response.error(e.getMessage());
-        }
-    }
-}
-
-
-//.get("SAMLResponse").get(0);
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/saml/GetSamlLogoutRequestService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/saml/GetSamlLogoutRequestService.java
deleted file mode 100644
index 6eafbb1..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/saml/GetSamlLogoutRequestService.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.saml;
-
-import org.artifactory.addon.sso.saml.SamlHandler;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Gidi Shabat
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetSamlLogoutRequestService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(GetSamlLogoutRequestService.class);
-    @Autowired
-    private SamlHandler samlHandler;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        try {
-            String url = samlHandler.generateSamlLogoutRedirectUrl(request.getServletRequest(),
-                    response.getServletResponse());
-            response.iModel(url);
-        } catch (Exception e) {
-            log.error(e.getMessage(), e);
-            response.error(e.getMessage());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/saml/GetSamlService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/saml/GetSamlService.java
deleted file mode 100644
index f0a7b76..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/saml/GetSamlService.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.saml;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.security.SecurityDescriptor;
-import org.artifactory.descriptor.security.sso.SamlSettings;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.common.SecurityModelPopulator;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetSamlService implements RestService {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        RestModel restModel = getSamlModel();
-        response.iModel(restModel);
-    }
-
-    /**
-     * get saml setting and populate it data to saml model
-     *
-     * @return - saml model
-     */
-    private RestModel getSamlModel() {
-        MutableCentralConfigDescriptor centralConfig = centralConfigService.getMutableDescriptor();
-        SecurityDescriptor securityDescriptor = centralConfig.getSecurity();
-        SamlSettings samlSettings = securityDescriptor.getSamlSettings();
-        return SecurityModelPopulator.populateSamlInfo(samlSettings);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/saml/IsSamlAuthentication.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/saml/IsSamlAuthentication.java
deleted file mode 100644
index 804e3d8..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/saml/IsSamlAuthentication.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.saml;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.sso.saml.SamlException;
-import org.artifactory.addon.sso.saml.SamlSsoAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Gidi Shabat
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class IsSamlAuthentication implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(IsSamlAuthentication.class);
-
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        try {
-            AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-            Boolean saml = addonsManager.addonByType(SamlSsoAddon.class).isSamlAuthentication(
-                    request.getServletRequest(),
-                    response.getServletResponse());
-            response.iModel(saml.toString());
-        } catch (SamlException e) {
-            log.error(e.getMessage(), e);
-            response.error(e.getMessage());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/saml/UpdateSamlService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/saml/UpdateSamlService.java
deleted file mode 100644
index a13da95..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/saml/UpdateSamlService.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.saml;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.sso.saml.SamlSsoAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.security.SecurityDescriptor;
-import org.artifactory.descriptor.security.sso.SamlSettings;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateSamlService implements RestService {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        //update saml setting
-        updateSamlSetting(request, response);
-    }
-
-    /**
-     * update saml setting
-     *
-     * @param artifactoryRequest - encapsulate data related to request
-     */
-    private void updateSamlSetting(ArtifactoryRestRequest artifactoryRequest, RestResponse response) {
-        try {
-            AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-            SamlSsoAddon samlSsoAddon = addonsManager.addonByType(SamlSsoAddon.class);
-            SamlSettings samlSettings = (SamlSettings) artifactoryRequest.getImodel();
-            if (samlSettings.isEnableIntegration()) {
-                samlSsoAddon.createCertificate(samlSettings.getCertificate());
-            }
-            MutableCentralConfigDescriptor centralConfig = centralConfigService.getMutableDescriptor();
-            SecurityDescriptor securityDescriptor = centralConfig.getSecurity();
-            samlSettings.setCertificate(samlSettings.getCertificate());
-            securityDescriptor.setSamlSettings(samlSettings);
-            centralConfigService.saveEditedDescriptorAndReload(centralConfig);
-            response.info("Successfully updated SAML SSO settings");
-        } catch (Exception e) {
-            response.error(e.getMessage());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/debiankeys/GetDebianSigningKeyService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/debiankeys/GetDebianSigningKeyService.java
deleted file mode 100644
index 61e81f8..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/debiankeys/GetDebianSigningKeyService.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.signingkeys.debiankeys;
-
-import com.google.common.base.Joiner;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.debian.DebianAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.descriptor.security.debian.DebianSettings;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.ui.rest.model.admin.security.signingkey.SignKey;
-import org.artifactory.util.HttpUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetDebianSigningKeyService implements RestService {
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        DebianAddon debianAddon = addonsManager.addonByType(DebianAddon.class);
-        SignKey signKey = new SignKey();
-        signKey.setPrivateKeyInstalled(debianAddon.hasPrivateKey());
-        signKey.setPassPhrase(getPassPhrase());
-        boolean publicKeyInstalled = debianAddon.hasPublicKey();
-        if (publicKeyInstalled) {
-            String link = getKeyLink(request.getServletRequest());
-            signKey.setPublicKeyInstalled(true);
-            signKey.setPublicKeyLink(link);
-        }
-        response.iModel(signKey);
-    }
-
-    private String getKeyLink(HttpServletRequest request) {
-        return Joiner.on('/').join(HttpUtils.getServletContextUrl(request),
-                "api", "gpg", "key/public");
-    }
-
-    public String getPassPhrase() {
-        DebianSettings debianSettings = centralConfigService.getDescriptor().getSecurity().getDebianSettings();
-        return debianSettings != null ? CryptoHelper.decryptIfNeeded(debianSettings.getPassphrase()) : null;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/debiankeys/InstallDebianKeyService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/debiankeys/InstallDebianKeyService.java
deleted file mode 100644
index f8044d6..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/debiankeys/InstallDebianKeyService.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.signingkeys.debiankeys;
-
-import com.google.common.base.Joiner;
-import org.apache.commons.io.FileUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.debian.DebianAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.signingkey.SignKey;
-import org.artifactory.ui.rest.model.utils.FileUpload;
-import org.artifactory.ui.utils.MultiPartUtils;
-import org.artifactory.util.Files;
-import org.artifactory.util.HttpUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletRequest;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class InstallDebianKeyService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(InstallDebianKeyService.class);
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        boolean isPublic = Boolean.valueOf(request.getQueryParamByKey("public"));
-        List<String> fileNames = new ArrayList<>();
-        // save key file to temp folder
-        saveKeyFileToTempFolder(request, fileNames, response);
-        // install signing key
-        installSigningKey(response, isPublic, fileNames, request.getServletRequest());
-    }
-
-    /**
-     * install signing key
-     *
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param isPublic            - if true public key
-     * @param fileNames           - files name
-     */
-    private void installSigningKey(RestResponse artifactoryResponse, boolean isPublic, List<String> fileNames,
-            HttpServletRequest request) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        DebianAddon debianAddon = addonsManager.addonByType(DebianAddon.class);
-        String uploadDir = ContextHelper.get().getArtifactoryHome().getTempUploadDir().getAbsolutePath();
-        File file = new File(uploadDir, fileNames.get(0));
-        try {
-            String key = FileUtils.readFileToString(file);
-                debianAddon.onInstallKey(key, isPublic);
-                String publicKeyDownloadTarget = getKeyLink(request);
-                SignKey signKey = new SignKey(publicKeyDownloadTarget);
-            Files.removeFile(file);
-            artifactoryResponse.iModel(signKey);
-                if (isPublic) {
-                    artifactoryResponse.info("Public key is installed");
-                } else {
-                    artifactoryResponse.info("Private key is installed");
-                }
-            // delete temp key
-            Files.removeFile(file);
-        } catch (Exception e) {
-            log.error(e.toString());
-            artifactoryResponse.error(e.toString());
-        }
-    }
-
-    /**
-     * save key file to temp folder
-     *
-     * @param artifactoryRequest - encapsulate data related to request
-     * @param fileNames          - file names
-     */
-    private void saveKeyFileToTempFolder(ArtifactoryRestRequest artifactoryRequest, List<String> fileNames, RestResponse response) {
-        FileUpload uploadFile = (FileUpload) artifactoryRequest.getImodel();
-        String uploadDir = ContextHelper.get().getArtifactoryHome().getTempUploadDir().getAbsolutePath();
-        MultiPartUtils.createTempFolderIfNotExist(uploadDir);
-        // save file to temp folder
-        try {
-            MultiPartUtils.saveFileDataToTemp(centralConfigService, uploadFile.getFormDataMultiPart(), uploadDir,
-                    fileNames, false);
-        }catch (Exception e){
-            response.error(e.getMessage());
-        }
-    }
-
-    private String getKeyLink(HttpServletRequest request) {
-        return Joiner.on('/').join(HttpUtils.getServletContextUrl(request),
-                "api", "gpg", "key/public");
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/debiankeys/RemoveDebianKeyService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/debiankeys/RemoveDebianKeyService.java
deleted file mode 100644
index a51677e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/debiankeys/RemoveDebianKeyService.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.signingkeys.debiankeys;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.debian.DebianAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class RemoveDebianKeyService implements RestService {
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        boolean isPublic = Boolean.valueOf(request.getQueryParamByKey("public"));
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        DebianAddon debianAddon = addonsManager.addonByType(DebianAddon.class);
-        debianAddon.removeKey(isPublic);
-        response.info("Key was removed");
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/debiankeys/UpdateDebianKeyService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/debiankeys/UpdateDebianKeyService.java
deleted file mode 100644
index 76fef16..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/debiankeys/UpdateDebianKeyService.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.signingkeys.debiankeys;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.debian.DebianAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.ui.rest.model.admin.security.signingkey.SignKey;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Shay Yaakov
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateDebianKeyService implements RestService {
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        DebianAddon debianAddon = addonsManager.addonByType(DebianAddon.class);
-        SignKey signKey = (SignKey) request.getImodel();
-        String passPhrase = CryptoHelper.decryptIfNeeded(signKey.getPassPhrase());
-        updatePassPhrase(response, debianAddon, passPhrase);
-    }
-
-    private void updatePassPhrase(RestResponse artifactoryResponse, DebianAddon debianAddon, String passPhrase) {
-        debianAddon.savePassPhrase(passPhrase);
-        artifactoryResponse.info("Successfully updated signing pass-phrase");
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/debiankeys/VerifyDebianKeyService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/debiankeys/VerifyDebianKeyService.java
deleted file mode 100644
index 3448643..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/debiankeys/VerifyDebianKeyService.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.signingkeys.debiankeys;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.debian.DebianAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.ui.rest.model.admin.security.signingkey.SignKey;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import static org.apache.commons.lang.StringUtils.isEmpty;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class VerifyDebianKeyService implements RestService {
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        DebianAddon debianAddon = addonsManager.addonByType(DebianAddon.class);
-        SignKey signKey = (SignKey) request.getImodel();
-        String passPhrase = CryptoHelper.decryptIfNeeded(signKey.getPassPhrase());
-        // verify signing key phrase
-        verifySignKeyPhrase(response, debianAddon, passPhrase);
-    }
-
-    /**
-     * verify signing key phrase
-     *
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param debianAddon         -- debian addon
-     * @param passPhrase          = sign key pass phrase
-     */
-    private void verifySignKeyPhrase(RestResponse artifactoryResponse, DebianAddon debianAddon, String passPhrase) {
-        boolean hasRequisites = true;
-        if (isEmpty(passPhrase)) {
-            artifactoryResponse.warn("No pass-phrase supplied");
-            hasRequisites = false;
-        }
-        if (!debianAddon.hasPrivateKey()) {
-            artifactoryResponse.error("No private key installed");
-            hasRequisites = false;
-        }
-        if (!debianAddon.hasPublicKey()) {
-            artifactoryResponse.error("No public key installed");
-            hasRequisites = false;
-        }
-        if (hasRequisites) {
-            if (debianAddon.verifyPassPhrase(passPhrase)) {
-                artifactoryResponse.info("Successfully verified signing");
-            } else {
-                artifactoryResponse.error(
-                        "Failed to sign and verify using the installed keys and supplied pass-phrase");
-            }
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/keystore/AddKeyStoreService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/keystore/AddKeyStoreService.java
deleted file mode 100644
index b01fcb6..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/keystore/AddKeyStoreService.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.signingkeys.keystore;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.webstart.ArtifactWebstartAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.signingkey.KeyStore;
-import org.artifactory.ui.rest.model.utils.FileUpload;
-import org.artifactory.ui.utils.MultiPartUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class AddKeyStoreService implements RestService {
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        List<String> fileNames = new ArrayList<>();
-        String password = request.getQueryParamByKey("pass");
-        // save keystore to temp folder
-        saveKeyFileToTempFolder(request, fileNames, response);
-        // load keystore to server
-        loadKeyStore(response, fileNames, password);
-    }
-
-    /**
-     * load KeyStore
-     *
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param fileNames           - key store name
-     * @param password            - key store pass
-     */
-    private void loadKeyStore(RestResponse artifactoryResponse, List<String> fileNames, String password) {
-        String uploadDir = ContextHelper.get().getArtifactoryHome().getTempUploadDir().getAbsolutePath();
-        String keyName = fileNames.get(0);
-        File file = new File(uploadDir, keyName);
-        if (validateKeyStore(file, password, artifactoryResponse)) {
-            int endIndex = keyName.indexOf(".");
-            String alias;
-            if (endIndex == -1) {
-                alias = keyName;
-            } else {
-                alias = keyName.substring(0, endIndex);
-            }
-            KeyStore key = new KeyStore(true, alias, keyName, password);
-            // delete keystore on temp folder
-            artifactoryResponse.iModel(key);
-            artifactoryResponse.info("Key Pair uploaded successfully");
-        }
-    }
-
-    /**
-     * save key file to temp folder
-     *
-     * @param artifactoryRequest - encapsulate data related to request
-     * @param fileNames          - file names
-     */
-    private void saveKeyFileToTempFolder(ArtifactoryRestRequest artifactoryRequest, List<String> fileNames, RestResponse response) {
-        FileUpload uploadFile = (FileUpload) artifactoryRequest.getImodel();
-        String uploadDir = ContextHelper.get().getArtifactoryHome().getTempUploadDir().getAbsolutePath();
-        MultiPartUtils.createTempFolderIfNotExist(uploadDir);
-        // save file to temp folder
-        try {
-            MultiPartUtils.saveFileDataToTemp(centralConfigService, uploadFile.getFormDataMultiPart(), uploadDir,
-                    fileNames, false);
-        }catch (Exception e){
-            response.error(e.getMessage());
-        }
-    }
-
-    /**
-     * @param file     - key store
-     * @param password - key store password
-     * @param response - encapsulate data relate to response
-     * @return
-     */
-    public boolean validateKeyStore(File file, String password, RestResponse response) {
-        try {
-            AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-            ArtifactWebstartAddon artifactWebstartAddon = addonsManager.addonByType(ArtifactWebstartAddon.class);
-            artifactWebstartAddon.loadKeyStore(file, password);
-        } catch (Exception e) {
-            response.error(e.getMessage());
-            return false;
-        }
-        return true;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/keystore/CancelKeyPairService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/keystore/CancelKeyPairService.java
deleted file mode 100644
index 7aceba7..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/keystore/CancelKeyPairService.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.signingkeys.keystore;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.signingkey.KeyStore;
-import org.artifactory.util.Files;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.File;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CancelKeyPairService implements RestService {
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        KeyStore keyStore = (KeyStore) request.getImodel();
-        // remove keyStore from temp folder
-        String fileName = keyStore.getFileName();
-        String uploadDir = ContextHelper.get().getArtifactoryHome().getTempUploadDir().getAbsolutePath();
-        File file = new File(uploadDir, fileName);
-        Files.removeFile(file);
-
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/keystore/ChangeKeyStorePasswordService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/keystore/ChangeKeyStorePasswordService.java
deleted file mode 100644
index 0508342..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/keystore/ChangeKeyStorePasswordService.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.signingkeys.keystore;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.webstart.ArtifactWebstartAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.signingkey.KeyStore;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ChangeKeyStorePasswordService implements RestService {
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        KeyStore keyStore = (KeyStore) request.getImodel();
-        //update key store password
-        updateKeyStorePassword(response, keyStore);
-    }
-
-    /**
-     * update keyStore password
-     *
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param keyStore            - key store model
-     */
-    private void updateKeyStorePassword(RestResponse artifactoryResponse, KeyStore keyStore) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        ArtifactWebstartAddon artifactWebstartAddon = addonsManager.addonByType(ArtifactWebstartAddon.class);
-        String password = keyStore.getPassword();
-        try {
-            artifactWebstartAddon.setKeyStorePassword(password);
-            artifactoryResponse.info("Successfully updated Key Store password");
-        } catch (Exception e) {
-            artifactoryResponse.error(e.getMessage());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/keystore/GetKeyStoreService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/keystore/GetKeyStoreService.java
deleted file mode 100644
index d007969..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/keystore/GetKeyStoreService.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.signingkeys.keystore;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.webstart.ArtifactWebstartAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.signingkey.KeyStore;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetKeyStoreService implements RestService {
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        // check if key store exist , if so the it return key store pairs
-        getKeyStoreKeyPair(addonsManager, response);
-    }
-
-    /**
-     * check if key store exist , if so the it return key store pairs
-     *
-     * @param addonsManager
-     */
-    private void getKeyStoreKeyPair(AddonsManager addonsManager, RestResponse response) {
-        ArtifactWebstartAddon artifactWebstartAddon = addonsManager.addonByType(ArtifactWebstartAddon.class);
-        boolean keyStoreExist = artifactWebstartAddon.keyStoreExist();
-        KeyStore keyStore = new KeyStore();
-        keyStore.setKeyStoreExist(keyStoreExist);
-        if (keyStoreExist) {
-            List<String> keyPairNames = artifactWebstartAddon.getKeyPairNames();
-            keyStore.setKeyStorePairNames(keyPairNames);
-            response.iModel(keyStore);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/keystore/RemoveKeyStorePasswordService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/keystore/RemoveKeyStorePasswordService.java
deleted file mode 100644
index f84a603..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/keystore/RemoveKeyStorePasswordService.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.signingkeys.keystore;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.webstart.ArtifactWebstartAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Aviad Shikloshi
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class RemoveKeyStorePasswordService implements RestService {
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        ArtifactWebstartAddon artifactWebstartAddon = addonsManager.addonByType(ArtifactWebstartAddon.class);
-        try {
-            artifactWebstartAddon.removeKeyStorePassword();
-            response.info("Successfully removed Key Store");
-        } catch (Exception e) {
-            response.error(e.getMessage());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/keystore/RemoveKeyStoreService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/keystore/RemoveKeyStoreService.java
deleted file mode 100644
index bb943fa..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/keystore/RemoveKeyStoreService.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.signingkeys.keystore;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.webstart.ArtifactWebstartAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class RemoveKeyStoreService implements RestService {
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String keyName = request.getQueryParamByKey("name");
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        // check if key store exist , if so the it return key store pairs
-        getKeyStoreKeyPair(addonsManager, response, keyName);
-    }
-
-    /**
-     * check if key store exist , if so the it return key store pairs
-     *
-     * @param addonsManager
-     */
-    private void getKeyStoreKeyPair(AddonsManager addonsManager, RestResponse response, String keyPairName) {
-        ArtifactWebstartAddon artifactWebstartAddon = addonsManager.addonByType(ArtifactWebstartAddon.class);
-        boolean isKeyPairRemoveSucceeded = artifactWebstartAddon.removeKeyPair(keyPairName);
-        if (isKeyPairRemoveSucceeded) {
-            response.info("Successfully removed keypair '" + keyPairName + "'");
-        } else {
-            response.error("Failed to remove keypair '" + keyPairName + "'");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/keystore/SaveKeyStoreService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/keystore/SaveKeyStoreService.java
deleted file mode 100644
index 1fd71e4..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/signingkeys/keystore/SaveKeyStoreService.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.signingkeys.keystore;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.webstart.ArtifactWebstartAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.signingkey.KeyStore;
-import org.artifactory.util.Files;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.File;
-import java.io.IOException;
-import java.security.Key;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class SaveKeyStoreService implements RestService {
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        KeyStore keyStore = (KeyStore) request.getImodel();
-        // save key pair
-        addKeyPair(response, keyStore);
-    }
-
-    /**
-     * save key pair file
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param keyStore            - key store model
-     */
-    private void addKeyPair(RestResponse artifactoryResponse, KeyStore keyStore) {
-        String uploadDir = ContextHelper.get().getArtifactoryHome().getTempUploadDir().getAbsolutePath();
-        File file = new File(uploadDir, keyStore.getFileName());
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        ArtifactWebstartAddon artifactWebstartAddon = addonsManager.addonByType(ArtifactWebstartAddon.class);
-        if (validateAliasPassword(artifactWebstartAddon, keyStore, artifactoryResponse, file)) {
-            try {
-                artifactWebstartAddon.addKeyPair(file, keyStore.getKeyPairName(), keyStore.getPassword(), keyStore.getAlias(), keyStore.getPrivateKeyPassword());
-                artifactoryResponse.info("Saved Key-Pair '" + keyStore.getKeyPairName() + "'.");
-                Files.removeFile(file);
-            } catch (IOException e) {
-                artifactoryResponse.error("Failed to save key-pair: " + e.getMessage() + ".");
-            } catch (Exception e) {
-                artifactoryResponse.error(e.getMessage().toString());
-            }
-        } else {
-            artifactoryResponse.responseCode(HttpStatus.SC_BAD_REQUEST);
-        }
-    }
-
-    /**
-     * validate alias and private  key pass before saving key pair
-     *
-     * @param artifactWebstartAddon - web start addon
-     * @param keyStoreModel         - key store model send from client
-     * @param response              - encapsulate data require for response
-     * @param file                  - key store file
-     * @return - if true validation succeeded
-     */
-    private boolean validateAliasPassword(ArtifactWebstartAddon artifactWebstartAddon, KeyStore keyStoreModel, RestResponse response, File file) {
-        java.security.KeyStore keyStore = artifactWebstartAddon.loadKeyStore(file, keyStoreModel.getPassword());
-        try {
-            Key aliasKey = artifactWebstartAddon.getAliasKey(keyStore, keyStoreModel.getAlias(), keyStoreModel.getPrivateKeyPassword());
-            if (aliasKey == null) {
-                // should not happen
-                response.error("Alias doesn't exist in the key store.");
-                return false;
-            }
-        } catch (Exception e) {
-            response.error(e.getMessage());
-            return false;
-        }
-        return true;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/sshserver/GetSshServerKeyService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/sshserver/GetSshServerKeyService.java
deleted file mode 100644
index 577baa6..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/sshserver/GetSshServerKeyService.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.sshserver;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.security.SshAuthService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Noam Y. Tenne
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetSshServerKeyService implements RestService {
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Autowired
-    SshAuthService sshAuthService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/sshserver/GetSshServerService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/sshserver/GetSshServerService.java
deleted file mode 100644
index 004c3c9..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/sshserver/GetSshServerService.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.sshserver;
-
-import com.google.common.base.Joiner;
-import org.apache.ivy.plugins.repository.ssh.SshResource;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.security.SshAuthService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.security.SecurityDescriptor;
-import org.artifactory.descriptor.security.sshserver.SshServerSettings;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.artifactory.ui.rest.model.admin.configuration.generalconfig.GeneralConfig;
-import org.artifactory.ui.rest.model.admin.security.signingkey.SignKey;
-import org.artifactory.ui.rest.model.admin.security.sshserver.SshServer;
-import org.artifactory.util.HttpUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * @author Noam Y. Tenne
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetSshServerService implements RestService {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Autowired
-    private SshAuthService sshAuthService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("GetSshServer");
-        SecurityDescriptor securityDescriptor = getSecurityDescriptor();
-        SshServer sshServer = getSshServer(request, securityDescriptor);
-        response.iModel(sshServer);
-    }
-
-    private SshServer getSshServer(ArtifactoryRestRequest request, SecurityDescriptor securityDescriptor) {
-        SshServerSettings sshServerSettings = securityDescriptor.getSshServerSettings();
-
-        MutableCentralConfigDescriptor mutableDescriptor = centralConfigService.getMutableDescriptor();
-        GeneralConfig generalConfig = new GeneralConfig(mutableDescriptor);
-
-        if (sshServerSettings == null) {
-            SshServer sshServer = new SshServer();
-            sshServer.setEnableSshServer(false);
-            sshServer.setSshServerPort(1339);
-            sshServer.setCustomUrlBase(generalConfig.getCustomUrlBase());
-            return sshServer;
-        }
-        SshServer sshServer = new SshServer(sshServerSettings);
-        sshServer.setCustomUrlBase(generalConfig.getCustomUrlBase());
-        sshServer.setServerKey(serverKeys(request));
-        return sshServer;
-    }
-
-    private SecurityDescriptor getSecurityDescriptor() {
-        MutableCentralConfigDescriptor centralConfig = centralConfigService.getMutableDescriptor();
-        return centralConfig.getSecurity();
-    }
-
-    private SignKey serverKeys(ArtifactoryRestRequest request) {
-        SignKey signKey = new SignKey();
-        signKey.setPrivateKeyInstalled(sshAuthService.hasPrivateKey());
-        boolean publicKeyInstalled = sshAuthService.hasPublicKey();
-        if (publicKeyInstalled) {
-            String link = getKeyLink(request.getServletRequest());
-            signKey.setPublicKeyInstalled(true);
-            signKey.setPublicKeyLink(link);
-        }
-        return signKey;
-    }
-
-    private String getKeyLink(HttpServletRequest request) {
-        return Joiner.on('/').join(HttpUtils.getServletContextUrl(request),
-                "api", "ssh", "key/public");
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/sshserver/InstallSshServerKeyService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/sshserver/InstallSshServerKeyService.java
deleted file mode 100644
index 94082ca..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/sshserver/InstallSshServerKeyService.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.sshserver;
-
-import com.google.common.base.Joiner;
-import org.apache.commons.io.FileUtils;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.SshAuthService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.signingkey.SignKey;
-import org.artifactory.ui.rest.model.utils.FileUpload;
-import org.artifactory.ui.utils.MultiPartUtils;
-import org.artifactory.util.Files;
-import org.artifactory.util.HttpUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletRequest;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Noam Y. Tenne
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class InstallSshServerKeyService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(InstallSshServerKeyService.class);
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Autowired
-    SshAuthService sshAuthService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        boolean isPublic = Boolean.valueOf(request.getQueryParamByKey("public"));
-        List<String> fileNames = new ArrayList<>();
-        saveKeyToTempFolder(request, fileNames, response);
-        installKey(response, isPublic, fileNames, request.getServletRequest());
-    }
-
-    private void saveKeyToTempFolder(ArtifactoryRestRequest artifactoryRequest, List<String> fileNames,
-            RestResponse response) {
-        FileUpload uploadFile = (FileUpload) artifactoryRequest.getImodel();
-        String uploadDir = ContextHelper.get().getArtifactoryHome().getTempUploadDir().getAbsolutePath();
-        MultiPartUtils.createTempFolderIfNotExist(uploadDir);
-        try {
-            MultiPartUtils.saveFileDataToTemp(centralConfigService, uploadFile.getFormDataMultiPart(), uploadDir,
-                    fileNames, false);
-        } catch (Exception e) {
-            response.error(e.getMessage());
-        }
-    }
-
-    private void installKey(RestResponse artifactoryResponse, boolean isPublic, List<String> fileNames,
-            HttpServletRequest request) {
-        String uploadDir = ContextHelper.get().getArtifactoryHome().getTempUploadDir().getAbsolutePath();
-        File file = new File(uploadDir, fileNames.get(0));
-        try {
-            String key = FileUtils.readFileToString(file);
-            if (isPublic) {
-                sshAuthService.savePublicKey(key);
-                artifactoryResponse.info("Public key is installed");
-            } else {
-                sshAuthService.savePrivateKey(key);
-                artifactoryResponse.info("Private key is installed");
-            }
-            String publicKeyDownloadTarget = getKeyLink(request);
-            SignKey signKey = new SignKey(publicKeyDownloadTarget);
-            Files.removeFile(file);
-            artifactoryResponse.iModel(signKey);
-
-            // delete temp key
-            Files.removeFile(file);
-        } catch (Exception e) {
-            log.error(e.toString());
-            artifactoryResponse.error(e.toString());
-        }
-    }
-
-    private String getKeyLink(HttpServletRequest request) {
-        return Joiner.on('/').join(HttpUtils.getServletContextUrl(request),
-                "api", "ssh", "key/public");
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/sshserver/RemoveSshServerKeyService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/sshserver/RemoveSshServerKeyService.java
deleted file mode 100644
index 8b6e92a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/sshserver/RemoveSshServerKeyService.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.sshserver;
-
-import org.artifactory.api.security.SshAuthService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Noam Y. Tenne
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class RemoveSshServerKeyService implements RestService {
-
-    private static final Logger log = LoggerFactory.getLogger(RemoveSshServerKeyService.class);
-
-    @Autowired
-    SshAuthService sshAuthService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        boolean isPublic = Boolean.valueOf(request.getQueryParamByKey("public"));
-        try {
-            if (isPublic) {
-                sshAuthService.removePublicKey();
-            } else {
-                sshAuthService.removePrivateKey();
-            }
-        } catch (Exception e) {
-            log.error("Failed to remove key", e);
-            response.error(e.toString());
-            return;
-        }
-        response.info("Key was removed");
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/sshserver/UpdateSshServerService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/sshserver/UpdateSshServerService.java
deleted file mode 100644
index d8fa1d4..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/sshserver/UpdateSshServerService.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.sshserver;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.security.SecurityDescriptor;
-import org.artifactory.descriptor.security.sshserver.SshServerSettings;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Noam Y. Tenne
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateSshServerService implements RestService {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("UpdateSshServer");
-        MutableCentralConfigDescriptor centralConfig = centralConfigService.getMutableDescriptor();
-        SecurityDescriptor securityDescriptor = centralConfig.getSecurity();
-        SshServerSettings sshServerSettings = (SshServerSettings) request.getImodel();
-        saveSshSettings(centralConfig, securityDescriptor, sshServerSettings);
-        response.info("Successfully updated SSH server settings");
-    }
-
-    private void saveSshSettings(MutableCentralConfigDescriptor centralConfig, SecurityDescriptor securityDescriptor,
-                                 SshServerSettings sshServerSettings) {
-        securityDescriptor.setSshServerSettings(sshServerSettings);
-        centralConfigService.saveEditedDescriptorAndReload(centralConfig);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/ChangePasswordService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/ChangePasswordService.java
deleted file mode 100644
index f8c6e97..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/ChangePasswordService.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.user;
-
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.exceptions.PasswordChangeException;
-import org.artifactory.rest.common.dataholder.PasswordContainer;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.ws.rs.core.Response;
-
-/**
- * Service changing user password
- *
- * Created by Michael Pasternak
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ChangePasswordService<T extends PasswordContainer> implements RestService<T> {
-
-    @Autowired
-    protected SecurityService securityService;
-    @Autowired
-    protected UserGroupService userGroupService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-        PasswordContainer passwordContainer = request.getImodel();
-        try {
-            securityService.changePassword(
-                    passwordContainer.getUserName(),
-                    passwordContainer.getOldPassword(),
-                    passwordContainer.getNewPassword1(),
-                    passwordContainer.getNewPassword2()
-            );
-            response.responseCode(Response.Status.OK.getStatusCode());
-            response.info("Password has been successfully changed");
-        } catch (PasswordChangeException e) {
-            response.responseCode(Response.Status.BAD_REQUEST.getStatusCode());
-            response.error(e.getMessage());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/CheckExternalStatusService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/CheckExternalStatusService.java
deleted file mode 100644
index e926ddf..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/CheckExternalStatusService.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.user;
-
-import org.artifactory.api.security.UserAwareAuthenticationProvider;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.user.User;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CheckExternalStatusService<T extends User> implements RestService<T> {
-
-    @Autowired
-    private UserAwareAuthenticationProvider provider;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-        User user = request.getImodel();
-        String externalUserStatus = getExternalUserStatus(user);
-        user.setExternalRealmStatus(externalUserStatus);
-        response.iModel(user);
-    }
-
-
-    /**
-     * check if user exist in external system and return status
-     *
-     * @param user - user details
-     * @return - external user status
-     */
-    private String getExternalUserStatus(User user) {
-        String userStatus;
-        if (provider.userExists(user.getName(), user.getRealm())) {
-            userStatus = "Active user";
-        } else {
-            userStatus = "Inactive user";
-        }
-        return userStatus;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/CreateUserService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/CreateUserService.java
deleted file mode 100644
index fb2172f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/CreateUserService.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.user;
-
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.api.security.UserInfoBuilder;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.MutableUserInfo;
-import org.artifactory.security.SaltedPassword;
-import org.artifactory.ui.rest.model.admin.security.user.User;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CreateUserService<T extends User> implements RestService<T> {
-    @Autowired
-    protected SecurityService securityService;
-    @Autowired
-    protected UserGroupService userGroupService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-        User user = request.getImodel();
-        MutableUserInfo newUser = getMutableUserInfo(user);
-        //create user in DB
-        boolean created = userGroupService.createUser(newUser);
-        //Update Artifactory Response Data
-        updateArtifactoryResponse(response,user,created,true);
-    }
-
-    /**
-     * create mutable user info from user model data
-     * @param user - user model
-     * @return mutable user info build with user model data
-     */
-    private MutableUserInfo getMutableUserInfo(User user) {
-        UserInfoBuilder builder = new UserInfoBuilder(user.getName());
-        SaltedPassword saltedPassword;
-        if (user.isInternalPasswordDisabled()) {
-            saltedPassword = SaltedPassword.INVALID_PASSWORD;
-        } else {
-            saltedPassword = securityService.generateSaltedPassword(user.getPassword());
-        }
-        builder.password(saltedPassword)
-                .email(user.getEmail())
-                .admin(user.isAdmin())
-                .updatableProfile(user.isProfileUpdatable())
-                .groups(user.getUserGroups());
-        return builder.build();
-    }
-    /**
-     * update artifactory response with model ans status code to response
-     * @param artifactoryRestResponse - encapsulate data require for response
-     * @param user - new user model
-     * @param succeeded - if true user has been successfully created
-     * @param create - if true create user else update
-     */
-    private void updateArtifactoryResponse(RestResponse artifactoryRestResponse,
-            User user,boolean succeeded ,boolean create){
-        if (!succeeded) {
-            artifactoryRestResponse.error("User '" + user.getName() + "' already exists");
-            return;
-        }
-        // update successful user creation data
-        if(create) {
-            artifactoryRestResponse.info("Successfully created user '" + user.getName() + "'");
-            artifactoryRestResponse.responseCode(HttpServletResponse.SC_CREATED);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/DeleteUserService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/DeleteUserService.java
deleted file mode 100644
index f01d913..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/DeleteUserService.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.user;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.security.user.DeleteUsersModel;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DeleteUserService<T extends DeleteUsersModel> implements RestService<T> {
-    @Autowired
-    protected AuthorizationService authorizationService;
-    @Autowired
-    protected UserGroupService userGroupService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-        T model = request.getImodel();
-        List<String> userNames = model.getUserNames();
-        for (String userName : userNames) {
-            if (isUserIdNotFound(userName)) {
-                response.responseCode(HttpServletResponse.SC_NOT_FOUND);
-                return;
-            }
-            if (userTryToDeleteItsOwnUser(userName)) {
-                setActionCancelledError(response);
-                return;
-            }
-            // delete user from DB
-            deleteUserFromDB(userName, response);
-        }
-        if(model.getUserNames().size()>1){
-            response.info("Successfully removed "+model.getUserNames().size()+" users");
-        }else if(model.getUserNames().size()==1){
-            response.info("Successfully removed user '" + model.getUserNames().get(0) + "'");
-        }
-    }
-
-    /**
-     * delete user from data base
-     *
-     * @param selectedUsername - user name
-     */
-    private void deleteUserFromDB(String selectedUsername, RestResponse artifactoryRestResponse) {
-        userGroupService.deleteUser(selectedUsername);
-
-    }
-
-    /**
-     * check if user id not found
-     *
-     * @param selectedUsername - user id from path param
-     * @return true if user id not found
-     */
-    private boolean isUserIdNotFound(String selectedUsername) {
-        return selectedUsername == null || selectedUsername.length() == 0;
-    }
-
-    /**
-     * check if user Try To Delete Its Own User
-     *
-     * @param selectedUsername - user requested to be deleted
-     * @return true if user Try To Delete Its Own User
-     */
-    private boolean userTryToDeleteItsOwnUser(String selectedUsername) {
-        String currentUsername = authorizationService.currentUsername();
-        return currentUsername.equals(selectedUsername);
-    }
-
-    /**
-     * set response with specific error when user try to delete it own user
-     *
-     * @param restResponse - encapsulate data require for response
-     */
-    protected void setActionCancelledError(RestResponse restResponse) {
-        restResponse.responseCode(HttpServletResponse.SC_FORBIDDEN);
-        restResponse.error("Action cancelled. You are logged-in as the user you have selected for removal");
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/ExpirePasswordForAllUsersService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/ExpirePasswordForAllUsersService.java
deleted file mode 100644
index abfdc16..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/ExpirePasswordForAllUsersService.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.user;
-
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.exceptions.PasswordExpireException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.ws.rs.core.Response;
-
-/**
- * Service expiring all users password
- *
- * Created by Michael Pasternak
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ExpirePasswordForAllUsersService implements RestService {
-
-    @Autowired
-    protected SecurityService securityService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        try {
-            securityService.expireCredentialsForAllUsers();
-            response.responseCode(Response.Status.OK.getStatusCode());
-            response.info("All users credentials were successfully expired");
-        } catch (PasswordExpireException e) {
-            response.responseCode(Response.Status.BAD_REQUEST.getStatusCode());
-            response.error(e.getMessage());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/ExpireUserPasswordService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/ExpireUserPasswordService.java
deleted file mode 100644
index e07df7f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/ExpireUserPasswordService.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.user;
-
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.exceptions.PasswordExpireException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.ws.rs.core.Response;
-
-/**
- * Service expiring user password
- *
- * Created by Michael Pasternak
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ExpireUserPasswordService<T extends String> implements RestService<T> {
-
-    @Autowired
-    protected SecurityService securityService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-        String userName = request.getImodel();
-        try {
-            securityService.expireUserCredentials(userName);
-            response.responseCode(Response.Status.OK.getStatusCode());
-            response.info("User credentials were successfully expired");
-        } catch (PasswordExpireException e) {
-            response.responseCode(Response.Status.BAD_REQUEST.getStatusCode());
-            response.error(e.getMessage());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/GetUserPermissionsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/GetUserPermissionsService.java
deleted file mode 100644
index 8df1cd5..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/GetUserPermissionsService.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.user;
-
-import org.artifactory.api.security.AclService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.AceInfo;
-import org.artifactory.security.PermissionTargetInfo;
-import org.artifactory.ui.rest.model.admin.security.user.User;
-import org.artifactory.ui.rest.model.admin.security.user.UserPermissions;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Chen Keian
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetUserPermissionsService implements RestService<User> {
-
-    @Autowired
-    UserGroupService userGroupService;
-
-    @Autowired
-    AclService aclService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<User> request, RestResponse response) {
-        String name = request.getPathParamByKey("id");
-        boolean userOnly = Boolean.valueOf(request.getQueryParamByKey("userOnly"));
-        // get user related permissions
-        List<UserPermissions> userPermissionsList = getUserRelatedPermissions(name, userOnly);
-        // update response model
-        response.iModelList(userPermissionsList);
-    }
-
-
-    /**
-     * get user related permission by user name
-     *
-     * @param name     - user name
-     * @param userOnly - if true user related permission only , else user and group related permissions
-     * @return - list of user related permissions data
-     */
-    private List<UserPermissions> getUserRelatedPermissions(String name, boolean userOnly) {
-        Map<PermissionTargetInfo, AceInfo> userPermissionByPrincipal;
-        List<UserPermissions> userPermissionsList = new ArrayList<>();
-        if (!userOnly) {
-            userPermissionByPrincipal = aclService.getUserPermissionByPrincipal(name);
-        } else {
-            userPermissionByPrincipal = aclService.getUserPermissions(name);
-        }
-        userPermissionByPrincipal.forEach((permission, ace) ->
-                userPermissionsList.add(new UserPermissions(ace, permission)));
-        return userPermissionsList;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/GetUsersService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/GetUsersService.java
deleted file mode 100644
index c744bcc..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/GetUsersService.java
+++ /dev/null
@@ -1,137 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.user;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.CoreAddons;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.AclService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.AceInfo;
-import org.artifactory.security.PermissionTargetInfo;
-import org.artifactory.security.UserInfo;
-import org.artifactory.ui.rest.common.SecurityModelPopulator;
-import org.artifactory.ui.rest.model.admin.security.user.BaseUser;
-import org.artifactory.ui.rest.model.admin.security.user.UserPermissions;
-import org.joda.time.format.DateTimeFormatter;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Chen Keian
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetUsersService implements RestService {
-
-    @Autowired
-    UserGroupService userGroupService;
-
-    @Autowired
-    AclService aclService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        fetchSingleOrMultiUser(response, request);
-    }
-
-    /**
-     * fetch single or multi user info objects
-     *
-     * @param artifactoryResponse - encapsulate all data require for response
-     * @param artifactoryRequest - encapsulate data related to request
-     */
-    private void fetchSingleOrMultiUser(RestResponse artifactoryResponse,
-            ArtifactoryRestRequest artifactoryRequest) {
-        String userName = artifactoryRequest.getPathParamByKey("id");
-        if (isMultiUser(userName)) {
-            List<UserInfo> userInfos = userGroupService.getAllUsers(true);
-
-            //Don't list excluded users
-            List<UserInfo> filteredUsers = new ArrayList<>();
-            for (UserInfo userInfo : userInfos) {
-                AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-                CoreAddons addons = addonsManager.addonByType(CoreAddons.class);
-                if (addons.isAolAdmin(userInfo)) {
-                    filteredUsers.add(userInfo);
-                }
-            }
-            userInfos.removeAll(filteredUsers);
-
-            // update response with users info data
-            updateResponseWithMultiUserInfo(artifactoryResponse, userInfos);
-        } else {
-            updateResponseWithSingleUserInfo(artifactoryResponse, userName);
-        }
-    }
-
-    /**
-     * get Single User info and update response
-     *
-     * @param artifactoryResponse - encapsulate Data require for response
-     * @param userName            - user name from path param
-     */
-    private void updateResponseWithSingleUserInfo(RestResponse artifactoryResponse, String userName) {
-        BaseUser baseUser = getBaseUser(userName);
-        artifactoryResponse.iModel(baseUser);
-    }
-
-    /**
-     * get Multi User info and update response
-     *
-     * @param artifactoryResponse - encapsulate Data require for response
-     * @param userInfos           - list of all Users Found in DB
-     */
-    private void updateResponseWithMultiUserInfo(RestResponse artifactoryResponse,
-            List<UserInfo> userInfos) {
-        List<RestModel> baseUserList = new ArrayList<>();
-        DateTimeFormatter dateFormatter = ContextHelper.get().getCentralConfig().getDateFormatter();
-        // populate users info data to users model
-        userInfos.stream().forEach(
-                userInfo -> {
-                    BaseUser userConfiguration = SecurityModelPopulator.getUserConfiguration(userInfo,dateFormatter);
-                    Map<PermissionTargetInfo, AceInfo> userPermissionMap = aclService.getUserPermissionByPrincipal(
-                            userInfo.getUsername());
-                    List<UserPermissions> userPermissionsList = new ArrayList();
-                    userPermissionMap.forEach((permission, ace) ->
-                            userPermissionsList.add(new UserPermissions(ace, permission)));
-                    // update permissions
-                    userConfiguration.setPermissionsList(userPermissionsList);
-                    baseUserList.add(userConfiguration);
-                });
-        // update response with users model data
-        artifactoryResponse.iModelList(baseUserList);
-    }
-
-    /**
-     * check if  single or multi user is require based on path param data
-     *
-     * @param userName - path param
-     * @return if true require multi user
-     */
-    private boolean isMultiUser(String userName) {
-        return userName == null || userName.length() == 0;
-    }
-
-    /**
-     * get user from DB by name
-     *
-     * @param userName - user name
-     * @return - user info instance for specific user name
-     */
-    private BaseUser getBaseUser(String userName) {
-        BaseUser baseUser;
-        UserInfo singleUser = userGroupService.findUser(userName);
-        DateTimeFormatter dateFormatter = ContextHelper.get().getCentralConfig().getDateFormatter();
-        baseUser = SecurityModelPopulator.getUserConfiguration(singleUser,dateFormatter);
-        return baseUser;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/RevalidatePasswordForAllUsersService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/RevalidatePasswordForAllUsersService.java
deleted file mode 100644
index 0a1f4b1..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/RevalidatePasswordForAllUsersService.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.user;
-
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.exceptions.PasswordExpireException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.ws.rs.core.Response;
-
-/**
- * Service expiring all users password
- *
- * Created by Michael Pasternak
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class RevalidatePasswordForAllUsersService implements RestService {
-
-    @Autowired
-    protected SecurityService securityService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        try {
-            securityService.unexpirePasswordForAllUsers();
-            response.responseCode(Response.Status.OK.getStatusCode());
-            response.info("All users credentials were successfully revalidated");
-        } catch (PasswordExpireException e) {
-            response.responseCode(Response.Status.BAD_REQUEST.getStatusCode());
-            response.error(e.getMessage());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/RevalidatePasswordService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/RevalidatePasswordService.java
deleted file mode 100644
index 7c62bde..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/RevalidatePasswordService.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.user;
-
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.exceptions.PasswordExpireException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.ws.rs.core.Response;
-
-/**
- * Service expiring user password
- *
- * Created by Michael Pasternak
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class RevalidatePasswordService<T extends String> implements RestService<T> {
-
-    @Autowired
-    protected SecurityService securityService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-        String userName = request.getImodel();
-        try {
-            securityService.unexpirePassword(userName);
-            response.responseCode(Response.Status.OK.getStatusCode());
-            response.info("Successfully unexpired password");
-        } catch (PasswordExpireException e) {
-            response.responseCode(Response.Status.BAD_REQUEST.getStatusCode());
-            response.error(e.getMessage());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/UpdateUserLockPolicyService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/UpdateUserLockPolicyService.java
deleted file mode 100644
index 5408052..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/UpdateUserLockPolicyService.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.user;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.security.UserLockPolicy;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Michael Pasternak
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateUserLockPolicyService<T extends UserLockPolicy> implements RestService<T> {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-        UserLockPolicy userLockPolicy = request.getImodel();
-
-        if (userLockPolicy.getLoginAttempts() > 100 || userLockPolicy.getLoginAttempts()< 1) {
-            response.responseCode(400);
-            response.error("LoginAttempts must be between 1 - 100");
-            return;
-        }
-
-        UserLockPolicy userLockPolicyConfig =
-                centralConfigService.getDescriptor().getSecurity().getUserLockPolicy();
-        if (userLockPolicyConfig == null) {
-            centralConfigService.getDescriptor().getSecurity().setUserLockPolicy(userLockPolicy);
-        } else {
-            userLockPolicyConfig.setEnabled(userLockPolicy.isEnabled());
-            userLockPolicyConfig.setLoginAttempts(userLockPolicy.getLoginAttempts());
-        }
-        centralConfigService.saveEditedDescriptorAndReload(centralConfigService.getDescriptor());
-
-        response.info("UserLockPolicy was successfully updated");
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/UpdateUserService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/UpdateUserService.java
deleted file mode 100644
index 424bf76..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/UpdateUserService.java
+++ /dev/null
@@ -1,135 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.user;
-
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.MutableUserInfo;
-import org.artifactory.security.SaltedPassword;
-import org.artifactory.security.UserInfo;
-import org.artifactory.ui.rest.model.admin.security.user.User;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-import org.springframework.util.StringUtils;
-
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateUserService<T extends User> implements RestService<T> {
-    private static final Logger log = LoggerFactory.getLogger(UpdateUserService.class);
-
-    @Autowired
-    protected SecurityService securityService;
-    @Autowired
-    protected UserGroupService userGroupService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-        String id = request.getPathParamByKey("id");
-        if (isUserIDNotFound(id)) {
-            response.responseCode(HttpServletResponse.SC_NOT_FOUND);
-            return;
-        }
-        // get orig user from db
-        UserInfo origUser = userGroupService.findUser(id);
-        // update orig user properties
-        User user = request.getImodel();
-        // save user changes to DB
-        boolean userUpdated = saveUserChanges(origUser, user);
-        // update response data
-        updateArtifactoryResponse(response, user, userUpdated, false);
-    }
-
-    /**
-     * save user changes to DB
-     *
-     * @param origUser - user info before changes
-     * @param user     -  - user info after changes
-     * @return if true user successfully saved to DB
-     */
-    private boolean saveUserChanges(UserInfo origUser, User user) {
-
-        MutableUserInfo userInfo = updateUserProperties(user, origUser);
-        // save changes to db
-        return saveUser(origUser, userInfo);
-    }
-
-    /**
-     * check if user id not found
-     *
-     * @param id - user id found on path param
-     * @return if true , user id not found on path param
-     */
-    private boolean isUserIDNotFound(String id) {
-        return id == null || id.length() == 0;
-    }
-
-    /**
-     * update user properties data
-     * @param user - updated user data from request
-     * @param origUser - orig user data from db
-     * @return MutableUserInfo update with data from request
-     */
-    private MutableUserInfo updateUserProperties(User user, UserInfo origUser){
-        MutableUserInfo userInfo = InfoFactoryHolder.get().copyUser(origUser);
-        userInfo.setEmail(user.getEmail());
-        userInfo.setAdmin(user.isAdmin());
-        userInfo.setUpdatableProfile(user.isProfileUpdatable());
-        userInfo.setGroups(user.getUserGroups());
-        if (user.isInternalPasswordDisabled()) {
-            // user should authenticate externally - set password to invalid
-            userInfo.setPassword(SaltedPassword.INVALID_PASSWORD);
-        } else if (StringUtils.hasText(user.getPassword())) {
-            userInfo.setPassword(securityService.generateSaltedPassword(user.getPassword()));
-        }
-        return userInfo;
-    }
-
-    /**
-     * save update user data to DB
-     * @param origUser - orig user data
-     * @param userInfo - updated user data
-     * @return true if save user succeeded
-     */
-    private boolean saveUser(UserInfo origUser, MutableUserInfo userInfo) {
-        boolean userUpdated = true;
-        try {
-            userGroupService.updateUser(userInfo, !userInfo.hasSameAuthorizationContext(origUser));
-        }catch (Exception e){
-            userUpdated = false;
-            log.error("failed to update user "+userInfo.getUsername());
-        }
-        return userUpdated;
-    }
-    /**
-     * update artifactory response with model ans status code to response
-     * @param artifactoryRestResponse - encapsulate data require for response
-     * @param user - new user model
-     * @param succeeded - if true user has been successfully created
-     * @param create - if true create user else update
-     */
-    private void updateArtifactoryResponse(RestResponse<User> artifactoryRestResponse,
-            User user,boolean succeeded ,boolean create){
-        if (!succeeded) {
-            artifactoryRestResponse.error("User '" + user.getName() + " already exists");
-            return;
-        }else{
-            artifactoryRestResponse.info("Successfully updated user '" + user.getName() + "'");
-        }
-        // update successful user creation data
-        if(create) {
-            artifactoryRestResponse.iModel(user);
-            artifactoryRestResponse.responseCode(HttpServletResponse.SC_CREATED);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/userprofile/UnlockUserProfileService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/userprofile/UnlockUserProfileService.java
deleted file mode 100644
index 8cbd5e2..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/userprofile/UnlockUserProfileService.java
+++ /dev/null
@@ -1,198 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.user.userprofile;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.md.Properties;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.InternalUsernamePasswordAuthenticationToken;
-import org.artifactory.security.MutableUserInfo;
-import org.artifactory.security.UserInfo;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.ui.rest.model.admin.configuration.bintray.BintrayUIModel;
-import org.artifactory.ui.rest.model.admin.configuration.ssh.SshClientUIModel;
-import org.artifactory.ui.rest.model.admin.security.login.UserLogin;
-import org.artifactory.ui.rest.model.admin.security.user.User;
-import org.artifactory.ui.rest.model.admin.security.user.UserProfile;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.stereotype.Component;
-import org.springframework.util.StringUtils;
-
-import javax.crypto.SecretKey;
-import java.security.KeyPair;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UnlockUserProfileService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(UnlockUserProfileService.class);
-
-    @Autowired
-    AuthenticationManager authenticationManager;
-
-    @Autowired
-    private SecurityService securityService;
-
-    @Autowired
-    private AuthorizationService authorizationService;
-
-    @Autowired
-    UserGroupService userGroupService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        UserLogin userLogin = (UserLogin) request.getImodel();
-        // fetch user profile
-        fetchUserProfile(response, userLogin);
-     }
-
-    /**
-     * fetch user profile
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param userLogin - hold entered password details
-     */
-    private void fetchUserProfile(RestResponse artifactoryResponse, UserLogin userLogin) {
-        UserInfo userInfo = loadUserInfo();
-        if (userInfo.isAnonymous()) {
-            artifactoryResponse.error("Unable to unlock settings for anonymous user");
-            return;
-        }
-
-        String enteredCurrentPassword = userLogin.getPassword();
-        if (authorizationService.requireProfileUnlock() && !authenticate(userInfo, enteredCurrentPassword)) {
-           artifactoryResponse.error("The specified password is incorrect");
-        } else {
-            // get user  profile
-            UserProfile userProfile = getUserProfile(userInfo, userLogin);
-            artifactoryResponse.iModel(userProfile);
-        }
-    }
-
-    /**
-     * get user profile66
-     * @param userInfo - current logged user info
-     * @return current user profile
-     */
-    private UserProfile getUserProfile(UserInfo userInfo, UserLogin userLogin) {
-        UserProfile userProfile = new UserProfile();
-        updateUserInfo(userInfo, userProfile, userLogin);
-        updateBintrayData(userInfo, userProfile);
-        updateSshInfo(userInfo, userProfile);
-        return userProfile;
-    }
-
-    /**
-     * update user info in profile
-     *
-     * @param userInfo    - user info
-     * @param userProfile - user profile
-     */
-    private void updateUserInfo(UserInfo userInfo, UserProfile userProfile, UserLogin userLogin) {
-        User user = new User();
-        user.setRealm(userInfo.getRealm());
-        user.setEmail(userInfo.getEmail());
-        user.setProfileUpdatable(userInfo.isUpdatableProfile());
-        if (StringUtils.isEmpty(userInfo.getPassword())){
-            user.setInternalPasswordDisabled(true);
-        }
-        userProfile.setUser(user);
-        MutableUserInfo mutableUser = InfoFactoryHolder.get().copyUser(userInfo);
-        String encryptedPassword = getEncryptedPassword(mutableUser, userLogin);
-        user.setPassword(encryptedPassword);
-    }
-
-    /**
-     */
-    public String getEncryptedPassword(MutableUserInfo mutableUserInfo, UserLogin userLogin) {
-        // generate a new KeyPair and update the user profile
-        regenerateKeyPair(mutableUserInfo);
-        // display the encrypted password
-        if (securityService.isPasswordEncryptionEnabled() && !userLogin.getPassword().isEmpty()) {
-            SecretKey secretKey = CryptoHelper.generatePbeKeyFromKeyPair(mutableUserInfo.getPrivateKey(),
-                    mutableUserInfo.getPublicKey(), false);
-            return CryptoHelper.encryptSymmetric(userLogin.getPassword(), secretKey, false);
-        }
-        return null;
-    }
-
-    /**
-     * @param mutableUser
-     */
-    private void regenerateKeyPair(MutableUserInfo mutableUser) {
-        if (!StringUtils.hasText(mutableUser.getPrivateKey())) {
-            log.debug("Generating new KeyPair for {}", mutableUser.getUsername());
-            KeyPair keyPair = CryptoHelper.generateKeyPair();
-            mutableUser.setPrivateKey(CryptoHelper.convertToString(keyPair.getPrivate()));
-            mutableUser.setPublicKey(CryptoHelper.convertToString(keyPair.getPublic()));
-            userGroupService.updateUser(mutableUser, false);
-        }
-    }
-
-    /**
-     * update user profile bintray data
-     *
-     * @param userInfo    - user info from db
-     * @param userProfile - user profile
-     */
-    private void updateBintrayData(UserInfo userInfo, UserProfile userProfile) {
-        String[] splitBintrayAuth = null;
-        if (userInfo.getBintrayAuth() != null) {
-            splitBintrayAuth = userInfo.getBintrayAuth().split(":");
-        }
-        BintrayUIModel bintray = new BintrayUIModel();
-        if (splitBintrayAuth != null && splitBintrayAuth.length > 0) {
-            bintray.setUserName(splitBintrayAuth[0]);
-            bintray.setApiKey(splitBintrayAuth[1]);
-        }
-        userProfile.setBintray(bintray);
-    }
-
-    private void updateSshInfo(UserInfo userInfo, UserProfile userProfile) {
-        Properties propertiesForUser = userGroupService.findPropertiesForUser(userInfo.getUsername());
-        String sshPublicKey = propertiesForUser.getFirst("sshPublicKey");
-        SshClientUIModel sshClientUIModel = new SshClientUIModel();
-        if (org.apache.commons.lang.StringUtils.isNotBlank(sshPublicKey)) {
-            sshClientUIModel.setPublicKey(sshPublicKey);
-        }
-        userProfile.setSsh(sshClientUIModel);
-    }
-
-    /**
-     * load current logged user info
-     * @return - user info data
-     */
-    private UserInfo loadUserInfo() {
-        // load the user directly from the database. the instance returned from currentUser() might not
-        // be with the latest changes
-        return userGroupService.findUser(userGroupService.currentUser().getUsername());
-    }
-
-    /**
-     * authenticate current logged user against entered password
-     * @param userInfo - logged user info
-     * @param enteredCurrentPassword - entered password
-     * @return - if true user is authenticated
-     */
-    private boolean authenticate(UserInfo userInfo, String enteredCurrentPassword) {
-        try {
-            Authentication authentication = authenticationManager.authenticate(
-                    new InternalUsernamePasswordAuthenticationToken(userInfo.getUsername(),
-                            enteredCurrentPassword));
-            return (authentication != null) && authentication.isAuthenticated();
-        } catch (AuthenticationException e) {
-            return false;
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/userprofile/UpdateUserProfileService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/userprofile/UpdateUserProfileService.java
deleted file mode 100644
index 24a9c40..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/security/user/userprofile/UpdateUserProfileService.java
+++ /dev/null
@@ -1,120 +0,0 @@
-package org.artifactory.ui.rest.service.admin.security.user.userprofile;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.AccessLogger;
-import org.artifactory.security.MutableUserInfo;
-import org.artifactory.security.UserInfo;
-import org.artifactory.ui.rest.model.admin.configuration.bintray.BintrayUIModel;
-import org.artifactory.ui.rest.model.admin.configuration.ssh.SshClientUIModel;
-import org.artifactory.ui.rest.model.admin.security.user.User;
-import org.artifactory.ui.rest.model.admin.security.user.UserProfile;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-import org.springframework.util.StringUtils;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateUserProfileService implements RestService {
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Autowired
-    UserGroupService userGroupService;
-
-    @Autowired
-    SecurityService securityService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        UserProfile profile = (UserProfile) request.getImodel();
-        // update user profile
-        updateUserInfo(response, profile);
-    }
-
-    /**
-     * update userInfo
-     * @param artifactoryResponse
-     * @param profile
-     */
-    private void updateUserInfo(RestResponse artifactoryResponse, UserProfile profile) {
-        User user = profile.getUser();
-        BintrayUIModel bintray = profile.getBintray();
-        SshClientUIModel ssh = profile.getSsh();
-        UserInfo userInfo = loadUserInfo();
-        if (userInfo.isAnonymous()) {
-            artifactoryResponse.error("Unable to edit settings for anonymous user");
-            return;
-        }
-        if (!StringUtils.hasText(profile.getUser().getEmail()) && userInfo.getRealm().equals("internal")) {
-            artifactoryResponse.error("Email address is required");
-        } else if (StringUtils.hasText(bintray.getUserName()) &&
-                !StringUtils.hasText(bintray.getApiKey())) {
-            artifactoryResponse.error("Cannot save Bintray username without an API key");
-        } else if (StringUtils.hasText(bintray.getApiKey()) &&
-                !StringUtils.hasText(bintray.getUserName())) {
-            artifactoryResponse.error("Cannot save Bintray API key without username");
-        } else {
-            updateUserProfileToDB(artifactoryResponse, profile, user, bintray, ssh, userInfo);
-        }
-    }
-
-    /**
-     * update user profile to DB
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param profile - update user profile
-     * @param user - user part from user profile
-     * @param bintray -- bintray part from user profile
-     * @param ssh
-     * @param userInfo - current logged user info
-     */
-    private void updateUserProfileToDB(RestResponse artifactoryResponse, UserProfile profile, User user,
-            BintrayUIModel bintray, SshClientUIModel ssh, UserInfo userInfo) {
-        MutableUserInfo mutableUser = InfoFactoryHolder.get().copyUser(userInfo);
-        mutableUser.setEmail(profile.getUser().getEmail());
-        if (org.apache.commons.lang.StringUtils.isNotBlank(bintray.getApiKey()) &&
-                org.apache.commons.lang.StringUtils.isNotBlank(bintray.getUserName())){
-            mutableUser.setBintrayAuth(bintray.getUserName() + ":" + bintray.getApiKey());
-        }else{
-            mutableUser.setBintrayAuth("");
-        }
-        if (!authorizationService.isDisableInternalPassword()) {
-            String newPassword = user.getPassword();
-            if (StringUtils.hasText(newPassword)) {
-                mutableUser.setPassword(securityService.generateSaltedPassword(newPassword));
-              }
-        }
-        userGroupService.updateUser(mutableUser, !mutableUser.hasSameAuthorizationContext(userInfo));
-
-        userGroupService.deleteProperty(userInfo.getUsername(), "sshPublicKey");
-        if ((ssh != null) && org.apache.commons.lang.StringUtils.isNotBlank(ssh.getPublicKey())) {
-            String publicKey = ssh.getPublicKey();
-            String[] keyTokens = publicKey.split("\\s");
-            userGroupService.addUserProperty(userInfo.getUsername(), "sshPublicKey", keyTokens[0] + (keyTokens.length >= 2 ? " " + keyTokens[1] : ""));
-        }
-
-        AccessLogger.updated("User " + mutableUser.getUsername() + " has updated his profile successfully");
-        artifactoryResponse.info("Successfully updated profile '" + mutableUser.getUsername() + "'");
-    }
-
-    /**
-     * load current logged user info
-     * @return - user info data
-     */
-    private UserInfo loadUserInfo() {
-        // load the user directly from the database. the instance returned from currentUser() might not
-        // be with the latest changes
-        return userGroupService.findUser(userGroupService.currentUser().getUsername());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/ServicesServiceFactory.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/ServicesServiceFactory.java
deleted file mode 100644
index eedf5ed..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/ServicesServiceFactory.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.artifactory.ui.rest.service.admin.services;
-
-import org.artifactory.ui.rest.service.admin.services.backups.*;
-import org.artifactory.ui.rest.service.admin.services.filesystem.BrowseFileSystemService;
-import org.artifactory.ui.rest.service.admin.services.indexer.GetIndexerService;
-import org.artifactory.ui.rest.service.admin.services.indexer.RunIndexNowService;
-import org.artifactory.ui.rest.service.admin.services.indexer.UpdateIndexerService;
-import org.springframework.beans.factory.annotation.Lookup;
-
-/**
- * @author Chen Keinan
- */
-public abstract class ServicesServiceFactory {
-    //backups services
-    @Lookup
-    public abstract CreateBackupService createBackupService();
-
-    @Lookup
-    public abstract UpdateBackupService updateBackupService();
-
-    @Lookup
-    public abstract GetBackupService getBackupService();
-
-    @Lookup
-    public abstract DeleteBackupService deleteBackupService();
-
-    @Lookup
-    public abstract RunNowBackupService runNowBackupService();
-    // file system browser
-    @Lookup
-    public abstract BrowseFileSystemService browseFileSystemService();
-    //indexer service
-    @Lookup
-    public abstract UpdateIndexerService updateIndexerService();
-
-    @Lookup
-    public abstract GetIndexerService getIndexerService();
-
-    @Lookup
-    public abstract RunIndexNowService runIndexNowService();
-
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/backups/CreateBackupService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/backups/CreateBackupService.java
deleted file mode 100644
index 8c5fc65..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/backups/CreateBackupService.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.artifactory.ui.rest.service.admin.services.backups;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.backup.BackupDescriptor;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CreateBackupService implements RestService {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("CreateBackup");
-        BackupDescriptor backupDescriptor = (BackupDescriptor) request.getImodel();
-        // create new backup
-        createBackup(backupDescriptor);
-        // update feedback msg
-        updateResponseData(response, backupDescriptor);
-    }
-
-    /**
-     * update feedback msg and responseCode
-     *
-     * @param artifactoryResponse
-     * @param backupDescriptor
-     */
-    private void updateResponseData(RestResponse artifactoryResponse, BackupDescriptor backupDescriptor) {
-        artifactoryResponse.info("Backup " + backupDescriptor.getKey() + " successfully created.");
-        artifactoryResponse.responseCode(HttpServletResponse.SC_CREATED);
-    }
-
-    /**
-     * create new backup to config descriptor
-     *
-     * @param backupDescriptor - new backup descriptor
-     */
-    private void createBackup(BackupDescriptor backupDescriptor) {
-        MutableCentralConfigDescriptor mutableDescriptor = centralConfigService.getMutableDescriptor();
-        mutableDescriptor.getBackups().add(backupDescriptor);
-        centralConfigService.saveEditedDescriptorAndReload(mutableDescriptor);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/backups/DeleteBackupService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/backups/DeleteBackupService.java
deleted file mode 100644
index d367801..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/backups/DeleteBackupService.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.artifactory.ui.rest.service.admin.services.backups;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DeleteBackupService implements RestService {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("DeleteBackup");
-        String backupId = request.getPathParamByKey("id");
-        // delete backup
-        deleteBackup(backupId);
-        // update feedback
-        response.info("Backup " + backupId + " successfully deleted");
-    }
-
-    /**
-     * delete Backup from descriptor
-     *
-     * @param backupId - backup id from request
-     */
-    private void deleteBackup(String backupId) {
-        MutableCentralConfigDescriptor mutableDescriptor = centralConfigService.getMutableDescriptor();
-        mutableDescriptor.removeBackup(backupId);
-        centralConfigService.saveEditedDescriptorAndReload(mutableDescriptor);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/backups/GetBackupService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/backups/GetBackupService.java
deleted file mode 100644
index 5512812..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/backups/GetBackupService.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package org.artifactory.ui.rest.service.admin.services.backups;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.backup.BackupDescriptor;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.artifactory.ui.rest.model.admin.services.backups.Backup;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetBackupService implements RestService {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("GarbageCollection");
-        String backupName = request.getPathParamByKey("id");
-        // populate data to backup model and update response
-        populateBackupModelAndUpdateResponse(response, backupName);
-    }
-
-    /**
-     * populate data to backup model and update response data
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param backupName          - backup name
-     */
-    private void populateBackupModelAndUpdateResponse(RestResponse artifactoryResponse, String backupName) {
-        if (isMultiBackup(backupName)) {
-            // get backup models list from config descriptor
-            List<RestModel> backupList = getMultiBackupModels();
-            artifactoryResponse.iModelList(backupList);
-        } else {
-            RestModel singleBackupModels = getSingleBackupModels(backupName);
-            artifactoryResponse.iModel(singleBackupModels);
-        }
-    }
-
-    /**
-     * check if  single or multi backup is require based on path param data
-     *
-     * @param backupName - path param
-     * @return if true require multi backup
-     */
-    private boolean isMultiBackup(String backupName) {
-        return backupName == null || backupName.length() == 0;
-    }
-
-
-    /**
-     * get BackupModel from Descriptor
-     *
-     * @return list of backup models
-     */
-    private List<RestModel> getMultiBackupModels() {
-        List<BackupDescriptor> backupDescriptorsList = centralConfigService.getMutableDescriptor().getBackups();
-        List<RestModel> backupList = new ArrayList<>();
-        // populate backup descriptor to model
-        populateMultiBackupDescriptorToModel(backupDescriptorsList, backupList);
-        return backupList;
-    }
-
-    /**
-     * get BackupModel from Descriptor
-     *
-     * @return l backup model
-     */
-    private RestModel getSingleBackupModels(String backupName) {
-        BackupDescriptor backup = centralConfigService.getMutableDescriptor().getBackup(backupName);
-        // populate backup descriptor to model
-        return populateSingleBackupDescriptorToModel(backup);
-    }
-
-    /**
-     * populate backup descriptor to model
-     *
-     * @param backupDescriptorsList - backup descriptor list
-     * @param backupList            - backup model list
-     */
-    private void populateMultiBackupDescriptorToModel(List<BackupDescriptor> backupDescriptorsList,
-            List<RestModel> backupList) {
-        backupDescriptorsList.forEach(backupDescriptor -> backupList.add(new Backup(backupDescriptor, false)));
-    }
-
-    /**
-     * populate backup descriptor to model
-     *
-     * @param backupDescriptor - backup descriptor
-     * @return backup model
-     */
-    private RestModel populateSingleBackupDescriptorToModel(BackupDescriptor backupDescriptor) {
-        return new Backup(backupDescriptor, true);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/backups/RunNowBackupService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/backups/RunNowBackupService.java
deleted file mode 100644
index b04d5f2..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/backups/RunNowBackupService.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package org.artifactory.ui.rest.service.admin.services.backups;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.repo.BackupService;
-import org.artifactory.descriptor.backup.BackupDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class RunNowBackupService implements RestService {
-
-    @Autowired
-    private BackupService backupService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("RunNowBackup");
-        runNowBackup(request, response);
-    }
-
-    /**
-     * run now backup
-     *
-     * @param artifactoryRequest  - encapsulate data related to request
-     * @param artifactoryResponse - encapsulate data require for response
-     */
-    private void runNowBackup(ArtifactoryRestRequest artifactoryRequest, RestResponse artifactoryResponse) {
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-        BackupDescriptor backupDescriptor = (BackupDescriptor) artifactoryRequest.getImodel();
-        backupService.scheduleImmediateSystemBackup(backupDescriptor, statusHolder);
-        updateResponseFeedback(artifactoryResponse, statusHolder);
-    }
-
-    /**
-     * update response with feedback
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param statusHolder        - msg status holder
-     */
-    private void updateResponseFeedback(RestResponse artifactoryResponse, BasicStatusHolder statusHolder) {
-        if (statusHolder.isError()) {
-            artifactoryResponse.error(statusHolder.getStatusMsg());
-        } else {
-            artifactoryResponse.info("System backup was successfully scheduled to run in the background.");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/backups/UpdateBackupService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/backups/UpdateBackupService.java
deleted file mode 100644
index 9ff72e3..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/backups/UpdateBackupService.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.ui.rest.service.admin.services.backups;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.backup.BackupDescriptor;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateBackupService implements RestService {
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AolUtils.assertNotAol("UpdateBackup");
-        BackupDescriptor backupDescriptor = (BackupDescriptor) request.getImodel();
-        // update backup
-        updateBackup(backupDescriptor);
-        // update feedback msg
-        response.info("Successfully updated backup '" + backupDescriptor.getKey() + "'");
-    }
-
-    /**
-     * update backup to descriptor
-     *
-     * @param backupDescriptor - updated backup descriptor
-     */
-    private void updateBackup(BackupDescriptor backupDescriptor) {
-        MutableCentralConfigDescriptor mutableDescriptor = centralConfigService.getMutableDescriptor();
-        mutableDescriptor.removeBackup(backupDescriptor.getKey());
-        mutableDescriptor.addBackup(backupDescriptor);
-        centralConfigService.saveEditedDescriptorAndReload(mutableDescriptor);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/filesystem/BrowseFileSystemService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/filesystem/BrowseFileSystemService.java
deleted file mode 100644
index 66a4235..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/filesystem/BrowseFileSystemService.java
+++ /dev/null
@@ -1,121 +0,0 @@
-package org.artifactory.ui.rest.service.admin.services.filesystem;
-
-import com.google.common.collect.Lists;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.artifactory.ui.rest.model.admin.services.filesystem.FileSystemBrowser;
-import org.artifactory.ui.rest.model.admin.services.filesystem.FileSystemItem;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class BrowseFileSystemService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(BrowseFileSystemService.class);
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-
-        AolUtils.assertNotAol("BrowseFileSystem");
-        boolean includeZipFiles = Boolean.valueOf(request.getQueryParamByKey("includeZip"));
-        // get list of files
-        FileSystemBrowser fileSystem = getFileOrFoldersList(request, includeZipFiles);
-        // update response with data
-        response.iModel(fileSystem);
-    }
-
-    /**
-     * get files or folder list 1st level only by path
-     *
-     * @param artifactoryRequest
-     * @param includeZipFiles
-     * @return list of file system item found
-     */
-    private FileSystemBrowser getFileOrFoldersList(ArtifactoryRestRequest artifactoryRequest, boolean includeZipFiles) {
-        boolean isWin = System.getProperty("os.name").toLowerCase().indexOf("win") >= 0;
-        FileSystemBrowser fileSystemBrowser = new FileSystemBrowser();
-        fileSystemBrowser.setIsWindows(isWin);
-        // update file system roots
-        File[] fsRoots = File.listRoots();
-        updateFileSystemRoots(fileSystemBrowser, fsRoots);
-        // update roots file system
-        updateRootsData(artifactoryRequest, fileSystemBrowser, includeZipFiles);
-        return fileSystemBrowser;
-    }
-
-    /**
-     * get root file system and update files system browser model
-     *
-     * @param artifactoryRequest - encapsulate data related to request
-     * @param fileSystemBrowser  - file system browser model
-     * @param includeZipFiles
-     */
-    private void updateRootsData(ArtifactoryRestRequest artifactoryRequest, FileSystemBrowser fileSystemBrowser,
-            boolean includeZipFiles) {
-
-        String selectedPath = artifactoryRequest.getQueryParamByKey("path");
-        if (selectedPath.length() == 0) {
-            List<String> roots = fileSystemBrowser.getRoots();
-            if (roots != null && roots.size() > 0) {
-                selectedPath = roots.get(0);
-            }
-        }
-        List<RestModel> fileSystemItems = Lists.newArrayList();
-        File[] children = new File(selectedPath).listFiles();
-        if (children != null) {
-            try {
-                Arrays.asList(children).forEach(
-                        file -> addFolderAndZipFileToList(file, includeZipFiles, fileSystemItems));
-            } catch (Exception e) {
-                log.error("error with retrieving folder data , bad path name:" + selectedPath, e);
-            }
-        } else {
-            log.debug("Cannot read directory content from: '{}'", selectedPath);
-        }
-        fileSystemBrowser.setFileSystemItems(fileSystemItems);
-    }
-
-    private void addFolderAndZipFileToList(File file, boolean includeZipFiles, List<RestModel> fileSystemItems) {
-        if (includeZipFiles) {
-            if (file.isDirectory() || file.getName().endsWith(".zip")) {
-                fileSystemItems.add(new FileSystemItem(file));
-            }
-        } else {
-            if (file.isDirectory()) {
-                fileSystemItems.add(new FileSystemItem(file));
-            }
-        }
-    }
-
-    /**
-     * update file system roots
-     *
-     * @param fileSystemBrowser - file system browser model
-     */
-    private void updateFileSystemRoots(FileSystemBrowser fileSystemBrowser, File[] fsRoots) {
-        List<String> roots = null;
-        if (fsRoots != null && fsRoots.length > 0) {
-            roots = new ArrayList<>();
-            for (File file : fsRoots) {
-                roots.add(file.getAbsolutePath());
-            }
-            Collections.sort(roots);
-        }
-        fileSystemBrowser.setRoots(roots);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/indexer/GetIndexerService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/indexer/GetIndexerService.java
deleted file mode 100644
index d45eebc..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/indexer/GetIndexerService.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.artifactory.ui.rest.service.admin.services.indexer;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.index.IndexerDescriptor;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.artifactory.ui.rest.common.ServiceModelPopulator;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
-public class GetIndexerService implements RestService {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        if (!ConstantValues.aolDedicatedServer.getBoolean()) {
-            AolUtils.assertNotAol("GetIndexer");
-        }
-        getIndexerDescriptor(response);
-    }
-
-    /**
-     * get the indexer descriptor from config and populate data to indexer model
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     */
-    private void getIndexerDescriptor(RestResponse artifactoryResponse) {
-        IndexerDescriptor indexerDescriptor = centralConfigService.getDescriptor().getIndexer();
-        RestModel indexer = ServiceModelPopulator.populateIndexerConfiguration(indexerDescriptor);
-        artifactoryResponse.iModel(indexer);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/indexer/RunIndexNowService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/indexer/RunIndexNowService.java
deleted file mode 100644
index db65db5..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/indexer/RunIndexNowService.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package org.artifactory.ui.rest.service.admin.services.indexer;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.repo.index.MavenIndexerService;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
-public class RunIndexNowService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(RunIndexNowService.class);
-
-    @Autowired
-    private MavenIndexerService mavenIndexer;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        if (!ConstantValues.aolDedicatedServer.getBoolean()) {
-            AolUtils.assertNotAol("RunIndexNow");
-        }
-
-        BasicStatusHolder statusHolder = new BasicStatusHolder();
-        try {
-            // run index now
-            runIndexNow(response);
-        } catch (Exception e) {
-            updateErrorFeedBack(response, statusHolder, e);
-        }
-    }
-
-    /**
-     * update error feedback
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param statusHolder        - status holder
-     * @param e                   - exception
-     */
-    private void updateErrorFeedBack(RestResponse artifactoryResponse, BasicStatusHolder statusHolder, Exception e) {
-        log.error("Could not run indexer.", e);
-        statusHolder.error(e.getMessage(), log);
-        artifactoryResponse.error("Indexer did not run: " + e.getMessage());
-    }
-
-    /**
-     * schedule indexing for now
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     */
-    private void runIndexNow(RestResponse artifactoryResponse) {
-        BasicStatusHolder status = new BasicStatusHolder();
-        mavenIndexer.scheduleImmediateIndexing(status);
-        if (status.isError()) {
-            artifactoryResponse.error(status.getStatusMsg());
-        } else {
-            artifactoryResponse.info("Indexer was successfully scheduled to run in the background");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/indexer/UpdateIndexerService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/indexer/UpdateIndexerService.java
deleted file mode 100644
index 8bf7146..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/admin/services/indexer/UpdateIndexerService.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.ui.rest.service.admin.services.indexer;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.util.AolUtils;
-import org.artifactory.ui.rest.model.admin.services.indexer.Indexer;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
-public class UpdateIndexerService implements RestService {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        if (!ConstantValues.aolDedicatedServer.getBoolean()) {
-            AolUtils.assertNotAol("UpdateIndexer");
-        }
-        // update config descriptor indexer
-        updateIndexerDescriptor(request, response);
-    }
-
-    /**
-     * update indexer descriptor
-     *
-     * @param artifactoryRequest  - encapsulate data related to request
-     * @param artifactoryResponse - encapsulate data require for response
-     */
-    private void updateIndexerDescriptor(ArtifactoryRestRequest artifactoryRequest, RestResponse artifactoryResponse) {
-        Indexer indexer = (Indexer) artifactoryRequest.getImodel();
-        MutableCentralConfigDescriptor configDescriptor = centralConfigService.getMutableDescriptor();
-        configDescriptor.setIndexer(indexer.toDescriptor());
-        centralConfigService.saveEditedDescriptorAndReload(configDescriptor);
-        artifactoryResponse.info("Successfully updated Indexer service settings");
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/BrowseServiceFactory.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/BrowseServiceFactory.java
deleted file mode 100644
index 9ebb60d..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/BrowseServiceFactory.java
+++ /dev/null
@@ -1,218 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse;
-
-import org.artifactory.rest.common.service.admin.reverseProxies.ReverseProxySnippetService;
-import org.artifactory.rest.common.service.artifact.AddSha256ToArtifactService;
-import org.artifactory.rest.common.service.trash.EmptyTrashService;
-import org.artifactory.rest.common.service.trash.RestoreArtifactService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.properties.DeletePropertyModel;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.watchers.DeleteWatchersModel;
-import org.artifactory.ui.rest.service.artifacts.browse.generic.BrowseNativeService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.actions.*;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.actions.bintray.DistributeArtifactService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.actions.bintray.GetAvailableDistributionReposService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.actions.deleteversions.DeleteVersionService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.actions.deleteversions.GetVersionUnitsService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.blackduck.GetBlackDuckArtifactService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.blackduck.UpdateBlackDuckComponentIdService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.bower.BowerViewService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.builds.GetArtifactBuildJsonService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.builds.GetArtifactBuildsService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.checksums.FixChecksumsService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.docker.DockerAncestryViewService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.docker.DockerV2ViewService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.docker.DockerViewService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.gemsview.GemsViewService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.general.GetArtifactsCount;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.general.GetDependencyDeclarationService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.general.GetGeneralArtifactsService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.general.SetFilteredResourceService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.general.bintray.GetGeneralBintrayService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.general.licenses.*;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.npmview.NpmViewService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.nugetview.NugetViewService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.permission.GetEffectivePermissionService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.properties.CreatePropertyService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.properties.DeletePropertyService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.properties.GetPropertyService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.properties.UpdatePropertyService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.pypi.PypiViewService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.rpm.RpmViewService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.viewsource.ArchiveViewSourceService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.watchers.GetWatchersService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.watchers.RemoveWatchersService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.watchers.WatchStatusService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tree.BrowseTreeNodesService;
-import org.springframework.beans.factory.annotation.Lookup;
-
-/**
- * @author Chen Keinan
- */
-public abstract class BrowseServiceFactory {
-
-    // fetch tree service
-    @Lookup
-    public abstract BrowseTreeNodesService getBrowseTreeNodesService();
-    // fetch general artifacts info
-    @Lookup
-    public abstract GetGeneralArtifactsService getGetGeneralArtifactsService();
-
-    @Lookup
-    public abstract GetGeneralBintrayService getGetGeneralBintrayService();
-
-    @Lookup
-    public abstract GetArtifactsCount getArtifactsCount();
-
-    @Lookup
-    public abstract GetDependencyDeclarationService getGetDependencyDeclarationService();
-    // property service
-    @Lookup
-    public abstract CreatePropertyService getCreatePropertyService();
-
-    @Lookup
-    public abstract GetPropertyService getGetPropertyService();
-
-    @Lookup
-    public abstract UpdatePropertyService getUpdatePropertyService();
-
-    @Lookup
-    public abstract DeletePropertyService<DeletePropertyModel> getDeletePropertyService();
-
-    @Lookup
-    public abstract GetEffectivePermissionService getGetEffectivePermissionService();
-
-    @Lookup
-    public abstract GemsViewService gemsViewService();
-
-    @Lookup
-    public abstract NpmViewService npmViewService();
-
-    // watchers service
-    @Lookup
-    public abstract GetWatchersService getWatchersService();
-
-    @Lookup
-    public abstract RemoveWatchersService<DeleteWatchersModel> getRemoveWatchersService();
-
-    // builds service
-    @Lookup
-    public abstract GetArtifactBuildsService getArtifactBuildsService();
-
-    @Lookup
-    public abstract GetArtifactBuildJsonService getArtifactBuildJsonService();
-
-    // action services
-    @Lookup
-    public abstract DownloadArtifactService downloadArtifactService();
-
-    @Lookup
-    public abstract GetDownloadFolderInfoService getDownloadFolderInfo();
-
-    @Lookup
-    public abstract DownloadFolderArchiveService downloadFolder();
-
-    @Lookup
-    public abstract EmptyTrashService emptyTrashService();
-
-    @Lookup
-    public abstract RestoreArtifactService restoreArtifactService();
-
-    @Lookup
-    public abstract WatchArtifactService watchArtifactService();
-
-    @Lookup
-    public abstract CopyArtifactService copyArtifactService();
-
-    @Lookup
-    public abstract MoveArtifactService moveArtifactService();
-
-    @Lookup
-    public abstract ZapArtifactService zapArtifactService();
-
-    @Lookup
-    public abstract ZapCachesVirtualService zapCachesVirtual();
-
-    @Lookup
-    public abstract DeleteArtifactService deleteArtifactService();
-
-    @Lookup
-    public abstract ViewArtifactService viewArtifactService();
-    // watch status
-    @Lookup
-    public abstract WatchStatusService watchStatusService();
-    // delete versions
-    @Lookup
-    public abstract GetVersionUnitsService getDeleteVersionsService();
-
-    @Lookup
-    public abstract DeleteVersionService deleteVersionService();
-    // view source
-    @Lookup
-    public abstract ArchiveViewSourceService archiveViewSourceService();
-
-    @Lookup
-    public abstract NugetViewService nugetViewService();
-
-    @Lookup
-    public abstract RpmViewService rpmViewService();
-
-    @Lookup
-    public abstract PypiViewService pypiViewService();
-
-    @Lookup
-    public abstract BowerViewService bowerViewService();
-
-    @Lookup
-    public abstract DockerViewService dockerViewService();
-
-    @Lookup
-    public abstract DockerV2ViewService dockerV2ViewService();
-
-    @Lookup
-    public abstract DockerAncestryViewService dockerAncestryViewService();
-
-    @Lookup
-    public abstract ReverseProxySnippetService dockerProxyViewService();
-
-    @Lookup
-    public abstract GetBlackDuckArtifactService getBlackDuckArtifact();
-
-    @Lookup
-    public abstract UpdateBlackDuckComponentIdService updateBlackDuckComponentId();
-
-    @Lookup
-    public abstract FixChecksumsService fixChecksums();
-
-    @Lookup
-    public abstract SetFilteredResourceService setFilteredResource();
-
-    @Lookup
-    public abstract GetAllAvailableLicensesService getAllAvailableLicenses();
-
-    @Lookup
-    public abstract SetLicensesOnPathService setLicensesOnPath();
-
-    @Lookup
-    public abstract ScanArtifactForLicensesService scanArtifactForLicenses();
-
-    @Lookup
-    public abstract QueryCodeCenterService queryCodeCenter();
-
-    @Lookup
-    public abstract GetArchiveLicenseFileService getArchiveLicenseFile();
-
-    @Lookup
-    public abstract BrowseNativeService browseNative();
-
-    @Lookup
-    public abstract RecalculateIndexService recalculateIndex();
-
-    @Lookup
-    public abstract AddSha256ToArtifactService addSha256ToArtifact();
-
-    @Lookup
-    public abstract DistributeArtifactService distributeArtifact();
-
-    @Lookup
-    public abstract GetAvailableDistributionReposService getAvailableDistributionRepos();
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/generic/BrowseNativeService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/generic/BrowseNativeService.java
deleted file mode 100644
index 2facc1c..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/generic/BrowseNativeService.java
+++ /dev/null
@@ -1,361 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.generic;
-
-import com.google.common.collect.Lists;
-import com.sun.jersey.api.NotFoundException;
-import org.apache.commons.lang.StringEscapeUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.CoreAddons;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.*;
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.api.storage.StorageUnit;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.utils.BrowseUtils;
-import org.artifactory.webapp.servlet.HttpArtifactoryResponse;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.io.Serializable;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Locale;
-
-import static org.apache.commons.lang.StringUtils.rightPad;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class BrowseNativeService implements RestService<String> {
-    private static final Logger log = LoggerFactory.getLogger(BrowseNativeService.class);
-    private static final DateTimeFormatter DATE_FORMAT = DateTimeFormat.forPattern("dd-MMM-yyyy HH:mm")
-            .withLocale(Locale.ENGLISH);
-    private List<? extends BaseBrowsableItem> items;
-    private int columnSize;
-    private boolean printParent;
-    public static final String REALM = "Artifactory Realm";
-    public static final String ATTR_ARTIFACTORY_REPOSITORY_PATH = "artifactory.repository_path";
-    public static final String ATTR_ARTIFACTORY_REQUEST_PROPERTIES = "artifactory.request_properties";
-    public String head;
-    @Autowired
-    private RepositoryService repositoryService;
-    @Autowired
-    private RepositoryBrowsingService repoBrowsingService;
-    @Autowired
-    private AuthorizationService authorizationService;
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<String> request, RestResponse response) {
-        try {
-            // get Html native browsing page
-            String page = buildPage(request, response);
-            // update response
-            response.iModel(page);
-        }
-        catch (Exception e){
-            response.error(e.getMessage()).responseCode(HttpStatus.SC_NOT_FOUND);
-            log.debug(e.getMessage() + " - " + HttpStatus.SC_NOT_FOUND);
-        }
-    }
-
-    /**
-     * build browsing native page with data
-     *
-     * @param artifactoryRequest  - encapsulate data related to request
-     * @param artifactoryResponse - encapsulate data related to response
-     * @return - native browsing html page
-     */
-    private String buildPage(ArtifactoryRestRequest artifactoryRequest, RestResponse artifactoryResponse) {
-        StringBuilder page = new StringBuilder();
-        try {
-            HttpServletRequest httpServletRequest = artifactoryRequest.getServletRequest();
-            RepoPath repoPath = (RepoPath) httpServletRequest.getAttribute(ATTR_ARTIFACTORY_REPOSITORY_PATH);
-            if (repoPath == null || StringUtils.isEmpty(repoPath.getRepoKey())) {
-                throw new NotFoundException("Repository Path Not Found");
-            }
-            // fetch page props
-            Properties requestProps = (Properties) httpServletRequest
-                    .getAttribute(ATTR_ARTIFACTORY_REQUEST_PROPERTIES);
-            updatePageData(repoPath, requestProps, artifactoryResponse);
-            // fetch page title
-            String title = getPageTitle(repoPath);
-            // fetch page body
-            String body = getBody();
-            // fetch page footer
-            String addressFooter = getAddressFooter(httpServletRequest);
-            // create html page
-            createHtmlPage(page, title, body, addressFooter);
-        } catch (IOException e) {
-            throw new RuntimeException(e.getMessage());
-        }
-        return page.toString();
-    }
-
-    /**
-     * create html page and related tags
-     *
-     * @param page          - page string builder
-     * @param title         - page title
-     * @param body          - page body
-     * @param addressFooter - page footer
-     */
-    private void createHtmlPage(StringBuilder page, String title, String body, String addressFooter) {
-        page.append("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n");
-        page.append("<html>\n");
-        page.append("<head>");
-        page.append("<title>" + title + "</title>\n");
-        page.append("</head>\n");
-        page.append("<body>\n");
-        page.append("<h1>" + title + "</h1>\n");
-        page.append("<pre>" + head + "</pre>");
-        page.append("<hr/>\n" + "<pre>");
-        page.append(body);
-        page.append("</pre>\n" + "<hr/>");
-        page.append("<address style=\"font-size:small;\">").append(addressFooter).append("</address>");
-        page.append("</body>");
-        page.append("</html>");
-    }
-
-    /**
-     * get path title
-     * @param repoPath - repository path
-     * @return - native browsing page title
-     */
-    private String getPageTitle(RepoPath repoPath) {
-        StringBuilder titleBuilder = new StringBuilder(String.format("Index of %s/%s", repoPath.getRepoKey(),
-                StringEscapeUtils.escapeXml(repoPath.getPath())));
-        return titleBuilder.toString();
-    }
-
-    /**
-     * update page related data
-     * @param repoPath - repository path
-     * @param requestProps - request related props
-     * @param artifactoryResponse - encapsulate data related response
-     * @throws IOException
-     */
-    private void updatePageData(final RepoPath repoPath, Properties requestProps, RestResponse artifactoryResponse)
-            throws IOException {
-        RootNodesFilterResult rootNodesFilterResult = new RootNodesFilterResult();
-        final List<? extends BaseBrowsableItem> items = getItems(repoPath, requestProps, rootNodesFilterResult);
-        sendChallengeMessage(repoPath, rootNodesFilterResult, items, artifactoryResponse.getServletResponse());
-        // get max name length
-        int maxLength = 4;
-        for (BaseBrowsableItem baseBrowsableItem : items) {
-            maxLength = Math.max(baseBrowsableItem.getName().length(), maxLength);
-        }
-        // set table head
-        setTableHead(maxLength);
-        // items
-        this.printParent = StringUtils.isNotEmpty(repoPath.getPath());
-        this.items = items;
-        this.columnSize = maxLength + 2;
-    }
-
-    /**
-     * send Challenge Message To Anonymous If List Node is empty due to Missing Permission
-     *
-     * @param repoPath              - repo path
-     * @param rootNodesFilterResult - object hold empty list canRead flag
-     * @param items                 - list of Items
-     * @throws IOException
-     */
-    private void sendChallengeMessage(RepoPath repoPath,
-                                      RootNodesFilterResult rootNodesFilterResult,
-                                      List<? extends BaseBrowsableItem> items,
-                                      HttpServletResponse response) throws IOException {
-        ContextHelper.get().beanForType(BasicAuthenticationEntryPoint.class);
-        if (isItemListEmptyDueAnonymousMissingPermission(rootNodesFilterResult, items)) {
-            ArtifactoryResponse artifactoryResponse = new HttpArtifactoryResponse(response);
-            artifactoryResponse.sendAuthorizationRequired("Browse request for repo:path " + repoPath + " is forbidden " +
-                    "for user 'anonymous'.", REALM);
-        }
-    }
-
-    /**
-     * @param rootNodesFilterResult - object hold List canRead flag
-     * @param items                 list of items
-     * @return true is list is empty due to Anonymous Missing Permission to read
-     */
-    private boolean isItemListEmptyDueAnonymousMissingPermission(RootNodesFilterResult rootNodesFilterResult,
-                                                                 List<? extends BaseBrowsableItem> items) {
-        return items.isEmpty() && !rootNodesFilterResult.isAllItemNodesCanRead();
-    }
-
-    /**
-     * get page head data
-     *
-     * @param maxLength - max node name length
-     * @return - page head
-     */
-    private void setTableHead(int maxLength) {
-        final StringBuilder head = new StringBuilder();
-        head.append(rightPad("Name", maxLength + 2));
-        head.append("Last modified      Size");
-        this.head = head.toString();
-    }
-
-    /**
-     * get addresses footer
-     *
-     * @param request - http servlet request
-     * @return - address footer
-     */
-    private String getAddressFooter(HttpServletRequest request) {
-        StringBuilder addressBuilder = new StringBuilder();
-        String versionInfo = getListBrowsingVersion();
-        String serverName = request.getServerName();
-        addressBuilder.append(String.format("%s Server at %s Port %s", versionInfo, serverName, request.getServerPort()));
-        return addressBuilder.toString();
-    }
-
-    /**
-     * get List browsing versions
-     *
-     * @return - list browsing versions
-     */
-    public String getListBrowsingVersion() {
-        CoreAddons addon =  ContextHelper.get().beanForType(AddonsManager.class).addonByType(CoreAddons.class);
-        return addon.getListBrowsingVersion();
-    }
-
-    /**
-     * sort retrieved browsable item from repository
-     *
-     * @param repoPath              - repository path
-     * @param requestProps          - request properties
-     * @param rootNodesFilterResult - object hold the List node acceptance status flag,if flagged to false meaning
-     *                              at least one node has read permission issue by user
-     * @return list of sorted browsable item
-     */
-    private List<? extends BaseBrowsableItem> getItems(RepoPath repoPath, Properties requestProps,
-                                                       RootNodesFilterResult rootNodesFilterResult) {
-        boolean updateRootNodesFilterFlag = authorizationService.isAnonymous();
-        List<? extends BaseBrowsableItem> items =
-                getBrowsableItemsList(repoPath, requestProps, rootNodesFilterResult, updateRootNodesFilterFlag);
-        Collections.sort(items, new ItemInfoComparator());
-        return items;
-    }
-
-    /**
-     * get Browsable Item from repositories (local/remote/virtual) based on search criteria
-     *
-     * @param repoPath                  - repository path
-     * @param requestProps              - properties of the request
-     * @param rootNodesFilterResult     - object hold the List node acceptance status flag,if flagged to false meaning
-     *                                  at least one node has read permission issue by user
-     * @param updateRootNodesFilterFlag - if true keep the acceptance status flag
-     * @return
-     */
-    private List<? extends BaseBrowsableItem> getBrowsableItemsList(RepoPath repoPath, Properties requestProps,
-                                                                    RootNodesFilterResult rootNodesFilterResult, boolean updateRootNodesFilterFlag) {
-        List<BaseBrowsableItem> items = Lists.newArrayList();
-        BrowsableItemCriteria.Builder builder = new BrowsableItemCriteria.Builder(repoPath).
-                requestProperties(requestProps);
-        boolean includeChecksums = !ConstantValues.uiHideChecksums.getBoolean();
-        builder.includeChecksums(includeChecksums);
-        BrowsableItemCriteria criteria = builder.build();
-        if (repositoryService.remoteRepoDescriptorByKey(repoPath.getRepoKey()) != null) {
-            items = repoBrowsingService.getRemoteRepoBrowsableChildren(criteria, updateRootNodesFilterFlag, rootNodesFilterResult);
-        } else if (repositoryService.localCachedOrDistributionRepoDescriptorByKey(repoPath.getRepoKey()) != null) {
-            items = repoBrowsingService.getLocalRepoBrowsableChildren(criteria, updateRootNodesFilterFlag, rootNodesFilterResult);
-        } else if (repositoryService.virtualRepoDescriptorByKey(repoPath.getRepoKey()) != null) {
-            items = repoBrowsingService.getVirtualRepoBrowsableChildren(criteria, updateRootNodesFilterFlag, rootNodesFilterResult);
-        }
-        if (!includeChecksums) {
-            items = BrowseUtils.filterChecksums(items);
-        }
-        return items;
-    }
-
-    /**
-     * get html page nodes body
-     *
-     * @return - html body
-     */
-    public String getBody() {
-        StringBuilder bodyBuilder = new StringBuilder();
-        if (printParent) {
-            bodyBuilder.append("<a href=\"../\">../</a>\n");
-
-        } else if (items.isEmpty()) {
-            bodyBuilder.append("No items found.\n");
-            return bodyBuilder.toString();
-        }
-
-        for (BaseBrowsableItem item : items) {
-            String name = item.getName();
-            bodyBuilder.append("<a href=\"");
-            bodyBuilder.append(name);
-            if (item.isFolder()) {
-                bodyBuilder.append("/");
-            }
-            bodyBuilder.append("\">");
-            bodyBuilder.append(StringEscapeUtils.escapeXml(name));
-            if (item.isFolder()) {
-                bodyBuilder.append("/");
-            }
-            bodyBuilder.append("</a>");
-            if (item.isRemote()) {
-                bodyBuilder.append("->");
-            }
-            bodyBuilder.append(StringUtils.repeat(" ", columnSize - name.length()));
-            if (!item.isFolder()) {
-                bodyBuilder.append(" ");
-            }
-            if (item.getLastModified() > 0) {
-                bodyBuilder.append(DATE_FORMAT.print(item.getLastModified()));
-            } else {
-                bodyBuilder.append("  -");
-            }
-            bodyBuilder.append("  ");
-
-            long size = item.getSize();
-            if (item.isFolder() || size <= 0) {
-                bodyBuilder.append("  -");
-            } else {
-                bodyBuilder.append(StorageUnit.toReadableString(size));
-            }
-            bodyBuilder.append("\n");
-        }
-        return bodyBuilder.toString();
-    }
-
-    /**
-     * item comparator for sorting
-     */
-    private static class ItemInfoComparator implements Comparator<BaseBrowsableItem>, Serializable {
-        @Override
-        public int compare(BaseBrowsableItem o1, BaseBrowsableItem o2) {
-            final int folderCmp = Boolean.valueOf(o2.isFolder()).compareTo(o1.isFolder());
-            if (folderCmp != 0) {
-                return folderCmp;
-            }
-            return o1.getName().compareToIgnoreCase(o2.getName());
-        }
-    }
-}
-
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/CopyArtifactService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/CopyArtifactService.java
deleted file mode 100644
index 80d5b8f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/CopyArtifactService.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.actions;
-
-import org.artifactory.api.common.MoveMultiStatusHolder;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.CopyArtifact;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CopyArtifactService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(CopyArtifactService.class);
-
-    @Autowired
-    private RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        CopyArtifact copyArtifact = (CopyArtifact) request.getImodel();
-        // copy artifact to another repo
-        copyArtifact(response, copyArtifact);
-    }
-
-    /**
-     * copy artifact from one repo to another
-     *
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param copyArtifact        - copy action model
-     */
-    private void copyArtifact(RestResponse artifactoryResponse, CopyArtifact copyArtifact) {
-        String msg = String.format("Failed to %s from src=%s to target=%s: ", "copy", copyArtifact.getPath(),
-                copyArtifact.getTargetPath());
-        MoveMultiStatusHolder status = new MoveMultiStatusHolder();
-            // copy artifact
-            MoveMultiStatusHolder copyStatus = copy(copyArtifact);
-            // update response data
-            updateResponseData(artifactoryResponse, copyArtifact, msg, copyStatus);
-
-    }
-
-    /**
-     * update response feedback and http status code
-     *
-     * @param artifactoryResponse - encapsulate data require for reposne
-     * @param copyArtifact        - copy action model
-     * @param msg                 - feedback msg
-     * @param copyStatus          - copy status holder
-     */
-    private void updateResponseData(RestResponse artifactoryResponse, CopyArtifact copyArtifact, String msg,
-            MoveMultiStatusHolder copyStatus) {
-        try {
-            if (copyStatus.hasErrors()) {
-                artifactoryResponse.responseCode(HttpServletResponse.SC_CONFLICT);
-                List<String> errors = new ArrayList<>();
-                copyStatus.getErrors().forEach(error -> errors.add(error.getMessage()));
-                artifactoryResponse.errors(errors);
-            } else {
-                artifactoryResponse.info(
-                        "Artifacts successfully copied to:" + copyArtifact.getTargetRepoKey() + ":" + copyArtifact.getTargetPath());
-            }
-        } catch (Exception e) {
-            artifactoryResponse.responseCode(HttpServletResponse.SC_CONFLICT);
-            List<String> errors = new ArrayList<>();
-            copyStatus.getErrors().forEach(error -> errors.add(error.getMessage()));
-            artifactoryResponse.errors(errors);
-        }
-    }
-
-    /**
-     * copy artifact from one repo path to another repo path
-     *
-     * @param copyArtifact - copy action model
-     * @return - copy multi status holder
-     * @throws Exception
-     */
-    private MoveMultiStatusHolder copy(CopyArtifact copyArtifact) {
-
-        MoveMultiStatusHolder status;
-        RepoPath repoPath = InternalRepoPathFactory.create(copyArtifact.getRepoKey(), copyArtifact.getPath());
-        RepoPath targetRepoPath = InternalRepoPathFactory.create(copyArtifact.getTargetRepoKey(),
-                copyArtifact.getTargetPath());
-        // Force suppressing layouts, we want to be able to copy stuff between layouts
-        copyArtifact.setSuppressLayouts(true);
-        status = repositoryService.copyMultiTx(repoPath, targetRepoPath, copyArtifact.isDryRun(),
-                copyArtifact.isSuppressLayouts(), copyArtifact.isFailFast());
-        if (!status.isError() && !status.hasWarnings()) {
-            String opType = (copyArtifact.isDryRun()) ? "Dry run for " : "";
-            status.status(
-                    String.format("%s copying %s to %s completed successfully, %s artifacts and %s folders were " +
-                                    "copied", opType, repoPath, targetRepoPath, status.getMovedArtifactsCount(),
-                            status.getMovedFoldersCount()), log);
-        }
-        return status;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/DeleteArtifactService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/DeleteArtifactService.java
deleted file mode 100644
index 1299457..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/DeleteArtifactService.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.actions;
-
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.common.StatusHolder;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.DeleteArtifact;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DeleteArtifactService implements RestService {
-
-    @Autowired
-    private RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        DeleteArtifact deleteArtifact = (DeleteArtifact) request.getImodel();
-        String repoKey = deleteArtifact.getRepoKey();
-        String path = deleteArtifact.getPath();
-        RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-        // delete artifact from repo path
-        StatusHolder statusHolder = deleteArtifact(repoPath);
-        // update response data
-        updateResponseData(response, statusHolder);
-    }
-
-    /**
-     * update response feedback
-     *
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param statusHolder        - hold artifact delete status
-     */
-    private void updateResponseData(RestResponse artifactoryResponse, StatusHolder statusHolder) {
-        if (statusHolder.isError()) {
-            artifactoryResponse.error(statusHolder.getLastError().getMessage());
-        } else {
-            artifactoryResponse.info("Successfully deleted artifacts");
-        }
-    }
-
-    /**
-     * un deploy artifact from repo path
-     *
-     * @param repoPath - artifact repo path
-     * @return - status of the un deploy
-     */
-    protected StatusHolder deleteArtifact(RepoPath repoPath) {
-        return repositoryService.undeployMultiTransaction(repoPath);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/DownloadArtifactService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/DownloadArtifactService.java
deleted file mode 100644
index a47af60..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/DownloadArtifactService.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.actions;
-
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.DownloadArtifact;
-import org.artifactory.util.HttpUtils;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DownloadArtifactService implements RestService {
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        DownloadArtifact downloadArtifact = (DownloadArtifact) request.getImodel();
-        String repoKey = downloadArtifact.getRepoKey();
-        String path = downloadArtifact.getPath();
-        RestModel artifactDownloadModel = getArtifactDownloadModel(request, repoKey, path);
-        response.iModel(artifactDownloadModel);
-    }
-
-    /**
-     * build download url and update download model
-     * @param artifactoryRequest - encapsulate data related to request
-      * @param repoKey - repo key
-     * @param path - path
-     */
-    private RestModel getArtifactDownloadModel(ArtifactoryRestRequest artifactoryRequest,
-            String repoKey, String path) {
-        HttpServletRequest httpRequest =artifactoryRequest.getServletRequest();
-        DownloadArtifact downloadArtifact = new DownloadArtifact();
-        String downloadPath = HttpUtils.getServletContextUrl(httpRequest) + "/" + repoKey + "/" + path;
-        downloadArtifact.setPath(downloadPath);
-        return downloadArtifact;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/DownloadFolderArchiveService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/DownloadFolderArchiveService.java
deleted file mode 100644
index c4eafb4..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/DownloadFolderArchiveService.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.actions;
-
-import org.apache.commons.io.IOUtils;
-import org.artifactory.api.archive.ArchiveType;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.download.FolderDownloadService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.service.StreamRestResponse;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.DownloadFolder;
-import org.artifactory.util.PathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.ws.rs.core.StreamingOutput;
-import java.io.InputStream;
-
-import static org.apache.http.HttpStatus.SC_FORBIDDEN;
-
-/**
- * Downloads a folder in the requested format.
- *
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DownloadFolderArchiveService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(DownloadFolderArchiveService.class);
-
-    @Autowired
-    FolderDownloadService folderDownloadService;
-
-    @Autowired
-    AuthorizationService authService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        if (authService.isAnonymous()) {
-            response.error("You must be logged in to download a folder or repository.").responseCode(SC_FORBIDDEN);
-        } else {
-            DownloadFolder folderToDownload = new DownloadFolder(request);
-            String repoKey = folderToDownload.getRepoKey();
-            String path = folderToDownload.getPath();
-            RepoPath pathToDownload = RepoPathFactory.create(repoKey, path);
-            respondWithArchiveStream((StreamRestResponse) response, folderToDownload.getArchiveType(), pathToDownload);
-        }
-    }
-
-    private void respondWithArchiveStream(StreamRestResponse response, ArchiveType archiveType, RepoPath folder) {
-        BasicStatusHolder status = new BasicStatusHolder();
-        //Defaults to zip
-        archiveType = archiveType != null ? archiveType : ArchiveType.ZIP;
-        InputStream is = folderDownloadService.process(folder, archiveType, status);
-        if (status.isError()) {
-            response.error(status.getLastError().getMessage()).responseCode(status.getLastError().getStatusCode());
-        } else if (is == null) {
-            response.error("Unexpected error encountered, download stream is null - check the log for additional info");
-        } else {
-            response.setDownloadFile(createArchiveFileName(folder, archiveType));
-            response.setDownload(true);
-            response.iModel((StreamingOutput) out -> {
-                try {
-                    IOUtils.copy(is, out);
-                } finally {
-                    log.debug("Closing folder download stream.");
-                    out.flush();
-                    IOUtils.closeQuietly(is);
-                    IOUtils.closeQuietly(out);
-                }
-            });
-        }
-    }
-
-    /**
-     * <Folder name>.<archive extension>
-     */
-    private String createArchiveFileName(RepoPath path, ArchiveType archiveType) {
-        return (path.isRoot() ? path.getRepoKey()
-                : PathUtils.getLastPathElement(path.getPath())) + "." + archiveType.value();
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/GetDownloadFolderInfoService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/GetDownloadFolderInfoService.java
deleted file mode 100644
index 65f7b43..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/GetDownloadFolderInfoService.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.actions;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.download.FolderDownloadInfo;
-import org.artifactory.api.download.FolderDownloadService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.download.FolderDownloadConfigDescriptor;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.DownloadFolder;
-import org.artifactory.ui.utils.RequestUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import static org.apache.http.HttpStatus.SC_BAD_REQUEST;
-import static org.apache.http.HttpStatus.SC_FORBIDDEN;
-
-/**
- * Called when user chooses 'download folder' from UI - initial check that request does not exceed allowed
- * file size limit and max files download limit
- *
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetDownloadFolderInfoService implements RestService {
-
-    @Autowired
-    RepositoryService repoService;
-
-    @Autowired
-    FolderDownloadService folderDownloadService;
-
-    @Autowired
-    CentralConfigService configService;
-
-    @Autowired
-    AuthorizationService authService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        RepoPath folderToDownload = RequestUtils.getPathFromRequest(request);
-        FolderDownloadConfigDescriptor config = folderDownloadService.getFolderDownloadConfig();
-        if (!repoService.getItemInfo(folderToDownload).isFolder()) {
-            response.error("Path " + folderToDownload.toPath() + " is not a folder.").responseCode(SC_BAD_REQUEST);
-        } else if (!config.isEnabled()) {
-            response.error("Downloading folders as archive was disabled by your system admin.");
-        } else if (!authService.canRead(folderToDownload)) {
-            response.error("You don't have the required permissions to download this folder.").responseCode(
-                    SC_FORBIDDEN);
-        } else {
-            respond(folderToDownload, response, config);
-        }
-    }
-
-    private void respond(RepoPath pathToDownload, RestResponse response, FolderDownloadConfigDescriptor config) {
-        FolderDownloadInfo folderInfo = folderDownloadService.collectFolderInfo(pathToDownload);
-        double folderSize = folderInfo.getSizeMb();
-        int maxDownloadSize = config.getMaxDownloadSizeMb();
-        long folderFileCount = folderInfo.getTotalFiles();
-        long maxFileCount = config.getMaxFiles();
-        if (folderSize > maxDownloadSize) {
-            response.error("Folder " + pathToDownload.getPath() + "'s size(" + folderSize + "MB) exceeds the max " +
-                    "allowed download size(" + maxDownloadSize + "MB).").responseCode(SC_FORBIDDEN);
-        } else if (folderFileCount > maxFileCount) {
-            response.error("Folder " + pathToDownload.getPath() + "'s artifact count(" + folderFileCount + ") exceeds" +
-                    " the max allowed artifact count(" + maxFileCount + ").").responseCode(SC_FORBIDDEN);
-        } else {
-            response.iModel(new DownloadFolder(folderInfo));
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/MoveArtifactService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/MoveArtifactService.java
deleted file mode 100644
index 74a7a0e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/MoveArtifactService.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.actions;
-
-import org.artifactory.api.common.MoveMultiStatusHolder;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.MoveArtifact;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class MoveArtifactService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(MoveArtifactService.class);
-
-    @Autowired
-    private RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        MoveArtifact moveArtifact = (MoveArtifact) request.getImodel();
-        // move artifact to another repo
-        moveArtifact(response, moveArtifact);
-    }
-
-
-    /**
-     * copy artifact from one repo to another
-     *
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param moveAction          - copy action model
-     */
-    private void moveArtifact(RestResponse artifactoryResponse, MoveArtifact moveAction) {
-        String msg = String.format("Failed to %s from src=%s to target=%s: ", "move", moveAction.getPath(),
-                moveAction.getTargetPath());
-        MoveMultiStatusHolder status = new MoveMultiStatusHolder();
-        try {
-            // copy artifact
-            MoveMultiStatusHolder copyStatus = move(moveAction);
-            // update response data
-            updateResponseData(artifactoryResponse, moveAction, msg, copyStatus);
-        } catch (Exception e) {
-            log.debug("{}", e);
-            status.error(msg, e, log);
-        }
-    }
-
-    /**
-     * move artifact from one repo path to another repo path
-     *
-     * @param moveArtifact - copy action model
-     * @return - move multi status holder
-     * @throws Exception
-     */
-    private MoveMultiStatusHolder move(MoveArtifact moveArtifact) throws Exception {
-        MoveMultiStatusHolder status;
-        RepoPath repoPath = InternalRepoPathFactory.create(moveArtifact.getRepoKey(), moveArtifact.getPath());
-        RepoPath targetRepoPath = InternalRepoPathFactory.create(moveArtifact.getTargetRepoKey(),
-                moveArtifact.getTargetPath());
-        // Force suppressing layouts, we want to be able to move stuff between layouts
-        moveArtifact.setSuppressLayouts(true);
-        status = repositoryService.moveMultiTx(repoPath, targetRepoPath, moveArtifact.isDryRun(),
-                moveArtifact.isSuppressLayouts(), moveArtifact.isFailFast());
-        if (!status.isError() && !status.hasWarnings()) {
-            String opType = (moveArtifact.isDryRun()) ? "Dry run for " : "";
-            status.status(String.format("%s moving %s to %s completed successfully, %s artifacts and %s folders were " +
-                            "moved", opType, repoPath, targetRepoPath, status.getMovedArtifactsCount(),
-                    status.getMovedFoldersCount()), log);
-        }
-        return status;
-    }
-
-    /**
-     * update response feedback and http status code
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param moveArtifact        - copy action model
-     * @param msg                 - feedback msg
-     * @param moveStatus          - copy status holder
-     */
-    private void updateResponseData(RestResponse artifactoryResponse, MoveArtifact moveArtifact, String msg,
-            MoveMultiStatusHolder moveStatus) {
-        if (moveStatus.hasErrors()) {
-            artifactoryResponse.responseCode(HttpServletResponse.SC_CONFLICT);
-            List<String> errors = new ArrayList<>();
-            moveStatus.getErrors().forEach(error -> errors.add(error.getMessage()));
-            artifactoryResponse.errors(errors);
-        } else {
-            artifactoryResponse.info(
-                    "Successfully moved artifact to " + moveArtifact.getTargetRepoKey() + "/" + moveArtifact.getTargetPath());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/RecalculateIndexService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/RecalculateIndexService.java
deleted file mode 100644
index aace31e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/RecalculateIndexService.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.actions;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.recalculateindex.BaseIndexCalculator;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class RecalculateIndexService<T extends BaseIndexCalculator> implements RestService<T> {
-    private static final Logger log = LoggerFactory.getLogger(RecalculateIndexService.class);
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-        BaseIndexCalculator baseIndexCalculator = request.getImodel();
-        RepoPath repoPath = RepoPathFactory.create(baseIndexCalculator.getRepoKey());
-        if (repoPath != null && !authorizationService.canManage(repoPath)) {
-            response.error("Forbidden").responseCode(HttpStatus.SC_FORBIDDEN);
-            return;
-        }
-
-        try {
-            // calculate index for repo type
-            baseIndexCalculator.calculateIndex();
-            String message = "Recalculating index for repository " + baseIndexCalculator.getRepoKey() + " scheduled to run";
-            log.info(message);
-            response.info(message);
-        } catch (Exception e) {
-            response.error("failed to schedule index calculation");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/ViewArtifactService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/ViewArtifactService.java
deleted file mode 100644
index 5353608..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/ViewArtifactService.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.actions;
-
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.ViewArtifact;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ViewArtifactService implements RestService {
-
-    @Autowired
-    private RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        ViewArtifact viewArtifact = (ViewArtifact) request.getImodel();
-        // get file info
-        ItemInfo itemInfo = getItemInfo(viewArtifact);
-        /// get file content
-        String fileContent = getFileContent((FileInfo) itemInfo);
-        // update response with file content
-        updateResponse(response, fileContent);
-    }
-
-    /**
-     * get item to be reviewed info
-     *
-     * @param viewArtifact - view artifact model
-     * @return - item info instance
-     */
-    private ItemInfo getItemInfo(ViewArtifact viewArtifact) {
-        String repoKey = viewArtifact.getRepoKey();
-        String path = viewArtifact.getPath();
-        RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-        return repositoryService.getItemInfo(repoPath);
-    }
-
-    /**
-     * update file content response
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param fileContent         - file content
-     */
-    private void updateResponse(RestResponse artifactoryResponse, String fileContent) {
-        RestModel artifact = new ViewArtifact();
-        ((ViewArtifact) artifact).setFileContent(fileContent);
-        artifactoryResponse.iModel(artifact);
-    }
-
-    /**
-     * get file content by file type
-     *
-     * @param fileInfo - file item to be reviewed
-     * @return - file content
-     */
-    private String getFileContent(org.artifactory.fs.FileInfo fileInfo) {
-        return repositoryService.getStringContent(fileInfo);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/WatchArtifactService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/WatchArtifactService.java
deleted file mode 100644
index fcbfb12..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/WatchArtifactService.java
+++ /dev/null
@@ -1,123 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.actions;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.addon.AddonType;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.watch.ArtifactWatchAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.WatchArtifact;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class WatchArtifactService implements RestService {
-
-    @Autowired
-    private RepositoryService repositoryService;
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        WatchArtifact watchArtifact = (WatchArtifact) request.getImodel();
-        String repoKey = watchArtifact.getRepoKey();
-        String path = watchArtifact.getPath();
-        String userName = authorizationService.currentUsername();
-        if (authorizationService.isTransientUser()) {
-            response.error("User " + userName + " doesn't have an internal user created in Artifactory and can't " +
-                    "use watches.").responseCode(HttpStatus.SC_FORBIDDEN);
-        } else {
-            AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-            if (addonsManager.isAddonSupported(AddonType.WATCH)) {
-                String param = watchArtifact.getParam();
-                if (param != null) {
-                    boolean isWatch = (param.equals("watch"));
-                    watchOrUnwatchArtifact(repoKey, path, userName, isWatch, response);
-                }
-            }
-        }
-    }
-
-    /**
-     * perform watch or unwatch on artifact
-     *
-     * @param repoKey  - artifact repo key
-     * @param path     - artifact path
-     * @param userName - user name
-     * @param isWatch  - if true - watch , false - unwatch
-     */
-    private void watchOrUnwatchArtifact(String repoKey, String path, String userName, boolean isWatch,
-            RestResponse artifactoryResponse) {
-        ArtifactWatchAddon artifactWatchAddon = ContextHelper.get().beanForType(AddonsManager.class).addonByType(
-                ArtifactWatchAddon.class);
-        RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-        ItemInfo itemInfo = repositoryService.getItemInfo(repoPath);
-        RepoPath pathToWatch = (itemInfo).getRepoPath();
-        try {
-            if (isWatch) {
-                addWatchMessage(userName, artifactoryResponse, artifactWatchAddon, repoPath, pathToWatch);
-            } else {
-                addUnwatchMessage(userName, artifactoryResponse, artifactWatchAddon, repoPath, pathToWatch);
-            }
-        } catch (Exception e) {
-            artifactoryResponse.error("Failed to add watch on '" + pathToWatch.toString() + "' by user '" + userName + "'");
-        }
-    }
-
-    /**
-     * add watch response message
-     *
-     * @param userName            - user watching
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param artifactWatchAddon  - watch addon
-     * @param repoPath            - artifact / repository path
-     * @param pathToWatch         - patch to watch
-     */
-    private void addWatchMessage(String userName, RestResponse artifactoryResponse,
-            ArtifactWatchAddon artifactWatchAddon, RepoPath repoPath, RepoPath pathToWatch) {
-        artifactWatchAddon.addWatcher(pathToWatch, userName);
-        if (repoPath.getPath().length() > 0) {
-            artifactoryResponse.info(
-                    "Successfully added watch on artifact '" + pathToWatch.toString() + "' by user '" + userName + "'");
-        } else {
-            artifactoryResponse.info(
-                    "Successfully added watch on repository '" + pathToWatch.toString() + "' by user '" + userName + "'");
-        }
-    }
-
-    /**
-     * add un-watch response message
-     *
-     * @param userName            - user watching
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param artifactWatchAddon  - watch addon
-     * @param repoPath            - artifact / repository path
-     * @param pathToWatch         - patch to un-watch
-     */
-    private void addUnwatchMessage(String userName, RestResponse artifactoryResponse,
-            ArtifactWatchAddon artifactWatchAddon, RepoPath repoPath, RepoPath pathToWatch) {
-        if (repoPath.getPath().length() > 0) {
-            artifactWatchAddon.removeWatcher(pathToWatch, userName);
-            artifactoryResponse.info(
-                    "Successfully removed watch on artifact '" + pathToWatch.toString() + "' by user '" + userName + "'");
-        } else {
-            artifactWatchAddon.removeWatcher(pathToWatch, userName);
-            artifactoryResponse.info(
-                    "Successfully removed watch on repository '" + pathToWatch.toString() + "' by user '" + userName + "'");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/ZapArtifactService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/ZapArtifactService.java
deleted file mode 100644
index 651a537..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/ZapArtifactService.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.actions;
-
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.ZapArtifact;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ZapArtifactService implements RestService {
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        ZapArtifact zapArtifact = (ZapArtifact) request.getImodel();
-        String repoKey = zapArtifact.getRepoKey();
-        String path = zapArtifact.getPath();
-        RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-        // zap caches
-        ZapArtifact(repoPath);
-        response.info("Completed zapping item: '" + repoPath + "'");
-    }
-
-    /**
-     * zap artifact caches
-     *
-     * @param repoPath - repository path
-     */
-    private void ZapArtifact(RepoPath repoPath) {
-        repositoryService.zap(repoPath);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/ZapCachesVirtualService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/ZapCachesVirtualService.java
deleted file mode 100644
index 24ffaa6..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/ZapCachesVirtualService.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.actions;
-
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.common.StatusHolder;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.ZapArtifact;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ZapCachesVirtualService implements RestService {
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        ZapArtifact zapArtifact = (ZapArtifact) request.getImodel();
-        String repoKey = zapArtifact.getRepoKey();
-        String path = zapArtifact.getPath();
-        RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-        // un-deploy virtual
-        StatusHolder statusHolder = repositoryService.undeploy(repoPath, false);
-        // update response status
-        updateResponseStatus(response, repoKey, statusHolder);
-    }
-
-    /**
-     * update response with zap caches results
-     *
-     * @param response     - encapsulate data related to response
-     * @param repoKey      - repo key
-     * @param statusHolder - zap caches action status holder
-     */
-    private void updateResponseStatus(RestResponse response, String repoKey, StatusHolder statusHolder) {
-        if (!statusHolder.isError()) {
-            response.info("The caches of '" + repoKey + "' have been successfully zapped.");
-        } else {
-            String message = "Could not zap caches for the virtual repository '" + repoKey + "': " +
-                    statusHolder.getStatusMsg() + "";
-            response.error(message);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/bintray/DistributeArtifactService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/bintray/DistributeArtifactService.java
deleted file mode 100644
index 8fbed4d..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/bintray/DistributeArtifactService.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.actions.bintray;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.api.bintray.distribution.Distribution;
-import org.artifactory.api.bintray.distribution.DistributionService;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.aql.util.AqlSearchablePath;
-import org.artifactory.aql.util.AqlUtils;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-import static org.artifactory.ui.rest.service.utils.distribution.DistributionUIResponseUtils.createResponseEntity;
-
-/**
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DistributeArtifactService implements RestService {
-
-    @Autowired
-    DistributionService distributionService;
-
-    @Autowired
-    RepositoryService repoService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        // boolean isDryRun = Boolean.parseBoolean(request.getQueryParamByKey("dryRun")); //TODO [by dan]:  handle dry run
-        boolean async = Boolean.parseBoolean(request.getQueryParamByKey("async"));
-        boolean publish = Boolean.parseBoolean(request.getQueryParamByKey("publish"));
-        boolean overrideExistingFiles = Boolean.parseBoolean(request.getQueryParamByKey("overrideExistingFiles"));
-        String targetRepo = request.getQueryParamByKey("targetRepo");
-        BaseArtifact artifact = (BaseArtifact) request.getImodel();
-        RepoPath artifactRepoPath = RepoPathFactory.create(artifact.getRepoKey() + "/" + artifact.getPath());
-        if (!repoService.exists(artifactRepoPath)) {
-            response.error("No such path " + artifactRepoPath.toPath()).responseCode(HttpStatus.SC_NOT_FOUND);
-            return;
-        }
-        Distribution distribution = new Distribution();
-        if (repoService.getItemInfo(artifactRepoPath).isFolder()) {
-            getPathsForCurrentFolderAndSubFolders(artifactRepoPath).forEach(distribution::addPath);
-        } else {
-            distribution.addPath(artifactRepoPath.toPath());
-        }
-        distribution.setTargetRepo(targetRepo);
-        distribution.setAsync(async);
-        // distribution.setDryRun(isDryRun); //TODO [by dan]:  handle dry run
-        distribution.setPublish(publish);
-        distribution.setOverrideExistingFiles(overrideExistingFiles);
-        BasicStatusHolder status = distributionService.distribute(distribution);
-        response.iModel(createResponseEntity(artifactRepoPath.toPath(), targetRepo, status));
-    }
-
-    private List<String> getPathsForCurrentFolderAndSubFolders(RepoPath artifactRepoPath) {
-        return AqlUtils.getSearchablePathForCurrentFolderAndSubfolders(artifactRepoPath).stream()
-                .map(AqlSearchablePath::toRepoPath)
-                .map(RepoPath::toPath)
-                .collect(Collectors.toList());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/bintray/GetAvailableDistributionReposService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/bintray/GetAvailableDistributionReposService.java
deleted file mode 100644
index 5b83d4c..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/bintray/GetAvailableDistributionReposService.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.actions.bintray;
-
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.stream.Collectors;
-
-/**
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetAvailableDistributionReposService implements RestService {
-
-    @Autowired
-    RepositoryService repoService;
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        response.iModelList(repoService.getDistributionRepoDescriptors().stream()
-                .map(RepoDescriptor::getKey)
-                .map(RepoPathFactory::create)
-                .filter(authorizationService::canDeploy)
-                .collect(Collectors.toList()));
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/deleteversions/DeleteVersionService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/deleteversions/DeleteVersionService.java
deleted file mode 100644
index 8279ada..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/deleteversions/DeleteVersionService.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.actions.deleteversions;
-
-import org.artifactory.api.module.VersionUnit;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.common.StatusHolder;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.DeleteArtifactVersion;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DeleteVersionService implements RestService {
-
-    @Autowired
-    private RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        List<? extends RestModel> deleteArtifactVersionsList = request.getModels();
-        Set<VersionUnit> versionUnitSet = new HashSet<>();
-        createVersionUnitSet(deleteArtifactVersionsList, versionUnitSet);
-        // delete versions
-        deleteVersionsAndUpdateResponse(response, versionUnitSet);
-    }
-
-    /**
-     * delete version and update response
-     *
-     * @param response       - encapsulate data related to response
-     * @param versionUnitSet - version units
-     */
-    private void deleteVersionsAndUpdateResponse(RestResponse response, Set<VersionUnit> versionUnitSet) {
-        StatusHolder statusHolder = repositoryService.undeployVersionUnits(versionUnitSet);
-        if (statusHolder.isError()) {
-            response.error(statusHolder.getLastError().getMessage());
-        } else if (statusHolder.getLastWarning() != null) {
-            response.warn("The operation finished with warnings, check the log for more information.");
-        } else {
-            response.info("Selected versions deleted successfully");
-        }
-    }
-
-    private void createVersionUnitSet(List<? extends RestModel> deleteArtifactVersionsList,
-            Set<VersionUnit> versionUnitSet) {
-        if (deleteArtifactVersionsList != null && !deleteArtifactVersionsList.isEmpty()) {
-            deleteArtifactVersionsList.forEach(deleteArtifactVersion -> {
-                VersionUnit versionUnit = new VersionUnit(null, new HashSet<RepoPath>());
-                ((DeleteArtifactVersion) deleteArtifactVersion).getRepoPaths().forEach(repoKeyPath -> {
-                    String repoKey = repoKeyPath.getRepoKey();
-                    String path = repoKeyPath.getPath();
-                    RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-                    versionUnit.getRepoPaths().add(repoPath);
-                });
-                versionUnitSet.add(versionUnit);
-            });
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/deleteversions/GetVersionUnitsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/deleteversions/GetVersionUnitsService.java
deleted file mode 100644
index 065c8aa..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/actions/deleteversions/GetVersionUnitsService.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.actions.deleteversions;
-
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.search.VersionSearchResults;
-import org.artifactory.api.search.deployable.VersionUnitSearchResult;
-import org.artifactory.mime.MavenNaming;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.DeleteArtifactVersion;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.DeleteArtifactVersions;
-import org.artifactory.ui.rest.model.common.RepoKeyPath;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetVersionUnitsService implements RestService {
-
-    @Autowired
-    private RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String repoKey = request.getQueryParamByKey("repoKey");
-        String path = request.getQueryParamByKey("path");
-        RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-        // update delete version module
-        updateResponseWithModel(repoPath, response);
-    }
-
-    /**
-     * search for unit versions and update delete version model data
-     *
-     * @param repoPath - repo path
-     */
-    private void updateResponseWithModel(RepoPath repoPath, RestResponse response) {
-        VersionSearchResults results = repositoryService.getVersionUnitsUnder(repoPath);
-        Map<String, Integer> moduleCountMap = new HashMap<>();
-        Map<String, DeleteArtifactVersion> moduleArtifactVersionMap = new HashMap<>();
-        // filter version unit with same module id
-        results.getResults().forEach(result ->
-                populateUnitVersionResult(moduleCountMap, moduleArtifactVersionMap, result));
-        // update directories count
-        moduleCountMap.keySet().forEach(module ->
-                moduleArtifactVersionMap.get(module).setDirectoriesCount(moduleCountMap.get(module)));
-        // update response data
-        response.iModel(new DeleteArtifactVersions(moduleArtifactVersionMap.values()));
-        if (results.isSearchHadErrors()) {
-            response.error("The version search encountered errors, check the logs for additional info.");
-        } else if (results.isQueryLimitExceeded()) {
-            response.warn("Search exceeded the limit and some versions are not shown.\n " +
-                    "Try running this action from deeper node.");
-        }
-    }
-
-    /**
-     * populate unit version results to delete version module
-     *
-     * @param moduleCountMap           - hole models counter
-     * @param moduleArtifactVersionMap - hold unnit version info by module
-     * @param result                   - unit version results
-     */
-    private void populateUnitVersionResult(Map<String, Integer> moduleCountMap,
-            Map<String, DeleteArtifactVersion> moduleArtifactVersionMap, VersionUnitSearchResult result) {
-        String groupKeyVersion = toGroupVersionKey(result.getVersionUnit().getModuleInfo());
-        if (moduleCountMap.get(groupKeyVersion) == null) {
-            moduleCountMap.put(groupKeyVersion, 1);
-            moduleArtifactVersionMap.put(groupKeyVersion, new DeleteArtifactVersion(result.getVersionUnit()));
-        } else {
-            Integer moduleCount = moduleCountMap.get(groupKeyVersion);
-            result.getVersionUnit().getRepoPaths().forEach(repoPath ->
-                    moduleArtifactVersionMap.get(groupKeyVersion).getRepoPaths().add(
-                            new RepoKeyPath(repoPath.getPath(), repoPath.getRepoKey())));
-            moduleCountMap.put(groupKeyVersion, moduleCount + 1);
-        }
-    }
-
-    /**
-     * generate group version key by module info
-     *
-     * @param info - module info
-     * @return group version key
-     */
-    private String toGroupVersionKey(ModuleInfo info) {
-        StringBuilder groupVersionKeyBuilder =
-                new StringBuilder(info.getOrganization()).append(":").append(info.getBaseRevision());
-        if (info.isIntegration()) {
-
-            groupVersionKeyBuilder.append("-");
-            if (MavenNaming.SNAPSHOT.equals(info.getFolderIntegrationRevision())) {
-                groupVersionKeyBuilder.append(MavenNaming.SNAPSHOT);
-            } else {
-                groupVersionKeyBuilder.append("INTEGRATION");
-            }
-        }
-        return groupVersionKeyBuilder.toString();
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/blackduck/GetBlackDuckArtifactService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/blackduck/GetBlackDuckArtifactService.java
deleted file mode 100644
index a8c6b6e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/blackduck/GetBlackDuckArtifactService.java
+++ /dev/null
@@ -1,229 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.blackduck;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.blackduck.BlackDuckAddon;
-import org.artifactory.addon.blackduck.BlackduckInfo;
-import org.artifactory.addon.blackduck.ExternalComponentInfo;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.admin.configuration.blackduck.BlackDuck;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.blackduck.BlackDuckArtifactInfo;
-import org.artifactory.ui.rest.service.admin.configuration.blackduck.GetBlackDuckService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.xml.ws.WebServiceException;
-import javax.xml.ws.soap.SOAPFaultException;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetBlackDuckArtifactService implements RestService {
-    public static final String N_A = "Not Found";
-    private static final Logger log = LoggerFactory.getLogger(GetBlackDuckArtifactService.class);
-
-    @Autowired
-    GetBlackDuckService getBlackDuckService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        BlackDuckArtifactInfo duckArtifactInfo = (BlackDuckArtifactInfo) request.getImodel();
-        String path = duckArtifactInfo.getPath();
-        String repoKey = duckArtifactInfo.getRepoKey();
-        RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-        BlackDuck blackDuck = getBlackDuckConfig(request, response);
-        boolean isBlackduckEnable = blackDuck.isEnableIntegration();
-        // if black duck enable get ext component info
-        fetchArtifactBlackDuckInfo(response, repoPath, blackDuck, isBlackduckEnable);
-    }
-
-    /**
-     * @param restRequest  - encapsulate data related to request
-     * @param restResponse - encapsulate data reqquire for response
-     * @return - black duck config model
-     */
-    private BlackDuck getBlackDuckConfig(ArtifactoryRestRequest restRequest, RestResponse<? extends RestModel> restResponse) {
-        // get black duck config and check if enable
-        getBlackDuckService.execute(restRequest, restResponse);
-        RestModel restModel = restResponse.getIModel();
-        BlackDuck blackDuck;
-        if (restModel instanceof BlackDuck) {
-            blackDuck = (BlackDuck) restModel;
-        } else {
-            blackDuck = new BlackDuck();
-            blackDuck.setEnableIntegration(false);
-        }
-        return blackDuck;
-    }
-
-    /**
-     * fetch artifact info from black duck
-     *
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param repoPath            - repo path
-     * @param blackDuck           - black duck data model
-     * @param isBlackduckEnable   - if true - black duck enable
-     */
-    private void fetchArtifactBlackDuckInfo(RestResponse artifactoryResponse, RepoPath repoPath, BlackDuck blackDuck, boolean isBlackduckEnable) {
-        if (isBlackduckEnable) {
-            // get black duck addon
-            BlackDuckAddon blackDuckAddon = ContextHelper.get().beanForType(AddonsManager.class).addonByType(
-                    BlackDuckAddon.class);
-            if (blackDuck != null) {
-                // build black duck artifact info
-                BlackDuckArtifactInfo blackDuckArtifactInfo = buildComponentInfo(isBlackduckEnable, artifactoryResponse,
-                        repoPath, blackDuckAddon);
-                // update response with model
-                artifactoryResponse.iModel(blackDuckArtifactInfo);
-            }
-        } else {
-            artifactoryResponse.iModel(null);
-                artifactoryResponse.warn("Governance integration is not enabled. Check the configuration on the Admin tab to enable.");
-            }
-    }
-
-    /**
-     * @param online -  if true black suck online
-     * @param response - encapsulate data related to response
-     * @param repoPath - repo path
-     * @return - black duck model
-     */
-    private BlackDuckArtifactInfo buildComponentInfo(boolean online, RestResponse response, RepoPath repoPath,
-            BlackDuckAddon blackDuckAddon) {
-        ExternalComponentInfo info = null;
-        BlackDuckArtifactInfo blackDuckArtifactInfo = null;
-        //prepare info
-        if (online) {
-            try {
-                info = getComponentInfoAndWarnIfNeeded(response, repoPath, blackDuckAddon);
-                blackDuckArtifactInfo = new BlackDuckArtifactInfo();
-                // update black duck artifact info model
-                updateBlackDuckInfoModel(info, blackDuckArtifactInfo);
-            } catch (Exception e) {
-                if (e instanceof WebServiceException) {
-                    if (e instanceof SOAPFaultException) {
-                        response.error(
-                                "Could not connect to Black Duck Code Center. Check the configuration on the Admin tab.");
-                        return new BlackDuckArtifactInfo();
-                    } else {
-                        handleConnectionError(e, response);
-                    }
-                } else {
-                    handleBDSdkError(e, response);
-                }
-            }
-        } else {
-            blackDuckArtifactInfo = new BlackDuckArtifactInfo();
-        }
-        //component not found
-        if (info == null) {
-            blackDuckArtifactInfo = handleComponentNotFound(response, repoPath, blackDuckAddon);
-        }
-        return blackDuckArtifactInfo;
-    }
-
-    /**
-     * update black suck model
-     *
-     * @param info                  - info from black duck
-     * @param blackDuckArtifactInfo - black duck model
-     */
-    private void updateBlackDuckInfoModel(ExternalComponentInfo info, BlackDuckArtifactInfo blackDuckArtifactInfo) {
-        if (info.getInfo() != null) {
-            blackDuckArtifactInfo.setInfo(info.getInfo());
-        }
-        if (info.getVulnerabilities() != null && !info.getVulnerabilities().isEmpty()) {
-            blackDuckArtifactInfo.setVulnerabilities(info.getVulnerabilities());
-        }
-        if (info.getLicense() != null && !info.getLicense().isEmpty()) {
-            blackDuckArtifactInfo.setLicense(info.getLicense());
-        }
-    }
-
-    /**
-     * handle BDSdk error response
-     * @param e - exception
-     * @param response - encapsulate data related to response
-     */
-    private void handleBDSdkError(Exception e, RestResponse response) {
-        String msg = "Error getting component info";
-        log.debug(msg, e);
-        response.error(msg + ": " + e.getMessage());
-    }
-
-    /**
-     * handle connection error response
-     * @param e - exception
-     * @param response - encapsulate data related to response
-     */
-    private void handleConnectionError(Exception e, RestResponse response) {
-        String msg = "Could not connect to Black Duck Code Center. Check the configuration on the Admin tab.";
-        log.debug(msg, e);
-        response.error(msg);
-    }
-
-    /**
-     * @param response - encapsulate data related to response
-     * @param repoPath - repo path
-     * @return
-     */
-    private ExternalComponentInfo getComponentInfoAndWarnIfNeeded(RestResponse response, RepoPath repoPath,
-            BlackDuckAddon blackDuckAddon) {
-        ExternalComponentInfo info;
-        info = blackDuckAddon.getBlackduckInfo(repoPath);
-        String componentExternalIdFromProperty = blackDuckAddon.getComponentExternalIdFromProperty(repoPath);
-        if (componentExternalIdFromProperty != null && componentExternalIdFromProperty.length() > 0) {
-            info.getInfo().setExtComponentId(componentExternalIdFromProperty);
-        } else {
-            info.getInfo().setExtComponentId("");
-        }
-        if (info != null) {
-            if (!info.getInfo().isCatalogComponent()) {
-                response.warn(
-                        "Could not find artifact in Catalog. Information displayed from Knowledge base component.");
-            } else if (blackDuckAddon.getComponentExternalIdFromProperty(repoPath) != null) {
-                response.warn("Component ID overridden by manual edit to " + info.getInfo().getComponentId());
-            }
-        }
-        return info;
-    }
-
-    /**
-     * if component was not found return relevant response
-     *
-     * @param response - encapsulate data require for response
-     * @param repoPath - repo path
-     * @return
-     */
-    private BlackDuckArtifactInfo handleComponentNotFound(RestResponse response, RepoPath repoPath,
-            BlackDuckAddon blackDuckAddon) {
-        BlackDuckArtifactInfo info = new BlackDuckArtifactInfo();
-        info.setName(N_A);
-        String componentId = blackDuckAddon.getComponentIdFromProperty(repoPath);
-        if (componentId != null) {
-            if (info.getInfo() == null) {
-                info.setInfo(new BlackduckInfo());
-            }
-            info.getInfo().setName(componentId);
-            info.getInfo().setDescription("A component with the ID " + componentId + " was not found.");
-            response.warn("No Component was found with ID " + componentId + ".");
-        } else {
-            info.setInfo(new BlackduckInfo());
-            info.getInfo().setComponentId(N_A); //case: on error
-            info.getInfo().setDescription("No component found for " + repoPath.getName());
-            response.error("No component found for " + repoPath.getName() + ".");
-        }
-        return info;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/blackduck/UpdateBlackDuckComponentIdService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/blackduck/UpdateBlackDuckComponentIdService.java
deleted file mode 100644
index ad7ae10..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/blackduck/UpdateBlackDuckComponentIdService.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.blackduck;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.blackduck.BlackDuckAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.blackduck.BlackDuckArtifactInfo;
-import org.artifactory.ui.rest.service.admin.configuration.blackduck.GetBlackDuckService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import static org.codehaus.plexus.util.StringUtils.isBlank;
-import static org.codehaus.plexus.util.StringUtils.isNotBlank;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateBlackDuckComponentIdService implements RestService {
-
-    @Autowired
-    GetBlackDuckService getBlackDuckService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        BlackDuckArtifactInfo duckArtifactInfo = (BlackDuckArtifactInfo) request.getImodel();
-        // update black duck component id
-        updateBlackDuckComponentId(response, duckArtifactInfo);
-    }
-
-    /**
-     * update Black Suck componentId
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param duckArtifactInfo    - black duck artifact info model
-     */
-    private void updateBlackDuckComponentId(RestResponse artifactoryResponse, BlackDuckArtifactInfo duckArtifactInfo) {
-        String path = duckArtifactInfo.getPath();
-        String repoKey = duckArtifactInfo.getRepoKey();
-        RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        BlackDuckAddon blackDuckAddon = addonsManager.addonByType(BlackDuckAddon.class);
-        String editedId = duckArtifactInfo.getComponentId();
-        String idFromInfo = duckArtifactInfo.getOrigComponentId();
-        // update component id
-        if (isNotBlank(editedId) && (isBlank(idFromInfo) || !editedId.trim().equals(idFromInfo))) {
-            blackDuckAddon.setComponentExternalIdProperty(repoPath, editedId.trim());
-            artifactoryResponse.info("External Component ID changed successfully to " + editedId.trim());
-        } else if (editedId != null && isNotBlank(idFromInfo)) {
-            blackDuckAddon.clearComponentIdProperty(repoPath);
-            artifactoryResponse.info("External Component ID was successfully cleared");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/bower/BowerViewService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/bower/BowerViewService.java
deleted file mode 100644
index b58fda6..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/bower/BowerViewService.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.bower;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.bower.BowerAddon;
-import org.artifactory.addon.bower.BowerMetadataInfo;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.bower.BowerArtifactInfo;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class BowerViewService implements RestService {
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        BowerArtifactInfo bowerArtifactInfo = (BowerArtifactInfo) request.getImodel();
-        String path = bowerArtifactInfo.getPath();
-        String repoKey = bowerArtifactInfo.getRepoKey();
-        // get bower meta data model
-        BowerArtifactInfo bowerArtifactMetadata = getBowerArtifactInfoModel(path, repoKey);
-        // update response with model
-        response.iModel(bowerArtifactMetadata);
-    }
-
-    /**
-     * get bower artifact info metadata model
-     *
-     * @param path    - ppath
-     * @param repoKey - repo key
-     * @return bower meta data artifact info
-     */
-    private BowerArtifactInfo getBowerArtifactInfoModel(String path, String repoKey) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        BowerAddon bowerAddon = addonsManager.addonByType(BowerAddon.class);
-        RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-        FileInfo fileInfo = repositoryService.getFileInfo(repoPath);
-        BowerMetadataInfo bowerMetadata = bowerAddon.getBowerMetadata(fileInfo.getRepoPath());
-        if (bowerMetadata != null) {
-            return new BowerArtifactInfo(bowerMetadata);
-        }
-        return null;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/builds/GetArtifactBuildJsonService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/builds/GetArtifactBuildJsonService.java
deleted file mode 100644
index 5fab187..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/builds/GetArtifactBuildJsonService.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.builds;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.build.ArtifactBuildAddon;
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.build.BuildRun;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.builds.BuildJsonInfo;
-import org.artifactory.ui.utils.DateUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.text.ParseException;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetArtifactBuildJsonService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(GetArtifactBuildJsonService.class);
-
-    @Autowired
-    private BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-          try {
-              String startTime  = DateUtils.formatBuildDate(Long.parseLong(request.getQueryParamByKey("startTime")));
-              String buildName = request.getQueryParamByKey("buildName");
-              String buildNumber = request.getQueryParamByKey("buildNumber");
-             AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-             ArtifactBuildAddon artifactBuildAddon = addonsManager.addonByType(ArtifactBuildAddon.class);
-            BuildRun artifactBuildByBuildNumber = artifactBuildAddon.getBuildRun(buildName, buildNumber, startTime);
-            if (artifactBuildByBuildNumber != null) {
-                String json = buildService.getBuildAsJson(artifactBuildByBuildNumber);
-                BuildJsonInfo buildJsonInfo = new BuildJsonInfo(json);
-                response.iModel(buildJsonInfo);
-            }
-          } catch (ParseException e) {
-              log.error(e.toString());
-          }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/builds/GetArtifactBuildsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/builds/GetArtifactBuildsService.java
deleted file mode 100644
index a61f9c9..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/builds/GetArtifactBuildsService.java
+++ /dev/null
@@ -1,258 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.builds;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.search.SearchService;
-import org.artifactory.build.BuildRun;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.builds.BuildsArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.builds.ProduceBy;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.builds.UsedBy;
-import org.artifactory.util.CollectionUtils;
-import org.jfrog.build.api.Artifact;
-import org.jfrog.build.api.Build;
-import org.jfrog.build.api.Dependency;
-import org.jfrog.build.api.Module;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetArtifactBuildsService implements RestService {
-    @Autowired
-    RepositoryService repositoryService;
-    @Autowired
-    protected SearchService searchService;
-    @Autowired
-    protected BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String path = request.getQueryParamByKey("path");
-        String repoKey = request.getQueryParamByKey("repoKey");
-        RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-        // get checksum info
-        FileInfo buildFileInfo = getFileInfo(repoPath);
-        String sha1 = buildFileInfo.getSha1();
-        String md5 = buildFileInfo.getMd5();
-        // fetch produce by data
-        List<ProduceBy> produceByList = fetchProduceByData(sha1, md5);
-        // fetch used by data
-        List<UsedBy> usedByList = fetchUsedByData(sha1, md5);
-        // update response data
-        updateResponseData(response, produceByList, usedByList);
-    }
-    /**
-     * update response with artifact build info
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param produceByList       - produce by data list
-     * @param usedByList          - used by data list
-     */
-    private void updateResponseData(RestResponse artifactoryResponse, List<ProduceBy> produceByList,
-            List<UsedBy> usedByList) {
-        BuildsArtifactInfo buildsArtifactInfo = new BuildsArtifactInfo(produceByList, usedByList);
-        artifactoryResponse.iModel(buildsArtifactInfo);
-    }
-
-    /**
-     * get File info by repo pat
-     *
-     * @param repoPath - repo path
-     * @return file info instance
-     */
-    private FileInfo getFileInfo(RepoPath repoPath) {
-        ItemInfo fileInfo = repositoryService.getItemInfo(repoPath);
-        return (FileInfo) fileInfo;
-    }
-
-    /**
-     * fetch used by data
-     *
-     * @param sha1- sha1 checksum
-     * @param md5   - md5 checksum
-     * @return used by list
-     */
-    private List<UsedBy> fetchUsedByData(String sha1, String md5) {
-        List<UsedBy> usedByList = new ArrayList<>();
-        List<BuildRun> dependencyBuilds = getDependencyBuilds(sha1, md5);
-        dependencyBuilds.forEach(dependencyBuild -> addBuildUsedBy(dependencyBuild, sha1, md5, usedByList));
-        return usedByList;
-    }
-
-    /**
-     * fetch produce by data
-     *
-     * @param sha1- sha1 checksum
-     * @param md5   - md5 checksum
-     * @return produce by list
-     */
-    private List<ProduceBy> fetchProduceByData(String sha1, String md5) {
-        List<ProduceBy> produceByList = new ArrayList<>();
-        List<BuildRun> artifactBuilds = getArtifactBuilds(sha1, md5);
-        artifactBuilds.forEach(artifactBuild -> getArtifactProduceBy(artifactBuild, sha1, md5, produceByList));
-        return produceByList;
-    }
-
-    private List<BuildRun> getArtifactBuilds(String sha1, String md5) {
-        return Lists.newArrayList(searchService.findBuildsByArtifactChecksum(sha1, md5));
-    }
-
-    private List<BuildRun> getDependencyBuilds(String sha1, String md5) {
-        return Lists.newArrayList(searchService.findBuildsByDependencyChecksum(sha1, md5));
-    }
-
-    /**
-     * get Artifact build  Produce by data list
-     *
-     * @param run            - run build details
-     * @param sha1           - sha1 checksum
-     * @param md5            - md5 checksum
-     * @param producedByList - produce by list
-     * @return - list of produce by instances
-     */
-    protected List<ProduceBy> getArtifactProduceBy(BuildRun run, String sha1, String md5,
-            List<ProduceBy> producedByList) {
-        Build build = buildService.getBuild(run);
-        List<Module> modules = build.getModules();
-        if (modules != null) {
-            modules.forEach(module ->
-                    addBuildProduceBy(run, sha1, md5, producedByList, module));
-        }
-        return producedByList;
-    }
-
-    /**
-     * add build produce by data
-     *
-     * @param run            - build data
-     * @param sha1           - sha1 checksum
-     * @param md5            - md5 checksum
-     * @param producedByList - list of produce by instance
-     * @param module         - build module instance
-     */
-    private void addBuildProduceBy(BuildRun run, String sha1, String md5,
-            List<ProduceBy> producedByList, Module module) {
-        final String moduleId = module.getId();
-        List<Artifact> artifacts = module.getArtifacts();
-        if (artifacts != null) {
-            boolean isMatchFound = locateNonStrictModuleArtifact(module, sha1, md5);
-            if (isMatchFound) {
-                        producedByList.add(new ProduceBy(run, moduleId));
-                    }
-        }
-            }
-
-    /**
-     * Locates the given modules produced artifact
-     *
-     * @param module     Module to extract artifact from
-     * @return Repo path of produced artifact if found. Null if not
-     */
-    private Boolean locateNonStrictModuleArtifact(Module module, String sha1, String md5) {
-        List<Artifact> artifacts = module.getArtifacts();
-        if (artifacts != null) {
-            for (Artifact artifact : artifacts) {
-                String artifactSha1 = artifact.getSha1();
-                String artifactMd5 = artifact.getMd5();
-                if (isArtifactMatch(sha1, md5, artifactSha1, artifactMd5)) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    /**
-     * is sha1 or md5 match between current artifact and produce by module artifact
-     *
-     * @param sha1         - current artifact sh1
-     * @param md5          - current artifact md5
-     * @param artifactSha1 - produce by sha1
-     * @param artifactMd5  - produce by md5
-     * @return - true if match found
-     */
-    private boolean isArtifactMatch(String sha1, String md5, String artifactSha1, String artifactMd5) {
-        return (StringUtils.isNotBlank(artifactSha1) && artifactSha1.equals(sha1)) ||
-                (StringUtils.isNotBlank(artifactMd5) && (artifactMd5.equals(md5)));
-    }
-
-    /**
-     * get Artifact build used by data List
-     *
-     * @param run        - run build details
-     * @param sha1       - sha1 checksum
-     * @param md5        - md5 checksum
-     * @param usedByList - produce by list
-     * @return - list of produce by instances
-     */
-    protected List<UsedBy> addBuildUsedBy(BuildRun run, String sha1, String md5, List<UsedBy> usedByList) {
-        Build build = buildService.getBuild(run);
-        List<Module> modules = build.getModules();
-        if (modules != null) {
-            modules.forEach(module ->
-                    addBuildUsedBy(run, sha1, md5, usedByList, module));
-        }
-        return usedByList;
-    }
-
-    /**
-     * add build used by data
-     *
-     * @param run        - build data
-     * @param sha1       - sha1 checksum
-     * @param md5        - md5 checksum
-     * @param usedByList - list of produce by instance
-     * @param module     - build module instance
-     */
-    private void addBuildUsedBy(BuildRun run, String sha1, String md5, List<UsedBy> usedByList, Module module) {
-        List<Dependency> dependencies = module.getDependencies();
-        if (dependencies != null) {
-            createUsedByModule(module, sha1, md5, usedByList, run);
-        }
-    }
-
-    /**
-     * Locates the given modules produced dependency
-     *
-     * @param module     Module to extract dependency from
-     * @return Repo path of produced dependency if found. Null if not
-     */
-    private Set<RepoPath> createUsedByModule(Module module, String sha1, String md5, List<UsedBy> usedByList,
-            BuildRun run) {
-        Set<RepoPath> artifactRepoPaths = Sets.newHashSet();
-        module.getDependencies().forEach(dependency -> {
-            if ((StringUtils.isNotBlank(dependency.getSha1()) && dependency.getSha1().equals(sha1) ||
-                    (StringUtils.isNotBlank(dependency.getMd5()) && dependency.getMd5().equals(
-                            md5)))) {
-                final Set<String> scopes = dependency.getScopes();
-                if (CollectionUtils.isNullOrEmpty(scopes)) {
-                    usedByList.add(new UsedBy(run, module.getId(), ""));
-                } else {
-                    for (String scope : scopes) {
-                        usedByList.add(new UsedBy(run, module.getId(), scope));
-                    }
-                }
-            }
-        });
-        return artifactRepoPaths;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/checksums/FixChecksumsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/checksums/FixChecksumsService.java
deleted file mode 100644
index af15a21..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/checksums/FixChecksumsService.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.checksums;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.GeneralArtifactInfo;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class FixChecksumsService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(FixChecksumsService.class);
-
-    @Autowired
-    private RepositoryService repoService;
-
-    @Autowired
-    AuthorizationService authService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        GeneralArtifactInfo artifactInfo = (GeneralArtifactInfo) request.getImodel();
-        RepoPath path = RepoPathFactory.create(artifactInfo.getRepoKey(), artifactInfo.getPath());
-        if (!authService.canDeploy(path) || authService.isAnonymous()) {
-            log.debug("User {} attempting to fix checksums on path {} has insufficient rights",
-                    authService.currentUsername(), path);
-            response.error("Insufficient rights for operation").responseCode(HttpStatus.SC_UNAUTHORIZED);
-        } else {
-            try {
-                log.debug("Fixing checksums for {}", path);
-                repoService.fixChecksums(path);
-                response.info("Successfully fixed checksum inconsistency");
-            } catch (Exception e) {
-                response.error("Could not fix checksum inconsistency");
-            }
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/docker/DockerAncestryViewService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/docker/DockerAncestryViewService.java
deleted file mode 100644
index d03b039..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/docker/DockerAncestryViewService.java
+++ /dev/null
@@ -1,159 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.docker;
-
-import org.artifactory.api.jackson.JacksonReader;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.SearchService;
-import org.artifactory.api.search.property.PropertySearchControls;
-import org.artifactory.api.search.property.PropertySearchResult;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.resource.ResourceStreamHandle;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.docker.ancestry.DockerAncestryArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.docker.ancestry.DockerLinkedImage;
-import org.codehaus.jackson.type.TypeReference;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DockerAncestryViewService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(DockerAncestryViewService.class);
-    public static final String IMAGE_ID_PROP = "docker.imageId";
-    public static final String SIZE_PROP = "docker.size";
-
-    @Autowired
-    SearchService searchService;
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        DockerAncestryArtifactInfo dockerArtifactInfo = (DockerAncestryArtifactInfo) request.getImodel();
-        String path = dockerArtifactInfo.getPath();
-        String repoKey = dockerArtifactInfo.getRepoKey();
-        RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-        FileInfo fileInfo = repositoryService.getFileInfo(repoPath);
-        String basePath = path.split("/")[0];
-        List<String> images = getImages(fileInfo);
-        DockerLinkedImage dockerLinkedImage = getDockerLinkedImage(fileInfo, images, basePath);
-        dockerArtifactInfo.clearRepoData();
-        dockerArtifactInfo.setDockerLinkedImage(dockerLinkedImage);
-        response.iModel(dockerArtifactInfo);
-    }
-
-    /**
-     * get docker linked image
-     *
-     * @param fileInfo - docker file info
-     * @param images   - images list
-     */
-    private DockerLinkedImage getDockerLinkedImage(FileInfo fileInfo, List<String> images, String basePath) {
-        int size = images.size();
-        long virtualSize = 0;
-        String image;
-        String fileRepoKey;
-        ;
-        DockerLinkedImage root = null;
-        // create root element
-        if (size >= 1) {
-            image = images.get(size - 1);
-            fileRepoKey = fileInfo.getRepoKey();
-            virtualSize += getVirtualSize(fileRepoKey, image);
-            root = new DockerLinkedImage(image.substring(0, 12), humanReadableByteCount(virtualSize, true),
-                    basePath + "/" + image.substring(0, 2) + "/" + image);
-        }
-        DockerLinkedImage dockerLinkedImage = root;
-        // build docker linked image
-        if (size >= 2) {
-            for (int i = size - 2; i >= 0; i--) {
-                image = images.get(i);
-                fileRepoKey = fileInfo.getRepoKey();
-                virtualSize += getVirtualSize(fileRepoKey, image);
-                DockerLinkedImage newParent = new DockerLinkedImage(image.substring(0, 12),
-                        humanReadableByteCount(virtualSize, true),
-                        basePath + "/" + image.substring(0, 2) + "/" + image);
-                dockerLinkedImage.addChild(newParent);
-                dockerLinkedImage = newParent;
-            }
-        }
-        return root;
-    }
-
-    /**
-     * get docker images data
-     *
-     * @param fileInfo - docker file info
-     * @return list of images id
-     */
-    private List<String> getImages(FileInfo fileInfo) {
-        try {
-            ResourceStreamHandle handle = repositoryService.getResourceStreamHandle(fileInfo.getRepoPath());
-            return JacksonReader.streamAsValueTypeReference(handle.getInputStream(),
-                    new TypeReference<List<String>>() {
-                    });
-        } catch (IOException e) {
-            log.debug(e.toString());
-        }
-        return null;
-    }
-
-
-    private long getVirtualSize(String repoKey, String imageId) {
-        RepoPath parent = findImageRepoPath(repoKey, imageId);
-        if (parent != null) {
-            Properties properties = repositoryService.getProperties(parent);
-            return Long.parseLong(properties != null ? properties.getFirst(SIZE_PROP) : null);
-        }
-        return 0;
-    }
-
-    private RepoPath findImageRepoPath(String repoKey, String imageId) {
-        PropertySearchControls searchControls = new PropertySearchControls();
-        searchControls.setLimitSearchResults(false);
-        searchControls.addRepoToSearch(repoKey);
-        searchControls.put(IMAGE_ID_PROP, imageId, false);
-        ItemSearchResults<PropertySearchResult> itemSearchResults = searchService.searchProperty(searchControls);
-        List<PropertySearchResult> resultList = itemSearchResults.getResults();
-
-        //Return only the first result as there shouldn't really be any duplicates
-        if ((resultList != null) && resultList.size() > 0) {
-            PropertySearchResult propertySearchResult = resultList.get(0);
-            return propertySearchResult.getItemInfo().getRepoPath();
-        }
-        return null;
-    }
-
-    /**
-     * convert file size to human readable format
-     *
-     * @param bytes - bytes as long
-     * @param si    - if true divide by 1000
-     * @return byte as string in human readable format
-     */
-    public String humanReadableByteCount(long bytes, boolean si) {
-        int unit = si ? 1000 : 1024;
-        if (bytes < unit) {
-            return bytes + " bit";
-        }
-        int exp = (int) (Math.log(bytes) / Math.log(unit));
-        String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i");
-        return String.format("%.1f %sbit", bytes / Math.pow(unit, exp), pre);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/docker/DockerV2ViewService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/docker/DockerV2ViewService.java
deleted file mode 100644
index bb6b7b8..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/docker/DockerV2ViewService.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.docker;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.docker.DockerAddon;
-import org.artifactory.addon.docker.DockerV2InfoModel;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.BaseArtifactInfo;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Shay Yaakov
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DockerV2ViewService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(DockerV2ViewService.class);
-
-    @Autowired
-    RepositoryService repoService;
-
-    @Autowired
-    CentralConfigService configService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        BaseArtifactInfo artifactInfo = (BaseArtifactInfo) request.getImodel();
-        String path = artifactInfo.getPath();
-        String repoKey = artifactInfo.getRepoKey();
-        RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-        ItemInfo manifest = repoService.getChildren(repoPath)
-                .stream().filter(itemInfo -> itemInfo.getName().equals("manifest.json"))
-                .findFirst().orElseGet(null);
-        if (manifest != null) {
-            try{
-                DockerV2InfoModel dockerV2Info = ContextHelper.get().beanForType(AddonsManager.class)
-                        .addonByType(DockerAddon.class).getDockerV2Model(manifest.getRepoPath());
-                response.iModel(dockerV2Info);
-            } catch (Exception e) {
-                String err = "Unable to extract Docker metadata for '" + repoPath;
-                response.error(err);
-                log.error(err);
-                log.debug(err, e);
-            }
-        } else {
-            response.error("Unable to find Docker manifest under '" + repoPath);
-            log.error("Unable to find Docker manifest under '" + repoPath + "'");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/docker/DockerViewService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/docker/DockerViewService.java
deleted file mode 100644
index 0636b1b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/docker/DockerViewService.java
+++ /dev/null
@@ -1,155 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.docker;
-
-import org.apache.commons.io.IOUtils;
-import org.artifactory.api.jackson.JacksonReader;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.resource.ResourceStreamHandle;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.docker.DockerArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.docker.DockerConfig;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.docker.DockerInfoModel;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.docker.DockerMetadata;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DockerViewService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(DockerViewService.class);
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        DockerArtifactInfo dockerArtifactInfo = (DockerArtifactInfo) request.getImodel();
-        String path = dockerArtifactInfo.getPath();
-        String repoKey = dockerArtifactInfo.getRepoKey();
-        RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-        FileInfo fileInfo = repositoryService.getFileInfo(repoPath);
-        DockerMetadata metadata = extractMetadata(fileInfo, response);
-        dockerArtifactInfo.clearRepoData();
-        String basePath = path.split("/")[0];
-        // get docker info
-        DockerInfoModel dockerInfo = getDockerInfo(metadata, basePath);
-        dockerArtifactInfo.setDockerInfo(dockerInfo);
-        // get docker config
-        DockerConfig dockerConfig = getDockerConfig(metadata);
-        dockerArtifactInfo.setDockerConfig(dockerConfig);
-        response.iModel(dockerArtifactInfo);
-    }
-
-    /**
-     * populate data from docker metadata file to docker metadata model
-     *
-     * @param metadata - docker meta
-     * @return docker meta data model
-     */
-    private DockerConfig getDockerConfig(DockerMetadata metadata) {
-        DockerConfig dockerConfig = null;
-        if (metadata.config != null) {
-            dockerConfig = new DockerConfig();
-            dockerConfig.setHostname(metadata.config.hostname);
-            dockerConfig.setDomainName(metadata.config.domainname);
-            dockerConfig.setUser(metadata.config.user);
-            dockerConfig.setMemory(getJsonValue(String.valueOf(metadata.config.memory)));
-            dockerConfig.setMemorySwap(getJsonValue(String.valueOf(metadata.config.memorySwap)));
-            dockerConfig.setCpuShares(getJsonValue(String.valueOf(metadata.config.cpuShares)));
-            dockerConfig.setCpuSet(metadata.config.cpuSet);
-            dockerConfig.setAttachStdin(getJsonValue(String.valueOf(metadata.config.attachStdin)));
-            dockerConfig.setAttachStdout(metadata.config.attachStdout);
-            dockerConfig.setAttachStderr(getJsonValue(String.valueOf(metadata.config.attachStderr)));
-            dockerConfig.setPortSpecs(getJsonValue(String.valueOf(metadata.config.portSpecs)));
-            dockerConfig.setExposedPorts(getJsonValue(String.valueOf(metadata.config.exposedPorts)));
-            dockerConfig.setTty(getJsonValue(String.valueOf(metadata.config.tty)));
-            dockerConfig.setOpenStdin(getJsonValue(String.valueOf(metadata.config.openStdin)));
-            dockerConfig.setStdinOnce(getJsonValue(String.valueOf(metadata.config.stdinOnce)));
-            dockerConfig.setEnv(getJsonValue(String.valueOf(metadata.config.env)));
-            dockerConfig.setCmd(getJsonValue(String.valueOf(metadata.config.cmd)));
-            dockerConfig.setImage(metadata.config.image);
-            dockerConfig.setVolumes(getJsonValue(String.valueOf(metadata.config.volumes)));
-            dockerConfig.setWorkingDir(metadata.config.workingDir);
-            dockerConfig.setEntryPoint(metadata.config.entrypoint);
-            dockerConfig.setNetworkDisabled(getJsonValue(String.valueOf(metadata.config.networkDisabled)));
-            dockerConfig.setOnBuild(getJsonValue(String.valueOf(metadata.config.onBuild)));
-        }
-        return dockerConfig;
-    }
-
-    private String getJsonValue(String value) {
-        if (value == null || value.length() == 0 || value.equals("null")) {
-            return null;
-        }
-        return value;
-    }
-
-    /**
-     * get docker metadata info from doccker file
-     *
-     * @param metadata - docker metadata
-     * @return docker info
-     */
-    private DockerInfoModel getDockerInfo(DockerMetadata metadata, String basePath) {
-        DockerInfoModel dockerInfo = new DockerInfoModel();
-        dockerInfo.setImageId(metadata.id);
-        dockerInfo.setImageIdPath(basePath + "/" + metadata.id.substring(0, 2) + "/" + metadata.id);
-        dockerInfo.setParent(metadata.parent);
-        if (metadata.parent != null && metadata.parent.length() > 0) {
-            dockerInfo.setParentIdPath(basePath + "/" + metadata.parent.substring(0, 2) + "/" + metadata.parent);
-        }
-        dockerInfo.setCreated(metadata.created);
-        dockerInfo.setSize(metadata.size + " bits (" + humanReadableByteCount(metadata.size, true) + ")");
-        dockerInfo.setContainer(metadata.container);
-        dockerInfo.setDockerVersion(metadata.dockerVersion);
-        dockerInfo.setArchitecture(metadata.architecture);
-        dockerInfo.setOs(metadata.os);
-        dockerInfo.setAuthor(metadata.author);
-        return dockerInfo;
-    }
-
-
-    /**
-     * extract docker metadata from docker file
-     *
-     * @param fileInfo            - docker file info
-     * @param artifactoryResponse - encapsulate data require to response
-     * @return - docker metadata Model
-     */
-    private DockerMetadata extractMetadata(FileInfo fileInfo, RestResponse artifactoryResponse) {
-        ResourceStreamHandle handle = null;
-        try {
-            handle = repositoryService.getResourceStreamHandle(fileInfo.getRepoPath());
-            return JacksonReader.streamAsClass(handle.getInputStream(), DockerMetadata.class);
-        } catch (IOException e) {
-            artifactoryResponse.error("Unable to extract Docker metadata for '" + fileInfo);
-            log.error("Unable to extract Docker metadata for '" + fileInfo + "'", e);
-        } finally {
-            IOUtils.closeQuietly(handle);
-        }
-        return null;
-    }
-
-    public String humanReadableByteCount(long bytes, boolean si) {
-        int unit = si ? 1000 : 1024;
-        if (bytes < unit) {
-            return bytes + " bit";
-        }
-        int exp = (int) (Math.log(bytes) / Math.log(unit));
-        String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i");
-        return String.format("%.1f %sbit", bytes / Math.pow(unit, exp), pre);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/gemsview/GemsViewService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/gemsview/GemsViewService.java
deleted file mode 100644
index e1e857a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/gemsview/GemsViewService.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.gemsview;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.gems.ArtifactGemsInfo;
-import org.artifactory.addon.gems.GemsAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.gems.GemsArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.gems.GemsDependency;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.gems.GemsInfo;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GemsViewService implements RestService {
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        GemsArtifactInfo gemsArtifactInfo = (GemsArtifactInfo) request.getImodel();
-        // fetch gems info
-        fetchGemsInfo(gemsArtifactInfo);
-        //update artifactory response with model data
-        response.iModel(gemsArtifactInfo);
-    }
-
-    /**
-     * fetch gems info meta data
-     *
-     * @param gemsArtifactInfo
-     */
-    private void fetchGemsInfo(GemsArtifactInfo gemsArtifactInfo) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        GemsAddon gemsAddon = addonsManager.addonByType(GemsAddon.class);
-        if (gemsAddon != null) {
-            String repoKey = gemsArtifactInfo.getRepoKey();
-            String path = gemsArtifactInfo.getPath();
-            ArtifactGemsInfo gemsInfo = gemsAddon.getGemsInfo(repoKey, path);
-            GemsInfo artifactGemsInfo = new GemsInfo(gemsInfo, repoKey, path);
-            gemsArtifactInfo.clearRepoData();
-            gemsArtifactInfo.setGemsInfo(artifactGemsInfo);
-            List<GemsDependency> gemsDependencies = new ArrayList<>();
-            gemsInfo.getDependencies().getDevelopment().forEach(dev ->
-                    gemsDependencies.add(new GemsDependency(dev.getName(), dev.getRequirements(), "Development")));
-            gemsInfo.getDependencies().getRuntime().forEach(runtime ->
-                    gemsDependencies.add(new GemsDependency(runtime.getName(), runtime.getRequirements(), "Runtime")));
-            gemsArtifactInfo.setGemsDependencies(gemsDependencies);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/GetArtifactsCount.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/GetArtifactsCount.java
deleted file mode 100644
index 9b1d68c..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/GetArtifactsCount.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.general;
-
-import com.google.common.collect.ImmutableMap;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.info.BaseInfo;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Aviad Shikloshi
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetArtifactsCount implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(GetArtifactsCount.class);
-
-    @Autowired
-    private RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        BaseInfo baseInfo = (BaseInfo) request.getImodel();
-        try {
-            RepoPath repoPath = RepoPathFactory.create(baseInfo.getRepositoryPath());
-            long artifactCount = repositoryService.getArtifactCount(repoPath);
-            response.iModel(ImmutableMap.of("artifactsCount", artifactCount));
-        } catch (Exception e) {
-            log.error("Error while counting artifacts.", e);
-            response.error("Unable to count artifacts.");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/GetDependencyDeclarationService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/GetDependencyDeclarationService.java
deleted file mode 100644
index b4900c8..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/GetDependencyDeclarationService.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.general;
-
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.dependecydeclaration.DependencyDeclaration;
-import org.artifactory.ui.utils.RequestUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
-public class GetDependencyDeclarationService implements RestService {
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        DependencyDeclaration dependencyDeclaration = new DependencyDeclaration();
-        //update DependencyDeclaration model data
-        updateDependencyDeclarationModel(request, dependencyDeclaration);
-        // update response
-        response.iModel(dependencyDeclaration);
-    }
-
-    /**
-     * update DependencyDeclaration model data
-     * @param artifactoryRequest - encapsulate data related to request
-     * @param dependencyDeclaration - dependencyDeclaration model
-     */
-    private void updateDependencyDeclarationModel(ArtifactoryRestRequest artifactoryRequest,
-            DependencyDeclaration dependencyDeclaration) {
-        String repoKey = artifactoryRequest.getQueryParamByKey(RequestUtils.REPO_KEY_PARAM);
-        RepoPath targetRepoPath = RequestUtils.getPathFromRequest(artifactoryRequest);
-        ItemInfo itemInfo = repositoryService.getItemInfo(targetRepoPath);
-        LocalRepoDescriptor localRepoDescriptor = repositoryService.localOrCachedRepoDescriptorByKey(repoKey);
-        dependencyDeclaration.updateDependencyDeclaration(artifactoryRequest, repositoryService,
-                                 itemInfo, localRepoDescriptor);
-        dependencyDeclaration.setTypes(null);
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/GetGeneralArtifactsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/GetGeneralArtifactsService.java
deleted file mode 100644
index f520f4e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/GetGeneralArtifactsService.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.general;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.RestGeneralTab;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetGeneralArtifactsService implements RestService {
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        RestGeneralTab generalTab = (RestGeneralTab) request.getImodel();
-        RepoPath repoPath = generalTab.retrieveRepoPath();
-        if (repoPath != null && !authorizationService.canRead(repoPath)) {
-            response.error("Unauthorized").responseCode(HttpStatus.SC_FORBIDDEN);
-            return;
-        }
-        // populate  general tab data
-        generalTab.populateGeneralData(request, authorizationService);
-        // update response data
-        response.iModel(generalTab);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/SetFilteredResourceService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/SetFilteredResourceService.java
deleted file mode 100644
index 31d728a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/SetFilteredResourceService.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.general;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.addon.AddonType;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.filteredresources.FilteredResourcesAddon;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.GeneralArtifactInfo;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import static org.artifactory.ui.rest.resource.artifacts.browse.treebrowser.tabs.generalinfo.FilteredResourceResource.SET_FILTERED_QUERY_PARAM;
-
-/**
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class SetFilteredResourceService implements RestService {
-
-    @Autowired
-    AuthorizationService authService;
-
-    @Autowired
-    AddonsManager addonsManager;
-
-    @Autowired
-    RepositoryService repoService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        GeneralArtifactInfo artifact = (GeneralArtifactInfo) request.getImodel();
-        RepoPath path = RepoPathFactory.create(artifact.getRepoKey(), artifact.getPath());
-        if (!addonsManager.isAddonSupported(AddonType.FILTERED_RESOURCES)) {
-            response.error("The Filtered Resource addon is not enabled").responseCode(HttpStatus.SC_FORBIDDEN);
-        } else if (!authService.canAnnotate(path)) {
-            response.error("You do not have annotate permissions on this path").responseCode(HttpStatus.SC_FORBIDDEN);
-        } else if (repoService.getItemInfo(path).isFolder()) {
-            response.error(path.getPath() + " is a folder").responseCode(HttpStatus.SC_BAD_REQUEST);
-        } else {
-            addonsManager.addonByType(FilteredResourcesAddon.class).toggleResourceFilterState(path,
-                    Boolean.valueOf(request.getQueryParamByKey(SET_FILTERED_QUERY_PARAM)));
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/bintray/GetGeneralBintrayService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/bintray/GetGeneralBintrayService.java
deleted file mode 100644
index 5d7f960..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/bintray/GetGeneralBintrayService.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.general.bintray;
-
-import org.artifactory.api.bintray.BintrayPackageInfo;
-import org.artifactory.api.bintray.BintrayService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.bintray.BintrayInfoModel;
-import org.artifactory.ui.utils.RequestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetGeneralBintrayService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(GetGeneralBintrayService.class);
-
-    @Autowired
-    private AuthorizationService authService;
-
-    @Autowired
-    private BintrayService bintrayService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String sha1 = request.getQueryParamByKey("sha1");
-        Map<String, String> headersMap = RequestUtils.getHeadersMap(request.getServletRequest());
-        BintrayInfoModel bintrayInfoModel = getBintrayInfoModel(sha1, headersMap);
-        response.iModel(bintrayInfoModel);
-    }
-
-    private BintrayInfoModel getBintrayInfoModel(String sha1, Map<String, String> headersMap) {
-        BintrayInfoModel bintrayInfoModel = new BintrayInfoModel();
-
-        if(  ConstantValues.bintrayUIHideUploads.getBoolean()) {
-            return bintrayInfoModel;
-        }
-        boolean anonymousUser = authService.isAnonymous();
-        boolean hasSystemAPIKey = bintrayService.hasBintraySystemUser();
-        boolean userHasBintrayAuth = bintrayService.isUserHasBintrayAuth();
-        if (anonymousUser && !hasSystemAPIKey) {
-            bintrayInfoModel.setErrorMessage("Please login to view package information from Bintray's JCenter.");
-            return bintrayInfoModel;
-        }
-        if (!userHasBintrayAuth && !hasSystemAPIKey) {
-            bintrayInfoModel.setErrorMessage("To view package information from Bintray, please configure " +
-                    "your Bintray credentials in the user profile page.");
-            return bintrayInfoModel;
-        }
-        BintrayPackageInfo bintrayPackageInfo = bintrayService.getBintrayPackageInfo(sha1, headersMap);
-        if (bintrayPackageInfo != null) {
-            bintrayInfoModel.setName(bintrayPackageInfo.getName());
-            bintrayInfoModel.setNameLink(buildTitleLink(bintrayPackageInfo));
-            bintrayInfoModel.setDescription(bintrayPackageInfo.getDesc());
-            bintrayInfoModel.setLatestVersion(bintrayPackageInfo.getLatest_version());
-            bintrayInfoModel.setLatestVersionLink(buildLatestVersionLink(bintrayPackageInfo));
-            bintrayInfoModel.setIconURL(buildIconURL(bintrayPackageInfo));
-        } else {
-            bintrayInfoModel.setErrorMessage("Could not retrieve package information from Bintray's JCenter.");
-        }
-
-        return bintrayInfoModel;
-    }
-
-    private String buildTitleLink(BintrayPackageInfo packageInfo) {
-        return ConstantValues.bintrayUrl.getString() + "/pkg/show/general" + "/" +
-                packageInfo.getOwner() + "/" + packageInfo.getRepo() + "/" + packageInfo.getName();
-    }
-
-    private String buildLatestVersionLink(BintrayPackageInfo packageInfo) {
-        return ConstantValues.bintrayUrl.getString() + "/version/show/general" + "/" + packageInfo.getOwner() + "/" +
-                packageInfo.getRepo() + "/" + packageInfo.getName() + "/" + packageInfo.getLatest_version();
-    }
-
-    private String buildIconURL(BintrayPackageInfo packageInfo) {
-        return ConstantValues.bintrayApiUrl.getString() + "/packages/bintray/jcenter/" +
-                packageInfo.getName() + "/images/avatar";
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/licenses/GetAllAvailableLicensesService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/licenses/GetAllAvailableLicensesService.java
deleted file mode 100644
index 5987435..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/licenses/GetAllAvailableLicensesService.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.general.licenses;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.license.LicensesAddon;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.licenses.GeneralTabLicenseModel;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.stream.Collectors;
-
-/**
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetAllAvailableLicensesService implements RestService<GeneralTabLicenseModel> {
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        response.iModel(addonsManager.addonByType(LicensesAddon.class).getArtifactsLicensesInfo()
-                .getLicenses().stream()
-                .parallel()
-                .map(licenseInfo -> new GeneralTabLicenseModel(licenseInfo.getName()))
-                .collect(Collectors.toList()));
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/licenses/GetArchiveLicenseFileService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/licenses/GetArchiveLicenseFileService.java
deleted file mode 100644
index 2cd0845..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/licenses/GetArchiveLicenseFileService.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.general.licenses;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.artifactory.api.repo.ArchiveFileContent;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.fs.ZipEntryInfo;
-import org.artifactory.mime.MimeType;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.licenses.GeneralTabLicenseModel;
-import org.artifactory.ui.utils.RequestUtils;
-import org.artifactory.util.Tree;
-import org.artifactory.util.TreeNode;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.Set;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-/**
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetArchiveLicenseFileService implements RestService<GeneralTabLicenseModel> {
-    private static final Logger log = LoggerFactory.getLogger(GetArchiveLicenseFileService.class);
-
-    @Autowired
-    private RepositoryService repoService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        RepoPath path = RequestUtils.getPathFromRequest(request);
-        MimeType mimeType = NamingUtils.getMimeType(path.getPath());
-        if (!mimeType.isArchive()) {
-            response.error("File is not an archive").responseCode(HttpStatus.SC_BAD_REQUEST);
-            return;
-        }
-        getArchiveLicenseFileContent(path, response);
-    }
-
-    private void getArchiveLicenseFileContent(RepoPath path, RestResponse response) {
-        try {
-            Tree<ZipEntryInfo> zipEntries = repoService.zipEntriesToTree(path);
-            Set<String> licenseFileNames = getPossibleLicenseFileNames();
-            TreeNode<ZipEntryInfo> licenseEntry = searchForLicenseRecursively(zipEntries.getRoot(), licenseFileNames);
-            if (licenseEntry != null) {
-                String entryPath = licenseEntry.getData().getPath();
-                final ArchiveFileContent archiveFileContent = repoService.getArchiveFileContent(path, entryPath);
-                final String archiveContent = archiveFileContent.getContent();
-                if (StringUtils.isBlank(archiveContent)) {
-                    String err = "Unable to retrieve the content of the archived file";
-                    log.warn("{} {}/{}: {}", err, path, entryPath, archiveFileContent.getFailureReason());
-                    response.error(err + " : " + archiveFileContent.getFailureReason())
-                            .responseCode(HttpStatus.SC_NOT_FOUND);
-                } else {
-                    response.iModel(archiveContent);
-                }
-            } else {
-                response.warn("No license file found in archive").responseCode(HttpStatus.SC_NOT_FOUND);
-            }
-        } catch (IOException e) {
-            String err = "An error occurred while trying to locate or retrieve license file content of ";
-            log.error("{} {}: {}", err, path, e.getMessage());
-            log.debug("{} {}.", err, path, e);
-            response.error(err + path + ": " + e.getMessage());
-        }
-    }
-
-    private Set<String> getPossibleLicenseFileNames() {
-        return Stream.of(StringUtils.split(ConstantValues.archiveLicenseFileNames.getString(), ","))
-                .map(StringUtils::trim)
-                .filter(StringUtils::isNotBlank)
-                .collect(Collectors.toSet());
-    }
-
-    private TreeNode<ZipEntryInfo> searchForLicenseRecursively(TreeNode<ZipEntryInfo> root,
-                                                               Set<String> possibleLicenseFileNames) {
-        if (root.hasChildren()) {
-            for (TreeNode<ZipEntryInfo> zipEntryInfoTreeNode : root.getChildren()) {
-                ZipEntryInfo data = zipEntryInfoTreeNode.getData();
-                String name = data.getName();
-                if (data.isDirectory()) {
-                    TreeNode<ZipEntryInfo> licenseEntry = searchForLicenseRecursively(zipEntryInfoTreeNode,
-                            possibleLicenseFileNames);
-                    if (licenseEntry != null) {
-                        return licenseEntry;
-                    }
-                } else if (possibleLicenseFileNames.contains(name)) {
-                    return zipEntryInfoTreeNode;
-                }
-            }
-        }
-        return null;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/licenses/QueryCodeCenterService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/licenses/QueryCodeCenterService.java
deleted file mode 100644
index 026451e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/licenses/QueryCodeCenterService.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.general.licenses;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.blackduck.BlackDuckAddon;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.licenses.GeneralTabLicenseModel;
-import org.artifactory.ui.utils.RequestUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class QueryCodeCenterService implements RestService<GeneralTabLicenseModel> {
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Autowired
-    private AuthorizationService authService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        BlackDuckAddon blackDuckAddon = addonsManager.addonByType(BlackDuckAddon.class);
-        RepoPath path = RequestUtils.getPathFromRequest(request);
-        if (!blackDuckAddon.isEnableIntegration()) {
-            response.error("Governance integration is not enabled").responseCode(HttpStatus.SC_BAD_REQUEST);
-            return;
-        } else if (!authService.canAnnotate(path)) {
-            response.error("Insufficient permissions for operation").responseCode(HttpStatus.SC_FORBIDDEN);
-            return;
-        }
-        if (!blackDuckAddon.queryCodeCenterForPath(path)) {
-            response.error("Can't find component info, Check the log for additional information")
-                    .responseCode(HttpStatus.SC_METHOD_FAILURE); //4:20 !
-        } else {
-            response.info("Governance information retrieved successfully");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/licenses/ScanArtifactForLicensesService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/licenses/ScanArtifactForLicensesService.java
deleted file mode 100644
index 33e0c6a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/licenses/ScanArtifactForLicensesService.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.general.licenses;
-
-import com.google.common.collect.Lists;
-import org.apache.http.HttpStatus;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.license.LicensesAddon;
-import org.artifactory.api.license.LicenseInfo;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.licenses.GeneralTabLicenseModel;
-import org.artifactory.ui.utils.RequestUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ScanArtifactForLicensesService implements RestService<GeneralTabLicenseModel> {
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Autowired
-    AuthorizationService authService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        RepoPath path = RequestUtils.getPathFromRequest(request);
-        if (!authService.canAnnotate(path)) {
-            response.error("Insufficient permissions for operation").responseCode(HttpStatus.SC_FORBIDDEN);
-            return;
-        }
-        Set<LicenseInfo> foundLicenses = addonsManager.addonByType(LicensesAddon.class).scanPathForLicenses(path);
-        if (foundLicenses.isEmpty() || (foundLicenses.size() == 1 && foundLicenses.iterator().next().isNotFound())) {
-            //Don't send "not found" object - UI gets empty array and handles
-            response.iModelList(Lists.newArrayList());
-        } else {
-            response.iModel(foundLicenses.stream()
-                    .map(GeneralTabLicenseModel::new)
-                    .collect(Collectors.toList()));
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/licenses/SetLicensesOnPathService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/licenses/SetLicensesOnPathService.java
deleted file mode 100644
index 6d8424e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/general/licenses/SetLicensesOnPathService.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.general.licenses;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.license.LicensesAddon;
-import org.artifactory.api.license.LicenseInfo;
-import org.artifactory.api.properties.PropertiesService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.licenses.GeneralTabLicenseModel;
-import org.artifactory.ui.utils.RequestUtils;
-import org.artifactory.util.CollectionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-
-/**
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class SetLicensesOnPathService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(SetLicensesOnPathService.class);
-
-    private final Pattern UNKNOWN_PATTERN = Pattern.compile("Unknown\\((.*)\\)", Pattern.CASE_INSENSITIVE);
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Autowired
-    PropertiesService propertiesService;
-
-    @Autowired
-    AuthorizationService authService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        RepoPath path = RequestUtils.getPathFromRequest(request);
-        if (!authService.canAnnotate(path)) {
-            response.error("Insufficient permissions for operation").responseCode(HttpStatus.SC_FORBIDDEN);
-            return;
-        }
-        LicensesAddon licensesAddon = addonsManager.addonByType(LicensesAddon.class);
-        List<GeneralTabLicenseModel> newLicensesNames = request.getModels();
-        Set<LicenseInfo> newLicenses = newLicensesNames.stream()
-                .map(this::trimUnknownFromName)
-                .map(licensesAddon::getLicenseByName)
-                .collect(Collectors.toSet());
-        if (CollectionUtils.isNullOrEmpty(newLicenses)) {
-            log.debug("Request sent with empty license set - deleting license properties from path {}", path);
-            propertiesService.deleteProperty(path, LicensesAddon.LICENSES_PROP_FULL_NAME);
-            propertiesService.deleteProperty(path, LicensesAddon.LICENSES_UNKNOWN_PROP_FULL_NAME);
-            response.info("Successfully updated License information");
-        } else {
-            if (licensesAddon.setLicensePropsOnPath(path, newLicenses)) {
-                response.info("Successfully updated License information");
-            } else {
-                response.error("Failed to update license information - check the log for more information")
-                        .responseCode(HttpStatus.SC_BAD_REQUEST);
-            }
-        }
-    }
-
-    /**
-     * UI sends unknown licenses as "Unknown(<name>)" (as sent to it by LicenseService) - which will cause duplicate
-     * "Unknown" prefixes when setting the license again.
-     * This method trims the "Unknown(..)" part so we get only the license name.
-     */
-    private String trimUnknownFromName(GeneralTabLicenseModel license) {
-        Matcher matcher = UNKNOWN_PATTERN.matcher(license.getName());
-        if (matcher.matches()) {
-            return matcher.group(1);
-        } else {
-            return license.getName();
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/npmview/NpmViewService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/npmview/NpmViewService.java
deleted file mode 100644
index 154abde..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/npmview/NpmViewService.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.npmview;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.npm.NpmAddon;
-import org.artifactory.addon.npm.NpmMetadataInfo;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.npm.NpmArtifactInfo;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class NpmViewService implements RestService {
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        NpmArtifactInfo npmArtifactInfo = (NpmArtifactInfo) request.getImodel();
-        // fetch npm meta data
-        fetchNpmMetaData(request, response, npmArtifactInfo);
-    }
-
-    /**
-     * fetch npm meta data
-     *
-     * @param artifactoryRequest  - encapsulate data relate to request
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param npmArtifactInfo     - npm artifact info
-     */
-    private void fetchNpmMetaData(ArtifactoryRestRequest artifactoryRequest, RestResponse artifactoryResponse,
-            NpmArtifactInfo npmArtifactInfo) {
-        String repoKey = npmArtifactInfo.getRepoKey();
-        String path = npmArtifactInfo.getPath();
-        RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-        NpmArtifactInfo npmArtifactInfoModel = (NpmArtifactInfo) artifactoryRequest.getImodel();
-        /// get npm add on
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        NpmAddon npmAddon = addonsManager.addonByType(NpmAddon.class);
-        if (npmAddon != null) {
-            // get npm meta data
-            ItemInfo itemInfo = repositoryService.getItemInfo(repoPath);
-            NpmMetadataInfo npmMetaDataInfo = npmAddon.getNpmMetaDataInfo(repoPath);
-            npmArtifactInfo.setNpmDependencies(npmMetaDataInfo.getNpmDependencies());
-            npmArtifactInfo.setNpmInfo(npmMetaDataInfo.getNpmInfo());
-            npmArtifactInfo.clearRepoData();
-            artifactoryResponse.iModel(npmArtifactInfoModel);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/nugetview/NugetViewService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/nugetview/NugetViewService.java
deleted file mode 100644
index 6e48852..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/nugetview/NugetViewService.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.nugetview;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.nuget.UiNuGetAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.nuget.NuMetaData;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.nugetinfo.NugetArtifactInfo;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class NugetViewService implements RestService {
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        NugetArtifactInfo nugetArtifactInfo = (NugetArtifactInfo) request.getImodel();
-        // get nuGet Meta data
-        NugetArtifactInfo nuGetMetaData = getNuGetMetaData(nugetArtifactInfo);
-        // update response with model data
-        if (nuGetMetaData != null) {
-            response.iModel(nuGetMetaData);
-        }
-    }
-
-    /**
-     * get  Nuget MetaData model
-     *
-     * @param nugetArtifactInfo
-     * @return nuGet Meta Data model
-     */
-    private NugetArtifactInfo getNuGetMetaData(NugetArtifactInfo nugetArtifactInfo) {
-        String repoKey = nugetArtifactInfo.getRepoKey();
-        String path = nugetArtifactInfo.getPath();
-        RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        UiNuGetAddon uiNuGetAddon = addonsManager.addonByType(UiNuGetAddon.class);
-        if (uiNuGetAddon != null) {
-            NuMetaData nugetSpecMetaData = uiNuGetAddon.getNutSpecMetaData(repoPath);
-            nugetArtifactInfo = new NugetArtifactInfo(nugetSpecMetaData);
-        }
-        return nugetArtifactInfo;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/permission/GetEffectivePermissionService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/permission/GetEffectivePermissionService.java
deleted file mode 100644
index 652e996..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/permission/GetEffectivePermissionService.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.permission;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.CoreAddons;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.model.RestPaging;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.GroupInfo;
-import org.artifactory.security.UserInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.permission.EffectivePermission;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.permission.EffectivePermissionsArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.permission.PagingModel;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component("getEffectivePermission")
-public class GetEffectivePermissionService implements RestService {
-
-    @Autowired
-    private AuthorizationService authService;
-
-    @Autowired
-    private UserGroupService userGroupService;
-
-    public void execute(ArtifactoryRestRequest artifactoryRequest, RestResponse artifactoryResponse) {
-        String path = artifactoryRequest.getQueryParamByKey("path");
-        String repoKey = artifactoryRequest.getQueryParamByKey("repoKey");
-        RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-        boolean canManage = authService.canManage(repoPath);
-        if (canManage) {
-            // fetch principals effective permission
-            List<RestPaging> effectivePermissionsArtifactInfos = fetchEffectivePermission(
-                    repoPath);
-            // update response with model
-            PagingModel pagingModel = new PagingModel(0, effectivePermissionsArtifactInfos);
-            artifactoryResponse.iModel(pagingModel);
-        }
-    }
-
-    /**
-     * get principals data with effective permission
-     * @param repoPath - repo path
-     * @return list of artifacts effective permissions
-     */
-    public List<RestPaging> fetchEffectivePermission(RepoPath repoPath) {
-        List<UserInfo> users = userGroupService.getAllUsers(true);
-        List<GroupInfo> groups = userGroupService.getAllGroups();
-        List<RestPaging> principals = new ArrayList();
-        for (UserInfo user : users) {
-            AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-            CoreAddons addons = addonsManager.addonByType(CoreAddons.class);
-            if (!addons.isAolAdmin(user)) {
-                addUserToPrincipalList(user, repoPath, principals);
-            }
-        }
-        for (GroupInfo group : groups) {
-            addGroupToPrincipalList(group, repoPath, principals);
-        }
-        return principals;
-    }
-
-    /**
-     * add users effective permission data if have any
-     * @param userInfo - user info
-     * @param repoPath - repo path
-     * @param effectivePermissions
-     */
-    private void addUserToPrincipalList(UserInfo userInfo, RepoPath repoPath, List<RestPaging> effectivePermissions) {
-        EffectivePermission effectivePermission = new EffectivePermission();
-        effectivePermission.setRead(authService.canRead(userInfo, repoPath));
-        effectivePermission.setAnnotate(authService.canAnnotate(userInfo, repoPath));
-        effectivePermission.setDeploy(authService.canDeploy(userInfo, repoPath));
-        effectivePermission.setDelete(authService.canDelete(userInfo, repoPath));
-        if (effectivePermission.isHasAtLeastOnePermission()){
-            effectivePermissions.add(new EffectivePermissionsArtifactInfo("user",userInfo.getUsername(),effectivePermission));
-        }
-     }
-
-    /**
-     * add group effective permission data if have any
-     * @param groupInfo - group info
-     * @param repoPath - repo path
-     * @param effectivePermissions
-     */
-    private void addGroupToPrincipalList(GroupInfo groupInfo, RepoPath repoPath,
-            List<RestPaging> effectivePermissions) {
-        EffectivePermission effectivePermission = new EffectivePermission();
-        effectivePermission.setRead(authService.canRead(groupInfo, repoPath));
-        effectivePermission.setAnnotate(authService.canAnnotate(groupInfo, repoPath));
-        effectivePermission.setDeploy(authService.canDeploy(groupInfo, repoPath));
-        effectivePermission.setDelete(authService.canDelete(groupInfo, repoPath));
-        if (effectivePermission.isHasAtLeastOnePermission()){
-            effectivePermissions.add(new EffectivePermissionsArtifactInfo("group",groupInfo.getGroupName(),effectivePermission));
-        }
-      }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/pomview/PomViewService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/pomview/PomViewService.java
deleted file mode 100644
index 51a4cbe..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/pomview/PomViewService.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.pomview;
-
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.service.artifacts.browse.treebrowser.actions.ViewArtifactService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class PomViewService implements RestService {
-
-    @Autowired
-    ViewArtifactService viewArtifactService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        // currently view artifact and view pom are the same
-        viewArtifactService.execute(request, response);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/properties/CreatePropertyService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/properties/CreatePropertyService.java
deleted file mode 100644
index 06893b5..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/properties/CreatePropertyService.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.properties;
-
-import org.artifactory.api.properties.PropertiesService;
-import org.artifactory.exception.CancelException;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.properties.PropertiesArtifactInfo;
-import org.artifactory.ui.utils.RequestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CreatePropertyService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(DeletePropertyService.class);
-
-    @Autowired
-    private PropertiesService propsService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        PropertiesArtifactInfo propertiesTab = (PropertiesArtifactInfo) request.getImodel();
-        RepoPath repoPath = RequestUtils.getPathFromRequest(request);
-        boolean recursive = Boolean.valueOf(request.getQueryParamByKey("recursive"));
-        // save property to db
-        if (propertiesTab.getProperty() == null) {
-            response.error("Cannot create an empty property");
-            return;
-        }
-        savePropertyAndUpdateResponse(response, propertiesTab, repoPath, recursive);
-    }
-
-    /**
-     * save property and update response
-     *
-     * @param artifactoryResponse - encapsulate artifactory response data
-     * @param propertiesTab       - properties tab data
-     * @param repoPath            - repo path
-     */
-    private void savePropertyAndUpdateResponse(RestResponse artifactoryResponse, PropertiesArtifactInfo propertiesTab,
-            RepoPath repoPath, boolean recursive) {
-        try {
-            if (recursive) {
-                propsService.addPropertyRecursively(repoPath, propertiesTab.getParent(), propertiesTab.getProperty(),
-                        true,propertiesTab.getSelectedValues());
-            } else {
-                propsService.addProperty(repoPath, propertiesTab.getParent(), propertiesTab.getProperty(),
-                        true,propertiesTab.getSelectedValues());
-            }
-            artifactoryResponse.info("Successfully created property '" + propertiesTab.getProperty().getName() + "'");
-            artifactoryResponse.responseCode(HttpServletResponse.SC_CREATED);
-        } catch (CancelException e) {
-            log.error("Failed to create property:" + propertiesTab.getProperty().getName());
-            artifactoryResponse.error("Failed to created property '" + propertiesTab.getProperty().getName() + "'");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/properties/DeletePropertyService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/properties/DeletePropertyService.java
deleted file mode 100644
index bc06514..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/properties/DeletePropertyService.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.properties;
-
-import org.artifactory.api.properties.PropertiesService;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.properties.DeletePropertyModel;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.properties.PropertyWithPath;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DeletePropertyService<T extends DeletePropertyModel> implements RestService<T> {
-    private static final Logger log = LoggerFactory.getLogger(DeletePropertyService.class);
-
-    @Autowired
-    private PropertiesService propsService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-        T model = request.getImodel();
-        for (PropertyWithPath propertyWithPath : model.getProperties()) {
-
-            String name = propertyWithPath.getName();
-
-            RepoPath path = InternalRepoPathFactory.create(propertyWithPath.getRepoKey(), propertyWithPath.getPath());
-            boolean recursive = propertyWithPath.isRecursive();
-            // delete property and update response
-            deletePropertyAndUpdateResponse(response, name, path, recursive);
-        }
-        if(model.getProperties().size()>1){
-            response.info("Successfully removed "+model.getProperties().size()+" properties");
-        }else if(model.getProperties().size()==1){
-            response.info("Successfully removed property '" + model.getProperties().get(0).getName() + "'");
-        }
-    }
-
-    /**
-     * delete property from DB and update response feedback
-     *
-     * @param artifactoryResponse - encapsulate data require to response
-     * @param name                - property name
-     * @param path                - repo path
-     * @param recursive           - if true - delete recursively
-     */
-    private void deletePropertyAndUpdateResponse(RestResponse artifactoryResponse, String name, RepoPath path,
-            boolean recursive) {
-        try {
-            if (recursive) {
-                propsService.deletePropertyRecursively(path, name,true);
-            } else {
-                propsService.deleteProperty(path, name,true);
-            }
-        } catch (Exception e) {
-            log.error("problem with deleting property:" + name);
-            artifactoryResponse.error("property " + name + " failed to deleted");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/properties/GetPropertyService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/properties/GetPropertyService.java
deleted file mode 100644
index 0ea8100..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/properties/GetPropertyService.java
+++ /dev/null
@@ -1,181 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.properties;
-
-import com.google.common.collect.Multiset;
-import org.artifactory.api.properties.PropertiesService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.descriptor.property.PredefinedValue;
-import org.artifactory.descriptor.property.Property;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.properties.ArtifactProperty;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.properties.PropertiesArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.properties.RepoProperty;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.properties.RepoPropertySet;
-import org.artifactory.ui.utils.RequestUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetPropertyService implements RestService {
-
-    @Autowired
-    private PropertiesService propsService;
-
-    @Autowired
-    private RepositoryService repoService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String name = request.getPathParamByKey("name");
-        RepoPath repoPath = RequestUtils.getPathFromRequest(request);
-        // get single or multi properties
-        PropertiesArtifactInfo propertiesTab = getSingleOrMultiPropertiesArtifactInfo(name, repoPath);
-        // update response
-        response.iModel(propertiesTab);
-    }
-
-    /**
-     * get single or multi properties (for edit or view)
-     * @param name - property name
-     * @param repoPath - repo path
-     * @return
-     */
-    private PropertiesArtifactInfo getSingleOrMultiPropertiesArtifactInfo(String name, RepoPath repoPath) {
-        List<String> predefineValuesList =  new ArrayList<>();
-        PropertiesArtifactInfo propertiesTab = new PropertiesArtifactInfo();
-        if (name.length() > 0){
-            /// get properties for edit
-            getPropertiesForEdit(name, repoPath, predefineValuesList, propertiesTab);
-        }
-        else{
-            // get properties for view
-            getMultiProperties(repoPath, propertiesTab);
-        }
-        return propertiesTab;
-    }
-
-    /**
-     * get properties for view
-     * @param repoPath - repo path
-     * @param propertiesTab - encapsulate properties data
-     */
-    private void getMultiProperties(RepoPath repoPath, PropertiesArtifactInfo propertiesTab) {
-        Properties properties = propsService.getProperties(repoPath);
-        Multiset<String> keys = properties.keys();
-        Map<String,String> propsMap = new HashMap<>();
-        List<ArtifactProperty> artifactProperties = new ArrayList<>();
-        for (String key : keys){
-            final StringBuilder valueBuilder = new StringBuilder();
-            if (propsMap.get(key) == null){
-                Set<String> values = properties.get(key);
-                if (values.size() > 1){
-                    values.forEach(multiValue->{
-                        valueBuilder.append(multiValue);
-                        if (values.size() > 1){
-                            valueBuilder.append(";");
-                        }
-                    });
-                    propsMap.put(key,valueBuilder.toString());
-                    artifactProperties.add(new ArtifactProperty(key,valueBuilder.toString()));
-                }
-                else{
-                    values.forEach(value -> {
-                        propsMap.put(key, value);
-                        artifactProperties.add(new ArtifactProperty(key, value));
-                    });
-                }
-            }
-        }
-        propertiesTab.setArtifactProperties(artifactProperties);
-    }
-
-    /**
-     * get properties for Edit
-     * @param name - property name
-     * @param repoPath - repo path
-     * @param predefineValuesList = preDefine values
-     * @param propertiesTab - encapsulate properties data
-     */
-    private void getPropertiesForEdit(String name, RepoPath repoPath, List<String> predefineValuesList,
-            PropertiesArtifactInfo propertiesTab) {
-        Map<String, PropertiesArtifactInfo> propertyItemMap = createPropertyItemMap(repoPath);
-        Properties properties = propsService.getProperties(repoPath);
-        Set<String> selectedValuesList = properties.get(name);
-        if (propertyItemMap.get(name) != null) {
-            // multi value
-            multiValuePropertySet(name, predefineValuesList, propertiesTab, propertyItemMap, selectedValuesList);
-            return;
-        }
-        propertiesTab.setProperty(new RepoProperty(name));
-        propertiesTab.setSelectedValues(selectedValuesList);
-    }
-
-    /**
-     * create multi value property set
-     *
-     * @param name                - name
-     * @param predefineValuesList - predefine value list
-     * @param propertiesTab       - properties holder
-     * @param propertyItemMap     - property set map
-     * @param selectedValuesList  - select value list
-     */
-    private void multiValuePropertySet(String name, List<String> predefineValuesList,
-            PropertiesArtifactInfo propertiesTab,
-            Map<String, PropertiesArtifactInfo> propertyItemMap, Set<String> selectedValuesList) {
-        if (selectedValuesList.size() >= 1) {
-            List<PredefinedValue> predefinedValues = null;
-            if (!propertyItemMap.isEmpty()) {
-                predefinedValues = propertyItemMap.get(name).getProperty().getPredefinedValues();
-            }
-            if (predefinedValues != null) {
-                predefinedValues.forEach(predefinedValue -> predefineValuesList.add(predefinedValue.getValue()));
-                selectedValuesList.forEach(value -> {
-                    predefineValuesList.remove(value);
-                });
-                propertiesTab.setPredefineValues(predefineValuesList);
-            }
-        } else {
-            propertiesTab.setPredefineValues(null);
-        }
-        propertiesTab.setParent(new RepoPropertySet(propertyItemMap.get(name).getParent().getName()));
-        propertiesTab.setProperty(new RepoProperty(propertyItemMap.get(name).getProperty().getName()));
-        propertiesTab.setSelectedValues(selectedValuesList);
-        propertiesTab.setPropertyType(propertyItemMap.get(name).getProperty().getPropertyType().name());
-    }
-
-    /**
-     * create properties map
-     * @param repoPath - repo path
-     * @return map of properties
-     */
-    private Map<String, PropertiesArtifactInfo> createPropertyItemMap(RepoPath repoPath) {
-        Map<String, PropertiesArtifactInfo> propertyItemMap = new HashMap<>();
-        LocalRepoDescriptor descriptor = repoService.localOrCachedRepoDescriptorByKey(repoPath.getRepoKey());
-        List<PropertySet> propertySets = new ArrayList<>(descriptor.getPropertySets());
-        for (PropertySet propertySet : propertySets) {
-            List<Property> propertyList = propertySet.getProperties();
-            for (Property property : propertyList) {
-                PropertiesArtifactInfo propertiesArtifactInfo =  new PropertiesArtifactInfo(propertySet,property);
-                propertyItemMap.put(propertySet.getName()+"."+property.getName(), propertiesArtifactInfo);
-            }
-        }
-        return propertyItemMap;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/properties/UpdatePropertyService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/properties/UpdatePropertyService.java
deleted file mode 100644
index 9103d40..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/properties/UpdatePropertyService.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.properties;
-
-import org.artifactory.api.properties.PropertiesService;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.properties.PropertiesArtifactInfo;
-import org.artifactory.ui.utils.RequestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdatePropertyService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(UpdatePropertyService.class);
-
-    @Autowired
-    private PropertiesService propsService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        PropertiesArtifactInfo propertiesTab = (PropertiesArtifactInfo) request.getImodel();
-        try {
-            RepoPath repoPath = RequestUtils.getPathFromRequest(request);
-            propsService.editProperty(repoPath, propertiesTab.getParent(), propertiesTab.getProperty(),
-                    true,propertiesTab.getSelectedValues());
-            response.info("Successfully updated property '" + propertiesTab.getProperty().getName() + "'");
-        }catch (Exception e){
-            log.error("Failed to create property '" + propertiesTab.getProperty().getName() +  "'");
-            response.error("Failed to update property '" + propertiesTab.getProperty().getName() +  "'");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/pypi/PypiViewService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/pypi/PypiViewService.java
deleted file mode 100644
index d9024f9..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/pypi/PypiViewService.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.pypi;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.pypi.PypiAddon;
-import org.artifactory.addon.pypi.PypiPkgMetadata;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.pypi.PypiArtifactInfo;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class PypiViewService implements RestService {
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        PypiArtifactInfo pypiArtifactInfo = (PypiArtifactInfo) request.getImodel();
-        String path = pypiArtifactInfo.getPath();
-        String repoKey = pypiArtifactInfo.getRepoKey();
-        // get pypi meta data model
-        PypiArtifactInfo pypiMetaData = getPypiArtifactInfo(path, repoKey);
-        response.iModel(pypiMetaData);
-    }
-
-    /**
-     * get pypi meta data from pypi file meta data
-     *
-     * @param path    - artifact path
-     * @param repoKey - repo path
-     * @return pypi meta data model
-     */
-    private PypiArtifactInfo getPypiArtifactInfo(String path, String repoKey) {
-        RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        PypiAddon pypiAddon = addonsManager.addonByType(PypiAddon.class);
-        PypiPkgMetadata pypiPkgMetadata = pypiAddon.getPypiMetadata(repoPath);
-        if (pypiPkgMetadata != null) {
-            return new PypiArtifactInfo(pypiPkgMetadata);
-        }
-        return null;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/rpm/RpmViewService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/rpm/RpmViewService.java
deleted file mode 100644
index c3e29e2..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/rpm/RpmViewService.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.rpm;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.yum.ArtifactRpmMetadata;
-import org.artifactory.addon.yum.YumAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.rpm.RpmArtifactInfo;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class RpmViewService implements RestService {
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        RpmArtifactInfo rpmArtifactInfo = (RpmArtifactInfo) request.getImodel();
-        // get rpm meta data
-        ArtifactRpmMetadata rpmMetadata = getArtifactRpmMetadata(rpmArtifactInfo);
-        if (rpmMetadata == null) {
-            return;
-        }
-        RpmArtifactInfo rpmReturnMeta = new RpmArtifactInfo(rpmMetadata);
-        // update response
-        response.iModel(rpmReturnMeta);
-    }
-
-    /**
-     * get Rpm meta data
-     *
-     * @param rpmArtifactInfo - rpm meta data from file
-     * @return
-     */
-    private ArtifactRpmMetadata getArtifactRpmMetadata(RpmArtifactInfo rpmArtifactInfo) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        YumAddon yumAddon = addonsManager.addonByType(YumAddon.class);
-        RepoPath repoPath = InternalRepoPathFactory.create(rpmArtifactInfo.getRepoKey(), rpmArtifactInfo.getPath());
-        FileInfo itemInfo = (FileInfo) repositoryService.getItemInfo(repoPath);
-        return yumAddon.getRpmMetadata(itemInfo);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/viewsource/ArchiveViewSourceService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/viewsource/ArchiveViewSourceService.java
deleted file mode 100644
index f66f9d7..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/viewsource/ArchiveViewSourceService.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.viewsource;
-
-import org.artifactory.api.repo.ArchiveFileContent;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.viewsource.ViewArtifactSource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ArchiveViewSourceService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(ArchiveViewSourceService.class);
-
-    @Autowired
-    private RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        ViewArtifactSource viewArtifact = (ViewArtifactSource) request.getImodel();
-        String archivePath = viewArtifact.getArchivePath();
-        String repoKey = viewArtifact.getRepoKey();
-        String sourcePath = viewArtifact.getSourcePath();
-        RepoPath archiveRepoPath = InternalRepoPathFactory.create(repoKey, archivePath);
-        // get source content
-        ArchiveFileContent archiveFileContent = getArchiveFileContent(sourcePath, archiveRepoPath);
-        if (sourceFileNotFound(archiveFileContent)) {
-            archiveFileContent.setContent("Source File not found");
-        }
-        // update response with model data
-        updateResponseWithModelData(response, archiveFileContent);
-    }
-
-    /**
-     * check if source file not found
-     *
-     * @param archiveFileContent
-     * @return - if true source file not found
-     */
-    private boolean sourceFileNotFound(ArchiveFileContent archiveFileContent) {
-        return archiveFileContent.getContent() == null || archiveFileContent.getContent().length() == 0;
-    }
-
-    /**
-     * update respponse with model data
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param archiveFileContent  - archive source file content
-     */
-    private void updateResponseWithModelData(RestResponse artifactoryResponse, ArchiveFileContent archiveFileContent) {
-        ViewArtifactSource viewArtifactSource = new ViewArtifactSource();
-        viewArtifactSource.setSource(archiveFileContent.getContent());
-        artifactoryResponse.iModel(viewArtifactSource);
-    }
-
-    /**
-     * fetch archive source content
-     *
-     * @param sourcePath      - source relative path
-     * @param archiveRepoPath - archive path
-     * @return archive File content
-     */
-    private ArchiveFileContent getArchiveFileContent(String sourcePath, RepoPath archiveRepoPath) {
-        ArchiveFileContent archiveFileContent = null;
-        try {
-            archiveFileContent = repositoryService.getGenericArchiveFileContent(archiveRepoPath, sourcePath);
-        } catch (IOException e) {
-            log.error(e.toString());
-        }
-        return archiveFileContent;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/watchers/GetWatchersService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/watchers/GetWatchersService.java
deleted file mode 100644
index a1843ef..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/watchers/GetWatchersService.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.watchers;
-
-import com.google.common.collect.Lists;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.watch.ArtifactWatchAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.fs.WatchersInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.watchers.WatchersArtifactInfo;
-import org.artifactory.ui.utils.RequestUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetWatchersService implements RestService {
-
-    @Autowired
-    AuthorizationService authService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        RepoPath repoPath = RequestUtils.getPathFromRequest(request);
-        boolean canManage = authService.canManage(repoPath);
-        if (canManage) {
-            // get all watchers related to repo
-            List<RestModel> watchersData = getWatchersData(repoPath);
-            // update response with data
-            response.iModelList(watchersData);
-        }
-    }
-
-    private List<RestModel> getWatchersData(RepoPath repoPath) {
-       ArtifactWatchAddon artifactWatchAddon = ContextHelper.get().beanForType(AddonsManager.class).addonByType(
-               ArtifactWatchAddon.class);
-        List<RestModel> actions = Lists.newArrayList();
-        Map<RepoPath, WatchersInfo> allWatchers = artifactWatchAddon.getAllWatchers(repoPath);
-       if (allWatchers != null && !allWatchers.isEmpty()) {
-           Set<Map.Entry<RepoPath, WatchersInfo>> allEntries = allWatchers.entrySet();
-           for (Map.Entry<RepoPath, WatchersInfo> entry : allEntries) {
-               RepoPath watchedPath = entry.getKey();
-               WatchersInfo watchers = entry.getValue();
-               actions.addAll(watchers.getWatchers().stream().map(
-                       watcher -> new WatchersArtifactInfo(watcher.getUsername(), watcher.getWatchingSinceTime(),
-                               watchedPath, "RemoveWatcher")).collect(Collectors.toList()));
-           }
-       }
-       return actions;
-   }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/watchers/RemoveWatchersService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/watchers/RemoveWatchersService.java
deleted file mode 100644
index 8c5423b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/watchers/RemoveWatchersService.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.watchers;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.watch.ArtifactWatchAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.watchers.DeleteWatcher;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.watchers.DeleteWatchersModel;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class RemoveWatchersService<T extends DeleteWatchersModel> implements RestService<T> {
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-        T imodel = request.getImodel();
-        for (DeleteWatcher watcher : imodel.getWatches()) {
-            RepoPath repoPath = InternalRepoPathFactory.create(watcher.getRepoKey(), watcher.getPath());
-            // remove watcher
-            removeWatcherAndUpdateResponse(response, watcher.getName(), repoPath);
-        }
-        if(imodel.getWatches().size()>1){
-            response.info("Successfully removed " + imodel.getWatches().size() + " watchers");
-        }else if(imodel.getWatches().size()==1){
-            response.info("Successfully removed watcher '" + imodel.getWatches().get(0).getName() + "'");
-        }
-    }
-
-    /**
-     * remove watcher and update response
-     *
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param watchName           - watcher name
-     * @param repoPath            - repo path
-     * @param repoPath            - repo path
-     */
-    private void removeWatcherAndUpdateResponse(RestResponse artifactoryResponse, String watchName, RepoPath repoPath) {
-        ArtifactWatchAddon artifactWatchAddon = ContextHelper.get().beanForType(AddonsManager.class).addonByType(
-                ArtifactWatchAddon.class);
-        artifactWatchAddon.removeWatcher(repoPath, watchName);
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/watchers/WatchStatusService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/watchers/WatchStatusService.java
deleted file mode 100644
index 4fc4bbf..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tabs/watchers/WatchStatusService.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tabs.watchers;
-
-import org.artifactory.addon.AddonType;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.watch.ArtifactWatchAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.fs.WatchersInfo;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.util.Pair;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class WatchStatusService implements RestService {
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        ArtifactWatchAddon watchAddon = ContextHelper.get().beanForType(AddonsManager.class).addonByType(
-                ArtifactWatchAddon.class);
-        String path = request.getQueryParamByKey("path");
-        String repoKey = request.getQueryParamByKey("repoKey");
-        RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        LocalRepoDescriptor localRepoDescriptor = repositoryService.localOrCachedRepoDescriptorByKey(repoKey);
-        if (localRepoDescriptor != null && addonsManager.isAddonSupported(AddonType.WATCH)) {
-            // get watch status
-            BaseArtifact watchStatus = getWatchStatus(watchAddon, repoPath);
-            // update status
-            response.iModel(watchStatus);
-        }
-    }
-
-    /**
-     * return watch status
-     *
-     * @param watchAddon - watch add onn
-     * @param repoPath   - repo path
-     * @return watch status
-     */
-    private BaseArtifact getWatchStatus(ArtifactWatchAddon watchAddon, RepoPath repoPath) {
-        if (userAllowedToWatch(watchAddon, repoPath)) {
-            if (isUserWatchingRepoPath(authorizationService, repoPath, watchAddon)) {
-                return new BaseArtifact("Unwatch");
-            } else {
-                return new BaseArtifact("Watch");
-            }
-        }
-        return null;
-    }
-
-    private boolean userAllowedToWatch(ArtifactWatchAddon watchAddon, RepoPath repoPath) {
-        return authorizationService.canRead(repoPath) && !authorizationService.isAnonymous()
-                && !authorizationService.isTransientUser()
-                &&!isThisBranchHasWatchAlready(authorizationService, watchAddon, repoPath);
-    }
-
-    /**
-     * check if anyone is watching this path branch already
-     *
-     * @param authService - authorization service
-     * @param watchAddon  - watch addon
-     * @return if true - this path branch has watch already
-     */
-    private boolean isThisBranchHasWatchAlready(AuthorizationService authService,
-            ArtifactWatchAddon watchAddon, RepoPath repoPath) {
-        Pair<RepoPath, WatchersInfo> nearestWatch = watchAddon.getNearestWatchDefinition(
-                repoPath, authService.currentUsername());
-        return nearestWatch != null && !(nearestWatch.getFirst().getPath().equals(repoPath.getPath()));
-    }
-
-    /**
-     * check if user watching repo path
-     *
-     * @param authService        - authorization service
-     * @param repoPath           - repo path
-     * @param artifactWatchAddon watch addon
-     * @return if true - user is watching repo service
-     */
-    protected boolean isUserWatchingRepoPath(AuthorizationService authService, RepoPath repoPath,
-            ArtifactWatchAddon artifactWatchAddon) {
-        return artifactWatchAddon.isUserWatchingRepo(repoPath, authService.currentUsername());
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tree/BrowseTreeNodesService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tree/BrowseTreeNodesService.java
deleted file mode 100644
index 3eeab1b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/browse/treebrowser/tree/BrowseTreeNodesService.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.browse.treebrowser.tree;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.md.Properties;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.nodes.RestTreeNode;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.Collection;
-
-/**
- * @author Chen Keinan
- */
- at Component()
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class BrowseTreeNodesService implements RestService {
-
-    @Autowired
-    private AuthorizationService authService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        boolean isCompact = Boolean.valueOf(request.getQueryParamByKey("compacted"));
-        Properties props = (Properties) request.getServletRequest().getAttribute("artifactory.request_properties");
-        // get branch model
-        RestTreeNode itemNode = (RestTreeNode) request.getImodel();
-        // populate branch items
-        Collection<? extends RestModel> items = populateBranchItems(itemNode, isCompact, props, request);
-        // update response data
-        updateResponseData(response, items);
-    }
-
-    /**
-     * update response data
-     *
-     * @param artifactoryResponse - encapsulate artifactory response data
-     * @param items               - items
-     */
-    private void updateResponseData(RestResponse artifactoryResponse, Collection<? extends RestModel> items) {
-        // update response
-        artifactoryResponse.iModelList(items);
-    }
-
-    /**
-     * populate branch childes
-     *
-     * @param itemNode - current branch
-     * @param request
-     */
-    private Collection<? extends RestModel> populateBranchItems(RestTreeNode itemNode, boolean isCompact,
-            Properties props, ArtifactoryRestRequest request) {
-        return itemNode.fetchItemTypeData(authService, isCompact, props, request);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/deploy/ArtifactDeployBundleService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/deploy/ArtifactDeployBundleService.java
deleted file mode 100644
index eb1eef8..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/deploy/ArtifactDeployBundleService.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.deploy;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.DeployService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.deploy.UploadArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.deploy.UploadedArtifactInfo;
-import org.artifactory.ui.utils.TreeUtils;
-import org.artifactory.util.Files;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.File;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ArtifactDeployBundleService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactDeployBundleService.class);
-
-    @Autowired
-    DeployService deployService;
-    @Autowired
-    CentralConfigService centralConfigService;
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String uploadDir = ContextHelper.get().getArtifactoryHome().getTempUploadDir().getAbsolutePath();
-        // get upload model
-        UploadArtifactInfo uploadArtifactInfo = (UploadArtifactInfo) request.getImodel();
-        String repoKey = uploadArtifactInfo.getRepoKey();
-        // deploy bundle
-        deployBundle(response, uploadDir, uploadArtifactInfo, repoKey);
-    }
-
-    /**
-     * deploy bundle and update response
-     *
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param uploadDir           - temp folder
-     * @param uploadArtifactInfo  - upload artifact info
-     * @param repoKey             - repo key
-     */
-    private void deployBundle(RestResponse artifactoryResponse, String uploadDir, UploadArtifactInfo uploadArtifactInfo,
-            String repoKey) {
-        try {
-            LocalRepoDescriptor localRepoDescriptor = repositoryService.localOrCachedRepoDescriptorByKey(repoKey);
-            BasicStatusHolder statusHolder = new BasicStatusHolder();
-            // deploy file to repository
-            File bundleFile = new File(uploadDir, uploadArtifactInfo.getFileName());
-            deployService.deployBundle(bundleFile, localRepoDescriptor, statusHolder, false);
-            // update feedback message
-            updateFeedbackMsg(artifactoryResponse, statusHolder);
-            // delete tmp file
-            Files.removeFile(bundleFile);
-            String artifactPath = uploadArtifactInfo.getUnitInfo().getPath();
-            UploadedArtifactInfo uploadedArtifactInfo = new UploadedArtifactInfo(
-                    TreeUtils.shouldProvideTreeLink(localRepoDescriptor, artifactPath),
-                    localRepoDescriptor.getKey(), artifactPath);
-            artifactoryResponse.iModel(uploadedArtifactInfo);
-
-        } catch (Exception e) {
-            artifactoryResponse.error(e.getMessage());
-            log.error(e.toString());
-            artifactoryResponse.error(DeployUtil.getDeployError(uploadArtifactInfo.getFileName(), repoKey, e));
-        }
-    }
-
-    /**
-     * update error and warn feedback msg
-     *
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param statusHolder        - msg status holder
-     */
-    private void updateFeedbackMsg(RestResponse artifactoryResponse, BasicStatusHolder statusHolder) {
-        if (statusHolder.hasErrors()) {
-            artifactoryResponse.error(statusHolder.getErrors().get(0).getMessage());
-        } else if (statusHolder.hasWarnings()) {
-            artifactoryResponse.warn(statusHolder.getWarnings().get(0).getMessage());
-        } else {
-            artifactoryResponse.info(statusHolder.getStatusMsg());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/deploy/ArtifactDeployService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/deploy/ArtifactDeployService.java
deleted file mode 100644
index 732ad02..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/deploy/ArtifactDeployService.java
+++ /dev/null
@@ -1,155 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.deploy;
-
-import org.artifactory.api.artifact.UnitInfo;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.maven.MavenArtifactInfo;
-import org.artifactory.api.repo.DeployService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.api.request.ArtifactoryRequestBase;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoBaseDescriptor;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.deploy.UploadArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.deploy.UploadedArtifactInfo;
-import org.artifactory.ui.utils.TreeUtils;
-import org.artifactory.util.Files;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.File;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ArtifactDeployService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactDeployService.class);
-
-    @Autowired
-    DeployService deployService;
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String uploadDir = ContextHelper.get().getArtifactoryHome().getTempUploadDir().getAbsolutePath();
-        // get model data
-        UploadArtifactInfo uploadArtifactInfo = (UploadArtifactInfo) request.getImodel();
-        //deploy file
-        deploy(uploadArtifactInfo, uploadDir, response);
-    }
-
-
-    /**
-     * deploy file to repository
-     *
-     * @param uploadArtifactInfo  - upload artifact info
-     * @param uploadDir           - upload temp folder
-     * @param artifactoryResponse - encapsulate data require for response
-     */
-    private void deploy(UploadArtifactInfo uploadArtifactInfo, String uploadDir, RestResponse artifactoryResponse) {
-        String fileName = uploadArtifactInfo.getFileName();
-        UnitInfo unitInfo = uploadArtifactInfo.getUnitInfo();
-        Properties properties = parseMatrixParams(unitInfo);
-        String repoKey = uploadArtifactInfo.getRepoKey();
-        RepoBaseDescriptor repoDescriptor = repositoryService.localOrCachedRepoDescriptorByKey(repoKey);
-        if (repoDescriptor == null) repoDescriptor = repositoryService.virtualRepoDescriptorByKey(repoKey);
-
-        try {
-            File file = new File(uploadDir, fileName);
-
-            // deploy file with pom
-            if (uploadArtifactInfo.isPublishUnitConfigFile()) {
-                deployService.deploy(repoDescriptor, unitInfo, file, uploadArtifactInfo.getUnitConfigFileContent(),
-                        true, false, properties);
-
-                if (repoDescriptor instanceof LocalRepoDescriptor) deletePomFile(unitInfo, (LocalRepoDescriptor)repoDescriptor);
-            } else {
-                deployService.deploy(repoDescriptor, unitInfo, file, properties);
-            }
-
-            // delete tmp file
-            Files.removeFile(file);
-            String artifactPath = uploadArtifactInfo.getUnitInfo().getPath();
-            boolean shouldProvideTreeLink = repoDescriptor instanceof LocalRepoDescriptor ? TreeUtils.shouldProvideTreeLink((LocalRepoDescriptor)repoDescriptor, artifactPath) : false;
-
-            UploadedArtifactInfo uploadedArtifactInfo = new UploadedArtifactInfo(shouldProvideTreeLink,repoDescriptor.getKey(), artifactPath);
-            artifactoryResponse.iModel(uploadedArtifactInfo);
-        } catch (RepoRejectException e) {
-            log.error(e.toString());
-            String err = DeployUtil.getDeployError(fileName, repoKey, e);
-            artifactoryResponse.error(err);
-        }
-    }
-
-    /**
-     * get uploaded file Properties
-     *
-     * @param unitInfo - unit info - debian / artifact
-     * @return
-     */
-    private Properties parseMatrixParams(UnitInfo unitInfo) {
-        Properties props;
-        props = (Properties) InfoFactoryHolder.get().createProperties();
-        String targetPathFieldValue = unitInfo.getPath();
-        //  targetPathFieldValue = updateTargetPathValue(unitInfo, targetPathFieldValue);
-        int matrixParamStart = targetPathFieldValue.indexOf(Properties.MATRIX_PARAMS_SEP);
-        if (matrixParamStart > 0) {
-            ArtifactoryRequestBase.processMatrixParams(props, targetPathFieldValue.substring(matrixParamStart));
-            updateUnitInfo(unitInfo);
-        }
-        return props;
-    }
-
-    /**
-     * update target path value
-     *
-     * @param unitInfo             - unit  info
-     * @param targetPathFieldValue - target path value
-     * @return
-     */
-    private String updateTargetPathValue(UnitInfo unitInfo, String targetPathFieldValue) {
-        if (unitInfo.getPath().endsWith("/")) {
-            targetPathFieldValue = unitInfo.getPath().substring(0, unitInfo.getPath().length() - 1);
-            unitInfo.setPath(targetPathFieldValue);
-        }
-        return targetPathFieldValue;
-    }
-
-    /**
-     * update unit info path after removing path param
-     *
-     * @param unitInfo
-     */
-    private void updateUnitInfo(UnitInfo unitInfo) {
-        String[] splitedPath = unitInfo.getPath().split(";");
-        if (splitedPath.length > 0) {
-            unitInfo.setPath(splitedPath[0]);
-        }
-    }
-
-    private void deletePomFile(UnitInfo unitInfo, LocalRepoDescriptor localRepoDescriptor) {
-        RepoPath repoPath = InternalRepoPathFactory.create(localRepoDescriptor.getKey(), unitInfo.getPath());
-        MavenArtifactInfo mavenArtifactInfo = (MavenArtifactInfo) unitInfo;
-        RepoPath pomPath = InternalRepoPathFactory.create(repoPath.getParent(),
-                mavenArtifactInfo.getArtifactId() + "-" + mavenArtifactInfo.getVersion() + ".pom");
-        Files.removeFile(new File(pomPath.getPath()));
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/deploy/ArtifactMultiDeployService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/deploy/ArtifactMultiDeployService.java
deleted file mode 100644
index 2cf55f3..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/deploy/ArtifactMultiDeployService.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.deploy;
-
-import com.sun.jersey.multipart.FormDataMultiPart;
-import org.artifactory.api.artifact.ArtifactInfo;
-import org.artifactory.api.artifact.UnitInfo;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.DeployService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.api.request.ArtifactoryRequestBase;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.md.Properties;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.deploy.UploadArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.deploy.UploadedArtifactInfo;
-import org.artifactory.ui.utils.MultiPartUtils;
-import org.artifactory.ui.utils.TreeUtils;
-import org.artifactory.util.Files;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ArtifactMultiDeployService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactMultiDeployService.class);
-
-    @Autowired
-    DeployService deployService;
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String repoKey = request.getQueryParamByKey("repoKey");
-        String path = request.getQueryParamByKey("path");
-        List<String> fileNames = saveFileToTempFolder(request, response);
-
-        if (!fileNames.isEmpty()) {
-            //deploy file
-            String savedUniqueFileName = fileNames.get(0);
-            String actualFileName = fileNames.get(1);
-            deploy(savedUniqueFileName, actualFileName, response, repoKey, path);
-        }
-    }
-
-    /**
-     * upload file to temp folder
-     *
-     * @param artifactoryRequest - encapsulate data related to request
-     * @param response           - encapsulate data require for response
-     * @return - true if uploaded successful
-     */
-    private List<String> saveFileToTempFolder(ArtifactoryRestRequest artifactoryRequest, RestResponse response) {
-        String uploadDir = ContextHelper.get().getArtifactoryHome().getTempUploadDir().getAbsolutePath();
-        List<String> fileNames = new ArrayList<>();
-        try {
-            MultiPartUtils.createTempFolderIfNotExist(uploadDir);
-            // get upload model
-            UploadArtifactInfo uploadArtifactInfo = (UploadArtifactInfo) artifactoryRequest.getImodel();
-            // save file data tto temp
-            FormDataMultiPart formDataMultiPart = uploadArtifactInfo.fetchFormDataMultiPart();
-            String fileName = formDataMultiPart.getFields().get("file").get(0).getContentDisposition().getFileName();
-            MultiPartUtils.saveFileDataToTemp(centralConfigService, formDataMultiPart, uploadDir,
-                    fileNames, true);
-            fileNames.add(fileName);
-        } catch (Exception e) {
-            response.error(e.getMessage());
-        }
-        return fileNames;
-    }
-
-    /**
-     * deploy file to repository
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     */
-    private void deploy(String savedUniqueFileName, String actualFileName, RestResponse artifactoryResponse,
-            String repoKey, String path) {
-        String uploadDir = ContextHelper.get().getArtifactoryHome().getTempUploadDir().getAbsolutePath();
-        Properties properties = parseMatrixParams(actualFileName);
-        LocalRepoDescriptor localRepoDescriptor = repositoryService.localOrCachedRepoDescriptorByKey(repoKey);
-        try {
-            File file = new File(uploadDir, savedUniqueFileName);
-            UnitInfo unitInfo = new ArtifactInfo(path);
-            // deploy file
-            deployService.deploy(localRepoDescriptor, unitInfo, file, properties);
-            // delete tmp file
-            Files.removeFile(file);
-            boolean showUrl = TreeUtils.shouldProvideTreeLink(localRepoDescriptor, unitInfo.getPath());
-            UploadedArtifactInfo uploadedArtifactInfo = new UploadedArtifactInfo(showUrl, repoKey, unitInfo.getPath());
-            artifactoryResponse.iModel(uploadedArtifactInfo);
-        } catch (RepoRejectException e) {
-            log.error(e.toString());
-            artifactoryResponse.error(DeployUtil.getDeployError(actualFileName, repoKey, e));
-        }
-    }
-
-    /**
-     * get uploaded file Properties
-     *
-     * @param fileName - file name
-     * @return
-     */
-    private Properties parseMatrixParams(String fileName) {
-        Properties props;
-        props = (Properties) InfoFactoryHolder.get().createProperties();
-        String targetPathFieldValue = fileName;
-        int matrixParamStart = targetPathFieldValue.indexOf(Properties.MATRIX_PARAMS_SEP);
-        if (matrixParamStart > 0) {
-            ArtifactoryRequestBase.processMatrixParams(props, targetPathFieldValue.substring(matrixParamStart));
-        }
-        return props;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/deploy/ArtifactUploadService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/deploy/ArtifactUploadService.java
deleted file mode 100644
index 322be5c..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/deploy/ArtifactUploadService.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.deploy;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.maven.MavenService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.deploy.UploadArtifactInfo;
-import org.artifactory.ui.utils.MultiPartUtils;
-import org.artifactory.ui.utils.UnitUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ArtifactUploadService implements RestService {
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Autowired
-    private MavenService mavenService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String uploadDir = ContextHelper.get().getArtifactoryHome().getTempUploadDir().getAbsolutePath();
-        try {
-            MultiPartUtils.createTempFolderIfNotExist(uploadDir);
-            // get upload model
-            UploadArtifactInfo uploadArtifactInfo = (UploadArtifactInfo) request.getImodel();
-            // save file data tto temp
-            List<String> fileNames = new ArrayList<>();
-            MultiPartUtils.saveFileDataToTemp(centralConfigService, uploadArtifactInfo.fetchFormDataMultiPart(),
-                    uploadDir, fileNames, false);
-
-            File file = new File(uploadDir, fileNames.get(0));
-            // get artifact info
-            uploadArtifactInfo = UnitUtils.getUnitInfo(file, uploadArtifactInfo, mavenService);
-            response.iModel(uploadArtifactInfo);
-        }catch (Exception e){
-            response.error(e.getMessage());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/deploy/CancelArtifactUpload.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/deploy/CancelArtifactUpload.java
deleted file mode 100644
index 439d3c8..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/deploy/CancelArtifactUpload.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.deploy;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.deploy.UploadArtifactInfo;
-import org.artifactory.util.Files;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletResponse;
-import java.io.File;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CancelArtifactUpload implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(CancelArtifactUpload.class);
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String uploadDir = ContextHelper.get().getArtifactoryHome().getTempUploadDir().getAbsolutePath();
-        String fileName = ((UploadArtifactInfo) request.getImodel()).getFileName();
-        File file = new File(uploadDir, fileName);
-        // remove artifact  from temp folder
-        try {
-            if (file.exists()) {
-                Files.removeFile(file);
-            }
-        } catch (Exception e) {
-            log.debug("error with deleting temporary file");
-            response.responseCode(HttpServletResponse.SC_EXPECTATION_FAILED);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/deploy/DeployServiceFactory.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/deploy/DeployServiceFactory.java
deleted file mode 100644
index 96478be..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/deploy/DeployServiceFactory.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.deploy;
-
-import org.springframework.beans.factory.annotation.Lookup;
-
-/**
- * @author Chen Keinan
- */
-public abstract class DeployServiceFactory {
-
-    // upload  artifact
-    @Lookup
-    public abstract ArtifactUploadService artifactUpload();
-
-    // upload  artifact bundle
-    @Lookup
-    public abstract ArtifactDeployBundleService artifactDeployBundle();
-
-    // deploy  artifact
-    @Lookup
-    public abstract ArtifactDeployService deployArtifact();
-
-    // deploy  artifact
-    @Lookup
-    public abstract CancelArtifactUpload cancelArtifactUpload();
-
-    @Lookup
-    public abstract ArtifactMultiDeployService artifactMultiDeploy();
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/deploy/DeployUtil.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/deploy/DeployUtil.java
deleted file mode 100644
index b683d66..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/deploy/DeployUtil.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.deploy;
-
-import org.artifactory.api.repo.exception.RepoRejectException;
-import org.artifactory.exception.CancelException;
-
-/**
- * @author Dan Feldman
- */
-public class DeployUtil {
-
-    public static String getDeployError(String fileName, String repoKey, Exception e) {
-        String err = "Failed to deploy file: '" + fileName + "' to Repository: " + repoKey +
-                ". Please check the log file for more details.";
-        //Unfortunately Spring really messes up the exception that's thrown by the UploadService (was supposed to be
-        //RepoRejectException with CancelException as the cause, instead we get RepoRejectException as the cause
-        //And a concatenated string of both messages. the return code is also missing.
-        if (e instanceof CancelException) {
-            err = "Failed to deploy file: '" + fileName + "' to Repository: " + repoKey + ": " + e.getMessage();
-        } else if (e instanceof RepoRejectException) {
-            if (e.getMessage().contains(CancelException.class.getName())) {
-                err = e.getMessage().replace(". " + CancelException.class.getName(), "");
-            }
-        }
-        return err;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/DeleteArtifactsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/DeleteArtifactsService.java
deleted file mode 100644
index 13478f6..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/DeleteArtifactsService.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.common.StatusHolder;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.DeleteArtifact;
-import org.artifactory.ui.rest.model.artifacts.search.DeleteArtifactsModel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Gidi Shabat
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DeleteArtifactsService<T extends DeleteArtifactsModel> implements RestService<T> {
-    private static final Logger log = LoggerFactory.getLogger(DeleteArtifactsService.class);
-
-    @Autowired
-    private RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-        DeleteArtifactsModel model = request.getImodel();
-        for (DeleteArtifact deleteArtifactModel : model.getArtifacts()) {
-            String repoKey = deleteArtifactModel.getRepoKey();
-            String path = deleteArtifactModel.getPath();
-            if(StringUtils.isNotBlank(repoKey) && StringUtils.isNotBlank(path)) {
-                RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-                // delete artifact from repo path
-                StatusHolder statusHolder = deleteArtifact(repoPath);
-                // update response data
-                updateResponseData(response, statusHolder, repoPath);
-            }else {
-                log.warn("Failed to delete item : {} ", repoKey+"/"+path);
-            }
-        }
-    }
-
-    /**
-     * update response feedback
-     */
-    private void updateResponseData(RestResponse artifactoryResponse, StatusHolder statusHolder, RepoPath repoPath) {
-        if (statusHolder.isError()) {
-            artifactoryResponse.error("Fail to delete the artifact : "+repoPath);
-        } else {
-            artifactoryResponse.info("Successfully deleted artifacts");
-        }
-    }
-
-    /**
-     * un deploy artifact from repo path
-     *
-     * @param repoPath - artifact repo path
-     * @return - status of the un deploy
-     */
-    protected StatusHolder deleteArtifact(RepoPath repoPath) {
-        return repositoryService.undeploy(repoPath, true, true);
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/SearchServiceFactory.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/SearchServiceFactory.java
deleted file mode 100644
index a81452d..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/SearchServiceFactory.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search;
-
-import org.artifactory.ui.rest.model.artifacts.search.DeleteArtifactsModel;
-import org.artifactory.ui.rest.service.artifacts.search.checksumsearch.ChecksumSearchService;
-import org.artifactory.ui.rest.service.artifacts.search.classsearch.ClassSearchService;
-import org.artifactory.ui.rest.service.artifacts.search.gavcsearch.GavcSearchService;
-import org.artifactory.ui.rest.service.artifacts.search.packagesearch.GetPackageSearchOptionsService;
-import org.artifactory.ui.rest.service.artifacts.search.packagesearch.PackageSearchCriteriaToNativeAqlService;
-import org.artifactory.ui.rest.service.artifacts.search.packagesearch.PackageSearchService;
-import org.artifactory.ui.rest.service.artifacts.search.propertysearch.GetPropertySetsService;
-import org.artifactory.ui.rest.service.artifacts.search.propertysearch.PropertySearchService;
-import org.artifactory.ui.rest.service.artifacts.search.quicksearch.QuickSearchService;
-import org.artifactory.ui.rest.service.artifacts.search.remotesearch.RemoteSearchService;
-import org.artifactory.ui.rest.service.artifacts.search.searchresults.*;
-import org.artifactory.ui.rest.service.artifacts.search.trashsearch.TrashSearchService;
-import org.springframework.beans.factory.annotation.Lookup;
-
-/**
- * @author Chen Keinan
- */
-public abstract class SearchServiceFactory {
-
-    // search services
-    @Lookup
-    public abstract QuickSearchService quickSearchService();
-
-    @Lookup
-    public abstract ClassSearchService classSearchService();
-
-    @Lookup
-    public abstract GavcSearchService gavcSearchService();
-
-    @Lookup
-    public abstract PropertySearchService propertySearchService();
-
-    @Lookup
-    public abstract PackageSearchService packageSearch();
-
-    @Lookup
-    public abstract PackageSearchCriteriaToNativeAqlService PackageSearchCriteriaToNativeAql();
-
-    @Lookup
-    public abstract GetPackageSearchOptionsService packageSearchOptions();
-
-    @Lookup
-    public abstract SaveSearchResultsService saveSearchResults();
-
-    @Lookup
-    public abstract GetPropertySetsService getPropertySetsService();
-
-    @Lookup
-    public abstract ChecksumSearchService checksumSearchService();
-
-    @Lookup
-    public abstract RemoteSearchService remoteSearchService();
-
-    @Lookup
-    public abstract TrashSearchService trashSearchService();
-
-    @Lookup
-    public abstract DeleteArtifactsService<DeleteArtifactsModel> deleteArtifactsService();
-
-    @Lookup
-    public abstract GetSearchResultsService getSearchResults();
-
-    @Lookup
-    public abstract RemoveSearchResultsService removeSearchResults();
-
-    @Lookup
-    public abstract SubtractSearchResultsService subtractSearchResults();
-
-    @Lookup
-    public abstract IntersectSearchResultsService intersectSearchResults();
-
-    @Lookup
-    public abstract AddSearchResultsService addSearchResults();
-
-    @Lookup
-    public abstract ExportSearchResultsService exportSearchResults();
-
-    @Lookup
-    public abstract CopySearchResultsService copySearchResults();
-
-    @Lookup
-    public abstract MoveSearchResultsService moveSearchResults();
-
-    @Lookup
-    public abstract DiscardFromResultsService discardResults();
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/checksumsearch/ChecksumSearchService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/checksumsearch/ChecksumSearchService.java
deleted file mode 100644
index 0a38871..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/checksumsearch/ChecksumSearchService.java
+++ /dev/null
@@ -1,119 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.checksumsearch;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.SearchService;
-import org.artifactory.api.search.artifact.ArtifactSearchResult;
-import org.artifactory.api.search.artifact.ChecksumSearchControls;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.search.SearchResult;
-import org.artifactory.ui.rest.model.artifacts.search.checksumsearch.ChecksumSearch;
-import org.artifactory.ui.rest.model.artifacts.search.quicksearch.QuickSearchResult;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ChecksumSearchService implements RestService {
-
-    @Autowired
-    private SearchService searchService;
-
-    @Autowired
-    private AuthorizationService authorizationService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        ChecksumSearch checksumSearch = (ChecksumSearch) request.getImodel();
-        ChecksumSearchControls checksumSearchControl = getChecksumSearchControl(checksumSearch);
-        if (isSearchEmptyOrWildCardOnly(checksumSearchControl)) {
-            response.error("Please enter a valid checksum to search for");
-            return;
-        }
-        // search checksum artifact
-        ItemSearchResults<ArtifactSearchResult> checksumResults = searchService.getArtifactsByChecksumResults(
-                checksumSearchControl);
-        // update model search
-        List<QuickSearchResult> checksumResultList = updateSearchModels(checksumResults,request);
-        int maxResults = ConstantValues.searchMaxResults.getInt();
-        long resultsCount;
-        if (checksumSearchControl.isLimitSearchResults() && checksumResultList.size() > maxResults) {
-            checksumResultList = checksumResultList.subList(0, maxResults);
-            resultsCount = checksumResultList.size() == 0 ? 0 : checksumResults.getFullResultsCount();
-        } else {
-            resultsCount = checksumResultList.size();
-        }
-        // update response
-        SearchResult model = new SearchResult(checksumResultList, checksumSearch.getChecksum(),
-                resultsCount, checksumSearchControl.isLimitSearchResults());
-        model.addNotifications(response);
-        response.iModel(model);
-    }
-
-    /**
-     * update search model with results
-     *
-     * @param checksumResults - checksum search result
-     * @return list of search models
-     */
-    private List<QuickSearchResult> updateSearchModels(ItemSearchResults<ArtifactSearchResult> checksumResults,
-                                                       ArtifactoryRestRequest request) {
-        List<QuickSearchResult> checksumResultList = new ArrayList<>();
-        checksumResults.getResults().stream()
-                .filter(this::filterNoReadResults)
-                .forEach(checksumResult -> checksumResultList.add(new QuickSearchResult(checksumResult,request)));
-        return checksumResultList;
-    }
-
-    private boolean filterNoReadResults(ArtifactSearchResult checksumResult) {
-        RepoPath repoPath = RepoPathFactory.create(checksumResult.getRepoKey(), checksumResult.getRelativePath());
-        return authorizationService.canRead(repoPath);
-    }
-
-
-    /**
-     * check if search is empty or contain wildcard only
-     *
-     * @param checksumSearchControls
-     * @return if true - search is empty or containing wild card only
-     */
-    private boolean isSearchEmptyOrWildCardOnly(ChecksumSearchControls checksumSearchControls) {
-        return checksumSearchControls.isEmpty() || checksumSearchControls.isWildcardsOnly();
-    }
-
-    /**
-     * create checksum search control
-     *
-     * @return Checksum search controls
-     */
-    private ChecksumSearchControls getChecksumSearchControl(ChecksumSearch checksumSearch) {
-        String query = checksumSearch.getChecksum();
-        ChecksumSearchControls searchControls = new ChecksumSearchControls();
-        if (StringUtils.isNotBlank(query)) {
-            if (StringUtils.length(query) == ChecksumType.md5.length()) {
-                searchControls.addChecksum(ChecksumType.md5, query);
-                searchControls.setLimitSearchResults(true);
-            } else if (StringUtils.length(query) == ChecksumType.sha1.length()) {
-                searchControls.addChecksum(ChecksumType.sha1, query);
-            }
-            searchControls.setSelectedRepoForSearch(checksumSearch.getSelectedRepositories());
-        }
-        return searchControls;
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/classsearch/ClassSearchService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/classsearch/ClassSearchService.java
deleted file mode 100644
index 97a5099..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/classsearch/ClassSearchService.java
+++ /dev/null
@@ -1,115 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.classsearch;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.SearchService;
-import org.artifactory.api.search.archive.ArchiveSearchControls;
-import org.artifactory.api.search.archive.ArchiveSearchResult;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.search.SearchResult;
-import org.artifactory.ui.rest.model.artifacts.search.classsearch.ClassSearch;
-import org.artifactory.ui.rest.model.artifacts.search.classsearch.ClassSearchResult;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ClassSearchService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(ClassSearchService.class);
-
-    @Autowired
-    private SearchService searchService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        ClassSearch classSearch = (ClassSearch) request.getImodel();
-        // get artifact search control instance
-        ArchiveSearchControls archiveSearchControl = getArchiveSearchControl(classSearch);
-        // check if search empty or contain wild card only
-        if (isSearchEmptyOrWildCardOnly(archiveSearchControl)) {
-            response.error("Search term empty or containing only wildcards is not permitted");
-            return;
-        }
-        try {
-            List<ClassSearchResult> classSearchResults = Lists.newArrayList();
-            ItemSearchResults<ArchiveSearchResult> archiveSearchResults = searchService.searchArchiveContent( archiveSearchControl);
-            for (ArchiveSearchResult archiveSearchResult : archiveSearchResults.getResults()) {
-                classSearchResults.add(new ClassSearchResult(archiveSearchResult,request));
-            }
-            long resultsCount;
-            int maxResults = ConstantValues.searchMaxResults.getInt();
-            if (archiveSearchControl.isLimitSearchResults() && classSearchResults.size() > maxResults) {
-                classSearchResults = classSearchResults.subList(0, maxResults);
-                resultsCount = classSearchResults.size() == 0 ? 0 : archiveSearchResults.getFullResultsCount();
-            } else {
-                resultsCount = classSearchResults.size();
-            }
-            SearchResult model = new SearchResult(classSearchResults, archiveSearchControl.getQueryDisplay(),
-                    resultsCount, archiveSearchControl.isLimitSearchResults());
-            model.addNotifications(response);
-            response.iModel(model);
-        } catch (Exception e) {
-            log.debug(e.toString());
-            response.error(e.getMessage());
-        }
-    }
-
-    /**
-     * check if search is empty or contain wildcard only
-     *
-     * @param archiveSearchControl
-     * @return if true - search is empty or containing wild card only
-     */
-    private boolean isSearchEmptyOrWildCardOnly(ArchiveSearchControls archiveSearchControl) {
-        return archiveSearchControl.isEmpty() || archiveSearchControl.isWildcardsOnly();
-    }
-
-    /**
-     * create artifact search control from class search instance
-     *
-     * @param classSearch - class search instance
-     * @return artifact search control instance
-     */
-    private ArchiveSearchControls getArchiveSearchControl(ClassSearch classSearch) {
-        ArchiveSearchControls archiveSearchControls = new ArchiveSearchControls();
-        archiveSearchControls.setSelectedRepoForSearch(classSearch.getSelectedRepositories());
-        archiveSearchControls.setLimitSearchResults(!classSearch.getSelectedRepositories().isEmpty());
-        archiveSearchControls.setPath(classSearch.getPath());
-        archiveSearchControls.setName(classSearch.getName());
-        archiveSearchControls.setSearchClassResourcesOnly(classSearch.isSearchClassOnly());
-        archiveSearchControls.setLimitSearchResults(true);
-        archiveSearchControls.setExcludeInnerClasses(classSearch.isExcludeInnerClasses());
-        return archiveSearchControls;
-    }
-
-    /**
-     * add wild card to query
-     *
-     * @param artifactSearchControls - quick search model
-     */
-    private void setQueryWildCard(ArchiveSearchControls artifactSearchControls) {
-        String query = artifactSearchControls.getName();
-        if (StringUtils.isNotBlank(query)) {
-            StringBuilder queryBuilder = new StringBuilder();
-            queryBuilder.append(query);
-
-            if (!query.endsWith("*") && !query.endsWith("?")) {
-                queryBuilder.append("*");
-            }
-            artifactSearchControls.setName(queryBuilder.toString());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/gavcsearch/GavcSearchService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/gavcsearch/GavcSearchService.java
deleted file mode 100644
index 6240fd4..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/gavcsearch/GavcSearchService.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.gavcsearch;
-
-import com.google.common.collect.Lists;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.SearchService;
-import org.artifactory.api.search.gavc.GavcSearchControls;
-import org.artifactory.api.search.gavc.GavcSearchResult;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.search.SearchResult;
-import org.artifactory.ui.rest.model.artifacts.search.gavcsearch.GavcResult;
-import org.artifactory.ui.rest.model.artifacts.search.gavcsearch.GavcSearch;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GavcSearchService implements RestService {
-
-    @Autowired
-    private SearchService searchService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        GavcSearch gavcSearch = (GavcSearch) request.getImodel();
-        GavcSearchControls gavcSearchControls = getGavcSearchControls(gavcSearch);
-
-        if (isSearchEmptyOrWildCardOnly(gavcSearchControls)) {
-            response.error("Search term empty or containing only wildcards is not permitted");
-            return;
-        }
-        // search gavc
-        ItemSearchResults<GavcSearchResult> searchControls = search(gavcSearchControls);
-        List<GavcResult> gavcResults = Lists.newArrayList();
-        for (GavcSearchResult gavcSearchResult : searchControls.getResults()) {
-            gavcResults.add(new GavcResult(gavcSearchResult,request));
-        }
-        int maxResults = ConstantValues.searchMaxResults.getInt();
-        long resultsCount;
-        if (gavcSearchControls.isLimitSearchResults() && gavcResults.size() > maxResults) {
-            gavcResults = gavcResults.subList(0, maxResults);
-            resultsCount = gavcResults.size() == 0 ? 0 : searchControls.getFullResultsCount();
-        } else {
-            resultsCount = gavcResults.size();
-        }
-
-        // update response data
-        SearchResult model = new SearchResult(gavcResults, gavcSearchControls.getSearchExpression(),
-                resultsCount, gavcSearchControls.isLimitSearchResults());
-        model.addNotifications(response);
-        response.iModel(model);
-    }
-
-    /**
-     * check if search is empty or contain wildcard only
-     *
-     * @param gavcSearchControls
-     * @return if true - search is empty or containing wild card only
-     */
-    private boolean isSearchEmptyOrWildCardOnly(GavcSearchControls gavcSearchControls) {
-        return gavcSearchControls.isEmpty() || gavcSearchControls.isWildcardsOnly();
-    }
-
-    /**
-     * get gavc searcch controls
-     *
-     * @param gavcSearch - gavc search model
-     * @return - gave cearch control inctance
-     */
-    private GavcSearchControls getGavcSearchControls(GavcSearch gavcSearch) {
-        GavcSearchControls gavcSearchControls = new GavcSearchControls();
-        gavcSearchControls.setArtifactId(gavcSearch.getArtifactID());
-        gavcSearchControls.setGroupId(gavcSearch.getGroupID());
-        gavcSearchControls.setClassifier(gavcSearch.getClassifier());
-        gavcSearchControls.setVersion(gavcSearch.getVersion());
-        gavcSearchControls.setLimitSearchResults(true);
-        gavcSearchControls.setSelectedRepoForSearch(gavcSearch.getSelectedRepositories());
-        return gavcSearchControls;
-    }
-
-    /**
-     * Performs the search
-     *
-     * @param controls Search controls
-     * @return List of search results
-     */
-    private ItemSearchResults<GavcSearchResult> search(GavcSearchControls controls) {
-        return searchService.searchGavc(controls);
-    }
-
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/GetPackageSearchOptionsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/GetPackageSearchOptionsService.java
deleted file mode 100644
index 94e764a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/GetPackageSearchOptionsService.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.packagesearch;
-
-import com.google.common.collect.Lists;
-import org.apache.http.HttpStatus;
-import org.artifactory.aql.AqlService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.search.packagesearch.criteria.FieldSearchCriteria;
-import org.artifactory.ui.rest.model.artifacts.search.packagesearch.criteria.PackageSearchCriteria;
-import org.artifactory.ui.rest.model.artifacts.search.packagesearch.search.AqlUISearchModel;
-import org.artifactory.ui.rest.model.artifacts.search.packagesearch.search.AqlUISearchPackageTypeModel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-/**
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetPackageSearchOptionsService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(GetPackageSearchOptionsService.class);
-
-    private static final String AVAILABLE_PACKAGES = "availablePackages";
-
-    @Autowired
-    AqlService aqlService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String pkgType = request.getPathParamByKey("type");
-        pkgType = pkgType == null ? "" : pkgType;
-        //Special call to get package types that are available to search by;
-        if (pkgType.equalsIgnoreCase(AVAILABLE_PACKAGES)) {
-            response.iModelList(
-                    Stream.of(PackageSearchCriteria.PackageSearchType.values()).map(AqlUISearchPackageTypeModel::new)
-                            .collect(Collectors.toList()));
-
-            response.responseCode(HttpStatus.SC_OK);
-        } else {
-            try {
-                List<AqlUISearchModel> availableOptions = Lists.newArrayList();
-                availableOptions.addAll(PackageSearchCriteria.getCriteriaByPackage(pkgType)
-                                .stream()
-                                .map(PackageSearchCriteria::getModel)
-                                .collect(Collectors.toList())
-                );
-                // TODO: [by dan] limited to items domain for now - should allow more based on incoming parameter?
-                // TODO: [by dan] if pathParam "buildType" == artifact \ dependency -> return relevant field enum values
-                availableOptions.addAll(Stream.of(FieldSearchCriteria.values())
-                                .map(FieldSearchCriteria::getModel)
-                                .collect(Collectors.toList())
-                );
-                response.iModel(availableOptions);
-                response.responseCode(HttpStatus.SC_OK);
-            } catch (UnsupportedOperationException uoe) {
-                log.debug(uoe.getMessage(), uoe);
-                response.error(uoe.getMessage());
-            }
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/PackageSearchCriteriaToNativeAqlService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/PackageSearchCriteriaToNativeAqlService.java
deleted file mode 100644
index cd325d0..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/PackageSearchCriteriaToNativeAqlService.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.packagesearch;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.search.packagesearch.criteria.PackageSearchCriteria;
-import org.artifactory.ui.rest.model.artifacts.search.packagesearch.search.AqlUISearchModel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-import static org.artifactory.ui.rest.service.artifacts.search.packagesearch.util.PackageSearchHelper.buildItemQuery;
-
-/**
- * Search service that provides an abstraction over aql for UI searches.
- * Using {@link PackageSearchCriteria} you can specify any combination of field / property criterion from any aql domain
- * and link it to proper search and result models for the UI to consume
- *
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class PackageSearchCriteriaToNativeAqlService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(PackageSearchCriteriaToNativeAqlService.class);
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        List<AqlUISearchModel> searches = (List<AqlUISearchModel>) request.getModels();
-        //Build the query here to return native in response
-        AqlBase query = buildItemQuery(searches, true /*, boolean includeExtraFieldsInResult*/);
-        response.iModel(query.toNative(0)).responseCode(HttpStatus.SC_OK);
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/PackageSearchService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/PackageSearchService.java
deleted file mode 100644
index 71f4734..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/PackageSearchService.java
+++ /dev/null
@@ -1,136 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.packagesearch;
-
-import com.google.common.collect.HashMultimap;
-import com.google.common.collect.Sets;
-import org.apache.http.HttpStatus;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.aql.AqlService;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.result.rows.AqlBaseFullRowImpl;
-import org.artifactory.aql.util.AqlUtils;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.search.SearchResult;
-import org.artifactory.ui.rest.model.artifacts.search.packagesearch.criteria.PackageSearchCriteria;
-import org.artifactory.ui.rest.model.artifacts.search.packagesearch.result.PackageSearchResult;
-import org.artifactory.ui.rest.model.artifacts.search.packagesearch.search.AqlUISearchModel;
-import org.artifactory.util.CollectionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-import static org.artifactory.ui.rest.service.artifacts.search.packagesearch.util.PackageSearchHelper.buildItemQuery;
-
-/**
- * Search service that provides an abstraction over aql for UI searches.
- * Using {@link PackageSearchCriteria} you can specify any combination of field / property criterion from any aql domain
- * and link it to proper search and result models for the UI to consume
- *
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class PackageSearchService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(PackageSearchService.class);
-
-    @Autowired
-    AqlService aqlService;
-
-    @Autowired
-    AuthorizationService authService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        List<AqlUISearchModel> searches = (List<AqlUISearchModel>) request.getModels();
-        if (CollectionUtils.isNullOrEmpty(searches)) {
-            log.debug("Got empty search criteria for Package Search.");
-            response.error("Search criteria cannot be empty.");
-            response.responseCode(HttpStatus.SC_BAD_REQUEST);
-            return;
-        }
-        SearchResult model = search(searches);
-        setDownloadLinksOnModel((Set<PackageSearchResult>) model.getResults(), request);
-        model.addNotifications(response);
-        response.iModel(model);
-    }
-
-    public SearchResult search(List<AqlUISearchModel> searches) {
-        //Build the query here to return native in response
-        AqlBase query = buildItemQuery(searches, true /*, boolean includeExtraFieldsInResult*/);
-        String nativeQuery = query.toNative(0);
-        log.debug("strategies resolved to query: " + nativeQuery);
-        Set<PackageSearchResult> results = executeSearch(query);
-
-        // update response data
-        return new SearchResult(results, nativeQuery, results.size(), true);
-    }
-
-    private Set<PackageSearchResult> executeSearch(/*AqlDomainEnum domain,*/ AqlBase query) {
-        Set<PackageSearchResult> results = Sets.newHashSet();
-        long timer = System.currentTimeMillis();
-        List<AqlBaseFullRowImpl> queryResults = aqlService.executeQueryEager(query).getResults();
-        HashMultimap<RepoPath, AqlBaseFullRowImpl> resultsByPath = AqlUtils.aggregateResultsByPath(queryResults, authService);
-        reduceAggregatedResults(results, resultsByPath);
-        manipulateResultFields(results);
-        log.trace("Search found {} results in {} milliseconds", results.size(), System.currentTimeMillis() - timer);
-        return results;
-    }
-
-    /**
-     * Reduces all rows of a single path into one result that represents a single artifact and all extra fields that
-     * were requested with it and are a part of its criteria domain.
-     */
-    private void reduceAggregatedResults(Set<PackageSearchResult> results,
-            HashMultimap<RepoPath, AqlBaseFullRowImpl> resultsByPath) {
-        Set<PackageSearchResult> concurrentSet = Collections.newSetFromMap(new ConcurrentHashMap<>());
-        resultsByPath.keySet().parallelStream()
-                .forEach(path -> concurrentSet.add(
-                        resultsByPath.get(path).stream()
-                                .reduce(new PackageSearchResult(resultsByPath.get(path).iterator().next()),
-                                        PackageSearchResult::aggregateRow,
-                                        PackageSearchResult::merge)
-                ));
-        results.addAll(concurrentSet);
-    }
-
-    private void setDownloadLinksOnModel(Set<PackageSearchResult> results, ArtifactoryRestRequest request) {
-        results.stream()
-                .forEach(result -> result.setDownloadLinkAndActions(request));
-    }
-
-    /**
-     * Calls all AqlUISearchResultManipulators associated with each result's PackageType to manipulate
-     * any relevant fields that should be changed before returning to the UI.
-     */
-    private void manipulateResultFields(Set<PackageSearchResult> results) {
-        results.stream()
-                .forEach(result -> PackageSearchCriteria.getResultManipulatorsByPackage(result.getPackageType())
-                                .stream()
-                                .forEach(manipulator -> manipulator.manipulate(result))
-                );
-    }
-
-    // TODO: [by dan] for advanced (text-box) search in UI
-    //private AqlBase buildQuery(String query) {
-    // List<AqlBaseFullRowImpl> queryResults = aqlService.executeQueryEager(query).getResults();
-    //    return null;
-    //}
-
-    ///**
-    // * Goes over the given strategies and finds if any extra fields from domains other then 'item' are requested
-    // * for this query - if yes add the relevant includes to the query.
-    // */
-    // TODO: [by dan] implement if we decide to allow adding fields from different domains into the package search
-    //private void includeExtraFieldsInResultIfNeeded(List<AqlUISearchStrategy> strategies, AqlApiItem query,
-    //        boolean includeExtraFieldsInResult) { }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/result/AqlUISearchDockerV1ResultManipulator.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/result/AqlUISearchDockerV1ResultManipulator.java
deleted file mode 100644
index aa6a534..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/result/AqlUISearchDockerV1ResultManipulator.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.packagesearch.result;
-
-import org.artifactory.ui.rest.model.artifacts.search.packagesearch.criteria.PackageSearchCriteria;
-import org.artifactory.ui.rest.model.artifacts.search.packagesearch.result.PackageSearchResult;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Adds a docker image field as the search only returns tags and image prop is set on the _index_images.json file
- *
- * @author Dan Feldman
- */
-public class AqlUISearchDockerV1ResultManipulator implements AqlUISearchResultManipulator {
-    private static final Logger log = LoggerFactory.getLogger(AqlUISearchDockerV1ResultManipulator.class);
-
-    @Override
-    public void manipulate(PackageSearchResult result) {
-        if (!result.getExtraFields().keySet().contains(PackageSearchCriteria.dockerV1Image.name())) {
-            String tagName = result.getExtraFields().get(PackageSearchCriteria.dockerV1Tag.name()).iterator().next();
-            Matcher v1ImageMatcher = Pattern.compile(".*repositories/(.*)/" + tagName + "/tag.json")
-                    .matcher(result.getRelativePath());
-            if (v1ImageMatcher.matches()) {
-                String image = v1ImageMatcher.group(1);
-                log.debug("Docker V1 result manipulator adding field image to result extra fields - " +
-                        "artifact path: '{}', tag: '{}', image: '{}'", result.getRepoPath().toPath(), tagName, image);
-                result.getExtraFieldsMap().put(PackageSearchCriteria.dockerV1Image.name(), image);
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/result/AqlUISearchDummyResultManipulator.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/result/AqlUISearchDummyResultManipulator.java
deleted file mode 100644
index e00dae5..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/result/AqlUISearchDummyResultManipulator.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.packagesearch.result;
-
-import org.artifactory.ui.rest.model.artifacts.search.packagesearch.result.PackageSearchResult;
-
-/**
- * A result manipulator that does nothing just so we don't have to deal with null checks.
- *
- * @author Dan Feldman
- */
-public class AqlUISearchDummyResultManipulator implements AqlUISearchResultManipulator {
-
-    @Override
-    public void manipulate(PackageSearchResult result) {
-        //Dummy
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/result/AqlUISearchNpmResultManipulator.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/result/AqlUISearchNpmResultManipulator.java
deleted file mode 100644
index 037a3d9..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/result/AqlUISearchNpmResultManipulator.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.packagesearch.result;
-
-import org.artifactory.ui.rest.model.artifacts.search.packagesearch.criteria.PackageSearchCriteria;
-import org.artifactory.ui.rest.model.artifacts.search.packagesearch.result.PackageSearchResult;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Adds a scope field whenever a scoped package is being returned (name is @{scope}/{name})
- *
- * @author Dan Feldman
- */
-public class AqlUISearchNpmResultManipulator implements AqlUISearchResultManipulator {
-    private static final Logger log = LoggerFactory.getLogger(AqlUISearchNpmResultManipulator.class);
-
-    @Override
-    public void manipulate(PackageSearchResult result) {
-        String npmName = result.getExtraFieldsMap().get(PackageSearchCriteria.npmName.name()).iterator().next();
-        if (npmName.contains("@")) {
-            try {
-                String[] split = npmName.split("/");
-                log.debug("Manipulator adding npm scope: '{}' and changing package name to '{}'", split[0], split[1]);
-                result.getExtraFieldsMap().removeAll(PackageSearchCriteria.npmName.name());
-                result.getExtraFieldsMap().put(PackageSearchCriteria.npmName.name(), split[1]);
-                result.getExtraFieldsMap().put(PackageSearchCriteria.npmScope.name(), split[0]);
-            } catch (Exception e) {
-                log.warn("Error parsing npm package name: '{}", npmName);
-            }
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/result/AqlUISearchResultManipulator.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/result/AqlUISearchResultManipulator.java
deleted file mode 100644
index 91a0f69..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/result/AqlUISearchResultManipulator.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.packagesearch.result;
-
-import org.artifactory.ui.rest.model.artifacts.search.packagesearch.result.PackageSearchResult;
-
-/**
- * @author Dan Feldman
- */
-public interface AqlUISearchResultManipulator {
-
-    void manipulate(PackageSearchResult result);
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/strategy/AqlUIDockerV1ImageSearchStrategy.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/strategy/AqlUIDockerV1ImageSearchStrategy.java
deleted file mode 100644
index 2ba3232..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/strategy/AqlUIDockerV1ImageSearchStrategy.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.packagesearch.strategy;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.api.domain.sensitive.AqlApiItem;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.model.AqlComparatorEnum;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-
-/**
- * @author Dan Feldman
- */
-public class AqlUIDockerV1ImageSearchStrategy extends AqlUIFieldSearchStrategy {
-
-    public AqlUIDockerV1ImageSearchStrategy(AqlFieldEnum field, AqlDomainEnum[] subdomainPath) {
-        super(field, subdomainPath);
-    }
-
-    @Override
-    public AqlBase.OrClause toQuery() {
-        AqlBase.OrClause query = AqlApiItem.or();
-        values.stream().forEach(value -> {
-            AqlBase.AndClause mainAnd = AqlBase.and();
-            // adds a clause to the main or with library/value to try and match standard docker hub images.
-            AqlBase.AndClause libMatchAnd = AqlBase.and();
-            StringBuilder libMatcher = null;
-            if (!value.contains("library/")) {
-                libMatcher = new StringBuilder("repositories/library/");
-            }
-
-            StringBuilder nameMatcher = new StringBuilder("repositories/");
-            if (value.contains("*") || value.contains("?")) {
-                nameMatcher.append(value);
-                if (libMatcher != null) {
-                    libMatcher.append(value);
-                }
-            } else {
-                nameMatcher.append("*").append(value).append("*");
-                if (libMatcher != null) {
-                    libMatcher.append("*").append(value).append("*");
-                }
-            }
-
-            if (libMatcher != null) {
-                libMatcher.append("/**");
-                libMatchAnd.append(new AqlBase.CriteriaClause(field, Lists.newArrayList(AqlDomainEnum.items),
-                        AqlComparatorEnum.matches, libMatcher.toString()));
-                libMatchAnd.append(
-                        new AqlBase.CriteriaClause(AqlFieldEnum.itemName, Lists.newArrayList(AqlDomainEnum.items),
-                                AqlComparatorEnum.equals, "tag.json"));
-                query.append(libMatchAnd);
-            }
-
-            nameMatcher.append("/**");
-            mainAnd.append(new AqlBase.CriteriaClause(field, Lists.newArrayList(AqlDomainEnum.items),
-                    AqlComparatorEnum.matches, nameMatcher.toString()));
-            mainAnd.append(new AqlBase.CriteriaClause(AqlFieldEnum.itemName, Lists.newArrayList(AqlDomainEnum.items),
-                    AqlComparatorEnum.equals, "tag.json"));
-
-            query.append(mainAnd);
-        });
-        return query;
-    }
-
-    @Override
-    public boolean includePropsInResult() {
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/strategy/AqlUIDockerV2ImageDigestSearchStrategy.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/strategy/AqlUIDockerV2ImageDigestSearchStrategy.java
deleted file mode 100644
index 28f2b16..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/strategy/AqlUIDockerV2ImageDigestSearchStrategy.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.packagesearch.strategy;
-
-import org.artifactory.aql.api.domain.sensitive.AqlApiItem;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.model.AqlComparatorEnum;
-import org.artifactory.aql.model.AqlDomainEnum;
-
-/**
- * @author Dan Feldman
- */
-public class AqlUIDockerV2ImageDigestSearchStrategy extends AqlUIPropertySearchStrategy {
-
-    public AqlUIDockerV2ImageDigestSearchStrategy(String key, AqlDomainEnum[] subdomainPath) {
-        super(key, subdomainPath);
-    }
-
-    @Override
-    public AqlBase.OrClause toQuery() {
-        AqlBase.OrClause query = AqlApiItem.or();
-        values.stream().forEach(value -> {
-            AqlBase.AndClause and = AqlApiItem.and();
-            //The image digest
-            and.append(new AqlBase.PropertyCriteriaClause(key, comparator, value, subdomainPath));
-            //Don't return other sha256 tagged artifacts - only point to the tag's manifest.json which must have a
-            // value in the docker.repoName and docker.manifest props (to make sure it's v2)
-            and.append(
-                    new AqlBase.PropertyCriteriaClause("docker.repoName", AqlComparatorEnum.matches, "*", subdomainPath));
-            and.append(
-                    new AqlBase.PropertyCriteriaClause("docker.manifest", AqlComparatorEnum.matches, "*", subdomainPath));
-            query.append(and);
-        });
-        return query;
-    }
-
-    @Override
-    public boolean includePropsInResult() {
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/strategy/AqlUIDockerV2ImageSearchStrategy.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/strategy/AqlUIDockerV2ImageSearchStrategy.java
deleted file mode 100644
index 1d8427e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/strategy/AqlUIDockerV2ImageSearchStrategy.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.packagesearch.strategy;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.api.domain.sensitive.AqlApiItem;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.model.AqlComparatorEnum;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-
-/**
- * @author Dan Feldman
- */
-public class AqlUIDockerV2ImageSearchStrategy extends AqlUIPropertySearchStrategy {
-
-    public AqlUIDockerV2ImageSearchStrategy(String key, AqlDomainEnum[] subdomainPath) {
-        super(key, subdomainPath);
-    }
-
-    @Override
-    public AqlBase.OrClause toQuery() {
-        AqlBase.OrClause query = AqlApiItem.or();
-        values.stream().forEach(value -> {
-            AqlBase.AndClause pathAnd = AqlApiItem.and();
-            AqlBase.OrClause propOr = AqlApiItem.or();
-            //Don't search for docker v1 tags that have the same property on a different json descriptor
-            pathAnd.append(new AqlBase.CriteriaClause(AqlFieldEnum.itemName, Lists.newArrayList(AqlDomainEnum.items),
-                    AqlComparatorEnum.equals, "manifest.json"));
-            propOr.append(new AqlBase.PropertyCriteriaClause(key, AqlComparatorEnum.matches, value, subdomainPath));
-            propOr.append(
-                    new AqlBase.PropertyCriteriaClause(key, AqlComparatorEnum.matches, "library/" + value, subdomainPath));
-            pathAnd.append(propOr);
-            query.append(pathAnd);
-        });
-        return query;
-    }
-
-    @Override
-    public boolean includePropsInResult() {
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/strategy/AqlUIFieldSearchStrategy.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/strategy/AqlUIFieldSearchStrategy.java
deleted file mode 100644
index dbe602c..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/strategy/AqlUIFieldSearchStrategy.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.packagesearch.strategy;
-
-import com.google.common.collect.Lists;
-import org.artifactory.aql.api.domain.sensitive.AqlApiItem;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.model.AqlComparatorEnum;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.util.PathUtils;
-
-import java.util.List;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-/**
- * @author Dan Feldman
- */
-public class AqlUIFieldSearchStrategy implements AqlUISearchStrategy {
-
-    protected AqlFieldEnum field;
-    protected List<String> values;
-    protected List<AqlDomainEnum> subdomainPath;
-    protected AqlComparatorEnum comparator;
-
-    public AqlUIFieldSearchStrategy(AqlFieldEnum field, AqlDomainEnum[] subdomainPath) {
-        this.field = field;
-        this.subdomainPath = Stream.of(subdomainPath).collect(Collectors.toList());
-    }
-
-    public AqlUIFieldSearchStrategy(AqlFieldEnum field, List<AqlDomainEnum> subdomainPath) {
-        this.field = field;
-        this.subdomainPath = subdomainPath;
-    }
-
-    @Override
-    public AqlUIFieldSearchStrategy values(List<String> values) {
-        this.values = values;
-        return this;
-    }
-
-    @Override
-    public AqlUIFieldSearchStrategy values(String... values) {
-        this.values = Stream.of(values).collect(Collectors.toList());
-        return this;
-    }
-
-    @Override
-    public AqlUIFieldSearchStrategy comparator(AqlComparatorEnum comparator) {
-        this.comparator = comparator;
-        return this;
-    }
-
-    @Override
-    public AqlFieldEnum getSearchField() {
-        return field;
-    }
-
-    @Override
-    public String getSearchKey() {
-        return "";
-    }
-
-    @Override
-    public AqlBase.OrClause toQuery() {
-        AqlBase.OrClause query = AqlApiItem.or();
-        values.stream().forEach(value -> query.append(
-                new AqlBase.CriteriaClause(field, Lists.newArrayList(AqlDomainEnum.items), comparator, value)));
-        return query;
-    }
-
-    @Override
-    public boolean includePropsInResult() {
-        return false;
-    }
-
-    @Override
-    public String toString() {
-        return "AqlUIFieldSearchStrategy{" +
-                "field: " + field +
-                ", values: " + PathUtils.collectionToDelimitedString(values) +
-                ", comparator: " + comparator +
-                '}';
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/strategy/AqlUINpmNameSearchStrategy.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/strategy/AqlUINpmNameSearchStrategy.java
deleted file mode 100644
index 6cff545..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/strategy/AqlUINpmNameSearchStrategy.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.packagesearch.strategy;
-
-import org.artifactory.aql.api.domain.sensitive.AqlApiItem;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.model.AqlComparatorEnum;
-import org.artifactory.aql.model.AqlDomainEnum;
-
-/**
- * @author Dan Feldman
- */
-public class AqlUINpmNameSearchStrategy extends AqlUIPropertySearchStrategy {
-
-    public AqlUINpmNameSearchStrategy(String key, AqlDomainEnum[] subdomainPath) {
-        super(key, subdomainPath);
-    }
-
-    @Override
-    public AqlBase.OrClause toQuery() {
-        AqlBase.OrClause query = AqlApiItem.or();
-        values.stream().forEach(value -> {
-                    query.append(new AqlBase.PropertyCriteriaClause(key, AqlComparatorEnum.matches, value, subdomainPath));
-                    //match scoped packages
-                    query.append(
-                            new AqlBase.PropertyCriteriaClause(key, AqlComparatorEnum.matches, "@*" + value, subdomainPath));
-                }
-        );
-        return query;
-    }
-
-    @Override
-    public boolean includePropsInResult() {
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/strategy/AqlUINpmScopeSearchStrategy.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/strategy/AqlUINpmScopeSearchStrategy.java
deleted file mode 100644
index a4d58aa..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/strategy/AqlUINpmScopeSearchStrategy.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.packagesearch.strategy;
-
-import org.artifactory.aql.api.domain.sensitive.AqlApiItem;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.model.AqlComparatorEnum;
-import org.artifactory.aql.model.AqlDomainEnum;
-
-/**
- * @author Dan Feldman
- */
-public class AqlUINpmScopeSearchStrategy extends AqlUIPropertySearchStrategy {
-
-    public AqlUINpmScopeSearchStrategy(String key, AqlDomainEnum[] subdomainPath) {
-        super(key, subdomainPath);
-    }
-
-    @Override
-    public AqlBase.OrClause toQuery() {
-        AqlBase.OrClause query = AqlApiItem.or();
-        values.stream().forEach(value -> {
-            if(value.contains("@")) {
-                query.append(
-                        new AqlBase.PropertyCriteriaClause(key, AqlComparatorEnum.matches, value + "/*", subdomainPath));
-            } else {
-                query.append(
-                        new AqlBase.PropertyCriteriaClause(key, AqlComparatorEnum.matches, "@" + value + "/*", subdomainPath));
-            }
-        });
-        return query;
-    }
-
-    @Override
-    public boolean includePropsInResult() {
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/strategy/AqlUIPropertySearchStrategy.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/strategy/AqlUIPropertySearchStrategy.java
deleted file mode 100644
index 66a0ac5..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/strategy/AqlUIPropertySearchStrategy.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.packagesearch.strategy;
-
-import org.artifactory.aql.api.domain.sensitive.AqlApiItem;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.model.AqlComparatorEnum;
-import org.artifactory.aql.model.AqlDomainEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-import org.artifactory.util.PathUtils;
-
-import java.util.List;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-/**
- * @author Dan Feldman
- */
-public class AqlUIPropertySearchStrategy implements AqlUISearchStrategy {
-
-    protected String key;
-    protected List<String> values;
-    protected List<AqlDomainEnum> subdomainPath;
-    protected AqlComparatorEnum comparator;
-
-
-    public AqlUIPropertySearchStrategy(String key, AqlDomainEnum[] subdomainPath) {
-        this.key = key;
-        this.subdomainPath = Stream.of(subdomainPath).collect(Collectors.toList());
-    }
-
-    public AqlUIPropertySearchStrategy(String key, List<AqlDomainEnum> subdomainPath) {
-        this.key = key;
-        this.subdomainPath = subdomainPath;
-    }
-
-    @Override
-    public AqlUIPropertySearchStrategy values(List<String> values) {
-        this.values = values;
-        return this;
-    }
-
-    @Override
-    public AqlUIPropertySearchStrategy values(String... values) {
-        this.values = Stream.of(values).collect(Collectors.toList());
-        return this;
-    }
-
-    @Override
-    public AqlUIPropertySearchStrategy comparator(AqlComparatorEnum comparator) {
-        this.comparator = comparator;
-        return this;
-    }
-
-    @Override
-    public AqlFieldEnum getSearchField() {
-        return AqlFieldEnum.propertyKey;
-    }
-
-    @Override
-    public String getSearchKey() {
-        return key;
-    }
-
-    @Override
-    // TODO: [by dan] Changed to forced matches comparison due to Derby taking exponentially longer times to do it with equals
-    public AqlBase.OrClause toQuery() {
-        AqlBase.OrClause query = AqlApiItem.or();
-        values.stream().forEach(value ->
-                query.append(new AqlBase.PropertyCriteriaClause(key, AqlComparatorEnum.matches, value, subdomainPath)));
-        return query;
-    }
-
-    @Override
-    public boolean includePropsInResult() {
-        return true;
-    }
-
-    @Override
-    public String toString() {
-        return "AqlUIPropertySearchStrategy{" +
-                "property key: " + key +
-                ", values: " + PathUtils.collectionToDelimitedString(values) +
-                ", comparator: " + comparator +
-                '}';
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/strategy/AqlUISearchStrategy.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/strategy/AqlUISearchStrategy.java
deleted file mode 100644
index 5190504..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/strategy/AqlUISearchStrategy.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.packagesearch.strategy;
-
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.model.AqlComparatorEnum;
-import org.artifactory.aql.model.AqlFieldEnum;
-
-import java.util.List;
-
-/**
- * @author Dan Feldman
- */
-public interface AqlUISearchStrategy {
-
-    /**
-     * Sets the values to search for in the chosen field
-     */
-    AqlUISearchStrategy values(List<String> values);
-
-    /**
-     * Sets the values to search for in the chosen field
-     */
-    AqlUISearchStrategy values(String... values);
-
-    /**
-     * Sets the comparator to search with in the chosen field
-     */
-    AqlUISearchStrategy comparator(AqlComparatorEnum comparator);
-
-    /**
-     * Returns the field being searched
-     */
-    AqlFieldEnum getSearchField();
-
-    /**
-     * Returns the property key being searched for all property based strategies.
-     */
-    String getSearchKey();
-
-    /**
-     * Constructs a ready-to-go or clause based on the chosen strategy and requested criteria.
-     */
-    AqlBase.OrClause toQuery();
-
-    boolean includePropsInResult();
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/util/PackageSearchHelper.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/util/PackageSearchHelper.java
deleted file mode 100644
index 1449fe5..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/packagesearch/util/PackageSearchHelper.java
+++ /dev/null
@@ -1,130 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.packagesearch.util;
-
-import org.artifactory.aql.api.domain.sensitive.AqlApiItem;
-import org.artifactory.aql.api.internal.AqlBase;
-import org.artifactory.aql.result.rows.FullRow;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.ui.rest.model.artifacts.search.packagesearch.criteria.FieldSearchCriteria;
-import org.artifactory.ui.rest.model.artifacts.search.packagesearch.criteria.PackageSearchCriteria;
-import org.artifactory.ui.rest.model.artifacts.search.packagesearch.criteria.PackageSearchCriteria.PackageSearchType;
-import org.artifactory.ui.rest.model.artifacts.search.packagesearch.search.AqlUISearchModel;
-import org.artifactory.ui.rest.service.artifacts.search.packagesearch.strategy.AqlUIPropertySearchStrategy;
-import org.artifactory.ui.rest.service.artifacts.search.packagesearch.strategy.AqlUISearchStrategy;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author Dan Feldman
- */
-public class PackageSearchHelper {
-    private static final Logger log = LoggerFactory.getLogger(PackageSearchHelper.class);
-
-    /**
-     * Builds an AQL query from the given search models which are constructed when a criteria is sent by the UI.
-     */
-    public static AqlBase buildItemQuery(List<AqlUISearchModel> searches, boolean includePropertiesInResult
-            /*, boolean includeExtraFieldsInResult*/) {
-        List<AqlUISearchStrategy> strategies = buildStrategiesFromSearchModel(searches);
-        log.debug("input searches resolved to the following strategies: " + Arrays.toString(strategies.toArray()));
-
-        AqlApiItem.AndClause query = AqlApiItem.and();
-        strategies.stream()
-                .map(AqlUISearchStrategy::toQuery)
-                .filter(orClause -> !orClause.isEmpty())
-                .forEach(query::append);
-
-        int noOfPropKeys = 1;
-        AqlApiItem.OrClause propKeyIncluder = AqlApiItem.or();
-        if (includePropertiesInResult) {
-            noOfPropKeys = populatePropKeysToInclude(searches, propKeyIncluder);
-            AqlBase.PropertyResultFilterClause<AqlBase> resultFilter = AqlApiItem.propertyResultFilter();
-            if (!propKeyIncluder.isEmpty()) {
-                resultFilter.append(propKeyIncluder);
-                query.append(resultFilter);
-            }
-        }
-        AqlApiItem aql = AqlApiItem.create().filter(query);
-        //Result set size limit is calculated by (max ui results) * no of property keys being searched
-        // == UI result limit (i.e. 500)repo paths + all of the required properties that will be shown in UI.
-        log.debug("Total number of props for current package type being searched is {}, result set limit is set to {}",
-                noOfPropKeys, ConstantValues.searchMaxResults.getInt() * noOfPropKeys);
-        aql.limit(ConstantValues.searchMaxResults.getInt() * noOfPropKeys);
-        if (includePropertiesInResult && !propKeyIncluder.isEmpty()) {
-            aql.include(AqlApiItem.property().key(), AqlApiItem.property().value());
-        }
-        //includeExtraFieldsInResultIfNeeded(strategies, aql, includeExtraFieldsInResult); // TODO: [by dan] see below
-        return aql;
-    }
-
-    private static int populatePropKeysToInclude(List<AqlUISearchModel> searches, AqlBase.OrClause propKeyIncluder) {
-        int noOfPropKeys;//Add all of the Package Type's prop keys to the result filter
-        List<AqlBase.CriteriaClause<AqlApiItem>> propKeyIncludes = searches.stream()
-                .map(PackageSearchHelper::getPackageSearchTypeBySearchModel)
-                .filter(packageSearchType -> packageSearchType != null)
-                .map(PackageSearchHelper::getStrategiesForPackageType)
-                .map(PackageSearchHelper::getPropKeysFromStrategies)
-                .flatMap(Collection::stream)
-                .distinct()
-                .map(key -> AqlApiItem.property().key().equal(key))
-                .collect(Collectors.toList());
-
-        noOfPropKeys = propKeyIncludes.isEmpty() ? 1 : propKeyIncludes.size();
-        propKeyIncludes.stream()
-                .forEach(propKeyIncluder::append);
-        return noOfPropKeys;
-    }
-
-    public static PackageSearchType getPackageSearchTypeBySearchModel(AqlUISearchModel model) {
-        return PackageSearchCriteria.getPackageTypeByFieldId(model.getId());
-    }
-
-    public static List<AqlUISearchStrategy> getStrategiesForPackageType(PackageSearchType type) {
-        return PackageSearchCriteria.getStartegiesByPackageSearchType(type);
-    }
-
-    /**
-     * Filters out field based strategies and returns all property keys that are being searched
-     */
-    public static List<String> getPropKeysFromStrategies(List<AqlUISearchStrategy> strategies) {
-        return strategies.stream()
-                .filter(strategy -> strategy instanceof AqlUIPropertySearchStrategy)
-                .map(AqlUISearchStrategy::getSearchKey)
-                .collect(Collectors.toList());
-    }
-
-    public static List<AqlUISearchStrategy> buildStrategiesFromSearchModel(List<AqlUISearchModel> searches) {
-        return searches.stream()
-                .map(search -> getStrategyByFieldId(search)
-                        .comparator(search.getComparator())
-                        .values(search.getValues()))
-                .collect(Collectors.toList());
-    }
-
-    /**
-     * Tries each of the criteria enums for the strategy of the given model
-     */
-    private static AqlUISearchStrategy getStrategyByFieldId(AqlUISearchModel search) {
-        try {
-            return PackageSearchCriteria.getStrategyByFieldId(search.getId());
-        } catch (IllegalArgumentException iae) {
-            return FieldSearchCriteria.getStrategyByFieldId(search.getId());
-        }
-    }
-
-    public static PackageSearchCriteria getMatchingPackageSearchCriteria(FullRow row) {
-        PackageSearchCriteria criterion;
-        //Special case to differentiate between docker v1 and v2 image property which is the same
-        if (row.getKey().equalsIgnoreCase("docker.repoName") && row.getPath()
-                .contains("repositories/" + row.getValue())) {
-            criterion = PackageSearchCriteria.dockerV1Image;
-        } else {
-            criterion = PackageSearchCriteria.getCriteriaByAqlFieldOrPropName(row.getKey());
-        }
-        return criterion;
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/propertysearch/GetPropertySetsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/propertysearch/GetPropertySetsService.java
deleted file mode 100644
index 7f09d05..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/propertysearch/GetPropertySetsService.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.propertysearch;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.search.propertysearch.PropertyKeyValues;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetPropertySetsService implements RestService {
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        // fetch properties key values
-        List<PropertyKeyValues> propertyKeyValues = fetchPropertyKeyValues();
-        // update response
-        response.iModelList(propertyKeyValues);
-    }
-
-    /**
-     * get properties ket values
-     *
-     * @return list of property Key values
-     */
-    private List<PropertyKeyValues> fetchPropertyKeyValues() {
-        CentralConfigDescriptor descriptor = centralConfigService.getDescriptor();
-        List<PropertySet> availablePropertySets = descriptor.getPropertySets();
-        List<PropertyKeyValues> propertyKeyValues = new ArrayList<>();
-        availablePropertySets.forEach(propertySet ->
-                        propertySet.getProperties().forEach(property -> {
-                                    PropertyKeyValues keyValues = new PropertyKeyValues(
-                                            propertySet.getName(), property);
-                                    keyValues.setPropertyType(property.getPropertyType().name());
-                                    propertyKeyValues.add(
-                                            keyValues);
-                                }
-                        )
-        );
-        return propertyKeyValues;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/propertysearch/PropertySearchService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/propertysearch/PropertySearchService.java
deleted file mode 100644
index 75be13b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/propertysearch/PropertySearchService.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.propertysearch;
-
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.SearchService;
-import org.artifactory.api.search.property.PropertySearchControls;
-import org.artifactory.api.search.property.PropertySearchResult;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.search.SearchResult;
-import org.artifactory.ui.rest.model.artifacts.search.propertysearch.PropertyKeyValues;
-import org.artifactory.ui.rest.model.artifacts.search.propertysearch.PropertyResult;
-import org.artifactory.ui.rest.model.artifacts.search.propertysearch.PropertySearch;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class PropertySearchService implements RestService {
-
-    @Autowired
-    private SearchService searchService;
-
-    @Autowired
-    private AuthorizationService authorizationService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        PropertySearch propertySearch = (PropertySearch) request.getImodel();
-        // update property control search
-        PropertySearchControls propertySearchControls = updatePropertyControlSearch(propertySearch);
-
-        if (isSearchEmptyOrWildCardOnly(propertySearchControls)) {
-            response.error("Search term empty or containing only wildcards is not permitted");
-            return;
-        }
-        // search property
-        ItemSearchResults<PropertySearchResult> propertyResults = searchService.searchPropertyAql(propertySearchControls);
-        // update response data
-         List<PropertyResult> results = new ArrayList<>();
-        for (PropertySearchResult propsResult : propertyResults.getResults()) {
-            if (filterNoReadResults(propsResult))
-                results.add(new PropertyResult(propsResult, request));
-        }
-        int maxResults = ConstantValues.searchMaxResults.getInt();
-        long resultsCount;
-        if (propertySearchControls.isLimitSearchResults() && results.size() > maxResults) {
-            results = results.subList(0, maxResults);
-            resultsCount = results.size() == 0 ? 0 : propertyResults.getFullResultsCount();
-        }else{
-            resultsCount = results.size();
-        }
-
-        SearchResult model = new SearchResult(results, propertySearchControls.getValue(),
-                resultsCount, propertySearchControls.isLimitSearchResults());
-        model.addNotifications(response);
-        response.iModel(model);
-    }
-
-    private boolean filterNoReadResults(PropertySearchResult propertyResult) {
-        RepoPath repoPath = RepoPathFactory.create(propertyResult.getRepoKey(), propertyResult.getRelativePath());
-        return authorizationService.canRead(repoPath);
-    }
-
-    /**
-     * check if search is empty or contain wildcard only
-     *
-     * @param propertySearchControls - property search control
-     * @return if true - search is empty or containing wild card only
-     */
-    private boolean isSearchEmptyOrWildCardOnly(PropertySearchControls propertySearchControls) {
-        return propertySearchControls.isEmpty() || propertySearchControls.isWildcardsOnly();
-    }
-    /**
-     * update property control search
-     *
-     * @param propertySearch imodel list
-     * @return property control search
-     */
-    private PropertySearchControls updatePropertyControlSearch(PropertySearch propertySearch) {
-        PropertySearchControls propertySearchControls = new PropertySearchControls();
-        propertySearchControls.setSelectedRepoForSearch(propertySearch.getSelectedRepositories());
-        propertySearchControls.setLimitSearchResults(true);
-        List<PropertyKeyValues> propertyKeyValues = propertySearch.getPropertyKeyValues();
-        propertyKeyValues.forEach(props -> {
-                    List<String> values = props.getValues();
-                    values.forEach(value -> propertySearchControls.put(props.getKey(), value, true));
-                }
-        );
-        return propertySearchControls;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/quicksearch/QuickSearchService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/quicksearch/QuickSearchService.java
deleted file mode 100644
index d5ac8cd..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/quicksearch/QuickSearchService.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.quicksearch;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.SearchService;
-import org.artifactory.api.search.artifact.ArtifactSearchControls;
-import org.artifactory.api.search.artifact.ArtifactSearchResult;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.search.SearchResult;
-import org.artifactory.ui.rest.model.artifacts.search.quicksearch.QuickSearch;
-import org.artifactory.ui.rest.model.artifacts.search.quicksearch.QuickSearchResult;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class QuickSearchService implements RestService {
-
-    @Autowired
-    private SearchService searchService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        QuickSearch quickSearch = (QuickSearch) request.getImodel();
-        // get artifact search control instance
-        ArtifactSearchControls artifactSearchControl = getArtifactSearchControl(quickSearch);
-        // check if search empty or contain wild card only
-        if (isSearchEmptyOrWildCardOnly(artifactSearchControl)) {
-            response.error("Search term empty or containing only wildcards is not permitted");
-            return;
-        }
-        // do quick search
-        List<QuickSearchResult> quickSearchResults = Lists.newArrayList();
-        ItemSearchResults<ArtifactSearchResult> artifactSearchResults = searchService.searchArtifacts(artifactSearchControl);
-        for (ArtifactSearchResult artifactSearchResult : artifactSearchResults.getResults()) {
-            quickSearchResults.add(new QuickSearchResult(artifactSearchResult,request));
-        }
-        long resultsCount;
-        int maxResults = ConstantValues.searchMaxResults.getInt();
-        if (artifactSearchControl.isLimitSearchResults() && quickSearchResults.size() > maxResults) {
-            quickSearchResults = quickSearchResults.subList(0, maxResults);
-            resultsCount = quickSearchResults.size() == 0 ? 0 : artifactSearchResults.getFullResultsCount();
-        }else{
-            resultsCount = quickSearchResults.size();
-        }
-        SearchResult model = new SearchResult(quickSearchResults, quickSearch.getQuery(),
-                resultsCount, artifactSearchControl.isLimitSearchResults());
-        model.addNotifications(response);
-        response.iModel(model);
-    }
-
-
-    /**
-     * check if search is empty or contain wildcard only
-     *
-     * @param artifactSearchControl
-     * @return if true - search is empty or containing wild card only
-     */
-    private boolean isSearchEmptyOrWildCardOnly(ArtifactSearchControls artifactSearchControl) {
-        return artifactSearchControl.isEmpty() || artifactSearchControl.isWildcardsOnly();
-    }
-
-    /**
-     * create artifact search control from quick search instance
-     *
-     * @param quickSearch - quick search instance
-     * @return artifact search control instance
-     */
-    private ArtifactSearchControls getArtifactSearchControl(QuickSearch quickSearch) {
-        ArtifactSearchControls artifactSearchControls = new ArtifactSearchControls();
-        artifactSearchControls.setSelectedRepoForSearch(quickSearch.getSelectedRepositories());
-        artifactSearchControls.setLimitSearchResults(!quickSearch.getSelectedRepositories().isEmpty());
-        artifactSearchControls.setRelativePath(quickSearch.getRelativePath());
-        artifactSearchControls.setQuery(quickSearch.getQuery());
-        artifactSearchControls.setLimitSearchResults(true);
-        return artifactSearchControls;
-    }
-
-    /**
-     * add wild card to query
-     *
-     * @param artifactSearchControls - quick search model
-     */
-    private void setQueryWildCard(ArtifactSearchControls artifactSearchControls) {
-        String query = artifactSearchControls.getQuery();
-        if (StringUtils.isNotBlank(query)) {
-            StringBuilder queryBuilder = new StringBuilder();
-            queryBuilder.append(query);
-
-            if (!query.endsWith("*") && !query.endsWith("?")) {
-                queryBuilder.append("*");
-            }
-            artifactSearchControls.setQuery(queryBuilder.toString());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/remotesearch/RemoteSearchService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/remotesearch/RemoteSearchService.java
deleted file mode 100644
index 89a316d..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/remotesearch/RemoteSearchService.java
+++ /dev/null
@@ -1,118 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.remotesearch;
-
-import org.artifactory.api.bintray.BintrayItemInfo;
-import org.artifactory.api.bintray.BintrayService;
-import org.artifactory.api.bintray.exception.BintrayException;
-import org.artifactory.api.search.BintrayItemSearchResults;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.search.SearchResult;
-import org.artifactory.ui.rest.model.artifacts.search.remotesearch.RemoteResult;
-import org.artifactory.ui.rest.model.artifacts.search.remotesearch.RemoteSearch;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletRequest;
-import java.io.IOException;
-import java.util.*;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class RemoteSearchService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(RemoteSearchService.class);
-    private static final int MINIMAL_QUERY_LENGTH = 3;
-
-    @Autowired
-    BintrayService bintrayService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        RemoteSearch remoteSearch = (RemoteSearch) request.getImodel();
-        Map<String, String> headersMap = getHeaders(request.getServletRequest());
-        if (remoteSearch.getSearchKey().length() < MINIMAL_QUERY_LENGTH) {
-            response.error("The search key must contain at least 3 letters");
-        }
-        // search in bintray
-        BintrayItemSearchResults<BintrayItemInfo> bintraySearchResults = searchRemoteRepo(remoteSearch, headersMap);
-        // update model list result
-        List<RemoteResult> remoteResults = updateModelListResult(bintraySearchResults,request);
-        // update response data
-        boolean isLimitSearchResults = (bintraySearchResults != null) && (bintraySearchResults.getRangeLimitTotal() > 0);
-        SearchResult model = new SearchResult(remoteResults, remoteSearch.getSearchKey(), remoteResults.size(),
-                isLimitSearchResults);
-        model.addNotifications(response);
-        response.iModel(model);
-    }
-
-
-    /**
-     * check if search is empty or contain wildcard only
-     *
-     * @param searchKey - search key
-     * @return if true - search is empty or containing wild card only
-     */
-    private boolean isSearchEmptyOrWildCardOnly(String searchKey) {
-        return searchKey.isEmpty() || searchKey.indexOf("*") == 0;
-    }
-
-    /**
-     * update remote model list
-     *
-     * @param bintraySearchResults - results return from bintray
-     * @return - remote results model list
-     */
-    private List<RemoteResult> updateModelListResult(BintrayItemSearchResults<BintrayItemInfo> bintraySearchResults,ArtifactoryRestRequest restRequest) {
-        List<RemoteResult> remoteResults = new ArrayList<>();
-        if (bintraySearchResults != null) {
-            bintraySearchResults.getResults().forEach(remoteItem -> remoteResults.add(new RemoteResult(remoteItem,restRequest)));
-        }
-        return remoteResults;
-    }
-
-    /**
-     * search remote repository
-     *
-     * @param remoteSearch - remote search model
-     * @param headersMap   - request headers
-     * @return Bintray search results
-     */
-    private BintrayItemSearchResults<BintrayItemInfo> searchRemoteRepo(RemoteSearch remoteSearch,
-            Map<String, String> headersMap) {
-        BintrayItemSearchResults<BintrayItemInfo> bintrayItemInfoBintrayItemSearchResults = null;
-        try {
-            bintrayItemInfoBintrayItemSearchResults = bintrayService.searchByName(
-                    remoteSearch.getSearchKey(), headersMap);
-        } catch (IOException e) {
-            log.error(e.toString());
-        } catch (BintrayException e) {
-            log.error(e.toString());
-        }
-        return bintrayItemInfoBintrayItemSearchResults;
-    }
-
-    /**
-     * return header from servlet request
-     *
-     * @param request - http servlet request
-     * @return Map of headers
-     */
-    private Map<String, String> getHeaders(HttpServletRequest request) {
-        Map<String, String> headersMap = new HashMap<>();
-        if (request != null) {
-            Enumeration headerNames = request.getHeaderNames();
-            while (headerNames.hasMoreElements()) {
-                String headerName = (String) headerNames.nextElement();
-                headersMap.put(headerName.toUpperCase(), request.getHeader(headerName));
-            }
-        }
-        return headersMap;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/AddSearchResultsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/AddSearchResultsService.java
deleted file mode 100644
index d6d9a3b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/AddSearchResultsService.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.searchresults;
-
-import org.artifactory.api.search.ItemSearchResult;
-import org.artifactory.api.search.SavedSearchResults;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.ui.rest.model.artifacts.search.BaseSearchResult;
-import org.artifactory.ui.utils.RequestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static java.lang.String.format;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class AddSearchResultsService extends BaseSearchResultService {
-    private static final Logger log = LoggerFactory.getLogger(RemoveSearchResultsService.class);
-
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String resultName = request.getQueryParamByKey("name");
-        boolean useVersionLevel = Boolean.valueOf(request.getQueryParamByKey("useVersion"));
-        List<BaseSearchResult> baseSearchResults = (List<BaseSearchResult>) request.getModels();
-        SavedSearchResults savedSearchResults = RequestUtils.getResultsFromRequest(resultName,
-                request.getServletRequest());
-        if (savedSearchResults == null) {
-            response.error(format("No existing search result named '%s' was found.", resultName));
-            return;
-        } else {
-            addResults(request, response, resultName, baseSearchResults, savedSearchResults, useVersionLevel);
-        }
-    }
-
-    /**
-     * subtract result with saved result
-     *
-     * @param request            - http servlet request
-     * @param response           - http servlet response
-     * @param resultName         - result name
-     * @param baseSearchResults  - results to subtract
-     * @param savedSearchResults - saved results
-     */
-    private void addResults(ArtifactoryRestRequest request, RestResponse response, String resultName,
-            List<BaseSearchResult> baseSearchResults, SavedSearchResults savedSearchResults, boolean useVersionLevel) {
-        List<ItemSearchResult> results = new ArrayList<>();
-        SavedSearchResults resultsToMerge = getSavedSearchResults(resultName, results, baseSearchResults,
-                useVersionLevel);
-        if (resultsToMerge.isEmpty()) {
-            response.warn("No search results were added - No published artifacts or dependencies found.");
-        } else {
-            savedSearchResults.merge(resultsToMerge);
-            if (!savedSearchResults.isEmpty()) {
-                response.info("Successfully added results to stash");
-            } else {
-                try {
-                    RequestUtils.removeResultsToRequest(resultName, request.getServletRequest());
-                } catch (Exception e) {
-                    log.error(e.toString());
-                }
-                String message = new StringBuilder().append("Successfully subtracted search results").toString();
-                response.info(message);
-            }
-        }
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/BaseSearchResultService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/BaseSearchResultService.java
deleted file mode 100644
index 0352861..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/BaseSearchResultService.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.searchresults;
-
-import com.google.common.collect.Sets;
-import org.artifactory.api.common.MoveMultiStatusHolder;
-import org.artifactory.api.search.ItemSearchResult;
-import org.artifactory.api.search.SavedSearchResults;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.search.SearchTreeBuilder;
-import org.artifactory.ui.rest.model.artifacts.search.BaseSearchResult;
-import org.artifactory.ui.utils.RequestUtils;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Chen keinan
- */
-public abstract class BaseSearchResultService implements RestService {
-
-
-    /**
-     * get saved search results
-     *
-     * @param searchName        - result name
-     * @param results           - search results
-     * @param baseSearchResults - base
-     * @param useVersionLevel
-     * @return
-     */
-    protected SavedSearchResults getSavedSearchResults(String searchName, List<ItemSearchResult> results,
-            List<BaseSearchResult> baseSearchResults, boolean useVersionLevel) {
-        baseSearchResults.forEach(result -> results.add(result.getSearchResult()));
-        return SearchTreeBuilder.buildFullArtifactsList(searchName, results, useVersionLevel);
-    }
-
-    /**
-     * update error response
-     *
-     * @param response - encapsulate data related to response
-     * @param status   - status
-     */
-    protected void updateErrorResponse(RestResponse response, MoveMultiStatusHolder status) {
-        response.responseCode(HttpServletResponse.SC_CONFLICT);
-        List<String> errors = new ArrayList<>();
-        status.getErrors().forEach(error -> errors.add(error.getMessage()));
-        response.errors(errors);
-    }
-
-    /**
-     * fetch repo path set for move / copy
-     *
-     * @param request    - encapsulate data related to request
-     * @param searchName - search name
-     * @return - set of repo path
-     */
-    protected Set<RepoPath> getRepoPaths(ArtifactoryRestRequest request, String searchName) {
-        SavedSearchResults savedSearchResults = RequestUtils.getResultsFromRequest(searchName,
-                request.getServletRequest());
-        Set<RepoPath> pathsToMove = Sets.newHashSet();
-        savedSearchResults.getResults().forEach(result -> pathsToMove.add(result.getRepoPath()));
-        //Move all results files
-        return pathsToMove;
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/CopySearchResultsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/CopySearchResultsService.java
deleted file mode 100644
index 1f0f019..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/CopySearchResultsService.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.searchresults;
-
-import org.artifactory.api.common.MoveMultiStatusHolder;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.Set;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CopySearchResultsService extends BaseSearchResultService {
-    private static final Logger log = LoggerFactory.getLogger(RemoveSearchResultsService.class);
-
-    @Autowired
-    RepositoryService repoService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String searchName = request.getQueryParamByKey("name");
-        String moveToRepoKey = request.getQueryParamByKey("repoKey");
-        boolean isDryRun = Boolean.valueOf(request.getQueryParamByKey("dryRun"));
-        Set<RepoPath> pathsToMove = getRepoPaths(request, searchName);
-        MoveMultiStatusHolder status = repoService.copy(pathsToMove, moveToRepoKey,
-                (Properties) InfoFactoryHolder.get().createProperties(), isDryRun, false);
-        if (status.hasErrors()) {
-            updateErrorResponse(response, status);
-        }
-        else {
-            response.info("Search results successfully copied to: "+moveToRepoKey);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/DiscardFromResultsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/DiscardFromResultsService.java
deleted file mode 100644
index 704f384..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/DiscardFromResultsService.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.searchresults;
-
-import com.google.common.collect.ImmutableList;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.search.ItemSearchResult;
-import org.artifactory.api.search.SavedSearchResults;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.ui.rest.model.artifacts.search.BaseSearchResult;
-import org.artifactory.ui.rest.model.artifacts.search.quicksearch.QuickSearchResult;
-import org.artifactory.ui.utils.RequestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DiscardFromResultsService extends BaseSearchResultService {
-    private static final Logger log = LoggerFactory.getLogger(RemoveSearchResultsService.class);
-
-    @Autowired
-    RepositoryService repoService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String repoKey = request.getQueryParamByKey("repoKey");
-        String path = request.getQueryParamByKey("path");
-        RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-        String resultName = request.getQueryParamByKey("name");
-        // get save search results from session
-        SavedSearchResults savedSearchResults = RequestUtils.getResultsFromRequest(resultName,
-                request.getServletRequest());
-        SavedSearchResults resultsToDiscard = getResultsToDiscard(repoPath, resultName, savedSearchResults);
-        //discard results from session
-        savedSearchResults.discardFromResult(resultsToDiscard);
-    }
-
-    /**
-     * get save search results to discard
-     *
-     * @param repoPath           - repo path
-     * @param resultName         - result name
-     * @param savedSearchResults - saved search result instance
-     * @return
-     */
-    private SavedSearchResults getResultsToDiscard(RepoPath repoPath, String resultName,
-            SavedSearchResults savedSearchResults) {
-        ImmutableList<FileInfo> results = savedSearchResults.getResults();
-        List<BaseSearchResult> baseSearchResults = getResultsToDiscard(repoPath, results);
-        List<ItemSearchResult> newResults = new ArrayList<>();
-        return getSavedSearchResults(resultName, newResults, baseSearchResults, false);
-    }
-
-    /**
-     * get results to discard
-     *
-     * @param repoPath - repo path
-     * @param results  - results
-     * @return - list of saved search result to discard
-     */
-    private List<BaseSearchResult> getResultsToDiscard(RepoPath repoPath, ImmutableList<FileInfo> results) {
-        List<BaseSearchResult> baseSearchResults = new ArrayList<>();
-        results.forEach(result -> {
-            if (result.getRepoPath().toString().startsWith(repoPath.toString())) {
-                QuickSearchResult quickSearchResult = new QuickSearchResult();
-                quickSearchResult.setRepoKey(result.getRepoKey());
-                quickSearchResult.setRelativePath(result.getRelPath());
-                baseSearchResults.add(quickSearchResult);
-            }
-        });
-        return baseSearchResults;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/ExportSearchResultsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/ExportSearchResultsService.java
deleted file mode 100644
index 847d114..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/ExportSearchResultsService.java
+++ /dev/null
@@ -1,121 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.searchresults;
-
-import org.artifactory.api.common.ImportExportStatusHolder;
-import org.artifactory.api.config.ExportSettingsImpl;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.search.ItemSearchResult;
-import org.artifactory.api.search.SavedSearchResults;
-import org.artifactory.common.StatusEntry;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.ui.rest.model.admin.importexport.ImportExportSettings;
-import org.artifactory.ui.rest.model.artifacts.search.BaseSearchResult;
-import org.artifactory.ui.utils.RequestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ExportSearchResultsService extends BaseSearchResultService {
-    private static final Logger log = LoggerFactory.getLogger(RemoveSearchResultsService.class);
-
-    @Autowired
-    RepositoryService repoService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String searchName = request.getQueryParamByKey("name");
-        ImportExportSettings setting = (ImportExportSettings) request.getImodel();
-        SavedSearchResults savedSearchResults = RequestUtils.getResultsFromRequest(searchName,
-                request.getServletRequest());
-        ImportExportStatusHolder status = new ImportExportStatusHolder();
-        String path = setting.getPath();
-        try {
-            // export results to specified path
-            List<StatusEntry> warnings = exportSearchResultsToPath(setting, savedSearchResults, status, path);
-            if (!warnings.isEmpty()) {
-                updateWarnMessage(response);
-            }
-            if (status.isError()) {
-                updateErrorMessage(response, searchName, status, path);
-            } else {
-                updateInfoMessage(response, searchName, path);
-            }
-        } catch (Exception e) {
-            String message = "Exception occurred during export: " + e.getMessage();
-            response.error(message);
-            log.error(message, e);
-        }
-    }
-
-    /**
-     * export search results to path
-     *
-     * @param setting            - export settings
-     * @param savedSearchResults - saved search results
-     * @param status             - export results status
-     * @param path               - export to path
-     * @return
-     */
-    private List<StatusEntry> exportSearchResultsToPath(ImportExportSettings setting,
-            SavedSearchResults savedSearchResults, ImportExportStatusHolder status, String path) {
-        ExportSettingsImpl baseSettings = new ExportSettingsImpl(new File(path), status);
-        baseSettings.setIncludeMetadata(!setting.isExcludeMetadata());
-        baseSettings.setM2Compatible(setting.isCreateM2CompatibleExport());
-        baseSettings.setCreateArchive(setting.isCreateZipArchive());
-        baseSettings.setVerbose(setting.isVerbose());
-        repoService.exportSearchResults(savedSearchResults, baseSettings);
-        return status.getWarnings();
-    }
-
-    /**
-     * update info message
-     *
-     * @param response   - encapsulate data related to response
-     * @param searchName - search name
-     * @param path       - export to path
-     */
-    private void updateInfoMessage(RestResponse response, String searchName, String path) {
-        response.info("Successfully exported '" + searchName + "' to '" + path + "'.");
-    }
-
-    /**
-     * update error message
-     *
-     * @param response   - encapsulate data related to response
-     * @param searchName - search name
-     * @param status     - export status
-     * @param path       - export to path
-     */
-    private void updateErrorMessage(RestResponse response, String searchName, ImportExportStatusHolder status,
-            String path) {
-        String message = status.getStatusMsg();
-        Throwable exception = status.getException();
-        if (exception != null) {
-            message = exception.getMessage();
-        }
-        response.error("Failed to export from: " + searchName + "' to '" + path + "'. Cause: " +
-                message);
-    }
-
-    /**
-     * update warn message
-     *
-     * @param response - encapsulate data related to response
-     */
-    private void updateWarnMessage(RestResponse response) {
-        response.warn(" warning(s) reported during the export. Please review the logs for further information.");
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/GetSearchResultsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/GetSearchResultsService.java
deleted file mode 100644
index d05cc21..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/GetSearchResultsService.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.searchresults;
-
-import com.google.common.collect.ImmutableList;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.repo.exception.ItemNotFoundRuntimeException;
-import org.artifactory.api.search.SavedSearchResults;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.ui.rest.model.artifacts.search.StashResult;
-import org.artifactory.ui.utils.RequestUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetSearchResultsService extends BaseSearchResultService {
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String searchName = request.getQueryParamByKey("name");
-        SavedSearchResults resultsToRequest = RequestUtils.getResultsFromRequest(searchName,
-                request.getServletRequest());
-        if (resultsToRequest != null) {
-            // remove items which has been deleted from save search result
-            removeNonValidDataFromResult(resultsToRequest);
-            List<StashResult> stashResults = new ArrayList<>();
-            resultsToRequest.getResults().forEach(result ->
-                    stashResults.add(new StashResult(result.getName(), result.getRelPath(), result.getRepoKey())));
-            response.iModelList(stashResults);
-        }
-    }
-
-    /**
-     * remove items which has been deleted from save search result
-     *
-     * @param resultsToRequest - results from session
-     */
-    private void removeNonValidDataFromResult(SavedSearchResults resultsToRequest) {
-        ImmutableList.Builder<FileInfo> builder = ImmutableList.builder();
-        resultsToRequest.getResults().forEach(result -> {
-            try {
-                repositoryService.getItemInfo(result.getRepoPath());
-            } catch (ItemNotFoundRuntimeException e) {
-                builder.add(result);
-            }
-        });
-        ImmutableList<FileInfo> infos = builder.build();
-        resultsToRequest.removeAll(infos);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/IntersectSearchResultsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/IntersectSearchResultsService.java
deleted file mode 100644
index 3df8509..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/IntersectSearchResultsService.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.searchresults;
-
-import org.artifactory.api.search.ItemSearchResult;
-import org.artifactory.api.search.SavedSearchResults;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.ui.rest.model.artifacts.search.BaseSearchResult;
-import org.artifactory.ui.utils.RequestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static java.lang.String.format;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class IntersectSearchResultsService extends BaseSearchResultService {
-    private static final Logger log = LoggerFactory.getLogger(RemoveSearchResultsService.class);
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        boolean useVersionLevel = Boolean.valueOf(request.getQueryParamByKey("useVersion"));
-        String resultName = request.getQueryParamByKey("name");
-        List<BaseSearchResult> baseSearchResults = (List<BaseSearchResult>) request.getModels();
-        SavedSearchResults savedSearchResults = RequestUtils.getResultsFromRequest(resultName,
-                request.getServletRequest());
-        if (savedSearchResults == null) {
-            response.error(format("No existing search result named '%s' was found.", resultName));
-            return;
-        } else {
-            IntersectResults(request, response, resultName, baseSearchResults, savedSearchResults, useVersionLevel);
-        }
-    }
-
-    /**
-     * subtract result with saved result
-     *
-     * @param request            - http servlet request
-     * @param response           - http servlet response
-     * @param resultName         - result name
-     * @param baseSearchResults  - results to subtract
-     * @param savedSearchResults - saved results
-     */
-    private void IntersectResults(ArtifactoryRestRequest request, RestResponse response, String resultName,
-            List<BaseSearchResult> baseSearchResults, SavedSearchResults savedSearchResults, boolean useVersionLevel) {
-        List<ItemSearchResult> results = new ArrayList<>();
-        SavedSearchResults resultsToIntersect = getSavedSearchResults(resultName, results, baseSearchResults,
-                useVersionLevel);
-        if (resultsToIntersect.isEmpty()) {
-            response.warn("No search results were intersect - No published artifacts or dependencies found.");
-        } else {
-            savedSearchResults.intersect(resultsToIntersect);
-            if (!savedSearchResults.isEmpty()) {
-                response.info("Search results successfully intersect");
-            } else {
-                try {
-                    RequestUtils.removeResultsToRequest(resultName, request.getServletRequest());
-                } catch (Exception e) {
-                    log.error(e.toString());
-                }
-                String message = new StringBuilder().append("Successfully subtracted search results from stash").toString();
-                response.info(message);
-            }
-        }
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/MoveSearchResultsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/MoveSearchResultsService.java
deleted file mode 100644
index 7db8a62..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/MoveSearchResultsService.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.searchresults;
-
-import org.artifactory.api.common.MoveMultiStatusHolder;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.Set;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class MoveSearchResultsService extends BaseSearchResultService {
-    private static final Logger log = LoggerFactory.getLogger(RemoveSearchResultsService.class);
-
-    @Autowired
-    RepositoryService repoService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String searchName = request.getQueryParamByKey("name");
-        String moveToRepoKey = request.getQueryParamByKey("repoKey");
-        boolean isDryRun = Boolean.valueOf(request.getQueryParamByKey("dryRun"));
-        Set<RepoPath> pathsToMove = getRepoPaths(request, searchName);
-        MoveMultiStatusHolder status = repoService.move(pathsToMove, moveToRepoKey,
-                (Properties) InfoFactoryHolder.get().createProperties(), isDryRun, false);
-        if (status.hasErrors()) {
-            updateErrorResponse(response, status);
-        }
-        else {
-            response.info("Search results successfully moved to: "+moveToRepoKey);
-        }
-
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/RemoveSearchResultsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/RemoveSearchResultsService.java
deleted file mode 100644
index 1356eda..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/RemoveSearchResultsService.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.searchresults;
-
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.utils.RequestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class RemoveSearchResultsService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(RemoveSearchResultsService.class);
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-
-        String searchName = request.getQueryParamByKey("name");
-        try {
-            RequestUtils.removeResultsToRequest(searchName, request.getServletRequest());
-            response.info("Successfully cleared stash");
-        } catch (Exception e) {
-            response.error("no result with name:" + searchName + " found");
-            log.error("no result with name:" + searchName + " found");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/SaveSearchResultsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/SaveSearchResultsService.java
deleted file mode 100644
index a32e4aa..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/SaveSearchResultsService.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.searchresults;
-
-import org.artifactory.api.search.ItemSearchResult;
-import org.artifactory.api.search.SavedSearchResults;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.ui.rest.model.artifacts.search.BaseSearchResult;
-import org.artifactory.ui.utils.RequestUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class SaveSearchResultsService extends BaseSearchResultService {
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String searchName = request.getQueryParamByKey("name");
-        boolean useVersionLevel = Boolean.valueOf(request.getQueryParamByKey("useVersion"));
-        List<ItemSearchResult> results = new ArrayList<>();
-        List<BaseSearchResult> baseSearchResults = (List<BaseSearchResult>) request.getModels();
-        SavedSearchResults searchResults = getSavedSearchResults(searchName, results, baseSearchResults,
-                useVersionLevel);
-        // save search results to session
-        RequestUtils.setResultsToRequest(searchResults, request.getServletRequest());
-        response.info("Search results successfully saved to stash");
-    }
-
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/SubtractSearchResultsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/SubtractSearchResultsService.java
deleted file mode 100644
index ab735a9..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/searchresults/SubtractSearchResultsService.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.searchresults;
-
-import org.artifactory.api.search.ItemSearchResult;
-import org.artifactory.api.search.SavedSearchResults;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.ui.rest.model.artifacts.search.BaseSearchResult;
-import org.artifactory.ui.utils.RequestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static java.lang.String.format;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class SubtractSearchResultsService extends BaseSearchResultService {
-    private static final Logger log = LoggerFactory.getLogger(RemoveSearchResultsService.class);
-
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String resultName = request.getQueryParamByKey("name");
-        boolean useVersionLevel = Boolean.valueOf(request.getQueryParamByKey("useVersion"));
-        List<BaseSearchResult> baseSearchResults = (List<BaseSearchResult>) request.getModels();
-        SavedSearchResults savedSearchResults = RequestUtils.getResultsFromRequest(resultName,
-                request.getServletRequest());
-        if (savedSearchResults == null) {
-            response.error(format("No existing search result named '%s' was found.", resultName));
-            return;
-        } else {
-            subtractResults(request, response, resultName, baseSearchResults, savedSearchResults, useVersionLevel);
-        }
-    }
-
-    /**
-     * subtract result with saved result
-     *
-     * @param request            - http servlet request
-     * @param response           - http servlet response
-     * @param resultName         - result name
-     * @param baseSearchResults  - results to subtract
-     * @param savedSearchResults - saved results
-     */
-    private void subtractResults(ArtifactoryRestRequest request, RestResponse response, String resultName,
-            List<BaseSearchResult> baseSearchResults, SavedSearchResults savedSearchResults, boolean useVersionLevel) {
-        List<ItemSearchResult> results = new ArrayList<>();
-        SavedSearchResults resultsToSubtract = getSavedSearchResults(resultName, results, baseSearchResults,
-                useVersionLevel);
-        if (resultsToSubtract.isEmpty()) {
-            response.warn("No search results were subtracted - No published artifacts or dependencies found.");
-        } else {
-            savedSearchResults.subtract(resultsToSubtract);
-            if (!savedSearchResults.isEmpty()) {
-                response.info("Search results successfully subtracted");
-            } else {
-                try {
-                    RequestUtils.removeResultsToRequest(resultName, request.getServletRequest());
-                } catch (Exception e) {
-                    log.error(e.toString());
-                }
-                String message = new StringBuilder().append("Successfully subtracted search results from stash").toString();                response.info(message);
-            }
-        }
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/trashsearch/TrashSearchService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/trashsearch/TrashSearchService.java
deleted file mode 100644
index 122ebaf..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/artifacts/search/trashsearch/TrashSearchService.java
+++ /dev/null
@@ -1,122 +0,0 @@
-package org.artifactory.ui.rest.service.artifacts.search.trashsearch;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.SearchControls;
-import org.artifactory.api.search.SearchService;
-import org.artifactory.api.search.artifact.ArtifactSearchControls;
-import org.artifactory.api.search.artifact.ArtifactSearchResult;
-import org.artifactory.api.search.artifact.ChecksumSearchControls;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.repo.trash.TrashService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.search.SearchResult;
-import org.artifactory.ui.rest.model.artifacts.search.trashsearch.TrashSearch;
-import org.artifactory.ui.rest.model.artifacts.search.trashsearch.TrashSearchResult;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * @author Shay Yaakov
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class TrashSearchService implements RestService {
-
-    @Autowired
-    private SearchService searchService;
-
-    @Autowired
-    private RepositoryService repoService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        TrashSearch trashSearch = (TrashSearch) request.getImodel();
-        if (trashSearch.getIsChecksum()) {
-            performChecksumSearch(trashSearch, response);
-        } else {
-            performQuickSearch(trashSearch, response);
-        }
-    }
-
-    private void performChecksumSearch(TrashSearch trashSearch, RestResponse response) {
-        ChecksumSearchControls checksumSearchControl = getChecksumSearchControl(trashSearch);
-        if (isSearchEmptyOrWildCardOnly(checksumSearchControl)) {
-            response.error("Please enter a valid checksum to search for");
-            return;
-        }
-
-        ItemSearchResults<ArtifactSearchResult> checksumResults =
-                searchService.getArtifactsByChecksumResults(checksumSearchControl);
-        updateResponse(trashSearch, checksumSearchControl.isLimitSearchResults(), checksumResults, response);
-    }
-
-    private void performQuickSearch(TrashSearch trashSearch, RestResponse response) {
-        ArtifactSearchControls artifactSearchControl = getArtifactSearchControl(trashSearch);
-        if (isSearchEmptyOrWildCardOnly(artifactSearchControl)) {
-            response.error("Search term empty or containing only wildcards is not permitted");
-            return;
-        }
-
-        ItemSearchResults<ArtifactSearchResult> checksumResults =
-                searchService.searchArtifacts(artifactSearchControl);
-        updateResponse(trashSearch, artifactSearchControl.isLimitSearchResults(), checksumResults, response);
-    }
-
-    private void updateResponse(TrashSearch trashSearch, boolean limit,
-                                ItemSearchResults<ArtifactSearchResult> searchResults, RestResponse response) {
-        List<TrashSearchResult> trashSearchResults = Lists.newArrayList();
-        for (ArtifactSearchResult artifactSearchResult : searchResults.getResults()) {
-            trashSearchResults.add(new TrashSearchResult(artifactSearchResult,
-                    repoService.getProperties(artifactSearchResult.getItemInfo().getRepoPath())));
-        }
-        long resultsCount;
-        int maxResults = ConstantValues.searchMaxResults.getInt();
-        if (limit && trashSearchResults.size() > maxResults) {
-            trashSearchResults = trashSearchResults.subList(0, maxResults);
-            resultsCount = trashSearchResults.size() == 0 ? 0 : searchResults.getFullResultsCount();
-        } else {
-            resultsCount = trashSearchResults.size();
-        }
-        SearchResult model = new SearchResult(trashSearchResults, trashSearch.getQuery(), resultsCount, limit);
-        model.addNotifications(response);
-        response.iModel(model);
-    }
-
-    private ChecksumSearchControls getChecksumSearchControl(TrashSearch trashSearch) {
-        String query = trashSearch.getQuery();
-        ChecksumSearchControls searchControls = new ChecksumSearchControls();
-        if (StringUtils.isNotBlank(query)) {
-            if (StringUtils.length(query) == ChecksumType.md5.length()) {
-                searchControls.addChecksum(ChecksumType.md5, query);
-                searchControls.setLimitSearchResults(true);
-            } else if (StringUtils.length(query) == ChecksumType.sha1.length()) {
-                searchControls.addChecksum(ChecksumType.sha1, query);
-            }
-            searchControls.setSelectedRepoForSearch(Lists.newArrayList(TrashService.TRASH_KEY));
-        }
-        return searchControls;
-    }
-
-    private ArtifactSearchControls getArtifactSearchControl(TrashSearch trashSearch) {
-        ArtifactSearchControls artifactSearchControls = new ArtifactSearchControls();
-        artifactSearchControls.setSelectedRepoForSearch(Lists.newArrayList(TrashService.TRASH_KEY));
-        artifactSearchControls.setLimitSearchResults(true);
-        artifactSearchControls.setQuery(trashSearch.getQuery());
-        artifactSearchControls.setLimitSearchResults(true);
-        return artifactSearchControls;
-    }
-
-    private boolean isSearchEmptyOrWildCardOnly(SearchControls artifactSearchControl) {
-        return artifactSearchControl.isEmpty() || artifactSearchControl.isWildcardsOnly();
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/BuildsServiceFactory.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/BuildsServiceFactory.java
deleted file mode 100644
index c55306c..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/BuildsServiceFactory.java
+++ /dev/null
@@ -1,131 +0,0 @@
-package org.artifactory.ui.rest.service.builds;
-
-import org.artifactory.ui.rest.model.builds.DeleteBuildsModel;
-import org.artifactory.ui.rest.service.builds.bintray.*;
-import org.artifactory.ui.rest.service.builds.buildsinfo.*;
-import org.artifactory.ui.rest.service.builds.buildsinfo.tabs.BuildIssuesService;
-import org.artifactory.ui.rest.service.builds.buildsinfo.tabs.BuildReleaseHistoryService;
-import org.artifactory.ui.rest.service.builds.buildsinfo.tabs.GetBuildGeneralInfoService;
-import org.artifactory.ui.rest.service.builds.buildsinfo.tabs.GetBuildJsonService;
-import org.artifactory.ui.rest.service.builds.buildsinfo.tabs.builddiff.*;
-import org.artifactory.ui.rest.service.builds.buildsinfo.tabs.env.GetEnvBuildPropsService;
-import org.artifactory.ui.rest.service.builds.buildsinfo.tabs.env.GetSystemBuildPropsService;
-import org.artifactory.ui.rest.service.builds.buildsinfo.tabs.governance.GetBuildGovernanceService;
-import org.artifactory.ui.rest.service.builds.buildsinfo.tabs.governance.UpdateGovernanceRequestService;
-import org.artifactory.ui.rest.service.builds.buildsinfo.tabs.licenses.BuildLicensesService;
-import org.artifactory.ui.rest.service.builds.buildsinfo.tabs.licenses.ChangeBuildLicenseService;
-import org.artifactory.ui.rest.service.builds.buildsinfo.tabs.licenses.ExportLicenseToCsvService;
-import org.artifactory.ui.rest.service.builds.buildsinfo.tabs.licenses.OverrideSelectedLicensesService;
-import org.artifactory.ui.rest.service.builds.buildsinfo.tabs.publishedmodules.GetModuleArtifactsService;
-import org.artifactory.ui.rest.service.builds.buildsinfo.tabs.publishedmodules.GetModuleDependencyService;
-import org.artifactory.ui.rest.service.builds.buildsinfo.tabs.publishedmodules.GetPublishedModulesService;
-import org.springframework.beans.factory.annotation.Lookup;
-
-/**
- * @author Chen Keinan
- */
-public abstract class BuildsServiceFactory {
-
-    @Lookup
-    public abstract GetAllBuildsService getAllBuilds();
-
-    @Lookup
-    public abstract GetBuildHistoryService getBuildHistory();
-
-    @Lookup
-    public abstract GetBuildGeneralInfoService getBuildGeneralInfo();
-
-    @Lookup
-    public abstract GetPublishedModulesService getPublishedModules();
-
-    @Lookup
-    public abstract GetModuleArtifactsService getModuleArtifacts();
-
-    @Lookup
-    public abstract GetModuleDependencyService getModuleDependency();
-
-    @Lookup
-    public abstract DeleteAllBuildsService deleteAllBuilds();
-
-    @Lookup
-    public abstract DeleteBuildService<DeleteBuildsModel> deleteBuild();
-
-    @Lookup
-    public abstract GetBuildJsonService getBuildJson();
-
-    @Lookup
-    public abstract DiffBuildModuleArtifactService diffBuildModuleArtifact();
-
-    @Lookup
-    public abstract DiffBuildArtifactService diffBuildArtifact();
-
-    @Lookup
-    public abstract DiffBuildDependenciesService diffBuildDependencies();
-
-    @Lookup
-    public abstract DiffBuildModuleDependencyService diffBuildModuleDependency();
-
-    @Lookup
-    public abstract GetPrevBuildListService getPrevBuildList();
-
-    @Lookup
-    public abstract DiffBuildPropsService diffBuildProps();
-
-    @Lookup
-    public abstract GetEnvBuildPropsService getEnvBuildProps();
-
-    @Lookup
-    public abstract GetSystemBuildPropsService getSystemBuildProps();
-
-    @Lookup
-    public abstract BuildIssuesService getBuildIssues();
-
-    @Lookup
-    public abstract BuildLicensesService buildLicenses();
-
-    @Lookup
-    public abstract BuildReleaseHistoryService buildReleaseHistory();
-
-    @Lookup
-    public abstract BuildDiffService buildDiff();
-
-    @Lookup
-    public abstract ExportLicenseToCsvService exportLicenseToCsv();
-
-    @Lookup
-    public abstract OverrideSelectedLicensesService overrideSelectedLicenses();
-
-    @Lookup
-    public abstract ChangeBuildLicenseService changeBuildLicense();
-
-    @Lookup
-    public abstract GetBuildGovernanceService getBuildGovernance();
-
-    @Lookup
-    public abstract UpdateGovernanceRequestService updateGovernanceRequest();
-
-    @Lookup
-    public abstract GetBintrayVersionsService getBintrayVersions();
-
-    @Lookup
-    public abstract GetBintrayPackagesService getBintrayPackages();
-
-    @Lookup
-    public abstract GetBintrayRepositoriesService getBintrayRepositories();
-
-    @Lookup
-    public abstract PushBuildToBintrayService pushToBintray();
-
-    @Lookup
-    public abstract PushArtifactToBintrayService pushArtifactToBintray();
-
-    @Lookup
-    public abstract PushDockerTagToBintrayService pushDockerTagToBintray();
-
-    @Lookup
-    public abstract GetBintrayArtifactService getBintrayArtifact();
-
-    @Lookup
-    public abstract DistributeBuildService distributeBuild();
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/bintray/DistributeBuildService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/bintray/DistributeBuildService.java
deleted file mode 100644
index 03329dc..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/bintray/DistributeBuildService.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package org.artifactory.ui.rest.service.builds.bintray;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.api.bintray.distribution.Distribution;
-import org.artifactory.api.bintray.distribution.DistributionService;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.util.BuildResourceHelper;
-import org.artifactory.ui.rest.model.builds.BuildCoordinate;
-import org.artifactory.ui.rest.service.builds.buildsinfo.tabs.governance.AbstractBuildService;
-import org.artifactory.ui.rest.service.utils.distribution.DistributionUIResponseUtils;
-import org.artifactory.ui.utils.DateUtils;
-import org.jfrog.build.api.Build;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.text.ParseException;
-
-/**
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DistributeBuildService extends AbstractBuildService {
-    private static final Logger log = LoggerFactory.getLogger(DistributeBuildService.class);
-
-    @Autowired
-    DistributionService distService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        // boolean isDryRun = Boolean.parseBoolean(request.getQueryParamByKey("dryRun")); //TODO [by dan]: handle dry run
-        boolean async = Boolean.parseBoolean(request.getQueryParamByKey("async"));
-        String targetRepo = request.getQueryParamByKey("targetRepo");
-        boolean overrideExistingFiles = Boolean.parseBoolean(request.getQueryParamByKey("overrideExistingFiles"));
-        // String sourceRepo = request.getQueryParamByKey("limitSourceRepo"); //TODO [by dan]:  phase 2
-        BuildCoordinate buildCoordinate = (BuildCoordinate) request.getImodel();
-        String buildName = buildCoordinate.getBuildName();
-        String buildNumber = buildCoordinate.getBuildNumber();
-        String buildStarted;
-        try {
-            buildStarted = DateUtils.formatBuildDate(buildCoordinate.getDate());
-        } catch (ParseException pex) {
-            response.error("The specified build start time is invalid");
-            response.responseCode(HttpStatus.SC_BAD_REQUEST);
-            return;
-        }
-        Build build = getBuild(buildName, buildNumber, buildStarted, response);
-        if (response.isFailed()) {
-            return;
-        }
-        BasicStatusHolder status = new BasicStatusHolder();
-        Distribution distribution = new Distribution();
-        distribution.setTargetRepo(targetRepo);
-        // distribution.setSourceRepo(sourceRepo);
-        distribution.setAsync(async);
-        // distribution.setDryRun(isDryRun); //TODO [by dan]: handle dry run
-        distribution.setOverrideExistingFiles(overrideExistingFiles);
-        BuildResourceHelper.populateBuildPaths(build, distribution, status);
-        if (!status.isError()) {
-            status = distService.distribute(distribution);
-        }
-        response.iModel(DistributionUIResponseUtils.createResponseEntity(buildName + ":" + buildNumber, targetRepo, status));
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/bintray/GetBintrayArtifactService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/bintray/GetBintrayArtifactService.java
deleted file mode 100644
index b29dc90..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/bintray/GetBintrayArtifactService.java
+++ /dev/null
@@ -1,120 +0,0 @@
-package org.artifactory.ui.rest.service.builds.bintray;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.bintray.BintrayParams;
-import org.artifactory.api.bintray.BintrayService;
-import org.artifactory.api.bintray.Repo;
-import org.artifactory.api.bintray.exception.BintrayException;
-import org.artifactory.api.module.ModuleInfo;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.builds.BintrayModel;
-import org.artifactory.ui.utils.RequestUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetBintrayArtifactService implements RestService {
-
-    @Autowired
-    BintrayService bintrayService;
-
-    @Autowired
-    RepositoryService repoService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        Map<String, String> headersMap = RequestUtils.getHeadersMap(request.getServletRequest());
-
-        String path = request.getQueryParamByKey("path");
-        String repoKey = request.getQueryParamByKey("repoKey");
-        RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-        BintrayModel bintrayModel = initBintrayParam(path, repoPath);
-        // get bintray repositories
-        bintrayModel.setBinTrayRepositories(getBintrayRepositories(response, headersMap));
-        // update response with model
-        response.iModel(bintrayModel);
-    }
-
-    /**
-     * init bintray param
-     *
-     * @param path     - artifact path
-     * @param repoPath - repo path
-     * @return bintray model
-     */
-    private BintrayModel initBintrayParam(String path, RepoPath repoPath) {
-        BintrayParams bintrayParam = bintrayService.createParamsFromProperties(repoPath);
-
-        if (StringUtils.isBlank(bintrayParam.getPath())) {
-            bintrayParam.setPath(path);
-        }
-
-        if (StringUtils.isBlank(bintrayParam.getPackageId())) {
-            ModuleInfo moduleInfo = repoService.getItemModuleInfo(repoPath);
-            if (moduleInfo.isValid()) {
-                bintrayParam.setPackageId(moduleInfo.getPrettyModuleId());
-                bintrayParam.setVersion(moduleInfo.getBaseRevision());
-            }
-        }
-        BintrayModel bintrayModel = new BintrayModel();
-        bintrayModel.setBintrayParams(bintrayParam);
-        return bintrayModel;
-    }
-
-    /**
-     * get BintrayRepositoriesModel
-     *
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param headersMap          - request headers map
-     * @return - list of repositories
-     */
-    private List<String> getBintrayRepositories(RestResponse artifactoryResponse, Map<String, String> headersMap) {
-        return getBintrayRepos(artifactoryResponse, headersMap);
-    }
-
-
-    /**
-     * get Bintray repositories
-     *
-     * @param response - encapsulate data related to response
-     * @return - list of repositories
-     */
-    private List<String> getBintrayRepos(RestResponse response, Map<String, String> headersMap) {
-        List<String> repos = Lists.newArrayList();
-        try {
-            List<Repo> reposToDeploy = bintrayService.getReposToDeploy(headersMap);
-            repos = Lists.newArrayList(Iterables.transform(reposToDeploy, new Function<Repo, String>() {
-                @Override
-                public String apply(Repo repo) {
-                    return repo.getOwner() + "/" + repo.getName();
-                }
-            }));
-        } catch (IOException e) {
-            response.error("Connection failed with exception: " + e.getMessage());
-
-        } catch (BintrayException e) {
-            response.error("Could not retrieve repositories list from Bintray.");
-        } catch (Exception e) {
-            response.error(e.getMessage().toString());
-        }
-        return repos;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/bintray/GetBintrayPackagesService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/bintray/GetBintrayPackagesService.java
deleted file mode 100644
index 58310e8..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/bintray/GetBintrayPackagesService.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package org.artifactory.ui.rest.service.builds.bintray;
-
-import com.google.common.collect.Lists;
-import org.artifactory.api.bintray.BintrayService;
-import org.artifactory.api.bintray.exception.BintrayException;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.builds.BintrayModel;
-import org.artifactory.ui.utils.RequestUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetBintrayPackagesService implements RestService {
-
-    @Autowired
-    BintrayService bintrayService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        Map<String, String> headersMap = RequestUtils.getHeadersMap(request.getServletRequest());
-        String repoKey = request.getQueryParamByKey("key");
-        // get repo packages
-        BintrayModel bintrayModel = getRepoPackages(response, headersMap, repoKey);
-        response.iModel(bintrayModel);
-
-    }
-
-    private BintrayModel getRepoPackages(RestResponse artifactoryResponse, Map<String, String> headersMap, String repoKey) {
-        List<String> repoPackages = getRepoPackages(repoKey, artifactoryResponse, headersMap);
-        BintrayModel bintrayModel = new BintrayModel();
-        bintrayModel.setBinTrayPackages(repoPackages);
-        return bintrayModel;
-    }
-
-    /**
-     * get repositories packages
-     *
-     * @param repoKey    - repo key
-     * @param response   - encapsulated data related to response
-     * @param headersMap - headers map
-     * @return - list of repository packages
-     */
-    private List<String> getRepoPackages(String repoKey, RestResponse response, Map<String, String> headersMap) {
-        List<String> repoPackages = Lists.newArrayList();
-        try {
-            repoPackages = bintrayService.getPackagesToDeploy(repoKey, headersMap);
-        } catch (IOException e) {
-            response.error("Connection failed with exception: " + e.getMessage());
-        } catch (BintrayException e) {
-            response.error("Could not retrieve packages list for '" + repoKey + "'");
-        }
-        return repoPackages;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/bintray/GetBintrayRepositoriesService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/bintray/GetBintrayRepositoriesService.java
deleted file mode 100644
index f301481..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/bintray/GetBintrayRepositoriesService.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.artifactory.ui.rest.service.builds.bintray;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import org.artifactory.api.bintray.BintrayService;
-import org.artifactory.api.bintray.Repo;
-import org.artifactory.api.bintray.exception.BintrayException;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.builds.BintrayModel;
-import org.artifactory.ui.utils.RequestUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetBintrayRepositoriesService implements RestService {
-
-    @Autowired
-    BintrayService bintrayService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        Map<String, String> headersMap = RequestUtils.getHeadersMap(request.getServletRequest());
-        /// get bintray repositories
-        BintrayModel bintrayModel = getBintrayRepositories(response, headersMap);
-        // update response with model
-        response.iModel(bintrayModel);
-    }
-
-    /**
-     * get BintrayRepositoriesModel
-     *
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param headersMap          - request headers map
-     * @return - list of repositories
-     */
-    private BintrayModel getBintrayRepositories(RestResponse artifactoryResponse, Map<String, String> headersMap) {
-        List<String> bintrayRepos = getBintrayRepos(artifactoryResponse, headersMap);
-        BintrayModel bintrayModel = new BintrayModel();
-        bintrayModel.setBinTrayRepositories(bintrayRepos);
-        return bintrayModel;
-    }
-
-
-    /**
-     * get Bintray repositories
-     *
-     * @param response - encapsulate data related to response
-     * @return - list of repositories
-     */
-    private List<String> getBintrayRepos(RestResponse response, Map<String, String> headersMap) {
-        List<String> repos = Lists.newArrayList();
-        try {
-            List<Repo> reposToDeploy = bintrayService.getReposToDeploy(headersMap);
-            repos = Lists.newArrayList(Iterables.transform(reposToDeploy, new Function<Repo, String>() {
-                @Override
-                public String apply(Repo repo) {
-                    return repo.getOwner() + "/" + repo.getName();
-                }
-            }));
-        } catch (IOException e) {
-            response.error("Connection failed with exception: " + e.getMessage());
-
-        } catch (BintrayException e) {
-            response.error("Could not retrieve repositories list from Bintray.");
-        } catch (Exception e) {
-            response.error(e.getMessage().toString());
-        }
-        return repos;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/bintray/GetBintrayVersionsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/bintray/GetBintrayVersionsService.java
deleted file mode 100644
index 9b20efb..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/bintray/GetBintrayVersionsService.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package org.artifactory.ui.rest.service.builds.bintray;
-
-import com.google.common.collect.Lists;
-import org.artifactory.api.bintray.BintrayService;
-import org.artifactory.api.bintray.exception.BintrayException;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.builds.BintrayModel;
-import org.artifactory.ui.utils.RequestUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetBintrayVersionsService implements RestService {
-
-    @Autowired
-    BintrayService bintrayService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        Map<String, String> headersMap = RequestUtils.getHeadersMap(request.getServletRequest());
-        String repoKey = request.getQueryParamByKey("key");
-        String packageId = request.getQueryParamByKey("id");
-        // get packages versions
-        BintrayModel bintrayModel = getPackagesVersions(response, headersMap, repoKey, packageId);
-        response.iModel(bintrayModel);
-
-    }
-
-    /**
-     * return list of version on given package id and repoKey
-     *
-     * @param artifactoryResponse -encapsulate data related to reposne
-     * @param headersMap          - headers map
-     * @param repoKey             - repo key
-     * @param packageId           - packages id
-     * @return - list of version
-     */
-    private BintrayModel getPackagesVersions(RestResponse artifactoryResponse, Map<String, String> headersMap, String repoKey, String packageId) {
-        List<String> packageVersions = getPackageVersions(artifactoryResponse, repoKey, packageId, headersMap);
-        BintrayModel bintrayModel = new BintrayModel();
-        bintrayModel.setBinTrayVersions(packageVersions);
-        return bintrayModel;
-    }
-
-    /**
-     * return list of bintray packages
-     *
-     * @param response   - encapsulate data related re response
-     * @param repoKey    - repository key
-     * @param packageId  - package id
-     * @param headersMap - request headers map
-     * @return - list of package versions
-     */
-    private List<String> getPackageVersions(RestResponse response, String repoKey, String packageId,
-                                            Map<String, String> headersMap) {
-        List<String> packageVersions = Lists.newArrayList();
-        try {
-            packageVersions = bintrayService.getVersions(repoKey, packageId, headersMap);
-        } catch (IOException e) {
-            response.error("Connection failed with exception: " + e.getMessage());
-        } catch (BintrayException e) {
-            response.error("Could not retrieve versions list for Repository '" + repoKey + "' and Package '" + packageId + "'");
-        }
-
-        return packageVersions;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/bintray/PushArtifactToBintrayService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/bintray/PushArtifactToBintrayService.java
deleted file mode 100644
index eaecc9a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/bintray/PushArtifactToBintrayService.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package org.artifactory.ui.rest.service.builds.bintray;
-
-import org.artifactory.api.bintray.BintrayParams;
-import org.artifactory.api.bintray.BintrayService;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.ui.rest.model.builds.BintrayModel;
-import org.artifactory.ui.rest.service.builds.buildsinfo.tabs.governance.AbstractBuildService;
-import org.artifactory.ui.utils.RequestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class PushArtifactToBintrayService extends AbstractBuildService {
-    private static final Logger log = LoggerFactory.getLogger(PushArtifactToBintrayService.class);
-
-    @Autowired
-    BintrayService bintrayService;
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        try {
-            Map<String, String> headersMap = RequestUtils.getHeadersMap(request.getServletRequest());
-            BintrayModel bintrayModel = (BintrayModel) request.getImodel();
-            String repoKey = request.getQueryParamByKey("repoKey");
-            String path = request.getQueryParamByKey("path");
-            RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-            ItemInfo itemInfo = repositoryService.getItemInfo(repoPath);
-            BintrayParams bintrayParams = getBintrayParams(bintrayModel);
-            push(headersMap, response, itemInfo, bintrayParams);
-        } catch (Exception e) {
-            response.error(e.getMessage());
-            log.error(e.toString(), e);
-        }
-    }
-
-
-    /**
-     * get bintray params
-     *
-     * @param bintrayModel - bintray model
-     * @return - bintray params
-     */
-    private BintrayParams getBintrayParams(BintrayModel bintrayModel) {
-        return bintrayModel.getBintrayParams();
-    }
-
-
-    /**
-     * push to bintray sync
-     *
-     * @param headersMap   - headers map
-     * @param response     - encapsulate data related to request
-     * @param itemInfo        - Item info
-     * @param bintrayModel - bintray model
-     */
-    private void push(Map<String, String> headersMap, RestResponse response, ItemInfo itemInfo, BintrayParams bintrayModel) {
-        try {
-
-            BasicStatusHolder statusHolder = bintrayService.pushArtifact(itemInfo, bintrayModel, headersMap);
-            if (statusHolder.hasErrors()) {
-                response.error(statusHolder.getLastError().getMessage());
-            } else if (statusHolder.getWarnings().size() != 0) {
-                response.error(statusHolder.getWarnings().get(0).getMessage());
-            } else {
-                String successMessages = "Successfully pushed '" + itemInfo.getRelPath() + "' to ";
-                String versionFilesPathUrl = bintrayService.getVersionFilesUrl(bintrayModel);
-                response.info(successMessages);
-                response.url(versionFilesPathUrl);
-            }
-        } catch (IOException e) {
-            response.error("Connection failed with exception: " + e.getMessage());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/bintray/PushBuildToBintrayService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/bintray/PushBuildToBintrayService.java
deleted file mode 100644
index a0dc92f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/bintray/PushBuildToBintrayService.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package org.artifactory.ui.rest.service.builds.bintray;
-
-import org.artifactory.api.bintray.BintrayParams;
-import org.artifactory.api.bintray.BintrayService;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.common.StatusEntry;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.ui.rest.model.builds.BintrayModel;
-import org.artifactory.ui.rest.service.builds.buildsinfo.tabs.governance.AbstractBuildService;
-import org.artifactory.ui.utils.DateUtils;
-import org.artifactory.ui.utils.RequestUtils;
-import org.jfrog.build.api.Build;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class PushBuildToBintrayService extends AbstractBuildService {
-    private static final Logger log = LoggerFactory.getLogger(PushBuildToBintrayService.class);
-
-    @Autowired
-    BintrayService bintrayService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        try {
-            Map<String, String> headersMap = RequestUtils.getHeadersMap(request.getServletRequest());
-            String name = request.getPathParamByKey("name");
-            String buildNumber = request.getPathParamByKey("number");
-            String buildStarted = DateUtils.formatBuildDate(Long.parseLong(request.getPathParamByKey("date")));
-            BintrayModel bintrayModel = (BintrayModel) request.getImodel();
-            boolean background = Boolean.valueOf(request.getQueryParamByKey("background"));
-            BintrayParams bintrayParams = getBintrayParams(bintrayModel);
-            Build build = getBuild(name, buildNumber, buildStarted, response);
-            if (background) {
-                // push async
-                backgroundPush(headersMap, bintrayParams, build);
-            } else {// push sync
-                push(headersMap, response, build, bintrayParams);
-            }
-        } catch (Exception e) {
-            log.error(e.toString());
-        }
-    }
-
-
-    /**
-     * get bintray params
-     *
-     * @param bintrayModel - bintray model
-     * @return - bintray params
-     */
-    private BintrayParams getBintrayParams(BintrayModel bintrayModel) {
-        return bintrayModel.getBintrayParams();
-    }
-
-    /**
-     * push build to bintray async
-     *
-     * @param headersMap    - headers map from request
-     * @param bintrayParams - bintray params
-     * @param build         - build
-     */
-    private void backgroundPush(Map<String, String> headersMap, BintrayParams bintrayParams, Build build) {
-        bintrayService.executeAsyncPushBuild(build, bintrayParams, headersMap);
-        String buildNameAndNumber = build.getName() + ":" + build.getNumber();
-        String message = String.format(
-                "Background Push of build '%s' to Bintray successfully scheduled to run.", buildNameAndNumber);
-        log.info(message);
-    }
-
-    /**
-     * push to bintray sync
-     *
-     * @param headersMap   - headers map
-     * @param response     - encapsulate data related to request
-     * @param build        - build
-     * @param bintrayModel - bintray model
-     */
-    private void push(Map<String, String> headersMap, RestResponse response, Build build, BintrayParams bintrayModel) {
-        try {
-            BasicStatusHolder statusHolder = bintrayService.pushBuild(build, bintrayModel, headersMap);
-            if (statusHolder.hasErrors()) {
-                response.error(statusHolder.getLastError().getMessage());
-            } else if (statusHolder.hasWarnings()) {
-                List<StatusEntry> warnings = statusHolder.getWarnings();
-                response.error(warnings.get(warnings.size() - 1).getMessage());
-            } else {
-                String buildNameAndNumber = build.getName() + ":" + build.getNumber();
-                String versionFilesPathUrl = bintrayService.getVersionFilesUrl(bintrayModel);
-                String successMessages = "Successfully pushed build '" + buildNameAndNumber + "' to ";
-                response.info(successMessages);
-                response.url(versionFilesPathUrl);
-            }
-        } catch (IOException e) {
-            response.error("Connection failed with exception: " + e.getMessage());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/bintray/PushDockerTagToBintrayService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/bintray/PushDockerTagToBintrayService.java
deleted file mode 100644
index fd536ee..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/bintray/PushDockerTagToBintrayService.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.artifactory.ui.rest.service.builds.bintray;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.docker.DockerAddon;
-import org.artifactory.api.bintray.BintrayParams;
-import org.artifactory.api.bintray.docker.BintrayDockerPushRequest;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.ui.rest.model.builds.BintrayModel;
-import org.artifactory.ui.rest.service.builds.buildsinfo.tabs.governance.AbstractBuildService;
-import org.artifactory.util.PathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Shay Yaakov
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class PushDockerTagToBintrayService extends AbstractBuildService {
-    private static final Logger log = LoggerFactory.getLogger(PushDockerTagToBintrayService.class);
-
-    @Autowired
-    AddonsManager addonsManager;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        BintrayModel bintrayModel = (BintrayModel) request.getImodel();
-        BintrayParams bintrayParams = bintrayModel.getBintrayParams();
-        try {
-            String repoKey = request.getQueryParamByKey("repoKey");
-            String path = request.getQueryParamByKey("path");
-            RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-            push(repoPath, bintrayParams, response);
-        } catch (Exception e) {
-            String msg = e.toString();
-            if (msg.contains("is not a docker registry")) {
-                response.error("Repository " + bintrayParams.getRepo() + " is not a Docker V2 registry");
-            } else {
-                response.error("Error reported during the push. Please review the logs for further information");
-            }
-            log.error(msg, e);
-        }
-    }
-
-    private void push(RepoPath repoPath, BintrayParams bintrayParams, RestResponse response) {
-        String[] subjectRepo = StringUtils.split(bintrayParams.getRepo(), "/");
-        BintrayDockerPushRequest request = new BintrayDockerPushRequest();
-        request.async = true;
-        request.dockerTagName = PathUtils.getLastPathElement(repoPath.getPath());
-        request.dockerRepository = PathUtils.trimTrailingSlashes(StringUtils.removeEnd(repoPath.getPath(), request.dockerTagName));
-        request.bintraySubject = subjectRepo[0];
-        request.bintrayRepo = subjectRepo[1];
-        addonsManager.addonByType(DockerAddon.class).pushTagToBintray(repoPath.getRepoKey(), request, null);
-
-        String escapedImageUrl = ConstantValues.bintrayUrl.getString() +
-                "/" + request.bintraySubject +
-                "/" + request.bintrayRepo +
-                "/" + request.dockerRepository.replace( "/", "%3A") +
-                "/" + request.dockerTagName + "/view";
-
-        response.info("Pushing " + "<a href=\"" + escapedImageUrl + "\" target=\"_blank\">" + request.dockerRepository + ":" + request.dockerTagName + "</a>" + " to Bintray...<br/>" +
-                "Image will be published in a few moments");
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/DeleteAllBuildsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/DeleteAllBuildsService.java
deleted file mode 100644
index f9a3c41..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/DeleteAllBuildsService.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo;
-
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.common.StatusEntry;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.builds.BuildCoordinate;
-import org.artifactory.ui.rest.model.builds.DeleteBuildsModel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import java.util.List;
-
-/**
- * @author Chen Keinans
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
-public class DeleteAllBuildsService<T extends DeleteBuildsModel> implements RestService<T> {
-    private static final Logger log = LoggerFactory.getLogger(DeleteAllBuildsService.class);
-
-    @Autowired
-    private BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-        T model = request.getImodel();
-        for (BuildCoordinate coordinate : model.getBuildsCoordinates()) {
-            // delete all builds and update response
-            deleteAllBuildsAndUpdateResponse(response, coordinate.getBuildName());
-        }
-        if (model.getBuildsCoordinates().size() > 1) {
-            response.info("Successfully removed " + model.getBuildsCoordinates().size() + " build projects");
-        } else if (model.getBuildsCoordinates().size() == 1) {
-            response.info(
-                    "Successfully removed " + model.getBuildsCoordinates().get(0).getBuildName() + " build project");
-        }
-    }
-
-    /**
-     * delete all builds and update response
-     *
-     * @param artifactoryResponse - delete all build and update response
-     */
-    private void deleteAllBuildsAndUpdateResponse(RestResponse artifactoryResponse, String buildName) {
-        BasicStatusHolder multiStatusHolder = new BasicStatusHolder();
-        try {
-            // delete all builds by name
-            buildService.deleteAllBuilds(buildName);
-            multiStatusHolder.status(String.format("Successfully deleted all " + buildName + " builds"),
-                    log);
-            if (multiStatusHolder.hasErrors()) {
-                artifactoryResponse.error(multiStatusHolder.getLastError().getMessage());
-            } else if (multiStatusHolder.hasWarnings()) {
-                List<StatusEntry> warnings = multiStatusHolder.getWarnings();
-                artifactoryResponse.warn(warnings.get(warnings.size() - 1).getMessage());
-                return;
-            }
-        } catch (Exception exception) {
-            String error = String.format("Exception occurred while deleting all builds");
-            multiStatusHolder.error(error, exception, log);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/DeleteBuildService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/DeleteBuildService.java
deleted file mode 100644
index f70aa9e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/DeleteBuildService.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo;
-
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.build.BuildRun;
-import org.artifactory.common.StatusEntry;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.builds.BuildCoordinate;
-import org.artifactory.ui.rest.model.builds.DeleteBuildsModel;
-import org.artifactory.ui.utils.DateUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import java.util.List;
-
-/**
- * @author Chen Keinans
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
-public class DeleteBuildService<T extends DeleteBuildsModel> implements RestService<T> {
-    private static final Logger log = LoggerFactory.getLogger(DeleteBuildService.class);
-
-    @Autowired
-    private BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<T> request, RestResponse response) {
-        T model = request.getImodel();
-        List<BuildCoordinate> buildsCoordinates = model.getBuildsCoordinates();
-        // Delete all coordinates
-        for (BuildCoordinate coordinate : buildsCoordinates) {
-            // Delete specific build and update response feedback
-            deleteSpecificBuildsAndUpdateResponse(response, coordinate);
-        }
-        if (model.getBuildsCoordinates().size() > 1) {
-            response.info("Successfully removed " + model.getBuildsCoordinates().size() + " builds");
-        } else if (model.getBuildsCoordinates().size() == 1) {
-            BuildCoordinate coordinate = model.getBuildsCoordinates().get(0);
-            response.info(
-                    "Successfully removed " + coordinate.getBuildName() + " #" + coordinate.getBuildNumber() + " build");
-        }
-    }
-
-    /**
-     * delete Build by "build coordinate"
-     */
-    private void deleteSpecificBuildsAndUpdateResponse(RestResponse response, BuildCoordinate coordinate) {
-        String buildName = coordinate.getBuildName();
-        String buildNumber = coordinate.getBuildNumber();
-        long buildDate = coordinate.getDate();
-        BasicStatusHolder multiStatusHolder = new BasicStatusHolder();
-        try {
-            String buildStarted = DateUtils.formatBuildDate(buildDate);
-            BuildRun buildRun = buildService.getBuildRun(buildName, buildNumber, buildStarted);
-            buildService.deleteBuild(buildRun, false, multiStatusHolder);
-            multiStatusHolder.status(String.format("Successfully deleted build '%s' #%s", buildName, buildNumber),
-                    log);
-            if (multiStatusHolder.hasErrors()) {
-                response.error(multiStatusHolder.getLastError().getMessage());
-            } else if (multiStatusHolder.hasWarnings()) {
-                List<StatusEntry> warnings = multiStatusHolder.getWarnings();
-                response.warn(warnings.get(warnings.size() - 1).getMessage());
-                return;
-            }
-        } catch (Exception exception) {
-            String error = String.format("Exception occurred while deleting build '%s' #%s", buildName, buildNumber);
-            multiStatusHolder.error(error, exception, log);
-            response.error(error);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/GetAllBuildsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/GetAllBuildsService.java
deleted file mode 100644
index 2189f20..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/GetAllBuildsService.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo;
-
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.build.BuildRun;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.PagingData;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.permission.PagingModel;
-import org.artifactory.ui.rest.model.builds.GeneralBuildInfo;
-import org.artifactory.ui.utils.ModelDbMap;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetAllBuildsService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(GetAllBuildsService.class);
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Autowired
-    BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        // get paging data from request
-        PagingData pagingData = request.getPagingData();
-        // fetch build info data
-        fetchAllBuildsData(response, pagingData);
-    }
-
-    /**
-     * fect all build data by type
-     *
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param pagingData          - paging data sa send from client
-     */
-    private void fetchAllBuildsData(RestResponse artifactoryResponse, PagingData pagingData) {
-        Map<String, String> buildsMap = ModelDbMap.getBuildsMap();
-        String offset = pagingData.getStartOffset();
-        String orderBy = buildsMap.get(pagingData.getOrderBy());
-        String direction = pagingData.getDirection();
-        String limit = pagingData.getLimit();
-        Set<BuildRun> latestBuildsPaging = buildService.getLatestBuildsPaging(offset, orderBy, direction, limit);
-        if (latestBuildsPaging != null && !latestBuildsPaging.isEmpty()) {
-            List<GeneralBuildInfo> generalBuildInfoList = new ArrayList<>();
-            latestBuildsPaging.forEach(buildRun ->
-                    generalBuildInfoList.add(new GeneralBuildInfo(new GeneralBuildInfo.BuildBuilder()
-                                    .buildName(buildRun.getName())
-                                    .lastBuildTime(centralConfigService.getDateFormatter().print(buildRun.getStartedDate().getTime()))
-                                    .buildNumber(buildRun.getNumber()).ciUrl(buildRun.getCiUrl()).
-                                            time(buildRun.getStartedDate() != null ? buildRun.getStartedDate().getTime() : 0))
-                    ));
-            PagingModel pagingModel = new PagingModel(0, generalBuildInfoList);
-            artifactoryResponse.iModel(pagingModel);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/GetBuildHistoryService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/GetBuildHistoryService.java
deleted file mode 100644
index f166efd..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/GetBuildHistoryService.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.build.ArtifactBuildAddon;
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.build.GeneralBuild;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.PagingData;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.permission.PagingModel;
-import org.artifactory.ui.rest.model.builds.GeneralBuildInfo;
-import org.artifactory.ui.utils.ModelDbMap;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetBuildHistoryService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(GetBuildHistoryService.class);
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Autowired
-    BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        // get paging data from request
-        PagingData pagingData = request.getPagingData();
-        String buildName = request.getPathParamByKey("name");
-        // fetch build info data
-        fetchAllBuildsData(response, pagingData, buildName);
-    }
-
-    /**
-     * fect all build data by type
-     *
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param pagingData          - paging data sa send from client
-     */
-    private void fetchAllBuildsData(RestResponse artifactoryResponse, PagingData pagingData, String buildName) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        ArtifactBuildAddon artifactBuildAddon = addonsManager.addonByType(ArtifactBuildAddon.class);
-        Map<String, String> buildsMap = ModelDbMap.getBuildsMap();
-        String offset = pagingData.getStartOffset();
-        String orderBy = buildsMap.get(pagingData.getOrderBy());
-        String direction = pagingData.getDirection();
-        String limit = pagingData.getLimit();
-        try {
-            List<GeneralBuild> latestBuildsPaging = buildService.getBuildForNamePaging(buildName, orderBy, direction,
-                    offset, limit);
-            if (latestBuildsPaging != null && !latestBuildsPaging.isEmpty()) {
-                List<GeneralBuildInfo> generalBuildInfoList = new ArrayList<>();
-                latestBuildsPaging.forEach(buildRun ->
-                        generalBuildInfoList.add(new GeneralBuildInfo(new GeneralBuildInfo.BuildBuilder().buildNumber(buildRun.getBuildNumber())
-                                        .lastBuildTime(centralConfigService.getDateFormatter().print(buildRun.getBuildDate())).
-                                                releaseStatus(buildRun.getStatus())
-                                        .ciUrl(buildRun.getCiUrl()).time(buildRun.getBuildDate()).
-                                                time(buildRun.getBuildDate()).buildStat("Modules-" + buildRun.getNumOfModules() +
-                                                ", Artifacts-" + buildRun.getNumOfArtifacts() + ", Dependencies-" + buildRun.getNumOfDependencies()))
-                        ));
-                PagingModel pagingModel = new PagingModel(0, generalBuildInfoList);
-                artifactoryResponse.iModel(pagingModel);
-            }
-        } catch (SQLException e) {
-            log.error(e.toString());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/GetPrevBuildListService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/GetPrevBuildListService.java
deleted file mode 100644
index 80d81c3..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/GetPrevBuildListService.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo;
-
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.build.GeneralBuild;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.builds.GeneralBuildInfo;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetPrevBuildListService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(GetPrevBuildListService.class);
-
-    @Autowired
-    BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-
-        String buildName = request.getPathParamByKey("name");
-        String date = request.getPathParamByKey("date");
-        // fetch build info data
-        fetchAllBuildsData(response, buildName, date);
-    }
-
-    /**
-     * fetch all build data by type
-     *
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param pagingData          - paging data sa send from client
-     */
-    /**
-     * fetch all build data by type
-     *
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param buildName           - current build name
-     * @param buildDate           - current build date
-     */
-    private void fetchAllBuildsData(RestResponse artifactoryResponse, String buildName, String buildDate) {
-        List<GeneralBuild> prevBuildsList = buildService.getPrevBuildsList(buildName, buildDate);
-        List<GeneralBuildInfo> generalBuildInfoList = new ArrayList<>();
-        prevBuildsList.forEach(buildRun ->
-                generalBuildInfoList.add(new GeneralBuildInfo(new GeneralBuildInfo.BuildBuilder().buildNumber(buildRun.getBuildNumber()).
-                        time(buildRun.getBuildDate()))));
-        artifactoryResponse.iModelList(generalBuildInfoList);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/GetPreviouseBuildsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/GetPreviouseBuildsService.java
deleted file mode 100644
index b75041c..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/GetPreviouseBuildsService.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo;
-
-import org.artifactory.api.build.BuildService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetPreviouseBuildsService implements RestService {
-
-    @Autowired
-    BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-
-
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/BuildIssuesService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/BuildIssuesService.java
deleted file mode 100644
index d949769..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/BuildIssuesService.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo.tabs;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.build.BuildService;
-import org.artifactory.build.BuildRun;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-import org.artifactory.ui.rest.model.builds.IssueModel;
-import org.artifactory.ui.utils.DateUtils;
-import org.jfrog.build.api.Build;
-import org.jfrog.build.api.Issue;
-import org.jfrog.build.api.Issues;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletResponse;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class BuildIssuesService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(BuildIssuesService.class);
-
-
-    @Autowired
-    BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String name = request.getPathParamByKey("name");
-        String buildNumber = request.getPathParamByKey("number");
-        try {
-            String buildStarted = DateUtils.formatBuildDate(Long.parseLong(request.getPathParamByKey("date")));
-            // fetch build issues
-            fetchBuildIssues(response, name, buildNumber, buildStarted);
-        } catch (ParseException e) {
-            log.error(e.toString());
-        }
-    }
-
-    /**
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param name                - build name
-     * @param buildNumber         - build number
-     * @param buildStarted        - build date
-     */
-    private void fetchBuildIssues(RestResponse artifactoryResponse, String name, String buildNumber, String buildStarted) {
-        Build build = getBuild(name, buildNumber, buildStarted, artifactoryResponse);
-        Issues issues = build.getIssues();
-        if (issues == null) {
-            artifactoryResponse.iModelList(new ArrayList<>());
-            return;
-        }
-        Set<Issue> affectedIssues = issues.getAffectedIssues();
-        List<IssueModel> issuesList = new ArrayList<>();
-        affectedIssues.forEach(issue -> issuesList.add(new IssueModel(issue)));
-        artifactoryResponse.iModelList(issuesList);
-    }
-
-    /**
-     * get build info
-     *
-     * @param buildName    - build name
-     * @param buildNumber  - build number
-     * @param buildStarted - build date
-     * @param response     - encapsulate data related to request
-     * @return
-     */
-    private Build getBuild(String buildName, String buildNumber, String buildStarted, RestResponse response) {
-        boolean buildStartedSupplied = StringUtils.isNotBlank(buildStarted);
-        try {
-            Build build = null;
-            if (buildStartedSupplied) {
-                BuildRun buildRun = buildService.getBuildRun(buildName, buildNumber, buildStarted);
-                if (buildRun != null) {
-                    build = buildService.getBuild(buildRun);
-                }
-            } else {
-                //Take the latest build of the specified number
-                build = buildService.getLatestBuildByNameAndNumber(buildName, buildNumber);
-            }
-            if (build == null) {
-                StringBuilder builder = new StringBuilder().append("Could not find build '").append(buildName).
-                        append("' #").append(buildNumber);
-                if (buildStartedSupplied) {
-                    builder.append(" that started at ").append(buildStarted);
-                }
-                throwNotFoundError(response, builder.toString());
-            }
-            return build;
-        } catch (RepositoryRuntimeException e) {
-            String errorMessage = new StringBuilder().append("Error locating latest build for '").append(buildName).
-                    append("' #").append(buildNumber).append(": ").append(e.getMessage()).toString();
-            throwInternalError(errorMessage, response);
-        }
-        //Should not happen
-        return null;
-    }
-
-    /**
-     * Throws a 404 AbortWithHttpErrorCodeException with the given message
-     *
-     * @param errorMessage Message to display in the error
-     */
-    private void throwNotFoundError(RestResponse response, String errorMessage) {
-        log.error(errorMessage);
-        response.error(errorMessage);
-    }
-
-    /**
-     * return not found error
-     *
-     * @param errorMessage
-     * @param response
-     */
-    private void throwInternalError(String errorMessage, RestResponse response) {
-        response.error(errorMessage);
-        response.responseCode(HttpServletResponse.SC_NOT_FOUND);
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/BuildReleaseHistoryService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/BuildReleaseHistoryService.java
deleted file mode 100644
index b3f0e21..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/BuildReleaseHistoryService.java
+++ /dev/null
@@ -1,135 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo.tabs;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.build.BuildService;
-import org.artifactory.build.BuildRun;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-import org.artifactory.ui.rest.model.builds.PromotionStatusModel;
-import org.artifactory.ui.utils.DateUtils;
-import org.jfrog.build.api.Build;
-import org.jfrog.build.api.release.PromotionStatus;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletResponse;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class BuildReleaseHistoryService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(BuildReleaseHistoryService.class);
-
-    @Autowired
-    BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String name = request.getPathParamByKey("name");
-        String buildNumber = request.getPathParamByKey("number");
-        try {
-            String buildStarted = DateUtils.formatBuildDate(Long.parseLong(request.getPathParamByKey("date")));
-            // fetch build release history
-            fetchBuildReleaseHistory(response, name, buildNumber, buildStarted);
-        } catch (ParseException e) {
-            log.error(e.toString());
-        }
-    }
-
-    /**
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param name                - build name
-     * @param buildNumber         - build number
-     * @param buildStarted        - build date
-     */
-    private void fetchBuildReleaseHistory(RestResponse artifactoryResponse, String name, String buildNumber, String buildStarted) {
-        Build build = getBuild(name, buildNumber, buildStarted, artifactoryResponse);
-        List<PromotionStatus> statuses = build != null ? build.getStatuses() : null;
-
-        if (statuses == null || statuses.isEmpty()) {
-            artifactoryResponse.iModelList(new ArrayList<>());
-            return;
-        }
-
-        List<PromotionStatusModel> promotionStatusList = new ArrayList<>();
-        Comparator<PromotionStatus> comparator = (o1, o2) -> o1.getTimestampDate().compareTo(o2.getTimestampDate());
-        statuses.stream()
-                .sorted(comparator.reversed())
-                .forEach(promotionStatus -> promotionStatusList.add(new PromotionStatusModel(promotionStatus)));
-        artifactoryResponse.iModelList(promotionStatusList);
-    }
-
-    /**
-     * get build info
-     *
-     * @param buildName    - build name
-     * @param buildNumber  - build number
-     * @param buildStarted - build date
-     * @param response     - encapsulate data related to request
-     * @return
-     */
-    private Build getBuild(String buildName, String buildNumber, String buildStarted, RestResponse response) {
-        boolean buildStartedSupplied = StringUtils.isNotBlank(buildStarted);
-        try {
-            Build build = null;
-            if (buildStartedSupplied) {
-                BuildRun buildRun = buildService.getBuildRun(buildName, buildNumber, buildStarted);
-                if (buildRun != null) {
-                    build = buildService.getBuild(buildRun);
-                }
-            } else {
-                //Take the latest build of the specified number
-                build = buildService.getLatestBuildByNameAndNumber(buildName, buildNumber);
-            }
-            if (build == null) {
-                StringBuilder builder = new StringBuilder().append("Could not find build '").append(buildName).
-                        append("' #").append(buildNumber);
-                if (buildStartedSupplied) {
-                    builder.append(" that started at ").append(buildStarted);
-                }
-                throwNotFoundError(response, builder.toString());
-            }
-            return build;
-        } catch (RepositoryRuntimeException e) {
-            String errorMessage = new StringBuilder().append("Error locating latest build for '").append(buildName).
-                    append("' #").append(buildNumber).append(": ").append(e.getMessage()).toString();
-            throwInternalError(errorMessage, response);
-        }
-        //Should not happen
-        return null;
-    }
-
-    /**
-     * Throws a 404 AbortWithHttpErrorCodeException with the given message
-     *
-     * @param errorMessage Message to display in the error
-     */
-    private void throwNotFoundError(RestResponse response, String errorMessage) {
-        log.error(errorMessage);
-        response.error(errorMessage);
-    }
-
-    /**
-     * return not found error
-     *
-     * @param errorMessage
-     * @param response
-     */
-    private void throwInternalError(String errorMessage, RestResponse response) {
-        response.error(errorMessage);
-        response.responseCode(HttpServletResponse.SC_NOT_FOUND);
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/GetBuildGeneralInfoService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/GetBuildGeneralInfoService.java
deleted file mode 100644
index 1bda06c..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/GetBuildGeneralInfoService.java
+++ /dev/null
@@ -1,136 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo.tabs;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.build.BuildService;
-import org.artifactory.build.BuildRun;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-import org.artifactory.ui.rest.model.builds.GeneralBuildInfo;
-import org.artifactory.ui.utils.DateUtils;
-import org.jfrog.build.api.Build;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.text.ParseException;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetBuildGeneralInfoService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(GetBuildGeneralInfoService.class);
-
-    @Autowired
-    BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        try {
-            String buildName = request.getPathParamByKey("name");
-            String buildNumber = request.getPathParamByKey("number");
-            String date = request.getPathParamByKey("date");
-            String buildStarted = null;
-            if (StringUtils.isNotBlank(date)) {
-                buildStarted = DateUtils.formatBuildDate(Long.parseLong(date));
-            }
-            // get Build and update response
-            getBuildAndUpdateResponse(response, buildName, buildNumber, buildStarted);
-        } catch (ParseException e) {
-            response.error("problem with fetching builds");
-        }
-    }
-
-    /**
-     * populate build info from build model and update response
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param buildName           - build name
-     * @param buildNumber         - build number
-     * @param buildStarted        - build start date
-     */
-    private void getBuildAndUpdateResponse(RestResponse artifactoryResponse, String buildName, String buildNumber,
-            String buildStarted) {
-        Build build = getBuild(buildName, buildNumber, buildStarted, artifactoryResponse);
-        Long time = null;
-        try {
-            time = DateUtils.toBuildDate(build.getStarted());
-        } catch (Exception e) {
-            log.warn("Fail to parse the build started field: setting it as null.");
-        }
-        String buildAgent = (build.getBuildAgent() == null) ? null : build.getBuildAgent().toString();
-        GeneralBuildInfo generalBuildInfo = new GeneralBuildInfo(new GeneralBuildInfo.BuildBuilder()
-                .buildName(build.getName())
-                .lastBuildTime(buildStarted)
-                .agent(build.getAgent().toString())
-                .buildAgent(buildAgent)
-                .artifactoryPrincipal(build.getArtifactoryPrincipal())
-                .principal(build.getPrincipal())
-                .duration(DateUtils.getDuration(build.getDurationMillis()))
-                .buildNumber(buildNumber)
-                .time(time)
-                .url(build.getUrl()));
-        artifactoryResponse.iModel(generalBuildInfo);
-    }
-
-    /**
-     * get build model
-     *
-     * @param buildName    - build name
-     * @param buildNumber  - build number
-     * @param buildStarted - build start date
-     * @param response     - encapsulate data require for response
-     * @return
-     */
-    private Build getBuild(String buildName, String buildNumber, String buildStarted, RestResponse response) {
-        boolean buildStartedSupplied = StringUtils.isNotBlank(buildStarted);
-        try {
-            Build build = null;
-            build = getBuild(buildName, buildNumber, buildStarted, buildStartedSupplied, build);
-            if (build == null) {
-                StringBuilder builder = new StringBuilder().append("Could not find build '").append(buildName).
-                        append("' #").append(buildNumber);
-                if (buildStartedSupplied) {
-                    builder.append(" that started at ").append(buildStarted);
-                }
-                response.error(builder.toString());
-            }
-            return build;
-        } catch (RepositoryRuntimeException e) {
-            String errorMessage = new StringBuilder().append("Error locating latest build for '").append(buildName).
-                    append("' #").append(buildNumber).append(": ").append(e.getMessage()).toString();
-            response.error(errorMessage);
-        }
-        return null;
-    }
-
-    /**
-     * get build general info
-     *
-     * @param buildName            - build n name
-     * @param buildNumber          - build number
-     * @param buildStarted         - build started date
-     * @param buildStartedSupplied - build started supplier
-     * @param build                - run build model
-     * @return - build model
-     */
-    private Build getBuild(String buildName, String buildNumber, String buildStarted, boolean buildStartedSupplied,
-            Build build) {
-        if (buildStartedSupplied) {
-            BuildRun buildRun = buildService.getBuildRun(buildName, buildNumber, buildStarted);
-            if (buildRun != null) {
-                build = buildService.getBuild(buildRun);
-            }
-        } else {
-            //Take the latest build of the specified number
-            build = buildService.getLatestBuildByNameAndNumber(buildName, buildNumber);
-        }
-        return build;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/GetBuildJsonService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/GetBuildJsonService.java
deleted file mode 100644
index 37d8828..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/GetBuildJsonService.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo.tabs;
-
-import org.artifactory.api.build.BuildService;
-import org.artifactory.build.BuildRun;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.action.ViewArtifact;
-import org.artifactory.ui.utils.DateUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.text.ParseException;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetBuildJsonService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(GetBuildJsonService.class);
-
-    @Autowired
-    BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        try {
-            String buildName = request.getPathParamByKey("name");
-            String buildNumber = request.getPathParamByKey("number");
-            String buildStarted = DateUtils.formatBuildDate(Long.parseLong(request.getPathParamByKey("date")));
-            BuildRun buildRun = buildService.getBuildRun(buildName, buildNumber, buildStarted);
-            String buildJson = buildService.getBuildAsJson(buildRun);
-            ViewArtifact buildJsonModel = new ViewArtifact();
-            buildJsonModel.setFileContent(buildJson);
-            response.iModel(buildJsonModel);
-        } catch (ParseException e) {
-            log.error(e.toString());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/builddiff/BuildDiffService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/builddiff/BuildDiffService.java
deleted file mode 100644
index adc60f7..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/builddiff/BuildDiffService.java
+++ /dev/null
@@ -1,182 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo.tabs.builddiff;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.build.ArtifactBuildAddon;
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.build.diff.BuildsDiffBaseFileModel;
-import org.artifactory.api.build.diff.BuildsDiffDependencyModel;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.rest.build.diff.BuildsDiff;
-import org.artifactory.build.BuildRun;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.builds.BuildDiffModel;
-import org.artifactory.ui.rest.model.builds.BuildPropsModel;
-import org.artifactory.ui.rest.model.builds.ModuleArtifactModel;
-import org.artifactory.ui.rest.model.builds.ModuleDependencyModel;
-import org.artifactory.ui.utils.DateUtils;
-import org.artifactory.util.HttpUtils;
-import org.jfrog.build.api.Build;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class BuildDiffService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(BuildDiffService.class);
-
-
-    @Autowired
-    BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        try {
-            String name = request.getPathParamByKey("name");
-            String buildNumber = request.getPathParamByKey("number");
-            String comparedBuildNum = request.getQueryParamByKey("otherNumber");
-            String comparedDate = DateUtils.formatBuildDate(Long.parseLong(request.getQueryParamByKey("otherDate")));
-            String buildStarted = DateUtils.formatBuildDate(Long.parseLong(request.getPathParamByKey("date")));
-            Boolean exDep = Boolean.valueOf(request.getQueryParamByKey("exDep"));
-            BuildRun buildRun = buildService.getBuildRun(name, buildNumber, buildStarted);
-            BuildDiffModel buildDiffModel = new BuildDiffModel();
-            // fetch build diff data
-            if (!exDep) {
-                BuildsDiff buildsDiff = fetchBuildsDiffData(request, name, comparedBuildNum, comparedDate, buildRun);
-                List<ModuleArtifactModel> moduleArtifactModels = updateArtifact(buildsDiff);
-                List<BuildPropsModel> buildPropsModels = updateProps(buildsDiff);
-                List<ModuleDependencyModel> moduleDependencyModels = updateDependency(buildsDiff);
-                updateDiffModel(moduleArtifactModels, buildPropsModels, moduleDependencyModels, buildDiffModel);
-            } else {
-                updateDependenciesWithExcludeInternal(name, comparedBuildNum, comparedDate, buildRun, buildDiffModel);
-            }
-            // update build diff model
-            response.iModel(buildDiffModel);
-        } catch (Exception e) {
-            log.error(e.toString());
-            response.error("error running build diff");
-        }
-    }
-
-    /**
-     * update dependencies with exclude internal
-     *
-     * @param name             - dependency name
-     * @param comparedBuildNum - compared build num
-     * @param comparedDate     - compared build date
-     * @param buildRun         - build run
-     * @param buildDiffModel   -- build diff model
-     */
-    private void updateDependenciesWithExcludeInternal(String name, String comparedBuildNum, String comparedDate, BuildRun buildRun, BuildDiffModel buildDiffModel) {
-        BuildRun secondBuildRun = buildService.getBuildRun(name, comparedBuildNum,
-                comparedDate);
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        ArtifactBuildAddon artifactBuildAddon = addonsManager.addonByType(ArtifactBuildAddon.class);
-        Build build = buildService.getBuild(buildRun);
-        Build secondBuild = buildService.getBuild(secondBuildRun);
-        Map<String, BuildsDiffBaseFileModel> artifactMap = new HashMap<>();
-        List<BuildsDiffBaseFileModel> artifactDiff = artifactBuildAddon.compareArtifacts(build, secondBuild);
-        artifactDiff.forEach(artifact -> {
-            artifactMap.put(artifact.getSha1(), artifact);
-        });
-        List<BuildsDiffBaseFileModel> dependencyDiff = artifactBuildAddon.compareDependencies(build, secondBuild);
-        List<ModuleDependencyModel> moduleDependencies = new ArrayList<>();
-        dependencyDiff.forEach(dependency -> {
-            if (artifactMap.get(dependency.getSha1()) == null) {
-                moduleDependencies.add(new ModuleDependencyModel((BuildsDiffDependencyModel) dependency));
-            }
-        });
-        buildDiffModel.setDependencies(moduleDependencies);
-    }
-
-    /**
-     * update diff model
-     *
-     * @param moduleArtifactModels   - module artifatc model
-     * @param buildPropsModels       - builds props model
-     * @param moduleDependencyModels - module dependency model
-     * @param buildDiffModel         -  build diff model
-     */
-    private void updateDiffModel(List<ModuleArtifactModel> moduleArtifactModels, List<BuildPropsModel> buildPropsModels, List<ModuleDependencyModel> moduleDependencyModels, BuildDiffModel buildDiffModel) {
-        buildDiffModel.setArtifacts(moduleArtifactModels);
-        buildDiffModel.setDependencies(moduleDependencyModels);
-        buildDiffModel.setProps(buildPropsModels);
-    }
-
-    /**
-     * fetch build diff via comparator
-     * @param artifactoryRequest - encapsulate data related to request
-     * @param name - build name
-     * @param comparedBuildNum - compared build num
-     * @param comparedDate - compared build date
-     * @param buildRun - build run
-     * @return
-     */
-    private BuildsDiff fetchBuildsDiffData(ArtifactoryRestRequest artifactoryRequest, String name, String comparedBuildNum, String comparedDate, BuildRun buildRun) {
-        BuildRun secondBuildRun = buildService.getBuildRun(name, comparedBuildNum,
-                comparedDate);
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        ArtifactBuildAddon artifactBuildAddon = addonsManager.addonByType(ArtifactBuildAddon.class);
-        HttpServletRequest request = artifactoryRequest.getServletRequest();
-        Build build = buildService.getBuild(buildRun);
-        Build secondBuild = buildService.getBuild(secondBuildRun);
-        return artifactBuildAddon.getBuildsDiff(build, secondBuild,
-                HttpUtils.getServletContextUrl(request));
-    }
-
-    /**
-     * update artifact diff list
-     *
-     * @param buildsDiff - build diff artifact list
-     */
-    private List<ModuleArtifactModel> updateArtifact(BuildsDiff buildsDiff) {
-        List<ModuleArtifactModel> artifacts = new ArrayList<>();
-        buildsDiff.artifacts.newItems.forEach(artifact -> artifacts.add(new ModuleArtifactModel(artifact)));
-        buildsDiff.artifacts.removed.forEach(artifact -> artifacts.add(new ModuleArtifactModel(artifact)));
-        buildsDiff.artifacts.unchanged.forEach(artifact -> artifacts.add(new ModuleArtifactModel(artifact)));
-        buildsDiff.artifacts.updated.forEach(artifact -> artifacts.add(new ModuleArtifactModel(artifact)));
-        return artifacts;
-    }
-
-    /**
-     * update dependency diff list
-     *
-     * @param buildsDiff - build diff artifact list
-     */
-    private List<ModuleDependencyModel> updateDependency(BuildsDiff buildsDiff) {
-        List<ModuleDependencyModel> dependencyList = new ArrayList<>();
-        buildsDiff.dependencies.newItems.forEach(dependency -> dependencyList.add(new ModuleDependencyModel(dependency)));
-        buildsDiff.dependencies.removed.forEach(dependency -> dependencyList.add(new ModuleDependencyModel(dependency)));
-        buildsDiff.dependencies.unchanged.forEach(dependency -> dependencyList.add(new ModuleDependencyModel(dependency)));
-        buildsDiff.dependencies.updated.forEach(dependency -> dependencyList.add(new ModuleDependencyModel(dependency)));
-        return dependencyList;
-    }
-
-    /**
-     * update props diff list
-     *
-     * @param buildsDiff - build diff artifact list
-     */
-    private List<BuildPropsModel> updateProps(BuildsDiff buildsDiff) {
-        List<BuildPropsModel> props = new ArrayList<>();
-        buildsDiff.properties.newItems.forEach(property -> props.add(new BuildPropsModel(property)));
-        buildsDiff.properties.removed.forEach(property -> props.add(new BuildPropsModel(property)));
-        buildsDiff.properties.unchanged.forEach(property -> props.add(new BuildPropsModel(property)));
-        buildsDiff.properties.updated.forEach(property -> props.add(new BuildPropsModel(property)));
-        return props;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/builddiff/DiffBuildArtifactService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/builddiff/DiffBuildArtifactService.java
deleted file mode 100644
index 4dc6b84..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/builddiff/DiffBuildArtifactService.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo.tabs.builddiff;
-
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.build.ModuleArtifact;
-import org.artifactory.api.build.diff.BuildParams;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.PagingData;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.permission.PagingModel;
-import org.artifactory.ui.rest.model.builds.ModuleArtifactModel;
-import org.artifactory.ui.utils.ActionUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DiffBuildArtifactService implements RestService {
-
-    @Autowired
-    BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String name = request.getPathParamByKey("name");
-        String moduleId = request.getPathParamByKey("id");
-        String buildNumber = request.getPathParamByKey("number");
-        String comparedBuildNum = request.getQueryParamByKey("otherNumber");
-        String comparedDate = request.getQueryParamByKey("otherDate");
-        String buildStarted = request.getPathParamByKey("date");
-        PagingData pagingData = request.getPagingData();
-        // fetch build artifact diff data with another build
-        fetchBuildArtifactDiffData(request, response, name, moduleId, buildNumber, comparedBuildNum, comparedDate, buildStarted, pagingData);
-    }
-
-    /**
-     * fetch build artifact diff with another build data
-     *
-     * @param artifactoryRequest  - encapsulate data related to request
-     * @param artifactoryResponse - encapsulate data require for responsse
-     * @param name                - build name
-     * @param buildNumber         - current build number
-     * @param comparedBuildNum    - compared build number
-     * @param comparedDate        - compared build date
-     * @param buildStarted        - current build date
-     * @param pagingData          - paging data
-     */
-    private void fetchBuildArtifactDiffData(ArtifactoryRestRequest artifactoryRequest, RestResponse artifactoryResponse, String name, String moduleId, String buildNumber, String comparedBuildNum, String comparedDate, String buildStarted, PagingData pagingData) {
-        BuildParams buildParams = new BuildParams(moduleId, buildNumber, comparedBuildNum, comparedDate, buildStarted, name);
-        buildParams.setAllArtifact(true);
-        List<ModuleArtifact> moduleArtifacts = buildService.getModuleArtifactsForDiffWithPaging(buildParams,
-                pagingData.getStartOffset(), pagingData.getLimit());
-        List<ModuleArtifactModel> moduleArtifactModels = new ArrayList<>();
-        if (moduleArtifacts != null && !moduleArtifacts.isEmpty()) {
-           /* int count = buildService.getModuleArtifactsForDiffCount(buildParams,
-                    pagingData.getStartOffset(), pagingData.getLimit());*/
-            moduleArtifacts.forEach(moduleArtifact -> {
-                String downloadLink = moduleArtifact.getRepoKey() == null ? null : ActionUtils.getDownloadLink(artifactoryRequest.getServletRequest(),
-                        moduleArtifact.getRepoKey(), moduleArtifact.getPath());
-                ModuleArtifactModel artifactModel = new ModuleArtifactModel(moduleArtifact,
-                        downloadLink);
-                moduleArtifactModels.add(artifactModel);
-            });
-            PagingModel pagingModel = new PagingModel(0, moduleArtifactModels);
-            artifactoryResponse.iModel(pagingModel);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/builddiff/DiffBuildDependenciesService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/builddiff/DiffBuildDependenciesService.java
deleted file mode 100644
index 9fac874..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/builddiff/DiffBuildDependenciesService.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo.tabs.builddiff;
-
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.build.ModuleDependency;
-import org.artifactory.api.build.diff.BuildParams;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.PagingData;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.permission.PagingModel;
-import org.artifactory.ui.rest.model.builds.ModuleDependencyModel;
-import org.artifactory.ui.utils.ActionUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DiffBuildDependenciesService implements RestService {
-
-    @Autowired
-    BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String name = request.getPathParamByKey("name");
-        String buildNumber = request.getPathParamByKey("number");
-        String comparedBuildNum = request.getQueryParamByKey("otherNumber");
-        String comparedDate = request.getQueryParamByKey("otherDate");
-        String buildStarted = request.getPathParamByKey("date");
-        boolean excludeInternalDependencies = Boolean.valueOf(request.getQueryParamByKey("exDep"));
-        PagingData pagingData = request.getPagingData();
-        // fetch build artifact diff data
-        fetchBuildDependenciesDiffData(request, response, name,
-                buildNumber, comparedBuildNum, comparedDate,
-                buildStarted, pagingData, excludeInternalDependencies);
-    }
-
-    /**
-     * fetch build dependencies diff with another build data
-     *
-     * @param artifactoryRequest  - encapsulate data related to request
-     * @param artifactoryResponse - encapsulate data require for responsse
-     * @param name                - build name
-     * @param buildNumber         - current build number
-     * @param comparedBuildNum    - compared build number
-     * @param comparedDate        - compared build date
-     * @param buildStarted        - current build date
-     * @param pagingData          - paging data
-     */
-    private void fetchBuildDependenciesDiffData(ArtifactoryRestRequest artifactoryRequest, RestResponse artifactoryResponse,
-                                                String name, String buildNumber, String comparedBuildNum,
-                                                String comparedDate, String buildStarted,
-                                                PagingData pagingData, boolean excludeInternalDependencies) {
-        // create build query param
-        BuildParams buildParams = new BuildParams(null, buildNumber, comparedBuildNum, comparedDate, buildStarted, name);
-        buildParams.setAllArtifact(true);
-        if (excludeInternalDependencies) {
-            buildParams.setExcludeInternalDependencies(true);
-        }
-        // run build diff query
-        List<ModuleDependency> moduleArtifacts = buildService.getModuleDependencyForDiffWithPaging(buildParams,
-                pagingData.getStartOffset(), pagingData.getLimit());
-        List<ModuleDependencyModel> moduleArtifactModels = new ArrayList<>();
-        int count = 0;
-        if (moduleArtifacts != null && !moduleArtifacts.isEmpty()) {
-           /* count = buildService.getModuleDependencyForDiffCount(buildParams,
-                    pagingData.getStartOffset(), pagingData.getLimit());*/
-            // populate query response to model
-            moduleArtifacts.forEach(moduleArtifact -> {
-                String downloadLink = moduleArtifact.getRepoKey() == null ? null : ActionUtils.getDownloadLink(artifactoryRequest.getServletRequest(),
-                        moduleArtifact.getRepoKey(), moduleArtifact.getPath());
-                ModuleDependencyModel artifactModel = new ModuleDependencyModel(moduleArtifact, downloadLink);
-                moduleArtifactModels.add(artifactModel);
-            });
-            // update paging model
-        }
-        PagingModel pagingModel = new PagingModel(count, moduleArtifactModels);
-        artifactoryResponse.iModel(pagingModel);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/builddiff/DiffBuildModuleArtifactService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/builddiff/DiffBuildModuleArtifactService.java
deleted file mode 100644
index 700fd27..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/builddiff/DiffBuildModuleArtifactService.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo.tabs.builddiff;
-
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.build.ModuleArtifact;
-import org.artifactory.api.build.diff.BuildParams;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.PagingData;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.permission.PagingModel;
-import org.artifactory.ui.rest.model.builds.ModuleArtifactModel;
-import org.artifactory.ui.utils.ActionUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DiffBuildModuleArtifactService implements RestService {
-
-    @Autowired
-    BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String name = request.getPathParamByKey("name");
-        String moduleId = request.getPathParamByKey("id");
-        String buildNumber = request.getPathParamByKey("number");
-        String comparedBuildNum = request.getQueryParamByKey("otherNumber");
-        String comparedDate = request.getQueryParamByKey("otherDate");
-        PagingData pagingData = request.getPagingData();
-        String buildStarted = request.getPathParamByKey("date");
-        BuildParams buildParams = new BuildParams(moduleId, buildNumber, comparedBuildNum, comparedDate, buildStarted, name);
-        List<ModuleArtifact> moduleArtifacts = buildService.getModuleArtifactsForDiffWithPaging(buildParams,
-                pagingData.getStartOffset(), pagingData.getLimit());
-        List<ModuleArtifactModel> moduleArtifactModels = new ArrayList<>();
-//        int count = 0;
-        if (moduleArtifacts != null && !moduleArtifacts.isEmpty()) {
-            /*
-            count = buildService.getModuleArtifactsForDiffCount(buildParams,
-                    pagingData.getStartOffset(), pagingData.getLimit());
-            */
-            moduleArtifacts.forEach(moduleArtifact -> {
-                ModuleArtifactModel artifactModel = new ModuleArtifactModel(moduleArtifact, ActionUtils.getDownloadLink(request.getServletRequest(),
-                        moduleArtifact.getRepoKey(), moduleArtifact.getPath()));
-                moduleArtifactModels.add(artifactModel);
-            });
-        }
-        PagingModel pagingModel = new PagingModel(0, moduleArtifactModels);
-        response.iModel(pagingModel);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/builddiff/DiffBuildModuleDependencyService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/builddiff/DiffBuildModuleDependencyService.java
deleted file mode 100644
index 31ab267..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/builddiff/DiffBuildModuleDependencyService.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo.tabs.builddiff;
-
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.build.ModuleDependency;
-import org.artifactory.api.build.diff.BuildParams;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.PagingData;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.permission.PagingModel;
-import org.artifactory.ui.rest.model.builds.ModuleDependencyModel;
-import org.artifactory.ui.utils.ActionUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DiffBuildModuleDependencyService implements RestService {
-
-    @Autowired
-    BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String name = request.getPathParamByKey("name");
-        String moduleId = request.getPathParamByKey("id");
-        String buildNumber = request.getPathParamByKey("number");
-        String comparedBuildNum = request.getQueryParamByKey("otherNumber");
-        String comparedDate = request.getQueryParamByKey("otherDate");
-        PagingData pagingData = request.getPagingData();
-        String buildStarted = request.getPathParamByKey("date");
-        BuildParams buildParams = new BuildParams(moduleId, buildNumber, comparedBuildNum, comparedDate, buildStarted, name);
-        List<ModuleDependency> moduleArtifacts = buildService.getModuleDependencyForDiffWithPaging(buildParams,
-                pagingData.getStartOffset(), pagingData.getLimit());
-        List<ModuleDependencyModel> moduleArtifactModels = new ArrayList<>();
-        if (moduleArtifacts != null && !moduleArtifacts.isEmpty()) {
-            // int count = buildService.getModuleDependencyForDiffCount(buildParams,
-            //     pagingData.getStartOffset(), pagingData.getLimit());
-            moduleArtifacts.forEach(moduleArtifact -> {
-                ModuleDependencyModel depModel = new ModuleDependencyModel(moduleArtifact, ActionUtils.getDownloadLink(request.getServletRequest(),
-                        moduleArtifact.getRepoKey(), moduleArtifact.getPath()));
-                moduleArtifactModels.add(depModel);
-            });
-            PagingModel pagingModel = new PagingModel(0, moduleArtifactModels);
-            response.iModel(pagingModel);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/builddiff/DiffBuildPropsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/builddiff/DiffBuildPropsService.java
deleted file mode 100644
index 439be99..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/builddiff/DiffBuildPropsService.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo.tabs.builddiff;
-
-import org.artifactory.api.build.BuildProps;
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.build.diff.BuildParams;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.PagingData;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.permission.PagingModel;
-import org.artifactory.ui.rest.model.builds.BuildPropsModel;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DiffBuildPropsService implements RestService {
-
-    @Autowired
-    BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String name = request.getPathParamByKey("name");
-        String buildNumber = request.getPathParamByKey("number");
-        String comparedBuildNum = request.getQueryParamByKey("otherNumber");
-        String comparedDate = request.getQueryParamByKey("otherDate");
-        String buildStarted = request.getPathParamByKey("date");
-        PagingData pagingData = request.getPagingData();
-        // fetch build artifact diff data with another build
-        fetchBuildArtifactDiffData(response, name, buildNumber,
-                comparedBuildNum, pagingData, comparedDate, buildStarted);
-    }
-
-    /**
-     * fetch build props diff with another build data
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param name                - build name
-     * @param buildNumber         - current build number
-     * @param comparedBuildNum    - compared build number
-     * @param pagingData          - paging data
-     */
-    private void fetchBuildArtifactDiffData(RestResponse artifactoryResponse, String name, String buildNumber,
-                                            String comparedBuildNum, PagingData pagingData, String comparedDate, String currDate) {
-        BuildParams buildParams = new BuildParams(null, buildNumber, comparedBuildNum, comparedDate, currDate, name);
-        buildParams.setAllArtifact(true);
-        List<BuildProps> buildProps = buildService.getBuildProps(buildParams, pagingData.getStartOffset(), pagingData.getLimit());
-        List<BuildPropsModel> buildPropsModels = new ArrayList<>();
-        int count = 0;
-        if (buildProps != null && !buildProps.isEmpty()) {
-//            count = buildService.getPropsDiffCount(buildParams);
-            buildProps.forEach(propsConsumer -> {
-                BuildPropsModel propsModel = new BuildPropsModel(propsConsumer);
-                buildPropsModels.add(propsModel);
-            });
-        }
-        PagingModel pagingModel = new PagingModel(count, buildPropsModels);
-        artifactoryResponse.iModel(pagingModel);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/env/GetEnvBuildPropsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/env/GetEnvBuildPropsService.java
deleted file mode 100644
index 11b22f6..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/env/GetEnvBuildPropsService.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo.tabs.env;
-
-import org.artifactory.api.build.BuildProps;
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.build.diff.BuildParams;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.PagingData;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.permission.PagingModel;
-import org.artifactory.ui.rest.model.builds.BuildPropsModel;
-import org.artifactory.ui.utils.ModelDbMap;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetEnvBuildPropsService implements RestService {
-
-    @Autowired
-    BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String buildNumber = request.getPathParamByKey("number");
-        String buildStarted = request.getPathParamByKey("date");
-        PagingData pagingData = request.getPagingData();
-        BuildParams buildParams = new BuildParams(null, buildNumber, null,
-                null, buildStarted, null);
-        // get env props
-        buildParams.setIsEnv(true);
-        Map<String, String> buildPropsMap = ModelDbMap.getBuildProps();
-        List<BuildProps> buildPropsData = buildService.getBuildPropsData(buildParams, pagingData.getStartOffset(),
-                pagingData.getLimit(), buildPropsMap.get(pagingData.getOrderBy()));
-        if (!buildPropsData.isEmpty()) {
-            List<BuildPropsModel> buildPropsModels = new ArrayList<>();
-            buildPropsData.forEach(buildProps -> buildPropsModels.add(new BuildPropsModel(buildProps)));
-            PagingModel pagingModel = new PagingModel(0, buildPropsModels);
-            response.iModel(pagingModel);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/env/GetSystemBuildPropsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/env/GetSystemBuildPropsService.java
deleted file mode 100644
index 6844b7f..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/env/GetSystemBuildPropsService.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo.tabs.env;
-
-import org.artifactory.api.build.BuildProps;
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.build.diff.BuildParams;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.PagingData;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.permission.PagingModel;
-import org.artifactory.ui.rest.model.builds.BuildPropsModel;
-import org.artifactory.ui.utils.ModelDbMap;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetSystemBuildPropsService implements RestService {
-
-    @Autowired
-    BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String buildNumber = request.getPathParamByKey("number");
-        String buildStarted = request.getPathParamByKey("date");
-        PagingData pagingData = request.getPagingData();
-        BuildParams buildParams = new BuildParams(null, buildNumber, null,
-                null, buildStarted, null);
-        Map<String, String> buildPropsMap = ModelDbMap.getBuildProps();
-        List<BuildProps> buildPropsData = buildService.getBuildPropsData(buildParams, pagingData.getStartOffset(),
-                pagingData.getLimit(), buildPropsMap.get(pagingData.getOrderBy()));
-        if (!buildPropsData.isEmpty()) {
-            List<BuildPropsModel> buildPropsModels = new ArrayList<>();
-            buildPropsData.forEach(buildProps -> buildPropsModels.add(new BuildPropsModel(buildProps)));
-            PagingModel pagingModel = new PagingModel(0, buildPropsModels);
-            response.iModel(pagingModel);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/governance/AbstractBuildService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/governance/AbstractBuildService.java
deleted file mode 100644
index 2879d40..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/governance/AbstractBuildService.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo.tabs.governance;
-
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.build.BuildService;
-import org.artifactory.build.BuildRun;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-import org.jfrog.build.api.Build;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-
-/**
- * @author Chen Keinan
- */
-public abstract class AbstractBuildService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(AbstractBuildService.class);
-    @Autowired
-    BuildService buildService;
-
-    /**
-     * get build info
-     *
-     * @param buildName    - build name
-     * @param buildNumber  - build number
-     * @param buildStarted - build date
-     * @param response     - encapsulate data related to request
-     * @return
-     */
-    protected Build getBuild(String buildName, String buildNumber, String buildStarted, RestResponse response) {
-        boolean buildStartedSupplied = StringUtils.isNotBlank(buildStarted);
-        try {
-            Build build = null;
-            if (buildStartedSupplied) {
-                BuildRun buildRun = buildService.getBuildRun(buildName, buildNumber, buildStarted);
-                if (buildRun != null) {
-                    build = buildService.getBuild(buildRun);
-                }
-            } else {
-                //Take the latest build of the specified number
-                build = buildService.getLatestBuildByNameAndNumber(buildName, buildNumber);
-            }
-            if (build == null) {
-                StringBuilder builder = new StringBuilder().append("Could not find build '").append(buildName).
-                        append("' #").append(buildNumber);
-                if (buildStartedSupplied) {
-                    builder.append(" that started at ").append(buildStarted);
-                }
-                throwNotFoundError(response, builder.toString());
-            }
-            return build;
-        } catch (RepositoryRuntimeException e) {
-            String errorMessage = new StringBuilder().append("Error locating latest build for '").append(buildName).
-                    append("' #").append(buildNumber).append(": ").append(e.getMessage()).toString();
-            throwInternalError(errorMessage, response);
-        }
-        //Should not happen
-        return null;
-    }
-
-    /**
-     * Throws a 404 AbortWithHttpErrorCodeException with the given message
-     *
-     * @param errorMessage Message to display in the error
-     */
-    private void throwNotFoundError(RestResponse response, String errorMessage) {
-        log.error(errorMessage);
-        response.error(errorMessage);
-    }
-
-    /**
-     * return not found error
-     *
-     * @param errorMessage
-     * @param response
-     */
-    private void throwInternalError(String errorMessage, RestResponse response) {
-        response.error(errorMessage);
-        response.responseCode(HttpServletResponse.SC_NOT_FOUND);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/governance/GetBuildGovernanceService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/governance/GetBuildGovernanceService.java
deleted file mode 100644
index 13a1a7d..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/governance/GetBuildGovernanceService.java
+++ /dev/null
@@ -1,227 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo.tabs.governance;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.blackduck.BlackDuckAddon;
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.governance.BlackDuckApplicationInfo;
-import org.artifactory.api.governance.GovernanceRequestInfo;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.ui.rest.model.builds.BuildGovernanceInfo;
-import org.artifactory.ui.utils.DateUtils;
-import org.jfrog.build.api.BlackDuckProperties;
-import org.jfrog.build.api.Build;
-import org.jfrog.build.api.Dependency;
-import org.jfrog.build.api.Governance;
-import org.jfrog.build.api.Module;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletResponse;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetBuildGovernanceService extends AbstractBuildService {
-    private static final Logger log = LoggerFactory.getLogger(GetBuildGovernanceService.class);
-
-    @Autowired
-    BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        try {
-            String name = request.getPathParamByKey("name");
-            String buildNumber = request.getPathParamByKey("number");
-            String buildStarted = DateUtils.formatBuildDate(Long.parseLong(request.getPathParamByKey("date")));
-            BlackDuckAddon blackDuckAddon = ContextHelper.get().beanForType(AddonsManager.class).addonByType(
-                    BlackDuckAddon.class);
-            boolean enableIntegration = blackDuckAddon.isEnableIntegration();
-            if (!enableIntegration) {
-                response.responseCode(HttpServletResponse.SC_NOT_FOUND);
-                return;
-            }
-            // get current build
-            Build build = getBuild(name, buildNumber, buildStarted, response);
-            // get governance
-            Governance governance = build.getGovernance();
-            // fetch build info from black duck info
-            fetchBlackDuckInfo(response, name, buildNumber, buildStarted, build, governance, enableIntegration);
-        } catch (ParseException e) {
-            log.error(e.toString());
-        }
-    }
-
-    /**
-     * fetch black duck info
-     *
-     * @param artifactoryResponse - encapsulated data related to response
-     * @param name                - build name
-     * @param buildNumber         - build number
-     * @param buildStarted        - build started
-     * @param build               - current  build model
-     * @param governance          - governance model
-     */
-    private void fetchBlackDuckInfo(RestResponse artifactoryResponse, String name, String buildNumber,
-            String buildStarted, Build build, Governance governance, boolean enableIntegration) {
-        Set<String> defaultSelectedScopes;
-        try {
-            if (governance == null) {
-                artifactoryResponse.iModel(new BuildGovernanceInfo());
-                artifactoryResponse.warn("No Code Center application name or version found for this build.");
-                return;
-            }
-            AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-            BlackDuckAddon blackDuckAddon = addonsManager.addonByType(BlackDuckAddon.class);
-            BlackDuckProperties blackDuckProperties = governance.getBlackDuckProperties();
-            if (blackDuckProperties != null) {
-                String appName = blackDuckProperties.getAppName();
-                String appVersion = blackDuckProperties.getAppVersion();
-                defaultSelectedScopes = findScopes(build);
-                if (appName == null) {
-                    artifactoryResponse.iModel(new BuildGovernanceInfo());
-                    artifactoryResponse.warn("No Code Center application name or version found for this build.");
-                    return;
-                }
-                //fetch governance build info
-                Collection<GovernanceRequestInfo> governanceRequestInfos = fetchBuildGovernanceInfo(artifactoryResponse,
-                        name,
-                        buildNumber, buildStarted, appName, appVersion, defaultSelectedScopes, blackDuckAddon,
-                        enableIntegration);
-                List<GovernanceRequestInfo> components = new ArrayList();
-                List<GovernanceRequestInfo> publishedArtifacts = new ArrayList<>();
-                if (governanceRequestInfos != null) {
-                    filterRequests(governanceRequestInfos, components, publishedArtifacts);
-                }
-                // get black duck application info
-                BlackDuckApplicationInfo blackDuckApplicationInfo = buildAppInfo(artifactoryResponse,
-                        blackDuckAddon, appName, appVersion);
-                if (blackDuckApplicationInfo == null) {
-                    artifactoryResponse.warn("No Code Center application name or version found for this build.");
-                }
-                BuildGovernanceInfo buildGovernanceInfo = new BuildGovernanceInfo(components, publishedArtifacts,
-                        defaultSelectedScopes, blackDuckApplicationInfo);
-                artifactoryResponse.iModel(buildGovernanceInfo);
-            }
-        } catch (Exception e) {
-            log.error(e.getLocalizedMessage().toString());
-            artifactoryResponse.error(e.getCause().getMessage());
-        }
-    }
-
-    /**
-     * filter published and non published requests
-     *
-     * @param governanceRequestInfos - all black duck requests
-     * @param components             - non published requests
-     * @param publishedArtifacts     - published requests
-     */
-    private void filterRequests(Collection<GovernanceRequestInfo> governanceRequestInfos, List<GovernanceRequestInfo> components, List<GovernanceRequestInfo> publishedArtifacts) {
-        governanceRequestInfos.forEach(request -> {
-            if (request.isPublished()) {
-                publishedArtifacts.add(request);
-            } else {
-                components.add(request);
-            }
-        });
-    }
-
-    /**
-     * find configured scopes for this build
-     *
-     * @param build - current build
-     * @return set of scopes
-     */
-    public Set<String> findScopes(Build build) {
-        final Set<String> scopes = Sets.newHashSet();
-        if (build.getModules() != null) {
-            for (Module module : build.getModules()) {
-                if (module.getDependencies() != null) {
-                    for (Dependency dependency : module.getDependencies()) {
-                        Set<String> dependencyScopes = dependency.getScopes();
-                        if (dependencyScopes != null) {
-                            for (String dependencyScope : dependencyScopes) {
-                                if (StringUtils.isBlank(dependencyScope)) {
-                                    scopes.add("unspecified");
-                                } else {
-                                    scopes.add(dependencyScope);
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        return scopes;
-    }
-
-    /**
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param name                - build name - build name
-     * @param buildNumber         - build number - build number
-     * @param buildStarted        - build date - build date
-     */
-    private Collection<GovernanceRequestInfo> fetchBuildGovernanceInfo(RestResponse artifactoryResponse, String name,
-                                                                       String buildNumber, String buildStarted, String appName, String appVersion,
-            Set<String> scopes, BlackDuckAddon blackDuckAddon, boolean enableIntegration) {
-        Build build = getBuild(name, buildNumber, buildStarted, artifactoryResponse);
-        Collection<GovernanceRequestInfo> buildRequests;
-        if (enableIntegration) {
-            buildRequests = blackDuckAddon.getGovernanceRequestInfos(build, appName, appVersion, scopes);
-            if (buildRequests == null) {
-                artifactoryResponse.warn("No Code Center application name or version found for this build.");
-            }
-        } else {
-            buildRequests = Lists.newArrayList();
-        }
-        return buildRequests;
-    }
-
-
-    /**
-     * build application info
-     *
-     * @param response       - encapsulate data related to response
-     * @param blackDuckAddon - black duck addon
-     * @param appName        - application name
-     * @param appVersion     - application version
-     * @return black suck application info details
-     */
-    private BlackDuckApplicationInfo buildAppInfo(RestResponse response, BlackDuckAddon blackDuckAddon,
-                                                  String appName, String appVersion) {
-        BlackDuckApplicationInfo appInfo;
-        try {
-            appInfo = blackDuckAddon.blackDuckApplicationInfo(appName, appVersion);
-            if (appInfo.getVersion() == null) {
-                appInfo.setVersion(appVersion);
-            }
-            if (appInfo == null) {
-                response.error("Could not get Code Center application " + appName + " : " + appVersion);
-                return null;
-            }
-        } catch (Exception e) {
-            appInfo = new BlackDuckApplicationInfo(appName, appVersion); //empty
-            response.error("Could not get Code Center application " + appName + " : " + appVersion);
-            log.error("Could not get Code Center application " + appName + " : " + appVersion, e);
-        }
-        if (appInfo == null) {
-            appInfo = new BlackDuckApplicationInfo(appName, appVersion);
-        }
-        return appInfo;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/governance/UpdateGovernanceRequestService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/governance/UpdateGovernanceRequestService.java
deleted file mode 100644
index 1f433a3..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/governance/UpdateGovernanceRequestService.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo.tabs.governance;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.blackduck.BlackDuckAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.governance.GovernanceRequestInfo;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.ui.rest.model.builds.BuildGovernanceInfo;
-import org.artifactory.ui.utils.DateUtils;
-import org.jfrog.build.api.Build;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.text.ParseException;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateGovernanceRequestService extends AbstractBuildService {
-    private static final Logger log = LoggerFactory.getLogger(AbstractBuildService.class);
-
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        try {
-            String name = request.getPathParamByKey("name");
-            String buildNumber = request.getPathParamByKey("number");
-            String buildStarted = DateUtils.formatBuildDate(Long.parseLong(request.getPathParamByKey("date")));
-            updateRequestAndResponse(request, response, name, buildNumber, buildStarted);
-        } catch (ParseException e) {
-            log.error("error updating request");
-            response.error("error updating request");
-        }
-    }
-
-    /**
-     * update request and return status
-     *
-     * @param artifactoryRequest  - encapsulate data related to request
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param name                - build name
-     * @param buildNumber         - build number
-     * @param buildStarted        - build start time
-     */
-    private void updateRequestAndResponse(ArtifactoryRestRequest artifactoryRequest, RestResponse artifactoryResponse, String name, String buildNumber, String buildStarted) {
-        Build build = getBuild(name, buildNumber, buildStarted, artifactoryResponse);
-        BuildGovernanceInfo buildGovernanceInfo = (BuildGovernanceInfo) artifactoryRequest.getImodel();
-        GovernanceRequestInfo governanceRequestInfo = buildGovernanceInfo.getComponents().get(0);
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        BlackDuckAddon blackDuckAddon = addonsManager.addonByType(BlackDuckAddon.class);
-        String status = blackDuckAddon.updateRequest(build, governanceRequestInfo);
-
-        if (status.equals("Update request was successful")) {
-            artifactoryResponse.info(status);
-        } else {
-            artifactoryResponse.error(status);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/licenses/BuildLicensesService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/licenses/BuildLicensesService.java
deleted file mode 100644
index ba92516..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/licenses/BuildLicensesService.java
+++ /dev/null
@@ -1,202 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo.tabs.licenses;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Multimap;
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.license.LicensesAddon;
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.license.ModuleLicenseModel;
-import org.artifactory.build.BuildRun;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-import org.artifactory.ui.rest.model.builds.BuildLicenseModel;
-import org.artifactory.ui.utils.DateUtils;
-import org.artifactory.util.CollectionUtils;
-import org.jfrog.build.api.Artifact;
-import org.jfrog.build.api.Build;
-import org.jfrog.build.api.Module;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Nonnull;
-import javax.servlet.http.HttpServletResponse;
-import java.text.ParseException;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class BuildLicensesService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(BuildLicensesService.class);
-
-    @Autowired
-    BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        try {
-            String name = request.getPathParamByKey("name");
-            String buildNumber = request.getPathParamByKey("number");
-            String buildStarted = DateUtils.formatBuildDate(Long.parseLong(request.getPathParamByKey("date")));
-            Boolean authFind = Boolean.valueOf(request.getQueryParamByKey("autoFind"));
-            Build build = getBuild(name, buildNumber, buildStarted, response);
-            // fetch license
-            Multimap<RepoPath, ModuleLicenseModel> repoPathLicenseModuleModel = getRepoPathLicenseModuleModelMultimap(build, authFind);
-            if (repoPathLicenseModuleModel != null && !repoPathLicenseModuleModel.isEmpty()) {
-                Collection<ModuleLicenseModel> values = repoPathLicenseModuleModel.values();
-                // fetch published modules
-                Set<ModuleLicenseModel> publishedModules = getPublishedModulesFromModelList(values, build.getModules());
-                // filter published modules from licenses
-                publishedModules.forEach(published -> values.remove(published));
-                // fetch build license summary
-                Set<String> scopes = getScopeMapping(values);
-                BuildLicenseModel buildLicenseModel = new BuildLicenseModel(values, publishedModules, scopes);
-                response.iModel(buildLicenseModel);
-                // get scopes
-            }
-        } catch (ParseException e) {
-            log.error(e.toString());
-            response.error("error with retrieving build licenses");
-            return;
-        }
-    }
-
-    /**
-     * get license with repo path data
-     *
-     * @param build - license build
-     * @return multi map with repo path and license
-     */
-    private Multimap<RepoPath, ModuleLicenseModel> getRepoPathLicenseModuleModelMultimap(Build build, boolean autoFind) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        LicensesAddon licensesAddon = addonsManager.addonByType(LicensesAddon.class);
-        Multimap<RepoPath, ModuleLicenseModel> repoPathLicenseMultimap = licensesAddon.
-                populateLicenseInfoSynchronously(build, autoFind);
-        return repoPathLicenseMultimap;
-    }
-
-    /**
-     * get build info
-     *
-     * @param buildName    - build name
-     * @param buildNumber  - build number
-     * @param buildStarted - build date
-     * @param response     - encapsulate data related to request
-     * @return
-     */
-    private Build getBuild(String buildName, String buildNumber, String buildStarted, RestResponse response) {
-        boolean buildStartedSupplied = StringUtils.isNotBlank(buildStarted);
-        try {
-            Build build = null;
-            if (buildStartedSupplied) {
-                BuildRun buildRun = buildService.getBuildRun(buildName, buildNumber, buildStarted);
-                if (buildRun != null) {
-                    build = buildService.getBuild(buildRun);
-                }
-            } else {
-                //Take the latest build of the specified number
-                build = buildService.getLatestBuildByNameAndNumber(buildName, buildNumber);
-            }
-            if (build == null) {
-                StringBuilder builder = new StringBuilder().append("Could not find build '").append(buildName).
-                        append("' #").append(buildNumber);
-                if (buildStartedSupplied) {
-                    builder.append(" that started at ").append(buildStarted);
-                }
-                throwNotFoundError(response, builder.toString());
-            }
-            return build;
-        } catch (RepositoryRuntimeException e) {
-            String errorMessage = new StringBuilder().append("Error locating latest build for '").append(buildName).
-                    append("' #").append(buildNumber).append(": ").append(e.getMessage()).toString();
-            throwInternalError(errorMessage, response);
-        }
-        //Should not happen
-        return null;
-    }
-
-    /**
-     * Throws a 404 AbortWithHttpErrorCodeException with the given message
-     *
-     * @param errorMessage Message to display in the error
-     */
-    private void throwNotFoundError(RestResponse response, String errorMessage) {
-        log.error(errorMessage);
-        response.error(errorMessage);
-    }
-
-    /**
-     * return not found error
-     *
-     * @param errorMessage
-     * @param response
-     */
-    private void throwInternalError(String errorMessage, RestResponse response) {
-        response.error(errorMessage);
-        response.responseCode(HttpServletResponse.SC_NOT_FOUND);
-    }
-
-    public static Set<String> getScopeMapping(Collection<ModuleLicenseModel> models) {
-        Set<String> scopeSet = new HashSet();
-        for (ModuleLicenseModel model : models) {
-            scopeSet.addAll(model.getScopes().stream().collect(Collectors.toList()));
-        }
-        return scopeSet;
-    }
-
-    /**
-     * Returns all models that relate to a dependency which is also a published module
-     *
-     * @param models  models to filter
-     * @param modules build modules to filter by
-     */
-    public static Set<ModuleLicenseModel> getPublishedModulesFromModelList(Collection<ModuleLicenseModel> models,
-                                                                           final Collection<Module> modules) {
-        if (CollectionUtils.isNullOrEmpty(models) || CollectionUtils.isNullOrEmpty(modules)) {
-            return Sets.newHashSet();
-        }
-        return Sets.newHashSet(Iterables.filter(models, new PublishedModuleFilterPredicate(modules)));
-    }
-
-
-    private static class PublishedModuleFilterPredicate implements Predicate<ModuleLicenseModel> {
-        private Set<Artifact> moduleArtifacts = Sets.newHashSet();
-
-        private PublishedModuleFilterPredicate(Collection<Module> modules) {
-            for (Module module : modules) {
-                if (CollectionUtils.notNullOrEmpty(module.getArtifacts())) {
-                    moduleArtifacts.addAll(module.getArtifacts());
-                }
-            }
-        }
-
-        @Override
-        public boolean apply(@Nonnull ModuleLicenseModel input) {
-            // filter published artifacts based on the checksum
-            for (Artifact artifact : moduleArtifacts) {
-                if (StringUtils.isNotBlank(artifact.getSha1()) && artifact.getSha1().equals(input.getSha1())) {
-                    return true;
-                } else if (StringUtils.isNotBlank(artifact.getMd5()) && artifact.getMd5().equals(input.getMd5())) {
-                    return true;
-                }
-            }
-            return false;
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/licenses/ChangeBuildLicenseService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/licenses/ChangeBuildLicenseService.java
deleted file mode 100644
index da20ad1..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/licenses/ChangeBuildLicenseService.java
+++ /dev/null
@@ -1,237 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo.tabs.licenses;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Multimap;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.license.LicensesAddon;
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.license.LicenseInfo;
-import org.artifactory.api.license.ModuleLicenseModel;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.build.BuildRun;
-import org.artifactory.descriptor.property.PredefinedValue;
-import org.artifactory.descriptor.property.Property;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-import org.artifactory.ui.rest.model.utils.predefinevalues.PreDefineValues;
-import org.artifactory.ui.utils.DateUtils;
-import org.jfrog.build.api.Build;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Nonnull;
-import javax.servlet.http.HttpServletResponse;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ChangeBuildLicenseService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(ChangeBuildLicenseService.class);
-
-    @Autowired
-    BuildService buildService;
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        try {
-            String id = request.getQueryParamByKey("id");
-            String repoKey = request.getQueryParamByKey("repoKey");
-            String path = request.getQueryParamByKey("path");
-            String name = request.getPathParamByKey("name");
-            String buildNumber = request.getPathParamByKey("number");
-            String buildStarted = DateUtils.formatBuildDate(Long.parseLong(request.getPathParamByKey("date")));
-            // get license-repo map
-            Build build = getBuild(name, buildNumber, buildStarted, response);
-            RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-            Multimap<RepoPath, ModuleLicenseModel> repoPathLicenseMultimap = getRepoPathLicenseModuleModelMultimap(build);
-            Map<String, LicenseInfo> currentValues = getCurrentValues(id, repoPath, repoPathLicenseMultimap);
-            PreDefineValues preDefineValues = getLicenseValues(repoPath, currentValues);
-            response.iModel(preDefineValues);
-        } catch (ParseException e) {
-            log.error(e.toString());
-        }
-
-    }
-
-    /**
-     * get license preDefine values
-     *
-     * @param repoPath - repo path
-     * @return - pre define values
-     */
-    private PreDefineValues getLicenseValues(RepoPath repoPath, Map<String, LicenseInfo> currentValues) {
-        PreDefineValues values = new PreDefineValues();
-        String name = "artifactory.licenses";
-        Map<String, Property> propertyItemMap = createPropertyItemMap(repoPath);
-        if (!propertyItemMap.isEmpty()) {
-            List<PredefinedValue> predefinedValues = propertyItemMap.get(name).getPredefinedValues();
-            List<String> listOfPredefineValuesAsString = new ArrayList<>();
-            List<String> selectedValues = new ArrayList<>();
-            predefinedValues.forEach(predefinedValue -> {
-                if (predefinedValue.isDefaultValue() || currentValues.get(predefinedValue.getValue()) != null) {
-                    selectedValues.add(predefinedValue.getValue());
-                } else {
-                    listOfPredefineValuesAsString.add(predefinedValue.getValue());
-                }
-            });
-            values.setSelectedValues(selectedValues);
-            values.setPredefinedValues(listOfPredefineValuesAsString);
-        }
-        return values;
-    }
-
-
-    /**
-     * get license with repo path data
-     *
-     * @param build - license build
-     * @return multi map with repo path and license
-     */
-    private Multimap<RepoPath, ModuleLicenseModel> getRepoPathLicenseModuleModelMultimap(Build build) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        LicensesAddon licensesAddon = addonsManager.addonByType(LicensesAddon.class);
-        Multimap<RepoPath, ModuleLicenseModel> repoPathLicenseMultimap = licensesAddon.
-                populateLicenseInfoSynchronously(build, false);
-        return repoPathLicenseMultimap;
-    }
-
-    /**
-     * Get all licenses that are currently on the models for a specific id and repo path
-     *
-     * @param id       The id of the model
-     * @param repoPath The repo path of the model
-     * @return The current values (licenses) for a specific id and repo path.
-     */
-    private Map<String, LicenseInfo> getCurrentValues(String id, RepoPath repoPath, Multimap<RepoPath, ModuleLicenseModel> LicenseMap) {
-        List<LicenseInfo> licenseInfos = Lists.newArrayList();
-        Map<String, LicenseInfo> licenseMap = new HashMap<>();
-        Iterable<ModuleLicenseModel> modelsWithSameId =
-                Iterables.filter(LicenseMap.get(repoPath), new SameIdPredicate(id));
-        for (ModuleLicenseModel moduleLicenseModel : modelsWithSameId) {
-            LicenseInfo licenseInfo = moduleLicenseModel.getLicense();
-            if (licenseInfo.isValidLicense()) {
-                licenseInfos.add(licenseInfo);
-                licenseMap.put(licenseInfo.getName(), licenseInfo);
-            }
-        }
-        return licenseMap;
-    }
-
-    private static class SameIdPredicate implements Predicate<ModuleLicenseModel> {
-
-        private String id;
-
-        private SameIdPredicate(String id) {
-            this.id = id;
-        }
-
-        @Override
-        public boolean apply(@Nonnull ModuleLicenseModel input) {
-            return input.getId().equals(id);
-        }
-    }
-
-    /**
-     * get build info
-     *
-     * @param buildName    - build name
-     * @param buildNumber  - build number
-     * @param buildStarted - build date
-     * @param response     - encapsulate data related to request
-     * @return
-     */
-    private Build getBuild(String buildName, String buildNumber, String buildStarted, RestResponse response) {
-        boolean buildStartedSupplied = StringUtils.isNotBlank(buildStarted);
-        try {
-            Build build = null;
-            if (buildStartedSupplied) {
-                BuildRun buildRun = buildService.getBuildRun(buildName, buildNumber, buildStarted);
-                if (buildRun != null) {
-                    build = buildService.getBuild(buildRun);
-                }
-            } else {
-                //Take the latest build of the specified number
-                build = buildService.getLatestBuildByNameAndNumber(buildName, buildNumber);
-            }
-            if (build == null) {
-                StringBuilder builder = new StringBuilder().append("Could not find build '").append(buildName).
-                        append("' #").append(buildNumber);
-                if (buildStartedSupplied) {
-                    builder.append(" that started at ").append(buildStarted);
-                }
-                throwNotFoundError(response, builder.toString());
-            }
-            return build;
-        } catch (RepositoryRuntimeException e) {
-            String errorMessage = new StringBuilder().append("Error locating latest build for '").append(buildName).
-                    append("' #").append(buildNumber).append(": ").append(e.getMessage()).toString();
-            throwInternalError(errorMessage, response);
-        }
-        //Should not happen
-        return null;
-    }
-
-    /**
-     * Throws a 404 AbortWithHttpErrorCodeException with the given message
-     *
-     * @param errorMessage Message to display in the error
-     */
-    private void throwNotFoundError(RestResponse response, String errorMessage) {
-        log.error(errorMessage);
-        response.error(errorMessage);
-    }
-
-    /**
-     * return not found error
-     *
-     * @param errorMessage
-     * @param response
-     */
-    private void throwInternalError(String errorMessage, RestResponse response) {
-        response.error(errorMessage);
-        response.responseCode(HttpServletResponse.SC_NOT_FOUND);
-    }
-
-    /**
-     * create property map by repo path
-     *
-     * @param repoPath - repo path
-     * @return map of properties
-     */
-    private Map<String, Property> createPropertyItemMap(RepoPath repoPath) {
-        Map<String, Property> propertyItemMap = new HashMap<>();
-        LocalRepoDescriptor descriptor = repositoryService.localOrCachedRepoDescriptorByKey(repoPath.getRepoKey());
-        List<PropertySet> propertySets = new ArrayList<>(descriptor.getPropertySets());
-        for (PropertySet propertySet : propertySets) {
-            List<Property> propertyList = propertySet.getProperties();
-            for (Property property : propertyList) {
-                propertyItemMap.put(propertySet.getName() + "." + property.getName(), property);
-            }
-        }
-        return propertyItemMap;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/licenses/ExportLicenseToCsvService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/licenses/ExportLicenseToCsvService.java
deleted file mode 100644
index 5b973f6..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/licenses/ExportLicenseToCsvService.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo.tabs.licenses;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.license.LicensesAddon;
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.license.ModuleLicenseModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.service.StreamRestResponse;
-import org.artifactory.ui.rest.model.admin.configuration.licenses.ExportLicense;
-import org.artifactory.ui.rest.model.builds.BuildLicenseModel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.Collection;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ExportLicenseToCsvService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(ExportLicenseToCsvService.class);
-
-    @Autowired
-    BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-
-            AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-            LicensesAddon licensesAddon = addonsManager.addonByType(LicensesAddon.class);
-        Collection<ModuleLicenseModel> models = ((BuildLicenseModel) request.getImodel()).getLicenses();
-        if (models != null && !models.isEmpty()) {
-                String licenseCsv = licensesAddon.generateLicenseCsv(models);
-                ((StreamRestResponse) response).setDownloadFile("licenses.csv");
-                ((StreamRestResponse) response).setDownload(true);
-                ExportLicense exportLicense = new ExportLicense(licenseCsv);
-            response.iModel(exportLicense);
-            }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/licenses/OverrideSelectedLicensesService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/licenses/OverrideSelectedLicensesService.java
deleted file mode 100644
index 45a9a96..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/licenses/OverrideSelectedLicensesService.java
+++ /dev/null
@@ -1,201 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo.tabs.licenses;
-
-import com.google.common.collect.HashMultimap;
-import com.google.common.collect.Multimap;
-import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.license.LicensesAddon;
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.license.LicenseInfo;
-import org.artifactory.api.license.ModuleLicenseModel;
-import org.artifactory.build.BuildRun;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-import org.artifactory.ui.rest.model.builds.BuildLicenseModel;
-import org.artifactory.ui.utils.DateUtils;
-import org.jfrog.build.api.Build;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletResponse;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class OverrideSelectedLicensesService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(OverrideSelectedLicensesService.class);
-
-    @Autowired
-    BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        try {
-            BuildLicenseModel buildLicenseModel = (BuildLicenseModel) request.getImodel();
-            String name = request.getPathParamByKey("name");
-            String buildNumber = request.getPathParamByKey("number");
-            String buildStarted = DateUtils.formatBuildDate(Long.parseLong(request.getPathParamByKey("date")));
-            // get license-repo map
-            Build build = getBuild(name, buildNumber, buildStarted, response);
-            Multimap<RepoPath, ModuleLicenseModel> repoPathLicenseMultimap = getRepoPathLicenseModuleModelMultimap(build);
-            // update licenses
-            updateLicenses(buildLicenseModel.getLicenses(), repoPathLicenseMultimap, response);
-        } catch (ParseException e) {
-            response.error("error updating licenses");
-            log.error(e.toString());
-        }
-    }
-
-    /**
-     * Updates all licenses that had corresponding columns' 'override' checkbox checked.
-     * Takes into account other columns relating to the same path so that other existing licenses properties (which were
-     * not marked with override) are also saved on the path.
-     */
-    private void updateLicenses(Collection<ModuleLicenseModel> viewableModels, Multimap<RepoPath,
-            ModuleLicenseModel> repoPathLicenseMultimap, RestResponse response) {
-
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        LicensesAddon licensesAddon = addonsManager.addonByType(LicensesAddon.class);
-        List<ModuleLicenseModel> moduleLicenseModels = new ArrayList<>();
-        // fetch license to override
-        fetchLicenseToOverride(viewableModels, repoPathLicenseMultimap, moduleLicenseModels);
-
-        Multimap<RepoPath, LicenseInfo> licensesToWrite = HashMultimap.create();
-        //Holds all licenses that will be overridden per path - to help filter what licenses to persist on that path
-        Multimap<RepoPath, LicenseInfo> overriddenLicenses = HashMultimap.create();
-        for (ModuleLicenseModel checkedLicenseModel : moduleLicenseModels) {
-            RepoPath repoPath = InternalRepoPathFactory.create(checkedLicenseModel.getRepoKey(),checkedLicenseModel.getPath());
-            checkedLicenseModel.setRepoPath(repoPath);
-            RepoPath path = checkedLicenseModel.getRepoPath();
-            licensesToWrite.put(path, checkedLicenseModel.getExtractedLicense());
-            overriddenLicenses.put(path, checkedLicenseModel.getLicense());
-        }
-
-        //For each of the licenses that on this path check if it's already in the overridden map - if not, preserve it
-        for (RepoPath path : licensesToWrite.keySet()) {
-            //License already set on path differs from the license being overridden - preserve it.
-            for (ModuleLicenseModel licenseExistingOnPath : repoPathLicenseMultimap.get(path)) {
-            //License already set on path differs from the license being overridden - preserve it.
-                if (!overriddenLicenses.get(path).contains(licenseExistingOnPath.getLicense())) {
-                    licensesToWrite.put(path, licenseExistingOnPath.getLicense());
-                }
-            }
-        }
-
-        //Write all chosen licenses on each path
-        boolean hadErrors = false;
-        for (RepoPath path : licensesToWrite.keySet()) {
-            if (!licensesAddon.setLicensePropsOnPath(path, Sets.newHashSet(licensesToWrite.get(path)))) {
-                hadErrors = true;
-            }
-        }
-        if (hadErrors) {
-            response.error("Failed to set properties on some artifacts, check the log for more info");
-        }
-    }
-
-    private void fetchLicenseToOverride(Collection<ModuleLicenseModel> viewableModels, Multimap<RepoPath,
-            ModuleLicenseModel> repoPathLicenseMultimap, List<ModuleLicenseModel> moduleLicenseModels) {
-        for (ModuleLicenseModel license : viewableModels) {
-            RepoPath repoPath = InternalRepoPathFactory.create(license.getRepoKey(), license.getPath());
-            Collection<ModuleLicenseModel> licenses = repoPathLicenseMultimap.get(repoPath);
-            for (ModuleLicenseModel subLicense : licenses) {
-                if (subLicense.getLicense().getName().equals(license.getLicense().getName())) {
-                    subLicense.setExtractedLicense(license.getExtractedLicense());
-                    moduleLicenseModels.add(subLicense);
-                }
-            }
-        }
-    }
-
-    /**
-     * get license with repo path data
-     *
-     * @param build - license build
-     * @return multi map with repo path and license
-     */
-    private Multimap<RepoPath, ModuleLicenseModel> getRepoPathLicenseModuleModelMultimap(Build build) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        LicensesAddon licensesAddon = addonsManager.addonByType(LicensesAddon.class);
-        Multimap<RepoPath, ModuleLicenseModel> repoPathLicenseMultimap = licensesAddon.
-                populateLicenseInfoSynchronously(build, false);
-        return repoPathLicenseMultimap;
-    }
-
-    /**
-     * get build info
-     *
-     * @param buildName    - build name
-     * @param buildNumber  - build number
-     * @param buildStarted - build date
-     * @param response     - encapsulate data related to request
-     * @return
-     */
-    private Build getBuild(String buildName, String buildNumber, String buildStarted, RestResponse response) {
-        boolean buildStartedSupplied = StringUtils.isNotBlank(buildStarted);
-        try {
-            Build build = null;
-            if (buildStartedSupplied) {
-                BuildRun buildRun = buildService.getBuildRun(buildName, buildNumber, buildStarted);
-                if (buildRun != null) {
-                    build = buildService.getBuild(buildRun);
-                }
-            } else {
-                //Take the latest build of the specified number
-                build = buildService.getLatestBuildByNameAndNumber(buildName, buildNumber);
-            }
-            if (build == null) {
-                StringBuilder builder = new StringBuilder().append("Could not find build '").append(buildName).
-                        append("' #").append(buildNumber);
-                if (buildStartedSupplied) {
-                    builder.append(" that started at ").append(buildStarted);
-                }
-                throwNotFoundError(response, builder.toString());
-            }
-            return build;
-        } catch (RepositoryRuntimeException e) {
-            String errorMessage = new StringBuilder().append("Error locating latest build for '").append(buildName).
-                    append("' #").append(buildNumber).append(": ").append(e.getMessage()).toString();
-            throwInternalError(errorMessage, response);
-        }
-        //Should not happen
-        return null;
-    }
-
-    /**
-     * Throws a 404 AbortWithHttpErrorCodeException with the given message
-     *
-     * @param errorMessage Message to display in the error
-     */
-    private void throwNotFoundError(RestResponse response, String errorMessage) {
-        log.error(errorMessage);
-        response.error(errorMessage);
-    }
-
-    /**
-     * return not found error
-     *
-     * @param errorMessage
-     * @param response
-     */
-    private void throwInternalError(String errorMessage, RestResponse response) {
-        response.error(errorMessage);
-        response.responseCode(HttpServletResponse.SC_NOT_FOUND);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/publishedmodules/GetModuleArtifactsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/publishedmodules/GetModuleArtifactsService.java
deleted file mode 100644
index bd39cdd..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/publishedmodules/GetModuleArtifactsService.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo.tabs.publishedmodules;
-
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.build.ModuleArtifact;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.PagingData;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.permission.PagingModel;
-import org.artifactory.ui.rest.model.builds.ModuleArtifactModel;
-import org.artifactory.ui.utils.ActionUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetModuleArtifactsService implements RestService {
-
-    @Autowired
-    BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String buildName = request.getPathParamByKey("name");
-        String buildNumber = request.getPathParamByKey("number");
-        String buildStarted = request.getPathParamByKey("date");
-        String moduleId = request.getPathParamByKey("id");
-        // fetch artifact module data
-        fetchModuleArtifact(request, response, buildNumber, buildStarted, moduleId, buildName);
-    }
-
-    /**
-     * fetch Module artifact data
-     *
-     * @param artifactoryRequest  - encapsulate data related to request
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param buildNumber         - build number
-     * @param buildStarted        - build started time
-     * @param moduleId            - module id
-     */
-    private void fetchModuleArtifact(ArtifactoryRestRequest artifactoryRequest, RestResponse artifactoryResponse,
-                                     String buildNumber, String buildStarted, String moduleId, String buildName) {
-        PagingData pagingData = artifactoryRequest.getPagingData();
-        List<ModuleArtifact> moduleArtifacts = buildService.getModuleArtifact(buildName, buildNumber, moduleId,
-                buildStarted, pagingData.getOrderBy(),
-                pagingData.getDirection(), pagingData.getStartOffset(), pagingData.getLimit());
-        List<ModuleArtifactModel> moduleArtifactModels = new ArrayList<>();
-        moduleArtifacts.forEach(moduleArtifact ->
-                moduleArtifactModels.add(new ModuleArtifactModel(moduleArtifact, ActionUtils.getDownloadLink(artifactoryRequest.getServletRequest(),
-                                moduleArtifact.getRepoKey(), moduleArtifact.getPath())))
-        );
-            PagingModel pagingModel = new PagingModel(0, moduleArtifactModels);
-            artifactoryResponse.iModel(pagingModel);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/publishedmodules/GetModuleDependencyService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/publishedmodules/GetModuleDependencyService.java
deleted file mode 100644
index d6d2aad..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/publishedmodules/GetModuleDependencyService.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo.tabs.publishedmodules;
-
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.build.ModuleDependency;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.PagingData;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.permission.PagingModel;
-import org.artifactory.ui.rest.model.builds.ModuleDependencyModel;
-import org.artifactory.ui.utils.ActionUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetModuleDependencyService implements RestService {
-
-    @Autowired
-    BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String buildNumber = request.getPathParamByKey("number");
-        String buildStarted = request.getPathParamByKey("date");
-        String moduleId = request.getPathParamByKey("id");
-        // fetch dependency module data
-        fetchModuleDependency(request, response, buildNumber, buildStarted, moduleId);
-    }
-
-    /**
-     * fetch Module artifact data
-     *
-     * @param artifactoryRequest  - encapsulate data related to request
-     * @param artifactoryResponse - encapsulate data related to response
-     * @param buildNumber         - build number
-     * @param buildStarted        - build started time
-     * @param moduleId            - module id
-     */
-    private void fetchModuleDependency(ArtifactoryRestRequest artifactoryRequest, RestResponse artifactoryResponse, String buildNumber, String buildStarted, String moduleId) {
-        PagingData pagingData = artifactoryRequest.getPagingData();
-        List<ModuleDependency> moduleArtifacts = buildService.getModuleDependency(buildNumber, moduleId, buildStarted,
-                pagingData.getOrderBy(),
-                pagingData.getDirection(), pagingData.getStartOffset(), pagingData.getLimit());
-        List<ModuleDependencyModel> moduleArtifactModels = new ArrayList<>();
-        moduleArtifacts.forEach(moduleArtifact ->
-                        moduleArtifactModels.add(new ModuleDependencyModel(moduleArtifact, ActionUtils.getDownloadLink(artifactoryRequest.getServletRequest(),
-                                moduleArtifact.getRepoKey(), moduleArtifact.getPath())))
-        );
-        if (moduleArtifacts != null) {
-            // int artifactCount = artifactBuildAddon.getModuleDependencyCount(buildNumber, moduleId, buildStarted);
-            PagingModel pagingModel = new PagingModel(0, moduleArtifactModels);
-            artifactoryResponse.iModel(pagingModel);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/publishedmodules/GetPublishedModulesService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/publishedmodules/GetPublishedModulesService.java
deleted file mode 100644
index d6c5acf..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/builds/buildsinfo/tabs/publishedmodules/GetPublishedModulesService.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.artifactory.ui.rest.service.builds.buildsinfo.tabs.publishedmodules;
-
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.build.PublishedModule;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.PagingData;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.permission.PagingModel;
-import org.artifactory.ui.rest.model.builds.BuildModule;
-import org.artifactory.ui.utils.ModelDbMap;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetPublishedModulesService implements RestService {
-
-    @Autowired
-    BuildService buildService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-            String buildNumber = request.getPathParamByKey("number");
-            String buildStarted = request.getPathParamByKey("date");
-        // fetch modules
-        fetchModuleList(request, response, buildNumber, buildStarted);
-         }
-
-    /**
-     * get
-     * @param artifactoryRequest - encapsulate data related to request
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param buildNumber - build number
-     * @param buildStarted - build started
-     */
-    private void fetchModuleList(ArtifactoryRestRequest artifactoryRequest, RestResponse artifactoryResponse, String buildNumber, String buildStarted) {
-        PagingData pagingData = artifactoryRequest.getPagingData();
-        List<BuildModule> buildModuleList = new ArrayList<>();
-        Map<String, String> moduleMap = ModelDbMap.getModuleMap();
-        List<PublishedModule> buildModules = buildService.getPublishedModules(buildNumber, buildStarted,
-                moduleMap.get(pagingData.getOrderBy()),
-                pagingData.getDirection(), pagingData.getStartOffset(), pagingData.getLimit());
-        if (buildModules != null) {
-            buildModules.forEach(module -> buildModuleList.add(new BuildModule(module)));
-            PagingModel pagingModel = new PagingModel(0, buildModuleList);
-            artifactoryResponse.iModel(pagingModel);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/general/GeneralServiceFactory.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/general/GeneralServiceFactory.java
deleted file mode 100644
index 41981c2..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/general/GeneralServiceFactory.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.artifactory.ui.rest.service.general;
-
-import org.artifactory.ui.rest.service.admin.configuration.general.GetUploadLogoService;
-import org.artifactory.ui.rest.service.home.GetHomePageService;
-import org.artifactory.ui.rest.service.setmeup.*;
-import org.springframework.beans.factory.annotation.Lookup;
-
-/**
- * @author Chen Keinan
- */
-public abstract class GeneralServiceFactory {
-
-    // fetch tree service
-    @Lookup
-    public abstract GetFooterService getFooterService();
-
-    @Lookup
-    public abstract GetHomePageService getHomePage();
-
-    @Lookup
-    public abstract GetSetMeUpService getSetMeUp();
-
-    @Lookup
-    public abstract MavenSettingGeneratorService mavenSettingGenerator();
-
-    @Lookup
-    public abstract GradleSettingGeneratorService gradleSettingGenerator();
-
-    @Lookup
-    public abstract IvySettingGeneratorService ivySettingGenerator();
-
-    @Lookup
-    public abstract GetMavenSettingSnippetService getMavenSettingSnippet();
-
-    @Lookup
-    public abstract GetGradleSettingSnippetService getGradleSettingSnippet();
-
-    @Lookup
-    public abstract GetIvySettingSnippetService GetIvySettingSnippet();
-
-    @Lookup
-    public abstract GetReverseProxySetMeUpDataService getReverseProxySetMeUpData();
-
-    @Lookup
-    public abstract GetMavenDistributionMgntService getMavenDistributionMgnt();
-
-    @Lookup
-    public abstract GetUploadLogoService getUploadLogo();
-
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/general/GetFooterService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/general/GetFooterService.java
deleted file mode 100644
index 38190ed..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/general/GetFooterService.java
+++ /dev/null
@@ -1,224 +0,0 @@
-package org.artifactory.ui.rest.service.general;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.AddonsWebManager;
-import org.artifactory.addon.CoreAddons;
-import org.artifactory.addon.OssAddonsManager;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.descriptor.message.SystemMessageDescriptor;
-import org.artifactory.descriptor.security.sso.SamlSettings;
-import org.artifactory.descriptor.trashcan.TrashcanConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.general.Footer;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.io.File;
-import java.time.LocalDate;
-import java.util.Optional;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetFooterService implements RestService {
-
-    @Autowired
-    CentralConfigService centralConfigService;
-    @Autowired
-    private AuthorizationService authorizationService;
-    private boolean helpLinksEnabled;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String versionInfo = getVersionInfo();
-        String versionID = getVersionID(versionInfo);
-        String severId = getCurrentServerId();
-        Footer footer = new Footer(getFooterLicenseInfo(), versionInfo, getCopyrights(), getCopyRightsUrl(),
-                getBuildNum(), isAol(), isDedicatedAol(), isGlobalRepoEnabled(), versionID, isUserLogo(), getLogoUrl(), getServer(),
-                getSystemMessage(), isHelpLinksEnabled(), severId, isTrashDisabled(), allowPermDeletes(), getSamlAutoRedirect());
-        response.iModel(footer);
-    }
-
-    /**
-     * get version id (OSS / PRO / ENT)
-     *
-     * @param versionInfo - edition version info
-     */
-    private String getVersionID(String versionInfo) {
-        String versionID = "OSS";
-        switch (versionInfo) {
-            case "Artifactory Enterprise":
-                versionID = "ENT";
-                break;
-            case "Artifactory Professional":
-                versionID = "PRO";
-                break;
-            case "Artifactory AOL":
-                versionID = "PRO";
-                break;
-            default:
-                versionID = "OSS";
-                break;
-        }
-        return versionID;
-    }
-
-    private String getCurrentServerId() {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        HaCommonAddon haCommonAddon = addonsManager.addonByType(HaCommonAddon.class);
-        return haCommonAddon.getCurrentMemberServerId();
-    }
-
-    /**
-     * return version info
-     *
-     * @return version info text
-     */
-    private String getVersionInfo() {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        if (addonsManager instanceof OssAddonsManager){
-            return "Artifactory OSS";
-        }
-        if (isAol()) {
-            return "Artifactory AOL";
-        } else if (addonsManager.isHaLicensed()) {
-            return "Artifactory Enterprise";
-        } else if (addonsManager.getLicenseDetails()[2].equals("Commercial")) {
-            return "Artifactory Professional";
-        }  else if (addonsManager.getLicenseDetails()[2].equals("Trial")) {
-            return "Artifactory OSS";
-        } else {
-            // No license and we know that the instance is PRO instance
-            return "Artifactory Professional";
-        }
-    }
-
-    private boolean isAol() {
-        return ContextHelper.get().beanForType(AddonsManager.class).addonByType(CoreAddons.class).isAol();
-    }
-
-    private boolean isDedicatedAol() {
-        return this.isAol() && ArtifactoryHome.get().getArtifactoryProperties().getBooleanProperty(ConstantValues.aolDedicatedServer);
-    }
-
-    private boolean isGlobalRepoEnabled() {
-        return !ConstantValues.disableGlobalRepoAccess.getBoolean();
-    }
-
-    private boolean isTrashDisabled() {
-        TrashcanConfigDescriptor trashcanConfig = centralConfigService.getDescriptor().getTrashcanConfig();
-        return !trashcanConfig.isEnabled();
-    }
-
-    private boolean allowPermDeletes() {
-        TrashcanConfigDescriptor trashcanConfig = centralConfigService.getDescriptor().getTrashcanConfig();
-        return trashcanConfig.isAllowPermDeletes();
-    }
-
-    /**
-     * return version info
-     *
-     * @return version info text
-     */
-    private String getBuildNum() {
-        CoreAddons addon =  ContextHelper.get().beanForType(AddonsManager.class).addonByType(CoreAddons.class);
-        return addon.getBuildNum();
-    }
-
-
-    /**
-     * return footer license message
-     *
-     * @return footer text message
-     */
-    private String getFooterLicenseInfo() {
-        AddonsWebManager addonsManager = ContextHelper.get().beanForType(AddonsWebManager.class);
-        return addonsManager.getFooterMessage(authorizationService.isAdmin());
-    }
-
-    /**
-     * get copyrights data
-     *
-     * @return copy rights data
-     */
-    private String getCopyrights() {
-        LocalDate localDate = LocalDate.now();
-        String copyRights = "© Copyright " + localDate.getYear() + " JFrog Ltd";
-        return copyRights;
-    }
-
-    /**
-     * get copyrights url
-     *
-     * @return copyrights url
-     */
-    private String getCopyRightsUrl() {
-        return "http://www.jfrog.com";
-    }
-
-    /**
-     * check if user logo exist
-     *
-     * @return true if user logo exist
-     */
-    private boolean isUserLogo() {
-        String logoDir = ContextHelper.get().getArtifactoryHome().getLogoDir().getAbsolutePath();
-        File sourceFile = new File(logoDir, "logo");
-        boolean fileExist = sourceFile.canRead();
-        if (fileExist) {
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * return logo url link
-     *
-     * @return
-     */
-    private String getLogoUrl() {
-        return centralConfigService.getDescriptor().getLogo();
-    }
-
-    /**
-     * return logo url link
-     *
-     * @return
-     */
-    private String getServer() {
-        return centralConfigService.getDescriptor().getServerName();
-    }
-
-    /**
-     *  System message descriptor
-     */
-    private SystemMessageDescriptor getSystemMessage() {
-        return Optional.ofNullable(centralConfigService.getDescriptor().getSystemMessageConfig())
-                .orElse(new SystemMessageDescriptor());
-    }
-
-    public boolean isHelpLinksEnabled() {
-        return centralConfigService.getDescriptor().isHelpLinksEnabled();
-    }
-
-    /**
-     * Return the SAML redirect configuration
-     *
-     * @return SAML redirect configuration
-     */
-    private boolean getSamlAutoRedirect() {
-        SamlSettings samlSettings = centralConfigService.getDescriptor().getSecurity().getSamlSettings();
-        return samlSettings != null && samlSettings.isAutoRedirect();
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/home/GetHomePageService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/home/GetHomePageService.java
deleted file mode 100644
index 64979f3..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/home/GetHomePageService.java
+++ /dev/null
@@ -1,302 +0,0 @@
-package org.artifactory.ui.rest.service.home;
-
-import org.apache.commons.lang.time.DurationFormatUtils;
-import org.artifactory.addon.AddonInfo;
-import org.artifactory.addon.AddonState;
-import org.artifactory.addon.AddonType;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.CoreAddons;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.api.version.VersionHolder;
-import org.artifactory.api.version.VersionInfoService;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.common.property.ArtifactorySystemProperties;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.home.AddonModel;
-import org.artifactory.ui.rest.model.home.HomeModel;
-import org.artifactory.ui.utils.RequestUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.PostConstruct;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-/**
- * @author chen keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetHomePageService implements RestService {
-    private static final String ARTIFACTORY_ACCOUNT_MANAGEMENT_URL = "artifactory.accountManagement.url";
-    public static final String DEFAULT_ACCOUNT_MANAGEMENT_URL = "http://localhost:8086/dashboard/webapp";
-
-    private String accountManagementUrl = DEFAULT_ACCOUNT_MANAGEMENT_URL;
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Autowired
-    RepositoryService repositoryService;
-
-
-    @PostConstruct
-    private void initialize() {
-        ArtifactorySystemProperties artifactorySystemProperties = ArtifactoryHome.get().getArtifactoryProperties();
-        accountManagementUrl = artifactorySystemProperties.getProperty(ARTIFACTORY_ACCOUNT_MANAGEMENT_URL, DEFAULT_ACCOUNT_MANAGEMENT_URL);
-    }
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        List<AddonInfo> installedAddons = addonsManager.getInstalledAddons(null);
-
-        HomeModel homeModel = new HomeModel();
-        // update home addon model
-        updateHomeModel(homeModel, request);
-        HashMap<String, AddonInfo> addonInfoMap = new HashMap<>();
-        installedAddons.forEach(addonInfo -> addonInfoMap.put(addonInfo.getAddonName(), addonInfo));
-        List<AddonModel> addonModels = new ArrayList<>();
-        // update addon data
-        updateAddonList(addonInfoMap, addonModels);
-        homeModel.setAddons(addonModels);
-        if (authorizationService.isAdmin()) {
-            homeModel.setUpTime(getUptime());
-        }
-        homeModel.setAccountManagementLink(getAccountManagementLink());
-        homeModel.setDisplayAccountManagementLink(displayAccountManagementLink());
-        response.iModel(homeModel);
-    }
-
-    /**
-     * return system up time
-     *
-     * @return up time as string
-     */
-    public String getUptime() {
-        long uptime = ContextHelper.get().getUptime();
-        String uptimeStr = DurationFormatUtils.formatDuration(uptime, "d'd' H'h' m'm' s's'");
-        return uptimeStr;
-    }
-
-
-    /**
-     * update home model data
-     *
-     * @param homeModel - home model object
-     */
-    private void updateHomeModel(HomeModel homeModel, ArtifactoryRestRequest request) {
-        Map<String, String> headersMap = RequestUtils.getHeadersMap(request.getServletRequest());
-        String currentVersion = ConstantValues.artifactoryVersion.getString();
-        VersionInfoService versionInfoService = ContextHelper.get().beanForType(VersionInfoService.class);
-        VersionHolder versionHolder = versionInfoService.getLatestVersion(headersMap, true);
-        CentralConfigDescriptor configDescriptor = centralConfigService.getDescriptor();
-        updaateLatestVersion(homeModel, versionHolder, configDescriptor);
-        homeModel.setVersion(currentVersion);
-        homeModel.setArtifacts(getArtifactsCount());
-
-    }
-
-    /**
-     * update latest version data and link
-     *
-     * @param homeModel        - home model
-     * @param versionHolder    - version holder
-     * @param configDescriptor - config descriptor
-     */
-    private void updaateLatestVersion(HomeModel homeModel, VersionHolder versionHolder,
-            CentralConfigDescriptor configDescriptor) {
-        if (ConstantValues.versionQueryEnabled.getBoolean() && !configDescriptor.isOfflineMode()) {
-            String latestVersion = versionHolder.getVersion();
-            String latestVersionUrl = versionHolder.getDownloadUrl();
-            if (latestVersion != null && !latestVersion.equals("NA")) {
-                homeModel.setLatestRelease(latestVersion);
-            }
-            homeModel.setLatestReleaseLink(latestVersionUrl);
-        }
-    }
-
-    /**
-     * update addon list data
-     *
-     * @param addonInfoMap - addon info map
-     * @param addonModels  - addons models
-     */
-    private void updateAddonList(HashMap<String, AddonInfo> addonInfoMap, List<AddonModel> addonModels) {
-        if (!isAol()) {
-            addonModels.add(new AddonModel(AddonType.HA, addonInfoMap.get("ha"), getAddonLearnMoreUrl("ha"),
-                    getAddonConfigureUrl(AddonType.HA.getConfigureUrlSuffix())));
-        }
-        addonModels.add(new AddonModel(AddonType.DISTRIBUTION, getAddonInfo(AddonType.DISTRIBUTION, AddonState.ACTIVATED), getAddonLearnMoreUrl("distributionrepo"), getAddonConfigureUrl(AddonType.DISTRIBUTION.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.BUILD, addonInfoMap.get("build"), getAddonLearnMoreUrl("build"), getAddonConfigureUrl(AddonType.BUILD.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.DOCKER, addonInfoMap.get("docker"), getAddonLearnMoreUrl("docker"), getAddonConfigureUrl(AddonType.DOCKER.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.REPLICATION, addonInfoMap.get("replication"), getAddonLearnMoreUrl("replication"), getAddonConfigureUrl(AddonType.REPLICATION.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.MULTIPUSH, getAddonInfo(AddonType.MULTIPUSH), String.format(ConstantValues.addonsInfoUrl.getString(), "replication"), getAddonConfigureUrl(AddonType.MULTIPUSH.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.AQL, getAqlAddonInfo(), getAddonLearnMoreUrl("aql"), getAddonConfigureUrl(AddonType.AQL.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.S3, getAddonInfo(AddonType.S3), getAddonLearnMoreUrl("filestore"), getAddonConfigureUrl(AddonType.S3.getConfigureUrlSuffix()))); //todo change more info link to s3-filestore
-        //addonModels.add(new AddonModel(AddonType.HDFS, getAddonInfo(AddonType.HDFS), getAddonLearnMoreUrl("addon-hdfs"), getAddonConfigureUrl(AddonType.HDFS.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.GCS, getAddonInfo(AddonType.GCS), getAddonLearnMoreUrl("gcs"), getAddonConfigureUrl(AddonType.GCS.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.SHARDING, getAddonInfo(AddonType.SHARDING), getAddonLearnMoreUrl("sharding"), getAddonConfigureUrl(AddonType.SHARDING.getConfigureUrlSuffix())));
-        AddonInfo aolAddonPlugin;
-        aolAddonPlugin = getUserPluginAddonInfo(addonInfoMap);
-        addonModels.add(new AddonModel(AddonType.PLUGINS, aolAddonPlugin, getAddonLearnMoreUrl("plugins"), getAddonConfigureUrl(AddonType.PLUGINS.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.SMART_REPO, getAddonInfoForPro(AddonType.SMART_REPO), getAddonLearnMoreUrl("smart-remote-repositories"), getAddonConfigureUrl(AddonType.SMART_REPO.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.NUGET, addonInfoMap.get("nuget"), getAddonLearnMoreUrl("nuget"), getAddonConfigureUrl(AddonType.NUGET.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.NPM, addonInfoMap.get("npm"), getAddonLearnMoreUrl("npm"), getAddonConfigureUrl(AddonType.NPM.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.BOWER, addonInfoMap.get("bower"), getAddonLearnMoreUrl("bower"), getAddonConfigureUrl(AddonType.BOWER.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.COCOAPODS, addonInfoMap.get("cocoapods"), getAddonLearnMoreUrl("cocoapods"), getAddonConfigureUrl(AddonType.COCOAPODS.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.REST, addonInfoMap.get("rest"), getAddonLearnMoreUrl("rest"), getAddonConfigureUrl(AddonType.REST.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.GITLFS, addonInfoMap.get("git-lfs"), getAddonLearnMoreUrl("git-lfs"), getAddonConfigureUrl(AddonType.GITLFS.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.VAGRANT, addonInfoMap.get("vagrant"), getAddonLearnMoreUrl("vagrant"), getAddonConfigureUrl(AddonType.VAGRANT.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.LDAP, addonInfoMap.get("ldap"), getAddonLearnMoreUrl("ldap"), getAddonConfigureUrl(AddonType.LDAP.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.SSO, addonInfoMap.get("sso"), getAddonLearnMoreUrl("sso"), getAddonConfigureUrl(AddonType.SSO.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.OAUTH, getAddonInfoForPro(AddonType.OAUTH), getAddonLearnMoreUrl("oauth-integration"), getAddonConfigureUrl(AddonType.OAUTH.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.SSH, getAddonInfoForPro(AddonType.SSH), getAddonLearnMoreUrl("ssh"), getAddonConfigureUrl(AddonType.SSH.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.VCS, addonInfoMap.get("vcs"), getAddonLearnMoreUrl("vcs"), getAddonConfigureUrl(AddonType.VCS.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.YUM, addonInfoMap.get("yum"), getAddonLearnMoreUrl("yum"), getAddonConfigureUrl(AddonType.YUM.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.DEBIAN, addonInfoMap.get("debian"), getAddonLearnMoreUrl("debian"), getAddonConfigureUrl(AddonType.DEBIAN.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.OPKG, addonInfoMap.get("opkg"), getAddonLearnMoreUrl("opkg"), getAddonConfigureUrl(AddonType.OPKG.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.GEMS, addonInfoMap.get("gems"), getAddonLearnMoreUrl("gems"), getAddonConfigureUrl(AddonType.GEMS.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.PYPI, addonInfoMap.get("pypi"), getAddonLearnMoreUrl("pypi"), getAddonConfigureUrl(AddonType.PYPI.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.PROPERTIES, addonInfoMap.get("properties"), getAddonLearnMoreUrl("properties"), getAddonConfigureUrl(AddonType.PROPERTIES.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.SEARCH, addonInfoMap.get("search"), getAddonLearnMoreUrl("search"), getAddonConfigureUrl(AddonType.SEARCH.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.LAYOUTS, addonInfoMap.get("layouts"), getAddonLearnMoreUrl("layouts"), getAddonConfigureUrl(AddonType.LAYOUTS.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.LICENSES, addonInfoMap.get("license"), getAddonLearnMoreUrl("license"), getAddonConfigureUrl(AddonType.LICENSES.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.BLACKDUCK, addonInfoMap.get("blackduck"), getAddonLearnMoreUrl("blackduck"), getAddonConfigureUrl(AddonType.BLACKDUCK.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.MAVEN_PLUGIN, getAddonInfo(AddonType.MAVEN_PLUGIN, AddonState.ACTIVATED), getAddonLearnMoreUrl("maven"), getAddonConfigureUrl(AddonType.MAVEN_PLUGIN.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.GRADLE_PLUGIN, getAddonInfo(AddonType.GRADLE_PLUGIN, AddonState.ACTIVATED), getAddonLearnMoreUrl("gradle"), getAddonConfigureUrl(AddonType.GRADLE_PLUGIN.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.JENKINS_PLUGIN, getAddonInfo(AddonType.JENKINS_PLUGIN, AddonState.ACTIVATED), getAddonLearnMoreUrl("build"), getAddonConfigureUrl(AddonType.JENKINS_PLUGIN.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.BAMBOO_PLUGIN, getAddonInfo(AddonType.BAMBOO_PLUGIN, AddonState.ACTIVATED ), getAddonLearnMoreUrl("build"), getAddonConfigureUrl(AddonType.BAMBOO_PLUGIN.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.TC_PLUGIN, getAddonInfo(AddonType.TC_PLUGIN, AddonState.ACTIVATED), getAddonLearnMoreUrl("build"), getAddonConfigureUrl(AddonType.TC_PLUGIN.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.MSBUILD_PLUGIN, getAddonInfo(AddonType.MSBUILD_PLUGIN, AddonState.ACTIVATED), getAddonLearnMoreUrl("tfs-integration"), getAddonConfigureUrl(AddonType.MSBUILD_PLUGIN.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.SBT, getAddonInfo(AddonType.SBT, AddonState.ACTIVATED), getAddonLearnMoreUrl("sbt"), getAddonConfigureUrl(AddonType.SBT.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.IVY, getAddonInfo(AddonType.IVY, AddonState.ACTIVATED), getAddonLearnMoreUrl("ivy"), getAddonConfigureUrl(AddonType.IVY.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.FILTERED_RESOURCES, addonInfoMap.get("filtered-resources"), getAddonLearnMoreUrl("filtered-resources"), getAddonConfigureUrl(AddonType.FILTERED_RESOURCES.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.P2, addonInfoMap.get("p2"), getAddonLearnMoreUrl("p2"), getAddonConfigureUrl(AddonType.P2.getConfigureUrlSuffix())));
-        addonModels.add(new AddonModel(AddonType.WEBSTART, addonInfoMap.get("webstart"), getAddonLearnMoreUrl("webstart"), getAddonConfigureUrl(AddonType.WEBSTART.getConfigureUrlSuffix())));
-
-    }
-
-    /**
-     * get User plugin for aol or pro
-     * @param addonInfoMap - addon info map
-     * @return
-     */
-    private AddonInfo getUserPluginAddonInfo(HashMap<String, AddonInfo> addonInfoMap) {
-        AddonInfo aolAddonPlugin;
-        if (isAol()) {
-            aolAddonPlugin = getAddonInfo(AddonType.PLUGINS, AddonState.INACTIVATED);
-        } else {
-            aolAddonPlugin = addonInfoMap.get("plugins");
-        }
-        return aolAddonPlugin;
-    }
-
-    /**
-     * @return global artifact count
-     */
-    private long getArtifactsCount() {
-        long count = repositoryService.getArtifactCount();
-        return count;
-    }
-
-    /**
-     * return add on lean more url
-     * @param addonId - addon id
-     * @return
-     */
-    private String getAddonLearnMoreUrl(String addonId) {
-        return String.format(ConstantValues.addonsInfoUrl.getString(), addonId);
-    }
-
-    /**
-     * return add on configure more url
-     * @param addonId - addon id
-     * @return
-     */
-    private String getAddonConfigureUrl(String addonId) {
-        return String.format(ConstantValues.addonsConfigureUrl.getString(), addonId);
-    }
-
-    private AddonInfo getAqlAddonInfo() {
-        AddonInfo addonInfo = new AddonInfo(AddonType.AQL.getAddonName(),
-                AddonType.AQL.getAddonDisplayName(), "", AddonState.ACTIVATED, new Properties(), 10);
-        return addonInfo;
-    }
-
-    /**
-     * get addon info
-     * @param type - addon type
-     * @return
-     */
-    private AddonInfo getAddonInfo(AddonType type) {
-        boolean haLicensed = ContextHelper.get().beanForType(AddonsManager.class).isHaLicensed();
-        AddonInfo addonInfo = new AddonInfo(type.getAddonName(),
-                type.getAddonDisplayName(), "",
-                (haLicensed) ? AddonState.ACTIVATED : AddonState.NOT_LICENSED, new Properties(), 10);
-        return addonInfo;
-    }
-
-    /**
-     * get addon info
-     *
-     * @param type - addon type
-     * @return
-     */
-    private AddonInfo getAddonInfoForPro(AddonType type) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        AddonInfo addonInfo = new AddonInfo(type.getAddonName(),
-                type.getAddonDisplayName(), "",
-                (addonsManager.isLicenseInstalled()) ? AddonState.ACTIVATED : AddonState.NOT_LICENSED, new Properties(), 10);
-        return addonInfo;
-    }
-    /**
-     * get addon info
-     * @param type - addon type
-     * @return
-     */
-    private AddonInfo getAddonInfo(AddonType type, AddonState state) {
-        AddonInfo addonInfo = new AddonInfo(type.getAddonName(),
-                type.getAddonDisplayName(), "", state, new Properties(), 10);
-        return addonInfo;
-    }
-
-    /**
-     * if true - aol license
-     * @return
-     */
-    private boolean isAol() {
-        return ContextHelper.get().beanForType(AddonsManager.class).addonByType(CoreAddons.class).isAol();
-    }
-
-    /**
-     * display account managements link
-     * @return
-     */
-    private boolean displayAccountManagementLink() {
-        return isAol() && ConstantValues.aolDisplayAccountManagementLink.getBoolean();
-    }
-
-    /**
-     * get account managements link
-     * @return
-     */
-    private String getAccountManagementLink() {
-        return accountManagementUrl;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/GetGradleSettingSnippetService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/GetGradleSettingSnippetService.java
deleted file mode 100644
index 2a3d97c..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/GetGradleSettingSnippetService.java
+++ /dev/null
@@ -1,317 +0,0 @@
-package org.artifactory.ui.rest.service.setmeup;
-
-import org.apache.commons.io.IOUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.filteredresources.FilteredResourcesAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.maven.MavenService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.service.StreamRestResponse;
-import org.artifactory.ui.rest.model.setmeup.GradleSettingModel;
-import org.artifactory.ui.rest.model.setmeup.ScriptDownload;
-import org.artifactory.ui.utils.MultiPartUtils;
-import org.artifactory.util.HttpUtils;
-import org.artifactory.util.RepoLayoutUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-import org.springframework.util.PropertyPlaceholderHelper;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringReader;
-import java.util.List;
-import java.util.Properties;
-
-/**
- * @author chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetGradleSettingSnippetService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(GetGradleSettingSnippetService.class);
-
-    private final String JCENTER_DUMMY_REPO_KEY = "Bintray -> jcenter";
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Autowired
-    MavenService mavenService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        GradleSettingModel gradleSettingModel = (GradleSettingModel) request.getImodel();
-        boolean downloadScript = Boolean.valueOf(request.getQueryParamByKey("downloadScript"));
-        boolean downloadGradleProps = Boolean.valueOf(request.getQueryParamByKey("gradleProps"));
-        boolean deployGradleSettings = Boolean.valueOf(request.getQueryParamByKey("deploy"));
-        String servletContextUrl = HttpUtils.getServletContextUrl(request.getServletRequest());
-        // generate maven settings
-        String gradleSnippet = generateSettings(servletContextUrl, gradleSettingModel, response);
-
-        if (downloadGradleProps) {
-            downLoadGradleProps(response, servletContextUrl);
-            return;
-        }
-        if (downloadScript) {
-            downloadGradleBuildFile(response, gradleSnippet);
-            return;
-        } else if (deployGradleSettings) {
-            String savedSnippetName = MultiPartUtils.saveSettingToTempFolder(gradleSnippet);
-            GradleSettingModel gradleSettingsDeploy = new GradleSettingModel("build.gradle", savedSnippetName);
-            response.iModel(gradleSettingsDeploy);
-            return;
-        } else {
-            // update maven setting model
-            GradleSettingModel mavenSnippetModel = new GradleSettingModel(gradleSnippet);
-            mavenSnippetModel.clearProps();
-            response.iModel(mavenSnippetModel);
-        }
-    }
-
-    /**
-     * download Gradle build File
-     *
-     * @param response      - encapsulate data related to response
-     * @param gradleSnippet - gradle snippet file
-     */
-    private void downloadGradleBuildFile(RestResponse response, String gradleSnippet) {
-        //download build.gradle file
-        ScriptDownload scriptDownload = new ScriptDownload();
-        scriptDownload.setFileContent(gradleSnippet);
-        ((StreamRestResponse) response).setDownload(true);
-        ((StreamRestResponse) response).setDownloadFile("build.gradle");
-        response.iModel(scriptDownload);
-    }
-
-    /**
-     * download gradle build props
-     *
-     * @param response          - encapsulate data related to response
-     * @param servletContextUrl - servlet context
-     */
-    private void downLoadGradleProps(RestResponse response, String servletContextUrl) {
-        String gradleProperties = getGradleProperties(response, servletContextUrl);
-        ScriptDownload scriptDownload = new ScriptDownload();
-        scriptDownload.setFileContent(gradleProperties);
-        ((StreamRestResponse) response).setDownload(true);
-        ((StreamRestResponse) response).setDownloadFile("gradle.properties");
-        response.iModel(scriptDownload);
-    }
-
-    /**
-     *  generate gradle settings
-     * @return
-     */
-    public String generateSettings(String servletContextUrl,GradleSettingModel gradleSettingModel,RestResponse response) {
-        Properties templateProperties = getTemplateProperties(servletContextUrl,gradleSettingModel,response);
-        return replaceValuesAndGetTemplateValue("/build.gradle.template", templateProperties,response);
-    }
-
-    /**
-     *
-     * @return
-     */
-    private Properties getTemplateProperties(String servletContextUrl,GradleSettingModel gradleSettingModel,
-            RestResponse response) {
-        Properties repoDetailsProperties = new Properties();
-
-        // General
-        repoDetailsProperties.setProperty("artifactory.contextUrl", servletContextUrl);
-        repoDetailsProperties.setProperty("gradle.build.1tab", "    ");
-        repoDetailsProperties.setProperty("gradle.build.2tabs", "        ");
-        repoDetailsProperties.setProperty("gradle.build.3tabs", "            ");
-        repoDetailsProperties.setProperty("gradle.build.4tabs", "                ");
-
-        //jcenter overrides both maven and ivy
-        if(gradleSettingModel.getPluginRepoKey().equals(JCENTER_DUMMY_REPO_KEY)) {
-            repoDetailsProperties.setProperty("maven.repo", "jcenter()");
-            repoDetailsProperties.setProperty("ivy.repo", "");
-            // Plugins
-        } else {
-            repoDetailsProperties.setProperty("plugins.repository.url",
-                    getFullRepositoryUrl(servletContextUrl, gradleSettingModel.getPluginRepoKey()));
-            if (gradleSettingModel.getPluginUseMaven()) {
-                repoDetailsProperties.setProperty("maven.repo",
-                        replaceValuesAndGetTemplateValue("/build.gradle.maven.repo.template", repoDetailsProperties,response));
-            } else {
-                repoDetailsProperties.setProperty("maven.repo", "");
-            }
-
-            if (gradleSettingModel.getPluginUseIvy()) {
-                repoDetailsProperties.setProperty("ivy.repo",
-                        replaceValuesAndGetTemplateValue("/build.gradle.ivy.repo.template", repoDetailsProperties,response));
-            } else {
-                repoDetailsProperties.setProperty("ivy.repo", "");
-            }
-        }
-        // Publisher
-        if (gradleSettingModel.getPublisherUseIvy()) {
-            repoDetailsProperties.setProperty("ivy.publisher",
-                    replaceValuesAndGetTemplateValue("/build.gradle.ivy.publisher.template", repoDetailsProperties,response));
-            repoDetailsProperties.setProperty("libs.publisher.ivy.pattern",
-                    getDescriptorPattern(getLayout(gradleSettingModel.getLibsPublisherLayouts())));
-            repoDetailsProperties.setProperty("libs.publisher.artifact.pattern",
-                    getArtifactPattern(getLayout(gradleSettingModel.getLibsPublisherLayouts())));
-            repoDetailsProperties.setProperty("libs.publisher.maven.compatible",
-                    Boolean.toString(getFullDescriptorPattern(servletContextUrl,
-                            gradleSettingModel.getLibsPublisherRepoKey()
-                            , getLayout(gradleSettingModel.getLibsPublisherLayouts())).contains("pom")));
-        } else {
-            repoDetailsProperties.setProperty("ivy.publisher", "");
-        }
-        repoDetailsProperties.setProperty("libs.publisher.repoKey", gradleSettingModel.getLibsPublisherRepoKey());
-        repoDetailsProperties.setProperty("libs.publisher.maven", Boolean.toString(gradleSettingModel.getPublisherUseMaven()));
-
-        // Resolver
-        if (gradleSettingModel.getResolverUseIvy()) {
-            repoDetailsProperties.setProperty("ivy.resolver",
-                    replaceValuesAndGetTemplateValue("/build.gradle.ivy.resolver.template", repoDetailsProperties,response));
-            repoDetailsProperties.setProperty("libs.resolver.ivy.pattern",
-                    getDescriptorPattern(getLayout(gradleSettingModel.getLibsResolverLayout())));
-            repoDetailsProperties.setProperty("libs.resolver.artifact.pattern",
-                    getArtifactPattern(getLayout(gradleSettingModel.getLibsResolverLayout())));
-            repoDetailsProperties.setProperty("libs.resolver.maven.compatible",
-                    Boolean.toString(getFullDescriptorPattern(servletContextUrl,gradleSettingModel.getLibsResolverRepoKey(),getLayout(gradleSettingModel.getLibsResolverLayout())).contains("pom")));
-        } else {
-            repoDetailsProperties.setProperty("ivy.resolver", "");
-        }
-        repoDetailsProperties.setProperty("libs.resolver.repoKey", gradleSettingModel.getLibsResolverRepoKey());
-        repoDetailsProperties.setProperty("libs.resolver.maven", Boolean.toString(gradleSettingModel.getResolverUseMaven()));
-
-        // Credentials
-        Properties credentialProperties = new Properties();
-        String resolveCreds;
-        String publishCreds;
-        String pluginsCreds;
-        if (!authorizationService.isAnonymous() || !authorizationService.isAnonAccessEnabled()) {
-            credentialProperties.setProperty("creds.line.break", "\n            ");
-            resolveCreds = replaceValuesAndGetTemplateValue("/build.gradle.resolve.creds.template",
-                    credentialProperties,response);
-            publishCreds = replaceValuesAndGetTemplateValue("/build.gradle.publish.creds.template",
-                    credentialProperties,response);
-            pluginsCreds = replaceValuesAndGetTemplateValue("/build.gradle.creds.template", credentialProperties,response);
-        } else {
-            resolveCreds = "";
-            publishCreds = "";
-            pluginsCreds = "";
-        }
-        repoDetailsProperties.setProperty("resolve.creds", resolveCreds);
-        repoDetailsProperties.setProperty("publish.creds", publishCreds);
-        repoDetailsProperties.setProperty("repo.creds", pluginsCreds);
-
-        return repoDetailsProperties;
-    }
-
-    /**
-     *
-     * @param templateResourcePath
-     * @param templateProperties
-     * @return
-     */
-    private String replaceValuesAndGetTemplateValue(String templateResourcePath,
-            Properties templateProperties,RestResponse response) {
-        InputStream gradleInitTemplateStream = null;
-        try {
-            gradleInitTemplateStream = getClass().getResourceAsStream(templateResourcePath);
-            String gradleTemplate = IOUtils.toString(gradleInitTemplateStream);
-            PropertyPlaceholderHelper propertyPlaceholderHelper = new PropertyPlaceholderHelper("${", "}");
-            return propertyPlaceholderHelper.replacePlaceholders(gradleTemplate, templateProperties);
-        } catch (IOException e) {
-            String errorMessage = "An error occurred while preparing the Gradle Init Script template: ";
-            response.error(errorMessage + e.getMessage());
-            log.error(errorMessage, e);
-        } finally {
-            IOUtils.closeQuietly(gradleInitTemplateStream);
-        }
-        return "";
-    }
-
-    public String getFullRepositoryUrl(String servletContextUrl,String repoKey) {
-        return getFullUrl(servletContextUrl,repoKey);
-    }
-
-    private String getFullUrl(String host, String path) {
-        return new StringBuilder(host).append("/").append(path).toString();
-    }
-
-    /**
-     *
-     * @param layoutName
-     * @return
-     */
-    private RepoLayout getLayout(String layoutName){
-        RepoLayout layout = null;
-        List<RepoLayout> repoLayouts = centralConfigService.getDescriptor().getRepoLayouts();
-       for (RepoLayout repoLayout : repoLayouts){
-           if (repoLayout.getName().equals(layoutName)){
-               layout = repoLayout;
-               break;
-           }
-       }
-        return layout;
-    }
-
-    public String getDescriptorPattern(RepoLayout layout) {
-        return RepoLayoutUtils.getDescriptorLayoutAsIvyPattern(layout);
-    }
-
-
-    public String getArtifactPattern(RepoLayout layout) {
-        return RepoLayoutUtils.getArtifactLayoutAsIvyPattern(layout);
-    }
-
-    public String getFullDescriptorPattern(String servletContextUrl,String repoKey,RepoLayout layout) {
-        return getFullUrl(getFullUrl(servletContextUrl,repoKey),
-                RepoLayoutUtils.getDescriptorLayoutAsIvyPattern(layout));
-    }
-
-    /**
-     * @param restResponse
-     * @param servletContextUrl
-     * @return
-     */
-    private String getGradleProperties(RestResponse restResponse, String servletContextUrl) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        FilteredResourcesAddon filteredResourcesWebAddon = addonsManager.addonByType(
-                FilteredResourcesAddon.class);
-
-        java.util.Properties credentialProperties = new java.util.Properties();
-        credentialProperties.setProperty("auth.username",
-                filteredResourcesWebAddon.getGeneratedSettingsUsernameTemplate());
-
-        credentialProperties.setProperty("auth.password",
-                filteredResourcesWebAddon.getGeneratedSettingsUserCredentialsTemplate(false));
-
-        credentialProperties.setProperty("auth.contextUrl", servletContextUrl);
-
-        String content = replaceValuesAndGetTemplateValue("/gradle.properties.template", credentialProperties,
-                restResponse);
-        try {
-            String filtered = filteredResourcesWebAddon.filterResource(null,
-                    (org.artifactory.md.Properties) InfoFactoryHolder.get().createProperties(),
-                    new StringReader(content));
-            return filtered;
-        } catch (Exception e) {
-            log.error("Unable to filter gradle build properties file: " + e.getMessage());
-            restResponse.error(e.getMessage());
-        }
-        return content;
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/GetIvySettingSnippetService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/GetIvySettingSnippetService.java
deleted file mode 100644
index 9d0b031..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/GetIvySettingSnippetService.java
+++ /dev/null
@@ -1,205 +0,0 @@
-package org.artifactory.ui.rest.service.setmeup;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.filteredresources.FilteredResourcesAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.service.StreamRestResponse;
-import org.artifactory.ui.rest.model.setmeup.IvySettingModel;
-import org.artifactory.ui.rest.model.setmeup.ScriptDownload;
-import org.artifactory.ui.utils.MultiPartUtils;
-import org.artifactory.util.HttpUtils;
-import org.artifactory.util.RepoLayoutUtils;
-import org.jdom2.Comment;
-import org.jdom2.Document;
-import org.jdom2.Element;
-import org.jdom2.output.Format;
-import org.jdom2.output.XMLOutputter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.List;
-
-/**
- * @author chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetIvySettingSnippetService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(GetIvySettingSnippetService.class);
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        boolean downloadScript = Boolean.valueOf(request.getQueryParamByKey("downloadScript"));
-        boolean deploySettings = Boolean.valueOf(request.getQueryParamByKey("deploy"));
-        IvySettingModel ivySetting = (IvySettingModel) request.getImodel();
-        String servletContextUrl = HttpUtils.getServletContextUrl(request.getServletRequest());
-        String ivySnippet = generateSettings(servletContextUrl, response, ivySetting);
-        if (downloadScript) {
-            //download build.gradle file
-            ScriptDownload scriptDownload = new ScriptDownload();
-            scriptDownload.setFileContent(ivySnippet);
-            ((StreamRestResponse) response).setDownload(true);
-            ((StreamRestResponse) response).setDownloadFile("ivysettings.xml");
-            response.iModel(scriptDownload);
-        } else if (deploySettings) {
-            String savedSnippetName = MultiPartUtils.saveSettingToTempFolder(ivySnippet);
-            IvySettingModel ivySnippetDeploy = new IvySettingModel("ivysettings.xml", savedSnippetName);
-            response.iModel(ivySnippetDeploy);
-            return;
-        } else {
-            IvySettingModel ivySettingModel = new IvySettingModel(ivySnippet);
-            ivySettingModel.clearProps();
-            response.iModel(ivySettingModel);
-        }
-    }
-
-    public String generateSettings(String servletContextUrl, RestResponse response, IvySettingModel ivySetting) {
-        Document document = new Document();
-        Element rootNode = new Element("ivy-settings");
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        FilteredResourcesAddon filteredResourcesWebAddon =
-                addonsManager.addonByType(FilteredResourcesAddon.class);
-        Element settingsElement = new Element("settings");
-        settingsElement.setAttribute("defaultResolver", "main");
-        rootNode.addContent(settingsElement);
-
-        if (!authorizationService.isAnonymous() || !authorizationService.isAnonAccessEnabled()) {
-            rootNode.addContent(
-                    new Comment("Authentication required for publishing (deployment). 'Artifactory Realm' is " +
-                            "the realm used by Artifactory so don't change it."));
-
-            Element credentialsElement = new Element("credentials");
-            try {
-                credentialsElement.setAttribute("host", new URL(servletContextUrl).getHost());
-            } catch (MalformedURLException e) {
-                String errorMessage =
-                        "An error occurred while decoding the servlet context URL for the credentials host attribute: ";
-                response.error(errorMessage + e.getMessage());
-                log.error(errorMessage, e);
-            }
-            credentialsElement.setAttribute("realm", "Artifactory Realm");
-
-            credentialsElement.setAttribute("username",
-                    filteredResourcesWebAddon.getGeneratedSettingsUsernameTemplate());
-
-            credentialsElement.setAttribute("passwd", "@PASS_ATTR_PLACEHOLDER@");
-
-            rootNode.addContent(credentialsElement);
-        }
-
-        Element resolversElement = new Element("resolvers");
-
-        Element chainElement = new Element("chain");
-        chainElement.setAttribute("name", "main");
-
-        String resolverName = ivySetting.getLibsResolverName();
-        resolverName = StringUtils.isNotBlank(resolverName) ? resolverName : "public";
-
-        if (ivySetting.getUseIbiblioResolver()) {
-
-            Element ibiblioElement = new Element("ibiblio");
-            ibiblioElement.setAttribute("name", resolverName);
-            ibiblioElement.setAttribute("m2compatible", Boolean.TRUE.toString());
-            ibiblioElement.setAttribute("root", getFullRepositoryUrl(servletContextUrl, ivySetting.getLibsRepo()));
-            chainElement.addContent(ibiblioElement);
-        } else {
-
-            Element urlElement = new Element("url");
-            urlElement.setAttribute("name", resolverName);
-
-            urlElement.setAttribute("m2compatible", Boolean.toString(ivySetting.getM2Compatible()));
-
-            Element artifactPatternElement = new Element("artifact");
-            artifactPatternElement.setAttribute("pattern", getFullArtifactPattern(servletContextUrl,
-                    ivySetting.getLibsRepo(), getLayout(ivySetting.getLibsRepoLayout())));
-            urlElement.addContent(artifactPatternElement);
-
-            Element ivyPatternElement = new Element("ivy");
-            ivyPatternElement.setAttribute("pattern", getFullDescriptorPattern(servletContextUrl,
-                    ivySetting.getLibsRepo(), getLayout(ivySetting.getLibsRepoLayout())));
-            urlElement.addContent(ivyPatternElement);
-
-            chainElement.addContent(urlElement);
-        }
-
-        resolversElement.addContent(chainElement);
-
-        rootNode.addContent(resolversElement);
-
-        document.setRootElement(rootNode);
-
-        String result = new XMLOutputter(Format.getPrettyFormat()).outputString(document);
-        // after the xml is generated replace the password placeholder with the template placeholder (otherwise jdom
-        // escapes this string)
-
-        return result.replace("@PASS_ATTR_PLACEHOLDER@",
-                filteredResourcesWebAddon.getGeneratedSettingsUserCredentialsTemplate(false));
-    }
-
-    public String getDescriptorPattern(RepoLayout layout) {
-        return RepoLayoutUtils.getDescriptorLayoutAsIvyPattern(layout);
-    }
-
-
-    public String getArtifactPattern(RepoLayout layout) {
-        return RepoLayoutUtils.getArtifactLayoutAsIvyPattern(layout);
-    }
-
-    public String getFullDescriptorPattern(String servletContextUrl, String repoKey, RepoLayout layout) {
-        return getFullUrl(getFullUrl(servletContextUrl, repoKey),
-                RepoLayoutUtils.getDescriptorLayoutAsIvyPattern(layout));
-    }
-
-
-    private String getFullUrl(String host, String path) {
-        return new StringBuilder(host).append("/").append(path).toString();
-    }
-
-    public String getFullRepositoryUrl(String servletContextUrl, String repoKey) {
-        return getFullUrl(servletContextUrl, repoKey);
-    }
-
-    public String getFullArtifactPattern(String servletContextUrl, String repoKey, RepoLayout layout) {
-        return getFullUrl(getFullUrl(servletContextUrl, repoKey),
-                RepoLayoutUtils.getArtifactLayoutAsIvyPattern(layout));
-    }
-
-    /**
-     * @param layoutName
-     * @return
-     */
-    private RepoLayout getLayout(String layoutName) {
-        RepoLayout layout = null;
-        List<RepoLayout> repoLayouts = centralConfigService.getDescriptor().getRepoLayouts();
-        for (RepoLayout repoLayout : repoLayouts) {
-            if (repoLayout.getName().equals(layoutName)) {
-                layout = repoLayout;
-                break;
-            }
-        }
-        return layout;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/GetMavenDistributionMgntService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/GetMavenDistributionMgntService.java
deleted file mode 100644
index 2052fe8..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/GetMavenDistributionMgntService.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.artifactory.ui.rest.service.setmeup;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.general.distributionmngt.DistributionManagement;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetMavenDistributionMgntService implements RestService {
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Autowired
-    RepositoryService repositoryService;
-
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String repoKey = request.getQueryParamByKey("repoKey");
-        DistributionManagement distributionManagement = new DistributionManagement();
-        RepoDescriptor repoDescriptor = repositoryService.repoDescriptorByKey(repoKey);// .localOrCachedRepoDescriptorByKey(repoKey);
-        // populate distribution management
-        if (repoDescriptor != null && (repoDescriptor instanceof LocalRepoDescriptor || repoDescriptor instanceof VirtualRepoDescriptor)) {
-            StringBuilder dm = distributionManagement.populateDistributionManagement(repoDescriptor,
-                    centralConfigService, request.getServletRequest());
-            distributionManagement.setDistributedManagement(dm.toString());
-            response.iModel(distributionManagement);
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/GetMavenSettingSnippetService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/GetMavenSettingSnippetService.java
deleted file mode 100644
index 2bdcde6..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/GetMavenSettingSnippetService.java
+++ /dev/null
@@ -1,172 +0,0 @@
-package org.artifactory.ui.rest.service.setmeup;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.filteredresources.FilteredResourcesAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.maven.*;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.factory.InfoFactoryHolder;
-import org.artifactory.md.Properties;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.rest.common.service.StreamRestResponse;
-import org.artifactory.ui.rest.model.setmeup.MavenSettingModel;
-import org.artifactory.ui.rest.model.setmeup.ScriptDownload;
-import org.artifactory.ui.utils.MultiPartUtils;
-import org.artifactory.util.HttpUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-import org.springframework.util.StringUtils;
-
-import java.io.IOException;
-import java.io.StringReader;
-
-/**
- * @author chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetMavenSettingSnippetService implements RestService {
-    private static final Logger log = LoggerFactory.getLogger(GetMavenSettingSnippetService.class);
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Autowired
-    MavenService mavenService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        boolean downloadScript = Boolean.valueOf(request.getQueryParamByKey("downloadScript"));
-        boolean deployMavenSettings = Boolean.valueOf(request.getQueryParamByKey("deploy"));
-        MavenSettingModel mavenSettingModel = (MavenSettingModel) request.getImodel();
-        String servletContextUrl = HttpUtils.getServletContextUrl(request.getServletRequest());
-        // generate maven settings
-        String mavenSnippet = generateSettings(servletContextUrl, mavenSettingModel, response);
-        if (downloadScript) {
-            String mavenSnippetForDownload = getMavenSnippetForDownload(mavenSnippet);
-            //download build.gradle file
-            ScriptDownload scriptDownload = new ScriptDownload();
-            scriptDownload.setFileContent(mavenSnippetForDownload);
-            ((StreamRestResponse) response).setDownload(true);
-            ((StreamRestResponse) response).setDownloadFile("settings.xml");
-            response.iModel(scriptDownload);
-        } else if (deployMavenSettings) {
-            String savedSnippetName = MultiPartUtils.saveSettingToTempFolder(mavenSnippet);
-            MavenSettingModel mavenSettingsDeploy = new MavenSettingModel("settings.xml", savedSnippetName);
-            response.iModel(mavenSettingsDeploy);
-            return;
-        } else {
-            // update maven setting model
-            MavenSettingModel mavenSnippetModel = new MavenSettingModel(mavenSnippet);
-            mavenSnippetModel.clearProps();
-            response.iModel(mavenSnippetModel);
-        }
-    }
-
-    /**
-     * Prepares a local maven settings model to be used by the maven service.<br>
-     * Published as a protected method because a simple extension point is needed by the dashboard to append servers to
-     * the model.
-     *
-     * @param servletContextUrl Current context URL
-     * @return Local settings model
-     */
-    protected MavenSettings assembleLocalSettingsModel(String servletContextUrl,
-            MavenSettingModel mavenSettingModel) {
-        //Build settings object from the user selections in the panel
-        MavenSettings mavenSettings = new MavenSettings(servletContextUrl);
-
-        //Add release and snapshot choices
-        String releases = mavenSettingModel.getRelease();
-        mavenSettings.addReleaseRepository(new MavenSettingsRepository("central", releases, false));
-        String snapshots = mavenSettingModel.getSnapshot();
-        mavenSettings.addReleaseRepository(new MavenSettingsRepository("snapshots", snapshots, true));
-
-        //Add plugin release and snapshot choices
-        String pluginReleases = mavenSettingModel.getPluginRelease();
-        mavenSettings.addPluginRepository(new MavenSettingsRepository("central", pluginReleases, false));
-        String pluginSnapshots = mavenSettingModel.getPluginSnapshot();
-        mavenSettings.addPluginRepository(new MavenSettingsRepository("snapshots", pluginSnapshots, true));
-
-        //Add the "mirror any" repo, if the user has selected it
-        if (!StringUtils.isEmpty(mavenSettingModel.getMirror())) {
-            String mirror = mavenSettingModel.getMirror();
-            mavenSettings.addMirrorRepository(new MavenSettingsMirror(mirror, mirror, "*"));
-        }
-
-        if (!authorizationService.isAnonymous() || !authorizationService.isAnonAccessEnabled()) {
-            AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-            FilteredResourcesAddon filteredResourcesWebAddon =
-                    addonsManager.addonByType(FilteredResourcesAddon.class);
-            String currentUsername = filteredResourcesWebAddon.getGeneratedSettingsUsernameTemplate();
-            String currentPassword = filteredResourcesWebAddon.getGeneratedSettingsUserCredentialsTemplate(true);
-
-            mavenSettings.addServer(new MavenSettingsServer("central", currentUsername, currentPassword));
-            mavenSettings.addServer(new MavenSettingsServer("snapshots", currentUsername, currentPassword));
-        }
-        return mavenSettings;
-    }
-
-    /**
-     * generate maven settings
-     * @param servletContextUrl - servlet context
-     * @param mavenSettingModel - maven settings model
-     * @param restResponse - rest response
-     * @return
-     */
-    public String generateSettings(String servletContextUrl,MavenSettingModel mavenSettingModel,RestResponse restResponse) {
-        //Make sure URL ends with slash
-        if (!servletContextUrl.endsWith("/")) {
-            servletContextUrl += "/";
-        }
-
-        MavenSettings mavenSettings = assembleLocalSettingsModel(servletContextUrl,mavenSettingModel);
-        try {
-            //Generate XML settings content
-            return mavenService.generateSettings(mavenSettings);
-        } catch (
-                IOException ioe) {
-            String message = ioe.getMessage();
-           log.error(message);
-            restResponse.error("Maven settings could no be generated.");
-        }
-        return null;
-    }
-
-    /**
-     * generate maven settigs for download
-     *
-     * @param mavenTemplateSnippet - maven template snippet
-     * @return - maven settings
-     */
-    String getMavenSnippetForDownload(String mavenTemplateSnippet) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        FilteredResourcesAddon filteredResourcesWebAddon = addonsManager.addonByType(
-                FilteredResourcesAddon.class);
-        String filtered = null;
-        try {
-            filtered = filteredResourcesWebAddon.filterResource(null,
-                    (Properties) InfoFactoryHolder.get().createProperties(),
-                    new StringReader(mavenTemplateSnippet));
-        } catch (Exception e) {
-            log.error("Unable to filter settings: " + e.getMessage());
-
-        }
-        return filtered;
-    }
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/GetReverseProxySetMeUpDataService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/GetReverseProxySetMeUpDataService.java
deleted file mode 100644
index 4f922a9..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/GetReverseProxySetMeUpDataService.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.artifactory.ui.rest.service.setmeup;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.ReverseProxyDescriptor;
-import org.artifactory.descriptor.repo.ReverseProxyMethod;
-import org.artifactory.descriptor.repo.ReverseProxyRepoConfig;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.setmeup.ReverseProxySetMeUpDataModel;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Danny Reiser
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetReverseProxySetMeUpDataService implements RestService {
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String repoKey = request.getQueryParamByKey("repoKey");
-        ReverseProxySetMeUpDataModel reverseProxySetMeUpDataModel= new ReverseProxySetMeUpDataModel();
-
-        CentralConfigService centralConfig = ContextHelper.get().getCentralConfig();
-        ReverseProxyDescriptor reverseProxy = centralConfig.getMutableDescriptor().getCurrentReverseProxy();
-        if (!authorizationService.userHasPermissionsOnRepositoryRoot(repoKey)) {
-            response.error("User has no permission on " + repoKey);
-        }
-        else if (reverseProxy != null) {
-            reverseProxySetMeUpDataModel.setUsingHttps(reverseProxy.isUseHttps());
-            reverseProxySetMeUpDataModel.setMethodSelected(reverseProxy.getDockerReverseProxyMethod() != ReverseProxyMethod.NOVALUE);
-            reverseProxySetMeUpDataModel.setServerName(reverseProxy.getServerName());
-            if (reverseProxy.getDockerReverseProxyMethod() == ReverseProxyMethod.PORTPERREPO) {
-                reverseProxySetMeUpDataModel.setUsingPorts(true);
-                ReverseProxyRepoConfig perRepo = reverseProxy.getReverseProxyRepoConfig(repoKey);
-                if (perRepo != null) {
-                    reverseProxySetMeUpDataModel.setRepoPort(perRepo.getPort());
-                }
-            }
-            else {
-                reverseProxySetMeUpDataModel.setUsingPorts(false);
-            }
-            response.iModel(reverseProxySetMeUpDataModel);
-        }
-
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/GetSetMeUpService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/GetSetMeUpService.java
deleted file mode 100644
index b91d800..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/GetSetMeUpService.java
+++ /dev/null
@@ -1,176 +0,0 @@
-package org.artifactory.ui.rest.service.setmeup;
-
-import com.google.common.collect.Sets;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.CoreAddons;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AclService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.*;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.setmeup.SetMeUpModel;
-import org.artifactory.ui.rest.model.utils.repositories.RepoKeyType;
-import org.artifactory.util.HttpUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.*;
-
-/**
- * @author chen Keinan
- * @author Lior Hasson
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetSetMeUpService implements RestService {
-
-    @Autowired
-    AclService aclService;
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        /// get list of repositories descriptor by user permissions
-        List<RepoKeyType> repoKeyTypes = getRepoKeyTypes();
-        // update set me up model
-        SetMeUpModel setMeUpModel = getSetMeUpModel(request, repoKeyTypes);
-        response.iModel(setMeUpModel);
-    }
-
-    private SetMeUpModel getSetMeUpModel(ArtifactoryRestRequest artifactoryRequest, List<RepoKeyType> repoKeyTypes) {
-        SetMeUpModel setMeUpModel = new SetMeUpModel();
-        setMeUpModel.setRepoKeyTypes(repoKeyTypes);
-        String servletContextUrl = HttpUtils.getServletContextUrl(artifactoryRequest.getServletRequest());
-        setMeUpModel.setBaseUrl(servletContextUrl);
-        setMeUpModel.setServerId(centralConfigService.getServerName());
-        setMeUpModel.setHostname(ContextHelper.get().beanForType(AddonsManager.class).addonByType(CoreAddons.class).getArtifactoryServerName());
-        return setMeUpModel;
-    }
-
-    /**
-     * get user keys type list
-     * @return - list of user keys types
-     */
-    private List<RepoKeyType> getRepoKeyTypes() {
-        Set<RepoBaseDescriptor> userRepos = getUserRepos();
-        List<RepoKeyType> repoKeyTypes = new ArrayList<>();
-        userRepos.forEach(userRepo -> {
-            if (!userRepo.getKey().endsWith("-cache")) {
-                RepoKeyType repoKeyType = new RepoKeyType(userRepo.getType(), userRepo.getKey());
-                // update can read or deploy
-                updateCanReadOrDeploy(userRepo, repoKeyType);
-
-                if(userRepo instanceof LocalRepoDescriptor){
-                    repoKeyType.setIsLocal(true);
-                }
-                if(userRepo instanceof RemoteRepoDescriptor){
-                    repoKeyType.setIsRemote(true);
-                }
-                if(userRepo instanceof VirtualRepoDescriptor){
-                    repoKeyType.setIsVirtual(true);
-                    if (((VirtualRepoDescriptor)userRepo).getDefaultDeploymentRepo() != null) {
-                        repoKeyType.setIsDefaultDeploymentConfigured(true);
-                    }
-                }
-                repoKeyTypes.add(repoKeyType);
-            }
-        });
-
-        return repoKeyTypes;
-    }
-
-    private void updateCanReadOrDeploy(RepoBaseDescriptor userRepo, RepoKeyType repoKeyType) {
-        RepoPath repoPath;
-        repoKeyType.setCanRead(false);
-        repoKeyType.setCanDeploy(false);
-
-        if(userRepo instanceof HttpRepoDescriptor){
-            repoPath = InternalRepoPathFactory.repoRootPath(userRepo.getKey() + "-cache");
-        }
-        else {
-            repoPath = InternalRepoPathFactory.repoRootPath(userRepo.getKey());
-        }
-
-        if(authorizationService.canRead(repoPath)) {
-            repoKeyType.setCanRead(true);
-        }
-        if(authorizationService.canDeploy(repoPath)) {
-            repoKeyType.setCanDeploy(true);
-        }
-    }
-
-    /**
-     * get list of repositories allowed for this user to deploy
-     *
-     * @return - list of repositories
-     */
-    private Set<RepoBaseDescriptor> getUserRepos() {
-        Set<RepoBaseDescriptor> baseDescriptors = Sets.newTreeSet(new RepoComparator());
-        List<LocalRepoDescriptor> localDescriptors = repositoryService.getLocalAndCachedRepoDescriptors();
-        removeNonPermissionRepositories(localDescriptors);
-        baseDescriptors.addAll(localDescriptors);
-        // add remote repo
-        List<RemoteRepoDescriptor> remoteDescriptors = repositoryService.getRemoteRepoDescriptors();
-        removeNonPermissionRepositories(remoteDescriptors);
-        baseDescriptors.addAll(remoteDescriptors);
-        // add virtual repo
-        List<VirtualRepoDescriptor> virtualDescriptors = repositoryService.getVirtualRepoDescriptors();
-        removeNonPermissionRepositories(virtualDescriptors);
-        baseDescriptors.addAll(virtualDescriptors);
-
-        return baseDescriptors;
-    }
-
-    /**
-     *
-     * filter non permitted repositories
-     * @param repositories
-     */
-    private void removeNonPermissionRepositories(List<? extends RepoDescriptor> repositories) {
-        AuthorizationService authorizationService = ContextHelper.get().getAuthorizationService();
-        Iterator<? extends RepoDescriptor> repoDescriptors = repositories.iterator();
-        while (repoDescriptors.hasNext()) {
-            RepoDescriptor repoDescriptor = repoDescriptors.next();
-            if (!authorizationService.userHasPermissionsOnRepositoryRoot(repoDescriptor.getKey())) {
-                repoDescriptors.remove();
-            }
-        }
-    }
-
-
-    private static class RepoComparator implements Comparator<RepoBaseDescriptor> {
-        @Override
-        public int compare(RepoBaseDescriptor descriptor1, RepoBaseDescriptor descriptor2) {
-
-            //Local repositories can be either ordinary or caches
-            if (descriptor1 instanceof LocalRepoDescriptor) {
-                boolean repo1IsCache = ((LocalRepoDescriptor) descriptor1).isCache();
-                boolean repo2IsCache = ((LocalRepoDescriptor) descriptor2).isCache();
-
-                //Cache repositories should appear in a higher priority
-                if (repo1IsCache && !repo2IsCache) {
-                    return 1;
-                } else if (!repo1IsCache && repo2IsCache) {
-                    return -1;
-                }
-            }
-            return descriptor1.getKey().compareTo(descriptor2.getKey());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/GradleSettingGeneratorService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/GradleSettingGeneratorService.java
deleted file mode 100644
index 517d37b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/GradleSettingGeneratorService.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.artifactory.ui.rest.service.setmeup;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.setmeup.GradleSettingModel;
-import org.artifactory.ui.rest.service.utils.setMeUp.SettingsHelper;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.LinkedList;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author chen Keinan
- * @author Lior Hasson
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GradleSettingGeneratorService implements RestService {
-
-    private final String JCENTER_DUMMY_REPO_KEY = "Bintray -> jcenter";
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        List<RepoDescriptor> readableVirtualRepoDescriptors = SettingsHelper.getReadableVirtualRepoDescriptors(
-                repositoryService, authorizationService);
-        List<RepoDescriptor> readableLocalRepoDescriptors = SettingsHelper.getReadableLocalRepoDescriptors(
-                repositoryService, authorizationService);
-
-
-        List<RepoDescriptor> readableVirtualAndRemoteRepoDesc = new LinkedList<>();
-        readableVirtualAndRemoteRepoDesc.addAll(readableVirtualRepoDescriptors);
-
-        GradleSettingModel gradleSettingModel = new GradleSettingModel();
-        gradleSettingModel.getPluginResolver().add(JCENTER_DUMMY_REPO_KEY);
-
-        //add repos to publisher
-        gradleSettingModel.getLibsPublisher().addAll(
-                readableLocalRepoDescriptors
-                        .stream().map(RepoDescriptor::getKey)
-                        .collect(Collectors.toList()));
-
-        //add repos to resolvers and plugin resolvers
-        gradleSettingModel.getLibsResolver().addAll(
-                readableVirtualAndRemoteRepoDesc
-                        .stream().map(RepoDescriptor::getKey)
-                        .collect(Collectors.toList()));
-
-        //add repos to plugin resolvers
-        gradleSettingModel.getPluginResolver().addAll(
-                readableVirtualAndRemoteRepoDesc
-                        .stream().map(RepoDescriptor::getKey)
-                        .collect(Collectors.toList()));
-
-        List<RepoLayout> repoLayouts = centralConfigService.getDescriptor().getRepoLayouts();
-        repoLayouts.forEach(repoLayout -> gradleSettingModel.getLayouts().add(repoLayout.getName()));
-        response.iModel(gradleSettingModel);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/IvySettingGeneratorService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/IvySettingGeneratorService.java
deleted file mode 100644
index 4c88935..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/IvySettingGeneratorService.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.artifactory.ui.rest.service.setmeup;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.RepoLayout;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.setmeup.IvySettingModel;
-import org.artifactory.ui.rest.service.utils.setMeUp.SettingsHelper;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * @author chen Keinan
- * @author Lior Hasson
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class IvySettingGeneratorService implements RestService {
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        List<RepoDescriptor> readableVirtualRepoDescriptors = SettingsHelper.getReadableVirtualRepoDescriptors(
-                repositoryService, authorizationService);
-        IvySettingModel ivySettingModel = new IvySettingModel();
-         readableVirtualRepoDescriptors.forEach(repoDescriptor ->
-                    ivySettingModel.getLibsRepository().add(repoDescriptor.getKey())
-        );
-        List<RepoLayout> repoLayouts = centralConfigService.getDescriptor().getRepoLayouts();
-        repoLayouts.forEach(repoLayout -> ivySettingModel.getLibsRepositoryLayout().add(repoLayout.getName()));
-        response.iModel(ivySettingModel);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/MavenSettingGeneratorService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/MavenSettingGeneratorService.java
deleted file mode 100644
index 4a58cd9..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/setmeup/MavenSettingGeneratorService.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.artifactory.ui.rest.service.setmeup;
-
-import com.google.common.collect.Lists;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.setmeup.MavenSettingModel;
-import org.artifactory.ui.rest.service.utils.setMeUp.SettingsHelper;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * @author chen Keinan
- * @author Lior Hasson
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class MavenSettingGeneratorService implements RestService {
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Autowired
-    CentralConfigService centralConfigService;
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        List<RepoDescriptor> readableVirtualRepoDescriptors = SettingsHelper.getReadableVirtualRepoDescriptors(
-                repositoryService, authorizationService);
-        List<RepoDescriptor> readableVirtualAndRemote = Lists.newArrayList();
-        readableVirtualAndRemote.addAll(readableVirtualRepoDescriptors);
-        MavenSettingModel mavenSettingModel = new MavenSettingModel();
-        readableVirtualAndRemote.forEach(repoDescriptor -> {
-                    mavenSettingModel.getSnapshots().add(repoDescriptor.getKey());
-                    mavenSettingModel.getPluginReleases().add(repoDescriptor.getKey());
-                    mavenSettingModel.getPluginSnapshots().add(repoDescriptor.getKey());
-                    mavenSettingModel.getAnyMirror().add(repoDescriptor.getKey());
-                    mavenSettingModel.getReleases().add(repoDescriptor.getKey());
-                }
-        );
-        response.iModel(mavenSettingModel);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/UtilsServiceFactory.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/UtilsServiceFactory.java
deleted file mode 100644
index dcf7c4d..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/UtilsServiceFactory.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.artifactory.ui.rest.service.utils;
-
-import org.artifactory.ui.rest.service.utils.cron.GetCronNextTimeService;
-import org.artifactory.ui.rest.service.utils.groups.GetGroupPermissionsService;
-import org.artifactory.ui.rest.service.utils.predefinevalues.GetPreDefineValuesService;
-import org.artifactory.ui.rest.service.utils.repoPropertySet.GetRepoPropertySetService;
-import org.artifactory.ui.rest.service.utils.repositories.GetAllRepositoriesService;
-import org.springframework.beans.factory.annotation.Lookup;
-
-/**
- * @author Chen Keinan
- */
-public abstract class UtilsServiceFactory {
-
-    @Lookup
-    public abstract GetCronNextTimeService getGetCronNextTimeService();
-
-    @Lookup
-    public abstract GetAllRepositoriesService getGetAllRepositoriesService();
-
-    @Lookup
-    public abstract GetPreDefineValuesService getGetPreDefineValuesService();
-
-    @Lookup
-    public abstract GetRepoPropertySetService getGetRepoPropertySetService();
-
-    @Lookup
-    public abstract GetGroupPermissionsService getGroupPermissions();
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/cron/GetCronNextTimeService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/cron/GetCronNextTimeService.java
deleted file mode 100644
index 6e6b6a0..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/cron/GetCronNextTimeService.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.artifactory.ui.rest.service.utils.cron;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.utils.cron.CronTime;
-import org.artifactory.ui.rest.service.admin.configuration.repositories.replication.ReplicationConfigService;
-import org.artifactory.cron.CronUtils;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.Date;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetCronNextTimeService implements RestService {
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        // get next cron time
-        CronTime cronTime = getCronTime(request, response);
-        // update response
-        response.iModel(cronTime);
-    }
-
-    /**
-     * get cron time model
-     *
-     * @param request  - encapsulate data related to request
-     * @param response - encapsulate data require for response
-     * @return cron time model
-     */
-    private CronTime getCronTime(ArtifactoryRestRequest request, RestResponse response) {
-        CronTime cronTime = null;
-        String cronExp = request.getQueryParamByKey("cron");
-        String nextExecutionTime = getNextRunTime(cronExp, response);
-        if (nextExecutionTime != null) {
-            if (Boolean.valueOf(request.getQueryParamByKey(ReplicationConfigService.IS_REPLICATION_QUERY_PARAM))
-                    && CronUtils.isCronIntervalLessThanMinimum(cronExp)) {
-                response.error("shortCron");
-            }
-            cronTime = new CronTime(nextExecutionTime);
-        }
-        return cronTime;
-    }
-
-    /**
-     * return next execution time from cron exp
-     *
-     * @param cronExpression      - cron expression
-     * @param artifactoryResponse - encapsulate data require for response
-     * @return next execution time
-     */
-    private String getNextRunTime(String cronExpression, RestResponse artifactoryResponse) {
-        if (StringUtils.isEmpty(cronExpression)) {
-            artifactoryResponse.error("emptyCron");
-        }
-        if (CronUtils.isValid(cronExpression)) {
-            Date nextExecution = CronUtils.getNextExecution(cronExpression);
-            if (nextExecution != null) {
-                return formatDate(nextExecution);
-            } else {
-                artifactoryResponse.error("pastCron");
-            }
-        }
-        artifactoryResponse.error("invalidCron");
-        return null;
-    }
-
-    /**
-     * format date to String
-     *
-     * @param nextRunDate next execution time in date format
-     * @return next execution time as String
-     */
-    private String formatDate(Date nextRunDate) {
-        return nextRunDate.toString();
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/distribution/DistributionUIResponseUtils.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/distribution/DistributionUIResponseUtils.java
deleted file mode 100644
index 4ee8f3b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/distribution/DistributionUIResponseUtils.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.artifactory.ui.rest.service.utils.distribution;
-
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.common.StatusEntryLevel;
-import org.artifactory.rest.common.model.FeedbackMsg;
-import org.artifactory.ui.rest.model.artifacts.distribute.DistributeArtifactStatusModel;
-
-/**
- * @author Dan Feldman
- */
-public class DistributionUIResponseUtils {
-
-    /**
-     * @param distributedItem - build or artifact path that is distributed.
-     */
-    public static DistributeArtifactStatusModel createResponseEntity(String distributedItem, String targetRepo, BasicStatusHolder status) {
-        DistributeArtifactStatusModel model = new DistributeArtifactStatusModel();
-        FeedbackMsg feedback = new FeedbackMsg();
-        if (status == null) {
-            feedback.setError("No status received from distribution operation for path " + distributedItem + " using " +
-                    "distribution repo " + targetRepo + ". Check the logs for more information.");
-        } else {
-            //This signifies async - the service returns an empty status holder after spawning thread.
-            if (status.getEntries().size() == 0) {
-                feedback.setInfo("Distribution of " + distributedItem + " to target repository " + targetRepo + " scheduled successfully.");
-            }
-            if (status.hasErrors()) {
-                feedback.setError("Distribution of " + distributedItem + " to target repository " + targetRepo + " ended with " +
-                        status.getErrors().size() + (status.getErrors().size() == 1 ? " error." : " errors."));
-            }
-            long successfullyDeployed = status.getEntries(StatusEntryLevel.INFO).stream()
-                    .filter(entry -> entry.getMessage().startsWith("Successfully deployed")).count();
-            if (successfullyDeployed > 0) {
-                feedback.setInfo("Distribution of " + distributedItem + " to target repository " + targetRepo + " successfully deployed " +
-                        successfullyDeployed + (successfullyDeployed == 1 ? " artifact." : "artifacts."));
-            }
-            if (status.hasWarnings()) {
-                feedback.setWarn("Distribution of " + distributedItem + " to target repository " + targetRepo + " ended with "
-                        + status.getWarnings().size() + (status.getWarnings().size() == 1 ? " warning." : " warnings."));
-            }
-        }
-        model.setFeedbackMsg(feedback);
-        return model;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/groups/GetGroupPermissionsService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/groups/GetGroupPermissionsService.java
deleted file mode 100644
index d68427a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/groups/GetGroupPermissionsService.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.artifactory.ui.rest.service.utils.groups;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AclService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.security.AceInfo;
-import org.artifactory.security.PermissionTargetInfo;
-import org.artifactory.ui.rest.model.admin.security.group.Group;
-import org.artifactory.ui.rest.model.admin.security.user.UserPermissions;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Chen Keian
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetGroupPermissionsService implements RestService<Group> {
-
-    @Autowired
-    UserGroupService userGroupService;
-
-    @Autowired
-    AclService aclService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest<Group> request, RestResponse response) {
-        Group group = request.getImodel();
-        List<UserPermissions> userPermissionsList = new ArrayList<>();
-        // get group permissions
-        Map<PermissionTargetInfo, AceInfo> userPermissionByPrincipal = aclService.getGroupsPermissions(group.getGroups());
-        userPermissionByPrincipal.forEach((permission, ace) -> {
-            int repoKeysSize = getRepoKeysSize(permission);
-            userPermissionsList.add(new UserPermissions(ace, permission, repoKeysSize));
-        });
-        response.iModelList(userPermissionsList);
-    }
-
-    /**
-     * get the number of repo keys size
-     *
-     * @param permission - permission target
-     * @return
-     */
-    private int getRepoKeysSize(PermissionTargetInfo permission) {
-        if (permission.getRepoKeys().contains("ANY")) {
-            RepositoryService repositoryService = ContextHelper.get().getRepositoryService();
-            return repositoryService.getAllRepoKeys().size();
-        } else if (permission.getRepoKeys().contains("ANY LOCAL")) {
-            RepositoryService repositoryService = ContextHelper.get().getRepositoryService();
-            return repositoryService.getLocalRepoDescriptors().size();
-        } else if (permission.getRepoKeys().contains("ANY REMOTE")) {
-            RepositoryService repositoryService = ContextHelper.get().getRepositoryService();
-            return repositoryService.getCachedRepoDescriptors().size();
-        }
-        return 0;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/licenses/AddArtifactLicense.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/licenses/AddArtifactLicense.java
deleted file mode 100644
index 68e69a2..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/licenses/AddArtifactLicense.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.artifactory.ui.rest.service.utils.licenses;
-
-import org.artifactory.api.properties.PropertiesService;
-import org.artifactory.md.Properties;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import java.util.Set;
-
-/**
- * @author Chen Keinan
- */
-public class AddArtifactLicense implements RestService {
-
-    @Autowired
-    private PropertiesService propsService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String repoKey = request.getQueryParamByKey("repoKey");
-        String path = request.getQueryParamByKey("path");
-        RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-
-        Properties properties = propsService.getProperties(repoPath);
-        Set<String> licenseNames = properties.get("artifactory.licenses");
-
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/licenses/ScanArtifactLicense.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/licenses/ScanArtifactLicense.java
deleted file mode 100644
index c43a81b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/licenses/ScanArtifactLicense.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.artifactory.ui.rest.service.utils.licenses;
-
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-
-/**
- * @author Chen Keinan
- */
-public class ScanArtifactLicense implements RestService {
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/predefinevalues/GetPreDefineValuesService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/predefinevalues/GetPreDefineValuesService.java
deleted file mode 100644
index 5318040..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/predefinevalues/GetPreDefineValuesService.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package org.artifactory.ui.rest.service.utils.predefinevalues;
-
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.descriptor.property.PredefinedValue;
-import org.artifactory.descriptor.property.Property;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.utils.predefinevalues.PreDefineValues;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetPreDefineValuesService implements RestService {
-
-    @Autowired
-    private RepositoryService repoService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String repoKey = request.getQueryParamByKey("repoKey");
-        String path = request.getQueryParamByKey("path");
-        String name = request.getPathParamByKey("name");
-        RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-        PreDefineValues values = new PreDefineValues();
-        Map<String, Property> propertyItemMap = createPropertyItemMap(repoPath);
-        if(!propertyItemMap.isEmpty()) {
-            List<PredefinedValue> predefinedValues = propertyItemMap.get(name).getPredefinedValues();
-            List<String> listOfPredefineValuesAsString = new ArrayList<>();
-            List<String> selectedValues = new ArrayList<>();
-            predefinedValues.forEach(predefinedValue -> {
-                if (predefinedValue.isDefaultValue()) {
-                    selectedValues.add(predefinedValue.getValue());
-                } else {
-                    listOfPredefineValuesAsString.add(predefinedValue.getValue());
-                }
-            });
-            values.setSelectedValues(selectedValues);
-            values.setPredefinedValues(listOfPredefineValuesAsString);
-        }
-        response.iModel(values);
-    }
-
-    /**
-     * create property map by repo path
-     * @param repoPath - repo path
-     * @return map of properties
-     */
-    private Map<String, Property> createPropertyItemMap(RepoPath repoPath) {
-        Map<String, Property> propertyItemMap = new HashMap<>();
-        LocalRepoDescriptor descriptor = repoService.localOrCachedRepoDescriptorByKey(repoPath.getRepoKey());
-        List<PropertySet> propertySets = new ArrayList<>(descriptor.getPropertySets());
-        for (PropertySet propertySet : propertySets) {
-            List<Property> propertyList = propertySet.getProperties();
-            for (Property property : propertyList) {
-                propertyItemMap.put(propertySet.getName()+"."+property.getName(), property);
-            }
-        }
-        return propertyItemMap;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/repoPropertySet/GetRepoPropertySetService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/repoPropertySet/GetRepoPropertySetService.java
deleted file mode 100644
index 8521e63..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/repoPropertySet/GetRepoPropertySetService.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package org.artifactory.ui.rest.service.utils.repoPropertySet;
-
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.descriptor.property.Property;
-import org.artifactory.descriptor.property.PropertySet;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.model.RestModel;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.properties.PropertiesArtifactInfo;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.properties.RepoProperty;
-import org.artifactory.ui.rest.model.artifacts.browse.treebrowser.tabs.properties.RepoPropertySet;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at Component
-public class GetRepoPropertySetService implements RestService {
-
-    @Autowired
-    private RepositoryService repoService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String path = request.getQueryParamByKey("path");
-        String repoKey = request.getQueryParamByKey("repoKey");
-        RepoPath repoPath = InternalRepoPathFactory.create(repoKey, path);
-        List<RestModel> propertyItemList = createPropertyItemMap(repoPath);
-        response.iModelList(propertyItemList);
-    }
-
-    /**
-     * Prepares a list of Property Items to add to the property drop-down component
-     */
-
-    /**
-     * Prepares a list of Property Items to add to the property drop-down component
-     * * @param repoPath - repo path
-     * @return list of properties artifact info
-     */
-    private List<RestModel> createPropertyItemMap(RepoPath repoPath) {
-        List<RestModel> propertyItems = new ArrayList<>();
-        LocalRepoDescriptor descriptor = repoService.localCachedOrDistributionRepoDescriptorByKey(repoPath.getRepoKey());
-        List<PropertySet> propertySets = new ArrayList<>(descriptor.getPropertySets());
-        for (PropertySet propertySet : propertySets) {
-            List<Property> propertyList = propertySet.getProperties();
-            for (Property property : propertyList) {
-                PropertySet repoPropertySet = new RepoPropertySet();
-                repoPropertySet.setName(propertySet.getName());
-                Property repoProperty = new RepoProperty();
-                repoProperty.setName(property.getName());
-                PropertiesArtifactInfo item = new PropertiesArtifactInfo(repoPropertySet, repoProperty);
-                item.setPropertyType(property.getPropertyType().name());
-                propertyItems.add(item);
-            }
-        }
-        return propertyItems;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/repositories/GetAllRepositoriesService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/repositories/GetAllRepositoriesService.java
deleted file mode 100644
index 23aa4f0..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/repositories/GetAllRepositoriesService.java
+++ /dev/null
@@ -1,336 +0,0 @@
-package org.artifactory.ui.rest.service.utils.repositories;
-
-import com.google.common.collect.Lists;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AclService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.*;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.artifactory.ui.rest.model.artifacts.search.packagesearch.criteria.PackageSearchCriteria;
-import org.artifactory.ui.rest.model.utils.repositories.RepoKeyType;
-import org.artifactory.ui.rest.model.utils.repositories.RepositoriesData;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.util.*;
-import java.util.stream.Collectors;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetAllRepositoriesService implements RestService {
-
-    @Autowired
-    AuthorizationService authorizationService;
-    @Autowired
-    AclService aclService;
-
-    @Autowired
-    RepositoryService repoService;
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        Boolean userOnly = Boolean.valueOf(request.getQueryParamByKey("user"));
-        Boolean deploy = Boolean.valueOf(request.getQueryParamByKey("deploy"));
-        Boolean localOnly = Boolean.valueOf(request.getQueryParamByKey("local"));
-        Boolean searchOnly = Boolean.valueOf(request.getQueryParamByKey("search"));
-        Boolean backupOnly = Boolean.valueOf(request.getQueryParamByKey("backup"));
-        Boolean packageSearchOnly = Boolean.valueOf(request.getQueryParamByKey("packageSearch"));
-        Boolean localRemoteOnly = Boolean.valueOf(request.getQueryParamByKey("all"));
-        Boolean permission = Boolean.valueOf(request.getQueryParamByKey("permission"));
-
-        RepositoriesData repositoriesData = new RepositoriesData();
-        // get repo data for search if require
-        if (searchOnly) {
-            searchRepoData(response, repositoriesData);
-        } else if (packageSearchOnly) {
-            packageSearchRepoData(response, repositoriesData);
-        } else if (backupOnly) {
-            repositoriesData.setRepoList(getRepoData(localOnly, true));
-            response.iModel(repositoriesData);
-        } else if (localRemoteOnly) {
-            List<RepoKeyType> allRepositoriesData = getAllRepositoriesData();
-            repositoriesData.setRepoTypesList(allRepositoriesData);
-            response.iModelList(allRepositoriesData);
-        } else if (permission) {
-            List<RepoKeyType> allRepositoriesData = getPermissionRepoData();
-            repositoriesData.setRepoTypesList(allRepositoriesData);
-            response.iModel(repositoriesData);
-        } else if (deploy) {
-            getRepositoriesDataForDeploy(repositoriesData);
-            response.iModel(repositoriesData);
-        } else {
-            /// get repo data for local or user
-            getRepositoriesData(userOnly, localOnly, repositoriesData);
-            response.iModel(repositoriesData);
-        }
-    }
-
-    /**
-     * get repository list for search
-     *
-     * @param artifactoryResponse - encapsulated data related to response
-     * @param repositoriesData    - repository data
-     */
-    private void searchRepoData(RestResponse artifactoryResponse, RepositoriesData repositoriesData) {
-        List<RepoKeyType> orderdRepoKeys = getOrderdRepoKeys();
-        repositoriesData.setRepoTypesList(orderdRepoKeys);
-        artifactoryResponse.iModel(repositoriesData);
-    }
-
-    /**
-     * get repository list for pakcage search
-     *
-     * @param artifactoryResponse - encapsulated data related to response
-     * @param repositoriesData    - repository data
-     */
-    private void packageSearchRepoData(RestResponse artifactoryResponse, RepositoriesData repositoriesData) {
-        List<RepoKeyType> orderdRepoKeys = getPackageSearchRepos();
-        repositoriesData.setRepoTypesList(orderdRepoKeys);
-        artifactoryResponse.iModel(repositoriesData);
-    }
-
-    /**
-     * return repositories data for user / local / all
-     *
-     * @param userOnly  - if true return only user repositories
-     * @param localOnly - if true return only local repositories
-     * @return - list of repositories
-     */
-    private void getRepositoriesData(Boolean userOnly, Boolean localOnly, RepositoriesData repositoriesData) {
-        List<String> repoData;
-        if (userOnly) {
-            repoData = getRepoData(true, false);
-            List<RepoKeyType> deployReposes = new ArrayList<>();
-            repoData.forEach(repoKey -> {
-                Map<String, LocalRepoDescriptor> localRepositoriesMap = centralConfigService.getDescriptor().getLocalRepositoriesMap();
-                LocalRepoDescriptor localRepoDescriptor = localRepositoriesMap.get(repoKey);
-                deployReposes.add(new RepoKeyType(localRepoDescriptor.getType(), repoKey));
-            });
-            if (authorizationService.isAdmin()) {
-                repositoriesData.setRepoTypesList(deployReposes);
-            } else {
-                repositoriesData.setRepoTypesList(getUserRepoForDeploy(deployReposes));
-            }
-        } else {
-            repoData = getRepoData(localOnly, false);
-            repositoriesData.setRepoList(repoData);
-        }
-    }
-
-    /**
-     * return repositories data for deploy (like for user, but include virtual repos with configured default deployment local repo)
-     *
-     * @return - list of repositories
-     */
-    private void getRepositoriesDataForDeploy(RepositoriesData repositoriesData) {
-        List<String> repoData;
-        repoData = getRepoData(true, false);
-        List<String> virtualRepoData;
-        virtualRepoData = getVirtualRepoData();
-
-        List<RepoKeyType> deployReposes = new ArrayList<>();
-        repoData.forEach(repoKey -> {
-            Map<String, LocalRepoDescriptor> localRepositoriesMap = centralConfigService.getDescriptor().getLocalRepositoriesMap();
-            LocalRepoDescriptor localRepoDescriptor = localRepositoriesMap.get(repoKey);
-            RepoKeyType repoKeyType = new RepoKeyType(localRepoDescriptor.getType(), repoKey);
-            RepoLayout layout = localRepoDescriptor.getRepoLayout();
-            if (layout != null) {
-                repoKeyType.setLayoutPattern(layout.getArtifactPathPattern());
-                repoKeyType.setLayoutFolderItegRevRegex(layout.getFolderIntegrationRevisionRegExp());
-                repoKeyType.setLayoutFileItegRevRegex(layout.getFileIntegrationRevisionRegExp());
-            }
-            deployReposes.add(repoKeyType);
-        });
-        virtualRepoData.forEach(repoKey -> {
-            Map<String, VirtualRepoDescriptor> virtualRepositoriesMap = centralConfigService.getDescriptor().getVirtualRepositoriesMap();
-            VirtualRepoDescriptor virtualRepoDescriptor = virtualRepositoriesMap.get(repoKey);
-            if (virtualRepoDescriptor.getDefaultDeploymentRepo() != null)  {
-                RepoKeyType repoKeyType = new RepoKeyType(virtualRepoDescriptor.getType(), repoKey);
-                RepoLayout layout = virtualRepoDescriptor.getRepoLayout();
-                if (layout != null) {
-                    repoKeyType.setLayoutPattern(layout.getArtifactPathPattern());
-                    repoKeyType.setLayoutFolderItegRevRegex(layout.getFolderIntegrationRevisionRegExp());
-                    repoKeyType.setLayoutFileItegRevRegex(layout.getFileIntegrationRevisionRegExp());
-                }
-                deployReposes.add(repoKeyType);
-            }
-        });
-        if (authorizationService.isAdmin()) {
-            repositoriesData.setRepoTypesList(deployReposes);
-        } else {
-            repositoriesData.setRepoTypesList(getUserRepoForDeploy(deployReposes));
-        }
-    }
-
-    /**
-     * return repo data list from config descriptor
-     *
-     * @return repo data list
-     */
-    private List<String> getRepoData(boolean localOnly, boolean includeDistRepos) {
-        List<String> repos = new ArrayList<>();
-        Map<String, LocalRepoDescriptor> localRepoDescriptorMap = centralConfigService.getDescriptor().getLocalRepositoriesMap();
-        // add remote repositories
-        if (!localOnly) {
-            Map<String, RemoteRepoDescriptor> remoteRepoDescriptorMap = centralConfigService.getDescriptor().getRemoteRepositoriesMap();
-            repos.addAll(remoteRepoDescriptorMap.keySet());
-        }
-        if (includeDistRepos) {
-            Map<String, DistributionRepoDescriptor> distRepos = centralConfigService.getDescriptor().getDistributionRepositoriesMap();
-            repos.addAll(distRepos.keySet());
-        }
-        repos.addAll(localRepoDescriptorMap.keySet());
-        return repos;
-    }
-
-    /**
-     * return virtual repo data list from config descriptor
-     *
-     * @return repo data list
-     */
-    private List<String> getVirtualRepoData() {
-        List<String> repos = new ArrayList<>();
-        Map<String, VirtualRepoDescriptor> virtualRepoDescriptorMap = centralConfigService.getDescriptor().getVirtualRepositoriesMap();
-        repos.addAll(virtualRepoDescriptorMap.keySet());
-        return repos;
-    }
-
-    /**
-     * get list of local repository allowed for this user to deploy
-     *
-     * @return - list of repositories
-     */
-    private List<RepoKeyType> getUserRepoForDeploy(List<RepoKeyType> localRepos) {
-        List<RepoKeyType> userAuthorizedRepos = Lists.newArrayList();
-        localRepos.forEach(repoType -> {
-            RepoPath repoPath = InternalRepoPathFactory.create(repoType.getRepoKey(), "");
-            if (!repoType.getRepoKey().endsWith("-cached") && authorizationService.canDeploy(repoPath)) {
-                userAuthorizedRepos.add(repoType);
-            }
-        });
-        return userAuthorizedRepos;
-    }
-
-
-    private List<RepoKeyType> getOrderdRepoKeys() {
-        List<LocalRepoDescriptor> repoSet = Lists.newArrayList();
-        List<LocalRepoDescriptor> localAndCachedRepoDescriptors = repoService.getLocalAndCachedRepoDescriptors();
-        localAndCachedRepoDescriptors.addAll(repoService.getDistributionRepoDescriptors());
-        Collections.sort(localAndCachedRepoDescriptors, new LocalAndCachedDescriptorsComparator());
-        localAndCachedRepoDescriptors.stream()
-                .filter(descriptor -> authorizationService.canRead(InternalRepoPathFactory.repoRootPath(descriptor.getKey())))
-                .forEach(repoSet::add);
-        List<RepoKeyType> repoKeys = Lists.newArrayList();
-        for (LocalRepoDescriptor descriptor : repoSet) {
-            String type;
-            if (descriptor instanceof LocalCacheRepoDescriptor) {
-                type = "remote";
-            } else if (descriptor instanceof DistributionRepoDescriptor) {
-                type = "distribution";
-            } else {
-                type = "local";
-            }
-            repoKeys.add(new RepoKeyType(type, descriptor.getKey()));
-        }
-        return repoKeys;
-    }
-
-    private List<RepoKeyType> getPackageSearchRepos() {
-        List<RepoKeyType> repoKeys = Lists.newArrayList();
-        List<LocalRepoDescriptor> localAndCache = repoService.getLocalAndCachedRepoDescriptors();
-        List<LocalRepoDescriptor> localOnly = repoService.getLocalRepoDescriptors();
-        Collections.sort(localAndCache, new LocalAndCachedDescriptorsComparator());
-        for (PackageSearchCriteria.PackageSearchType type : PackageSearchCriteria.PackageSearchType.values()) {
-            //Get Docker repos only once
-            if (type.equals(PackageSearchCriteria.PackageSearchType.dockerV1)) {
-                continue;
-            }
-            List<LocalRepoDescriptor> repoList = type.isRemoteCachesProps() ? localAndCache : localOnly;
-            repoList.stream()
-                    .filter(descriptor -> descriptor.getType().equals(type.getRepoType()) ||
-                                    (descriptor.getType().isMavenGroup() && type.getRepoType().isMavenGroup())
-                    )
-                    .filter(descriptor ->
-                            authorizationService.canRead(InternalRepoPathFactory.repoRootPath(descriptor.getKey())))
-                    .forEach(repoDescriptor -> {
-                        String localOrRemote = repoDescriptor.isCache() ? "remote" : "local";
-                        if (repoDescriptor.getType().equals(RepoType.Docker)) {
-                            repoKeys.add(new RepoKeyType(localOrRemote, repoDescriptor.getType(),
-                                    repoDescriptor.getKey(), repoDescriptor.getDockerApiVersion()));
-                        } else {
-                            repoKeys.add(new RepoKeyType(localOrRemote, repoDescriptor.getType(),
-                                    repoDescriptor.getKey()));
-                        }
-                    });
-        }
-        return repoKeys;
-    }
-
-    /**
-     * Comparator that compares local and cached repositories according to their type (local or cached local) and then
-     * internally sorting them by their key.
-     */
-    private static class LocalAndCachedDescriptorsComparator implements Comparator<RepoDescriptor> {
-        @Override
-        public int compare(RepoDescriptor o1, RepoDescriptor o2) {
-            if (o1 instanceof LocalCacheRepoDescriptor && !(o2 instanceof LocalCacheRepoDescriptor)) {
-                return 1;
-            } else if (!(o1 instanceof LocalCacheRepoDescriptor) && (o2 instanceof LocalCacheRepoDescriptor)) {
-                return -1;
-            } else {
-                return o1.getKey().toLowerCase().compareTo(o2.getKey().toLowerCase());
-            }
-        }
-    }
-
-    /**
-     * return remote and local repository data
-     *
-     * @return list of repositories repo keys
-     */
-    private List<RepoKeyType> getAllRepositoriesData() {
-        List<RepoKeyType> repos = getLocalRepoKeyTypes();
-        Map<String, RemoteRepoDescriptor> remoteRepoDescriptorMap = centralConfigService.getDescriptor().getRemoteRepositoriesMap();
-        remoteRepoDescriptorMap.keySet().forEach(key -> repos.add(new RepoKeyType("remote", key)));
-        repos.addAll(centralConfigService.getDescriptor().getDistributionRepositoriesMap().keySet().stream()
-                .map(repoKey -> new RepoKeyType("distribution", repoKey))
-                .collect(Collectors.toList()));
-        return repos;
-    }
-
-    private List<RepoKeyType> getPermissionRepoData() {
-        List<RepoKeyType> repos = new ArrayList<>();
-        List<RepoDescriptor> localAndRemoteRepoDescriptors = repoService.getLocalAndRemoteRepoDescriptors();
-        localAndRemoteRepoDescriptors.forEach(reppoDesc -> {
-            if (reppoDesc instanceof RemoteRepoDescriptor) {
-                repos.add(new RepoKeyType("remote", reppoDesc.getKey()));
-            } else {
-                repos.add(new RepoKeyType("local", reppoDesc.getKey()));
-            }
-        });
-        repoService.getDistributionRepoDescriptors().forEach(reppoDesc -> repos.add(new RepoKeyType("distribution", reppoDesc.getKey())));
-        return repos;
-
-    }
-
-    private List<RepoKeyType> getLocalRepoKeyTypes() {
-        List<RepoKeyType> repos = new ArrayList<>();
-        Map<String, LocalRepoDescriptor> localRepoDescriptorMap = centralConfigService.getDescriptor().getLocalRepositoriesMap();
-        localRepoDescriptorMap.values().forEach(desc -> repos.add(new RepoKeyType(desc.getType(), desc.getKey())));
-        return repos;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/setMeUp/SettingsHelper.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/setMeUp/SettingsHelper.java
deleted file mode 100644
index 6cb9d85..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/setMeUp/SettingsHelper.java
+++ /dev/null
@@ -1,155 +0,0 @@
-package org.artifactory.ui.rest.service.utils.setMeUp;
-
-import com.google.common.collect.Lists;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.HttpRepoDescriptor;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-import org.artifactory.repo.InternalRepoPathFactory;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author Lior Hasson
- */
-public class SettingsHelper {
-
-    /**
-     * Returns a list of virtual repositories that a readable by the current user
-     *
-     * @return Readable virtual repository definitions
-     */
-    public static List<RepoDescriptor> getReadableVirtualRepoDescriptors(RepositoryService repositoryService,
-            AuthorizationService authorizationService) {
-
-        List<RepoDescriptor> readableDescriptors = Lists.newLinkedList();
-
-        List<VirtualRepoDescriptor> virtualRepoDescriptors = repositoryService.getVirtualRepoDescriptors();
-
-        readableDescriptors.addAll(virtualRepoDescriptors.stream()
-                        .filter(virtualRepo -> isVirtualRepoReadable(null, virtualRepo, authorizationService)
-                                && !virtualRepo.getKey().equals("repo"))
-                        .collect(Collectors.toList())
-        );
-
-        return readableDescriptors;
-    }
-
-    /**
-     * Returns a list of Remote repositories that a readable by the current user
-     *
-     * @return Readable Remote repository definitions
-     */
-    public static List<RepoDescriptor> getReadableRemoteRepoDescriptors(RepositoryService repositoryService,
-            AuthorizationService authorizationService) {
-
-        List<RepoDescriptor> readableDescriptors = Lists.newLinkedList();
-
-        List<RemoteRepoDescriptor> RemoteRepoDescriptors = repositoryService.getRemoteRepoDescriptors();
-
-        readableDescriptors.addAll(RemoteRepoDescriptors.stream()
-                        .filter(remoteRepo ->
-                                isRemoteRepoReadable(remoteRepo, authorizationService))
-                        .collect(Collectors.toList())
-        );
-
-        return readableDescriptors;
-    }
-
-    /**
-     * Returns a list of Remote repositories that a readable by the current user
-     *
-     * @return Readable Remote repository definitions
-     */
-    public static List<RepoDescriptor> getReadableLocalRepoDescriptors(RepositoryService repositoryService,
-            AuthorizationService authorizationService) {
-
-        List<RepoDescriptor> readableDescriptors = Lists.newLinkedList();
-
-        List<LocalRepoDescriptor> RemoteRepoDescriptors = repositoryService.getLocalRepoDescriptors();
-
-        readableDescriptors.addAll(RemoteRepoDescriptors.stream()
-                        .filter(remoteRepo ->
-                                isLocalRepoReadable(remoteRepo, authorizationService))
-                        .collect(Collectors.toList())
-        );
-
-        return readableDescriptors;
-    }
-
-    /**
-     * Determine if the current user has read permissions on the given virtual
-     *
-     * @param parentVirtualRepo     Parent virtual repo if exists. Null if not
-     * @param virtualRepoDescriptor Virtual repo to test
-     * @return True if is readable. False if not
-     */
-    public static boolean isVirtualRepoReadable(VirtualRepoDescriptor parentVirtualRepo,
-            VirtualRepoDescriptor virtualRepoDescriptor, AuthorizationService authorizationService) {
-        List<RepoDescriptor> aggregatedRepos = virtualRepoDescriptor.getRepositories();
-        for (RepoDescriptor aggregatedRepo : aggregatedRepos) {
-
-            if (validateReadable(parentVirtualRepo, aggregatedRepo, authorizationService)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Determine if the current user has read permissions on the given Remote
-     *
-     * @param remoteRepoDescriptor     Remote repo to test
-     * @return True if is readable. False if not
-     */
-    public static boolean isRemoteRepoReadable(RemoteRepoDescriptor remoteRepoDescriptor,
-            AuthorizationService authorizationService) {
-        if (validateReadable(null, remoteRepoDescriptor, authorizationService)) {
-            return true;
-        }
-
-        return false;
-    }
-
-    /**
-     * Determine if the current user has read permissions on the given Local
-     *
-     * @param localRepoDescriptor   Local repo to test
-     * @return True if is readable. False if not
-     */
-    public static boolean isLocalRepoReadable(LocalRepoDescriptor localRepoDescriptor,
-            AuthorizationService authorizationService) {
-        if (validateReadable(null, localRepoDescriptor, authorizationService)) {
-            return true;
-        }
-
-        return false;
-    }
-
-    public static boolean validateReadable(VirtualRepoDescriptor parentVirtualRepo, RepoDescriptor aggregatedRepo,
-            AuthorizationService authorizationService) {
-        String key = aggregatedRepo.getKey();
-        if (aggregatedRepo instanceof HttpRepoDescriptor && aggregatedRepo.getType().isMavenGroup()) {
-            if (authorizationService.canRead(InternalRepoPathFactory.repoRootPath(key + "-cache"))) {
-                return true;
-            }
-        } else if ((aggregatedRepo instanceof VirtualRepoDescriptor) &&
-                aggregatedRepo.getType().isMavenGroup() &&
-                ((parentVirtualRepo == null) || !aggregatedRepo.equals(parentVirtualRepo))) {
-            VirtualRepoDescriptor virtualRepo = ((VirtualRepoDescriptor) aggregatedRepo);
-            if (isVirtualRepoReadable(virtualRepo, virtualRepo, authorizationService)) {
-                return true;
-            }
-        } else {
-            if (authorizationService.canRead(InternalRepoPathFactory.repoRootPath(key))
-                    && aggregatedRepo.getType().isMavenGroup()) {
-                return true;
-            }
-        }
-        return false;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/validation/GetNameValidatorService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/validation/GetNameValidatorService.java
deleted file mode 100644
index 7a7140a..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/validation/GetNameValidatorService.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.artifactory.ui.rest.service.utils.validation;
-
-import org.artifactory.exception.ValidationException;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * Validations service for root entity names.
- *
- * @author Yossi Shaul
- */
- at Component
- at Scope(BeanDefinition.SCOPE_SINGLETON)
-public class GetNameValidatorService implements RestService {
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String name = request.getQueryParamByKey("name");
-        try {
-            NameValidator.validate(name);
-            response.info("Name validated");
-        } catch (ValidationException e) {
-            response.error(e.getMessage());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/validation/GetTimeFormatValidatorService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/validation/GetTimeFormatValidatorService.java
deleted file mode 100644
index 8cd3205..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/validation/GetTimeFormatValidatorService.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.ui.rest.service.utils.validation;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import java.text.SimpleDateFormat;
-
-/**
- * Validates input according to {@link SimpleDateFormat} time format.
- *
- * @author Yossi Shaul
- */
- at Component
- at Scope(BeanDefinition.SCOPE_SINGLETON)
-public class GetTimeFormatValidatorService implements RestService {
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String dateFormat = request.getQueryParamByKey("dateformat");
-        if (StringUtils.isEmpty(dateFormat)) {
-            response.error("Please enter a valid date format");
-        } else {
-            try {
-                new SimpleDateFormat(dateFormat);
-                response.info("Date format validated");
-            } catch (IllegalArgumentException e) {
-                response.error("Please enter a valid date format");
-            }
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/validation/GetUniqueXmlIdValidatorService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/validation/GetUniqueXmlIdValidatorService.java
deleted file mode 100644
index bfeba18..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/validation/GetUniqueXmlIdValidatorService.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.ui.rest.service.utils.validation;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.exception.ValidationException;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * Validations service for unique central config xml name.
- *
- * @author Yossi Shaul
- * @see UniqueXmlIdValidator
- */
- at Component
- at Scope(BeanDefinition.SCOPE_SINGLETON)
-public class GetUniqueXmlIdValidatorService implements RestService {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String id = request.getQueryParamByKey("id");
-        try {
-            new UniqueXmlIdValidator(centralConfigService.getMutableDescriptor()).validate(id);
-            response.info("Unique id validated");
-        } catch (ValidationException e) {
-            response.error(e.getMessage());
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/validation/GetXsdNCNameValidatorService.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/validation/GetXsdNCNameValidatorService.java
deleted file mode 100644
index ea44b59..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/validation/GetXsdNCNameValidatorService.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.artifactory.ui.rest.service.utils.validation;
-
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.rest.common.service.RestService;
-import org.jdom2.Verifier;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * Checks if a string is a valid xsd <a href="http://www.w3.org/TR/REC-xml-names/#NT-NCName"/>NCName</a> string.
- *
- * @author Yossi Shaul
- */
- at Component
- at Scope(BeanDefinition.SCOPE_SINGLETON)
-public class GetXsdNCNameValidatorService implements RestService {
-
-    @Override
-    public void execute(ArtifactoryRestRequest request, RestResponse response) {
-        String name = request.getQueryParamByKey("xmlName");
-        String result = Verifier.checkXMLName(name);
-        if (result != null) {
-            response.error("Invalid XML name");
-        } else {
-            // successful validation
-            response.info("XML name validated");
-        }
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/validation/NameValidator.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/validation/NameValidator.java
deleted file mode 100644
index 7a46efc..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/validation/NameValidator.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.artifactory.ui.rest.service.utils.validation;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.exception.ValidationException;
-
-/**
- * Generic name validator for root entity names (repos, descriptor keys etc.).
- *
- * @author Yossi Shaul
- */
-public final class NameValidator {
-    private static final char[] forbiddenChars = {'/', '\\', ':', '|', '?', '*', '"', '<', '>'};
-
-    public static void validate(String name) throws ValidationException {
-        if (StringUtils.isBlank(name)) {
-            throw new ValidationException("Name cannot be blank");
-        }
-
-        if (name.equals(".") || name.equals("..") || name.equals("&")) {
-            throw new ValidationException("Name cannot be empty link: '" + name + "'");
-        }
-
-        char[] nameChars = name.toCharArray();
-        for (int i = 0; i < nameChars.length; i++) {
-            char c = nameChars[i];
-            for (char fc : forbiddenChars) {
-                if (c == fc) {
-                    throw new ValidationException("Illegal name character: '" + c + "' at index " + i + ": " + name);
-                }
-            }
-        }
-    }
-
-    /**
-     * @return ForbiddenChars
-     */
-    public static char[] getForbiddenChars() {
-        return forbiddenChars;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/validation/UniqueXmlIdValidator.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/validation/UniqueXmlIdValidator.java
deleted file mode 100644
index 4d12e04..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/validation/UniqueXmlIdValidator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.ui.rest.service.utils.validation;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.exception.ValidationException;
-
-/**
- * Checks if an xml id is unique in the central config descriptor.
- *
- * @author Yossi Shaul
- */
-public final class UniqueXmlIdValidator {
-    private MutableCentralConfigDescriptor centralConfig;
-
-    public UniqueXmlIdValidator(MutableCentralConfigDescriptor centralConfig) {
-        this.centralConfig = centralConfig;
-    }
-
-    public void validate(String id) throws ValidationException {
-        if (StringUtils.isBlank(id)) {
-            throw new ValidationException("ID cannot be empty");
-        }
-        if (!centralConfig.isKeyAvailable(id)) {
-            throw new ValidationException(String.format("The ID '%s' is already used.", id));
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/validation/ValidationsServiceFactory.java b/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/validation/ValidationsServiceFactory.java
deleted file mode 100644
index df87573..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/rest/service/utils/validation/ValidationsServiceFactory.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.artifactory.ui.rest.service.utils.validation;
-
-import org.springframework.beans.factory.annotation.Lookup;
-
-/**
- * Factory for UI validator services.
- *
- * @author Yossi Shaul
- */
-public abstract class ValidationsServiceFactory {
-
-    @Lookup
-    public abstract GetTimeFormatValidatorService getTimeFormatValidatorService();
-
-    @Lookup
-    public abstract GetNameValidatorService  getNameValidatorService();
-
-    @Lookup
-    public abstract GetXsdNCNameValidatorService getXmlNameValidatorService();
-
-    @Lookup
-    public abstract GetUniqueXmlIdValidatorService getUniqueXmlIdValidatorService();
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/utils/ActionUtils.java b/web/rest-ui/src/main/java/org/artifactory/ui/utils/ActionUtils.java
deleted file mode 100644
index 45989f3..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/utils/ActionUtils.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.artifactory.ui.utils;
-
-import org.artifactory.util.HttpUtils;
-
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * @author Chen Keinan
- */
-public class ActionUtils {
-
-
-    public static String getDownloadLink(HttpServletRequest request, String repoKey, String repoPath) {
-        return HttpUtils.getServletContextUrl(request) + "/" + repoKey + "/" + repoPath;
-    }
-}
\ No newline at end of file
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/utils/BrowseUtils.java b/web/rest-ui/src/main/java/org/artifactory/ui/utils/BrowseUtils.java
deleted file mode 100644
index f15b649..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/utils/BrowseUtils.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.artifactory.ui.utils;
-
-import org.artifactory.api.repo.BaseBrowsableItem;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author Yoav Luft
- * @author Yossi Shaul
- */
-public class BrowseUtils {
-
-    /**
-     * @return A filtered list without the checksum items (md5 and sha1).
-     */
-    public static List<BaseBrowsableItem> filterChecksums(Collection<BaseBrowsableItem> items) {
-        List<BaseBrowsableItem> filtered = items.stream().filter(i -> i != null && i.getName() != null &&
-                !i.getName().endsWith(".sha1") && !i.getName().endsWith(".sha1"))
-                .collect(Collectors.toList());
-        return filtered;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/utils/DateUtils.java b/web/rest-ui/src/main/java/org/artifactory/ui/utils/DateUtils.java
deleted file mode 100644
index 9148a30..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/utils/DateUtils.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package org.artifactory.ui.utils;
-
-import org.jfrog.build.api.Build;
-
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-/**
- * @author Chen Keinan
- */
-public class DateUtils {
-
-
-    /**
-     * return build duration in human
-     * @param durationMill - build duration in mill
-     * @return duration in human
-     */
-    public static String getDuration(long durationMill){
-        int minutes = (int) ((durationMill / (1000*60)) % 60);
-        int hours   = (int) ((durationMill / (1000*60*60)) % 24);
-
-        if (hours > 0){
-            BigDecimal duration = new BigDecimal(durationMill / (1000.0*60.0*60.0)).setScale(1, RoundingMode.UP);
-            return duration.toString()+" hours";
-        }
-        else if (minutes > 0 ) {
-            BigDecimal duration = new BigDecimal(durationMill / (1000.0*60.0)).setScale(1, RoundingMode.UP);
-            return  duration.toString() + " minutes";
-        }
-        else {
-            BigDecimal duration = new BigDecimal (durationMill/1000.0).setScale(1,RoundingMode.UP);
-             return  duration.toString() + " seconds";
-        }
-    }
-
-    /**
-     * format Build date
-     * @param time - long date
-     * @return
-     * @throws ParseException
-     */
-    public static String formatBuildDate(long time) throws ParseException {
-        Date date = new Date(time);
-        SimpleDateFormat df2 = new SimpleDateFormat(Build.STARTED_FORMAT);
-        String dateText = df2.format(date);
-          return dateText;
-    }
-
-    /**
-     * build date in string format to long
-     */
-    public static long toBuildDate(String date) throws ParseException {
-        SimpleDateFormat df2 = new SimpleDateFormat(Build.STARTED_FORMAT);
-        Date parse = df2.parse(date);
-        return parse.getTime();
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/utils/ModelDbMap.java b/web/rest-ui/src/main/java/org/artifactory/ui/utils/ModelDbMap.java
deleted file mode 100644
index 9c4fc46..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/utils/ModelDbMap.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.artifactory.ui.utils;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author Chen Keinan
- */
-public class ModelDbMap {
-
-    public static  Map<String,String> getBuildsMap(){
-         Map<String,String> propBuildsFieldMap = new HashMap<>();
-        propBuildsFieldMap.put("buildName", "build_name");
-        propBuildsFieldMap.put("lastBuildTime", "build_time  ");
-            propBuildsFieldMap.put("buildNumber","build_number");
-            propBuildsFieldMap.put("status","status");
-        return propBuildsFieldMap;
-    }
-
-    public static  Map<String,String> getModuleMap(){
-        Map<String,String> propBuildsFieldMap = new HashMap<>();
-        propBuildsFieldMap.put("moduleId","module_name_id");
-        propBuildsFieldMap.put("numOfArtifacts","num_of_art");
-        propBuildsFieldMap.put("numOfDependencies","num_of_dep");
-         return propBuildsFieldMap;
-    }
-
-    public static Map<String, String> getBuildProps() {
-        Map<String, String> propBuildsFieldMap = new HashMap<>();
-        propBuildsFieldMap.put("key", "propsKey");
-        propBuildsFieldMap.put("value", "propsValue");
-        return propBuildsFieldMap;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/utils/MultiPartUtils.java b/web/rest-ui/src/main/java/org/artifactory/ui/utils/MultiPartUtils.java
deleted file mode 100644
index 45af63b..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/utils/MultiPartUtils.java
+++ /dev/null
@@ -1,188 +0,0 @@
-package org.artifactory.ui.utils;
-
-import com.sun.jersey.multipart.FormDataBodyPart;
-import com.sun.jersey.multipart.FormDataMultiPart;
-import org.apache.commons.io.IOUtils;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.io.FileUtils;
-import org.artifactory.rest.common.service.RestResponse;
-import org.artifactory.ui.exception.BadRequestException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.*;
-import java.net.URLDecoder;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-
-/**
- * @author Chen Keinan
- */
-public class MultiPartUtils {
-    private static final Logger log = LoggerFactory.getLogger(MultiPartUtils.class);
-
-    public static final int DEFAULT_BUFF_SIZE = 8192;
-
-    /**
-     * fetch file data from request and save it to temp folder
-     *
-     * @param uploadDir - temp folder
-     * @param fileNames
-     */
-    public static void saveFileDataToTemp(CentralConfigService centralConfigService,
-            FormDataMultiPart formDataMultiPart, String uploadDir, List<String> fileNames, boolean isUnique) {
-        int fileUploadMaxSizeMb = centralConfigService.getMutableDescriptor().getFileUploadMaxSizeMb();
-        // get uploaded file map
-        Map<String, List<FormDataBodyPart>> fields = formDataMultiPart.getFields();
-        long sizeInBytes = getContentLengthFromMultiPart(formDataMultiPart);
-        fields.forEach((name, dataBody) -> {
-            List<FormDataBodyPart> formDataBodyParts = fields.get(name);
-            formDataBodyParts.forEach(formDataBodyPart -> {
-                // get file name and data
-                InputStream inputStream = formDataBodyPart.getEntityAs(InputStream.class);
-                long sizeInMb = FileUtils.bytesToMB(sizeInBytes);
-                if (sizeInMb > fileUploadMaxSizeMb && fileUploadMaxSizeMb > 0) {
-                    throw new BadRequestException("Uploaded file size is bigger than " + fileUploadMaxSizeMb + "MB");
-                }
-                String fileName = formDataBodyPart.getContentDisposition().getFileName();
-                try {
-                    fileName = URLDecoder.decode(fileName, "UTF-8");
-                    if (isUnique) {
-                        fileName = UUID.randomUUID().toString() + "_" + fileName;
-                    }
-                    String fileLocation = uploadDir + File.separator + fileName;
-                    FileUtils.copyInputStreamToFile(inputStream, new File(fileLocation));
-                    fileNames.add(fileName);
-                } catch (UnsupportedEncodingException e) {
-                    log.error(e.getMessage());
-                }
-            });
-        });
-    }
-
-    /**
-     * get content length from multi part
-     *
-     * @param formDataMultiPart - form data multi part
-     * @return - content length in bytes
-     */
-    private static long getContentLengthFromMultiPart(FormDataMultiPart formDataMultiPart) {
-        return Long.parseLong(String.valueOf(formDataMultiPart.getHeaders().get("Content-Length").get(0)));
-    }
-
-
-    /**
-     * fetch file data from request and save it to temp folder
-     *
-     * @param uploadDir - temp folder
-     * @param fileNames
-     */
-
-
-    /**
-     * save file to folder on server
-     * @param centralConfigService - central config service
-     * @param formDataMultiPart - multi part  - file content
-     * @param uploadDir - upload dir
-     * @param fileName - file name
-     */
-    public static void saveSpecificFile(CentralConfigService centralConfigService,
-                                          FormDataMultiPart formDataMultiPart, String uploadDir, String fileName) {
-        int fileUploadMaxSizeMb = centralConfigService.getMutableDescriptor().getFileUploadMaxSizeMb();
-        // get uploaded file map
-        Map<String, List<FormDataBodyPart>> fields = formDataMultiPart.getFields();
-        fields.forEach((name, dataBody) -> {
-            List<FormDataBodyPart> formDataBodyParts = fields.get(name);
-                // get file name and data
-                byte[] fileAsBytes = formDataBodyParts.get(0).getValueAs(byte[].class);
-                if (FileUtils.bytesToMeg(fileAsBytes.length) > fileUploadMaxSizeMb && fileUploadMaxSizeMb > 0) {
-                    throw new BadRequestException("Uploaded file size is bigger than :" + fileUploadMaxSizeMb);
-                }
-                String fileLocation = uploadDir + File.separator + fileName;
-                FileUtils.writeFile(fileLocation, fileAsBytes);
-        });
-    }
-
-    /**
-     * create temp folder if not exist
-     * @param uploadDir - temp directory
-     */
-    public static void createTempFolderIfNotExist(String uploadDir) {
-        try {
-            org.apache.commons.io.FileUtils.forceMkdir(new File(uploadDir));
-        } catch (IOException e) {
-            throw new  RuntimeException(e);
-        }
-    }
-
-    /**
-     * save extracted file to temp folder
-     * @param uploadedFile - uploaded file
-     * @param artifactoryResponse - encapsulate data require to response
-     */
-    public static void saveUploadFileAsExtracted(File uploadedFile, RestResponse artifactoryResponse) throws Exception {
-        ZipInputStream zipinputstream = null;
-        FileOutputStream fos = null;
-        File destFolder;
-        try {
-            zipinputstream = new ZipInputStream(new FileInputStream(uploadedFile));
-            ArtifactoryHome artifactoryHome = ContextHelper.get().getArtifactoryHome();
-            destFolder = new File(artifactoryHome.getTempUploadDir(), uploadedFile.getName() + "_extract");
-            //  org.apache.commons.io.FileUtils.deleteDirectory(destFolder);
-            byte[] buf = new byte[MultiPartUtils.DEFAULT_BUFF_SIZE];
-            ZipEntry zipentry;
-            zipentry = zipinputstream.getNextEntry();
-            while (zipentry != null) {
-                //for each entry to be extracted
-                String entryName = zipentry.getName();
-                File destFile = new File(destFolder, entryName);
-
-                if (zipentry.isDirectory()) {
-                    if (!destFile.exists()) {
-                        if (!destFile.mkdirs()) {
-                            artifactoryResponse.error("Cannot create directory " + destFolder);
-                            return;
-                        }
-                    }
-                } else {
-                    fos = new FileOutputStream(destFile);
-                    int n;
-                    while ((n = zipinputstream.read(buf, 0, MultiPartUtils.DEFAULT_BUFF_SIZE)) > -1) {
-                        fos.write(buf, 0, n);
-                    }
-                    fos.close();
-                }
-                zipinputstream.closeEntry();
-                zipentry = zipinputstream.getNextEntry();
-            }
-        } catch (Exception e) {
-            String errorMessage = "Error during import of " + uploadedFile.getName();
-            artifactoryResponse.error(errorMessage);
-            log.error(errorMessage, e);
-            throw new Exception(errorMessage);
-        } finally {
-            IOUtils.closeQuietly(fos);
-            IOUtils.closeQuietly(zipinputstream);
-            org.apache.commons.io.FileUtils.deleteQuietly(uploadedFile);
-        }
-    }
-
-    /**
-     * save snippet to temp folder
-     * @param snippet - snippet
-     * @return - saved snippet name
-     */
-    public static String saveSettingToTempFolder(String snippet){
-        String uploadDir = ContextHelper.get().getArtifactoryHome().getTempUploadDir().getAbsolutePath();
-        InputStream inputStream = new ByteArrayInputStream(snippet.getBytes());
-        String settingName = "settings" + "_" + UUID.randomUUID().toString();
-        File settingFile = new File(uploadDir, settingName);
-        FileUtils.copyInputStreamToFile(inputStream,settingFile);
-        return settingName;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/utils/RegExUtils.java b/web/rest-ui/src/main/java/org/artifactory/ui/utils/RegExUtils.java
deleted file mode 100644
index 556821e..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/utils/RegExUtils.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.artifactory.ui.utils;
-
-import java.util.regex.Pattern;
-
-/**
- * @author Chen Keinan
- */
-public class RegExUtils {
-    private static final Pattern GIT_URL = Pattern.compile(
-            "(?:https?:\\/\\/|git(?::\\/\\/|@))(gist.github.com|github.com)[:\\/](.*?)(?:.git)?$");
-
-    public static final Pattern LOCAL_REPO_REINDEX_PATTERN = Pattern.compile("Gems|Npm|Bower|CocoaPods|NuGet|Debian|Opkg|YUM|Pypi");
-    public static final Pattern REMOTE_REPO_REINDEX_PATTERN = Pattern.compile("Bower|NuGet");
-    public static final Pattern VIRTUAL_REPO_REINDEX_PATTERN = Pattern.compile("Gems|Npm|Bower|NuGet");
-
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/utils/RequestUtils.java b/web/rest-ui/src/main/java/org/artifactory/ui/utils/RequestUtils.java
deleted file mode 100644
index f782a7c..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/utils/RequestUtils.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.artifactory.ui.utils;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.search.SavedSearchResults;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.service.ArtifactoryRestRequest;
-import org.artifactory.security.ArtifactoryPermission;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author Chen keinan
- */
-public class RequestUtils {
-
-    public static final String REPO_KEY_PARAM = "repoKey";
-    public static final String PATH_PARAM = "path";
-
-    /**
-     * return request headers map
-     *
-     * @param request - http servlet request
-     * @return - map of request headers
-     */
-    public static Map<String, String> getHeadersMap(HttpServletRequest request) {
-        Map<String, String> map = new HashMap<>();
-        if (request != null) {
-            Enumeration headerNames = request.getHeaderNames();
-            while (headerNames.hasMoreElements()) {
-                String headerName = (String) headerNames.nextElement();
-                map.put(headerName.toUpperCase(), request.getHeader(headerName));
-            }
-        }
-        return map;
-    }
-
-    public static RepoPath getPathFromRequest(ArtifactoryRestRequest request) {
-        return InternalRepoPathFactory.create(request.getQueryParamByKey(REPO_KEY_PARAM),
-                request.getQueryParamByKey(PATH_PARAM));
-    }
-
-    public static String getRepoKeyFromRequest(ArtifactoryRestRequest request) {
-        return request.getQueryParamByKey(REPO_KEY_PARAM);
-    }
-
-    public static void setResultsToRequest(SavedSearchResults savedSearchResults, HttpServletRequest request) {
-        AuthorizationService authService = ContextHelper.get().getAuthorizationService();
-        HttpSession session = request.getSession(false);
-        if (session == null) {
-            session = request.getSession(true);
-        }
-        session.setAttribute(savedSearchResults.getName(), savedSearchResults);
-    }
-
-    /**
-     * @param name    - save search result
-     * @param request - http servlet request
-     * @return - search result
-     */
-    public static SavedSearchResults getResultsFromRequest(String name, HttpServletRequest request) {
-        AuthorizationService authService = ContextHelper.get().getAuthorizationService();
-        HttpSession session = request.getSession(false);
-        if (session == null) {
-            return null;
-        }
-        return (SavedSearchResults) session.getAttribute(name);
-    }
-
-    /**
-     * @param name    - save search result
-     * @param request - http servlet request
-     * @return - search result
-     */
-    public static void removeResultsToRequest(String name, HttpServletRequest request) throws Exception {
-        AuthorizationService authService = ContextHelper.get().getAuthorizationService();
-        HttpSession session = request.getSession(false);
-        if (session == null) {
-            throw new Exception("no search result to remove");
-        }
-        session.removeAttribute(name);
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/utils/TreeUtils.java b/web/rest-ui/src/main/java/org/artifactory/ui/utils/TreeUtils.java
deleted file mode 100644
index 550722d..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/utils/TreeUtils.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.artifactory.ui.utils;
-
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.SnapshotVersionBehavior;
-
-import static org.artifactory.mime.MavenNaming.isNonUniqueSnapshot;
-import static org.artifactory.mime.MavenNaming.isUniqueSnapshot;
-
-/**
- * @author Noam Y. Tenne
- */
-public class TreeUtils {
-
-    /**
-     * Indicates whether a link to the tree item of the deployed artifact should be provided. Links should be
-     * provided if deploying a snapshot file to repository with different snapshot version policy.
-     *
-     * @param repo
-     * @param artifactPath The artifact deploy path
-     * @return True if should provide the link
-     */
-    public static boolean shouldProvideTreeLink(LocalRepoDescriptor repo, String artifactPath) {
-        SnapshotVersionBehavior repoSnapshotBehavior = repo.getSnapshotVersionBehavior();
-
-        boolean uniqueToNonUnique = isUniqueSnapshot(artifactPath)
-                && SnapshotVersionBehavior.NONUNIQUE.equals(repoSnapshotBehavior);
-
-        boolean nonUniqueToNonUnique = isNonUniqueSnapshot(artifactPath)
-                && SnapshotVersionBehavior.UNIQUE.equals(repoSnapshotBehavior);
-
-        return !uniqueToNonUnique && !nonUniqueToNonUnique;
-    }
-}
diff --git a/web/rest-ui/src/main/java/org/artifactory/ui/utils/UnitUtils.java b/web/rest-ui/src/main/java/org/artifactory/ui/utils/UnitUtils.java
deleted file mode 100644
index 33f8a69..0000000
--- a/web/rest-ui/src/main/java/org/artifactory/ui/utils/UnitUtils.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package org.artifactory.ui.utils;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.maven.model.Model;
-import org.artifactory.api.artifact.ArtifactInfo;
-import org.artifactory.api.artifact.DebianArtifactInfo;
-import org.artifactory.api.artifact.UnitInfo;
-import org.artifactory.api.artifact.VagrantArtifactInfo;
-import org.artifactory.api.maven.MavenArtifactInfo;
-import org.artifactory.api.maven.MavenService;
-import org.artifactory.maven.MavenModelUtils;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.ui.rest.model.artifacts.deploy.UploadArtifactInfo;
-import org.artifactory.util.PathUtils;
-import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.*;
-
-/**
- * @author Chen Keinan
- */
-public class UnitUtils {
-
-    private static final Logger log = LoggerFactory.getLogger(UnitUtils.class);
-
-    /**
-     * get maven artifact info from jar
-     *
-     * @param pomFromJar - pom content
-     * @param file  - file
-     * @return maven artifact info
-     */
-    public static UnitInfo getMavenArtifactInfo(File file, String pomFromJar) {
-        if (pomFromJar == null) {
-            if (file.getName().endsWith(".jar")) {
-                return MavenModelUtils.artifactInfoFromFile(file);
-            } else {
-                return null;
-            }
-        }
-        MavenArtifactInfo mavenArtifactInfo = null;
-        if (StringUtils.isNotBlank(pomFromJar)) {
-            InputStream pomInputStream = IOUtils.toInputStream(pomFromJar);
-            try {
-                mavenArtifactInfo = MavenModelUtils.mavenModelToArtifactInfo(pomInputStream);
-            } catch (IOException | XmlPullParserException e) {
-                log.error(e.toString());
-            }
-            if (mavenArtifactInfo != null) {
-                mavenArtifactInfo.setType(PathUtils.getExtension(file.getName()));
-                return mavenArtifactInfo;
-            }
-        }
-        return null;
-    }
-
-    public static String getPomContent(File file, MavenArtifactInfo mavenArtifactInfo) {
-        String pom = MavenModelUtils.getPomFileAsStringFromJar(file);
-        if(StringUtils.isBlank(pom)){
-            Model mavenModel = MavenModelUtils.toMavenModel(mavenArtifactInfo);
-            pom = MavenModelUtils.mavenModelToString(mavenModel);
-        }
-
-        return pom;
-    }
-
-    /**
-     * return unit info , 1st check if maven artifact info , if not return basic Artifact info
-     *
-     * @param file - current file
-     * @param uploadArtifactInfo -
-     * @param mavenService -
-     * @return artifact info
-     */
-    public static UploadArtifactInfo getUnitInfo(File file, UploadArtifactInfo uploadArtifactInfo,
-            MavenService mavenService) {
-        UnitInfo artifactInfo = null;
-        uploadArtifactInfo.cleanData();
-        if (file.getName().endsWith(".pom")) {
-            // TODO: [by dan] this could show more info (license etc.) - need to fix this
-            MavenArtifactInfo pomInfo = getArtifactInfoFromPom(file, true);
-            String pomFromPom = UnitUtils.getPomContent(file, pomInfo);
-            uploadArtifactInfo.setUnitConfigFileContent(pomFromPom);
-            artifactInfo = pomInfo;
-        }
-        if (file.getName().endsWith(".deb")) {
-            artifactInfo = new DebianArtifactInfo(file.getName());
-        }
-        if (file.getName().endsWith(".box")) {
-            artifactInfo = new VagrantArtifactInfo(file.getName());
-        }
-        //if Maven
-        if (NamingUtils.isJarVariant(file.getName())) {
-            MavenArtifactInfo mavenArtifactInfo = mavenService.getMavenArtifactInfo(file);
-            String pomFromJar = UnitUtils.getPomContent(file, mavenArtifactInfo);
-            uploadArtifactInfo.setUnitConfigFileContent(pomFromJar);
-            artifactInfo = getMavenArtifactInfo(file, pomFromJar);
-        }
-
-        if(artifactInfo == null){
-            artifactInfo = new ArtifactInfo(file.getName());
-        }
-
-        uploadArtifactInfo.setUnitInfo(artifactInfo);
-
-        return uploadArtifactInfo;
-    }
-
-    /**
-     * get artifact info from pom
-     *
-     * @param file - current file
-     * @return artifact info
-     */
-    private static MavenArtifactInfo getArtifactInfoFromPom(File file, boolean isPom) {
-        MavenArtifactInfo mavenArtifactInfo = null;
-        try {
-            InputStream pomInputStream = new FileInputStream(file);
-            mavenArtifactInfo = MavenModelUtils.mavenModelToArtifactInfo(pomInputStream);
-            if (isPom) {
-                mavenArtifactInfo.setType("pom");
-            }
-        } catch (FileNotFoundException | XmlPullParserException e) {
-            log.error(e.toString());
-        } catch (IOException e) {
-            log.error(e.toString());
-        }
-        return mavenArtifactInfo;
-    }
-}
diff --git a/web/rest-ui/src/test/java/org/artifactory/ui/rest/common/DUMMY.TXT b/web/rest-ui/src/test/java/org/artifactory/ui/rest/common/DUMMY.TXT
deleted file mode 100644
index 938fcef..0000000
--- a/web/rest-ui/src/test/java/org/artifactory/ui/rest/common/DUMMY.TXT
+++ /dev/null
@@ -1 +0,0 @@
-Dummy file for the source plugin to work
\ No newline at end of file
diff --git a/web/rest-ui/src/test/java/org/artifactory/ui/rest/model/artifacts/deploy/UploadArtifactInfoTest.java b/web/rest-ui/src/test/java/org/artifactory/ui/rest/model/artifacts/deploy/UploadArtifactInfoTest.java
deleted file mode 100644
index 56081df..0000000
--- a/web/rest-ui/src/test/java/org/artifactory/ui/rest/model/artifacts/deploy/UploadArtifactInfoTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.artifactory.ui.rest.model.artifacts.deploy;
-
-import org.springframework.test.util.ReflectionTestUtils;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Unit tests for {@link UploadArtifactInfo}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class UploadArtifactInfoTest {
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void failSetFileNameWithRelativePath() {
-        new UploadArtifactInfo().setFileName("../hack");
-    }
-
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void failGetFileNameWithRelativePath() throws Exception {
-        UploadArtifactInfo i = new UploadArtifactInfo();
-        ReflectionTestUtils.setField(i, "fileName", "../hack");
-        i.getFileName(); // should throw IllegalArgumentException
-    }
-
-    public void validSetGetFileName() {
-        UploadArtifactInfo i = new UploadArtifactInfo();
-        i.setFileName("ok");
-        assertEquals(i.getFileName(), "ok");
-    }
-}
\ No newline at end of file
diff --git a/web/rest/pom.xml b/web/rest/pom.xml
deleted file mode 100644
index 4f640b8..0000000
--- a/web/rest/pom.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0          http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>artifactory-rest</artifactId>
-    <packaging>jar</packaging>
-    <name>Artifactory REST API</name>
-
-    <parent>
-        <artifactId>artifactory-web-parent</artifactId>
-        <groupId>org.artifactory</groupId>
-        <version>4.8.0</version>
-    </parent>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-rest-common</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.sun.jersey</groupId>
-            <artifactId>jersey-server</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-beans</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-context</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.sun.jersey.contribs</groupId>
-            <artifactId>jersey-spring</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.sun.jersey.contribs</groupId>
-            <artifactId>jersey-multipart</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpclient</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>javax.annotation</groupId>
-            <artifactId>jsr250-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.easymock</groupId>
-            <artifactId>easymock</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.easytesting</groupId>
-            <artifactId>fest-assert</artifactId>
-        </dependency>
-    </dependencies>
-</project>
diff --git a/web/rest/src/main/java/org/artifactory/addon/rest/AuthorizationRestException.java b/web/rest/src/main/java/org/artifactory/addon/rest/AuthorizationRestException.java
deleted file mode 100644
index ae7e54b..0000000
--- a/web/rest/src/main/java/org/artifactory/addon/rest/AuthorizationRestException.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.rest;
-
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.Response;
-
-/**
- * Authorization exception (403 Forbidden) for REST API usage
- * <p/>
- * <strong>NOTE!</strong> Do not attempt to set an entity since {@link org.artifactory.rest.common.exception.ArtifactoryRestExceptionMapper}
- * will not intercept it for manipulating the response status.
- * Jersey exception mappers only intercept exceptions without an entity in them.
- *
- * @author Shay Yaakov
- */
-public class AuthorizationRestException extends WebApplicationException {
-
-    public AuthorizationRestException() {
-        super(Response.status(Response.Status.FORBIDDEN).build());
-    }
-
-    public AuthorizationRestException(String message) {
-        super(Response.status(Response.Status.FORBIDDEN).entity(message).build());
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/addon/rest/MissingRestAddonException.java b/web/rest/src/main/java/org/artifactory/addon/rest/MissingRestAddonException.java
deleted file mode 100644
index 2eb1642..0000000
--- a/web/rest/src/main/java/org/artifactory/addon/rest/MissingRestAddonException.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.rest;
-
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Yoav Landman
- */
-public class MissingRestAddonException extends WebApplicationException {
-
-    private static final String MESSAGE = "This REST API is available only in Artifactory Pro (see: " +
-            "http://www.jfrog.com/addons.php). If you are already running Artifactory Pro please make " +
-            "sure your server is activated with a valid license key.\n";
-
-    public MissingRestAddonException() {
-        super(Response.status(Response.Status.BAD_REQUEST).entity(MESSAGE).type(MediaType.TEXT_PLAIN).build());
-    }
-
-    @Override
-    public String getMessage() {
-        return MESSAGE;
-    }
-
-    @Override
-    public String getLocalizedMessage() {
-        return MESSAGE;
-    }
-}
\ No newline at end of file
diff --git a/web/rest/src/main/java/org/artifactory/addon/rest/RestAddon.java b/web/rest/src/main/java/org/artifactory/addon/rest/RestAddon.java
deleted file mode 100644
index f12eef4..0000000
--- a/web/rest/src/main/java/org/artifactory/addon/rest/RestAddon.java
+++ /dev/null
@@ -1,404 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.rest;
-
-import com.sun.istack.internal.NotNull;
-import org.artifactory.addon.Addon;
-import org.artifactory.addon.license.LicenseStatus;
-import org.artifactory.addon.plugin.ResponseCtx;
-import org.artifactory.api.archive.ArchiveType;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.repo.Async;
-import org.artifactory.api.repo.exception.BlackedOutException;
-import org.artifactory.api.rest.artifact.ItemPermissions;
-import org.artifactory.api.rest.artifact.PromotionResult;
-import org.artifactory.api.rest.build.artifacts.BuildArtifactsRequest;
-import org.artifactory.api.rest.replication.ReplicationRequest;
-import org.artifactory.api.rest.search.result.ArtifactVersionsResult;
-import org.artifactory.api.rest.search.result.LicensesSearchResult;
-import org.artifactory.aql.AqlException;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.resource.ResourceStreamHandle;
-import org.artifactory.rest.common.list.KeyValueList;
-import org.artifactory.rest.common.list.StringList;
-import org.artifactory.rest.resource.artifact.legacy.DownloadResource;
-import org.jfrog.build.api.Build;
-import org.jfrog.build.api.BuildRetention;
-import org.jfrog.build.api.dependency.BuildPatternArtifacts;
-import org.jfrog.build.api.dependency.BuildPatternArtifactsRequest;
-import org.jfrog.build.api.release.Promotion;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.io.*;
-import java.text.ParseException;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeoutException;
-
-/**
- * An interface that holds all the REST related operations that are available only as part of Artifactory's Add-ons.
- *
- * @author Tomer Cohen
- */
-public interface RestAddon extends Addon {
-    /**
-     * Copy an artifact from one path to another.
-     *
-     * @param path            The source path of the artifact.
-     * @param target          The target repository where to copy/move the Artifact to.
-     * @param dryRun          A flag to indicate whether to perform a dry run first before performing the actual
-     *                        action.
-     * @param suppressLayouts Indicates whether path translation across different layouts should be suppressed.
-     * @param failFast        Indicates whether the operation should fail upon encountering an error.
-     * @param atomic          Indicates whether copy should run in one single tx
-     * @return A JSON object of all the messages and errors that occurred during the action.
-     * @throws Exception If an error occurred during the dry run or the actual action an exception is thrown.
-     */
-    Response copy(String path, String target, int dryRun, int suppressLayouts, int failFast, String atomic) throws Exception;
-
-    /**
-     * Move an artifact from one path to another.
-     *
-     * @param path            The source path of the artifact.
-     * @param target          The target repository where to copy/move the Artifact to.
-     * @param dryRun          A flag to indicate whether to perform a dry run first before performing the actual
-     *                        action.
-     * @param suppressLayouts Indicates whether path translation across different layouts should be suppressed.
-     * @param failFast        Indicates whether the operation should fail upon encountering an error.
-     * @return A JSON object of all the messages and errors that occurred during the action.
-     * @throws Exception If an error occurred during the dry run or the actual action an exception is thrown.
-     */
-    Response move(String path, String target, int dryRun, int suppressLayouts, int failFast, String atomic) throws Exception;
-
-    /**
-     * @deprecated use {@link RestAddon#replicate(org.artifactory.repo.RepoPath, org.artifactory.api.rest.replication.ReplicationRequest)} instead
-     */
-    Response download(String path, DownloadResource.Content content, int mark,
-            HttpServletResponse response) throws Exception;
-
-    /**
-     * Search for artifacts within a repository matching a given pattern.<br> The pattern should be like
-     * repo-key:this/is/a/pattern
-     *
-     * @param pattern Pattern to search for
-     * @return Set of matching artifact paths relative to the repo
-     */
-    Set<String> searchArtifactsByPattern(String pattern) throws ExecutionException, TimeoutException,
-            InterruptedException;
-
-    /**
-     * Promotes a build
-     *
-     * @param buildName   Name of build to promote
-     * @param buildNumber Number of build to promote
-     * @param promotion   Promotion settings
-     * @return Promotion result
-     */
-    PromotionResult promoteBuild(String buildName, String buildNumber, Promotion promotion) throws ParseException;
-
-    @Deprecated
-    Response replicate(RepoPath repoPath, ReplicationRequest replicationRequest) throws IOException;
-
-    /**
-     * Schedule an immediate replication, support remote, push and multi-push replication
-     *
-     * @param repoPath            Repository path
-     * @param replicationRequests List of ReplicationRequest objects
-     * @return Response
-     * @throws IOException
-     */
-    Response replicate(RepoPath repoPath, List<ReplicationRequest> replicationRequests) throws IOException;
-
-    /**
-     * Renames structure, content and properties of build info objects. The actual rename is done asynchronously.
-     *
-     * @param from Name to replace
-     * @param to   Replacement build name
-     */
-    void renameBuilds(String from, String to);
-
-    /**
-     * Renames structure, content and properties of build info objects in an asynchronous manner.
-     *
-     * @param from Name to replace
-     * @param to   Replacement build name
-     */
-    @Async
-    void renameBuildsAsync(String from, String to);
-
-    /**
-     * Deletes the build with given name and number
-     *
-     * @param response
-     * @param buildName    Name of build to delete
-     * @param buildNumbers Numbers of builds to delete
-     * @param artifacts    1 if build artifacts should be deleted
-     * @param deleteAll    1 if should delete all the builds
-     */
-    void deleteBuilds(HttpServletResponse response, String buildName, StringList buildNumbers, int artifacts,
-            int deleteAll) throws IOException;
-
-    /**
-     * Discard old builds as according to count or date.
-     *
-     * @param name              Build name
-     * @param discard           The discard object that holds a count or date.
-     * @param multiStatusHolder Status holder
-     */
-    void discardOldBuilds(String name, BuildRetention discard, BasicStatusHolder multiStatusHolder);
-
-    /**
-     * Returns the latest modified item of the given file or folder (recursively)
-     *
-     * @param pathToSearch Repo path to search in
-     * @return Latest modified item
-     */
-    org.artifactory.fs.ItemInfo getLastModified(String pathToSearch);
-
-    /**
-     * Find licenses in repositories, if empty, a scan of all repositories will take place.
-     *
-     * @param status            A container to hold the different license statuses.
-     * @param repos             The repositories to scan, if empty, all repositories will be scanned.
-     * @param servletContextUrl The contextUrl of the server.
-     * @return The search results.
-     */
-    LicensesSearchResult findLicensesInRepos(LicenseStatus status, Set<String> repos, String servletContextUrl);
-
-    /**
-     * Delete a repository via REST.
-     *
-     * @param repoKey The repokey that is associated to the repository that is wanted for deletion.
-     */
-    Response deleteRepository(String repoKey);
-
-    /**
-     * Get Repository configuration according to the repository key in conjunction with the media type to enforce a
-     * certain type of repository configuration.
-     *
-     * @param repoKey   The repokey of the repository.
-     * @param mediaType The acceptable media type for this request
-     * @return The response with the configuration embedded in it.
-     */
-    Response getRepositoryConfiguration(String repoKey, MediaType mediaType);
-
-    /**
-     * Create or replace an existing repository via REST.
-     *
-     * @param repoKey
-     * @param repositoryConfig Map of attributes.
-     * @param mediaType        The mediatypes of which are applicable. {@link org.artifactory.api.rest.constant.RepositoriesRestConstants}
-     * @param position         The position in the map that the newly created repository will be placed
-     */
-    Response createOrReplaceRepository(String repoKey, Map repositoryConfig, MediaType mediaType, int position);
-
-    /**
-     * Update an existing repository via REST.
-     *
-     * @param repoKey          The repokey of the repository to be updated.
-     * @param repositoryConfig The repository config of what is to be updated.
-     * @param mediaType        The acceptable media type for this REST command.
-     * @return The response for this command.
-     */
-    Response updateRepository(String repoKey, Map repositoryConfig, MediaType mediaType);
-
-    /**
-     * Search for artifacts by their checksums
-     *
-     * @param md5Checksum   MD5 checksum value
-     * @param sha1Checksum  SHA1 checksum value
-     * @param reposToSearch Specific repositories to search in
-     * @return Set of repo paths matching the given checksum
-     */
-    Set<RepoPath> searchArtifactsByChecksum(String md5Checksum, String sha1Checksum, StringList reposToSearch);
-
-    /**
-     * Search the repository(ies) for artifacts which have a mismatch between their server generated checksums and their
-     * client generated checksums, this can result from an inequality or if one is missing.
-     *
-     * @param type          the type of checksum to search for (md5, sha1).
-     * @param reposToSearch The list of repositories to search for the corrupt artifacts, if empty all repositories will
-     *                      be searched
-     * @param request       The request
-     * @return The response object with the result as its entity.
-     */
-    @Nonnull
-    Response searchBadChecksumArtifacts(String type, StringList reposToSearch,
-            HttpServletRequest request);
-
-    /**
-     * Save properties on a certain path (which must be a valid {@link org.artifactory.repo.RepoPath})
-     *
-     * @param path       The path on which to set the properties
-     * @param recursive  Whether the property attachment should be recursive.
-     * @param properties The properties to attach as a list.
-     * @return The response of the operation
-     */
-    Response savePathProperties(String path, String recursive, KeyValueList properties, String atomic);
-
-    Response deletePathProperties(String path, String recursive, StringList properties);
-
-    ResponseCtx runPluginExecution(String executionName, String method, Map params, @Nullable ResourceStreamHandle body,
-            boolean async);
-
-    Response getStagingStrategy(String strategyName, String buildName, Map params);
-
-    ItemPermissions getItemPermissions(HttpServletRequest request, String path);
-
-    Response searchDependencyBuilds(HttpServletRequest request, String sha1) throws UnsupportedEncodingException;
-
-    Response calculateYumMetadata(String repoKey, int async);
-
-    Response getSecurityEntities(HttpServletRequest request, String entityType) throws UnsupportedEncodingException;
-
-    Response getSecurityEntity(String entityType, String entityKey);
-
-    Response deleteSecurityEntity(String entityType, String entityKey);
-
-    Response createOrReplaceSecurityEntity(String entityType, String entityKey, HttpServletRequest request)
-            throws IOException;
-
-    Response updateSecurityEntity(String entityType, String entityKey, HttpServletRequest request) throws IOException;
-
-    /**
-     * Returns the latest replication status information
-     *
-     * @param repoPath Item to check for information annotations
-     * @return Response
-     */
-    Response getReplicationStatus(RepoPath repoPath);
-
-    /**
-     * Handles calculating maven index REST requests
-     *
-     * @param reposToIndex Keys of repositories to index
-     * @param force        force indexer execution
-     * @return Response
-     */
-    Response runMavenIndexer(List<String> reposToIndex, int force);
-
-    /**
-     * Handles requests for active user plugin info
-     *
-     * @param pluginType Specific plugin type to return the info for; All types if none is specified
-     * @return Response
-     */
-    Response getUserPluginInfo(@Nullable String pluginType);
-
-    /**
-     * Returns the outputs of build matching the request
-     *
-     * @param buildPatternArtifactsRequest contains build name and build number or keyword
-     * @param servletContextUrl            for building urls of current Artifactory
-     * @return build outputs (build dependencies and generated artifacts)
-     */
-    @Nullable
-    BuildPatternArtifacts getBuildPatternArtifacts(@Nonnull BuildPatternArtifactsRequest buildPatternArtifactsRequest,
-            @NotNull String servletContextUrl);
-
-    /**
-     * Returns diff object between two given builds (same build name, different numbers)
-     *
-     * @param firstBuild  The first build to compare, must be newer than the second build
-     * @param secondBuild The second build to compare against
-     * @param request     The request to extract the base uri from
-     */
-    Response getBuildsDiff(Build firstBuild, Build secondBuild, HttpServletRequest request);
-
-    /**
-     * Returns build artifacts map according to the param input regexp patterns.
-     *
-     * @param buildArtifactsRequest A wrapper which contains the necessary parameters
-     * @return A map from {@link FileInfo}s to their target directories relative paths
-     * @see BuildArtifactsRequest
-     */
-    Map<FileInfo, String> getBuildArtifacts(BuildArtifactsRequest buildArtifactsRequest);
-
-    /**
-     * Returns an archive file according to the param archive type (zip/tar/tar.gz/tgz) which contains
-     * all build artifacts according to the given build name and number (can be latest or latest by status).
-     *
-     * @param buildArtifactsRequest A wrapper which contains the necessary parameters
-     * @return The archived file of build artifacts with their hierarchy rules
-     * @see BuildArtifactsRequest
-     */
-    File getBuildArtifactsArchive(BuildArtifactsRequest buildArtifactsRequest) throws IOException;
-
-    /**
-     * Sends back an {@link InputStream} that streams the entire content of the folder or repo, archived according to
-     * {@param archiveType} and filtered by the user's authentication.
-     *
-     * @param pathToDownload - path to download (folder or repo)
-     * @param archiveType - how to archive the path
-     * @return an {@link InputStream} that serves the archived path
-     * @throws IOException
-     */
-    InputStream downloadFolderOrRepo(RepoPath pathToDownload, ArchiveType archiveType, BasicStatusHolder status)
-            throws IOException;
-
-    /**
-     * Invokes a user plugin based build promotion action
-     *
-     * @param promotionName Name of closure
-     * @param buildName     Name of build to promote
-     * @param buildNumber   Number of build to promote
-     * @param params        Promotion params
-     * @return Response context
-     */
-    ResponseCtx promote(String promotionName, String buildName, String buildNumber, Map params);
-
-    ResponseCtx deployPlugin(Reader pluginContent, String scriptName);
-
-    /**
-     * Reloads user plugins. Nothing is reloaded if there's no plugin present or no plugin modified since the last reload.
-     *
-     * @return Response context with status for various reloaded user plugins.
-     */
-    ResponseCtx reloadPlugins();
-
-    /**
-     * Searches for artifact versions by it's groupId and artifactId (version is optional and relates to
-     * integration versions only). The results are sorted from latest to oldest (latest is first).
-     *
-     * @param groupId       the groupId of the artifact
-     * @param artifactId    the artifactId of the artifact
-     * @param version       the artifact version, if null then perform the search on all available versions
-     * @param reposToSearch limit the search to specific repos, if null then performs the search on all real repos
-     * @param remote        whether to fetch maven-metadata from remote repository or not
-     * @param limitSearch
-     * @return A wrapper class of the search results
-     */
-    ArtifactVersionsResult getArtifactVersions(String groupId, String artifactId, @Nullable String version,
-            @Nullable StringList reposToSearch, boolean remote, boolean limitSearch);
-
-    void writeStreamingFileList(HttpServletResponse response, String requestUrl, String path, int deep, int depth,
-            int listFolders, int mdTimestamps, int includeRootPath) throws IOException, BlackedOutException;
-
-    Response getLatestVersionByProperties(String repoKey, String path, Map<String, String[]> parameterMap,
-            HttpServletRequest request) throws AqlException;
-
-}
diff --git a/web/rest/src/main/java/org/artifactory/addon/rest/RestAddonDefaultImpl.java b/web/rest/src/main/java/org/artifactory/addon/rest/RestAddonDefaultImpl.java
deleted file mode 100644
index 7859633..0000000
--- a/web/rest/src/main/java/org/artifactory/addon/rest/RestAddonDefaultImpl.java
+++ /dev/null
@@ -1,310 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.addon.rest;
-
-import org.artifactory.addon.license.LicenseStatus;
-import org.artifactory.addon.plugin.ResponseCtx;
-import org.artifactory.api.archive.ArchiveType;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.rest.artifact.ItemPermissions;
-import org.artifactory.api.rest.artifact.PromotionResult;
-import org.artifactory.api.rest.build.artifacts.BuildArtifactsRequest;
-import org.artifactory.api.rest.replication.ReplicationRequest;
-import org.artifactory.api.rest.search.result.ArtifactVersionsResult;
-import org.artifactory.api.rest.search.result.LicensesSearchResult;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.resource.ResourceStreamHandle;
-import org.artifactory.rest.common.list.KeyValueList;
-import org.artifactory.rest.common.list.StringList;
-import org.artifactory.rest.resource.artifact.legacy.DownloadResource;
-import org.jfrog.build.api.Build;
-import org.jfrog.build.api.BuildRetention;
-import org.jfrog.build.api.dependency.BuildPatternArtifacts;
-import org.jfrog.build.api.dependency.BuildPatternArtifactsRequest;
-import org.jfrog.build.api.release.Promotion;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Default implementation of the rest add-on
- *
- * @author Yoav Landman
- */
- at Component
-public class RestAddonDefaultImpl implements RestAddon {
-
-    @Override
-    public boolean isDefault() {
-        return true;
-    }
-
-    @Override
-    public Response copy(String path, String target, int dryRun, int suppressLayouts, int failFast, String atomic)
-            throws Exception {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public Response move(String path, String target, int dryRun, int suppressLayouts, int failFast, String atomic)
-            throws Exception {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public Response download(String path, DownloadResource.Content content, int mark,
-            HttpServletResponse response) throws Exception {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public Set<String> searchArtifactsByPattern(String pattern) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public PromotionResult promoteBuild(String buildName, String buildNumber, Promotion promotion) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public Response replicate(RepoPath repoPath, ReplicationRequest replicationRequest) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public Response replicate(RepoPath repoPath, List<ReplicationRequest> replicationRequests) throws IOException {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public void renameBuilds(String from, String to) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public void renameBuildsAsync(String from, String to) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public void deleteBuilds(HttpServletResponse response, String buildName, StringList buildNumbers, int artifacts,
-            int deleteAll) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public void discardOldBuilds(String name, BuildRetention discard, BasicStatusHolder multiStatusHolder) {
-        // nop
-    }
-
-    @Override
-    public ItemInfo getLastModified(String pathToSearch) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public LicensesSearchResult findLicensesInRepos(LicenseStatus status, Set<String> repos, String servletContextUrl) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public Response deleteRepository(String repoKey) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public Response getRepositoryConfiguration(String repoKey, MediaType mediaType) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public Response createOrReplaceRepository(String repoKey, Map repositoryConfig, MediaType mediaType,
-            int position) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public Response updateRepository(String repoKey, Map repositoryConfig, MediaType mediaType) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public Set<RepoPath> searchArtifactsByChecksum(String md5Checksum, String sha1Checksum, StringList reposToSearch) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    @Nonnull
-    public Response searchBadChecksumArtifacts(String type, StringList reposToSearch,
-            HttpServletRequest request) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public Response savePathProperties(String path, String recursive, KeyValueList properties, String atomic) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public Response deletePathProperties(String path, String recursive, StringList properties) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public ResponseCtx runPluginExecution(String executionName, String method, Map params, ResourceStreamHandle body,
-            boolean async) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public Response getStagingStrategy(String strategyName, String buildName, Map params) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public ItemPermissions getItemPermissions(HttpServletRequest request, String path) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public Response searchDependencyBuilds(HttpServletRequest request, String sha1) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public Response calculateYumMetadata(String repoKey, int async) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public Response getSecurityEntities(HttpServletRequest request, String entityType) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public Response getSecurityEntity(String entityType, String entityKey) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public Response deleteSecurityEntity(String entityType, String entityKey) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public Response createOrReplaceSecurityEntity(String entityType, String entityKey, HttpServletRequest request) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public Response updateSecurityEntity(String entityType, String entityKey, HttpServletRequest request) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public Response getReplicationStatus(RepoPath repoPath) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public Response runMavenIndexer(List<String> reposToIndex, int force) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public Response getUserPluginInfo(@Nullable String pluginType) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public BuildPatternArtifacts getBuildPatternArtifacts(
-            @Nonnull BuildPatternArtifactsRequest buildPatternArtifactsRequest, String servletContextUrl) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public Response getBuildsDiff(Build firstBuild, Build secondBuild, HttpServletRequest request) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public Map<FileInfo, String> getBuildArtifacts(BuildArtifactsRequest buildArtifactsRequest) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public File getBuildArtifactsArchive(BuildArtifactsRequest buildArtifactsRequest) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public InputStream downloadFolderOrRepo(RepoPath pathToDownload, ArchiveType archiveType, BasicStatusHolder status)
-            throws IOException {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public ResponseCtx promote(String promotionName, String buildName, String buildNumber, Map params) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public ResponseCtx deployPlugin(Reader pluginContent, String scriptName) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public ResponseCtx reloadPlugins() {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public ArtifactVersionsResult getArtifactVersions(String groupId, String artifactId, @Nullable String version,
-            @Nullable StringList reposToSearch, boolean remote, boolean limitSearch) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public void writeStreamingFileList(HttpServletResponse response, String requestUrl, String path, int deep,
-            int depth, int listFolders, int mdTimestamps, int includeRootPath) {
-        throw new MissingRestAddonException();
-    }
-
-    @Override
-    public Response getLatestVersionByProperties(String repoKey, String path, Map<String, String[]> parameterMap,
-            HttpServletRequest request) {
-        throw new MissingRestAddonException();
-    }
-
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/common/GlobalMessageProvider.java b/web/rest/src/main/java/org/artifactory/rest/common/GlobalMessageProvider.java
deleted file mode 100644
index 8c5ed24..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/common/GlobalMessageProvider.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package org.artifactory.rest.common;
-
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.sun.jersey.spi.container.ContainerResponse;
-import edu.emory.mathcs.backport.java.util.concurrent.locks.ReentrantLock;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.FooterMessage;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.api.storage.StorageQuotaInfo;
-import org.artifactory.storage.StorageService;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-import java.util.function.Predicate;
-import java.util.stream.Collectors;
-
-import static org.artifactory.addon.FooterMessage.FooterMessageVisibility.admin;
-import static org.artifactory.addon.FooterMessage.FooterMessageVisibility.isVisible;
-
-/**
- * @author Gidi Shabat
- */
-public class GlobalMessageProvider {
-    private static final Logger log = LoggerFactory.getLogger(GlobalMessageProvider.class);
-    private long lastUpdateTime = 0;
-    private List<FooterMessage> cache=Lists.newArrayList();
-    private volatile ReentrantLock lock = new ReentrantLock();
-
-    public void decorateWithGlobalMessages(ContainerResponse response, AddonsManager addonsManager,
-            StorageService storageService,AuthorizationService authenticationService) {
-        try {
-            boolean admin=authenticationService.isAdmin();
-            boolean notAnonymous = !authenticationService.isAnonymous();
-            // Try to update the cache if needed
-            triggerCacheUpdateProcessIfNeeded(addonsManager, storageService);
-            // update response header with message in cache
-            ObjectMapper mapper = new ObjectMapper();
-            Predicate<FooterMessage> predicate = p -> isVisible(p.getVisibility(), admin, notAnonymous);
-            List<FooterMessage> collect = cache.stream().filter(predicate).collect(Collectors.toList());
-            String json = mapper.writeValueAsString(collect);
-            response.getResponse().getMetadata().add("Artifactory-UI-messages", json);
-        } catch (Exception e) {
-            log.error("Fail to attache global message to response header", e);
-        }
-    }
-
-    private void triggerCacheUpdateProcessIfNeeded(AddonsManager addonsManager, StorageService storageService) {
-        long currentTime = System.currentTimeMillis();
-        // update the cache every 5 seconds
-        if (currentTime - lastUpdateTime > TimeUnit.SECONDS.toMillis(5)) {
-            // Only one thread is allowed to update the cache
-            // all the other requests will use the old cache value
-            boolean acquireLock = lock.tryLock();
-            try {
-                if (acquireLock) {
-                    List<FooterMessage> list = Lists.newArrayList();
-                    decorateHeadersWithLicenseNotInstaled(list, addonsManager);
-                    decorateHeaderWithQuotaMessage(list, storageService);
-                    // update the cache and the last update time
-                    lastUpdateTime=currentTime;
-                    cache = list;
-                }
-            } finally {
-                if (acquireLock) {
-                    lock.unlock();
-                }
-            }
-        }
-    }
-
-    private void decorateHeadersWithLicenseNotInstaled(List<FooterMessage> list, AddonsManager addonsManager) {
-        FooterMessage licenseMessage = addonsManager.getLicenseFooterMessage();
-        if (licenseMessage != null) {
-            list.add(licenseMessage);
-        }
-    }
-
-    private void decorateHeaderWithQuotaMessage(List<FooterMessage> list, StorageService storageService) {
-        StorageQuotaInfo storageQuotaInfo = storageService.getStorageQuotaInfo(0);
-        if (storageQuotaInfo != null) {
-            boolean limitReached = storageQuotaInfo.isLimitReached();
-            boolean warningReached = storageQuotaInfo.isWarningLimitReached();
-            if (limitReached) {
-                String errorMessage = storageQuotaInfo.getErrorMessage();
-                list.add(FooterMessage.createError(errorMessage, admin));
-            }else if (warningReached) {
-                String warningMessage = storageQuotaInfo.getWarningMessage();
-                list.add(FooterMessage.createWarning(warningMessage, admin));
-            }
-        }
-    }
-
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/common/JaxbProvider.java b/web/rest/src/main/java/org/artifactory/rest/common/JaxbProvider.java
deleted file mode 100644
index 0f8e545..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/common/JaxbProvider.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common;
-
-import com.sun.jersey.core.provider.AbstractMessageReaderWriterProvider;
-import org.artifactory.jaxb.JaxbHelper;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.Produces;
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.ext.Provider;
-import javax.xml.bind.annotation.XmlType;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-
-/**
- * A jersey provider to handle Jaxb objects
- *
- * @author Noam Tenne
- */
- at Produces(MediaType.APPLICATION_XML)
- at Consumes(MediaType.APPLICATION_XML)
- at Provider
-public class JaxbProvider extends AbstractMessageReaderWriterProvider<Object> {
-    private static final JaxbHelper JAXB_HELPER = new JaxbHelper();
-
-    @Override
-    public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations,
-            MediaType mediaType) {
-        return type.getAnnotation(XmlType.class) != null;
-    }
-
-    @Override
-    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations,
-            MediaType mediaType) {
-        return type.getAnnotation(XmlType.class) != null;
-    }
-
-    @Override
-    public Object readFrom(Class<Object> aClass, Type genericType, Annotation[] annotations,
-            MediaType mediaType, MultivaluedMap<String, String> map, InputStream stream)
-            throws IOException, WebApplicationException {
-        return JAXB_HELPER.read(stream, aClass, null);
-    }
-
-    @Override
-    @SuppressWarnings({"unchecked"})
-    public void writeTo(Object o, Class<?> aClass, Type type, Annotation[] annotations,
-            MediaType mediaType, MultivaluedMap<String, Object> map, OutputStream stream)
-            throws IOException, WebApplicationException {
-        JAXB_HELPER.write(stream, o);
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/common/JsonProvider.java b/web/rest/src/main/java/org/artifactory/rest/common/JsonProvider.java
deleted file mode 100644
index 0104a24..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/common/JsonProvider.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common;
-
-import org.artifactory.api.rest.constant.*;
-import org.codehaus.jackson.jaxrs.JacksonJsonProvider;
-import org.codehaus.jackson.map.AnnotationIntrospector;
-import org.codehaus.jackson.map.DeserializationConfig;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.map.SerializationConfig;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.codehaus.jackson.map.introspect.JacksonAnnotationIntrospector;
-import org.codehaus.jackson.xc.JaxbAnnotationIntrospector;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.ext.ContextResolver;
-import javax.ws.rs.ext.Provider;
-
-/**
- * A wrapper provider that makes it simpler to configure providers in one place. <br/> (This is more crucial for WAS,
- * where discovery is done by direct jar reference).
- * <p/>
- * Regarding supported media types - we do not support inference/inheritence of media types (e.g. if we serve
- * application/json we can also serve application/vnd.xxx+json, unless there is a provider with a more specific match.
- * This would require overriding -com.sun.jersey.core.spi.factory.MessageBodyFactory#getClassCapability or
- * +com.sun.jersey.core.spi.factory.MessageBodyFactory#init, but MessageBodyFactory is not pluggable.
- *
- * @author Yoav Landman
- */
- at Provider
- at Consumes({
-        MediaType.APPLICATION_JSON,
-        RestConstants.MT_LEGACY_ARTIFACTORY_APP,
-        BuildRestConstants.MT_BUILDS,
-        BuildRestConstants.MT_BUILDS_BY_NAME,
-        BuildRestConstants.MT_BUILD,
-        BuildRestConstants.MT_BUILD_INFO,
-        BuildRestConstants.MT_PROMOTION_REQUEST,
-        ArtifactRestConstants.MT_FOLDER_INFO,
-        ArtifactRestConstants.MT_FILE_INFO,
-        RepositoriesRestConstants.MT_REMOTE_REPOSITORY_CONFIG,
-        RepositoriesRestConstants.MT_LOCAL_REPOSITORY_CONFIGURATION,
-        RepositoriesRestConstants.MT_VIRTUAL_REPOSITORY_CONFIGURATION,
-        SearchRestConstants.MT_ARTIFACT_RESULT,
-        SearchRestConstants.MT_ARTIFACT_SEARCH_RESULT,
-        SearchRestConstants.MT_ARCHIVE_ENTRY_SEARCH_RESULT,
-        SearchRestConstants.MT_GAVC_SEARCH_RESULT,
-        SearchRestConstants.MT_PROPERTY_SEARCH_RESULT,
-        SearchRestConstants.MT_XPATH_SEARCH_RESULT,
-        SearchRestConstants.MT_USAGE_SINCE_SEARCH_RESULT,
-        SearchRestConstants.MT_CREATED_IN_RANGE_SEARCH_RESULT,
-        SearchRestConstants.MT_PATTERN_SEARCH_RESULT,
-        SystemRestConstants.MT_IMPORT_SETTINGS,
-        SystemRestConstants.MT_EXPORT_SETTINGS,
-        SecurityRestConstants.MT_GROUP,
-        SecurityRestConstants.MT_USER,
-        SecurityRestConstants.MT_PERMISSION_TARGET,
-        SecurityRestConstants.MT_GROUPS,
-        SecurityRestConstants.MT_USERS,
-        SecurityRestConstants.MT_PERMISSION_TARGETS,
-        ReplicationRestConstants.MT_REPLICATION_REQUEST,
-        ReplicationsRestConstants.MT_REPLICATION_CONFIG_REQUEST,
-        ReplicationsRestConstants.MT_MULTI_REPLICATION_CONFIG_REQUEST,
-        BuildRestConstants.MT_BUILD_PATTERN_ARTIFACTS_REQUEST,
-        BuildRestConstants.MT_BUILD_ARTIFACTS_REQUEST,
-        GitLfsResourceConstants.LFS_JSON
-})
- at Produces({
-        MediaType.APPLICATION_JSON,
-        BuildRestConstants.MT_BUILDS,
-        BuildRestConstants.MT_BUILDS_BY_NAME,
-        BuildRestConstants.MT_BUILD,
-        BuildRestConstants.MT_BUILD_INFO,
-        BuildRestConstants.MT_BUILDS_DIFF,
-        BuildRestConstants.MT_COPY_MOVE_RESULT,
-        BuildRestConstants.MT_PROMOTION_RESULT,
-        RepositoriesRestConstants.MT_REPOSITORY_DETAILS_LIST,
-        RepositoriesRestConstants.MT_REMOTE_REPOSITORY_CONFIGURATION,
-        RepositoriesRestConstants.MT_REMOTE_REPOSITORY_CONFIG,
-        RepositoriesRestConstants.MT_LOCAL_REPOSITORY_CONFIGURATION,
-        RepositoriesRestConstants.MT_VIRTUAL_REPOSITORY_CONFIGURATION,
-        ArtifactRestConstants.MT_FOLDER_INFO,
-        ArtifactRestConstants.MT_FILE_INFO,
-        ArtifactRestConstants.MT_ITEM_PROPERTIES,
-        SearchRestConstants.MT_ARTIFACT_RESULT,
-        SearchRestConstants.MT_ARTIFACT_SEARCH_RESULT,
-        SearchRestConstants.MT_ARCHIVE_ENTRY_SEARCH_RESULT,
-        SearchRestConstants.MT_GAVC_SEARCH_RESULT,
-        SearchRestConstants.MT_PROPERTY_SEARCH_RESULT,
-        SearchRestConstants.MT_XPATH_SEARCH_RESULT,
-        SearchRestConstants.MT_LICENSE_SEARCH_RESULT,
-        SearchRestConstants.MT_USAGE_SINCE_SEARCH_RESULT,
-        SearchRestConstants.MT_CREATED_IN_RANGE_SEARCH_RESULT,
-        SystemRestConstants.MT_VERSION_RESULT,
-        SystemRestConstants.MT_IMPORT_SETTINGS,
-        SystemRestConstants.MT_EXPORT_SETTINGS,
-        ArtifactRestConstants.MT_COPY_MOVE_RESULT,
-        SearchRestConstants.MT_PATTERN_SEARCH_RESULT,
-        ArtifactRestConstants.MT_FILE_LIST,
-        ArtifactRestConstants.MT_ITEM_LAST_MODIFIED,
-        SearchRestConstants.MT_CHECKSUM_SEARCH_RESULT,
-        SearchRestConstants.MT_BAD_CHECKSUM_SEARCH_RESULT,
-        ArtifactRestConstants.MT_ITEM_PERMISSIONS,
-        ArtifactRestConstants.MT_STATS_INFO,
-        SearchRestConstants.MT_DEPENDENCY_BUILDS,
-        SecurityRestConstants.MT_GROUP,
-        SecurityRestConstants.MT_USER,
-        SecurityRestConstants.MT_PERMISSION_TARGET,
-        SecurityRestConstants.MT_GROUPS,
-        SecurityRestConstants.MT_USERS,
-        SecurityRestConstants.MT_PERMISSION_TARGETS,
-        ReplicationRestConstants.MT_REPLICATION_REQUEST,
-        ReplicationRestConstants.MT_REPLICATION_STATUS,
-        ReplicationsRestConstants.MT_REPLICATION_CONFIG_REQUEST,
-        ReplicationsRestConstants.MT_MULTI_REPLICATION_CONFIG_REQUEST,
-        PluginRestConstants.MT_BUILD_STAGING_STRATEGY,
-        BuildRestConstants.MT_BUILD_PATTERN_ARTIFACTS_RESULT,
-        SearchRestConstants.MT_ARTIFACT_VERSIONS_SEARCH_RESULT,
-        SearchRestConstants.MT_BUILD_ARTIFACTS_SEARCH_RESULT,
-        GitLfsResourceConstants.LFS_JSON
-})
-public class JsonProvider extends JacksonJsonProvider implements ContextResolver<ObjectMapper> {
-
-    public JsonProvider() {
-        ObjectMapper mapper = getMapper();
-        //Update the annotation interceptor to also include jaxb annotations as a second choice
-        AnnotationIntrospector primary = new JacksonAnnotationIntrospector();
-        AnnotationIntrospector secondary = new JaxbAnnotationIntrospector();
-        AnnotationIntrospector pair = new AnnotationIntrospector.Pair(primary, secondary);
-
-        mapper.getSerializationConfig().setAnnotationIntrospector(pair);
-        mapper.getSerializationConfig().setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
-
-        mapper.getDeserializationConfig().setAnnotationIntrospector(pair);
-        //Ignore missing properties
-        mapper.getDeserializationConfig().disable(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES);
-    }
-
-    /**
-     * Provide a contextual (by media type and type) mapper object that is configured to pretty-print when in dev mode
-     *
-     * @param objectType
-     * @return
-     */
-    @Override
-    public ObjectMapper getContext(Class objectType) {
-        ObjectMapper mapper = getMapper();
-        mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
-
-        return mapper;
-    }
-
-    private ObjectMapper getMapper() {
-        ObjectMapper mapper = super._mapperConfig.getDefaultMapper();
-        return mapper;
-    }
-}
\ No newline at end of file
diff --git a/web/rest/src/main/java/org/artifactory/rest/common/RestAuthenticationFilter.java b/web/rest/src/main/java/org/artifactory/rest/common/RestAuthenticationFilter.java
deleted file mode 100644
index 70be9d4..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/common/RestAuthenticationFilter.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common;
-
-import com.sun.jersey.spi.container.ContainerRequest;
-import com.sun.jersey.spi.container.ContainerRequestFilter;
-import org.artifactory.addon.rest.AuthorizationRestException;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.rest.constant.HaRestConstants;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.util.AuthUtils;
-import org.artifactory.security.HaSystemAuthenticationToken;
-import org.artifactory.security.UserInfo;
-import org.artifactory.security.mission.control.MissionControlProperties;
-import org.artifactory.util.PathUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.SecurityContext;
-import javax.ws.rs.core.UriInfo;
-import java.security.Principal;
-
-import static org.apache.commons.lang.StringUtils.isBlank;
-import static org.artifactory.security.mission.control.MissionControlAuthenticationProvider.HEADER_NAME;
-
-/**
- * Authorization filter for all the REST requests.
- *
- * @author Fred Simon
- * @author Yossi Shaul
- * @author Yoav Landman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_SINGLETON)
-public class RestAuthenticationFilter implements ContainerRequestFilter {
-    private static final Logger log = LoggerFactory.getLogger(RestAuthenticationFilter.class);
-    @Context
-    HttpServletResponse response;
-    @Context
-    HttpServletRequest request;
-    @Context
-    UriInfo uriInfo;
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Override
-    public ContainerRequest filter(ContainerRequest request) {
-        // validate session still active
-        AuthUtils.validateSession(this.request, uriInfo, response);
-        boolean authenticated = authorizationService.isAuthenticated();
-        boolean anonAccessEnabled = authorizationService.isAnonAccessEnabled();
-        if (!authenticated) {
-            // TODO: (chenk) need to do this validation in more elegant way
-            if (anonAccessEnabled || uriInfo.getPath().indexOf("auth") != -1 ||
-                    uriInfo.getPath().matches(".*npm\\/.*\\/-\\/user\\/.*") || uriInfo.getPath().endsWith("v2/token")) {
-                //If anon access is allowed and we didn't bother authenticating try to perform the action as a user
-                request.setSecurityContext(new RoleAuthenticator(UserInfo.ANONYMOUS, AuthorizationService.ROLE_USER));
-            } else {
-                throw new AuthorizationRestException();
-            }
-        } else {
-            // Block all the REST calls that pass trough 'mc' entry point and are not authenticated by the MS token authentication,
-            // except the FIRST and only the FIRST call to the setupMC that can be authenticated by the basic authentication,
-            if (isMissionControlAccesPoint(request)) {
-                boolean firstCallToSetupMC = isFirstCallToSetupMC(request);
-                boolean tokenAuthentication = isTokenAuthentication(request);
-                if (!firstCallToSetupMC && !tokenAuthentication) {
-                    // Block all the REST calls that pass trough 'mc' entry point and are not authenticated by the MS token authentication,
-                    throw new AuthorizationRestException(
-                            "The access trough the 'mc' entry point is allowed only with token authentication");
-                } else if ((firstCallToSetupMC && tokenAuthentication)) {
-                    // Block the setupMC REST calls that pass trough 'mc' entry point and are authenticated by basic authentication except the first time.
-                    throw new AuthorizationRestException(
-                            "To initialize mission control chanel for the first time use user name and password ");
-                } else {
-                    String username = authorizationService.currentUsername();
-                    request.setSecurityContext(new RoleAuthenticator(username, AuthorizationService.ROLE_ADMIN));
-                    return request;
-                }
-            }
-
-            //Set the authenticated user and role
-            String username = authorizationService.currentUsername();
-            boolean admin = authorizationService.isAdmin();
-
-            boolean ha = SecurityContextHolder.getContext().getAuthentication() instanceof HaSystemAuthenticationToken;
-            if (ha) {
-                request.setSecurityContext(new RoleAuthenticator(username, HaRestConstants.ROLE_HA));
-                return request;
-            }
-
-            if (admin) {
-                request.setSecurityContext(new RoleAuthenticator(username, AuthorizationService.ROLE_ADMIN));
-            } else {
-                request.setSecurityContext(new RoleAuthenticator(username, AuthorizationService.ROLE_USER));
-            }
-        }
-        return request;
-    }
-
-    private boolean isTokenAuthentication(ContainerRequest request) {
-        String missionControlToken = request.getHeaderValue(HEADER_NAME);
-        return !isBlank(missionControlToken);
-    }
-
-    private boolean isMissionControlAccesPoint(ContainerRequest request) {
-        String baseUrl = request.getBaseUri().toString();
-        baseUrl = PathUtils.trimLeadingSlashes(baseUrl);
-        baseUrl = PathUtils.trimTrailingSlashes(baseUrl);
-        if (baseUrl.endsWith("/mc")) {
-            return true;
-        }
-        return false;
-    }
-
-    public boolean isFirstCallToSetupMC(ContainerRequest request) {
-        MissionControlProperties missionControlProperties = ContextHelper.get().beanForType(
-                MissionControlProperties.class);
-        String token = missionControlProperties.getToken();
-        String url = missionControlProperties.getUrl();
-        if ((isBlank(url) || isBlank(token)) && request.getPath().endsWith("setupmc")) {
-            return true;
-        }
-        return false;
-    }
-
-    private class RoleAuthenticator implements SecurityContext {
-        private final Principal principal;
-        private final String role;
-
-        RoleAuthenticator(final String name, String role) {
-            this.role = role;
-            this.principal = new Principal() {
-                @Override
-                public String getName() {
-                    return name;
-                }
-            };
-        }
-
-        @Override
-        public Principal getUserPrincipal() {
-            return principal;
-        }
-
-        @Override
-        public boolean isUserInRole(String role) {
-            return role.equals(this.role);
-        }
-
-        @Override
-        public boolean isSecure() {
-            return false;
-        }
-
-        @Override
-        public String getAuthenticationScheme() {
-            return SecurityContext.BASIC_AUTH;
-        }
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/common/RestResponseFilter.java b/web/rest/src/main/java/org/artifactory/rest/common/RestResponseFilter.java
deleted file mode 100644
index 4cc85bd..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/common/RestResponseFilter.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common;
-
-import com.sun.jersey.spi.container.ContainerRequest;
-import com.sun.jersey.spi.container.ContainerResponse;
-import com.sun.jersey.spi.container.ContainerResponseFilter;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.rest.ErrorResponse;
-import org.artifactory.rest.util.AuthUtils;
-import org.artifactory.storage.StorageService;
-import org.artifactory.util.PathUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriInfo;
-
-
-/**
- * Intercepts all Jersey client error responses (status code >= 400) and sends the response
- * as a JSON object. Also adds a response entity in case it was not specified.
- *
- * @author Shay Yaakov
- */
- at Component
- at Scope(BeanDefinition.SCOPE_SINGLETON)
-public class RestResponseFilter implements ContainerResponseFilter {
-
-    @Context
-    UriInfo uriInfo;
-    @Context
-    HttpServletRequest request;
-
-    @Context
-    HttpServletResponse response;
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Autowired
-    private StorageService storageService;
-
-    @Autowired
-    private AuthorizationService authenticationService;
-
-    private GlobalMessageProvider messageProvider;
-
-    public RestResponseFilter() {
-        messageProvider=new GlobalMessageProvider();
-    }
-
-    @Override
-    public ContainerResponse filter(ContainerRequest request, ContainerResponse response) {
-        int status = response.getStatus();
-        // add message to response headers
-        String baseUrl = PathUtils.trimTrailingSlashes(request.getBaseUri().getPath());
-        if(baseUrl.endsWith("ui")) {
-            messageProvider.decorateWithGlobalMessages(response, addonsManager, storageService, authenticationService);
-        }
-        AuthUtils.addSessionStatusToHeaders(response, uriInfo, this.request);
-        if (status >= 400) {
-            Object entity = response.getEntity();
-            if (entity == null) {
-                ErrorResponse errorResponse = new ErrorResponse(status, response.getStatusType().getReasonPhrase());
-                response.setResponse(createJsonErrorResponse(response.getResponse(), errorResponse));
-            } else if (entity instanceof String && !MediaType.APPLICATION_JSON_TYPE.equals(response.getMediaType())) {
-                ErrorResponse errorResponse = new ErrorResponse(status, (String) entity);
-                response.setResponse(createJsonErrorResponse(response.getResponse(), errorResponse));
-            }
-        }
-
-        return response;
-    }
-    private Response createJsonErrorResponse(Response response, ErrorResponse errorResponse) {
-        return Response.fromResponse(response).entity(errorResponse).type(MediaType.APPLICATION_JSON_TYPE).build();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/common/XStreamAliasProvider.java b/web/rest/src/main/java/org/artifactory/rest/common/XStreamAliasProvider.java
deleted file mode 100644
index 79a6a74..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/common/XStreamAliasProvider.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common;
-
-import com.sun.jersey.core.provider.AbstractMessageReaderWriterProvider;
-import com.thoughtworks.xstream.XStream;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-import org.apache.commons.io.IOUtils;
-import org.artifactory.factory.xstream.XStreamFactory;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.Produces;
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.ext.Provider;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * User: freds Date: Aug 12, 2008 Time: 6:46:36 PM
- */
- at Produces({MediaType.APPLICATION_XML, MediaType.TEXT_XML, MediaType.WILDCARD})
- at Consumes({MediaType.APPLICATION_XML, MediaType.TEXT_XML, MediaType.WILDCARD})
- at Provider
-public class XStreamAliasProvider extends AbstractMessageReaderWriterProvider<Object> {
-    private static final Set<Class> processed = new HashSet<>();
-    private static final XStream xstream = XStreamFactory.create();
-    private static final String DEFAULT_ENCODING = "utf-8";
-
-    @Override
-    public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
-        return type.getAnnotation(XStreamAlias.class) != null || isXtreamable(genericType);
-    }
-
-    @Override
-    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
-        return type.getAnnotation(XStreamAlias.class) != null || isXtreamable(genericType);
-    }
-
-    @Override
-    public Object readFrom(Class<Object> aClass, Type genericType, Annotation[] annotations,
-            MediaType mediaType, MultivaluedMap<String, String> map, InputStream stream)
-            throws IOException, WebApplicationException {
-        String encoding = getCharsetAsString(mediaType);
-        XStream xStream = getXStream(aClass);
-        InputStreamReader xmlIs = new InputStreamReader(stream, encoding);
-        try {
-            return xStream.fromXML(xmlIs);
-        } finally {
-            IOUtils.closeQuietly(xmlIs);
-        }
-    }
-
-    @Override
-    public void writeTo(Object o, Class<?> aClass, Type type, Annotation[] annotations,
-            MediaType mediaType, MultivaluedMap<String, Object> map, OutputStream stream)
-            throws IOException, WebApplicationException {
-        String encoding = getCharsetAsString(mediaType);
-        XStream xStream = getXStream(o.getClass());
-        xStream.toXML(o, new OutputStreamWriter(stream, encoding));
-    }
-
-    protected static String getCharsetAsString(MediaType m) {
-        if (m == null) {
-            return DEFAULT_ENCODING;
-        }
-        String result = m.getParameters().get("charset");
-        return (result == null) ? DEFAULT_ENCODING : result;
-    }
-
-    protected XStream getXStream(Class type) {
-        synchronized (processed) {
-            if (!processed.contains(type)) {
-                xstream.processAnnotations(type);
-                processed.add(type);
-            }
-        }
-        return xstream;
-    }
-
-    @SuppressWarnings({"unchecked"})
-    private boolean isXtreamable(Type genericType) {
-        return (genericType instanceof Class && ((Class) genericType).getAnnotation(XStreamAlias.class) != null);
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/common/exception/ArtifactoryRestExceptionMapper.java b/web/rest/src/main/java/org/artifactory/rest/common/exception/ArtifactoryRestExceptionMapper.java
deleted file mode 100644
index a3c1b4f..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/common/exception/ArtifactoryRestExceptionMapper.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common.exception;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.ErrorResponse;
-import org.artifactory.util.UiRequestUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.*;
-import javax.ws.rs.ext.ExceptionMapper;
-import javax.ws.rs.ext.Provider;
-
-/**
- * Intercepts and maps different exceptions thrown by the REST API.
- * <p/>
- * <strong>NOTE!</strong> Candidates exceptions <b>MUST NOT</b> have an entity, otherwise they will not get intercepted.
- *
- * @author Shay Yaakov
- */
- at Component
- at Provider
-public class ArtifactoryRestExceptionMapper implements ExceptionMapper<WebApplicationException> {
-
-    @Autowired
-    private CentralConfigService centralConfig;
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Autowired
-    private BasicAuthenticationEntryPoint authenticationEntryPoint;
-
-    @Context
-    UriInfo uriInfo;
-
-    @Context
-    HttpServletRequest servletRequest;
-
-
-    @Override
-    public Response toResponse(WebApplicationException exception) {
-        Response jerseyResponse = exception.getResponse();
-        int status = jerseyResponse.getStatus();
-        switch (status) {
-            case HttpStatus.SC_FORBIDDEN:
-                return interceptForbiddenStatus(jerseyResponse);
-
-            case HttpStatus.SC_UNAUTHORIZED:
-                return interceptUnauthorizedStatus(jerseyResponse);
-        }
-
-        return jerseyResponse;
-    }
-
-    /**
-     * Handle forbidden response (403) by verifying if anonymous access is globally allowed, if so we need to send
-     * an unauthorized (401) response with basic authentication challenge.
-     * If the global hide unauthorized resources is set, the result will be not found (404).
-     *
-     * @param jerseyResponse The original response, will be returned in there is no need for a conversion.
-     */
-    private Response interceptForbiddenStatus(Response jerseyResponse) {
-        if (authorizationService.isAnonAccessEnabled() && authorizationService.isAnonymous()) {
-            if (centralConfig.getDescriptor().getSecurity().isHideUnauthorizedResources()) {
-                return Response.status(HttpStatus.SC_NOT_FOUND).build();
-            }
-
-            return createUnauthorizedResponseWithChallenge();
-        }
-
-        return jerseyResponse;
-    }
-
-    /**
-     * Handle unauthorized response (401) by adding it with a basic authentication challenge in case it's missing
-     * (WWW-Authenticate header with Artifactory realm).
-     *
-     * @param jerseyResponse
-     * @return
-     */
-    private Response interceptUnauthorizedStatus(Response jerseyResponse) {
-        MultivaluedMap<String, Object> headers = jerseyResponse.getMetadata();
-        if (headers != null && headers.containsKey("WWW-Authenticate")) {
-            return jerseyResponse;
-        }
-        return createUnauthorizedResponseWithChallenge();
-    }
-
-    private Response createUnauthorizedResponseWithChallenge() {
-        Response.ResponseBuilder responseBuilder = Response.status(HttpStatus.SC_UNAUTHORIZED)
-                .type(MediaType.APPLICATION_JSON_TYPE)
-                .entity(new ErrorResponse(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"));
-        // ui related request do not require chanllange message
-        if (!UiRequestUtils.isUiRestRequest(servletRequest)) {
-            responseBuilder.header("WWW-Authenticate", "Basic realm=\"" + authenticationEntryPoint.getRealmName() + "\"");
-        }
-        return responseBuilder.build();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/common/exception/ConfigurationExceptionMapper.java b/web/rest/src/main/java/org/artifactory/rest/common/exception/ConfigurationExceptionMapper.java
deleted file mode 100644
index 9aff34a..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/common/exception/ConfigurationExceptionMapper.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common.exception;
-
-import com.sun.jersey.api.Responses;
-import org.artifactory.config.ConfigurationException;
-import org.artifactory.rest.ErrorResponse;
-import org.springframework.stereotype.Component;
-
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.ext.ExceptionMapper;
-import javax.ws.rs.ext.Provider;
-
-/**
- * Maps {@link org.artifactory.config.ConfigurationException}
- * to {@link Response.Status.BAD_REQUEST} error code
- *
- * @author Michael Pasternak
- */
- at Component
- at Provider
-public class ConfigurationExceptionMapper implements ExceptionMapper<ConfigurationException> {
-    @Override
-    public Response toResponse(ConfigurationException exception) {
-        ErrorResponse errorResponse = new ErrorResponse(
-                Response.Status.BAD_REQUEST.getStatusCode(),
-                exception.getMessage()
-        );
-        return Responses.clientError().type(MediaType.APPLICATION_JSON).entity(errorResponse).build();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/common/exception/GlobalExceptionMapper.java b/web/rest/src/main/java/org/artifactory/rest/common/exception/GlobalExceptionMapper.java
deleted file mode 100644
index efc23cf..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/common/exception/GlobalExceptionMapper.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common.exception;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.rest.ErrorResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.ext.ExceptionMapper;
-import javax.ws.rs.ext.Provider;
-
-/**
- * Intercepts and maps any un-caught exceptions thrown by the REST API.
- *
- * @author Shay Yaakov
- */
- at Component
- at Provider
-public class GlobalExceptionMapper implements ExceptionMapper<Exception> {
-    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionMapper.class);
-
-    @Override
-    public Response toResponse(Exception exception) {
-        String message = exception.getMessage();
-        log.error(message, exception);
-        if (StringUtils.isBlank(message)) {
-            message = "An unexpected error has occurred, please check Artifactory logs for further details.";
-        }
-        ErrorResponse errorResponse = new ErrorResponse(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, message);
-        return Response.status(HttpServletResponse.SC_INTERNAL_SERVER_ERROR).type(MediaType.APPLICATION_JSON).entity(
-                errorResponse).build();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/common/exception/HaNodePropagationException.java b/web/rest/src/main/java/org/artifactory/rest/common/exception/HaNodePropagationException.java
deleted file mode 100644
index ffbf8ce..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/common/exception/HaNodePropagationException.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common.exception;
-
-import com.sun.jersey.spi.container.ContainerRequest;
-
-/**
- * @author Shay Yaakov
- */
-public class HaNodePropagationException extends RuntimeException {
-
-    private ContainerRequest request;
-    private String nodeId;
-
-    public HaNodePropagationException(ContainerRequest request, String nodeId) {
-        this.request = request;
-        this.nodeId = nodeId;
-    }
-
-    public ContainerRequest getRequest() {
-        return request;
-    }
-
-    public String getNodeId() {
-        return nodeId;
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/common/exception/InvalidNameExceptionMapper.java b/web/rest/src/main/java/org/artifactory/rest/common/exception/InvalidNameExceptionMapper.java
deleted file mode 100644
index 6c86444..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/common/exception/InvalidNameExceptionMapper.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.rest.common.exception;
-
-import com.sun.jersey.api.Responses;
-import org.artifactory.exception.InvalidNameException;
-import org.artifactory.rest.ErrorResponse;
-import org.springframework.stereotype.Component;
-
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.ext.ExceptionMapper;
-import javax.ws.rs.ext.Provider;
-
-/**
- * @author Michael Pasternak
- */
- at Component
- at Provider
-public class InvalidNameExceptionMapper implements ExceptionMapper<InvalidNameException> {
-
-    @Override
-    public Response toResponse(InvalidNameException exception) {
-        ErrorResponse errorResponse = new ErrorResponse(
-                Response.Status.BAD_REQUEST.getStatusCode(),
-                exception.getMessage()
-        );
-        return Responses.notFound().type(MediaType.APPLICATION_JSON).entity(errorResponse).build();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/common/exception/ItemNotFoundExceptionMapper.java b/web/rest/src/main/java/org/artifactory/rest/common/exception/ItemNotFoundExceptionMapper.java
deleted file mode 100644
index c65395e..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/common/exception/ItemNotFoundExceptionMapper.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common.exception;
-
-import com.sun.jersey.api.Responses;
-import org.artifactory.api.repo.exception.ItemNotFoundRuntimeException;
-import org.artifactory.rest.ErrorResponse;
-import org.springframework.stereotype.Component;
-
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.ext.ExceptionMapper;
-import javax.ws.rs.ext.Provider;
-
-/**
- * Intercepts and maps {@link ItemNotFoundRuntimeException} exceptions thrown by the UI.
- *
- * @author Dan Feldman
- */
- at Component
- at Provider
-public class ItemNotFoundExceptionMapper implements ExceptionMapper<ItemNotFoundRuntimeException> {
-
-    @Override
-    public Response toResponse(ItemNotFoundRuntimeException exception) {
-        ErrorResponse errorResponse = new ErrorResponse(Response.Status.NOT_FOUND.getStatusCode(),
-                exception.getMessage());
-        return Responses.notFound().type(MediaType.APPLICATION_JSON).entity(errorResponse).build();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/common/exception/JsonParseExceptionMapper.java b/web/rest/src/main/java/org/artifactory/rest/common/exception/JsonParseExceptionMapper.java
deleted file mode 100644
index 703e148..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/common/exception/JsonParseExceptionMapper.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common.exception;
-
-import com.sun.jersey.api.Responses;
-import org.artifactory.rest.ErrorResponse;
-import org.codehaus.jackson.JsonParseException;
-import org.springframework.stereotype.Component;
-
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.ext.ExceptionMapper;
-import javax.ws.rs.ext.Provider;
-
-/**
- * @author Yoav Luft
- */
- at Component
- at Provider
-public class JsonParseExceptionMapper implements ExceptionMapper<JsonParseException> {
-    @Override
-    public Response toResponse(JsonParseException exception) {
-
-        ErrorResponse errorResponse = new ErrorResponse(Response.Status.BAD_REQUEST.getStatusCode(),
-                exception.getMessage());
-        return Responses.clientError().type(MediaType.APPLICATION_JSON).entity(errorResponse).build();
-
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/common/exception/LockedExceptionMapper.java b/web/rest/src/main/java/org/artifactory/rest/common/exception/LockedExceptionMapper.java
deleted file mode 100644
index 621f7c3..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/common/exception/LockedExceptionMapper.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common.exception;
-
-import com.sun.jersey.api.Responses;
-import org.artifactory.rest.ErrorResponse;
-import org.springframework.security.authentication.LockedException;
-import org.springframework.stereotype.Component;
-
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.ext.ExceptionMapper;
-import javax.ws.rs.ext.Provider;
-
-/**
- * Intercepts LockedException thrown by the REST API.
- *
- * @author Michael Pasternak
- */
- at Component
- at Provider
-public class LockedExceptionMapper implements ExceptionMapper<LockedException> {
-
-    @Override
-    public Response toResponse(LockedException exception) {
-        ErrorResponse errorResponse = new ErrorResponse(
-                Response.Status.FORBIDDEN.getStatusCode(),
-                exception.getMessage()
-        );
-        return Responses.clientError().type(MediaType.APPLICATION_JSON)
-                .entity(errorResponse).build();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/common/exception/NotFoundException.java b/web/rest/src/main/java/org/artifactory/rest/common/exception/NotFoundException.java
deleted file mode 100644
index 0ad97d6..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/common/exception/NotFoundException.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common.exception;
-
-/**
- * Represents a REST API not found request which will get responded by a 404 HTTP status code.
- *
- * @author Shay Yaakov
- * @see NotFoundExceptionMapper
- */
-
-public class NotFoundException extends RuntimeException {
-
-    public NotFoundException(String message) {
-        super(message);
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/common/exception/NotFoundExceptionMapper.java b/web/rest/src/main/java/org/artifactory/rest/common/exception/NotFoundExceptionMapper.java
deleted file mode 100644
index b80d66e..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/common/exception/NotFoundExceptionMapper.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common.exception;
-
-import com.sun.jersey.api.Responses;
-import org.artifactory.rest.ErrorResponse;
-import org.springframework.stereotype.Component;
-
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.ext.ExceptionMapper;
-import javax.ws.rs.ext.Provider;
-
-/**
- * Intercepts and maps {@link NotFoundException} exceptions thrown by the REST API.
- *
- * @author Shay Yaakov
- */
- at Component
- at Provider
-public class NotFoundExceptionMapper implements ExceptionMapper<NotFoundException> {
-
-    @Override
-    public Response toResponse(NotFoundException exception) {
-        ErrorResponse errorResponse = new ErrorResponse(Response.Status.NOT_FOUND.getStatusCode(),
-                exception.getMessage());
-        return Responses.notFound().type(MediaType.APPLICATION_JSON).entity(errorResponse).build();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/common/exception/RestException.java b/web/rest/src/main/java/org/artifactory/rest/common/exception/RestException.java
deleted file mode 100644
index 3726e6e..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/common/exception/RestException.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common.exception;
-
-/**
- * Represents a REST API error response other than 400 and 404.
- *
- * @author Shay Yaakov
- * @see RestExceptionMapper
- */
-public class RestException extends RuntimeException {
-
-    private int statusCode = 500;
-
-    public RestException(String message) {
-        super(message);
-    }
-
-    public RestException(int statusCode, String message) {
-        super(message);
-        this.statusCode = statusCode;
-    }
-
-    public int getStatusCode() {
-        return statusCode;
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/common/exception/RestExceptionMapper.java b/web/rest/src/main/java/org/artifactory/rest/common/exception/RestExceptionMapper.java
deleted file mode 100644
index 2e67547..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/common/exception/RestExceptionMapper.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common.exception;
-
-import org.artifactory.rest.ErrorResponse;
-import org.springframework.stereotype.Component;
-
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.ext.ExceptionMapper;
-import javax.ws.rs.ext.Provider;
-
-/**
- * Intercepts and maps {@link RestException} exceptions thrown by the REST API.
- *
- * @author Shay Yaakov
- */
- at Component
- at Provider
-public class RestExceptionMapper implements ExceptionMapper<RestException> {
-
-    @Override
-    public Response toResponse(RestException exception) {
-        ErrorResponse errorResponse = new ErrorResponse(exception.getStatusCode(), exception.getMessage());
-        return Response.status(exception.getStatusCode()).type(MediaType.APPLICATION_JSON).entity(errorResponse).build();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/common/list/KeyValueList.java b/web/rest/src/main/java/org/artifactory/rest/common/list/KeyValueList.java
deleted file mode 100644
index 2fb11da..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/common/list/KeyValueList.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common.list;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.descriptor.property.Property;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.Response;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Pattern;
-
-/**
- * This class uses a <a href="http://www.regular-expressions.info/lookaround.html">Negative Lookbehind</a> regexp.
- * <p>All the regexp are used instead of regular String split since we want to allow
- * pipe, comma or equal as regular characters inside the key/value (by escaping them with a backslash).<br/>
- * For example: "a\=a=1\,2" allows for key: a=a and value: 1,2 (one value instead of multiple values as comma usually means).
- * <p/>
- * <p><b>NOTE!</b> Since Jackrabbit doesn't allow pipes as the key/value name
- * we use the pipe regexp pattern only for handling values, in case a key with a pipe is given the user will get 500.
- *
- * @author Tomer Cohen
- */
-public class KeyValueList extends ArrayList<String> {
-    private static final Logger log = LoggerFactory.getLogger(KeyValueList.class);
-
-    private static final Pattern BACKSLASH_PIPE_PATTERN = Pattern.compile("(?<!\\\\)\\|");
-    private static final Pattern BACKSLASH_COMMA_PATTERN = Pattern.compile("(?<!\\\\)\\,");
-    private static final Pattern BACKSLASH_EQUAL_PATTERN = Pattern.compile("(?<!\\\\)=");
-
-    public KeyValueList(String s) {
-        super();
-        String[] splittedValues = BACKSLASH_PIPE_PATTERN.split(s);
-        for (String v : splittedValues) {
-            try {
-                if (!StringUtils.isWhitespace(v)) {
-                    add(v.trim());
-                }
-            } catch (Exception ex) {
-                log.error("Error while parsing list parameter '{}': {}.", s, ex.getMessage());
-                throw new WebApplicationException(ex, Response.Status.BAD_REQUEST);
-            }
-        }
-    }
-
-    public Map<String, List<String>> toStringMap() {
-        Map<String, List<String>> map = Maps.newHashMap();
-        for (String keyVal : this) {
-            String[] split = BACKSLASH_EQUAL_PATTERN.split(keyVal);
-            if (split.length == 2) {
-                String[] valueSplit = BACKSLASH_COMMA_PATTERN.split(split[1]);
-                List<String> values = Lists.newArrayList();
-                for (String s : valueSplit) {
-                    values.add(replaceBackslashes(s));
-                }
-                map.put(replaceBackslashes(split[0]), values);
-            }
-        }
-        return map;
-    }
-
-    public Map<Property, List<String>> toPropertyMap() {
-        Map<Property, List<String>> map = Maps.newHashMap();
-        for (String keyVal : this) {
-            String[] split = BACKSLASH_EQUAL_PATTERN.split(keyVal);
-            String key = replaceBackslashes(split[0]);
-            if (split.length == 2) {
-                Property propertyDescriptor = new Property();
-                propertyDescriptor.setName(key);
-                String[] valueSplit = BACKSLASH_COMMA_PATTERN.split(split[1]);
-                List<String> values = Lists.newArrayList();
-                for (String s : valueSplit) {
-                    values.add(replaceBackslashes(s));
-                }
-                map.put(propertyDescriptor, values);
-            } else if (split.length == 1) {
-                //Empty value
-                Property propertyDescriptor = new Property();
-                propertyDescriptor.setName(key);
-                map.put(propertyDescriptor, Lists.newArrayList(""));
-            }
-        }
-        return map;
-    }
-
-    private String replaceBackslashes(String s) {
-        return StringUtils.replaceEach(s, new String[]{"\\,", "\\=", "\\|", "\\"}, new String[]{",", "=", "|", "\\"});
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/common/list/StringList.java b/web/rest/src/main/java/org/artifactory/rest/common/list/StringList.java
deleted file mode 100644
index 57da923..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/common/list/StringList.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.common.list;
-
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.Response;
-import java.util.ArrayList;
-
-/**
- * Special list that add split constructor string by token"," and add only not only whiteSpaces elements
- *
- * @author Eli Givoni
- */
-public class StringList extends ArrayList<String> {
-
-    private static final Logger log = LoggerFactory.getLogger(StringList.class);
-
-    public StringList(String s) {
-        super();
-
-        for (String v : s.split(",")) {
-            try {
-                if (!StringUtils.isWhitespace(v)) {
-                    add(v.trim());
-                }
-            } catch (Exception ex) {
-                log.error("Error while parsing list parameter '{}': {}.", s, ex.getMessage());
-                throw new WebApplicationException(ex, Response.Status.BAD_REQUEST);
-            }
-        }
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/filter/HaRestFilter.java b/web/rest/src/main/java/org/artifactory/rest/filter/HaRestFilter.java
deleted file mode 100644
index 2c18419..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/filter/HaRestFilter.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.artifactory.rest.filter;
-
-import com.sun.jersey.spi.container.ContainerRequest;
-import com.sun.jersey.spi.container.ContainerRequestFilter;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.rest.common.exception.HaNodePropagationException;
-
-/**
- * @author Shay Yaakov
- */
-public class HaRestFilter implements ContainerRequestFilter {
-
-    @Override
-    public ContainerRequest filter(ContainerRequest containerRequest) {
-        HaCommonAddon haAddon = ContextHelper.get().beanForType(AddonsManager.class).addonByType(HaCommonAddon.class);
-        if (haAddon.isHaEnabled()) {
-            String nodeId = containerRequest.getHeaderValue(HaCommonAddon.ARTIFACTORY_NODE_ID);
-            if (StringUtils.isNotBlank(nodeId) && StringUtils.contains(containerRequest.getRequestUri().getPath(), "/mc/")) {
-                if (!StringUtils.equals(haAddon.getCurrentMemberServerId(), nodeId)) {
-                    throw new HaNodePropagationException(containerRequest, nodeId);
-                }
-            }
-        }
-        return containerRequest;
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/filter/LicenseRestFilter.java b/web/rest/src/main/java/org/artifactory/rest/filter/LicenseRestFilter.java
deleted file mode 100644
index ee2c825..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/filter/LicenseRestFilter.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.artifactory.rest.filter;
-
-import com.sun.jersey.spi.container.ContainerRequest;
-import com.sun.jersey.spi.container.ContainerRequestFilter;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.rest.AuthorizationRestException;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.request.ArtifactoryResponse;
-import org.artifactory.webapp.servlet.HttpArtifactoryResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.core.Context;
-import java.io.IOException;
-
-/**
- * @author Gidi Shabat
- */
-public class LicenseRestFilter implements ContainerRequestFilter {
-    private static final Logger log = LoggerFactory.getLogger(LicenseRestFilter.class);
-
-    @Context
-    HttpServletResponse response;
-
-    @Override
-    public ContainerRequest filter(ContainerRequest containerRequest) {
-        // Filter out all events in case that the trial license expired
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        ArtifactoryResponse artifactoryResponse = new HttpArtifactoryResponse(response);
-        try {
-            String path = containerRequest.getPath();
-            addonsManager.interceptRestResponse(artifactoryResponse, path);
-            if (artifactoryResponse.isError()) {
-                // throw the exception to make sure to return
-                throw new AuthorizationRestException("License expired or not installed");
-            }
-        } catch (IOException e) {
-            log.error("Fail to intercept license REST validation", e);
-            throw new RuntimeException("Fail to intercept license validation during rest request", e);
-        }
-        return containerRequest;
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/filter/OfflineRestFilter.java b/web/rest/src/main/java/org/artifactory/rest/filter/OfflineRestFilter.java
deleted file mode 100644
index c9ff561..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/filter/OfflineRestFilter.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.artifactory.rest.filter;
-
-import com.sun.jersey.spi.container.ContainerRequest;
-import com.sun.jersey.spi.container.ContainerRequestFilter;
-import org.artifactory.addon.rest.AuthorizationRestException;
-import org.artifactory.api.context.ContextHelper;
-
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.core.Context;
-
-/**
- * author: gidis
- * Block Rest request during offline state
- */
-
-public class OfflineRestFilter implements ContainerRequestFilter {
-
-    @Context
-    HttpServletResponse response;
-
-    @Override
-    public ContainerRequest filter(ContainerRequest containerRequest) {
-        // Filter out all events in case of offline mode
-        if (ContextHelper.get().isOffline()) {
-            throw new AuthorizationRestException();
-        }
-        return containerRequest;
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/http/ResponseHandler.java b/web/rest/src/main/java/org/artifactory/rest/http/ResponseHandler.java
deleted file mode 100644
index 7bb123c..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/http/ResponseHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package org.artifactory.rest.http;
-
-import org.artifactory.api.rest.restmodel.JsonUtil;
-import org.artifactory.rest.http.response.ArtifactoryRestApiResponse;
-
-import javax.ws.rs.core.Response;
-
-/**
- * @author chen keinan
- */
-public class ResponseHandler {
-
-    /**
-     * @return response code and data for Post Request
-     */
-    public static Response buildResponseWithJson(ArtifactoryRestApiResponse artifactoryRestApiResponse) {
-        Response.ResponseBuilder responseBuilder;
-        String content;
-        if (artifactoryRestApiResponse.isHasModel()) {
-            if (artifactoryRestApiResponse.isUiRestCall()) {
-                responseBuilder = getResponseBuilder();
-                content = objectToJson(artifactoryRestApiResponse.getIModel());
-                updateContentLength(responseBuilder, content);
-            }
-            return Response.status(artifactoryRestApiResponse.getResponseCode()).entity(
-                    artifactoryRestApiResponse.getIModel()).build();
-        } else {
-            if (artifactoryRestApiResponse.isUiRestCall()) {
-                responseBuilder = getResponseBuilder();
-                content = objectToJson(artifactoryRestApiResponse.getiModelList());
-                updateContentLength(responseBuilder, content);
-            }
-            return Response.status(artifactoryRestApiResponse.getResponseCode()).entity(
-                    artifactoryRestApiResponse.getiModelList()).build();
-        }
-    }
-
-    /**
-     * @return response code
-     */
-    public static Response buildResponseWithoutJson(ArtifactoryRestApiResponse artifactoryRestApiResponse) {
-        Response.ResponseBuilder responseBuilder = Response.ok();
-        return responseBuilder.status(artifactoryRestApiResponse.getResponseCode()).build();
-    }
-
-    private static void updateContentLength(Response.ResponseBuilder responseBuilder, String content) {
-        responseBuilder.header("Content-Length", content.getBytes().length);
-    }
-
-    /**
-     * create Response with support for cross site
-     *
-     * @return rest Response
-     */
-    private static Response.ResponseBuilder getResponseBuilder() {
-        Response.ResponseBuilder responseBuilder = Response.ok();
-        updateCorsHeaders(responseBuilder);
-        return responseBuilder;
-    }
-
-
-    /**
-     * update CORS headers
-     *
-     * @param responseBuilder response builder
-     */
-    private static void updateCorsHeaders(Response.ResponseBuilder responseBuilder) {
-        responseBuilder.header("Access-Control-Allow-Origin", "*");
-        responseBuilder.header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
-        responseBuilder.header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, X-Codingpedia");
-    }
-
-    /**
-     * json to String exclude null data
-     *
-     * @param model - model data to String
-     * @return - model data with json format
-     */
-    public static String objectToJson(Object model) {
-        return JsonUtil.jsonToString(model);
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/http/request/ArtifactoryRestRequest.java b/web/rest/src/main/java/org/artifactory/rest/http/request/ArtifactoryRestRequest.java
deleted file mode 100644
index b0ec92c..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/http/request/ArtifactoryRestRequest.java
+++ /dev/null
@@ -1,155 +0,0 @@
-package org.artifactory.rest.http.request;
-
-
-import org.artifactory.api.rest.restmodel.IModel;
-import org.artifactory.util.UiRequestUtils;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.Request;
-import javax.ws.rs.core.UriInfo;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public class ArtifactoryRestRequest {
-
-    private HttpServletRequest servletRequest;
-    private Request request;
-    private UriInfo uriInfo;
-    private HttpHeaders httpHeaders;
-    private IModel imodel;
-    private List<IModel> models;
-    private boolean uiRestCall;
-
-    public ArtifactoryRestRequest(RequestBuilder requestBuilder) {
-        this.servletRequest = requestBuilder.servletRequest;
-        this.request = requestBuilder.request;
-        this.uriInfo = requestBuilder.uriInfo;
-        this.httpHeaders = requestBuilder.httpHeaders;
-        this.imodel = requestBuilder.imodel;
-        this.models = requestBuilder.imodels;
-        this.uiRestCall = UiRequestUtils.isUiRestRequest(servletRequest);
-    }
-
-    /**
-     * return path param by key
-     *
-     * @param key - path param key
-     * @return path param value
-     */
-    public String getPathParamByKey(String key) {
-        String value = "";
-        List<String> valueList = uriInfo.getPathParameters().get(key);
-        if (valueList != null && !valueList.isEmpty()) {
-            String currentValue = valueList.get(0);
-            value = (currentValue == null) ? currentValue :
-                    currentValue.startsWith("/") ? currentValue.substring(1, currentValue.length())
-                    :
-                    currentValue;
-        }
-        return value;
-    }
-
-    /**
-     * return path param by key
-     *
-     * @param key - path param key
-     * @return path param value
-     */
-    public String getQueryParamByKey(String key) {
-        String value = "";
-        List<String> valueList = uriInfo.getQueryParameters().get(key);
-        if (valueList != null && !valueList.isEmpty()) {
-            String currentValue = valueList.get(0);
-            value = (currentValue == null) ? currentValue : currentValue;
-        }
-        return value;
-    }
-
-    public boolean isUiRestCall() {
-        return uiRestCall;
-    }
-
-    public void setUiRestCall(boolean uiRestCall) {
-        this.uiRestCall = uiRestCall;
-    }
-
-    public Request getRequest() {
-        return request;
-    }
-
-    public void setRequest(Request request) {
-        this.request = request;
-    }
-
-    public UriInfo getUriInfo() {
-        return uriInfo;
-    }
-
-    public void setUriInfo(UriInfo uriInfo) {
-        this.uriInfo = uriInfo;
-    }
-
-    public HttpHeaders getHttpHeaders() {
-        return httpHeaders;
-    }
-
-    public void setHttpHeaders(HttpHeaders httpHeaders) {
-        this.httpHeaders = httpHeaders;
-    }
-
-    public HttpServletRequest getServletRequest() {
-        return servletRequest;
-    }
-
-    public void setServletRequest(HttpServletRequest servletRequest) {
-        this.servletRequest = servletRequest;
-    }
-
-    public List getModels() {
-        return models;
-    }
-
-    public void setModels(List<IModel> models) {
-        this.models = models;
-    }
-
-    public IModel getImodel() {
-        return imodel;
-    }
-
-    public void setImodel(IModel imodel) {
-        this.imodel = imodel;
-    }
-
-    public static class RequestBuilder {
-        private HttpServletRequest servletRequest;
-        private Request request;
-        private UriInfo uriInfo;
-        private HttpHeaders httpHeaders;
-        private IModel imodel;
-        private String id;
-        private List<IModel> imodels;
-
-
-        public RequestBuilder(HttpServletRequest servletRequest, Request request, UriInfo uriInfo,
-                HttpHeaders httpHeaders) {
-            this.servletRequest = servletRequest;
-            this.request = request;
-            this.uriInfo = uriInfo;
-            this.httpHeaders = httpHeaders;
-        }
-
-        public RequestBuilder model(IModel imodel) {
-            this.imodel = imodel;
-            return this;
-        }
-
-        public RequestBuilder models(List<IModel> iModels) {
-            this.imodels = iModels;
-            return this;
-        }
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/http/response/ArtifactoryRestApiResponse.java b/web/rest/src/main/java/org/artifactory/rest/http/response/ArtifactoryRestApiResponse.java
deleted file mode 100644
index cf120c9..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/http/response/ArtifactoryRestApiResponse.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package org.artifactory.rest.http.response;
-
-import org.artifactory.rest.http.ResponseHandler;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.core.Response;
-import java.util.Collection;
-
-/**
- * @author Chen Keinan
- */
- at Component("artifactoryUiApiResponse")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ArtifactoryRestApiResponse implements IResponse {
-    private Collection iModelList;
-    private Object iModel;
-    private HttpServletResponse servletResponse;
-    private boolean hasModelList;
-    private boolean hasModel;
-    private boolean uiRestCall;
-
-    public boolean isHasModel() {
-        return hasModel;
-    }
-
-    private int responseCode = HttpServletResponse.SC_OK;
-
-    public boolean isUiRestCall() {
-        return uiRestCall;
-    }
-
-    public void setUiRestCall(boolean uiRestCall) {
-        this.uiRestCall = uiRestCall;
-    }
-
-    public ArtifactoryRestApiResponse() {
-    }
-
-    public ArtifactoryRestApiResponse(HttpServletResponse servletResponse) {
-        this.servletResponse = servletResponse;
-    }
-
-    public int getResponseCode() {
-        return responseCode;
-    }
-
-
-    public void setResponseCode(int responseCode) {
-        this.responseCode = responseCode;
-    }
-
-    public HttpServletResponse getServletResponse() {
-        return servletResponse;
-    }
-
-    public void setServletResponse(HttpServletResponse servletResponse) {
-        this.servletResponse = servletResponse;
-    }
-
-    public Collection getiModelList() {
-        return iModelList;
-    }
-
-    public void setIModelList(Collection iModelList) {
-        this.iModelList = iModelList;
-        if (iModelList != null) {
-            hasModelList = true;
-        }
-    }
-
-    @Override
-    public void setIModel(Object iModel) {
-        this.iModel = iModel;
-        if (iModel != null) {
-            hasModel = true;
-        }
-    }
-
-    public Object getIModel() {
-        return iModel;
-    }
-
-
-    /**
-     * update response data with model data
-     */
-    public Response buildResponse() {
-        Response serviceResponse;
-        if (hasModel || hasModelList) {
-            serviceResponse = ResponseHandler.buildResponseWithJson(this);
-        } else {
-            serviceResponse = ResponseHandler.buildResponseWithoutJson(this);
-        }
-        return serviceResponse;
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/http/response/IResponse.java b/web/rest/src/main/java/org/artifactory/rest/http/response/IResponse.java
deleted file mode 100644
index fdff879..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/http/response/IResponse.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.artifactory.rest.http.response;
-
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.core.Response;
-import java.util.Collection;
-
-/**
- * @author Chen Keinan
- */
-public interface IResponse {
-
-    /**
-     * build rest response instance with status code and entity (if needed)
-     *
-     * @return standard Rest Response instance
-     */
-    Response buildResponse();
-
-    /**
-     * set the status code following to rest request to be send back
-     * with response if not set , default code  = 200
-     *
-     * @param responseCode - status code
-     */
-    void setResponseCode(int responseCode);
-
-    /**
-     * set List of model (i.e. users list and etc) to be send in entity
-     * with rest response
-     *
-     * @param iModelList
-     */
-    void setIModelList(Collection iModelList);
-
-    /**
-     * set single model (i.e. users  and etc) to be send in entity
-     * with rest response
-     *
-     * @param iModel
-     */
-    void setIModel(Object iModel);
-
-    /**
-     * return rest servlet response
-     *
-     * @return HttpServletResponse instance for this rest call
-     */
-    HttpServletResponse getServletResponse();
-
-    void setServletResponse(HttpServletResponse servletResponse);
-
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/BaseResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/BaseResource.java
deleted file mode 100644
index c3f1713..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/BaseResource.java
+++ /dev/null
@@ -1,127 +0,0 @@
-package org.artifactory.rest.resource;
-
-import org.artifactory.api.rest.restmodel.IModel;
-import org.artifactory.rest.http.request.ArtifactoryRestRequest;
-import org.artifactory.rest.http.response.ArtifactoryRestApiResponse;
-import org.artifactory.rest.http.response.IResponse;
-import org.artifactory.rest.services.IService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.Request;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriInfo;
-import java.util.List;
-
-/**
- * @author chen keinan
- */
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public abstract class BaseResource {
-    @Context
-    protected HttpServletRequest servletRequest;
-    @Context
-    protected HttpServletResponse servletResponse;
-    @Autowired
-    protected ServiceExecutor serviceExecutor;
-
-    protected IResponse artifactoryResponse;
-
-    @Context
-    Request request;
-    @Context
-    UriInfo uriInfo;
-    @Context
-    HttpHeaders httpHeaders;
-
-    @Autowired
-    @Qualifier("artifactoryUiApiResponse")
-    public void setArtifactoryResponse(IResponse artifactoryResponse) {
-        this.artifactoryResponse = artifactoryResponse;
-    }
-
-    /**
-     * return ArtifactoryRestRequest instance with http servlet response property
-     *
-     * @param modelData - rest data type
-     * @return instance of ArtifactoryRestRequest
-     */
-    protected ArtifactoryRestRequest getArtifactoryRestRequest(IModel modelData) {
-        ArtifactoryRestRequest.RequestBuilder builder = new ArtifactoryRestRequest.
-                RequestBuilder(servletRequest, request, uriInfo, httpHeaders)
-                .model(modelData);
-        return new ArtifactoryRestRequest(builder);
-    }
-
-    /**
-     * return ArtifactoryRestRequest instance with http servlet response property
-     *
-     * @param modelsData - rest data type List
-     * @return instance of ArtifactoryRestRequest
-     */
-    protected ArtifactoryRestRequest getArtifactoryRestRequest(List<IModel> modelsData) {
-        ArtifactoryRestRequest.RequestBuilder builder = new ArtifactoryRestRequest.
-                RequestBuilder(servletRequest, request, uriInfo, httpHeaders)
-                .models(modelsData);
-        return new ArtifactoryRestRequest(builder);
-    }
-
-    /**
-     * execute service operation (i.e.: create user , login and etc) with  model
-     *
-     * @param service - service type (Login Service and etc)
-     * @return
-     */
-    protected Response runService(IService service, IModel model) {
-        // get encapsulated request data
-        ArtifactoryRestRequest artifactoryRequest = getArtifactoryRestRequest(model);
-        ((ArtifactoryRestApiResponse) artifactoryResponse).setServletResponse(servletResponse);
-        // process service request
-        return serviceExecutor.process(artifactoryRequest, artifactoryResponse, service);
-    }
-
-    /**
-     * execute service operation (i.e.: create user , login and etc) with  model
-     *
-     * @param service - service type (Login Service and etc)
-     * @return
-     */
-    protected Response runService(IService service, List model) {
-        // get encapsulated request data
-        ArtifactoryRestRequest artifactoryRequest = getArtifactoryRestRequest(model);
-        ((ArtifactoryRestApiResponse) artifactoryResponse).setServletResponse(servletResponse);
-        // process service request
-        return serviceExecutor.process(artifactoryRequest, artifactoryResponse, service);
-    }
-
-    /**
-     * execute service operation (i.e.: create user , login and etc) without model
-     *
-     * @param service - service type (Login Service and etc)
-     * @return
-     */
-    protected Response runService(IService service) {
-        // get encapsulated request data
-        ArtifactoryRestRequest artifactoryRequest = getArtifactoryRestRequest();
-        artifactoryResponse.setServletResponse(servletResponse);
-        // process service request
-        return serviceExecutor.process(artifactoryRequest, artifactoryResponse, service);
-    }
-
-    /**
-     * return ArtifactoryRestRequest instance with http servlet response property
-     *
-     * @return instance of ArtifactoryRestRequest
-     */
-    protected ArtifactoryRestRequest getArtifactoryRestRequest() {
-        ArtifactoryRestRequest.RequestBuilder builder = new ArtifactoryRestRequest.
-                RequestBuilder(servletRequest, request, uriInfo, httpHeaders);
-        return new ArtifactoryRestRequest(builder);
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/ChecksumResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/ChecksumResource.java
deleted file mode 100644
index bd5564e..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/ChecksumResource.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.rest.resource;
-import org.artifactory.rest.common.model.artifact.BaseArtifact;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.services.ConfigServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_USER,AuthorizationService.ROLE_ADMIN})
- at Component
- at Path("checksum/sha256")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ChecksumResource extends BaseResource{
-
-    @Autowired
-    protected ConfigServiceFactory configServiceFactory;
-
-    @POST
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response addSha256Property(BaseArtifact baseArtifact)
-            throws Exception {
-        return runService(configServiceFactory.addSha256ToArtifact(),baseArtifact);
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/ServiceExecutor.java b/web/rest/src/main/java/org/artifactory/rest/resource/ServiceExecutor.java
deleted file mode 100644
index 3f4489a..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/ServiceExecutor.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.artifactory.rest.resource;
-
-import org.artifactory.rest.http.request.ArtifactoryRestRequest;
-import org.artifactory.rest.http.response.IResponse;
-import org.artifactory.rest.services.IService;
-import org.springframework.stereotype.Component;
-
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at Component("serviceExecutor")
-public class ServiceExecutor {
-
-    public Response process(ArtifactoryRestRequest restReq, IResponse restRes, IService serviceAction) {
-        // execute service method
-        serviceAction.execute(restReq, restRes);
-        // build response
-        Response response = restRes.buildResponse();
-        return response;
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/aql/AqlResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/aql/AqlResource.java
deleted file mode 100644
index ed6a9cb..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/aql/AqlResource.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package org.artifactory.rest.resource.aql;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.rest.AuthorizationRestException;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.aql.AqlException;
-import org.artifactory.aql.AqlService;
-import org.artifactory.aql.result.AqlJsonStreamer;
-import org.artifactory.aql.result.AqlLazyResult;
-import org.artifactory.aql.result.AqlRestResult;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.StreamingOutput;
-
-/**
- * @author Gidi Shabat
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at Path(AqlResource.PATH_ROOT)
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
-public class AqlResource {
-    public static final String PATH_ROOT = "search/aql";
-    private static final Logger log = LoggerFactory.getLogger(AqlResource.class);
-    @Autowired
-    AddonsManager addonsManager;
-    @Autowired
-    AuthorizationService authorizationService;
-    @Autowired
-    AqlService aqlService;
-    @Context
-    private HttpServletRequest request;
-
-    @POST
-    @Produces({MediaType.APPLICATION_JSON})
-    public Response getLatestVersionByPath(String contentQuery) {
-        // Only none anonymous users can access AQL
-        if (authorizationService.isAnonymous()) {
-            throw new AuthorizationRestException("Only non-anonymous users are allowed to access AQL queries\n");
-        }
-        //Try to load the query from URL params or attached file
-        String query = getQuery(contentQuery);
-        if (StringUtils.isBlank(query)) {
-            log.error("Couldn't find the query neither in the request URL and the attached file");
-            return Response.status(Response.Status.BAD_REQUEST).build();
-        }
-        // Execute the query
-        try {
-            final AqlRestResult restResult = executeAqlQuery(query);
-            // After success query execution prepare the result in stream.
-            StreamingOutput stream = os -> {
-                byte[] array = restResult.read();
-                try {
-                    while (array != null) {
-                        os.write(array);
-                        array = restResult.read();
-                    }
-                    os.flush();
-                } finally {
-                    IOUtils.closeQuietly(restResult);
-                }
-            };
-            return Response.ok(stream).build();
-        } catch (AqlException e) {
-            log.error("Fail to parse query: {}: ", query, e.getMessage());
-            log.debug("Fail to parse query: {}: ", query, e);
-            if (e.getCause() == null) {
-                return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
-            } else {
-                return Response.status(Response.Status.BAD_REQUEST).entity(
-                        e.getMessage() + "\ncause: " + e.getCause().getMessage()).build();
-            }
-        } catch (Exception e) {
-            log.error("Fail to execute the following AqlApi, reason: ", e);
-            return Response.serverError().build();
-        }
-    }
-
-    private AqlRestResult executeAqlQuery(String query) {
-        AqlLazyResult result = aqlService.executeQueryLazy(query);
-        final AqlRestResult restResult;
-        restResult = new AqlJsonStreamer(result);
-        return restResult;
-    }
-
-    private String getQuery(String contentQuery) {
-        try {
-            String query = contentQuery;
-            if (StringUtils.isBlank(query)) {
-                // Try to find query in the attached params ()
-                query = ((String[]) request.getParameterMap().get("query"))[0];
-            }
-            return query;
-        } catch (Exception e) {
-            return null;
-        }
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/archive/ArchiveIndexResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/archive/ArchiveIndexResource.java
deleted file mode 100644
index 15991f6..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/archive/ArchiveIndexResource.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.artifactory.rest.resource.archive;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.exception.NotFoundException;
-import org.artifactory.rest.common.util.RestUtils;
-import org.artifactory.search.archive.InternalArchiveIndexer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import static org.artifactory.api.rest.constant.ArchiveIndexRestConstants.PATH_ROOT;
-
-/**
- * Resource class which handles archive indexing.
- *
- * @author Shay Yaakov
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at Path(PATH_ROOT)
- at RolesAllowed(AuthorizationService.ROLE_ADMIN)
-public class ArchiveIndexResource {
-    private static final Logger log = LoggerFactory.getLogger(ArchiveIndexResource.class);
-
-    @Autowired
-    private RepositoryService repositoryService;
-
-    @Autowired
-    private InternalArchiveIndexer archiveIndexer;
-
-    @POST
-    @Path("{path: .+}")
-    @Produces(MediaType.TEXT_PLAIN)
-    public Response index(@PathParam("path") String path) {
-        RepoPath repoPath = RestUtils.calcRepoPathFromRequestPath(path);
-        boolean allRepos = isAllRepos(repoPath.getRepoKey());
-        if (!allRepos) {
-            if (!repositoryService.exists(repoPath)) {
-                throw new NotFoundException("Could not find repo path " + repoPath);
-            }
-        }
-
-        archiveIndexer.recursiveMarkArchivesForIndexing(repoPath, allRepos);
-
-        //trigger async archive indexing now
-        archiveIndexer.asyncIndexMarkedArchives();
-
-        String message = allRepos ? "Archive indexing of all repositories accepted." :
-                "Archive indexing for path '" + repoPath + "' accepted.";
-        log.info(message);
-        return Response.status(HttpStatus.SC_ACCEPTED).entity(message).build();
-    }
-
-    private boolean isAllRepos(String repoKey) {
-        return StringUtils.equals(repoKey, "*");
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/archive/ArchiveResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/archive/ArchiveResource.java
deleted file mode 100644
index f1a494a..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/archive/ArchiveResource.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.archive;
-
-import com.sun.jersey.spi.CloseableService;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.apache.http.HttpStatus;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.rest.AuthorizationRestException;
-import org.artifactory.addon.rest.RestAddon;
-import org.artifactory.api.archive.ArchiveType;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.rest.build.artifacts.BuildArtifactsRequest;
-import org.artifactory.api.rest.constant.ArchiveRestConstants;
-import org.artifactory.api.rest.constant.BuildRestConstants;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.mime.MimeType;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.rest.ErrorResponse;
-import org.artifactory.rest.common.exception.BadRequestException;
-import org.artifactory.rest.common.exception.NotFoundException;
-import org.artifactory.rest.common.exception.UnauthorizedException;
-import org.artifactory.rest.resource.ci.BuildResource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.StreamingOutput;
-import java.io.Closeable;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-
-import static org.apache.commons.lang.StringUtils.isBlank;
-
-/**
- * Resource class which handles archive operations
- *
- * @author Shay Yaakov
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at Path(ArchiveRestConstants.PATH_ROOT)
- at RolesAllowed({AuthorizationService.ROLE_USER, AuthorizationService.ROLE_ADMIN})
-public class ArchiveResource {
-    private static final Logger log = LoggerFactory.getLogger(ArchiveResource.class);
-
-    @Context
-    private CloseableService closeableService;
-
-    @Autowired
-    private AuthorizationService authorizationService;
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @POST
-    @Path(ArchiveRestConstants.PATH_BUILD_ARTIFACTS)
-    @Consumes({BuildRestConstants.MT_BUILD_ARTIFACTS_REQUEST, MediaType.APPLICATION_JSON})
-    public Response getBuildArtifactsArchive(BuildArtifactsRequest buildArtifactsRequest) throws IOException {
-
-        if (authorizationService.isAnonUserAndAnonBuildInfoAccessDisabled()) {
-            throw new AuthorizationRestException(BuildResource.anonAccessDisabledMsg);
-        }
-        if (isBlank(buildArtifactsRequest.getBuildName())) {
-            throw new BadRequestException("Cannot search without build name.");
-        }
-        boolean buildNumberIsBlank = isBlank(buildArtifactsRequest.getBuildNumber());
-        boolean buildStatusIsBlank = isBlank(buildArtifactsRequest.getBuildStatus());
-        if (buildNumberIsBlank && buildStatusIsBlank) {
-            throw new BadRequestException("Cannot search without build number or build status.");
-        }
-        if (!buildNumberIsBlank && !buildStatusIsBlank) {
-            throw new BadRequestException("Cannot search with both build number and build status parameters, " +
-                    "please omit build number if your are looking for latest build by status " +
-                    "or omit build status to search for specific build version.");
-        }
-
-        if (buildArtifactsRequest.getArchiveType() == null) {
-            throw new BadRequestException("Archive type cannot be empty, please provide a type of zip/tar/tar.gz/tgz.");
-        }
-
-        if (!authorizationService.isAuthenticated()) {
-            throw new AuthorizationRestException();
-        }
-
-        RestAddon restAddon = addonsManager.addonByType(RestAddon.class);
-        try {
-            final File buildArtifactsArchive = restAddon.getBuildArtifactsArchive(buildArtifactsRequest);
-            if (buildArtifactsArchive == null) {
-                throw new NotFoundException(
-                        String.format("Could not find any build artifacts for build '%s' number '%s'.",
-                                buildArtifactsRequest.getBuildName(),
-                                buildArtifactsRequest.getBuildNumber()));
-            }
-
-            markForDeletionAtResponseEnd(buildArtifactsArchive);
-
-            MimeType mimeType = NamingUtils.getMimeType(buildArtifactsArchive.getName());
-            return Response.ok().entity(buildArtifactsArchive).type(mimeType.getType()).build();
-        } catch (IOException e) {
-            log.error("Failed to create builds artifacts archive: " + e.getMessage(), e);
-            throw new NotFoundException("Failed to create builds artifacts archive");
-        }
-    }
-
-    @GET
-    @Path(ArchiveRestConstants.PATH_DOWNLOAD_REPO_PATH)
-    public Response downloadFolder(@PathParam("repoKey") String repoKey, @PathParam("path") String path,
-            @QueryParam("archiveType") String archiveTypeString) throws Exception {
-        return downloadFolderOrRepo(repoKey, path, archiveTypeString);
-    }
-
-    @GET
-    @Path(ArchiveRestConstants.PATH_DOWNLOAD_REPO_ROOT)
-    public Response downloadFolderOrRepo(@PathParam("repoKey") String repoKey,
-            @QueryParam("archiveType") String archiveTypeString) throws Exception {
-        return downloadFolderOrRepo(repoKey, "", archiveTypeString);
-    }
-
-    private Response downloadFolderOrRepo(String repoKey, String path, String archiveTypeString) throws Exception {
-        if(authorizationService.isAnonymous()) {
-            throw new UnauthorizedException("You must be logged in to download a folder or repository.");
-        }
-        RepoPath pathToDownload = RepoPathFactory.create(repoKey, path);
-        ArchiveType archiveType;
-        try {
-            archiveType = ArchiveType.fromValue(archiveTypeString);
-        } catch (IllegalArgumentException iae) {
-            throw new BadRequestException(iae.getMessage());
-        }
-        BasicStatusHolder status = new BasicStatusHolder();
-        InputStream toWrite = addonsManager.addonByType(RestAddon.class)
-                .downloadFolderOrRepo(pathToDownload, archiveType, status);
-        if (status.isError()) {
-            int statusCode = status.getLastError().getStatusCode();
-            return Response.status(statusCode).entity(new ErrorResponse(statusCode, status.getLastError().getMessage()))
-                    .type(MediaType.APPLICATION_JSON).build();
-        } else if (toWrite == null) {
-            //This will get caught by the GlobalExceptionMapper and return an 'unexpected error' message.
-            throw new Exception();
-        }
-        return Response.status(HttpStatus.SC_OK).type(MediaType.WILDCARD).entity((StreamingOutput)
-                        out -> {
-                            try {
-                                IOUtils.copy(toWrite, out);
-                            } finally {
-                                log.debug("Closing folder download stream");
-                                IOUtils.closeQuietly(out);
-                                IOUtils.closeQuietly(toWrite);
-                            }
-                        }
-        ).build();
-
-    }
-
-    private void markForDeletionAtResponseEnd(final File buildArtifactsArchive) {
-        // delete the file after jersey streamed it back to the client
-        closeableService.add(new Closeable() {
-            @Override
-            public void close() throws IOException {
-                FileUtils.deleteQuietly(buildArtifactsArchive);
-            }
-        });
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/artifact/ArtifactResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/artifact/ArtifactResource.java
deleted file mode 100644
index ec6e0a1..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/artifact/ArtifactResource.java
+++ /dev/null
@@ -1,634 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.artifact;
-
-import com.google.common.collect.Iterables;
-import com.sun.jersey.api.core.ExtendedUriInfo;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.PropertiesAddon;
-import org.artifactory.addon.rest.AuthorizationRestException;
-import org.artifactory.addon.rest.MissingRestAddonException;
-import org.artifactory.addon.rest.RestAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryBrowsingService;
-import org.artifactory.api.repo.VirtualRepoItem;
-import org.artifactory.api.repo.exception.BlackedOutException;
-import org.artifactory.api.repo.exception.FolderExpectedException;
-import org.artifactory.api.repo.exception.ItemNotFoundRuntimeException;
-import org.artifactory.api.rest.artifact.*;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.checksum.ChecksumsInfo;
-import org.artifactory.descriptor.repo.LocalCacheRepoDescriptor;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.descriptor.repo.VirtualRepoDescriptor;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.FolderInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.fs.StatsInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.model.common.RepoPathImpl;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.Repo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.repo.virtual.VirtualRepo;
-import org.artifactory.rest.common.exception.BadRequestException;
-import org.artifactory.rest.common.exception.NotFoundException;
-import org.artifactory.rest.common.list.KeyValueList;
-import org.artifactory.rest.common.list.StringList;
-import org.artifactory.rest.common.util.RestUtils;
-import org.artifactory.util.DoesNotExistException;
-import org.artifactory.util.HttpUtils;
-import org.joda.time.format.DateTimeFormat;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Nonnull;
-import javax.annotation.security.RolesAllowed;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.*;
-import javax.ws.rs.core.*;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Set;
-
-import static org.artifactory.api.rest.constant.ArtifactRestConstants.*;
-
-/**
- * @author Eli Givoni
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at Path(PATH_ROOT + "/{" + PATH_PARAM + ": .+}")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
-public class ArtifactResource {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactResource.class);
-
-    private static final String LIST_PARAM = "list";
-    private static final String DEEP_PARAM = "deep";
-    private static final String DEPTH_PARAM = "depth";
-    private static final String LIST_FOLDERS_PARAM = "listFolders";
-    private static final String MD_TIMESTAMPS_PARAM = "mdTimestamps";
-    private static final String INCLUDE_ROOT_PATH_PARAM = "includeRootPath";
-    private static final String LAST_MODIFIED_PARAM = "lastModified";
-    private static final String PERMISSIONS_PARAM = "permissions";
-    private static final String STATS_PARAM = "stats";
-
-    @Context
-    private HttpServletRequest request;
-
-    @Context
-    private HttpServletResponse response;
-
-    @Context
-    private HttpHeaders requestHeaders;
-
-    @Context
-    private ExtendedUriInfo uriInfo;
-
-    @Autowired
-    private AuthorizationService authorizationService;
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Autowired
-    private InternalRepositoryService repositoryService;
-
-    @Autowired
-    private RepositoryBrowsingService repoBrowsingService;
-
-    @Autowired
-    private CentralConfigService centralConfig;
-
-
-
-    @PathParam(PATH_PARAM)
-    String path;
-
-    @GET
-    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MT_FOLDER_INFO, MT_FILE_INFO, MT_ITEM_PROPERTIES,
-            MT_FILE_LIST, MT_ITEM_LAST_MODIFIED, MT_ITEM_PERMISSIONS, MT_STATS_INFO})
-    public Object getStorageInfo() throws IOException {
-        return prepareResponseAccordingToType();
-    }
-
-    @PUT
-    public Response savePathProperties(@QueryParam("recursive") String recursive,
-                                       @QueryParam("properties") KeyValueList properties, @QueryParam("atomic") String atomic) {
-        return restAddon().savePathProperties(path, recursive, properties, atomic);
-    }
-
-    @DELETE
-    public Response deletePathProperties(@QueryParam("recursive") String recursive,
-            @QueryParam("properties") StringList properties) {
-        return restAddon().deletePathProperties(path, recursive, properties);
-    }
-
-    private RepoPath repoPathFromRequestPath() {
-        return RestUtils.calcRepoPathFromRequestPath(path);
-    }
-
-    private Response prepareResponseAccordingToType() throws IOException {
-        if (isFileListRequest()) {
-            return prepareFileListResponse();
-        } else if (isLastModifiedRequest()) {
-            return prepareLastModifiedResponse();
-        } else if (isPropertiesRequest()) {
-            return preparePropertiesResponse();
-        } else if (isPropertiesXmlRequest()) {
-            return preparePropertiesXmlResponse();
-        } else if (isPermissionsRequest()) {
-            return preparePermissionsResponse();
-        } else if (isStatsRequest()) {
-            return prepareStatsResponse();
-        } else {
-            return prepareStorageInfoResponse();
-        }
-    }
-
-    private Response prepareStatsResponse() throws IOException {
-        RepoPath repoPath = repoPathFromRequestPath();
-        if (!authorizationService.canRead(repoPath)) {
-            return prepareUnAuthorizedResponse(repoPath);
-        }
-        if (!repositoryService.exists(repoPath)) {
-            throw new NotFoundException("Unable to find item path");
-        }
-        StatsInfo statsInfo = repositoryService.getStatsInfo(repoPath);
-        String uri = buildDownloadUri();
-        if (statsInfo == null) {
-            return okResponse(new ItemStatsInfo(uri, 0, 0, null), MT_STATS_INFO);
-        }
-        if (isMediaTypeAcceptableByUser(MT_STATS_INFO)) {
-            ItemStatsInfo entity = new ItemStatsInfo(uri, statsInfo.getDownloadCount(),
-                    statsInfo.getLastDownloaded(), statsInfo.getLastDownloadedBy());
-            return okResponse(entity, MT_STATS_INFO);
-        } else {
-            return notAcceptableResponse(MT_STATS_INFO);
-        }
-    }
-
-    private boolean isStatsRequest() {
-        return queryParamsContainKey(STATS_PARAM);
-    }
-
-    private Response prepareUnAuthorizedResponse(RepoPath unAuthorizedResource) throws IOException {
-        boolean hideUnauthorizedResources = centralConfig.getDescriptor().getSecurity().isHideUnauthorizedResources();
-        if (hideUnauthorizedResources) {
-            throw new NotFoundException("Resource not found");
-        } else {
-            throw new AuthorizationRestException("Request for '" + unAuthorizedResource + "' is forbidden for user '" +
-                    authorizationService.currentUsername() + "'.");
-        }
-    }
-
-    private boolean isFileListRequest() {
-        return queryParamsContainKey(LIST_PARAM);
-    }
-
-    private boolean isLastModifiedRequest() {
-        return queryParamsContainKey(LAST_MODIFIED_PARAM);
-    }
-
-    private boolean isPropertiesRequest() {
-        return queryParamsContainKey(PROPERTIES_PARAM);
-    }
-
-    private boolean isPropertiesXmlRequest() {
-        return queryParamsContainKey(PROPERTIES_XML_PARAM);
-    }
-
-    private boolean isPermissionsRequest() {
-        return queryParamsContainKey(PERMISSIONS_PARAM);
-    }
-
-    private boolean queryParamsContainKey(String key) {
-        MultivaluedMap<String, String> queryParameters = queryParams();
-        return queryParameters.containsKey(key);
-    }
-
-    private Response prepareFileListResponse() throws IOException {
-        if (authorizationService.isAnonymous()) {
-            throw new AuthorizationRestException("This resource is available to authenticated users only.");
-        }
-
-        log.debug("Received file list request for: {}. ", path);
-        return writeStreamingFileList();
-    }
-
-    private int getQueryParameterAsInt(String parameterName) {
-        if (queryParams().containsKey(parameterName)) {
-            String value = queryParams().getFirst(parameterName);
-            if (StringUtils.isNotBlank(value)) {
-                return convertStringToInt(value);
-            }
-        }
-
-        return 0;
-    }
-
-    private MultivaluedMap<String, String> queryParams() {
-        return uriInfo.getQueryParameters();
-    }
-
-    private int convertStringToInt(String integer) {
-        return Integer.parseInt(integer);
-    }
-
-    private Response writeStreamingFileList() throws IOException {
-        try {
-            restAddon().writeStreamingFileList(response, getRequestStorageUri(), path,
-                    getQueryParameterAsInt(DEEP_PARAM), getQueryParameterAsInt(DEPTH_PARAM),
-                    getQueryParameterAsInt(LIST_FOLDERS_PARAM), getQueryParameterAsInt(MD_TIMESTAMPS_PARAM),
-                    getQueryParameterAsInt(INCLUDE_ROOT_PATH_PARAM));
-            return Response.ok().build();
-        } catch (IllegalArgumentException iae) {
-            throw new BadRequestException(iae.getMessage());
-        } catch (DoesNotExistException dnee) {
-            log.debug("Does not exist", dnee);
-            throw new NotFoundException(dnee.getMessage());
-        } catch (FolderExpectedException fee) {
-            log.debug("Folder expected", fee);
-            throw new BadRequestException(fee.getMessage());
-        } catch (BlackedOutException boe) {
-            log.debug("Repository is blacked out", boe);
-            throw new NotFoundException(boe.getMessage());
-        } catch (MissingRestAddonException mrae) {
-            throw mrae;
-        } catch (Exception e) {
-            log.error("Could not retrieve list", e);
-            return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR)
-                    .entity("An error occurred while retrieving file list: " + e.getMessage()).build();
-        }
-    }
-
-    private String getRequestStorageUri() {
-        RepoPath repoPath = repoPathFromRequestPath();
-        return RestUtils.buildStorageInfoUri(request, repoPath.getRepoKey(), repoPath.getPath());
-    }
-
-    /**
-     * Returns the highest last modified value of the given file or folder (recursively)
-     *
-     * @return Latest modified item
-     */
-    private Response prepareLastModifiedResponse() throws IOException {
-        fixPathIfNeeded();
-        try {
-            if (isRequestToNoneLocalRepo()) {
-                throw new BadRequestException("This method can only be invoked on local repositories.");
-            }
-            ItemInfo lastModifiedItem = restAddon().getLastModified(path);
-            String uri = getLastModifiedRequestUri(lastModifiedItem);
-            String lastModifiedAsISo =
-                    DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ").print(lastModifiedItem.getLastModified());
-            ItemLastModified itemLastModified = new ItemLastModified(uri, lastModifiedAsISo);
-            Date lastModifiedDate = new Date(lastModifiedItem.getLastModified());
-            return Response.ok(itemLastModified, MT_ITEM_LAST_MODIFIED).lastModified(lastModifiedDate).build();
-        } catch (IllegalArgumentException iae) {
-            throw new BadRequestException(iae.getMessage());
-        } catch (ItemNotFoundRuntimeException infre) {
-            throw new NotFoundException(infre.getMessage());
-        }
-    }
-
-    private String getLastModifiedRequestUri(@Nonnull ItemInfo lastModifiedItem) {
-        return RestUtils.buildStorageInfoUri(request, lastModifiedItem.getRepoKey(),
-                lastModifiedItem.getRelPath());
-    }
-
-    private boolean isMediaTypeAcceptableByUser(String mediaTypeToCheckString) {
-        List<MediaType> mediaTypesAcceptableByUser = requestHeaders.getAcceptableMediaTypes();
-        MediaType mediaTypeToCheck = MediaType.valueOf(mediaTypeToCheckString);
-        for (MediaType acceptableMediaType : mediaTypesAcceptableByUser) {
-            //Always accept application/json for backwards compatibility
-            if (mediaTypeToCheck.isCompatible(acceptableMediaType) ||
-                    MediaType.APPLICATION_JSON_TYPE.equals(acceptableMediaType)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private Response preparePropertiesResponse() throws IOException {
-        if (isMediaTypeAcceptableByUser(MT_ITEM_PROPERTIES)) {
-            return getPropertiesResponse();
-        } else {
-            return notAcceptableResponse(MT_ITEM_PROPERTIES);
-        }
-    }
-
-    private Response getPropertiesResponse() throws IOException {
-
-        ItemProperties itemProperties = new ItemProperties();
-        Properties propertiesAnnotatingItem = resolveProperties();
-        if (propertiesAnnotatingItem != null) {
-            StringList requestProperties = new StringList(queryParams().getFirst(PROPERTIES_PARAM));
-            if (!requestProperties.isEmpty()) {
-                for (String propertyName : requestProperties) {
-                    Set<String> propertySet = propertiesAnnotatingItem.get(propertyName);
-                    if ((propertySet != null) && !propertySet.isEmpty()) {
-                        itemProperties.properties.put(propertyName, Iterables.toArray(propertySet, String.class));
-                    }
-                }
-            } else {
-                for (String propertyName : propertiesAnnotatingItem.keySet()) {
-                    itemProperties.properties.put(propertyName,
-                            Iterables.toArray(propertiesAnnotatingItem.get(propertyName), String.class));
-                }
-            }
-        }
-        if (!itemProperties.properties.isEmpty()) {
-            itemProperties.slf = getRequestStorageUri();
-            return Response.ok(itemProperties, MT_ITEM_PROPERTIES)
-                    .header(org.apache.http.HttpHeaders.CACHE_CONTROL, "no-store")
-                    .build();
-        }
-        throw new NotFoundException("No properties could be found.");
-    }
-
-    private Response preparePropertiesXmlResponse() throws IOException {
-        Properties properties = resolveProperties();
-        if (properties != null && !properties.isEmpty()) {
-            return Response.ok(properties, MediaType.APPLICATION_XML)
-                    .header(org.apache.http.HttpHeaders.CACHE_CONTROL, "no-store")
-                    .build();
-        }
-        throw new NotFoundException("No properties could be found.");
-    }
-
-    private Properties resolveProperties() throws IOException {
-        fixPathIfNeeded();
-        RepoPath repoPath = RestUtils.calcRepoPathFromRequestPath(path);
-        Repo repo = repositoryService.repositoryByKey(repoPath.getRepoKey());
-        Properties properties = null;
-        if (repo == null) {
-            return properties;
-        }
-        if (repo.isLocal() || repo.isCache()) {
-            if (repo.isCache()) {
-                updateProperties(repoPath, repo);
-            }
-            properties = repositoryService.getProperties(repoPathFromRequestPath());
-        } else {
-            VirtualRepo virtualRepo = repositoryService.virtualRepositoryByKey(repoPath.getRepoKey());
-            if (virtualRepo != null) {
-                VirtualRepoItem virtualRepoItem = virtualRepo.getVirtualRepoItem(repoPath);
-                if (virtualRepoItem != null) {
-                    for (String repoKey : virtualRepoItem.getRepoKeys()) {
-                        properties = repositoryService.getProperties(new RepoPathImpl(repoKey, repoPath.getPath()));
-                        if (properties != null && !properties.isEmpty()) {
-                            return properties;
-                        }
-                    }
-                }
-            }
-        }
-        return properties;
-    }
-
-    /**
-     * Updates remote properties if cache has expired
-     *
-     * @param repoPath
-     * @param repo
-     */
-    private void updateProperties(RepoPath repoPath, Repo repo) {
-        PropertiesAddon propertiesAddon = ContextHelper.get().beanForType(AddonsManager.class)
-                .addonByType(PropertiesAddon.class);
-        propertiesAddon.updateRemoteProperties(repo, repoPath);
-    }
-
-    private void fixPathIfNeeded() {
-        // In case that the path reference to remote repository, then change the path to remote local
-        RepoPath repoPath = RestUtils.calcRepoPathFromRequestPath(path);
-        LocalRepoDescriptor descriptor = repositoryService.localOrCachedRepoDescriptorByKey(repoPath.getRepoKey());
-        if (descriptor != null && descriptor.isCache()) {
-            path = StringUtils.replaceOnce(path, repoPath.getRepoKey(), descriptor.getKey());
-        }
-    }
-
-    private Response preparePermissionsResponse() throws IOException {
-        if (isMediaTypeAcceptableByUser(MT_ITEM_PERMISSIONS)) {
-            if (isRequestToNoneLocalRepo()) {
-                throw new BadRequestException("This method can only be invoked on local repositories.");
-            }
-            return getPermissionsResponse(path);
-        } else {
-            return notAcceptableResponse(MT_ITEM_PERMISSIONS);
-        }
-    }
-
-    private Response getPermissionsResponse(String path) throws IOException {
-        try {
-            ItemPermissions itemPermissions = restAddon().getItemPermissions(request, path);
-            return okResponse(itemPermissions, MT_ITEM_PERMISSIONS);
-        } catch (IllegalArgumentException iae) {
-            throw new BadRequestException(iae.getMessage());
-        } catch (ItemNotFoundRuntimeException infre) {
-            throw new NotFoundException(infre.getMessage());
-        }
-    }
-
-    private Response prepareStorageInfoResponse() throws IOException {
-        RepoPath repoPath = repoPathFromRequestPath();
-        String repoKey = repoPath.getRepoKey();
-        RestBaseStorageInfo storageInfoRest;
-        org.artifactory.fs.ItemInfo itemInfo = null;
-        if (isLocalRepo(repoKey)) {
-            try {
-                if (!authorizationService.canRead(repoPath)) {
-                    return prepareUnAuthorizedResponse(repoPath);
-                }
-                itemInfo = repositoryService.getItemInfo(repoPath);
-            } catch (ItemNotFoundRuntimeException e) {
-                //no item found, will send 404
-            }
-        } else if (isVirtualRepo(repoKey)) {
-            VirtualRepoItem virtualRepoItem = repoBrowsingService.getVirtualRepoItem(repoPath);
-            if (virtualRepoItem == null) {
-                return Response.status(Response.Status.NOT_FOUND).build();
-            }
-            itemInfo = virtualRepoItem.getItemInfo();
-        }
-
-        if (itemInfo == null) {
-            throw new NotFoundException("Unable to find item");
-        }
-
-        storageInfoRest = createStorageInfoData(repoKey, itemInfo);
-        // we don't use the repo key from the item info because we want to set the virtual repo key if it came
-        // from a virtual repository
-        storageInfoRest.repo = repoKey;
-        if (itemInfo.isFolder()) {
-            if (isMediaTypeAcceptableByUser(MT_FOLDER_INFO)) {
-                return okResponse(storageInfoRest, MT_FOLDER_INFO);
-            } else {
-                return notAcceptableResponse(MT_FOLDER_INFO);
-
-            }
-        } else {
-            if (isMediaTypeAcceptableByUser(MT_FILE_INFO)) {
-                return okResponse(storageInfoRest, MT_FILE_INFO);
-            } else {
-                return notAcceptableResponse(MT_FILE_INFO);
-            }
-        }
-    }
-
-    private RestBaseStorageInfo createStorageInfoData(String repoKey, ItemInfo itemInfo) {
-        if (itemInfo.isFolder()) {
-            return createFolderInfoData(repoKey, (FolderInfo) itemInfo);
-        } else {
-            return createFileInfoData((FileInfo) itemInfo, repoKey);
-        }
-    }
-
-    private boolean isVirtualRepo(String repoKey) {
-        VirtualRepoDescriptor virtualRepoDescriptor = repositoryService.virtualRepoDescriptorByKey(repoKey);
-        return virtualRepoDescriptor != null;
-    }
-
-    private boolean isLocalRepo(String repoKey) {
-        LocalRepoDescriptor descriptor = repositoryService.localOrCachedRepoDescriptorByKey(repoKey);
-        return descriptor != null && !(descriptor.isCache() && !descriptor.getKey().equals(repoKey));
-    }
-
-    private String buildDownloadUrl(org.artifactory.fs.FileInfo fileInfo) {
-        LocalRepoDescriptor descriptor = repositoryService.localOrCachedRepoDescriptorByKey(fileInfo.getRepoKey());
-        if (descriptor == null || !descriptor.isCache()) {
-            return null;
-        }
-        RemoteRepoDescriptor remoteRepoDescriptor = ((LocalCacheRepoDescriptor) descriptor).getRemoteRepo();
-        StringBuilder sb = new StringBuilder(remoteRepoDescriptor.getUrl());
-        sb.append("/").append(fileInfo.getRelPath());
-        return sb.toString();
-    }
-
-
-    private RestFileInfo createFileInfoData(FileInfo itemInfo, String repoKey) {
-        RestFileInfo fileInfo = new RestFileInfo();
-        setBaseStorageInfo(fileInfo, itemInfo, repoKey);
-
-        fileInfo.mimeType = NamingUtils.getMimeTypeByPathAsString(path);
-        fileInfo.downloadUri = buildDownloadUri();
-        fileInfo.remoteUrl = buildDownloadUrl(itemInfo);
-        fileInfo.size = String.valueOf(itemInfo.getSize());
-        ChecksumsInfo checksumInfo = itemInfo.getChecksumsInfo();
-        ChecksumInfo sha1 = checksumInfo.getChecksumInfo(ChecksumType.sha1);
-        ChecksumInfo md5 = checksumInfo.getChecksumInfo(ChecksumType.md5);
-        String originalSha1 = sha1 != null ? sha1.getOriginal() : checksumInfo.getSha1();
-        String originalMd5 = md5 != null ? md5.getOriginal() : checksumInfo.getMd5();
-        String sha256 = getSha256(itemInfo.getRepoPath());
-        fileInfo.checksums = new RestFileInfo.Checksums(checksumInfo.getSha1(), checksumInfo.getMd5(), sha256);
-        fileInfo.originalChecksums = new RestFileInfo.Checksums(originalSha1, originalMd5);
-        return fileInfo;
-    }
-
-    /**
-     * get sha256 checksum property and return it
-     *
-     * @param repoPath - file repo path
-     * @return sha 256
-     */
-    private String getSha256(RepoPath repoPath) {
-        Properties properties = ContextHelper.get().getRepositoryService().getProperties(repoPath);
-        if (properties != null) {
-            String sha256 = properties.getFirst("sha256");
-            if (StringUtils.isNotBlank(sha256)) {
-                return sha256;
-            }
-        }
-        return null;
-    }
-
-    private RestFolderInfo createFolderInfoData(String repoKey, FolderInfo itemInfo) {
-        RestFolderInfo folderInfo = new RestFolderInfo();
-        setBaseStorageInfo(folderInfo, itemInfo, repoKey);
-        RepoPath folderRepoPath = InternalRepoPathFactory.create(repoKey, itemInfo.getRepoPath().getPath());
-
-        folderInfo.children = new ArrayList<>();
-
-        //if local or cache repo
-        if (isLocalRepo(repoKey)) {
-            List<ItemInfo> children = repositoryService.getChildren(folderRepoPath);
-            for (ItemInfo child : children) {
-                folderInfo.children.add(new RestFolderInfo.DirItem("/" + child.getName(), child.isFolder()));
-            }
-            //for virtual repo
-        } else {
-            List<VirtualRepoItem> virtualRepoItems = repoBrowsingService.getVirtualRepoItems(folderRepoPath);
-            for (VirtualRepoItem item : virtualRepoItems) {
-                folderInfo.children.add(new RestFolderInfo.DirItem("/" + item.getName(), item.isFolder()));
-            }
-        }
-        return folderInfo;
-    }
-
-    private void setBaseStorageInfo(RestBaseStorageInfo storageInfoRest, ItemInfo itemInfo, String repoKey) {
-        storageInfoRest.slf = RestUtils.buildStorageInfoUri(request, repoKey, itemInfo.getRelPath());
-        storageInfoRest.path = "/" + itemInfo.getRelPath();
-        storageInfoRest.created = RestUtils.toIsoDateString(itemInfo.getCreated());
-        storageInfoRest.createdBy = itemInfo.getCreatedBy();
-        storageInfoRest.lastModified = RestUtils.toIsoDateString(itemInfo.getLastModified());
-        storageInfoRest.modifiedBy = itemInfo.getModifiedBy();
-        storageInfoRest.lastUpdated = RestUtils.toIsoDateString(itemInfo.getLastUpdated());
-    }
-
-    private String buildDownloadUri() {
-        String servletContextUrl = HttpUtils.getServletContextUrl(request);
-        StringBuilder sb = new StringBuilder(servletContextUrl);
-        sb.append("/").append(path);
-        return sb.toString();
-    }
-
-    private Response okResponse(Object entity, String mediaType) {
-        return Response.ok(entity, mediaType).build();
-    }
-
-    private Response notAcceptableResponse(String producedMediaType) {
-        return Response.status(HttpStatus.SC_NOT_ACCEPTABLE).entity(
-                "Resource produces " + producedMediaType
-                        + " but client only accepts " + requestHeaders.getAcceptableMediaTypes()
-        ).build();
-    }
-
-    private boolean isRequestToNoneLocalRepo() {
-        return !isLocalRepo(repoPathFromRequestPath().getRepoKey());
-    }
-
-    private RestAddon restAddon() {
-        return addonsManager.addonByType(RestAddon.class);
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/artifact/ArtifactStatisticsResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/artifact/ArtifactStatisticsResource.java
deleted file mode 100644
index 9eaea47..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/artifact/ArtifactStatisticsResource.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.rest.resource.artifact;
-
-
-import com.google.common.base.Strings;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.rest.AuthorizationRestException;
-import org.artifactory.addon.smartrepo.SmartRepoAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.model.common.RemoteRepoPathImpl;
-import org.artifactory.model.xstream.fs.StatsImpl;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.rest.common.exception.NotFoundException;
-import org.artifactory.rest.common.util.RestUtils;
-import org.artifactory.storage.service.StatsServiceImpl;
-import org.artifactory.util.HttpUtils;
-import org.artifactory.util.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.io.IOException;
-
-import static org.artifactory.api.rest.constant.ArtifactRestConstants.*;
-
-/**
- * This resources processes remote statistics events
- *
- * @author Michael Pasternak
-*/
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at Path(PATH_ROOT + "/" + PATH_STATISTICS + "/{" + PATH_PARAM + ": .+}")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
-public class ArtifactStatisticsResource {
-
-    private static final Logger log = LoggerFactory.getLogger(ArtifactStatisticsResource.class);
-
-    @Context
-    private HttpServletRequest request;
-
-    @Autowired
-    private AuthorizationService authorizationService;
-
-    @PathParam(PATH_PARAM)
-    private String path;
-
-    @Autowired
-    private InternalRepositoryService repositoryService;
-
-    @Autowired
-    private CentralConfigService centralConfig;
-
-    @Autowired
-    private StatsServiceImpl statsService;
-    private String remoteHost;
-
-    /**
-     * Updates artifact statistics triggered by remote host
-     *
-     * @param statsInfos a collection of events for the given repository
-     *
-     * @return {@link Response}
-     *
-     * @throws IOException when artifact is not exist/readable
-     */
-    @PUT
-    @Consumes({MediaType.APPLICATION_JSON})
-    public Response updateRemoteStats(StatsImpl[] statsInfos) throws IOException {
-
-        // host initiated the download request
-        String origin = getRemoteHost();
-
-        for (StatsImpl statsInfo : statsInfos) {
-
-            log.debug(
-                    "Processing remote statistics event (triggered by host \"{}\") on artifact \"{}\".",
-                    origin, statsInfo.getPath()
-            );
-
-            // cache RepoPath
-            RepoPath repoPathInCache = RestUtils.calcRepoPathFromRequestPath(
-                    path + "/" + statsInfo.getRepoPath()
-            );
-            RepoPath remoteCacheRepoPath = RemoteRepoPathImpl.newInstance(origin, repoPathInCache);
-
-            // local RepoPath
-            RepoPath repoPathInLocal = RepoPathFactory.create(
-                    StringUtils.replaceLast(remoteCacheRepoPath.getRepoKey(), "-cache", ""),
-                    remoteCacheRepoPath.getPath()
-            );
-            RepoPath remoteLocalRepoPath = RemoteRepoPathImpl.newInstance(origin, repoPathInLocal);
-
-            boolean existsInCache = repositoryService.exists(remoteCacheRepoPath);
-            boolean existsInLocal = repositoryService.exists(repoPathInLocal);
-
-            if (!existsInCache && !existsInLocal) {
-                return Response.status(Response.Status.BAD_REQUEST)
-                        .entity("RepoPath {" + repoPathInCache + "} is not exist in this repository")
-                        .build();
-            }
-
-            RepoPath repoPath = existsInCache ? remoteCacheRepoPath : remoteLocalRepoPath;
-
-            if (!authorizationService.canRead(repoPath)) {
-                return unAuthorizedResponse(repoPath);
-            } else {
-                log.debug("User has READ permissions for resource {}, continuing ...", repoPath);
-            }
-
-            log.debug(
-                    "Updating remote statistics (triggered by host \"{}\") on artifact \"{}\".",
-                    origin, repoPath
-            );
-
-            AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-            SmartRepoAddon smartRepoAddon = addonsManager.addonByType(SmartRepoAddon.class);
-            smartRepoAddon.fileDownloadedRemotely(statsInfo, origin, repoPath);
-        }
-        return Response.ok().build();
-    }
-
-    /**
-     * Makes a best effort to fetch remote host name from request
-     *
-     * @return origin host
-     */
-    private String getRemoteHost() {
-        String origin = request.getRemoteHost();
-        // TODO: [MP] send host name on request (this will prevent reporting proxy as "origin")
-        if (Strings.isNullOrEmpty(origin)) {
-            log.warn("Fetching remote host name from request has failed, " +
-                    "trying \"X-Forwarded-For\" approach instead ...");
-            origin = HttpUtils.getRemoteClientAddress(request);
-            if (Strings.isNullOrEmpty(origin)) {
-                log.warn("Fetching remote host name by \"X-Forwarded-For\" has failed, " +
-                        "trying \"X-Artifactory-Originated\" approach instead ...");
-                origin = request.getHeader("X-Artifactory-Originated");
-                if (Strings.isNullOrEmpty(origin)) {
-                    log.error("Fetching remote host name by \"X-Artifactory-Originated\"" +
-                            " has failed, setting origin = \"Unknown\"");
-                    origin = "UNKNOWN";
-                }
-            }
-        }
-        return origin;
-    }
-
-    /**
-     * Prepares appropriate response
-     *
-     * @param unAuthorizedResource
-     * @return
-     * @throws IOException
-     */
-    private Response unAuthorizedResponse(RepoPath unAuthorizedResource) throws IOException {
-        boolean hideUnauthorizedResources = centralConfig.getDescriptor().getSecurity().isHideUnauthorizedResources();
-        if (hideUnauthorizedResources) {
-            throw new NotFoundException("Resource not found");
-        } else {
-            throw new AuthorizationRestException("Request for '" + unAuthorizedResource + "' is forbidden for user '" +
-                    authorizationService.currentUsername() + "'.");
-        }
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/artifact/CopyResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/artifact/CopyResource.java
deleted file mode 100644
index ac71bb7..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/artifact/CopyResource.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.artifact;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.rest.RestAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.rest.constant.ArtifactRestConstants;
-import org.artifactory.api.security.AuthorizationService;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import static org.artifactory.api.rest.constant.ArtifactRestConstants.PATH_COPY;
-
-/**
- * REST API used to copy an artifact from one path to another.
- *
- * @author Tomer Cohen
- */
- at Component
- at Scope(BeanDefinition.SCOPE_SINGLETON)
- at Path(PATH_COPY)
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
-public class CopyResource {
-
-    /**
-     * Copy an item (file or folder) from one path to another.
-     *
-     * @param path            The source path.
-     * @param target          The target path.
-     * @param dryRun          Flag whether to perform a dry run before executing the actual copy.
-     * @param suppressLayouts Flag to indicate whether path translation across different layouts should be suppressed.
-     * @param failFast        Flag to indicate whether the operation should fail upon encountering an error.
-     * @return The operation result
-     * @throws Exception
-     */
-    @POST
-    @Path("{path: .+}")
-    @Produces({ArtifactRestConstants.MT_COPY_MOVE_RESULT, MediaType.APPLICATION_JSON})
-    public Response copy(
-            // The path of the source item to be moved/copied
-            @PathParam("path") String path,
-            // The target repository to to move/copy the item.
-            @QueryParam(ArtifactRestConstants.PARAM_TARGET) String target,
-            // Flag to indicate whether to perform a dry run first. default false
-            @QueryParam(ArtifactRestConstants.PARAM_DRY_RUN) int dryRun,
-            // Flag to indicate whether path translation across different layouts should be suppressed. default true
-            @DefaultValue("1") @QueryParam(ArtifactRestConstants.PARAM_SUPPRESS_LAYOUTS) int suppressLayouts,
-            //Flag to indicate whether the operation should fail upon encountering an error. default false
-            @QueryParam(ArtifactRestConstants.PARAM_FAIL_FAST) int failFast,
-            @QueryParam(ArtifactRestConstants.PARAM_ATOMIC) String atomic) throws Exception {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        return addonsManager.addonByType(RestAddon.class).copy(path, target, dryRun, suppressLayouts, failFast, atomic);
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/artifact/MoveResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/artifact/MoveResource.java
deleted file mode 100644
index 42d6ce7..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/artifact/MoveResource.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.artifact;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.rest.RestAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.rest.constant.ArtifactRestConstants;
-import org.artifactory.api.security.AuthorizationService;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import static org.artifactory.api.rest.constant.ArtifactRestConstants.PATH_MOVE;
-
-/**
- * REST API used to move an artifact from one path to another.
- *
- * @author Tomer Cohen
- */
- at Component
- at Scope(BeanDefinition.SCOPE_SINGLETON)
- at Path(PATH_MOVE)
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
-public class MoveResource {
-
-    /**
-     * Move an item (file or folder) from one path to another.
-     *
-     * @param path            The source path.
-     * @param target          The target path.
-     * @param dryRun          Flag whether to perform a dry run before executing the actual move.
-     * @param suppressLayouts Flag to indicate whether path translation across different layouts should be suppressed.
-     * @param failFast        Flag to indicate whether the operation should fail upon encountering an error.
-     * @return The operation result
-     * @throws Exception
-     */
-    @POST
-    @Path("{path: .+}")
-    @Produces({ArtifactRestConstants.MT_COPY_MOVE_RESULT, MediaType.APPLICATION_JSON})
-    public Response move(
-            // The path of the source item to be moved/copied
-            @PathParam("path") String path,
-            // The target path to to move/copy the item.
-            @QueryParam(ArtifactRestConstants.PARAM_TARGET) String target,
-            // Flag to indicate whether to perform a dry run first. default false
-            @QueryParam(ArtifactRestConstants.PARAM_DRY_RUN) int dryRun,
-            // Flag to indicate whether path translation across different layouts should be suppressed. default true
-            @DefaultValue("1") @QueryParam(ArtifactRestConstants.PARAM_SUPPRESS_LAYOUTS) int suppressLayouts,
-            //Flag to indicate whether the operation should fail upon encountering an error. default false
-            @QueryParam(ArtifactRestConstants.PARAM_FAIL_FAST) int failFast,
-            @QueryParam(ArtifactRestConstants.PARAM_ATOMIC) String atomic) throws Exception {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        return addonsManager.addonByType(RestAddon.class).move(path, target, dryRun, suppressLayouts, failFast, atomic);
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/artifact/legacy/DownloadResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/artifact/legacy/DownloadResource.java
deleted file mode 100644
index 8fa04f0..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/artifact/legacy/DownloadResource.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.artifact.legacy;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.rest.RestAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.rest.constant.ArtifactRestConstants;
-import org.artifactory.api.security.AuthorizationService;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-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.Response;
-
-import static org.artifactory.api.rest.constant.ArtifactRestConstants.PATH_DOWNLOAD;
-
-/**
- * REST API for downloading an artifact
- *
- * @author Yoav Landman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at Path(PATH_DOWNLOAD)
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
-public class DownloadResource {
-
-    @Context
-    HttpServletResponse httpResponse;
-
-    public enum Content {
-        //Name casing must match the param name (cannot do b y overriding toString())
-        none, progress
-    }
-
-    /**
-     * Download an artifact
-     *
-     * @param path    The path of the source artifact to be downloaded
-     * @param content The content handling policy (none/progress)
-     * @param mark    Every how many bytes to print a progress mark (when using progress tracking policy)
-     * @deprecated Use {@link org.artifactory.rest.resource.replication.ReplicationResource} instead
-     */
-    @GET
-    @Path("{path: .+}")
-    @Produces({MediaType.APPLICATION_OCTET_STREAM, MediaType.TEXT_PLAIN})
-    public Response downloadArtifactOrFolder(
-            @PathParam("path") String path,
-            @QueryParam(ArtifactRestConstants.PARAM_CONTENT) Content content,
-            @QueryParam(ArtifactRestConstants.PARAM_MARK) int mark) throws Exception {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        return addonsManager.addonByType(RestAddon.class).download(path, content, mark, httpResponse);
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/bintray/BintrayResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/bintray/BintrayResource.java
deleted file mode 100644
index 0992dc0..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/bintray/BintrayResource.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.bintray;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.docker.DockerAddon;
-import org.artifactory.addon.rest.AuthorizationRestException;
-import org.artifactory.api.bintray.BintrayService;
-import org.artifactory.api.bintray.docker.BintrayDockerPushRequest;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.rest.constant.BintrayRestConstants;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.rest.common.exception.BadRequestException;
-import org.artifactory.rest.common.util.BintrayRestHelper;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.*;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.io.IOException;
-
-/**
- * A resource for Bintray actions
- *
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at Path(BintrayRestConstants.PATH_ROOT)
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
-public class BintrayResource {
-
-    @Autowired
-    private InternalRepositoryService repositoryService;
-
-    @Autowired
-    private BintrayService bintrayService;
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Context
-    private HttpServletRequest request;
-
-    /**
-     * Pushes a version to Bintray according to the file paths that are specified in the JSON file, if no paths are
-     * specified pushes the entire directory tree that resides under the folder containing the json file
-     *
-     * @param descriptor    full path to the Json spec file containing version and package info and the list of files
-     * @param gpgPassphrase (optional) the Passphrase to use in conjunction with the key stored in Bintray to
-     *                      sign the version
-     * @return result of the operation
-     */
-    @POST
-    @Path("push")
-    @Produces({BintrayRestConstants.MT_BINTRAY_PUSH_RESPONSE, MediaType.APPLICATION_JSON})
-    public Response pushVersionToBintrayAccordingToSpec(
-            @QueryParam("descriptor") String descriptor,
-            @QueryParam("gpgSign") Boolean gpgSignOverride,
-            @QueryParam("gpgPassphrase") String gpgPassphrase) throws IOException {
-
-        BasicStatusHolder status = new BasicStatusHolder();
-        if (!BintrayRestHelper.isPushToBintrayAllowed(status, null)) {
-            throw new AuthorizationRestException(status.getLastError().getMessage());
-        }
-        FileInfo jsonFile = repositoryService.getFileInfo(InternalRepoPathFactory.create(descriptor));
-        status.merge(bintrayService.pushVersionFilesAccordingToSpec(jsonFile, gpgSignOverride, gpgPassphrase));
-        return BintrayRestHelper.createAggregatedResponse(status, " version according to spec at: " + descriptor, false);
-    }
-
-    @POST
-    @Path("docker/push/{repoKey}")
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response pushDockerTag(@PathParam("repoKey") String repoKey, BintrayDockerPushRequest request) throws IOException {
-        BasicStatusHolder status = new BasicStatusHolder();
-        if (!BintrayRestHelper.isPushToBintrayAllowed(status, null)) {
-            throw new AuthorizationRestException(status.getLastError().getMessage());
-        }
-
-        if (StringUtils.isBlank(request.dockerRepository) || StringUtils.isBlank(request.dockerTagName)) {
-            throw new BadRequestException("You must provide dockerRepository and dockerTagName");
-        }
-
-        if (StringUtils.isBlank(request.bintraySubject) || StringUtils.isBlank(request.bintrayRepo)) {
-            throw new BadRequestException("You must provide bintraySubject and bintrayRepo");
-        }
-        try {
-            DockerAddon dockerAddon = addonsManager.addonByType(DockerAddon.class);
-            dockerAddon.pushTagToBintray(repoKey, request, null);
-            return request.async ?
-                    Response.status(HttpStatus.SC_ACCEPTED).entity("Docker tag pushing to Bintray accepted.").build()
-                    : Response.ok("Docker tag successfully pushed to Bintray").build();
-        } catch (IllegalArgumentException e) {
-            throw new BadRequestException(e.getMessage());
-        }
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/ci/BuildResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/ci/BuildResource.java
deleted file mode 100644
index 139e310..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/ci/BuildResource.java
+++ /dev/null
@@ -1,536 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.ci;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Sets;
-import com.sun.jersey.api.core.ExtendedUriInfo;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.rest.AuthorizationRestException;
-import org.artifactory.addon.rest.RestAddon;
-import org.artifactory.api.bintray.BintrayService;
-import org.artifactory.api.bintray.distribution.Distribution;
-import org.artifactory.api.bintray.distribution.DistributionService;
-import org.artifactory.api.build.BuildRunComparators;
-import org.artifactory.api.build.BuildService;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.repo.exception.ItemNotFoundRuntimeException;
-import org.artifactory.api.rest.artifact.PromotionResult;
-import org.artifactory.api.rest.build.BuildInfo;
-import org.artifactory.api.rest.build.Builds;
-import org.artifactory.api.rest.build.BuildsByName;
-import org.artifactory.api.rest.constant.BintrayRestConstants;
-import org.artifactory.api.rest.constant.BuildRestConstants;
-import org.artifactory.api.rest.constant.RestConstants;
-import org.artifactory.api.search.SearchService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.build.BuildRun;
-import org.artifactory.build.DetailedBuildRunImpl;
-import org.artifactory.build.InternalBuildService;
-import org.artifactory.exception.CancelException;
-import org.artifactory.rest.common.exception.BadRequestException;
-import org.artifactory.rest.common.exception.NotFoundException;
-import org.artifactory.rest.common.exception.RestException;
-import org.artifactory.rest.common.list.StringList;
-import org.artifactory.rest.common.util.BintrayRestHelper;
-import org.artifactory.rest.common.util.BuildResourceHelper;
-import org.artifactory.rest.common.util.RestUtils;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-import org.artifactory.util.DoesNotExistException;
-import org.jfrog.build.api.Build;
-import org.jfrog.build.api.BuildRetention;
-import org.jfrog.build.api.Module;
-import org.jfrog.build.api.dependency.BuildPatternArtifacts;
-import org.jfrog.build.api.dependency.BuildPatternArtifactsRequest;
-import org.jfrog.build.api.release.BintrayUploadInfoOverride;
-import org.jfrog.build.api.release.Promotion;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Nullable;
-import javax.annotation.security.RolesAllowed;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.*;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.Response;
-import java.io.IOException;
-import java.net.URLDecoder;
-import java.text.ParseException;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Set;
-
-import static com.google.common.collect.Lists.transform;
-import static org.artifactory.rest.common.util.BintrayRestHelper.createAggregatedResponse;
-import static org.artifactory.rest.common.util.RestUtils.getServletContextUrl;
-
-/**
- * A resource to manage the build actions
- *
- * @author Noam Y. Tenne
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at Path(BuildRestConstants.PATH_ROOT)
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
-public class BuildResource {
-
-    private static final Logger log = LoggerFactory.getLogger(BuildResource.class);
-    @Autowired
-    private AddonsManager addonsManager;
-    @Autowired
-    private BuildService buildService;
-    @Autowired
-    private AuthorizationService authorizationService;
-    @Autowired
-    private SearchService searchService;
-    @Autowired
-    private BintrayService bintrayService;
-    @Autowired
-    DistributionService distributionService;
-    @Context
-    private HttpServletRequest request;
-    @Context
-    private HttpServletResponse response;
-    @Context
-    private ExtendedUriInfo uriInfo;
-
-    public static final String anonAccessDisabledMsg = "Anonymous access to build info is disabled";
-
-    /**
-     * Assemble all, last created, available builds with the last
-     *
-     * @return Builds json object
-     */
-    @GET
-    @Produces({BuildRestConstants.MT_BUILDS, MediaType.APPLICATION_JSON})
-    public Builds getAllBuilds() throws IOException {
-        if (authorizationService.isAnonUserAndAnonBuildInfoAccessDisabled()) {
-            throw new AuthorizationRestException(anonAccessDisabledMsg);
-        }
-        Set<BuildRun> latestBuildsByName = searchService.getLatestBuilds();
-        if (!latestBuildsByName.isEmpty()) {
-            //Add our builds to the list of build resources
-            Builds builds = new Builds();
-            builds.slf = RestUtils.getBaseBuildsHref(request);
-
-            for (BuildRun buildRun : latestBuildsByName) {
-                String buildHref = RestUtils.getBuildRelativeHref(buildRun.getName());
-                builds.builds.add(new Builds.Build(buildHref, buildRun.getStarted()));
-            }
-            return builds;
-
-        }
-
-        throw new NotFoundException("No builds were found");
-    }
-
-    /**
-     * Get the build name from the request url and assemble all builds under that name.
-     *
-     * @return BuildsByName json object
-     */
-    @GET
-    @Path("/{buildName: .+}")
-    @Produces({BuildRestConstants.MT_BUILDS_BY_NAME, MediaType.APPLICATION_JSON})
-    public BuildsByName getAllSpecificBuilds(@PathParam("buildName") String buildName) throws IOException {
-        if (authorizationService.isAnonUserAndAnonBuildInfoAccessDisabled()) {
-            throw new AuthorizationRestException(anonAccessDisabledMsg);
-        }
-        Set<BuildRun> buildsByName;
-        try {
-            buildsByName = buildService.searchBuildsByName(buildName);
-        } catch (RepositoryRuntimeException e) {
-            buildsByName = Sets.newHashSet();
-        }
-        if (!buildsByName.isEmpty()) {
-            BuildsByName builds = new BuildsByName();
-            builds.slf = RestUtils.getBaseBuildsHref(request) + RestUtils.getBuildRelativeHref(buildName);
-            for (BuildRun buildRun : buildsByName) {
-                String versionHref = RestUtils.getBuildNumberRelativeHref(buildRun.getNumber());
-                builds.buildsNumbers.add(new BuildsByName.Build(versionHref, buildRun.getStarted()));
-            }
-            return builds;
-        }
-
-        throw new NotFoundException(String.format("No build was found for build name: %s", buildName));
-    }
-
-    /**
-     * Get the build name and number from the request url and send back the exact build for those parameters
-     *
-     * @return BuildInfo json object
-     */
-    @GET
-    @Path("/{buildName: .+}/{buildNumber: .+}")
-    @Produces({BuildRestConstants.MT_BUILD_INFO, BuildRestConstants.MT_BUILDS_DIFF, MediaType.APPLICATION_JSON})
-    public Response getBuildInfo(
-            @PathParam("buildName") String buildName,
-            @PathParam("buildNumber") String buildNumber,
-            @QueryParam("started") String buildStarted,
-            @QueryParam("diff") String diffNumber) throws IOException {
-
-        if (authorizationService.isAnonUserAndAnonBuildInfoAccessDisabled()) {
-            throw new AuthorizationRestException(anonAccessDisabledMsg);
-        }
-        if (!authorizationService.canDeployToLocalRepository()) {
-            throw new AuthorizationRestException();
-        }
-
-        Build build = null;
-        if (StringUtils.isNotBlank(buildStarted)) {
-            BuildRun buildRun = buildService.getBuildRun(buildName, buildNumber, buildStarted);
-            if (buildRun != null) {
-                build = buildService.getBuild(buildRun);
-            }
-        } else {
-            build = buildService.getLatestBuildByNameAndNumber(buildName, buildNumber);
-        }
-
-        if (build == null) {
-            String msg = String.format("No build was found for build name: %s, build number: %s %s",
-                    buildName, buildNumber,
-                    StringUtils.isNotBlank(buildStarted) ? ", build started: " + buildStarted : "");
-            throw new NotFoundException(msg);
-        }
-
-        if (queryParamsContainKey("diff")) {
-            Build secondBuild = buildService.getLatestBuildByNameAndNumber(buildName, diffNumber);
-            if (secondBuild == null) {
-                throw new NotFoundException(String.format("No build was found for build name: %s , build number: %s ",
-                        buildName, diffNumber));
-            }
-            BuildRun buildRun = buildService.getBuildRun(build.getName(), build.getNumber(), build.getStarted());
-            BuildRun secondBuildRun = buildService.getBuildRun(secondBuild.getName(), secondBuild.getNumber(),
-                    secondBuild.getStarted());
-            Comparator<BuildRun> comparator = BuildRunComparators.getBuildStartDateComparator();
-            if (comparator.compare(buildRun, secondBuildRun) < 0) {
-                throw new BadRequestException(
-                        "Build number should be greater than the build number to compare against.");
-            }
-            return prepareBuildDiffResponse(build, secondBuild, request);
-        } else {
-            return prepareGetBuildResponse(build);
-        }
-    }
-
-    private Response prepareGetBuildResponse(Build build) throws IOException {
-        BuildInfo buildInfo = new BuildInfo();
-        buildInfo.slf = RestUtils.getBuildInfoHref(request, build.getName(), build.getNumber());
-        buildInfo.buildInfo = build;
-
-        return Response.ok(buildInfo).build();
-    }
-
-    private Response prepareBuildDiffResponse(Build firstBuild, Build secondBuild, HttpServletRequest request) {
-        RestAddon restAddon = addonsManager.addonByType(RestAddon.class);
-        return restAddon.getBuildsDiff(firstBuild, secondBuild, request);
-    }
-
-    /**
-     * Returns the outputs of build matching the request
-     *
-     * @param buildPatternArtifactsRequests contains build name and build number or keyword
-     * @return build outputs (build dependencies and generated artifacts).
-     * The returned array will always be the same size as received, returning nulls on non-found builds.
-     */
-    @POST
-    @Path("/patternArtifacts")
-    @Consumes({BuildRestConstants.MT_BUILD_PATTERN_ARTIFACTS_REQUEST, RestConstants.MT_LEGACY_ARTIFACTORY_APP,
-            MediaType.APPLICATION_JSON})
-    @Produces({BuildRestConstants.MT_BUILD_PATTERN_ARTIFACTS_RESULT, MediaType.APPLICATION_JSON})
-    public List<BuildPatternArtifacts> getBuildPatternArtifacts(
-            final List<BuildPatternArtifactsRequest> buildPatternArtifactsRequests) {
-
-        if (authorizationService.isAnonUserAndAnonBuildInfoAccessDisabled()) {
-            throw new AuthorizationRestException(anonAccessDisabledMsg);
-        }
-        final RestAddon restAddon = addonsManager.addonByType(RestAddon.class);
-        final String contextUrl = getServletContextUrl(request);
-        return transform(buildPatternArtifactsRequests,
-                new Function<BuildPatternArtifactsRequest, BuildPatternArtifacts>() {
-                    @Override
-                    public BuildPatternArtifacts apply(BuildPatternArtifactsRequest input) {
-                        return restAddon.getBuildPatternArtifacts(input, contextUrl);
-                    }
-                }
-        );
-    }
-
-
-    /**
-     * Adds the given build information to the DB
-     *
-     * @param build Build to add
-     */
-    @PUT
-    @Consumes({BuildRestConstants.MT_BUILD_INFO, RestConstants.MT_LEGACY_ARTIFACTORY_APP, MediaType.APPLICATION_JSON})
-    public void addBuild(Build build) throws Exception {
-        log.info("Adding build '{} #{}'", build.getName(), build.getNumber());
-        if (authorizationService.isAnonUserAndAnonBuildInfoAccessDisabled()) {
-            throw new AuthorizationRestException(anonAccessDisabledMsg);
-        }
-        if (!authorizationService.canDeployToLocalRepository()) {
-            throw new AuthorizationRestException();
-        }
-
-        try {
-            buildService.addBuild(build);
-        } catch (CancelException e) {
-            if (log.isDebugEnabled()) {
-                log.debug("An error occurred while adding the build '" + build.getName() + " #" + build.getNumber() +
-                        "'.", e);
-            }
-            throw new RestException(e.getErrorCode(), e.getMessage());
-        }
-        log.info("Added build '{} #{}'", build.getName(), build.getNumber());
-        BuildRetention retention = build.getBuildRetention();
-        if (retention != null) {
-            RestAddon restAddon = addonsManager.addonByType(RestAddon.class);
-            BasicStatusHolder multiStatusHolder = new BasicStatusHolder();
-            restAddon.discardOldBuilds(build.getName(), retention, multiStatusHolder);
-            if (multiStatusHolder.hasErrors()) {
-                throw new RestException("Errors have occurred while maintaining " +
-                        "build retention. Please review the system logs for further information.");
-            } else if (multiStatusHolder.hasWarnings()) {
-                throw new RestException("Warnings have been produced while " +
-                        "maintaining build retention. Please review the system logs for further information.");
-            }
-        }
-    }
-
-    /**
-     * Adds the given module information to an existing build
-     *
-     * @param buildName   The name of the parent build that should receive the module
-     * @param buildNumber The number of the parent build that should receive the module
-     * @param modules     Modules to add
-     */
-    @POST
-    @Path("/append/{buildName: .+}/{buildNumber: .+}")
-    @Consumes({BuildRestConstants.MT_BUILD_INFO_MODULE, RestConstants.MT_LEGACY_ARTIFACTORY_APP, MediaType.APPLICATION_JSON})
-    public void addModule(@PathParam("buildName") String buildName,
-            @PathParam("buildNumber") String buildNumber,
-            @QueryParam("started") String buildStarted,
-            List<Module> modules) throws Exception {
-        log.info("Adding module to build '{} #{}'", buildName, buildNumber);
-        if (authorizationService.isAnonUserAndAnonBuildInfoAccessDisabled()) {
-            throw new AuthorizationRestException(anonAccessDisabledMsg);
-        }
-        if (!authorizationService.canDeployToLocalRepository()) {
-            throw new AuthorizationRestException();
-        }
-
-        Build build = null;
-        if (StringUtils.isNotBlank(buildStarted)) {
-            BuildRun buildRun = buildService.getBuildRun(buildName, buildNumber, buildStarted);
-            if (buildRun != null) {
-                build = buildService.getBuild(buildRun);
-            }
-        } else {
-            build = buildService.getLatestBuildByNameAndNumber(buildName, buildNumber);
-        }
-
-        if (build == null) {
-            throw new NotFoundException("No builds were found");
-        }
-
-        build.getModules().addAll(modules);
-
-        try {
-            ((InternalBuildService) buildService).updateBuild(new DetailedBuildRunImpl(build));
-        } catch (CancelException e) {
-            if (log.isDebugEnabled()) {
-                log.debug("An error occurred while adding a module to the build '" + build.getName() + " #" +
-                        build.getNumber() + "'.", e);
-            }
-            throw new RestException(e.getErrorCode(), e.getMessage());
-        }
-    }
-
-    /**
-     * Promotes a build
-     *
-     * @param buildName   Name of build to promote
-     * @param buildNumber Number of build to promote
-     * @param promotion   Promotion settings
-     * @return Promotion result
-     */
-    @POST
-    @Path("/promote/{buildName: .+}/{buildNumber: .+}")
-    @Consumes({BuildRestConstants.MT_PROMOTION_REQUEST, MediaType.APPLICATION_JSON})
-    @Produces({BuildRestConstants.MT_PROMOTION_RESULT, MediaType.APPLICATION_JSON})
-    public Response promote(
-            @PathParam("buildName") String buildName,
-            @PathParam("buildNumber") String buildNumber, Promotion promotion) throws IOException {
-
-        if (authorizationService.isAnonUserAndAnonBuildInfoAccessDisabled()) {
-            throw new AuthorizationRestException(anonAccessDisabledMsg);
-        }
-        RestAddon restAddon = addonsManager.addonByType(RestAddon.class);
-        try {
-            if (RestUtils.shouldDecodeParams(request)) {
-                buildName = URLDecoder.decode(buildName, "UTF-8");
-                buildNumber = URLDecoder.decode(buildNumber, "UTF-8");
-            }
-            PromotionResult promotionResult = restAddon.promoteBuild(buildName, buildNumber, promotion);
-            return Response.status(promotionResult.errorsOrWarningHaveOccurred() ?
-                    HttpStatus.SC_BAD_REQUEST : HttpStatus.SC_OK).entity(promotionResult).build();
-        } catch (IllegalArgumentException | ItemNotFoundRuntimeException iae) {
-            throw new BadRequestException(iae.getMessage());
-        } catch (DoesNotExistException dnee) {
-            throw new NotFoundException(dnee.getMessage());
-        } catch (ParseException pe) {
-            throw new RestException("Unable to parse given build start date: " + pe.getMessage());
-        }
-    }
-
-    /**
-     * Renames structure, content and properties of build info objects
-     *
-     * @param to Replacement build name
-     */
-    @POST
-    @Path("/rename/{buildName: .+}")
-    public String renameBuild(
-            @PathParam("buildName") String buildName,
-            @QueryParam("to") String to) throws IOException {
-
-        if (authorizationService.isAnonUserAndAnonBuildInfoAccessDisabled()) {
-            throw new AuthorizationRestException(anonAccessDisabledMsg);
-        }
-        RestAddon restAddon = addonsManager.addonByType(RestAddon.class);
-        try {
-            String from;
-            if (RestUtils.shouldDecodeParams(request)) {
-                from = URLDecoder.decode(buildName, "UTF-8");
-            } else {
-                from = buildName;
-            }
-            restAddon.renameBuilds(from, to);
-
-            response.setStatus(HttpStatus.SC_OK);
-
-            return String.format("Build renaming of '%s' to '%s' was successfully started.\n", from, to);
-        } catch (IllegalArgumentException iae) {
-            throw new BadRequestException(iae.getMessage());
-        } catch (DoesNotExistException dnne) {
-            throw new NotFoundException(dnne.getMessage());
-        }
-    }
-
-    /**
-     * Removes the build with the given name and number
-     *
-     * @return Status message
-     */
-    @DELETE
-    @Path("/{buildName: .+}")
-    public void deleteBuilds(
-            @PathParam("buildName") String buildName,
-            @QueryParam("artifacts") int artifacts,
-            @QueryParam("buildNumbers") StringList buildNumbers,
-            @QueryParam("deleteAll") int deleteAll) throws IOException {
-        RestAddon restAddon = addonsManager.addonByType(RestAddon.class);
-        try {
-            if (RestUtils.shouldDecodeParams(request)) {
-                buildName = URLDecoder.decode(buildName, "UTF-8");
-            }
-
-            restAddon.deleteBuilds(response, buildName, buildNumbers, artifacts, deleteAll);
-        } catch (IllegalArgumentException iae) {
-            throw new BadRequestException(iae.getMessage());
-        } catch (DoesNotExistException dnne) {
-            throw new NotFoundException(dnne.getMessage());
-        }
-        response.flushBuffer();
-    }
-
-    /**
-     * Pushes a build to Bintray, expects to find the bintrayBuildInfo.json as one of the build's artifacts
-     *
-     * @param buildName     Name of build to promote
-     * @param buildNumber   Number of build to promote
-     * @param gpgPassphrase (optional) the Passphrase to use in conjunction with the key stored in Bintray to
-     *                      sign the version
-     * @return result of the operation
-     */
-    @POST
-    @Path("/pushToBintray/{buildName: .+}/{buildNumber: .+}")
-    @Consumes({BuildRestConstants.MT_BINTRAY_DESCRIPTOR_OVERRIDE, MediaType.APPLICATION_JSON})
-    @Produces({BintrayRestConstants.MT_BINTRAY_PUSH_RESPONSE, MediaType.APPLICATION_JSON})
-    @Deprecated //use distribute
-    public Response pushToBintray(@PathParam("buildName") String buildName,
-            @PathParam("buildNumber") String buildNumber,
-            @QueryParam("gpgPassphrase") @Nullable String gpgPassphrase,
-            @QueryParam("gpgSign") @Nullable Boolean gpgSignOverride,
-            @Nullable BintrayUploadInfoOverride override) throws IOException {
-
-        BasicStatusHolder status = new BasicStatusHolder();
-        String buildId = buildName + " #" + buildNumber;
-        if (!BintrayRestHelper.isPushToBintrayAllowed(status, null)) {
-            throw new AuthorizationRestException(status.getLastError().getMessage());
-        }
-        Build build = BuildResourceHelper.getBuild(buildName, buildNumber, status);
-        if (!status.isError()) {
-            status.merge(bintrayService.pushPromotedBuild(build, gpgPassphrase, gpgSignOverride, override));
-        }
-        return createAggregatedResponse(status, buildId, false);
-    }
-
-    @POST
-    @Path("/distribute/{buildName: .+}/{buildNumber: .+}")
-    @Consumes({BuildRestConstants.MT_DISTRIBUTION, MediaType.APPLICATION_JSON})
-    @Produces({BintrayRestConstants.MT_BINTRAY_PUSH_RESPONSE, MediaType.APPLICATION_JSON})
-    public Response distributeBuild(Distribution distribution,
-            @PathParam("buildName") String buildName,
-            @PathParam("buildNumber") String buildNumber) {
-
-        BasicStatusHolder status = new BasicStatusHolder();
-        String buildId = buildName + " #" + buildNumber;
-        if (!BintrayRestHelper.isPushToBintrayAllowed(status, distribution.getTargetRepo())) {
-            throw new AuthorizationRestException(status.getLastError().getMessage());
-        }
-        Build build = BuildResourceHelper.getBuild(buildName, buildNumber, status);
-        BuildResourceHelper.populateBuildPaths(build, distribution, status);
-        if (status.isError()) {
-            return createAggregatedResponse(status, buildId, false);
-        }
-        status.merge(distributionService.distribute(distribution));
-        return createAggregatedResponse(status, buildId, distribution.isAsync());
-    }
-
-    private boolean queryParamsContainKey(String key) {
-        MultivaluedMap<String, String> queryParameters = queryParams();
-        return queryParameters.containsKey(key);
-    }
-
-    private MultivaluedMap<String, String> queryParams() {
-        return uriInfo.getQueryParameters();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/distribution/DistributionResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/distribution/DistributionResource.java
deleted file mode 100644
index d924ac1..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/distribution/DistributionResource.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.distribution;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.rest.AuthorizationRestException;
-import org.artifactory.api.bintray.distribution.Distribution;
-import org.artifactory.api.bintray.distribution.DistributionService;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.rest.constant.BintrayRestConstants;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.util.BintrayRestHelper;
-import org.artifactory.util.CollectionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Nullable;
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import static org.apache.http.HttpStatus.SC_BAD_REQUEST;
-import static org.artifactory.rest.common.util.BintrayRestHelper.createAggregatedResponse;
-import static org.artifactory.rest.resource.distribution.DistributionResourceConstants.MT_DISTRIBUTION;
-
-/**
- * This endpoint provides all distribution actions separated by package type being pushed.
- * Each endpoint relies on the specific package metadata and runs only the relevant rules in the repo.
- *
- * @author Dan Feldman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at Path("distribute")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
-public class DistributionResource {
-    private static final Logger log = LoggerFactory.getLogger(DistributionResource.class);
-
-    @Autowired
-    private DistributionService distributionService;
-
-    /**
-     * Distributes a set of paths to Bintray using the params specified in {@param distribution} and the dist repo's
-     * rule set. if {@param gpgPassphrase} was passed it will be used as an override and the each created version will
-     * be signed with it.
-     *
-     * @return Status of the operation
-     */
-    @POST
-    @Consumes({MT_DISTRIBUTION, MediaType.APPLICATION_JSON})
-    @Produces({BintrayRestConstants.MT_BINTRAY_PUSH_RESPONSE, MediaType.APPLICATION_JSON})
-    public Response distribute(@QueryParam("gpgPassphrase") @Nullable String gpgPassphrase, Distribution distribution) {
-        BasicStatusHolder status = new BasicStatusHolder();
-        validateParams(distribution, status);
-        if (status.isError()) {
-            return createAggregatedResponse(status, "the requested artifacts", false);
-        }
-        if (StringUtils.isNotEmpty(gpgPassphrase)) {
-            distribution.setGpgPassphrase(gpgPassphrase);
-        }
-        status.merge(distributionService.distribute(distribution));
-        return createAggregatedResponse(status, "the requested artifacts", distribution.isAsync());
-    }
-
-    private void validateParams(Distribution distribution, BasicStatusHolder status) {
-        if (!BintrayRestHelper.isPushToBintrayAllowed(status, distribution.getTargetRepo())) {
-            throw new AuthorizationRestException(status.getLastError().getMessage());
-        } else if (CollectionUtils.notNullOrEmpty(distribution.getSourceRepos())) {
-            status.error("Source repositories filtration is only available for build distribution.", SC_BAD_REQUEST, log);
-        }
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/distribution/DistributionResourceConstants.java b/web/rest/src/main/java/org/artifactory/rest/resource/distribution/DistributionResourceConstants.java
deleted file mode 100644
index 4b65935..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/distribution/DistributionResourceConstants.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.artifactory.rest.resource.distribution;
-
-import org.artifactory.api.rest.constant.RestConstants;
-
-/**
- * @author Dan Feldman
- */
-public interface DistributionResourceConstants {
-
-    String PATH_ROOT = "distribute";
-    String MT_DISTRIBUTION = RestConstants.MT_ARTIFACTORY_APP + PATH_ROOT + ".Distribution+json";
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/license/ComplianceResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/license/ComplianceResource.java
deleted file mode 100644
index 63eccbc..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/license/ComplianceResource.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.license;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.blackduck.BlackDuckAddon;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.rest.compliance.FileComplianceInfo;
-import org.artifactory.api.rest.constant.ComplianceConstants;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.util.RestUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author mamo
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Path(ComplianceConstants.PATH_ROOT)
-public class ComplianceResource {
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Autowired
-    private RepositoryService repositoryService;
-
-    @GET
-    @Produces({MediaType.APPLICATION_JSON})
-    @Path("{path: .+}")
-    public Response getCachedExternalInfo(@PathParam("path") String path) {
-        BlackDuckAddon blackDuckAddon = addonsManager.addonByType(BlackDuckAddon.class);
-        RepoPath repoPath = RestUtils.calcRepoPathFromRequestPath(path);
-
-        if (!repositoryService.exists(repoPath)) {
-            return Response.status(Response.Status.BAD_REQUEST).entity("Could not find artifact for " + path).build();
-        }
-
-        try {
-            FileComplianceInfo fileComplianceInfo = blackDuckAddon.getExternalInfoFromMetadata(repoPath);
-
-            if (fileComplianceInfo == null) {
-                return Response.status(Response.Status.NOT_FOUND).entity("Could not find compliance info for " + path).
-                        build();
-            }
-
-            return Response.ok(fileComplianceInfo).build();
-        } catch (Exception e) {
-            return Response.status(Response.Status.INTERNAL_SERVER_ERROR).
-                    entity("An error occurred while trying to get compliance info for " + path).build();
-        }
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/license/LicenseResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/license/LicenseResource.java
deleted file mode 100644
index 73ce2f0..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/license/LicenseResource.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.license;
-
-import java.io.IOException;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-import javax.annotation.security.RolesAllowed;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.GET;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.license.LicenseStatus;
-import org.artifactory.addon.rest.RestAddon;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.rest.constant.SearchRestConstants;
-import org.artifactory.api.rest.search.result.LicensesSearchResult;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.rest.common.list.StringList;
-import org.artifactory.rest.common.util.RestUtils;
-import org.artifactory.util.CollectionUtils;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Collections2;
-import com.google.common.collect.Sets;
-
-/**
- * A resource for license retrieval
- *
- * @author Tomer Cohen
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
-public class LicenseResource {
-
-    private final RestAddon restAddon;
-    private final HttpServletRequest request;
-    private final RepositoryService repositoryService;
-    private static final Function<LocalRepoDescriptor, String> DESCRIPTORS_TO_KEYS =
-            new Function<LocalRepoDescriptor, String>() {
-                @Override
-                public String apply(LocalRepoDescriptor from) {
-                    return from.getKey();
-                }
-            };
-
-
-    public LicenseResource(RestAddon restAddon, HttpServletRequest request, RepositoryService repositoryService) {
-        this.restAddon = restAddon;
-        this.request = request;
-        this.repositoryService = repositoryService;
-    }
-
-    /**
-     * Find licenses in the defined repositories.
-     *
-     * @param unapprovedString Flag whether unapproved licenses should be included in the results. The default is 1
-     * @param unknownString    Flag whether unknown licenses should be included in the results. The default is 1
-     * @param notFoundString   Flag whether not found licenses {@link org.artifactory.api.license.LicenseInfo#NOT_FOUND}
-     *                         should be included the results. The default is 0
-     * @param neutralString    Flag whether neutral licenses should be included in the results. The default is 0
-     * @param approvedString   Flag whether approved licenses should be included in the results. The default is 0
-     * @param autofindString   Flag whether an auto-find should be performed on artifacts, and reading their respective
-     *                         poms or ivys. <b>NOTE: This can affect the speed of the search quite dramatically.</b>
-     * @param repos            A comma separated list of repositories to perform the search in.
-     * @return Results {@link LicensesSearchResult}
-     * @see LicensesSearchResult
-     */
-    @GET
-    @Produces({SearchRestConstants.MT_LICENSE_SEARCH_RESULT, MediaType.APPLICATION_JSON})
-    public Response findLicensesInRepos(
-            @QueryParam(SearchRestConstants.UNAPPROVED_PARAM) String unapprovedString,
-            @QueryParam(SearchRestConstants.UNKNOWN_PARAM) String unknownString,
-            @QueryParam(SearchRestConstants.NOT_FOUND_PARAM) String notFoundString,
-            @QueryParam(SearchRestConstants.NEUTRAL_PARAM) String neutralString,
-            @QueryParam(SearchRestConstants.APPROVED_PARAM) String approvedString,
-            @QueryParam(SearchRestConstants.AUTOFIND_PARAM) String autofindString,
-            @QueryParam(SearchRestConstants.REPOS_PARAM) StringList repos) throws IOException {
-
-        Set<String> repoKeys = (CollectionUtils.isNullOrEmpty(repos) ? getAllRealRepoKeys() : Sets.newHashSet(repos));
-        boolean unapproved = true;
-        if (StringUtils.isNotBlank(unapprovedString)) {
-            unapproved = Integer.parseInt(unapprovedString) == 1;
-        }
-        boolean unknown = true;
-        if (StringUtils.isNotBlank(unknownString)) {
-            unknown = Integer.parseInt(unknownString) == 1;
-        }
-        boolean notFound = false;
-        if (StringUtils.isNotBlank(notFoundString)) {
-            notFound = Integer.parseInt(notFoundString) == 1;
-        }
-        boolean neutral = false;
-        if (StringUtils.isNotBlank(neutralString)) {
-            neutral = Integer.parseInt(neutralString) == 1;
-        }
-        boolean approved = false;
-        if (StringUtils.isNotBlank(approvedString)) {
-            approved = Integer.parseInt(approvedString) == 1;
-        }
-        boolean autoDiscover = false;
-        if (StringUtils.isNotBlank(autofindString)) {
-            autoDiscover = Integer.parseInt(autofindString) == 1;
-        }
-
-        LicenseStatus status = new LicenseStatus(approved, autoDiscover, neutral, notFound, unapproved, unknown);
-        String servletContextUrl = RestUtils.getServletContextUrl(request);
-        LicensesSearchResult licensesInRepos = restAddon.findLicensesInRepos(status, repoKeys, servletContextUrl);
-        return Response.status(Response.Status.OK).entity(licensesInRepos).build();
-    }
-
-    private Set<String> getAllRealRepoKeys() {
-        List<LocalRepoDescriptor> localAndCachedRepoDescriptors = repositoryService.getLocalAndCachedRepoDescriptors();
-        Collection<String> transform = Collections2.transform(localAndCachedRepoDescriptors, DESCRIPTORS_TO_KEYS);
-        return Sets.newHashSet(transform);
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/maven/MavenResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/maven/MavenResource.java
deleted file mode 100644
index cc4609b..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/maven/MavenResource.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.maven;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.rest.RestAddon;
-import org.artifactory.api.maven.MavenMetadataService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.rest.constant.MavenRestConstants;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.list.StringList;
-import org.artifactory.rest.common.util.RestUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * A resource for manually running maven indexer
- *
- * @author Shay Yaakov
- */
- at Component
- at Scope(BeanDefinition.SCOPE_SINGLETON)
- at Path(MavenRestConstants.PATH_ROOT)
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
-public class MavenResource {
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Autowired
-    private RepositoryService repositoryService;
-
-    @Autowired
-    private MavenMetadataService mavenMetadataService;
-
-    @POST
-    @Produces({MediaType.TEXT_PLAIN})
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    public Response runIndexer(@QueryParam(MavenRestConstants.PARAM_REPOS_TO_INDEX) StringList reposToIndex,
-            @QueryParam(MavenRestConstants.PARAM_FORCE) int force) {
-        RestAddon restAddon = addonsManager.addonByType(RestAddon.class);
-        return restAddon.runMavenIndexer(reposToIndex, force);
-    }
-
-    @POST
-    @Path("calculateMetadata/{path: .+}")
-    public Response calculateMetadata(@PathParam("path") String path) {
-        RepoPath repoPath = RestUtils.calcRepoPathFromRequestPath(path);
-        if (!repositoryService.exists(repoPath)) {
-            return Response.status(Response.Status.NOT_FOUND).entity("Could not find path '" + path + "'").build();
-        }
-
-        String repoKey = repoPath.getRepoKey();
-        LocalRepoDescriptor localRepo = repositoryService.localRepoDescriptorByKey(repoKey);
-        if (localRepo == null) {
-            return Response.status(Response.Status.NOT_FOUND).entity(
-                    "Unable to find local repository '" + repoKey + "'.")
-                    .build();
-        }
-
-        if (!localRepo.isMavenRepoLayout()) {
-            return Response.status(Response.Status.BAD_REQUEST).entity(
-                    "Repository '" + repoKey + "' is not a maven repository.").build();
-        }
-
-        mavenMetadataService.calculateMavenMetadataAsync(repoPath, true);
-        return Response.ok().build();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/mission/control/MissionControlResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/mission/control/MissionControlResource.java
deleted file mode 100644
index 396392c..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/mission/control/MissionControlResource.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- */
-package org.artifactory.rest.resource.mission.control;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.rest.resource.mission.control.model.MissionControlSetupRequest;
-import org.artifactory.security.SaltedPassword;
-import org.artifactory.security.UserInfo;
-import org.artifactory.security.mission.control.MissionControlProperties;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Gidi Shabat
- */
-
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at Path(MissionControlResource.PATH_ROOT)
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
-public class MissionControlResource {
-    public static final String PATH_ROOT = "setupmc";
-    private static final Logger log = LoggerFactory.getLogger(MissionControlResource.class);
-
-    @POST
-    @Consumes({MediaType.APPLICATION_JSON})
-    @Produces({MediaType.APPLICATION_JSON})
-    public Response setupMissionControl(MissionControlSetupRequest setupRequest) {
-        try {
-            log.debug("Starting to setup Mission Control properties");
-            MissionControlProperties missionControlProperties = ContextHelper.get().beanForType(MissionControlProperties.class);
-            SecurityService securityService = ContextHelper.get().beanForType(SecurityService.class);
-            String token = setupRequest.getToken();
-            String userName= UserInfo.MISSION_CONTROLL;
-            int index = token.indexOf('@');
-            if(index>0){
-                userName=token.substring(0, index);
-                token=token.substring(index+1,token.length());
-            }
-            SaltedPassword saltedPassword = securityService.generateSaltedPassword(token);
-            missionControlProperties.setToken(saltedPassword.getPassword());
-            missionControlProperties.setUrl(setupRequest.getUrl());
-            missionControlProperties.setCreatedBy(userName);
-            missionControlProperties.setCreatedDate(System.currentTimeMillis());
-            ArtifactoryHome artifactoryHome = ArtifactoryHome.get();
-            missionControlProperties.updateMissionControlPropertiesFile(artifactoryHome.getMissionControlPropertiesFile());
-            log.debug("Successfully finished  to setup Mission Control properties");
-        } catch (Exception e) {
-            throw new RuntimeException("Failed to setup the Mission Control properties");
-        }
-        return Response.status(HttpStatus.SC_CREATED).build();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/mission/control/model/MissionControlSetupRequest.java b/web/rest/src/main/java/org/artifactory/rest/resource/mission/control/model/MissionControlSetupRequest.java
deleted file mode 100644
index a1d75b0..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/mission/control/model/MissionControlSetupRequest.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- */
-package org.artifactory.rest.resource.mission.control.model;
-
-/**
- * @author Gidi Shabat
- */
-public class MissionControlSetupRequest {
-    private String url;
-    private String token;
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    public String getToken() {
-        return token;
-    }
-
-    public void setToken(String token) {
-        this.token = token;
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/plugin/PluginsResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/plugin/PluginsResource.java
deleted file mode 100644
index f965a1b..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/plugin/PluginsResource.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.plugin;
-
-import com.google.common.collect.Maps;
-import com.sun.jersey.api.Responses;
-import org.apache.http.HttpStatus;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.plugin.ResponseCtx;
-import org.artifactory.addon.rest.RestAddon;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.io.SimpleResourceStreamHandle;
-import org.artifactory.resource.ResourceStreamHandle;
-import org.artifactory.rest.ErrorResponse;
-import org.artifactory.rest.common.list.KeyValueList;
-import org.artifactory.util.StringInputStream;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Nullable;
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-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.Request;
-import javax.ws.rs.core.Response;
-import java.io.InputStream;
-import java.io.Reader;
-import java.util.List;
-import java.util.Map;
-
-import static javax.ws.rs.core.MediaType.TEXT_PLAIN;
-import static javax.ws.rs.core.MediaType.WILDCARD;
-import static org.artifactory.api.rest.constant.PluginRestConstants.*;
-
-/**
- * A resource for plugin execution
- *
- * @author Tomer Cohen
- */
- at Component
- at Scope(BeanDefinition.SCOPE_SINGLETON)
- at Path(PATH_ROOT)
- at RolesAllowed({AuthorizationService.ROLE_USER, AuthorizationService.ROLE_ADMIN})
-public class PluginsResource {
-
-    @Autowired
-    AddonsManager addonsManager;
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getPluginInfo() {
-        return getPluginInfo(null);
-    }
-
-    @GET
-    @Path("{pluginType: .+}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getPluginInfo(@Nullable @PathParam("pluginType") String pluginType) {
-        return addonsManager.addonByType(RestAddon.class).getUserPluginInfo(pluginType);
-    }
-
-    @POST
-    @Consumes(WILDCARD)
-    @Path(PATH_EXECUTE + "/{executionName: .+}")
-    @Produces(TEXT_PLAIN)
-    public Response execute(@Context Request request,
-            InputStream body,
-            @PathParam("executionName") String executionName,
-            @QueryParam(PARAM_PARAMS) KeyValueList paramsList,
-            @QueryParam(PARAM_ASYNC) int async) throws Exception {
-        Map<String, List<String>> params =
-                paramsList != null ? paramsList.toStringMap() : Maps.<String, List<String>>newHashMap();
-        try (ResourceStreamHandle handle = new SimpleResourceStreamHandle(body)) {
-            ResponseCtx responseCtx =
-                    addonsManager.addonByType(RestAddon.class).runPluginExecution(executionName, request.getMethod(),
-                            params,
-                            handle, async == 1);
-            if (async == 1) {
-                //Just return accepted (202)
-                return Response.status(HttpStatus.SC_ACCEPTED).build();
-            } else {
-                return responseFromResponseCtx(responseCtx);
-            }
-        }
-    }
-
-    @PUT
-    @Consumes(WILDCARD)
-    @Path(PATH_EXECUTE + "/{executionName: .+}")
-    @Produces(TEXT_PLAIN)
-    public Response executePut(@Context Request request,
-            InputStream body,
-            @PathParam("executionName") String executionName,
-            @QueryParam(PARAM_PARAMS) KeyValueList paramsList,
-            @QueryParam(PARAM_ASYNC) int async) throws Exception {
-        return execute(request, body, executionName, paramsList, async);
-    }
-
-    @GET
-    @Path(PATH_EXECUTE + "/{executionName: .+}")
-    @Produces(TEXT_PLAIN)
-    public Response execute(@Context Request request, @PathParam("executionName") String executionName,
-            @QueryParam(PARAM_PARAMS) KeyValueList paramsList,
-            @QueryParam(PARAM_ASYNC) int async) throws Exception {
-        Map<String, List<String>> params =
-                paramsList != null ? paramsList.toStringMap() : Maps.<String, List<String>>newHashMap();
-        ResponseCtx responseCtx = addonsManager.addonByType(RestAddon.class).runPluginExecution(executionName,
-                request.getMethod(), params, null, async == 1);
-        if (async == 1) {
-            //Just return accepted (202)
-            return Response.status(HttpStatus.SC_ACCEPTED).build();
-        } else {
-            return responseFromResponseCtx(responseCtx);
-        }
-    }
-
-    @DELETE
-    @Path(PATH_EXECUTE + "/{executionName: .+}")
-    @Produces(TEXT_PLAIN)
-    public Response executeDelete(@Context Request request, @PathParam("executionName") String executionName,
-            @QueryParam(PARAM_PARAMS) KeyValueList paramsList,
-            @QueryParam(PARAM_ASYNC) int async) throws Exception {
-        return execute(request, executionName, paramsList, async);
-    }
-
-    @GET
-    @Path(PATH_STAGING + "/{strategyName: .+}")
-    @Produces({MT_BUILD_STAGING_STRATEGY, MediaType.APPLICATION_JSON})
-    public Response getBuildStagingStrategy(
-            @PathParam("strategyName") String strategyName,
-            @QueryParam("buildName") String buildName,
-            @QueryParam(PARAM_PARAMS) KeyValueList paramsList) {
-        Map<String, List<String>> params =
-                paramsList != null ? paramsList.toStringMap() : Maps.<String, List<String>>newHashMap();
-        return addonsManager.addonByType(RestAddon.class).getStagingStrategy(strategyName, buildName, params);
-    }
-
-    @POST
-    @Path(PATH_PROMOTE + "/{promotionName: .+}/{buildName: .+}/{buildNumber: .+}")
-    @Produces(TEXT_PLAIN)
-    public Response promote(
-            @PathParam("promotionName") String promotionName,
-            @PathParam("buildName") String buildName,
-            @PathParam("buildNumber") String buildNumber,
-            @QueryParam(PARAM_PARAMS) KeyValueList paramsList) {
-        Map<String, List<String>> params =
-                paramsList != null ? paramsList.toStringMap() : Maps.<String, List<String>>newHashMap();
-        ResponseCtx responseCtx = addonsManager.addonByType(RestAddon.class).promote(promotionName, buildName,
-                buildNumber, params);
-        return responseFromResponseCtx(responseCtx);
-    }
-
-    @PUT
-    @Path("{scriptName: .+}")
-    @Consumes({"text/x-groovy", TEXT_PLAIN})
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response deploy(Reader pluginScript, @PathParam("scriptName") String scriptName) {
-        ResponseCtx responseCtx = addonsManager.addonByType(RestAddon.class).deployPlugin(pluginScript, scriptName);
-        if (responseCtx.getStatus() >= 400) {
-            ErrorResponse errorResponse = new ErrorResponse(responseCtx.getStatus(), responseCtx.getMessage());
-            return Responses.clientError().type(MediaType.APPLICATION_JSON).entity(errorResponse).build();
-        } else {
-            return responseFromResponseCtx(responseCtx);
-        }
-    }
-
-    @POST
-    @Path("reload")
-    @Produces(MediaType.TEXT_PLAIN)
-    @RolesAllowed(AuthorizationService.ROLE_ADMIN)
-    public Response reload() {
-        try {
-            ResponseCtx responseCtx = addonsManager.addonByType(RestAddon.class).reloadPlugins();
-            return Response.status(responseCtx.getStatus())
-                    // ugly hack to force text response (to overcome our default in org.artifactory.rest.common.RestErrorResponseFilter
-                    .entity(new StringInputStream(responseCtx.getMessage()))
-                    .type(MediaType.TEXT_PLAIN).build();
-        } catch (Exception e) {
-            ErrorResponse errorResponse = new ErrorResponse(
-                    Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), e.getMessage());
-            return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(errorResponse).build();
-        }
-    }
-
-    private Response responseFromResponseCtx(ResponseCtx responseCtx) {
-        Response.ResponseBuilder builder;
-        int status = responseCtx.getStatus();
-        if (status != ResponseCtx.UNSET_STATUS) {
-            builder = Response.status(status);
-        } else {
-            builder = Response.ok();
-        }
-        String message = responseCtx.getMessage();
-        if (message != null) {
-            builder.entity(message);
-        }
-        return builder.build();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/replication/ReplicationConfigRequestHelper.java b/web/rest/src/main/java/org/artifactory/rest/resource/replication/ReplicationConfigRequestHelper.java
deleted file mode 100644
index fbac038..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/replication/ReplicationConfigRequestHelper.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package org.artifactory.rest.resource.replication;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.rest.replication.ReplicationConfigRequest;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.replication.ReplicationBaseDescriptor;
-import org.artifactory.descriptor.repo.ProxyDescriptor;
-import org.artifactory.rest.common.exception.BadRequestException;
-import org.quartz.CronExpression;
-
-import javax.annotation.Nullable;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-/**
- * @author mamo
- */
-public abstract class ReplicationConfigRequestHelper {
-
-    public static void fillBaseReplicationDescriptor(ReplicationConfigRequest replicationRequest,
-            ReplicationBaseDescriptor newReplication) {
-        if (replicationRequest.isEnabled() != null) {
-            newReplication.setEnabled(replicationRequest.isEnabled());
-        }
-        if (replicationRequest.getCronExp() != null) {
-            newReplication.setCronExp(replicationRequest.getCronExp());
-        }
-        if (replicationRequest.getSyncDeletes() != null) {
-            newReplication.setSyncDeletes(replicationRequest.getSyncDeletes());
-        }
-        if (replicationRequest.getSyncProperties() != null) {
-            newReplication.setSyncProperties(replicationRequest.getSyncProperties());
-        }
-        if (replicationRequest.getPathPrefix() != null) {
-            newReplication.setPathPrefix(replicationRequest.getPathPrefix());
-        }
-    }
-
-    public static void fillLocalReplicationDescriptor(ReplicationConfigRequest replicationRequest,
-            LocalReplicationDescriptor newReplication) {
-        fillBaseReplicationDescriptor(replicationRequest, newReplication);
-        if (replicationRequest.getUrl() != null) {
-            newReplication.setUrl(replicationRequest.getUrl());
-        }
-        if (replicationRequest.getEnableEventReplication() != null) {
-            newReplication.setEnableEventReplication(replicationRequest.getEnableEventReplication());
-        }
-        if (replicationRequest.getUsername() != null) {
-            newReplication.setUsername(replicationRequest.getUsername());
-        }
-        if (replicationRequest.getPassword() != null) {
-            newReplication.setPassword(replicationRequest.getPassword());
-        }
-        final String proxy = replicationRequest.getProxy();
-        if (proxy != null) {
-            try {
-                CentralConfigService centralConfigService = ContextHelper.get().beanForType(CentralConfigService.class);
-                List<ProxyDescriptor> proxies = centralConfigService.getDescriptor().getProxies();
-                ProxyDescriptor proxyDescriptor = Iterables.find(proxies,
-                        new Predicate<ProxyDescriptor>() {
-                            @Override
-                            public boolean apply(@Nullable ProxyDescriptor input) {
-                                return (input != null) && proxy.equals(input.getKey());
-                            }
-                        });
-                newReplication.setProxy(proxyDescriptor);
-            } catch (NoSuchElementException nsee) {
-                throw new BadRequestException("Could not find proxy");
-            }
-        }
-        if (replicationRequest.getSocketTimeoutMillis() != null) {
-            newReplication.setSocketTimeoutMillis(replicationRequest.getSocketTimeoutMillis());
-        }
-    }
-
-    public static void verifyBaseReplicationRequest(ReplicationBaseDescriptor replication) {
-        if (StringUtils.isBlank(replication.getCronExp())) {
-            throw new BadRequestException("cronExp is required");
-        }
-        if (!CronExpression.isValidExpression(replication.getCronExp())) {
-            throw new BadRequestException("Invalid cronExp");
-        }
-    }
-
-    public static void verifyLocalReplicationRequest(LocalReplicationDescriptor replication) {
-        if (StringUtils.isBlank(replication.getUrl())) {
-            throw new BadRequestException("url is required");
-        }
-        try {
-            new URL(replication.getUrl());
-        } catch (MalformedURLException e) {
-            throw new BadRequestException("Invalid url [" + e.getMessage() + "]");
-        }
-        verifyBaseReplicationRequest(replication);
-        if (StringUtils.isBlank(replication.getUsername())) {
-            throw new BadRequestException("username is required");
-        }
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/replication/ReplicationResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/replication/ReplicationResource.java
deleted file mode 100644
index 8879bf7..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/replication/ReplicationResource.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.replication;
-
-import com.google.common.collect.Lists;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.rest.RestAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.rest.constant.ReplicationRestConstants;
-import org.artifactory.api.rest.replication.ReplicationRequest;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.io.IOException;
-import java.util.List;
-
-/**
- * REST resource for invoking local and remote replication procedures.
- *
- * @author Noam Y. Tenne
- */
- at Component
- at Scope(BeanDefinition.SCOPE_SINGLETON)
- at Path(ReplicationRestConstants.ROOT)
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
-public class ReplicationResource {
-
-    /**
-     * Returns the latest replication status of the given path if annotated
-     *
-     * @param path Path to check for annotations
-     * @return Response
-     */
-    @GET
-    @Produces({ReplicationRestConstants.MT_REPLICATION_STATUS, MediaType.APPLICATION_JSON})
-    @Path("{path: .+}")
-    public Response getReplicationStatus(@PathParam("path") String path) {
-        RepoPath repoPath = InternalRepoPathFactory.create(path);
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        return addonsManager.addonByType(RestAddon.class).getReplicationStatus(repoPath);
-    }
-
-    /**
-     * Executes replication operations
-     * @deprecated since 4.7.5, replaces by {@link #replicateAll(String, List)}
-     * @param path               Replication root
-     * @param replicationRequest Replication settings
-     * @return Response
-     */
-    @Deprecated
-    @POST
-    @Consumes({ReplicationRestConstants.MT_REPLICATION_REQUEST, MediaType.APPLICATION_JSON})
-    @Path("{path: .+}")
-    public Response replicate(
-            @PathParam("path") String path,
-            ReplicationRequest replicationRequest) throws IOException {
-        RepoPath repoPath = InternalRepoPathFactory.create(path);
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        return addonsManager.addonByType(RestAddon.class).replicate(repoPath, replicationRequest);
-    }
-
-    /**
-     * Executes replication with default values and no JSON body
-     * (using for pull, false properties and deletes and uses the remote repository URL and credentials)
-     *
-     * @deprecated since 4.7.5, replaces by {@link #replicateAllNoJson(String)}
-     * @param path Replication root
-     */
-    @Deprecated
-    @POST
-    @Path("{path: .+}")
-    public Response replicateNoJson(@PathParam("path") String path) throws IOException {
-        return replicate(path, new ReplicationRequest());
-    }
-
-    /**
-     * Schedule immediate replication for local/multipush/remote repository.
-     *
-     * @param path Path for replication
-     * @param replicationRequests List of replicationRequests objects
-     * @return Response that is translated to a JSON content
-     * @throws IOException
-     */
-    @POST
-    @Consumes({MediaType.APPLICATION_JSON})
-    @Path("execute/{path: .+}")
-    public Response replicateAll(@PathParam("path") String path, List<ReplicationRequest> replicationRequests)
-            throws IOException {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        return addonsManager.addonByType(RestAddon.class).replicate(RepoPathFactory.create(path), replicationRequests);
-    }
-
-    /**
-     * Schedule immediate replication for local/multipush/remote repository.
-     * Since no payload supplied by the user, Artifactory will schedule the replication for existing replication
-     * configurations
-     *
-     * @param path Path for replication
-     * @return JSON response
-     * @throws IOException
-     */
-    @POST
-    @Path("execute/{path: .+}")
-    public Response replicateAllNoJson(@PathParam("path") String path) throws IOException {
-        return replicateAll(path, Lists.newArrayList());
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/replication/ReplicationsResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/replication/ReplicationsResource.java
deleted file mode 100644
index 58811e0..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/replication/ReplicationsResource.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.replication;
-
-import org.artifactory.api.rest.constant.ReplicationsRestConstants;
-import org.artifactory.api.rest.replication.MultipleReplicationConfigRequest;
-import org.artifactory.api.rest.replication.ReplicationConfigRequest;
-import org.artifactory.api.rest.replication.ReplicationEnableDisableRequest;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.resource.BaseResource;
-import org.artifactory.rest.services.ConfigServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * REST resource for configuring local and remote replication.
- *
- * @author mamo
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at Path(ReplicationsRestConstants.ROOT)
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
-public class ReplicationsResource extends BaseResource {
-
-    @Autowired
-    ConfigServiceFactory configFactory;
-
-    /**
-     * get Single or multiple replications
-     */
-    @GET
-    @Path("{repoKey: .+}")
-    @Produces({ReplicationsRestConstants.MT_REPLICATION_CONFIG_REQUEST, ReplicationsRestConstants.MT_MULTI_REPLICATION_CONFIG_REQUEST, MediaType.APPLICATION_JSON})
-    public Response getReplication() {
-        return runService(configFactory.getReplication());
-    }
-
-    /**
-     * create or replace single replication
-     */
-    @PUT
-    @Path("{repoKey: .+}")
-    @Consumes({ReplicationsRestConstants.MT_REPLICATION_CONFIG_REQUEST, MediaType.APPLICATION_JSON})
-    public Response addOrReplace(ReplicationConfigRequest replicationRequest) {
-        return runService(configFactory.createOrReplaceReplication(), replicationRequest);
-    }
-
-    /**
-     * create or replace multiple replication
-     */
-    @PUT
-    @Consumes({ReplicationsRestConstants.MT_MULTI_REPLICATION_CONFIG_REQUEST, MediaType.APPLICATION_JSON})
-    @Path("multiple{repoKey: .+}")
-    public Response addOrReplaceMultiple(MultipleReplicationConfigRequest replicationRequest) {
-        return runService(configFactory.createMultipleReplication(), replicationRequest);
-    }
-
-    /**
-     * update existing single replication
-     */
-    @POST
-    @Consumes({ReplicationsRestConstants.MT_REPLICATION_CONFIG_REQUEST, MediaType.APPLICATION_JSON})
-    @Path("{repoKey: .+}")
-    public Response updateReplications(ReplicationConfigRequest replicationRequest) {
-        return runService(configFactory.updateReplication(), replicationRequest);
-    }
-
-    /**
-     * update existing multi replication
-     */
-    @POST
-    @Consumes({ReplicationsRestConstants.MT_MULTI_REPLICATION_CONFIG_REQUEST, MediaType.APPLICATION_JSON})
-    @Path("multiple{repoKey: .+}")
-    public Response updateMultipleReplications(MultipleReplicationConfigRequest replicationRequest) {
-        return runService(configFactory.updateMultipleReplications(), replicationRequest);
-    }
-
-    /**
-     * delete  existing single / multi replication
-     */
-    @DELETE
-    @Path("{repoKey: .+}")
-    public Response deleteReplications() {
-        return runService(configFactory.deleteReplicationsService());
-    }
-
-    @POST
-    @Consumes({MediaType.APPLICATION_JSON})
-    @Path("enable")
-    public Response enable(ReplicationEnableDisableRequest replicationEnableDisableRequest) {
-        replicationEnableDisableRequest.setEnable(true);
-        return runService(configFactory.enableDisableReplicationsService(), replicationEnableDisableRequest);
-    }
-
-    @POST
-    @Consumes({MediaType.APPLICATION_JSON})
-    @Path("disable")
-    public Response disable(ReplicationEnableDisableRequest replicationEnableDisableRequest) {
-        replicationEnableDisableRequest.setEnable(false);
-        return runService(configFactory.enableDisableReplicationsService(), replicationEnableDisableRequest);
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/repositories/RepairRepositoryResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/repositories/RepairRepositoryResource.java
deleted file mode 100644
index a53df63..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/repositories/RepairRepositoryResource.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.repositories;
-
-import com.google.common.collect.Lists;
-import org.artifactory.api.repo.CaseSensitivityRepairService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.rest.artifact.RepairPathConflictsResult;
-import org.artifactory.api.rest.constant.RepairRepositoryConstants;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.repo.RepoPath;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.DefaultValue;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-import java.util.List;
-
-/**
- * @author Yoav Luft
- */
- at Component
- at Scope(BeanDefinition.SCOPE_SINGLETON)
- at Path(RepairRepositoryConstants.PATH_ROOT)
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
-public class RepairRepositoryResource {
-    private static final Logger log = LoggerFactory.getLogger(RepairRepositoryResource.class);
-
-    @Autowired
-    CaseSensitivityRepairService repairService;
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @POST
-    @Path("createOrphanItems/{path: .+}")
-    @Produces({MediaType.APPLICATION_JSON})
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    public List<String> createMissingParents(@PathParam("path") String path,
-            @DefaultValue("true") @QueryParam("dry") String dryRun) {
-
-        List<ItemInfo> orphanItems = repairService.getOrphanItems(path);
-        if (!isDryRun(dryRun) && !orphanItems.isEmpty()) {
-            for (ItemInfo orphanItem : orphanItems) {
-                repositoryService.mkdirs(orphanItem.getRepoPath().getParent());
-            }
-        }
-
-        List<String> result = Lists.newArrayList();
-        for (ItemInfo orphanItem : orphanItems) {
-            RepoPath parent = orphanItem.getRepoPath().getParent();
-            if (parent != null) {
-                log.debug("Creating missing directory '{}'", parent);
-                result.add(parent.toPath());
-            }
-        }
-        return result;
-    }
-
-    @POST
-    @Path("{path: .+}")
-    @Produces({MediaType.APPLICATION_JSON})
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    public RepairPathConflictsResult repairPathConflicts(@PathParam("path") String path,
-            @DefaultValue("true") @QueryParam("dry") String dryRun) {
-
-        RepairPathConflictsResult result = repairService.findPathConflicts(path);
-        if (!isDryRun(dryRun) && result.conflicts != null) {
-            result = repairService.fixCaseConflicts(result.conflicts);
-        }
-        return result;
-    }
-
-    /**
-     * @param s String representing the boolean value
-     * @return by default returns "true" (meaning is dry run". If "0", "off" or "false" returns false.
-     */
-    private boolean isDryRun(String s) {
-        if (s == null) {
-            return true;
-        }
-        return !("0".equals(s) || "off".equalsIgnoreCase(s) || "false".equalsIgnoreCase(s));
-    }
-
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/repositories/RepoConfigurationResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/repositories/RepoConfigurationResource.java
deleted file mode 100644
index 7e8e070..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/repositories/RepoConfigurationResource.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.repositories;
-
-import com.thoughtworks.xstream.XStream;
-import org.apache.http.HttpStatus;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.rest.constant.RepositoriesRestConstants;
-import org.artifactory.descriptor.repo.HttpRepoDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.factory.xstream.XStreamFactory;
-
-import javax.ws.rs.GET;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.io.IOException;
-import java.util.List;
-
-/**
- * A resource to manage the remote repository configuration actions
- *
- * @author Noam Tenne
- */
- at Deprecated
-public class RepoConfigurationResource {
-
-    private RepositoryService repositoryService;
-    private String remoteRepoKey;
-
-    /**
-     * Default constructor
-     *
-     * @param repositoryService Repository service
-     * @param remoteRepoKey     Key of selected remote repository
-     */
-    public RepoConfigurationResource(RepositoryService repositoryService, String remoteRepoKey) {
-        this.repositoryService = repositoryService;
-        this.remoteRepoKey = remoteRepoKey;
-    }
-
-    /**
-     * Returns the remote repository descriptor of the given key, if shared
-     *
-     * @return Json generated descriptor
-     * @throws IOException
-     */
-    @GET
-    @Produces({RepositoriesRestConstants.MT_REMOTE_REPOSITORY_CONFIGURATION, MediaType.APPLICATION_JSON})
-    public Response getRemoteDescriptor() throws IOException {
-        List<RemoteRepoDescriptor> remoteRepoDescriptors = repositoryService.getRemoteRepoDescriptors();
-        for (RemoteRepoDescriptor remoteRepoDescriptor : remoteRepoDescriptors) {
-            String currentRepoKey = remoteRepoDescriptor.getKey();
-            if (remoteRepoKey.equals(currentRepoKey) && remoteRepoDescriptor.isShareConfiguration()) {
-                return Response.ok().entity(maskData(remoteRepoDescriptor)).build();
-            }
-        }
-        return Response.status(HttpStatus.SC_NOT_FOUND).build();
-    }
-
-    /**
-     * Mask different elements of the given remote repository descriptor
-     *
-     * @param remoteRepoDescriptor Descriptor to mask
-     * @return Masked copy of given descriptor
-     */
-    private RemoteRepoDescriptor maskData(RemoteRepoDescriptor remoteRepoDescriptor) {
-        if (remoteRepoDescriptor instanceof HttpRepoDescriptor) {
-            HttpRepoDescriptor httpRepoDescriptor = (HttpRepoDescriptor) remoteRepoDescriptor;
-            XStream xStream = XStreamFactory.create(HttpRepoDescriptor.class);
-            String descriptorXml = xStream.toXML(httpRepoDescriptor);
-            HttpRepoDescriptor descriptorCopy = (HttpRepoDescriptor) xStream.fromXML(descriptorXml);
-
-            //Remote credentials
-            descriptorCopy.setUsername(null);
-            descriptorCopy.setPassword(null);
-
-            //Remove proxy config
-            descriptorCopy.setProxy(null);
-
-            //Remove local address
-            descriptorCopy.setLocalAddress(null);
-
-            // remove property sets
-            descriptorCopy.setPropertySets(null);
-
-            return descriptorCopy;
-        }
-        return remoteRepoDescriptor;
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/repositories/RepositoriesResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/repositories/RepositoriesResource.java
deleted file mode 100644
index c9a69f5..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/repositories/RepositoriesResource.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.repositories;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-import javax.annotation.security.RolesAllowed;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.*;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.rest.RestAddon;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.rest.constant.RepositoriesRestConstants;
-import org.artifactory.api.search.SearchService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.descriptor.repo.RepoDescriptor;
-import org.artifactory.repo.RepoDetails;
-import org.artifactory.repo.RepoDetailsType;
-import org.artifactory.rest.common.util.RestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import com.google.common.collect.Lists;
-
-import static org.artifactory.repo.RepoDetailsType.*;
-
-/**
- * A resource to manage all repository related operations
- *
- * @author Noam Tenne
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at Path(RepositoriesRestConstants.PATH_ROOT)
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
-public class RepositoriesResource {
-
-    private static final Logger log = LoggerFactory.getLogger(RepositoriesResource.class);
-
-
-    @Context
-    HttpServletRequest httpRequest;
-
-    @Context
-    HttpServletResponse httpResponse;
-
-    @Context
-    private HttpHeaders requestHeaders;
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Autowired
-    AddonsManager addonsManager;
-
-    @Autowired
-    SearchService searchService;
-
-    /**
-     * Repository configuration resource delegator
-     *
-     * @return RepoConfigurationResource
-     */
-    @Path("{repoKey}/" + RepositoriesRestConstants.PATH_CONFIGURATION)
-    @Deprecated
-    public RepoConfigurationResource getRepoConfigResource(@PathParam("repoKey") String repoKey) {
-        return new RepoConfigurationResource(repositoryService, repoKey);
-    }
-
-    /**
-     * Get repository configuration depending on the repository's type
-     *
-     * @param repoKey The repo Key
-     * @return The repository configuration JSON
-     */
-    @GET
-    @Path("{repoKey: .+}")
-    @Produces({RepositoriesRestConstants.MT_LOCAL_REPOSITORY_CONFIGURATION,
-            RepositoriesRestConstants.MT_REMOTE_REPOSITORY_CONFIG,
-            RepositoriesRestConstants.MT_VIRTUAL_REPOSITORY_CONFIGURATION, MediaType.APPLICATION_JSON})
-    public Response getRepoConfig(@PathParam("repoKey") String repoKey) {
-        MediaType mediaType = requestHeaders.getMediaType();
-        RestAddon restAddon = addonsManager.addonByType(RestAddon.class);
-        return restAddon.getRepositoryConfiguration(repoKey, mediaType);
-    }
-
-    @PUT
-    @Consumes(
-            {RepositoriesRestConstants.MT_LOCAL_REPOSITORY_CONFIGURATION,
-                    RepositoriesRestConstants.MT_REMOTE_REPOSITORY_CONFIG,
-                    RepositoriesRestConstants.MT_VIRTUAL_REPOSITORY_CONFIGURATION, MediaType.APPLICATION_JSON})
-    @Produces(MediaType.TEXT_PLAIN)
-    @Path("{repoKey: .+}")
-    public Response createOrReplaceRepository(@PathParam("repoKey") String repoKey,
-            @QueryParam(RepositoriesRestConstants.POSITION) int position, Map repositoryConfiguration)
-            throws IOException {
-        MediaType mediaType = requestHeaders.getMediaType();
-        RestAddon restAddon = addonsManager.addonByType(RestAddon.class);
-        return restAddon.createOrReplaceRepository(repoKey, repositoryConfiguration, mediaType, position);
-    }
-
-    @POST
-    @Consumes(
-            {RepositoriesRestConstants.MT_LOCAL_REPOSITORY_CONFIGURATION,
-                    RepositoriesRestConstants.MT_REMOTE_REPOSITORY_CONFIG,
-                    RepositoriesRestConstants.MT_VIRTUAL_REPOSITORY_CONFIGURATION, MediaType.APPLICATION_JSON})
-    @Produces(MediaType.TEXT_PLAIN)
-    @Path("{repoKey: .+}")
-    public Response updateRepository(@PathParam("repoKey") String repoKey, Map repositoryConfiguration)
-            throws IOException {
-        MediaType mediaType = requestHeaders.getMediaType();
-        RestAddon restAddon = addonsManager.addonByType(RestAddon.class);
-        return restAddon.updateRepository(repoKey, repositoryConfiguration, mediaType);
-    }
-
-    /**
-     * Returns a JSON list of repository details.
-     * <p/>
-     * NOTE: Used by CI integration to get a list of deployment repository targets.
-     *
-     * @param repoType Name of repository type, as defined in {@link org.artifactory.repo.RepoDetailsType}. Can be null
-     * @return JSON repository details list. Will return details of defined type, if given. And will return details of
-     *         all types if not
-     * @throws Exception
-     */
-    @GET
-    @Produces({RepositoriesRestConstants.MT_REPOSITORY_DETAILS_LIST, MediaType.APPLICATION_JSON})
-    public List<RepoDetails> getAllRepoDetails(@QueryParam(RepositoriesRestConstants.PARAM_REPO_TYPE)
-    String repoType) throws Exception {
-        return getRepoDetailsList(repoType);
-    }
-    @DELETE
-    @Produces(MediaType.TEXT_PLAIN)
-    @Path("{repoKey: .+}")
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    public Response deleteRepository(@PathParam("repoKey") String repoKey) throws IOException {
-        if (StringUtils.isBlank(repoKey)) {
-            return Response.status(Response.Status.BAD_REQUEST).entity("Repo key must not be null\n").build();
-        }
-        RestAddon restAddon = addonsManager.addonByType(RestAddon.class);
-        return restAddon.deleteRepository(repoKey);
-    }
-
-    /**
-     * Returns a list of repository details
-     *
-     * @param repoType Name of repository type, as defined in {@link org.artifactory.repo.RepoDetailsType}. Can be null
-     * @return List of repository details
-     */
-    private List<RepoDetails> getRepoDetailsList(String repoType) throws Exception {
-        List<RepoDetails> detailsList = Lists.newArrayList();
-
-        boolean noTypeSelected = StringUtils.isBlank(repoType);
-        RepoDetailsType selectedType = null;
-        if (!noTypeSelected) {
-            try {
-                selectedType = valueOf(repoType.toUpperCase());
-            } catch (IllegalArgumentException e) {
-                //On an unfound type, return empty list
-                return detailsList;
-            }
-        }
-
-        if (noTypeSelected || LOCAL.equals(selectedType)) {
-            addLocalOrVirtualRepoDetails(detailsList, repositoryService.getLocalRepoDescriptors(), LOCAL);
-        }
-
-        if (noTypeSelected || REMOTE.equals(selectedType)) {
-            addRemoteRepoDetails(detailsList);
-        }
-
-        if (noTypeSelected || VIRTUAL.equals(selectedType)) {
-            addLocalOrVirtualRepoDetails(detailsList, repositoryService.getVirtualRepoDescriptors(), VIRTUAL);
-        }
-        return detailsList;
-    }
-
-    /**
-     * Adds a list of local or virtual repositories to the repository details list
-     *
-     * @param detailsList List that details should be appended to
-     * @param reposToAdd  List of repositories to add details of
-     * @param type        Type of repository which is being added
-     */
-    private void addLocalOrVirtualRepoDetails(List<RepoDetails> detailsList, List<? extends RepoDescriptor> reposToAdd,
-            RepoDetailsType type) {
-        for (RepoDescriptor repoToAdd : reposToAdd) {
-            String key = repoToAdd.getKey();
-            if (authorizationService.userHasPermissionsOnRepositoryRoot(key)) {
-                detailsList.add(new RepoDetails(key, repoToAdd.getDescription(), type, getRepoUrl(key)));
-            }
-        }
-    }
-
-    /**
-     * Adds a list of remote repositories to the repo details list
-     *
-     * @param detailsList List that details should be appended to
-     */
-    private void addRemoteRepoDetails(List<RepoDetails> detailsList) {
-        List<RemoteRepoDescriptor> remoteRepos = repositoryService.getRemoteRepoDescriptors();
-
-        for (RemoteRepoDescriptor remoteRepo : remoteRepos) {
-            String key = remoteRepo.getKey();
-            if (authorizationService.userHasPermissionsOnRepositoryRoot(key)) {
-                String configUrl = null;
-                if (remoteRepo.isShareConfiguration()) {
-                    configUrl = getRepoConfigUrl(key);
-                }
-
-                detailsList.add(new RepoDetails(key, remoteRepo.getDescription(), REMOTE, remoteRepo.getUrl(),
-                        configUrl));
-            }
-        }
-    }
-
-    /**
-     * Returns the repository browse URL
-     *
-     * @param repoKey Key of repository to assemble URL for
-     * @return Repository URL
-     */
-    private String getRepoUrl(String repoKey) {
-        return new StringBuilder().append(RestUtils.getServletContextUrl(httpRequest)).append("/").append(repoKey)
-                .toString();
-    }
-
-    /**
-     * Returns the repository configuration URL
-     *
-     * @param repoKey Key of repository to assemble URL for
-     * @return Repository configuration URL
-     */
-    private String getRepoConfigUrl(String repoKey) {
-        return new StringBuilder().append(RestUtils.getRestApiUrl(httpRequest)).append("/")
-                .append(RepositoriesRestConstants.PATH_ROOT).append("/").append(repoKey).append("/").
-                        append(RepositoriesRestConstants.PATH_CONFIGURATION).toString();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/repositories/YumResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/repositories/YumResource.java
deleted file mode 100644
index a2caddf..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/repositories/YumResource.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.repositories;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.rest.RestAddon;
-import org.artifactory.api.rest.constant.YumRestConstants;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.util.PermissionHelper;
-import org.artifactory.security.ArtifactoryPermission;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Noam Y. Tenne
- */
- at Component
- at Scope(BeanDefinition.SCOPE_SINGLETON)
- at Path(YumRestConstants.PATH_ROOT)
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
-public class YumResource {
-
-    @Autowired
-    AddonsManager addonsManager;
-
-    @Autowired
-    private PermissionHelper permissionHelper;
-
-    @POST
-    @Produces(MediaType.TEXT_PLAIN)
-    @Path("{repoKey: .+}")
-    public Response calculateYumMetadata(@PathParam("repoKey") String repoKey,
-            @QueryParam(YumRestConstants.PARAM_ASYNC) int async) {
-        if (StringUtils.isBlank(repoKey)) {
-            return Response.status(Response.Status.BAD_REQUEST).entity(
-                    "Target repository key cannot be blank").build();
-        }
-        permissionHelper.assertPermission(repoKey, ArtifactoryPermission.MANAGE);
-
-        RestAddon restAddon = addonsManager.addonByType(RestAddon.class);
-        return restAddon.calculateYumMetadata(repoKey, async);
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/reverseproxies/ReverseProxiesResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/reverseproxies/ReverseProxiesResource.java
deleted file mode 100644
index 071abe0..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/reverseproxies/ReverseProxiesResource.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.artifactory.rest.resource.reverseproxies;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.ReverseProxyDescriptor;
-import org.artifactory.rest.common.model.reverseproxy.ReverseProxyDescriptorModel;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.rest.services.ConfigServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Shay Yaakov
- */
- at Path("system/configuration/webServer{id:(/[^/]+?)?}")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ReverseProxiesResource extends BaseResource {
-
-    @Autowired
-    protected ConfigServiceFactory configServiceFactory;
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response createReverseProxy(ReverseProxyDescriptorModel reverseProxy) throws Exception {
-        return runService(configServiceFactory.createReverseProxy(), reverseProxy);
-    }
-
-
-    @PUT
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response updateReverseProxy(ReverseProxyDescriptor reverseProxy) throws Exception {
-        return runService(configServiceFactory.updateReverseProxy(), reverseProxy);
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getReverseProxies() throws Exception {
-        return runService(configServiceFactory.getReverseProxies());
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/reverseproxies/ReverseProxiesSnippetResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/reverseproxies/ReverseProxiesSnippetResource.java
deleted file mode 100644
index 4d62ba4..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/reverseproxies/ReverseProxiesSnippetResource.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.artifactory.rest.resource.reverseproxies;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.rest.services.ConfigServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Shay Yaakov
- */
- at Path("system/configuration/reverseProxy{id:(/[^/]+?)?}")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ReverseProxiesSnippetResource extends BaseResource {
-
-    @Autowired
-    protected ConfigServiceFactory configServiceFactory;
-
-    @GET
-    @Produces(MediaType.TEXT_PLAIN)
-    public Response getReverseProxySnippet() throws Exception {
-        return runService(configServiceFactory.getReverseProxySnippet());
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/search/SearchResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/search/SearchResource.java
deleted file mode 100644
index 6bddf36..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/search/SearchResource.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.search;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.rest.RestAddon;
-import org.artifactory.api.repo.RepositoryBrowsingService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.rest.constant.SearchRestConstants;
-import org.artifactory.api.search.SearchService;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.resource.license.LicenseResource;
-import org.artifactory.rest.resource.search.types.*;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.Path;
-import javax.ws.rs.core.Context;
-
-/**
- * Resource class that handles search actions
- *
- * @author Yoav Landman
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at Path(SearchRestConstants.PATH_ROOT)
- at RolesAllowed({AuthorizationService.ROLE_USER, AuthorizationService.ROLE_ADMIN})
-public class SearchResource {
-
-    @Context
-    private HttpServletRequest request;
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Autowired
-    SearchService searchService;
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Autowired
-    RepositoryBrowsingService repoBrowsingService;
-
-    @Autowired
-    AddonsManager addonsManager;
-
-    /**
-     * Delegates the request to the artifact search resource
-     *
-     * @return Artifact search resource
-     */
-    @Path(SearchRestConstants.PATH_ARTIFACT)
-    public ArtifactSearchResource artifactQuery() {
-        return new ArtifactSearchResource(authorizationService, searchService, repositoryService, repoBrowsingService,
-                request);
-    }
-
-    /**
-     * Delegates the request to the archive search resource
-     *
-     * @return Archive search resource
-     */
-    @Path(SearchRestConstants.PATH_ARCHIVE)
-    public ArchiveSearchResource archiveQuery() {
-        return new ArchiveSearchResource(authorizationService, searchService, request);
-    }
-
-    /**
-     * Delegates the request to the GAVC search resource
-     *
-     * @return GAVC search resource
-     */
-    @Path(SearchRestConstants.PATH_GAVC)
-    public GavcSearchResource gavcQuery() {
-        return new GavcSearchResource(authorizationService, searchService, repositoryService, repoBrowsingService,
-                request);
-    }
-
-    /**
-     * Delegates the request to the property search resource
-     *
-     * @return property search resource
-     */
-    @Path(SearchRestConstants.PATH_PROPERTY)
-    public PropertySearchResource propertyQuery() {
-        return new PropertySearchResource(authorizationService, searchService, repositoryService, repoBrowsingService,
-                request);
-    }
-
-    /**
-     * Delegates the request to the usage since search resource
-     *
-     * @return Usage since resource
-     */
-    @Path(SearchRestConstants.PATH_USAGE_SINCE)
-    public UsageSinceResource notDownloadedSinceQuery() {
-        return new UsageSinceResource(authorizationService, searchService, request);
-    }
-
-    /**
-     * Delegates the request to the in date range search resource
-     *
-     * @return create in range resource
-     */
-    @Path(SearchRestConstants.PATH_CREATED_IN_RANGE)
-    public CreatedInRangeResource createdInDateRangeQuery() {
-        return new CreatedInRangeResource(authorizationService, searchService, request);
-    }
-
-    @Path(SearchRestConstants.PATH_DATES_IN_RANGE)
-    public AnyDateInRangeResource datesInRangeQuery() {
-        return new AnyDateInRangeResource(authorizationService, searchService, request, repositoryService);
-    }
-
-    @Path(SearchRestConstants.PATH_PATTERN)
-    public PatternSearchResource patternSearchQuery() {
-        RestAddon restAddon = addonsManager.addonByType(RestAddon.class);
-        return new PatternSearchResource(authorizationService, repositoryService, restAddon, request);
-    }
-
-    @Path(SearchRestConstants.PATH_LICENSE)
-    public LicenseResource licensesSearch() {
-        RestAddon restAddon = addonsManager.addonByType(RestAddon.class);
-        return new LicenseResource(restAddon, request, repositoryService);
-    }
-
-    @Path(SearchRestConstants.PATH_CHECKSUM)
-    public ChecksumSearchResource checksumSearch() {
-        RestAddon restAddon = addonsManager.addonByType(RestAddon.class);
-        return new ChecksumSearchResource(authorizationService, restAddon, repositoryService, repoBrowsingService,
-                request);
-    }
-
-    @Path(SearchRestConstants.PATH_BAD_CHECKSUM)
-    public BadChecksumSearchResource badChecksumSearch() {
-        RestAddon restAddon = addonsManager.addonByType(RestAddon.class);
-        return new BadChecksumSearchResource(authorizationService, restAddon, request);
-    }
-
-    @Path(SearchRestConstants.PATH_DEPENDENCY)
-    public DependencySearchResource dependencySearch() {
-        RestAddon restAddon = addonsManager.addonByType(RestAddon.class);
-        return new DependencySearchResource(restAddon, request, authorizationService);
-    }
-
-    @Path(SearchRestConstants.PATH_VERSIONS)
-    public ArtifactVersionsSearchResource versionsSearch() {
-        RestAddon restAddon = addonsManager.addonByType(RestAddon.class);
-        return new ArtifactVersionsSearchResource(restAddon);
-    }
-
-    @Path(SearchRestConstants.PATH_LATEST_VERSION)
-    public ArtifactLatestVersionSearchResource latestVersionSearch() {
-        RestAddon restAddon = addonsManager.addonByType(RestAddon.class);
-        return new ArtifactLatestVersionSearchResource(restAddon);
-    }
-
-    @Path(SearchRestConstants.PATH_BUILD_ARTIFACTS)
-    public BuildArtifactsSearchResource buildArtifactsSearch() {
-        RestAddon restAddon = addonsManager.addonByType(RestAddon.class);
-        return new BuildArtifactsSearchResource(restAddon, authorizationService, request);
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/search/fields/FieldNameHelper.java b/web/rest/src/main/java/org/artifactory/rest/resource/search/fields/FieldNameHelper.java
deleted file mode 100644
index b5e16ba..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/search/fields/FieldNameHelper.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.search.fields;
-
-/**
- * Date: 5/16/14 10:18 AM
- *
- * @author freds
- */
-public abstract class FieldNameHelper {
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/AnyDateInRangeResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/search/types/AnyDateInRangeResource.java
deleted file mode 100644
index 75801e4..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/AnyDateInRangeResource.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-package org.artifactory.rest.resource.search.types;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Calendar;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.GET;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.rest.search.common.RestDateFieldName;
-import org.artifactory.api.rest.search.result.DynamicItemSearchResult;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.SearchService;
-import org.artifactory.api.search.artifact.ArtifactSearchResult;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.fs.StatsInfo;
-import org.artifactory.rest.common.exception.BadRequestException;
-import org.artifactory.rest.common.list.StringList;
-import org.artifactory.rest.common.util.RestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import static org.artifactory.api.rest.constant.SearchRestConstants.*;
-
-/**
- * @author Eli Givoni
- */
-public class AnyDateInRangeResource extends GenericSearchResource {
-    private static final Logger log = LoggerFactory.getLogger(AnyDateInRangeResource.class);
-
-    private RepositoryService repositoryService;
-
-    public AnyDateInRangeResource(AuthorizationService authorizationService, SearchService searchService,
-            HttpServletRequest request, RepositoryService repositoryService) {
-        super(searchService, authorizationService, request);
-        this.repositoryService = repositoryService;
-    }
-
-    /**
-     * Returns a json array of modified artifacts within the time range in the format:
-     * <pre>
-     * [{
-     *    "url" : "http://.../libs-releases-local/path_to_artifact",
-     *    "modified" : "2009-07-02T11:11:49+03:00"
-     *  } ...]
-     * </pre>
-     * Where the url is the full url of the modified artifact and the modified is the created or modified date of the
-     * artifact that is in within the time range.
-     *
-     * @param from          The time to start the search. Exclusive (eg, >). If empty will start from 1st Jan 1970
-     * @param to            The time to end search. Inclusive (eg, <=), If empty, will not use current time as the
-     *                      limit
-     * @param reposToSearch Lists of repositories to search within
-     * @return CreatedInRangeRestSearchResult Json representation of the modified artifacts whiting the time range
-     */
-    @GET
-    @Produces({MT_ARTIFACT_RESULT, MediaType.APPLICATION_JSON})
-    public Response dynamicGet(@QueryParam(PARAM_IN_RANGE_FROM) String from,
-            @QueryParam(PARAM_IN_RANGE_TO) String to,
-            @QueryParam(PARAM_REPO_TO_SEARCH) StringList reposToSearch,
-            @QueryParam(PARAM_DATE_FIELDS) StringList dateFields) throws IOException {
-
-        return search(RestUtils.extractLongEpoch(from), RestUtils.extractLongEpoch(to), reposToSearch,
-                getDateFields(dateFields));
-    }
-
-    private RestDateFieldName[] getDateFields(StringList dateFieldNames) {
-        RestDateFieldName[] dateFields;
-        if (dateFieldNames != null && !dateFieldNames.isEmpty()) {
-            dateFields = new RestDateFieldName[dateFieldNames.size()];
-            int i = 0;
-            for (String fieldName : dateFieldNames) {
-                RestDateFieldName byFieldName = RestDateFieldName.byFieldName(fieldName);
-                if (byFieldName == null) {
-                    throw new BadRequestException("Date field name '" + fieldName + "' unknown!, " +
-                            "possible values are: " + Arrays.asList(RestDateFieldName.values()));
-                }
-                dateFields[i++] = byFieldName;
-            }
-        } else {
-            throw new BadRequestException("'dateFields' parameter cannot be empty!");
-        }
-
-        return dateFields;
-    }
-
-    @Override
-    protected Response createResponse(ItemSearchResults<ArtifactSearchResult> results, Calendar from, Calendar to,
-            RestDateFieldName[] dates) {
-        DynamicItemSearchResult restResults = new DynamicItemSearchResult();
-        for (ArtifactSearchResult result : results.getResults()) {
-            DynamicItemSearchResult.SearchEntry entry = new DynamicItemSearchResult.SearchEntry();
-            ItemInfo itemInfo = result.getItemInfo();
-            entry.uri = buildStorageUri(itemInfo.getRepoPath());
-            for (RestDateFieldName restDateFieldName : dates) {
-                switch (restDateFieldName) {
-                    case CREATED:
-                        entry.created = RestUtils.toIsoDateString(itemInfo.getCreated());
-                        break;
-                    case LAST_MODIFIED:
-                        entry.lastModified = RestUtils.toIsoDateString(itemInfo.getLastModified());
-                        break;
-                    case LAST_DOWNLOADED:
-                        StatsInfo stats = repositoryService.getStatsInfo(itemInfo.getRepoPath());
-                        if (stats != null) {
-                            entry.lastDownloaded = RestUtils.toIsoDateString(stats.getLastDownloaded());
-                        } else {
-                            entry.lastDownloaded = "";
-                        }
-                        break;
-                }
-            }
-            restResults.results.add(entry);
-        }
-
-        return Response.ok(restResults).type(MT_ARTIFACT_RESULT).build();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/ArchiveSearchResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/search/types/ArchiveSearchResource.java
deleted file mode 100644
index db2fa32..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/ArchiveSearchResource.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.search.types;
-
-import java.io.IOException;
-import java.util.List;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.GET;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import org.artifactory.api.rest.constant.SearchRestConstants;
-import org.artifactory.api.rest.search.result.ArchiveRestSearchResult;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.SearchService;
-import org.artifactory.api.search.archive.ArchiveSearchControls;
-import org.artifactory.api.search.archive.ArchiveSearchResult;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.exception.NotFoundException;
-import org.artifactory.rest.common.list.StringList;
-import org.artifactory.rest.common.util.RestUtils;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-import org.springframework.beans.support.MutableSortDefinition;
-import org.springframework.beans.support.PropertyComparator;
-
-import com.google.common.collect.Lists;
-
-import static org.artifactory.api.rest.constant.SearchRestConstants.NOT_FOUND;
-
-/**
- * Resource class that handles archive search actions
- *
- * @author Eli givoni
- */
-public class ArchiveSearchResource {
-
-    private AuthorizationService authorizationService;
-    private SearchService searchService;
-    private HttpServletRequest request;
-
-    /**
-     * Main constructor
-     *
-     * @param searchService Search service instance
-     */
-    public ArchiveSearchResource(AuthorizationService authorizationService, SearchService searchService,
-            HttpServletRequest request) {
-        this.authorizationService = authorizationService;
-        this.searchService = searchService;
-        this.request = request;
-    }
-
-    /**
-     * Parametrized archive search
-     *
-     * @param name          Entry name to search for
-     * @param reposToSearch Specific repositories to search in
-     * @return Rest search results object
-     */
-    @GET
-    @Produces({SearchRestConstants.MT_ARCHIVE_ENTRY_SEARCH_RESULT, MediaType.APPLICATION_JSON})
-    public Response get(
-            @QueryParam(SearchRestConstants.PARAM_SEARCH_NAME) String name,
-            @QueryParam(SearchRestConstants.PARAM_REPO_TO_SEARCH) StringList reposToSearch) throws IOException {
-        return search(name, reposToSearch);
-    }
-
-
-    /**
-     * Performs the archive search
-     *
-     * @param name          Entry name to search for
-     * @param reposToSearch Specific repositories to search in  @return Rest search results object
-     */
-    private Response search(String name, List<String> reposToSearch) throws IOException {
-        ArchiveSearchControls controls = new ArchiveSearchControls();
-        controls.setName(name);
-        controls.setLimitSearchResults(authorizationService.isAnonymous());
-        controls.setSelectedRepoForSearch(reposToSearch);
-
-        if (controls.isEmpty()) {
-            return Response.status(Response.Status.BAD_REQUEST).entity("The search term cannot be empty").build();
-        }
-        if (controls.isWildcardsOnly()) {
-            return Response.status(Response.Status.BAD_REQUEST).entity("Search term containing only wildcards is not permitted").build();
-        }
-
-        ItemSearchResults<ArchiveSearchResult> searchResults;
-        try {
-            searchResults = searchService.searchArchiveContent(controls);
-        } catch (RepositoryRuntimeException e) {
-            throw new NotFoundException(e.getMessage());
-        }
-        //TODO: [by ys] use multi map
-        List<ArchiveSearchResult> results = searchResults.getResults();
-        if (results.isEmpty()) {
-            throw new NotFoundException(NOT_FOUND);
-        }
-
-        MutableSortDefinition definition = new MutableSortDefinition("entry", false, true);
-        PropertyComparator.sort(results, definition);
-        ArchiveRestSearchResult archiveRestSearchResult = new ArchiveRestSearchResult();
-        String entryToCheck = results.get(0).getEntryPath();
-        List<String> fileInfoUris = Lists.newArrayList();
-        for (ArchiveSearchResult result : results) {
-            //aggregate all uri for the same entry
-            if (entryToCheck.equals(result.getEntryPath())) {
-                fileInfoUris.add(RestUtils.buildStorageInfoUri(request, result));
-            } else {
-                //add ArchiveEntry to ArchiveRestSearchResult
-                ArchiveRestSearchResult.ArchiveEntry archiveEntry =
-                        new ArchiveRestSearchResult.ArchiveEntry(entryToCheck, fileInfoUris);
-                archiveRestSearchResult.results.add(archiveEntry);
-                entryToCheck = result.getEntryPath();
-                fileInfoUris = Lists.newArrayList(RestUtils.buildStorageInfoUri(request, result));
-            }
-        }
-        //add ArchiveEntry for the last iteration
-        ArchiveRestSearchResult.ArchiveEntry archiveEntry =
-                new ArchiveRestSearchResult.ArchiveEntry(entryToCheck, fileInfoUris);
-        archiveRestSearchResult.results.add(archiveEntry);
-
-        return Response.ok(archiveRestSearchResult).build();
-    }
-}
\ No newline at end of file
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/ArtifactLatestVersionSearchResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/search/types/ArtifactLatestVersionSearchResource.java
deleted file mode 100644
index 8ae89ba..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/ArtifactLatestVersionSearchResource.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.search.types;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.rest.RestAddon;
-import org.artifactory.api.rest.constant.SearchRestConstants;
-import org.artifactory.api.rest.search.result.ArtifactVersionsResult;
-import org.artifactory.api.rest.search.result.VersionEntry;
-import org.artifactory.rest.common.exception.NotFoundException;
-import org.artifactory.rest.common.list.StringList;
-import org.springframework.util.AntPathMatcher;
-
-import javax.ws.rs.GET;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.io.IOException;
-import java.util.List;
-
-/**
- * Resource class that handles artifact latest version search action
- *
- * @author Shay Yaakov
- */
-public class ArtifactLatestVersionSearchResource {
-    private RestAddon restAddon;
-
-    public ArtifactLatestVersionSearchResource(RestAddon restAddon) {
-        this.restAddon = restAddon;
-    }
-
-    @GET
-    @Produces({MediaType.TEXT_PLAIN})
-    public Response get(
-            @QueryParam(SearchRestConstants.PARAM_GAVC_GROUP_ID) String groupId,
-            @QueryParam(SearchRestConstants.PARAM_GAVC_ARTIFACT_ID) String artifactId,
-            @QueryParam(SearchRestConstants.PARAM_GAVC_VERSION) String version,
-            @QueryParam(SearchRestConstants.PARAM_REPO_TO_SEARCH) StringList reposToSearch,
-            @QueryParam(SearchRestConstants.PARAM_FETCH_FROM_REMOTE) int remote)
-            throws IOException {
-        try {
-            boolean useRemote = remote == 1;
-            ArtifactVersionsResult artifactVersions = restAddon.getArtifactVersions(
-                    groupId, artifactId, version, reposToSearch, useRemote, false);
-            List<VersionEntry> results = artifactVersions.getResults();
-
-            if (results.isEmpty()) {
-                throw new NotFoundException("Unable to find artifact versions");
-            }
-
-            boolean searchForReleaseVersion = StringUtils.isBlank(version);
-            VersionEntry latest;
-            String notFoundMessage = null;
-            if (searchForReleaseVersion) {
-                latest = getLatestReleaseVersion(results);
-                if (latest == null) {
-                    notFoundMessage = "Latest release version not found";
-                }
-            } else {
-                char[] wildcardsArr = {'*', '?'};
-                if (StringUtils.containsAny(version, wildcardsArr)) {
-                    latest = matchLatestByPattern(results, version);
-                } else {
-                    latest = getLatestIntegrationVersion(results);
-                }
-                if (latest == null) {
-                    notFoundMessage = "Latest integration version not found";
-                }
-            }
-
-            if (latest == null) {
-                throw new NotFoundException(notFoundMessage);
-            } else {
-                return Response.ok(latest.getVersion()).build();
-            }
-
-        } catch (IllegalArgumentException e) {
-            return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
-        }
-    }
-
-    private VersionEntry getLatestReleaseVersion(List<VersionEntry> results) {
-        for (VersionEntry result : results) {
-            if (!result.isIntegration()) {
-                return result;
-            }
-        }
-        return null;
-    }
-
-    private VersionEntry matchLatestByPattern(List<VersionEntry> results, String version) {
-        AntPathMatcher matcher = new AntPathMatcher();
-        for (VersionEntry result : results) {
-            if (matcher.match(version, result.getVersion())) {
-                return result;
-            }
-        }
-        return null;
-    }
-
-    private VersionEntry getLatestIntegrationVersion(List<VersionEntry> results) {
-        for (VersionEntry result : results) {
-            if (result.isIntegration()) {
-                return result;
-            }
-        }
-        return null;
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/ArtifactSearchResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/search/types/ArtifactSearchResource.java
deleted file mode 100644
index 7d534f8..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/ArtifactSearchResource.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.search.types;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.repo.RepositoryBrowsingService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.rest.constant.SearchRestConstants;
-import org.artifactory.api.rest.search.result.InfoRestSearchResult;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.SearchService;
-import org.artifactory.api.search.artifact.ArtifactSearchControls;
-import org.artifactory.api.search.artifact.ArtifactSearchResult;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.rest.common.exception.NotFoundException;
-import org.artifactory.rest.common.list.StringList;
-import org.artifactory.rest.util.StorageInfoHelper;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.GET;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.io.IOException;
-import java.util.List;
-
-/**
- * Resource class that handles artifact search actions
- *
- * @author Eli givoni
- */
-public class ArtifactSearchResource {
-
-    private AuthorizationService authorizationService;
-    private SearchService searchService;
-    private RepositoryService repositoryService;
-    private RepositoryBrowsingService repoBrowsingService;
-    private HttpServletRequest request;
-
-    /**
-     * Main constructor
-     *
-     * @param searchService       Search service instance
-     * @param repositoryService
-     * @param repoBrowsingService
-     */
-    public ArtifactSearchResource(AuthorizationService authorizationService, SearchService searchService,
-            RepositoryService repositoryService, RepositoryBrowsingService repoBrowsingService,
-            HttpServletRequest request) {
-        this.authorizationService = authorizationService;
-        this.searchService = searchService;
-        this.repositoryService = repositoryService;
-        this.repoBrowsingService = repoBrowsingService;
-        this.request = request;
-    }
-
-    /**
-     * Parametrized artifact search
-     *
-     * @param name          to search for
-     * @param reposToSearch Specific repositories to search in
-     * @return Rest search results object
-     */
-    @GET
-    @Produces({SearchRestConstants.MT_ARTIFACT_SEARCH_RESULT, MediaType.APPLICATION_JSON})
-    public Response get(
-            @QueryParam(SearchRestConstants.PARAM_SEARCH_NAME) String name,
-            @QueryParam(SearchRestConstants.PARAM_REPO_TO_SEARCH) StringList reposToSearch) throws IOException {
-        return search(name, reposToSearch);
-    }
-
-
-    /**
-     * Performs the artifact search
-     *
-     * @param name          Artifact ID to search for
-     * @param reposToSearch Specific repositories to search in
-     * @return Rest search results object
-     */
-    private Response search(String name, List<String> reposToSearch) throws IOException {
-        ArtifactSearchControls controls = new ArtifactSearchControls();
-        controls.setQuery(appendAndReturnWildcards(name));
-        controls.setLimitSearchResults(authorizationService.isAnonymous());
-        controls.setSelectedRepoForSearch(reposToSearch);
-
-        if (controls.isEmpty()) {
-            return Response.status(Response.Status.BAD_REQUEST).entity("The search term cannot be empty").build();
-        }
-        if (controls.isWildcardsOnly()) {
-            return Response.status(Response.Status.BAD_REQUEST).entity(
-                    "Search term containing only wildcards is not permitted").build();
-        }
-
-        ItemSearchResults<ArtifactSearchResult> searchResults;
-        try {
-            searchResults = searchService.searchArtifacts(controls);
-        } catch (RepositoryRuntimeException e) {
-            throw new NotFoundException(e.getMessage());
-        }
-        InfoRestSearchResult result = new InfoRestSearchResult();
-        for (ArtifactSearchResult searchResult : searchResults.getResults()) {
-            ItemInfo itemInfo = searchResult.getItemInfo();
-            StorageInfoHelper storageInfoHelper = new StorageInfoHelper(request, repositoryService, repoBrowsingService,
-                    itemInfo);
-            result.results.add(storageInfoHelper.createStorageInfo());
-        }
-
-        return Response.ok(result).build();
-    }
-
-    private String appendAndReturnWildcards(String name) {
-        if (StringUtils.isBlank(name)) {
-            return name;
-        }
-        StringBuilder queryBuilder = new StringBuilder();
-        if (!name.startsWith("*") && !name.startsWith("?")) {
-            queryBuilder.append("*");
-        }
-
-        queryBuilder.append(name);
-
-        if (!name.endsWith("*") && !name.endsWith("?")) {
-            queryBuilder.append("*");
-        }
-
-        return queryBuilder.toString();
-    }
-}
\ No newline at end of file
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/ArtifactVersionsSearchResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/search/types/ArtifactVersionsSearchResource.java
deleted file mode 100644
index d0fa938..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/ArtifactVersionsSearchResource.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.search.types;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.rest.RestAddon;
-import org.artifactory.api.rest.constant.SearchRestConstants;
-import org.artifactory.api.rest.search.result.ArtifactVersionsResult;
-import org.artifactory.api.rest.search.result.VersionEntry;
-import org.artifactory.rest.common.exception.NotFoundException;
-import org.artifactory.rest.common.list.StringList;
-import org.springframework.util.AntPathMatcher;
-
-import javax.ws.rs.GET;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.io.IOException;
-import java.util.List;
-
-/**
- * Resource class that handles artifact versions search action
- *
- * @author Shay Yaakov
- */
-public class ArtifactVersionsSearchResource {
-    private RestAddon restAddon;
-
-    public ArtifactVersionsSearchResource(RestAddon restAddon) {
-        this.restAddon = restAddon;
-    }
-
-    @GET
-    @Produces({SearchRestConstants.MT_ARTIFACT_VERSIONS_SEARCH_RESULT, MediaType.APPLICATION_JSON})
-    public Response get(
-            @QueryParam(SearchRestConstants.PARAM_GAVC_GROUP_ID) String groupId,
-            @QueryParam(SearchRestConstants.PARAM_GAVC_ARTIFACT_ID) String artifactId,
-            @QueryParam(SearchRestConstants.PARAM_GAVC_VERSION) String version,
-            @QueryParam(SearchRestConstants.PARAM_REPO_TO_SEARCH) StringList reposToSearch,
-            @QueryParam(SearchRestConstants.PARAM_FETCH_FROM_REMOTE) int remote)
-            throws IOException {
-        try {
-            boolean useRemote = remote == 1;
-            ArtifactVersionsResult artifactVersions = restAddon.getArtifactVersions(groupId, artifactId, version,
-                    reposToSearch, useRemote, true);
-            if (artifactVersions.getResults().isEmpty()) {
-                throw new NotFoundException("Unable to find artifact versions");
-            } else {
-                char[] wildcardsArr = {'*', '?'};
-                if (StringUtils.containsAny(version, wildcardsArr)) {
-                    matchByPattern(artifactVersions, version);
-                }
-                return Response.ok(artifactVersions).build();
-            }
-        } catch (IllegalArgumentException e) {
-            return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
-        }
-    }
-
-    private void matchByPattern(ArtifactVersionsResult artifactVersions, String version) {
-        List<VersionEntry> filteredResults = Lists.newArrayList();
-        AntPathMatcher matcher = new AntPathMatcher();
-        for (VersionEntry result : artifactVersions.getResults()) {
-            if (matcher.match(version, result.getVersion())) {
-                filteredResults.add(result);
-            }
-        }
-
-        artifactVersions.setResults(filteredResults);
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/BadChecksumSearchResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/search/types/BadChecksumSearchResource.java
deleted file mode 100644
index caa96c2..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/BadChecksumSearchResource.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.artifactory.rest.resource.search.types;
-
-import org.artifactory.addon.rest.AuthorizationRestException;
-import org.artifactory.addon.rest.MissingRestAddonException;
-import org.artifactory.addon.rest.RestAddon;
-import org.artifactory.api.rest.constant.SearchRestConstants;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.list.StringList;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.GET;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.io.IOException;
-
-/**
- * Resource for retrieving artifacts with bad checksums.
- *
- * @author Tomer Cohen
- */
-public class BadChecksumSearchResource {
-    private static final Logger log = LoggerFactory.getLogger(BadChecksumSearchResource.class);
-
-    private final RestAddon restAddon;
-    private final AuthorizationService authorizationService;
-    private final HttpServletRequest request;
-
-    public BadChecksumSearchResource(AuthorizationService authorizationService, RestAddon restAddon,
-            HttpServletRequest request) {
-        this.restAddon = restAddon;
-        this.authorizationService = authorizationService;
-        this.request = request;
-    }
-
-    /**
-     * Searches for artifacts by checksum
-     *
-     * @param type          The {@link org.artifactory.checksum.ChecksumType} to search for
-     * @param reposToSearch Specific repositories to search within
-     * @return Search results object
-     */
-    @GET
-    @Produces({SearchRestConstants.MT_BAD_CHECKSUM_SEARCH_RESULT, MediaType.APPLICATION_JSON})
-    public Object get(@QueryParam("type") String type,
-            @QueryParam(SearchRestConstants.PARAM_REPO_TO_SEARCH) StringList reposToSearch) throws IOException {
-        if (!authorizationService.isAuthenticated()) {
-            throw new AuthorizationRestException();
-        }
-        log.debug("Finding bad '{}' checksum artifacts in {} ", type, reposToSearch);
-        try {
-            return restAddon.searchBadChecksumArtifacts(type, reposToSearch, request);
-        } catch (MissingRestAddonException mrae) {
-            throw mrae;
-        } catch (RuntimeException e) {
-            return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
-        }
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/BuildArtifactsSearchResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/search/types/BuildArtifactsSearchResource.java
deleted file mode 100644
index de1849d..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/BuildArtifactsSearchResource.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.search.types;
-
-import java.io.IOException;
-import java.util.Map;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import org.artifactory.addon.rest.AuthorizationRestException;
-import org.artifactory.addon.rest.RestAddon;
-import org.artifactory.api.rest.build.artifacts.BuildArtifactsRequest;
-import org.artifactory.api.rest.constant.BuildRestConstants;
-import org.artifactory.api.rest.constant.SearchRestConstants;
-import org.artifactory.api.rest.search.result.DownloadRestSearchResult;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.rest.common.exception.NotFoundException;
-import org.artifactory.rest.common.util.RestUtils;
-import org.artifactory.rest.resource.ci.BuildResource;
-
-import static org.apache.commons.lang.StringUtils.isBlank;
-
-/**
- * Resource for retrieving build artifacts according to input regexp patterns.
- *
- * @author Shay Yaakov
- * @see BuildArtifactsRequest
- */
-public class BuildArtifactsSearchResource {
-
-    private final RestAddon restAddon;
-    private AuthorizationService authorizationService;
-    private HttpServletRequest request;
-
-    public BuildArtifactsSearchResource(RestAddon restAddon, AuthorizationService authorizationService,
-            HttpServletRequest request) {
-        this.restAddon = restAddon;
-        this.authorizationService = authorizationService;
-        this.request = request;
-    }
-
-    @POST
-    @Consumes({BuildRestConstants.MT_BUILD_ARTIFACTS_REQUEST, MediaType.APPLICATION_JSON})
-    @Produces({SearchRestConstants.MT_BUILD_ARTIFACTS_SEARCH_RESULT, MediaType.APPLICATION_JSON})
-    public Response get(BuildArtifactsRequest buildArtifactsRequest) throws IOException {
-
-        if (authorizationService.isAnonUserAndAnonBuildInfoAccessDisabled()) {
-            throw new AuthorizationRestException(BuildResource.anonAccessDisabledMsg);
-        }
-        if (isBlank(buildArtifactsRequest.getBuildName())) {
-            return Response.status(Response.Status.BAD_REQUEST).entity("Cannot search without build name.").build();
-        }
-        boolean buildNumberIsBlank = isBlank(buildArtifactsRequest.getBuildNumber());
-        boolean buildStatusIsBlank = isBlank(buildArtifactsRequest.getBuildStatus());
-        if (buildNumberIsBlank && buildStatusIsBlank) {
-            return Response.status(Response.Status.BAD_REQUEST).entity(
-                    "Cannot search without build number or build status.").build();
-        }
-        if (!buildNumberIsBlank && !buildStatusIsBlank) {
-            return Response.status(Response.Status.BAD_REQUEST).entity(
-                    "Cannot search with both build number and build status parameters, " +
-                            "please omit build number if your are looking for latest build by status " +
-                            "or omit build status to search for specific build version.").build();
-        }
-
-        if (!authorizationService.isAuthenticated()) {
-            throw new AuthorizationRestException();
-        }
-
-        Map<FileInfo, String> buildArtifacts;
-        try {
-            buildArtifacts = restAddon.getBuildArtifacts(buildArtifactsRequest);
-        } catch (IllegalArgumentException e) {
-            return Response.status(Response.Status.BAD_REQUEST).entity(e.getLocalizedMessage()).build();
-        }
-        if (buildArtifacts == null || buildArtifacts.isEmpty()) {
-            //In this stage, only one of buildNumberIsBlank or buildNumberIsBlank can be false.
-            String noArtifactsFound=String.format("Could not find any build artifacts for build '%s'",buildArtifactsRequest.getBuildName());
-            if (!buildNumberIsBlank){
-                noArtifactsFound+=String.format(" number '%s'",buildArtifactsRequest.getBuildNumber());
-            }else if(!buildStatusIsBlank){
-                noArtifactsFound+=String.format(" status '%s'",buildArtifactsRequest.getBuildStatus());
-            }
-            throw new NotFoundException(noArtifactsFound);
-        }
-
-        DownloadRestSearchResult downloadRestSearchResult = new DownloadRestSearchResult();
-        for (FileInfo fileInfo : buildArtifacts.keySet()) {
-            String downloadUri = RestUtils.buildDownloadUri(request, fileInfo.getRepoKey(), fileInfo.getRelPath());
-            downloadRestSearchResult.results.add(new DownloadRestSearchResult.SearchEntry(downloadUri));
-        }
-
-        return Response.ok(downloadRestSearchResult).build();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/ChecksumSearchResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/search/types/ChecksumSearchResource.java
deleted file mode 100644
index 18e0608..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/ChecksumSearchResource.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.search.types;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.properties.ArtifactPropertiesAddon;
-import org.artifactory.addon.rest.AuthorizationRestException;
-import org.artifactory.addon.rest.MissingRestAddonException;
-import org.artifactory.addon.rest.RestAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryBrowsingService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.rest.constant.SearchRestConstants;
-import org.artifactory.api.rest.search.result.InfoRestSearchResult;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.SearchService;
-import org.artifactory.api.search.property.PropertySearchControls;
-import org.artifactory.api.search.property.PropertySearchResult;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.exception.BadRequestException;
-import org.artifactory.rest.common.exception.RestException;
-import org.artifactory.rest.common.list.StringList;
-import org.artifactory.rest.util.StorageInfoHelper;
-import org.artifactory.spring.InternalContextHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.GET;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-import java.io.IOException;
-import java.util.Set;
-
-/**
- * Exposes the checksum searcher to REST via the REST addon
- *
- * @author Noam Y. Tenne
- */
-public class ChecksumSearchResource {
-    private static final Logger log = LoggerFactory.getLogger(ChecksumSearchResource.class);
-
-    private AuthorizationService authorizationService;
-
-    private RestAddon restAddon;
-    private RepositoryService repositoryService;
-    private RepositoryBrowsingService repoBrowsingService;
-    private HttpServletRequest request;
-
-    public ChecksumSearchResource(AuthorizationService authorizationService, RestAddon restAddon,
-            RepositoryService repositoryService, RepositoryBrowsingService repoBrowsingService,
-            HttpServletRequest request) {
-        this.authorizationService = authorizationService;
-        this.restAddon = restAddon;
-        this.repositoryService = repositoryService;
-        this.repoBrowsingService = repoBrowsingService;
-        this.request = request;
-    }
-
-    /**
-     * Searches for artifacts by checksum
-     *
-     * @param md5Checksum   MD5 checksum value
-     * @param sha1Checksum  SHA1 checksum value
-     * @param reposToSearch Specific repositories to search within
-     * @return Search results object
-     */
-    @GET
-    @Produces({SearchRestConstants.MT_CHECKSUM_SEARCH_RESULT, MediaType.APPLICATION_JSON})
-    public InfoRestSearchResult get(@QueryParam(SearchRestConstants.PARAM_MD5_CHECKSUM) String md5Checksum,
-                                    @QueryParam(SearchRestConstants.PARAM_SHA1_CHECKSUM) String sha1Checksum,
-                                    @QueryParam(SearchRestConstants.PARAM_SHA256_CHECKSUM) String sha256Checksum,
-                                    @QueryParam(SearchRestConstants.PARAM_REPO_TO_SEARCH) StringList reposToSearch)
-            throws IOException, AuthorizationRestException {
-        if (!authorizationService.isAuthenticated()) {
-            throw new AuthorizationRestException();
-        }
-
-        try {
-            return search(md5Checksum, sha1Checksum, sha256Checksum, reposToSearch);
-        } catch (MissingRestAddonException mrae) {
-            throw mrae;
-        } catch (IllegalArgumentException iae) {
-            throw new BadRequestException(iae.getMessage());
-        } catch (Exception e) {
-            String errorMessage =
-                    String.format("Error occurred while searching for artifacts by checksum: %s", e.getMessage());
-            log.error(errorMessage, e);
-            throw new RestException(errorMessage);
-        }
-    }
-
-    private InfoRestSearchResult search(String md5Checksum, String sha1Checksum, String sha256, StringList reposToSearch) {
-        InfoRestSearchResult resultToReturn = new InfoRestSearchResult();
-        if (matchToSha256Length(sha256)) {
-            findArtifactBySha256Checksum(sha256, reposToSearch, resultToReturn);
-            return resultToReturn;
-        }
-        Set<RepoPath> matchingArtifacts = restAddon.searchArtifactsByChecksum(md5Checksum, sha1Checksum, reposToSearch);
-        for (RepoPath matchingArtifact : matchingArtifacts) {
-            FileInfo fileInfo = repositoryService.getFileInfo(matchingArtifact);
-            StorageInfoHelper storageInfoHelper = new StorageInfoHelper(request, repositoryService, repoBrowsingService,
-                    fileInfo);
-            resultToReturn.results.add(storageInfoHelper.createStorageInfo());
-        }
-        return resultToReturn;
-    }
-
-    /**
-     * find artifact by sha 256 checksum property
-     *
-     * @param sha256         - sha256
-     * @param reposToSearch  - list of repositories
-     * @param resultToReturn - artifact
-     */
-    private void findArtifactBySha256Checksum(String sha256, StringList reposToSearch, InfoRestSearchResult resultToReturn) {
-        SearchService searchService = InternalContextHelper.get().beanForType(SearchService.class);
-        ArtifactPropertiesAddon artifactPropertiesAddon = ContextHelper.get().beanForType(AddonsManager.class)
-                .addonByType(ArtifactPropertiesAddon.class);
-        PropertySearchControls sha256PropertyControlSearch = artifactPropertiesAddon.getSha256PropertyControlSearch(sha256, reposToSearch);
-        // search property
-        if (sha256PropertyControlSearch != null) {
-            ItemSearchResults<PropertySearchResult> propertyResults = searchService.searchPropertyAql(sha256PropertyControlSearch);
-            propertyResults.getResults().forEach(result -> {
-                FileInfo fileInfo = (FileInfo) result.getItemInfo();
-                if(authorizationService.canRead(fileInfo.getRepoPath())) {
-                    StorageInfoHelper storageInfoHelper = new StorageInfoHelper(request, repositoryService,
-                            repoBrowsingService,fileInfo);
-                    resultToReturn.results.add(storageInfoHelper.createStorageInfo());
-                }
-            });
-        }
-    }
-
-    /**
-     * check if checksum length match sha 256 length
-     *
-     * @return - true if match sha256
-     */
-    private boolean matchToSha256Length(String sha256) {
-        return StringUtils.length(sha256) == ChecksumType.sha256.length();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/CreatedInRangeResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/search/types/CreatedInRangeResource.java
deleted file mode 100644
index 45076bb..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/CreatedInRangeResource.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-package org.artifactory.rest.resource.search.types;
-
-import java.io.IOException;
-import java.util.Calendar;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.GET;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import org.artifactory.api.rest.constant.SearchRestConstants;
-import org.artifactory.api.rest.search.common.RestDateFieldName;
-import org.artifactory.api.rest.search.result.CreatedInRangeRestSearchResult;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.SearchService;
-import org.artifactory.api.search.artifact.ArtifactSearchResult;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.rest.common.list.StringList;
-import org.artifactory.rest.common.util.RestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import static org.artifactory.api.rest.constant.SearchRestConstants.*;
-
-/**
- * @author Eli Givoni
- */
-public class CreatedInRangeResource extends GenericSearchResource {
-    private static final Logger log = LoggerFactory.getLogger(CreatedInRangeResource.class);
-
-    public CreatedInRangeResource(AuthorizationService authorizationService, SearchService searchService,
-            HttpServletRequest request) {
-        super(searchService, authorizationService, request);
-    }
-
-    /**
-     * Returns a json array of modified artifacts within the time range in the format:
-     * <pre>
-     * [{
-     *    "url" : "http://.../libs-releases-local/path_to_artifact",
-     *    "modified" : "2009-07-02T11:11:49+03:00"
-     *  } ...]
-     * </pre>
-     * Where the url is the full url of the modified artifact and the modified is the created or modified date of the
-     * artifact that is in within the time range.
-     *
-     * @param from          The time to start the search. Exclusive (eg, >). If empty will start from 1st Jan 1970
-     * @param to            The time to end search. Inclusive (eg, <=), If empty, will not use current time as the
-     *                      limit
-     * @param reposToSearch Lists of repositories to search within
-     * @return CreatedInRangeRestSearchResult Json representation of the modified artifacts whiting the time range
-     */
-    @GET
-    @Produces({SearchRestConstants.MT_CREATED_IN_RANGE_SEARCH_RESULT, MediaType.APPLICATION_JSON})
-    public Response get(@QueryParam(PARAM_IN_RANGE_FROM) Long from, @QueryParam(PARAM_IN_RANGE_TO) Long to,
-            @QueryParam(SearchRestConstants.PARAM_REPO_TO_SEARCH) StringList reposToSearch) throws IOException {
-        RestDateFieldName[] dateFields = {RestDateFieldName.CREATED, RestDateFieldName.LAST_MODIFIED};
-        return search(from, to, reposToSearch, dateFields);
-    }
-
-    @Override
-    protected Response createResponse(ItemSearchResults<ArtifactSearchResult> results, Calendar from, Calendar to,
-            RestDateFieldName[] dates) {
-        CreatedInRangeRestSearchResult rangeRestSearchResult = new CreatedInRangeRestSearchResult();
-        for (ArtifactSearchResult result : results.getResults()) {
-            ItemInfo item = result.getItemInfo();
-
-            // Find if modified or created is the date that was used to find this artifact
-            Calendar dateFound = Calendar.getInstance();
-            dateFound.setTimeInMillis(item.getCreated());
-            if (to != null && !(dateFound.before(to) || dateFound.equals(to))) {
-                dateFound.setTimeInMillis(item.getLastModified());
-            } else if (from != null && !(dateFound.after(from) || dateFound.equals(from))) {
-                // if created not in range then the last modified is
-                dateFound.setTimeInMillis(item.getLastModified());
-            }
-
-            String time = RestUtils.toIsoDateString(dateFound.getTimeInMillis());
-            CreatedInRangeRestSearchResult.CreatedEntry entry =
-                    new CreatedInRangeRestSearchResult.CreatedEntry(buildStorageUri(item.getRepoPath()), time);
-            rangeRestSearchResult.results.add(entry);
-        }
-        return Response.ok(rangeRestSearchResult).type(MT_CREATED_IN_RANGE_SEARCH_RESULT).build();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/DependencySearchResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/search/types/DependencySearchResource.java
deleted file mode 100644
index 4650a7b..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/DependencySearchResource.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.search.types;
-
-import org.artifactory.addon.rest.AuthorizationRestException;
-import org.artifactory.addon.rest.RestAddon;
-import org.artifactory.api.rest.constant.SearchRestConstants;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.exception.BadRequestException;
-import org.artifactory.rest.resource.ci.BuildResource;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.GET;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.io.IOException;
-
-/**
- * @author Noam Y. Tenne
- */
-public class DependencySearchResource {
-
-    private RestAddon restAddon;
-    private HttpServletRequest request;
-    private AuthorizationService authService;
-
-    public DependencySearchResource(RestAddon restAddon, HttpServletRequest request, AuthorizationService authService) {
-        this.restAddon = restAddon;
-        this.request = request;
-        this.authService = authService;
-    }
-
-    @GET
-    @Produces({SearchRestConstants.MT_DEPENDENCY_BUILDS, MediaType.APPLICATION_JSON})
-    public Response get(@QueryParam(SearchRestConstants.PARAM_SHA1_CHECKSUM) String sha1) throws IOException {
-        if (authService.isAnonUserAndAnonBuildInfoAccessDisabled()){
-            throw new AuthorizationRestException(BuildResource.anonAccessDisabledMsg);
-        }
-        try {
-            return restAddon.searchDependencyBuilds(request, sha1);
-        } catch (IllegalArgumentException iae) {
-            throw new BadRequestException(iae.getMessage());
-        }
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/GavcSearchResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/search/types/GavcSearchResource.java
deleted file mode 100644
index 275730b..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/GavcSearchResource.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.search.types;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.repo.RepositoryBrowsingService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.rest.constant.SearchRestConstants;
-import org.artifactory.api.rest.search.result.InfoRestSearchResult;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.SearchService;
-import org.artifactory.api.search.gavc.GavcSearchControls;
-import org.artifactory.api.search.gavc.GavcSearchResult;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.rest.common.exception.NotFoundException;
-import org.artifactory.rest.common.list.StringList;
-import org.artifactory.rest.util.StorageInfoHelper;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.GET;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.io.IOException;
-import java.util.List;
-
-/**
- * Resource class that handles GAVC search actions
- *
- * @author Eli givoni
- */
-public class GavcSearchResource {
-
-    private AuthorizationService authorizationService;
-    private SearchService searchService;
-    private RepositoryService repositoryService;
-    private RepositoryBrowsingService repoBrowsingService;
-    private HttpServletRequest request;
-
-    /**
-     * @param searchService       Search service instance
-     * @param repositoryService
-     * @param repoBrowsingService
-     */
-    public GavcSearchResource(AuthorizationService authorizationService, SearchService searchService,
-            RepositoryService repositoryService, RepositoryBrowsingService repoBrowsingService,
-            HttpServletRequest request) {
-        this.authorizationService = authorizationService;
-        this.searchService = searchService;
-        this.repositoryService = repositoryService;
-        this.repoBrowsingService = repoBrowsingService;
-        this.request = request;
-    }
-
-    /**
-     * Parametrized GAVC search
-     *
-     * @param groupId       Group ID to search for
-     * @param artifactId    Artifact ID to search for
-     * @param version       Version to search for
-     * @param classifier    Classifier to search for
-     * @param reposToSearch Specific repositories to search in
-     * @return Rest search results object
-     */
-    @GET
-    @Produces({SearchRestConstants.MT_GAVC_SEARCH_RESULT, MediaType.APPLICATION_JSON})
-    public Response get(
-            @QueryParam(SearchRestConstants.PARAM_GAVC_GROUP_ID) String groupId,
-            @QueryParam(SearchRestConstants.PARAM_GAVC_ARTIFACT_ID) String artifactId,
-            @QueryParam(SearchRestConstants.PARAM_GAVC_VERSION) String version,
-            @QueryParam(SearchRestConstants.PARAM_GAVC_CLASSIFIER) String classifier,
-            @QueryParam(SearchRestConstants.PARAM_REPO_TO_SEARCH) StringList reposToSearch)
-            throws IOException {
-        return search(groupId, artifactId, version, classifier, reposToSearch);
-    }
-
-    /**
-     * Performs the GAVC search
-     *
-     * @param groupId       Group ID to search for
-     * @param artifactId    Artifact ID to search for
-     * @param version       Version to search for
-     * @param classifier    Classifier to search for
-     * @param reposToSearch Specific repositories to search in
-     * @return Rest search results object
-     */
-    private Response search(String groupId, String artifactId, String version, String classifier,
-            List<String> reposToSearch) throws IOException {
-        if (hasAtLeastOneValidParameter(groupId, artifactId, version, classifier)) {
-            GavcSearchControls searchControls = new GavcSearchControls();
-            searchControls.setGroupId(groupId);
-            searchControls.setArtifactId(artifactId);
-            searchControls.setVersion(version);
-            searchControls.setClassifier(classifier);
-            searchControls.setLimitSearchResults(authorizationService.isAnonymous());
-            searchControls.setSelectedRepoForSearch(reposToSearch);
-
-            if (searchControls.isEmpty()) {
-                return Response.status(Response.Status.BAD_REQUEST).entity("The search term cannot be empty").build();
-            }
-            if (searchControls.isWildcardsOnly()) {
-                return Response.status(Response.Status.BAD_REQUEST).entity(
-                        "Search term containing only wildcards is not permitted").build();
-            }
-
-            ItemSearchResults<GavcSearchResult> searchResults;
-            try {
-                searchResults = searchService.searchGavc(searchControls);
-            } catch (RepositoryRuntimeException e) {
-                throw new NotFoundException(e.getMessage());
-            }
-
-            InfoRestSearchResult gavcRestSearchResult = new InfoRestSearchResult();
-            for (GavcSearchResult result : searchResults.getResults()) {
-                ItemInfo itemInfo = result.getItemInfo();
-                StorageInfoHelper storageInfoHelper = new StorageInfoHelper(request, repositoryService,
-                        repoBrowsingService,
-                        itemInfo);
-                gavcRestSearchResult.results.add(storageInfoHelper.createStorageInfo());
-            }
-            return Response.ok(gavcRestSearchResult).build();
-        }
-
-        return Response.status(Response.Status.BAD_REQUEST).entity(
-                "Missing groupId or artifactId or version or classifier").build();
-    }
-
-    private boolean hasAtLeastOneValidParameter(String groupId, String artifactId, String version, String classifier) {
-        return StringUtils.isNotBlank(groupId) || StringUtils.isNotBlank(artifactId) ||
-                StringUtils.isNotBlank(version) || StringUtils.isNotBlank(classifier);
-    }
-}
\ No newline at end of file
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/GenericSearchResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/search/types/GenericSearchResource.java
deleted file mode 100644
index 8371b49..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/GenericSearchResource.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.search.types;
-
-import org.artifactory.addon.rest.AuthorizationRestException;
-import org.artifactory.api.rest.constant.ArtifactRestConstants;
-import org.artifactory.api.rest.constant.RestConstants;
-import org.artifactory.api.rest.search.common.RestDateFieldName;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.SearchService;
-import org.artifactory.api.search.artifact.ArtifactSearchResult;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.rest.common.exception.BadRequestException;
-import org.artifactory.rest.common.exception.NotFoundException;
-import org.artifactory.rest.common.exception.RestException;
-import org.artifactory.rest.common.list.StringList;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-import org.artifactory.util.HttpUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.core.Response;
-import java.io.IOException;
-import java.util.Calendar;
-
-import static org.artifactory.api.rest.constant.SearchRestConstants.NOT_FOUND;
-
-/**
- * Date: 5/11/14 3:11 PM
- *
- * @author freds
- */
-public abstract class GenericSearchResource {
-    private static final Logger log = LoggerFactory.getLogger(GenericSearchResource.class);
-
-    protected SearchService searchService;
-    private AuthorizationService authorizationService;
-    private HttpServletRequest request;
-
-    public GenericSearchResource(SearchService searchService, AuthorizationService authorizationService,
-            HttpServletRequest request) {
-        this.searchService = searchService;
-        this.authorizationService = authorizationService;
-        this.request = request;
-    }
-
-    protected Response search(Long from, Long to, StringList reposToSearch, RestDateFieldName... dates) throws IOException {
-        assertValidRequest(from);
-
-        Calendar fromCal = null;
-        if (from != null) {
-            fromCal = Calendar.getInstance();
-            fromCal.setTimeInMillis(from);
-        }
-        Calendar toCal = null;
-        if (to != null) {
-            toCal = Calendar.getInstance();
-            toCal.setTimeInMillis(to);
-        }
-        ItemSearchResults<ArtifactSearchResult> results;
-        try {
-            results = searchService.searchArtifactsInRange(fromCal, toCal, reposToSearch, dates);
-        } catch (RepositoryRuntimeException e) {
-            String msg = "Got Exception retrieving artifacts date in range from=" + from + " to=" + to;
-            log.error(msg, e);
-            throw new RestException(msg + " due to " + e.getMessage());
-        }
-
-        if (results.getResults().isEmpty()) {
-            throw new NotFoundException(NOT_FOUND);
-        }
-        return createResponse(results, fromCal, toCal, dates);
-    }
-
-    private void assertValidRequest(Long from) {
-        if (authorizationService.isAnonymous()) {
-            throw new AuthorizationRestException();
-        }
-
-        if (from == null) {
-            throw new BadRequestException("'from' parameter cannot be empty!");
-        }
-    }
-
-    protected abstract Response createResponse(ItemSearchResults<ArtifactSearchResult> results, Calendar from,
-            Calendar to, RestDateFieldName[] dates);
-
-    protected String buildStorageUri(RepoPath repoPath) {
-        String servletContextUrl = HttpUtils.getServletContextUrl(request);
-        StringBuilder sb = new StringBuilder(servletContextUrl);
-        sb.append("/").append(RestConstants.PATH_API).append("/").append(ArtifactRestConstants.PATH_ROOT);
-        sb.append("/").append(repoPath.getRepoKey()).append("/").append(repoPath.getPath());
-        return sb.toString();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/PatternSearchResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/search/types/PatternSearchResource.java
deleted file mode 100644
index cb4e14f..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/PatternSearchResource.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.search.types;
-
-import java.io.IOException;
-import java.util.Set;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeoutException;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.GET;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.artifactory.addon.rest.AuthorizationRestException;
-import org.artifactory.addon.rest.MissingRestAddonException;
-import org.artifactory.addon.rest.RestAddon;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.rest.constant.SearchRestConstants;
-import org.artifactory.api.rest.search.result.PatternResultFileSet;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.repo.LocalCacheRepo;
-import org.artifactory.repo.Repo;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.rest.common.exception.BadRequestException;
-import org.artifactory.rest.common.exception.RestException;
-import org.artifactory.rest.common.util.RestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Exposes the pattern searcher to REST via the REST addon
- *
- * @author Noam Y. Tenne
- */
-public class PatternSearchResource {
-
-    private static final Logger log = LoggerFactory.getLogger(PatternSearchResource.class);
-
-    private AuthorizationService authorizationService;
-    private RepositoryService repositoryService;
-    private RestAddon restAddon;
-    private HttpServletRequest request;
-
-    public PatternSearchResource(AuthorizationService authorizationService, RepositoryService repositoryService,
-            RestAddon restAddon, HttpServletRequest request) {
-        this.authorizationService = authorizationService;
-        this.repositoryService = repositoryService;
-        this.restAddon = restAddon;
-        this.request = request;
-    }
-
-    @GET
-    @Produces({SearchRestConstants.MT_PATTERN_SEARCH_RESULT, MediaType.APPLICATION_JSON})
-    public PatternResultFileSet get(@QueryParam(SearchRestConstants.PARAM_PATTERN) String pattern) throws IOException {
-        if (!authorizationService.isAuthenticated() || authorizationService.isAnonymous()) {
-            throw new AuthorizationRestException();
-        }
-        try {
-            return search(pattern);
-        } catch (IllegalArgumentException iae) {
-            throw new BadRequestException(iae.getMessage());
-        } catch (MissingRestAddonException mrae) {
-            throw mrae;
-        } catch (TimeoutException te) {
-            String secs = ConstantValues.searchPatternTimeoutSecs.getString();
-            log.error("Artifacts pattern search timeout: artifactory.search.pattern.timeoutSecs={}.", secs);
-            throw new RestException(HttpStatus.SC_REQUEST_TIMEOUT,
-                    "Artifacts pattern search returned 0 results because it " +
-                            "exceeded the configured timeout (" + secs + " seconds). Please make sure your query is not too " +
-                            "broad, causing the search to scan too many nodes, or ask your Artifactory administrator to " +
-                            "change the default timeout."
-            );
-        } catch (Exception e) {
-            String errorMessage =
-                    String.format("Error occurred while searching for artifacts matching the pattern '%s': %s", pattern,
-                            e.getMessage());
-            log.error(errorMessage, e);
-            throw new RestException(errorMessage);
-        }
-    }
-
-    private PatternResultFileSet search(String pattern) throws ExecutionException, TimeoutException,
-            InterruptedException {
-        Set<String> matchingArtifacts = restAddon.searchArtifactsByPattern(pattern);
-
-        String[] patternTokens = StringUtils.split(pattern, ":", 2);
-        String requestedRepoKey = patternTokens[0];
-        Repo repo = ((InternalRepositoryService) repositoryService).repositoryByKey(requestedRepoKey);
-        if ((repo != null) && repo.isCache()) {
-            requestedRepoKey = ((LocalCacheRepo) repo).getRemoteRepo().getKey();
-        }
-
-        String repoUri = new StringBuilder().append(RestUtils.getServletContextUrl(request)).append("/").
-                append(requestedRepoKey).toString();
-
-        PatternResultFileSet fileSet = new PatternResultFileSet(repoUri, pattern, matchingArtifacts);
-        return fileSet;
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/PropertySearchResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/search/types/PropertySearchResource.java
deleted file mode 100644
index d3ca0f6..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/PropertySearchResource.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.search.types;
-
-import org.artifactory.api.repo.RepositoryBrowsingService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.rest.constant.SearchRestConstants;
-import org.artifactory.api.rest.search.result.InfoRestSearchResult;
-import org.artifactory.api.search.ItemSearchResults;
-import org.artifactory.api.search.SearchService;
-import org.artifactory.api.search.property.PropertySearchControls;
-import org.artifactory.api.search.property.PropertySearchResult;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.rest.common.exception.NotFoundException;
-import org.artifactory.rest.common.list.StringList;
-import org.artifactory.rest.util.StorageInfoHelper;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.GET;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-
-import static org.artifactory.api.rest.constant.SearchRestConstants.NOT_FOUND;
-
-/**
- * Resource class that handles Property search actions
- *
- * @author Eli Givoni
- */
-public class PropertySearchResource {
-
-    private AuthorizationService authorizationService;
-    private SearchService searchService;
-    private RepositoryService repositoryService;
-    private RepositoryBrowsingService repoBrowsingService;
-    private HttpServletRequest request;
-
-    public PropertySearchResource(AuthorizationService authorizationService, SearchService searchService,
-            RepositoryService repositoryService, RepositoryBrowsingService repoBrowsingService,
-            HttpServletRequest request) {
-        this.authorizationService = authorizationService;
-        this.searchService = searchService;
-        this.repositoryService = repositoryService;
-        this.repoBrowsingService = repoBrowsingService;
-        this.request = request;
-    }
-
-    @GET
-    @Produces({SearchRestConstants.MT_PROPERTY_SEARCH_RESULT, MediaType.APPLICATION_JSON})
-    public Response get(
-            @QueryParam(SearchRestConstants.PARAM_REPO_TO_SEARCH) StringList reposToSearch) throws IOException {
-        return search(reposToSearch);
-    }
-
-    @SuppressWarnings({"unchecked"})
-    private Response search(List<String> reposToSearch) throws IOException {
-        Map<String, String[]> parametersMap = request.getParameterMap();
-        if (parametersMap.isEmpty()) {
-            throw new NotFoundException(NOT_FOUND);
-        }
-
-        // build the search controls using the query parameters
-        PropertySearchControls searchControls = new PropertySearchControls();
-        searchControls.setLimitSearchResults(authorizationService.isAnonymous());
-        searchControls.setSelectedRepoForSearch(reposToSearch);
-        for (Map.Entry<String, String[]> parameterEntry : parametersMap.entrySet()) {
-            String parameterName = parameterEntry.getKey();
-            // don't use the repos parameter and the properties parameter as a property name parameter
-            if (!SearchRestConstants.PARAM_REPO_TO_SEARCH.equals(parameterName) &&
-                    !SearchRestConstants.PARAM_PROPERTIES.equals(parameterName)) {
-                String[] values = parameterEntry.getValue();
-                for (String value : values) {
-                    // all searches are "open" ones
-                    searchControls.put(parameterName, value, true);
-                }
-            }
-        }
-
-        if (searchControls.isEmpty()) {
-            return Response.status(Response.Status.BAD_REQUEST).entity("The search term cannot be empty").build();
-        }
-        if (searchControls.isWildcardsOnly()) {
-            return Response.status(Response.Status.BAD_REQUEST).entity(
-                    "Search term containing only wildcards is not permitted").build();
-        }
-
-        ItemSearchResults<PropertySearchResult> searchResults;
-        try {
-            searchResults = searchService.searchProperty(searchControls);
-        } catch (RepositoryRuntimeException e) {
-            throw new NotFoundException(e.getMessage());
-        }
-
-        List<PropertySearchResult> results = searchResults.getResults();
-        InfoRestSearchResult infoSearchResult = new InfoRestSearchResult();
-        for (PropertySearchResult result : results) {
-            ItemInfo itemInfo = result.getItemInfo();
-            StorageInfoHelper storageInfoHelper = new StorageInfoHelper(request, repositoryService, repoBrowsingService,
-                    itemInfo);
-            infoSearchResult.results.add(storageInfoHelper.createStorageInfo());
-        }
-
-        return Response.ok(infoSearchResult).build();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/UsageSinceResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/search/types/UsageSinceResource.java
deleted file mode 100644
index 505809f..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/search/types/UsageSinceResource.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-package org.artifactory.rest.resource.search.types;
-
-import java.io.IOException;
-import java.util.Calendar;
-import java.util.List;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.GET;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import org.artifactory.addon.rest.AuthorizationRestException;
-import org.artifactory.api.rest.constant.SearchRestConstants;
-import org.artifactory.api.rest.search.result.LastDownloadRestResult;
-import org.artifactory.api.search.SearchService;
-import org.artifactory.api.search.stats.StatsSearchControls;
-import org.artifactory.api.search.stats.StatsSearchResult;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.exception.NotFoundException;
-import org.artifactory.rest.common.list.StringList;
-import org.artifactory.rest.common.util.RestUtils;
-import org.artifactory.sapi.common.RepositoryRuntimeException;
-import org.springframework.beans.support.MutableSortDefinition;
-import org.springframework.beans.support.PropertyComparator;
-
-import static org.artifactory.api.rest.constant.SearchRestConstants.NOT_FOUND;
-
-/**
- * @author Eli Givoni
- */
-public class UsageSinceResource {
-    private AuthorizationService authorizationService;
-    private SearchService searchService;
-    private HttpServletRequest request;
-
-    public UsageSinceResource(AuthorizationService authorizationService, SearchService searchService,
-            HttpServletRequest request) {
-        this.authorizationService = authorizationService;
-        this.searchService = searchService;
-        this.request = request;
-    }
-
-    @GET
-    @Produces({SearchRestConstants.MT_USAGE_SINCE_SEARCH_RESULT, MediaType.APPLICATION_JSON})
-    public Response get(
-            @QueryParam(SearchRestConstants.PARAM_SEARCH_NOT_USED_SINCE) Long lastDownloaded,
-            @QueryParam(SearchRestConstants.PARAM_CREATED_BEFORE) Long createdBefore,
-            @QueryParam(SearchRestConstants.PARAM_REPO_TO_SEARCH) StringList reposToSearch) throws IOException {
-        if (authorizationService.isAnonymous()) {
-            throw new AuthorizationRestException();
-        }
-        return search(lastDownloaded, createdBefore, reposToSearch);
-    }
-
-    private Response search(Long lastDownloaded, Long createdBefore, List<String> reposToSearch)
-            throws IOException {
-        if (lastDownloaded == null) {
-            throw new NotFoundException(NOT_FOUND);
-        }
-
-        StatsSearchControls searchControls = new StatsSearchControls();
-        searchControls.setSelectedRepoForSearch(reposToSearch);
-        searchControls.setLimitSearchResults(authorizationService.isAnonymous());
-        Calendar cal = Calendar.getInstance();
-        cal.setTimeInMillis(lastDownloaded);
-        searchControls.setDownloadedSince(cal);
-
-        if (createdBefore != null) {
-            Calendar createdBeforeCalendar = Calendar.getInstance();
-            createdBeforeCalendar.setTimeInMillis(createdBefore);
-            searchControls.setCreatedBefore(createdBeforeCalendar);
-        }
-        List<StatsSearchResult> results;
-        try {
-            results = searchService.searchArtifactsNotDownloadedSince(searchControls).getResults();
-        } catch (RepositoryRuntimeException e) {
-            throw new NotFoundException(e.getMessage());
-        }
-
-        if (results.isEmpty()) {
-            throw new NotFoundException(NOT_FOUND);
-        }
-
-        // sort by last downloaded
-        MutableSortDefinition definition = new MutableSortDefinition("metadataObject.lastDownloaded", true, true);
-        PropertyComparator.sort(results, definition);
-        LastDownloadRestResult lastDownloadRestResult = new LastDownloadRestResult();
-        for (StatsSearchResult result : results) {
-            String uri = RestUtils.buildStorageInfoUri(request, result);
-            String lDownloaded = RestUtils.toIsoDateString(result.getLastDownloaded());
-            LastDownloadRestResult.DownloadedEntry entry = new LastDownloadRestResult.DownloadedEntry(uri, lDownloaded);
-            lastDownloadRestResult.results.add(entry);
-        }
-
-        return Response.ok(lastDownloadRestResult).build();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/security/SecurityConfigurationResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/security/SecurityConfigurationResource.java
deleted file mode 100644
index be6736b..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/security/SecurityConfigurationResource.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.security;
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.rest.constant.SecurityRestConstants;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.descriptor.security.PasswordExpirationPolicy;
-import org.artifactory.descriptor.security.PasswordSettings;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Michael Pasternak
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at Path(SecurityRestConstants.PATH_ROOT + "/" + "configuration")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
-public class SecurityConfigurationResource {
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Autowired
-    SecurityService securityService;
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @PUT
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Path("passwordExpirationPolicy")
-    public Response updatePasswordPolicy(PasswordExpirationPolicy newPasswordExpirationPolicy) {
-        if (newPasswordExpirationPolicy.getPasswordMaxAge() > 999 || newPasswordExpirationPolicy.getPasswordMaxAge() < 1)
-            return Response.status(Response.Status.BAD_REQUEST).entity("Password expiration must be between 1 - 999").build();
-
-        PasswordSettings originalPasswordSettings =
-                centralConfigService.getDescriptor().getSecurity().getPasswordSettings();
-
-        if (originalPasswordSettings == null) {
-            PasswordSettings defaultPasswordSettings = new PasswordSettings();
-            defaultPasswordSettings.setExpirationPolicy(newPasswordExpirationPolicy);
-            centralConfigService.getDescriptor().getSecurity().setPasswordSettings(defaultPasswordSettings);
-        } else {
-            if(originalPasswordSettings.getExpirationPolicy() == null) {
-                originalPasswordSettings.setExpirationPolicy(newPasswordExpirationPolicy);
-            } else {
-                if(newPasswordExpirationPolicy.isEnabled() != null)
-                    originalPasswordSettings.getExpirationPolicy().setEnabled(newPasswordExpirationPolicy.isEnabled());
-                if(newPasswordExpirationPolicy.getPasswordMaxAge() != null)
-                    originalPasswordSettings.getExpirationPolicy().setPasswordMaxAge(newPasswordExpirationPolicy.getPasswordMaxAge());
-                if(newPasswordExpirationPolicy.isNotifyByEmail() != null)
-                    originalPasswordSettings.getExpirationPolicy().setNotifyByEmail(newPasswordExpirationPolicy.isNotifyByEmail());
-            }
-        }
-        centralConfigService.saveEditedDescriptorAndReload(centralConfigService.getDescriptor());
-        return Response.ok().entity("Successfully updated password expiration policy").build();
-    }
-
-    @GET
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    @Produces(MediaType.APPLICATION_JSON)
-    @Path("passwordExpirationPolicy")
-    public PasswordExpirationPolicy getPasswordPolicy() {
-        return centralConfigService.getDescriptor().getSecurity().getPasswordSettings().getExpirationPolicy();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/security/SecurityResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/security/SecurityResource.java
deleted file mode 100644
index 3f19907..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/security/SecurityResource.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.security;
-
-import org.apache.commons.codec.CharEncoding;
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.rest.RestAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.rest.constant.SecurityRestConstants;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.api.security.UserGroupService;
-import org.artifactory.descriptor.security.PasswordSettings;
-import org.artifactory.descriptor.security.UserLockPolicy;
-import org.artifactory.rest.common.exception.NotFoundException;
-import org.artifactory.rest.common.exception.RestException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.*;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Noam Y. Tenne
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at Path(SecurityRestConstants.PATH_ROOT)
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
-public class SecurityResource {
-
-    private static final String ENTITY_TYPE = "entityType";
-    private static final String ENTITY_KEY = "entityKey";
-    private static final String INNER_PATH = "{" + ENTITY_TYPE + ": .+}/{" + ENTITY_KEY + ": .+}";
-
-    @Autowired
-    AddonsManager addonsManager;
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Autowired
-    SecurityService securityService;
-
-    @Context
-    private HttpServletRequest request;
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-
-    @GET
-    @Path("{" + ENTITY_TYPE + ": .+}")
-    @Produces({SecurityRestConstants.MT_USERS, SecurityRestConstants.MT_GROUPS,
-            SecurityRestConstants.MT_PERMISSION_TARGETS, MediaType.APPLICATION_JSON})
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    public Response getSecurityEntities(@PathParam(ENTITY_TYPE) String entityType) throws UnsupportedEncodingException {
-        RestAddon restAddon = addonsManager.addonByType(RestAddon.class);
-        return restAddon.getSecurityEntities(request, decodeEntityKey(entityType));
-    }
-
-    @GET
-    @Path(INNER_PATH)
-    @Produces({SecurityRestConstants.MT_USER, SecurityRestConstants.MT_GROUP,
-            SecurityRestConstants.MT_PERMISSION_TARGET, MediaType.APPLICATION_JSON})
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    public Response getSecurityEntity(@PathParam(ENTITY_TYPE) String entityType,
-            @PathParam(ENTITY_KEY) String entityKey) throws UnsupportedEncodingException {
-        RestAddon restAddon = addonsManager.addonByType(RestAddon.class);
-        return restAddon.getSecurityEntity(entityType, decodeEntityKey(entityKey));
-    }
-
-    @DELETE
-    @Path(INNER_PATH)
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    public Response deleteSecurityEntity(@PathParam(ENTITY_TYPE) String entityType,
-            @PathParam(ENTITY_KEY) String entityKey) throws UnsupportedEncodingException {
-        RestAddon restAddon = addonsManager.addonByType(RestAddon.class);
-        return restAddon.deleteSecurityEntity(entityType, decodeEntityKey(entityKey));
-    }
-
-    @PUT
-    @Path(INNER_PATH)
-    @Consumes({SecurityRestConstants.MT_USER, SecurityRestConstants.MT_GROUP,
-            SecurityRestConstants.MT_PERMISSION_TARGET, MediaType.APPLICATION_JSON})
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    public Response createOrReplaceSecurityEntity(@PathParam(ENTITY_TYPE) String entityType,
-            @PathParam(ENTITY_KEY) String entityKey) throws IOException {
-        RestAddon restAddon = addonsManager.addonByType(RestAddon.class);
-        return restAddon.createOrReplaceSecurityEntity(entityType, decodeEntityKey(entityKey), request);
-    }
-
-    @POST
-    @Path(INNER_PATH)
-    @Consumes({SecurityRestConstants.MT_USER, SecurityRestConstants.MT_GROUP,
-            SecurityRestConstants.MT_PERMISSION_TARGET, MediaType.APPLICATION_JSON})
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    public Response updateSecurityEntity(@PathParam(ENTITY_TYPE) String entityType,
-            @PathParam(ENTITY_KEY) String entityKey) throws IOException {
-        RestAddon restAddon = addonsManager.addonByType(RestAddon.class);
-        return restAddon.updateSecurityEntity(entityType, decodeEntityKey(entityKey), request);
-    }
-
-    @GET
-    @Path("encryptedPassword")
-    @Produces(MediaType.TEXT_PLAIN)
-    public Response getEncryptedPassword() {
-        if (!securityService.isPasswordEncryptionEnabled()) {
-            throw new RestException(HttpStatus.SC_CONFLICT, "Server doesn't support encrypted passwords");
-        }
-
-        String encryptedPassword = authorizationService.currentUserEncryptedPassword(false);
-        if (StringUtils.isNotBlank(encryptedPassword)) {
-            return Response.ok(encryptedPassword).build();
-        }
-
-        throw new NotFoundException("User not found: " + authorizationService.currentUsername());
-    }
-
-    private String decodeEntityKey(String entityKey) throws UnsupportedEncodingException {
-        return URLDecoder.decode(entityKey, CharEncoding.UTF_8);
-    }
-
-    @PUT
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Path("userLockPolicy")
-    public Response updateUserLockPolicy(UserLockPolicy userLockPolicy) {
-        if (userLockPolicy.getLoginAttempts() > 100 || userLockPolicy.getLoginAttempts() < 1)
-            return Response.status(Response.Status.BAD_REQUEST).entity("LoginAttempts must be between 1 - 100").build();
-
-        UserLockPolicy userLockPolicyConfig =
-                centralConfigService.getDescriptor().getSecurity().getUserLockPolicy();
-        if (userLockPolicyConfig == null) {
-            centralConfigService.getDescriptor().getSecurity().setUserLockPolicy(userLockPolicy);
-        } else {
-            userLockPolicyConfig.setEnabled(userLockPolicy.isEnabled());
-            userLockPolicyConfig.setLoginAttempts(userLockPolicy.getLoginAttempts());
-        }
-        centralConfigService.saveEditedDescriptorAndReload(centralConfigService.getDescriptor());
-        return Response.ok().entity("UserLockPolicy was successfully updated").build();
-    }
-
-    @GET
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    @Produces(MediaType.APPLICATION_JSON)
-    @Path("userLockPolicy")
-    public UserLockPolicy getUserLockPolicy() {
-        return centralConfigService.getDescriptor().getSecurity().getUserLockPolicy();
-    }
-
-    @POST
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    @Path("unlockUsers/{userName}")
-    public String unlockUser(@PathParam("userName") String userName) {
-        ((UserGroupService)securityService).unlockUser(userName);
-        return "User "+userName+" was successfully unlocked";
-    }
-
-    @POST
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    @Path("unlockAllUsers")
-    public String unlockAllUser() {
-        ((UserGroupService)securityService).unlockAllUsers();
-        return "All users were successfully unlocked";
-    }
-
-    @POST
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Path("unlockUsers")
-    public String unlockUsers(List<String> users) {
-        if(users != null)
-            users.parallelStream().forEach(u -> {
-                ((UserGroupService)securityService).unlockUser(u);
-            });
-        return "Specified users were successfully unlocked";
-    }
-
-    @GET
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    @Produces(MediaType.APPLICATION_JSON)
-    @Path("lockedUsers")
-    public Set<String> getAllLockedUsers() {
-        return ((UserGroupService)securityService).getLockedUsers();
-    }
-
-    @PUT
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Path("passwordSettings")
-    public Response updatePasswordPolicy(PasswordSettings userPasswordSettings) {
-        if (userPasswordSettings.getExpirationPolicy().getPasswordMaxAge() > 999 || userPasswordSettings.getExpirationPolicy().getPasswordMaxAge() < 1)
-            return Response.status(Response.Status.BAD_REQUEST).entity("Password expiration must be between 1 - 999").build();
-
-        PasswordSettings originalPasswordSettings =
-                centralConfigService.getDescriptor().getSecurity().getPasswordSettings();
-
-        if (originalPasswordSettings == null) {
-            centralConfigService.getDescriptor().getSecurity().setPasswordSettings(userPasswordSettings);
-        } else {
-            originalPasswordSettings.getExpirationPolicy().setEnabled(userPasswordSettings.getExpirationPolicy().isEnabled());
-            originalPasswordSettings.getExpirationPolicy().setPasswordMaxAge(userPasswordSettings.getExpirationPolicy().getPasswordMaxAge());
-        }
-        centralConfigService.saveEditedDescriptorAndReload(centralConfigService.getDescriptor());
-        return Response.ok().entity("PasswordSettings were successfully updated").build();
-    }
-
-    @GET
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    @Produces(MediaType.APPLICATION_JSON)
-    @Path("passwordSettings")
-    public PasswordSettings getPasswordPolicy() {
-        return centralConfigService.getDescriptor().getSecurity().getPasswordSettings();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/security/SecurityUserResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/security/SecurityUserResource.java
deleted file mode 100644
index 5982e52..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/security/SecurityUserResource.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.security;
-
-import org.artifactory.api.rest.constant.SecurityRestConstants;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.rest.common.dataholder.PasswordContainer;
-import org.artifactory.security.exceptions.PasswordChangeException;
-import org.artifactory.security.exceptions.PasswordExpireException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.List;
-
-/**
- * @author Michael Pasternak
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at Path(SecurityRestConstants.PATH_ROOT + "/users/authorization")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
-public class SecurityUserResource {
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Autowired
-    SecurityService securityService;
-
-    @POST
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.TEXT_PLAIN)
-    @Path("changePassword")
-    public Response changePassword(PasswordContainer passwordContainer) {
-        try {
-            securityService.changePassword(
-                    passwordContainer.getUserName(),
-                    passwordContainer.getOldPassword(),
-                    passwordContainer.getNewPassword1(),
-                    passwordContainer.getNewPassword2()
-            );
-            return Response.status(Response.Status.OK).entity("Password has been successfully changed").build();
-        } catch (PasswordChangeException e) {
-            return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
-        }
-    }
-
-    @POST
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.TEXT_PLAIN)
-    @Path("expirePassword")
-    public Response expirePassword(List<String> users) {
-        if(users!=null && users.size() > 0) {
-            if (securityService.isPasswordExpirationPolicyEnabled()) {
-                try {
-                    users.parallelStream().forEach(u -> {
-                        securityService.expireUserCredentials(u);
-                    });
-                } catch (PasswordExpireException e) {
-                    return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
-                }
-                return Response.status(Response.Status.OK).entity("Users credentials have been successfully expired").build();
-            }
-            return Response.status(Response.Status.BAD_REQUEST).entity("Password expiration is not enforced, please enable it first").build();
-        }
-        return Response.status(Response.Status.BAD_REQUEST).entity("Bad request, no users specified").build();
-    }
-
-    @POST
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    @Produces(MediaType.TEXT_PLAIN)
-    @Path("expirePassword/{userName}")
-    public Response expirePassword(@PathParam("userName") String userName) {
-        if (securityService.isPasswordExpirationPolicyEnabled()) {
-            try {
-                securityService.expireUserCredentials(userName);
-            } catch (PasswordExpireException e) {
-                return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
-            }
-            return Response.status(Response.Status.OK).entity(userName + "'s credentials have been expired").build();
-        }
-        return Response.status(Response.Status.BAD_REQUEST).entity("Password expiration is not enforced, please enable it first").build();
-    }
-
-    @POST
-    @Path("unexpirePassword/{userName}")
-    @Produces(MediaType.TEXT_PLAIN)
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    public Response unexpirePassword(@PathParam("userName") String userName) {
-        if (securityService.isPasswordExpirationPolicyEnabled()) {
-            try {
-                securityService.unexpirePassword(userName);
-            } catch (PasswordExpireException e) {
-                return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
-            }
-            return Response.status(Response.Status.OK).entity(userName + "'s credentials have been unexpired").build();
-        }
-        return Response.status(Response.Status.BAD_REQUEST).entity("Password expiration is not enforced, please enable it first").build();
-    }
-
-    @POST
-    @Path("expirePasswordForAllUsers")
-    @Produces(MediaType.TEXT_PLAIN)
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    public Response expirePasswordForAllUsers() {
-        if (securityService.isPasswordExpirationPolicyEnabled()) {
-            try {
-                securityService.expireCredentialsForAllUsers();
-            } catch (PasswordExpireException e) {
-                return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
-            }
-            return Response.status(Response.Status.OK).entity("Credentials have been successfully expired for all users").build();
-        }
-        return Response.status(Response.Status.BAD_REQUEST).entity("Password expiration is not enforced, please enable it first").build();
-    }
-
-    @POST
-    @Path("unexpirePasswordForAllUsers")
-    @Produces(MediaType.TEXT_PLAIN)
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    public Response unexpirePasswordForAllUsers() {
-        if (securityService.isPasswordExpirationPolicyEnabled()) {
-            try {
-                securityService.unexpirePasswordForAllUsers();
-            } catch (PasswordExpireException e) {
-                return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
-            }
-            return Response.status(Response.Status.OK).entity("Credentials have been successfully unexpired for all users").build();
-        }
-        return Response.status(Response.Status.BAD_REQUEST).entity("Password expiration is not enforced, please enable it first").build();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/ssh/SshResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/ssh/SshResource.java
deleted file mode 100644
index a5366e0..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/ssh/SshResource.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.ssh;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.api.security.SshAuthService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.http.HttpHeaders;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.GET;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.nio.file.Files;
-
-
-/**
- * @author Noam Y. Tenne
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at Path(SshResource.PATH_ROOT)
-public class SshResource {
-    private static final Logger log = LoggerFactory.getLogger(SshResource.class);
-
-    public static final String PATH_ROOT = "ssh";
-
-    @Autowired
-    private SshAuthService sshAuthService;
-
-    @Context
-    private HttpServletRequest request;
-
-    @GET
-    @Path("key/public")
-    @Produces(MediaType.TEXT_PLAIN)
-    public Response getPublicKey() {
-        java.nio.file.Path key = sshAuthService.getPublicKeyFile();
-        if (Files.notExists(key)) {
-            return Response.status(HttpStatus.SC_NOT_FOUND).entity(
-                    "No public SSH server key exists in Artifactory").build();
-        }
-
-        return Response.status(HttpStatus.SC_OK)
-                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + key.getFileName().toString())
-                .entity(key.toFile()).build();
-    }
-
-    @PUT
-    @Path("key/public")
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    public Response putPublicKey(String publicKey) {
-        try {
-            sshAuthService.savePublicKey(publicKey);
-        } catch (Exception e) {
-            String message = "Failed to install public SSH server key";
-            log.error(message, e);
-            return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).entity(message).build();
-        }
-        return Response.status(HttpStatus.SC_OK).entity("Successfully installed the public SSH server key").build();
-
-    }
-
-    @PUT
-    @Path("key/private")
-    @Produces(MediaType.TEXT_PLAIN)
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN})
-    public Response putPrivateKey(String privateKey) {
-        try {
-            sshAuthService.savePrivateKey(privateKey);
-        } catch (Exception e) {
-            String message = "Failed to install private SSH server key";
-            log.error(message, e);
-            return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).entity(message).build();
-        }
-        return Response.status(HttpStatus.SC_OK).entity("Successfully installed the private SSH server key").build();
-    }
-}
\ No newline at end of file
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/storagesummary/StorageSummaryInfoResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/storagesummary/StorageSummaryInfoResource.java
deleted file mode 100644
index 9d3a387..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/storagesummary/StorageSummaryInfoResource.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.artifactory.rest.resource.storagesummary;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.rest.services.ConfigServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
- at Component
- at Path("storageinfo")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class StorageSummaryInfoResource extends BaseResource {
-
-    @Autowired
-    protected ConfigServiceFactory configServiceFactory;
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getStorageSummary()
-            throws Exception {
-        return runService(configServiceFactory.getStorageSummaryService());
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/support/SupportRequestContent.java b/web/rest/src/main/java/org/artifactory/rest/resource/support/SupportRequestContent.java
deleted file mode 100644
index 48ad200..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/support/SupportRequestContent.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.rest.resource.support;
-
-import java.util.List;
-
-/**
- * Object holding requested content references
- *
- * @author Michael Pasternak
- */
-public class SupportRequestContent {
-    private List<String> bundles;
-
-    public SupportRequestContent(List<String> bundles) {
-        this.bundles = bundles;
-    }
-
-    /**
-     * @return relative links to produced bundles
-     */
-    public List<String> getBundles() {
-        return bundles;
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/support/SupportResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/support/SupportResource.java
deleted file mode 100644
index 971ddc3..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/support/SupportResource.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
-* Artifactory is a binaries repository manager.
-* Copyright (C) 2012 JFrog Ltd.
-*
-* Artifactory is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Lesser General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* Artifactory is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public License
-* along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package org.artifactory.rest.resource.support;
-
-import com.google.common.collect.Lists;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.support.SupportAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.support.config.bundle.BundleConfigurationImpl;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import java.io.FileNotFoundException;
-import java.util.List;
-
-import static org.artifactory.api.rest.constant.ArtifactRestConstants.SUPPORT_ROOT;
-import static org.artifactory.api.rest.constant.ArtifactRestConstants.SUPPORT_BUNDLES_PATH;
-
-/**
- * Provides support content generation services
- *
- * @author Michael Pasternak
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at Path(SUPPORT_ROOT)
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
-public class SupportResource {
-    private static final Logger log = LoggerFactory.getLogger(SupportResource.class);
-    private static final String API_SUPPORT_DOWNLOAD_BUNDLE =
-            "/api/"+SUPPORT_ROOT+"/"+SUPPORT_BUNDLES_PATH+"/";
-
-    @Autowired
-    private AuthorizationService authorizationService;
-
-    @Context
-    private HttpServletRequest httpServletRequest;
-
-    @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
-    @Produces(MediaType.APPLICATION_JSON)
-    @Path(SUPPORT_BUNDLES_PATH)
-    @POST
-    public Response generateBundle(BundleConfigurationImpl bundleConfiguration) {
-        log.debug("Producing support bundle according to configuration: {}", bundleConfiguration);
-
-        if (authorizationService.isAnonymous() || !authorizationService.isAdmin()) {
-            return unauthorized();
-        }
-
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        SupportAddon supportAddon = addonsManager.addonByType(SupportAddon.class);
-
-        List<String> bundles = supportAddon.generate(bundleConfiguration);
-
-        if(bundles != null)
-            return Response.ok().entity(wrapResponse(bundles)).build();
-        return Response.status(Response.Status.BAD_REQUEST)
-                .entity("Support content collection has failed, see 'support.log' for more details")
-                .build();
-    }
-
-    /**
-     * Wraps generated bundles to relative links
-     *
-     * @param bundles bundle names
-     *
-     * @return {@link SupportRequestContent}
-     */
-    private SupportRequestContent wrapResponse(List<String> bundles) {
-        if (bundles.size() > 0) {
-            List<String> links = Lists.newArrayList();
-            for(String item : bundles) {
-                links.add(httpServletRequest.getContextPath() + API_SUPPORT_DOWNLOAD_BUNDLE + item);
-            }
-            return new SupportRequestContent(links);
-        }
-        return null;
-    }
-
-    @Path(SUPPORT_BUNDLES_PATH + "/{archive: .+}")
-    @GET
-    @Produces(MediaType.APPLICATION_OCTET_STREAM)
-    public Response downloadBundle(@PathParam("archive") String archive) {
-        if (authorizationService.isAnonymous() || !authorizationService.isAdmin()) {
-            return unauthorized();
-        }
-
-        log.debug("Downloading bundle: {}", archive);
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        SupportAddon supportAddon = addonsManager.addonByType(SupportAddon.class);
-        try {
-            return Response.ok().entity(supportAddon.download(archive)).build();
-        } catch (FileNotFoundException e) {
-            log.debug("Support bundle \"" + archive + "\" does not exist");
-            return Response.status(Response.Status.NOT_FOUND).build();
-        }
-    }
-
-    @Path(SUPPORT_BUNDLES_PATH)
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response listBundles() {
-        if (authorizationService.isAnonymous() || !authorizationService.isAdmin()) {
-            return unauthorized();
-        }
-
-        log.debug("Listing all bundles");
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        SupportAddon supportAddon = addonsManager.addonByType(SupportAddon.class);
-        return Response.ok().entity(wrapResponse(supportAddon.list())).build();
-    }
-
-    @Path(SUPPORT_BUNDLES_PATH + "/{archive: .+}")
-    @DELETE
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response deleteBundle(@PathParam("archive") String archive) {
-        if (authorizationService.isAnonymous() || !authorizationService.isAdmin()) {
-            return unauthorized();
-        }
-
-        log.debug("Deleting bundle: {}", archive);
-        AddonsManager addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-        SupportAddon supportAddon = addonsManager.addonByType(SupportAddon.class);
-        try {
-            supportAddon.delete(archive, true); // async operation
-            return Response.status(Response.Status.ACCEPTED).build();
-
-        } catch (FileNotFoundException e) {
-            log.debug("Support bundle \"" + archive + "\" does not exist");
-            return Response.status(Response.Status.NOT_FOUND).build();
-        }
-    }
-
-    private Response unauthorized() {
-        return Response.status(Response.Status.UNAUTHORIZED).build();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/system/ArtifactoryLicenseResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/system/ArtifactoryLicenseResource.java
deleted file mode 100644
index bdcd099..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/system/ArtifactoryLicenseResource.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.system;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.CoreAddons;
-import org.artifactory.addon.license.LicenseInstaller;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.state.ArtifactoryServerState;
-import org.artifactory.state.model.ArtifactoryStateManager;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import static javax.ws.rs.core.Response.Status.*;
-
-/**
- * @author Yoav Luft
- */
-public class ArtifactoryLicenseResource {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryLicenseResource.class);
-
-    private final ArtifactoryStateManager stateManager;
-    private AddonsManager addonsManager;
-
-    public ArtifactoryLicenseResource() {
-        stateManager = ContextHelper.get().beanForType(ArtifactoryStateManager.class);
-        addonsManager = ContextHelper.get().beanForType(AddonsManager.class);
-    }
-
-    private class ResponseMessage {
-        public final int status;
-        public final String message;
-
-        public ResponseMessage(String message, int status) {
-            this.message = message;
-            this.status = status;
-        }
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getLicenseInfo() {
-        try {
-            String[] details = addonsManager.getLicenseDetails();
-            LicenseDetails licenseDetails = new LicenseDetails(details[2], details[1], details[0]);
-            return Response.ok().entity(licenseDetails).build();
-        } catch (UnsupportedOperationException e) {
-            return Response.ok().entity(new LicenseDetails("Open Source", "", "")).build();
-        }
-    }
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response installLicense(LicenseConfiguration licenseMessage) {
-        String licenseKey = licenseMessage.licenseKey;
-        if (addonsManager.addonByType(CoreAddons.class).isAol()) {
-            String message = "Cannot manage license on Artifactory Online. Please contact JFrog " +
-                    "support at support at jfrog.com for managing your AOL installation.";
-            return Response.status(BAD_REQUEST).entity(
-                    new ResponseMessage(message, BAD_REQUEST.getStatusCode())).build();
-        }
-        if (StringUtils.isBlank(licenseKey)) {
-            return Response.status(BAD_REQUEST).entity(
-                    new ResponseMessage("No license key supplied.", BAD_REQUEST.getStatusCode())).build();
-        }
-        final Response.ResponseBuilder responseBuilder = Response.ok();
-
-        LicenseInstaller.LicenseInstallCallback callback = new LicenseInstaller.LicenseInstallCallback() {
-            @Override
-            public void handleSuccess() {
-                log.info(LicenseInstaller.SUCCESSFULLY_INSTALL);
-                boolean success = stateManager.forceState(ArtifactoryServerState.RUNNING);
-                if (success) {
-                    responseBuilder.entity(
-                            new ResponseMessage(LicenseInstaller.SUCCESSFULLY_INSTALL, OK.getStatusCode()));
-                } else {
-                    responseBuilder.entity(
-                            new ResponseMessage(LicenseInstaller.SUCCESSFULLY_INSTALL + " In order for " +
-                                    "the change will take place, please restart the server", OK.getStatusCode()));
-                }
-            }
-
-            @Override
-            public void switchOffline(String message) {
-                log.warn(message);
-                stateManager.forceState(ArtifactoryServerState.OFFLINE);
-                responseBuilder.status(Response.Status.ACCEPTED).entity(
-                        new ResponseMessage(message, ACCEPTED.getStatusCode()));
-            }
-
-            @Override
-            public void handleError(String message) {
-                log.error(message);
-                responseBuilder.status(BAD_REQUEST).entity(new ResponseMessage(message, BAD_REQUEST.getStatusCode()));
-            }
-        };
-        new LicenseInstaller().install(licenseKey, callback);
-        return responseBuilder.build();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/system/ConfigResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/system/ConfigResource.java
deleted file mode 100644
index 8cfbfc8..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/system/ConfigResource.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.system;
-
-
-import com.google.common.base.Strings;
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.rest.constant.ConfigRestConstants;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.rest.common.exception.BadRequestException;
-import org.artifactory.util.HttpUtils;
-import org.artifactory.util.UrlValidator;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.security.RolesAllowed;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.io.File;
-
-
-/**
- * @author freds
- */
-public class ConfigResource {
-    private static final Logger log = LoggerFactory.getLogger(ConfigResource.class);
-
-    CentralConfigService centralConfigService;
-    private HttpServletRequest request;
-    private final UrlValidator urlValidator;
-
-    public ConfigResource(CentralConfigService centralConfigService, HttpServletRequest httpServletRequest) {
-        this.centralConfigService = centralConfigService;
-        this.request = httpServletRequest;
-        this.urlValidator = new UrlValidator("http", "https");
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_XML)
-    public CentralConfigDescriptor getConfig() {
-        return centralConfigService.getDescriptor();
-        /*
-        File configFile = ArtifactoryHome.getConfigFile();
-        try {
-            return org.apache.commons.io.Files.readFileToString(configFile, "utf-8");
-        } catch (IOException e) {
-            throw new RuntimeException(e.getMessage(), e);
-        }
-        */
-    }
-
-    @POST
-    @Consumes(MediaType.APPLICATION_XML)
-    @Produces(MediaType.TEXT_PLAIN)
-    public String setConfig(String xmlContent) {
-        log.debug("Received new configuration data.");
-        centralConfigService.setConfigXml(xmlContent,true);
-        CentralConfigDescriptor descriptor = centralConfigService.getDescriptor();
-        int x = descriptor.getLocalRepositoriesMap().size();
-        int y = descriptor.getRemoteRepositoriesMap().size();
-        int z = descriptor.getVirtualRepositoriesMap().size();
-        return "Reload of new configuration (" + x + " local repos, " + y + " remote repos, " + z +
-                " virtual repos) succeeded";
-    }
-
-    @PUT
-    @Consumes("application/xml")
-    @Path(ConfigRestConstants.REMOTE_REPOSITORIES_PATH)
-    public void useRemoteRepositories(String xmlContent) {
-        //TODO: [by tc] do
-    }
-
-    @GET
-    @Produces(MediaType.TEXT_PLAIN)
-    @Path(ConfigRestConstants.LOGO_URL_PATH)
-    public String logoUrl() {
-        String descriptorLogo = centralConfigService.getDescriptor().getLogo();
-        if (StringUtils.isNotBlank(descriptorLogo)) {
-            return descriptorLogo;
-        }
-
-        File logoFile = new File(ContextHelper.get().getArtifactoryHome().getLogoDir(), "logo");
-        if (logoFile.exists()) {
-            return HttpUtils.getServletContextUrl(request) + "/webapp/logo?" + logoFile.lastModified();
-        }
-
-        return null;
-    }
-
-    @PUT
-    @Consumes({MediaType.TEXT_PLAIN})
-    @RolesAllowed(AuthorizationService.ROLE_ADMIN)
-    @Path(ConfigRestConstants.URL_BASE_PATH)
-    public Response setUrlBase(String urlBase) {
-        log.debug("Updating URL base: {}", urlBase);
-        final String messageFailed = "Updating URL base has failed.\n";
-        final String messageOk = "URL base has been successfully updated to \"%s\".\n";
-
-        validateUrl(urlBase);
-        persistUrl(urlBase);
-
-        if(!centralConfigService.getMutableDescriptor().getUrlBase().equals(urlBase))
-            return Response.serverError().entity(messageFailed).build();
-        return Response.ok().entity(String.format(messageOk, urlBase)).build();
-    }
-
-    /**
-     * Saves new urlBase in configuration.
-     *
-     * @param urlBase url to save.
-     */
-    private void persistUrl(String urlBase) {
-        MutableCentralConfigDescriptor descriptor = centralConfigService.getMutableDescriptor();
-        descriptor.setUrlBase(urlBase);
-        centralConfigService.saveEditedDescriptorAndReload(descriptor);
-    }
-
-    /**
-     * Validates URL using UrlValidator.
-     *
-     * @see {@link org.artifactory.util.UrlValidator}
-     *
-     * @param urlBase url to validate.
-     * @throws BadRequestException if URL is in illegal form.
-     */
-    private void validateUrl(String urlBase) {
-        if (!Strings.isNullOrEmpty(urlBase)) { // we allow removing custom urlBase
-            try {
-                urlValidator.validate(urlBase);
-            } catch (UrlValidator.UrlValidationException ex) {
-                throw new BadRequestException(ex.getMessage());
-            }
-        }
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/system/ExportResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/system/ExportResource.java
deleted file mode 100644
index d6dea27..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/system/ExportResource.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.system;
-
-
-import org.apache.http.HttpStatus;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.CoreAddons;
-import org.artifactory.api.config.ExportSettingsImpl;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.rest.constant.ImportRestConstants;
-import org.artifactory.api.rest.constant.SystemRestConstants;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.distribution.DistributionRepoDescriptor;
-import org.artifactory.rest.common.exception.BadRequestException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.*;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author freds
- * @date Sep 4, 2008
- */
- at Path(SystemRestConstants.PATH_EXPORT)
- at RolesAllowed(AuthorizationService.ROLE_ADMIN)
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ExportResource {
-    private static final Logger log = LoggerFactory.getLogger(ExportResource.class);
-
-    @Context
-    HttpServletResponse httpResponse;
-
-    @Autowired
-    RepositoryService repoService;
-
-    @GET
-    @Path(ImportRestConstants.SYSTEM_PATH)
-    @Produces({SystemRestConstants.MT_EXPORT_SETTINGS, MediaType.APPLICATION_JSON})
-    public ExportSettingsConfigurationImpl settingsExample() {
-        assertNotAol();
-        ExportSettingsConfigurationImpl settings = new ExportSettingsConfigurationImpl();
-        settings.setExportPath("/export/path");
-        return settings;
-    }
-
-    @POST
-    @Path(ImportRestConstants.SYSTEM_PATH)
-    @Consumes({SystemRestConstants.MT_EXPORT_SETTINGS, MediaType.APPLICATION_JSON})
-    public Response activateExport(ExportSettingsConfigurationImpl settings) {
-        assertNotAol();
-        ImportExportStreamStatusHolder holder = new ImportExportStreamStatusHolder(httpResponse);
-        ExportSettingsImpl exportSettings = new ExportSettingsImpl(new File(settings.getExportPath()), holder);
-        exportSettings.setIncludeMetadata(settings.isIncludeMetadata());
-        exportSettings.setCreateArchive(settings.isCreateArchive());
-        exportSettings.setIgnoreRepositoryFilteringRulesOn(settings.isBypassFiltering());
-        exportSettings.setVerbose(settings.isVerbose());
-        exportSettings.setFailFast(settings.isFailOnError());
-        exportSettings.setFailIfEmpty(settings.isFailIfEmpty());
-        exportSettings.setM2Compatible(settings.isM2());
-        exportSettings.setIncremental(settings.isIncremental());
-        exportSettings.setExcludeContent(settings.isExcludeContent());
-
-        if (settings.isIncludeMetadata() || !settings.isExcludeContent()) {
-            exportSettings.setRepositories(getAllLocalRepoKeys());
-        }
-        log.debug("Activating export {}", settings);
-        try {
-            ContextHelper.get().exportTo(exportSettings);
-            if (!httpResponse.isCommitted() && holder.isError()) {
-                return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).entity(
-                        "Export finished with errors. Check " +
-                                "Artifactory logs for more details."
-                ).build();
-            }
-        } catch (Exception e) {
-            if (!httpResponse.isCommitted()) {
-                return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
-            }
-        }
-        return Response.ok().build();
-    }
-
-    private List<String> getAllLocalRepoKeys() {
-        List<String> repoKeys = new ArrayList<>();
-        for (LocalRepoDescriptor localRepoDescriptor : repoService.getLocalAndCachedRepoDescriptors()) {
-            repoKeys.add(localRepoDescriptor.getKey());
-        }
-        for (DistributionRepoDescriptor distributionRepoDescriptor : repoService.getDistributionRepoDescriptors()) {
-            repoKeys.add(distributionRepoDescriptor.getKey());
-        }
-        return repoKeys;
-    }
-
-    private void assertNotAol() {
-        if (ContextHelper.get().beanForType(AddonsManager.class).addonByType(CoreAddons.class).isAol()) {
-            log.debug("Canceling system export request - not allowed on AOL");
-            throw new BadRequestException("Export System function is not supported when running on the cloud");
-        }
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/system/ExportSettingsConfigurationImpl.java b/web/rest/src/main/java/org/artifactory/rest/resource/system/ExportSettingsConfigurationImpl.java
deleted file mode 100644
index 44d9311..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/system/ExportSettingsConfigurationImpl.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.system;
-
-/**
- * Date: 10/27/11
- * Time: 2:37 PM
- *
- * @author Fred Simon
- */
-public class ExportSettingsConfigurationImpl {
-    private String exportPath;
-    private boolean explicitIncludeMetadata;
-    private boolean includeMetadata = true;
-    private boolean createArchive;
-    private boolean bypassFiltering;
-    private boolean verbose;
-    private boolean failOnError = false;
-    private boolean failIfEmpty = true;
-    private boolean m2;
-    private boolean incremental;
-    private boolean excludeContent;
-
-    public void setIncludeMetadata(boolean includeMetadata) {
-        explicitIncludeMetadata = true;
-        this.includeMetadata = includeMetadata;
-    }
-
-    public boolean isIncludeMetadata() {
-        // The following code supports old behaviors. in previous versions excludeMetadata was allowed only if the
-        // excludeContent was true
-        if (explicitIncludeMetadata) {
-            return includeMetadata;
-        }
-        if (excludeContent) {
-            return false;
-        }
-        return includeMetadata;
-    }
-
-    public String getExportPath() {
-        return exportPath;
-    }
-
-    public void setExportPath(String exportPath) {
-        this.exportPath = exportPath;
-    }
-
-    public boolean isCreateArchive() {
-        return createArchive;
-    }
-
-    public void setCreateArchive(boolean createArchive) {
-        this.createArchive = createArchive;
-    }
-
-    public boolean isBypassFiltering() {
-        return bypassFiltering;
-    }
-
-    public void setBypassFiltering(boolean bypassFiltering) {
-        this.bypassFiltering = bypassFiltering;
-    }
-
-    public boolean isVerbose() {
-        return verbose;
-    }
-
-    public void setVerbose(boolean verbose) {
-        this.verbose = verbose;
-    }
-
-    public boolean isFailOnError() {
-        return failOnError;
-    }
-
-    public void setFailOnError(boolean failOnError) {
-        this.failOnError = failOnError;
-    }
-
-    public boolean isFailIfEmpty() {
-        return failIfEmpty;
-    }
-
-    public void setFailIfEmpty(boolean failIfEmpty) {
-        this.failIfEmpty = failIfEmpty;
-    }
-
-    public boolean isM2() {
-        return m2;
-    }
-
-    public void setM2(boolean m2) {
-        this.m2 = m2;
-    }
-
-    public boolean isIncremental() {
-        return incremental;
-    }
-
-    public void setIncremental(boolean incremental) {
-        this.incremental = incremental;
-    }
-
-    public boolean isExcludeContent() {
-        return excludeContent;
-    }
-
-    public void setExcludeContent(boolean excludeContent) {
-        this.excludeContent = excludeContent;
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/system/GlobalReplicationResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/system/GlobalReplicationResource.java
deleted file mode 100644
index 4c11443..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/system/GlobalReplicationResource.java
+++ /dev/null
@@ -1,127 +0,0 @@
-package org.artifactory.rest.resource.system;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.replication.GlobalReplicationsConfigDescriptor;
-import org.artifactory.storage.fs.service.ConfigsService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.io.IOException;
-import java.io.Serializable;
-
-import static org.artifactory.api.rest.constant.SystemRestConstants.PATH_REPLICATIONS;
-import static org.artifactory.api.rest.constant.SystemRestConstants.PATH_ROOT;
-
-/**
- * @author gidis
- */
- at Path(PATH_ROOT+ "/" + PATH_REPLICATIONS)
- at RolesAllowed(AuthorizationService.ROLE_ADMIN)
- at Component
-public class GlobalReplicationResource {
-
-    @Autowired
-    ConfigsService configsService;
-
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getGlobalReplicationConfig() {
-        GlobalReplicationsConfigDescriptor config = ContextHelper.get()
-                .getCentralConfig().getDescriptor().getReplicationsConfig();
-        // Copy the info from the descriptor to
-        GlobalReplicationConfig result=new GlobalReplicationConfig();
-        result.setBlockPullReplications(config.isBlockPullReplications());
-        result.setBlockPushReplications(config.isBlockPushReplications());
-        return Response.ok().entity(result).build();
-    }
-    /**
-     * Globally disable the push replication
-     */
-    @POST
-    @Path("block")
-    public Response blockPushPull(@QueryParam("push") String push,
-                                  @QueryParam("pull") String pull) throws IOException {
-        updateDescriptor(push, pull, true);
-        String msg = "Successfully blocked all replications, no replication will be triggered.";
-        boolean noPush = StringUtils.isNotBlank(push) && !Boolean.parseBoolean(push);
-        if (noPush) {
-            msg = "Successfully blocked all pull replications, no pull replication will be triggered.";
-        }
-        boolean noPull = StringUtils.isNotBlank(pull) && !Boolean.parseBoolean(pull);
-        if (noPull) {
-            msg = "Successfully blocked all push replications, no push replication will be triggered.";
-        }
-        if (noPush && noPull) {
-            msg = "No action taken.";
-        }
-        return Response.ok(msg).build();
-    }
-
-    /**
-     * Globally enable the push replication
-     */
-    @POST
-    @Path("unblock")
-    public Response unblockPushPull(@QueryParam("push") String push,
-                                    @QueryParam("pull") String pull) throws IOException {
-        updateDescriptor(push, pull, false);
-        String msg = "Successfully unblocked all replications.";
-        boolean noPush = StringUtils.isNotBlank(push) && !Boolean.parseBoolean(push);
-        if (noPush) {
-            msg = "Successfully unblocked all pull replications.";
-        }
-        boolean noPull = StringUtils.isNotBlank(pull) && !Boolean.parseBoolean(pull);
-        if (noPull) {
-            msg = "Successfully unblocked all push replications.";
-        }
-        if (noPush && noPull) {
-            msg = "No action taken.";
-        }
-        return Response.ok(msg).build();
-    }
-
-    private void updateDescriptor(String push, String pull, boolean status) {
-        boolean pushVal = push == null || Boolean.parseBoolean(push);
-        boolean pullVal = pull == null || Boolean.parseBoolean(pull);
-        CentralConfigService centralConfig = ContextHelper.get().getCentralConfig();
-        CentralConfigDescriptor descriptor = centralConfig.getMutableDescriptor();
-        if(pushVal) {
-            descriptor.getReplicationsConfig().setBlockPushReplications(status);
-        }
-        if(pullVal) {
-            descriptor.getReplicationsConfig().setBlockPullReplications(status);
-        }
-        centralConfig.saveEditedDescriptorAndReload(descriptor);
-    }
-
-    private class GlobalReplicationConfig implements Serializable{
-        private boolean blockPullReplications;
-
-        private boolean blockPushReplications;
-
-        public boolean isBlockPullReplications() {
-            return blockPullReplications;
-        }
-
-        public void setBlockPullReplications(boolean blockPullReplications) {
-            this.blockPullReplications = blockPullReplications;
-        }
-
-        public boolean isBlockPushReplications() {
-            return blockPushReplications;
-        }
-
-        public void setBlockPushReplications(boolean blockPushReplications) {
-            this.blockPushReplications = blockPushReplications;
-        }
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/system/ImportExportStreamStatusHolder.java b/web/rest/src/main/java/org/artifactory/rest/resource/system/ImportExportStreamStatusHolder.java
deleted file mode 100644
index 5483bf7..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/system/ImportExportStreamStatusHolder.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.system;
-
-
-import com.google.common.base.Charsets;
-import org.artifactory.api.common.ImportExportStatusHolder;
-import org.artifactory.common.StatusEntry;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.io.PrintStream;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * User: freds Date: Aug 12, 2008 Time: 7:49:54 PM
- */
-public class ImportExportStreamStatusHolder extends ImportExportStatusHolder {
-    private static final Logger log = LoggerFactory.getLogger(ImportExportStreamStatusHolder.class);
-    private HttpServletResponse response;
-    private PrintStream out;
-    private boolean brokenPipe = false;
-    private AtomicInteger doingDots = new AtomicInteger(0);
-
-    public ImportExportStreamStatusHolder(HttpServletResponse response) {
-        this.response = response;
-        setActivateLogging(true);
-    }
-
-    @Override
-    public void addStatusEntry(StatusEntry entry) {
-        super.addStatusEntry(entry);
-        if (entry.isDebug() || entry.isInfo()) {
-            if (isVerbose() || !entry.isDebug()) {
-                String msg = entry.getMessage() + "\n";
-                int dots = doingDots.getAndSet(0);
-                if (dots > 0) {
-                    msg = "\n" + msg;
-                }
-                sendToClient(msg);
-            } else {
-                int dots = doingDots.incrementAndGet();
-                if (dots == 80) {
-                    doingDots.getAndAdd(-80);
-                    sendToClient("\n");
-                } else {
-                    sendToClient(".");
-                }
-            }
-        } else {
-            if (!brokenPipe) {
-                try {
-                    PrintStream os = getResponseStream();
-                    os.println("\n" + entry.getStatusCode() + " : " + entry.getMessage());
-                    Throwable throwable = entry.getException();
-                    if ((throwable != null) && isVerbose()) {
-                        throwable.printStackTrace(os);
-                    }
-                    os.flush();
-                } catch (Exception e) {
-                    log.error("Cannot send status to client. Will stop sending them.", e);
-                    brokenPipe = true;
-                }
-            }
-        }
-    }
-
-    private void sendToClient(String statusMsg) {
-        if (!brokenPipe) {
-            try {
-                PrintStream os = getResponseStream();
-                os.print(statusMsg);
-                os.flush();
-            } catch (Exception e) {
-                log.error("Cannot send status to client. Will stop sending them.", e);
-                brokenPipe = true;
-            }
-        }
-    }
-
-    private PrintStream getResponseStream() {
-        if (out == null) {
-            try {
-                response.setContentType("text/plain;charset=utf-8");
-                response.setStatus(200);
-                out = new PrintStream(response.getOutputStream(), false, Charsets.UTF_8.displayName());
-            } catch (IOException e) {
-                log.error("Cannot create writer stream to client " + e.getMessage(), e);
-                brokenPipe = true;
-            }
-        }
-        return out;
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/system/ImportResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/system/ImportResource.java
deleted file mode 100644
index f6c4f62..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/system/ImportResource.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.system;
-
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.http.HttpStatus;
-import org.artifactory.api.config.ImportSettingsImpl;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.rest.constant.ImportRestConstants;
-import org.artifactory.api.rest.constant.RepositoriesRestConstants;
-import org.artifactory.api.rest.constant.SystemRestConstants;
-import org.artifactory.api.search.ArchiveIndexer;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.exception.BadRequestException;
-import org.artifactory.sapi.common.ImportSettings;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-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.Response;
-import java.io.File;
-import java.io.IOException;
-
-/**
- * @author freds
- * @author Tomer Cohen
- * @date Sep 4, 2008
- */
- at Path(ImportRestConstants.PATH_ROOT)
- at RolesAllowed(AuthorizationService.ROLE_ADMIN)
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ImportResource {
-    private static final Logger log = LoggerFactory.getLogger(ImportResource.class);
-
-    @Context
-    HttpServletResponse httpResponse;
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @Autowired
-    AuthorizationService authorizationService;
-
-    @Autowired
-    ArchiveIndexer archiveIndexer;
-
-
-    @GET
-    @Path(ImportRestConstants.SYSTEM_PATH)
-    @Produces({SystemRestConstants.MT_IMPORT_SETTINGS, MediaType.APPLICATION_JSON})
-    public ImportSettingsConfigurationImpl settingsExample() {
-        ImportSettingsConfigurationImpl settingsConfiguration = new ImportSettingsConfigurationImpl();
-        settingsConfiguration.importPath = "/import/path";
-        return settingsConfiguration;
-    }
-
-    @POST
-    @Path(ImportRestConstants.SYSTEM_PATH)
-    @Consumes({SystemRestConstants.MT_IMPORT_SETTINGS, MediaType.APPLICATION_JSON})
-    public Response activateImport(ImportSettingsConfigurationImpl settings) {
-        log.debug("Activating import {}", settings);
-        ImportExportStreamStatusHolder holder = new ImportExportStreamStatusHolder(httpResponse);
-        try {
-            ImportSettings importSettings = new ImportSettingsImpl(new File(settings.importPath), holder);
-            importSettings.setIncludeMetadata(settings.includeMetadata);
-            importSettings.setVerbose(settings.verbose);
-            importSettings.setFailFast(settings.failOnError);
-            importSettings.setFailIfEmpty(settings.failIfEmpty);
-            ContextHelper.get().importFrom(importSettings);
-            if (!httpResponse.isCommitted() && holder.hasErrors()) {
-                return Response.serverError().entity(holder.getLastError().getMessage()).build();
-            }
-        } catch (Exception e) {
-            holder.error("Received uncaught exception", e, log);
-            if (!httpResponse.isCommitted()) {
-                return Response.serverError().entity(e.getMessage()).build();
-            }
-        }
-        return Response.ok().build();
-    }
-
-    @POST
-    @Path(ImportRestConstants.REPOSITORIES_PATH)
-    public void importRepositories(
-            //The base path to import from (may contain a single repo or multiple repos with named sub folders
-            @QueryParam(RepositoriesRestConstants.PATH) String path,
-            //Empty/null repo -> all
-            @QueryParam(RepositoriesRestConstants.TARGET_REPO) String targetRepo,
-            //Include metadata - default 1
-            @QueryParam(RepositoriesRestConstants.INCLUDE_METADATA) String includeMetadata,
-            //Verbose - default 0
-            @QueryParam(RepositoriesRestConstants.VERBOSE) String verbose) throws IOException {
-
-        if (StringUtils.isBlank(path)) {
-            throw new BadRequestException("You must provide a repository path to import from.");
-        }
-
-        ImportExportStreamStatusHolder statusHolder = new ImportExportStreamStatusHolder(httpResponse);
-        String repoNameToImport = targetRepo;
-        if (StringUtils.isBlank(repoNameToImport)) {
-            repoNameToImport = "All repositories";
-        }
-        statusHolder.status("Starting Repositories Import of " + repoNameToImport + " from " + path, log);
-        if (!authorizationService.isAdmin()) {
-            statusHolder.error(
-                    "User " + authorizationService.currentUsername() + " is not permitted to import repositories",
-                    HttpStatus.SC_FORBIDDEN, log);
-            return;
-        }
-        if (StringUtils.isEmpty(path)) {
-            statusHolder.error("Source directory path may not be empty.", HttpStatus.SC_BAD_REQUEST, log);
-        }
-        File baseDir = new File(path);
-        if (!baseDir.exists()) {
-            statusHolder.error("Directory " + path + " does not exist.", HttpStatus.SC_BAD_REQUEST, log);
-        }
-        ImportSettingsImpl importSettings = new ImportSettingsImpl(baseDir, statusHolder);
-        if (StringUtils.isNotBlank(includeMetadata)) {
-            importSettings.setIncludeMetadata(Integer.parseInt(includeMetadata) == 1);
-        }
-        if (StringUtils.isNotBlank(verbose)) {
-            importSettings.setVerbose(Integer.parseInt(verbose) == 1);
-        }
-        try {
-            if (StringUtils.isBlank(targetRepo)) {
-                repositoryService.importAll(importSettings);
-            } else {
-                importSettings.setIndexMarkedArchives(true);
-                repositoryService.importRepo(targetRepo, importSettings);
-            }
-        } catch (Exception e) {
-            statusHolder.error("Unable to import repository", e, log);
-        }
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/system/ImportSettingsConfigurationImpl.java b/web/rest/src/main/java/org/artifactory/rest/resource/system/ImportSettingsConfigurationImpl.java
deleted file mode 100644
index a022ce6..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/system/ImportSettingsConfigurationImpl.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.system;
-
-/**
- * Date: 10/27/11
- * Time: 2:37 PM
- *
- * @author Fred Simon
- */
-public class ImportSettingsConfigurationImpl {
-    public String importPath;
-    public boolean includeMetadata = true;
-    public boolean verbose;
-    public boolean failOnError = false;
-    public boolean failIfEmpty = true;
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/system/LicenseConfiguration.java b/web/rest/src/main/java/org/artifactory/rest/resource/system/LicenseConfiguration.java
deleted file mode 100644
index ca09891..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/system/LicenseConfiguration.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.system;
-
-/**
- * @author Yoav Luft
- */
-public class LicenseConfiguration {
-    public String licenseKey;
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/system/LicenseDetails.java b/web/rest/src/main/java/org/artifactory/rest/resource/system/LicenseDetails.java
deleted file mode 100644
index a53f0b4..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/system/LicenseDetails.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.system;
-
-/**
- * @author Yoav Luft
- */
-public class LicenseDetails {
-    public String type;
-    public String validThrough;
-    public String licensedTo;
-
-    public LicenseDetails(String type, String validThrough, String licensedTo) {
-        this.type = type;
-        this.validThrough = validThrough;
-        this.licensedTo = licensedTo;
-    }
-
-    @SuppressWarnings("UnusedDeclaration")
-    public LicenseDetails() {
-        // used to de-serialize
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/system/PingResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/system/PingResource.java
deleted file mode 100644
index 80d24b1..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/system/PingResource.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.system;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.rest.constant.SystemRestConstants;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.storage.StorageService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * Resource to get information about Artifactory current state.
- * The method will:
- * <ul><li>Check that DB behaves correctly (do an actual DB retrieve)</li>
- * <li>Check that the logger behaves correctly (read and/or write to log)</li></ul>
- * Upon results return:
- * <ul><li>Code 200 with text exactly equal to "OK" if all is good</li>
- * <li>Code 500 with failure description in the text if something wrong</li></ul>
- *
- * @author Fred Simon
- */
- at Component
- at Scope(BeanDefinition.SCOPE_SINGLETON)
- at Path(SystemRestConstants.PATH_ROOT + "/" + SystemRestConstants.PATH_PING)
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
-public class PingResource {
-    private static final Logger log = LoggerFactory.getLogger(PingResource.class);
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    /**
-     * @return The artifactory state "OK" or "Failure"
-     */
-    @GET
-    @Produces({MediaType.TEXT_PLAIN})
-    public Response pingArtifactory() {
-        try {
-            log.debug("Received ping call");
-            // Check that addons are OK if needed
-            if (addonsManager.lockdown()) {
-                log.error("Ping failed due to unloaded addons");
-                return Response.status(HttpStatus.SC_FORBIDDEN).entity("Addons unloaded").build();
-            }
-            ArtifactoryHome artifactoryHome = ArtifactoryHome.get();
-            if (!artifactoryHome.getHaAwareDataDir().canWrite() || !artifactoryHome.getLogDir().canWrite()) {
-                log.error("Ping failed due to file system access to data or log dir failed");
-                return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).entity("File system access failed").build();
-            }
-            ContextHelper.get().beanForType(StorageService.class).ping();
-        } catch (Exception e) {
-            log.error("Error during ping test", e);
-            return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
-        }
-        log.debug("Ping successful");
-        return Response.ok().entity("OK").build();
-    }
-
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/system/SecurityResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/system/SecurityResource.java
deleted file mode 100644
index 052e46a..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/system/SecurityResource.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.system;
-
-
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.descriptor.security.EncryptionPolicy;
-import org.artifactory.descriptor.security.PasswordSettings;
-import org.artifactory.security.SecurityInfo;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author freds
- * @date Sep 4, 2008
- */
-public class SecurityResource {
-    private static final Logger log = LoggerFactory.getLogger(SecurityResource.class);
-
-    private SecurityService securityService;
-
-    private CentralConfigService centralConfigService;
-    private HttpServletRequest httpServletRequest;
-
-
-    public SecurityResource(SecurityService securityService, CentralConfigService service,
-            HttpServletRequest httpServletRequest) {
-        this.securityService = securityService;
-        centralConfigService = service;
-        this.httpServletRequest = httpServletRequest;
-    }
-
-    @GET
-    @Produces(MediaType.APPLICATION_XML)
-    public SecurityInfo getSecurityData() {
-        return securityService.getSecurityData();
-    }
-
-    @POST
-    @Consumes(MediaType.APPLICATION_XML)
-    @Produces(MediaType.TEXT_PLAIN)
-    @Deprecated
-    public String importSecurityData(String securityXml) {
-        log.debug("Activating import of new security data: {}", securityXml);
-        securityService.importSecurityData(securityXml);
-        SecurityInfo securityData = securityService.getSecurityData();
-        int x = securityData.getUsers().size();
-        int y = securityData.getGroups().size();
-        int z = securityData.getAcls().size();
-        return "Import of new Security data (" + x + " users, " + y + " groups, " + z + " acls) succeeded";
-    }
-
-    @POST
-    @Path("passwordPolicy/{policyName}")
-    public void setPasswordPolicy(@PathParam("policyName") String policyName) {
-        EncryptionPolicy policy;
-        try {
-            policy = EncryptionPolicy.valueOf(policyName);
-        } catch (IllegalArgumentException e) {
-            throw new WebApplicationException(Response.Status.BAD_REQUEST);
-        }
-        PasswordSettings passwordSettings = centralConfigService.getDescriptor().getSecurity().getPasswordSettings();
-        passwordSettings.setEncryptionPolicy(policy);
-    }
-
-    @POST
-    @Path("logout")
-    public void logout() {
-        httpServletRequest.getSession().invalidate();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/system/StorageResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/system/StorageResource.java
deleted file mode 100644
index 017409c..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/system/StorageResource.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.system;
-
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.common.BasicStatusHolder;
-import org.artifactory.api.jackson.JacksonFactory;
-import org.artifactory.backup.InternalBackupService;
-import org.artifactory.common.StatusEntry;
-import org.artifactory.descriptor.backup.BackupDescriptor;
-import org.artifactory.storage.StorageService;
-import org.artifactory.storage.binstore.service.InternalBinaryService;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.jfrog.storage.binstore.ifc.ProviderConnectMode;
-import org.jfrog.storage.binstore.ifc.model.BinaryTreeElement;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.io.File;
-import java.io.IOException;
-import java.util.Map;
-
-/**
- * @author yoavl
- */
-public class StorageResource {
-    private static final Logger log = LoggerFactory.getLogger(StorageResource.class);
-    private HttpServletResponse httpResponse;
-    private StorageService storageService;
-    private InternalBackupService backupService;
-    private InternalBinaryService binaryStore;
-
-    public StorageResource(StorageService storageService, InternalBackupService backupService,
-                           InternalBinaryService binaryStore, HttpServletResponse httpResponse) {
-        this.storageService = storageService;
-        this.httpResponse = httpResponse;
-        this.binaryStore = binaryStore;
-        this.backupService = backupService;
-    }
-
-
-    @POST
-    @Path("compress")
-    public Response compress() {
-        BasicStatusHolder statusHolder = new ImportExportStreamStatusHolder(httpResponse);
-        storageService.compress(statusHolder);
-        return response(statusHolder);
-    }
-
-    @GET
-    @Path("size")
-    @Produces(MediaType.TEXT_PLAIN)
-    public String size() {
-        return binaryStore.getStorageSize() + "";
-    }
-
-    @POST
-    @Path("addFilestore")
-    @Deprecated
-    public Response addExternalFilestore(@QueryParam("dir") String externalDir, @QueryParam("mode") String mode) {
-        File extDir = new File(externalDir);
-        ProviderConnectMode connectMode = ProviderConnectMode.PASS_THROUGH;
-        if (StringUtils.isNotBlank(mode)) {
-            connectMode = ProviderConnectMode.getConnectMode(mode);
-        }
-        binaryStore.addExternalFileStore(extDir, connectMode);
-        return Response.ok("Directory " + extDir.getAbsolutePath() + " added as external filestore" +
-                " using connection mode " + connectMode.propName).build();
-    }
-
-    @POST
-    @Path("disconnectFilestore")
-    @Deprecated
-    public void disconnectExternalFilestore(@QueryParam("dir") String externalDir,
-                                            @QueryParam("mode") String mode, @QueryParam("verbose") boolean verbose) {
-        File extDir = new File(externalDir);
-        ProviderConnectMode connectMode = ProviderConnectMode.PASS_THROUGH;
-        if (StringUtils.isNotBlank(mode)) {
-            connectMode = ProviderConnectMode.getConnectMode(mode);
-        }
-        ImportExportStreamStatusHolder holder = new ImportExportStreamStatusHolder(httpResponse);
-        holder.setVerbose(verbose);
-        binaryStore.disconnectExternalFilestore(extDir, connectMode, holder);
-    }
-
-    @POST
-    @Path("exportds")
-    @Deprecated
-    public Response activateExport(@QueryParam("to") String destDir) {
-        throw new IllegalStateException("Export data is no longer supported");
-    }
-
-    @POST
-    @Path("gc")
-    public Response activateGc() {
-        BasicStatusHolder statusHolder = new ImportExportStreamStatusHolder(httpResponse);
-        storageService.callManualGarbageCollect(statusHolder);
-        return response(statusHolder);
-    }
-
-    @POST
-    @Path("prune")
-    public Response activatePruneEmptyDirs() {
-        BasicStatusHolder statusHolder = new ImportExportStreamStatusHolder(httpResponse);
-        binaryStore.prune(statusHolder);
-        return response(statusHolder);
-    }
-
-    @POST
-    @Path("backup")
-    public Response activateBackup(@QueryParam("key") String backupKey) {
-        final BasicStatusHolder statusHolder = new ImportExportStreamStatusHolder(httpResponse);
-        BackupDescriptor backupDescriptor = backupService.getBackup(backupKey);
-        if (backupDescriptor != null) {
-            if (backupDescriptor.isEnabled()) {
-                backupService.scheduleImmediateSystemBackup(backupDescriptor, statusHolder);
-                return response(statusHolder);
-            } else {
-                return Response.serverError().entity(
-                        "Backup identified with key '" + backupKey + "' is disabled").build();
-            }
-        } else {
-            return Response.serverError().entity("No backup identified with key '" + backupKey + "'").build();
-        }
-    }
-
-    @GET
-    @Path("info")
-    public Response getStorageInfo() {
-        BinaryTreeElement<Map<String, String>> binaryProviderInfo = storageService.getBinaryProviderInfo();
-        // Serialize the result to Json
-        ObjectMapper objectMapper = JacksonFactory.createObjectMapper();
-        String info;
-        try {
-            info = objectMapper.writeValueAsString(binaryProviderInfo);
-            return Response.ok().entity(info).build();
-        } catch (IOException e) {
-            String message = "Failed to serialize the binary provider info to JSON";
-            log.error(message, e);
-            return Response.serverError().build();
-        }
-    }
-
-    @POST
-    @Path("optimize")
-    public Response optimize() {
-        storageService.forceOptimizationOnce();
-        return Response.ok().build();
-    }
-
-    private Response response(BasicStatusHolder statusHolder) {
-        StatusEntry lastError = statusHolder.getLastError();
-        return lastError == null ? Response.ok().build() :
-                Response.serverError().entity(lastError.getMessage()).build();
-    }
-}
\ No newline at end of file
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/system/SystemInfo.java b/web/rest/src/main/java/org/artifactory/rest/resource/system/SystemInfo.java
deleted file mode 100644
index 1e3e330..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/system/SystemInfo.java
+++ /dev/null
@@ -1,165 +0,0 @@
-package org.artifactory.rest.resource.system;
-
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-
-/**
- * @author Gidi Shabat
- */
-public class SystemInfo {
-    private long committedVirtualMemorySize;
-    private long totalSwapSpaceSize;
-    private long freeSwapSpaceSize;
-    private long processCpuTime;
-    private long totalPhysicalMemorySize;
-    private long openFileDescriptorCount;
-    private long maxFileDescriptorCount;
-    private double processCpuLoad;
-    private double systemCpuLoad;
-    private long freePhysicalMemorySize;
-    private int numberOfCores;
-    private long heapMemoryUsage;
-    private long noneHeapMemoryUsage;
-    private int threadCount;
-    private long noneHeapMemoryMax;
-    private long heapMemoryMax;
-    private long jvmUpTime;
-
-    public long getCommittedVirtualMemorySize() {
-        return committedVirtualMemorySize;
-    }
-
-    public void setCommittedVirtualMemorySize(long committedVirtualMemorySize) {
-        this.committedVirtualMemorySize = committedVirtualMemorySize;
-    }
-
-    public long getTotalSwapSpaceSize() {
-        return totalSwapSpaceSize;
-    }
-
-    public void setTotalSwapSpaceSize(long totalSwapSpaceSize) {
-        this.totalSwapSpaceSize = totalSwapSpaceSize;
-    }
-
-    public long getFreeSwapSpaceSize() {
-        return freeSwapSpaceSize;
-    }
-
-    public void setFreeSwapSpaceSize(long freeSwapSpaceSize) {
-        this.freeSwapSpaceSize = freeSwapSpaceSize;
-    }
-
-    public long getProcessCpuTime() {
-        return processCpuTime;
-    }
-
-    public void setProcessCpuTime(long processCpuTime) {
-        this.processCpuTime = processCpuTime;
-    }
-
-    public long getTotalPhysicalMemorySize() {
-        return totalPhysicalMemorySize;
-    }
-
-    public void setTotalPhysicalMemorySize(long totalPhysicalMemorySize) {
-        this.totalPhysicalMemorySize = totalPhysicalMemorySize;
-    }
-
-    public long getOpenFileDescriptorCount() {
-        return openFileDescriptorCount;
-    }
-
-    public void setOpenFileDescriptorCount(long openFileDescriptorCount) {
-        this.openFileDescriptorCount = openFileDescriptorCount;
-    }
-
-    public long getMaxFileDescriptorCount() {
-        return maxFileDescriptorCount;
-    }
-
-    public void setMaxFileDescriptorCount(long maxFileDescriptorCount) {
-        this.maxFileDescriptorCount = maxFileDescriptorCount;
-    }
-
-    public double getProcessCpuLoad() {
-        return processCpuLoad;
-    }
-
-    public void setProcessCpuLoad(double processCpuLoad) {
-        BigDecimal bd = new BigDecimal(processCpuLoad).setScale(3, RoundingMode.FLOOR);
-        this.processCpuLoad = bd.doubleValue();
-    }
-
-    public double getSystemCpuLoad() {
-        return systemCpuLoad;
-    }
-
-    public void setSystemCpuLoad(double systemCpuLoad) {
-        BigDecimal bd = new BigDecimal(systemCpuLoad).setScale(3, RoundingMode.FLOOR);
-        this.systemCpuLoad = bd.doubleValue();
-    }
-
-    public long getFreePhysicalMemorySize() {
-        return freePhysicalMemorySize;
-    }
-
-    public void setFreePhysicalMemorySize(long freePhysicalMemorySize) {
-        this.freePhysicalMemorySize = freePhysicalMemorySize;
-    }
-
-    public int getNumberOfCores() {
-        return numberOfCores;
-    }
-
-    public void setNumberOfCores(int numberOfCores) {
-        this.numberOfCores = numberOfCores;
-    }
-
-    public long getHeapMemoryUsage() {
-        return heapMemoryUsage;
-    }
-
-    public void setHeapMemoryUsage(long heapMemoryUsage) {
-        this.heapMemoryUsage = heapMemoryUsage;
-    }
-
-    public long getNoneHeapMemoryUsage() {
-        return noneHeapMemoryUsage;
-    }
-
-    public void setNoneHeapMemoryUsage(long noneHeapMemoryUsage) {
-        this.noneHeapMemoryUsage = noneHeapMemoryUsage;
-    }
-
-    public int getThreadCount() {
-        return threadCount;
-    }
-
-    public long getNoneHeapMemoryMax() {
-        return noneHeapMemoryMax;
-    }
-
-    public long getHeapMemoryMax() {
-        return heapMemoryMax;
-    }
-
-    public void setThreadCount(int threadCount) {
-        this.threadCount = threadCount;
-    }
-
-    public void setNoneHeapMemoryMax(long noneHeapMemoryMax) {
-        this.noneHeapMemoryMax = noneHeapMemoryMax;
-    }
-
-    public void setHeapMemoryMax(long heapMemoryMax) {
-        this.heapMemoryMax = heapMemoryMax;
-    }
-
-    public void setJvmUpTime(long jvmUpTime) {
-        this.jvmUpTime = jvmUpTime;
-    }
-
-    public long getJvmUpTime() {
-        return jvmUpTime;
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/system/SystemResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/system/SystemResource.java
deleted file mode 100644
index bbf6751..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/system/SystemResource.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.system;
-
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.plugin.PluginsAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.rest.constant.HaRestConstants;
-import org.artifactory.api.rest.constant.SystemRestConstants;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.api.security.MasterEncryptionService;
-import org.artifactory.api.security.SecurityService;
-import org.artifactory.backup.InternalBackupService;
-import org.artifactory.info.InfoWriter;
-import org.artifactory.security.crypto.CryptoHelper;
-import org.artifactory.storage.StorageService;
-import org.artifactory.storage.binstore.service.InternalBinaryService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.lang.management.ManagementFactory;
-import java.lang.management.MemoryMXBean;
-import java.lang.management.OperatingSystemMXBean;
-import java.lang.management.ThreadMXBean;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-
-/**
- * User: freds Date: Aug 12, 2008 Time: 6:11:53 PM
- */
- at Path(SystemRestConstants.PATH_ROOT)
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, HaRestConstants.ROLE_HA})
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class SystemResource {
-    private static final Logger log = LoggerFactory.getLogger(SystemResource.class);
-
-    @Context
-    HttpServletResponse httpResponse;
-    @Autowired
-    CentralConfigService centralConfigService;
-    @Autowired
-    MasterEncryptionService encryptionService;
-    @Autowired
-    SecurityService securityService;
-    @Autowired
-    StorageService storageService;
-    @Autowired
-    InternalBinaryService binaryStore;
-    @Autowired
-    InternalBackupService backupService;
-    @Context
-    private HttpServletRequest httpServletRequest;
-
-    @GET
-    @Produces(MediaType.TEXT_PLAIN)
-    public String getPluginSystemInfo() throws Exception {
-        return InfoWriter.getInfoString()
-                + ContextHelper.get().beanForType(AddonsManager.class).addonByType(PluginsAddon.class)
-                .getPluginsInfoSupportBundleDump();
-    }
-
-    @Path(SystemRestConstants.PATH_CONFIGURATION)
-    public ConfigResource getConfigResource() {
-        return new ConfigResource(centralConfigService, httpServletRequest);
-    }
-
-    @Path(SystemRestConstants.PATH_SECURITY)
-    public SecurityResource getSecurityResource() {
-        return new SecurityResource(securityService, centralConfigService, httpServletRequest);
-    }
-
-    @Path(SystemRestConstants.PATH_STORAGE)
-    public StorageResource getStorageResource() {
-        return new StorageResource(storageService, backupService, binaryStore, httpResponse);
-    }
-
-    @Path(SystemRestConstants.PATH_LICENSE)
-    public ArtifactoryLicenseResource getLicenseResource() {
-        return new ArtifactoryLicenseResource();
-    }
-
-    @POST
-    @Path(SystemRestConstants.PATH_ENCRYPT)
-    @Produces(MediaType.TEXT_PLAIN)
-    public Response encryptWithMasterKey() {
-        try {
-            encryptionService.encrypt();
-            return Response.ok().entity("DONE").build();
-        } catch (Exception e) {
-            String msg = "Could not encrypt with master key, due to: " + e.getMessage();
-            log.error(msg, e);
-            return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
-        }
-    }
-
-    @POST
-    @Path(SystemRestConstants.PATH_DECRYPT)
-    @Produces(MediaType.TEXT_PLAIN)
-    public Response decryptFromMasterKey() {
-        try {
-            if (!CryptoHelper.hasMasterKey()) {
-                return Response.status(Response.Status.CONFLICT).entity(
-                        "Cannot decrypt without master key file").build();
-            }
-            encryptionService.decrypt();
-        } catch (Exception e) {
-            String msg = "Could not decrypt with master key, due to: " + e.getMessage();
-            log.error(msg, e);
-            return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
-        }
-        return Response.ok().entity("DONE").build();
-    }
-
-    @GET
-    @Path("serverTime")
-    @Produces(MediaType.TEXT_PLAIN)
-    public Response getServerTime() {
-        return Response.ok().entity(Long.toString(System.currentTimeMillis())).build();
-    }
-
-    @GET
-    @Path("info")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getSystemInfo() {
-        SystemInfo systemInfo = new SystemInfo();
-        collectFromManagmentFactory(systemInfo);
-        return Response.ok().entity(systemInfo).build();
-    }
-
-    private void collectFromManagmentFactory(SystemInfo systemInfo) {
-        OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean();
-        for (Method getterMethod : operatingSystemMXBean.getClass().getDeclaredMethods()) {
-            getterMethod.setAccessible(true);
-            String methodName = getterMethod.getName();
-            if (methodName.startsWith("get")&& Modifier.isPublic(getterMethod.getModifiers())) {
-                Object value;
-                try {
-                    value = getterMethod.invoke(operatingSystemMXBean);
-                    Method setterMethod = systemInfo.getClass().getMethod(methodName.replaceFirst("get", "set"), getterMethod.getReturnType());
-                    setterMethod.invoke(systemInfo, value);
-                } catch (Exception e) {
-                    value = e;
-                }
-                System.out.println(getterMethod.getName() + " = " + value);
-            }
-        }
-        systemInfo.setNumberOfCores(Runtime.getRuntime().availableProcessors());
-        MemoryMXBean mem = ManagementFactory.getMemoryMXBean();
-        systemInfo.setHeapMemoryUsage(mem.getHeapMemoryUsage().getUsed());
-        systemInfo.setHeapMemoryMax(mem.getHeapMemoryUsage().getMax());
-        systemInfo.setNoneHeapMemoryUsage(mem.getNonHeapMemoryUsage().getUsed());
-        systemInfo.setNoneHeapMemoryMax(mem.getNonHeapMemoryUsage().getCommitted());
-        ThreadMXBean bean = ManagementFactory.getThreadMXBean();
-        systemInfo.setThreadCount(bean.getThreadCount());
-        systemInfo.setJvmUpTime(ManagementFactory.getRuntimeMXBean().getUptime());
-    }
-
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/system/VersionResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/system/VersionResource.java
deleted file mode 100644
index 250683c..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/system/VersionResource.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.system;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.config.VersionInfo;
-import org.artifactory.api.rest.constant.SystemRestConstants;
-import org.artifactory.api.rest.search.result.VersionRestResult;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.security.ArtifactoryPermission;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import java.util.List;
-
-/**
- * Resource to get information about Artifactory's current running version and revision as well as a list of currently
- * enabled addons in Artifactory.
- *
- * @author Tomer Cohen
- */
- at Component
- at Scope(BeanDefinition.SCOPE_SINGLETON)
- at Path(SystemRestConstants.PATH_ROOT + "/" + SystemRestConstants.PATH_VERSION)
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
-public class VersionResource {
-
-    @Autowired
-    private CentralConfigService centralConfigService;
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Autowired
-    private AuthorizationService authorizationService;
-
-    /**
-     * @return The artifactory version and enabled addons
-     */
-    @GET
-    @Produces({SystemRestConstants.MT_VERSION_RESULT, MediaType.APPLICATION_JSON})
-    public VersionRestResult getArtifactoryVersion() {
-        VersionInfo versionInfo = centralConfigService.getVersionInfo();
-        List<String> addonNames = addonsManager.getEnabledAddonNames();
-
-        // Add the license to the JSON result object only for Artifactory Pro
-        String licenseKeyHash = addonsManager.getLicenseKeyHash();
-
-        // By assigning null we prevent the field from appearing in the result (our parser ignores nulls)
-        String license = "".equals(licenseKeyHash) ? null : licenseKeyHash;
-
-        VersionRestResult versionRestResult =
-                new VersionRestResult(versionInfo.getVersion(), versionInfo.getRevision(), addonNames, license);
-        return versionRestResult;
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/task/BackgroundTask.java b/web/rest/src/main/java/org/artifactory/rest/resource/task/BackgroundTask.java
deleted file mode 100644
index a7a1477..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/task/BackgroundTask.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.artifactory.rest.resource.task;
-
-import org.artifactory.rest.common.util.RestUtils;
-import org.codehaus.jackson.annotate.JsonCreator;
-import org.codehaus.jackson.annotate.JsonIgnore;
-
-/**
- * Data object to hold background tasks data. Translates into JSON string.
- *
- * @author Yossi Shaul
- */
-public class BackgroundTask {
-
-    private String id;
-    private String type;
-    private String state;
-    private String description;
-    /**
-     * Start time in ISO8601 format
-     */
-    private String started;
-    private String nodeId;
-
-    @JsonCreator
-    private BackgroundTask() {
-    }
-
-    /**
-     * Time the task has started
-     */
-    public BackgroundTask(String id, String type, String state, String description, long started) {
-        this.id = id;
-        this.type = type;
-        this.state = state;
-        this.description = description;
-        if (started > 0) {
-            this.started = RestUtils.toIsoDateString(started);
-        }
-    }
-
-    public String getId() {
-        return id;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public String getState() {
-        return state;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public String getStarted() {
-        return started;
-    }
-
-    public String getNodeId() {
-        return nodeId;
-    }
-
-    public void setNodeId(String nodeId) {
-        this.nodeId = nodeId;
-    }
-
-    @JsonIgnore
-    public long getStartedMillis() {
-        return started == null ? 0 : RestUtils.fromIsoDateString(started);
-    }
-
-    @Override
-    public String toString() {
-        return "BackgroundTask{" +
-                "id='" + id + '\'' +
-                ", type='" + type + '\'' +
-                ", state='" + state + '\'' +
-                ", started='" + started + '\'' +
-                ", nodeId='" + nodeId + '\'' +
-                '}';
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/task/BackgroundTasks.java b/web/rest/src/main/java/org/artifactory/rest/resource/task/BackgroundTasks.java
deleted file mode 100644
index c07dff3..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/task/BackgroundTasks.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.artifactory.rest.resource.task;
-
-import com.google.common.collect.Lists;
-import org.codehaus.jackson.annotate.JsonProperty;
-
-import java.util.List;
-
-/**
- * Simple list wrapper to return JSON string with list of tasks
- *
- * @author Yossi Shaul
- */
-public class BackgroundTasks {
-
-    private List<BackgroundTask> tasks = Lists.newArrayList();
-
-    public BackgroundTasks(@JsonProperty("tasks") List<BackgroundTask> tasks) {
-        this.tasks = tasks;
-    }
-
-    public List<BackgroundTask> getTasks() {
-        return Lists.newArrayList(tasks);
-    }
-
-    public void addTasks(List<BackgroundTask> tasks) {
-        this.tasks.addAll(tasks);
-    }
-
-    @Override
-    public String toString() {
-        return "BackgroundTasks{tasks=" + tasks + '}';
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/task/TasksResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/task/TasksResource.java
deleted file mode 100644
index 645d5bb..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/task/TasksResource.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2015 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.task;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.HaAddon;
-import org.artifactory.addon.ha.HaCommonAddon;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.api.rest.constant.HaRestConstants;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.schedule.TaskBase;
-import org.artifactory.schedule.TaskService;
-import org.artifactory.storage.db.servers.service.ArtifactoryServersCommonService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * Resource to provide REST API for background tasks (Binaries GC, artifacts cleanup etc.).
- *
- * @author Yossi Shaul
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at Path("tasks")
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, HaRestConstants.ROLE_HA})
-public class TasksResource {
-    private static final Logger log = LoggerFactory.getLogger(TasksResource.class);
-
-    @Autowired
-    private TaskService taskService;
-
-    @Autowired
-    private ArtifactoryServersCommonService serversService;
-
-    /**
-     * @return A list of active tasks - tasks that have active triggers and either are running or scheduled to run
-     */
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public BackgroundTasks getActiveTasks() {
-        List<TaskBase> internalActiveTasks = taskService.getActiveTasks(t -> true);
-        List<BackgroundTask> activeTasks = internalActiveTasks.stream()/*.filter(TaskBase::isRunning)*/
-                .map(this::createBackgroundTask)
-                .collect(Collectors.toList());
-
-        BackgroundTasks backgroundTasks = new BackgroundTasks(activeTasks);
-        addBackgroundTasksFromClusterNodes(backgroundTasks);
-
-        return backgroundTasks;
-    }
-
-    private void addBackgroundTasksFromClusterNodes(BackgroundTasks tasks) {
-        HaAddon haAddon = ContextHelper.get().beanForType(AddonsManager.class).addonByType(HaAddon.class);
-        // collect from other HA nodes only if HA enabled and current request is not from another HA node
-        if (haAddon.isHaEnabled() && !haAddon.isHaAuthentication()) {
-            List<BackgroundTasks> nodesTasks = haAddon.propagateTasksList(
-                    serversService.getOtherRunningHaMembers(), BackgroundTasks.class);
-            if (nodesTasks.isEmpty()){
-                return;
-            }
-            for (BackgroundTasks nodeTasks : nodesTasks) {
-                log.debug("Node tasks: {}", nodesTasks);
-                tasks.addTasks(nodeTasks.getTasks());
-            }
-        }
-    }
-
-    private BackgroundTask createBackgroundTask(TaskBase t) {
-        BackgroundTask bt = new BackgroundTask(t.getToken(), t.getType().getName(),
-                t.getCurrentState().name().toLowerCase(), t.getDescription(),
-                t.isRunning() ? t.getLastStarted() : 0);
-
-        HaCommonAddon haAddon = ContextHelper.get().beanForType(AddonsManager.class).addonByType(HaCommonAddon.class);
-        if (haAddon.isHaEnabled()) {
-            String nodeId = haAddon.getCurrentMemberServerId();
-            bt.setNodeId(nodeId);
-        }
-        return bt;
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/traffic/TrafficResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/traffic/TrafficResource.java
deleted file mode 100644
index a30238d..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/traffic/TrafficResource.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.traffic;
-
-import com.google.common.base.Charsets;
-import org.apache.commons.io.IOUtils;
-import org.artifactory.api.rest.constant.HaRestConstants;
-import org.artifactory.api.rest.constant.TrafficRestConstants;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.exception.RestException;
-import org.artifactory.rest.common.list.StringList;
-import org.artifactory.traffic.TrafficService;
-import org.artifactory.traffic.TransferUsage;
-import org.artifactory.traffic.entry.TrafficEntry;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.GET;
-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 java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.util.Calendar;
-import java.util.List;
-
-/**
- * @author Noam Tenne
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at Path(TrafficRestConstants.PATH_ROOT)
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, HaRestConstants.ROLE_HA})
-public class TrafficResource {
-
-    @Context
-    private HttpServletResponse httpResponse;
-
-    @Autowired
-    private TrafficService trafficService;
-
-    @GET
-    @Path(TrafficRestConstants.STREAM_ROOT)
-    @Produces(MediaType.TEXT_PLAIN)
-    public String getTrafficLogFilesStream(
-            @QueryParam(TrafficRestConstants.PARAM_START_DATE) long startLong,
-            @QueryParam(TrafficRestConstants.PARAM_END_DATE) long endLong) throws IOException {
-        Calendar from = Calendar.getInstance();
-        from.setTimeInMillis(startLong);
-        Calendar to = Calendar.getInstance();
-        to.setTimeInMillis(endLong);
-        trafficService.validateDateRange(from, to);
-        List<TrafficEntry> trafficEntryList = trafficService.getEntryList(from, to);
-        writeEntriesToStream(trafficEntryList);
-
-        return "";
-    }
-
-    @GET
-    @Path(TrafficRestConstants.PATH_FILTER_NODE)
-    @Produces(MediaType.APPLICATION_JSON)
-    @RolesAllowed({AuthorizationService.ROLE_ADMIN, HaRestConstants.ROLE_HA})
-    public TransferUsage getTransferUsageCurrentNode(
-            @QueryParam(TrafficRestConstants.PARAM_START_DATE) long startLong,
-            @QueryParam(TrafficRestConstants.PARAM_END_DATE) long endLong,
-            @QueryParam(TrafficRestConstants.PARAM_FILTER) StringList ipsToFilter) throws IOException {
-        return trafficService.getTrafficUsageWithFilterCurrentNode(startLong, endLong, ipsToFilter);
-    }
-
-    @GET
-    @Path(TrafficRestConstants.PATH_FILTER)
-    @Produces(MediaType.APPLICATION_JSON)
-    public TransferUsage getTransferUsage(
-            @QueryParam(TrafficRestConstants.PARAM_START_DATE) long startLong,
-            @QueryParam(TrafficRestConstants.PARAM_END_DATE) long endLong,
-            @QueryParam(TrafficRestConstants.PARAM_FILTER) StringList ipsToFilter) throws IOException {
-        TransferUsage transferUsage = trafficService.getTrafficUsageWithFilter(startLong, endLong, ipsToFilter);
-        if (transferUsage == null) {
-            throw new RestException("HA member is null or inactive and therefore propagate traffic collector is not allowed");
-        }
-        return transferUsage;
-    }
-
-    private void writeEntriesToStream(List<TrafficEntry> trafficEntryList) throws IOException {
-        if (!trafficEntryList.isEmpty()) {
-            try (OutputStreamWriter writer = new OutputStreamWriter(httpResponse.getOutputStream(), Charsets.UTF_8)) {
-                for (TrafficEntry trafficEntry : trafficEntryList) {
-                    String lineToWrite = (trafficEntry.toString() + "\n");
-                    IOUtils.write(lineToWrite, writer);
-                }
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/trash/TrashcanResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/trash/TrashcanResource.java
deleted file mode 100644
index fc7b8cf..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/trash/TrashcanResource.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.trash;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.rest.constant.TrashcanRestConstants;
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.common.StatusHolder;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.repo.RepoPathFactory;
-import org.artifactory.repo.trash.TrashService;
-import org.artifactory.rest.common.exception.BadRequestException;
-import org.artifactory.rest.common.model.trash.RestoreArtifact;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.rest.services.RepoServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Shay Yaakov
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at Path(TrashcanRestConstants.ROOT)
- at RolesAllowed({AuthorizationService.ROLE_ADMIN})
-public class TrashcanResource extends BaseResource {
-
-    @Autowired
-    RepoServiceFactory repoServiceFactory;
-
-    @Autowired
-    RepositoryService repositoryService;
-
-    @POST
-    @Path("empty")
-    public Response empty() {
-        return runService(repoServiceFactory.emptyTrashService());
-    }
-
-    @POST
-    @Path("restore/{path: .+}")
-    public Response restoreFromTrash(@PathParam("path") String path, @QueryParam("to") String target) {
-        RepoPath targetRepoPath = StringUtils.isNotBlank(target) ? RepoPathFactory.create(target) : RepoPathFactory.create(path);
-        RepoPath sourcePath = InternalRepoPathFactory.create(TrashService.TRASH_KEY, path);
-
-        RestoreArtifact restoreArtifact = new RestoreArtifact();
-        restoreArtifact.setRepoKey(sourcePath.getRepoKey());
-        restoreArtifact.setPath(sourcePath.getPath());
-        restoreArtifact.setTargetRepoKey(targetRepoPath.getRepoKey());
-        restoreArtifact.setTargetPath(targetRepoPath.getPath());
-
-        return runService(repoServiceFactory.restoreArtifactService(), restoreArtifact);
-    }
-
-    @DELETE
-    @Path("clean/{path: .+}")
-    public Response cleanTrashItem(@PathParam("path") String path) {
-        RepoPath repoPath = InternalRepoPathFactory.create(TrashService.TRASH_KEY, path);
-        StatusHolder statusHolder = repositoryService.undeployMultiTransaction(repoPath);
-        if (statusHolder.isError()) {
-            throw new BadRequestException(statusHolder.getLastError().getMessage());
-        } else {
-            return Response.noContent().build();
-        }
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/userprofile/ApiKeyResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/userprofile/ApiKeyResource.java
deleted file mode 100644
index 80eda64..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/userprofile/ApiKeyResource.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.artifactory.rest.resource.userprofile;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.rest.services.ConfigServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Path("security/apiKey{id:(/[^/]+?)?}")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class ApiKeyResource extends BaseResource {
-
-    @Autowired
-    protected ConfigServiceFactory configServiceFactory;
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getApiKey()
-            throws Exception {
-        return runService(configServiceFactory.getApiKey());
-    }
-
-    @DELETE
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response revokeApiKey()
-            throws Exception {
-        return runService(configServiceFactory.revokeApiKey());
-    }
-
-    @PUT
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response regenerateApiKey()
-            throws Exception {
-        return runService(configServiceFactory.regenerateApiKey());
-    }
-
-    @POST
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response createApiKey()
-            throws Exception {
-        return runService(configServiceFactory.createApiKey());
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/userprofile/UsersApiKeyResource.java b/web/rest/src/main/java/org/artifactory/rest/resource/userprofile/UsersApiKeyResource.java
deleted file mode 100644
index 1a23870..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/userprofile/UsersApiKeyResource.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.artifactory.rest.resource.userprofile;
-
-import org.artifactory.api.security.AuthorizationService;
-import org.artifactory.rest.common.model.userprofile.UserProfileModel;
-import org.artifactory.rest.common.resource.BaseResource;
-import org.artifactory.rest.services.ConfigServiceFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
- at RolesAllowed({AuthorizationService.ROLE_ADMIN, AuthorizationService.ROLE_USER})
- at Component
- at Path("security/users/apiKey")
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UsersApiKeyResource extends BaseResource {
-
-    @Autowired
-    protected ConfigServiceFactory configServiceFactory;
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getAllUsersApiKey()
-            throws Exception {
-        return runService(configServiceFactory.getUsersAndApiKeys());
-    }
-
-    @PUT
-    @Consumes(MediaType.APPLICATION_JSON)
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response syncAllUsersApiKey(List<UserProfileModel> userProfileModels)
-            throws Exception {
-        return runService(configServiceFactory.syncUsersAndApiKeys(), userProfileModels);
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/resource/versions/VersionsResources.java b/web/rest/src/main/java/org/artifactory/rest/resource/versions/VersionsResources.java
deleted file mode 100644
index 6c8f272..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/resource/versions/VersionsResources.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2014 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.resource.versions;
-
-import org.apache.http.HttpStatus;
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.rest.RestAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.security.AuthorizationService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.security.RolesAllowed;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.util.Map;
-
-/**
- * @author Gidi Shabat
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
- at Path(VersionsResources.PATH_ROOT)
- at RolesAllowed({AuthorizationService.ROLE_USER, AuthorizationService.ROLE_ADMIN})
-public class VersionsResources {
-    private static final Logger log = LoggerFactory.getLogger(VersionsResources.class);
-    public static final String PATH_ROOT = "versions";
-
-    @Context
-    private HttpServletRequest request;
-
-    @Autowired
-    AddonsManager addonsManager;
-
-    @Autowired
-    private CentralConfigService centralConfig;
-
-    @Autowired
-    private AuthorizationService authorizationService;
-
-    @GET
-    @Produces({MediaType.APPLICATION_JSON})
-    @Path("{repoKey: _any}/{path: (?!_any).+}")
-    public Response getLatestVersionByPath(@PathParam("repoKey") String repoKey, @PathParam("path") String path) {
-        return getLatestVersionInternal(null, path);
-    }
-
-    @GET
-    @Produces({MediaType.APPLICATION_JSON})
-    @Path("{repoKey: (?!_any)[^/]+}/{path: _any}")
-    public Response getLatestVersionByRepo(@PathParam("repoKey") String repoKey, @PathParam("path") String path) {
-        return getLatestVersionInternal(repoKey, null);
-    }
-
-    @GET
-    @Produces({MediaType.APPLICATION_JSON})
-    @Path("{repoKey: _any}/{path: _any}")
-    public Response getLatestVersion(@PathParam("repoKey") String repoKey, @PathParam("path") String path) {
-        return getLatestVersionInternal(null, null);
-    }
-
-    @GET
-    @Produces({MediaType.APPLICATION_JSON})
-    @Path("{repoKey: (?!_any)[^/]+}/{path: (?!_any).+}")
-    public Response getLatestVersionByRepoAndPath(@PathParam("repoKey") String repoKey,
-            @PathParam("path") String path) {
-        return getLatestVersionInternal(repoKey, path);
-    }
-
-    private Response getLatestVersionInternal(String repoKey, String path) {
-        Map<String, String[]> parameterMap = request.getParameterMap();
-        if (authorizationService.isAuthenticated() && !authorizationService.isAnonymous()) {
-            return addonsManager.addonByType(RestAddon.class).getLatestVersionByProperties(repoKey, path, parameterMap,
-                    request);
-        } else {
-            if (centralConfig.getDescriptor().getSecurity().isHideUnauthorizedResources()) {
-                return Response.status(HttpStatus.SC_NOT_FOUND).build();
-            }
-            return Response.status(Response.Status.UNAUTHORIZED).build();
-        }
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/response/JerseyArtifactoryResponse.java b/web/rest/src/main/java/org/artifactory/rest/response/JerseyArtifactoryResponse.java
deleted file mode 100644
index 6c634a3..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/response/JerseyArtifactoryResponse.java
+++ /dev/null
@@ -1,172 +0,0 @@
-package org.artifactory.rest.response;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.io.output.NullOutputStream;
-import org.apache.commons.io.output.NullWriter;
-import org.artifactory.addon.rest.AuthorizationRestException;
-import org.artifactory.common.ConstantValues;
-import org.artifactory.request.ArtifactoryRequest;
-import org.artifactory.request.ArtifactoryResponseBase;
-import org.artifactory.rest.common.exception.RestException;
-import org.artifactory.util.HttpUtils;
-import org.codehaus.plexus.util.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.StreamingOutput;
-import java.io.Closeable;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.Writer;
-import java.util.Date;
-
-/**
- * @author Shay Yaakov
- */
-public class JerseyArtifactoryResponse extends ArtifactoryResponseBase {
-    private static final Logger log = LoggerFactory.getLogger(JerseyArtifactoryResponse.class);
-
-    private Response.ResponseBuilder response;
-
-    public JerseyArtifactoryResponse() {
-        response = Response.ok();
-    }
-
-    @Override
-    public void sendStream(final InputStream is) throws IOException {
-        response.status(getStatus()).entity(new StreamingOutput() {
-            @Override
-            public void write(OutputStream sink) throws IOException, WebApplicationException {
-                try {
-                    IOUtils.copy(is, sink);
-                } finally {
-                    IOUtils.closeQuietly(is);
-                }
-
-            }
-        });
-    }
-
-    @Override
-    protected void sendErrorInternal(int code, String reason) throws IOException {
-        throw new RestException(code, reason);
-    }
-
-    @Override
-    public void setLastModified(long lastModified) {
-        response.lastModified(new Date(lastModified));
-    }
-
-    @Override
-    public void setContentLength(long length) {
-        super.setContentLength(length);
-        setHeader("Content-Length", String.valueOf(length));
-    }
-
-    @Override
-    public void setEtag(String etag) {
-        if (etag != null) {
-            response.header("ETag", etag);
-        } else {
-            log.debug("Could not register a null etag with the response.");
-        }
-    }
-
-    @Override
-    public void setSha1(String sha1) {
-        if (sha1 != null) {
-            response.header(ArtifactoryRequest.CHECKSUM_SHA1, sha1);
-        } else {
-            log.debug("Could not register a null sha1 tag with the response.");
-        }
-    }
-
-    @Override
-    public void setMd5(String md5) {
-        if (md5 != null) {
-            response.header(ArtifactoryRequest.CHECKSUM_MD5, md5);
-        } else {
-            log.debug("Could not register a null md5 tag with the response.");
-        }
-    }
-
-    @Override
-    public void setRangeSupport(String rangeSupport) {
-        if (rangeSupport != null) {
-            response.header(ArtifactoryRequest.ACCEPT_RANGES, rangeSupport);
-        } else {
-            log.debug("Could not register a null range support tag with the response.");
-        }
-    }
-
-    @Override
-    public void setContentType(String contentType) {
-        response.type(contentType);
-    }
-
-    @Override
-    public OutputStream getOutputStream() throws IOException {
-        return new NullOutputStream();
-    }
-
-    @Override
-    public void setContentDispositionAttachment(String filename) {
-        if (ConstantValues.responseDisableContentDispositionFilename.getBoolean() || StringUtils.isBlank(filename)) {
-            response.header("Content-Disposition", "attachment");
-        } else {
-            response.header("Content-Disposition", "attachment; filename=\"" + filename + "\"");
-        }
-    }
-
-    @Override
-    public void setFilename(String filename) {
-        if (StringUtils.isNotBlank(filename)) {
-            response.header(ArtifactoryRequest.FILE_NAME, HttpUtils.encodeQuery(filename));
-        } else {
-            log.debug("Could not register a null filename with the response.");
-        }
-    }
-
-    @Override
-    public Writer getWriter() throws IOException {
-        return new NullWriter();
-    }
-
-    @Override
-    public void setStatus(int status) {
-        super.setStatus(status);
-        response.status(status);
-    }
-
-    @Override
-    public void setHeader(String header, String value) {
-        response.header(header, value);
-    }
-
-    @Override
-    public boolean isCommitted() {
-        return false;
-    }
-
-    @Override
-    public void flush() {
-
-    }
-
-    @Override
-    public void sendAuthorizationRequired(String message, String realm) throws IOException {
-        throw new AuthorizationRestException(message);
-    }
-
-    @Override
-    public void close(Closeable closeable) {
-        // NOP, we use Jersey's StreamingOutput so cannot close here
-    }
-
-    public Response build() {
-        return response.build();
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/services/ConfigServiceFactory.java b/web/rest/src/main/java/org/artifactory/rest/services/ConfigServiceFactory.java
deleted file mode 100644
index d724ff4..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/services/ConfigServiceFactory.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package org.artifactory.rest.services;
-
-import org.artifactory.rest.common.service.admin.advance.GetStorageSummaryService;
-import org.artifactory.rest.common.service.admin.reverseProxies.CreateReverseProxyService;
-import org.artifactory.rest.common.service.admin.reverseProxies.GetReverseProxiesService;
-import org.artifactory.rest.common.service.admin.reverseProxies.ReverseProxySnippetService;
-import org.artifactory.rest.common.service.admin.reverseProxies.UpdateReverseProxyService;
-import org.artifactory.rest.common.service.admin.userprofile.*;
-import org.artifactory.rest.common.service.artifact.AddSha256ToArtifactService;
-import org.artifactory.rest.services.replication.*;
-import org.springframework.beans.factory.annotation.Lookup;
-
-/**
- * @author Chen Keinan
- */
-public abstract class ConfigServiceFactory {
-
-    // get replication services
-    @Lookup
-    public abstract GetReplicationService getReplication();
-
-    @Lookup
-    public abstract CreateReplicationService createOrReplaceReplication();
-
-    @Lookup
-    public abstract CreateMultipleReplicationService createMultipleReplication();
-
-    @Lookup
-    public abstract UpdateReplicationService updateReplication();
-
-    @Lookup
-    public abstract UpdateMultipleReplicationsService updateMultipleReplications();
-
-    @Lookup
-    public abstract DeleteReplicationsService deleteReplicationsService();
-
-    @Lookup
-    public abstract EnableDisableReplicationsService enableDisableReplicationsService();
-
-    @Lookup
-    public abstract GetStorageSummaryService getStorageSummaryService();
-
-    @Lookup
-    public abstract GetApiKeyService getApiKey();
-
-    @Lookup
-    public abstract CreateApiKeyService createApiKey();
-
-    @Lookup
-    public abstract RevokeApiKeyService revokeApiKey();
-
-    @Lookup
-    public abstract UpdateApiKeyService regenerateApiKey();
-
-    @Lookup
-    public abstract GetUsersAndApiKeys getUsersAndApiKeys();
-
-    @Lookup
-    public abstract SyncUsersAndApiKeys syncUsersAndApiKeys();
-
-    @Lookup
-    public abstract AddSha256ToArtifactService addSha256ToArtifact();
-
-    @Lookup
-    public abstract CreateReverseProxyService createReverseProxy();
-
-    @Lookup
-    public abstract UpdateReverseProxyService updateReverseProxy();
-
-    @Lookup
-    public abstract GetReverseProxiesService getReverseProxies();
-
-    @Lookup
-    public abstract ReverseProxySnippetService getReverseProxySnippet();
-
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/services/IService.java b/web/rest/src/main/java/org/artifactory/rest/services/IService.java
deleted file mode 100644
index def3875..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/services/IService.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.artifactory.rest.services;
-
-import org.artifactory.rest.http.request.ArtifactoryRestRequest;
-import org.artifactory.rest.http.response.IResponse;
-
-/**
- * @author Chen Keinan
- */
-public interface IService {
-
-    /**
-     * execute service method (i.e:login,create user and etc)
-     *
-     * @param artifactoryRequest  - encapsulate all data require for request processing
-     * @param artifactoryResponse - encapsulate all data require from response
-     * @return data model to be build in response
-     */
-    void execute(ArtifactoryRestRequest artifactoryRequest, IResponse artifactoryResponse);
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/services/RepoServiceFactory.java b/web/rest/src/main/java/org/artifactory/rest/services/RepoServiceFactory.java
deleted file mode 100644
index 4ff2ab6..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/services/RepoServiceFactory.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.artifactory.rest.services;
-
-import org.artifactory.rest.common.service.trash.EmptyTrashService;
-import org.artifactory.rest.common.service.trash.RestoreArtifactService;
-import org.springframework.beans.factory.annotation.Lookup;
-
-/**
- * @author Shay Yaakov
- */
-public abstract class RepoServiceFactory {
-
-    @Lookup
-    public abstract EmptyTrashService emptyTrashService();
-
-    @Lookup
-    public abstract RestoreArtifactService restoreArtifactService();
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/services/config/RestServiceConfiguration.java b/web/rest/src/main/java/org/artifactory/rest/services/config/RestServiceConfiguration.java
deleted file mode 100644
index 3a7951c..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/services/config/RestServiceConfiguration.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.artifactory.rest.services.config;
-
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.common.ArtifactoryHome;
-import org.artifactory.security.mission.control.MissionControlProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.ImportResource;
-
-import java.io.File;
-import java.io.IOException;
-
-/**
- * @author Chen Keinan
- */
- at Configuration
- at ImportResource({"classpath:/META-INF/spring/restContext.xml"})
-public class RestServiceConfiguration {
-
-    @Bean(name = "missionControlProperties")
-    public MissionControlProperties getDbProperties() throws IOException {
-        ArtifactoryHome artifactoryHome = ContextHelper.get().getArtifactoryHome();
-        File storagePropsFile = artifactoryHome.getMissionControlPropertiesFile();
-        return new MissionControlProperties(storagePropsFile);
-    }
-
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/services/replication/BaseReplicationService.java b/web/rest/src/main/java/org/artifactory/rest/services/replication/BaseReplicationService.java
deleted file mode 100644
index a6e9e82..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/services/replication/BaseReplicationService.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package org.artifactory.rest.services.replication;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.addon.rest.MissingRestAddonException;
-import org.artifactory.addon.rest.RestAddon;
-import org.artifactory.api.config.CentralConfigService;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.descriptor.replication.ReplicationBaseDescriptor;
-import org.artifactory.repo.Repo;
-import org.artifactory.repo.service.InternalRepositoryService;
-import org.artifactory.rest.common.exception.BadRequestException;
-import org.artifactory.rest.services.IService;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import java.util.List;
-
-/**
- * @author Chen Keinan
- */
-public abstract class BaseReplicationService implements IService {
-
-    @Autowired
-    private AddonsManager addonsManager;
-
-    @Autowired
-    protected CentralConfigService centralConfigService;
-
-    protected void verifyArtifactoryPro() {
-        if (addonsManager.addonByType(RestAddon.class).isDefault()) {
-            throw new MissingRestAddonException();
-        }
-    }
-
-    protected Repo verifyRepositoryExists(String repoKey) {
-        Repo repo = repositoryByKey(repoKey);
-        if (repo == null) {
-            throw new BadRequestException("Could not find repository");
-        }
-        return repo;
-    }
-
-    protected Repo repositoryByKey(String repoKey) {
-        return ((InternalRepositoryService) ContextHelper.get().getRepositoryService()).repositoryByKey(repoKey);
-    }
-
-    /**
-     * add or replace replication
-     *
-     * @param newReplication - new replication
-     * @param replications   - list of replications
-     * @param <T>            - new replication
-     */
-    protected <T extends ReplicationBaseDescriptor> void addOrReplace(T newReplication, List<T> replications) {
-        String repoKey = newReplication.getRepoKey();
-        T existingReplication = getReplication(repoKey, replications);
-        if (existingReplication != null) {
-            int i = replications.indexOf(existingReplication);
-            replications.set(i, newReplication); //replace
-        } else {
-            replications.add(newReplication); //add
-        }
-    }
-
-
-    /**
-     * get replication
-     *
-     * @param <T>               replication base descriptor
-     * @param replicatedRepoKey - replication repo key
-     * @param replications      - list of replications
-     * @param url
-     * @return replication descriptor
-     */
-    protected <T extends ReplicationBaseDescriptor> T getReplication(String replicatedRepoKey, List<T> replications) {
-        for (T replication : replications) {
-            if (replicatedRepoKey.equals(replication.getRepoKey())) {
-                return replication;
-            }
-        }
-        return null;
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/services/replication/CreateMultipleReplicationService.java b/web/rest/src/main/java/org/artifactory/rest/services/replication/CreateMultipleReplicationService.java
deleted file mode 100644
index 0a7326a..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/services/replication/CreateMultipleReplicationService.java
+++ /dev/null
@@ -1,117 +0,0 @@
-package org.artifactory.rest.services.replication;
-
-import java.util.List;
-import javax.servlet.http.HttpServletResponse;
-
-import org.artifactory.api.rest.replication.MultipleReplicationConfigRequest;
-import org.artifactory.api.rest.replication.ReplicationConfigRequest;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.replication.ReplicationBaseDescriptor;
-import org.artifactory.rest.common.exception.BadRequestException;
-import org.artifactory.rest.common.util.RestUtils;
-import org.artifactory.rest.http.request.ArtifactoryRestRequest;
-import org.artifactory.rest.http.response.IResponse;
-import org.artifactory.rest.resource.replication.ReplicationConfigRequestHelper;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CreateMultipleReplicationService extends BaseReplicationService {
-
-    @Override
-    public void execute(ArtifactoryRestRequest artifactoryRequest, IResponse artifactoryResponse) {
-        String repoKey = artifactoryRequest.getPathParamByKey("repoKey");
-        MultipleReplicationConfigRequest replicationRequests = (MultipleReplicationConfigRequest) artifactoryRequest.getImodel();
-        // verify pro license
-        verifyArtifactoryPro();
-        // verify repo key
-        verifyRepositoryExists(repoKey);
-        CentralConfigDescriptor descriptor = centralConfigService.getMutableDescriptor();
-        switch (RestUtils.repoType(repoKey)) {
-            case LOCAL:
-                // add or replace local replication
-                addOrReplaceLocalReplication(repoKey, replicationRequests, descriptor);
-                break;
-            default:
-                throw new BadRequestException("Invalid repository");
-        }
-        // update response code
-        artifactoryResponse.setResponseCode(HttpServletResponse.SC_CREATED);
-    }
-
-    /**
-     * add or replace local replication
-     *
-     * @param repoKey            - repository key
-     * @param replicationRequest - replication request model
-     * @param descriptor         - config descriptor
-     */
-    private void addOrReplaceLocalReplication(String repoKey, MultipleReplicationConfigRequest replicationRequest,
-            CentralConfigDescriptor descriptor) {
-        String cronExp = replicationRequest.getCronExp();
-        Boolean eventReplication = replicationRequest.isEnableEventReplication();
-        List<ReplicationConfigRequest> replicationConfigRequests = replicationRequest.getReplications();
-        for (ReplicationConfigRequest replicationConfigRequest : replicationConfigRequests) {
-            LocalReplicationDescriptor localReplication = new LocalReplicationDescriptor();
-            localReplication.setRepoKey(repoKey);
-            // set cron and event for all
-            if (eventReplication != null) {
-                replicationConfigRequest.setEnableEventReplication(eventReplication);
-            }
-            if (cronExp != null) {
-                replicationConfigRequest.setCronExp(cronExp);
-            }
-            ReplicationConfigRequestHelper.fillLocalReplicationDescriptor(replicationConfigRequest, localReplication);
-            ReplicationConfigRequestHelper.verifyLocalReplicationRequest(localReplication);
-            addOrReplace(localReplication, descriptor.getLocalReplications());
-        }
-        centralConfigService.saveEditedDescriptorAndReload(descriptor);
-    }
-
-
-    /**
-     * add or replace replication
-     *
-     * @param newReplication - new replication
-     * @param replications   - list of replications
-     * @param <T>            - new replication
-     */
-    protected <T extends LocalReplicationDescriptor> void addOrReplace(T newReplication, List<T> replications) {
-        String repoKey = newReplication.getRepoKey();
-        String url = newReplication.getUrl();
-        T existingReplication = getReplication(repoKey, replications, url);
-        if (existingReplication != null) {
-            int i = replications.indexOf(existingReplication);
-            replications.set(i, newReplication); //replace
-        } else {
-            replications.add(newReplication); //add
-        }
-    }
-
-
-    /**
-     * get replication
-     *
-     * @param <T>               replication base descriptor
-     * @param replicatedRepoKey - replication repo key
-     * @param replications      - list of replications
-     * @param url
-     * @return replication descriptor
-     */
-    protected <T extends ReplicationBaseDescriptor> T getReplication(String replicatedRepoKey, List<T> replications,
-            String url) {
-        for (T replication : replications) {
-            if (replicatedRepoKey.equals(
-                    replication.getRepoKey()) && ((LocalReplicationDescriptor) replication).getUrl().equals(url)) {
-                return replication;
-            }
-        }
-        return null;
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/services/replication/CreateReplicationService.java b/web/rest/src/main/java/org/artifactory/rest/services/replication/CreateReplicationService.java
deleted file mode 100644
index 62fa0fe..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/services/replication/CreateReplicationService.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.artifactory.rest.services.replication;
-
-import javax.servlet.http.HttpServletResponse;
-
-import org.artifactory.api.rest.replication.ReplicationConfigRequest;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.replication.RemoteReplicationDescriptor;
-import org.artifactory.rest.common.exception.BadRequestException;
-import org.artifactory.rest.common.util.RestUtils;
-import org.artifactory.rest.http.request.ArtifactoryRestRequest;
-import org.artifactory.rest.http.response.IResponse;
-import org.artifactory.rest.resource.replication.ReplicationConfigRequestHelper;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class CreateReplicationService extends BaseReplicationService {
-
-    @Override
-    public void execute(ArtifactoryRestRequest artifactoryRequest, IResponse artifactoryResponse) {
-        String repoKey = artifactoryRequest.getPathParamByKey("repoKey");
-        ReplicationConfigRequest replicationRequest = (ReplicationConfigRequest) artifactoryRequest.getImodel();
-        // verify pro license
-        verifyArtifactoryPro();
-        // verify repo key
-        verifyRepositoryExists(repoKey);
-        CentralConfigDescriptor descriptor = centralConfigService.getMutableDescriptor();
-        switch (RestUtils.repoType(repoKey)) {
-            case LOCAL:
-                // add or replace local replication
-                addOrReplaceLocalReplication(repoKey, replicationRequest, descriptor);
-                break;
-            case REMOTE:
-                // add or replace remote replication
-                addOrReplaceRemoteReplication(repoKey, replicationRequest, descriptor);
-                break;
-            default:
-                throw new BadRequestException("Invalid repository");
-        }
-        // update response code
-        artifactoryResponse.setResponseCode(HttpServletResponse.SC_CREATED);
-    }
-
-    /**
-     * add or replace remote replication
-     *
-     * @param repoKey            - repository key
-     * @param replicationRequest - replication request model
-     * @param descriptor         - config descriptor
-     */
-    private void addOrReplaceRemoteReplication(String repoKey, ReplicationConfigRequest replicationRequest,
-            CentralConfigDescriptor descriptor) {
-        RemoteReplicationDescriptor remoteReplication = new RemoteReplicationDescriptor();
-        remoteReplication.setRepoKey(repoKey);
-        ReplicationConfigRequestHelper.fillBaseReplicationDescriptor(replicationRequest, remoteReplication);
-        ReplicationConfigRequestHelper.verifyBaseReplicationRequest(remoteReplication);
-        addOrReplace(remoteReplication, descriptor.getRemoteReplications());
-        centralConfigService.saveEditedDescriptorAndReload(descriptor);
-    }
-
-    /**
-     * add or replace local replication
-     *
-     * @param repoKey            - repository key
-     * @param replicationRequest - replication request model
-     * @param descriptor         - config descriptor
-     */
-    private void addOrReplaceLocalReplication(String repoKey, ReplicationConfigRequest replicationRequest,
-            CentralConfigDescriptor descriptor) {
-        LocalReplicationDescriptor localReplication = new LocalReplicationDescriptor();
-        localReplication.setRepoKey(repoKey);
-        ReplicationConfigRequestHelper.fillLocalReplicationDescriptor(replicationRequest, localReplication);
-        ReplicationConfigRequestHelper.verifyLocalReplicationRequest(localReplication);
-        addOrReplace(localReplication, descriptor.getLocalReplications());
-        centralConfigService.saveEditedDescriptorAndReload(descriptor);
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/services/replication/DeleteReplicationsService.java b/web/rest/src/main/java/org/artifactory/rest/services/replication/DeleteReplicationsService.java
deleted file mode 100644
index 6fd24fe..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/services/replication/DeleteReplicationsService.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package org.artifactory.rest.services.replication;
-
-import java.util.List;
-
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.config.MutableCentralConfigDescriptor;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.replication.RemoteReplicationDescriptor;
-import org.artifactory.rest.common.exception.BadRequestException;
-import org.artifactory.rest.common.util.RestUtils;
-import org.artifactory.rest.http.request.ArtifactoryRestRequest;
-import org.artifactory.rest.http.response.IResponse;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class DeleteReplicationsService extends BaseReplicationService {
-    @Override
-    public void execute(ArtifactoryRestRequest artifactoryRequest, IResponse artifactoryResponse) {
-        String repoKey = artifactoryRequest.getPathParamByKey("repoKey");
-        String url = artifactoryRequest.getQueryParamByKey("url");
-        verifyArtifactoryPro();
-        verifyRepositoryExists(repoKey);
-        MutableCentralConfigDescriptor descriptor = centralConfigService.getMutableDescriptor();
-        switch (RestUtils.repoType(repoKey)) {
-            case LOCAL:
-                // delete local replications
-                deleteLocalReplications(repoKey, url, descriptor);
-                break;
-            case REMOTE:
-                // delete remote replications
-                deleteRemoteReplication(repoKey, descriptor);
-                break;
-            default:
-                throw new BadRequestException("Invalid repository");
-        }
-    }
-
-    /**
-     * delete local replications
-     *
-     * @param repoKey    - repo key
-     * @param url        - url
-     * @param descriptor - config descriptor
-     */
-    private void deleteLocalReplications(String repoKey, String url, MutableCentralConfigDescriptor descriptor) {
-        if (url.length() == 0) {
-            deleteAllReplication(repoKey, descriptor);
-        } else {
-            deleteSpecificReplication(repoKey, url, descriptor);
-        }
-        centralConfigService.saveEditedDescriptorAndReload(descriptor);
-    }
-
-    /**
-     * iterate repo replication and delete replication with same kkey and url
-     *
-     * @param repoKey    - repo key
-     * @param url        - url
-     * @param descriptor - config descriptor
-     */
-    private void deleteSpecificReplication(String repoKey, String url, MutableCentralConfigDescriptor descriptor) {
-        List<LocalReplicationDescriptor> localReplications = descriptor.getLocalReplications();
-        if (localReplications == null || localReplications.isEmpty()) {
-            throw new BadRequestException("Could not find existing replication for delete");
-        }
-        int replicationIndex = 0;
-        for (LocalReplicationDescriptor localReplicationDescriptor : localReplications) {
-            if (localReplicationDescriptor.getRepoKey().equals(repoKey) && localReplicationDescriptor.getUrl().equals(
-                    url)) {
-                break;
-            }
-            replicationIndex = replicationIndex + 1;
-        }
-        if (localReplications.size() == replicationIndex) {
-            throw new BadRequestException("Invalid replication url");
-        } else {
-            localReplications.remove(replicationIndex);
-            descriptor.setLocalReplications(localReplications);
-        }
-    }
-
-    /**
-     * replication and delete all replication for repo key
-     *
-     * @param repoKey    - repo key
-     * @param descriptor - config descriptor
-     */
-    private void deleteAllReplication(String repoKey, CentralConfigDescriptor descriptor) {
-        List<LocalReplicationDescriptor> localReplications = descriptor.getMultiLocalReplications(repoKey);
-        if (localReplications == null || localReplications.isEmpty()) {
-            throw new BadRequestException("Could not find existing replication for update");
-        }
-        descriptor.getLocalReplications().removeAll(localReplications);
-    }
-
-    /**
-     * delete remote replications
-     *
-     * @param repoKey    - repo key
-     * @param descriptor - config descriptor
-     */
-    private void deleteRemoteReplication(String repoKey, CentralConfigDescriptor descriptor) {
-        RemoteReplicationDescriptor remoteReplication = descriptor.getRemoteReplication(repoKey);
-        if (remoteReplication == null) {
-            throw new BadRequestException("Could not find existing replication for update");
-        }
-        descriptor.getRemoteReplications().remove(remoteReplication);
-        centralConfigService.saveEditedDescriptorAndReload(descriptor);
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/services/replication/EnableDisableReplicationsService.java b/web/rest/src/main/java/org/artifactory/rest/services/replication/EnableDisableReplicationsService.java
deleted file mode 100644
index 38a483c..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/services/replication/EnableDisableReplicationsService.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.artifactory.rest.services.replication;
-
-import org.artifactory.api.rest.replication.ReplicationEnableDisableRequest;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.replication.ReplicationBaseDescriptor;
-import org.artifactory.rest.http.request.ArtifactoryRestRequest;
-import org.artifactory.rest.http.response.IResponse;
-import org.artifactory.util.PathMatcher;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * @author Shay Yaakov
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class EnableDisableReplicationsService extends BaseReplicationService {
-
-    @Override
-    public void execute(ArtifactoryRestRequest artifactoryRequest, IResponse artifactoryResponse) {
-        ReplicationEnableDisableRequest request = (ReplicationEnableDisableRequest) artifactoryRequest.getImodel();
-        // validate pro license
-        verifyArtifactoryPro();
-
-        CentralConfigDescriptor descriptor = centralConfigService.getMutableDescriptor();
-        handleLocalReplications(request, descriptor);
-        handleRemoteReplications(request, descriptor);
-        centralConfigService.saveEditedDescriptorAndReload(descriptor);
-        artifactoryResponse.setResponseCode(HttpServletResponse.SC_CREATED);
-    }
-
-    private void handleLocalReplications(ReplicationEnableDisableRequest request, CentralConfigDescriptor descriptor) {
-        descriptor.getLocalReplications().stream()
-                .forEach(replication -> enableOrDisable(replication, replication.getUrl(), request));
-    }
-
-    private void handleRemoteReplications(ReplicationEnableDisableRequest request, CentralConfigDescriptor descriptor) {
-        descriptor.getRemoteReplications().stream()
-                .forEach(replication -> enableOrDisable(replication, getRemoteUrl(descriptor, replication.getRepoKey()), request));
-    }
-
-    private String getRemoteUrl(CentralConfigDescriptor descriptor, String repoKey) {
-        return descriptor.getRemoteRepositoriesMap().get(repoKey).getUrl();
-    }
-
-    private void enableOrDisable(ReplicationBaseDescriptor replication, String url, ReplicationEnableDisableRequest request) {
-        if (PathMatcher.matches(url, request.getInclude(), request.getExclude(), false)) {
-            replication.setEnabled(request.isEnable());
-        }
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/services/replication/GetReplicationService.java b/web/rest/src/main/java/org/artifactory/rest/services/replication/GetReplicationService.java
deleted file mode 100644
index 16ce046..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/services/replication/GetReplicationService.java
+++ /dev/null
@@ -1,119 +0,0 @@
-package org.artifactory.rest.services.replication;
-
-import java.util.List;
-import java.util.Map;
-
-import org.artifactory.addon.AddonsManager;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.replication.RemoteReplicationDescriptor;
-import org.artifactory.rest.common.exception.BadRequestException;
-import org.artifactory.rest.common.exception.NotFoundException;
-import org.artifactory.rest.common.util.RestUtils;
-import org.artifactory.rest.http.request.ArtifactoryRestRequest;
-import org.artifactory.rest.http.response.IResponse;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class GetReplicationService extends BaseReplicationService {
-
-    @Override
-    public void execute(ArtifactoryRestRequest artifactoryRequest, IResponse artifactoryResponse) {
-        String repoKey = artifactoryRequest.getPathParamByKey("repoKey");
-        // verify pro license
-        verifyArtifactoryPro();
-        // verify key
-        verifyRepositoryExists(repoKey);
-        CentralConfigDescriptor descriptor = centralConfigService.getDescriptor();
-        switch (RestUtils.repoType(repoKey)) {
-            case LOCAL:
-                // fetch local replication
-                fetchLocalReplication(artifactoryResponse, repoKey, descriptor);
-                break;
-            case REMOTE:
-                // fetch remote replication
-                fetchRemoteReplication(artifactoryResponse, repoKey, descriptor);
-                break;
-            default:
-                throw new BadRequestException("Invalid repository");
-        }
-    }
-
-    /**
-     * fetch remote replication from config descriptor
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param repoKey             - repository key
-     * @param descriptor          - config descriptor
-     */
-    private void fetchRemoteReplication(IResponse artifactoryResponse, String repoKey,
-            CentralConfigDescriptor descriptor) {
-        RemoteReplicationDescriptor remoteReplication = descriptor.getRemoteReplication(repoKey);
-        if (remoteReplication == null) {
-            throw new NotFoundException("Could not find replication");
-        }
-        artifactoryResponse.setIModel(remoteReplication);
-    }
-
-    /**
-     * fetch remote replication from config descriptor
-     *
-     * @param artifactoryResponse - encapsulate data require for response
-     * @param repoKey             - repository key
-     * @param descriptor          - config descriptor
-     */
-    private void fetchLocalReplication(IResponse artifactoryResponse, String repoKey,
-            CentralConfigDescriptor descriptor) {
-        AddonsManager addonsManager = ContextHelper.get().beanForType(
-                AddonsManager.class);
-        if (!addonsManager.isHaLicensed()) {
-            // get single replication for pro license
-            LocalReplicationDescriptor singleReplication = getSingleReplicationForProLicense(
-                    repoKey, descriptor);
-            artifactoryResponse.setIModel(singleReplication);
-        } else {
-            // get multi replication for enterprise License
-            List<LocalReplicationDescriptor> multiReplication = getMultiReplicationForEnterpriseLicense(
-                    repoKey, descriptor);
-            artifactoryResponse.setIModelList(multiReplication);
-        }
-    }
-
-    /**
-     * get Single replication by Repo for Pro license
-     *
-     * @param repoKey    - repo key
-     * @param descriptor - config descriptor
-     */
-    private LocalReplicationDescriptor getSingleReplicationForProLicense(String repoKey,
-            CentralConfigDescriptor descriptor) {
-        Map<String, LocalReplicationDescriptor> replicationMap = descriptor.getSingleReplicationPerRepoMap();
-        LocalReplicationDescriptor localReplication = replicationMap.get(repoKey);
-        if (localReplication == null) {
-            throw new NotFoundException("Could not find replication");
-        }
-        return localReplication;
-    }
-
-    /**
-     * get Multi replication by Repo for enterprise license
-     *
-     * @param repoKey    - repo key
-     * @param descriptor - config descriptor
-     */
-    private List<LocalReplicationDescriptor> getMultiReplicationForEnterpriseLicense(String repoKey,
-            CentralConfigDescriptor descriptor) {
-        List<LocalReplicationDescriptor> localReplications = descriptor.getMultiLocalReplications(repoKey);
-        if (localReplications == null || localReplications.isEmpty()) {
-            throw new NotFoundException("Could not find replication");
-        }
-        return localReplications;
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/services/replication/UpdateMultipleReplicationsService.java b/web/rest/src/main/java/org/artifactory/rest/services/replication/UpdateMultipleReplicationsService.java
deleted file mode 100644
index 4fb3bf3..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/services/replication/UpdateMultipleReplicationsService.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package org.artifactory.rest.services.replication;
-
-import java.util.List;
-
-import org.artifactory.api.rest.replication.MultipleReplicationConfigRequest;
-import org.artifactory.api.rest.replication.ReplicationConfigRequest;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.rest.common.exception.BadRequestException;
-import org.artifactory.rest.common.util.RestUtils;
-import org.artifactory.rest.http.request.ArtifactoryRestRequest;
-import org.artifactory.rest.http.response.IResponse;
-import org.artifactory.rest.resource.replication.ReplicationConfigRequestHelper;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateMultipleReplicationsService extends BaseReplicationService {
-    @Override
-    public void execute(ArtifactoryRestRequest artifactoryRequest, IResponse artifactoryResponse) {
-        MultipleReplicationConfigRequest replicationRequest = (MultipleReplicationConfigRequest) artifactoryRequest.getImodel();
-        String repoKey = artifactoryRequest.getPathParamByKey("repoKey");
-        // validate pro liccense
-        verifyArtifactoryPro();
-        // validate repo key
-        verifyRepositoryExists(repoKey);
-        CentralConfigDescriptor descriptor = centralConfigService.getMutableDescriptor();
-        switch (RestUtils.repoType(repoKey)) {
-            case LOCAL:
-                // update Local replications
-                updateMultipleLocalReplication(replicationRequest, repoKey, descriptor);
-                break;
-            default:
-                throw new BadRequestException("Invalid repository");
-        }
-    }
-
-    /**
-     * update local replications
-     *
-     * @param replicationRequest - replications request model
-     * @param repoKey            - repository key
-     * @param descriptor         - config descriptor
-     */
-    private void updateMultipleLocalReplication(MultipleReplicationConfigRequest replicationRequest, String repoKey,
-            CentralConfigDescriptor descriptor) {
-        String cronExp = replicationRequest.getCronExp();
-        Boolean eventReplications = replicationRequest.isEnableEventReplication();
-        List<ReplicationConfigRequest> replications = replicationRequest.getReplications();
-        for (ReplicationConfigRequest replication : replications) {
-            LocalReplicationDescriptor localReplication = descriptor.getLocalReplication(repoKey, replication.getUrl());
-            if (localReplication == null) {
-                throw new BadRequestException("Could not find existing replication for update");
-            }
-            if (eventReplications != null) {
-                localReplication.setEnableEventReplication(eventReplications);
-            }
-            if (cronExp != null) {
-                localReplication.setCronExp(cronExp);
-            }
-            ReplicationConfigRequestHelper.fillLocalReplicationDescriptor(replication, localReplication);
-            ReplicationConfigRequestHelper.verifyLocalReplicationRequest(localReplication);
-        }
-        centralConfigService.saveEditedDescriptorAndReload(descriptor);
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/services/replication/UpdateReplicationService.java b/web/rest/src/main/java/org/artifactory/rest/services/replication/UpdateReplicationService.java
deleted file mode 100644
index d75e74c..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/services/replication/UpdateReplicationService.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package org.artifactory.rest.services.replication;
-
-import org.artifactory.api.rest.replication.ReplicationConfigRequest;
-import org.artifactory.descriptor.config.CentralConfigDescriptor;
-import org.artifactory.descriptor.replication.LocalReplicationDescriptor;
-import org.artifactory.descriptor.replication.RemoteReplicationDescriptor;
-import org.artifactory.rest.common.exception.BadRequestException;
-import org.artifactory.rest.common.util.RestUtils;
-import org.artifactory.rest.http.request.ArtifactoryRestRequest;
-import org.artifactory.rest.http.response.IResponse;
-import org.artifactory.rest.resource.replication.ReplicationConfigRequestHelper;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-/**
- * @author Chen Keinan
- */
- at Component
- at Scope(BeanDefinition.SCOPE_PROTOTYPE)
-public class UpdateReplicationService extends BaseReplicationService {
-
-    @Override
-    public void execute(ArtifactoryRestRequest artifactoryRequest, IResponse artifactoryResponse) {
-        ReplicationConfigRequest replicationRequest = (ReplicationConfigRequest) artifactoryRequest.getImodel();
-        String repoKey = artifactoryRequest.getPathParamByKey("repoKey");
-        // validate pro liccense
-        verifyArtifactoryPro();
-        // validate repo key
-        verifyRepositoryExists(repoKey);
-        CentralConfigDescriptor descriptor = centralConfigService.getMutableDescriptor();
-        switch (RestUtils.repoType(repoKey)) {
-            case LOCAL:
-                // update Local replications
-                updateLocalReplication(replicationRequest, repoKey, descriptor);
-                break;
-            case REMOTE:
-                // update remote replications
-                updateRemoteReplications(replicationRequest, repoKey, descriptor);
-                break;
-            default:
-                throw new BadRequestException("Invalid repository");
-        }
-    }
-
-    /**
-     * update remote replications
-     *
-     * @param replicationRequest - replication  request model
-     * @param repoKey            - rep key
-     * @param descriptor         - config descriptor
-     */
-    private void updateRemoteReplications(ReplicationConfigRequest replicationRequest, String repoKey,
-            CentralConfigDescriptor descriptor) {
-        RemoteReplicationDescriptor remoteReplication = descriptor.getRemoteReplication(repoKey);
-        if (remoteReplication == null) {
-            throw new BadRequestException("Could not find existing replication for update");
-        }
-        ReplicationConfigRequestHelper.fillBaseReplicationDescriptor(replicationRequest, remoteReplication);
-        ReplicationConfigRequestHelper.verifyBaseReplicationRequest(remoteReplication);
-        centralConfigService.saveEditedDescriptorAndReload(descriptor);
-    }
-
-    /**
-     * update local replications
-     *
-     * @param replicationRequest - replications request model
-     * @param repoKey            - repository key
-     * @param descriptor         - config descriptor
-     */
-    private void updateLocalReplication(ReplicationConfigRequest replicationRequest, String repoKey,
-            CentralConfigDescriptor descriptor) {
-        LocalReplicationDescriptor localReplication = descriptor.getLocalReplication(repoKey);
-        if (localReplication == null) {
-            throw new BadRequestException("Could not find existing replication for update");
-        }
-        ReplicationConfigRequestHelper.fillLocalReplicationDescriptor(replicationRequest, localReplication);
-        ReplicationConfigRequestHelper.verifyLocalReplicationRequest(localReplication);
-        centralConfigService.saveEditedDescriptorAndReload(descriptor);
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/servlet/ArtifactoryRestServlet.java b/web/rest/src/main/java/org/artifactory/rest/servlet/ArtifactoryRestServlet.java
deleted file mode 100644
index c35b5cc..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/servlet/ArtifactoryRestServlet.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2012 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.servlet;
-
-import com.sun.jersey.api.core.ResourceConfig;
-import com.sun.jersey.spi.container.WebApplication;
-import com.sun.jersey.spi.container.servlet.ServletContainer;
-import com.sun.jersey.spi.spring.container.SpringComponentProviderFactory;
-import org.apache.commons.beanutils.BeanUtilsBean;
-import org.apache.commons.beanutils.BeanUtilsBean2;
-import org.artifactory.api.context.ArtifactoryContext;
-import org.artifactory.storage.binstore.service.InternalBinaryService;
-import org.artifactory.webapp.servlet.DelayedInit;
-import org.jfrog.storage.binstore.ifc.BinaryProviderManager;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ConfigurableApplicationContext;
-
-import javax.servlet.Filter;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import java.util.concurrent.BlockingQueue;
-
-/**
- * We use our own rest servlet for the initialization using ArtifactoryContext.
- *
- * @author Yossi Shaul
- */
-public class ArtifactoryRestServlet extends ServletContainer implements DelayedInit {
-    private static final Logger log = LoggerFactory.getLogger(ArtifactoryRestServlet.class);
-
-    private ServletConfig config;
-
-    @SuppressWarnings({"unchecked"})
-    @Override
-    public void init(ServletConfig config) throws ServletException {
-        this.config = config;
-        BlockingQueue<Filter> waiters = (BlockingQueue<Filter>) config.getServletContext()
-                .getAttribute(APPLICATION_CONTEXT_LOCK_KEY);
-        if (waiters != null) {
-            waiters.add(this);
-        } else {
-            //Servlet 2.5 lazy filter initing
-            delayedInit();
-        }
-        // register the bean utils converter to fail if encounters a type mismatch between the destination
-        // and the original, see RTFACT-3610
-        BeanUtilsBean instance = BeanUtilsBean2.getInstance();
-        instance.getConvertUtils().register(true, false, 0);
-    }
-
-    @Override
-    public void delayedInit() throws ServletException {
-        super.init(config);
-        ApplicationContext appContext = (ApplicationContext) config.getServletContext().getAttribute(ArtifactoryContext.APPLICATION_CONTEXT_KEY);
-        if (appContext == null) {
-            throw new IllegalStateException("Got null Application Context in delayed init!");
-        }
-        // Add the BinaryProvider Manager to the servlet context
-        config.getServletContext().setAttribute(BinaryProviderManager.MANAGER_CONTEXT_KEY, appContext.getBean(InternalBinaryService.class).getBinaryProviderManager());
-    }
-
-    @Override
-    protected void initiate(ResourceConfig rc, WebApplication wa) {
-        try {
-            //Register the OfflineRestFilter
-            String filters = (String) rc.getProperties().get(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS);
-            rc.getProperties().put(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS,
-                    filters + ",org.artifactory.rest.filter.OfflineRestFilter");
-            //Register the lICENSERestFilter
-            filters = (String) rc.getProperties().get(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS);
-            rc.getProperties().put(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS,
-                    filters + ",org.artifactory.rest.filter.LicenseRestFilter");
-            //Register the HaFilter
-            filters = (String) rc.getProperties().get(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS);
-            rc.getProperties().put(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS,
-                    filters + ",org.artifactory.rest.filter.HaRestFilter");
-            //Register spring as component provider
-            ArtifactoryContext artifactoryContext = (ArtifactoryContext) getServletContext().getAttribute(
-                    ArtifactoryContext.APPLICATION_CONTEXT_KEY);
-            SpringComponentProviderFactory springComponentProviderFactory =
-                    new SpringComponentProviderFactory(rc, (ConfigurableApplicationContext) artifactoryContext);
-            wa.initiate(rc, springComponentProviderFactory);
-        } catch (RuntimeException e) {
-            log.error("Exception in initialization of the Rest servlet");
-            throw e;
-        }
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/util/AuthUtils.java b/web/rest/src/main/java/org/artifactory/rest/util/AuthUtils.java
deleted file mode 100644
index e0012e1..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/util/AuthUtils.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.artifactory.rest.util;
-
-import com.sun.jersey.spi.container.ContainerResponse;
-import org.artifactory.api.context.ContextHelper;
-import org.artifactory.util.SessionUtils;
-import org.artifactory.util.UiRequestUtils;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.UriInfo;
-
-/**
- * @author Chen Keinan
- */
-public class AuthUtils {
-
-    /**
-     * validate that session is still active , if not try to restore if from remember me cookie if exist
-     */
-    public static void validateSession(HttpServletRequest request,UriInfo uriInfo,HttpServletResponse response) {
-        if (UiRequestUtils.isUiRestRequest(request)) {
-            // get existing session
-            HttpSession session = request.getSession(false);
-            if (session == null) {
-                // try to restore auth if remember me cookie exist
-                restoreRememberMeAuth(request,response);
-            }
-        }
-    }
-
-    /**
-     * try to restore remember me authentication and create valid session of it
-     */
-    private static void restoreRememberMeAuth(HttpServletRequest request,HttpServletResponse response) {
-        TokenBasedRememberMeServices tokenBasedRememberMeServices = ContextHelper.get().beanForType(
-                TokenBasedRememberMeServices.class);
-        Authentication authentication = tokenBasedRememberMeServices.autoLogin(request, response);
-        if (authentication != null) {
-            boolean sessionCreated = SessionUtils.setAuthentication(request, authentication, true);
-            if (sessionCreated) {
-                bindAuthentication(authentication);
-            }
-        }
-    }
-
-    /**
-     * bind authentication to security context
-     *
-     * @param authentication - authentication
-     */
-    private static void bindAuthentication(Authentication authentication) {
-        org.springframework.security.core.context.SecurityContext securityContext = SecurityContextHolder.getContext();
-        securityContext.setAuthentication(authentication);
-    }
-
-    /**
-     * add session valid header to response in case  request sent to UI
-     *
-     * @param response
-     */
-    public static  void addSessionStatusToHeaders(ContainerResponse response,UriInfo uriInfo,HttpServletRequest request) {
-        if (UiRequestUtils.isUiRestRequest(request) && !uriInfo.getPath().equals("auth/login")) {
-            MultivaluedMap<String, Object> metadata = response.getResponse().getMetadata();
-            HttpSession session = request.getSession(false);
-            if (session != null) {
-                metadata.add("SessionValid", "true");
-            } else {
-                metadata.add("SessionValid", "false");
-            }
-        }
-    }
-}
diff --git a/web/rest/src/main/java/org/artifactory/rest/util/StorageInfoHelper.java b/web/rest/src/main/java/org/artifactory/rest/util/StorageInfoHelper.java
deleted file mode 100644
index 5050fd6..0000000
--- a/web/rest/src/main/java/org/artifactory/rest/util/StorageInfoHelper.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Artifactory is a binaries repository manager.
- * Copyright (C) 2013 JFrog Ltd.
- *
- * Artifactory is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Artifactory is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.artifactory.rest.util;
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.commons.lang.StringUtils;
-import org.artifactory.api.repo.RepositoryBrowsingService;
-import org.artifactory.api.repo.RepositoryService;
-import org.artifactory.api.repo.VirtualRepoItem;
-import org.artifactory.api.rest.artifact.RestBaseStorageInfo;
-import org.artifactory.api.rest.artifact.RestFileInfo;
-import org.artifactory.api.rest.artifact.RestFolderInfo;
-import org.artifactory.checksum.ChecksumInfo;
-import org.artifactory.checksum.ChecksumType;
-import org.artifactory.checksum.ChecksumsInfo;
-import org.artifactory.descriptor.repo.LocalCacheRepoDescriptor;
-import org.artifactory.descriptor.repo.LocalRepoDescriptor;
-import org.artifactory.descriptor.repo.RemoteRepoDescriptor;
-import org.artifactory.fs.FileInfo;
-import org.artifactory.fs.ItemInfo;
-import org.artifactory.md.Properties;
-import org.artifactory.mime.NamingUtils;
-import org.artifactory.repo.InternalRepoPathFactory;
-import org.artifactory.repo.RepoPath;
-import org.artifactory.request.ArtifactoryRequest;
-import org.artifactory.rest.common.util.RestUtils;
-
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Maps;
-
-/**
- * Helper class for returning search results (quick, gavc, property, checksum, xpath)
- * with optionally full info (same as file info and folder info REST API) and properties.
- *
- * @author Shay Yaakov
- */
-public class StorageInfoHelper {
-
-    private static final String INCLUDE_INFO_PARAM = "info";
-    private static final String INCLUDE_PROPERTIES_PARAM = "properties";
-
-    private HttpServletRequest request;
-    private RepositoryService repositoryService;
-    private RepositoryBrowsingService repoBrowsingService;
-    private ItemInfo itemInfo;
-
-    public StorageInfoHelper(HttpServletRequest request, RepositoryService repositoryService,
-            RepositoryBrowsingService repoBrowsingService, ItemInfo itemInfo) {
-        this.request = request;
-        this.repositoryService = repositoryService;
-        this.repoBrowsingService = repoBrowsingService;
-        this.itemInfo = itemInfo;
-    }
-
-    public RestBaseStorageInfo createStorageInfo() {
-        if (itemInfo instanceof FileInfo) {
-            return createFileInfo();
-        } else {
-            return createFolderInfo();
-        }
-    }
-
-    private RestFileInfo createFileInfo() {
-        RestFileInfo fileInfo = new RestFileInfo();
-        String uri = RestUtils.buildStorageInfoUri(request, itemInfo.getRepoKey(), itemInfo.getRelPath());
-        fileInfo.slf = uri;
-        addExtraFileInfo(fileInfo, uri);
-        addStorageInfoProperties(fileInfo);
-        return fileInfo;
-    }
-
-    private RestFolderInfo createFolderInfo() {
-        RestFolderInfo folderInfo = new RestFolderInfo();
-        String uri = RestUtils.buildStorageInfoUri(request, itemInfo.getRepoKey(), itemInfo.getRelPath());
-        folderInfo.slf = uri;
-        addExtraFolderInfo(folderInfo, uri);
-        addStorageInfoProperties(folderInfo);
-        return folderInfo;
-    }
-
-    private void addExtraFileInfo(RestFileInfo fileInfo, String uri) {
-        if (!isIncludeExtraInfo()) {
-            return;
-        }
-
-        setBaseStorageInfo(fileInfo, uri);
-
-        fileInfo.mimeType = NamingUtils.getMimeTypeByPathAsString(itemInfo.getRelPath());
-        fileInfo.downloadUri = RestUtils.buildDownloadUri(request, itemInfo.getRepoKey(), itemInfo.getRelPath());
-        fileInfo.remoteUrl = buildDownloadUrl();
-        fileInfo.size = String.valueOf(((FileInfo) itemInfo).getSize());
-        ChecksumsInfo checksumInfo = ((FileInfo) itemInfo).getChecksumsInfo();
-        ChecksumInfo sha1 = checksumInfo.getChecksumInfo(ChecksumType.sha1);
-        ChecksumInfo md5 = checksumInfo.getChecksumInfo(ChecksumType.md5);
-        String originalSha1 = sha1 != null ? sha1.getOriginal() : checksumInfo.getSha1();
-        String originalMd5 = md5 != null ? md5.getOriginal() : checksumInfo.getMd5();
-        fileInfo.checksums = new RestFileInfo.Checksums(checksumInfo.getSha1(), checksumInfo.getMd5());
-        fileInfo.originalChecksums = new RestFileInfo.Checksums(originalSha1, originalMd5);
-    }
-
-    private void addExtraFolderInfo(RestFolderInfo folderInfo, String uri) {
-        if (!isIncludeExtraInfo()) {
-            return;
-        }
-
-        setBaseStorageInfo(folderInfo, uri);
-
-        RepoPath folderRepoPath = InternalRepoPathFactory.create(itemInfo.getRepoKey(),
-                itemInfo.getRepoPath().getPath());
-        folderInfo.children = new ArrayList<>();
-
-        //if local or cache repo
-        if (isLocalRepo(itemInfo.getRepoKey())) {
-            List<ItemInfo> children = repositoryService.getChildren(folderRepoPath);
-            for (ItemInfo child : children) {
-                folderInfo.children.add(new RestFolderInfo.DirItem("/" + child.getName(), child.isFolder()));
-            }
-            //for virtual repo
-        } else {
-            List<VirtualRepoItem> virtualRepoItems = repoBrowsingService.getVirtualRepoItems(folderRepoPath);
-            for (VirtualRepoItem item : virtualRepoItems) {
-                folderInfo.children.add(new RestFolderInfo.DirItem("/" + item.getName(), item.isFolder()));
-            }
-        }
-    }
-
-    private boolean isLocalRepo(String repoKey) {
-        LocalRepoDescriptor descriptor = repositoryService.localOrCachedRepoDescriptorByKey(repoKey);
-        return descriptor != null && !(descriptor.isCache() && !descriptor.getKey().equals(repoKey));
-    }
-
-    private void setBaseStorageInfo(RestBaseStorageInfo storageInfoRest, String uri) {
-        storageInfoRest.repo = itemInfo.getRepoKey();
-        storageInfoRest.path = "/" + itemInfo.getRelPath();
-        storageInfoRest.created = RestUtils.toIsoDateString(itemInfo.getCreated());
-        storageInfoRest.createdBy = itemInfo.getCreatedBy();
-        storageInfoRest.lastModified = RestUtils.toIsoDateString(itemInfo.getLastModified());
-        storageInfoRest.modifiedBy = itemInfo.getModifiedBy();
-        storageInfoRest.lastUpdated = RestUtils.toIsoDateString(itemInfo.getLastUpdated());
-    }
-
-    private String buildDownloadUrl() {
-        LocalRepoDescriptor descriptor = repositoryService.localOrCachedRepoDescriptorByKey(itemInfo.getRepoKey());
-        if (descriptor == null || !descriptor.isCache()) {
-            return null;
-        }
-        RemoteRepoDescriptor remoteRepoDescriptor = ((LocalCacheRepoDescriptor) descriptor).getRemoteRepo();
-        StringBuilder sb = new StringBuilder(remoteRepoDescriptor.getUrl());
-        sb.append("/").append(itemInfo.getRelPath());
-        return sb.toString();
-    }
-
-    private void addStorageInfoProperties(RestBaseStorageInfo storageInfo) {
-        if (!isIncludeProperties()) {
-            return;
-        }
-
-        // Outside the loop since we want Jackson to parse it as an empty list if there aren't any properties
-        storageInfo.properties = Maps.newTreeMap();
-
-        Properties propertiesAnnotatingItem = repositoryService.getProperties(itemInfo.getRepoPath());
-        if (propertiesAnnotatingItem != null && !propertiesAnnotatingItem.isEmpty()) {
-            for (String propertyName : propertiesAnnotatingItem.keySet()) {
-                storageInfo.properties.put(propertyName,
-                        Iterables.toArray(propertiesAnnotatingItem.get(propertyName), String.class));
-            }
-        }
-    }
-
-    private boolean isIncludeExtraInfo() {
-        return resultDetailHeaderContainsKey(INCLUDE_INFO_PARAM);
-    }
-
-    private boolean isIncludeProperties() {
-        return resultDetailHeaderContainsKey(INCLUDE_PROPERTIES_PARAM);
-    }
-
-    private boolean resultDetailHeaderContainsKey(String key) {
-        String resultDetailHeader = request.getHeader(ArtifactoryRequest.RESULT_DETAIL);
-        return StringUtils.contains(resultDetailHeader, key);
-    }
-}
diff --git a/web/rest/src/test/java/org/artifactory/rest/common/list/KeyValueListTest.java b/web/rest/src/test/java/org/artifactory/rest/common/list/KeyValueListTest.java
deleted file mode 100644
index 57a3fff..0000000
--- a/web/rest/src/test/java/org/artifactory/rest/common/list/KeyValueListTest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.artifactory.rest.common.list;
-
-import com.google.common.collect.Lists;
-import org.artifactory.descriptor.property.Property;
-import org.testng.annotations.Test;
-
-import java.util.List;
-import java.util.Map;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * @author Shay Yaakov
- */
-public class KeyValueListTest {
-
-    @Test
-    public void testToStringMap() throws Exception {
-        Map<String, List<String>> map = new KeyValueList("a=1,2,3|b\\=1=1\\=1,2\\,3|c=").toStringMap();
-        assertEquals(map.get("a"), Lists.newArrayList("1", "2", "3"));
-        assertEquals(map.get("b=1"), Lists.newArrayList("1=1", "2,3"));
-        assertEquals(map.get("c"), null);
-    }
-
-    @Test
-    public void testToPropertyMap() throws Exception {
-        Map<Property, List<String>> map = new KeyValueList("a\\,1=1\\=1,2\\,3,4\\5|b=1\\|1,2\\3|c=").toPropertyMap();
-        assertEquals(map.get(new Property("a,1")), Lists.newArrayList("1=1", "2,3", "4\\5"));
-        assertEquals(map.get(new Property("b")), Lists.newArrayList("1|1", "2\\3"));
-        assertEquals(map.get(new Property("c")), Lists.newArrayList(""));
-    }
-}
diff --git a/web/rest/src/test/java/org/artifactory/rest/resource/task/BackgroundTaskTest.java b/web/rest/src/test/java/org/artifactory/rest/resource/task/BackgroundTaskTest.java
deleted file mode 100644
index 5bae24a..0000000
--- a/web/rest/src/test/java/org/artifactory/rest/resource/task/BackgroundTaskTest.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.artifactory.rest.resource.task;
-
-import org.artifactory.rest.common.util.RestUtils;
-import org.testng.annotations.Test;
-
-import static org.testng.Assert.assertEquals;
-
-/**
- * Unit tests for {@link BackgroundTask}.
- *
- * @author Yossi Shaul
- */
- at Test
-public class BackgroundTaskTest {
-
-    public void backgroundTaskWithNoStartedDate() {
-        BackgroundTask task = new BackgroundTask("1", "type", "running", "test", 0);
-        assertEquals(task.getStartedMillis(), 0);
-    }
-
-    public void backgroundTaskWithStartedDate() {
-        long started = System.currentTimeMillis() - 1000;
-        BackgroundTask task = new BackgroundTask("1", "type", "running", "test", started);
-        assertEquals(task.getStartedMillis(), started);
-        assertEquals(RestUtils.fromIsoDateString(task.getStarted()), started);
-    }
-}
\ No newline at end of file
diff --git a/web/war/pom.xml b/web/war/pom.xml
deleted file mode 100644
index c5d3f15..0000000
--- a/web/war/pom.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>artifactory-web-war</artifactId>
-    <packaging>war</packaging>
-    <name>Artifactory Web War</name>
-
-    <parent>
-        <groupId>org.artifactory</groupId>
-        <artifactId>artifactory-web-parent</artifactId>
-        <version>4.8.0</version>
-    </parent>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-web-application</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.artifactory</groupId>
-            <artifactId>artifactory-angular-web</artifactId>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <finalName>artifactory</finalName>
-    </build>
-</project>
diff --git a/web/war/src/main/resources/DUMMY.TXT b/web/war/src/main/resources/DUMMY.TXT
deleted file mode 100644
index 938fcef..0000000
--- a/web/war/src/main/resources/DUMMY.TXT
+++ /dev/null
@@ -1 +0,0 @@
-Dummy file for the source plugin to work
\ No newline at end of file
diff --git a/web/war/src/main/webapp/META-INF/context.xml b/web/war/src/main/webapp/META-INF/context.xml
deleted file mode 100644
index d120a52..0000000
--- a/web/war/src/main/webapp/META-INF/context.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<!-- Tomcat context config -->
-<Context>
-    <!-- Turn off session serialization to the filesystem -->
-    <!-- The empty pathName variable disables the serialization of the session info to disk:
-    http://tomcat.apache.org/tomcat-6.0-doc/config/manager.html#Standard_Implementation -->
-    <Manager className="org.apache.catalina.session.StandardManager" pathname=""/>
-</Context> 
\ No newline at end of file
diff --git a/web/war/src/main/webapp/WEB-INF/web.xml b/web/war/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index 33f4d68..0000000
--- a/web/war/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,166 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Artifactory is a binaries repository manager.
-  ~ Copyright (C) 2012 JFrog Ltd.
-  ~
-  ~ Artifactory is free software: you can redistribute it and/or modify
-  ~ it under the terms of the GNU Lesser General Public License as published by
-  ~ the Free Software Foundation, either version 3 of the License, or
-  ~ (at your option) any later version.
-  ~
-  ~ Artifactory is distributed in the hope that it will be useful,
-  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
-  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  ~ GNU Lesser General Public License for more details.
-  ~
-  ~ You should have received a copy of the GNU Lesser General Public License
-  ~ along with Artifactory.  If not, see <http://www.gnu.org/licenses/>.
-  -->
-
-<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.0"
-         xmlns="http://java.sun.com/xml/ns/javaee"
-         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
-         metadata-complete="true">
-    <display-name>artifactory-webapp</display-name>
-    <absolute-ordering/>
-    <welcome-file-list>
-        <welcome-file>app.html</welcome-file>
-    </welcome-file-list>
-    <!-- We do not enforce serializable session entries -->
-    <!--<distributable/>-->
-
-    <context-param>
-        <description>Interval between config file refresh checks, in milliseconds. If not specified,
-            no refresh checks will happen, which avoids starting logback watchdog thread.
-        </description>
-        <param-name>logbackRefreshInterval</param-name>
-        <param-value>15000</param-value>
-    </context-param>
-
-    <filter>
-        <filter-name>ArtifactoryFilter</filter-name>
-        <filter-class>org.artifactory.webapp.servlet.ArtifactoryFilter</filter-class>
-    </filter>
-
-    <filter>
-        <filter-name>RequestFilter</filter-name>
-        <filter-class>org.artifactory.webapp.servlet.RequestFilter</filter-class>
-    </filter>
-
-    <filter>
-        <filter-name>AccessFilter</filter-name>
-        <filter-class>org.artifactory.webapp.servlet.AccessFilter</filter-class>
-    </filter>
-
-    <filter>
-        <filter-name>RepoFilter</filter-name>
-        <filter-class>org.artifactory.webapp.servlet.RepoFilter</filter-class>
-        <init-param>
-            <param-name>nonUiPathPrefixes</param-name>
-            <param-value>api,ui</param-value>
-        </init-param>
-        <init-param>
-            <param-name>UiPathPrefixes</param-name>
-            <param-value>webapp,favicon.ico</param-value>
-        </init-param>
-        <init-param>
-            <param-name>usePathInfo</param-name>
-            <param-value>false</param-value>
-        </init-param>
-    </filter>
-
-    <filter-mapping>
-        <filter-name>ArtifactoryFilter</filter-name>
-        <url-pattern>/*</url-pattern>
-        <dispatcher>FORWARD</dispatcher>
-        <dispatcher>REQUEST</dispatcher>
-        <dispatcher>ERROR</dispatcher>
-    </filter-mapping>
-
-    <filter-mapping>
-        <filter-name>RequestFilter</filter-name>
-        <url-pattern>/*</url-pattern>
-        <dispatcher>FORWARD</dispatcher>
-        <dispatcher>REQUEST</dispatcher>
-        <dispatcher>ERROR</dispatcher>
-    </filter-mapping>
-
-    <filter-mapping>
-        <filter-name>AccessFilter</filter-name>
-        <url-pattern>/*</url-pattern>
-        <dispatcher>FORWARD</dispatcher>
-        <dispatcher>REQUEST</dispatcher>
-    </filter-mapping>
-
-    <filter-mapping>
-        <filter-name>RepoFilter</filter-name>
-        <url-pattern>/*</url-pattern>
-        <dispatcher>FORWARD</dispatcher>
-        <dispatcher>REQUEST</dispatcher>
-    </filter-mapping>
-
-    <listener>
-        <listener-class>org.artifactory.webapp.servlet.ArtifactoryHomeConfigListener</listener-class>
-    </listener>
-
-    <listener>
-        <listener-class>org.artifactory.webapp.servlet.logback.LogbackConfigListener</listener-class>
-    </listener>
-
-    <listener>
-        <listener-class>org.artifactory.webapp.servlet.ArtifactoryContextConfigListener</listener-class>
-    </listener>
-
-    <session-config>
-        <!-- 2 hours -->
-        <session-timeout>120</session-timeout>
-    </session-config>
-
-    <servlet>
-        <servlet-name>Jersey Web Application</servlet-name>
-        <servlet-class>org.artifactory.rest.servlet.ArtifactoryRestServlet</servlet-class>
-        <init-param>
-            <param-name>com.sun.jersey.config.property.resourceConfigClass</param-name>
-            <param-value>com.sun.jersey.api.core.PackagesResourceConfig</param-value>
-        </init-param>
-        <init-param>
-            <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
-            <param-value>org.artifactory.rest.common.RestAuthenticationFilter</param-value>
-        </init-param>
-        <init-param>
-            <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
-            <param-value>org.artifactory.rest.common.RestResponseFilter</param-value>
-        </init-param>
-        <init-param>
-            <param-name>com.sun.jersey.spi.container.ResourceFilters</param-name>
-            <param-value>com.sun.jersey.api.container.filter.RolesAllowedResourceFilterFactory</param-value>
-        </init-param>
-        <init-param>
-            <param-name>com.sun.jersey.config.property.packages</param-name>
-            <param-value>org.artifactory.rest,org.artifactory.ui.rest</param-value>
-        </init-param>
-        <init-param>
-            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
-            <param-value>true</param-value>
-        </init-param>
-        <load-on-startup>1</load-on-startup>
-    </servlet>
-
-    <servlet-mapping>
-        <servlet-name>Jersey Web Application</servlet-name>
-        <url-pattern>/api/*</url-pattern>
-    </servlet-mapping>
-    <servlet-mapping>
-        <servlet-name>Jersey Web Application</servlet-name>
-        <url-pattern>/mc/*</url-pattern>
-    </servlet-mapping>
-    <servlet-mapping>
-        <servlet-name>Jersey Web Application</servlet-name>
-        <url-pattern>/ui/*</url-pattern>
-    </servlet-mapping>
-
-    <welcome-file-list>
-        <welcome-file>TC7-49422</welcome-file>
-    </welcome-file-list>
-
-</web-app>
\ No newline at end of file
diff --git a/webapps/artifactory.war b/webapps/artifactory.war
new file mode 100644
index 0000000..7f7da40
Binary files /dev/null and b/webapps/artifactory.war differ

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/artifactory.git



More information about the pkg-java-commits mailing list